Fablog [社会人マイナス1年生のブログ]

プログラミング 料理 ビットコイン

ReactNativeMeetUp #6 で学んだこと

ReactNative

最近自分が興味持っている分野でReactNativeというものがある ReactNativeとはFacebookが作ったReactを使ってモバイルアプリを作れるようにしたもの ReactNativeの良い点として

  • Web(っぽい)技術でモバイルアプリが作れる
  • iosandroidを1ソースで作ることもできる
  • WebView上で動くではなくNativeのViewを呼び出してくれる
  • ロジックに関してはwebとも共通化することもできる

があげられます。

むっちゃ便利じゃん!絶対はやるでしょ!

と思うのでReactNativeMeetUpという勉強会にて学んできました

ReactNativeで始める楽しいサービス開発 @YutamaKotaro

  • フロントエンジニアが余っててアプリエンジニアが居ないときにおすすめ
  • ios, android はViewを共通化することもできる
  • ios, andoid, web のロジックを全部共通化できる
  • 一部共通化で色んなレポジトリを扱うならmonorepoがいいよ
  • おすすめのライブラリ
    • formic, formをいい感じにしてくれる
    • react-native-push-notification
    • react-native-vector-icons
  • React native router flux の問題
    • React Navigation のAPIを使うようになった
    • つまりReactNavigationのラッパーになる
    • ので使うならReactNavigationの方が良さそう

ReactNativeの導入検討

  • DMM 英会話の話
  • Reactで作ってるらしい
  • ReactNative導入の問題点
    • 簡単に更新できない
    • 各国のカスタマイズ
  • どっちかというとアプリの問題点
  • ReactNativeが導入できるかは知らん、出来ると思う人は入社してくれ、という感じ

1ヶ月でのアプリ開発 地雷を踏み越えて

  • 沢山の地雷を踏んだらしい
  • displey:none がReactNativeのバージョンを上げると動かなくなった
  • Mobx お作法をわからずに書くとrenderが100回くらい呼ばれる
  • ReactNativeDebuggerでデバッグしながら最適化した
  • Reactを誰も使ったことがないから辛い
    • 1週間くらいで慣れた

Expoの話

  • Expoのいいところ
    • XcodeとかAndroidStudioとかを使わなくて良くなる
    • シミュレーターも要らない、QRコードを読み込めば実機でそのままデバッグ出来る
  • GUIぽちぽちすればいい
  • Expo SDK が充実しているので使うととても便利
  • ただ、NativeModulesが使えない
  • exp detach をするとNativeModulesを使えるようにできるけど、そうするとexpokitが使えなくなる

Expoの話 again @besutome

  • Expo思想の話
    • hello world をもっと早く
    • 実機確認をよりはやく
    • buildツールを1つに
    • expoに依存しない開発もできるよ
    • Nativeの機能は特殊な書き方になるけどできるよ(Expoが対応しているものは)

余談

懇親会でクラフトビールが配られていて最高だった🍺

Kotlinについて学んだ [Kotlin助走読本の要約]

概要

  • kotlinを書くことになった
  • kotlinユーザーグループという団体がKotlin助走読本を無料で配布している
  • 先輩に進められたので読んだ
  • 読むだけだと頭に入らないので簡単に要約した
  • 本体も86pと大分要約された本なので是非読んでみることをおすすめすする
  • 勉強になりました、kotlinユーザーグループの方々ありがとうございます

1章 Kotlinについて知る

1.1 Kotlinとは

  • KotlinはJetBrain社がJavaに代わり、より簡潔に書くことを目的として作られた静的型付き言語
  • JavaだけでなくJavascriptへのトランスパイルも可能
  • Javaと相互運用するように設計されているのでJavaプロジェクトの一部でKotlinを使うことも出来る
  • Androidで公式サポートされている

Kotlinを使うと何が嬉しいのか

  • Androidとの親和性が高い

    • Kotlin <-> Java でお互いのコードを呼び出すことができる
    • ランタイムメソッド数が少ないので64Kメソッド問題を回避しやすい
    • ライブラリサイズが少ない
    • JetBrainによる強力なIDEサポートが有る
  • 生産性が高い

    • data クラスのような様々な文法を使うことによって記述量を少なく出来る
    • コレクション操作などの便利な関数が用意されている
    • 拡張関数や遅延初期化や演算子オーバーロードなど様々な便利文法が用意されている
  • メンタビリティが高い

