2008/04/30(水)[php] imagettftext

imagettftextはUTF-8で文字列を渡す必要があります.そのため,mb_convert_encoding($str, 'UTF-8')などであらかじめエンコードしておく必要があります.

$str = 'ほげほげ';
$str = mb_convert_encoding($str, 'UTF-8');
imagettftext($image, 10.5, 0, 0, 0, $color['black'], $font, $str);

が,[JIS-mapped Japanese Font Support]がサポートされている時は,内部で勝手にエンコードを変換してくれるため,エンコードしておく必要はありません.というより,'UTF-8'でエンコード済みの文字列を渡すと化けます.なので,文字列が'UTF-8'の場合,意図的に'SJIS'に変換してから渡す必要があります.

$str = 'ほげほげ';
$str = mb_convert_encoding($str, 'SJIS');
imagettftext($image, 10.5, 0, 0, 0, $color['black'], $font, $str);

この[JIS-mapped Japanese Font Support]ですが,gd_info関数で組み込まれているが調べることができます.

$info = gd_info();
if($info['JIS-mapped Japanese Font Support']){
  // 組み込まれている
}

以下,検索用キーワード
[imagefttext] [imageffttext] [GD] [PHP] [UTF-8] [SJIS] [JIS-mapped Japanese Font Support] [gd_info] [文字化け]

2008/04/15(火)HTMLのコメント

コメント中に --(ハイフン2つ)を入れることは出来ないようですね.知りませんでした.終了タグ以外はなんでも入るものだと思ってました.

仕様? 2008/04/20

コメントの開始は <!
コメントの終了は >
中には -- で囲まれたコメントブロックを0個以上入れることができる.

<! -- ここはコメント -- ここはコメントじゃない -- ここからもう一度コメント -- >

一度HTMLを真面目にお勉強しておいたほうがいいかもしれない

2008/01/20(日)分布数え

大量のデータを処理するときに使う手法の1つです.データを一読し,データの出現回数を数えてしまうものです.

これを利用したソートの一種としてバケットソートがあるのですが,データとして取りうる値の数だけメモリを用意する必要があることが欠点になります.が,取りうる値の種類が16bit程度であれば何も気にせずにメモリを確保してしまえばいいだけです.

というわけで,最近ちょっとした画像?処理をしていたのですが,さすがに早いですね.頻度分析というか特徴抽出というかそういう内容だったのですが,アルゴリズム通りに実装すると数日かかりそうな処理が1-2分で終わりました.

問題に対して制限をかけることは重要ですね.

moodle

2008/01/11プログラム

moodleのソースを読んだときのメモ.

関数

ログインしてるかテスト

// if you are logged in then you shouldn't be here!
if (isloggedin() and !isguestuser()) {
    // ログイン済み
}

ユーザ情報の取得

$user = get_complete_user_data('username', $username);

POST, GETからデータを持ってくる

データが無ければ2番目の引数の値がデフォルトとして入る.
3番目の引数はデータの型.

$value   = optional_param('p', false, PARAM_RAW);

制限

ユーザ情報における長さの最大値

lib/moodlelib.phplimitに入ってる.
データベースの構造を変えるときは,ここも同時に変えること.

$limit = array(
    'username'    => 100,
    'idnumber'    =>  64,
    'firstname'   => 100,
    'lastname'    => 100,
    'email'       => 100,
    'icq'         =>  15,
    'phone1'      =>  20,
    'phone2'      =>  20,
    'institution' =>  40,
    'department'  =>  30,
    'address'     =>  70,
    'city'        =>  20,
    'country'     =>   2,
    'url'         => 255,
);

メモ

ロールの切り替え

switchrole=xが付いているときは,そのロールに切り替わる.
ロールを追加/削除していないときの標準値

  • 1 管理者
  • 5 学生
  • 0 元のロールに戻る

2008/01/05(土)Turing Machine

