Swift arrays are not lists

第2回 カジュアル Swift 勉強会 @ 青葉台で簡単に共有した内容をまとめました。
当日迷宮入りしてしまった部分も調査を進めましたので、ご興味あればご確認ください。

背景

Advanced Swiftを読んでいたら、mapはreduceを使うと簡単に実装できるよね、ということが書いてありました。

extension Array {
    func map2<U>(transform: Element ->U) -> [U] {
        return reduce([]) {
            $0 + [transform($1)]
        }
    }
}

そして、次にこんなことが書いてありました。

Swift is not Haskell, and Swift arrays are not lists.

Swiftのreduceは毎回新しいarrayを生成するため、パフォーマンスが出ないよ、ということがいいたいようです。
ただ、Haskellと比較してどう違うんだ?とか、Swiftのarrayがlistではないというのはどういうことだ?とか気になって調べていたら、色々発見がありました。

本題

まずは、いろいろな方法で実装したmapの速度を1000件程度で測ってみました。

gist.github.com

以下、解説します。

map2

まずはreduceを使ってmap2を実装しました。このレベルだと体感は大して変わりませんが、数字で見るとやはり遅いようです。(Playgroundだとコンパイルオプションが違ったりするのか、なぜか劇的な違いが出ます。ぜひお手元のXcode7で試してみてください。)

map3

次に、reduceを使わないものをmap3として実装しました。for文を回してresultにappendするシンプルなものです。しかし、僅かに標準map に速度が及びません。
Arrayのcapacityをappendの度に拡張するのがパフォーマンスの障害になっているのでしょうか。

map4

そこで、init(count: Int, repeatedValue: Element) を使ってmap4を実装しました。
resultのcapacityをあらかじめ確保しておけば、appendの度にメモリ確保することはないので速くなるはず、という理論です。
勉強会当日はこのあたりの最適化の方法が不慣れで時間を取ってしまったのですが、なんとか動かせました。
でも数字を見ると明らかなように、遅くなりました。

map5

こうなったらもう意地です。Google先生にお願いしました。
検索でヒットしたこちらの記事を参考に、map5を実装しました。
なんとdispatch_group_asyncでバッチ実行しています。その発想はありませんでした。

しかし・・・いずれもよい結果がでませんでした。

まとめ

結局、なぜ私のコードが標準 map に追いつけないのか、いったい標準mapはどういう実装になっているのかといったことは、残念ながら私の力不足で謎のままとなってしまいました。

Swift is not Haskell, and Swift arrays are not lists.

この一文に含まれる意味を汲み取れれば、もう少し見当もつくのかもしれないなと思い、今日も「すごいH本」を手に取るのでした。

以上です。

LGTM Macアプリを作りました

f:id:toshi0383:20150905232356g:plain

既にTwitterには流してたんですが、開発者のみなさんの普段のLGTMのフローがよりスムーズになるMacアプリを作りました。ご活用ください。
単純に本家(?)のWebサイトのレスポンスが悪かったというのがモチベーションです。

アプリはこちらからダウンロードできます。
いま、AppStoreに申請しています。

みんなでわいわいいじれたほうが楽しいかと思って、下記にソースコードを公開しました。
issue、PR、Forkなどお待ちしてます。今後GitHub上では英語オンリーで行こうと思ってるんですが、issue(要望、バグレポなど)は日本語で書いてくれてもいいです。翻訳します。

github.com

技術的には、Swift2の新機能や各OSSのSwift2ブランチなどを試せて、いい機会でした。
Storyboard Referenceも使おうと思ったんですが、MacアプリだとOS X 10.11でしか動かないみたいで、開発マシンのバージョンをあげちゃうわけにもいかず断念。
StackViewは使ってみたんですが超絶ラクですね。オートレイアウトがとってもシンプルにできました。

Macアプリ自体初挑戦だったので、ViewControllerをいじりながら端末の回転を考えなくて良いという点が新鮮というかラクでした。
あとは、NSImageViewが勝手にアニメGIFをアニメーションしてくれて助かりました。
たぶんまだよくわかっていない部分がたくさんあるので、コードを見て気になったらぜひアドバイスください!

それでは。

360|iDev まとめ

セッションビデオとスライドなどが出揃った模様ですので、記事にしておきます。 下記にまとまって公開されています。

360idev.com github.com

