Shoken Startup Blog

KitchHike Founder/CTO

第2回 Swift 勉強会@TechBuzz でLTしてきた #swiftjp

f:id:sfujisak:20140718204142j:plain

LTしてきました。

第2回 Swift 勉強会@TechBuzz http://atnd.org/events/51944

写真は@edo_m18さんの作成されたFlappy Birdの3D版。やってみたい。大画面でやると楽しそう。

発表者リスト

  • LLプログラマ向けSwift ExtensionsとテストライブラリQuickの紹介 @syokenz
  • Pattern match with case class @Lewuathe
  • Swift (with SceneKit) で簡単な3Dゲームを作ってみた @edo_m18

LLプログラマ向けSwift ExtensionsとテストライブラリQuickの紹介 @syokenz

私の発表は1番目でした。ExtensionsとテストがSpecライクに書けるライブラリのQuickを紹介しました。Quickは実際にアプリ開発で使っていますが、おすすめです。

Pattern match with case class @Lewuathe

Swiftでは、switch文の比較時に "~="演算子が呼ばれます。 NSObjectを継承したclassに、コンストラクタに渡された引数リストでパターンマッチを行える"~="演算子実装することで、Scalaにあるcase class的なことをできるようにした、という発表。

ソースコード

https://github.com/Lewuathe/SwiftCase

Swift (with SceneKit) で簡単な3Dゲームを作ってみた @edo_m18

前半は3Dゲームアプリ開発を通して、SwiftXcodeでのハマりどころを解説されました。 後半はライブコーディング。15分ほどでScene Kitを使った簡単なアプリを解説付きでコーディングされました。

ソースコード

https://github.com/edom18/HelloScene

ライブコーディング

ライブコーディングの1コマ。Scene Kitを使って、簡単な3Dを描画するところまでを説明されました。3Dやゲームの解説を聞いたのは初めてだったので、大変勉強になりました。知識が無い僕にも、説明がすごくわかりやすかったです。コーディングの操作も軽快で、見ているだけでとても楽しいものでした。

f:id:sfujisak:20140718203904j:plain

第4回 Swift 勉強会 LT会@wantedlyでLTしてきた #hack_wantedly

f:id:sfujisak:20140717201558j:plain

LTしてきました。

第4回 Swift 勉強会 LT会@wantedly http://wantedly.connpass.com/event/7043/

明日、別の勉強会で発表する予定があって資料を作っていたので、これはチャンスと思って立候補。 資料のブラッシュアップにも繋がった。アウトプット大事。

写真は、ライブコーディングをされた方(名前失念)の発表中のものです。写真から推測できるように、ライブコーディングは大変盛り上がりました。

LTリスト

  • Swiftで数学 @kubonagarei
  • Swiftの言語仕様 発表者名失念
  • Extensions 私 @syokenz
  • ライブコーディング 発表者名失念
  • Swiftのアプリ開発でハマったこと @susieyy

@susieyyさんの資料

所感

  • 参加者は15人くらいだった。ちょうど話やすい人数。
  • 懇親会まで参加。懇親会の参加率高い。
  • 良い雰囲気の勉強会だったので、また参加したい。

StartUp CTO Night に行ってきた。発表スライドまとめなど #ctonight

f:id:sfujisak:20140718012931j:plain

CTO Night!!!
上の最高にナイスな写真はAWS 高山さんから掲載の許可をいただきました。僕は写ってません。中心に写っているのがAmazon CTO Werner氏。

2014/07/15 にアマゾン社の目黒オフィスで開催された、Startup CTO Night with Amazon CTO というイベントにKitchHike社のCTOとして参加してきました。 Amazon CTO Werner氏による基調講演から始まり、日本の著名なスタートアップのCTOが自社でのAWSの使い方を発表。遅刻してしまって基調講演を聞き逃してしまい後悔。。

しかし、そこは毎日屋台骨を支えているCTOのみなさん、ハッシュタグ#ctonightでポイントを押さえておいてくれました。togetterはこちら。 http://togetter.com/li/693281

発表者リスト

  • Amazon CTO Werner氏による基調講演
  • ChatWork 山本氏
  • KAIZEN platform 石橋氏
  • Nulab 縣氏
  • Sansan 藤倉氏
  • SmartNews 大平氏
  • Sumally 北村氏
  • Vuzz 清田氏
  • Wantedly 川崎氏

肩書きこそ違えど、各スタートアップのCTOや技術責任者の方々。 なんという豪華な顔ぶれ。

そして、発表後に毎回行われたWerner氏と発表者の質疑応答がとても良かった。

