Webプログラミング学習者にとってSessionという言葉は混乱を招きます。

特定の機能の名前であるSessionと英単語としてのSession(期間)がごっちゃになるからです。

経験者はコンテキストからどういう意味でSessionと言っているのかを判断しますが、学習者には区別がつきません。

人によって、初めてSessionという単語に出会う場面が違うため、Sessionの意味を聞いても自分が出会ったSessionとは違う意味を説明されたりします。一つ一つのわからない単語を調べていく真面目な人ほど混乱してます。

Sessionクラスというのがあったとして、誰でもそれだけでは何を意味してるのかわかりません。

英単語としてのSession

まずはSessionは英単語として 期間 という意味です。プログラミングの文脈では 一つの期間 ぐらいの意味で使います。この場合は特定の何かの機能を指しているわけじゃないので、別に仕様とかもありません。

HTTP Session

HTTPクライアントがRequestを送り、HTTPサーバーが処理を行った上でResponseを返す。この一連の処理をHTTP Sessionといいます。

これのことも単にSessionという場合があります。

WebアプリのSession機能

HTTPはステートレスなプロトコルなのでWebアプリは大抵何らかの状態を保持する機能を持っています。この機能のこともSessionといいます。

この機能はPHPの様に言語が持っている場合もありますが、基本的にはライブラリ・フレームワークがそれぞれ独自のものを持っています。(rubyだとrack)

このSession機能は内容の保存方法・場所を選べ、サーバーのファイルに保存したり、データベースに保存したり色々です。

特にこの保存場所がCookieであることがあるので、学習者の混乱は加速します😅

学習者としての覚え方

そのSessionが指しているのがHTTP SessionかWebアプリのSession機能なのかをまずコンテキストから判断しましょう。それ以外だったら大抵は英単語としてのSessionです。

ログイン処理のコードレビューにおいて、認証部分が自作されていて、md5をつかっていたので、なぜ自作するのか?なぜmd5を使うのか?という点について議論になりました。

  • CodeIgniter-Ion-Authを使う
  • blowfishを使う(phpならpassword_hash関数、PASSWORD_BCRYPTオプションが良さそう)

僕は自前認証かつmd5を使う意味がわからなかったのでちょっと辛辣な表現になってしまいました。(その方が安全で楽なのに何故しないのか?的な)

ちょっと揉めてしまいまして、

「中途半端に(その実装を)採用しちゃったせいで、なんかあったら駒形さん直してくれんの?土日でも対応してくれんの?」

という感じになり、最終的には、

「レビューはあくまで"サジェスト"に留めて欲しい。」

ということになりました。コードレビューにおいて、

「ここはAAAではまずいのでBBBにすべきです。」

ではなく、

「ここはAAAよりよいBBBというやり方がありますよ。採用するかしないかは…アナタ次第です m9」

という感じですね。

https://gyazo.com/e00a80de33754a6f65c5a1c11ee15851

ホント レガシー改善は地獄だぜ

関連:レガシーPHP改善日記シリーズ

今日、案件が終了したのでお仕事を探しております。

二文字で表現すると無職です。😢

ここ数年のお仕事戦略の変遷

  1. rails案件がやりたい期
  2. iOS案件がやりたい期
  3. レガシーPHP改善期
    レガシーPHP改善日記シリーズ - komagataのブログ
  4. インターナショナルな案件やりたい期
    東京にいながらにしてインターナショナルな環境でプログラマー(Rubyist)として働くというお話 - 僕は発展途上技術者
  5. ペアプロ期
    ペアプログラミングのコツ - komagataのブログ
  6. リモート期

直近のお仕事

今日終わったお仕事も週3日でリモートでのお仕事でした。

フルリモートだと何やってるのかわからなくなりがちですが、毎朝ハングアウト朝会をやってたので生活リズムも崩れず、何やってるのかわからなくならずによかったです。

探したいお仕事

直近と同じようにリモートがいいなと思っています。

僕は自社オフィスに通ってお客様の作業を行いますが、自転車で30分という僕にとってベストな距離なのでとても快適です。普段自転車だと通勤ラッシュが余計に辛い…。

また、週2日は自社サービスに確保しているので週3日までがありがたいです。

得意な仕事とやりたい仕事

得意な仕事

