22年目の告白-私が殺人犯です- 感想

22年目の告白-私が殺人犯です- (講談社文庫)

22年目の告白-私が殺人犯です- (講談社文庫)

2017年6月に全国上映された映画のノベライズ版.
原作自体は韓国の映画だそうです.

弱小出版社の編集者である川北未南子は,
行き着けのバーで,美しい男性から突然声をかけられる.
曾根崎と名乗るその男から
「これを出版してくれる出版社を探している」
と渡された封筒に入っていたのは,
22年前の未解決連続殺人事件の,殺人犯目線の告白文であった.
その生々しい内容から,真犯人が書いたと確信した未南子は,
作者を紹介してくれるよう,曾根崎に依頼すると,
曾根崎は深い笑みを浮かべてこう言った.
「はじめまして,私が殺人犯です」

文の完成度に感嘆しつつ,倫理的に出版の是非を思い悩む未南子,
時効を盾に被害者一族の神経を逆なでする言動を繰り返す曾根崎,
被害者の関係者でもあり事件の担当刑事でもあった牧村,
この3名を中心に物語は進んでいく.

作中では曾根崎が自ら世間に顔を公表し,かつイケメンであったため,
女性を中心に大人気になるという展開を迎えるんだけど,
表現は極端とはいえ,現実でも残念ながらこうなる可能性は高いと思う.

全体としては,伏線をあからさまに張っているので,
大筋が大体読めてしまい,どんでん返しのインパクトは正直弱い.
映像だったらもう少し上手にカムフラージュできるのかもしれないが,
その辺はノベライズ版としての弱点だと思う.

あと,文章が全体的にくどい.
「そういう文章は二流だ」みたいなことを未南子が述べるわけだが,
この作品にも多少なりそれが当てはまっているのが皮肉ではある.


映画はもしかしたら面白いのかもしれないけれど,
この小説自体はあまりオススメできないという感想.

CheckとTest

最近はテストに関するお仕事が増えてるんだけど,その中で
「CheckとTest」
というワードがしばしば挙がるので,勉強してみることにした.
※例によって間違えている可能性があります.

とりあえずネタ元というか,
この2つのワードを提唱したブログはたぶん以下.
Testing and Checking Refined | James Bach’s Blog

正確に言えば,もっと昔にポストしたテーマを
議論してリファクタリングしたのが上記の記事とのこと.

まず,CheckingとTestingの関係性について触れているのが以下の一文.

Testing encompasses checking (if checking exists at all), whereas checking cannot encompass testing.
"CheckingとはTestingの一部である"

で,Testingの定義は次のように述べられている.

Testing is the process of evaluating a product by learning about it through exploration and experimentation
"Testingとは,探索や実験を通じてプロダクトについて学ぶことにより,そのプロダクトを評価する過程である"

……うーん,モヤッとするので,とりあえず次に行こうか.
Checkingの定義は以下.

Checking is the process of making evaluations by applying algorithmic decision rules to specific observations of a product
"Checkingとは,プロダクトに対する特定の観察結果に対して機械的な判定ルールを適用することにより,そのプロダクトを評価する過程である"

これはピンと来る.
というか,俺が普段「テスト」と呼んでいるものは,ほぼ全てこれだ.
テストケース表の記載を元にプロダクトを操作して,結果を観察し,
判定ルール(期待結果)に基づいて妥当性を「チェック」しているわけだ.

では,翻って,Testingとは結局何なのか.
個人的に一番理解を促したのは,以下の一文かな.

A check is describable; a test might not be (that’s because, unlike a check, a test involves tacit knowledge).
"チェックは記述できるが,テストはそうとは限らない.テストは暗黙知も含むのだから"

暗黙知」とは仰々しいが,
例えばプロダクトを色々操作しているときに
「仕様上は明記されてないけど,常識的に考えておかしいだろこれ」
という事象に遭遇することは,皆さんも割と経験あると思う.
ここで判断の尺度とした
「書いてないけど,常識的に考えて」
がまさに「暗黙知」の一種に相当する.
そうして暗黙知も含めた尺度でプロダクトを評価するのが「Testing」だ.

プロダクトの品質評価の尺度として,確かに仕様書は重要だけど
その枠組みにとらわれず,もっと広い視野で
製品を理解し,評価しましょう,というのが,この
「Checking vs Testing」というテーマに込められた思い,
という理解で良いんじゃないかな.

「どうやってやるの?」は,とても難しいテーマなので今回は触れません.
(Exploratory Testingとか)

かぐや様は告らせたい 感想

ミラクルジャンプでの好評を受けヤングジャンプに移籍した漫画.
表紙買いしたけど中々面白かったので紹介.

