コンユウメモ @kon_yu

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

"@kon_yuさん"フルコミットCTO辞めたってよ

f:id:kon_yu:20160613000717j:plain

現職の正社員のCTOではなくなりました。 現在はフルコミットではなく、週3日開発にたずさわって全力投球しています。

後半に連れてエモい話になって行くので、面倒な人は要約を読んでウィッシュリストからなんか送ってください(新日のTシャツとか)

要約

  • 技術顧問とフリーランスの開発案件を承ります
  • インプットとアウトプットのバランスを取りたい
  • 何をやるかより誰とやるか
  • 最近の興味は労働生産性を上げる事
  • Amazonウィッシュリスト公開してみた。書籍については一つ工夫をしてみた

このような活動をしていきます

  • 技術顧問の領域を増やします
    • エンジニアの採用補助します
    • 設計のレビュー致します
    • 戦略の開発項目の相談します
    • モダンな開発環境・チーム構築いたします
    • エンジニア採用面接お手伝いします
  • フリーランス開発を増やします
    • 保守性の高いRails開発が得意
    • iOS開発(Swift)の開発がしたい(現状のスキルが大したことがないのでちょっと単価が安くても良い)
    • サーバサイドがRailsでクライアントがiOSの開発だとWin-Winかも
  • エンジニア転職の相談承ります

まずは相談ベースでコンタクトしていただけると助かります。 下記に載せるAmazonウィッシュリストで何か送ってくれた人から待ち行列のキューの優先度を考慮したいと思います。

ほしい物リスト 奮ってご応募ください

業務経歴書と言うか技術者としてのプロフィールはWantedlyのプロフィールページが一番ちゃんとメンテしてるので貼っておきますね 業務経歴書的なプロフィール

なぜフルコミットを辞めたのか?

理由は2つ

理由一つ目 技術顧問の活動領域を増やすため

去年(2015年)から2社ほど技術顧問をしているうち、圧倒的に関われる時間が少なかった。その活動する時間を増やしたかった。 いままでの技術顧問で扱っていた内容は以下のような感じで、関わっている時間は週に1時間から2時間程度だった

  • githubのissueベースで質問を受け開発・設計に対するアドバイス
  • 顧問先のCTOと技術選定のディスカッション

特にissueベースでの質問する場合、issueを立てる側の顧問先のエンジニアのスキルやとれる時間の関係で、何が課題となりえるのか、将来的な問題になりそうなところはないか見えずらい。 もっと顧問先のコードベース俯瞰的に見る時間かけて、戦略ベースでどこに注力するべきかを総合してアドバイス(ないしは実装)して行こうかと思っている。

さらに基本的にやれることは上記のことに加え

  • 設計のレビュー
  • 戦略の相談に乗ります。開発タスクの順番の相談
  • モダンな開発環境・チーム構築いたします
  • エンジニアの採用補助

小さい会社のCTOが孤独という話と、技術がわからない人がエンジニア採用するのが難しいと言う話をもう少し説明すると

小さい会社のCTOは孤独

スタートアップや小さい会社だとCTOまたはリートエンジニアクラスと他若手数名と言う体制だと、 技術的な決定をする「このライブラリを使っていいだろうか?」「この開発言語で進めていいだろうか?」「AWSでほんとにいいのだろうか?」このようなときに相談できるレベルの相手がいないのである。

経験豊富なエンジニアと議論して「これで行きましょうと」合意すると先にすすめる不安が払拭される

自分もRailsのバージョンを3系から4系に上げるときに、週に数日手伝ってくれた@Oakbow7のおかげで大変助かった。もちろんコードを書いてもらって助かったが、技術的な議論ができたことがかなり助けになった。

この経験は他の人にも体験してもらいたい精神的な安寧を手に入れて欲しい。

技術がわからない人がエンジニア採用をすると失敗しがち

いままで外注でサービスを作っていた会社が、自社でエンジニアを採用するときに誰を採用したら良いのかわからないと言うような相談を何度か受けたことがある。 かなり大きな企業の採用担当者の方も同じようなことを言われていて、口がうまいプレゼン上手だけど他の能力がオンボロなのを採用してしまったりなどある。

採用時に誰を採用したら良いのかについて、マッチしそうな人を紹介したり、テクニカルな方の面接を代行したり採用担当者と一緒に面接に同席したりと関われたら良いかなと思っている

理由ふたつ目 インプットの量を増やしていきたい

これは単純にアウトプットの量よりインプットの量が減っている そのために、インプットする時間を確保したい

iOSの開発もしたいし、趣味の電子工作もしたいし、もっと英語が話せるようになりたい(いまは一人で海外旅行はできるけどガッツで英語を話している程度)