発表スライド

公開されている発表スライドをまとめてみた。

Vuzz

Amazon CTOが選ぶHottest Startup Awardに選ばれたVuzz CTO 清田さんのスライド。 うちも料理に関するサービスなので、料理繋がりの大好きなサービスです。 (宣伝: KitchHikeとSnapDishはユーザー連携できる機能があって、KitchHikeのプロフィールページにSnapDishの写真を表示できます。)

料理は世界を繋ぐ! Enjoy Cooking!

Nulab

Nulab CTO 縣さんのスライド。Cacooというとても便利なサービスを福岡から世界中のユーザーへ向けて開発されてます。今日も福岡から来られたそう。Cacooの他にも、Backlog、Typetalkという有名サービスも開発されています。

Wantedly

Wantedly CTO 川崎さんのスライド。英語ぺらっぺらで、外国人かと思いました。Werner氏との質疑応答も流暢にこなしてました。これからのCTOには英語力必要なんだな。

所感

  • MongoDBを使っている会社が多かった。
  • Werner氏による「カスタマーフォーカス」の理念・信念に全CTOが泣いた。(誇張表現あり)
  • AmazonSOAの話も出た。この話? https://news.ycombinator.com/item?id=3101876
  • KitchHikeも発表する側になるように成長していきます。英語やらなきゃ。

よちよち.rb 第25回を見学して勉強会というコミュニティについて考えたこと

よちよち.rb 第25回に主催者のゆかおさんにお願いして見学させてもらいました。

よちよち.rb 第25回 - よちよち.rb(初心者限定 Ruby On Rails 4 とか勉強会) | Doorkeeper

僕は2年ほど前に丸の内MongoDB勉強会を始めました。(しばらく海外に行っていたので今は別の人が主催をしてくれています。)

勉強会という一つのコミュニティを始めるにあたって、意識したことが2つありました。

  1. 自分がいなくなっても継続するコミュニティを目指す
  2. 参加条件を用意して参加者のモチベーションを一定以上に保つ

よちよち.rbというミートアップに参加して感じたことは、上の2つとは全く逆のことでした。 まずは、この2つを意識するようになった経緯を書きたいと思います。

自分がいなくなっても継続するコミュニティを目指す

これは新卒で入社して間もない頃、日本の著名なDebianコミッターの方の講演を聞く機会があり、その中での質疑応答がもろに影響を受けています。 僕の質問「理想の(オープンソース)コミュニティとはどんなコミュニティですか?」に、「自分がいなくなっても継続していくコミュニティが理想なんじゃないかな。」と答えてもらいました。クラウドなんてほとんど知られてなかった当時ですが、DNSなどに代表されるWWWの分散型システムと重なり、とてもとても影響を受けました。

これについて丸の内MongoDB勉強会ではある程度達成できたと思っています。初回の勉強会から約2年。周りの方々の協力のおかげで、僕が海外に行った後でも丸の内MongoDB勉強会は継続的に開催されています。次回は7/17に開催予定です。 丸の内MongoDB勉強会 #18 - 丸の内MongoDB勉強会 | Doorkeeper

参加条件を用意して参加者のモチベーションを一定以上に保つ

こちらはDebian勉強会に影響を受けました。学生時代に初めて参加した勉強会です。とてもドキドキしながら、まだ渋谷にあったGoogleオフィスで開催された東京エリアDebian勉強会に行ったのを覚えています。 当時も今も、Debian勉強会は参加登録と同時に、事前課題を提出することを参加の条件としています。事前課題と言っても、勉強会に参加しようとする人なら時間を少々かければできるものです。当時の事前課題はたしか「自分の好きなオープンソースライセンスとその理由」だったと記憶しています。最新の事前課題を見ると、「本日の東京エリアDebian勉強会でDebianに関して何の作業をするかを宣言してください。」でした。 この事前課題によって、

  • 勉強会参加者の共通知識ができる
  • せっかく事前課題をやったのだから、という気持ちがドタキャンを抑止する
  • まったく事前学習無しのセミナーノリでの参加を抑止し、モチベーション高く参加する

という効果が期待されます。 当時も事前課題のおかげで、初参加の学生ながら会話に参加できたことを覚えています。

丸の内MongoDB勉強会では事前課題では無く、毎回ハンズオン勉強会という形式にして参加条件に「ノートPCにMongoDBをインストールしてくること」としました。こちらもある程度効果があったと思います。全員のノートPCにMongoDBがあることを前提に、レプリカセットやシャーディングなどを参加者同士で実践することができました。

でも、よちよち.rbでは違った

