fastlaneを使い始めるまでにつまずいた事メモ

前置き

  • 普段Rubyを使っておらず自分がどんなRuby環境でいるか忘れている

fastlane initでエラーになった

$ fastlane init
Ignoring xcodeproj-0.17.0 because its extensions are not built.  Try: gem pristine xcodeproj-0.17.0
/Library/Ruby/Gems/2.0.0/gems/bundler-1.13.1/lib/bundler/rubygems_ext.rb:45:in `full_gem_path': uninitialized constant Bundler::Plugin::API::Source (NameError)

一旦、自分のRuby環境がどうなっているのか見直すことにしました。

rbenvを整える

Homebrewを使っています。
しばらくHomebrewをupdateしていなかったので、まずはupdateから。

$ brew update

無事にupdateが済んだので、rbenvを入れます。

$ brew install rbenv
Error: rbenv-0.4.0 already installed
To install this version, first `brew unlink rbenv`

以前にrbenvを入れていたようでalready installedと言われてしまいました。(すっかり忘れている…)

次はruby-buildをupgradeします。

$ brew upgrade ruby-build

こちらはもりもりと更新された。

Rubyのバージョンを確認

$ rbenv versions
  system
* 2.2.3 (set by /Users/なまえ/.rbenv/version)

ちゃんと設定されていそうでしたが、ruby -vで確認してみると、

$ ruby -v
ruby 2.0.0p648 (2015-12-16 revision 53162) [universal.x86_64-darwin15]

思ってるのと違う…。システムの方が選択されている様子。

$ rbenv init
# Load rbenv automatically by adding
# the following to ~/.zshrc:

eval "$(rbenv init -)"

.zshrcに追記が必要との優しい案内が表示されています。(私はzshを使っているため)

.zshrc設定

.zshrcを開いて中身を確認すると、確かにeval〜の記述がなかったので追加します。

eval "$(rbenv init -)"

保存したら読み込み直します。

source ~/.zshrc

そして再度Rubyのバージョンを確認すると、

$ ruby -v
ruby 2.2.3p173 (2015-08-18 revision 51636) [x86_64-darwin15]

やった!!

これでrbenvの環境が整いました!

一応、どこを見ているのか確認してみると

$ which ruby
/Users/なまえ/.rbenv/shims/ruby

ちゃんとrbenvを見ている様子!

gem install fastlane

これまではgem installすると、Permissionが云々と怒られてはsudo gemなどして、それでも失敗する様な事が多かったのですが、問題なくinstallできるようになりました。

$ gem install fastlane

無事にfastlaneをインストールすることができました。
その後、$ fastlane initも問題なく動作しました。よかった!

参考

Python入門者の小メモ

業務では特に使うことがないPythonですが、お気に入りの言語なので少しずつ学んでいます。 その時のメモが出てきたのでまとめました。

passは何もしない

# 何もしないメソッド
def main():
    pass

pycache

同じプログラムを実行しているとキャッシュができる。
キャッシュが存在している場合は実行速度が変わるので都度削除する。

実行時間を計測する

$ time python calculator.py < calculator.txt

timeはプログラムの実行時間を表示してくれる。

メモリ使用量を計測する

memory_profilerを使う。 psutilも併せてインストールしておくとよい。

$ pip install psutil memory_profiler

hoge()のメモリの使用量を確認する。
対象のメソッドに@profileを書く。

@profile
def hoge():

そして以下のように実行すると、メモリ使用量が出力される。

$ python -m memory_profiler hoge.py < hoge.txt

使わない変数を省略する

_ = int(input())

_で変数を省略できる。

パパいつもありがとう

この記事は【その2】妻・夫を愛してるITエンジニア Advent Calendar 2016の21日目の記事です。

www.adventar.org

みなさんのエピソードはどれもキラキラとまぶしくて、読んでいて幸せな気持ちになります。 ご夫婦揃ってエンジニアなご家庭も意外と多いように感じました。

我が家もエンジニア夫婦です。夫はWeb、私はスマホアプリです。

お互いに得意分野は違っていて、好きな言語も違います。
プライベートで使っているOSは、夫はWindowsAndroid、私はMaciOS
PCはThinkPadとMacBookAir。(あぁProがほしい)

…共通項がなかなか見つかりません!
そんな二人が力を合わせたらなんでも作れるんじゃないかしらと思ったりしますが、そこまではなかなか至らずにいます。

技術的な面のみならず、人間性や精神的な面などでも、私にはない物を持っていて尊敬します。
言いたい事を上手く伝えきれないことがよくありますが、うまく変換して受け取ってもらっています。

そして、3歳になった子どもがいます。
最近は娘の言語能力の高さに驚きながら、細かいところにびっくりするほどよく気が付くので、ずぼら母はしょっちゅう注意されてタジタジです。私よりもしっかりしている。
キーボードに書いてある自分の名前のひらがなを探している姿には、胸がキュンとします。

こんなにもかわいいかわいい娘がこの世に誕生したことも
今の私がエンジニアを続けることができているのも
愛する夫のおかげです。
ありがとうございます!

そしてもっともっとハッピーな家族になりたいので、来年は家庭内PDCAサイクルを回してみたいなと思っている所存です。ふふふ…

これからもよろしくお願いします♪

Metalに入門してみました

この記事はGeekWomenJapan Advent Calendar 2016の8日目の記事です。

qiita.com

以前から気になっていたiOSのグラフィックスAPIMetalに入門してみました。
そしてクリスマスらしく、クリスマスツリーをMetalで書いてみることにしました。

f:id:takopomm:20161208001504p:plain

(入門ということで生温かい目で見てください…!)

環境

ツリー概要

このように三角形を6個組み合わせてツリーのような形にしました。

f:id:takopomm:20161208003134p:plain

三角形の各頂点に、それぞれ色を付けています。
葉っぱの部分は、黄緑から濃緑にグラデーションしています。

Metalで描画するためにやったこと

各処理の詳細については省略しますが、Metalで描画する際のおおまかな流れです。

  1. Metal Deviceを作る
  2. コマンドキューを用意する
  3. レンダリングパイプラインを作る
  4. クリスマスツリーの三角形たちの頂点座標&色データを定義して、頂点バッファを作る
  5. 画面をクリア
  6. コマンドバッファを作る
  7. ツリーを描く
  8. 画面に表示する

このうち、5〜8を毎フレーム繰り返しており、常に画面全体を書き直しています。

実行してみる

Metalはシミュレータで動かないので、実機で実行する必要があります。

シミュレータを選択した状態で実行してみると、

Use of undeclared type 'CAMetalLayer'

と、Metalに関連するコードが解決できず、ビルドエラーになってしまいます。
(しばらくハマってしまいました)

Metalで描ける形状のメモ

  • point (点)
  • line (線分)
  • lineStrip (点を順番につなげて線にする)
  • triangle (三角形)
  • triangleStrip (頂点を共有した三角形)

四角形を描画するには、三角形を2つ並べます。

成果物

こちらにソースコードがあります。

github.com

MetalView.swiftに、ほとんどすべてが詰まっています。

感想

  • OpenGLの知識がまだうっすら残っている状態だったので、何をすればよいかおおよそ把握できていたことは、Metal入門においてかなりプラスに働きました。

  • Swiftで書けるところが好印象です。

  • ビルドにすごく時間かかりました。 ちょっと直して、もう一度実行する時の待ち時間が辛かったです。。(この辺りは何かTipsがあるのかもしれませんが)

  • やり残したことは、「テクスチャを貼る」。せめて背景画像を出せたら、もう少しマシな画面になったかも・・

最後に・・

GeekWomenのアドベントカレンダーということで、元気はじける3歳児を育てるヨボヨボお母さんエンジニアの小話など書こうかなと思っていましたが、ふとMetalの神様が降りてきました。今の業務で使うことはないのですが、久しぶりにグラフィックス周りに触れてみたらやっぱり楽しかったです。今年のうちにMetalとたわむれることができて良い年越しができそうです。

参考

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

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

クロージャ

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

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

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