コンユウメモ @kon_yu

作ったガラクタとか、旅行とかの話

クロージャを引数としたメソッド記法の整理

UIAlertActionをインスタンス化するサンプルコードが、定義されているコンストラクタ

public convenience init(title: String?, style: UIAlertActionStyle, handler: ((UIAlertAction) -> Void)?)

と違って引数のhandlerが括弧の外に書くようになっていたので気になって、クロージャを引数に取るメソッドの書き方調べた。

この書き方を、詳解Swiftでは「末尾クロージャ」とという項に書いてあり、

AppleSwiftのlanguage guide では「Trailing Closures」に記されている

注意

  • 勉強中なので情報は間違っている可能性があります
  • 動作確認: Swift2.0
func function1(handler: ()->Void) {
    handler()
    print("this is function1!!!")

}
// クロージャを引数として渡す
let closure = {
    print("this is closure!!!")
}

function1(closure)
//=> this is closure!!!
//   this is function2!!!


func function2(){
    print("this is function2!!!")
}

function2()
// => this is function1!!!


// メソッドとクロージャの引数として渡せる
function1(function2)

//=> this is function1!!!
//   this is function2!!!

// クロージャを直接引数として渡す
function1({
    print("inside")
})
//=> inside
//   this is function2!!!


// クロージャを直接引数とする場合は括弧()の外でOK
// クロージャの引数が一番最後の時のみ
function1(){
    print("outside")
}
//=> outside
//   this is function2!!!

// つまり
// この最後がクロージャが引数の場合はOKで
//  末尾クロージャ/Trailing Closuresの書き方がこれ
func function3(arg1: String, handler: ()->Void) {
    handler()
    print("this is \(arg1)!!!")
}
function3("arg1 string"){ print("arg1 handler")}


// こちらの第二引数がクロージャの場合にはエラーになる
func function4(arg1: String, handler: ()->Void, arg2: String) {
    handler()
    print("this is \(arg1), \(arg2)!!!")
}

function4("arg1", handler: { print("arg1 handler")},arg2: "arg2 string")
//=> arg1 handler
//   this is arg1, arg2 string!!!

// よってこう書くとエラーになる
//function4("aaa", arg2: "arg2 string"){ print("arg1 handler")}

オススメSwift技術書

詳解 Swift 改訂版

詳解 Swift 改訂版

Swiftポケットリファレンス

Swiftポケットリファレンス

分報をタイムライン表示して、もれなくチームの流れを把握しよう

Slackに書き込んだ分報をタイムライン表示しよう

f:id:kon_yu:20160325235052p:plain

対象のhubotのscriptだけさくっと知りたい人はこちらを参照すると良い slackで分報をタイムライン表示して一覧性を手に入れろ - Qiita

分報とは

c16e.com

課題解決へのアクションが遅れてしまうという日報の弱点を克服するために、僕のチームでは「分報」という独自の取り組みをしている。分報ではSlackなどの社内チャットツールを使い、「今やっていること」や「困っていること」をつぶやく。課題をリアルタイムに共有できるのが特徴だ。日報が社内mixi日記だとすると、分報は社内Twitterにあたる。

端的に言うと、slsckに各エンジニアの部屋を作り、作業ログを書き込んでいくというものだ。 また各人の部屋を覗いて、困っていることに素早く気づいて開発の効率化を図ることができる。

いままでの自社での分報的な取り組み「dev/null」で共用作業ログを書く

自社でもすでに思考を吐き出すような感じで「dev/null」と言う共用の作業ログを書く部屋を作っていた。

Twitterでツイートしてもよいが、社内のプロテクトしておくべきことを迂闊に野に放つリスクよりは、クローズドな領域を設けたほうが、これは外に出して大丈夫かな?と考える必要がなく楽で良い。

2,3人なら良いがそれ以上に人数が増えた際に、個々のエンジニアの部屋を見に行くのが億劫ではないと思い、 分報よりも、こちらの方が一覧性があってすぐれいるのでは考えていた

実際に聞いてみた

このような回答を得た。なるほど、よく見るべき人に注力しながら確認すると良いと

それでも全員分のデータが見たいな、オレにはショートカットを駆使してもslackの部屋移動が面倒だ タイムライン的に見られたらチーム全体の雰囲気の一体感が出るのではなかろうかか?

