学生かえるエンジニアのブログ

iOSを主にやる勉強中エンジニア。かえるが好き。ピクルスってかわいいよね。

TravisCI を使用して GAE にデプロイ

最近GCP*1のGAE*2を使用しています。github上で特定のブランチが更新されたら自動でデプロイしてほしいなと思い、Travis CI で自動デプロイされるよう試みました。

※ 今回テストなどは走らせていません。ただただデプロイするだけです。

.travis.ymldeploy キーを利用したデプロイプロバイダを使用した方法がありますが、今回は利用していません。

※ サービスアカウントキーを扱うなど、セキュリティ面での懸念点があります。当記事は全て自己責任でご参考下さい。

手順 (目次)

  1. The Travis Client をインストール
  2. サービスアカウントキー作成
  3. サービスアカウントキー暗号化
  4. .travis.yml 編集
  5. リモートリポジトリへプッシュ

方法

1. The Travis Client をインストール

travis コマンドを使用できるように、The Travis Client をインストールします。

gem install travis

詳しくは公式ページを参考にインストールして下さい。

2. サービスアカウントキー作成

GCPAPIとサービス/認証情報ページに行き、サービスアカウントキーを作成して下さい。作成する際はJSONを指定しましょう。

作成後にダウンロードされたjsonファイル名を今回は client-secret.json とします。

f:id:yuki0n0:20171012040213p:plain:w300
f:id:yuki0n0:20171012040220p:plain:w300

3. サービスアカウントキー暗号化

travis コマンドを利用し、ファイルを暗号化します。

travis login --pro
travis encrypt-file client-secret.json --add

--add オプションをつけることで .travis.yml にファイルを復号化するコマンドを自動で追記してくれます

4. .travis.yml 編集

下記は最低限の.travis.ymlを示しています。

language: ruby

env:
  - PATH=$PATH:$HOME/google-cloud-sdk/bin

before_install:
  - openssl aes-256-cbc -K $encrypted_key -iv $encrypted_iv
    -in client-secret.json.enc -out client-secret.json
    -d

install:
  # install gcloud
  - export CLOUDSDK_CORE_DISABLE_PROMPTS=1
  - curl https://sdk.cloud.google.com | bash

  # setup
  - gcloud config set project <projectid>
  - gcloud auth activate-service-account --key-file client-secret.json

script:
  - gcloud app deploy

まずbefore_installで暗号化したjsonファイルを復号化します。これらは手順3で自動追記されたものです。

そしてinstall内でgcloudコマンドをインストールし、deploy出来るようにprojectidやアカウント情報などを読み込みます。

今回の方法で google cloud sdk をインストールした場合。google-cloud-sdk/bin/gcloud にgcloudがあります。そのためenvでパスを通します。

最後に script でデプロイしています。

5. リモートリポジトリへプッシュ

.travis.ymlclient-secret.json.enc を add/commit し、push しましょう。

client-secret.jsongit add/commit/pushしないで下さい。

備考/補足

  • 現状だと毎回gcloudをdownload/installしてるので、TravisCI上のcacheなどを利用すると良いと思います。

  • deploy時のオプションなどお好みでセットしましょう。

  • client-secret.json はgit管理下で保持しておくならば.gitignoreに含めておきましょう。

  • 上記に示した .travis.yml は最低限のものです。 branchesafter_success など各自で記述して下さい。

参考

後記

CIとかもっと活用していけたらいいな。

間違いとかアドバイスとかあればコメント下さい!

*1:Google Cloud Platform

*2:Google App Engine

Xcode9 & iOS11 で ワイヤレスデバッグ

Xcode9iOS11 を使用するとワイヤレスで実機テストができるようになりました!

かなり便利!

方法

1 Devices を開く

Xcode のメニューバーから Window > Devices and Simulators を開く

f:id:yuki0n0:20170927194529p:plain

2 Connect via network を ON

最初は実機とUSBで接続して下さい。

f:id:yuki0n0:20170927195926p:plain

3 実機で実行

右側に地球のマークがでます。

(当然MaciPhoneを同じネットワークに接続して下さい。)

f:id:yuki0n0:20170927200245p:plain

参考

後記

大学の後期がはじまって1週間くらいたちました。疲れた。

localhost:8000 とかを公開、共有

はじまり

webページの開発・デバッグ時はlocalhostの任意のポートで確認すると思いますが、この開発中のページを一時的に公開したり、外部から接続したくなることがでてきました。

そしてそういうサービスが存在することを知ったため、この類のサービスをいくつか試し、無料で使用できる2点を紹介します。

筆者はweb開発などに対し知識が浅いです。今回紹介することは、通常外部からアクセスできないlocalhostに対して穴を開けてアクセスできるようにすることなので、セキュリティ上のリスクは少なからず高まります。ご利用される際は自己責任でお願いいたいます。

ngrok

https://ngrok.com/

結構有名でよく使用されてるっぽいです。

インストール

公式ページからOSにあったngrok.zipをダウンロード、解凍したら使用できます。

直接ngrokが存在するディレクトリに対して./ngrok としてもいいし、pathの通ってる所に解凍したngrokを移動してもいいと思います。

