Hello, afroWorld

afroscriptのafroblog

第3回Swift愛好会合宿 & 初Kotlin愛好会開発合宿やってきたが、変わらず最高だった@土善旅館

f:id:afroscript:20190707132828p:plain

どーも。afroscriptです。

Swift愛好会合宿 & Kotlin愛好会開発合宿 2019、行ってきました。

love-swift.connpass.com

love-kotlin.connpass.com

結論からいくと、相変わらず究極的に楽しすぎたので、その様子を書いていきます。

笹川駅へ向かう

うまいとんかつを食す@いなよし

肉厚、肉厚、肉厚ぅぅぅーー!!最高すぎる。 f:id:afroscript:20190707132350p:plain

f:id:afroscript:20190707132417p:plain

お腹いっぱいで満足すぎたので、さっそくコード書く気がなくなります。開発合宿には強い心を持つことが必要とされます。

到着&乾杯&開発

宿に到着したので、さっそくパシャり。

部屋に入るなり、かんぱーーい! ただし、手違いでお酒がまだ来てなかったので、ひとまずエア乾杯。意外と、エアでも盛り上がることが発覚。

そして、みんなで自己紹介タイム。

で、開発しててしばらくしたらビールが到着。

ビール、ビール、ビールぅぅぅ〜!!

ビールタワー、わーい!

軽食もいっぱーい!

※ちなみに、このイケてる海外ビールたちは、@cozynooksさんからのスポンサー提供でした。ありがとうございますすぎましたmm

そして、みんな順調に進捗が出はじめる。

みんな順調に進捗が出はj...

晩御飯、乾杯、そしてまた開発

晩御飯@19:00は、しゃぶしゃぶにお刺身などなど。相変わらずご飯もうまい。最高かよ。

ご飯が終わったら、さっそく燃料追加。カナダから参加の吉川さんに注いでもらうという、贅沢な図。

この日本酒、すごいスッキリで飲みやすくて、進捗を狂わせる匂いしかしない。

軽食も夜モードにチェンジ。

今回の合宿では、会長のご子息も参加。日本酒を飲みながら子どもたちが大画面でゲームする様子を眺めるという平和な合宿。

思いつきで青春タイムが始まる。外雨だったんだけど、旅館の方が「せっかく買ってきたので、玄関の屋根のところでやります?」って声かけてくれて、「土善旅館の対応が神々しすぎると話題」って記事を書きたくなったほどでした。本当にいつも、感謝感激なんとかかんとか。

引き続き、進捗は進む。

朝ごはん、そしてまた開発

2日目の朝ごはん。

ご飯食べたらまた開発。大画面はよい。いろんな誘惑との戦いでもある。

そして、疲れてたら乾杯。ちなみにこの時点でまだ4ケースのお酒の残りがある。状況は壊滅的だ。

しかし、2日目になるともう、みな精鋭たちである。最後まで進捗を追いかける。

進捗発表談義

最後は進捗発表談義タイム。なんだかんだみんな進捗出てる。お酒だけじゃない。

僕もちょっと進捗だしました。

発表資料はこちら:)

お昼ご飯投入。プリンは土善旅館さんのサービス。おにぎりはお願いすると握ってくれる。最後の最後まで土善旅館さんの対応は神々しい。

子どもも楽しむ。

気づけばそのまま談義。

進捗出なくても談義。

カナダから参加しても談義。

かんぱいやー界のサラブレット。 「0歳から始める、かんぱいやー」って本が近々出るらしい。(ウソ)

会長も談義。長男が父親の背中を真剣に見つめる中、次女の躍動感がはんぱじゃない。それぞれのかんぱいやースタイルの確立を目指しているんでしょう。

談義終わった人からダラける。

一気に談義志望者が増える。 声のかけかた一つで、人の動きは、変わる。

早くダラけたい勢が我先にと談義。

撤収&解散

ギリギリまで談義して、ラスト5分で片付けて終了。

参考

エンジニアのための神旅館「土善旅館

www.dozenryokan.com

肉厚、肉厚ぅぅぅ〜なとんかつ屋さん「いなよし」

tabelog.com

他の人が書いた愛好会合宿ブログもぜひ読んでください〜(随時更新)

運営の@o_chicchiさん

blog.maripara.org

AV Foundation × Core MotionでiPhoneを“楽器”にしよう

f:id:afroscript:20190626203345j:plain

どーも。Swift初心者なのにSwift愛好会の運営をしているafroscriptです。

Swift愛好会 vol.41 @リブセンスで談義してきたので、その資料とコードをアップしておきます。

僕の拙いコードが役に立つとは到底思えませんが、もし試してみたい人が入ればご参考に。

love-swift.connpass.com

ちょっとだけDemo動画(撮ってくれてた)

資料はこちら

コードはこちら

//
//  ViewController.swift
//  instrumentTest
//
//  Created by Kinoshita Yusaku on 2019/05/10.
//  Copyright © 2019 afroscript. All rights reserved.
//

import UIKit
import AVFoundation
import CoreMotion

class ViewController: UIViewController {
    
    let motionManager = CMMotionManager()
    
    // 9 buttons
    var audioPlayerInstance2Bass : AVAudioPlayer! = nil
    var audioPlayerInstance2Cymbal : AVAudioPlayer! = nil
    var audioPlayerInstance2Hat : AVAudioPlayer! = nil
    var audioPlayerInstance2Snare : AVAudioPlayer! = nil
    var audioPlayerInstance2Tom1 : AVAudioPlayer! = nil
    var audioPlayerInstance2Tom2 : AVAudioPlayer! = nil
    var audioPlayerInstance2Tom3 : AVAudioPlayer! = nil
    var audioPlayerInstance1Cymbal : AVAudioPlayer! = nil
    var audioPlayerInstance1Snare : AVAudioPlayer! = nil
    
    var audioPlayerInstanceBuo : AVAudioPlayer! = nil
    var audioPlayerInstanceShakin2 : AVAudioPlayer! = nil
    var audioPlayerInstanceWadaiko : AVAudioPlayer! = nil
    var audioPlayerInstanceBoyon : AVAudioPlayer! = nil
    var audioPlayerInstanceScrach1 : AVAudioPlayer! = nil
    var audioPlayerInstanceScrach2 : AVAudioPlayer! = nil
    var audioPlayerInstanceAmaidesuwa : AVAudioPlayer! = nil
    var audioPlayerInstanceMadamada : AVAudioPlayer! = nil
    