それだけなんですけど、そういえば運営的な視点でまとめていなかったので軽く。

  • 参加者は392人
  • チケットは$899
  • スポンサーは1桁社(最終日朝のState of union というセッションで会計の収支が公開されてました)
  • トラックは最大6つ並行。すべて埋まっていたわけではない。

とか書いていたら下記に主催者の記事が上がってました。

360idev.com

ちょっと残念だった点は、

  • YAPC Asiaのように例えばAppleの中の人が来るみたいなことはなかったこと
  • ランチは会場近くの3箇所のお店から選んでランチチケットを持って行くスタイルで、かなり並んでしまっていたこと

もちろん上の記事にあるように、ランチで並んでいる間暇すぎるので他の参加者とコミュニケーションのきっかけになるというのはありました。実際私もサンフランシスコで働いているエンジニアから色々話を聞いたりすることができましたし。記事によると来年は6箇所に増やしたいとのことですけど、むしろランチセッションにして今半のお弁当配ってほしいなーなんて。無理な注文でしょうか。

そして、来年のチケットは値上げして$1299になるとか。うーむ。ますます個人だと行きづらくなってしまいますね。Indies Indies言っている割には、Indies参加できないというなんという矛盾。。
そう考えるとYAPC Asiaの品質はすごいと思いました。あれだけたくさんのトラックのイベントを2.5日間やってひとり1万以下だなんて!単純に物価!?いやいやそんなわけは。。

まあこのように運営の視点で行くといろいろ突っ込みどころが出てくるんですが、イベント全体としてはとても雰囲気が良かったですし、自分としてはiOS開発者として今年一番刺激を受けたイベントとなりました。参加して良かったですし、ぜひ来年も参加したいと思っています。

日本のイベントとの比較で行くと、英語圏なので、参加者が世界各地から集まっていたという点が、大きく違いますね。主催の記事にあるように、少なくとも12カ国から人が集まっていた、と。日本のイベントはどうしても日本で閉じがちなので、このあたりは日本のイベントの改善点ではないでしょうか。

こちらからは以上です。

360|idev にきています(3日目)

1日目
2日目

200: WHAT’S IN FOR US AFTER THE INDIEPOCALIPSE?

個人アプリの黄金時代が終わったいま、どうすればいい?という内容。
人気者のMarin Torodof 氏(さくじつのEasyAnimationの人)が発表してくれました。

Trodof氏も元々は少人数の仲間を集めて小さなアプリを作ってmake moneyしていたそうですが、最近うまくいかない、デザイナと2人でiOS8のカスタムキーボードを作ったけど、頑張りすぎて病院に担ぎ込まれたため医療費を経費として計上すると完全にマイナス。そんな逆境でワタシはどうしたか!?という、まあ最後は彼の成功エピソードという感じでしたね。

印象に残ったのは、「とにかく自分の好きなこと、やりたいことにフォーカスして、それ以外はやらないようにしたら、物事がうまく回るようになった」と言っていたこと。いわゆる「いい話」だと思うんですが、これは私もそうだと思っています。私はおそらく他のスーパーハッカーのような才能も経験もないですが、プログラミングが好きです。いまのこの環境があるのは常識とか現状にとらわれず、思い切ってそういうことに集中できそうな環境を探して飛び込んで行ったからだと思っています。たぶんあまり経験とかは関係なくて、いつでもなにかしら道はあるというか、そんなことを再確認させられるセッションでした。

人生一度きりですからね。

300: THE CHALLENGES OF BUILDING A DATABASE API (IN SWIFT)

Realmのgiddensさんの話。ゆるキャラでした。
RealmSwiftのAPIがどうしてああなったかというテーマで、とても興味深かったです。
SwiftがXcodeのバージョンごとに全然変わるので、Swift製ライブラリを書くのはまだちょっとツライ(Swift is not ready for 'this', Yet.)と言っていたのが印象的でした。
RealmSwiftは裏側ではがっつり(というかそのまま?)Objective-Cの機能を利用しているということで、XcodeのバージョンごとのSwiftサポートを入れるのが精神的にくるとか。

いまのところ、APIがきれいであるということ以外は、Realm(Objective-C)よりRealmSwiftが優れているということはないようです。性能については、Objective-C<=>Swiftの互換処理が挟まるため、当然Realm(Objective-C)より速くはない、と。structがもう少し動的になったりとかすればPure Swiftにできるかも、とは言ってました(たぶん)。
まあ実際個人アプリで使っている分には全く問題なく使えてますので、ライトユースにはRealmSwiftバンザイと思っています。

