2015/02/07

急速充電ケーブルでIngressの活動時間を延ばす

最近、健康のために歩くことにした。ただ歩くだけでは長続きしないだろうということで、Ingressを始めてみた。 確かに歩くのだが、それ以上にスマホのバッテリーが保たない。GPSとLTEは必要だし、一歩進む毎にmapが更新されるから、電気を喰うのも当然といえば当然。モバイルバッテリーを持ち歩いてすぐに充電できるようにしているのだが、充電が追いつかないようでバッテリー切れを起こしてしまった。

「それではモバイルバッテリーの意味がない」ということでググってみたところ、急速充電ができる場合とできない場合とがあることが判明。バッテリーはPanasonic モバイルバッテリー 8,100mAh 無接点充電(Qi)対応 USBモバイル電源 ブラック QE-PL301-Kを使っているので、容量的には問題ない。
ケーブルは、FOMA用充電ケーブル+microUSB変換アダプタ という構成なので、ちょっと貧弱。ケーブルの問題だろう。

というわけで、 オウルテック microUSB充電専用ケーブル 2.4A出力対応 急速充電モデル Galaxy/Xperia等スマートフォン タブレットPC対応 ブラック 巻取り 1m OWL-CBRJ(B)-SP/U2Aを購入。急速充電を行うためにはどういうケーブルである必要があるかは、ググると丁寧に解説しているサイトがあるので、参考にした。
  • 充電しながらスマホを使うので、ケーブルはある程度の長さが必要。
  • 持ち歩くことを考えると、巻き取り式が便利。
という点から、これに決定。

確かに、スマホを使いながらでも充電されるようになった。PCから充電するときも、充電時間が短くなった気がする。



2015/01/24

undefined symbol _znss4_rep20_s_empty_rep_storagee となってBittorrent Syncが起動しない

BitTorrent Syncを使ってディレクトリの同期を行おうとしたら、設定以前に起動しない。btsync -vとしてVersionを表示させようとしても、undefined symbol _znss4_rep20_s_empty_rep_storagee となってしまう。環境はCentOS 5.10。

stdc++の問題なのか、binutilのバージョンなのか、原因はよくわからなかった。結局、ダウンロードのページでx64ではなく、Linux_x64(glibc 2.3)をダウンロードしたら、解決した。


2015/01/11

Golang failed to run on FreeBSD8 / Intel Pentium III

This golang is installed from pkg command.
> sysctl hw.model
hw.model: Intel Pentium III
> uname -a
FreeBSD wall.home.group.jp 8.4-RELEASE-p19 FreeBSD 8.4-RELEASE-p19 #0: Mon Nov  3 17:09:45 UTC 2014     root@amd64-builder.daemonology.net:/usr/obj/usr/src/sys/GENERIC  i386
> 
> go version
SIGILL: illegal instruction
PC=0x81ec273

goroutine 1 [running, locked to thread]:
math.init·1()
        /usr/local/go/src/math/pow10.go:34 +0x13 fp=0x3892ff4c sp=0x3892ff48
math.init()
        /usr/local/go/src/math/unsafe.go:21 +0x39 fp=0x3892ff50 sp=0x3892ff4c
strconv.init()
        /usr/local/go/src/strconv/quote.go:455 +0x3f fp=0x3892ff6c sp=0x3892ff50
go/parser.init()
        /usr/local/go/src/go/parser/parser.go:2462 +0x44 fp=0x3892ff78 sp=0x3892ff6c
main.init()
        /usr/local/go/src/cmd/go/zdefaultcc.go:6 +0x3f fp=0x3892ffcc sp=0x3892ff78
runtime.main()
        /usr/local/go/src/runtime/proc.go:58 +0xb7 fp=0x3892fff0 sp=0x3892ffcc
runtime.goexit()
        /usr/local/go/src/runtime/asm_386.s:2287 +0x1 fp=0x3892fff4 sp=0x3892fff0

goroutine 2 [runnable]:
runtime.forcegchelper()
        /usr/local/go/src/runtime/proc.go:90
runtime.goexit()
        /usr/local/go/src/runtime/asm_386.s:2287 +0x1

goroutine 3 [runnable]:
runtime.bgsweep()
        /usr/local/go/src/runtime/mgc0.go:82
runtime.goexit()
        /usr/local/go/src/runtime/asm_386.s:2287 +0x1

eax     0x389380a0
ebx     0x856122c
ecx     0x389000a0
edx     0x17dc9c7d
edi     0x7
esi     0x2b38
ebp     0x389380a0
esp     0x3892ff48
eip     0x81ec273
eflags  0x10206
cs      0x33
fs      0x3b
gs      0x1b
> 


2015/01/05

マイキーボードを職場に持ち込む

職場ではDell T1650を使っているのだが、これのキーボードがイマイチ。というか、ぺニャぺニャで、ガンガンコードを書くのには向いていない。印刷された資料を見ながらExcelにポチポチ入力していく程度であれば十分なのだが。

