Hatena::ブログ(Diary)

::Eldesh a b = LEFT a | RIGHT b このページをアンテナに追加 RSSフィード Twitter

2015-04-03

random_rは使ってはいけない

random_r 関数glibc が提供しているリエントラントな擬似乱数生成APIです。

複数のスレッド乱数を使いたい場合はこれを使うべきらしい。*1

複数のスレッドが random() を使うような状況では、この関数を使用すべきではない。 その場合には random_r(3) を使うこと。

http://linuxjm.sourceforge.jp/html/LDP_man-pages/man3/random.3.html

ただ少なくともこのマニュアルが不十分で、man を読んだだけだと正しく使うことは出来ません。


以下に私の手元で 動いたように見える コードを示します。


/*
 * $ gcc -o test test.c && ./test
 */
#include <stdio.h>
#include <stdlib.h>

int main (int argc, char * argv[]) {
  struct random_data buf;
  char rand_st[256];
  /**
   * この行が無いとsegmentation fault
   */
  buf.state = (int32_t*)rand_st; // (1)
  initstate_r(1, rand_st, sizeof(rand_st)/sizeof(rand_st[0]), &buf); // (2)
  srandom_r(1, &buf);

  int32_t r;
  random_r (&buf, &r);
  printf("(%d)\n", r);
  return EXIT_SUCCESS;
}

(1) の部分のように、random_data::state に状態へのポインタを設定をしないと (2) の箇所でセグフォして死にます。

ググってみると、10年前の時点で直ってるとか直ってないとかぐだぐだ言ってますがはっきりしません。

https://lists.debian.org/debian-glibc/2006/01/msg00037.html


どうやら正しい使い方はどこにも書いて無さそうなので、正しく使うことは書いた本人以外には不可能な気がします…。


結論として、

  • 仕様、使い方が判然としないし
  • マニュアルに従うと(あろうことか)セグフォする

ので使ってはダメです。

どうすればいいのかはよく分かりません_(:3」∠)_


動作確認環境

  • CentOS release 6.5 (Final)
  • gcc 4.8.2
  • glibc 2.12

*1:単にrandom()へのアクセスをシリアライズするだけじゃダメなのか?

2015-01-21

XtoWに期待

Cygwin/Xの起動方法の変化を調べていて知ったのだけど、cygwinではXtoWという、よりネイティブ環境と密に連携できるWindow Managerが使える。

これを使うには startxtow というコマンドで X を起動すればよい。


プロトタイプらしく実際そういう品質のようで、手元では挙動が不安定、画面の更新が部分的に(秒単位で)遅れる、頻繁にスタックする(キーボード,マウス入力だけ死んでる雰囲気)等の問題が発生する…。


ただしデフォルトのXでは表示できないような、リモートのlinux上で動く GLFW のデモが表示できたりするので今後に期待出来そう。

ヒトバシラーの人は一度起動してみてはどうでしょうか。


参考

2015-01-20

cygwinのX serverの使い方が変わった

2015/1/20現在、

これまで startxwin で使えていた、cygwinをXサーバにする方法が変更されて使えなくなった。ログから察するに2014/11/13の更新から。

新しい方法では以下のようにする。

$ run xwin -multiwindow
$ xterm
xterm> xhost +192.168.xxx.xxx

(参考 X does not start after cygwin upgrade)


起動ログ

参考として起動ログ(/var/log/xwin/XWin.0.log)を張っておく。

Welcome to the XWin X Server
Vendor: The Cygwin/X Project
Release: 1.16.3.0
OS: CYGWIN_NT-6.1 user-PC 1.7.33-2(0.280/5/3) 2014-11-13 15:45 i686
OS: Windows 7  [Windows NT 6.1 build 7600] (Win32)
Package: version 1.16.3-1 built 2014-12-30

続きを読む

2015-01-13

smlnjlibをSML#に移植した

あけましておめでとうございます。2015年最初の記事です。今年もよろしくお願いします。


