Plugin – 言語パックが出ていないバージョンを日本語化する / 他機能ファイル検索

 
– Pleiades
EclipseWiki の説明ページ
このプラグインを適用すると、公式 Language Package が出ていない Eclipse 3.3 を日本語化することができます。
 
– GotoFile Eclipse Plugin
EclipseWiki の説明ページ。
このプラグインを適用すると、編集メニューに「クイック検索(Ctrl+Alt+N)」の機能が追加され、頭文字だけのキャメルケース検索や、曖昧検索ができるようになります。
思ったほどもたつきも感じませんし、標準のファイル検索機能(Ctrl+Alt+R, Ctrl+Shift+R)よりもだいぶ便利です。
GotoFile update site:

http://www.muermann.org/gotofile/update

 
2007-10-09 現在、GotoFile Plugin をインストールする時に「この環境に適当でないフィーチャーを無視する」にチェックが入っていると、対応バージョンを検出してくれませんでしたが、チェックを外してインストールしても問題なく動作します。

PuTTY でデフォルト設定を変更する

度忘れしていたのでメモ。
 
引数なしで putty.exe を起動し、設定を変更後に
“セッション” カテゴリを選択し、 “保存されたセッション”の欄で Default Settings を選択して保存ボタンでOK。
 
端末のプライベートキーファイルを設定するには、
“接続” -> “SSH” -> “認証” カテゴリを選択し、”認証パラメータ”の欄で認証のためのプライベートキーファイルに(puttygen.exe で作成した) *.pty ファイルを設定すればよい。
 
OpenSSH の ssh-keygen で作成した秘密鍵を putty でも使いたい場合は puttygen で Load ボタンでssh-keygen で作成した秘密鍵(id-dsa や id-rsa)を選択後 Save private key ボタンで .pty 形式に変換できる。
鍵の内容は同じなので、publick key は両方の秘密鍵で共通。

DHTML ページのアクティブな HTML ソースを表示する

Ajax を使っているページをブラウザでソース表示すると、スクリプト実行が反映されない HTML ソースしか取得できません。
そこで、JavaScript 実行結果が反映された現在の BODY の中身を表示する “javascript:” スキームを使ったスクリプトを書いてみました。
 

javascript:open(“about:blank”).document.write(“<PLAINTEXT>”+document.body.innerHTML);

ソースを表示したいページのアドレスバーの URL 入力欄にコピペして実行すると、新しいウィンドウでソースを表示します。
※ポップアップがブロックがされる場合、一旦解除して、アクセスしなおしてください。
  
選択コピー可能なように新しいウィンドウを立ち上げているところがミソです(alert だとコピー不可)。
 
Windows IE6, Firefox2.0 で動作確認済です。

コーディング規約 – いいコードの書き方

いいコードとは, 心得5ヶ条(ThinkIT)
電通国際情報サービスの高安氏らによる記事。良書です。
 
ブール値を返すメンバー関数の命名規則(吉田誠一のホームページ)
JDK の API 命名規則を元にして、英文で通るメソッド命名規則について書かれています。
 
参考:
コーディング規約の会(オブジェクト倶楽部)

SUPER C – マルチメディアファイル相互変換をするフリーソフト

http://www.erightsoft.net/Superdc.html
 
未使用ですが、携帯動画変換君のように 3gp など携帯向けの動画、音声も変換することができるようです。
 
参考:
あらゆるマルチメディアファイルを相互変換するフリーソフト「SUPER C」(GIGAZINE)

symfony – Propel を仲介せずに databases.yml に書かれた設定や DB接続インスタンスを得る

sfDatabaseManager クラスを使うことで Propel より低いレイヤーでデータベースの情報を得たり、(Creaole による)データベース接続を行うことができます。
この方法を使うと databases.yml の設定を一時的に変更した上でデータベースアクセスができるようになります。

$manager = new sfDatabaseManager();
$manager->initialize(); // インスタンスに database.yml ファイルを読み込んで初期化する。
$db = $manager->getDatabase(“propel”); // “propel:” 以下を参照し、sfDatabase のインスタンスを得る。 引数を省略すると default: を参照する
 
