学生相手に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テスト自動化を行う機会は増えていくと思いますので参考になれば幸いです。

Raspberry Pi上でCouchbase Liteを動かしてみた

Raspberry Pi上でCouchbase Liteを動かしてみた

RaspberryPiでCouchbase Liteを動かしてみた

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

技術ネタ第2弾!!「Couchbase LiteをRaspberry Piで動かしてみた」です。
過去記事の目次はこちらに移動しました。

Couchbase Liteとは?

みなさん、Couchbase Liteが何かというのはご存知でしょうか?Couchbase Liteというのは米Couchbase社が提供している製品の一つです。

Couchbaseはドキュメント指向のNoSQLデータベースです。Couchbase Liteではモバイルのローカル上にあるデータベース(SQLite)をあたかもKey-Value形式のように使えるようにしたものです。ですので、モバイルとは言え、高速なレスポンスが実現されています。

また、Couchbase Sync Gatewayと接続することにより、Couchabse Serverとの自動データ同期を可能とします。同期するデータも指定することができますので、モバイルのデータベース領域を食いつくす心配もありません。さらに、同期さえ済んでいれば、電波の通じないところでもネットワーク通信を行わないので、ネットにつながらなくてデータが取得できなくてイライラすることがなくなります。

どうやって Couchbase Lite を使うの?

Couchbase Liteで調べると、AndroidやiPhoneでの使い方は色々と紹介されています。AndroidやiPhoneで利用するには当然ですがある程度コーディングをする必要があります。ですが、Couchbase LiteにもREST APIが用意されているので、そちらを使ってコーディングなしでやりたいと思います。

色々と探っていたところこちらのGithubにありました。このサイトからcouchbase-lite-local.jarを実行するだけです。

ですが、2015/04/24時点、Sync Gatewayに対しての同期が正常に動作していませんでした。FacebookのJapan Couchabse Users Groupに質問したりして何とか解決することができました。

Couchbase Liteの起動

というわけで、実行するjarを作成しなおしてそのjarを実行するだけでCouchbase Liteの起動です。jarは私のGithubにおいてあります。そのうち、公式のほうが修正されると思いますので、そちらを待ちましょう。

    wget用
    $ wget https://github.com/Burning-Chai/couchbase-lite-sample/raw/master/couchbase-lite-local-new.jar

ドキュメントの保存など

起動が完了したら、データベースの作成、ドキュメントの保存、Sync Gatewayとの同期を行う必要があります。こちらの手順については私のGithubのREAD MEに書いてありますのでそちらをお読みください。

Sync Gatewayの用意

Couchbase Serverがどこかで起動しているのなら、Couchbase Liteとデータを同期したいものです。データの同期を行うのにはSync Gatewayを準備する必要があります。同期の仕方はREAD MEの最後に書いてあります。

Sync Gatewayインストール手順

Sync GatewayのインストールはLinuxに対して行いました。

1. こちらのサイトからダウンロード。

    $ wget http://packages.couchbase.com/builds/mobile/sync_gateway/1.0.4/1.0.4-34/couchbase-sync-gateway-enterprise_1.0.4-34_x86_64.rpm

2. Sync Gatewayのインストール

    $ sudo rpm -ihv couchbase-sync-gateway-enterprise_1.0.4-34_x86_64.rpm

3. コンフィグを指定しながらSync Gateway起動

    $ cd /opt/couchbase-sync-gateway/bin/
    $ vi sg-config.json
    {
      "log": ["REST", "REST+", "HTTP", "HTTP+", "Access", "Cache", "Shadow", "Shadow+", "CRUD", "CRUD+", "Changes", "Changes+", "JSON", "JSON+"],
      "verbose": true,
      "databases": {
        "blog": {
          "server": "http://localhost:8091",
          "users": {
            "GUEST": {
              "disabled": false, "all_channels": ["*"], "admin_channels": ["*"]
            }
          },
          "bucket": "sync_gateway",
          "sync": `function(doc) {channel(doc.channels);}`
        }
      },
      "facebook": {
        "register": true
      }
    }
    $ ./sync_gateway -verbose=true sg-config.json >> sg.log 2>&1 &

このコンフィグはSync Gatewayにblogというデータベースを用意し、sync_gatewayというCouchbaseのバケットと同期を行います。serverはCouchbaseのIPを指定します。userssyncで同期する関する設定をおこいます。databasesには複数のデータベースを書くことができます。

