2014年7月24日木曜日

第四回 中国地方DB勉強会を開いてきた

第四回やって来ました。
そして中国地方DB勉強会は皆様のおかげで1年が経ちました。
今回もJPUG主催で行いましたが今回はクレオフーガハーレムさんの希望でチューニングをテーマに行いました。
またクレオフーガはMySQLをメインに使っているので今回はMySQLとPostgreSQLにフォーカスしました。
それと前回好評だったハンズオンも行いました。
個人的には非常に充実した一日で大満足です。
ただハンズオンの準備や細かいコンテンツの調整は大変でした。
無事成功したのは講師の喜田さんと山﨑さんのおかけです。
本当に色々とご協力してくださりありがとうございました。

そしてそんな第四回の詳細は次のとおりです。

■登壇資料など

中国地方DB勉強会のポータルサイトにまとめました。
http://dbstudychugoku.github.io/events/event-004.html

また当日のハンズオンの資料の中に
  • MySQLパフォーマンスチューニング概要.txt
  • サブクエリ最適化の検証.txt
という資料で講師の山崎さんが纏めてくださっています。
MySQLのチューニングに関するTIPSが載っています。
また喜田さんのPostgreSQLの資料は非常に良くまとまってます。
PDFなのでダウンロード必須です!!


■メーリングリスト

次回の告知についてはMLやDoorKeeperを使います。
興味がある方はチェックしてみてください。

中国地方DB勉強会ML Google Group
dbstudychugoku@googlegroups.com

DoorKeeper


■動画とtwitterのまとめ

今回はUstream配信はありませんでした。
Twitterについては@razonさんがまとめてくれています。

第4回 中国地方DB勉強会 in 岡山 まとめ #ChugokuDB



■第四回のアンケート募集中

当日に参加やUst拝見された方は下記のアンケートに答えてくださると嬉しいです。
次回のコンテンツや今後の運営に活用させて頂きます。

アンケートはこちら
※匿名アンケートです


■MySQL Workbench 6.1.7(最新版)のバグについて

勉強会でご紹介したビジュアルEXPLAINに関してバグが見つかりました。
MySQL Workbench 6.1.7(最新版)で、

・ビジュアルEXPLAINが取得できない

というバグが存在しました。
現時点で、ビジュアルEXPLAINを使用するためには、古いバージョンの(MySQL Workbench 6.1.6以前)を使用頂ければと思います。
また、本バグは既にバグ登録されており、開発者が対応中です。
以下のバグ報告サイトにアクセスして右側にある「Affects me」をクリックして頂ければ、開発者にバグで困っている人が多くいることを伝えることができますので、よろしければ
クリックして頂ければ幸いです。

http://bugs.mysql.com/bug.php?id=73256


■第5回 中国地方DB勉強会

日時:2014年9月21日(日曜日)
会場:広島県広島市中区大手町1-5-3 サテライトキャンパスひろしま 501号室
内容:各データベースのトラブルシューティングについて

  • ※セッション対象予定
  • PostgreSQL(確定)
  • MySQL(講師交渉中)
  • OracleDB(確定)
  • SQLServer(確定)
  • MongoDB(オライリージャパンのMongoDBインアクションの翻訳者の玉川竜司さん!)

以上のように考えています。
既に各DBの講師に依頼をかけており、豪華講師陣になりました。
今回はハンズオンはありませんが実際のDBAや開発者にとってかなり充実した内容になると思います。
また始めて有償DBのエンジニアやNoSQLのエンジニアの講師をお呼びしております。
交流含めて是非参加をご検討していただけたらと思います。

申し込みサイトが出来ましたらMLやDoorKeeperで告知します。
ご興味がある方は上記のMLとDoorKeeperにご登録してみてください!!


■オープンソースカンファレンス2014@広島

第5回 中国地方DB勉強会の前日に同会場で次のとおり行われます。

日時:2014年9月20日(土曜日)
会場:広島県広島市中区大手町1-5-3 サテライトキャンパスひろしま

http://www.ospn.jp/osc2014-hiroshima/

こちらにJPUGも出展致します。
また多くのエンジニアが一同に集まる大きなイベントです。
こちらも合わせてご参加をご検討していただきますようお願い致します。

と以上のとおりです。
そして今回のハンズオンは喜田さんの書かれた次の本を使いました。



