转换视频到DVD机上播放

最近注重家庭生活多一些,blog都快要荒废了,呵呵。买了个DVD机,淘汰了已经没法再用同时也是很久没有用了的N年前的山寨VCD,对于我来说主要用途是看电影,与在电脑上看不同,这样可以“霸占”电视,“强迫”家人与我一同欣赏。

好像现在市面上的DVD大多不支持rmvb,同时rmvb也是网上电影下载使用最多的格式,视频音频效果对我这个非发烧友来说都还过得去。在商场的时候倒是有一款“影王”能够直接播放rmvb,号称是全球第一款,播放效果还是不错的。但为了照顾喜欢唱歌的家人,还是买了重点在于学唱歌的“歌王”,支持“网络视频解码”(mpeg4家族,不支持rmvb),心想咱的电脑那么多计算力闲着也是闲着,就自己转换成支持的格式呗,结果还是小费了点工夫。

回家一试,倒是支持我最常用的XVID视频格式,但转了个样片发现播放的时候有强烈的抖动、回帧和马赛克现象,很费眼,没法看,遂逐一更换编码尝试:

  • 改用xvid 1-pass,照旧
  • 改用xvid 1-pass constant quantizer,照旧
  • 改用x264 1-pass、1-pass constant quantizer,结果不支持

无意中,看到有人介绍常用转码格式的时候,总是带上一个harddup的vf参数,查help一看,好像就是转码时提示

1 duplicate frame(s)!

的原因所在,而这个重复帧还有一定“校准”的功能,转个样片一试,问题都没有啦。

所以,我最终使用的转换方式如下(xvid 2-pass):

mencoder source.avi -ofps 29.970 -oac mp3lame -lameopts abr:br=128 -ovc xvid -xvidencopts vhq=4:pass=1:bitrate=$BITRATE -vf harddup -mc 0 -passlogfile "target.divx2pass.log" -o /dev/null;

mencoder source.avi -ofps 29.970 -oac mp3lame -lameopts abr:br=128 -ovc xvid -xvidencopts vhq=4:pass=2:bitrate=$BITRATE -vf harddup -mc 0 -passlogfile "target.divx2pass.log" -o target.avi

效果虽然好了,但占用空间体积也随之增大了,我的样片原本不带harddup的大小是17M,带上harddup转换的结果是20M,多占用约18%的空间,如果帧数降低一些,改为-ofps 23.976,那么转换出来是19M,只多占用12%的空间,其中利弊,各自取舍吧。

视频转换方面我只是略知皮毛,翻翻帮助学点够自己常用的就得,不知还有没有其它更好的转换方式。

参考

Update @ 2008-12-23

今天又转了一个正式的电影,结果出来以后比rmvb格式多用近60%的空间,比不带harddup多用23%的空间,有点汗哪。

Update @ 2008-12-26

又发现两个片子不能播放,提示:

video resolution not supported

一个分辨率是848×352,另外一个是1024×544,一般624×256的播放都没问题。

Tiny Tiny Rss – 可惜不合我口味

rss reader - Tiny Tiny RSS

open source php翻出来的,是一个web方式的RSS阅读器,可以架在自己的服务器上,把RSS下载下来慢慢看。

Tiny Tiny RSS的界面很精美,并且是全Ajax的界面,初看让我很兴奋,但仔细试用下来,还是不合我口味啊。

首先,当你把本页的内容都读完之后,比如设置显示了20项,它就自作主张的又给你下载了20项,依此类推,没完没了。或许很多人喜欢这种功能,但我习惯设置成显示全文(如果只显示标题的话,还要多点20下鼠标,更累),并且我知道浏览器如果一页显示内容过多的话(尤其是ajax这种js较多的页面),速度会很慢,所以习惯看完20项,再点一下某个位置,再调出20项来,操作也不麻烦,浏览速度也能有所保证。

