ラベル 備忘録 の投稿を表示しています。 すべての投稿を表示
ラベル 備忘録 の投稿を表示しています。 すべての投稿を表示

2016年11月9日水曜日

PHPカンファレンス2016でRDBアンチパターンの話してきた #phpcon2016

全国のそーだいふぁんのみなさん、お久しぶりです。
1ヶ月ほど更新がなかったのですが私は元気です。
表題の通り、PHPカンファレンス2016に遊びに行ってきたのでそのご報告です。
当日のスライドはこちら



今回はRDBアンチパターンということで以下の内容を話して来ました。
またスライドだけでは言葉足らずなので補足記事書きました。
下のリンクで補足記事に行けます




スライドだけでは説明しきれないのでぜひ動画を見てほしいです



それと当日のTwitterまとめ

DBの寿命はアプリよりも長い!DBを救える英雄になろう RDBアンチパターン入門 #phpcon2016 #phpcon2016_2 RDBアンチパターン

内容としてはもっと色々詰め込みたかったんですが60分では私の108式あると言われるアンチパターンをすべて伝えるには不可能でした。
どこかの機会で残りも伝えれればなと思います。
というわけで登壇内容については上記のそれぞれの補足説明を読んでください!!


ではここではメインは私の感想を書きます。


1 PHPカンファレンス2016 in 東京について


PHPカンファレンスは4つの地域全てで参加・登壇することが出来ました。
(もしかして全部でSpeakerしたの自分だけなのでは?)
特に東京は事前に伺って居たとおり規模がとても大きく会場も集客もすごかったです。
実際に私のフォロワーさんでも参加している人が多く、その半面、ご挨拶出来なかった人が多かったので残念です。
もっと分かりやすく挨拶できる場を設ければよかったなぁとちょっと反省しています。

カンファレンス本体で言えば当日についてはこれだけの規模をキレイに統制を取ってるので素晴らしいの一言です。
ただ事前準備のところでは


  • タイムテーブルの告知が遅く、地方勢としてはホテルの予約やスケジュール調整に悩んだ
  • 公式サイト等ではタイムテーブルにはタイトルしか無く、セッションの選び誤解やすれ違いがあったのでは無いかと懸念
  • 当日実際に見れるセッションに限りがあって、見るタイトルが事前に決めれなくて悩ましすぎた
  • そもそも自分の裏番組が見たくて見たくて自分のスライド作りのモチベ維持が難しかったw


この辺ですかね
ただボランティアベースのコミュニティですから無理強いするわけでは無いですし、その懸念点を差し引いても圧倒的に素晴らしいカンファレンスでした。
セッションに関しては録画がすでに公開されており、その苦労はイベント主催経験者としては大変な苦労だとお察しします。
早速ですが見れなかったセッション、全て拝見したいと思います!!
また個人的にはもっと一緒に飲みたかった人が沢山居ました。
ただ時間と場所の制約上、ご一緒出来なかった人が沢山いるのでまた来年も参加したいと思います!!

2 全国でのPHPカンファレンスの総括として

全国4箇所で登壇して思った事はPHPerのパワフルさと寛容さです。
PHPのカンファレンスでもRDBの話を普通させて貰えましたし、他にもPHPに囚われず色んなセッションがありました。
また参加者へ大きく門戸が開かれている印象で参加しやすく、また行きたい!と強く感じさせる運営・内容でした。
来年も遊びに行きたいと考えていますので(登壇するかは別として)各地の皆さん、どうぞよろしくお願いします。

3 登壇者として

PHPカンファレンスは普段のDBを知ってる人にDBの話やアプリケーションの話をするとは逆のアプローチで挑みました。
なので「自分にとっては当たり前でも相手が知らない大切な事」を話そうと努力しましたが何処まで伝わったでしょうか。
特に3箇所で話をした実行計画はそれが出来るだけで1枚も2枚も上のエンジニアになれます。
本当に昔に比べて今は簡単に実行計画が見れるようになったので使ってください。
RDBアンチパターンに関しては@tomzohさんの下記のツイートがキッカケで決めました。



実はPHPカンファレンスにはRDBアンチパターン以外にも


  • RDBデザインパターン
  • RDBチューニング


と2つのテーマで応募してたりします。
機会があれば何処かでまた話をしたいと思います。
気になる方はイベントに是非呼んでください!!
RDBアンチパターンについては好意的意見が多いようなのでやってよかったなぁと思います。
他のアンチパターンについてもどこかで機会があればアウトプットしていきたいと思います。


というわけで以上の3点、PHPカンファレンスのまとめでした。
他のカンファレンスについては次のとおりです


では皆さん来年のPHPカンファレンスで会いましょう!!

PHPカンファレンス2017


2016年6月20日月曜日

JPUGという強い組織と世代交代について考えてみた

大前提ですがポエムです。

■前置き

僕はいつも言ってるけどITクラスタや格ゲークラスタ、なんでも良いんだけどコミュニティ(集まり)が大好きです。
特にIT系のコミュニティに育ててもらったと思ってるし、それを恩送りしていきたいと思ってます。
けど「出来る奴ほど東京に吸われる」って構図が僕の世代よりもずっと前から根強くあります。
リーダーシップを取ってた人が何らかの理由で東京に行き、コミュニティが自然消滅を繰り返してきました。
そしてそれは今も現在進行形で起きていて、僕がコミュニティ活動を始めた後も若者は東京に吸われています。
格ゲーも同じ事がここ10数年で起きてプレイヤーが減り、活気がなくなり、地方のゲーセンがどんどん潰れました。
ただIT系に関して言えばビジネスの母体が大きのでゲーセンのように数年で無くなると言うことは無いでしょう。
逆に地方創生と言われる昨今、むしろ巻き返すかもしれません。
そう考えると僕が今考えてる事が杞憂かもしれません。
また僕一人が悩んだところで何も変わらない可能性の方が高いです。
ですが座右の銘である

自分が行動したことすべては取るに足らないことかもしれない。しかし、行動したというそのことが重要なのである。

と思い、色んなactionをとっている最中です。
そんな東京一極集中問題とコミュニティの継続について強い危機感を持っています。

これからもIT勉強会(コミュニティ)は必要なのか本気出して考えてみた


■強い組織とは?

そういう危機感をずっと持って居る理由として過去にゲーセンが継続して欲しいと頑張ってた時期があります。
その時の経験として「一人で出来ることは限界がある」とまなびました。
毎月大会したりしましたが人集めるの大変だし、家族出来るとリソースは減るしどんどん一人で出来ることって無くなります。
その結果、フェードアウトしてしまったしプレイヤーとしても時間が止まってしまいました。

その経験を踏まえた上で現在は中国地方DB勉強会は多くの人を頼って運営されています。
実際に各県のスタッフの人が会場を用意してくださり、集客や準備を行ってくれます。
僕が担当してる事と言えば当日の講師の調整やJPUGの予算申請くらいで仮に僕が死んでしまっても継続の意思があれば継続していける体制になっています。
なので組織としての強さとは「個に依存しないチームとしての生産性の高さ」だと思っています。
俗に言う自立型組織であり、チームがチームとして信頼し高め合っていける組織です。
その点は中国地方DB勉強会については上手く作れたかなと思っています。

■組織の世代交代

しかし強い組織だからと言って「ずっと強いままで維持できる」わけではないなと最近感じています。
具体的な例だと日本PostgreSQLユーザ会はとても強い組織ですが今、大きなターニングポイントに立っています。
まずJPUGの現状ですが6/18に総会が行われました。

JPUG 2016 夏セミナーに参加してきました

ここでJPUGは既存の理事が3名ご退任し、関西支部を除くと2名減となりました。
また@snagaさんが理事長退任されました。
つまり、理事長も含めるとJPUGは組織として3名減です。
辞めていくことは大きな問題では無いと思います。
年齢的な事もあるし自由に選択できることです。
ただ@snagaさんという強いリーダーシップとビジョンを持った人が居なくなった事でJPUGのカラーが少し変わると思います。
でもそれは健全な組織の在るべき姿ですし世代交代の始まりでもあると思います。
しかし問題は「新たな人が入ってこない」ことです。
理事長は色々と議論された結果、高塚さんが引き継ぐ事になりました。
@snagaさんよりも若くなっていません。
高塚さんは能力の有無で言えば文句なく、十分に回せると思います。
しかし組織の世代交代としては若返りは無く、理事が新たに追加もされていません。
つまりこのまま行けば来年も同じように高塚さんが継続するでしょうし、平均年齢はカウントアップしていきます。
実は理事が交代した関西支部も同様で今、理事で20代は沖縄支部長しかいません。
これは僕は由々しき事態だと思っています。
似たようなコミュニティで言えば日本Javaユーザーグループは若い理事の任命、女性理事の拡大など見事に世代交代を行なっているように見えます。
ではこの2つの組織の違いはなんなのでしょうか?
そういったところをもっと危機感を持って見つめ直す必要があります。
それは地方コミュニティでも一緒です。
この問題に対して組織として対応していくことがJPUGが本当の意味で強い組織になるために必要なことです。

■強い組織にしていくためには何をしていくべきか?

それがわかってたら苦労しません。
ピープルウェアに書いてあることを愚直にこなして行くことが必ずしも最適解でもないでしょう。
でも少なくとも

  • 若者に興味を持ってもらうこと
  • コミュニティの楽しさを伝えていくこと
  • 自分のセルフブランディングやキャリアアップに大きなメリットがあること


などを伝えて窓口を広くする必要はあると思います。
なので私は今年は言語系のカンファレンスでRDBの人として登壇してるし、Web系の人たちに対してRDBの楽しさを伝えていきたいと思っています。
これは私が出来るアプローチであって他にもいろいろとあると思います。
例えばみかかデータなら新人社員教育のときに魅力を伝えるのもいいと思います。
僕がリスペクトしてやまない@yoku0825さんはとても素晴らしいアプローチ例です。



