f

2015-05-31

nkfによる文字エンコーディング・改行コードのディレクトリ再帰的な一括変換

nkfコマンドを使って現在ディレクトリ以下のファイルを指定した文字エンコーディング・改行コードに一括変換する方法を記す。

日本語のテキストファイルを扱っていると,Shift_JISやCP932,EUF-JPといった文字エンコーディングが混在していたり,改行コードにCR+LFが混ざっていたりして処理の問題となることがある。この問題を解消するためにディレクトリを再帰して全ファイルを指定した文字エンコーディング・改行コードに変換する。

文字エンコーディングと改行コードの変換にはnkfを使用する。以下に示す通りfindコマンドで現在ディレクトリから再帰的にファイルを列挙してnkfで変換する。最も汎用性が高いのでこの方法がおそらくベストだ。

find . -type f -exec nkf -w -Lu --overwrite {} \;

この例では,文字エンコーディング:UTF-8,改行コード:LFとなるようにnkfの変換オプションを指定している。findコマンドのオプションの-nameなどでさらに変換対象を絞ることも可能だ。

なお,処理対象ファイルが多い場合,以下に示すようにxargsコマンドで検索対象をnkfに引き渡したほうが処理を高速にできる。

find . -type f | xargs nkf -w -Lu --overwrite {} \;

また,zshとbash4以降で導入されたglobstarという機能を使えば,短く書ける。

nkf -w -Lu --overwrite **/*.py

特定ディレクトリやファイルを避けたければ以下のようにして除外する。

nkf -w -Lu --overwrite **/!(.|..)