チューリングマシンのよさげなプログラムが無かったので作った.
cgiにしてあるのでwebで使えるらしい.

Turing Machine Emulator(kis-labを間借りしてます)

なんとなく作ったのでバグがあるかも.

Turing Machine

よく分からないけど,すごいものらしい.

使い方

テープにいろいろ書いて,プログラムつくってrun.
サンプルとして,2進数の足し算が標準で入ってる.

制限

実行ステップ数

一度に実行できるのは50ステップまで.でも,continueできるのであまり意味は無い.
しかも,URLに?LIMIT=xxxを追加するといくらでも増やせたり減らせたりしてしまうらしい.
ただ,正の整数以外が指定された場合の動作は不明っぽい*1

使える状態とか記号

状態は整数の範囲ならいくらでも大丈夫.
使える記号は_と空白類文字を除くascii文字1文字のみ*2
_は何も書かれていない(空白)扱い.

*1 : テストしてないらしい

*2 : a-zA-Z0-9とか

サンプルプログラム

2進数の足し算

B被加算数P加算数Eとして入力.たとえば,11 + 101ならばB11P101E
2進数の足し算プログラム

2の補数

補数を求めたい2進数をそのまま入力.たとえば,01011101ならば01011101
2の補数プログラム

2007/08/31(金)ファイルへのアクセス

mmapの早さを実感するべく1GBのファイルを作ってテストしてみました.
テストの内容は以下の通り.今回は読み込み限定です.

  • 一度に読み出すのは1000バイト
  • 3種類の読み出しをテスト
    • 先頭から順に読み込む(test1)
    • 後ろから順に読み込む(test2)
    • 乱数で適当に読み込む(test3)

テストはメモリ4GB載ってる大学のサーバを使用.1G以上開いてるので他のプロセスの影響は無いかと.

fopen, fseek, fread

ファイルを開くときの定番です.おそらく一番楽な方法.
"rb"でファイルを開いて,目的の場所にfseekして,1000バイトfreadしてます.

ソース省略

続きを読む

2007/07/22(日)魔方陣

全探索でとくプログラムを作成していたのですが
4x4ですでに探索範囲広すぎ...

枝狩りしてもいい感じな時間がかかって現実的ではありませんでした.
とりあえずやっている枝狩り

  • 縦・横のいままでの合計から,次に入れられる最小値を求める\4x4の場合目標値が34なので,最初2マスに2, 3が入っていたら3マス目は13以上じゃないと34に届かない
  • 列がそろったときに目的の値になっているかテストする

他に何か効率あげる枝狩りの手段ってあるの?

全パターン

回転,対称を含めた7040パターン出すのに20分近くかかってる.
4隅の大小関係に制限をかけて1/8にしても2-3分くらいはかかってしまう模様.

2007/06/27(水)リフレクション

リフレクションを利用したオブジェクトの複製の例.
実行時にオブジェクトのメタデータからコンストラクタを取得しています.

using namespace System;

class hoge;
class huga: public hoge;
class piyo: public hoge;

int main()
{
  hoge ^obj;
  hoge ^obj2;

  Type ^type;
  ConstructorInfo^ constructorInfoObj;

  obj = gcnew huga();
  type = obj->GetType(); // 型情報(メタデータ)の取得
  constructorInfoObj = type->GetConstructor(System::Type::EmptyTypes); // 引数無しのコンストラクタの取得
  obj = (hoge^)constructorInfoObj->Invoke(nullptr); // 引数無しでコンストラクタを呼び出す

  // ここで obj は huga のオブジェクトになってる

  obj = gcnew piyo();
  type = obj->GetType(); // 型情報(メタデータ)の取得
  constructorInfoObj = type->GetConstructor(System::Type::EmptyTypes); // 引数無しのコンストラクタの取得
  obj = (hoge^)constructorInfoObj->Invoke(nullptr); // 引数無しでコンストラクタを呼び出す

  // ここで obj は piyo のオブジェクトになってる

  return 0;
}