関数の中でのグローバル変数の書き換え (PHP) »

 関数の中にある変数をグローバル宣言で読込んで参照するということはよくやるのだが、変数である以上、書き換えることももちろん可能だ。(これを知った時、思い掛けない結果だったので、ちょっとショックだったのだが、これって当たり前のことなのか)

 ということは、ある関数を走らせて、グローバル変数を書き換えた場合は、リターンの必要もなく変数の内容が変わってしまうということだ。

 使いようによっては便利だが、関数の内容を忘れてしまうと、いつのまにか意図せずに変数の値が変わってしまっている、ということも起こる。

 何か関数にその機能についての明示的な名前をつけておくか、呼び出した箇所でコメントを残しておいた方が無難だろう。

 あるいは、関数の中でのグローバル変数の使用は、参照のみにとどめておくか。
 実際、殆どの場合はそういう使用方法なのだが、ルールとして厳格に決めてない限り、関数内でのグローバル変数書き換えはありうることだ。

 でもやはり、書き換えない、と決めた方がいいのかもしれない。

Tail-Lagoon @ 08:00   |   PageUp

DISTINCT »

CakePHP といえば、このあいだ早速けつまづいたことがあったので、書き留めておく。

あるフィールドの値を重複なしですべてリスト化したかったのだが、

$keyLists = array();
$SQLStr = 'SELECT DISTINCT column FROM dbTables ORDER BY forSortColumn ASC';
if ($Res = mysql_query($SQLStr)) {
    while ($Row = mysql_fetch_row($Res)) {
        $keyLists[] = $Row[0];
    }
}

これを、findAll() とかでできるかと思ったら、DISTINCT をどう指定していいのかわからなくて、結局上記コードのままになっている。で、これをメソッドとしてモデルに追加したのだが……こういう場合、これで正解? それとも別の手がある?

追記

自前のクエリを発行する場合は query() が使えるということがわかった。これならコントローラーで気軽に(?)使える。この場合、返ってくるのはCakePHPモデルの他のAPIを使った時と同様の構造を持つ配列。
ただ、これを使用した場合の新たな疑問は、DBテーブル名にプレフィックスを付加している場合、他のAPIではプレフィックスを意識せずに使えるけれど、query() の場合は意識しないといけないらしい、ということ。
ビュー内で使用する時、常にこのプレフィックスを付けて($Variable['PreFix_Table']['Column'] とか)呼び出すのは、何だかちょっと気持ち悪い感じがする……。統一して $Variable['Table']['Column'] のように使いたい場合はどうすれば?
というわけで、それが解決するまでは、自前メソッドのままの方が使いやすいので、query() の使用は保留。

さらに追記── AS の使用 (080701)

もしかしたら、下記でいけるかもしれない。未確認。そのうち試してみよう。

$this->User->query('SELECT DISTINCT column FROM prefix_users AS User ORDER BY forSortColumn ASC');

Tail-Lagoon @ 15:39   |   PageUp

CakePHPの命名規則 »

CakePHPシステムデザイン(最新規約)

まず何か作ってみようと思って、真っ先に困惑したのが命名規則。データベースのテーブル名やらモデル名やらコントローラとか……ある命名規則があって、必ずしも遵守する必要はないけれど、守っておけば作りやすい(簡単便利?)らしい。というわけで、フォーラムの中にちょうどこれに関する記事を見つけたので、ブックマーク。

CakePHPシステムデザイン(最新規約)

Tail-Lagoon @ 18:29   |   PageUp

WordPressのある特定の投稿に、固有のCSSを適用したい »

WordPress

(カスタムフィールドの利用)

 WordPressで記事を書いていて、その記事投稿の一部分にのみ独自のCSSを適用したい、という要求がしばしば発生する。その場合の対処は、

  1. 独自のidもしくはclassを割当て、style.css等の共用CSSファイルにその部分を記述する。
  2. 適用したいタグの中に直接 style="…" とアトリビュートとして記述する。
  3. 投稿部分に <style> タグを記述する。
  4. JavaScript を用いるなどして、強引にスタイルを変更する。
  5. WordPressのカスタムフィールド欄にCSS文を記述し、テンプレートファイルでカスタムフィールドを <head> 内の任意の場所に出力できるように修正する。

 といった方法が考えられる。しかし……

