ambassadorを利用してRethinkDBに繋がらない?

CoreOS上でのRethinkDBアップデートでつまづいた。。。

  • 前提

CoreOSを利用していて、UnitでRethinkDBを利用している場合

RethinkDBを2.1系から2.3系へバージョンアップしたかったが、下記のような、rethinkdb及びコンテナ間接続に要するambassadorを利用している場合に接続障害が発生した。

[Unit]
Description=RethinkDB
After=docker.service
Requires=docker.service

[Service]
EnvironmentFile=/etc/environment
TimeoutStartSec=0
Restart=always
ExecStartPre=/usr/bin/docker pull rethinkdb:2.3
ExecStartPre=-/usr/bin/docker kill %p
ExecStartPre=-/usr/bin/docker rm %p
ExecStartPre=/usr/bin/mkdir -p /srv/rethinkdb
ExecStartPre=/usr/bin/chattr -R +C /srv/rethinkdb
ExecStart=/usr/bin/docker run --rm \
  --name %p \
  -v /srv/rethinkdb:/data \
  -e "AUTHKEY=xxxxxxxxxx" \
  --net host \
  -p 8080:8080 \
  -p 28015:28015 \
  -p 29015:29015 \
  rethinkdb:2.3 \
  rethinkdb --bind all \
    --cache-size 4096
ExecStop=-/usr/bin/docker stop -t 10 %p

[X-Fleet]
MachineMetadata="role=db"
[Unit]
Description=RethinkDB proxy/28015
After=docker.service rethinkdb.service
Requires=docker.service

[Service]
EnvironmentFile=/etc/environment
TimeoutStartSec=0
Restart=always
ExecStartPre=/usr/bin/docker pull ctlc/ambassador:latest
ExecStartPre=-/usr/bin/docker kill %p
ExecStartPre=-/usr/bin/docker rm %p
ExecStart=/usr/bin/docker run --rm \
  --name %p \
  -e "AUTHKEY=xxxxxxxxxx" \
  -p 28015 \
  -e RETHINKDB_PORT_28015_TCP=tcp://d001.example.com:28015 \
  ctlc/ambassador:latest
ExecStop=-/usr/bin/docker stop -t 10 %p

[X-Fleet]
Global=true
MachineMetadata="role=app"

エラー内容

INF/db 1 [*] Connecting to 192.168.255.2:28015
INF/db 1 [*] Unable to connect to 192.168.255.2:28015
FTL/db 1 [*] No hosts left to try
FTL/util:lifecycle 1 [*] Shutting down due to fatal error

ambassadorを通しての接続が出来ない模様。

AUTHKEYとして設定してあるパスワードも設定を施行しようも下記エラーが出てしまう

"It's illegal to delete rows from the rethinkdb.cluster_config table."

f:id:s-shota:20180129161641p:plain

解決

どうやら、RethinkDB2.3系からAUTHKEYの設定方法が変わったようだ。

Alternatives to RethinkDB 2.3 auth

r.db('rethinkdb').table('users').get('admin').update({password:'xxxxxxxxxx'})

f:id:s-shota:20180129161726p:plain

接続できた。。。

MashupAwads2016 沖縄予選に参加したよ

はじめに

MashupAwards2016とは・・・

日本最大級の開発コンテストMashupAwardsの一次予選免除の権利をかけたハッカソンイベントです。MA2016は賞金総額約500万円!!賞もたくさんあるよ。

賞金総額500万円ですよ:exclamation: :exclamation: という金額に魅かれるところもありますが

いろいろなモノづくりを楽しめる滅多にない機会!!

「会社・学校を超えて知らない人とアイディアを練って、チームづくりをして、モノを作る」それが醍醐味です :smile:

イベント様子詳細はこちらからTogetter

紹介すること

今回参加して実際に作成したモノの技術を紹介します

MashupAwards2016 沖縄予選にて実際に作成・紹介した「MESH振る(メッシブルと読む)」を作成しました。 名称はメッシ(サッカーで有名なメッシ+MESHの掛け合わせ)と振る(Move)を合わせた造語ですw

イベント説明 :speech_balloon:

審査基準だよ。 ビジネス性や事業性は関係ないのが特徴です。

f:id:s-shota:20180129154453j:plain

提供API

Hack1日目 :computer:

既にMESHは使いたい!というのは決まっていたので、案だけはいくつか候補をあげていました。

Hackタイムが始まる前にアイスブレイク/インプットタイムで更に案をブラッシュアップ。チームも4名になりました。

チーム名:突貫boys

内容は以下のとおり

