My memonote about Java programming

I'm Japanese studying Java programming in Sweden. I write for myself about what I have learned today here, but I would be happy if this blog also helps someone else.

研修中

学校もあと数ヶ月で終わり。5月に修了予定です。授業の一部として、現在インターンとして研修中です。実は今働いてるところは2社目。最初の会社はみんな親切でとても良かったんだけど、同じ学校から研修に来た子と働くのがストレスになってチェンジしました。仕事内容があまり興味のある内容では無かったのもあります。

普段風邪をあまりひかないのに、あの頃はストレス→免疫力が下がる→病気になる、の繰り返しでした。ストレスの原因は色々だけど、多分一番の原因は、その同じ学校の子に頼られ過ぎて、私の負担があまりにも大きくなってしまった事だと思います。そのくせその子は負けず嫌い・・・。例えば、何度教えても同じ間違いを繰り返して、その尻拭いをするのがいつも私の役目になってしまっていました。間違える事は仕方が無いけど、間違えた後に自分の力で直して欲しかった。それから、何かが自分の思い通りに動かなかった時、特に間違いは無いのに彼女が間違いだと勘違いをして、私のせいにしてくる事(しかもみんなに言いふらす)や、これがこうだからこうなったんだという思い込みが激しく、だったらこうするしかないという根拠の無いおかしな解決策を得意げに指示してくる事や(反論するとムキになる)、文化の違いなのか(彼女はペルー人)、パーソナルスペースという感覚が無いらしく、質問がある時は突いてくる(結構痛い)、ほとんど私がやったのに、上司の前では自分の手柄みたいな態度を取る事なども嫌でした・・・と、書き始めたら結構出て来てびっくり。とにかく、この人と一緒には働けない、特に2人きりのチームでは絶対に無理!と強く思ったのです。

ストレスをどうにかしなきゃと、色々やったけど無理でした。私の負担が大きくなるのは、彼女にわからない事があるからなんだし、前もってやり方を説明しておけば良いんだと気付いたので、ウィキとか作って、もしこういう事があったら、ここにやり方書いといたよって言ったのに、いざその時がきたら結局質問してきました。ウィキを見ようともせずに・・・。彼女のプライドを傷つけないために、ミーティングという名の勉強会も毎日のようにやって、そっちは少しは効果があったけど、結局ストレスは溜まっていました。あー、もう本当に、質問された時に、彼女が問題を解決するその工程を、いちいち私が見守らなければならない事が耐えられなかった。だって自分のディスプレイに視線を戻すと、「こっち見て!」って突きながら言ってくるので、彼女が問題を解決するまで私の勉強する時間が削られるわけで・・・。無駄に時間が過ぎていく、あの感じ・・・耐えられないよー!私って結構我慢強いし、チームの誰かがつまずいた時に、一緒に解決策探したりする方だと思うよ。でもこのレベルはちょっと・・・。

でもあの会社も会社だよ。本当なら、教育係は会社が準備するべきなのにさ。でも人手が足りて無かったみたい。あそこで研修続けてたらそのまま就職できたっぽいし、チャンスを逃した感もちょっとあるけど、健康には変えられない。

今研修してる会社はうちの旦那さんのお友達の会社で、会社を手伝うというより、ほぼ自分だけで好きなプロジェクトをやってるだけなので、会社で他のチームメイトと一緒に働くということはあまり学べないんだけど、プログラミングの勉強としては文句なしです。

チームで働くといえば、前に学校でスクラムの勉強した時にやった、BDD(behavior driven development)が好きです。ユーザーストーリーがビヘイビア駆動開発の方式で書かれてるの。この方法なら何を作ったら良いのかわかりやすいので、勘違いを防げるし、誰もが同じ認識を共有する事ができると思います。

 

QueryでBETWEEN startDate AND endDate等をする時に気をつける事

デバッグしたら、SimpleDateFormatで、StringからDateにフォーマットを変更する時に、時間まで入力しないとデフォルト時間が00:00:00になるので、例えばQueryで、SELECT ... BETWEEN startDate AND endDateなどをする時に、endDateの日のデータがきちんとSELECTできない事に気付きました。

 

String endDate = "2016-02-20";
Date endDateInDateFormat = new SimpleDateFormat("yyyy-MM-dd").parse(endDate);

 

上の様にすると、endDateInDateFormatは、2016-02-20 00:00:00、となってしまいます。ということは、2016-02-20の夜中の零時0分01秒以降はQueryのendDateに含まれないという事です。つまり2月20日の昼間のデータも、夕方のデータもSELECTされないってことで、それは問題です。なので、以下ように、時間部分をendDateに付け足しました。

Method findFinishedWorkItemsBetweenStartDateAndEnd ...

 

Main method

 

これで2月20日、23時59分59秒までのデータがSELECTされます。

EGitでのMerge Conflictの解決方法

EGitでMerge Conflictになった時、コードを直してもConflictあるよって言われてCommitできないので、今まで自己流でResetでConflictのマークを消してたけど、どうやら間違ってたみたいです。

 

