戯言

自社サービスを開発、運営している会社でスクラムマスターをやっている人の戯言です。

我が家の nasne 無線化環境のその後 2016

2012年の年末に思い立って購入し、設置したnasne

harakachi.hatenablog.com

harakachi.hatenablog.com


あれから色々とありました。
いまは2016年末なのでかれこれ4年も利用していますが、nasneさんはまだまだ現役バリバリで生き続けています。
しかし、無線環境は変わりました。
自分のため、世のため人のためにも変遷の歴史を投下しておきます。

無線ルーターの変更

環境構築後、家の中での利用は概ね問題は無かったのですが、外出先からCHAN-TORUを利用したリモートテレビ予約をしようとすると、nasneが見つけられないことが度々発生していました。
設定の見直し、LANケーブルの変更などを試みて改善を図ったのですが、いずれも一時的に問題が解消するものの、何度も再発を繰り返す状態に。

これはもうルーターがおかしい。もういっそBufflo製品やめる!と思い立ち、衝動的にNEC製ルータ PA-WG600HP を購入しました。
これが2014年8月の出来事です。当時のお値段は6000円未満。

日本電気 AtermWG600HP PA-WG600HP

日本電気 AtermWG600HP PA-WG600HP

こちらはすこぶる調子がよく、上記の問題も解消され、今でも現役バリバリで動いています。
3DSwii用の2.4G帯域、その他ほとんど用の5G帯域と使い分けていますが、なんら不自由はありません。
設定画面も見やすいですし、謎のwindowsソフトウェアインストールなども不要です。

いまではiPhoneのトルネアプリで外出先から録画予約はもちろん、録画したものの再生も多いのですが、何の不自由もなく利用できています。

torne™ mobile

torne™ mobile

  • PlayStation Mobile Inc.
  • エンターテインメント
  • 無料

イーサネットコンバータの変更

今回この記事を書いておこうと思ったきっかけがこれで、nasne & PS3を無線化するためのイーサネットコンバータ AG300N/V がお亡くなりになりました。
つい先日(2016年12月上旬)の出来事です。
原因はこたつなど、暖房器具類と電子レンジか何かを同時に利用してしまい、ブレーカーが落ちたこと。
復帰後にうんともすんとも言わなくなっておりました。
検索するとAG300N/Vが突然壊れるのはよくあることなようで・・・。我が家のは長生きしていた方なのかもしれません。
雷でルーターが壊れたなんて昔はよく話を聞きましたけどね。はい、すみません。

いまどきイーサネットコンバータなんて・・・どれを買えばいいのかと途方に暮れます。
旧ルータの Bufflo WZR-600DHP がイーサネットコンバータとして再利用できる?と一瞬頭をよぎりましたが、出来たとしても接続が不安定になるのはご勘弁。
やはり購入するしかないかーということで唯一のイーサネットコンバータ生き残りのような PA-WL300NE/AG を購入しました。
スペックはAG300N/Vとほぼ同じで、LANの口が2つ付いています。大きさは一回り大きめ。6000円弱と、突然なのでやや痛い出費。

NEC Aterm WL300NE-AG (Ethernet子機) PA-WL300NE/AG

NEC Aterm WL300NE-AG (Ethernet子機) PA-WL300NE/AG

イーサネットコンバータの設定というと非常に嫌な思い出が蘇ってしまうのですが、こちらは慣れてしまえば楽ですね。
らくらく設定ボタンを押しながらコンセントに接続。そのまま1分待つとDHCPサーバとして立ち上がってくれます。
イーサネットコンバータの中でhttpdが動くので、PCをLANケーブルで直接接続し、ブラウザから管理画面を開き、所定のSSIDに接続して再起動。これだけです!所要時間5分未満で済みました。
LANケーブルが刺さってブラウザが開けるならば、windowsだろうがmacだろうがLinuxだろうが設定できて便利。へんてこなソフトウェアをインストールさせられることもありません。
ちなみに今回NEC製品同士になったので「らくらく設定」などAOSS的なのも利用できそうでしたが、どこにどんなふうに接続されるか不明なので利用していません。自分でやったほうが安心できますよ!

まとめ

我が家のnasne無線化は Bufflo製品から始まり、設定の難しさ、不安定さを味わい、結局NEC製品で安定しました。イーサネットコンバータは購入したばかりですけども。
TVアンテナと電話回線の口(というかVDSL機)が近くにある素敵な構造の部屋がないかぎり、nasneを無線化したいという欲求が無くなることはないと思います。
同じように困っている方に何らか情報提供できていると幸いです。

