Skip to main content

ログ取得ツール

Category: プログラミング

OpenMPメモ

gccでのコンパイルはオプションに-fopenmpを追加。gcc 4.1系以降はデフォルトで入ってる。

## gcc –fopenmp program.c –o program

_OPENMPがdefineされる。

#ifdef _OPENMP
  printf("OpenMP enabled\n");
#endif

スレッド数はデフォルトでコア数なので特に設定する必要はない。上書きしたいときは環境変数「OMP_NUM_THREADS」で設定。

## OMP_NUM_THREADS=10 ./program

スレッド数をプログラム側で指定する方法もあるが、まあ使うことはないでしょう。

コードの書き方。単純なfor文には直前に1行追加。データ分割で、配列アクセスならコア毎のキャッシュに当たりやすく、性能が出やすい。OpenMPの最も得意な形。

#pragma omp parallel for
  for(int i=0; i

これで効果が出やすいのは、、、

  • それぞれのイテレーションで計算量が同じ(各スレッドに同量程度の仕事が割り振られる)
  • ループを回る回数が多い(スレッド生成・joinにもある程度コストがかかる)
  • 配列アクセス(データがキャッシュに当たりやすい)

というもの。

外から入ってくる変数でスレッドローカルにしたいものはprivate(var1, var2)などで宣言。デフォルトではスレッド間で共有される。中のスコープで定義した変数は当然、スレッドローカル。中のスコープでもstatic変数は共有(スレッドですから)。

mimetex for wordpress

世の中にはmimetexmathteximgtexやMediawikiのtexvcなど、TeXの表現を画像としてHTMLに埋め込むためのソフトがいくつかある。中でもmimetexはTeXの処理系が不要でキャッシュを使わなくても処理がそこそこ高速だ。pngじゃなくてgifなのはちょっとアレだが、そこは我慢する。

mimetexはFedoraやEPELにパッケージが入っているので、

## yum install mimetex

とするだけでCGIとして/cgi-bin/mimetex.cgi?x^2+y^2($x^2+y^2$)などが使える。とても楽ちんだ。

WordPressにもプラグインはいくつかあるが、どれもけっこう大仰なものになっている。キャッシュはとりあえず過負荷になるまでは必要ないと思えば、簡単なショートコードだけで充分だ。

ただしPHPは「”」や「’」を受けるときに勝手に全角文字に変えられることがあるので注意が必要だった。どうなの? とは思うけど。

[tex]x^2+y^2[/tex]と記述すると、$x^2+y^2$のように表示されます。

  • mimetex.php
  • インストールは、ファイルをwp-content/pluginsに入れて管理画面からプラグインを有効に。
Author URI: /wordpress/
*/
function tex_func($attrs, $content){
  $baseurl='/cgi-bin/mimetex.cgi';
  $content = str_replace("‘", "'", $content);
  $content = str_replace("”", '"', $content);
  $content = str_replace("“", '"', $content);
  $content = html_entity_decode($content);
  $hs=htmlspecialchars($content, ENT_QUOTES, 'UTF-8');
  $ul=urlencode($content);
  return ''.$hs.'';
}
add_shortcode('tex', 'tex_func');
?>

$\Large A\ =\ \large\left(\begin{array}{c.cccc}&1&2&\cdots&n\ \hdash1&a_{11}&a_{12}&\cdots&a_{1n}\ 2&a_{21}&a_{22}&\cdots&a_{2n}\\vdots&\vdots&\vdots&\ddots&\vdots\n&a_{n1}&a_{n2}&\cdots&a_{nn}\end{array}\right)$

改行

改行を多用する人っていますよね。

田中隼磨のブログとか。

少しマシにするgreasemonkeyスクリプトを遊びで書いてみました。

ちょっとした冗談ですよ。

// ==UserScript==
// @name           hayumablog
// @namespace      hayu
// @description    田中はゆまのblogの改行をマシにする
// @include        http://sports.cocolog-nifty.com/hayuma/*
// ==/UserScript==
(function(){
  var items = document.evaluate('//div[@align="left"]', document, null, XPathResult.ORDERED_NODE_SNAPSHOT_TYPE, null);
  for(var i = 0; i < items.snapshotLength; i++){
    var item = items.snapshotItem(i);
    item.innerHTML = item.innerHTML.replace(/
|
|

<\/p>/g, '\n'); } })();

LLRBツリー(Left-Leaning Red-Black Tree)

平衡二分木の世界では近年では赤黒木(Red-Black Tree, RB-tree)が標準的である。追加、検索、削除がそれぞれ最悪O(log N)というすぐれものだが、場合分けが多く実装はけっこう面倒だ。

赤黒木というのはB木(Balanced tree)の一種である2-3木/2-3-4木をベースにした平衡二分木で、ノード内のリンクを赤、ノード外とのリンクを黒とラベル付けし、赤リンクの数が黒リンクの数を上回らず、黒リンクのみを数えた高さで見て平衡、つまりlog Nの高さを保証したというもの。つまり赤リンクを含めても2*log N以下に必ず納まるのだ。詳しく知りたければ調べてください。

昨年にRobert Sedgewick氏によって発表されたLLRBツリー(Left-Leaning Red-Black Tree)というのは、2-3木/2-3-4木を2分木に表現した赤黒木の赤リンクの形式に制約をかけ(左寄せする=Left-Leaning)、一意になるようにして場合分けを少なくし、実装しやすくした赤黒木の改良版だ。赤黒木に対して性能が上がるということはないが、実装のしやすさは格段に向上しているという触れ込み。実際、Javaのソースで200行を切っており、この操作だけでパターンを網羅していることが理解できれば、かなり楽に実装できてしまう。

processingおもしろいかも

processingが面白そうだなぁと思ってました。ほぼJavaなんですね。なるほど。ただ、ちょっと予約語(?)が多いかなぁという気もする。たとえばwidthとかheightとか…色が変わるから分かるけどね。 書いたものがすぐに絵になって、JavaアプレットだけどWebにも乗せられるってのはまあ、楽しいかもしれませんね。 実際に試しに作ってみた最初のsketchをどうぞ。マウスカーソルに当たるとグレーになって弾が止まります。 (IEだと動かないですね…)

**This browser does not have a Java Plug-in.

Get the latest Java Plug-in here.**

ソースは以下の通り。

int N=150;
bullet[] bl = new bullet[N];
int w=640;
int h=480;

void setup(){
  size(w, h);
  background(0,0,0);
  noStroke();
  for(int i=0; iwidth){ dx*=-1; }
      if(y<0 || y>height){ dy*=-1; }
    }
  }
  void check_hit(){
    if(abs(x-mouseX)
        

link rel="next/prev" href="url"

HTMLのヘッダ部分にナビゲーションがついていると思ったらついていなかった。WordPressはナビゲーションつかないのか。カテゴリやタグのリンクはつくんだけどな。

Firefoxだとlink widgetsという拡張があって、ナビゲーションリンクを検出してブラウズに役立てることができる。意外と便利です。この拡張、昔は下のステータスバーについたんだけど、今は上のツールバーのwidgetとしてレイアウトできるようになった。

それで、WordPressのプラグインディレクトリを探してみたんだけど、探し方が悪いのか見つからない。内容は非常に簡単なので自分で書いてみた。こんな感じかな。

";
  }
  return "";
}