第二,如何设置已读?如果你把RSS纯当做新闻看的话无所谓,但我是用它来收集我喜欢和感兴趣的内容的,不希望漏掉任何一篇,也不想某篇文章总是阴魂不散的显示在unread中。好了,Tiny Tiny RSS也支持两种设置已读的方式:自动和手动。先说手动,就是逐项选中,然后上面Ajax的菜单中有设置选中或所有的项为已读,但是,逐项选的话太累,全部设为已读呢。。。下面新出来的20条我还没读呢;再说自动,本来是很好的功能,但web和浏览器的效率绝对比不上单机软件,很难准确和完整的捕捉、处理鼠标的动作,所以有时候扫一眼就可以的文章,总是不能自动被设为已读,在网络情况不好的情况下显得更糟糕。还有,由此衍生的副产品────apache的log却在疯涨,就我单机试用基本上就攒下了1M的log,多半是这样的内容:

127.0.0.1 - - [01/Sep/2008:10:37:10 +0800] "POST /sys/ttrss/backend.php?op=rpc&subop=catchupSelected&ids=1495&cmode=0 HTTP/1.1" 200 278 "https://office.fwolf.com:82/sys/ttrss/tt-rss.php" "Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.9.0.1) Gecko/2008072820 Firefox/3.0.1"
127.0.0.1 - - [01/Sep/2008:10:37:14 +0800] "POST /sys/ttrss/backend.php?op=rpc&subop=catchupSelected&ids=1498&cmode=0 HTTP/1.1" 200 68 "https://office.fwolf.com:82/sys/ttrss/tt-rss.php" "Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.9.0.1) Gecko/2008072820 Firefox/3.0.1"
127.0.0.1 - - [01/Sep/2008:10:37:22 +0800] "POST /sys/ttrss/backend.php?op=rpc&subop=catchupSelected&ids=477&cmode=0 HTTP/1.1" 200 297 "https://office.fwolf.com:82/sys/ttrss/tt-rss.php" "Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.9.0.1) Gecko/2008072820 Firefox/3.0.1"

很多小的请求,数据包甚至还没产生的log字节数多呢,也难怪,滚动页面、点击页面都要处理是否要再拉些文章出来、是否设置已读、已读文章数是否要更改这些操作,服务器的负担应该是很重的。或许这是Ajax滥用的弱点吧,我的网络情况不太好,以前也差不多是由于这个原因弃用了google reader。这一点我觉得gregraius适合我,一点Mark These Items as Read,这20项铁定会设为已读,一个不会多一个不会少。

最后,还有一些细节上的瑕疵,比如哪儿也找不到看所有未读文章的地方,上面的Update有时候是变换显示的文章内容,有时候又成了更新feed,那个慢啊,我命名是后台在cron里更新的嘛;能自动分析出feed中原作者加的tag本是好事,不过这样一来tag太乱了,点一篇文章我自己改下tag吧,已保存就──biu──的一下没了;Select: All None等设置完全是仿gmail或google reader,但是rss reader毕竟和mail不一样啊,我个人更倾向于利用rss来作资料收集和管理,而不是看完就仍的报纸,毕竟互联网上不稳定因素太多了,好东西能在自己这里存个备份还是有用的。

话说回来,Tiny Tiny RSS还是很不错的,只是和我那蹩脚的习惯不搭配罢了,和Gregraius相比精细了很多,feed解析和格式处理也好很多,其他的管理方面,除了不支持plugin外都很好,还多了一个Gregraius缺少的重量级功能:多用户模式。不过,Gregraius已经被我调教得很好用了,还是暂时先不换吧,Tiny Tiny RSS毕竟也是刚刚开始,期待将来会发展得更好。

rss reader - Gregraius

Update @ 2008-09-01

在导入feed的时候两者都支持html tag过滤,不过Tiny Tiny RSS只有一个开关选项,而Gregraius不仅能设置允许那些tag,还能设置仅允许这些tag拥有哪些attribute,比如只允许<a><a href="">,默认是不带attribute的。

为ThinkingRock报表添加字体

