ラベル linux の投稿を表示しています。 すべての投稿を表示
ラベル linux の投稿を表示しています。 すべての投稿を表示

2014/03/16

Let's note CF-S10上のLinuxで正常にサスペンドするために (Arch Linux用カーネル再ビルドスクリプト)

Let's note CF-S10シリーズではLinux環境でサスペンドすると、内蔵キーボードやトラックパッドが認識されなくなる不具合があります。(知っている人は知っていると思いますが...。)
参照: Ubuntu 日本語フォーラム - サスペンドから復帰後キーボードが認識されません

Ubuntuに限らず、Arch Linuxなどの他ディストリビューションでもこの問題が発生します。 (i8042に関する問題ですが、他のi8042搭載マシンでは問題ないらしく、CF-S10シリーズのみ発生します。)
カーネルのドライバを書き換えてビルドしなおせば対策できますが、アップデートの度に自分で書き換えるのはあまりにも面倒です。
(ちなみに先日、東京で学会発表する機会があって CF-S10を持っていったのですが、何日か前にカーネルのアップデートをしてから再起動せずにサスペンドして使っていたところ、この問題の影響で一部デバイスが認識されなくなり焦りましたw)

...ということで...ちょっと今更ですが、
Arch Linux環境向けにカーネルを自動で書き換えてビルドしなおすスクリプトを書きました。
行っている内容としては...
  1. Arch Linuxの公式リポジトリからPKGBUILDやpatchを取得。
  2. makepkgを用いてPKGBUILDから最新カーネルのソースコードを取得。
  3. 上記参照ページと同様に drivers/input/serio/i8042.c を書き換え。
  4. makepkgでビルドを実行してパッケージ化し、システムに上書きインストール。
    (尚、ビルドは4コア使うように設定してありますが、数十分を要します。)
となっています。

わざわざこの機種のためにAURにカスタムカーネルとしてパッケージを登録するのもよろしくないのかな...と思いつつ、このような方法を取ってみました。
今後、Linuxカーネルがアップデートされたときにもこのスクリプトを実行すれば、不具合対策済みカーネルで上書きできます(...できるはずです)。

尚、このスクリプトは特に自己責任でご利用ください
また間違いやもっと良い方法がありましたら、ご指摘をお待ちしております m(_ _)m

それでは♪

2014/02/09

Arch Linuxでカーネルを更新したのにバージョンが古いままだった件 (環境の問題)

Arch Linuxのpacmanでアップデートを行ったところ、
linuxのアップデートがあったのですが...
再起動後、コンソールで表示が遅い、Xも起動しない、...という問題が。
(結論からいうと、環境の問題というか設定ミスでした m(_ _;)m)

lsmodすると...読み込まれているモジュールが明らかに少ない様子です。
$ lsmod
Module                  Size  Used by
ext4                  474251  3
crc16                   1367  1 ext4
mbcache                 6082  1 ext4
jbd2                   83504  1 ext4
dm_mod                 82469  9
sr_mod                 14898  0
cdrom                  34848  1 sr_mod
sd_mod                 30821  2
rtsx_pci_sdmmc         14332  0
ahci                   23056  1
libahci                21674  1 ahci
libata                170856  2 ahci,libahci
sdhci_pci              12146  0
sdhci                  29116  1 sdhci_pci
scsi_mod              130701  3 libata,sd_mod,sr_mod
mmc_core               95691  3 sdhci,rtsx_pci_sdmmc,sdhci_pci
rtsx_pci               32209  1 rtsx_pci_sdmmc
ehci_pci                4000  0
ehci_hcd               59220  1 ehci_pci
usbcore               180136  2 ehci_hcd,ehci_pci
usb_common              1656  1 usbcore
正常時は 116行なのに対して、22行しかありませんでした(笑)

mkinitcpioで確認してみようとしたところ...。
$ sudo mkinitcpio -M
 ==> ERROR: 'lib/modules/3.12.5-1.ARCH/' is not a valid kernel module directory.
カーネルモジュールのディレクトリが正しくないというエラーが。
しかも、バージョンが違うような?
(でも、アップデートでは何もエラーは表示されていませんでした。)

まずは、カーネルのバージョンを調べます。
$ uname -r
3.12.5-1-ARCH
アップデートされたはずのカーネルのバージョンがどうも古いままでした。

では、/lib/modulesは...というと...
$ ls /lib/modules/
合計 8
drwxr-xr-x 3 root root 4096  2月  9 13:25 3.12.9-2-ARCH
drwxr-xr-x 2 root root 4096  2月  9 13:25 extramodules-3.12-ARCH
こちらは新しいカーネルのバージョンでした。

さてここで原因が分かりました。
参照: [Solved] Uname doesn't changes after linux-3.9.5 upgrade

私のPCでは、/(ルート)や/homeはLVMボリュームであり
/boot は分割して通常のパーティションに割り当てています:
  • /(ルート) - LVMボリューム (/dev/sda8, /dev/VolGroup00/lvolroot)
  • /home - LVMボリューム (/dev/sda8, /dev/VolGroup00/lvolhome)
  • /boot - ext4 (/dev/sda10)

/bootパーティションがマウントされているか確認してみると...
$ mount -l | grep boot
空ということで、何も/bootにマウントされていないようです。

しかし、/bootには最新のイメージが書き込まれていました。
$ ls /boot -l
合計 xxxxx
-rw-r--r-- 1 root root 17758784  2月  9 13:25 initramfs-linux-fallback.img
-rw-r--r-- 1 root root  4344657  2月  9 13:25 initramfs-linux.img
-rw-r--r-- 1 root root  3867632  1月 31 18:24 vmlinuz-linux
※ でも、あるはずのgrubディレクトリが無いのです。

つまり...どういうことかと言いますと...
pacman -Syu でLinuxカーネルのアップデートがあった場合、
自動的にmkinitcpioが実行されますが、
この時、 /boot パーティションがマウントされていなかったため、
空の/bootディレクトリに最新のイメージファイルが書き込まれたようです。

GRUBから起動するときは /bootが/dev/sda10から起動されますが、
起動した後は、/bootがLVM上の/(ルート)下にあるものに置き換わっているため、
不整合となっていたようです。(そのため、必要なモジュールが読み込まれない。)

とりあえず、処置として...
コンソール上で /bootをマウントした上で
downgrade を使ってlinuxのカーネルを再インストールしました。
(pacman -Uでカーネルを再インストールしたり、mkinitcpioを手動実行してもいいはず。)

あとは再起動すれば正常に起動します。

さらに、fstabに/bootを追記しておきます。
$ sudo vi /etc/fstab
# /dev/sda10
/dev/sda10 /boot ext4 rw,relatime,data=ordered 0 2
これでOKです。たぶん(^^;)

