Karakuri.com

ベンチャー企業で働くソフトウェアエンジニアの技術録

Swift4でDateの日時を任意のフォーマットでStringで表示する

Swiftの日時を表示するのはDateクラスで簡単に実装できます。

// 2018/01/12 00:00:00
print(Date())

しかしFormatを指定するとなると結構行数を使ってしまうんですよね。

let format = DateFormatter()
format.timeStyle = .short
format.dateStyle = .short
format.locale = Locale(identifier: "ja_JP")
// 2018/01/12 00:00
print(format.string(from: Date()))

Dateクラスを拡張する

毎回書くのは冗長ですし、表記を変えたいとなったときに死ぬのでDateクラスを拡張してしまいましょう。

import Foundation

public extension Date {
    public func toString() -> String {
        let format = DateFormatter()
        format.timeStyle = .short
        format.dateStyle = .short
        format.locale = Locale(identifier: "ja_JP")
        return format.string(from: self)
    }
}

これで楽になりました。.Net Frameworkが

// 2018/01/12 00:00:00
DateTime.Now.ToString();

と書けるように、今回拡張したことで

// 2018/01/12 00:00
Date().toString()

と書くことができるようになりました。

続きを読む

Swift4で任意のDateの日時から日の始まりである0時0分のDateの日時を作る

iOSアプリ開発においてデータベースのデータから本日登録されたデータだけを取り出す必要があったのですが、そのためには今日の0時0分のDateを作らなければなりません。例えば.Net Frameworkでは下記のように作成することができます。

var now = DateTime.Now;
var date = new DateTime(now.Year, now.Month, now.Day, 0, 0, 0);

ところがSwiftのDateクラスにはそのようなイニシャライザはありません。また、Dateクラスから時間や分をInt型の値として取り出すこともできないようです。

Calenderクラスと組み合わせて作る

DateクラスとNSDateクラスばかり調べていたので時間かかってしまいました。結論から言うと下記のようにして今日の0時0分を作ることができます。

Calendar(identifier: .gregorian).startOfDay(for: Date()))

Calenderクラスを使うのですね。上記の例ではDateインスタンスを新規で生成しているので今日になりますが、別の日のDateインスタンスを使えば任意の日時の0時0分を作ることができます。.Net FrameworkはDateTime型で色々できるのでNSDateやDateは貧弱で辛いなあと思っていたのですが、Calenderクラスと組み合わせることでDateTimeと同等の機能が用意されているようです。

Xcodeのライブラリ管理のGUI版クライアントアプリCocoaPods Appを使う

iOSアプリ開発において欠かせないのがライブラリです。Androidではgradle、WindowsではNugetがありますが、なぜかXcodeには標準で使えるライブラリ管理機能がありません。実際のところ公式が確立する前にサードパーティがデファクトスタンダードを取ってしまったというところでしょうか。その最も使われているライブラリ管理システムがCocoaPodsです。しかしこのCocoaPodsはターミナルのCUIアプリケーションです。別にいいけど、AndroidとWindowsと比較してちょっとショボすぎるでしょ…。と思っていたらいつの間にかGUIクライアントアプリができていたので使ってみました。

CocoaPods Appとは

インストーラー形式で配布されています。このためターミナルでコマンドからインストールする必要もありません。楽ですね。
cocoapods.org

続きを読む

仮想通貨のウォレット(wallet.dat)のパスフレーズを忘れたのでリカバリーを試みました

eXperience Point(XP)という仮想通貨を買ったのですが、翌日にパソコンが壊れてしまいました。幸い別のHDDにwallet.datをバックアップしていたのでウォレットをリストアすることはできたのですが、パスフレーズを入力してもウォレットを復号することができません。どうやら手書きのメモが間違っている様子。顔面蒼白です。

パスフレーズをクラックする方法を探す

手書きのメモが間違っているとはいえ、一部の文字を書き間違っているだけのはずです。しかし考えられる間違いを片っ端から手動で入力してみましたが突破できず。こうなると総当たりクラックツールを使ってパスフレーズを特定するしかありません。そこで同じ状況に陥って解決を試みたひとを探してみました。
blog.r622.net
いました。この方はMonacoinのケースですが、ウォレットがXPと同じ外観ですし、対象もwallet.datと名前も完全に同じです。勉強不足で恐縮なのですが、仮想通貨のウォレットはBitcoinのものを改造して作られているものが多いのでwallet.datのフォーマットは仮想通貨によらず同じである場合が多いのではないかと推測しました。そして、この方が使用したクラックツールがこちら。
github.com
BTCやLTCなどに対応していると書かれています。上述した通り、MonecoinやXPにも対応しているようです。

続きを読む

仮想通貨(BTC,ETH,XEMなど)のアドレスから口座残高などの情報を取得するAPIについて

仮想通貨はブロックチェーンに全てのデータが保存されているので、直接ブロックチェーンを参照すれば任意のアドレスから口座残高などの情報を取得することができます。しかし、口座情報を利用するアプリやWEBサービスを作成するだけのために各仮想通貨のブロックチェーンを参照するのは大変ですし、何より学習コストがかかってしまいます。それで何かAPI経由で取れないかと探していたら、、、ありました。

cryptoID

