しめ鯖日記

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

【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

【チュートリアル実践】Illustratorで金色の文字を描く

こちらのチュートリアルを参考に下のような画像を作ってみました。

illustratorのグラデーションで文字を金色&メタリックな輝きにするチュートリアル

f:id:llcc:20171207162013p:plain

学んだことなど

  • グラデーションで、暗い色と明るい色を隣接させるときれいな色になる
  • 影になっている文字は、半分くらいしか見えないようにした方が良かった
    • 影の部分は、元サイトに比べるとイマイチだった

Photoshopでパターンを定義できない時の対処法

PhotoshopのCS3で「パターンを定義を定義」しようとしたのですが、下のように選択できない状態になってしまいました。

f:id:llcc:20171201150303p:plain

「パターンを定義を定義」が選択できない時の対処法

こちらですが、モードが32 bit/チャンネルを選んでいるのが原因でした。
これを16 bit/チャンネルに変更することで「パターンを定義を定義」を選べるようになりました。

f:id:llcc:20171201150411p:plain

「webおよびデバイス用に保存」が選択できない場合

「webおよびデバイス用に保存」が選択できない問題も、モードを「16 bit/チャンネル」に変更する事で解消できました。

f:id:llcc:20171201150510p:plain

そもそもモードとは何か

RGB 画像では、3 つのカラー(チャンネル)を使用して、画面上にカラーを再現します。1 チャンネルが 8 ビットの画像では、これらの 3 つのチャンネルは 1 ピクセル当たり 24(8 ビット × 3 チャンネル)ビットのカラーを表現します。24 ビット画像では、3 つのチャンネルによってピクセルあたり最大 1,670 万色を再現できます。48 ビット画像(16 bit/チャンネル)および 96 ビット画像(32 bit/チャンネル)では、さらに多くのカラーを再現できます。RGB モデルは、Photoshop で新規画像を作成する際の初期設定モードです。また、モニターでは常に RGB モデルを使用してカラーを表示します。このため、Photoshop では、CMYK などの RGB 以外のカラーモードを使用する画像の場合は、画面に表示するために CMYK 画像が RGB に変換されます。

Photoshop のカラーモードについて

RGBモードの場合、ビット数は1pxの1色のビット数を表すようです。
つまり8ビットは赤・青・緑のそれぞれに8ビットを割り当てる状態です。