【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というツールを使ってアプリの国際化対応をしてみました。
Bartycrouchでできること
Bartycrouchでできる事は下の通りです。
- Storyboardに追加されたラベルをLocalizable Stringsに書き出す
- NSLocalizedStringの情報をLocalizable Stringsに書き出す
自動翻訳もできるようですが、
インストール
インストールはbrewで行います。
brew install bartycrouch
Storyboardに追加されたラベルをLocalizable Stringsに書き出す
今回は日本語と英語対応したアプリにbartycrouchを使います。
Storyboardにラベルを一つ追加して、それをLocalizeします。
Localizeすると次のように各言語のstringsファイルが生成されます。
ファイルの中身は下の通りです。
今生成したstringsファイルですが、これ以降ラベルやボタンを追加しても反映されません。
下のようにLabel2を追加しても、stringファイルには反映されません。
Bartycrouchを使うことで、これらの変更を簡単に反映させることができます。
使い方は下の通りです。
プロジェクトのルートディレクトリで下のコマンドを実行します。
bartycrouch interfaces -p .
実行すると、stringsファイルに新しい行が追加されています。
オブジェクトを追加した時だけでなく、オブジェクトの削除も反映してくれます。
ただ、StoryboardのLocalizeのチェックが外れているとError! No file exists at output path XXX
というエラーが出る事があるのでここだけ注意が必要です。
NSLocalizedStringの情報をLocalizable Stringsに書き出す
次はNSLocalizedStringメソッドの情報をLocalizable Stringsに書き出してみます。
最初にLocalizable.stringを作成します。
次に、コード上でNSLocalizedStringメソッドを使います。
class ViewController: UIViewController { override func viewDidLoad() { super.viewDidLoad() NSLocalizedString("Test", comment: "テストキー") } }
ここで下のようにBartycrouchを実行します。
bartycrouch code -p . -l .
実行するとLocalizable.stringに下のように行が追加されます。
こちらも不要キーは削除されるので、未使用キーが残る事がなく安心です。
下のようにコメントが複数種類ある場合は、両方共反映されます。
class ViewController: UIViewController { override func viewDidLoad() { super.viewDidLoad() NSLocalizedString("Test", comment: "テストキー1") NSLocalizedString("Test", comment: "テストキー2") } }
Microsoft Translator テキスト APIで日本語を翻訳してみる
Microsoftが提供している翻訳APIを試してみました。
Translator API - Microsoft Translator
準備
まずはMicrosoftのアカウントを使ってAzureのポータルページにアクセスします。
左上の追加ボタンから、 Microsoft Translator テキスト APIを追加します。
追加が完了するとキーが発行されます。
これを使って Microsoft Translator テキスト APIを叩きます。
実装
続けてRubyでAPIを叩いてみます。
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
これを実行すると下のように翻訳した結果が返ってきます。
【チュートリアル実践】Illustratorでカラフルなテキストを作る
こちらのチュートリアル記事を参考にカラフルなテキストを作ってみました。
メモ
- オブジェクト → ライブペイント → 拡張 で個別のパーツを選択できるようになる
- ライブペントとは
- 閉じたパスに色を付ける機能
- ライブペイントで色を塗ると、対象のオブジェクトはグループ化される
RubyでBitflyer LightingのAPIを叩いてみる
ビットコインなどの仮想通貨取引所のBitflyerのAPIを試してみました。
準備
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)
レスポンスは下の通りです。
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
を叩く事で取得できます。
チャット情報の取得
チャットはhttps://api.bitflyer.jp/v1/getchats
を叩く事で取得できます。
実際に注文する
実際に注文するためには認証情報が必要になります。
まずは下ページで新しいAPIキーを追加します。
権限は、今回は注文関連と建玉だけにします。
実際の注文処理は下の通りです。
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)
実際の画面を見ると注文が入っている事が分かります。
【チュートリアル実践】Illustratorで金色の文字を描く
こちらのチュートリアルを参考に下のような画像を作ってみました。
illustratorのグラデーションで文字を金色&メタリックな輝きにするチュートリアル
学んだことなど
- グラデーションで、暗い色と明るい色を隣接させるときれいな色になる
- 影になっている文字は、半分くらいしか見えないようにした方が良かった
- 影の部分は、元サイトに比べるとイマイチだった
Photoshopでパターンを定義できない時の対処法
PhotoshopのCS3で「パターンを定義を定義」しようとしたのですが、下のように選択できない状態になってしまいました。
「パターンを定義を定義」が選択できない時の対処法
こちらですが、モードが32 bit/チャンネルを選んでいるのが原因でした。
これを16 bit/チャンネルに変更することで「パターンを定義を定義」を選べるようになりました。
「webおよびデバイス用に保存」が選択できない場合
「webおよびデバイス用に保存」が選択できない問題も、モードを「16 bit/チャンネル」に変更する事で解消できました。
そもそもモードとは何か
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 に変換されます。
RGBモードの場合、ビット数は1pxの1色のビット数を表すようです。
つまり8ビットは赤・青・緑のそれぞれに8ビットを割り当てる状態です。