その後のその後

iOSエンジニア 堤 修一のブログ github.com/shu223

2020年のふりかえり:技術への全振りを緩めて新領域に挑戦

2019年は「技術発信のマネタイズ」を目指した1年だった。有料note → 技術書の個人出版 → 案件と全フェーズをマネタイズするしくみができ、これのおかげで2020年はベーシックインカム的に一定の収益があり、新しいことに挑戦できた1年だった。

(2020年は書籍の利益が約200万、noteが約90万)

以下その振り返り。

2020年、成長サイクルモデルの限界

「成長サイクルモデル」というのを書いてみたことがある。

note.com

興味のある技術を勉強する 
→ 発信する 
→ おもしろい仕事をもらう 
→ スキルと実績ゲット 
→ 発信する 
→ おもしろい仕事をもらう
→ ...

というインプットとアウトプットを両輪として循環するサイクルとなっている。

10年間これで楽しくやってこれたのだが、慢性的に2つの問題を抱えていた。

  • サイクルをまわすすべての動力の源泉が「時間」となっている
  • サイクルが「技術」だけに特化している

前者の問題は根深くて、まぁもうこのサイクルは終わってるよねと先の記事では結論づけている。

まさに現在のモデルは自分の時間というリソースが尽きたところで成長が終わる。時間は慢性的に尽きているのでつまりこの成長サイクルは既に終了している。(時間でお金を買うといっても限界がある)

後者の話は、たとえば僕が友人と飲みに行くとか、読書するとか、そういう活動は全部(このサイクルにあてはめてみれば)時間という源泉を奪うマイナス要因となってしまうということだ。いや行けばいいじゃんと思うかもしれないが、実際のところ、高時給がもらえて、つくるプロダクト/サービスも良くて、勉強したい技術が使えて、クライアントも良い人で仕事がしやすくて、っていう仕事がたくさんあるので、どうしても持ち時間を仕事で埋め尽くしてしまうという事態になっていた。

ホリエモン氏のモデル(上述の成長サイクルモデルの記事に書いた)はこのへん非常にうまい具合になっていて、

f:id:shu223:20210105151323j:plain

  • 基本的に持ち時間をすべて「おもしろいこと」に全振りしておけば勝手にサイクルがまわっていく

  • 本を書くにしても1冊1冊をすべて自身で書き下ろしていく必要はなくて、誰かが過去の文章や講演を再編集したりインタビューしたりしてまとめてくれるので、プロダクト生産の時間コストが限りなくゼロに近づく(ので、おもしろい仕事に全振りできる)。

自分の技術だけに特化したモデルから脱却できないものかなーと考え始めたのが2020年だった。

しかし「持ち時間をすべておもしろいことに全振りしておけば勝手にまわっていく」というサイクルは理想的ではあるけど、僕が仮に全振りしても同じようにはまわらないわけで、自分なりの自分に向いたやり方で理想に近づけていくしかない。そこは考え中。

YouTubeとオンラインサロン

このへんの課題感が、2020年に始めたYouTubeとオンラインサロン(その後コミュニティになった)によりちょっと前進した。

まず1月から開始したYouTubeチャンネル1

www.youtube.com

これのおかげで、会いたい人に会って聞きたい話を聞く、という旧サイクル下ではコスト/機会損失だった行為を自分のサイクルに組み込むことができた。

ほとんど「撮って出し」なので収録以外の時間コストはほぼゼロだし、視聴者のことはほぼ考えず(コンテキストの説明等もほとんどしない)僕が聞きたい話を聞いているので、飲みに行くのと同じような気楽さ・楽しさで運営できている。つまり、マネタイズできなくてもサステナブル。(僕が話したい人がいる限り飲みに行く感覚で続けられる)

さらに、このYouTubeはゲストインタビュー中心だが、その中で僕の「価値観」を発信できていると思う。これは今までのテキストベースのメディアではあまり発信できていなかった部分。さらにもうちょっとチャンネルが大きくなれば、オンラインコミュニティへの送客も期待できる。いい事だらけだ。

5月から始めたオンラインサロン(8月からコミュニティに名実ともに変わった)もまた成り行きで始めたものだけど、これもまた自分の技術「以外」の部分をサイクルに組み込むための重要なチャンネルになっている。

community.camp-fire.jp

そんな感じで、YouTubeとオンラインサロン(コミュニティ)によって、「技術以外の人間活動全般をビジネスサイクルに組み込みたい」というところが前進した2020年だった。

2021年

そんなわけで2020年は今まで技術面に全振りしていた力を少し緩め、 YouTube、コミュニティという新しい領域に挑戦できた。

しかしその反動で技術面は(相対的に)弱くなった2、 YouTube、コミュニティもまだまだ自分の柱と呼ぶには弱い。

そもそも「サイクル」といったものの実はサイクルなんて構築できておらず、 断絶した点と点があるだけでそれらはあまりつながっていない。

この状況、下手したらすべてが中途半端のまま終わってしまいそうな危うさがある。 今は10年間で積み上げたiOSキャリアの余韻で食えてるようなものなので、 下手したら来年あたりは就職活動してるかもしれない。