1.3 Kotlinの特徴

  • 静的型付け言語

  • 対象のプラットフォーム

    • フルスタックな言語を目指し開発が行われている
    • JVM上で使用可能なため、Androidを始めとしてサーバーでも動作する
  • 高階関数

    • 関数オブジェクトを引数にしたり戻り値にしたりできる
fun <T> lock(lock: Lock, body: () -> T): T {
    lock.lock()
    try {
        // 引数で渡された関数オブジェクトを実行している
        return body()
    }
    finally {
        lock.unlock()
    }
}
  • ラムダ式
    • 関数を宣言せずに関数オブジェクトを生成できる
max(strings, { a, b -> a.length < b.length })

1.4 将来の展望

  • JetBrain社としての展望

    • Andoid, iOS, サーバーサイド, Webフロントエンド, ネイティブなど各種プラットフォーム開発を目指している
  • AndroidとKotlin

    • 2017年にAndroid公式開発言語としてサポートされた
    • 今後も様々なサポートやツールが増えることが予想される

1.5 導入事例

  • Expedia
  • Pintarest
  • Retty
  • Pairs

第2章 Kotlinを学ぶ

環境構築からHelloWorldまで

  • 環境構築

    • Web上の実行環境で試してみる

      • try.kotlinlang.org
      • Program arguments の欄に何かしらの文字列を指定する
      • Runボタンを押す
    • AndroidStudio上でKotlin環境を作る

  • javaの場合はエントリーポイントとなるmainメソッドを定義するためにはclassを定義してそのstaticメソッドとして定義する必要があったが、Kotlinはトップレベルに関数を定義できる

  • 関数定義はfunで始まる
  • 引数の型は後ろに置く
  • セミコロンが不要
  • Javaでいるvoid型のメソッドはUnit型と定義され、戻り値の記述を省略できる
fun main(args: Array<String>) {
    println("Hello, ${args[0]}!")
}
  • 文字列中に$とともに変数や式を挿入するとそれを評価した値を文字列として連結してくれる
val i = 42 // 変数 i に 42 を代入
val s = "すべての答え:$i" // -> すべての答え:42
val s1 = "1 + 1 は${ 1 + 1 }です。" // 1 + 1 は 2 です。
val s2 = "s1 の⻑さは${s1.length}です。" // s1 の⻑さは 10 です。
  • classの定義

    • クラス名の後に:を次ぐけて継承元のクラスを記述する
    • 何も指定しない場合はpublicスコープなクラスとなる
  • クラスのメソッド

    • オーバーライドメソッドはfunの前にoverrideという修飾子をつける
  • null許容型

    • 型の後ろに?があるものはNull許容型であることを示している

2.2 Kotlinの味見

基本文法

  • 変数宣言
    • varで宣言すると再代入が可能
    • valで宣言すると再代入ができない
val num : Int = 1
num = 2 // =>コンパイルエラー
var num2 : Int = 2
num2 = 3 // =>コンパイルエラーにならない
  • 型推論
    • 型を省略できるのは便利ではありますが、開発者同士で分かりにくい場合は明示的に宣言する方がよい
val num = 1
  • if文は式としても扱うことが出来る
val result : String = if(true) {"true"} else { "false" }
println(result) // =>true

// else 節のない場合は、値を返さない Java と同じような if 文として扱われる
  • siwtch文の代わりにwhen式を使う
    • 条件のうち、必ずどれか 1 つに一致する必要がある
    • 左側を条件式にすることも可能
val value = 1
when {
    value == 1-> println("one")
    value == 2-> println("two")
    else -> println("other")
}
  • for文

    • mapOf: マップを生成する関数
    • listOf: リストを生成する関数
    • setOf: セットを生成する関数
    • for(i in 0..4)のようなRangeを使った書き方
    • for(i in 4 downTo 0)のような逆順ループ
  • white, do-whileもJava同様に使える