Sync Gatewayはログを出力しないので、リダイレクトを行ってログをファイルに書き込みます。

おわりに

今回一切コードを書かずにCouchbase Liteを使ってみました。Raspberry Piも最近ではお手軽に入手可能なので、これらを使うことによってIoTプロジェクトが作りやすくなるかもしれません。ぜひ、みなさんも試してみてください。

また、Raspberry PiやCouchbase、Couchbase Liteを使って「こんなことがしたい」という方はご連絡ください。一緒にやっていきましょう。ご連絡お待ちしております。

Email: yanou at atware.co.jp

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の導入もご検討ください。

Report: GEEKSCHOOL ハッカソン

Report: GEEKSCHOOL ハッカソン

8月8日,9日とアットウェアにてGEEKSCHOOL夏のハッカソンが実施されました。 GEEKSCHOOLに参加している学生さんと、株式会社永和システムマネジメント、ウルシステムズ株式会社、株式会社アットウェアのサポーターがチームを組み、合計4チーム、サポーターを含めると約20名でハッカソンが行われました。

その様子を写真と動画で綴っていきたいと思います。 2日間ぶっ通しのハッカソンでは、アットウェアの社長の牧野の手作り料理を振る舞われ、それに舌鼓を打つ参加者。夜には参加者全員で近くの銭湯に行くなど、ハッカソンだからこそできる貴重な体験もできました。2日目の夕方からの発表では各チームから15分の発表が行われ、各社の代表者からの総括でハッカソンは終了。初めてハッカソンに参加する方が多い中で、これほど充実したハッカソンが出来たのは、皆さんの熱意が導いたことだと思います。 これからもハッカソン、GEEKSCHOOLを運営していくモチベーションが高くなりました。

夏のインターンシップが活況

夏のインターンシップが活況

今年もアットウェアでは国内・国外からたくさんのインターンシップ学生の受け入れをしています。

まず、海外からのインターンシップとして3名のベトナム ホーチミン工科大学から7月〜8月末までのの2ヶ月間のインターンシップを実施しています。

Shiroがリーンスタートアップにて開発しているMVP「Booksharing」

Shiroがリーンスタートアップにて開発しているMVP「Booksharing」

左から、Jack, Shiro, Kenji(いずれも日本人にわかりやすいようなニックネームをつけています) 7月頭からインターンシップを実施しているため、既に1ヶ月が経過し残り3週間となってきています。彼らのインターンシップの成果が大体形になってきており、残りの期間でスパートをかけて目標以上のものを作っていってもらいたいものです。

具体的には、ベトナムの1人の学生は、リーンスタートアップにてアイデアの具現化を実施しています。本の貸し借りをテーマに、社内の人や友人などを介してインタービューを行い、問題の確認とソリューションの提案などを行ってきました。社内リリースは既に終わっており、フィードバックを得ながら近々の外向けにリリースに向けて改善中です。

今年でベトナムからのインターンシップも3年目を迎え、すっかり恒例行事のようになってきました。ベトナムとの文化も慣れてきて、海外の人がオフィスで作業するということにもアットウェアとして日常になってきました。ベトナムの学生さん達は本当に仲が良く、いつもにこにこしているので、社内にとって良いムードメーカーにもなっています。8月末で帰ってしまい、少しさみしくなりますね。

さて、また国内からの学生さんのインターンシップも8月10日より開始しています。今年は3週間のスケジュールで実施しており、リーン、アジャイル開発、英語でScalaの3種類の中からテーマを選んで実施しています。

まだ始まったばかりですが、8月末には彼らの一皮むけた成長が見れることを期待しています。

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 ページのコチラからご応募下さい。
沢山のご応募お待ちしております!!

リーダー(後半)

リーダー(後半)

こんにちは、KEYチームの荒木です。本日は先週からの続きで1年やってきたリーダーの経験について書きました。前半はこちらです。あわせて読んでいただけると嬉しいです。

チームメンバーとよく対話する

やはりチームの主役はメンバーです。メンバー自身の想いが発揮できてこそチームと呼べると思います。チームメンバーのそれぞれの想いを100%とはいえないですが、自発的に行いたいと思うことはやれるようにしました。そして、その思いを受け止めるために、メンバーとよく会話し少しでも現状を知ることに努めました。

ちいさな力

