文字列をURLエンコード/デコードするワンライナー(Perl、PHP)

perl -MURI::Escape -e 'print uri_escape("あ");'
php -r 'echo urlencode("あ");'


  • URLデコード
perl -MURI::Escape -e 'print uri_unescape("%E3%81%82");'
php -r 'echo urldecode("%E3%81%82");'

How to install plenv and Carton

plenv

Install

#install plenv
git clone https://github.com/tokuhirom/plenv.git ~/.plenv

echo 'export PATH="$HOME/.plenv/bin:$PATH"' >> ~/.bashrc
echo 'eval "$(plenv init -)"' >> ~/.bashrc
exec $SHELL -l

#install perl-build
git clone https://github.com/tokuhirom/Perl-Build.git ~/.plenv/plugins/perl-build/

How to use plenv

#show the list of available perl(Display installable perl list)
plenv install --list

#install
plenv install 5.8.8

#check the installed perl
plenv versions

#designate using version of perl(global)
plenv global 5.8.8

#designate using version of perl(local)
plenv local 5.8.8

#exec this after installation(To enable installed Perl)
plenv rehash

#check the current version of perl
plenv version

#install cpanm to local
plenv install-cpanm
#if below error occur, modify install script.
#curl: (60) SSL certificate problem, verify that the CA cert is OK. Details:
vi .plenv/libexec/plenv-install-cpanm
>curl -Lk http://cpanmin.us/ | plenv exec perl - App::cpanminus #new


#check the path of cpanm
plenv which cpanm

#check the installed modules
plenv list-modules

How to migrate installed modules from system to plenv's perl by plenv

#module install from other version of perl
plenv migrate-modules ${from_version} ${to_version}
#ex)migrate modules from pre-installed perl to plenv's perl
plenv migrate-modules system 5.8.8

#check the installed modules
plenv list-modules

Carton

cpanm Carton
#make cpanfile in advance

#install modules(save to current_dir/local/)
carton install

#check cpanfile.snapshot(This file is made by carton install. When you execute bundle install, it's necessary)
ls cpanfile.snapshot

#copy tarball from local dir to vendor dir
carton bundle

#install by vendor dir as CPAN mirror
carton install --cached

#use modules of local directory
carton exec -- ${perl_script} ${arg1} ${arg2}

Make cpanfile(like Gemfile)

git clone https://gist.github.com/5883207.git make_cpanfile
cd make_cpanfile
perl installed2cpanfile > cpanfile

参考書籍:

Perlのワンライナーでcat, grep, sed, awkを実現する



cat

  # 引数で渡したファイルを一行ずつ読み込み、-eで指定したコードの$_に渡す(-n)

  perl -wnl -e 'print;' test.txt

  # -nオプションに加えてprintまで同時に行う(-p) ※書籍「ミニマルPerl」では推奨されていない
  perl -wpl -e '' test.txt

※-lオプションはprint時に自動的に改行を付与するものっぽい
  
   # 文字列検索('table'を検索)
   perl -wnl -e '/table/ and print;' test.html
   # '/'を含む文字列検索
   perl -wnl -e 'm|http://| and print;' test.html
   # grep -v(HTML内で’<’を含まない行を検索)
   perl -wnl -e '/
   
sed置換
   # 単純な置換
   perl -wnl -e 's/table/test/g and print;' test.html
   # -iオプションでbackupを取ってからファイルを置換
   perl -i.bak -wpl -e 's/table/test/g' test.html
   # -iオプション(ファイル名に日付を付加)でbackupを取ってからファイルを置換
   perl -i.bak`date +%Y%m%d` -wpl -e 's/test/table/g' test.html
   