    override func viewDidLoad() {
        super.viewDidLoad()
        
        /*
         モーションセンサー準備
         */
        // キューを実行する間隔(秒数)
        motionManager.deviceMotionUpdateInterval = 0.1
        // キューで実行するクロージャ
        let handler:CMDeviceMotionHandler = {(motionData:CMDeviceMotion?, error:Error?) -> Void in
            self.motionAnimation(motionData, error: error as NSError?)
        }
        // 更新で実行するキューを登録してモーションセンサーをスタートする
        motionManager.startDeviceMotionUpdates(to: OperationQueue.main, withHandler: handler)
        
        
        /*
         音源再生準備
         */
        
        //drum2_bass
        let soundFilePath2Bass = Bundle.main.path(forResource: "drum2_bassdrum", ofType: "mp3")!
        let sound2Bass:URL = URL(fileURLWithPath: soundFilePath2Bass)
        do {
            audioPlayerInstance2Bass = try AVAudioPlayer(contentsOf: sound2Bass, fileTypeHint:nil)
        } catch {
            print("AVAudioPlayerインスタンス作成失敗")
        }
        audioPlayerInstance2Bass.prepareToPlay()

        //drum2_cymbal
        let soundFilePath2Cymbal = Bundle.main.path(forResource: "drum2_cymbal", ofType: "mp3")!
        let sound2Cymbal:URL = URL(fileURLWithPath: soundFilePath2Cymbal)
        do {
            audioPlayerInstance2Cymbal = try AVAudioPlayer(contentsOf: sound2Cymbal, fileTypeHint:nil)
        } catch {
            print("AVAudioPlayerインスタンス作成失敗")
        }
        audioPlayerInstance2Cymbal.prepareToPlay()
        
        //drum2_hat
        let soundFilePath2Hat = Bundle.main.path(forResource: "drum2_hat", ofType: "mp3")!
        let sound2Hat:URL = URL(fileURLWithPath: soundFilePath2Hat)
        do {
            audioPlayerInstance2Hat = try AVAudioPlayer(contentsOf: sound2Hat, fileTypeHint:nil)
        } catch {
            print("AVAudioPlayer1インスタンス作成失敗")
        }
        audioPlayerInstance2Hat.prepareToPlay()
        
        //drum2_snare
        let soundFilePath2Snare = Bundle.main.path(forResource: "drum2_snare", ofType: "mp3")!
        let sound2Snare:URL = URL(fileURLWithPath: soundFilePath2Snare)
        do {
            audioPlayerInstance2Snare = try AVAudioPlayer(contentsOf: sound2Snare, fileTypeHint:nil)
        } catch {
            print("AVAudioPlayer1インスタンス作成失敗")
        }
        audioPlayerInstance2Snare.prepareToPlay()
        
        
        //drum2_tom1
        let soundFilePath2Tom1 = Bundle.main.path(forResource: "drum2_tom1", ofType: "mp3")!
        let sound2Tom1:URL = URL(fileURLWithPath: soundFilePath2Tom1)
        do {
            audioPlayerInstance2Tom1 = try AVAudioPlayer(contentsOf: sound2Tom1, fileTypeHint:nil)
        } catch {
            print("AVAudioPlayer1インスタンス作成失敗")
        }
        audioPlayerInstance2Tom1.prepareToPlay()
        
        //drum2_tom2
        let soundFilePath2Tom2 = Bundle.main.path(forResource: "drum2_tom2", ofType: "mp3")!
        let sound2Tom2:URL = URL(fileURLWithPath: soundFilePath2Tom2)
        do {
            audioPlayerInstance2Tom2 = try AVAudioPlayer(contentsOf: sound2Tom2, fileTypeHint:nil)
        } catch {
            print("AVAudioPlayer1インスタンス作成失敗")
        }
        audioPlayerInstance2Tom2.prepareToPlay()
        
        //drum2_tom3
        let soundFilePath2Tom3 = Bundle.main.path(forResource: "drum2_tom3", ofType: "mp3")!
        let sound2Tom3:URL = URL(fileURLWithPath: soundFilePath2Tom3)
        do {
            audioPlayerInstance2Tom3 = try AVAudioPlayer(contentsOf: sound2Tom3, fileTypeHint:nil)
        } catch {
            print("AVAudioPlayer1インスタンス作成失敗")
        }
        audioPlayerInstance2Tom3.prepareToPlay()
        
        //drum1_cymbal
        let soundFilePath1Cymbal = Bundle.main.path(forResource: "drum1_cymbal", ofType: "mp3")!
        let sound1Cymbal:URL = URL(fileURLWithPath: soundFilePath1Cymbal)
        do {
            audioPlayerInstance1Cymbal = try AVAudioPlayer(contentsOf: sound1Cymbal, fileTypeHint:nil)
        } catch {
            print("AVAudioPlayerインスタンス作成失敗")
        }
        audioPlayerInstance1Cymbal.prepareToPlay()
        
        //drum1_snare
        let soundFilePath1Snare = Bundle.main.path(forResource: "drum1_snare", ofType: "mp3")!
        let sound1Snare:URL = URL(fileURLWithPath: soundFilePath1Snare)
        do {
            audioPlayerInstance1Snare = try AVAudioPlayer(contentsOf: sound1Snare, fileTypeHint:nil)
        } catch {
            print("AVAudioPlayerインスタンス作成失敗")
        }
        audioPlayerInstance1Snare.prepareToPlay()
        
        //buo
        let soundFilePathBuo = Bundle.main.path(forResource: "buo", ofType: "mp3")!
        let soundBuo:URL = URL(fileURLWithPath: soundFilePathBuo)
        do {
            audioPlayerInstanceBuo = try AVAudioPlayer(contentsOf: soundBuo, fileTypeHint:nil)
        } catch {
            print("AVAudioPlayerインスタンス作成失敗")
        }
        audioPlayerInstanceBuo.prepareToPlay()
        
        //shakin2
        let soundFilePathShakin2 = Bundle.main.path(forResource: "shakin2", ofType: "mp3")!
        let soundShakin2:URL = URL(fileURLWithPath: soundFilePathShakin2)
        do {
            audioPlayerInstanceShakin2 = try AVAudioPlayer(contentsOf: soundShakin2, fileTypeHint:nil)
        } catch {
            print("AVAudioPlayerインスタンス作成失敗")
        }
        audioPlayerInstanceShakin2.prepareToPlay()
        
        //wadaiko
        let soundFilePathWadaiko = Bundle.main.path(forResource: "wadaiko", ofType: "mp3")!
        let soundWadaiko:URL = URL(fileURLWithPath: soundFilePathWadaiko)
        do {
            audioPlayerInstanceWadaiko = try AVAudioPlayer(contentsOf: soundWadaiko, fileTypeHint:nil)
        } catch {
            print("AVAudioPlayerインスタンス作成失敗")
        }
        audioPlayerInstanceWadaiko.prepareToPlay()
        
        //boyon
        let soundFilePathBoyon = Bundle.main.path(forResource: "boyon", ofType: "mp3")!
        let soundBoyon:URL = URL(fileURLWithPath: soundFilePathBoyon)
        do {
            audioPlayerInstanceBoyon = try AVAudioPlayer(contentsOf: soundBoyon, fileTypeHint:nil)
        } catch {
            print("AVAudioPlayerインスタンス作成失敗")
        }
        audioPlayerInstanceBoyon.prepareToPlay()
        
        //scrach1
        let soundFilePathScrach1 = Bundle.main.path(forResource: "scrach1", ofType: "mp3")!
        let soundScrach1:URL = URL(fileURLWithPath: soundFilePathScrach1)
        do {
            audioPlayerInstanceScrach1 = try AVAudioPlayer(contentsOf: soundScrach1, fileTypeHint:nil)
        } catch {
            print("AVAudioPlayerインスタンス作成失敗")
        }
        audioPlayerInstanceScrach1.prepareToPlay()
        
        //scrach2
        let soundFilePathScrach2 = Bundle.main.path(forResource: "scrach2", ofType: "mp3")!
        let soundScrach2:URL = URL(fileURLWithPath: soundFilePathScrach2)
        do {
            audioPlayerInstanceScrach2 = try AVAudioPlayer(contentsOf: soundScrach2, fileTypeHint:nil)
        } catch {
            print("AVAudioPlayerインスタンス作成失敗")
        }
        audioPlayerInstanceScrach2.prepareToPlay()
        
        //amaidesuwa
        let soundFilePathAmaidesuwa = Bundle.main.path(forResource: "amaidesuwa", ofType: "mp3")!
        let soundAmaidesuwa:URL = URL(fileURLWithPath: soundFilePathAmaidesuwa)
        do {
            audioPlayerInstanceAmaidesuwa = try AVAudioPlayer(contentsOf: soundAmaidesuwa, fileTypeHint:nil)
        } catch {
            print("AVAudioPlayerインスタンス作成失敗")
        }
        audioPlayerInstanceAmaidesuwa.prepareToPlay()
        
        //madamada
        let soundFilePathMadamada = Bundle.main.path(forResource: "madamada", ofType: "mp3")!
        let soundMadamada:URL = URL(fileURLWithPath: soundFilePathMadamada)
        do {
            audioPlayerInstanceMadamada = try AVAudioPlayer(contentsOf: soundMadamada, fileTypeHint:nil)
        } catch {
            print("AVAudioPlayerインスタンス作成失敗")
        }
        audioPlayerInstanceMadamada.prepareToPlay()

    }
    
