Binder机制,从Java到C Parcel

Posted by & filed under Uncategorized.

1. 远程调用的数据传输 在远程的函數中,必然会需要传递一些数据,那这些数据是怎么传输的呢? 在IPC中,Proxy端的作用就是将一些参数打包,然后发送出去,下面是在Proxy端经常会遇见的调用远程方法的代码。 可以看到,发送和接收的数据都是通过Parcel來打包的。

  一些基本类型,比如String,int可以直接写进Parcel中,那么对于一些比较复杂的数据类型,比如一些自己定义的对象,要怎么写进Parcel里呢? 我們通过一个类new一个对象時,这个object的有效范围只是在一个进程里。如果通过IPC机制直接传递一个object是不现实的。因为Java环境里的对象是通过引用來访问的,一个object对其他object,会是通过一个类似指针的引用來访问的,会涉及到类似地址的访问。 所以在传递复杂对象時,必须把object拆解成中间形式,然後在IPC里传输这种中间格式。 那怎么把一个object拆解成中间形式呢? –>這裏就需要Parcelable接口了   2.Parcelable 当需要在进程间传输一个object時,这个object必須实现Parcelable接口的属性或方法。 例如: 在单进程中,有这样一个类:

  在实现了Parcelable后,就可以跨进程传输了,定义的TaskInfo类:  

  3.Parcel的传送 对于Parcel的传输,我们可以比喻成用传真机來发送一个纸盒子到远方。传真机不是時空传送带,并不会真正可以实现某个物品的跨进程传送,但可以变通來完成: (这部分是从网上看到的,但忘了网址是啥了。。) 这样,传送一个纸盒子就可以分为三个部分了: 1.把纸盒拆解,得到平面化的图形。 2.把平面化的图形通过传真及传到远端。 3.远端的传真机收到平面化的图形后,就可以打印到纸上,再裁剪,粘帖,就可以得到一個一模一样的紙盒子了。   所以,我們在发送時,可以认为是把对象進行拆解打包,然后塞进Parcel对象里。Parcel就相当于是容器,其中会有一段buffer存放中间结果。这个过程会是通过writeToParcel()方法,将对象的属性拆开,填写到Parcel的buffer中。     而读取端,会通过某种方法,將Parcel读取出來。       unflatten操作是通过CREATOR的createFromParcel()來完成。   4.Parcel支持的数据类型 Parcel能支持的數據類型有: null String Byte Short Integer Long Float Double Boolean String[] boolean[] byte[] int[] long[] Object[] Bundle Map Parcelable Parcelable[] CharSequence List SparseArray IBinder Serializable 看,IBinder是可以在进程间传输的! Read more […]

Eclipse+pydev首个django例子helloworld

Posted by & filed under Uncategorized.

第一个django程序: 1.      安装Python2.x,建议安装2.6或2.7  下载地址www.python.org 配置环境变量     我的电脑->属性->高级->环境变量->系统变量 增加PYTHON_HOME     C:\Python27 修改Path  加入%PYTHON_HOME% 2.      安装django 下载地址https://www.djangoproject.com/ 当前为1.3.1,将下载文件解压后放到你想放的位置 开始-运行-cmd   切换到解压文件放的位置 执行:setup.py install   安装完后把%PYTHON_HOME%\Scripts加到PATH中去,因为该路径下面的django-admin.py后面会用到   3.      新建项目: 开始-运行-cmd  切换到工作空间 生成项目 django-admin.py startproject hello 得到hello文件夹下四个文件 __init__.py Read more […]

BackgroundWorker 类

Posted by & filed under Uncategorized.

