Expressのviewでセッションの値を使う方法

expressでアプリ作っててハマったので備忘録

経緯

そもそもviewでセッションの値使う書き方していいのかは定かではないが、セッションに保存している値をviewしようとしてjadeで以下のように書くとsessionがundefinedだって怒られる

    div
      req.session.hoge

まぁviewでreqとか扱えなさそうなので当然っちゃ当然なのだがどうにかしたい

対策

結論から言うと、middlewareを追加してviewで参照可能な変数に入れるようにする
コードはこうなる

app.use(function(req, res, next){
    res.locals.hoge = req.session.hoge;
    next();
});

どうやらres.localsにviewからアクセスできる変数が定義されるらしく、そこに新たにパラメータを追加してやり、セッションのhogeを入れることで参照可能になるようだ
こうするとviewのjadeでは以下のようにすると値が取れる

    div
      hoge

補足事項

ネットで情報を探していると以下のような書き方を載せているものがあった

app.dynamicHelpers({
    session: function (req, res) {
        return req.session;
    }
});

最初はこれを使ったんだけどまー動かない
このdynamicHelpersってやつはexpress 3.x系では廃止されたらしい
このことはexpress公式のmigrationガイドにも記載があるので注意

また、middlewareを定義する位置なのだが、「app.use(app.router)」より前に書かないと動かない
中まで追ってないから原因はわからないが、そういうもんらしい
これは言うまでもないが「app.use(express.session(・・・」の後に書かないとsessionが正しく読めないっぽくて怒られるので、動かない場合は書く位置を見なおしてみると良い

実践vimを読んで仕事が楽しくなる話

一歩出遅れた感あるが実践vimを読んだ

実践Vim 思考のスピードで編集しよう!

自分とvim

自分はエディタとしてvimを使っている
なぜvimなのかというと正直ロマンだ。最近はsublimeが気になって仕方ない
去年はインフラの仕事してたのもあってviからの流れというのもあるかも

自分は情報系の大学の出なので初めてvimを使ったのは実は結構前だ
「挿入モードってなんだよ?使いずら!」というのが正直な感想だった
そんな僕も今ではvimでさくさくと(ほんとか?)コードを書いている
使っているプラグイン等の記事は別途書きたいと思うが、今回はそんなレベルのvimerの自分が読んだ感想をお伝えしたい

読んでみてどうだったか

正直vimmer名乗るの恥ずかしくなったw
知らないことが多すぎた。vimというツールの強力さをまったく生かせていなかった
最低限のエディタ機能しか知らなかったと反省
とりあえず使っているレベルの人なら一読の価値はあると思います

参考になったところ

ドットコマンド

.(ドット)キー打つと前回編集した内容を繰り返してくれるんですよ
いやもうね。そんなことも知らなかったんです。ほんとに恥ずかしい ちなみに本書では編集内容とかコマンド構成を"ドットコマンドで再利用可能な形"にして、出来る限りドットコマンドを繰り返し使うことを推奨してる
確かに似たような編集をいかに最少タイプ数で編集するかは重要だよね

テキストオブジェクト

テキストをオブジェクトとして見る、簡単に言えばタグとかカッコとかを認識してその単位でオブジェクトとして見てくれる機能があるんですね
これもまったく知らなかった
例えば、

function(hoge,huga){

こんなテキストがあって関数の引数を変えたい時にカッコの中で"di("とすると、

function(){

こうなる
消してそのまま挿入モードに入りたければ、最初のコマンドをdじゃなくてcにすればよい
最後のカッコのところは色々対応していて、<、{、[、tとか色々できる。tはタグを意味している。

また、真ん中の"i"を"a"にするとカッコごと消してくれる 例えば、

<div><a href="hoge">huga</a></div> 

こんなテキストがあって、aタグの中で"dat"とすると、

<div></div> 

こうなる。HTMLのタグごと消したい時とかはこっちのほうがいいね

fコマンド

これもまた知らなかったので恥ずかしいんだけど、fコマンドはfの後に続けた文字をその行の中で検索してカーソルを移動してくれるコマンド
例えば、

This is a apple

という行があったとする
このときappleをbananaにしようと思ったら、僕は"w"を連打してた(この例だと"$b"とかもするかも)
こういうときに"fp"とすると、この行で最初にでてくる"p"、つまり"apple"の"p"にカーソルが移動するのだ
ちなみに編集対象がappleだからって"fa"としてしまうと途中にある"a"に移動してしまうので注意(その場合は";"とすると次の候補に飛んでくれる)
fコマンドは考えるまでに候補をちょっと考えなきゃいけない時はあるものの、"w"を連打するよりは遥かに効率がいい

表示行の移動

vimのデフォルトでは1行の長さがウィンドウを超える場合、行番号なしの新しい行をつくって、いわゆる折り返しをしてくれる
この折り返しの行に移動したいとき"j"とか"↓"を押したら行番号的にいっこ下の行に移動してイラッとした経験ないすか?
そんなときは"gj"とか"gk"とすると表示通りの移動をしてくれる
これは凄く助かる。こういう場合自分は目的のところに辿り着くまで"w"を延々と連打していた。fを使うのもありだけどすぐ下かすぐ上に見えてる所ならこれが凄く助かる

ヤンクレジスタ

例えば"yy"で行をコピーして下の方のある行を上書きしようと思う

1: first line  #ここでyy
2: second line
3: third line

対象の行まで移動してその行を"dd"で削除、"P"で貼付け…と思ったら直前で削除した行でレジスタが上書きされていて"yy"した行がでてこない!!

1: first line
2: second line
3: third line #ここでddP…orz

なんてことありませんかと。僕はしょっちゅうあっていつも苛ついていた
削除に見える動作が実際は切り取りであるために、最初にヤンクしたレジスタを上書きしてしまっているから起きる現象
でも我々にはヤンクレジスタがあります。ヤンクレジスタはヤンクした結果のみ格納しているレジスタ
ヤンクレジスタは"0で指定できるので、"P"の代わりに" "0P" とやってやれば問題は解決

1: first line
2: second line
1: first line #ddで3行目を消した後"0P

その他

ファイル間のジャンプ、レジスタ、マクロなど使いこなせれば恐ろしく捗るであろう機能について詳しくのっている
この辺はいままでスルーしてきていたので正直自分はうまく使えていないのだが、今後も挑戦は続く 特にファイル間のジャンプは関数の参照とかで重宝するので早くマスターしたい所

まとめ

この本を読んで作業が物凄く捗るようになった。というか楽しくなった
編集する前に編集を組み立てる時間みたいのができた。それがうまくいったときの爽快感がなんとも言えない
それは一見時間の無駄に感じるかもしれないが、クラスやメソッドを新規で書いてる時に処理の重複とか実行時の効率とか考えないでコーディングしますか?と
編集の効率化を考えることは、結局は生産性の向上に繋がるという点、普段から"同じことを二度しない"、”余分なことをしない”思考を作るトレーニングを兼ねるという点でいいと思った

最低限のコマンドの説明とかは一切ないのでvim使いはじめの人にはきついかもしれないが、ひと通り使える人なら是非読んでほしい

実践Vim 思考のスピードで編集しよう!

実践Vim 思考のスピードで編集しよう!

FuelPHPを試してみる

PHP始める宣言をしてみたので手始めにFuelPHPを試してみる

FuelPHPとは

f:id:syguer:20131119235625p:plain

日本版公式

特徴として以下の様なものが挙げられている

  • An (H)MVC framework
    MVCを通り越してHMVCのフレームワークらしい
    HMVCってなにさ?と思ってぐぐってみたところ、Hierarchical Model View Controllerの略らしい
    日本語訳的には階層化されたMVCとか。日本語ドキュメント少ないから新しい概念なのかな
    ここ見た感じだと、現在の一般的なMVCフレームワークではリクエストに対してControllerを呼び出して…ってところの処理をフレームワークのルーターが担当するけど、それを自分でできる感じらしい
    「それだけじゃないぜ!俺達はそれに加えてviewmodelも提供するぜ!」とも言ってる
    この辺はよく知らんので面白そう

  • Modular and extendable to a fault
    coreパッケージのクラスのほとんどが容易に拡張可能とのこと

  • Oil: the power of the command line
    Railsでお馴染みのScaffoldが使えるとのこと
    ORMもついてるようで、もはやこの辺は用意してて当然のスタンスですね

インストール

以下のコマンドでコマンドラインツールのoilがインストールされる

$ curl get.fuelphp.com/oil | sh

createでアプリ作成

$ oil create hoge

ここから色々パッケージ落としてきて結構時間かかる

作成の最後で警告が出た

Error - date_default_timezone_get(): It is not safe to rely on the system's timezone settings. 
You are *required* to use the date.timezone setting or the date_default_timezone_set()
 function. In case you used any of those methods and you are still getting this warning, you
 most likely misspelled the timezone identifier. We selected the timezone 'UTC' for now, but
 please set date.timezone to select your timezone. in COREPATH/classes/fuel.php on line 161

タイムゾーンUTCで指定してるから、自分のタイムゾーンにしてねって感じかな
ちなみにこのエラーは誰が出してるんだろう?とりあえずErrorといいつつインストールはコケないのでスルーする

動かしてみる

とりあえずMacにデフォルトでApacheが入っているようなので、設定を見てみると/private/etc/apache2/httpd.confが設定ファイルになっているようなので中を見てみる

DocumentRoot "/Library/WebServer/Documents"

となっているので、ここの下に置けばとりあえずアクセウできるはず
ほんとはここをアプリ置いてあるとことかにすればいいと思うけど、とりあえずこのままで

ブラウザでアクセスしてみると、

f:id:syguer:20131120005533p:plain

こいつはさっきインストールの時にでてたやつじゃねーか。。まんどくせ

さっきoilコマンドで作ったディレクトリは以下のようになっていると思う

.
├── CHANGELOG.md
├── CONTRIBUTING.md
├── LICENSE.md
├── README.md
├── TESTING.md
├── composer.json
├── composer.lock
├── composer.phar
├── docs
│   ├── assets
│   ├── classes
│   ├── contribute.html
│   ├── credits.html
│   ├── favicon.ico
│   ├── favicon.png
│   ├── general
│   ├── index.html
│   ├── installation
│   ├── license.html
│   ├── packages
│   ├── requirements.html
│   ├── templates
│   ├── toc.html
│   └── vendor
├── fuel
│   ├── LICENSE
│   ├── app
│   ├── core
│   ├── packages
│   └── vendor
├── oil
└── public
    ├── assets
    ├── index.php
    └── web.config

ここのfuelの下をたどっていって、fuel/core/config/config.phpを開き、118行目を以下のように書き換える

'default_timezone'   => null, #before
'default_timezone'   => 'Asia/Tokyo', #after

これで改めてアクセスしてみる

f:id:syguer:20131120010253p:plain

うまくいったようだ

今日のまとめ

意外とデモページにアクセスするのも苦労してしまった
コンフィグいじる場所探してる過程で、Ruby慣れしてるせいで触ったとこの行末セミコロン忘れててだいぶハマったりね
次は付属ORMでもいじってみる

認定スクラムマスター(CSM)を取得した

認定スクラムマスターの資格を取得しました

認定スクラムマスター(CSM)って?

ScrumAllianceが認定してる資格の一つ
僕も勘違いしてたんだけど、スクラムにはスクラムマスターというロールがあって、そのロールをこなすための知識を認定しているのがCSM
決してあなたはスクラムをマスターしていますって認定している訳ではない
(とはいえスクラムマスターの役目を果たすにはスクラムのことを正しく理解し、説明することが必要なのだが)

どうすれば取得できる?

まず、ScrumAllianceのCSM研修を受ける
研修を受けるとオンライン試験を受ける資格がもらえるので、オンライン試験を受けてパスすれば認定してもらえる
結構割高なので、若手が実費で参加するのは結構きついかも
あとかなり人気があるらしく、早めに予約しないと埋まってしまう。僕もキャンセル待ちだった

研修について

研修は2日間で、基礎から学ぶ
どこまで買いていいのかわからんので内容については割愛
個人的には参加者の方の中で何人か仲良くなって、今後も付き合いありそうな感じで良かったなーと思ってます

研修に参加して

正しい、教科書通りのスクラムを知れば知るほど、現実世界に適応させるのは難しいと思った
なぜかというと、日本企業の制度がスクラムとは著しく剥離しているから
とはいえどんな開発プロセスだって現実世界では教科書通りとはいかず、企業ごと、あるいはプロジェクトごとに何らかの変化をさせて対応しているはず
なので、スクラムも目的や原理を失わない程度に、環境に合わせて変化させる必要がある
スクラムマスターの責務は正しいスクラムを振り回すことではなくて、どうやったら自分の環境でスクラムが目指す「自律的な組織」を実現させるかを考えて実行することであると感じた

僕が今いるチームもスクラム風味の開発をしているが、色々と問題点は多い(それが必ずしも開発プロセスの問題であるというわけではないが)
まず、目の前の今のチームで改善できることを改善するところから始めようと思う

PHPを始めてみた

PHPを始めようと思い、環境作りを色々調べてみたので備忘録

なんで今更PHP

うちのサービスでサポートしてる言語の中で、僕が一番触ったことない言語がPHPだなーとはなんとなく思っていた。
そんな中、最近色々調べ物とかしてるとPHPの話に触れている記事を目にすることがちょくちょくあり、その中でPHPの特徴として「作るまでが早いけどコードが汚い」みたいなのがあった。なんとなく自分の性格と相性がいいのでは?と思い改めて触ってみることに。

入れたもの

とはいえ大したことはしてない。
composerとvimの設定のみ

composerについて

Rubyでいうgem、Nodeでいうnpm
依存ファイルをjsonで書くからそのどちらかならnpmっぽいかな
それよりcomposerのいいとこは、composerで入れたパッケージはコード内で

require 'vendor/autoload.php';

と書いとけば使うときに勝手に読み込んでくれるってところ
requireしてなくてどうこうみたいなことにならないのはちょっぴり嬉しいね

この辺を参考にインストールした

$ curl -sS https://getcomposer.org/installer | php                                                                         [/Users/keisuke]
#!/usr/bin/env php
All settings correct for using Composer
Downloading...

Composer successfully installed to: /Users/keisuke/composer.phar
Use it: php composer.phar

$ sudo mv composer.phar /usr/local/bin/composer

homebrewも使えるみたいだけど普通にglobalインストールしちゃいました

試しにcomposerと打ってみる

$ composer                                                                                                                 [/Users/keisuke]
   ______
  / ____/___  ____ ___  ____  ____  ________  _____
 / /   / __ \/ __ `__ \/ __ \/ __ \/ ___/ _ \/ ___/
/ /___/ /_/ / / / / / / /_/ / /_/ (__  )  __/ /
\____/\____/_/ /_/ /_/ .___/\____/____/\___/_/
                    /_/
Composer version a045ab345980bfe4a1daec1a34d345f13a2810dc 2013-11-06 22:13:14

Usage:
  [options] command [arguments]

Options:
  --help           -h Display this help message.
  --quiet          -q Do not output any message.
  --verbose        -v|vv|vvv Increase the verbosity of messages: 1 for normal output, 2 for more verbose output and 3 for debug
  --version        -V Display this application version.
  --ansi              Force ANSI output.
  --no-ansi           Disable ANSI output.
  --no-interaction -n Do not ask any interactive question.
  --profile           Display timing and memory usage information
  --working-dir    -d If specified, use the given directory as working directory.

Available commands:
  about            Short information about Composer
  archive          Create an archive of this composer package
  config           Set config options
  create-project   Create new project from a package into given directory.
  depends          Shows which packages depend on the given package
  diagnose         Diagnoses the system to identify common errors.
  dump-autoload    Dumps the autoloader
  dumpautoload     Dumps the autoloader
  global           Allows running commands in the global composer dir ($COMPOSER_HOME).
  help             Displays help for a command
  init             Creates a basic composer.json file in current directory.
  install          Installs the project dependencies from the composer.lock file if present, or falls back on the composer.json.
  licenses         Show information about licenses of dependencies
  list             Lists commands
  require          Adds required packages to your composer.json and installs them
  run-script       Run the scripts defined in composer.json.
  search           Search for packages
  self-update      Updates composer.phar to the latest version.
  selfupdate       Updates composer.phar to the latest version.
  show             Show information about packages
  status           Show a list of locally modified packages
  update           Updates your dependencies to the latest version according to composer.json, and updates the composer.lock file.
  validate         Validates a composer.json
[keisuke@localhost]$ composer about                                                                                                           [/Users/keisuke]
Composer - Package Management for PHP
Composer is a dependency manager tracking local dependencies of your projects and libraries.
See http://getcomposer.org/ for more information.

ちゃんと動いてるね

vimの設定

ざっと調べてみたけど他の言語と違ってgithubにライブラリとか置いてる空気じゃなくて手動で辞書をどっかからもってきて、自動補完できるようにするといいよって感じっぽい
僕は手動で辞書を作る方法を選んだ。phpのコマンドで作るっぽい

$ php -r '$f=get_defined_functions();echo join("\n",$f["internal"]);'|sort > ~/.vim/dict/php.dict

これ最初にやった時~/.vim/dictがないって怒られたから、mkdirで.vim/dict作った
.vimrcに下記追加

autocmd FileType php,ctp :set dictionary=~/.vim/dict/php.dict

これでneocoplcacheとかが動いてれば自動で補完される

この後

とりあえずフレームワークが色々あるっぽいのでひと通り触ってみて良さげなのを見つけたいってのと、PHPテストフレームワークを覚えなきゃね
ぱっと見た感じ比較的新しいフレームワークであるfuelPHPがきになる。テストはPHPUnitが一番ドキュメント充実してそうだからそこからかな。spec系使いたかったけど残念