やっぱ、共用の部屋を作った方がいいんじゃないかな?

リモートワークを推進されている会社ソニックガーデンの社長である倉貫さんに聞いてみた

先日ソニックガーデンバーというイベントで、ソニックガーデンの社員さんとお話するチャンス得た sonicgardenbar1.peatix.com

ソニックガーデンではRemottyと言う自社ツールを使ってチャットコミュニケーションをとっている。

また分報と言う概念の前から、Remottyでは各エンジニアの部屋を作って作業ログを書く言う方式を実践されていた。

※「dev/null」の共用部屋を作ったのも過去にRemottyを使ってみて、各人の部屋に書かれると一覧性がないので作ったという経緯もある

リモートワークを推進されている会社ソニックガーデンの社長である倉貫さんなら、

分報はいいと思うんだけど、一覧性がないのが不便だと思う、共用の部屋のほうがいいと思うんだがどうお考えになりますか?

という問題の答えが出せるのではないかと聞いてみた。

頂いた答え(意訳)

  • 共用の部屋だと、自己所有感が無いので気軽に書き込みにくい
  • 共用の部屋で複数のトピックが走っている場合、ログを追いにくい
  • 現在のRemottyにはタイムライン機能が画面右にあるので、一覧性がないと言う問題を克服している

そうRmottyで実は同じようなことが出来るのだ!

タイムラインの特定の書き込みをクリックすると、その書き込みのある部屋に行くことが出来て、前後の書き込みを様子を見たり、アドバイスをしたりできる

Remotty自分の部屋 画面右に自分の部屋の書き込みが表示される f:id:kon_yu:20160325234705p:plain

Remotty グループの部屋 画面右に複数人のグループの書き込みも表示される f:id:kon_yu:20160325234724p:plain

じゃあRemottyを使えばいいじゃないというところだが、ところがどっこい我々はSlackにどっぷりハマっているのだ

それでもSlackを使いたい

以下のことをSlackで通知を受け取っているので、今更Slackから抜け出せない。分報だけ別ツールにはしたくないのだ。

  • デプロイした結果
  • CIを実行した結果
  • エラー発生の通知
  • 異常検知のログ
  • チケットのアサインや通知

というわけで分報やり方を踏襲しつつ、各エンジニアの部屋での書き込みを一纏めに表示するタイムラインの部屋を作るツールが欲しい

HubotでSlackに分報をタイムライン表示する

各エンジニアの部屋での書き込みを一纏めに表示するタイムラインの部屋を作るツールがほしい が無かったので自分で作った

hubotで各エンジニアの部屋をチェックし、発言があればタイムライン用の部屋にリンクを書き込む スクリプト

hubotで各エンジニアの部屋をチェックし、発言があればタイムライン用の部屋にリンクを書き込むことができるようにする

このスクリプトでは以下のことを実施する

  • times_ユーザ名 という部屋で発言をチェックする
  • 発言のオブジェクトから、その発言のパーマネントリンクを作成
  • timelineの部屋に発言のパーマネントリンクを投稿する

hubotのscriptディレクトリにこのようなファイルを作成する script/hunhou2timeline.coffee

# 自分のslackのURL
slack_url = "https://your_tame_name.slack.com"

module.exports = (robot) ->
  # どんな文字列があっても拾う
  robot.hear /.+/, (msg) ->
    room = msg.envelope.room
    # idにドットがあるとURLを展開してくれないので取り除く
    id = msg.message.id.replace(".","")

    # ユーザ名_channelの部屋だけウォッチ対象
    if room.match(/^times_.+/)
      # 展開可能なURLを作成し、タイムライン表示用の部屋に投稿する
      # roomの指定で、 投稿するchannelを指定
   # 第二引数でslackのパーマネントURLを構築
      robot.send {room: "#timeline"}, "#{slack_url}/archives/#{room}/p#{id}"

※ チャンネルに追加しないと、hubotが部屋をウォッチしない(入力内容に対してリアクションをしない)のでtimes_ユーザ名のチャンネルにhubotを追加する

  • 個別のチャンネルにhubotが追加された状態 f:id:kon_yu:20160325234749p:plain