・MESH(MOVE)を交通安全お守りに入れ、車に吸盤でくっつけて揺れ幅を検知
・揺れ幅により、Slack通知・Twilioでの連絡を取り入れる

f:id:s-shota:20180129154532p:plain

まずMESHを利用するためにはiPhoneにてMESHとペアリング・動作させるためのアプリをインストールする必要があります。

iPhone MESH

MESHAppでは簡単にアプリを作ることができます。例えば「音声を検知したら写真を撮影する」

f:id:s-shota:20180129154608p:plain

MESHとslackを実際に使った場合

f:id:s-shota:20180129154901p:plain

  • 注意

MESHのタグにはSlack通知が無いのでMESH SDKと呼ばれる管理画面からJavascriptでWEBからの作成が必要となります。

//The endpoint URL of Remote API
var endPointURL = 'http://__ORIGINAL_API__/slack_notify';
 
var alert = properties.myProp;

var data = {
    "msg":alert,
    "apiToken":'xxxxxxxxxxxx',
    "channel":'#general',
}

//Puts the camera into "Shooting mode"
ajax ({
    url : endPointURL,
    type : "post",
    data : data,
    dataType : "json",
    timeout : 5000,
    error : function ( request, errorMessage ) {
        log("SlackAPI : Network error");
        callbackSuccess( {
            resultType : "continue"
        } );
    }
});
 
return {
    resultType : "pause"
};

API側は自前でよしなに作ってやればSlackに通知が行きますよー。

API実装にはMicrosoftAzureからUbuntu16.04を起動し、Nginx + Ruby on Railsで簡単に構築しますた。

Azureは無償サブスクリプション利用いたしました。MS様ありがとうございます :smile:

Hack2日目 :computer: :sweat_drops:

全体的なハッカソンとしての機能があまりにも少ないため、チーム内でブラッシュアップ案で以下のような流れを決定しました。

1.揺れの検知レベルを3段階とする
危険なレベルに合わせ連絡手段を変更
└全Lv共通にslackに報告
Lv1、安全を促す警告※運転者のslack
 - 休憩をして欲しいのでぐるなびAPIを使って近くの駐車場のあるお店(カフェ)一件を通知
Lv2、安全を促す強い警告※運転者のslack
 - 同様にお店(カフェ)を通知
Lv3、事前に登録してある、twilioを使って連絡先に連絡

出来たMESH Appでの画面図

f:id:s-shota:20180129155103p:plain

  • 注意

MESHのタグにはTwilioが無いのでMESH SDKと呼ばれる管理画面からJavascriptでWEBからの作成が必要となります。

//The endpoint URL of Remote API
var endPointURL = 'http://__ORIGINAL_API__/twilio_call';
 
var alert = properties.myProp;

var data = {
    "To":'+8190xxxxxxxx',#国際番号から電話番号を
    "key":'xxxxxx',
}

//Puts the camera into "Shooting mode"
ajax ({
    url : endPointURL,
    type : "post",
    data : data,
    dataType : "json",
    timeout : 5000,
    error : function ( request, errorMessage ) {
        log("TwilioAPI : Network error");
        callbackSuccess( {
            resultType : "continue"
        } );
    }
});
 
return {
    resultType : "pause"
};

Twilioは既にチャージされたアカウントをお借りしました!Twilio様ありがとうございます

かっ完成!

出来上がったお守りの画像※お守り袋に入れる時間ありませんでした :sob:

f:id:s-shota:20180129155243j:plain

検証環境:

ミニ四駆+MESH振る(ムダにカッコいいショット) f:id:s-shota:20180129155319j:plain

検証風景:

f:id:s-shota:20180129155404j:plain

最終設計:

f:id:s-shota:20180129155436p:plain

懇親会

美味しいお食事がいっぱい用意されてました :smile:

f:id:s-shota:20180129155810j:plain

f:id:s-shota:20180129155853j:plain

かんぱーい :tada:

f:id:s-shota:20180129155920j:plain

懇親タイム

f:id:s-shota:20180129160052j:plainf:id:s-shota:20180129160102j:plainf:id:s-shota:20180129160059j:plainf:id:s-shota:20180129160055j:plain

発表

いよいよ発表の前に!台風の前日なので、進路が気になる〜〜 :sweat: ※2016/10/2は台風前夜 915hpaまで発達した大きな台風です。。。 ※無事東京に戻れたそうです :smile:

f:id:s-shota:20180129161349j:plain

いよいよ賞の発表

Microsoft賞の発表

f:id:s-shota:20180129160212j:plain

