読者です 読者をやめる 読者になる 読者になる

無限大な夢のあと

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

Swiftで言語処理100本ノック #1 00. 文字列の逆順 ~ 02. 文字列の交互の結合

try!Swiftに参加して、iOS開発/Swiftのモチベーションが高くなっている嶽です。
今回、せっかく問題を解いたのでブログにアウトプットしようと記事を書きました。

この度、今月の3連休(3/18(土)-3/20(月・祝))に、会社の仲間と開発合宿に行かせて頂けることになり、その中でサーバーサイドSwiftをRaspberry Pi上で動かしてアプリを作ることになりました。
ただ、私自身、業務でiOS開発に入って間もないので、Swiftにはまだ全然慣れていません。
サーバーサイドの処理を書くにあたって、一般的なプログラミング言語の処理に慣れるためにSwiftで次の言語処理100本ノックで問題を解いていくことにしました。
www.cl.ecei.tohoku.ac.jp

今回は、次の3問を解きたいと思います。

  1. 00. 文字列の逆順
  2. 01. 文字列の奇数番目を取り出し、文字列を連結。
  3. 02. 文字列の交互の結合

基本は慣れるのが目的でもあるので、計算量が多いとわかっていても簡潔に書ける方法で問題を解いていきたいと思います。

00. 文字列の逆順
文字列"stressed"の文字を逆に(末尾から先頭に向かって)並べた文字列を得よ.

回答は以下になります。

print(String("stressed".characters.reversed()))
///実行結果 
desserts

以下、簡単な解説です。
処理的には文字列から個々の文字の配列にして逆順にできると良いので、そのような処理はString.charactersが使えそうでした。
String.charactersについて、よく知らなかったので次の書籍で調べました。

Swift実践入門 ── 直感的な文法と安全性を兼ね備えた言語 (WEB+DB PRESS plus)

Swift実践入門 ── 直感的な文法と安全性を兼ね備えた言語 (WEB+DB PRESS plus)

書籍内では次のように解説されています。

/// 実践Swift 40ページ以降
/// 2.6 String型 文字列を表す型

/// 文字列を表すリテラルを文字列リテラルと言い、"abc" のように "(ダブル クオート)で文字列を囲むと文字列リテラルと解釈されます。
/// 文字列リテラル は、文字列を表す String 型や、後述する文字を表す Character 型の値を生成 します。

/// String 型の個々の文字は Character 型で表され、Character 型の集まりは String.CharacterView 型で表されます。
String.CharacterView 型は、Character 型のコレクションを表す型です。コ レクションとはデータの集まりをまとめて格納するデータ構造で、要素の列挙や要素数のカウントなどの機能を持ちます。後述する配列や辞書もコレクションです。

01. 「パタトクカシーー」
「パタトクカシーー」という文字列の1,3,5,7文字目を取り出して連結した文字列を得よ.

回答は以下になります。

print(String("パタトクカシーー".characters.enumerated().filter { $0.0 % 2 == 0 }.map { $0.1 }))
///実行結果 
パトカー

以下、簡単な解説です。
charactersについて、enumratedメソッドを使うと、Tupleを作成できるようです。
以下、Swiftのコード内のコメント。

/// enumeratedのドキュメント
/// Returns a sequence of pairs (*n*, *x*), where *n* represents a
/// consecutive integer starting at zero, and *x* represents an element of
/// the sequence.
///
/// This example enumerates the characters of the string "Swift" and prints
/// each character along with its place in the string.
///
/// for (n, c) in "Swift".characters.enumerated() {
/// print("\(n): '\(c)'")
/// }
/// // Prints "0: 'S'"
/// // Prints "1: 'w'"
/// // Prints "2: 'i'"
/// // Prints "3: 'f'"
/// // Prints "4: 't'"
///

処理としては、個々の文字の配列にして、配列の添字の数を2で割って余りが0の場合の文字列を連結する処理をできれば良いです。
今回はfileterメソッドを使い、使用する文字列を決めて、最後に連結する処理にしました。
filterメソッド内では$0.0は各要素の添字のindex、にアクセスできます。
最後にmapメソッドで受け取ったtupleの文字に$0.1でアクセスできるので、その結果を全体でStringでキャストして、文字列にしています。

02. 「パトカー」+「タクシー」=「パタトクカシーー」
「パトカー」+「タクシー」の文字を先頭から交互に連結して文字列「パタトクカシーー」を得よ.

回答は以下になります。

let patrolCar = "パトカー".characters.map { String($0) }
let taxi = "タクシー".characters.map { String($0) 
print(zip(patrolCar, taxi).reduce("") { $0 + $1.0 + $1.1 })
///実行結果 
パタトクカシーー

以下、簡単な解説です。
まず、後処理でzipメソッドを使いたかったため、「パトカー」と「タクシー」をStringの配列にします。
Character(文字)の配列ではなく、String(文字列)の配列なのはStringクラスに準備されている+メソッドで文字列連結をさせるためです。
その後に、zipメソッドとreduceメソッドを使って、文字列を連結させていきます。
zipメソッドは今回のような用途で使える便利なメソッドです。
zipメソッドを使うと次のような型のデータに変換されます。

/// zipした後の型はZip2Sequence<Array<String>, Array<String>>
/// (_sequence1: ["パ", "ト", "カ", "ー"], _sequence2: ["タ", "ク", "シ", "ー"])

上記のデータをreduceメソッドを使って文字列連結をしていきます。
reduceメソッドは次のように動作します。

初期値は設定している""(空文字)です。
$0は持ち越してくる値になります。
初回は、$0が"" $1は("パ","タ")のTuple $1.0がパ、$1.1がタ
2回目回は、$0が"パタ" $1.0がト、$1.1がク
3回目回は、以下略

もし、こんな処理だともっと簡潔に書けるよーというのがありましたら、ぜひ教えて頂けると嬉しいです。


TECHNICAL MASTER はじめてのiOSアプリ開発 Xcode8+Swift3対応

TECHNICAL MASTER はじめてのiOSアプリ開発 Xcode8+Swift3対応

Functional Swift: Updated for Swift 3

Functional Swift: Updated for Swift 3

#realm_jp #tryswiftconf try!Swift2017 3日目 Realmワークショップ @k_katsumi さん 午前の部

try!Swift3日目に参加させて頂いたRealmのワークショップについて、簡単に記事にまとめさせていただきます。

try!Swiftのコアメンバーで、Realmの中の人でもある岸川さん( @k_katsumi )直々に教えていただける豪華なワークショップでした。

発表資料及びソースコードはこちらになります。
GitHub - kishikawakatsumi/Realm-Hands-On

基本的には資料に書いてあるところの中で、口頭で説明して頂いた点および会場内で質問が出た点について書かせて頂きます。
全体の流れは以下ですが、今回は午前の部について、取り上げさせていただきます。

全体の流れ

午前の部

Realmについて説明。

モバイル用途に最適化されている点としては次が挙げられる。

  1. 遅延ロード
  2. ゼロコピー・アーキテクチャ
    1. 実際に使われるまでメモリが使われない。いわゆるプロセスでいうコピーオンライト。
    2. SQLでいうwhere条件のようなものを指定した場合でも、内部では実際にデータ取得するまではメモリに書き込まれないような仕組みになるらしい。
  3. ネイティブリンク
    1. RDBのJOINなどのコストが高い処理ではなく、オブジェクトのマッピング情報を持っている。
    2. 画面ごとに必要なデータをRealmに格納できる。
    3. ただのKey/Valueではない

Realm設定では以下のようなことも設定できる。

  1. 暗号化
    1. 個人情報などを使用。
  2. マイグレーション時にファイル削除
    1. Realmオブジェクトの構造が変わった時に必要。
  3. このファイルで使用するテーブルを限定
    1. 他のユーザからは絶対に見れないように分割する時に使用する。
    2. AppExtensionなどではメモリで5MBなどの制約があるので、保存されるデータを指定したい時に使う。
  4. 保存場所/ファイル名
    1. 保存場所を用途ごとに変えたい時に使用する
    2. 何も指定しないと~/Library/Developer/CoreSimulator/Devices配下の深い階層にRealmファイルができます。

個人的には初めてRealmを使った時にデータを確認する時にハマりましたが、次のコードでRealmのファイルの場所を確認できます

        let realm = try! Realm()
        print(realm.configuration.fileURL?.path)

また、RealmBrowerをインストールし、ターミナルで次のコマンドを叩けば、Realmに保存されたデータを確認することができます。

    open 先ほど取得したファイルパス


上記を指定した例

let config = Realm.Configuration(fileURL: URL(fileURLWithPath: "..."),
                                 encryptionKey: key,
                                 deleteRealmIfMigrationNeeded: true,
                                 objectTypes: [Article.self, User.self, Comment.self])
let realm = try! Realm(configuration: config)

マルチスレッド

  1. 従来、バックグラウンドスレッドでは、再度PKで取り直したりする方法しかなかった。
  2. 最近追加されたスレッドセーフリファレンスを使えば、スレッドセーフに使える。

Realmオブジェクトの初期化

  1. Realmオブジェクトの初期化にはtry!を普段使う。
    1. クラッシュするのは9割は使い方を間違えたプログラマーのミスで、残りの1割はディスク容量がいっぱいになった時。
    2. 他のアプリで容量を取られていたりするケースがあるので、リカバリーは難しいかも。
    3. よって、try!で十分ではないかという見解だそうです。

Realm Mobile Platformについては午前の部ではさっと流しただけなので、午後の部のところでお話しして頂いたことをまとめようと思います。

午後の部

簡易なTwitterクライアント手を動かすハンズオン。
Realm Mobile Platformのデモ。

→次回のブログに続く。

Swift実践入門 ── 直感的な文法と安全性を兼ね備えた言語 (WEB+DB PRESS plus)

Swift実践入門 ── 直感的な文法と安全性を兼ね備えた言語 (WEB+DB PRESS plus)

Swift実践入門 ── 直感的な文法と安全性を兼ね備えた言語 10章「型の設計指針」

会社で書籍を購入して頂けたので、気になるところを拾い読みしています。

Swift実践入門 ── 直感的な文法と安全性を兼ね備えた言語 (WEB+DB PRESS plus)

Swift実践入門 ── 直感的な文法と安全性を兼ね備えた言語 (WEB+DB PRESS plus)

簡単に自分の理解をブログにまとめたいと思います。
なお、最近iOS開発を始めて、Swiftを始めたばかりなので、ひよこレベルです。

今回は10章の「型の設計指針」がテーマです。
大きく以下の3つの章で構成されています。

  1. クラスに対する構造体の優位性
  2. クラスの継承に対するプロトコルの優位性
  3. オプショナル型の利用指針

クラスに対する構造体の優位性

「クラスに対する構造体の優位性」については、iOS開発に入る前のチュートリアルとしてDDDで掲示板を作成した際に、社内の方がコードレビューで指摘してくださり、以下のリンクを参考にすれば良いと教えていただいたのを思い出し、また記事を読んでいました。
cockscomb.hatenablog.com

この段落では以下の例が挙げられていました。

  • 参照型のクラスがもたらすバグ
  • 値型の構造体がもたらす安全性
  • クラスを利用すべき時

構造体の不要なコピーを発生させない最適化として、内部ではコピーオンライトが使われているようです。
いわゆるプロセスをフォークして子プロセスを作った時に、子プロセスが実際に使われた際に初めてメモリを確保するというのと同じ原理です。

クラスの継承に対するプロトコルの優位性

「クラスの継承に対するプロトコルの優位性」については、以下の例が挙げられていました。

  • クラスの継承がもたらす期待しない挙動
  • プロトコルによるクラスの継承の問題点と克服
  • クラスの継承を利用すべき時

クラスの継承を利用すべき時の中で、複数の型の間でストアドプロパティの実装を共有するというところでプロトコルエクステンションがよくわかっていないかったのですが、理解が深まった気がします。
また、理解が浅かったことを実感し、5章の型の構成要素も読み直しました。

オプショナル型の利用指針

「オプショナル型の利用指針」については、以下の例が挙げられていました。

  • Optional型(?)を利用すべき時
  • ImplicitlyUnwrappedOptional型(!)を利用すべき時
  • 比較検討する時

ImplicitlyUnwrappedOptional型(!)を利用すべき時の例では、サブクラスの初期化より前にスーパークラスを初期化するというところではそうだよね、納得できるなと読んでいました。
また、比較検討する時では、安全性を取るか、厳密性を取るかという点も参考になりました。

11章以降も頑張りたい。

Swift実践入門 ── 直感的な文法と安全性を兼ね備えた言語 (WEB+DB PRESS plus)

Swift実践入門 ── 直感的な文法と安全性を兼ね備えた言語 (WEB+DB PRESS plus)

【書評】Androidアプリ開発 第2版 AndroidStudio2対応( @yyamada ) 

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

こちらのAndroidの書籍ですが、改訂前の書籍はAndroidの一番最初の書籍でした。
ただ、私のAndroidの経験は以下で、初心者レベルです。
Javaの文法はわかる。
・サンプルも動かしたことがない。
IntelliJ自体は実プロジェクトでは使っている。

ここから書籍の書評となります。
Chapter02の「初めてのAndroidアプリ」をMac上で手で動かして、実際に動作させるところまでを確認致しました。
そこ以外に関しては、サンプルを動かして書籍を拾い読みした感じです。

感想としましては、図を丁寧に用いて辞書的に読みやすくて、リファレンスとして使えるということです。
社内のAndroidが詳しい方に書籍の章立てについて意見を伺ったところ、基礎的なところは網羅しているので良い書籍ではないかとのことでした。

ただ、一つ気になった点としては、gradle local.propertiesに作者のファイルパスが載っていて警告が出る点については気になります。
加えて、サンプル自体が細かい粒度でzipになっていて、扱いずらかったです。
Githubなどにファイルを置いてくれると尚嬉しいかなと感じました。

今回は書籍を参考に下記のブログの内容のAndroidをRustで動かすのにチャレンジして、動かすことができました。
qiita.com

自社では実務でScalaAndroidでプロダクトコードを書いているので、今後はこの書籍をリファレンス的に使っていきたいと思います。

Scalaスケーラブルプログラミング第3版

Scalaスケーラブルプログラミング第3版

速攻理解!JavaプログラマのためのScalaプログラミング

速攻理解!JavaプログラマのためのScalaプログラミング

Scala@IntelliJで、不要なauthorコメントを削除する。

社内で毎週実施している輪読会で、チームギークを読む機会がありました。
その内容の中で、不要なauthorコメントを削除すべきという記述もあり、個人的にとても共感できた内容でした。
該当箇所はP56の以下の箇所です。
2章
2.8 エンジニアリングとしてのコミュニケーション
2.8.2 ソースコードに名前を書く(別名:「Authorタグ」問題)
です。

ソースファイルに名前を入れると、あくまでも僕たちの意見だが、百害あって一利なしだ。

具体例については、チームギークの中の書籍をご参照ください。

Team Geek ―Googleのギークたちはいかにしてチームを作るのか

Team Geek ―Googleのギークたちはいかにしてチームを作るのか

今回は実際にツール作成もしない簡単な手順で、IntelliJ@Macでこのauthorコメントを削除する手順を共有したいと思います。
また、今回対象のプロジェクトはScalaで書かれているものですが、少し応用すれば、他言語でも適用できるはずです。

実施手順としては以下です。

  1. IntelliJでshift+command+Rで置き換えダイアログを出す。
  2. Generalタブで「Regular expression」にチェックを入れる。
  3. Generalタブで「Case sensitive」からチェックを外す。
  4. Contextは「in comments」を選択。

以下のパターンをそれぞれ実行。

パターン1

  1. [Text to find:]に「^.*created by.*\n」を入力。
  2. [Replace with:]に空白を入力。
  3. 置換する。

パターン2

  1. [Text to find:]に「^.*created with.*\n」を入力。
  2. [Replace with:]に空白を入力。
  3. 置換する。

パターン3

  1. [Text to find:]に「^.*User:.*\n」を入力。
  2. [Replace with:]に空白を入力。
  3. 置換する。

パターン4

  1. [Text to find:]に「^.*Date: 2.*\n」を入力。※2を入れるのは他のものが誤って消されないようにするため
  2. [Replace with:]に空白を入力。
  3. 置換する。

パターン5

  1. [Text to find:]に「^.*Time:.*\n」を入力。
  2. [Replace with:]に空白を入力。
  3. 置換する。

パターン6

  1. [Text to find:]に「^.*Timestamp:.*\n」を入力。
  2. [Replace with:]に空白を入力。
  3. 置換する。

パターン7

  1. [Text to find:]に「^.*To change this.*\n」を入力。
  2. [Replace with:]に空白を入力。
  3. 置換する。

パターン8

  1. [Text to find:]に「/\*\*[\s]*?\*/」を入力。
  2. [Replace with:]に空白を入力。
  3. 置換する。

パターン9

  1. [Text to find:]に「/\*\*[\s]*?\*[\s]*?\*/」を入力。
  2. [Replace with:]に空白を入力。
  3. 置換する。

IntelliJのバージョンによって、authorコメントの書き方が違うので、上記のような手間のかかる手順となりました。
ぜひ活用してください。

[免責]
この手順の利用は自己責任でお願いします。
この手順を利用して起こったいかなる不都合も作者は保証しません。

Scalaスケーラブルプログラミング第3版

Scalaスケーラブルプログラミング第3版

Android Studio本格活用バイブル ~効率的にコーディングするための使い方

Android Studio本格活用バイブル ~効率的にコーディングするための使い方

Rust入門 #0 Macで開発環境構築 (2017/1/4時点)

Rust Scala atom 開発環境構築

※1/9に以下の対応を追加。

  1. メソッドジャンプをする対応方法をrustyを使う方法に変更。
  2. cargo-editをインストールする方法を追記。

皆様、あけましておめでとうございます。
2017年、よろしくお願い致します。

今年の一発目のブログはRustの開発環境構築です。
Rust自体は前職の方からも名前だけは聞いていたのですが、以下のちょっとしたきっかけで入門してみようと思いました。

  1. 社内のIoTチャレンジ部で、ラズベリーパイで遊んでいた時に、省メモリでかつ関数型っぽく記述できると話題に上がったこと。
  2. 書評レビューア募集で、Android開発の書籍を頂いたけど、 そのサンプルを新しい言語で動かしてみたいなと思ってみたこと。
  3. 王様達のバイキングの11巻で、ValkyrjaというクラッカーがScalaやRustでプログラム書いていたという話が出てきたこと。(←これが一番の理由w)

王様達のヴァイキング 11 (ビッグコミックス)

王様達のヴァイキング 11 (ビッグコミックス)

matome.naver.jp

また、2017/1/2時点でIntelliJのRustプラグインを用いても、メソッドのコード補完などもできないため、コード補完プラグインが存在するatomを用いることとします。

Macのスペック

  • マシン: MacBookPro (Retina,15-inch, Mid 2015)
  • OS: OS X EI Capitan 10.11.6
  • プロセッサ: 2.2 GHz Intel Core i7
  • メモリ: 16GB 1600 MHz DDR3

atom

  • バージョン 1.12.7
  • 日本語化対応済み


  1. Rustをインストール。選択肢では、1を選択。

    curl https://sh.rustup.rs -sSf | sh
    This path will then be added to your PATH environment variable by modifying the
    profile file located at:
    
      /Users/ユーザ名/.profile
    
    You can uninstall at any time with rustup self uninstall and these changes will
    be reverted.
    
    Current installation options:
    
       default host triple: x86_64-apple-darwin
         default toolchain: stable
      modify PATH variable: yes
    
    1) Proceed with installation (default)
    2) Customize installation
    3) Cancel installation
    


  2. 今回の手順では、.bashrcにPATHの記載を追加していく。
    ただし、Mac OS Xのデフォルトでは、HOMEに.bashrcを作成してもターミナル起動時に自動で読み込むようにはなっていないようなので、自動で読み込むように.bash_profileに以下の記述を追加。

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

  3. RustのパッケージマネージャーであるCargoのパスを通すために、~/.bashrcファイルに設定を追加。

    atom ~/.bashrc
    #Rust 
    export PATH="$HOME/.cargo/bin:$PATH"


  4. bashrcの設定を反映する。

    source ~/.bashrc


  5. rustc、cargo、rustupがインストールされたことを確認。

    rustc --version
    rustc 1.14.0 (e8a012324 2016-12-16)
    
    cargo --version
    cargo 0.15.0-nightly (298a012 2016-12-20)
    
    rustup --version
    rustup 1.0.0 (17b6d21 2016-12-15)


  6. 補完に必要なパッケージをインストールする。

    cargo install racer


  7. cargo .tomlを操作するのに便利なパッケージをインストールする。

    cargo install cargo-edit


  8. atomにRust用のプラグインとして、下記をインストールする。
    atom自体のインストールは省略。

    apm install language-rust
    apm install racer
    apm install linter
    apm install linter-rust
    apm install atom-ctags
    apm install script


  9. racerというRustのコード補完を行うプラグインで必要なため、Rustのソースコードを落とす。

    rustup component add rust-src


  10. atomを起動し、環境設定>Packagesで、racerの設定を開く。

  11. 下記の設定項目を入力する。※フルパスでないと動作しなかった。

    Path to the Racer executable

    /Users/ユーザ名/.cargo/bin/racer

    Path to the Rust source code directory

    /Users/ユーザ名/.rustup/toolchains/stable-x86_64-apple-darwin/lib/rustlib/src/rust/src


  12. メソッドジャンプを可能にするためにrusty-tagsを使用する。
    1. ctagsをインストール。

      brew tap universal-ctags/universal-ctags
      brew install --HEAD universal-ctags


    2. rusty-tagsをインストール。

      cargo install rusty-tags



  13. パッケージ管理を容易にできるcargo-editをインストール。

    cargo install cargo-edit


  14. 動作確認として、プロジェクト作成する。

    cargo new hello_world --bin


  15. Rustのコードを実行。
    1. コマンドライン

      cd hello_world/
      cargo run #Cargo.tomlのあるディレクトリで実行


    2. atom
      atomでファイルを開いている状態で、scriptプラグインのショートカット(Command+i)で実行する。


    これでRustの開発環境構築ができて、書き始められるはず!


    今回、参考にさせて頂いた公式チュートリアル/ブログ。

    はじめる

    • atomの導入について参考にさせて頂きました。

    qiita.com

    Scalaスケーラブルプログラミング第3版

    Scalaスケーラブルプログラミング第3版

    Programming Rust: Fast, Safe Systems Development

    Programming Rust: Fast, Safe Systems Development

    Atom実践入門──進化し続けるハッカブルなエディタ (WEB+DB PRESS plus)

    Atom実践入門──進化し続けるハッカブルなエディタ (WEB+DB PRESS plus)

    テキストエディタAtom入門 (OIAX BOOKS)

    テキストエディタAtom入門 (OIAX BOOKS)

【書評】改訂新版JavaScript本格入門 ~モダンスタイルによる基礎から現場での応用まで( @yyamada ) 

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

こちらのJavaScriptの書籍ですが、改訂前の書籍はJavaScriptの一番最初の書籍でした。
ただ、私のJavaScriptの経験は以下で、初心者レベルです。
・研修としてJavaScriptで課題をこなす(文法基礎、コンストラクタとクロージャー、クライアントJavaScriptクロージャー etc)
・実案件ではデモ画面に修正を加える。
・自分のアプリを作成するにあたり、Angular2+Bootstrapで軽く画面を作成。
・転職後に、DDD研修の際にクライアントサイドをAngular.jsで作成。

ただ、転職後にクライアントサイドを触る機会が増えるということで、今回改めてこちらの書籍でしっかりと勉強し直すというところです。
そして、このタイミングで、来月から管理画面のAngularJSに新規画面の追加チケットがあるので、絶好のタイミングです。

ここから書籍の具体的な内容の紹介として、セールスポイントを大きく3つさせていただきます。


①ES2015の記法を追加された箇所にマークが付いていて、分かりやすい。

ざっと読んで、以下の部分がES2015で追加された箇所となります。
・let
・const
・テンプレート文字列
・分割代入(配列/オブジェクト)
・for of 命令
・シンボルオブジェクト
・StringやNumber、Objectオブジェクトなどに追加されたメソッド
・Mapオブジェクト
・Setオブジェクト
RegExpオブジェクトのuフラグ(Unicodeサロゲートペアを認識できる)
・アロー関数
・引数のデフォルト値
・可変長引数
・...演算子
・名前付き引数
オブジェクト指向構文(class、オブジェクトリテラル、モジュール、イテレータ、ジェネレータ、Proxyオブジェクト)
・Promiseオブジェクト
etc

TypeScriptが先取りしたこともあり、これもJavaScriptでできるようになったんだという印象でした。


②GruntやBabelなど、トレンドを押さえている。

GulpやWebPackなどフロントエンドの進化はすさまじいですが、最初の走りだった(と認識している)Gruntを押さえている。
実際に現場に入る際には、現場で使っているツールを学ぶ前にそれがそもそもなぜ必要なのか、なぜ自分の現場ではその上で違うツールを使っているのかを考える際の材料/ヒントが書いているなぁという認識でした。
私は今まさにこれを読んで勉強しているところです。
ちなみにうちの現場ではプロダクトによって、Grunt+TypeScript or ES2015(Babel)となっています。



③図がふんだんに使われていて、説明がわかりやすい

これは改訂前からですが、初めて読んだ時は以下の説明などが図やスクリーンショットが多くわかりやすかったです。
ブラウザー付属の開発者ツール
・クエリ情報をエスケープする
・スコープチェーン
クラスタイプとプロトタイプのオブジェクト指向の違い
・mouseover/mouseoutとmouseenter/mouseleaveの違い
・フォーム全般
・イベントの伝搬(キャプチャ/ターゲット/パブリング)
Ajax全般

Ajaxとか初めての実装の時に最初にわかるまで苦労したなぁ(遠い目)



JQueryのコピペからの卒業にはぴったりの1冊なので、ぜひ皆さん手にとって読んでみてください。

ちなみに私がJavaScriptを学ぶ上で他に参考にした書籍を紹介いたします。ご参考までに。

文法よりの書籍だけど、全てがオブジェクトだということが分かる書籍。

開眼!  JavaScript ―言語仕様から学ぶJavaScriptの本質

開眼! JavaScript ―言語仕様から学ぶJavaScriptの本質

JavaScript本格入門とこいつを照らし合わせて、理解を深める。もはや辞書。

パーフェクトJavaScript (PERFECT SERIES 4)

パーフェクトJavaScript (PERFECT SERIES 4)

リファレンスとして使える。ES2015版のものも出ないかなー

改訂第5版 JavaScript ポケットリファレンス

改訂第5版 JavaScript ポケットリファレンス

DDDで掲示板を作るという研修で、仕事で初めて本格的にAngularJSでアプリを作ることになった際にかなり参考になった書籍。

AngularJS アプリケーションプログラミング

AngularJS アプリケーションプログラミング


以上、簡単ではございますが書評のレビューとさせていただきます。