Goalist Developers Blog

Angular2とJavaでPay.jpの定期課金をやってみる

こんにちわ!
ゴーリスト開発のモリツグです。

Angular2で何かすることを隠れ蓑にFlexを懐かしんできた1回目2回目でしたが、残念ながら今回はFlexを懐かしむ要素がありません。

今回は以下のような方に向けた内容になります。
・Angular2とJavaでクレジットカード課金したい
・Pay.jpを使ってみようと考えている方

Pay.jpとは

クレジットカードの決済周りのAPIを提供してくれているサービス。
サイトの説明やAPIドキュメントがものすごく分かりやすくて良い。
APIで出来ることは大体全部サイト上のGUIでも提供されており、売上などのダッシュボードが綺麗。
定期課金にも対応。

カード情報のトークン化

詳しくはこちらになるのですが、Angular2ではコンポーネントにscriptタグを埋め込んでもコンパイラが削除するので「<script> タグ一行で実装可能」的なものは利用できません。
ngAfterViewInitとかで頑張って突っ込んでみても正常に動作しなかったので皆さんは無駄な努力をしないように願っています。
したがって今回はpay.jsを利用してトークンを作成しました。

// コンパイラに怒られるので定義しておく
declare var Payjp: any;

@Component({
 .....
})
export class CreditCardDialog{
  .....
  // パブリックキーをセット
  Payjp.setPublicKey(PAY_JP_PUBLIC_KEY); 

  // カードオブジェクトを作成
  let card: Object = {
    number: "4242424242424242",
    cvc: "123",
    exp_month: "12",
    exp_year: "2020"
  };
  
  // tokenを取得 エラーかどうかはstatusで判定
  Payjp.createToken(card, (status, response) => {
    let token:string = response.id;
  });
  .....
}

PAY_JP_PUBLIC_KEYはPay.jpからアカウントごとに発行されるパブリックキーです。
以降のトークンを利用したサーバ側でのPay.jpへのリクエストではシークレットキーを利用します。
サーバ側でのCustomerの作成と事前に作成しておいた定期課金プラン(Subscription)をユーザに紐づける処理は以下になります。
定期課金プランはAPIでも作成できますが、Pay.jpのサイト上でGUIで作成したほうが楽です。
コード中のPAY_JP_PLAN_IDは定期課金プランのIDです。

// トークンを用いてユーザを作成
Map<String, Object> customerParams = new HashMap<String, Object>();
customerParams.put("id", "cus_01");
customerParams.put("email", email);
customerParams.put("card", tokenId); // 先ほど作成したトークンをセット
Customer customer = Customer.create(customerParams);

// 作成したCustomerに定期課金プランを登録する
// 今回のプランではフリー期間なしですぐに初回の課金が行われる
Map<String, Object> subscriptionParams = new HashMap<String, Object>();
subscriptionParams.put("plan", PAY_JP_PLAN_ID);
subscriptionParams.put("customer", customer.getId());
Subscription.create(subscriptionParams);

まとめ

Angular2でscriptタグをComponent中に埋め込めないので少し面倒かなという印象です。
Pay.jpは登録すると本番環境とテスト環境の2つのキーを発行してくれるのでテストも簡単です。
メジャーバージョンアップしてAngular4になりましたが、進化の速さに負けずにユーザが増えてくれるといいなぁと思います。

中途エンジニア、ブログを書く

はじめまして、JPです。
名付け親は新卒エンジニアのイイオさんです。
自己紹介します。

f:id:j-itoh:20170321180331j:plain
真ん中が自分、右がセールスのすぎやんさんです。いい天気です。

経歴

プロフィール

社会人4年目、26歳、男、メガネ

好きなこと

ゴルフ、麻雀、漫画

学業

4年制大学、経済学部卒業

就職活動
  1. ERPパッケージベンダーのインターンシップに申し込む(給料が高かったから)
  2. インターンシップでプログラミングに出会う(はまる)
  3. そこに入社する
仕事内容
  1. 半年研修(長い)
  2. 会社の労務である社員の健康診断管理に関するシステムで以下を経験
     - 不具合修正、機能追加、テスト、導入、webアプリケーションへの置き換え
      (人間1人分の仕事量じゃない)
  3. 新製品のインフラチームに異動
     - Linux, Vagrant, Docker, Jenkins等に軽く触れる(すぐ忘れる)
  4. ゴーリストにジョイン
  5. webアプリケーションの新機能開発で以下を経験
     - 仕様検討、DB設計、チームメンバーのタスク管理 (開発もちょっと)
  6. 現在、プロジェクトメンバーとしてパートナー会社の大規模システム開発に参加
    (周りは強者だらけ)
まとめ

プログラミング未経験の自分にとっては激動の4年間でした。
担当機能の前任者もおらず、仕様に関する資料等もないところからスタートし、分からないことが当たり前の状況の中、様々な業務を経験することができました。

ゴーリストでは今までに経験のないチームでの仕事を担当させてもらいました。
自分があまり開発していないのに製品ができあがるのは不思議な感覚です。

これから

最近はゴーリストのミッションの1つである「チームで結果を出すこと」の意義を日々感じています。
また、チームメンバーに外国人がいたりして難しい部分もありますが、これを乗り越えればビジネスパーソンとして一皮剥けそうです。
ブログでは自分が工夫して効率化したことについて取り上げていく予定です。

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の人口が増えることを願って書いています。