5月の連休後にアサインされたプロジェクトが開始前からきな臭く、話を持ちかけた会社から出てきたスケジュールは土日関係なく作業の予定が入れられていて、まさにブラック。案の定、開始直後から仕様がわかる部分だけでも片っ端から実装しないと間に合わない状況となった。少しでもイライラを減らすために、使い心地のよいキーボードを持ち込むことにした。
休日出勤する際に、ヨドバシのキーボードコーナーによってキータッチを確認。英語配列であることと、テンキーレスであることを条件に触ってみて、 ダイヤテック Majestouch MINILA US67キー 青軸 [FFKB67MC/EB] に落ち着いた。というか、これで妥協した。英語配列なのに余分なキーが多く、スペースキーが小さいというのが減点ポイントなのだが、時間をかけて満足いくものを探せる状況ではなかったので。

ちなみにプロジェクトのほうは、上司を巻き込んで、夏休みどころか連休すらない状態で突貫工事。「言われていないことはやらない」方針で、何とか間に合わせた。残業しまくったので大赤字のはずだけど、それは会社の問題。仕様が明示されないから、工数の見積もりのしようがないって散々言っていたのだから。


2015/01/04

ももんが家計簿をFreeBSD8で動かす

ももんが家計簿とは

ももんが家計簿は、オブジェクト指向スクリプト言語 RubyのCGIで書かれた家計簿Web Application。

ももんが家計簿をFreeBSD8以降で動かすときの問題点

ももんが家計簿はRuby 1.8.xをターゲットにしているので、Ruby 1.9以降で動かすには、いろいろと修正が必要になる。それを避けようとしてもFreeBSDのPorts/Packageには1.8系は含まれていないため、
  • 古いPorts/Packageのまま更新しない
  • 野良ビルドする
といった方法で1.8を使うことになる。これでは、Ports/Packageを使う意味がなさそう。

rbenvで管理する

rbenvは複数バージョンのRubyを切り替えるツールで、FreeBSDのPackageでも提供されている。ruby-buildも入れてRubyの管理をこれで行えば、上記問題は解決できる。

ももんが家計簿をrbenvで動かす

rbenv+ruby-buildの環境構築については省略。pkgで入れれば済むし、ぐぐるとたくさん記事が見つかる。

CGIでrbenvをどう使うかというのが、ありそうで見つけられなかった。
結局
  • /usr/local/rbenv ディレクトリを作成し、環境変数RBENV_ROOTにセットする
  • ユーザrootでrbenv installでruby 1.8.7-p375をインストール
  • ももんが家計簿のあるディレクトリで、rbenv local 1.8.7-p375と実行する。.ruby-version ファイルの中身が1.8.7-p375になっていればOK
とした。
次。CGIとして起動したとき、指定したバージョンのRubyになっているかを確認する。
#!/usr/bin/env /usr/local/rbenv/shims/ruby

require 'rbconfig'

p Config::CONFIG['ruby_version']
を、例えばruby.rbというファイル名でももんが家計簿と同じディレクトリに保存し、ブラウザからCGIとして呼び出す。headerを書いていないのでServer errorになるのだが、エラーメッセージで表示される数字がRubyのバージョンになるので、これで確認できる。
1.8と表示されればOK。

最後に、ももんが家計簿のindex.rbとupdate.rbの1行目を
#!/usr/bin/env /usr/local/rbenv/shims/ruby
と書き換えれば対応完了。

動きはするものの

Ruby 1.8.xはメンテナンスされないので、外部に公開しているようであればちゃんと Ruby 2.xに対応させるべき。上記は、自分一人でひっそり使うための対応であり、利用は自己責任で。



2015/01/02

mackerelでMemoryの状況を表示する

mackerel-agent/CHANGELOG.md at master · mackerelio/mackerel-agentにあるように、0.14.0でunofficialながらもFreeBSDに対応したのだが、MemoryやInterface(Network)はまだ表示されない。
なので、冬休みを利用して、パッチ作ってプルリクだした。

何を送ればいいのかは、メトリック仕様 - Mackerel ヘルプに書いてある通り。FreeBSDではどうなるかというと、FreeBSD find out RAM size including total amount of free and used memory sizeに説明があるのだが、コードをみたほうが判りやすい。ここから仕様に当てはまるものを送信すればよいのだが、何度もsysctlを実行するのは嫌だったので、基本topコマンドの出力をパースするようにし、総メモリ量だけsysctlで取得するようにした。
んー、力技でやっているので、どなたかもう少しきれいに書き直してください(笑)。


2015年年賀状



今年もよろしくお願いします。


2014/12/28

MacBook Air 2台目

以前から使っていたMacbook Air 11インチ | Hiroaki's blogがへばってきたので、急遽購入。

メモリ増設&英語キーボードにしたいので、カスタマイズが必要。Apple Online Storeで頼むと時間がかかるし定価なので、カスタマイズモデルを扱っている量販店をさがす。MacCollection:Mac Collection AKIBA | sofmap.com | Apple Premium ResellerならSofmapのポイントも使えるということで、早速買いに行く。
メモリ増設&英語キーボード&256Gディスクは、CPUも交換したモデルしか残っていないということなので、奮発してそれを購入。雨の日だったので、ビニールかけてくれた。
持って帰ってきて早速開封。なんか以前のモデルと箱が違う気がする。
ということで、2011 Midモデルの箱を引っ張り出してきて、並べて撮影。
ちょっと変わっていますな。

