Bulletproof - 20150905

Bulletproof 的代码更新,能实现运动了。

同时观察到了疑似的 canvas 清除失败。

查看更多

分享到 评论

吐槽《神之谜题》的人物关系

《黄金头脑 神之谜题》(「ファイ・ブレイン ~神のパズル」)角色方面一反常态。

查看更多

分享到 评论

杂记 20150901

杂记

查看更多

分享到 评论

“防弹”弹幕播放器

Bulletproof 诞生介绍

查看更多

分享到 评论

全金属狂潮校园篇 逆天的制作人员

《全金属狂潮 校园篇》EP02/EP09 的制作人员

查看更多

分享到 评论

逆向工程实战 - 某软件加密的过程

记录对某软件进行逆向,得到其加密函数的过程。

本文仅用于技术探讨,禁止用于非法用途!

此次不需要修改程序内容,所以不需要备份。

本文假设读者已经有了初步的汇编语言、C 语言知识。

查看更多

分享到 评论

GitHub 似乎遭到攻击

写着代码准备push,结果 PhpStorm 提示 SSH 错误。连续两次都这样。测试访问 GitHub,发现被写入了重定向。

直接访问 https://github.com/ 或者 http://github.com/。前者会提示证书失效(说明此时实际访问的服务器443端口居然正常开着)。响应如下:

HTTP/1.1 200 OK
Server: nginx
Date: Thu, 20 Aug 2015 15:16:48 GMT
Content-Type: text/html
Content-Length: 79
Connection: keep-alive

location='http://www.cjb.net/'//<script>location='http://www.cjb.net/'</script>

