Monthly Archives: 1月 2011

execコマンドでcdできないとき

このエントリーをはてなブックマークに追加
はてなブックマーク - execコマンドでcdできないとき
Share on Facebook

PHPのexec関数でシェルコマンドを実行する際、cdコマンドは実行できません。 代わりにchdir関数を使うことができます。

<?php
// 現在のディレクトリ
echo exec("pwd") . "\n";            // /home/uso

// exec('cd ***')で /home に移動してみる
exec("cd /home");
echo exec("pwd") . "\n";            // /home/uso (変わってない)

// chdirで移動してみる
chdir("/home");
echo exec("pwd") . "\n";            // /home (変わってる)

参考

改行コードがうまく解釈されないとき

このエントリーをはてなブックマークに追加
はてなブックマーク - 改行コードがうまく解釈されないとき
Share on Facebook

今さらですが、PHPの引用符(’)と二重引用符(”)の違いを知りました。

引用符 二重引用符
変数名 パースされない パースされる
エスケープシーケンス 書いたままの文字で出力される エスケープシーケンスが出力される

最近何かとシングルクォーテーションばかり使うようにしていたのですが、基本的にダブルクォーテーションの方が高機能で使いやすいようです。

引用符で囲った文字列を「\n」でexplodeしようとしても全然うまくいかず、詰んでいました。参考リンクの筆者に感謝します。

参考

文字列から数値のみを抜き取る

このエントリーをはてなブックマークに追加
はてなブックマーク - 文字列から数値のみを抜き取る
Share on Facebook

コード

/**
 * 文字列から数字のみを抜き取る
 *
 * @param  string  $str  チェックしたい文字列
 * @return string  数字のみになった文字列
 * @see <a href="http://mbnk.blog120.fc2.com/blog-entry-58.html">モバイルサイト開発者の裏メモ  PHP 文字列から数字のみを抜き取る</a>
 */
function extract_numbers($str) {
    return preg_replace('/[^0-9]+/', '', $str);
}

実行サンプル

<?php
/**
 * 文字列から数字のみを抜き取る
 *
 * @param  string  $str  チェックしたい文字列
 * @return string  数字のみになった文字列
 * @see <a href="http://mbnk.blog120.fc2.com/blog-entry-58.html">モバイルサイト開発者の裏メモ  PHP 文字列から数字のみを抜き取る</a>
 */
function extract_numbers($str) {
    return preg_replace('/[^0-9]+/', '', $str);
}

$strs = array(
    "03-3200-2222",
    "uso800",
    "Attack25",
    "500 Miles High",
    "99999999",
    "R2-D2",
);

foreach ($strs as $key => $tel) {
    echo "{$key}: {$tel} -> ";
    echo lfExtractNumber($tel);
    echo "\n";
}
/** End of file */

実行結果

$ php extract_number.php
0: 03-3200-2222 -> 0332002222
1: uso800 -> 800
2: Attack25 -> 25
3: 500 Miles High -> 500
4: 99999999 -> 99999999
5: R2-D2 -> 22

参考

電話番号チェックする正規表現(入力枠1個、ハイフン抜き)

このエントリーをはてなブックマークに追加
はてなブックマーク - 電話番号チェックする正規表現(入力枠1個、ハイフン抜き)
Share on Facebook

「電話番号 正規表現」で検索するといろいろな正規表現パターンが出てきますが、完璧なものはあまり無いようです。私が必要としていた簡単なものもなかったので、PHPで書いてみました。

どういう条件で使えるかコメントに書いたので、よくご確認ください。@seeタグに書きましたが、総務省の電話番号ルールに従っています。

/**
 * 電話番号が正しいか判定する
 *
 * - 入力枠1個、ハイフン抜きでチェックする
 * - 0A0, 0AB, 0ABC (A,B,Cは0以外)から始まる番号だけに対応
 *   - 「00XY-0市外局番-市内局番-加入者番号」の形式は非対応 (@seeのQ3参照)
 * - 10桁(固定電話)と11桁(固定電話)のみ対応
 *
 * @param  string $tel  電話番号
 * @return bool   判定結果 (true:正しい電話番号)
 * @see <a href="http://www.soumu.go.jp/main_sosiki/joho_tsusin/top/tel_number/q_and_a-2001aug.html">電話番号に関するQ&A</a>
 */
function is_valid_tel_number($tel = "") {
    return preg_match("/^0\d{9,10}$/", str_replace("-", "", $tel));
}

動作チェックは書きの通りです。

<?php
/**
 * 電話番号が正しいか判定する
 *
 * - 入力枠1個、ハイフン抜きでチェックする
 * - 0A0, 0AB, 0ABC (A,B,Cは0以外)から始まる番号だけに対応
 *   - 「00XY-0市外局番-市内局番-加入者番号」の形式は非対応 (@seeのQ3参照)
 * - 10桁(固定電話)と11桁(固定電話)のみ対応
 *
 * @param  string $tel  電話番号
 * @return bool   判定結果 (true:正しい電話番号)
 * @see <a href="http://www.soumu.go.jp/main_sosiki/joho_tsusin/top/tel_number/q_and_a-2001aug.html">電話番号に関するQ&A</a>
 */