スパイルスチーム

スーパー居留守をもじって、玄関先にMESH(Motion)とiPhoneを設置し、顔写真を撮影。事前に登録されているホワイトリストブラックリストの写真を元にiPhoneから出される表示を変えるアプリ (ホワイトリストには天使の絵を出し、また来てねを催促) (ブラックリストには本人の画像から血が滴るように見えるように表示w) ぶっ飛んだ作品だけど、本当に商品化できそうな予感のアプリでした

Twilio賞の発表

f:id:s-shota:20180129160321j:plain

Emotion Phone

エモーションフォン。ブラウザでTwilioクライアントを利用し、音声電話を実現。 ただの音声電話ではなく、PCカメラの人物が”笑顔”にならないと発信できない仕組み。こっこれはコールセンターで本当に実現できるのではないかー??

そして・・・「ぐるなび賞」「最優秀賞」は :tada: :raised_hands: :tada: (パチパチ)

MESH振ル

f:id:s-shota:20180129160453j:plain f:id:s-shota:20180129160505j:plain

12/3の2次予選権利獲得しました〜!!

まとめ

  • いいチームメンバーに囲まれました :smile: スライドを作ってくれたM/Kさん
  • プレゼンを盛り上げるために突貫で作ってくれたMovie #Cさん
  • デバッグや各MESHのフローを考えてくれたK/Aさん

いいチームワークで作成時間1分前まで安心して、発表に臨むことができました :smile:

f:id:s-shota:20180129160651j:plain

お疲れしたー!!

f:id:s-shota:20180129160744j:plain


MA2016 myThings〜はじめてのIoT〜に参加したよ〜

myThings利用によるサービス開発

株式会社リクルートホールディングス:伴野さん
講師:ヤフージャパン 山本さん

myThingsのサービス

myThingsの基本機能について

○○が××ばつだったら
△△を■■する

など、iOS/Androidアプリ上でGUIベースで簡単に自分専用アプリが作れるスグレモノ!

現在対応しているプロダクト(API/アプリ)は約50アプリ

本日のやることIoTデバイスのプロトタイピングを始めよう

  • myThingsを使用してIoTを始めてみよう
  • myThingsを使ったアイディアソン

myThingsハンズオンの参考資料

覚えていただく用語について

○○が××だったら   <=トリガー
△△を■■する      <=アクション

○○ △△はチャンネルの位置付け

myThings IoTの基本セット

・Raspberry Pi2 ModelB ・ブレッドボード ・USBシリアルアダプター

myThingsの基本動作

・トリガーは15minの定期間隔のポーリングで実施される(または手動実行も可能) ・アクションはwebsocketやポーリングなどで実施が可能

クラウドサービスIDCFとも連携できるよ!?

IDCFチャンネルでできることはカスタムイベント・トリガーを作ることが可能です。

Twitter <--- myThings ----> Aaction <-----raspi(データを送信)

今日実装すること

○○が××だったら、IDCDのアクションに通知を送る RaspiでIDCFのアクションを監視して、通知が来てたらLEDを光らせる

Raspiで温度をセンシングして27度以上だったらIDCFのトリガーに通知を送る IDCFのトリガーに通知が来たら△△を■■する

詳細はこちらー 【myThingsハンズオン】○○が☓☓だったら、LEDを光らせよう

やってみた

f:id:s-shota:20180129153908j:plain

myThingsDeveloper機能について

何はともあれ、登録してみよう myThingsDeveloper

カスタムトリガーについて・・・自身でトリガーを作成することが可能。トリガー元となるデバイスやプログラムでトリガーイベントを発動させることが可能

作成例 お米がなくなったら自動的にカートに追加する(○○が××だったらを自作)

例:自作デバイスでお米残量をキャッチ => LOHACOでカートに追加(合わせてTweetする)

f:id:s-shota:20180129153952p:plain

カスタムアクションについて・・・自身でアクションを作成することが可能。トリガーからキャッチするイベントをデバイスまたはイベントプログラムを実行することができる

例:ヤフーの天気で雨だった場合に特定のURL(API)にリクエストを送り、取得したJsonから今日の天気をホームページに反映させる

ヤフーから天気情報をjson形式でキャッチ
それらをURLに対してPostしてごにょごにょできる

アイディアソンタイム

15分という短い中、2チームに分かれてアイディアソンを実施しました。

f:id:s-shota:20180129154030j:plain

ピザ食べながら :smile:

チーム:ナハx4