古いMacBook Airに外付けのディスクを繋いで、iTunes の認証を解除してからTimeMachine Backup。終わったら新しいMacBook Airに繋ぎ変えて、設定を移して移行作業終了。と思ったら、VPNの設定が移っていなかったので、ちまちまとexport&import。しばらく様子を見て、問題がなければ旧MacBook Airは初期化する予定。中古で売れるかな?

ソフマップ・ドットコム


2014/12/20

Jenkinsでビルド結果はテスト結果 (全て成功)となっているのに、失敗状態

前提環境

Jenkinsからparallel_rspec(parallel_tests)turnipのシナリオ(シナリオテンプレート)を実行している環境。

現象

Jenkinsで結果が赤丸。Console出力を見ると、Tests Failedと出ているが、ビルド結果は「テスト結果 (全て成功)」と表示され、テスト結果を見てみても、「0個の失敗」となっている。bundle exec parallel:rspec reports "Tests Failed" when nothing failed... · Issue #253 · grosser/parallel_testsにあるような状態。

原因

どこかで失敗している。parallel_rspecではなくrspecで動かしてみると、FAILEDとなるテストがあるはず。


2014/12/14

MackerelでMacの温度情報をグラフにする

以前Macbooi Airの温度情報をfluentdで扱う | Hiroaki's blogで、温度情報をグラフにしたが、今度はMackerelでグラフにしてみる。
プラグインはこんな感じ。 mackerel-agent.conf にプラグインとしてこのスクリプトを実行するように記述してmackerel-agentを再起動すると、こんな感じのグラフが描ける。



Mackerelを野良ビルドしてMacにインストールする

Mackerelを使ってみる | Hiroaki's blogMackerelを入れてみたのだが、これ、 Homebrewが必要。 MacPortsの環境に入れようとして野良ビルドした。Linux以外の環境は、どれもこれでいけそうな気がする。