※ほとんど更新していないblogですが、「nasne」のキーワードでたどり着く方が多いため、こちらを書きました。

Amon2で遊びたい(実践編)

前回からの続き。amon2-setup.plからスタートです。
Amon2は6.00が入っています。
ググると過去バージョンと現在のバージョンとは動作が違うことが結構ありました。
今回は全面的に PerlのWAF,Amon2の使い方とサンプルアプリケーション - uzutaka's notes こちらの写経をしていく中での気付きを書いていきます。

amon2-setup.pl

前回、/usr/local/binに入れているので、コマンド的には

# amon2-setup.pl (プロジェクト名)

オプションにFlavorが選択出来るようですが、どんな差があるのか一旦置き。
とりあえずデフォ。

コマンドを叩くとプロジェクト名に指定した名前のディレクトリが作成されるので、以後はそちらにcdしてからの作業になる。

carton install

cpanfileが自動生成されているのでcarton installする。
前回plenvで環境を作っているので

plenv exec carton install

ということになる。
結構時間を要するのでしばし待つ。

hello world

ここまで来ると、一旦表示確認ができる。
サーバの起動コマンドは下記になる

plenv exec carton exec -- perl -Ilib script/(プロジェクト名)-server -host (awsのホスト名:5000)

plenvのcarton installを行ったので、perlコマンドを実行する時も明示的に指定する必要がある。
それと-hostで正しい名前を渡してあげないと表示確認ができなかった。
ここで数時間ハマり、amon2-setup.plを覗いてみてhost名が指定できることが判った。。。
localhostで動作させている分には困らない事なのだろうけど注意されたし。
ポート番号はデフォで5000番になるようだ。

mysql setup

いきなり感のあるDB setupだが、冒頭で紹介したblogの写経を進めていくとmysqlが必要になる。
AMIにはもちろん入っているはずも無いので、自前でsetupする必要がある。

$ sudo yum install mysql
$ sudo yum install mysql-server

my.cnf

とにかく動いてさえくれればいいのだけど、せっかくなので設定する。
とはいえデフォで用意されているものをコピーしてくるだけ。
デフォの設定ファイルは /usr/share/mysql/ に用意されている my-*.cnf だ。
メモリ使用量毎で選べるようになっている。
現在のインスタンスのメモリ量を見てみると・・

$ cat /proc/meminfo
MemTotal: 608292 kB
MemFree: 99044 kB
・・・以下略

600M詰んでいるがほぼ使ってしまっている状態なので64M以下で推奨される my-small.cnf を利用する

# sudo cp -ipu /etc/my.cnf /etc/my.cnf.bak # 念のためのバックアップ
# sudo cp /usr/share/mysql/my-small.cnf /etc/my.cnf

mysqld起動

起動コマンドを打ってみる

$ sudo service mysqld start

・・・。何故か起動しない。そしてエラーログにも何も出てこない?

まずはエラーの詳細を把握しないといけないのでmy.cnfに1行追加

log-error=/var/log/mysqld.log

すると、どうもmysql_install_dbがうまく動いていなかったらしい。
ということでコマンドを実行してみる

$ sudo mysql_install_db --datadir=/var/lib/mysql --user=mysql

そしてもう1度起動コマンド

$ sudo service mysqld start
Starting mysqld: [ OK ]

動いた!

DBD::mysql

Tengからmysqlに接続する部分でエラーが出る。
どうやらDBD::mysqlが無いようなので、cpanfileに

requires 'DBD::mysql';

と書いてplenv exec carton install するも、エラーで弾かれる。
エラーの内容はmysql.hを探しているが、無いよーというものだった。
これらはmysql-develを入れることで解決できた

$ sudo yum install mysql-devel

その他

写経元と現在ではTengも書き変わっているようで、DB.pm の $self->search の結果はTeng::Iteratorになっている。
いきなりget_columnすると怒られるので $itr->next()してあげる必要がある。
一応ソースはpushした
https://github.com/harakachi/Amon2tutorial

まとめ

これでイケてるPerl環境を作りつつ、DBと連携するWebページを作るための一通りの流れができたのではないかと思う。
問題はここから先、何を作ればいいのか、なのだけど。