BackgroundWorker 类 注意:此类在 .NET Framework 2.0 版中是新增的。 在单独的线程上执行操作。 BackgroundWorker 类允许您在单独的专用线程上运行操作。耗时的操作(如下载和数据库事务)在长时间运行时可能会导致用户界面 (UI) 似乎处于停止响应状态。如果您需要能进行响应的用户界面,而且面临与这类操作相关的长时间延迟,则可以使用 BackgroundWorker 类方便地解决问题。 若要在后台执行耗时的操作,请创建一个 BackgroundWorker,侦听那些报告操作进度并在操作完成时发出信号的事件。可以通过编程方式创建BackgroundWorker,也可以将它从“工具箱”的“组件”选项卡中拖到窗体上。如果在 Windows 窗体设计器中创建 BackgroundWorker,则它会出现在组件栏中,而且它的属性会显示在“属性”窗口中。 若要设置后台操作,请为 DoWork 事件添加一个事件处理程序。在此事件处理程序中调用耗时的操作。若要启动该操作,请调用 RunWorkerAsync。若要收到进度更新通知,请对 ProgressChanged 事件进行处理。若要在操作完成时收到通知,请对 RunWorkerCompleted 事件进行处理。 注意 您必须非常小心,确保在 DoWork 事件处理程序中不操作任何用户界面对象。而应该通过 ProgressChanged 和 RunWorkerCompleted 事件与用户界面进行通信。 BackgroundWorker 事件不跨 AppDomain 边界进行封送处理。请不要使用 BackgroundWorker 组件在多个 AppDomain 中执行多线程操作。 如果后台操作需要参数,请在调用 RunWorkerAsync 时给出参数。在 DoWork 事件处理程序内部,可以从 DoWorkEventArgs.Argument 属性中提取该参数。 有关 BackgroundWorker 的更多信息,请参见 如何:在后台运行操作。 注意 应用于此类的 HostProtectionAttribute 属性 Read more […]

优雅的Bitcask

Posted by & filed under Uncategorized.

Bitcask是一个日志型的基于hash表结构和key-value存储模型,我了解到他也就几天时间,但是其简洁有效的设计思路,让我的某种技术癖好得到了极大满足,于是酝酿出这篇东西。 Bitcask模型指导下的存储系统有Riak和豆瓣的beansdb新版本(beansdb新版本信息,参见这里),下面就简单的介绍一下Bitcask模型: 1.日志型的数据文件 何谓日志型?就是append only,所有写操作只追加而不修改老的数据,就像我们的各种服务器日志一样。在Bitcask模型中,数据文件以日志型只增不减的写入文件,而文件有一定的大小限制,当文件大小增加到相应的限制时,就会产生一个新的文件,老的文件将只读不写。在任意时间点,只有一个文件是可写的,在Bitcask模型中称其为active Read more […]

.NET4 中的Task优化线程池【.NET4 多核并行】

Posted by & filed under Uncategorized.

