エンターテイメント!!

遊戯王好きのJavaエンジニアのブログ。バーニングソウルを会得する特訓中。

平成29年度データベーススペシャリスト対策まとめ

データモデル

概念データモデル

ユーザの要件定義に基づいて作成。
使用するDBMSに依存しない。
E-R図が該当する。

論理データモデル

概念データモデルを使用するDBMSの種類を前提に、再整理したデータモデル。
階層・ネットワーク・関係モデルが該当。

物理データモデル

DBMS固有のデータ構造や格納する型を前提に、詳細に定義したデータモデル。
テーブル定義表、インデックスなど。

ERD(ER図)

概念データモデルを表現する図形。
エンティティを表す四角形と、関係を表す矢印・直線を使用する。

インスタンス

エンティティの内容に沿った実データのこと

主キー

インスタンスを一意に識別できる属性の組み合わせ。
ERD上では、下線を引いて主キーを示す。
主キーが複数の属性からなる場合、複合キー・連結キーということがある。
主キーには下記の制約がある。

制約名 内容
一意性制約 エンティティ内に1つ(もしくは、1くみ)しか存在しない組み合わせであること。UNIQUE制約とも言う
非NULL制約 値がNULLではないこと(そのまんまやないかい!)

リレーションシップ

エンティティ間のインスタンスの数の対応関係のこと。

  • 1:1
  • 1:多(多:1)
  • 多:多

上記表現は、カーディナリティ、デグリー、多重度という。
なるべく1:1の関係になるように心がける。
また、それを目指して複雑なテーブル設計にならないようにする。 多:多は、必ず避ける。 なぜならば、未完成の設計に該当するため。
回答する場合は、多:多の関係を書いたら、必ず減点されるので注意

外部キー

あるエンティティの属性が、他のエンティティの主キーを参照する属性のこと。
エンティティでは、破線の下線で表現する。 主キーと外部キーの関係は、ほぼ1:多の関係になる。

連関エンティティ

多:多の関係にあるエンティティ間の間に存在するエンティティのこと。
お互いの主キーの組み合わせのエンティティになる。

スーパータイプとサブタイプ

汎化

複数のエンティティに共通する属性・属性値を、1つのエンティティにまとめること。

スーパータイプ

汎化した結果の共通項目のエンティティ。
スーパータイプとサブタイプの主キーは、ほぼ一致する。

サブタイプ

汎化した結果、残った属性のエンティティ

排他的サブタイプ

スーパータイプのインスタンスができたとき、複数あるサブタイプのエンティティのうち、どれか1つだけインスタンスが生成される関係のこと。 スーパータイプに、サブタイプを区別する属性を持つことが一般的。
ほとんどのサブタイプは、排他的サブタイプに該当する。

共存的サブタイプ

スーパータイプのインスタンスができたとき、全サブタイプのインスタンスが生成される可能性がある関係のこと。
スーパータイプにサブタイプの数だけ区分を持つ必要がある。

関係データモデル

関係モデル

行・列の2次元表のデータ構造で表記。

候補キー

データを一意に特定できる極小な属性群のこと。
NULLも許容する。

主キー

候補キーの中から選ぶ。
非NULLでなければならない。

非キー属性

候補キー以外のキー

代理キー

候補キーで、主キーの以外の属性のこと。

関数従属性

ある属性が決まると、他の属性も一意に決まる性質をもつ属性のこと。
1つの関係をもつX,Y間で、Xの属性が決まるとYも決まるとき、YはXに関数従属するという。
Xは、決定項。Yは、非決定項という。
決定項と非決定項は、多:1の関係になる。

正規化

データベースから冗長性を排除すること。

正規化用語

完全関数従属性

非キー属性が、候補キーを構成する全ての属性に関数従属している。
候補キーの属性が1つのみの場合は、他の属性は全て完全関数従属している。
候補キーの属性が2つ以上の場合、全て決まると値がきまる属性を完全関数従属しているという。

部分関数従属

候補キーの属性が2つ以上の場合で、候補キーの一部が決まると、データが一意になること。

推移的従属性

ある属性が決まると非キー属性の属性がきまり、さらにその非キー属性が別の非キー属性と一意になっている関係。

非正規系

1レコード内に、項目が複数ある属性が存在する状態。

第1正規系

繰り返し項目がない状態

第2正規形

非キー属性が、完全関数従属している状態にしなければいけない。
※非キー属性が部分関数従属していないこと。
部分関数従属の属性は、別テーブルに分ける。

第3正規形

非キー属性間で、推移的従属性が存在しないこと。

第4正規形

候補キーと非キー属性に多値従属性がない関係。

多値従属性

決定稿が決まると、複数の非決定項が決まること。

各正規化の判断基準

正規化 根拠
第1正規形 属性値に繰り返しがない
第2正規形 属性に繰り返しがなく、非キーがいずれも候補キーに対して完全従属している
第3正規形 属性に繰り返しがなく、非キーがいずれも候補キーに対して完全従属しており、候補キーと非キーに推移関数従属性がない

非正規化の問題点

DB更新時に異常が発生する

更新種類 問題内容
挿入 事前登録できない。もしくは、重複登録しなければいけない。
更新 重複更新しなければいけない。
削除 最後の行を削除すると、関係が失われる

関係代数

データの関係を定義する演算式。
下記の種類がある。

  • 集合演算
    • 直積
  • 関係演算
    • 射影
    • 選択
    • 結合

SQL

DB定義・操作を実行するために使用される言語。

データ定義

  • CREATE SCHEMA
    スキーマ作成
  • CREATE TABLE
    テーブル作成
  • CREATE VIEW
    ビュー作成
  • CREATE ROLLE
    権限作成
  • ALTER
    スキーマ・テーブル・ビュー定義の変更
  • DROP
    スキーマ・テーブル・ビューの削除
  • GRANT
    アクセス権限付与
  • REVOKE
    アクセス権限削除

データ操作

  • SELECT
  • INSERT
  • UPDATE
  • DELETE

SELECT

基本文法

SELECT 属性
FROM 表明
WHERE 条件
GROUP BY グループ化項目
HAVING グループ化後の抽出条件
ORDER BY ソート条件

属性に対する操作

DISTINCT

重複した行をまとめる

集合関数

  • MAX
  • MIN
  • AVG
  • SUM
  • COUNT

演算子の優先順位

