徳丸本の環境をMacのVirtualBoxで構築する

第2版が出るらしいので、もうこの記事は不要かと思います

会社で徳丸本こと体系的に学ぶ安全なWebアプリケーションの作り方の読書会が始まったのだけど、環境構築手順がWindows向けだったのでMac向けの構築の際に行ったことをメモ。

VirtualBoxのインストール

自分の環境はすでに入っていたのでスキップ。入れてない人は VirtualBoxのダウンロードページ からダウンロードしてインストールしてください。

VMイメージをローカルに展開

紙の本で買った人はCD-ROMから、pdf版買った人はダウンロードして何処かに展開。~/work/WASBOOK/以下に配置したことにします。

VM作成

VirtualBoxの画面から新規をクリックし、名前:任意(WASBOOKとでもしておきます)、タイプ:Linux、バージョン:UbuntuとしてVMを作成します。

f:id:tarhashi:20130601150855p:plain

メモリは512MBぐらいにしておきます。

f:id:tarhashi:20130601150937p:plain

VirtualBoxでもVMWareのイメージが使えるので先ほど保存したファイルに含まれるwasbook.vmdkをそのまま使ってしまいます。

f:id:tarhashi:20130601151005p:plain

そのまま完了まで進めて、VMの作成は完了。

ネットワーク設定(ホスト側)

まだあまり本を読み進められてないけど外部に接続する必要は多分無いので、ホストオンリーネットワークで構築していくことにします。 VirtualBox -> 環境設定 からネットワークを開き、ホストオンリーネットワークを作成。192.168.56.1としておきます。DHCPサーバは今回の構成では使わないので設定しなくてOK。

f:id:tarhashi:20130601151504p:plain

ネットワーク設定(ゲスト側)

先ほど作成したVM(WASBOOK)の設定を開き、ネットワークのアダプタ−1をホストオンリーアダプターに変更。また、先ほど作成したホストオンリーネットワークを選択(今回はvboxnet1)。

f:id:tarhashi:20130601151808p:plain

VMを起動し、ネットワーク設定を修正

とりあえずVMを起動します・・・が、このままでは使えないのでゲストの設定を修正していきます。ひとまずrootでログインし、ifconfigを確認。

f:id:tarhashi:20130601152151p:plain

ここからネットワークを直していきます。

# vi /etc/network/interfaces

最初、

auto lo
iface lo inet loopback

auto eth0
iface eth0 inet dhcp

となっているので、以下のように修正。

auto lo
iface lo inet loopback

auto eth1
iface eth1 inet static
address 192.168.56.101
netmask 255.255.255.0
gateway 192.168.56.1

設定変更を反映させるため、networkを再起動。

# /etc/init.d/networking restart

pingが通るか確認しておきます。ゲスト側から

# ping 192.168.56.1

ホスト側から

$ ping 192.168.56.101

として、どちらも通っていればOK。

ホスト側のhostsへ追加

$ sudo -e /etc/hosts

# 次の行を追加
192.168.56.101 example.jp trap.example.com

追記後、ブラウザからhttp://example.jphttp://trap.example.comを開き、アクセスできればネットワーク設定は完了。

Fiddlerの代わりに使うもの

Fiddlerを使って進めていくことになってますが、この代わりに使うものを何にするのがよさそうかはまだ検証中。ひとまず、Firefox + Tamper Dataあたりがリクエスト、レスポンスの確認+改ざんが楽にできるかな?というあたり。もしくはWireSharkでやってしまう?しかしちょっと手軽さに欠けるか?

ナビプラス株式会社に転職しました

4/30付で鈴与シンワート株式会社を退職し、5/1付でナビプラス株式会社に入社しました。

鈴与シンワートってどこだよって感じの会社ですが、清水エスパルスのスポンサーロゴでおなじみの鈴与グループのシステム会社です。 鈴与シンワートの同じチームの方々とは今は亡きワイズノット時代から一緒に渡り歩いてきた関係で、長い間大変お世話になりました。

ナビプラスはEC向けレコメンドエンジンなどを提供している会社で、長年慣れ親しんだ?PHPから離れ、Rails中心の開発を行なっていく予定です。 PHPのプロダクトもあるのでそっちも触るかもしれないけどね。 開発、運用、パフォーマンスチューニング等これまでよりも幅広い能力が求められそうな環境なので、日々勉強です。 新しい環境で揉まれて並のエンジニアからわりとすげーエンジニアぐらいまでレベルアップを目指したいと思います。