    /*
     各音源再生の関数
     */
    
    func playSound2Bass() {
        audioPlayerInstance2Bass.currentTime = 0
        audioPlayerInstance2Bass.play()
    }
    
    func playSound2Cymbal() {
        audioPlayerInstance2Cymbal.currentTime = 0
        audioPlayerInstance2Cymbal.play()
    }

    func playSound2Hat() {
        audioPlayerInstance2Hat.currentTime = 0
        audioPlayerInstance2Hat.play()
    }
    
    func playSound2Snare() {
        audioPlayerInstance2Snare.currentTime = 0
        audioPlayerInstance2Snare.play()
    }
    
    func playSound2Tom1() {
        audioPlayerInstance2Tom1.currentTime = 0
        audioPlayerInstance2Tom1.play()
    }
    
    func playSound2Tom2() {
        audioPlayerInstance2Tom2.currentTime = 0
        audioPlayerInstance2Tom2.play()
    }
    
    func playSound2Tom3() {
        audioPlayerInstance2Tom3.currentTime = 0
        audioPlayerInstance2Tom3.play()
    }
    
    func playSound1Cymbal() {
        audioPlayerInstance1Cymbal.currentTime = 0
        audioPlayerInstance1Cymbal.play()
    }
    
    func playSound1Snare() {
        audioPlayerInstance1Snare.currentTime = 0
        audioPlayerInstance1Snare.play()
    }
    
    func playSoundBuo() {
        audioPlayerInstanceBuo.currentTime = 0
        audioPlayerInstanceBuo.play()
    }
    
    func playSoundShakin2() {
        audioPlayerInstanceShakin2.currentTime = 0
        audioPlayerInstanceShakin2.play()
    }

    func playSoundWadaiko() {
        audioPlayerInstanceWadaiko.currentTime = 0
        audioPlayerInstanceWadaiko.play()
    }
    
    func playSoundBoyon() {
        audioPlayerInstanceBoyon.currentTime = 0
        audioPlayerInstanceBoyon.play()
    }
    
    func playSoundScrach1() {
        audioPlayerInstanceScrach1.currentTime = 0
        audioPlayerInstanceScrach1.play()
    }
    
    func playSoundScrach2() {
        audioPlayerInstanceScrach2.currentTime = 0
        audioPlayerInstanceScrach2.play()
    }
    
    func playSoundAmaidesuwa() {
        audioPlayerInstanceAmaidesuwa.currentTime = 0
        audioPlayerInstanceAmaidesuwa.play()
    }
    
    func playSoundMadamada() {
        audioPlayerInstanceMadamada.currentTime = 0
        audioPlayerInstanceMadamada.play()
    }
    
    
    
    /*
      ボタンアクション
     */
    
    @IBAction func tapBtn1() {
        playSound2Hat()
    }
    
    @IBAction func tabBtn2() {
        playSound2Cymbal()
    }
    
    @IBAction func tabPtn3() {
        playSound1Cymbal()
    }
    
    @IBAction func tapBtn4() {
        playSound2Tom1()
    }
    
    @IBAction func tapBtn5() {
        playSound2Tom2()
    }
    
    @IBAction func tapBtn6() {
        playSound2Tom3()
    }
    
    @IBAction func tapBtn7() {
        playSound2Bass()
    }
    
    @IBAction func tapBtn8() {
        playSound2Snare()
    }
    
    @IBAction func tapBtn9() {
        playSound1Snare()
    }
    
    @IBAction func tapBtnButtom() {
        playSoundWadaiko()
    }
    
    @IBAction func tapBtnTop() {
        playSoundBoyon()
    }
    
    
    // モーションセンサーによる音源再生
    func motionAnimation(_ motionData:CMDeviceMotion?, error:NSError?) {
        if let motion = motionData {
            // ジャイロスコープ(回転角速度:z軸)
            var gyroZ = motion.rotationRate.z
            gyroZ = round(gyroZ*100)/100
            if gyroZ >= 5 {
                playSoundBuo()
            }
            if gyroZ <= -5 {
                playSoundShakin2()
            }
            
            // 加速度センサー (Z軸)
            var accelZ = motion.userAcceleration.z
            accelZ = round(accelZ * 1000) / 1000
            if accelZ >= 1.8 {
                playSoundAmaidesuwa()
            }
            
            // 加速度センサー (Y軸)
            var accelY = motion.userAcceleration.y
            accelY = round(accelY * 1000) / 1000
            if accelY >= 1.5 {
                playSoundScrach1()
            }
            
        }
        
    }


}

参考資料

Engineer Onboarding Meetupというコミュニティを立ち上げました&第1回開催しました。

f:id:afroscript:20190614012253j:plain

どーも。afroscriptです。

エンジニアのOnboardingに関するコミュニティを立ち上げた&記念すべき第1回のイベントを開催したので、そのことについて書いておきます。

立ち上げた経緯

メルカリに転職して約3ヶ月が経ちましたが、現在、僕はEngineering Gatewayという、エンジニアのOnboardingについてあれこれやるチームに所属してます。直近では、新卒エンジニア向け研修の企画や運営とかやってました。

↓メ社のテックブログでの初エントリ

tech.mercari.com

ちなみに"Onboarding"とは、新しく入社してくれるメンバーが少しでも早く自社に馴染み、本来の力を発揮し成果が出せるようサポートする仕組みのことです。具体的には、 社内メンバーとの人間関係の構築や、自社の文化・ルール・業務への理解を促進していったり、などです。

で、そんなチームに所属しつつも、僕自身Onboardingをちゃんと企画したりするのは初めてで、手さぐりまさぐりでやってる最中なのと、Onboardingについての情報ってあまりWebとかに出てないなー、そこまで議論されてないのかなー、って感覚があったので、エンジニアのOnboardingについてワイワイ話し合うコミュニティを立ち上げてみました。

このコミュニティでやりたいこと

まず単純に、エンジニアのOnboardingに関する情報交換や議論する場ってこれまであまりなかったので、その辺やれればいいかなと思ってます。

具体的には、おそらくこんな話題かな?

  • 文化、ルール、制度をどう浸透させるか?
  • 人間関係をどう構築するか?
  • 技術知識やドメイン知識(事業知識)をいかに早く吸収してもらうか?
  • それらを支えるドキュメント関連(どう管理するか?どうドキュメント化を促すか?どう継続的に更新させるには?)
  • Slackとかの暗黙ルールにひっかかる問題
  • メンターや1on1の役割、ルール、技術
  • セルフオンボーディング(自分から慣れるために何をしていくか?)   また、もっと大きな視点では、「国内のエンジニアがいる企業が、Onboardingをきちんとすることを当たり前にする」ってのもあります。

エンジニア界隈って、プロダクトのフェーズによって必要なエンジニア像が変わったり、どんどん出てくる新しい技術にキャッチアップするために同じ会社や同じチームにい続けることがリスクになることもあったりするわけで、ある一定期間毎で、転職やチーム移動等で環境を変えざるを得ないことがけっこうある職種だと思ってます。

