Zoneばかりを触っていて、Linux系コンテナから離れていたのですが最近、systemd-nspawnなるものを知ってしまい、どんなものかと触ってみた。今日は結構荒れてたナガヤで買った170円のゴマサバで戦ってきたが、ウツボオンパレードで、たまんない。不甲斐なさにちょっと「マジで釣りをやってやろうか」って感じになってきた。共有この投稿へのリンク2016年7月9日土曜日filelockをSolarisへSolarisにfilelockライブラリを移植するで、何でこうなったかですが、もともとhaskellのfilelockパッケージがflock関数を内部で利用していたことが事の発端で、Solaris上でbuildするとエラーになる。Falseを返す仕組みになっています。ここを、Solarisで動かしたいって言うことです。Show)この定義だけでは使えませんので、Storableクラスのインスタンスに登録する、こうすることでghcがCFlock型とflock構造体を相互に変換することが可能になります。False」の場合に「F_RDLCK」で呼ばれるので、openFd関数のOpenModeを「WriteRead」にする必要があること(処理を排他するためならちょっと微妙に感じるけど...)。CInt補足fcntl関数のプロトタイプ宣言を見ると引数が可変長引数になっています。);可変長引数をhaskellで表現するのは難しいと思ったので、第3引数がflock構造体を取得する関数に固定化して作ってあります。上手いやり方が見つかりませんでした、方法があったら教えてください。Interface)といってhaskellのコードから通常のCの関数を呼び出す仕組みになっているため、ちょっと変換が必要。LOCK_NB}とかが展開されてghciとかでloadできるようになるよ。System.Posix.Files>こういうのもありです。共有この投稿へのリンク2016年7月5日火曜日で、fcntl関数あの時のflock関数からfcntl関数へflock関数が使われているコードをSolarisにそのまま移植する場合は「fcntl関数」を使うようになる。Posix的にはfcntl関数が推奨されているのでこれからファイルロックを書きたいのならfcntl関数で書く方がいいかもね。controlという関数でファイルディスクリプタへ対していろいろな属性や制御を設定できる関数、今回はファイルのロックに関する利用方法だけに絞って確認しています。詳しい関数の説明はmanページを見てくださいということでサンプルはgithubへ置きましたのでcloneしてmakeしてください。fcntl_rw.cfcntl関数もアドバイザリロックこれはflock関数と同じですfcntl関数をファイルロックで使うfcntl関数とflock関数の大きな違いは、ロック対象のファイルの特定の領域をバイト単位でロックが設定できるところが違います。そのためロック領域を指定するflock構造体が定義されています。flock_t;l_typeメンバにはF_RDLCK(READロック)、F_WRLCK(書込ロック)、F_UNLCK(ロック解除)が指定できます。SEEK_END(ファイルの終わり)で指定可能です。...のような感じになります、これでflock関数と同じになります。flock関数fcntl関数の挙動の違いflock関数は「LOCK_NB」フラグを指定しなければロックの取得ができない時点でブロックしましたがfcntl関数は基本的にブロックしない事が特徴です、この時errnoに「EAGEIN」か「EACCES」(処理系に依存)をセットしますのでその場合は再度呼び出してやる必要があります。Posixで移植性を高めるのに両方のエラーを処理できるように書いた方が望ましいそうです。F_SETLKWを使うディフォルトのflock関数と同じような動作にしたい場合は「F_SETLKW」をfcntl関数の呼び出しで指定する。&region);...「F_SETLKW」フラグはロックが取得できなかった場合、ロックの取得ができるまでブロックするような動きになります、flock関数のディフォルトの動作(「LOCK_NB」を指定しない)と同じになります。fcntl関数とsignalロックの取得ができない場合はfcntl関数呼び出しでブロックするため、「EINTR」(シグナル割込)に備える必要があります。「fcntl_rw」がブロックする状況を作って別ターミナルから「SIGUSR1」シグナルを送ると「EINTR」で戻ります。lock......ちょっとした注意点ファイルのオープンの時に、「O_RDONLY」フラグでオープンした際に。descriptor」を返してくるのでダメな組み合わせで利用しないようにして下さい。当たり前って言えばそのとおりデスが。fcntl関数とNFS勉強不足によって不明、時間がとれたら調べようと思います、すみません。Maxな感じで倒れそうですが、flockで目が覚めた最近です。Solarisでゴニョゴニョやっているとちょいちょいflock関数でハマる、Solarisにはflock関数がない。面倒くさいからいつも逃げていたのですが今回はしっかり理解しようと思って、ちょっと調べてみた。詳しい関数の説明はmanページを見てくださいということでサンプルはgithubへ置きましたのでcloneしてmakeしてください。「ノンブロッキング排他ロック(LOCK_EX|LOCK_NB)」ロックを確認する「共有ロック」を使ったロック方式、シグナルをセットした後、flock関数を呼ぶ出すときに「LOCK_SH」を指定して呼び出す。Lockで書き込みする奴が何もいなければ問題ない。loop.....「排他ロック」のプロセスがロックを取得して実行し出す、その後「共有ロック」なプロセスを複数起動してから...というような感じで交互に別ターミナルから実行すれば動作が掴めると思います。LOCK_NBについてflockで寝てもらいたくない場合に利用するフラグです。flock関数に(LOCK_NB)フラグをor演算子で追加指定して呼び出すと、ロックが取得できなくてもflock関数でブロックせず「EWOULDBLOCK」を返してくる呼び出し方法です。flock関数とsignalflock関数が「EINTR」を返すケースっていうのがあります、これはflock関数が呼び出されてブロックしている間にそのプロセスにシグナルが到着した場合、flock関数が中断されエラーで帰ってくる場合があるので、エラーでも「EINTR」の場合はもう一度呼び出してやる必要があります。..この時のシグナル動作の注意点としては、通常のsignal関数でSIGUSR1をセットしただけでは「EINTR」で帰って来ないと言うことです(Linuxでの動作なのでBSDあたりだと確認とっていませんが...)、と言うことでPosix的なsigaction関数でシグナルをセットする必要があります。flock関数とNFSflock関数はNFS経由で利用した場合はしっかり動かないような処理系があるそうなのでご注意ください、ちなみにSolarisのNFSをLinuxでマウントして同じロック検証(ロックファイルはNFS上に作成)をやって見ましたが問題は起こりませんでした、Linuxのマウント設定とSolarisのNFS設定を確認してみます。insteadなんだよ、そうなっちゃってたの?stackをいれるstackってライブラリのバージョンセットを管理してくれるツール、便利だけど、gentoo-haskell使っている場合はあんまりうまくない。templatesここからyesod-mysqlのテンプレートでalchuプロジェクトのscaffoldを作成する、ghcとかその他のyesodに関係するライブラリがはいっているので追加オプションでその辺を調整する。初回の実行はちょっと時間がかかるよ。develこれで開発サーバーが起動するstackとgentoo-haskellgentoo-haskell使っているとstackを使ってインストールすることはあまりないと思いますが、gentoo-haskellにないライブラリ何かはstackで入れればいいとは思います。hackportでebuild作っても簡単に入れられるので、どちらでもいいとは思いますが。機能的にかぶるので、ややこしい感は有りますが、バージョンセットを決めてくれたり、まえのcabalよりは統合されていて使いやすいですね。ちなみに、~/.stackディレクトリに情報がはいっています。yesod-mysql.hsfiles.etagstackでインストールした場合、この辺に実行プログラムとかがインストールされるようです。stackは非常に便利なので、みんなで使いましょう。"4"ddb.adapterType="ide"ddb.geometry.cylinders="16383"ddb.geometry.heads="16"ddb.geometry.sectors="63"ddb.uuid.image="yyyyyyyy-poko-chin-poko-xxxxxxxxxxxx"ddb.uuid.parent="00000000-0000-0000-0000-000000000000"ddb.uuid.modification="00000000-0000-0000-0000-000000000000"ddb.uuid.parentmodification="00000000-0000-0000-0000-000000000000"centos7のインストール後は普通にVirtualBoxでサーバーのストレージをさっき使ったvmdkを指定するguest側をLVMで作っておけば拡張できるかなと、思いましたが、時間がないので今度にします。zfsに入っているとなにかと便利かも。