2013年12月25日水曜日

大都会に通勤して気づいた3つのこと



この記事は大都会アドベントカレンダー2013の最終日、25日目です。
昨日はkotaninさんの「ネタを用意して諦めた話」でした。

世の中は常に想定外のことが起こるという良い他山の石になりましたね。
そんな私も今日(25日)が終わるまでにこの記事を書き終えるか自信がありません。


本日は大都会岡山のお隣の独立国家福山在住の自分が1年半ほど大都会岡山に通って気付いたことをご紹介します。
(今は転職して福山のまほろば工房でエンジニアしてます。)

退職エントリはこちら >> @soudai1025、仕事辞めるってよ。

1 岡山駅前の西側がアツい!

岡山駅と言えば多くの人はTOPの桃太郎が居る東側を利用することが多いと思います。
駄菓子菓子(だがしかし)、通は西口です。
なぜ西口か…それは西側には隠れた?名所がいっぱいあるからです。
まずお食事処がアツい!

居酒屋 さくら

です。
ここの昼のランチのうどんが最強です。
日替わりランチのぶっかけうどん(温 or 冷) + 丼やカレーうどんなど毎日通っても飽きません。
他にもB食など素晴らしいお食事処が満載です。

上記のお店は岡山のピンクの本の著者で岡山Web業界の有名人、前川さんも週3で通ってた時期があるとかないとか。
前の職場は関係ありません。



そして次は勉強会が会場がアツい。
特に西口にある岡山国際交流センターでは多くの勉強会が行われます。
他にも奉還町りぶらホールなども歩いて行けます。

そして西口オススメの最後を飾るのがLTも出来る懇親会がアツい。
岡山の勉強会の目玉と言えばRyouteiでの懇親会。
特に座・スタジアムでのLT大会は毎度大盛り上がりです。
Ryouteiの岡山ITクラスタの交流に対する貢献度は計り知れません。
私も何度かRyouteiでLTをした経験があります。
そして多くの交流を育みました。
(大切な何かも失った気がしますが)
来年もオープンセミナー岡山TDDBC等で大活躍すること間違いなしです。

RyouteiでLTをするような大きなイベントに興味がある方は来年のオープンセミナー岡山の実行委員長のハーレムさんをWatchするのがいいと思います。

2 新倉敷駅周辺がアツい!

岡山と言えばJR快速も新幹線(こだま)も止まる新倉敷。
倉敷駅と何が違うって?
倉敷はアリオ酒津公園天領倉敷Scalaくらいしか目玉はありません。
しかも天領倉敷Scalaに至っては前回の活動から一年が経とうとしています。
そこで通は新倉敷。
新倉敷の素晴らしいところを2つご紹介します。

まず焼肉 ポプラのホルモンうどんが抜群うまい。
焼肉屋に言ってホルモンうどんを食べる通っぷり。
勿論、焼肉も最高に美味しいです。
しかもボリューム満点。
女性には多すぎるかもしれませんね。

そして新倉敷と言えばこれ

アミューズメント ファンタジスタ

このリンク先のモダンなサイトからもわかるように玄人からお子様まで楽しめるゲームセンターです。
まずなにがすごいって

レトロゲームがすごい

これです。
3rd、KOF98、ヴァンパイアセイヴァーなどなど。
発売から10年経ったタイトルが現役稼働中です。
しかもイベントまでやってます!
イベントでは大会も勿論、フリープレイやプレイヤー同士の交流などお楽しみが沢山!
しかも格ゲー以外にもパカスペやデカスロンなど往年のレトロゲームがあなたを迎えてくれます。
この環境は京都の聖地、アチョーや関東の雄のミカドに勝っていれど劣ってはいません。
そして更に

最新ゲームもすごい

なのでKOF13やギルティAC+Rなどのネシカの最新格ゲーから音ゲーまで安心して遊べます。
しかも格ゲーはdefaultが破格の50円!!
ワンプレイ100円が当たり前の昨今にこんなゲーセンが他にありますでしょうか。
少なくとも近隣200キロ以内にdefaultが50円のゲーセンは知りません。
そして最後は

店長がすごい

これです。
常にユーザ視点で色んな裏方をやってくれます。
最近ではUstや対戦動画の録画などを無料でやってくれます。
大会やゲームのイベントしたいけどどうすればわかんない…と言う方は店長はTwitterをしてますのでリプを飛ばして見ては如何でしょうか?

@amfantasista

これで新倉敷の素晴らしさ伝わりましたね!!

3 平日勉強会がアツい!

そして最後は平日勉強会です。
岡山と言えば勉強会が盛んです。
毎週週末は色んなジャンルの勉強会が開催されています。
毎月開催のオープンラボ岡山を始め、中国地方DB勉強会など魅力的なコンテンツばかりです。
しかし更に今、注目を浴びているのが平日勉強会です。
ここで例を2つほどご紹介します。

岡山Python勉強会(通称おっpy)
okayama.rb(通称ハンバーグ会)