function nextlink_add(){
  $post = get_previous_post();
  if($post){
    echo nextlink_get(get_permalink($post), "prev", $post->post_title) . "\n";
  }
  $post = get_next_post();
  if($post){
    echo nextlink_get(get_permalink($post), "next", $post->post_title) . "\n";
  }
}

add_action('wp_head', 'nextlink_add');
?>

wp-content/pluginsに放り込んで、管理画面からnextlinkプラグインを有効にすると使われるようになります。

C言語も最近は無茶できるようになったんだね…

私はかなり時代に取り残されてますね。C言語の配列の初期化がすごいことになっていた。

char a[] = { [0 … 255] = ‘z’, [5] = ‘5’, [2] = ‘2’ };

信じられないことに、意図通り(sizeof(a) = 256で、内容はzz2zz5zzz…)に初期化されます。

構造体の初期化でメンバの名前を指定(struct st{ int member1; }; st a = { .member1 = 1, };)できるのと同じ書式です。複数の要素を一気に初期化することができるのが変わった点かな。指定が重なった場合は後ろで指定したものが有効になります。

これまでは連想配列的な気分で配列を使いたい場合に、配列のインデックスに使う名前をenumで定義して、順番に気をつけながら配列の定義を書かなければなりませんでした。

enum { KEY1, KEY2, KEY3, KEY4, };
char *a[] = { value1, value2, value3, value4, };

この書き方は、途中でずれた途端に破綻します。要素の数が増えるに従ってズレの確率が高まる。でも、これからは以下のように書けます。

enum { KEY1, KEY2, KEY3, KEY4, };
char *a[] = { [KEY1] = value1, [KEY3] = value3, [KEY2] = value2, [KEY4] = value4, };

FTP, WebDAV, NFSサーバにPythonからアクセスするクライアントライブラリ

