えらちおごはん

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

『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 ガリガリな体に対するコンプレックスを解消したかったので、ジムに通い始めた。
筋トレの良いところとしては、代謝がよくなって痩せる、単純にかっこいい体になれる、というのももちろんあるんだけど、副次的な効果として、

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

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

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

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

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

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

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

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

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

いい話ここまで。

筋トレはソシャゲ

個人的に、筋トレはソシャゲだと思っていて、ある程度課金することで成長速度にブーストをかけることができる。課金アイテムは色々あって、

みたいなところが代表格だけど、オススメはパーソナルトレーナーパーソナルトレーナーに課金すると、筋トレに関する諸情報が、いろんな手順をスキップしてまとめて手に入る。

無課金でやろうとすると、思うように成果がでなくて、筋肉系YouTuberの動画を無限にみる羽目になったり、意識の高い筋トレ系ブログを無限に徘徊するようになったりするので正直しんどい。そういうのしんどくない? 俺はしんどい。

みんなで軽率に筋トレに廃課金しましょう。廃課金が全てを解決します。
そして、ガタイを良くして、人生の☆5確定ガチャを回せるようになりましょう。

今後どうするか

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

  • インプット
    • 勉強会ちゃんと行ったりとか
    • 雑誌読んで最新動向ちゃんと追いかけたりとか
  • アウトプット
    • やったことちゃんとブログに残したりとか
    • 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

『たのしいRuby』を読んだ

エンジニアとしてJavaしかできないのってどうなの、という気持ちがあったのと、仕事でRubyを読む機会が出てきそうだったのもあって、勢いで購入しました。

たのしいRuby 第5版

たのしいRuby 第5版

帯に「初心者の気持ちを裏切らない出来になっています」とある通り、プログラミング初心者でもつまずかないよう、丁寧に書かれてる印象で、とにかく分かりやすい。
他の言語の経験者としては、『初めてのRuby』とか『プログラミング言語 Ruby』をあたりを買うべきなんだろうけど、日和ってこっちにしといて良かったです。

初めてのRuby

初めてのRuby

プログラミング言語 Ruby

プログラミング言語 Ruby

あとは、Ruby初心者のJavaおじさんとしては、

  • 標準ライブラリが強力
    • Javaでやるとしんどそうことがさらっと書ける
  • 型システムがない
    • Javaならコンパイルエラーになるようなことも書けてしまう
    • 実行するまで型のエラーを検知できないのは不安

という感想を持ちました。型安全じゃないとすげー不安な気持ちになるんだけど、みんなそんなことないんだろうか。

以下は自分用の読書メモです。
gist.github.com

Struts2×SpringFramework×MyBatisでWebアプリ書いた

前の職場のコード資産に頼らずにWebアプリをどこまで書けるのかがどうしようもなく不安になってしまったので、気持ちをなだめるためにTODOリストを実装した。

github.com

大したことは書いてないし、技術的な挑戦もないんだけど、丸2日かければとりあえずこれくらいのことはできるんだな、という結果が得られたので、精神の安定には繋がったと思う。文系卒でも、五年くらい働いていればこれくらいのことは出来るし、レジ打ちしかできなかったあの頃を思えば圧倒的成長。
記憶が風化してしまわない内に、技術メモ的なものを残しておく。

Struts2

言わずとしれたWebアプリケーションフレームワーク
今回の実装では、

  • ZeroConfigurationを使った画面遷移&パラメータ受け渡し
  • Struts標準タグを使った画面の実装
  • SpringFrameworkとの連携(struts2-spring-plugin)

あたりの技術を使っています。 スキルの棚卸的な観点としては、

あたりも押さえておくべきなんだけど、今回は見送り。
ZeroConfigutation周りとか結構忘れていて、最初の画面遷移でかなり時間を使ってしまった……。どのサイトもスペルミスやら誤字やら多いので参考URLはなし。

SpringFramework

こちらも有名なWebアプリケーションフレームワーク
フレームワークとしてカバーしてる範囲が非常に広くて、SpringMVCとか、SpringBootとか、そもそも使ったことないものも多いんだけど、今回は以下を使用。

  • DI(Dependency Injection)
  • SpringSecurityを使ったログイン認証

ちょっと見ない内にメジャーバージョンが変わっていて(2.x系を使ってたんだけど今回は4.x系を使用)、SpringSecurityの記法がガラッと変わってしまったためかなり手こずった。

javatechnology.net

棚卸的にはSpringBatchを使ったバッチアプリケーションの実装をやるべきなんだけど、作るべき部品が多すぎるので断念。

MyBatis

バリバリ使ってたORM。バリバリ使ってたのであんまり困らなかった。

  • Mapperファイルを活用して生SQLをベタ書き
  • SqlSession使ってJavaから呼び出し
  • SpringFrameworkとの連携

あと、こちらもちょっと見ない内にmybatis-springなるプラグインが登場していてびっくりした。少し試してみたんだけど、MyBatisとSpringFrameworkの連携が簡単に書けてしまって、オレオレWrapperが横行していた頃を思うと隔世の感があるなと思う。

mybatis-spring – MyBatis-Spring | イントロダクション argius.hatenablog.jp

動的SQLとかのトピックはスルーしたけど、一通りCRUD書いたので割と満足。

MySQL

DB周りはOracleが本業なんだけど、ちょっとした実装のためにわざわざ用意するのはだるかったので、MySQLに挑戦。Oracleしかやってこなかった身からすると「DBの構築ってこんなに簡単で良いの?!」という気持ち。Mac上でも難なく構築できました。

qiita.com

Bootstrap

気持ちをなだめるための実装とはいえ、ある程度画面が綺麗じゃないと気分が乗らないので、Bootstrapも導入。CSSやデザインが苦手でもカッコいいページが作れて良い。

getbootstrap.com

サンプルも充実しているので、今回の実装ではBootstrap themeとSign-in pageの大部分を参考にさせてもらった。

Eclipse

少し調べてみると、MacEclipsePleiadesを導入するのは超ハイパーメディア難しいようです。重くなるのは嫌だけど、おとなしくPleiades All in Oneを利用することにします。

qiita.com

完成

そうこうしている内に完成したので画面イメージを載せておきます。
ログイン画面
f:id:gushernobindsme:20170408233935p:plain

一覧表示画面
f:id:gushernobindsme:20170408233942p:plain

余力があれば、AWS上に構築して触れるようにしたりしたい。