コグノスケ


2013年 6月 8日

エンジニア川柳

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

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

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

編集者: すずき(更新: 2014年 3月 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年 6月 16日 01:46)

コメント一覧

  • IKeJI 
    CからJavaへ移植するために元がunsignedで困る事は良くありますね。

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

    http://ref.xaio.jp/ruby/classes/string/unpack 
    (2013年06月18日 02:04:15)
  • すずき 
    >よしだあさん
    Rubyはバイナリの扱いもさることながら、整数の桁数が実質無制限なので、負数の扱いについて、CやJavaと違う処理が必要になりそうです。
    文句言う前に考えろって話ですけど、それなりに面倒くさいんです…。 
    (2013年06月19日 00:28:14)
  • よしだぁ 
    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月20日 12:49:51)
  • すずき 
    >よしだあさん
    なんと、こんなことできるんですか。さすがRuby…できる子。 
    (2013年06月21日 13:16:58)
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年 6月 21日 15:06)

コメント一覧

  • IKeJI 
    前の記事のコメントはそういう事をやるクラスを作ったらいいんじゃないか、と思ったんです。
    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月24日 15:09:03)
  • すずき 
    >IKeJIさん
    今は整数をラップしたUInt, SIntクラスと、DataInputStreamクラスに似せたBitStreamクラスを作って、
    UInt hoge1 = str.getU32(1);
    UInt hoge2 = str.getU32(3);
    みたいに読めるようにしています。
    ご指摘のとおり、数値側のクラスをもっと強力にした方が良さそうですね。

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

    Scalaにkotlin、ご紹介ありがとうございます。世の中、面白い言語がいっぱいありますね。 
    (2013年06月25日 08:10:17)
open/close この記事にコメントする



こんてんつ

open/close wiki
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 過去日記について

その他の情報

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