デブサミ2013で「ニコニコ静画(電子書籍)の作り方」を喋ってきたよ
デブサミ2013の1日目のA会場で「ニコニコ静画(電子書籍)の作り方〜みんながニコニコしてくれる読書体験を届けるために〜」というテーマでお話ししてきました。資料:https://speakerdeck.com/regtan/nikonikoshu-ji-falsezuo-rifang togetter:http://togetter.com/li/453501
ちょこちょこっと補足していきます。バレンタインだけにチョコチョコっと。
github:enterpriseについて
まだまだ少ないながらもgithub:enterprise導入事例が増えてきました。正直、ある程度のコストを覚悟しなければならない分導入が難しいと思います。もっと安価に導入する方法として、githubのprivate repositoryがあります。インターネット上のgithubの有料サービスとして提供されている物ですが、github:enterpriseと同等の機能を持っています。これを利用すればご紹介した運用が実現できます。
github:enterprise以外にもatlassian stashというツールもあります。こちらはライセンス料が安く導入もしやすいでしょう。あまり機能について詳しくないのですが比較対象として十分な物だと思います
jenkins先生とリリース先輩について
リリースの準備をしてくれるirc botです。このbotは先輩と言う名の通りそれなりのポジションを持っています。ちなみにリーダーであるわたしより偉い立場です。チーム内序列でいうとJenkins先生>リリース先輩>>>>|越えられない壁|>>>エンジニアくらいの差があります。だから、わたしたちはそれぞれに敬意をこめてJenkins先生・リリース先輩と呼びます。
リリース先輩の詳細、開発に至るまでの話はリリース先輩というIRCボットを作った - 鳩舎 をご参考ください。
今回のセッションとアジャイル
アジャイルプラクティスにはじまり、アジャイルサムライにいたるまで様々なプラクティスを紹介する本やそれにともなう勉強会が数多く開かれ一般的になってきました。しかし、一方ではプラクティスをそのままやればいいよねという風潮も感じられます。でも、アジャイルってそうじゃないよねっていうのがわたしの思いです。
アジャイルについて用語を並べて語ることはできます。それは知識量の問題で勉強すればできるようになります。でも、今回のセッションではそれでは意味がないと考えました。アジャイルって自分たちのチームに合わせて適用していくもの。なので、自分たちがやっている姿を自分の言葉で紹介しようと思い、「社会性のない人たちの集まったチーム」という表現をしたり、出来る限りアジャイルの文脈で使う言葉(スプリントとかスクラムとか)を使わずにお話しました。
あれをやらないとアジャイルじゃないとか考えるよりももっと自由に、もっと柔軟にやればいいと思います。
いや、まぁ、うちのチームの社会性は他所様と比べれば欠けてるのは事実ですが・・・
Actionカードに書いたメッセージ
「あたりまえのことをあたりまえにやろう!」このようなメッセージにしました。数年前ではそうでもなかったのですが、unittest/CI/アジャイルはもう当たり前の時代になりました。気がつくと「当たり前」と呼ばれる水準はあっという間に上がっています。じゃあ、出来てないことがあるならばどうすればできるようになるか。より、あたりまえにできるかを考えるきっかけになればとおもいます。
会場にお越しいただいた方には配布されたのですが、そうでない方にはスピーカー用に5枚頂きましたので4枚までは先着順で差し上げます。直接取りに来てください。
その他
時間が許せばどこかのイベントとかで話せたらなーと思ってます。会場でアンケート用紙に書いて頂いた内容は後日手元に届くのでそこでお答えできることはお答えします。
2012年振り返り
いやー気がついたら大晦日ですよ。あっという間に1年過ぎました。というわけで振り返ってみようと思います。
1月
12月に転職して初めてむかえるお正月。なんだかんだいって落ち着いてお正月お休みしてた。
2月
@kwappaと@yoshioriといっしょにデブサミ初登壇。2日目の最終セッションという一番いい所もらって好きなだけ喋ってたというセッションでした。
3月
試用期間無事終了。クビになりませんでした。よかったよかった。
4月
この頃から担当するお仕事がバックエンド以外にもフロントも担当するようになった。phpゆるふわしてて色々泣きそうになった。あとは超エンジニアミーティングで司会したりと変わったお仕事も担当。
5月〜8月
仕事でバタバタしたりしてたけど充実した日々。
11月
上司の退職にともなって、システムリーダーに就任。開発責任者っていう役職です。これまでのお仕事とは違うタスクが湧いて出てくるポジション。
12月
転職して1年たった。でもって、33歳になった。
まとめ
あれ?プライベートなイベントなにもなかったや・・・というわけで来年もよろしくお願いします。
raspberryPiの焼き方
念願のraspberryPiを手に入れたぞ!!!というわけで、同僚がまとめて買っていたのを一つ譲ってもらいました。raspberryPiは名刺サイズの基盤むき出しのコンピュータ。その割にはLANのポートがついてたりHDMI出力やコンポジット出力までついているみょうに高性能な奴です。25.92ポンド。日本円で3,200円くらいです。今注文すると12月中旬お届けらしいです。
準備するもの
買った時におまけにケーブルなどがついてくるわけでもないので起動するためには色々と準備が必要です。
- SDカード
- HDMIケーブル
- せっかく対応しているので使わない手はないということで。
- お手元のモニターが対応してなかったらHDMI-DVI変換コネクタとか使えばいい
- ヨドバシで1,000円くらい
- USB microBケーブル
- これが電源供給用ケーブル
- ヨドバシで500円くらい
基本的に必要な物はこれくらい。あとは必要に応じて購入しましょう。
OSイメージのダウンロード
オフィシャルサイトのダウンロードコーナーから直接落としたりtorrent使って落としたりして準備します。今回はサイトにthis is the image we recommend you useとマジオヌヌメといっているRaspbian “wheezy”を落としてきました。
ダウンロードはこちら:http://www.raspberrypi.org/downloads
SDカードへの書き込み
おとしてきたファイルを展開してイメージファイルを取り出します。そのイメージをSDカードに焼きます。macならこんな感じ。
$ sudo diskutil unmount /Volumes/NO\ NAME/ #SDカード刺すとmountされるので一度unmount $ sudo dd if=/path/to/2012-08-16-wheezy-raspbian.img of=/dev/disk1s1 bs=10240
SDカードのunmountが出来ない場合は一度macを再起動して、alfredとか色々止めてもう一度やってみるとうまく行きます。ちなみにここで書いたコマンドでみんなうまく行ったそうですがdiskイメージからうまくbootしてくれませんでした。何かまちがってるかもしれません。
windowsの場合はWin32DiskImagerというツールを使うと良いそうです。今回は負けを認めてwindows使いました。
起動する
SDカードへの書き込みが終ったら本体にさして電源を入れます。USB microBケーブルをさしたらすぐに起動プロセスが始まりますので他のケーブルは先に繋いでおきましょう。電源スイッチなんてないのでUSBケーブルの抜き刺ししてON/OFFします。
電源が入ったらPWDと書かれたLEDが赤く点灯します。起動が始まるとその隣のOKと書かれた緑のLEDが点滅します。OKのLEDが点滅しない場合はイメージの書き込みに失敗している恐れがあります。
起動するとこんな感じの画面が出てきます。
ここでkeymapの設定とか文字コードの設定やsshdの起動のon/offを設定します。設定が終ったらstartxでGUIを起動します。
上手に焼けましたー
日本語周りは日本語フォントのインストールが必要なので写真では文字化けしてます。追いオリーブはお好みで。
まとめ
ddコマンドでうまく行かなかった原因がよく分かってない。bootセクタがうまく読み込めてないのかなという程度にしかわかってません。あとSDカードのunmountがうまく行かないという悲しみを味わった。うちではテレビにHDMIでつないで使ってます。意外と便利でおもしろい。メモリは256Mなのでハードな使い方は難しいかもしれませんがちょっとした検証なんかには使えるのではないでしょうか。
Re:シェル操作課題 (cut, sort, uniq などで集計を行う) 設問編
ymsr先生書いたシェル操作課題 (cut, sort, uniq などで集計を行う) 設問編に答えてみた。環境はzsh。課題のファイルはtest.txtで保存しているという前提で。
問1 このファイルを表示しろ
more test.txt
more派です。
問2 このファイルからサーバー名とアクセス先だけ表示しろ
課題のファイルがサーバー名,unixtime,ユーザーID,アクセス先の形式なので1番目と4番目を表示すればよいのでawkつかう。awkのセパレータはデフォルトではスペースやタブなのでFS=","でカンマに設定する。どこを表示したいかは$1などで指定する。
awk 'BEGIN {FS=","} {print $1","$4}' test.txt
問4 このファイルの行数を表示しろ
行数だけならばwcでOKなんだけど環境によってwcの出力結果は違うので注意。
wc test.txt --結果 9 9 302 test.txt
こうすると左から順に行数、単語数、バイト数、ファイル名。行数だけなら-lオプションをつける。
wc -l test.txt --結果 9 test.txt
ファイル名もいらねーよ。クソが。という場合はこれもawkで切り出す。
wc -l test.txt | awk '{print $1}' --結果 9
問5 このファイルをサーバー名、ユーザーIDの昇順で5行だけ表示しろ
ソートはsortコマンド。セパレータはーtオプションで設定。ソートキーはーkオプションで設定する。先頭5行などはheadコマンドをつかう。
sort -k1,1 -k3,3n -t"," test.txt | head -n 5
この問題の引っかかりやすい所は
sort -k1,3 -t"," test.txt | head -n 5
としてしまうと1,2,3番目のカラムをソートキーにしてしまうこと。今回は1,3番目をソートキーにしたいのでこんな感じにすると
sort -k1 -k3 -t"," test.txt | head -n 5
今度は3番目のキーが辞書順ソートなので30が先頭に来てしまうのでnをつけて数字順ソートにする。
問6 このファイルには重複行がある。重複行はまとめて数え行数を表示しろ
重複分を省きたいときはuniqコマンド。uniqコマンドは同じ行が2つ以上続く時にのみ1行にまとめないのでファイル全体の重複を調べるときはsortしてからuniqする。
sort test.txt |uniq|wc|awk '{print $1}'
最後のawkは行数のみを出すためにかけてる
問7 このログのUU(ユニークユーザー)数を表示しろ
ユーザーIDは3番目のカラムなので抜きだしてソートしてuniqかけてwcで行数カウント。
awk 'BEGIN {FS=","} {print $3}' test.txt | sort |uniq|wc|awk '{print $1}'
問8 このログのアクセス先ごとにアクセス数を数え上位1つを表示しろ
重複行数を出すにはuniqの-cオプション。降順にソートするときはsortの-rオプション。
awk 'BEGIN {FS=","} {print $4}' test.txt | sort | uniq -c | sort -r | head -n1
問9 このログのserverという文字列をxxxという文字列に変え、サーバー毎のアクセス数を表示しろ
基本的には問8と同じ。文字列置換はsedをつかう。
awk 'BEGIN {FS=","} {print $1}' test.txt | sort | uniq -c | sed -e "s/server/xxx/g"
問10 このログのユーザーIDが10以上の人のユニークなユーザーIDをユーザーIDでソートして表示しろ
条件にあうものだけを表示するときはawkで条件式を書く。awk職人の朝は早い・・・
awk 'BEGIN {FS=","} {if($3 >= 10) print $3}' test.txt | sort -n |uniq
ログが数十Gだったら?
こんなところにエントリがあったので紹介しておきます。
http://d.hatena.ne.jp/celitan/20110824/1314176354
多分もっといいやり方あるとおもいます。
僕がプログラミングをするときの心境やよく唱える呪文
こんばんは。regtanです。海の日だっていうこと忘れてついうっかり出社しそうになりましたが社蓄じゃないですよ。前に比べ、健康的な生活送ってます。僕がプログラミングをするときの心境やよく唱える呪文ってのをみたので同じく書いてみることにします。
Java
Windowsでなぜかうまく動かないとき
write once,run anywhereは幻想。write once,run anywhereは幻想。あ・・・改行コードがハードコードしてある。死ね。
予想外にテストが通ったとき
あばばばばばばばば
List<? extends Object>
はい。
new StringBuilder("hoge"+"moge"+"piyo")
はい。
javascript
うまくいかないとき
やっぱり俺Javascript書けないわ・・・
IE7でのみうまく動かないとき
俺のコードが悪いんだ。tridentは素直な子・・・tridentは素直な子・・・(手元のクッションを殴りながら)
それでもうまく動かないとき
∧_∧ ⊂(#・ω・) ご家庭にIE7はない! / ノ∪ し―-J |l| | 人ペシッ!! __ \ \  ̄ ̄
IE Testerが落ちたとき
なんで5分放置したら落ちるん?かまってちゃんなの?
コミットするとき
git commit -m 'IE死ね!'
git
git rebase -i 使ってsquashするとき
あ、全部squashにしちゃった・・・
git stashしすぎる
おぼぼぼぼぼぼ
なんかうまくいかない
git うまくいかない reset
個人的に良く使うgitコマンド・設定まとめ
こんばんは。regtanです。最近、gitまとめエントリをよく目にするようになりました。というわけで、流れに乗って個人的に良く使うコマンドとか設定とかをまとめてご紹介します。エイリアスは省いています。
config
設定周りのお話。いちおうコマンドラインベースで書いてますがgitconfigに書けばそのまま使えます。
git config --global user.name your_name git config --global user.email your_address
これはgitインストールした直後にする設定。それぞれコミット時に付与されるユーザ情報の設定。--globalをつけるとgitで管理するレポジトリ全てに同じ情報を設定。--globalを外すと自分のいま見ているレポジトリでのみ有効な設定になる。ちなみにこれをしていないとcommit時に警告がでる。
git config --global core.editor 'vim -c "set fenc=utf-8"'
コミットコメント書く時に自動的にvimが上がってくるように設定。好きなエディタに設定するといいだろう。
git config --global grep.lineNumber true git config --global core.pager "lv -c"
git grepの結果にhitしたところの行数を表示する。これなんでデフォルトfalseだし・・・ core.pagerはgit logとかgit diffの文字化け対応。
git config --global alias.graph 'log --graph --date-order -C -M --pretty=format:"<%h> %ad [%an] %Cgreen%d%Creset %s" --all --date=iso'
git graphでブランチの分岐点をAAで表示してくれるようにaliasを設定。
ローカルでの処理
ローカルレポジトリに対する操作のお話。
git fetch #リモートレポジトリの更新差分を持ってくる git merge origin/branch_name #持ってきた差分をローカルブランチに適用
git fetchでリモートレポジトリの差分を取得します。差分はローカルのorigin/リモートブランチ名においてあるのでgit mergeで自分のローカルレポジトリに反映させます。まとめてgit pullでできるんだけどgit fetchで更新状態確認したいのでこの手順でやってます。
git checkout -b 新しいブランチ名 元にするブランチ名 #新しいブランチを作成する
トピックブランチを作ったりするときに使います。あとはgit fetchで持ってきたリモートにしかないブランチを元に新しいブランチをローカルに作ることもできます。git branch -b staging origin/stagingみたいな感じ。
git rebase -i コミットハッシュ #コミットハッシュで指定した所までのコミットをまとめる
コミットハッシュで指定したコミットまでのコミットを対話モードでまとめます。*1IEめ!IEめ!とかIE対応とか怪しいコミットがあったらまとめておきましょう。
git rebase --abort #rebaseやめたい git rebase --skip #無視して続行
rebase中に途中でコンフリクトしたりエラーで止まった時に最初からやり直したいときは--abort。エラー無視して続行する場合は--skip
git branch -m 元のブランチ名 新しいブランチ名 #ブランチ名の変更 git branch -D ブランチ名 #ブランチの削除
ブランチ名を変更します。ブランチ名typoしてリモートに入れたら割と恥ずかしい。いらなくなったトピックブランチは削除しましょう。
git pull --prune #リモートレポジトリにないローカルブランチの削除
リモートレポジトリにないローカルブランチを削除する。定期的にやらないと手元がトピックブランチだらけになる。
git commit --amend #コミットメッセージの修正
前回のコミットメッセージを修正する。typoすると割とはずかしい。
git branch -av #ローカルのブランチ一覧 git status #次のコミットに含まれるファイル情報 git log #コミットログ
この3つはこまめに叩く確認コマンド。git branch -avでローカルに保持しているリモートレポジトリの情報とローカルレポジトリの両方の最終コミットメッセージとハッシュを表示。git statusで次のコミットに含まれるファイルの情報を表示。コミット前に確認してaddし忘れた><なんて言う事態を避ける。git logはブランチのコミットログを確認。
git remote add aliasname url
git remote rm aliasname url
レポジトリURLの作成と削除。同じレポジトリを他のリモートに入れたい時とかはここに設定しておく。例えばgit remote add githubrepo your_github_resitory_urlみたいなかんじ
stash
変更を一時的に保持しておく仕組み。git stash使うとgit使っててよかったわぁと割と幸せになれる仕組み。
git stash #変更をstashに git stash pop #stashに入れた変更を今いるブランチに適用 git stash apply #stashに入れた変更を今いるブランチに適用 git stash drop #stashに入れた変更を今いるブランチに適用 git stash list #stashに入れた変更のリスト
popとapplyの違いは適用後にstashを捨てるかどうか。popは捨てる。applyは捨てない。stashカウントを表示しておけばstashしすぎてあばばばばばってこともなくなるので便利です。stashカウントの表示についてはdotfile/regtan.zsh-theme at master · regtan/dotfile · GitHub のgit_prompt_stash_count()をごらんください。
リモートレポジトリに対する操作
リモートレポジトリに対する操作のお話。正直あんまりないような気がする。
git push --delete origin branch_name #リモートブランチを消す git push origin :branch_name #リモートブランチを消す
上の方がdeleteを指定して削除。*2下の方はリモートブランチにnullをpushするという意味。ちなみに: > filenameってやると指定したファイルの中身を全て削除することができます。はい。豆知識。いらなくなったトピックブランチを消す時に使う
git push origin local_branch_name:remote_branch_name #別名でpushする
ローカルブランチ名と違う名前でリモートにpushしたい時はこんな感じ。
まとめ
たぶんgitのほうがsvnよりわかりやすいし失敗してもリカバリしやすいから皆さん.zshrcなどにalias svn='git'って書いてgit使えばいいとおもいます。あとgit助けてはとても便利なので入れておきましょう。
*1:エディタが起動して指定した所までのコミット一覧が表示されてそこからsquashを選ぶとまとめることが出来ます。
*2:via:http://twitter.com/#!/yuroyoro/status/217627535259865089