Ich habe hunger

あふりかエンジニア、アフリカ向けのB2BのSaaSを開発する

アフリカでFinTechサービスをリリースした話

あんまり会社でどういうプロダクトを作ってるとかは意図的ではないんだけども、外に出ない話。

実は最近いわゆるFinTech系のサービスをこっそり出しました。内容というとケニアのM-PesaというモバイルマネーのAPIとうちのシステムを連携して、モバイルマネーの支払い状況をほぼリアルタイムに反映することでなんちゃらするという仕組み。

で、なんでそんなことしてるの?みたいな話なんですが、

「MAKE EVERYDAY PURCHASES CONVENIENT」

というのが弊社で言うところなんですが、やっぱり生活費需品な携帯電話とかインターネットとか電気みたいなものって欲しいわけなんですね。で、例えば携帯電話(スマホ)だと200−300ドルしたり、電気の通ってないとこで家にソーラーパネル仕入れて電化しようと思うとある程度大きなお金が必要なわけですよね。で、日本だと例えば分割10回払いとか1ヶ月定額で払うみたいな仕組みがなかなか市民まで届いてないと。僕らでいうと、銀行口座で自動引き落としないならどうすんべ?みたいな感じです。

ここら辺にいわゆるペインというやつがあって、例えば分割払いにさせればいいんじゃね?とかになっても、自動引き落としじゃないから「昨日1000円払ってねーけどどうなってんの?」を営業の人がわざわざ対面でしに行ったりする必要がある、と。全員が対面で請求しないと払わないかというとそうではなく、SMSで「明日振込期限だよー」って送ると「あっぶねー!明日振込期限だったわ!」という人がいるなら送った方が良いですよね?ただ、それを10人いる営業に顧客全員送れよ!という指示もしんどいし、これはアフリカとか日本関係なく多分抜け漏れ管理しきれないとか多分問題が出てくると思います。で、SMS送ると払ってくれる人がいるのにわざわざ対面で請求しに行くのってめちゃコストじゃね?と思うわけです。じゃあ、利益はある程度あるとしても、そのコスト分を加味しないといけないとなってしまうと新規事業も営業コストが高くて立ち上げられないし、既存事業もコスト高で良い商品なのにこれ以上広げられない・・・ってめっちゃもったいないなくないですか!?

で、そこでいい感じのモバイルマネーで支払いながら、請求側のコストも下げられるシステムを開発した(詳しくは杉山まで)わけですが、そういうのを昨年秋から仕込みながらこの2月ぐらいにやっと完成を迎えました。

恐らく、M-Pesaの新しいAPIを日本人で実用レベルまで触ったのは弊社だけじゃね?とか思いながら、ケニアのいい感じの銀行とか別の国のモバイル決済系と繋げた時にカスタマイズコストを下げられるように作ったので、そういうところとうまく連携しながらモバイルマネーがとか銀行とかの決済周りで良いポジションを作れるんじゃないかなーと技術的にもビジネス的にもいい感じのものを開発、スタートしたのこの半年ぐらいでした。もともとやってたプロダクト自体は、僕とは別のジョインしてくれたエンジニアがごりごり進めてくれたのでめっちゃ開発進んでて超気持ちいいです。

ということで、ちょっとぼやかしながらふわふわとした感じなんですが、これからアフリカの中でモバイル決済(API用意してるやつorするやつ)とうまく連携しながら徐々に手を伸ばして、みんなの生活がどう変わって行くのか、僕らのSaaSを使ってどうやって組織を拡大して行くのか、僕らのサービスがあるから立ち上がるビジネスがあるとしたらどれぐらい手助けできるのか、というのは内外問わず非常に面白いところなので、誰かやりたいことに対して技術力(および時間)が足りないぼくを助けてください!いわゆるWe're hiringになってしまうんですが、海外サービスとかグローバルにリモート勤務みたいなお話は多分できると思うのでどしどし@sugi511にDMを送ってもらえると東京近辺の飲み会に現れると思いますのでお誘いくださいませ!!

未来に早く到達する責任みたいなやつ

今自分には奥さんがいて、子供がいる。子供が生まれたときには、産休と育休を取ってもらった。で、0歳の間に保育園に預けて奥さんは復帰した。

で、その復帰に際して保育園がどうだったか話はまた別の機会にするとして、女性のキャリアの断絶あたりの話を軸にしたいと思う。

という話があったんだけど、これって結構難しい話だな、と思っていてその理由は複数ある。