・毎月の食費上限をzaimに登録
・好きなレシピをcookpadから取り出し(トリガー)、WEBショッピングにて自動的に食材を購入(アクション)
・zaimの食費上限値を超えていなければ(トリガー)、Facebookに今月達成の記事投稿を行う(アクション)

f:id:s-shota:20180129154106j:plain

チーム:沖縄野球Aチーム

・筋トレの回数をAppleWatchで回数をカウント(トリガー)
・規定回数以上の筋トレが完了したら、デバイスプロジェクションマッピングを作動させる(アクション)

f:id:s-shota:20180129154151j:plain

参加してみて

  • myThingsを触ってみて、既存アプリでもノンプログラマでも簡単に自作アプリが作れること
  • myThingsDeveloperを利用することにより、更に高度なサービスの開発を作ることが可能となる

お疲れしたー!

f:id:s-shota:20180129154243j:plain

10/1,2にMA2016沖縄予選があるよ!

是非是非ご参加を〜

MA2016 沖縄 KDDIウェブコミュニケーションズ、日本マイクロソフト、ぐるなび〜

Ansible + TestKitchen (Serverspec) for Docker(初級者向け)

Ansible + TestKitchen for Docker 社内ハンズオン

ターゲット:Ansibleを始めて利用する方向け

今回、社内でAnsible + TestKitchenを使った、インフラのテスト駆動開発handsonを実施しました。 その内容を公開いたします。

handson用コード 概要説明資料

Ansibleとは


一言で「エージェントレスで手軽に利用出来る構成管理ツール」Chef/Puppet/Itamaeなど様々あるプロビジョナーと並ぶツールです。

TestKitchenとは


こちらは主にテスト環境への構成のプロビジョニングと構成管理が正しく実装されているかをチェックするためのツールです。 様々なプロビジョナーと連携しつつ、構成管理対象のターゲットをvagrant / dockerなど適用できるため、今回採用しました。

今回のハンズオンでやったこと

AnsibleとTestkitchenを用いてインフラのコード化及びTDDを実践する テスト実行環境はDocker / 本番環境はあらかじめOpenStack上に作成したUbuntu 14.04のサーバーにて実行をする

Ansible + TestKitche (infraTDDゴール)

f:id:s-shota:20180129153634p:plain

事前準備(Mac 環境構築)

$ bundler -v
Bundler version 1.12.5
$ ruby -v
ruby 2.1.5
$ docker -v
Docker version 1.12.0-rc2
または
Docker version 1.11.2

前提として ruby 2.1.1<で話を進めていくため、以下を事前にインストールすることを推奨とする(Mac) ※gemの関係上provisionerにansible_playbookが認識できない事象あり

$ brew update
$ brew install rbenv ruby-build
$ brew update
$ brew install rbenv ruby-build (もしくは、brew update rbenv ruby-build)

$ rbenv install 2.1.5
$ rbenv global 2.1.5
$ rbenv rehash

# PATH に追加
$ echo 'export PATH="$HOME/.rbenv/bin:$PATH"' >> ~/.bash_profile

# .bash_profile に追加
$ echo 'eval "$(rbenv init -)"' >> ~/.bash_profile

# 上記設定の再読み込み
$ exec $SHELL -l

$ ruby -v
ruby 2.1.5p273 (2014-11-13 revision 48405) [x86_64-darwin14.0]

$ rbenv exec gem install bundler
Bundler version 1.12.5

Dockerインストール

$ brew cask install virtualbox
$ brew install docker
$ brew install docker-machine
$ docker -v
Docker version 1.11.2, build b9f10c9

# 初期設定
$ docker-machine create -d virtualbox ansible-hands-on
$ eval $(docker-machine env ansible-hands-on)
# VPNソフトを起動しているとエラーが出る場合があるよ!FAQ参照

ansibleインストール!

$ brew install ansible
$ git clone https://github.com/vSakumoto/ansible_hands_on.git ~/ansible
$ cd ~/ansible
$ bundle install

ハンズオン実施流れ

うちの会社では以下の流れで実施しました

1. 概要資料の説明
2. gitからcloneしていただいたplaybookを実行して、DockerでのTDD及びstaging環境へのプロビジョニング実施
3. git clone ファイルを編集し、実際にtasksを書き換え パッケージの追加・テスト及びstaging環境へのプロビジョニングを実施する

虎の巻として以下を展開

ansible tasks/main.yml

