upinetree's memo

Web系技術の話題や日常について。

TDD Boot Camp 長岡 1.0 に参加してきた

05/18 (土) に長岡で開催された、TDDBCに参加して来ました!

自分一人でTDDやってみてもよく分からず、前々よりTDDBCに参加したいと思っていたのですが、この度ついに長岡で開催とのことで、念願の参加となりました。

簡単にですが、まとめます。

大事だと思ったところ

  • 気づきは、「動かない→動く」で得られることが多く、早い段階で気付きを得ることが重要
  • 黄金の回転のうち、リファクタリングには意思が必要。意思がないと、回転の円が潰れてくる
  • 複数の問題、大きな問題を一度に相手にせず、小さく分割して連続的に倒していく
    • それを素早く繰り返すことが大事
  • 不安をテストにする。形骸化したテストにはしない
  • TDDの真の目的は健康。変化に対応できるのは健康なコードと健康なチーム

気付き

  • 今まで書いたテストは粒度がバラバラだった、テストを積極的にリファクタリングすることもなかった(特に粒度)。TDDBCで大体の感覚がつかめたので、どんどん書いて痛い目にあって学習しようと思う

  • ペアで作業すると、考えこんで先に進めないということがない。一人でやっているときは半分意地で悩み続けてしまうこともあるが、その前にペアからハッとする意見をもらって解決したり、ある程度のところで切り上げるということができた

  • ペアでのリファクタリングは本当に効果的。それを支えるのがテストコード。テストで振る舞いが保証されていて、安心してコードを良くしていけるのを実感

  • コードレビューで他の方々のコードを眺めて、なるほどと思うことがいっぱいあった。同じ問題をみんなで解いて、みんなでレビューし合うってのは楽しい

  • 新潟にもいろいろな技術者がいて、みんな頑張ってるんだってことが分かった。やっぱ外に出ないとダメだな

反省

  • 慣れてきたとき、段階を踏まずにテストをしてしまい、'Development Testing'でなくなってしまったケースがあった。「明白な実装」かそうでないかの感覚を練習でつかむ必要がある

  • US配列のMBAペアプロしてしまった。入力デバイスとか、エディタはペアとのスムーズなやりとりを妨げないよう配慮が必要だなーと実感した

  • レビューの時、MBAのディスプレイ出力をプロジェクタに出せなくてあたふたしてしまった

  • きのこ本持っていくのを忘れた

これから読みたい本まとめ

ニコレポをスクレイピングするスクリプトとライブラリ書いた

ニコ動って楽しいけど、ニコレポにずっと不満があった。

  • 1ページ20ログしか出ない。ページめくるのめんどくさい
  • ログの種類が絞り込めない。動画だけチェックしたいのにすぐ流れていく
  • ブラウザ開くのめんどくさい。ターミナルでチェックしたい

じゃあスクリプト書けばいいじゃんって思って、書きました。

http://github.com/upinetree/nicorepo

詳しくはGithubのREADMEをお読みください。

ふりかえり

まじめにTDDやったの初めてだったけど、どう考えてもテスト足りない。 でもどうやってテストしたら良いのかわからないところもあって、結局先に進むために諦めた部分も多かったです。

テストのコードリーディングもっとする必要があるなと実感しました。

でも、RSpec Mocksの使い方を学べたのは良かったです。

コードは、対話モードのopenコマンドと他のコマンドは意味的に違うのに同じとして扱ってるとか、気持ち悪い感じ。

再帰でページ送りできたのはちょっと良かったかなと思います。

ちょいちょい改善していこう。

Mechanizeでニコ動スクレイピングしようとしてコケた

ニコ動スクレイピングしたら楽しそうだなーと思ってやってみたら、 2回ほどコケたのでメモ。

homebrewで入れたopensslの証明書でコケる

opensslのバージョンが古かったので、homebrewでopenssl入れたら ruby2.0.0で証明書エラーでました。

