shobylogy

叩けシンプルの杖

bitFlyerの過去チャートを取得するAPI

bitFlyer公式では現在の価格を取得するAPIしか提供されていない。

ビットコイン取引所【bitFlyer Lightning】

過去のチャートを取得するにはCryptowatchというサービスのAPIを利用する。*1

Public Market REST API - Cryptowatch Docs

エンドポイントは以下。*2

https://api.cryptowat.ch/markets/bitflyer/btcjpy/ohlc

periodsというパラメータで何秒区切りかを指定でき、beforeとafterというパラメータにUNIX timestampを投げることで時間の指定もできる。

1日足で、2017/01/01以降のチャートを取得したい時は以下のような感じ。

https://api.cryptowat.ch/markets/bitflyer/btcjpy/ohlc?periods=86400&after=1483196400

Rate limitはCPUの処理時間ベースでかかる。

また、過去のチャートは無限に取得できるわけではなく、Cryptwatch上のチャートで閲覧できる範囲内しか取得できないようなので注意。 5分足などの短い間隔だと短い期間しか取得できない。

実際のチャートを参照しながら取得する範囲を決めると良い。

BTCJPY - bitFlyer リアルタイムチャート - Cryptowatch

*1:bitFlyer Lightningのチャート画面でも使われているサービス

*2:OHLCとはOpen-high-low-close chartの略で、海外でローソク足の代わりに使われているチャートらしい

Skype英会話のすゝめ

Skype英会話を始めて約3年が経ち、皆さんにも是非おすすめしたいと思うようになってきたのでこの記事を書きました。

概要

  • Skype英会話を始めて変わったこと
  • 良いところ
  • いまいちなところ
  • おすすめの学習ステップ

Skype英会話を始めて変わったこと

英語を話すことに抵抗感がなくなりました。 具体的には、英語で自分の意見を伝えることができるようになりました。

良いところ

安い

Skype英会話は1日1回30分受けられて、1ヶ月6000円程度が相場です。 普通の英会話教室なら、1回のレッスンが6000円程度からだと思います。

恥ずかしくない

Skypeで1対1で話せるので、どんなに下手でも恥ずかしさがありません。

低いモチベーションで続けられる

教室に通ったりする必要がないので、おそろしく低いモチベーションで続けられます。 最近は寝起きにパジャマでレッスンを受けてます。

いまいちなところ

  • 講師の質がバラバラ
  • 高レベルの英語学習には向いていない

講師の質がバラバラ

講師の質が一定ではありません。 Skype英会話の安さは人件費の安さから来ているのが原因です。

英語圏の発展途上国で学生のアルバイトを雇っていることが多いです。(だいたいフィリピン)

そのため、質の低い講師はやる気がなかったり、発音に癖があったり、おそろしく早口で全然聞き取れなかったりします。

必然的にベテランの講師や、優しい講師には人気が集まり、予約が困難になります。

高レベルの英語学習には向いていない

ビジネス英語や、学術英語、技術英語など、高レベルの英語学習には向いていません。 基本的に講師は英語教育のプロフェッショナルではないためです。 ある程度英語が話せて、さらに高いレベルを目指す方は、ビジネス英会話のスクールに通いましょう。

おすすめの学習ステップ

以下の順で学習していくとモチベーションが保てるような気がします。 (ラングリッチ以外のレッスン教材については把握してないのでなかったらごめんなさい)

  1. 発音レッスン
  2. TEDレッスン
  3. 講師の専門分野について聞く

発音レッスン

最初に発音レッスンを受けておくと、英語を話す恥ずかしさがだいぶ軽減されます。

「あ、今自分、なんか英語っぽい発音してるわ!」と思えるようになると、話すことに対する抵抗感が減ります。

TEDレッスン

TEDのビデオを見て、それについて話すレッスンです。 TEDは単純に見ていて面白いので、飽きずに続けることができます。

この辺り、おすすめです。

脳科学者自身が脳卒中で脳の機能が停止していく体験を語った話

ジル・ボルト・テイラーのパワフルな洞察の発作 | TED Talk | TED.com

