いけむランド

はてダからやってきました

新・unable to remap が rebase で解決しなかった時の話

近頃のパッケージツリーでは setup.exe で新しい lib*.dll がインストールされると、ほぼ確実に autorebase が postinstall で動いてしまい、どの都度 unable to remap 地獄に突入することになる。

 

前回 offset がぶっ壊れた DLL を再インストールして、丁度良い offset を探せば良いと書いたが、どうも rebase 再実行はしなくても動くっぽいことがわかった。

 

 というわけで unable to remap が発生したら

  • libgcc1
  • libiconv2
  • libncursesw10
  • libreadline7

を再インストールしてやれば少なくともシェル起動まではいけるはずなので、あとは必要に応じて、怒られる DLL を再インストールしてやれば、普通に使えるようにはなるはずである。

phozzil (1)

探してみたら IO_Bit というのもありました。

string をがっつり渡して、integer などに変換するインタフェースっぽい。resource から string にするまでは関与しないということらしい。


以下、これらを踏まえてのインタフェースについての考察を述べてみる。

string ≒ byte[] ?

PHP は基本的に resource からの入出力データインタフェースが string である。そのため、バイナリデータを扱うためには string に対して pack / unpackord を使うのが定石っぽい。

PHP の文字列は言語仕様を見ると Java における byte[] に近い *1 とは言え、ストリームからのデータが string を経由することを利用者が意識しないといけないのはあんまりスマートじゃない気がするため、resource を渡したオブジェクトから直接 readXXX したら、その型のデータで得られるインタフェースが望ましいのではないかと思っている。(つまり java.io っぽいやつ)

エンディアン

バイナリデータを扱う場合に出てくるもう一つの問題がエンディアンで、これもライブラリによっていろいろ扱いが異なっている。

java.io ではビッグエンディアン決め打ちになっているし、上述の IO_Bit や php-reader では read メソッドの末尾に LE/BE という suffix があり、呼び出し毎に利用者が指定するようになっている。

せっかく LE/BE があるのはありがたいとは思うけど、逆にストリームの中で頻繁にエンディアンが変わる場合があるのかも気になる。コンストラクタでデフォルトのエンディアンを指定しておけばいいのではないかと感じる。

phozzil (0)

そろそろなんかちゃんとしたコードを公開しないとプログラマとして淘汰されるなあと強迫観念みたいなものを感じてる今日この頃です。


ここ一年くらい業務でログ集計系のコードを書くことが多く、その際に毎回、ログをパーズするためのプリミティブなファイルシステム関数の一連のコードをおまじないのようにコピペすることに抵抗があったため、java.io みたいなクラス群にまとめられないかなと思った。

既にこの要求を満たすものがあれば、それを使えばいいわけであるため、調べてみると当然ながら既に同じようなことを考えている人はいた。


前者はまさに java.io のインタフェースに沿っているなあという印象で、後者はバイナリデータ周りの実装がきちんと整っている。ただし、いずれも名前空間を使っていない。

とりあえずこの 2 つのいいとこどりをしたものを書いてみるというところから始めてみることにしてみようと思う。


ちなみに repo はつくってあるけど、中身はまだない。

CAMP とかいうネタを考えてみた

PHP Apocalypse という勉強会に参加した時に以下のネタを見て、CAMP (Cygwin+Apache+MySQL+PHP) というのがあってもいいんじゃないかと思ったのでやってみた。


続きを読む

PHP でパッケージプライベートを実現してみる

他にも何とでもやりようはありそうだけど、とりあえず思いついた方法で実装してみた。

ちなみにここでパッケージプライベートというのは同じ名前空間からのみアクセスできるという意味で言っている。

参考にしたのは以下の記事である。

続きを読む