http://qiita.com/items/12457815d5cee3723b97

こちらを参考に、証明書を入れて無事解決。

$ ruby -ropenssl -e "p OpenSSL::X509::DEFAULT_CERT_FILE"
"/usr/local/etc/openssl/cert.pem"

$ brew install curl-ca-bundle
$ brew list curl-ca-bundle
/usr/local/Cellar/curl-ca-bundle/1.87/share/ca-bundle.crt
$ cp /usr/local/Cellar/curl-ca-bundle/1.87/share/ca-bundle.crt /usr/local/etc/openssl/cert.pem

追記(2013/05/01)

WindowsでRubyInstallerを使ってRubyをインストールした場合、下記で対応します。

$ wget http://curl.haxx.se/ca/cacert.pem
$ cp cacert.pem /c/Ruby193/
$ export SSL_CERT_FILE=/c/Ruby193/cacert.pem

参考:Root certificates? · Issue #148 · oneclick/rubyinstaller

SSLバージョンでコケる

さて、Mechanizeを使ってみましょー。

ニコニコ動画にアクセスしてログインしてみます。

require 'mechanize'

LOGIN = 'https://secure.nicovideo.jp/secure/login?site=niconico'

agent = Mechanize.new
agent.post(LOGIN, 'mail' => mail, 'password' => pass)

が、ここで怒られます。

Errno::ECONNRESET: Connection reset by peer - SSL_connect
from /Users/upinetree/.rbenv/versions/2.0.0-p0/lib/ruby/2.0.0/net/http.rb:917:in `connect'

どうも、ニコ動はSSLv3じゃないとダメっぽいです。

http://stackoverflow.com/questions/11855324/ruby-mechanize-https-error

ここを参考に。

agent = Mechanize.new
agent.ssl_version = 'SSLv3'
agent.post(URL::LOGIN, 'mail' => mail, 'password' => pass)

これでOK!

追記(2013/05/01)

SSLv3は脆弱性が発見されたので、TLSv1以上にしましょう。

agent.ssl_version = 'TLSv1'

Rubyのwin32oleでWordファイルをPDFに一括変換する

WORD→PDF→結合という変換は結構な頻度で定期的に発生する作業だったのですが、 いい加減めんどくさいので自動化します。

Office2007以上であればPDF保存できるので、Win32OLEを使ってやりましょう。

下記エントリがとても参考になりました。

と、単に自動化したいのであれば上記エントリだけで済んでしまうので、ここでは僕がやったことを載せてみます。

やりたいこと

  • 指定したWordファイルを全てPDFに変換
  • 変換したら一つのPDFに結合

Word → PDF変換

WordはnewしたらQuitしないと開きっぱなしになるので、おっちょこちょいな僕としては怖いところです。 なので、確実にQuitできるようにちょっと細工します。

EAM(Execute Around Method)というのがあるらしいので、それを使いましょう。

※define_finalizerを使う手もありましたが、こっちのほうが面白そうだったので

require "win32ole"

class WordUtil
    def initialize
        @word_app = WIN32OLE.new("Word.Application")
    end

    def quit
        if @word_app then @word_app.Quit end
    end

    def to_pdf(doc_name)
        doc_fullpath = File.expand_path(doc_name)
        pdf_fullpath = doc_fullpath.gsub(/\.doc$/, ".pdf")

        begin
            doc = @word_app.Documents.Open(doc_fullpath)
            doc.ExportAsFixedFormat({
                "OutputFileName" => pdf_fullpath,
                "ExportFormat" => 17,            # wdExportFormatPDF
                "OpenAfterExport" => false
            })

            puts "success: #{doc_fullpath}"

        rescue
            puts "fail: #{doc_fullpath}"

        ensure
            doc.Close unless doc.nil?

        end
    end
end

class WordManager
    def WordManager.run_during(&block)
        begin
            word = WordUtil.new
            block.call(word)

        ensure
            word.quit

        end
    end
end


input_docs = ARGV[0]
input_docs = "*.doc" if input_docs.nil?

output_pdfs = input_docs.gsub(/\.doc$/, ".pdf")

puts "input docs: " + input_docs
puts "output pdfs: " + output_pdfs

# convert to pdf
WordManager.run_during do |word|
    Dir.glob(input_docs) do |fn|
        word.to_pdf(fn)
    end
end

WordManagerにブロックを渡して変換してもらっています。 これなら解放漏れしないね!

PDFを結合する

出力したPDFを結合するにはいくつか方法がありそうでしたが、今回は一番簡単そうだったpdftkを呼び出します。

今回やりたいPDFの結合はちょっと注意が必要でして。

  • 指定した順番で結合
  • ファイル名は毎回一定パターンで変わる

なので、yamlにキーワード並べて、その順番でパターンマッチングして結合、ということをしてます。 なんとめんどくさい。

require "yaml"

class PDFCat
    def initialize(pdf_names, pdf_keys)
        @sorted_pdf_names = pdf_keys.map do |key|
            Dir.glob(pdf_names) do |fn|
                break fn if /#{key}/ =~ fn
            end
        end
    end

    def concatenate(export_fname)
        cat_list = @sorted_pdf_names.join(" ")
        puts "files to be concatenated:\n    " + cat_list.split(" ").join("\n    ")
        puts "export file name: #{export_fname}"

        `"C:/Program Files/PDF Labs/PDFtk Server/bin/pdftk" #{cat_list} cat output #{export_fname}`
    end

