@koshian's Tech Log

主に日本語に関する技術などこちらに書こうかと

Google日本語入力と通信する mozc_emacs_helper を Mac OS X でビルドする

以前に mozc.el を Mac OS X 上の Emacs で使う方法 という記事を書いて、これの通りに仮想マシンDebian に mozc サーバを立てて Mac 側の mozc.el から使ってたのだが、ユーザー辞書が共有できないのが不便だった。で、どうも mozc_emacs_helper を Google 日本語入力と通信させるようにビルドできるらしいというのを知ってためしてみることに。

hiroohongo.sblo.jp

上記サイトは Windows での mozc_emacs_helper の Google 日本語入力対応ビルドの方法が書いてある。どうやら --branding=GoogleJapaneseInput とオプションつけてやればよさそう。だが、これだと普通にビルドが通らない。いろいろ試した結果、以下のようなパッチをあてることに。

mozc_emacs_helper_build.patch

んでパッチを当てたら mozc_emacs_helper だけビルドする。mozc をまるごとビルドすると GoogleBreakpad.Framework をビルドしようとしてうまく通らない……。

手順としては以下のとおり。

$ git clone https://github.com/google/mozc.git -b master --single-branch --recursive
$ cd mozc
$ curl https://gist.githubusercontent.com/koshian/044eaf7a03027ed37a83/raw/90161d80944351160888adbfcb78247e4919f141/mozc_emacs_helper_build.patch | patch -p1
$ cd src
$ GYP_DEFINES="mac_sdk=10.11 mac_deployment_target=10.11" python build_mozc.py gyp --noqt --branding=GoogleJapaneseInput
$ python build_mozc.py build -c Release unix/emacs/emacs.gyp:mozc_emacs_helper

これでビルドできた。動作確認は上記サイトにあるように、

$ echo -e '(0 CreateSession)\n(1 SendKey 1 hiragana)\n(2 SendKey 1 hiragana)\n(3 SendKey 1 97)' | out_mac/Release/mozc_emacs_helper 

としてエラーが出てなければ OK。/usr/local/bin に cp してそのまま使用している。 今のところ順調に動作しており、Google 日本語入力で登録した単語もそのまま出ている。これはたいへん便利。また Emacs + mozc.el のためだけに仮想マシンGNU/Linux を走らせておく必要がなくなるのでたいへん気が楽である。

こころなしか反応も良くなった気がするなあ。というわけで MacUNIX として使ってる人たちにはこんな選択もあるよということで。

enjoy!

Redmine on Debian 8.3(jessie) でプロジェクトの設定画面が開かない問題を解決する

Debian パッケージで入れた Redmine に作ったプロジェクトが公開になってたので、チケットを登録する前に非公開にしようと設定画面をひらいたら Internal server error が出た。/var/log/redmine/default/production.log を見ると、

ActionView::Template::Error (The single-table inheritance mechanism failed to lo
cate the subclass: 'GroupNonMember'. This error is raised because the column 'ty
pe' is reserved for storing the class in case of inheritance. Please rename this
 column if you didn't intend it to be used for storing the inheritance class or 
overwrite Principal.inheritance_column to use another column for that informatio
n.):

なんて出ている。へー、Rails は type っていう名前のカラムを作ると単一テーブル継承(STI)なんてのが使えるのか。

dev.classmethod.jp

なるほど、こうやって振る舞いを変えたりとかできるのね。

で、まあなんでこんなエラーが出てるかというとすでに Debian には BTS されていて、

#789777 - redmine: The single-table inheritance mechanism failed to locate the subclass: 'GroupNonMember' - Debian Bug report logs

要するに Debian に移植するときに DB 側はそのままに STI のモデルは追加されなかったということみたい。まあ次のバージョンあたりで追加されるんだろうから、直接ファイルを拾ってきて追加してやればいいかな?

$ wget http://www.redmine.org/releases/redmine-3.0.7.tar.gz   
$ tar xzfv redmine-3.0.7.tar.gz
# cp redmine-3.0.7/app/models/group_builtin.rb /usr/share/redmine/app/models/
# cp redmine-3.0.7/app/models/group_anonymous.rb /usr/share/redmine/app/models   
# cp redmine-3.0.7/app/models/group_non_member.rb /usr/share/redmine/app/models      
# /etc/init.d/apache2 restart

としてこれでとりあえず動作したようだ。めでたし。

ちなみにQAサイトなど見ると、users テーブルから GroupNonMember タイプのユーザーを削除するみたいな対処をしてる人たちがけっこういるようだけれど、それ次のアップグレードでハマらないんですかね……?

さくらのレンタルサーバに ruby 2.3.0 を入れても nokogiri がインストールできない俺に向けてのメモ

さくらインターネットレンタルサーバは安価で非常に便利なのだが、 ruby が 1.8 と大変古い。新しい物をコンパイルして入れればいいのだが、最近は git がレンタルサーバに入ってるので、 rbenv と ruby-build のサイト通りにやれば比較的簡単にインストールできる。

github.com

