読者です 読者をやめる 読者になる 読者になる

Swift3でStringをMD5文字列に変換する時に得たことのメモ

iOS Swift

StringをMD5に変換するのはこのようなコードになりました。

Swift3でStringをMD5に変換する

これを書いている中で学んだことのメモです。

文字の連結

NSDataではなくDataを使い、NSが付くものをあまり使わないようにと思っていたのです。

でも、MD5文字列に連結する箇所で、はじめはNSMutableStringを使っていました。

before

for i in 0 ..< digestLength {
    result.appendFormat("%02x", md5Buffer[i])
}
  • for文で書いていました
  • NSMutableStringを使っていました

何だかしっくりこない…と調べるうちにreduceが使えることを知りました。

after

md5String = (0..<digestLength).reduce("") { $0 + String(format:"%02x", md5Buffer[$1]) }
  • reduceを使いました
  • NSMutableStringがなくなりました

スッキリしました。

CountableRange

(0..<digestLength)

この部分はCountableRangeになっているのですね。

CountableRangeでは、mapfilterなどを使うことができます。

クロージャの書き方

きちんと理解できていなかったのでおさらい。
変化の軌跡を残してみます。

その1

md5String = (0..<digestLength).reduce("", { (result, index) -> String in
    return result + String(format: "%02x", md5Buffer[index])
})
  • 引数や戻り値の型をすべて記述しました。

その2

md5String = (0..<digestLength).reduce("") { result, index in result + String(format:"%02x", md5Buffer[index]) }
  • 型とreturnを省略しました。

その3

md5String = (0..<digestLength).reduce("") { $0 + String(format:"%02x", md5Buffer[$1]) }
  • 引数の名前を省略しました。

mapなどを使う時はこの省略形を最もよく目にするので、これを使うのが良いですね。

参考

MD5変換

CountableRange

クロージャ

UITextViewのテキストを1文字ずつ打ち出す

タイプライター風のUITextViewは既にありましたが、Swiftの練習とGitHubに慣れようということで作りました。

github.com

Xcodeは8.0、Swiftは3.0です。

httpの音楽ファイルをAVAudioPlayerで再生する

iOS

先日iTunes Search APIを使いまして、曲のプレビュー再生のURLを取得できることを知ったので、再生を試した時に書いたコードです。

AVAudioPlayerはシンプルに書けて再生できるので良いですね。

お母さんと仕事、なんとかやってこれました

ポエム

この記事は「子育てプログラマ・ITエンジニア・Webデザイナー Part 2 Advent Calendar 2015」の16日目として書いております。
(遅れてしまい申し訳ありませんでした・・クリスマスにギリギリ滑り込みになってしまいました)

この記事は

「時間」がうまく使えず悩みながらも、お母さんと仕事をなんとかやってこれました、という話です。

簡単に自己紹介です

2歳児を子育て中のお母さんプログラマです。

子どもが生まれて

「時間」に対する意識ががらりと変わりました。

独身時代はなんと贅沢に使っていたことか・・と悔やまれるほど
時間というものの価値の重さを感じているところです。

時間がうまく作れず

私は子どもが生まれてから2年間、「自己研鑽する時間なんてどうやって持てばいいのか・・」と途方に暮れる日々でした。

私は優れた技術者などではなく、ごく平凡な能力の人です。
もし優秀な人ならば、子どもがいようがいまいが、関係なく、時間を適切に使って自分の能力を高めていくことができるのだろうと思います。

ところが私ときたら、自分の体力を保つのがやっとで(特に1歳半までは本当に大変でした)、Webでパワフルなママさんの紹介記事を読むたびに、頑張って輝いているママさんを見て励みになるどころか、「私ってやつはどうしてこうなんだ・・」と焦り、落ち込んだものです。

今となって冷静に考え直せば、時間を作ることもできただろうとも思いますが、当時の私は目の前の事をこなすのに手一杯で、そこまで頭が回っていませんでした。

それでも少しずつ

子が2歳になったあたりから、少しずつ自分の時間を作れるようになってきました。

たとえ10分でも「本読んだ!やった!」とか「コード書いた!よーし!」と、「毎日」「少しずつ」「続ける」こと、そしてそれに対して「OK、できた!」と心の中で自分に言うことが、今の私にとって一番良い道なのだな、とようやくわかってきたところです。
(それすら出来ない日もあります。仕方ないとあきらめたり、意地にならないようにしています。)(意地になるとストレスが溜まり家庭に跳ね返るので。。)

時短勤務

時短勤務で働くようになってから、「人日」という計算がうまく当てはまらず悩んだことがありました。

私は1日6時間勤務にしています。人日は一般的には8時間なので、日で見ると私は人より長い期間かかることになり、ガントチャートを見ては能力がとても落ちたように感じて苦しかったです。

それでも仕事を続けることができているのは、夫の理解、職場の理解、この二つの力がとても大きいです。
色々な考えがこんがらがっている私の頭の中を、的格に言語化して整理整頓してくれる夫。
時短勤務然り、急なお迎えや休みにも理解を示してくれる職場。
人が助けてくれると、私の心にのしかかっていたものが、一瞬で軽くなる。人の力はすごい。
それでもやはり負い目は感じますし悩むことはありますが、仕事を続けることができています。

親年齢2歳

実年齢はアラサー、でも2歳か、うふふ、などと思うと、ほんの少し若返った気がしてきます。 (完全に気のせいですが、よいのです。)

「ああ、今日も理不尽に怒ってしまった、駄目母・・」と落ち込む日も多々ありますが、
30代になっても、反省することや課題は山積みで、落ち込んだり元気になったり、怒ったり喜んだり、こんなにも感情が激しく揺れ動くのか、と思うと、「私まだまだ伸びしろいっぱいありそう!」と能天気に考えれば、自分にワクワクもしてきます。
(20代の頃は、30歳をどうやって生きているかなんて想像すらしていませんでした)

