2010年4月21日水曜日

知らない人は損してる!意外に便利なPHP関数たち vol.1

PHPには実用的なfunctionがいろいろ用意されている。
他のプログラミング言語を使ってた人は知らずに自分で同じようなものを作りこんでしまうことも多いと思う。
なんとなく、そんな便利な関数を列挙してみる。



file_get_contents ( string $filename [, int $flags = 0 [, resource $context [, int $offset = -1 [, int $maxlen = -1 ]]]] )

この関数は file() と似ていますが、 offset で指定した場所から開始し maxlen バイト分だけ ファイルの内容を文字列に読み込むという点が異なります。
ファイルを取得する
実はhttp越しでも取得可能。HTTPメソッドはPOSTでも何でも指定できるし、その他のHTTPヘッダーも指定できる



mb_convert_kana ( string $str [, string $option = "KV" [, string $encoding ]] )
文字列 str に関して「半角」-「全角」変換を行います。 この関数は、日本語のみで使用可能です。
英数字やカタカナの全角/半角の置換ができる



http_build_query ( array $formdata [, string $numeric_prefix [, string $arg_separator ]] )
与えられた連想配列 (もしくは添字配列) から URL エンコードされたクエリ文字列を生成します。
配列をURLエンコードしつつQuery Stringに変換してくれる



json_encode ( mixed $value [, int $options = 0 ] )
value を JSON 形式にした文字列を返します。
配列をJSONに変換してくれる



var_export ( mixed $expression [, bool $return = false ] )
var_export() は、 渡された変数に関する構造化された情報を返します。この関数は var_dump() に似ていますが、 返される表現が有効な PHP コードであるところが異なります。
変数(配列でもオブジェクトでも可)を見やすい形にしてくれる
第2引数をtrueにすると戻り値として返されるので、ログ出力したい時に便利



ob_start ([ callback $output_callback [, int $chunk_size [, bool $erase ]]] )
この関数は出力のバッファリングをオンにします。 出力のバッファリングを有効にすると、 (ヘッダ以外の) スクリプトからの出力は実際には行われず、 代わりに内部バッファに保存されます。
これ以降の処理による出力はバッファに溜めておかれるので、後で出力内容を一括で変換したり保存したりできる



extract ( array $var_array [, int $extract_type = EXTR_OVERWRITE [, string $prefix ]] )
配列からシンボルテーブルに変数をインポートします。
配列内の値を変数として扱えるようになる
//例
$arr = array('foo' => 123, 'bar' => 456);
extract($arr);
echo $foo; // => 123
echo $bar; // => 456



compact ( mixed $varname [, mixed $... ] )
変数名とその値から配列を作成します。
extract()の逆。変数名を指定して配列を作る
//例
$foo = 123;
$bar = 456;
$arr = compact('foo', 'bar'); // => array('foo' => 123, 'bar' => 456)



glob ( string $pattern [, int $flags = 0 ] )
glob() 関数は libc の glob() 関数で使われるルールに基づいて pattern にマッチする全てのパス名を検索します。 ルールは、一般のシェルで使われるルールと似ています。
ディレクトリ内のファイル一覧を取得するのに便利(opendir()してループして...なんてしないで済む)



Vol.2があるかは分からない。

Google Docsの 新規ドキュメントを開くURLの変更

設定を変更することにより、Googleドキュメント の新バージョンが使えるようになった。
新しいバージョンではそ、新規ドキュメントを作成するためのURLが下記のように変更されたようだ。

これまでのURL
https://docs.google.com/DocAction?action=newdoc

新しいURL
https://docs.google.com/document/create

新しいGoogleドキュメントは、たしかにサ クサク動く。

しかし、書式を「引用」にできないのは困る。(昔のバージョンアップでも同じようなことがあった気が...)復活してくれるといいのだが。

また、新バージョンはいまのところブログへの投稿はできないようだ。

2010年4月16日金曜日

HTML6の仕様を HTML5までに至る HTMLの進化から予想する

HTMLの記述は、HTML5の登場により劇的にシンプルになった。
試しに、HTML5の前バージョンの1つであるXHTML 1.0 StrictとHTML5をシンプルなWebページの記述例で比べてみる。