というわけで、もうちょっとこれらの活動を育てて、ビジネスとして軌道に載せて、サイクルを構築していくのが2021年にやるべきことかなぁと漠然と考えている。(考え中)


  1. このYouTubeチャンネルは最初はVoicyというクローズドな場で展開していた音声コンテンツをもっとオープンなプラットフォームで出したいなと思ったところからスタート。KBOY氏が遊びに来てくれた際にせっかくだから動画を撮ってみますかーというので初めて撮影してみて、あーこんなに簡単にできるんだというのでなし崩し的に以降のエンジニアインタビューも音声じゃなくて動画でやることになった。

  2. 技術面で開拓したところもあるのだけど、話が逸れるのでこれはまた別の記事で。

「エンジニアのための発信講座」を2ヶ月やってみた進捗

先日、「エンジニアのための発信講座」の第5回を行いました。開始からだいたい2ヶ月経ったということで、今回は趣向を変えて「中間成果発表会」と題して進捗状況を共有しました。

以下発表スライドです。

f:id:shu223:20200831211130j:plain

f:id:shu223:20200831211205j:plain

f:id:shu223:20200831211219j:plain

f:id:shu223:20200831211235j:plain

f:id:shu223:20200831211602j:plain

f:id:shu223:20200831211616j:plain

f:id:shu223:20200831211634j:plain

f:id:shu223:20200831211648j:plain

(確認できているだけでも複数出ています)

f:id:shu223:20200831211705j:plain

(初めての登壇のハードルの高さを考えるとすごいことかと!)

f:id:shu223:20200831211721j:plain

f:id:shu223:20200831211738j:plain

(メンバーにとある出版社から執筆依頼が来た)

f:id:shu223:20200831211954j:plain

(仕事の依頼が来たメンバーも数人)

f:id:shu223:20200831211922j:plain

(英語で記事を書いていて海外からの引き合いが来始めた人も)

f:id:shu223:20200831212054j:plain

f:id:shu223:20200831212111j:plain

まとめ

なかなか堅実な成果が出ているといえるのではないでしょうか?

なお本講座は、テクニックを弄してフォロワーを急に増やすとかではなく、一時的にだけがんばって本業よりも優先して記事を書くとかでもなく、瞬間的なバズ狙いでもなく、無理なく続けられる方法で記事を書いて徐々に「実のある発信力」をつけていきましょう、というスタンスでやっております。

f:id:shu223:20200901190547p:plain

f:id:shu223:20200901190602p:plain

f:id:shu223:20200901190726p:plain

本講座は「エンジニアと人生コミュニティ」の活動の一環として行っています1

エンジニアと人生コミュニティ - CAMPFIRE (キャンプファイヤー)

過去の講義パートは動画で無料で全公開しています2

youtu.be

youtu.be

youtu.be


  1. エンジニア以外の方々も歓迎です!技術の話をしているわけではありませんので。

  2. 過去回の個別アドバイスの動画はコミュニティ限定で閲覧可能です。

「エンジニアのための発信講座」をはじめます

(2020.7.15 タイトル変更しました)

弊オンラインサロン開設以来、ずっと「サロンという形態で自分が提供できる価値は何か」とずっと自問してきました。iOSやSwiftといった何か特定の技術を初学者に丁寧に教えるというのは僕の強みを活かすものではないし、自分が旗を振って共同開発をやるというのもピンとこないし・・・ということでもうこの方向しかないだろうと。で、本日!弊サロンのv2.0ともいえる新しいプロジェクトを始動させました。以下サロン内のSlackチャンネルに書いた内容:

講座の説明

本講座の主旨

「サロン主がもしかしたら仕事をふるかも!?」というのは多くのエンジニア系サロンにおいて参加の大きな動機となっているようです。本サロンでもそれは可能ですが、「やりたい仕事の依頼が向こうからくるエンジニアになることをサポートする」方が堤の強みとも合致するし、より本質的では?と考えるに至りました。

どこを目指すか

必ずしもフリーランスを推奨するわけではありませんし働き方の好みは人それぞれで良いと思いますが、それをふまえた上で一例として堤のケースを示しますと、

  • エージェント経由で仕事を受けたことは一度もない
  • 単価はこちらで公開中(有料note)・・・もっと上げても需要はあるだろうが新しいスタートアップの仕事もやりたいので上げ過ぎないようにしている
  • その時々の技術的興味に応じてやりたい仕事だけを選べている
  • 海外からもよく依頼は来る
  • それほど物欲もないし税金が高くなるばかりなので1年の後半はもう働かないぞと思うがつい面白い案件が来てやってしまい、なんだかんだ2000万ぐらいは稼いでしまう(働くつもりがないのに稼いでしまうのでもはや不労所得の感覚)

要は、高単価でも仕事が選べるぐらいたくさんくる、という状況です。

場所や時間の制約を受けず自由に働きたい/海外で働きたい/興味のある仕事だけやっていたい・・・といったあたりは堤の経験からサポートできそうな気がしています。

講座の進め方

  • エントリーする(後述)
  • 堤がレベル別に課題を出す
  • 週報をこのチャンネルに書く(任意)1
  • Zoomミーティング・・・講義&週報を元に個別フィードバック(頻度は検討中)

課題

基本的な方向性としてとにかく発信力を鍛えていただきます。エンジニアとして技術力をつけるのはもちろん当然のこととして、そのスキルと実績をしっかり外に見えるようにして、仕事が転がり込んでくるようにする部分を本講座でサポートします。

【入門】

