2011 in review

The WordPress.com stats helper monkeys prepared a 2011 annual report for this blog.

Here’s an excerpt:

A New York City subway train holds 1,200 people. This blog was viewed about 5,300 times in 2011. If it were a NYC subway train, it would take about 4 trips to carry that many people.

Click here to see the complete report.

发表在 Uncategorized | 留下评论

cppdb

简介

cppdb 是一个跨平台的 C++ 数据库操作类库,可以从 sourceforge 下载源码包或者直接从 SVN 库中检出。

编译 (VS2008)

首先使用 CMake 生成项目文件,下载后解压,运行 /bin/cmakegui.exe,需要设定 cppdb 的代码目录和项目文件的输出目录(比如在 cppdb 下面新建一个 build 目录,清楚一些)。

然后是配置,大致步骤:

  1. 点击 Configure 按钮,选择 VS2008
  2. 选中 DISABLE 组下面的的:DISABLE_ODBC、DISABLE_PQ、DISABLE_SQLITE
  3. 选中 MYSQL 组下面的 MYSQL_BACKEND_INTERNAL(这样最终就生成一个 cppdb.dll,不然还要附带一个 cppdb_mysql.dll),并分别设定 MYSQL_LIB 和 MYSQL_PATH 为 C:/Program Files (x86)/MySQL/MySQL Server 5.0/lib/opt/libmysql.lib 和 C:\Program Files (x86)\MySQL\MySQL Server 5.0\include(我机器上的操作系统是 64 位 Win7)。
  4. 再点击 Configure,应该没有红色的配置项了
  5. 点击 Generate,项目文件将在指定的目录下(cppdb/build)生成

然后就可以用 VS2008 来打开 cppdb/build/cppdb.sln 了,直接编译会碰到两个问题:

1. error C2146: syntax error : missing ‘;’ before identifier ‘fd’

这个需要在 mysql_backend.cpp 的开头加上一句:

#include <winsock2.h>

2. illegal token on right side of ‘::’

这个错误的相关讨论可以参照这篇文章,文中给出的方法需要将代码中的

if(v > std::numeric_limits<T>::max() || v < std::numeric_limits<T>::min())

修改成:

if(v > (std::numeric_limits<T>::max)() || v < (std::numeric_limits<T>::min)())

但评论中还有更直接的方法,在项目属性里面定义一个 NOMINMAX 就好了。

使用中碰到的问题

1. cppdb::statement::affected()

我代码中有时需要更新一条可能不存在的记录,如果不存在,就直接插入一条新记录,而存在与否,就是调用这个 affected() 来判断,然后碰到的问题是明明记录已经存在,更新操作也执行成功(虽然字段内容没变),但 affected 返回的值仍是 0。

跟踪了下 cppdb 的代码,最终调用的是 mysql_stmt_affected_rows(),然后查到 MySQL 的官方文档里是这样解释的:

For UPDATE statements, the affected-rows value by default is the number of rows actually changed. If you specify the CLIENT_FOUND_ROWS flag to mysql_real_connect() when connecting to mysqld, the affected-rows value is the number of rows “found”; that is, matched by the WHERE clause.

找到原因就好办了,直接修改 mysql_backend.cpp,将

if(!mysql_real_connect(conn_,phost,puser,ppassword,pdatabase,port,punix_socket,0))

中最后一个参数 0 修改成 CLIENT_FOUND_ROWS 就好了。

2. cppdb::statement::reset()

示意代码:

cppdb::statement st = _conn << ….
cppdb::result r = st.query();
st.reset();
r.fetch(“”, v);    // bang!!!

必须在 r 使用完成之后,才能调用 st.reset()。

3. cppdb::statement::bind()

传入的字段值类型是 std::string 时,bind 操作内部直接使用了 std::string::c_str() 生成的临时字符串!所以如果 std::string 自身也是临时变量的话,就要当心了。。。

std::string getValue(…) { …}

cppdb::statement st = _conn << …
st.bind(1, getValue(…));

st.exec();    // bang!!!

只能这样写:


std::string s = getValue(…);
st.bind(1, s);