生徒会副会長の四宮かぐやと,同じく会長の白銀御行.
両者は両想いにも関わらず,プライドが高すぎるせいで
お互いに「自分から告白する」ことが出来ずにいた.
膠着状態に業を煮やした両者は,その類まれなる頭脳を
「何としてでも相手に告白させる」
という残念な方向へと活用し始める.

やってること自体は,生徒会の活動だったりゲームだったりなんだけど,
相手に「好き」と言わせるためにあらゆる手段を使う二人は
見ていて面白く,そして飽きない.

設定の制約が結構大きいのでネタ切れが少々不安だけど,
今のところ書記の藤原という第三のキャラを
ジョーカーとして上手に使っている感じ.

現時点で全5巻とお手頃なので,
こういうシチュエーションギャグが好きな人には
是非ともオススメ.

パトリオット・デイ(Patriots Day) 感想


『パトリオット・デイ』60秒予告
2013年のボストンマラソンで起きたテロ事件を元にした映画.
主要人物は実在の人物らしく,
映画の最後,本人達のインタビューが収録されていた.

まあ,典型的な「USA!USA!!」な映画.
題材的にある程度仕方ないとはいえ,
幾らなんでも犯人側を狂信者集団に仕立て上げすぎ.

あと,これは史実通りだから仕方ないんだけど,
警官数十人がかりで取り囲んだ状態から
たった1名の犯人を取り逃がすシーンには「えぇ……」となってしまった.
しかも,何かしらの策に嵌められたわけでもなく,
思いっきり正面突破されるという謎の展開.

たぶん,史実として別の理由で取り逃がしたところを
諸般の事情で,こういうストーリーに脚色したんじゃないかな.
全く根拠はないけど.

俺はこの事件の顛末についてはほとんど記憶していなかったので,
先が読めないという点では楽しめたんだけど,
普通に覚えていた人にとっては,特に面白みのない映画だったんじゃないかな.

正直,あんまオススメはできません.


ちなみにネット上ではこの事件について「やらせ」説があったりするけど,
そっちについては特にノーコメントとします.

Suits(スーツ) Season 1 感想

レンタルビデオ屋の近所に引っ越したので,
適当にチョイスして視聴.

主人公は,弁護士事務所のエースであるハーヴィー.
人を遠ざけがちな彼の性格を見かねた上司の命令により,
ハーヴィーは渋々,部下を1名雇うための面接試験を開始する.
面接会場に偶然逃げ込んできた青年マイクの才能に惚れ込んだハーヴィーは
マイクが弁護士の資格を持っていないという事実を隠した上で,
自分の部下として雇うことを決意する.

マイクは瞬間記憶という強力な能力を有しており,
それを活かして窮地を脱する場面もあるが,それ以上にポカが非常に多く,
正直,あまり有能なイメージは抱かない.
ハーヴィーの足を引っ張ってるシーンの方が多かったと思う.

この辺はシーズンを重ねるにつれて改善されていくらしいけど,
White Collarのニール的な役割を予想していた自分としては
マイクのキャラ付けには肩透かしを食らった.

そんなわけで,このシーズン1は
ハーヴィーの優秀さと,ライバル弁護士のルイスのウザさを
ひたすら堪能するシリーズだったと思う.

終わり方も海外ドラマお得意の続編ありきの尻切れエンドだったし,
これ1シリーズだけでは評価は難しいかな.


面白くなりそうだとは思うので次シリーズも見ると思うけど.

log4jを使う

仕事上は何度か使ったことあるけれど
自分で実装したことが無かったので,これを機会に勉強.

log4jというのは,java向けのlog管理ツールとでも呼ぶべきもの.
apacheから提供されている.
Log4j – Apache Log4j 2 - Apache Log4j 2
設定ファイルさえ用意しておけば,あとはシンプルなコマンドで
ログを出力することが可能となる.

仕組みは以下に整理されている.
Log4j – Log4j 2 Architecture - Apache Log4j 2
書いていることを要約すると,以下のような感じ.

・Loggerは名前を持ち,1つのLogConfigを持つ.
・LogConfigはログレベルを管理し,複数のAppenderを持つ.
・Appenderは出力先と出力フォーマット(Layout)を管理する.

また,LogConfigには継承関係も成り立つ.
「foo」の子供は「foo.bar」になる,といった具合だ.
で,継承の方法については以下になる.

・ログレベルの継承は「上書き」
・出力先(Appender)の継承は「追加」

たとえば,
foo:ログレベルはtrace,コンソール出力のAppenderを設定
foo.bar:ログレベルはerror,ファイル出力のAppenderを設定
と設定した場合,
foo.barは
「errorイベントのログを,コンソールとファイルの両方に出力する」
という振る舞いを見せる.

