valid,invalid

関心を持てる事柄について

OSSに貢献してお金を得る

OSSに貢献して¥6,000ぐらい貰えたのでその話をする。OSSがお金になった話 · Dとはちょっと違う。

tip4commit

Tip4Commit — Kontribusi ke Open Source というサイトがある。 このサイトに登録しているOSSプロジェクトそれぞれのビットコインアドレスに応援という名目で寄付 (donation) ができる。

これだけだといわゆる"投げ銭"サイトなのだが、面白いことに、OSSへの contributor に対して蓄積されたコインの一部が報酬として支払われるのだ。

支払われる額は積まれた投げ銭残高のN%。この割合はOSSの管理者が決定できる。例えば bitcoin-ruby*1 を見てみる。

f:id:ohbarye:20180114181055p:plain

現在の残高は 0.10365790 Ƀ、 支払った総額は 0.32204210 Ƀ、次回に支払われる額は 0.00103658 Ƀ とのことだ。

同サイトは4,5年前からあるらしく、2013年頃に数十円の気持ちで投げられたコインたちが今になっては何倍もの価値になり、報酬として支払われると思うと夢がある。しかし少し見渡してもそこまで高額の報酬を設定しているプロジェクトはなさそうなのでお小遣い稼ぎぐらいの気持ちでやるのがよさそう。

実際に報酬を得た話

まずこのサイトに sign up し、自分の bitcoin アドレスを登録した。

tip4commit 本体もこのサイトに登録していて報酬もまずまずだったのでバグか何かないかサイトを巡回していたが特にめぼしい物は見つからなかった。なので開発上の課題や直近の修正からチャンスを得るべく GitHub ページ https://github.com/tip4commit/tip4commit/pulls を見てみると、最近になって Korean, Spanish, Indonesian ロケール対応をしており localization を歓迎している雰囲気があった。

余談だが、localization は最もとっつきやすいOSSコントリビューションチャンスだと思う。日本語・英語ともに多少の言語力が求められるものの高い技術力や対象プロジェクトのコンテキストへの深い理解が要求されることはあまりないからだ。

tip4commit は日本では全く話題にならなかったのだろうか、日本語対応がされていなかったので en.yml を見ながらガーッと翻訳を書きなぐって pull request を送ってみた。

github.com

これが27 days*2を経てようやくマージされ 0.00357757 Ƀ がマイページの残高として現れた!!!

f:id:ohbarye:20180114182459p:plain


雑感

どこであったか忘れたが、OSSへのコントリビューションに報酬が必要だろうか?という提言を思い出した。記憶が曖昧だが、「OSSは善意で回ってるんや〜」的観念、内発的動機づけ至上主義の立場からすると報酬は常に支払うべきでないという意見だった。ロウソク問題よろしく報酬に目がくらんだ低質な pull request が大量に飛びかい、結果としてOSS総体が悪い方向に向かうという危惧もわかる*3

このサイトの作者の真意は不明だが、上述のように報酬がバッドノウハウとして働くのを危惧するなら使わなければ良いし、選択機会を提供しているだけでも尊いと思う。報酬がなければ見向きもメンテナンスもされなかったプロジェクトが蘇るとか、OSSメンテナとしてコントリビュータに感謝ができるとか、そういう綺麗な話がもっと出てきて欲しい。

*1:bitcoin utils and protocol in ruby.

*2:OSS fatigue だろうか…

*3:実際、tip4commit に登録されたもののメンテナからのクレームで掲載落ちしたOSSプロジェクトもあるようだ。

『高い城の男』

もしドイツと日本が戦争に勝っていたら世界はこうなっていただろうか…という思考実験、平行世界もの。序盤を読み進める中で、第二次世界大戦前後の歴史に関する基礎的な知識がないと楽しみが半減してしまうと思って少しおさらいしてから読み始めた。

「もしも連合国が枢軸国に勝利していたら*1という歴史改変小説『イナゴ身重く横たわる』の著者、高い城の男に会いに行く」という終焉に向けて収束するメインストーリーはあるものの、無関係に言える登場人物が多く登場する群像劇になっている。人物の内面描写は多めだが行動原理や規範がずいぶんかけ離れた人ばかりで感情移入しにくく、幾分読みづらかった。物事がうまく進んでいそうなのになんだか結局ダメになってしまう…みたいな不能感の描写がバッドトリップぽくてそのあたりにそこはかとないSF感を見出すとやや楽しくなってくる。

Amazon Prime のドラマ版)も見てみようかな。

主題

本作の主題は"本物と偽物"、"選択と結果"というところにあると思った。「なんだか結局ダメになってしまう」とか「選択を間違えた」というようなネガティブマインドはこれと大きく関わっているし、展開される各々のストーリーに共通している。選択をするのにいちいち易経に頼る人物たち、自分の人生が自分のものではない、または世界が偽物であるような違和感…メタフィクションの感覚(ジュリアナは最後には易経を通して『イナゴ身重く横たわる』に描かれた世界こそが真実の世界だと知るわけだが)。