こちらの動画をご覧ください。(サロン内で毎日投稿している動画のひとつ)

youtu.be

まずはここで言及している以下の条件を満たすよう、なんでもいいので発信活動を行ってください。

- フォロワー/フォロー > 2
- フォロワー > 100

【中級】

フォロワー/フォロー比2以上 を維持しつつ、「技術発信をベースに」 フォロワー数2000以上 を目指してください。2000ぐらいあれば、良い技術記事を書いた場合、良いOSSを公開した場合等にバズまではいかないにしても「火種」ぐらいは起こせるようになり、良質な発信活動がしっかり報われるようになります。

技術発信の手段としてはQiitaやnoteに記事を書く、GitHubでOSSを公開する、勉強会やカンファレンスに登壇する、何でもOKです。

【上級】

欲しい案件が向こうから来るようにするにはある程度「狙った」ブランディングが必要となるでしょう。個人個人で置かれている状況や持っているスキルや発信チャンネル、目指している方向性によって変わってくると思うので一緒に考えましょう。

参加条件

  • サロンメンバーはどなたでも。
  • ROM専でもOK。時間がない方もたまに参加したりたまに実践してみたりでOKです。

参加方法

このチャンネルで、以下の内容を投稿してください。

- どこを目指すか
- その目指している地点に対する現状
- TwitterアカウントのURLと今現在のフォロー数/フォロワー数
- QiitaアカウントのURLと現在のコントリビューション数
- GitHubアカウントのURLと現在のスター数
- その他発信チャンネルがあれば

ちなみに堤の数字はこんな感じ:

  • Twitter: 979フォロー/9782フォロワー
  • Qiita: 22873コントリビューション
  • GitHub: 24467スター

興味のある方はぜひ!

弊サロンにはこちらから入れます。今のところたったの月額1000円、コーヒー2回分ぐらいです。

community.camp-fire.jp

「オンラインサロン」にうさんくさいイメージをお持ちの方は、こちらの口コミを読んでみてください。

minsalo.com

僕はiOSエンジニアですが、現メンバーの半分以上の方はそれ以外の技術領域(バックエンドやフロントエンドやAndroid)を専門とされていますし、エンジニアではない方や初学者でこれから目指されるという方も大勢いらっしゃいます。どうぞご安心を。ROM専(見てるだけ)の参加形態も全然ありです。


  1. 日報・分報は個人的に推奨しますがチャンネルの流れが早くなりすぎるおそれがあるので各自timesチャンネルをつくってそちらに書いてください

API Diffsから見るiOS 14の新機能 - ML・画像・音声編 #WWDC20 #iOS14

本日からはじまったWWDC 2020、明日から始まるセッションに備え、ドキュメントからAPIの差分をみて気になったものをピックアップしていきます。

数時間前に投稿した新規追加フレームワーク編に続き、本記事では既存フレームワークのうち、機械学習(ML)、画像、音声関連のものを見ていきます。

f:id:shu223:20200623162859p:plain

Vision

めちゃくちゃ機能追加されてます。

class VNDetectHumanBodyPoseRequest

人体の姿勢推定。ついに標準機能として入ったわけですね。

qiita.com

class VNDetectHumanHandPoseRequest

手の姿勢推定。これが必要でMediaPipeを試したりしたこともありましたが、もう必要なくなるのでしょうか?

class VNRecognizedPointsObservation

上の姿勢推定の結果はこの型で返ってくるようです。

サンプルもセッションもあるので、深堀りしてマガジンに書いていきます。

Core ML, Core ML Tools(coremltools)

ここはピックアップせずともしっかり見るつもりなので、本記事では割愛。

Create ML

テンプレートめっちゃ増えてます。NDA遵守のためベータアプリケーションのスクショは貼らないでおきますが、「Create MLのテンプレート」といってもピンとこない人もいるかもしれないので、代わりに現行版のテンプレート選択画面(の一部)のスクショをはっておきます。

f:id:shu223:20200623155402p:plain:w300

ここから4つのテンプレートが追加されています。

個人的な感想:

  • 動画用モデル(Action Classification)がおもしろそう。
  • Style Transferはいまさら感(Turi Createにはだいぶ前からあったのになぜ今になって?)
  • Soundカテゴリに追加がなかったのが本当に残念
  • MotionカテゴリにActivity Classificationに加えてAction Classificationも追加。これもApple Watchで試したい

Metal Performance Shaders

機械学習系のAPIはML Computeも出たし個人的にはこのレイヤーで組むことはしばらくなさそうなのでフィルタ系だけを見ていく。

MPSImageEuclideanDistanceTransform

A filter that performs a Euclidean distance transform on an image.

"Euclidean distance transform (EDT)"なる変換を適用するフィルタ。知らないのでググってみたところ、以下の記事がヒット。大変にわかりやすい。

medium.com

応用例も書かれていて、セマンティックセグメンテーションの誤差のメトリクスとして使われることがあるらしい。またErosion / Dilationを計算する手法としても利用されるらしい。ちなみにErosion / Dilationはそれぞれ孤立点の除去、不連続な点の接続と穴埋めのために利用される。

ちなみにここまで書いて気付いたが、このAPIはiOS 11.3からあるもので、新APIは

var searchLimitRadius: Float

というプロパティでした。これはEDTの計算手法を知っていれば名前で利用法がわかる。

MPSImageCanny