Appenderの継承方法も「上書き」にしたい場合,
additivityの設定をfalseにしておけば良いそうだ.
その辺は以下を見ると分かりやすい.
Log4j – Log4j 2 API - Apache Log4j 2


というわけで,御託はこれくらいにして,実装してみる.
今回は超シンプルに,以下.

package jp.nk5.stockanalyzer.controller;

import jp.nk5.stockanalyzer.application.DownloadStockDataService;
import org.apache.logging.log4j.Logger;
import org.apache.logging.log4j.LogManager;

public class BatchController {

  private static final Logger logger = LogManager.getLogger();
	
  public static void main(String[] args) {
    logger.error("main() started.");
    DownloadStockDataService application = new DownloadStockDataService();
    application.downloadStockData();
    logger.error("main() finished.");
  }

}

ちなみに,設定ファイルはまだ用意していない.
「設定ファイルが無い場合,log4jはログレベル=errorでコンソール出力する」
という仕様があるため.上記は設定ファイル無しでも動くのだ.

実際の実行結果が,以下.

10:45:38.365 [main] ERROR jp.nk5.stockanalyzer.controller.BatchController - main() started.
10:45:40.257 [main] ERROR jp.nk5.stockanalyzer.controller.BatchController - main() finished.

さらに設定ファイルを以下の内容で用意してやれば,
app.logというファイルにログを出力してくれるようになる.

<?xml version="1.0" encoding="UTF-8"?>
<Configuration>
  <Appenders>
    <File name="logFile" fileName="app.log">
      <PatternLayout>
        <Pattern>%d %p %c{1.} [%t] %m%n</Pattern>
      </PatternLayout>
    </File>
  </Appenders>
  <Loggers>
    <Root level="error">
      <AppenderRef ref="logFile"/>
    </Root>
  </Loggers>
</Configuration>

設定ファイル(log4j2.xml)はクラスパス上であればどこに置いても良い.


というわけで,ロギング出来るようになったので,次回こそサーバ側を実装.

Eclipse+Git+Gradleな環境を作る

久しぶりにAndroidアプリ作ろうかなと思った.
今回やりたいのは以下のような感じ.

・サーバクライアントシステムにする.
・サーバ側で定期的に情報収集して,それをクライアントで参照.
・クライアントはもちろんAndroid

まずはサーバ側の開発環境を構築する.
IDEは手元にあったEclipseのバージョン4.4.0を使う.
いつダウンロードしたか覚えてない.

以下,やったこと.

(1)
Gitのリポジトリには,GitHubを使う.
アカウントは持っているので,そこに新たにリポジトリを作成.
何も入っていないが,当然最初はそれで良い.

(2)
前段で作ったリポジトリをcloneする.
コマンドラインでやっても良いと思うけど,Eclipseでやるなら,
「Window」の「Open Perspective」からGitのパースペクティブを開く.

3つくらいあるリンクのうちの「Clone a Git repository」を選択.
URLに,先ほどのリポジトリのURL(末尾が.gitのやつ)を入力して,
あとはよしなにウィザードを進めればcloneできる.

これは完全に気分の問題だけど,ローカルリポジトリのパスは,
普段Eclipseのworkspaceとして使っているディレクトリにした方が良いかな.

(3)
デフォルトだとGradleのプロジェクトを作ることはできないので,
まずは「Gradle IDE pack」をインストールする.

Eclipseの「Help」から「Eclipse Marketplace...」を選択する.
検索窓に「gradle ide」などと入力して,
「Gradle IDE Pack」をインストール.バージョンは「3.8.x+1.0.x」だそうだ.

作業中はスルーしてたけど,「Gradle IDEはもう古いよ」って警告が出るね.
後継は「Buildship」だそうです.そっちに差し替え.バージョンは2.0.

(4)
ローカルリポジトリにGradleプロジェクトを作る.
「File」の「New」からGradle(STS)プロジェクトを選択.
workspaceに,さきほどのローカルリポジトリを選択すれば良い.

BuildShipの場合は「Gradle Project」というのがあるのでそれを選ぶ.
あと,Buildshipだと同名フォルダがある場合,上書きしてくれないみたいなので
一旦別のフォルダにプロジェクトを作って,それらを一式
ローカルリポジトリに移動する,という作業が必要になる.

(5)
Gitのパースペクティブを開き,
masterブランチ上で右クリックコンテキストメニューの「Commit...」を選択.
適当なコメントを書き,全部選択して「Commit and Push」を選択.
認証を求められたら,GitHubのアカウント情報を入力すればOK.
あとは流れに従えば良い.

これでOK.
とりあえずこれで,Eclipse上でGradleプロジェクトを扱い,
それらをGitで構成管理……という構図を作成できた.
次からサーバ側の実装.

一切設計せずに見切り発車で進めるので,どっかでつまずく可能性99%.