ThinkingRock是一款用Java编写的跨平台的GTD工具,我试用过很多GTD工具,在线的、单机的、自架服务器的,转了好几个圈,最后又转回来用它了,主要理由就是方便,该复杂的功能就要复杂,该简单的功能就要简单,可以用Project/Action来组织复杂事务,支持任务分配(当然只是给自己看的,没有协作功能),还算方便够用的报表功能。说到报表就到本文的主题了,软件自带的几个字体都无法显示中文,生成pdf报表之后里面的中文都会变成井字号#,所以需要自己安装中文字体。

参照官方的字体安装说明,核心意思是该软件的字体读取使用了FOP,而这个FOP需要Font Metrics文件才能工作。FOP是Apache中的一个项目,我没有深入去研究,不过网站上也有一篇比较清楚的文章教人如何生成这个Font Metrics文件

但文章中的例子,使用库文件的位置和形式有点小问题,-cp后面是各个库文件,要能访问到才行,文中的路径显然不合适;文中各个库文件之间是用分号;间隔,这是在Windows中的写法,放nix下就错了,可以换成冒号:。所以,命令就变成了这个样子,注意所在路径的变化和相对路径:

$ cd /big2/tools/tr-2.0.1/tr/resource/fop
$ ln -s /big2/fonts/xpfonts/simsun.ttf
$ java -cp ../../modules/ext/fop-0.93.jar:../../modules/ext/avalon-framework-4.2.0.jar:../../modules/ext/commons-logging-1.0.4.jar:../../modules/ext/commons-io-1.1.jar org.apache.fop.fonts.apps.TTFReader -ttcname "SimSun" simsun.ttf simsun.xml

如果字体文件中包含多个字体,而你指定了错误的字体名称,系统会给出提示:

TTF Reader for Apache FOP 0.93

Parsing font...
Reading simsun.ttf...
This is a TrueType collection file with 2 fonts
Containing the following fonts: 
SimSun
NSimSun
Error while building XML font metrics file.
java.io.IOException: Name does not exist in the TrueType collection: Simsun

看到没,SimSun和NSimSun俨然就是宋体和新宋体啊。生成成功之后,simsun.xml就是我们得到的Font Metrics文件,所以接下来只需要再修改一下fop.xconf,把新字体的设置加进去就可以了:

<font metrics-url="simsun.xml" kerning="yes" embed-url="simsun.ttf">
  <font-triplet name="SimSun" style="normal" weight="normal"/>
</font>
<font metrics-url="simsun.xml" kerning="yes" embed-url="simsun.ttf">
  <font-triplet name="SimSun" style="normal" weight="bold"/>
</font>
<font metrics-url="simsun.xml" kerning="yes" embed-url="simsun.ttf">
  <font-triplet name="SimSun" style="italic" weight="normal"/>
</font>

好了,现在ThinkingRock的Tools -> Options -> Miscellaneous -> Action Screens中,就可以选择中文字体SimSun了,各种报表pdf中的中文也都会正常显示。

参考

Wine下运行的广发委托系统退出时可能会误删mail目录

这个问题不是第一次出现了,网上也查不到相关资料,所以感觉有必要说一说,看有没有和我同样遭遇的朋友。

用wine运行广发委托软件,是比较老的版本了,用起来没什么问题的,新版wine下中文的表现还改进了:

stock_trade_client

偶尔的,好像是打开以后发呆时间比较长了更容易出现,点左上角“退出”按钮的时候,原本应该一下子就关闭的,突然变得迟钝、没有响应了。后来一检查,发现$HOME/mail下的文件都没了,把文件删完之后委托程序才正常关闭。

猜测是委托软件为了防病毒、盗号之类的,在进行安全检查的时候,会检查目录下有没有mail文件(因为一般盗号会采用生成邮件,然后发送到自己邮箱的方式),如果有就删除之。windows下一般人很少会用到mail目录的,用wine运行的委托软件不知怎地阴差阳错的就找到了系统默认的mail目录,文件还删得挺干净。

