元茹でガエルなエンジニアの記録

ちょっとやってみたことや考えたことなどを不定期に書き残していきます

AirTagを使ってみた

Appleから発売されたAirTagを購入したので少し使ってみて分かったことなどを書こうと思います。 AirTag - Apple(日本)

期待していたこと

広い公園やショッピングモールなどで、子どもと離れたときに見つけ出したいという課題の解決。子ども二人連れていると、どうしても離れてしまうことがあり心配だったので。

先に結論

ダメでした。期待していた、公園などで子どもを探し出すという使い方にはマッチしなかった。 もともと、"モノ"を探すことをコンセプトにしており、他の用途には向いていないことが、実際に使ってみて分かった。

使ってみて

AirTagsは、BLEだけでなくUWBという通信を使うことで、高精度の測位機能を実現しているらしい。 このことを知って以来、公園や屋内で、子どもとはぐれたときの活用を想定していた。

しかし、実際に子どもに持たせて、屋内遊戯施設で使ってみたところ、AirTagsを頼りに子どもを見つけ出すことは難しいと感じた。 なぜなら、期待していたUWBによる測位機能は、対象物が静止していることを前提に最適化されているようで、動いている子どもの位置はほぼ検出できなかった。 移動しているから、位置が特定できないというメッセージが表示される。

f:id:jiig999:20210723184838j:plain

誤解して欲しくないですが、これはAirTagsが使い物にならないというわけではない。 本来の使い方と違う使い方をしてみた結果なだけである。

あと、Find Myによる世界中のiPhoneメッシュを利用した位置検出を試してみたくて、車の中にひとつ置きっぱなしにしてみた。

やってみたところ、妻が運転しているときなど、クルマがだいたいどのあたりにいるかを知ることが出来る。 リアルタイム制は期待できないが、わりと使えそう。ただし、相手のスマホに『近くにあなたのモノではないAirTagsがありますよ』的なメッセージが表示されるので注意。これはストーキングなど悪意あるユーザーが他人の荷物にAirTagsしのばせて位置トラッキングすることを防止するための配慮だと思われます。

使ってみて、自分はあまり忘れ物や落とし物を しないので活用シーンが無いことに気づかされました。 紛失したときの保険としてはいいのだろうが、紛失しない間は価値がゼロというのが地味にコレ系のスマートタグ共通の弱点かも知れない。

新事業アイデアの考え方

新事業や新しいサービス・プロダクトのアイデアの考え方を考えてみた。

文脈は企業内の新規事業企画。 企業内で新事業やサービスなんかのアイデアを考えるときって、売れるならどんなアイデアでもいいよ、という事は稀で、 実際には様々な制約があり、それにマッチするアイデアである必要があることがほとんど。
であれば、まずは発散!とか、デザイン思考でしょ!みたいに同じアプローチで挑んでも、狙った制約範囲に着地できる確率は低く、非効率である。
そうなりたくないので、制約ごとにいくつかのやり方パターンに分けられるのではないかと思い、整理してみた。

1. モノをベースにするやり方

1-a. モノを外したくないケース

例)冷蔵庫を使って何かやりたい。冷蔵庫に新しい機能や関連サービスを追加したいというケース。

冷蔵庫とは何か、を徹底的に考え、既存の枠(フレーム)を作る。そしてその枠を壊すやり方。
「冷蔵庫×〇〇」とか、「もし冷蔵庫が〇〇だったら」とかで発散して光るものを探す。

1-b. モノを外しても良いケース

例)冷蔵庫の周辺で新しいアイデア無いか?冷蔵庫自体は必須ではない

冷蔵庫を使うとき、その周辺を含めてユーザー体験を描く。 観察(エスノグラフィー)から入ってもよいし、自分で想像できるなら、ペルソナ設定してカスタマージャーニーマップを描くところから入っても良い。 いずれにせよ、冷蔵庫にまつわる体験において、PainとGainを洗い出して考えていくアプローチをとる。