ちなみに会場で隣にいたデベロッパ(割とでっかいおっさん)に「Realm使ってる?」と聞いたんですが、「ちょっと見てはみたけど、まだCoreData使うかな。実績あるし。」といった回答。みんな大好きなRealmが本当にCoreDataやSQLiteを置き換えるまでには、USでもまだまだ時間がかかりそうな印象でした。
よく考えたらまだメジャーバージョン0ですしね。

UISearchController with a UICollectionView

POSSIBLE mobileという、会場のすぐ近くにオフィスがあるカイシャの人の発表。

UISearchControllerをUICollectionViewで使うには、というテーマ。
とても簡単に連携できるようでしたが、やはり若干のハマりポイントがあり、その解説も含めて発表してくれました。

サンプルアプリ。 github.com

なんというかアウトラインもしっかり書いてきてたし、バリバリのSIerという雰囲気があり面白かったです。
一緒に働く人を募集していますと言ってましたが、きっとバリバリ系なんだろうなー、とか勝手に想像。

STUMP 360 JR: NOT DEAD YET

何かと思ったら、ちょっとしたゲームの時間でした。2年前から始めたとか。
このイベントで登壇したパネリストがPCは持たずにステージに並んで、観客と双方向にAppleiOSに関する問題を出題して、多く正解したほうが勝ちという、アメリカ人が好きそうなやつでした。結構観客からもコアな出題があったりして、盛り上がりました。観客は問題を見てからググったりしていいけどパネリストはググるの禁止という厳しいルールなんですが、さすがパネリストはエキスパートなので、「知らねーし」みたいな問題もスラスラ答えていました。ああいうのをオタク(horrible geek)というんだな、と思いました、冗談です。

TUESDAY RECEPTION

今日は元気だったので、レセプションにも軽く参加してきました。
私の場合、USのdev事情ってほとんど(Rebuild.fmくらいしか)ソースがないので、こういった懇親会は本当に有益でした。
なんかフランクなノリでライトなオファーをいただいたような気がするようなしないような。。インド人安いけど品質だめだから次は日本かな、とかになるんですかね。あっちにくらべたら日本は単価安いみたいですし。円安エ。。
今日知り合った方だと、ロンドン、サンフランシスコ、シリコンバレー、ブラジル、デンバー(地元)と、本当に世界各国から集まっている感じでした。
まだ、私と同じように日本から来ている人には会っていないです。

まとめ

今日は参加セッションを少なめにしたので、その分中身が濃くなりました。いやはや。
明日は最終日!

360|idev にきています(2日目)

Home - 360|iDev
1日目に続いて、2日目のレポです。

蓋を開けてみるとどうも1日目はおまけだったようで、一番最初にkeynoteがありました。
短いセッションが目白押しで、1日目とは違う体力を使いました。

STILL HERE

keynote。 ジョブスのパロディやら「"アプリ開発"を音とフレーズで表現してみた」というパフォーマンスなどがあり、、
すみません写真でもとっとけばよかったですね。

まあそれは置いておいてこのセッションでは、「AppStoreは市場が成熟しており個人作成のアプリで戦うことがなかなか難しいという現状を踏まえて、今後おれたちはどうしていけばいいのか?"Is indie dead ?"」というトピックについて、プレゼンターが熱く語っていたのが印象的でした。やっぱりiOS devやるなら自分のアイディアで一発当てようぜ的な雰囲気がありますね。フロンティア精神というやつなのでしょうか。

どういうタイミングでリリースするべきかとか、アプリで収益を得るということについて役に立つ情報満載でした。

「Jobsは"Think different"という言葉が有名だけど、Appleがどんどん市場で成功してきているときは、"Think Apple"は"Think different"にはならないからな。」というのは、ナルホド納得。

Indieでやるにはコストかかりすぎて片手間でできないのでは?という問いに対しては、とにかく「Quit Twitter, quit Facebook, quit playing social games, stop watching TV, limit internet use.」という返答。自分の時間もっと大事にしろよ、と。ハッとして即Twitterアプリ消しました。(影響されやすい)

300: SOLVING AUTO LAYOUT PROBLEMS

