Login or Sign up

All Blogs

These are blog posts from everyone:

Qubes: 基于 Xen 的安全桌面操作系统

今天在 Xen 社区发现了一个项目 Qubes OS 看了一下这个 OS 的框架文档 (本地镜像), 基本原理是把不同领域的任务放在不同的 domain 执行, 利用 Xen 的 hypervisor 更好的隔离任务. 通过传统的 OS 暴露的漏洞被攻击后, 几乎整个系统都后被攻击者控制. 如果把一个服务单独放在一个 VM 里, 即使该服务被攻击, 也不会影响运行在其他 VM 上的服务. 这应该是安全领域的一个方向: 更好的任务隔离.

加快 SSH

平常工作时, 写代码的机器和测试机器往往不是同一台, 常用 SSH 来同步数据和发送测试命令. 所以对 SSH 的速度要求比较高. 今天查了一下 SSH FAQ, 修改了一下 SSH 服务器的配置, 速度有明显的提高! 原来的速度 ---------- $ time scp vdiskman.py root@linux3:~/ vdiskman.py 100% 9298 9.1KB/s 00:00 real 0m30.969s user 0m0.032s sys 0m0.004s 修改 SSH 服务器配置, 关闭 DNS ----------------------------- [root@linux3 ~]# grep UseDNS /etc/ssh/sshd_config UseDNS no 现在的速度 ---------- $ time scp vdiskman.py root@linux3:~/ vdiskman.py 100% 9298 9.1KB/s 00:00 real 0m0.209s user 0m0.028s sys 0m0.008s 快100多倍! ---------- 可以看到用时从 30.969s 减少到 0.209s! 对于我这种经常几分钟就需要运行 scp/ssh 命令几次的情况, 生活变得轻松很多!

VMware tools 下载和安装

VMware tools 的下载地址在 VMware 官方网站没有提供,以下是挖掘出来的地址。 http://downloads.vmware.com/d/info/desktop_downloads/vmware_player/3_0 http://softwareupdate.vmware.com/cds/index.xml http://softwareupdate.vmware.com/cds/vmw-desktop/player-windows.xml VMware Tools for FreeBSD http://softwareupdate.vmware.com/cds/vmw-desktop/player/3.0.1/227600/windows/tools-freebsd-8.1.4.exe.tar VMware Tools for Linux http://softwareupdate.vmware.com/cds/vmw-desktop/player/3.0.1/227600/windows/tools-linux-8.1.4.exe.tar VMware Tools for Netware http://softwareupdate.vmware.com/cds/vmw-desktop/player/3.0.1/227600/windows/tools-netware-8.1.4.exe.tar VMware Tools for Solaris http://softwareupdate.vmware.com/cds/vmw-desktop/player/3.0.1/227600/windows/tools-solaris-8.1.4.exe.tar VMware Tools for Windows 2000 and later http://softwareupdate.vmware.com/cds/vmw-desktop/player/3.0.1/227600/windows/tools-windows-8.1.4.exe.tar VMware Tools for Windows 95, 98, Me and NT http://softwareupdate.vmware.com/cds/vmw-desktop/player/3.0.1/227600/windows/tools-winPre2k-8.1.4.exe.tar 下载完成后,解开压缩包,在命令行运行: Windows: E:\VMware\VMware Player\vmware-tools>tools-linux-8.1.4.exe /s/v/qn

像 VIM 一样操作 Firefox

使用 VIM 多年,非常喜欢它的全键盘操作方式,时常想要是 Firefox 也支持全键盘操作,企不是方便很多。 今天闲来找到了一个 vimperator,一个 Firefox 的插件。安装的这个插件后,常用的 VIM 操作几乎都支持了。另外,vimperator 本身还支持用 Javascript 编写的插件,扩展其功能也很方便。 就像 VIM ,很多人 对Vimperator 的默认设置可能不太习惯,可以通过 Vimperator 的配置文件来修改。在 Windows 平台上是 C:\Documents and Settings\&lt;user>\_vimperatorrc,在 Linux 平台上是 ~/.vimperatorrc。 以下是我在使用的配置文件: "Turn the menu and toolbar on. :set guioptions+=mT "Turn off the show tabs by default. :set showtabline=1 "Turn session tracking off. :set! browser.startup.page=1 "Allow user to click in address bar. :set! browser.urlbar.clickSelectsAll=true :set! browser.urlbar.doubleClickSelectsAll=true "Map Ctrl + n for new windows " :map <C-n> <C-v><C-n> "Map Ctrl + t for new tabs :map <C-t> :tabopen<Enter> "Map paste operation normally. :noremap <C-c> <C-v><C-c> :imap <C-v> <C-v> 详细的配置可以参考 Vimperator 的手册。 另外,这里有个图形化(英文)的常用键说明。