很明显,不知是哪位没写好,显示内容明显位置不对,单行注释(//)也没有起到正常人要它发挥的作用。不过 <script> 标签被浏览器解析了,执行了跳转。

我修改过 DNS,问题依旧。所以可能是 GitHub 页面被置换,或者流量劫持。不过在美国的同学没报告什么,不知道什么情况。

跳转之后的响应头:

HTTP/1.1 200 OK
Date: Thu, 20 Aug 2015 15:14:33 GMT
Content-Type: text/html
Transfer-Encoding: chunked
Connection: keep-alive
x-amz-id-2: RsiH1w5SMbQ3LTBWlw1B+hSivd/m66W339sRTZmFBUgUhdVfDTOXInhPE9A7bs7h3Ah43o0orbI=
x-amz-request-id: EBB975B3EC0DA048
Last-Modified: Mon, 11 May 2015 15:30:05 GMT
ETag: W/"856a520eb3d273395421f632f23914b6"
CF-Cache-Status: HIT
Vary: Accept-Encoding
Expires: Thu, 20 Aug 2015 16:14:33 GMT
Cache-Control: public, max-age=3600
Server: cloudflare-nginx
CF-RAY: 218f0c6c382d0296-SJC
Content-Encoding: gzip

算了,GitHub 暂时用不了,本地留着各个commit好了。

分享到 评论

饿了么App的一个小问题

刚才饿了么出现了一个不好的用例。

重现方法如下:

  1. 打开手机,关闭 WLAN 和定位,打开移动数据,登录饿了么;
  2. 进入主页后,应该要出现“定位失败”的信息(前提是你没有设置“登录后自动定位到某个点”);
  3. 打开交易完成的饿单,点击“再来一份”,点击“提交饿单”;
  4. 然后你就可以看到一个各个界面元素内容都为空的饿单提交界面。

这里要表扬饿了么,因为他们采取了防御性的加载策略,不管什么时候界面都要先初始化,再根据数据加载。

但是在定位失败的情况下,却出现了空界面,这是不合逻辑的。解决方法有两种:

  1. 在定位失败的时候,提交饿单提示需要先定位;
  2. 能正常提交,但是要求用户选择送达地址,如果没有则必须新建。

我个人倾向于第二种。有待优化。

分享到 评论

建立一个小网站时候的问题与(部分)解决

舍友(下一届辅导员)委托做一个新生在线登记、统计的东西,结合智能手机普及的情况,建议是用网页的形式,微信扫一扫嘛。我选了阿里云的服务器,租用一个月(因为只需要一个月),其环境只有 Linux(PHP+MySQL)。昨天完成了一部分功能,放到阿里云上。现在记录几个坑。

诡异的 FTP 连接

我之前申请过一个 Windows Server 版的服务器,FTP 传输的时候选择的是被动模式(passive mode),其他的默认了。所以这次也选用了被动模式,结果在 PhpStorm 里直接 deploy 大多数时间连接超时,即使连接上去,有幸执行了 LIST,也无法传输文件。后来改动设置,取消被动,设置/取消兼容(compatible mode,PhpStorm 的设置),问题依旧。于是找了 FileZilla,结果非常顺利地就连接、传输了。(只不过由于 phpMyAdmin 的文件较多,即使限制并发数为1阿里云那边也经常报错说该地址使用的连接数太多。)

服务器上的 PHP 版本不够高

本来一般的做法应该是 SSH 过去,远程命令行操作 MySQL 的。结果 SSH 连接不上,我之前也没配置过 Linux 版的阿里云服务器。干脆,FTP 放了个 phpMyAdmin 过去。我当然是选择最新版(4.4.13.1)啦。但是在配置好,打开的一刹那,显示的居然是:

PHP 5.3+ is required.

你是在逗我吗……只好找了一个支持 PHP 5.2 的4.0.10.10版本。

不统一的字符编码

有一个页面是 JavaScript 发起 AJAX 请求,一个 PHP 文件处理数据并返回 JSON。但是在测试的时候,“姓名”信息根本就显示不出来。设了几个 console.log(),看了一下返回值,该字段居然是 null。但是奇怪的是,其他的字段都正常;表头也是 PHP 返回的,正确地编码了。

{"newest":[["\u5b66\u53f7","\u59d3\u540d","\u73ed\u7ea7","\u767b\u8bb0\u65f6\u95f4"],[{"sno":"15071001","sname":null,"classno":"150712","submittime":"2015-08-17 21:26:13"}]],"regcount":{"new":"1","rec":"2"}}

我想了想,名字字段和其他东西有什么不同呢?

  1. 它是从数据库返回的。
  2. 含有中文(超出 ASCII 字符集的部分)。

从第2条大致就可以确定是一个编码的问题了。但是是什么不对呢?在我本机的测试上,是能正常工作的。我看了一下我建表的语句(注意用了 MySQL 的方言):

CREATE TABLE t (x INTEGER PRIMARY KEY) CHARACTER SET = 'GBK';

为了让中文统计符合通常的“1中文占用2字节”思想,我选用了 GBK 字符集。PHP 的字符串本质上是字节数组,所以可以确定从 MySQL 读取的时候编码是 GBK,就那么直接放过来了。

再看第1条。我的其他页面(直接写的 PHP 文件,字符串硬编码)显示正常。看看保存用的字符集,UTF-8 without BOM。由于表头也是 PHP 里写死的,然后直接去 json_encode() 了,这些能正常工作,所以大致就可以确定是 json_encode() 需要 UTF-8 而某些字符串不是的缘故了。

立即写了一个hack,iconv() 了一下,果然解决了问题。

{"newest":[["\u5b66\u53f7","\u59d3\u540d","\u73ed\u7ea7","\u767b\u8bb0\u65f6\u95f4"],[{"sno":"15071001","sname":"\u5f20\u4e09(\u540d\u5b57\u4fee\u6539\u540e)","classno":"150712","submittime":"2015-08-17 21:26:13"}]],"regcount":{"new":"1","rec":"2"}}

既然知道这么麻烦,每次都要转换编码,为什么不将表的编码改为 UTF-8 呢?

于是上了:

CREATE TABLE t (x INTEGER PRIMARY KEY) CHARACTER SET = 'UTF-8';

啊,报错了。略略嘲笑一下阿里云,居然不给我用 UTF-8 编码的表。


后来我查了一下,json_encode() 的文档中写明了,其函数定义如下:

string json_encode ( mixed $value [, int $options = 0 [, int $depth = 512 ]] )

其中 value 参数的说明有一条:

All string data must be UTF-8 encoded.


MySQL 建立 UTF-8 的表应该这么写:

CREATE TABLE t (x INTEGER PRIMARY KEY) CHARACTER SET = 'UTF8';

对,就是少一个连字符。


编码的事情还有后续。我更改了建表的语句,取消了那个hack,但是显示又不正常了。

在纳闷的时候,找到了这篇文章。于是我知道了,原来 MySQL 有多个部分的编码设置。好,我就看我这里的设置是什么样的。

运行 show variables;,结果的编码部分如下:

character_set_client      utf8
character_set_connection  utf8
character_set_database    gbk
character_set_filesystem  binary
character_set_results     utf8
character_set_server      gbk
character_set_system      utf8
character_sets_dir        /usr/local/mysql/share/mysql/charsets/
collation_connection      utf8_general_ci
collation_database        gbk_chinese_ci
collation_server          gbk_chinese_ci

看起来很正常,阿里云拒绝我用 SET character_set_database utf8; 这类语句修改变量。但是在关闭了那个hack的时候,显示又不对了,JSON 编码失败。

没办法,暂时先用着这个hack吧。将问题记录在这里。


后来发现,PHP 版本是可以从主机控制台调的。不过我没有去要那个密码(因为不怎么需要),5.2也可以用。

分享到 评论

好人好事

上午经历了一系列事件,最后我人坐飞机过来,行李则交给了某个公司和其他货物一起托运。

今天从百度大厦出来,晚上七点二十左右。(这么看,大约面了50分钟。)按照计划,现在就应该去取行李了。

在此之前,我打电话问过托运的公司,对方说收货的地址在T1航站楼的西北边,中航国际货运航空所在的地方。(这个号码总是占线,要打通得看运气。此外,之前广州那人发的号码是国际货物的,根本就不是在同一个地方。总之获得这个信息也是费了很多劲。)

正好路边来了一辆出租车,我就敲窗户问:“师傅,载客吗?”师傅:“载客。”我上车,说我要到T1航站楼。一路上我们都没说什么。进入机场高速的时候,我跟师傅说:“我要去的地方,离T1航站楼有点距离,是货运北路。”然后我大致讲了一下为什么要去那里拿行李。师傅说:“没问题。”

到了T1航站楼的入口,师傅反应过来:“是要再往前开一点对吧!”过了一些,到了三岔路口:“看,这里就是货运北路,没错吧?”拐了进去,师傅也不是很熟,放慢了车速问:“你要去的地方是在这里的哪个地方?”我也不好描述,反正已经走到路上了,就说(对着地图):“先拐过两个九十度的弯……”司机很爽朗地说:“好!”

进入货运北路不久,师傅就发现了,说:“你看,这些车都集中在前面(接近航站楼的一边),往前走的话就没什么车了。这样吧,你要取东西应该不用多久,我在这里等你。而且这地方没有车,我走了你就不好打车了。”“好吧,那多谢师傅了。”

拐过第一个这个弯的时候,司机就和讲评书一样:“第一个九十度的弯!”到了下一个T字路口,司机说:“你看,没错,刚才那是第一个九十度的弯,这里拐过第二个九十度的弯。看来地图没错。”在拐过了两个弯之后,我说:“他们说就在中航国际货运航空这里……哦这里是第五滑行桥,他们说过过了这个桥,第一个右拐的地方就是。”师傅:“别急别急,我们找一下哪里进去。”

拐进去之后,由于没有明确的标识,也不知道公司在哪里(我以为会有独立的窗口之类的),准备过保安岗的时候师傅说:“我们问一问吧!”刚好岗里没人,保安似乎已经擦身而过买灌饼了。“我们掉头往回走一点仔细看清楚吧。”他说。停下来之后我对比高德导航和百度地图的显示(师傅也在看着),认为进入了正确的位置。这时候师傅做了一个惊人的举动。“那个公司叫什么?”我拿出手机打开收到的短信。师傅:“这样,我去问一下人看他们知不知道。”于是拿着手机,熄火,亲自下车,跑过马路(虽然路不宽)去问了那个保安。我在车里系着安全带看着,看到他们说着话,也在屏幕上确认着什么东西——师傅是真心要帮我找到这个公司所在的地方。随后他一溜小跑地回到车里,说:“哎呀,那个保安说他也没听说过这个公司,他来这里都好几年了。哎呀,反正都知道名字了,导航导过去!”于是他打开高德导航,照着我屏幕上显示的(百度地图显示的“中航国际货运航空”),还是一笔一划地手写输入,看到结果之后指着第一个(顺义区,货运北路)说:“是这个,没错吧?看清楚一些,是这个不?”我确认了。导航显示,“距离目的地700米”。

快到的时候,我再拼命打给的正确的电话。奇迹般地通了。我问:“我现在已经到了中航国际货运航空这里,请问你们取货的地方在哪里?”“办理大厅这里,进来右手边就是。”“是‘RGE办理大厅’吗?”“啊?”“……”“你看到‘BGE办理大厅’没有?”“看到了。”“对,就是那里。”“哦,谢谢!”

停车之后我将包留在车里(刚才人家都亲自出去问路了,我也应该相信他),赶忙去办手续:签单、缴费、拿着完备的单去取行李。结果取货的地方已经站了一圈人,他们都是等待取货的。原来,这里的保安因为管理者还没来,拒绝放货。我先将凭据给保安(排在取货队列里),然后到出租车那里告诉师傅这事。“师傅啊,估计要取到会挺久的,要不我就付钱,您别等了。”他看了看门口聚集的一群人。“是那边对吧。这样,你估计要多久?”“我也不知道会多久,现在还没放呢。”师傅看了看表。“现在是八点半(实际为20:35)。我估计一小时(那边)应该可以(发完货)了吧!我没什么关系,等还是不等就随你咯。我先等一小会儿。”“不耽误您吧?”“没事儿!没耽误的!”“那好吧……那就有劳您多等一下了。”

我回到那边。过了10分钟,管理者来了。再经过一轮又一轮的货物搬运与签收,快一小时了。我看着不时有新的单子加进来,还怀疑新单子会放到上面(工人读的也是从上面的开始),以至于我的单子“很不恰巧地”沉底了。后来确认了那只是我的乱想。我看着手机:现在已经二十三分(早就过九点)了,马上都要一小时了,本来师傅说的“等一小会儿”,再等到一小时那真的就对不住他了。遂准备一小时还没到的话就和司机讲明白,不耽误他的时间了。这时候,听到了报收货人的名字,像是我的名字的变调——或者是某种不强调声调的方言带来的口音。我应了一句,确认了那个货物(尽管包着绿色的编织袋)就是我的行李箱。签名,走人。

回到出租车那里,车外两人正在抽烟聊天。再定睛一看,师傅还坐在驾驶座上,车门半开。看到我提着东西,他把后尾箱打开,我将行李箱放进去,回到车里。师傅启动车子,一边开一边说:“刚才那个人要用车,我说‘我在等人’。他也是取了货,要去火车站。”我也不知道该怎么回应好,只能说:“实在是太感谢您了。”只能说这句话也太苍白了。开了一点距离,大约还是回到保安岗的位置,师傅问:“你抽烟吗?”“谢谢,我不抽。”“我抽一下你不介意吧?哎呀,就是那个瘾上来了。”“不介意不介意。”于是师傅放下车窗。吸完了之后,师傅说:“我把空调打开吧,我看你也热了,这天气闷热的。”“谢谢,谢谢。”“这天气,水汽一上来,眼皮叭叭叭地就要往下掉,睁不开了。”只有他说这句话的时候,我才唯一一次扭头看了看他。他手指放松地指着眼睛,眼睛随着“叭叭叭”而眨动,不过视线倒是一直朝着正前方的。这位师傅微胖,很短的头发,散发着一点那种挂金链子的大汉的凶猛之气。“上了机场高速之后,30分钟,就到家啦!”语气中透露出欢快。(我说过回程回到北航。)

从顺义回到海淀,一路上从五环到四环到三环,反正今天这么一折腾,我也一直没法睡觉,眼皮也有点打架了。清醒的时候,是师傅问了一句:“到北航的哪个门啊?”此时已经过了盘古大厦,我知道已经快到了。“东门或者南门,哪个快就走哪个吧。”“前面就到学院桥,下来就是北航东门。”“好的好的。”

下车的时候,师傅还主动出来(因为我要解安全带然后背上包)帮我提出了行李。

师傅一路上爆京腔粗口抱怨前面的车。嘛,核心见前面就好。我看核心。

这位好师傅的资格证号是303120。


开始放货的时候,“来来来,出货了”的喊声就如欢呼一般。

我也见识到了,那些明明标着“请勿重压”的牛皮纸箱子——看着上面的文本里面装的应该是手机——却被两层沉重的同类踩在脚下。

和航空业的搬运一样,这里并不在乎细节。别说,堂堂一个北京的散装货物分拣中心,连 AGV 都没有呢,只有3个工人负责出货物(包括读单、找货、装车、运输;另外有3个保安、1个管理人员和一个不知道角色的人)。


英语翻译课堂时间!今天见到的的绝佳翻译选(大雾

  • 第1滑行桥 - Huaxing Bridge 1 (Taxing Bridge 1)
  • 一车一杆 - A car for a rod (Only one car is permitted to drive through during each raise of the rod)
分享到 评论

论 Colorful Cure 的渣程度

Colorful Cure 的扯淡简直了。“天生圣人体质”是个什么鬼!然后我去,各种倒贴!四条线里最好的是红色线(幼驯染线),其他的也是莫名其妙。幼驯染线好的一点是,此人为贫乳。啊不对不对,此人的展开是最正常的(蓝色线也正常,但是RL过大不可饶恕)。改良的 KiriKiri 2/KAG3 倒是可以。但是不要硬要做成带着 RPG 的感觉啊,这是 AVG,我的兴趣不是在打怪或者模拟打怪的场景上。

同样无厘头的是 Strawberry Nauts 的正式开场。哇,每个人的好感度居然开始游戏的时候就满了诶!而且是从零莫名其妙就满了诶!我想玩中间消失的这一年啊!这里还有其他人的评论。

Lovely Quest 的,除了神助攻之外就没什么好说的了。虽然主角仍然是一个标准的万人迷(从綾花的“要不是你,我就……”可以看出),但是每个人都是没有经验的,是在 Lovely Smile 活动中慢慢加深理解(和理♂解)的,所以说得通。

好一些的是恋と選挙とチョコレート,千里(「ちさと」,不是通常的「せんり」)的好感度是显而易见的(后期揭示没这么简单),美冬、衣更的也可以解释。其他人的好感在主线(第一次的千里线)中并没有表现出来,所以我不清楚。有人说“人设很漂亮,剧情很糟糕”,我觉得后一个评价(如果不是另外的层面,例如胧的两个场景)低了。这让我想起了我在做的事情,从缘起到执行。但是!要所有的角色曲就要买齐所有的初回版(5个)!而且这个基于 Macromedia 公司的某软件的引擎好难解…… PS. 攻略了千里线,之后想攻略美冬线(为什么?因为她“是大一岁的姐姐啊”),之后就没兴趣了,估计。

分享到 评论

调戏小冰

微软小冰设定上似乎是个傲娇。傲娇气质无处不在……(你也可以直接问:“你是傲娇吗?”会得到不同回答。)

发图不说话。

查看更多

分享到 评论

火车站见闻

返程前往广州。由于我购买的是学生票,所以在检票之前换实体票,不能直接刷身份证。再加上我的懒惰(一晚上刷实习日记到九点,一个小时匆匆收拾东西,赶十二点的火车),在时间上就不允许我到清华园换票(来回有40分钟)再前往火车站了。结论:到火车站售票处换票。

在排了长长的队之后(后来看了一下,也差不多40分钟),下一个就到我了。前一位正在等待出票呢,就听到队伍后面传来的声音:“能不能帮我孩子买一下票,马上要来不及了!”这位仁兄在问了队中的一个人后,发现了队头,也就是我这里。

他从右边的通道并过来(右边的窗口处于午餐时间,所以没人排队),问我:“能不能帮我孩子买一下票?快来不及了,我孩子的话就在那边看行李。”这位仁兄相貌奇特,瘦削的脸,突出的眼睛,粗眉毛,脸的布局比起常见的方形、椭圆形布局来说更接近六边形布局。不过这样长相的人我也见过。当然,按照常理来讲,插队是不对的。因此我也犹豫了:“这个……领票是要本人来的。”

他看出了我的犹豫,说:“要本人的话,我孩子就在那边看包,马上就可以过来。”这时候前面那位已经买完票了,我准备到窗口前。他说:“这样吧,你先试试,如果要本人领取,我就叫他过来。”我想了想,同意了。为什么会同意呢?可能是因为他递过来的是一张临时身份证(不能像二代证那样直接刷卡进站)。

我取了自己的票之后,将临时证给窗口:“请问能帮取一下吗……”窗口的工作人员肯定能听见刚才的对话。“订单号。”有点不耐烦的一句。“什么?”那位父亲没听清。“订单号。”重复了一次。我小声说:“订单号,手机短信里那个。”“哦哦哦,我找一下,等一下。”他掏出了手机,打开短信信箱,明显有点慌乱,手臂微微抖动,手腕在用最大允许速度摆动,手指划过一次又一次,应该是在浩如烟海的短信记录中找到珍贵的12306确认短信。最终他找到了,大声念给工作人员。输入完毕之后,机器吐出了票。于是一张实体票和临时证滑了过来。我将票和证递给那位父亲,他赶忙说:“谢谢,谢谢……”

所有事都办完了,离开队伍。很高兴的是,刚才整个过程中,我没有听到后面的人催促。

分享到 评论

写在临走之时

在哈尔滨的实习地点,XX功的东西猖獗。证据就是这里的许多纸币居然都印着XX功的宣传语!

我略微估计了一下,在这些天收到的一元中,大约1/15印有宣传语。而且,对比了一下发现,色泽并不对,很可能是假币。但是即使如此,这里的人好像也没注意这个现象,这些纸币照样在这里流通。

说到这里就想吐槽那个某次的美国十佳社团。宣传语写得实在是让人无力吐槽:一元上写的多是“天灭XX,‘三退’保平安”、“XX活摘器官”这种话语,还有一些语焉不详莫明其妙让人退;只有在我收到的唯一一张非一元(是十元)的纸币上写的是XX功可以“袪病健身”这样的虚假的正能量。

先不说其性质恶劣,这本身就是十分失败的宣传!XX功是通过控制人心中的恐惧来吸引成员的,而被恐惧控制的人一定会做出反理性甚至反人类的行为——人在害怕的时候无法识别失误是有利还是有害,会被引导至刺激(无论正反)最小的路径;别有用心设计的路可能就是歧途。

真正的宗教,是使人在尊重他人的前提下保存自己的,吸引人的一般是正面事项——人对和谐未来的希望。(嗯,72 处这种是放纵,是硬加上了资源无限性假设的。)因为宗教更像一种行为规范,出发点是在理性人清楚种内争斗会导致灭亡,而我们人却不像动物那样一对一,而是多对多;勉强剩下的不多。为了避免这样的情况我们才发明了政治和宗教。——您希望的话,也可以称后者为“发现”而非“发明”。


就这两周,几个地方的人问过我“你们从哪来”、“什么时候走”、“将来会不会来工作”等等问题:杂货店(仓买)、放心早餐点、洗浴中心、土豆丝卷饼车。在问的时候,你能听到他们是真的把你当人看——不是冷漠、不是例行、不是看新奇、不是想知道问题的答案,就是“我们在交流”这一点。


这里人“朝八晚五”描述比较准确。也是,五点钟下班,我们住的地方就在旁边,这让我们每天下午五点到晚上有着大量的空余时间。除了工厂里的师傅,附近许多人也只是在这个区域内工作,所以下午六七点就可以看到人在吃烤串喝啤酒去泡澡,晚上九点左右商店就关门,人也少了。生活节奏慢得多。

多虑了吧。

分享到 评论

呵呵

被马迭尔冰糕坑了,个人觉得。就在马迭尔旅馆门前买的;大概十来个同学一起跳坑里了。普通的牛奶雪糕嘛。

格瓦斯还是有不同的,小麦味比平常买到的秋林格瓦斯要浓重一些。

分享到 评论

苍蝇记

实习的时候,我这个宿舍是和人调过的,位于一楼,门正对着五谷轮回之所。

刚住进来的那一天(7月19日),晚上去了一下小保健,回来的时候神清气爽,房间里没有空调也就躺床上睡了。这时房间里还是很平静的,正符合一个爱好整洁的人的房间。

“小保健”:员工单身宿舍没有浴室,要洗澡要到街对面的洗浴中心。我以前在《洗“枣”记》中讲过,要是没洗澡我真是浑身难受。我们也知道,一般不正规的洗浴中心会提供大保健服务。为了声明我的目的正常,特此创造一个词。不就是洗澡嘛。

在第二天,不知是因为什么,房间里出现了苍蝇。我想可能是我们这里优质的住宿环境,让不堪五谷轮回之所的两只敢于吃螃蟹的苍蝇开始了它们的冒险吧。宗心非常暴躁,看到苍蝇在房间里表演花式飞行就大叫:“呀,苍蝇!”(“呀!土豆”)而且他十分急切地要将这些非法入侵者赶出房间。苍蝇嘛,豆丁大小,在没有纱网啊粘虫胶啊杀虫剂啊这些反昆虫非常规武器不扩散条约的武器的帮助下,想把它们赶出房间?呵呵。

第三天,两只苍蝇似乎造蝇完成了(假如真的那么快),苍蝇数增加到了三只。反正如果不是亲属,那么也应该是收到了传单的吧。宗同学愈加暴躁,已经常常从口中迸出“去死”的诅咒。

第四天,也就是前天,早上,为了让三只苍蝇别在耳边嗡嗡嗡,我们长时间打开房门,想让它们离开宝地。没想到,可能是外面(走廊)凉里面暖和,这三位住客飞到门口还会折回来。更糟糕的是,一大波苍蝇正在,不,是已经接近。到了中午,斐波那契就要哭了,苍蝇数量增加到八九只。于是乎,到一个地方挥挥手,赶不走一只苍蝇。它们深得毛主席的战略精髓,敌进我退,敌退我追,敌闲(?)我扰,敌疲我打。看着扎堆的地方跺跺脚,惊起一群蝇物;空中盘旋一阵,又找到新的根据地驻扎了。晚上我因为没洗澡还睡在椅子上,但是一夜都没睡好。那嗡嗡声,简直就和引擎的试车一样,在你耳边留下余韵;又或者,六只纤细的长腿在你的皮肤上跳着舞,顺便来一只探头似的吻部探测表面粗糙度。

我倒是没发现这些苍蝇有多么爱香或者臭的地方,或许是因为房间里没有特别的味道,或者是因为整个房间味道都大(拜对面所赐?),虽然我闻不出。它们只是在各个表面上乱爬,想要跨过沟壑就用上背后的翅膀。

现在房间里少说也有十五六只苍蝇,简直是苍蝇窝。虽然空间还是足够人活动——但是若有一个指标,蝇积比(flies per volume,FPV),那么我们绝对比其他房间高得多,这或许可以拿出去炫耀也说不定。至少我在走廊上看了一圈,有的房间即使房门大开也没有黑色的飞行物。所以我几乎可以认为我们这是污秽之气满而溢所致。

我知道一个故事,一位法师,因为盖好的房子里遍布蚂蚁,而他不愿意杀生,因而对蚂蚁说:“蚂蚁菩萨,我即将入住,不愿戕害你们的生命,请各位另寻好去处。”一段时间之后蚂蚁就真的不在了。所以我也曾经开着门,对着屋里的一群苍蝇说:“苍蝇苍蝇,希望你们能从此门飞出,到你们更容易寻找食物的地方去。”可是好像确实有那么一两只苍蝇为我所动,其余还是在营寨里稳站如泰山。是我的佛性不够吗。

想到还有七天呢,在如此高 FPV 值的房间内生活,恐怕我就要受到很多打扰了。又杜甫曾为风损茅屋之事而作一诗篇,我也在此撰文,抒发烦闷之情吧。


7月29日补记:

25日的时候,整个队伍去中央大街,然后去东北革命烈士纪念馆参观。回来后聚餐。这个晚上我尝试了浇水法洗澡,毕竟去一次小保健要18元呢,因为店家防御性地假设(defensively assumes)顾客要泡澡,虽然我这种南方人就没有泡澡的习惯,洗澡就了事。也许是因为在走廊上吹风了,第二天头疼发热在床上躺了一天。

奇迹般地,周一的时候没再看到群蝇飞舞的场景了。(同时,头也居然什么事都没有了。)现在房间里好像就一只。

今天下午在窗外同学的提醒下发现纱窗破了一个大洞(被窗帘挡住了)。这解释了为什么我能在黑夜中看到扑向我发光屏幕的飞蛾。也不知道是谁采取了什么措施,或者是苍蝇有知从那儿飞向了更广阔的天空,总之现在我舒坦多了。

明天是一整天的讲座,各种加工啊信息建设啊的报告。想着我这两周的实习日记其实还处于欠着的状态(没写到纸上),写上那可是不少于5000字((8+1)*(600+)),在离开之前写完这真的可能吗?

分享到 评论

破解入门:解除 Strawberry Feels 的光盘加载依赖

记录一次用 Olly Debug 解除 Strawberry Feels 的光盘加载检测(即制作 NoDVD 破解)的过程。

提示:养成良好习惯,做破解前先备份原始文件!

查看更多

分享到 评论

杂记

7月8日到今天的杂记

查看更多

分享到 评论

今天一天

前往精雕的车上,我读着 CLR via C# 的托管堆和垃圾回收一章。读着读着突然想到,上次的怀疑没那么麻烦,因为 b 此时仍然处于栈上,是属于可访问的,所以不应该被回收。书中列举了一个奇怪的代码:

using System.Threading;

static void Main()
{
    Timer t = new Timer(TimerCallback, null, 0, 2000);
    Console.ReadLine();
}

static void TimerCallback(Object o)
{
    // 只会输出一次,之后就不再输出
    Console.WriteLine("In TimerCallback: " + DateTime.Now);
    GC.Collect();
}

书上的解释:

然后,垃圾回收器检查应用程序的根,发现在初始化之后,Main() 方法再也没有用过变量 t。既然应用程序没有任何变量引用 Timer 对象,垃圾回收自然会回收分配给它的内存;这使计时器停止触发,并解释了为什么 TimerCallback() 方法只调用了一次。

不过这是罕见中的罕见情况,因为 System.Threading.Timer 使用的是线程池分配的新的触发线程,是异步的(System.Windows.Forms.Timer 用的是 SetTimer() API,在消息循环中处理,是同步的),所以在新线程中的扫描结果自然是“自己没引用,创建的线程之后也没引用”了。执行预测,那还得是 JIT 编译器的功劳,要不也像我一样只是简单认为它还在栈上。但是,同步的时候就没有这个问题。——这说明即使是完善的 CLR,也很难解决设计上就无法克服的困难。

一些觉得需要认真考虑的是:

  • 非确定性析构(Finalize());
  • f-reachable 队列,以及该队列处于独立的线程上,有元素(某个对象的 Finalize() 时调用);
  • 终结时的复活(revive)机制,有助于理解 Finalize() 中代码对其他对象的引用的处理;
  • GC 句柄表;
  • System.Runtime.InteropServices.GCHandleType.Pinned 的特殊处理方式;
  • 写屏障(write barrier)的 card table(注意,要分配在连续空间上才有意义)。

由于不用做多个 AppDomain,所以我要做的模型的回收时机会简单一些。

下面要想的是还原 MonoVTableMonoMethod 的结构,因为这关系到下一个测试:终结器(finalizer)测试的设计。

分享到 评论

今天一天

写着 GC 的时候遇到一个问题,伪代码如下:

A a = new A();
B b = new B();
a.SomeProp = b;
Console.WriteLine("Dummy");
a.SomeProp = null;
C c = new C();
a.SomeProp = b;

假设在执行 c = new C() 时 GC 工作,回收内存。那么对象 b 是否应该被回收?

执行 a.SomeProp = null 时已经解除了 ab 的联系,此时 b 应该是没有被引用的;但是,接下来的 a.SomeProp = b 就重新建立了二者的联系。

去看 SGen 的代码,想看他们是怎么考虑此类问题的。核心数据结构是 GCObjectMonoObject)和 GCVTableMonoVTable),前推到 MonoClass 的时候 GitHub 的搜索就不太灵光了。真不想 clone 下整个 repo……