使用方法

8000ポートを解放

$ ngrok http 8000

ベーシック認証をつける

$ ngrok http -auth "user:password" 8000

ポイント

localtunnel

https://localtunnel.github.io/www/

ngrokよりは使用されてない感じがしますが、ソースコードが公開されており、全て無料で利用できます。

インストール

nodejs が必要です

$ npm install -g localtunnel

使用方法

8000ポートを解放

$ lt --port 8000

サブドメインを指定

$ lt --port 8000 --subdomain aiueo

ポイント

類似サービス

今回紹介しなかったけど、他にも色々あるみたいです。

参考

後記

Apple界隈では、iOS11やらiPhone8、iPhoneXやら、賑わってますね。

最近はwebやapiを見ることが多いです。

Storyboard上のNavigationBarのサイズでワーニングがでてる

Storyboard で Navigation Bar (というか Navigation Controller ) を使ってたら Warning がでて、

良くある AutoLayout の本来あるべき位置とのズレとかで出てるやつかと思って update frames しても治らない

特に直さなくても Warning だから実行は出来るし問題はないけど、精神衛生上よくないから消したい。

エラー内容

Frame for “Navigation Bar” will be different at run time.

Xcode 8.3.3

解決策

ViewController の Simulated Size を一度 Freedom にしてから Fixed に戻す

f:id:yuki0n0:20170817111923p:plain

参考

ios - Warning frame for "Navigation bar" will be different at run time appears in XCode 8 Swift 3 - Stack Overflow

後記

最近ラズパイ買ってraspbian動かしたり、virtual boxでubuntu動かしたり、TVチューナー買って遊んだりしてるのでまた記事にできたらいいな。

Swift / 変数・定数(property)編

以前「Optional 〇〇」系の言葉についてまとめた記事を上げてみました。

yuki0n0.hateblo.jp

今回は変数・定数などのpropertyについてまとめたいと思います。

今回は名称だけでなく記述方法等、使い方にも少し踏み込みたいと思います。

Property

下記のようないわゆる変数・定数がありますね。

var name = "yuki"

これをpropertyといいます。これには大きく2種類あります。

Stored Property (保持型プロパティ)*1

var name = "yuki"
let name = "yuki"

これは通常の変数・定数です。

プロパティ監視

var name = "yuki" {
    willSet(newName) {
        print("\(name)から\(newName)に変更するよ")
    }
    didSet(oldName) {
        print("\(oldName)から\(name)に変更したよ")
    }
}

このようにゲッターセッターを備えることが出来ます。 このプロパティ監視は stored property にのみ使用できます。

もし引数を与えない場合、willSet内ではnewValue、didSet内ではoldValueという名前で値が取得できます。

下記に使用条件等を示しておきます。

  • このプロパティ監視は保持型プロパティの変数(var)のみに使用できます。
  • didSet内で自分自身の値を変更すると、上書きされ、この際プロパティ監視は呼ばれません。
  • 後述の遅延評価プロパティ(lazy)には使用できません。

Lazy Stored Property (遅延評価プロパティ)

lazy var human = Human()

先頭にlazyとつけることで遅延評価プロパティとなります。アクセスされるまでインスタンスが生成されないと言うものです。

重いインスタンス生成で、使用されるかわからないプロパティなどに使用すると価値が発揮されます。

  • 保持型プロパティの変数のみに使用できます。
  • 先述のプロパティ監視は使用できません。

Computed Property (計算型プロパティ)

var height: Int = 9
let width: Int = 10
var area: Int {
    set(newArea) {
        height = newArea / width
    }
    get {
        return height * width
    }
}

computed property は、3行目のareaのようなpropertyを言います。名称の通り、計算をするプロパティであり、値は保持しません。

setに引数を与えない場合、set内でnewValueという名前で値を取得できます。

  • varだけ使用できます。(letは使用しません。)
  • 型を指定しなければいけません。(stored propertyのような型推論は無いです。)

read-only computed property

var area: Int {
    return height * width
}

もし computed property でgetのみを使用する場合、get{}は省略できます。こうすることでreadonlyなプロパティとなります。

参考

後記

夏休みになりました。

もし間違い等ありましたらコメントなどで教えてください。感想なども待ってます!

*1:格納型プロパティとも呼ばれるそうです

ゆうちょダイレクトのお客さま番号を半自動入力

ブラウザにIDパスワードを保存する機能がありますよね。これのおかげで頻繁にアクセスする会員制のサイトでもストレスなく使用することが出来ます。

しかし、ゆうちょ銀行の場合、はじめにお客さま番号とかいう4桁-4桁-5桁意味不明な番号を求められます。

こんなの覚えてられるか。

自動入力してくれ。

そんな気持ちにお答えして、普段自分が使っている自作のブックマークレットを紹介しましょう。

※当記事により発生した損害等の責任は一切負いかねます。
ブックマークレット上に書くだけなのと、このお客さま番号だけでログインできるわけではないので過度に心配する必要はないと思いますが、万が一不正アクセスに成功された場合送金などを許すことになるのを念頭に置きましょう。

使い方

1. ブックマーク作成/追加

