最好的简谱编辑排版软件JP-Word

本文是一则硬广告。

上大学时跟同学一起办过一份音乐小报,名为《白桦林》,虽然只办了一期就夭折了,不过在这期小报上试图排版朴树那首《白桦林》的简谱(附带吉他和弦)的经历让人难以忘怀。我那时坚信自己用Word排版复杂版面的水平已经到了出神入化的程度,但还是被这个简谱排版工作打败了。Word虽然是“所见即所得”,但是那排版好的谱子打印出来时,总是会有那么些对不齐或者走样。那时学校打印店打印一页A4纸的价格是1.5元,不舍得反复打印试验,最终还是通过剪刀胶水才把这个排版任务搞定的。

《白桦林》小报第三版。

《白桦林》小报第三版。由于Word版本和字体的原因,现在看到的跟当年排出来的效果有差别。

上大学时,经常玩一个叫HappyEO的电脑键盘模拟电子琴的软件——强势插入,再打个广告,HappyEO是用电脑键盘(也可以接MIDI键盘)模拟电子琴的最好的软件,没有之一。因为对这个软件的喜爱,我跟HappyEO的作者有着较多的交流,一路见证着HappyEO电子琴和后来的iDreamPiano模拟钢琴等软件的诞生。2003年时,他告诉我他做了一个简谱排版软件,叫JP-Word

实话说,1.0的JP-Word一点也不诱人,粗糙的界面、鸡肋的图片输出和打印功能、封闭专有的文件格式实在不能让我提起太大的兴趣。加上对于我来说,平时几乎没有简谱排版的需求,所以对这个软件并没有太高的热情。接下来两三年时间,JP-Word慢慢升级到了3.0,功能丰富了一些,但没有什么本质的变化。

一下过了十年,JP-Word的作者突然告诉我,JP-Word出了4.0的新版本。这个脱胎换骨的新版本,着实可以用“惊艳”来形容。

JP-Word 4.0界面预览

JP-Word 4.0界面预览

不像五线谱打谱有自由的Lilypond,还有Overture、Encore等强大的商业软件。市面上简谱音乐软件并不多,优秀打谱软件更是少之又少。之所以我敢在文章标题上把JP-Word说成是“最好的”,个人认为主要有以下几点:

  • 独创的的“切换音符时值组合”功能。常见音符的时值组合不用一个个手工调整,音符输入后按几下空格键就自动组合好了。
  • 强大的歌词编辑功能。支持歌词自动对位,谱打完,歌词一打上去就自动对齐到它该去的地方。
  • 支持矢量PDF的输出。而且排版结果不管是布局还是字体,都非常美观,放到专业环境下用也毫无压力。
  • 开放的JPW-ABC格式。一改以前用专有格式的方式,新版本用了开放的纯文本来描述乐谱,为二次开发提供了便利。

JP-Word简谱编辑软件不是完全免费的,免费的版本只提供了部分主要的功能集,但折腾党可以通过手工写JPW-ABC的方式实现几乎全部收费版本的功能。

缺点也是有的,比如目前不支持直接播放乐谱和MIDI导出。不过Thanks to开放的JPW-ABC格式,完全可以写个简单的脚本,把JPW-ABC文件转换为MIDI文件。我正在尝试写个简单Python脚本,把JPW-ABC转换为Lilypond格式,然后借助Lilypond,可以直接生成对应的五线谱和MIDI文件。有兴趣可以关注我的Github项目jpw2lilypond,不过目前上面还只有一个很垃圾的Prototype(对象建模建错了,虽然基本功能在,但已经没办法往下写了),而且现在每天的时间都不够用,开发进度一定不会很快。

JP-Word 4.0的功能介绍与使用说明:http://www.happyeo.com/intro_jpw.htm

下载JP-Word 4.0免费版的地址:http://www.happyeo.com/downloads_jpw.htm

注册JP-Word的方法:http://www.happyeo.com/register_jpw4.htm

如何禁用Gmail和Hotmail的垃圾邮件过滤