なので、そういった異動や転職がスムーズになることは、国内のエンジニア業界にとってもかなり重要なんじゃないかなと。

 

談義形式

このMeetupの発表形式は、よくあるLT(ライトニングトーク)形式ではなく、「談義」形式にしてます。

ん?談義とは...?

って感じだと思いますが、「談義」とは、僕が3年半くらい運営しているSwift愛好会で始めた発表形式でして、

  • 発表時間に制限をつけない(30秒でもいいし、1時間でもいい。ただし、会場の時間が許す限り)
  • 発表形式に制限をつけない(スライドでもいいし、資料なくてもいいし、歌っても踊ってもいい)
  • みんなで談笑しながらやる(発表途中の質問、意見大歓迎)

という形式です。

まぁ、話したいことを、伝わると思う適切な時間・適切な方法で話しながら、かつ、一方通行でなく双方的に話してみんなで知識を発達させていこうよ、ってことです。 

運営スタッフ

  僕の思いつきでフラッと始めようとしたコミュニティなので、こんな感じでゆる〜くオープンにtwitter&facebookで声かけてみました。

なんと10人以上から「運営したい!」との連絡をいただきました! (1,2人くらい集まればいいやと思ってたw)

しかし、人数多すぎても最初は動きづらいので、早い者順ということで、僕を含め下記の7名の運営スタッフでスタートしました。(断ってしまった方、本当ごめんなさい。。。)

f:id:afroscript:20190614011209p:plain

@zuckey_17さん、@nitt_sanさん、@kubot64さん、@YujiAbeさん、@Masafumi Kinoshitaさん、@nexxesaaanさん、ぜひぜひよろしくお願いしますmm

さっそく第1回を開催しました!

記念すべき第1回を昨日開催してきました。

こちらのイベント↓ engineer-onboarding.connpass.com

登壇者の資料や概要は、運営の@nitt_sanさんが瞬足でまとめてくださったので、下記をどうぞ。

nitt-san.hatenablog.com

ここでは、僕が気になったところをダイジェストでほんの一部分だけ載せていくことにします。(どの発表も非常に色濃く、もうちょっと自分の中でもまとめたいので、別途記事にするかも)

イベントの様子

トップバッターの@tetsunosukeさんの1枚目のスライドから超難問w

難問が続く。

2人目は、merpayのEM、@shindenさん:)

急拡大組織ではこれが大事。

休憩時間の様子。各談義終了ごとに、だいたい5,6人(多い時には10人くらい!!)は質問が飛び交ってたし、休憩時間もこんな感じでワイワイしてて、終始すごくいい雰囲気でした。(こんなの盛り上がるとは、運営陣も驚きでした)

3人目は、運営スタッフでもあるDMM@kubot64さん。

すごくいい指標。

あるあるだけど、その分リターンがあるからやるとのこと。

4人目は、RettyのVPoEの@aki85135さん。

Rettyさんも価値観への理解、かなり力入れてるようで共感。

 このやり方よさそう。

そしてこの「3ヶ月半」という時間軸は会社によってかなり違いそうなので、いろいろ議論して深掘ってみてもおもしろそう。

最後はPOLの、@yahooshikenさん。

JD(Job Description / 求人票)はインターン生も参加してつくるらしい。バリューに対して考える機会にもなるとのこと。確かにそういう視点でみんなでJDつくるの、よいな〜。

集合写真:)

まとめ

ということで、初回からかなり大盛りあがりで、ひじょ〜〜〜うに濃い内容も多々聞けたので、やっぱ開催してよかったなと思いました。やっぱりもう1回資料見直してまとめなおしたい。

会場のco-ba jinnanさんも、快く会場提供してくださり、ありがとうございましたmm

今後も無理しない程度に3ヶ月に1回くらいやっていこうかなーと思うので、みなさんぜひ気が向いたときに参加or談義お待ちしてます。 (会場貸してくれるよ!って企業も募集してますので、気軽にDMください。) 

HoloLens、めっちゃ楽しいやん! ~de:code 2019に行ってきた~

f:id:afroscript:20190529235509j:plain

どーも。afroscriptです。
de:code 2019に参加してきました。
de:codeは初参加でしたが、かなり楽しませて頂いたので備忘録の意味も込めて書いておこうと思います:)
(仕事の都合上、Day1の最初の基調講演・EXPO・参加者Partyしか参加できなかったですが)

受付オープンから約40分前でほぼ満席

会場はここ。赤羽橋が最寄り駅の「ザ・プリンス パークタワー東京」  

f:id:afroscript:20190529235818j:plain
ザ・プリンス パークタワー東京

どうでもいい話ですが、最初、勘違いをしてて、なぜか「赤羽」に向かおうとしてしまってましたが、電車に乗る直前で気づいてよかった。
(ほぼいないと思いますが)みなさんもぜひお気をつけて。笑

会場は8:30オープンで、9:30から最初の基調講演開始でしたが、僕が着いた8:50くらにはほとんどの席が埋まってました。基調講演はサテライト会場もあったっぽく、9:10くらいには立ち見も埋まったようで、サテライトオフィスのみ案内されてました。

座席には1つずつ同時通訳レシーバーが置かれてました。大きめの注意書きが結び付けられてたので、これなら持って帰ってしまう率かなり下がりそうでいいなーと思いました。(カンファレンス運営する勢としては通訳レシーバーの回収モレをなくすのは、よく議題に上がる問題なんです)

f:id:afroscript:20190530001012j:plain
同時通訳レシーバーの注意書き

超巨大スクリーンで、迫力あるオープニング

基調講演の会場のスクリーンはとにかく巨大!!これはかっこいい。

f:id:afroscript:20190530001801j:plain
基調講演のスクリーン、超でかい!!

パンフレットは会場入り口でゲット。

f:id:afroscript:20190530001909j:plain
パンフレット

セッション部屋数が異常なほど多いんですが、広がるタイプのパンフレットで見やすい。 f:id:afroscript:20190530002016j:plain

オープニングムービーは、巨大スクリーンを全面使ってやってたので、とても迫力ありました。動画禁止だったので写真のみですが、(一瞬)プロジェクションマッピングもあって、個人的にすごく好きなド派手さでした。

f:id:afroscript:20190530002201j:plain

f:id:afroscript:20190530002216j:plain

基調講演

オープニング後、基調講演のトップバッターは、日本マイクロソフトの社長、平野さんが登場。 f:id:afroscript:20190530002315j:plain   いろんな企業(RedHatAdobeTOYOTASONYなど)との連携話や今後のマイクロソフトの動きが話されました。とりわけ、自動運転システムを開発しているスタートアップ企業「Ascent Robotics」は大々的に取り上げられてました。自動運転の領域はマイクロソフトも引き続き力を入れていくそうな。

個人的には、冒頭の奈良大学との共同研究の話が気になりました。ほんのちょっとしか触れられなかったですが。

f:id:afroscript:20190530002517j:plain

AIで仏像の表情や年齢を読み取り、その時代背景を読み取る研究らしい。ちなみに奈良時代の仏像は「喜び」の要素が多いらしく、鎌倉時代は「怒り」の要素が多く検出されるとのこと。なんでなんだろう。

ちなみに、難聴の方に向けた日本語字幕も上に出てます。気遣いが丁寧。

 続いて、登壇者バトンタッチで、コーポレート バイスプレジデントのジャレッド スパタロウさん(Microsoft 365の最終責任者かな?)が登場。真の働き方開発をしようという話。

「これだけテクノロジーが発達して、未だかつてない変化がおきているにも関わらず、我々の働き方は変わったのか?」という課題提起からの、それをMicrosoft 365が解決できるというお話。