github.com

上記サイト通りに、

$ git clone https://github.com/rbenv/rbenv.git ~/.rbenv
$ git clone https://github.com/rbenv/ruby-build.git ~/.rbenv/plugins/ruby-build
$ echo 'export PATH="$HOME/.rbenv/bin:$PATH"' >> ~/.bash_profile
$ echo 'eval "$(rbenv init -)"' >> ~/.bash_profile
$ . ~/.bash_profile

とやっておけばよろしい。

ただこれだけだと iconv が見つからないと言われて nokogiri のインストールで失敗する。他にも /tmp に書き込めないなどのトラブルがあるので、以下のような行を ~/.bash_profile に追加しておく。もちろん source しておくように。

CPATH=/usr/local/include:$CPATH; export CPATH
LD_LIBRARY_PATH=$HOME/local/lib:/usr/local/lib:$LD_LIBRARY_PATH
export LD_LIBRARY_PATH
LIBRARY_PATH=$HOME/local/lib:/usr/local/lib:$LIBRARY_PATH
export LIBRARY_PATH

TMPDIR=$HOME/tmp; export TMPDIR

これであとは、

$ rbenv install 2.3.0
$ ruby -v
ruby 2.3.0p0 (2015-12-25 revision 53290) [x86_64-freebsd9.1]
$ gem install bundler nokogiri

これで普通に ruby が使えるようになる。

ただ cron に登録するときは環境変数などの設定をぜんぜん読み込んでくれないのでちょっと工夫が必要になる。

#!/bin/sh
    PATH=$HOME/.rbenv/shims:/usr/local/bin:/usr/bin:/bin:$PATH; export PATH
    exec ruby -S -x $0 "$@"
#! ruby

ruby スクリプトの行頭をこんな感じで始めるのだ。shebang は sh にしておいて、適切に PATH を設定してやってから ruby を起動し、このスクリプト自身を ruby に読ませる。こうすることでさくらインターネット以外の普通に ruby が入ってる環境でも普通に実行できるようになる。

もちろん CGI も同様にしてやればちゃんと動作するのだが、CGI で呼び出された場合は環境変数 HOME がセットされてないので、

#!/bin/sh
    if [ -z $HOME ];then HOME=/home/koshian; export HOME; fi
    PATH=$HOME/.rbenv/shims:/usr/local/bin:/usr/bin:/bin:$PATH; export PATH
    exec ruby -S -x $0 "$@"
#! ruby

というようにしてレンタルサーバでの HOME を書いておいてやらねばならない。

サブセットWebFontを作成してwoff形式に変換し、ブログで利用するまでの記録。

表題のことをやろうと思ったのだがぱっと見つかるツールが動かなかったりなどして試行錯誤。 とりあえず Google で作られたと思しきツール群があって、これはどうやら動く様子。

まずはサブセットフォントを作らないといけない。使う文字だけね。

$ pip install FontTools
$ pyftsubset ~/Library/Fonts/KouzanMouhituFontOTF.otf --text='狐の王国'
$ cd ~/Library/Fonts
$ ls -lh KouzanMouhituFontOTF.otf*
-rwxr-xr-x@ 1 koshian  staff   5.8M Feb 27  2010 KouzanMouhituFontOTF.otf
-rw-r--r--+ 1 koshian  staff   2.6K Dec 31 06:00 KouzanMouhituFontOTF.otf.subset

4文字だけなのでえらい小さくなった。さらにこれを Web で使うために woff2 をインストールする。

github.com

Homebrew 用の formula を書いてくださってる方もいるようだ。

github.com

というわけで brew install woff2 すると woff2_compress が使えるようになる。

$ woff2_compress KouzanMouhituFontOTF.otf
Processing KouzanMouhituFontOTF.otf => KouzanMouhituFontOTF.woff2
$ woff2_compress KouzanMouhituFontOTF.otf.subset
Processing KouzanMouhituFontOTF.otf.subset => KouzanMouhituFontOTF.otf.woff2
$ ls -lh KouzanMouhituFontOTF.*
-rwxr-xr-x@ 1 koshian  staff   5.8M Feb 27  2010 KouzanMouhituFontOTF.otf
-rw-r--r--+ 1 koshian  staff   2.6K Dec 31 06:00 KouzanMouhituFontOTF.otf.subset
-rw-r--r--+ 1 koshian  staff   2.0K Dec 31 06:52 KouzanMouhituFontOTF.otf.woff2
-rw-r--r--+ 1 koshian  staff   3.7M Dec 31 06:52 KouzanMouhituFontOTF.woff2

フォントの置き場所は Google Drive を使うことにした。はてなブログでいろいろアップロードしたいとき という記事を参考に、 public_html を Google Drive に作成、公開設定で一般公開しておく。

$ cp KouzanMouhituFontOTF.otf.woff2 ~/Google\ Drive/public_html/KouzanMouhituFont.sub.org.foxking.woff

これであとは CSS に font-face を書くだけ。