AutoLayoutでのハマりどころについて丁寧に解説してくれました。
ScrollViewでのAutoLayout、self-sizing-tableview、制約のconflictが起きたときのデバッグ方法など。

コンソールのエラーログも読み方を教えてもらったので、今日からちゃんと読もうと思いました。

100: LOCALIZATION EXPLAINED

AppStoreのユーザのうち41%は中国と日本ということで、今後さらに重要なテーマになっていくと思っていますが、やはり後回しになりがちなのがこちら。
Localizationする際のポイントをわかりやすく解説してくれていました。
シカゴにある会社からみんなできているということで、シカゴもStartup多いのかしら、とちょっと気になりました。

先日のpotatotipsでクックパッドの方がたしかこのトピックで話されていましたが、こちらのセッションでは英語圏のアプリをいかに異なる文化に適用していくか、という視点で、めっちゃ早口の英語で語られていた点が新鮮でした。

Accessibility LabelもLocalizeするの忘れないでね!と補足するあたりさすがだなと思いました。

サンプルアプリ

github.com

100: BEYOND WHITE: EMBRACING THE IOS DESIGN AESTHETIC

デザイナからエンジニアに転向した系の人。はだしで発表していました。

以前の職場でのブラックな話とかきけてなかなか興味深いセッションでした。

プロトタイプするときはクレヨンと画用紙!ファッキンPCから離れろ!とか言っていておもしろかった。

100: MAKING A LIVING IN AND OUT OF THE APP STORE

いかに個人アプリで戦うか?という話。
勉強になったけどよく考えたらたぶんコンサル会社の宣伝セッションだったのかな、とも。

200: CORE ANIMATION FOR THE MASSES

歴戦の猛者といった風格のシニアエンジニアの方の発表でした。
日本で普段参加する勉強会って結構若手が多い感じがしていたのですが、このイベントは普通に現役でやっているベテランの方が登壇していて、大変刺激になります。
正直この辺りで体力を使い果たして何言ってるかわからなかったんですが、サンプルアプリ見てるだけでもとても勉強になります。
ホテルで仮眠をとってからはずっとこれで遊んでました。

github.com

BEYOND WHITEの人も言ってましたが、せっかくUIKitやQuartz(CoreAnimation)といった"おもちゃ"が用意されているので、しっかり使いこなして活用していきたいですね。

まとめ

2日目はここまで!

360|idev にきています(1日目)

360idev(すりーしっくすてぃ あいでぶ)
Home - 360|iDev

2009年から続いているiOSの大きなカンファレンスで、アメリカでは結構有名みたいです。会社に「行かせてちょ!」と言ったら快く行かせてくれました。めったにない機会だと思うので、いろいろ吸収してきたいと思っています。

こちらはネームプレート。しっかりしていて感動。。! !f:id:toshi0383:20150817063751j:plain

今日(日曜)参加したセッション

今日は大きなセッションが午前と午後それぞれに4トラックずつあるような形でした。 迷ったんですが、個人的になかなか理解が深まらないUI系の2つに参加してきました。 参加してみたらどちらも手を動かすワークショップ形式で、時差ぼけの影響もあり、初日からぐったり。

以下、雑ですがとりあえず情報発信ということでご容赦ください。

Universal Layout Workshop

http://360idev.com/sessions/universal-layout-workshop/

講師は@iwantarealname さんで、iOS8 Day-by-Dayとか書いてる人でした。 Auto Layout、Adaptive Layout、StackViewと、それぞれポイントを押さえた解説で3時間半があっという間でした。 後半時差ぼけがひどくて頭回らなくて後半ついていけなかった部分があり悔しい。。

こちらはセッションで使用したサンプルアプリ。

github.com

以下、メモ。

  • Auto Layoutはみんなだいたいわかるよね的な進行。
  • よくやるcontrol + drag で制約選択するやり方より、IB右下のアイコン(Pin menu)からまとめてつけちゃったほうが楽だよ、という知見。
  • Adaptive LayoutはiOS8から出たやつで、iOS9では大して変わってないよ。
  • iPhoneのLandscapeがCompact/Compactなのはたぶん、横書きだと横スクロールつらいから、同じ幅でもRegularにはならないんだと思う、みたいな知見
  • Content Hugging Priority を低くすると縮まるor広がる(結構ここは難しくて講師も一瞬ハマってた。)
  • はい、いまAutoLayoutで組んだものをStackViewで置き換えましょー。
  • StackViewはサイズの計算にintrinsic content sizeを使うので注意。imageView画像とかがあるとそのサイズから勝手に計算するよ。
  • IBでStackViewを使うと、AdaptiveLayoutがめちゃくちゃ簡単。全くコード書かなかった。
  • StackViewをアニメーションで表示非表示させる場合とかは、コードを書く必要が出てくる。
  • arrangedSubview(この辺力尽きてた。あとで復習必要。)

