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

2016年7月19日火曜日

PHPerに知って欲しいRDBの事をPHPカンファレンス関西で話してきた

PHPカンファレンス関西@2016に登壇してきました。
まず登壇資料はこちらです。



PHPerに知ってほしいシリーズとしては最終章になると思います。
結局のところ


  • 正規化
  • INDEXの適切な利用
  • 外部キー制約やcheck制約を利用したデータの保護


この辺を適切にこなせていれば多くのPHPで作る規模のWebアプリケーションは問題にならないと思います。
またこの辺をクリアしていればORMでも便利にRDBを利用できると思います。
ということで伝えたいことは伝わったかわかんないけど僕のDBAとしての仕事が減ってくれるくらいにみんなが興味を持ってくれたら嬉しいなって思ってます!

あとカンファレンスの事だと基調講演がまぁよかった。
動画を是非ともみんなに見てもらいたいですね。
その中で出てくる名言が僕の心に刺さりました。



ほんとみんなにはあの動画見てもらいたいですね。
あと気づいたのですが"PHP"カンファレンスなのにPHPの話してない人が多かったです(お前が言うな
BigQueryやAWSの話は僕が元々好きな領域なので楽しく聞けました。
あとは聞きたい!って思っても満席で聞けなかったセッションもいっぱいありました。
動画公開楽しみにしてます!!


ということで残すPHPカンファレンスは東京のみとなりました。
僕は次は登壇しないかもしれないしそもそも行くかも分からないです。
ただPHPerの人はみんな優しい。
そして楽しい。
そんな出会いの場であるカンファレンスにはまた是非行きたいなぁって思ってます。
ということでPHPerの人向けのRDBエバンジェリスト業は一旦閉幕とさせていただきます。

いやほんと楽しかったなぁ。

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年8月12日火曜日

PHPerの書くコードの保守性・管理性が劇的に上がるのスマートな方法

みなさんお仕事の進捗どうですか?
今日は



こんな軽はずみな発言をしてしまったが故にネットで触れては行けない3大炎上案件について触れる。

※ネットで触れては行けない3大炎上案件とは?
  • Excel関連(スクショとか)
  • 宗教(エディタとか)
  • PHP
のこと。

で今話題の元ネタを既に@sue445さんが魚拓してくれてる。

(炎上したら即魚拓とれるとか世の中ホントに怖い便利になったもんだ。)
なのでもしかしたら炎上して灰になるかもしれないけど勇気出して対抗記事を書く。

■はじめに

まず最初に言っとくけどPHP特有のずっと変わらないスマートな書き方ってあんまり無い。
ずっと変わらないのはPHPとか関係なく世間一般的に読みやすいコードの共通事項。
そういうのは世の中にいっぱいあるのでそう言うところで学ぶと良い。
例えばまずリーダブルコード読む。



これを読んだら
  • 変数のスコープは小さくしよう
  • わかりやすい名前を付けよう
  • ロジックはシンプルにしよう
とか自然と考える。
そしたら使いまわされるたった一つの変数に全部配列で突っ込んで管理とか数千行あるメソッドとか無くなるはず。
これだけで保守性とか管理性が劇的に上がると思う。
こういうのは言語関係ないのでみんなが学んでいくべき。
そして先人が知の高速道路を用意してくれてるのでありがたく活用するといい。

結論これで8割くらいの問題が解決すると思う。
けどそれ言うと終わっちゃうので読みやすいコードを書くことを踏まえた上でPHP特有の事を書いていこうと思う。

1. PHPの今を知る

まずPHPの最近の事情を知るべき
当たり前だと思うかもしれないけどまずホントこれ。
例えば非推奨の関数のereg()使ってる人とかまだ見かける。
そういうのを知りたかったら

PHP:The Right Way

を見ると良い。
原文はGithubで最新情報に常に更新されてる

Githubのリポジトリ

基本の項目を読むだけでもヒアドキュメント構文や三項演算子にも触れているので初級者PHPerにはとても有効だ。

PHP:The Right Way 基本の項目

ただ個人的には変数の宣言については一概に宣言を省略すれば良いとも言えないと思ってる。
たとえば
$fuga = hoge();
みたいな既存のコードで変数もメソッドも一見して意味がぜんぜんわかんないコードと出会った時。
ホントはちゃんとテストコードがあってリファクタリング出来ればベスト。
だけどこんなコードがあるようなプロダクトはテストコードも無い。
しかも$fugaのスコープが長すぎて消すことすら不安。
そんなときに
$users = $fuga;
として$usersを使うのは良いと思う。
これはコメントでもいいけどこういうちゃんと自分なりに意図があってすることには意味がある。

と話が脱線したね。
PHP:The Right Wayを全部読んだら大抵のことは出て来る。
コーディング規約のPSRなんかは新規案件なんかは積極的に取り入れた方が良い。
でも
  • PHP のオブジェクト指向
  • クロージャなどの関数型指向
  • PDO
  • Composer
なんかは読んだだけじゃすぐにはわからないかもしれない。
そういう時はわからない箇所にフォーカスした本を呼んだり実践で試したりを繰り返しやると良い。
オブジェクト指向とかデザインパターンとかいきなり全部スーッと入って来ない。
PHPの良い所はそういうことに対しての正しい情報(ドキュメント)がちゃんと用意されてる。
そして同じくらいダメな情報も用意されてる…
ここで大事なのは情報の選択。
なのでPHP:The Right Wayを更新してるエンジニアのTwitterをフォローしたりすると良い。
(正直自分も完璧である自信はないから今繰り返してる途中)

2. フレームワークを使う

もし今から新規開発をするとしてプレーンなPHPだけで開発をするのはやめた方がいい。
工数もかかるけどそれ以上にオレオレで実装した箇所を保守するのが大変になる。
だからオープンなフレームワークを使うこと。
ただ残念なことにPHPにはRuby On Railsみたいな標準となるフレームワークは無い。
しかしPHPにはオープンなフレームワークが沢山ある。
そんな中でちょっと前までは4大フレームワークは
  • CodeIgniter
  • CakePHP
  • Symfony
  • Zend Framework
と言われていた。
でも最近は
が勢いのある。
ただCakePHPも3系に上がったりSymfony2も2.5が出たりとしてる。
既にそっちを使ってる人が無理に乗り換える必要はない。
でも僕はFuelPHPが好きだからここを読んだ人にはFuelPHPを薦めておく。
LaravelとかPhalconとかYiiがすごくいいよ!って人が居たら是非とも良さをエントリーを書いて伝えて欲しい。
(それを見て僕も、もしかしたら乗り換えるかもしれないw)
でここから先は便宜上FuelPHPを選んでくれたとして話する。
まず知っておくことは
これらが必ず助けてくれるはず。
これらを見てまずはインストールして試してみるとFuelPHPの良さにすぐ気づくはずだ。
え、もっと親切なHow Toが欲しい?
そういう人はこれを読むといい。
FuelPHPの使い方だけじゃなくてIDEやPHPUnitを使ったユニットテストとか開発環境の使い方まで網羅してる。
「最近のモダンなPHP開発を知りたい!」って人も読んでみるといいと思う。
なんかFuelPHPの宣伝になってしまったけど開発をするならなんらかのフレームワークは使った方がいい。
その中でも人気のモノは人気の理由があるからそこに乗っかった方がいい。

3. なんでもかんでもCMSを辞める

さっきのフレームワークの延長上にCMS(コンテンツマネジメントシステム)がある。
これは完成されたアプリケーションを利用するというものだ。
もし、今必要とされてるプロダクトが完全にマッチしてるならCMSを使うといい。
けどPHP界隈では

  • ECサイトはとりあえずECCUBEのカスタマイズ
  • フレームワークのようになんでもWordPressを使って制作

みたいなことを見かける。
それぞれ優れたCMSだけど得意不得意はある。
これはフレームワーク以上に明確にある。
たとえばECCUBEは確かにECサイト向けのCMSだけど注文カートをカスタマイズは大変。
WordPressは本来ブログを作るものだ。
それを無理矢理カスタマイズしてECサイトや複雑なWebサイトにするのはイケてない。
例えばポータルサイトならMagic3が適してるしECサイトはZen Cartだってある。
もちろんブログ付きのホームページを作ったりするのにWordPressは抜群の効果を発揮する。
つまり適材適所が大切。
そしてどれもマッチしないならどれかを無理矢理カスタマイズするよりはフルスクラッチで作ったほうが良い事が多い。

まとめ

結局のところ



これ。
そうすると自然と自力も上がるし保守性・管理性も上がる。
自力が上がれば他の言語に手を出したり(そしてPHPを卒業したり)PHPの良し悪しを汲んであげれるはず。
ということで


コレ最強。
以上がそーだい的な保守性・管理性を劇的に上げる方法。





おまけ

PHPの保守性・管理性とは関係ないけどおまけ。


1. PHPの苦手なことは他に任せる


もう身も蓋も無いけどPHPはみんなの知ってる通り万能な言語ではない。
CMSと一緒で得意不得意があるし特に不得意なところに関しては滅法弱い。
これは変数の扱いが曖昧とか関数の命名規則が統一されて無くてイケてないとかじゃない。
こういう言語としてイケてないところが致命的と感じる場合はPHP以外の言語を書くしかないかな
(「他の言語を書く」の選択肢には転職とかも含めてね)

ここでの苦手なことは「実際にPHPでこれをやろうとしたら苦行」みたいな事。
例えば
  • 並列処理
  • 複数プロセス間(複数アクセスに対してとか)のリアルタイムなデータ共有
とかはもう言語仕様としてそうなってるのでそこを超えるのは大変なのは当たり前なんだけど大変。
プロセス間通信が必要な処理とか書いてもCと変わらない。
(Cが簡単と言う人には簡単かもしれないけど僕は違った)
マルチスレッドとかもそうだけどこういうのはC#とかJavaで書いた方が幸せになれると思う。
(最近だとErlangなのかな?)
他にもinputとoutputがハッキリしててアクセスが多くて速度が重視するような場合(RESTAPIとか)はPHPで書くよりScalaで書いたが絶対幸せになれる。
WebSocket使うような非同期処理ならNode.jsとか使ったほうがいいと思う。
型安全とかもそうだけどプロダクトとしてそちらが適してるならそっちを使ったほうがいい。

ただPHPも得意なことはある。
シンプルなWebサービスを作るときは簡単だし高速。
開発環境はライセンス費を掛けずにIDEもあるしvagrantなどツールも充実してる。
TDDやBDDもできるしテストの自動化みたいなひと通りの流行りの事は出来る。
それとPHPは別にセキュリティが苦手なわけじゃない。
セキュアなWebアプリって観点だと最近のモダンなフレームワークでちゃんと作れば問題ない。
セキュリティに関しては言語関係なくセキュリティに対する知識とフレームワークやミドルウェア含めバージョンアップ出来る状態の維持が一番大事だと思う。

2. 保守性はコードも大事だけどデータも大事


コードの保守性も確かにとても大事なんだけどそれと同じかそれ以上にデータも大事。
具体的にはクソなDB設計の上には何を作ってもクソ。
例えばどんなに綺麗に設計してもtext型で巨大な文字列とか入ってると*を使うORMが死ぬ(速度的に)
他にも1テーブルに100カラム以上みたいなSQLアンチパターンがあるとクエリビルダでも死ぬ(つかSQLが死ぬ)
でアプリケーションの寿命よりデータの寿命の方が長いからデータの闇は深い。
あるあるネタだけど5年前くらいのアプリケーションのリプレース案件。
コードは綺麗に出来るけどデータは既存から持って来ないといけない。
そこで立ちはだかる数百のテーブルと複雑に絡み合うViewとトリガー…みたいなとき(この場合は担当者が死ぬ


ということでコードに対する向上心と同じようにデータ設計に対する向上心も持ってほしい。

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

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