とりあえず、一件落着です ε-(´∀`*)

2014/02/01

AndroidでTesseract-OCRを用いてカメラで光学文字認識をしてみた

AndroidでTesseract-OCRを使って、カメラで撮影した画像からOCR(光学文字認識)をしてみました。

"Tesseract-OCR"はOCRエンジンであり、元々HPによって開発され、OSS化されて今はGoogleがメインメンテナとなっています。
このTesseract-OCRをAndroidでNDKとして利用するためのライブラリが "tesseract-android-tools"です。

尚、本記事は Android SDK、GNU make、Awk、Gitがインストールされていることが前提です。また、OS環境としてLinux(Arch Linux x64)を使っています。

まずは、"Android NDK"をダウンロードします。
(すでにAndroid NDKをセットアップしていれば、この手順は不要です。)
今回は、Linux x64向けの最新版である "android-ndk-r9c-linux-x86_64.tar.bz2"を用いました。
さらにダウンロードしたアーカイブを展開し、これに含まれる"ndk-build"コマンドを利用できるようにPATHを通しておきます。
$ wget android-ndk-r9c-linux-x86_64.tar.bz2
$ tar jxf android-ndk-r9c-linux-x86_64.tar.bz2
$ sudo mv android-ndk-r9c/ /opt/
$ echo 'export PATH=$PATH:/opt/android-ndk-r9c' >> ~/.bashrc
$ echo 'export NDKROOT=$PATH:/opt/android-ndk-r9c' >> ~/.bashrc
$ source ~/.bashrc

次に、"tesseract-android-tools"を...
...のはずですが、執筆現在、Android NDK r9 でうまくビルドできませんでした。

代わりに、rmtheis 氏によってForkされたプロジェクトが公開されていますので、そちらを使わせていただくことにします。尚、このプロジェクトにはTesseract、Leptonica、その他の必要なファイルが同梱されています。
$ git clone  https://github.com/rmtheis/tess-two.git
$ cd tess-two/tess-two/

あとは READMEファイルのとおりにビルドを進めていきます。
但し、ここでAndroid SDKのAPI level 8がインストールされていないとエラーが発生しましたので、project.propertiesを書き換えることで対処しておきます。(自分のPCにインストールしておいたAPI levelに書き換えてください。)
--- project.properties
+++ project.properties
@@ -9,4 +9,4 @@
 android.library=true
 # Project target.
-target=android-8
+target=android-10
さらにコマンドを実行します。
$ ndk-build
$ android update project --path .
$ ant release

次に、Eclipseでプロジェクトをインポートします。
先ほどndk-build した "tess-two"プロジェクトを、Eclipse上で"Androidプロジェクト"としてインポートします。
インポートされたら、プロジェクトのプロパティで"ライブラリ"扱いになっているかを確認します。
Eclipse上でプロジェクト"tess-two"をインポートしたら、
プロジェクトのプロパティで"ライブラリー"にチェックが入っていることを確認する。

あとは、Androidアプリケーションを書きます。
今回は、最低限の簡単なサンプルアプリケーションを作ってみましたので、
一式をGitHubのリポジトリとして公開しておきました:
https://github.com/mugifly/android_tesseract-ocr_test
ご自由に git cloneして、動作を試したり改変したりしてご利用ください。

尚、このAndroidアプリケーションプロジェクトのほうでは、先ほどのライブラリプロジェクト"tess-two"をライブラリーとして追加しておきます。
Androidアプリケーションプロジェクトのプロパティで
使用するライブラリーとして先ほどの"tess-two"プロジェクトを追加する。
さらに、"tesseract-ocr"の学習データをダウンロードします。
日本語の学習データは http://tesseract-ocr.googlecode.com/files/tesseract-ocr-3.02.jpn.tar.gz です。
これをダウンロードして展開すると"jpn.traineddata"というファイルがあります。

このファイルを、先ほどのAndroidアプリケーションプロジェクト内の"assets"ディレクトリ内にコピーしておきます。
Androidアプリケーションプロジェクトに"assets"フォルダを作り、
そこに"jpn.traineddata "をコピーしておく。
※ assets内の学習データを直接Tesseract-OCRで読み込めるようにするには、
tess-two (tesseract-android-tools)を改変する必要がありそうでしたので、
代わりに私が作成したサンプルアプリケーションでは、起動時にassets内の学習データをSDカード上にコピーする処理を実装しておきました。

尚、学習データがないと当然ながらOCR処理でエラーが発生します。ご注意下さい。

あとはAndroidアプリケーションプロジェクトをビルドするだけです。
NDKを用いたアプリケーションなので、ビルドに少し時間がかかります。

さて、写真を撮って文字認識をしてみます...。
尚、今回は面倒くさかったので、実機ではなくAndroidの開発用エミュレータを用いました。カメラは適当にあったWebカメラ QCam S7500 で、解像度はVGAに落として撮影しています。


OCRをかける前に二値化処理を行い、さらに数字だけに絞ってOCRをかけています。
適当に写真を撮った割には、まあまあの認識精度だと思いますが、
やはり、前処理(傾き、歪みとか、二値化とか...)について改良する余地がありそうです。

また、手書きした文字についてはうまく読み取りできませんでしたが、手書きの文字ばかりを集めて学習データを生成すれば、不可能ではないようです。
(参照: tesseract for handwriting recognition)

それでは (^ ^)♪

参考にさせていただいたページ (感謝♪):

2013/09/09

Linuxの /var をルートから別パーティションに移動した

Arch Linuxのルート(/)パーティションの容量が足りなくなってきました。
nacl_sdkのアップデートをしようとして気づいたという(^^;)
整理も限界があるので、思い切って、/var を別のパーティションに移しました。
※ /var には、ログファイル、キャッシュ、その他諸々のファイルが保存されます。
消してもいいファイルもあるのですが、いずれにせよ日頃から拡大したいと考えていたので(汗;)
ちなみに /home はインストール時に別パーティションにしておいたのですがw

特にどのLinux環境でも大凡同じで、簡単に行えますが、一応メモしておきます。
ちなみに、 今回は /var ですが、/boot あたりはちょっと追加手順が必要かもしれません。

まずは、LiveCDなどから作業用にLinuxを起動します。
今回は、手元にあった Ubuntu 12.04 (i386) のUSBメモリからブートしました。

早速、GPartedを用いて、/var のための"新しいパーティション"を作成します。
最近は GPartedが標準で入っているんですね。GUIでなんとも便利です。...Windows98でfdiskを使っていたときが懐かしい...。
  • 容量: 20GiB (8〜12GBが最適らしい。参照: Partitioning - ArchWiki)
  • ファイルシステム: ext4
  • デバイス名: /dev/sda9 (今回の場合)
として作成されました。

ここで確認しておきますが、以降、
  • "対象システムのルートパーティション": /dev/sda7
    Arch Linuxのルートパーティション (/)。既存の /var やその他ディレクトリが含まれる。
  • "新しいパーティション":/dev/sda9
    今作成したパーティション。Arch Linuxの新しい /var となる予定。
とします。

次に、"対象システムのルートパーティション"(/dev/sda7)と、
"新しいパーティション"(/dev/sda9)を、それぞれ適当にマウントします。

$ mount /dev/sda7 /mnt/arch-root/
$ mount /dev/sda9 /mnt/arch-var/
今回は以下のようにマウントしました:
  • 対象システムのルートパーティション: /mnt/arch-root/
  • 新しいパーティション: /mnt/arch-var/

次に、対象システムのルートパーティション下にある 既存の "/var" を
"新しいパーティション"下にコピーします。

(パーミッションを維持するようオプションをつけることをお忘れなく.)
$ sudo cp -av /mnt/arch-root/var/* /mnt/arch-var/

既存の /var は、念の為にリネームしてとっておきます。
$ sudo mv /mnt/arch-root/var /mnt/arch-root/var-

次に、"新しいパーティション"のUUIDをコピーして...
$ blkid /dev/sda9
/dev/sda9: UUID="xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx" TYPE="ext4"
さらに、対象システムのルートパーティション下の"/etc/fstab"に項目を追加します。
(新しいパーティションを /var としてマウントするように設定するわけです。)
$ sudo vi /etc/fstab
~~~~
# UUID=xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx
/dev/sda9  /var  ext4rw,relatime,data=ordered  0  2
~~~~
"<デバイス名> <マウント位置> <オプション> <Dump> <Pass>"
参照: fstab - ArchWiki

あとは再起動して、対象システム(今回は、Arch Linux)を起動します。
問題がなければ、既存の/var- (リネームしたもの)を削除して終わりです♪

p.s.
全然関係ないですが、最近、GitHub上のプロフィールに表示される使用言語が
"Perl, JavaScript, CSS"だったり、"Perl, JavaScript, C"だったり...。
C/C++/Assembly成分ももっと増やして行きたいところです(><;)

2013/08/27

32bit Linux上のperlで64bitを扱う

友人たちと起こしているプロジェクトでのこと。
私の環境は ArchLinux 64bitなどですが、メンバーには Ubuntu 32bit使いが居ます。
先日、プロジェクトで使うデータベースドライバを一部置き換えるために、"Mango"というNon-blockingなMongoDBドライバをcpanでインストールしようとしたところ、"Perl with support for quads is required!" とエラーが表示されて、インストールできなかった...という報告を受けました。

MangoのMakefile.PLを見ると、$Config{use64bitint}が定義されていて、かつ、${longsize}が8以上である必要があるようです。
即ち、64bitモードのperlでなければならないという事ですね。たぶん。
しかし...次からは、事前にもっときちんとチェックしないと(...反省)

さて...。perlは、32bit環境のOSでも、64bitとしてシミュレートができます。
http://search.cpan.org/~rjbs/perl-5.18.1/INSTALL#64_bit_support
ついては、perlをビルドする際に、"-Duse64bitint" または "-Duse64bitall" オプションを付けると良いようです。

perlbrewを用いてビルド&インストールする場合は、以下のように行います。
(以下は、Redhat系での例。Ubuntuの場合は、yumの代わりに、apt-getで"build-essential"をインストールすると良いはず。)
$ sudo yum install glibc-devel.i686 libgcc.i686 make gcc
$ curl -L http://install.perlbrew.pl | bash
$ source ~/perl5/perlbrew/etc/bashrc
$ perlbrew install 5.18.1 -Duse64bitint
$ perlbrew switch 5.18.1
$ echo source ~/perl5/perlbrew/etc/bashrc >> ~/.bashrc
$ source ~/.bashrc

perl -v すると、i686-linux-64int という表示が確認できます。
$ perl -v
This is perl 5, version 18, subversion 1 (v5.18.1) built for i686-linux-64int

Copyright 1987-2013, Larry Wall

Perl may be copied only under the terms of either the Artistic License or the
GNU General Public License, which may be found in the Perl 5 source kit.

Complete documentation for Perl, including FAQ lists, should be found on
this system using "man perl" or "perldoc perl".  If you have access to the
Internet, point your browser at http://www.perl.org/, the Perl Home Page.

これでとりあえず問題なく、Mangoもインストールすることができるはずです。

2013/06/26

Leap Motion on Arch Linux

Leap MotionをArch Linuxで利用する方法です。
Ubuntu向けに提供されているLeap Developer Kitを用います。

※本記事は、2013/06/26現在の情報です。変わらないと思いますが、念のため。
  • 執筆時において、Leap Motionは評価ボードとして一部開発者にのみ配布。また、開発者のみがLeap Developer Kit(ドライバ含)を入手可能。
  • Leap Developer Kit: 0.8.0 5300 Linux (執筆時最新版)
  • OS環境: Arch Linux 64bit (執筆時最新状態) + gnome 3
尚、Leap Developer Kitは、GUIとしてQtを使っているようなので、
Qt環境が必要でしょう...たぶん。(私はインストール済みなので。)

ちなみに...ドライバの動作環境のことに関連して、
同梱のREADMEには次のようなことが書かれています:
Q. How to install on another Linux distro such as CentOS?
A. At this time we are only supporting recent versions of Ubuntu. However, if
you'd like to port the package to another distro you probably have
sufficient tools at your disposal. To view the Debian package, unpack it
with the 'ar' and 'tar' commands and take a look. The 'alien' package
converter mentioned above may also come in handy.
ふむふむ...。ということではじめましょう。

まずは、Leap Developer Kit (Ubuntu向け)をダウンロードします。
(2013/06/26 現在、開発者アカウントでログインしないとダウンロードできません。)

次に、ダウンロードしたアーカイブを展開します。
$ tar zxvf Leap_Developer_Kit_0.8.0_5300_Linux.tar.gz 
$ cd Leap_Developer_Kit_0.8.0_5300_Linux/
$ ls
Examples  Leap-0.8.0-x64.deb  Leap-0.8.0-x86.deb  LeapSDK  README.txt

このように、抽出されたファイルはExamples、LeapSDK、ドライバ(debパッケージ)から構成されます。

このdebパッケージをさらに展開します。
本来であれば、debhelperが使えるはずなのですが、パッケージのコンフリクトで使えなかったため...。
また、alienを使って変換してもいいのですが、単純に展開するだけで良さそうだったので。

$ dpkg -x Leap-0.8.0-x64.deb Leap-0.8.0-x64/
$ cd Leap-0.8.0-x64/
$ ls -lR
.:
合計 8
drwxr-xr-x 3 xxxxxx xxxxxx 4096  6月 11 08:58 lib
drwxr-xr-x 5 xxxxxx xxxxxx 4096  6月 11 08:58 usr

./lib:
合計 4
drwxr-xr-x 3 xxxxxx xxxxxx 4096  6月 11 08:58 udev

./lib/udev:
合計 4
drwxr-xr-x 2 xxxxxx xxxxxx 4096  6月 11 08:58 rules.d

./lib/udev/rules.d:
合計 4
-rw-r--r-- 1 xxxxxx xxxxxx 390  6月  4 11:21 25-com-leapmotion-leap.rules

./usr:
合計 12
drwxr-xr-x 2 xxxxxx xxxxxx 4096  6月 11 08:58 bin
drwxr-xr-x 3 xxxxxx xxxxxx 4096  6月 11 08:58 lib
drwxr-xr-x 3 xxxxxx xxxxxx 4096  6月 11 08:58 share

./usr/bin:
合計 15720
-rwxr-xr-x 1 xxxxxx xxxxxx 2952848  6月 11 08:48 LeapControlPanel
-rwxr-xr-x 1 xxxxxx xxxxxx 2837968  6月 11 08:49 Recalibrate
-rwxr-xr-x 1 xxxxxx xxxxxx 2536248  6月 11 08:48 ScreenLocator
-rwxr-xr-x 1 xxxxxx xxxxxx 2833160  6月 11 08:49 Visualizer
-rwxr-xr-x 1 xxxxxx xxxxxx 4928312  6月 11 08:49 leapd

./usr/lib:
合計 4
drwxr-xr-x 2 xxxxxx xxxxxx 4096  6月 11 08:58 Leap

./usr/lib/Leap:
合計 54300
-rw-r--r-- 1 xxxxxx xxxxxx  2718432  6月 11 08:47 libLeap.so
-rw-r--r-- 1 xxxxxx xxxxxx  3038016  6月 11 08:58 libQtCore.so.4
-rw-r--r-- 1 xxxxxx xxxxxx   523792  6月 11 08:58 libQtDBus.so.4
-rw-r--r-- 1 xxxxxx xxxxxx 11352400  6月 11 08:58 libQtGui.so.4
-rw-r--r-- 1 xxxxxx xxxxxx  3431872  6月 11 08:58 libQtNetwork.so.4
-rw-r--r-- 1 xxxxxx xxxxxx  1042600  6月 11 08:58 libQtOpenGL.so.4
-rw-r--r-- 1 xxxxxx xxxxxx  2631072  6月 11 08:58 libQtScript.so.4
-rw-r--r-- 1 xxxxxx xxxxxx 26316256  6月 11 08:58 libQtWebKit.so.4
-rw-r--r-- 1 xxxxxx xxxxxx  4460008  6月 11 08:58 libQtXmlPatterns.so.4
-rw-r--r-- 1 xxxxxx xxxxxx    73768  6月 11 08:58 libusb-1.0.so.0

./usr/share:
合計 4
drwxr-xr-x 3 xxxxxx xxxxxx 4096  6月 11 08:58 Leap

./usr/share/Leap:
合計 196
drwxr-xr-x 2 xxxxxx xxxxxx  4096  6月 11 08:58 PreferencePane
-rw-r--r-- 1 xxxxxx xxxxxx 50901  6月  4 11:21 app0.dat
-rw-r--r-- 1 xxxxxx xxxxxx 76876  6月  4 11:21 app1.dat
-rw-r--r-- 1 xxxxxx xxxxxx 65515  6月  4 11:21 app2.dat

./usr/share/Leap/PreferencePane:
合計 0
debパッケージの中身(パッケージの定義ファイル等を除く一連のファイル)は、以上のような構造になっていました。

大まかに書くと...
  • usrディレクトリ: バイナリとライブラリ類
  • libディレクトリ: udevのルールファイル
となっています。

では、以上のファイルをシステムにコピーします。
$ sudo cp -ir usr/* /usr/local/
$ sudo cp -ir lib/* /lib/

次に、"plugdev"というグループを作成し、自分のアカウント(xxxx)を"plugdev"グループに所属させます。
$ sudo groupadd plugdev
$ sudo usermod -aG plugdev xxxx
$ exec su -l xxxx

これで完了です。

あとは、Leap Motionを接続し、プログラムを起動するだけです。
$ LeapControlPanel
...これで...動作するはずなのですが、
通知領域のアイコンが黒色のまま、色が変わらない...(汗;)。

うーむ...。現行バージョンでは leapdがデーモンになっていますので、これを実行すると...。
$ leapd
[00:46:49] [Info] WebSocket server started
[00:46:54] [Info] Leap Motion Controller detected: xxxxxxxxxx
[00:46:55] [Info] Processing initialized
動いてるようですね。
ですので、leapdを実行したままの状態で LeapControlPanel を起動してみると...。
$ LeapControlPanel

うまくいきました( ´∀`)b!