それでは今後とも宜しくお願いします。

Play2.0で書いたサンプルを2.1対応にしてみる

Play2.1が出たので、試しに以前書いたサンプルマイグレーションガイドを見ながら2.1対応にしてみた。

https://github.com/tarhashi/Play-AngularJS-Sample/tree/2.1

project/plugins.sbtを修正

addSbtPlugin("play" % "sbt-plugin" % "2.1.0")

mainを修正

project/Build.scalaにimportを追加

import play.Project._

play.Projectへの修正と、mainLangパラメータの削除。JavaScalaかはappDependenciesにjavaCoreが入ってるかどうかで判別するようだ。

val main = play.Project(apName, appVersion, appDependencies).settings(
//...
)

sbtのバージョンを修正

project/build.propertiesを修正

sbt.version=0.12.2

ここまでやったところで、マイグレーションの通り以下を実行。

play clean
play ~run

すると、以下のエラーが出た。

[error] (*:update) sbt.ResolveException: unresolved dependency: org.squeryl#squeryl_2.10;0.9.5-2: not found
[error] unresolved dependency: com.github.tototoshi#lift-json-play-module_2.10;0.1: not found

ここからはプロジェクト独自の修正がメイン。

squerylのバージョンを変更

project/Build.scalaを修正して対応したバージョンにする。

val appDependencies = Seq(
    "org.squeryl" %% "squeryl" % "0.9.5-6"
)

//...
libraryDependencies ++= Seq(
//...
"org.squeryl" %% "squeryl" % "0.9.5-6"
)

appDependenciesにjdbcを追加

次に、object db is not a member of package play.apiとエラーが出たのだが、appDependenciesにjdbcを追加すればいいようなので追加。

val appDependencies = Seq(
    jdbc,
    "org.squeryl" %% "squeryl" % "0.9.5-6"
)

lift-json-play-moduleの部分の対応

Jsonの処理についてはPlayのJsonモジュールに書き換えて対応してみた。でもlift-jsonの方がいいような気がしなくもない。

ここまでやったところで、とりあえず見た感じ動作するようになったので終了。

サクラエディタでもCDイジェクトがしたい

vimやIE、ChromeでCDイジェクトできるなら、サクラエディタでだってCDイジェクトしたくなりませんか?私はなりません!しかしサクラエディタならJScriptVBScriptでマクロを書くことができますので、以下のスクリプトをマクロとして登録することにより、いつでもCDを取り出すことができるようになります。(Windows7にて動作確認)

tarhashi/cd_eject.js

Zend Framework 1.12.0で最も長いクラス名を探してみる

これはZend Framework Advent Calendar19日目の記事でもなんでもありませんし、開催されてるのかも知りません。

ここ1ヶ月半ぐらい仕事で久しぶりにZend Framework1系を使ってますけど、PHP5.2時代に擬似namespaceを実現したようなクラス名の命名規約になっていてとにかくクラス名が長いのが気になる。そんな中でもいったいどのクラスが一番長いか探しだしてみた。焼酎お湯割り数杯が入った状態で書いてるので何か間違ってるかもしれませんがあまり気にしないでください。

<?php

$path = '/path/to/ZendFramework-1.12.0/library/';

$max = 0;
$maxName = '';
foreach(new RecursiveIteratorIterator(new RecursiveDirectoryIterator($path)) as $file) {
    if (strpos($file->getPathname(), '.php') === false) continue;
    $className = str_replace(array($path, '.php', '/'),
        array('', '', '_'), $file->getPathname());
    if (strlen($className) > $max) {
        $max = strlen($className);
        $maxName = $className;
    }
}
echo 'className: ', $maxName, ' length: ', $max, "¥n";

実行してみると、以下のクラス名が得られました。

className: Zend_Service_DeveloperGarden_Response_ConferenceCall_AddConferenceTemplateParticipantResponseType length: 97

Zend_Service_DeveloperGarden_Response_ConferenceCall_AddConferenceTemplateParticipantResponseType、なんと97文字。ちなみにZend Framework1系のコーディング規約では1行の長さは80文字以内を目指しましょう、なのですけどクラス名だけで大幅オーバー。

Zend Framework1系は、ソースも読みやすいしまあ悪くはなかった(チューニングしないとかなり遅いけど)ですけど、そろそろ卒業してZend Framework2系(これも結構遅いらしい?)だとかSymfony2だとかに移行するといいんじゃないですかね。