養殖している魚の20%を鳥に食べられる風変わりな養殖場の話

ダン・バーバー: 魚と恋に落ちた僕 | TED Talk | TED.com

初級編のレッスンはものすごくつまらないので飛ばして面白そうなレッスンをやりましょう。 日本人は、中学高校で最低6年間、英語を学習しているので、話すことに対する抵抗感さえなくなれば、初歩の初歩のレッスンはやる必要がないと思います。

講師の専門分野について聞く

TEDレッスンに飽きたら、講師の専門分野について聞いてみましょう。 レッスン教材をやるよりも、深くて面白い話が聞けると思います。

講師は大体が大学生なので、自分の専門分野を持っています。 心理学、会計、経営学や起業について勉強している人もいました。

最近僕は、政治学を専攻していた講師に政治の話を聞いています。 難しすぎて目が覚めます。

まとめ

私の場合、Skype英会話を始めたことで、英語を話すことに抵抗感がなくなりました。 Skype英会話は安くて、恥ずかしくなく、低いモチベーションでも続けることができます。 ただし、講師の質がバラバラで、高レベルの英語学習には向いていないので注意が必要です。

発音レッスン、TEDレッスン、講師の専門分野について聞く、という順でレッスンを受けると、飽きずに続けられるような気がします。

分離型キーボードを買ったら肩こりが改善した話(Mistel Barocco)

最近、肩こりが悩みだったのですが、分離型キーボードを買ったら改善しました。

買ったのは、Mistel Baroccoというコンパクトなタイプの分離型キーボードです。*1

このような感じで仕事をしています。

なぜこれを選んだの?

手軽に入手でき、Happy Hacking Keyboardに使用感が近そうな分離型キーボードだったからです。

握力王の記事を読んでからErgoDoxも気になっていたのですが、入手と習得に時間がかかりそうだったので見送りました。

良かった点

胸を張って姿勢良くコーディングができるためか、肩こりが軽くなりました。 特に肩の前側から胸にかけての張りが少なくなったように感じます。

また、Macを中央に置いて、トラックパッドと併用できるのが便利でした。

キーボード自体の使用感もなかなか快適で、Happy Hacking Keyboard を使ったことのある方は1日使えば問題なく移行できると思います。

いまいちだった点

キーマップに癖があり、またカスタマイズの難易度も高かったです。