自分のチャンネルに投稿すると f:id:kon_yu:20160325235049p:plain

タイムライン用のチャンネルに投稿されれる f:id:kon_yu:20160325235052p:plain

あわせて読みたい

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

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

小さなチーム、大きな仕事〔完全版〕: 37シグナルズ成功の法則

小さなチーム、大きな仕事〔完全版〕: 37シグナルズ成功の法則

  • 作者: ジェイソン・フリード,デイヴィッド・ハイネマイヤー・ハンソン,黒沢 健二,松永 肇一,美谷 広海,祐佳 ヤング
  • 出版社/メーカー: 早川書房
  • 発売日: 2012/01/11
  • メディア: 単行本
  • 購入: 21人 クリック: 325回
  • この商品を含むブログ (36件) を見る

iOS(iPhone, iPad)アプリ開発 買うべき書籍まとめ(2016年3月版)

はじめに

現役バリバリのiOSエンジニアの方に、iPhoneのアプリ開発で良い本無いかと聞いて教えてもらったり 実際に書店で手にとったり自分で買った本の中で良かった本をまとめておく 初心者向けのiOS開発の本ってけっこうアプリで必ず使うデータの保存や通信、UITableViewについて取り扱ってないのがあり、ちゃんと調べないとお金をドブに捨てることになる

またUIやデザインについても知識が無いと、開発者が個人でアプリを作る場合どうしようもなくダサイものが出来がちなので、 UIデザインや、UXについての書籍も記載する

デザインの本は、すでにiOSエンジニアとして仕事をしている人にも役に立つはず

対象の読者

Swiftは書いたことがないけど、他のプログラミング言語はある程度触ったことがある人

初心者から中級者

YahooのWebAPI使った実践的なサンプルを作れる 図解が超丁寧

本気ではじめるiPhoneアプリ作り Xcode 7.x+Swift 2.x対応 黒帯エンジニアがしっかり教える基本テクニック (ヤフー黒帯シリーズ)

こちらの方がKindle形式になっているので検索しやすい Swift 2標準ガイドブック 【Swift 2.1対応版】

Swift 2標準ガイドブック 【Swift 2.1対応版】

Swift 2標準ガイドブック 【Swift 2.1対応版】

中級者から上級者

iOSというよりガチンコのSwift言語を学びたくなったら 詳解 Swift 改訂版

詳解 Swift 改訂版

詳解 Swift 改訂版

スマフォのユーザインタフェースを学ぶなら

UI GRAPHICS ―世界の成功事例から学ぶ、スマホ以降のインターフェイスデザイン

UI GRAPHICS ―世界の成功事例から学ぶ、スマホ以降のインターフェイスデザイン

UI GRAPHICS ―世界の成功事例から学ぶ、スマホ以降のインターフェイスデザイン

  • 作者: 水野勝仁,深津貴之,渡邊恵太,菅俊一,緒方壽人,iA,鹿野護,森田考陽,庄野祐輔,塚田有那
  • 出版社/メーカー: ビー・エヌ・エヌ新社
  • 発売日: 2015/12/17
  • メディア: 単行本
  • この商品を含むブログを見る

モバイルデザインパターン 第2版 ―ユーザーインタフェースのためのパターン集

iOSに特化してユーザーインターフェースについてもっと学びたい時

SwiftではじめるUI設計&プログラミング 「操作性」と「デザイン性」を兼ね備えたアプリの開発手法

デザイナと共通言語で話せるために

ノンデザイナーズ・デザインブック [フルカラー新装増補版]

ノンデザイナーズ・デザインブック [フルカラー新装増補版]

ノンデザイナーズ・デザインブック [フルカラー新装増補版]

なるほどデザイン

なるほどデザイン

なるほどデザイン

UXとはなんぞやということを学びたくなったら

融けるデザイン ハード×ソフト×ネット時代の新たな設計論

融けるデザイン ハード×ソフト×ネット時代の新たな設計論

融けるデザイン ハード×ソフト×ネット時代の新たな設計論

誰のためのデザイン? 増補・改訂版 ―認知科学者のデザイン原論

誰のためのデザイン? 増補・改訂版 ―認知科学者のデザイン原論

誰のためのデザイン? 増補・改訂版 ―認知科学者のデザイン原論