Blufflog

This blog is bluff.

『Java本格入門 ~モダンスタイルによる基礎からオブジェクト指向・実用ライブラリまで』を読んだ

Java本格入門 ~モダンスタイルによる基礎からオブジェクト指向・実用ライブラリまで』1 を読んだ。

Java の基本文法は知っているが、うまく使いこなせる気がしないので読んだ。本書では主に次の 2 点を学べる。

  1. Java 8 の新機能(e.g., Stream APIラムダ式
  2. 開発現場での実践的な書き方

現在、Java はバージョン 12 まで出ているが、Stream APIラムダ式は依然重要だと思われるので、これを学ぶ意義は大きい。
また、クラスが錯綜している日付処理について整理できたのが良かった。Java 8 以降の場合、基本的には Date and Time API を使えばおk(e.g., java.time.LocalDateTime)。
さらに、Java ネイティブの書き方だけでなく、周辺ツール(e.g., Maven、Jenkins)や外部ライブラリ(e.g., Apache Commons、Jackson)についても触れられている。また、簡単にではあるが、オブジェクト指向的な書き方・スレッドセーフ・デザインパターンについても書かれており、Java 開発に必要な情報は一通りまとめられている印象。

本書を読む限り、JSON / XML / CSVJava オブジェクトの変換には、それぞれ以下のライブラリを用いるのが良さそう(CSV に関しては他に良いのがあるかも)。

デザインパターンについては、今後この辺りの本で勉強したい。

なお、本書は AmazonKindle 版が販売されているが、自分は Gihyo Digital Publishing で電子書籍版を購入した。こちらで購入すると DRM フリーの ePub と PDF が手に入る。しかも Kindle 版より安い!
オライリーもそうだが、公式が DRM フリーの電子版を提供してくれてることがあるので思考停止で Kindle を買わないように気を付けたい。


  1. 谷本心・阪本雄一郎・岡田拓也・秋葉誠・村田賢一郎(2017)『Java本格入門 ~モダンスタイルによる基礎からオブジェクト指向・実用ライブラリまで』Acroquest Technology監修,技術評論社https://gihyo.jp/book/2017/978-4-7741-8909-3

楽に早起きする方法

昔から早起きが苦手だったのだが、楽に早起きする方法を見付けた気がするので紹介する。当然、万人に合うとは限らないが、自分はうまくいっている。ちなみに超平凡な方法。

TL;DR

帰宅したらすぐに食事・シャワー・歯磨きだけを済ませてすぐに寝る。原則、他のことはやらない。すぐに寝ることで確実に早起きできる。

自分が早起きが苦手な理由

自分が早起きが苦手な理由は、就寝・起床時刻が決められていることにプレッシャーを感じるから。つまり、「○時までに起きなければならない」、そのために「○時までに寝なければならない」といったような状況が苦手。同じ理由で早起きが苦手な人には今回の方法が合う可能性が高い。

方法

会社や学校などから帰宅したらすぐに食事・シャワー・歯磨きだけを済ませてすぐに寝る。原則、他のことはやらない。

メリット

  • ほぼ確実に早起きできる
  • ○時までに寝なければ/起きなければならないというプレッシャーが無い(早く寝ることだけを考えれば良い)
  • 十分な睡眠時間を確保できる
  • 起床時間から逆算した時刻に寝ないので、睡眠時間を柔軟に調整可能(e.g., 疲れているので 1 時間長めに眠る)
  • 早朝にまとまった時間を確保できる
  • 十分な睡眠を伴う起床後という、頭が冴えている時間を自分の好きなことに使える

デメリット

  • 夜に自由時間が無い
  • 睡眠可能時間に余裕があるため、必要以上に寝過ぎてしまうことがある

ポイント

とにかく帰宅後は早く寝ることだけを考える。ただし「○時までに寝なければならない」といった制約は(少なくとも自分にとっては)プレッシャーになるので避ける。

自分は朝の自由時間を少しでも多く確保するために、平日の食事は簡単に済ませ、入浴も湯船には入らずシャワーで済ませている。しかし、食事(料理)や入浴自体が楽しみという人はここに時間を割いて良いと思う。いずれにせよ、自分が最もストレスを感じない方法が好ましいと思う。

John Scarne's Think a Card

今回は John Scarne の『John Scarne's Think a Card』1 について。

現象

観客がシャッフルしたデックをテーブルに表向きで広げる。2 人の観客と演者がそれぞれ 1 枚のカードを思い浮かべる。演者はそれぞれが思い浮かべているカードの予言を紙に書き、各自の前に置く。各自が思い浮かべているカードがデックから抜き出され、対応する予言の紙がカードの上に置かれる。観客が予言の紙とカードを確認すると、3 つそれぞれが一致している。

演者が自身が思い浮かべたカードを予言するというのはおかしく見えるが、実際の現象は異なる。実際の現象では、演者が自身のカード用の予言を書いた後に、裏向きにスプレッドしたデックから観客が 1 枚を抜き出し、それをマジシャンのカードとしている。よって、このカードは思い浮かべたカードでなく、誰も知らないカードと言った方が正しいし、そのように演出すれば良いだろう。

カードマジックではカード単体でトリックを考えがちだが(少なくとも自分は)、本作のように予言の紙(e.g., メモ用紙、レシート)のようなマテリアルを追加することでアプローチの幅が広がるので、このような考えは柔軟に取り入れていきたい。特にメモ用紙やレシートのような身近なマテリアルは手品臭が少ないので自分の好みにも合う。

原理はシンプルだが充分に通用するトリックだと思う。どこかで試したい。


  1. John Scarne and Dr. Jacob Daley, “John Scarne’s Think a Card”. 1938.

『入門 HTML5』を読んだ

ふいんきで HTML を書いてはいるものの HTML5 についてちゃんと勉強してなかったので、今更ながらオライリーの『入門 HTML51 電子版を読んだ。なお、本書は「HTML5」の入門書であって「HTML」の入門書ではないので、「HTML5」の新機能(差分)を知りたい人向け。

内容としては HTML5 に至るまでの HTML(と XHTML 等)の歴史から始まり、HTML5 対応検出方法・アウトライン(section とか)・Canvas・video 要素・Geolocation API・ローカルストレージ・オフライン Web・フォーム・マイクロデータといった HTML5 の新機能の要点が一通りまとまっている。従来の HTML と異なり HTML5 では何ができるようになり何が嬉しいのかがよく分かる。

個人的には 1 章の HTML5 に至るまでの歴史が面白かった。HTML 黎明期に行われた img 要素導入の提案に関するメーリングリストでの議論が引用されており、興味深い。

最後に、一番印象に残った箇所を引用しておく。

HTML は常にブラウザメーカーとページ作成者、標準化マニア、そしてたまたまそこへ居合わせてマークアップについて意見を言いたくなった人々の、話し合いから作られてきた。HTML の成功したバージョンはほとんど「レトロスペック」で、現実に追従すると同時に正しい方向へ導こうとする努力の賜物だ。HTML は「純粋」でなくてはいけないと主張する人々(おそらくブラウザメーカーかページ作成者、あるいはその両方を無視することになる)は、単純に間違っている。HTML は今まで一度も純粋であったためしはないし、純粋にしようという試みはすべてとんでもない失敗で、後続によって置き換えられるだけに終わっている。

P.S.

HTML の本にしては 5 章のビデオコーデックやエンコードの話がやたら長い。著者の趣味かな?


  1. Mark Pilgrim(2011)『入門 HTML5』矢倉眞隆監修,水原文訳,オライリー・ジャパンhttps://www.oreilly.co.jp/books/9784873114828/

鏡の中のカード

今回は氣賀康夫氏の『ステップアップ・カードマジック』1 に収録されている『鏡の中カード』というマジックについて。

現象

二組のカードを用いる。裏が青と赤と二組を使うのがいいだろう。一つを術者が、もう一方を観客が保持する。二人は鏡のように同じ動作を何度か繰り返す。最後に二人が選んだカードが一致するので、それだけでも不思議であるが、さらに残りのカードのトップ(一番上)とボトム(一番下)とが一致するのでさらに驚く。
(本書より引用)

本作はデック 2 組を使った『Do as I Do』のバリエーションである。『Do as I Do』は初心者が習うトリックの定番だが非常に強力。自分はデック 2 組を使うことがほとんど無いためあまり演じないが、機会があれば是非演じたい大好きなトリックだ。

『Do as I Do』では、演者と観客それぞれがデックをカットした後、お互いのデックを交換する必要がある。しかし、デック交換の理由付けが難しく、どうしても不自然になってしまう。『鏡の中カード』を取り上げたのは、このデック交換の不自然さをうまく隠蔽しているからだ。

本作では、演者と観客の間に鏡があるという体でマジックを進める。これにより、観客は演者の動きをどのように真似れば良いのか分かりやすいし、演者も観客の動きを制御しやすい。さらに、観客が演者の動きを真似する中で、演者が「デックを交換する」と明言することなしに、いつの間にかデック交換を完了させてしまう。この鏡の演出が、本来不自然なデック交換を隠蔽していて素晴らしい。

しかし、お互いが選んだカードが一致するだけでなく、トップとボトムも一致する現象を入れたのは蛇足に思える。気になるのは、この現象を追加するための手法が強引気味な点だ。
本来、お互いが選んだカードが一致するだけで十分強力な現象なので、強引な手段を使ってまで、トップとボトムの一致という現象を追加するのは、トータルの効果としてプラスになっているか疑問。本作はデック交換をスマートにクリアしているので、そこに強引な手法を入れるのは合わないと感じる。強引で図々しい手法自体は大好きだが。


  1. 氣賀康夫(2005)『ステップアップ・カードマジック』東京堂出版

The Challenge

マジックの本やビデオをレビューするのは少し重いので、トリック単体を紹介する記事を不定期で書いていこうと思う。

今回はDai Vernonの『The Challenge』。この作品はLewis Gansonの『The Dai Vernon Book of Magic』1に収録されている。

現象

演者は2枚のカードを観客に見せる。観客はその内の1枚を心の中で決めるが、演者はそれを当ててしまう。当たる確率は1/2なので観客はまぐれだと思うが、これが何度か繰り返される。しかもこの間、演者は観客に一切質問しない。そして最後に意外な結末で演技を終える。

解説の中で特に面白かった箇所を要約して引用する。

普段カードマジックに熱心ではない人々でさえ、このトリックを高く評価する。恐らくそれは、カード(トランプ)が、たまたまそこにあったからという理由だけで使われており、他の物を使っても良かったように思えるからだ。

つまりこの作品は、「カードマジック」という枠組みを観客に意識させない効果がある。

演者が「これからカード(を使った)マジックをします」と観客に明示的、あるいは暗黙的に示してからマジックを始めると、観客は「(カード)マジック」や「マジシャン」といった既知の概念を念頭に置いた状態でマジックを見ることになる。これが必ずしも悪いこととは思わないが、個人的には、観客にこういった先入観を持たせずにマジックを見せたいと思っている。この点において、本作のアプローチは面白い。

また本作は、カードマジック的な手法の面でも面白い。手法自体はよくあるものだが、このような現象に昇華させている点は独創的。

1/2のカード当てという地味な現象ながら、繰り返しで効果を強め、最後にはクライマックスの現象もある。この一連の現象が手法とうまく結び付いており、傑作だと思う。


  1. Lewis Ganson. The Dai Vernon Book of Magic. 1956.

MacにPlantUMLをインストール

PlantUMLは、UML図作成ソフトウェアである。テキストでUML図を作れるので便利。オンラインコンバータもあるが、今回はMacでPlantUMLを使えるようにする。PlantUMLの実行に必要なJavaGraphvizのインストール方法も説明する。

環境

Requirements

Javaのインストール(今回はOpenJDKのJava 11)

  • ここから openjdk-11*_bin.tar.gz をダウンロード
  • openjdk-11*_bin.tar.gz をダウンロードしたディレクトリに移動
  • $ tar -xzf openjdk-11*_bin.tar.gz
  • # mv jdk-11*.jdk /Library/Java/JavaVirtualMachines
  • $ java -version を実行し、期待するバージョンが表示されるかを確認。異なるバージョンが表示される場合は次に進む
  • $ /usr/libexec/java_home -V を実行し、バージョンを確認
Matching Java Virtual Machines (1):
    11.0.2, x86_64: "OpenJDK 11.0.2"    /Library/Java/JavaVirtualMachines/jdk-11.0.2.jdk/Contents/Home

/Library/Java/JavaVirtualMachines/jdk-11.0.2.jdk/Contents/Home
  • ~/.bashrc 等に export JAVA_HOME=`/usr/libexec/java_home -v [期待するバージョン]` を追記。この場合は 11.0.2
  • $ exec $SHELL -l
  • $ java -version を実行し、期待するバージョンが表示されたら成功

Graphvizのインストール

  • $ brew doctor && brew update
  • $ brew install graphviz
  • $ brew list | grep graphviz を実行し、インストールされていることを確認

前提(または準備)

  • ホームディレクトリ直下に bin, src, jar/plantuml の3つのディレクトリがある。無ければ作る
  • ~/bin にPATHが通っている。通っていない場合は、~/.bashrc 等に export PATH="$HOME/bin:$PATH" を追記し、 $ exec $SHELL -l を実行

PlantUMLのインストール

  • ここから plantuml.jar をダウンロード
  • plantuml.jar を ~/jar/plantuml に移動
  • ~/src/plantuml.sh を作成
#!/bin/bash

java -jar $HOME/jar/plantuml/plantuml.jar "$@"
  • $ chmod +x ~/src/plantuml.sh
  • $ ln -s ~/src/plantuml.sh ~/bin/plantuml
  • $plantuml -v を実行し、バージョンが表示されたら成功

Usage

$ plantuml [input]
e.g., $ plantuml test.pu を実行すると、test.png が生成される

詳しい使い方は、 $ plantuml -h 等で確認してください。

LaTeX数式記法への対応

UML図に数式を入れる場合、LaTeX記法を使えるようにする。

  • ここから plantuml-jlatexmath.zip をダウンロード
  • plantuml-jlatexmath.zip をダウンロードしたディレクトリに移動
  • $ unzip plantuml-jlatexmath.zip
  • $ mv plantuml-jlatexmath/*.jar ~/jar/plantuml
  • textest.pu を作成
@startlatex
\sum_{i=0}^{n-1} (a_i + b_i^2)
@endlatex
  • $ plantuml textest.pu を実行し、以下のような textest.png が生成されたら成功

textest.png
textest.png

スタイル

PlantUMLはデフォルトのデザインがダサく、解像度も低いので、Skinparamをいじってあげると良い。フォント等も変えられる。

例えば、以下のような style.pu を作成し、別のpuファイルで !include style.pu と書くことで、style.pu の内容を適用できる。

skinparam {
  defaultFontName Avenir Next
  dpi 300
  monochrome true
  shadowing false
}

参考:Changing colors and fonts

プレビュー

Visual Studio CodeにPlantUMLのプラグインをインストールすると,puファイルのテキストを編集しながら,UML図のプレビューを確認できる.
PlantUML - Visual Studio Marketplace

参考:Visual Studio Code で UML を描こう! - Qiita

参考