この本、中を拝見しましたがかなりいいです!!
僕はこの勉強の後に買いました。
何が良いって
  • SQLの書き方のHow Toが書かれてる
  • しかもDB別でOKとNGの両方が書かれてる
  • 要所でDB間の違いやオプティマイザ等の動きの説明がある
点です。
やはりただ一つのやり方を知るよりも複数のアプローチを知っている方が応用が効きます。
更に他のDBとの差を知ることでより深く知識の研鑽になると共に記憶に深く根付きます。
特にMySQLとOracleとPostgreSQLと言う3大DBですから実務で出会うことは多々あるでしょう。
なので自分の得意なDBでは○○って書くけどOracleの時はどうすんの?みたいなときも非常に助かります。
ということでコレ本オススメです。


ということで第四回は非常に充実した内容でした。
次回はセミナー中心でハンズオンはありませんが超豪華講師陣です。
すでに今から楽しみで仕方ないです!!
次回も皆様と勉強会でお会いできるのを楽しみにしております。

2014年7月6日日曜日

PHPライブラリ&サンプル実践活用[厳選100]はすごく良い

タイトルの本読みました。




WINGSプロジェクト←こちらで本の概要がわかります

正直こういう本は一周遅れとか二周遅れの事が多いです。
それが呼んでびっくり バリバリ現役の内容 です。
で具体的に何処がいいかですけど

1 環境構築→インストール→利用までがしっかり流れでまとまってる。

実際にライブラリを調べる時はPHPerだとWebの情報を元にすることが多いと思います。
その際に


  • 環境構築のサイト
  • インストールのサイト
  • 使い方のサイト


をそれぞれ探して来て順にブラウザのタブを行き来しながらやる煩雑さ。
あれがありません。
ヘタすると使い方もバージョン依存だったりでハマり、それだけで何サイトも巡る...
そういうコストが全くないというのはストレスフリーですよね。
更に言うとGithubだったりComposerに対応してるものはそちらで紹介されています。
こういモダンなやり方を始めるきっかけとしてもいいと思います。

つかGithubは言わずもがな、ホントComposerはマジ便利なんでオススメです。
さらにさらにさらに!!
公式サイトからサンプルコード落とせます!!

サンプルコード

これは非常に助かる。
写経も勉強になるんだけど実際に使うときに書き直すのは億劫です。
でもサンプルコードがあるので

2 即実戦投入出来るサンプル

これはPHPに限らずライブラリあるあるなんですけど

Hello Worldが出来たらOK!

みたいな紹介サイトよく見かけます(ブーメラン)
この本はもう一歩踏み込んだところまでサンプルになってます。
グラフだと一つだけじゃなくて棒グラフだったりレーダーだったり。
しかも一つじゃなくて複数のライブラリを紹介することで

利用用途によって最適なライブラリを選定できる

ってのが強いです。
PHPの良い所でもあり難しいところに「どれを使えばいいのかわからない」ことあると思います。
そんなときHello Worldレベルだと違いがわかりません。
ですが一歩踏み込んだ紹介を複数個用意してくれてるので選定が非常に捗ります。
さらに試すときもインストールから実践までがまとまってるので動かすことがすぐ出来ます。
これで実際に「こんな事がしたいんだけど出来る?」っていう質問に「あーそれならあのライブラリ使えるんで○○時間くらいで出来ますよ。」と即答出来るようになるはずです。
「あーちょっとやってみないとわかんないです...」とか「やってみたら思った以上にハマっちゃって時間がかかりそうです...」って言うのとは全然違いますよね。

3 紹介されてる内容がイケてる

どんなに丁寧に紹介されてても実際に使うシーンが無ければ無駄知識です。
でもこの本は安心していいです。
WINGSプロジェクトの目次を見ても分かる通り、求められたシーンがあると思います。
さらにGoogleやAWSのAPIのように知ってると引き出しが広がるAPIも沢山紹介されてます。
実際に僕が使ったことがあるAPIやライブラリが多数紹介されてました。
逆に僕がこの本を読んで使い始めたライブラリも沢山あります。
列挙だけ紹介しますと

  • Faker(テストで使うようないい感じのダミーデータを作ってくれます)
  • PHP GitHub API(GitHubのリポジトリを参照したりできるので自動化が捗る!)
  • PHP Markdown(Marcdown形式をhtmlにしてくれる)