どんなことに興味があるのか、どんな勉強をしているのか、将来どんなことをしたいのか?定期的に1対1で面談し、お願いや問題を聞き、リーダーからの期待を伝えます。そうすることで小さい力ですがサポートすることができます。

決断はむずかしい

リーダーはタイプによって異なりますが、チーム方針の決断をします。その場面場面でいいと思う決断を下すのは本当に難しいし、なにより辛いです。

だれでも結論を出せること、結論が決まっていることはリーダーが決断する必要はないと思いますが、 リーダーが決断しなくてはいけないことと感じたことは「やらなくてもいいことをやる」と「チームに影響を与える」ことだと思います。

やらなくてもいいこと

将来を見据えて大事に感じていることをやることです。直ぐにやる必要性がないことをやることです。例えば、英語とか!

チームに影響を与えること

正しく機能するチームは各メンバーが役割を認識し、そして、メンバー特性のバランスがとれていることだと思います。その機能するチームが出来たとして、チームに影響を与える(メンバーがいなくなったりする)決断をしなければいけないことが何より悩みます。 メンバーの主体的な想いから決定したとはいえ、口では「ノープロブレム」と言いつつ気持ちは「なんでだよ」と思ってしまいます。ん〜っ、辛い。

会議は多いが本当に重要なものだけ出る

リーダーになれば出席する会議が増えます。チームだけのことだけではなく会社全体として気配りをしなければいけません。プロジェクトとの調整がうまく行っていないと何一つリーダーとして役割を果たせなくなります。全ての会議に出ていてはプロジェクトへの対応がほとんどできなくなります。

工夫する

しかし、出席しなければチーム運営にも支障がでます。なので本当に必要と思える会議を選択してそれのみ出席するようにして、それ以外のものは代役を立てられるようにする工夫が必要です。

同じ方向に向かってもらうには本気を示せるかにかかってくるかも

具体的なことをかけないことはご理解していただきたいと思います。 メンバーはリーダーの決定を、なかなか受け入れてくれません。人は変化に弱いみたいです。ある決定から起こりえる将来が100%明るいと感じられない場合だと受け入れてくれません。それは人としてあたりまえだと思うようになりました。ではある決定の方向にメンバーの気持ちを向かわせるのはどうしたらいいのでしょうか? いまだにわかりません。ただ、何事にも本気でぶつかり少しでも決定が示す未来がいいものだと伝え続けることが大事ではないかと感じています。

結果はチーム全体で出す

結果を出すことがリーダーの役割ですが、一人で結果を出すことはできません。結果はチームメンバー全員で出すものです。プロジェクトが多忙だと自分自信の勉強だったりに時間を使えなくなります。バランスが大事になってきます。そのためにチームとして結果が出せるように多忙にならないようにします。時には稼働が高くなることもありますが、基本的には能力以上の稼働にならないようにします。

バランス

プロジェクト以外にもいろんな仕事が降ってきます。「それが行える時間があるのか」「メンバーが力を出せる状態なのか」を判断するために一人ひとりの稼働を見ておく必要があります。

コーディングしたい気持ちは捨てない

リーダーになってからは仕事でのコーディング量は減りました。こんな会議にでるよるよりコーディングしたいという気持ちは最初はありましたが、いまは「出来る時間でいかに成果を出すか」ということに集中するようになりました。

常に技術を取り込む気持ちを持ち続け、休日や通勤時間を使って本やネットから情報をいれ、プライベートでコーディングを行い、いつまでも開発者で在り続けないと、メンバーとの会話ができなくなったりし、リーダーとしては結果は出ないのではないかと思います。

最後に

リーダーへのプレッシャーはとても大きく、難しい決断の連続です。 ですが、やりたいことを成し遂げるために、人間関係が大事だと思っているメンバーと協力関係を作り上げ結果を出すことにやりがいを感じています。

なぜリードするのか

この1年わからないことだらけでした。 「問題解決のため、わざわざ面倒なことをするのか」 「より良いと思う方向に前進しようとしているのに、厳しい批判に耐えなくてはいけないのか」 「主催した勉強会の空席の多い時に何を求めればいいのか」 リーダーをやめるたくなることはたくさん出てきます。

ですが、やめませんでした。 答えはとてもシンプル。

周りの人に認められたい。 お金を得ることよりも、日々の小さな喜びを共有する日常・絆を得たいからです。

私は私ができることで他の人と繋がりたい。

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に統合したいと思います。