技術書以外の読書量が激減していてるので、語彙が減ってると自覚がある。語彙は知性の現れだと思うし、知性のない人はあんまり好きじゃない。好きじゃないものに自分がなるのは嫌だろ?

次に何がしたいか?

それなりにキャリアがあるので、普通にフリーランスのエンジニアとしてはそれなりに食べられるし、どこかの会社に入るのもいまのところ合う合わないのマッチングの問題だけで、少なくとも首都圏に住んでる分には選択肢は多い。 このちょっと贅沢な状況で、次何をするのかはかなり悩ましい問題だ。

今年で3回めの歳男なわけさ、元気に走り回れる年齢がせいぜい50歳ぐらいだとするとあと15年ぐらいなわけ。 けっこうリアルな数字だろ?

その元気に走り回れるうちにどうやって過ごしていきたいかを考えた時に思ったのが、「オレがウェブサービスで世界を変えるぜ」よりも、「時間や場所にとらわれずに旅するように働きたい」や「何をするかより、誰と働くか」だった。

誰と働きたいか

一言で言えば背中を任せて戦える仲間を探していきたいなんだけど、この誰と働くかに関してはもやもやしていてきちんと文章に出来ないので今思ってることを箇条書きにすると以下だ

  • 37signals(現basecamp)や、bufferのような場所や時間にとらわれない働き方に好感を持っている人
  • ムダに長い会議をどうやったら短く出来るかなど常に考えられること、KPTなど振り返りをして全体最適化に頭を回せる人
  • 創造性が高い仕事は同じオフィスで働かないと生まれないではなくて、なぜ席が近いと創造性が発揮されるのかや、距離が離れたでも創造性を発揮するにはどうしたら可能なのをかを考えようとする人
  • がっちり組織というよりはそれぞれ自立していてヤマがあったら協力して働くといった感じがいいな、the guildがそのイメージに近いかもしれない
  • 技術を使ってくだらないものを作る人がいい

もやもやしているので、よく人に合うようにしている

Web系企業の部長職やCTOクラスの人にあったり、はたまたフリーランスのエンジニアの人にあったりと積極的に人に合うようにしている

一般的に言う大企業でキャリアを積んでいる人にも合ってみたい。 ちょっと話を聞いてやんよ って人は@kon_yuまでメンションなりDMをください

ほしい物リストの公開とそのちょっとした施策

ほしい物リストの公開するのって今までやったことがなかったんだけど、退職エントリなどでちょくちょく友達に物を送ったりするようになったので自分も公開してみることにした

ほしい物リストリンク

書籍に関してちょっとした施策

ほしい物リストには書籍が多く、送ってくれる人にとって知りたい情報を替わりに読んで原稿用紙2枚程度(800文字)のレビューを書こうと思う。

  • 「この本買おうかどうか迷っているが、自分にとって役に立ちそうか」
  • 「こういうことが知りたいのでこの本で解決できそうか、また解決できるところを抜き出して教えてほしい」

このように本を読んだ自分の感想ではなく、送ってくれた人にパーソナライズして役に立つかどうかを伝えられると両者得なんじゃないかな。

レビューの例として、先日読んだ「ともに戦える「仲間」の作り方」という本のレビューを参考にしてもらいたい。 もらった本のレビューはもう少しちゃんと書くつもりだがイメージは掴めるだろう。

ともに戦える「仲間」のつくり方

ネットに疎いけどウェブサービスで起業した元エリートって言う、スタートアップ界隈にいるよくいる感じです。
わかってないのに開発を外注して失敗してるという、スタートアップあるあるをしています。
1/3読んだ時点では、エンジニアの自分としては嫌いなタイプですね、これが残りの2/3で変わっていく、雇われているエンジニアとしては好ましい経営者になっていく

内容は、リーンスタートアップなど読んだことある人にはこれと言って新規で得られる知見はないかもしれない。事例として現在も日本で稼働しているサービスなのでよりリアルに感じられるかも。内容はこんな感じ
・エンジニア無しで外注でシステムを作るとうまくいかない
・夢を詰め込み過ぎてMVPでリリースしないとうまくいかない
・事業に共感してくれる仲間を探すために積極的に人に会って、たくさん自分のやりたい事業を説明しましょう

心に響いたのは
南さんがたくさんのエンジニアに合って「仲間になりましょう」と言っても、エンジニアから「仲間と言っているが、利用してやろう」と言う気持ちがすけて見えると指摘されていた点

けっこう起業家というか、エンジニア出身じゃない人が採用イベントで使うこの「仲間」って言葉に力が無い。と言うのはよく見かける

一番良いのは、ビズリーチをCMを打てるまで成長させた南さんが導いた結論が、「何をやるかより、誰とやるか」と言っているところ。オレもそう思ってるけど、ちゃんと成功させている人の言葉のほうがしっくり来るだろ?

