くまりゅう日記

もっと過去の日記
[.NET | BeOS | Blender | COLLADA | fossil | mono | monotone | NPR | OpenGL | PeerCastStation | Riko | Ruby | Silverlight | TRPG | XNA | ゲーム | ゲーム作り | プログラム | | 模型]

2016-10-05

日記

洗濯機が壊れた。

日曜に天気がいいので洗濯しようと思ったら洗濯機のボタンが一部効かなくなっていた。 水量選択とよりにもよってスタートボタンだ。 まあ前の週に一部LEDが点かなくなってたりしたのに気付いてたのでさすがにそろそろ買い替えないとなーと思ってたところではあった。 もう13~14年も使ってるはずだし、そもそも2年前に引っ越した時に買い替えるかなーと思いつつ放置しちゃったやつだし。

使ってたのは5kgて書いてあるので通販で調べてみるとそのくらいのは3.5万円前後で買えそう。4.5万円くらいのもあるけど在庫無しだわな。既に壊れて洗濯物が少ないながらも溜まってるのであんまり時間かかるのは困る。在庫ありのやつから選ぼう。 5.5万円出すと乾燥機能付きが買えるようだ。乾燥機能は稀に欲しいけど稀にだなぁ。

ちょっと悩んだが、5.5万円の乾燥機能付きのやつにした。稀にとはいえ欲しい場合があるならあって悪くないし、2万円程度ならそんなにでかい差でもない。2~3年に一回5万じゃ済まないPC買ってるのに10年も使う洗濯機に5.5万円出せないわけもあるまい。 まあそのあと設置と古いやつ回収費用で3500円程取られたんですけど。ポイント付くからとんとんってことで。

日曜の午後に注文したら月曜の朝には設置に来てくれた。はええ。 設置自体はべつに大変なものじゃないのですんなりと。 洗濯物つっこむと勝手に容量計って使う水の量を出してくれたりとか、前のは1時間はかかってた洗濯が35分で終わったりとか、干さずにほっとくとしばらく勝手に攪拌してくれたりとか地味に便利になった。 やっぱたまに買い替えた方がいいかもな。

乾燥機能は5~6時間もかかるようなのでまあそのうちな。使うタイミングがつかめないんだが、夜中仕掛けて寝る感じなんだろうか。

[.NET] monoとかUnixでの動作が違う

最近.NETのmonoとかUnixでの動作の違いにはめられることが度々あったので書いておこう。

Unixでは/hoge/fugaが絶対URIになる

String path_or_uri = "/hoge/fuga";
if (Uri.TriCreate(path_or_uri, UriKind.Absolute, out uri)) {
  //絶対URIだったわ
}
else {
  //パス(相対URI)だったわ
}

とかいうようなコード書いてたんですよ。 もちろん実際のコードではpath_or_uriは動的に変わる感じで。

これWindowsではちゃんと動くんだけど、monoでOSXとかLinuxで動かすと/hoge/fugaが絶対URI扱いになってしまう。 そんなばかなと思ったらfile:///hoge/fugaに展開されてやんの。おいふざけんなよ、おい。

monoのクソ野郎め……と思ってソース確認しに行ったら、monoではもう.NETのUriクラスを使うようになっていて、.NETの時点でUnixでは/hoge/fugaはファイルなーって対策が入ってた。おーい……。

Windowsでは\hoge\fugaみたいなのをfile:///hoge/fugaにするらしく、その延長線でUnixでは/hoge/fugaがローカルファイルのURLだということにするようだ。いやそれ困るでしょ普通に。

仕方ないので逆に、相対URIとして作れるかどうかを先に判定するようにして解決した。URIは一般的なプログラマが処理できるようなものじゃないからUriクラス使ってるのにそれですら嵌められるなんて、本当にURIは地獄だ……。

LinuxでTCPソケットに対してReuseAddress使うと落ちる

これはmonoだけなんだが、mono 4.6でTCPソケットに対してReuseAddressをtrueに設定するとInvalidOperationExceptionだかなんだかで落ちるようになってしまった。

いろいろ調べたところ、WindowsでのReuseAddressは他のOSではSO_REUSEADDR+SO_REUSEPORTに相当するらしく、それをエミュレートするためにWindows以外ではSO_REUSEADDRとSO_REUSEPORTの両方を設定しようとする。一方でLinux 3.9未満ではSO_REUSEPORTが無いんだかUDP以外では使えないんだかで、LinuxではUDP以外にReuseAddressを設定しようとするとエラーにしてるっぽい。なんだか変な気の効かせ方だな。

しかし落ちた時にでもすぐに同じアドレス/ポートに再バインドしたいだけのためにReuseAddressを設定してるのでSO_REUSEADDRはいらないし、いらないものを設定しようとしてエラーになるのはとても困るぞ……。

しかしmonoのソースをどんどん追い掛けていったところ、monoではソケット作っただけで自動的のSO_REUSEADDRが1に設定されるっぽい。Windows以外では明示的にReuseAddressを設定する必要は無さそうか? Windowsでは標準で他のOSで言うSO_REUSEADDRが設定されてるのと近い動きをするから標準で設定してるっぽいとのことだけど本当か……?まあどっちにしろWindowsではReuseAddress設定しないと落ちたあとで同じポートにバインドさせてもらえないんだけど。

仕方ないので、Windowsの時だけReuseAddressを設定するようにした。なんか変なエミュレートやめてほしいけど、何よりやめてほしいのはWindowsの変な動きだよな……。

NamedPipeが使い物にならない

これはまあ別に最近使ったわけでもないし.NETだからってわけでもないんだが、前から気になっていたのでついでで。

NamedPipeてのがWindowsでもそれ以外でも使えて実際名前付きパイプとして扱われるんだが……。

困ったことにWindowsとUnixの名前付きパイプは全く機能が違っているので、同じクラスで実装されても全く使えないのであった。

Unixの名前付きパイプは文字通りパイプに名前をつけたやつなんだが、Windowsの名前付きパイプはソケットとして使えないUnixドメインソケットのWindows版だった。それらが同じクラスで実装されてるので、Unixに持っていったらインターフェースが同じで使い方が全く違う謎の物になる。いやいや、そこはむしろUnixドメインソケットでエミュレートしてくれよ……。

解決方法は特に無いのでUnixはMono.PosixのUnixドメインソケット使うように実装分けるしかないんじゃないですかね。IPCに使いたいんだが。


ページのトップへ | トップ «前の日記(2016-09-27) 最新 次の日記(2016-10-25)» | 編集 | kumaryu.net by kumaryu