優先順位 演算子
1 *, /
2 +, -
3 =, <>, <, >, <=, >=
4 IS NULL, IS NOT, LIKE, IN, BETWEEN
5 NOT
6 AND
7 OR

()をつければ、優先されて計算される。

特殊な操作

UNION

UNION, UNION ALL で和演算ができる。
UNION ALLで重複した行をまとめられる。

INTERSECT

積演算

EXCEPT

差演算

INSERT, UPDATE, DELETE

INSERTの基本文法

INSERT INTO テーブル名 (属性)
VALUES(値)

UPDATEの基本文法

UPDATE テーブル名
SET 列名 = 値, 列名 = 値
WHERE 条件

DELETEの基本文法

DELETE FROM テーブル
WHERE 条件

DDL

CREATE TABLE

CREATE TABLE テーブル名(
    列名 データ型 列制約,
    列名 データ型 列制約
    )

外部キーの更新・削除規則

動作 概要
NO ACTION 主キー側の行を削除・更新するとき、外部キー側に同じ値があれば、主キー側の更新・削除が拒否される。
CASCADE 主キー側が更新・削除される場合、外部キー側の同一値の値が更新・削除される。
SET DEFUALT 主キー側を削除するとき、外部キー側をデフォルト値に変える。
SET NULL 主キー側を削除するとき、外部キー側をNULLに設定する。

DBMS関連

トランザクション

トランザクション処理

データベースの更新・削除・参照などの複数の処理を1つにまとめること。

ACID特性

  • Atoromicity:原子性
    処理された/されてないのどちらかになること。
  • Consistency:一貫性
    データベースの状態が一貫していること。
  • Isolation:隔離性
    トランザクションの並列処理ができること。
  • Durability:耐久性
    トランザクション終了後、その後の障害に影響されずにデータを保持できること。

隔離性を満たさない現象

ロストアップデート

更新したはずのデータが更新される前に戻ってしまい、更新内容が消失する現象。

ダーティリード

ロールバック前のデータを読み取って、誤読してしまう現象。

ノンリピータブルリード

トランザクションが2回同じデータを読み取った時、別々の値を読み込んでしまう現象。

ファントムリード

トランザクションが2回以上、同一範囲のデータを読み取った時、最初の1回目はなかったデータを2回めで読み取ってしまうこと。

隔離性水準

トランザクションが別トランザクションが受ける影響の許容度。
下記種類が存在する。

隔離性水準 ダーティリード ノンリピータブルリード ファントムリード
Read Uncommitted あり あり あり
Read Committed なし あり あり
Repeatable Read なし なし あり
Serializable なし なし なし

排他制御

楽観法

書き込み時に更新の有無をチェックする。
ロックをしない。

時刻印法

時刻印を保持し、他のトランザクションと競合して内科を判定する。
ロックしてない。

ロック法

一定の制約があるロックを掛けて、更新を行う。
ロックする範囲を、行・ページ・テーブル・データベースから選べる。

ロックには、共有ロックと専有ロックがある。

デッドロック

トランザクションが互いに共有資源をロックし、ロック解除を待って処理が進まなくなる状態

防止

決められた順序に従って更新をさせる。

検知

2相ロック

更新時にロックを掛け、ロックを開放する際は、すべてのロックを開放する。
デッドロックは防げない。

障害回復機能

ログファイル

障害回復の準備として、ログファイルを出力する。
ログファイルが消失すると、復旧ができなくなる。
※試験は、ログファイルを消失しない暗黙のルールがある。

ログファイルは、更新前後に書き込まれる。
出力されるタイミングは、以下の通り。

操作 更新前ログ更新後ログ
データ挿入 なし | あり
データ更新 あり | あり
データ削除 あり | なし

WAL

ログは、更新前後ともにデータベースの更新より先に出力される方式。
理由は、ログファイルがデータベース更新後に出力できないと、復旧できなくなる可能性があるため。
それを回避するために、最初に出力する。

ロールバック

後退復旧。
障害が発生した時点から、更新前ログを使って、指定された時点に復旧する。

ロールフォワード

前進復旧。
バックアップからコピーされたテーブルに対し、更新後ログを使って、指定された時点に復旧する。

トランザクション障害

更新前ログを使って、後退復旧。

媒体障害

バックアップ・リストア、更新後ログでロールフォワード。

システム障害

電源断、OS障害、DBMS障害などでDBMSが動作しなくなった状態。
DBMSが停止するので、ログが出力されない。

分散データベース

遠隔地にあるデータベースをネットワークを使って連携させる。

透過性

名称 説明
アクセス透過性 同一法歩でアクセス
位置透過性 物理的な配置場所を意識しなくていい
移動透過性 格納サイトが変更されても影響がない
分割透過性 1つのデータが複数サイトに分割されても意識しなくていい
重複透過性 1つのデータが複数サイトで重複格納されても意識しなくていい
規模透過性 OSやアプリの影響を受けない
並行透過性 同時並行でデータベースの操作が行える

テーブル結合法

  • セミジョイン
    結合処理はサイトごと
  • 入れ子ループ法
    データを1行づつ送信
  • マージジョイン法(ソートマージ法)
    データを全行送信

表領域

物理的な格納領域

牽引

  • ユニーク牽引
    検索キーに該当するのは1行だけ
  • 非ユニーク牽引 検索キーに該当するのは複数行
  • クラスタ牽引
    検索キー順番と、検索キーに該当する行の物理的な並び順が一致
  • クラスタ牽引
    検索キー順番と、検索キーに該当する行の物理的な並び順が一致しない

午後問の解法テク

主キー・外部キーを見つける

問題に出てくるスキーマは未完成の状態。
そのため、関係名や属性名を見ながら主キー・外部キーのあたりをつけて、問題を読み進めながら特定する。

主キーになりそうな項目は、「〜番号」「〜コード」「〜区分」「〜ID」とかが多い。
この項目名が出てきたら、要注意。 また、主キーは一番最初に列挙されることが多い。
一番左に該当する項目は、要注意して確認すること。

問題文中に、「一意な」「識別される」の文言がある場合は、主キー確定。

多重度を見極める

多重度が曖昧に表現されていることが多い。
不明な場合は、多対多、1対多を想定して考える。

スーパータイプ・サブタイプに注目しておくこと。
区分、フラグが該当する事が多い。

隔離性水準の覚え方

分離レベル ダーティリード ノンリピータブルリード ファントムリード
Read Uncommitted
Read Committed
Repeatable Read
Serializable

