コグノスケ


2013年6月8日

エンジニア川柳

部下のやる気を「完全に抹殺」する管理職様の心得を川柳にしてみた。

優先度放棄
お客様の 要望全部 最優先
無理な期日
早くやれ どうしてできない 言ってみろ!
恐怖政治
まず怒鳴り 机を叩いて 物を投げ
丸投げ
やっといて あとはよろしく ねえ?できた?
無計画
明日を見ろ 一年後なんか 知らねえよ

メモ: 技術系?の話(なのかな…これ)はFacebookから転記しておくことにした。

編集者:すずき(2014/03/16 23:55)

コメント一覧

  • コメントはありません。
open/close この記事にコメントする



2013年6月13日

世の中にありそうでない言語

最近、自習を兼ねて、バイナリ解析するアプリを書いていますが、言語が備えていると(私が)嬉しい3つの条件があります。

個別にみると珍しくない条件で、3つの条件を満たす言語もこの世に既にありそうですが、今のところ「コレだ!」というものが見つからず、気分がモヤモヤしています。

3つの条件

  • 整数型が存在すること。unsigned型が存在すると嬉しい。
  • ガベージコレクションが存在すること。
  • 最低限LinuxとWindowsで動かせること。各種コンテナや、GUIライブラリが揃っているとなお嬉しい。

今までの選択

初めはCで書いていましたが、条件2と条件3がない辛さに耐えられなくなりました。リストや連想配列の再発明は、それはそれで楽しいけれど、やりたいこととは関係ないんです。

次はC++ with Boehm GCで書きましたが、条件3に躓いたときGTKにぶち当たって挫けました。決して悪いライブラリではないのですが…。

今はJavaで書いていて概ね良好ですが、条件1のunsigned型がないため細々した部分で面倒くさいです。

これからの選択

一番条件が合うのはVisual C# .NETでしょうか。条件3のLinuxサポートが微妙か?Monoの気分次第ですね。変わり種としてD言語も条件合いそうですが、使う気があまり起きません…なぜでしょう。

スクリプト言語の手軽さには心惹かれていて、ぜひ使いたいところですが、RubyやPythonはやはり条件1が満たせません。Javaと同様でunsignedがないのです。

ブラウザベースのJavaScriptや、ゲーム界で大人気のLuaも心惹かれていますが、どうも整数値という概念がなく、全て浮動小数点として扱われるようで、演算、特に除算とビットフィールドの扱いが面倒くさそうです。

時代の流れ的に整数型ってなくなる方向みたいですし、今後に期待しても望みは薄いかもしれません。うむむ…困ったね。

編集者:すずき(2013/06/16 01:46)

コメント一覧

  • IKeJIさん(2013/06/16 07:19)
    CからJavaへ移植するために元がunsignedで困る事は良くありますね。

    バイナリ解析用途だと時前でbyte[]を使って実装するのはどうでしょうか?
  • すずきさん(2013/06/16 09:01)
    >IKeJIさん
    そうですよね、どちらかというとunsignedは使われると他言語移植の時に困る代物になっていますね。
    byte[]のまま処理するというのはおもいつかなかったです。今はbyte[]で読んできて全部64bit整数に変換して凌いでます。
  • よしだあさん(2013/06/18 02:04)
    Ruby使いですがバイナリも意外といけるよ。いっしょにRubyやろうぜ!笑

    http://ref.xaio.jp/ruby/classes/string/unpack
  • すずきさん(2013/06/19 00:28)
    >よしだあさん
    Rubyはバイナリの扱いもさることながら、整数の桁数が実質無制限なので、負数の扱いについて、CやJavaと違う処理が必要になりそうです。
    文句言う前に考えろって話ですけど、それなりに面倒くさいんです…。
  • よしだぁさん(2013/06/20 12:49)
    binstr = "\001\002\003\004\377\376\375\374"
    # unsigned
    binstr.unpack("I*") => [67305985, 4244504319]
    # signed
    binstr.unpack("i*") => [67305985, -50462977]

    取得にかんしては、こんな組込み関数があるけどね。内部表現としても 32bit とか 64bit とか、ということになると Ruby は不向きかもなぁ。

    http://moko.cry.jp:3232/~keiji/ruby-manual-1.8-20050214/pack_A5_C6_A5_F3_A5_D7_A5_EC_A1_BC_A5_C8_CA_B8_BB_FA_CE_F3.html
  • すずきさん(2013/06/21 13:16)
    >よしだあさん
    なんと、こんなことできるんですか。さすがRuby…できる子。