よちよち.rbに参加してまず感じたことは、主催者であるゆかおさんのあたたかさと、ゆかおさんを中心としたコミュニティの一体感。ゆかおさん主催だから参加している人も多いんじゃないかと思います。コミュニティを作る情熱とモチベーションがなければ、週1で勉強会を25回も続ける事はできません。ゆかおさんには感服です。この人じゃないとできない勉強会、これも理想の一つなんだなと考えが変わりました。

そしてもう一つのほう。よちよち.rbでは特に事前課題は無いようです。参加条件も初心者向けミートアップという意味での、「プログラミング歴2年以内程度を想定」というもののみ。にも関わらず、参加者みんなモチベーションが高い。セミナー気分で参加している人はゼロでした。 その理由の一つをWeb上のコメントで見つけました。「前回行けなかったけど、参加者コメントを見てモチベーションが上がった。がんばろう。」という趣旨の書き込みがありました。このいっしょに勉強して、いっしょに成長することが最大のモチベーションなんですね。ミートアップのREADME.mdに書いてありました。

この勉強会のいちばんの目的は、Railsを習得することではありません。目線の高さが同じ人といっしょにひとつの活動を根気よく続けることで自信をつけていくこと、これが最大の目標です。

講師と生徒、のような形式はとらないつもりです。みんなで転んで、みんなで進んでいきます。 効率よりも経過を重視します。2時間で1ページも進まなくても、その時間で考え実行したことが宝です。

参加/不参加はお気軽にどうぞ。無理のない範囲で、たのしく技術をみがいていきましょう。

yochiyochirb/meetups

他にも工夫がいっぱい

  • ミートアップの最初は一人一人自己紹介。1時間程度使っている。

  • 自己紹介は各自Gistを用意。

  • 自己紹介時に自己診断でRailsとGitの経験(ステータス)を共有。

  • Railsチュートリアルをみんなで進めるので継続参加を推奨している。

  • 参加者は名札をつける。前回参加者は持参する。

  • 参加するとシールがもらえるラジオ体操方式。

  • 4,5人のグループにわかれて、Railsチュートリアルを音読する。

  • グループで話題に上がった事をGithubのissueで管理。後ほど全体で共有。

よちよち.rbのみなさまに感謝

よちよち.rbに参加して、コミュニティへの考え方が大きく変わりました。ゆかおさんが中心となって、参加者全員で作っているミートアップなんだな、と感じました。最後にもう一度引用します。

講師と生徒、のような形式はとらないつもりです。

みんなで転んで、みんなで進んでいきます。

効率よりも経過を重視します。2時間で1ページも進まなくても、その時間で考え実行したことが宝です。

yochiyochirb/meetups

Swiftのfuncの引数に出てくるアンダースコアやシャープの意味について調べた

Swiftではfuncでメソッドを定義する。 funcの引数に出てくるアンダースコアやシャープはExternal Parameter Namesという。 これはメソッドの引数をラベル化する場合に使う。Rubyのキーワード引数と似ている。

Swiftでは第二引数以降はラベルを付けて呼び出す必要がある

func join(s1: String, s2: String, joiner: String) -> String {
    return s1 + joiner + s2
}
join("hello", "world", ":") // => コンパイルエラー

join("hello", s2: "world", joiner: ":") // => OK

https://developer.apple.com/library/prerelease/ios/documentation/swift/conceptual/swift_programming_language/Functions.html

アンダースコア ( _ ) は、引数が自明でラベルが必要ない場合に使う

// s2の前に_を書くと、
func join(s1: String, _ s2: String, joiner: String = " ") -> String {
    return s1 + joiner + s2
}

join("hello", "world", joiner: ":") // s2はラベル無しでOK

明示的にラベルで指定して欲しい時は、ラベルとして変数の前に外部から参照する文字列を置く

func join(first s1: String, second s2: String, joiner joiner: String) -> String {
    return s1 + joiner + s2
}

join(first: "hello", second: "world", joiner: ":")

シャープ ( # )は上記の外部から見えるラベルと、内部で使うパラメータが同じ名前の場合に簡略化できる

func join(s1: String, #s2: String, #joiner: String) -> String {
    return s1 + joiner + s2
}

join("hello", s2: "world", joiner: ":")

Shorthand External Parameter Names in Swift - Qiita

イニシャライザではデフォルト値が無くてもラベルが必要

class Example {
  init( counter: Int) { }
}

var example = Example(counter: 0) //ラベル必須
class Example {
  init( _ counter: Int) { }
}

var example = Example(0) //アンダースコアがあるとラベルはいらない