为什么要禁用邮箱的反垃圾邮件功能?如果你只用一个邮箱,那就大可不必,定期检查垃圾邮件夹就可以了。但如果你跟我一样,是通过自动转发或POP3代收方式,把所有的邮箱邮件都转到一个特定邮箱来集中处理时,在那些转发或代收邮箱上禁用垃圾邮件过滤功能就显得非常重要。不然,一旦一封正常的邮件在这些邮箱上被误判为垃圾邮件的话,你很少有机会再去发现它。还不如把所有邮件都转到最终日常处理的邮箱里,在那里统一做垃圾过滤。

Gmail和Hotmail都没有直接提供禁用反垃圾邮件的功能,不过可以通过建立过滤器规则来保证邮件不会被放入垃圾邮件箱。

Gmail:点搜索框右侧的下拉箭头,在”不包含(Doesn’t have)“中输入一个正常邮件中不太可能出现的字串,比如“ABCDEFGHIJKabcdefghijk12345678”,然后点“根据此搜索条件创建过滤器(Create filter with this search)”,勾选“不要将其发送至‘垃圾邮件’(Never send it to Spam)”,再“创建过滤器(Create Filter)”。

Hotmail:“选项(Options)”->“更多选项(More Options)”->“新邮件排序规则(Rules for Sorting New Messages)”->“新建(New)”,“发件人地址(Sender’s address)”“包含(contains)”“@”,“转移至收件箱(Move to Inbox)”,“保存(Save)”。

体验WPS for Linux

昨天得知WPS for Linux开始发放测试邀请,马上去申请了一下,今天拿到了邀请码,回到家速度展开测试。

这次放出的WPS for Linux实际上只包含了Kingsoft Presentation这一个组件,以DEB包的方式发布,122M大,不算小。

安装:

我所使用的系统是Debian, i686架构,使用GNOME桌面, WPS for Linux的安装包在我的环境中缺少ttf-mscorefonts-installer这个依赖,这个不难解决,apt-get一下就行。之所以要依赖这些Windows下字体,我想可能是为了在不同的平台下提供一个比较一致的体验吧。

解决依赖问题后,用dpkg -i直接安装WPS for Linux,报了一堆错:

/usr/bin/xdg-mime: 769: cannot create /root/.local/share/applications/defaults.list.new: Directory nonexistent
grep: /root/.local/share/applications/defaults.list.new: No such file or directory

不知道为什么安装程序非要不依不饶往/root/.local中去注册MIME类型,写/usr/local/share中不好么?反正都给了root权限了。不管怎么说,帮它创建好一个/root/.local/share/applications目录,然后重新安装,安装成功。

运行:

安装后,在菜单中Office项中,会出现Kingsoft Presentation项,点了点,没有反应。出现这种现象常常是因为库的问题,所以去命令行运行wpp:

/opt/kingsoft/wps-office/office6/wpp: /usr/lib/libstdc++.so.6: version `GLIBCXX_3.4.14' not found (required by /opt/kingsoft/wps-office/office6/libkso10.so.1)

好吧,libstdc++库的问题,我的Debian Squeeze中带的版本太低了。在Debian网站上找一个sid中的版本,直接装是不敢啦,怕把系统搞挂了(实际上也装不上,因为别的依赖的问题),所以用dpkg-deb -x把它解开,然后用加上LD_LIBRARY_PATH的方式运行,WPS for Linux的Presentation界面终于出现在我的眼前了。

WPS for Linux Presentation主界面

WPS for Linux Presentation主界面

体验:

WPS Presentation提供了两种风格的界面,包括类似于Office 2003的经典界面和类似于Office 2007+的Ribbon界面。可以通过“切换界面”按钮或菜单项完成切换。

WPS Presentation支持的文件格式不多,只有它自己的.dps格式和Office的.ppt/.pptx格式。.odp格式没有被支持这点不是很美好,也很出乎我的意料。它也没有提供导出.pdf的功能,也不是很美好。

作为WPS一贯的作风,它对Office文件的兼容性还是相当不错的,打开.ppt文件展现出来效果跟Windows下比并没有严重的走样。

保存文件的功能在我的环境中有严重的问题,会直接导致程序core掉,不知道跟我简单偷换libstdc++.so有没有关系。跟locale有关,用dpkg-reconfigure locales加上zh_CN.UTF-8的locale后,问题就消失了。原本我机器上只有en_US.UTF-8的locale。

WPS Presentation在首页上提供了从金山网站在线下载幻灯片模版的功能,很好用,有些模版也比较好看。相对而言,Office提供的这样的功能我就从来都没用过。

从使用感觉上来说,跟被我淘汰了有一阵子了的OpenOffice.org和正在使用的LibreOffice相比,WPS给我留下的最直接的印象是:快。整个软件在我的机器上表现非常流畅,用起来很舒服,这点很让我满意。

WPS没有提供英文拼写检查的功能,不过作为一个面向国人的软件来说,不算是太大的问题。

软件的稳定性似乎还存在一定的问题,在试用过程中,发生过若干次莫名其妙的crash,但暂时还没有找到稳定重现的方法。

体验完了WPS Presentation,期待WPS的Word Processing System早日登场。

PS. 突然有点怀念下面的这个界面:

UCDOS下的WPS启动界面

UCDOS下的WPS启动界面

还有多少人记得Ctrl + q i u b o j u n是用来做什么的?

 

GNU.org的本地化框架

前几天Junwen同学翻译了Android设计指南的网页,由于他用的SourceForge的Web空间访问限额有限,我在自己的服务器上给他做了一个镜象站点。于是就想到了多镜象站点同步以及本地化语言版本与上游英文版网页之间的同步问题,正好我是GNU.org中文翻译组的一员,在这里跟大家简单分享一下GNU网站的本地化框架,也算是补交了去年在NJLUG活动中曾经承诺过的一份作业。

以前,GNU网站的本地化是由各本地化翻译小组手工完成维护的,翻译组协调人确定要翻译的页面,翻译组成员自己从GNU网站或CVS上下载html网页,直接在网页上进行翻译,然后把html网页提交到翻译组的CVS中,经过审阅后,由具有GNU网站提交权限的人直接把html文件提交到GNU网站上。

这种简单的做法带来的问题主要有两个:

  • 本地化版本的维护问题。由于全部是手工操作,很容易出现本地化版本与英文原始版本之间不同步的问题,而且这样的不同步很难被发现和跟踪。
  • 网站改版的问题。当英文版网站进行大规模网页页面结构化调整时,即使页面上文字内容没有变,所有的翻译版本都需要全部手工进行更新。

大约是2008年开始,GNU开发了GNUnited Nation,简称GNUN,作为GNU网站本地化框架。GNUN实质上是一些脚本、DTD和Makefile,通过这些脚本,对GNU的网页自动进行各种必要的字符串提取、替换和合法性验证。

GNUN的实现基于在自由软件本地化中广为使用的gettext,GNUN从原始的英文HTML网页中提取需要翻译的字符串,生成gettext的.pot文件,各语言翻译组基于.pot文件翻译形成对应各自的语言的.po文件,最后GNUN系统再依据这些po文件生成相应语言版本的本地化网页。

     .---<--- * Original ARTICLE.html
     |
     |   .---> ARTICLE.pot ---> * ARTICLE.LANG.po --->---.
     `---+                                               |
         `--->---.   .------<----------------------------'
                 |   |
                 |   `---.
                 |       +---> Translated ARTICLE.LANG.html
                 `-------'

这是GNUN的工作流程图,其中需要人工干预的只有图中打星号的两个步骤,其它都可以自动化完成。

  • 编写原始ARTICLE.html:由GNU的Web维护小组完成。
  • 翻译ARTICLE.LANG.po文件:由GNU各语言翻译组完成。

对于翻译组,GNUN框架中也提供了很轻量级的脚本用于从合并更新.po文件和自动检查.po文件的翻译进度,用起来很方便。

其实,从现在的眼光看,用gettext做网页的本地化也并不是什么新鲜的事儿,比如大家现在在用的WordPress就是这样处理的。不过,你有没有注意到GNUN跟WordPress中gettext的用法的不同呢?

在WordPress(或其它大部分用gettext的软件项目)中,要翻译的字符串资源常常会用类似于_(“”)这样的形式来标记,这样xgettext工具才能从中正确的提取出需要的翻译的资源,当然也是为了程序编译后运行起来时真正能把字符串完成翻译。而GNU的那些静态HTML网页上并没有也不方便用这样的标记去标记所有的字符串,GNUN实际上是一个特别针对GNU网站做的框架,它直接通过一些预定义的固定规则去处理GNU网页上的内容,在已知网页内容架构的情况下,跟据HTML页面中各标签本身的语意,去提取字符串内容。.po文件翻译好后,也是由固定的脚本直接把字符串替换回原始的网页,从而实现页面翻译。所以,暂时GNUN其实并不能成为一个通用的网站本地化框架,目前它只能用在GNU的网站上。但是这样的一套处理思路,也许在有些特定的情况下还是值得借鉴的。

用GNU screen管理多台Linux主机

需要在Windows下管理一小堆Linux机器,开一堆PuTTY窗口的方式显然是会让人无法忍受的,怎么办?

否决,能不用商业软件就不用商业软件,尤其是在没有人愿意为License买单时。虽然xshell个人和教育使用是免费的,功能也足够强大,但我花了N个小时改它和Emacs的配置,还是没有办法在它的终端下完美的使用Emacs,Emacs有那么多变态的快捷键,怎么配总有那么几个快捷键不能正常工作。虽然知道配不好是我自己的错,但能力精力有限,放弃。

  • 用第三方PuTTY的外挂或窗口管理器

你真的确信有一个很美好的PuTTY多窗口管理器么?我把PuTTY官网上相关话题中给出的链接中的第三方程序都试了一遍,真没有靠谱的。

想来想去,最终还是决定采用开一个PuTTY窗口,先连上一台Linux主机,然后在上面启动GNU screen再连接到多台主机。

以前对screen的认识,是用来在下载机上运行rtorrent,所以screen的第一个用处是把程序放到后台去运行,不受SSH连接断开的限制,随时连上去都可以恢复到断开连接时的状态,这对于维持一个稳定持久的工作环境很有用。

要让screen可以做为一个多连接管理器,还需要花点精力,这可以通过配置~/.screenrc来实现。

  • 让我知道我正在screen环境下工作,并知道我开了哪些连接

hardstatus alwayslastline "%{=b}%{G} Screen(s): %{b}%w %=%{kG}%C%A %D, %M/%d/%Y "

显示状态栏,并列出当前打开的窗口(创建的连接)

  • 把screen的默认快捷键由Ctrl-A换成Ctrl-Z

escape ^Zz

在我的Emacs配置中最用不到一个快捷键是Ctrl-Z,所以把screen的快捷键前缀由非常常用的Ctrl-A换成Ctrl-Z,真的需要Ctrl-Z时,只要按Ctrl-Z z就可以了。

  • 启动时就打开多个窗口并连接到各远程主机上,并为每个连接所在窗口起个名字

screen ssh user@host1
title host1
screen ssh user@host2
title host2

这样启动screen时就会分别连上host1和host2,把设置好对应的窗口名字,在状态栏上可见。

  • 远程连接关闭(或意外断开)时,不要关闭窗口

zombie "^["
默认情况下,一个连接断开后,screen会关闭这个连接所在的窗口,如果要再连就得重新打开新窗口手工创建连接。用了zombie配置后,某个远程连接断开后对应的窗口仍会保留,切换到对应窗口后可以按Ctrl-[手工关闭窗口,也以Ctrl-@重新激活窗口(连接到远程主机)。

  • screen启动完成后默认切换回第1个窗口

select 0
完成这一堆配置后,用起来就已经很得心应手了。按Ctrl-Z 0到Ctrl-Z 9可以在各窗口间切换,按Ctrl-Z Ctrl-Z可以在最近两个窗口间跳转。Ctrl-Z d把screen环境放到后台,返回shell。Ctrl-Z c新建一个本地shell窗口。如果需要在多个连接间复制文本,可以用Ctrl-Z <ESC>进入复制/滚屏模式,用回车键设定复制范围,然后用C-z ]贴粘到目标位置。

完成一切设置后,就可以在PuTTY连上终端后执行screen -d -R来创建或连接到screen环境了,用完了可以随手把PuTTY窗口关掉,再连上去时就恢复到上次工作的状态,非常方便。

在我完成了screen的学习和配置后,有人为我推荐了另一个终端复用程序tmux,它比screen的功能更为强大,鉴于screen已经满足了我的需求的前提下,我没有再去折腾tmux,如果你是第一次尝试使用终端复用程序,也不妨试一下tmux。