えらちおごはん

汚ねえメシ画像と学んだことのメモ

『リーダブルコード ―より良いコードを書くためのシンプルで実践的なテクニック』を読んだ

転職してからコードレビューを受ける機会が結構増えたんだけど、コードの「読みやすさ」に関する指摘をもらうことが結構多く、いいコードを書きたいなー、というかそれ以前にレビュアヘの負荷を減らしたいなー、と思って読んでみた。

リーダブルコード ―より良いコードを書くためのシンプルで実践的なテクニック (Theory in practice)

リーダブルコード ―より良いコードを書くためのシンプルで実践的なテクニック (Theory in practice)

まずはみなさん本の概要を知りたいと思うんですが、訳者の前書きに概要がすごく綺麗にまとまっていたので、引用で楽をします。

タイトルが示す通り、本書のテーマは「読みやすいコード」である。
(中略)
「読みやすい」コードを書くのに「面白い」ことをする必要はない。いい名前をつける。適切なコメントを書く。意味のある単位に分割する。キレイに整形する。こうした基本的なことを着実にやればいい。このことを丁寧に説明してくれるのが本書である。

プログラマなら誰しも、わかりやすいコードを書きたい、という気持ちを持っていると思うんだけど、「じゃあどうすればいいのさ?」って聞かれると案外答えるのが難しい。そういった、言語化しにくい「読みやすさの指標」みたいなものを、この本は明確にしてくれる。

で、この本のどこが面白いのかについてですが、これも前書きに全部書いてあります。
無能なのでそのまま引用します。

本書が面白いのは、アドバイスの仕方がいいからだと思う。よくありがちな「コードはこう書きなさい」という説教じみたものじゃなく、かといってふざけたものでもなく(挿絵はふざけてるけどな!)、先輩から「こうした方がいいよ」と優しくアドバイスを受けているような感じがする。説明用のサンプルコードも豊富だし、今日からすぐに使えるヒントも満載だ。

書いてある内容もそんなにヘビィじゃなく読みやすいので、コードレビューでもやもやしてる人や、僕みたいに本棚に死蔵してた人は読んでみるといいんじゃないでしょうか。
以下は自分用の読書メモです。

gist.github.com

『Javaプログラマーなら習得しておきたい Java SE 8 実践プログラミング』を読んだ

Java SE7 までは経験ある人が SE8 の知識をつけるのに良い本ないかなー、と本屋を徘徊していたところ見つけた一冊。表紙はかわいいですが、中身は結構えぐくて、読み応えばっちりです。

いまさら僕が説明するまでもなく、 Java SE8 では、

  • Lambda
  • Stream
  • Optional
  • Date And Time
  • Completable Future

など、プログラミング言語やライブラリの機能が大幅に追加されています。

が、この辺のパラダイムについていくのって結構大変で、いつもの手癖で for 文書いたり if null 書いたりしがちだったりする。この本では、そういうプログラマのために、Java8 を導入することでコーディングスタイルがどう変わるか、 before と after を提示してくれるのでものすごくわかりやすい。after の形に書き換えることでどういうメリットがあるか(並列処理が高速になる、直感的なコードになる、など)とかもしっかり書かれてて便利。古の Java プログラマー老害化から救う本としては、これ以上の入門書はないんじゃないだろうか。

翻訳書特有のクセはちょっとあるけど、文章は簡潔で読みやすい。

純日本製の技術書と比べるとコードサンプルはやや少なめだけど、地道に写経しながら読み進めていくことで、 Java SE8 の考え方がしっかり身につく良書でした。老害にならずに済みそうでよかった。

以下はお勉強用のリポジトリです。

github.com

『SpringBootプログラミング入門』を読んだ

仕事でSpringBoot使うことになったので読みました。

SpringBootプログラミング入門

SpringBootプログラミング入門