今度こそiOS 14の新クラス。ドキュメントには何も書いてないが、名前からいってCanny法によるエッジ検出を行うフィルタだと思われる。

f:id:shu223:20200623172504p:plainWikipediaより)

MPSImageEDLines

iOS 14の新クラス。MPSKernelを継承。ドキュメントに説明なし。

Natural Language

NLTaggerクラスに新しいメソッドが2つ

@nonobjc func tagHypotheses(at index: String.Index, unit: NLTokenUnit, scheme: NLTagScheme, maximumCount: Int) -> ([String : Double], Range<String.Index>)

Finds multiple possible tags for a given linguistic unit, for a single scheme, at the specified character position.(指定された文字位置で、指定された言語単位について、単一のスキームについて、複数の可能性のあるタグを見つけます。)

func tokenRange(for: Range<String.Index>, unit: NLTokenUnit) -> Range<String.Index>

Finds the entire range of all tokens of the specified linguistic unit contained completely or partially within the specified range.(指定された範囲内に完全または部分的に含まれる、指定された言語単位のすべてのトークンの範囲全体を検索します。)

NLEmbeddingクラスに4つの新クラスメソッド

class func sentenceEmbedding(for: NLLanguage) -> NLEmbedding?

Retrieves a sentence embedding for a given language.(指定された言語の文の埋め込みを取得します。)

class func sentenceEmbedding(for: NLLanguage, revision: Int) -> NLEmbedding?

Retrieves a sentence embedding for a given language and revision.(与えられた言語とリビジョンのための文の埋め込みを取得します。)

class func currentSentenceEmbeddingRevision(for: NLLanguage) -> Int

Retrieves the current version of a sentence embedding for the given language.

class func supportedSentenceEmbeddingRevisions(for: NLLanguage) -> IndexSet

Retrieves all version numbers of a sentence embedding for the given language.

NLModelクラスに2つのメソッド

func predictedLabelHypotheses(for: String, maximumCount: Int) -> [String : Double]

Predicts multiple possible labels for the given input string.(与えられた入力文字列に対して,複数の可能性のあるラベルを予測します.)

func predictedLabelHypotheses(forTokens: [String], maximumCount: Int) -> [[String : Double]]

Predicts multiple possible labels for each string in the given array.(与えられた配列内の各文字列に対して,複数の可能性のあるラベルを予測します.)

・・・試してみないとピンとこないので、試してみます。あとこのフレームワークはiOS 12の頃に試して以来な気がしていて、当時は日本語をサポートしている機能は一部だけだった気がします。今一度日本語のサポート状況をみてみたいなと。

Final Cut Pro X

期待していたが更新がなかったフレームワーク

事前に予想、というより期待することを書いていたのですが、見事に外れたものから書いていきます。

note.com

AVAudioEngine

SoundAnalysis

Speech

標準の翻訳アプリが入ったことで、音声認識フレームワークであるSpeechフレームワークも強化されているかと期待しましたが、あてが外れました...

Speechの音声認識、デモとして試すとそこそこうまくいく気がするのですが、いざ実運用しようとすると全然ダメなんですよね。しかし音声認識は汎用性が高いのでどうにかしてほしいなぁと。実はAPIが更新されてないだけで内部的には刷新されているのではとまだ期待しています。

公式配布の学習済みCore MLモデル

昨年はWWDCの会期中に新しいモデルが複数個追加されてテンションあがったのですが、今年は何もなし。

しかしちょっと前にPoseNetモデルが追加されています。

まとめ

本記事では既存フレームワークのうち、ML・画像・音声に関連する気になるAPIをピックアップしました。次はこれら以外の既存フレームワークの更新を見ていきます。

そしてそのあとは、サンプルやセッションを見てもっと具体的に実装方法や何ができて何ができないのかといったところを探っていきます。

昨年はそれらの知見を書籍にまとめましたが、今年はnoteの有料マガジンにまとめていきたいと思います。

note.com

まだ記事がないので今ならたったの500円です。サブスクではなく買い切り価格です。記事が充実してきたら価格改定していきたい所存です。

API Diffsから見るiOS 14の新機能 - 新フレームワーク編 #WWDC20 #iOS14

本日からはじまったWWDC 2020、まだ基調講演しか見てないのですが(SOTUも後で見ます)、ドキュメントは公開されたので、明日から始まるセッションでどのあたりをチェックするか当たりをつけるべく、例年通りAPIの差分を見て気になった新APIをピックアップしていきます。

f:id:shu223:20200623092201p:plain

まずは新フレームワークから。今年の新規追加フレームワーク1は21個。

ML Compute

ニューラルネットワークの学習とバリデーションを行うためのフレームワーク、とのこと。

Accelerate training and validation of neural networks using the CPU and GPUs.

macOS用かな?と思いきやiOSでも利用可

ML Compute utilizes the high performance BNNS primitives made available by the Accelerate framework for the CPU and Metal Performance Shaders for the GPU.

『ML Computeは、CPU用のAccelerateフレームワークとGPU用のMetal Performance Shadersによって利用可能になったハイパフォーマンスなBNNS primitivesを利用しています。』

とのことでこれらのラッパー的な位置づけっぽい。Core MLもBNNSとMPSをラップしており、iOS 13ではモデルの更新も可能になったが、あくまで学習済みモデルを更新するもの。こちらはレイヤークラス群も定義されてるので、PyTorchやTensorFlowみたいにネットワークを実装してiOSやmacOSのGPU/CPUを駆使して学習をまわせる、というものかと。