最近的关于组织的文档也是2001年的,很难获知 MonoClass 的细节,除非 clone 下来搜索。这里是 MonoVTable 的定义MonoObject 的定义。可以看出后者和最初相比并没有多大变化。

SGen 虽然名为“Simple Generational Garbage Collector”,但还是很复杂……毕竟 Mono 都可以承担服务器的压力了……


为了准备网站转型,在他们维护的同时我要设计 API v1。我就是应该去冲锋陷阵的嘛。Swagger Editor 是个相当不错的工具。安装的时候失败了2次,第一次 Failed: npm install xxxxxx(一个包,忘了是什么),第二次 Failed: bower install。看错误信息好像总是版本解析错误,但是每次都会解析到新的版本,所以就不断试了。然后 npm install,完成;npm start,就开始在8080端口使用了。


7小时通关了 Half-Life 2 Episode 2。结果:蚁狮幼虫成就329/333(幼虫有抱团的特性,所以剩下4只应该是在一起的),补给网成就8/9,资源定位点成就4/5(缺的那个还关联别的成就)。除了以上和火箭人成就其他都获得了。这是何等的糟糕,总是“少那最后一个”。最失望的是火箭人成就居然没给!通关后我加载了存档看,我确实是将地精(gnome)放到了火箭舱室里啊……哎我7小时通关就是为了照顾那个地精雕像,特别是在开车被武装直升机追逐、和阿狗赛跑的时候雕像特别容易掉,前者重试的次数都快赶上了我为了达成发射基地无损伤成就重试的次数了。与阿狗赛跑,由于地精在车后窗的卡位很好,而且驾驶平稳,一次就获得了竞速胜利(成就:Metal Pedal)。

分享到 评论