◯:発生する
✕:発生しない

ダノフはシリコン
ダ:ダーティリード ノ:ノンリピータブルリード フ:ファントムリード (は) シ:serializable リ:repeatable read コ:read committed ン:read uncomitted

配置順序さえ間違えなければ、これで完璧!
あとは、わかりやすい○の配置なので、覚えられるハズ。

その他参考サイト

データベース研究室 – DATABASE LABO

データベーススペシャリストドットコム

情報処理試験まとめ/データベーススペシャリスト試験の勉強法まとめ - まとめwiki - アットウィキ

Firefox51 アップデート機能内容まとめ

提供開始日

2017 年 1 月 24 日

更新内容

公式サイト

詳しくは、公式サイト見たほうが正確

Firefox 51 for developers - Mozilla | MDN

使うだけの人は、リリースノート見たほうが分かりやすい。
※自分はこっち側なので、こっちの情報をまとめる

Firefox 51.0 リリースノート

目立った変更内容

  • パスワード保存ダイアログで保存前のパスワードを確認
  • URL バーにズームボタンが追加
  • GPU が搭載されていない環境での動画再生性能が向上
  • “submit” イベントが発生しない場面でも、パスワードを保存できる
  • 安全でない接続のログインページに対して警告を表示
  • FLAC (Free Lossless Audio Codec) の再生に対応
  • E10s の高速化

他にもあるけど、使う側で目につくのはこんなところか?
以下、気になった機能の感想と補足

URL バーにズームボタンが追加

100%以外の倍率にすると、アドレスバーに倍率が表示される。
そして、表示された倍率をクリックすると、100%に戻る。
今までは倍率がすぐにわからなかったため、変更したのか確認するのに手間がかかったが、簡単にできるようになった。

“submit” イベントが発生しない場面でも、パスワードを保存できる

毎回パスワード保存できる画面とできない画面があるのはなんで?って思っていたが、submitイベントをトリガーにしていたのか。。。。
初めて知った。
しかし、今回のバージョン対応されるから、知ったところで意味は薄い。
利便性は良くなりそう。

E10s の高速化

まだ、俺のブラウザはe10sに対応してないから、意味はないんだけどね。
確認の方法は、過去記事参照

suzaku-tec.hatenadiary.jp

対応されるまで待つしかないか。

TypeScriptでハマったこと インタフェース編

きっかけ

業務でTypeScriptを使っていたが、意味不明なエラーが出て、かなり悩んだ。

インタフェースの重複の問題

コード

問題になったコードとは異なるが、だいたい同じような感じ。

export interface testif1 <T1, T2>{
    value1: T1;
    value2: T2;
}

export interface testif1 <E1, E2>{
    value3: E1;
    value4: E2;
}

class Sample implements testif1<string, string> {

}

おきること

このコードだと、実際にコンパイルエラーになる。
Javaをやってきたら「何で?」って思うけど、エラーなのだ。
コンパイルエラーの原因は、インタフェースがマージされるため、宣言しなければいけない型が増える。

上記コードは、下記のインタフェースを実装するのと同じ。

export interface testif1 <T1, T2, E1, E2>{
    value1: T1;
    value2: T2;
    value3: E1;
    value4: E2;
}

対策

namespace使うなり、モジュール化する。
影響範囲が小さくなるようにすることが大切。

こんな状況に陥ることはレアケースだと思うが、知っている/知らないでは、ドツボにハマることがある。

mac os x の.bashrcの設定方法と反映方法

そもそも

初心者的なことが分かっていなかったのでメモ。
知っている人は、嘲り笑うがいい!

./bash~の種類

~/.bash_profile

ユーザ単位の設定ファイル。
あれば読み込まれる。

~/.bash_login

ログインした際、~/.bash_profileが存在しなければ読込まれる設定ファイル。
なくてもいい。
ややこしいので、なるべく~/.bash_profileに寄せるべき。

~/.profile

ログイン時、~/.bash_profile ・ ~/.bash_loginが存在しなければ読み込まれる設定ファイル。
なくても良い。

~/.bashrc

bash実行時に読み込まれる設定ファイル。
ターミナル起動時に読み込ませたい場合、sourceで反映されることができる。
しかし、ターミナル再起動した場合は、毎回コマンドを叩く必要があるので、下記の設定を.bash_profileにしておくのが楽。

if [ -f ~/.bashrc ] ; then
. ~/.bashrc
fi

使い分け

~/.bash_profile, ~/.bashrcで十分。

~/.bash_profile

ログイン時に行う処理を記載する。

~/.bashrc

ターミナル起動時に必要な処理を記載する。
パスやコマンドのエイリアスなど。

ハマったこと

そもそもの発端は、node.jsの環境をmacに作ろうと思ったから。
bashrcにパスを通していたが、反映されずに困惑していた。
ターミナル再起動時に毎回sourceコマンドを叩く必要はないはずと思い、いろいろ調べた。

参考サイト

.bash_profile ? .bashrc ? いろいろあるけどこいつらなにもの? - Qiita

mac os x ターミナルで.bashrcを反映させるには | MATUKEN's Blog

Tabulator概要

Tabulator

olifolkerd.github.io

GitHub - olifolkerd/tabulator: A table generation JQuery UI Plugin

概要

高機能なテーブルが作成できると聞いて、試してみたくなった。
REST-fullなwebページ作成の補助につながる気がしたので、気になった。
あとは、Excelを殺してくれそうな気がしたので。。。

試作

前準備

とりあえず、下記をインクルードしていれば、試せる。

<link rel="stylesheet" href="//code.jquery.com/ui/1.11.4/themes/smoothness/jquery-ui.css">
<link href='https://fonts.googleapis.com/css?family=Montserrat:400,700' rel='stylesheet' type='text/css'>
<link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/font-awesome/4.5.0/css/font-awesome.min.css">

<script type="text/javascript" src="https://code.jquery.com/jquery-2.1.4.min.js"></script>
<script type="text/javascript" src="https://code.jquery.com/ui/1.11.4/jquery-ui.min.js"></script>

テーブルの作成

<div id="example-table"></div>

指定した要素にテーブルを適用してみる。
当然、jqueryなので、id名指定以外にもクラス名指定もできる。
今回は、とりあえずid名指定で確認。

以下でテーブルを作成する。

$("#example-table").tabulator();

テーブルはできるけど、表示するものが無いので、次で表示設定をする。