ちなみにMLCDeviceというクラスがあったのでもしやと思い見てみたが、Neural Engineを指定できるようにはなっていなかった。

https://developer.apple.com/documentation/mlcompute/mlcdevice?changes=latest_major

Metal Performance Shaders Graph

TensorFlowのように多次元テンソルのグラフを構築し、コンパイル、実行するフレームワークらしい。

Build, compile, and execute customized multidimensional compute graphs for linear algebra, machine learning, computer vision, and other similar domains.

f:id:shu223:20200623085100p:plain:w500

(画像は"Build customized ML models with the Metal Performance Shaders Graph"セッションのサムネ)

以前からあったMPSCNNとはどういう関係になるのか、またML Computeを使う場合はこのレイヤー(MPSフレームワーク)を気にする必要はないのか、それともここまで潜る必要があるのか、といったあたりをセッションでチェックする。

ちなみにサンプルコードもある。

Nearby Interaction

名前と一行説明からして、バックグラウンドでのすれ違い通信系(待望)かなと第一印象では思ったが、

Locate and interact with nearby devices using distance, direction, and identifier.

距離、方向、識別子を使用して、近くのデバイスの位置を特定し、対話することができます。(by DeepL)

リファレンスページみたら懐かしのBumpみたいなイラストが載っていて、

f:id:shu223:20200623085821p:plain:w500

なんだ?と思ってOverviewを読んでみると、

Use NearbyInteraction (NI) in your app to acquire the position of nearby iPhones with a U1 chip, such as iPhone 11 or later. To participate in an interaction, devices in physical proximity run an app and consent to share their position and device tokens that uniquely identify their device. When the app runs in the foreground, NI notifies the interaction session of the peer’s location by reporting the peer’s direction and distance in meters.

アプリでNearbyInteraction(NI)を使用して、iPhone 11以降などのU1チップを搭載した近くのiPhoneの位置を取得します。インタラクションに参加するには、物理的に近くにいるデバイスがアプリを起動し、位置情報とデバイスを一意に識別するデバイストークンを共有することに同意します。アプリがフォアグラウンドで実行されると、NIは、相手の方向と距離をメートル単位で報告することで、相手の位置をインタラクションセッションに通知します。

Devices that share their positions using the high frequency of the U1 chip enable a fluid, interactive session in which peer positioning within the physical environment becomes a primary driver of the user experience. For example:

U1チップの高周波数を使用して位置を共有するデバイスは、物理環境内でのピアの位置がユーザ体験の主要なドライバーとなる流動的なインタラクティブセッションを可能にします。例えば、以下のようなものです。(Translated by DeepL)

なんと、U1チップ使うやつだった!これはぜひ試したい。

ちなみにサンプルもある: "Implementing Interactions Between Users in Close Proximity"

SensorKit

ありそうでなかった、その名も「センサーキット」。

Retrieve data and derived metrics from an iPhone’s sensors, or from a paired Apple Watch.

これまで加速度センサーやジャイロetc.のセンサー類を扱う存在だったCore Motionはdeprecatedになるのかなと思ったがまだ現役だった。こちらのフレームワークではペアリングしてるApple Watchのセンサー値も取れるのが違いか。

扱えるセンサー一覧:

static let accelerometer: SRSensor
static let ambientLightSensor: SRSensor
static let gyroscope: SRSensor
static let onWristState: SRSensor
static let pedometerData: SRSensor
static let visits: SRSensor

App Clips

iOS 14の目玉新機能のひとつであるApp Clips、これは新しいUI/UXだけに何がどこまで実現できるのかを把握するためにも要チェック。

Create an app clip to make some of your app’s functionality available to users who don’t have the full app installed.

f:id:shu223:20200623091704p:plain:w450

WidgetKit

同じくiOS 14の目玉新機能のひとつであるウィジェット。これも専用フレームワークが新規で追加されたとなると当然要チェック。

Show relevant, glanceable content from your app on the iOS Home screen or macOS Notification Center.

f:id:shu223:20200623092105p:plain:w450

StoreKit Test

Create and automate tests in Xcode for your app’s subscription and in-app purchase transactions.(アプリのサブスクリプションとアプリ内購入トランザクションのためのテストをXcodeで作成し、自動化します。 by DeepL)

個人的にはここ最近はアプリ内課金の実装をする機会がないのだけど、これはかなり助かるやつでは...!

System

大層な名前に惹かれたが、中身を見てみたらちょっと期待したものと違った。

Perform low-level file operations using type-safe APIs.

Cの低レベルなファイル操作をSwiftでタイプセーフに書ける、というものらしい。

close ⟶ close()

lseek ⟶ seek(offset:from:)

open ⟶ open(_:_:options:permissions:)

pread ⟶ read(fromAbsoluteOffset:into:retryOnInterrupt:)

pwrite ⟶ write(toAbsoluteOffset:_:retryOnInterrupt:)

read ⟶ read(into:retryOnInterrupt:)

write ⟶ write(_:retryOnInterrupt:)

その他の新フレームワーク