XHTML 1.0 Strict

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="ja" lang="ja">

<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
<meta http-equiv="Content-Style-Type" content="text/css" />
<meta http-equiv="Content-Script-Type" content="text/javascript" />
<title>XHTML 1.0 Strict</title>
<link rel="stylesheet" type="text/css" href="stylesheet.css" />
<style type="text/css">
span.foo {
    text-decoration: underline;
}
</style>
<script type="text/javascript" src="javascript.js"></script>
<script type="text/javascript"> alert("hello"); </script>
</head>

<body>
<div>
<span class="foo">XHTML</span> <span style="color: #ff0000;">1.0 Strict</span>
</div>
</body>

</html>

XHTML 1.0の場合、head要素までの記述が大量かつ複雑であることが目に付く。
同じ内容をHTML5で記述するとこうなる。


HTML 5の例
<!DOCTYPE html>
<html lang="ja">

<head>
<meta charset="UTF-8">
<title>HTML 5</title>
<link rel="stylesheet" href="stylesheet.css">
<style>
span.foo {
    text-decoration: underline;
}
</style>
<script src="javascript.js"></script>
<script> alert("hello"); </script>
</head>

<body>
<span class="foo">HTML</span> <span style="color: #ff0000;">5</span>
</body>

</html>

劇的にシンプルになった。
style(CSS)とJavaScriptのMime Type(Content-Type)についてデフォルトの値が定義されたことが地味に効いている。

素晴らしいことに、このHTML5は既存の主なWebブラウザで既に使うことができる。(※新しく登場した要素は除く)


しかし、賢明なる読者諸君にはここで考えてもらいたい。これは十分にシンプルだろうか?
いや、違う。マークアップエンジニアはまだ仕様に振り回されて不要な文字列をマークアップすることを強要されている。

来るべき次のバージョンのHTML、すなわち「HTML 6」では、さらに進んでこれくらいシンプルになるのではないだろうか?


HTML 6 ?
<html>

<head>
<title>HTML 6?</title>
<script src="javascript.js"></script>
<script> alert("hello"); </script>
</head>

<body>
<u>HTML</u> <font color="red">6 ?</font>
</body>

</html>

特徴的なのはstyle要素やCSSを排し、下線や文字色等について直接マークアップすることが可能になったことだ。
これにより、難解なCSSセレクタ間の力関係や醜悪なdiv地獄から開放されるかもしれない。

素晴らしいことに、このHTMLは既存のほぼ全てのWebブラウザで、もう既に使うことが可能だ。驚くことにここで言うWebブラウザには、世界からガラパゴスと恐れられ、聖域となる独自仕様に守られている日本の携帯電話のWebブラウザですら含まれているのだ。

今後の展望としては、JavaScriptを使わずにHTMLのマークアップだけでユーザーにハイパーなエクスペリエンスを提供するため、表示コンテンツを点滅させたり(blink)、文字を画面狭しと左右に走り回らせたり(marquee)といった機能も実装されるに違いない。

Amazon EC2の AMIとして 自分でCentOSをインストールする方法

Amazon EC2上の仮インスタンス上でCentOSのAMIを作成する方法を書こうとしたのだけれど、途中試行錯誤したので作業ログ的なメモになってしまった。


  1. Amazonが用意しているFedoraのAMIでAmazon EC2 API Toolsが既に入っているインスタンスを立ち上げる。(Amazon EC2 API Toolsをインストールする手間が省ける)
  2. 下記サイトを参考に、X.509証明書と秘密鍵をダウンロードする
  3. 2でダウンロードした2つのファイルを、1で立ち上げたインスタンスに転送する
  4. 下記サイトを参考に、1のインスタンス上でCentOSをセットアップする
  5. イメージの登録まで済めば、AWS Management Consoleの左側のメニューの「Images」のAMIsのところに、作ったAMIが表示される!



