2013/09/23

YAPC::Asia Tokyo 2013 に参加してきました

9月20日〜23日に開催された "YAPC::Asia Tokyo 2013" に参加してきました。
YAPCは、PerlをはじめとするLL(Lightweight Language)のお祭りです。
尚、今回の会場は、慶應義塾大学 日吉キャンパスでした。
YAPCと関係ありませんが、日吉キャンパスは大きいキャンパスで綺麗ですね。
学内にローソンとか薬局とかバーとか、色々あって羨ましいですw


実は私自身、YAPCにはいつか参加したいなーと思っていながら...
今回が初参加だったりします。

また、Perlを始めたばかりの友人たちも引き連れて行ってきました。
学生なので、無料で参加させていただくことができました。

朝一から移動の都合で少し遅れつつ会場入りしましたが..
皆さん、PCを開きつつ静かに話を聞いていらっしゃいました。

関係ないと思うけれど、Mac率が高かったですw
YAPCといえば、やはり、まずはトークですね!
初心者向けのトークから、技術的・ディープなトークまで...何でもありな感じが楽しかったです。
PerlやLLに一見関係のないトークもあったり。英語のトークも頑張って聞いてみましたww
@papixさん、@yusukebeさん、@goccyさん、... 特に面白く興味深いトークをありがとうございました。
”特別座談会「Rubyの良いところ語ってください 〜そんなPerlで大丈夫か?〜」"の様子。
いつイスの投げ合いが始まっちゃうんだろうとドキドキしましたが、大丈夫でしたw
適材適所。それにPerlだって影響しあって進化し続けていますよね。
ネタありマジメあり...両日のLTも楽しかったです!
(そういえば...ドラ娘さんの居るLT、はじめて実際に見ましたw
その日の都合で5分という持ち時間が3分に短縮...!! となってしまうのもLTの醍醐味ですかねw
)

ノベルティも色々もらえました♪ (一部別途いただいたものも。)
YAPC::Asia Tokyo 2013でいただいたノベルティの数々。
YAPC Tシャツ, タオル, mixiさんのストラップ, Planning Porker,
DeNAさんのうちわ, GaiaX さんの水, 各種シール,  ファイル, など...
こんなにもらえるとは思っていませんでしたw
さくらのクラウドの無料券も入っていました (...これはOSCで既に頂いたので使いませんが。)
今回は(図々しく)、20日に行われた お昼の"ランチセッション"と、"懇親会"にも参加させていただきました。

まず、ランチセッションは、スポンサー企業 (Six Apart さん、Microsoft さん)のお話を聞きながら、お弁当をいただくという企画です。学生には特にありがたいです。
お話を伺いながらお弁当をいただきました。美味しかったです♪
Six Apartさんといえば、Movable Type。使いこなしていきたいものですね!
また、懇親会では、スポンサー企業 (DeNA さん)による出資で、無料で会食がいただけるという...。リッチでびっくりしました。
(懇親会を含め、今回は何かと興奮して写真を撮り忘れてしまいました(^^;))
誰に話しかけようかなーなどと思いつつ、軽いコミュ症っぷりが発揮されかけてしまったのですが(笑)・・・
でも、他のエンジニア/非エンジニアの社会人の参加者や、学生さん、またフォロワーさんとも個別にお話することができ、とても有意義に時間を過ごせました。

今回のYAPCに参加して。
自分個人の今後や趣味においても、プロジェクトにおいても、モチベーションや今後やるべきことのヒントが得られたように思います。

同行してくれた友人たちにも、PerlとYAPCの魅力が理解できたと思いますし、学び得られるものがあったはずです。

早速、友人たちと立ち上げている開発プロジェクトでも、
トークを聞いて学んだことや気づいたこと(マネジメントのこと、開発のこと、その他諸々...)を存分に取り入れていきたいです。
より良いチームのコミュニケーションとかも、まさに必要なことだったりして。

次回は、是非とも、ボランティアスタッフか、トーク/LTとして参加したいです!
ああ...来年が待ち遠しい...(><)/ YAPC::Tohokuも楽しみにしています。

スタッフの皆さん、トークしてくださった皆さん、お話してくださった皆さん、企業スポンサーの皆さん...
総じて、Perl Mongerの皆さん、ありがとうございました m(_ _)m ♪!

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/08/20