首先回顾相关场景:最近工作需要一直在.NET4下编写window service。在WindowsService下使用了多线程相关技术。期间就用了到了线程池。使用线程池的目的:在系统中进行多线程并发也担心并发数量太大影响性能。于是使用线程池进行排队。一批一批执行多线程。当我在使用传统的.NET线程池的过程中碰见了一些问题,请看以下代码: 1 try 2 { 3 ThreadPool.SetMaxThreads(2, 2); 4 5 for (int i = 0; i < 5; i++) 6 { 7 ThreadPool.QueueUserWorkItem(new WaitCallback(InvokeThread1), i); 8 } 9 10 } 11 catch 12 { 13 Console.WriteLine(“error”); 14 } 这里建立一个同时2个线程并发的线程池。在上述代码第7行传入InvokeThread1方法: static void InvokeThread1(object Read more […]

Zope简介

Posted by & filed under Uncategorized.

1   什么是Zope 现在很流行轻量级开发框架。在python社区,就有Django、Pylons、Quxiote等框架,简单易学好上手。做一个网站,费不了多少功夫就可以完成了,而且集成了很多最新的AJAX效果。 但是在某些情况下,我们需要面对更复杂的应用,需要考虑可重用性,需要组织大规模的开发。这时候,这些轻量级框架,可能就存在一些瓶颈了。比如企业级关键业务系统,比如银行交易等。在Java的世界里面,这些被认为是J2EE的专有领地,虽然有很多Java人不喜欢J2EE的过于复杂。 在Python的世界里面,是否有类似J2EE的企业开发框架?如果有,在以简洁漂亮著称的Python世界里面,他是否也会如同J2EE般的复杂? 恩,我来告诉你:有的,她就是Zope Read more […]

Python Twisted介绍

Posted by & filed under Uncategorized.

Twisted是用Python实现的基于事件驱动的网络引擎框架。Twisted诞生于2000年初,在当时的网络游戏开发者看来,无论他们使用哪种语言,手中都鲜有可兼顾扩展性及跨平台的网络库。Twisted的作者试图在当时现有的环境下开发游戏,这一步走的非常艰难,他们迫切地需要一个可扩展性高、基于事件驱动、跨平台的网络开发框架,为此他们决定自己实现一个,并从那些之前的游戏和网络应用程序的开发者中学习,汲取他们的经验教训。 Twisted支持许多常见的传输及应用层协议,包括TCP、UDP、SSL/TLS、HTTP、IMAP、SSH、IRC以及FTP。就像Python一样,Twisted也具有“内置电池”(batteries-included)的特点。Twisted对于其支持的所有协议都带有客户端和服务器实现,同时附带有基于命令行的工具,使得配置和部署产品级的Twisted应用变得非常方便。 21.1 Read more […]

快速排序

Posted by & filed under Uncategorized.

快速排序由于排序效率在同为O(N*logN)的几种排序方法中效率较高,因此经常被采用,再加上快速排序思想—-分治法也确实实用,因此很多软件公司的笔试面试,包括像腾讯,微软等知名IT公司都喜欢考这个,还有大大小的程序方面的考试如软考,考研中也常常出现快速排序的身影。   总的说来,要直接默写出快速排序还是有一定难度的,因为本人就自己的理解对快速排序作了下白话解释,希望对大家理解有帮助,达到快速排序,快速搞定。   快速排序是C.R.A.Hoare于1962年提出的一种划分交换排序。它采用了一种分治的策略,通常称其为分治法(Divide-and-ConquerMethod)。 该方法的基本思想是: 1.先从数列中取出一个数作为基准数。 2.分区过程,将比这个数大的数全放到它的右边,小于或等于它的数全放到它的左边。 3.再对左右区间重复第二步,直到各区间只有一个数。   虽然快速排序称为分治法,但分治法这三个字显然无法很好的概括快速排序的全部步骤。因此我的对快速排序作了进一步的说明:挖坑填数+分治法: 先来看实例吧,定义下面再给出(最好能用自己的话来总结定义,这样对实现代码会有帮助)。   以一个数组作为示例,取区间第一个数为基准数。 0 1 2 3 4 5 6 7 8 9 72 6 57 88 60 42 83 73 48 85 初始时,i Read more […]

backbone.js 初探

Posted by & filed under Uncategorized.

什么是backbone backbone不是脊椎骨,而是帮助开发重量级的javascript应用的框架。 主要提供了3个东西:1、models(模型) 2、collections(集合) 3、views(视图) backbone.js文件本身很小,压缩后只有5.3KB,作为一个框架级别的核心JS文件,这个数字很可怕。 除此之外,这个JS还必须依赖于另一个JS文件:underscore.js(包含许多工具方法,集合操作,js模板等等)。   简介 用Backbone.Model表示应用中所有数据,models中的数据可以创建、校验、销毁和保存到服务端。 当models中值被改变时自动触发一个”change”事件、所有用于展示models数据的views都会侦听到这个事件,然后进行重新渲染。 Backbone.Collection和我们平时接触的JAVA集合类相似,具有增加元素,删除元素,获取长度,排序,比较等一系列工具方法,说白了就是一个保存models的集合类。 Backbone.View中可以绑定dom Read more […]

性能分析之执行计划

Posted by & filed under Uncategorized.

一直想找一些关于SQL语句性能调试的权威参考,但是有参考未必就能够做好调试的工作。我深信实践中得到的经验是最珍贵的,书本知识只是一个引导。本篇来源于《Inside Microsoft SQL Server 2008》,有经验的高手尽管拍砖把。   这个部分将讲解一些性能分析工具,这些性能分许主要关注在执行计划。   缓存执行计划  SQL Server 2008提供了一些服务器对象来分析执行计划 Sys.dm_exec_cached_plans:    包含缓存的执行计划,每个执行计划对应一行。 Sys.dm_exec_plan_attributes: 这是一个系统函数,每一个执行计划都对应着一些属性,在这个系统函数中包含着这些属性。 Sys.dm_exec_sql_text:             这是一个系统函数,返回文字格式的执行计划。 Sys.dm_exec_query_plan:        这是一个系统函数,返回xml格式的执行计划。 SQL Read more […]