fastlaneでipaを作るだけのlane

fastlaneを使ってAdHocの.ipaを作るだけのlaneを書いた時のメモです。

環境

  • Xcode: 8.2.1
  • Ruby: 2.2.3
  • fastlane: 2.13.0
  • gym_version: 2.13.0

fastlane initが無事に済んだ後の状態を想定しています。

AdHocのipaを作るだけのlane

fastlane_version "2.13.0"
default_platform :ios

platform :ios do
  before_all do
    # どのlaneでも実行する前に必ずやること
  end

  # ipaを作るだけのlane
  lane :make_ipa do
    gym(
      workspace: "プロジェクト名.xcworkspace",
      configuration: "Debug",
      scheme: "プロジェクト名",
      clean: true,
      include_bitcode: false,
      output_directory: "./build",
      output_name: "プロジェクト名.ipa",
      export_method: "ad-hoc"
    )
  end

  after_all do |lane|
    # どのlaneでも実行が終わった後に必ずやること
  end

  error do |lane, exception|
    # エラーが起きた時にやること
  end
end

ここではmake_ipaという名前のlaneにしましたが、好きな名前を付けましょう。

AdHocビルドにしたかったので

  • export_method: "ad-hoc"
  • configuration: "Debug"

という設定にしました。

include_bitcode

プロジェクトでENABLE_BITCODENOにしている都合で一応明記してみました。(でも不要かもしれない)

output_name

今回はプロジェクト名.ipaということにしました。どんな名前でもOK。

output_directory

.ipaを出力するディレクトリを指定できます。
好きな場所を指定しても良いし、記述しなくてもOK。(指定なしの場合はプロジェクト直下に出来上がります)

laneを実行する時

$ fastlane make_ipa

実行したいlaneの名前を指定します。

つまずいた事

シェルの環境設定に問題がありビルドエラー

ビルド時に以下のようなエラーメッセージが出てしまいました。

 Exit status: 1
 Your shell environment is not correctly configured
 Instead of UTF-8 your shell uses US-ASCII
 Please add the following to your '~/.bashrc':

        export LANG=en_US.UTF-8
        export LANGUAGE=en_US.UTF-8
        export LC_ALL=en_US.UTF-8

 You'll have to restart your shell session after updating the file.
 If you are using zshell or another shell, make sure to edit the correct bash file.
 For more information visit this stackoverflow answer:
 https://stackoverflow.com/a/17031697/445598

.bashrcに、

export LANG=en_US.UTF-8
export LANGUAGE=en_US.UTF-8
export LC_ALL=en_US.UTF-8

これらを追記する必要があるということでした。

なので、.bashrcに追記して、

$ source .bashrc
$ exec -l $SHELL

.bashrcを読み込み直して(これだけではまた同じエラーに見舞われたので)、シェルを再起動させてから、再びfastlane make_ipaを実行しました。

すると先ほどのエラーは消え、無事に.ipaが作成できました!

参考

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

クロージャ