--- #<- マジックメソッド!! 記述の際には必ず記述する
- name: HOGEHOGE INSTALL #<-- 1タスクを記述するディレクティブ設定
  apt: pkg=nginx state=present update_cache=yes #<-- apt-get install -y nginx を実施
  sudo: yes # sudoをつけて実行するかを選択記載なければssh接続設定となっているユーザーで実行
  tags: nginx # ansbile-playbook -i hoge -t nginxとすることで対象のタグのみを実行させることが可能 別用途としてはprd | stgなど切って本番|stgのプロビジョニングを変更するなど
  when: ansible_os_family == 'Ubuntu' # Ubuntu のみの場合に実施
  
- name: HOGEHOGE INSTALL
  yum: pkg=nginx state=present update_cache=yes
  sudo: yes
  when: ansible_os_family == 'RedHat' # RedHat系(CentOS)
  tags: nginx
  
# リポジトリ追加
- name: add php repo
  apt_repository: repo="ppa:ondrej/php5-5.6"
  tags: repo
  when: ansible_os_family == 'Ubuntu'
  sudo: yes
  
- name: Add repository
  yum_repository:
    name: epel
    description: EPEL YUM repo
    baseurl: http://download.fedoraproject.org/pub/epel/$releasever/$basearch/
   when: ansible_os_family == 'RedHat'
  
# ファイルコピー
- name: Upload Test File
  copy: src="bash_profile" dest="/home/vSakumoto/.bash_profile" owner=vSakumoto group=vSakumoto mode=0644
  tags: home_set
  sudo: yes
  
# ディレクトリ作成
- name: private directory
  file: path="/home/vSakumoto/foo" state=directory owner=vSakumoto group=vSakumoto mode=0700
  tags: home_set
  sudo: yes

serverspec記法

require 'spec_helper'
 
describe package('nginx'), :if => os[:family] == 'ubuntu' do # os[:family]の環境変数からubuntu判定をし実行
  it { should be_installed } # package nginxがインストールされているか
end 
  
describe service('nginx'), :if => os[:family] == 'ubuntu' do
  it { should be_enabled } # 自動起動がONになっているか
  it { should be_running } # nginxが動作しているか
end
  
describe port(80) do
  it { should be_listening } # 指定ポートが空いているかどうか
end
  
# kitchen groupがあるか
describe group('kitchen') do
  it { should exist }
end
  
# kitchen userがいるか
describe user('kitchen') do
  it { should belong_to_group 'kitchen' }
end
  
# 配列でチェック
%w{vSakumoto xshsaku kitchen}.each do |users|
  describe user(users) do
    it { should belong_to_group users }
  end
end
  
# ファイル有無
describe file('/home/vSakumoto/.bash_profile') do
  it { should be_file }
end
  
# ディレクトリ有無
describe file("/home/vSakumoto/public_html") do
  it { should be_directory }
end

ハンズオン時間は約2hぐらいを目安にし、無事完了しました。

ハンズオンを通して・・・

インフラ屋さんももちろんだけども、プログラマの方にコードでインフラを「管理できる・構築できる」メリットを伝えられるいいチャンスかもしれない

参考サイト:

Serverspecでよく使うテストの書き方まとめ

