不格好エンジニア (引っ越しました)

wordpress.comから引っ越しました。

プラットフォームの教科書 を読んだ

プラットフォームの教科書 を読んだ。

この本を読んだ自分の背景というと、普段はスタートアップ企業でグロースハックやWebアプリケーション、モバイルアプリの開発などに従事している。

プラットフォームビジネスの勝敗を分ける要因は当然、技術的な要因だけではない。どうやってWinner Takes Allの状況を突き崩していくか。"次"の打ち手を考えるヒントを得られることを期待して購入した。

要約

Winner Takes Allに見えるプラットフォーム・ビジネスにおいても、ひとり勝ちの状況はある日、突然くつがえされることがある。なぜ、それが起きるのかを近年の事例(任天堂 vs スマホゲーム、スマホシフトをテコにしたLINEの成長)をもとに解説している。

面白かった章とその理由

02 レイヤー構造化

プラットフォームのコンセプトを戦略にうまく取り入れた事例として、仮面ライダーのベルトや妖怪ウォッチのメダルが紹介されている。仮面ライダーの変身用ベルトの機能の変遷から、ビジネスモデルの進化を考察していて、非常に興味深い。

13 5つの対抗策

Winner Takes Allの進行を妨害する5つの戦略について解説している。戦略としては以下の通り。

  • 収益モデルの破壊と拡張
  • プラットフォーム包囲
  • プラットフォーム間橋渡し
  • プラットフォーム互換
  • プラットフォーム連携

ほとんどの事業者は、Winner ではなく、次のWinnerになりたい側(追う側)であるはずなので、興味深く読める方が多いはず。

理解できなかったところ

なぜ産業がレイヤー構造化するのか、疑問が生じたので調査してみた。下記のスライドがわかりやすい。

バリューチェーン戦略論からレイヤー戦略論へ

インターネットの浸透により、売り手と書い手が同一空間/同一時間に取引を行う必要がなくなったから、という事らしい。

仕事に活かせそうな知識、活かせそうな状況と活かし方

自社の状況に当てはめると、如何にリソースを集中投下するか、選択と集中について、リソースの潤沢な大企業よりもシビアに判断していく必要がある。

その視点でみると、特に使えそうな考え方は以下の3点。

  • マチュアエコノミー(UberAirbnbの事例のように、アマチュアを事業者として参画させ、ゲームのルールを変える。)

  • 信頼性と信用の確保(機能の豊富さを売りにするのではなく、信頼と信用を担保する仕組みを徹底的に磨き込む。)

  • 収益モデルの破壊と拡張(既存プレイヤーの収益源を"無料化"によって破壊する。)

まだよく理解しきれていない所も多いので、時々手に取って読み返したい。

コーディング面接対策サイトCodilityの練習問題を解いてみた(MinMaxDivision)

問題

配列AをK個に分割し、それぞれ分割したブロックの和を求める。 すべての配列の要素は5以下。

A = [2, 1, 5, 1, 2, 2, 2], K = 3, M = 5 なら

[2, 1, 5, 1, 2, 2, 2], , なら、分割したブロックの和の最大値 15; [2], [1, 5, 1, 2], [2, 2] なら、分割したブロックの和の最大値 9; [2, 1, 5], [], [1, 2, 2, 2] なら、分割したブロックの和の最大値 8; [2, 1], [5, 1], [2, 2, 2] なら、分割したブロックの和の最大値 6.

それぞれのパターンで算出した分割したブロックの和の最大値の中で、最小値を求めることがgoal。

Codility

回答

K == 1 なら各要素の総和(high)に K == 配列の長さなら、各要素の中で最大のもの(low)が答えに それ以外の場合なら、lowとhighの間に答えがあるはずなので、BinarySearchで、ちょっとずつ計算する

#A = [2,1,5,1,2,2,2]

def solution(k, m, a)
  if k == 1
    return a.inject(0) {|sum, x| sum + x }
  elsif k == a.length
    return a.max
  else
    # use binary search
    low = a.max
    high = a.inject(0) {|sum, x| sum + x }

    while (low <= high) do
      mid = (low + high) / 2
      p "mid = #{mid}"
      if check(a, k, mid)
        high = mid - 1
      else
        low = mid + 1
      end
    end
    return low
  end
