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は不要ですね。