(翻訳はby DeepL)

  • Accessibility
    • Make your apps accessible to everyone who uses Apple devices.(Appleデバイスを使用しているすべての人がアプリにアクセスできるようにしましょう。)
  • App Tracking Transparency
    • Request user authorization to access app-related data for tracking the user or the device.(ユーザーやデバイスを追跡するために、アプリ関連のデータにアクセスするためのユーザー権限を要求します。)
  • Apple Archive
    • Perform multithreaded lossless compression of directories, files, and data.(ディレクトリ、ファイル、データをマルチスレッドでロスレス圧縮します。)
  • Automatic Assessment Configuration
    • Prevent users from accessing specific system features during high-stakes assessment activities, such as administering an exam.(試験の実施など、高額な評価活動中にユーザーが特定のシステム機能にアクセスできないようにします。)
  • Developer Tools Support
    • Expose custom views and modifiers in the Xcode library.(Xcodeライブラリでカスタムビューとモディファイアを公開します。)
  • Exposure Notification
    • Implement a COVID-19 exposure notification system that protects user privacy.(利用者のプライバシーを保護するCOVID-19曝露通知システムを導入する。)
  • Kernel Management
    • Manage the loading and unloading of system extensions in the kernel.(カーネル内のシステム拡張のロードとアンロードを管理します。)
  • Media Setup
    • Enable configuration and account management of media services for use on HomePod.(HomePodで使用するメディアサービスの設定とアカウント管理を有効にします。)
  • Paravirtualized Graphics
    • Add limited graphics acceleration to your guest driver stack.(ゲストドライバスタックに限定されたグラフィックスアクセラレーションを追加します。)
  • Screen Time
    • Share and manage web-usage data and observe changes made by a parent or guardian.(ウェブ利用データを共有・管理し、保護者の変更点を観察することができます。)
  • Uniform Type Identifiers
    • Unified type information for files and data transfer.(ファイルやデータ転送のための統一された型情報。)
  • Wallet Passes
    • Create, distribute, and update passes for the Wallet app.(ウォレットアプリのパスを作成、配布、更新します。)
  • xcselect
    • A function that finds the path to a macOS SDK version on disk.(ディスク上の macOS SDK バージョンのパスを検索する関数です。)

まとめ

APIリファレンスの差分から見て気になる新APIをピックアップするシリーズ、新フレームワーク編でした。次は既存フレームワークの更新を見ていきます。

そしてそのあとは、サンプルやセッションを見てもっと具体的に実装方法や何ができて何ができないのかといったところを探っていきます。

昨年はそれらの知見を書籍にまとめましたが、今年はnoteの有料マガジンにまとめていきたいと思います。

note.com

まだ記事がないので今ならたったの500円です。サブスクではなく買い切り価格です。記事が充実してきたら価格改定していきたい所存です。


  1. https://developer.apple.com/documentation/technologies?changes=latest_majorのリストに載っている単位をここでは便宜的に「フレームワーク」と呼んでいますが、厳密にはフレームワークではないのも混じっています。

月額500円のオンラインサロンを始めました

今月の中旬頃、オンラインサロンを始めました。

f:id:shu223:20200525110314p:plain

エンジニアと人生コミュニティ - CAMPFIRE (キャンプファイヤー)

5/13に募集開始し、翌日には100名の募集枠が埋まりました。今は定員いっぱいで新規で入っていただくことはできない状態ですが、自分にとって非常に新鮮な試みなので、初心を忘れないうちにそのコンセプトやねらいについて書いておこうと思います。

オンラインサロン=胡散臭い?

という認識を持っている方も結構多いのではないでしょうか。

  • 基本的にサブスク課金
  • 原価のかかるものを売るわけでもない
  • サロン主の拘束時間が明確に決まっているわけでもない

といったところから「労力をかけずにチャリンチャリンなビジネスモデル」を期待してオンラインサロンを始めてしまうインフルエンサーも多い1ため、こういうイメージが蔓延している2のかもしれません。

では弊サロンはどうかというと、掲げているサロンの「売り」が、

フリーランスiOSエンジニア堤修一と語り合うサロンです。Zoomミーティングでキャリア相談、フリーランス関連相談、技術的な相談etc.ができます。

と、基本的に「堤に相談できます」だけなので、あまりスケールしません。相談者の数に比例してかけるべき時間も増えるので、チャリンチャリンビジネスどころか本質的には時給モデルと変わりません。3

始めた動機

ではなぜ始めたのか?何が狙いなのか?

一番目の理由は、「そもそも僕が相談されたい」からです。

この動画でも言ってるように、そもそも僕は「自分の考えをもっと話したい」「でも誰からも聞かれてもないのにペラペラ語り始めるのは恥ずかしい」という(めんどくさい)ジレンマをかかえています。

youtu.be

なので、自分のポッドキャスト/Voicyでゲストが100個も質問を考えてきてくれたときは嬉々として回答したりもしました。

voicy.jp

そういうのもあって、昔々に「タイムチケット」というサービスで30分500円で相談にのっていたことがあり、 僕自身も楽しかったし、わりと好評だったのですが、

www.timeticket.jp

しかし仕事をふくむ自分のすべての活動は時間を原資とするため、さすがに500円では長くは続けられませんでした。(時間を仕事以外の何かに投入することは自分の時給を自分で払うことに等しい)

note.com

そんなわけで、

  • 「相談を受ける」という自分自身も楽しいことをやって、
  • しかもタイムチケット時代よりは収益になる!

