無限大な夢のあと

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

速習TypeScript 書評 -WINGSプロジェクト( @yyamada ) 

WINGSプロジェクトの書籍レビュアーに応募し、献本してもらったので、書評を書きました。

今回は表題にある通り「速習TypeScript」の書評となります。

速習TypeScript: altJSのデファクトスタンダートを素早く学ぶ! 速習シリーズ

速習TypeScript: altJSのデファクトスタンダートを素早く学ぶ! 速習シリーズ

前提として、私自身は業務ではJavaScript(ECMAScript2015)で開発は行っておりますが、TypeScriptでは行ったことはなく、2-3年前に軽く書籍を読んで遊びで書いたくらいです。
今回、業務で実際にTypeScriptを使っているモジュールがあるため、改めて勉強が必要だと思い、レビューアーに応募させて頂きました。

下記、レビュー内容となります。

一言で言うと、「速習TypeScript」という名がふさわしい、要点を抑えつつ100ページ超にコンパクトに内容がまとまっている書籍でした。
本書籍ではインストール方法や文法の紹介にとどまらず、以下のような点まで紹介がありました。

  • Playgroundはもちろんのこと、TypeSearchやVisual Studio Codeなどの便利なツールの紹介
  • コンパイルオプションなどを指定できるtsconfig.jsonの簡易リファレンス
  • アロー関数と関数リテラルのthisの扱いが異なるなどの実際に使ってみるとつまづくポイント

tsconfig.jsonの簡易リファレンスの一部 f:id:noimpslmtbrk:20170703181454p:plain


TypeScriptを使い始めるにあたって、ツールやコンパイルオプションなどの紹介だけでもかなり便利ですが、つまづきポイントまで記載があるのは細部にこだわっていてとても親切だと思いました。
また、書籍自体がコンパクトなのにも関わらず、文法の説明が細かい点もセールスポイントです。

全体的にECMAScript2015とTypeScriptとの比較から説明されていることが多く、Symbol型の存在などECMAScript2015についても理解が深まりました。
また、TypeScriptでは以下のような文法/機能が使えるというのが今回書籍を読んでみて自分にとって参考になった点です。

  • 変数内への文字列埋め込み
  • 文字列リテラル
  • タプル
  • 共用型
  • エイリアス
  • null非許容型
  • 型ガード
  • abstract
  • interface
  • 構造的部分型
  • 交差型

また、これらについては、普段業務で使っているScalaやSwiftで使っていないものについては名前だけではわからなかったのですが、
実際に具体例を用いて説明があるので、非常に理解の助けになりました。

まとめますと、この書籍一冊でTypeScript入門はもちろんのこと、TypeScriptを既に知っている方も知識の確認ができるので、非常にオススメです。

最後に、目次の内容も転載致します。

【目次】
Part1:はじめに
 JavaScriptの代替言語 - TypeScript
  主なaltJS
  TypeScriptの主な特徴
  (1)開発環境が豊富である
  (2)JavaScriptのスーパーセットである
  (3)ECMAScript 2015の仕様にいち早く準拠
 TypeScript学習の準備
  TypeScript Playground
  コマンドラインからの実行
  [1]Node.jsをインストールする
  [2]TypeScriptをインストールする
  [3]TypeScriptでコンパイルを実行する
 対象読者
Part2:変数/データ型
 変数 - let/var命令
  型を伴う変数宣言
  リテラル表現
  (1)数値リテラル
  (2)文字列リテラル
  データ型を明示的に変換する「型アサーション
  補足:var/let命令の違い
  (1)ブロックスコープに対応したlet命令
  (2)変数の重複を認めない
 定数を宣言する - const命令
 配列・連想配列・列挙体・タプル
  基本的な値の集合を表す - 配列
  補足:Arrayコンストラクターは使わない
  文字列キーで管理する配列 - 連想配列
  連想配列を利用する場合の注意
  関係する定数を束ねる列挙型
  複数の型が混在したタプル型
 高度な型
  共用型
  型エイリアス
  文字列リテラル
  null非許容型
  型定義ファイル
  [1]型定義ファイルをインストールする
  [2]インストールされた型定義ファイルを確認する
  [3]jQueryを含んだコードをコンパイルする
Part3:関数
 関数の基本構文
  function命令による関数の宣言
  関数リテラルによる宣言
  アロー関数(ラムダ式)による宣言
  アロー関数はthisを固定する
 関数のさまざまな表現
  省略可能な引数を宣言する
  引数にデフォルト値を設定する
  (1)任意引数のうしろに必須引数は配置できない
  (2)デフォルト値には式も指定できる
  (3)引数にundefinedを指定した場合
  不特定多数の引数を表現する - 可変長引数
 関数のオーバーロード
  引数/戻り値型としての共用型
  型ガード
Part4:オブジェクト指向構文
 クラスの基本
  クラスを定義する - class命令
  クラスの内外からのアクセスを制御する - アクセス修飾子
  コンストラクターとプロパティ設定
  getter/setterアクセサー
  (1)読み書きを制御できる
  (2)値チェック/戻り値の加工などが可能
  静的メンバー
  名前空間
  階層的な名前空間
 継承/実装
  継承の基本
  メソッドのオーバーライド
  抽象メソッド
  インターフェイス
  インターフェイスの例
  インターフェイスを継承することも
  補足:構造的部分型
  型注釈としてのインターフェイス
  補足:オブジェクト型リテラル
  型としてのthis
 ジェネリック(総称型)
  ジェネリック型の定義
  型引数の制約
  ジェネリックメソッド
  例:オブジェクトのマージ
Appendix:その他
 Visual Studio Codeによる開発
  VSCodeの使い方
  [1]VSCodeをインストールする
  [2]プロジェクトフォルダーを開く
  [3]tsconfig.jsonを準備する
  [4]TypeScriptコードを準備する
  [5].tsファイルをコンパイル/実行する
  [6]コンパイル済みのコードを実行する
 tsconfig.json簡易リファレンス
書籍情報
 著者プロフィール
 基本情報
 サポートサイト

以上、レビューとさせて頂きます。

JavaScript 第6版

JavaScript 第6版

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

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

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

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

デザインサンプルで学ぶCSSによる実践スタイリング入門 書評 -WINGSプロジェクト( @yyamada ) 

表題にある通り「デザインサンプルで学ぶCSSによる実践スタイリング入門」の書評となります。

デザインサンプルで学ぶCSSによる実践スタイリング入門 (CodeZine BOOKS)

デザインサンプルで学ぶCSSによる実践スタイリング入門 (CodeZine BOOKS)

こちらの書評ですが、率直な感想として実践的ですぐに使えるサンプルばかり載っていて、明日から活用できるということでした。

前提として、私のCSSに関してのレベルですが、以下の入門書を一冊読み、都度レイアウトについてWebで検索して、何とか動かすという形が多いです。

10日でおぼえるCSS/CSS3入門教室

10日でおぼえるCSS/CSS3入門教室

元々、サーバーサイドの開発が多く、最近ではiOSの開発をメインに行っているため、それで何とかなっていました。
ただ、職場の新人がCSSでデザインするタスクなどをこなしているのを見て、いざ質問された時に答えられないと面子が立たないなぁと思っていたので、今回書評に応募させていただきました。

ここから、内容について触れていきます。
冒頭で、実践的で明日から活用できると思った点は、デザインでよく見るけど、なんて言うデザインなのか検索できない、またはどう実現するかわからないものについてよく記載してあることでした。
例えば、「1.5 擬似要素で見出しを立体的に表現する」の中で言うと、私の中では以下のものがそれに当たります。

  • 箱型の見出し
  • 折れリボン風見出し
  • カットリボン

また、私が一番嬉しかった章として、8章のfloatプロパティによるレイアウトで紹介されていたレイアウト崩れの対処法がいくつかパターンとして書いたいたのは今後ハマった時に活用させていただきます。

本当にサンプルが豊富で、今後自分で作りたいアプリで検索機能を作りたいなぁと思っていたので、5章のフォーム(検索ボックス)をぜひ活用させていただきたいなと思いました。

以上、書評とさせていただきます。

作りながら学ぶ HTML/CSSデザインの教科書

作りながら学ぶ HTML/CSSデザインの教科書

これからWebをはじめる人のHTML&CSS、JavaScriptのきほんのきほん

これからWebをはじめる人のHTML&CSS、JavaScriptのきほんのきほん

Ruby on Rails 5 アプリケーションプログラミング 書評 -WINGSプロジェクト( @yyamada ) 

Ruby on Rails 5 アプリケーションプログラミング」の書評になります。

Ruby on Rails 5アプリケーションプログラミング

Ruby on Rails 5アプリケーションプログラミング

今回はWINGSプロジェクト様( @yyamada )で書籍レビュアーに応募させていただき書評を書かせていただくことになりました。
まずは、前回に引き続き応募を受けて下さったWINGSプロジェクトの皆様、著者の山田様ありがとうございます。
今後もどうぞよろしくお願いいたします。

さて、ここから本題の書評に入らせていただきます。
2年前の前回のバージョンの「Ruby on Rails 4 アプリケーションプログラミング」の書評の際には、内容に加えて本書の読み進め方を紹介させていただきました。
dke-msy-node.hatenablog.com

今回、本書の内容は一言で言えば、今後Ruby on Rails5(以下、Rails5とする)で開発をしていく方は絶対に買うべきだと言えるものになっています。
理由としては、各項目がかなり詳細に説明されていて、機能の仕組みをはじめ、その機能の落とし穴までをふんだんに図を使用して説明してくれていて理解を助けてくれる内容になっているからです。
また、Rails5に入った新機能についても応用的なものも含め、書籍内できちんと触れられていることもすごく良いと思いました。
例えば、ActionCableについてはP10で、Railsのドキュメントのリンクの紹介があったり、Rails APIモードについてもP10、P509でも触れられていました。
Rails5.1以降のクライアント技術にも触れられていて、そこもより実用的だと感じました。

ただ、Rails5で本格的に開発したいとなると、もう少しサンプルプログラムが欲しいというところや環境構築周りもフォローする書籍は別のものも欲しいという要望が出てくると思います。

Railsのインフラ周りは以下の書籍などが現状では参考になりますが、可能であればそこもフォローする手段をもう一歩踏み込んで記載して頂けると嬉しいです。

Ruby on Rails環境構築ガイド

Ruby on Rails環境構築ガイド

もちろん、今回の書籍でも実用的な観点でMariaDB+Nginx+Pumaの構成のサンプルなど、前回の内容からグレードアップしているところは嬉しかったです。
ただ、おそらく書籍の厚さの制限で削られた箇所もいっぱいあると思いますので、今後Railsの書籍のバージョンアップの追随については前編/後編に書籍を分けて、後編でクライアントサイド+サンプルプログラムの充実+インフラ周りのフォロー(可能ならAWSを絡めた実用)の書籍が出てくるとよりうれしいかなと思いました。

以上、書評とさせていただきます。

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プログラミング