しめ鯖日記

swift, iPhoneアプリ開発, ruby on rails等のTipsや入門記事書いてます

SKShapeNodeのfillTextureに画像をセットしたのに表示されない時の対処法

表題の件で少しハマったのでメモ。

画像を表示する方法

まずはプロジェクトに画像を追加します。

f:id:llcc:20171214145632p:plain

画像を追加したら、下のようにSKShapeNodeのfillTextureに画像をセットします。

import SpriteKit

class GameScene: SKScene {
    override func didMove(to view: SKView) {
        let node = SKShapeNode(circleOfRadius: 100)
        node.fillTexture = SKTexture(image: #imageLiteral(resourceName: "ball"))
        addChild(node)
    }
}

実行結果は下の通りです。
SKShapeNodeの枠線はあるけど画像は表示されません。

f:id:llcc:20171214145840p:plain

画像を表示するためには、下のようにfillColorをセットする必要があります。

class GameScene: SKScene {
    override func didMove(to view: SKView) {
        let node = SKShapeNode(circleOfRadius: 100)
        node.fillTexture = SKTexture(image: #imageLiteral(resourceName: "ball"))
        node.fillColor = UIColor.white // 今回追加
        addChild(node)
    }
}

f:id:llcc:20171214145955p:plain

公式ドキュメントによると、fillTextureはfillColorとブレンドして表示されます。
画像が表示されなかったのは、fillColorが透明だった為だと思います。

fillTexture - SKShapeNode | Apple Developer Documentation

fillColorを白以外の色にすると少し黒っぽい画像が表示されます。

node.fillColor = UIColor.lightGray

f:id:llcc:20171214150249p:plain

RubyでCoincheckのAPIを叩いてみる

Rubyを使ってCoincheckのAPIを叩いてみました。

取引所APIドキュメント | Coincheck(コインチェック)

APIは、認証不要のpublic apiと認証が必要なprivate apiの2種類あります。
今回は板情報を取得するpublic apiを叩いてみようと思います。

Coincheckは公式ライブラリがあるので、それを利用しました。

source "https://rubygems.org"

gem 'ruby_coincheck_client'

板情報の取得は下の通りです。

require 'ruby_coincheck_client'

cc = CoincheckClient.new
puts JSON.parse(cc.read_order_books.body)

次のように注文情報を取得する事ができます。

f:id:llcc:20171213142655p:plain

現在のレートの取得は下の通りです。

require 'ruby_coincheck_client'

cc = CoincheckClient.new
puts JSON.parse(cc.read_rate.body)

次のように現在の価格を表示してくれます。

f:id:llcc:20171213142947p:plain

関連記事

llcc.hatenablog.com

【Swift】Calendar, Locale, TimeZoneなど、国際化周りのクラスを整理

国際化対応の時、Calendar, Locale, TimeZoneなど様々なクラスが出てきて混乱したのでそれぞれのクラスの役割について調べてみました。

Calendar

Calendar - Foundation | Apple Developer Documentation

A definition of the relationships between calendar units (such as eras, years, and weekdays) and absolute points in time, providing features for calculation and comparison of dates.

公式ドキュメントによると、Calendarの役割は上の通りです。
絶対時間の管理や日付の差分計算などを行います。

実際、次のようなコードで1日先のDateを取得できます。

var components = DateComponents()
components.day = 1
let date = Calendar.current.date(byAdding: components, to: Date())

下のようにDateからDateComponentsを生成する事もできます。

let components = Calendar.current.dateComponents([.day], from: Date())

Calendarでは西暦・和暦の切り替えをする事もできます。
下のようにidentifierを.japaneseにすると和暦のDateComponentsを取得できます。

let components = Calendar(identifier: .japanese).dateComponents([.year], from: Date())
components.year // → 29

DateFormatterもCalendarを.japaneseにする事で和暦に切り替える事ができます。

let formatter = DateFormatter()
formatter.dateFormat = "y年"
formatter.calendar = Calendar(identifier: .japanese)
formatter.string(from: Date()) // 29年

Locale

Locale - Foundation | Apple Developer Documentation

Information about linguistic, cultural, and technological conventions for use in formatting data for presentation.

公式ドキュメントでの説明は上の通りです。
Localeは現在の言語を扱うもののようです。

下のようにidentifierを見る事で現在の言語を判定する事ができます。

Locale.current.identifier // → "en_US"

国ごとのDateFormatを取得したい時にも使えます。

let format = DateFormatter.dateFormat(fromTemplate: "MMMMyyyy", options: 0, locale: Locale(identifier: "en")) // → MMMM yyyy

let format = DateFormatter.dateFormat(fromTemplate: "MMMMyyyy", options: 0, locale: Locale(identifier: "ja")) // → yyyy年MM月

TimeZone

TimeZone - Foundation | Apple Developer Documentation

Information about standard time conventions associated with a specific geopolitical region.

TimeZoneは名前の通りTimeZoneを扱うクラスです。

DateFormatterのTimeZoneを変更すれば、そのTimeZoneでの出力をしてくれます。

let formatter = DateFormatter()
formatter.dateFormat = "HH"
formatter.timeZone = TimeZone(identifier: "Asia/Shanghai")
formatter.string(from: Date()) // → 13
formatter.timeZone = TimeZone(identifier: "Asia/Tokyo")
formatter.string(from: Date()) // → 14

DateComponentsのTimeZoneを変更すれば、DateComponentsからDateへの変換に影響を与えます。

var components = Calendar.current.dateComponents([.calendar, .year, .month, .day, .hour], from: Date())
components.timeZone = TimeZone(identifier: "Asia/Shanghai")
components.date // 15:00のDate
components.timeZone = TimeZone(identifier: "Asia/Tokyo")
components.date // 14:00のDate

【iOS】BartyCrouchでiPhoneアプリの国際化

BartyCrouchというツールを使ってアプリの国際化対応をしてみました。

github.com

Bartycrouchでできること

Bartycrouchでできる事は下の通りです。