原先想过把mail放到别处,然后ln过来,可并不解决问题;并且mail这个目录也不宜放到别处,因为那样系统生成的邮件就放不过来了,比如crontab里程序运行的输出。

所以现在只能采取两个临时措施,以观后效。一是在用wine启动程序的时候,先cd到委托软件所在目录,即当前目录下就没有mail目录了;二是在winecfg里把到$HOME下的映射都删掉:

wine_remove_my_documents

话再说回来,在$HOME下操作其实也挺危险的,因为对于个人用计算机来说,系统坏了倒是小事,资料丢了才心疼呢。

用ssh打通反向隧道,内网也可对外提供服务

一般正规一点的网络环境,大多是这样的:防火墙后分为内网和中立区(DMZ),并且内网和DMZ虽然都能访问外网,互相却是无法直接访问的。内网和DMZ的区别就是,来自外网的访问,都通过防火墙上的规则映射到DMZ里的服务器上,而内网一般是不允许这样的。

现在需要解决的问题就是,在防火墙只能给DMZ开端口,内网和外网不可直接互访的情况下,如果让内网的机器对外提供服务。

ssh是很神奇的,使用它创建的隧道,可以起到代理的作用,数据流的方向是:

本机 -> 隧道 -> 外网

应用到我们的问题中,如果把隧道反过来,就是:

外网 -> DMZ -> 隧道 -> 内网

这就需要用到ssh的反向隧道,它在服务器上打开一个监听端口,这个端口的访问会被隧道传输到本地,结果再通过隧道传到服务器上,从监听端口返回给客户。这样,在我们的应用中,内网机器通过外网访问DMZ服务器,创建ssh反向隧道,就能够对外提供服务了。当然,防火墙上要将相应端口映射到DMZ的服务器上。

比如,在内网登录DMZ服务器:

ssh -R 8082:localhost:82 fwolf@svr5.tld -o ControlPath=/tmp/ssh_svr5_reverse_tunnel

这样,访问DMZ服务器svr5的8082端口,就是在访问本机的82端口。之所以带上-o ControlPath,是为了和其它访问svr5的进程使用不同的master模式(如果不是第一次创建这个master,而是使用了原来的连接的sockts,肯定就不会创建隧道了)。

有几个问题还需要注意一下:

  • 如果DMZ上监听端口小于1000的话,就必须用root用户登录DMZ服务器,比如root@svr5.tld
  • DMZ服务器上的sshd必须开启GatewayPorts选项,在文件/etc/ssh/sshd_config中加入GatewayPorts yes
  • 记得不要idle,参考中有在服务端设置的方法。
  • 如果放在其它脚本,比如/etc/rc.local中执行的话,除了配置自动登录,还可以带上-fN参数,放到后台去。

参考

Update @ 2008-07-25

注意,由于使用了反向隧道,所以ssh隧道实际作用相当于一个代理,访问的来源也自然就都成了127.0.0.1,如果同时还启用了denyhosts,千万记得要把本机地址127.0.0.1放入白名单/etc/hosts.allow,不然就会成为其他登录失败的牺牲品(失败的登录,其来源也成了loopback的地址):

ssh_exchange_identification: Connection closed by remote host
Fatal error: Lost connection with the server

没办法,为了网络通道的畅通,只能牺牲一部分安全性了。

选择Eclipse PHP Development Tools(PDT)作为PHP开发工具

vi虽然轻巧,但一来在图形界面下没有必要一定用纯cli的东东,二来在项目开发的环境中vi有些吃力。Zend Studio呢一直用着他的keygen也挺不好意思的,功能上我只能说是一般,再一般不过了,就是个图形化的编辑器,带代码提示什么的辅助功能,最有用印象最深的居然是选择多行然后用TAB整体缩进。

所以,尝试着把开发工具更换为PHP Development Tools(PDT),eclipse的大名早有耳闻,只是从来不用java,也就没有摸过。早在2004年底作项目的时候见同事用过,慢就一个字,强也是一个字。至于为何不选PHPEclipse,倒也不是听到网上一边倒的声音,而是我实在是有点不习惯它的复杂,相比之下刚出炉不久功能不全的PHP Development Tools(PDT)正和我意。

