文字っぽいの。

文字を書いています。写真も混ざります。

「師弟登壇2015」でpixivの新卒研修について話してきました。

GMOペパボさんが主催、クックパッドさんに会場提供していただいた『師弟登壇2015』に師弟として登壇してきました。

pepabo.connpass.com

pixivの新卒研修はざっくりと、

  • 業務知識・スキルを学ぶ:7日
  • ビジネスマナーを学ぶ:2日
  • 会社の理念を学ぶ:3日
  • 会社の歴史を知る:1日
  • プログラミングを学ぶ:7日

という感じの内容になっています。発表では@bash0C7さんが企業説明や新卒研修・新卒採用についての概要を説明し、私がプログラミング研修について説明をしました。詳しい内容についてはスライドを見ていただくと分かるかと思います。

発表のメインは、新卒研修の1セクションであるプログラミング研修についてで、

  • 新卒(エンジニア)が新卒(総合職)にプログラミングを教えている
  • 7日間で画像投稿掲示板を作ってもらう
  • 目的はエンジニアと『きもちよく』仕事ができるようになること

といったことを話しました。発表中にもお話したのですが、プログラミング研修は師匠(新卒技術職)サイドに全てが移譲されていて、どんな研修にするか、スケジュールはどうするかなども全て新卒で考えて決めました。

課題の内容や進め方については、去年の例を先輩から聞いて、そこから今年向けにアレンジして行いました。去年の例は書籍にもなっていて、金子本と呼ばれています。総合職にプログラミングを教えたい場合は、この本を買えばいいと思います。(宣伝しても印税は金子氏にしか入らない)

研修の内容や最終的な課題を決める前に、研修の目的を決める必要がありました。この目的が曖昧だと、講義の内容やメンタリングにブレが生じて、学びが曖昧な研修になります。そして、師匠陣で話し合いを行った結果「エンジニアと『きもちよく』仕事ができるようになる」という目的でプログラミング研修を設計していくことになりました。

昨今、エンジニアにとって働きやすい環境・制度がとりあげられる事が増えてきました。しかし、その環境・制度のなかで、非エンジニアの人は楽しく働けているのか疑問でした。そういった疑問を持っていたので、このような目的を提案しました。会社の制度を変えるのは、時間も労力もかかります。なので、まずは新卒間でエンジニアと非エンジニアの壁をできるだけ低くしたいと考えました。

結果として、デザイナさんから「Atom Editorでこういう検索ってどうやるん?」とか、企画の人から「(悪用ではない)スクレイピング勉強したいんじゃー。」という話が出てきて、ちょっとは壁が低くなったのかなと感じております。

f:id:FromAtom:20151206145041j:plain

他にはガイアックスさん、カヤックさん、クックパッドさん、mixiさん、はてなさん、GMOペパボさんが登壇していました。各社とも価値観・文化・世界・規模が違うため、「あー、弊社もそのうちそういうステップになるのかー。」と思いながら聞けて大変おもしろかったです。発表内容については、各社からスライドが公開されてくると思うので省きます。ざっくり感想を書くと、

  • 10万円欲しい
  • テスト駆動学習がゲームみたいで楽しそう
  • 即戦力ではないが"なんか持ってる"人材を育てていく研修を作るの大変そう
  • OJTをどのように回していくと効率的か
  • 研修でチーム作業を失敗して欲しいっての良い
  • 研修をして終わりではなくその後のサポートが大事ですね
  • 採用の段階から研修は始まっているというか、採用で5割研修終わってるのわかる

などなど、色々考えさせられました。

懇親会

様子です。寿司がなんか高給で、普段食べている銀のさら最安桶とは違う匂いを感じました。懇親会はクックパッドスポンサーしてくれて最高の企業という感じです!ありがとうございます!

f:id:FromAtom:20151206172044j:plain

ビールを飲みながら、

  • 人事とCTOと研修担当がしっかり話し合わないと破滅する
  • 人事オンリーやCTOオンリーでやると暴走して破滅する
  • 採用サイドと研修サイドで思想が異なると破滅する
  • ディレクターや企画職の研修をどうするとよいのか
  • 新卒各位、最近仕事どうすか?

という話をぼんやりしました。やはり、新卒研修をする側・受ける側のつらみは色々あって、なんとかしてこれを”おもしろく”解消しようと各社頑張っているという感じです。まぁ、つまらない研修なら、金の力でいくらでもできますからね。

