Goalist Developers Blog

UITextFieldのキーボード操作で使えるTips

こんにちは。
最近タイピング時に小指が痛い渡部です。

f:id:watabe1028:20170316174757j:plain

今日はアプリ開発時によく使うUITextFieldのキーボード操作に便利なTipsについて書きます。

結構面倒な実装だし、ググると色々なパターンがあって悩んでしまう人もいると思うので
個人的に一番簡単だと思う実装方法を紹介しようと思います。

多分最も使うであろう機能
1.ボタン押下でキーボードを閉じる
2.ボタン押下で次のUITextFieldに移動する
3.画面タップでキーボードを閉じる
4.入力欄にかぶらないように画面をひょいっと動かす
を順に書いて行きます。

1.ボタン押下でキーボードを閉じる

まずはSingle Applicationでプロジェクトを作成し、UITextFieldを設置します。

まずここでビルドするとUITextFieldをタップするだけでキーボードが表示されます。
(背景をlightgrayにしてます)

f:id:watabe1028:20170316173204p:plain

しかし、その後閉じることができません。

「return」ボタンを「Done」ボタンに変更し、閉じれるように変更します。

手順1

StoryboardでUITextFieldを選択し、「Return Key」を「Default」から「Done」に変更します。

f:id:watabe1028:20170316173232p:plain

手順2

UITextFieldをOutletでソースと紐づけます。
そのままDelegateの設定をし、必要なデリゲートメソッドを記述して行きます。

import UIKit

class ViewController: UIViewController, UITextFieldDelegate {

    @IBOutlet weak var textField: UITextField!
    
    override func viewDidLoad() {
        super.viewDidLoad()
        textField.delegate = self
    }

    override func didReceiveMemoryWarning() {
        super.didReceiveMemoryWarning()
    }
}

デリゲートメソッドを追加

    // このメソッドを追加
    // Doneボタン押下でキーボードを閉じる
    func textFieldShouldReturn(_ textField: UITextField) -> Bool {
        
        textField.resignFirstResponder()
        return true
    }

これでキーボードを閉じる設定ができました。

2.ボタン押下で次のTextFieldに移動する

次は入力フォームのような複数のUITextFieldがある場合、
「Next」ボタンを押して次のUITextFieldに移動するように設定します。
今回はタグを使ってやってみます。

手順1

UITextFieldを一つ追加してOutletで繋ぎます。

最初のUITextFieldにはタグに「0(デフォルト)」を
追加したUITextFieldには「1」を設定します。

f:id:watabe1028:20170316173302p:plain f:id:watabe1028:20170316173324p:plain

手順2

最初のUITextFieldの「Return Key」を「Done」から「Next」に変更します。
追加したUITextFieldの「Return Key」を「Default」から「Done」に変更します。

手順3

先ほど追加したデリゲートメソッドの中身を変更します。
内容はボタンが押されたUITextFieldのタグによって次に進むか
キーボードを閉じるかを判断します。

    // このメソッドを修正
    // Doneボタン押下でキーボードを閉じる
    func textFieldShouldReturn(_ textField: UITextField) -> Bool {
        
        switch textField.tag {
        case 0:
            // タグが0ならsecondTextFieldにフォーカスを当てる
            secondTextField.becomeFirstResponder()
            break
        case 1:
            // タグが1ならキーボードを閉じる
            textField.resignFirstResponder()
            break
        default:
            break
        }
        return true
    }

コード的にはスマートではないですが、とってもシンプルですね。

これでフォーカスの移動とキーボードの閉じるが実装されました。

3.画面タップでキーボードを閉じる

実はUITextFieldのキーボードはキーボードをしまうインターフェースがありません。
なので大体のアプリでは画面の他の部分をタップするとキーボードが閉じるように設定されています。

手順1

タップジェスチャーを追加します。
Storyboardで「Tap Gesture Recognizer」をviewに追加します。

f:id:watabe1028:20170316173345p:plain

手順2

追加するとViewController上部に表示されるので
そこからソースと紐づけます。
今回はOutletではなくActionにします。

f:id:watabe1028:20170316173405p:plain