また、Visualizerなどもコンソールから起動できます。
$ Visualizer
Leap MotionのVisualizerを起動したところ
以上です♪

p.s.

Arch LinuxのAURに"leap"が登録されていました。
もちろん現時点ではまだ、SDKを誰でもダウンロードできるわけではありませんので、アーカイブの展開を楽にしてくれる程度ですが。
でも、あとちょうど1ヶ月もすると、Leap Motionが一般発売されますね。
どんな世界が待っているのか、楽しみです!

2013/06/23

Arch Linuxからhpのプリンタに直接/ネットワーク接続する (HPLIP)

Arch LinuxなどのLinux環境から、hpのインクジェットプリンタ(複合機)に接続するという話です。直接USB接続したり、ネットワーク接続することができます。

今回接続するhpプリンタは、HP Photosmart 5510 B111a という製品で、
プリンタというか複合機ですが、安いのにタッチパネル&無線LAN搭載(Web管理可能)という代物です。これを家のLAN内に無線LAN接続してあります。
ちなみに、このプリンタはGoogle Cloud Printに対応しているため、普段から印刷するときはクラウド経由で印刷していたりしますが、今回は直接接続して印刷する方法です。
それにしてもhpのプリンタは、音が煩く仕事も力まかせ感があります.....安いけれど。家で使い比べていますが、静音性も丁寧さについては国内メーカーの方が格段に上です。

さて、hpではLinux向けプリンタドライバを オープンソースプロジェクトとして
"HP Linux Imaging and Printing (HPLIP)"という名称で公開しています。
http://h10018.www1.hp.com/wwsolutions/linux/products/printing_imaging/index.html (プリンタ以外にもイメージング/印刷全般ですね。)

Arch Linuxでは、pacmanのextraリポジトリに、この"HPLIP"が含まれています。
https://www.archlinux.org/packages/extra/x86_64/hplip/

従って、pacmanで"hplip"をインストールするだけで使えます。
またGUIの為に"qt4"と"python2-pyqt"を併せてインストールします。
$ sudo pacman -Syu hplip qt4 python2-pyqt

次に、自分のユーザアカウントを"lp"グループに追加して、一旦ログアウトします。
$ sudo usermod -aG lp xxxx
$ logout

その後、"cups"を再起動してから、"hp-setup"を実行します。
$ sudo systemctl restart cups
$ sudo hp-setup

"HP Device Manager"が起動しますので、プリンタと接続する方法を選びます。
USB接続、ネットワーク接続、シリアル接続など...。

今回はLAN接続したプリンタなので、"Network/Ethernet/Wireless ..."を選びます。
さらに...本来はこのまま"Next"しても良いはずですが、プリンタを固定IPアドレスにしてあるので、"Manual Discovery"にチェックを入れ、IPアドレスを入力します (portはそのまま)。 自動よりもこの方が安定するようです。

次に、このようにプリンタ一覧が表示されます。プリンタを選択して"Next"します。

すると、このような画面が表示されます。"Add Printer"をクリックすれば完了です。

CUPSに正しく認識されていれば、このように、
Gnomeの設定画面のプリンタ一覧などにもプリンタが表示されるはずです。
テストページを印刷してみて正しく印刷できるか試してみても良いでしょう。

尚、hp-setupが起動しない場合は...python3で実行されているかもしれません。次のようにpython2で実行してください:
$ python2 /usr/bin/hp-setup
(Arch LinuxではPython3とPython2が共存しているため、このような問題が起きます。
面倒くさければ、python2をデフォルトにしてしまうことをおすすめしますw)


また、hpプリンタの管理は "hp-toolbox" から行えます。
$ sudo hp-toolbox
hp-toolboxを実行したところ。プリンタのインク状態や設定などが行える。



ちなみに...他のLinux(UbuntuやFedora)でhpプリンタを扱いたい場合も同様です。
apt-getやyumから、HPLIPをインストールするだけです。
もしくは、hplipのサイトからパッケージを直接ダウンロードすることもできます。
http://hplipopensource.com/hplip-web/install_wizard/index.html

2013/05/27

Fedora 17 → Fedora 18 にバージョンアップした (gnome3.6)

先日、fedup(fedup-cli)を使って、
メインPCを Fedora 17 → Fedora 18へバージョンアップしました。
(メインとして使っているOSなので...なかなか腰が上がらなくて(笑))

Fedora 18 with gnome 3.6.3.1
GUI環境は...結局、そのまま Gnome3 (バージョン: 3.6.3.1)を使っています。
バージョンアップに際して幾つか気になる点があったので、メモしておきます。

Google Chromeが動作しない:
既知の問題であり、再インストールが必要なようです。
$ sudo yum remove google-chrome-*
$ sudo yum install google-chrome-stable