やりたい仕事

  • golang(めちゃ速そうなので)
  • Swift(怖話iOS版を書き直してるので)
  • Android(怖版Android版に役立つ)
  • ReactなどのやったことないJSフレームワーク= Angular1.x、Vue、Backbone、Marionette、Knockout、Polymer以外(勉強になるので)
  • rails(自分にとっては楽なので)

もしお仕事ご存知の方がいらっしゃったらこのブログのコメント欄はつかいづらいので @komagata 等他の方法で連絡いただけるとありがたいです。 🙇🏻

7月15日追記:ご連絡くださった方々ありがとうございます。直近のお仕事は決まりました。今後別の機会があれば宜しくお願い致します。 🙇🏻

あるGithubのPRスレッドにて。

AAA merged.

komagata said:

@AAA レビュー無しのマージはまずいとおもいますー

AAA said:

@komagata ある程度、初めの形ができあがるまではレビュー無しで行きます。
そうしないと全く前に進まないので。

ある程度の二度手間が発生するのは承知してます。
一番最初から全員が完全に合意してい、100%ものを作成するのは不可能だと思います。
時間がかかり過ぎます。
話し合いでだけで延々と時間が過ぎていき、全員の考えが合致することは永遠にないと思います。

リファクタリングフェーズに入りましたら、レビューしながらソース改善していく予定です。

komagata said:

@AAA レビュー無しで行くというのはチームの皆さん合意の上の話ですか?

全員の合意は要らないですが、作った人以外の誰かが最低レビューするというのは一般的なやり方だと思いましたので。

CC @BBB

AAA said:

@komagaga 現在、チームは私とCCCさんの二人ですが、
CCCさんの了解はとっています。

今は進めて形にするのを優先したいです。

https://gyazo.com/cba99bde225ddc988300ba5bcc982f60

たざわ「あ〜!
コードレビューの火がきえた〜!!」

関連:レガシーPHP改善日記シリーズ

前回からだいぶ間が開いてしまいましたが進捗報告です。

Vagrant + Ansibleで開発環境作成

作りました。Windows・Macで自分のローカル上で開発できます。しかし、まだ皆さんこの環境上での開発に移行できていません。要トレーニングです。

Github利用

Github使えるようにしました。しかし前述のローカル開発環境に移行できないのでやっぱり以前のsvnでの開発が続いてしまっています。要布教・トレーニング。

自動テスト

phpunit + seleniumでテストのサンプルを作りました。しかし前述のローカル(略)

フレームワーク

次期フレームワーク選定を社内の小さなアプリ開発を通して行っています。Laravel5を試していますが良さ気です。ORM, Migration, gulp, scssとデフォルトでてんこ盛りなので最近の作法を覚えるのにちょうど良いのではないかと思います。

インフラ

現在はマネージドサーバーなのでLinuxを管理してないですが、パブリッククラウドに移行予定です。それには社内にLinuxが分かる人が(俺以外に)1人は必要なので採用を進めています。

感想

皆さん日々の業務の締め切りが当然あるので環境改善ばかりやってるわけにはいかず、なかなか進みません。gitへ移行したけど次の週にはsvnに戻ってたり。しかし少しづつですが確実に進歩しています。根気強く布教・メリット説明・トレーニングを続けていってレガシーPHP駆逐を目指します。

関連:レガシーPHP改善日記シリーズ

phpenv + php-buildよりphpbrewの方が良さそうです。(rbenvとぶつかる)

インストール

wgetはcomposerのインストールに必要。

$ brew install automake autoconf curl pcre re2c mhash libtool icu4c gettext jpeg libxml2 mcrypt gmp libevent wget
$ brew link icu4c --force

ふむふむ。

$ curl -L -O https://github.com/phpbrew/phpbrew/raw/master/phpbrew
$ chmod +x phpbrew
$ sudo mv phpbrew /usr/bin/phpbrew
$ phpbrew init
$ echo "source ~/.phpbrew/bashrc" >> ~/.zshrc
$ phpbrew lookup-prefix homebrew
$ sudo phpbrew install -j `sysctl -n hw.ncpu` 5.6.8 +default+mysql+apxs2
$ phpbrew --version   
phpbrew - 1.18.5
cliframework core: 1.10.0
$ phpbrew switch php-5.6.8
$ php -v
PHP 5.6.8 (cli) (built: May 12 2015 17:33:22) 
Copyright (c) 1997-2015 The PHP Group
Zend Engine v2.6.0, Copyright (c) 1998-2015 Zend Technologies