awk(-aオプションで行を空白区切りで配列(@F)へ格納する)
   # 二列目だけ表示
   perl -wnla -e '($first, $second)=@F;print $second;' test.txt
   # 区切り文字(デフォルト空白)を':'にして実行
   perl -wnlaF':' -e '($first, $second)=@F;print $second;' test.txt
   # 行末の列番号表示(awkのNF)
   perl -wnla -e '$num=@F; print $num;' test.txt
   # 行末の列の値表示(awkの$NF)
   perl -wnla -e '$num=@F; print $F[$num-1];' test.txt
   # backupファイルを作成した上で特定の列情報でファイルを上書きする
   perl -i.bak -wnla -e '($first, $second)=@F;print "$second $first";' test.txt


参考書籍:

Scrum boot camp in グリーに参加してきました。

 10/19(Sat)にScrum boot camp in グリーに参加してきましたのでレポートします。
 開催者がグリーの方で、普段行われているScrum boot campとは主催が違うなど色々と裏話がありそうな感じでしたがその辺は割愛。本会がどのような感じであったのかをレポートします。

 今回、六本木ヒルズのグリー社内での開催ということで参加者の半数以上がグリー社員という状況。最初にグループ分けをした際、なんと4人のチームのうち3人がグリー社員という状況(つまり非グリーは自分ひとりね)。さすがにグリーの人多すぎだろ、とwしかも珍しい(?)ことにグループメンバーは皆デザイナーで、デベロッパーは自分だけという状況でした。

 ちなみに当日のスケジュールは主に以下の流れ。

  1. 主催者による座学講義
  2. 紙飛行機作成ワークショップ
  3. 新アプリデザインワークショップ

Scrumとは何かについての座学講義
 主催者の方(グリー社員)によるScrum講義では、Scrumについての基本がひと通り話されていました(詳しくはスクラムガイド参照)。
 今回、自分はプロダクトオーナーの兼任について質問してきました。自分の今のプロジェクトは開発チームのメンバーの一人がプロダクトオーナーの役割の一部を担うような形になっています。それが是か非かという話です。回答としては、基本的に、プロダクトオーナー、スクラムマスター、開発チームは兼任すべきではないということでした。後で弊社の有識者の方が教えてくれたのですが、プロダクトオーナーはバックログの管理や、やるかやらないかの判断までする人なので、その人が開発チームのメンバーになってしまうと、開発チームに無理をさせることをチームのメンバーでありながら指示することになるので感情的な対立が起きる可能性があるということでした。ただ、優れた(?)人物に管理されるチーム、ベンチャー企業などでは、それこそスクラムマスターとプロダクトオーナーを一人の人物が兼任するようなこともあるそうです。(ここは色々と議論があるようですが)

 今回、理解した点として主には役割の兼任がもたらす問題点でしたが、他に以下についても学びました。
  • スコープを操作する際に、品質目標を下げてはいけない。
  • スプリント中にタスクを追加しない。(集中力を上げるため)
  • タスクの変更はプロダクトオーナーと相談する。
  • ビジネス価値を基準とする。
 また、見積もりについての座学講義もあり、そこでは以下のようなことが語られました。
  • 基本的に見積もり通りには終わらない。
  • バッファを積んでも、学生の夏休みの宿題状態になる。(結局バッファを食いつぶし、ギリギリに終わる)
  • 追加タスク(やってもやらなくてもよい)を後に積んでおいて、それを込みで見積もりを出しておく。全体のスケジュールの7割で必須機能を作りこむなどすると良い。
  • より詳細なプラクティスは「アジャイルな見積もりと計画づくり」参照とのこと。
ワークショップでScrumを体験する
 今回、前述の2つのワークショップでScrumのプロセスを体感しました。