やり方は、Raspberry Pi に mackerel-agent をインストールする方法 (2014年10月更新) - 意識低い開発者のBlogの通り。

  • goをインストールする
  • Gitでソースコードを持ってくる
  • 環境変数GOPATHを設定して、build
  • buildディレクトリにmackerel-agentができているので、/usr/local/bin にコピー。

    次。設定ファイル。Homebrewで作られる設定ファイルを参考にする。
    /usr/local/etc に mackerel-agent.conf ファイルを用意する。中身はpidfile, root, verbose, apikeyのエントリを有効にした。 詳しくはmackerel-agent仕様を参照。
    これで mackerel-agent -conf /usr/local/etc/mackerel-agent.conf で起動するようになった。
    さらに、/Library/LaunchDaemons/mackerel-agent.plist を用意。 sudo launchctl load /Library/LaunchDaemons/mackerel-agent.plist で、自動起動するようにする。

    以上でOK。しばらくすると、Mackerelの管理画面にhostが追加され、リソースグラフが表示される。ログは/var/log/mackerel-agent.log に出力されるので、動かない場合はそれを確認。



    2014/11/30

    クリスマスモード



    2014/11/29

    圧縮Proxyコンテナ書いてみた

    Dockerでスマホ用の圧縮Proxyを動かしてみようと思い、Dockerfileを書いてみた。hiroaki0404/squid-ziproxy · GitHubに一式置いた。
    squidの設定は、Squidの更新パターンでインターネットアクセスを高速化する | SourceForge.JP Magazineを見ながら修正した方がいいかな?


    2014/11/27

    MacBook Airを分解して掃除した

    最近、MacBook Airを傾けると、冷却ファンが音を立てるようになった。音だけではなく、筐体全体が振動するようになり、 キーボードが熱くなってくる。Apple Careが切れる直前にジーニアスバーに持っていって掃除してもらったんだけど、半年もたなかった。
    Apple Careも切れているので、自分で分解して掃除することにした。

    絶大な効果有り!MacBook Airの不調時に、分解して内部を掃除したら完全復活した件を参考にする。
    まずはドライバー。特殊な形をしたねじなので、Macbook Air用 星型ドライバー 1.2mmを購入。
    誇りを吹き飛ばすエアダスターは、以前買っておいたナカバヤシ Digio エアダスター/ノンフロン 390ml DGC-JB8がまだ残っていた。

    道具がそろったところで、作業開始。まずはばらす。

    赤丸をつけた2箇所だけは、長いねじなので、元通りに組み立てるときに注意する。

    裏蓋をはずすとこんな感じ。右上のファンが掃除対象。
    エアダスターで埃を吹き飛ばしていく。ファンが回らないよう、手で押さえて風を当てると、効率よく吹き飛ばすことができる。
    せっかくばらしたので、他の隙間についた埃も吹き飛ばす。
    一通り掃除したら、蓋をして元通りに組み立てていく。ねじの長さに注意。

    これで解決!と思ったけど、相変わらず筐体全体が振動することが多々ある。もう寿命かな?




    2014/11/24

    Mackerelを使ってみる

    クラウドとデータセンターのIDCフロンティアがキャンペーンをやっていたので、アカウントを作って HerokuにElasticsearch + Kibanaの環境を作る | Hiroaki's blogを見ながらElasticSearchの環境を作った。
    作ってデータを入れるようにtd-agentやfluent-plugin-elasticsearchを入れたのはいいのだが、どうグラフを作ればいいのか?

    というところで、 Mackerel: 新しいアプリケーションパフォーマンスマネジメントを試してみることにした。IDCFのユーザ向けのプランもあるし、最初の1ヶ月は無料で全機能使えるし。

    Linuxは公式のrpmやdebが用意されていたので、それをインストール。MacBook Airはどうしようと思ったら、 Mackerel-agentをMacOSX(darwin)に導入する - Qiitaという記事を発見。その通り入れてみた。
    動かしてみてわかったのだが、Macだと監視項目が少ない。mackerel-agent/metrics at master · mackerelio/mackerel-agent · GitHubを見ると、Mac(darwin)はこれからって感じ。

    でも、Windows用の監視agentも用意されているし、監視対象が多いor仕事で使うって場合は、ありかも。個人だと、費用を考えるとElasticSearch+Kibana用のVPSを借りてがんばるかなぁ。




    サーバー構築・運用 ブログランキングへ


    2014/11/23

    Nexus5をLollipopにアップデートした

    こんな感じ。

    Wifiも変わりなく使える。


    2014/11/22

    td-agentをupdateする

    HerokuにElasticsearch + Kibanaの環境を作る | Hiroaki's blogで環境を用意したので、 Fluent::Plugin::Elasticsearch, a plugin for FluentdをCentOS 5.10に入れようとしたら、gemのインストールでエラーになる。

    ふと、 fluentd - Treasure Agent(td-agent)の1と2の今後 - Qiitaという記事を見つけ、 td-agent2をCentOSにインストールする - Qiitaに従ってupdateしてみる。
    
    $ /usr/lib64/fluent/ruby/bin/fluent-gem list > /tmp/fluent-gem.list
    $ sudo yum remove td-agent
    $ curl -L http://toolbelt.treasuredata.com/sh/install-redhat-td-agent2.sh | sh
    
    いきなりinstall scriptを実行して大丈夫か?と思ったけど、ちゃんとsudoするので、これでOK。
    というわけで、/tmp/fluent-gem.listを見ながら前のバージョンで入れていたpluginを入れていく。
    
    $ sudo /usr/sbin/td-agent-gem install fluent-plugin-rewrite-tag-filter
    
    がエラーになるので調べたところ、 rewrite_tag_filter Output Plugin | Fluentdで、本体に取り込まれていることを知る。
    ので、これはskip。


    2014/11/13

    HerokuにElasticsearch + Kibanaの環境を作る

    Kibana を Heroku で動かす - mallowlabsの備忘録で。
    って、このままでは誰でも見えてしまうので、Kibanaのページに認証をつけることにする。.htaccessと.htpasswdをトップディレクトリにおいてBASIC 認証を行う。今回はconfig.jsのあるディレクトリがトップディレクトリになる。
    .htaccessの内容はSimple htaccess authentication on Heroku with cedar/phpを参照。 .htpasswdは手元の環境で、htpasswdコマンドで生成する。

    データはfluentdで送り込む。td-agent.confの設定は …。探せばあちこちあるので、省略。indexが2個しか作れないので、logstash_formatは記述せず、デフォルトのfalseとする。
    Herokuの画面からSearchboxの管理画面に行き、indexとしてkibana-intとfluentdを作る。
    けど、これだとグラフにならない。indexが正しくないのかなぁ。



    2014/11/09

    Yosemiteにfluent-plugin-elasticsearchをインストールする

    Elasticsearch + KibanaでOSX(Yosemite)のリソース監視してみようと思った。

    最近のfluentdはPackageからインストールするものらしい。というわけで、 Installing Fluentd using .dmg Installer (MacOS X) | Fluentdからダウンロードしてインストール。
    elasticsearchのプラグインをインストールしようとしたところ、こんなエラーが出た。
    % sudo /opt/td-agent/embedded/bin/fluent-gem install fluent-plugin-elasticsearch
    Password:
    Building native extensions.  This could take a while...
    ERROR:  Error installing fluent-plugin-elasticsearch:
     ERROR: Failed to build gem native extension.
    
            /opt/td-agent/embedded/bin/ruby extconf.rb
    checking for curl-config... yes
    checking for rb_thread_blocking_region()... *** extconf.rb failed ***
    Could not create Makefile due to some reason, probably lack of necessary
    libraries and/or headers.  Check the mkmf.log file for more details.  You may
    need configuration options.
    
    Provided configuration options:
     --with-opt-dir
     --with-opt-include
     --without-opt-include=${opt-dir}/include
     --with-opt-lib
     --without-opt-lib=${opt-dir}/lib
     --with-make-prog
     --without-make-prog
     --srcdir=.
     --curdir
     --ruby=/opt/td-agent/embedded/bin/ruby
     --with-curl-dir
     --without-curl-dir
     --with-curl-include
     --without-curl-include=${curl-dir}/include
     --with-curl-lib
     --without-curl-lib=${curl-dir}/lib
    /opt/td-agent/embedded/lib/ruby/2.1.0/mkmf.rb:456:in `try_do': The compiler failed to generate an executable file. (RuntimeError)
    You have to install development tools first.
     from /opt/td-agent/embedded/lib/ruby/2.1.0/mkmf.rb:541:in `try_link0'
     from /opt/td-agent/embedded/lib/ruby/2.1.0/mkmf.rb:556:in `try_link'
     from /opt/td-agent/embedded/lib/ruby/2.1.0/mkmf.rb:742:in `try_func'
     from /opt/td-agent/embedded/lib/ruby/2.1.0/mkmf.rb:1027:in `block in have_func'
     from /opt/td-agent/embedded/lib/ruby/2.1.0/mkmf.rb:918:in `block in checking_for'
     from /opt/td-agent/embedded/lib/ruby/2.1.0/mkmf.rb:351:in `block (2 levels) in postpone'
     from /opt/td-agent/embedded/lib/ruby/2.1.0/mkmf.rb:321:in `open'
     from /opt/td-agent/embedded/lib/ruby/2.1.0/mkmf.rb:351:in `block in postpone'
     from /opt/td-agent/embedded/lib/ruby/2.1.0/mkmf.rb:321:in `open'
     from /opt/td-agent/embedded/lib/ruby/2.1.0/mkmf.rb:347:in `postpone'
     from /opt/td-agent/embedded/lib/ruby/2.1.0/mkmf.rb:917:in `checking_for'
     from /opt/td-agent/embedded/lib/ruby/2.1.0/mkmf.rb:1026:in `have_func'
     from extconf.rb:47:in `
    ' Gem files will remain installed in /opt/td-agent/embedded/lib/ruby/gems/2.1.0/gems/patron-0.4.18 for inspection. Results logged to /opt/td-agent/embedded/lib/ruby/gems/2.1.0/gems/patron-0.4.18/ext/patron/gem_make.out %
    そう特別なことをやっているわけではないから、前例があるはず。というわけで、ググって MacにKibanaとtd-agentをインストールする - Qiita を発見。command-line toolsをpackageから入れて、一応、sudo -sでrootになって、gcc --versionで確認。
    もう一度プラグインのインストールをやり直したら、今度は成功した。command-line toolsはインストールしたと思っていたんだけどなぁ。



    2014/11/08

    The RSpec Book Part1写経時に注意した点

    Part1を写経した。
    1.4章に出てくる2つの同心円は重要。特に、WebアプリのテストでRSpec+Cucumber(Turnip)を使うことが主目的であるならば、 Part1でどちらの円のコードを書いているのか、意識しながら行う必要がある。外と内とで違う言語ならわかりやすかったんだろうけど、 RSpec本なのでそれは無理な話。
    進化の早い世界なので、 The RSpec Book用にVagrant環境を作成し、写経してみた - メモ的な思考的なとか、 The RSpec Bookのoutputがエラーになる | Hiroaki's blogとか、適宜Netでフォローする必要はあるけど、プログラムを書く役の人もプログラムをテストする役の人も、 この本は読んでおくべき。



    2014/11/03

    ようやくpkgngに切り替える

    周回遅れどころではないが、pkgngでの管理に切り替える。

    8.4なので、先ずはfreebsd-updateで最新にする。
    あとは手順通り。参考になるページも多数。 OSのメジャーバージョンをあげたいのだが、未だにWnn7のサーバを動かしているので、踏み切れない。


    2014/10/26

    ReadyNAS 102 購入

    FreeBSDのサーバに2Tのディスクを増設して、ファイルサーバも兼ねさせていたのだが、TimeMachineのバックアップやら他のマシンがクラッシュしたときのディスクイメージやら何やら置いていたら、手狭になってきた。
    というわけで、会社にもあるNETGEAR Inc. ReadyNAS 102にしてみた。Linuxで動いているので、いろいろ遊べそうってのも理由の1つ。
    ディスクはついていないので、別途2台調達する必要がある。何でもよいわけではなさそうだったので、動作確認リストにあったTOSHIBA DT01ACA300 3TB 6Gbps SATA対応 3.5インチ内蔵ハードディスクドライブにした。探していたら、他のディスクよりちょっと安かったので。
    合計すると安いデスクトップパソコン位のお値段になってしまうけど、最近、インストールして、設定して、といった作業があまり楽しくなくなってきたので、こういう製品を使うのもありかなと。置き場所がないとか、安いパソコンだと壊れるとか、そういう問題もあるし。
    で、これを普通のコンセントに挿すと停電で悲しい目にあうので、UPS(使っているのはAPC Smart-UPS1000 )に繋げる。停電まではいかないけど、瞬電っては意外とあるので。


    2014/10/22

    The RSpec Bookのoutputがエラーになる

    The RSpec Bookの写経を始めたのだが、本が古い、というか、ライブラリがバージョンアップしていて、本の通りだと動かない。
    #本の通りバージョンを指定してライブラリをインストールすればよいのだろうけど。

    4章5章あたりでエラーになったのでググったところ、 Pragmatic Forums | Problem test doubleに解決策があった。



    2014/10/18

    Silexのログに項目を追加する

    PHPのマイクロフレームワークの1つである Silexでログを切り替える話を Silexのロギングを変更する | Hiroaki's blogでまとめたのだが、今回は、そのログに出力する項目を増やす話。

    Silexはログ出力にmonologを使うのため、MonologServiceProvider | Japan Symfony Groupというものを用意している。これに、ログの項目を増やすための口が用意されているのだが、日本語のドキュメントには書いてなさそう。まぁ、monologに用意されている機能をうまくwrapしているのだが。
    monologのProcessorがそれ。既にいくつか用意されているし、コードを見た感じ、独自のものを作るのも、それほど大変ではなさそう。
    Silexからは、pushProsessor()を使う。こんな感じ。
    
    $app['monolog'] = $app->share($app->extend('monolog', function($monolog, $app) {
     $monolog->pushProcessor(new ProcessIdProcessor($app['monolog.level']));
     $monolog->pushProcessor(new WebProcessor());
     return  $monolog;
    }));
    
    ProcessIdProcessor()のように、引数が必要なものもあるので、コードをみて判断。
    わかってしまえばドキュメントにするほどのものでもないのだろうけど、SilexのxxxProviderの説明がもうちょっと欲しいところ。まぁ、コードを読まない/読めない(コピペで済ます)レベルの人お断りっていうスタンスでいくなら、それもありかと。



    2014/10/17

    RSpecからTurnip、Capybara、WebDriverを使うための設定

    さて、前回までで一般的な準備が終わったので、これからテストプログラム用の準備をして行く。
    ターミナルやコマンドプロンプトを開いて、テストプログラムのディレクトリ(Gemfileのあるディレクトリ)で、bundle exec rspec --initと入力する。と、RSpecで使うファイルのひな形が用意される。 Turnipを使うには、もう一手間。作られているspecディレクトリの下に、featuresディレクトリとstepsディレクトリを作っておく。

    ここから設定。.rspecとspec/spec_helper.rb に書いていく。
    .rspec には、RSpecの起動時のオプションを書く。今回、Turnipを使うので、1行目に
    -r turnip/rspec
    を挿入する。

    次、spec/spec_helper.rb。ここでようやくCapybaraSelenium WebDriverが登場する。
    spec/spec_helper.rbの先頭に
    
    require 'rubygems'
    require 'bundler/setup'
    require 'capybara/rspec'
    require 'selenium-webdriver'
    
    一番最後の行(行頭からendと書いてある)の前に下記を挿入。
    
    config.include Capybara::DSL
    
    そして、一番最後の行の下に下記を追加。
    
    Capybara.register_driver :remote_browser do |app|
      caps = Selenium::WebDriver::Remote::Capabilities.firefox
      url  = "http://localhost:4444/wd/hub/"
      opts = { desired_capabilities: caps, browser: :remote, url: url }
    
      driver = Capybara::Selenium::Driver.new(app, opts)
      driver.browser.file_detector = lambda do |args|
        str = args.first.to_s
        str if File.exist? str
      end
      driver
    end
    
    Capybara.default_driver = :remote_browser
    Capybara.run_server = false
    
    Dir.glob("spec/steps/**/*steps.rb") { |f| load f, true }
    
    まとめると、spec/spec_helper.rbは となる。

    これで、spec/features ディレクトリにシナリオを書いたファイルを置いて、spec/stepsディレクトリにシナリオに対するRubyのコードを書いて行けばよい。これについては、また次回に。


    2014/10/15

    bundlerでライブラリを管理する

    Rubyの環境を作る | Hiroaki's blogでbundlerを使えるようにしたので、それを使って必要なライブラリのインストールを行う。
    テストプログラムを作るディレクトリに移って、ターミナルやコマンドプロンプトから、bundle initと入力すると、そこにGemfileというファイルが作られる。これが、ライブラリを管理するファイルで、必要なライブラリはこのファイルに記述する。RSpec + Capibara + Turnip + Selenium WebDriver でテストプログラムを書くので、こんな感じ。
    
    # Gemfile for test of XXX project
    source "https://rubygems.org"
    
    gem "selenium-webdriver"
    # gem "selenium-client"
    gem "capybara"
    gem "turnip"
    gem "rspec"
    gem "rspec_junit_formatter"
    
    Gemfileの準備ができたら、ライブラリをインストールする。ターミナルやコマンドプロンプトから、bundle install --path vendor/bundleと入力する。--pathで指定したディレクトリに ライブラリがインストールされるので、他のプログラムと混ざることはない。一度--pathを指定してインストールすると、その設定が.bundle/config に書かれるので、以後はbundle installでOK。
    ソースコードをリポジトリで管理しているのであれば、Gemfileだけではなく、vendor/* や.bundle/* も管理対象にしておくと、人によってライブラリのバージョンが違うという問題が起こらない。


    2014/10/13

    Rubyの環境を作る

    LinuxやMac OSXであればそれほど気にすることはないのだが、Windows上でRubyを使うのはちょっと大変。
    依存するライブラリを入れる必要があるので、DevKitのインストール - Railsインストールを見ながらDevKitをインストールしておく。

    プロジェクトで使用するライブラリの管理にはbundlerを使うのが良いらしいので、ターミナルなりコマンドプロンプトなりからgem install bundlerとしてインストールする。インストール先がシステムで設定されているものになるが、どのプロジェクトでも使うので、これでよし。


    2014/10/12

    RSpecでテストすることにした

    テスト。PHPでゴリゴリテストを書くのも嫌なのでどうしようかと思ったけど、受け入れテストみたいな感じでテストすることにした。とはいえ、今回のプロジェクトはいくら催促しても最終仕様が明示されないため、テストはこちらではやらないということで決着、やる必要はなくなったので、他のプロジェクトにも使えるような方法を探した。
    で、結局、 Turnip + Selenium WebDriverでWebアプリ受け入れ試験 | AdventCalendar2013 あたりを参考に、RSpec + Capibara + Turnip + Selenium WebDriver でちょっと試してみることにした。
    メジャーなパターンかと思いきや、意外と情報がなくて苦労したので、ボチボチまとめていくことにする。


    2014/10/05

    dialogがエラーになってportsの設定ができない

    FreeBSD 8.4-RELEASE-p16なマシン。pkgngに切り替えたら、OCN IPv6に繋がらなくなった。 /usr/local/etc をバックアップせずに切り替えてupgradeしたのもまずかったが、 setup scriptがエラーになって設定ファイルが作られていなかったというのが原因っぽい。
    # sh -x /usr/local/sbin/mpd-l2tp-ipv6pd-client-setup
    + PREFIX=/usr/local
    + DATADIR=/usr/local/share/mpd-l2tp-ipv6pd-client
    + MPD_NAME=mpd5
    + CONFDIR=/usr/local/etc/mpd5
    + : 0
    + mktemp -t ipv6pd
    + tempfile=/tmp/ipv6pd.iVAVpp8J
    + dialog --title 'L2TP-IPv6PD Setup' --clear --mixedform 'Please input L2TP-IPv6PD account information.' 11 76 0 'User ID:' 1 1 '' 1 36 64 0 0 Passwd: 2 1 '' 2 36 64 0 0 'L2TP-IPv6PD Server (Fixed Prefix):' 3 1 '' 3 36 64 0 0 'Prefix Delegation Interface:' 4 1 '' 4 36 64 0 0
    + retval=255
    + rm /tmp/ipv6pd.iVAVpp8J
    + exit
    
    /usr/local/share/mpd-l2tp-ipv6pd-client にあるひな形を直しながら /usr/local/etc/mpd5 に置いて復活させたけど、困っていないのかな?今時8.4を使っている方が悪いのかな?


    2014/09/21

    Silex(Monolog)のロギングを変更する

    Homepage - Silex - The PHP micro-framework based on Symfony2 Components のロギングとして、MonologServiceProvider | Japan Symfony Groupというものがあり、通常はこれを使う。
    しかしこのロギング、指定したファイルに延々と書き続けるもので、日ごとにファイルをわけたり、ファイル以外の所に書き出したりできない。
    元となる Seldaek/monolog · GitHubには、 Handlerという形で、メールに飛ばしたり、DBに書き込んだりする機能が用意されているので、それらを使う方法はないだろうか?

    MonologServiceProvider 設定に変更する例が載っていたので、pushHandler()でRotatingFileHandlerを登録してみた。
    確かに、日ごとにログファイルが分割されるのだが、相変わらず分割されないファイルにもログが書き出される。これは、変更ではなく、追加だ。

    結局
    $app[monolog.handler] = function() use ($app){ return new XXXhandler();};
    として、無理矢理書き換えているのだが、イマイチな感じがする。

    RotatingFileHandlerを使わずに外部のログのローテーションの仕組みを使え!と書いてあるのだが、今回、Windowsで動かすので、そういった当たり前の機能が見当たらない。外部コマンドで用意すべきなんだろうけど、そこはWindowsと*nixの思想の違いということで。


    2014/08/11

    カキ1キロがクーポンで無料だった

    久しぶりにサークルのメンバーでの飲み会。
    クーポンで牡蠣1キロがサービス。殻とかもろもろ含んでの1キロなんだろうけど。


    適当な比較対象がないので、写真のボウルの大きさが伝わらない…。


    TimeMachineが止まるので、バックアップ先のSpotlightをOffにする

    MacBook Airを使用中。いちいち外付けHDを繋ぐなんて面倒なので、TimeMachineのバックアップ先は当然NAS。

    どうもTimeMachineが途中で止まってしまうというか、メニューから見るとバックアップした容量が全然増えなくなることがちょくちょく発生する。ググってみると、 MavericksのTimeMachineが途中で止まって進まない場合の対処方法 - drk7jp という記事を発見した。あぁ、SpotlightのIndex作成処理で、待たされているのね。

    バックアップ先をIndex対象外に設定しても、 TimeMachineのバックアップ先は複数設定できるから、新しいバックアップ先を追加した時にまた同じ問題に直面しそう。
    というわけで、scriptにしてみた。rootのcronに、適当な間隔で実行するよう登録。



    2014/06/08

    PHPでExcelの内容をDBに登録する

    Javaの時は、DbUnitでExcelに書いたテストデータをDBに登録してテスト、ということが、簡単に(とはいっても、POIに苦しめられるのだが)できたのだが、PHPではどうなの?

    PHPUnitにもdbunitという拡張があって、それを使うとDBを使ったテストができる。が、

    • Excelファイルをテストデータとして読み込むことはできない。
    • CSV, XML, YAMLでテストデータを用意することはできるが、複数のテーブルに対して1つのファイルでデータを書けるのは、MySQLのときだけっぽい。
    という状況。

    仕方がないので、PHPの勉強も兼ねて、xlsファイルの内容をDBに登録するfunctionを書いてみた。



    2014/06/03

    PhingからPHPUnitを使ってみる

    PHPのライブラリ管理はComposerを使うらしい。というので、 PhingPHPUnit – The PHP Testing Frameworkをインストールしようと、 composer.jsonを書いてみた。ら、見事に動かない。PHPな人はPhingを使わない?自動テストやらないの?

    で、PhingのBTSのチケットにPHPUnit4で動かないというのがあって、対応したらしい。が、今の最新リリースである2.7.0は対応前のバージョンのようだ。phing/phing - Packagistで確認したところ、 2.7.0以降のものも登録されているようなので、それをcomposer.jsonで指定すれば動くはず。



    2014/06/02

    IIS ExperssでPHPを動かす

    わざわざIIS Expressを使うのは

    Download the Microsoft Web Platformからインストーラいれて、ポチポチやっておしまい。
    だったらわざわざ書かない訳で。

    • 本番環境はIIS7とかIIS8とか。
    • PHPでフレームワーク使うから、URLのRewriteが必要
    • 諸般の事情により、開発環境はIIS5かIIS6が標準

    なんて状態だと、Web.config(というか、Rewrite設定)って、本番用と開発用と2つ用意して…とか、いかにもトラブルが起こりそうな状態に。
    という訳で、IIS Expressの出番

    インストールはWeb Platformから。で、このとき、IIS用のPHPとか入れてしまわないようにする。一度、オプションを開いて、IIS Expressを選択しておくのと、インストールのときの内容確認でIIS Experss用でないものを外しておけば、OK

    IIS ExpressでのPHPの設定

    IIS ExpressでPHPを有効にする方法 | Express for Webにずばり…と思ったけど、うまくいかない。DOS窓からiisexpress立ち上げたときのメッセージを頼りに、使われている(起動時に生成された)設定ファイルを見てみたところ、PHP向けの設定が反映されていなかった。ので、IIS Express側の(大元の)設定ファイルを、上記記事に従って書き換えてしまう。大元なので、他の設定でIIS Expressを立ち上げることはできなくなるけど、PC安いし仮想マシンもサクッと上がるし、問題ないでしょう。
    大元の設定ファイルは、

    IIS Expressをインストールしたフォルダ\AppServer\applicationhost.config

    IIS Expressの動かし方

    ずばり、Running IIS Express from the Command Line : The Official Microsoft IIS Site。英語が辛いというのであれば、IIS EXPRESSの使い方(Windows XPでIISを使った開発) - あおきのTechメモMicrosoftが IIS Express-新しい組込みwebサーバーをどうぞ。

    つまり、

    iisexpress /path:アプリのあるフォルダまでの絶対パス /port:ポート番号
    ポート番号を1024以下にするのであれば、管理者権限でiisexpressをキックする必要があるのはお約束。



    2014/06/01

    いまさらSQL Server 2000を動かす

    今更ながら、SQL Server 2000との戦い(笑)が始まるのだ。

    • DB Serverアップグレードしないとまずいよね
    • DBアップグレードしても、アプリ側問題ない?
    • アプリ再テストだよね。現状を反映した仕様書ある?テストできる?
    • いっその事、アプリも新DBに対応した奴に作り替える?
    • DBもアプリも一気に更新って、リスク高くない?DBは他システムとも連携しているし
    • アプリを先に更新するか。現DBにも新DBにも対応する仕様で

    なんてやり取り、ないとは言い切れないのはよくある話。 で、そうすると、SQL Server 2000が動く環境が必要になるのだ。
    ググってみると、Windows 7にインストールしたなんて話がヒットするが、その話、あてにならない。やってみると わかるのだが、インストールできるのはSQL Server 2000のクライアントの部分。肝心のDBエンジンは 項目としてはグレーアウトしていて、インストールできないのだ。

    結局、SQL Server 2000の動作要件に書いてあるOSが必要になる訳なのだが、XPを入れると、Windows Updateできない!というわけで、選択肢はWindows Server 2003になる。のだが…。

    SPの当たっていないServer 2003を入れてみたら、

    • Windows Updateしようとする
    • IEのバージョンを上げろというエラーメッセージと、IE8のダウンロードリンクが書かれたページに飛ばされる
    • IE8をダウンロードしてインストール
    • サポートされていないOSと表示
    で、結局Windows Updateできない。

    正解は、「別のマシンでWindows Server 2003用のSP2をダウンロードしておいて、Windows Updateする前にSP2をインストールする。」
    休日丸1日費やしてたどり着いた結論。