なのでJPUGの人は自分の出来る範囲でもうちょっと頑張っていけば面白いと思うし、若者はJPUGのドアを叩いて欲しいです。
私の調査ではJPUの理事の人の給料はWeb系の同世代のエンジニアよりも高いという調査が出ています(そーだい調べ)
つまりそれだけ外部から評価される場所であり、自分を高められる場所であることは間違いないと思います。
そこで私としてはまずslackであったり、開催されるイベントだったりMLにみんなも参加してほしいなと思います。



日本PostgreSQLユーザ会 ウェブ会員登録

また私として出来ることはJPUGの、PostgreSQLの、RDBのエバンジェリストのような事だと思っています。
ですのでお伺い出来る機会があれば全国何処でも伺います(JPUGの予算で)
例えばPythonやPHPのカンファレンスに実際に協賛したり参加したりしています。
ですので是非とも色んなイベントに声をかけていただければと思っています。


■まとめ

この記事を呼んで少しでも興味が湧いていただければ上記のslackやMLから参加し、実際にイベントに参加してもらいたいなと思います。
例えば今だとRailsやDjangoのデフォルトはPostgreSQLなのですから業務でRDBで苦しんでるWeb系エンジニアは必ずいるはずです。
またはOracle Standard Edition Oneからの移行を考えてる人もいるはずです。
そんな人達に私たちはアプローチして行きたいし是非ともコネクションを作りたいと思っています。
これを機に興味を持っていただけましたら是非ともなんらかの形でコミュニティに参加していただければと思っています。

●今年の予定されたイベント

・本部(東京)

- 開催済み

  • 2016/5/14 OSC 2016 Gunma 講演/ブース出展
  • 2016/5/24-25 de:code 2016 ブース出展

- 予定

  • 2016/xx/xx OSC 2016 Tokyo/Fall 講演/ブース出展
  • 2016/9/13-15 WebDB フォーラム 2016 ブース出展
  • 2016/12/2-3 PGconf.Asia 特別共産
  • 2017/xx/xx OSC 2016 Tokyo/Spring 講演/ブース出展

- 定期



・北海道支部

- 開催済み



- 定期

  • 支部勉強会開催


・東北支部

- 予定

  • 支部セミナー


・新潟支部

- 予定



・名古屋支部

- 開催済み



・関西支部

- 開催済み



- 予定



・四国支部

- 予定




・中国支部

- 予定



- 予定



・九州支部

- 開催済み

  • 2016年4月9日 支部勉強会を開催


- 予定

  • 2016/xx/xx オープンソースカンファレンス2016 Fukuoka 講演/ブース出展
  • 定例会を3回程度開催


・沖縄支部

- 予定

  • 2016/06/25 ハッカーズチャンプルー 2016 カンファレンス 参加
  • 2016/07/02 オープンソースカンファレンス 2016 Okinawa 講演/ブース出展


私は理事云々や世代交代云々はまずはコミュニティ全体の若返りと多様性の保持をしたその後に付いて来ることだと思っています。
もし最寄りのイベントがない場合は是非企画を持ちかけてください。
絶対喜んで開催してくれます!!!
ということで皆様のご参加、お待ちしてます!!


2016年4月9日土曜日

今から直近3ヶ月くらいの勉強会予定

そーだいなる予定計画表です。

4/10 中国地方DB勉強会 in 福山(登壇)
4/16 PHPカンファレンス北海道(登壇)
4/27 岡山Python勉強会(登壇)
5/14 オープンセミナー2016@岡山(参加)
5/21 PHPカンファレンス福岡(登壇)
5/28 関西DB勉強会(登壇)
6/04 中国地方DB勉強会 in 米子(登壇?)
6/18 JPUG総会&PostgreSQLセミナー(参加)

しかも5/23と5/24は東京出張があるっていう。
6/11はアイネットバーベキューがあるっていう。
正直そーだいくん、ちょっと予定詰め込み過ぎたかなって後悔してます。
勉強会や新橋会のお誘いの際のご参考にどうぞ。

2016年3月17日木曜日

MySQLに絵文字を保存しようとしたら文字列が消える問題

最近、すっかりPostgreSQLの匂いがしなくなったと噂の私です。
最近MySQLで新たな気付き(問題)があったのでメモとして残します。

まずMySQLは🍣🍻問題があることは知っていました。

MySQL と寿司ビール問題


ではutf8mb4以外で保存していた場合どうなるのでしょう?

・latin1の場合


絵文字は文字化けします。
そして非常に残念な事にALTER文で変更した場合はどうでしょう?
Slackで質問したらみんな大好き@yoku0825さんが試してくれました。

mysql57> create table t2 (val varchar(32) charset latin1);
Query OK, 0 rows affected (0.02 sec)

mysql57> INSERT INTO t2 SET val= x'F09F8DA3';
Query OK, 1 row affected (0.01 sec)

mysql57> SELECT HEX(val) FROM t2;
+----------+
| HEX(val) |
+----------+
| F09F8DA3 |
+----------+
1 row in set (0.00 sec)

mysql57> ALTER TABLE t2 CONVERT TO CHARACTER SET utf8mb4;
Query OK, 1 row affected (0.06 sec)
Records: 1  Duplicates: 0  Warnings: 0

mysql57> SELECT HEX(val) FROM t2;
+------------------+
| HEX(val)         |
+------------------+
| C3B0C5B8C28DC2A3 |
+------------------+
1 row in set (0.00 sec)

…壊れてますね。
この場合は@tmtmsさんのアドバイスを引用すると

latin1 に utf8mb 文字を入れてしまった場合は、データを HEX ダンプして、テーブルを utf8mb4 で作り直して、ダンプデータをリストアって感じで、復旧したことはあります。

とのことです。
辛いやつですね。

ちなみに@yoku0825さんがこちらで詳しく検証してくれてます。

latin1からutf8mb4_binへの変換:yoku0825さんのGist

・unicode*_ciな場合


例えばutf8_general_ciの場合ですね。
この場合は

絵文字を含めた以降の文字が全部捨てられて保存されます


つまり何も残りません。
これが今回のタイトルの現象ですね。
僕はこれに遭遇しました。
MySQL5.6でSQL_MODE=""とかしてた場合Errorも吐きません。
すーっと切り捨ててINSERTされました。
絵文字を使わせないって方針の場合は

sql_mode= STRICT_TRANS_TABLES

とかしとくとErrorで弾いてくれるそうです。



ということで4バイト文字関連ですが
|                    | utf8mb4_bin | utf8mb4_general_ci | utf8mb4_unicode_ci | utf8mb4_unicode_520_ci|
|--------------------|-------------|--------------------|--------------------|-----------------------|
| Hiragana-Katakana  | cs (unkind) | cs (unkind)        | ci (good)          | ci(good)              |
| Youon              | cs (good)   | cs (good)          | ci (critical)      | ci(critical)          |
| Dakuten-Handakuten | cs (good)   | cs (good)          | ci (critical)      | ci(critical)          |
| Wide-Narrow        | cs (unkind) | cs (unkind)        | ci (good)          | ci(good)              |
| Sushi-Beer         | cs          | ci                 | ci                 | cs                    |


https://bugs.mysql.com/bug.php?id=79977

なので


  • 文字コード utf8mb4
  • collation  utf8mb4_bin または utf8mb4_general_ci


とするという結論です。
既存環境でいきなり絵文字が消える場合や化ける場合は上記の環境をチェックしてみてください。
下記の通りになってれば🍻も🍣も登録出来るはずです。

mysql> show variables like '%character\_set\_%';
+--------------------------+---------+
| Variable_name            | Value   |
+--------------------------+---------+
| character_set_client     | utf8mb4 |
| character_set_connection | utf8mb4 |
| character_set_database   | utf8mb4 |
| character_set_filesystem | binary  |
| character_set_results    | utf8mb4 |
| character_set_server     | utf8mb4 |
| character_set_system     | utf8    |
+--------------------------+---------+
7 rows in set (0.00 sec)


# おまけ

さっきのバグチケットですがMySQL5.8でutf8mb4_unicode_520_ciがデフォルトになりそうって噂です。
見ての通りutf8mb4_unicode_520_ciだとクリティカルな問題があるので是非

右上くらいに有るボタンのAffects meポチって

ください!!

2016年2月1日月曜日

ちょっと、たけとも、お仕事(CTO)始めました

まほろばとの想い出を語ってはや3ヶ月。
順風満帆なフリー生活を送っていましたがこの度、就職する事になりました。
まずは就職先ですが下記の会社です。

株式会社 オミカレ

ポジションはCTOです。
取締役ではなく執行役員です。
しっかりサラリーマンに戻ります。
多分、みんなは僕の業務内容なんて1バイトも気にならないと思いますが簡単に説明します。

勤務内容

  • 基本リモートワーク(自宅で仕事してる)
  • 自社モノWebサービスの運営
  • 新規Webサービスの開発
  • 週に1回(必ずじゃないけど)岡山で社長とミーティング
  • コードも書くし設計もする(リードエンジニアに近い)

ってな感じです。
面白いところが何個かあってまず渋谷にオフィスがあるのですが社長とCTOの自分がリモートワークです。
なのでコードは全てgithubですし勿論雪が降れば家で仕事をすれば良いです。
あとはエンジニアは僕以外にもう一人とベトナムにオフショアしながらやってます。
ベトナムにオフショア?まともなコード上がってくるの?っと思うかも知れませんが上手くやって行けてます。
これにはベトナム側に日本人のマネージャが居るってことも大きくていつかこの辺の話も出来たらいいなと考えてます。
それでも前述のとおり僕以外に日本にエンジニアが1人しかおらず、採用も自分のタスクです。
弊社は残業は0が基本で既にタスクがカツカツといえる状況です。
ということで特に渋谷に来てくれるエンジニアを募集してます!!
なので興味がある人は連絡取ってもらえると包み隠ず伝えようと思います。