列定義

$("#example-table").tabulator({
  columns:[
    {title:"Name", field:"name", sortable:true, width:200},
    {title:"Progress", field:"progress", sortable:true, sorter:"number"},
    {title:"Gender", field:"gender", sortable:true},
    {title:"Favourite Color", field:"col", sortable:false},
    {title:"Date Of Birth", field:"dob"},
    {title:"Cheese Preference", field:"cheese"},
  ],
});

列の定義内容

  • title
    必須:この列のヘッダーに表示されるタイトル。
  • field
    必須:(アイコン/ボタン列では不要)データ配列内のこの列のキー。
  • align
    列のテキストの配置。設定内容は、(left | center | right)
  • width
    列の幅を設定。ピクセル単位、テーブル全体の幅に対するパーセンテージの設定も可能。未設定だと、システムが最適と判断した幅になる。
  • minWidth
    列の最小幅を設定。
  • sortable
    列のデータを並べ替可否の設定
  • sorter
    列のソート方法指定。
  • formatter
    データのフォーマット指定。
  • onClick
    列のセルをクリックしたときの処理内容。
  • editable
    編集可否の設定。Bool値のみ設定可。デフォルト:false
  • editor
    データを編集するときに使用するエディタの設定
  • visible
    可視設定。Bool値のみ設定可。デフォルト:true
  • cssClass
    列のヘッダーとセルに適用するCSSクラスを設定。
  • tooltip
    列の各セルホバー時のツールチップを設定する。
  • tooltipHeader
    列見出しホバー時のツールチップを設定する。
  • editableTitle
    ヘッダータイトルの編集可否設定。
  • headerFilter
    ヘッダ内の要素から列をフィルタリング。
  • mutator
    テーブルに解析されるときに列の値を操作する関数。
    ぶっちゃけ、使い方がよく分からん。
  • mutateType
    データ解析、セル編集、またはその両方で突然変異を発生させるかどうかを定義。
    ぶっちゃけ、使い方がよく分からん。
  • accessor
    getData関数を使用する前の処理内容を記載する。

テーブルへのデータの読み込み

今回はとりあえず配列で試す。

var sampleData = [
  {id:1, name:"Oli Bob", progress:12, gender:"male", rating:1, col:"red", dob:"", car:1, lucky_no:5, cheese:"Cheader"},
  {id:2, name:"Mary May", progress:1, gender:"female", rating:2, col:"blue", dob:"14/05/1982", car:true, lucky_no:10, cheese:"Gouda"},
  {id:3, name:"Christine Lobowski", progress:42, gender:"female", rating:0, col:"green", dob:"22/05/1982", car:"true", lucky_no:12, cheese:"Manchego"},
  {id:4, name:"Brendon Philips", progress:100, gender:"male", rating:1, col:"orange", dob:"01/08/1980", lucky_no:18, cheese:"Brie"},
  {id:5, name:"Margret Marmajuke", progress:16, gender:"female", rating:5, col:"yellow", dob:"31/01/1999", lucky_no:33, cheese:"Cheader"},
];

データを割り当てる。
割り当てるには、setData()を使う。
メソッドを呼ぶんじゃなくて、tabulatorの中で処理するので、注意。

$("#example-table").tabulator("setData", sampleData);

HTMLファイルを開くと、指定したJavaScript配列のデータが表示される。

サンプルHTML

<html>
    <head>
       <title>tabulator-test</title>
       <link rel="stylesheet" href="//code.jquery.com/ui/1.11.4/themes/smoothness/jquery-ui.css">
       <link href='https://fonts.googleapis.com/css?family=Montserrat:400,700' rel='stylesheet' type='text/css'>
       <link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/font-awesome/4.5.0/css/font-awesome.min.css">
       <link rel="stylesheet" href="tabulator-master/tabulator.css">

       <script type="text/javascript" src="https://code.jquery.com/jquery-2.1.4.min.js"></script>
       <script type="text/javascript" src="https://code.jquery.com/ui/1.11.4/jquery-ui.min.js"></script>
       <script type="text/javascript" src="tabulator-master/tabulator.js"></script>
   </head>
    <body>
        <div id="example-table"></div>

        <script type="text/javascript">
           $("#example-table").tabulator({
             columns:[
               {title:"Name", field:"name", sortable:true, width:200},
               {title:"Progress", field:"progress", sortable:true, sorter:"number"},
               {title:"Gender", field:"gender", sortable:true},
               {title:"Favourite Color", field:"col", sortable:false},
               {title:"Date Of Birth", field:"dob"},
               {title:"Cheese Preference", field:"cheese"},
             ],
           });

           var sampleData = [
             {id:1, name:"Oli Bob", progress:12, gender:"male", rating:1, col:"red", dob:"", car:1, lucky_no:5, cheese:"Cheader"},
             {id:2, name:"Mary May", progress:1, gender:"female", rating:2, col:"blue", dob:"14/05/1982", car:true, lucky_no:10, cheese:"Gouda"},
             {id:3, name:"Christine Lobowski", progress:42, gender:"female", rating:0, col:"green", dob:"22/05/1982", car:"true", lucky_no:12, cheese:"Manchego"},
             {id:4, name:"Brendon Philips", progress:100, gender:"male", rating:1, col:"orange", dob:"01/08/1980", lucky_no:18, cheese:"Brie"},
             {id:5, name:"Margret Marmajuke", progress:16, gender:"female", rating:5, col:"yellow", dob:"31/01/1999", lucky_no:33, cheese:"Cheader"},
           ];
           
           $("#example-table").tabulator("setData", sampleData);
       </script>
    </body>
</html>

その他のデータ指定方法

Ajax

$("#example-table").tabulator("setData", "http://www.exampleurl.com/data");

HTML

$("#example-table").tabulator({});

参考

HTMLのテーブルをJSONで動的に更新できる「Tabulator」がスゴい! - WPJ

2016年の振り返りと2017年の目標

2016年の振り返り

KPT法でとりあえず振り返る。

