2017年1月8日日曜日

Debian 8.6 (jessie) に xrdp をインストールする

環境

Debian 8.6 (jessie)
LXDE
(gnome や cinnamon では、起動すらできなかったが、原因は未調査。)


手順

root ユーザで作業する前提とする。

# libxrandr-dev パッケージをインストールするのがミソ
aptitude -y install git libxrandr-dev

# 任意のディレクトリでビルド作業を行う
git clone --depth 1 -b v3.03 https://github.com/scarygliders/X11RDP-o-Matic.git
cd X11RDP-o-Matic
./X11rdp-o-matic.sh --justdoit

# パッケージがインストールされているか確認
dpkg -l xrdp x11rdp

# セッションマネージャを選択(LDXE を選択する)
./RDPsesconfig.sh


# 再起動後、 xrdp で以下のようなエラーが発生した。

Jan  7 22:28:41 record2 xrdp-sesman[583]: (583)(140136194672384)[ERROR] error opening pid file[/var/run/xrdp/xrdp-sesman.pid]: No such file or directory

# /var/run は、/run のシンボリックリンクとなっている。
# /run は、tmpfs で作成されるため、起動時に初期化されてしまう。
# したがって、起動時に作成するように設定を行う必要がある。

# PID ファイルの格納先を作成
tee /etc/tmpfiles.d/xrdp.conf <<'EOT'
d /run/xrdp 0755 root root
EOT


# xrdp を起動すると、さらに以下のようなエラーが発生する。
# これは、pid ファイルの作成先が、異なっているため。

Jan 08 11:06:30 record2 xrdp-sesman[11225]: (11225)(140003619026688)[INFO ] starting xrdp-sesman with pid 11225
Jan 08 11:06:30 record2 systemd[1]: PID file /var/run/xrdp-sesman.pid not readable (yet?) after start.
Jan 08 11:06:30 record2 xrdp-sesman[11225]: (11225)(140003619026688)[INFO ] listening to port 3350 on 127.0.0.1
Jan 08 11:08:00 record2 systemd[1]: xrdp-sesman.service start operation timed out. Terminating.
Jan 08 11:08:00 record2 xrdp-sesman[11225]: (11225)(140003619026688)[INFO ] shutting down sesman 1
Jan 08 11:08:00 record2 xrdp-sesman[11225]: (11225)(140003619026688)[DEBUG] Closed socket 7 (AF_INET 127.0.0.1:3350)
Jan 08 11:08:00 record2 systemd[1]: Failed to start xrdp session manager.

# /lib/systemd/system/xrdp.service ファイルを以下のように修正
#   pid ファイルの場所を修正
#   存在しないディレクトリの読み込み行をコメントアウト

PIDFile=/var/run/xrdp/xrdp.pid
#EnvironmentFile=-/etc/sysconfig/xrdp
#EnvironmentFile=-/etc/default/xrdp


# /lib/systemd/system/xrdp-sesman.service ファイルを以下のように修正
#   pid ファイルの場所を修正
#   存在しないディレクトリの読み込み行をコメントアウト

PIDFile=/var/run/xrdp/xrdp-sesman.pid
#EnvironmentFile=-/etc/sysconfig/xrdp
#EnvironmentFile=-/etc/default/xrdp


systemctl daemon-reload
systemctl enable xrdp
systemctl start xrdp

# xrdp が起動したことを確認
systemctl status xrdp

# 再起動し、正常に xrdp が起動することを確認する。
reboot



2016年11月27日日曜日

pyenv で構築した Ansible 実行環境で apt モジュールを利用するとエラーとなる事象を解決する

はじめに


この解決方法が正しいのかは、疑問が残る。
その内、正当な方法が見つかるかもしれない。

今回は、自分自身をプロビジョニングする場合に発生した事象となる。


環境


Debian 8.6 (jessie)
pyenv 1.0.2
Python 2.7.12
ansible 2.2.0.0


Ansible 実行環境の構築


ユーザは、 user1 で作業
ansible2 という名称で、python 2.7.12 の環境を定義している。
pyenv のインストール方法は、割愛。

# python のビルドに必要なパッケージをインストール
sudo aptitude install libssl-dev libbz2-dev libreadline-dev libsqlite3-dev zlib1g-dev libffi-dev
pyenv install 2.7.12
pyenv global 2.7.12
pip install --upgrade pip
pyenv virtualenv 2.7.12 ansible2
pyenv global ansible2
pip install ansible


python のパッケージ状態


(ansible2) user1@record2:~$ pip list --format=columns
Package                      Version
---------------------------- --------
ansible                      2.2.0.0
backports.ssl-match-hostname 3.5.0.1
cffi                         1.8.3
cryptography                 1.5.2
enum34                       1.1.6
idna                         2.1  
ipaddress                    1.0.17
Jinja2                       2.8  
MarkupSafe                   0.23  
paramiko                     2.0.2
pip                          9.0.1
pyasn1                       0.1.9
pycparser                    2.17  
pycrypto                     2.6.1
PyYAML                       3.12  
requests                     2.12.1
setuptools                   29.0.0
six                          1.10.0
websocket-client             0.37.0
wheel                        0.30.0a0



Ansible インベントリファイル


[localhost]
localhost
[localhost:vars]
ansible_python_interpreter=/home/user1/.pyenv/versions/ansible2/bin/python
ansible_connection=local


ansible を実行する場合に、pyenv で設定した python をデフォルトでは、利用しない。
したがって、ansible_python_interpreter に、指定する必要がある。
システム標準の python には、色々とパッケージがデフォルトでインストールされているが、pyenv の python を利用する場合には、別途パッケージをインストールする必要がある。

今回は、pip search で、見つからないパッケージが必要となったため、ソースファイルを pip に指定してインストールしているものがある。


事象


Ansible プレイブックを実行


上記状態で、apt モジュールを使用した Ansible プレイブックを実行
以下のようなエラーが発生。

failed: [localhost] (item=[u'pkg-config', u'autoconf', u'automake']) => {"failed": true, "item": ["pkg-config", "autoconf", "automake"], "msg": "Could not import python modules: apt, apt_pkg. Please install python-apt package."}


python-apt パッケージが必要だと怒られる。そりゃそうだ。

python-apt をインストール(失敗)


pip でインストールを試すが・・・

(ansible2) user1@record2:~/selfprov$ pip install python-apt
Collecting python-apt
  Using cached python-apt-0.7.8.tar.bz2
    Complete output from command python setup.py egg_info:
    Traceback (most recent call last):
      File "", line 1, in
      File "/tmp/pip-build-UZriTI/python-apt/setup.py", line 6, in
        from DistUtilsExtra.command import *
    ImportError: No module named DistUtilsExtra.command
 
    ----------------------------------------
Command "python setup.py egg_info" failed with error code 1 in /tmp/pip-build-UZriTI/python-apt/


DistUtilsExtra.command などというモジュールは無いわっ!と怒られる。

このモジュールは、どうやら python-distutils-extra パッケージをインストールすると利用できるようになるようだ。


python-distutils-extra のインストール


pip search で探すも、それらしいものがない。
aptitude search python-distutils-extra で探すと、ある。
でも、これでインストールしても、システム標準の python にインストールされるため、pyenv 環境の python にインストールすることは、できない。

しょうがないので、直接ソースファイルからインストールする。

pip install https://launchpad.net/python-distutils-extra/trunk/2.39/+download/python-distutils-extra-2.39.tar.gz


インストールに成功した。

python-apt をインストール(また失敗)


では、気を取り直して、再び python-apt をインストールしてみる。

(ansible2) user1@record2:~/selfprov$ pip install python-apt
Collecting python-apt
  Using cached python-apt-0.7.8.tar.bz2
    Complete output from command python setup.py egg_info:
    Traceback (most recent call last):
      File "", line 1, in
      File "/tmp/pip-build-RTVyKx/python-apt/setup.py", line 11, in
        string.split(parse_makefile("python/makefile")["APT_PKG_SRC"]))
      File "/home/user1/.pyenv/versions/2.7.12/lib/python2.7/distutils/sysconfig.py", line 293, in parse_makefile
        fp = TextFile(fn, strip_comments=1, skip_blanks=1, join_lines=1)
      File "/home/user1/.pyenv/versions/2.7.12/lib/python2.7/distutils/text_file.py", line 103, in __init__
        self.open (filename)
      File "/home/user1/.pyenv/versions/2.7.12/lib/python2.7/distutils/text_file.py", line 120, in open
        self.file = open (self.filename, 'r')
    IOError: [Errno 2] No such file or directory: 'python/makefile'
 
    ----------------------------------------
Command "python setup.py egg_info" failed with error code 1 in /tmp/pip-build-RTVyKx/python-apt/


というわけで、お約束のように失敗。
ファイルが無いという、よくわからないエラー。バグだろ・・・

ググッてもよくわからず、最新版を入れると大丈夫だという問答を見つけたので、最新版をソースからインストールしてみる。


pip install https://launchpad.net/python-apt/main/0.7.8/+download/python-apt-0.8.5.tar.gz


(ansible2) user1@record2:~/selfprov$ pip install https://launchpad.net/python-apt/main/0.7.8/+download/python-apt-0.8.5.tar.gz
Collecting https://launchpad.net/python-apt/main/0.7.8/+download/python-apt-0.8.5.tar.gz
  Using cached https://launchpad.net/python-apt/main/0.7.8/+download/python-apt-0.8.5.tar.gz
Building wheels for collected packages: python-apt
  Running setup.py bdist_wheel for python-apt ... error
  Complete output from command /home/user1/.pyenv/versions/2.7.12/envs/ansible2/bin/python2.7 -u -c "import setuptools, tokenize;__file__='/tmp/pip-ev3yAq-build/setup.py';f=getattr(tokenize, 'open', open)(__file__);code=f.read().replace('\r\n', '\n');f.close();exec(compile(code, __file__, 'exec'))" bdist_wheel -d /tmp/tmpV9Cq77pip-wheel- --python-tag cp27:
  W: [python2.7] Sphinx import error.

<中略>

  gcc -pthread -fno-strict-aliasing -g -O2 -DNDEBUG -g -fwrapv -O3 -Wall -Wstrict-prototypes -fPIC -I/home/user1/.pyenv/versions/2.7.12/include/python2.7 -c python/acquire.cc -o build/temp.linux-x86_64-2.7/python/acquire.o
  cc1plus: warning: command line option ‘-Wstrict-prototypes’ is valid for C/ObjC but not for C++
  In file included from python/acquire.cc:26:0:
  python/apt_pkgmodule.h:14:28: fatal error: apt-pkg/hashes.h: No such file or directory
   #include <apt-pkg/hashes.h>

<中略>

    gcc -pthread -fno-strict-aliasing -g -O2 -DNDEBUG -g -fwrapv -O3 -Wall -Wstrict-prototypes -fPIC -I/home/user1/.pyenv/versions/2.7.12/include/python2.7 -c python/acquire.cc -o build/temp.linux-x86_64-2.7/python/acquire.o
    cc1plus: warning: command line option ‘-Wstrict-prototypes’ is valid for C/ObjC but not for C++
    In file included from python/acquire.cc:26:0:
    python/apt_pkgmodule.h:14:28: fatal error: apt-pkg/hashes.h: No such file or directory
     #include <apt-pkg/hashes.h>
                                ^
    compilation terminated.
    error: command 'gcc' failed with exit status 1


エラーが出た。
よく見ると、apt-pkg 関連のヘッダが無いのが原因のようだ。


libapt-pkg-dev をインストール


sudo aptitude install libapt-pkg-dev


python-apt をインストール(ようやく成功)


(ansible2) user1@record2:~/selfprov$ pip install https://launchpad.net/python-apt/main/0.7.8/+download/python-apt-0.8.5.tar.gz
Collecting https://launchpad.net/python-apt/main/0.7.8/+download/python-apt-0.8.5.tar.gz
  Using cached https://launchpad.net/python-apt/main/0.7.8/+download/python-apt-0.8.5.tar.gz
Building wheels for collected packages: python-apt
  Running setup.py bdist_wheel for python-apt ... done
  Stored in directory: /home/user1/.cache/pip/wheels/83/8c/5e/d3b5bc92348f4a5c88c8b5903d8fcdb7404cbaa4618bd79049
Successfully built python-apt
Installing collected packages: python-apt
Successfully installed python-apt-0.0.0


よし、インストール成功した。
が、バージョンが、0.0.0 になっとる。リリース前バージョンだから?
まあ、実害はなさそうなので、放置する方向で。


再び、Ansible プレイブックを実行すると、めでたく apt モジュールの実行が出来るようになる。

最初に Ansible の実行環境を作成してるときには、実は、pyenv で設定している python を利用せずに実行していることに気付かなかった。
docker モジュールを Ansible で操作しようとした時に、ようやく気づき、ansible_python_interpreter で python を切り替えたら、この現象が起こって、悶絶したものの、解決できた。

意外と難儀したが、これでようやく先に進める・・・





2015年10月17日土曜日

RLogin ターミナルソフトを使用した、ポートフォワーディングによる踏み台サーバ越しの、多段 SSH 接続設定方法について