これでもか、ってくらい丁寧に書かれてるので、置いてけぼりを食らう心配がなく、安心して読めます。とはいえ、クラス作成するときのEclipseの操作方法、とかのレベルまでつぶさに書かれてるので、超初学者とかでない限りちょっと鬱陶しいかも。
津耶乃先生の本を読むのは『新人プログラマのためのjQuery Webアプリケーション開発講座』に次いで二冊目なんだけど、この人の本の良いところは、肩肘張らずにカジュアルに読めるところ。体系的な知識は欲しいんだけど、オライリー本読むのは敷居が高いんだよな……って気分の時に重宝すると思います。

新人プログラマのためのjQuery Webアプリケーション開発講座

新人プログラマのためのjQuery Webアプリケーション開発講座

SpringBootに関しては、

  • コード書く量をとにかく減らそう、という思想が良い
    • RestAPIがびっくりするくらい簡単に書ける
    • Spring Data JPAを使うことで、CRUDも超簡単に書ける
    • Ruby on Rails的なアソシエーションの仕組みもある
  • 設定ファイルだらけの開発から、アノテーションを使った開発へシフトしているのが良い
    • applicationContext.xmlと戦わなくて済むのが嬉しい
  • 各種構文が2.x系の時代からかなり変わっている
    • とはいえ、SpringFrameworkの経験があれば大騒ぎするほどのことじゃない気がする
    • 他のSpringシリーズと組み合わせて使えるので、Struts2やMyBatisを一生懸命組み合わせるよりシンプルにものが作れそう

だいたいこういう印象。SpringCloudConfigとか、Spring関連のフレームワークの知識をちゃんとアップデートしたいので、次はその辺の本を読んでおきたいです。
で、以下は読書メモ。Spring Tool Suiteに関する記述は読み飛ばしてます*1gist.github.com

*1:EclipseからIntelliJの軍門に下ったので……

無職活動報告

2月の中旬から始めた無職生活ですが、GW明けから働き始めることになったため、そろそろ終わりを迎えようとしています。
無職の間に何をして、何を考えていたかを「無職活動報告」としてここに書き残そうと思います。

転職活動

f:id:gushernobindsme:20170504221358p:plain 新卒の就活で苦労した方だったので、「転職活動やりたくないなー」という気持ちが強かったんだけど、やってみたらこれが意外と楽しかった。そう感じた大きな要因としては、

  • 自信を持って話せる経験がある
  • 学生時代なら相手してもらえなかった会社の人に会える
  • 因果関係がちゃんとわかる

というところが大きかったように思う。

自信を持って話せる経験がある

学生の頃は、学生時代に打ち込んだと言い切れるほどの経験が正直なくて、
「この話したら響くかな?」
みたいなエピソードを自分の経験から必死で探して、ひねり出して、それっぽく話すしかなかった。結局、フルタイムで働いた経験は学生にはないので、想像でやっていくしかなく、それは周りの学生も同じのようで、巷にはいわゆる「納豆人間」*1が溢れていた。

転職活動では、この点が大幅に改善された。
実務で実際に経験してきたことを話せるので、ものすごくやりやすいのだ。

  • これまでで一番やりがいを感じた瞬間は?
  • これまでに一番苦労したことは?
  • その経験から学んだことは?

こういったお決まりの質問が、これまでの実務経験から、具体的なエピソードを踏まえて、間にちょっと冗談を交えたりしながら話せる。話せることが無限にある、というのは新卒就活で苦労した人間からすると革命的で、「強くてニューゲーム」してるような気持ちになれた。

学生時代なら相手してもらえなかった会社の人に会える

自分は文系大学の出身だったので、技術系の仕事に就きたい、と思って履歴書を送っても結構な確率でお祈りされてしまうことが多かった(とはいえ、趣味プロダクトとかちゃんとやってる人であれば、その限りではないと思います)。

ただ、転職活動だと、大学での専攻よりも前職でのキャリアに目が向く。
職務経歴書をかなり気張って書いておくと、学生時代に書類段階でスルーされていた、憧れのイケイケな会社の会議室に通されたりするので、未来が開ける気持ちになると思う。

因果関係がちゃんとわかる

楽しい気持ちで活動できた一番の要因は多分これ。