「我々の生産性は本当に上がったのか?ただ、ランニングマシーンのスピードが上がって、それに合わせて我々が走るスピードも上がり続けているだけなのではないか?」という表現をされてましたが、これは確かに...と思いました。いい意味でもっと楽して大きなことを動かすような思考は大事だなと。

りんなライブ

で、途中急に貞子っぽい演出が始まったと思ったら、Break time的な意味も込めて「りんな」のライブが挟まりました。

もちろんりんなが歌を歌ってたんですが、普通におおよそは人間が歌ってるのと変わらない感じでした。

f:id:afroscript:20190530003810j:plain

f:id:afroscript:20190530003823j:plain   f:id:afroscript:20190530003953j:plain

あと、社長が踊らされてた。あとから追加で説明ありましたが、社長がテキトーにダンスっぽい動きを15分くらいしたのを動画に撮り、それをプロのダンサーの動きを機械学習したモデルを適用すると、社長が踊ってる動画が生成されるらしい。たまに背中や胸から社長の頭が生えてきてたりと、ちょっとホラーなとこありましたが(笑)、おおかた社長がしっかり踊れてる動画ができあがってておもりしろかった。

Azure Kinect

これも基調講演の一部。Azure Kinectが紹介されましたが、マジで小さい!! 複数代同時に使えて、2方向以上から3D空間を認識できるようになっていたり、深度センサーの精度が上がったことで心拍数も測れる(←これめっちゃすごくないか!?)ようなレベルまできているとのこと。その他、マイクも付いていて、立体音響として音声データを取れたり、Azure MLと連携して、音声をテキストに変えてリアルタイムに表示するとかもできる

 

最後の基調講演はHoloLensを生み出したキップマン!

f:id:afroscript:20190530004859j:plain

お題はやはりHoloLens2!視野角が2倍になって、解像度も上がって、重心の調整やらで装着時の快適性も上がったとのこと。Demoでは、2人の分身を登場させてました。(これはもはや影分身じゃん!忍者じゃん!テンション上がる!って思ってました。

f:id:afroscript:20190530005120j:plain

また、特に盛り上がったのはここ。キップマンの分身が日本語を話しているところ! 自分の3Dモデルが、自分が使えない言語を流暢に話しているのを側で見るなんて、、、すごい時代だ。

f:id:afroscript:20190530005314j:plain

   # EXPO(展示)で、HoloLens使った自動車点検を体験!楽しすぎる!   展示もやってたので覗いてきました。

f:id:afroscript:20190530005626j:plain    そんなに時間もなかったので、HoloLens使った自動車点検の体験に並ぶことに。これがめっちゃおもしろかった!写真だとあまり伝わらないですが、HoloLensをつけてる僕には、中のエンジンが動いてる様子がみれたり、自動車の中の配線が透けて見えてたりと、ワクワクがとまんない感じでした。今年から実際に現場でも導入するらしく、なんとも楽しそうな世界が目の前だな〜と思いました。

f:id:afroscript:20190530005734j:plain  

あと、時間なくて体験できなかったんですが、MR握手会がめっちゃ気になる...!!次こそはやってみたい。

f:id:afroscript:20190530010011j:plain

最後は懇親会(参加者Party)

Day1の19時からは参加者Party。これもまたおもしろかったです。 DJもコックもいるし、ミラーボールやライトがギラギラしてました。

冒頭のあいさつではスペシャルゲストとして、なんと本田圭佑選手!たまたま最前列に僕はいたので、超間近で見ることができました。ラッキー!

あ、そういえば近々こんな採用募集が起きるかもらしいです:)

まとめ

ということで、de:codeの存在は知りつつもこれまで行ったことがなく初参加でしたが、結論、すごく楽しめました。懇親会のご飯も超絶おいしかったし。 とりわけ、MR周りの体験がたくさんあるので、これが楽しい!

HoloLens 2の体験会とかもあったり、すっごく気になってたけど、時間の都合やらでできなかったのが残念。発売を楽しみに待つとしよう。

おしまい。

                 

【日本中の全人見知りに捧ぐ】過去250回くらい社外勉強会を主催&参加して見出した、勉強会の懇親会で他の人と仲良くなる7つの方法

f:id:afroscript:20190409012736p:plain

どーも、afroscriptです。

社外の勉強会に出たときって、だいたい最後に懇親会がありますが、そこで知らない人と話したり、仲良くなるのって勇気がいりますよね?(人によるでしょうが)

僕は、前職では「コミュニケーションおばけ」なんて呼ばれたりしてて、人と仲良くなることに定評があったらしいんですが、本来は人見知りで、知らない人に話しかけるのはそんなに得意ではありませんでした。中学校の塾通ってた頃なんて、クラスに同じ中学の人がほとんどいなくて、結果、2年間無口キャラで過ごしてしまいまし。(さすがに今はもう、人見知りしないですけどね)

なので、そんな日本中の悩める"人見知り"たちのために、僕なりのノウハウを書いておきます。

僕自身、おそらくMAX多いときは、様々なジャンルの社外勉強会やイベントに、年80-90回くらい(社会人になって累計250回くらい?)主催&参加をしてきましたが、最初の方は、無理して気合で話しかけるってので突破してました。(まぁ元営業だし、それくらいは頑張りました)でも、ぶっちゃけそういうの面倒だし、営業臭くなるのも嫌だし、もっとスマートに話せないかな〜と思って試行錯誤した結果、いくつかでてきたTips集です。

ざっくりポイントだけ先に書くと、下記の4つです。

  • 話し始めやすいタイミングを知っておく
  • 話しかける言葉を決めておく
  • 汎用的質問を3,4個持っておく
  • 盛り上がらなくていい、今後に繋がればそれでいい

では、何度が低いものから紹介していきます。

初級編(とりあえずスムーズに会話に持ち込む)

①乾杯のタイミングが最重要!最もサラッと話し始めやすい!

人見知りにとって"乾杯"は絶好の話し始めチャンスです。なぜなら、強制的にコップとコップをあわせるというコミュニケーションをさせられるタイミングなので。

ということで、乾杯のときは、なるべく話しやすそうな人、勝手に話してくれそうな人のところの隣にいきましょう。そうでなくても、隣の人と乾杯しやすい立ち位置に立つことを意識しましょう。このポジショニングだけで、話しかけるハードは一気に下がります。

そして、全体の「かんぱーい」のあとに、すぐ両サイドの人と乾杯し、その勢いのまま話すのが楽です。

乾杯さえすれば、あとは次に紹介する質問をぶつけてれば話は続きます。

②話さなくていい、質問すればいい。

あなたは人見知りなので、無理して話そうとしなくていいんです。質問すればいいんです。だいたい下記の3つなら誰でも話せますし、5~10分は話せます。ひとまずそれで十分です。

  • 「普段、どんな仕事されてるんですか?」
  • 「会社ってどちらなんですか?」
  • 「前職って何されたんですか?」

ちなみに、だいたい上記の質問すると、自分にとって相手に聞いてみたいことが出てくるので、そこを深掘りしていけば、情報収集にもなります。

③会話のゴールを、盛り上げることでなく、SNSで繋がることにする

コミュニケーションってなんとなく盛り上がらなきゃってプレッシャー感じがちですが、社外勉強会の懇親会なら「次に繋げる」をゴールに設定する方がいいと思います。

ほとんどの場合、懇親会って30分程度しかなく。あまり深い情報まで聞けないことが多いです。また。懇親会みたいにランダムで知り合うスタイルだと、ピンポイントで自分に有効な情報を持った人でない場合のほうが多いです。なので、「知り合うきっかけができて、SNSで繋がれた(今後必要なときはいつでも連絡とれる状態になった)」をゴールにするので十分です。

