Money is like gasoline during a road trip. You don’t want to run out of gas on your trip, but you’re not doing a tour of gas stations. You have to pay attention to money, but it shouldn’t be about the money. – Tim O’Reilly
Saturday, May 22, 2010
Money
Sunday, May 16, 2010
Dropbox was blocked in China
Ah…yes…
Finally, it had happened before a few days ago. As you know, every popular services will be blocked in this country. Though I knew that it’s only the problem of time. Therefore, I don’t want to talk anything about this country. It’s not that i don’t want to, but i can’t.
Fortunately, I’ve just bought a foreign VPS. So, I have set a proxy such as VPN up for myself. I don’t care anymore about if the site was blocked. It saved a lot of time for me.
I’m feeling so good!
Wednesday, May 12, 2010
A sleepless night
Over and over again, I have just got up several times but still cannot fall asleep…
What happened to me? Maybe I need to do some work until I can’t do anything exhaustedly?!
Time passed so fast!!!
Friday, March 26, 2010
35 Useful Applications of Android for Chinese Geeks
HTC G1 作为我的第一款智能手机,已经使用了半年了,在这半年的时间,Android 突飞猛进,从 Hero, Droid, N1 到 HTC G4, 从 Android 1.6 到 2.1,使我对 Android 平台有了更多的期待,我坚信 Android 超过 iPhone 只是时间上的问题,在我看来,这就如同开放与封闭之间的斗争一样,最后占有优势的必然是开放的一方。
以下软件是我经过多款同类软件的使用后,根据个人偏好所精选的一批软件,希望能与更多的朋友进行分享,如果你有更好的建议及意见,欢迎回复,或给我邮件。
- Aldiko
一款不错的阅读软件,有大量免费的电子书可直接下载,用户体验不错。 - aLogcat
不需要 DDMS Logcat,在手机上也可直接查看日志信息,软件简洁,但是功能实用,可以根据 Log 级别方便过滤日志信息,随时查看调试日志。 - AndChat
Android 上的 IRC 客户端,放了很久,但没用过。 - AndFTP
FTP 客户端,对中文支持不太好,有时候会乱码。 - AnFetion
中国移动飞信客户端(非官方),功能没有官方全面,但是够用,且支持 WIFI。 - aQQ
目前最好的 Android 平台原生 QQ。(非官方) - Astrid
GTD 党必备 TODO 软件,支持 RememberTheMilk 双向同步。 - ASTRO
一款强大的文件管理器,还有其它一些功能。 - aTrackDog
为已安装的应用建立追踪数据库,可检查哪些应用已有更新可用。 - Autostarts
系统优化必备软件,可定制开机启动项和基于事件的启动项。 - Bluetooth File Transfer
解决 Android 蓝牙互传文件的问题。 - ConnectBot
非常实用的 SSH 客户端。 - Contact2Sim
可将联系人导入至 SIM 卡。 - Discover Pro
基于 Flex ,开启一个 Web 服务,可以直接通过浏览器访问,访问文件系统,下载/上传等操作。 - Documents To Go
支持 Word, PDF 等格式文件。 - EasyMoney
十分实用,强大的理财软件。可惜有试用期限,需要购买 License。 - FlashLight
非常简单的手电筒软件,拖动即可调整亮度。 - fring
非常强大的一款 VOIP 软件,支持多种协议,MSN,GTalk,Skype 等。 - Advanced Task Manager
非常实用的任务管理器。 - HiDict
一款不错的英/汉翻译软件。 - iReader
目前 Android 平台最好的 CHM 阅读软件。 - NewsRob
可与 Google Reader 同步的 RSS Reader。 - Paperdroid
可与 Read It Later 同步的 RSS Reader。 - Remote RDP
RDP 远程桌面管理客户端,收费软件。 - Remote VNC
VNC 远程桌面管理客户端,收费软件。 - RMaps
除 Google Maps,还支持 Windows Live Map 等其它第三方地图。 - Share By QRCode
生成 QR 识别码 - Shazam
音乐搜寻软件,只需播放一段十秒的音乐,软件就会通过网络查找并给出相关歌曲信息,十分强大。 - SIM Checker Lite
当 SIM 卡被更换,则会通过短信,邮件发送警告,利用 GPS 或网络定位告知所在地,防盗必备。 - Simple Last.fm Scrobbler
last.fm scrobbler 客户端,支持系统内置的音乐播放器。 - SwiFTP
FTP 服务端,使你的手机成为一台 FTP 服务器。 - Toggle Screen Timeout
关闭屏幕延迟快捷开关。 - Transdroid
免费,开源,更新快,P2P 爱好者必备软件,支持 BitTorrent 6+, Deluge 1.2+, DLink Router BT, Ktorrent, rTorrent, Torrentflux-b4rt, Transmission, uTorrent, Vuze 等多种 BT 客户端的远程管理。 - Twidroid / Twigee
目前最受欢迎的 Twitter 客户端,有免费和付费版。 - Wake On Lan
如果你的主板支持 WOL,那么便可以通过手机远程打开计算机。
以上软件(除部分收费软件),均可直接在市场中找到。
欢迎分享,转载,请注明出处,本文章可能会随时修改并标注最新发布日期。
Friday, February 12, 2010
“用得少”不代表“没有用”
- cite 包含引用信息或者对其他来源的参考说明。
- dfn 表示所包含的是术语的定义。
- code 指明一段计算机程序代码。
- samp 指明一段程序或脚本等的输出。
- kdb 表示由用户输入的文本。
- var 表示一个变量或者程序参数的实例。
- abbr 表示一种简写形式(例如 WWW、HTTP、URI、Mass 等)。
- acronym 表示只取首字母的缩写形式(例如 WAC、radar 等)。
- address 表示地址信息
- big 在一段文本中表示字号更大。
- small 在一段文本中表示字号更小。
- blockquote 表示引用一段文本,块级元素
- hr 分隔符,块级元素
- label 表单字段标签
- sub 下标
- sup 上标
- ins 定义被插入的文本(默认不显示)
- del 定义被删除的文本(文本带有删除线)
现在有了这么多的标签,你的 div 和 span 又减少了多少呢?
BBT 项目开发规范参考
写于 2009 年 5 月,这里留个备份:
Last update: billy@090522-0207
前端
- 网络层优化
- 减少 DNS 查找时间
- DNS 缓存和TTL
- 启用 Gzip 压缩传输 (大于 1KB 或 2KB)
- 代理缓存
- CDN
- 所有静态请求全部分发至 CDN 节点服务器
- HTTP 优化
- 编码统一为 UTF-8 without BOM
- 减少 HTTP 请求次数
- 合理使用 304 状态码(避免下载已经存在于浏览器缓存中的数据)
- CSS Spirtes 将相关小图合并
- 外链资源合并 (JavaScript, CSS)
- 若链接为目录, 则应在某尾加上 "/" , 避免产生 301 重定向
- 添加 Expires 头
- Max-Age 和 mod_expires
- 配置 ETag
- 避免重复脚本(提高代码重用度)
- XHTML
- 所有标签必须闭合
- 压缩空白并使用Gzip输出(发布时)
- CSS 优化
- 将CSS放在顶部
- 禁止使用 @import
- 禁止使用 CSS 表达式
- 压缩并合并外链CSS(发布时)
- 选择器明确简短
- 属性简写 (如 background-color, background-image 等合并为 background)
- JavaScript 优化
- 将脚本放在底部
- 使用 DEFER 属性(FF目前不支持)
- 压缩混淆并合并(发布时)
- 使 Ajax 可缓存
- 循环, 递归, 正则等算法优化
- Flash, gif, jpeg
- Flash 以兼容性, 效率, 容量为顺序发布
- gif, jpeg 选择合适的颜色及压缩级别
后端(待定)
- 前端 PHP 应用服务器集群
- 使用 APC 缓存本地全局数据
- 使用 APC 编译为 OP Code
- 使用 hidef 提高 define 性能
- 使用 xdebug profiler 优化
- apache / lighttpd / nginx 性能优化
- 后端 Java 逻辑应用服务集群
- jboss 集群
- 同时发布为 WebService 内部接口
- 动态数据库连接池
- 避免动态反射
- JVM 优化
- memcache 集群
- Session 共享
- Consistent Hash (libketama)
- Java 和 PHP 统一存储为 PHP Native Object / JSON
- MySQL 集群
- 读写分离(在后端逻辑应用层实现)
- 故障转移(failover)
- 定时备份(cron)
- 静态文件集群
- rsync 文件同步
- API 发布标准
- 一个基类接口, 三个实现(XML, Soap, JSON)
其它
- 所有代码遵循开闭原则 (连接池除外)
- 遵循 DRY, KISS 原则
Sunday, January 24, 2010
Unlimited Categories Implementation by Recursively
- MySQL Table Definition:
CREATE TABLE `categories` (
`id` int(10) unsigned NOT NULL auto_increment,
`name` varchar(50) NOT NULL,
`parent_id` int(10) unsigned zerofill NOT NULL,
`type` int(10) unsigned zerofill NOT NULL default '0',
PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=22 DEFAULT CHARSET=utf8; - Implementation for DataObject
public static function get_all($type = NULL, $parent_id = 0, $depth = 3, $count = 0){
if($count == $depth) return;
$condition = is_int($type) ? "AND type=$type" : '';
$categories = Database::instance()->query("SELECT * FROM categories WHERE parent_id = '$parent_id' $condition")->result_array(FALSE);
if(count($categories) == 0) return NULL;
foreach ($categories as &$category) {
$category['parent_id'] = intval($category['parent_id']);
$category['type'] = intval($category['type']);
$subcategories = self::get_all($type, $category['id'], $depth, $count+1);
if($subcategories) $category['subcategories'] = $subcategories;
}
return $categories;
} - Implementation for Logical UI
public static function output_options($categories, $depth = 2, $level = 0, $nest = 0){
if($nest == $depth || !is_array($categories)) return '';
$html = '';
foreach($categories as $category){
$html .= "<option value=\"{$category['id']}\"";
if($nest < $level) $html .= ' disabled="disabled"';
$html .= '>';
for($i=0,$j=$nest;$i<$j;$i++) $html .= ' ';
$html .= "{$category['name']}</option>\n";
if(isset($category['subcategories'])) {
$html .= self::output_options($category['subcategories'], $depth, $level, $nest+1);
}
}
return $html;
} - Usage
$categories = category::get_all(0,0,2); // All Type, Parent Id = 0, MaxDepth = 2
echo category::output_options($categories, 2);
