投稿

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         変換した文字列.
*/
f…

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

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

【PostgreSQL】チューニングとautovacuum

PostgreSQL8.3からデフォルトでautovacuumが有効になり、vacuum analyzeとかしなくてもよくなりましたが、8.2までの場合は気にしないといけません。8.1と8.2の場合はautovacuumの機能を有効にします。 [PostgreSQLウォッチ]第19回 ベータ・リリースを間近に控えたPostgreSQL 8.1 - オープンソース:ITpro7.4まではcronなどで定期的にvacuumしてあげないといけない。PostgreSQLのチューニングに関しては、下記記事が分かりやすい。SQL Power - TuningPostgreSQLを遅くしている犯人はどこだ?(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 directives here
</VirtualHost> と記述する。これで***.hoge.ex…

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_masterPHP用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 installpostgresユーザを追加
$ useradd postgres
$ passwd postgres (ログインさせたくないので設定しない)ライブラリの登録
$ vi /etc/ld.so.conf.d/local.conf
/usr/local/pgsql/lib を追加。
$ ldconfigpostgresqlの設定ファイルの置き場所を作る
$ mkdir /usr/local/pgsql/data
$ chown postgres /usr/local/pgsql/data/postgresユーザになってデータベースの初期化
$ su postgres
$ cd
$ vi ./.bashrcPATH=/usr/local/pgsql/bin:$PATH
export PATH
を追加。読み込み。初期化。
$ source ./.bashrc
$ initdb -D /usr/local/pgsql/datarootになって起動スクリプトを準備して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自動起動するように
$ chkconfig --add postgresql
$ chkconfi…

【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を使うと3GPP3GPP2MPEG4のファイルに対して、分割、結合、ストリーミング再生用のヒントトラックの作成、特定トラックの詳細情報の表示、メタデータの追加・削除などができる。本家のドキュメントはここ(英語)。日本語はここで見つけた。ヘルプはコマンドでも表示できる。
$ 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のシステム情報を残す。-keep-all-addオプションで追加した場合、MPEG-4と3GPP規格に準拠しないトラックは自動で削除されるが、これらを残すためのオプション。基本的な使い方は
$ MP4Box -add <読み込むファイル> <読み込んだトラックの追加先><読み込んだトラックの追加先>がない場合、自動で作成して追加する。もしくは-newオプションで新規ファイル作成を強制。ファイルの分割と結合($ MP4Box -h general)コマンド説明-split <秒>入力ファイルを指定秒単位で分割する。-split-size <サイズ>入力ファイルを指定サイズ…

【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 n2パスエンコードの番号を指定。1または2。1を指定した場合動画の解析を行って-passlogfileに指定したファイルに情報を書き出す。-passlogfile file2パスエンコードの動画解析結果を出力するファイルパスを指定。音声変換オプション書式説明-ar freq音声サンプリング周波数。デフォルトは44100Hz-ab bitrate音声ビットレート。(bit/s)。デフォルトは64kb/s-ac channels音声チャンネル数。デフォルトは1-acodec codec音声コーデックの指定。'copy'とすると入力動画のコーデックを使う。-an音声の録音を無効にする。主に2パスエンコードの最初の1回目で指定する。入力ファイル: input.avi
出力ファイル(ファイル形式): output.3g2
ビデオビットレート: 64kb/s
ビデオサイズ: QCIF(176x144)
フレームレート: 15fps
ビデオコーデック: mpeg4
音声サンプリング周波数: 44100Hz
音声ビットレート: 16kb/s
音声コーデック: aac
その他オプション: 上書き
だと次のようなコマンドになる。$ ffmpeg -i input.avi -b 64k -s qcif -r 15 -vcodec mpeg4 -acodec libfaac -ar 4…

【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時過ぎてました・・・。始業時間過ぎてるし。元々強いほうではないですが、さらにお酒に弱くなっている気がする。慌ただしく会社に行ったら、今度はブレーカーが落ちて半分近くのマシンが起動不能に。しょうがなく床をひっぺ返して電源周りを整理。あまり仕事が進んでませんが、なんかすでに疲れてます。明日は福岡の大学時代の先輩に会いに行ってきます。朝早いのに起きられるかなぁ。