// database.yml の設定を参照する例:
echo $db->getParameter(“phptype”).”\n”; // propel: param: phptype: を参照(“mysql” など)
echo $db->getParameter(“host”).”\n”; // propel: param: host: を参照(localhost など)
echo $db->getParameter(“database”).”\n”; // propel: param: database: を参照
echo $db->getParameter(“username”).”\n”; // propel: param: username: を参照
 
// databases.yml の設定を一時的に上書きする例:
$db->setParameter(“database”, null); // 特定のデータベースに接続しない。
                                     // (データベースが存在しなくてもエラーにならないため
                                     // CREATE DATABASE したい場合やテーブルを一切利用
                                     // しない場合などに有用)
 
// データベース接続の例:
// databases.yml の設定をもとに Creole のデータベース接続インスタンスを得る
// (vendor/creole/Connelction.php で定義される Connection 抽象クラスのインスタンス)
$con = $db->getConnection();
 
$rs = $con->executeQuery(“SELECT CURRENT_TIMESTAMP AS time”); // クエリを発行。
while($rs->next()){ // ポインタを進める(複数レコード対応)
    $row = $rs->getRow(); // レコードを連想配列で取得
    echo $row[“time”];
}

 
参考:
– Class sfDatabaseManager(symfony API)
 sfDatabaseManager のクラス定義。
 
– Class sfDatabase(symfony API)
 sfDatabaseManager::getDatabase() で得られるインスタンスの定義。
 
– SymfonyAPI – Connection Interface Reference(cpr.in-berlin.de による symfony の phpdoc)
 sfDatabase::getConnection() で得られるインスタンスの定義。
 
– SymfonyAPI – ResultSet Interface Reference(同上)
 Connection::executeQuery() で得られるインスタンスの定義。

symfony – 単体テストで propel を使う方法

機能テスト(functional test) やバッチスクリプト(batch)で Propel を使う方法については以前こちらの記事で

sfContext::getInstance();

を最初に実行すれば動作する、と書きました。
 
しかし単体テストで Propel を使う際は、単純に

require_once(dirname(__FILE__).’/../bootstrap/unit.php’);
sfContext::getInstance();

とするだけでは

Fatal error: Class ‘sfContext’ not found in …

のように、sfContext クラスが見付からずエラーになります。
ここで単純に sfContext を include しても、sfCore や myUser などが存在しないと言われたり、様々なエラーがでて動作しません。
前述の記事の参考URLにあるように、次のようなコードが必要になります(注: 参考元の投稿コードから僅かに手を加えています)。

// TODO: 要変更 – テスト対象のアプリケーション名
$app_name = “frontend”;
 
//begin initialise database code
include(dirname(__FILE__).’/../bootstrap/unit.php’);
include(dirname(__FILE__).’/../../config/config.php’);

require_once($sf_symfony_lib_dir.’/util/sfCore.class.php’);
sfCore::initSimpleAutoload(array(SF_ROOT_DIR.’/lib/model’ // DB model classes
                                ,$sf_symfony_lib_dir // Symfony itself
                                ,dirname(__FILE__).’/../../apps/stageselect/lib’ // Location app lib
                                ,SF_ROOT_DIR.’/plugins’)); // Location plugins
set_include_path($sf_symfony_lib_dir . ‘/vendor’ . PATH_SEPARATOR . SF_ROOT_DIR . PATH_SEPARATOR . get_include_path());
 
define(‘SF_ENVIRONMENT’, ‘test’);
define(‘SF_APP’, $app_name);
define(‘SF_DEBUG’, true);
 
sfCore::bootstrap($sf_symfony_lib_dir, $sf_symfony_data_dir);
sfContext::getInstance();
Propel::setConfiguration(sfPropelDatabase::getConfiguration());
Propel::initialize();
// end initialise database code
 
// 初期化終わり、以下テストコードが続く…
 
$lime = new lime_test();
 