それと会社の風土ですが元々はサービスは社長が1人で作り出し、順調に育ち、今はビジネスとしては成功しています。
そのためスタートアップにありがちな「利益を出すために死ぬほど働く」って雰囲気は無いです。
エンジニアの業務を見ても残業はありません。
もし彼らに残業が必要となった場合はそれは僕のマネージメントの問題だと思ってます。
また福利厚生や働きやすさについて社長はとても重視していてそういうところは積極的に改善されてます。
実際に

  • オフィスにウォーターサーバ欲しい
  • デロンギのコーヒーメーカー欲しい
  • ○○って本欲しい→即Amazon購入
  • この勉強会に参加&スポンサーして欲しい

などの意見が即決されたりしてます。
僕自身で言えば社長がもう何年も前からの知り合いなので意見具申しやすいので助かります。
例えば社内のチャットツールがSkypeからslackに変更したりしました。
(まだ音声ミーティングのみSkypeを使ってますが)
VCSもgitlabでしたが僕が辛いのでgithubに移行しました。
まだまだ全てがモダンな現場!!と言うには遠いと思いますが変化は確実にしています。
そんな

  • チームの改善
  • 開発の改善
  • サービスの改善

を一緒にやってくださる人を大募集してます!!
なお、メインサービスのコードの全書き直しは直近では予定されていません。
PHPのレガシーコードとの戦いになると言うことが弊社で唯一のデメリットだと思ったりはします。
(それを改善していくのが今後の大きな課題の一つです)
ということで今月から会社員に戻ります。
受託開発についてはしばらくお休みになると思いますがコミュニティへの関わりは積極的にする予定です。
今までは個人エンジニアとしてだけでしたか会社として参加も可能です。
なのでスポンサーなどの相談も是非いただければと思います。
実際にオープンセミナー広島@2016にはゴールドスポンサーとして参加します。

ということで世界を変えるほどイノベーションを創りだす!!とまでは思っていませんが

  • サービスで多くの人を幸せに
  • エンジニアのより良い働き方を
  • 地方に新しい企業文化を

出来るような場所作り(サービス、職場環境含めて)行っていきたい所存です。
今後の活躍にご期待ください!!

2016年1月24日日曜日

Software Design 2月号の特集記事を書きました



もう発売から一週間経ちましたがSoftware Design 2月号の特集記事を執筆しました。
最近は仕事でMySQLをガッツリ使っていて自分としての経験談も含めて比較した内容です。
お互いの得手不得手をそれなりには伝えれたかなとは思います。
ですが本当の意味でのコアな世界は全然足りないと思ってます。
そういう深い部分を中国地方DB勉強会でフォーカスしていければ楽しいなと思ってます。

そして一番伝えたかった事は第七章に詰め込んだつもりです。
なにわのビル・ゲイツこと有山さんにはこんな感じで煽られましたがw



特に最後のコラムのところがかなりポエムになっていますw
ですがそれが伝えたかった事です。
最初の原稿を出した時に編集の人に

「そーだいさんが伝えたい事、もっとあるでしょ?」

と言われて下記のブログを書いたりもしました。

これからもIT勉強会(コミュニティ)は必要なのか本気出して考えてみた


この記事を書いて一番得れたモノは技術とか原稿を書く苦労とかもありますけど

自分が大切にしてることを振り返る機会を得れた

ことだなって思います。
ブログでも同じような効果はあると思うのですがそれを伝える対象が多い分、今回は本当に深く振り返る事が出来ました。
こういった機会があれば皆様も積極的にチャレンジすると得るモノが多いのでオススメです。
ということで書店で見かけたら手にとってみていただけると嬉しいです。

2015年12月20日日曜日

これからもIT勉強会(コミュニティ)は必要なのか本気出して考えてみた

とある雑誌の原稿を出したら編集さんに

「そーだいさん、コミュニティに対してもっと熱い想いあるでしょ?そういうの出してください。」

って言われまして。
原稿の校正納期今日なんだけどもっと自分自身を掘り下げる意味で表題の事を考えた。
なのでただのポエムです。

まず最近、大手岡山Web系セミナーに若手が少ないらしい。




参加者平均年齢が40代超えてるであろうDB勉強会からするとまだまだ若いじゃん?とか思ったり。
でもね、中の人がそういう危機感があるって事は「緩やかな死」を感じてるってことだと思うんですよね。
その危機感を中の人が感じてるのだから間違い無いと思う。
そして危機感をこうやって複数の人がアウトプットするのは大切だと思う。
あと緩やかな死とかコミュニティの継続についてはちょっと昔に考えた事があるので興味がある人はどうぞ。

IT勉強会について本気出して考えてみた

僕は同じような状況をバックエンドとかサーバーエンドと人たちのITコミュニティで感じてきた。
若い人が出てこないとか運営スタッフが変わらないとか。
でも僕は「コミュニティに育てて貰った」って強い感謝の想いがあるしそれを若い人に恩送りしたいと思ってる。
だから


  • 世代交代
  • スピーカーの機会を用意する
  • 参加費を無くして学生でも参加しやすくする
  • 学校とコラボ
  • 他のコミュニティとコラボ


などを試してる。
でも劇的な変化があったかと言うとまだない。
(少しは変化があったかなとは思うけど)
理由としてはやっぱ絶対的に対象の母数が足りてないし。
そもそも若い人が「データベースに興味を持つ」事自体難しい感じになってる。
だいたいデータベースって仕事なんですよ仕事。
仕事で初めて触るし。
仕事で苦しむ。
周りに詳しい人がいない。
だからある程度経験して中堅くらいになってからDB勉強会に来る。
って人が半分以上。
ただ僕よりも先輩には少数だけど@nuko_yokohamaさんみたいに「データベースが遊び」って人もいる。
他にもネットワークだったりDNSだったりlibraryみたいな僕が仕事だと思う所に興味を持って遊んでる人たちはいる。
これって昔は時代の「最先端の技術」がこういう「技術が遊びの人たち」と「技術をビジネスにしてきた人たち」によって「枯れた技術」になった事だと思うんだよね。
だからこそ僕はDBみたいな枯れた技術ってのは儲かる大切だと思うんだけど「目新しさは無い」ってわけ。
でね、これと同じことが最近Webでも起こってるのかなって思う時がある。
僕の大好きな岡山のエンジニアの@kazuhisa1976さんが

最近の若者に聞くとね、Webは仕事って言うの。
じゃあ休みの日は何のコード書いてるの?って聞くとスマフォアプリかUnityって言うのよ。

コレを聞いたらあぁなるほど!!ってなりました。
僕も小学校、中学校の将来の夢にはゲームプログラマになる!!って書いた人なんで憧れも含めて凄くわかる。
自分でアプリ作ってリリースしてレスポンスがある、そりゃ面白いですよ。
それがね、僕らの世代の「技術が遊びの人」はWebアプリだったんです。
多分、先輩方はメールや掲示板やネットワークやOSSだったりしたんだと思う。
つまりWebは「技術をビジネスにする人たち」によって枯れた技術になりつつある。
これは悲観することじゃなくて世の中のインフラとして認められたって事。
だからレイヤーが変わったというか流行り廃りがあったけど若者自体は業界には要る。
だけど僕らの観測範囲に居ないってだけなんだと。
これは僕は経済の神の手と一緒で人材の流動がある事は仕方ない事だと思う。
そして「技術が遊びの人」な若者が多いところでは新たなコミュニティが生まれてる。
実際に岡山でもコミュニティの再開発は生まれつつある。

第一回「岡山Androidもくもく会」
(今見たら若者じゃない強そうなおっさんが数名参加してたけど)

僕は凄くいいことだと思う。
僕がオープンラボ備後手伝ったりDB勉強会やりたいですって言った時に周りの先輩方は「おーやれやれ、どんどんやれ!」って言ってくれた意味が今ならわかる。
こういうコミュニティが生まれてくる事が重要だと思うし広い視野での業界の新陳代謝だからだ。
スタッフをするメンバーも一新されるだろうしイノベーションには多様性が必要だ。
ということでIT勉強会(コミュニティ)は必要か?って結論に対しては必要ならば新しく生まれてくるってのが結論。
だから僕達が必至になって今のコミュニティを継続する必要もないのかもしれない。
実際に元々岡山には日本Androidのの岡山支部があるけど最近の活動が少ない。
その実体からこうして新しいコミュニティが生まれている。
なのでコミュニティもイミュータブルな感じで代謝が止まったら捨てるくらいが新陳代謝が早くていいのかもしれない。

ここまでが僕が今年の夏くらいまで思ってた事。


■既存のコミュニティは緩やかな死を待つしか無いのか