なんかがあります。
WebAPI系なんかは「おっコレ今度使ってみよ!」みたいなのが結構ありますね♪
またPHPUnitみたいな日頃から使ってるツールでも知らないことがあったり発見がありました。
家に置いてもよし、会社に置いても良しの一冊だと思います。





だたちょっと残念だなって思うところもあります。
例えばフレームワークについて。
これはそれぞれで1冊の本になるレベルですので仕方ないとは思いますがやっぱ紹介程度です。
なのでフレームワークは最近の流行りを知れる程度だと思います。
ただこの中で出てくるFuelPHPに興味がある方は以下の本がオススメですよ。

はじめてのフレームワークとしてのFuelPHP第2版

FuelPHPに関しては今一番まとまったシリーズです。
モダンなPHPの開発手法も網羅されてるのでフレームワークの外の部分でも勉強になります。

ということでこの本を見て開発意欲が刺激されたので何か作ってみようと思いました。
またこの本は会社に置いて都度参考にしようと思います。

2014年6月21日土曜日

デジタルサーカスに遊びに行ってきた

東京のお高いおしゃれの街青山にあるデジタルサーカスさんに遊びに行って来ました。

デジタルサーカス

そしてデジタルサーカスさんですが兎にも角にも

おしゃれ!

これですね。
応接間も綺麗ですしお仕事場も広くて個々の机もゆったりでした。
そしてデジタルサーカスに行った理由は@tomzohさんにお会いするためです。
@tomzohさんは新卒からずっとデジタルサーカスを支えてきたエンジニアの方で

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


の著者の方です。
@tomzohさんは非常に相手を引き出すのが上手でした。
僕が話を聞きにお伺いしてるのに気付いたら@tomzohさんに上手く転がされてました^^;
さらに


  • SNSを利用方法
  • エンジニア採用
  • 仕事を上手く回すポイント


については非常に含蓄が多い意見を聞かせていただきました。
デジタルサーカスさんは創立して15年と業界からすると老舗です。
やはり老舗なだけあって色々と「上手くいくには理由があるな」と感じましたね。
今後もデジタルサーカスさんは安心できる受注開発業者として大活躍すると感じました。

それと蛇足ですがスパ4で対戦しました。
かなりボコボコにされてセンスを感じさせる内容でした^^;
頭がキレる人は格ゲーが強いの持論はまた立証された結果ですねw
起き上がりの移動投げ対策を含め、ウル4ではケン対策しっかりしようと思います><

クレオフーガ(岡山)に遊びに行ってきました

先日(6/20)にクレオフーガに遊びに行ってきました。