Null安全

  • kotlinにおける通常の型はnullの代入を許容しない
  • nullを許容するには型の後ろに?をつける

  • nullチェックと安全な呼び出し

    • Null 許容型のメソッドを呼び出すためには、事前に if を用いて null でないことをチェックしなければならない
    • ?演算子を使えば、Null 許容型のメソッドやプロパティを参照することができる
    • エルビル演算子: null チェックは?:演算子を用いて記述することができる
    • !!演算子を用いるとNull許容型をNull非許容型に無理やり変換できる
val l : Int? = b?.length

var b: String? = "abc"
val l : Int = if(b != null) b.length else -1
val l : Int = b?.length ?: -1

val l : Int = b!!.length

関数

  • 関数はfunを使って定義する
  • 関数名: 型というフォーマットで引数を宣言する
  • 引数はコンマで分ける
  • 戻り値がUnit型以外のときは戻り値も定義しなければならない
    • 関数が1つの式で構成される場合は=を書いてブロックを省略できる
    • さらに、コンパイラーが型推論をできるような戻り値の型であれば、戻り値の型の定義を省略することも可能です。
  • 引数のデフォルト値は型定義のあとに=を書いて定義する
  • 名前付き引数も使える
    • 名前付き引数を使った場合、後に続く引数は全て名前付きにしなくてはならない
  • 関数名の前に<>を使うことで型パラメーターを使うことも出来る
fun add(x: Int, y: Int): Int {
    return x + y
}

fun add(x: Int, y: Int): Int = x + y
fun add(x: Int, y: Int) = x + y

fun <T> singletonList(item: T): List<T>{}
  • 高位関数
    • 関数の引数や戻り値に関数オブジェクトを使う関数
    • 具体的な処理を関数の外に出すことによって凡庸化できるようにする
fun <T> lock(lock: Lock, body: () -> T): T {
    lock.lock()
    try {
        return body()
    }
    finally {
        lock.unlock()
    }
}
  • ラムダ式
    • 関数を宣言せずに関数オブジェクト生成できる
    • 引数の最後にラムダ式を渡している場合は引数の外に記述することも可能
max(strings, { a, b -> a.length < b.length })
max(strings) { a, b -> a.length < b.length }
  • インライン関数
    • 実行時に関数オブジェクトを生成するとメモリコストが高くなる場合がある
    • funの前にinlineをつけることに よってコンパイル時にインライン展開されるようになる
inline fun lock<T>(lock: Lock, body: () -> T): T {
    // ...
}

クラス

  • class クラス名 {} で定義できる
  • クラスにメンバやメソッドが無い場合は波括弧を省略できる
  • val myClass = MyClass()のようにnew無しでインスタンス生成できる
  • コンストラクタ
    • コンストラクタはこのように定義する
      • class Person(name: String)
      • この記法をプライマリーコンストラクタと言う
      • プライマリーコンストラクタには処理が記述出来ない
    • アノテーションを書く場合はconstructerの記述が必要になる
      • class Person public @Inject constructor(name: String)
    • インスタンス生成時に行いたい処理はinitキーで定義する
    • コンストラクタを複数生成する場合はconstructerキーを使用する
class Person(val name: String) {
    init {
        logger.info("name = ${name}")
    }
    constructor(name: String, parent: Person) : this(name) {
    // 処理
    }
}
  • メソッドはクラス内に関数を定義すればいい
  • Kotlinでフィールドを定義するとバッキングフィールドというものが生成され、実際の値は底に格納される
    • 要するにプロパティを定義するだけで getter, setter が自動生成される
    • 自分でgetter/setterを定義することもでき、これを定義した場合はバッキングフィールドは定義されない
  • DIなどを利用していてインスタンス生成時に値を設定することが出来ない場合はlateinitキーを使うことで初期化を遅らせることが出来る
  • classの代わりにobjectキーをつかうことによってインスタンスが必ず1つしか生成されないシングルトンなクラスを定義できる
  • KotlinではJavaのようなstaticなメンバを定義することができない
  • インスタンスを生成しなくても利用できるメンバを定義したい場合は companion object キーを使う
  • open修飾子が付いているクラスについては:で継承することができる
  • 継承元のメソッドを上書きするときは、継承するメソッドと同じ名前のメソッドを定義し、override修飾子をつける
  • Javaと同様にファイルの戦闘でpackageキーを使うことでクラスなどの要素を名前空間で区切ることが出来る *アクセス制限
    • public: デフォルトの設定で公開範囲に制限はない
    • internal: 同一モジュール内に限り全公開
    • private: 同一ファイル内のみアクセス可能