もし本当に「緩やかな死を止めれない」のであれば残りのコミュニティの余生を楽しんだほうが良い。
そう考えるなら内輪ノリとか同窓会と批判されても来てくれる人たちに最適化して楽しんでもらえる方がいい。
そう悩んだりもした。
けど最近MySQLを触っててMySQL Casualの人たちを見たりJJUG CCCに参加してそれもまた違うなと思ってきた。
廃れた技術は緩やかな死を待つしか無いけど「枯れた技術」ってのは仕事で使うことが多々ある。
さっきのデータベースの例もだけど「仕事で初めて使った、辛い」みたいな人たちを救う場所が必要だ。
そういった人たちが助けを求め迷った時に「助け合う場所」の一つの選択肢がコミュニティだと思うしそのために継続されることは大きい意味がある。
多分、それを母体となるビジネス側も理解してるからJJUGだったりJPUGだったりに協賛金が集まるわけで。
だから「技術で遊ぶ」若者を見つけるのは難しいけど「技術を仕事にしてる」若者を救い上げる事はできるかなと。
その中で10人に1人はコミュニティに興味を持ってくれるかもしれないし100人に1人はコミュニティに関わろうと思うかもしれないし1000人に1人はそのソフトウェアのパッチを書くかもしれない。
そういうアウトプットを増やすことでコミュニティの新陳代謝は進むだろうし継続されていく。
そう考えると僕がJPUGのスピーカーというポジションで求められてるのはPostgreSQLの機能紹介でも事例紹介でも無く「苦しんでる人が助かる術」のアウトプット。
そんなアウトプットが仕事で使ってる人の心に刺さるアウトプットだと思うし求められてる。
そう考えて書いた資料が




たちで一定数以上の反響はあったと思う。
まだその反響に対してコミュニティに誘導する手法は模索中なのでそこは改善していく必要があるところ。

なので既存のコミュニティでも「枯れた技術」を扱っているIT勉強会(コミュニティ)は必要。
そのコミュニティが継続するには「技術が遊びの人」向けのコンテンツも大事だけどアンチパターン的なコンテンツが重要。
そして引っかかった「技術は仕事の人」から上手くコミュニティへ誘導して新陳代謝をしていく必要がある。
そもそもコミュニティの運営やスピーカーってコードを書く力とは直結しないから「技術は仕事の人」の方がコミュニティ運営には適してる事が多いんじゃないかなと漠然と思ったりしてる。
だから次は如何に誘導するか、だけどそれは如何に的確な小さな問題を与えるかだと思ったりしてる。

問題にチャレンジしてもらうために必要な事を考えてみた

そんな事を思いつつ、でも恩送りだけじゃなくて自分自身のステップアップも見据えなきゃいけない。
そんなことを考えながら書いた年の瀬のポエムでした。

2015年12月18日金曜日

MySQLの暗黙の型変換の話

この記事はMySQL Casual Advent Calendar 2015の18日目です。
昨日はwinebarrelさんの「binlog_cache_sizeにメモリを食われた話」でした。
こういった実践の話は非常に貴重なので勉強になりました。

さて「PostgreSQLと比べてMySQLのいいところ書く!」を書こうと思ってたのですが昨日こんなツイートを見かけました。





公式ドキュメントを見てみると…

NOT NULL として宣言された DATE および DATETIME カラムでは、次のようなステートメントを使用することで、特殊な日付 '0000-00-00' を検索できます。

SELECT * FROM tbl_name WHERE date_column IS NULL
ODBC では '0000-00-00' 日付値がサポートされていないため、一部の ODBC アプリケーションを取得する際に、これが必要になります。


なるほど。
一部のODBCに対する優しさなんですね!!

そして僕もつい先日、MySQLの暗黙の型変換の優しさを味わったのでご紹介します。

-- テーブルの構造 `hoge`

CREATE TABLE IF NOT EXISTS `hoge` (
  `id` int(11) NOT NULL,
  `val` varchar(255) NOT NULL
);

mysql> SELECT * FROM hoge;
+----+--------+
| id | val    |
+----+--------+
|  1 | ONE    |
|  2 | 2      |
|  3 | Three3 |
|  4 | 4Four  |
+----+--------+
4 rows in set (0,00 sec)


こんなtableがあったとします。
そこで次のように検索してみましょう。

mysql> SELECT * FROM hoge WHERE val = "0";
Empty set (0,00 sec)

mysql> SELECT * FROM hoge WHERE val = 2;
+----+-----+
| id | val |
+----+-----+
|  2 | 2   |
+----+-----+
1 row in set, 3 warnings (0,00 sec)


想定した感じですね。

mysql> SELECT * FROM hoge WHERE val = 4;
+----+-------+
| id | val   |
+----+-------+
|  4 | 4Four |
+----+-------+
1 row in set, 3 warnings (0,00 sec)


あれ?文字列がマッチしましたね…
あっ!これPHPの文字列からintにキャストした時と一緒か!?

mysql> SELECT * FROM hoge WHERE val = 3;
Empty set, 3 warnings (0,00 sec)


あれ?Three3が出ない…

SELECT * FROM hoge WHERE val = 0;
+----+--------+
| id | val    |
+----+--------+
|  1 | ONE    |
|  3 | Three3 |
+----+--------+
2 rows in set, 3 warnings (0,00 sec)


Why,MySQL People!!

そしたら我らが@yoku0825さんが次のように教えてくれました。

val = 0の場合、0を文字列にキャストするのではなく、valをDOUBLEにキャストして0と比較しています。
英字で始まるSTRINGはDOUBLEにキャストできずにキャスト後の値が0になりますが、123abcのような文字列は「できるところまでキャストする」ので、キャスト後の値は123になります。
つまり123 <> 0です
ってことで、「数字で始まらないval」のものだけが検索に引っかかるわけです。
そして逆に数字から始まらない文字列はWHERE val=0に該当するわけです。

勉強になりますね!!
ちなみに僕が暗黙の型変換僕がハマったのはPHPのSESSIONをDBに保存している場合に検索しようとすると引っかかりました。
DBにSESSIONを保存することは多々あって例えばEC-CUBEやMagic3などのCMSも保存してるのでみなさんも検索の時はご注意ください。

ということで僕のMySQLエキスパートへの道は遠いようですw
それでは最後はとみたさんのお言葉で締めあせていただきます。



みなさんも良いMySQLライフを!!

2015年12月7日月曜日

FuelPHPを快適に開発するためのNetBeansで設定まとめ

このブログはFuelPHP Advent Calendar 2015の7日目です。

昨日は@wataさんの「DBUnit拡張を使ったFuelPHPのテストを考える」でした。
今日はみんな大好きNetBeansの話します。
それでは早速行きましょう。

まずはNetBeansのダウンロードリンクです。

あなたとNetBeans、今すぐダウンロード


普段IDEを使ってない!って人はこちらも合わせてどうぞ。

PHPerがNetBeansを使いたくなる7つの理由


インストールが済んだら本題です。

1. ルーク、FuelPHPプラグインを使え!!

兎にも角にもまず入れるのはこれです。
@junichi_11さんが作っているこのプラグインを使いましょう。
@junichi_11さんがまとめてるブログはこちらです。

NetBeansではじめる FuelPHP


このプラグインを使うとNetBeans上からスケルトンを作ったり、正しくFuelPHPの補完や関数ジャンプ出来るようになります。
Coreのコードを読んだり、知らないメソッドを知るきっかけにもなるので是非ご利用ください。
僕がPHPStormに完全に移行出来ない理由はこのプラグインがあるからと言っても過言ではありません。
Symfony2書く時とかはもう完全にPHPStormなんですけどね。
完全無料環境なのでお財布に優しいです!!

2. その他の設定


■Windowsの人は必須


  • Show and change line ending
  • Change Line Ending on Save


Show and change line endingは改行コードをLFにしたり今の改行コードを表示したりします。
Change Line Ending on Saveはデフォルトの改行コードを指定して保存するときに一括して改行コードを変更して保存してくれます。
私はLF固定にしてます。
あとはここからはお好みですが私はvagrantプラグインを入れてNetBeans上からを操作できるようにしてます。
vagrantを操作するためだけにターミナルを開かなくていいので便利です。
更にwindowsはsshクライアントがデフォルトで入っていませんがvagrantへのsshは出来るようになります。
gitからvagrantの使い方まで知りたい!って人は@kenji_sさんの本を読むと全部書いてあります。



PHPUnitなどの設定はお好みでどうぞ。
個人的にはPHPUnitのバージョンにテストコードが依存することがあるのでvagrant側で実行する事多いです。
プロジェクトが一つでチームで同じバージョンを共有できる場合などはインストールしてIDE上で実行する方が便利だと思います。

3. インデントの乱れは心の乱れ

PSR-2に準拠しないとプルリクエスト送った時に怒られます(自分は怒られた事がある)
なのでフォーマットを指定しましょう。


  1. ツール→オプション→エディタ→フォーマット
  2. 言語を「PHP」
  3. カテゴリを「中括弧」
  4. クラス宣言とメソッド宣言を「改行」に変更




ちなみにPSR-2準拠だとインデントはタブでは無くスペース4つです。
そしてPHPの予約語は小文字で使用しなければなりません。
つまりNULLはnullです。
デフォルトは大文字なので変更が必要です。
やり方はNetBeansの設定ファイルを直接編集します。
Windowsでエディタで編集する場合は管理者権限が必要ですのでご注意ください。

  \インストールフォルダ\php\phpstubs\phpruntime\Core.php

私はデフォルトの場所にインストールしたので

  C:\Program Files\NetBeans 8.0.1\php\phpstubs\phpruntime\Core.php

です。
それを次の通り編集します。

define ('TRUE', true);
define ('FALSE', false);
define ('ZEND_THREAD_SAFE', false);
define ('ZEND_DEBUG_BUILD', false);
define ('NULL', null);

↓↓↓

define ('true', true);
define ('false', false);
define ('ZEND_THREAD_SAFE', false);
define ('ZEND_DEBUG_BUILD', false);
define ('null', null);

これで補完もバッチシです。


以上を設定すればプロジェクト作成時からFuelPHPの対応が完璧になったはずです。
快適なプログラミングライフをお楽しみください。

明日のFuelPHP Advent Calendar 2015@tanaka8comさんです。
楽しみですね!!

2015年10月16日金曜日

@soudai1025がまほろば工房との想い出を語る

