AWS勉強メモ
- Udemy for Businessで、「AWS:ゼロから実践するAmazon Web Services。手を動かしながらインフラの基礎を習得」
- アカウントを作ったら、AWSアカウントを取得したら速攻でやっておくべき初期設定まとめ - Qiita を実施。
まだ始めたばかりなので勉強が進んだら更新します。
Effective Javaを読んでみる (2章)
今更ですが、Effective Java第2版を読んでいってみたいと思います。ただ読むだけなのもアレなので、書いてある項目ごとに簡単なまとめをつけてみます。
2章 オブジェクトの生成と消滅
(1章は「はじめに」なので2章から始まります)
項目1 コンストラクタの代わりにstaticファクトリーメソッドを検討する
- ファクトリーメソッドには名前を付けられる
- コンストラクタでは引数の型が同じものを複数作れない。
- 引数の型が似たコンストラクタを複数作った場合に区別を付けづらい。
- コンストラクタでは必ずオブジェクトが生成されるが、ファクトリーメソッドではオブジェクトを生成するかどうかを選択できる
- ファクトリーメソッドでは、そのクラスの型だけでなく、サブタイプの型のインスタンスを返すことも可能
- 短所:他のstaticメソッドと区別をつけづらい
- ファクトリーメソッド特有の命名をすることで区別をつける。
項目2 数多くのコンストラクタパラメータに直面した時にはビルダーを検討する
- パラメータが多い場合については、コンストラクタでもファクトリーメソッドでも対応できない。
- テレスコーピングコンストラクタ・パターン
- new Class(int, int, int, int, int) など
- 書くのも読むのも困難
- JavaBeansパターン
- デフォルトコンストラクタ+setterたくさん
- 読みやすくはある
- 生成途中で、インスタンスの状態を不変に保てない
- デフォルトコンストラクタ+setterたくさん
- Class.newInstance()は論外
- コンパイル時の型検査ができない
- ビルダーパターンを使う
NutritionFacts cocacola = new NutritionFacts(240, 8).calories(100).sodium(35).carbohydrate(27).build()
- ポイント
-コンストラクタは必須パラメータだけ
- オプションのパラメータを続けて設定
- 最後にbuild()を実行
- インスタンスの状態を不変に保てる&読みやすい
- ポイント
-コンストラクタは必須パラメータだけ
項目3 privateのコンストラクタかenum型でシングルトン特性を強制する
項目4 privateのコンストラクタでインスタンス化不可能を強制する
項目5 不必要なオブジェクトの生成を避ける
- 呼び出し回数が多い処理の中では、時間がかかるオブジェクトの生成(Calendar.getInstance()など)を避ける。
- 1回だけ別のところで呼び出しておく
- オートボクシングでもオブジェクトの生成が起きる。
- longとLongを書き間違えるなどで無意識にやってしまうことがある
- 生成コストの高いものに対してオブジェクトプールを自作するのは基本的にNG。DB接続のようにものすごく生成コストが高い場合のみ行う。
- 防御的コピー(項目39)でオブジェクトを生成するのは必須。
- オブジェクトを生成しないと逆にバグやセキュリティホールのもとになる。
項目6 廃れたオブジェクト参照を取り除く
- メモリリーク(オブジェクトへの参照が残ったままでGCされない)に注意する。
- 配列などを使って独自のメモリ管理をしている場合
- 使わなくなった領域をnullクリアする
- キャッシュを実装している場合
- WeakHashMapを使うと便利。
- キーへの参照がなくなると、値のオブジェクトを自動で削除してくれる
- 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のおべんきょーをしてみようかと。
まずは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