無限大な夢のあと

テニスとアニメが大好きな厨二病SEのブログ

JJUG EclipseCollectionsで学ぶコード品質向上の勘所に参加してきた。 #ccc_gh2 #jjug_ccc

本日、参加したJJUGのセッションで、品質と言う面で色々考えさせられたセッション。

GSの伊藤さんが発表された資料はこちらになります。
http://www.goldmansachs.com/gs-collections/documents/2016-05-21_JJUG_CCC.pdf

今回は、品質向上という観点での話がメイン。
EclipseCollectionsの使い方ではない。

EclipseCollections
Eclipse Collections - Features you want with the collections you need. (日本語ページ)

特に刺さった部分を、走り書きですが、幾つかまとめます。

コードの品質とは?

ソフトウェアの品質とコードの品質はイコールではない。→ 実装時点で直接ソフトウェアの価値に影響を与えるコード品質
・インタフェースの品質(UI、API
・実装の要求適合性・バグの存在
・実装のパフォーマンス(メモリ使用量、実行速度)

実装時点では必ずしもソフトフェアの価値に影響を与えないが、時間軸に沿ったソフトウェアの価値の増加率(生産性)に影響を与えるコード品質

・保守性(可読性、一貫性、簡潔性、等々)
・拡張性、再利用性
・テストカバレッジ

技術的負債

・コードの品質と引き換えにソフトウェアをリリースするスピードを重視した実装
・時間を経るにつれ、利子を払うかのごとく開発生産性を圧迫する
・技術的負債は必ずしも悪いわけではない(会計のB/Sで例を示した)

コードの品質のバランス

・ソフトウェアの特性によってどこの品質に重きを置くかは変わってくる
・コードの品質を議論する際には文化的な側面も多く、開発チームで「良いコード」「悪いコード」の認識を共有することも非常に重要
  ・組織のエンジニアリング文化
  ・プロジェクトチームのエンジニアリング文化
  ・個人がエンジニアとして育ってきた環境)

技術的負債とのつきあい方

技術的負債を完全になくすのは、ある程度の規模のソフトウェア開発に
おいてはほぼ不可能といえる
良いソフトウェアは技術的負債を「コントロール」する
・費用対効果を見積もる
・優先順位をつけ、技術的負債を戦略的に採用する
・返済計画を立てる

• 例:UnifiedSetとUnifiedSetWithHashingStrategyの重複
– UnifiedSetWithHashingStrategyは初期実装時点でUnifiedSetとのコード重複
が多く存在
– 戦略的に反DRYを許容
・ そもそもの実装の複雑性から、重複の排除には時間がかかる
・ 重複は2クラスのみにしか存在せず、保守性への影響は限定的
・テストカバレッジを保障することで将来のリファクタリングは安全に実施できる
・すぐに重複を排除するよりも他の機能にリソースを投資したほうがライブラリにとっての価値が高い
– Issue Trackerに登録し、フォローアップ
– バージョン7.0のリリースでは重複を排除

文化の違いなどは、受け入れた上でコードレビューに臨むべきだということ。
実践編の技術的負債の付き合い方などの話は、今まで言語化できなかった部分が言語化されていて良い資料だと思いました。
すごく良いセッションだったので、是非資料を見てみてください。

スッキリわかるJava入門 第2版 (スッキリシリーズ)

スッキリわかるJava入門 第2版 (スッキリシリーズ)

[改訂新版]Javaポケットリファレンス

[改訂新版]Javaポケットリファレンス

EFFECTIVE JAVA 第2版 (The Java Series)

EFFECTIVE JAVA 第2版 (The Java Series)

改訂2版 パーフェクトJava

改訂2版 パーフェクトJava

The Go Programming Language 輪読会 #03 に参加してきました。

こちらのイベントに参加させて頂きました。
#03eure.connpass.com

輪読対象は下記の書籍です。

The Go Programming Language (Addison-Wesley Professional Computing Series)

The Go Programming Language (Addison-Wesley Professional Computing Series)


今回の輪読した章は「3. Basic Data Type(基本型)」

今回学べたことを走り書き。

整数型
・%演算子は左辺/右辺どちらとも整数でなければいけない
・-5/3 、-5/-3 の結果は、ともに-2である。(言語によっては動きが違うそう)
・^&演算子とは? →左辺かつ右辺の数を含まないものをあらわす。
・>> << はビットシフトだが、右は符号なしでなければいけない。
・符号なし整数で十分に見えるケースでも、符号付き整数を使うべき。

浮動小数点型
・Nanとの比較は常にfalseを返す。

複素数
・組み込み型で、複素数型が実装されているのはGolangPythonのみ。他の言語では標準ライブラリなどで使えるようになっているものはある。
→この実装の意図は、Cを意識しているのかな?という話になった。
複素数型 - Wikipedia


bool
・&&は、||より優先順いが高いので、以下のようなコードでは丸括弧は不要である。
 if 'a' <= c && c <= "z" || 'A' <= C && C <= 'Z'

その他
・go tool vet -- shadowは使える。
・以下のブログは勉強になる。
To Go Beartrap Lying in the Shadows - Qureet.com Qureet.com


すごくアットホームな勉強会だったので、今後も参加してきたいです。
ちなみに、私は5章 Functionの輪読担当となりました。
初めての洋書の翻訳頑張ってみよう。

Go言語によるWebアプリケーション開発

Go言語によるWebアプリケーション開発

スターティングGo言語

スターティングGo言語

改訂2版 基礎からわかる Go言語

改訂2版 基礎からわかる Go言語

Angular2+ng2-bootstrapを使用し、カレンダーUIのサンプルを動かしてみる

Webサービス開発に向けて、まずは使用するライブラリのサンプルを動かしたりするところから始めています。

Bootstrapを使いたかったので、Angular2でうまく使えるものがないか探した結果、以下のng2-bootstrapが見つかりました。
github.com

早速上記を適用してみようということで、前回の記事のハンズオンで作成したところに、機能追加してみようと思います。
dke-msy-node.hatenablog.com

具体的には、ng2-bootstrapのカレンダーUI(DatepickerのExample)を機能追加して動かすまでの備忘録として、本記事を書きます。

ここから修正内容の本題です。
(1)以下のチュートリアルに従い、npmからng2-bootstrapをインストールします。
Angular2 Bootstrap

npm install --save ng2-bootstrap