st.exe();   // ok~

发表在 软件开发 | 标签为 | 2条评论

mkv 转 mp4

说明

1. 两种都是容器格式,mkv 常见于 0Day 各种高清视频资源的封装,之所以要转是因为 iOS 原生不支持 mkv(话说也没什么操作系统会原生支持吧),这样除了可以直接用 iOS 直接播放(当然,容器内的音视频编码格式也要是 iOS 能支持的),还能在用第三方的播放器应用比如 AVPlayerHD 播放的时候,利用到设备的硬件解码能力。
2. 高清 mkv 中的视频流一般是用 h.264 编码的(开源的应该叫 x264 吧),后者在 iOS 上原生支持,所以最好能在转移过程中不对其重新编码,也就是说主要是封装格式的转换(remux),不然耗费的时间就不值得了。而音频流很可能是 ac3,需要转换成 aac 才能放到 mp4 里头,还好,这个操作需要的时间相对比较短。

步骤

1. 分离 mkv 内的音视频流(demux),两种方法都可以:
1) mkvextract,命令格式类似:mkvextract.exe tracks src.mkv 1:v.264 2:a.ac3
2) tsMuxeR,有 GUI 就不需要解释了。

2. ac3 转 aac,也尝试了两种方法:
1) ffmpeg,命令行有点麻烦,而且一直没试验成功,各种看不太懂的错误信息。。。
2) eac3to + NeroAACCodec
将后者解压后得到的 neroAacEnc.exe 复制到 eac3to 的目录下,到时候要用这个来编码。
命令格式类似:eac3to.exe a.ac3 a.mp4
我在笔记本上转移了一个 50M 的 ac3 文件,大约耗时 2 分钟。

3. 合成 mp4(mux),继续尝试:
1) ffmpeg,继续失败。。。
2) mp4box,命令格式类似:MP4Box.exe -add v.264 -add a.mp4 -new final.mp4
3) My MP4Box GUI,又有 GUI 了。

后记

1. 大概是因为 iPad2 的双核处理器比较强悍,AVPlayerHD 直接就可以流畅播放较高码率的 720p mkv 视频,那看来前面都白搞了。。。拿了一集 TBBT 做样本,转换前后的差别仅在两倍速播放的时候才能看出来:)
2. 之前一直用 Handbrake 将相机拍摄的视频从 .mov 格式转换成 1/3-1/4 大小的 .mkv 格式,但在 Win7/Vista 上需要借助第三方软件才能实现 .mkv 格式文件的预览,如果转成 .mp4 格式应该可以直接预览,反正这些 .mkv 里头都已经是标准的 h.264 和 aac,转换起来也快,只是需要写一个小工具来批量处理,不然上千个文件。。。:)
3. 从网上看到,Mac 平台可以用 QuickTime Pro 配合 Perian 来完成这个转换,不过更方便省钱应该是用 MKVTools:)

后记 @111205

1.  MP4Box 可以在 -add 参数中指定 fps,例如:mp4box.exe -add v.264:fps=30 -add a.aac -new final.mp4,像我的 IXUS 870 IS 录制的 .mov 文件的 fps 是 30,然后用 Handbrake 转成 .mkv 后的 fps 还是 30,如果不指定这个参数的话,最终合成的 .mp4 文件就会音画不同步了。
2. 才发现 Handbrake 的输出就是标准的 mp4 格式,只是在文件扩展名上使用了对 iPod/iTunes 友好的 .m4v,而且这个可以在软件菜单的 Options 里进行设置,那看来以后都没必要再转 mkv 了,一步到位才好。

发表在 软件应用 | 标签为 , , , | 一条评论

IAP …

1. 也是草稿箱里翻出来的,话说那时候还没有 JailbreakMe,猪肉价格也还。。。;-)
2. 应该都是收集自 bbs.weiphone.com,那时对 iOS 上的游戏还比较有兴趣。。。;-)

4 Elements HD

com.playrix.4e-ipad-free/Library/Preferences/com.playrix.4e-ipad-free.plist

<dict>
...
<key>4elements_ipad_in_app</key>
<true/>

...
</dict>

