投稿

8月, 2008の投稿を表示しています

【PHP】知っておくとためになるPHPコーディングのTips

塵も積もれば山となる。プログラマの小さな気遣いがシステム全体のレスポンスに大きく関ってくる。 ・・・A型の人の心にしか響かないようなこの言葉。 PHPのコーディングをするときに知っておくとよいTipsがあったので紹介します。 ここ に「echo VS print」や「ダブルクォート VS シングルクォート」など少しでもより速いコードを書くためのtipsがまとまっています。 ここ にも独自に調べて解説が書いてあるので参考に。 すぐに実践しようと思ったTipsはこんな感じ。 (PHP5以降で)staticできるメソッドはstatic宣言する(4倍速い) クラス内で定数代わりに使っている変数はconstする ループの条件文には式を書かず、事前に変数に格納する(ループのたびに計算するのを回避) 正規表現の処理は重い なるべくもとから用意されている(PHPネイティブな)関数を使う $row['id'] は $row[id] より7倍速い インクリメント(1増やす処理)はローカル変数で行ったの方が速い クラス内に10以上のメソッドがあってもパフォーマンスは変わらない 時間があれば社内のコーディングルールとしてまとめていきたい。 ・・・そんな私はもちろんA型です・・・。 名古屋でプロのSEを目指す

【PHP】特定のタグだけescape(エスケープ)しないSmarty関数