(2)componentsフォルダに、calendarフォルダを作成します。

(3)calendarフォルダ配下にcalendar.htmlを作成します。
こちらは、DatepickerのExapmleそのままなので、特に注意点はなしです。

gist85ca66808fc57e21e5470f468dd7a8d6

(4)calendarフォルダ配下にcalendar.tsを作成します。
こちらは、サンプルをそのまま使用するだけだと動かないので、注意ポイントがいくつかあります。
先に完成形のコードを載せます。

gist501d330392c7cc90de94d168744efc71

(4-1) DATEPICKER_DIRECTIVESの読み込みパスを変更。
サンプルの構造と違うので、以下のように変更する必要があります。

(変更前)

import {DATEPICKER_DIRECTIVES} from '../../../ng2-bootstrap';

(変更後)

import {DATEPICKER_DIRECTIVES} from 'ng2-bootstrap';

(4-2)外部htmlの指定方法を変更。

WebPackを使用していない場合は、外部HTMLの読み込みはrequireを使用するとエラーが発生するので、読み込み方法を変更。
Template→TemplateUrlとし、直接指定とします。
また、指定するHTMLは先ほど作成したcalendar.htmlとします。

(変更前)

// webpack html imports
let template = require('./datepicker-demo.html');

@Component({
  selector: 'datepicker-demo',
  template: template,

(変更後)

@Component({
    selector: 'calendar-demo',
    templateUrl: 'components/calendar/calendar.html',

(4-3)selectorの名前を変更
(変更前)

@Component({
  selector: 'datepicker-demo',

(変更後)

@Component({
    selector: 'calendar-demo',

(4-4)Componentの名前を変更
(変更前)

export class DatepickerDemoComponent {

(変更後)

export class CalendarComponent {


(5)main.tsで、CalendarComponentを読み込む。

gistd7521928e685b81e2014cbf0ef456ccc

(6)index.htmlを変更。
ここが、一番多くの罠がいたので、注意点を記載していきます。
まずは、先に完成形を載せます。

gist8b09910fae59a15052da920667ed1861

(6-1)body以下にあるタグ名を自作のタグ名に変更
(変更前)

<my-app>Loading...</my-app>

(変更後)

<calendar-demo>Loading...</calendar-demo>

(6-2)ng2-bootsrapを読み込む。
bootstrap4はレイアウトが崩れるので、bootstrap3としました。

(追加した記述)

<link href="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.6/css/bootstrap.min.css" rel="stylesheet">
<script src="node_modules/ng2-bootstrap/bundles/ng2-bootstrap.min.js"></script>

(6-3)SystemJSでのライブラリの読み込みを追加
momentはJavaScriptで扱う日付ライブラリです。

(追加した記述)

            "node_modules/ng2-bootstrap": {
                "defaultExtension": "js"
            },
            "node_modules/moment": {
                defaultExtension: 'js'
            }

(6-4)SystemJSでのライブラリの読み込みパスの別名をつけます。これにより、TypeScriptファイルからのimportの記述が短くなります。

(追加した記述)

       paths: {
            "ng2-bootstrap": "node_modules/ng2-bootstrap/ng2-bootstrap",
            "moment": "node_modules/moment/moment"
        }

これで、カレンダーUIのサンプルが動くはずです。
Angular2の基本的なセットアップは、下記の書籍をご参考に構築してみてください。

シェルスクリプトマガジン vol.37

シェルスクリプトマガジン vol.37

  • 作者: 當仲寛哲,岡田健,佐川夫美雄,大岩元,松浦智之,後藤大地,白羽玲子,水間丈博,濱口誠一,すずきひろのぶ,花川直己,しょっさん,法林浩之,熊野憲辰,桑原滝弥,USP研究所,ジーズバンク
  • 出版社/メーカー: USP研究所
  • 発売日: 2016/04/25
  • メディア: 雑誌
  • この商品を含むブログを見る

あるいは、途中までであれば、私の前回の記事も参考にしてみてください。
dke-msy-node.hatenablog.com

「Angularハンズオン#11 〜 Angular2を初めて触る人向け 〜」に参加させていただきました。 #ng_jp

よし、GWに時間確保できそうだし、Webサービス作ろう。
さて、何を使おうか。

Angular1は下記の書評の時に、そこそこ触った。
dke-msy-node.hatenablog.com

ReactやVue.jsなどもよく聞く。
ただ、実際自分でアプリケーション作るなら、TypeScriptだよね。
(´-`).。oO(型は偉大、型がないのは辛い。。)

TypeScriptも下記のブログを書いたり、触ったことあるしいけるかな。
dke-msy-node.hatenablog.com

うん、今やるなら、TypeScriptベースのAngular2だよね。

ということで、入門者向けの下記の ハンズオンセミナーに参加させていただきました。
angularjs-jp.doorkeeper.jp


どんなことを聞けるか楽しみにしながら、まずは最初に会場を紹介してくださった21カフェのご紹介。
geechs-magazine.com

次に、なんと無償で本日のセットアップをするにあたっての下記の書籍(教科書)を頂けることに!!!

シェルスクリプトマガジン vol.37

シェルスクリプトマガジン vol.37

  • 作者: 當仲寛哲,岡田健,佐川夫美雄,大岩元,松浦智之,後藤大地,白羽玲子,水間丈博,濱口誠一,すずきひろのぶ,花川直己,しょっさん,法林浩之,熊野憲辰,桑原滝弥,USP研究所,ジーズバンク
  • 出版社/メーカー: USP研究所
  • 発売日: 2016/04/25
  • メディア: 雑誌
  • この商品を含むブログを見る

この時点で、ものすごくテンションが上がりました。

早速、nodeのインストールから開始。
MBPを最近購入したので、中身がまっさらな子ともいうこともあり、ここでは躓かず。
今回は手順ではnodebrewを使用してインストール。
nodeはv5.9.1を使用。
(´-`).。oO(nvmって今はあまり使われてないのか。こっちが今主流なのか。質問するまでもないか)

AngularJSを動かすにあたり、モジュールがたくさん必要ということ。
まずは下記コマンドでpackage.jsonを作成。

npm init -y

下記コマンドでnpmのモジュールをインストール。
(´-`).。oO(9個もあるのかw 後でlodashのインストールしておこ)

# Angularを動かすのに最低限必要なモジュールをインストール
npm install es6-shim@0.35.0 --save
npm install systemjs@0.19.24 --save
npm install zone.js@0.6.6 --save
npm install reflect-metadata@0.1.2 --save
npm install rxjs@5.0.0-beta.2 --save
npm install angular2@2.0.0-beta.12 --save
# Angularを開発するのに必要なモジュール
npm install concurrently@2.0.0 --save-dev
npm install lite-server@2.1.0 --save-dev
npm install typescript@1.8.9 --save-dev
npm install typings@0.7.9 --save-dev


ここで、開発中に使用するコマンドをpackage.jsonに下記を追記。
(´-`).。oO(package.jsonにコマンド定義できるのかー、へえー)

  "scripts": {
    "test": "echo \"Error: no test specified\" && exit 1",
    "start": "concurrently \"npm run tsc:w\" \"npm run lite\" ",
    "tsc": "tsc",
    "tsc:w": "tsc -w",
    "lite": "lite-server",
    "typings": "typings",
    "postinstall": "typings install"
  },
  ...

なお、tscコマンドはTypeScriptのコンパイルコマンドだけど、ターミナルから使うにはnode_modules/bin以下をPATHに通さなければいけないとのこと。


ここから、TypeScript用の設定が開始。
typings.jsonを作成。

node_modules/.bin/typings init
node_modules/.bin/typings install -AS es6-shim jasmine

(´-`).。oO(lodashとか使いたい時はここに型定義ファイルをインストール忘れずに)

tsconfig.jsonを新規作成。

node_modules/.bin/tsc --init

tsconfig.jsonを下記のように書き換える。

{
  "compilerOptions": {
    "target": "es5",
    "module": "system",
    "moduleResolution": "node",
    "sourceMap": true,
    "emitDecoratorMetadata": true,
    "experimentalDecorators": true,
    "removeComments": false,
    "noImplicitAny": false
  },
  "exclude": [
    "node_modules",
    "typings/main",
    "typings/main.d.ts"
  ] 
}

ここで大まかに環境設定は終了。
以下を実行し、cannot Get..みたいなものが出ればOK。

npm strat

ここからは、実際にindex.html、main.ts、home.ts ファイルを作成し、アプリケーション作成に取り掛かっていきました。

続きは、下記の書籍をご覧くださいw
インストールしたモジュールの説明なども記載してあり、この手順だけ実施して構築しても自分でカスタマイズできないと思うので。

シェルスクリプトマガジン vol.37

シェルスクリプトマガジン vol.37

  • 作者: 當仲寛哲,岡田健,佐川夫美雄,大岩元,松浦智之,後藤大地,白羽玲子,水間丈博,濱口誠一,すずきひろのぶ,花川直己,しょっさん,法林浩之,熊野憲辰,桑原滝弥,USP研究所,ジーズバンク
  • 出版社/メーカー: USP研究所
  • 発売日: 2016/04/25
  • メディア: 雑誌
  • この商品を含むブログを見る

FW 導入において、環境構築ではまるというのはあるあるなので、今回のハンズオン勉強会はとても勉強になりました。
メインで説明されていた酒巻さんも書籍に書いていない話も補足でしてくれたりして、勉強になりました。
また、Typoで失敗しないようにng-japanのSlackにコードを載せたり、質問者に佐川さんが丁寧に答えてしてくださったりしたおかげで、全員がサンプルを動かして帰られたように見えました。
スタッフさんのおかげで、ハンズオン勉強会としてのクオリティが高かったのえ、次回もぜひ参加いただきたいと思いました。
早速今日から、Angular2をいじってみているところです。

おまけ:
佐川さんもng-japanのSlackでつぶやいていましたが、下記を使えば簡単に環境構築できそうです。
先ほど、私も試してみましたが、手順通り実施し動きました。
GitHub - angular/quickstart: Angular 2 QuickStart - source from the documentation

Golangで、テニスの大会のエントリーページから、大会情報をクローリングしてくるサンプル

眼を怪我して、しばらくテニスできなくなったので、今後自分が作るサービスの部分的なソースこーどを公開します。

今回は題名にある通り、南市川テニスガーデンのテニス大会のエントリーページから、大会の情報をクローリングする。
クロールするためのライブラリはgoqueryを使用。
GitHub - PuerkitoBio/goquery: A little like that j-thing, only in Go.

今回、クロール対象のページ
minamiichikawa.jp


Webクロール版のサンプル

gist89ae9940e5371fc7e095c34828c4c400

スターティングGo言語 (CodeZine BOOKS)

スターティングGo言語 (CodeZine BOOKS)


プログラムを作成するにあたって、毎回クロールすると迷惑なので、以下のサンプルを使用し、一旦htmlをローカルにファイルとして書き込む。

クロールした内容をローカルファイルに書き込むサンプル。

gistf1ea3856683333c39e28ce736749749f

Go言語によるWebアプリケーション開発

Go言語によるWebアプリケーション開発


上記で、書き込んだファイルをクロール対象として、読み込むサンプル。

gist87cd2c357a24eb2d3241ca8b383f877b

参考にさせていただいたページ
mattn.kaoriya.net
qiita.com
qiita.com

改訂2版 基礎からわかる Go言語

改訂2版 基礎からわかる Go言語


テニス関係者の方
いつもお世話になっている南市川テニスガーデン。
大会も頻繁に開催しているので、ぜひご参加ください。
minamiichikawa.jp

(バボラ) Babolat RACKET HOLDER X 9 PURE AERO . BK/YL

(バボラ) Babolat RACKET HOLDER X 9 PURE AERO . BK/YL

Babolat(バボラ) プロチームSP×12(12本入) ホワイト 003 BA654006

Babolat(バボラ) プロチームSP×12(12本入) ホワイト 003 BA654006

【書評】Javaポケットリファレンス( @yyamada ) 

今回もWINGSプロジェクト様( @yyamada )の書籍レビュアーに応募させていただき書評を書かせていただくことになりました。
WINGSプロジェクトの皆様、著者の山田様ありがとうございます。
今回は表題にもある以下のURLの書籍を献本していただきましたので、こちらのレビューをさせていただきます。

[改訂新版]Javaポケットリファレンス

[改訂新版]Javaポケットリファレンス

レビューアの私の前提としては、Javaの経験としては4年になります。普段はJavaで広告配信のシステムを開発しています。
また、現在の現場ではJava8も実戦投入済みで、追加されたラムダ式やStreamについては学んでいる最中です。

ここから書籍レビューに入らせていただきます。
1か月ちょっと現場で使ってみましたが、Java8で追加された機能も踏まえた上で、実現したい機能についてすぐに調べられるということですごく活用できました。

また、StreamやDateTimeAndAPI、定義済みの関数型インターフェース(Supplier、Consumer、Predicate、Function、Operatorなど)が一覧に載ってあることも、現場で使用した時には役に立ちました。
Java7、8で追加された箇所についてもわかりやすくなっているのもポイント高いです。
スレッド処理に関しても引けるリファレンスがたくさんあり、コードを読む際に役に立ちました。
加えて、現場では Apache CommonsやGuava、Joda-Timeを使っているのですが、Java8が投入されてからは可能であれば、標準APIで書くことをプロジェクトで行っているので、そういう意味ではこのリファレンスは活用できました。

Optionalの扱いについては、1リファレンスしかなかったのですが、もう少し記載があっても良かったかなと思います。
例えば、チームで過去にはまったパターンだと、orElseメソッドでも値がある場合でも、引数に渡した関数が評価されてしまい、その引数に渡した関数は値がない場合にはNPEが発生してしまう問題が起こりました。
上記のような場合には、orElseGetメソッドを使用して、引数に渡した関数を遅延評価するようにし、値がある場合には引数に渡した関数を評価しないといった方法があります。
上記のような事例はあまりないかもしれませんが、重たい処理を行う場合についてはorElseGetメソッドを使用する等の記載があると良かったと思います。
ちなみに用途として、orElseを使う場面は値を引数で渡した時のみで、関数は渡さないというのが一つのプラクティスな気がします。
参考記事
Optionalから値を取り出すにはorElseGet()を使う

また、少し欲を言えば、定義済みの関数型インターフェースに関しては、もう少しサンプルを記載してあるページがあれば嬉しかったです。
(リファレンス上、難しいのかもしれませんが。。)

Columnに関しては、初心者に関しても優しいもの(「文字列の等価演算子」など)も扱っている中で、「並列と並行の違い」も取り扱っていて、最近の話題となるトピックも押さえているなという印象でした。
また、並列と並行の違いに関しては、今年のDevsumiでセッションがあり、関心度が高いテーマとも言えます。
【19-C-7】Webエンジニアのための並行/非同期プログラミングの実際とこれから
codezine.jp

以上、レビューとさせていただきます。

最後に目次も紹介させていただきます。
以下のページから引用させていただきました。
[改訂新版]Javaポケットリファレンス - WINGS

Chapter1 Javaを始めるために
Javaとは
  Javaの概況
  Javaの構造
  バージョン履歴
プログラミングの準備
  開発環境
  統合開発環境Eclipseのインストール方法
最初のJavaプログラミング
  Eclipseの使い方
  プログラムの作成・実行手順
  コンパイルと実行
Javaアプリケーションの基本
  ソースファイルの構成要素
  主要な公式ドキュメント
Chapter2 基本文法
データ型と変数
  データ型の種類
  リテラル
  エスケープシーケンス
  変数
  変数のスコープ
演算子
  演算子
  インクリメント/デクリメント演算子
  算術演算子
  代入演算子
  複合代入演算子
  ビット演算子
  関係演算子
  論理演算子
  条件演算子
基本構文
  コメントを記述する
  パッケージを宣言する
  パッケージをインポートする
  型を変換(キャスト)する
  変数を宣言する
  定数を宣言する
  配列を宣言する
  列挙型(enum)を宣言する
  処理を分岐する
  COLUMN ブロック
  複数の条件で処理を分岐する
  処理を繰り返す
  処理を繰り返す(ループ後に条件判定)
  決まった回数の処理を繰り返す
  決まった回数の処理を繰り返す(拡張for文)
  ループを脱出する/先頭に戻る
クラス
  クラスを定義する
  メソッドを定義する
  インスタンスを生成する
  クラスのメンバにアクセスする
  コンストラクタを定義する
  COLUMN this
  初期化子を定義する
  静的メンバを定義/利用する
  クラスを継承する
  スーパークラスコンストラクタを実行する
  オーバーライドを定義/禁止する
  可変長引数を定義する
  アクセス制御する
  抽象メソッド/クラスを定義する
  インターフェイスを定義する
  インターフェイスで静的メソッド/デフォルトメソッドを定義する[8]
  COLUMN インターフェイスのmainメソッド
  内部クラスを定義する
  無名クラスを定義する
例外処理
  例外処理を定義する
  複数の例外をまとめてキャッチする[7]
  try-with-resources構文でリソースを確実に閉じる[7]
  例外処理を呼び出し側に任せる
  例外を任意に発生させる
アノテーション
  標準アノテーションを利用する
  独自のアノテーションを利用する
ジェネリック
  ジェネリックスでクラスを定義する
  変数型を制限する
  変数型にワイルドカードを利用する
  ジェネリックスでメソッドを定義する
  ダイヤモンド演算子を使ってインスタンスを生成する[7]
ラムダ式
  ラムダ式を記述する[8]
  関数型インターフェイスを定義する[8]
  メソッド参照を利用する[8]
コマンドラインツール
  Javaプログラムをコンパイルする
  Javaプログラムを実行する
  JARファイルを作成/管理する
  APIドキュメントを作成する
Chapter3 基本API
概要
文字列操作
  文字列クラスを生成する ― Java.lang.String
  COLUMN 文字列の等価演算子
  文字列に含まれる文字を検索する ― Java.lang.String
  文字列の長さを取得する ― Java.lang.String
  文字列に含まれる文字コードを取得する ― Java.lang.String
  文字列のインデックスを取得する ― Java.lang.String
  文字列の連結を行う ― Java.lang.String
  区切り文字を指定して文字列の連結を行う[8] ― Java.lang.String
  文字列の置換を行う ― Java.lang.String
  文字列を分割する ― Java.lang.String
  文字列の空白除去を行う ― Java.lang.String
  COLUMN 全角スペースのトリム
  文字列が指定された接尾辞/接頭辞を持つか調べる ― Java.lang.String
  文字列の大文字/小文字を変換する ― Java.lang.String
  文字列を比較する ― Java.lang.String
  文字列の一部分を取得する ― Java.lang.String
  可変長文字列(文字列バッファ)を生成する ― Java.lang.StringBuilder、StringBuffer
  文字列バッファに文字を設定する ― Java.lang.StringBuilder、StringBuffer
  COLUMN StringJoinerクラス
  文字列バッファを検索する ― Java.lang.StringBuilder、StringBuffer
  文字列バッファの長さを取得/設定する ― Java.lang.StringBuilder、StringBuffer
  文字列バッファに含まれる文字コードを取得する ― Java.lang.StringBuilder、StringBuffer
  文字列バッファのインデックスを取得する ― Java.lang.StringBuilder、StringBuffer
  値を文字列に変換する ― Java.lang.String
  文字列バッファに追加する ― Java.lang.StringBuilder、StringBuffer
  文字列バッファを削除する ― Java.lang.StringBuilder、StringBuffer
  文字列バッファに挿入する ― Java.lang.StringBuilder、StringBuffer
  文字列バッファを置換する ― Java.lang.StringBuilder、StringBuffer
  文字列バッファを逆順にする ― Java.lang.StringBuilder、StringBuffer
  COLUMN 文字列クラスのインスタンス
  文字列バッファの容量を操作する ― Java.lang.StringBuilder、StringBuffer
  文字列バッファを配列にコピーする ― Java.lang.StringBuilder、StringBuffer
  文字列バッファの一部を取得する ― Java.lang.StringBuilder、StringBuffer
数値演算
  絶対値を求める ― Java.lang.Math
  どちらか大きい/小さい値を取得する ― Java.lang.Math
  数値の切り上げ/切り捨て/四捨五入を行う ― Java.lang.Math
  平方根/立方根を求める ― Java.lang.Math
  指数関数を処理する ― Java.lang.Math
  対数を求める ― Java.lang.Math
  角度を変換する ― Java.lang.Math
  三角関数を求める ― Java.lang.Math
  符号要素を求める ― Java.lang.Math
ラッパークラス
  文字列から数値型のオブジェクトを生成する ― Java.lang.Boolean、Byte、Double、Float、Integer、Long、Short
  文字列から数値型のオブジェクトを生成する(基数指定) ― Java.lang.Boolean、Byte、Double、Float、Integer、Long、Short
  指定されたデータ型のオブジェクトを生成する ― Java.lang.Boolean、Byte、Double、Float、Integer、Long、Short
  指定された文字列から各データ型の値を取得する ― Java.lang.Byte、Double、Float、Integer、Long、Short
  文字の種類を変換する ― Java.lang.Character
  指定した基数で数値/文字を解析する ― Java.lang.Character
  Optionalクラスで安全にnullを扱う[8] ― Java.util.Optional
オブジェクト操作
  オブジェクトのクローンを生成する ― Java.lang.Object
  オブジェクトを比較する ― Java.lang.Object
  オブジェクトを文字列として取得する ― Java.lang.Object
  クラス名からクラスのインスタンスを取得する ― Java.lang.Class
  関連クラスを取得する ― Java.lang.Class
  クラスに関連する情報を取得する ― Java.lang.Class
  どのようなオブジェクトか調べる ― Java.lang.Class
例外処理
  例外を定義する ― Java.lang.Exception
  例外メッセージ文字列を取得する ― Java.lang.Throwable
  スタックトレース情報を取得する ― Java.lang.Throwable
  例外となった原因を取得する ― Java.lang.Throwable
  スタックトレース情報を分割する ― Java.lang.Throwable
  スタックトレースの要素を取得する ― Java.lang.StackTraceElement
スレッド処理
  スレッドの実行内容を定義する ― Java.lang.Thread
  スレッドを待機させる ― Java.lang.Object
  スレッドをスリープさせる ― Java.lang.Thread
  スレッドを再開させる/スレッドの終了を待機する ― Java.lang.Object、 ― Java.lang.Thread
  スレッドを一時停止させる/スレッド処理に割り込む ― Java.lang.Thread
  スレッドを開始する ― Java.lang.Thread
  COLUMN 平行と並列の違い
  スレッド名/スレッドの優先順位を取得/設定する ― Java.lang.Thread
  スレッドのスタックトレースを取得する ― Java.lang.Thread
  スレッドの状態を列挙型で取得する ― Java.lang.Thread
  スレッドの状態を調べる ― Java.lang.Thread
  アクティブなスレッドやその数を取得する ― Java.lang.Thread
スレッド処理(Concurrency Utilities)
  スレッドの結果を返す ― Java.util.concurrent.Callableインターフェイス
  スレッドの結果を取得する ― Java.util.concurrent.Futureインターフェイス
  スレッドをロックする ― Java.util.concurrent.locks.ReentrantLock
  スレッドプールを生成する ― Java.util.concurrent.Executors
  スレッドを使いまわすava.util.concurrent.ExecutorService
  スケジュール可能なスレッドを生成する ― Java.util.concurrent.Executors
  一定周期のタスクを実行する ― Java.util.concurrent.ScheduledExecutorService
  一定間隔のタスクを実行する ― Java.util.concurrent.ScheduledExecutorService
  スレッドからアトミックに変数を操作する ― Java.util.concurrent.atomic.AtomicInteger
日付
  エポックからの時間を設定/取得する ― Java.util.Date
  日付データを文字列として取得する ― Java.util.Date
  日付データを比較する ― Java.util.Date
  Calendarオブジェクトを取得する ― Java.util.Calendar
  GregorianCalendarを使用する ― Java.util.GregorianCalendar
  日付データを取得/設定する ― Java.util.Calendar
  日付データをクリアする ― Java.util.Calendar
  日付データを操作する ― Java.util.Calendar
  現在時刻を設定/取得する ― Java.util.Calendar
  Calendarオブジェクトの設定を取得する ― Java.util.Calendar
  Calendarオブジェクトの最大/最小値設定を取得する ― Java.util.GregorianCalendar
  日付データを比較する ― Java.util.Calendar、 ― Java.util.GregorianCalendar
日付(Date and Time API
  現在日時を取得する[8] ― Java.time.LocalDateTime、Java.time.OffsetDateTime、Java.time.ZonedDateTime
  特定の日時を設定する[8] ― Java.time.LocalDateTime、Java.time.OffsetDateTime、Java.time.ZonedDateTime
  日時の各要素を取得する[8] ― Java.time.LocalDateTime、Java.time.OffsetDateTime、Java.time.ZonedDateTime
  日時データをフォーマットするオブジェクトを取得する[8]Java.time.format.DateTimeFormatter
  日時データをフォーマットする[8] ― Java.time.LocalDateTime、Java.time.OffsetDateTime、Java.time.ZonedDateTime
  文字列から新しい日時オブジェクトを生成する[8] ― Java.time.LocalDateTime、Java.time.OffsetDateTime、Java.time.ZonedDateTime
  日時データを演算する[8] ― Java.time.LocalDateTime、 ― Java.time.OffsetDateTime、Java.time.ZonedDateTime
  日時データを比較する[8] ― Java.time.LocalDateTime、 ― Java.time.OffsetDateTime、Java.time.ZonedDateTime
  Dateオブジェクトを新しい日時オブジェクトに変換する[8] ― Java.time.LocalDateTime、Java.time.OffsetDateTime、Java.time.ZonedDateTime
  新しい日時オブジェクトをDateオブジェクトに変換する[8] ― Java.time.LocalDateTime、Java.time.OffsetDateTime、Java.time.ZonedDateTime
ロギング
  ロガーを作成する ― Java.util.logging.Logger
  ログを簡易メソッドで出力する ― Java.util.logging.Logger
  ログのハンドラを登録/削除/取得する ― Java.util.logging.Logger
  ログを出力する ― Java.util.logging.Logger
  COLUMN 期間を表すクラス
Chapter4 コレクション
概要
Collection
  コレクションに要素を追加する ― Java.util.Collectionインターフェイス
  コレクションの要素を削除する ― Java.util.Collectionインターフェイス
  コレクションの要素を選別する ― Java.util.Collectionインターフェイス
  コレクションの要素の状態を調べる ― Java.util.Collectionインターフェイス
  コレクションと等しいか判定する ― Java.util.Collectionインターフェイス
  要素の数を取得する ― Java.util.Collectionインターフェイス
  イテレータを取得する ― Java.util.Collectionインターフェイス
  コレクションの要素を配列として取得する ― Java.util.Collectionインターフェイス
List
  リストに追加する ― Java.util.Listインターフェイス
  リストの要素を削除する ― Java.util.Listインターフェイス
  リストの要素を設定する ― Java.util.Listインターフェイス
  リストの要素/部分ビューを取得する ― Java.util.Listインターフェイス
  要素を検索する ― Java.util.Listインターフェイス
  双方向イテレータを取得する ― Java.util.Listインターフェイス
Set
  セットの要素を追加する ― Java.util.Setインターフェイス
  ソートセットの一部をビューとして取得する ― Java.util.SortedSetインターフェイス
  ソートセットの最初/最後の要素を取得する ― Java.util.SortedSetインターフェイス
  ソートセットに関連したコンパレータを取得する ― Java.util.SortedSetインターフェイス
Map
  マップの要素を設定/追加/削除する ― Java.util.Mapインターフェイス
  マップの要素を取得する ― Java.util.Mapインターフェイス
  マップからすべてのキー/値/マップエントリを取得する ― Java.util.Mapインターフェイス
  マップの要素の状態を調べる ― Java.util.Mapインターフェイス
  マップの最初/最後のキーを取得する ― Java.util.SortedMapインターフェイス
  マップの部分ビューを取得する ― Java.util.SortedMapインターフェイス
  マップエントリのキーまたは値を取得/設定する ― Java.util.Map.Entryインターフェイス
Queue
  キューに要素を追加する ― Java.util.Queueインターフェイス
  キューの要素を取得して削除する ― Java.util.Queueインターフェイス
  キューの要素を参照する ― Java.util.QueueインターフェイスDeque
  両端キューに要素を追加する ― Java.util.Dequeインターフェイス
  両端キューの要素を取得して削除する ― Java.util.Dequeインターフェイス
  両端キューの要素を参照する ― Java.util.Dequeインターフェイス
  両端キューをスタックとして使用する ― Java.util.Dequeインターフェイス
  指定した要素のうち最初/最後に出現したものを削除する ― Java.util.Dequeインターフェイス
イテレータ
  コレクションの要素を判定する ― Java.util.Iteratorインターフェイス
  コレクションの要素をイテレータから取得する ― Java.util.Iteratorインターフェイス
  イテレータから要素を削除する ― Java.util.Iteratorインターフェイス
  コレクションの要素のインデックスを取得する ― Java.util.ListIteratorインターフェイス
  前の要素を判定する ― Java.util.ListIteratorインターフェイス
  前の要素を取得する ― Java.util.ListIteratorインターフェイス
  イテレータから要素を追加/設定する ― Java.util.ListIteratorインターフェイス
コレクション操作
  コレクションを同期化する ― Java.util.Collections
  変更不可能なコレクションを作成する ― Java.util.Collections
配列操作
  配列からリストのビューを作成する ― Java.util.Arrays
  配列をバイナリサーチで検索する ― Java.util.Arrays
  配列をソートする ― Java.util.Arrays
  配列をコピーする ― Java.util.Arrays
  範囲を指定して配列をコピーする ― Java.util.Arrays
Stream
  コレクションからStreamを生成する[8]Collectionインターフェイス
  配列からStreamを生成する[8] ― Java.util.Arrays
  要素を指定してStreamを生成する[8] ― Java.util.stream.Stream
  Streamを結合する[8] ― Java.util.stream.Stream
  無限の長さのStreamを生成する[8] ― Java.util.stream.Stream
  Streamの要素をフィルタリングする[8] ― Java.util.stream.Stream
  Streamの要素をソートする[8] ― Java.util.stream.Stream
  Streamの要素を変換する[8] ― Java.util.stream.Stream
  Streamの要素を繰り返して処理する[8] ― Java.util.stream.Stream
  Streamの要素数を取得する[8] ― Java.util.stream.Stream
  Streamの要素の最大・最小・合計・平均を取得する[8] ― Java.util.stream.Stream
  Streamの要素が条件に合致するかを判定する[8] ― Java.util.stream.Stream
  Streamをコレクションオブジェクトに変換する[8] ― Java.util.stream.Stream
Chapter5 入出力(I/O)
概要
ファイルシステム
  ファイルやディレクトリを取得する ― Java.io.File
  ファイルやディレクトリの属性を取得する ― Java.io.File
  ファイルやディレクトリのURIを取得する ― Java.io.File
  ファイルやディレクトリを変更する ― Java.io.File
  ファイルを生成する ― Java.io.File
  COLUMN ラムダ式で外部の変数を使う
  ファイルやディレクトリを削除する ― Java.io.File
  ディレクトリを生成する ― Java.io.File
  ファイル名のフィルタを設定する ― Java.io.FilenameFilter
  ファイルのフィルタを設定する ― Java.io.FileFilter
  ファイルのリストを取得する ― Java.io.File
  ディスク領域を取得する ― Java.io.File
  ファイルのアクセス権を設定する ― Java.io.File
テキストファイル入出力
  テキストファイルの入力ストリームを生成する ― Java.io.FileReader
  テキストファイルの出力ストリームを生成する ― Java.io.FileWriter
  文字データ(単一/配列)を読み取る ― Java.io.FileReader
  文字データ(単一/配列)を書き込む ― Java.io.FileWriter
  1行単位でデータを読み取る ― Java.io.BufferedReader
  1行単位でデータを書き込む ― Java.io.BufferedWriter
  文字列の入力ストリームを生成する ― Java.io.StringReader
  文字列の出力ストリームを生成する ― Java.io.StringWriter
  各データ型の値を文字ストリームに出力する ― Java.io.PrintWriter
  書式付きで文字ストリームに出力する ― Java.io.PrintWriter
  テキスト入力の行番号を取得する ― Java.io.LineNumberReader
  テキスト入力の行番号を設定する ― Java.io.LineNumberReader
  バイトストリームから文字ストリームに変換する ― Java.io.InputStreamReader
  文字ストリームをバイトストリームに書き込む ― Java.io.OutputStreamWrite
バイナリファイル入出力
  バイナリファイルの入力ストリームを生成する ― Java.io.FileInputStream
  バイナリファイルの出力ストリームを生成する ― Java.io.FileOutputStream
  データを読み取る ― Java.io.InputStream
  データを書き込む ― Java.io.OutputStream
  バイトストリームを操作する ― Java.io.InputStream
  指定したデータを書き込む ― Java.io.DataOutputStream
  指定したデータを読み取る ― Java.io.DataInputStream
  各データ型の値をバイトストリームに出力する ― Java.io.PrintStream
バイト配列/文字配列の入出力
  バイト配列の入力ストリームを生成する ― Java.io.ByteArrayIntputStream
  バイト配列の出力ストリームを生成する ― Java.io.ByteArrayOutputStream
  文字配列の入力ストリームを生成する ― Java.io.CharArrayReader
  文字配列の出力ストリームを生成する ― Java.io.CharArrayWriter
新しいファイルシステム(New I/O 2)
  デフォルトのファイルシステムを取得する[7] ― Java.nio.file.FileSystems
  Pathオブジェクトを生成する[7] ― Java.nio.file.FileSystems
  Pathオブジェクトからファイルを生成する[7] ― Java.nio.file.Files
  ディレクトリを生成する[7] ― Java.nio.file.Files
  ファイルやディレクトリを削除する[7] ― Java.nio.file.Files
  一時ディレクトリ/ファイルを作成する[7] ― Java.nio.file.Files
  COLUMN  ― Java.nio.?le.Filesクラスのその他のメソッド
  ファイルのリストを取得する[8] ― Java.nio.file.Files
  ファイルをコピー/移動する[7] ― Java.nio.file.Files
  ファイルを一度に読み込む[7] ― Java.nio.file.Files
  テキストファイルを一行ずつ読み込む[8] ― Java.nio.file.Files
  ファイルにテキスト/バイナリを書き込む[7] ― Java.nio.file.Files
さまざまな入出力
  パイプを使った入力ストリームを作成する(バイトデータ) ― Java.io.PipedInputStream
  パイプを使った出力ストリームを作成する(バイトデータ) ― Java.io.PipedOutputStream
  パイプを使った入力ストリームを作成する(文字データ) ― Java.io.PipedReader
  パイプを使った出力ストリームを作成する(文字データ) ― Java.io.PipedWriter
  ファイルの読み書きを任意の位置で行う ― Java.io.RandomAccessFile
  ファイルの読み書きを始める位置を取得/設定する ― Java.io.RandomAccessFile
  ファイルのサイズを操作する ― Java.io.RandomAccessFile
  コンソールクラスを用いてエコーなしで入力する ― Java.io.Console
  オブジェクトを読み取る ― Java.io.ObjectInputStream
  オブジェクトを書き込む ― Java.io.ObjectOutputStream
チャネル用バッファ操作
  バッファの位置を操作する ― Java.nio.Buffer
  バッファから読み取る ― Java.nio.CharBuffer
  バッファに書き込む ― Java.nio.CharBuffer
  さまざまなバッファを生成する ― Java.nio.CharBuffer
  バッファの情報を取得する ― Java.nio.CharBufferr
  ファイルのチャネルの読み書きをする ― Java.nio.channels.FileChannel
  ファイルのチャネルを操作する ― Java.nio.channels.FileChannel
  COLUMN ファイルの変更を監視する
Chapter6 ネットワーク
概要
IPアドレス
  生のIPアドレスを取得する ― Java.net.InetAddress
  ホスト名/ドメイン名を取得する ― Java.net.InetAddress
  ホスト名からIPアドレスに変換する ― Java.net.InetAddress
  ローカルホストを取得する ― Java.net.InetAddress
  指定のアドレスに到達可能かテストする ― Java.net.InetAddress
  ネットワークインターフェイスを取得する ― Java.net.NetworkInterface
  ネットワーク・パラメータを取得する ― Java.net.NetworkInterface
  インターフェイスの状態を取得する ― Java.net.NetworkInterface
URL
  URL接続オブジェクトを取得する ― Java.net.URL
  URL接続からリンクを確立する ― Java.net.URLConnection
  タイムアウトを設定/取得する ― Java.net.URLConnection
  接続先の情報を取得する ― Java.net.URLConnection
  URLの情報を取得する ― Java.net.URL
  URL接続の入出力ストリームを取得する ― Java.net.URLConnection
  URL接続の入力ストリームを取得する ― Java.net.URL
  URIからURLに変換する ― Java.net.URI
  URLからURIに変換する ― Java.net.URL
ソケット通信
  サーバ側のTCP/IPソケットを操作する ― Java.net.ServerSocket
  クライアント側のTCP/IPソケットを操作する ― Java.net.Socket
  UDPソケットを操作する ― Java.net.DatagramSocket
  サーバ側のソケットのチャネルを操作する ― Java.net.ServerSocketChannel
  ソケットのチャネルを操作する ― Java.net.SocketChannel
  ノンブロッキングのサーバソケットを操作する[7] ― Java.nio.channels.AsynchronousServerSocketChannel
  ノンブロッキングのソケットチャネルを操作する[7] ― Java.nio.channels.AsynchronousServerSocketChannel
Chapter7 データベース
概要
データベース接続
  JDBCドライバをロードする ― Java.lang.Class
  データベースに接続する ― Java.sql.DriverManager
  接続のタイムアウトを取得/設定する ― Java.sql.DriverManager
  データベースから切断する ― Java.sql.Connection
  SQL文を実行するオブジェクトを生成する ― Java.sql.Connection
  COLUMN MariaDBJDBCドライバ
  パラメータ付きSQL文を実行するオブジェクトを生成する ― Java.sql.Connection
  ストアドプロシージャを実行するオブジェクトを生成する ― Java.sql.Connection
トランザクション処理
  トランザクションをコミット/ロールバックする ― Java.sql.Connection
  自動的にコミットするように設定する/設定されているか調べる ― Java.sql.Connection
  トランザクションのレベルを取得/設定する ― Java.sql.Connection
SQL文の発行
  結果セットを返すSQL文を発行する ― Java.sql.Statement
  複数の結果セットを返すSQL文を発行する ― Java.sql.Statement
  結果を返さないSQL文を発行する ― Java.sql.Statement
  複数の処理をまとめて実行する ― Java.sql.Statement
  結果セットに関する情報を取得/設定する ― Java.sql.Statement
  パラメータに値を設定する ― Java.sql.PreparedStatement
  パラメータにNULLを設定する ― Java.sql.PreparedStatement
  パラメータに日付や時刻を設定する ― Java.sql.PreparedStatement
クエリの結果処理
  指定した列のデータを取得する ― Java.sql.ResultSet
  指定した列の日付時刻を取得する ― Java.sql.ResultSet
  レコードを更新する ― Java.sql.ResultSet
  NULLデータで更新する ― Java.sql.ResultSet
  カーソルを移動させる ― Java.sql.ResultSet
  レコードを挿入する ― Java.sql.ResultSet
  レコードを削除する ― Java.sql.ResultSet
  カーソルの性質を調査する ― Java.sql.ResultSet
  COLUMN  ― Java SE 8でコレクションに追加されたメソッド
Chapter8 ユーティリティ
概要
プロパティ
  プロパティファイルを利用する ― Java.util.Properties
  XML形式のプロパティファイルを利用する ― Java.util.Properties
  システムプロパティを取得する ― Java.lang.System
乱数
  擬似乱数を生成する ― Java.util.Random
  擬似乱数のシードを設定する ― Java.util.Random
ロケール
  ロケールの情報を取得する ― Java.util.Locale
  ファイルからリソースバンドルを取得する ― Java.util.ResourceBundle
  クラスからリソースを取得する ― Java.util.ListResourceBundle
  和暦ロケールを利用する ― Java.util.Locale
圧縮/解凍
  データを圧縮する ― Java.util.zip.Deflater
  COLUMN 乱数
  データを解凍する ― Java.util.zip.Inflater
  ZIP形式で圧縮されたファイルを解凍する. ― Java.util.zip.ZipInputStream
  ZIP形式でファイルを圧縮する ― Java.util.zip.ZipOutputStream
テキストのフォーマッティング
  日付/時刻をフォーマットするオブジェクトを取得する ― Java.text.DateFormat
  日付/時刻をフォーマットする ― Java.text.DateFormat
  文字列から日付/時刻を生成する ― Java.text.DateFormat
  日付/時刻のフォーマットに関する情報を設定/取得する ― Java.text.DateFormat
  日付/時刻のフォーマットに必要なパターンを設定/取得する ― Java.text.SimpleDateFormat
  数値/通貨をフォーマットするオブジェクトを取得する ― Java.text.NumberFormat
  数値をフォーマットする ― Java.text.NumberFormat
  文字列から数値を生成する ― Java.text.NumberFormat
  数値/通貨のフォーマットに関する情報を設定/取得する ― Java.text.NumberFormat
  数値の桁に関する情報を取得/設定する ― Java.text.NumberFormat
  数値のフォーマットに必要なパターンを設定/取得する ― Java.text.DecimalFormat
  数値の丸め処理に関する情報を取得/設定する ― Java.text.DecimalFormat
  メッセージをフォーマットするために必要なパターンを設定/取得する ― Java.text.MessageFormat
  メッセージをフォーマットする ― Java.text.MessageFormat
  文字列からオブジェクトの配列を生成する ― Java.text.MessageFormat
  文字列解析のエラー位置を取得する ― Java.text.ParsePosition
正規表現
  正規表現のパターンを作成する ― Java.util.regex.Pattern
  マッチ処理を行う ― Java.util.regex.Matcher
  マッチした文字シーケンスの処理を行う ― Java.util.regex.Matcher
外部プロセスの制御
  外部コマンドを実行する ― Java.lang.Runtime
  新規プロセスを起動する ― Java.lang.ProcessBuilder
Compiler API
  Java Compilerインスタンスを取得する ― Javax.tools.ToolProvider
  コンパイルする ― Javax.tools.ToolProvider
スクリプティング
  対応するスクリプトエンジンを調べる ― Javax.script.ScriptEngineManager
  スクリプトを実行する ― Javax.script.ScriptEngine
  COLUMN Date and Time APIでの和暦サポート

Golangで、MessagePackを使い、Redisに書き込み/読み込みをする

下記の書籍の4章のsprinkleを写経中に思い付いたので、やってみた。

Go言語によるWebアプリケーション開発

Go言語によるWebアプリケーション開発

ライブラリ選定基準は、スターの数やQiitaの記事を参考に選んだ。

Redisへの接続ライブラリはRedigoを使用。
github.com

MessagePackのEncode/Decodeライブラリはugorji/goを使用。
github.com



gistd128d68f44244454940699213ae89ca0


スターティングGo言語 (CodeZine BOOKS)

スターティングGo言語 (CodeZine BOOKS)

改訂2版 基礎からわかる Go言語

改訂2版 基礎からわかる Go言語