composerとphpunitインストール。さりげ嬉しい。

$ phpbrew install-composer
$ phpbrew install-phpunit

レガシーがらみで気になったのでサポートに聞いてみた。

マネージドサーバーHDDプランの契約を検討しております。

PHPのバージョンが4.4, 5.2~5.4となっていますが、これはどの5系の場合はどのバージョンになるのでしょうか?

現在PHP公式では5.4未満はサポートが行われていません。 セキュリティパッチなどは御社が独自に提供していただけるのでしょうか。

以下、サポートからの返答。

この度は弊社サービスをご検討いただき、ありがとうございます。

PHPのバージョンは4.4、5.2~5.4の中から任意にお選びいただけます。特に お客様にて設定が行われなかった場合は5.4が適用されます。

セキュリティパッチについては弊社にて独自に作成し、対応を行っております。 ご安心ください。

ご不明な点やご質問等ございましたら、本メール返信にてお問い合わせ ください。

今後ともさくらインターネットをよろしくお願いいたします。

公式のサポートが切れているPHPのバージョンにもセキュリティパッチを当て続けている!?

第89回 PHP勉強会@東京に行ってMac・Windows共通のPHP開発環境 // Speaker DeckというLTをさせていただきました。

会場は株式会社リジョブさんの咲くらぼというスペース。人工芝に座って人工桜を見ながらビール飲んで勉強会とか最高かよ。

咲くらぼ TECH 勉強会サポート | 咲くらぼTECHブログ - 株式会社リジョブ

また、じゃんけん大会でLaravelエキスパート養成読本をいただきました。ありがとうございます。

LT内容を箇条書きにまとめるとこんな感じです。

  • レガシーPHP改善はまずは共通開発サーバーの撤廃からはじめるとよい。
  • WindowsでのPHP開発環境をMac上のVirtualBox内のWindowsでサクッとできるとか思うなよ。
  • shin x blogは神。
  • ansibleはlocalで使え。
  • VirtualDocumentRoot + PHPには罠がある。
  • xip.ioを活用せよ。
  • chocolateyは神ツール。

足ばやになってしまった質疑応答に対する補足。

Q. AnsibleはWindows対応してなかったっけ?

A. provision対象としてはサポートしてるけど、clientの実行マシンとしてはサポートしてません。

Installation — Ansible Documentation

Currently Ansible can be run from any machine with Python 2.6 or 2.7 installed (Windows isn’t supported for the control machine).

Q. Windows対応してないなら何でAnsible?chef-zeroは?

A. ごもっとも。chefは個人的にキモい(ネーミングとかberkshelfとか)。私がruby好きなのでrubyで何でもできるchefをPHPの会社に導入するとやり過ぎてしまうのが怖かった(vagrantはいいのかよ > 俺)。など。後は小規模ではchef-zeroよりansibleの方がシンプルで覚えるのも簡単だと思う。

私の構成管理ツールについての苦悩のエントリーはこちら

構成管理ツールについて - komagata

Q. 技術的な内容ばかりだけど、レガシーPHP改善は「このままでいいや」というみんなのマインドセットを変えることの方が重要なのでは?何か工夫していることは?

A. おっしゃるとおり。答えは例えばみんなを誘ってPHP勉強会に来る、発表する。(3人来ていただけました。ありがとうございます!先月はボッチで行った!)

レガシーPHP改善日記 シーズン2 エピソード1 - komagata

流行りの環境うんぬんは単なる手段であり、"経営陣を含めたマインドセットの更新が大事"ってのはありますが、そんな話みんな読みたくないでしょ?

エピソード1ではこんなこと言ってますがちょっとだけ・・・。

プレスコットのピクルス原理

「漬け水がキュウリに漬かるよりは、キュウリが漬け水に 漬かるほうが早い。」これは、「長いものには巻かれろ」という 世渡り術指南の、ちょうど逆を意味する。 すなわち、大きな仕組みに影響を与えようとして、 接触を続けている小さな個(自分)は、結果として、むしろ自分のほうが変えられてしまう可能性が高い、ということを警告している。