end


# concatenate pdf files
yaml_fname = ENV['HOME'] + "/bin/pdf_keys.yaml"
yaml_data = YAML.load_file(yaml_fname)
pdfcat = PDFCat.new(output_pdfs, yaml_data['sorted_keyword_list'])

export_fname = 'catcatcat.pdf'
pdfcat.concatenate(export_fname)

もうちょいリファクタリングできそうですね。

でも疲れたから寝る。

参考サイト

Sublime Text とりあえず入れるパッケージリスト

自分用メモ。 Package Controlは入ってること前提です。

Sublime Text ?

http://www.sublimetext.com/

IMESupport

https://github.com/chikatoike/IMESupport

  • WindowsでIMEのインライン変換がおかしな位置に表示されるのを解消

ConvertToUTF8

https://github.com/seanliang/ConvertToUTF8

  • Shift-JISのファイルを編集するときに重宝
  • でも、 "Goto symbol" したり、 "New View into File" で複製したビューの切り替えしたりするとたまに文字化けする
    • そんな時は落ち着いてUndo
  • ショートカットキー設定ファイル(Packages/ConvertToUTF8/*.sublime-keymap)は再設定するか消しておく
    • GBKに変換するショートカットがctrl+shift+cに割り当てられているので、知らないうちにうっかり押しちゃう
  • 新規ファイル作成時のエンコードも設定できる

Solarized Color Scheme

https://github.com/braver/sublime-solarized

  • 個人的にお気に入り。落ち着く色合い
  • デフォルトのカラースキームにもSolarizedあるけど、こっちのほうが好き

Markdown Preview

https://github.com/revolunet/sublimetext-markdown-preview

  • 保存するとすぐ反映されるのでF5で確認できる
  • markdown.css編集するとプレビューの見た目変えられる
  • Githubライクのgithub.cssが付属
  • Github Flavored Markdownにも対応してるっぽい

ぐんまRuby会議01に行って来ました。

ちょっと遅れましたがレポートです!

出発

2013.03.09 高崎市総合福祉センター、ぐんまRuby会議01に行って来ました。

当日はとても良い天気で、上着が要らないくらい暖かかったです。 その日は夜に新宿に行く用事があったので、お得なウィークエンドパスを利用し、新幹線で移動しました。

ぐんまは新潟の隣県なのでたまに訪れていましたが、高崎は初上陸。 高崎についてからは、循環バス「ぐるりん」の色にビビりつつ、バスで会場まで向かいました。

ランチセッション

ランチセッションは登利平の鳥めし弁当をみんなで食べました。 柔らかい鶏肉と、ご飯とよく混ざったタレが美味しかったです。 包装紙は綺麗に剥ぎ取り、食べ終わったら同じ状態に戻すのが正式な作法らしい。

案外早く食べ終わってしまったので、本編が始まるまで施設内を散策したり、のんびりしたりしてました。

講演

そしていよいよ本編開始!

※講演のレポートで力尽きました。すみません(;´Д`) 群馬のお話、LT、ゆRubyは後日追記するかもしれません。

Mad Web Programmer - Yuguiさん

Yuguiさんからみた世界です。(ぐんまRuby会議01で発表した

Webのソフトウェアを書くことは世界を変える方法の一つであり、Rubyは効率よくそれを実現できる方法の一つ。では、なぜ世界を変えるのか?というお話でした。

性同一性障害のような、希少事例は今までモデリング上の欠陥として扱われてきた。しかし、Webはそれを変えた。情報の欠如を解決し、希少事例でも確実に見つけられるようになった。 Webは人を救える力を持ち、Webを開発している人間がしていることは、そういうことなんだ、ということがとても印象に残りました。

ここまで自身の内面にまで踏み込んだ発表は初めて聞いて、心打たれました。

最後に「必要なのは多産多死であり、それを実現しやすいのはRuby。もしかしたら死ぬ方にいるかもしれないが、それも進歩のための大きな流れである」と聞いて。進歩していけるのであれば、死ぬ方にいるのも悪く無いかなあと思いました。進歩できないのが一番怖い。

プログラマー - 須藤さん

須藤さんから見た世界です。(ぐんまRuby会議01: 「プログラマー」 #guruby

須藤さんにとって、Rubyは応援したい言語。 自分が必要に感じたり、作りたいと思った時にRubyを使い、それを周りに公開することで貢献してきたそうです。

「同じ事で躓く人を少なくしたい」というのが、須藤さんのプログラマとしてのベース。 そのためには、問題を回避せず、原因を直すことが大事とのことでした。

あるべきものを、あるべきように。楽だからといって逃げていると、他の人も回避するようになる。 回避し続けた結果は日々仕事で痛いほど味わっているので、その言葉はずっしりと来ました…。

だからこそ、直すことのできる「フリーソフトウェア」。 仕事でも、できるだけ公開できるようにしているとのことでした。

サラリーマン - 大場さん

大場さんから見た世界です。(Salaryman by Koichiro Ohba

2回の転職を経て、サラリーマンとしての大場さんの生き方のお話でした。

コードが書ければどこでも良いと考え、就職先は地元企業へ。しかし、色んな意味で黒歴史になってしまった…。 ペアプログラミングならぬトリオプログラミング(3人で24時間の意)という手法に変な笑いが出てしまいました。

コードが書ければどこでも良い、わけではない!

伸びている領域ではバズワードが発生する。 バズワードの中から、どれを選択するかって、重要だけれど難しいです。 そのために色んな人の話を聞いて、自分なりに考えていくってのは大事ですし、楽しいですよね。

ふりかえり

最後に、参加者でのふりかえりがありました。 参加者の3席のみ、座席の裏に紙が貼ってあり、その質問に答えるというもの。 まさか当たるとは思わなかったです…。

明日からどうRubyに向き合いますか

という質問でした。難しい。

「初心者なりにとにかくコード書いて、Webサービスも作りたい!」みたいな感じで答えたような気がします(緊張して覚えてない)

今思えば、うすっぺらい!全然ぐんまで得たことが言えてなかったですね。

新潟も群馬と似たようなところがあり、コミュニティ活動も少なければ、僕の地元のIT産業も元気がないです。Ruby勉強会もないですし、首都圏とも距離があります。

そんな中で、自分がプログラマとしてどう生きていくべきなのか? 今後キャリアを積み、最終的には地元に還元したい。でもそうするために、経験値をもっと積みに行くべきなのでは?

Rubyとの出会いは自分の視野を広げてくれた。では、その先は?

明日からRubyと向き合っていくために、自分の方向性を決めたいなあ、なんて思ったのでした。

Console2 + Nyaos + MinGWで快適Windwosターミナル

仕事上コマンドプロンプト毎日いじるので、Windowsのターミナル環境はどんなのが良いんだろう?と色々試しています。

やりたいこと

  • バッチファイルで環境変数バリバリ設定しちゃっても大丈夫
  • パスのバックスラッシュも気にせず使える
  • UNIXライク(コマンド、標準出力のインラインでの置換など)

みたいな感じ。現状では次の構成で落ち着いています。

コマンドは色々試した結果MinGWすることに。 Gow (Gnu On Windows)はうちの環境でパイプをうまく処理してくれなくて、 cygwinはやっぱりパスの解釈で色々問題出てきたので。

結構語り尽くされたネタですが、自分なりの設定も踏まえて紹介します。

Nyaos

NYAOS.ORG - FrontPage.ja

Windowsとの互換性を保ちつつ、UNIXライクに操作できます。 パスは'/'でも'\'でも対応してくれるし、補完も良い感じ。 エイリアスLuaでの記述も可能。

さて、バッチファイルですが、.batを実行すると子プロセスのcmdとして起動します。なので、設定した環境変数はcmdsourceで引き継ぎます。

cmdsource hoge.bat

いつも使うバッチファイルは~/_nyaファイルでaliasの設定しちゃいましょう。以下はVisual Studio コンパイラのコマンド設定の例です。

alias vsenv cmdsource "C:/Program Files (x86)/Microsoft Visual Studio 11.0/Common7/Tools/VsDevCmd.bat"

あと、僕は他にはRuby用に pik(windowsでのrbenvみたいなもの)もaliasしてます。

# $USERPROFILE/.pik/binにpik_installした場合
alias pik cmdsource $USERPROFILE/.pik/bin/pik.bat
pik use 200

Console2

Console - Browse /console-devel at SourceForge.net

見た目も操作も手軽に設定できる、タブ型のターミナルです。 あらゆるシェルをタブとして起動できちゃいます。(Nyaos, PowerShell, cmd, MsysGit などなど)

Console2はデフォルトで日本語入力ができません。 パッチを公開してくれている方がいるので導入しておきます。

Console IME対応パッチ

最新の2.00b148-Betaへのパッチです。

設定メモ

  • フォントはちょっと注意

    • フォントリンクだとカーソル位置がずれる場合がある
    • プロポーショナルフォントだと背景色の表示が一部黒くなる場合がある
    • Smoothing はフォントに応じて設定しておく
  • 画面上の文字選択は、デフォルトだとShiftキーを押す必要あり

    • 押すのが面倒なら設定の Mouse から Select text を Left だけにしておく
  • タブとしてNyaosを登録しとく

  • 色設定はsolarizedがお気に入り

  • 日本語入力時に、カーソルがずれたり文字が重なって表示されたりする場合

MinGW / MSYS

最新のインストーラこちら

~/_nyaはこんな感じ。

set GWBIN=C:/MinGW/bin
set MSYSBIN=C:/MinGW/msys/1.0/bin
set PATH+=$GWBIN
set PATH+=$MSYSBIN

alias ll $MSYSBIN/ls.exe -agoFh --time-style=+"%Y/%m/%d %H:%M" --color=always --show-control-chars
alias vi $MSYSBIN/vim.exe
alias grep grep -ni --color
...

Nyaosのコマンドと重複する場合、Nyaosのほうが優先されるようです(ls等) 嫌な場合は、~/_nyaでaliasしなおせばOK。

alias ls $MSYSBIN/ls.exe

あと、忘れずにHOME設定。

set HOME=$USERPROFILE

参考リンク