しかし,globstarを使うやり方(**/*)だとディレクトリに対してnkfを実行することがありえ,.nkftmp*というような不要なファイルが生成されてしまう。したがって,最初に示したfindコマンドを使う方法がよい。

参考:

  • nkfを使って、ディレクトリ以下のファイルを「EUC-JP」⇒「UTF-8」に一括変換する。 - カサヒラボ http://d.hatena.ne.jp/kasahi/20070926/1190833699
  • 文字コードの変換 – 片っ端からメモってみる http://www.parlia.net/weblog/post/722.html/

2015-05-14

Install Apache HTTP Server 2.4 from source on Ubuntu14.04

CMSなど自分でサーバーをたてるときに使われるApche HTTP Server 2.4をソースからのインストール方法を記す。

基本的にソースコードをダウンロードしてコンパイルするだけで済むが,依存関係としてAPRとapr-utilが必要だ。これらがないとconfigureで以下のエラーが出る。

checking for APR... no
configure: error: APR not found.  Please read the documentation.

APRとapr-utilのソースをダウンロードして適切な場所に配置して,configureに--with-included-aprオプションをつけておけばおけば一緒にビルドしてくれる。

参考:ガイド: Compiling and Installing - Apache HTTP Server Version 2.4 http://httpd.apache.org/docs/2.4/en/install.html

これを踏まえるとインストールは以下のコマンドで完了する。

VER=2.4.12
cd ~/local/src
wget -nc http://ftp.riken.jp/net/apache//httpd/httpd-$VER.tar.bz2
tar jxf httpd-$VER.tar.bz2
cd httpd-$VER

cd srclib/
wget -nc http://ftp.riken.jp/net/apache//apr/apr-1.5.2.tar.bz2 tar jxf apr-1.5.2.tar.bz2
mv apr-1.5.2 apr
wget -nc http://ftp.riken.jp/net/apache//apr/apr-util-1.5.4.tar.bz2 tar jxf apr-util-1.5.4.tar.bz2
mv apr-util-1.5.4 apr-util

cd ../
./configure --prefix=$HOME/local/apache2 --with-included-apr # default /usr/local/apache2
make && make install

今回はApacheを~/local/apache2にインストールした。

以下のコマンドでApacheのサーバーを起動して動作を確認する。

sudo ~/local/apache2/bin/apachectl -k start

ブラウザでhttp://localhostのアドレスにアクセスして"It works!"と表示されれば成功だ。

apachectlは管理者権限で実行しないと以下のエラーが出るので注意する。

senooken% 0-0: ~/local/apache2/bin/apachectl -k start
AH00558: httpd: Could not reliably determine the server's fully qualified domain
 name, using 127.0.1.1. Set the 'ServerName' directive globally to suppress this
 message
(13)Permission denied: AH00072: make_sock: could not bind to address [::]:80
(13)Permission denied: AH00072: make_sock: could not bind to address 0.0.0.0:80
no listening sockets available, shutting down
AH00015: Unable to open logs

参考:

  • 配布元: Download - The Apache HTTP Server Project http://httpd.apache.org/download.cgi#apache24
  • 自明かもしれない: Apache 2.4 系をソースからインストールします http://tt4cs.blogspot.jp/2013/01/apache-2.4-installation.htm

2015-05-02

How to create .deb package file for Ubuntu, Debian single binary

Ubuntuなどで使えるDebianパッケージファイル(.deb)の作成方法を記す。

自作プログラムなどを配布して他のUbuntuなどで簡単に使ってもらう方法がないか考えた。シェルスクリプトでコピーや削除を自動的に行うようにしていたが,どうしても端末からコマンドを入力する必要があり煩雑だと感じた。そこで,Ubuntuで一般的にパッケージのインストールで使われているDebianパッケージファイル(.debファイル)を作りたいと考えた。

うまく成功したので手順をここでまとめる。

前提

MoeCalcという独自パッケージを以下のディレクトリにインストールする。

/opt/MoeCalc

今回はソースコードは配布せずビルド済みのバイナリのみを配布する。

環境の用意

以下のコマンドでパッケージ化に必要なコマンド類をインストールする。

sudo apt-get install build-essential libgtk2.0-dev dpkg-dev debhelper devscripts fakeroot lintian dh-make

dh_makeでのパッケージひな形の作成に使用する名前やメールアドレスを環境変数に設定する。

export DEBEMAIL="e-mail@example.com"
export DEBFULLNAME="Ken SENOO"

メールアドレスは公開するつもりでないなら,メールアドレスの形式なら何を書いてもいい。

参考:Ubuntu Manpage: dh_make - prepare Debian packaging for an original source archive http://manpages.ubuntu.com/manpages/lucid/man8/dh_make.8.html

パッケージングディレクトリの用意

パッケージ化したいファイル一式を以下の命名規則のディレクトリに格納。

パッケージ名-バージョン番号

例:moecalc-v0.4

mkdir -p ~/tmp; cd ~/tmp
wget -nc https://github.com/lamsh/MoeCalc/releases/download/v0.4/moecalc-v0.4.tar.gz
tar zxf moecalc-v0.4.tar.gz
mv moecalc-v0.4 moecalc-0.4
パッケージひな形の作成

パッケージ化したいディレクトリに移動して以下のコマンドを入力。

cd moecalc-0.4
dh_make -n -s

-nオプション:origファイルの作成しない。

-sオプション:シングルバイナリのパッケージングを選択。このオプションを付けなければ,パッケージングの種類を確認してくる。

-cオプション:ライセンスのひな形を選択。既定はGPL3。

コマンドを入力すると以下のように確認してくるのでEnterを入力。

Maintainer name  : Ken SENOO
Email-Address    : e-mail@example.com 
Date             : Sat, 02 May 2015 15:23:19 +0900
Package Name     : moecalc
Version          : 0.4
License          : gpl3
Type of Package  : Single
Hit <enter> to confirm:
不要ファイルの削除

dh_makeで作ったひな形の中には使わないファイルもたくさんあるので削除しておく。

rm debian/{*.ex,*.EX,README.Debian,README.source}
debian/controlの編集

controlファイルでパッケージの各種情報を記入する。Ubuntu Sotfware Centerで表示されたりいろんなところでここの情報が参照される。重要なファイル。

cat debian/control
Source: moecalc
Section: unknown                                                                
Priority: optional
Maintainer: Ken SENOO <e-mail@example.com>
Build-Depends: debhelper (>= 8.0.0)
Standards-Version: 3.9.4
Homepage: <insert the upstream URL, if relevant>
#Vcs-Git: git://git.debian.org/collab-maint/moecalc.git
#Vcs-Browser: http://git.debian.org/?p=collab-maint/moecalc.git;a=summary

Package: moecalc
Architecture: any
Depends: ${shlibs:Depends}, ${misc:Depends}
Description: <insert up to 60 chars description>
 <insert long description, indented with spaces>
修正すべき箇所は主に以下4箇所。
  • Section:aptitudeなどでソートしたりするときに使う分類。困ったらmiscと書いておく。
    • Debian JP Project - Debian ポリシーマニュアル - Debian アーカイブ http://www.debian.or.jp/community/devel/debian-policy-ja/policy.ja.html/ch-archive.html#s-subsections
  • Maintainer:メンテナーの名前とメールアドレスを記入。最初に環境変数で設定しているので変更は不要。
  • Homepage:パッケージに関係のあるURLを記入。日本語はうまく認識されない。
  • Description:ソフトウェアセンターなどで表示される説明文を記入。

今回は以下のように記入した。

Source: moecalc
Section: misc
Priority: optional
Maintainer: Ken SENOO <e-mail@example.com>
Build-Depends: debhelper (>= 8.0.0)
Standards-Version: 3.9.4
Homepage: http://moebuntu.wiki.fc2.com/wiki/%E8%90%8C%E3%81%88%E9%9B%BB%E5%8D%93%E3%81%B7%E3%82%8D%E3%81%98%E3%81%87%E3%81%8F%E3%81%A8
#Vcs-Git: git://git.debian.org/collab-maint/moecalc.git
#Vcs-Browser: http://git.debian.org/?p=collab-maint/moecalc.git;a=summary

Package: moecalc
Architecture: any
Depends: ${shlibs:Depends}, ${misc:Depends}
Description: An open-source calculator for moebuntu.
  This package provides 'moecalc' command.

ソフトウェアセンターでは以下の図のようにcontrolファイルの中身を使って説明文を表示している。

  • debian/copyrignt
  • copyrightファイルで著作権情報を記述。

    cat debian/copyright

    必要に応じて編集する。今回は変更していない。

  • debian/changelog
  • 必要に応じてdebian/changelogファイルを修正する。今回は編集しなくても問題ない。

    編集する際はdchコマンドを使えばうまくできる。

  • debian/install

    今回はシングルバイナリの配布なので,Makefileは使わずにインストール先を個別に指定する。そのため,インストール先の指定ファイルの作成する。

  • 具体的にはパッケージング中に実行されるdh_installでインストールするファイルとそのインストール先を指定する。dh_installの設定には以下の2ファイルを使う。

    • install
    • <package>.install

    <package>にはパッケージ名(今回はmoecalc)が入る。

    上記2ファイルの書式は以下のようにインストール元 インストール先とする。

    src/bar usr/bin

    インストール先は/からの相対パスにする。

    具体的には今回は以下のようにdebian/installファイルを作成した。

    echo '
    moecalc opt/MoeCalc moecalc.png opt/MoeCalc bg.jpg opt/MoeCalc moecalc.desktop usr/share/applications nw.pak opt/MoeCalc icudtl.dat opt/MoeCalc
    ' > debian/install
    debian/links

    アプリケーションで使用する画像の格納場所を/opt/MoeCalcにしている。一方システムのPATHとして認識されるために/usr/binにプログラムを配置したい。起動元プログラムの位置関係を維持するためにシンボリックを/usr/binに貼り付けることで対処する。

    具体的にはパッケージング中に実行されるdh_linkでシンボリックリンクする元ファイルと貼り付け先を指定する。設定にはinstallと同じように以下の2ファイルを使う。

    • links
    • <package>.links

    以下のようにしてdebian/linksファイルを作成した。

    echo '
    /opt/MoeCalc/moecalc usr/bin/moecalc
    '> debian/links
    debian/rules

    パッケージングの時にdh_stirpコマンドを実行してバイナリを圧縮している模様。そのため,既にupxコマンドで圧縮されたバイナリがあるとここで以下のエラーメッセージが表示される。

    dpkg-buildpackage -us -uc
    ...................
    dh_strip strip: error: the input file 'debian/moecalc/opt/MoeCalc/moecalc' has no sections dh_strip: strip --remove-section=.comment --remove-section=.note debian/moecalc/opt/MoeCalc/moecalc returned exit code 1 make: *** [binary] Error 29

    このエラーが出ると,バイナリがうまくパッケージ化されない。これを防ぐため,upxで圧縮されたバイナリをdh_stripの対象から除外する。

    debian/rulesの末尾に以下の内容を追記する(行頭はタブ)。

    echo '
    override_dh_strip: dh_strip --exclude moecalc
    ' >> debian/rules

    参考:build - debuild creates link instead of copying binary file - Stack Overflow http://stackoverflow.com/questions/21142719/debuild-creates-link-instead-of-copying-binary-file

    パッケージ化

    ここまでできれば以下のコマンドでパッケージングを行う。

    dpkg-buidpakcage -us -uc

    -us:.dscファイルにGPGでサインしないオプション

    -uc:.changesファイルにGPGでサインしないオプション

    パッケージングを行うコマンドはこの他にもいくつかある。
    • fakeroot
    • debuild

    内部でdpkg-buidpackageを使っているのでdpkg-buildpackageを使えばよい。このほうがエラーメッセージがなどが表示されてわかりやすい。

    パッケージングは以下のディレクトリに仮想的なインストールディレクトリを作り,そこにパッケージを配置してパッケージファイルを作成している模様。

    debian/moecalc/
    |--DEBIAN/
    |--opt/
    +--usr/

    パッケージングがうまくいっているかはここにうまくファイルが格納されているかでも確認できる。パッケージ化が成功するとパッケージ化ディレクトリの外にパッケージファイル類が生成される。

    ls ../
    moecalc-0.4/ moecalc_0.4.tar.gz moecalc_0.4_amd64.deb moecalc-v0.4.tar.gz moecalc_0.4_amd64.build moecalc_0.4.dsc moecalc_0.4_amd64.changes

    moecalc_0.4_amd64.debファイルがパッケージファイルとなる。

    このファイルを右クリック▷Ubuntuソフトウェアセンターで開くことでインストールできる。アンインストールは他のパッケージと同様にUbuntuソフトウェアセンターから検索してアンインストールできる。

    これでひとまずバイナリファイルのパッケージ化がうまくできた。改善点としてはPPAへの登録方法やスクリーンショットの登録方法などがあるだろう。今後必要に応じて調査していきたい。

    パッケージ化にあたって以下の情報が非常に参考になった。

    参考情報:
    • 独学Linux : シンプルなソースコードからdebパッケージを作成する方法 http://blog.livedoor.jp/vine_user/archives/51940442.html
    • Rodin, Josip & Aoki, Osamu  (2014) : Debian 新メンテナーガイド. https://www.debian.org/doc/manuals/maint-guide/.