です。
おっpyは主催者である@yamayama_k5さんに会場を提供して貰いながら行っています。
またoogle+ ハングアウトでの遠距離参加も可能で簡単に参加することが出来ます。
今年は基礎となるチュートリアルをみんなでハンズオンしたり、今月はSphinxについて学習しました。
来年はDjangoやGAEなどを触っていく予定です。
また気軽にTwitterでおっpyと言っても勉強会のことなので恥ずかしがる必要がありません。
これは篠崎愛ファンなら参加せざるを得ないでしょう!!

そして最後はハンバーグ会です。
軍団長(本人非公認)率いる瀬戸内変態クラスタ闇の軍団のメンバーの中でも #R社 と呼ばれる人たちが中心でやっています。
ハンバーグを食べながら初心者のRubyの開発環境のインストールを手伝ってあげたり、かと思えばテストをガッツリ書いたり。
Rubyをしっかり楽しめる会となってるみたいです。


以上の2つは今流行?のゆるふわ系勉強会です。
興味がある方はお気軽にご参加ください。

ということで僕が大都会で通勤をして気付いた3つのこと如何でしたでしょうか。
また25日間続いたアドベントカレンダーもこれで最後です。
来年も大都会がどんどんおもしろくなると思います。
今後もご愛顧をよろしくお願いします。

2013年12月22日日曜日

みんなが来るべきたった一つのイベント ~オープンセミナー2014@広島の紹介~

この投稿は、すごい広島 Advent Calendar 2013の22日目の記事です。