Amon2で遊びたい(準備編)

perlの会社に勤めてますが、WAFは自社製なのでいまいち最近の流行に乗れません。
少し時間が空いたのでAmon2で何か作ってみることにした。
参考にした資料やURLなどを備忘録として残しておきます。

サーバ

せっかくなので、AWSを触ってみるためにEC2に仮想マシンを1台確保。
一人でいじくるだけなら無料の範囲なので、とりあえずこれで試してみる。

AWSアカウント作成〜sshログイン〜apache起動まで

アカウント作成は簡単だけどクレカ入力が必要だった。
どこにも公開するつもりはないが、何かイタズラされると課金がはじまってしまう怖さも若干ある。
無料アカウント作成の流れ | アマゾン ウェブ サービス(AWS 日本語)

アカウントが出来てからはこちらの資料の流れでインスタンス立ち上げ。
細かなUIは変わってますが、ほぼ問題無し。
はじめてのアマゾンクラウド②[仮想サーバ(Amazon EC2)を立ち上げる]
今回、イメージは何でも良かったので、おすすめ通りにAMIにした。

資料の通りに進めるだけでapache起動までいける。便利な世の中や・・・

plackまわりはポート5000番を利用することが多いようなので、Custom TCP ruleを作って「5000 0.0.0.0/0」を追加するのを忘れずにやる。

PSGI/Plack

きっとこの辺の知識も必要になるだろうと思われたので、まずはざーっと読み漁る。
第1回 PSGI/Plack―フレームワークとサーバをつなぐエンジン (1):Perl Hackers Hub|gihyo.jp … 技術評論社

cpanは設定がめんどいという印象が染み付いてしまっているので、飛び級でcpanmからインストール

# sudo su -
# cd /bin
# curl -LO http://xrl.us/cpanm --insecure
# chmod +x cpanm

cpanmが使えるようになるので Plackを入れます

# cpanm Task::Plack

こちらのブログ AWS EC2+RDSにPSGI環境のMovable Typeを動かす! | MONSTER DIVE【モンスターダイブ】 でも指摘されているように、何故か入らなかったモジュールがあったのでこちらも個別に入れます

# cpanm CGI::Emulate::PSGI
# cpanm CGI::Compile

plackhello world するところまでは、まんまこちらのコピペで sample.psgi を作ります
Plack入門:Plackでウェブサーバを起動してhello worldするまで - DQNEO起業日記

http://(awsのホスト名):5000/ で接続できればひとまず動作確認としてはOK。

plenv + cpanm + carton環境の構築

ここからAmon2インストールに行ってもいいのだけど、cartonを使うのでせっかくだからperlの環境もしっかり作ろうかと。

plenv

AMIのPerlバージョンは5.10。このままでも困らないことではあるけれど、せっかくなので新しめのPerl5.18.2を使ってみたい。
plenvのインストールはほぼこちらの通り 続・plenvを使ってみた - Masteries
perl-buildが必要なのでお忘れなく。

# git clone git://github.com/tokuhirom/plenv.git ~/.plenv
# git clone git://github.com/tokuhirom/Perl-Build.git ~/.plenv/plugins/perl-build/
# echo 'export PATH="$HOME/.plenv/bin:$PATH"' >> ~/.bash_profile
# echo 'eval "$(plenv init -)"' >> ~/.bash_profile
# exec $SHELL -l

利用できるPerlバージョン一覧を取得して

# plenv install -l

お好みのPerlを入れよう。結構時間がかかります。

# plenv install 5.18.2

installだけでは利用することにはならないので、バージョンを指定する

# plenv global 5.18.2

globalとか何なの?という疑問も先ほどのブログで説明されている。
大変ありがたい。

cpanm

最初の方で /binにcpanmを入れているが、今回は「「plenvで利用するPerl」で動くcpanm」」をインストールする。

# plenv install-cpanm

Perlバージョンを変えるたびに install-cpanmしないといけないかどうかは判らない(たぶん必要)。

Carton

後で使うので入れておこう。plenvのcpanmで入れる

# plenv exec cpanm Carton

Amon2をインストールする

やっとここまで来た。しかしインストール方法が3通り存在する・・・

cpanfileを記述してcartonで入れる