転職活動では、基本的にみんなエージェントをつけて活動をすると思うんだけど、このエージェント氏がめちゃくちゃ優秀で、

  • 履歴書、職務経歴書の添削をしてもらえる
  • 書類審査で落ちた理由をフィードバックしてもらえる
    • メインで使ってる言語の経験が浅い、とか
    • 目的としてる人材を採用できたので募集自体を打ち切った、とか
  • (本人が希望すれば)面接対策をかなり丁寧にやってくれる
  • 面接で落ちた理由のフィードバックをもらえる
    • 人柄はいいんだけど筆記課題の点数がだめ、とか
    • 経験とかに問題はないんだけど、社内でポジションを用意できなかった、とか

この人がいてくれるだけで、ざっと、これだけのメリットがある。
就活自殺の背景には「落とされた理由がよく分からない」「自分のこれまでの人生を全否定されたような気持ちになる」ということがあったと記憶しているんだけど、エージェント氏がいれば、そういった不安とは概ね無縁でいられると思う。

あと、面接が通過した場合にも「どういう点が評価されたか」のフィードバックがもらえるし、企業の人材募集の背景なんかも教えてもらえるので、「自分をどう見せるか」みたいな作戦もめちゃくちゃ立てやすい。

で、上記のようなストレスフリーな環境で活動できるおかげで、自己分析にちゃんと時間をかけられるようになる。例えば、

  • 何をやってる時に喜びを感じるのか
  • 今後、どういうキャリアパスを歩みたいのか
  • 3年後、5年後どうなりたいのか

みたいなことって本来はめちゃめちゃ大事だったはずなんだけど、大人になると、目の前の仕事をこなすのに忙しくなって、だんだんと忘れていってしまう。さりとて、学生時代には「そんなん言われてもわかんねーよ」って感じだと思う(そうじゃない人はすみません)。

忘れてしまった「本当はこうありたかったはずだよな」という気持ちを思い出せただけでも、無職期間と、そこからの転職活動には意義があったと思う。

筋トレ

f:id:gushernobindsme:20170504221403p:plain ガリガリな体に対するコンプレックスを解消したかったので、ジムに通い始めた。
筋トレの良いところとしては、代謝がよくなって痩せる、単純にかっこいい体になれる、というのももちろんあるんだけど、副次的な効果として、

  • 自分の体調の良し悪しが分かるようになる
  • 胸を張って生活できるようになる

みたいなところもあると思う。

自分の体調の良し悪しが分かるようになる

これまでは、なんとなく体調の悪いような日があっても
「まあ気のせいだろ」
と思って無理をしてしまうことが多かったんだけど、筋トレをするようになると、今日は体調が悪いから休もう、という判断がちゃんと下せるようになる。

判断基準は明確で、普段こなせる運動がいつも通りにできるかどうか。
睡眠不足だったり、食事量が少なかったりすると、いつもなら上げられる重量が上がらなかったり、量をこなせなかったり、反応が分かりやすい形で現れてくる。
ちゃんと負荷がかけられないと、筋肉が育たなくて、フラストレーションが溜まるので、自然と規則正しい生活と十分な食事を意識するようになる、という訳である。筋トレすごい。実によくできてる。

胸を張って生活できるようになる

エンジニアがやっていく気持ちを作るために必要なのは、
「やったことないけどまあ勉強すればできるやろ」
という自己肯定感だよな、と常々思っていて、自己肯定感を健全に醸成するためには、目標の策定と達成の繰り返しが必要だと思うんだけど、そのサイクルをうまく回す仕組みとして、筋トレはものすごく分かりやすい。

目標を数値化しやすいし、できたか/できないかで毎日の効果測定もしやすい。
何より、成果が外見に分かりやすく現れてくるのが抜群に良い。

あと、マシントレーニングをするときの正しい姿勢は「胸を張ること」であることが多くて、「胸を張って生きろ」みたいな言説に「うるせえ」って反発しがちな人も、正しいフォームを学習する過程でちゃんと胸を張るようになる。
色々あって気持ちが落ち込んでいる人は、とりあえず筋トレを始めてみると、根拠は一旦置いといて、胸を張って、前を見て歩けるようになるので良いんじゃないでしょうか。

今後どうするか