function is_valid_tel_number($tel = "") {
    return preg_match("/^0\d{9,10}$/", str_replace("-", "", $tel));
}

$tels = array(
    // NGパターン
    "0",
    "1-1-1-1",
    "uhouho",
    "9999999999",       // 0から始まってない
    "03-333-333",       // ケタ不足
    "090-9999-999999",  // ケタ多すぎ
    "012301230123",     // ケタ多すぎ
    // OKパターン
    "03-3200-2222",     // 市外局番1桁: 東京など
    "043-000-0000",     // 市外局番2桁: 千葉
    "0166-00-0000",     // 市外局番3桁: 旭川
    "09913-0-0000",     // 市外局番4桁: 硫黄島
    "090-0000-0000",    // 携帯電話
    "050-0000-0000",    // 携帯電話
    "080-0000-0000",    // 携帯電話
);

foreach ($tels as $key => $tel) {
    echo "{$key}: {$tel} ... ";
    echo is_valid_tel_number($tel) ? "OK" : "NG";
    echo "\n";
}

 /** End of file */

出力結果

$ php tel_check.php
0: 0 ... NG
1: 1-1-1-1 ... NG
2: uhouho ... NG
3: 9999999999 ... NG
4: 03-333-333 ... NG
5: 090-9999-999999 ... NG
6: 012301230123 ... NG
7: 03-3200-2222 ... OK
8: 043-000-0000 ... OK
9: 0166-00-0000 ... OK
10: 09913-0-0000 ... OK
11: 090-0000-0000 ... OK
12: 050-0000-0000 ... OK
13: 080-0000-0000 ... OK

参考

html5チートシート集

このエントリーをはてなブックマークに追加
はてなブックマーク - html5チートシート集
Share on Facebook

html5に触り始めたばかりでどんな要素があったか思い出せない。そんな時に手元にチートシートがあると便利です。 ネットに落ちているhtml5チートシートのうち、使いやすい物をいくつかまとめておきます。

HTML 5 Cheat Sheet (PDF)

HTML 5 Cheat Sheet (PDF) – Smashing Magazine

  • タグ、概要、互換性 (html4/5)、属性 (attribute) の一覧表
  • PDF (全4ページ)
  • 非推奨要素はグレーで表示
  • とにかく全タグを俯瞰したいときに便利

W3C Cheatsheet

W3C cheatsheet

  • HTML, CSS, SVG, XPathのリファレンス
    • ※CSS3は未対応 (W3Cの中で仕様が固まってないから?)
  • 調べたいタグを入力するとリファレンスが表示される

HTML5 Canvas Cheat Sheet

HTML5 Canvas Cheat Sheet – Nihilogic

  • canvasタグのみの詳細な説明
  • PDF (2ページ) & PNG (PDFを結合したもの)

参考

NetBeansの日本語出力が文字化けするとき

このエントリーをはてなブックマークに追加
はてなブックマーク - NetBeansの日本語出力が文字化けするとき
Share on Facebook

NetBeans IDE 7.0 Betaで試しました。

netbeans.confの「netbeans_default_options」ブロックに「-J-Dfile.encoding=UTF-8」を追加してやればいいようです。 下記のようになります。

// C:\Program Files\NetBeans 7.0 Beta\etc\netbeans.conf

# Options used by NetBeans launcher by default, can be overridden by explicit
# command line switches:
netbeans_default_options="-J-client -J-Xss2m -J-Xms32m -J-XX:PermSize=32m -J-XX:MaxPermSize=384m -J-Dnetbeans.logger.console=true -J-ea -J-Dapple.laf.useScreenMenuBar=true -J-Dapple.awt.graphics.UseQuartz=true -J-Dsun.java2d.noddraw=true -J-Dfile.encoding=UTF-8"

結果

(2011/07/07追記)

まだ文字化けする場合、出力ウインドウのフォントが日本語に対応していない可能性があります。出力ウインドウを右クリック -> [フォントを選択...]で、日本語フォントを指定してください。

参考

Complete Mirage – NetBeansでJRuby on Rails

trac0.12のテーブル構造

このエントリーをはてなブックマークに追加
はてなブックマーク - trac0.12のテーブル構造
Share on Facebook

カスタムレポートを作成しようとしてTrac DBのテーブル構造を探したのですが、意外とドキュメントが見つかりませんでした。 SQLite3の「.schema」コマンドの出力結果を載せておきます。

なお、このDBはTracLightning3.0.0で導入したTrac 0.12.ja1のものです。

trac.dbのスキーマ