SwiftでRealmを使う

はじめに

アプリ内にデータを永続化させる方法として内部的にsqlite3を使うCoreDataは素で使うのはけっこう大変、 CoreDataのORMのライブラリMagicalRecordやSugarRecordを使う方法もある。

RealmはSqlite3ではない高速なDBと、ORMがコミコミで使い方を簡単も簡単(らしい)

Android, iOS含めデファクトスタンダードになるつつあるRealmを使ってみる

ゴール

  • Realmをプロジェクトに含めて設定する
  • Realmを使って読み込み・書込する

動作環境

  • xcode 7.3.1
  • osx 10.11.4
  • carthageを利用しているSwiftのみのXcodeプロジェクトを利用
  • CartfileもXcodeプロジェクトに含まれている

※プロジェクトの設定等はこちらの記事を参照 http://konyu.hatenablog.com/entry/2016/05/20/192759

CarthageでRealmを追加し、プロジェクトで使用可能にする

iOS向けのライブラリをCarthageを利用して取得する

コンソールからXcodeプロジェクトのディレクトリに行きCartfileに以下を追記する

github "realm/realm-cocoa"

Carthageを利用してライブラリのバイナリを取得する

> carthage update --platform iOS realm-cocoa

Xcodeプロジェクトルート/Carthage/Build/iOS の下に書きファイルが作成されていればOK

  • Realm.framework
  • RealmSwift.framework

※ realm-cocoaとライブラリ名を指定してあげないと、Carthageに書いてあるすべてのライブラリを更新使用してしまうので注意が必要

--platformでiOSを指定してもrealmの場合はBuildディレクトリに各プラットフォームにコンパイル済みのRealm.frameworkやRealmSwift.frameworkが作成される。 --no-use-binariesオプションをつけるとソースからコンパイルする このへんはCarthageというよりは各ライブラリのCarthage向けの設定の問題かもしれない

XcodeプロジェクトにRealmのライブラリを紐づける

Xcodeでプロジェクトを起動しプロジェクトファイルを開き、Generalを選択、Embedded Binariesに先ほど作った

  • Realm.framework
  • RealmSwift.framework

を追加する

次に、プロジェクトファイルのBuild Phasesを選択、Run ScriptのInut Filesに以下を追記する

$(SRCROOT)/Carthage/Build/iOS/Realm.framework 
$(SRCROOT)/Carthage/Build/iOS/RealmSwift.framework

コンパイルが通ったら成功

Realmを使って書き込み・読み取りをする

Realm browserをインストール

書き込みの確認のためにRealm browserをインストールする https://itunes.apple.com/app/realm-browser/id1007457278

Realmモデル作成の準備

XcodeのパッケージマネージャAlcatrazのインストール

HomebrewのようなXcode向けのパッケージマネージャAlcatrazをインストールする http://alcatraz.io/

コンソールから下記の実行して、xcodeを再起動する

curl -fsSL https://raw.githubusercontent.com/supermarin/Alcatraz/deploy/Scripts/install.sh | sh

WindowメニューにPackege Manegerの項目が増えていたら成功

RealmPluginをインストールする

先ほど入れたAlcatrazを利用するためにXcodeのWindowメニューPackege Manegerを開く Searchのウインドウに「RealmPlugin」と入れて検索してヒットしたRealmPluginをインストールボタンを押してインストールする インストールが完了したらXcodeを再起動し、新規ファイル追加するメニューに「Realm」があり、その中に「Realm Model Object」が選択できるようになっている

Realmモデルの作成

新しいファイルから「Realm Model Object」を選択しクラス名をRealmTestとする

import Foundation
import RealmSwift

class RealmTest: Object {
    // dynamic修飾子を付けないとあかん、なぜかは説明を読んでも説明に見がわからんので、今のところおまじない
    dynamic var name = ""
    dynamic var number = 0
    
// Specify properties to ignore (Realm won't persist these)
    
//  override static func ignoredProperties() -> [String] {
//    return []
//  }
}

Realmで書き込みをする

アプリ起動時に実行するViewController.swiftのviewDidLoadメソッドに追記する シミュレータを起動して書き込みを行う

import UIKit
import RealmSwift

class ViewController: UIViewController {

    override func viewDidLoad() {
        super.viewDidLoad()

         // モデル作成
        let myRealm = RealmTest(value: ["name" : "なまえ", "number": 100])
        
        // デフォルトRealmを取得する(おまじない)
        let realm = try! Realm()
        
        // トランザクションを開始して、オブジェクトをRealmに追加する
        try! realm.write {
            realm.add(myRealm)
        }
    }

