Blufflog

This blog is bluff.

『初めてのJavaScript 第3版』を読んだ

オライリーの『初めてのJavaScript 第3版』1 を読んだ。

JavaScript をよく分かっていなかったので、ECMAScript 2015 (ES6) を一通り体系的に学べて良かった。

JavaScript 本だとオライリーのサイ本こと『JavaScript 第6版』が有名だが、ES6 非対応なので、同じくオライリーで ES6 対応の『初めてのJavaScript 第3版』を読んだ。

以下、簡単にメモ。

  • 全てはオブジェクト(キー・バリュー)
  • メソッド:オブジェクトのプロパティとして指定される関数
  • class 構文によりクラスベースの OOP が可能
    • 内部的にはプロトタイプベース(プロトタイプチェーン)だが、コードを書く際はクラスベースのつもりで書けば良い
    • class 構文は関数によるクラス定義のシンタックスシュガー
  • 非同期処理は新しい順に async/await (ES7) → ジェネレータ (ES6) → Promise (ES6) → コールバック
    • コールバックで複雑な非同期処理を実装するとコールバック地獄に
    • 新しい構文により複雑な非同期処理をシンプルに書ける
    • async/await が使える環境ならこれを使うのがベスト(?)
    • ジェネレータは直感的に分かりにくい
  • 'use strict'; でエラーチェックが厳しくなり good
  • typeof null === 'object'
  • メソッドの function: を省略可(ショートハンド)
const taro = {
  name: 'Taro Yamada',
  greet() { console.log('Hello!') }  // greet: function() { console.log('Hello!') } と同じ
}
  • アロー関数(ラムダ式的なやつ)は this を束縛しない(語彙的に束縛する)
'use strict';

this.val = 'global';

const fGlobalDef = function() { console.log(this.val); };  // this は呼び出し元オブジェクト(e.g., obj1, obj2)
const ArrowFGlobalDef = () => console.log(this.val);  // this === { val: 'global' }

const obj1 = {
  val: 'obj1',
  fMethod() { console.log(this.val); },
  ArrowFMethod() { (() => console.log(this.val))(); },  // Arrow function's IIFE
  fGlobal: fGlobalDef,
  ArrowFGlobal: ArrowFGlobalDef
}

const obj2 = {
  val: 'obj2',
  fMethod() { console.log(this.val); },
  ArrowFMethod() { (() => console.log(this.val))(); },  // Arrow function's IIFE
  fGlobal: fGlobalDef,
  ArrowFGlobal: ArrowFGlobalDef
}

obj1.fMethod();       // obj1
obj1.ArrowFMethod();  // obj1
obj1.fGlobal();       // obj1
obj1.ArrowFGlobal();  // global

obj2.fMethod();       // obj2
obj2.ArrowFMethod();  // obj2
obj2.fGlobal();       // obj2
obj2.ArrowFGlobal();  // global

// fGlobalDef() の this は呼び出し元オブジェクトになるため
// obj1.fGlobal() の出力は「obj1」、obj2.fGlobal() の出力は「obj2」になる
// ArrowFGlobalDef() の this は定義時のスコープでのオブジェクトになるため
// obj1.ArrowFGlobal() と obj2.ArrowFGlobal() の出力はどちらも「global」になる

ちなみにこちらは未読だが、技術評論社『改訂新版 JavaScript 本格入門』も似たコンセプトの本だと思う。

TypeScript などの AltJS や Vue.js などのフレームワークも勉強したいが、とりあえず次は『CSS3 開発者ガイド 第 2 版』2CSS をお勉強します。


  1. Ethan Brown(2017)『初めてのJavaScript 第3版』武舎広幸・武舎るみ訳,オライリー・ジャパンhttps://www.oreilly.co.jp/books/9784873117836/

  2. Peter Gasston(2015)『CSS3開発者ガイド 第2版』牧野聡訳,オライリー・ジャパンhttps://www.oreilly.co.jp/books/9784873117256/

Paper Work (Asi Wind)

今回は Asi Wind(アシ・ウィンド)のレクチャーノート『Paper Work(ペーパー・ワーク)』1 について。日本語訳がマジックランドから出ており、現在、以下のサイトで購入可能。

3-D Telepathy(3-D テレパシー)

3 人の観客に小さな紙を渡して、そこに情報を書いてもらいます。それぞれの紙は折りたたまれてよく混ぜられてしまいます。観客のうちの 1 人が自由に 1 枚の紙片を選び、残りの紙片は破ってしまいます(1 つは演者が破り、もう 1 つは観客が破きます)。演者は残った 1 つに書かれている情報を正確に読み取ってしまいます。他の観客から、何を書いたのか演者が尋ねられた時に、他の 2 枚の紙片に書かれたことも正確に読み取ってしまうのです。