2. 課題から入るやり方

2-a. 解決したい課題が決まっているとき(狭い)

ある意味ベーシックなスタートアップのやり方が適用できる。課題の存在確認とソリューションを提供可能(パートナー協業含め)かは気をつける必要がある。 最初に課題フォーカスしている分、それが外しているかも?というときに冷静になってピボットする割り切りを持てるかどうかがキモになる気がする。

2-b. 対象領域だけが決まっているとき(広い)

定性インタビューや観察から、課題仮説を立てるところから始める。立てた仮説はちゃんと検証してC/P fitしているか確認を忘れない。あとは2-aと大差ないかも。せまい課題に固執していない分、ピボットに対する受容度も高いはずなので、いかに早く安く仮説検証を回すか、その能力者(体制)を組めるか、がポイントになりそう。

なんかいずれにせよ、抽象度の上げ下げを意識的に行い、本質課題に迫ること(およびその手段は柔軟に考える)、あくまで仮説であり、検証を小さく早く回すことが大事ということ、が重要ということに尽きる気がしている。

会計に関する用語の整理

会計に関する用語を何回も調べているので、ここらでメモ代わりに整理しておくことにします。

限界利益

売上高から変動費をひいた部分。 限界利益 = 売上高 - 変動費

「限界」ということばは、「ギリギリ」という意味ではなく、「一単位増えるごとに」という意味合いなので注意。 「貢献利益」ということもある。

粗利(売上総利益

売上高から売上原価をひいた部分。
限界利益と似ているが、限界利益変動費のみをひいたもの。粗利は、変動費と固定費を一部含めた売上原価をひいたもの。 具体的には、製造に関わる人件費などがひかれる。

営業利益

限界利益から固定費をひいたもの。本業の利益ともいう。

営業利益 = 売上高 - (売上原価 + 販管費) 営業利益 = 限界利益 - 固定費

限界利益が無い状態では、いくら効率化をはかっても儲からないと言える。

(新規事業では、限界利益が出るところまで事業のあらゆる側面でチューニングする必要があるということ)

限界費用

生産量が一単位増えたときに増加する費用。ひとつあたりの変動費と捉えるとよい。 ソフトウェアのライセンスビジネスの場合、限界費用がほぼゼロになる。

P/Lを5つの箱で見る

https://news.yahoo.co.jp/byline/kandatoshiaki/20201130-00210279/ こちらのサイト。

P/LはProfit and Loss statementの略で、損益計算書のこと。 B/SはBalance Sheetで貸借対照表のこと

P/Lはある一定期間の間に得られた売上から、かかった費用をひいた差をもとに、損益を計算する表。 期間の概念を持っている。(2020年度のP/Lなど)

BSは、ある時点で持っている財産の状態を、資産・負債およびその差額である純資産に分けて表した表。 期間の概念はなく、ある特定時点でのスナップショットである。

参考) - PLとBSの関係を図でイメージする

経常利益

営業利益が本業の利益を表すのに対し、本業以外の収益・損失を含めたものが経常利益。

経常利益 = 営業利益 + 営業外収益 - 営業外費用

ROE

自己資本比率。自己資産を使ってどれだけ利益を生んでいるか。 ROE(%)=当期純利益÷純資産(総資産-負債)×100

ROA

総資産利益率。総資産を使って利益を生む効率を表す。経営の効率の良さを表す。 5%を超えると優良企業といわれている。 ROA(%)=当期純利益÷総資産×100

売上高利益率×資産回転率と分解することも出来る。

ソフト開発を内製化した方が良いか考察

はじめに

ソフトウェアを本気でビジネスで活用しようと思うなら、ソフトウェア開発を内製化したほうが良いという仮説について考えてみた。
とくにアジャイル開発が主流になってくるであろうDX文脈において、開発を外部発注することの構造上の歪みを感じていたので、自分の思考を整理するために、まとまってはいないが書き連ねてみることにする。

アジャイル開発と内製化

