跳到主内容

喵星人的思维

喵星人的思维是地球人不能理解的

  1. 我喜欢将桌子上的小东西推到地上, 比如笔和杯盖

  2. 我拔了主人的黄瓜苗, 还喜欢咬它的叶子, 虽然边上还有一盆猫草

  3. 我偶尔会把主人的音箱踢翻, 不为什么

  4. 我喜欢卷装的物品, 比如卷纸和垃圾袋, 在地上滚动他们很好玩

  5. 我是收纳空, 家里的箱子都是我的

  6. 撒在地上的水或者洗手池的水比杯子里的水好喝, 马桶里水的味道也不错

  7. 我喜欢在地上打滚, 尤其是在楼道里

  8. 冬天的时候卧在笔记本上很爽

  9. 我非常喜欢给主人帮忙, 尤其是在他修理东西的时候

  10. 我经常站在阳台上眺望远方, 向往着自由;但每次到楼下我都兴奋地哆嗦, 那可不是胆小

  11. 主人的床底下真脏, 我经常去, 所以就变干净了

samllsamll2

小咪

小咪是我去年六一节那天在楼下捡的一只白色小猫.

曾经写在豆瓣上, 放在这里做个纪念. 原文内容:

前天晚上在楼下发现两只幼猫,一直在惨叫,不少同学去探望之。昨天(6.1)下午去的时候剩一只了,叫的有气无力,蛮可怜的,就将其带回家。品种,性别,年龄均不详, 这些都不是关键
健康问题。
发现眼睛有很大问题,感觉实在流脓,尤其是左眼,完全被糊住了,带小白(刚刚起的名字)去宠物医院,医生说太小了,没法看, 让先养养看(啥医生啊,医品何在)。参考网友的高招,用湿棉签轻轻擦拭,终于睁开了; 另外在水中加了少量阿莫西林;睡醒后又睁不开了,再擦;反复几次。今天早上发现左眼是睁开的,好兆头;精神也好了很多。
饮食。 参考网上判断猫龄的方法,猜小白应该是3周以后了,能隐约看见其牙齿,会走,不会跑。问题是小白不会进食,用针管喂其水和牛奶都很抗拒,可能是我的方法不对;可以吃些嚼碎了的香肠,总算进食了。
大小便
一天多了,没发现其大小便。上网搜,有同学说在其进食时要给予刺激,棉签又上场了,貌似没有用。这是个很大的隐患。
另外,太小了,能否给其洗澡? 脏的够可以了。
第一次养猫, 希望它能健康。

猫咪的智商

猫咪的智商

真的不能低估猫咪的智商.

每次我们出门, 小咪都会趁开门的时候勇敢的冲冲出去, 然后或在楼道里打滚, 或沿着楼梯乱跑, 很是麻烦;所以我们每次出门的时候都会拎着她的玩具(一只假老鼠) 在她面前晃悠, 然后扔到离门很远的地方, 借机我们赶紧走.

小咪已经能从部分现象推断我们要出去, 比如:

  1. 手里拿钥匙

  2. 往门口的方向走

  3. 甚至你换鞋的时候

慢慢地, 我的欺骗之术开始失灵;如果我将玩具扔的很远, 小咪会很快的去追, 但追了一半的时候, 就拐回了!

给猫咪剪指甲

由于完全是家养, 小咪的指甲长的很快, 可能是没有找当合适的磨抓利器.  购买了一个由麻绳编织的鱼, 挂在椅子下面, 但小咪貌似不感兴趣.喜欢在冰箱,沙发以及椅子上磨爪子.

有猫咪专用的指甲剪, 不太好用, 只好用普通的指甲剪. 每次剪指甲小咪都非常不配合, 咬人或者抓人. 后来总结发现, 小咪在刚睡醒的时候非常温顺, 这个时候剪指甲不怎么反抗;但时间持续不长, 要抓紧. 为避免将其指甲剪撕裂, 每次都剪的很短.

FFmpeg 之FFM

FFmpeg 之 FFM

FFmpeg 提供了ffm muxer和demuxer, 从ffmpeg和fferver的code看, ffm是作为缓冲来使用的,即起到漏斗的作用。

ffm muxer 和 demuxer的实现是不完整的, 从 ffserver.c 可以看出来, 在使用过程中需要更新write_index,  真是一个蛋疼的实现。

注意: ffm的IO文件要位于ramfs之上, 比如tmpfs,不能是真实的磁盘文件系统。