Cartonが使えるのでcpanfileを作って「requires 'Amon2';」とだけ1行書き、carton installする。
一見シンプルで良さそうだが、よくよく考えると頭がごちゃごちゃしてくる。
そもそもcartonは「プロジェクトをgit cloneしてきてcarton install!」みたいな用途のはず。
Amon2を入れるためだけにcpanfileを利用するのは何か違うんじゃない?という違和感を感じる。
Amon2を入れるだけというプロジェクトならいいのだろうけど。
ということでたぶんパス。

plenvのcpanmでインストールする。

plenv exec cpanm Task::Amon2

上記コマンドを実行すると、plenvで利用しているPerlの配下にインストールされる

# plenv which amon2-setup.pl
/home/ec2-user/.plenv/versions/5.18.2/bin/amon2-setup.pl

環境を汚したくない場合やsu権限が無い場合にはこちらの方法を取るのが良いのだろうと思われる。

/binのcpanmを利用する

最初の方で入れたcpanmを利用する方法。これがいわゆるシステムにインストールという方法でsu権限が必要になる。

# cpanm Task::Amon2

すると/usr/local/binに入る

# which amon2-setup.pl
/usr/local/bin/amon2-setup.pl

本当はplenv配下に納まっている状態が綺麗なのだろうと思う。
今回はシステムに入っていてもおかしくないような気がしているので3番を選択した。
たぶん2できちんとやっていくのが望ましいのだろう。

とりあえず今回は準備なのでここまで。

今日の学び

責任取るとか、実際ないからどうでよくて
決めれる人が決めれる環境の方が大事。

スキルの伝承には課題があり、
ペアプロは糸口になるが、ペアプロを正しく行う必要がある。
正しくとは、する人、される人に同じ理解が必要である。

もっと色んな人と話がしたい!!!!

今日の学び

わからないことを聞ける相手を見つけることは大事。
これができていないせいで、余計なイザコザができることもある。
そのためには、自分もある程度、無知をさらけ出す必要がある。
わからないのに知ったかぶりしてるのは見抜かれているので、知ったかぶりしない。
見栄はいらない。

でも、ほどほどに。

XP祭り 2013でアジャイルセンター試験を受けてきた

昨年に続き2回目のXP祭りに行ってきました。
お目当ては「アジャイルセンター試験」です。

アジャイルに関係する知力テスト」とだけ聞くと、若干の胡散臭い感じもあるかと思いますが
豪華な出題陣の方々がどのような題材を問題とするのか、非常に興味がありました。

受験編

受けてみると、当然のように胡散臭さは微塵も無く、お固めのアジャイルマニフェスト穴埋め問題から
この問題に答えは無いのではないか・・・と思えるような悩ましい問題まで
様々な角度から攻められる問題に四苦八苦しました。
回答時間の45分は、本当にあっというまに過ぎ去っていきました・・・。

回答編

そして肝心の結果ですが、61点でした。
受講者の平均が64点くらいということだったので、平均よりもちょっと下の得点です。

受けてみて痛感したのは、色々と覚えているつもりのものが
実は中途半端にしか覚えていないということ。
普段はすぐにググってしまうので、全部を記憶しておかなければいけない、という状況が無いからかもしれませんが
アジャイルマニフェスト穴埋めが正解できなかったのが、自分でも大きなショックでした・・w
問題を解くということを通じて、今の自分に足りない知識が何なのかであったり、初心に返る事ができたりなど、最初に思っていた期待以上の収穫がありました。
合格する/しないではなく、純粋に力試しができるというのが大きかったのかもしれません。

まとめ

運営側の皆様、貴重な機会をありがとうございました。
是非来年も!w 宜しくお願いしますmm

AFNetworking+GHUnitでハマった話し


Podfile

platform :ios, '6.1'

target :GHUnitTests, :exclusive => true do
    pod 'GHUnitIOS', '~> 0.5.5'
end

pod 'AFNetworking', '~> 1.3.2'

GHUnitTestsからAFNetworkingが見えない。
まぁ、それはそうか。

Undefined symbols for architecture i386:
"_OBJC_CLASS_$_AFJSONRequestOperation", referenced from:
objc-class-ref in XXX.o

Podfileを変更

platform :ios, '6.1'

target :GHUnitTests, :exclusive => true do
    pod 'GHUnitIOS', '~> 0.5.5'
    pod 'AFNetworking', '~> 1.3.2'
end

pod 'AFNetworking', '~> 1.3.2'

大量のエラーが