会話なくなって気まずいな~と思ったら「あ、そういえばfacebooktwitter/インスタ)やってます?申請(フォロー)してもいいですか?」で繋がって、「じゃ、また今度話しましょう〜」解散すればOKです。

ちなみに、同じようなジャンルの勉強会行ってたら、複数回合うこともしばしば。何回か会えば仲良くなるもんなので、無理して1回で仲良くならなきゃって背負う必要はないです。

中級編(話しかけてみる)

初級で乾杯によるスタートダッシュを紹介しましたが、ネクストステップとしては話しかけることが必要になってきます。勇気いりますが、話しかける言葉を自分の中で定型化しておけばすごく気が楽になります。

④1対1で話しかけるときは「あいさつしていいですか?」or「あ、どうも」

④-1:登壇者の人や目上そうな人に話しかけるとき

「あいさつしていいですか?」が一番スムーズな感じします。そのあとに、名刺を差し出すか、名刺なければ名乗って、あとは初級の基本的な質問3つをぶつければOKです。

④-2:おとなしそうな人や、もうちょっとラフな感じが合いそうな人に話しかけるとき

「あ、どうも」で十分です。「あいさつしていいですか?」は堅苦しくなるのに加え、営業感あるので、特にエンジニア界隈とか、ラフなコミュニケーションが好まれる場だと逆にいい印象を与えないこともあります。

そのあとは同様に、名刺を差し出すか、名刺なければ名乗って、あとは初級の基本的な質問3つをぶつければOKです。

⑤すでにグループができている会話に入るときは、「僕も入ってもいいですか?」かシレッと入る

⑤-1:頑張って輪に入るバージョン

すでに4,5人で話す輪ができてるとき、とりわけ登壇者とかの周りはそうなりがちなのですが、この場合は「僕も入ってもいいですか?」で十分です。 あとは、みんなが勝手に話してくれるので、「うん、うん」聞いておけばいいです。

ちなみに、その中で名刺交換したいorSNS繋がりたい人がいた場合は、解散するタイミングが楽です。

「あ、一応あいさつだけさせて頂いてもいいですか?」と話しかければいいです。

⑤-2:シレっと輪に入るバージョン

「僕も入ってもいいですか?」って言うのも恥ずかしいな~と思う人は、会話の輪で、ちょっとスペースが空いてるとこを見つけてシレッと入りましょう。

だいたいみんないい人なんで受け入れてくれます。

気まずいなと思う人は、ペコッてしながらシレっと入れば問題ないです。

その後は同様です。

上級編(話しかけさせる)

⑥発表側にまわることで、話しかけられる側になる

これはもう、そのまんまです。

(特にエンジニア界隈では)応募自由のLT(ライトニングトーク)大会なんて、東京界隈じゃいっぱいやってるので、ネタなくてもとりあえず申し込んでみるといいです。

申し込めば、強制的にネタ作らなきゃいけないです。LT駆動開発を頑張りましょう。

え?発表するのは恥ずかしいですか?...大丈夫、最初の1回だけです:)

⑦運営側にまわることで、話しかけられる側になる

これもそのままですね。

でも、自分が開いた勉強会なんて、人が集まるか不安...!なんて方は、下記も参考にしてみてください。少人数でも、始めることが大事です。

afroscript.hatenablog.jp

まとめ

さて、いかがだったでしょうか?使えそうなTipsが1つでも見つかれば幸いです。 ほかにもTipsあれば、ぜひコメント書いてください!:)

Enjoy community activity!:)


※トップ画像は「いらすとや」さんから拝借させていただきました。

メルカリ入社から1ヶ月経ったけど、なかなかいい環境だぞ?(個人的に良いなと思ったとこ11個)

f:id:afroscript:20190409002116p:plain

どーも。afroscriptです。

メルカリに転職して約1ヶ月が経過したので、初心を忘れないように今の感想でも書いてみます。 結論からいくと、今の自分にとってかなりいい環境だと思ってます。

※Good Pointその1〜3については、英語全然ダメ人間&&ドメスティック企業出身の視点から書くので、外資系企業からすると何言ってんだろうってとこあるかも。まぁすべてにおいて、あくまで個人の感想です。あしからず。

■Good Point

Good Pointその1:グローバルメンバーが3,4割くらいで、いろんな国のエンジニア事情を日常的に聞ける

これは一番よかったなと思ってます。

個人的にメルカリに入った想いの中に、メルカリが日本トップクラスのテックカンパニーから、グローバルでもトップクラスのテックカンパニーになっていく過程に携わりたいという点とともに、日本からグローバルを牽引するテックカンパニーが次々と生まれるようになるにはどうしたらいいんだろう?に対するある程度の答えがほしいなと思ってました。(そういう役割か事業かを将来的にやりたい)

そのためには海外のエンジニア事情を知りたいなと想いつつ、僕は全然英語使えないマンなので日本の記事くらいからしか海外事情を知ることができなかったし、そういった日本の記事も別に多くはないし信憑性がどれくらいかイマイチ分からないし。じゃあ英語勉強すればいいじゃんって感じだけど、前やってたサービスも日本人向けだし、前職の社員はほぼ全員日本人だったし目下は必要性ないなって言い訳をもとに、なんだかんだ英語勉強を後回しにしてしまってました。

しかし、メルカリでは3,4割がグローバルのメンバーで、社内の飲み会とかでもいろんな国のエンジニア事情や、いろんな国の視点から日本のエンジニア業界がどう見えてるかとか、そういったリアルな話が日常的に聞けてるのすごくよい。

そして、英語でMTGが行われることもあるし、日本語話せない人もいっぱいいるし、いい具合に英語から逃げれない環境なのは非常にいいなと思ってます。僕はとても面倒くさがり屋なので、こういった必要に迫られる環境でないとやはり勉強しないしね。笑

Good Pointその2:DMM英会話が無料(まぁこれは普通か)だし、業務時間中に受けていい(むしろ英語習得が評価にも入る)

英語習得のために、DMM英会話が無料!...ってのは、まぁ海外展開をもくろむ最近のベンチャーだとごくごく普通なこと(前職でも無料だったし)だけど、それを業務中にもやってOKなのがとてもありがたい。しかもちゃんと評価にも入れてOKとのこと。本格的にグローバルテックカンパニーを目指してる&&英語しか話せないグローバルメンバーもいるということで、直接業務に役立つという判断なんでしょうが、個人的には堂々と英語勉強しやすくとても助かってます。

Good Pointその3:その他にも英語力アップのための仕組みがちらほら

また、LET(Learning Education Team)という組織もあり、社内の英語力アップにコミットするメンバーもいます。(それをわざわざ社内にチーム作ってしまうってすごすぎると思った)LETは、英語習得の相談に乗ってくれたり、業務上英語が非常に重要になってくる人(グローバルのメンバーがチームにいるマネージャーとか)には、独自のカリキュラムで週に何回か英語の授業をしてくれるらしい。

あとはChat Lunchといって、英語話者と日本語話者が交じって、英語のみでランチするのとかもある。(これは、日本語VerのChat Lunchもある。そしてChat Lunchする場合のランチ代は、会社が負担してくれるっ!)

Good Pointその4:社内の自販機が全て無料

ようやく英語以外ですが、これは一番最初に感動したポイントなんですが、社内の自販機がなんと全部無料っっっ!(まぁ給料がおそらく全体的に平均より高めなので別に無料じゃなくてもいいといえばいいんですが、なんか地味にうれしいんですよね〜)