CREATE TABLE attachment (
    type text,
    id text,
    filename text,
    size integer,
    time integer,
    description text,
    author text,
    ipnr text,
    UNIQUE (type,id,filename)
);
CREATE TABLE auth_cookie (
    cookie text,
    name text,
    ipnr text,
    time integer,
    UNIQUE (cookie,ipnr,name)
);
CREATE TABLE cache (
    id text PRIMARY KEY,
    generation integer
);
CREATE TABLE component (
    name text PRIMARY KEY,
    owner text,
    description text
);
CREATE TABLE enum (
    type text,
    name text,
    value text,
    UNIQUE (type,name)
);
CREATE TABLE forum (
    id integer PRIMARY KEY,
    name text,
    time integer,
    forum_group integer,
    author text,
    moderators text,
    subscribers text,
    subject text,
    description text
);
CREATE TABLE forum_group (
    id integer PRIMARY KEY,
    name text,
    description text
);
CREATE TABLE message (
    id integer PRIMARY KEY,
    forum integer,
    topic integer,
    replyto integer,
    time integer,
    author text,
    body text
);
CREATE TABLE milestone (
    name text PRIMARY KEY,
    due integer,
    completed integer,
    description text
);
CREATE TABLE node_change (
    repos integer,
    rev text,
    path text,
    node_type text,
    change_type text,
    base_path text,
    base_rev text,
    UNIQUE (repos,rev,path,change_type)
);
CREATE TABLE permission (
    username text,
    action text,
    UNIQUE (username,action)
);
CREATE TABLE report (
    id integer PRIMARY KEY,
    author text,
    title text,
    query text,
    description text
);
CREATE TABLE repository (
    id integer,
    name text,
    value text,
    UNIQUE (id,name)
);
CREATE TABLE revision (
    repos integer,
    rev text,
    time integer,
    author text,
    message text,
    UNIQUE (repos,rev)
);
CREATE TABLE session (
    sid text,
    authenticated integer,
    last_visit integer,
    UNIQUE (sid,authenticated)
);
CREATE TABLE session_attribute (
    sid text,
    authenticated integer,
    name text,
    value text,
    UNIQUE (sid,authenticated,name)
);
CREATE TABLE system (
    name text PRIMARY KEY,
    value text
);
CREATE TABLE ticket (
    id integer PRIMARY KEY,
    type text,
    time integer,
    changetime integer,
    component text,
    severity text,
    priority text,
    owner text,
    reporter text,
    cc text,
    version text,
    milestone text,
    status text,
    resolution text,
    summary text,
    description text,
    keywords text
);
CREATE TABLE ticket_change (
    ticket integer,
    time integer,
    author text,
    field text,
    oldvalue text,
    newvalue text,
    UNIQUE (ticket,time,field)
);
CREATE TABLE ticket_custom (
    ticket integer,
    name text,
    value text,
    UNIQUE (ticket,name)
);
CREATE TABLE topic (
    id integer PRIMARY KEY,
    forum integer,
    time integer,
    author text,
    subscribers text,
    subject text,
    body text
);
CREATE TABLE version (
    name text PRIMARY KEY,
    time integer,
    description text
);
CREATE TABLE wiki (
    name text,
    version integer,
    time integer,
    author text,
    ipnr text,
    text text,
    comment text,
    readonly integer,
    UNIQUE (name,version)
);
CREATE INDEX forum_time_idx ON forum (time);
CREATE INDEX message_time_idx ON message (time);
CREATE INDEX node_change_repos_rev_idx ON node_change (repos,rev);
CREATE INDEX revision_repos_time_idx ON revision (repos,time);
CREATE INDEX session_authenticated_idx ON session (authenticated);
CREATE INDEX session_last_visit_idx ON session (last_visit);
CREATE INDEX ticket_change_ticket_idx ON ticket_change (ticket);
CREATE INDEX ticket_change_time_idx ON ticket_change (time);
CREATE INDEX ticket_status_idx ON ticket (status);
CREATE INDEX ticket_time_idx ON ticket (time);
CREATE INDEX topic_time_idx ON topic (time);
CREATE INDEX wiki_time_idx ON wiki (time);

参考

TracLightning3.0とXAMPPを共存させる

このエントリーをはてなブックマークに追加
はてなブックマーク - TracLightning3.0とXAMPPを共存させる
Share on Facebook

ローカルホストには今までXAMPPとpukiwikiを入れていたのですが、リポジトリも一緒に扱えたら便利だと思ったので、ちまたで評判のTrac Lightningを導入してみました。

導入手順

1. ダウンロード

Trac Lightning Wiki – SourceForge.JPからダウンロードします。執筆時には3.0.0が最新版でした。

2. インストール

ダウンロードした TracLightning-3.0.0.exe を実行し、そのままインストールします。 私はJavaを使わないので、MavenとHudsonのチェックは外しました。

インストール後、再起動を求められるので再起動します。

3. httpd.confの設定

ここがXAMPPとの共存の肝です。TracLightingもApacheをインストールするので、ポートを変えてやらないとXAMPPとバッティングして起動できません。(両方とも標準でポート80を使う)

C:\TracLight\CollabNetSVN\httpd\conf\httpd.conf を開き、81番ポートを見るように変更します。

// 53行目
Listen 81

4. 起動

スタートメニューを開き、[Trac > コマンドプロンプトから実行]をクリックするとサービスが起動します。

ブラウザで http://localhost:81/trac/ にアクセスすると、無事プロジェクト一覧が表示されます。

以上で導入は完了です。プロジェクトの新規作成方法などは Trac の新規プロジェクト作成方法 – かおるんダイアリー (id:kaorun55) あたりを参考にしてください。

参考