今月3度目の貢献

今日は仕事でした。
今月いっぱいで退社する後輩が、整理のためたまたま来ていたので、最後にご飯を一緒に食べに行きました。
土曜と言うことを忘れていたため、平日とダイアが異なりました。そんなことに気づかず、飲んでいました。お陰で7010円の貢献をしてしまいました。
運転手さんには少しまけてもらいました。

今年の目標が、今月1ヶ月だけで脆くも崩れてしまった・・・

オブジェクト直列化ストリームプロトコル

Javaでオブジェクトをネットワーク越しに転送したりする時に使用するものに、オブジェクトの直列化があります。これはRMIEJBの呼び出しにも使われている。
今回RMIのトラブルがあり、不具合を解析するためにTCPダンプでデータを取得し、オブジェクト直列化ストリームプロトコルの解析を実施した。
久しぶりにこれを実施したのですが、いつ見てもわかりにくいプロトコルです。
http://java.sun.com/j2se/1.5.0/ja/docs/ja/guide/serialization/spec/protocol.html#10258
整理されていて綺麗なんでしょうが、こっちはマシンではないので、インデントをつけたり並び替えをやって少し見やすくした(つもり)。

stream:
  magic version contents

  magic:
    STREAM_MAGIC

  version:
    STREAM_VERSION

contents:
  content
  contents content

  content:
    object
    blockdata

    blockdata:
      blockdatashort
      blockdatalong

      blockdatashort:
        TC_BLOCKDATA (unsigned byte) (byte)[size]

      blockdatalong:
        TC_BLOCKDATALONG (int) (byte)[size]

object:
  newObject
  newClass
  newArray
  newString
  newEnum
  newClassDesc
  prevObject
  nullReference
  exception
  TC_RESET

newObject:
  TC_OBJECT classDesc newHandle classdata[] // data for each class

  classdata:
    nowrclass                // SC_SERIALIZABLE   & classDescFlag && !(SC_WRITE_METHOD & classDescFlags)
    wrclass objectAnnotation // SC_SERIALIZABLE   & classDescFlag &&   SC_WRITE_METHOD & classDescFlags
    externalContents         // SC_EXTERNALIZABLE & classDescFlag && !(SC_BLOCKDATA    & classDescFlags)
    objectAnnotation         // SC_EXTERNALIZABLE & classDescFlag &&   SC_BLOCKDATA    & classDescFlags

    nowrclass:
      values // fields in order of class descriptor

    wrclass:
      nowrclass

    externalContents: // externalContent written by
      externalContent // writeExternal in PROTOCOL_VERSION_1.
      externalContents externalContent

      externalContent: // Only parseable by readExternal
        (bytes)        // primitive data
        object

    objectAnnotation:
      endBlockData
      contents endBlockData // contents written by writeObject or writeExternal PROTOCOL_VERSION_2.

newClass:
  TC_CLASS classDesc newHandle

newArray:
  TC_ARRAY classDesc newHandle (int) values[size]

newString:
  TC_STRING newHandle (utf)
  TC_LONGSTRING newHandle (long-utf)

newEnum:
  TC_ENUM classDesc newHandle enumConstantName

  enumConstantName:
    (String)object

newClassDesc:
  TC_CLASSDESC className serialVersionUID newHandle classDescInfo
  TC_PROXYCLASSDESC newHandle proxyClassDescInfo

  className:
    (utf)

  classDescInfo:
    classDescFlags fields classAnnotation superClassDesc

    classDescFlags:
      (byte) // Defined in Terminal Symbols and Constants

    fields:
      (short)  fieldDesc[count]

      fieldDesc:
        primitiveDesc
        objectDesc

        primitiveDesc:
          prim_typecode fieldName

          prim_typecode:
            `B'	 // byte
            `C'	 // char
            `D'	 // double
            `F'	 // float
            `I'	 // integer
            `J'	 // long
            `S'	 // short
            `Z'	 // boolean

        objectDesc:
          obj_typecode fieldName className1

          obj_typecode:
            `[`	 // array
            `L'	 // object

          className1:
            (String)object // ThinkPlus USBキ-ボ-ドString containing the field's type, in field descriptor format

        fieldName:
          (utf)

  proxyClassDescInfo:
    (int) proxyInterfaceName[count] classAnnotation
    superClassDesc

    proxyInterfaceName:
      (utf)

  superClassDesc:
    classDesc

  serialVersionUID:
    (long)

  classAnnotation:
    endBlockData
    contents endBlockData // contents written by annotateClass

prevObject:
  TC_REFERENCE (int)handle

nullReference:
  TC_NULL

exception:
  TC_EXCEPTION reset (Throwable)object	  reset

  reset: // The set of known objects is discarded so the objects of the exception do not overlap with the previously sent objects or with objects that may be sent after the exception

values: // The size and types are described by the classDesc for the current object

classDesc:
  newClassDesc
  nullReference
  (ClassDesc)prevObject // an object required to be of type ClassDesc

endBlockData:
  TC_ENDBLOCKDATA

newHandle: // The next number in sequence is assigned to the object being serialized or deserialized

羨ましい人事制度

来年からうちの会社は、人事制度が変わり「ラインマネージャ職」と「プロフェッショナル職」に分かれるらしいです。「ラインマネージャ職」は従来と同
じ、「プロフェッショナル職」は、ラインマネージメントをするのではなく、そのプロフェッショナル性を生かし、会社に貢献しろという職のようです。

優秀な技術者をラインマネージャにすると「だめ」になる - yvsu pron. yas

いや〜羨ましい。うちの会社もこのような制度になればなと思っていました。私が勤めている会社を含め多くが、昇進したら管理が多くなると思っています。給料を上げて欲しいので昇進したいんだけど、技術をやりたい自分との矛盾があるんです。スペシャリストを目指すべきか、ジェネラリストを目指すべきかを考えたこともありました。

プロフェッショナル職でもある程度は部下をつけて仕事をする必要があると思います(一匹狼じゃ、できる仕事が限られるため)。技術と管理が0と1で割り切れるものではないので、プロフェッショナル職でもある程度は管理能力も必要なんでしょうけどね。

うちの会社の場合、人事制度を変えるためには、人事部がハードルの高い面倒な仕事をこなさないといけないと聞いたので相当難しいと思うけど(ちょっとぼかしておく)。