戦争観

『高い城の男』を読んで「やっぱり連合国が戦争に負けてよかったね〜〜〜」みたいな感想も見るがそれは違う気がするんだよな…。日本はそれほどひどくないものの、たしかに作中のドイツも扱いは結構ひどい。反ナチ派は粛清されているし、ナチズムが広がった世界はある種のディストピアだ。とはいえ必ずしもこうなりえただろうか?「勝たなければこうなっていたんだ」と現状肯定するのは戦勝国側の論理であって、敗戦やそれに伴う艱難辛苦の正当化や納得にはならないのでは。(まぁそこは主題ではなさそうなので読中はあまり気にならなかったがそういう感想を見かけたので)

ハイライト

あまりない


われわれの人生という、この恐ろしいジレンマ。なにが起こるにしても、それは比類のない悪にちがいない。では、なぜじたばたあがく? なぜ選択する? もし、どの道を選んでも、結果はおなじだとすれば……。

Read more at location 5606


どこか別の世界では、たぶん様子がちがっているだろう。もっとましだろう。善と悪の選択の道がはっきりしているはずだ。こんな曖昧な灰色の混合物ではないはずだ。しかも、もつれあった要素をほぐそうとしても、まともな道具さえない。

Read more at location 5613

*1:すなわち我々の現実世界

『僕がアップルで学んだこと 環境を整えれば人が変わる、組織が変わる』

一時はその存続が危ぶまれたアップルという会社が、回復に向けてどのような環境を構築し、人材を集め、優れた製品やサービスを生み出すに至ったのか。本書はその一部始終を経験した著者が語る指南書。スティーブ・ジョブズが用いた手法とそこから著者が学んだノウハウには、これからの社会を生きていくうえでのヒントが数多く含まれている。 (Amazon より引用)

ハイライトした箇所


このころのアップルというのは、完全に「船頭のいない船」と化していました。会社の方針を知っている人など誰もおらず、めいめいが好き勝手なプロジェクトを作って実行していました。もしかしたら何らかの方針が存在したのかもしれませんが、私は聞いた覚えがありません。次から次へとさまざまなプロジェクトが脈絡なく起きては消えていきました。

Read more at location 103


