Fablog

社会人マイナス1年生のブログ / プログラミング / 料理 / ビットコイン

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も大歓迎です。

https://github.com/kentosasa/bitcoinBotgithub.com

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

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

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

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

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

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

 

予測は簡単ではない

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

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

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

アービトラージ

という戦略です。

 

アービトラージとは

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

 *1

 

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

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

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

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

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

具体的な例を出すと

などなどです。

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

 

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

 

 

日本で一番簡単にビットコインが買える取引所 coincheck bitcoin

 

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

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

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

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

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

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

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

 

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

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

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

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

そうだ、テストをしよう

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

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

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

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

 

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

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

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

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

仕組みは簡単です。

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

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

 

インターフェースデザインの心理学 感想

インターフェースデザインの心理学 とは

インタフェースデザインの心理学 ―ウェブやアプリに新たな視点をもたらす100の指針

インタフェースデザインの心理学 ―ウェブやアプリに新たな視点をもたらす100の指針

 

 

この本は 人々の心を捉えるにはどうすればいいのか ということについた書かれたインターフェースデザインの本です。

オライリー・ジャパンが発行元のため、エンジニアには本書の信頼度の高さが分かると思います。

 

デザインは相手から反応を引き出すための大事な要素です。

買ってほしい、読んでほしい、行動してほしいなど、相手を誘い出すためにデザインをします。

人間の行動原理を理解していないデザインは相手を混乱させるだけで目的の結果を得ることができません。

 

本書では全てのデザイナーが知るべき100の指針を実践例とともに紹介します。

その全ては科学的な研究から導き出されたものです。

これらの指針を理解してデザインをすれば、人間の思考や行動、遊び方にマッチした直感的で人を引きつける製品 ー 印刷物、ウェブサイト、アプリケーション、ゲーム ーを作れるようになります。

 

概要

この本には

普段意識していない、無意識下にあるインターフェースデザインのルール

が書かれています。

全10章に分かれていて、100個のインターフェイスデザインに関する指針について書かれた本となっています。

翻訳本のため一部日本語が変な箇所がありましたが、参考論文や画像付きの解説などが多くあるため大変読みやすいです。

 

せっかくなので100の指針の中からいくつかの指針をご紹介します。

 

目が受け取る情報と脳が受け取る情報は違う

外を歩いている時、目が察知した情報が脳に送られ、それを脳が処理して私たちが感じ取ります。

この時「脳は目が察知した外界の様子をそのままリアルに送ってくれている」と思えるかもしれません。

しかし、「脳が私たちに伝えるもの」と「目が私たちに伝えるもの」は微妙に違うのです。

脳は以下の例の様に目に入るもの全てに対して「解釈」を加えて私たちに伝えているのです。

 

何もないところに三角形が見える「カニッツァの三角形」

 

f:id:sasa_sfc:20170621103218j:plain

 

長さが異なる様に見える「ミュラ・リヤー錯視」

f:id:sasa_sfc:20170621103226g:plain

 

皆さんのウェブページを閲覧してくれている人は、みなさんの期待や予想とは違った見方をするかもしれません。

何をどう見るかは、閲覧する側の経歴や知識、対象への馴染みの深さによって異なります。

 

一度に覚えられるのは4つだけ

人間工学、ユーザビリティ、心理学、記憶などの分野に関心のある人なら、きっと「魔法の数字は 7± 2 」という言葉を耳にしたことがあるでしょう。

しかしこれは筆者に言わせれば都市伝説です。

ジョージ・A・ミラーによると「人が一度に記憶できるのは5個から9個」と言うのです。

この説に従うと、メニューの項目は5つから9つに、感情のタブは5つから9つにしなければならないと言うわけです。

しかし、これは少し間違っています。

ミラーの 7± 2 という説は研究に基づいた数字ではなく、講演の中で自分の考えを述べたに過ぎません。

後にミラーの説に疑問を持ったアラン・バットリーはこの説に関する様々な実験を行いこの説の否定をしました。

他の研究者もバッテリーの研究を継続し、現在では魔法の数字は4であることが分かっています。

一度に覚えることができる数は4個ですが、チャンクを使うことによって5つにも6つにも増やすことができます。

チャンクとは情報をいくつかのまとまりに分けてグループ化することです。

電話番号や車のナンバープレートなどはその一例です。

7125694532

よりも

712-569-4532

となっていた方が覚えやすいはずです。

デザインをする際に、相手に掲示する情報を4項目に限定できるなら、それは素晴らしいことですが、そこまで徹底する必要はありません。

情報をいくつかのチャンクに分けられるのであれば、情報はもっと多くて構わないのです。

 

感想

この本を読むことによって改めてインターフェースデザインのルールを認識することができたので、モノづくりをする人として役立ちました。

デザイナーとかプランナー向けの本ではありますが、エンジニアの人も読んで損はないと思います。

 

 

インタフェースデザインの心理学 ―ウェブやアプリに新たな視点をもたらす100の指針

インタフェースデザインの心理学 ―ウェブやアプリに新たな視点をもたらす100の指針

 

 

以下の本もデザイン心理学に関する本なので、この本に興味を持った方におすすめです。

 

続・インタフェースデザインの心理学 ─ウェブやアプリに新たな視点をもたらす+100の指針

続・インタフェースデザインの心理学 ─ウェブやアプリに新たな視点をもたらす+100の指針

 
子どものUXデザイン ―遊びと学びのデジタルエクスペリエンス

子どものUXデザイン ―遊びと学びのデジタルエクスペリエンス