Arduino+Bluetoothシリアル通信によるワイヤレスなLED制御

Arduino Leonardoに Bluetoothモジュールを接続して、
シリアル通信で、ワイヤレスなLED制御 (Lチカ) をしてみました。
Android端末とペアリングして制御することもできます。
とりあえずはそれだけですが、かなり簡単です。(ありがたいことにドキュメントも沢山あります。)



今回用いたモノ:

  • "Arduino Leonardo"
  • "Bluetoothモジュール RBT-001"
    技適取得済みのBluetooth2.0(SPP/GAP/SDAP)モジュールです。
  • "RBT-001用シリアルレベルコンバータ Rev.3"
    Arduinoは3.3/5V、RBT-001は3V駆動なので変換が必要です。
    今回は手軽なこの変換基板を用いました。
    これと同様の基板はRBT-001を取り扱っている各社から出ています。
  • "高輝度5mm青色LED OSUB5111A"
    手持ちのLEDです。
  • "カーボン抵抗 1kΩ"

以下、手順を簡単に説明しておきます。


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/06/19

Arch LinuxにおけるNaClプログラム(C++)の開発環境構築とビルド

Arch Linux上で NaCl(Native Client)の開発環境を構築する際には、
基本的には簡単ですが、Pythonの複数環境の共存など落とし穴があります。
自分用のメモを兼ねて、手順を書いておきます。
(本記事は、2013/06/19 現在において最新状態のArch Linux 64bit版を基にしています。)


まずは、pacmanでmultilibリポジトリを扱うよう設定をします。
具体的には、 /etc/pacman.conf に、[multilib]というセクションがあるので、
そのコメントアウトを解除します。

$ sudo vi /etc/pacman.conf
~~~~
[multilib]
Include = /etc/pacman.d/mirrorlist
~~~~
$ sudo pacman -Syy

さらに、pacmanで、gcc-multilibをインストールします。
$ sudo pacman -Syu gcc-multilib

次に、Python環境について、python2がデフォルトとなるように対策をします。
(※ Arch Linuxには、Python2とPython3の環境が共存している場合がありますが、
今回を含めて殆どはPython2を使うので、PATHに追加することで変更しておきます。いつでも戻せます。)

$ mkdir ~/bin/
$ ln -s /usr/bin/python2 ~/bin/python
$ vi ~/.bashrc
PATH=export PATH=/home/xxxxxx/bin:$PATH
(xxxxxxは、自分のユーザ名。)