第一に、30歳で2年間(産休+育休)休んでしまうと、22歳で卒業して32歳で比べると10年間の社会人経験という中で、2年間が会社にいないので単純に考えても20%のロスがあって、さらに任せられる仕事が線型的に責任範囲や仕事の大きさで比べると20%どころで効かない。23歳で任せられる仕事よりも32歳で任せられる仕事の方がもちろん大きいし責任も重いしきっと面白いのである。であるとすれば、33歳で戻って来ても同じ33歳とは経験値ベースだとしてもなかなか不利なんだけども、それを覆すには容量が良いであるとかそもそも優秀でないといけないのである。

第二に、今までの社会という意味で、もしくは評価者が評価される人よりも十分に年上だという意味で、年齢である程度の実力を測ってしまうところであると思う。あんまりよかったとは思わないけど、ごりごり仕事をしている人の中では35歳の男女ではだいたい10−13年ぐらい働いているという期待値で比べて評価をするけど、そこに2-3年産休を取ったから実務経験年数でいうと30歳の人と比べるのが平等だよね、と比べてくれる評価者はなかなかいないと思う。ここら辺は、今までの社会では社会人になってから途中で大学や大学院に入ります、や数年休んでOOします、みたいな人が混じっていなかったので、画一的な見方に起因するところだし、それでよかったと思う。年代で区切ってスキルの評価をすることはあっても、25歳と35歳を比べて25歳を昇進させたり、より評価を高められるマネージャとか業界はまだまだ少ないと思う。どうしても年齢が非常に効いてしまう側面がかなり大きいと思う。

と、まぁだいたい自分自身も大きな会社で働いたこともないし、知人であったり伝聞だったりするので、自分自身の生の情報はどうしても少なくなってしまうのだけども、そこまで外してないかなーとは思う。

ただ、まぁこれが外していようと外していなかろうと一つ変わらないなーと思っていることがあって、それは自分が価値観が変わりつつある世代にいるというころである。ここ5,6年を見ても、6年前にここまでフリーランスや労働観みたいな話は今ほど語られていなかったし、どんどん変わって来ているし、その状態で社会に出て来る新社会人もいる。自分は30歳なんだけども、それを考えると少なくとも下の7−8年ぐらいの世代は自分よりも後の世代になる。 で、ここから20年経ったとすると自分は50歳できっと会社の中心で部長とか会社の意思決定とか空気とか規律みたいなところのど真ん中にいる世代なんだと思うけど、その頃にはさすがに今のような世代で区切ってしまって不当な評価をしたり、育休とったりするのに(社内から)抵抗があったりするのもなくなると思う。それは今の基準からするとすごく幸せなんだけども、その頃にはその頃の不満みたいなのがあるかもしれない。そういうステージに早くいくことこそが日本の社会にとってめっちゃいいことだよなーと思うと、そういう社会にするのに20年かかるのってダサくね?って思ったりもする。

どうしても、アフリカみたいなところに関わっているからかここ数年の自分の中でのキーワードが「歴史を加速させる」というものに収束されていて、いつか来るであろう未来を年単位で加速させることで次のステージに早くいく、その先は自分じゃなくても良いけど、というのが大事になって来ている。そういう意味でも、リモートで仕事するのも国境を超えるし、国境を超えてもskypeで飲み会したり帰って来たら超仲良いとか、みんな住んでる場所はバラバラだけど日にちを決めてどっか集まって超話したり、多分新しい働き方をゴリゴリしまくってるが故にもっと発信しないといけないなーと思ったのでブログ再開します(別に休止してたわけじゃないけど)。

Rails+Hamlでtextareaに余計なスペースが入っていた件

f:id:sugi511:20170708163821p:plain

DBの中身とか見ても、改行コードが普通に入ってるだけなんだけど、textareaに出力するとこんな感じで余計なスペースが入っていた。 で、controllerに送る時、saveした後、Edit画面で出力する前とか見ても余計なスペースというのは存在しなかったのに、なぜかこれ。 本番環境では起こらないし何だろう、と思っていたら実はHamlの設定だったらしい。 ということで、optionをいじって無事解決。

** 参考

qiita.com

qiita.com

「君は自分の人生を生きているか」

あんまり強い言葉を使うのは嫌なんだけども、30歳を迎え現実に対峙するにもパワーが必要になって来た今、現在考えていることをどうしても文章にしていないとこれから先に同じように自分に問いかけることを避けてしまいそうなので自分自身に問いかける意味も含めて文章にしておきたいと思う(こういうような言い訳を書かないとこういう文章を書けなくなってきたあたり老いてきたのでは、と思ったりもする)。

10歳、20歳の自分にきちんと説明ができるか