K:やれてよかったこと

  • ブログを大きな間隔を長い期間開けずに書き続けた

    • 詳細
      1ヶ月以上の間隔は開かなかったはず。
      なんとか続けられた。
      やり抜くことは、意外と難しい。
      やり続けることで、文章力が上がった気がする。。。
      あとは、常に情報収集を意識できたかな?
      これは、継続してやりたい。
  • Gitを業務で触れた

    • 詳細
      やっとSVN以外のVCSを業務で使えた。
      GitHubとか使っていたから、Gitを知らないわけではなかったが、チームで使うって意味が初だった。
      使ってみて感じたが、Gitコマンド覚えないとダメだなと感じた。
      なぜなら、やっていることが明確に見えないから。
      やることが魔法の言葉みたいに感じた。
      ※個人で使っているときもよく分かってなかった。。。
      2017年は、それを克服したい。
  • AWSシステム開発できた

    • 詳細
      触ってみた感じ、全然ローカル開発と違和感ない。
      そもそも、開発時点からAWS環境のDBを使う意味があったのか、甚だ疑問だが。。。。
      個人でAWSで開発ができないから、いい経験にはなったと思いたい。
      AWSも個人開発者向けのプランがあればいいのにな。
      容量を大幅制限することで、格安プランを出すとか。
      個人でやるには、料金的にキツイ気がする。
      ※俺の収入が低いってのもあるかもしれないが。
  • Powershellを少し学べた

    • 詳細
      CSVを読み込んで、特定条件のデータを抜き出す方法を覚えた。
      DOSだったらまずやらないようなことが、簡単にできたのが意外だった。
      結構応用が効き、大体の開発環境はWindowsなので、ツールとして使えるようにしておきたい。

P:悪かったこと

  • Java以外をやれていない
    • 詳細
      Pyconには出たけど、全然Pythonプログラミングできていない。
      セッションの内容は、Javaで得た知識やシステム開発を通して得た知識で付いて行けるので、さほど問題ではなかった。
      Powershellは、言語って感じじゃないから、除外。
      そろそろ、複数言語使えないとまずい年代かな?
      なるはやで使えるようにしておきたい。
      Python以外なら、SwiftかC++
      ネイティブ系の開発をできるようになりたい欲望がある。 Webエンジニアなら分かってくれるハズ!
      Pythonは、ビッグデータ処理やら機械学習など、今後を見据えて必須だと感じているから習得したい。
  • 情報処理技術者試験に合格できなかった
    • 詳細
      セキュリティスペシャリストを受けたけど、合格まで至らなかった。
      30歳までに何かしらの高度情報処理技術者を合格したかったけど、もう来年しかチャンス無いね。。。
      30歳になっても受け続けはしますが。
      試験制度って少し変わっているんだな。
      セキュリティスペシャリストを受けてきたけど、試験制度見たら、情報処理技術者の方が合格したい試験な気がする。
      次の試験は、データベーススペシャリストにしようかな?
      今年が最後だと思って、きっちり予定を立てて試験勉強していきたい。
  • OJCPを受験できなかった
    • 詳細
      勉強はしていたが、受ける機会がなかった。
      最後の方は、業務多忙が影響しているせいもあるが、それは仕方ないね。
      OJCPって、過去問解いてたけど、引掛け問題が頭に来るぜ!
      個人的には、手応えがあったので、Java9が出る前に合格しておきたい。
  • ブログで知識が散らばったまま
    • 詳細
      気になったときに調べはするんだが、それが散らばったままだな。。。
      wiki化するなど、情報をカテゴライズして見やすいようにまとめてたい。
      ココらへんは、ひしだまブログを参考にしたい。
      はてなブログでこういうことはできるのだろうか?
      ブログは、Markdownで書きやすいんだけど、wikiっぽいものを作るのが面倒くさい気がする。
      やり方あるのかな?
      それっぽい機能は、見てもなかった気がする。
      ローカルにKnowledge/GitLab環境作ってみようか画策中。
      いいアイディア持っている人がいたら、コメントをプリーズ!!

T:次に試すこと(2017年目標)

  • JavaScriptJavaレベルに!
    • 詳細
      とりあえず、複数言語取得に向けて、一番手軽にやれるものを。
      もちろん、Pythonの勉強は続ける。
      使えないわけではないが、本格的に触れない&次の業務で使うので、これを機に完璧習得したい。
  • 3DCGの学習
    • 詳細
      これも業務で使うから。
      手を出したい分野ではあったので、これを機に触る。
      とりあえず、Three.jsあたりを使えるようにしたい。
  • Node.jsを使いこなす
    • 詳細
      JavaScriptやっていると、必ず出てくるライブラリなので、覚えておきたい。
      簡単なツールを作るのにも使えそうなので、使えるようにしておけば、払った学習コスト以上のものになるのではないかと感じている。
  • OJCP8受ける
    • 詳細
      Java8は使えているけど、外見え的によく見えるので、持っておきたい。
  • wikiを作る
    • 詳細
      ブログに散らばった知識を集約する
  • Gitコマンドを覚える
    • 詳細
      細かいことや、やっていることがモヤッとしか覚えてないので、コマンド操作できるようにしておく。
      SVNも、コマンド覚えていると、ちょっとしたツールを作れたりしたので、できれば、コマンド操作を覚えたい。
  • FireFoxのアドオン作成
    • 詳細
      開発・趣味の両方とも、FireFoxを愛用。
      たまに、これができたらいいのにってのがある。
      オレオレツールができるようになれば、もっとブラウジングが捗りそうだから、覚えたい。

今年は

今年は、新しいことをチャレンジしたい。
既知の知識の強化も忘れずに。
あとは、得た知識の体系化を考える。
あと、難問中の難問、彼女作るってのもある。

Java Advent Calendar 2016のまとめ

Java Advent Calendar 2016

公式サイト

qiita.com

概要の引用

今年も Advent Calendar の季節がやってきました。 Java をネタにしたブログを公開してしまいましょう。 Java といえば、サーバーからクライアント、クラウドに組み込みと、さまざな分野で使われており、そこで使われている技術もたくさん。 Java の Tips でもいいし、ライブラリの使い方でもいい、自作のツールの紹介など、Java に関していれば何でもかまいません。ぜひこの機会に、Java のブログを書いてみましょう!! qiitaのアドベントカレンダーを使用していますが、もちろんqiita以外からの投稿もできます! 普段お使いのブログがあるかたはそちらでご参加ください!

内容・感想

[12/01] jcmd と既存ツールの対応

記事URL

jcmd と既存ツールの対応 - sugarlife's blog

感想

jcmdの紹介記事。
使ったことがなかったので、コレを機会に調査。

