私はJavaが  できます。

id:shuji_w6eさんのhttp://d.hatena.ne.jp/shuji_w6e/20110305/1299288660をやらせてもらいました。

==演算子とequalsメソッドの違いは何か?

==演算子は両辺の値を比較する。equalsメソッドは両辺の参照先の値を比較する。


もう少し詳しく説明すると、==演算子は両辺にあるのが値型(intやbooleanなど)なら値そのものを、参照型(StringやObjectなど)なら参照先が同じかどうか(同じオブジェクトかどうか)を判定する。オブジェクトのnullチェックには==演算子が使用される。
それに対してequalsメソッドはオブジェクト(参照型)に対して呼ばれ、その参照先の値が比較される。違うオブジェクトでも、参照先の値が同じなら比較結果は正(true)となる。


文字列の+演算子による連結とStringBuilderを使った連結の違いを説明せよ。文字列の連結は原則として+演算子を使ってはならない理由を説明せよ。

演算子による連結は、連結結果が新しいStringクラスのオブジェクトとして生成される。オブジェクトの生成にはコストがかかるため、頻繁に使用すると処理が重くなる。


StringBuilderを使った連結は、既存のStringBuilderクラスのオブジェクトに対して文字列が連結されるため、余計なオブジェクトが生成されない。よって、パフォーマンスの向上が期待できる。


Listのようにジェネリクス型を使う主たる目的は何か?

  1. コレクション内のオブジェクトの型がある程度保証される。
  2. 値を取り出す際、型のキャストが不要となる。

オブジェクトがガベージコレクションGC)される主たる条件は何か?

どの場所からも参照されなくなったとき。例えば、ある変数に格納されて使用されていたオブジェクトは、その変数にnullが代入されるか、変数自体がスコープ外となったときにGCの対象となる。


チェック例外と非チェック例外の違いを型と例外処理の観点で説明せよ。

チェック例外は、Javaコンパイラによって以下のどちらかの対応を求められる。

  • その例外が発生し得る場所に対して、try〜catch構文で例外処理を行う。
  • メソッドのthrows句に例外クラスを指定し、その例外が呼び出し元に投げられ得ることを明示する。


非チェック例外は、Javaコンパイラによるチェックの対象とはならず、どこからともなくやってくる。


Effective Java 読書会 13 日目 「Java の例外めんどくさい」 - IT戦記


フィールドのアクセス修飾子をprivateにしgetter/setterメソッドを提供する事でフィールドを参照する設計方針を取る主な理由を説明せよ

アクセス修飾子をpublicにすると、そのフィールドを持っているクラスのオブジェクトがさえあれば自由に値の参照および更新が可能となってしまう。フィールドはオブジェクトに結びついているものであり、オブジェクトは基本的にメソッドを使用して操作されるものなので、裏口が開いているような状態となり危険である。


privateにしgetter/setterメソッドを作成することで、一応はフィールドへのアクセスにメソッドを介すので、いくらか安全となる。ただ、普通はgetter/setterメソッドは作成せず、通常のメソッドから正しい文脈でのみフィールドを使用するようにするべきである。


NullPointerExceptionが発生するのは主にどういう状況か?

オブジェクト変数のメソッドを呼び出す際、参照先が登録されていない(== null)という状況で発生する。


オーバーロードとオーバーライドの違いは何か?

オーバーロード

Javaでは、同じクラス内に同じ名前のメソッドを定義できる。その場合、メソッドの引数の型や数が異なっている必要があり、Javaは引数によってどのメソッドを呼ぶか決める。これをオーバーロードという。

オーバーライド

親クラスを継承する際、親が持っているメソッドと同じ名前で同じ引数のメソッドを定義することで、親のメソッドを上書きすることができる。これをオーバーライドという。


コンストラクタとは何か?

オブジェクトを生成する際に使用される、メソッドのようなものである。クラスをnewすると、コンストラクタを通った後、呼び出し元にオブジェクトが返される。

ちなみに、コンストラクタをprivateにすると、通常の方法(new)ではオブジェクトを生成できなくなる。


インターフェイスを利用する目的を1つ説明せよ

変数名にインターフェイスを使用することで、どんな中身でも同じように呼び出せることが保証される。これにより、オブジェクトの実装を容易に変更することが可能となる。



新人への説明を意識して書いてみました。ただ、初心を忘れかけているので、わかりやすいかどうかはなんとも言えません。というか、どうやって学んだか忘れてしまった。本だけでないことは確かだと思うので、おそらく社内研修や都度Webを調べながら身に付けたのかなと。オブジェクト指向まわりはRubyに触れてから理解した部分も大きいと思います。


今後はフェーズ的にJavaで書く機会も減ってくる(はず・・)と思うので、知識を整理できてよかったです。もし間違っていたら是非ともご指摘お願いします。

立場を演じるということ - 俺妹第8話感想

会社のKさん(二児の父)が猛プッシュしていた「俺の妹」TV版を観ました。


「俺の妹がこんなに可愛いわけがない。」


どんなストーリーかというと、冷えきった関係だった妹から、とあるきっかけで「人生相談」を持ちかけられるという話。


http://www.oreimo-anime.com/story/intro.html


その後、彼は今までの分を取り返さんばかりに献身的に世話を焼きます。
そして、ある出来事が起きます。


「俺の妹がこんなに可愛いわけがない。」



※みなさん既にご覧になっているでしょうから余計な心配かもしれませんが、以降の記述で物語・作品・登場人物に関する核心部分が明かされています。注意してください。