@charset "utf-8";
@font-face {
    font-family: "衡山毛筆";
    src: url('https://www.googledrive.com/host/0Bxp6_1slWwEfNlhPY1N5MmpPZGM/KouzanMouhituFont.sub.org.foxking.woff') format('woff');
}

h1 {
    font-size: 72px;
    font-family: "衡山毛筆", cursive;
}

うむうむ、ちゃんと表示された。

しかし今回は商用利用可の無料フォントを使ってみたけれども、これ商用フォントだとどうライセンス受けたものかね。webfont として数文字利用する場合はいくら、みたいなライセンスもあるんだろうか。

新 TestFlight で内部ユーザーに招待メールが送れないときは外部テスターをチェックする

さてはて一応ここは日本語に関する技術ネタを書くつもりでいるんだが、日本語圏に情報がないものはこっちに書いてもいいかなあと思うこともあり、今回のネタは iOS 開発で利用する TestFlight でのくだらないトラブル。

Apple が買収して iTunes Connection に統合された TestFlight なのだが、ずいぶん今までとは勝手が違ってしまってる。とりあえず自分自身を内部テスター(Internal Tester)として登録したのだが、ステータスが登録済み(Added)になって来るはずの招待メールが飛んでこない。iOS 側で TestFlight アプリをインストールしても、テストすべきアプリが何も出てこない。

どういうことだろうかと数日悩んでたのだが、どうも外部(External Tester)テスターに内部テスターと同じメールアドレスの人を登録してると、招待ボタンが出現しないようなのである。

旧 TestFlight から iTunes Connection へテスターの export/import を行うと、外部テスターとして登録されるので、それをそのままにしてたのがいけなかったようだ。

というわけで外部テスターから自分自身や内部テスターとして扱うべき人を削除してみると、見事内部テスターのリスト画面に invite ボタンが出現した。

新 TestFlight の詳しい登録方法は以下の記事が詳しい。

それではよい iOS 開発ライフを!

StringBuilder 的な処理は本当に速いのか Ruby で実験してみた

StringBuilder と 単純な文字列連結 の比較 | @chomado -ちょまど帳- という記事で知ったのだが、どうやら .NET Framework には StringBuilder というのがあるらしい。文字列連結を後に回すことでループなんかで文字列をくっつけていくより速くなるんだとか。

StringBuilder クラス (System.Text)

上記のマニュアルを見てみると、いろんな形式のデータを文字列として変換しておく機能なんかもあるようで。

とりあえず Ruby でやるとしたら文字列を Array に放り込んでいって最後に join() かなあ。それホントに文字列を連結していくより速いのかしらん、とちょっと思ったので実験してみた。

#!/usr/bin/env ruby
require 'benchmark'

test_strings = Array.new
while s = STDIN.gets
  test_strings.push s
end

puts Benchmark.measure {
  string = String.new
  test_strings.each do |s|
    string = string + s
  end
}

puts Benchmark.measure {
  string = Array.new
  test_strings.each do |s|
    string.push s
  end
  string.join('')
}

こんなコードでいいかしら。

サンプルは適当な本を青空文庫からゲットして、mecab分かち書きにしてそれを連結してみることにした。

$ nkf -w serohikino_goshu.txt | mecab -O wakati - | tr ' ' "\n" | ruby bench.rb
  0.050000   0.050000   0.100000 (  0.100551)
  0.000000   0.000000   0.000000 (  0.001951)

わーお、圧倒的に速いですね。ループで文字列連結するときにはこういうのも頭に入れておこう。Ruby 本体側で呼び出されるまで実際の連結は待つとかそういう処理入ったりしないのかな。

CentOS 6 で日本語ロケールが存在しない場合の生成方法

まれな事態だとは思うが、locale -a しても ja_JP.* なロケールが出てこない場合がある。こういうとき、debian だと dpkg-reconfigure locales とか /etc/locale.gen に日本語ロケール書いて logele-gen コマンドでなんとかなるのだが、CentOS の方はどうやるのかさっぱりわからん。RHEL もたぶん同じなんだろうな。

というわけでいろいろ調べてたらどうやら /usr/share/i18n/locales に ja_JP はあるのよね。これを元に ja_JP.UTF-8 なり ja_JP.EUC-JP なりを生成すればいい。

# localedef -f UTF-8 -i ja_JP /usr/lib/locale/ja_JP.UTF-8

-f で charmap を、-i で元の言語を指定し、/usr/lib/locale 以下に置いてあげればいいらしい。

$ locale -a
C
POSIX
en_US
en_US.iso88591
en_US.iso885915
en_US.utf8
ja_JP.UTF-8

ちゃんと追加されている。これで LANG などに指定できるようだ。ただこうしても

$ export LC_ALL=ja_JP.UTF-8
-bash: warning: setlocale: LC_ALL: cannot change locale (ja_JP.UTF-8)
-bash: warning: setlocale: LC_ALL: cannot change locale (ja_JP.UTF-8)

というエラーが出てしまう。これはよくわからん。まあメッセージまで日本語にしようとは思わないからいいんだけれども。