面接で、
「自分のなるべき姿になるために何が足りないと思う?」
みたいな質問をされて、色々と思うところがあったので、今後はインプットとアウトプットを頑張ろうと思います。具体的にはこんな感じ。

  • インプット
    • 勉強会ちゃんと行ったりとか
    • 雑誌読んで最新動向ちゃんと追いかけたりとか
  • アウトプット
    • やったことちゃんとブログに残したりとか
    • GitHubにもリポジトリ立てて上げたりとか

現場からは以上です。

*1:「私は納豆のように粘り強い人間です!」という自己PR。亜種として、「人間関係を円滑にする」潤滑油人間、「スポンジのようになんでも吸収する」スポンジ人間などがいたと思う。皆さんは何人間でしたか?

REST APIを取得するクライアントをJerseyで作る

Jerseyとは?

Jersey RESTful Web Servicesフレームワークは、JAX-RS APIのサポートを提供し、JAX-RS(JSR 311およびJSR 339)リファレンス実装として機能する、JavaでRESTfulなWebサービスを開発するための、オープンソースで実動品質のフレームワークです。(https://jersey.java.net)

すごく雑に説明すると、REST APIからデータを取得するアプリケーションをJavaで簡単に作るためのライブラリ。労力抑え目でREST APIをどうこうしたい時に便利。

インストール

Mavenを使用する場合は、以下のdependencyを追加する。

<dependency>
  <groupId>com.sun.jersey</groupId>
  <artifactId>jersey-client</artifactId>
  <version>1.19.3</version>
</dependency>

REST APIからデータを取得する

使い方としては、ざっくり以下の3ステップでいける。

  • Clientのインスタンスを生成する
  • Client#resourceでデータを取得する。引数にはAPIのURLを指定する
  • WebResource#getでJSON形式のデータを取り出す

コードに起こすと以下のような感じ。

final Client client = Client.create();
final WebResource resource = client.resource("https://api.github.com/repos/spring-projects/spring-boot/issues");
final String json = resource.get(String.class);

JSONを任意のDTOにデシリアライズする

ここでは、JSONパーサーライブラリのJacksonを使う。
github.com

まずはMavendependencyを追加して、

<dependency>
  <groupId>com.fasterxml.jackson.core</groupId>
  <artifactId>jackson-databind</artifactId>
  <version>2.8.8</version>
</dependency>

任意のDTOを作って*1

@JsonIgnoreProperties(ignoreUnknown=true)
public class GitHubApiResponseDto {
    private String title;
    private String body;

    public String getTitle() {
        return title;
    }
    public void setTitle(String title) {
        this.title = title;
    }
    public String getBody() {
        return body;
    }
    public void setBody(String body) {
        this.body = body;
    }
}

ObjectMapper#readValueすればOK。

final ObjectMapper mapper = new ObjectMapper();
List<GitHubApiResponseDto> results = new ArrayList<GitHubApiResponseDto>();
results = Arrays.asList(mapper.readValue(json, GitHubApiResponseDto[].class));

readValueメソッドはIOException、JsonParseException、JsonMappingExceptionをスローするので、適宜処理してください。

配布用Jarを作る

続いて、jarファイル単品で動作するよう、配布用のjarファイルをビルドする。
こちらも特に複雑なことはなくて、素直にmaven-assembly-pluginを使います。mainClassは各自の環境に応じて書き換えてください。

<build>
  <plugins>
    <plugin>
      <artifactId>maven-assembly-plugin</artifactId>
      <version>2.2</version>
      <executions>
        <execution>
          <id>make-assembly</id>
          <phase>package</phase>
          <goals>
            <goal>single</goal>
          </goals>
        </execution>
      </executions>
      <configuration>
        <descriptorRefs>
          <descriptorRef>jar-with-dependencies</descriptorRef>
        </descriptorRefs>
        <archive>
          <manifest>
            <mainClass>com.inmotion.Main</mainClass>
          </manifest>
        </archive>
      </configuration>
    </plugin>
  </plugins>
</build>

あとは、mvn packageコマンドを実行してビルド実行。「(プロジェクト名)-jar-with-dependencies.jar」が作成されれば成功です。お疲れ様でした。

リポジトリ

github.com

参考

www.akirakoyasu.net qiita.com

*1:実装の簡略化のため、今回は@JsonIgnoreProperties(ignoreUnknown=true)を指定しています。これを指定しておくと、JSON構造が持つフィールドを全てDTOに用意していなくても動作するようになる

新しくMac買ったときに入れるやつ

自宅のMacに開発環境作るにあたって色々やったんだけど、だんだんとっ散らかってきたので一度整理してみることにする。

Atom

atom.io

インストール

公式サイトからダウンロードして、インストールすればOK。
ただ、このままだと気軽にMarkdownを書いたり、矩形選択したりできないので、適宜パッケージを追加する。パッケージの追加手順については、以下のサイトが詳しい。 www.kotalog.net

Ruby

本職はJavaだけど、Rubyも動かせておく必要があるので入れておく。
https://www.ruby-lang.org/ja/

インストール

Macの購入時に既に入ってるもんだけど、任意のバージョンのものを使いたいのでrbenv経由でインストールする。インストール手順については以下のサイトを参照。 morei.hatenablog.jp

Homebrew

brew.sh

インストール

Homebrewの実行のためには、Xcodeが必要となるため、まずはXcodeをインストールする。 https://developer.apple.com/jp/xcode/

Xcode本体をインストールしたら、一度立ち上げてライセンス認証を行う。
続いて、コマンドラインで使用できるようにするため、ターミナルで以下のコマンドを実行する。

xcode-select --install

インストールが完了したら、以下のコマンドでHomebrewをインストールする。

/usr/bin/ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)"