データクラス

  • data クラスを定義すると次のメソッド自動で生成する
    • equals()
    • hasCode()
    • toString()
    • vomponentN()
      • 1から始まるメンバー変数の順番
    • copy()
  • data クラスの制限
    • コンストラクターは少なくとも1つの引数を保つ必要がある
    • コンストラクターの全ての引数はvalかvarで定義する必要がある
    • abstract open, sealed, inner 修飾子を付けられない
    • 継承できるのはsealedクラスのみ
  • インスタンスを分解して幾つかの変数に代入する分解宣言ができる

インターフェイス

拡張

  • 拡張関数
    • 任意の方に対して外部から関数を追加できる機能
    • 関数を追加したい方を関数名の手前に付け加えると定義できる
  • 拡張プロパティ
    • 拡張関数とおなじように任意のプロパティを外付けできる
  • 同一ファイル外から呼ぶ場合はimportが必要になる
  • 四則演算のようなモノを新しい方にも適用できるよにする演算子オーバーロードという仕組みがある
  • plusというメソッドが定義されていれば+という二項演算子をつかった計算を行うことができる

イコール

  • 同じ参照であるかを調べるときも同じオブジェクトの中身であるかを調べるときも == 演算子を使う

エイリアス

  • typealiasキーを使うことで既存の型に別名をあたえることができる

### 2.3 JavaからKotlinへの移行 * javaとkotlinは相互互換がある * KotlinとJavaを混在させる * メンテナンスコストがあがる * 境界を設けたほうが良い * kotlinからjavaを使うときの注意点 * javaでは予約語ではないがkotlinでは予約度なキーワードをバックフォーとでエスケープする * javaにはnull許容型がないため、呼び出し時に判断を求められる * 検査例外を無視するので意識してtry-catchなどを書くことが必要となる * javaからkotlinを使う * getter, setterが定義されているのでメンバ変数にはそれを用いてアクセスする * ラムダ式はSAM インターフェースに変換される * 拡張関数は対象のクラスを第一引数に取る関数が宣言されているという扱いになる * kotlin上でデフォルト引数を持っている場合でも全ての引数を渡す必要がある * デフォルト引数のある関数をオーバーロードするには@JvmOverloadsアノテーションを使う

3章 次のステップ

3.1 学習方法

  • 公式ページ
  • KotlinWeekly
  • について学びたい方におすすめなのは、書籍「Kotlin スタートブックー新しい Android プログラミングー(2016)⻑澤太郎著 リックテレコム
  • Kotlin Koans online
  • Google I/O 2017 : Introduction to Kotlin(和訳/要約)

3.2 コミュニティ

  • 日本Kotlinユーザーグループ
  • kotlin slack
  • kotlin conf

3.3 次回リリースの予告

  • 今回のリリースが最初で最後というわけではない
  • 少なくとも継続して新バージョンをリリースすることを検討している

Nintendo switch の予約チャレンジに成功した

先週、京都に旅行に行った時に Nintendo switch を持っている友人がいたので初めて触らせて貰った。

言うてゲームだし、別にVRとかが付いているわけでもないので期待はあまりしていなかった。

 

「けどマジで凄い!!!!!!!!!」

 

 いや、嘘だと思ったんですけど本当に良かったんですよ。

あれはただの携帯ゲーム機ではなくて、家庭用ゲーム機でもあるんです。

移動中も勿論遊べるし、友達の家とかでテレビを繋いで遊ぶことも出来る。

ゲーム機本体にコントローラーが2個付いているので余分になにかを持っていく必要もない。

出てるゲームもとてもいい。

12switchを触ったのですが、本当にいいゲームでした。

よくゲームをしてしまうと友達とのコミュニケーションを失ってしまうと言いますがswitchの場合は逆です。

2人で対戦するゲームは画面を見ずにお互いをみながら遊べるようなゲームが用意されているし、他の見るだけの人も楽しめるようなゲームが沢山用意されている。

コピーダンスとかはみんなでゲラゲラ笑いながらできるので良かった。

 

絶対買うことを決めました。