紙飛行機ワークショップは、時間内に計画、実施、振り返りのプロセスを通して、作業を改善していく過程を学ぶワークショップでした。このワークショップは全く同じものを自社でやっていたので特に戸惑うことなくやれました。このワークショップ、メンバーの方々は初めてだったようで、いかにチームの成績を上げるかに頭がいきがちでしたが、このワークショップの肝はScrumのプロセスでいかに工程を効率化するかです。社内でやったときも、成績を上げるために主催者の作ったルールの穴を探しがちなのですが(かく言う自分も最初そうでした)それで効率を上げることは実際には全く意味のない行為です。大事なのは、先にも書いた通り、計画、実施、振り返りのプロセスを通して作業を改善することがどう進捗に影響するかを体感することにあります。経験者なので、その辺を少し伝えつつ、最終的には皆このプロセスでこなせたのではないかと思います。
 もう一つの新アプリデザインワークショップでは、さすがグリーのデザイナーという感じで、ゲームに関するデザインの面白いアイデアが出ていました。また、工数見積もりではデザイナーらしく、絵を書くのに◯◯くらいの工数がかかる、絵についての顧客との契約交渉がある、などデベロッパーとは違った視点での意見が出て面白かったです。またゲーム開発をしているかのような経験ができたのも面白かったです。このワークショップで思ったのは、やはり計画の重要性でした。わりと無計画な感じで進めてしまいがちでしたが、計画的に、タイムボックスを切ってやること、これは重要だなと思いました。それぞれが必要と思われるタスクを勝手にやってしまうのではなく、基本的に、常にステークホルダーに確認を取りながら、計画、実施、振り返りを繰り返していくことが、手戻り無く順調にプロジェクトを進捗させていく良いプラクティスだなと思いました。よくやりがちなのですが、”頑張って”問題を解決するということをメンバーがやっている場面があり、普段の自分を見ているようで(笑)気をつけなければなと思いました。みんな一生懸命だからそうなってしまうのですが、冷静にプロジェクトを見つめる目が必要で、それがスクラムマスターの役目なのかな、と思いました。

感想
 グリーの方々が多いことを除けば、普通のScrumワークショップでした。今回改めて思ったのは、Scrumはワークショップで実際に体験してみないとそのプラクティスを座学だけ得るのは難しいなと思いました。思うに、Scrumが開発習慣に入っていない人は、座学で理解しただけの頭でっかちでは、正しく適用するのは難しいと思います。意外とみんな計画や振り返りをきちんとするよりもまず”頑張って”しまうので、一度一息ついて、きちんと計画を立てて、ステークホルダーを巻き込みながら、健全に、効率的にプロジェクトを回していく、振り返りをきちんとする、これを実践していってほしいなと思いました。かく言う自分も忘れて先走ってしまいがちなので、その辺しっかり守っていきたいなと思います。

TDD boot camp 横浜3rdに参加してきた。