ピクルス原理によれば私が一人息巻いて乗り込んだところでレガシーPHPシステムは変わりません。むしろこっちがレガシー寄りになる。

シーズン1からお読みの方はご存知の通り、レガシーPHP改善にとってPHPコミュニティーと会社をつなげることは既定路線であり、必須のメソッドです。

今回は内容をブログに書くということも了承を得てからお仕事を受けています。(ほう、経験が生きたな

ピクルスを漬けている瓶に穴を開ける。そしてPHPコミュニティーという大きなプールにピクルスの瓶ごと突き落とす。そして割るぐらいのことをしないとマインドセットは変わらないと思います。

逆にいえば人間はピクルス原理のように周囲の環境に急激に馴染むという性質をもっています。PHPコミュニティーという良い漬け水に浸かれば急速に周囲に馴染んでいき、良いPHPエンジニアになれると思います。(良きキュウリは別の瓶に移って行ってしまうという別の法則もありますが…)

レガシーPHP改善でうかがってはじめに取り組んだのがslackの導入です。それまでIP-Messengerやメールで密書のようなやりとりをしているところにslackを導入し、何かにつけPHP界隈の情報を流しました。

先月も今回の勉強会も1時間前まで「まだ定員に空きがあるのでお時間がある方は是非」などと「こいつウゼェ・・・」と思われても仕方ないぐらい必死の勧誘をしました。

また、今回参加された方がいたことで変化に前向きな方々=心強い味方を見つけることができました。そういった方々に協力をおねがいして、参加できない方も巻き込むために社内で開催するぐらいの勢いでやる必要があります。

今回唯一の誤算はレガシー改善はまだ途中であり、会社名は改善が成ってから公開予定だったのですが、自己紹介で「今、自己紹介されたkomagataさんと一緒にやっている(略)」と会社名が思い切りバレたことです。

そりゃあそうなるわなと思いました。何が誤算だよ > 俺

関連:レガシーPHP改善日記シリーズ

先月になりますが、PHP勉強会@東京に行ってきました。数年ぶり。

第88回 PHP勉強会@東京 - PHP勉強会@東京 | Doorkeeper

発表

Let tested using a mock with PHPUnit // Speaker Deck

phpunitは当たり前になったけどmockをもっと使おうという話。

PSR-2でLintした結果を見えるようにして、コード品質の最低限を上げる

PHP_CodeSnifferやphp-cs-fixerでPRにLint結果をコメントとして投稿する言語非依存な静的解析コマンドラッパーのSaddlerを作ったという話。

HoundCIとかはdiffのみから警告作ってるから速いのだそうです。saddlerはファイル全体を見ることで可能になるもっと詳細な静的解析を出してくれる。

Laravelの美容口コミサイトへの導入事例(スライドは未アップ)

cakephp使ってたけどlaravelで中規模サイト作ってみたらすごく良かったという話。Googleトレンドでも上昇中らしい。本ももうすぐ出るらしい。

感想

全員自己紹介のテーマが「好きなエディター」だったが、PHPStormが有料にもかかわらず圧倒的に多かった。次点でvim, sublime text2, atom, eclipseと言った感じ。(KLabでは全員にPHPStormが支給され、git clientも内蔵しているそうです。)

laravelは現状のphpフレームワークで一番良さそうに見えた。

powを別マシンから使う時に出てきたxip.ioがクッソ便利なことに今更気づいた。

% ping 192.168.0.1.xip.io
PING 192.168.0.1.xip.io (192.168.0.1): 56 data bytes

xip.ioの前にIPつけるとそのIPを返してくれる。

ってことはvagrantデフォルトの192.168.33.10を返すようにしたら便利だ。

% ping 192.168.33.10.xip.io
PING 192.168.33.10.xip.io (192.168.33.10): 56 data bytes

その前にIP以外のものを付けても同じIPを返してくれる。

% ping foo.192.168.33.10.xip.io
PING foo.192.168.33.10.xip.io (192.168.33.10): 56 data bytes

ってことは設定無しで好きなIPでVirtualDocumentRootが使えるってことだ。

Macに複数サイトに対応したPHP環境を簡単に作る - komagata