けど、旅行から帰ってすぐに色んなサイトを探したんですが全然見つからない!!

どこも SOLD OUT と書かれてしまっていました。

 

唯つの販売店舗だった Amazon はこの通り定価よりも2万円近く高い値段で売っていました。。

 

 

発売から大分たってるのにまさかこんなに品薄になっているとは。。。

友達にこの悲しみを伝えたら、いい方法を教えてもらいました。

 

Nintendo Switchの購入方法

基本的には入荷が入った店舗ですぐに予約するしかありません。

しかし、どの予約サイトでも入荷後10分足らずに在庫切れになってしまうのでスピード勝負です。

そこでおすすめなのがこれらのTwitterアカウントです

 

twitter.com

twitter.com

 

これらのアカウントは入荷直後 or 入荷直前にNintendoSwitchの情報をツイートしてくれます。

 

これらのアカウントをモバイル通知ONにしておいて、すぐに予約できるようにしておけば準備は完了です。

事前にアカウントやクレジットカードの情報を登録しておくと、より簡単に予約ができるようになるのでおすすめです。

 

とりあえず僕はこれで無事定価でGETできました。

 

NintendoSwitchとどくの楽しみです。

coincheckAPIが1秒に1回しか叩け無くて辛かったので修正した

bitcoin自動取引のためにcoincheckのAPIを使っていんたのですが、公開されているGemを使った所1秒に1回以上リクエストをするとエラーが起きてしまうという問題が起きました

自動取引を考える上で1秒に1回しかアクセスできないのはつらすぎる。。。。

 

調べてみたら禁止されている様子はなかったので、Gemを使わずにそのまま自分で実装すればいけそうだった

 

けど、Gemを修正した方が早そう & 便利そうなので修正しました

 

多分 1/10000 秒単位でのリクエストまでなら仕様的にはできるようになったはずです(Server側で拒否されそうだけど)

 

おなじ問題に遭遇した人は使ってみてください

 

github.com

 

追記

変なことせずに普通にインクリメントしてあげれば良かった。後で直そ。

ビットコインの自動売買システム 実装編1

ビットコインの自動売買システム 施策編1## 百聞は一見にしかず的な

ビットコインの自動売買システムについて思案したり調べたりするのもいいのだが、とりあえず一度自動売買システムを作ったほうが実際の問題点などを理解できそうな気がしたので作ってみた。

やはりエンジニアならとりあえず作らねばならん

とりあえず作った

色々コードを書いて、二種類ほどのビットコイン自動売買Botを作ってみた。

詳細はGithubを診て欲しいです。

コメントもプルリクもIssueも大歓迎です。

github.com

ちなみにどちらも上手く行っていません。

ああ、どうやったら簡単にお金持ちになれるのだろうか。

一応こちらにもREADMEだけ転載しておきます

Welcome to bitcoin-bot / はじめに

This branch is a project aimed at raising profits through automatic trading of BitCoin. I will leave things that I tried and did not go well, well done well.

このブランチはBitCoinの自動売買により、利益をあげることを目的としたプロジェクトです。 作ってみて上手く行かなかったものも、上手く行ったものもここに残していきます。 後々はちゃんとBot的な機能も揃えていきたいなと思っているのですが、現在は取引をするだけのシステムになっています。

Usage / 使い方

Please add environment variable to ‘.env’ file. Execution of Bot separates folders for each file exchange. We prepare README for each folder, so please read the overview of each bot.

‘.env'ファイルに環境変数を追加してください。 Botの実行はファイル取引所毎にフォルダを分けています。 各フォルダのREADMEを用意していますので、それぞれのBotの概要はそちらをお読みください。

Contributing

If there is a strange place you will be pleased if you get a modified pull request. If you do not mind if you are willing to add your own Bot to this project, please send us a pull request by adding the usage and summary to the README.

変な箇所があれば修正したプルリクエストをいただけると喜びます。 ご自身で作成したBotをこのプロジェクトに追加しても構わない場合は、使い方と概要をREADMEに加えてプルリクエストを送ってください。

Support / 補助資料

I think that you want data such as past price changes when making automatic transaction Bot Since there is data collected by kentosasa, please use those who need it Secondary distribution · Commercial use etc are prohibited, but please use freely for private use.

