40過ぎのおっさんが勉強してみるブログ

会社の帰りの電車で勉強したことをメモしていきます

Effective Javaを読んでみる (2章)

今更ですが、Effective Java第2版を読んでいってみたいと思います。ただ読むだけなのもアレなので、書いてある項目ごとに簡単なまとめをつけてみます。

2章 オブジェクトの生成と消滅

(1章は「はじめに」なので2章から始まります)

項目1 コンストラクタの代わりにstaticファクトリーメソッドを検討する

  • ファクトリーメソッドには名前を付けられる
    • コンストラクタでは引数の型が同じものを複数作れない。
    • 引数の型が似たコンストラクタを複数作った場合に区別を付けづらい。
  • コンストラクタでは必ずオブジェクトが生成されるが、ファクトリーメソッドではオブジェクトを生成するかどうかを選択できる
  • ファクトリーメソッドでは、そのクラスの型だけでなく、サブタイプの型のインスタンスを返すことも可能
  • 短所:他のstaticメソッドと区別をつけづらい
    • ファクトリーメソッド特有の命名をすることで区別をつける。

項目2 数多くのコンストラクタパラメータに直面した時にはビルダーを検討する

  • パラメータが多い場合については、コンストラクタでもファクトリーメソッドでも対応できない。
  • テレスコーピングコンストラクタ・パターン
    • new Class(int, int, int, int, int) など
    • 書くのも読むのも困難
  • JavaBeansパターン
    • デフォルトコンストラクタ+setterたくさん
      • 読みやすくはある
    • 生成途中で、インスタンスの状態を不変に保てない
  • Class.newInstance()は論外
  • ビルダーパターンを使う NutritionFacts cocacola = new NutritionFacts(240, 8).calories(100).sodium(35).carbohydrate(27).build()
    • ポイント -コンストラクタは必須パラメータだけ
      • オプションのパラメータを続けて設定
      • 最後にbuild()を実行
    • インスタンスの状態を不変に保てる&読みやすい

項目3 privateのコンストラクタかenum型でシングルトン特性を強制する

  • Java5以降では、シングルトンを使う場合は要素が1つだけのenumを作る。
    • プライベートコンストラクタだと、シリアライズへの対応とか色々面倒

項目4 privateのコンストラクタでインスタンス化不可能を強制する

  • ユーティリティクラスがインスタンス化されることを防ぐため、コンストラクタをprivateで作っておく。
    • これが無いと、デフォルトコンストラクタでインスタンス化されてしまう。

項目5 不必要なオブジェクトの生成を避ける

  • 呼び出し回数が多い処理の中では、時間がかかるオブジェクトの生成(Calendar.getInstance()など)を避ける。
    • 1回だけ別のところで呼び出しておく
  • オートボクシングでもオブジェクトの生成が起きる。
    • longとLongを書き間違えるなどで無意識にやってしまうことがある
  • 生成コストの高いものに対してオブジェクトプールを自作するのは基本的にNG。DB接続のようにものすごく生成コストが高い場合のみ行う。
  • 防御的コピー(項目39)でオブジェクトを生成するのは必須。

項目6 廃れたオブジェクト参照を取り除く

  • メモリリーク(オブジェクトへの参照が残ったままでGCされない)に注意する。
  • 配列などを使って独自のメモリ管理をしている場合
    • 使わなくなった領域をnullクリアする
  • キャッシュを実装している場合
    • WeakHashMapを使うと便利。
      • キーへの参照がなくなると、値のオブジェクトを自動で削除してくれる
  • クライアントがリスナーやコールバックを登録したが、明示的に解除を行わない場合
    • この場合もWeakHashMapが便利。

項目7 ファイナライザを避ける

  • 重要な資源(ファイル・DBコネクションなど)をクローズする目的でfinalizeを使ってはいけない
    • finalizeは実行されるタイミングが不明。ずっと実行されないことすらある。
  • finalizeを使っていいのは次の2つの場合だけ。
    • クライアントがクローズを忘れた場合に備える安全ネットとして
      • finalizeの中で、「クローズを忘れているよ」と警告を出すべき
    • 重要でないネイティブ資源を開放するため(?)
      • (重要でないネイティブ資源って具体的に何?例が書いてない)
  • publicで、かつfinalでないクラスにfinalizeを入れるときはファイナライザガーディアンを使うこと。
    • 普通にfinalizeを書くと、呼ばれない可能性がある