まずは、なんでもいいので、Javaのアプリを立ち上げる。
当然、実行して即終了するようなやつは、ダメ。
アプリをゼロから作るのが面倒だから、SpringBoot使ってWebアプリを速攻作成。
初心者なので、欲張らず、使えるコマンドの調査からやってみる。
Windows10なので、タスクマネージャーから、PIDを調べる。 ※あとになって思ったが、クラス名でも行けるのね。。。

f:id:suzaku0914:20161204114808j:plain

"3740"なので、紹介されている方法で使えるコマンドが何かを調べる。

jcmd 3740 help

すると、以下の出力が!

3740:
The following commands are available:
JFR.stop
JFR.start
JFR.dump
JFR.check
VM.native_memory
VM.check_commercial_features
VM.unlock_commercial_features
ManagementAgent.stop
ManagementAgent.start_local
ManagementAgent.start
GC.rotate_log
Thread.print
GC.class_stats
GC.class_histogram
GC.heap_dump
GC.run_finalization
GC.run
VM.uptime
VM.flags
VM.system_properties
VM.command_line
VM.version
help

For more information about a specific command use 'help <command>'.

ちなみに、試したときの環境情報 - Java:1.8.0_111 - STS:3.8.2

あまりインフラや調査関連をやったことがないので、プロセス調査とかは敷居が高いイメージがあった。
「使えるコマンドがこれです」ってのが見れるのは、かなり敷居が低くなった印象がある。
"$ jcmd help"さえ覚えておけば、バージョン違いによる実行できる/できないの差異を覚える必要がない。
あと、基本的な文法が一緒なので、覚えることが少ないけど、やれることが多いのがいいと思いました。

[12/02] どこからも使用されてないクラスを列挙する

記事URL

どこからも使用されてないクラスを列挙する - 水まんじゅう

感想

jdepsを利用したクラス解析。
やっていることは、jdepsで使用されているクラスの一覧を抽出し、特定パッケージ配下に抽出したクラスを含んでいないクラスを抽出するというもの。
かなり亜種なやり方だと思ったが、import解析よりは良くなっている気はする。
もっとこういったものは、発展するべきだと思う。
IDEとかで、実装して欲しい機能ではある。
リファクタリングすると、発生する可能性がなくはないからね。
できれば、public変数の対応も欲しいところではある。
まぁ、編集の修飾子をprivateにしてみてビルドエラーにならなければ、消してもいい変数だと分かるんだけどね。
手間がかかるから、一発でわかるなら、そうしたい。

[12/03] Javaが僕にくれたもの

記事URL

Javaが僕にくれたもの | susumuis Info

感想

Javaの業務経験についての話。
自分も経験あるようなあるある話がいくつかあった。
読んでいて思ったのが、やっぱり環境は大事。

[12/04] ローカルキャッシュにCaffeineでも

記事URL

ローカルキャッシュにCaffeineでも - CLOVER

感想

あんまりキャッシュ周りを気にしたことはなかったが、色々できそうな気がした。
キャッシュ関連の操作をあまりしたことがなかったので、いいきっかけになった。 一番驚いたのは、有効期限の設定かな。
今時のキャッシュライブラリはできて当然みたいな感じだったが、あんまり意識したことがなかったので、驚いた。
ここまで進んでいるんだね。

ここまでできるなら、区分値など、起動時に読み込まれる外出定数とかに使えるのではないかと思った。
DBやpropertyに新規追加した場合、メモリ上にロードされていないから、アクセスがあったときにロードするとか。
リリースを考えなくてもいい作りにできるな、とレベルの低いことを考えてサンプルを試していた。
どっちかというと、試す環境づくりでかなり手間取った。。。

[12/05] ArrayListのソースを読んでみた

記事URL

http://qiita.com/fukushiw/items/dade32371df476987bec

感想

ArrayListのコールドリーディングを、自社で実施した時のレポート。
自分も、どちらかと言えば、何かを主催する方の人間にあたるので、内容よりも会社内でどういった状況だったのかを注視した。
詳しくレポートを書きすぎると、イベントをやっても初回しか集まらない話はなんとなく分かる。
人って面倒くさがりだからな。
詳しくやるのも考えものだと思った。
レポートは、最後をやってから出せば良いのではなかろうかと思う。
あとは、超サマリだけ共有するとか。
難しい。。。
興味を引くことの難しさを感じる。
あと、詳細書いても、見てくれるとは思えない。
勉強会・読書会を参加する文化を作らなければ、最終的な能力向上は計れないと感じました。

[12/06] HashSetを実装しなおして失敗した話

記事URL

HashSetを実装しなおして失敗した話 - Qiita

感想

HashSetの独自実装の話。
やはり、コアな部分はJVMとセットで理解してないと、性能向上は難しいとのこと。
そういった意味でも、ステップアップを図りたい場合は、JVMを理解する必要がある。

[12/07] Java Stream APIでハマったこと

記事URL

Java Stream APIでハマったこと | haruo31's blog

感想

StreamAPIは、なるべく使うようにしている。
今、現場で禁止されているのが意味不明で、使いたいところで使えない不満があるが。。。

読んでいて思ったのは、並列処理の解析手法が難しいと思った。
StreamAPIを使うなら、やっぱりJavaのヒープメモリの解析方法を知っておく必要があると感じた。

[12/08] Optimizing JavaというJavaパフォーマンス系の書籍が面白そう

記事URL

Optimizing JavaというJavaパフォーマンス系の書籍が面白そう - 谷本 心 in せろ部屋

感想

書籍紹介。
まだ、日本語訳出てないのか。。。
日本語訳を待っていると、情報が遅れるのは否めない。。。
やっぱり、英語大事だな。
喋れなくても、読み書きできるようにはならないといけないね!
近場に英語を話せる人が欲しい。

[12/09]マイクロベンチマークツール、JMHについて

記事URL

マイクロベンチマークツール、JMHについて - Qiita

感想

jmhの紹介。
計測する場合、当然ではあるが、ロジックが正当なことであること。
使う前に準備がいるので、そこら辺がもっと簡単になれば、使われるのではないかと思った。
実際に使ってみて、準備するまでが面倒だと感じた。

出力結果は、レポートとかに使えそうな、なんとなく威厳を感じる出力。。。
※小物感ハンパねぇ

Java9でいろいろ機能が追加されると思うが、これを使って計測してブログに結果あげるようにしたいと思う。

[12/10] DBUnitでBLOBデータをEXCELから放り込んだ話

記事URL

DBUnitでBLOBデータをEXCELから放り込んだ話 - Qiita

