屋里的新家用电器:松下BL-C131A网络摄像头无线版

8 Comments

Panasonic BL-C131A Network Camera Wireless 802.11

Panasonic BL-C131A Network Camera Wireless 802.11

入手了大约一个星期了,目前感觉良好。

其实一直以来想要的都是Wowwee的Rovio,1、2年前就知道Rovio了,视频什么的也看了不少,觉得很cool很有用的一个东西,不过鉴于一直要存钱娶媳妇儿,不能买这种大玩具,只好吞了吞口水。现在也变成已婚人士了,家里又是传说中的双职工,有时离开家后还会惦记着煤水电是不是都关好了,Rovio逐渐变成了我眼中的必需品。

最近这次出差时,心想总算有机会可以买Rovio了吧,不料丫还卖断货了,官网提示Amazon上可能还有货,遂去看了看,天,已然从以前的$229、$239飙升至$299,完全就是一个iPod Touch的价码。考虑到当时买新上市的iPod Touch 3GS 32GB才同样的价格,还能打折便宜一些,而且相比之下iPod Touch还算对工作学习有帮助,干脆就放弃了Rovio,和同事一起组团儿买了iPod Touch。出差回来以后,虽说iPod Touch玩的很欢,可一上班了又会隐约觉得家里没人不放心,于是又动起Rovio的脑筋。

终于!感恩节期间,Rovio官网总算又有货了,而且降价到$229.99,还可以选择UPS并且免运费,最走运的是当时还有同事在美国出差,也答应了帮我带回来这个尺寸稍大的玩意儿,当时感动得真是觉得…要是每天都过节就好了啊!

下单之前忽然想起来去Amazon看了一下别人的评论,结果…忽然觉得Rovio这东西不靠谱起来…比如有人说它经常无故无法进入dock,导致没法充电,本身因为电池又要负责Wi-Fi又要负责丫四处转悠,顶多撑一个小时就没电了;有人说摄像头的远程遥控基本就是个笑话,只有3档:看地板,高一些,看天花板;有人说太阳刚开始下山的时候屋里不开灯的话就什么都看不清楚了;等等等等。一下子看的我的心都凉了,也骂自己在Web 2.0的年代网上购物却没有想起来查看别人对这产品的评价,一直对着官网的正面宣传流口水。看来这玩意儿还不是太成熟,或者按某些人说的,这个价格这种质量已经不错了,追求高清晰度成像的话还是花个一千多刀买专门的安全摄像机好了。

随即打消了买Rovio的念头,抄起来1000多RMB,总不能拿来远程检查地板擦没擦干净吧。在Amazon上又转了转家庭安全保障方面的设备,发现了这个价格不高评价却很不错的Panasonic BL-C131A Network Camera Wireless 802.11,价格是$249.99,比当时Rovio的价格贵一些,不过功能似乎更多一些。综合一下其他用户的评价和买家的review,最终下单。顺便利用了一下当时的Amazon Prime一个月试用,搞了个免费的2个工作日送货,免得同事都回国了东西还没到。

等同事终于出差归来,把Amazon的箱子交给我的时候,实际上我几乎已经要在公司就插上电源开机了,更别提旁边一大票电子玩具爱好者一直在撺掇。不过,谁叫咱专业呢,我决定继续吞口水,回家再说,不给起哄的看~

Amazon包装盒

没有来得及给产品包装盒拍照,因为我已经迫不及待地拆开了…

打开包装,第一感觉是…这摄像头还真小…本以为可以大一些的。电源的变压器还不错,最高可以接240V 60Hz的电源,网络方面支持有线和无线802.11b/g,视频拍摄的最高分辨率640×480,水平视野49°(最大149°),垂直视野37°(最大87°),etc.,更多的就不说了,在松下官网的产品页面上有详细的技术参数。照说明书的提示,把包装里带着的螺丝拍进墙里——说到这就要赞一下松下还在说明书的边缘画了一下螺丝钉的间距,比较细心,想以前往墙上固定点儿什么时一不小心距离没掌握好就要恶心地左右微调——不怪我不专业,当初上门装空调的师傅也是凭感觉的,最后还是免不了手动调整一下的。然后首先需要用网线把摄像头连在路由器上——总不可能靠喊的来告诉摄像头家里Wi-Fi的密码吧,再用随机光盘中的管理工具在本地LAN里搜索出这个摄像头,进入它的web管理页面,配置一些最基本的选项,比如管理员的用户名和密码,Wi-Fi热点的SSID和密码,做完这些基本配置以后,重启并拔掉网线,把网络接入方式的开关拨到无线方式,这个摄像头就算基本设置好了可以工作了。最后自然是毕恭毕敬地把它安在墙上拍好的螺丝钉上挂住。

