railsなしのwebアプリ開発 (2) アプリケーションサーバ

アプリケーションサーバについて。

たしかrackを使うはずなので、rackについて調べる。

やることはみっつ。

これでrackupコマンドでアプリケーションサーバが起動する。

$ bundle exec rackup
[2018-09-04 17:42:40] INFO  WEBrick 1.4.2
[2018-09-04 17:42:40] INFO  ruby 2.5.1 (2018-03-29) [x86_64-darwin17]
[2018-09-04 17:42:40] INFO  WEBrick::HTTPServer#start: pid=5268 port=9292

WEBrickって見覚えあるけどrackに入ってるやつだったのか。

ログにあるとおり9292番ポートで待ち受けているので、http://localhost:9292 にアクセスするとページが表示される。

railsなしのwebアプリ開発

いきなりRailsから触り始めたのでアプリケーションサーバとかRailsがいい感じにやってくれてることがよくわかってない。 一度基本に立ち返ってみる。

  • アプリケーションサーバ
    • これはrackを使うのだろう。
  • DB接続
    • mysql2を使う?
  • テンプレートエンジン
    • わからない
  • ルーティング
    • わからない

まずはアプリケーションサーバから確認していく。

browserifyを試す

とある案件でJavaScriptでブラウザ判別をする必要があり、それではとwoothee-jsを使った。1ファイルにまとまってるファイルがあったので今回はそれを使ったけど、npmのパッケージが用意されてるのでbrowserify使ったらどうなんだろうと思って試してみた。

まずは公式サイトを参考に進めてみる。

http://browserify.org/

作業

インストール。

$ npm install -g browserify

browserify コマンドが使えるようになった。

$ browserify
Usage: browserify [entry files] {OPTIONS}

〜略〜

とりあえず作業ディレクトリを作って

$ mkdir -p ~/dev/labo/browserify/hello-browserify
$ cd $_

npmパッケージをインストール。

$ npm install woothee

main.js を記述。

var woothee = require('woothee');

woothee.parse('Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 6.1; Trident/4.0)');

ビルド。

$ browserify main.js -o bundle.js

コードがライブラリと実装コード含めて bundle.js にまとまった。 これを <script src="bundle.js"></script> のように読み込めばブラウザで動くはず。

まとめ

  • 分かったこと
  • 分からないこと
    • require という関数は何なのか
    • require 関数がnpmパッケージを検索する手順

感想

node.jsとかnpmとかの理解が全然足りてないが、JSのパッケージ管理についてとっかかりがつかめた気がする。 次はrequrejsについて調べてみたい。

第2回関西ソーシャルゲーム勉強会に参加しました

参加してきました。
http://atnd.org/events/32096

迷子になってなかなか会場にたどり着けなくて思いっきり遅刻しました。大阪駅周辺はほんとダンジョンです。

後半の二つの発表を聴けました。

Varnish導入事例

varnishは設定を専用の言語で書いてC言語に変換してコンパイルして.soにして読ませるっていう変態的なことをするらしくて、ちょっとおもしろそうでした。設定間違いをコンパイル時に検出できるっていうのは利点だなと。

PHPerなら絶対に知っておきたい3つのソーシャルゲーム開発テクニック

APCの設定でapc_stat=0にしてメンテタイムを短縮するっていうのは目から鱗でした。
Jenkinsは、まあですよねーという感じでした。しかしやっぱり導入が難しいというか、めんどくさい…。
その点、お菓子駆動開発は導入が簡単ということで、やってみたいです、はい。

感想

ネットで見かける情報はほとんどが東京のものばかりですが、関西にもソーシャルアプリとかやってる人たちがいっぱいいるんだなーと思いました。横のつながりとか、助け合いとかして連携してみんな幸せになれたらいいなー。

Twitter見ると前半のAzure発表がおもしろかったらしくて、遅刻して聴けなくてざんねんでした。
ぶっちゃけAzureはスルーしてたんですが(すいません!)、いただいた資料を見るとすごいいい感じで、導入事例もいっぱいあるし、なんか申し訳ないくらいの手厚いサポートとUIのわかりやすさでちょっと試してみたくなりました。こんど会社で提案してみようかなー、と。

サイバーエージェントの会場はきれいで広くて、とてもよかったです。無線LANも完備だし。窓からの景色も最高でした。写真撮れば良かった。
しかし、こんどこの会場で行われる関西PHP勉強会で発表するんですが、ここで話すのかと思うと、震えますね、、。

第4回関西PHP勉強会
http://atnd.org/events/32233

Re: CakePHP 2.x系の更新時のSQL発行回数を減らしたい

http://damepg.hatenablog.com/entry/2012/09/08/134126

ちょうど最近同じことやってました。
僕の場合は、updateAll()で対応しました。

元エントリの例にならうと、こんなかんじ。

<?php

public function addPoint($user_id, $point) {
    $ret = $this->updateAll(
    	array('point' => $this->escapeField('point') . ' + ' . $this->getDatasource()->value($point)),
    	array('id' => $user_id)
    );
    if ($ret === false) {
        // エラー処理
    }
    if ($this->getAffectedRows() == 0) {
        // エラー処理
    }
}

発行されるSQLはこんなかんじ。

UPDATE `sample`.`users` AS `User`  SET `User`.`point` = `User`.`point` + 10  WHERE `id` = 1

updateAll()使う利点としては、

  • aliasなど、モデルの設定の恩恵を受けられる
  • 検索条件がfindと同じ形式で設定できる

いっぽう欠点としては、

  • setするフィールド値のエスケープがめんどくさい

というところかなぁ、と思います。

あと書いてて気付きましたが、どちらの方法もmodifiedが自動更新されないのできちんと指定してやらないといけないんですね。

参考:
"updateAll" フォーラム - CakePHP Users in Japan
Ceatant Official Blog - CakePHPでupdateAllを使うとmodifiedを自動で更新してくれない

Cookbook のコミッタになりました

昨日から、Cookbookのコミッタになりました。
もうちょっと正確に言うと、cakephp/docsリポジトリへのコミット権を与えられました。
具体的には、リポジトリに直接コミットしたり、pull requestをマージしたりできるみたいです。

Cookbookのコミッタなので、CakePHP本体にコミットしたりとかはできないです。
なので「CakePHPのコミッタ」というわけではないです。

いつものように息抜きにぼんやりGithubにアクセスしたら、「You’ve been added to the cakephp organization!」て表示があって???てなりながらリンクたどったらcakephpのページに自分の名前があってマジビビりました。
あとでメール確認したら、コミッタのMark Storyさんから「追加しといたから!」的なメールが来てました。

僕のコミットはtypoの修正がほとんどで、それに比べたら他の人たちの方がすごい量の翻訳しまくったりしてるので、なんで自分が?という気がしなくもないですが、ともあれ微力ながらも自分のやったことが認められたようでうれしいです。

今後も特にやること自体は変わらないと思うので、地道に着実に作業を進めていければいいなーと思います。