あとは、通常どおりにNaCl SDKをダウンロードしてアーカイブを展開します。
(参照: https://developers.google.com/native-client/sdk/download)
$ cd ~
$ wget http://storage.googleapis.com/nativeclient-mirror/nacl/nacl_sdk/nacl_sdk.zip
$ unzip nacl_sdk.zip
$ rm nacl_sdk.zip
$ cd nacl_sdk/

さらに、naclsdkでPepperAPIを取得して、設定を行います。
$ ./naclsdk update
$ ./naclsdk list
Bundles:
 I: installed
 *: update available

  I  sdk_tools (stable)
     vs_addin (dev)
     pepper_23 (post_stable)
     pepper_24 (post_stable)
     pepper_25 (post_stable)
     pepper_26 (post_stable)
  I  pepper_27 (stable)
     pepper_28 (beta)
     pepper_canary (canary)

All installed bundles are up-to-date.
$ vi ~/.bashrc
~~~~
export NACL_SDK_ROOT='/opt/nacl_sdk/pepper_27'
(pepper_27は、インストールされたPepperAPIのバージョンとする。)

最後に、サンプルがビルドでき、デーモンも実行できることを確認します。
$ cd pepper_27/examples/
$ make
~~~~
make[1]: ディレクトリ `/home/xxxxxx/nacl_sdk/pepper_27/examples/websocket' に入ります
  CXX newlib/Debug/websocket_x86_32.o
  LINK newlib/Debug/websocket_x86_32.nexe
  CXX newlib/Debug/websocket_x86_64.o
  LINK newlib/Debug/websocket_x86_64.nexe
  CXX _newlib/Debug/websocket_arm.o
  LINK newlib/Debug/websocket_arm.nexe
  CREATE_NMF newlib/Debug/websocket.nmf
make[1]: ディレクトリ `/opt/nacl_sdk/pepper_27/examples/websocket' から出ます
Done building targets.

$ python ../tools/httpd.py

Serving /opt/nacl_sdk/pepper_27/examples on http://localhost:5103/...
尚、ChromeやChromiumにおいて、Webストア以外のローカル上などのNative Clientを動作させるには、
chrome://flags" から、"ネイティブ クライアント"の項目を許可することが必要です。念のため。



2013/06/16

【組み込みOS自作入門】 1章&2章まで進んだ

"12ステップで作る組込みOS自作入門"という書籍で学びながら、組み込みOSを自作してみています。マイコンは、書籍のとおり H8/3069Fです。

組み込みOS自作本で勉強をはじめるという宣言のあと・・・
学業や、Webサービス開発のほうが忙しかったり、
Fedora→Arch Linuxに乗り換えたり、Raspberry PiやArduinoに手を出したり...としているうちに、めちゃくちゃ時間があいてしまいましたが(汗;)・・・

つい先日から少しずつ触りはじめ...今日やっと...まともに進めることができました。
ただいま勉強中のソースコードはGitHubで公開していますww
ソースコードをKL-01ライセンスにしてくださった本の筆者 kozosさん に感謝!
https://github.com/mugifly/study-my12os
コメントと、ちょっとしたメモも英語(Broken english(笑))で書きながら...。
(もう少し...まともな英語をかけるようになりたいものです><;)

さて...まずは、1章。


1章では、Linux上にセルフコンパイル環境とクロスコンパイル環境を構築して、
Hello, worldを表示する簡易的な”ブートローダ”や、ライブラリを作成しました。
文字を出力するための標準ライブラリを自作するというのも新鮮でした。
https://github.com/mugifly/study-my12os/tree/st1

ちなみに、クロスコンパイル環境ですが、Arch Linux (64bit)で問題なく構築できました。
https://github.com/mugifly/study-my12os/wiki/BuildEnvironment
  • binutils-2.23
  • gcc-4.8.1
PCとボードとの接続には、USBシリアル変換ケーブル "BSUSRC06"を使いました。

ボードへの書き込みは、h8write、kz_h8writeの両方で成功しています。
また、端末エミュレータには、Minicomを利用しています。

尚、ビルドと書き込みの手順は、
https://github.com/mugifly/study-my12os/wiki
にメモしておきました。

次に、2章(ブートローダの作成)です。


前章で作成したライブラリ(lib.c)におなじみの機能を追加していきます。

  • memset - メモリへのバイト書き込み
  • memcpy - メモリのコピー
  • memcmp - メモリの比較
  • strlen - 文字列の長さ取得
  • strcpy - 文字列のコピー
  • strcmp - 文字列の比較
  • strncmp - 文字列の比較 (長さ指定)

また、この章では、"SCI (シリアルコントローラ)"の話がでてきました。
要点だけ、メモしておきたいと思います。

  • H8/3069Fに搭載されたSCIは3つあり、すべてCPUに内蔵されている。
  • H8/3069Fのシリアルコネクタは、SCI1(0xffffb8)に接続されている。
    (即ち、SCI1を制御すれば、シリアル通信ができる。)
  • SCI1のレジスタマッピング: (H8/1069Fのマニュアル 13.1.4節に詳細記載)
    • SMR: 0xffffb8 - シリアルモードレジスタ
      (bitは以下の通り。今回は全bitが0となる。)
      • bit0,1 - クロックセレクト (0,0ならば、クロックそのまま)
      • bit3 -  ストップビット長 (0=1bit, 1=2bit)
      • bit4 - パリティの種類 (0=偶数, 1=奇数)
      • bit5 - パリティの有効 (0=無効, 1=有効)
      • bit6 - データ長 (0=8bit, 1=7bit)
      • bit7 - モード (0=調歩同期式, 1=クロック同期式)
    • BRR: 0xffffb9 - ビットレートレジスタ (ボーレート設定)
      あまり高速にするとうまくいかないので、9600bps。
    • SCR: 0xffffba - シリアルコントロールレジスタ (送受信の有効/無効)
      • bit0,1 - クロックイネーブル
      • bit4 - 受信イネーブル (1=送信)
      • bit5 - 送信イネーブル (1=送信)
      • bit6 - 受信割り込みイネーブル (1=割込可能)
      • bit7 - 送信割り込みイネーブル (1=割込可能)
    • TDR: 0xffffbb - トランスミットデータレジスタ (送信する1文字)
    • SSR: 0xffffbc - シリアルステータスレジスタ (送信完了/受信完了)
      • bit6 - 受信ステータス (1=受信完了)
      • bit7 - 送信ステータス (1=送信完了)
    • RDR: 0xffffbd - 受信した1文字を読み出す
  • SCI1を準備する際には・・・
    1. SCI1のSCRにすべて0を書き込むことで一旦無効化。
    2. SCI1のSMRへ通信設定を行う。
    3. 再びSCRを書き換えて有効にする。
  • SCI1で1文字送信する際には・・・
    • SCI1のSSRの送信ステータスが1であることを確認。
    • SCI1のTDRに送信したい1文字を書き込む。
    • SCI1のSSRの送信ステータスを0にする (送信依頼できる)
    • 送信完了すると・・・SCI1のSSRの送信ステータスが1になる。
  • serial.c
    • struct h8_3069f_sci として、SCIのレジスタを操作するための構造体を定義。
    • regs[] として、3つ全てのSCIのための構造体配列を生成。
  • lib.c
    • putc関数では、シリアル通信の仕様に基づいて、改行コードを '\n' → '\r'(0x0d)に変換する。これを"端末変換"という。
      端末変換された文字列は、SERIAL_DEFAULT_DEVICE(SCI1)宛に出力される。
    • 書籍では、端末変換をしない生の入出力を"シリアル"。端末変換をする入出力を"コンソール"という。
さらに、"スタートアップ"の説明もでてきました。
  • startup.s(アセンブリ)の _start からプログラム実行が開始される。
    ここではスタックポインタの設定が行われ、main関数にジャンプする。
    このような処理を"スタートアップ"という。(startup または crt(C RunTime) と呼ばれる。)
  • _startから実行が開始されるのは、CPUにより割り込みのおかげ。
  • H8は "ベクタ割込み方式"である。
    • 割込みハンドラを配置するアドレスを特定アドレス("割込みベクタ")に記述しておく方式。
    • H8の割込みベクタは、メモリ上の0x000000〜0x0000ffに、割込みの種類別に存在する。
    • 起動時(リセット時)には、"リセットベクタ"という割込みが発生する。
      H8では、割込みベクタの0番目がリセットベクタである。
      vector.cのvectors[]で、実際に割込みベクタを定義している。その0番目にstartを指定している。
    • 割込みが発生すると、CPUはこの割込みベクタを参照して、割込みハンドラの配置場所を知る。そして、割込みハンドラに処理がジャンプする。
  • "リンカスクリプト"(ld.scr)では、リンク時に関数や変数をどのアドレス上に配置するかを指定できる。
    ここで、vector.oが先頭に配置されるよう指定されている。
    即ち、vectors[]が0x000000〜0x0000ffに配置されることになる。
この章の追記はライブラリの機能追加くらいだったので、少なめでした。
こちらも無事動作しました。

次は3章です(^^)/♪ 続く...。なるべく早く続きに取り掛かりたい><

2013/05/29

Arduino Leonardoを買ってみた

Arduino Leonardoというボードを買ってみました。
ちなみに....Arduinoシリーズは、Arduino言語という開発言語でプログラムを組んで、簡単に入出力制御などが行える、一種のAVRマイコン(を手軽に扱えるボード)です。
本格的なマイコンボードとはまた一味違う楽しみ方ができます。
以前から欲しかったのですが、安かったのでつい!これで私もArduinoデビューですw
(Arduino自体がオープンプラットフォームのため、色んな会社から互換ボードや拡張ボードが発売されていたりします。)

今回購入したArduino Leonardoとその他モジュール類など...
Arduino Leonardoのパッケージを開封したところ。
実際にはかなり小さくて、ある意味かわいい感じですw
パッケージもかわいいデザインですね。
今回は、この Arduino Leonardo と、Bluetoothモジュール、
LEDやセンサーなども一緒に買いました。(ついでに追加のブレッドボードなんかも...w)

ところで。以前に購入した Raspberry Pi(名刺サイズのLinuxボード) は、
搭載されたGPIOポートを用いて、センサなどのモジュール類を接続できます。
しかし、そのポートはデジタル専用であり、アナログ制御は基本的にできません。
そこでArduinoを組み合わせると、アナログ制御も比較的容易に行えるようになります。

もちろん、Raspberry Pi単体や、Arduino単体だけでも色々と遊べるのですが、
そのような感じで、Raspberry PiとArduinoを組み合わせることで、
さらに楽しさが広がるわけです。

...ということで何かやってみたいと思います。
実はつい先日、Raspberry Pi (Model B)をもう一台購入したのですが、
その前に3G回線に接続できるようにしたあの一台は今、大学の研究室に置いてあったりします。そこにArduinoを組み合わせて...遊んでみたいと思いますww

それでは♪

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/04/08

Google+風のフィードバック(ご意見・ご感想)機能を実装できるライブラリ

ちょっと旬からは遠ざかった気がしますが...
Google+風のフィードバック(ご意見・ご感想)機能を実装したいな〜と思い、
既存のものがあったはず...と探してみましたので、メモ程度にまとめておきます。

画面右下等に表示された"フィードバック(ご意見・ご感想)"ボタンをクリックすると、
DOMのスクリーンショットをブラウザ上で作成して、文章に添付して問い合わせできるアレです。
尚、これらのライブラリは、フィードバックの作成・送信までを行うのみですから、
バックエンド側の実装は別途行う必要があります。
(ちなみにGoogle公式では、Google Feedbackというシステムになっており、管理まで包括的に行えるようです。これが一般に開放されると、とても便利になると思うのですが。)

feedback.js
http://experiments.hertzen.com/jsfeedback/
サンプル: http://experiments.hertzen.com/jsfeedback/examples/combination/index.html
feedback.jsのサンプル。
ハイライト、塗りつぶしともに動作しました。
dom-feedback
https://github.com/jankuca/dom-feedback
サンプル: http://jankuca.github.io/dom-feedback/example/
dom-feedbackのサンプル。
しかし、私の環境ではうまく動作しませんでした。 (Google Chrome 24.0)
jQuery.sendFeedback
https://github.com/Chevex/jQuery.sendFeedback
サンプル: http://mugifly.site44.com/masanoriprog/2013-04-08_web_feedback/jquery.send_feedback/index.html
こちらは、その名のとおり、jQueryプラグインになっています。
jQuery.sendFeedbackのサンプル。
枠を描画する機能はあるものの、ハイライトや塗りつぶしは無いようです。

個人的な感想としては...今のところ、feedback.jsが最も実用できそうな感じですね。

もちろん、いずれもオープンソースですので、Pull Requestを送ったり、
これを参考にさせてもらって自分で実装するなりしても良いと思います。
(ちょうど、feedback.jsの開発者の方が公開してくださっている html2canvas を使えば、
クライアント上でJavaScriptのみでのスクリーンショット生成が簡単に行えます。)


また、有償のWebサービスですが、次のようなものもありました。

Webサービスのカスタマサポートなどに使うのであれば、検討してみても良さそうです。

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/24

Kansai.pm 第15回ミーティングに行ってきた&初LTさせてもらった

今日は、Kansai.pm 第15回ミーティングに行ってきました。
さらに図々しく、はじめてのLTもさせていただきました
主催者の若林さん(@nqounetさん)や懇親会主催者の@__papix__さんに
あらためてお礼申し上げます。ありがとうございました。 m(_ _)m♪

会場は大阪富国生命ビルにあるYahoo!さんのセミナールームでした!

早速、感想と反省文を書きたいと思います ><

私にとって今回が初の勉強会なのですが、まず...なんといっても...
刺激を受けることができ、開発意欲があがりましたw
(でも事実、自分の勉強の無さと浅さが...身に染みました...(;´д`)…。)
特に印象に残った発表を、書いていきたいと思います。

"「Webサービスのつくり方」のつくり方" @yusukebe さん

(えっと、まず、○ノアールやコメ○はノマドワークに最適という情報がww なるほどw)
http://www.slideshare.net/yusukebe/web-16710062

書籍 "Webサービスのつくり方" を執筆された話+もっと言いたかった事 でした。
この本は、perl本からのテーマ変更を経て、3年越しに実現された夢なのだとか...。
perlを使ったWebプログラミングの仕方ではなく、
自分たち(極少人数チーム)でWebサービスを立ち上げるお話になっていて...
Webサービスをいかに生み出し、それがどれだけ楽しいことか!”を教えてくれる本だそうです。

まだ私自身、この本は、Amazonのなか見検索でぱらっと見て、
目次を読んで....おもしろそうwwwと思って、ウィッシュリストに追加していた状態だったので...持っていないのです...。早速入手して読もうと思います。
(そして...読んでみたら?と本気で友人に推したい・・・。(切実))

原稿を執筆する際にMarkdownで書いてDropboxで共有管理していたこと。
Dropdownという自作アプリで原稿をHTML化して共有していたこと...。
(ちょうど、自分のLTネタでText::Markdownをにわかに使わせていただいたこともあって、タイムリーだなぁ〜...しかしアイデアが自分とは違うなぁ....(´・ω・`)とも思ったり...)

運営会社となるオモロキを立ち上げた際の話も勉強になりました。
  • 話し合いルールを暗黙の了解で。
    • みんながリーダーシップを発揮する。
    • 打ち合わせをダラダラしない。
    • 最初はメンバーの意見を否定しない。
    • マネタイズは後から。
楽しくやるのが一番.
私もやはり、そういうウェブ開発を仲間とやりとげたいなぁ...。
(ちなみに、ボケての開発はバックエンドはyusukebeさん 1人なのだとか。
プロジェクト的な
人数は7人、タイアップ企画などは3人とかで、その方がやはり意思決定が高速なのだそうです。ふむふむ。)

あと...yusukebeさんはMojolicious推しだということで!
  • Modelが不可知なのが良い
    (私も、好きなCPANモジュールを使おうという気楽さが好きです。)
  • MVCモデルで、PC/モバイルサイトを分けるときも、Modelにビジネスロジックを実装して共通化できるということ。
  • Modelの構造の組み方 (バックエンドのデータベースへのモジュール構造)も事例紹介がありました。
    (実際、私も迷っていたりするので...こういう事例はとてもありがたいんですw)
  • "Mojolicious本をKindle出版で出したい"という話も。めちゃくちゃ期待!
サーバの運用についての話もありました。
  • 当初はVPSで運用していたそうですが、VPSは2台程までがベスト
    それ以上はAWSなどクラウドのほうが良いとのこと。
    (なぜなら、管理も面倒だし、スケールするのに支払いの手間と時間が...。確かにめんどくさいですね...。)


"コピペと闘う (perlコピペコード検出器)" goccy さん


perlのソースコードを、独自のパーサで解析し、
ソースコードのコピペ(重複)部分を検出できるツールです。
検出結果はブラウザ上でもできて・・・コードに対して点数が表示され、
グラフという形で視覚的に閲覧できるというスグレモノでした。(しかも解析が高速。)

今回は、Mojoliciousと、Catalystのコードを例にして解析。
(うわっ!Riedelさ〜んwww!!>< )
Namespaceごとに解析が行われて、10秒ほどで、検出された行が出力されました。

それにしても、"Only perl can parse Perl"という言葉があるように、
Perlの構文解析は他言語より格段に難しいのですが...
そのパーサを作られたことがまずすごいww
(Perlのパーサ開発は正規表現まわりが特に辛いのだとか。この方はmixiでお仕事されているそうで。
パーサ書いちゃうってスゴイ!!のに...さらにすごい人がいっぱいいるとか...。mixi恐るべし。

ちなみに、mixiはNamespaceごとに開発してるので、問題があったNamespaceごとに、その担当グループにリファクタリングをお願いするんだそうです。)


"Cinnamon (simple deploy tool)" @shiba_yu36 さん


Capistranoがややこしいということで作られたデプロイツールだそうです。
シンプルで設定も楽、DSLで書けるぞ!!ということです。
https://github.com/kentaro/cinnamon

サンプルがこれ。
https://github.com/shibayu36/cinnamon-deploy-sample
(サーバの起動、再起動、最新状態の反映、依存モジュールのインストールなんかがサッと実行できます。)
任意のコマンドを実行するようになっているので、応用が効きそうですね。

Role=対象サーバ、Task=処理(実行したい任意のコマンド群) を定義し...
$ cinnamon production update
例えば、これで、productionなサーバに対して、アップデートTaskが一括実行できると。

実は...私、デプロイツールという言葉は知っているものの、
実際に使ったことは無かったのです。この機会に早速使ってみたいと思います。
(私など、単純に2台目以上ある〜などで、もうめんどくさくなるタイプですしw
ちなみに...あんまり”デプロイツール”を使っている人はいらっしゃらないようでした。・・・だけど、もう使わない手は無い。便利そうです。)

でも、shiba_yu36さんが言うに、
Capistranoも本当に使いこなせれば、やっぱり相当便利に使えてるのだけど、そこまでなかなか...なのだとか。



他のトークやLTも興味深いもの、面白いものがありましたww

Perl Ocean、既存や開発中のサービスにも連携したチャットサービスなどを容易に組み込めそう。
→ http://www.slideshare.net/lapis25/kansaipm15-perl-ocean

PerlはAcmeも楽しいですね!!エラーメッセージをネコにしたいwww

Unicodeな話は...私にはちょいと難しかったです(´;ω;`)

DBIx::Letency、O/Rマッパのベンチマーク!
Kansai.pmでORMのパフォーマンスチェッカの構想についてLTしてきた - ゆううきブログ
(それにしても、私のと比べものにならないくらい...役に立つ思い付きだ...。
私、若干気になるとか言いつつも他人ソース任せでしたから・・・自分でやるのは大切ですね。)


MTをCMSとしてもっと活用する。
プラグインが豊富 (&比較的難しくなく作れるらしい)
→ 一例: https://github.com/ogawa/mt-plugin-Minifier

あと、Kansai.pmの活動と、Perl入学式の話など。
特に今期(4月から)のPerl入学式には友人を誘って行ってみたいなぁ...という希望と、私も何かお手伝いできたらなぁ...と思ったり。


あ、ちなみに・・・私のLTネタは...
"半日で Markdown+SQLite3なWiki を作ってみた"でした。
普段使っているWikiクローンがMarkdownで書けないということで、そのまま話にした感じです。

約半日で、Markdown Wikiとしての基本機能は実装できました。CPANモジュール様々です! (認証機能こそ無いですが、世代管理や衝突チェックは実装済み。)

ひどいコードですが...(拙作 mojo_template についている、OAuth認証の残骸を残していたり)
https://github.com/mugifly/LtWiki

でも、Markdownのperl製Wikiクローンって見かけませんし、
SQLiteデータベースを使うものはさらに無いと思うので・・・
また時間がかかってもマトモなWikiに作り直せたらなぁ...と思ったりしています。
尚、安全性を考えた上でサンプルを一時的に公開していますが、さっさと認証機能実装して差し替えます。

まず反省から書くと・・・
  • 実は当初、ふつうにGoogle Driveのプレゼンテーションで作成していたのですが、どうもPreziが気になって...作りかけていたのを丸ごと捨ててww、初めてPreziを使いました。が、まだ自分でうまく扱えなくて...動きすぎ...見づらかったですね...。
  • ともかく、適切でない表現があったり、話す内容がまとめられていなかったりとプレゼンという面でも反省点は多かったです。内容も悪ふざけが...すみません。初なのにこのようなLTになってしまって。(また、perl本をもっと出してほしいなどと偉そうなことを言ってしまい申し訳ありませんでした。初心者故の希望です...。)
スライドを張っておきます:


それと...今回、boketeのステッカーをいただきましたw
早速、PCに貼っておきます。

あと、LTのドーナツ美味しかったです!ww

懇親会も楽しかったです。
私みたいなショボい学生ですが....。何より、エンジニアの方と話せて良かった!!
(内心、Webサービス系企業の興味が...。企画も....バックエンドも...やりたいな...。)

以上。勢いでガガッと記事を書いたら、長くなってしまいましたww
※間違い、勘違い等ありましたら、ご指摘をお願い致します。

紹介いただいたもの(特に気になったもの)は、休み中に試していけたらな〜と思います。

参加された皆さん、ありがとうございました m(_ _)m♪
次回もぜひ参加したいです。今度は...もっと勉強を深めていきます...。
(...マトモなCPANモジュールも一つでも思いついてリリースできれば...。)

p.s.
ここまで書いて、気づきましたw! 写真が一枚もないorz
カバンにコンデジ(S110)入れて持っていったのになぁ。...私としたことが。

[2013/02/24 12:00 一部追記]

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が割り当てられる。)