Panasonic BL-C131A Network Camera Wireless 802.11

值得一提的是这个摄像头的“软”功能真是比较丰富:最基本的远程遥控摄像头移动就不说了,输出方面视浏览器的支持可以用静态图片、MJPEG和MPEG-4视频,用IE访问的话还可以单向输出从摄像头内置麦克风输入的音频(当然需要先装个把ActiveX控件),可以预设几个常用的摄像头移动位置以方便直接转向;支持运动检测并连续拍照缓存——这可是防贼必备,虽说我家的小区是这块治安最好的——以及定时拍照缓存,缓存中的照片可以通过FTP、HTTP和SMTP方式发送;网络方面支持通过UPnP自动配置同样支持UPnP的路由器的端口映射配置,直接通过动态DNS服务发布服务——虽说比较危险,为了安全考虑,支持配置多个权限不同的用户,并为用户设置允许的和默认的图像输出格式,以及允许查看的时间,这样出门在外的话不是必需的话可以用低权限用户远程查看,避免不必要地暴露管理员帐号;如果买了N个同系列产品,还可以配置多台摄像头的图像输出,有点保安监控电视的感觉。最贴心的感觉还是那个Privacy模式的大按钮,一按下去以后,镜头就会向上移动然后被覆盖住,同时web界面也会禁止管理员之外的用户访问,当然管理员还是可以远程解除Privacy模式让镜头再转出来的,但是有这么个大按钮就能保证即使使用这个摄像头的人是个计算机白痴,也能毫不犹豫地按下这个按钮保护自己的隐私——要是不懂“privacy”这个单词的话就另说了。

比较不舒服的是web管理界面不支持SSL连接,而且是做HTTP Basic认证校验用户名和密码,当然要这么个小设备做太多的运算还是有些强人所难,只好尽量用最低权限的用户登录,并且隔一段时间就修改用户名和密码。

有了这个小家电,上班终于放心了。就算我有些偏执吧,谁不稀罕自己家乜?至于为啥不在国内买,我琢磨着但凡有些生活经验阅历的人都能明白吧~

camera

设计模式培训,第0天

No Comments

其实一共也就才2天。

还是头儿一直张罗着要做一个设计模式的培训,因为连续2次公司技术考试里大部分人对设计模式的试题回答得都比较业余。我一直觉得这种东西是很虚的那种技术,所以一直以来不是太感冒:曾经有过N次都是看了设计模式的书就发现自己前几天在干的东西就是某模式,总觉得一帮人吹的那么神乎其神干什么。今天讲师也正好提到了Joshua Bloch大爷也有这种经历。所以说,自然而然地在不了解模式的情况下就应用了一种或N种模式也不是什么稀奇的事情,更不值得沾沾自喜,只不过不学习设计模式就能自己总结出目前流行的所有这些设计模式,那就真是神一般的存在了。

今天想记一笔,主要是因为有一个题目有点儿意思,直接就和讲师想到一起去了(过分低调了,否则可以拿个小奖品),而且应该比他想的还多一丁点。

题目很简单,设计一个logging框架,要求主要是:

  1. 支持同一笔log记录到不同的目的媒体,比如文件、数据库,或者通过socket传输字节流;
  2. 支持同一笔log记录到不同目的媒体时使用不同的格式;
  3. 支持log分级;
  4. 除了将log级别作为是否记录log的判别标准以外,要允许用户创建自己的算法逻辑决定log是否记录。

大概就是这个意思了,细节记不太清。

很多人的第一印象是:这不就是一个设计log4j么?!不过仔细考虑的话,1和4都是log4j不能直接支持的;第1个要求可以通过log4j.xml配置方式通过AsyncAppender搞定,但显然这是具体实现类的行为,没法体现框架的设计思路。

类图,草稿,而且不规范

类图,草稿,而且不规范

上面是草草画的一个类图,很草,而且也不规范,箭头的实虚都是后来看了UML类图规范又改的。

在大部分人都直接认为这就是个log4j的设计的时候,我和组里的几个哥们儿还是识别出来明显的差异,然后开始了我们自己的设计,目的很朴素:一定要和log4j不同,否则就不去演示了。

不过log4j在大部分java开发人员思维方式里的先入为主的地位还是很严重的,几个接口方法定义过来一看,还是那么地log4j。这可不行。于是先来统一一下中心思想,直接套一个大概还靠谱的模式:chain of responsibility。其实我心里完全想的是另外一个模式:J2EE核心模式里的intercepting filter。主要因为似乎chain of responsibility最原始的定义是最终链中只有一个节点被执行,而我的想法是把输出log的对象做成chain,这样肯定需要链中有0到N个对象能被执行,虽然可以说是种扩展,不过还是别在讨论严肃话题的时候捣浆糊的好,再者,借助filter就可以很容易地针对log级别和用户自定义逻辑进行过滤,只让满足所有条件的log被最终记录下来。

