Viewing entries in
KEY

YOKOHAMA MARATHON 2016

YOKOHAMA MARATHON 2016

前回距離が不足していて話題となった横浜マラソンですが、
今回は2016年3月13日(日)に開催が決まり、今月9月1日からエントリーが始まりましたね。(公式サイトこちら

atWare にはマラソン部はありませんが、何人かはフルマラソン経験者がいます。(私もその一人)
先日社員でランチに行った際、スタート・ゴールが弊社のあるみなとみらい地区ということで、横浜マラソンの話題になりました。
するとあまり運動しなさそうなメンバから日頃からトレーニングしているメンバまで、数人がエントリーすることが判明!
地元優先枠や外国人優先枠(こちらは先着順!)があるので、多少当たる確率は多少上がりそうです。

フルマラソンのコースは、横浜の名所を回ります。(公式サイトより)
中華街を通らないのは残念ですね…

みなとみらい大橋[スタート]
 ↓
横浜スタジアム
 ↓
マリンタワー
 ↓
本牧周辺
 ↓
南部市場
 ↓
首都高速湾岸線
 ↓
本牧ふ頭D突堤折返し
 ↓
赤レンガ倉庫
 ↓
みなとみらい
 ↓
パシフィコ横浜[ゴール]  ↓ みなとみらい大橋[スタート]

募集人数は合計25,000人。
内訳はフルマラソン:23,950人、10km:1,000人、10km(車いす):30人、2km(車いす):20人
フルマラソンには以下枠が存在しています。(公式サイトから抜粋)

  1. 地元優先枠:3,000人(申込多数の場合は抽選)
    ・ 横浜市民(2,000人)横浜市在住の方
    ・ 神奈川県民(1,000人)横浜市以外の神奈川県在住の方
  2. 一般枠:19,450人(申込多数の場合は抽選)
    ・ 一般の方
  3. 外国人優先枠:500人(先着順)
    ・ 外国籍の方が優先的に参加できる枠
  4. 横浜マラソンチャレンジ枠:500人
    ・ 横浜マラソンへの参加機会の提供をきっかけとして、
    多くの方がランニングをはじめとしたスポーツを習慣にしていただけるよう、
    各区のマラソン大会や市内の各区スポーツセンターなどで実施する
    ランニング関連事業(ランニング教室やランニングイベントなど)と連携した参加枠を設定します。

フルマラソンであれば4~5時間近く走るまたは歩くことになるので、日常生活では考えられない運動ですね。
一応レースなので、皆さんテンション・アドレナリンが全開となり、本来のペースを保てなくなることが多々あります。
また沿道からは芸能人かのように応援・声援が聞こえてくるので、更に頑張ってしまいます笑
終盤になると、「ロッキーのテーマ」や「負けないで」を用意してくれる方もいて、ランナーに勇気とパワーと与えてくれます。
正直かなり辛いことばかりですが、完走出来た時の達成感は最高に気持ち良いですよ!
これからトレーニングを開始しても間に合いますので、特に横浜市民の方は応募してみてはどうでしょうか?締切は9月30日です。
きっと新たな自分と横浜が発見できますよ!!

Atlassian Stashの耐障害性を高めよう その1 プランニング編

Atlassian Stashの耐障害性を高めよう その1 プランニング編

はじめに

私の所属しているプロジェクトではAtlassian Stash (Git)でソースコードを管理しています。
普段何気なく使用しているGitですが、もはや手放すことが難しい存在です。

そんな中、ふと「もしもStashのデータが消失したら。」と言う事態を想像してみました。
Gitは分散バージョン管理なので、各々のローカルのGitリポジトリをかき集めれば必要なものは復旧できそうです。

どうやらソースコードの消失などの最悪の事態は発生しないことはわかりましたが、
Stashを使用していればサーバーの冗長構成は必要ないでしょうか。

Atlassianのドキュメントによると、Stashに障害が発生した場合、復旧作業をおこなっている間、下記の様な状況になります。

  • できること

    • 開発者
    • コードのコミット
    • ブランチの作成
    • ブランチの切り替え
    • 過去のコミットと差分確認 
    • ...
    • Stashを経由せずに他の開発者のリポジトリからフェッチする
  • できないこと
    • 開発者
    • リポジトリのクローン
    • セントラルリポジトリ(Stash)からのフェッチ
    • セントラルリポジトリ(Stash)へのプッシュ
    • Stash UI へのアクセス (プルリクエストの操作など)
    • CI/CDサーバー
    • リポジトリのクローン
    • 変更点の取得

作業は続行不可能では無いですが、チーム開発を進めていく上でかなりの制限となってしまいそうです。

というわけで、転ばぬ先の杖ということでStashの冗長化に挑戦してみたいと思います。

Stash冗長化について調べてみたところ、本家Atlassianに冗長化についてのドキュメントが用意されていました。

冗長構成のパターン

Atlassianのドキュメントによると、冗長構成には以下の様なパターンがあるようです

構成 復旧時間
Single node hours-days 単一ノード
Cold Standby 2-10 min サーバーはActive StandByともに起動させておくが、StashはActive側のみ起動しておく構成。Active側が障害となった場合StandBy側のStashを起動させ、切り替える
Warm Standby 0-30 Sec Active Standby 双方にStashを起動させておき、Active側が障害となった場合切り替える
Active-Active <5 Sec マルチマスタ&負荷分散構成 ただし Stash Data Center が必要

この構成の内、Active-Active構成をするためには Stash Data Centerを使う必要があるらしく、 予算的に厳しい様な予感がするので今回は見送ることとします。

また、Warm StandBy 構成 はStashがメモリ上にロック情報などを持っているため、現時点でこの構成は取れないそうです。

そうすると、コストとメリットのバランスを考えた場合Cold Standby構成を取るのが良いようです。
(Atlassianのドキュメントもこの構成でクラスタを組んでいます。)

図で表すと、下記の様になります。おおむねAtlassianのドキュメント通りですが、データベースのみ、他のAtlassianプロダクトと共有することを考えて、Stashとは別のサーバーとしています。

細かいソフトウェアのバージョンなどはもう少し調べてみてから決定していきたいと思います。

というわけで、だいたいの構成の目処がついたところで、今回はここまでとしたいと思います。

次回は実際のクラスターの構築を行ってみたいと思います。

みなとみらいサイクリング夏

みなとみらいサイクリング夏

みなとみらいは整備された道が多くちょっとしたサイクリングもいいですよ。

ということで本日はみなとみらいサイクリングをご紹介します。

本日のルートはこちら。約40〜50分のコースです。

スタートはオーケー本社orストア。建設中ですね。

マリノスタウン。

パシフィコ横浜

みなとみらいメインストリート

観覧車

インターコンチネンタル

赤レンガ倉庫

マリンタワー

元町・中華街

ランドマークタワー(ピンぼけしてしまった)

とても道が広く眺めもいいですね。

一箇所、ここだけ左折しないように気をつけてね。

マリンタワーまでは車は少なく気持よく進んであっという間です。

中華街方面に出ると車が多くなるので慎重に進みます。

みなとみらいは小さい街ですが良いポイントが多いです。

それでは。

RaspberryPi上でRedisを動かしてみた

RaspberryPi上でRedisを動かしてみた

みなさん、こんにちは。KEYチームの矢納です。

技術ネタ第4弾!!「RaspberryPi上でRedisを動かしてみた」です。
過去記事の目次はこちらに移動しました。

軽量なデータベース

第2弾でCouchbase Liteを使ってのデータ保存を行いました。ですが、Couchbase Liteを使う際にはCouchbase ServerとSync Gatewayを用意する必要が有ります。RaspberryPi単体で動かしたい場合には向いていません。とはいえ、非力なRaspberryPiにPostgreSQLやMySQLを入れるのは少し抵抗があります。軽量なデータベースを探していたら有りました!!Redisです。

セットアップ

では、RaspberryPiにRedisをインストールします。

$ sudo apt-get install redis-server

インストールすれば、Redisは起動しています、確認してみてください。

$ ps aux | grep redis
    redis     3191  0.1  0.5  27356  2360 ?        Ssl  02:11   0:00 /usr/bin/redis-server /etc/redis/redis.conf
$ netstat -aunt | grep 6379
    tcp        0      0 127.0.0.1:6379          0.0.0.0:*               LISTEN

既に自動起動にもなっています。

sudo chkconfig --list | grep redis-server

起動・停止の仕方も載せておきます。

$ sudo service redis-server stop
$ sudo service redis-server start
$ sudo service redis-server restart

設定

外部設定を許可します。

$ sudo vi /etc/redis/redis.conf
30行目をコメントアウト
# bind 127.0.0.1

パスワードを設定します。

$ sudo vi /etc/redis/redis.conf
166行目にパスワードを記述
requirepass <パスワード>

パスワードを設定する際に注意です。

Redisはとても高速なため、性能の良いマシン上で実行している場合は、毎秒150,000回程度のパスワードチェックを行うことができます。そのため、弱いパスワードであれば簡単に突破されてしまうため、非常に強いパスワードを設定するようにしてください。

Redisの公式ドキュメントに書かれています。

PythonでRedisを触る

PythonでRedisを扱うのにライブラリが用意されています。まずはインストール。

$ sudo pip install redis

実際にコードを書いて行きましょう。

おわりに

今回はRedisの基本の操作方法を行いました。他にも有効期限ありの保存、上書きはしないなど色々とできます。それはご自身でやってみてください。

それでは

Email: yanou at atware.co.jp

学生相手にAgile講習をした話

学生相手にAgile講習をした話

みなさんこんにちは。KEYチームの武永です。

こちらの記事にもあるようにatWareでは今年もインターンシップを受け入れています。 その中で私がインターン生に向けてAgile講習を行ったのでそれについて書いていきます。

Agile講習開催の経緯

KEYチームがメイン担当としてインターン生を受け入れており、
私と円城寺(円城寺の記事はこちらから)が認定スクラムマスターの資格を持っていて
実際のプロジェクトをScrumで取り組んでいることもあり、Agile講習を行うことにしました。
自分のAgileに対する知識・経験の把握と社外の人向けプレゼンの練習になると思って
私がメイン講師になり、円城寺のサポートを受け、講習を行いました。

Agile講習の内容

流れとしてはウォーターフォールの紹介、ウォーターフォールでの問題点から
紙ヒコーキワークショップを実施し、Scrumの説明という流れで行いました。
私はウォーターフォールのプロジェクトを経験したことが無かったので教科書的な説明になってしまいましたが。。。
使用したスライドは以下になります。

講習の様子

函館ラボにもインターン生が来ていたのでリモートで行いました。

以下の動画は実際に紙ヒコーキを飛ばしているところです。
楽しそうに実施してくれて良かったです。

紙ヒコーキワークショップ結果
予測 実測
1 5 1
2 3 4
3 8 10
4 11 8

紙ヒコーキを飛ばしたらみんなで後片付けをした後にScrumの説明を行いました。

本当は2時間程の予定でしたが、1時間半程で終了してしまいました。
学生の頃の経験で10分・20分程度の短いものの時間感覚はあるのですが、
1時間超えというものは初めての事だったので非常に良い経験になりました。

インターン生からの感想

講習後個別に感想を聞いてみました。

  • 分かりやすかった
  • 紙ヒコーキワークショップが楽しかった
  • なんとなく分かった
  • Scrumのことはなんとなく知っていて、ワークショップで「なるほど」となるところが結構あった。

直接聞いたので社交辞令的にプラスの意見が多かったのかは分かりませんが 皆さんから良い感想が聞けて非常に嬉しかったです。

反省点

学生側からはプラスな感想が出来ましたが講習を聞いていた社員からは
「話すの速かった」、「知っている前提の内容が結構あった」などのご指摘を結構受けました。
Agileの知識・経験不足、対象者を考えたプレゼン作りなどなど
自分に不足している部分を改めて実感できた良い経験になりました。

最後に

今回の講習を受けた学生の刺激になり少しでもAgile・Scrumについて勉強するきっかけ作りになれたなら最高だなと感じています。
それと同時に自分ももっとAgile・Scrumについて勉強していこうと思える機会になりました。

またこのような発表する機会があるのなら上手く行った点、反省点を活かして行いたいと思います。

夏のインターンシップ後半戦

夏のインターンシップ後半戦

KEYチームのアライです。
8月28日にインターンシップの前半戦(内容はコチラ)が終わったと同時に8月31日から後半戦がスタート。
後半戦は5名の学生さんを受け入れています。

KEYチームとしては、前半戦はリーンスタートアップ、後半戦はアジャイルに興味のある学生をサポート。
3名の予定が2名となり、少しさびしいチームになってしまいましたが、
基本学生さん達にやりたいこと(アイデア)を考えます。
今回はアイデアを持っている学生さんだったのですぐにテーマが決まり、アジャイル手法で Web サービスを作ることになりました。

まずはサポートメンバと一緒に以下プラクティスを実施。

  • ユーザーストーリーマッピング
  • ストーリーの選択
  • 各ストーリーのタスク出し
  • 計画ゲーム

そしていよいよ開発が始まりました。今回は1イテレーション(約5日間)を2回行います。
歳が近いこともあり、積極的に意見交換しながら進めていけそうです。

自分達が決めた目標を達成するために頑張ることはもちろんですが、会社からあるミッションが与えられています。
他のインターンシップ生や他の社員との交流、アットウェアの事をもっと知って貰いたいなどなど…

彼らにとって、そして私たちにとっても刺激となる3週間。
目標の達成だけではない、日々の過程や交流も大事にして、良い経験となるようにサポートしていきます。
3週間後の成果発表と成長した姿が今から楽しみです!

Atlassian製品のアドバンテージ「Application Link」

Atlassian製品のアドバンテージ「Application Link」

Application Linkとは

アプリケーションリンクとは、Atlassian製品にデフォルトで含まれている、JIRA, Confluence, Stash, FishEye, Crucible, Bambooの各製品を相互に連携させるための機能です。
アプリケーションリンクを設定すると、リンクさせた製品同士が相互に情報をやりとりしたり、お互いの機能を利用することが出来ます。
例えば、JIRAとConfluenceをリンクさせた場合、JIRAのチケットをConfluenceのマクロを利用してリンクさせたり、
ConfluenceでからJIRAのチケットを作成するなど、お互いの利便性を向上させることが出来る機能です。

Atlassian以外の製品でも、CIツールと、リポジトリ管理ツールの連携や、課題管理ツールとCIツールの連携などが用意されている場合もありますが、
違うプロダクトを連携させる場合とくらべてAtlassianのアプリケーションリンクはより密接な連携ができるというメリットがあります。
また、設定も簡単にできるため、「サクッと連携できると思っていたけのに意外とハマった。」ということが起こらない点もメリットといえると思います。

Bamboo + Stash をリンクすると

では、具体的にはどうなるのでしょうか。
Bambooの公式ドキュメント などを見ると、このようなことが書いてあります。

  1. Stashのリポジトリに新しいコードがpushされると自動的にビルドを実行させることが出来ます。(Stash以外のリポジトリの場合ははBambooが定期的に更新を確認する必要があります)
  2. Stashの指定したリポジトリに新しいブランチが作成された場合、Bambooが自動的にそれを検知し、ブランチのビルドプランを作成します。 また、ブランチが削除された場合はBamboo上のブランチに対するビルドプランを自動的に削除することも可能です。
  3. Bambooのビルド結果から、そのビルドに含まれているコミットの変更差分確認画面へダイレクトにジャンプ出来ます。
  4. Bambooのビルドに含まれているStashのコミットのリストをBambooのビルド結果から確認出来ます。
  5. コミットやプルリクエストに対するビルド結果をStash側で確認することが出来ます。

ブランチの自動作成

アプリケーションリンクの機能は業務でも使用していますが、今回はその中でも便利だと感じているブランチの自動作成機能を紹介します。

  1. Bambooのビルドプラン設定からブランチの自動作成設定が出来ます、すべてのブランチを作成 することもできますし、正規表現にマッチするブランチだけを自動作成することも出来ます。
    GitFlowで開発している場合に、featureブランチのみ自動作成するという設定も可能です。

2.Stashで(もしくはGitコマンド経由で)ブランチを作成すると。

3.Bambooが自動的にブランチをビルドプランに追加してくれます。

ビルド対象のリポジトリが少ないうちは、Bambooの管理画面から手動でブランチを追加する作業も苦になりませんが、
リポジトリが増えてくるに連れて徐々に便利さが実感できるようになってきます。

その他の製品のApplication Linkについて

さて、こんなに便利なApplicationLinkですが、今回のBambooとStashの組み合わせ以外にも様々な組み合わせが存在します。
ApplicationLinkを設定することでどんなメリットがあるかは下記リンク先のドキュメントをご参照ください。

Stash

JIRA+Confluence

Bamboo+Confluence

RedmineなどのAtlassian製品以外のツールでも、CIサーバーや、リポジトリ管理ツールなどとの連携は可能ですが、 Atlassian製品で揃える事による「設定が簡単でハマりにくい」というメリットは大きいです。

Atlassian製品をお使いなら非常に便利ですので、是非アプリケーションリンクを活用してみてください。

javascriptのimmutableデータを感じてみよう

javascriptのimmutableデータを感じてみよう

こんにちは、KEYチームの荒木です。本日はjavascriptのimmutableについてです。

今話題としては(もう古いかもしれませんが)immutableですか? javascriptはobject型をのぞく全ての型は不変 (immutable) な値として定義されていますが、不変な値とそうでない値ではどのような違いがあるのかをみてみましょう!

imuutableなデータを扱う

mutableなデータを扱う

ソースの実行結果は

mutableなデータを取得してみると53.768ms

immutableなデータを取得してみると(一度作りなおす必要はありますが)0.221ms

とても早いですね。

簡単に扱うimmutable.jsもありますので是非使ってみてください。

参考1: https://developer.mozilla.org/ja/docs/Web/JavaScript/Data_structures

参考2:https://www.youtube.com/watch?v=I7IdS-PbEgI

RaspberryPiからGoogle Calendar APIを呼んでみた

RaspberryPiからGoogle Calendar APIを呼んでみた

RaspberryPiでGoogle Calendar APIを呼んでみた

みなさん、こんにちは。KEYチームの矢納です。

技術ネタ第3弾!!「RaspberryPiでGoogle Calendar APIを呼んでみた」です。
過去記事の目次はこちらに移動しました。

なぜやろうとしたのか

弊社では会議室の予約にGoogle Caldendarを使用しています。皆さんスケジュール管理をほぼGoogle Calendarを使用しているので、同時に見る事ができて便利です。

さて、弊社には1〜3人しか入れない部屋があります。電話ボックスなどと言われています。もちろんこの部屋も予約可能です。ですが、多くの人が予約をせずにこの部屋を使います。そうすると実際に使おうと思っていた人が使えなくなってしまいます。

ですので、その部屋に入った際にその部屋の予定を表示してあげて、いきなり入った人にお知らせするモノを作ろうと思いました。部屋は小さいのでできればコンパクトに予定を表示したいです。最近、Raspberry Pi公式のディスプレイが発売されたのでそちらに表示させます。

表示の前にGoogle Calendar APIを利用してその部屋の予定を取得する必要が有ります。Raspberry PiでどのようにGoogle APIの呼ぶのかが気になったので、実際にやってみました。

OAuthのやり方

Google APIを使用するには認証をする必要が有ります。パソコンであるのならブラウザでID/PASSを入力するのですが、RaspberryPiには標準ではディスプレイがありません。ではどうすれば良いのでしょうか?

今回はこちらを参考にしました。

OAuthのやり方は右図を見ると分かり易いですね。

  1. Androidですか?iOSか? → いいえ、違います
  2. ブラウザがありますか? → いいえ、ありません

つまり、「Using OAuth 2.0 for Devices」となるのです。


Step1. Client ID と Client secret の作成

ここから、実際にGoogleAPIを呼ぶための準備等を行っていきます。

  1. Google Developers Consoleにアクセス。
  2. Create Project
    • Project Nameは任意に決めてください
  3. 左のメニューから APIs & auth -> credential 選択
  4. Create new Client ID ボタンクリック
    1. Installed Application -> Other -> Create Client ID 選択
    2. 作る際にConsent screenの入力を求められるかもしれません。その際は適当に入力してください。
  5. Client ID と Client secret の出来上がり

Step2. ユーザコードの取得

  1. https://accounts.google.com/o/oauth2/device/code に対してPOSTリクエスト

    • Hedaer: 'Content-Type: application/x-www-form-urlencoded'
    • Parameter: client_id={Step1で取得したClientID}
    • Parameter: scope={こちらを参照} $ curl -d "client_id={Client ID}&scope={scope}" https://accounts.google.com/o/oauth2/device/code

※scopeが複数ある場合は空白でつなげる

レスポンス

{
  "device_code" : "4/4-GMMhmHCXhWEzkobqIHGG_EnNYYsAkukHspeYUk9E8",
  "user_code" : "GQVQ-JKEC",
  "verification_url" : "https://www.google.com/device",
  "expires_in" : 1800,
  "interval" : 5
}

Step3. デバイスの承認

このステップはご自身のパソコンで行ってください。

  1. Step2でのレスポンス内のverification_urlの内容にブラウザでアクセス
  2. 「Enter the code displayed by your device:」と表示されますので、Step2でのレスポンスのdevice_codeではなく user_code を入力してください。
  3. あとは指示の通りに進んでください

Step4. アクセストークンの取得

  1. https://www.googleapis.com/oauth2/v3/token に対してPOSTリクエスト

    • Header: 'Content-Type: application/x-www-form-urlencoded'
    • Parameter: client_id={Step1で取得したClientID}
    • Parameter: client_secret={Step1で取得したClient secret}
    • Parameter: code={Step2でのレスポンスのdevice_code}
    • Parameter: granttype='http://oauth.net/granttype/device/1.0' $ curl -d "clientid={Client ID}&clientsecret={Client secret}&code={devicecode}&granttype=http://oauth.net/grant_type/device/1.0" https://www.googleapis.com/oauth2/v3/token`

レスポンス

{
  "access_token" : "ya29.AHES6ZSuY8f6WFLswSv0HELP2J4cCvFSj-8GiZM0Pr6cgXU",
  "token_type" : "Bearer",
  "expires_in" : 3600,
  "refresh_token" : "1/551G1yXUqgkDGnkfFk6ZbjMLMDIMxo3JFc8lY8CAR-Q"
}

Step5. Google Calender API呼び出し

アクセストークンをパラメータに設定してリクエストを出せば結果が返ってきます。

例) ある特定の日のイベントを取得する。