昨日はshow_55さんの「酒都・広島はビール好きにもウヒョーだぞ!(´∀`)」でした。

さて表題のオープンセミナーについてですが以下のとおりです。
去年のまとめはこちら

オープンセミナー2013@広島を開催して

そしてみんながMLに投函したりブログに貼り付けたりしやすいようにまとめました
(オープンセミナー2014@岡山の実行委員長のハーレムさんが)
以下内容です。

オープンセミナー2014@広島が、2014年2月1日(土)に開催されます。
※オープンセミナーとは2003年より中四国地域で開催されているIT技術者向けの非営利の無料セミナーです。
現在は香川県、岡山県、徳島県、**広島県**、愛媛県で開催されています。企画と運営は各地域の技術系ユーザコミュニティのボランティアにより行われています。

告知サイト:http://osh-2014.github.com/
申込サイト:http://osh-web.doorkeeper.jp/events/7534

━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
開催内容
──────────────────────────────────
オープンセミナー2014@広島

◆ 2014年2月1日(土)
場所 : 広島市中区大手町 1 丁目 5-3 サテライトキャンパスひろしま 大講義室 502
参加費 : 無料(懇親会:3500円)
主催:PostgreSQLユーザ会
オープンセミナー2014@広島実行委員会

受付開始 9:30-
勉強会 10:00-17:30
懇親会 18:00-20:00

━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
懇親会について
──────────────────────────────────
◆懇親会
場所:ShakeHands
広島県広島市中区紙屋町1-4-6 アウルスタイル紙屋町 3F
HP[ http://www.shakehands.jp/ ]
時間:18:00-21:00
会費:3,500円

━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
お申し込みについて
──────────────────────────────────
以下の申込サイトからお申し込みをお願いいたします。
セミナー:http://osh-web.doorkeeper.jp/events/7534
懇親会:http://osh-web.doorkeeper.jp/events/7544

━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
主催
──────────────────────────────────

日本PostgreSQLユーザ会 http://www.postgresql.jp/
オープンセミナー2014@広島実行委員会 http://osh-2014.github.io/members.html

━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
協賛
──────────────────────────────────

◆プラチナスポンサー
株式会社オレンジシステム広島 http://www.orange.co.jp/

◆シルバースポンサー
株式会社まほろば工房 http://www.ate-mahoroba.jp/

━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
後援
──────────────────────────────────

広島工業大学 http://www.it-hiroshima.ac.jp

━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
協力
──────────────────────────────────

Hiroshima.rb http://hiroshimarb.github.io/
すごい広島 http://great-h.github.io/
中国地方DB勉強会 http://dbstudychugoku.github.io/


こんだけ丁寧にまとめてあるとイベントの内容については特に説明することないと思います。
強いて言うならJPUGが主催で私の所属してる会社の株式会社まほろば工房
ほんとコミュニティにも職場にも恵まれてると感じます。

と言うわけでこんだけ凄いイベント、そりゃ県内外問わず来ちゃいますよね。
そこで来た人に知っていて欲しい広島事情書いときます。

■会場の近くで食べれるオススメお食事処

・広島人が勧める最強のお好み焼き屋

広島と言えばお好み焼き。
そこに多くの言葉はいらない(以下紹介

長久
会場からちょっと歩くけど行ける距離。
八昌が広島の超有名店だけどその暖簾分け。

みっちゃん
広島が誇る超強力お好み焼きグループ「みっちゃん」
その総本店がここ。
会場の近くにはそごう店や八丁堀店があるので状況に合わせてどうぞ。

三八
会場から遠いし車必須の距離だけど知ってる人は知っている広島の名店。
ここは無理して行くだけの価値があると思います。
自分の実家から近いので墓参りの時とか行きます。

ねぎ庵
ここも会場から遠いし車必須だけど広島インターの近く。
車で高速経由で行く時によく寄ります。
ここのネギかけやチーズ入りは絶品。
お店の雰囲気もおしゃれで店内も広いのでオススメ。

・辛口つけ麺

広島と言えば辛いつけ麺。
冷たい麺でツルッといただくつけ麺は季節を問わず美味しいです。
その中でも会場から近くてオススメを二店ほど。

唐々亭
そんなに辛くないし食べやすいつけ麺。
僕の周りでは愛好家が多いです!

辛部
妻も絶賛のつけ麺。
僕も市内に来た時はよく寄ります。

・会場から徒歩1分の天津飯

蓬莱
会場の目の前にあるサンモールの地下にあります。
並んでてもわりとすぐ空くのでオススメ。
ここは天津飯を食べましょう。
ラーメンではなく天津飯を食べましょう(大事なことなので二回言いました

・実行委員長(ひむひむ)がオススメの店
おっくん堂
ここのまぜ麺が超絶オススメらしいです。
僕は次の日にでもこの機会に行ってみようと思ってます。

・地元の人は?
サンカレーとかじゅこんとかいけばいいんじゃないかな!

■観光スポットとか

今年や去年のアドベントカレンダーを見るといいと思います。

すごい広島 Advent Calendar 2013
おいしい広島Advent Calendar 2012

■おみやげとか

トロ君のまとめ

今すぐ買いたい!? 広島でよく買う4つのお土産とこれから買いたい2つのお土産(銘菓編) – すごい広島Advent Calendar 2013 16日目

もいいけどやっぱ通はこれ、洋酒ケーキ
洋酒ケーキって何かというとアンガールズの田中の出身地、天領上下町の銘菓。
おみやげにする場合はひろしま夢プラザとかで買うのがいいと思います。
電話で注文も出来るみたいなので興味がある人はどうぞ。

くにひろ屋

お食事処良し!観光して良し!おみやげ買って良し!三拍子そろった広島県。
そんな広島県に旅行するつもりでオープンセミナー2014@広島に参加してみませんか?
当日、皆様にお会いできるのを楽しみしています。

さて明日はpecosantoyobeさんです。
引き続きすごい広島 Advent Calendar 2013をお楽しみください!!



最後まで読んでくれた人に極秘情報。
あの伝説のLT…TDDの続編を #た さんがオープンセミナー2014@広島の懇親会でやるらしいよ。
これは新しい伝説が生まれるでぇ…

ということでこちらに興味がある方は是非、懇親会に参加しましょう!!

2013年12月21日土曜日

Webアプリケーションを作るときに知ってると嬉しいPostgreSQLの使い方

この記事はPostgreSQL Advent Calendar 2013の21日目の記事です。

昨日はsawada_masahikoさんの「bgwokerで超簡易クラスタ管理」でした。


さて最近、自分の周りではMySQLからPostgreSQLに移行したと言う方が多いです。
AWSのRDS For PostgreSQLも出たのでDBは得意じゃないけどPostgreSQLを使ってみようかなと言う方も多いと思います。
なので今日はそんな人向け(PostgreSQL初心者から中級者向け)です。
(他のアドベントカレンダーが濃いのでたまにはこんなのもいいですよね?^^;)

それでは早速紹介していきます。

■serial型なユニークキーがあるときに最新の情報を取ってくる

これですが最新情報を取ってくるのにdate型やtimestamp型をソートしてるのを見かけます。
これをユニークキーに変えるだけです。
ユニークキーは主キーの時もあるでしょうしサロゲートキーでもいいです。
つまりこれを
SELECT * FROM table_name ORDER BY created_at DESC limit 1

こうするだけ
SELECT * FROM table_name ORDER BY primary_key DESC limit 1

で更新順になっているので同じです。
例えば特定のユーザの最終コメントを取ってくる場合などは
SELECT * FROM comment WHERE user_id = :user_id ORDER BY primary_key DESC limit 1
となります。
ただしinsertが次々行われる前提でupdateによって最新のデータが変わる時には使えません。
応用技として自分以外の最新を取ってくるなどはこうです。
SELECT
  *
FROM
  comment
WHERE
  comment_id in (
    SELECT
       max(comment_id) as comment_id
    FROM
      comment_id
    WHERE user_id != :user_id
    group by
      user_id
  )
自分以外の最新のcomment_idを取得しin句に投げてるだけですね。
PostgreSQLは表示させたいcolumnはGROUP BYで指定するか集約関数内でしか使えません。
MySQLからPostgreSQLに来た時によく躓くところですので注意が必要です。
(逆にこのMySQLの仕様はSQLアンチパターンのアンビギュアスグループの原因になりますね)
またMySQLではサブクエリはご法度とよく言われますがPostgreSQLのサブクエリは高速です。


それと先ほどGROUP BYの話をしましたが集約関数を直接呼ぶ場合は必要ありません。
つまり全体の最新レコードを取ってくる場合は
SELECT max(comment_id) from comment_id;

となります。
GROUP BYはコストが高いので使わなくて済む場合は使わない方がいいです。

■ランキングを取ってくる

ウインドウ関数をご紹介します。
リンク先で説明されているのですがそれだけではブログが寂しいのでこちらでもします。
ちょっと応用してPARTITION BY と ORDER BYをつかってグループ毎のランキングを出してみます。
次の画像のようなデータがあるとします。


この場合にcustomer_id毎のランキング(同率の場合は番号を飛ばす)は次のとおりです。
SELECT
SELECT
  user_id
  , customer_id
  , score
  , rank() OVER (PARTITION BY customer_id ORDER BY score) 
FROM
  "user" 
※userが予約後だったのでダブルクォーテーションで囲いました
この結果はこちらです。


自分は同様な集計をMySQLで必要となった時非常に苦労しました。
その時はSQLがかなり複雑になってしまいました。
そのためメンテナンス考え、SQLだけで解決せずにPHPを使いました。
ですが上記のSQLならメンテナンスも十分耐えれますね!!
またLet's Postgresに面白い例が掲載されているのでご紹介します。

Let's Postgres Window関数

上記のリンクの先にありますが連番になっていない(歯抜け)のレコードも次のとおり取り出せます。
SELECT
  id,
  prev_id
FROM 
  (
    SELECT
      id,
      lag(id, 1, 0) OVER (ORDER BY id) AS prev_id
    FROM tbl
  ) AS t
WHERE id <> prev_id + 1;
となります。
本来は難しいSQLをこんなに簡単にしてくれます。
ウインドウ関数の強力さを感じていただけましたでしょうか。

■対象だけをユニーク制約(一意インデックス

要望として次の例があると思います。


  • ユーザのマスターはメールアドレスでユニークにしたい
  • 削除は論理削除としたい
  • 削除された場合はユニークの対象としない


普通にユニーク制約をメールアドレスにすると削除フラグを立てたあとも新しく同メールアドレスで追加できません。
なので複数列を使ったユニーク制約が必要になります。
例えばRailsっぽくするとメールアドレスとdeleted_atですね。
defaultはdeleted_atを空白として削除された際はdeleted_atに削除日を入れます。
※defaultをNULLとした場合、NULLは値では無いのでユニーク制約にかかりません。
(NULLとNULLを比較した場合はNULLが返る=一緒ではないため)
これによってdeleted_atが空白=有効と判断できますしユニーク制約も生かせます。
ただし「削除日が同一(timestampの場合は全く同じタイミング)の時」にerrorが出ます。
なかなかあり得ないと言えますがスマートではありません。
そこで一意インデックスを使います。
INDEXにはWHERE句で対象を絞ることができます。
つまりユニークである対象を指定することができるのです。
しかもこの場合はdeleted_atはNULLでも構いません。
例えば

table名:user
ユニーク列:mail
削除フラグ:deleted_at

の場合は

CREATE UNIQUE INDEX user_idx ON user (mail) WHERE deleted_at IS NULL;


こうです。
これはdeleted_atがNULLのuserが対象になります。
この応用は他にもたくさん使うことができますので是非研究してみてください。
※ただし一意INDEXが作れるINDEXはB-treeのみです
(配列型等には向いていませんね)
他にも色々と注意点があるので公式ドキュメント(日本語)を一読するのをオススメします。

■知ってると便利な型

さて最後はPostgreSQLの多種多様な型の話をしようと思います。
方についてはchoplinさんが1日目7日目にもお話してくださっています。
なので今日はそれとは別の角度で型を紹介していきます。

連番型
MySQLでいうところのオートインクリメントな列をつくります。
正確にはinteger(整数データ型)のデフォルトにsequenceのnext valueが指定されています。
つまり連番なKEYの列を作るときにシーケンス作成→列の作成とデフォルトを指定、といった手間を省くことが出来ます。
地味にtableを作るときに面倒な作業が一気に解決します。

ネットワークアドレスデータ型
最近使いました。
こいつ凄いです!
まずIPアドレスを表現するinetとネットワークを表現するcidrがあります。
両方共 IP/サブネットマスク で指定できます。
つまり 

192.168.0.1/32

のような形で指定できいます。
また不正なIPアドレスは当然弾いてくれます。

例 192.168.0.300/24

これだけならサブネットマスクとIPアドレスを別の列にしてテキスト型でも表現出来ると思いますね?
(IPアドレスの整合性はバリデーションするとして)
本当に凄いのはデータを入れたあとです。
まずIPアドレスの最初の鬼門はソートです。
テキスト型だとソートの際に次のようになると思います。

192.168.0.1/24
192.168.0.111/24
192.168.0.12/24

ほんとは192.168.0.111は一番下ですよね?
これもちゃんと対応してくれます。
次にすごいのは検索です。

ネットワークアドレス関数と演算子

ちゃんとネットワークに合わせて比較して抽出等が出来ます。

「192.168.10.0/24のネットワークってあと何個IP余ってるの?」

みたいな要望にもこの型でIPを管理していればすぐ答えることができます。
業務管理系のアプリ作成やApacheのログの整形時に役立つ事まちがいなしです!
しかもコレ、IPv6も対応してます!!!!

配列型
私のお気に入りです。
ホントはこれを今回のメインに据えようと思ってたのですが初日でchoplinさんが紹介してます。
さらに大垣さんが13日目にまさに説明したかった内容を書いてくれてます

タグ検索するならPostgreSQLで決まり

交差tableを必要とする場面で有効なことが多いです。
特にWebアプリケーションでは助けてくれる場面が多いのではないでしょうか。
(アンケートのチェックボックスの列など)
ただし外部キー制約が必要な場合やデータの重複を避ける際などは素直に正規化しましょう。
強力な武器ですが使い過ぎは毒になる典型的な例です。

範囲型
次は悩んだ人も多いのではないでしょうか?範囲指定の強い味方です。
範囲型は数値以外にも日付型を使うことができます。
よく要望のあがる

「公開日付の開始日と終了日」

を入れることができます。
当然、両方とも指定しないことも出来ます。
こいつの威力を発揮するのは「範囲と範囲の比較」をする時です。
例えば公開期間に対して

1月1日~2月1日うちで公開しているリストを出す

などの場合です。
特に重複(共通点を持つ)をプログラムで表現するときは発想の転換が必要です。
(純粋に重複するか判断するのは大変なので重複以外で考えた方がいい)
そんな煩わしさも簡単な演算子で比較することで解決できます。

範囲関数と演算子

また範囲の最大値、最小値も求めることができますし開始日を指定しない場合は即日反映、終了日を指定しない場合はずっと公開などもそのまま対応することができます。
また単位を独自に指定することもできます。

例 10刻みのintなど(10 20 30 40)

カレンダーの処理や公開期間の処理はよく対応する処理です。
アプリケーションが非常にシンプルになりますので是非ご活用ください!!

PostgreSQL Advent Calendar 2013の18日目のyancyaさんがもっと詳しく書いています。
範囲型の良さがすごく分かりやすく書いてありますので是非一読してみてください。

PostgreSQL の範囲型について


幾何データ
最後の幾何データ型は地図上の検索を簡単にしてくれます。
実は二年前のアドベントカレンダーで紹介しました。

postgresqlを使った位置情報の計算について

postgresqlを使った位置情報の計算について  その2

JavaScriptがイケてないし色々と知らいないことも多かった時期のエントリーなので改めてここで説明したい…と思ったのですが随分長くなったので次の機会にw
ただ緯度経度に対する範囲検索などは需要があるようで未だに上記のエントリーがそこそこViewがあります。
PostgreSQLの幾何データ型は非常に強力で他のDBの追随を許さないレベルです。
例で近似値を使ってますがより精度が必要な場合はPostGISを使うことで対応することが出来ます。
geometry型はGoogle Mapsなどと相性は抜群です。
Let's PostgreSQLに農研機構の寺元さんの記事があるので参考にどうぞ。

PostGISとは?



さて色々とご紹介しましたが一つでもみなさんの新しい知識になっていただけましたでしょうか。
冒頭でもご紹介しましたとおりAWSでもPostgreSQLを使えるようになりました。
またHerokuなどもPostgreSQLを使うことが出来ます。
今までWebと言えばMySQLでしたがPostgreSQLで便利になるシーンもあると思います。
MySQLのシンプルで高速さも非常に強力ですがPostgreSQLの高機能と堅牢性も非常に強力です。
今ではオートバキュームもあり運用も楽になっていますし検索はMySQLに負けていないほど高速です。
レプリケーションやパーテーションも対応していますしKVSなtableも作れます。
まだまだ奥が深いPostgreSQLをこの機会に興味を持って頂けたらと思います。

それと最後に宣伝。

2月1日に広島で以下のイベントが行われます。

オープンセミナー2014@広島

◆ 2014年2月1日(土)
場所 : 広島市中区大手町 1 丁目 5-3 サテライトキャンパスひろしま 大講義室 502
参加費 : 無料(懇親会:3500円)
主催:PostgreSQLユーザ会
オープンセミナー2014@広島実行委員会
受付開始 9:30-
勉強会 10:00-17:30
懇親会 18:00-20:00
告知サイト:http://osh-2014.github.com/
申込サイト:http://osh-web.doorkeeper.jp/events/7534


自分はAWSのRDS For PostgreSQLの話をします。
近場で興味がある方は是非ご参加ください!!


PostgreSQL Advent Calendar 2013もついに最終週です。
明日はいつも一風変わったネタを紹介してくれるnuko_yokohamaさんです!
どんなネタが飛び出すか楽しみですね!!
それでは引き続き、PostgreSQL Advent Calendar 2013をお楽しみください。

2013年12月13日金曜日

FuelPHP(TwitterBootstrap3)でJQueryのプラグインのdataTablesを使う

FuelPHP Advent Calendar 2013の13日目です。

昨日は@madmamorさんの

FuelPHPでChatWorkパッケージを使ってみる

でした。
私もチャットワークのAPIを利用できるようになったのでこの週末に早速試してみたいと思います。

それでは今日のお題ですがdataTablesです。
Webアプリを作るとき、業務系の管理画面を作るとき、FuelPHPの軽量さと作りやすさは強力です。
私もここ最近のWebアプリケーションはFuelPHPで作ることが大半ですね。
その中で特に管理画面を作るときはTwitterBootstrapは非常に便利です。
皆様も日頃お世話になっていますよね?
また今日ご紹介するdataTablesも強力なJqueryのプラグインです。
dataTablesはhtmlのテーブルタグを読み込み、ソートや検索を始め、多くの機能を提供します。
この2つを組み合わせることで表出力が簡単で便利になるのでご紹介します。

dataTables

日本語まとめwiki


TwitterBootstrapでdataTablesを使う

ただ、TwitterBootstrapもFuelPHP1.7で2から3に変わりました。
TwitterBootstrap3は2と互換性のない変更が多く、過去の資産が使いまわせません。


※TwitterBootstrap3用の書籍で非常にわかりやすかったのでオススメです

DataTablesも例に漏れず上記の方法では無理です。
TwitterBootstrap3のUIに合わせるのには公式サイト以外の方法が必要です。
とは言ってもすでに3用のプラグインが作成されています。
そこでdataTablesの簡単な使い方とTwitterBootstrap3のUIに合わせる方法をご紹介します。

まずは最新のソース・ファイルをFuelPHPに配置します。

GirHub dataTables

本体
https://github.com/DataTables/DataTables/blob/master/media/js/jquery.dataTables.js

Bootstrap用CSS
https://github.com/DataTables/Plugins/blob/master/integration/bootstrap/3/dataTables.bootstrap.css

Bootstrap用JS
https://github.com/DataTables/Plugins/blob/master/integration/bootstrap/3/dataTables.bootstrap.js

Bootstrap用image
https://github.com/DataTables/Plugins/tree/master/integration/bootstrap/images

これらをpublic/asset/のそれぞれに配置します。
ここで注意があります。
FuelPHPの画像を置く場所はデフォルトはimgです。
ですがCSSのファイルパスはimagesになっています。
これを下記のとおり変更します。
table.dataTable thead .sorting { background: url('../images/sort_both.png') no-repeat center right; }
table.dataTable thead .sorting_asc { background: url('../images/sort_asc.png') no-repeat center right; }
table.dataTable thead .sorting_desc { background: url('../images/sort_desc.png') no-repeat center right; }

//変更

table.dataTable thead .sorting { background: url('../img/sort_both.png') no-repeat center right; }
table.dataTable thead .sorting_asc { background: url('../img/sort_asc.png') no-repeat center right; }
table.dataTable thead .sorting_desc { background: url('../img/sort_desc.png') no-repeat center right; }


これでasset/imgに配置してもソート用の画像が読み込まれます。

あとはTableにIDを降って


var Table = $('#table_id').dataTable();

とすれば自動的に読み込んで整形してくれます。
これでよく要望に上がるソート・ページャー・サーチを一度に対応することが出来ます。
更によりBootstrapっぽくするには


var Table = $('#table_id').dataTable({
    //日本語対応したい場合はGithubのpluginから該当のファイルをダウンロードしてください
    oLanguage: {
        sUrl: "/assets/js/plugins/i18n/Japanese.lang"
    },
    //Table生成後に実行されます
    fnInitComplete: function() {
        $('#table_id').each(function() {
            var datatable = $(this);
            //サーチのinputタグをよりBootstrapUIよりに
            var search_input = datatable
                    .closest('.dataTables_wrapper')
                    .find('div[id$=_filter] input');
            search_input.attr('placeholder', 'Search')
                    .addClass('form-control input-sm');
            //表示列数の表示をよりBootstrapUIよりに
            var length_sel = datatable
                    .closest('.dataTables_wrapper')
                    .find('div[id$=_length] select');
            length_sel.addClass('form-control input-sm')
                    .change(function() {
                        oFC.fnRedrawLayout();
                    });
            oFC.fnRedrawLayout();
        });
    }
});

とするといい感じになります。
他にもdataTablesには多様な追加機能がpluginとして用意されています。
公式サイトは情報が古かったりするのでGitHubのサンプルのindex.htmlも参考にしてみてください。

さてFuelPHPの良いところ言えばRESTControllerですよね。
またdataTablesはデータをJSONで受け取ることが出来ます。
大きいdataでもAjaxでJSONを受けることができるので肥大したTableでも対応することが出来ます。
今日は13日の金曜日ですしJSONを使った例もご紹介します。

簡単な例ですと


var Table = $('#table_id').dataTable({
    //読み込み中の表示
    bProcessing: true,
    //dataを全て読み込む前に表示を始める
    bDeferRender: true,
    //読み込むJSONのURL(RESTControllerのURL)
    sAjaxSource: "/api/dataTables.json",
    //配列名(デフォルトはaadata)
    sAjaxDataProp: "setJson",
    //表示列とjsonの項目をマッピングします
            aoColumns: [
                { mData: "id", sDefaultContent: "" },
                { mData: "name", sDefaultContent: "" },
            ],
    oLanguage: {
        sUrl: "/assets/js/plugins/i18n/Japanese.lang"
    },
    fnInitComplete: function() {
        $('#table_id').each(function() {
            var datatable = $(this);
            //サーチのinputタグをよりBootstrapUIよりに
            var search_input = datatable
                    .closest('.dataTables_wrapper')
                    .find('div[id$=_filter] input');
            search_input.attr('placeholder', 'Search')
                    .addClass('form-control input-sm');
            //表示列数の表示をよりBootstrapUIよりに
            var length_sel = datatable
                    .closest('.dataTables_wrapper')
                    .find('div[id$=_length] select');
            length_sel.addClass('form-control input-sm')
                    .change(function() {
                        oFC.fnRedrawLayout();
                    });
        });
    }
});

としてRESTControllerは


public function action_dataTables() {
        $aadata['setJson'][] = ['id'=>1, 'name'=>'hage'];
        $aadata['setJson'][] = ['id'=>1, 'name'=>'fuga'];
        return $this->response($aadata);    
    }
といった感じでいつもどおり配列を渡してJSONを生成するだけです。
htmlは次の通り
id name
とするとtbodyの内容をJSONを元に自動生成してくれます。
もちろん作りこみ次第で例の最初に全て読み込むのではなく、APIとViewが連携して適時やりとりすることが出来ます。
このAPI側が非常に簡単につくれるのはFuelPHPのメリットです。

以上のようにFuelPHPとdataTablesの相性は抜群です。
是非、公私でアプリ作成時に試して見てください!

それで引き続きFuelPHP Advent Calendar 2013をお楽しみください!!

2013年12月7日土曜日

おみゃー広島弁が安芸弁だけ思うたら大間違いよ ~今日から使える備後弁~

この記事は「広島弁 Advent Calendar 2013」の7日目の記事じゃ。

昨日はairplanetrackさんの「聞くとほっとするんよ」じゃったわ。
やっぱ広島弁は最高やね。

で今日もそれに続いてやるけぇ見んさいよ。
ほいじゃあまず備後弁についてはここみんさい。


最近のAppleの偉い人は安芸弁みたいじゃけど通は広島弁の中でも備後弁よ。
みんなも今日から備後弁使えるようにえぇがに使いやすいのまとめといたるわ。


1 ぼれぇ(意味 凄い・とても

ぼれぇ is キングオブ備後弁 と言っても過言やない。

安芸弁:バリ・ぶち
備後弁:ぼれぇ

ほれ、並べてみただけでもインパクトが全然違おうが。
合コンで

「とても素敵!!」


「ぼれぇ素敵!!」

するだけで完璧。
これでヤングなナオンのハートをイーグルキャッチよ。

2 たちまち(意味 とりあえず

安芸弁でも備後弁でもたちまちは標準装備よ。
居酒屋言ったらそこら中で「たちまちビール」の応酬よ。
広島の店で「とりあえずビール」なんて言うた日にゃ他所様扱いよ。
地元の雰囲気を楽しむならまずは「たちまちビール。」これやね。

3 わや(意味 無茶

無茶苦茶なら「わやくそ」よ。
安芸弁でもあるで。
もう正直備後弁関係にゃーね。

4 みやしぃ(意味 簡単

反対に難しい時は「いたしぃ」じゃわ。
こんな案件だけど納期収まる?って聞かれたら

「そりゃみやしぃけぇ余裕のよっちゃんよ。」

って答えんさい。
一気に信頼関係が作られるけぇ。

5 たいぎぃ(意味 面倒くさい

これすぐみんな言うけぇね。
「ぼれぇたいぎぃ」って言い出したらそりゃもう相当嫌よ。
周りの人が言よったらよっぽどいたしぃことになっとるけぇ相談のってやんさい。


ホントはまだまだあるんじゃけど今日はこれくらいにしとくわ。
明日は広島県外でも超有名ブロガーのかけなびさんじゃけぇみんな楽しみにしときんさいよ。
ほいじゃあ最後は元WBA世界ミドル級王者の竹原さんをインスパイアして締めるけぇの。



じゃあの。


2013年11月23日土曜日

【バグ報告】FuelPHP1.7のRESTControllerの挙動について

バグ見つけました。
前回の

【バグ報告】FuelPHP1.7でViewModelが二回実行される


につづいて1.7のバグです。
前回も今回も1.8Dev版で治っており、コミュニティには報告されているため1.7.1では改修されてリリースされます。

対象 FuelPHP1.7(2013/11/23現在)

現象としてはURLで

/method.json

とアクセスするとJSONが本来吐かれますがこれを

/method

等の拡張子を指定せずに

HEADERS Accept text/html

の時には $response->body() の中がArrayになります。
具体的には直接拡張子をブラウザでアクセスした場合に発生します。
が本来はStringを期待してるのにArrayが来るのでエラーになります。
つまり結論から言うとFuelPHPのRESTControllerはHTMLの拡張子の実装はされていません。
ドキュメントには「シンプルなテーブルタグを吐き出す」となっていますが元々var_dumpしているだけでした。
これが1.7でvar_dumpすらせずにエラーになっていました。

対策としてはHTMLの実装が無いので必要なければ

/classes/controller/rest.php

--- a/classes/controller/rest.php 
+++ b/classes/controller/rest.php 
@@ -55,7 +55,7 @@ abstract class Controller_Rest extends \Controller 
        'jsonp'=> 'text/javascript', 
        'serialized' => 'application/vnd.php.serialized', 
        'php' => 'text/plain', 
-       'html' => 'text/html', 
+     //'html' => 'text/html', 
        'csv' => 'application/csv', 
    );   

'html' => 'text/html', をコメントアウト

と修正するのがいいと思います
今回はfuelphp_jpのMLに投稿してみました。
詳しい情報としてはこちら。

1.7のRESTControllerの挙動について(ML)

今回はMLに投稿してみました。
1.7.1や1.8の修正としては

  • HTMLはvar_dumpを実行すると言う仕様で統一する
  • ドキュメントはそのように修正する

という方針になったようです。
Githubのプルリクは英語必須でGitやGithubの使い方を覚えなきゃいけないのでハードルが高いと思います。
(まぁ間違ってたりしたらコメントくれてプルリク弾かれるだけなので気にせずガンガン練習がてらプルリク投げてもいい気もしますが)
ですがMLは日本語だしレスポンスも割と早いのでバグだったり質問は気軽に投げてみたらいいと思います。
僕も今回は優しく対応していただきました^^
と言うことでバグを見つけたらMLで報告。
バグかな?って思ったらMLを見てみる。
こんな流れで地雷を上手くさけて行ける気がしました。
と言うことでみなさんも是非ご参加ください!

FuelPHPの日本語グーグルグループ

  

2013年11月4日月曜日

CakePHPを使う人は是非とも読むべきレシピ本

CakePHP2定番レシピ119」をを読みました。




の本、結論から言うと『かなり良い』です。
理由としては以下のとおり3つ。

1 デバックのやり方がしっかり書いてある

よくある技術書は「うまく行った時の書き方」が書いてあるモノが多いです。
フレームワークは利用時に上手くいってる時は良いのですがハマった時に非常に苦しみます。
そこでデバックのやり方を知ってるか否かで効率は大きく変わってきます。
コードを書いてる時にミスをしない人は稀です。
そういった点からみて、まずデバックのやり方を書いてあるのは実際に使う際に非常に助かります。

2 セキュリティに配慮したレシピが多く書いてある

フレームワークの本は使い方を書いてあってもセキュリティについては書いてあるものは少ないです。
しかし現状ではセキュリティは考慮すべき項目でWebエンジニアとしては非常に重要な項目です。
このレシピ本はXSSへの対策をはじめ、SQLインジェクションなど対策として欠かすことの出来ない項目をしっかりフォローされています。
特にデータベースの扱いはモデルの章としてデータの扱いも含めて非常に細かく記載されてます。
ORMやクエリビルダを使ったことの無い方も必見です。

3 使いたいレシピがしっかりある

最後ですがプログラマーからするとこれが一番重要です。
どの技術書も読んで「へーこんなことがあるんだ」と思うことは多いでしょう。
ただそれが「あっこれ、○○で読んだやつだ!」と感じるシーンは少ないのでは?
このレシピ本は即戦力の情報が満載です。
例えば今までViewでSmartyを利用していた場面でのhelperの使い方。
またページャーやバリデーションの使い方などです。
これらは読んで今日から利用する機能でしょう。
そういった知識が事細かくフォローされています。
これは他のフレームワークの経験がある人にも非常に大切なことです。
このレシピ本なら「○○ではこうやって出来たけどCakePHPはどうやるの?」と言った疑問に答えてくれるでしょう。

■まとめ

CakePHPはPHP界隈では利用例も多く日本語情報も多いです。
ですがそれ故に1系の頃の「使えない情報」も多いのが現実です。
特にレシピ的なことは個人のブログが情報源になっており、ヴァージョンアップに伴う更新も行われていないと思います。
これからCakePHPを使いたい人も然ることならが「今までCakePHPをガンガン使ってた人」も2系の情報を仕入れるためにも一読して損はないかと思います。
これを読めば「あーこれってこうやると簡単になるんだ。」という新しい知識に出会えると思います。
私もこの本は会社の机の上に常備しています。