個人的に本レクチャーノートで一番のお気に入り。本手順はいわゆるセンターテアだが、紙を 3 枚に増やし、選ばれなかった 2 枚を破るという流れになっている。これによりセンターテアに紙を破る理由を与えている点も素晴らしいが、複数の手法を組み合わせることで非常に追いにくくなっているところが巧妙。また、Pit Hartling の「Inducing Challenges」の実践例としても見事。選ばれた 1 枚の紙を読み取り、トリックが終わったと思わせた状態で、オフビートを利用して裏の仕事を実行しながら観客の挑戦を誘う。

演じてみたいが肝心のセンターテアのやり方が分からない。何で学ぶのが良いんでしょうか?

Double-digit Riffle Force(二桁のリフル・フォース)

デックの表を観客に向けてリフルします。そこで見えたカードの数字を 2 つ選んでもらいます。その 2 つの数字は演者がフォースした数字になります。この方法の面白い所は、その前にデックをリフルした場合にばらばらの数字が実際に見えるので、フォースした相手にも他の観客にも非常にフェアに見える事です。

似た方法は見たことがあるが、このフォースは一度のリフルで 2 枚のカード(というか数字)を覚えさせることができる点が特徴。ただ、手法自体の目新しさはあまり無いかも知れない。用途は違うが似た原理でもっと面白いリフルフォースがあり、それは本当に感動した。

Noah(ノア)

この手順の前半 2 段では、適当に選ばれた 2 枚のカードの色と数字が一致します。そして 3 段目では 3 枚のカードが適当に選ばれた後、表向きの状態でデックに戻したら混ぜてしまいます。偶然にも、表向きのカードのすぐ隣のカードがメイトのカードになっています。手順中、デックをしっかりと混ぜているのですが、全てのカードはメイトで隣同士になっています。

本書の目玉となるトリックで、現象は Matching Routine。徐々に現象の強度を上げていく 3 段+クライマックスという構成で、特にクライマックスの解決法はこのプロットの正解に思える。同様の手法は過去に無かったのだろうか?だとしたらこれは凄い。

第 2 段では、実際に起こっていることと、観客の頭の中で起こっていることを微妙に食い違わせるためのサトルティが使われており、これが非常に好み。マジックってこういうことだよ!と言いたくなってしまう。

唯一気になるのは観客がデックをシャッフルできない点。デック全体が特定のオーダーに揃うトリックでは、どこかで観客にデックを混ぜさせたい。より正確には、観客がデックを混ぜたという印象を残しておきたい。例えば、デック全体での Oil & Water では、観客にデックを混ぜさせるという手法がよく使われる。勿論、Matching Routine で混ぜさせる方がデックのオーダー的に難易度は高いが、どうにか観客が混ぜた印象だけでも与えられないだろうか…。

一応、本手順では、第 2 段で観客にしばらくデックを操作させるため、演者がずっとデックをコントロールしていた印象を若干打ち消している。これで、観客がデックを混ぜられないという弱点をカバーしているかも。

著者自身も発展途上であると書いているため、今後の発展に期待したい。勿論、現時点で素晴らしいトリックであることには違いないが。

ちなみに、観客の前で本手順のセットアップを行う方法も解説されているが、これはそれなりに頑張る必要がある。ただ、混ぜられたデック 1 組で臨機応変に手順を繋げ、次の手順の準備をしていくスキルは非常に重要だと思うので、Noah のセットアップに限らず練習したい。

Gang of Four(4 人の仲間)

演者はデックを裏向きの状態でテーブルにリボンスプレッドし、デックのトップ側から 1 枚ずつ表向きにしてテーブルに置いていきます。ここではスペードの 10 でストップがかかったとします。スペードの 10 を表向きでデックのトップに乗せてそこまでに表向きにしたカードは、裏向きにしてスペードの 10 の上に重ねてしまいます。デックを揃えておまじないをかけスプレッドすると 4 枚の 10 が表向きになっています。

DVD『Que Raro』に Dani DaOrtiz の『Twin Souls』という手順が収録されている。これは良い手順だが、観客の前でセットアップするのが難しいところがあった。Gang of Four ではトリックの中でセットアップを行い、Twin Souls に繋げることができる。このセットアップ方法は Twin Souls 以外にも応用が効きそう。

『Que Raro』では、観客の前でセットアップする方法を Dani が解説しているが、あまりにも直接的で笑う。Christian の方法は良い感じだが、Asi の方法がよりスマートだと思う。やはり手順の中でセットアップしてしまうのは良い。

なお、本レクチャーノートではフォースのアウトが解説されていない。この辺りを学ぶなら『Que Raro』・『Utopia』辺りの DVD を見ると良いだろう。『Que Raro』では、Twin Souls に続けて演じるトリックのアイデアを Dani が話しており、これも面白いので見てない人は是非。

P.S.

紙のレクチャーノートとか DVD とかいい加減やめたい。


  1. Asi Wind(アシ・ウィンド)(2019)『Paper Work(ペーパー・ワーク)』小林洋介訳.マジックランド.

トライアンフの向き問題