ブラウザでブックマーク(お気に入り)を作成して下さい。

よくわからなければ、このブログをブックマーク(お気に入り)に追加して下さい。

2. URL欄を書き換える

1.で作成したブックマークのURLの欄を消し、下記コードをコピペして下さい。

このとき、このコードの中の上4桁, 中4桁, 下5桁と書いてある所は自分のお客さま番号に書き換えてください。

javascript:(function() {var focus1 = document.getElementById('focus1');var focus2 = document.getElementById('focus2');var focus3 = document.getElementById('focus3');focus1.value = "上4桁";focus2.value = "中4桁";focus3.value = "下5桁";})();

ブックマークの名前の欄は「お客さま番号入力」など好きな名前に書き換えてください。

3. 使う

あとは使うだけです。

ゆうちょダイレクトのログインページに行き、普段ブックマークしたサイトを開くのと同じように、先程作成したブックマークをクリックします。

問題がなければ入力欄に自分の番号が入力されているはずです。

コードの説明

説明するまでもないコードですが一応。

お客さま番号の各値はタグのidがfocus1~3だったので、そこに自分のお客さま番号を代入してます。

javascript:(function() {
    var focus1 = document.getElementById('focus1');
    var focus2 = document.getElementById('focus2');
    var focus3 = document.getElementById('focus3');

    focus1.value = "0000";
    focus2.value = "0000";
    focus3.value = "00000";
})();

後記

GWですね。うん。

Swiftの言葉・名称の理解 (if-let 構文など「Optional〇〇」)

独学で学んでいると、

「書けるけど名称がわからない」

「だから困ったときに検索しづらい」

「エンジニアとの会話で言いたいことが言えない・相手の発言が理解できない」

こんなことがよくあります。言葉を理解しようということで、Optional系の言葉をまとめてみました。

Forced Unwrapping フォーストアンラッピング

var str: String?
print(str!)

上記のように!をつけてオプショナル型を強制的に非オプショナル型にします。

もしstrnilだった時落ちてしまうため、いかなるときもあまり推奨されません。

Nil Coalescing Operator ニルコアレーシングオペレーター

var str: String?
let unwrapStr = str ?? ""

[1.オプショナルな値] ?? [2.左と同じ型で非オプショナルな値] こう書くことで、

もし1がnilの時は2が、もし1がnilで無い時は1が返り、かつ非オプショナル型で返ります。

上記の例でいくとunwrapStrは非オプショナルな通常のString型であり、safetyなコードとなります。

if文や三項演算子nil判定などすると可読性が失われたりコードが冗長になるので、この書き方はスマートで好きです。

Optional Binding オプショナルバインディング

var str: String?

if let unwrapStr = str {
    print(unwrapStr) // unwrapStrはオプショナルではない
}
// この場所でunwrapStrは使えない

str! などするのは、例えnilで無いことが確実であっても少し嫌。そんなときに書く出番も多いこの書き方ですね。

単純に if-let 構文 といったりもするようです。

guard-let 構文 (guard との併用 )

この書き方も多いです。この書き方はインデントが深くならない所が魅力的です。

この記事は名称把握のためであって技術的解説が目的ではないので細かくは割愛します。

guard let unwrapStr = str else {
    // strがnilの時 (この場所でunwrapStrは使えない)
    return
}
// この場所でのunwrapStrは非オプショナル型

Shadowing シャドーイング

これは同じ名前の変数を宣言する的な事でしょう。

例えば関数の引数をいじりたい時、直接はいじれないので同名の変数を宣言してから扱います。

func foo(i: Int) {
    var i = i
}
// func foo(var i: Int) という書き方はswift3から出来なくなりました。

先程の Optional Binding の時にもつかえて、下記の様に使います。

この書き方のほうが頻出でしょうね。

var str: String?

if let str = str {
    print(str) // この場所でのstrは非オプショナル
}
// この場所でのstrはオプショナル

Optional Chaining オプショナルチェーニング

class Fruit {   
    var name: String
    func cook() -> String
}
var fruit: Fruit?

let fruiteName = fruit?.name
// fruit がnilの場合、fruiteName は nil
// そうでない場合、通常の値がオプショナル型で返る

let food = fruit?.cook()
// fruit がnilの場合、cook関数は実行されず、foodはnil
// そうでない場合、cook関数は実行され、通常の値がオプショナル型で返る

上記のように、オプショナルのプロパティやメソッドを、?で繋ぐことでOptionalChainingとなります。

これにより、fruitnilか否かを事前に判定する必要などもなくsafetyにコードを書くことが出来ます。

ただ、返る値がオプショナルになります。

参考

どこよりも分かりやすいSwiftの"?"と"!" - Qiita

【Swift】オプショナルバインディングでネストを避ける - Qiita

var a = a や if let b = b {} のような紛らわしい構文も使えるswiftのシャドウイング - Qiita

swift-evolution/0003-remove-var-parameters.md at master · apple/swift-evolution · GitHub

【Swift】Optional型を安全にunwrapしよう - Qiita

後記

間違いや追加情報などありましたらコメントお願いします!

感想やご意見などもぜひぜひ!