妹の書いた小説がアニメ化されることになったのですが、制作会議の席上で、スタッフ達は原作を無視した内容に作り替えようとします。妹はショックで寝込んでしまい、彼が代わりに会議へ参加することになりました。

そこで彼は、アニメ制作スタッフに向けて、熱く語ります。妹がとても傷ついていること、どうか原作通りに作って欲しいこと。最後には土下座までします。


ただ、劇中でも言及されている通り、彼は妹の成功に嫉妬していました。それなのにどうしてこのような自己犠牲の精神を発揮できるのかというと、それは自分が「兄だから」。アニメは詳しくないし、活躍が妬ましいけど、自分は兄という立場だから、こう言うしか無いと。そう言って頭を下げたのです。



この後も彼は一貫して世話を焼き続けるわけですが、このように感情に左右されず、自分の立場にふさわしい行動を選択できるということは、組織で働く上でとても評価される点ではないかと思いました。特に役割分担が厳格化された大企業などでは、彼のような安定感のある人材は重宝されるでしょう。うらやましいですね。



シェルスクリプトで部分文字列を切り出す方法

例:"myokoym(25)"の括弧内の数字だけを取り出したい場合。

1.cutを使う

http://www.k4.dion.ne.jp/~mms/unix/linux_com/cut.html

$ echo "myokoym(25)" | cut -d"(" -f2 | cut -d")" -f1
25

上記は、cutコマンドを区切り文字指定で使用する例です。
「-dオプションで区切り文字を指定し、-fオプションでn番目に区切られている文字列を切り出す」という処理を2回繰り返しています。(nは1から始まる)


2.sedを使う

http://www.k4.dion.ne.jp/~mms/unix/linux_com/sed.html

$ echo "myokoym(25)" | sed -e "s/^.*(\(.*\)).*$/\1/"
25

上記はsedのsコマンドで、文字列の置換を行っています。
文法は、「s/置換前/置換後/」です。

上の例では、正規表現を使って処理しています。おおまかな流れは、

  • 行頭「^」から行末「$」までを置換対象とする。
  • 開き括弧「(」と閉じ括弧「)」で囲まれた文字列「\(.*\)」へ置換する。(「\(」と「\)」で囲むと、\1に格納される)

といった感じです。



どちらを使っても実現可能ですが、わかり易さではcut、柔軟性ではsedが上かと思います。

今年度のマニフェスト

今年はもう少し文系寄りのことも書いていこうと思います。コメント等で気軽に発言してもらえるような雰囲気にしたい。


受託開発の極意―変化はあなたから始まる。現場から学ぶ実践手法 (WEB+DB PRESS plusシリーズ)

受託開発の極意―変化はあなたから始まる。現場から学ぶ実践手法 (WEB+DB PRESS plusシリーズ)

最短で結果が出る超仕事術 (講談社BIZ)

最短で結果が出る超仕事術 (講談社BIZ)

DJCD さよなら絶望放送 携帯盤SZ-01K

DJCD さよなら絶望放送 携帯盤SZ-01K

新人SEが出社までに読んでおくべき3冊+97


1.なれる!SE

なれる!SE 2週間でわかる?SE入門 (電撃文庫)

なれる!SE 2週間でわかる?SE入門 (電撃文庫)

固定電話の転送方法が学べる一冊。



2.なれる!SE2

なれる!SE (2) 基礎から学ぶ?運用構築 (電撃文庫)

なれる!SE (2) 基礎から学ぶ?運用構築 (電撃文庫)

飲み会幹事の極意が学べる一冊。



3.なれる!SE3

なれる!SE (3) 失敗しない?提案活動 (電撃文庫)

なれる!SE (3) 失敗しない?提案活動 (電撃文庫)

会話を円滑に進めるためのツッコミ手法が学べる一冊。



97.きのこ(緑)

ソフトウェアアーキテクトが知るべき97のこと

ソフトウェアアーキテクトが知るべき97のこと

どうせみんな上流工程やるんでしょう?

viでシェルの「$変数名」を「${変数名}」に一括置換するexコマンド

シェルスクリプトで変数を扱うときは、「変数名=値」で宣言して「$変数名」で使用しますが、「${変数名}」のように波括弧で囲うのが推奨らしいです。ただ、打つのが面倒なので、あと付けてみました。


viのコマンドモードで以下の破壊的コマンドを入力します。

:%s/\$\([a-zA-Z_]\+\)/${\1}/g

まる括弧内は適宜修正してください。


viの正規表現では^とか$以外はメタ文字として扱うためにエスケープが必要なのを忘れていてはまっってった。自分でブログに書いたきがするんだけど。


■参考
http://www.k4.dion.ne.jp/~mms/unix/shellscript/shell_para.html

gemを一括インストールするスクリプト

Rubygemsを再インストールした場合などに。時間がかかって仕方がないのでドキュメント(riとRDoc)はスキップしてますが、お急ぎでなければ" --no-ri --no-rdoc"を消してください。

GEM_INSTALL_CMD = "sudo gem install %s --no-ri --no-rdoc"
INSTALL_GEMS = ["haml",
                "heroku",
        "rails -v=3.0.3",
                "rspec -v=2.4.0",
                "shotgun",
                "sinatra"]

INSTALL_GEMS.each do |gem|
  %x[#{sprintf(GEM_INSTALL_CMD, gem)}]
end

INSTALL_GEMSにインストールしたいgemを指定して、

$ sudo ruby gem_install_script.rb

のように動かします。


Linuxで動作確認してますが、WindowsでもGEM_INSTALL_CMDの先頭の"sudo "を消せば動くと思います。