上に貼ったサンプルアプリはコミットがわかりやすく切られているので、興味あるひとはいろいろ動かしてみると勉強になると思います。

POWER UP YOUR ANIMATIONS !

@icanzilb さん。
Marin Todorov

AltConfでやっていたのと同じタイトルでした。 発表で使ったアプリも公開してくれるらしいんですがまだなので、AltConfのほうを一旦貼っときます。

https://realm.io/jp/news/altconf-marin-todorov-animations/realm.io

今回の内容はAltConfのからさらに新しいネタが満載でおもしろかったです。

さすが匠の技という感じで、ほんの半日でかっこいいアニメーションがいくつもできあがりました。 EasyAnimationというライブラリの作者の人みたいです。

github.com

このライブラリを使うと、アニメーションの実行をチェーンでつなげることができたり、
Repeatさせてるアニメーションをキャンセルしたり、
CALayerの変更をアニメーションさせたり(UIView.animateWithDuration~だと普通はできない)することができます。

Appleに用意しておいてもらいたいくらいのかゆいところに手が届いているライブラリです。

iOS Animations by Tutorialsという本も執筆されたそうで、英語なんでアレですが入手して頑張って読んでみたいと思います。
http://www.underplot.com

余談

デンバーについての情報をいくつか。

  • デンバー国際空港がインディオ推し
  • 基本的に乾燥していてすごしやすい。夏なのに虫とか全然いない。雪もほとんど積もらないらしい。
  • 街の大きさは、田舎の都会という感じ。仙台とか?道は全然混んでなくて快適。(休日だったからみたい。月曜は夕方ちょっと混んでた。)
  • クラブなどナイトシーンも賑わっている模様。
  • 毎日帰る時にホームレスのメッカを通り過ぎるんだけど、Uberの兄ちゃん曰く "They are nice."
  • タクシーはあまり走ってなくて、バスや電車以外だとUberしかない気がする。

ひとまず速報なんでまとまってないですがこんなところで。
2日目も行ってきます!今日も気が向いたら速報を書きます!

最後に宣伝

ネクストスケープでは一緒に働く仲間を募集しています。 その辺のSIerとは一線を画していて楽しいと思います。ぜひぜひ。

www.nextscape.net

第1回 カジュアル Swift 勉強会 @ 青葉台で発表してきました

SwiftをObjective-Cと一緒に使うことについて発表してきました。

最後のオチがひどいんですが、まあうまく交渉がまとまればいいなあ、と思っています。

上のスライドにもちょっと書いてますが、iOS7対応をしようと思うと、他のSwift製ライブラリをstatic libraryやdynamic frameworkの形で直接インポートできないので、せっかくのネームスペースの良さが生かせないというのがありますね。
たぶん直接ソースコード突っ込めば使えるんでしょうけど、internalな名前が衝突しそうです。
熊谷さんが .frameworkを読み込ませる .a を作ればイケますよと言っていたのだけど、どうやるのかな。

勉強会は、積極的に意見を出す人が多くて、学びが多かったです。
私とか結構資料作っていったんですけど、簡単なテーマをぺろっと出してあとは談笑とかでも十分楽しめそうでしたね。
Javaとかは割とやり方が業界標準として決まってる感がありますが、Swiftは言語的にかなり自由にいろいろな書き方ができるので、議論は尽きないと思います。
他の言語に詳しい方もいて、「Goではこうなってるんですよ」とかすぐに例が出てきて、盛り上がりました。

余談ですが、青葉台は以前嫁が住んでいた頃によく行ってたので、久しぶりの地元、という感覚で懐かしかったです。
当日は花火大会が各地であったようで、浴衣の人をよく見かけました。
夜の懇親会の店は結構美味しかったので貼っておきます。

www.kushikobo.co.jp