自動取引Botを作っていると過去の価格推移のデータなどが欲しくなると思います kentosasa が集めているデータがあるので必要な方はお使いください 二次配布・商用利用などは禁止とさせてもらいますが、私的利用に関してはご自由にお使いください。

ビットコインの自動売買システム 手法編 アービトラージ

ビットコインの自動売買システムを作るにあたって、1番の肝となるのはどのようなアルゴリズムビットコインの売買を行うかということです。

ビットコイン取引で利益を出すためには株やFXなどと同じように安く買って、高く売ることが必要となります。

その買い時、売り時を正確に判断できるアルゴリズムを作ることができれば必ず利益を出すことができます。

 

予測は簡単ではない

しかし当然ですが、ビットコインの価格を予想することは簡単ではありません。

機械学習などを取り入れて、円相場や直近の値動きから値を予想するということをやっている人をWeb上で見かけたのですが、あまりうまく行っている様子はみられませんでした。

そんな風にビットコインについて調べているときに見つめた手法が

アービトラージ

という戦略です。

 

アービトラージとは

裁定取引アービトラージ)とは、同一の価値を持つ商品の一時的な価格差(歪み)が生じた際に、割高なほうを売り、割安なほうを買い、その後、両者の価格差が縮小した時点でそれぞれの反対売買を行うことで利益を獲得しようとする取引のこと。機関投資家などが、リスクを低くしながら利ざやを稼ぐ際に利用する手法です。

 *1

 

ビットコインの取引を出来る場所は1つではありません。

インチェック・ビットフライヤー・Zaif など様々な取引所が存在します。

そして驚くことにそれらの取引所によってビットコインの購入金額は違うのです。

アービトラージはその取引所間の差によって異なる購入金額を利用することによって利益を出す手法になります。

調べてみれば分かることなのですが、アービトラージは理論上必ず利益がでる手法になりますが、勿論注意しなければならないことはたくさんあります。

具体的な例を出すと

などなどです。

理論上は100%利益が出るはずですが、絶対儲かるとは限らないのです。

 

とはいえ、リスクの少ない手法の1つであることには変わらないので試してみようかと思います。

 

ビットコインの自動売買システム 準備編

最近ビットコインについて興味が出ています。

調べてみるとビットコインは他の通貨に比べてかなり自由であることがわかりました。

価格情報などはpublicAPIとして多くの取引所が公開しているし、アクセストークンさえ取得すれば実際にビットコインを購入することもできます。

取引手数料も殆どのところで0円です。

「これはエンジニアとしての血が騒ぐぜ」

ということでこれらのAPIを利用してビットコインの自動売買システムを作り、利益を出すことができないかと画策してみました。

 

ビットコイン自動売買の準備

ビットコインの売買を自動化するとして、どんな技術を使うのかを検討してみました。

機械学習やルールベースなどがあげられるのですが、正直どれがいいのか全く分かりません。

実際に運用してみなければそのシステムが本当に儲かるのかどうか分からないが、損してしまうかもしれない。。それは嫌だ。。。

そうだ、テストをしよう

実際に運用しなくてもアルゴリズムを試せる環境。

つまりテスト環境さえ作れればいいいのではないかと考えました。

実際にテストをするために過去のビットコインの相場推移情報が必要です。

CSVとかで保存している場所がないかなーとweb上をあさってみましたが見つかりませんでした。。

 

ビットコインの自動売買システムの準備

世の中に無いものは自分で作っていくのがエンジニアという生き物。

ということでビットコインの価格推移情報を収集するスクリプトを書きました。

自動売買システムに機械学習を取り入れるならどっちにしろこれらの情報は手元に無いと辛いので丁度良かったです。

仕組みは簡単です。

定期的にコインチェックの価格情報を返してくれるAPIを叩き、返ってきた価格情報と時刻データを保存します。

ビットコイン用のサーバーやデータベースを用意しても良かったのですが、完全無料なシステムを作りたかったので google app script と google spread sheet を使いました。

 

ビットコイン 価格情報 スプレットシート

僕以外にも使いたいという方は居ると思うので公開いたします。

docs.google.com



二次配布・商用利用などは禁止とさせていただきますが、是非私的利用してみてください。

「使ったよ」とか「こんなことしてみたよ」みたいなコメントお待ちしております。