    override func didReceiveMemoryWarning() {
        super.didReceiveMemoryWarning()
        // Dispose of any resources that can be recreated.
    }
    
}

Realm browserで書き込みを確認する

Realmで書き込まれれると default.realmファイルというものに書き込まれる。 (たぶんdefault以外にもファイル名を変えられたり複数ファイルを使ったり出来るんだろうがそれはまた別のお話)

Realm browserからシミュレータにあるrealmファイルを開く

realmファイルの場所については以下の記事が詳しいく書いてある http://stackoverflow.com/questions/28465706/how-to-find-my-realm-file/28465803#28465803

Realm browserを起動して、ダイアログでrealmファイルの場所を指定する際には、「Cmd + shift + g」で絶対パスを利用すると便利 /Users/ユーザ名/Library/Developer/CoreSimulator/Devices/デバイスID/data/Containers/Data/Application/アプリID/Documents/default.realm

このように書き込まれているのを確認できる。

スクリーンショット 2016-05-22 15.28.35.png

Realmで読み取りをする

書き込みをしたコードの直下に、読み取り部分のコードを追加する

import UIKit
import RealmSwift

class ViewController: UIViewController {

    override func viewDidLoad() {
        super.viewDidLoad()

         // モデル作成
        let myRealm = RealmTest(value: ["name" : "なまえ", "number": 100])
        
        // デフォルトRealmを取得する(おまじない)
        let realm = try! Realm()
        
        // トランザクションを開始して、オブジェクトをRealmに追加する
        try! realm.write {
            realm.add(myRealm)
        }
        // 追記 読み取り部分//////
        let objs = realm.objects(RealmTest).filter("number == 100")
        if let obj = objs.first {
            print(obj)
        }
        // 追記終わり
    }
}

コンソール画面にprint出力した結果が表示される。

RealmTest {
    name = なまえ;
    number = 100;
}

refs: https://realm.io/jp/docs/swift/latest/

あわせて読みたい

XcodeでGitのリモートリポジトリでソース管理する(Carthage対応)

はじめに

OSSライブラリを利用するのにCarthageを使ったXcodeのプロジェクトを作成した場合にCarthageのライブラリ設定をまるごとリモートリポジトリで管理して 他のメンバーもGit cloneしたら利用できるようしたい。

ゴール

先日作ったiOSのシングルページアプリケーションのXcodeプロジェクトを使って以下ことをする

  • Bitbucketを使ってXcodeのプロジェクトをリモートリポジトリで管理する
  • リモートリポジトリからcloneして、シミュレータで起動を確認する
  • Carthageを利用したライブラリがチーム開発できるようにうまく利用できていること

動作環境

Bitbacketにプライベートリポジトリを作る

この辺は簡易に書いていくと

※ git:// のプロトコルだとBitbacketにsshのパブリックキーを登録しておく必要があるっぽい

既存のXcodeにリモートリポジトリを紐づける

Xcodeを起動し、先日作ったプロジェクトを選択する。 メニューバーSource Controlを選択、「プロジェクト名 master」を選択、そして「Configure プロジェクト名」を選択するとダイアログが表示される

「Remotes」のタブを選択し、プラスボタンを押すとメニューが出るので、「Add Remote」を選択する

Name:Origin(デフォルトのまま)
Adress: https://account_name@bitbucket.org/xxxx/xxxxx.git(メモしておいたBitbacketのgitのアドレス)

「Add Remote」ボタンを押して、「Done」ボタンを押して設定完了

メニューバーSource Controlを選択肢、Pushを選択、 Push先をoriginにするとBitbacketのパスワードが求められるので入力するとBitbacketにPushされる(アカウント名は非活性で固定されている)

Bitbacketの対象のリポジトリのページへ、ソースのメニューを開き、ソースコードが追加されているのを確認する

リモートリポジトリからクローンする

コンソールから適当なディレクトリに移動し、リモートリポジトリをクローンする

git clone https://account_name@bitbucket.org/xxxx/xxxxx.git
Password for 'https://account_name@bitbucket.org': Bitbacketパスワードを入力する

Xcodeプロジェクトを開いて確認する

クローンしたディレクトリをFinderで開いて、xcodeのプロジェクトファイルを開いてみる コンパイルするとCarthageで指定したライブラリファイルが無いとエラーが出るのがわかる。

Carthageのライブラリを取得する

> carthage bootstrap --platform iOS

carthage update だと最新版のライブラリのバージョンを取得しCarthage.resolvedを参照しない ライブラリを追加しない時はcarthage bootstrap を実行するべきだ

Carthageディレクトリが作成され、ライブラリが作成されたことを確認できる

再びXcodeを起動しコンパイルするとエラーが解消されいるのがわかる