实际使用过程中就碰到RTP出去的数据无法正常解码。

stream 流: v4l2(h264) -> ffm(muxer) ffm(demuxer) ->rtp(muxer)

通过VLC观看, 第一帧可以正常显示出来, 后续RTP一直有数据发送, 但VLC没能解出video。

通过tcpdump查看UDP数据包, 看不出异常。

trace了一下ffm write (av_write_frame) 的时间,发现每帧耗时在100~300ms之间, 这个时间太长了(fps为30).

因为ffm的write 是同步做的,所以肯定会导致V4L2丢帧;  对H264来说,丢帧就会导致很长一段时间不能正常解码。

当前ffm的IO文件位于 /tmp/h264.ffm, 对于tmpfs来说,写的速度应该非常快才对。

使用df命令查看了当前OS的文件系统挂载情况:

 /dev/sda1 33032012 8790252 22563784 29% /
udev 922740 4 922736 1% /dev
tmpfs 186308 1948 184360 2% /run
none 5120 0 5120 0% /run/lock
none 931536 152 931384 1% /run/shm

问题找到了。tmpfs 挂载于 /run, 而不是/tmp.

修改ffm的IO文件位置, OK, 问题解决。

后记: 发现在系统memory资源紧张的情况下, tmpfs会被交换到swap 分区, 所以tmpfs不是太安全,应该使用ramfs

inet_ntoa不可重入性

inet_ntoa 的不可重入性

在使用inet_ntoa时, 碰到一个很奇观的现象。

代码如下:

fprintf(stdout, "recv from %s:%d %d and send to %s:%d %d\\n",
 inet\_ntoa(from.sin\_addr), ntohs(from.sin\_port), len,
 inet\_ntoa(to.sin\_addr), ntohs(to.sin\_port), s);

分析输出log, 发现除了to.sin_addr, 其他参数都是正确的;to.sin_addr的输出值为from.sin_addr值;但使用gdb来debug发现, to.sin_addr是正确的,也就是说输出到标准输出设备(stdout)上的值, 不是to.sin_addr的值。

查看inet_ntoa的在线手册:

The inet_ntoa() function converts the Internet host address in, given in network byte order, to a string in IPv4 dotted-decimal notation. The string is returned in a statically allocated buffer, which subsequent calls will overwrite.

很明显, inet_ntoa是不可重入的,每次调用都返回已分配好的一段memory地址,也就是说inet_ntoa的返回值(一个char*指针)是固定的,但memory中包含的内容不一样。 在上述代码中, 在计算fprintf参数时, inet_ntoa被调用了两次,第一次的调用结果被第二次覆盖住;输出结果也反应了参数的入栈顺序为从右到左。

结论:

  • inet_ntoa 是不可重入的,在多线程的环境下要更加注意

  • 每次调用inet_ntoa都会覆盖上次调用的计算结果, 要注意保存结果

另外, 为support IPV6, 推荐使用inet_ntop函数。

我和小咪

对话

我: 小咪, 不要踩键盘, 我想写代码

咪: 喵

我: 不要枕我胳膊

咪:这样舒服

我:不要睡觉

咪:ZZZ...

我:不要咬我

咪: 主人, 我刚才做梦了

我: 恩

咪: 我梦见吃虾了

我: 这个月的虾被你上次一顿吃完了

咪: 冰箱里还有

我: 没了. 你该剪指甲了

咪: 不, 敢剪我咬你

未派遣证明

未派遣证明

中国的户籍制度真是一个奇葩, 而未派遣证明 就是奇葩中的奇葩. 爱人毕业后, 户口一直放在学校;现在需要回迁到老家, 因为爱人在吉林大学读的本科, 而我们目前在苏州, 迁户口还比较麻烦. 首先就需要学校开未派遣证明;打电话给就业指导中心咨询办理的流程;需要本人或委托人持毕业证的复印件到就业指导中心去办理.  其实学校可以在收到传真或者其他材料后代学生办理, 但学校的行政人员应该只为领导负责,  不会主动方便学生的. 如果在学校所在地没有同学或者认识的人, 只能亲自跑一趟, 就为一张 未派遣证明, 相当扯淡.

其实同学也有, 但很久没联系了; 唐突的提出让同学帮忙, 即使给些报酬, 我们也难张的开口;何况是同学关系,  肯定不会接受报酬; 如果亲自跑一趟,  花费金钱不说, 关键是时间,  节假日老师们是不上班的.