実は今日は最終出社日です。
@soudai1025、仕事辞めるってよ。」から2年と4ヶ月。
気がつけば早いもので株式会社 まほろば工房に来てそれだけの時間が過ぎました。
publicな場所で自分の職場を堂々と言える会社ってのは初めだったので今思うと良い転職だったなぁと思います。
そんなわけで感慨深いものがあるのでちょっと想い出語りします。

まほろばの想うところはいっぱいあるけど個人的に一番好きなのは

コミュニティ活動に対して積極的な支援があること


ですね。
僕はコミュニティが大好きだし、コミュニティに育ててもらったと思ってます。
そのコミュニティに対して会社が理解ある&支援があるってはもう仕事中にビール飲めるみたいな感覚です。
(ちなみに弊社は実際に仕事中にビール飲んでも問題無いです)
エンジニアの会社って言う会社はいっぱいあるとと思うけどまほろば工房は本当にエンジニアの会社です。
社長自体もJANOGの元会長だしNetWorkコミュニティのすごい人もいっぱいいます。
なので必然的にコミュニティ活動は重要な活動として支援してくれます。



このツイートとか社風をよく表していて例えばCROSS 2015は会社に交通費と宿泊費を出して貰いました。
ただ会社で行く場合は建前上、報告書とか必要です。
これは社長の方針として上手くネゴすることもスキルの一つと言うことかららしいです。
ちなみに出張報告書と言っても経費精算みたいなもんです。
JPUGの予算稟議の方が数倍厳しいです(それでも普通の会社の稟議より超緩いですが)
なので平日の勉強会参加は勿論、気軽に遠方の勉強会参加が出来るようになったのは本当に嬉しかったです。
更に凄い所は自分が「イベントやりたいけど金無いんで協賛オナシャス」に即答でスポンサーしてくれたこと。
実際に




の2回協賛してもらいました。
特に合同DB勉強会は





って事があったので本当にスポンサーしてもらってよかったと感謝しています。
コミュニティ活動をしたい、楽しみたいって人にとっては最高の環境だと思います。

あと好きなのは

裏福利厚生が充実してること


これは転職サイトとか会社ホームページからではわかんないですよね。
実際には





があります。
まぁでもエンジニアとしてやっぱ知りたいところは開発環境ですかね。



基本的に自由です。
Windowが多いですけどMac使ってる人もいます。
あと自分のノートPC持ち込んだりも出来ます。
実際に僕はキーボード(Realforce)やマウス(ロジクール)やモニタ(MITSUBISHI)を持ち込んでます。
そもそも会社でAmazon受け取りOKなので本などは会社に着くようにしてたりします。
ちなみに実際に使うことが多いのは


  • Linux(CentOSもUbuntuもあります)
  • PostgreSQL(僕の権限によりPGですがMySQLもあります)
  • PHP(フレームワークはFuelPHP使ってます)
  • ヤマハルータ(あとVyOS)
  • VM Wear(KVMとXenはちょろっとある)
  • Git(VCSはgitbucket)


ってな感じです。
僕はアプリケーションより下のレイヤーはまほろばに入って本当に鍛えられたと思います。
Linuxの基礎的な知識やカーネル周りの挙動は詳しい人が多いので勉強になります。
最近だとコンテナ化もやったりしました。
勿論デメリットもあります。