TDD boot camp 横浜3rdに参加してきたので、そのときの様子を書いてみたいと思います。
ソースコードはこちら(https://github.com/shinjukujohnny/tddbc

まずは参加までの流れ。
開催の数日前、TDD boot camp横浜3rdが開催されることを知る。その時点で3名のキャンセル待ちとなっていたが、開催日の天気も悪そうだったので、当日キャンセルが出ると見込んで参加登録。当日の朝になってもラスト1人のキャンセル待ち状態だったけど、ひとまず家を出て会場を向かった。(今までの経験から、大抵当日キャンセルは出るし、主催者側も会場が許す限り入れてくれたりするので、参加登録して行ってしまうのが良いと思う)結果、予想通りキャンセルが出ていて、無事参加できた。

座学でTDDとは何かを学ぶ(午前)
安井力さんによる基調講演。TDDとは何かを座学で学びました。講演込みで朝からやるのはTDDBC横浜だけなのだそうです。大変勉強になりました。詳細はslideshareでご覧ください。

参加者同士でペアプロ(午後)
今回自分は、事前登録でJavaScriptを選んでTDDBC参加。準備として、自分のノートPCにnode.jsとjasmine-nodeをインストールして、サンプルのテストコード、ソースコードを用意して参加しました。最初席についた時にたまたま隣に座っていた人が同じくJavaScript、Jasmineだったので、好都合だったのですが、Jasmineのテストの回し方が違っていて、最初にそこを埋める時間が発生してしまいました。結局自分と同じ環境をペアの人に作ってもらうことで環境差異を埋めることになりました。環境は前述の自分のgithubの通り、jasmine-nodeをコマンドラインで使っています。今回はペアで組んだ人があまりJavaScriptを書けるようでは無さそうでしたので、自分がリードする形で進めました。全体としては、1時間の実装時間(もちろんTDD)の後にレビューの時間が入るという形を3度繰り返すという形で進められました。レビューは各言語のエキスパートによる容赦無いツッコミが展開され、ビビりました。今回自分はレビューの機会がありませんでしたが、次回参加の機会がある場合は気合入れて参加したいなと思いました。

参加してみた感想
普段どうしても製品コードから書いてしまいがちな自分としては、一日しっかり時間を取って業務外で焦らずTDDのステップを学べたことは価値がありました。何よりテストがあることで安全に大胆にリファクタリングができたことが良かったです。この経験はちょっとした感動でした。製品コードから書いていたらこうはいかなかったと思います。とはいえ、初めての参加でしたので、自分の悪い癖(製品コードから書きだそうとする)が出てしまった場面もありました。しかしペアプロでやっていたこともあり、途中でテスト書いてないことに気づいて戻ってテストから書きなおしたりやれたので良かったです。TDDを導入しようと思ったら、セットでペアプロも導入するのがお勧めだなと思いました。特に染み付いた習慣を矯正するのは一人では難しいので、お互いにTDDが正しく運用されているか監視し合いながら、交代しながらやるのは非常に効果的だなと思いました。

DevLoveに行ってきた

ひさーしぶりにDevLoveに参加した。前回参加したのはもう4,5年前で、確か平鍋さんのPFPの話だったはず。
今回は以下「JSLOVE 〜JavaScriptを愛する人の話を聞いてみよう〜」
http://devlove.doorkeeper.jp/events/5811

なんで突然行く気になったかというと、前職の後輩木村さんが登壇すると知って、
興味が湧いた。普段JSで開発しているわけだし、たまには勉強会に行くかー、と。
また、ここ数ヶ月業務の忙しさにかまけて他の勉強会とかも顔を出せていなかったし、また社外の素晴らしいエンジニアを知る機会を作りたいなー、なんて思ってもいた。

木村さんのお話はJSの歴史から始まり、最近の動向まで幅広く、JSって何よみたいなところを話していた。
なんというか、木村さん相変わらずだなーと思ったw JSLoveさ加減は良く伝わったw

お次の方はJSの言語仕様とかの話。
JSはthisが何をさしているのかがわかりづらいという話があったけど、俺結構わかる気がする。
後、スコープを限定するために無名関数使うっていうのをあまりやらないことみたいに言ってた気がするけど、うちではかなり使ってるなー。グローバル汚さないようにしようとおもったらやるよねコレ、とか思った。
あと、jQuery Defferdとか、node.js qとかのネストしないでコールバックを記述するやり方とかあたりはもっと聞きたかった。特にwhenの使い方とか。

ラストはSencha touchの話。
これが今日一番おもしろかった。JSでモバイル対応の画面作るためのフレームワークみたい。
scaffoldみたいなジェネレーターがついてて、MVCのひな形一気に作れる。
JSでクラスを使えるようにしているとか言っていたけど、見た目はかなりJSだねやっぱ。
一番Goodだと思ったのは、簡単な実装でモバイルUI(HTML含む)を書き出すことができるところ。
だいぶ前にモバイルツール作ったときはjQuery Mobile使ったけど、Sencha面白そうだなー。使ってみようと思った。

全体として、JSLove感が溢れてたかは定かではないけど、ま、やっぱ社外の色んなバックグラウンドのハッカーたちと触れ合うのは良い刺激になって良いなー、とか思いました。
一時、勉強会に価値を見いだせない時期があったのだけれど、やっぱ楽しい。そしてもっと話したいし、登壇したいと思った。