cryptoIDというサイトがAPIを公開していて、様々な仮想通貨の口座情報をRESTfulAPIで取得することができます。いやほんと対応している仮想通貨が多すぎてすごいです。マイナーな草コインであるXPもこのサイトから口座情報取れます。
Chainz - Crypto-currency Blockchains

続きを読む

coincheckのページネーションAPIを使って取得した一覧から任意のIDのデータを取得する方法

coincheckの一覧取得APIではページネーションという仕様を使っています。しかしこのページネーションについてcoincheckの説明が不足している上に不具合があって大変カオスなことになっています。2017年12月にAPIの仕様変更があったので、この変更で不具合は直っていることを祈ります。今回はこの一覧取得APIから任意のIDのデータを取得する方法について書きます。

ページネーションとは

coincheckの一部APIではページネーションにてデータを分割して取得することが可能です。
・PARAMETERS
limit 1ページあたりの取得件数を指定できます。
order "desc", "asc" を指定できます。
starting_after IDを指定すると絞り込みの開始位置を設定できます。
ending_before IDを指定すると絞り込みの終了位置を設定できます。

だそうです。
取引所APIドキュメント | Coincheck(コインチェック)

続きを読む

coincheckのAPIを使って発注と同時に損切り発注(イフダン)も投げる方法

coincheckのAPIでシステムトレードプログラムを作る際に必須の機能なのが発注と同時に損切りの発注を出す処理です。これFXの世界ではイフダン(if done)というらしいです。今回はこの処理の実装方法について書きます。

処理の流れ

coincheckのAPIの実行順としては下記のようになります。

  1. 新規注文API
  2. ポジション一覧API
  3. 新規注文API

ポジション一覧APIを利用しなければならないというのが味噌です。これが分かるのに時間がかかりました。

続きを読む

C#でcoincheckのPrivate APIを利用するための認証SIGNATUREの作り方

株やFXはAPIが用意されていないのですが、仮想通貨取引所はどこもAPIを用意しています。coincheckも例外ではなくAPIを利用してBitcoinのレバレッジ取引ができます。つまりは自分でシステムトレードプログラムを作ることができるというわけですね。個人の口座残高や売買などはPrivate APIという認証が必要なAPIを使用する必要があります。今回はこの認証をC#で実装する方法について書き残します。

coincheckの認証とは

細かいことはcoincheckのAPI仕様についてのページに書いてあるので参照してください。
coincheck.com
簡単にいうと下記の3つの情報をHTTPsのヘッダに書き込めば良いみたいですね。

  • ACCESS KEY
  • ACCESS NONCE
  • ACCESS SIGNATURE

KEYはcoincheckにログインして作成することができます。権限も細かく設定できるので、必要最低限の権限だけ付与しましょう。特に送金は余程のことがない限り権限付与しないほうが良いです。NONCEは前回のAPIの実行時より大きい値であれば何でも良いです。そしてSIGNATURE、今回はこの作り方について書きます。

続きを読む

Image.FromFileはファイルをロックしてIOExceptionを発生させる原因になるので使うのをやめましょう

ユーザーに画像を選択してもらうアプリケーションを作成する場合、画像ファイルをローカルに保存することになると思います。このプレビュー画像をアプリケーションに表示しようとしたときに、このローカル画像を読み込まなければなりません。このときにImageクラスのFromFileメソッドを使用すると一見簡単なのですが、ファイルをロックしてしまうため気を付けてください。

IOExceptionが発生します

例えば下記のようなコードが存在すると危険です。

var image = Image.FromFile(fileName);

これが実行されるとfileNameのファイルがロックされたままとなります。再び上記コードが呼ばれるとIOExceptionが発生してしまいます。MSDNにも「The file remains locked until the Image is disposed.」と記述されています。

続きを読む

C#と.NET FrameworkのみでJsonWebTokenを使ったJson署名を実現する方法

JSONのHTTPSによるやり取りにJson Web Token(JWT)という規格があります。JSONに署名して中間者攻撃や悪意ある送信元からのAPI利用を防ぐことができます。しかし当然ながら.NET Frameworkにはそのようなライブラリは存在しません。Nugetにも該当するライブラリを見つけることができなかったので、自作してみました。

Json Web Tokenとは

Json Web Tokenとは送信者がJSONに署名し、受信者が署名を確認して送信者と偽装のないことを確認するための規格です。略してJWTと呼ばれます。このJWTは以下の3つの要素からなる文字列として表現されます。

  • ヘッダー
  • JSON
  • 署名

ヘッダーは下記のようになります。署名の暗号アルゴリズムとJWTであることを明記します。暗号アルゴリズムは色々あるようですが、今回はRS256という形式を使いました。これは公開鍵暗号方式でハッシュアルゴリズムにSHA256を使うという意味です。

{
 "alg": "RS256",
 "typ": "JWT"
}

署名はヘッダーとJSONをバイト文字に変換し、ピリオドを区切り文字として繋げます。これを暗号化したものが署名となります。3つの要素はピリオドで区切られており、また署名は送信者により暗号化されています。受信者は署名を復号化し、JSONと比較することで偽装ないことを確認します。ここで一致しなければ、偽装されているか、送信者が違うということになります。

続きを読む