トライアンフで現象を示す際のカードの向きはしばしば議論の的になる。そこで、この件についての自分の考えを好き勝手に書いてみる(異論はあると思うが…)。候補は次の 2 つ。

  1. 裏向きのカードの中で観客のカードだけが表向きになる
  2. 表向きのカードの中で観客のカードだけが裏向きになる

結論から言うと、自分は候補 1 の「裏向きの中に表」の方が良いと思う。

2 つの候補について、それぞれの利点・欠点を比較すると次のようになる。

1. 裏の中に表 2. 表の中に裏
現象数 1 2
瞬間最大効果
見た目 👍 👎
混乱 👎 👍

トライアンフは、「全てのカードの向きが揃う」・「観客のカードを当てる」という 2 つの現象を含む。候補 1 ではこの 2 つの現象が同時に起こるため、現象数は 1 つである。一方、候補 2 では 2 つの現象が段階的に起こるため、現象数は 2 つである。また、候補 1 では 2 つの現象を 1 つの瞬間に集約するため、(適切にプレゼンテーションすれば)トリックの瞬間最大効果は候補 2 よりも大きくなると考えられる。現象数と瞬間最大効果の比較ではトレードオフ的な部分もあり、どちらが良いかを決めることは難しい。個人的には瞬間最大効果が大きい候補 1 が好みだが、これだけでは決め手に欠ける。

見た目は候補 1 の方が良いだろう。裏向きのカードの中で観客のカード 1 枚だけが表向きになり、そのインデックスが見えている状態が美しい。

「混乱」は、候補 1 が批判される主な理由だ。候補 1 では 2 つの現象が同時に起こるため、観客を混乱させてしまうというものだ。「観客を混乱させない」という点で候補 2 が優れているように思える。

まとめると、候補 1 は見た目は良いが観客を混乱させる可能性があり、候補 2 は見た目は良くないが観客を混乱させない。現象数と瞬間最大効果はどっちもどっち。この時点ではどちらが良いかはっきりしない。そこで、それぞれの弱点を解消できないかを考えてみる。

候補 2 の見た目の悪さを解消するのは前提が崩れるため不可能。では、候補 1 の「混乱」という弱点は解消できるだろうか?
これは、できると思う。

そもそも、トライアンフの 2 つの現象を同時に起こしたからと言って本当に観客が混乱するだろうか、という疑問もあるが、仮に混乱するとしても解決策はある。以下、2 つの解決策を示す。

  1. デックを広げる前に現象を説明する(例:「指を鳴らすと、全てのカードが裏向きに揃います。そして、あなたのカードだけが表向きになります」)
  2. 最初にデック上部のみを広げ裏向きに揃っていることを示してから、全体を広げ、観客のカードだけが表向きになっていることを示す

このようにすることで、候補 1 でも観客の混乱を回避できる。

さらに、「デックを広げる前に現象を説明する」方法の場合、観客の期待を高めた状態で現象を起こす(例:指を鳴らす)ことができる。もちろん、意外性のために事前に現象を説明しない方が良いケースもあるが、原則、事前に現象を説明した方が観客の期待を高めることができ、効果的だと思う(事前に現象を説明しにくいのは、単にタネをバレにくくするための、マジシャンの都合である場合が多い)。

これらを踏まえ 2 つの候補を再比較してみる。

1. 裏の中に表 2. 表の中に裏
現象数 1 2
瞬間最大効果
見た目 👍 👎
混乱 👍 👍
期待 👍 👎

以上より、トライアンフでは「裏の中に表」で現象を示す方が効果的だと思う。

参考

[1] 佐藤総『トランプと悪知恵』.
[2] Dani DaOrtiz. Reloaded. (video).

カードマジックデザインズ

今更ながら、佐藤 総さんの名著『カードマジックデザインズ』1 について。

本書の目玉は何と言っても「ミミック・ショウ」。この原理はマニアであればあるほど凄さが分かる原理・技法の典型だと思う。例えば初心者がこの原理を知っても、他の原理・技法と比べてどこが凄いのか分かりにくいと思う。勿論、演技においては、ミミック・ショウはマニア向けで、一般客相手には使えないということでは全くない。

この原理を知った直後は、なんとかしてこれを使って最強のトリックを作ろうとしたが、最終的にそのような使い方は適さないと思った。最強に不可能性の高いトリックを作ろうと思うと、ミミック・ショウは他の原理に対する優位性に乏しく、その効力を十分に活かせないと思うからだ。

ミミック・ショウは、ある特定の状況下で最大の効力を発揮すると思う。それがどのような状況かは本書を読んだ人ならよく分かると思う。このような状況下でミミック・ショウは、追えない不思議なマジックを演じるための超強力な武器になる。

『Bushfire triumph ver.1.5』や『Acrobat Leader』を筆頭に個々のトリックも素晴らしい。個人的には『Bathtowel Mentalism』がお気に入り。超不思議な上に見た目も面白いので最高。


  1. 佐藤 総『カードマジックデザインズ』https://www.frenchdrop.com/detail?id=2363

『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.