[{"data":1,"prerenderedAt":318},["ShallowReactive",2],{"$ft6jtkd6xhw3c":3,"$f2no7iqb3nq1uz":263},{"featured":4,"latest":129,"categories":227},[5,14,27,37,48,56,66,76,86,96,106,114,122],{"slug":6,"title":7,"date":8,"excerpt":9,"image":10,"categories":11},"custom-database-tables","Custom DataBase Tables","2015-11-24T02:29:34","You can create the new own table freely in the your WordPress database via this plugin. Then, you can make the management of table or (as view or entry or edit) data in a simple user interface.\\nAlso,","\u002Fassets\u002Fuploads\u002F2016\u002F02\u002Fcdbt-overview.png",[12],{"slug":13,"name":7},"cdbt",{"slug":15,"title":16,"date":17,"excerpt":18,"image":19,"categories":20},"10_php_tips_for_developers","PHP開発者が心得ておくべき10の鉄則","2016-01-11T18:38:09","PHPだけに限った話ではないが、プログラミングを行うに当たって、心得て、準備しておくと失敗が劇的に減る事柄をまとめてある良い記事を見つけたので、私なりの解釈で意訳しつつ、経験則を踏まえてあらためてまとめてみた。 オリジナ…","\u002Fassets\u002Fuploads\u002F2016\u002F01\u002Feyecatch-php-10-tips.jpg",[21,24],{"slug":22,"name":23},"column","コラム",{"slug":25,"name":26},"development","開発関連",{"slug":28,"title":29,"date":30,"excerpt":31,"image":32,"categories":33},"jquery-timeline-v1","2種類の横型タイムラインを簡単に作成できる「jQuery.Timeline」をリリース","2017-05-29T14:55:46","現在開発しているサービスで利用するべく、横型タイムラインを生成できるjQueryプラグインを自作したので、そこだけ単独でリリースしてみた。 ソースコード等はGitHubの方にリリースしてあるので、興味のある方は、そち…","\u002Fassets\u002Fuploads\u002F2017\u002F05\u002Fjquery_timeline_image.png",[34],{"slug":35,"name":36},"jqtl","jQuery.Timeline",{"slug":38,"title":39,"date":40,"excerpt":41,"image":42,"categories":43},"optimize-browser-cache-of-static-resources","更新されたJS、CSS、画像のみブラウザキャッシュを破棄して読み込ませる","2018-01-31T15:47:47","WEBサービスの保守や開発をやっていると、JavaScriptやスタイルシート、画像などの静的リソースを更新した際、しばしば「確認したけど、更新されてないよ」とか云われて、「ブラウザのキャッシュを消してからもう一度見て…",null,[44,47],{"slug":45,"name":46},"codes","コード集",{"slug":25,"name":26},{"slug":49,"title":50,"date":51,"excerpt":52,"image":53,"categories":54},"jquery-timeline","jQuery.Timeline version2 – full documentation","2019-03-04T20:40:48","Plugin Overview The jQuery.Timeline plugin provides you two types of the horizontal timeline. You can create a…","\u002Fassets\u002Fuploads\u002F2019\u002F03\u002Fjquery.timeline_v2.jpg",[55],{"slug":35,"name":36},{"slug":57,"title":58,"date":59,"excerpt":60,"image":61,"categories":62},"released-the-sloth","Released the Sloth of mobile-first CSS micro framework!","2019-04-16T18:04:25","I released the “Sloth” that is mobile-first CSS micro framework. I have long used frontend framewo…","\u002Fassets\u002Fuploads\u002F2019\u002F04\u002Fsloth_doc_head.png",[63],{"slug":64,"name":65},"sloth","Sloth",{"slug":67,"title":68,"date":69,"excerpt":70,"image":71,"categories":72},"challenge-to-conceal-the-wordpress-site","WordPressサイトを徹底的に秘匿化する","2020-02-02T23:59:58","私は自分の個人サイトをはじめ、仕事でもWordPressサイトを運用している。WordPressは気軽にサイトを立ち上げられてカスタマイズも簡単な、素晴らしいオープンソースなのだが、世界中で使われまくっているその知名度…","\u002Fassets\u002Fuploads\u002F2020\u002F02\u002Fshutterstock_1878005929.jpg",[73],{"slug":74,"name":75},"wordpress","WordPress関連",{"slug":77,"title":78,"date":79,"excerpt":80,"image":81,"categories":82},"what-is-forkor","Made a shortened URL app called Forkor","2020-07-07T22:27:01","What’s Forkor? Forkor is a service that provides a shortened URL feature that allows you to redirect any…","\u002Fassets\u002Fuploads\u002F2020\u002F07\u002Fforkor.png",[83],{"slug":84,"name":85},"forkor","Forkor",{"slug":87,"title":88,"date":89,"excerpt":90,"image":91,"categories":92},"manual-about-svg-japan","インタラクティブな日本地図を生成するJSプラグイン「SVG Japan」","2020-11-16T21:19:58","各都道府県をそれぞれ選択・クリック可能なインタラクティブな日本地図を生成するネイティブJavaScript建てのプラグイン「SVG Japan」を作ったので、その紹介と使い方をまとめておく。ちなみにソースコードはgit…","\u002Fassets\u002Fuploads\u002F2020\u002F11\u002Fsvg-japan.png",[93],{"slug":94,"name":95},"svg-japan","SVG Japan",{"slug":97,"title":98,"date":99,"excerpt":100,"image":101,"categories":102},"wp-ignitor-plugin-to-conceal-wordpress-site","WordPressサイトを秘匿化するプラグイン「WP Ignitor」","2021-01-19T15:28:21","以前「WordPressサイトを徹底的に秘匿化する」という記事で、WordPress建てのサイトを秘匿化する方法を取り上げたのだが、あれをサイト構築時に毎度実施するとなるととても労力が必要であった。そこで、もっとお手軽…","\u002Fassets\u002Fuploads\u002F2021\u002F01\u002Fbanner-1554x500-1.png",[103],{"slug":104,"name":105},"wp-ignitor","WPイグナイタ",{"slug":107,"title":108,"date":109,"excerpt":110,"image":111,"categories":112},"tastewp","無料でWordPressサイトを複数作成できるWEBサービス「TasteWP」","2021-03-25T20:21:59","私が日本語翻訳に協力しているWEBサービス「TasteWP」について紹介しようと思う。 https:\u002F\u002Ftastewp.com このサービス、サインアップすることなく無料で自分用のWordPressサイトを作れるとい…","\u002Fassets\u002Fuploads\u002F2021\u002F03\u002FTasteWP_screenshot.png",[113],{"slug":74,"name":75},{"slug":115,"title":116,"date":117,"excerpt":118,"image":119,"categories":120},"monster-hunter-rise-skill-simulator","モンハンライズのスキルシミュレータを作ってみた！","2021-06-28T20:24:52","コラムで連載していたNintendo Switch版『モンスターハンターライズ』のスキルシミュレータ開発がやっと一段落して一通り完了した。いやぁ、記事書きながら同時並行で開発すると思っていた以上に時間がかかるもんだなぁ…","\u002Fassets\u002Fuploads\u002F2021\u002F06\u002Fmhrss_v100.png",[121],{"slug":25,"name":26},{"slug":123,"title":124,"date":125,"excerpt":126,"image":42,"categories":127},"comparison-of-javascript-date-libraries","JavaScriptの日時ライブラリを比較してみた","2021-07-28T22:39:19","ネイティブJavaScriptで日時を取り扱う場合、ビルトインされているDateオブジェクトを使うことになるのだが、このDateオブジェクトは取り扱いにクセが多く、直感的に日時を操作できない点でも有名である。そこで、専…",[128],{"slug":25,"name":26},[130,141,153,165,175,184,192,195,198,206,213,220],{"slug":131,"title":132,"date":133,"excerpt":134,"image":135,"categories":136},"pulllog_launched","ガチャ履歴を記録・分析できるWebサービス「PullLog」","2025-08-22T13:05:30","このたび、新しい個人開発サービスとして 「PullLog（プルログ）」 をリリースした。 URLはこちら https:\u002F\u002Fpulllog.net PullLogとは？ PullLogは、ソーシャルゲームのガチャ履歴を記録…","\u002Fassets\u002Fuploads\u002F2025\u002F08\u002Fpulllog_stats_jp.png",[137,140],{"slug":138,"name":139},"industries","プロダクト",{"slug":25,"name":26},{"slug":142,"title":143,"date":144,"excerpt":145,"image":146,"categories":147},"mockapi-php-openapi-schema-generation","モックAPIのレスポンスから OpenAPI 3.0 スキーマを自動生成するPHPツール","2025-04-17T09:31:52","私自身がそうなのですが、OpenAPI仕様書を毎回手作業で書いていて「面倒だな」と思ったことはありませんか？ そんな（私と）あなたにぴったりのツールがあります。 レスポンスの例さえ用意すれば、OpenAPI 3.0 スキ…","\u002Fassets\u002Fuploads\u002F2025\u002F04\u002Fswaggerui-preview.png",[148,151,152],{"slug":149,"name":150},"mockapi-php","MockAPI-PHP",{"slug":138,"name":139},{"slug":25,"name":26},{"slug":154,"title":155,"date":156,"excerpt":157,"image":158,"categories":159},"ambient_playlist_customize","Ambientでメメントモリのラメントプレイヤーを作る","2023-11-30T17:32:39","「Ambient」の最新バージョン 1.2.0で実装した「疑似フェーダー」機能を使って、ソーシャルゲーム「メメントモリ」のYouTube公式チャンネルで公開されているMVを集約したラメント専用プレイヤーを作ってみた。 ラ…","\u002Fassets\u002Fuploads\u002F2023\u002F11\u002Fambient_mememori_1.png",[160,163,164],{"slug":161,"name":162},"ambient","Ambient",{"slug":138,"name":139},{"slug":25,"name":26},{"slug":166,"title":167,"date":168,"excerpt":169,"image":170,"categories":171},"released_ambient_demo_version","Ambientメディアプレイヤーのクラウド版デモを公開","2023-11-22T13:47:36","つい先日「Ambient」の最新バージョン 1.1.0をリリースして、それに合わせてクラウド版デモサイトも公開してみた。 なお、クラウド版デモでローカルのホストコンピュータのメディアを再生するには、そのメディアファイルも…","\u002Fassets\u002Fuploads\u002F2023\u002F10\u002FAmbientMediaPlayer-typologo.png",[172,173,174],{"slug":161,"name":162},{"slug":138,"name":139},{"slug":25,"name":26},{"slug":176,"title":177,"date":178,"excerpt":179,"image":170,"categories":180},"ambient-media-player","YouTubeと自分のPC内メディアを同時に再生できるメディアプレイヤーを作ってみた","2023-10-20T00:00:25","私はよくPCで何か作業をするときには音楽を垂れ流していることが多い。 そういう時にかける曲は、手持ちのアルバムCD等からPCに取り込んだ音源だったり、さらにはYouTubeの動画だったりとメディアや再生環境がバラバラだ。…",[181,182,183],{"slug":161,"name":162},{"slug":138,"name":139},{"slug":25,"name":26},{"slug":185,"title":186,"date":187,"excerpt":188,"image":189,"categories":190},"what-is-the-sunorhc","Sunorhc is a date-time library for JavaScript","2021-08-25T22:55:55","Sunorhc is a lightweight library for handling dates and times for JavaScript. The library wraps a native JavaS…","\u002Fassets\u002Fuploads\u002F2021\u002F08\u002Fshutterstock_1091212919_resized.jpg",[191],{"slug":25,"name":26},{"slug":123,"title":124,"date":125,"excerpt":126,"image":42,"categories":193},[194],{"slug":25,"name":26},{"slug":115,"title":116,"date":117,"excerpt":118,"image":119,"categories":196},[197],{"slug":25,"name":26},{"slug":199,"title":200,"date":201,"excerpt":202,"image":203,"categories":204},"mhrise-skill-simulator-creation-chapter-12","モンスターハンターライズのスキルシミュレータを作ってみる！ 第12回","2021-06-21T13:11:46","今回は「マイセット登録」と護石データの「エクスポート／インポート」機能の追加をしていく。折り良く（悪く？）「FF7リメイク・インターグレード」や「FORTNITEシーズン7」が出たこともあって、そっちをプレイしてたらこ…","\u002Fassets\u002Fuploads\u002F2021\u002F04\u002Fb6ca09e9a7f6faf27641f62dabe64c6ff97b4f326aa478379e3c112aa28eb9ab.jpg",[205],{"slug":22,"name":23},{"slug":207,"title":208,"date":209,"excerpt":210,"image":203,"categories":211},"mhrise-skill-simulator-creation-chapter-11","モンスターハンターライズのスキルシミュレータを作ってみる！ 第11回","2021-06-07T14:52:31","さて、今回はユーザー個別データの管理部分を開発していく予定だが、まずその前にやっておくことがある。 新スキル「風雷合一」に対応する Ver.3.0の大型無料アップデートで追加された新スキルに「風雷合一」というのがある…",[212],{"slug":22,"name":23},{"slug":214,"title":215,"date":216,"excerpt":217,"image":203,"categories":218},"mhrise-skill-simulator-creation-chapter-10","モンスターハンターライズのスキルシミュレータを作ってみる！ 第10回","2021-06-02T00:29:10","今回は、護石管理画面の作成だ。この護石管理では、ユーザーごとに護石の登録を行う機能と、登録した護石を削除する機能を持つ仕様になる。この画面から登録した護石データはデータベースに格納するので、フロントエンド側からのリクエス…",[219],{"slug":22,"name":23},{"slug":221,"title":222,"date":223,"excerpt":224,"image":203,"categories":225},"mhrise-skill-simulator-creation-chapter-9","モンスターハンターライズのスキルシミュレータを作ってみる！ 第9回","2021-05-22T23:56:27","さて、今回はVuexによるデータ・キャッシュの実装だ。一度データベースから読み込んだデータをフロントエンド側で再利用可能なストアに格納することで、データベースへの接続回数を減らしてシステム負荷を下げるとともに、UX的な…",[226],{"slug":22,"name":23},[228,230,232,236,238,239,240,241,242,244,247,248,250,252,254,258,261],{"slug":161,"name":162,"count":229},3,{"slug":13,"name":7,"count":231},7,{"slug":233,"name":234,"count":235},"csnp","Custom Sticky Notes",2,{"slug":84,"name":85,"count":237},1,{"slug":35,"name":36,"count":229},{"slug":149,"name":150,"count":237},{"slug":64,"name":65,"count":237},{"slug":94,"name":95,"count":237},{"slug":74,"name":75,"count":243},37,{"slug":245,"name":246,"count":237},"wpqt","WP Qiita",{"slug":104,"name":105,"count":237},{"slug":22,"name":23,"count":249},29,{"slug":45,"name":46,"count":251},16,{"slug":138,"name":139,"count":253},5,{"slug":255,"name":256,"count":257},"lifelog","ライフログ",64,{"slug":259,"name":260,"count":235},"uncategorized","未分類",{"slug":25,"name":26,"count":262},45,{"type":264,"post":265},"post",{"slug":15,"title":16,"date":17,"excerpt":18,"image":19,"categories":266,"modified":269,"html":270,"tags":271,"related":278,"prev":302,"next":310},[267,268],{"slug":22,"name":23},{"slug":25,"name":26},"2021-02-03T20:38:00","\u003Cp>PHPだけに限った話ではないが、プログラミングを行うに当たって、心得て、準備しておくと\u003Cstrong>失敗が劇的に減る\u003C\u002Fstrong>事柄をまとめてある良い記事を見つけたので、私なりの解釈で意訳しつつ、経験則を踏まえてあらためてまとめてみた。\u003C\u002Fp>\n\u003Cblockquote>\u003Cp>\n  オリジナル記事: \u003Ca href=\"http:\u002F\u002Fwww.htmlgoodies.com\u002Fbeyond\u002Fphp\u002Farticle.php\u002F3907521\">Top 10 PHP Tips for Developers\u003C\u002Fa>\n\u003C\u002Fp>\u003C\u002Fblockquote>\n\u003Cp>どれも基礎的なことで、長くプログラムやっていると「何を今更…」的な事も多いのだが、逆にプログラミングに応用が利くようになってくるとおざなりにしがちな点もある。\u003C\u002Fp>\n\u003Ch2>1. OOPで行こう！\u003C\u002Fh2>\n\u003Cp>OOPとはオブジェクト指向プログラミング（\u003Cstrong>O\u003C\u002Fstrong>bject \u003Cstrong>O\u003C\u002Fstrong>riented \u003Cstrong>P\u003C\u002Fstrong>rogramming）のことで、原文では「開発する際はオブジェクト指向プログラミングを活用しないと不利になる」と云っている。\u003Cbr \u002F>\nオブジェクト指向型プログラミングの説明をすると長くなってしまうので、ここでは詳しくは触れないが、簡潔に言えば、OOPは「工場で流れ作業的にモノを作る」のに近くて、一方で対となる手続き型（構造型）プログラミングは「職人が独自の作法でモノを作る」と例えられるかもしれない。\u003C\u002Fp>\n\u003Cp>どういう事かというと、例えばOOP型の場合、工場で車を作る流れ作業を考えてみるとわかりやすいかもしれない。\u003Cbr \u002F>\nボディーを作る部門とエンジンを作る部門、ホイールやサスペンションなど各パーツを作る部門があり、それぞれ作ったパーツを寄せ集めて、最終的にパーツを組み立てる部門もあって、最終的に車というモノを完成させることになる。\u003Cbr \u002F>\nこの場合、各部門がPHPで言うところのクラスであり、各部品製造クラスが車を組み立てるベルトコンベア・ライン（基底クラス）の子クラスになっているという建て付けだ。そして、各クラスにはエンジンならエンジンを完成させるための手順（メソッド）があり、エンジンの部品を作るための子クラスがあり…というように、クラスやメソッドは分業化されているイメージだ。そして、もちろん、最終的に出来上がる車がクラスのインスタンスとなる。\u003Cbr \u002F>\n各製造部門（クラス）の手順（メソッド）を派生（オーバーライド）したり、与える材料（メンバー変数など）を変更したりすることで、作る車種や搭載機能を低いコストで変更できるような汎用性が強みでもある。\u003C\u002Fp>\n\u003Cp>方や手続き型（構造型）の職人が焼き物を作る場合では、土作り→土練り→ろくろ成形→乾燥→素焼き→絵付け→本焼き…という固定手順の中で、材料である「土」を完成品である「焼き物」という製品に変質させていくことになる。\u003Cbr \u002F>\nつまり、グローバル変数に格納された「土」を「焼き物」に変化させるため、各手順（関数）にその時点の「焼き物」の状態（グローバル変数）をひき回していくというイメージだ。この固定ルーチン型でも、各関数に細やかな変更を加えることで完成形である「焼き物」の種別や絵柄等を変えられるが、「茶碗」と「皿」と「壺」にそれぞれ3種類の絵柄を…という注文に対応するためには各手順（関数）の処理が複雑化するであろうことは容易に想像できる。\u003Cbr \u002F>\nまた、PHPの処理として考えた場合、「素焼き」や「本焼き」の関数は共通化できる部分が多く、コードとしては非効率である。焼成作業での共通手順となる「窯詰め」や「窯出し」は共通化してしまいたいが、本焼きでしか発生しない「上絵付け」や「上絵焼成」の分岐手順は関数内に入れ込まないといけない…というジレンマも出て来る。\u003Cbr \u002F>\nとはいえ、この例のように伝統工芸のルーチンであれば、確立されている手順が将来的に変更するされる必然性も少ないため、逆に手続き型でプロセスを構築してしまった方が良いということもある。\u003C\u002Fp>\n\u003Cp>両者それぞれにメリット・デメリットはあるのだが、環境やニーズの移り変わりが激しい昨今のWEBにおいては、拡張性・汎用性が高いオブジェクト指向型プログラミングの方がメリットが非常に多いというのは周知の事実である。\u003C\u002Fp>\n\u003Ch2>2. \u003Ccode>require_once()\u003C\u002Fcode>や\u003Ccode>include_once()\u003C\u002Fcode>はハイコストである\u003C\u002Fh2>\n\u003Cp>原文を意訳すると、\u003Ccode>require_once()\u003C\u002Fcode>や\u003Ccode>include_once()\u003C\u002Fcode>といった「\u003Cstrong>\u003Ccode>_once()\u003C\u002Fcode>で終わる関数から離れよ\u003C\u002Fstrong>」というタイトルで、下記のような事が書いてある。\u003C\u002Fp>\n\u003Cblockquote>\u003Cp>\n  私たちはみんな、\u003Ccode>include()\u003C\u002Fcode>が失敗した場合に単なる警告を与えることと、\u003Ccode>require()\u003C\u002Fcode>が失敗したときに致命的なエラーでスクリプトが停止することを知っている。\u003Cbr \u002F>\n  忘れてはいけないことは、\u003Ccode>include_once（）\u003C\u002Fcode>と\u003Ccode>require_once（）\u003C\u002Fcode>は、サーバリソース上で非常にコストが高いということだ。我々にはそれについてできることは何もなく、それはPHPの仕様なのだ。\u003Cbr \u002F>\n  ただ、これらの関数がサーバーのリソースを大きく消費することを覚えておかねばならない、特に、巨大なフレームワークを利用する時や、あなたがコード設計をする場合にはなおさらだ。\n\u003C\u002Fp>\u003C\u002Fblockquote>\n\u003Cp>一理あるのだが、そのまま鵜呑みにしてはいけないポイントでもある。というのも、確かに\u003Ccode>require()\u003C\u002Fcode>や\u003Ccode>require_once()\u003C\u002Fcode>、\u003Ccode>include()\u003C\u002Fcode>、\u003Ccode>include_once()\u003C\u002Fcode>についてはコストが高い関数であるのだが、かといってすべからく\u003Ccode>_once()\u003C\u002Fcode>なしの関数にシフトしたからと言ってリスクヘッジができるわけではないからだ。\u003Cbr \u002F>\nむしろ\u003Ccode>require()\u003C\u002Fcode>に関しては、\u003Ccode>require_once()\u003C\u002Fcode>を使った方がサーバリソースの節約につながることが多い。このTIPSについて私なりに言い換えるとすれば、\u003C\u002Fp>\n\u003Ch3>『\u003Cstrong>\u003Ccode>require\u003C\u002Fcode>と\u003Ccode>include\u003C\u002Fcode>の使い分けを理解し、リソースパスはサーバの絶対パスで指定すること\u003C\u002Fstrong>』\u003C\u002Fh3>\n\u003Cp>──がベストプラクティスではないだろうか。リソースパスに相対パスを指定してしまうと、外部ファイルの読み込み時に「検索」という\u003Cstrong>処理\u003C\u002Fstrong>が行われてしまう（php.ini設定の\u003Ccode>include_path\u003C\u002Fcode>に依存した検索を行う）ために、サーバリソースを無駄に使ってしまう。絶対パスを指定することで「検索」という処理を省くことができる。\u003Cbr \u002F>\nもし、環境によるサーバパス（ドキュメントルート）の違いを吸収して絶対パスのハードコーディングを回避したい場合なら、\u003C\u002Fp>\n\u003Cpre>\u003Ccode class=\"language-php:\">require_once( $_SERVER['DOCUMENT_ROOT'] . '\u002Fincludes\u002Fextend.php' );\n\u003C\u002Fcode>\u003C\u002Fpre>\n\u003Cp>──とスーパーグローバル変数の\u003Ccode>$_SERVER\u003C\u002Fcode>を参照することでサーバパスの環境依存にも対応できる。\u003C\u002Fp>\n\u003Cp>また、\u003Ccode>require()\u003C\u002Fcode>と\u003Ccode>include()\u003C\u002Fcode>の使い分けについては、基本的に出力用のテンプレート等を読み込む場合は\u003Ccode>include()\u003C\u002Fcode>を、PHPの拡張処理を読み込む場合は\u003Ccode>require_once()\u003C\u002Fcode>を使うという住み分けで覚えておくと混乱しない。詳しくは、下記の記事がわかりやすいので、一読をおすすめする。\u003C\u002Fp>\n\u003Cblockquote>\u003Cp>\n  差し込みたければ include、利用したければ require_once\u003Cbr \u002F>\n  \u003Ca href=\"http:\u002F\u002Fd.hatena.ne.jp\u002Funau\u002F20090122\u002F1232574417\" title=\"\" class=\"origin pull-right\">include と require_once の使いわけ\u003C\u002Fa>\n\u003C\u002Fp>\u003C\u002Fblockquote>\n\u003Ch2>3. 開発時はエラーレポートをONに\u003C\u002Fh2>\n\u003Cp>PHPでの開発プロジェクトを開始する時に一番最初にすべきことは、すべてのエラー報告を有効にするために\u003Ccode>error_reporting()\u003C\u002Fcode>に\u003Cstrong>E_ALL\u003C\u002Fstrong>を指定することである。おそらくこの世にエラーのないプログラムを一発でコーディングできる人間は存在しないと思う。自分を人間だと思っているならば、開発時にはエラーレポーティングはONにしよう（笑）\u003Cbr \u002F>\nなお、一方でエラーメッセージの出力がハイコストであることも覚えておく必要がある。プロジェクトの公開環境ではE_ALLやE_STRICTが有効化されていても、エラーの出力が行われないように、\u003Ccode>display_errors\u003C\u002Fcode>をOFFにしておく。\u003Cbr \u002F>\n私の考える最善のエラー設定は、下記の通り\u003C\u002Fp>\n\u003Ch3>開発環境や開発時\u003C\u002Fh3>\n\u003Cp>基本的にphp.iniに指定しておくのが一番簡単。エラーログも出力しておくと、Ajax処理やバッファリング中のエラーも拾いやすくなるのでおススメ。なお、エラーログ出力用のファイルは事前に作って、パーミッションや所有者を最適化しておく必要があるので注意。\u003C\u002Fp>\n\u003Cpre>\u003Ccode>error_reporting = E_ALL | E_STRICT\ndisplay_errors = On\nlog_errors = On\nerror_log = \"\u002Fvar\u002Flog\u002Fphp_errors.log\"\n\u003C\u002Fcode>\u003C\u002Fpre>\n\u003Cp>もしくは、プロジェクトルート毎に.htaccessで指定してもよい。これだと複数プロジェクトをホスト毎に走らせられたりして効率が良い。ただし、E_ALLのビットマスク値がPHPのバージョンで異なるので注意（PHP &lt; 5.2 = 2047、PHP &lt; 5.3 = 6143、 PHP &lt; 5.4 = 30719、 PHP &lt;= 5.5 = 32767）\u003C\u002Fp>\n\u003Cpre>\u003Ccode>php_value error_reporting 32767\nphp_flag display_errors On\nphp_flag log_errors On\nphp_value error_log \"\u002Fvar\u002Flog\u002Fphp_errors.log\"\n\u003C\u002Fcode>\u003C\u002Fpre>\n\u003Cp>あまりおススメできないが、設定値を柔軟に制御したい場合などはPHPソース内に指定する。\u003C\u002Fp>\n\u003Cpre>\u003Ccode>ini_set( 'display_errors', 1 );\nini_set( 'log_errors', 'On' );\nini_set( 'error_log', '\u002Fvar\u002Flog\u002Fphp_errors.log' );\nerror_reporting( -1 );\n\u003C\u002Fcode>\u003C\u002Fpre>\n\u003Ch3>公開環境や運用時\u003C\u002Fh3>\n\u003Cp>こちらも基本的にphp.iniに指定しておくのが一番無難。サービスの脆弱性が露出するので公開環境ではエラーは必ず出力しないようにすること。なので、エラーログへの出力が超重要になる。\u003C\u002Fp>\n\u003Cpre>\u003Ccode>error_reporting = E_ALL &amp; ~E_DEPRECATED\ndisplay_errors = Off\nlog_errors = On\nerror_log = \"\u002Fvar\u002Flog\u002Fphp_errors.log\"\n\u003C\u002Fcode>\u003C\u002Fpre>\n\u003Cp>もしくは、.htaccessでの指定。E_ALLのビット値がPHPのバージョンで異なるので注意（下記の例はPHP5.4.x以上でE_DEPRECATEDとE_USER_DEPRECATED以外のE_ALLをログ出力する）\u003C\u002Fp>\n\u003Cpre>\u003Ccode>php_value error_reporting 8191\nphp_flag display_errors Off\nphp_flag log_errors On\nphp_value error_log \"\u002Fvar\u002Flog\u002Fphp_errors.log\"\n\u003C\u002Fcode>\u003C\u002Fpre>\n\u003Cp>公開環境でエラー設定を制御しなきゃいけないケースは避けたいので、PHPソース内への指定は甚だよろしくない。\u003C\u002Fp>\n\u003Cpre>\u003Ccode>ini_set( 'display_errors', 0 );\nini_set( 'log_errors', 'On' );\nini_set( 'error_log', '\u002Fvar\u002Flog\u002Fphp_error.log' );\nerror_reporting( -1 );\n\u003C\u002Fcode>\u003C\u002Fpre>\n\u003Cp>なお、公開環境ではログの肥大化によるリソース圧迫やサービスパフォーマンスの低下を防ぐためにもエラーログのログローテーションは考慮しておく必要がある。\u003Cbr \u002F>\nPHPエラーログのログローテについては、下記が参照になるかと。\u003C\u002Fp>\n\u003Cblockquote>\u003Cp>\n  \u003Ca href=\"http:\u002F\u002Foki2a24.com\u002F2013\u002F03\u002F19\u002Fset-logrotate-php-error-log\u002F\">【logrotate】PHP エラーログでローテーションを！【できました！】\u003C\u002Fa>\u003Cbr \u002F>\n  \u003Ca href=\"http:\u002F\u002Foki2a24.com\u002F\" title=\"\" class=\"origin pull-right\">http:\u002F\u002Foki2a24.com\u002F\u003C\u002Fa>\n\u003C\u002Fp>\u003C\u002Fblockquote>\n\u003Ch2>4. 必要に応じてフレームワークを利用する\u003C\u002Fh2>\n\u003Cp>PHPの生みの親でもあるラスマス・ラードフ氏は「フレームワークは通常のPHPコードより遅いから、フレームワークは使わない方が良い」と云っているが、それはフレームワークに対しての一面的な見解でしかないことを知っておく必要がある。私も個人的にフレームワークは嫌いなのだが、一方でその有用性は認めざるを得ない。\u003Cbr \u002F>\nでは、フレームワークの有用性とはなんだろうか。\u003C\u002Fp>\n\u003Cul>\n\u003Cli>圧倒的な生産性を得るためにはパフォーマンスの犠牲はやむを得ないものである\u003C\u002Fli>\n\u003Cli>不正なコードを最大限除外することによって得られるプロジェクトの信頼性\u003C\u002Fli>\n\u003C\u002Ful>\n\u003Cp>フレームワークを利用する価値はこの二点に尽きるのではないだろうか…と私は思っている。\u003Cbr \u002F>\nそして、フレームワークの弊害はPHPというプログラム言語自体を抽象化してしまう側面を持っていることだ。フレームワークに傾倒し過ぎると、PHPが本来持っているパフォーマンスや拡張性を見失い、極論すると狭いフレームの制限下に捕らわれたサービスしか生み出せないPHP技術者になってしまうこともありえるのだ。\u003C\u002Fp>\n\u003Ch3>では、どんなPHPフレームワークを選べばいいのだろうか？\u003C\u002Fh3>\n\u003Cp>PHPのフレームワークは非常に多い。「CakePHP」「zend framework」「Symfony」「FuelPHP」「laravel」「codeigniter」「Slim」「Phalcon」…数えれば切がない程だ。\u003Cbr \u002F>\n日本ではPHPフレームワークとしては「CakePHP」が主流で、方や世界では一昔前は「codeigniter」が全盛だったが、最近は「laravel」にトレンドが移って来ている。パフォーマンス面では「Phalcon」が最速で、「Slim」「codeigniter」がそれに続いている状況だ。\u003C\u002Fp>\n\u003Cp>そんな状況の中で、アンチ・フレームワーク派な私が一押ししたいのが「codeigniter」だ。「codeigniter」の良いところは学習コストが低いこと、そして非常に導入が楽なところだ。他のリッチなフレームワークと較べると機能面で劣る部分があるものの、メリットのアドバンテージはとても大きいと思っている。\u003Cbr \u002F>\n私は、フレームワークの一番の難点はPHPというプログラム言語以外に独自の「ルール」を学ばなければならないという学習コストが高い点だと思っているので、そのコストが低く、導入敷居も低い「codeigniter」は現時点でどのフレームワークより魅力的である。ただ、「codeigniter」は大規模システムには向かないと云われているので、選定するプロジェクトの性質を見極めてからチョイスする必要がある。\u003C\u002Fp>\n\u003Cp>結局のところ、フレームワークはPHPという大きな枠を超えられない開発支援モジュールであることを理解したうえで、まず学ぶべきはPHP本体であり、そのうえでプロジェクトの性質や納期、開発体制などをかんがみてチョイスしなければならないのだろう。\u003C\u002Fp>\n\u003Ch2>5. PHPの組込み関数を使い倒せ\u003C\u002Fh2>\n\u003Cp>PHPを使って開発を行う以上、ある程度の組込み関数やメソッドを覚えて、そらで使えるようにしておくことが非常に重要だ。もちろん、その前に構文としての\u003Ccode>if\u003C\u002Fcode>や\u003Ccode>foreach\u003C\u002Fcode>などは習得しておかねばならない。そのうえでプロジェクトに必要となる独自機能を関数やメソッドを組み合わせて作っていくのがセオリーとなる。\u003Cbr \u002F>\nでは、どの程度の関数を覚えておけば良いのだろうか…？\u003Cbr \u002F>\n2016年1月現在、PHPには標準で4,598個の組込み関数と5,022個のビルトインメソッドがある。このすべてを覚えていて、そらで使える人はおそらくいないのではないだろうか。\u003C\u002Fp>\n\u003Cp>私も実際のところ、そらで使えるPHPの標準関数は300個前後である。だが、WEBの開発であればこれぐらい覚えていればほぼ事足りる。まれに毛色の違う事をしたくなったら、PHPのドキュメントを調べれば良い。\u003Cbr \u002F>\nまぁ、それでも数は多いので、あくまで私の経験則だが…まずは、配列操作系と文字列操作系、ファイル操作系、マルチバイト文字列関連、各種出力系の関数はある程度覚えておくとコード生産性が高くなるだろう。そのうえで、バッファリングや数学関数、セッション、データベース、サーバコマンド関連あたりを覚えればWEBアプリ開発のシーンであればかなり自由が利くようになると思う。\u003C\u002Fp>\n\u003Cp>そして、一番大事なのは独自の処理を書く前に、「\u003Cstrong>やりたいことが組込み関数でできないか\u003C\u002Fstrong>」を調べることだ。PHPでは大抵の処理は組込み関数で対処できるように準備されている。自前で作った関数よりも組込み関数の方が生産性でもパフォーマンスでも圧倒的に性能が良いことを覚えておくべきである。\u003C\u002Fp>\n\u003Ch2>6. データベースを守るのはプログラマーの務め\u003C\u002Fh2>\n\u003Cp>原文では\u003Ccode>mysql_real_escape_string()\u003C\u002Fcode>を利用してデータベースにデータを格納する前に適切な無害化を行う必要があると書いてある。確かに\u003Cstrong>データベース処理の無害化はプログラマーの義務\u003C\u002Fstrong>であるのだが、推奨されているライブラリには可用性がない。\u003Cbr \u002F>\nというのも、\u003Ccode>mysql_real_escape_string()\u003C\u002Fcode>を含む「mysql」モジュールはPHP 5.5で非推奨となっていて、PHP 7では削除されているからだ。PHP公式ではMySQLデータベースの処理は\u003Cstrong>MySQLi\u003C\u002Fstrong>モジュールか\u003Cstrong>PDO_MySQL\u003C\u002Fstrong>モジュールを使いなさいと謳っている。\u003Cbr \u002F>\nまぁ、どのモジュールを使おうが、処理としてのSQLエスケーププロセスをデータベース入出力に組み込むことには変わりないので、MySQLiを利用するなら、\u003Ccode>mysqli_real_escape_string()\u003C\u002Fcode>を、PDO_MySQLを利用するなら\u003Ccode>PDO::quote()\u003C\u002Fcode>を利用すれば良い。\u003C\u002Fp>\n\u003Cp>ただ、私的にはデータベースのSQLエスケープには前述の「手動エスケープ」ではなく、「プリペアドステートメントへのプレースホルダ代入」を使用することをおススメしたい。特にPOSTやGETといったユーザ入力値を直接データベースアクセスに利用する場合、プレースホルダ型であれば、エスケープ処理が自動で行われるため、プログラマーによるエスケープ忘れによるSQLインジェクション等のシステム脆弱性が発症するリスクをかなり抑えられるからだ。\u003C\u002Fp>\n\u003Cpre>\u003Ccode class=\"language-php:\">$var = $_POST['user'];\n$db = new PDO( 'mysql:host=localhost;dbname=database;', 'root', '' );\n$sth = $db-&gt;prepare( \"SELECT * FROM `users` WHERE user=:var\" );\n$sth-&gt;bindParam( \":var\", $var );\n$sth-&gt;execute();\n\u003C\u002Fcode>\u003C\u002Fpre>\n\u003Cp>上記の例はPDOプリペアドステートメントを利用したデータベースアクセスの例である。ユーザ入力のパラメータを手動でクォートする必要がないので、プログラマーがパラメータのエスケープ処理を意識していなくてもSQLインジェクションから保護される。\u003C\u002Fp>\n\u003Ch2>7. GETは使うな、POSTを使え\u003C\u002Fh2>\n\u003Cp>原文はGETメソッドによるパラメータ渡しはXSS（クロスサイトスクリプティング）等のシステム脆弱性を生む温床になりえるので、POSTを使いなさいと云っている。まぁ、確かにその通りではあるのだが、これも極論過ぎるきらいがある。\u003C\u002Fp>\n\u003Cp>基本的に、システムへのパラメータの受け渡しはPOSTで行うべきであり、どちらかのメソッド固定でないと成り立たないようなアプリケーションはちょっと問題があるといえる。しかし、アプリケーションの利便性や生産性といった側面から評価をする場合、パラメータのGET渡しが必ずしも悪ではないことも覚えておくべきである。\u003C\u002Fp>\n\u003Cp>特にWebAPI型のアプリケーション・プロジェクトでは利用者からのURLベースでの簡便なアクセスがサービスの根幹たりえるため、入力値にGETパラメータを期待することは間違っていない。しかし、そういう場合においては、意図しない、むしろ悪意のあるパラメータが入力されることも予測してパラメータの無害化を行っておくことが必要になってくる。\u003C\u002Fp>\n\u003Ch2>8. コードを書く前に「描け」\u003C\u002Fh2>\n\u003Cp>原文を意訳すると「コーディングに入る前にシステム設計をしなさい」というTIPSだ。当たり前のように思えるが、特に一人で開発をしているとこの部分を端折ってしまうことが多いのも事実だ。\u003Cbr \u002F>\n経験則的に、殴り書きでもいいので作ろうとしている機能のフローチャートを書いてからコーディングした時と、コーディングしながらフローを考えていった場合とを較べると、確実に前者の方が開発工期が短いのだ。\u003C\u002Fp>\n\u003Cp>私もそうなのだが、開発者はコードを書いている時に幸せを感じることもあって、往々にして頭に浮かんだ処理をすぐに書いてみたくなる。しかし、そこをグッと我慢して処理全体の流れを設計してからコーディングに入った方が開発時間は抑えられ、バグも少なくなるのである。\u003C\u002Fp>\n\u003Cp>一方、複数人で開発するようなプロジェクトであれば、必ずプログラマーたちにはシステム設計をさせて、設計レビューを行った後にコーディングを開始するようにマネージメント側がルーチン・ワークを定義してあげると生産性が向上するはずである。\u003C\u002Fp>\n\u003Ch2>9. プロジェクトを理解せよ\u003C\u002Fh2>\n\u003Cp>原文は「画家が見たこともないモノを描くことができないように、歌手が聞いたこともない曲を歌えないように、プログラマーは完全に理解できていないプロジェクトをコーディングできないものだ。だから、プロジェクトの全貌を理解しなさい」と謳っている。正論であり、異論の挟む余地は少ない。\u003C\u002Fp>\n\u003Cp>経験則的に、自分が全体を理解していないサービスにおいて、この部分だけを作ってくれればいいから…とか言われて作ったものは、結果的にシステム的な一貫性が失われていたりして保守性が低くなり、運用時に問題が出たりすることが多かった。\u003Cbr \u002F>\nだからといって、現場の技術者に、参加しているプロジェクトの全貌が常に開示されるわけでもないのが現実だ。まぁ、そんな場合でも「何（誰）のために」「何をする」システム（機能）なのかだけでもきちんと理解してからコーディングに入るべきであり、それら「\u003Cstrong>要求仕様\u003C\u002Fstrong>」が明確でないシステムについては前もってそのリスクを埋める努力をしておく必要があるだろう。\u003C\u002Fp>\n\u003Ch2>10. 書いて、書いて、書きまくれ！\u003C\u002Fh2>\n\u003Cp>つまるところ、プログラミングのスキルを向上させるには「\u003Cstrong>書いて書いて書きまくる\u003C\u002Fstrong>」しかない…というのは万国共通の認識なのだ。\u003C\u002Fp>\n\u003Cp>とにかく「書いて・動かして・失敗して」を繰り返せば、繰り返した数に比例してコーディング能力は上達して行くわけですな。まぁ、これは何もプログラム言語に限った話ではなく、外国語の習得とかも一緒なのだろうと思う。ただ、特にプログラム言語は覚えなきゃいけない構文や単語（命令）が多くても数百～数千程度と実際の言語より少ないので、習得はしやすいと云えなくもない。\u003Cbr \u002F>\nまた、スクリプト系の高級言語の場合、どれか一つでもプラグラム言語覚えてしまうと、他の言語でも何とか読めるし、見様見真似で書けるようにもなるという利点もある。\u003C\u002Fp>\n\u003Cp>まぁ、原文でも述べられているが、プログラム言語の解説本や先輩のコードをいくら読んでもプログラミング・スキルはさっぱり伸びない。ただひたすら書かない限り上達しないということだけは覚えておいてほしい。\u003C\u002Fp>\n\u003Ch2>まとめ\u003C\u002Fh2>\n\u003Cp>最後にPHPの生みの親であるラスマス・ラードフ氏の面白い言葉を引用しておこうかと。\u003C\u002Fp>\n\u003Cblockquote>\u003Cp>\n  \u003Cstrong>PHPはひどいコードを動かすのが驚くほど得意な寛容な言語である\u003C\u002Fstrong>\u003Cbr \u002F>\n  \u003Ca href=\"http:\u002F\u002Fgihyo.jp\u002Fnews\u002Freport\u002F2015\u002F12\u002F1401\" title=\"\" class=\"origin pull-right\">PHPの生みの親，ラスマス・ラードフ氏インタビュー\u003C\u002Fa>\n\u003C\u002Fp>\u003C\u002Fblockquote>\n\u003Cp>氏曰く、「\u003Cstrong>世界最悪のコードを書いたとしても、PHPならまだ動くし、実際速度も出るし、スケーリングも可能\u003C\u002Fstrong>」という、PHPの寛容さに甘えて（笑）、ぜひとも2016年はPHPを書きまくりたいと思う。\u003C\u002Fp>\n",[272,275],{"slug":273,"name":274},"php","PHP",{"slug":276,"name":277},"tips","Tips",[279,287,292,297],{"slug":280,"title":281,"date":282,"excerpt":283,"image":42,"categories":284},"compared-to-goutte-and-phpquery-of-scraping-library-for-php","PHPのWebスクレイピング・ライブラリ「Goutte」と「phpQuery」を比較してみた","2015-02-02T12:06:34","Custom DataBase Tablesなど自作のWordPressプラグインを公式SVNに登録していると、ダウンロード状況等のステータスを毎度WordPress.orgまで見に行くのが億劫になってくるのはオレだけだ…",[285,286],{"slug":22,"name":23},{"slug":25,"name":26},{"slug":142,"title":143,"date":144,"excerpt":145,"image":146,"categories":288},[289,290,291],{"slug":149,"name":150},{"slug":138,"name":139},{"slug":25,"name":26},{"slug":166,"title":167,"date":168,"excerpt":169,"image":170,"categories":293},[294,295,296],{"slug":161,"name":162},{"slug":138,"name":139},{"slug":25,"name":26},{"slug":176,"title":177,"date":178,"excerpt":179,"image":170,"categories":298},[299,300,301],{"slug":161,"name":162},{"slug":138,"name":139},{"slug":25,"name":26},{"slug":303,"title":304,"date":305,"excerpt":306,"image":307,"categories":308},"2015-of-ka2-hit-products-top5","ka2の2015年ヒット商品TOP5","2015-12-18T11:58:44","2015年も12月になって残すところあと2週間ほどだ。 今年は私にとって大転機の年になった。 というのも、約15年勤めた会社を辞めて独立することにしたからだ。 その長居してしまった会社に出社する日はもうなく、今は有給休暇…","\u002Fassets\u002Fuploads\u002F2015\u002F12\u002Fplay_wii_u_rs01.jpg",[309],{"slug":255,"name":256},{"slug":311,"title":312,"date":313,"excerpt":314,"image":315,"categories":316},"8-steps-to-help-when-you-become-to-individual-employer-after-retired","会社辞めてフリーランスになる時に覚えておきたい８つの手順","2016-01-22T12:39:49","私は、先月12月一杯で会社を辞めて、晴れて今月からフリーランスとして個人事業主になった。 その際、色々と手続きしたことや、各種書類の説明などをまとめておこうと思った次第。今後、私が事業主として誰かを雇った時のための手…","\u002Fassets\u002Fuploads\u002F2016\u002F01\u002Fshutterstock_214226350_resized.jpg",[317],{"slug":255,"name":256},1793391397881]