2010年8月3日インスタンスをprintするとなぜ文字列が出てくるの!今日も色々と得ることがありました。復習でハッとしたこともありましたけど、もちろん新しく学んだことも。忘れないうちに今日も書いておこう。到達不能コード(と、条件コンパイル)とSystem.out.println(obj)の話。到達不能コードについて。args){while(false){System.out.println("ここにはたどり着けない");}}}[/java]こういうのが到達不能コード。詳細はJava言語の仕様14.20にある。このサイトとかいいかも。3;}はコンパイルエラーにならないそうな。実際ならないし、これはassertを使うときに便利みたい。いうのも結城さんのJava言語で学ぶリファクタリング入門を読んでて、そこに載ってたから知ったってだけなんですけどね。assert文を条件コンパイルすればクラスファイルが小さくなるらしい。System.out.println(obj)の話。これもリファクタリング学習中にあれ?と思ったことなんですけど。事の発端は以下のコードから。Sampleクラスですとなる。なる・・・と15分くらい悩みましたけど、そう・・・printlnを見てみればいいんですよね。ctrlを押しながらprintlnをクリックして宣言もとへジャンプ。eclipseは便利ですな。}[/java]ふむ、なるほどvalueOfを呼んでるわけだ。}[/java]なるほど、ここでtoStringを呼んでいる。・・・!toStringのオーバーライド前の挙動も見てみましたけど、それは説明だるいので省略。C言語で同じように実装見てみようと思うと凄くだるそう。そもそも普通に理解できるように書かれているのだろうか。後確かprintfとかってバイナリになってるから別にソースを用意しておく必要がありそうな・・。まあ今度やってみよう。追記(2010/08/03)友人に間違いを指摘されたので追記。+演算で結局は同じobj=>String変換が行われる。いうわけで半分あってました。2010年6月29日mallocが余分に確保する理由(未解決)本日のテーマはmallocこのmallocを使ったときにメモリが余分に確保される訳だけど、それはなぜ?って話。結論から言うと未解決です。検索してきた方はごめんなさい。無駄という訳でもなかったのでとりあえず書くだけ書いてみる。本題に入る前に予備知識とか。Cで型や変数のサイズを調べたい時はsizeofを使うけど、mallocで確保したサイズを知りたい時にsizeofは使えない。正しくは以下のようにmalloc.hをインクルードしてmalloc_usable_sizeを使う。0;}[/c]次にアラインメントの話。これは書くと長くなるので他に任せる。ようするに高速化とかのために多少空白ができてしまっても決められた境界に値を置くようにするということ。上記のプログラムを実行したらメモリはいくつ確保される訳!自分の予想ではそのままの値、つまりsizeof(s1)が\0を入れて6文字なので6バイト確保される。アラインメントを意識して8バイトとかなのではないかと。所が64bit環境で実行したところ、24という結果に。確かに2の倍数ではある。多く取りすぎじゃない・・・!?今度はs1を”0123456789012345678901234′′、\0を入れて25文字にして実行したところ今度は40どうやら24,40,56と増えていく模様。いや16ずつ増えるのはわかったよ。アラインメントは16バイトなんだろう。初めの24って何よ!8バイト余計なのは何なの!ちなみに32bit環境で実行すると12,20,28,36と増える模様。気になったのでこういうのに詳しい後輩にアドバイス貰ったり、色々調べました。結果として得られたことは以下の通り。doubleを意識しているため。メモリにはChunkという機構があるけど、このChunkをmallocしたときにn個使う(確保する)だから16or8Byteずつ増えていく。(未解決)64bit環境で初めに24Byte確保する。16ByteはChunkだとして残りの余計な8ByteはChunkの管理情報という具合。結局2日くらいかけて調べたけれど完全解決に至らなくて悔しい。その余計な8Byte(32bitだと4Byte)は本当に管理情報なのだろうか・・・。Linuxのmalloc解説。ここ結構凄いかもです。http://www.valinux.co.jp/contents/tech/techlib/eos/malloc/malloc_001.html追記(2010/06/28)俺の友人の中で1,2を争う天才に助け舟を出してみて以下のことが分かったのでmemo。そもそもmalloc_usable_sizeは標準関数じゃない。調べてもいまいち分からないし、malloc_usable_sizeが返す値は怪しい。mallocの実装によるけどK&R本なんかの例では線形リストっぽい管理の仕方をしている。ああ、いまいち有益な情報になってない。・・・というか検索してもあんまり的確な情報が出てこないってのはどうでもいいことなのかもしれない。・・・または単に俺の検索能力が低いだけか。binding)自分は物凄く忘れっぽい。今日から技術的なことも恥ずかしがらずにどんどん書いていこう。僅かではあるけれど情報発信にもなるし無益ということはないだろうし。dispatching動的束縛とか動的結合とも言われるみたい。・・・というか調べても全然日本語サイトがヒットしなくて涙目。「どのメソッドが実行されるかは実行時でないと分からない、ってなんだっけ?」という話。ポリモーフィズムの話。ちなみに以下のサイトも参考になるので、俺のとこより良いかもしれません。http://d.hatena.ne.jp/m383m/20080129/1201611382ちょっと違うけどキャスト回りについて詳しいhttp://www.kab-studio.biz/Programing/OOPinJava/08/03.htmlまず例として以下のコードがあるとする。}}[/java]Superクラスを継承してメソッドをオーバーライドしている。}}[/java]上記のクラスを使用するためのMainクラス。型としてはSuperだが実体はSubなのでmainメソッドは”Sub”を出力する。今日の本題はここから・・・!上記のそれを動的束縛だとか言うけど、正直どこら辺が動的なの?普通にコンパイル前でもどのメソッドが実行されるかわかるじゃん。Super()は変数も実体もSuperなので当然、オーバーライド前のメソッドが実行されます。(”Super”と出力される)流石にこれだけ書けば忘れないだろう。2010年6月23日ようやく終了6月14日にようやく就職活動終了しました。社員数2000-3000名の中堅~大企業です。子会社なので大手ではないですけど。メーカー系SIerなので福利厚生だとか給与は悪くなさそうです。良いともいえないようですけど。無事、終わってよかったです。一時はどうなることかと思いましたけど、続けていれば決まるものですね。採用してくれたこの会社のためにも、俺のためにも誠心誠意、勤めを果たしたいと思います。職種の面では35までにPMとして成長。技術面では40までにDBとコード保守で社内1。APは現状で午前650、午後500くらいの力はあるのでたぶん入社前に2か月勉強すれば取れる。Silverを取るとなると・・・どうなんだろうか。DB系はまあ良いとしてもNWがやる気の面でも、現状の知識量の面でも、覚えることの多さの面でもゲンナリ。35でPMはまあありえるかもしれない。40で社内一の技術者ってのはどうなることやら。いうのもどうやら俺の内々定先は職種としてスペシャリストが用意されているみたいだから。PM路線に行ったとしたら、まあ普通に考えてDBのスペシャリストにはかなわないっていう。曖昧な点もありますけど、ソフトウェア開発プロセスとDBを武器にしていきたいです。さあ、気持ちを切り替えて研究頑張ろう。面接と説明会で1日潰れました。午前中の面接は微妙な出来でした。納得行かなかった点が1つあったので今日はその話。初めに自己PRをして、その話の流れで過去に~~~や~~~の開発を行いましたって言ったわけですよ。もって志望動機は勿論「開発がしたい」と言ったわけではなく、~~~に貢献したいって言いました。「あおかびさんはよく開発という言葉を使ってらっしゃいますが、当社では開発はやってないんですよ。パートナーさんに頼むので。その点はご理解頂いていますでしょうか?」いや、まあただの確認だろうし大したことじゃないですけど。話の流れから俺の言ってる開発=コーディングだけ、じゃないことは分かるでしょう。上手くとはいかずともちゃんと要件定義も設計もテストも行いましたよ。それら一連のソフトウェア、システム作りを”開発”と言っちゃまずいんでしょうか・・・。工事までやってるじゃないですか。うーむ、納得いかねえ。次からは気をつけよう。これだけやって決まらないと自分は社会にとって不要なのではないかと思えてくる。最終面接まで行ける様にはなってきたので、諦めてはいけない。