Android:用定时器刷 timer 新界面

在 Android 平台上,界面元素不能在定时器的响应函数里刷新。 以下这段代码中,mButton 的文本并不变化。 public class AndroidTimerDemo extends Activity { private Button mButton; private Timer mTimer; private TimerTask mTimerTask; /* Called when the activity is first created. / @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); mButton = (Button) findViewById(R.id.Button01); mTimer = new Timer(); mTimerTask = new TimerTask() { @Override public void run() { Log.d("AndroidTimerDemo", "timer"); Calendar cal = Calendar.getInstance(); mButton.setText(cal.toString()); } }; mTimer.schedule(mTimerTask, 1000, 1000); } } 在 Android 平台上,UI 单元必须在 Activity 的 context 里刷新。 为了达到想要的效果,可以使用 Message Handler。在定时器响应函数里发送条消息,在 Activity 里响应消息并更新文本。 public class AndroidTimerDemo extends Activity { protected static final int UPDATE_TEXT = 0; private Button mButton; private Timer mTimer; private TimerTask mTimerTask; private Handler mHandler; /* Called when the activity is first created. / @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); mButton = (Button) findViewById(R.id.Button01); mTimer = new Timer(); mHandler = new Handler(){ @Override public void handleMessage(Message msg) { switch (msg.what){ case UPDATE_TEXT: Calendar cal = Calendar.getInstance(); ...

Android 性能分析

找到软件系统里最费时的代码,是提高系统性能的一个直接方法。 目前各种语言和平台基本上都有相应的工具做这种分析,Android 上也提供了一个 Traceview 工具。 Traceview 工作方式 ------------------- 要使用 Traceview,首先要生成 trace 文件。在需要跟踪的代码开始前调用 Debug. startMethodTracing(),在结束处调用 Debug.stopMethodTracing()。通常可以在 onCreate() 中调用 startMethodTracing(),在 onDestroy() 中调用 stopMethodTracing()。例如: // start tracing to "/sdcard/babytracker.trace" Debug.startMethodTracing("babytracker"); // ... // stop tracing Debug.stopMethodTracing(); 如果是在模拟器上生成 trace 文件,需要先创建一个 sd 文件。 生成 trace 文件后,把文件导出,然后即可用 traceview 工具查看。 其中 Inclusive time 表示函数和被它调用的函数总用时,Exclusive time 表示函数本身用时。 在 startMethodTracing() 调用后,程序的性能会降低,所以不要在最后发行版里使用。不过可以分析出函数的相对用时。

在 Eclipse 中浏览 Android 的源代码

最近在做另一个 Android 项目,经常需要看开发文档。本来 Android 源代码里有文档,但是 Android SDK 自带的库不能指定源代码路径。 当然,先 google 一下。找到了 Eric Burke 的一篇博客。他通过 Android 的源代码,找到了 android.jar 的源码路径,即sdk_dir/sources,只需要把 Android 源码放到该路径,再刷新一下工程,可以直接浏览了! 不过有个问题,Android 的源代码散落在不同的目前,想把它们复制到一个目录不容易。 Dr. Michael Forster博客给出了一个 Python 脚本来解决这个问题。

Django model class 国际化

Django model 中定义的表名默认显示为英文, 可以通过一个子类 Meta 来控制. 例如: class Bank(models.Model): name = models.CharField(max_length=20, unique=True) class Meta: verbose_name = _("bank") verbose_name_plural = _("banks") Django 文档中的相关描述 ------------------------ verbose_name Options.verbose_name A human-readable name for the object, singular: verbose_name = "pizza" If this isn't given, Django will use a munged version of the class name: CamelCase becomes camel case. verbose_name_plural Options.verbose_name_plural The plural name for the object: verbose_name_plural = "stories" If this isn't given, Django will use verbose_name + "s".

VPN 与本地网共存

本地网和 VPN 怎么共存 ---------------------- 由于很多原因, 经常会使用 VPN. VPN 有很多优点, 比如安全, 比如可以避开一些不必要的麻烦. 不过 VPN 也带来一些新麻烦, 例如, 访问一些本地服务器速度往往会慢很多. 如何才能让部分数据包走 VPN, 部分走本地网呢? 路由表 ------- 经过分析, 发现一般 VPN 客户端在 VPN 连接建立后, 会修改路由表添加一个默认路由, 让所有的数据包都走 VPN. 如果对路由表进行相应调整, 应该可以达到目的. 实例 ------ 连接 VPN 前的路由表 $ route print ... Active Routes: Network Destination Netmask Gateway Interface Metric 0.0.0.0 0.0.0.0 192.168.1.1 192.168.1.4 1 127.0.0.0 255.0.0.0 127.0.0.1 127.0.0.1 1 169.254.0.0 255.255.0.0 192.168.235.1 192.168.235.1 30 192.168.1.0 255.255.255.0 192.168.1.4 192.168.1.4 20 192.168.1.4 255.255.255.255 127.0.0.1 127.0.0.1 20 192.168.1.255 255.255.255.255 192.168.1.4 192.168.1.4 20 192.168.20.0 255.255.255.0 192.168.20.1 192.168.20.1 20 192.168.20.1 255.255.255.255 127.0.0.1 127.0.0.1 20 192.168.20.255 255.255.255.255 192.168.20.1 192.168.20.1 20 192.168.235.0 255.255.255.0 192.168.235.1 192.168.235.1 20 192.168.235.1 255.255.255.255 127.0.0.1 127.0.0.1 20 192.168.235.255 255.255.255.255 192.168.235.1 192.168.235.1 20 224.0.0.0 240.0.0.0 192.168.1.4 192.168.1.4 20 224.0.0.0 240.0.0.0 192.168.20.1 192.168.20.1 20 224.0.0.0 240.0.0.0 192.168.235.1 192.168.235.1 20 255.255.255.255 255.255.255.255 192.168.1.4 192.168.1.4 1 255.255.255.255 255.255.255.255 192.168.20.1 192.168.20.1 1 255.255.255.255 255.255.255.255 192.168.235.1 6 1 255.255.255.255 255.255.255.255 192.168.235.1 4 1 255.255.255.255 255.255.255.255 192.168.235.1 192.168.235.1 1 255.255.255.255 ...

什么是云计算

最近云计算可以说是业界很热门的一个话题, 国内也有不少的公司开始涉足该领域. 不过, 也有不少人对这个新概念理解有点模糊. 到底什么是云计算呢? 这里我基于这几年的一点点经验, 尝试梳理一下. 云计算的定义 ---------- 云计算一种基于互联网的计算机技术. 用户不用关心平台的搭建和管理, 直接通过互联网使用云计算服务提供商提供的各种服务. 一般这些服务规模都是可动态调整的, 并且以虚拟化的资源形式提供. 典型的云计算服务形式包括: * Infrastructure as a Service (IaaS). 如 Amazon Web Services. * Platform as a Service (PaaS). 如 Google App Engine. * Software as a Service (SaaS). 如 Salesforce, 甚至像 gmail, Twitter, Facebook. 云计算的特点 ---------- 总体来说, 客户不再需要自己的物理平台, 而是租用第三方提供的资源, 根据对资源的消费付费. 具体带来的好处有: * 快速部署. 提高重复部署的平台效率, 像扩容护着部署一个类似的新平台会很方便. * 节省费用. 不需要为使用率低的任务购买整个平台. * 客户端不依赖. 可以使用 Web 浏览器来访问服务, 不论是手机还是 PC, 也不论是什么操作系统, 都可以正常访问. * 可靠性. 云集算有平台级的高可用和灾难恢复机制, 应用层几乎不用再关心这些问题. * 可扩展性. 扩展对用户来说完全透明, 可以根据资源的使用情况细粒度扩容. * 安全性. 集中的安全管理, 提高了安全性. * 节能. 在负载低的时段, 可以任务交由部分物理服务器处理, 关闭其他服务器而达到节电的目的. 负载增加后在动态开启服务器. 可见性分类 --------- 公开云 服务通过互联网提供. 复合云 可以同时通过互联网和内部网访问. 私有云 使用云计算解决方案搭建公司内部 IT 平台. 可以获得云计算的大部分优点, 又不用为把关键数据放在第三方担心. 这可能是公司 IT 解决方案的发展方向. 云计算和虚拟化 ------------ 云计算经常和虚拟化一起被人提及, 不过云计算并不一定基于虚拟化技术, 只能说虚拟化技术使得云计算平台搭建变得非常方便, 同时, 虚拟化技术也个云计算带来了一些有趣的新特性. 比如, 采用虚拟化技术可以大幅简化平台搭建过程, 可以提高可靠性, 可以节能. 再比如, 充分利用公司现有 IT 资源, 采用虚拟化技术提供虚拟操作系统作为开发办公使用, 员工只需一台瘦客户机即可, 可以大幅降低公司 PC 采购成本. 相关的虚拟化方案 -------------- 开源社区目前最流行也最稳定的虚拟化解决方案非 Xen 莫属. 目前有多家商业解决方案提供商也采用 Xen 解决方案.

荔枝地图 Lycheemap

Lycheemap is a map application for android. It's features including: - Online/off-line map browse. - Store the map data on SD card. - Show the current position based GPS module. - Map source switching. - Off-line map data creating. Download -------- apk map db The map data just includes Shenzhen City. Put the data file under iputy/lycheemap directory on the SD card. 荔枝地图 --------- 开始动手做这个地图软件的时候, 正好荔枝上市. 有位同事从老家带了一大包荔枝拿到办公室分享, 遂得名荔枝地图. 荔枝地图 是一个基于Android的地图工具。它的特性包括: - 在线/离线查看地图。 - 根据GPS数据标示当前位置。 - 地图源切换。 - 离线的地图数据制作工具。 Lycheemap snapshot 下载 ---- apk文件 地图文件 地图文件原始数据从 ditu.google.cn 得来, 版权由谷歌公司所有. 目前只包括了深圳市地图. 地图文件要存放在 SD 卡 iputy/lycheemap 目录下. TODOs ------ - 目前离线地图数据搜索速度还有待提高. - 地图文件是用一个单独的软件制作的, 等有空制作成一个软件包一并发布.

Template method pattern

Model(模式,XML数据或者一组API)本身不知道将被怎么使用。实际的算法被委托给 View (视图),也就是 模板。模板方法是MVC的一个子集,不包括C。 在面向对象语言里,首先一个类使用虚函数实现一个基本的算法设计,然后的继承的子类里实现实际的方法。通用算法只实现一次,实际的步骤的具体的子类里修改。 使用: - 让子类实现可变的行为。 - 避免代码重复。找出算法中的通用代码,把变化的部分在子类中实现。 - 控制哪些可以子类化。即哪些可以重载。 例子: .. code-block:: java /** * An abstract class that is common to several games in * which players play against the others, but only one is * playing at a given time. / abstract class Game { protected int playersCount; abstract void initializeGame(); abstract void makePlay(int player); abstract boolean endOfGame(); abstract void printWinner(); / A template method : / final void playOneGame(int playersCount) { this.playersCount = playersCount; initializeGame(); int j = 0; while (!endOfGame()) { makePlay(j); j = (j + 1) % playersCount; } printWinner(); } } //Now we can extend this class in order to implement actual games: class Monopoly extends Game { / Implementation of necessary concrete methods */ void initializeGame() { // Initialize money } void makePlay(int player) { // Process one turn of player } boolean endOfGame() { // Return true of game ...

System Message: WARNING/2 (<string>, line 1); backlink

Inline emphasis start-string without end-string.

ejabberd 配置纪要

环境 ==== .. code-block:: bash $ cat /etc/issue Ubuntu 8.10 n l $ dpkg -l |grep ejabberd ii ejabberd 2.0.3-1 ejabberd.cfg ============ .. code-block:: erlang %% Admin user {acl, admin, {user, "tigerz", "localhost"}}. %% Hostname {hosts, ["localhost", "192.168.1.5"]}. %%{odbc_server, {mysql, "server", "database", "username", "password"}}. {odbc_server, {mysql, "localhost", "ejabberd", "root", "xxxxx"}}. web admin ========= Web admin 的登录帐号一定要用JID的格式:username@hostname。在这个配置里要用 tigerz@192.168.1.5。之前只用tigerz一直登录被拒绝。

System Message: WARNING/2 (<string>, line 1); backlink

Inline substitution_reference start-string without end-string.

SQLite Optimizing Query

今天研究了一下 SQLite 查询优化的问题,搜索到了这篇文章: http://web.utk.edu/~jplyon/sqlite/SQLite_optimization_FAQ.html 在最近的一个项目LycheeMap中的一个查询语句中加了“LIMIT 1”, 查询的速度马上有明显的提高. 看来 LIMIT n 意味着找到 n 个符合条件的记录就停止查询, 速度自然比没加要好很多. 5.4. Use LIMIT and OFFSET Sometimes you only need to check to see if there is at least one record that matches some criterion. SQLite doesn't implement the EXISTS keyword, but you can obtain the same result with LIMIT 1. 还有: 5.3. Order subqueries so smaller results are returned first If a query filters by multiple criteria, move the test to the front (left) which has the fewest results. A test which uses an index generally shouldn't be moved behind (to the right of) one which does. 跟我猜想一致.

vnc客户端密码认证

这两天在看VNC相关的东西,正好工作中也碰到了一个客户端登录时用户名密码验证的讨论,就把VNC中用到的密码验证方法写了下来。 通常VNC服务器会有存有两个密码,一个是完全控制权限的密码,一个是只读权限密码,处理方式完全一样。 - 先随机产生一个16字节的密钥,把这个密钥发给客户端。 - 客户端用这个密钥把明文的密码用DES算法加密,并把加密的结果发给服务器。 - 服务器也用这个密钥对明文的密码用DES算法加密,把密文跟客户端返回的密文比较,如果相同,密码认证通过,否则不通过

基于 web 的即时游戏社区构思

随着宽带网的进一步普及,即于互联网业务受众将在逐步增加。特别是针对智能手机的信息服务在将来几年市场规模迅速扩大。随着 AJAX 的发展,宽带信息业务有往纯 WEB 方式发展的趋势。 目前在线的游戏大多是 C/S 结构的,用户必须要在自己的机器上安装一个客户端才能玩,对于 PC 用户来说问题不大,但对智能手机用户就不太方便了。智能手机平台比较多,开发客户端工作量比较大。另外,安装客户端可能会成为一部分潜在用户的门槛。基于 WEB 的解决方案有更好的跨平台性。 功能 ---- - 用户注册、登录、登出。 - 添加、删除好友,屏蔽不受欢迎的人。给好友发在线、离线消息。 - 可公开或隐藏自己的好友列表。 - 与好友玩在线游戏。创建游戏或加入别人创建的游戏。邀请好友参加游戏。 - 写文本的 BLOG。定阅其他用户的 BLOG,在 BLOG 更新后发自动发消息给订阅者。 发展 --- 系统设计 ------

野芹菜

今天妈妈特意打个电话给我,说野芹菜里面有蚂蟥,让我不要吃。 留存供参考。

塞班 C++ 开发(一),源文件

Symbian C++ Tutorial 塞班 C++ 开发(一),源文件 读本程前请自行安装 Carbide.c++。Symbian 版本为 S60 5th。 源文件 源文件路径 * src: C++ 源文件 * inc: C++ 头文件 * GUI: 图形界面文件 * group: 编译文件 * sis: 片成的目标包和打包文件 Group 目录下有一个 bld.inf 文件,包含了 .mmp 文件,用于编译 Symbian 程序。.pkg 文件包含生成包的指令。 Symbian 用资料文件描述 GUI,扩展名为 .rss。这个文件放在 GUI/data。该文件经过编译生成 .rsc 文件。 另外还有一种头文件扩展名为 .hrh。这种头文件可以在 .cpp 和 .rss 之间共享。 .loc 文件用于放本地化字符串,在 .rss 文件中引用。

用 inotify 监控文件目录的变化

inotiy: .. code-block:: python #/usr/bin/env python import os from pyinotify import WatchManager, Notifier, ThreadedNotifier, EventsCodes, ProcessEvent wm = WatchManager() mask = EventsCodes.IN_DELETE | EventsCodes.IN_CREATE # watched events class PTmp(ProcessEvent): def process_IN_CREATE(self, event): print " Create: %s " % os.path.join(event.path, event.name) def process_IN_DELETE(self, event): print " Remove: %s " % os.path.join(event.path, event.name) notifier = Notifier(wm, PTmp()) wdd = wm.add_watch('/tmp', mask, rec=True) while True: # loop forever try : # process the queue of events as explained above notifier.process_events() if notifier.check_events(): # read notified events and enqeue them notifier.read_events() # you can do some tasks here... except KeyboardInterrupt: # destroy the inotify's instance on this interrupt (stop monitoring) notifier.stop() break

其实张飞是个白面书生

不知道为什么,也不知道从什么时候开始,人们都喜欢把人的性格、能力、成就等跟人的长相有意无意的做某种联系或者想像。就像京剧脸谱一样,奸诈之人就是白脸,忠贞之人就是红脸,而张飞就得是个黑脸乱髯的粗汉,云云。 可是事实真的是这样吗? 有没有人想过,可能张飞本是个白面书生呢?在那个年代,交通和通迅都不便利,名人也是靠很多人口耳相传才成为名人,而真正见过名人本尊的少之又少。而张飞素有“猛”的名声,按人们的想当然,被传说成黑脸粗汉也不足为奇。 然兰陵王高长恭为北齐大将,战功累累,却相貌柔美,以至于上阵要戴面具以威吓敌人,完全跟黑脸粗汉不粘边。 所以,威名远播的大将,也有可能是个白面书生。以貌取人不可取。