6.30.2011

タイ語 俗語 - その1 มุข

มุข

ある程度通じる読み方:muk (ムック)
ほぼ合ってると思われる解釈:ネタ

無責任な解説:
・いわゆる日本語で言うところの「ネタ」。
・「つまんないけど、それ、誰の『ネタ』ですか?」のネタと同じ。
・มุก は小さな玉状の物のこと。ไข่มุก 真珠(pearl)。ขี้มุก 鼻くそ。
・タイ語辞書などで調べると、มุข は、玄関(porch)などの意で表現されているようですが、最近ではこの用途でこの言葉が使われることはほとんど無いようで。
・日本語の「ネタ」の語源は「種」で、こちらも俗語。

では使用例:
[ภาษาญี่ปุ่น]
このネタは、もう古いね。聞き飽きたよ。
kono neta wa mou hurui ne. kiki akita yo

[タイ語]
มุขนี้เก่าไปแล้วนะ ฟังแล้วน่าเบื่อน่ะ
muk nii gaw pai lεεw na. faŋ lεεw naa bωa na.

[タイ人]

※chromeで再生できやしまへん。

[ภาษาญี่ปุ่น]
それ、だれのネタ?面白いね。
sore, dare no neta? omoshiroi ne.

[タイ語]
มุขของใครคะเนี่ย ตลกมากเลย
muk koaŋ krai ka nia. talok maak ləəy.

[タイ人]

※chromeで再生できやしまへん。

PHP めも - 静的変数 static

DBの情報を参照する function を生成するよう依頼され、よくある処理だけど今更勉強になったこと。

普通にテーブルにSELECT発行して返すものを作って性能テストやったら、1連の処理中での function へのアクセス頻度がかなり高い処理だったので、データベースサーバへの負荷が激しいということに。

「キャッシュ(メモ)化しましょう」と言われ、「あ、社内のフレームワークにそういうクラスがあるんだ」と思ったら「いえ、PHPの標準機能です」と説明されたw

何も説明されなかったら、global を用いるところだった。
正解は、static 変数を用いよ、とのこと。

function get_hanuman_1() {
  // 1. DB接続
  // 2. SELECT実行
  // 3. $hanuman = SELECT結果
  return $hanuman;
}

これを、次のように static を用い実装。

function get_hanuman_2() {
  static $hanuman;
  if ($hanuman === null) {
    // 1. DB接続
    // 2. SELECT実行
    // 3. $hanuman = SELECT結果
  }
  return $hanuman;
}

なんてことのない修正。DBアクセスの頻度やSELECTの激しさが大きければ大きいほど、処理速度と負荷軽減の効果が得られる。

ちなみに、自分がやろうとしていた global でも結果としては同じことができる。
static の記述が、global になるだけ。だが、

忘れっぽい自分みたいな人間には、全然関係の無い違う場所で global を同じ変数名で使ってしまい、しかも上書いてしまい、あたふたしてしまうので、当たり前だが変数を使用する領域を考えて正しい宣言をすることを意識して作業する。(このことすら忘れてしまうこともあるが)

あまり、理屈っぽくなるのも性に合わないから、迷わないために自分用ルール
global 設定値などをがっつり読み込んで、書き換わることが無い前提の変数で使う
static それ以外w

変数のスコープ

ちなみに、static 再帰性について、すこ~しだけ気になったので調べてみたら、
どんどん深みにはまっていった。こんなのすぐにまとめきれないので、キーワードだけ残して後日の課題。

自分自身への回答は:1回のHTTPリクエスト内で有効。
(今はこの理解だけでいい!)

勉強中にどんどん気になって深みにはまった内容は、
・スレッド

このあたり読み漁った。
[PHP-users 32346] スレッドとstatic変数の関係について
なぜ、 IIS は PHP アプリケーションの実行に不向きとされてきたのか?

6.29.2011

PostgreSQL めも - ストアドプロシージャ

※正確には、PostgreSQLのユーザ定義関数ことについて、めも。
※PL/pgSQL利用前提
※個人用(ウソがあったらゴメン)
※そして書くだけ書いて検証してないもの多数かも
※避難場所はこちらw http://www.postgresql.jp/document/9.0/html/plpgsql.html
※こちら、大いに参考になりました。ขอบคุณมากๆครับ
【plpgsql】プロシージャ内SQL、引数展開位置に注意

・関数の定義
マニュアルサイトやサンプルで「$$」が使われてることが多かったから気にせず鵜呑みしてたが、「$hanuman$」でも、「'」でも、なんでもよい。それで始まり、それで終わるブロックが関数の処理部ということになる。
※ほんとに「なんでも」よいか、は未調査。
※「'」を用いた場合は、処理部分で「'」を使う場合に当然エスケープが必要になる「''」

・変数への代入 :=
-- sample: 999を食え

araiwa := 999;

・文字列結合 ||
-- sample: ใครขายไข่ไก่

araiwa := 'ใคร' || 'ขาย' || 'ไข่' || 'ไก่';
-- ใครขายไข่ไก่

・クエリ発行
いつもやってるようにクエリをそのまんま記述してやれば実行されるが、SELECT結果を利用して後続の処理をする場合などは、やりたい内容に応じて記述は異なる。
-- sample: SELECT結果行数分回れ!1

CREATE FUNCTION func_hanuman_1() RETURNS INTEGER AS $$
DECLARE
  row RECORD;
BEGIN
  FOR row IN SELECT id FROM t_hanuman LOOP
    RAISE NOTICE 'id = %', record.id;
  END LOOP;
  RETURN 1;
END;
$$ LANGUAGE plpgsql;

・EXECUTE文
が、上のサンプルで、SELECT文内に変数を使いたい場合、EXECUTE文が必要となる。これ、ハマった。。。マニュアルにも「39.5.4. 動的コマンドの実行」で書いてあるけど、これがそれのことだと気付くまでえらい時間がかかった。。。リテラシー低すぎかなぁ。
-- sample: SELECT結果行数分回れ!2

CREATE FUNCTION func_hanuman_2() RETURNS INTEGER AS $$
DECLARE
  row   RECORD;
  sql   TEXT;
  name  TEXT := 'shin';
BEGIN
  sql := 'SELECT id, name FROM t_hanuman WHERE name ~ ''%'
           || name || '%'' ORDER BY id';
  FOR row IN EXECUTE sql LOOP
    RAISE NOTICE 'name = %', record.name;
  END LOOP;
  RETURN 1;
END;
$$ LANGUAGE plpgsql;

・RETURNS TABLE
関数の戻り値として、SELECT結果(複数レコード)を返したいとき RETURNS TABLE でやる。TABLE() の引数はSELECTで取得するカラムに合わせる。カラム名と同じ引数名にしたらアカン!
-- sample: SELECT結果行を返せ!

CREATE FUNCTION func_hanuman_3()
RETURNS TABLE(col1 int, col2 text) AS $$
DECLARE
  sql TEXT;
BEGIN
  sql := 'SELECT id, name FROM t_hanuman ORDER BY id';
  RETURN QUERY EXECUTE sql;
END;
$$ LANGUAGE plpgsql;