smlnjlibというライブラリ集の一部をSML#(2.0.0)用に移植しました。> smlnjlib#

例によって移植と言ってもsmiファイルをひたすら書いただけなので実装を詳細に把握しているわけではありません。


smlnjlibは SML/NJ の配布物に含まれるライブラリ集で、mltonが一部(ほとんど?)を移植、sml#が一部を取り込んで使用するなどSML界では広く知られています。

このライブラリは以下のライブラリ群から成ります。'X' の付いたライブラリを移植済みです。

ライブラリ移植適当な説明
ControlsXグローバル設定
Doc なんだかよく分からない。テンプレートエンジン??
HashConsXコンストラクタを圧縮表現するテクニックを実装(多分)
HTML HTML3.2(!!)のパーサとプリンタ。要らんでしょ…。
HTML4 HTML4.01のパーサとプリンタ。
INet socketのてきとーなラッパー
JSON JSONパーサ。ストリームパーサとイベントパーサ(?)が使える。
PP X典型的な実装のpretty printer。
Reactive よく分からない。
RegExp X正規表現。文法とバックエンドをfunctorパラメータとして選択出来る。
SExp 最近入ったナゾのS式パーサ。なぜ入れた。
Unix unixパスのユーティリティ。
Util Xこの中で一番便利な小物集。特にmap/setが他のライブラリからよく参照される。
XML 最新版(110.77)で入ったXMLパーサ。なぜ入れた。

移植したライブラリが参照していたため、SML#の提供していないbasisの一部と、njが提供しているunsafeモジュール(の一部)も実装してあります。

これも頭に入れておくと無駄な再実装を避けられる場合があるかも知れません。

ライブラリ実装適当な説明
basis XArray2とpackword
unsafe Xnjに合わせたunsafe array/vector

使い方

ビルドするのに必要なことはトップレベルで make するだけです。

make -f Makefile.smlsharp

使うためには、使いたいライブラリのトップレベルのsmiファイルを_requireして下さい。

個別に指定してもいいですが、トップレベルのファイルを参照しておくと.cmの参照と対応が取りやすいです。

例えば Util の機能を使いたい場合は以下のようになります。

(* hoge.smi *)
_require "Util/smlnj-lib.smi"

(* hoge.sml *)
... IntRedBlackMap.find ...
$ smlsharp -I/path/to/smlnjlib-sharp hoge.sml

Note

  • オリジナルのコードでは where K = K などとしているものはsmlnjによる拡張機能ですので where type K.ord_key =... 等のように書き換えてあります。
  • Util/rand.sml はWord31をWord32に単純に置き換えているだけなので乱数の性質とか怪しいかも知れません

2014-12-10

kitlibをSML/NJとSML#に移植

kitlibというSMLライブラリSML/NJSML#に移植しました*1。 #全く誰も嬉しくないと思いますが(^^;;


kitlibはMLKitという処理系を実装されているElsman先生が作っているSMLライブラリ集です。

元々はMLKitのソースコードと一緒に配布されていましたがライブラリとして切り出したようですね。*2


移植と言っても処理系依存の箇所はほとんど無いので、実際はMakefile(と.cmと.smi)を書いたくらいです。

ライブラリに含まれる機能としては 正規表現、Pickle(シリアライズ/デシリアライズ)、Map(コンテナ)等、ありがちな内容なのでsmlnj-libや他のライブラリが使えるならそちらを使えばいいと思いますが、この手の小回りの効くライブラリはいくつか選択肢にあると安心かも知れません。


注意

SML/NJとSML#はそれぞれ別の個所でpickle(バイナリシリアライザ)のテストに失敗する個所があるのでどれかの処理系が怪しいかも知れません。

あんまり突き詰めたくないのですが、やる気が出たら原因究明しようと思います。

*1:pull requestがスルーされているようなのでもう紹介しちゃいます

*2:他のSMLプロジェクトをガリガリ書いているようなのでそのためでしょう