EC-CUBE の開発で、mtb_allowed_tagに登録されたタグのみ有効にし それ以外はescapeする処理を組み込んだときのメモ。 EC-CUBE開発元のロックオン開発チームブログが参考に。 ここ 。 このブログにあったのを下のように修正(正規表現とか)。 <?php /** * 許可したHtmlタグだけエスケープせず出力する。他のタグはエスケープ. * * @param  string $sValue      変換する文字列. * @param  array  $arrAllowTag 許可するHtmlタグを格納した配列. * @return string              変換した文字列. */ function smarty_modifier_htmlescape($sValue, $arrAllowTag = array()) {     $sValue = htmlspecialchars($sValue);     if (count($arrAllowTag) == 0 ) return $sValue;     foreach($arrAllowTag as $sTag) {         if (strpos($sTag, '/') === false) {             $sValue = preg_replace_callback("/&lt;\/?". $sTag . "( .*?&gt;|\/?&gt;)/i","htmlescape_unhtmlescape", $sValue);         }     }     return $sValue; } /** * タグを変換する. * * @param  string $sValue 変換する文字列. * @return string         変換した文

【PHP】参照渡しと値渡しの速度比較

普通に考えて同じメモリ空間を利用するので「参照渡し」のほうが速いと思いますが、いったいどれくらい違うのか調べた(検索した)メモ。 ここ に実際テストコードを書いて実験した人の結果が。 「参照渡し」のほうが少し(10%ぐらい)速いらしいです。 あと参考になったのが 関数に渡した時点ではどちらも「実体」を示す「ポインタのようなもの」が渡されていて、関数内で変更された時はじめて渡した値がコピーされるという動作のようです。つまり受け取った変数を変更しなければ値渡しと参照渡しで差は無いということです。 ということ。 PHPのコードレビューをするときは 数値、文字列、配列は値渡し。 オブジェクトは参照渡し。 数値、文字列、配列は特別な事情がない限り参照渡しは使わない。 なるべくメンバ変数やオブジェクトに格納して使う。 というのを意識してますが、たまに参照渡しをがっつり書いているコードを見かけます。 理由を聞いてみると大抵「その方が速いと思いました」という答えが返ってくる。 そりゃ速いだろうけど、そのようなコードは関数(メソッド)間の「結合」が強すぎて、他のプログラムからは再利用しづらし、あとで似たようなコード(関数、メソッド)が増えてしまい全体として遅くなるし、バグも多くなる。 でも、まぁ実行速度を考えているのは良いことかな・・・。 ちゃんと動いているように見えてもコードは崩れかけのジェンガのように危なっかしいものだったりするので、コードレビューの大切さを実感する瞬間です。 軽量、軽快なPHPフレームワーク「pettiwork」

【PostgreSQL】チューニングとautovacuum

PostgreSQL8.3からデフォルトで autovacuum が有効になり、 vacuum analyze とかしなくてもよくなりましたが、8.2までの場合は気にしないといけません。 8.1と8.2の場合はautovacuumの機能を有効にします。 [PostgreSQLウォッチ]第19回 ベータ・リリースを間近に控えたPostgreSQL 8.1 - オープンソース:ITpro 7.4まではcronなどで定期的にvacuumしてあげないといけない。 PostgreSQLのチューニングに関しては、下記記事が分かりやすい。 SQL Power - Tuning PostgreSQLを遅くしている犯人はどこだ?(1/3) - @IT 今までSQL Serverでの開発が多かったで、統計情報に関しては特に気にしていませんでしたが(SQL Serverは統計情報の収集を自動でやってくれる)、統計情報についても勉強しとかないと後々はまりそう。 Microsoft SQL Server 2005 のクエリ オプティマイザが使用する統計情報   < 2011/12/22 Modified > Tweetされたので体裁を整えた。

一つのIPアドレスで複数のWebサイトを運営するapacheの設定

サーバに割り当てられたIPアドレスは一つだけど、DNSの設定で割り当てたサブドメインごとにWebサイトを構築したい場合のメモ。 例えば http://cotv.exbridge.jp/ http://hoge.exbridge.jp/ は同じIPに名前解決されるけど、それぞれ別のWebサイトとして表示したい場合、webサーバ(apache)のバーチャルホストの設定をしてあげることで実現できます。詳しくは ここ のドキュメントで。 以下設定例 NameVirtualHost *:80 <VirtualHost *:80>   DocumentRoot /www/example1   ServerName cotv.exbridge.jp   # Other directives here </VirtualHost> <VirtualHost *:80>   DocumentRoot /www/example2   ServerName hoge.exbridge.jp   # Other directives here </VirtualHost> @ITの記事も参考に。 第8回 バーチャルホストによる複数サイトの同時運用   <2009/05/19 追記> Wordpress MUなどでサブドメインとして各ユーザのブログURLを発行するシステムの場合(例えば http://se-suganuma.hoge.exbridge.jp/ とか)、ServerNameの他に ServerAlias を使って設定する。 DNSには a *.hoge 123.456.789.123 と書いておいてapacheのconfigファイルには <VirtualHost *:80>   DocumentRoot /www/example2   ServerName hoge.exbridge.jp    ServerAlias *.hoge.exbridge.jp   # Other di

EC-CUBEで携帯画面から注文できない

EC-CUBEの動作確認で携帯からアクセスしてみると注文ページに移動するとカートに何も入っておらず処理が続行できなくなることがあります。 その場合はapacheの設定ファイルにあるAllowOverrideをALLにする必要があります。 これはディレクトリに置いてある.htaccessを有効にするかの設定です。詳細は ここ 。 レンタルサーバなどでこれが無効になっていると、PHP側でsession.use_trans_sidをini_setするか携帯用のセッション管理を実装しないと駄目そうです。 session.use_trans_sidはCookieが使えないブラウザ(携帯など)で自動的にセッションIDを付加することができる機能を有効にします。詳しくは 前に書いた記事 を参考に。 軽量、軽快なPHPフレームワーク「pettiwork」

【HTML】携帯用のショートカットリンクで使い勝手をよくする

携帯サイトでよくある、リンクに数値が表示されていて、その番号を押すと簡単に選択できる技。 ダイレクトキーとかイージーフォーカスと呼ばれているみたいです。 これを使うためにはaタグにaccesskey属性を記述します。 aタグだけでなくinputやtextareaにも指定可能です。 詳しくはdocomoのページで。 ここ 。 softbank独自の仕様でdirectkey属性というのがありますが、docomoとauで動かないので使わないことをおすすめします。 softbankの携帯でもaccesskeyで動作するみたいです(全ての機種を試したわけではないですが)。 実際の記述はこんな感じ <a href="http://se-suganuma.blogspot.com/" accesskey="0">SE奮闘記</a>   <2009/11/27 追記> ドコモへのリンクが切れていたので修正。技術情報は下記リンクから探す [ドコモ公式]作ろうiモードコンテンツ

【SQL】ISNULLみたいにNULL値を置き換えるCOALESCE関数

SQL文を書いているとWHERE句にNULLを考慮しない書き方をしてしまって 値が取れてこないというのをよくやりますが、そんなとき使うのが COALESCE (読みは「 こぅあれす 」)。 SQL ServerではISNULL関数をよく使ってましたが、この関数はPostgreSQLやOracleにはありません。 COALESCEはSQL標準の関数なのでSQL server, My SQL, PostgreSQL, OracleなどSQL準拠しているDBでは使えるはずです。 使い方は引数の中でNULLでないもの返すので、たとえばこんな感じ select COALESCE(name1, name2, 'ゲスト') from user_master PHP用DB接続支援ライブラリ「somfa」

誕生日はサプライズ

昨日は私の28回目の誕生日。 なんかありそう・・・と思ってましたが予想外のサプライズが待ちかまえていました。 まず朝来ると机にバナナが一本。 「何これ?」と聞くと誕生日プレゼントらしいので「あぁ、ありがとうございます。」とありがたく頂きました。ちなみに105円と値札が貼ってあったので、それなりにいいバナナみたいです。 それから特に気にすることなく、黙々と仕事をこなしていると昼過ぎに 「菅沼さん!!」 と呼ばれ、ビクッとなって振り向くとカロリーメイト20セットを持った猫耳を付けた 後輩 が立っていました。かわいくはないんですけど・・・、 「あぁ、ありがとうございます。」と皆様にお礼をいい、誕生日イベントはこれで終わりという雰囲気となりました。 しかし・・・ これまではメインイベントのための伏線。 社長 を筆頭に綿密に計画されたサプライズの序曲に過ぎませんでした。 夜、7時ぐらいに「面接に出て」と言われ、会議室に向かいました。最近面接に出てなかったですけど、まぁ特に疑うこともなくと一応ネクタイを付け会議室のドアを開けると、そこには・・・ (゚Д゚) ・・・ (゚Д゚) ・・・ まさか、あの人を呼び出すとは・・・。企画側の行動力をなめてました。 そこで、ブログ大賞の賞金とカロリーメイト10個を追加で頂き、さらに バーベキュー で知り合ったちびっ子もわざわざ会社に来てくれて、こくまろカレーと熟カレー合わせて5箱をくれました。 皆さん本当にありがとう。 わざわざこのために来てくれたサプライズゲストとちびっ子もありがとう。 今思えば怪しい行動がチラホラとあったので、気付かなかったのは悔しいですが、ここまでサプライズされたのは初めてだったのでうれしいです。 これでしばらくはカロリーメイトとカレーには困らなくてすみそう。(^^;

【Linux】PostgreSQL 8.3.3のコンパイル→インストール→設定

akiyasu 氏が既に書いてますが、さらに自分でやってみたメモ。環境はCentOS ソースは ここ からダウンロード。 基本は 公式日本語マニュアル をみながら。 必要なツールをyumで取得する $ yum install gcc $ yum install readline-devel zlib-devel 解凍してコンパイルとインストール $ tar xzvf postgresql-8.3.3.tar.gz $ cd postgresql-8.3.3 $ ./configure $ gmake $ gmake install postgresユーザを追加 $ useradd postgres $ passwd postgres (ログインさせたくないので設定しない) ライブラリの登録 $ vi /etc/ld.so.conf.d/local.conf /usr/local/pgsql/lib を追加。 $ ldconfig postgresqlの設定ファイルの置き場所を作る $ mkdir /usr/local/pgsql/data $ chown postgres /usr/local/pgsql/data/ postgresユーザになってデータベースの初期化 $ su postgres $ cd $ vi ./.bashrc PATH=/usr/local/pgsql/bin:$PATH export PATH を追加。読み込み。初期化。 $ source ./.bashrc $ initdb -D /usr/local/pgsql/data rootになって起動スクリプトを準備してPostgresSQLの起動 $ exit $ cp contrib/start-scripts/linux /etc/rc.d/init.d/postgresql $ chmod 755 /etc/rc.d/init.d/postgresql $ /etc/rc.d/init.d/postgresql start 自動起動するように $ chk

【PHP】エラーメッセージ出力するphp.iniの設定

xampp を使って開発をしていると気づかないですが、apacheとphpをインストールした直後はエラーメッセージを画面に出さない設定になっていることが多いです。 開発用のサーバではエラーメッセージを画面に出して欲しいので/etc/php.iniを変更する必要があります。 /etc/php.iniをこのように↓変更するとfetal errorが起こった場合画面に表示するようになります。warningは出しません。 display_errors = On error_reporting  =  E_ALL & ~E_NOTICE error_reportingに設定する定数は ここ を参考に。 php側で全てのエラー出力をオフにする場合は error_reporting(0); .htaccessで全てのエラー出力をオフにする場合は php_value error_reporting 0 .htaccessの場合は ここ にあるような数値を設定しないと効かないらしい。 .htaccessに「error_reporting  =  E_ALL & ~E_NOTICE」を設定したい場合は 6143 - 8 = 6135 となり php_value error_reporting 6135 と書けばOK. PHP用DB接続支援ライブラリ「somfa」

【Linux】デーモンの起動・停止するときの「rc.d/init.d」

デーモンを起動・停止をするときにいつも唱えている呪文が $ /etc/rc.d/init.d/httpd restart これは、apacheを再起動するときのコマンド。このrc.dとinit.dって何だべ?と思い調べてみました。 環境はCentOS5.2。 /etc/rc.d/はランレベルごとの起動・停止スクリプトを格納しているディレクトリ。 ランレベルとはLinuxの動作モードのこと。 シングルユーザモードやマルチユーザモードやグラフィカルログインなどによって起動するデーモンを制御するためにディレクトリごとに分けている。 ランレベルについては ここ を参照。 /etc/rc.d/の配下にはrc0.d~rc6.d init.dなどのディレクトリがあり、init.dの配下にいるのが起動・停止スクリプトの本体。 rc0.d~rc6.dの配下にいるのはinit.dにあるスクリプトの各動作モードごとのリンボリックリンク。 ランレベルを変更したい場合などは ここ を参考に。 ちなみにLinuxの場合「.d」が名前の最後に付けられているディレクトリをよく見かける。 軽量、軽快なPHPフレームワーク「pettiwork」

ISMSとプライバシーマークとPCIDSS

ISMSって何?と思って調べたメモ。 ISMS(情報セキュリティマネジメントシステム) 情報に関するセキュリティを管理する仕組み。組織の情報漏えい対策。 wikipedia 。 監査を受けて合格すると、機密情報の漏えいがない印象を与えることができる。 情報マネジメント推進センターの ホームページ には、ASPサービス向けのITSMSというのもある。 プライバシーマーク 個人情報保護に関して一定の要件を満たした事業者に対し、使用を認められるマーク。 wikipedia 。 監査を受けて合格すると、プライバシーマークの使用が可能となり、個人情報を預けても大丈夫そうな印象を与えることができる。 PCI DSS(Payment Card Industry データセキュリティ基準) 主にクレジットカード会社で取得が進んでいる情報セキュリティ基準。詳しくは ここ の連載で。 ISMSは自分たちでセキュリティレベルを決めるのに対し、PCI DSSはやらないといけないことが決まっている。 このような監査に合格していると、内(社内)向けにセキュリティに対する意識が向上する効果はありそう。外向けに効果があるか分かりませんが。 名古屋のおもしろ会社エクスブリッジ

【PHP】正規表現で気になったPOSIXとPCREの違い

この ときに少し気になったPOSIXとPCRE。全ての答えが wikipedia に。 簡単にまとめると POSIX(ポジックス、Portable Operating System Interface)自体は標準化団体がつけた取り決めの名称。詳しくは ここ 。 POSIXに従った正規表現を書くと多くのUNIX上(シェルスクリプトなど)でそのまま使用することができる。 PHP関数ではereg*となっているのがPOSIXの正規表現を用いる関数。 PHPマニュアル 。 PCRE(Perl Compatible Regular Expressions)はPerl互換の正規表現ライブラリの名称。詳しくは ここ 。 POSIXを上回る豊富な文法を備えているらしい。多くのソフトウェアに組み込まれているので、開発する上での標準。 PHP関数ではpreg*となっているのがPCREの正規表現を用いる関数。 PHPマニュアル 。 PCREは\d, \w, \sとかが使えたり大文字小文字を区別しない検索ができる。 PHPではPOSIXのereg_replaceよりPCREのpreg_replaceの方が高速に動作することが多いらしい。 ここ のヒントを参照。 名古屋でプロのSEを目指す

【Linux】MP4Boxコマンド一覧のメモ

MP4Boxは GPAC というツール群の中のひとつ。インストールは ここ を参照。 MP4Boxを使うと 3GPP や 3GPP2 や MPEG4 のファイルに対して、分割、結合、ストリーミング再生用のヒントトラックの作成、特定トラックの詳細情報の表示、メタデータの追加・削除などができる。 本家のドキュメントは ここ (英語)。 日本語は ここ で見つけた。 ヘルプはコマンドでも表示できる。 $ MP4Box –h でヘルプの種類を表示して $ MP4Box -h general などで詳細ヘルプを表示。 ・・・英語なのできつい・・・ よく使うコマンドだけメモ。 共通($ MP4Box -h general) コマンド 説明 -tmp directory 一時ファイルの保存場所を指定。 -out filename 処理後のファイルを新規に書き出す。 -new 新規ファイルの作成を強制。 -3gp ファイルを3GPP規格準拠に変換。MPEG-4のシステム情報は除去され、3GPP準拠の情報のみ残す。拡張子を '3gp' か '3g2'にするとこのオプションを勝手に使う。 警告:一部のメディア・トラックが除去される事がある。 -brand ABCD[:v] ファイルの主な使用用途を識別する情報を付加。vはバージョンを数値で指定。 ファイルの変換($ MP4Box -h import) コマンド 説明 -add importfile ファイルを読み込んで指定ファイルにメディアトラックを追加する。 -keep-sys -addオプションで削除されるMPEG-4のシステム情報を残す。

【ffmpeg】動画変換のコマンド一覧メモ

ffmpegのインストールについては ここ を参照。 公式マニュアルは ここ から(英語)。 よく使うものだけメモ。 メインオプション 書式 説明 -version バージョン情報を表示 -i filename 入力ファイルパス -y 出力ファイルの上書き -f format フォーマットを強制。-iの前に書けば入力ファイルフォーマット、-yの前に書けば出力ファイルフォーマットを強制 ビデオ変換オプション 書式 説明 -b bitrate ビデオ ビットレート (bit/s)。デフォルトは200kb/s -r fps フレームレート (fps)。デフォルトは25fps -s フレームサイズ。横幅x高さ。デフォルトは160x128。詳細は ここ で確認。 -vcodec codec ビデオ コーデック の指定。'copy'とすると入力動画のコーデックを使う。 -pass n 2パスエンコード の番号を指定。1または2。1を指定した場合動画の解析を行って-passlogfileに指定したファイルに情報を書き出す。 -passlogfile file 2パスエンコード の動画解析結果を出力するファイルパスを指定。 音声変換オプション 書式 説明 -ar freq 音声サンプリング周波数。デフォルトは44100Hz -ab bitrate 音声 ビットレート 。(b

【ffmpeg】対応フォーマット(コーデック)一覧の表示と確認

イメージ
ffmpegを使って動画を変換してますが、これがなかなか難しい。ffmpegのインストール方法については 前の記事 を参照。 PHPで変換する際 は ここ のコード経由で実行してます (自前でコマンドを生成した方が分かりやすい)が、ffmpegのバージョンによってオプション(引数)の名前が違ってくる。 変換のコマンド実行後に Unknown encoder 'aac' など怒られるときは $ ffmpeg -formats | less もしくは $ ffmpeg -formats > list.txt $ vi list.txt を実行してみてffmpegが対応しているか確認。↓ 最初の「File Formats」は各ファイルを読み込み、書き出しできるかどうか。 「D」ついていれば読み込み可能、「E」がついていれば書き出し可能。 次の「Codecs」は各 コーデック が使用可能かどうか。 ffmpegのコマンドでは「-vcodec」や「-acodec」のあとに記述。 「D」ついていれば デコード (復号化)可能、「E」がついていれば エンコード (暗号化・圧縮)可能。「V」はビデオ、「A」は音声のコーデック。 さらに横にあるSDTは謎。 これで確認してみると「aac」はおらず、「libfaac」という名前になっているみたい。 日本語では FFMpeg:サポートされているファイルフォーマットおよびコーデック にあったので参考に。 動画配信といえばCoTV

【PHP】【PEAR】XML_Query2XMLでXSLTが使いやすい!?

ここ でPHPだとXSLTの技術を使う機会が少ないなぁとぼやいてましたが、 PEARの XML_Query2XML を使うと簡単にPHPでXML+XSLTが実現できそうだったのでメモ。 試してみるときは ここ のブログなどを参考に。 私はまだ試してないですが、時間が取れたときに試してみます。心配なのは処理速度。 軽量、軽快なPHPフレームワーク「pettiwork」

博多へ行ってきました。

イメージ
土日は九州・博多へ行き、阿蘇山と温泉と海の幸を堪能してきました。 阿蘇山に行く途中に馬と触れあえる場所があったので寄り道。馬でかいです。 阿蘇山火口。目的地ですが、馬の方がテンションあがりました。 夜。博多のイカは本当に新鮮でおいしい。このときイカさんはまだ生きて(反応し)ます。食べたあとも残った部分を天ぷらにします。これもまた旨い。 川沿いの屋台街で遅くまで飲み倒せます。 夜はもつ鍋を食べましたが、これまたおいしいので九州行く機会があったら絶対食べた方がいいです。 初の九州でしたが濃密に楽しめました。次回は由布院で合宿予定です。

ギネスビールで乾杯

さきに後輩が書いていたので詳しくは ここ 。 技術ネタだけじゃなく、たまには癒し系のネタも書くようにします。 打ち上げではそんなに飲んだつもりはないのだけれど、家に帰って気絶して気がついたら朝9時過ぎてました・・・。始業時間過ぎてるし。元々強いほうではないですが、さらにお酒に弱くなっている気がする。 慌ただしく会社に行ったら、今度はブレーカーが落ちて半分近くのマシンが起動不能に。しょうがなく床をひっぺ返して電源周りを整理。 あまり仕事が進んでませんが、なんかすでに疲れてます。 明日は福岡の大学時代の先輩に会いに行ってきます。朝早いのに起きられるかなぁ。