特茶とか黒ウーロン茶とかちょっとお高いやつらも無料なので、イベント等でメルカリに来たときはぜひポチっと自販機のボタンを押してみてください。

あと、ジュースだけでなく、パックの牛乳が常に補充されて飲み放題な冷蔵庫もあって、(あとにも出てくるけど)筋トレ後にプロテインを牛乳で割れるのとか、個人的にはけっこううれしかったりする。

Good Pointその5:メールが全然来ない

個人的にメール見ないマンなので、これも最高ですね。Slack文化が完全に浸透してて、メールは1日に3,4通しかこないです。「プレスリリース出しました」的な記者向けのメールが全社のメンバーにも共有するために送られてくるくらい。あとDailyのアプリの指標報告メールもくるかな。(あ、Googleカレンダーの招待とか含めるともちょっとくるけど)

Good Pointその5:ALL HANDSというものが隔週であって、全社員で進捗を共有して議論できる場がある

これもすごいなと思いました。隔週で400人くらいが集まって、メルカリ(メルペイやメルカリUSとかは別でやってるっぽい)の進捗状況やこれからの話をして、その場で質疑応答まで行われます。隔週でこの人数で集まるってどんだけオープンなんだ...ってのが初参加の感想でした。ちなみに僕が今年の1月(??)までは毎週30分だったらしい。今は隔週で1時間。

Good Pointその6:オープンドアってのがあって、R4Dの最新情報が聞けるの楽しい

これはALL HANDSとはまた別のもので、いろんなチームが勝手に開いて、自分たちのチームの取り組みをラフに発表して、興味ある人が自由に参加できて、わいわい議論したりするやつ。R4Dの人たちのオープンドアとかすごくおもしろい。自席から数m(たまたまOpen Doorが行われる場所の近くに座ってるだけなんだけど)で、最先端のテクノロジー事情が聞けるってスーパー贅沢かよ。

(いや、R4Dに限らず、僕がMANABIYAやその他もろもろのイベントでお呼びしてたスーパースターたちがその辺にぞろぞろいるんだけど、スーパーハイパー贅沢かよ。)

Good Pointその7:PC周辺機器を勝手にとっていっていいコーナーがある

PCのコネクタとか、ケーブルとかってイチイチ購入申請して会社で買ってもらうのなんてクソ面倒なんだよな〜と思っていたところに、これはすごく感動した。PC周辺機器が常時揃えてあるコーナーがあって、困ったらそこからとっていけばいいというもの。

社用のネームプレート入れとかもそこにあるので、壊れたら誰に相談するまでもなくそこでサクっと自分で取り替えればいい。あとは、文房具も常備してあるコーナーあって、必要なものはそこから取っていくスタイル。こういう地味に手に入れるの面倒なものをセルフで取り放題にしてくれるのは、無駄な申請やら総務部等々へのお願いコミュ二ケーションも省けて、とても楽だなと思います。

Good Pointその8:筋トレマシーンが執務室内にある

見出し通りですが、執務室内にあるとサクっと運動できるのでとてもよい。そろそろお腹周りがだいぶヤバめなお年頃になってきた自分にとっては非常に有効で、おかげさまで週3回ほど30分ずつ運動できている。

Good Pointその9:やはりフレックスいい!

前職は定時制(なぜかエンジニアのみビミョーなフレックス)だったので、メルカリに入って初めてのフレックス体験なんですが、やっぱりフレックスはめっちゃいい!!

病院等で朝遅れるときとか、定時制だと、(僕は仕事が好きなので)どうせ定時後も残って仕事するにも関わらず、午前休にせざるをえなくて有給が減ったりするんですが、フレックスだとその心配がないのはすごくいい。これまでは荷物の受け取りとかも土日しか無理だったけど、そういうのも調整できるし、今副業も始めてるんですが、早く帰って別の仕事したり、前日夜遅くまで別の仕事したから朝ゆっくりきて本業は次の日頑張るとかの調整もできて、すごく快適。あとは、のちのち子どもできたりしたら、定時制やりづらいな〜と思ってましたが、その辺も一安心した感あります。

Good Pointその10:立て替え不要レストラン制度の社食アプリ、神かよ!

この記事のやつですね。チームビルディングや部活などでみんなでご飯に行った際、特定のお店で、スマホアプリのバーコード見せるだけで決済が完了すれるというもの。わざわざ立て替えたり、経費申請したりがいらないっ!!!!これは神すぎますね。ぜひとも全企業&全飲食店に導入をオススメしたい。

mercan.mercari.com

Good Pointその11:建物(六本木ヒルズ)内に本屋ある

これもまた個人的にうれしいところで、僕は本屋がすごく好きなんですが、六本木ヒルズ内に本屋さんが入っているので、仕事の息抜きに行ったり、帰りにサクっと寄ったりできるのはいいですね。

■Goodでないところ

Goodばかり書き連ねたので、一応そうでないところも書いておきます。(現状ほぼないんですが)

机が繋がってて、揺れが気になる

(ちょっと言葉だと表現しづらい&&僕の座ってる座席に限定される話かもしれないんですが)おそらく僕が使わせてもらってる机の足腰が弱く(笑)、机揺らしてしまうと他の人にもその揺れがダイレクトに伝わってしまって、けっこう気を遣ってしまう。笑 まぁオシャレな机なんですけどね。

イスは前職の方がよかった

これは前の会社のイスが神すぎただけなんですが。前職のイスがこれ↓

storesystem.hermanmiller.co.jp

ま、1個約23万円だからこれはしょうがないか。笑(確か国内だとレバレジーズとYahooくらいしか使ってないって誰かが言ってた気がするw) 別に今のイスも悪くないです。(てか普通によい)

■まとめ

つらつらといろいろ書きましたが、個人的に求めていたものが多々あっていい環境です。とはいえこの1ヶ月はどちらかというと慣れることに時間を使ってしまったので、ここからどうアウトプット出していけるかですね。

Good Pointのその1~3に、グローバルメンバーがたくさんいて、すごく良い!と褒めちぎりましたが、もちろんその分コミュニケーションコストがかかるとか、コミュニケーションや文化の違い等に起因した様々な問題も起きまくってます。ただそれは、日本初のベンチャーが、本当のグローバルなテックカンパニーになっていくために必ず乗り越えなければいけない壁だと思いますし、そこを乗り越えることによって、国内の多くの企業にもいい刺激を与えられるのかなとも思います。

ということで、このカオスを楽しみながら変化を起こしつつ、いい組織を作っていこうと思います。

■おまけ

あ、こんな内容ですし、せっかくなのでちゃっかり求人情報貼っておきます。てへぺろ。 いろんな職種募集してるので、メルカリが気になる人いたらご飯行きましょう:)

careers.mercari.com

try! Swift Tokyo 2019でOrganizer&MCをしてきたけど、好きなことで国境を越えて繋がれるってのは、やっぱりエンジニア界最高だと思うし、その中でも日本人にとってSwiftコミュニティは圧倒的に世界に近いと思う。

f:id:afroscript:20190323162259p:plain

try! Swift Tokyo 2019!無事終わりました! 疲れたぁぁぁ〜〜!!(笑)

終わってすぐBlog書こうと思ってましたが、翌日は脳ミソ完全停止だとかなんとか言ってたら5日くらい経ってしまった。 しかし、全体司会として、「みなさん、ブログ書きましょう!今日の内容を世界中に発信しましょう!」と声を大にして言ってしまった手前、ちゃんと書きます!笑(なので、まだ書いてないみなさんも書いてくださいね!)