正しい方法は、EGitのマニュアルに書いてあったので(つまづいた時にまず最初に見るべきでした・・・)、次にMerge Conflictになったら試してみようと思います。

EGit/User Guide - Eclipsepedia

EGitの使い方 セットアップ編

この前Jfokusというカンファレンスに参加して、Woody Zuillさんによる、Mob programmingについてのお話を聞いてきました。Mob programmingとは、簡単に言うと、みんなで一緒にひとつの画面を見ながら同じ部屋でプログラミングするというものです。同時に行われてる講義がいくつかあったのだけれど、私が絶対に無理!って思うこの講義を選んでしまいました。自分の苦手な事なので、一体どうやったらうまくいくのか興味がわいたんです。

 

最初は私たちのグループも、Mob programmingのスタイルでやってました。他の方法を知らなかったから・・・。でもプログラミングする前に議論ばかりになって全くはかどらない!1週間のうちに全てを終わらせて提出しなければならないのに、1日でmodelクラスひとつしか仕上がらなかった。Woody Zuillさんは、Mob programmingの方がはかどるって言ってたけど、それができるのはきっと、メンバー全員がお互いの意見を尊重できる人たちで、ある程度十分な知識を持っているからだと思う。それに彼らにはどうやらルールがあって、同時に複数の人から意見が出た場合、新人が思いついた方法から試して、うまくいったらそれを使うんだそうです。けど私たちは全員新人だし・・・。

 

私達の2回目のプロジェクトで、メンバーのひとりがGitを使おうと言ってきたので、使ってみたらとっても良かった!今現在は、Taiga.ioというツールを使って作業を分担して、Gitでそれぞれのコードをまとめるという方法を取っています。とは言っても、まだまだ問題は山ほどあるのだけれど。Mergeしたくない人がいるとか、Taigaを見ない人がいるとか。そして最終的には参加放棄状態、みたいな・・・。やっぱりグループで決めたルールは守らなければうまくいかないと思うの。なんでできないんだろう・・・。しかもね、誰かひとりが頑張り過ぎても文句を言われてしまう場合があるんだよ。グループワークって、本当に難しい。泣


Gitの話に戻るのですが、先生はTerminal派みたいだけど、私はあんまりTerminalで作業するのが好きじゃないんですよね。私はIDEはEclipseを使っていて、Terminalを使わなくても、EGitという便利なプラグインがあるので、それを使ってます(IntelliJの場合は似たようなツールが最初から組み込まれてるみたいです)。でもGit Repositoryを作るのって、ほとんどグループワークの時だけなので、毎回どうやるんだっけ?ってなるので、ここに簡単にメモしておこうと思います。いろんな方法があると思うけど、これが私が簡単だと思う方法です。

  1. Eclipse内で普通にProjectを作る。
  2. GitHubでRepositoryを作る。
  3. EGitでClone Git Repositoryをする → GitHubで作ったRepositoryのURLを入力。
  4. 1で作ったProjectにカーソル合わせて右クリック → Team → Share Projectの後、2のRepositoryを選ぶ。
  5. git commit → git push

必要なら2のRepository内にある、Settings → Collaboratorsで、一緒に作業するユーザーを追加します。

これでセットアップ完了です。

spring-aspectsが見つからない

前の投稿の、Auditingができるまで、色々な問題がありました。私はビギナーなので、まだ十分にたくさんの問題を知り尽くして無く、経験のある人にとっては初歩的な何でも無い問題でも、解決するのに時間がかかってしまう場合があります。前に同じ問題が起こっていたら、これかもって推測できるのだけど、初めて起こる問題にはそうはいきません。先生たちが、学校でたくさん間違えておきなさいっていったのは、そういう事だと思います。たくさん間違えれば間違えるほど考えるし、その分学べます。

 

今回私の時間を盗んだ間違いはこれ。

-- 間違い --

        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>org.springframework.spring-aspects</artifactId>
            <version>${spring-aspects.version}</version>
        </dependency>

 

-- 正しい --

        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-aspects</artifactId>
            <version>${spring-aspects.version}</version>
        </dependency>

 

間違ってる方のは、artifactIdに、groupIdの部分が組み込まれてしまっています。それを正しい方のコードに直したら、ばっちりでした。

 

私が今回間違えた原因は、ネットで見つけた別の人のMaven dependencyをそのままコピペして使った事にありました。コピぺする事自体は悪く無いのだけど、理解しないままコピぺすると、問題が起きた時にどこに問題があるのか見つかりにくくなります。私はMavenの仕組みを理解しないまま、今まで何と無くコピーペーストして乗り切ってきましたから・・・。でも今回の間違いで少し理解できたような気がします。

 

spring-aspectsが見つからないっていうエラーメッセージにあったリンクにいってみたんです。

Index of /maven2/

これ見た感じだと、groupIdのフォルダーにまずいって、それからartifactIdを探すっていう動作のようです。

 

なんだ、魔法じゃ無いんだ、割と手動っぽい動作ね。笑