[Ansibleのテストをtest-kitchenとServerspec、dockerで行う] (http://qiita.com/minamijoyo/items/467ddd13c0cab15330bf)

Docker Private Betaを早速使ってみた

今朝以下のようなメールが到着

f:id:s-shota:20180129152646p:plain

Docker Private Betaの申し込みを4/5に申し込んだので約1か月でお試し版が利用できるようになります。

for macをインストール

通常のアプリインストールの要領で実施

1.インストール画面

f:id:s-shota:20180129152715p:plain

インストール画面 4step

2.Docker.appを起動し、メールに記載されていたTOKENをコピペ

f:id:s-shota:20180129152753p:plain

3.下記画面が出てくればインストール完了

f:id:s-shota:20180129152904p:plain

f:id:s-shota:20180129153005p:plain

*途中、Mac管理者のパスワードを入力する必要があります。

4.タスクバーに常駐されれば完了!

f:id:s-shota:20180129153051p:plain

nginxをお試し起動

docker run実行

minstall6.png

$ docker run -d -p 8001:80 --name webserver nginx
Unable to find image 'nginx:latest' locally
latest: Pulling from library/nginx

efd26ecc9548: Pull complete 
a3ed95caeb02: Pull complete 
a48df1751a97: Pull complete 
8ddc2d7beb91: Pull complete 
Digest: sha256:2ca2638e55319b7bc0c7d028209ea69b1368e95b01383e66dfe7e4f43780926d
Status: Downloaded newer image for nginx:latest
3c3462c4e0d473202dc2433ad75f416de5a0d029e25ea67e856057a54da3b950

起動確認

minstall7.png

起動成功!!


所感

今回のDocker Private BetaについてはVirtualBoxなしで手軽に利用できる!というところが凄くいいところ。 まだBeta版ではありますが、手軽に使え、今後の可能性としてはローカルWEBアプリとしても利用できるんじゃないでしょうか?

番外編Windows7でインストール

1.メール文中にある[Get docs and download the app]からインストールサイトへ

f:id:s-shota:20180129153229p:plain

2.for windows版をダウンロード**

f:id:s-shota:20180129153329p:plain

3.msiから起動して、インストール実行**

f:id:s-shota:20180129153404p:plain

(ノ゚ο゚)ノ オオオオォォ

Windows10から対応しているようです。。。こちらはupgrade後試してみます。

参考サイト

Docker Blog

dots.カンファレンス チーム開発を支える技術に参加したよー 午後の部

dots.カンファレンス チーム開発を支える技術に参加したよー 午後の部

f:id:s-shota:20180129151038p:plain

dots.カンファレンス、チーム開発を支える技術に参加してきました!

午前の部、午後の部、と別れており今回は午後の部の紹介をしていきます。

※私の範囲内で聞いて咀嚼したものですので、内容に相違がある可能性があります。

講演 #午後の部

Qiita/Qiita:Teamの開発を通して見つけた、Incrementsの文化を作る方法

Increments株式会社 東峰 裕之氏

f:id:s-shota:20180129151313j:plain

自己紹介:

Incrementsってどんな会社? 書き方は「++」で言語のインクリメントを表している

ビジョン:ソフトウァア開発を良くすることで、世界の進化を加速させる

立ち上げ3名、メンバーは14名!?

  • Running Leanを実践
  • 何を作るかより、何を作らないか
  • MVPで検証し、すぐ捨てる
  • 無駄な作り込みは悪!

  • 価値仮設シートの実行

  • (ユーザー)___は、
  • (欲求)____たいが、
  • (課題)___なので、
  • (製品の特徴)___に価値がある。 ※cookpadさんのものを踏襲し実行

  • 属人性の排除について

  • 情報共有をTeamlでシェア
  • Teamlで書いてあれば誰でも実行可能

  • ChatOps

  • Qiitan(BOT) rubotyを利用し、掃除当番、Issue登録、Deploy/Mearge
  • 面倒なルーチンワークは常に疑う
  • 例:勤怠管理は打刻漏れとかめんどくさいよね!?=> Qiitan(Bot)に移行

  • 初期メンバーは3人から14人になってからどう変わった?

  • 多様化への対応が求められた
尖った人が多いが文化はあっている。趣向は少々違う
多様であり、同じ文化に共鳴する集団であることが今の強み
  • 働きやすさをどう担保するか
フレックス&リモートワークの導入
他人に強要しない
  • 社長<=>各社員での月一1on1
これを実現していくことで以下のことが芽生えてくる(はず!)
会社:社員を知ることをあきらめない
メンバー:会社が「よくしてくれるはず」をあきらめない
  • 2014-2015はTeamに注力
実行したこと
Teaming 輪読会
1.学習する組織作り
2.意見の相違の乗り越えられ
3.解決策が生まれるまで議論できる関係性があり
4.安心して率直に意見を述べられる環境である

これができる組織でなら困難を乗り越えていけそうに感じられる。

オススメの本:(http://www.amazon.co.jp/dp/4862761828/)[チームが機能するとはどういうことか]


クラウドソーシングでチームを作る方法

株式会社StartupTechnology 菊本 久寿氏

自己紹介:エンジニア

もともとはフリーランスで一人でタスクをたくさん受けていた。
ただ案件を取りすぎて、、、炎上・・・
その中からクラウドソーシングサービスを設立して、
外注するようになったのが設立経緯

クラウドソーシングを利用する理由:エンジニアを採用できない

  • メリット

    • 取りやすい
    • (自粛)
    • 必要な時に必要な分使える(変動費化)
    • フリーランスなど個人でも使える
    • 個人でも払える額で発注できる
  • 向かないプロジェクト

  • 大規模プロジェクト
  • PMがいない
  • ISMSなどが絡んでいる場合

  • 受注側の気持ち:受けたくない地雷案件

  • ボリュームが見えない
  • ボリュームがでかい
  • やすい
  • 夢がいっぱい

  • 正しい募集方法

  • やることが明確
  • 時給制
  • 時間コミットさせない(1500円〜2000円)

  • スクリーニングについて

  • 先に仕事をやってもらってからスクリーニングに(通常の採用と異なる)

  • 開発の進め方

  • PMがタスク登録(レビュー)
  • 開発者が好きなgit pull request / git flowを使ってオープンソースのような形式で開発

  • コミュニケーション

  • 同一のチャット空間で進めることで技術ヒエラルキーが生まれる(複数人アウトソースする場合)

  • ルールの定義

  • セットアップ方法のドキュメンテーション(README)
  • コード規約を定める
  • その他チームのルールを定義する
  • プロジェクトの背景などもドキュメンテーション

  • 運用しながらスクリーニング

  • 運用しながら個々のスキルを把握しスクリーニングを行う

  • クラウドソーシングエンジニアの状況把握

  • スキルが把握できない -> 技術選定を簡単なものに寄せる
  • 時間が合わない -> コミュニケーション量を減らす
  • 稼働が読めない責任も持てない -> 大きいタスクを振らない
  • 仕様を把握していない -> やることはコードを書くように細かく書く

※言語選定はRubyOnRailsがオススメ! PHPだと複数のフレームワークがありパイが獲得できなくなってしまう

※最新の技術ではなく一般的なソリューションで伝える

  • 難易度は以下(右が難しい)
右が難しい
Scaffold / View => Logic => Design
  • 大きくタスクを振らないことに関して
  • タスクを細かくして、なるべく複数人に作業を依頼する

f:id:s-shota:20180129151402j:plain

  • 慣れてきたら
  • タスクサイズを大きくしてみる
  • 上級技術を与えてみる

強いチームをつくる技術

楽天株式会社 及部 敬雄氏

自己紹介: Twitter: @takaking22

  • 開発現場でよく見る問題
  • レガシーシステム
  • メンバーのスキルが低いなどなど

  • 一見技術的な問題かと思いきや、コミュニケーションの問題では?

  • チームがビジネスとの開発基盤になる 以下が3セット

  • チーム
  • 開発
  • ビジネス

  • 強いチームとは!?

  • 変化に強い
  • チームの文化が存在する
  • 改善サイクルが回っている

  • 強いチームは意識的に作る

  • Q.誰が作る!?  A.チームで!!
  • 誰かがやっているうちは継続しない。自転車を押すくらいのイメージ
  • 自分たちで自分たちを強くする

及部さんスライド

及部さんオススメスライド

  1. エンジニアコミュニティで組織は動き出す

組織の壁とその壊し方

株式会社シーエー・モバイル 大八木 晋平氏

特定の個人を非難するものではなく、気づきを与えるもの

  • 会社紹介
  • シーエー・モバイル:2000年創業
  • ガラケーからSPへ転換し、直近で過去最高業績に復活
  • エンジニア:50名強
  • プロダクト:大小多数
  • 技術環境は決してよくなかった
  • パートナーのコンテンツに守られ、技術的な変化の必要性に迫られなかった
  • 課題感があり、なんとかしたいと考えてくれている社員がたくさんいた

  • 組織は生き物

お話しするケースについて

サイバーエージェントのメディア組織

f:id:s-shota:20180129151451j:plain

  • 組織の壁(1)
企画、開発の壁 (よくある内容で)
企画:「こんな感じでよろしく」
開発:「企画、技術理解なさすぎ」
企画:「開発、事業理解なさすぎ」
・・・
  • 壊し方!(1)
どっちが悪い、というわけではない
とにかく互いに歩み寄るための取り組みを行う
企画メンバーがDBのテーブル構造理解、SQLを書く
開発メンバーが市場の競合サービスをめちゃ知っている
技術リテラシーの高い企画者
事業リテラシーの高い技術者
技術者の評価は技術者がする
  • プレイヤー、マネジャーの壁(2)
1.優秀なプレイヤーがリーダー兼マネージャーをやらざるをえなくなる問題
2.その結果、優秀なプレイヤーを失い、MTGエンジニアが誕生!問題
3.そんなあの人(2)を見て、ああはなりたくないと人が辞めていく問題
  • 壊し方!(2)
1.優秀なプレイヤーは優秀な組織マネージャーとは限らない
2.マネジメントは偉いわけではなく、役割の一つ
3.開発マネジメントの機能、組織マネジメントの機能
4.優秀なプレイヤーがその部署のマネージャーより給料をもらっている世界を当たり前に
5.グレード制度の改定
  • まとめ
1.全ての壁は、ドアである
2.問題は、組織・人の数だけ存在しますが、引き出しを増やしてどんなチーム・組織もよくしている人材になっていく

懇親会!!

料理めちゃくちゃうまい>< ハンバーガー、タコライス!?、ケーキ、寿司!! そしてビールまで。。。 至れり尽くせりです

f:id:s-shota:20180129151537j:plain

f:id:s-shota:20180129151610j:plain

登壇者の方ともいろんなお話が出来、すごく満足度の高い勉強会でした

詳しい内容は是非是非、dots.カンファレンスに参加してください!!

dots.カンファレンス チーム開発を支える技術に参加したよー 午前の部

dots.カンファレンス チーム開発を支える技術に参加したよー 午前の部

f:id:s-shota:20180129151038p:plain

dots.カンファレンス、チーム開発を支える技術に参加してきました!

午前の部、午後の部、と別れており

* 午前は技術運用部分のDevOpsに関する内容
* 午後は技術マネージメントに関する内容

とうまく分かれていて、両方の観点からすごく勉強させていただきました。

**注**
寝坊したため、午前の部はNewsPicksさんのセッションからの参加となりました・・・

講演 #午前の部


11:45 株式会社ニューズピックス 松原 孝司氏

企画+開発手法

・エンジニア同士で使うpull requestにも、非エンジニアも参加出来るように
SlackのBotを利用して情報の収集とgithub issueの発行を行っている

・他にChatOps(Bot)の機能として、インスタンスの起動・終了などをできるようにしており、
属人性の排除を実施している

・エンジニアのルーチンワーク(定期的なオペレーション)は全てChatOpsを利用している

・スマホからアプリケーションのメンテナンスなども!?

パネルディスカッション

ランサーズ株式会社 横井 聡氏(進行)
Connehito株式会社 島田 達朗氏
Kaizen Platform Inc. 石橋 利真氏
株式会社ニューズピックス 松原 孝司氏
Q.
文系・営業の方ですが、その方達がエンジニアを理解する必要性を本セッションで感じられた。
非エンジニアに理解を促すためにどのような手法を使っているか
A.
1.エンジニアから非エンジニアからの質問を集約するツールを使い
(今回はQiitaTeam)それを勉強会として展開促している。
2.エンジニア・非エンジニアのMTGを行い、技術でどのようなアプローチが可能かを
実体験(成功体験)を促している
3.あまり質問を受けすぎるのも良くない。線引きが必要です!
雑多な技術相談窓口という事になりがちなのでエンジニアメンバーが週交代で交互に行っている。
調べる力(Google検索力や調べる力)を促す
Q. 
エンジニアが利用するツールの選定について
A.
1.スタンダードはWEB上で沢山発信されているので「技術者がこれは使える!」というものを采配している
2.使うツールには結論は出ていない、変遷はありRedmine → Like → Google Drive
まだ「これ」というものはない、GDriveからまた変わるかも
3.GoogleDrive スプレッドシートは便利、GASも使え非エンジニアも使える。
共通として使う
まとめ:ツールの選定は技術者に任せるべき。管理部門選定で結果使われないことが多くなってしまう。※経験則
Q
エンジニアの採用について どこから見つけ・技術を見ているのか
・エンジニア不足で同じパイを取り合っていて、難しい。各社の色付けが必要
・またその各社の色を定期的に発信していくことが大事

懇親会

ビール、飲食が出ましたー うれしー><

ケーキ、サンドイッチにCA MOBILEさんのロゴ入り!!

groumet1.jpg

groumet2.jpg

株式会社ニューズピックス松原さんとお話しできました。

いろいろ質問をしても気さくに回答いただきました>< ありがとうございますm( )m

お話しを聞いていると、 DevOpsは進化を遂げており、単なるAlertの通知やPRの通知だけではないこと。。。 非エンジニアからのissue発行やpush/deployなども当たり前に行っているようです(凄い!

またSlackルームごとでBotに対して叩けるコマンドもあり、非エンジニア層でもある程度運用を担当しているようです。

また何より驚いたのが、皆さん当たり前のように

SQL文を叩ける!!

私が講演を聞けなかった、他社さんもそのようでした。

だって、営業の方や企画者がSQL叩いて集計して、提案するのが一番いいですもんね。集計したい項目だって、時期や年齢層、場所とか利用端末とかとか様々で統計データ取りたいその本人が実行することで、納得のいくデータが取れますよね。

第一部のカンファレンスに参加して

全部は聞けてはいませんが、DevOps(ChatOps)は当たり前に存在していて、それで行うことが2step いや 3step以上進んでいました orz

ps.あっ。。。Mac電源忘れたので明日取りに行きます。。。
今日は眠いので(遅刻したくせに・・・)明日午後の部、書きます!