%3Fxml version="1.0" encoding="UTF-8"%3F>
挑选 iOS 和 Android 之中的一个平台进行学习,并有所成果。
年中的时候尝试学习 Android,但发现自己并不喜欢 Eclipse 以及 Java,于是无限期搁置了这个平台的学习计划。
年底购买了一台 iMac,学完了,写出了 MacOS 与 iPhone 上的 Hello World。
学习数据结构和编译原理,并有所成果。
在自己的某个 framework 上实现了基本的数组、链表、哈希表等数据结构,并实现了一个简易的脚本解释器。仔细跟踪了 5.1.4 的语法分析器与虚拟机部分的代码。
那么接下来是对 2012 的计划。
于是,我作弊了。我采用的方法极为隐秘:当用户在分析和谐漫画的时候,软件会提示用户点击广告才能继续下载。这个方法立竿见影,我的收入快速增长,从最初的每月几元提升到了每月 100 元,甚至最后提高到了 1000+ 的水平。当然,百度似乎发觉了我收入的不正常增长,便禁用了我的帐号。
那么,我再为广告联盟的模式补充一条问题(甚至可以说是隐患):
塞翁失马焉知非福,百度联盟帐号的被封禁从客观上逼着我不得不寻找新的盈利模式。于是,我开始尝试一个很常见的方式——捐助。虽然我并不看好这个模式,不过仍然做出了。现在回忆起来,这个捐助列表从 0 到 1 的过程是最漫长的一段时期。但自从有了第一个之后,第二个、第三个甚至更多人就慢慢都来了。这个场景让我想起了路边叫卖的小贩:空摊子很难吸引顾客,但如果雇一群托儿来围成个大圈子,那么很快看热闹的人就会围得密不透风。现在看看,如果当时我虚构几个名字在捐助页面上面,也许很容易就可以吸引其他的捐助者。——当然,前提是这个软件自身要让人喜欢,毕竟没人愿意在一坨垃圾上花钱为之鼓励。
不过,与先前每月 1000+ 的收入相比,捐助的收入实在微不足道,而且很不稳定。于是,我开始构想新的盈利模式:
这两个设想就作为 2012 年的计划之一吧。请期待漫画控的 2.0 版本。
读完了《动物庄园》,觉得奥威尔很善于构造一个完整的世界体系来为他的小说服务。较之《1984》而言,《庄园》更加短小精悍,读来也更加轻松幽默。但是,看似轻松幽默的背后是更为简洁、赤裸裸的讽刺。那种直接了当的杀气透过滑稽的文字刺穿了纸质的书页,直挺挺的顶在了我的心口上。
1 2 3 4 5 6 7 8 9 10 | int __cdecl foo(const void* p1, const void* p2) { PCWSTR pwz1 = (PCWSTR)p1; PCWSTR pwz2 = (PCWSTR)p2; if (0 == wcscmp(pwz1, L"重庆")) pwz1 = L"冲庆"; if (0 == wcscmp(pwz2, L"重庆")) pwz2 = L"冲庆"; return wcscmp(pwz1, pwz2); } |
简单解释一下,这是一个回调函数,被传递给 CRT 的 qsort 函数,用于对省级行政区进行名称排序。代码的用意也很简单,当传入的字符串参数是“重庆”时,以“冲庆”代替之进行比较。
因为“重庆”的“重”是多音字。在普通的字符串之中,被按“zhong”处理了,如果直接排序的话,最后得到的结果将是错误的。考虑如下代码:
int x = wcscmp(L"重庆", L"河北"); // wcscmp returns 1
在我看来,虽然 foo 这个函数可以完成正确的排序,但未免不够优雅。但似乎又没有什么更好的解决方案,于是 foo 的做法保留了很长时间——2009 年后也许有了更好的处理方法,不过我不知道。而且由于我后来离开了 GIS 这个行业,所以逐渐淡忘了这个事情。
不过,一个偶然的机会,iOS 的通讯录给了我一个更好的答案。

如上图所示,一名曾姓童鞋被归入了 C 的索引,有如重庆之于 zhong 庆。不过,通讯录却为用户提供了一个解决方案:

简单来说,为记录增加了一个排序参考字段。如果该字段非空,则以该字段为排序标准,否则以名称为排序标准。问题得以解决。

1 2 3 4 5 6 7 8 9 10 11 12 13 14 | #include <atlbase.h> #include "DirScanner.hpp" void WINAPI OnFile(PCTSTR ptzFullPath, const WIN32_FIND_DATA& wfd, LPARAM) { ATLTRACE(_T("File: %s\n"), ptzFullPath); } int main(void) { LDirScanner<TCHAR> ds; ds.DoScan(_T("d:\\temp\\"), OnFile, 0); return 0; } |
完整的 DirScanner.hpp 在。