NDS32 GitHubハンズオンにいってきた
7/6(土), NDS32 GitHubハンズオンに参加して来ました。
Gitはコマンドである程度は使えていたのですが、SourceTreeも以前から気になっていました。 あと、人にGit勧めたりチームに展開するときにGUI環境があると説明しやすいかなーと思いつつ参加しました。
当日はあいにくの天候にもかかわらず満席で、NDSすげーって思いました。 また、大学の後輩が参加していたのもとてもびっくりでした。
GitHubハンズオン
やったこと
- VCS, SCMとは
- SourceTreeの使い方
- GitHubの使い方
- GitHub Pagesでホームページ作成
- ペアを組んでフォーク、プルリク
SourceTreeは結構使いやすくて、画面もきれいで見やすくてよかったです。 操作も特に迷うことなく使うことができました。 ただ、Windows版のローカライズがまだのようだったので、 他の人に教えるときには注意が必要そうです。
また、GitHubの使い方も勉強になりました。 今まで使う機会のなかったGitHub Pagesに触れたのと、 ペアを組んでPull Requestもできたのが良かったです。
あと、GitHubで画像の差分を見られると知って目からうろこでした。 サンプルのドラえもんの差分がカオスで笑ってしまった。
講師の@dictavさん、ありがとうございました。
LT
LTして来ました。 軽い気持ちでネタLTしようと思ってたのがまさかの満席だったので、予想外に緊張しました。
※応用例を増やすためにワタクシの密かな趣味を大公開してましたが、恥ずかしいのでここでは消してます(・ω・)
一応このLTには意図がありまして、本編がSourceTreeでの初心者向けのGit勉強会だったので、 Gitをもっと気軽に使っていこうよ、というのと、コマンドライン版もこんな感じでつかえるよ、 というような、補足的なLTにしようかと思っていました。
すべるかなーと思っていたのに結構良い反応をいただけたので嬉しかったです。
他の方のLTも多種多様で、楽しく聞かせて頂きました。 ジャンルを超えたLTはNDSならではだなーと思います。
懇親会
ビアバッシュ!
買い出し班だったのですが、雨に打たれて大変でした。 外に出るタイミングで雨が強くなるという理不尽さでしたが、それも含めたのしかった。
オードブルはとても肉々しかったです。 ガッツリお腹いっぱいおいしい食べ物を食べられて満足でした。 写真取ればよかったなと今更後悔してます。
学生にSIerのリアルなこわい話をして若干やりすぎたかなーと思いました。 でも反省はしていない。
まとめ
とても充実してたのしかった一日でした。
これを機に、社内でもSourceTreeを使ってGitいいよって話をしようかなーとも思ってます。
あと、学生すごいなーと改めて思いました。 僕も頑張らなきゃダメですね。
ということで、以上、遅くなったレポートでした。
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 ?
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と向き合っていくために、自分の方向性を決めたいなあ、なんて思ったのでした。