手順3

追加したメソッドに1行追加します。
たった1行です。

    // 画面タップ時に呼ばれる
    @IBAction func tapScreen(_ sender: Any) {
        self.view.endEditing(true)
    }

これで完了です。
実行すると画面タップでキーボードが閉じます。

4.入力欄にかぶらないように画面をひょいっと動かす

これはちょいと面倒です。
色々なやり方がありますが、個人的に最も簡単な方法は
入力時に画面自体を動かしてしまうことです。
ボタンを追加してキーボードに隠れてしまうように設置します。
仮にログインボタンとします。

f:id:watabe1028:20170316173427p:plain

手順1

NotificationCenterという通知をviewDidLoadに追加します。
キーボードを開く際に通知で画面を動かす処理を呼び出します。

通知の設定

        // キーボードを開く際に呼び出す通知
        NotificationCenter.default.addObserver(self, selector: #selector(keyboardShow), name: NSNotification.Name.UIKeyboardWillShow, object: nil)
        
        // キーボードを閉じる際に呼び出す通知
        NotificationCenter.default.addObserver(self, selector: #selector(keyboardHide), name: NSNotification.Name.UIKeyboardWillHide, object: nil)
手順2

同様に閉じる処理を呼び出す処理も追加。

    // キーボード表示時
    func keyboardShow() {
        // キーボードを開く際に画面を上に50ずらす
        self.view.bounds = CGRectMake(0, 50, self.view.frame.size.width, self.view.frame.size.height)
    }
    
    // キーボード非表示時
    func keyboardHide() {
        // キーボードを閉じる際に画面を元に戻す
        self.view.bounds = CGRectMake(0, 0, self.view.frame.size.width, self.view.frame.size.height)
    }

ついでにSwift3ではCGRectMakeはそのままでは使えないので
自分でラップさせます。
筋肉で解決です。

    // CGRectMakeをwrap
    func CGRectMake(_ x: CGFloat, _ y: CGFloat, _ width: CGFloat, _ height: CGFloat) -> CGRect {
        return CGRect(x: x, y: y, width: width, height: height)
    }

以上の追加でキーボードの表示、非表示で画面がいい感じに動きます。

f:id:watabe1028:20170316173446p:plain

まとめ

いかがだったでしょうか?
以外に面倒なキーボード操作もこれくらいなら
コピペで10分で実装できます。
いちいち実装が面倒な時はこのブログをコピペで使って頂けたらと思います。

インフラエンジニアならtmuxを使いこなしているか!?

こんにちは。インフラぼっちです。 開発メンバーと色々お話していると、
あらゆるコマンドや便利なものをまったく知らない状況なので、
現在メンバーに技術のシェアなどをしています。

■tmux(ティーマックス)とはなんなのか

f:id:r-adachi:20170308150844j:plain

サーバに入ると突然ssh切れたりセッションし直すのは
めんどくさいと思う人多いと思います。(特にインフラやってる人)
iTerms2でペインを分割(⌘ + d)でできますが、
また踏み台からsshログインするのもめんどくさい。
これを解決するのがtmuxです。
もともとscreenで同じようなことができるのですが、
比べるとtmuxのほうがサーバのメモリー等負荷がなく、サーバに優しいのです。
以下が概要となります。

端末多重化ソフトウェアで、1つのターミナルで操作しているシェルから実行したtmux上で複数の仮想端末を操作できるため、
ターミナルを複数開くことなく複数のサーバへログインしたり、それぞれの仮想端末で別々のプログラムを実行できるようになるため、
より効率的に作業が行える。

→つまりターミナルを新規タブとか開く必要がない

■tmuxの流れ

今回はローカルでtmuxを使った様子を貼ります。
f:id:r-adachi:20170308122120g:plain

・本番環境であれば
1.踏み台に入る(ssh)
2.tmux lsで確認(自分のtmux)
3.セッションを作る/アタッチする(新規でtmuxを立ち上げる場合)
4.セッションに入る
5.デタッチ

gifでイメージが分かったかと思います。

■インストール方法

・Mac

$ brew install tmux

・CentOS(Amazon Linux)

$ sudo yum install tmux

・Ubuntu

$ sudo aptitude install tmux

■.tmux.confの設置

$ vim ~/.tmux.conf

https://github.com/RVIRUS0817/ansible_Mac/blob/master/roles/homedirectory/files/.tmux.conf
私独特の設定ファイルですが、いろいろ見てやってください。

■tmuxコマンド

tmux独特のコマンドがあって、
毎回キーバインドを押して作業に入ります。
(ちなみにCtl-bがデフォルトですが自分の場合はCtl-tにしてます。)

・tmux ls
セッションの確認(他の人も使うので確認大事)

・tmux a -t name
セッションアタッチ(デタッチして保存してるものから復帰します)

・tmux new-session -s name
nameというセッション作成

・Ctrl-b + c
新規ウインドウ作成(Ctrl-bはキーバインドと言います)

・Ctrl-b + ,
ウインドウの名前変更(わかりやすく変えましょう)

・Ctrl-b + p
ウインドウの切り替え

・Ctrl-b + “
水平分割

・Ctrl-b + %
垂直分割

・Ctrl-b + o
ペイン移動(複数の端末)

・Ctrl-b + x
ペイン分割削除(イマイチなら消す)

・Ctrl-b + o
ペイン場所替え(同時押しにすると!?)

・Ctrl-b + カーソルキー上下
ペインサイズ変更(サイズ変更)

・Ctrl-b + [
コピーモード (vimと同じhjklで動かし、スペースで選択、エンターで戻る)

・Ctrl-b + ]
貼り付け(オプションキー長押しでコピーもできる。iTermの場合)

・コマンドキー + Altキー
選択してコピー

・Ctrl-b + d
セッションのデタッチ(保存して抜ける。ssh切れてもまたセッションを繋げばOK)

・Ctrl-b + r
tmux.conf再起動(conf変えたら再起動しましょう)

■アタッチとセッションを簡単にする

毎回アタッチとセッションをコマンドで叩くのはめんどくさいので
tm nameみたいな感じでできたらいいなと思い作ってみました。

・.bashrc/.zshrcに追記する

#tmux
function tm() { 
       if [ -n "${1}" ]; then
           tmux attach-session -t ${1} || \
           tmux new-session -s ${1}
    else
           tmux attach-session || \
           tmux new-session
       fi
}

・反映

$ source ~/.bashrc
$ source ~/.zshrc

■まとめ

いかがだったでしょうか。
tmuxを使えば何か障害があってもすぐにサーバにログインできますし、
仮想ターミナルってすばらしい。。
小さいインフラ規模でもtmuxを使っていれば管理も楽そうです。
ちなみに弊社の開発部鈴木くんは馴染めないそうです。(残念)
あと踏み台にセッション貼るよりも多段sshでローカルにセッション貼った方がもっといいです。

新卒エンジニアブログを書く

初めまして、イイオです。
昨年4月にゴーリスト初の新卒採用で働き始めました。 f:id:y-iio:20170302150445j:plain ぶれぎみです。  

初回投稿なので簡単に自己紹介をします。

これまで

昨年3月まで都内の大学に通っていました。学部は文学部で美術史を専攻していました。
学問をするというのは得難い体験でした。
やっても人生に意味を与えて解決することはできない、でありながら、自ら目標を立ててある程度のところに到達せねばならない、という点で大学での勉強は仕事や生きることに通ずるところがあるように思います。

やりたいこともやれることもないので就活は大変でしたが、ひょんなことからゴーリストに入社することになりました。
 

4月に入社し、それから3か月ほど技術研修を受けました。
新しい環境に入り他人と関わることはストレスフルだと思い続けていましたが実際のところそうでもありませんでした。
入社前の面談の時点で何となく人と合いそうだという予感はありましたが、会社というお金を稼ぐという一点で全員が同じ方向を向いている場だというのも大きいように感じます。
働くというのも悪くないと思いました。

研修を受ける中でやれることが少しずつ増えていくのは気分がよかったです。
 

実務開始して半年ほどはWebアプリのチーム開発に参加しました。
研修でやったのとは違う言語にフレームワーク、客先への訪問ヒアリングとてんやわんやでしたが、優しい上司と周りからのサポートでなんとか奮闘しました。
 

年末ごろ、研修時に企画開発したアプリが日の目を見ることに決まりました。
年が明けてからはチームをほとんど離れ、一人しこしことこのアプリの改修を続けています。
デザインとか画面の見た目を変えるのは分かりやすく楽しいです。
 

開発の傍ら、イベント参加や会社説明会など新卒採用の企画も行っています。

今年は6人(昨年度の3倍!)の入社が決まりました。
最近リニューアルした採用ページはこちらです。
中途新卒ともに一緒に働く仲間を募集しています。

recruit.goalist.co.jp

好きなもの

近代文学が好きです。
最近はゴーリスト文学部がひそかに活動していて、社内のフリースペースで読書会などを行っています。
先月は芥川の河童を読む会をしました。河童のお産のシーンは印象的でした。
芥川龍之介 河童

これから

ブログではアプリの開発で躓いたところですとか、会社の雰囲気を伝えられるような云々を書いていければと思います。
よろしくお願いします。

GEEK GARAGE iOS vol1 に行ってきた@秋葉原

こんちは。渡部です。
先日久しぶりiOSの勉強会に行ってきたのでレポートを書きたいと思います。

f:id:watabe1028:20170224152511j:plain

会場はMAMORIOさんのオフィス、GEEK GARAGE
会社から徒歩10分くらいなので非常に参加しやすい。

MAMORIOさんは
「なくすを、なくす」をモットーにしたIoT企業です。
最近また資金調達をして絶好調みたいです。

www.mamorio.jp

代表の増木さんとは以前、何度かお会いしてお話ししました。
勉強会とかやりたいねーとか言ってたら本当にやってくれました。


今回の勉強会はこちら。

geekgarage.connpass.com

すでにvol2の応募が始まってます。
興味ある方は是非!


勉強会のLTはこの3本。
・みんな使おう!AWS Device Farm
・ぼくがかんがえたさいきょうのIoTゲートウェイ(うろ覚え)
・EDIT BREAKPOINT


「みんな使おう!AWS Device Farm」

MAMORIO iOSエンジニア佐藤さん

AWS のモバイルアプリ試験用のサービス、
AWS Device Farm の使い方をデモしながら見せてくれました。

aws.amazon.com

最初の250分は無料だとか。
端末やOSを選択して、Xcodeでアーカイブして、テストコード作って、
AWSにアップすると勝手に試験をしてくれる。
しかも途中のスクリーンショットや動画も見れる。
これはUI試験のエビデンスにぴったりな気がする!

次のアプリのリリースの際はちょっと試してみようと思います。


「ぼくがかんがえたさいきょうのIoTゲートウェイ」(うろ覚え)

MAMORIO CTO高野さん

IoTでハードを含めた開発を本気でやってるとこって少ないよね。と嘆いてました。
IoTゲートウェイはMAMORIOにはすごく重要な役割なんだろうな。

GEEK GARAGE内にMAMORIOが1000個はあるらしく
この空間はBLEが入れ乱れてるらしい。。。

やっぱりサービスの全てを一企業で賄うのは大変で
協力しあえるパートナーは大切なんだなって思います。

こういったビジネスサイドの話もすごく勉強になる。
MAMORIO、まだまだ色々な展開ができそう。。。


「EDIT BREAKPOINT」

ORIGAMI iOSエンジニア玉城さん

iOSDCのパーカーを着て登場。
iOSDCに落選した身としてはすごく羨ましい。

iOSでも苦手と(思っている)される決済を提供しているORIGAMIさん。

origami.com

LTはこちらもテストについて。
デバッグする際のブレークポイントって編集できるんですと。
iOSの試験で嫌なとこは、初期起動の時だけチュートリアル見せる場合の試験は
いちいちアプリ入れ直したり、ビルドし直したりと超面倒。

でもEDIT BREAKPOINTでブレークポイントを編集すれば
ビルドし直さなくてもそのまま試験が続行できる。

これは便利。
テストコード書くの面倒だなって思ってたけどこれは便利。
設定だけで色々できる。

EDIT BREAKPOINTについては、実際にやって見て改めてブログに書こうと思います。

いい感じに紹介しているサイト

d.hatena.ne.jp


その後の懇親会

話題はそれとなくテストについて。

やはりiOSも端末が増え、OSのバージョンが増え
対応しなくてはならないことが非常に増えました。

そんなとき、みんなはどうやって解決しているのか?
そんな情報共有ができたいい勉強会でした。

ガレージの奥にはバーカウンターが新設されていて、
そこで増木さんやフリーランスの工藤さんと色々話せました。

工藤さんはフリーランスだけどフリーランスのチームを作って
ギルドみたいな組織を作りたいって言ってました。
勉強会も沢山主催していたり、とてもアグレッシブでした。
こういった人たちと話してると刺激になります。
俺、このままじゃまずい。もっと色々作りたい。ってなります。


まとめ

やっぱり勉強会はいいですね。
ゴーリストのエンジニア陣のモットーは「技術は手段」。
この手段で限りなく効率的で現実的なものをチョイスするために
幅広い知識が必要です。
知らなきゃ延々と遠回りしてしまうようなことも沢山あります。
「こんなのがあるよ!」「これ便利だよ!」と人の話を聞くのはとても勉強になります。
割とこのブログでは初心者向けの記事を書いてますが
これからはゴーリストで取り入れた技術的なことなんかも
書けていけたらな、と思います。
乞うご期待!

Angular2でFlexのViewStackを作ってみる

全国のFlexファンの皆様、お久しぶりです!
ゴーリスト開発の盛次(モリツグ)です。

前回のAngular2とFlexを比較してみたの影響で全国に90人はいると思われるFlex愛好者たちがAngular2に目覚めてくれたことだと思います。

今日は以下のような方に向けた内容になります。
・Angular2で動的にコンポーネントを追加したい方
・Angular2でもaddChildしてselectedIndexしたくて我慢できない方

ViewStackのデモを触ってみる

Flex経験者でない方にViewStackの説明が必要ですね!
ViewStackとはコンポーネントを格納するためのコンテナです、複数コンポーネントを格納できますが、表示するのは現在選択中のものだけです。

Angular2では標準で画面遷移の仕組みが用意されており、遷移時にServiceを差し込めたりと非常に便利です。
しかし、動的にaddChildしてselectedIndex=0したい人は少なくないと思います。
むしろFlex愛好家は「なんでViewStackないん?」と思っているはずです。
とりあえず完成品をご覧ください。ViewStackデモ

リンク先のplunkerでは以下のような画面が表示されます。

f:id:t-moritsugu:20170222175904p:plain

動作は以下のようになっています。
・ViewStackには初期化時に3つのコンポーネントを格納
・左側のボタン3つに対応したコンポーネントを追加
・selectで選んだコンポーネントだけを表示
・removeボタンを押すと選択中のコンポーネントを削除

コンポーネントを動的に追加する方法

  1. 動的に追加したいコンポーネントを@NgModuleのdeclarationsだけでなくentryComponentsにも追記する。
  2. ComponentFactoryResolverに追加したいコンポーネントを渡して目的のクラスのComponentFactoryを作成する。
  3. ComponentFactoryをViewContainerRef.createComponentの引数にする。

src/app.ts

@NgModule({
  declarations: [.....],
  imports: [....],
  bootstrap: [App ],
  // 動的に追加するコンポーネントはここに指定
  entryComponents: [ChildA, ChildB, ChildC]   
})
export class AppModule {}

src/app/viewstack/ViewStack.ts

@Component({
  selector: 'view-stack',
  providers: [],
  template: `
    <div #container>
    </div>
  `
})

export class ViewStack implements AfterViewInit {
  
  @ViewChild('container', {read: ViewContainerRef}) 
  private container:ViewContainerRef;
  
  public constructor(
    private _componentFactoryResolver: ComponentFactoryResolver
    //, private _viewContainerRef: ViewContainerRef
  )
  {}

  public addChild<T>(childClass: Type<T>, index:number=-1):void {
    
    const componentFactory:ComponentFactory<T>
      = this._componentFactoryResolver.resolveComponentFactory(childClass);

    const componentRef:ComponentRef<T> 
      = this.container.createComponent(componentFactory);
    
  }
}

ViewContainerRef.createComponentがどの要素に対して作成したコンポーネントを追加するのかが重要です。
このソースを見る限りthis.container.createComponentしているために以下のようなhtmlになりそうです。

<app>
  ...
  <view-stack>
    <div>
      <child-a>...
      <child-b>...
      <child-c>...
    </div>
  </view-stack>
  ...
</app>

しかし、実際は以下のようになります。

<app>
  ...
  <view-stack>
    <div>
    </div>
    <child-a>...
    <child-b>...
    <child-c>...
  </view-stack>
  ...
</app>

ViewContainerRef.createComponentは親の要素に作成したコンポーネントを追加するようです。
ダミー的に<div #container>を利用しているのはこのためです。
仮にconstructorでinjectしたViewContainerRefを利用した場合、以下のようなhtmlになります。

<app>
  ...
  <view-stack>
    <div>
    </div>
  </view-stack>
 <child-a>...
  <child-b>...
  <child-c>...
  ...
</app>

まとめ

addChildしてselectedIndexしたかったのでAngular2でViewStackを作ってみました。
*ngForと[ngSwitch]を利用すれば別の実装手段もありますが、一番疎結合なのはentryComponentsを使う今回の方法だと思います。
Flex経験者を取り込んでAngular2の人口が増えることを願って書いています。

S3とAPI GatewayとLambdaで動くHRogチャートの開発環境

f:id:suzutt:20170217000629p:plain

こんにちは、鈴木です。

弊社の開発環境はプロジェクト、サービスによってまちまちですが、今回は弊社サービス「HRogチャート」の開発環境についての話です。

HRogチャートとは、求人データを瞬時に分析するBIツールです。興味のある方は是非、下の画像をクリックしてください。

HRogチャートでは、本番環境以外に開発用の環境が2つありますが、 本記事では2の開発環境について扱っていきます。

  1. ローカル開発環境
    開発メンバーおのおの(今は自分ひとりですが)の端末に構築する開発環境です。
    ローカル開発環境で動作確認後、Githubリポジトリにプッシュします。

  2. 開発環境
    リポジトリ上の最新のコードをビルドしたものを配置している環境です。
    当たり前ですがローカル開発環境よりも本番に近いアーキテクチャなので、本番に近い状態で動作確認をします。チームメンバー間で話をするときにも使うかと思います。(今は自分ひとりですが)
    ステージング環境に近いですが、開発メンバーしか使わないのでステージング環境ではないです(と思っています)。

開発環境に最新のコードをデプロイする作業は、Jenkinsを使用して自動化しています。
目新しいことはやっていませんが、同じアーキテクチャを採用していて、これから同じことをやる方の参考になればと思います。

本番環境と開発環境

それぞれ以下のような構成になっています。

本番環境

f:id:suzutt:20170217000741p:plain

開発環境

f:id:suzutt:20170217000944p:plain

開発環境は本番環境と比べて、主に以下の点で異なります。

  • Amazon CloudFrontを使用せず、直接S3で静的ウェブサイトのホスティングをしている(IAMでIP制限を掛けています)
  • API Gateway のURLが異なる
  • API Gateway のAPIキーが異なる
  • API Gatewayから呼び出すLambdaファンクションが異なる

開発環境自動デプロイでは、ざっくりいうとJenkinsでリポジトリをポーリングし、リポジトリが更新されていた場合、S3、Lambda上にプログラムを自動ビルド、デプロイを行い、開発環境を最新化してます。

使用ツール

開発環境自動デプロイには、以下のツールを使用しています。

  • Gradle 3.3
  • Jenkins 2.7.4
  • AWS CLI

ビルド・デプロイ手順

API GatewayのURL、APIキーの変更

デプロイ前に下記の情報を開発環境用に設定します。

  • API Gateway のURL
  • API Gateway のAPIキー

フロントエンドのプログラムをS3へデプロイ

AWS CLI を使って対象のバケットをクリーンした後に、JenkinsのS3 Plugin(0.10.11)を利用してS3へデプロイしています。

S3 Plugin - Jenkins - Jenkins Wiki

設定を抜粋します。

ビルド - シェルの実行

aws s3 rm s3://${バケット名} --recursive

ビルド後の処理 - Publish artifacts to S3 Bucket

項目
Source build/libs/*.jar
Destination bucket ${バケット名}
Bucket Region ${リージョン名}

AWS Lambdaへのデプロイ

Gradleでビルド後に、S3 PluginでS3にデプロイ後、JenkinsのAWS Lambda Plugin(0.5.8)を利用し、Lambdaへデプロイしています。

AWS Lambda Plugin - Jenkins - Jenkins Wiki

こちらも設定を抜粋します。

ビルド - Invoke Gradle script

項目
Tasks build

ビルド後の処理 - Publish artifacts to S3 Bucket

項目
Source build/libs/*.jar
Destination bucket ${バケット名}
Bucket Region ${リージョン名}

ビルド後の処理 - AWS Lambda deployment

AWSコンソールから登録するときと同様、以下の例のように値を入力します。

項目
AWS Region ${リージョン名}
Function Name Lambda
Role ${Lambdaファンクションに割り当てるロール}
Artifact Location ${対象のjarファイルのS3上のパス}
Handler Name ${Lambdaファンクションのハンドラ名 }
Memory Size 1024
Timeout 180
Runtime java8

まとめ

開発環境があることで、常に最新のコードで動く環境で動作確認できるという安心感が得られてたということが大きいです。あとは開発メンバーが増えた時に効いてくるのかなと思っています。

ただ、ジョブが複雑になってくるとJenkinsだと管理が大変になるので、その際は別のCIサービスを使おうかなと考えています。

それでは。

iOSアプリ開発初心者にオススメする入門書

Hello,World。渡部です。
今回はタイトル通りiOSアプリ開発初心者にオススメの本を紹介します。

f:id:watabe1028:20170209151125j:plain

参考書とかたくさんあって何を読めばいいかわからない人の助けになればと思います。
ちなみに渡部はiOS関係の書籍を20冊くらい所有してます。
もちろんほとんど読んでないものから常にデスクに置いてある本まであります。

その中からこれだけは読んどけ&持っとけベスト3を紹介します。

第3位
iPhoneプログラミングUIKit詳解リファレンス

f:id:watabe1028:20170209152351j:plain

www.amazon.co.jp

UIKitのことならこの本を持っておけばまず問題ないのでは?と思わせる一冊。
最初の1冊はこれを買っておけば間違い無いでしょう。

第2位
本気ではじめるiPhoneアプリ作り Xcode 7.x+Swift 2.x対応 黒帯エンジニアがしっかり教える基本テクニック (ヤフー黒帯シリーズ)

f:id:watabe1028:20170209152401j:plain

www.amazon.co.jp

初心者向けだけど、Xcodeの使い方から丁寧に解説されているので
初心者以外にもオススメです。
このブログの記事の参考にもしています。
開発環境からリリースまでの手順も丁寧に説明されています。

第1位
よくわかるAuto Layout iOSレスポンシブデザインをマスター

f:id:watabe1028:20170209152411j:plain

www.amazon.co.jp

もはやリリースするためにはなくてはいけない画面設定AutoLayout。
しかしながらこのAutoLayoutが苦手なエンジニアは結構いるはず。
はい、わたしです。
Storyboardでやるにせよ、コードでやるにせよ知らないとできないことばかり。
この本では一つ、一つ説明してくれています。
ただ、Xcodeのアップデートで多少変わってしまう可能性があります。

まとめ

これ以外にもオススメな本は何冊かありますが
最初に手に取るのであればこの3冊を推薦します。
多分開発からリリースまではこの3冊があればなんとかなります。
ぜひ興味ある方は手にとってみてください。