所以就想找一个陌生人代办, 吉大的在校学生是理想人选. 当然, BBS是理想的信息场所. 爱人在吉大BBS牡丹园看到一个诚做家教的同学, 已保研, 留有联系方式; 大四的下学期应该有比较空的时间, 所以感觉还可以.

通过短信联系, 请孙同学有尝的帮忙. 当让, 无偿这种要求我是提不出来的, 毕竟要花时间.孙同学愿意帮忙, 然后在QQ上交流. 关于报酬问题, 我个人觉得300RMB 是上限, 再高的话就有被敲诈的感觉了.  通过交流了解, 孙同学说他家教一个小时是80RMB(当然, 我觉得这个数字有点高, 也有可能教的科目比较特殊, 都有可能), 因为都是在南区, 我估计一切都顺利的话, 一个小时应该可以搞定,   但万事皆有可能, 所以我提出150RMB作为报酬, 快递费另算;孙同学觉得150有点高(因为事情不是很复杂, 实际办理的时候也很简单), 但我想报酬高的话, 办事时动力更大一些, 哈!

我们约定, 我先付50元订金给孙同学, 孙同学拿到证明, 邮寄EMS, 发回执单给我, 我付尾款和快递费; 当然这个时候我是有风险的, 因为截至目前, 除了看到孙同学的学生证外, 不能确定他真的是孙同学. 但最坏的结果就是被骗50元, 我相信他是真的孙同学, 并且诚心诚意地和我合作.  沟通结束后, 我觉得200元就可以搞定了. 相比往长春跑一趟, 这个代价不值得一提.

晚上的时候, 按照约定我先付了50元;第二天早上, 我再次和就业指导中心的老师确定, 带办人需要携带的资料;担心有意外, 特定嘱咐孙同学带上学生证和身份证; 然后将毕业证书的扫描文件寄给了孙同学; 孙同学很快就有了答复,  再次沟通了一些细节, 提醒孙同学去前要打电话和老师确认, 别白跑了. 我印象中负责行政的老师 是很难找的. 如果孙同学白跑一趟, 即使他不提出增加报酬, 我也会适当增加.

下午三点半左右, 孙同学联系我说办好了, 并且将EMS的回执和证明拍下来发给我看. 看到图片后, 感觉应该没什么问题, 然后确认了快递费和保费, 总共31(11 + 20)元. 考虑到孙同学需要打电话给就业指导中心以及还打印一张(A4),  付了150元.

如果不出意外的话, 两三天应该可以收到.

结语: 在可承担的风险下, 我们应该相互信任, 即使是陌生人. 不知孙同学有没有担心 寄出EMS后但我不付尾款?

利用回环设备实现NFS磁盘配额

利用回环设备实现NFS磁盘配额

嵌入式系统软件开发过程中经常会使用NFS(网络文件系统)共享文件, 如果多人使用,可能需要做配额管理。quota 当然可以,但有点杀机焉用牛刀的感觉。利用unix的回环设备(loop device) 做配额管理,简单、方便,并且不需要对原来的物理文件系统做任何修改。当然,性能上会有损失(没有评估)。

以Ubuntu12.04 为例, 配置过程如下:

  1. 生成回环文件

  • sudo dd if=/dev/zero of=tony.img bs=1G count=10

  1. 配置回环设备

  • sudo losetup /dev/loop1 ./tony.img

  1. 建立文件系统

  • sudo mkfs.ext4 /dev/loop1

  1. 解除回环设备的映射

  • sudo losetup -d /dev/loop1

  1. 开机自动mount回环设备

  • 编辑 /etc/fstab, 添加新的一行

    /media/sda6/share/tony.img /media/sda6/share/tony ext4 loop, 0 0

  • 挂载回环设备

    • sudo mount -a

  • 利用df命令查看当前文件系统信息, 如过设备被正常挂载, 会有类似信息:

    /dev/loop0 10G  435M  9.1G   5% /media/sda6/share/tony

  1. 编辑 /etc/exports 将回环设备添加到NFS共享目录

  • /media/sda6/share/tony *(rw,no_root_squash)

  • restart NFS server

    • sudo /etc/init.d/nfs-kernel-server restart

  1. 挂载NFS

  • sudo mount -t nfs 172.29.43.183:/media/sda6/share/tony /mnt

  • 利用df命令查看NFS的挂载信息

172.29.43.183:/media/sda6/share/tony   10G  434M  9.1G   5% /media/ipcam_share