html M.Hiroi's Home Page / Memorandum
M.Hiroi's Home Page
http://www.geocities.jp/m_hiroi/

Memorandum

プログラミングに関する覚え書や四方山話です。
[ Home ]
2014年 1月 11月 12月

2014 年 12 月

12月28日

●文字コードの変換

Windows (MS-DOS) の文字コードはデフォルトでシフト JIS ですが、最近は UTF-8 を採用している OS やアプリケーションが多くなってきました。たとえば、Cygwin や Linux は UTF-8 ですし、Go 言語や Scala などのプログラミング言語も UTF-8 を採用しています。シフト JIS で書かれた Windows 用のプログラムを Cygwin や Linux に移植する場合、文字コードの変換が必要になります。

Linux には標準で iconv という文字コードを変換するコマンドが用意されていますが、改行コードの変換は行ってくれません。Windows の場合、改行コードは CR+LF ですが UNIX 系の OS では LF だけです。この場合、コマンド tr で CR を削除すれば Windows の改行文字を UNIX に直すことができます。

あとは、iconv と tr をパイプでつないで、tr の結果をファイルにリダイレクトするだけです。

$ iconv -f SJIS -t UTF-8 file1.txt | tr -d \\r > file2.txt

ただし、この方法はちょっと困ることがあります。アスキーコードのバックスラッシュ (0x5c) はシフト JIS では円記号になりますが、上記の方法では 0x5c を UTF-8 の円記号 (0xa5) に変換します。プログラムの場合、0x5c をエスケープシーケンスなど特別な記号に割り当てていることがほとんどなので、0xa5 に変換されるとプログラムは正常に動作しなくなります。

M.Hiroi は Tcl/Tk ミニゲーム集を Linux に移植するとき、これが原因でプログラムが動作せず、しばらくの間悩んでしまいました。まあ、そのほかにも手直しするところがあったので、けっきょく Emacs で置換 (replace-string) しましたが、もっと簡単な方法がありました。それはコマンド nkf を使うことです。nkf は次のコマンドでインストールすることができます。

sudo apt-get install nkf

nkf の基本的な使用方法を示します。

ntf [option] input_file

-j : JIS に変換
-e : EUC に変換
-s : シフト JIS に変換
-w : UTF-8 に変換

-Lu : 改行コードを LF に変換
-Lm : 改行コードを CR に変換
-Lw : 改行コードを CR+LF に変換

nkf は入力ファイルの文字コードを自動的に判別するので、文字コードの指定は必要ありません。また、-L オプションで改行コードの変換も指定することができます。nkf は古くからある漢字変換プログラムのようですが、今もメンテナンスされていて、とても便利に使うことができます。メンテナンスされている関係者の皆様に感謝いたします。


2014 年 11 月

11月2日

●VirtualBox と Vagrant

以前から仮想マシンで Linux など他の OS を動かすことに興味があったのですが、インストールや設定が面倒なような気がして、なかなか実行に移すことができませんでした。ところが、ドットインストールローカル開発環境の構築 によると、VirtualBoxVagrant を使うと、簡単に仮想マシンで Linux などの OS を動かすことができるようです。

VirtualBox は GNU General Public License で利用できる仮想マシンで、Vagant は仮想マシンに OS のインストールや SSH 接続などの設定を行ってくれるツール (MIT License) です。Vagrant の基本的な使い方はドットインストールの Vagrant 入門 が参考になると思います。

Vagrant は VirtualBox のコマンド (VBoxMange など) を呼び出すので、インストールした VirtulaBox にパスを通すことを忘れないでください。それから、Vagrant は基本的に SSH 接続で仮想マシン上の OS にアクセスするので、SSH クライアントが必要になります。DOS プロンプトで vagrant ssh と入力しても、SSH クライアントがなければ動作しません。M.Hiroi は Cygwin の openssh を使いました。これで DOS プロンプト上で仮想マシンにアクセスすることができます。

実際に試してみたところ、驚くほど簡単に仮想マシン上で Linux の環境を構築することができました。M.Hiroi のパソコンは Windows7 (32 bit) でメモリが 2 GByte しかないので、32 bit OS しか試していませんが、きちんと動作しています。軽量の Linux であれば M.Hiroi の環境でも動作するようなので、今度は Vagrant を使わないで仮想マシンに Linux をインストールして、Linux の環境でプログラミングに挑戦してみようかな、と思っています。


2014 年 1月

1月11日

●PyPy

Python のお話です。Python は Guido van Rossum がC言語で作成した処理系 (CPython) が標準ですが、これ以外にもいくつか処理系があります。その中で JIT コンパイル機能を持つ PyPy は CPython の数倍速いといわれています。PyPy は PyPy - Welcome to PyPy からダウンロードすることができます。どのくらい速くなるのか、たらいまわし関数を使って調べてみました。プログラムは次のようになります。

リスト:たらいまわし関数 (Python)

import time

def tak(x, y, z):
    if x <= y: return z
    return tak(tak(x - 1, y, z), tak(y - 1, z, x), tak(z - 1, x, y))

s = time.clock()
print tak(20, 10, 0)
e = time.clock()
print e - s

それでは実行結果を示します。tak(20, 10, 0) を計算しました。使用した PyPy のバージョンは ver 2.2.1 です。比較のため、Ruby, CPython, CLISP (Common Lisp), Gauche (Scheme) の実行結果を示します。 これらの処理系はプログラムをバイトコードにコンパイルするものです。

表 : tak(20, 10, 0) の結果
処理系
CPython (ver 2.7.3)14.51
Ruby (ver 1.9.3)11.35
CLISP (ver 2.48)5.71
Gauche (ver 0.9.2)4.65
PyPy (ver 2.2.1)4.59

PyPy は CPython の約 3 倍、Gauche と同等の速度になりました。プログラムによってはもっと速くなる場合もあるでしょうし、逆に遅くなる場合もあるかもしれません。たとえば、フィボナッチ関数の実行速度は次のようになりました。

リスト : フィボナッチ関数 (Python)

import time

def fibo(n):
    if n < 1:
        return 1
    else:
        return fibo(n - 1) + fibo(n - 2)

s = time.clock()
print fibo(36)
e = time.clock()
print e - s
C>python fibo.py
39088169
10.6575862453

C>pypy fibo.py
39088169
1.03214184584

興味のある方はいろいろ試してみてください。


1月1日

あけましておめでとうございます

旧年中は大変お世話になりました
本年も M.Hiroi's Home Page をよろしくお願い申し上げます

Copyright (C) 2014 Makoto Hiroi
All rights reserved.

[ Home ]