zsh 環境で Android OS をビルドする際に envsetup.sh を使う

Android OS をビルドする際にとても便利な機能を提供してくれる envsetup.sh なのですが、zsh 環境では以下のようなエラーになってしまいます。

% source build/envsetup.sh
build/envsetup.sh:1: no matches found: vendor/*/vendorsetup.sh

これを回避するには次のように "unsetopt NOMATCH" を設定します。

% unsetopt NOMATCH

これで mm や croot などの便利コマンドが使えるようになります。

% source build/envsetup.sh
including device/htc/passion/vendorsetup.sh
including device/samsung/crespo/vendorsetup.sh
% help
Invoke ". build/envsetup.sh" from your shell to add the following functions to 
your environment:
- croot:   Changes directory to the top of the tree.
- m:       Makes from the top of the tree.
- mm:      Builds all of the modules in the current directory.
- mmm:     Builds all of the modules in the supplied directories.
- cgrep:   Greps on all local C/C++ files.
- jgrep:   Greps on all local Java files.
- resgrep: Greps on all local res/*.xml files.
- godir:   Go to the directory containing a file.

Look at the source to view more functions. The complete list is:
 add_lunch_combo cgrep check_product check_variant choosecombo chooseproduct
 choosetype choosevariant cproj croot findmakefile gdbclient get_abs_build_var
 get_build_var getbugreports getprebuilt gettop godir help isviewserverstarted
 jgrep lunch m mm mmm pid print_lunch_menu printconfig resgrep runhat runtest
 set_java_home set_sequence_number set_stuff_for_environment setpaths settitle
 smoketest startviewserver stopviewserver systemstack tapas tracedmdump

プログラミング時に最適なフォント「Inconsolata」

最近、プログラミング時に使うフォントを Inconsolata に切り替えました。自分は、これに日本語フォントとして Takaoゴシック を組み合わせているのですが、この2つが相性抜群でとても見やすいです。"Top 10 Programming Fonts"という記事(日本語訳)の中でも見事に第1位として紹介されています。

どちらのフォントもフリーで使えて、Ubuntu なら標準でパッケージがあるので簡単にインストールできます。

% aptitude install ttf-inconsolata ttf-takao

Ubuntu 以外の OS の場合は、こちらからフォントを直接ダウンロードできます。
(なぜかGoogle font directoryにはTTFファイルがある)

自分は X 上の Emacs 23 でコードを書いていることが多いのですが、実際の見た目はこんな感じです。

設定例:

(set-default-font "Inconsolata-11")
(set-face-font 'variable-pitch "Inconsolata-11")
(set-fontset-font (frame-parameter nil 'font)
                  'japanese-jisx0208
                  '("Takaoゴシック" . "unicode-bmp")
)

ロングマン現代英英辞典[5訂版]をEPWINGに変換する

ロングマン現代英英辞典 [5訂版] DVD-ROM付

今まで英和/和英辞典として『英辞郎』を便利に使っていたのですが、そろそろ英辞郎は卒業して英英辞典を使いたいと思うようになりました。そこで、ちょっと奮発して『ロングマン 現代英英辞典【5訂版】』を購入しました。本当は付属のDVDだけが欲しかったのですが、紙の辞書付きのパッケージしかないみたいなので仕方がありません。付属のDVDには専用の辞書検索ソフトが含まれていて、これをインストールして使うのが普通の使い方だと思われます。しかし、他の辞書と串刺し検索したり、Androidでも使いたかったのでEPWING化することにしました。

作業に当たっては、以下のサイトで配布されているスクリプトを利用させてもらいました。

≫ LDOCE5 DVDをEPWING化する

1. 前準備

環境の準備が簡単なUbuntu 10.04上で作業します。まず、必要なパッケージをインストールします。

  • FreePWING
  • Image::Magick
  • XML::DOM
% aptitude install freepwing perlmagick libxml-dom-perl
2. 変換スクリプトのダウンロード
% curl -O http://www.geocities.co.jp/tak492/ldoce5-fpw-20100111.tar.gz
% tar zxvf ldoce5-fpw-20100111.tar.gz
% cd ldoce5-fpw-20100111

※各スクリプトの改行コードがCRLFになっているので、LFに変換しました。

3. Configの編集

ldoce5-fpw.confを自分の環境に合わせて編集します。変更したのは次の2行だけ。それぞれ、辞書データが格納されているディレクトリ(DVDを直接参照してもOK)と外字作成用フォントへのパスを指定します。

$ldoce5dir = "/tmp/ldoce5.data/";
$font = '/tmp/arialuni.ttf';
4. make

変換スクリプトを実行します。

% fpwmake package

ちょっと時間がかかりますが、ldoce5-fpw.zip というファイルができれば完了です。
この辞書データを展開してSDカードにコピーすれば、Android の辞書ソフト DroidWing から使えるようになります。

DroidWing で検索した例:

 

ML115のCPUをAthlon X2 5050eに換装

5050e

ML115G1のCPUを Athlon X2 5050e に換装しました。ML115G1はSocket AM2までの対応で、Socket AM2+は使えません。その中で、TDP 45Wの低消費電力版で最高クロック(といっても2600MHz)なのが、この5050eです。先日、秋葉原に行ったときに見たら既にどこも販売終了だったので、そろそろアップデートするのは最後のチャンスだと思って購入しました。ちなみにPCワンズの通販で5,850円でした。

換装自体は、長めのマイナスドライバを使ってCPUクーラーを外すのが面倒だった以外は特に問題なく完了(トルクスドライバがあると楽らしい)。実は、BIOSでCPUモデルを認識してくれないのですが、CentOS 5.4(Kernel 2.6.18)でCool'n'Quietの動作もOKでした。低負荷時には、ちゃんと1000MHzにクロックダウンしてくれます。IPMIで調べてみても、通常時の温度はこんな感じで安定しています。

RCPU Diode 1     | 27 degrees C      | ok
Ambient          | 26 degrees C      | ok
Local VRD0 Temp  | 32 degrees C      | ok

最近は、自宅サーバの出番も少なくなってきましたが、音楽・写真用ファイルサーバ、TV録画/エンコード、LAN用のDNSキャッシュサーバとしてまだまだ活躍してもらおうと思います。Google Public DNSでWeb閲覧が速くなったとか言ってる人が多いですが、ローカルのDNSキャッシュが最強なのは言うまでもありません :-P

Ubuntu 9.04 Jaunty Jackalope と NVIDIA ドライバ

Merry Christmas!

メインで使っているデスクトップPCを Ubuntu 9.04 (Jaunty Jackalope) にアップグレードしました。Jackalope は、来年4月にリリースが予定されている Ubuntu の次期安定バージョンです。アップグレード自体は、"update-manager -d"するだけなので超簡単なんですが、X server が1.6というアグレッシブなバージョンなので、NVIDIAのプロプライエタリなドライバが動きません(そうドキュメントに書いてあった)。なので、オープンソース版の nv やら nouveau というドライバをインストールしてしばらく使っていたのですが、Compositeの機能が使えなかったりしてとても残念な感じでした。そこで、ダメ元でNVIDIAのβ版ドライバを入れてみたら動作したので、ここに記録を残しておきます。

NVIDIAのFTPサーバ (32bit)からドライバ(現時点で最新は180.18)をダウンロードします。pkg0,pkg1,pkg2とあるのはコンパイル済みのモジュールが含まれているかどうかなのでpkg0でおk。

% sudo /bin/bash NVIDIA-Linux-x86_64-180.18-pkg0.run

ここで、dash とか zsh だとエラーになる場合があるので、bash で実行します。インストールが完了したら再起動するのですが、残念ながらそのままでは次のようなエラーが表示されて起動しません。

(EE) NVIDIA(0): This video driver ABI is not supported.
(EE) NVIDIA(0): Use the -ignoreABI option to override this check.

素直に指示に従って X 起動時のオプションに -ignoreABI オプションを付け加えます。私の場合は、gdm経由でログインしているので、 /etc/gdm/gdm.conf を書き換えます(太字の部分を追加)。

[server-Standard]
name=Standard server
command=/usr/X11R6/bin/X -br -audit 0 -ignoreABI
flexible=true

この Ubuntu 9.04 なんですが、動作が軽快でかなり気に入っています。 Ubuntu Community にシャトルワース氏が投稿したメールにもあるように、起動/レジューム時間の短縮が目標に掲げられているようです。

There are some specific goals that we need to meet in Jaunty. One of them is boot time. We want Ubuntu to boot as fast as possible - both in the standard case, and especially when it is being tailored to a specific device. The Jackalope is known for being so fast that it's extremely hard to catch, and breeds only when lightning flashes. Let's see if we can make booting or resuming Ubuntu blindingly quick.
Introducing the Jaunty Jackalope by Mark Shuttleworth

また、まだ実装はされていないようですが、Growlっぽい機能も標準で付くようで今から非常に楽しみです。


(追記)
Ubuntu に愛ちゃん愛ちゃんは付いてきません。(正式に公開されたようでリンクを変更)

WaterMark System Information

最近はだいぶ暑くなってきて、PCの温度が気になるようになりました。そんな人には、 WaterMark System Information がお勧めです。CPU負荷の他に、メモリ使用量、CPU温度、ファン回転数、HDD温度などをまとめて監視できます。

IIIMECF + ATOK X3 を Emacs の日本語入力に使う

僕は、emacs-snapshot-gtk をメインのエディタとして使っています。そのままでも日本語入力はできるのですが、入力時のフォントがどうしても気に入らないので、 Emacs では IIIMECF を使って、IIIMサーバと直接通信するようにしています。

インストール方法

IIIMECF-0.75.tar.gz (2007/1/10)
$ tar zxvf IIIMECF-0.75.tar.gz
$ cd iiimecf
$ emacs -q --no-site-file -batch -l iiimcf-comp.el
# mkdir /usr/share/emacs/site-lisp/IIIMECF
# cp lisp/* /usr/share/emacs/site-lisp/IIIMECF

.emacs の設定

UNIXソケットのデフォルトは、 /tmp/.iiim-username/:1.0 のようですが、自分の場合は :0.0 だったので次のように設定しています。これで Shift+space で IIIMECF 経由で ATOK が利用可能です。

;; iiimecf
(setq iiimcf-server-control-hostlist (list
          (concat "/tmp/.iiim-" (user-login-name) "/:0.0")))
(setq iiimcf-server-control-default-language "ja")
(setq iiimcf-server-control-default-input-method "atokx3")
(setq default-input-method 'iiim-server-control)
(require 'iiimcf-sc)
(global-set-key [?\S-\ ] 'toggle-input-method)

GNOMEランチャの設定

emacs 起動時の環境変数に XMODIFIERS="@im=none" を渡すようにします。GNOMEのランチャから起動する場合は、次のように設定すればOKです。

env XMODIFIERS="@im=none" emacs-snapshot-gtk

LinuxサーバでWebページのサムネイル画像生成(Python編)

SimpleAPIはてなスクリーンショット はWindowsのIEベースみたいですけど、どうせならLinuxサーバでやってみましょう。


Xの仮想フレームバッファとgtkmozembedのライブラリを使うので、次のパッケージが必要です。あらかじめyum等でインストールしてください(Fedora Core 5を想定しています)。

  • xorg-x11-server-Xvfb
  • gnome-python2-gtkmozembed
  • mozilla

使い方

$ export DISPLAY="localhost:1.0"
$ Xvfb :1 -screen 0 1024x768x24 & (フォント関連のエラーが出ても気にしない)
$ export LD_LIBRARY_PATH=/usr/lib/mozilla-1.7.13:$LD_LIBRARY_PATH
$ python screenshot-tng.py http://www.yahoo.co.jp/

A potted account of Ross' life をFedora Core 5で動くようにしただけなんですが、以下にソースコードを載せておきます。デーモンとして動くようにちょっといじれば、サムネイル画像生成サーバも簡単にできますね。

#!/usr/bin/python
# This file is released into the public domain.
# Originally Written by Andrew McCall - <andrew@textux.com>
# modified by Matt Biddulph - <matt@hackdiary.com> - to take screenshots
# modified by Hidetaka Yamashita - <hidetaka at gmail.com> - migrate to FC5

import os
import sys
import gtk
import gtk.gdk as gdk
import gtkmozembed

class PyGtkMozExample:
    def __init__(self, URL = None, parent = None):
        if parent == None:
            self.parent = gtk.Window(gtk.WINDOW_TOPLEVEL)
            self.parent.set_border_width(10)
        else:
            self.parent = parent

        # Initialize the widgets...
        self.widget = gtkmozembed.MozEmbed()
        self.widget.set_size_request(816,600)

        # Connect signals
        self.widget.connect("net_stop", self.on_net_stop)
        self.widget.connect("progress", self.on_progress)

        self.parent.add(self.widget)

        if URL != None:
            self.widget.load_url(URL)

        self.parent.show_all()
        self.countdown = 3

    def on_progress(self, data, cur, max):
        print cur,"bytes loaded"
    def on_net_stop(self, data = None):
        gtk.timeout_add(1000,self.do_countdown,self)
        print "Taking screenshot in 3...",
        sys.stdout.flush()

    def do_countdown(self, data = None):
        self.countdown -= 1
        if(self.countdown > 0):
            print str(self.countdown)+"...",
            sys.stdout.flush()
            gtk.timeout_add(1000,self.do_countdown,self)
            return True
        else:
            print
            self.screenshot()

    def screenshot(self, data = None):
        window = self.widget.window
        (x,y,width,height,depth) = window.get_geometry()

        width -= 16

        pixbuf = gtk.gdk.Pixbuf(gtk.gdk.COLORSPACE_RGB,False,8,width,height)
        pixbuf.get_from_drawable(window,self.widget.get_colormap(),0,0,0,0,width,height)
        pixbuf = pixbuf.scale_simple(266, 200, gdk.INTERP_HYPER)
        pixbuf.save("screenshot-thumb.png","png")
        print "Wrote screenshot-thumb.png"
        gtk.main_quit()
        return True

def __windowExit(widget, data=None):
    gtk.main_quit()

if __name__ == "__main__":
    try:
        HomeDir = os.environ["HOME"]
    except KeyError:
        raise "No Home Directory, Don't Know What to Do"

    ProfileDir = HomeDir + "/.gtkmozembedexample/"
    print "Note: a mozilla profile has been created in : " + ProfileDir

    gtkmozembed.gtk_moz_embed_set_profile_path(ProfileDir, "helpsys")

    window = PyGtkMozExample(URL=sys.argv[1])
    window.parent.connect("destroy", __windowExit)
    gtk.main()

MecabのPythonバインディングを使ってみる

例によって、FedoraとCentOS用のPRMパッケージを作りました。利用するには、先に Mecabをインストール しておく必要があります。


インストールしたら、さっそく試してみましょう。次のようなサンプルプログラムを書きます。

#!/usr/bin/env python
# -*- coding: utf-8 -*-
import sys
import MeCab

sentence = "太郎はこの本を二郎を見た女性に渡した。"

try:
    t = MeCab.Tagger()
    m = t.parseToNode(sentence)
    while m:
        if m.stat < 2:
            print m.surface, "\t", m.wcost, "\t", m.feature
        m = m.next
except RuntimeError, e:
    print "RuntimeError:", e;

実行すると、下記のような結果が出力されます。

太郎    7473    名詞,固有名詞,人名,名,*,*,太郎,タロウ,タロー
は      2919    助詞,係助詞,*,*,*,*,は,ハ,ワ
この    1017    連体詞,*,*,*,*,*,この,コノ,コノ
本      5040    名詞,一般,*,*,*,*,本,ホン,ホン
を      2670    助詞,格助詞,一般,*,*,*,を,ヲ,ヲ
二郎    5667    名詞,固有名詞,一般,*,*,*,二郎,ニロウ,ニロー
を      2670    助詞,格助詞,一般,*,*,*,を,ヲ,ヲ
見      6208    動詞,自立,*,*,一段,連用形,見る,ミ,ミ
た      3939    助動詞,*,*,*,特殊・タ,基本形,た,タ,タ
女性    2278    名詞,一般,*,*,*,*,女性,ジョセイ,ジョセイ
に      3622    助詞,格助詞,一般,*,*,*,に,ニ,ニ
渡し    5101    動詞,自立,*,*,五段・サ行,連用形,渡す,ワタシ,ワタシ
た      3939    助動詞,*,*,*,特殊・タ,基本形,た,タ,タ
。      -12     記号,句点,*,*,*,*,。,。,。
ふむふむ、この結果から名詞だけを取り出して、単語生起コストをごにょごにょすればよいわけですね。
"二郎"が"ニロー"になってるけど、固有名詞だからしょうがないのかな…

Mecab 0.91のFedora用とCentOS用RPMを作った

Mecab 0.91がリリースされたようなのでRPMパッケージを作りました。辞書の文字コードは、UTF-8にしてあります。

[Fedora Core5用]

[CentOS4.3用]


使い方は、mecabコマンドを実行すると入力モードになるので、「すもももももももものうち」とか解析したい文章を入力すると 、わかち書きをして品詞の種類などを教えてくれます。

$ mecab
すもももももももものうち
すもも  名詞,一般,*,*,*,*,すもも,スモモ,スモモ
も      助詞,係助詞,*,*,*,*,も,モ,モ
もも    名詞,一般,*,*,*,*,もも,モモ,モモ
も      助詞,係助詞,*,*,*,*,も,モ,モ
もも    名詞,一般,*,*,*,*,もも,モモ,モモ
の      助詞,連体化,*,*,*,*,の,ノ,ノ
うち    名詞,非自立,副詞可能,*,*,*,うち,ウチ,ウチ
EOS