最後に

今回の発表はYAPC2015のトークに応募していました。

yapcasia.org

結果としてYAPCはリジェクトされちゃったのですが、お蔵入りせずに話せて良かったなぁという気持ちでおります。

最後になりますが、運営のGMOペパボさん、会場と寿司提供のクックパッドさん、登壇した各社師弟さん、本当におつかれさまでした!

Swift2.0のprotocol extension試してたら'Segmentetion fault: 11'でてハマった。

書いたコード

protocol Test {
    var x: CGFloat { get set }
    var y: CGFloat { get set }
    
    func setPoint(point: CGPoint)
}

extension Test {
    mutating func setPoint(point: CGPoint) {
        x = point.x
        y = point.y
    }
}

struct test: Test {
    var x: CGFloat = 0.0
    var y: CGFloat = 0.0
}

出るエラー

ビルドはできないし、Xcodeシンタックスハイライトも死んで白き灰がちになりてわろし。

0  swift                    0x0000000105b9b33b llvm::sys::PrintStackTrace(__sFILE*) + 43
1  swift                    0x0000000105b9ba7b SignalHandler(int) + 379
2  libsystem_platform.dylib 0x00007fff81b9752a _sigtramp + 26
3  libsystem_platform.dylib 0x00007fff5bf79768 _sigtramp + 3661505112
4  swift                    0x0000000103e64857 swift::SILWitnessVisitor<(anonymous namespace)::SILGenConformance>::visitProtocolDecl(swift::ProtocolDecl*) + 999
5  swift                    0x0000000103e62035 swift::Lowering::SILGenModule::getWitnessTable(swift::ProtocolConformance*) + 277
6  swift                    0x0000000103eb1890 (anonymous namespace)::SILGenType::emitType() + 1264
7  swift                    0x0000000103eb132e swift::Lowering::SILGenModule::visitNominalTypeDecl(swift::NominalTypeDecl*) + 30
8  swift                    0x0000000103e39e0b swift::Lowering::SILGenModule::emitSourceFile(swift::SourceFile*, unsigned int) + 779
9  swift                    0x0000000103e3a9c0 swift::SILModule::constructSIL(swift::ModuleDecl*, swift::SILOptions&, swift::FileUnit*, llvm::Optional<unsigned int>, bool, bool) + 928
10 swift                    0x0000000103e3ad6d swift::performSILGeneration(swift::FileUnit&, swift::SILOptions&, llvm::Optional<unsigned int>, bool) + 109
11 swift                    0x0000000103c8eb92 performCompile(swift::CompilerInstance&, swift::CompilerInvocation&, llvm::ArrayRef<char const*>, int&) + 11442
12 swift                    0x0000000103c8bcd3 frontend_main(llvm::ArrayRef<char const*>, char const*, void*) + 2691
13 swift                    0x0000000103c88354 main + 2324
14 libdyld.dylib            0x00007fff844be5ad start + 1

Command failed due to signal: Segmentetion fault: 11

とか出る。

解決法

protocolにちゃんとmutatingをつける。

protocol Test {
    var x: CGFloat { get set }
    var y: CGFloat { get set }
    
    mutating func setPoint(point: CGPoint)
}

extension Test {
    mutating func setPoint(point: CGPoint) {
        x = point.x
        y = point.y
    }
}

struct test: Test {
    var x: CGFloat = 0.0
    var y: CGFloat = 0.0
}

たったこれだけなんだけど全然分からなくて、最強のアルバイト氏に相談したら見つかった。さすが最強である。

SwiftでURLのQueryをDictionaryにパースする

前提

  • swift2.1

functionを定義する方法

func generateDictionalyFromUrlComponents(components: NSURLComponents) -> [String : String] {
    var fragments: [String : String] = [:]
    guard let items = components.queryItems else {
        return fragments
    }
    
    for item in items {
        fragments[item.name] = item.value
    }
    
    return fragments
}

let comp: NSURLComponents? = NSURLComponents(string: "http://example.com/?id=12345&username=tarou")
let fragments = generateDictionalyFromUrlComponents(comp!)
print(fragments["id"]) // => Optional("12345")

NSURLをextensionする方法

