サクサク読めて、アプリ限定の機能も多数!
トップへ戻る
世界禁煙デー
k-holy.hatenablog.com
git diff コマンドと git archive コマンドを利用した差分抽出については知ってはいたんですが、しばらくFTPでのアップロードが必要なプロジェクトから逃れていたこともあり、あまり追求していませんでした。 今回再びそのような環境に携わることになりましたので、Windowsで実現する方法を調べて試してみたところ、以下のようなバッチファイルでうまくいきました。 git-archive-diff.bat @echo off setlocal ENABLEDELAYEDEXPANSION set DIFF_LIST= set NEW_SHA=%1 set OLD_SHA=%2 if "%OLD_SHA%" == "" ( set OLD_SHA=%NEW_SHA% set ARCHIVE="%NEW_SHA:~0,7%.zip" ) else ( set ARCHIVE="%OLD_
JavaScriptのグラフ描画ライブラリ Chart.js サンプルが綺麗でシンプルなためかデザイナーの方に人気のようで、いろんなブログで紹介されてます。 しかしサンプルではラベルを設定しているにも関わらず凡例が表示されておらず、「凡例を表示する機能がない」とまで書かれている記事もあって、そんなバカなと思いつつ公式ドキュメント(Chart.js | Documentation)を確認したら、ちゃんと対応されていました。 凡例にラベルを出力するには legendTemplate オプションと generateLegend() メソッドを使え 凡例にラベルを出力するには、グラフの設定オプション legendTemplate でラベルを出力するよう値を指定した上で、ChartオブジェクトのgenerateLegend()メソッドを実行し、その戻り値で得られるHTMLをどこかに差し込む必要があり
現在、データベースのレコード単位で一意に識別されるデータを不変オブジェクトをベースにしたEntity Objectと、その属性となるValue Objectの設計を実践中ですが、やったこと&やっていることのメモです。 内容的には Traitで不変オブジェクトにしてキャッシュ可能なクラスを作る からの続きになります。 Entity Objectの利点 Entityではなく単なる連想配列として実装していた頃は、たとえば管理画面にログイン中のユーザーが一覧のうち自身の情報のみ編集できるとして、こんな感じで書いてました。(例はSmarty3 + Bootstrap2) 配列の場合 {{foreach $administrators as $administrator}} <tr> <td>{{$administrator.name}}</td> <td>{{$administrator.login
まず手元の Windows7 + PHP 5.6.0 で検証した上での結論を書くと 「Windows で日本語ファイルパスを扱う場合 SplFileInfo は使うな」 です。 ロケール設定を適切に行うことで basename() や pathinfo() に関しては、Shift_JISのコード表に起因するいわゆる「5C問題」も回避できました。 しかし、SplFileInfo::getBasename() や SplFileInfo::isFile() に関しては、適切にロケールを設定したとしても、残念ながら「5C問題」を回避できなかったのです。 ロケール設定の影響を受ける関数について 文字列関数は基本的にマルチバイト非対応のものが多いのですが、中には対応はしているがロケール設定に依存する、というものもあります。というか結構多いです。 ファイルパスを扱う際によく使われる basename(
SparkleShare をWindows7に入れて使ってみたメモです。 SparkleShareが何なのかは、ちょっと古いですがこちらの記事が分かりやすかったです。 SparkleShareメモ - nofuture.tv SparkleShareは、バージョン管理システムGitを利用したリアルタイムファイル共有システムです。 誤解を恐れず書くと オープンソース版オレオレDropboxが作れるツール というとわかりやすいでしょう。 SparkleShareを利用するにはクライアントソフトのSparkleShareのほかに、ファイルを中継して共有するための共有Gitリポジトリが必要になります。 そう書くと、とても面倒なように聞こえますがGitを利用したWebサービスのgithubやGitorious、Bitbucketなどに対応しており、アカウントがあればすぐにSparkleShareを利
mysqli::__construct() で以下のエラーが発生。 mysqli::mysqli(): (HY000/2002): No such file or directory 調べてみると、MySQLのソケットファイル(mysql.sock)が見当たらない場合にこのエラーが発生することがあるようです。 パッケージでインストールした場合はよしなに設定してくれるはずですが、順序によるものか、MySQLの設定とPHPの設定でソケットファイルのパスが異なってしまうケースもあるとのこと。 (そういえば某レンタルサーバの初期設定で同様の問題が起きていました…) 参考 php+mysqli で No such file or directory エラーが発生 mysqliモジュールの設定をコマンドで確認してみます。 $ php --ri mysqli mysqli MysqlI Support
Qiitaに投稿した PHP Advent Calendar 2013 20日目の記事 PDOでオブジェクトをフェッチ&JSONとCSVファイル出力 の補足…というか、むしろ当初はこちらが本題の予定だったものです。 名著と評判の『Effective Java 第2版』を何年か前に読んで、不変オブジェクトという概念を知ったものの、当時は「ふーん、でもPHPには関係なさそう…」という感想で終わりました。 しかし、メインに使うテンプレートエンジンを Smarty3 から PHPTAL に変えるとともに、これまで全てただの連想配列で済ませていた、レイヤ間を横断するデータをオブジェクトに変えてからは、PHPでも不変オブジェクトを積極的に使った方が良いと感じるようになりました。 特にビビッときたのは増田亨さんの記事 いまさら聞けない「オブジェクト指向設計の3つのコツ」~オブジェクト指向設計問題解説 #
自分のライブラリを Travis CI でのユニットテストに対応しましたが、このたびカバレッジレポートを公開できるサービス Coveralls にも対応したメモです。 恥ずかしながらこれまでカバレッジレポートの意義が理解できてなかったんですが、 php-coveralls を使えば簡単に Travis CI から Coveralls にレポートを転送して可視化してくれるようなので、試しにやってみました。 Coveralls への登録 CoverallsへのサインインはGitHubアカウントがあればOK。 入るとGitHubのリポジトリ一覧が表示されるので、Coverallsへのサービスフックを有効にしたいリポジトリのトグルスイッチを「ON」に設定します。 GitHubへのAPIトークンの設定なども、自動でやってくれます。 以下、 Volcanus_Routing の例 PHPUnit設定フ
昨日の昼ごろから突然、下のような状態になって php.net が見られなくなってしまったわけですが…。 どうしよう $haystack と $needle の順番が分からない! そんな時も安心、実はCLIのphpコマンドで関数のリフレクションが見られるのでした…! http://jp.php.net/manual/ja/features.commandline.options.php --rf 関数名 で関数 --rc クラス名 でクラス(定数、プロパティ、メソッド一覧) --ri モジュール名 でモジュールの設定(php.iniオプション) ※コア機能は"main"モジュールを指定 使いそうなのはこの辺りでしょうか。 や、もう見られるようになってますが。 User Contributed Notes とか別に要らないという場合には、素早く調べられて便利だと思います。 ヤッター こういうの
自分のライブラリをTravis CIでテストしてみたメモです。 ほぼ自分専用だし、別に困ってないし…と思って今まで手を付けてなかったんですが、個人ライブラリではユニットテストもそこそこ書くようになってて、 業務でも PHP 5.3系 / 5.4系 プロジェクトが併存している状況になりつつあるので、この機に対応してみました。 単機能的なライブラリばかりなので、対応といってもやることは大してなかったです。 Travis CI への登録 Travis CIへのサインインは GitHubアカウントがあれば即入れます。 入るとGitHubのリポジトリ一覧が表示されるので、Travis CIへのサービスフックを有効にしたいリポジトリのトグルスイッチを「ON」に設定します。 GitHubへのAPIトークンの設定なども、Travis CI側から自動でやってくれます。すごい楽。 以下、 Volcanus_T
タイトルは「いとしさとせつなさと…」みたいな感じで読んでください。 マジックメソッド、ArrayAccessインタフェース、Traversableインタフェースを実装した配列風のクラスを作成する際に引っかかりがちな(?)、__isset() と offsetExists() の仕様上の罠についてメモです。 内容的には ArrayAccess + マジックメソッドで公開する値と内部の値を変換するクラスにTraversableを実装する際の注意点 のほぼ続編になります。 罠というか言語仕様の不備と言ってもいいんじゃないかと考えてるのですが、PHPマニュアルの記述とともに isset(), empty(), offsetExists() それぞれについて見てみます。 isset() 個人的にはコード内で一番使用頻度が高いんじゃないかという言語構造で、PHPを使う上で最初に把握しておいて欲しいとこ
とてもターゲットの狭い記事ですが、ほぼ自分用メモです。 たとえば、外部からセットされたDateTimeオブジェクトを内部的にUnixTimestampに変換して保持し、外部に返す際は再びDateTimeオブジェクトに変換して返すようなオブジェクト。 そのために、マジックメソッド経由で値を変換して受ける/返す機能を持つクラスやTraitを、ArrayAccessとマジックメソッドを使って作成するとします。 それだけなら問題起きないのですが、気を利かせて(?)Traversableを実装して foreach時にも上記の仕様通りに値を返したい場合。 内部的には $attributes みたいなプロパティに配列で保持するとして、IteratorAggregate を implements してgetIterator() で $attributes の ArrayIterator を返すような手抜き
私はシェルスクリプト力が皆無なので、タイトルはほぼ釣りです。(でも他に表現のしようがないし…) AnsibleやFabricといった自動化ツールとの連携を検討していたんですが、ひとまずVagrant単体でできるプロビジョニングを試してみたメモです。 新原さんのスライド もう XAMPP / MAMP はいらない!?Vagrant で作る PHP 開発環境 24ページ以降の内容を手がかりに、Vagrant Documentation も参照しつつ進めます。 Windows7にVirtualBoxとVagrantをインストールしたメモ に引き続き、実行した環境はWindowsです。 プロジェクトの準備 まずはプロジェクト用ディレクトリを作成して、gitで管理します。 以下、Windows8 + NYAOSのシェルにて。 (コマンドは MinGW/MSYS や NT版UNIX-like tool
開発環境に便利と話題のVirtualBoxとVagrantを、ようやくインストールしてみたメモです。 こちらの記事を参考にしました。 WindowsでVagrantする - みんなのちからになりたい Window 7 でVagrantでCent OS 6.3入れてみた - 僕の車輪の再発明 VirtualBoxを入れる Downloads ? Oracle VM VirtualBox から VirtualBox 4.2.16 for Windows hosts x86/amd64 をダウンロードして実行。 Setup Wizardが起動するので Next Next。なんかOracle製のドライバ類が色々インストールされるけど気にしない。 Vagrantを入れる Vagrant - Downloads から 最新版 v1.2.7 のページに飛び Vagrant_1.2.7.msi をダウンロ
相変わらずSilexとPimpleを拡張した自作フレームワークを行ったり来たりしています。 SilexアプリケーションでUrlGeneratorを使ったサブディレクトリ運用への対応(たとえば http://example.com/foo/ 以下をアプリケーションのルートとする)で、コントローラから別のコントローラに処理を委譲する、いわゆるサブリクエストをApplicationクラスに実装しようとしてハマってしまいました。 Silexのサブリクエスト機能 公式ドキュメントにはサブリクエストの方法として以下のようなコードが記載されています。 <?php use Symfony\Component\HttpFoundation\Request; use Symfony\Component\HttpKernel\HttpKernelInterface; $app->get('/', functio
Pimpleを拡張して自分好みに使うために作成した小さなアプリケーションクラスを使って、マイクロフレームワークっぽいものを作る試みです。 マイクロフレームワークをつくろう - Pimpleの上に(Pimple拡張編) マイクロフレームワークをつくろう - Pimpleの上に(とりあえずフォーム編) マイクロフレームワークをつくろう - Pimpleの上に(Symfony HttpFoundation導入編) マイクロフレームワークをつくろう - Pimpleの上に(Rendererクラス作成編) マイクロフレームワークをつくろう - Pimpleの上に(RESTインタフェース編) マイクロフレームワークをつくろう - Pimpleの上に(PHPTAL導入編) マイクロフレームワークをつくろう - Pimpleの上に(例外処理とエラー画面・Twitter Bootstrap導入編) マイクロ
DIコンテナの効能が謳われだして久しい昨今、業務でもSilexでいくつか小さなアプリケーションを作ったりする中で、ようやくその利点を実感するようになりました。 そのうち、実は自分が惚れたのはSilexではなくて、その母体たるPimpleだったんじゃないかと考えるに至ったので、Pimpleを自分好みに使うための小さなクラスを作成してみました。 以下、コードはPHP5.4で動作確認しています。 <?php namespace Acme; class Application extends \Pimple { private $handlers; public function __construct(array $values = array()) { parent::__construct($values); $this->handlers = array(); } public funct
Windows7 (MinGW / MSYS) で Fabric シリーズ記事です。 Windows7 (MinGW / MSYS) に Python 2.7 + virtualenv + Fabric を入れたメモ Windows7 (MinGW / MSYS) に virtualenvwrapper を入れたメモ Fabricで接続情報を指定する方法いろいろ&FabricからPHPスクリプトを実行してみたメモ 真性PHPerでも分かった?FabricでWindowsからファイルアップロード 今回は(今回も?)Fabricの使い方としてはPHP無関係ですが、タスクの内容が composer コマンドなのでPHPer向けといえばPHPer向けです。 fabfile.pyをパッケージにしてタスクをモジュール分割 公式ドキュメント Fabfile construction and use —
Windows7 (MinGW / MSYS) で Fabric の続きです。 Windows7 (MinGW / MSYS) に Python 2.7 + virtualenv + Fabric を入れたメモ Windows7 (MinGW / MSYS) に virtualenvwrapper を入れたメモ Fabricで接続情報を指定する方法いろいろ&FabricからPHPスクリプトを実行してみたメモ ファイルは作業ディレクトリに上げてからサーバ上でPHPスクリプトを実行すれば思いのままに…!とか考えてましたが、色々やるうちにまどろっこしく感じてしまい、結局Python/Fabricで何とかすることにしました。 同じことで迷わないためのメモです。環境は Windows7 / MSYS 1.0 / Python 2.7 / Fabric 1.6 です。 ローカルにカレントディレクトリ以
Windows7 (MinGW / MSYS) で Fabric の続きです。 Windows7 (MinGW / MSYS) に Python 2.7 + virtualenv + Fabric を入れたメモ Windows7 (MinGW / MSYS) に virtualenvwrapper を入れたメモ ですが、多分今回の内容は実行環境に関係なく共通だと思います。 fabコマンドでSSHの接続情報を指定する方法 接続情報は fabfile.py の中で以下のように指定するのが基本ですが… from fabric.api import env env.hosts = ['133.242.2.104'] env.key_filename = ['~/.ssh/id_rsa'] env.user = 'kholy' env.password = 'hoge' fabコマンドにはこれだけの
最近、同一環境の複数サーバ(Linux)に対して環境設定することがあって、自動化のためにPython製のツールFabricを使い始めました。 ちょうどそのタイミングで、PHPで作成したWebの管理画面からLAN内の複数のサーバに対してコマンドを実行したいことがありまして、exec()関数でFabricを呼ぶ形にしたらとても便利でした。 それならいっそ、Windowsのローカル開発環境からでも実行できるようにしてみようと思い立ち、Windows7 (MinGW/MSYS) にPythonとFabricを入れたメモです。 Python 2.7 をインストール Python公式の Download Python から Pythonの最新安定版は 3.3系の 3.3.1 と 2.7系の 2.7.4 がありますが、3.3系を入れたところ Fabric を入れる段階で詰まってしまいました。 ひとまずW
SqaleでPHPアプリケーションを動かす記事の続きです。 最近、メールサーバを導入していない環境でメールを送信するため、Symfony系フレームワークで標準採用されているライブラリ swiftmailer を扱う機会がありました。 Sqale のアプリケーション環境においてもメールサーバが提供されていなかったので、Silexとswiftmailerを使ってフォームからGMailサーバ経由でメール送信してみたメモです。 Sqale - FAQ: 技術的な仕様に関する質問 アプリケーションからメールを送信するための仕組みはありますか? 開発環境にswiftmailerをインストール 開発環境はWindows7で、シェルはmsysGit付属のBashを利用しています。 まずは前回と同様、Composerを使ってswiftmailerをインストール。 composer.json { "requi
私のような真性PHPerは指を咥えて見ているしかなかったクラウドPaaS Sqale ですが、PHPに対応されたとの嬉しい知らせがありました。 SqaleでPHPアプリケーションも利用可能になりました! | Sqale Information 更に、このタイミングでアプリケーション1個が無料になるというキャンペーンも…!! Sqale『無料アプリケーション1個 プレゼント』キャンペーン実施中! | Sqale Information これは試してみるしかないでしょう。 そんなわけで、SqaleのPHPアプリケーションでSilexを動かしてみたメモです。 注意点 Sqaleの環境に不慣れな真性PHPerとして、色々とはまって調べたり思い込みで誤ったことがありましたので、まず注意点をまとめておきます。 SqaleのサーバにSSHで接続する方法 管理画面から登録した公開鍵でログインできます。 s
CSVファイルの入出力用ライブラリ Volcanus_Csv を使ったシリーズ記事です。 話題の LTSV を扱ってみようと思い立ったものの、お世話になっているレンタルサーバGehirn RS2ではApacheのログフォーマット変更は難しい…。 そんなわけで、ローテート済みのcombinedフォーマットなHTTPアクセスログを、SymfonyのFinderコンポーネントでまとめて、拙作ライブラリ Volcanus_CsvでLTSVフォーマットに変換してみました。 Volcanus_Csv は CSV と名乗ってはいますが、ナントカ Separated Values なら何でも扱える作りになってます。 ただし、HTTPアクセスログにおけるLTSVのようにエスケープ不要なケースを想定していなかったので、ちょっとした改修が必要となりました。 参考:LTSV のもうひとつのメリット、あるいは、プロ
Advent Calendar 用のサンプルコードを書くに当たって、Silexアプリケーションをサブディレクトリで運用したメモです。 なお、例のごとくサンプルコードではテンプレートエンジンにSmartyを使っています。 Apache + mod_rewrite で解決 Apache + mod_rewrite 環境においてSilexアプリケーションをサブディレクトリで運用する例です。 ドキュメントルートおよびサブディレクトリで運用するSilexアプリケーションのエントリスクリプトのパスは以下とします。 ドキュメントルート /home/kholy/public_html/ エントリスクリプト /home/kholy/public_html/sub/index.php この場合 /home/kholy/public_html/sub/ に .htaccess ファイルを設置、RewriteBa
Symfony Advent Calendar JP 2012 22日目の記事です。 まずはじめにお断りしておきますが、この記事はSymfony未経験者向けです。 (飛び入り参加なのに低レベルな内容ですみません…) HTTP/1.1 には If-Modified-Since, If-Unmodified-Since, If-Match, If-None-Match, If-Range ヘッダによる「Conditional GET Request」、いわゆる条件付きGETリクエストの仕様があります。 これまでは熟成された秘伝のUtilクラス(という名前の $SERVER とか $REQUEST にアクセスする処理が無造作に詰め込まれたくそ関数集)で行っていたんですが、Symfonyコンポーネントの HttpFoundation を使って If-Modified-Since, If-Match
PHP Advent Calendar 2012 11日目の記事です。 昨日は Shusuke Otomo さんの 初めて Pull Request した話。 #phpadvent2012 | slumbers でした。 皆さん、テンプレートエンジンは何を使ってますか? おおっぴらに使ってますと発言するのもちょっと勇気がいるくらい、スキル高そうなPHPerの皆さんからよくdisられている(ような気がする)Smartyですが、実際のところ現役のユーザーは結構いるんじゃないでしょうか。 (参考記事 PHP ユーザは実際はどんなテンプレートエンジンを使っているのか? (途中経過) - A Day in Serenity @ kenjis) 今回はそんなSmartyを題材に「テンプレート変数のHTMLエスケープ」と、それに関連する機能「修飾子プラグイン (Modifier Plugin)」「変数フ
@calpo22 さんの記事 PyrusでプロジェクトローカルなPEARライブラリインストール : PHP Advent Calendar jp 2011 Day 10 - くろまほうさいきょうでんせつ にき続き、 PHP Advent Calendar jp 2011 11日目の記事です。 皆さん、エラー処理ちゃんとやってますか? 今時は、設定を書いておけばフレームワークがよしなにやってくれるよ、という方が多いかもしれません。 PHP4時代を戦い抜いた人は、皆自分なりのエラー処理関数を書いてset_error_handler()とtrigger_error()を駆使した経験があると思います。 私も当時は、サブルーチンを呼ぶたびに戻り値をチェックして return FALSE をリレーしていき、レスポンス出力の段階でFALSEが返されていればエラー画面をinclude、といった処理をしてい
先日公開したCSV入出力用ライブラリ Volcanus_Csv ですが、実際に使わないと改善点も見えてこないので、あれこれやってみます。 今回は Silex で Volcanus_Csv のレスポンス出力を利用せず、通常のコントローラと同様に Response オブジェクトを利用してみました。 元々レスポンス出力機能を付けたのは、Symfony HttpFoundation 単体でファイルのダウンロード用レスポンスを生成する方法が分からなかったことが理由の一つなんですが、これについてはタイトルの StreamedResponse クラスを使うことで解決できました。 Response クラスを継承した StreamedResponse クラスは第1引数にレスポンスの内容そのものではなく、内容を出力するコールバックを受け付けるので、データベースやファイルの内容を読み込みつつ出力することが可能に
次のページ
このページを最初にブックマークしてみませんか?
『k-holyのPHPとか諸々メモ』の新着エントリーを見る
j次のブックマーク
k前のブックマーク
lあとで読む
eコメント一覧を開く
oページを開く