// :

 
原因についてはエラーや対策のコードを見れば想像がつくと思いますが、単体テストでは機能テストと違い bootstrap (unit.php, functional.php)を include するだけで symfony プロジェクトをまるごと読み込んだり初期化しないようになっているためです。

symfony – propel でのリレーションの仕方

schema.yml:

Author:
  name: varchar(255)
Article:
  title: varchar(255)
  author_id:

のように、カラム名に <主テーブル名>_id という名前を付けると、参照テーブル(Article) には,主テーブル名(Author)への foreign key が作られ、 propel のモデルクラスでそれぞれのリレーションに対する専用のメソッドが提供されて簡単にリレーションができるようになります。
 
前述の Author, Article ならばモデル生成時に次のようなメソッドが自動生成されます。

class BaseAuthor {
    public function getArticles();
    public function addArticle($article);
}
class BaseArticle{
    public funtcion getAuthor();
    public function setAuthor($author);
}

この場合, addArticle() という名前のメソッドを呼び出すと、外部キーが適切に設定されるだけでなく、メソッドを呼んだオブジェクトが save() された場合に、このメソッドで引数にしてあるオブジェクト全てに対して save() を要求してくれます。複数指定可能なので set でなく add になっているわけです。
また、getArticles() メソッドを使うと、実行インスタンス(の元になるレコード)を参照している、 Article テーブルの全てのレコードの Article クラスインスタンスを取得できます。
 
逆に、参照元のテーブルである Article クラスのインスタンスから getAuthor() を呼ぶことで、そのインスタンスが参照している Author クラスのインスタンスを得ることができます。
 
add メソッドの利用例:

// 著者登録
$author = new Author();
$author->setName(“Ernest Miller Hemingway”);
 
// $author への作品登録
$article = new Article();
$article->setTitle(“The Old Man and the Sea”);
$author->addArticle($article);
 
// $autho への作品登録その2
$article = new Article();
$article->setTitle(“For Whom the Bell Tolls”);
$author->addArticle($article);
 
// 全て書き込み
$author->save();

結果:

Author:
id | name
1 | Ernest Miller Hemingway
Article:
id | name | author_id
1 | The Old Man and the Sea | 1
2 | For Whom the Bell Tolls | 1

参照例:

 
参照時には
参考:
-Relationships(propel.phpdb.org)

symfony – sfBrowser メモ

一部ですが、sfBrowser で使えるメソッドをメモしておきます。
 
sfBrowser click(string $name [, array $arguments])
 $name で指定したボタンをクリックする。

<input type=”submit” value=”$name”>

 のように、value が $name で指定した値と一致するボタンをブラウザでクリックしたときの動作をエミュレートします。setField() とあわせて使います。
 
sfBrowser followRedirect()
 レスポンスヘッダの Location で指定されたURLにリダイレクトする
 
sfBrowser get(string $uri [, array $parameters])
 指定した URL へのアクセスをエミュレートします。
 例: モジュール foo のアクション index にアクセスします。

$browser->get(“/foo/index”);

 
sfWebResponse getResponse()
 HTTP レスポンスインスタンスを取得する。
 > echo $browser->getResponse()->getContent();
 とすれば、HTML ソースなどレスポンスの本体部分を表示できます。
 
sfBrowser setField($name, $value)
 フォーム入力のエミュレート。指定した名前の入力欄に $value の値を入力します。click() とあわせて使います。
 
参考:
タグで分類するシステムの作り方(symfonyで開発日記)
Class sfBrowser(symfony API)

文字列を比較演算子で比較したときの挙動

“abc” < "def"

のように、文字列を比較演算子(>, <, >=, <=)比較すると、辞書順での比較になります。
 
例:

if(“abc” < "bbb") echo "true";

結果:

true

 
ただし、両項が完全に数値とみなせる文字列であれば、数値同士の比較になります。

if(“100” < "0100.5") echo "true";

結果:

true

一文字であろうと数値としてみなせない文字が含まれると、文字列同士、つまり辞書順の比較になります。

if(“100a” < "0100.5"){ echo "true"; }else{ echo "false" }

結果:

false