続きを読む… »

Tail-Lagoon @ 17:56   |   PageUp

CakePHP 関連リンク »

CakePHP

これからちょっとフレームワークを使ってみようかな、と思って……。
いろいろ調べたところ、CakePHPが最もとっつきやすそうなので、これを使うことに決めた。

Tail-Lagoon @ 11:46   |   PageUp

素因数分解 »

 特に利用目的はないけれど、任意の数字を因数分解する、ちょっとしたお遊びプログラム。

 数学の世界では、素数の数列を記述する有効な方程式はまだ発見されていない。だから大きな桁の素数を掛け合わせた場合、その結果だけを用いて再び素因数分解するのは、たとえコンピュータといえど膨大な計算時間を必要とする。現在の暗号化技術はこれを利用しているので、もし万が一、素数列を記述する方程式が発見され、悪用されたら、世界中に大激震が走ることになる。

 まあ、そんな大それた話は別としても、7桁や8桁の数字でも、手計算では結構大変だ。たとえば、次の5つの数字が約数を持つかどうか、手計算で(電卓くらい使ってもいいけど)調べてみてください。

  100000007、100000037、100639681、100639699、100639703

 実はこれらはどれも素数である(はずだ。……間違ってたら教えてください)。

 あるいはこんなのはどうか? 1010101 とか 101010101 といった数字。
 これはちゃんと因数分解できるけど、やっぱり手計算だと面倒くさい。結果は以下のとおり。

  1010101 = 73 x 101 x 137
  101010101 = 41 x 271 x 9091

 こんな約数になるなんて、まったく予測できないでしょう? 他にも、ぼくが面白いと思った素因数分解を、以下にあげておく。

  11111 = 41 x 271
  10101 = 3 x 7 x 13 x 37
  111111 = 11 x 10101 = 3 x 7 x 11 x 13 x 37
  1111111 = 239 x 4649
  11111111 = 11 x 1010101 = 11 x 73 x 101 x 137
  111111111 = 3 x 3 x 37 x 333667
  1111111111 = 11 x 101010101 = 11 x 41 x 271 x 9091
  1234567 = 127 x 9721
  123456789 = 3 x 3 x 3607 x 3803
  987654321 = 3 x 3 x 17 x 17 x 379721
  100000001 = 17 x 5882353
  1000000001 = 7 x 11 x 13 x 19 x 52579

 なんだか不思議な感じがしませんか?

続きを読む… »

Tail-Lagoon @ 13:56   |   PageUp

ブログに検索機能をつけた(ver.2) »

 以前の記事で、TypePad に独自の記事検索機能がないことを書いた。そして、サポートの勧めに従い Google カスタムサーチを設置して試してみた(これが ver.1)が、やはり幾つかの欠点が気になっていた。

  • 記事の新規追加・修正が検索結果にリアルタイムで反映されず、Google への登録待ちになる。
  • しかも、すべての記事が Google に登録されるとは限らない。
  • ページまるごとインデックスされるので、メニューやナビゲーションの文言まで検索対象となり(ノイズが混じり)、的確な検索結果が得られない。

続きを読む… »

Tail-Lagoon @ 01:22   |   PageUp

文字整形 »

 日本語を含む文字列で、全角英数字やアルファベット大文字を半角小文字に変換および半角カナを全角カナに変換する関数。検索キーワードを統一したい場合などに有効。(検索文字列および対象文字列の双方を変換してマッチさせる。ただし、表示する文字は変換前のものをそのまま使用したい場合は、データを二重化し、変換前と後をそれぞれ用意する必要あり)

<?php
function ABC2abc($Word) { // 文字列のうち英数文字を半角・小文字に統一
    $Word = mb_strtolower($Word, 'UTF-8');
    $Word = mb_convert_kana($Word, 'KVa', 'UTF-8');
    // option  K:半カナ→全カナ  V:濁点文字を一文字  a:全英数→半英数
    $Word = mb_strtolower($Word);
    return $Word;
}
?>

 例 : Japan2008, JAPAN2008 などの文字列を一律 japan2008 に変換

補足

 mb_convert_kana について、上記のように文字コードを指定するか、あるいはPHPスクリプトの内部エンコーディングを最初から指定しておく(下記例)かしないと、うまく機能しない場合がある。