日本ではソフト開発専門の会社に発注する(ようはアウトソース)ケースが多く、受託開発自体を本業とするSIerやSEという業種・職種が多く誕生してきた。欧米では違うらしいが。

自分たちが必要とするものが何か完全に見通せていれば、それで仕様化して発注してあとは待つだけ、というやり方でできるのだが、そんなことは滅多にない、ということが分かってきた。 使ってみて、フィードバックを得て、それをまた取り込んで、というやり方のほうが、本当に価値あるものを作り上げて手に入れることができる。これがアジャイル開発を導入する目的でもある。

では、ソフト開発会社に委託しつつも、アジャイルでやってもらえばいい、という考えもある。 それも一理あるし、実際にそのスキームでITシステム開発を行っている事業会社も日本には多い。

ここで、事業側(委託側)と開発会社(受託側)それぞれビジネスモデルについて考えてみる。

  • 事業側は、開発したシステムを使って何らかの売上をあげる。売上-開発費用=利益となる(超ざっくりですが)。同じモノなら、安く作れば作るほど利益を増大することができる。

  • 開発会社は、開発費用をもらって開発する。開発にかかる費用を差っ引いた残りが利益となる。

事業側も開発会社側も、それぞれ自社のビジネスをやっているわけなので、売上拡大や利益増加が重要な経営指標となっているはずである。 開発会社はたくさん仕事を受注し、それを少ない工数で完了させればさせるほど、利益率が大きくなる。 したがって、請負開発において同じ金額の開発を比較した場合、技術力向上やツール導入によって効率化をはかり生産性を向上させることで、自社の利益を大きくすることが出来る。つまり、生産性向上が利益に直結するわけである。(=生産性向上に対するインセンティブが働く

一方、アジャイル開発では、準委任契約となることが多い。 準委任契約のとき多くの企業では、アジャイルチームの人数×人月単価で契約をすることになる。そうすると、技術力やツール導入で効率化をしようがしまいが、利益率は一定である。 つまり、実績工数ベースの準委任契約では生産性向上が開発会社にとって自社の利益に直接は結びつかなくなるのである。(=生産性向上に対するインセンティブが働かない

長期的な目線で、事業側の予算内で多くの成果を上げ続けることで、事業の存続確率(継続性)とソフト発注にかけることのできる予算が確保できるという考え方もできるが、そこまで考えて活動できる受託開発会社は少ないのではないか。
目先の売上と利益確保が最優先で、細くとも長く継続することでLTVを最大化するといった、サブスクにあるような継続率を追いかける考え方は難しい。

また、受託開発で売上を伸ばし利益額を増大していこうとすると、エンジニアの頭数がボトルネックになってくるため、プロパー社員だけではスケールに限界がある。 したがって、協力会社への再委託や派遣社員といった形でプロパー社員ひとりあたりの抱える人数を増やすことでしか売上をスケールさせることができない。 結果として、実装に関与せずに比率としてメンバーの管理業務が多めの社員が増えていく。

継続的に開発し、ノウハウが蓄積されるようなソフトウェアの開発は、内製化したほうが良い。正しく内製化してこそ、ノウハウ獲得や自動化による生産性向上を自社の利益に還元できる。 (すでに業界や技術が枯れていて、どこがやっても生産性はある程度突き詰められているようなものは外部に発注してもよい)

新技術やツールの導入が、業績につながるような事業構造になっていないと、新しい技術の獲得がむくわれない。
もしくは上層部の理解が得られず、こっそりやるしかない。手を打つのが遅れる(そういう発注が来るまでやらないから)

わかりやすい例が、テスト自動化である。 受託開発会社にとっては、テスト自動化が自分たちのビジネスの利益につながらない。(競合についていくため/競合差別化という点では意味があるが)
力をかけてやる意味が薄い(毎回テスト工数をもらう方が売上稼げる)し、持ち出しで技術的負債を解消する意義はない。発注があれば対応する、という動き方になる。

事業会社とアジャイルチームを組んで人を完全に組み込んだ形の入り方は、開発会社からすると、メリットが薄い。高レートで長期的に体勢確保してもらえるならいいが、スケールはしない。 ソフト開発とソフトファーストや事業を切り離すことに無理がある。

つまり、目指しているゴールがそもそも違う2社でやっていく限りしょうがないということになる。

  • 事業会社は、事業による売上と利益を追求する
  • ソフト開発会社は、ソフトウェア開発それ自体で儲ける

そこで、内製化もしくは子会社戦略が必要になる。このとき、何も考えずに子会社を売上と利益をあげることを目標にして経営すると、外部の開発会社を使っているのと同じ事が起こるので注意が必要。 そうではなく、親会社のゴール達成の一部を切り出したミッションを開発子会社に与えるべきである。そうすると、ソフト開発の売上や利益よりも重要な指標があるはずである。 外部の会社にそんなことをお願いするのは無理だが、子会社に対してなら経営目標や方針にまで関与できるはず。アジャイル開発の時代に開発子会社をつくる意義はそこにあるのではないだろうか。

自由競争させるか、開発効率化するメリットが開発会社サイドにないと、新しいことに先行的に取り組んでいくモチベーションがうまれにくい。

結論

  • アジャイル開発が適しているようなものは、内製化がベスト
  • 内製化がリソース的に難しいなどであれば、開発子会社(OR関係会社)という手もあり。ただし、子会社は売上追求型ではなく提供価値重視型の経営となるように工夫が必要。
  • 丸投げしても本当にOKといえる部分は、外部に発注すればよい(なんでもかんでも丸投げはダメ)

「かなでもの」の杉無垢材デスクが気に入った

コロナ以降、在宅勤務がメインになったので、仕事スペースとしてデスクを新調した。 どうせならノートパソコンとiPadを同時に使えるようにしたかったので、かなり大きめのデスクにしました。

以前、私の尊敬する方が購入していたのを見て以来ずっと気になっていた“かなでもの”さんで購入しました。

f:id:jiig999:20210130114730j:plain 届いた状態。二階まで一人で運ぶのは少し気合いがいりました。 f:id:jiig999:20210130114716j:plain サイズは追加料金無しで指定可能なのですが、僕はデカい作業場所を確保したかったので、思い切って幅170cm、奥行き80cmにしました。 さすがにでかいです。

f:id:jiig999:20210130114749j:plain 杉無垢材のやつを選びました。木目が良い感じです。 f:id:jiig999:20210130114727j:plain 裏面には、脚を固定するためのネジ穴があいています。 f:id:jiig999:20210130114720j:plain 脚はスクエアタイプにしました。シンプルですが格好いい。 f:id:jiig999:20210130114733j:plain 自分で取り付けます。簡単です。 f:id:jiig999:20210130114736j:plain こんな感じ。

f:id:jiig999:20210130114724j:plain 完成。 とても気に入っています。仕事しながらも気がつけば机を撫でて手触りを楽しんでいます。 大満足の一品です。

デスクは広いに限る。 次はイスが欲しくなってきた。。。

踏み台経由でAWS API GatewayのプライベートAPIにアクセスする方法

AWS API GatewayでプライベートAPIというのが作れます。VPCからしか呼び出せないので、リソースポリシーをきちんと設定することで、内部用途でのみ利用する(パブリックに公開しない)APIを実現することができます。

今回はこのプライベートAPIを踏み台のEC2経由で呼び出す場合のやりかたについて書きたいと思います。 (踏み台サーバーにsshログインして、そこからcurlコマンドなどでAPIを呼び出せることは確認済みとします)

今回の構成

以下のような構成だと仮定します。

  • プライベートAPIのエンドポイント:https://abcde.execute-api.ap-northeast-1.amazonaws.com/v1/users
  • 踏み台サーバーのIP:13.xxx.yyy.zzz

発生した課題

踏み台を使った接続でよくやるのは、SSHローカルフォワード設定をしてSSHトンネル接続を使うやり方だと思います。

しかし、プライベートAPI呼び出しのときにはこのやり方ではうまくいきませんでした。 プライベートAPIhttpsで接続するので、サーバー証明書のCN(Common Name)やSANs(Subject Alternative Names)とリクエスト宛先のurlと一致している必要があります。 ローカルフォワードを使うと、クライアントからはhttps://localhost:8888/path/to/resourceみたいな形式で呼び出すことになるため、localhostというホスト名が証明書と一致せずにhttps接続できずにエラーとなります。

リバースプロキシをVPC内に用意して、リパプロとプライベートAPI間をhttpsで通信させることでも回避できそうですが、そのためだけにリバースプロキシを立てたくもありません。 そこで今回はSSHのダイナミック転送を使い、プライベートAPIのリクエストは、SOCKSプロキシ経由で通信することで解決しました。

SOCKSプロキシを利用してリクエストを送信する

SSH接続ではダイナミック転送という機能を使うことができます。ダイナミック転送を使うと、sshクライアントはSOCKSプロキシとして動作します。SOCKSプロキシを経由した通信では、指定されたエンドポイント(今回はプライベートAPI)にはsshサーバー側から接続に行きます。このため、VPCからしか呼び出せないプライベートAPIを呼び出すことができます。かつ、呼び出し元のリクエストURLもプライベートAPIのエンドポイントを指定しているので、課題で書いたようなホスト名の不一致によるエラーも起きません、

~/.ssh/configの例

Host bastion
    Hostname 13.xxx.yyy.zzz
    Port 22
    User ec2-user
    IdentityFile ~/.ssh/id_rsa
    DynamicForward 9999

DynamicForwardの設定が重要です。LocalForwardではなく、DynamicForwadを使います。
このSSH設定で、踏み台とのコネクションを確立します。
すると、DynamicForwardで指定したポート番号がSOCKSプロキシとして動作してくれるので、各ツールなどでそれぞれSOCKSプロキシを指定すれば、プライベートAPIを実行することができます。

curlコマンドの場合の実行例

$ curl --proxy socks5h://localhost:9999 https://abcde.execute-api.ap-northeast-1.amazonaws.com/v1/users

※プロキシとしてsocks5h://〜で指定しています。 SOCKSプロキシはデフォルトではDNS名前解決をクライアント側で行ってからプロキシに渡す動きとなります。しかし、プライベートAPIVPC内からでないと名前解決できないので、名前解決をSOCKSプロキシ側で行うようにオプション指定してやる必要があるので注意してください。 curlの場合、socks5h://と指定することで名前解決をプロキシ側で行ってくれます。(socks5://だと、クライアント側で名前解決してからプロキシに渡す)

ブラウザ用にプロキシ構成ファイルを準備する

今回はブラウザでも動くようにしたいので、FireFoxに読み込ませるプロキシ構成ファイルを用意します。 Chromeなど他のブラウザでも対応可能ですが、以下の理由によりFireFoxを使うことにしました。

  • FireFoxだとシステムの設定とは独立してプロキシ設定をカスタマイズできる(pacファイルを指定する)
  • Chromeは普段使っているので、設定変更したくない

以下の内容でファイルを作成し、bastion_proxy.pacと名前を付けて保存する。ファイル名は任意だが、拡張子は.pacとしておく

function FindProxyForURL(url, host)
{
  // プライベートAPIのDNS名のときはSOCKSプロキシを使う
  if (host === "abcde.execute-api.ap-northeast-1.amazonaws.com") {
    return "SOCKS5 127.0.0.1:9999";
  }

  // 通常はプロキシを使わない
  return "DIRECT";
}

このプロキシ構成ファイルの中で、宛先ホストがプライベートAPIのときは、SOCKSプロキシを使用するように記述している。

  • host===のところは、プライベートAPIDNS名に応じて変更・追加する
  • SOCKS5のところは、localhost + SSH接続でDynamicForward指定したポート番号を指定する

このファイルを、どこでも良いので任意のフォルダに置く(C:¥work¥bastion_proxy.pac など)

FireFoxを開き、メニュー>オプションを開く画面を下にスクロールして、ネットワーク設定>「接続設定」を開く【インターネット接続】画面で以下のとおり設定する以上で準備OK。

f:id:jiig999:20200713160027p:plain
FireFoxの設定

  • ②ファイルパスの指定は、file://で開始する必要があるので注意
  • ③SOCKSプロキシでは通常は名前解決をローカルで行ってから、SOCKSプロキシに渡す挙動になる。しかし、プライベートAPI場合はVPC内からでないと名前解決できないため、ここにチェックを入れる。これにより、SOCKSプロキシ側(=VPC内)で名前解決が行われる。

APIの呼び出し

あとは、ブラウザからプライベートAPIを使用しているサイトを開けばOK! プライベートAPIの呼び出しだけがSOCKSプロキシを利用して通信が行われます。

読書記録2

読書記録の続き

最近読んだ本と感想をメモしておきます。

 

働き方、キャリアに関するもの2冊。
このまま今の会社にいていいのか?と一度でも思ったら読む 転職の思考法

このまま今の会社にいていいのか?と一度でも思ったら読む 転職の思考法

 

どちらも、転職を考えていなくても読んだ方が良い。社内でのキャリア設計にも役立つし、仕事に対する心構えや視座を考え直すきっかけになる。そうなると結果的に今の仕事における動き方やあり方もより良くなると感じた。

正しいものを正しくつくる
正しいものを正しくつくる プロダクトをつくるとはどういうことなのか、あるいはアジャイルのその先について
 

前著のカイゼンジャーニーが面白かったし、著者の市谷さんの考え方など非常に共感できるので、購入。

たんなるアジャイル開発の話ではなく、新規事業立ち上げのプロセスとして教科書になり得る。ITを軸にした新規事業を推進しているなら必読。自分なりに辿り着いた新規事業開発の流れとほぼ同じプロセスになっていたが、リーンスタートアップアジャイル開発の本質を考えていくとやはりこういうことだね、という感じ。

 

ビジネスモデルナビゲーター
ビジネスモデル・ナビゲーター

ビジネスモデル・ナビゲーター

  • 作者: オリヴァー・ガスマン,カロリン・フランケンバーガー,ミハエラ・チック,渡邊哲,森田寿
  • 出版社/メーカー: 翔泳社
  • 発売日: 2016/10/04
  • メディア: 単行本(ソフトカバー)
  • この商品を含むブログ (1件) を見る
 

研修を受講した流れで購入。字がつまっていて読みづらかった記憶しか無い。。

いろんなビジネスモデルを知っておくのには良い。

 

プリンシプルオブプログラミング

久しぶりにこれ系の技術書を買った。最近はコード書くことも少し増えたので、購入。いろんな本などに記載されているプログラミングのコツ、良いプログラミングのために気をつけたいことを知ることができ、おすすめ。

 

ソフトウェア・ファースト
ソフトウェア・ファースト

ソフトウェア・ファースト

 

とてもオススメできる。著者の方が、「当たり前のことしか書いていないし、周りからもそう言われた。なので、この本が売れるようだと日本企業はヤバいと思います」と言っていたのが印象的。

これからの企業に求められるソフトウェアに対する姿勢が分かりやすく書かれている。自分が以前から感じていたことや思っていた課題感を、文書にまとめてくれているので、ソフトウェア開発のありかたを考え直して欲しい人に説明するときに、この本を参考にさせて頂いている。

 

イシューからはじめよ

今さらながら、読みました。

課題解決とかロジカルシンキングのようなことを学んだことのない人にはとてもオススメ。すでにある程度体得している人には、新しく得られることは少ないかも知れない。ただ、、それでもポイントポイントで、筆者ならではのコツだったり思考の整理方法が散りばめられており,読んで損は無いと思う。