ただ、全体司会という大大大すぎる大役を任せて頂いたのになんですが、実は僕自身、Swiftは、"Hello World" に産毛の毛根がくっついたくらいしかできなくて、技術的な内容を詳しくブログに書くことはできないです。なので、運営や司会をやった経緯や印象に残ったトークを書きつつも、今回のtry! Swift Tokyo 2019を通じて感じた、"エンジニアコミュニティ"という視点の中で"Swiftコミュニティ"とはどういう存在か、を主軸に書いてみます。

なんでOraganizerやったの?

@jollyjoester 氏に巻き込まれました。以上!(笑)

メルカリのカンファレンスとかも(どうせ)手伝ってもらうだろうと思われるから、その練習にどう?ってな感じで。

とはいえ、僕自身も、大型カンファレンスの1dayスタッフや、業務としての大型カンファレンス(MANABIYA)は、過去にやってましたが、 OSSの大型カンファレンスの運営スタッフをガッツリやるのはまだやってなかったですし、そのうちやってみたいな(やることでエンジニアコミュニティに還元したいな〜)と思っていたので、いいタイミングだなとジョインさせていただくことに。

なんで司会やったの?

2月、僕が海外行ってていない間に行われたOraganizer会議でいつのまにかご指名頂き、決まってました。笑

f:id:afroscript:20190323181527p:plain

とはいえ、こういった大役をご指名していただけるのは本当ありがたいですし、数百人の前で司会するのは初めてな体験で、おもしろそうだな〜と思ったので、ソッコーで了承させて頂きました。

司会という役割は個人的にもとても好きですし、おかげで、ただスタッフをやる100倍くらい楽しめた気がします。

個人的に楽しかった思い出

印象に残ったLTを2つほど。

@koooootakeさんの2次元バエLT

まず印象的だったのが、こちらのトーク

ポートレートモードを2次元画像に適用して、2次元画像をバエさせようというもの。そもそも「2次元バエ」という切り口がめっちゃおもしろい!w

そして、「2次元画像もバエさせたい」→「こうしました」→「でももっとこだわりたいっ!」→「こうしました」→...という感じで、どんどん進化していくようなテンポ感もすごくよくて、「Swift楽しいっ!」って気持ちになるトークでした。

@hellomayukoさんのエモいトーク

そしてもう1つ、最後のオオトリを飾った@hellomayukoさんのトーク。「次へつなごう— Extending a hand to the next generation of Apple developers」はとても印象的でした。Swiftが今後さらに発展していくには、より多様性を受け入れる器をみんなでつくっていこうというお話。(資料は公開されてなさそう?)

mayukoさんのトークは、いろんな方がBlogで取り上げてるので、詳しくは書きませんが、個人的に素敵だな〜と思ってtweetしたところを載せておきます。

僕の前職はかなり日本人が多かったし、僕自身全然英語話せず外国人とコミュニケーションとることはほぼなかったので、正直、「diversity(ダイバーシティ)!」って言われても全然ピンと来ないな〜って思ってました。

ただ、最近、Mercariに転職して、3,,4割くらい(??)海外の人がいるような環境に(短いながら)身を置いてみてなんとなく感じたのは、 多様な人がいればいるほど、 * 多様な視点・切り口から意見がでてきて、そこからおもしろいidea/機能/プロダクトが生まれる * 自分の中の当たり前が崩れることで新しい視点を持てて、自分の中からも新しい考えができるようになる ってことでした。(まぁ、もちろんその分まとめるのは大変なんですが。)

diversityとはつまり、「世界中の思考を受け入れようぜ」ってことなんですが、その上で「世界全体が必要とするものを生み出そうぜ」ということなんだろうな〜ということを思ったりしました。それがあるからGoogleとかは、あれだけ世界規模で革新を起こし続けているのかもしれないなー。

(あと別件で驚いたのは、海外でSwiftがそこまで流行してない地域があるのは、そもそもMacが高くて買えないからiOS開発できないとかあるらしい!なるほどな〜。)

全体的な感想

日本人にとってSwiftコミュニティはすごく恵まれてる

結論から言うと、Try!Swift Tokyo、めっちゃいいぞ!というか、日本人にとってSwiftのコミュニティはすごく恵まれてるぞっ!ってのを言いたい。

なぜなら、国内最大のSwiftカンファレンスが「try! Swift Tokyo」であり、まさにそれがそのまま世界最大のSwiftカンファレンスの一つであるからです。他の言語や技術だと、国内カンファレンスがあって、さらにその先に国際カンファレンスがあるわけで、なかなか日本のエンジニアが世界の場に立つということは、距離が遠い印象があります。でもSwiftは年に1回try! Swiftという世界の場が国内にあり、しかもiOSDCとかも考えると、他の技術ではなかなか考えられない恵まれた環境ではないかなと思います。

Rubyも近い感じはありそう。でもSwiftは世界3ヶ所のうちの1つが日本で開催されるというのは、なんとも恵まれた状況だと思う。まぁ、iPhoneユーザーが多い日本市場だから当然といえば当然ですが)

Swiftひとつで世界と繋がれるって、なんて素晴らしいんだ!

やはり好きなもので人と人が繋がるってのはすばらしい!ってのも思いました。かれこれ5年近く、いろんなエンジニアコミュニティ(国内)と関わらせていただく活動をしてますが、Swiftひとつでこれだけ多くの人が集まって、繋がっていくってのはめっちゃいいやんっ!って改めて感じました。そして、その中でもSwiftは先述の通りの身近なグローバル環境が用意されているので、Swiftやるだけで一気に国境を超えた繋がりができるってもう最高じゃんっ!!

...しかし、(とくに僕にとっては)英語という壁もあるのも事実なので、これからもっと英語勉強せねば!と思ったしだいでした。

司会やった感想と反省点

f:id:afroscript:20190328172831j:plain
司会席からみた会場

感想

結論からいくと、楽しすぎたっ!!会場前方から見る900人は、本当に圧巻でしたし、僕の拙いMCに900人が反応してくれて、「わぁ〜〜〜!」って感じでした。(語彙力なさすぎるw)

また、懇親会のときも「司会よかったです!」って話しかけてもらえたりと、Swiftほぼ書けない勢の僕をここまで輪に入れてもらえて、本当ありがとうございますという気持ちでいっぱいだった。

反省

ただやはり一番悔しいのは、僕が英語話せないゆえに、英語話者と日本語話者の反応にライムラグが生まれてること。。。相方のTimさんは、英語&日本語両使いなので、英語のあとすぐ日本語も入れることで、双方的に巻き込めてて、やっぱりそれが一体感を生んでたと思います。圧倒的にすばらしすぎる。

やはり海外の方は何時間もかけてせっかく日本にまで来てくれてるので、もっともっと最高な体験を提供したかったな〜。

ということで、(次もまたこんな大役(国際カンファレンスの司会)が僕にくるかは分からないですが)次回は僕もそうなりたい!

あと、初日はちょっとバタバタして余裕なくて、スピーカーのプロフィール紹介とかカミカミになってしまって申し訳なかった。。。この点については、スクリプトの雛形がサクっとできるシートを本番前日につくったので、来年MCする人はそれを使えばもっと余裕もって準備できるはず!こうやって、年々クオリティ挙げていけるといいなと思います。

まとめ

最後にはなりますが、来場してくださった参加者のみなさま、スピーカーのみなさま、本番まで一緒に駆け抜けてくださったOrganizersのみなさま、最も重要なイベントを支えてくだるスポンサーのみなさま、影でも表でもいたるところで支えて盛り上げてくださった関連会社/業者のみなさま、本当にありがとうございました。

(おまけ)当日の様子

f:id:afroscript:20190328172921j:plain

f:id:afroscript:20190328172931j:plain