Gnome shell extensionが無効になっている:
https://extensions.gnome.org/ にログインして、Installed extensionsから
Extensionを有効にしていきましょう。
また、幾つかのExtensionは使えなくなっているので・・・
代替のものを探すか、自分でハックしてパッチを送りましょう(w

Nautilusなどを最大化表示した際にタイトルバーが消えてしまう:
仕様です。
https://extensions.gnome.org/extension/515/ignore_request_hide_titlebar/

Nautilusのメニューバーがない:
トップバーにあるアプリケーションアイコンを右クリックすると代替のメニューが表示されます。
http://askubuntu.com/questions/224970/nautilus-missing-menubar-in-12-10
但し、Extension(例: TaskBar)をインストールして、これを非表示にすると...メニューが表示できなくなるので注意。

マウスカーソルがちらつく問題:
未解決

ウィンドウの最大化/最小化ボタンが無い:
そもそもGnome3からの仕様ですけど、拡張機能などから設定可能です。
http://ankyo.blog.so-net.ne.jp/2011-12-12

Nautilusの右クリックメニューから端末を開けるようにする:
$ sudo yum install nautilus-open-terminal
http://www.if-not-true-then-false.com/2011/nautilus-open-in-terminal-on-fedora-centos-red-hat-rhel/



今回適用した Gnome shell extension (拡張機能):
だいたい以前からそのまま or 代替です。
  • Activities Configurator
    Activities関連のカスタマイズができる。
  • Advanced Volume Mixer
    トップバーの音量アイコンを拡張できる。
  • Alternative Status Menu
    ユーザメニューにSuspend および Power-offを追加できる。
  • Battery remaining time and percentage 
    トップバーの電源表示を拡張できる。
  • Coverflow Alt-Tab
    Alt+Tabによるタスクスイッチャをカバーフロー風表示にできる。
  • CPU Freq
    トップバーにCPUのモードおよび動作クロックを表示できる。
  • Dash to Dock
    便利なドックバー(ランチャとタスクスイッチャ)。
  • ignore_request_hide_titlebar
    タイトルバーが非表示となる動作を抑制できる。
  • Impatience
    アニメーションを高速化できる。
  • Lock Keys
    トップバーにNum Lock および Caps Lockの状態を表示、通知できる。
  • Network Connections Shortcut
    トップバーのネットワークアイコンにネットワーク接続のショートカットを追加できる。
  • Removable Drive Menu
    トップバーにリムーバルドライブのアイコンを追加できる。
  • Remove Accessibility
    トップバーのアクセシビリティアイコンが不要な場合に非表示にできる。
  • SettingsCenter
    Gnome関連の少し細かい設定が行えるようになる。(ランチャー)
  • Status Area Horizontal Spacing
    トップバーの通知領域部分(画面右上のアイコン表示部)の幅を調整できる。
  • TaskBar
    トップバーにタスクバー的なウィンドウスイッチャを追加できる。
  • Touchpad Indicator
    トップバーにタッチパッド(トラックパッド)のインジケータを表示できる。
  • Window Slide In
    ウィンドウ切替時にスライドイン効果を適用。
  • WindowOverlay Icons
    Activities画面などにアプリケーションのアイコンをオーバレイ。


2013/04/28

Raspberry Pi + L-02A + ServersMan SIM (490円SIM) で3G接続

Raspberry Pi(ModelB, Raspbian)を3G回線に接続してみることにしました。

回線は、ServersMan SIM 3G 100 (月額490円SIM)を使います。

通信端末は、RPi界隈においては D02HWがよく使われるようですが、
今回は、docomoのFOMA-USBデータ通信カード L-02Aを使います。安く入手できたので。
(※ 尚、ServersMan SIMは、docomo FOMAのMVNO回線ですので、最近よく売っている Xi端末では利用できません。L-02AはFOMA端末です
【2013/08/08 追記】9月より、ServersMan SIMもXiのMVNO回線 (即ち、LTE)へ移行となるようです。Xi用のデータ通信カードが利用可能となります。)

Raspberry Pi (Model B) + L-02A
加えて今回は、Raspberry Pi上でnginxを起動させ、Webサーバにしてみます。
実用的なサーバを求めているわけではなく、あくまで遊びです(笑)
速度/レイテンシはともかく、動的グローバルIPアドレスが割り当てられるので、一応サーバにも使えます。
(※ DTIはそのような利用目的を推奨していませんし、私もあくまで実験であり推奨しません。自己責任でお願いします。)

【2013/08/08 追記, 2014/04/05 編集】
ServersMan SIM 100がLTEに対応し、ServersMan SIM LTE 100へ移行されることとなりました。
これに伴い、グローバルIPアドレスの提供がなくなり、
プライベートIPアドレスのみとなりましたので基本的にWebサーバなどとしては使えなくなります。
(ngrokなどを使う方法はありますが。)




まずは、WindowsのPCに、SIMカードを取り付けた状態のL-02Aを接続して、一旦設定を行なっておきます。

docomoの接続ツールをインストールします。
接続設定は、Serversman SIMのものを使い、実際に一旦接続してください。
尚、このように一旦設定を行なっておかないと、後から Linux上に接続してponする際、問答無用に"NO CARRIER"でエラーになってしまいました。

次に、Raspberry Piを起動して...
コンソールで apt-getを用いて、"pppconfig"と"eject"をインストールします。
$ sudo apt-get install pppconfig eject

続いて、L-02Aを、Raspberry PiのUSBポートに接続します。

ここで、lsusb コマンドを実行...。
$ lsusb
~~~
Bus 001 Device 007: ID 1004:610c LG Electronics, Inc.
というように、認識されていることがわかります。

ところで、L-02Aは、ゼロインストール機能があるので・・・
接続直後はCD-ROMドライブとして認識される仕様になっています.
$ ls /dev/sr* -la
brw--rw---T+ 1 root cdrom 11, 0 xxx xx xx:xx /dev/sr0
これですね。CD-ROMになっています。

これをEjectすることで、本来のデータカードとして認識されるはず...。
が!しかし...このままejectしても、実際にはうまく行きません。

モデムを/dev/ttyUSB*として認識してほしいところなのですが、
/dev/ttyACM*として認識されてしまいます。

こちらのページによると...。
Ejectを行ったあと、cdc_acmドライバの読み込みが行われるらしいのですが、L-02Aは情報がないため、その読み込みに失敗するそうです。


ですから、対策としてcdc_acmドライバが読み込まれないように設定しておきます。
$ sudo vi /etc/modprobe.d/cdc_acm-blacklist.conf
blacklist cdc_acm

さらに、udevでttyUSB*として認識してもらうための設定をします。
(引用元http://slashdot.jp/journal/491733/ubuntu-9.04-%E3%81%A7-docomo-L-02A-%E3%82%92%E4%BD%BF%E3%81%86 (ありがとうございます!))
$ sudo vi /etc/udev/rules.d/99-foma_l-02a.rules
# for FOMA L-02A
# USB Storage (Zero Installation)
KERNEL=="sr[0-9]*", ENV{ID_VENDOR_ID}=="1004", ENV{ID_MODEL_ID}=="610c", RUN+="/usr/bin/eject /dev/$kernel"

# USB Modem (ttyUSB)
SUBSYSTEM=="usb", ATTR{idVendor}=="1004", ATTR{idProduct}=="6109", RUN+="/sbin/modprobe usbserial vendor=0x$attr{idVendor} product=0x$attr{idProduct}"</del>
これでL-02Aを接続しなおしてみると...。
$ ls /dev/ttyUSB* -la
crw-rw---T 1 root dialout 188, 0 xxx  xx  xxxx /dev/ttyUSB0
crw-rw---T 1 root dialout 188, 1 xxx  xx  xxxx /dev/ttyUSB1
crw-rw---T 1 root dialout 188, 2 xxx  xx  xxxx /dev/ttyUSB2
認識されましたね( ´∀`)b!

続いて、接続設定をします。

pppconfigを実行すると、テキストベースのGUIが表示されます。
$ sudo pppconfig
まずは、[Create]を選択。
尚、都合によりスクリーンショットはターミナルからSSH接続したものですw
  • Provider name:
    ponするときの名前になりますので、適当に入力します。
    ここでは、"serversman_sim100"としました。
  • Number: "*99***1#"
  • Authentication Method: "CHAP"
  • User: "user@3gd.ynmbl.net" → "user@dream.jp" (LTEへの移行にともない変更)
  • Password: "3gd" → "dti"
  • Speed: "115200"
  • Com: "/dev/ttyUSB0"
  • DNS:"Static"を選び、適当にGoogle Public DNSでも登録しておきますw
    ("Dynamic"を選んでも良いはずなのですが、何故かうまくいかなかったので・・・。)
    • Primary: 8.8.8.8
    • Secondary: 8.8.4.4
最後に "Finished"を選択して、接続設定は完了です。

あとは、ponコマンドで接続するだけです。 (ちなみに切断するときは、poffコマンド。)
$ sudo pon serversman_sim100
これで接続されます。
尚、接続中は、L-02Aのランプ(下側)が青色に点灯します。

接続できているか、確認してみましょう。
$ ifconfig -a
ppp0 Link encap:Point-to-Point Protocol
    inet addr:xx.xx.xx.xx  P-t-P:10.64.64.64  Mask:255.255.255.255
    UP POINTOPOINT RUNNING NOARP MULTICAST  MTU:1500  Metric:1
    RX packets:xxxxx errors:x dropped:0 overruns:0 frame:0
    TX packets:xxxxx errors:x dropped:0 overruns:0 carrier:0
    collisions:x txqueuelen:x 
    RX bytes:xxxxxx (xxx.x KiB)  TX bytes:xxxxxx (xxx.x KiB)
グローバルIPアドレスが割り当てられている事が確認できます。

pingも通るようならOKですね。
$ ping google.com
さらに、自動接続できるようにしておきます。
$ sudo gpasswd -a pi dip
$ vi /etc/local.d
~~~~
pon serversman_sim100

exit 0;
接続は以上です。

...おっとw サーバにしてみよう!ということでしたね ( ゚д゚)!

とりあえず、ファイアウォールの設定を。
いつも通りにiptableを直接使ってもいいのですが、Raspbianですし、手軽にufwで。
$ sudo ufw default DENY
$ sudo ufw allow 80/tcp
$ sudo ufw enable
あとは、nginxをインストールしてお茶を濁しておきます(笑)
$ sudo apt-get install nginx
$ sudo service nginx start

これで、他のPCのブラウザから、L-02Aに割り当てられたグローバルIPアドレスにアクセスすることで、Raspberry Pi上のHTTPサーバにアクセスができます!
歴としたWebサーバの完成です∩( ・ω・)∩!w

もちろん...このIPアドレスは変動しますので、一般的な自宅サーバなどと同様に、DDNS (MyDNS.jpなど)のお世話になると良いかと思います。
また、DDNSへのIPアドレス登録には、DiCEを使わせてもらってもいいのですが、今回はもっと簡単に、”数分ごとにIPアドレスの変動をチェックしてDDNSにIPアドレス登録を行う”ようなスクリプトを書きました。

あとは切断された時に自動接続するスクリプトを書いてcrontabに入れておくとか...。
perlでゴリゴリしてみるとか、Webカメラをつないでネットワークカメラ代わりにしてみるとか、何かおもしろいセンサーをつけてみるとか...
(Raspberry Piは普通にLinuxですので大概何でもできてしまいます。夢が膨らみますね(>ω<)♪ww)

※ 最後になりましたが、前もって当然のことながら、SSH等は別途必要に応じて適切に設定しておいてください。(パスワードログインを無効化して公開鍵認証にするとか、ポート変更をするとか....その他諸々。)

2013/03/04

CPAN Testersになろう

先日、Kansai.pm ミーティングに参加して開発意欲をいただいた事もあり...
簡単なCPANモジュールを幾つかリリースしました(>ω<)/(笑)
(今まで自前のperlモジュールは作っていましたが...CPAN公開は初で...。これで私も、一応CPAN Author(><;))

さて、今回の記事は、お世話になっているCPANやCPAN Authorの皆さんに
何か僅かでも恩返し(?)を...ということで "CPAN Testersになろう!"です。

CPAN Testersというのは、CPANで公開されているモジュールのテストを行い、
レポートする活動 および CPAN上で公開されているテスト情報のことです。
新着モジュールを自ら or プログラムでチェックして積極的にレポートを送ってくださる方もいらっしゃるようです。
CPAN Testersや、perlのテストについては、Perlにおけるテストの概要/TAPとは?:Happy Testing Perlを参照させてもらいましょう。
search.cpan.prgなどで見かける、この表記。
PASS (24)は、テスト通過したレポートが24件投稿されているということ。
View Reportsをクリックすると詳細へアクセスできる。

今回は、自らのPCでCPANモジュールをインストールする際に
自動的にテスト結果をレポートするよう設定します。
・・・といっても、とても簡単です。

まずは、CPANシェル(or cpanm)で
Task::CPAN::Reporterをインストールします。

$ cpan Task::CPAN::Reporter
次に、CPANシェルでレポートのための設定を行います。
$ cpan
> o conf init test_report

Generate test reports if CPAN::Reporter is installed (yes/no)? [no] yes
Would you like me configure CPAN::Reporter now? [yes]


email_from? [] Taro Yamada

edit_report? [default:ask/no pass/na:no]

send_report? [default:ask/yes pass/na:yes]

transport? [Metabase uri https://metabase.cpantesters.org/api/v1/ id_file metabase_id.json]

Would you like to run 'metabase-profile' now to create '/home/xxxx/.cpanreporter/metabase_id.json'? [y]

Enter full name: Taro Yamada

> o conf commit
> exit
(基本的に表示のとおり進めるだけで終わります。最後に、o conf commitして、exit。)

これで完了です。
(以前はEメールの設定をして...というのが必要だったのですが、執筆現在試したところによると、不要になっているようです。)

試しに・・・CPANシェルでモジュールを何かインストールしてみてください。
※ 尚、cpanmはレポートには使えませんので、通常のCPANシェルを使います。

例えば、拙作の WebService::Zussar あたりは軽くて試すのにもってk(←←
$ cpan WebService::Zussar
~~~~
CPAN: CPAN::Reporter loaded ok (v1.2009)
Created MYMETA.yml and MYMETA.json
Creating new 'Build' script for 'WebService-Zussar' version 'v0.0.3'
(/usr/bin/perl Build.PL  exited with 0)
CPAN::Reporter: Build.PL result is 'pass', No errors.
Building WebService-Zussar
(./Build exited with 0)
CPAN::Reporter: Build result is 'pass', No errors.
  MUGIFLY/WebService-Zussar-v0.0.3.tar.gz
  ./Build -- OK
Running Build test
# Testing WebService::Zussar 0.0.3
t/00.load.t ................. ok
t/01.fetch_event.t .......... ok
t/010.online_fetch_event.t .. ok
t/02.fetch_event_user.t ..... ok
All tests successful.
Files=4, Tests=37,  2 wallclock secs ( 0.05 usr  0.01 sys +  0.83 cusr  0.11 csys =  1.00 CPU)
Result: PASS
(./Build test exited with 0)
CPAN::Reporter: Test result is 'pass', All tests successful.
CPAN::Reporter: preparing a CPAN Testers report for WebService-Zussar-v0.0.3
CPAN::Reporter: sending test report with 'pass' via Metabase
MUGIFLY/WebService-Zussar-v0.0.3.tar.gz
./Build test -- OK
Running Build install
Building WebService-Zussar
Installing /home/xxxxxx/perl5/lib/perl5/WebService/Zussar.pm
Installing /home/xxxxxx/perl5/man/man3/WebService::Zussar.3pm
  MUGIFLY/WebService-Zussar-v0.0.3.tar.gz
  ./Build install  -- OK
こんな感じで、テスト結果のログがCPANに自動送信されます。
CPAN上に反映されるには数時間〜数日かかりますが、
これだけで、自分の環境でテストを行なってレポートできます。

レポートされたテスト結果は
search.cpan.orgや、metacpan.orgの各モジュールのページからアクセスできます。
モジュールのために徹底したテストを書くということ、また、CPANを中心として、テスト環境が広く、レポートするコミュニティが確立しているということは、perlの一つの文化とも言われています。

大抵、幅ひろい環境でのテスト結果が集まることは、良いことだと思いますし、
私たちも何かしらの形で、少しでも協力できるといいですね♪

2013/02/18

Jenkinsのスレーブノードを追加してみた

先日の記事(Hello, Jenkins. GitLab+Jenkins+perl(Mojolicious)でCIをしてみた)では
GitLab(Gitolite)を使っている環境に、Jenkinsをインストールして、
CIのためのシステム構築を行いましたが...
さらに他のマシンをスレーブとして追加することで、ビルドの負荷分散ができます。

今回は新しいVPSにもJenkinsをインストールして、スレーブにしてみました。
この記事では、スレーブを構築&設定する手順を、書いておきます。(自分用メモとしてw)
  • スレーブ側では、Jenkinsサービスを起動しておく必要はありません。
  • ビルドを行う度に、マスターのJenkinsがSSHを介してスレーブのシェルに接続し、スレーブ上のJenkinsの"スレーブエージェント"を実行する仕組みです。(sshを介して通信するので、特に両者間でVPNを張る必要もありません。)
    参照: Distributed builds - 日本語 - Jenkins Wiki
  • 今回、CIを行う対象のプロジェクトは、マスター上のGitLab(Gitolite)にリポジトリがあるものとします。(先日の記事の続きなので。)
尚、今回は鍵を2つ作成することになります。
  • [マスター側で作成する鍵] カギA  - 手順3で作成
    • マスターのJenkinsが、スレーブに接続するため の鍵。
    • 作成されたカギの公開鍵は、スレーブのauthorized_keysに登録します。
  • [スレーブ側で作成する鍵] カギB  - 手順5で作成
    • スレーブのJenkinsが、Gitリポジトリに接続するため の鍵。
    • 作成されたカギの公開鍵は、GitlabもしくはGitoliteに登録します。
(※ もっと良い手順がありましたら、ご教授お願いします!)


  1. [スレーブ] Jenkinsをインストール。
    (先日の記事 "Hello, Jenkins. GitLab+Jenkins+perl(Mojolicious)でCIをしてみた" を参照のこと。jenkinsサービスを開始する必要はありません。)
  2. [スレーブ] JREをインストール。
  3. [マスター] カギAを .sshディレクトリ(/var/lib/jenkins/.ssh/)に作成。
    $ sudo -u jenkins ssh-keygen
    > /var/lib/jenkins/.ssh/id_rsa_con_slave
  4. (マスター側の.sshディレクトリには既に、マスター自身のJenkinsが Gitリポジトリに接続するための鍵があるわけですので、今回は別の名前にします。)
  5. [スレーブ] カギAの公開鍵(id_rsa_con_slave.pub)の中身を、スレーブ上のJenkinsユーザのauthorized_keys (/var/lib/jenkins/.ssh/authorized_keys) に記述。
    $ sudo -u jenkins vi /var/lib/jenkins/.ssh/authorized_keys
    ssh-rsa ~~~~ jenkins@xxx
    ※ 但し、jenkinsユーザは、/etc/passwd上 で /bin/falseに設定されているので、/bin/bashに変更する。
    もしくは、他のユーザを作成する。(セキュリティ的には後者のほうが安全...か?)
  6. $ sudo -u root vi /etc/passwd
    ~~~~
    jenkins:x:xxx:yyy:Jenkins Continuous Build server:/var/lib/jenkins:/bin/bash
  7. [スレーブ] カギBを .sshディレクトリ(/var/lib/jenkins/.ssh/)に作成。
    $ sudo -u jenkins ssh-keygen
    > /var/lib/jenkins/.ssh/id_rsa
  8. [スレーブ] カギBをGitリポジトリへの接続に使えるよう、.ssh/configに記述。(先日の記事でのマスター側と同様。)
    $ sudo -u jenkins vi /var/lib/jenkins/.ssh/config
    Host example.com
        User gitolite
        Port xx
        Hostname example.com
        IdentityFile /var/lib/jenkins/.ssh/id_rsa
  9. [クライアント] カギBの公開鍵(id_rsa.pub)の中身を、GitLab(もしくはGitolite)のJenkinsユーザのSSH鍵に登録。
    (GitLabを使っているならば、先日の記事と同様に、Webブラウザからjenkinsアカウントでログインして、SSH Keys画面から鍵の追加を行います。)
  10. [スレーブ] known_hostsにGitリポジトリサーバの情報を登録するために、一旦、手動でgit cloneをします。
    $ cd /var/lib/jenkins/
    $ sudo -u jenkins git clone ssh://gitolite@example.com:xx/hoge.git
    > Are you sure you want to continue connecting (yes/no)? yes
    $ sudo -u jenkins rm hoge/ -R
    (cloneしてくるリポジトリは、jenkinsアカウントでgit cloneできるものなら何でもOK。cloneされたディレクトリは、すぐに削除して構いません。)
  11. [クライアント] マスターのJenkinsのノード管理画面で、ノードを追加する。

    • "ノード名": 適当
    • "同時ビルド数": 適当 (スレーブのコア数にするのが妥当)。
    • "リモートFSルート":  "/var/lib/jenkins/"
    • "起動方法":  "SSH経由でLinuxマシンのスレーブエージェントを起動"
    • "ホスト": スレーブのホスト名 or IPアドレス
    • "ユーザ名": "jenkins"
    • "ポート" スレーブのSSHデーモンのポート
    • "秘密鍵":  カギAの秘密鍵 ("/var/lib/jenkins/.ssh/id_rsa_con_slave")
  12. [スレーブ] 各プロジェクトのビルド環境を構築する。
    とりあえず手順9まで終えて、ビルドを実行してみると、まだ失敗することがわかると思います。
    ですので、例えば perlのプロジェクトをCIするのであれば、cpanmのインストールなり、perlのモジュールインストールなりを行います。先日の記事の後半どおり、マスター側と同様。
といった感じです。

スレーブ側では、JenkinsのWeb画面での設定も、ジョブ作成も必要ありません。
その都度、マスターのJenkinsがスレーブへ自動的に転送してくれます。

尚、さらに2台目、3台目のスレーブ...と追加していく場合には、
この記事の手順3は不要ですね。

2013/02/16

以前に作ったUNIX系サーバ用バックアップスクリプト (AmazonS3対応)

以前に作った"UNIX系サーバ用バックアップスクリプト"を公開しました。
任意のディレクトリとMySQLデータベースを、Amazon S3へバックアップできます。
一応、世代管理が可能です。また、ファイルは SquashFSでアーカイブされます。

ちょっと昔に必要に迫られて作ったものだったので...。
かなりのやっつけ仕事で...汚すぎるソースコードですが、一応、今もきちんと動きますので、公開することにしました ヘ(゚∀゚ヘ)w (CentOS 6.3で動作確認済。)
squashfs-tools と perlがあれば動きます。

https://gist.github.com/mugifly/4966246

改造してサーバのcrontabに登録するなり、印刷してゴミ箱にダンクするなり...
よろしければ、ご自由にどうぞ( ´∀`)b


このとおり、Gistに置いておきます。

2013/02/15

VPS複数台をL2TP/IPSec(xl2tpd+openswan)で接続 on CentOS 6

複数台のVPS(さくらのVPS)を、L2TP/IPSecでVPN接続することにしましたので、
自分用メモとして記事にします。今回は、とりあえず2点間接続を行います。
尚、3点間以上も同じ手順でクライアントを追加していくだけです。
(ちなみに目的は、MongoDBでReplicaSet、Shardingを行う為だったりしますw)
  • L2TPの実装: xl2tpd
  • IPSecの実装: openswan
    (昔はFreeS/WanというIPSecの実装があったそうですが、開発が止まっていて・・・。
    そこから派生して現在の主流となっているのが、openswanなんだそうです。なるほど。
サーバは、さくらのVPS (Cent OS 6.x 64bit) です。

記事の内容は試行錯誤の結果であり、間違っている可能性もあります。
もしご指摘、アドバイス等ありましたら、よろしくお願いします m(_ _)m

今回、以下の内容については、
を参考にさせていただきました。(感謝です!! m(_ _)m♪!)


まず、サーバ/クライアント共通の環境構築から。


はじめに、必要なパッケージをインストールします。
既に入っているものも多いかと思いますが...念の為。

$ sudo yum install gcc gmp gmp-devel flex bison libpcap-devel ppp
ところで、この記事では行いませんが・・・
openswanは
NSS(Mozillaによる証明書ライブラリ)による証明書認証に対応しています。後々から証明書に対応できるよう、NSSをインストールしておきましょう。
$ sudo yum install nss nss-devel nss-tools
(実際のところ、VPNを実運用するには、文字列だけでの認証では心許ないです。)

次に、openswanをソースコードからビルドしてインストールします。
(執筆時の最新版は、openswan-2.6.38です。 Amazon S3から配布されているんですね〜。
また...余談ですが、
openswanのサイトには自己署名の証明書が使われているようで、SSLエラーとなりました。ご注意を。)
$ wget https://s3-ap-northeast-1.amazonaws.com/openswanjp/openswan-2.6.38.tar.gz
$ tar zxf openswan-2.6.38.tar.gz
$ cd openswan-2.6.38/
ここでも、後々から証明書を使えるようにNSSサポートを有効にしておきましょう。
ドキュメント(docs/README.nss)によると、Makefile.incのオプションを弄るそうです。
$ vi Makefile.inc
~~~~
# Support for NSS crypto library (does not requires HAVE_THREADS)
# USE_LIBNSS uses pthreads by default.
USE_LIBNSS?=true
~~~~
(372行目付近に2箇所ありますが、USE_LIBNSS?をtrueにしておきます。)

あとはmakeしてインストールです。
$ make programs
$ sudo make install
次に、xl2tpdをビルドしてインストールします。
(執筆時の最新版は、xl2tpd-1.3.1です。ちなみに...EPELリポジトリからインストールする方法もありです。)
$ cd ..
$ wget https://github.com/xelerance/xl2tpd/archive/v1.3.1.tar.gz -O xl2tpd-v1.3.1.tar.gz
$ tar zxf xl2tpd-v1.3.1.tar.gz
$ cd xl2tpd-1.3.1/
$ make
$ sudo make install
さらに、起動用のコマンドをコピーしておきます。
$ su
# cp packaging/fedora/xl2tpd.init /etc/init.d/xl2tpd
# chmod +x /etc/init.d/xl2tpd
(※以降、シンタックスハイライトの都合上、コマンド文の色が黒色ですが、特にお気になさらずに(汗;))
また、/usr/local/sbin にインストールされたので、/usr/sbinからリンクを張ります。 
 # ln -s /usr/local/sbin/xl2tpd /usr/sbin/xl2tpd
サービスも登録しておきます。
 # chkconfig --add xl2tpd
# chkconfig --add ipsec
# chkconfig xl2tpd on
# chkconfig ipsec on
これでインストールは完了です。
(ここまで、サーバ側、クライアント側ともに同じです。)




次に、サーバ側の設定です。


まず、xl2tpd(L2PT)の設定を行なっていきます。
# mkdir /etc/xl2tpd
# cp examples/xl2tpd.conf /etc/xl2tpd/
# cp examples/ppp-options.xl2tpd /etc/ppp/options.xl2tpd
# vi /etc/xl2tpd/xl2tpd.conf
~~~~
[global]
[lnsdefault]
;ip range = 192.168.1.128-192.168.1.254
ip range = 192.168.253.128-192.168.253.254
;local ip = 192.168.1.99
local ip = 192.168.253.1
name = %L2TPNAME%
require chap = yes
refuse pap = yes
require authentication = yes
ppp debug = yes
pppoptfile = /etc/ppp/options.xl2tpd
length bit = yes
(%L2TPNAME%は適当に。以降使っていきます。
ここで指定したip rangeの範囲が、VPN上でクライアントに割り当てられます。
またlocal ipがVPN上でのサーバのプライベートIPアドレスとなります。)
# vi /etc/ppp/options.xl2tpd
name %L2TPNAME%
ms-dns ns1.dns.ne.jp
ms-dns ns2.dns.ne.jp
#ms-dns 192.168.1.1
#ms-dns 192.168.1.3
#ms-wins 192.168.1.2
#ms-wins 192.168.1.4
#noccp
auth
nobsdcomp
crtscts
idle 1800
mtu 1410
mru 1410
nodefaultroute
debug
lock
persist
#proxyarp
connect-delay 5000
refuse-pap
refuse-chap
require-mschap-v2
logfile /var/log/xl2tpd.log
(ns*.dns.ne.jpは、さくらのDNSです。それ以外のDNSサーバを使っている場合は、変更してください。
ただし、今回の場合、ms-dnsは要らないかもしれないです・・・。
 pppの各オプションの意味はググって
ドキュメントを探すか、man pppdで参照できます。)

chap-secrets(ユーザ認証)の設定も行います。
また大事なファイルなので、root以外の閲覧ができないよう権限を設定します。
# vi /etc/ppp/chap-secrets
"%USERNAME%" "%L2TPNAME%" "%CHAP-PASSWORD%" *
(%USERNAME%%CHAP-PASSWORD%も適当に。といっても管理は大切に。)
# chmod 600 /etc/ppp/chap-secrets

次に、openswan(IPSec)の設定を行なっていきます。
# vi /etc/ipsec.conf
version2.0

config setup
    dumpdir=/var/run/pluto/
    nat_traversal=yes    virtual_private=%v4:10.0.0.0/8,%v4:192.168.0.0/16,%v4:172.16.0.0/12
    oe=off
    protostack=netkey
    nhelpers=0
    plutostderrlog=/var/log/pluto

include /etc/ipsec.d/l2tp-psk.conf
次に、Pre-shared Key(共有鍵)の設定も行います。
また、こちらも大事なファイルなので、権限設定します。

# vi /etc/ipsec.secrets<
%SERVER-IPADDRESS% %any : PSK "%PSK-PASSWORD%"
(%SERVER-IPADDRESS%は、サーバのグローバルIPアドレスです。)
# chmod 600 /etc/ipsec.secrets
さらに、L2PTを扱う設定も行います。
# cp /etc/ipsec.d/examples/lt2p-psk.conf /etc/ipsec.d/
# vi /etc/ipsec.d/l2tp-psk.conf
conn L2TP-PSK-NAT
    rightsubnet=0.0.0.0/0
    also=L2TP-PSK-noNAT

conn L2TP-PSK-noNAT
    forceencaps=yes
    authby=secret
    pfs=no
    auto=add
    keyingtries=3
    rekey=yes
    dpddelay=40
    dpdtimeout=130
    dpdaction=clear
    ikelifetime=8h
    keylife=1h
    type=transport
    left=%SERVER-IPADDRESS%
    leftnexthop=%defaultroute
    leftprotoport=17/1701
    right=%any
    rightprotoport=17/%any

#conn passthrough-for-non-l2tp
#    type=passthrough
#    left=YourServerIP
#    leftnexthop=YourGwIP
#    right=0.0.0.0
#    rightsubnet=0.0.0.0/0
#    auto=route
最後に、sysctl.confを変更します。
# /etc/sysctl.conf
~~~~
#net.ipv4.ip_forward = 0
net.ipv4.ip_forward = 1
~~~~
net.ipv4.conf.all.send_redirects = 0
net.ipv4.conf.all.accept_redirects = 0
net.ipv4.conf.default.send_redirects = 0
net.ipv4.conf.default.accept_redirects = 0
net.ipv4.conf.eth0.send_redirects = 0
net.ipv4.conf.eth0.accept_redirects = 0
net.ipv4.conf.lo.send_redirects = 0
net.ipv4.conf.lo.accept_redirects = 0
# sysctl -p
あとは起動して・・・<
# service xl2tpd start
# service ipsec start
動作確認を行います。
# ipsec verify
エラーが出ていなければ、とりあえず問題ないということで。
iptablesも設定しておきます。
# vi /etc/sysconfig/iptables
*filter
~~~~
-P FORWARD DROP
-A INPUT -p udp -m udp --dport 1701 -i eth0 -d %SERVER-IPADDRESS% -j ACCEPT
-A INPUT -p udp -m udp --dport 500 -i eth0 -d %SERVER-IPADDRESS% -j ACCEPT
-A INPUT -p udp -m udp --dport 4500 -i eth0 -d %SERVER-IPADDRESS% -j ACCEPT
-A FORWARD -i ppp+ -o ppp+ -s 192.168.253.0/24 -d 192.168.253.0/24 -j ACCEPT
-A FORWARD -i ppp+ -o eth0 -s 192.168.253.0/24 -j ACCEPT
-A FORWARD -i eth0 -o ppp+ -d 192.168.253.0/24 -m state --state RELATED,ESTABLISHED -j ACCEPT
COMMIT
*nat
-A POSTROUTING -s 192.168.253.0/24 -j MASQUERADE
COMMIT
(参考元: http://www.manabii.info/2012/08/debian-gnu-linux-l2tp-ipsec-vpn-nat.html)
また、必要に応じて、VPN間でアクセス可能なポートなどを設定するといいかもしれません。


# service iptables restart
これでサーバ側の設定は完了です。


さて...次はクライアント側の設定です。


まずは、xl2tpd(L2TP)の設定を行なっていきます。
# mkdir /etc/xl2tpd
# cp examples/xl2tpd.conf /etc/xl2tpd/
# vi /etc/xl2tpd/xl2tpd.conf
[global]

[lac L2TP1]
lns = %SERVER-IPADDRESS%
require chap = yes
refuse pap = yes
require authentication = yes
ppp debug = yes
pppoptfile = /etc/ppp/options.xl2tpd.conn-1
length bit = yes

;[lns default]
;ip range = 192.168.1.128-192.168.1.254
;local ip = 192.168.1.99
;require chap = yes
;refuse pap = yes
;require authentication = yes
;name = LinuxVPNserver
;ppp debug = yes
;pppoptfile = /etc/ppp/options.xl2tpd
;length bit = yes
(lns defaultのセクションはすべてコメントアウトします。
L2TP1は、xl2tpd-controlで接続する際の接続名になります。そのままでも構いません。
次に、こちらもサーバ側と同じようにchap-secretsの設定を行います。
また、root以外の閲覧ができないよう権限を設定します。
# vi /etc/ppp/chap-secrets
"%USERNAME%" "%L2TPNAME%" "%CHAP-PASSWORD%" *
# chmod 600 /etc/ppp/chap-secrets
さらに接続設定を行います。
# vi /etc/ppp/options.xl2tpd.conn-1
name %USERNAME%
noauth
crtscts
mtu 1410
mru 1410
nodefaultroute
lock
#proxyarp
logfile /var/log/xl2tpd.conn-1.log
(どうもこのnoauthが引っ掛かりますが...これを他に変更すると動かないという。
サーバのほうはauthにしていますし、実際認証は行われているのですが・・・。
pppdのドキュメントによれば、noauthは"相手に認証を要求しない"オプションなので、サーバ側に対する話なのか? でもそもそも、CHAPだとサーバから認証を開始しますから...。(イマイチ...よくわかりませんw))


次に、openswan(IPSec)の設定を行なっていきます。
# vi /etc/ipsec.conf
config setup
    dumpdir=/var/run/pluto/
    nat_traversal=yes
    virtual_private=%v4:10.0.0.0/8,%v4:192.168.0.0/16,%v4:172.16.0.0/12
    oe=off
    protostack=netkey
    nhelpers=0
    plutostderrlog=/var/log/pluto
~~~~
include /etc/ipsec.d/connection.conf
# vi /etc/ipsec.d/connection.conf
conn %PEER_L2TP%
    authby=secret
    pfs=no
    rekey=yes
    keyingtries=3
    type=transport
    left=%CLIENT-IPADDRESS%
    leftprotoport=17/1701
    right=%SERVER-IPADDRESS%
    rightprotoport=17/1701
    auto=add
(%PEER_L2TP%は、ipsec autoで接続する際の接続名になります。そのままでも構いません。
%CLIENT-IPADDRESS%は、クライアント側のグローバルIPアドレスです。%defaultrouteでもいいかも。
)

またサーバ側と同じ形式でPre-shared Keyを設定します。
# vi /etc/ipsec.secrets
%CLIENT-IPADDRESS% %any : PSK "%PSK-PASSWORD%"
(%SERVER-IPADDRESS%は、サーバのグローバルIPアドレスです。)
# chmod 600 /etc/ipsec.secrets
最後にこちらも、sysctl.confを変更します。
# /etc/sysctl.conf
~~~~
#net.ipv4.ip_forward = 0
net.ipv4.ip_forward = 1
~~~~
net.ipv4.conf.all.send_redirects = 0
net.ipv4.conf.all.accept_redirects = 0
net.ipv4.conf.default.send_redirects = 0
net.ipv4.conf.default.accept_redirects = 0
net.ipv4.conf.eth0.send_redirects = 0
net.ipv4.conf.eth0.accept_redirects = 0
net.ipv4.conf.lo.send_redirects = 0
net.ipv4.conf.lo.accept_redirects = 0
# sysctl -p
サーバ側と同様にサービスを起動して・・・
# service xl2tpd start
# service ipsec start
ipsec_setup: Starting Openswan IPsec U2.6.38/xxx
・・・とここで...(´・ω・`)
いつまで経ってもスクリプトが終了しない(ターミナルの制御が戻らない)現象が。
どうやら今回は、新調したサーバですのでエントロピープールが足りないようです。
そんなことがあるんですね〜・・・w
# cat /proc/sys/kernel/random/entropy_avail 6
確かに足りないw そんな時には・・・なんか処理をしてもらいます。
# find /# cat /proc/sys/kernel/random/entropy_avail
499
(`・ω・´)シャキーンw これでOKですね。
気を取り直して...

設定確認を行います。
# ipsec verify
問題なければ・・・
いよいよ、IPSecの接続を行います。
# ipsec auto --up PEER_L2TP
続けて、L2TPの接続を開始します。(これでppp0が作成されます。)
# echo "c L2TP1" > /var/run/xl2tpd/l2tp-control

接続確認をしてみましょう。
まずは、クライアント側→サーバ側へping。
# ping 192.168.253.1
・・・ OKでした。
サーバ側→クライアント側へping。
# ping 192.168.253.128
・・・ダブルOK\(^o^)/(←

ちなみに、ifconfigをクライアント側で実行すると、こんな感じに表示されます。
# ifconfig
eth0      Link encap:Ethernet  HWaddr xx:xx:xx:xx:xx:xx
          inet addr:133.242.142.23  Bcast:133.242.143.255  Mask:255.255.254.0
          inet6 addr: xxxx::xxxx:xxx:xxxx:xxxx/64 Scope:Link
          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
          RX packets:xxxxxx errors:0 dropped:0 overruns:0 frame:0
          TX packets:xxxxxx errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:1000
          RX bytes:xxxx (xx MiB)  TX bytes:xxxx (xx MiB)

lo        (略)

ppp0      Link encap:Point-to-Point Protocol
          inet addr:192.168.253.128  P-t-P:192.168.253.1  Mask:255.255.255.255
          UP POINTOPOINT RUNNING NOARP MULTICAST  MTU:1410  Metric:1
          RX packets:19 errors:0 dropped:0 overruns:0 frame:0
          TX packets:23 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:3
          RX bytes:2540 (2.4 KiB)  TX bytes:1504 (1.4 KiB)
(この設定では、クライアント側のppp0のinet addrは、
VPN上でのプライベートIPアドレスとなっているはずです。
また、P-t-Pは、VPN上でのサーバのプライベートIPアドレスとなります。)


以上です。
今回はこれでとりあえず開通させることができましたw

他サイトを参考にさせていただき...。この記事は一応整理した後に書きました。
ただ...実際のところは、何かと嵌ってしまったり(´・ω・`)...
ログファイル(/var/log/secure、/var/log/pluto、/var/log/xl2tpd、/var/log/xl2tpd.conn-1.log あたり)や、設定ファイルとにらめっこしながら、1日以上...試行錯誤していました(^^;)ゞ(笑)
うまくいくときは、すんなり行くんでしょうけどね...(;´д`)トホホ…。

ちなみに...1つ注意しておきたいのですが、ipsec auto --up して接続したときにエラーになると、一旦、ipsec auto --downしないと、再接続しようとしても何も表示されない...ということがありました。
...当然なのかもしれないですが、注意です(><)

あとは...このままで実用するとセキュリティがどうかと思うこともありますので、また設定をさらに弄っていこうと思いますw (X.509証明書認証も。)
ご指摘などありましたら、宜しくお願いします m(_ _)m
今回は以上ということで...それではっ。

[追記]
本記事中には反映していませんが、早速、証明書(X.509)認証に変更してみました。
こちらは大変すんなりと行きましたε-(´∀`*)♪ 本記事の最初のほうに書いたとおり、openswanのビルドを行う際にNSSを有効にしておくと・・・あとは証明書を作成して設定を行うだけです。
NSSでの証明書作成/openswanへの設定はこちらがとても参考になりました:
→ openswanでIPsec VPN(トランスポート・X.509認証) [Fedora14]  (感謝♪)

[2013/04/04 修正]
鍵まわりの問題により、一定時間で接続が切断される不具合があったため、pppまわりの設定を修正しました。

[2013/05/01 追記]
クライアントに割り当てるプライベートIPアドレスの範囲はサーバ側の/etc/xl2tpd/xl2tpd.confで設定しますが、
このプライベートIPアドレスをクライアントごとに固定としたい場合は...
双方の /etc/ppp/chap-secrets で、以下のように指定します。

# vi /etc/ppp/chap-secrets
"%USERNAME%" "%L2TPNAME%" "%CHAP-PASSWORD%" "192.168.253.128"

(この例では、192.168.253.128が割り当てられる。)

2013/02/13

node.jsをソースからビルドしてインストール(簡単) on Fedora17

以前の記事ではnaveを使ってnode.js環境をセットアップしましたが、
今回はソースコードからビルドしてインストールする話です。
といっても特に何のことはなく、とっても簡単です。
コーヒー飲んでたら終わる手軽さです♪

尚、今回利用した環境は、Fedora 17 (64bit)です。

まずはnode.jsのソースコードのアーカイブを取得して...
(執筆時の最新版は、node-v0.8.19でした。尚、Githubからgit cloneしてもOKです。)
$ wget http://nodejs.org/dist/v0.8.19/node-v0.8.19.tar.gz
展開してビルドし、インストールします。 (尚、g++, openssl-devel、pythonなど必要なものは、前もってインストールしておいてください。)
$ tar zxf node-v0.8.19.tar.gz
$ cd node-v0.8.19/
$ ./configure
$ make
$ sudo make install
これで、nodeとnpmがインストールされました。
/usr/local/bin にインストールされたので、/usr/binからリンクを張ります。
$ sudo ln -s /usr/local/bin/node /usr/bin/node
$ sudo ln -s /usr/local/bin/npm /usr/bin/npm
終わりです ( ̄ー ̄)b

2013/02/10

Hello, Jenkins. GitLab+Jenkins+perl(Mojolicious)でCIをしてみた

こたつ最高(>ω<)♪ こたつで丸くなっております、Masanoriです(笑)

公開しているプロジェクトではTravis-CIを使わせていただいていたりするのですが
今回は、自前のGitLabで管理しているプロジェクトにもCIを...ということで...

Jenkinsをインストールして、GitLab上のGitリポジトリ、
および nginx(リバースプロキシとして...)と組み合わせる話(※自分用メモ)です。
また、
Jenkinsを用いて、perl(Mojolicious)のプロジェクトをテストします。
(加えて、CPANモジュールの一時的な自動インストールも行えるようにします。[追記: 2013/02/11])


※尚...Gitlabには、Gitlab CIというシンプルなソフトウェアが提供されており、通常はそちらを使うと良いと思います。今回は Jenkinsを使うこととしました。
Jenknsをちゃんと使ってみたかった!という動機がw
  • サーバはいつも通りのCentOSです。JDKなどもセットアップ済みです。
  • nginxをリバースプロキシとして、Jenkinsを /jenkins 下で動作させます。
    (毎度お断りしておきますが、以下にある設定内容は実際の運用サーバとは異なります。)
  • プロジェクトはすでにGitLabで作成済みで運用中、nginxも運用中です。
以下、
madroom project: Gitoliteに触れずにGitLabのhookからJenkins側でビルドする
を参考にさせていただきました。感謝! m(_ _)m♪
(Gitoliteを弄らない方法になっています。)


まずはJenkinsのウェブサイトからRPMをダウンロードしてインストール。
(LTS版もあるみたいですが、最新のJenkins-1.500を選択。)
$ wget http://pkg.jenkins-ci.org/redhat/jenkins-1.500-1.1.noarch.rpm
$ sudo rpm -ivh jenkins-1.500-1.1.noarch.rpm
これでJenkinsのインストールは完了です。とても楽ちんでありがたいですね。

次にJenkinsからGitリポジトリへアクセスできるよう鍵を作ります。
(今回はサーバ上でなくクライアント上で作って転送したほうが、GitLabでの登録がうまく行くそうです。)
$ ssh-keygen
Enter file in which to save the key (~~~): id_rsa_jenkins
Enter passphrase (empty for no passphrase): (空)
Enter same passphrase again: (空)
作成した鍵は、/var/lib/jenkins/.ssh/ 下に置いておきます。

さらに /var/lib/jenkins/.ssh/config を記述します。
$ sudo vi /var/lib/jenkins/.ssh/config
Host example.com
    User gitolite
    Port xx
    Hostname example.com
    IdentityFile /var/lib/jenkins/.ssh/id_rsa_jenkins
またknown_hostsも手動で記述しておきますw
$ sudo vi /var/lib/jenkins/.ssh/known_hosts
[example.com]:xx,[xxx.xx.xxx.xxx]:xx ssh-rsa ~~~~
次にJenkinsの設定ファイル(/etc/sysconfig/jenkins)を開いて
ポート設定およびディレクトリパスを変更します。

$ sudo vi /etc/sysconfig/jenkins
~~~~
# JENKINS_PORT="8080"
JENKINS_PORT="8888"
~~~~
#JENKINS_ARGS=""
JENKINS_ARGS="--prefix=/jenkins"
さらにnginxの設定ファイルにリバースプロキシのための設定を追加しておきます。
$ sudo vi /etc/nginx/nginx.conf
http {
    ~~~~
    upstream Jenkins.backend {
        server 127.0.0.1:8888;
    }
 ~~~~
    server {
        ~~~~
        location ~ ^/jenkins.* {
                proxy_pass      http://Jenkins.backend
                break;
        }
        ~~~~
    }
}
次に、Gitlabにブラウザからアクセスし、Jenkinsのユーザアカウントを作成します。
またCIを行うプロジェクトの"Reporter"権限をそのアカウントに対し設定します。

さらに、プロジェクトのWebHooks画面で JenkinsのURL (http://example.com/jenkins/git/notifyCommit?url=gitolite@example.com:xxx/yyy.git)
を登録しておきます。

また、作成したアカウントでGitlabにログインして、
さきほど作成した公開鍵を登録します。


次に...Jenkinsを起動します。
$ sudo service jenkins start
これでブラウザからアクセスできるようになっているはずです。 http://example.com/jenkins

早速、"新規ジョブ作成"へ進....
...といいたいところですが、その前に...Git Pluginのインストールです。
これがWebのUIで取得〜適用まで可能になってるんですね〜...素晴らしいです! (ちょっと違うところでは、TracとかRedmineもそうなってきてますが、手軽でありがたいことですw
 以下スクリーンショット付きですw)


まず、"Jenkinsの管理"をクリック。
"プラグインの管理"をクリック。
"利用可能"タブをクリックして...
"Git Plugin"にチェックを入れ、"再起動せずにインストール"をクリック。
(※"Git Server Plugin"などありますが、またこれとは別です。
 "Git Plugin"だけ、フィルタをかけてもうまくヒットしないときがありました。 "高度な設定タブで、設定をいじったり、何回か更新処理を実行した後に正しく表示されました。)

(それにしても...他にも色々おもしろそうなプラグインがwktk)

"インストール完了後、ジョブがなければ〜再起動"にチェックを入れて待ちます。
インストールが終われば、ダッシュボードから再度、"Jenkins"の管理をクリックし、 "システムの設定"をクリックします。

"Git plugin" セクションの"Global Config user.name Value"と、
 "Global Config user.email Value"を入力し、"保存"をクリック。


次に、再度ダッシュボードに戻り、
"新規ジョブ作成"をクリック。
ジョブ名を入力し"フリースタイル・プロジェクトのビルド"を選択。
"OK"をクリック。

"Git"にチェックを入れ "Repositories"の
"Repository URL"に ssh://~なURLを入力して・・・

さらに、"ビルド・トリガ"セクションの "SCMをポーリング"にチェックを入れ "保存"をクリックします。

また最後であれですが..Jenkinsで認証を設定しておきましょう(※最初にやるべきか(汗;
"Jenkinsの管理"→"グローバルセキュリティの設定"から、設定できます。
 [追記:2013/02/11]
"アクセス制御"セクションの "行列による権限設定"を選択して、表を編集することで、非ログインユーザーによる閲覧をブロックすることが可能です。
(※尚、"ログイン済みユーザーに許可"のほうを選択してしまうと、非ログインユーザでも閲覧はできますので注意。)
尚、このグローバルセキュリティの設定ですが、設定ミスによりアクセスできなくなった場合は、
一時的に無効化しましょう (→ Jenkins パスワードのリセット方法 - エンジニアきまぐれTips (感謝♪))


さらにもし必要ならば、別途、nginx側などで閲覧認証をつけてください。

これでプロジェクトを取り込む設定は、ひとまず完了です。

あとは、GitLab上でTest Hookを実行するか、リポジトリにプッシュすれば
Jenkins側で、ひとまずビルドが走ります.........



さて、これではまだ、テストケースを実行して評価することができません。

今回CIを実施したいプロジェクトは、
perlのMojoliciousというWAFで開発しているWebアプリケーションなのですが、
これをJenkinsでテストできるよう設定したいと思います。

Tatsuya Blog » PerlのテストコードをJenkinsで動かすのページを
参考にさせていただきました。感謝です m(_ _)m♪
  • 但し、今回の記事では、テスト実行の際、一時的にCPANモジュールを自動インストールできるようにしておきます
    インストールされるモジュールは、Makefile.PLに定義します。
  • テストスクリプト(t/*.t)とMakefile.PLについては、作成済みです。
    Makefile.PLは、以前の記事: Travis CIでPerl(Mojolicious)アプリケーションを自動テストを参照。
    また、Mojoliciousでのテストスクリプトの書き方は、Test::Mojoなどを参考に。
まず cpanmを Jenkins用に、
Jenkinsのホームディレクトリ(/var/lib/jenkins)下へインストールします。

$ sudo -u jenkins mkdir /var/lib/jenkins/bin
$ cd /var/lib/jenkins/bin
$ sudo -u jenkins curl -LOk https://raw.github.com/miyagawa/cpanminus/master/cpanm
$ sudo chmod +x ./cpanm

次に、cpanmで、TAP::Formatter::JUnit をインストールします。
$ sudo cpanm TAP::Formatter::JUnit

次に、Jenkins上のプロジェクトの設定画面を開きます。


ここでは、"ビルド"セクションで、"シェルの実行"を選び、
"シェルスクリプト"欄に次のコマンドを記述します。
/var/lib/jenkins/bin/cpanm -l dlibs --installdeps .
prove -Idlibs/lib/perl5 -b --formatter=TAP::Formatter::JUnit -lvr t > test_results.xml
(最初にcpanmを使って、dlibsフォルダ下にモジュールを自動ダウンロードしています。
尚、proveコマンドについては、詳細なログが不要であれば-v オプションを取り除くといいです。
オプションについて詳しくは...prove についてのおさらいを参照するとよいでしょう。(感謝♪))


さらに、"テスト後の処理"セクションで、"JUnitテスト結果の集計"を選び、
 "テスト結果XML"欄に次のファイル名を入力します。
test_results.xml
"保存"ボタンをクリックして設定完了です。

あとはプッシュすれば、ビルドが自動的に行われ、テスト結果が生成されます。
また手動でもビルド実行が可能です。

無事通過(PASS)したテスト。Jenkinsでは青色のマークが表示されます。
通知設定などはまた別途行ってください。
それにしても...Jenkinsおじさん、ステキですwww

[2013/02/18 追記]
今回の続きとして...Jenkinsへスレーブを追加してみました。
Masanoriのプログラミング日誌++: Jenkinsのスレーブノードを追加してみた