アメリオは、まだ計画中のものも含む350ものプロジェクトを50にまで減らしました(

Read more at location 171


この製品の表は非常に分かりやすかったため、どんなミッション・ステートメント(会社の根本原則や方針を明文化したもの)よりも社員の力をひとつの方向にフォーカスさせることに役立ちました。新しいモデルが発表になるごとに売り上げが倍増し、会社が勢いを取り戻すのを肌で感じられました。

Read more at location 293


アップルをアップルたらしめている最も強力な仕組み、それは「シンプル志向」です。無駄が多い組織、必要以上に複雑な組織というのは、まるでメタボリック・シンドロームに悩む中年男性のようなものです。この「シンプル志向」には会社の「脂肪分」に当たる無駄を取り除き、会社のビジョンを明確にし、多くの従業員を結束させる働きがあります。

Read more at location 319


ます。普通アップルほどの規模の企業になれば、国内だけでも数十もの関連企業があるものです。例えばアップルがずっと目標にしてきたソニーは、日本国内だけでも関連企業40以上を有しています(注23)。ところがアップルは米国内には本社のほかにもう1社しか持っていません(注24)。また参入事業もソニーは20以上もあり、それもコンピューターや電子機器のほかに映画や音楽制作から損害保険、生命保険、そして銀行業と多岐にわたります(注25)。対するアップルは、コンピューター事業、コンシューマー電子機器事業、ソフトウエア販売、ダウンロード販売事業、それからクラウド事業と、たった5つの事業にしか参入していません。この5つの事業も非常に密接に関連し合っており、ソニーの電子機器事業と生命保険事業のようにまるっきり別のことをしているわけではありません。また製品のモデル数を数えても、2012年1月9日の時点でアップルは世界中でも12しかない(注26)のに対して、ソニーは日本国内だけで120ほどもあります(注27)。  このようにアップル

Read more at location 326


組織というのはある程度の規模を超えると、どうしてもそれ自体が意思を持ってしまうようなところがありますから、複雑な組織を作るとてんでバラバラの方向を向いてしまう傾向が強くなります。また組織の階層が増えると責任の範囲が曖昧になりがちですし、意思決定や情報が流れるスピードが遅くなります。こうした事態を防ぐためにも組織の構造がシンプルであることは非常に重要です。

Read more at location 358


やること」と「やらないこと」を決めるのは、自分たちの得意な分野と不得意な分野を正しく理解し、得意な分野に特化するということです。またこれは、他社との差別化をどうやって図るのかを決めることにほかなりません。

Read more at location 418


まずいちばん最初に明快な製品のコンセプトを定義し、その定義に沿ってデザインを練っていきます。もしも製品のコンセプトやデザインが誤ったものであったなら、その後でどんなに開発や製造、品質保証部門が頑張ってもよい製品が出荷されることはありません。

Read more at location 467


優れたコンセプトやデザインが立ち上がったら、その形を劣化させずに製品化させることが大切です。製造部門や開発部門が「これはできない」「あれはできない」と言って最初のコンセプトやデザインを劣化させたり、営業部門などが「あの機能もこの機能も足してくれ」と言って最初のコンセプトを破壊したりしないように細心の注意を払う必要があります。

Read more at location 470


優れた製品やサービスは、どれも極めて分かりやすいコンセプトの上に築かれています。そのコンセプトが売る側の願望ではなく、顧客側のメリットを簡潔に言い表したものでないと売れる製品は作れません。また「他社が作っているから我が社も作ろう」などというのは製品コンセプトとは呼べませんし、そのようなやり方ではモデルにした製品を超えることも、有効な差別化を図ることもできません。すると競争力のある製品は生まれませんから、価格競争の消耗戦に突入するしかなくなってしまいます。

Read more at location 477


製品のコンセプトは「世界一クールなパソコン」と、明快なことは明快でした。しかし「クールなパソコン」では顧客のメリットを何も説明していません。開発中、私は部下や同僚たちと「これが発売になったら買おう!」とずっと言っていたのに、予定価格を知った途端に気持ちが萎えてしまったのをよく覚えています。

Read more at location 496


2007年3月に発売されたアップルTV(注30)は、「家庭のリビングルームに入り込む」ことが目的とされました。しかし顧客にどんなメリットを提供してリビングに入り込むのか、といういちばん大切な部分についてコンセンサスがないままに開発が始まったのです。

Read more at location 503


これから何が流行るか」を考えるのではなく、自社が顧客に対してどんなメリットを提供できるかを考え、そこから製品やサービスのコンセプトを定義していくのが大事な点です。

Read more at location 548


た。  1つ目の問題点は、どうしても最初に作った計画に縛られがちなことです。変化が激しい時代ですから開発途中に市場の動向が変わったり、あるいは途中でより優れた実装方法などが考案され、計画の変更をした方が理にかなう状況が発生したりします。しかし最初に計画ありきの「登山感覚」の開発はこうした変化に柔軟に対応しづらいのです。また最初に設定した現実的ではないゴールにとらわれて、やめるにやめられず開発コストがズルズルと上がっていき、見直すタイミングを失ってしまうこともあります。

Read more at location 661


2つ目の問題点は、なまじチェックポイントが決まっているが故に、開発状況を頻繁にチェックしようという意識が薄れてしまうことです。そしてチェックポイントが来たときに初めて問題に気付き、バタバタと慌てるハメになります。その結果スケジュールが延びてしまったり、品質が妥協されたままズルズルと出荷に至ってしまったりということが起こりがちです。そして一度そういう前例ができてしまうと「どうせスケジュールが延びるだろう」「この程度の品質でいいだろう」と誰もが高をくくるようになり、ますます品質が低下していきます。

Read more at location 667


アップルは「団体責任」のような責任の問い方をせず、個人個人の社員に責任を帰しています。この個人個人の責任を追及するやり方が、それぞれの社員の力を発揮させるうえで非常に重要な役割を果たしています。

Read more at location 762


創造性を豊かにするには自由をたくさん与えて伸び伸びさせることが大切である、というような「神話」があります。しかし私の経験では自由を与えるとむしろ創造性が下がります。創造性を引き出すのに必要なのは自由ではなく、むしろ適切な制約です。

Read more at location 1141


社会的手抜き(注46)」(social loafing)という現象をご存じでしょうか? 社会的手抜きとは、集団で共同作業をすると、人数の増加に伴い一人ひとりが徐々に手抜きをするという現象です。

Read more at location 1215


集団をうまく作用させると、一人で働くときよりもアウトプットを高めることもできるのです。これは「社会的促進(注48)」(social facilitation)と呼ばれ、他者の存在によって、個人の作業が肯定的な影響を受ける現象です。例えば観客がたくさんいる方が実力を発揮できるスポーツ選手や歌手、あるいは一人で走るよりも数人で一緒に走った方が速く走れる、なども社会的促進の一例です。

Read more at location 1226


実際どんな人を雇うのでしょうか? ひと言で言えば即戦力になる人を雇います。「そんな人いるもんか!」と思う人もいるでしょう。しかしシリコンバレーには雇ったその日から役立つ人が実際にゴロゴロいます。シリコンバレーの会社ではどこも仕事の進め方は似たり寄ったりですし、どの人も開発なら開発、マーケティングならマーケティングとずっと同じ畑で自分のキャリアを育ててきた人が大半なので、新しい会社で右も左も分からない、などということはあまり起きないのです。転職5回などというのはごく普通ですので、採用される側も慣れたものです。

Read more at location 1407


私が採用時に気を付けていたことにはさまざまな点がありますが、特に重要視していたのは技術力が高い人を採る、社会性に欠ける人は採用しない──の2点です。どんなに技術力が高くてもあまりに社会性に欠ける人ではやはり仕事になりませんし、逆にどんな人当たりのいい人でも、技術力がないと仕事にならないからです。

Read more at location 1419


面接は自分や部下5人程度で行っていました。5人がバラバラに面接し、あとで全員の意見を聞いて採用を決めました。自分が面接に必要な専門知識が足りない場合には、他部署から信頼できるエンジニアを借りてきて面接を手伝ってもらうこともあります。5人ぐらいで面接して話を聞いてみると、候補者の話していることの矛盾を洗い出すことができます。

Read more at location 1423


米国流の人事評価方法に興味がある方は、模範的な評価の書き方などもネットにたくさんありますので、ネットで「Performance Appraisal examples」などと入力して検索してみてください。

Read more at location 1491


日本は日本語の壁や人材流動性の低さにより職が守られており、一度就職すると基本的にはなかなか転職することもありませんが、私は遠からぬ将来、日本もシリコンバレーもあまり変わらなくなるのではないかと思っています。

Read more at location 1501


人間はちょっとだけ難しいことにチャレンジしているときがいちばんやる気が出る(

Read more at location 2058

2017年の振り返り -意志とエゴ-

2016年の振り返り -罪と罰- - valid,invalid

2017年の目標 -1年の目標を立てるのをやめる- - valid,invalidに書いたように、2017年は通年の目標を持つのを止めてみた。代わりに各月に何かしらに注力するという制約を付け、以下の活動に取り組んだ。月数が合わないのは、この取り組みに飽きてサボった月があるからにほかならない。


1月: 英語学習

2017年の2月から非日本語話者が東京オフィスに入社するということでようやく重い腰をあげて学習を始めた。かなり集中して英語力の底上げを測っていて、毎日欠かさずオンライン英会話をやったが3ヶ月で燃え尽きた。

最近はもうダメ。

2月: 健康

なんと2017年には一度も風邪を引かなかった。2016年までは年に4,5回は病院に行っていた記憶がある。

ジム通いは引越し以降やめてしまったが、自宅でできるトレーニングや健康に対するほどほどの意識の高さを保てているのはこのときに"基礎"を作ったからだと思う。

3月: 無

"無"です。

4月: ゲーム

毎日ゲームをやることを自分に許した。ニーアオートマタしかできなかったがめっちゃ良かった…。

5月以降はまったくゲームをしなかったので心が老いてしまったのかもしれない。

5月: 物件探し

頑張って物件探した様を書いた記事がなぜかバズった。みんな不動産屋きらいなんだね…。

ohbarye.hatenablog.jp

6月: Clojure

Clojure をちょっと勉強してた。けど手に"馴染む"前に手放してしまった。

7月: 無

"無"、です。この月の唯一の功績はドラム式洗濯機を買ったこと。

8月: OSS

buildersconに参加して"何か"をやりたい思いが強くなり、OSS活動を少し頑張った。年間で出したPRは23本

自作のものでは kpt-bot が podcast で紹介されたreview-waiting-list-bot が今までで最もスターを集めたけど目標の20には届かなくてやや無念。

その他にも幾つか gem を作った。8月の話ではないが、話題になった dev.to に記事も書いたりしてみた。記事を書いた後にスターがいくつか増えていて優しい世界だった。

Masato Ohba - DEV

9月: 無

"無"、なんだよなぁ…。転職から2年経った振り返りを書いていたようだ。

10月: お金周り

グズグズだったお金周りを整理したので安心して投資ができる。

ふるさと納税で貰った魚と肉が美味い。

11月: HIPHOPダンス

週一のペースで通い続けているものの、未だに Up/down をひたすら繰り返している。

12月: 暗号通貨

120万ほどの含み益が出た。前年の所得が確定したところでそろそろ利確しようかなぁ。


総括

やはり通年の、それも個人的な目標を掲げて達成に向けた行動をし続けるのは俺には向いていないとつくづく思った。たった30日という縛りの中ですら簡単に興味関心が移ろってしまう。また、熱いうちに何かの行動に移せなければ抱いたはずの情熱も一瞬で霧散する。

意志の弱さを克服するというアプローチも有りだと思うのだが乗り気でない。その時やりたいと思ったことを深めたり実行することが最も自分の心を大きく動かすと知っているからだ。

とはいえ今年は嫌々ながら何らかの"ちから"で自分の意見をあえて表明せずに収めるいわゆる"大人"の場も多くあった。2018年はもっとエゴイストになろうと思う。「人は感動するために生きている」*1のだから…。

*1:『宮本から君へ』参照

gulp-util の問題、deprecation warning と migration path について

2017年12月28日に The Problem with gulp-util という記事が公開された。

medium.com

gulp をウォッチしていたわけではないのだが、たまたま残された gulp 資産を触っている時に deprecation warning がコンソールに出力され、そのメッセージ中にこの記事へのリンクがあった。

warning gulp > gulp-util@3.0.8: gulp-util is deprecated - replace it, following the guidelines at https://medium.com/gulpjs/gulp-util-ca3b1f9f9ac5

記事の内容を要約すると以下のようになる。

TL;DR

  • gulp v4 リリースにあたり gulp-util はもう deprecation です
  • gulp-util はただの便利関数群なので使用している機能に応じて個別のライブラリに置き換えてください
  • 6752個ものライブラリが依存している… migration を手伝いましょう

同記事を抄訳したり加筆したりしつつ、もう少し詳細を見ていく。


A little postmortem

先週 GitHub で公開した gulp v4.0.0-alpha.3、これが破壊的変更を含むとは知っていたがどれほど広範囲に影響が及ぶかは想像していなかった。これは gulp-util に依存する6,752個のモジュールのためだ。だいたいは古くなった Vinyl を使用している*1

Why deprecation now?

gulp-util はただのモジュールの集まりなので2014年以来ずっと廃止するつもりでいた。ロギングのためだけになぜその他の無駄なモジュール、たとえば beeper もダウンロードしなければいけないのだろうか?プラグインのダウンロードサイズを大幅に増やすだけだ。皆がそれぞれ必要とする個々のモジュールを使うよう期待していたが、みな現状維持を選んでしまったらしい。

移行パスはそう複雑でないと踏んでいたが、先週の変更でこれは予想以上の大きな問題だとわかった。 古い Vinyl には互換性がないにも関わらずいまだ多くのプラグインで使用されている。 しかし Vinyl v2 は glup-util 付きではリリースされない。これは、我々がプラグインの作者たちに個々のモジュールへ移行してもらいたいからだ。

結果、gulp-util で警告を出すことにした。これは私たちが望んでいたエレガントな移行ではないのだが…。もしあなたが使用するプラグインが gulp-util に依存している場合、インストール時に deprecation 予定が通知される。修正を行うまではどのプラグインが警告を引き起こしているのかは分からない。

もし gulp-util に依存したプラグインが gutil.File API を使用していないのなら、そのプラグインは壊れていないかもしれない。 その場合は緊急ではないが、それでも gulp-util から離れるべきだ。

Help us fix the ecosystem

これらの手順でプラグイン作成者の gulp-util からの移行を助けよう。

  1. npm ls gulp-util を実行して、依存するプラグインのリストを取得する
  2. それぞれのプラグインに対して npm issue {PLUGIN NAME} を実行し、issue tracker をブラウザで開く
  3. issue をオープンするか、以下の API を置き換えて gulp-util を削除するようにした pull request を作る

※ コードの例は自分が実際に置換するときに使った方法(随時追記する、かも)

const gutil = require('gulp-util')
new gutil.File()

# should be

const Vinyl = require('vinyl')
new Vinyl()
const gutil = require('gulp-util')
gutil.replaceExtension(path, newExtention)

# should be

const replaceExt = require('replace-ext')
replaceExt(path, newExtention)
const gutil = require('gulp-util')
gutil.colors.red(message)

# should be

# Node 4 以降
const fancyLog = require('chalk')
chalk.red(message)

# Node 0.10 のような古いバージョンをサポートする場合
const colors = require('ansi-colors')
colors.red(message)
const gutil = require('gulp-util')
gutil.log(message)

# should be

const fancyLog = require('fancy-log')
fancyLog(message)
const gutil = require('gulp-util')
gutil.template(tmpl, data)

# should be

const template = require('lodash.template')
template(tmpl)(data)
const gutil = require('gulp-util')
gutil.env.production

# should be

const parseArgs = require('minimist')
const env = parseArgs(process.argv.slice(2))
env.production
const gutil = require('gulp-util')
gutil.noop()

# should be

const through = require('through2')
through.obj()
const gutil = require('gulp-util')
new gutil.PluginError()

# should be

const PluginError = require('plugin-error')
new PluginError()

(抄訳終わり)


現状

gulp-util, gulp のメンテナを中心に以下の issue でエコシステム全体のマイグレーションを進めている。

github.com

6,000個以上もあるので全てをまかなうのは無理そうだが、多く利用されているものから順次対応していくそうだ。

言い換えればコントリビューションチャンスなので自分も幾つか Pull Request を出してみた。メンテナがかなり精力的に色んなライブラリを直しているようなので、作業がバッティングしないよう issue や PR をちゃんとチェックするか、マイナーなライブラリから始めるとよさそう。まぁ、gulp 周りは死んでいるライブラリも多いのでマイナーなものだと永遠にマージされない可能性もあるが…。

github.com

github.com

*1:Vinyl は仮想ファイルオブジェクトを扱うライブラリ。ビニールと書くと聞き馴染みがある

仮想通貨取引を40万円で始めてから2ヶ月で120万円の含み益

雰囲気で仮想通貨をやっているメモです。技術的な話は出てこない、マネーゲームにフォーカスしたメモ

f:id:ohbarye:20171229092220p:plain

ただのメモだがあとで怒られないように disclaimer 書いておかないと…

Read the Disclaimer: Trading is a highly risky activity. Do consult your financial advisor before making any decisions. I will not be responsible for any trading decisions.

なお、この記事を閲覧する皆さんのコンピュータリソースを使ったマイニングは行っておりませんが、取引所へのリンクはお馴染みのアフィリエイトです*1

ちなみに「ぜんぜんわからない」でおなじみのインベスターZは私のようなド素人には面白いです。以下もアフィリエイトリンクです

歴史

簡易版

  • 販売所でコインを高速で出し入れしたら損した。焦らずホールドすることを学ぶ
  • 管理するのも情報集めるのも絞らないと面倒、主要コイン以外売って乗り換え
  • 手数料が小さい取引所だけを使う(スプレッドが大きい販売所は使わない、手数料の大きい取引所も使わない)
  • 利益使ってICOも1つだけ参加してみた
  • あとはひたすら放置

10月

11月

  • 購入するには取引所に登録する必要があると知る
  • 名前を知っている bitFlyercoincheck に登録した
    • 今ほど申し込みが殺到していなかったようで数日で登録できた
  • 両方に20万ずつ、計40万円入金した(今のところココからの追加投資なしでやっている)
  • ビットコイン高ぇな… おっ イーサリアムというのが比較的安いしアゲ調子じゃん、買ってみよう
    • 1日で1万円ぐらいの含み益になってボロい!!と思う
  • 調子に乗ってモナコイン、ライトコインなどばらばら買ったり売ったりしてみたら、買った瞬間に資産がシュッと減るのを目撃した
  • どうやら高速で出し入れすると損するらしいな?気付いたら4万円ぐらい損していた

    • 買値と売値の差(スプレッド)を知る
  • もしかして高速で出し入れしなくても、相場が全体的に右肩上がりなので保有していればそのうち益が出る…?と気付く

  • 11月の終わりに、そういえば bitFlyer しか触ってねーなと気付いて coincheck もチェックし始める

    • 単価の安いやつがいっぱいいたのでてきとうにバラバラと買う

12月

  • ADAコインってのが良いらしいな?(Twitterで見かけて ADA(エイダ)コインとは?最新ニュースや今後の将来性についてまとめてみた – 丸の内OL3年目 玲奈の仮想通貨の投資ブログ~2018年最新トレンド を読んだだけ)
    • 日本の取引所で扱ってないらしい
    • 海外取引所 bittrex のアカウントを作ってみた
    • 日本円の入金はできないので bitFlyer で BTC を買って送金し、2,200ほどADAを買う
    • これが初めての送金体験で「遅っ」と思ってブロックチェーン技術にようやく興味が湧いてきた
  • 長らく含み損だったモナコインが12月に高騰し、ようやく含み益になった
  • この頃よくわからんコインも色々持っていたが各々含み益になった瞬間に売っぱらって XRP, XEM に振り直した
  • 販売所ではなく取引所を使おう、取引所の中でも手数料が安いところを使おうということを"先輩"から教わった
    • 国内では Zaif or bitbank、海外では binance が良いとのことで既存資産を全部そのへんに移すことにした(未完了)
  • 絞っていた XRP, XEM, ADA がそれぞれ高騰し、50万円ぐらいの含み益になった
  • ICO にも興味が湧いたので10万円ほど利確して tokenPay のICO に参加してみた
    • 1月にどうなるか…
  • 2017/12/29時点で70万円の含み益になった
  • と書いた直後に XRP, ADA あたりが高騰し、2017/12/30時点で120万円の含み益になった

今後

  • 面倒くさそうなので確定申告やりたくないかつ来年の節税のために今年中の利確は20万円以下に抑える
  • 絞った通貨をホールドする方針
  • 増資は当面しないかな…

使っているツール・サイト

Coinboard

coinboard.me

複数の取引所を使っていると資産管理がめんどうなので、API連携して自動更新してくれて最高。

他にもポートフォリオを記録するアプリあるけど、手動入力のやつが大半で辛くないですか…

binance にもそろそろ対応するらしいので、そうなると自分が利用している取引所は全てカバーされて最強になるので開発大変そうだけど頑張って欲しいです。

Cryptact

tax@cryptact: 仮想通貨の困難な所得計算を簡単に。メニューバーのサービス名をクリックすればすぐにお使いいただけます。

tax@cryptact - Cryptact

取引所からダウンロードできる取引記録をアップロードすることで所得計算をシュッとやってくれるサービス。ちなみにこの記事は Cryptact にアップロードした取引履歴を見ながら振り返って書いた。

こちらも開発大変そうだけど頑張って欲しいです。

CoinGecko

www.coingecko.com

1,000種類ぐらいある通貨の各種指標をチェックできるサイト。保有銘柄の確認だけでなく新規の発掘にも使えるのかもしれない

MoneyForward

moneyforward.com

今のところ bitFlyer, coincheck, Zaif は自動でデータ連携できる。それ以外は手動入力で資産管理しており、厳しい

その他

Twitter で界隈の人をフォローしたり仮想通貨関連のニュースサイト*2を見たりしているがバイアスがめちゃかかる。保有銘柄や仮想通貨そのものに関する良いニュースばかり流れてきて良い気持ちになってしまう

勉強

まったくしていない 雰囲気で仮想通貨をやっている

実は仮想通貨関連の用語を調べたり株やFX界隈の用語を学んだりしし、初めのころはかじっただけのテクニカル分析を利用したり、利確10%損切り5%みたいなルールを決めて売買してみたりもした。が、ぜんぜん通用しなかった。

ある程度の長期ホールドを前提とした今のやり方だとあまり役に立たないのかもしれない

また、技術的な興味は売買をする中で遅れてやってきたのでこれからやってみようというところ

リスク

暴落は全く怖くない 一番恐れるのはこの熱狂がやがて風化してしまわないかということだ

所感

最近よく見るようになった仮想通貨で儲けた/損した系の記事に対してとにかく言いたいのは「とにかく数字を書いてくれ頼む」ということ

私のような小市民の眼前にどのような機会が転がっているのか明らかになっていてほしい…

そんな思いから具体的な金額を書いたので下から目線*3やマウンティング*4目的のコメントは No, thank you. です


年初に 2017年の目標 -1年の目標を立てるのをやめる- - valid,invalid で書いたように今年は30日ずつ何かを頑張ることにしており、仮想通貨投資はその一環でもあった

*1:特に binance はアフィ効率がとても良いらしい https://www.binance.com/?ref=12962001

*2:http://coinpost.jp/ とか

*3:e.g. 「自慢?」「元金用意できない人の気持ちも考えてください」

*4:e.g. 「しょぼw」「俺はもっと稼いだけどw」

Rails で Slack のような Magic Link による認証を実装する

passwordless という gem が最近リリースされたようなので少し触ってみた。

名前の通り認証時にパスワードを必要とせず、いわゆる Magic Link によるログイン機構を Rails アプリケーションで実現できる。

Magic Link とは

Slack や Medium が実装しているこの機能は「リンクを知ることのできる立場にあれば本人であろう」という二要素認証に似たアイデアに基づいている。

ユーザーがパスワードを覚える必要がないというUX観点だけでなく、パスワードによる認証の弱点とされる推測やブルートフォース攻撃による不正アクセスや乗っ取りのリスクを低減できるメリットがあるとされている。

japanese.engadget.com

postd.cc

とにかく試す

test/dummy ディレクトリにダミーの Rails アプリが実装されているので clone して起動するだけで試すことができる。今回の記事はこれを読みつついくつかコマンドを叩いただけにすぎない。

git clone git@github.com:mikker/passwordless.git
cd passwordless
bundle
bin/rails db:migrate
bin/rails s

DBの変更

db:migrate で作られるテーブルたちを見てみる。

rb(main):001:0> ActiveRecord::Base.connection.tables
=> ["schema_migrations", "ar_internal_metadata", "passwordless_sessions", "users"]

以下の3つは特に気にしなくてよい。

特筆するのは passwordless_sessions だ。

このテーブルは PasswordlessSessions class に結びついている。bin/rails passwordless:install:migrations コマンドで生成される、文字通りセッションを管理する。格納されるデータがどのようなものかについては後述する。

Magic Link の挙動

ユーザー作成

まずログインするとこんな感じの画面が見える。nil の部分にはログイン状態であればユーザー情報が表示される。

f:id:ohbarye:20171220005752j:plain

Sign in できるユーザーが存在しないので New User から sign up する。

f:id:ohbarye:20171220005804j:plain

Sign up すると create したユーザーで sign in した状態になる。Create 直後に呼んでいる Passwordless::ControllerHelpers#sign_in を見るとわかるように、単に cookie に token をセットしているだけ。

f:id:ohbarye:20171220005831j:plain

この時の response を覗いてみると Set-Cookie header が付いているのがわかる。

Set-Cookie: user_id=SjU3d1FBZ04vOXc1dTB3c1lIbnRHUT09LS1BbW5KczczNkRQbUd6MzBzUU5XRGx3PT0%3D--0f10eb4a45ebf818056d04ffb90b5659ac4dce08; path=/; expires=Sat, 19 Dec 2037 14:44:23 -0000
Set-Cookie: _dummy_session=dHNqVzlqakt5K1VSc0d5VE1aLzR0SUVYRnM4NVlUQnRhSW9CNXI0NnMyMnhKby95L3VJTERZN1ZyT3RnVFNmZkI2NWViN2NjYm8wS3UrSlN6eWwvaW93WGRENDF3MHN3REdqRjY4SzFBYVpZOWxQYmpmQmpxMkNYTVpROEdIL1JIYkVLNzRheXJmOHN3T0g3RUJneVZNd1FsUXNXeC9QQloxZ1ZhM3JzOHUrOGtleThTSXlzaytkOXl3MTdUVjhNK2Z6aWZpOTZiQUVBaTA4STZ2LzlHc0llWGVaWmpvWVE0RjlTdm54elBRN1QxU21Pc3NEL3NqQUlaRVlkZE1QVC0tNENDRW12UTJwY2xrY0Y2WHRQempaQT09--13e0a4893161060d7fee5357d403eb407efc3b12; path=/; HttpOnly

Magic Link

ユーザーができたので sign out して sign in ページへ。

f:id:ohbarye:20171220005852j:plain

Send magic link を押すとメールが送信される。

f:id:ohbarye:20171220005927j:plain

サーバー側では Passwordless::Session が create されている。データを見るとわかる通りセッションの有効期限も自動的にセットされる。デフォルトで1年後になっているがこのあたりは後々カスタマイズ可能になるかもしれない(オープンクラスなどでできなくもないが避けるのが無難そう)。

irb(main):013:0> pp Passwordless::Session.last; nil
#<Passwordless::Session:0x00007fe85dea6508
 id: 1,
 authenticatable_type: "User",
 authenticatable_id: 2,
 timeout_at: Tue, 19 Dec 2017 15:52:57 UTC +00:00,
 expires_at: Wed, 19 Dec 2018 14:52:57 UTC +00:00,
 user_agent:
  "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/63.0.3239.84 Safari/537.36",
 remote_addr: "::1",
 token: "PR5h4ZHwAHIidrsMGFyU91ji8KwCgfSZ9PBhOvMQjPo",
 created_at: Tue, 19 Dec 2017 14:52:57 UTC +00:00,
 updated_at: Tue, 19 Dec 2017 14:52:57 UTC +00:00>

Magic Link の在り処はどこだろうか。letter_opener や mailcatcher のような便利gemは bundle されていないので console を確認する。Magic Link が記載されたメールがログに出力されている。

Passwordless::Mailer#magic_link: processed outbound mail in 28.8ms
Sent mail to over.rye@gmail.com (9.3ms)
Date: Tue, 19 Dec 2017 23:52:57 +0900
From: CHANGE_ME@example.com
To: over.rye@gmail.com
Message-ID: <5a3927c99da8f_140273fc69a1ca14c261a@ohbas-MacBook-Pro.local.mail>
Subject: =?UTF-8?Q?Your_magic_link_=E2=9C=A8?=
Mime-Version: 1.0
Content-Type: text/plain;
 charset=UTF-8
Content-Transfer-Encoding: 7bit

Here's your link:
http://localhost:3000/users/sign_in/PR5h4ZHwAHIidrsMGFyU91ji8KwCgfSZ9PBhOvMQjPo

http://localhost:3000/users/sign_in/PR5h4ZHwAHIidrsMGFyU91ji8KwCgfSZ9PBhOvMQjPo にアクセスしてみるとログインした状態でページが表示された!!

f:id:ohbarye:20171220005948j:plain

Sign out して再度同じ URL にアクセスするとセッション期限切れとしてきちんとエラーになる!!

f:id:ohbarye:20171220005957j:plain

routes

上記users/sign_in のような URL はどのように生成されるのだろか?

使用者は routes.rbpasswordless_for を書く。PasswordlessRouterHelpers.passwordless_forPasswordless::Engine を mount していることがわかる。

Rails.application.routes.draw do
  passwordless_for :users
  resources :users
  
  # others
end

routes 一覧を表示してみると Routes for Passwordless::Engine: の直下に生成された routes が見える。

$ bin/rails routes
          Prefix Verb   URI Pattern                  Controller#Action
           users        /users                       Passwordless::Engine {:authenticatable=>"user"}
                 GET    /users(.:format)             users#index
                 POST   /users(.:format)             users#create
        new_user GET    /users/new(.:format)         users#new
       edit_user GET    /users/:id/edit(.:format)    users#edit
            user GET    /users/:id(.:format)         users#show
                 PATCH  /users/:id(.:format)         users#update
                 PUT    /users/:id(.:format)         users#update
                 DELETE /users/:id(.:format)         users#destroy
   registrations POST   /registrations(.:format)     registrations#create
new_registration GET    /registrations/new(.:format) registrations#new
          secret GET    /secret(.:format)            secrets#index
            root GET    /                            users#index

Routes for Passwordless::Engine:
      sign_in GET        /sign_in(.:format)        passwordless/sessions#new
              POST       /sign_in(.:format)        passwordless/sessions#create
token_sign_in GET        /sign_in/:token(.:format) passwordless/sessions#show
     sign_out GET|DELETE /sign_out(.:format)       passwordless/sessions#destroy

他の gem は?

つい最近 Sorcery でも同様の機能が実装されたようだが 2017/12/20 時点ではまだリリースされていないようだ。

github.com

この他にもいくつか実装サンプルや野良 gem を見つけたがデファクトぽいものは見つからなかったのでもしかしたら passwordless は流行るかもしれない。名前もわかりやすいし。