这个时候log4j给我们的先入为主的印象又作祟了一小下;控制输出log的被定义为类似log4j的Logger——姑且也叫做Logger吧,然后向log4j看齐一下,每个Logger都有一个名字,名字的命名规范和java的包及类名的命名规范类似,做成了树状的实现了继承的结构。这时我和另外一个老哥就有一点儿傻眼了:这成了树了,怎么搞链式调用啊?马上我想到一个补丁:生成一个广度优先遍历,哇,这样似乎又和iterator拉上关系了;并且然后允许客户代码获取没有预先配置好的Logger,默认的log行为是继承父节点的行为,这也比较类似Log4j,然后每一次客户代码获取没有预先配置好的Logger的时候,框架就在其父节点下挂接上这个新的Logger,更新广度有限遍历的iterator,etc.。如此这般,折腾了一会儿以后,我失望地发现,哎,这不还是log4j么,核心的部分基本是换汤不换药的。

好在随即马上又想到一个补丁。以上的思路的中心都是Logger们用命名规范生成出来的一个树状结构,痛苦也来源于此,但是现在已经有了filter的定义,不如换个思路,把记log时所用的Logger的名字一起作为参数传到filter中,然后做一个根据Logger名字来决定是否过滤Log消息的filter。这样一来,让我头疼的树状结构终于被干掉了,对框架来说偷了些巧,而且实现这样一个拿到Logger名字然后做一下字符串操作的filter也远比遍历、维护树状结构容易很多。至少针对这个题目看来,树状的结构没有带来更多的好处。

于是我们team就产生出了2种设计:一种是之前最终演化成和log4j基本差不多的设计,一种是我更喜欢的剥离出Logger名字管理的使用了intercepting filter模式的设计。后者明显更简单一些,没有不必要的处理。事后才反应过来,那个树状组织Logger的方式完全不是必需的,题目也根本没提到,只是作为一个需求更改验证了一下我的想法能处理这种组织方式。

讲师在看了其他team的设计之后也公布了一下他的设计,据他说那是97、98年左右的事情了,那个时候他也是刚毕业,和项目经历一起花了一个晚上重构他之前的臭代码到这个设计。98年左右,国内是肯定没有引进设计模式这本书的了。

之后也有其他很多同事“攻击”了chain of responsibility,指出这个模式和这个题目的要求似乎不太搭调,毕竟没人要求必须按照某个顺序记录同一笔log,而observer模式应该更适合一些。其实这个问题用observer的缺陷是很明显的了,filter逻辑完全要再借助其他类实现。无所谓了,好在我提到是用intercepting filter,而不是chain of responsibility,如果照讲师的说法,chain of responsibility带个filter,那observer带个filter不也可以解决同样的问题么。

是以为记。比较意识流了一些,嗯。想想这样一个logging框架,做出来应该也是有一定用途的吧。

作业是一个异常处理框架。实在有些想用上AOP,不知对付OO设计模式的题目算不算作弊乜?

转移阵地

No Comments

总算下定了决心,在linode买了一个VPS(Virtual Private Server),就要结束这N多年blog无定所的日子了。一直以来就觉得,把东西寄托在第三方的blog服务提供商处根本不算个blogging的方式,而且悉数目前的BSP们,国内的免费阉割服务严重,有独立域名的想绑定的话还要备案,国外的自由一些,发布方式也更多样一些,可惜有的已经被墙,其他的永久性拥有被墙的可能。自己搭建blog就不一样了,虽然麻烦一些,不过还好所有的事情还不是太难办。大部分人可能还是用虚拟主机服务,也有越来越多的知名blogger们不满于虚拟主机服务的束手束脚以及主机商的overselling,逐渐地转移阵地,而又以选择VPS这种方便快捷的托管方式的人居多。
虽然我完全不是什么知名blogger吧,有一个自己的VPS还是很有吸引力的,blogging的需求放一边,更是可以有一台随时待命的有独立公网IP的服务器用于实践一些自己的想法,发布一些应用和服务。于是就去linode买了最便宜的linode360,每个月$19.95,还算划算,一键安装了ubuntu karmic,内存虽然小一些,只有360M(linode*360*嘛~),跑个流量不大的没有静态化的wordpress还是没问题的。拿到手第一时间就实践了一个以前没做的事情:用nginx替代apache2跑web应用。自己的VPS就要自己照顾打理,相比发个email发布blog来说还是很锻炼人的。
兴奋的差点忘了说,blog搬家至http://blog.iusr.me/