喵星人的思维
小咪
小咪是我去年六一节那天在楼下捡的一只白色小猫.
曾经写在豆瓣上, 放在这里做个纪念. 原文内容:
猫咪的智商
猫咪的智商
真的不能低估猫咪的智商.
每次我们出门, 小咪都会趁开门的时候勇敢的冲冲出去, 然后或在楼道里打滚, 或沿着楼梯乱跑, 很是麻烦;所以我们每次出门的时候都会拎着她的玩具(一只假老鼠) 在她面前晃悠, 然后扔到离门很远的地方, 借机我们赶紧走.
小咪已经能从部分现象推断我们要出去, 比如:
手里拿钥匙
往门口的方向走
甚至你换鞋的时候
慢慢地, 我的欺骗之术开始失灵;如果我将玩具扔的很远, 小咪会很快的去追, 但追了一半的时候, 就拐回了!
给猫咪剪指甲
由于完全是家养, 小咪的指甲长的很快, 可能是没有找当合适的磨抓利器. 购买了一个由麻绳编织的鱼, 挂在椅子下面, 但小咪貌似不感兴趣.喜欢在冰箱,沙发以及椅子上磨爪子.
有猫咪专用的指甲剪, 不太好用, 只好用普通的指甲剪. 每次剪指甲小咪都非常不配合, 咬人或者抓人. 后来总结发现, 小咪在刚睡醒的时候非常温顺, 这个时候剪指甲不怎么反抗;但时间持续不长, 要抓紧. 为避免将其指甲剪撕裂, 每次都剪的很短.
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 为例, 配置过程如下:
生成回环文件
sudo dd if=/dev/zero of=tony.img bs=1G count=10
配置回环设备
sudo losetup /dev/loop1 ./tony.img
建立文件系统
sudo mkfs.ext4 /dev/loop1
解除回环设备的映射
sudo losetup -d /dev/loop1
开机自动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
编辑 /etc/exports 将回环设备添加到NFS共享目录
/media/sda6/share/tony *(rw,no_root_squash)
restart NFS server
sudo /etc/init.d/nfs-kernel-server restart
挂载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
关于我
喜欢动物, 热爱技术, 有理想有追求的程序员.