"_SCNetworkReachabilityCreateWithName", referenced from:
-[AFHTTPClient startMonitoringNetworkReachability] in libPods-GHUnitTests.a(AFHTTPClient.o)
"_SCNetworkReachabilityGetFlags", referenced from:
-[AFHTTPClient startMonitoringNetworkReachability] in libPods-GHUnitTests.a(AFHTTPClient.o)
"_SCNetworkReachabilityScheduleWithRunLoop", referenced from:
-[AFHTTPClient startMonitoringNetworkReachability] in libPods-GHUnitTests.a(AFHTTPClient.o)
"_SCNetworkReachabilitySetCallback", referenced from:
-[AFHTTPClient startMonitoringNetworkReachability] in libPods-GHUnitTests.a(AFHTTPClient.o)
"_SCNetworkReachabilityUnscheduleFromRunLoop", referenced from:
-[AFHTTPClient stopMonitoringNetworkReachability] in libPods-GHUnitTests.a(AFHTTPClient.o)
"_SecCertificateCopyData", referenced from:
-[AFURLConnectionOperation connection:willSendRequestForAuthenticationChallenge:] in libPods-GHUnitTests.a(AFURLConnectionOperation.o)
"_SecCertificateCreateWithData", referenced from:
___44+[AFURLConnectionOperation pinnedPublicKeys]_block_invoke in libPods-GHUnitTests.a(AFURLConnectionOperation.o)
"_SecPolicyCreateBasicX509", referenced from:
___44+[AFURLConnectionOperation pinnedPublicKeys]_block_invoke in libPods-GHUnitTests.a(AFURLConnectionOperation.o)
-[AFURLConnectionOperation connection:willSendRequestForAuthenticationChallenge:] in libPods-GHUnitTests.a(AFURLConnectionOperation.o)
"_SecTrustCopyPublicKey", referenced from:
___44+[AFURLConnectionOperation pinnedPublicKeys]_block_invoke in libPods-GHUnitTests.a(AFURLConnectionOperation.o)
-[AFURLConnectionOperation connection:willSendRequestForAuthenticationChallenge:] in libPods-GHUnitTests.a(AFURLConnectionOperation.o)
"_SecTrustCreateWithCertificates", referenced from:
___44+[AFURLConnectionOperation pinnedPublicKeys]_block_invoke in libPods-GHUnitTests.a(AFURLConnectionOperation.o)
-[AFURLConnectionOperation connection:willSendRequestForAuthenticationChallenge:] in libPods-GHUnitTests.a(AFURLConnectionOperation.o)
"_SecTrustEvaluate", referenced from:
___44+[AFURLConnectionOperation pinnedPublicKeys]_block_invoke in libPods-GHUnitTests.a(AFURLConnectionOperation.o)
-[AFURLConnectionOperation connection:willSendRequestForAuthenticationChallenge:] in libPods-GHUnitTests.a(AFURLConnectionOperation.o)
"_SecTrustGetCertificateAtIndex", referenced from:
-[AFURLConnectionOperation connection:willSendRequestForAuthenticationChallenge:] in libPods-GHUnitTests.a(AFURLConnectionOperation.o)
"_SecTrustGetCertificateCount", referenced from:
-[AFURLConnectionOperation connection:willSendRequestForAuthenticationChallenge:] in libPods-GHUnitTests.a(AFURLConnectionOperation.o)
"_UTTypeCopyPreferredTagWithClass", referenced from:
_AFContentTypeForPathExtension in libPods-GHUnitTests.a(AFHTTPClient.o)
"_UTTypeCreatePreferredIdentifierForTag", referenced from:
_AFContentTypeForPathExtension in libPods-GHUnitTests.a(AFHTTPClient.o)
"_kUTTagClassFilenameExtension", referenced from:
_AFContentTypeForPathExtension in libPods-GHUnitTests.a(AFHTTPClient.o)
"_kUTTagClassMIMEType", referenced from:
_AFContentTypeForPathExtension in libPods-GHUnitTests.a(AFHTTPClient.o)
ld: symbol(s) not found for architecture i386
clang: error: linker command failed with exit code 1 (use -v to see invocation)

色々彷徨った結果、以下の3ファイルを Link Binary With Libraries から追加することで回避できた

Security.framework
MobileCoreServices.framework
SystemConfigration.framework

しかし、この回避方法が正解なのかは判らない・・・。

reference: