無限大な夢のあと

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

Scala関西Summit 2017に参加しました! #scala_ks

関西のScalaの祭典、Scala関西Summit 2017に参加して来ました!
下記はスピーカー視点で失敗したなぁと思った内容をまとめているので、興味のある方はご覧ください。
dke-msy-node.hatenablog.com

こちらのブログは参加しましたブログ?で、他の方のセッションの話やスピーカーの方々と前泊した話、懇親会/2次会の話などをこちらにまとめます。

スピーカーの方々と前泊

弊社の河内さんが今回Scala関西Summit 2017に参加する肩に声をかけ有志でAirbnbで宿を取って前泊しました!
全部で17人も参加したすごい規模で、10名以上がスピーカーという豪華な顔ぶれでした。
1泊組と、2泊組に別れて宿を取り、12時くらいまではそれぞれが行き来するような感じでした。
全員ではないですが、いるメンバーだけで取った写真はこちら(よこなさんはちょうど遊びにきていました!)
f:id:noimpslmtbrk:20170911004254j:plain

ちなみにこの写真を取った後には全員集合し、資料の最終チェックやらをしつつ、お互いの色々な情報交換をした有意義な時間でした!
この日話題をかっさらったエフコードさんの関係者だらけだったので、みんなでお話を伺ったりもしました。
【プレスリリース】チーフアーキテクトとして中村学が入社、顧問に水島宏太氏・麻植泰輔氏が就任。プログラミング言語Scalaを主軸とする開発組織体制を強化。 – NEWS

また、この日に有志で行った亀寿司の美味しさが今でも忘れられません。
https://tabelog.com/osaka/A2701/A270101/27001919/
f:id:noimpslmtbrk:20170911010015j:plain
f:id:noimpslmtbrk:20170911010013j:plain
f:id:noimpslmtbrk:20170911010017j:plain

f:id:noimpslmtbrk:20170911010009j:plain

参加したセッションの話

私は以下のセッションに参加させていただきました。

  • 元インフラエンジニアがScalaを触ってつまづいたところ。
  • Scala and Akka apps on Kubernetes in ChatWork

speakerdeck.com

  • Scala の Functional Programming を支える技術

www.slideshare.net

  • Akka on RaspberryPi

www.slideshare.net

  • Scala on JVM をプロファイリングするツールの紹介

speakerdeck.com

  • Ladder of CQRS+ES

www.slideshare.net


個人的にDDDをやっている身としてCQRSはよく聞くのですが、実践するにあたってどんな苦労があるのかが伝わって来る「 Ladder of CQRS+ES」はすごく興味深かったです

CQRS自体はエリックさんのDDD本、実践DDDの方にも取り扱われていない内容です。

エリック・エヴァンスのドメイン駆動設計

エリック・エヴァンスのドメイン駆動設計

実践ドメイン駆動設計

実践ドメイン駆動設計

書籍的には以下で取り扱われているらしいです。

私自身がCQRS+イベントソーシングの理解度が低いので直接的に中身には触れませんが、それらを実装するにあたって、どんな苦労があって、どのようなアプローチを取っていったかがラダーを登っていくようにわかるという資料になります。
あとでじっくり読み直したい内容です。

懇親会の話

LTもあったりなど大いに盛り上がりました!
speakerdeck.com

www.slideshare.net

懇親会では、本当に色々な方とお話させていただき、とても勉強になりました!
割合、スピーカの方々とお話する割合が多かったのは、スピーカーだった+前泊の河内さんがつながりを作ってくださったおかげだと思います。
本当にありがとうございました。

懇親会の後の2次会の話

麻植さんが声をかけてくださり、有志(ただし、30人!)で2次会に行きました!
f:id:noimpslmtbrk:20170911004246j:plain

こちらでは私のテーブル付近ではスクラムの話で盛り上がり(私が暴走してただけ?)、他社さんではどのようにスクラムをやっているかのお話も聞くことができてとても良かったです。続きもお話したいので、ぜひ新宿GeekLoungeにみなさんお越しください!
shinjuku-geek-lounge.connpass.com

最後に

控えめに言ってもScala関西Summit 2017、最高でした!
来年もぜひ参加したいです!!!!!

Scala関西Summit 2017にスピーカーとして参加させて頂きました! #scala_ks

summit.scala-kansai.org
関西のScalaの祭典、Scala関西Summit 2017に参加して来ました!
また、今回はありがたいことにスピーカーとしての参加でもありました。

www.slideshare.net

東京に住んでる私が今回参加スピーカーとして参加させて頂いた経緯及びその結果についてお話したいと思います。
他の方のセッションの話やスピーカーの方々と前泊した話、懇親会/2次会の話は以下のブログにまとめました!
dke-msy-node.hatenablog.com

また。この文章は個人の見解であり、所属する組織の公式見解ではありませんのでご注意ください。

スピーカーに応募させて頂いた経緯

自分が現在所属しているセプテーニ・オリジナルが今回Scala関西Summit 2017のプラチナスポンサーをさせていただくということで、招待枠を頂けるので会社で交通費/宿泊費を負担するので、希望者のうち3人は参加可能という話がSlackで告知されました。

この交通費/宿泊費が会社負担ということが一つチャンスだと思いました。
自分自身の今年の目標として、個人・会社のブランディング/採用の促進のためにカンファレンスの発表を複数回行いアウトプットすることを掲げていて、Scalaでもどこかのタイミングで挑戦したいと思っていたからです。
Scalaの発表は今までのいろんな方の発表を今まで見てきていて敷居が高いと感じていたのですが、Scalaの大きなイベントはScalaMatsuriを除くとそう多くないので、まずは今回のチャンスでもあるScala関西2017へCFPを出してみようと思いました。
(さすがに自腹で関西まで遠征して発表するところまでは踏み切れていませんでした。。)

発表資料のテーマについて

いざCFPを出すとなった時にどのようなテーマで出すかについて、非常に悩みました。
JJUG CCC Spring 2017で「グラフデータベース入門」というテーマを採択していただき、発表させて頂きました。

www.slideshare.net

こちらはいくつかCFPを出した中でのいわゆるニッチ戦略を取ったもので、自分自身がR&Dプロジェクトでグラフデータベースの経験があったので他の方があまり経験がないテーマなので、もしかしたら採択されるかもしれないという想いを持っていました。
結果的に採択して頂き、発表はさせて頂いたのですが、自分自身の中で一つだけ疑問がありました。
個人や会社のブランディングのために発表はさせていただくのはわかるのですが、このテーマの発表で果たして発表は促進されるのだろうかと。
自社コミュニティの告知は行えはしましたが、そこからどれくらいコミュニティの勉強会への流入があったか。
また、発表のようなアウトプットを行うことで自分自身の技術力を高める目的もあったのですが、入門内容の紹介ということで現在高めたい技術であるScalaやSwiftのコーディングに直接関係ないものになるので、果たして今優先順位的に時間をかけるべきだったのかという想いもありました。
(もちろん発表させて頂いたことで、新人研修の時の講師だった方、インターン時代の友人、前職の後輩も観に来てくれてお話できたことや今回のScala関西Summit 2017で資料観ましたよーとお話してくれる方もいて、メリットは非常に大きかったです。)

そこで今回はScalaやSwiftのコーディングに直接関係あるもので、今回もニッチ戦略としてCFPにうまく採用されるようなテーマを考えた結果、
iOSエンジニアのためのScala入門(あるいはScalaエンジニアのためのSwift入門)」とすることを決めました。

もちろん、グラフデータベースにScalaを絡めるケース自体も考えたのですが、Scala自体の学びよりグラフデータベース側の学び中心となる割合が大きくなると思い、CFPを出すのは(記憶が正しければ)やめたはずです。

今回採用して頂けて本当にありがたかったです。
Scala関西Summit 2017のスタッフの方々、本当にありがとうございました。

今回の発表にあたって自分が解決したかった課題

いざCFPを採用して頂いて嬉しかったとともに、Scalaのカンファレンスで発表するにあたって、一つ自分自身の中で解決したい課題がありました。
その課題というのは、入門者向けセッションにおいて実際に参加している入門者を置き去りにしないことです。
(あくまでも個人の感じた範囲であり、事実とズレもあるかもしれませんし、もしに不快に思って頂いた方がいたら本当に申し訳ございません)

もちろんScalaのカンファレンスに参加するくらいなので、参加者としてもある程度プログラマーとして経験値があったり、趣味でScalaを書いていたりする人が参加するものかもしれないので、他の経験値で補うことができるので、そのような配慮は必要ないかもしれません。

ただ、他言語経験者でScala自体は触ったことはないけれど、勉強したいという方は一定数いるはずという想いもあり、そのような方でも置き去りにしないような形で発表できたら自分が参加者だったら聞きたいなと思い、作り始めました。

発表資料を作ってみて

一旦、仮で作成して社内練習会で発表したのですが、この発表で「ここだけは一番押さえて欲しいところはどこであるか」と聞かれた時に、自分自身としてはScala/Swift両言語をクイックツアー的に捉えてもらえるのが意図としてあったのを改めて自覚ができたので、そちらの方に梶を切って資料の修正を行いました。
(もしかしたら、この時点でもすでに内容は薄くなっていた可能性はあります。。)

ただ、入門者を置き去りにはしないコンセプトを作るにせよ、Scala自体の経験者でも学びがあるように作るにはどうすれば良いかも考えました。
ですが、コードの書いている時間がScala < Swiftで、Scalaの経験が少ないこともあり、途中でツッコミが起こりそうなトピック(Genericsなど)を取り扱うかを悩み、結果ツッコミが怖かったことと発表時間の関係で削っていた結果、現在の資料の形に落ち着きました。
その結果、クイックツアーで入門者を置き去りにはしないのですが、どちらかの言語を経験している方からすれば文法の比較の紹介に留まってしまう内容になりました。また、ツッコミが怖いところを落とした結果、プログラミング入門者向け近くまでの内容の薄さになってしまいました。

この時点で発表資料として、以下の問題があると自分の中では考えていました

  • 途中でツッコミが起こりそうなトピック(Genericsなど)を取り除いた結果、プログラミング入門者向け近くまでの内容の薄さになっていないか。
  • クイックツアーと言いつつも学べることに偏りがあり、聞く人側の視点で作れていないのではないか。
  • タイトルと発表資料の中身が乖離していないか。

実際に発表を行って

やはり発表したあとに、周りの聞いている方の反応的にやらかしてしまった感があったのですが、そのあとにScala関西Summit 2017のハッシュタグで、セッションを聞いていた方がコメントくださっているのを見て、自分自身の杞憂でなかったことを実感し、改めて発表の難しさを痛感しました。

今からテーマを変えられるなら、「他言語経験者がゼロから始めるScalaとSwift入門」と言ったテーマが適切な気がします。
個人的には、自分ができたこととして、ツッコミが怖くても取り扱いを行うべきだったと実感しています。
あと、完全にScalaエンジニアばかりが多い中で、iOSエンジニアのため~というテーマで書いていたものの、Swift、Scala両方の人にもわかるものという追求をしてしまったのもよくなかったです。。
(ただ、スタッフの方でiOSはそれなりにやっていて、Scala詳しくないという方は勉強になりましたと言って頂けて嬉しかったです!)

今後のアクション

今週の9/16(土)に、iOSDC JAPAN 2017で、「動画コンテンツにおいて、バックグラウンドの音声との制御でつまづいたところ」というテーマで発表します。
iosdc.jp

iosdc.jp

上記で発表するにあたり、以下を意識して今回の学びをぜひ活かしたいと思います。

  • 聞く側の視点を意識して作る(この発表を聞きにきてくれる人は何を期待しているのか)
  • ツッコミどころがある程度来ることを覚悟して資料を作る(他の人からのツッコミも新たな学びに繋がるので、逃げない)
  • タイトルから中身を乖離しすぎない(乖離しすぎる時は発表前にタイトルを変えるなどの対応を行う)

実際には次の発表は実際に業務でつまづいてどのように解決したかを発表する内容なので、今回とケースは違います。
ただ、上記の学びを活かせるはずなので、その上で堂々と発表したいと思います。
もし、ご参加される方はセッションを聞いてくださると嬉しいです。

という珍しくスピーカーの中の人の舞台裏?の話でした。
今後カンファレンスなどで発表したいと思う人が読んでくれて、少しでも参考になれば嬉しいです。

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

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

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

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

速習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)