bitnami-redmineをCentOS7上で自動起動させる

ちょいと間が空きましたが、Dockerの本読んでました。まだまだネタにできるレベルではないです。勉強中。

それはともかく、CentOS7にRedmineを入れて、おべんきょーとかやることの管理に使ってみようかと思いました。
Redmineも使ったことないので、どれがいいのかと探してみたら、BitnamiとかいうAll-in-one的なのがあると。で、インストールしてみました。
…が、CentOSを再起動してもMySQLとかRedmineが起動してくれない。起動用のGUI(manager-linux-x64.run)とかコマンド(ctlscript.sh)はあるのに。
仕方がないので、OS起動時にRedmineも起動してくれるようにサービスを作ってみました。

/etc/systemd/system/ に、bitnami-redmine.service というファイルを作ります。内容は次の通り。

[Unit]
Description=run bitnami redmine
After=network.target

[Service]
Type=oneshot
RemainAfterExit=yes
ExecStart=/opt/redmine-3.3.1-0/ctlscript.sh start
ExecStop=/opt/redmine-3.3.1-0/ctlscript.sh stop

[Install]
WantedBy=multi-user.target

ファイル作成後は、

$ sudo systemctl daemon-reload
$ sudo systemctl enable bitnami-redmine

を実行して設定を反映。OSを再起動させると、無事にRedmineにアクセスできました。めでたしめでたし。

補足

最初はType=simpleでRemainAfterExitの記載が無かったのですが、それだとRedmineが一瞬だけ起動してその後落ちてしまいます。
上のとおりの設定だと大丈夫なようです。

淡々とべんきょーだけするのも…

dockerのお勉強をするにあたって、無目的で動かしているだけだと身になりづらいかなぁ、と思って、「◯◯をするのにdockerを使ってみる」と決めてみることにしました。

で、何をすることにしたかというと、

「(ちょっと古いけど)IRCbotを作って、JenkinsとかでCIしたものをテスト用に動かす」

のにdockerを使ってみようかな、と。

docker上でbotを動かして、テストを流すようなイメージです。

…となるとdockerだけじゃなくてJenkins用意したりビルド環境用意したりと新しく覚えることがたくさん^^;まぁ最初はそんなもんですね。

がんばりまーす。

Dockerの勉強を始めてみる

今日からDockerのおべんきょーをしてみようかと。

まずはDockerを入れるところから。
環境はCentOS7です。yum使うのは初めてです^^;

Dockerの公式サイトを参照すると、CentOSには古いdockerが入っているので、まずそれを削除しろとのこと。それからdocker-engineをインストール。
で、docker ps コマンドで動作確認してみると動かない!エラーメッセージに

Is the docker daemon running?

と出てきたので、

systemctl status docker

で状態確認。はい。見事に落ちていました。デーモンを開始して再度docker psしてみると大成功。

無事にhello-worldのコンテナを起動することができました。めでたしめでたし。

Markdownエディタを探してみる

おっさんです。
…って書いているとなんかうざったいので書くのは今回で最後にします。

で、昨日に引き続きMarkdownのおべんきょー。
Markdownで書くときのエディタは何がいいかねぇ、と思って探してみました。
条件は以下。

  • eclipseみたいに重くない
  • 書いているそばからプレビューが見られる
  • Ctrl-HでBackspaceの動作ができる

Atomがよさそうな感じ。メジャーみたいだし、キーマップのカスタマイズもできるみたいだし。

インストールしてみたところ、1つめと2つめの条件は無事クリア。
だけど、Ctrl-Hのカスタマイズがなかなかできない…。 カスタマイズの方法書いてあるページ見つけてその通りにやってみたんだけどねぇ。
まぁそれは今後の課題(?)ということで。

※Ctrl-Hのカスタマイズ、うまくできました。カスタマイズの方法を書いてあるページをよく見ていなかっただけでしたorz

Markdownって何なのよ?

おっさんです。

ブログ書くのにMarkdownが使えるのね。 記法がよくわからんので解説してあるところを探してみました。 ググればすぐ出てくるんだけど一応メモということで。

この記事もMarkdownで書いてみています。

上のように、URLの文字列をそのままリンクにしたいときってどーするのがいいんでしょ。URLを2回書いてみてるんだけど、もっといい方法ないですかねぇ?

Markdownの記法って、昔ちょっと使っていたWikiの記法ともまた違うっすね。

まぁ少しずつ慣れていくようにします。