end

def check(a, k, mid)
  sum = 0
  blocks = 0

  a.each {|e|
    if ( (sum + e) > mid )
      sum = e
      blocks += 1
      return false if blocks >= k
    else
      sum += e
    end
    #puts "sum = #{sum}, blocks = #{blocks}, k = #{k}, mid = #{mid} "
  }
  return true
end

p solution(3,5,A)

コーディング面接対策サイトCodilityの練習問題を解いてみた(TapeEquilibrium)

問題

テーブを前半と後半に切断して差分を比較し、最も少ない差分を返す

Test results - Codility

回答

headにテープの前半部分を、tailにテープの後半部分を格納する。 インデックスを動かすごとにdiffを再計算する。

def solution(a)
  sum = a.reduce(:+)

  head = a[0]
  tail = sum - a[0]
  min_diff = 10000

  for i in 1...a.length
    diff = (head-tail).abs
    min_diff = [min_diff, diff].min
    head += a[i]
    tail -= a[i]
  end
  min_diff
end
# debug

arr = [3,1,2,4,3]
p solution(arr)

arr1 = [-1, 1]
p solution(arr1)

その他

rubyのreduce知らんかった。。。

コーディング面接対策サイトCodilityの練習問題を解いてみた(FrogJmp)

問題

カエルが目標に到達するためには、最低何回、ジャンプする必要があるか

Codility

回答

def solution(x, y, d)
  ((y - x).to_f / d).ceil
end

その他

割る前にto_f しないと、小数が切り捨てられてしまうことに注意。 パフォーマンスを考えると、ループさせない方が良い。

1-TimeComplexity

線形代数 ベクトルと固有値 (大学入門ドリル)の読書メモ

読んだ本

Kobito.YtQg7o.png

Amazon.co.jp: 線形代数 ベクトルと固有値 (大学入門ドリル): 丸井洋子: 本

学んだことと参考リンク

ベクトルとその性質を知ろう

ベクトルどうしの和や定数倍を定義できて、いくつかの計算規則が成り立つことを知る。

行列代数これだけ

ベクトルどうしの関係を判定しよう

ベクトルの線形従属と線形独立について,幾何学的なイメージを捉える。 f:id:tjnet555:20160510011429j:plain

1.2 ベクトル空間と基底

ベクトルに内積を定義しよう

内積を定義すると、色々なものを美しく簡潔に表現できる

ベクトル3

固有値を求めて行列を対角化しよう

固有値の図形的な意味

f:id:tjnet555:20160510005721j:plain

対角化することのメリット

行列のn乗が綺麗に求められる!

linear_lecture.pdf

感想

コーディング面接対策サイトCodilityの練習問題を解いてみた(CyclicRotation)

問題

与えられた配列aの各要素をk回,右に動かす(このとき、最後尾の要素は先頭に持ってくる)。

Codility

回答

def solution(a, k)
  b = []
  for current_index in 0..(a.length-1)
    new_index = (current_index + k) % a.length
    b[new_index] = a[current_index]
  end
  b
end

p solution([3,8,9,7,6], 3) == [9, 7, 6, 3, 8]
p solution([3,8,9,7,6], 0) == [3, 8, 9, 7, 6]
p solution([3,8,9,7,6], 5) == [3, 8, 9, 7, 6]

感想

パフォーマンスは気にしなくて良いらしい。 kが配列の要素数よりも大きい場合を考慮する必要がある。

コーディング面接対策サイトCodilityの練習問題を解いてみた(BinaryGap)

問題

Codility

nを二進数にして、1に囲まれた0の数を数える

回答

def solution(n)
  s = n.to_s(2)
  zeroes = s.split('1')
  zeroes.pop if n % 2 == 0
  return 0 if zeroes.empty?
  zeroes.map{ |z| z.length }.max
end


# debug

puts solution(20) == 1
puts solution(6) == 0
puts solution(1041) == 5
puts solution(255) == 0
puts solution(529) == 4
puts solution(66666) == 5
puts solution(1024) == 0
puts solution(9) == 2
puts solution(11) == 1

感想

この書き方、知らなかった。

9.to_s(2) #=> "1001"