というのが本サロンをやる一番の動機です。

始めたきっかけ

話が前後しますが、「相談を受けるだけ」というコンセプトを思いつく以前、KBOY氏のFlutter無料講座 + オンラインサロンサポートのモデルに深く感銘を受け、自分でも入ってみたりしつつも、自分がオンラインサロンをやるイメージはまったくありませんでした。

  • Flutterのように需要のある技術を教えられるわけではない
  • 自分の得意領域であれ、そもそも初学者向けに噛み砕いて技術を教えることには興味がない4
  • コミュニティやSNSコミュニケーションも苦手な自分が「価値のあるコミュニティ構築・運営」なんてできるわけがない

そんなこんなで、1000円や3000円を自分に払ってもらうモデルはまったく見えないなと。5

しかしふと閃いたのが、

「100円だったらどうだろう?」

というアイデアです。

  • タイムチケットで30分500円でやっていたことなので、×100人で1万円ももらえるなら御の字
  • コロナ禍でオンラインミーティングが世の中的に当たり前になっている
  • オンラインミーティングはアーカイブをメンバー限定コンテンツとして後からも見れるようにすることで、リアルタイム参加できなかった人からも不満が出にくい(KBOY氏のサロンに参加しての気付き)
  • しかもアーカイブはコンテンツの蓄積にもなる
  • 可処分時間の不足をずっと感じている中で、子供が寝て奥さんとゆっくり話した後の22時ぐらいからの時間をイマイチ有効活用できていない
  • 技術顧問業は独占的・クローズドに相談にのる⇔サロンでの相談はパブリック/顧問業の相談は即レス⇔サロンでのレスポンスは隔週、といった点で、相談業としてのコンフリクトはしないはず
  • etc...

いろんなピースがカチッとハマった感じがしたのです。あれ、これいいんじゃない?と。

思いついてすぐにTwitterアンケートを取りはじめてみたのが5/12、