  • Storyboardに追加されたラベルをLocalizable Stringsに書き出す
  • NSLocalizedStringの情報をLocalizable Stringsに書き出す

自動翻訳もできるようですが、

インストール

インストールはbrewで行います。

brew install bartycrouch

Storyboardに追加されたラベルをLocalizable Stringsに書き出す

今回は日本語と英語対応したアプリにbartycrouchを使います。

f:id:llcc:20171212143313p:plain

Storyboardにラベルを一つ追加して、それをLocalizeします。

f:id:llcc:20171212143601p:plain

Localizeすると次のように各言語のstringsファイルが生成されます。

f:id:llcc:20171212143705p:plain

ファイルの中身は下の通りです。

f:id:llcc:20171212143715p:plain

今生成したstringsファイルですが、これ以降ラベルやボタンを追加しても反映されません。
下のようにLabel2を追加しても、stringファイルには反映されません。

f:id:llcc:20171212143816p:plain

Bartycrouchを使うことで、これらの変更を簡単に反映させることができます。
使い方は下の通りです。
プロジェクトのルートディレクトリで下のコマンドを実行します。

 bartycrouch interfaces -p .

実行すると、stringsファイルに新しい行が追加されています。

f:id:llcc:20171212144215p:plain

オブジェクトを追加した時だけでなく、オブジェクトの削除も反映してくれます。

f:id:llcc:20171212144600p:plain

ただ、StoryboardのLocalizeのチェックが外れているとError! No file exists at output path XXXというエラーが出る事があるのでここだけ注意が必要です。

f:id:llcc:20171212144431p:plain

NSLocalizedStringの情報をLocalizable Stringsに書き出す

次はNSLocalizedStringメソッドの情報をLocalizable Stringsに書き出してみます。
最初にLocalizable.stringを作成します。

f:id:llcc:20171212145030p:plain

次に、コード上でNSLocalizedStringメソッドを使います。

class ViewController: UIViewController {
    override func viewDidLoad() {
        super.viewDidLoad()
        
        NSLocalizedString("Test", comment: "テストキー")
    }
}

ここで下のようにBartycrouchを実行します。

bartycrouch code -p . -l .

実行するとLocalizable.stringに下のように行が追加されます。
こちらも不要キーは削除されるので、未使用キーが残る事がなく安心です。

f:id:llcc:20171212145158p:plain

下のようにコメントが複数種類ある場合は、両方共反映されます。

class ViewController: UIViewController {
    override func viewDidLoad() {
        super.viewDidLoad()
        
        NSLocalizedString("Test", comment: "テストキー1")
        NSLocalizedString("Test", comment: "テストキー2")
    }
}

f:id:llcc:20171212145512p:plain

Microsoft Translator テキスト APIで日本語を翻訳してみる

Microsoftが提供している翻訳APIを試してみました。

Translator API - Microsoft Translator

準備

まずはMicrosoftのアカウントを使ってAzureのポータルページにアクセスします。

Microsoft Azure

左上の追加ボタンから、 Microsoft Translator テキスト APIを追加します。

f:id:llcc:20171211132205p:plain

追加が完了するとキーが発行されます。
これを使って Microsoft Translator テキスト APIを叩きます。

実装

続けてRubyAPIを叩いてみます。
APIを叩くため、まずはBundlerでrest-clientをインストールします。

# frozen_string_literal: true
source "https://rubygems.org"

gem "rest-client"

APIを叩く処理は下の通りです。
Ocp-Apim-Subscription-Keyには先程発行したキーを入れます。

require 'rest-client'

response = RestClient.get('https://api.microsofttranslator.com/V2/Http.svc/Translate?text=Birthday&to=ja', {
  "Ocp-Apim-Subscription-Key" => 'XXXX'
})
puts response.body

これを実行すると下のように翻訳した結果が返ってきます。

f:id:llcc:20171211135929p:plain

【チュートリアル実践】Illustratorでカラフルなテキストを作る

こちらのチュートリアル記事を参考にカラフルなテキストを作ってみました。

f:id:llcc:20171210160107p:plain

handywebdesign.net

メモ