https://www.googleapis.com/calendar/v3/calendars/{CalendarID}/events?singleEvents=true&orderBy=startTime&timeMin=2015-07-14T00%3A00%3A00.000Z&timeMax=2015-07-15T00%3A00%3A00.000Z&key={access_token}

Calendar APIに関してはこちらのリファレンスページをご参照下さい

さいごに

これでブラウザを持たないデバイスでのGoogle APIの呼び出しができました。アクセストークンには有効期限が有りますので、期限が切れてしまったらリフレッシュトークンを使って更新を行ってください。

Google Calendar APIで予定は取得できるようになったのですが、まだディスプレイが届いていないので実際のモノは作れていません(ToT)。またモノができましたら記事を書くかもしれませんのでお待ちください。

Email: yanou at atware.co.jp

GebでCookieを扱ってみる

GebでCookieを扱ってみる

みなさんこんにちは。KEYチームの武永です。

今回も引き続きGebネタです。 前回の記事は こちら

今回はGebでCookieを触れるのかちょっと個人的に気になったので調査して実際に動かしてみました。

作成したプログラムは以下の様な単純なものです。

  1. 「Yahoo!JAPAN」にアクセス
  2. タイトルの検証
  3. 現在のCookieを全てコンソール上に表示
  4. 以下のようなCookieをセット
    Name : GebCookie
    Value : atware.co.jp
  5. セット後のCookieを全てコンソール上に表示