クレオフーガがといえばキムキムを始め、イケてるRubyエンジニアが集まってるのが特徴です。
実際にOSH2014の実行委員長だった@mako_wisさんがcodeをバリバリ書いてましたね。
でクレオフーガに遊びに行って感じたことは


  • 女子大生がそこら中にいる
  • CTOの山口さんが非常にフレンドリー
  • 岡山大インキュベーションセンター内での繋がりも大事にしてる
  • 女子大生多い(大事なことなので二回言いました
  • 山羊がいる


と言う感じでした。
岡山大インキュベーションセンターは岡山の企業からするとかなりアツい選択肢でしたね。
またクレオフーガの「敢えて岡山でやる!」ってスタイルは素晴らしいと感じました。
今の開発体制は


  • 立地場所によるデメリットがすくない
  • 社員のコストが少ない(物価が安い
  • 東京と違って地震ない←


などのメリット以外にも


  • 競業他社が少ないので目立ちやすい
  • 他業者との繋がりが強い
  • コミュニティの力を借りたり援助が非常に効果的


とのこともおっしゃっていました。
そんな中では一番は

サービスが流行らなかったら会社が無くなる覚悟でやってる


って仰ってて「そりゃ勢いあるはずだわ」と納得の一日でしたね。
今後も岡山からのクレオフーガの勢いは止まりそうにないですね。

2014年6月5日木曜日

PHPでCSVから配列を作る

前回のエントリーで

symfony2でCSV出力(ダウンロード)する


を紹介したので対のCSVをArrayにするmethod置いときます。

public static function csv_string_to_array($csv_string)
{
    mb_language("Japanese");
    $buf = mb_convert_encoding($csv_string, 'UTF-8', "auto");
    $replace_buf = str_replace("\r\n", "\n", $buf);
    $lines = explode("\n", $replace_buf);

    $filter_lines = array_filter($lines);
    foreach ($filter_lines as $line) {
        $ret[] = str_getcsv($line);
    }
    return $ret;
}
改行を一度\nにしてからexplode()してます。
explode()を利用した理由は可読性がいいからです。
速度的にはループと大差ないです。
array_filterは空行を削除してます。
なので

1,2,3


2.3.4

みたいな時は間と末尾の空行を削除します。
あとはstr_getcsvで行の内容を取得します。

あと蛇足ですがなぜスネークケースかと言うと

PHPはmethod名の大文字小文字を見ない

ので_区切りにしてます。
現場からは以上です。

symfony2でCSV出力(ダウンロード)する

symfony2シリーズ第3弾です。
CSV出力、何かと言われて実装することが多いのではないでしょうか。
FuelPHPではRESTコントローラがCSV対応しており、配列渡すだけなので久しぶりに実装しました。
と言っても良くある実装なのでsymfony2でActionで呼ばれた時の場合でご紹介します。

public function exportAction()
    {
        $header = [
            'ID',
            '名前',

        ];
        $list[] = $header;
        //DBから呼び出した場合はgetArrayResultを使うか自分で$dataを整形して下さい。
        $list[] = [1,'hoge'];
        $list[] = [2,'fuga'];

        $csv = $this->convertArrayToCsv($list);

        $response = $this->render(
                "AcmeSampleBundle::export.html.twig", [
            'csv' => $csv,
                ]
        );

        //Excel対策でUTF-8からSJIS-winに変換
        $contents = mb_convert_encoding($response->getContent(), 'SJIS-win', 'UTF-8');

        //headerのSET
        $response->headers->set('Content-Type', "application/octet-stream; name=hoge.csv");
        $response->headers->set('Content-Disposition', "attachment; filename=hoge.csv");
        $response->setContent($contents);

        return $response;
    }


    //配列をCSVに変換。
    //文字列のエスケープをしてくれるのでfputcsv()を利用
    private function convertArrayToCsv($list)
    {
        $fp = fopen('php://temp', 'r+b');
        foreach ($list as $fields) {
            fputcsv($fp, $fields);
        }
        rewind($fp);
        $tmp = str_replace(PHP_EOL, "\r\n", stream_get_contents($fp));
        return $tmp;
    }

表示するTwig側(例ではexport.html.twig

{{ csv|raw }}

としてます。
rawを使わないとcsv内のクォートなどをエスケープするので忘れないでください。

CSVから配列にする場合のメソッドはこちらです。

PHPでCSVから配列を作る



2014年6月4日水曜日

twigとPHPとSQLでの年齢計算

年齢計算は良く出てくることなんだけどTwigでやる時のメモ。


Twig

TwigにはPHPの関数が使えないので計算で出します。
birthdayには日付型のデータが入っているとして

{% set age = "now"|date('Y') - birthday|date('Y') %}
{% if ("now"|date('m/d') < birthday|date('m/d')) %}
    {% set age = age -1 %}
{% endif%}

で出ます。

(今年 - 誕生日年)


をして年を外した日付で比較して誕生日が来てなかったら1引くというロジックですね。

PHP

PHPはtime()で引き算したりいろいろあるのですが個人的に一番好きな方法をご紹介します。
ついでにDateTimeクラスのdiff()は5.3以降のPHPじゃないと動きません。

$birthday = new \DateTime("'2014-06-04'");
$now = new \DateTime();
$interval = $now->diff($birthday);
$age = $interval->y;

MySQL

MySQLはTwigと同様に計算で出します。

SELECT
  (YEAR(CURDATE()) - YEAR(birthday)) - (RIGHT(CURDATE(), 5) < RIGHT(birthday, 5)) AS age
FROM
 member

PostgreSQL

PostgreSQLにはage関数があります。

日付/時刻関数と演算子

なので単純に

SELECT
 age(now(),birthday)
FROM
 hoge

で差分の日付型が帰ってくるので頭の年を取得して。

SELECT
 extract(year from age(now(),birthday)) AS age
FROM
 hoge

こんな感じです。
むしろPostgreSQLはFrom句が無くても動くので

SELECT extract(year from age(now(),date '2013-06-04'))  AS age

SELECT extract(year from age(now(),now() + '-10 year'))  AS age

とか動きます。
と言うことでよく使う年齢の計算方法でした。