  • オブジェクト → ライブペイント → 拡張 で個別のパーツを選択できるようになる

f:id:llcc:20171210160326p:plain

  • ライブペントとは
    • 閉じたパスに色を付ける機能
    • ライブペイントで色を塗ると、対象のオブジェクトはグループ化される

RubyでBitflyer LightingのAPIを叩いてみる

ビットコインなどの仮想通貨取引所のBitflyerのAPIを試してみました。

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

準備

APIを叩くため、まずはrest-clientをBundlerで追加します。

source "https://rubygems.org"

gem "rest-client"

板情報の取得

/boardへのリクエストで板情報を取得できます。
こちらはHTTP Public APIなので、認証情報不要で使う事ができます。

require 'rest-client'
require 'json'

response = RestClient.get('https://api.bitflyer.jp/v1/board')
puts JSON.parse(response.body)

レスポンスは下の通りです。

f:id:llcc:20171209152245p:plain

BTC-FXの板情報の取得

BTC-FXの情報がほしい時はパラメータのproduct_codeにFX_BTC_JPYを指定します。

require 'rest-client'
require 'json'

response = RestClient.get('https://api.bitflyer.jp/v1/board?product_code=FX_BTC_JPY')
puts JSON.parse(response.body)

指定可能なproduct_codeはhttps://api.bitflyer.jp/v1/marketsを叩く事で取得できます。

f:id:llcc:20171209152709p:plain

チャット情報の取得

チャットはhttps://api.bitflyer.jp/v1/getchatsを叩く事で取得できます。

実際に注文する

実際に注文するためには認証情報が必要になります。
まずは下ページで新しいAPIキーを追加します。

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

権限は、今回は注文関連と建玉だけにします。

f:id:llcc:20171209153842p:plain

実際の注文処理は下の通りです。
POSTで注文情報を送る事で注文する事ができます。
API_KEYとAPI_SECRETは自分のものに置き換えて下さい。

require 'rest-client'
require 'json'

API_KEY = 'API_KEY'
API_SECRET = 'API_SECRET'

timestamp = Time.now.to_i.to_s
body = {
  product_code: 'FX_BTC_JPY',
  child_order_type: 'LIMIT',
  side: 'BUY',
  price: 1_800_000,
  size: 0.1,
}.to_json
path = '/v1/me/sendchildorder'
url = 'https://api.bitflyer.jp' + path
text = timestamp + 'POST' + path + body
sign = OpenSSL::HMAC.hexdigest(OpenSSL::Digest.new("sha256"), API_SECRET, text)

result = RestClient.post(url, body, {
  "ACCESS-KEY" => API_KEY,
  "ACCESS-TIMESTAMP" => timestamp,
  "ACCESS-SIGN" => sign,
  "Content-Type" => "application/json"
})

puts JSON.parse(result)

実際の画面を見ると注文が入っている事が分かります。

f:id:llcc:20171209163652p:plain