ソースコードはこちらです

そして実行して表示されたものがこちらになります。

--設定前 Cookie 出力開始-----
name  : btpdb.2wzBV9u.dGZjLjE5ODkzNTc, value : REFZUw
name  : B, value : 5g9cb99atlbkl&b=3&s=3n
name  : btpdb.2wzBV9u.dGZjLjE0MzQzNDg, value : VVNFUg
name  : btpdb.2wzBV9u.dGZjLjE0NDcxNDU, value : UkVRVUVTVFMuMA
--設定前 Cookie 出力終了-----
--設定後 Cookie 出力開始-----
name  : btpdb.2wzBV9u.dGZjLjE5ODkzNTc, value : REFZUw
name  : GebCookie, value : atware.co.jp
name  : B, value : 5g9cb99atlbkl&b=3&s=3n
name  : btpdb.2wzBV9u.dGZjLjE0MzQzNDg, value : VVNFUg
name  : btpdb.2wzBV9u.dGZjLjE0NDcxNDU, value : UkVRVUVTVFMuMA
--設定後 Cookie 出力終了-----

確かに作成したCookieがセットされていることが確認できます(赤字部分)。

このやり方を使えば自分達が意図したとおりにCookieがセットされているかどうかを確認することが出来ますね。
実際にCookieの値を検証するかどうかはプロジェクト次第ではあると思いますが、参考になれば幸いです。