区切り自体はどこでもいいんだけども、小学生、中学生、高校生、大学生、大学院生、新社会人と年齢とともにいろんな環境に身を置いてきたし、その都度色々なことを学び色々なことを考えていたと思う。もちろん、今思うと「青臭いなー」とか「バカだったなー」と思うことはたくさんある。が、しかし知らないということは一つの力である、というのはやっぱり思う。で、5年、10年、20年前の自分ともし話ができるのなら、彼らに対して胸を張れるような選択が今できているだろうか。「遊べるのは学生のうちだから」なんてクソみたいなセリフを吐かないだろうか。彼らをワクワクさせるほど熱狂しているものはあるだろうか。

今の自分は楽をしていないだろうか

正直いって少し楽をしていると思う。本当にこれはダサい。今すぐ変えないといけないが、傾向として自分ができる範囲でなるべくことを済ませようとする。ある程度までは多分これで良い。でも、これだと自分の100%を超えない。新しいものを取り入れることを外部環境に任せてしまっている。必要に迫られることがあるなら・・・そうじゃない。本当にやらないといけないのは、集中する場所は決めるべきだが、積極的にいろんなことを取り入れないといけない。CTOという立場だと、どうしても自分がキャップ(上限)になる瞬間が来てしまうので、そこまでには自分がキャップにならないか、キャップになっても良いぐらいきちんと伸びてないといけない。掛け算が大事だ、とか言い訳を最近しがちだけども、掛け算する2要素あれば両方とも伸ばすことをサボって楽をしてはいけない。楽をせず、自分の伸びを楽しんで、それをチームや会社の伸びに転換するという視点を持つべきだと思う。自分で留めないからこそ得られるフィードバックや経験というのもあるはず。

40歳、50歳の自分が振り返っても恥ずかしくないか

どうなるかはわからないけど、10年、20年後には自分はもっともっとすごいやつになっていて欲しい。どういう物差しですごいやつかは正直わからない。でも、30歳の今の自分が羨むような生き方をしていて欲しい。そんな未来の自分が見て、現在サボっていないか、全力を出してなかったんじゃないか、視野が狭かったんじゃないか、と思わないような最善を尽くしたい。今の仕事はすごく楽しいし、特異な環境だし、今の選択だとベストだと思う。思うが故に、本当にベストなんだろうか、情報をシャットアウトしてるだけでは?ということをもしかしたら考えるべきかもしれない。

生きていることを忘れていないか

「生きていることを忘れていないか」

実は「生きている」というのがどういうことかは分からない。精神的な話。何年か前、目の前にある仕様書に沿って本当に世の中のためになるかも分からない、誰の幸せにつながっているのかも分からない、自分が熱狂できるわけでもないシステムを作っていた時は、多分「生きている」とは言えなかった気がする。適当に仕事をして、給料をもらって、友達と適当に飲み会をして・・・楽しかったけど、考えることから逃げて楽をしていたのだと思う。他の人がどうかは知らないが、少なくとも"今の"自分にとっては、誰の幸せを作ってるかも分からないシステムを作ることはもしかしたら良いことかもしれないけど、その状態は非常にカッコ悪いと思うし、本当に自分がやりたいことなの?熱狂してる?という問いを投げかけたいと思う。

常にかっこいい自分に

やっぱり年齢とともに体力的にも落ちてくるし、奥さんも子供もいるといわゆる守るべき存在というのもいるし、どうしても保守的な行動をとりがちになるし思考もそうなりがちだが、何歳になっても謎の万能感に包まれていた小学生高学年〜中学生の自分が憧れるような、60〜70歳だろうが死ぬ直前だろうが常に自分がカッコよく生きるために全力を尽くしてきたよな、と未来の自分が振り返れるように今を全力で生きたい。

30歳の自分は今。

25歳の年で社会に出たので多分社会人5年目。半年以上関わった会社でいうと正社員・業務委託で6社ぐらい。今は2015年7月からジョインしたアフリカインキュベーターという会社でCTOをしている。

「MAKE EVERYDAY PURCHASES CONVENIENT」

これを旗印にアフリカの流通にITでどうやって食い込んでいくか、僕らがやらなくてもいつか時代がアフリカを押し上げるとしても、僕らの会社がどれだけそれを加速させられるか、というところが面白いと思ってやっている。どうしてもBtoBを支える部分になるが、日本でやるよりももっと効果があるし、ワイヤレスからインターネットが始まる彼らの社会にどうやってフィットしたものを作るかというのは日本とは別の課題だ。ここら辺を本当に解決できた先にある社会の礎になるような商習慣を作る手助けになれば、流通の基礎を作られるなら、それはどれだけ素晴らしいことだろう。まぁ、しかしながら当たり前を作った人は感謝されない。でも、作ったと胸を張れるだけの適切な自意識があればいいんじゃないかな、とも思う。