Around the World in 80 Days: The Game

80days-free/Library/Preferences/80days-free.plist

<dict>
...
<key>fullVersion</key>
<true/>

...
</dict>

Call of Atlantis HD

com.playrix.coa-ipad-lite/Documents/userdata/GameInfo.xml

<GameInfo version="14.11.2008">
...
<Options ... isLiteVersion="false" ... />
...

Catcha Mouse HD

net.odasoft.catchamousehd/Documents/state.cfg

<dict>
<key>Pack1</key>
<true/>
<key>Pack2</key>
<true/>
...
</dict>

Fishdom HD

com.playrix.fishdom-ipad-fre/Documents/Storage.xml

<Storage>
<Globals>
...
<Variable name="Lite version" type="bool" value="false"/>
...

Jack of All Tribes HD

com.g5e.hd.free/Library/Application Support/DivoGames/jack.free/profiles.xml

...
<Profiles ... freemiumPurchased="true" .../>
...

Mystery Trackers: The Void HD

Documents/save.dat

offset 0x26: 00->01

Royal Envoy HD

com.playrix.re-ipad-lite/Documents/GameInfo.xml

<root version="8">
<GameInfo loadScreenCalls="0">
...
<DataElem name="liteVersion" type="bool" value="false" />
...

Supermarket Mania® 2 HD Free

Documents/Supermarket Mania 2 iPad Free/g5/none/ProfileInfo.cfg

rename ProfileInfo.cfg to ProfileFreemiumInfo.cfg

Tilt to Live HD

com.onemanleft.tilttolivehd/Library/Preferences/com.onemanleft.tilttolivehd.plist

<dict>
...
<key>IAPFullVersionPurchased</key>
<true/>

<key>IAPVivaLaTurretPurchased</key>
<true/>
...
</dict>

发表在 软件应用 | 标签为 | 留下评论

双网卡 @ Windows

问题

无线:外网(192.168.122.*)
有线:内网 (192.168.0.*)

默认无线比有线级别低(貌似叫做跃点数,有线的小,无线的大),所以如果啥也不动的话,是连不上外网的。

以前的办法

删除0.0.0.0,添加外网路由
route delete 0.0.0.0
route add 0.0.0.0 mask 0.0.0.0 192.168.122.1

效果:挺好,除了win7会认为这时候的内网是公用网络,也找不到路由器相关的网络标识,所以不能手工设定成工作网络,对防火墙的设置不太友好。

现在的办法

还是删除0.0.0.0,但这次要添加两条路由,而且无线外网的跃点数更小
route delete 0.0.0.0
route add 0.0.0.0 mask 0.0.0.0 192.168.122.1 metric 10
route add 0.0.0.0 mask 0.0.0.0 192.168.0.1 metric 20

效果:除了能用,优点就是win7可以正确识别两个网络。

其它

曾经试过,不修改路由,直接设定网卡的跃点数(默认是自动的),设定成无线比有线小,奇怪的是,这个设定有时有用有时没用(那也就相当于没用了)。。。另外在上面的设置中,虽然我写的是10/20,但实际修改好后往往会是35/40,不知道是咋回事。。。

ps. 刚在草稿箱中看到这个,貌似还是大半年前记录的了。。。

 

发表在 软件应用 | 标签为 , | 留下评论

本本出问题了