そうです、残念ながら篠崎愛はいないんです(´;ω;`)ブワッ

まぁ冗談はこれぐらいにして技術者として学ぶことが多い職場だと思います。
僕はちょいちょい社内ツールや会社ページのリプレースなんかで新しい技術を導入しました。
そういう技術選定権限の自由さは前職にはなかったので上から下まで学べたなと思います。

ということでエンジニアとして学ぶには良い会社だったと胸を張って言える会社です。

あと社会人、まほろばのチームの一員として。

僕はチーム最年少です。
入社時は20代でしたが今は30なので会社に20代がいません。
これはまほろばの課題だと思ってます。
僕が退社後、数名入社予定ですがみんな30代です。
技術要求度とかスキルマップ的に年齢層があがります。
そこはわかるのですが世代交代や技術継承も考えていかなきゃいけない課題です。
まだまだ暗中模索してる感の強いところなので今後パワフルな若手とか入ると期待してます。

メンバーの一員としてみたらみんな優しくて風通し良い会社です。
直属の上司は女性だったのですが本当に良くしていただいたと思います。
私の悪い癖で時々感情的に批判的な言動をする時があります。
そういう時も冷静に諭していただいて大人の対応とは何かを学ばせていただきました。
こういう精神的な成長がこの2年間で一番多かった気がします。
若い人が多いチームはそれはそれで面白いです。
ですが社会人として先輩から学ぶこともまだまだ多いなと感じました。
勿論、若い人から学ぶ事も沢山あります。
ですので「他者から学ぶ事に年齢は関係ない」です。
ですが孔子も論語で言ってますが年齢によって変わる思想もあると思います。
そういった人間的な意味でもまほろば工房は良いチームだなと思います。


ということで振り返った結果、本当に良い会社だったなぁの一言に尽きます。

ちなみに今後は一応方針は決まっています。
ですがまだ未定な所も多いのでしばらくは多分フリーでダラダラしてます。
元々昼は自宅で食べてたし家でもコードは書けるので生活環境は大きく変わりません。
なので暫くはTwitterに居るのは変わらないとは思いますw
でもこうやって会社でブログを更新することもなくなりますね...
(今思えばこのブログの大半は会社で更新されてるわけですが)
と最後は少しセンチメンタルな感じになりましたが今後もまほろば工房をよろしくお願いします。

ということで取り敢えず干し芋置いときます。

私は真に驚くべき欲しい物を見つけたが、この余白はそれを書くには狭すぎる


2015年10月6日火曜日

問題にチャレンジしてもらうために必要な事を考えてみた

私は人が成長するときは


  • 行動した時(そしてその最中)
  • 結果を振り返った時(失敗、成功を問わず)


の2つだと考えてます。
その2つを得るには問題にチャレンジすることが非常に重要です。
つまりチームやメンバーが成長していくためには如何にチャレンジを繰り返せるかです。
しかし元も子もない話をすると私は「崖から落とされたら勝手に這い上がってくる」タイプです。
ですから成長方法は基本的に崖から落とされて真っ向から突き進んで失敗したり解決したりして強くなってきました。
この手法を個人的にはサイヤ人ブートキャンプと言っていて、死にかけて強くなるので高速に成長します
ただし、用法用量を守らないと死にます(精神または物理で)
ですので他の人に勧められる方法ではないなと悩んでいます。
そして不幸な事に地球人が崖から落ちてしまう事もあります。
そんな時、助ける術も必要だなぁと最近良く考えているので整理してみます。

まず@razonさんが仰るとおり



がすべてを表しています。
私には階段が思いつきません。
そもそもこのツイートを見て「なるほど、階段って手があるのか!」と目からウロコだったほどです。
実際にはエレベータだろうが階段だろうが「そもそも登らない」だろうが選択肢はN択です。
なのでバカ正直に真っ向から登る必要は無いのですが私は真っ向から登って登れてしまうので発想が貧弱なのです。
「人間は経験したことしか想像できない」ものです。
だからこそ、このアウトプットを元に新たなインプットに期待してます。


と前置きが長くなりましたが本題。

アジェンダは


  1. チャレンジする人のメンタルモデル
  2. チャレンジの手法について
  3. 実際にチャレンジしてもらうには


です。
では早速本題に入ります。

1. チャレンジする人のメンタルモデル

チャレンジャーな人は活発的な人が多いとかそういうのは関係ないです。
ここは単純に

チャレンジした結果、成功した体験がある

って事に集約されると思ってます。
これは幼少期からこれまでの間の成功体験を元に問題解決を計ります。
大切なのは

成功体験の内容でチャレンジの手法が決まる

というところです。
これは2.に繋がるのですが冒頭でも触れた「人間は経験したことしか想像できない」というところにも繋がります。
逆説的ですが成功体験が無い場合、チャレンジをするメリットもわかりませんし、手法もありません。
これは卵が先か鶏が先かの難しい問題も秘めています。

2. チャレンジの手法について

1.でも触れたとおり、成功体験が重要です。
真っ直ぐ登って登れた人はまずは登ろうとします。
周囲に階段を作って成功した人を知っていれば階段を作り始めるかもしれません。
具体的には私は素直な子?でしたから問題については実力行使(物理)で突き進んできました。
ですので現在もよく崖から落ちたら真っ直ぐ崖を登り始めます。
これがチームの場合、大抵多くの人が「私には無理だ」と呆れてついてこれません。
これも過去何度も経験しました。
また素上りした結果、落石などのアクシデントやヒューマンエラーなどで何度も死にかけました。
その結果、最近は

  • 流石に素上り危ないから命綱を持とう
  • 一人では限界があるからサポートメンバーを持とう

などの選択肢を覚えてきました。
これが問題解決のノウハウとよべる部分です。
ですがこのノウハウは基本的には問題に真っ向勝負志向の人です。
階段派などにはこのノウハウを共有してもなかなかマッチしません。
つまりノウハウを共有しても必ずもすべての人に有益とは限りません。
そしてチームは多様性を持つべきですし色んな人がいます。
ですので往々にして多くの人にとって有益なノウハウとなりません。
これでは周囲はなかなかチャレンジできません。
ですのでビスマルクの

愚者は経験に学び、賢者は歴史に学ぶ

が大事だと思います。
つまりは他人の成功体験を知る
しかしこれは好きな女性が相手ならまだしもどうでもいいおっさんの場合は苦痛です。
しかも自分と考え方の指向性が違えば自分のノウハウとして蓄積しない(共感できない)ため尚更です。
なので情報収集のスタイルも十人十色だと思います。
ここでは私の代表的な情報収集スタイルをご紹介します。

・本を読む

ありきたりですが確実に情報を収集できます。
多くの手法を学ぶには一番手っ取り早いかもしれません。
また新書で出てることが多くちょっとした時間で読むことができます。
ただしデメリットが2つあって一つは基本的に良い話しかありません
罠や泥臭い話は映えないのでカットされがちです。
それと大分話を盛ってあることも多いので鵜呑みにすると痛い目をみます
誰もが若かりし青春時代、ニーチェを読み、ユングを読み、痛い厨二病時代があった思います。
また意識高い新卒にありがちなビジネス書や自己啓発本に毒されて応用が利かない時代もあったと思います。
人それぞれですが偏ると何事も毒になるので要注意です。

・飲み会に行く

基本的におっさんは自分の成功体験の昔話を若者にしたがるものです。
なので飲み会にホイホイ付いて行けば自然とその話を聞くこともできるでしょう。
これは自分に近い立場の人ほど自分に近い経験なので情報として有益です。
また成功体験と言ってもそのプロセスの詳細も聞けるので本には無い罠や泥臭い話も聞けます
ただしこのデメリットは


  • おっさんは酔っ払うと話がループする
  • 同じような話を毎回する
  • 途中から説教になる


があります。
なのである程度一通り聞いてしまうとそれ以上の情報収集は難しいです。
このリスク回避は非常に難しいのですが下記の方法を取ると評価を上げるチャンスになります。



もし会社の飲み会がつまらないなぁと思うなら上司の話を話半分に聞きながらやってみてください。
酔っ払いのおっさんほど効果抜群です。
20~30分前に行ってた事をオウム返しするだけでも十分です。
するとおっさんも「君は見込みがあるなぁ!」など言い出すでしょう。
そうなると次回の飲み代も出してくれるはずです。
今度はいい飲み屋知ってますよ!!とか言ってちょっと普段行かないお高いお店行ったりして有効活用しましょう。
おっと話が脱線しました。
会社の飲み会だけでなくエンジニアの集まる勉強会や地域の会合などにも同様の効果があります。
こちらは会社よりもメンバーの流動性が高いので多くの話を聞くことが出来るでしょう。
こういう場を上手く活用すれば現場の生の声を沢山得ることが出来ると思います。


私の場合はこの2つがメインの軸です。
なので機会があれば皆様の成功体験を聞かせていただければと思います。
また情報収集についても「こんな方法もあるよ」というのがあれば是非教えていただければと思います。


3. 実際にチャレンジしてもらうには

1と2の結論として


  • 本人(またはチームに)成功体験がある
  • その成功体験にマッチした手法がある


この2つが重要だと言う結論になりました。
しかしもう一つ重要な要素があります。

適切な大きさの問題

であることです。
みなさんもチャレンジする側が成熟していないのに大きい問題にぶつかり挫折する。
そんなシーンを見たことがあるのではないでしょうか。
この適切な大きさの問題については@snagaさんに面白い記事を紹介してもらいました。



ここでは成功体験の有無や手法など関係なく

適切な問題が生まれれば自然と解決する人が生まれる

という話題が出てきます。
これは私も経験があります。
つまりこの2つをまとめると


  • チャレンジさせたい人には適切な問題を与える
  • 解決したい問題を適切な問題に細分化し再配布する


これが成長するマネージメントのコツなのでは無いかと思います。
そうなると1の成功体験の有無は関係ないように見えます。
しかしこれは「自ら適切な問題は見出したり細分化する際に必要」なことなのです。
なので多くの成功体験を持った方がセルフマネージメントに長けた人になるのです。
また2の多くの成功手法を知る人が適切なチームマネージメントを行える人になるのです。
もっと視野を広げれば「適切な問題を生み出せる」事が経営者やリーダーとして適正なのではないでしょうか。

ということで以上の事を踏まえた上で私は今、「適切な問題を生み出す」とは何なのか考えています。

2015年8月25日火曜日

MySQL使いの人がPostgreSQLを始めるときの罠をまとめてみた

昨日書いたエントリがなかなかいい感じに拡散された。

MySQL使いが知るべきPostgreSQLとの違いと変わらない一つのこと


で気付いた。
多分本当にMySQL5.7の罠が理由でPostgreSQLに移行する人は上のエントリを求めてない。
つまり本来ターゲットにすべき人は


  • SQLはORMが解決してくれるから違いなんて気にしない
  • ロジックはSQLではなくアプリケーションコード側が行う
  • DBはデータを置くストレージだ、いいね?


みたいな人だ。
前述のエントリでよしPostgreSQL使おう!!って人は多分MySQL使っても乗り越えていける人たちだ。
勿論そんな人達がPostgreSQLに来てくれるのは嬉しいし大歓迎。
それとは別にもっと窓口を拡げるために必要な移行時の罠をまとめておく。
これはMySQLと比較しながらPostgreSQLの事を書く。
だが初めてPostgreSQLを触る人は知っておいた方が良いことのまとめになるはずだ。


1. DBを作成するときの罠


一番最初にPostgreSQLをLinux等にインストールすると
service postgresql-9.4 initdb
をまずはすると思う。
その場合、PostgreSQLのデフォルトのロケールはOS側に設定されているロケールを使用する
つまり多くの場合は

ja_JP.UTF-8

となる。
これに伴いDBが壊れるということはない。
ただしソート順に影響する。
具体的には

日本語ロケールでは辞書順(カタカナ→ひらがな, 清音→濁音→半濁音) の順にソートされる

のだ。
多くのシステムの場合、これは想定外のソート順になる。
そのためDBを作成する際には

service postgresql-9.4 initdb --locale=C

service postgresql-9.4 initdb --no-locale
を指定することになる。
どちらも同義である。
こちらを行うことにより文字のバイナリ値を基準にしたソートになる。
絵文字でソートしたい場合も安心だ。
詳しくは下記のエントリを参考にして欲しい。

ロケール(国際化と地域化)



2. アクセス制御の罠


MySQLに対するアクセス制限はmy.cnfに
bind-address = 127.0.0.1
と書いたりMySQLのuserテーブルで指定したりする。
それに対し、PostgreSQLはDBをインストールしたフォルダ内のpg_hba.confで制御する。
こちらについては先日紹介したとみたさんのエントリでも紹介されている。

MySQLユーザーがPostgreSQLを触ってみたメモ


その際に気をつけてほしいことがある。
それはMETHODの指定である。

host    all    all    192.168.0.0/24    trust
としてあったとする。

これは192.168.0.1~192.168.0.255のIPアドレスからのアクセスはパスワード認証無しでアクセスできる設定だ。
もしこのDBが外に晒されており、全てのIPを表す0.0.0.0/0を指定した場合は自由にアクセスできる事になる。
PostgreSQLはdefaultでスーパーユーザーとしてpostgresというユーザが作成される。
この状態でpostgresユーザでアクセスすれば...結果は明白である。
笑い事に聞こえるかもしれないがEC2やVPSでDBを作っている場合に一時的にtrustを指定する人を見かける。
そして設定は明示的にに読み込みを行わなければならない。
ここに大きな罠があり


  1. 確認のためpg_hba.confに0.0.0.0/0 trustを指定して起動。
  2. テスト終了後、pg_hba.confを修正
  3. 再起動時や再読み込みを忘れる


とするとpg_hba.confは正しいのに誰でもアクセス出来る状態のままとなる。
せめてmd5を指定するようにしよう。

host    all    all    192.168.1.1/32    md5

詳しいpg_hba.confの説明等は公式documentを読んで欲しい。

19.1. pg_hba.confファイル


なお蛇足だがそもそもpostgresql.confの設定で

listen_addresses = '*'

を指定しないとdefaultではlocalhost以外からアクセス出来ない。
設定箇所が2箇所あるので要注意だ。


3. テーブル作成時の罠

MySQLからPostgreSQLに移行した時、仮にpgadmin3を使って型を指定しようとしたら驚くだろう。
余りにもデータ型の種類が多いからだ。
データ型についてはまず公式documentのリンクを紹介しておく。

第 8章データ型


君たちが欲しいのは


  • 数値型
  • 文字列型
  • 日付/時刻型


だと思う。
それぞれについて簡単に解説しておく。

●数値型

通常は


  • bigint  8byte整数
  • integer  4byte整数
  • smallint 2byte整数
  • numeric  MySQLのDECIMAL相当
    (MySQLではnumericはDECIMALのエイリアス)


で事足りると思う。
ただPostgreSQLにはこの他に論理値データ型として


  • boolean  1byte


がある。
勿論入るのは0 or 1 or NULL(許可した場合)だ。
SQLとしてはtrue or falseでもよい。
他にも柔軟に受け入れるので使う場合は公式documentをチェックされたい。

論理値データ型


そしてサロゲートキーを使いたい場合にMySQLはAUTO INCREMENTを指定すると思う。
AUTO INCREMENTはPostgreSQLには無い
その代わりシーケンスを作り、該当の整数型のdefaultにnextval(シーケンス名)を指定することで同義になる。
とは言ったもののその手順は煩雑だ。
そのため最初から


  1. 整数型の指定
  2. シーケンスの作成
  3. 該当シーケンスをdefaultに指定


を全て丸めてやってくれる型がある。
それがserial型だ。


  • bigserial   →  bigint
  • serial     →  integer
  • smallserial  →  smallint


なおPostgreSQLのシーケンスは最大値に行った場合にCYCLEの指定の有無で周回するか決まる。
CYCLEを指定しない場合はNO CYCLEとなり周回せずにエラーが発生する。
だがserial型で作った場合はCYCLEが指定されない=最大値になるとエラーが発生する。
また自分で設定すれば連番の取得の昇降やSTEP、MAXやMINも指定できる。
CYCLEを指定して周回するIDも作れる。
またAUTO INCREMENTと違い複数テーブル(またはカラム)からも参照、指定することが出来る。
シーケンスはMySQLには無い概念なので一度調べてみると設計の幅が広がるのでオススメだ。

●文字型

PostgreSQLの文字列型は


  • character varying 可変長
  • varchar      character varyingのエイリアス
  • character     空白を埋める固定長
  • char        characterのエイリアス
  • text        制限なし可変長


となる。
実際は可変長、固定長、制限なしの可変長だ。
多くの運用の場合、固定長を使うメリットがない。
なので可変長のcharacter varying(以下varchar)かtextを使うことになる。
またvarcharとtextの違いは制限の有無のみだ。
そのため参照速度だけで言えば制限のオーバヘッドの少ないtextの方が早い
また制限する場合は


  • varchar(n)


とnを指定することになるがnは文字長(文字数)だ。
バイトでは無いので注意が必要だ。
(MySQLの場合のVARCHARはバイト数)
(MySQLも文字数だった、yoku0825さんご指摘あざます!!あと誕生日もおめざす!!)



仕様として標準SQLに準拠しているのだがそもそも標準SQLの仕様に癖がある。
一度公式documentを拝読しておくと救われるかもしれない。

8.3. 文字型


またMySQLとの大きな違いとしてPostgreSQLの文字列型は文字の大小を区別する
('A' != 'a'である)
つまりMySQLのBINARY属性を指定した状態と同じ挙動である。
文字列に関してはMySQLと大きく違う仕様が多いので注意が必要だ。
(これは逆も然りでPostgreSQL使いがMySQLを使う際に多くの人がこの罠にハマる)
蛇足としてPostgreSQLの多くの関数は文字列を受け付ける際はvarcharを指定してもtextにCASTされる。
そういった理由からよく文字列型は全てtextを指定する設計も見かける。
その場合は不正なデータを入れられた時の予防やディスク容量計算が難しくなる。
適正な型指定はデータを守るのでCHECK制約と合わせて使いわけよう。
更にPostgreSQLには列挙型(enum)もある。

8.7.1. 列挙型の宣言


(MySQLにもEnumがあるらしい)



CHECK制約とは違いデータにソート順を持たせることが出来る。
覚えておいて損はないだろう。


●日付/時刻型

日付/時刻型は

  • timestamp  日付と時刻両方を持つ 例:2015-01-01 00:00:00
  • date     日付を持つ(時刻無し) 例:2015-01-01
  • time     時刻を持つ(日付無し) 例:00:00:00
  • interval   時間間隔       例:1 year 2 months 3 days 4 hours 5 minutes 6 seconds

がある。
timestampはMySQLのdatetime相当だ。
timestampとtimeについてはtime zoneを持たせることが出来る。
(これによりMySQLのtimestampを表現することが出来る)
指定した場合はUTCとして内部で持ち、表示の際に設定されたタイムゾーンに合わせて計算してくれる。
国内で使う場合はタイムゾーンを指定しないtimestamp without time zoneで問題ない。
またMySQLのtimestampのdefaultのようにUPDATE文の対象になった際に自動的に対象レコードの指定columnをCURRENT_TIMESTAMPで更新する機能は無い。
同じようにしたい場合はトリガーを書くことになる。
これは非常に便利なのでPostgreSQLにも欲しいところだ。
またintervalについては癖の強い型だ。
そのほかの日付/時刻データ型と合わせて公式documentを見ていただきたい。

8.5. 日付/時刻データ型



●配列型と範囲型

補足としてPostgreSQLは配列型と範囲型がある。
どちらも強力な機能だが乱用は毒にもなる。
公式documentと例を上げているエントリを紹介しておく。



4. ORMの罠

RoRを使う人は問題ないがPHPerはFrameworkのORMが対応してないことがある。
まさにFuelPHPの話だ。
私は標準のクエリビルダをラッパーし自作ORMを作成しているがこれは万人向けではない。
そのため、もしPostgreSQLに対応したORMが必要な場合はDoctrine2をオススメする。
ただし悲しいことに公式documentは英語しかない。
しかしDoctrine2はSymfony2のORMだ。
そのためSymfony2の公式documentを読むことで使い方を知ることが出来る。

Symfony2


FuelPHPでインストールする場合はComposerに対応しているので安心して欲しい。

FuelPHPでdoctrine2を使ってみた


またDoctrine2を利用すればスキーママイグレーションも出来る。
(FuelPHPの標準のスキーママイグレーションはMySQL専用なので動かない)



ここまで来た君は手元のアプリケーションからDBに接続し、自由にテーブル設計できたはずだ。
長くなったので今日はここまでとする。
この後、運用で困った事があればメーリングリストで聞いてみるといい。
きっと誰かが答えてくれるはずだ。

PostgreSQLユーザ会 メーリングリスト


それでは検討を祈る。

2015年8月10日月曜日

餃子の皮から作るか既成品を買って来るかの話

弊社は素晴らしいCのプログラマばかり。
僕はほとんどCを書かずLLの甘えた環境で富豪プログラミングするので社内で良くディスカッションになることがある。
それは

  ◯◯を0から作るか外部から持ってくるか

という話。
◯◯はLibraryだったりサービスだったり色々あるのだけど僕は車輪の再開発は極力しない派。
Libraryの学習コストを含めても0から作るより持ってきたほうが良い品質で早く出来るから。
でも社内では時々で0から作ったほうが早い(納期も速度も)という話が出てくる。
たしかに既存のLibraryをラッパーしたりそれを改修したりするぐらいなら作りなおした方が早いこともあるのだけど「正気か?」みたいな規模の時でも発生する。
しかも事実彼ら(Cプログラマ)はほぼ当初の予定通り工数で仕上げてくる。
この現象についていい名前無いかなぁって話をオープンセミナー香川の懇親会で話をしたら@blue48さんが

「それはね、餃子の皮だよ」

と表現して感銘を受けた。
確かに職人はスーパーに言って餃子の皮を買って来るより自分で作ったほうが早いし美味い。
逆に俺みたいなパンピーは餃子の皮を買ってきたほうが早いし美味い。
どちらが正しいとかじゃなくて餃子に関して言えば

・前者はそこでしか食べれないクオリティの高い餃子を提供できる
・後者は安い早いそこそこ美味い餃子を提供できる

なので方向性の違い。
でその方向性の違いなんだけどエンジニアにもそれは言えるよなぁと。
つまりは自分が何処でスペシャリティを発揮するか。

そうやって自分のエンジニアとしてのポジションを振り返った時に色々思うこともあるなぁと言うお話でした。

なお、妻は餃子の皮は作る派です。

2014年10月1日水曜日

Doorkeeperの参加者一覧.xlsxをhtmlのTableにする

また必要になりそうだから自分のメモ書き。
まずDoorKeeperのExcelのダウンロードはこれを使って自動化する。

Doorkeeperの参加者一覧.xlsxのDownloadを自動化する


でそのExcelファイルをWebに表示するようにPHP書いた

viewExcel2Table


名前カッコ悪いけど勘弁して下さい。
sampleで動くようにしてるのでDocumentRootに配置したら最初から表示するはず。
なのでExcel差し替えてconfig.iniの値をいじれば目的のTableレイアウトにはすぐなると思う。
なお、CDNでBootstrapとjQueryを読んでるのでネットワークに繋がらない環境だとうまく表示しないと思う。
そこら辺は臨機応変に使ってください。
またDoorKeeperをターゲットにしてるけどExcelであればなんでも動くので他のExcelでも流用が聞くと思います。

あと一番大事なこと(ならREADME.mdに書けよ)だけど

PHP5.4以上じゃないと動きません。

クロージャー使ってるしArrayは省略記法だしとかも使ってるし。
まぁでもPHP5.3の環境とかもうないよね!!
てなわけで誰かの参考になれば幸いです。

参考情報


LibraryでPHPExcel使ってるけどライセンスはLGPLなので再配布物には公開義務とかありません。
(商用利用出来るよ)

2014年9月30日火曜日

Doorkeeperの参加者一覧.xlsxのDownloadを自動化する

今年だけで二回ほど表題のことをする必要があったんでメモとして残します。
実際の手順としては


  • さくらクラウドにubuntuサーバを建てる
  • 環境構築
  • cronで実行


です。
最初はwgetで余裕だと思ったらCSRF対策がログイン画面にされてた。
なので力技だけどSeleniumで対応しました。
SeleniumでFirefoxを立ち上げてダウンロードするだけなので実際のコードは大した事無いですが一応Githubに残しました。

getDoorkeeperExcel


環境構築の方法と設定はREADME.mdに書いてる通りです。
SeleniumはPythonで動かしてますが2.7以上であれば動くと思います。
(Linuxに標準でついてくるPythonで動きますので3系のinstallは不要です)

例外処理とかそういうのは面倒くさい入れてないのでちゃんとしたい方は修正してください。
他にもログインとか必要なWebサービスのダウンローダーとしては簡単に用意できます。
なので請求書落としたりなどご自由にカスタマイズしてお使いください。

ついでに落として来たExcelをWebのTableで表示するのも一緒に作ってます。
参加者アンケートを公開したいときなどにお使いください。

Doorkeeperの参加者一覧.xlsxをhtmlのTableにする

2014年9月9日火曜日

2014年版 WEB系の開発をするために必要な10の開発環境 ~Windows~

ずっと使ってたZenBookのマザーボードが亡くなられ、初期化されました。
なのでこれを機に開発環境を見直しました。
2年前のまとめはこちら

WEB系の開発をするために必要な10の開発環境 ~Windows~



この頃からはツールも変わったモノもありますしそのままのモノもあります。
ですが必要な項目は依然変わってないと思いますので項目は踏襲します。



1 IME

前回はGoogle日本語入力をオススメしました。
この二年で更に使いやすくなり、もうGoogle日本語入力無しでは生きていけませんw
便利な機能として

郵便番号を入れると住所に変わる
「きょう」→2014/09/06のように日付に変換できる(ことし、あさって等でも可)
「くりえいと」→Createのように英単語の読みで英語に変換してくれる

などです。
顔文字やZ+Hでの矢印なども便利ですね!
AndroidやMacOSなどでも同じ変換が出来るのでマルチプラットフォームでストレス無く使く入力出来るのは嬉しいですね!!
また、流行りの語句なども変換してくれるのが非常に助かります。


2 ブラウザ

ブラウザ事情もIE・Firefox・Google Chromeの3強状態は変わらず。
ただChromeの開発者ツールが一番使いやすいと思うので開発はChromeメインにしてます。
Chromeの開発者ツールの使い方はドットインストールがわかりやすいのでオススメです。

Chrome Developer Tools入門 (全10回)


FirefoxもIEも開発者ツールは付いてるのでブラウザ依存の不具合とぶつかった時などに使えると色んな時に役に立つので調べておいて損は無いですよ。

3 テキストエディタ

僕は今も昔もIDE派です。
でも時々ちょっとconf触ったり、メモ作ったり、直接HTML触ったりするときなどテキストエディタは必要です。
そこで僕が使ってるのはSakuraEditor
矩形選択も置換も使いやすいのでログを見たり集計するときにも役立ちます。
また常駐アプリとしてついてくる機能のgrepが非常に便利です。
Windowsだとソース内のキーワードでgrepしたい時とか困るんですよね。
それがバッチシ対応してくれるし、対応箇所も一覧で出してくれるので非常に使いやすいです。
また補完は辞書のパッケージを追加すれば対応してくれます。
PHPをちょっと書く程度なら十分ですよ!
そしてそんなSakuraEditorの対抗馬なのがSublime Text 3ですね。
UTF-8の環境で使うなら補完、拡張性、どれをとってもSakuraEditor以上のパワーです。
実際に僕はWinSCP(後述)のデフォルトエディタはSublime Text 3をデフォルトにしてます。
一括置換も便利ですしテキストエディタ界の中心的存在です。
長い間、秀丸エディタが築いてきた牙城を崩す存在ですね。
Sublime Textについてはいい本が出てます。



電子書籍版もあるのでSublime Textを始める人は一度読んだ方がいいですよ!!

4 IDE

昔はEclipseを使ってましたが今はすっかりNetBeans使いです。

PHPerがNetBeansを使いたくなる7つの理由


特にFuelPHP使ってる人にはNetBeansが超絶オススメですね。
使い方は上のリンクでも紹介してますが補完もバリバリ聞くしHTMLやJSもバッチシ対応です。
ユニットテストも宣言元にジャンプもデバッカもバッチシです。
var_dump開発しなくて済むとすごい効率が上がりますよ!
ただ最近、Symfony2の時にNetBeansの非力さを感じる時があります。
Symfony2使うとすっごい最初のロードが長いんですよね(´・ω・`)
そんな人には有料ですがPHPStormがオススメです!!
Web系の補完も抜群でNetBeansより軽快です。
Symfony2やCakePHPなどのフレームワークで開発する人やJSもバリバリ書くようなフロント寄りの人は買ったことによるメリットが間違いなく大きいです。
お試し無料期間もあるのでまずは触ってみるのがいいのではないでしょうか。
あと何かと面白いイベントしてることがあるので@samuraismウォッチするのがオススメです。
それと