Linuxだとmountしてローカルファイルと同じようにアクセスできるからいいけど、Windowsではそうもいかない。ftpやWebdavはエクスプローラで見えたりする状態もありうるが、対応していない大部分のアプリではそのパスを使ってファイルアクセスすることができない。

しかもWebDAVのサポートは打ち切り間近という話も。ここらでPure Pythonで統一的にこいつらにアクセスする方法を提供しておかないと、Windowsユーザは不便さが激増してしまうよ。

のうがきはともかく、作ってみたかったので作りました。ローカルファイル、FTP、WebDAV、NFSに同じインタフェースでアクセスできるライブラリ。使っているのはPythonの標準ライブラリのみ。おまけで簡単なCLIインタフェース(ftpっぽいやつ)もつけました。Windows、Linuxである程度、使えてます。

日本語ファイル/ディレクトリ名にはできる範囲で対応してます。使い方は普通のlistdirとかstatとかmkdirとかに似せたから、なんとなくわかるんじゃないかな。アップロードとダウンロードはリモート側がファイル名、ローカル側はファイルオブジェクトで渡す。

Pythonメモ

その1。ジェネレータは再帰で書けない。以下のサンプルは動きません。1回しかyieldしてくれない。

def mygen(n):
  if n<=0: return
  yield n
  mygen(n-1)

以下もダメ。

def mygen2(n):
  if n<=0: return
  mygen2(n-1)
  yield n

多重ループもだめかも。意外と不便ですね。どういうしくみだと考えれば妥当な挙動と思えるのかなぁ。

その2。Windowsの場合はファイルを開くのにbinaryモードとtextモードの区別が必要。Pythonの場合、デフォルトはreadでtextなのですね。Linuxの頃は意識しなくても良かったのに。JPEGを開いてEXIF情報を読もうとして失敗したり、ftplibでアップロードしようとして途中までしかアップロードできなかったり。しばらくの間、原因が分かりませんでした。EOF(^Z)に遭遇したところでread()が終了してしまったんでしょう。このひどいデザインがまだ生きているとは…確かにDOSの頃はそうだったような記憶もあるけどさ。Windowsでプログラムを組むってのは、大変ですね。Pythonの処理系がデフォルトでbinaryモードにしとけばいいって話ですけどね。

boostすげえな

boostは噂の通り、熱いですね。ほんとにこれがC++か? と思えるほど。STLを初めて見た時もかなりの衝撃でしたが、boostはその上を行ってます。C++さんはまた遠くに行ってしまったんだね…

そういえばSTLのbitsetはコンパイル時に長さを決めるので扱いづらいなぁという印象を受けたことがあったなぁと思ってboostのbitsetを見てみると、boostには実行時に長さを変えることができるdynamic_bitsetがありました。がんばるなぁ。

試しにboost.pythonを使ってPythonから使えるモジュールにしてみました。

Python 2.5.1 (r251:54863, Oct 30 2007, 13:45:26)
[GCC 4.1.2 20070925 (Red Hat 4.1.2-33)] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> import bitset
>>> b=bitset.bitset(12)
>>> b
bitset("000000000000")
>>> len(b)
12
>>> dir(b)
['__and__', '__class__', '__delattr__', '__dict__', '__doc__', '__eq__', '__ge__',
 '__getattribute__', '__getitem__', '__gt__', '__hash__', '__iand__', '__ilshift__',
 '__init__', '__instance_size__', '__invert__', '__ior__', '__irshift__', '__isub__',
 '__ixor__', '__le__', '__len__', '__lshift__', '__lt__', '__module__', '__ne__',
 '__new__', '__nonzero__', '__or__', '__reduce__', '__reduce_ex__', '__repr__',
 '__rshift__', '__setattr__', '__setitem__', '__str__', '__sub__', '__weakref__',
 '__xor__', 'any', 'clear', 'count', 'find_first', 'find_next', 'flip',
 'is_proper_subset_of', 'is_subset_of', 'none', 'num_blocks',
 'push_back', 'reset', 'resize', 'swap', 'to_ulong']
>>> b[4]=1
>>> print b
000000010000
>>> b
bitset("000000010000")
>>> b.flip()
>>> b
bitset("111111101111")
>>> b.flip()
>>> b
bitset("000000010000")
>>> b.flip(2)
>>> b
bitset("000000010100")
>>> b[4:9]
bitset("00001")
>>> b[-1]
False
>>> b[:5]
bitset("10100")

普通にto_string()を使ってるのに、バイトオーダの影響か、後ろから表示されてますね。boostもboost.pythonもまだよくわからない部分が多いですが、使えなくもないと思います。b1&b2,b1|b2,b1^b2とか~b1といった演算、あとシフトと引き算、大小比較もboostのものをそのまま使ってやってます。