必要なものをbrew install

MySQL

brew install mysql

その他、便利コマンド

brew install tree
brew install nkf
brew install lv
brew install wget
brew install imagemagick

Ruby on Rails

本職はJavaだけど、Railsも動かせておく必要があるので入れておく。 rubyonrails.org

インストール

Railsの標準のデータベースがSQLiteなので、事前にSQLiteを入れておく。

gem install sqlite3

また、Railsでアプリケーションを動作させるにはNode.jsも必要なので入れておく。
使用するにあたっては、Nodebrew経由でやるのが分かりやすいんだけど、手順がやや複雑なので、詳細は参考サイトに譲ることにする。
qiita.com

ここまで用意できたら、ようやくRuby on Railsのインストール

gem install rails

バージョン確認して、想定通りであることを確認できればOK。

rails -v

Java

java.com

Eclipse

eclipse.org

インストール

公式サイトから落としてくるのが一番早いんだけど、必要なプラグインを漏れなく入れていくのが結構しんどいので、Pleiades All in Oneの力に頼ることにします。
基本的には以下のサイトを参考に進めていけばOK。
qiita.com

あとは、SpringBootをボタン一発で起動できるようにするため、Spring Tool Suite(STS) for Eclipseプラグインをインストールする。こちらはここのサイトにいくつか記述があった。 kagamihoge.hatenablog.com

そもそもSpring Tool Suite使えば良いのでは、って気もしてるけど、その辺はこれからやってみて考えることにする。
他、入れといた方が良いものあったら教えてください。

『Ruby on Rails 4 アプリケーションプログラミング』を読んだ

仕事上、最低限読めるようになっとく必要がありそうだったので購入。さすが山田先生の本、って感じで抜群の読みやすさ。

Ruby on Rails 4 アプリケーションプログラミング

Ruby on Rails 4 アプリケーションプログラミング

Rails自体を触ってみた感触としては、

  • コード生成のためのツールやら動作確認用の簡易サーバやらが全部入りになってて覚えやすそう
  • 「設定より規約」の思想なので、チーム開発に投入しても統一感のあるものができそう

という印象。まあ、実戦投入したことないし分からないけど。
一応技術メモも取ってみたんだけど、「とりあえず読めるようになる」がゴールなので割とゆるい感じで終わらせた。CoffeeScript、SCSSを駆使したクライアント開発とか、Apache+Passenger、Herokuなど本番環境への移行、のところは割と読み飛ばしてしまった……。必要になったらまた読みます。

gist.github.com