らしいのでセール待ちせずにサクッと買ったほうが良いと思います。
ツイッターのレスポンスとかメール対応がすごく優しく日本人にも安心対応なのも良いところですね。

5 ローカル実行環境

PHPer御用達はやっぱりXAMPPが主流だと思います。
ですが開発プロジェクトが増えるたびに度重なるバーチャルホスト。
そしてPHPやその他のライブラリのバージョンがプロジェクトごとに違って繰り出されるエラー。
そんな経験皆さんありませんか?
それを解決するにはVMです。
僕は以前からVirtualBoxを使っています。
VirtualBoxはお手軽にWindows上にVMを建てれるので簡単です。
ですがOSのインストールからやらねばならず、ネットワークの設定等のインフラ系の知識も必要とします。
たまになら良いのですが頻繁に、しかも「今すぐ開発を始めたい!」という時には高いハードルになってしまいます。
そこで活躍するのがvagrantです。
vagrantはVMのラッパーとパッケージ化を同時に提供してくれます。
ViretualBox, VMWare, AWSなどのVMに対応しており、高速にかつシンプルにVMを作成できます。
そしてVMへのアクセス、管理、設定も簡略化してくれます。
これにより、開発環境の依存関係に悩まされることなく、そして多くのインフラ系知識のブラッシュアップも必要なく開発に集中できます。
しかもNetBeansにプラグインを入れるとvagrantをNetBeansのGUIで操作できます。
SSHもCygwinのような黒魔術を使うこと無くNetBeansからアクセスできます。
すべてがNetBeansで解決できるので作業が捗ること間違いなしです!!