<?php
mb_internal_encoding("UTF-8");
?>

Tail-Lagoon @ 15:31   |   PageUp

XOOPS を簡単に始めたい »

 XOOPS は初心者泣かせの CMS ツールだと思う。
 まずインストールした後の使い方を調べるのに泣かされる。そもそもインストール直後は空っぽだから、目的に応じてモジュールを追加インストールしなければいけないのだが、では「例えばこういう使い方をしたい場合はどのモジュールを使えばいいのか」というような基本的なことからまずわからないのである。
 こういう場合、正直「XOOPS Cube 日本サイト」は、あまり初心者には向いていないと思う。よくわからないけど有用そうな情報がたくさんある。でもある程度 XOOPS を使った経験と知識がないうちは、さっぱり要領を得ない。

 で、色々悪戦苦闘しているうち見つけたのが、「ホダ塾」というサイトで提供している「ホダ塾ディストリビュージョン」である。最初から、サイト構築に必要そうなモジュールが組み込まれていて、XOOPS インストールと同時にモジュールまでインストールできる。少なくとも、わけもわからずモジュールを調べ回ったり捜したりバージョンの互換性を気にしたりといったことから開放される。あとは各モジュールを自分で試してみて、要らなければ削除していけばいい。(それから、インストール時に UTF-8 が選択できる点も、ありがたい。普通に Japanese としてインストールすると文字コードが EUC になってしまうのだが、やはり UTF-8 を使いたいじゃないか)
 しかも「うさぎにもできるXOOPS Cube入門♪」というサイトがあって、こちらでは「ホダ塾ディストリビュージョン」のインストールから使い方の基礎まで解説してくれている。
 新規インストールする場合、今後はこの2つのサイトを活用しようと思っている。

リンク

  • ホダ塾
    2008年3月3日、ホダ塾ディストリビューション"HD1.0 for XCL2.1"リリース
    (XCL って何だろうと思ったが、よくよく考えたら XOOPS Cube Legacy の頭文字だった)
  • うさぎにもできるXOOPS Cube入門♪
  • XOOPS Cube 日本サイト
    (一応こちらもリンクはしておこう。ある程度習熟してからなら、きっと色々お世話になるはず)

Tail-Lagoon @ 19:03   |   PageUp

TypePad テンプレートに関するメモ »

インデックス・テンプレートは、出力するファイル名が決まっている=1ページのみ作られるファイル用のテンプレート。つまり、新たに追加した場合、自分でファイル名を決定し、アクセス方法はそのファイル名にリンクすればよいということになる。

※これに対して、アーカイブ・テンプレートは、出力するファイル名が決まっていない=複数ページ作られるファイル用のテンプレート。テンプレートの種類と数は既にシステムで決められているので、新たにテンプレートを追加することはできない。既存テンプレートファイルの変更修正のみ可能。

グローバル属性(どのMTタグにも使えるアトリビュート)
    remove_html="1"
        文字列からHTMLタグを取り除く
        ex. あいうえお<br />かきくけこ → あいうえおかきくけこ
    generate="1"
        (現時点では不明。何かねこれ?)

【エントリーの一覧表示関連】

<MTEntries> のソートに関する属性(アトリビュート)
    sort_by
        表示順の並べ替えを行うフィールドを指定。
        オプション値は、title, status, modified_on, author_id, excerpt のいずれか。
        (注 : この属性を記述しない場合は、投稿順ソートとなるため、
           通常は無記述で構わない)
        ex. sort_by="title"

    sort_order
        表示順の設定。ascend(昇順)もしくは descend(降順)。
        ex. sort_order="ascend"

    ex. <MTEntries sort_order="ascend">

テンプレート・モジュールについては、ナレッジ・ベースよりもマニュアルページの方が詳しいようだ。ナレッジ・ベースでは掲載されているモジュール数が少ない。

記事概要表示
    ex. <$MTEntryExcerpt remove_html="1" encode_xml="1"$>
    通常RSS出力で使用。特に概要記事を別に用意しない場合は、むしろ下記の方が良いか?

記事本文表示
    ex. <$MTEntryBody words="N"$>
    記事本文をN文字分表示(かつ、HTMLタグは除去される)。全文を表示したい場合は属性不要。

Tail-Lagoon @ 02:00   |   PageUp