RLogin (http://nanno.dip.jp/softlib/man/rlogin/)というターミナルソフトを利用して、踏み台サーバーを越える、多段 SSH 接続方法を備忘録として残しておく。

無知ゆえに、多段 SSH 接続設定を、すっきりできずに悶々としていたが、やっとそれらしい設定方法が分かった。

ただし、私自身がよく分かっていないため、正しい設定方法かどうかは不明。よって、自己責任でどうぞ。

今回の環境は、AWS の VPC 上に環境があり、パブリック IP が付与されているサーバは、踏み台のみで、他のサーバは、プライベート IP のみとする。

踏み台サーバ IP:1.2.3.4
プライベートサーバ:10.0.0.1

RLogin の接続設定は、2つ作成する。
1つは、ローカルマシンで SOCKS プロキシとして動作する設定。
もう1つは、上記プロキシ経由で、目的のプライベート IP マシンへ接続する設定。


では、設定方法の説明をする。

踏み台サーバ接続設定


サーバ設定を新規追加。


エントリー名:「aws_bastion」
Server Address:「1.2.3.4」
Socket Port:「ssh(22)」
User Name:「ec2-user」
SSH Identity Key の参照ボタンを押下し、踏み台サーバへログインするための秘密鍵を設定する。


左のツリーから「プロトコル」を選択
「ポートフォワードだけ行う」をチェック
「エージェント転送を有効にする」をチェック


「ポートフォワード」ボタンを押下


「新規」ボタンを押下


Listened の「Local Socks」を選択
Host Name:「localhost」
Port:「10022」

「OK」ボタン押下
「閉じる」ボタン押下
「OK」ボタン押下
で、踏み台サーバへの接続設定は完了。




プライベートサーバ接続設定


サーバ設定を新規追加。

エントリー名:「aws_private」
前接続先:「aws_bastion」
  ※ 前接続先は、この接続を行うときに、自動的に指定した接続が行われる設定。
Server Address:「10.0.0.1」
Socket Port:「ssh(22)」
User Name:「ec2-user」
SSH Identity Key の参照ボタンを押下し、踏み台サーバへログインするための秘密鍵を設定す


「Proxy Server」の「設定」ボタンを押下
Select Proxy Protocol :「SOCKS5」
Over SSL :「使用しない」
Server Option
  Proxy Server Address:「localhost」
  Socket Port:「10022」  ※踏み台サーバのポートフォワード設定で指定したポート

「OK」ボタン押下
左側のツリーでプロトコルを選択
「エージェント転送を有効にする」をチェック

「OK」ボタン押下

以上で、設定完了。

aws_private を接続すると、自動的にaws_bastion の接続も行われ、無事に目的のプライベートサーバーに接続できる。



今回の設定方法以外でも、Chat Script などを使えば、多段 SSH 接続は行える。
がしかし、以下で説明する接続方法の場合に都合が良い。


  • プロトコルハンドラ経由での呼び出し
  • コマンドラインからの呼び出し

接続先ホストが異なるだけの場合、上記方法であれば、RLogin 側の設定を、増やす必要がない。
コマンドラインの場合は、もう少し自由度がある。

では、実際の接続例を記述しておく。

プロトコルハンドラでの接続

プロトコルハンドラとは、「ssh://hostname などの URL リンクで起動・接続できるようにハンドラを登録する」機能である。
HTML などで、サーバ接続 URL をリンクで作成しておけば、それをクリックすることで RLogin が起動し、サーバに接続できる。
RLogin の Server Select 画面で、「aws_private」を右クリックし、「プロトコルハンドラに登録」を選択


デフォルト値のまま、「OK」ボタンを押下

次に、HTML で接続先リンクを作成

link.html

<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8" />
<title>Hosts</title>
</head>
<body>
  <h1>サーバ一覧</h1>
  <ul>
    <li><a href="ssh://10.0.0.1">プライベートサーバ</a></li>
  </ul>
</body>
</html>



Chrome などで、link.html ファイルを表示して、サーバのリンクをクリックすると、ダイアログが表示されるので、「アプリケーションの起動」をクリックすると、RLogin が起動し、サーバに接続される。


コマンドラインからの呼び出し

コマンドラインからの呼び出しは、もう少し自由度がある。
プロトコルハンドラでは、RLogin で登録した設定でのみ起動できないが、コマンドラインでは、それも変更できる。

今回は、趣向を凝らし、ディレクトリ名が設定名(エントリ名)で、ファイル名がサーバ名として接続されるような、バッチファイルを作成した。
ファイルは、以下のような構成とした。

├ aws_private/
│ └ 10.0.0.1.bat
└ env.bat

env.bat は、RLogin のパスを設定している。
path D:\appli\rlogin;%PATH%

10.0.0.1.bat の内容は、全ファイル共通であり、ディレクトリ名とファイル名を解析し、RLogin に渡している。現在は、エントリ名とホストのみ設定できる。工夫しだいで、プロトコル、ユーザ、パスワードや、ポートなども渡すことが出来る。

@echo off
setlocal
call "%~dp0..\env.bat"
set HOST=%~n0
set PDIR=%~p0
call :GETENTRY "%PDIR:~0,-1%"

start /b RLogin.exe /inuse /entry %ENTRY% /ip %HOST%
goto :EOF

:GETENTRY
set ENTRY=%~n1
exit /b


2014年10月5日日曜日

gitolite3 で、hook スクリプトを設定する

git リポジトリで、hook スクリプトを設定したくなったので、調べてみたら、gitolite3 の設定で、同様のことが出来るようだ。
しかも、リポジトリ毎のスクリプト実行設定はもちろん、スクリプト自体も、gitolite 管理用リポジトリ(gitolite-admin)に、ファイルを追加すると、サーバーサイドで実行してくれるようだ。
仕組みは、管理用リポジトリの push を行った時点で、対象リポジトリの hooks に、設定したシェルのリンクを作成するようだ。gitolite 3.5.3.1-2 時点では、同一フック種に複数のシェルを指定することはできない。3.6 以降では、複数のシェルを設定できるようだが、未確認。

前提条件

  • gitolite3 や git は、インストールおよび設定済みとする。
  • gitolite3 の基本的な設定や利用方法は、習得済みとする。
  • gitolite3 ユーザーのホームディレクトリは、/var/lib/gitolite3 とする。
  • gitolite3 のリポジトリは、gitolite3 ユーザーのホームディレクトリに設定してあるものとする。

update フックの設定

1.gitolite3 のサーバー上の設定ファイルを変更する。

sudo vi /var/lib/gitolite3/.gitolite.rc
以下の行を、コメントインする。
# LOCAL_CODE                =>  "$rc{GL_ADMIN_BASE}/local",
LOCAL_CODE                =>  "$rc{GL_ADMIN_BASE}/local",

これで、gitolite 管理用リポジトリに登録した hook スクリプトが、利用可能になる。

2.gitolite 管理用リポジトリ(gitolite-admin)に update フックファイルを登録

以下のファイルを作成。LF 改行にすること。
gitolite-admin/local/VREF/hello

ファイルの内容は、以下のようにする。
#!/bin/bash
echo "Hello update"

hello ファイルを git add する
ファイルのパーミッションを設定する。ここ重要。
git update-index --chmod=+x hello

TortoiseGit の場合は、hello ファイルを右クリック⇒プロパティ
Git タブを選択⇒実行可能(+x) チェックボックスをチェックで、上記のコマンド入力と同等の状態となる。

コミットおよびサーバーへプッシュする。

3.各リポジトリに update フック設定を行う。

以下のファイルを修正し、最後の行を追加する。
gitolite-admin/conf/gitolite.conf

@admin = admin shpad
repo public/program/HelloClosureLibrary
    RW+     =   @admin
    R       =   @all
    -   VREF/hello = @all

コミットおよびサーバーへプッシュする。

4.動作確認

前述の設定を行ったリポジトリに対して、コミットを行ってみる。

git.exe push -v --progress  "origin" master:master

Pushing to ssh://gitolite3@yebisu/public/program/HelloClosureLibrary
Counting objects: 9, done.
Delta compression using up to 8 threads.
Compressing objects: 100% (3/3), done.
Writing objects: 100% (5/5), 378 bytes | 0 bytes/s, done.
Total 5 (delta 1), reused 0 (delta 0)
remote: Hello update
remote: From /var/lib/gitolite3/repositories/public/program/HelloClosureLibrary
remote:    7a5bd94..2af6ecd  master     -> origin/master
remote: Updating 7a5bd94..2af6ecd
remote: Fast-forward
remote:  js/src/common.js | 4 ++++
remote:  1 file changed, 4 insertions(+)
To ssh://gitolite3@yebisu/public/program/HelloClosureLibrary
7a5bd94..2af6ecd  master -> master
updating local tracking ref 'refs/remotes/origin/master'

成功 (2839 ms @ 2014/10/05 16:20:12)


うまく動いているようだ。
サーバー側のスクリプトの実行結果は、remote: の行に出力されている。
エラー時もここに表示される。便利。

その他フック設定

1.gitolite3 のサーバー上の設定ファイルを変更する。

sudo vi /var/lib/gitolite3/.gitolite.rc
以下の行を、コメントインする。
# LOCAL_CODE                =>  "$rc{GL_ADMIN_BASE}/local",
LOCAL_CODE                =>  "$rc{GL_ADMIN_BASE}/local",

# 'repo-specific-hooks',
'repo-specific-hooks',

2.gitolite 管理用リポジトリ(gitolite-admin)にその他フックファイルを登録

以下のファイルを作成。LF 改行にすること。
gitolite-admin/local/hooks/repo-specific/hello

ファイルの内容は、以下のようにする。
#!/bin/bash
echo "Hello post-receive"

hello ファイルを git add する
ファイルのパーミッションを設定する。ここ重要。
git update-index --chmod=+x hello

TortoiseGit の場合は、hello ファイルを右クリック⇒プロパティ
Git タブを選択⇒実行可能(+x) チェックボックスをチェックで、上記のコマンド入力と同等の状態となる。

コミットおよびサーバーへプッシュする。

3.各リポジトリにその他フック設定を行う。

以下のファイルを修正し、最後の行を追加する。
フックの動作タイミング = 前述のフックスクリプト。
gitolite-admin/conf/gitolite.conf

@admin = admin shpad
repo public/program/HelloClosureLibrary
    RW+     =   @admin
    R       =   @all
    -   VREF/hello = @all
    option hook.post-receive = hello


コミットおよびサーバーへプッシュする。

4.動作確認

前述の設定を行ったリポジトリに対して、コミットを行ってみる。

git.exe push --progress  "origin" master:master

Counting objects: 9, done.
Delta compression using up to 8 threads.
Compressing objects: 100% (3/3), done.
Writing objects: 100% (5/5), 375 bytes | 0 bytes/s, done.
Total 5 (delta 1), reused 0 (delta 0)
remote: Hello update
remote: Hello post-receive
To ssh://gitolite3@yebisu/public/program/HelloClosureLibrary
79615f9..a209006  master -> master

成功 (2433 ms @ 2014/10/05 17:13:39)


2014年8月16日土曜日

GitWeb で、リポジトリを参照できるように、設定してみる。

概要

GitWeb を利用して、以下のような条件で、リポジトリを Web で参照できるように、設定してみた。

  • Gitolite3 管理用リポジトリは、公開対象から除外する。
  • Gitolite3 管理用リポジトリで、公開設定が行える。

参考サイト




利用ソフト

  • Apache2 (2.4.7-1ubuntu4.1)
  • git (1:1.9.1-1)
  • Gitolite3 (3.5.3.1-2)
  • GitWeb (1:1.9.1-1)


前提条件

Ubuntu 14.04 上で、設定を行った。
Apache2 および git は、インストール済みとする。

Gitolite

Gitolite3 のインストールおよび設定は、以下のサイトを参考に行った。
Gitolite3 パッケージ名は、gitolite3 と、指定する必要があるので注意。gitolite は、バージョン2.3で古かった。
Gitolite3 ユーザーは、パッケージインストール時、/var/lib/gitolite3 に自動的に作成される。

Git管理の神ツール「Gitolite」なら、ここまでできる! (1/2)


GitWeb

インストール

sudo aptitude install gitweb
sudo a2enmod cgi

Apache2 の設定

まず、Apache の設定で、/etc/apache2/conf.d/gitweb がインストールされているが、場所もファイル名も間違っている。
sites-available に gitweb.conf とリネームして移動して、conf.d ディレクトリを削除する。
gitweb.conf の中身は、変更なし。

GitWeb の設定

次に、/etc/gitweb.conf を修正。
$projectroot には、Gitolite3 のリポジトリを指定。その他は、コメントインするだけ。
sudo vi /etc/gitweb.conf

$projectroot = "/var/lib/gitolite3/repositories";
$git_temp = "/tmp";
$home_text = "indextext.html";
$projects_list = $projectroot;
@stylesheets = ("static/gitweb.css");
$javascript = "static/gitweb.js";
$logo = "static/git-logo.png";
$favicon = "static/git-favicon.png";
@diff_opts = ();

リポジトリパーミッションの設定

このままでは、www-data ユーザで、Gitolite3 のリポジトリにアクセスする権限が無いので、その設定を行う。
sudo gpasswd -a www-data gitolite3
sudo chmod g+rx /var/lib/gitolite3
sudo chmod g+r /var/lib/gitolite3/projects.list
sudo chmod -R g+r /var/lib/gitolite3/repositories
sudo find /var/lib/gitolite3/repositories -type d -exec chmod g+x {} +


新規にリポジトリを追加する場合に、グループ読み取り可になるようパーミッションを設定。
sudo vi /var/lib/gitolite3/.gitolite.rc
    UMASK                           =>  0077,
                                                 ↓ 変更
    UMASK                           =>  0027,


Apache2 をリスタート
sudo apache2ctl restart


以上の設定で、すべてのリポジトリが公開できる。

公開リポジトリ設定

このままでは、管理用リポジトリも一覧に出てしまうので、指定したものだけリストアップされるように設定。

sudo vi /etc/gitweb.conf

$projects_list = $projectroot;
  ↓ 変更
$projects_list = "/var/lib/gitolite3/projects.list";

以下追加。一覧にあるリポジトリ以外は、直接 URL を指定しても表示されなくなる。
$strict_export = "true";


上記で指定した project.list ファイルには、Gitolite3 で @all または、gitweb に参照権限を付与したプロジェクトが、リストアップされる。
Gitolite3 管理リポジトリの gitolite-admin/conf/gitolite.conf ファイルを、以下のように変更して push すると、project.list ファイルに、公開リポジトリが書き込まれる。

repo  foobar
    R    =    gitweb

2014年6月15日日曜日

【備忘録】eclipse の JUnit や DDMS などでコネクションエラーが発生する問題

eclipse で JUnit を実行した場合や、DDMS のログに、コネクションエラーが出力されるようになってしまった。

発端は、ネットワークアダプタのドライバを、アンインストールして、インストールしたこと、もしくは、不要な”ローカル エリア接続”を、レジストリから削除して、名前を変更したからかもしれない。

もちろん、それまでは、普通に動作していたし、変更後も同じ条件で動作させた。

Google 先生に聞いたところ、どうやら JavaVM が、IPV6 で通信を行ってしまうかららしい。
ちなみに、現在の環境では、IPV6 は、設定で無効にしている。

しかし、何を基準に切り替えているのか不明・・・

以下のオプションを Java の実行時パラメータに追加すると、現象が発生しなくなった。

-Djava.net.preferIPv4Stack=true


追加する箇所は、Java を起動している、以下のような場所。
・eclipse.ini
・「Window」⇒「Preferences」⇒「Java」⇒「Installed JREs」で、インストールされている Java を選択して、「Edit」ボタンを押下。「Default VM arguments」
・プラグインや、プロジェクト毎に、java の環境を設定している場合の VM オプション。
等々。


最後に、起きた現象を記載しておく。

DDMS は、「Failed to initialize Monitor Thread: Unable to establish loopback connection」というダイアログが開く。
後は、Console ビューに、
[2014-06-15 14:55:21 - DeviceMonitor] Connection attempts: 1
[2014-06-15 14:55:23 - DeviceMonitor] Connection attempts: 2
[2014-06-15 14:55:24 - DeviceMonitor] Connection attempts: 3
・・・
など、ずっとエラー表示され続ける。

JUnit の場合は、テストケースを実行すると、しばらくしてから、以下のようなエラーがでる。
Could not connect to:  : 64389
java.net.SocketException: Invalid argument: connect
at java.net.DualStackPlainSocketImpl.connect0(Native Method)
at java.net.DualStackPlainSocketImpl.socketConnect(DualStackPlainSocketImpl.java:79)
at java.net.AbstractPlainSocketImpl.doConnect(AbstractPlainSocketImpl.java:339)
at java.net.AbstractPlainSocketImpl.connectToAddress(AbstractPlainSocketImpl.java:200)
at java.net.AbstractPlainSocketImpl.connect(AbstractPlainSocketImpl.java:182)
at java.net.PlainSocketImpl.connect(PlainSocketImpl.java:172)
at java.net.SocksSocketImpl.connect(SocksSocketImpl.java:392)
at java.net.Socket.connect(Socket.java:579)
at java.net.Socket.connect(Socket.java:528)
at java.net.Socket.(Socket.java:425)
at java.net.Socket.(Socket.java:208)
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.connect(RemoteTestRunner.java:570)
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.run(RemoteTestRunner.java:381)
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.main(RemoteTestRunner.java:197)


2014年5月25日日曜日

【超個人的備忘録】読んでも意味無いよ。タブン・・・

POM

コンパイラーバージョン設定

<plugin>
  <artifactId>maven-compiler-plugin</artifactId>
  <version>3.1</version>
  <configuration>
    <source>1.7</source>
    <target>1.7</target>
  </configuration>
</plugin>

文字コード設定

<properties>
  <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
  <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
</properties>

ソースディレクトリ設定

<plugin>
  <groupId>org.codehaus.mojo</groupId>
  <artifactId>build-helper-maven-plugin</artifactId>
  <version>1.8</version>
  <executions>
    <execution>
      <id>add-source</id>
      <phase>generate-sources</phase>
      <goals>
        <goal>add-source</goal>
      </goals>
      <configuration>
        <sources>
          <source>src/main/java</source>
        </sources>
      </configuration>
    </execution>
  </executions>
</plugin>

2014年5月21日水曜日

【備忘録】Ubuntu 13.10 環境でアップデートしたら KVM 仮想環境が起動しなくなった

いつも通り、アップデートしたら、KVM 仮想環境が起動しなくなった。
virsh start yebisu とかやると、以下のようなエラーで、起動しない。

エラー: ドメイン yebisu の起動に失敗しました
エラー: internal error: process exited while connecting to monitor: W: kvm binary is deprecated, please use qemu-system-x86_64 instead
char device redirected to /dev/pts/2 (label charserial0)
Could not access KVM kernel module: Permission denied
failed to initialize KVM: Permission denied


どうやら、/usr/bin/kvm 実行ファイルが非推奨となり、代わりに /usr/bin/qemu-system-x86_64 を使え、というメッセージらしい。
メッセージ通りに、仮想環境の設定を変更する。

virsh edit yebisu
で設定を変更できる。XML 該当部分を以下のように書き換えて、保存する。

<emulator>/usr/bin/kvm</emulator>
<emulator>/usr/bin/qemu-system-x86_64</emulator>



再び、virsh start yebisu とやって、仮想環境を起動しようとしたら、またエラーになった。

エラー: ドメイン yebisu の起動に失敗しました
エラー: internal error: process exited while connecting to monitor: char device redirected to /dev/pts/2 (label charserial0)
Could not access KVM kernel module: Permission denied
failed to initialize KVM: Permission denied

こっちは、悶絶した。解決方法も、正しいかは分からない。
仮想環境を起動するユーザーを kvm グループに追加することで、動くようになった。

user1 を kvm グループに追加
sudo gpasswd -a user1 kvm

一度ログアウトして、再度ログインする。
さもないと、グループ設定が有効にならない。

kvm グループに追加されていることを確認
groups
user1 adm cdrom sudo dip plugdev kvm sambashare lpadmin libvirtd


仮想環境を起動。
3度目の正直で起動できた。
virsh start yebisu
ドメイン yebisu が起動されました


2014年3月20日木曜日

【備忘録】net usershare add でのマウント方法

net usershare add の備忘録。

$ net usershare add www /var/cache/munin/www guest_ok=y

2014年1月11日土曜日

【備忘録】Ubuntu 13.10 の KVM 仮想環境上に PT3 と epgrec による録画環境の構築実験(パススルー非使用版)

以前の  【備忘録】Ubuntu 13.10 の KVM 仮想環境上に PT3 と epgrec による録画環境の構築実験(失敗) にて、 AMD-Vi パススルーで PT3 を動かす野望は潰えたのだが、諦めない、ネヴァーギヴアップ!

というわけで、別の方法を模索してみた。
基本戦略としては、epgrec をゲストで動作させ、ICカードリーダー、PT3 および recpt1 をホストで動作させる。
ゲストから、ssh 接続経由で、ホストの recpt1 を呼び出して、録画を行う。


環境
MB:GIGABYTE GA-990FXA-UD5(IOMMU 対応)
CPU:AMD Phenom II X4 955 Black Edition
MEM:8G
HDD:Seagate 2TB X 1(システム用)、2TB X 4(KVM ストレージプール用)
OS:Ubuntu Server 13.10 amd64
ICカードリーダー:PLEX PX-ICCR01
アースソフト PT3 Rev.A

ホストOSをインストール

Ubuntu のインストーラを起動
システム用 HDD 28GB の領域に LVM 構成で自動パーティショニングを行った。
以下のインストールソフトウェアを選択
Basic Ubuntu server
OpenSSH server
Samba file server
Virtual Machine host
Ubuntu desktop

アップデート
sudo aptitude update
sudo aptitude full-upgrade

必要なパッケージをインストール
sudo aptitude install ssh mdadm git build-essential libtool automake paco

リンカが gold になるように設定

もう少し言うと、通常のリンカと簡単に切り替え可能にし、gold の優先度を高く設定して、自動的に gold が有効になる、ということ。
sudo update-alternatives --install /usr/bin/ld ld /usr/bin/ld.bfd 1
sudo update-alternatives --install /usr/bin/ld ld /usr/bin/ld.gold 2
update-alternatives --display ld

作業用のパーティション作成

システム用 HDD の残り VG 領域に、作業用パーティションを作成。
sudo lvcreate --name=work --extents=100%FREE phenom-vg
sudo mkfs.ext4 /dev/phenom-vg/work
sudo lvs

パーティションの UUID を調べる
sudo blkid
/dev/mapper/phenom--vg-work: UUID="5ed97836-21ce-49b5-a92a-66b3ca75a12a" TYPE="ext4"

sudo vi /etc/fstab
末尾に追加
UUID=5ed97836-21ce-49b5-a92a-66b3ca75a12a    /mnt/work    ext4    rw    0    2

マウント先を作成
sudo mkdir /mnt/work
sudo chmod 777 /mnt/work

マウント
sudo mount /mnt/work

カードリーダーの設定

パッケージをインストール sudo aptitude install pcscd libpcsclite-dev pcsc-tools
カードリーダーの動作チェック
pcsc_scan

PT3 ドライバのインストール

ドライバをビルド

git clone http://github.com/m-tsudo/pt3.git
cd pt3
make clean
make
sudo paco -lp pt3-driver "make install"

ドライバを組み込む

sudo modprobe pt3_drv

因みに、以下のようにパラメータを渡すとデバッグレベルを指定できる
sudo modprobe pt3_drv debug=7

渡すことの出来るパラメータなどは、ソースの README を確認するか、以下のように調べる。
modinfo pt3_drv
filename:       /lib/modules/3.11.0-15-generic/kernel/drivers/video/pt3_drv.ko
license:        GPL
description:    PCI Earthsoft PT3 driver
author:         anyone
srcversion:     0A1D05542951609033BEAFC
alias:          pci:v00001172d00004C15sv*sd*bc*sc*i*
depends:
vermagic:       3.11.0-15-generic SMP mod_unload modversions
parm:           debug:debug level (0-7) (int)
parm:           lnb:LNB level (0:OFF 1:+11V 2:+15V) (int)

ドライバの動作確認

dmesg | grep -i pt3
[ 2954.181817] pt3_drv: module verification failed: signature and/or required key missing - tainting kernel
[ 2954.186493] PT3: pt3_drv 0.0.1rev99 2013-08-05
[ 2954.186592] pt3_drv 0000:04:00.0: enabling device (0000 -> 0002)
[ 2954.186736] PT3: Bus Mastering Enabled.
[ 2955.392717] PT3: device[0]=          (null)
[ 2955.394590] PT3: card_number=0 channel=0
[ 2955.396751] PT3: card_number=0 channel=1
[ 2955.398812] PT3: card_number=0 channel=2
[ 2955.400922] PT3: card_number=0 channel=3

デバイスファイルが存在することを確認

ls -la /dev/pt3*
crw-rw-rw- 1 root video 250, 0  1月  6 23:39 /dev/pt3video0
crw-rw-rw- 1 root video 250, 1  1月  6 23:39 /dev/pt3video1
crw-rw-rw- 1 root video 250, 2  1月  6 23:39 /dev/pt3video2
crw-rw-rw- 1 root video 250, 3  1月  6 23:39 /dev/pt3video3

arib25 のインストール

wget http://hg.honeyplanet.jp/pt1/archive/c44e16dbb0e2.zip
unzip c44e16dbb0e2.zip
cd pt1-c44e16dbb0e2/arib25
make clean
make
sudo paco -lp arib25 "make install"

recpt1 のインストール

git clone http://github.com/stz2012/recpt1.git stz_recpt1
cd stz_recpt1/recpt1
./autogen.sh


この環境では、以下のように、なぜか libarib25 を見つけられずにビルドが失敗する。
./configure --enable-b25
checking for create_arib_std_b25 in -larib25... no
configure: WARNING: libarib25 is not available.

make
gcc -O2 -g -pthread -I../driver -Wall -D_LARGEFILE_SOURCE -D_FILE_OFFSET_BITS=64  -c -o decoder.o decoder.c
In file included from decoder.c:4:0:
decoder.h:26:5: error: unknown type name ‘uint8_t’
make: *** [decoder.o] エラー 1

しょうがないので、応急手当。
vi Makefile.in
LDFLAGS  =
LDFLAGS  = @LDFLAGS@


LDFLAGS="-L/usr/local/lib" ./configure --enable-b25
make clean
make
sudo paco -lp recpt1 "make install"

動作確認

recpt1 --b25 --strip 27 20 test.ts


KVM 環境構築

必要なパッケージをインストール

以下のパッケージは、インストール時に選択したパッケージに含まれるもの。よって、インストール済みなはず。
sudo aptitude install kvm bridge-utils qemu-kvm-spice

以下のパッケージは、新規にインストールする必要があるもの。
sudo aptitude install virt-manager qemu-system virt-viewer spice-client spice-client-gtk python-spice-client-gtk guestfish libguestfs-tools

qemu-kvm-spice と spice-client は、SPICE (VNCのようなもの)で接続ために必要。
guestfish と libguestfs-tools は、ゲストのストレージをあれこれ操作するために必要。
guestfish コマンドとか virt-rescue コマンドなどで、バックアップや、レスキューができる。

ログインユーザーの補助グループに libvirtd を追加

sudo usermod $(whoami) -a -G libvirtd
cat /etc/group | grep libvirtd

再起動する。
再起動をしないと、virt-manager 起動時に「libvirt に接続できませんでした」と怒られる。

仮想ブリッジを定義

sudo vi /etc/network/interfaces
# This file describes the network interfaces available on your system
# and how to activate them. For more information, see interfaces(5).
# The loopback network interface
auto lo
iface lo inet loopback
# The primary network interface
#NetworkManager#auto eth0
#NetworkManager#iface eth0 inet dhcp
# ここから追加
auto eth0
iface eth0 inet manual
up /sbin/ifconfig eth0 promisc
auto br0
iface br0 inet dhcp
bridge_ports eth0
bridge_stp off
bridge_maxwait 1

ネットワーク設定を有効化

sudo service networking restart

確認
ifconfig -a
br0       Link encap:イーサネット  ハードウェアアドレス 00:24:8c:52:c1:65
          inetアドレス:192.168.1.102  ブロードキャスト:192.168.1.255  マスク:255.255.255.0
          inet6アドレス: fe80::224:8cff:fe52:c165/64 範囲:リンク
          UP BROADCAST RUNNING MULTICAST  MTU:1500  メトリック:1
          RXパケット:58 エラー:0 損失:0 オーバラン:0 フレーム:0
          TXパケット:89 エラー:0 損失:0 オーバラン:0 キャリア:0
          衝突(Collisions):0 TXキュー長:0
          RXバイト:5686 (5.6 KB)  TXバイト:15970 (15.9 KB)
eth0      Link encap:イーサネット  ハードウェアアドレス 00:24:8c:52:c1:65
          UP BROADCAST RUNNING PROMISC MULTICAST  MTU:1500  メトリック:1
          RXパケット:29029 エラー:0 損失:0 オーバラン:0 フレーム:0
          TXパケット:8515 エラー:0 損失:0 オーバラン:0 キャリア:3
          衝突(Collisions):0 TXキュー長:1000
          RXバイト:22073164 (22.0 MB)  TXバイト:762722 (762.7 KB)
lo        Link encap:ローカルループバック
          inetアドレス:127.0.0.1  マスク:255.0.0.0
          inet6アドレス: ::1/128 範囲:ホスト
          UP LOOPBACK RUNNING  MTU:16436  メトリック:1
          RXパケット:190 エラー:0 損失:0 オーバラン:0 フレーム:0
          TXパケット:190 エラー:0 損失:0 オーバラン:0 キャリア:0
          衝突(Collisions):0 TXキュー長:0
          RXバイト:22165 (22.1 KB)  TXバイト:22165 (22.1 KB)
virbr0    Link encap:イーサネット  ハードウェアアドレス d2:c4:a1:7e:c2:82
          inetアドレス:192.168.122.1  ブロードキャスト:192.168.122.255  マスク:255.255.255.0
          UP BROADCAST MULTICAST  MTU:1500  メトリック:1
          RXパケット:0 エラー:0 損失:0 オーバラン:0 フレーム:0
          TXパケット:0 エラー:0 損失:0 オーバラン:0 キャリア:0
          衝突(Collisions):0 TXキュー長:0
          RXバイト:0 (0.0 B)  TXバイト:0 (0.0 B)


不要なネットワーク設定を無効化

virbr0 は、KVM をインストールすると自動的に作成される。
外部から接続するような場合には、上記で作成した仮想ブリッジの方が便利なようなので、virbr0 を無効化しておく。

定義の確認
virsh net-list
virsh net-dumpxml default

停止
virsh net-destroy default

自動起動を停止
virsh net-autostart default --disable

確認
virsh net-list --all

ゲストOS 格納用ストレージプール作成

ストレージプールは、LVM 上に確保する。
LVM に利用するストレージは、RAID10 構成とする。

パーティションを作成

sudo parted /dev/sdb
(parted) mktable gpt
(parted)  mkpart disk0 0% 100%
(parted) set 1 raid on

(parted) quit

mkpart で、開始を 1 にしているのは、
同じように全ドライブにパーティションを作成

RAID10 作成

sudo mdadm --create /dev/md0 --level=10 --raid-devices=4 /dev/sd[b-e]
mdadm: /dev/sdb1 appears to contain an ext2fs file system
    size=975872K  mtime=Thu Oct 24 11:51:29 2013
mdadm: /dev/sdc1 appears to contain an ext2fs file system
    size=975872K  mtime=Thu Jan  1 09:00:00 1970
mdadm: /dev/sdd1 appears to contain an ext2fs file system
    size=975872K  mtime=Thu Jan  1 09:00:00 1970
mdadm: /dev/sde1 appears to contain an ext2fs file system
    size=975872K  mtime=Thu Jan  1 09:00:00 1970
Continue creating array? y
mdadm: Defaulting to version 1.2 metadata
mdadm: array /dev/md0 started.

RAID の状態を確認
cat /proc/mdstat
Personalities : [linear] [multipath] [raid0] [raid1] [raid6] [raid5] [raid4] [raid10]
md0 : active raid10 sde[3] sdd[2] sdc[1] sdb[0]
      3906765824 blocks super 1.2 512K chunks 2 near-copies [4/4] [UUUU]
      [....................]  resync =  0.1% (6511360/3906765824) finish=319.4min speed=203480K/sec

Physical Volume 作成

sudo pvcreate /dev/md0
  Physical volume "/dev/md0" successfully created

Volume Group 作成

sudo vgcreate vg0 /dev/md0
  Volume group "vg0" successfully created

Logical Volume は、KVM ゲスト作成時に自動的に作成されるので、ここでは作成しなくてよい。


KVM ゲスト用ストレージプール作成
virsh pool-define-as pool logical - - - vg0 /dev/vg0
プール pool が定義されました

virsh pool-autostart pool
プール pool が自動起動としてマークされました

virsh pool-start pool
プール pool が起動されました

virsh pool-list --all
名前               状態     自動起動
-----------------------------------------
pool                動作中  はい (yes)

録画ファイル保存用ストレージを作成

Logical Volume 作成

前述のストレージプール用に作成した Volume Group に作成する。
容量は 3TB とする。
sudo lvcreate --name=record-video --size=3t vg0
sudo mkfs.ext4 /dev/vg0/record-video

ゲストOS インストール

前回、散々コンソールでインストールをしたので、今回は GUI で楽をすることにした。

ubuntu のインストールイメージファイルを /mnt/work にコピーしておく。
共有作成メモ:
net usershare add work /mnt/work "work" "Everyone:F" guest_ok=y
net usershare list
net usershare delete work


ホストで virt-manager をログインユーザー権限で起動。
virt-manager

新しい仮想マシンを作成する。

ステップ1

名前:record
ローカルインストールメディアからインストール。

ステップ2

ISO イメージに /mnt/work にコピーしたイメージファイルを指定。
OS の種類:Linux
バージョン:Ubuntu 13.10 (Saucy Salamander)

ステップ3

メモリー:2048
CPU:4

ステップ4

管理しているストレージか、他の既存のストレージを選択する
参照ボタン押下
「Storage Pools」から pool を選択
新規ボリュームボタンを押下
名前:record
最大容量:20480 MB
割り当て:20480 MB
完了ボタン押下
作成した record ボリュームを選択
ボリュームを選択ボタンを押下

ステップ5

インストールの前に設定をカスタマイズするをチェック

グラフィックを Spice に切り替え

ディスプレイ VNC を選択
種類:Spice
パスワード:任意のパスワード(未設定でも可)
キーマップ:ja
適用ボタン押下
チャンネルを add したいですか?に 「はい」ボタン押下

インストールの開始ボタンを押下

日本語を選択
Ubuntu Serverをインストールを選択
選択された言語では完全ではありません。と言われるが、「はい」
あとは、日本か日本語を選択

ホスト名:record
ユーザ、パスワードは任意
ホームディレクトリを暗号化しますか?:いいえ
タイムゾーン Asia/Tokyo:はい
ガイド - ディスク全体を使い LVM をセットアップするを選択

自動的にアップデートしないを選択

インストールするソフトウェアは以下のものを選択
OpenSSH server
Samba file server

インストールが完了したら、ゲストを停止する。

録画ファイル保存用ストレージを追加

※仮想マシンの作成時にやろうとしたが、定義が重複してるだのヌカスノデ・・・

仮想マシンの情報を表示ボタンを押下
ハードウェアを追加ボタンを押下
Storage を選択
管理しているストレージか、他の既存のストレージを選択する
参照ボタンを押下
pool を選択
record-video (/dev/vg0/record-video) を選択
ボリュームを選択ボタンを押下
デバイスの種類:Virtio disk
キャッシュモデル:writethrough
ストレージ形式:raw
完了ボタン押下

ゲストを起動する

ゲストに必要なパッケージをインストール

参考:ubuntu13.10+pt3+epgrecの環境構築

システムを更新

sudo aptitude update
sudo aptitude full-upgrade

開発関連のパッケージをインストール

sudo aptitude install git automake build-essential libtool binutils-gold paco

リンカが gold になるように設定

sudo update-alternatives --install /usr/bin/ld ld /usr/bin/ld.bfd 1
sudo update-alternatives --install /usr/bin/ld ld /usr/bin/ld.gold 2
update-alternatives --display ld

epgrec 関連のパッケージをインストール

sudo aptitude install apache2 php5 mysql-server mysql-client php5-mysql libav-tools


念のため、ゲストを再起動しておく

recpt1 に関する設定

今回のこの方法は、セキュリティ的にヨロシクナイ。
河豚は食いたし、命は惜しし。

公開鍵認証の設定

www-data ユーザが、ssh 接続をする場合に、コマンド入力を発生させないよう、公開鍵認証方式でホストに接続できるようにする。
接続先ホスト:192.168.1.104
接続先ユーザ:user1
秘密鍵:/var/www/.ssh/id_rsa
公開鍵:/var/www/.ssh/id_rsa.pub

鍵の格納先を作成

sudo mkdir /var/www/.ssh
sudo chmod 700 /var/www/.ssh
sudo chown www-data:www-data /var/www/.ssh

鍵を作成

sudo -H -u www-data /usr/bin/ssh-keygen -N "" -t rsa

公開鍵をホスト側に設定

sudo -H -u www-data /usr/bin/ssh-copy-id user1@192.168.1.104

接続確認

sudo -H -u www-data /usr/bin/ssh -oStrictHostKeyChecking=no user1@192.168.1.104 ls

recpt1 のラッパー作成

ホスト側の recpt1 を ssh 経由で呼び出すラッパーコマンドを作成する。

sudo touch /usr/local/bin/recpt1
sudo chmod 755 /usr/local/bin/recpt1

sudo vi /usr/local/bin/recpt1
#!/bin/bash

SSH=/usr/bin/ssh
SSH_OPT=-oStrictHostKeyChecking=no
REMOTE_USER=user1
REMOTE_HOST=192.168.1.104
REMOTE_CMD=/usr/local/bin/recpt1

cmd_opt="$@"

if [ 3 -le $# ]; then
  # 引数が 3 つ以上の場合
  # 最後の引数を出力ファイルとして取得
  outfile=${*:$#}
  if [ - != ${outfile:0:1} ]; then
    # 出力ファイルの先頭1文字が - でない場合
    # 最後の引数以外を取り出し、出力ファイルにリダイレクト
    cmd_opt="${@:1:$#-1} - > '$outfile'"
  elif [ 2 -le ${#outfile} ]; then
    echo 最後の引数は、出力ファイルを指定して下さい。 1>&2
    exit 1
  fi
fi

# コマンドを実行(:? は、値が設定されていない場合エラーとなる指定)
eval ${SSH:?} $SSH_OPT $REMOTE_USER${REMOTE_USER:+@}${REMOTE_HOST:?} ${REMOTE_CMD:?} $cmd_opt

動作確認

sudo -H -u www-data /usr/local/bin/recpt1 27 10 /tmp/test.ts

ls -la /tmp/test.ts
-rw-r--r-- 1 www-data www-data 21561344  1月 11 10:05 /tmp/test.ts

sudo rm /tmp/test.ts

epgdump のインストール

git clone http://github.com/stz2012/epgdump.git stz_epgdump
cd stz_epgdump
make clean
make
sudo paco -lp epgdump "make install"

epgrec のインストール

at コマンドを epgrec から利用できるように設定

sudo vi /etc/at.deny
以下の行を削除
www-data

MySQL の設定

文字コードを UTF-8 に設定。

以前アップデートした時に、文字化けして痛い目を見たので、設定しておくことにする。
sudo vi /etc/mysql/my.cnf
[client] および [mysqld] に以下の設定を追加する。

[client]
default-character-set = utf8

[mysqld]
character-set-server = utf8

MySQL の再起動

sudo service mysql restart

設定の確認

mysql -u root -p
mysql> show variables like 'character_set%';
+--------------------------+----------------------------+
| Variable_name                  | Value                                |
+--------------------------+----------------------------+
| character_set_client           | utf8                           |
| character_set_connection   | utf8                            |
| character_set_database      | utf8                           |
| character_set_filesystem    | binary                         |
| character_set_results         | utf8                           |
| character_set_server         | utf8                           |
| character_set_system        | utf8                           |
| character_sets_dir             | /usr/share/mysql/charsets/ |
+--------------------------+----------------------------+
8 rows in set (0.00 sec)

データベースおよびユーザ作成

mysql> create database epgrec;
mysql> grant all on epgrec.* to epgrec@localhost identified by 'パスワードをここに記述'; mysql> flush privileges;

epgrec をダウンロード

cd /var/www
sudo git clone http://github.com/stz2012/epgrec.git epgrec

録画ファイル保存用ストレージのマウント設定

マウントディレクトリ内のファイルを削除

sudo rm /var/www/epgrec/video/*

UUID を調べる

sudo blkid
/dev/vdb: UUID="9e7ef31a-a571-44be-94c8-fa8e5b124f2e" TYPE="ext4"

fstab に追加

sudo vi /etc/fstab
UUID=9e7ef31a-a571-44be-94c8-fa8e5b124f2e /var/www/epgrec/video  ext4  defaults  0  2

マウント

sudo mount /var/www/epgrec/video

video ディレクトリ内のファイルを元に戻す

cd /var/www/epgrec
sudo git checkout .

epgrec の設定

cd /var/www
sudo chown -R www-data:www-data ./epgrec
cd epgrec
sudo cp do-record.sh.pt1 ./do-record.sh
sudo chown www-data:www-data do-record.sh
sudo chmod 755 do-record.sh
sudo chmod 777 cache settings templates_c thumbs video
sudo chmod 666 thumbs/index.html video/index.html
sudo cp config.php.sample config.php

sudo vi config.php
以下のように変更した。ただし、地域が変われば設定も変わる。
--- config.php.sample   2014-01-07 20:53:30.667557000 +0900
+++ config.php  2014-01-07 20:51:59.699557000 +0900
@@ -14,9 +14,10 @@
        "GR24" => "24",         // テレ朝
        "GR23" => "23",         // テレ東
 //     "GR20" => "20",         // MX TV
-//     "GR18" => "18",         // テレ神
-       "GR30" => "30",         // 千葉
-//     "GR32" => "32",         // テレ玉
+       "GR20" => "16",         // MX TV
+       "GR18" => "18",         // テレ神
+//     "GR30" => "30",         // 千葉
+       "GR32" => "32",         // テレ玉
        "GR28" => "28",         // 大学
 );

定期的に番組表を取得するクーロンを設定

sudo cp /var/www/epgrec/cron.d/getepg  /etc/cron.d

2箇所の php.ini を同様に編集

sudo vi /etc/php5/cli/php.ini
sudo vi /etc/php5/apache2/php.ini

以下の行をコメントアウト
disable_functions = pcntl_alarm,pcntl_fork,pcntl_waitpid,pcntl_wait,・・・・・

;disable_functions = pcntl_alarm,pcntl_fork,pcntl_waitpid,pcntl_wait,・・・・・

以下の行をコメントインして値を設定
;date.timezone =

date.timezone = "Asia/Tokyo"

Apache のデフォルト文字コードを UTF-8 に設定

sudo vi /etc/apache2/conf-available/charset.conf
#AddDefaultCharset UTF-8
AddDefaultCharset UTF-8


Apache を再起動

sudo service apache2 restart

ブラウザで接続

http://record/epgrec

次の画面での設定
変更した箇所だけ列挙する。
MySQL接続ユーザー名:epgrec
MySQL接続パスワード:データベース作成時に設定したパスワード
使用データベース名:epgrec
インストールURL:http://サーバー名/epgrec
サムネールの使用:使用する
ffmpegのパス:/usr/bin/avconv

設定を保存するボタンを押下

次の画面の設定は、好みに応じて適宜行うこと。

さらに進めて、EPG の初回受信を行う。
画面の説明で、cron の設定について書いてあるが、前述の設定で既に設定済みとなっている。

EPG 受信の手動実行方法
初回受信で失敗した場合、手動で実行してみる。
sudo -H -u www-data /var/www/epgrec/getepg.php


これで、設定はすべて完了。





おまけ

番組表表示で、チャンネルの並び順が、お気に召さなかったので、ちょっとパッチをした。
stz 版のソート順は、sid の昇順となっているようだ。

チャンネルテーブルにソート順カラムを追加
mysql -u epgrec -D epgrec -p
ALTER TABLE Recorder_channelTbl ADD sort INT(6) NOT NULL DEFAULT 500;

ソースにパッチ
sudo vi /var/www/epgrec/index.php
 45 // チャンネルマップ
 46 $tmprec = new DBRecord(CHANNEL_TBL);
-47 $recarr = $tmprec->fetch_array( "type", $type, "id > 0 ORDER BY sid+0 ASC" );
+47 $recarr = $tmprec->fetch_array( "type", $type, "id > 0 ORDER BY sort, sid+0" );

お好みのソート順を設定
TOKYO MX, tvk1, テレビ東京, テレ玉
UPDATE Recorder_channelTbl SET sort = 100 WHERE type = 'GR' AND channel IN ('16', '18', '23','32');

フジテレビ, TBS, テレビ朝日, 日テレ
UPDATE Recorder_channelTbl SET sort = 200 WHERE type = 'GR' AND channel IN ('21', '22', '24', '25');

放送大学
UPDATE Recorder_channelTbl SET sort = 1000 WHERE type = 'GR' AND channel = '28';


2014年1月8日水曜日

【備忘録】Ubuntu 13.10 の KVM 仮想環境上に PT3 と epgrec による録画環境の構築実験(失敗)

【2014/01/08】現時点では、実験に失敗している。
PT3 ドライバか recpt1 が正常に動作していないようだ。
手順の問題なのか、仮想環境の問題なのか、今のところ調べ切れていない。
いつかまた、再実験のために、この記録を公開しておく。

我が屍を超えてゆけ!!!

環境

MB:GIGABYTE GA-990FXA-UD5(IOMMU 対応)
CPU:AMD Phenom II X4 955 Black Edition
MEM:8G
HDD:Seagate 2TB X 1(システム用)、2TB X 4(KVM ストレージプール用)
OS:Ubuntu 13.10 Server amd64
ICカードリーダー:PLEX PX-ICCR01
アースソフト PT3 Rev.A

2014年1月7日火曜日

【備忘録】 tmux の設定ファイル(オレオレ仕様)

.tmux.conf
#
# tmux 設定
#

# プレフィックス変更
#set-option -g prefix C-z
#bind-key C-z send-prefix
#unbind-key C-b

# バックスクロール行数
set-option -g history-limit 10000

# シェル指定
set-option -g default-shell /bin/bash
set-option -g default-command /bin/bash

# ペイン開始番号
set-option -g base-index 1

# -r の連続入力待機ミリ秒(Default 500)
set-option -g repeat-time 1000

# ターミナルを 256 色モードに変更
set-option -g default-terminal screen-256color

# コピーモードを vi モードに変更
setw -g mode-keys vi

# 文字コード
set-window-option -g utf8 on
set-window-option -g status-utf8 on
# PuTTY の場合は、以下は OFF がいいらしい
set-option -g mouse-utf8 off

# pre + r で設定ファイル再読み込み
bind r source-file ~/.tmux.conf \; display-message "Reloaded config !!"

# マウス操作設定
set-option -g mode-mouse off
set-option -g mouse-select-pane off
set-option -g mouse-resize-pane off
set-option -g mouse-select-window off
bind-key m \
    set -g mode-mouse on \; \
    set -g mouse-select-pane on \; \
    set -g mouse-resize-pane on \; \
    set -g mouse-select-window on \; \
    display "Mouse: ON"
bind-key M \
    set -g mode-mouse off \; \
    set -g mouse-select-pane off \; \
    set -g mouse-resize-pane off \; \
    set -g mouse-select-window off \; \
    display "Mouse: OFF"

#
# ステータスバー
#

# 更新間隔(default 15)
set-option -g status-interval 10

# 最大長(default:left 10, right 40)
set-option -g status-left-length 30
set-option -g status-right-length 60

# 表示と色
set -g status-right "[#h# ] %Y/%m/%d %H:%M"
set -g status-bg colour144
set -g status-fg black
set -g status-left-bg magenta
set -g status-left-fg black
set -g status-right-bg cyan
set -g status-right-fg black

#
# ペイン
#

# 区切り線のスタイル
set -g pane-active-border-bg green
set -g pane-active-border-fg red
set -g pane-border-bg colour7
set -g pane-border-fg black
setw -g window-status-current-fg blue

2013年10月30日水曜日

【備忘録】GPT(GUID Partition Table)で Ubuntu 12.04 64bit システムディスクをパーティショニングする。

完全なる備忘録。

GPT でのパーティショニングが、よくわからないので、適当にやってみた。


インストーラーでパーティショニング

最初は、Ubuntu 12.04 Desktop 64bit インストーラー(ubuntu-12.04.3-desktop-amd64.iso)を使用したパーティショニングを行ってみた。
マザーボードは、GIGABYTE GA-990FXA-UD5 で、BIOSは AMI EFI である。
したがって、UEFI BIOS 向けのパーティショニングとなる。
GPT でのパーティショニングとは関係ないが、諸所の事情で、光学ドライブが付いていないマシンにインストールするために、USB メモリにインストーラーを入れた。
手順は、先人の知恵である「USBメモリを使ってUbuntuをインストール No.2」をありがたく参考に、http://www.pendrivelinux.com/universal-usb-installer-easy-as-1-2-3/ から Universal USB Installer をダウンロードして利用した。ありがたや。

インストーラーを起動。
「Install Ubuntu」を選択
「日本語」を選択
「インストール中にアップデートをダウンロードする」および「サードパーティのソフトウェアをインストールする」にチェックを入れ、続ける(この2つは、入れても入れなくてもいいと思う)

「インストールの種類」の選択画面になったら、「それ以外」(説明は、”Ubuntu 向けに、自分でパーティションの作成やサイズ変更を行ったり、複数のパーティションを選択することもできます。”と書いてある)を選択して続ける

パーティション作成画面では、以下の手順でパーティション分けをする。
パーティションは、「EFI システムパーティション」、「ルートパーティション」および、「スワップパーティション」の3つが必須となる。

「/dev/sda」を選択
「新しいパーティションテーブル」ボタンを押下し、「続ける」ボタンを押下

「dev/sda」の「空き領域」を選択して、「追加」ボタンを押下
「新しいパーティションのサイズをメガバイト(1000000 バイト)単位で指定する」に 100(MB)と入力(35MB 以上必要らしい)
「新しいパーティションの場所」:先頭
「利用方法」:EFI システムパーティション
「OK」ボタンを押下


同じ要領で、以下の必須パーティションも作成する。

ルートパーティションを作成
「新しいパーティションのサイズをメガバイト(1000000 バイト)単位で指定する」に 10000(MB)
利用方法:ext4 ジャーナリングファイルシステム
マウントポイント:/

スワップパーティションを作成
利用方法:スワップ領域


必要なパーティションの作成が完了したら、「ブートローダをインストールするデバイス」に「/dev/sda」を選択して、「インストール」ボタンを押下


ここでは、以下のようにパーティションを作った。 sda は、500GB のHDD。ちなみに、空き領域は、勝手にできるようだ。
デバイス          タイプ        マウントポイント    フォーマット    サイズ      使用済み
/dev/sda
  空き領域                                                                    1MB
  /dev/sda1      efi                                                         98MB         不明
  /dev/sda2      ext4          /                       する              10000MB    不明
  /dev/sda3      ext4          /mnt/temp         する              488006MB   不明
  /dev/sda4      swap                                                     1999MB      0MB
  空き領域                                                                    1MB

あとは、最後までインストールして完了。

手動でパーティショニング

KVM 仮想環境上に MBR でインストールした Ubuntu 12.04 Alternate 64bit をそっくり移して、きちんと起動できるか確認した。
手動でパーティショニングする場合は、レガシー BIOS 向けなので、EFI BIOS 向けとパーティションの定義方法が異なるので注意。

ゲストイメージのストレージプールは、LVM 上に作成してある。

$ sudo lvs
  LV         VG   Attr   LSize   Origin Snap%  Move Log Copy%  Convert
  yebisu.img vg0  -wi-a-  10.00g

ロジカルボリュームをリネーム

$ sudo lvrename vg0 yebisu.img yebisu.img.bak
  Renamed "yebisu.img" to "yebisu.img.bak" in volume group "vg0"

新規ロジカルボリュームを作成

$ sudo lvcreate -L 10g -n yebisu.img vg0
  Logical volume "yebisu.img" created

ゲストボリュームに対するレスキューをするためのツールを起動(libguestfs-tools パッケージ)

$ sudo virt-rescue /dev/vg0/yebisu.img

新規ボリュームをパーティション分け
GPT の場合は、専用のパーティション(vda1)を作成して(本当に必要かどうか、いまいちわからない)、bios_grub フラグを立てる必要がある。

I have no name!@(none):/# parted /dev/vda
(parted) mktable gpt
(parted) mkpart non-fs 0cyl 2cyl
(parted) mkpart root 2cyl 8g
(parted) mkpart swap 8g -1
(parted) set 1 bios_grub on
(parted) print free
Model: Virtio Block Device (virtblk)
Disk /dev/vda: 10.7GB
Sector size (logical/physical): 512B/512B
Partition Table: gpt

Number  Start   End     Size    File system     Name    Flags
        17.4kB  1049kB  1031kB  Free Space
 1      1049kB  16.8MB  15.7MB                  non-fs  bios_grub
 2      16.8MB  8000MB  7983MB  ext4            root
 3      8000MB  10.7GB  2737MB  linux-swap(v1)  swap
        10.7GB  10.7GB  1032kB  Free Space

(parted) quit

パーティションをフォーマット

I have no name!@(none):/# mkfs.ext4 /dev/vda2
I have no name!@(none):/# mkswap /dev/vda3
I have no name!@(none):/# exit

ゲストボリュームににアクセスできるツールを起動(guestfish パッケージ)
ゲストのファイルシステムに対して、色々できる。
レスキューツールと似ていて、こちらでもパティショニングできるが、いまいち使いづらい。専用コマンドのマニュアルと睨めっこすれば、パティショニングから、フォーマットまでできる。

$ sudo guestfish -a /dev/vg0/yebisu.img.bak
> run
> list-filesystems
/dev/vda1: ext4
/dev/vda2: unknown
/dev/vda5: swap
> mount /dev/vda1 /

コピー元ファイルを tar ファイルに出力

> tar-out / bak.tar
> quit

カレントディレクトリに、bak.tar ファイルができているはず。

コピー先に tar ファイルを展開

$ sudo guestfish -a /dev/vg0/yebisu.img
> run
> list-filesystems
/dev/vda1: unknown
/dev/vda2: ext4
/dev/vda3: swap
> mount /dev/vda2 /
> tar-in bak.tar /
> quit

再びレスキューツールを起動

$ sudo virt-rescue /dev/vg0/yebisu.img

ゲストストレージに chroot

I have no name!@(none):/# mount /dev/vda2 /sysroot/
I have no name!@(none):/# mount -o bind /dev /sysroot/dev
I have no name!@(none):/# mount -o bind /proc /sysroot/proc
I have no name!@(none):/# mount -o bind /sys /sysroot/sys
I have no name!@(none):/# chroot /sysroot bash

UUID を調べる

root@(none):/# blkid /dev/vda2
/dev/vda2: UUID="8919796d-066a-4f12-adce-d2726c4c6ca1" TYPE="ext4"
root@(none):/# blkid /dev/vda3
/dev/vda3: UUID="1438a432-7db7-43af-a492-1c12f3677ed9" TYPE="swap"

上記で調べたルートおよびスワップドライブの UUID を書き換え

root@(none):/# vi /etc/fstab

上記で調べたスワップドライブの UUID を書き換え

root@(none):/# vi /etc/initramfs-tools/conf.d/resume

GRUB をインストール

root@(none):/# grub-install /dev/vda
Installation finished. No error reported.

GRUB 設定を更新

root@(none):/# update-grub
Generating grub.cfg ...
Found linux image: /boot/vmlinuz-3.5.0-42-generic
Found initrd image: /boot/initrd.img-3.5.0-42-generic
Found memtest86+ image: /boot/memtest86+.bin
[27740.000422] SGI XFS with ACLs, security attributes, realtime, large block/inode numbers, no debug enabled
[27740.015882] JFS: nTxBlock = 3834, nTxLock = 30672
[27740.056074] NTFS driver 2.1.30 [Flags: R/O MODULE].
[27740.079828] QNX4 filesystem 0.2.3 registered.
[27740.167927] Btrfs loaded
done

initramfs を更新

root@(none):/# update-initramfs -u -k all
update-initramfs: Generating /boot/initrd.img-3.5.0-42-generic

終了

root@(none):/# exit
exit
I have no name!@(none):/# exit
exit

ゲストを起動

$ virsh start --console yebisu
ドメイン yebisu が起動されました
ドメイン yebisu に接続しました
エスケープ文字は ^] です
error: no video mode activated.

Ubuntu 12.04.3 LTS yebisu ttyS0

ログイン

yebisu login: user1
Password: ********
Last login: Tue Oct 29 14:35:36 JST 2013 on ttyS0
Welcome to Ubuntu 12.04.3 LTS (GNU/Linux 3.5.0-42-generic x86_64)

 * Documentation:  https://help.ubuntu.com/

  System information as of Wed Oct 30 07:32:37 JST 2013

  System load:  0.34              Processes:           131
  Usage of /:   38.1% of 7.32GB   Users logged in:     0
  Memory usage: 6%                IP address for eth0: 192.168.1.105
  Swap usage:   0%

  Graph this data and manage this system at https://landscape.canonical.com/

user1@yebisu:~$ 

無事に起動した。
めでたしめでたし。


2013年6月9日日曜日

unix4j の備忘録

前回は、awk4j を調査したが、awk だけでは、ちと寂しいので、他の Unix コマンドを Java で使う方法も調査してみた。

その便利なライブラリは、unix4j である。
Google Code のプロジェクトで、ライセンスは、New BSD License となっている。

まずは、手っ取り早く動作確認を行う方法から。
今回は、jrunscript.exe で動作確認をするので、JDK 1.6 以上が必要。

unix4j のページには、バイナリファイルが見当たらなかったので、Maven Central Repository から jar ファイルを拝借してくる。
"unix4j"で検索すれば バージョン 0.2 が 6種類ほど引っかかる。
その内、「unix4j-command」と「unix4j-base」の jar ファイル「unix4j-command-0.2.jar」と「unix4j-base-0.2.jar」をそれぞれダウンロードする。

コマンドプロンプトを開き、jar ファイルと同じディレクトリで以下のコマンドを実行する。
%JAVA_HOME%\bin ディレクトリにパスが通っている必要がある。

dir | jrunscript -cp unix4j-base-0.2.jar;unix4j-command-0.2.jar -e "org.unix4j.Unix4j.from(java.lang.System[\"in\"]).sed(\"s/unix4j/FOOO/g\").toStdOut()"

やっていることは、標準入力からディレクトリ一覧をパイプで入力し、sed で文字列を変換し、標準出力へ結果を吐き出している。
スクリプト部分は、ファイルから読み込むこともできるので、バッチファイル化しておけば、いい感じになる。コマンドラインだとダブルクォートのエスケープとか面倒だしね。

その他にも、grep、find、tail、sort や uniq など色々使えるので、結構便利そうだ。
もちろん、通常の Java クラスとしても実装できる。


さて、ここからはおまけ。
最新の unix4j を使いたい場合に、ソースからビルドする方法を書いておく。
以下のものが必要となる。

  • JDK 1.6 以上
  • Apache Maven
  • git

今回は、以下の環境で検証した。

  • Windows 7 Professional SP1
  • Apache Maven 3.0.5
  • Java version: 1.7.0_06
  • Git for Windows 1.8.3-preview20130601

はじめに、適当なディレクトリに unix4j の git リポジトリをクローン
git clone https://code.google.com/p/unix4j/

cd unix4j

mvn clean compile jar:jar

これで、jar ファイルが出来る。
ちなみに、pom.xml には、Java 1.6 用と 1.7 用のプロファイルが定義されていて、デフォルトは、1.6 になっているが、JDK 1.7 でコンパイルした場合は、1.7 用のプロファイルが有効になるようだ。

作成された以下の jar を使う。
unix4j\unix4j-core\unix4j-base\target\unix4j-base-0.3-SNAPSHOT.jar
unix4j\unix4j-core\unix4j-command\target\unix4j-command-0.3-SNAPSHOT.jar


いやはや、今更ながら jrunscript の存在を認識できた。結構奥深いようだ。
仕事柄、ツールを利用して作業を効率化したいときが結構あるのだが、sed とか awk とか使うには、インストールできないとかで、環境面のハードルが高い。
こういうものが、地味に助かることも多い。

2013年6月8日土曜日

awk4j の備忘録

awk4j の Web ページには、以下のような説明がある。

「awk4j は、 GNU AWK 互換の言語処理環境で、 AWKスクリプトを、中間言語としてのホスト言語 ( Java, JavaFX, JavaScript, BeanShell, Groovy, Python, Scala ) に変換するトランスレータ方式で動作します。」

仕事をしていると、awk を使いたくなる場合がある。
自宅なら、MinGW とか MSYS とか、Ubuntu マシンとかあるので、困ることは無いのだが、現場によっては、ソフトのインストール自体が難しいことがある。
そんなときに、awk4j が役に立ちそうなので、ちょっと調べてみた。


  • Windows 上で動かすこととする。
  • JDK 1.6 以上がインストールされていること。

awk4j は、Java 1.6 から利用できる jrunscript コマンドを利用して実行する。

まず、awk4j のページから、awk4j-1.6.5-bin.zip をダウンロードし、適当な場所に解凍する。

最初は、実行方法を簡単に説明する。
解凍した以下のディレクトリを、コマンドプロンプトで開く
awk4j-bin\lib

以下のように実行すると、Hello World! と表示される。
AWK スクリプトを内部で Java 言語に変換しているので、CLASSPATH 環境変数の設定が必ず必要となる。
set CLASSPATH=awk4j.jar
%JAVA_HOME%\bin\jrunscript -cp awk4j.jar -l awk4j -e "BEGIN { print \"Hello World!\" }"


バッチ化する場合は、以下のようなコマンドを awk.bat として作成して、バッチと同じディレクトリに awk4j.jar ファイルを格納する。ちなみに、「%~dp0」は、バッチファイルのディレクトリを取得する記述。

@echo off
setlocal
set CLASSPATH=%~dp0awk4j.jar;%CLASSPATH%
%JAVA_HOME%\bin\jrunscript -cp %~dp0awk4j.jar -l awk4j %*
endlocal


同じように、JavaScript に変換して実行することもできる。
JavaScript の場合は、CLASSPATH 環境変数の設定は、いらないようだ。
ただし、Java と JavaScript では、実行時の挙動が異なるようだ!?
JavaScript での実行では、以下のコマンドは、同じ結果になるのだが、入力ファイルを指定しても、処理している様子がないし・・・例文で乗っている "1" とか "NF" のようなスクリプトも、JavaScript では、エラーになってしまうようだ。何か、指定方法などが間違っているのだろうか?

%JAVA_HOME%\bin\jrunscript.exe -cp awk4j.jar -l awk4j.JavaScript -e "BEGIN { print \"Hello World!\" }"


では、作成した awk.bat のコマンド例を示す。

ファイル指定で実行
awk -e "{ print $0 }" hoge.txt

パイプで実行。標準入力からデータを受け取る場合 /dev/stdin をファイル名に指定する。ここら辺の説明は、「言語仕様」リンク先でなされている。
type hoge.txt | awk -e "1" /dev/stdin




2012年10月7日日曜日

7-Zip で、ファイル名が UTF-8 エンコードされた zip ファイルを生成する方法

備忘録

Windows 上で、ファイル名にマルチバイト文字を含む zip ファイルを作成し、iTunes 経由で iPad の GoodReader に転送して、GoodReader で解凍すると、ファイル名が文字化けする。
理由は単純で、Windows 上で zip ファイルを作成すると、デフォルトでは、ファイル名が、cp932 (Shift-JISかも・・・)でエンコードされてしまうため。
および、iPad上では、(linux も)UTF-8 でファイル名が、エンコードされていることを、前提にしているのため。
したがって、逆もまた真なり。
解決策としては、いくつか考えられる
まず、ファイル名を UTF-8 でエンコードする圧縮形式を利用する場合、7zip 形式などがあるが、残念ながら GoodReader が未対応。
次の策は、、linux 上で圧縮する。これでもいいかも。試してないけど。
最後に、Windows 上でも、ファイル名を UTF-8 エンコードしてくれるツールを利用することだが、今回はこの方法にした。利用するツールは、7-Zip 。

環境

Windows 7 Professional 64bit SP1
7-Zip 9.28 (x64 edition) alpha バージョン

実施手順

7-Zip はインストール済みとする。

圧縮対象(ここでは、books ディレクトリ)を右クリックし、コンテキストメニューの「7-Zip」⇒「圧縮...」を選択。


「書庫形式」を「zip」に設定。
「パラメータ」に「cu=on」を設定。
「cu」パラメータの説明は、「7-Zip uses UTF-8 for file names that contain non-ASCII symbols.」となっている。つまり、ASCII 文字以外が含まれている場合に、ファイル名を UTF-8 エンコードする。

ちなみに、この「パラメータ」というのは、コマンドラインの「-m」スイッチに指定するもの。「cu」パラメータは、 Zip 形式のときに有効となる。
詳細は、ググるか、ヘルプを参照。

最後に、「OK」ボタンを押下。

これで、ファイル名が UTF-8 エンコードされた zip ファイルが作成される。

Windows 上で確認する場合は、次のようにする。



zip ファイルを右クリックして、コンテキストメニューの「プログラムから開く」⇒「エクスプローラー」を選択。



エクスプローラーでは、cp932 でエンコードされている前提で、ファイル名を表示するため、UTF-8 エンコードされているファイル名は、見事に文字化けして見える。

この zip ファイルを、iTunes 経由で、GoodReader に転送し、解凍すると、見事に元のファイル名が、復元される。

ちなみに、7-zip で開くと、正常なファイル名で表示される。

2012年9月22日土曜日

ファイル選択ダイアログを開くとフリーズ(反応無し)になる元凶を見つけたよ

はじめに

最近、新マシンを新調し、環境構築をせっせとしているのだが、Exact audio copy (EAC) や Chrome などで、ファイル選択ダイアログを開くと、選択しても、しなくても、×ボタンで閉じたときでさえ、毎回フリーズして、アプリケーションが、応答しなくなったり、強制終了となる事象が発生して困っていた。
今日、その元凶が判明したので、さらしておく。

注意事項

今回の手順を実行すると、最悪で、起動不能になる場合もありえる。
実施は、くれぐれも自己責任で。

動作環境

Windows7 Professional 64bit SP1
CPU:AMD FX(tm)-8150 Eight-Core
メモリ:16GB

原因特定に利用したソフト

ShellExView
システムにインストールされている、シェルエクステンション(シェル拡張)を、一覧表示して、個別に機能を有効・無効化できるソフト。

元凶

DAEMON Tools Pro (DT Soft Ltd)

シェル拡張名:Image Catalog
バージョン: 4.40.0312.0221
ファイル:D:\appli\DAEMON Tools Pro\DTShl64.dll
ファイルサイズ:696,128 バイト

TortoiseSVN

バージョン:1.7.9-64bit

TortoiseGit

バージョン:1.7.12.0-64bit

特定方法

同様の現象を Google 先生に問い合わせると、どうやら腐ったシェルエクステンション(シェル拡張)が、原因なことが多いとか。
であれば、アヤシイものを、片っ端から無効にして、確かめるしかない。
そこで ShellExView の登場である。

実際の使用方法は、いたって簡単。
無効化したいものを選択し、右クリックしてコンテキストメニューから「Disable Selected Items」を、選択する。ただし、Microsoft のものは、避けたほうがいい。Microsoft 以外のものは、背景がピンク色になっているもので、一覧の「Microsoft」項目が「No」になっている。
再起動して、現象が発生するかを確かめる。
以上。

対処方法

DAEMON Tools

元凶を無効化する。

TortoiseSVN

設定を開き、「アイコンオーバーレイ」を選択。
「アイコンオーバーレイ/状態表示列」で、「エクスプローラー上でのみオーバーレイとコンテキストメニューを表示」チェックボックスにチェックを付ける。

TortoiseGit

TortoiseSVNと同様の対処を行っても、改善されず。
シェルエクステンションの無効化しかないかも。
でもそれだと、インストールする意味がまったくないよ。

愚痴

率直に言うと、「またおまえか!」って感じです。ほんとに、DAEMON Tools には、マルウェア騒動以来、悪いイメージしかない。
バンドル版なので、アップデートもできないし、アップデートダイアログで表示される、金払って延長しろってボタン以外、×ボタンも閉じるボタンも、数秒間無効化されて押せないし。
ほんっっっとに、感じ悪い。そういうメンタルは、有料版ユーザに対しても、変わるとは思えない。
腹が立ってきたので、アンインストールすることにする。
こういう下種な小細工は、競合がいない場合にのみ、有効なんだよ。
同じ金を払うなら、平均より上の別のソフトにするに決まってる。

と、悪態をついてはみたが、SVN 64bit版や Git 64bit版などのシェルエクステンションを使用しているものが、けっこう駄目になっていることを考えると、Windows7 が悪い気がしてきた。しかも 64bit 版特有の問題かもしれない。仕事場で使っている Windows7 32bit 版では、問題が起きていないし、 Vista 64bit 版 SP2 でも、こんなことはなかった。
現象から察するに、ファイルエクステンションや、ファイル選択ダイアログの仕様が変わってるのかもしれない。
しかし、いくらなんでも、アプリもろとも強制終了とか、ありえないと思う。
やっぱり Windows の SP1 は、ベータ版ってことだね。

2012年9月17日月曜日

Windows 64bit 用の ffmpeg をビルド

はじめに

ちょっと悶絶したくて、Ubuntu 上のクロスコンパイル環境で、Windows 64bit 用の ffmpeg をビルドしてみる。
ライセンスの関係で、配布できないものになるので、注意。

ビルド方法は、偉大なる先人である、「Linux日記: MinGWでx264、ffmpegをビルド」ページをマルパクリ・・・。ありがたや、ありがたや。

make に付いている -j6 は、並列ビルドするオプション。コア数 * 1.5 がいいとかなんとか・・・。場合によって、undefined などのエラーが発生するので注意。
CFLAGS などに指定してある -pipe は、テンポラリファイルではなく、パイプを利用して、メモリを多く使用する代わりに、コンパイルを高速化するオプション。

なお、ビルド手順については、思考錯誤などの手戻りで、ビルド順があやしいので、近々に検証する予定。

【2012/09/19】 ビルド手順の検証完了。やっぱり間違っていた。3回ぐらいやらないと、まともにならないな。手順を見直して、不要なライブラリが削れた。
ついでに、パッチをすべてアップロードした。パッチを当てるときは、解凍したディレクトリに cd してから「patch -p0 < パッチファイル」のようにする。
Blogger のせいなのか、タブ文字がスペース文字に置き換わってしまい、パッチをアップロードせざるを得なかった。

利用したソース

zlib (zlib-1.2.7.tar.bz2)
bzip2 (bzip2-1.0.6.tar.gz)
XZ Utils (xz-5.0.4.tar.bz2)
SDL (SDL-1.2.15.tar.gz)
gpac (gpac-0.5.0.tar.gz)
ffmpeg
ffms2
x264
OpenSSL (openssl-1.0.1c.tar.gz)
libpng (libpng-1.5.12.tar.gz)
libtiff (tiff-3.9.6.tar.gz)
libjpeg-turbo (libjpeg-turbo-1.2.1.tar.gz)
lcms2 (lcms2-2.3.tar.gz)
lame (lame-3.99.5.tar.gz)
faac (faac-1.28.tar.bz2)
libogg (libogg-1.3.0.tar.gz)
libvorbis (libvorbis-1.3.3.tar.gz)
libtheora (libtheora-1.1.1.tar.bz2)
libspeex (speex-1.2rc1.tar.gz)
opencore-amr (opencore-amr-0.1.2.tar.gz)
openjpeg (openjpeg_v1_4_sources_r697.tgz)
xvidcore (xvidcore-1.3.2.tar.bz2)
gsm (gsm-1.0.13.tar.gz)
rtmpdump
libvpx (libvpx-v1.1.0.tar.bz2)
libfdk-aac

未完遂のライブラリ

orc (orc-0.4.16.tar.gz)
libschroedinger (schroedinger-1.0.11.tar.gz)



依存ライブラリのビルド(1週目)

zlib

CFLAGS="-pipe -O2" \
CXXFLAGS="${CFLAGS}" \
CC=x86_64-w64-mingw32-gcc \
AR=x86_64-w64-mingw32-ar \
RANLIB=x86_64-w64-mingw32-ranlib \
LDSHAREDLIBC="" \
PKG_CONFIG_PATH=/usr/x86_64-w64-mingw32/lib/pkgconfig \
./configure --prefix=/usr/x86_64-w64-mingw32

make -j6

sudo checkinstall --pkgname=zlib-mingw-w64-x86-64 \
--pkgversion="1:1.2.7.$(date +%Y%m%d)-0ubuntu1" \
--backup=no --deldoc=yes --fstrans=no --default

bzip2

まず、このパッチを当ててから以下の作業を行う。
make libbz2.a
sudo install -m 644 bzlib.h /usr/x86_64-w64-mingw32/include
sudo install -m 644 libbz2.a /usr/x86_64-w64-mingw32/lib

XZ Utils

CFLAGS="-pipe -O2" \
CXXFLAGS="${CFLAGS}" \
PKG_CONFIG_PATH=/usr/x86_64-w64-mingw32/lib/pkgconfig \
./configure --prefix=/usr/x86_64-w64-mingw32 \
--host=x86_64-w64-mingw32 \
--disable-shared

make -j6

sudo checkinstall --pkgname=xz-utils-mingw-w64-x86-64 \
--pkgversion="1:5.0.4.$(date +%Y%m%d)-0ubuntu1" \
--backup=no --deldoc=yes --fstrans=no --default

SDL

gpac の依存ライブラリ
CFLAGS="-pipe -O2" \
CXXFLAGS="${CFLAGS}" \
PKG_CONFIG_PATH=/usr/x86_64-w64-mingw32/lib/pkgconfig \
./configure --prefix=/usr/x86_64-w64-mingw32 \
--host=x86_64-w64-mingw32 \
--disable-shared

make -j6

sudo checkinstall --pkgname=libsdl-mingw-w64-x86-64 \
--pkgversion="1:1.2.15.$(date +%Y%m%d)-0ubuntu1" \
--backup=no --deldoc=yes --fstrans=no --default

gpac

本家ソースの最新版をコンパイルしてみた。
gpac の依存ライブラリ。
そのままで、Ubuntu 上の MinGW 環境で、静的ライブラリをクロスコンパイルしようとしたら、ひどい有様だった。仕方がないのでパッチを当てたら、パッチファイルが 1300 行を超えた・・・・
パッチは、MinGW 環境での、静的ライブラリ生成専用。動的ライブラリの生成は、できないので注意。
はじめに上記のパッチを当ててから作業を開始する。
パッケージの情報が記述されているが、余計なお世話なのでリネーム
mv gpac.spec gpac.spec_org

PKG_CONFIG_PATH=/usr/x86_64-w64-mingw32/lib/pkgconfig \
./configure  --prefix=/usr/x86_64-w64-mingw32 \
--cross-prefix=x86_64-w64-mingw32- --cpu=x86_64 \
--extra-cflags="-pipe"

make -j6

sudo checkinstall --pkgname=libgpac-mingw-w64-x86-64 \
--pkgversion="1:0.5.0.$(date +%Y%m%d)-0ubuntu1" \
--backup=no --deldoc=yes --fstrans=no --default \
sudo make install install-lib


ビルド(1週目)

ffmpeg

各ライブラリは、相互依存するので、はじめは最小構成で FFmpeg をビルドする。
git clone git://source.ffmpeg.org/ffmpeg.git ffmpeg
commit 83438a0db3c61f06979d1c4159e5c85d52eda488
Date:   Mon Sep 17 00:40:55 2012 +0200
2週目のためにこのパッチを当てる。1週目では必要ないが、ここで当てておく。
PKG_CONFIG_PATH=/usr/x86_64-w64-mingw32/lib/pkgconfig \
./configure --prefix=/usr/x86_64-w64-mingw32 --enable-gpl \
--enable-version3 --enable-nonfree \
--enable-postproc --enable-memalign-hack \
--enable-runtime-cpudetect --enable-avisynth \
--enable-w32threads --cross-prefix=x86_64-w64-mingw32- \
--target-os=mingw32 --arch=x86_64 --cpu=x86_64 \
--extra-cflags="-pipe" --extra-cxxflags="-pipe"

make -j6

sudo checkinstall --pkgname=ffmpeg-mingw-w64-x86-64 \
--pkgversion="1:20120909.$(date +%Y%m%d)-0ubuntu1" \
--backup=no --deldoc=yes --fstrans=no --default

ffms2

svn checkout http://ffmpegsource.googlecode.com/svn/trunk/ ffms2
リビジョン: 712

CFLAGS="-pipe -O2" \
CXXFLAGS="${CFLAGS}" \
PKG_CONFIG_PATH=/usr/x86_64-w64-mingw32/lib/pkgconfig \
./configure --prefix=/usr/x86_64-w64-mingw32 --host=x86_64-w64-mingw32 \
--disable-silent-rules --enable-dependency-tracking \
--disable-shared --enable-static

make -j6

sudo checkinstall --pkgname=ffms2-mingw-w64-x86-64 \
--pkgversion="1:712.$(date +%Y%m%d)-0ubuntu1" \
--backup=no --deldoc=yes --fstrans=no --default \
make install-strip

x264

git clone git://git.videolan.org/x264.git x264
commit 198a7ea13ccb727d4ea24b29f5da9b0292387309
Date:   Thu Aug 16 13:40:32 2012 -0700
まず、このパッチを当ててから以下の作業を行う。
CFLAGS="-pipe -O2" \
CXXFLAGS="${CFLAGS}" \
PKG_CONFIG_PATH=/usr/x86_64-w64-mingw32/lib/pkgconfig \
./configure --prefix=/usr/x86_64-w64-mingw32 \
--host=x86_64-w64-mingw32 \
--cross-prefix=x86_64-w64-mingw32- \
--enable-win32thread \
--enable-static \
--extra-cflags="-pipe -O2" \
--extra-ldflags="-lws2_32"


platform:      X86_64
system:        WINDOWS
cli:           yes
libx264:       internal
shared:        no
static:        yes
asm:           yes
interlaced:    yes
avs:           yes
lavf:          yes
ffms:          yes
gpac:          yes
gpl:           yes
thread:        win32
filters:       resize crop select_every 
debug:         no
gprof:         no
strip:         no
PIC:           no
visualize:     no
bit depth:     8
chroma format: all


make -j6

sudo checkinstall --pkgname=libx264-mingw-w64-x86-64 \
--pkgversion="1:20120816.$(date +%Y%m%d)-0ubuntu1" \
--backup=no --deldoc=yes --fstrans=no --default


依存ライブラリのビルド(2週目)

OpenSSL

make に 並列ビルドオプション(-j)をつけると、undefined エラーとなる。
PKG_CONFIG_PATH=/usr/x86_64-w64-mingw32/lib/pkgconfig \
./Configure --prefix=/usr/x86_64-w64-mingw32 \
--cross-compile-prefix=x86_64-w64-mingw32- \
mingw64 threads zlib no-shared

make

sudo checkinstall --pkgname=openssl-mingw-w64-x86-64 \
--pkgversion="1:1.0.1c.$(date +%Y%m%d)-0ubuntu1" \
--backup=no --deldoc=yes --fstrans=no --default

libpng

openjpeg の依存ライブラリ
CFLAGS="-pipe -O2" \
CXXFLAGS="${CFLAGS}" \
PKG_CONFIG_PATH=/usr/x86_64-w64-mingw32/lib/pkgconfig \
./configure --prefix=/usr/x86_64-w64-mingw32 \
--host=x86_64-w64-mingw32 \
--disable-shared

make -j6

sudo checkinstall --pkgname=libpng-mingw-w64-x86-64 \
--pkgversion="1:1.5.12.$(date +%Y%m%d)-0ubuntu1" \
--backup=no --deldoc=yes --fstrans=no --default

libtiff

openjpeg の依存ライブラリ
4.0.2 でやってみたら、openjpeg で認識してくれなかったので、3.9.6 にした。
CFLAGS="-pipe -O2" \
CXXFLAGS="${CFLAGS}" \
PKG_CONFIG_PATH=/usr/x86_64-w64-mingw32/lib/pkgconfig \
./configure --prefix=/usr/x86_64-w64-mingw32 \
--host=x86_64-w64-mingw32 \
--disable-shared

make -j6

sudo checkinstall --pkgname=libtiff-mingw-w64-x86-64 \
--pkgversion="1:3.9.6.$(date +%Y%m%d)-0ubuntu1" \
--backup=no --deldoc=yes --fstrans=no --default

libjpeg-turbo

openjpeg の依存ライブラリ
CFLAGS="-pipe -O2" \
CXXFLAGS="${CFLAGS}" \
PKG_CONFIG_PATH=/usr/x86_64-w64-mingw32/lib/pkgconfig \
./configure --prefix=/usr/x86_64-w64-mingw32 \
--host=x86_64-w64-mingw32 \
--disable-shared

make -j6

sudo checkinstall --pkgname=libjpeg-turbo-mingw-w64-x86-64 \
--pkgversion="1:1.2.1.$(date +%Y%m%d)-0ubuntu1" \
--backup=no --deldoc=yes --fstrans=no --default

lcms2

openjpeg の依存ライブラリ
CFLAGS="-pipe -O2" \
CXXFLAGS="${CFLAGS}" \
PKG_CONFIG_PATH=/usr/x86_64-w64-mingw32/lib/pkgconfig \
./configure --prefix=/usr/x86_64-w64-mingw32 \
--host=x86_64-w64-mingw32 \
--disable-shared

make -j6

sudo checkinstall --pkgname=liblcms2-mingw-w64-x86-64 \
--pkgversion="1:2.3.$(date +%Y%m%d)-0ubuntu1" \
--backup=no --deldoc=yes --fstrans=no --default

lame

CFLAGS="-pipe -O2" \
CXXFLAGS="${CFLAGS}" \
PKG_CONFIG_PATH=/usr/x86_64-w64-mingw32/lib/pkgconfig \
./configure --prefix=/usr/x86_64-w64-mingw32 \
--host=x86_64-w64-mingw32 \
--disable-shared \
--enable-nasm

make -j6

sudo checkinstall --pkgname=lame-mingw-w64-x86-64 \
--pkgversion="1:3.99.5.$(date +%Y%m%d)-0ubuntu1" \
--backup=no --deldoc=yes --fstrans=no --default

faac

CFLAGS="-pipe -O2" \
CXXFLAGS="${CFLAGS}" \
PKG_CONFIG_PATH=/usr/x86_64-w64-mingw32/lib/pkgconfig \
./configure --prefix=/usr/x86_64-w64-mingw32 \
--host=x86_64-w64-mingw32 --disable-shared --without-mp4v2

make -j6

sudo checkinstall --pkgname=faac-mingw-w64-x86-64 \
--pkgversion="1:1.28.$(date +%Y%m%d)-0ubuntu1" \
--backup=no --deldoc=yes --fstrans=no --default

libogg

CFLAGS="-pipe -O2" \
CXXFLAGS="${CFLAGS}" \
PKG_CONFIG_PATH=/usr/x86_64-w64-mingw32/lib/pkgconfig \
./configure --prefix=/usr/x86_64-w64-mingw32 \
--host=x86_64-w64-mingw32 --disable-shared

make -j6

sudo checkinstall --pkgname=libogg-mingw-w64-x86-64 \
--pkgversion="1:1.3.0.$(date +%Y%m%d)-0ubuntu1" \
--backup=no --deldoc=yes --fstrans=no --default

libvorbis

CFLAGS="-pipe -O2" \
CXXFLAGS="${CFLAGS}" \
PKG_CONFIG_PATH=/usr/x86_64-w64-mingw32/lib/pkgconfig \
./configure --prefix=/usr/x86_64-w64-mingw32 \
--host=x86_64-w64-mingw32 --disable-shared

make -j6

sudo checkinstall --pkgname=libvorbis-mingw-w64-x86-64 \
--pkgversion="1:1.3.3.$(date +%Y%m%d)-0ubuntu1" \
--backup=no --deldoc=yes --fstrans=no --default

libtheora

CFLAGS="-pipe -O2" \
CXXFLAGS="${CFLAGS}" \
PKG_CONFIG_PATH=/usr/x86_64-w64-mingw32/lib/pkgconfig \
./configure --prefix=/usr/x86_64-w64-mingw32 \
--host=x86_64-w64-mingw32 --disable-shared

make -j6

sudo checkinstall --pkgname=libtheora-mingw-w64-x86-64 \
--pkgversion="1:1.1.1.$(date +%Y%m%d)-0ubuntu1" \
--backup=no --deldoc=yes --fstrans=no --default

libspeex

CFLAGS="-pipe -O2" \
CXXFLAGS="${CFLAGS}" \
PKG_CONFIG_PATH=/usr/x86_64-w64-mingw32/lib/pkgconfig \
./configure --prefix=/usr/x86_64-w64-mingw32 \
--host=x86_64-w64-mingw32 --disable-shared --enable-sse

make -j6

sudo checkinstall --pkgname=libspeex-mingw-w64-x86-64 \
--pkgversion="1:1.2rc1.$(date +%Y%m%d)-0ubuntu1" \
--backup=no --deldoc=yes --fstrans=no --default

opencore-amr

CFLAGS="-pipe -O2" \
CXXFLAGS="${CFLAGS}" \
PKG_CONFIG_PATH=/usr/x86_64-w64-mingw32/lib/pkgconfig \
./configure --prefix=/usr/x86_64-w64-mingw32 \
--host=x86_64-w64-mingw32 --disable-shared

make -j6

sudo checkinstall --pkgname=libopencore-amr-mingw-w64-x86-64 \
--pkgversion="1:0.1.2.$(date +%Y%m%d)-0ubuntu1" \
--backup=no --deldoc=yes --fstrans=no --default

openjpeg

make -j6 だと、エラーとなる。早すぎたんだ・・・
CFLAGS="-pipe -O2" \
CXXFLAGS="${CFLAGS}" \
PKG_CONFIG_PATH=/usr/x86_64-w64-mingw32/lib/pkgconfig \
LIBS="-lpng" \
./configure --prefix=/usr/x86_64-w64-mingw32 \
--host=x86_64-w64-mingw32 --disable-shared

----------------------------------------------
           your configuration

--with-png-libraries: yes
libpng header       : yes
--enable-tiff       : yes
libtiff header      : yes
--enable-lcms2      : yes
lcms2 header        : yes
lcms2 version       : 2.3
--enable-lcms1      : no
lcms1 header        : no
lcms1 version       : 
--enable-jpwl       : no
--enable-jp3d       : no
--enable-shared     : no
----------------------------------------------

make

sudo checkinstall --pkgname=libopenjpeg-mingw-w64-x86-64 \
--pkgversion="1:1.4.r697.$(date +%Y%m%d)-0ubuntu1" \
--backup=no --deldoc=yes --fstrans=no --default

xvidcore

以下のようなエラーとなるので

GCC4 から、無くなったオプション
  C: ./decoder.c
cc1: エラー: 認識できないコマンドラインオプション ‘-mno-cygwin’ です

原因は、-DWINDOWS オプション。
以下のコマンドで、生成されたオブジェクトファイルの中身をのぞくと、関数名の先頭にアンダースコアが付いている。
x86_64-w64-mingw32-nm build/generic/\=build/utils/x86_asm/cpuid.obj
  L: xvidcore.a
  L: xvidcore.dll
Creating library file: xvidcore.dll.a
xvid.obj:xvid.c:(.text+0xe0): undefined reference to `check_cpu_features'
xvid.obj:xvid.c:(.text+0x65c): undefined reference to `emms_mmx'
xvid.obj:xvid.c:(.text+0x673): undefined reference to `fdct_mmx_skal'
xvid.obj:xvid.c:(.text+0x67a): undefined reference to `idct_mmx'
...
plugins/plugin_ssim.obj:plugin_ssim.c:(.text+0x12c1): undefined reference to `check_cpu_features'
plugins/plugin_ssim.obj:plugin_ssim.c:(.text+0x12d8): undefined reference to `lum_8x8_mmx'
plugins/plugin_ssim.obj:plugin_ssim.c:(.text+0x12e3): undefined reference to `consim_mmx'
plugins/plugin_ssim.obj:plugin_ssim.c:(.text+0x12fb): undefined reference to `consim_sse2'
collect2: ld はステータス 1 で終了しました
make: *** [xvidcore.dll] エラー 1

まず、このパッチを当ててから以下の作業を行う。

CFLAGS="-pipe -O2" \
CXXFLAGS="${CFLAGS}" \
PKG_CONFIG_PATH=/usr/x86_64-w64-mingw32/lib/pkgconfig \
AFLAGS="-DNO_PREFIX" \
./configure --prefix=/usr/x86_64-w64-mingw32 \
--host=x86_64-w64-mingw32

make -j6

sudo checkinstall --pkgname=libxvidcore-mingw-w64-x86-64 \
--pkgversion="1:1.3.2.$(date +%Y%m%d)-0ubuntu1" \
--backup=no --deldoc=yes --fstrans=no --default

gsm

まず、このパッチを当ててから以下の作業を行う。

make -j6

sudo checkinstall --pkgname=libgsm-mingw-w64-x86-64 \
--pkgversion="1:1.0.13.$(date +%Y%m%d)-0ubuntu1" \
--backup=no --deldoc=yes --fstrans=no --default \
make gsminstall

rtmpdump

git clone git://git.ffmpeg.org/rtmpdump
commit e0056c51cc1710c9a44d2a2c4e2f344fa9cabcf4
Date:   Tue Jul 24 17:17:26 2012 +0200

make SYS=mingw SHARED= CROSS_COMPILE=x86_64-w64-mingw32- \
OPT="-O2" XLIBS="-lcrypt32" \
prefix=/usr/x86_64-w64-mingw32

sudo checkinstall --pkgname=rtmpdump-mingw-w64-x86-64 \
--pkgversion="1:$(date +%Y%m%d)-0ubuntu1" \
--backup=no --deldoc=yes --fstrans=no --default \
make SYS=mingw SHARED= CROSS_COMPILE=x86_64-w64-mingw32- \
OPT="-O2" XLIBS="-lcrypt32" \
install prefix=/usr/x86_64-w64-mingw32

libvpx

pthread がインストールされていない場合、win32thread を利用するようになる。 その時に、windows.h が import されずに「不明な型名 CRITICAL_SECTION」エラーとなるため、このパッチを当てる。
CFLAGS="-pipe -O2" \
CXXFLAGS="${CFLAGS}" \
PKG_CONFIG_PATH=/usr/x86_64-w64-mingw32/lib/pkgconfig \
CROSS=x86_64-w64-mingw32- \
./configure --target=x86_64-win64-gcc --prefix=/usr/x86_64-w64-mingw32 \
--disable-shared \
--disable-examples

make -j6

sudo checkinstall --pkgname=libvpx-mingw-w64-x86-64 \
--pkgversion="1:1.1.0.$(date +%Y%m%d)-0ubuntu1" \
--backup=no --deldoc=yes --fstrans=no --default

libfdk-aac

今回は、GitHub からソースを取得した。
git clone https://github.com/mstorsjo/fdk-aac.git
cd fdk-aac

fdk-aac$ git log
commit 226601a8d9bce81455e161a0e26051d2f22c5d7a
Date:   Mon Mar 18 16:23:17 2013 +0200

CFLAGS="-pipe -O2" \
CXXFLAGS="${CFLAGS}" \
PKG_CONFIG_PATH=/usr/x86_64-w64-mingw32/lib/pkgconfig \
./configure --prefix=/usr/x86_64-w64-mingw32 \
--host=x86_64-w64-mingw32 \
--disable-shared --enable-static --enable-fast-install

make -j6

sudo checkinstall --pkgname=libfdk-aac-mingw-w64-x86-64 \
--pkgversion="1:0.1.1.$(date +%Y%m%d)-0ubuntu1" \
--backup=no --deldoc=yes --fstrans=no --default

ビルド(2週目)

ffmpeg

make clean

PKG_CONFIG_PATH=/usr/x86_64-w64-mingw32/lib/pkgconfig \
./configure --prefix=/usr/x86_64-w64-mingw32 \
--cross-prefix=x86_64-w64-mingw32- --target-os=mingw32 \
--arch=x86_64 --cpu=x86_64 --enable-gpl --enable-version3 \
--enable-nonfree --enable-postproc \
--enable-memalign-hack --enable-runtime-cpudetect \
--enable-avisynth --disable-debug \
--extra-libs="-lws2_32 -lgdi32 -lwinmm"  --enable-w32threads \
--enable-zlib --enable-bzlib --enable-libmp3lame \
--enable-libfaac --enable-libvorbis --enable-libtheora \
--enable-libspeex --enable-libopencore-amrnb \
--enable-libopencore-amrwb --enable-libopenjpeg \
--enable-libxvid --enable-libgsm \
--enable-librtmp \
--enable-libx264 \
--enable-libfdk-aac \
--extra-cflags="-pipe" --extra-cxxflags="-pipe"

make -j6

sudo checkinstall --pkgname=ffmpeg-mingw-w64-x86-64 \
--pkgversion="1:20120909.$(date +%Y%m%d)-0ubuntu1" \
--backup=no --deldoc=yes --fstrans=no --default

ffms2

make clean

CFLAGS="-pipe -O2" \
CXXFLAGS="${CFLAGS}" \
PKG_CONFIG_PATH=/usr/x86_64-w64-mingw32/lib/pkgconfig \
./configure --prefix=/usr/x86_64-w64-mingw32 --host=x86_64-w64-mingw32

make -j6

sudo checkinstall --pkgname=ffms2-mingw-w64-x86-64 \
--pkgversion="1:712.$(date +%Y%m%d)-0ubuntu1" \
--backup=no --deldoc=yes --fstrans=no --default \
make install-strip

x264

configure で、ライブラリを指定しまくらないと、ffms2 が有効にならない。自動的に設定してくれないものなのか・・・
config.log を頼りに、不足のライブラリをせっせと追加したが、心が折れそうになった。
make clean

PKG_CONFIG_PATH=/usr/x86_64-w64-mingw32/lib/pkgconfig \
./configure --prefix=/usr/x86_64-w64-mingw32 \
--host=x86_64-w64-mingw32 \
--cross-prefix=x86_64-w64-mingw32- \
--enable-win32thread --enable-static --enable-strip \
--extra-cflags="-pipe -O2" \
--extra-ldflags="-lx264 -lfdk-aac -lfaac -lgsm -lmp3lame -lopencore-amrnb -lopencore-amrwb -lopenjpeg -ltheoraenc -ltheoradec -lspeex -lvorbis -lvorbisenc -logg -lxvidcore -lrtmp -lssl -lcrypto -lws2_32 -lgdi32 -lwinmm"

make -j6

sudo checkinstall --pkgname=libx264-mingw-w64-x86-64 \
--pkgversion="1:20120816.$(date +%Y%m%d)-0ubuntu1" \
--backup=no --deldoc=yes --fstrans=no --default


実行ファイルのチェック

ビルドした実行ファイルが、DLL 依存になっていないかをチェック。
$ x86_64-w64-mingw32-objdump -p x264.exe | grep 'DLL Name'
 DLL Name: ADVAPI32.dll
 DLL Name: AVIFIL32.dll
 DLL Name: GDI32.dll
 DLL Name: KERNEL32.dll
 DLL Name: msvcrt.dll
 DLL Name: msvcrt.dll
 DLL Name: USER32.dll
 DLL Name: WINMM.dll
 DLL Name: WS2_32.dll

$ x86_64-w64-mingw32-objdump -p ffmpeg.exe | grep 'DLL Name'
 DLL Name: ADVAPI32.dll
 DLL Name: AVICAP32.dll
 DLL Name: AVIFIL32.dll
 DLL Name: GDI32.dll
 DLL Name: KERNEL32.dll
 DLL Name: msvcrt.dll
 DLL Name: msvcrt.dll
 DLL Name: PSAPI.DLL
 DLL Name: SHELL32.dll
 DLL Name: USER32.dll
 DLL Name: WINMM.dll
 DLL Name: WS2_32.dll


備忘録

ビルド中に発生した問題の解決方法を備忘録として残しておく。

configure の先頭行のシェルに -x オプションを付け、デバッグ出力する。

configu.log をみて、依存ライブラリチェック処理のエラーなどを確認する。

undefined reference が、発生した場合は、/usr/x86_64-w64-mingw32 ディレクトリで、
fgrep -r --exclude-dir="bin" --exclude-dir="sbin" 未定義ラベル名 *
のようにして、探す。
ライブラリが絞り込めたら、
x86_64-w64-mingw32-nm lib/libtheoraenc.a | grep th_encode_flushheader
のようにすると、
U th_encode_flushheader
0000000000004d70 T th_encode_flushheader
のように表示される。U は未定義、T などになっているものを探す。