6 RDB

vagrantの出現によりlocalにDBを入れることがなくなりました。
これによりlocalにアパッチやDBを入れないので開発しない時に無駄なプロセスが起動しなくなりました。
こういうところにもVMを使うと良い点がありますね。

7 DB管理ツール&SQLエディタ

SQLエディタは自分の中ではA5:SQL Mk-2が一強です。
前回ご紹介した時はまだSSHトンネルも無く、PostgreSQLにアクセスするにはドライバーが必要でした。
現状ではSSHトンネルが可能なのでセキュアに接続できますしvagrantへのアクセスも簡単です。
またドライバーが必要ないのでダウンロードして解凍したらすぐに使うことができます。
このお手軽さにプラスして各種機能が非常に強力です。
特にテーブル定義書の出力とER図のリバース自動生成はいつも助けられています。
DBにもマルチ対応なのでMySQLとPostgreSQLでツールを変える必要がないのも非常に助かります。
ただしDB管理ツールではないのでDDLの必要な作業はGUI上ではできません。
(SQLを発行すれば当然出来る)
そこで外部制約やテーブル設計時に強力なのがMySQLならMySQL Workbench、PostgreSQLならpgadmin3です。
DBAツールなので簡単にテーブルの作成や編集もできますし外部制約やDB固有の機能にもバッチリサポートしてます。
それぞれグラフィカルな実行計画の結果やレプリケーションの設定、confの変更なども可能です。
phpMyAdminやphpPgAdminを覚えるよりセキュアで断然便利なので是非活用してみてください。

8 ファイル転送ツール

今はもうWinSCP一強です。
SCPの管理の使いやすさもですが自動同期の機能や開くファイルのエディタの指定など細かく手が届いて便利です。
地味にシンボリックリンクを作れたりパーミッションを変更できたりするのでCGIが苦手な人でも大丈夫です。
更にノートン コマンダー インターフェイスを使うとキーボードでの操作に特化するそうです。
僕もこれから効率向上のために試してみようと思ってます。

9 バージョン管理ツール

こちらもSVNから完全にGitに移行しました。
NetBeansからGitは直接管理できるので基本的にはNetBeansのGUIで触ってます。
しかもNetBeansは自分自身の保存ログとGitのコミットログを使ってソースのDiff出せたりするので超絶便利です。
マジこれだけでもNetBeans使う価値あります。
でもなんでもかんでもNetBeansのプロジェクトに出来るわけではないと思います。
そんな時はSourceTreeがイケてます。
GUIで操作でき、Githubへの連携も最初から念頭に置かれています。
ちなみにプライベートな開発をするときは僕はbitbucketを使ってます。
プライベートリポジトリでも無料なのでちょっとした開発の時は便利ですよ。
また社内で「クラウドにデータを置くのはちょっと…」って時にサーバーを社内に建てることになったらgitbucketがgithubのクローンの中でもダントツオススメです。
Scalaで作られてますが日本人が作者なので情報も多く、環境構築、アップデートともにすごく簡単です。
実際に僕も社内で使ってますがGUIでリポジトリが管理できることはもちろん、プルリクエストとissuesによるチケット管理はすごく便利です。
またWikiやREAD.MEなども対応しており、プロジェクトの暗黙知を無くすプラットフォームが成熟している感じです。
個人的には開発者だけで回すならredmine無しでgitbucketでやりとりしたほうがうまく回る気がしてます。

10 SSHクライアント

最近はTeraTerm proを使ってます。
Tera Term Menuを使うとTera Termのアクセスするサーバの管理もできます。
実際にはvagrantを使い出すとSSHを使うことも減ってきました。
昔はサーバに入ってvimでゴリゴリすることもあったのですがそういう時はWinSCPでは入ります。
なのでほとんどのことは別のツールでことが足りるのですがやはりコマンドラインが必要なこともあります。
昔はPuTTYを使ってたのですがPuTTYもかなり良いので好みの問題かなと思います。


と言うことでVMが出てきたことで環境依存の悩みも無くまりました。
またここでは説明しませんでしたがPHPUnitやBehatなどでテストが充実し、デバッカを使う機会も減りました。
この様に環境がどんどん進化してますのでぜひ一度調べてみると良いと思います。
また今回の内容でPHPerの最新環境に興味が出た人は次の本が参考になります。


また2014/9/20に広島市でオープンソースカンファレンス広島が開催されます。
ここにFuelPHPユーザ会として参加します。
ブースも出しますし登壇もしますので興味がある方は是非遊びに来てください!!

FuelPHPで始めるモダンPHP開発!!


ということでWeb系の方はこれを機に環境を見なおしてみると良いかもしれません。

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月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

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