あっという間に2年過ぎてしまったので、この先もっと加速しそうでおそろしいです。
さて成人する頃には一体どうなってるのか・・(想像できない)
娘と一緒にコード書けているといいな。

YouTubeDataAPIの動画再生画質サイズまとめ

iOS YouTubeAPI

iOSYTPlayerViewに定義されている定数YTPlaybackQualityとサイズの対応表、および再生画質関連のメモ。

YouTube JavaScript Player API Reference  |  YouTube IFrame API  |  Google Developers

動画プレーヤーの高さは以下のいずれかの値に、プレーヤーのサイズは 16:9 のアスペクト比にそれぞれ設定することをお勧めします。

YTPlaybackQuality 高さ (pixel) サイズ (pixel) アスペクト比
kYTPlaybackQualitySmall 240 320x240 4:3
kYTPlaybackQualityMedium 360 640x360 or 480x360 16:9 or 4:3
kYTPlaybackQualityLarge 480 853x480 or 640x480 16:9 or 4:3
kYTPlaybackQualityHD720 720 1280x720 or 960x720 16:9 or 4:3
kYTPlaybackQualityHD1080 1080 1920x1080 or 1440x1080 16:9 or 4:3
kYTPlaybackQualityHighRes 1080以上 1920x1080以上 16:9以上

たとえば、画質レベル large をリクエストし、それが無効な場合、再生画質は medium に設定されます(このレベルが有効であれば)。

YouTube Data APIでパラメータに日時を扱うとき

iOS YouTubeAPI

たとえば、YouTube Data API SearchpublishedAfterなど日時のパラメータを使う際、NSDateからNSStringに変換するメモです。

おまけ

publishedAfterは、「その日時以降の動画を検索対象にする」というパラメータです。実際には、Nowのところには「1日前」「1ヶ月前」などを入れて使います。

Carthageを使おう

iOS Carthage

環境

めも

  • Carthage関連の記事はSwiftと結びついていることが多いですが、Objective-Cでも使えます。
    (Carthageに対応しているライブラリはSwiftのものが多いのかなと)

  • CocoaPodsも併用していますが、どちらも問題なく使えます。
    (※ただ、ストアに申請したことがないので、併用が本当に問題ないかどうかは現時点では不明です)

  • 読みは・・「カルタゴ」が正解?
    (カーセージと読んでしまう><)

Carthageインストール

Homebrew環境です。

$ brew install carthage

もしPermission Deniedが出たら

私の環境ではパーミッションのエラーが出てしまったのでメモです。

Error: Permission denied - /Library/Caches/Homebrew/Formula/carthage.brewing

こちらを参考にしました。

Permission denied - /Library/Caches/Homebrew/Formula/nmap.brewing

$ sudo chown -R $USER /Library/Caches/Homebrew/

ディレクトリの権限を変更しておきます。

Cartfile

Cartfileというファイルを用意します。
CocoaPodsでいうところのPodfileですね。

「Cartfile」という名称のファイルを自分で作って、プロジェクトのディレクトリに置きます。
(pod init的なものはないようです)

Cartfileの例

例えば、
https://github.com/LeoNatan/LNPopupController.git
こちらのライブラリをCarthageで管理したいとして、Cartfileには

github "LeoNatan/LNPopupController"

このように書きます。

☆ 参考: Example Cartfile
LNPopupController (標準のミュージックアプリのミニプレーヤーに似たステキなControllerです)

carthage update

Cartfileの準備ができたら、

$ carthage update

を実行します。

正常に完了すれば、

  • Carthage フォルダ
  • Cartfile.resolved ファイル

が追加されます。

プロジェクトの設定

Carthage/Build/iOSの中に、xxx.frameworkがあります。
(その他にdSYMファイルなどがあることもあります)

Carthageで管理しているFrameworkを、プロジェクトに追加しましょう。

Linked Frameworks and Libraries

  1. 「General」タブを開く。
  2. 「Linked Frameworks and Libraries」の「+」から、Carthage/Build/iOSにあるxxx.frameworkファイルを選択する。

Run Script

  1. 「Build Phases」タブを開く。
  2. 「+」から「New Run Script Phase」を追加する。
  3. 「Shell」の欄に/usr/local/bin/carthage copy-frameworksを追加する。
  4. 「Input Files」の「+」から、$(SRCROOT)/Carthage/Build/iOS/xxx.frameworkを追加する。

☆参考: If you're building for iOS

.gitignore

☆参考: github/gitignore/Objective-C.gitignore

# Carthage
#
# Add this line if you want to avoid checking in source code from Carthage dependencies.
# Carthage/Checkouts

Carthage/Build

上の.gitignoreでは、CathageのBuildフォルダだけ除外という感じですが、
Carthageフォルダごと除外でよいかと思います。

# Carthage
Carthage/

私はフォルダごと除外しています。

Cartfile.resolved

Cartfile.resolvedについては、

strongly recommended to commit this file to your repository.

と念押しされています。

CartfileCartfile.resolveは、もれなくGit管理してあげましょう。

以上です!

これで、Carthageのインストール 〜 ライブラリを利用する準備が整いました。
想像よりも気楽に準備が整えられたので良かったです。

それと、Run Scriptを追加する若干の手間はあるとしても、CocoaPodsよりもプロジェクトとの結合が疎な感じが、個人的には気に入りました☆

参考

[Swift] CocoaPodsとCarthageの違い / ライブラリ管理 - Qiita

Swiftで使えるライブラリ管理ツールCarthageの使い方