感想

プロジェクトで、テストにExcel使うって時点で、嫌な予感しかしない。
案の定、書いた人も苦労したようだ。

DBUnitは、JUnitとセットでよく見かける。
テストデータをExcelで管理する現場は、よくあるからな。
だが、BLOBデータは扱った記憶があるような、無いような。。。
だいたいは、基本的な数値型と文字列でなんとかなってしまうから、あんまり記憶にない。
確かにレアケースではあるが、対処方法は覚えておくに越したことはないと感じた。

やっていることは、途中でバイナリ変換を実施している。
かなり泥臭いことを。。。
確かに、現場でこんなことしたら、怒られてしまいそうだな。

最近、思うのだが、Excelでのデータ管理に限界を感じる。
なんというか、いろんな見えざる罠が多すぎる印象がある。
もっと上手い方法がないだろうか?
テストデータ管理用のDBがあってもよいのでは無いかと思う今日このごろ。
SQLiteみたいな軽めのDBにデータ突っ込んで、JUnitとかで走らせたときに、使っているDBにデータを突っ込むとかね。

[12/11]Gradleから始めるDataNucleus

記事URL

Gradleから始めるDataNucleus - Qiita

感想

JDOを使ったGoogleCloudPlatformへのデータ登録。
Gradleは、つかったことが無いので、なんとなくで記事を読んだ。
JDOは、テスト系で使えるのではなかろうか?と思いました。
あと、マルチバイトの変数名の変数は、プロダクトコードには入れられないけど、テストコードになら入れてもよいのではないかと言うのが、個人的な感想。
ただし、プロダクトの構成が100%日本人の場合だけだけどね。

JDOは、上手いことテストコードに使えそうな気がする。
どこかのタイミングで検証してみたい。
TODO行きだ!

[12/12] さあ、並列プログラミングをはじめよう

記事URL

さあ、並列プログラミングをはじめよう - Qiita

感想

Java8の並列APIって言われると、ParallelStreamAPIしか思いつかなかったけど、言われてみれば、Threadもそうだったね。
Threadは、学生時代で使って以降、なんかの時間の計測か、ゲームの描画処理でしか使った記憶がないな。。。
あんまり並列って認識がなかった。

並列処理は、なんとなく理解したつもりになっていたけど、改めて見ると知らないことが多かった。
Executor FrameWorkとか、使ったことがなかったが、初めて使って、Threadより簡潔にかけると感じた。

比べてみてわかったが、よりシンプルに書けるのは、StreamAPIなんだと感じる。
並列処理は、プログラミングの難問だから、書く量は少ないほうがいいのは、当然か。
Fork/joinは、とっつきにくさを感じた。

並列処理は、今後も重要になってくる気がする。
並列処理ってわけではないが、分散処理を考える上でも、並列処理の概念は覚えておいた方がいいと感じた。
しっかりと勉強し直す必要がありそうだ。
TODO行き!

[12/13] JavaSEでもオブジェクト指向データベース(JPA)を!

記事URL

データベースを簡単にーJavaSEでもオブジェクト指向データベース(JPA) - Qiita

感想

JPAを使ったDBアクセス関連の話。
全く関係のないことだが、derbyがとっつきにくい!
話全般は、O/Rマッパーを理解していれば、問題なく飲み込める。
Javaのライブラリは、たまにとっつきにくい物があるが、そこら辺はカスタマイズが必要なのかと感じた。

[12/14]JGiven で 100% Pure Java BDD

記事URL

JGiven で 100% Pure Java BDD(導入編) - Qiita

感想

ごめんなさい。BDDって単語がわからなかった愚か者です。。。
振る舞い駆動は知っていたぜ!
BDDって単語がわからんかっただけ。もう覚えたぜ!

話を戻す。
テストは、状態・実行内容・期待値を定義して、それらの実行はJGivenに任せるんですね。
だから、状態や実行内容が列挙できていれば、簡単に複合テストケースが作れるわけか。
そこら辺は、便利かもしれない。
実際にプロジェクトで使ってみないと問題は見えないかもしれないが。。。
レポートのいいところは、どんな機能が使えるかが分かるところか。
逆もまたしかり。
どんな機能が使えないかも分かるってことだね。
TDD的な開発でアレば、かなり有用そうな気がする。
これのNGが、そのまま進捗報告に使えるわけか。
なかなか有用そうな気がする。
まだ、正式版では内容だが、活用シーンは多くありそう。
情報は、随時追っていきたい。
TODO行き!

話が全然変わるが、テストケースに日本語使うのは、個人的には有りだと思っている。
ただし、ターゲットが日本限定の場合のみね!
納品先が、ガチガチの日本企業ならOKかなって思っている。

雑記

バージョンの表記方法を全然知らなくて、調べた。
RCって、ほぼリリースに近い状態なんだな。
JGivenのリリースは、結構近いのか。
ちなみに、調べたサイトは、以下。

安藤幸央のランダウン(51):意外と知らないバージョン表記・数字の豆知識 - @IT

[12/15] HttpURLConnectionで嵌った話

記事URL

HttpURLConnectionで嵌った話

感想

HttpURLConnectionを使ったHTTP通信で、サーバーが4xxのエラーを返したときの話。
最近良く思うのが、HTTPのステータスコードが全然頭に入ってこない。
いや、調べりゃいいんだろうけど、200か200以外かしか気にしたことがない。
そろそろ、こんな状態は脱却したいな。
4xx番台が何なのかくらいは覚えたい。
TODO行き

話を戻すと、エラーが帰ってきたときに、エラーストリームが取得できない状態にハマったという話。
ココらへんまで来ると、もうソースを読む力が重要なんだなと思う。
あとは、妄想力。
こういう状態なら、こうなるが考えられるようになると、バグ修正の速度は格段に上昇すると個人的に思う。

どっちかというと、こういう事象有りますよって感じで終わっていたな。

[12/16] Javaslang を試してみた

記事URL

Javaslang を試してみた - 覚えたら書く

感想

StreamAPIを理解していたからかもしれないが、案外すんなり入ってきた。
副作用がないことで、関数型プログラミングはしやすくなるのではないかと感じる。
今後、Javaに大きく影響を与えそうなライブラリではないかと感じた。

話が変わるが、この記法は、Scalaライクなのだろうか?
Scalaは、やろうとしたが、覚えられなくて断念した記憶がある。
紹介されていた記法に近いなら、俺にもできそうな気がしてきた。
余裕があれば、Scalaを覚えて機械学習に流用したい野望がある。
TODO行き。