キーマップに関しては、~(チルダ)と`(バッククオート)の入力に癖があり、それぞれShift+ESC、Fn+ESCという入力に慣れるまでに時間がかかりました。 カーソルキーもFnとの組み合わせで入力が必要です。

カスタマイズに関しては、説明書を読んだだけではいまいち分からず、こちらの記事が大変参考になりました。

右CommandキーがFnキーとして使われており、Fnキーを他の箇所に移動させてからでないと右Commandキーをリマップすることができず、小一時間悩みました。

合わせて買った方が良いもの

左右のキーボード同士を繋ぐMicroB-to-MicroBケーブルがスパイラル式で微妙なため、ストレートの長めなタイプのケーブルを買った方が快適に使用できると思います。

また、姿勢良くコーディングしようと思うと、予想以上に手首に負担がかかるため、パームレストの導入をオススメします。 FILCOの分離型ウッドパームレストのSサイズがぴったりの大きさでした。

まとめ

分離型キーボードのMistel Baroccoを買ったらコーディング時の姿勢が良くなり肩こりが改善しました。

Macを真ん中に置きつつトラックパッドを併用できるのが便利です。

若干キーマップに癖があり、カスタマイズの難易度も高いのは慣れと注意が必要です。

MicroB-to-MicroBケーブルと、パームレストは合わせて購入するのをオススメします。

FILCO ウッドパームレストS 分離型(2分割) FWPR/S

FILCO ウッドパームレストS 分離型(2分割) FWPR/S

*1:赤軸にしました

深夜に高熱を出した際にやったことと、使ったサービスまとめ

先日、深夜に39.4度の高熱が出てしまい、相当大変だったため、その時に使ったサービスなどをまとめておきます。

概要

  • 病院に行くべきか相談する
  • 病院まで行く
  • 病院で症状を伝える
  • 回復する

病院に行くべきか相談する

深夜に病院に行くべきか迷った際には、救急相談センターに電話しましょう。自己判断は禁物です。

東京都の場合は以下の電話番号です。地域ごとに異なるのでご自身でご確認ください。

東京消防庁<安全・安心><救急アドバイス><救急車の適正利用にご協力を!><救急車の適正利用のお願い!!>

救急相談センターに電話すると、看護師等の専門家が病院に行くべきかどうかの判断をしてくれ、救急外来のある病院を紹介してくれます。

おそらく本当にマズそうであれば、救急車を手配してもらえると思います。私の場合は意識もはっきりしており、自力で移動が可能だったため、自分で病院に行くことになりました。

自己判断をしない

自己判断はすべきでありません。理由は二点。症状で検索した場合の情報が信頼できないことと、高熱が出て意識が朦朧とした状態では正しい判断が行えないためです。

現在*1「高熱」などの症状で検索すると、キュレーションサイトや病気の人をターゲットにしたメディアばかりが上位に表示されます。これらのサイトは信頼性に乏しく、意識が朦朧とした状態では正しく情報の取捨選択を行うことができません。*2

病院に行く

自力で動ける場合はタクシーで向かいましょう。

自力で病院まで向かう場合、事前に病院に電話しておきましょう。

持っていくもの

  • 保険証
  • キャッシュカード
  • クレジットカード

深夜に急病になってしまった場合、手持ちに十分な現金がない場合があると思います。(私がそうでした) 大きな病院であればクレジットカード払いに対応している場合もあるので事前に確認しましょう。

タクシーの呼び方

都内に住んでいる方はUberを使ってください。伝える情報が少なくて済みます。

今回は普通にタクシーを呼んでしまったのですが、タクシー会社のサイトは画像で電話番号が書かれていることが多く、高熱が出ている状態では電話をかけることもかなりの難易度でした。*3

また、住所を伝えたり、待つのもしんどかったですし、Uberが使える方はUberを使ったほうが良いと思います。

病院で症状を伝える

医師や看護師の指示に従って、症状を可能な限り詳細に伝えましょう。

回復する

まず、会社に休みの連絡を入れましょう。その後、Amazon Prime Now、もしくはネットスーパーで、水分と食料を注文しましょう。

Amazon Prime Nowは風邪の時には本当に便利です。

ポカリスエットやミネラルウォーター、お粥やゼリーなども家にいながらにして入手できます。

水分をこまめにとって、ひたすら寝ましょう。

まとめ

深夜に高熱が出て、病院に行くべきか迷った際には、救急相談センターに電話しましょう。自己判断は禁物です。

自力で病院まで向かう場合は、まず病院に電話をし、Uberで向かいましょう。保険証、キャッシュカード、クレジットカードを持っていくのをお忘れなく。

病院に着いた後は、医師や看護師の指示に従って、症状を可能な限り詳細に伝えましょう。

その後は会社に休みの連絡を入れ、Amazon Prime Nowで水分と食料を注文し、水分をこまめにとってひたすら寝ましょう。

*1:2016/10/4当時

*2:Googleも医療情報の検索結果は改善を進めているようですが、今の所は信頼できないと言わざるをえません

*3:高熱の頭では電話番号を覚えて入力できず、二回諦めました

Swift + iOS 8のUITableViewControllerのバグを回避するためのSwiftLintカスタムルール

iOS 8のUITableViewControllerの実装にはバグがあり、Swiftでサブクラスを作ると、iOSのクラッシュが発生する場合があります。

今回はそれをSwiftLintで検知して回避するためのカスタムルールについて説明します。

なお、以下の説明はXcode 7.3.1 + Swift 2.2環境を想定しています。

Swift + iOS 8のUITableViewControllerバグとは

SwiftでUITableViewControllerのサブクラスを実装している場合、iOS 8での実行時にクラッシュが発生する場合があります。

具体的には、以下の条件を満たす際に発生します。

  • SwiftでUITableViewControllerのサブクラスを実装
  • letでpropertyを宣言
  • 独自のinitializerを実装し、内部でsuper.init(style:)を呼んでいる
  • init(nibName:bundle:) が未定義

具体的な以下のようなコードです。

class ViewController: UITableViewController {
    let id: Int
    
    init(id: Int) {
        self.id = id
        super.init(style: .Plain)
    }
}

上記の条件が満たされる場合、実行時に以下のようなエラーが出てクラッシュします。

fatal error: use of unimplemented initializer 'init(nibName:bundle:)' for class 'AppName.SubClassTableViewController'

これはiOS 8のバグが原因で、ビルド時にはエラーが出ず、実行時にしか検知することができません。

どうやら、UITableViewControllerの init(style:) 内で super.init(nibName:bundle:) ではなく、 init(nibName:bundle:) が呼ばれてしまっているのが原因なようです。

詳しい原因についてはこちらの記事が詳しいです。ご参照ください。 Swift 1.2 + UITableViewControllerで発生する問題と回避方法

このバグが厄介な点は、以下の3点にあります。

  • immutableなSwiftらしいコードを書いて初めて発生する
  • 実行時にしか問題に気づけない
  • 主流でない過去のバージョンのiOSでしか発生しない

そのため、チームのSwift開発力が向上したタイミングで問題が起き始め、過去のiOSのバグの対応に追われる羽目になります。

このバグへの対応策ですが、根本的にはiOS 8をサポート対象外にする以外はありませんが、以下のように回避策を取ることはできます。*1

  • propertyのletをやめてvarにする
  • nonoptionalをoptionalにする
  • init後に代入する
class ViewController: UITableViewController {
    var id: Int?
    
    init(id: Int) {
        super.init(style: .Plain)

        self.id = id
    }

    override init(nibName nibNameOrNil: String?, bundle nibBundleOrNil: NSBundle?) {        
        super.init(nibName: nibNameOrNil, bundle: nibBundleOrNil)
    }
}

発生条件を満たすすべてのUITableViewControllerに上記のような対応をする必要があり、対応が漏れていても実行時まで一切気づけないのがつらいところです。

そのため、SwiftLintのカスタムルールを使い、発生条件に相当するUITableViewControllerに対してエラーを出すことで、実行時にしか気づけない問題をビルド時に気づけるようにしました。

SwiftLintのカスタムルール

SwiftLintのカスタムルールを使うと、気合いや根性で解決していた問題をルールに落とし込むことができます。*2

今回は、以下の条件をすべて満たす場合にerrorを出すルールを作りました。

  • ファイル内にUITableViewControllerのサブクラスが実装されている
  • ファイル内にinit もしくは init?(という文字列が存在する
  • ファイル内に override init(nibName という文字列が存在しない
    ios8_table_view_controller_bug:
        name: "iOS 8 TableViewController Bug"
        regex: "class.+UITableViewController(?=[\s\S]*init(\?)?\()(?![\s\S]*override.+init\(nibName)"
        message: "Please implement init(nibName:bundle)."
        severity: error

以下のようなエラーが出て、対応漏れに気づけます。

f:id:shoby:20161002004703p:plain

ViewController.swift:11:1: error: iOS 8 TableViewController Bug Violation: Please implement init(nibName:bundle). (ios8_table_view_controller_bug)

まとめ

iOS 8のUITableViewControllerにはバグがあり、Swiftでサブクラスを実装している場合、実行時にクラッシュする場合があります。

この問題は実行にしか気づけないですが、SwiftLintのカスタムルールを使うことによりビルド時にエラー表示することができます。

このように、SwiftLintを使うと、気合いや根性でなんとかするしかなかった問題をルール化できるので、皆さんもご活用ください。

*1:公式のRelease Noteによれば、Objective-CのBridging Headerに特殊なコードを記入すれば、回避できるようですが、私の環境(Xcode 7.3.1 + Swift 2.2)ではうまく動きませんでした

*2:スクリーン計測用コードの実装漏れを防ぐこともできます

iOS DCの前夜祭で大規模リニューアルのノウハウについて発表してきました

だいぶ時間が経ってしまいましたが、 iOS DC 2016の前夜祭で、大規模リニューアルのノウハウについて発表してきました。

こちらが発表資料です。

この発表で伝えたかったのは「ノウハウがあれば、リニューアルは怖くない」ということです。

リニューアルがユーザーに酷評されてしまうのは、その変更自体が悪いのではなく、受け入れてもらうためのノウハウが足りなかっただけかもしれません。 発表内には、私の体験を元に「これを数年前の自分が知ってたら...」という知見を詰め込んでいます。

皆さんが力を注いで開発したリニューアルが失敗扱いされず、ユーザーに受け入れてもらえるのを願っています。

最後になりますが、iOS DCの運営をしていただいたスタッフの皆さんありがとうございました。

エンジニア向け日頃の疲れを取るおすすめの入浴剤

エンジニア、肩や腰が凝りますよね。

温泉に行きたい…でも忙しくてなかなか行けない。 そんな方は入浴剤を使って毎日の疲れを取るのがおすすめです。

今回は、私が日頃から使っている入浴剤を紹介します。

温泉に行きたい方はこちらをどうぞ

blog.shoby.jp

おすすめ入浴剤

  • きき湯 マグネシウム炭酸湯
  • きき湯 FINE FEAT RESET
  • クナイプ グーテナハト バスソルト

きき湯 マグネシウム炭酸湯

私が一番愛用している入浴剤です。

主成分として、硫酸塩泉に含まれる硫酸マグネシウムが配合されており、炭酸ガスと合わせて血行が改善されます。

硫酸マグネシウム - Wikipedia

製造元のバスクリンは、温泉成分を科学的に分析して入浴剤に生かしており、きき湯シリーズはその最新商品です。

きき湯シリーズには温泉成分が含まれ、擬似的に温泉と同じ効能が得られます。

www.bathclin.co.jp

私は基本的に毎日この入浴剤を使っています。約600円で12回ほど使えるため、常用しても問題ない価格です。

入浴後は、1時間以上は体がポカポカして、使い始める前と比べると、肩こりや腰痛が大幅に改善されました。

きき湯 FINE FEAT RESET

きき湯ファインヒート レモングラスの香り 400g 入浴剤 (医薬部外品)

きき湯ファインヒート レモングラスの香り 400g 入浴剤 (医薬部外品)

きき湯シリーズのハイグレードモデルです。 おそらくアスリートなどの体を酷使する人のために開発されているように思えます。

主要な温泉成分はきき湯シリーズとほぼ同じですが、生姜の粉末が加えられています。

生姜には体を温める作用があり、漢方薬としても使われています。

takeda-kenko.jp

私はひどく疲れた場合や、日頃の疲れが溜まった時にこちらを使っています。

体のコリがかなり改善されるように思います。

クナイプ グーテナハト バスソルト

クナイプBソルトGN850

クナイプBソルトGN850

きき湯シリーズは入浴自体で肩こりや腰痛を改善するタイプですが、こちらは入浴後に安眠して体力を回復できるタイプです。

入浴によるリラックスを目的としており、特に温泉成分としての効能はありません。

クナイプシリーズは効能ではなく香りで選ぶと良いと思います。

入浴剤を使った時の入浴の仕方

温泉でもそうですが、入浴剤を使った場合、お風呂に浸かった後にシャワーで洗い流さずに出るようにしてください。

体の表面に残った温泉成分が入浴後も作用し、体を温め続けてくれます。

まとめ

なかなか温泉に行けない時は入浴剤がおすすめです。

きき湯シリーズは温泉成分が含まれ、擬似的に温泉と同じ効能が得られます。

きき湯 マグネシウム炭酸湯は日常の疲労回復に効き、 きき湯 FINE FEAT RESETは日頃の溜まった疲れに効きます。

また、クナイプはリラックスによる安眠が期待できます。