2013年6月26日
2011年4月3日
Android 如何在自定义界面上启用输入法 (How to enable inputmethod for the custom UI)
在android中经常会自定义组件,自定义的组件可以通过继承系统的已经有的组件来实现。也可以直接继承自View或者是SurfaceView界面。有时候想在这些界面中输入文字,例如游戏中经常用到的SurfaceView上让用户输入文字。由于多数android都没有实体的输入键盘,另外android中都启用了输入法功能,如非英文用户都需要安装指定的输入法等。 因此在这些界面中输入文字首先需要调用输入法功能。
在Android中,输入法(IME)是通过InputMethodService来提供的。 你要做的是在你的view里面启动输入法。 在View里面启用输入法,需要实现的方法是
public InputConnection onCreateInputConnection(EditorInfo outAttrs) {}
这个方法会返回一个InputConnection对象。 InputConnection就是建立你的View与InputMethodService之间的桥梁。输入法就是通过IntputConnection将文字内容传输到View当中。
为了实现输入功能,我们需要创建自己的InputConnection类。 他的作用是接收输入法提交的内容,并可以对输入法提交的文字内容进行做进一步的处理。
class MyInputConnection extends BaseInputConnection{
String inputString="";
public MyInputConnection(View targetView, boolean fullEditor) {
super(targetView, fullEditor);
// TODO Auto-generated constructor stub
}
public boolean commitText(CharSequence text, int newCursorPosition){
inputString=inputString+(String) text;
return true;
}
}
MyInputConnection继承自BaseInputConnection,BaseInputConnection继承自InputConnection。 这里面必须要实现的一个方法就是public boolean commitText(CharSequence text, int newCursorPosition), 第一个参数text就是输入法在完成一次输入时提交的文字内容。我们现在直接保存到inputString中, 这样输入法输入的内容会源源不断的添加到nputString中。我们只需要读取inputString就可以得到输入法输入的文字。
接下来要帮的是在需要输入的时候显示出输入法。 当view里需要用户输入的时候,
InputMethodManager input=(InputMethodManager) context.getSystemService(Context.INPUT_METHOD_SERVICE);
input.showSoftInput(this,0);即可以调用出输入法。
以下代码是我在SurfaceView里做的一个演示。
import android.content.Context;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.view.SurfaceHolder;
import android.view.SurfaceHolder.Callback;
import android.view.SurfaceView;
import android.view.View;
import android.view.inputmethod.BaseInputConnection;
import android.view.inputmethod.CompletionInfo;
import android.view.inputmethod.EditorInfo;
import android.view.inputmethod.InputConnection;
import android.view.inputmethod.InputMethodManager;
public class SufaceInput extends SurfaceView implements SurfaceHolder.Callback , Runnable {
SurfaceHolder holder=null;
String inputString="xyz";
InputMethodManager input=null;
public SufaceInput(Context context) {
super(context);
holder=this.getHolder();
holder.addCallback(this);
this.setFocusable(true);
this.setFocusableInTouchMode(true);
input=(InputMethodManager) context.getSystemService(Context.INPUT_METHOD_SERVICE);
// TODO Auto-generated constructor stub
}
public void surfaceChanged(SurfaceHolder holder, int format, int width,
int height) {
// TODO Auto-generated method stub
new Thread(this).start();
input.showSoftInput(this, 0);
}
public void surfaceCreated(SurfaceHolder holder) {
// TODO Auto-generated method stub
}
public void surfaceDestroyed(SurfaceHolder holder) {
// TODO Auto-generated method stub
}
class MyInputConnection extends BaseInputConnection{
public MyInputConnection(View targetView, boolean fullEditor) {
super(targetView, fullEditor);
// TODO Auto-generated constructor stub
}
public boolean commitText(CharSequence text, int newCursorPosition){
inputString=inputString+(String) text;
return true;
}
}
@Override
public InputConnection onCreateInputConnection(EditorInfo outAttrs) {
// TODO Auto-generated method stub
return new MyInputConnection(this,false);//super.onCreateInputConnection(outAttrs);
}
public void run() {
// TODO Auto-generated method stub
while(true){
Canvas c=holder.lockCanvas();
Paint p=new Paint();
p.setColor(Color.RED);
c.drawColor(Color.WHITE);
c.drawText(inputString, 100, 100, p);
holder.unlockCanvasAndPost(c);
}
}
}
2010年3月30日
赵连海的无罪辩护(陈述)词
2009年2月18日
scibefire设置好象有点问题
2009年2月12日
GTD略有心得
GTD其实没有多么复杂,而且秉承的也是简单,只是不知道GTD的创建者为什么要写那么复杂的一本书,也许是因为所看到的中文版翻译的不够精准,或者是因为作者想将道理讲明白,不过真正实施起来的时候没有那么多的要考虑的。因为GTD本来就是简化工作的一种方法,如果将简单的东西复杂化反而失去了其本意。
每个人的GTD可能都不一样,接下来可以要逐渐摸索自己的GTD方法了。通过不断的实验,组合,找出适合自己的GTD方式。
2009年1月17日
准备研究一下GTD了.
接下来的事情,我想应该是先研究一下其理念,然后试着做,也许一开始并不顺利,但所有的尝试相信都能带来一些变化,按照我现在的生活方式,如果涉及到工具的话,应该主要是手机,笔记本电脑,在线,还有一个纸质的笔记本,Freemind这样的脑图工具用的非常多了.确实对于整理文件,整理思路非常有效,不过用它做一个GTD工具尚是首次,相信能够带来不少的变化.
接下来是摸索属于自己的GTD管理方式,在接下来要做的事情我想要一点点的变化起来.
2008年12月18日
尝试重拾blog
也许我想抗争一下,慢慢拾起这个习惯。重新做一个每天写字的人,慢慢做一个思考,表达的人。今天算是重新开始的第一笔。
2008年12月13日
2008年11月25日
2008年11月24日
2008年11月23日
2008年11月21日
2008年11月18日
2008年11月17日
2007年6月24日
测试一下Google Documents的功能
其实Google Documents and Spreadsheets虽然功能上不如桌面端的Office套件有那麽多的功能,但是仍旧有自己的特点。
1.网络性
随时随地都可以用,这是最大的特点了,当然这个前提是网络要通畅,无论身在何处,都可以访问到自己的文档,这是一个非常方便的功能,这相当于一些网站提供的网络硬盘,放在Google这里,实际上比放在一般人的硬盘上更加安全。
2.共享性
原来需要发送邮件才能共享的功能,现在只要一个URL地址就行了,而且可以保持最新的,总是存在着这样的状况:你将文章发送出去之后,突然发现有些地方需要修改,但是对于已经发送出去的文档,修改的方式只有再次发送一遍,然后告诉对方我的文档修改了,请再次检阅。对方可能要重新再看一遍文档,然后比较前后两个文档的差异之处,而通过Google Documents and Spreadsheets就可以避免这样了,你完全可以再次修改,对方阅读的时候会看到最新的文档。
3.协作性
这也是借网络的便利,你可以边写边与协作者讨论,而且可以对方也可以共同修改文档,这对于处于不同空间的人们来讲,可以非常方便的协作工作,而且其提供的交流方式可以是即时性的。
4.版本管理
文章总是要改来改去的,这个功能其实早就应该实现了,不过目前桌面上多是借助用户专门的版本控制工具,如 CVS,Subversion,BZR 等这样的工具来进行版本控制,而且这些工具多是软件开发人员才使用的,一般文档写作人员并不熟悉这些工具的使用,其所谓的控制仍旧局限在修改之前重新存副本。这样往往一个文档会有几个甚至几十个副本,占用空间,而且很难找出每次修改的差异性。而Google documents and Spreadsheets 提供了版本的控制功能,像时光机一样,可以随时囬到过去的某一刻。每几秒就自动保存,而且可以方便的比较不同版本之间的差异性,这对于写作来说可是非常方便的。
2007年6月2日
也说Firefox与Opera
宣 传可能是一点原因,但是根本原因并不是源于此,实际上是Firefox成功之后,Google才开始与Firefox走在了一起,据我所知Google的 广告是从Firefox1.5才开始有的,在这之前Firefox已经开始蚕食IE的市场了,Firefox并不是靠广告而起来的,即使在Mozilla 时期,市场份额也占有的比Opera高的多,后来由于IE一再出现问题,而且不思进取,尤其是流氓软件的兴起,大家逐渐寻求非IE内核的浏览器,而 Firefox正是那时候崛起的,当时的Opera仍旧带着大大的广告条,要去除那个广告条是需要花钱购买。
另外Firefox与 Opera不是一个级别上的,Firefox是一个平台,而Opera是一个软件,平台的好处是扩展性高,几乎你能想到的功能都可以通过扩展的方式实现, Firefox所在的XULrunner平台已经变成了不少的东西,有Komodo的程序开发环境,Nvu的网页编辑器,Thunderbird邮件收 发,Sunbird的程序管理,Chatzill的IRC客户端,就是现在比较火的Joost也是基于Firefox的平台开发,大家可能看一看 Joost的安装目录,就可以看到与Firefox类似的结构,
Opera虽然功能比单一的Firefox强,应该是类似于Firefox的前身Mozilla差不多,但是可扩展性能不行,系统耦合的太厉害,第三方程序很难结合进去。
Firefox 与Opera的对比类似于Windows与IE的差别,是一个平台与一个应用软件的差别。而当时Mozilla将Firefox剥离出来是最大的成功, Firefox专心做一个平台,由第三方去开发扩展。很多人说Firefox功能太少,其实Firefox不是不能整合那些扩展,而是不去整合。
一是众口难调,各有各的喜好,实际上安装扩展只不过是点击一下鼠标就行了,简单到极点了。
二是整合进Firefox之后,增加了Firefox核心开发人员的负担,也会打击扩展开发人员的积极性。既然有更专业的人在开发维护,为什么还要费力的去整合进内核呢。
三,整合过多的内容会使内核变的臃肿,不安全。
将Firefox与Opera相比,二者本身就不是一个东西,没有可比性,喜欢Opera的人喜欢他的小巧精致,而喜欢Firefox的则喜欢其扩展功能,强大的组合能力。各有各的爱好,Firefox的对手从来就不是Opera,而是与系统严密结合的IE。
Powered by ScribeFire.
2007年5月26日
Ubuntu 7.04 加载USB ADSL猫
1.
首先要明确需要的东西,现在的内核2.6.20已经包含了驱动了,插上USB猫之后,在终端下面运行lsusb,我的是得到如下的结果:
batfree@ubuntu:~$ lsusb
Bus 004 Device 001: ID 0000:0000
Bus 001 Device 001: ID 0000:0000
Bus 003 Device 002: ID 04d9:0499 Holtek Semiconductor, Inc.
Bus 003 Device 001: ID 0000:0000
Bus 002 Device 004: ID 0572:cb00 Conexant Systems (Rockwell), Inc. E-Tech ADSL Modem v2
Bus 002 Device 001: ID 0000:0000
说明我的猫是Conexant Systems (Rockwell),已经被内核认出来了。
虽然内核里已经包含了驱动程序,但是有个东西还是需要的,那就是firmware,这个是LINUX没有附带的,因为涉及到专用代码的问题,厂商是没有提供的,为了得到这个firmware,需要用到一点小技巧。
2.
那就是将windows驱动程序里里面的firmware提取出来到linux下面用。
需要到下面的地址下载一个工具,用来抽取Firmware,
从Windows下用的USB Modem 驱动里找到CnxEtU.sys这个文件,放置到cxacru-fw所在的目录中,执行
batfree@ubuntu:~/cxacru.zip_FILES$ ./cxacru-fw CnxEtU.sys cxacru-fw.bin
found firmware in `CnxEtU.sys' at offset 0x41c0
出现上面上行的说明,说明提取成功,提取出来的firmware就是cxacru-fw.bin这个文件。
如果不成功,说不定你要自己重新编译一下cxacru-fw.c文件
执行
gcc -o cxacru-fw cxacru-fw.c重新编译得到 cxacru-fw,然后重新执行上面的命令提取Firmware。
3.
接下来就要将firmware放置在相应的目录下面,让Linux能够调用 。
将获得的cxacru-fw.bin 复制到/lib/firmware对应的内核下面。
4.
最困难的已经完成了,接下来要做的就是为制作拔号部分了。我这儿用的是PPPOA,有的地区用的是PPPOE,各有不同。
到目录/etc/ppp/peers目录下面新建一个文件,如usbadsl添加如下内容。
###############################
noipdefault #自动获取IP地址
defaultroute
usepeerdns #使用获得的DNS
sync
persist
noauth
nopcomp
noccp
novj
debug
kdebug 1
user "username" #将username换成你的的用户名
plugin pppoatm.so
0.100 #这儿比较重要,要看你的 VPI/VCI 值,有的是8.35,我这儿是0.100,
#这要看ISP提供的是什么,可以打电话问电信或者是网通,也可以Windows下面找到这个值
#我是在Accessrunner Control Panel里面按下Alt+C之后显示出来的值。
#########################################
保存之后,就行了。
5.
接下来是定义网络接口,
在/etc/network/interfaces文件中添加
#####################################
# The ADSL connection
auto ppp0
iface ppp0 inet ppp
provider usbadsl
#####################################
6.
接下来是添加用户名和密码了,因为拔号上网的时候需要用到。
在/etc/ppp有个pap-secret和chap-seret这是上网时用户名查找的地方。
看ISP使用的方式是PAP还是CHAP认证,如果不确定的话可以这两个文件都添加。
在里面增加一行。
#############################
username * password *
#############################
注意中间的不是空格,而是用Tab间隔的。
接下来运行 命令
pon usbadsl就可以连接网络,
poff usbadsl就可以断开网络了。
7.
现在已经就绪了,可以上网了,输入ifconfig看是不是有个ppp0连接,
显示了你的IP地址,等等。
我的笔记本上无论在Windows下面还是Linux下面都需要在开机之后再将USB ADSL Modem 插上去,否则系统找不到,但是台式机上猫不需要开机后再插,不知道是不是因为节电的原因,笔记本默认不激活猫呢?
如果出现不能联网的原因,可以将猫拔下来重新插上去,插上去之后,
运行dmesg| grep ADSL查看ADSL信息。
我的机器上显示如下:
[ 75.352000] ATM dev 0: ADSL line: attempting to activate
[ 104.300000] ATM dev 0: ADSL line: attempting to activate
[ 114.328000] ATM dev 0: ADSL line: channel analysis
[ 119.336000] ATM dev 0: ADSL line: up (2048 kb/s down | 512 kb/s up)
最重要的是最后一行,表示已经连接上了,应该会自动上网了,如果不行就运行 pon usbadsl.
现在电信流行DNS劫持,经常将正常的地址说显示不出来,然后拿广告给你看,如果你嫌烦,可以将DNS地址改成OpenDNS
修改/etc/resolv.conf添加两行:
nameserver 208.67.222.222
nameserver 208.67.220.220
2006年12月31日
搜索引擎算法改进-用户满意度评分法
现在的google,百度采用的都是这样的算法。当然实际应用起来并不是这么简单的。但基本原理应该就是这样。
现在看来这种算法是非常成功的,Google ,百度等利用这种算法都取得了理想的结果,排除人工因素,这也是非常有效的。
但是在这个里面,全是基于机器的算法进行的,没有考虑过人工的因素。搜索引擎是人在用,每天有大量的用户用各种单词来查找想找到的东西。什么样的内容用户最感兴趣呢?这只有用户自已知道,因为同一个单词搜索出来的结果会因用户的不同目的而有不同的反应,有些用户找到自己想找的东西,感到非常满意。同时有些用户则可能无法在第一页找到想要的东西,需要翻几页才能对搜索结果感觉到满意,这就降低了搜索的体验。
每天大量的用户对搜索引擎进行着检验,如果能够充分利用起这些用户的作用,对于改进搜索引擎的准确度和提高搜索引擎的用户体验有着非常好的效果的。搜索引擎不仅仅给出搜索结果的链接,同时给出的还有搜索结果的预览,正是这些预览可以让有户在打开网页之前就大致知道搜索内容是不是符合他的目的,从而决定是否打开相应的页面。
在这个过程中,用户扮演着一个评价的作用,用户会根据预览内容来评价相应页面的权重。符合他的需要,用户下一步动作就是点击,不符合,用户则不会点击搜索结果。这是一个评分的过程。如果收集用户的这种评分,将关键字和符合用户要求的结果对应起来,则得出一个用户评分系统。每一次搜索都是对于搜索结果的评分。
如通过关键词”linux"搜索的用户有非常大比例点击了http://www.linux.com这个网站,说明http://www.linux.com对应着linux这个词得分非常高,符合大部分人的要求,就可以将http://www.linux.com评为10分。而另一个搜索结果http://www.linux.org仅次于他,可以根据比例评为9分。如此类推,根据所得到的结果对原有的搜索结果进行重新的排序,则用户搜索的次数越多,这个结果将会越来越准确。
另外,时间因素也可以考虑在内,如最近的用户得到的结果越具有参考价值,随着时间的推移,权重越来越低,这样更加会具有现实意义。
我称这种算法为用户满意度评分法。是在现有搜索引擎算法上的一种改进,相信这种改进会提高用户的搜索体验,让搜索结果更加接近用户的要求。