(「入らない」が圧倒的1位なのはご愛嬌

当日のうちに500円 or moreの合計が120名を超えたので、需要は確認できたのでやるしかない

→ 鉄は熱いうちに打て、というわけでアンケート翌日の午前中にCAMPFIREコミュニティでサロンをつくって申請

→ 即日審査通過して募集開始

という経緯でほとんど一夜にして一気に事が進んだのでした。

なぜ500円なのか

「なぜ500円なのですか?安すぎませんか?」と聞かれることもあるのですが、 上述したようにそもそも自分が1000円とかで人を集められるイメージがなく、

「100円ならいけるのでは?」

からスタートして、アンケートの結果「500円でもいけそう」となった、という経緯があります。

自分の開発時給がいくらであれ、「現時点での自分のサロンの価格」としては妥当かなと。

(追記)その他のモチベーション

「コンバージョン先」が欲しい

YouTubeチャンネルを持っていて、今のところ購読者数は約700、各動画の再生数は300〜1kぐらいなのですが、 基本的にエンジニア向け、しかもわりとシニア向け(初学者に刺さる内容はほとんどない)であることから、 超人気チャンネルになって再生数がものすごく伸びて広告収入で稼げる、みたいなことはないと思うわけです。

それはそれで、何らかの自分の別のプロダクトにコンバージョンさせればいいわけですが、

  • フリーランス案件をいただいても時間がないし、
  • 本はニッチすぎるので宣伝してもなぁという気がするし

...というわけでコンバージョン先が存在しない、という状態でした。

「エンジニアと人生チャンネル」を見て、僕の考え方や経験に興味を持ってくれた人が「エンジニアと人生サロン」に入ってくれる、というのはなかなか良いコンバージョンなのでは、と。

弊YouTubeチャンネルは趣味/ライフワークとしての一面もありましたが、これでビジネスとしての役割も得たので、時間を投入しやすくなります。

第1回Zoomミーティング

すぐに定員がいっぱいになったので、早速その週末に第1回のZoomミーティングを行いました。以下の相談に回答しました。

  • 相談1

転職である程度ネームバリューがある会社(某M社)に入る際に、iOSだとこれくらいのスキルがあったら良い、こんなアプリが作れるくらいならいい!というような目安やスキルセットが知りたいと思っております。 今は、swiftに加えてfirebaseをメインに開発、勉強進めています。今年からエンジニアとして活動を始めたのでフォーカスする分野なども探っている段階です 転職に関してアドバイス宜しくお願い致します。

  • 相談2

今、カメラと自作AIを使ったアプリのプロトタイプを作ろうとしているのですが、もともと僕pythonのスクリプトでしかプログラムを組んだことがなく、swift、iOS SDK、Xcodeの使い方もよくわかっていないのが現実です。 AIの動作確認だけできればいいため、そこまで難易度高い本はいらんとは思っていたのですが、Xcodeがしょっちゅう更新されるため、どの本読めばいいかわかっていません。 もし、日本語でアプリ開発についておすすめの本ありましたら、おしえていただけると助かります。

  • 相談3

今、linkedin経由でgithubに上げたスクリプトをパーソナライズしてほしいで言われているので、フリーで仕事を受ける場合のtodoとnot todoついて伺いたいです。 フリーでやっていらっしゃる方も結構いらっしゃるようなので、他の方の意見も併せて伺えれば、嬉しいです。

  • 相談4

現在バックエンドエンドエンジニアをしていて、pythonでMLを学習しようと思っています。 クライアント側と少し考え方は異なるかもしれませんが、堤さんがMLの基礎学習に用いた教材やドキュメント等があれば教えていただきたいです。

  • 相談5

最初に海外で働いたときの始まり方と戻ってきてからの海外案件の仕事のとり方についてお聞きしたいです!

  • 相談6

フリーランスに興味がある会社員エンジニアがフリーランスになる良いタイミングについて、皆さんに聞いてみたいです

毎回のZoomミーティングは録画され、相談別に分けられてアーカイブされます。メンバーになるとアーカイブにもアクセスできます。

今後の改善点

本サロンの良くもあり悪くもあるかもしれない特徴が、

  • MetalやCore MLといった技術の話をしたい人たち(→技術面に興味)
  • iOSエンジニアをこれから目指す人たち(→遅咲きエンジニア面に興味?)
  • iOSとは違う分野のエンジニアの人たち(→働き方や考え方に共感)
  • 海外で働いている/働きたい人たち
  • フリーランスとしての働き方に興味がある人たち

と、技術レベルも興味のある点もバラバラ、というあたりです。上の相談リストを眺めてもその傾向はわかっていただけるかと思います。

僕としてはミーティングは途中入退室自由だし、オンラインなので作業しながら聞いててもいいわけだし、アーカイブもされるので、興味のないトピックがあれば聞き流すなり別の作業をするなりしてくれればいいかなーと軽く考えていたのですが、 匿名アンケートをとってみたところ思った以上にこのあたりの不満も散見されたため、次のように改善することにしました。

「専門的すぎる技術の話」問題へのソリューションとして、次回は次のようにしてみます:

  • 「技術の話」とその他の「一般的な話」とをそれぞれ固める(相談1〜3は一般的な話、4〜6は技術の話、みたいに)
  • 技術の話は長くなりそうであれば(何分までとかより話の深さで判断したい)いったん止めて一通りの議題がおわってから続きをやる

あと、僕に相談したいことが具体的にあって入ってきてくれた方は、相談してしまうともうサロンに入り続ける意義がなくなってしまうかもしれません。 また最初は僕の意見を新鮮に感じてくれている人も、だんだんワンパターンに思えてくるかもしれません。(根っこが同じ問題は答えも同じになってしまう)

そんなわけで、本サロンのLTV(Life Time Value)は結構低い気がしてます。まだ1ヶ月目なのでわかりませんが。

とくに後者の問題は「僕自身が同じ回答ばかりする自分に耐えられなくなる」という状況が容易に想像できるため、ゲストを呼んだり、調べつつメモを書いてそれをブログ記事にする実演だったり、案件依頼とそのコミュニケーションについてパネルディスカッションしたり6といったこともやりたいなぁと。

まとめ

オンラインサロンを開設したねらいについて書きました。 もし興味を持ってくれた方がいたら、 以下のページで「お気に入り」に登録しておいていただくと、退会者が出て枠が空いたたときに通知がくると思います。(今のところ2人の方が退会されています)

community.camp-fire.jp

引き続き「エンジニアと人生サロン」(仮)をお願いいたします。


  1. 要出典

  2. 要出典

  3. 実際のところ弊サロンにはそれぞれ自身のチャンネルで有名だったり凄腕フリーランスだったりする人もいて、そういった方々がSlackで質問に回答してくれたりとか、わりとニッチな技術者同士の分科会ができたりとか、頻繁にもくもく会が開催されてたりとかのコミュニティ的なところも良かったりするのですが、それらは「たまたま」の産物であって、僕があらかじめサロンの設計として組み込んだものではないので、オフィシャルには「うちのサロンはこういうところがいいよ」とは掲げていません。

  4. 自分の勉強をアウトプットドリブンで進めるのはよくやります。本とかはその産物。

  5. (2020.9.10追記)2回目の募集からは1000円になりました。今後も価格は変わる可能性があります。

  6. 100名のうち実に18名が現役フリーランス

ドラッグ&ドロップでCore MLモデルを試せる「MLModelCamera」で物体検出モデルをサポートしました

Create MLによって画像分類モデル(Image Classifier)をドラッグ&ドロップでつくれるようになったので、

shu223.hatenablog.com

そのモデル(.mlmodel)をドラッグ&ドロップするだけでリアルタイム画像認識アプリとして試せるOSSをつくりました(2年前に)。

github.com

で、最近1、Create MLが物体検出2モデル(Object Detector)の学習もサポートしたので、

f:id:shu223:20200411151704p:plain

拙作MLModelCameraでも物体検出モデルをサポートしました。

Create MLで学習させた物体検出モデルやAppleが配布しているYOLOv3、coremltools公式リポジトリに変換サンプルのあるSSDといった物体検出モデルをmodelsフォルダ配下に置いてビルドするだけで試せます。

f:id:shu223:20200411151837p:plain:w300

バウンディングボックスの可視化の実装はサイズの換算とか地味に面倒だし既存実装を探すのも面倒、ということでmlmodelを自作する際には非常に便利かと思います。(自分でよく使っています。)


  1. WWDC 2019で発表

  2. Appleのモデル配布ページの日本語では「オブジェクト検出」と訳してたが、ディープラーニングの分野ではこっちの方が一般的だと思われる。