でもこの方法だとEBSからの起動ではなくinstance-store(S3)からの起動になってしまう。
なのでEBSから起動できるAMIを作ってみる。

  1. 作成したOSイメージ(centos5.img)を/tmpに移動(移動は不要?)
  2. 後はsuz-lab - blog: Migrating a CentOS S3 Based AMI to an EBS Based AMIを参考に進める
    • ddでAMIイメージをコピーしたらいつまでたっても終わらないので別のssh繋げて見てみたら終わってるように見えたのでそのまま進めてしまった
    • ec2regはec2-registerのalias
    • ec2regの -d オプションはdescriptionの登録なので省略してもOK

S3に作った時の「バンドルイメージの作成」以降がEBSへのコピーに変わった感じか。こっちの方が作るのも楽だ。
今ではもうEBSからの起動が普通なので、こちらの方法で手順をまとめられると良かったのだが。

CentOSに lsyncをセットアップするメモ

  1. gccをインストールしてない場合は、gccをインストール

    yum install gcc
  2. あとは下記リンク先の説明のとおりに
    Linuxでリアルタイムミラーリング « Fosters Technical Blog

    (この例はlsyncd.conf.xmlの代わりにlsyncd.confに1行書くだけという設定が少し特殊)
  3. rsyncdの詳細な設定(ログファイルの指定等)についてはこちらを参照
    rsyncd.conf
  4. こちらのパッチを使えばssh経由で使えるらしい
    lsyncdを使ってみた - ドンゴレ日記 via lsyncd設定 - kame-tの日記
    でも現在はoptionの指定だけでssh経由にできる?
    Issue 6 - lsyncd - SSH on another port - Project Hosting on Google Code



その他の参考

今さらPHP4の環境を作るメモ

yumでは入れられないPHP4をインストールしたい。
インストールされていたApache2.2とPHP5は事前にアンインストールした。


  1. gccをインストール(コンパイルに必要)

    yum install gcc
  2. OpenSSL-develをインストール(ApacheでSSLを使う場合に必要)

    yum install openssl-devel

    • (OpenSSL1.0が標準的なyumでインストールできるようになるのはいつだろう)
  3. Apache2.0をインストール
  4. flexをインストール(PHPのインストールに必要)

    yum install flex
  5. PHP4をインストール
  6. SELinuxが有効な場合、Apache用PHPモジュールのラベル(セキュリティコンテキスト)を変更する

    chcon -t textrel_shlib_t /usr/local/apache2/modules/libphp4.so

    • 参考:cannot restore segment prot after reloc: Permission denied - Linuxシステム設定
    • SELinuxが有効な場合、これを変更しないとApache(再)起動時に下記のようなエラーが出る

      Syntax error on line 232 of /usr/local/apache2/conf/httpd.conf:
      Cannot load /usr/local/apache2/modules/libphp4.so into server: /usr/local/apache2/modules/libphp4.so: cannot restore segment prot after reloc: Permission denied
  7. Apacheの設定

    vi /usr/local/apache2/conf/httpd.conf

    • AddTypeを追加

      AddType application/x-httpd-php .php
    • DirectoryIndexを変更(index.phpを追加)

      DirectoryIndex index.php index.html index.html.var
    • Webコンテンツのディレクトリを変更(/var/www/htmlにする)

      #DocumentRoot "/usr/local/apache2/htdocs"
      DocumentRoot "/var/www/html"
    • Apacheを再起動

      /usr/local/apache2/bin/apachectl restart

リダイレクトでの 絶対URL、 相対URL

以前、docomoで相対URLでのリダイレクトができなかった記憶がある。
また、社内のWindows関連のシングルサインオンか何かで、相対URLでは動かなかったことがあった。


以下はGoogleで調べたら出てきた参考ページ

2010年4月5日月曜日

サーバサイドJavaScript用ライブラリ

Webサーバ等のサーバサイドの処理をJavaScriptでやるならnode.js




Apacheのモジュールとして使うならv8cgi
  • v8cgi
  • これも(その名の通り)V8を使っている
  • MySQL接続、テンプレート、GDなどいろいろ揃っている
  • 作者はWWW SQL Designerなどを作ったondrej.zaraさん
  • Windows版も(一応)用意されている(現在はproblemeticだそうだ)

PostgreSQLで(ほぼ)リアルタイムにバックアップを取る方法

いろいろあるみたい


外部ツール



本体の機能

ブログ アーカイブ

tags