open/close この記事にコメントする



2013年6月21日

世の中にありそうでない言語2

せっかく年休を取ったのに、雨、というか台風来てるし…。

前回(2013年6月13日の日記参照)こんなこといいな、できたらいいな、とウダウダ書きましたが、結局何がしたいのか?を考えてみました。

条件2(ガベージコレクション)と3(標準ライブラリ、GUIライブラリ)についてはalloc/freeは面倒くさい、車輪の再発明は面倒くさい、という普遍的な悩みですから特筆することはないでしょう。引っかかるのは条件1(unsigned型の存在)です。

条件1がなくて困るのは「バイト列のMSB側からNビット取ってきて、数値として返す」処理(※)が返すべき数値が、signedだったり、unsignedだったりして扱いが面倒くさいことです。

例を挙げると、あるバイト列から3ビット取ってきて3'b101というビット列が得られたとします。得られたビット列を5と解釈すべき場合と、符号拡張して -3と解釈すべき場合があるということです。

(※)MPEGの仕様書なんかでgetbits() という関数が出てきますが、まさにアレです。

符号拡張が悩み?

単にNビット整数値の符号拡張をしたいだけであれば、下記のようにすればunsigned型なんて要りません。

符号拡張in C言語

/**
 * Sign extension.
 * 
 * @param v Value
 * @param n Bits of v
 * @param s 0: don't sign extension, 
 *          otherwise: do sign extension
 */
long long signext(long long v, int n, int s) {
    long long sb, mb;

    if (n == 0) {
        return 0;
    }

    sb = 1LL << (n - 1);
    mb = (-1LL << (n - 1)) << 1;
    v &= ~mb;
    if (s && (v & sb)) {
        v = mb + v;
    }
    
    return v;
}

さらに言えばRubyのように無限長整数を扱える言語の方がオーバーフローを考えなくて良いという点で有利である、とすら言えるでしょう。

あれだけ長々書いたくせに自己解決しちゃったよ、非常に迷惑だね!
でも、なんだろうこのコレジャナイ感は…?

編集者:すずき(2013/06/21 15:06)

コメント一覧

  • IKeJIさん(2013/06/24 15:09)
    前の記事のコメントはそういう事をやるクラスを作ったらいいんじゃないか、と思ったんです。
    class SignedFixedInteger {
     SignedInteger(byte[] val, int size);
     SignedInteger toOtherSize(int size);
     SignedInteger operator+(SignedInteger s);
     SignedInteger operator+(long long s);
     // other operators.

    Javaだと、演算子オーバーロードがないので、Scalaとか?
    最近の自分のマイブームはkotlinです。

    こういう用途の場合、暗黙にmodされて欲しいという事はないんでしょうか?
  • すずきさん(2013/06/25 08:10)
    >IKeJIさん
    今は整数をラップしたUInt, SIntクラスと、DataInputStreamクラスに似せたBitStreamクラスを作って、
    UInt hoge1 = str.getU32(1);
    UInt hoge2 = str.getU32(3);
    みたいに読めるようにしています。
    ご指摘のとおり、数値側のクラスをもっと強力にした方が良さそうですね。

    暗黙のmodはあったほうが嬉しいです。用途によっては、逆に丸められると困る(オーバーフロー、アンダーフロー検知が必要な)場合もあるかもしれません。今はバイナリ読んで解析のパターンしかやっていないので、どちらもあまり必要としていませんが…。

    Scalaにkotlin、ご紹介ありがとうございます。世の中、面白い言語がいっぱいありますね。
open/close この記事にコメントする



こんてんつ

open/close wiki
open/close Linux JM
open/close Java API

過去の日記

open/close 2002年
open/close 2003年
open/close 2004年
open/close 2005年
open/close 2006年
open/close 2007年
open/close 2008年
open/close 2009年
open/close 2010年
open/close 2011年
open/close 2012年
open/close 2013年
open/close 2014年
open/close 2015年
open/close 2016年
open/close 2017年
open/close 2018年
open/close 2019年
open/close 2020年
open/close 2021年
open/close 2022年
open/close 2023年
open/close 2024年
open/close 過去日記について

その他の情報

open/close アクセス統計
open/close サーバ一覧
open/close サイトの情報