病症很奇怪,半天都搞不定,估计要重装系统了:(

这台机器平常一直挺好,而且今天上午还是好好的,之后也没做什么特别的事情,但中午看网页的时候就死了一次(只有鼠标能动),刚开始还以为是 FireFox 5 的问题,后来才发现不是这么简单。

多次重启机器后,确定下来的病症基本是这样的:
1. 开机进入系统后的三四分钟内都是和平常一样,没什么问题。
2. 然后硬盘指标灯会变成常亮状态,但这时打开我的电脑什么的都还正常,虽然明显变慢,而从任务管理器里面也看不出有什么程序对磁盘的访问有明显异常。
3. 再然后不久,硬盘灯就不亮了,系统就进入了所谓的死机状态,除了鼠标能动,其它都没反应,包括运行任何程序或是打开我的电脑什么的。感觉上就像是磁盘丢了一样,任何需要读写磁盘的操作都无法完成。

病急乱投医,尝试过的解决方法:

1. 检查系统日志,今天出问题后的错误记录倒有不少,但也看不出明显的问题所在。
2. 检查系统启动项,无明显异常。
3. 卸载今天早上安装的三个操作系统更新(其中一个貌似是和硬件有点关系)
4. 重装主板芯片组的驱动程序(正好前些时间戴尔官网上发布了一个新版本)。
5. CHKDSK /F 扫描 C 盘,无明显问题。
6. 正常启动操作系统安装 MSE(之前机器是裸奔的),但不完成更新不让扫描,而更新到一半就已经死机了。。。就算是进入安全模式下,也不能正常更新,最后会报个错误。
7. 360safe,系统体检,无明显异常,木马查杀,无结果。
8. 其它等等等

总之,全部无效。。。最后,这篇日志是在有网络的安全模式下写的,嗯,安全模式下是一切正常的,所以我觉得这应该还是个软件问题,但我找不到问题的原因在哪,郁闷啊。。。

ps. 前些时间爸妈家里的老台式机也出问题了,听电话里老爸描述的病症,似乎和我这个问题挺像的,难道是中了同样的病毒?但那台机器是 XP SP2,我这台机器是 Win7 x64 SP1,差距比较大

update 06/30:对 D 盘 CHKDSK /F 后问题解决,估计是出问题的那些个文件正好被某个系统服务用到吧(而且应该是个安全模式下不会启动的系统服务),但为啥会导致机器彻底没响应就不清楚了~

发表在 软件应用 | 标签为 , | 留下评论

如何改善 iTunes 里应用程序的下载速度

详细的说明可以看威锋网的这篇帖子

大致意思就是说 iTunes 下载时会在 2000 个服务器中随机挑一个来下载,所以同样的网络条件下,有时速度还不错,有时却慢得要死。。。

所以就有了一个比较暴力的方法,重写操作系统的 hosts 文件(这个优先级高于正常的 DNS 解析),将所有服务器地址都指向本地连接比较快的 IP 地址,比如周边的国家或地区(因为水果公司在天朝大陆没有部署服务器),那样下载速度应该就有保障了。

Windows 系统的 hosts 文件在 C:\Windows\System32\drivers\etc\ 下面,加上类似下面的内容就行,嗯,要写2000行,不想写的就直接去上边的帖子里下载吧:)

203.69.113.136 a1.phobos.apple.com
203.69.113.136 a2.phobos.apple.com
203.69.113.136 …
203.69.113.136 a2000.phobos.apple.com

注意:上面这个 203.69.113.136 不一定适用于所有网络条件,最好是自己测试一下,不行就换其它 IP。

============ 如果对上面的方法不太满意,还可以继续往下看 ============
=========== 下面的内容仅对使用了 dnsmasq 的路由器固件有效 ===========
=================== 比如 tomatodd-wrt 等等 ====================

我家里无线路由器使用的是 1.27 版本的 tomato,在导航菜单中找到:Advanced -> DHCP/DNS -> dnsmasq (Custom configuration),然后加上如下一行(对的,这玩意支持通配符!),效果就和前面那个方法一样啦。

address=/.phobos.apple.com/203.69.113.136

除了简单明了,还有其它好处:
1. 对整个局域网的电脑有效,如果 iOS 上的应用下载也是相同原理的话,那应该也适用于 iPad 等设备本身
2. 能针对不同的网络条件设置特定的服务器,上面那个 .136 在公司试下来效果不错,但回到家里就不太行了,而且换了一个其它的也不行,我估计是铁通自身的网络不给力。。。

update 06/30: 搞错了,a*.phobos. 这样的通配符格式貌似不支持,只能写成 .phobos。
udpate 07/16: 上面修改路由器配置的方法貌似有时会导致一些链接到 iTunes 商店的网页无法正常打开,暂时无解,不行就直接在 iTunes 里面搜索应用吧。

发表在 软件应用 | 标签为 , | 留下评论