extension NSURL {
    var fragments: [String : String] {
        var results: [String : String] = [:]
        guard let urlComponents = NSURLComponents(string: self.absoluteString), let items = urlComponents.queryItems else {
            return results
        }
        
        for item in items {
            results[item.name] = item.value
        }
    
        return results
    }
}

let url = NSURL(string: "http://example.com/?id=12345&username=tarou")
print(url!.fragments["id"]) // => Optional("12345")

雑感

  • NSURLComponentsとNSURLQueryItemは便利
  • 雑にググったら正規表現祭りで地獄かと思った

『日本Web技術界隈著名人の残念さ具合』について僕が知っていること

thinkchang.hatenablog.com


こちらのエントリーが流行っております。この記事を素早く見つけてブックマークした人達を見てみましょう。

日本Web技術界隈著名人の残念さ具合 - thinkchangの日々日誌

そのとーり

2015/08/22 17:19
b.hatena.ne.jp

日本Web技術界隈著名人の残念さ具合 - thinkchangの日々日誌

書いた

2015/08/22 17:19
b.hatena.ne.jp

日本Web技術界隈著名人の残念さ具合 - thinkchangの日々日誌

はげどう

2015/08/22 17:34
b.hatena.ne.jp


なるほど。では、このエントリーの次に投稿されたエントリーのブクマを見てみましょう。

b.hatena.ne.jp

f:id:FromAtom:20150825145904p:plain


なにかに気がついたようです。

b.hatena.ne.jp


やっぱり気がついて無かったようです。

b.hatena.ne.jp

f:id:FromAtom:20150825150206p:plain


そういえば、このブログで一番最初に投稿されたエントリーはどんな感じでしょう。

b.hatena.ne.jp

f:id:FromAtom:20150825150515p:plain

現場からは以上です。

SwiftでUIActivityController(シェアシート)に独自のUIActivityを実装する。

シェアシート内のこれら。

f:id:FromAtom:20150817204110p:plain

こっちの灰色な方を独自実装する方法。Tumblrだと不適切としてフラグを付けるが、ここに独自で作られて入ってる。そんなUIActivityをSwiftで実装する方法。

まず、UIActivityを継承したクラスを作って、いくつかのメソッドをオーバライドする。

class CustomAlertsActivity: UIActivity {
    override func activityTitle() -> String? {
        return "アクティビティの名前"
    }
    
    override func activityImage() -> UIImage? {
        return UIImage(named: "ImageName")
    }
    
    override func activityType() -> String? {
        return "com.example.myapp"
    }
    
    override func canPerformWithActivityItems(activityItems: [AnyObject]) -> Bool {
        // trueを返すと表示される
        // activityItemsの中身をみて、表示するかどうか判断する
        return true
    }
    
    override func prepareWithActivityItems(activityItems: [AnyObject]) {
        // 選択された時の処理を書く
    }
}

使う時はこうやって書く。

let string: String = "なんらかのテキスト"
let url: NSURL = NSURL(string: "http://www.example.com/")!
let activityItems: [AnyObject] = [
    string,
    url
]

let applicationActivities = [
    CustomActivity() // <- 上で作ったやつ
]

let activityViewController = UIActivityViewController(activityItems: activityItems, applicationActivities: applicationActivities)

// 不要なデフォルトアクティビティはここに登録して消す
let excludedActivityTypes = [
    UIActivityTypePrint,
    UIActivityTypeAssignToContact
]

activityViewController.excludedActivityTypes = excludedActivityTypes
presentViewController(activityViewController, animated: true, completion: nil)

簡単。

スプラトゥーン公式TwitterのつぶやきをSlackに投げるIFTTTレシピ作った。

つくった。

IFTTT Recipe: SplatoonJP2Slack connects twitter to slackifttt.com

こんな感じでSlackに飛んでくる

f:id:FromAtom:20150817200200p:plain

IFTTTの仕様で最大で15分位遅延するけど、毎回手作業でURLコピーして「こんなんでたよ」とするより楽で良い。ぜひご利用下さい。

Slackのカスタム絵文字に『イカモドキ』を使うとイカした感じになる

フリーフォント「イカモドキ」 | あらむぎ というフリーフォントがあります。これを使って、絵文字を作るとこんな感じになります。

f:id:FromAtom:20150813201615p:plain

Slackの絵文字に文字を入れるとだいたい見難くなるんですが、イカモドキを使うとめちゃくちゃ視認性が良くて、大変イカしています。