[12/17] JARファイルの難デコンパイル化について頑張ってみた話

記事URL

JARファイルの難デコンパイル化について頑張ってみた話 - Qiita

感想

ソース見られたくないから暗号化しようぜ!って話。
実行時間にどれくらい差がでるのか気になった。

クラスローダ周りは、正直知識がなくて、ふ~んくらいで記事を呼んだ。
結構な黒魔術を使わないと、こういうものって守れないんだなって思いました。
ソースコードの難デコンパイル化は、製品としてありそうな気がする。
著作権保護を強く訴えている起業とか。
※ネズミの王国が真っ先に思いつく!

[12/18] 暗号処理をやってみよう!

記事URL

暗号処理をやってみよう! - Qiita

感想

これは、知っているで!
ログイン関連の画面をやらせてもらったとき、パスワードの暗号・復号化で似たようなことをやった記憶がある。
暗号化は、突き詰めていくとかなり奥が深いってのは、そのときに痛いほど味わった。
だいたい既知の内容だったので、特に言及することはない。

[12/19] 自作のJavaMailラッパーでiCloudメールにアクセスする

記事URL

自作のJavaMailラッパーでiCloudメールにアクセスする - ひらおかゆみの投げやりブログ

感想

JavaMailでiCloudメールに接続できなくなったときの対応話。
問題だったのは、iOSの2ファクタ認証。
2ファクタ認証ってなんぞ?状態だったので、とりあえず調べた。

確認コードを入手して 2 ファクタ認証でサインインする - Apple サポート

要するに、2段階認証のことだろうか?
ちょっとiOS持ってないので、確認できないのが痛い。。。

今まで知らなかったけど、このメール送れない問題って、かなりシステム影響でかいんじゃ。。。て思った。
例えば、会員登録とかは、メールアドレスに一時的に有効なURLを送ったりするけど、それがそもそもできないってことになる。
メール送信の機能を作っている人は、大変だな、こりゃ。
バイス関連の情報は、逐一収集しておかないと、対応が後手に回るから恐ろしい。

[12/20] ThreeTen Extra と ThreeTen Backport

記事URL

ThreeTen Extra と ThreeTen Backport - Promised Land

感想

Date and Time APIの歴史と、生まれた派生の成果物についての話。
ThreeTen ExtraのThreeTenって何っておもったけど、JSR310の310のことねってわかるとすんなり行く。
Extraって言われると仰々しいイメージがあるけど、翻訳すると「余分な」って意味らしいね。
中二病満載の用語かと思っていたが、ディスりのイメージが強い用語なのだろうか?

ThreeTen Backportは、まだJava8に移行できてないプロジェクトで積極的に使っていくべきだと感じた。
いずれバージョンアップの時はくるから、被害が少なくなるように、少しづつ対応は行っていく必要があると思う。
内容を見ていたが、やっぱり、時間の管理は迷走しやすい気がした。
いろんな地域でいろんな日付の管理があるから。。。

[12/21] MySQL on Fusion-IOのパフォーマンスを引き出すバッチパターン

記事URL

MySQL on Fusion-IOのパフォーマンスを引き出すバッチパターン - Qiita

感想

CQSを理解するのに時間がかかった。
ようするに、副作用があるとこないとこキッチリ分けましょうってことね。
並列処理する上では、副作用の有無を理解した上で、どこの性能上げるかが大事だね。
DB関連の並列処理は、かなり面倒な印象がある。
完全には理解できなかった。
どこかで実験する必要があるな。

[12/22] 拙訳 JUnit 5 User Guide

記事URL

拙訳 JUnit 5 User Guide - Qiita

感想

JUnir5の紹介。
ざっくり見た感じ、3→4ほどのデカイ変更はなかった気がする。
Junitは、Javaのテストツールとしてデファクトスタンダードみたいになっているので、なる早で情報は集めたい。
あとで、じっくり検証する。

C++の設計と進化』に見る Java の方向性

記事URL

『C++の設計と進化』に見る Java の方向性 - Qiita

感想

C++Javaを比べての話。
C++だけでなく、C言語をベースにした言語すべてに言えるが、書き方が宣言的で分かりづらい印象がある。
Objective-cなんかと使った時は、Javaならもっと簡単に書けるのに!ってのが何回かあった。
たぶん、C++も同じだろう。
※使ったことがないので、憶測ではあるが。。。

他の言語と比べることで、Javaのいいところ、悪いところが見えてくるのだと感じた。
来年から、少しJavaから離れるが、別の言語の知見を取得して、プログラミングスキルの幅を広げたい。

ダンJavaの書き方。Immutable Java、Null安全を考えてみる。

記事URL

モダンなJavaの書き方。Immutable Java、Null安全を考えてみる。 - Qiita

感想

タイトル通り、イミュータブルやNullと、どうやって付き合って行くかの話。
不安定な状態のオブジェクトをなくすように心がけるのは、最初のころはわからなかったなぁ~と感慨深く見ていた。
基本的には既知の内容が多かったので、そこまで参考にすることはなかったが、上手くまとまっていた。

groovyの内部DSLの勉強がてらにETLツールもどきを作ってみた

記事URL

groovyの内部DSLの勉強がてらにETLツールもどきを作ってみた | takemikami's note

感想

Groovyを使ったDB初期化ツール。
Groovyは、JavaよりなJVM言語。
一時、触っていた。
目的はGradleを使えるようになりたかったから。
だが、タイミングを逃してしまい、今に至る。
ただ、言語自体は読めるので、そんなに苦ではなかった。
スクリプトに近い感覚で書けるので、もっといろんなことができそうな気がする。

もう一度、学びまおそうかな?

TODO

  • JDOを使ってテストコードを書けないか、考察する
  • 並列処理(特にExecutor FrameWork)を学習しておく
  • JGivenの利用方法について習熟しておく
  • HTTPステータスをまとめておく
  • Scalaの世界への入門

総括

以前より知らないことが減った気がする。
気のせいかもしれないが。。。

もうちょい深いところの知識がほしいと思った。

Advent Calendarのいいところは、いろんな知識が集約してくるところだね。
1ヶ月で知らないことや新しい発想に出会える可能性が高いので、来年も期待したい。

以前のAdvent Calendarまとめ

suzaku-tec.hatenadiary.jp