MySQLとPHPで曜日の数値表現が非常に紛らわしい件

MySQLPHPで曜日の数値表現を使った処理を行ったら非常に紛らわしかったのでメモ。

MySQLの曜日関数

MySQLには日付から曜日の数値表現を求める関数が2つある。 DAYOFWEEK関数と、WEEKDAY関数である。 この2つの関数が単にエイリアスであればいいのだが、 それぞれ違う結果を返す。

DAYOFWEEK関数

まずは、DAYOFWEEK関数の結果を見てみる。

SELECT
    DAYOFWEEK('2012-12-02')
  , DAYOFWEEK('2012-12-03')
  , DAYOFWEEK('2012-12-04')
  , DAYOFWEEK('2012-12-05')
  , DAYOFWEEK('2012-12-06')
  , DAYOFWEEK('2012-12-07')
  , DAYOFWEEK('2012-12-08')
\G

上記のSQL実行すると、結果は以下のようになる。

*************************** 1. row ***************************
DAYOFWEEK('2012-12-02'): 1
DAYOFWEEK('2012-12-03'): 2
DAYOFWEEK('2012-12-04'): 3
DAYOFWEEK('2012-12-05'): 4
DAYOFWEEK('2012-12-06'): 5
DAYOFWEEK('2012-12-07'): 6
DAYOFWEEK('2012-12-08'): 7
1 row in set (0.00 sec)

2012-12-02が日曜日なので、日曜日スタートで1から始まり、土曜日が7で終了、という形式である。

WEEKDAY関数

次に、WEEKDAY関数の結果を見てみる。

SELECT
    WEEKDAY('2012-12-02')
  , WEEKDAY('2012-12-03')
  , WEEKDAY('2012-12-04')
  , WEEKDAY('2012-12-05')
  , WEEKDAY('2012-12-06')
  , WEEKDAY('2012-12-07')
  , WEEKDAY('2012-12-08')
\G

こちらを実行すると、次のような結果を得られる。

*************************** 1. row ***************************
WEEKDAY('2012-12-02'): 6
WEEKDAY('2012-12-03'): 0
WEEKDAY('2012-12-04'): 1
WEEKDAY('2012-12-05'): 2
WEEKDAY('2012-12-06'): 3
WEEKDAY('2012-12-07'): 4
WEEKDAY('2012-12-08'): 5
1 row in set (0.00 sec)

WEEKDAY関数では、月曜日スタートで0から始まり、日曜日が6で終了、という形式である。

PHPの曜日の数値表現

PHPの曜日の数値表現もフォーマット文字列'w'と'N'の2種類で得られる結果が存在する。

まずはwの結果。

<?php
for($i = 2; $i <= 8; ++$i) {
  $d = new DateTime();
  $d->setDate(2012, 12, $i);
  echo $d->format('Y-m-d'),': ',$d->format('w'),"\n";
}

上記の結果は以下のようになる。

2012-12-02: 0
2012-12-03: 1
2012-12-04: 2
2012-12-05: 3
2012-12-06: 4
2012-12-07: 5
2012-12-08: 6

次にNの結果。

<?php
for($i = 2; $i <= 8; ++$i) {
  $d = new DateTime();
  $d->setDate(2012, 12, $i);
  echo $d->format('Y-m-d'),': ',$d->format('N'),"\n";
}

上記の結果は以下のようになる。

2012-12-02: 7
2012-12-03: 1
2012-12-04: 2
2012-12-05: 3
2012-12-06: 4
2012-12-07: 5
2012-12-08: 6

MySQLと同じ形式が無い。 ということで、DAYOFWEEK関数と'w'もしくはWEEKDAY関数と'N'の組み合わせで1補正する、というように気をつける必要がある。

もしくはMySQLはDATE_FORMAT関数で%Wを指定、PHPではフォーマット文字'l'を指定してやれば'Sunday'のような文字列で一致するのでこれで扱ってやるのがいいのかもしれない…。

参考

はてなBlogのMarkdownモードがシンタックスハイライトに対応してた

最近記事を書いてなかったわけですが、久しぶりに試してみたら知らない間にシンタックスハイライトに対応してた。これはうれしいですね。

require 'redcarpet'
markdown = Redcarpet.new("Hello World!")
puts markdown.to_html