あと、うちの会社に関わってくれてる人が大好きだ。社長はいわゆるスーパーエリートなんだけども、本当に賢くてぜってー追いつかねーって思ったりもするが人間的なとこも十二分にあったり、こういう人と仕事をできるというのは本当に幸せで、偶然だったし、2年前の自分にこのチャンスを逃さなかったのはGood Job!って親指を立ててやりたい。リモートでエンジニアしてくれてる人も、現地でゴリゴリ営業してる人も、限られた時間を使って現地にいったインターンの人たちも、本当に尊敬のできる人ばかりで幸せな環境に偶然身を置くことができてるんだな、と思うとやっぱりこの人たちに恩返しをしないといけないと思うし、できれば杉山と働いたこの時間は本当に価値があった、とか幸せだった、みたいに10年後に語れるようにしたいな、と思う。

綴ってみて思ったけど、今のところしんどいこともあるが全体評価としてはすごく楽しいが、少し楽してる部分もあるので、10年後の自分に「あの時の自分はダメだったな〜」なんて語らせないように頑張ろうと思う。と、書き始めると無限に続くので、先の謎の表明で終わることにする。

OS X El Capitanでrailsを再インストールしようとしたらeventmachineでエラーが出て原因がopensslっぽい

rbenv install 2.1.8
bundle install

みたいな感じで進めてたら

Gem::Ext::BuildError: ERROR: Failed to build gem native extension.

(中略)

compiling binder.cpp
In file included from binder.cpp:20:
./project.h:116:10: fatal error: 'openssl/ssl.h' file not found
#include <openssl/ssl.h>
         ^
1 error generated.
make: *** [binder.o] Error 1

make failed, exit code 2

(中略)

An error occurred while installing eventmachine (1.0.8), and Bundler cannot continue.
Make sure that `gem install eventmachine -v '1.0.8'` succeeds before bundling.


こんな感じのエラーが出て、何やらopensslがダメらしい。

> El CapitanではOpenSSLヘッダが提供されなくなっている

という話が合って何やらこれが原因らしい。

qiita.com

opensslからlibresslに乗り換えようかな、と思って乗り換えてみたけど、あんまり問題としては解決しない。

export PATH=/usr/local/opt/openssl/bin:$PATH
export LD_LIBRARY_PATH=/usr/local/opt/openssl/lib:$LD_LIBRARY_PATH
export CPATH=/usr/local/opt/openssl/include:$LD_LIBRARY_PATH

qiita.com



結局のところ、.bach_profileに上記のPATHを通すことでなんとか動くようになりました!
あー、かれこれ5-6時間詰まってた気がする。

DateRangePickerでRangeでなく単日、時間を選べるようにするときのオプションメモ

  $(selector).daterangepicker(
    "singleDatePicker": true,
    "timePicker": true,
    "timePickerIncrement": 5,
    "autoUpdateInput": false,
    locale: {
      format: 'MMMM D, YYYY HH:mm'
    },
    (datetime) ->
      $(selector).val(datetime.format('MMMM D, YYYY HH:mm'))
  )

空欄も許可するような場合には、autoUpdateInputをfalseにしておかないといけないが、falseにするとカレンダーを表示してApplyを押しても反映されないので、callback部分でセットするようにした。

今回ここで引っかかったのは、フォーマットを結構変えているので、フォームに事前にvalueがセットされている場合にdaterangepickerでセットしているformatに従わない場合、「Invalid date」みたいな感じになるので、

dateTimePicker = (selector) ->
  unless $(selector).val() == ''
    datetime = moment($(selector).val()).format('MMMM D, YYYY HH:mm')
    $(selector).val(datetime)

  $(selector).daterangepicker(
    "singleDatePicker": true,
    "timePicker": true,
    "timePickerIncrement": 5,
    "autoUpdateInput": false,
    locale: {
      format: 'MMMM D, YYYY HH:mm'
    },
    (datetime) ->
      $(selector).val(datetime.format('MMMM D, YYYY HH:mm'))
  )

こんな感じにしておいた。
こういう感じにしておくと、1ページに複数のカレンダーUIが必要になっても、dateTimePickerに突っ込んでOKになるので割と便利。

Railsでmigrationする時にundefined method `to_sym'

出たエラーはこんな感じ

NoMethodError: undefined method `to_sym' for {:default=>true, :null=>false}:Hash

migrationはこうしているだけ。defaultをfalseからtrueにするだけ。

  def up
    change_column :questions, :enabled, default: true, null: false
  end
||<    

と思ったけど、ただのケアレスミスで、:booleanって書くの忘れてただけだった。

>||
  def up
    change_column :questions, :enabled, :boolean, default: false, null: false
  end


change_column_defaultを使えば良いケースだ。
change_column - リファレンス - - Railsドキュメント