我是从官网下载的pdt-all-in-one-R20080103-linux-gtk.tar.gz,有点像懒人包,直接解压就能用了,功能基本上都配置好了。额外装了几个插件,都是用系统自带功能Help -> Software Updates -> Find and Instal安装的:

基本上就够我用了。这种安装方式实在是很方便,能够后台运行更方便。

配置Debug的时候麻烦一些,其实到后来我也没弄太明白,本来想用XDebug的,不过上官网一看基本上只有for windows的二进制包,linux下的多半还得自己编译(网上的例子也多半是基于windows的环境,很无奈),就转向Zend了。谁知Zend官网上这个Debugger的链接也不好找,产品列表里根本就没有,现在这个更新/安装地址已经忘记是从哪里搞来的了,不过能用。

Debug能用了,不过只限于PHP Script运行方式,如果要完整的web测试的话,还得去修改php.ini加Zend Debugger的扩展,懒得弄了,处理得当的话需要debug的时候不多,一般print_r/var_dump也基本够用了。

PHP Development Tools(PDT)的编辑区比Zend Studio要“小”一些,因为界面的边框太“厚”了,Tab也有点大,可以在界面设置中取消圆角,能省点地方。编辑区小的问题不要紧,Ctrl-M能放到最大,加上其它窗口可以缩起来,用的时候调出来,用完自己还会缩回去,所以总体界面上还是要比Zend Studio要好用。

功能上,最喜欢的就是Eclipse无时无刻不在的语法检查,可以迫使我们摒弃掉一些坏毛病。不过这个功能和Smarty模板合不来,像我原来smarty模板文件都是.html扩展名的,这下可遭殃了,一大堆无法处理的错误信息。中间试过PHPEclipse,它支持Smarty模板,不过是另外分配了一个编辑器,同样也只能认.tpl扩展名,模板编辑功能几乎没有,就剩下一个模板语法高亮显示,居然还不像其它编辑窗口一样能够调整背景(我习惯把编辑区背景设置为#CCE8CF,节省眼力),索性不用了。费点功夫把所有模板都改成.tpl扩展名的,然后当一般纯文本处理,也没有什么不爽的,js和css基本上都是在单独的文件中,有相应的编辑器,手工写点html code也无妨。

不过还是推荐一个PHP Development Tools(PDT)中的for Smarty的插件smartypdt,主意虽好,但程序非常不成熟,在PHP Development Tools(PDT)的eclipse 3.3上基本上没法用,先关注一下,期待以后能成熟起来吧。

最后,总体感觉Eclipse虽然速度依然不快,尤其是启动速度,尤其是我调用远程主机上的项目文件,但其强大的功能足以掩盖这些缺点,还是那句话,谁用谁知道~~这几乎是我用过的可操作性最强的Java软件了。

参考

Update @ 2008-05-03

eclipse的配置都保存在workspace目录下,比如设置了php的文件模板,就保存在$workspace/.metadata/.plugins/org.eclipse.core.runtime/.settings/目录下的org.eclipse.php.ui.prefs文件中。

快捷键的设置保存在org.eclipse.ui.workbench.prefs中。

隐藏得好深,找了半天。

Update @ 2008-05-04

字体方面,建议选择英文等宽字体Bitstream Vera Sans Mono或者DejaVu Sans Mono,这样英文配合中文的显示效果比较好,粗体效果也不错,不影响代码的对齐,看着更舒服。

Update @ 2008-05-24

PDT拷贝到另外一台旧机器上,能运行,但PHP相关的内容死活就是不出来,鼓捣了将近4个小时,终于发现,这玩意儿需要jre 1.5以上,安装java 1.6以后,一切正常。唉,望各位引以为戒哪。

就是这篇文章提醒了我:eclipse 最新安装 配置