キュウカンチョウ

キュウカンチョウ

KEYチームのアライです。
ご存知の通り、9月1日は防災の日ですね。
幼少期は毎年防災頭巾を被り、避難訓練をしていたことを思い出します。

アットウェアでは万が一に備えて、非常食を備えています。
救缶鳥プロジェクト(http://www.daily-ad.jp/kyucancho/)に賛同し、2014年から始めました。

救缶鳥プロジェクトとは、非常食を供えることで世界の飢餓救済の活動に参加できるプロジェクトで、
賞味期限3年間の非常食(パン缶)を2年間備蓄後、
残り約1年の間に日本中から回収・輸送され、飢餓に苦しむ国々へ届けられる仕組みになっています。

我々ができる事は限られているので、少しでも役に立てればと。

KEY TEAM BLOG ~EPISODEⅢ~

KEY TEAM BLOG ~EPISODEⅢ~

KEYチームのBLOG祭り第三弾として、
今日9月1日から毎日、メンバ日替わりでブログを投稿していきます!

毎日投稿しますので、是非ともご一読下さい!

newcomer

newcomer

KEY チームのアライです。

今年度の新入社員3人が研修を終えて、8月からチーム、プロジェクトへの配属となります。
先日配属前に弊社メンバが参画している社外プロジェクトの開発現場を見学させていただきました。
弊社は請負での仕事がほとんどなため、
社外で作業するメンバがどのようなに立ち振舞、どのようにお客さんと信頼関係を築いているのかを見て、感じて欲しいです。

一日の始まりは、朝会です。弊社メンバがファシリテーションしていきます。
午前中は内部ミーティングを行い、まずはペアワークの見学。
気になるコトを質問すると、忙しい中丁寧に回答してくれます。新人だけの特権です。

今日のランチメンバで一枚。 よくお客さんとも一緒に行きます。

午後は別プロジェクトのスクラムイベントや打合せなどを見学させていただきました。
あまり質問ができる状況ではなかったので、少しでも何かを吸収しようと一層目を凝らし、耳を傾けました。
その後はまたペアワーク見学に戻り、タイミングをみて質問するなど、最後まで集中して取り組んでいました。

今日一日を終えて、各人から感想を貰いました。

mishima

mishima です。一日ありがとうございました。スクラムイベント、打合せなどを見学させていただきましたが、特に印象的だったのが、ペアプログラミングでした。二人で合意を取って、常に議論しながら慎重かつ迅速に開発を進めているという印象を受けました。社外の開発現場の雰囲気や、先輩社員の活躍などを見て、良い刺激を受けることが出来ました。

nam

nam です。I really appreciate for welcoming us.I felt the meetings very professional and I like the way that people work and discuss together.I learned Japanese so much when I talked with other people about everything in life, working, etc.

yamamoto

yamamoto です。一日ありがとうございました。先輩社員が朝会を主導したり、スクラムイベントで積極的な発言したりと社内だけでは見られないことや雰囲気を感じることが出来ました。また知らない技術を目の当たりにして、とても勉強になりました。

一日という時間でしたが、それぞれが違う形で貴重な経験や刺激を受けることが出来、
また社内だけでは感じることが出来ない現場の雰囲気や、先輩社員の立ち振舞も感じることが出来たようです。
どのチーム、どのプロジェクトに配属されたとしても、積極的にコミュニケーションを取り、
色々なことを吸収して、チャレンジして、次世代の atWare を担う存在になることを期待しています。

一日の終わりは、ノミニケーション。
お客さまにも参加していただき、楽しい時間となりました。
この場を借りて、ありがとうございました。

Gebでスマートフォン用ブラウザ上での表示を確認する

Gebでスマートフォン用ブラウザ上での表示を確認する

みなさんこんにちは。KEYチームの武永です。

今回も前回に引き続きGebネタです。 前回の記事はこちら

つい先日、先輩に 「Gebでスマートフォンのテストってできないの?」 と聞かれました。
確かにできたら便利な場面はあるはずだと思い、調査して実際に動かしてみたのでそちらについて書いていきます。
スマートフォンのブラウザでの確認であってアプリの確認ではありません。

GebでiPhone版の画面を表示するためのコードが以下のものになります。

ユーザエージェントをiPhone6のものに設定することで実現可能になりました。
ユーザエージェントに関してはこちらのサイトを参考にしました。

実際に動かす際には上記で作成した「MobileSpec」を継承したクラスを作成します。
下記の例は、iPhone6で「Yahoo! JAPAN」へアクセスするものになります。

作成したGebを動かしてみたものが以下の動画です。

確かにスマートフォン版の画面表示をさせることが出来ました。

最近ではWebサイトはスマートフォンに対応していることがほぼ当たり前になってきていると感じています。
このようにスマートフォン版ブラウザでのUIテスト自動化を行う機会は増えていくと思いますので参考になれば幸いです。

Atlassian Bamboo + Crowd 後編:Crowdとの連携

Atlassian Bamboo + Crowd 後編:Crowdとの連携

BambooとCrowdの連携

こんにちは、KEYチームの円城寺です。

前回(記事はコチラ)はBambooのインストールを行いましたが、今回はその続きとして、いよいよBambooとCrowdを連携させて、 ユーザーをCrowdで一元管理できるようにしたいと思います。

作業は、公式の手順(リンクはコチラ) に沿って 「Crowd設定」 -> 「 Bamboo設定」 という流れでですすめていきます。

Crowd設定

まずはCrowd側にBamboo用のユーザーの作成と、連携のための設定を行います。

今回はCrowdに以下のユーザーを作成してBambooと連携します。

ID Group Bambooのロール
bamboo bamboo-admin 管理者
bamboo-user bamboo-user 一般ユーザー

ユーザーの追加

Bamboo用にユーザーを追加します。

Top画面から「Users」タブをクリック

「Add User」リンクをクリックし、ユーザー登録画面にて必要な情報を入力し「Create」ボタンをクリック

同様に一般ユーザーも追加します

グループの作成

Bambooでユーザーのロール制御を行うため、ロールに対応したグループを作成します。

「Groups」>「Add Group」リンクをクリック

グループ登録画面にて必要な情報を入力し「Create」ボタンをクリック

同様に一般ユーザー用グループも作成します

グループへユーザーを登録

作成したグループへユーザーを登録します。 管理者にしたいユーザーは bamboo-admin グループへ。 一般ユーザーにしたいユーザーは bamboo-user グループへ登録します。

「Groups」をクリック、「bamboo-admin」リンクをクリック

「Direct members」タブをクリックし「Add Users」ボタンをクリック

「Search」ボタンをクリックすると、ユーザーが表示されるので、管理者にしたいユーザーにチェックをし、「Add Selected Users」ボタンをクリック

同様に一般ユーザーも一般ユーザー用のグループへ登録します

アプリケーションの作成

Crowdで作成したユーザーとBambooを関連付けるため、アプリケーションを登録します。

「Application」 -> 「Add application」 をクリック

下記の情報を入力し「Next」をクリック

項目 設定値
Apprication type Bamboo
Name Bamboo
Password 任意のパスワード

ここで設定するパスワードはBambooとCrowdが連携する際の認証に使用します。

BambooとCrowdの通信設定を入力し「Next」をクリック

URLにユーザーがアクセスするURLを、Remote IP AddressにBambooサーバーとCrowdサーバーが通信する際のBambooサーバーのIPアドレスを設定します。

ユーザーディレクトリの選択

Bambooの認証で使用するユーザーが存在する、ユーザーディレクトリを選択します。 今回では、先ほどの手順でユーザーを作成した際に指定したディレクトリを選択します。

グループの選択

Bambooで認証に使用するグループを追加します。

登録内容の確認

登録内容を確認し登録します。

Bamboo の設定

Crowdとの通信設定

crowd.properties の編集

{BAMBOO_ROOT:/opt/atlassian/bamboo}/atlassian-bamboo/WEB-INF/classes/crowd.properties を編集します。

マニュアルには以下の4点を変更せよと書いてありますが、session.validationintervalはデフォルトの2分で問題ないためそのままにします。

設定項目 設定値
application.name bamboo
application.password {CrowdのApplication設定で設定したパスワード}
crowd.server.url http://127.0.0.1:8095/crowd/services/
session.validationinterval 2

Bambooの認証システムのCrowdへの切り替え

atlassian-user.xml の編集

{BAMBOO_ROOT:/opt/atlassian/bamboo}/atlassian-bamboo/WEB-INF/classes/atlassian-user.xml を編集します。

Crowd用の設定がコメントアウトされているので、コメントを外します。

<!--<crowd key="crowd" name="Crowd Repository"/>-->

<crowd key="crowd" name="Crowd Repository"/>

ユーザーディレクトリの設定

Bambooに管理者でログインし 「右上の歯車マーク > Overview」をクリック

「Bamboo administration」画面が表示されるので 「Security」グループの「User repositories」をクリック

Server URL, Application Nameを確認、 Application PasswordにCrowdに設定したパスワードを入力します。

これでめでたくBambooの認証をCrowdに統合することが出来ました。

連携しているサービスがBambooだけですとそれほどメリットが感じられないかも知れませんが、 ここで上げたBamboo以外に、JIRA、Confluence、StashなどのAtlassianの製品を導入していくにつれてユーザー管理コストの軽減効果が実感できるものと考えております。

また、ユーザーの追加・削除漏れなどのセキュリティリスクの軽減にもつながりますので、Atlassian製品導入の際には合わせてCrowdの導入もご検討ください。

Atlassian Summer Campaign

Atlassian Summer Campaign

KEY チームのアライです。

突然ですが、Atlassian ページ再開記念と暑い夏を吹き飛ばそう企画として、
「JIRA + JIRA Agile」25ユーザー版ライセンス(サーバー版)の無償利用キャンペーンを実施します。
以下応募条件を全て満たした企業様の中から、独自審査で1社を選定し、約1年間無償でご利用いただきます。

JIRA とは、「作業を計画し、タスクを共有、追跡するプロジェクト管理ツール」
JIRA Agile とは、「スクラム、カンバンでアジャイル開発を手助けするツール」

【応募概要】

  • Atlassian 「JIRA + JIRA Agile」25ユーザー版ライセンス(サーバー版)
  • 応募期間:2015年8月11日から8月31日
  • 当選企業発表日:2015年9月7日(予定)
  • 応募条件:
    1. 企業であること
    2. 応募理由(利用用途、想定ユーザー数含む)をアツく説明できること
    3. サーバーが用意できること
    4. 年数回の利用レポートを行うこと
    5. 貴社名を出して利用レポートを弊社ブログなどで公開可能なこと


再開した Atlassian ページのコチラからご応募下さい。
沢山のご応募お待ちしております!!

Gebでのドラッグ&ドロップ

Gebでのドラッグ&ドロップ

みなさんこんにちは。KEYチームの武永です。
今回はWebテスト自動化フレームワークであるGebのNavigator APIのドラッグ&ドロップを使ってみましたのでそちらについて書いていこうと思います。
最近はNavigator APIの説明をしている記事は結構増えてきているのですが、 ドラッグ&ドロップを使用した記事は私が見る限りでは見つけられなかったため使ってみました。

Gebとは

  • Luke Daley氏を中心に開発されているWebアプリケーション向けの機能テストを自動化するためのGroovy言語で書かれたフレームワーク
  • GroovyなのでJavaと互換性があり、SeleniumWebDriverの資産をそのまま利用できる
  • jQueryライクな記述で簡潔なDSLでテストスクリプトを記述可能
  • Page Object Patternをサポートしているので画面変更に強いテストを簡単に作成可能
  • JUnitやSpockなどのテストフレームワークと統合することも可能なため、TDDやBDDなどの開発プロセスに取り入れやすい
  • テスト中の画面をキャプチャして出力できる

このような特徴があるテストフレームワークです。
ちなみに「ジェブ」と発音します。
私の周りで初めて「Geb」という単語を見た時に「ゲブ」と発音した方がいたので結構間違える人も多いのではないでしょうか。
公式でも「ジェブ」と発音しろと明記されているほどです。
http://www.gebish.org/

  • jQueryのような文法でHTML要素を取得することができるAPIのこと
  • "$"関数を使うことでコンテンツ内容を取得することができる
  • inputタグ, selectタグの値取得はもちろんのこと、値のセットも簡単におこなうことができる
  • クリックやドラッグ&ドロップといった動作も実行することができる

"$"関数の定義は

$(«css selector», «index or range», «attribute / text matchers»)

のようになっており、以下のようなコードを書いた場合は

$("h1", 2, class: "heading")

h1タグでクラスが"heading"の要素の中の、3番目(indexの最初は0)のものを取得できます。

以下、一例ですが、form内の要素の値検証、値入力等が非常に簡単だと思っています。
・HTML

・Geb

では本題のドラッグ&ドロップに入って行きたいと思います。
今回は以下の様な青と赤のブロックをグレイのブロックの上に移動すると
メッセージが表示されるというページを作成しましたのでこれを使って進めていきます。

このページに対してGebのコードは以下になります。

では、実際に動かしてみましょう。

マウスで動かすように徐々に移動するのではなく一瞬で移動するので分かりづらいかもしれませんが、
無事、赤いブロックを移動させてメッセージが表示されることの確認が出来ました。

最後に

現在参画しているプロジェクトでは実際にGebを使用していますが、このNavigator APIは非常に便利で使いやすいと感じています。
私は、Gebが初めて触れたWebテスト自動化フレームワークだったので他のフレームワークと詳しく比較することはできませんが、
個人的に少しWebDriverを使ってみた時には圧倒的にGebのほうが使いやすいと感じました。
WebDriverはちょっとしたことを書くためでもGebよりもコードが長くなってしまい見づらくなるのではないかと思っています。
今回使ってみたドラッグ&ドロップでもWebDriverでの実装よりGebならばコード量は明らかに減るということが分かりました。
実際にドラッグ&ドロップを使ったテストを書く機会があるのかはプロダクト次第かもしれませんが。。。

今後もGebを学んでいって、Gebに関する記事を書いていこうと思っていますのでまた読んでいただけたら嬉しいです。

Atlassian ページの再開

Atlassian ページの再開

KEY チームのアライです。
HP リニューアル後、atlassian ページが無くなっていましたが、いよいよ再開させます。
もう少々お待ちください!

ブログやページ内で各製品の事例などもお届けしていきます。
過去の Atlassian 関連ブログはコチラ↓

ApacheでProxyを実現

ApacheでProxyを実現

みなさん、こんちには。KEYチームの矢納です。

頑張って技術ネタを連続で投稿していこうと思っています。
過去記事の目次はこちらに移動しました。

今回はApacheでProxyを行う方法です。よくこの関連記事は見るのですが、毎回忘れてしまうのでここに残します。

Apacheをインストールしよう

今回はCentOS7にインストールします。

    # yum -y install httpd

自動起動の設定を追加し、Apacheの起動です。

    # systemctl enable httpd.service
    # systemctl list-unit-files | grep httpd
    httpd.service                               enabled
    # systemctl start httpd

Proxyを有効にする

httpd.confでProxyのmoduleを有効にする。 httpd.confは今回/etc/httpd/confにありました。

    #LoadModule proxy_module modules/mod_proxy.so
    #LoadModule proxy_ajp_module modules/mod_proxy_ajp.so
    この2行のコメントアウトを外す

とおもっていたのですが、56行目が

    Include conf.modules.d/*.conf

となっています。 なので/etc/httpd/conf.modules.d/のディレクトリの中を覗いてみました。

    -rw-r--r-- 1 root root 3739 Mar 12 14:57 00-base.conf
    -rw-r--r-- 1 root root  139 Mar 12 14:57 00-dav.conf
    -rw-r--r-- 1 root root   41 Mar 12 14:57 00-lua.conf
    -rw-r--r-- 1 root root  742 Mar 12 14:57 00-mpm.conf
    -rw-r--r-- 1 root root  894 Mar 12 14:57 00-proxy.conf
    -rw-r--r-- 1 root root   88 Mar 12 14:57 00-systemd.conf
    -rw-r--r-- 1 root root  451 Mar 12 14:57 01-cgi.conf

たくさんありました(^^; 上記の二つのモジュールを有効にする必要が有るので検索です。

    # grep -e mod_proxy.so -e mod_proxy_ajp.so *
    00-proxy.conf:LoadModule proxy_module modules/mod_proxy.so
    00-proxy.conf:LoadModule proxy_ajp_module modules/mod_proxy_ajp.so

あれ?最初から有効になっていますね。

Proxy設定を追加する

Proxyの設定をhttpd.confに追加しましょう。

    ProxyPass /static !
    ProxyPass /api http://localhost:8080/twm
    ProxyPassReverse /api http://localhost:8080/twm

この設定は

  • /static/* のアクセスは何もしない
  • /api/* のアクセスは http://localhost:8080/api/* に転送する

おわりに

CORS(Cross-Origin Resource Sharing)を避けるためによくProxyを使って回避するのですが、一度設定してしまえばもう見ることのない部分です。また、他の人が設定してしまえばさらに見ることはかなり減ってしまいます。

そのようなわけでよく忘れてしまうのです(^^;

Email: yanou at atware.co.jp

Atlassian Bamboo + Crowd 前編:Bambooの導入

Atlassian Bamboo + Crowd 前編:Bambooの導入

Bambooとは

Atlassian社製のCI(継続的インテグレーション)/CD(継続的デリバリー)を実現するソフトウェアであり、同様のソフトウェアにはJenkinsやCircleCI、TravisCIなどが存在します。

今回は、そんなBambooをセットアップし、ユーザー管理を以前紹介したCrowdに統合する方法をご紹介したいと思います。

これにより、システム管理者、運用者の負荷を軽減してくれるBamboo。それ自体の管理負荷を下げて、より生産的で楽しいことに注力できるようにしたいと思います。

今回は、前編として、Bambooのインストール方法をご紹介させて頂きます。

Bamboo の インストール

基本的には公式手順にのとって進めていきます。

前提条件

システム環境

  • OS : CentOS 7.0
  • Java : Oracle JDK 8u51
  • DB : 5.5.40-MariaDB

Bamboo配置先

  • インストール先 : /opt/atlassian/bamboo
  • データディレクトリ : /var/atlassian/application-data/bamboo

インストール

最新版のダウンロード

  • 公式サイトより最新版をダウンロードします。
wget https://www.atlassian.com/software/bamboo/downloads/binary/atlassian-bamboo-5.9.3.tar.gz

展開と配置

ダウンロードしたBambooのアーカイブを展開し、配置します。

tar xf atlassian-bamboo-5.9.3.tar.gz
mv atlassian-bamboo-5.9.3 /opt/atlassian/
ln -s /opt/atlassian/atlassian-bamboo-5.9.3 /opt/atlassian/bamboo

bambooの初期設定

  • Bambooデータパスの設定

マニュアルに記載のある通り /opt/atlassian/bamboo/atlassian-bamboo/WEB-INF/classes/bamboo-init.properties を以下の様に修正します。

bamboo.home=/var/atlassian/application-data/bamboo

  • Bambooメモリ設定の変更

/opt/atlassian/bamboo/bin/setenv.sh のメモリ設定を任意の値に変更します。 最大1GB程度にしておけばひとまず問題ないと思われます。

JVM_MINIMUM_MEMORY="512m"
JVM_MAXIMUM_MEMORY="1024m"

データベースの準備

次にデータ保存先であるデータベースを準備します。 今回はBambooのデータ保存先としてcrowdインストール編で用意したMySQL(MariaDB)を使用します。

  • データベースの作成
create database bamboo character set utf8 collate utf8_bin;
  • ユーザーを作成し権限を付与
GRANT ALL PRIVILEGES ON bamboo.* TO 'bamboouser'@'localhost' IDENTIFIED BY 'bamboopass';
  • DBドライバの配置

Mysqlのドライバを予めBamboo配下に配置しておきます。

/opt/atlassian/bamboo/lib

以下に ドライバのjarファイルを配置しておきます。

起動

ひとまず起動します

cd /opt/atlassian/bamboo
bin/start-bamboo.sh

初期設定

http://{bambooインストールIP}:8085/ にアクセスすると、 初期設定画面が表示されるので、画面に従って初期設定を行います。

  • ライセンスキーの入力

事前に用意してあればそのライセンスキーを入力します。 評価用であればAtlassian公式サイトよりトライアルキーが取得出来ますので、それを入力します。

  • Bambooディレクトリ設定

通常であれば変更の必要がないため、そのままContinueします。

  • データベースの選択

Bambooのデータを保存するデータベースを選択します。 今回はMySQLに保存するため、MySQLを選択しContinueします。

  • データベース接続パラメータの設定

データベースの準備で作成したデータベースへの接続パラメータを入力しContinueします。 Continueを押すと、データベースの初期設定が始まります。 しばらく時間がかかるので、根気よく待ちましょう。

  • データ移行

今回は新規インストールですので、「Createa new Bamboo home」を選択しContinueします。

  • 管理ユーザーの作成

任意のIDとパスワードで管理ユーザーを作成します。

以上で、Bambooのインストールは完了です。 次回は、以前インストールしたCrowdとBambooを連携させて、ユーザー管理をCrowdに統合したいと思います。