北海道から横浜に移住して良かったこと・困ったこと

北海道から横浜に移住して良かったこと・困ったこと

みなさんこんにちは。北海道出身のエンジニア 不破です。

今回は、「地方に住んでいるけど、関東でお仕事してみたい!」という人向けに書いています。

2年前まで北海道にいました。

私は生まれも育ちも北海道(ほとんどを函館で生活し、札幌で就職)です。ちょうど2年前までは北海道札幌市で仕事をしていました。(ちなみに今と同じくWebアプリケーション(+インフラ構築担当)エンジニアでした)

そこから数ヶ月後、「内地でも仕事してみたい!」という思いから横浜に移住してアットウェアに入社しました。

※「内地」(ないち)とは、関東のことを指しています。北海道の人はこの言葉を使うことが多いようです。私も使っています。

今回のAdvent Calendarは、内地に引っ越してきて困った事などなどを書いてみようと思います。

よかった事

まず良かったことから書いていきます。

勉強会・イベントがとにかく多い

札幌でもIT系の勉強会は結構開催されているのですが、東京での開催数には遠く及びません。 connpassで見ても東京開催のイベントが圧倒的に多いです。 実際、横浜に引っ越してきてから勉強会への参加数が増えた気がします。

Amazonの荷物がその日に届く

横浜に引っ越してきて驚きました。「注文したその日に荷物が来るなんて!」と・・・

北海道の場合、「お急ぎ便」で注文しても届くまで中1日ぐらいかかります。「当日お届け便」は完全にエリア外ですし、最近始まったAmazon Prime Nowもありません。

なので「翌日に届く」というのはカルチャーショックでした。というか、1時間で届くってのもなかなかすごいですね・・・

ちなみに、北海道(地域にもよりますが)では雑誌など出版物も発売日から数日遅れて書店やコンビニに並びます。更に冬になると悪天候などで更に遅れます。

その他、

  • 日帰りでコミケに行ける
  • 気軽に秋葉原まで電子部品を買いに行ける

などなど色々あります。

困ったこと

家賃が高い

とにかく家賃が高いです。札幌では1Kのアパートに住んでいたのですが、その時の家賃は3万円でした。しかも地下鉄駅(南北線麻生駅)から徒歩10分以内で大通やすすきのへ行きやすい立地でした。

そして横浜へ引っ越してきたのですが、家賃が2倍の6万円になりました! さらにワンルームになったので部屋の広さも半分になりました!

引っ越した直後は敷金の支払いもあったので、一時期家計が大変なことになりました。

住民税が高い

札幌市に納めていた住民税と比較すると、横浜市の住民税が2倍ぐらいになりました。(年収が上がったというのもありますが・・・)

その他物価が高い

北海道にはセイコーマートというコンビニチェーンがあるのですが、ここだとやきそば等お惣菜1パックを80円ぐらいという驚きの価格で買えます。勿論横浜にはそんなのありません。

また、札幌で仕事中にお昼を食べに行くと大体500円ぐらいで定食が食べられるのですが、横浜になると1000円を余裕で超えます。 外食ばかりだと家計が圧迫されるので、自炊する回数が増えた気がします。

ちなみに札幌では1000円出すと寿司が食えます。

お寿司

500円出せば、これぐらいの大きさの親子丼が出てきます。

究極の親子丼

意外と交通機関が貧弱だった

東京・横浜にはJR/東急東横線/みなとみらい線/市営地下鉄などなど交通機関があり、充実しているように見えます。 ただ、どこかで人身事故が起こると玉突き式に他の路線が遅れ出すなど、意外と貧弱だと感じました。

また北海道ではありえない事なのですが、東京で雪が降ると各線で運休まで出るというのには驚きました。

ちなみに北海道におけるJRの遅延・運休理由で多いのは

  • 大雪(それに関連するドア故障など)
  • 大雨
  • 鹿など動物をはねてしまう

だと思います。その他、車両火災も多い気がします。

・・・いかがでしょうか!まだまだ書きたいことは沢山あるのですが、これぐらいにしておきます。

まとめると、

  • 東京は勉強会がとにかく多くて楽しい
  • Amazon生活が捗る
  • ただし物価も家賃も高くなる。
  • たまには北海道に帰りたい!おいしいお寿司食べたい!

となります。要するに、土地それぞれにメリット・デメリットがあるということです。 自分の生活スタイルや自分自身のこだわりとあわせて考えてみるのはどうでしょうか。

それでは!

マフラー

マフラー

この記事は atWare Advent Calendar 2015 の8日目の記事です。

「仕事仲間にはすごく恵まれている」

仕事を初めて一番かな。

いままでに、いろんな仕事のやり方をいろんな人々から教えられた。

そして今年、意見を通してくれる機会が多く与えられた。

感謝。

この感謝を言葉で伝えるのは簡単だか、それは俺の流儀ではない。

「仕事でベストを尽くす」

それぞれ違う仕事を行い、関係性がそれぞれ違う。

仕事でどれだけ全力を出せたかを、客観的に見てもらうしかない。

今年は、今の自分のベストを伝えられたんじゃないかと思っています。

自分が関わる仕事を、今まで以上に仲間たちに楽しんで取り組んでもらう。

そのために、一層、”認められる人”を目指します。

というわけで、まじめにタイトルとはまったく関係なくなってしまいましたが、荒木でした。

次はなんとあのエンジニアの登場です。お楽しみに!!

第12期に向けて

第12期に向けて

このエントリは atWare Advent Calendar 2015 の第7日目です。

前回に続き、今日は第12期に向けての取り組みとして、事業方針の一部を紹介します。 当社のミッションは「システムで人々をしあわせにする」。今期もこのミッションを達成すべく、ここ数年の事業方針を踏襲した事業の推進と企業としての成長を図っていきます。

当社はこれまでSI/受託システム開発を請け負うことを主な生業とし、顧客である企業を通じて社会の人々に対してしあわせを届けて参りました。特に昨今は、システムが顧客企業の業務効率化を図る、つまりは企業のビジネスを支援するものから、システム自体がビジネスを駆動する、単なる便利なツールから企業のビジネスそのものであることが多くなってきました。システムを利用する人も一般のコンシューマーであり、利用する環境も多様化しています。当然ながら要求は多岐に渡り、また変化のスピードも速く、システムを開発あるいは保守する我々も顧客のシステム部門から言われたことをやっているだけでは、十分な満足を得ることはできません。顧客のビジネスそのものを理解し、その先にいる利用者に我々自身がしあわせを届けるんだという立場で顧客と共に働く、「恊働」をより強力に社内に浸透していきます。具体的には、従来から取り組んできたスクラムなどのアジャイル開発プロセスと保守と開発が一体となって取り組むDevOpsを融合したアットウェアメソッドを確立します。その上で社内で取り組む全てのSI/受託開発プロジェクトをこれに則って推進し、顧客企業との協働、さらにはより多くの利用者にしあわせを届けて参ります。

一方、ここ数年、取り組んできたTypesafe社とのシステム開発パートナーを中心としたReact SystemおよびNoSQLデータベースCouchbaseなどの大規模並列分散/並行データ処理技術に対しても、体制を強化すると共に社内外のナレッジも整備して、より高い価値、これまで経験したことのないしあわせを提供できるようにして参ります。具体的な取り組みも近いうちにお知らせできるものと思います。

また、当社がより多くの利用者に直接しあわせを届けるための施策も強化して参ります。こちらも近いうちにお知らせできるものと思います。

これらの事業をより強力にスピーディーに実行できるよう、社内の組織編成を大幅に改革しました。まだ試行錯誤で取り組んでいる段階ですので、いずれ整備が進み、成果が出てきたころにあらためてご紹介できればと思います。

毎年、中長期の方針とこれまでの反省を踏まえて、期首に事業計画を立てていますが、ここ数年それが十分には達成できないでおり、、経営者としての責任を痛感しています。 この一年は、これまで以上の覚悟を持って取り組んでいきます。社員の皆やパートナーさん、さらにはお客様と共に、より多くの人に、より価値の高いしあわせを届けていけるよう、精一杯努力していきます。

下呂温泉旅行

下呂温泉旅行

この記事は atWare Advent Calendar 2015 の6日目の記事です。

みなさん、こんにちは。矢納です。Advent Calendar 2回目の登場です。

今回は社員同士の交流について、紹介していきたいと思います。
今回、ランチや飲み会等のありきたりな紹介ではなく、11/28, 29に下呂温泉までのぷち旅行の様子を紹介したいと思います。

なぜ下呂温泉??

目的無しで旅行に行くのは個人的にはないと思ってます。今回の目的は「紅葉を見に行こう」です。会社に外国籍の方がいて、彼らが「紅葉見に行きましょう!」と行ってきたのが始まりです。それから社員に声をかけて、人集め、行く場所を決めるのですが、これが大変!
参加者の1人が「温泉は必須だよね!?」と言うのです。さらに温泉はそれなりの質を求めてきます。紅葉温泉が堪能できるところ。色々探しましたが良いところが見つからず困ってました。
ある時、ふと「下呂温泉」がひらめきました。流石に紅葉の時期じゃないだろうと思いましたが、紅葉の時期でした。半分冗談で言ったらそこに決定しました。
これで下呂温泉に行くことが決定しました。

計画

行く場所が決定したら、今度は行動計画を立てます。こういうのを作るのはとても楽しいので夢中になって作ってしまいますね。スライドで計画を作り、概算の予算を算出し、他のメンバーの同意を得ていく。面白いですね!!
ですが、計画を立ててる時に「計画通りに進む旅行なんてないけどなぁ」と思ってました(^^;

出発

計画も立てたし、宿も予約したし、これでOKですね。では出発しましょう!

今回は車での移動です。横浜から下呂温泉まで約370kmらしいです。推定5時間。レンタカーを借りて、朝8時に横浜を出発です。まずは東京メンバーを迎えに八王子まで下道で行き、その後高速になりました。休憩に使ったSAは談合坂双葉諏訪、神坂(PA)でした。

談合坂SAはEXPASAになっています。EXPASEとは“なんぞや”と思う方はとても大きなSAと思って下さい。ここで朝食?昼食?を食べました(英語だとbrunchです)。

双葉SAは富士山をきれいに見れるSAとして有名なところです。写真では伝えれませんが、なかなかにきれいに富士山を見ることができます。

諏訪SAには知っている人は知っている、温泉があります。私は知りませんでしたけどね(^^; ここは温泉もそうですが、諏訪湖が一望できるのでかなりいところですね。

もう一度休憩をはさみ、その後下呂に直行です。下呂についたころには17時になってました。

下呂温泉

17時についたので外は少し暗くなっていました。車を駐車場に止め、観光です。

最初は下呂温泉神社に行きました。神社と言っていますが、そんなすごいものではありませんでした(笑)。ちょっとした祠があるだけでした。

次に行ったのは、さるぼぼ神社です。ここはそれなりに有名らしくたくさん人がいましたが、神社にしてはかなり小さめかと思いますね。さるぼぼは写真に写っているものです。赤い体をしており、顔が無いですね。

その後、少し街を探索してホテルではない温泉に向かいました。巌立峡ひめしゃがの湯です。ここは炭酸温泉で有名です。この炭酸温泉は飲むこともできるし、料理にもつけます。なのでペットボトルに入れて持ち帰ることも可能です。また、化粧水の代わりにもなるとのことです。私は持ち帰っておりません。荷物になるので(笑)

夕食はこの温泉と一緒になっているレストランで食べました。私は飛騨牛の料理を食べました。写真は後ほど。

その後、ホテルに戻り、温泉に入って就寝です。一緒に行った人たちは疲れて寝てしまいました。せっかくトランプとUNOを持っていったのに......

二日目は合掌村に行きました。ここには少しばかりの紅葉がありました。そうです!ここでやっと紅葉が出てきました。ですが、少しだったのでこれは紅葉旅行ではなく温泉旅行だなと思いましたね。ここは古い民家、足湯等があってとても面白かったです。足湯は下呂にはたくさんあるのですがね(^^;

お昼はまたもや飛騨牛料理です。ひつまぶしのうなぎを飛騨牛にしたものです。とても美味しいので皆さん食べに行ってみてください。お店はせん田です。

おわりに

色々と楽しんだ後は帰るだけです。帰りのほうがやはり体力的にも精神的にはキツイですね。渋滞に2回。小仏トンネルと海老名なのでいつもなのですが......。他にも圏央道はとても走りやすかったりしてよかった部分もあります。

最後にみんなでの集合写真です。

いかがだったでしょうか。たまにこのようなこともやって、社員同士の交流等を深めています。
さて、明日は最近何かやりたくてたまらない方の登場です。

Email: yanou at atware.co.jp

GEEKSCHOOLって?

GEEKSCHOOLって?

こんにちは。 栗山です。 アットウェアに入社し、これまで色々な業務を担当させていただいておりますが、 今期からは広報・採用と、外への働きがメインとなる業務も行うこととなりました。

そこで、atWare Advent Calendar 2015 の5日目の今日は、広報担当のわたしから、 GEEKSCHOOLの紹介です。

では、さっそくですが、GEEKSCHOOLを紹介していきます。

GEEKSCHOOLとは?

私共、株式会社アットウェアと株式会社永和システムマネジメントさん、ウルシステムズ株式会社さんと力を合わせ運営している学生を対象とした勉強会です。 この勉強会や各種イベントでは、わたしたちの知識・技術・経験から、自分の道を既に決定している学生はもちろん、進路を決めかねている学生の方々に目には見えないプレゼントを届けています。

GEEKSCHOOLの対象は?

IT業界/進路に関連することで悩んだり困ったりしている学生のみなさんを対象としています。

  • 就職したら即戦力として働けるようになりたい。その為に、どういう勉強をしたらいいかを知りたい
  • 実際の現場ではどんな技術が使われているのか知りたい
  • 授業にはない技術を学びたい
  • IT系の授業は受けていないが、ITの技術を学びたい
  • 就職活動をする前に、IT業界がどんなところなのかを理解したい
  • ITエンジニアで働く人と仲良くなりたい
  • IT業界に興味を持っている学生の友達を作りたい
  • インターンシップに行く時間はないけど、IT業界のことを知りたい
  • SEとかPGとかって、実際は何をするのか知りたい

GEEKSCHOOLのウリ

  • 参加費が無料
  • 講師はすべて現役のエンジニア
  • オンラインで講師に質問ができる
  • 懇親会やハッカソンなどのイベントで受講生
  • 講師とコミュニケーションがとれる
  • 様々なプレゼント
  • などなど

GEEKSCHOOLの歴史

第1期

  • 2015/04/25 オープン記念イベント
  • 2015/05/01 第1期説明会&RaspberryPIミニハンズオン
  • 2015/05/08 第1期説明会&RaspberryPIミニハンズオン
  • 2015/05/14 第1期(Vol1) JavaによるWeb開発の最前線
  • 2015/05/30 第1期(Vol2) SQL 〜情報技術社会に一番無くてはならない大事な技術〜
  • 2015/06/11 第1期(Vol3) TDD & Pull Request ~動作するきれいなコードを目指そう~
  • 2015/06/27 第1期(Vol4) Javascript, React.jsを使ったWebページ開発のハンズオン
  • 2015/07/08 第1期(Vol5) アジャイル開発 ~チーム運営プロセスをゲームで学ぶ~
  • 2015/07/17 第1期(Vol6) システム開発の要。要件定義そのテクニック
  • 2015/08/08 サマーハッカソン
  • 2015/09/12 IchigoJamを組み立ててBASICを触れてみよう!

第2期

2016/1、2月開校予定

これから社会にでる方々の「これから」に少しでもお力になれるよう、講義内容を日々検討しています。 リクエストがある方は、ぜひ、ご連絡ください。

GEEKSCHOOLスタッフ一同、学生のみなさんにお会いできることを楽しみにしています。

では、明日の6日目は、凛々しい顔が板についてきた、若手の彼が再登場します!!

社員合宿2015

社員合宿2015

4日目ですね。リーダーを卒業し、雨の中でも毎朝走っているアラフォーの荒木です。

風邪気味で体調も悪い最近ですが(そりゃそうだ)、

さて、今年の9月に全社員が集まって2日間合宿を実施いたしました。

全社員が集まって話し合うのは何年ぶりでしょうか?

準備

準備は2ヶ月前から!!

目的、内容、会場プラン、ご飯の準備、インビテーションカード作成、会場設営などなど、

みんなで仲良く準備を行いました。

ご飯の用意楽しかったですね。

今回はワールドカフェで行いました。

ワールドカフェは、カフェのようなリラックスした雰囲気で対話を行う手法ですね。

まずは、やり方の説明。相手の話をよく聞き、相手の意見を否定せず、意見を受け入れ、深い洞察を行い、アイデアを掛けあわせ、楽しく会話を行うこと!

模造紙に気になったことを書き込んでね。絵でもいいよ!!

んっと、普段行わない感じなので、違和感ありますね。

今回は1ラウンド30分を5ラウンドを予定。途中でカフェタイムをいれて、楽しくすすめるように企画しました。

1ラウンド目スタート

ぎこちない感じで1ラウンド目!!

2ラウンド目スタート

こんな感じ?とおもいつつ、2ラウンド目!!

カフェタイム

美味しいミスド

3ラウンド目スタート

随分なれてきた3ラウンド目!!

和菓子タイム

美味しい団子

4ラウンド目スタート

なかなか終わらなかった4ラウンド!!

アイスを食べて、瞑想

うまいーーーー

5ラウンド目スタート

最後は落ち着いて。最終ラウンド!!

最後に

いろんなかたが、いろんな思いで来たとは思いますが、 主体的に望んでくれたことが一番よかったですね。

というわけで、

次はキュートなあの方です。お楽しみに!!

君はどのエディタ・IDEを使っている?

君はどのエディタ・IDEを使っている?

この記事は atWare Advent Calendar 2015 の3日目の記事です。

みなさん、こんにちは。矢納です。
昨日のブログから

明日はYanouさんによる「IntelliJについて」です。というのを期待したいと思います!えっ!?

と来ましたので、今回は開発するには欠かせないエディタ・IDEについて少しおしゃべりしたいと思います。

Integrated Development Environment

さて、みなさんはどのIDEをよく使っていますでしょうか?

  • Eclipse
  • Visual Studio
  • IntelliJ
  • NetBeans
  • Android Studio

などなど。たくさんありますね。Wikipediaにもたくさん書いてありますね。

以前、私はEclipseをよく使っていましたが、あるプロジェクトを境にIntelliJを使い始め、今や開発は全てそれを使って行うほどです。

最初はキーマップやプロジェクトの開き方、細かな設定等のやり方がわからず苦戦しました。その様子を見ている周りからも「IntelliJって何が嬉しいの?」などとよく言われました。と、いうことで個人的な意見を言わせてもらいます。

プラグイン導入が簡単

intellij-plugin.png

プラグインが対応しているファイルを開くと自動的に上図のようなレコメンドをしてきます。あとはInstall pluginsを押して、再起動でインストール完了です。
最初からプラグインを検索せずともファイルを開くだけでプラグインがインストールできます。

初期プラグインが色々と

IntelliJをインストールした時点で様々なプラグインがインストールされています。Eclipseだとm2eやandroid等は自分でインストールする必要がありますが、IntelliJの場合だとそれらがある程度最初に準備が整っています。これは楽ちんですね。

その他細かいところ

IntelliJからターミナルを開くことができ、その場でコマンドを実行できます。これで別にターミナル用にウィンドウを開く必要がありません。

他にも「いいな」と思うことはありますが、基本的には他のIDEでもできますので、省略です。

ちょっと?残念なところ

IntelliJにはcomminity版とultimate版が存在しています。

「大した差なんてないでしょε-( ̄ヘ ̄)┌」と思ったあなた!!

残念!それなりにあります笑。

  • 使えるプラグインの数がかなり減ります。
  • 補完機能がなくなる言語も出てきます。

これら2つだけでかなり開発がやりにくくなります。ultimateはそれなりのお値段ですので色々と悩んでから買って下さい。あっ、個人的にはIntelliJ押しです。

エディタ

エディタは正直なんでもいいと思いますね。私は開発は全てIntelliJなのでエディタは単なるメモにしか使っていないので、特に書くことは無いですね。

さいごに

エディタ・IDEの話をしようと思いましたが、結局IntelliJの話をしてしまいました。皆さん、使い慣れた開発のし易いIDE・エディタを使って下さい。他に乗り換えるときは3ヶ月ぐらいかかると思っていれば、どのIDEでも使いこなせますよ!!

明日はどんなときにでも頼りになる男の出番です。

Email: yanou at atware.co.jp

Vimで学ぶ「適切な速度」で処理をするということについて

Vimで学ぶ「適切な速度」で処理をするということについて

Vimで学ぶ「適切な速度」で処理をするということについて

この記事は atWare Advent Calendar 2015 の2日目の記事です。

昨年はボードゲームでリアルなコミュニケーションというタイトルでモノポリーについて記事を書きましたが、今年はモノポリーかVimのどちらの記事を書くか苦渋の末に迷ってVimをお題にしたので、イメージだけはモノポリーにしてみました。

今日書くエントリーは適切な速度で処理をするということをVimをとおして学んでみたいと思います。

Vimとは

一般的にVi互換で機能拡張が入ったエディタという事でプログラマやサーバー管理者などに普及しています。 弊社内の統計値によると72%の社員が今年になってこのエディタを使った事があるそうです。

このエディタの特徴として起動が速い事で一般的に知られています。もう少し突っ込んだ話しをするとVimというよりViが軽くてどこのサーバーにでもインストールされているということでしょうか。

さらにいうと、一般的なLinuxOSですとviコマンドがVimコマンドのvi compatibleモードのエイリアスとなっている事はわりと弊社社内をはじめVimを使った事ある人には知れ渡ってきていることですね。

さて、viコマンドの起動はなぜ速いのでしょうか?理由は結構わかりやすく、C言語で書かれてていることに加え、数十年速度や機能改善をされ続けた成熟したプログラムというのに加え、もう一つ大きな理由として余分な機能を読みこまず、起動しているという事です。

Vimの魅力としてカスタマイズできることにあります。VimはVim scriptというVim専用のスクリプト言語で機能拡張を行う事ができるのですが、デフォルトのVimではいくつかのデフォルトプラグインを読み込み起動しています。

ディストリビューションやカスタマイズビルド(例えばMacVimやKaoriyaパッチVimなど)版のVimによって違いはありますが、例えば

$ ls /usr/share/vim/vim73/plugin/
README.txt           netrwPlugin.vim      tohtml.vim
getscriptPlugin.vim  rrhelper.vim         vimballPlugin.vim
gzip.vim             spellfile.vim        zipPlugin.vim
matchparen.vim       tarPlugin.vim

私の環境のVimにはこんなプラグインがインストールされていました。 gzip.vimはvimでzipファイルを開いた時に展開せずにVimでアーカイブ内のファイルを閲覧・編集できるというプラグインです。viコマンドではこのcompatibleモードで起動するのでこのプラグインは読み込まれませんが、vimコマンドで起動すれば読み込まれてから起動します。

こういうデフォルトプラグイン数個なら体感的に差はありませんが、便利なプラグインがGitHubやvim.orgで公開されており、自分のスタイルに合った便利な機能を追加しようとプラグインをどんどん増やしていくと体感できるほどに遅くなる事があります。これは、Vimに限った事ではなく他のエディタでもよくあることですね。

ただ遅いだけではない

いよいよ本題に入っていきます。みなさんパフォーマンスチューニングの時に測定していますか? 今の時代なら感覚に頼らずメトリクスや速度測定をして数値に基づいてチューニングしていくのが一般的ですよね。

一般的な手法を用いて遅さを実感してみたいと思います。

VimはC言語で書かれてコンパイルされて実行されていますが、機能拡張は基本的にはVim sciprtという言語で動的に実されます。

まずは、Vimをプラグイン読み込みせず、compatibleモードかつvimの設定ファイルも読み込まずに起動速度を測定できるオプションもつけて起動してみましょう。

$vim -u NONE --noplugin --startuptime vim-startup.log

そうするとこんな結果になりました。

$cat vim-startup.log


times in msec
 clock   self+sourced   self:  sourced script
 clock   elapsed:              other lines

000.010  000.010: --- VIM STARTING ---
000.093  000.083: Allocated generic buffers
000.106  000.013: GUI prepared
000.494  000.388: locale set
000.500  000.006: clipboard setup
000.507  000.007: window checked
001.124  000.617: inits 1
001.137  000.013: parsing arguments
001.523  000.386: expanding arguments
005.239  003.716: shell init
005.492  000.253: Termcap init
005.535  000.043: inits 2
007.877  002.342: init highlight
007.880  000.003: sourcing vimrc file(s)
007.890  000.010: inits 3
007.910  000.020: setting raw mode
007.928  000.018: start termcap
007.950  000.022: clearing screen
008.044  000.094: opening buffers
008.047  000.003: BufEnter autocommands
008.051  000.004: editing files in windows
008.073  000.022: VimEnter autocommands
008.080  000.007: before starting main loop
008.681  000.601: first screen update
008.684  000.003: --- VIM STARTED ---

8msで起動できました。

VimScriptを読み込んで起動

こんな簡単な再帰呼び出しを行うシンプルなVim scriptを書きました。

$cat recursive.vim

"set maxfuncdepth=100
function! s:Recursive(count)
    "echo a:count
    if a:count > 1
        call s:Recursive(a:count - 1)
    endif
endfunction

call s:Recursive(1)

先ほどと同じ容量でVim scriptを読み込んで起動してみます。

$vim -S recursive.vim -u NONE --noplugin --startuptime vim-startup.log

結果を表示してみましょう。

$cat vim-startup.log

times in msec
 clock   self+sourced   self:  sourced script
 clock   elapsed:              other lines

000.006  000.006: --- VIM STARTING ---
000.077  000.071: Allocated generic buffers
000.088  000.011: GUI prepared
000.416  000.328: locale set
000.421  000.005: clipboard setup
000.427  000.006: window checked
001.019  000.592: inits 1
001.034  000.015: parsing arguments
001.421  000.387: expanding arguments
005.263  003.842: shell init
005.522  000.259: Termcap init
005.567  000.045: inits 2
007.934  002.367: init highlight
007.937  000.003: sourcing vimrc file(s)
007.947  000.010: inits 3
007.968  000.021: setting raw mode
007.985  000.017: start termcap
008.007  000.022: clearing screen
008.100  000.093: opening buffers
008.103  000.003: BufEnter autocommands
008.107  000.004: editing files in windows
008.332  000.080  000.080: sourcing recursive.vim
008.345  000.158: executing command arguments
008.346  000.001: VimEnter autocommands
008.351  000.005: before starting main loop
009.246  000.895: first screen update
009.248  000.002: --- VIM STARTED ---

なっ、なんと先ほど8msだった起動速度が9msになってしまいました。 1msも起動速度が遅くなってしまったらこれは非常に困ってしまいますね。 生産性が悪くなって仕方なくなるかもしれません。少し大げさでした...

Vim scriptの関数呼び出しを増やしてみる

先ほどは関数呼び出し1回だけだったものを100回の再帰呼び出しに変えてみます。 関数内では処理はないに等しいのでほぼ関数呼び出しだけのコストになります。

結果は下記の通り。

times in msec
 clock   self+sourced   self:  sourced script
 clock   elapsed:              other lines

000.008  000.008: --- VIM STARTING ---
000.090  000.082: Allocated generic buffers
000.103  000.013: GUI prepared
000.498  000.395: locale set
000.504  000.006: clipboard setup
000.511  000.007: window checked
001.193  000.682: inits 1
001.212  000.019: parsing arguments
001.740  000.528: expanding arguments
005.770  004.030: shell init
006.042  000.272: Termcap init
006.088  000.046: inits 2
008.466  002.378: init highlight
008.469  000.003: sourcing vimrc file(s)
008.479  000.010: inits 3
008.500  000.021: setting raw mode
008.518  000.018: start termcap
008.545  000.027: clearing screen
008.642  000.097: opening buffers
008.646  000.004: BufEnter autocommands
008.650  000.004: editing files in windows
010.080  001.279  001.279: sourcing recursive.vim
010.098  000.169: executing command arguments
010.100  000.002: VimEnter autocommands
010.105  000.005: before starting main loop
010.635  000.530: first screen update
010.638  000.003: --- VIM STARTED ---

先ほどは、9msで終わったところが10ms後半になってしまいました。 着目したいところがあるのでピックアップしてみたいと思います。

008.332  000.080  000.080: sourcing recursive.vim
010.080  001.279  001.279: sourcing recursive.vim

1回の関数呼び出しの際に80µsecだったところが、15倍ほど時間がかかっていますね。 関数呼び出し1つで数十µsecは遅いと感じましたか?速いと感じましたか?

あなたの普段使っている言語。例えばJavaやPythonやRubyやGoではどれくらいのコストでしょうか? 非機能要件でシステムのレスポンス要求のオーダーはどれくらいに設定していますか?

秒単位の事もあれば、msec単位のこともあります。これがレイテンシも含め数十msecで処理したいシステムなら致命的な程遅いのです。また、チリも積もればなんとやらでプラグインの用途によってはUIが体感的に遅いと感じてしまう事もあります。

そういう時にどういうアプローチがとれるでしょうか?

アプローチ

一般的なWebアプリと同じような発想のアプローチをとることができます。

Rubyでも速度を担保したい場合にnativeにコンパイルしたモジュールを部分的に利用することがありますね。同じようにVimからもネイティブなモジュールを呼び出す事ができます。 他にもVimではPythonやLuaのインターフェースを使うということもできますので、Vim script以外の言語を利用するというアプローチもありですね。

アプリケーションを丸ごと置き換えるのではなく部分最適というものです。

「適切な速度」で処理をするということについて

とは言ったものの、富豪的にリソースを扱える時代でもシビアにならないといけない時とそうでない時の差はやはり存在します。

Vimを例に出しましたが何ごとも適材適所で、実装でひたすらがんばるというのもやり方の一つですし、部分的なネイティブで部分的に最適化もいいでしょう。また、MessagePackやZeroMQのようものを使い、プロトコルを決めてロスを最小限にし効率良く処理するという、分割して粗結合にする方法もありかもしれません。

適切な速度を言語レベルで担保しようとするのか、システム全体で担保しようとするのか、それだけでも視点は違ってきます。

大きな視点で考えた場合には影響範囲は留まる所をしれませんね!! 非機能要件で必要な速度を担保しつつ、クラウドリソースを活用したうえでアーキテクチャ次第で色んなアプローチがとれるので、そこを考えていくのは本当に面白いです。

まとめ

本記事は@kamichiduさんの発表にインスパイアを受け書きました。 興味深い面白い発表してくださりそして発表後の小話にもつきあって頂きました。この場を借りて感謝の言葉をお伝えしたいです。ありがとうございます。

自分なりに普段の業務を通じて感じていた所がVimを通してあらためて気づけたというのは非常に面白かったです。なお、このエントリーはVim Advent Calendar 2015を兼ねません。

明日はYanouさんによる「IntelliJについて」です。というのを期待したいと思います!えっ!?

第11期ふりかえり

第11期ふりかえり

今年もatWare Advent Calendarやります!

例年、初日の12月1日はアットウェアの新しい決算期を迎える特別な日でもあります。今年も無事にこの日を迎えられたことを嬉しく思っています。創業から現在に至るまで、非常にたくさんのお客様に支えられ、多くのパートナー企業の皆さんにご協力いただきました。また、社員の皆が努力を積み重ね、共に歩んできてくれました。アットウェアに関わってくださった全ての人に感謝です!

ということで、今年も先期のふりかえりから。

先々期から取り組んでいる、次代を担う若いリーダーを中心とした自律したチーム体制への移行は、道半ばながら期待した成果を挙げつつも一方では様々な課題を抱える状態です。我々はルールや仕組みを大事に守ることが重要ではなく、常に課題を解決するためのカイゼンに取り組むことが重要と考えています。これまで諸々の課題解決を進めてもいますが、根本の部分で会社としてあるべき組織像を社員皆で議論をし、この新しい期を機会に大幅な改革を行うことにしました。その内容については、まだまだ試行錯誤でチャレンジしていく段階にしかありませんので、また別の機会に(良い成果報告ができることを願っています)。

受託のSIプロジェクトとしては、先々期から取り組んでいる当社としては大きな案件が一年を通じて厳しいながらも、サービスのローンチを迎えることができ、多くの学びを得るとともに、これから我々が進むべき道を確認することができました。その他の多くのプロジェクトでも様々な経験を積み重ねました。特にお客様との恊働を軸とした、創業時から取り組んできているアジャイルとDevOpsの経験は今後の当社の力となるものと信じています。

一方、昨年から模索してきていたReactive Systemへの取り組みが7月のTypesafe System Integratorの認定を経て、いつくかのプロジェクトで成果を挙げれるようになってきました。こちらはまだまだ道半ばではありますが、当社が力を入れて取り組む事業の一つとしてより高いレベルの技術を携え、今までにない価値を生み出していきたいと考えています。

また、SIとは異なるサービスへの取り組みは、ようやく形が見えてきて社内での利用を経て、近々ローンチできる見込みです。既にいつくかの企業様に関心を持っていただいていますが、より多くの企業、エンジニアをはじめとするたくさんの方々に使ってもらえるよう、より一層スピードを上げて開発していきます。

今年もたくさんの新しい仲間を迎えました。大きな可能性を秘めた新卒新人をはじめ、経験豊富なエンジニアあるいは元研究者なども加わり、より一層、様々なことにチャレンジしていける組織に育ってきていると感じています。また、恒例のインターンでもたくさんの将来ある若者を迎えました。仕事というもの、企業というもの、IT業界というもの、そしてアットウェアというものを肌で感じて、少しでも彼らの将来の一助になればと思っています。

決してこのような良いことばかりの一年であったわけではありません。むしろ、企業としての成長としてはまだまだ思ったようにはいけてない。経営者としての力不足を大いに感じる一年でもありました。この期末には、ほぼ初めて社員全員との面談をしました。皆が何を思い、何を考え、また私自身が何を考えているか、限られた時間ではありましたが、いくらかでも共有できたことは良かったと思っています。

社員皆が「システムで人々をしあわせにする」ことをミッションとし、より多くの人にしあわせを届ける、またより高いレベルのしあわせ・価値を届ける組織となれるよう、今後もお互いに切磋琢磨し、リスペクトし、成長できる仲間でありたいと願っています。もちろん、私自身がその先頭で皆を率いていけるよう、さらなる努力をしていく覚悟です。

今期こそ大きな成長を遂げ、我々自身を含めたアットウェアに関わる全ての人、あるいは今まで関わりのなかったより多くの人がしあわせになるようにします。 皆様のより一層のご支援を賜れますよう、お願いいたします。

webpack + Angular

webpack + Angular

みなさん、こんにちは。KEYチームの矢納です。
過去記事の目次はこちらに移動しました。

今回はwebpackを使った記事を書いていこうと思います。Angularは1系です。

webpackとは何か?

さて、いきなりwebpackと言われても何もわかりません。

webpack takes modules with dependencies and generates static assets representing those modules.

公式ドキュメントによると上記のことだそうです。依存解決ツールでもあり、複数のファイルをまとめてくれるものです。

実践

とりあえず、手を動かしていきましょう。

1.初期準備

$ mkdir ~/sample
$ cd ~/sample
$ npm init
This utility will walk you through creating a package.json file.
It only covers the most common items, and tries to guess sensible defaults.

See `npm help json` for definitive documentation on these fields
and exactly what they do.

Use `npm install <pkg> --save` afterwards to install a package and
save it as a dependency in the package.json file.

Press ^C at any time to quit.
name: (sample) [何も入力せずにEnter]
version: (1.0.0) [何も入力せずにEnter]
description: [何も入力せずにEnter]
entry point: (index.js) [何も入力せずにEnter]
test command: [何も入力せずにEnter]
git repository: [何も入力せずにEnter]
keywords: [何も入力せずにEnter]
author: [何も入力せずにEnter]
license: (ISC) [何も入力せずにEnter]
About to write to /Users/yanu/sample/package.json:

{
  "name": "sample",
  "version": "1.0.0",
  "description": "",
  "main": "index.js",
  "scripts": {
    "test": "echo \"Error: no test specified\" && exit 1"
  },
  "author": "",
  "license": "ISC"
}


Is this ok? (yes) [何も入力せずにEnter]

npm init 後の質問は基本的には何も入力せずにEnterで大丈夫だと思います。

2.webpackやAngular等のインストール

$ npm install webpack webpack-dev-server stubby --global
$ npm install angular angular-route bootstrap --save-dev

stubbyはMockServerです。

3.loaderのインストール

webpackは様々なlodaerを使って依存を解決します。

$ npm install css-loader file-loader html-loader style-loader url-loader --save-dev

loaderはたくさん用意されていますので、ドキュメントを参照して下さい。

4.アプリ作成

Githubに用意しましたので、こちらを利用して下さい。

5.webpack.config.js

このファイルにentryやoutput先、loaderの設定等を書きます。

6.package.json

このファイルのscriptsオブジェクトに色々と追加します。

  "scripts": {
    "dev": "webpack-dev-server --colors --inline",
    "stub": "stubby -d server/server.yaml",
    "serve:windows": "start npm run stub && npm run dev",
    "serve:mac": "npm run stub & npm run dev",
    "build": "rm -f app/bundle.js && webpack --colors",
    "test": "echo \"Error: no test specified\" && exit 1"
  },

7.実行

$ npm run serve:mac

ブラウザで http://localhost:8000/app/ にアクセスすれば、画面が表示されると思います。Bootstrapや独自で作成したcssファイルは app.js で読み込んでいます。

8.ビルド

$ npm run build

実行後、 app 配下に bundle.js が作成されています。このファイルにhtml, javascript、css、imageはBASE64に変換されて書き込まれています。html, css に関しては webpack.config.js で minimizeを設定してありますので、圧縮されます。
作成された bundle.js と index.html をサーバに配置すれば完了です。

おわりに

webpackを使って複数あるファイルを一つにすることができました。grunt や gulp 等を代わりになるのではないでしょうか。

今回、javascript の minify ができませんでした。webpack は UglifyJsPluginというのを用意しているのですが、変数名を変えてしまうので、anguler が依存解決に失敗してしまいます。だれかご存知でしたら、ご教示ください。

Email: yanou at atware.co.jp

Scala先駆者インタビュー VOL.2  エムスリー瀬良さん

Scala先駆者インタビュー VOL.2  エムスリー瀬良さん

「オープンソースの成長の源はフィードバック! 」

インタビューイー エムスリー 瀬良

インタビューワー アットウェア 北野/浅野/ヌーラボ 吉澤

北野:こんにちは。今回はScalaのWebフレームワークであるSkinny Frameworkの創始者の瀬良さんにインタビューしたいと思います。実はアットウェアの社内ナレッジシステムにはSkinny Frameworkが使われているのですが、その話はもう少し後にして、まずは、Scalaを使い出したきっかけを教えて下さい。

瀬良:最初に触ったのは2009年頃ぐらいですかね。その時はJavaをメインで使っていて、Scalaをちょっと触ってみたのがきっかけですね。その時は、私の当時の用途ではIDE のサポートなども弱かったこともあり、まだ実用で使うものではなかった印象でした。その後、今の会社に移って 2010 年頃から少しずつScalaの勉強を同僚とやり始めたのがよく触るようになったきっかけです。最初から思うと、こんなにScalaを触るようになるとは思っていなかったですw

北野:私の周りにもJavaをやってる人が多いのですが、参考にそこからScalaに惹かれたのはどうしてですか?

瀬良:自分がやり始めた当時はSIの世界だとJavaからRubyと言われていた時で、 でもJavaとRubyは結構違うし、それだけが次の方向なのかなと。その頃少しずつ触っていたScalaはJavaをベースにしつつもRubyに負けない記述性があって、静的な型付けがありました。そういうところが惹かれたところですかね。

北野:Scalaというと関数型というコンセプトがありますが、そのあたりはどうですか?

エムスリー 瀬良氏。SkinnyFrameworkの創始者・開発者

エムスリー 瀬良氏。SkinnyFrameworkの創始者・開発者

瀬良:そうですね、私はもともとJavaをやっていたので、Better JavaとしてのScalaをやりはじめて、いまもそのスタンスでやっています。関数型バリバリでScalaを使いたいという感じではないんです。いま使っている人の中には、Haskellとか本当は使いたいと思っているけど仕事ではScalaでやっていますという人もいると思うんですが、私はちょっとそれとは違いますね。

北野:今はお仕事でもScalaを使っていると思いますが、仕事で使うとする場合、Scalaのようなチームに取って新しいものを取り入れているときなどに注意することってなんですか?もし経験などがあれば。

瀬良:Scalaバリバリ(関数型)の書き方をして、チームの人達がわからなくなるような記述をしないようにすることですかね。ちゃんと皆がわかるようにすることは大事だと私は思っています。 Scalaを使うことが目的では本当はないはずで、ちゃんと目的のものを作るということであれば、さくっと仕事が終わり、バグも前よりも格段に減るというようなうれしいことが無いと仕事でScalaを使う意味はないはずです。 そういう時にScalaらしく書くというのは第一優先ではなく。使いはじめた時に「あっ、こんな書き方もあるのか?」とかいろいろやっていると楽しくなることもあるんですが、それもほどほどにしておかないと、周りのチームの人達がついて来れなくなったり。それは注意したほうがいいですね。 だから、あまり難しく凝った書き方をしないようにしようと言っています。

吉澤:そうですねw。 瀬良さんが書いているSkinny Frameworkの中とか見ても、関数型臭がぷんぷんする感じじゃないですものね。

北野:あくまでも道具としてまずは皆で使い出して、皆で良さを共感していかないとってところなんですかね。1人だけの意向で突き進んでいくのはリスクも増えていくことか。

北野:瀬良さんは、Skinny Frameworkをオープンソースとして開発していますが、実は、アットウェアでもSkinny Frameworkを使っています。 弊社のナレッジシステムのSiitaというQiita互換のようなものを社内で開発して社内ナレッジを貯めるところとして稼働しています。 SiitaのSはScalaのSというよりは、SkinnyのSなんですw

瀬良:えぇ、そうですか。面白いことやっていますね。是非公開して欲しいです!今度アットウェアに訪問して見てみたいです。

北野:でも、どうしてSkinny Frameworkを開発しようと思ったんですか?

瀬良:そうですね。 ScalikeJDBCというものがあって、それはそれでよかったのですが、もっと一般的なORM であるようなhas-manyの関係性の定義とか簡単にできるといいなと思ってプロトタイプを作ってみたところ、思ったより使えそうな感じにできたんです。また、その頃、仕事でScalatraを使っていたことがあったんですが、少し自分で改良したいなぁと思うところがあったので、それらWeb部分とORM部分、そしてバリデーションの3つをまとめたものが形になりそうだなというところでつくることにしました。

その時はまだORMのプロトタイプしかなかったんですが、その年の10月にドワンゴさんで勉強会があって、来年春までに出します!と言っちゃうことで、 自分でモチベーションを上げていったという経緯もあります。

北野:有言実行ですか、素晴らしいですね。OSSだとフィードバックをもらって成長していくというのは大事なことだと思うのですが、Skinny Frameworkをオープンソースでやっていてフィードバックはどうでしたか?

瀬良:そうですね。GitHubのスターとか、プルリクエストとか来るのは非常に嬉しいことですね。いろいろなフィードバックがあることは本当に助かります。何も反応がないのが一番つらいというか、どこがよくないという具体的な指摘だったり、漠然とした批判的な意見でも何か言ってもらえる方が全然いいです。そんなフィードバックのおかげで、今があると思っています。 あとは身近な人が使ってくれることですね。やはり社内の人とか身近な人からバグってますよと言われるとすぐに直してリリースしたくなりますからね。

吉澤:サービスやアプリでもなんでもそうですよね? 無視されて、なんも反応ないのは本当に寂しいですもん。 みんな本気で使い出すと指摘しだす人もいたり。それって本当に使っているってこと事ですしね。

北野:今後はどのような活動をメインに?

瀬良:Skinny Frameworkのバージョンアップを考えています。今のバージョンは1.3ですが、2系のバージョンアップの活動をメインでやっています。 今のSkinny Frameworkは、他のOSSのライブラリなども使っているところがあって、そのOSSとの依存があったりします。中にはアクティブで無くなってしまったOSSなどもあるので、それを見極めながら、整理をしているところですね。

北野:瀬良さんの話はITに関わっているものとしてすごく感銘しました。もちろんSkinny Frameworkもです。今後も活動をつつけて、日本を代表するOSSコミッターを続けていってもらいたいと思います。瀬良さんとして、そのような活動をコミュニティなどを通して広げており、若い人が瀬良さんの背中を追う日も近い、そんな感じがしました。

北野:さて、次回のインタビューの人をご紹介お願いします。

瀬良:それでは、こちらもGitBucketをはじめとするOSSの活動をアクティブにされていて、受託開発・自社サービス開発の両方でScalaの実用経験をお持ちの竹添さんで!

北野:ありがとうございます。

Atlassian Stashの耐障害性を高めよう その4 分散ストレージ設定編

Atlassian Stashの耐障害性を高めよう その4 分散ストレージ設定編

今回もStashの高可用性を目指してクラスタを組んでいきたいと思います。
前回までで、サーバーとStashのプロセスの冗長化は一旦完了したので、
今回は一番重要なデータ保存領域の冗長化を目指します。

お知らせ

今までAtlassian Stash を冗長化しようと頑張ってきましたが、つい先日なんとAtlassian Stashがなくなってしまいました。
今度からは生まれ変わった? Bitbucket Server をよろしくお願いします。

・・・閑話休題・・・

それでは、Stash改めBitbucket Serverのストレージを冗長化したいと思います。

Atlassianの公式によるとストレージは GFS2 + DRBD でストレージの冗長化を行っていますが、
今回は個人的な興味で、GlusterFSを使って冗長構成をしてみたいと思います。

事前準備

VagrantにDISKを追加

Virtualbox コンソール経由で、node01,node02 にDISKを追加します。
Stashのデータに使用するので、保存するデータの容量によって大きさを考える必要があります。
今回は仮に8GBとして データ用にパーティション /dev/sdb1 を作成しました。

GlusterFSのインストール(全ノード)

パッケージのインストール

    cd /etc/yum.repos.d/
    curl -o glusterfs.repo http://download.gluster.org/pub/gluster/glusterfs/LATEST/CentOS/glusterfs-epel.repo
    yum install glusterfs-server

通信ポートの開放

まずは、通信に必要なポートを開放します。
今回は実験用途なのでどこからでも通信可能に設定してしまいます。

/usr/lib/firewalld/services/glusterfs.xml を以下の内容で作成します。

<?xml version="1.0" encoding="utf-8"?>
<service>
  <short>GlusterFS</short>
  <description>GlusterFS</description>
  <port protocol="tcp" port="1111"/>
  <port protocol="tcp" port="24007-24100"/>
    <port protocol="tcp" port="49152"/>
</service>

作成したファイルをもとにfirewallの設定を変更します。

firewall-cmd --permanent --add-service=glusterfs
firewall-cmd --reload

GlusterFS Volumeの作成

次にGlusterFSで使用するディスクの準備をします。

ファイルシステムの作成

GlusterFSは共有するボリュームのファイルシステムをXFSにする必要があります。
まずはデータ用のボリュームをXFSで用意します。

mkfs.xfs /dev/sdb1

/etc/fstab の末尾にエントリを追加します。

/dev/sdb1       /data                      xfs     defaults        0 0

マウントします。

mount -a

GlusterFSの起動

systemctl start glusterd
systemctl enable glusterd    

GlusterFSのノード登録

node01

gluster peer probe node02

node02

gluster peer probe node01

GlusterFSのVolume作成(任意の1ノードで実行)

mkdir -p /data/atlassian/stash
gluster volume create stash_vol replica 2 node01:/data/atlassian/stash node02:/data/atlassian/stash
gluster volume start stash_vol

GlusterFSのマウント

マウントポイントの作成

まずマウントポイントを作成します。
既存のStashのデータディレクトリはあとでGlusterFS上にコピーするためリネームして退避しておきます。

mv /var/atlassian/application-data/stash /var/atlassian/application-data/stash.org
mkdir -p  /var/atlassian/application-data/stash
chown atlstash:atlstash /var/atlassian/application-data/stash

fstabの修正

次に各ノードで /etc/fstab にエントリを追加します。

node01

node01:stash_vol        /var/atlassian/application-data/stash   glusterfs       defaults        0 0

node02

node02:stash_vol        /var/atlassian/application-data/stash   glusterfs       defaults        0 0

ファイルシステムのマウント

次に、両方のノードでglusterfsをマウントします。

mount -a

既存データのコピー

次に、今までのデータをどちらか一方のノードでコピーします

cp -rp /var/atlassian/application-data/stash.org/* /var/atlassian/application-data/stash/.

これで課題だったDISKの冗長化も出来、Stash改めBitbucketServerのクラスタリングが完了しました。
実際の運用では、定期的なデータのバックアップは行う事はあっても、クラスタリングをすることはまれかもしれませんが、
クラスタリングを検討されている方の参考になれば幸いです。

※ このシリーズの記事はあくまで検証用途でクラスタの設定を行っているため、実際の環境では使用に耐えない可能性があります。
実際にHAを構成を行う場合には十分な検証を行うことをおすすめします。

GJ Camp レポート

GJ Camp レポート

皆様、こんばんは。私、アットウェアの新入社員のMassanです。技術的な記事が多いなか、イベント的な記事をポストしたいと思います。そもそもGJってなに?というところから、社内の活動や雰囲気までふわっと伝われば幸いです。写真が全体的に黄色いのは、僕のカメラテクニックが低かったということもありますが、間接照明のせいでもあります。

GJとは

GJとはGood Job チームの略で、僕が所属するチームの名称です。弊社は現在、チーム制というものを導入しており、所属するプロジェクトとは別に様々な特色をもったクラスターによってチームを構成しています。GJ チームはGood Jobな仕事をしよう!という思想の元集まった集団です。私とNamさんが今年から加入して、6名となりました

GJ Camp

GJ Campは9月末に行われ、コワーキングスペースを借りて、丸一日もくもくと開発をするイベントでした。弊社では社内のコミュニケーションツールとして、Nulabさんが提供しているTypetalkを使用しており、社内でTypetalkのbotの開発が少し盛り上がっていたこともあり、一人一個botを作るという目標を立てました。

 

参加者と成果

GJ Campで作成しようとしたプロダクトと、それぞれのキャラクターを紹介します。


朝活推進派。

朝活推進派。

S.K:おすすめランチbot

GJチームのボス。一見でこぼこなチームをさらっとまとめる紅一点。
Campではみなとみらい近郊のランチ情報をポストするBotを開発。アイコンがキュートでした。


M.S:airconbot改

GJチーム最強のエンジニア、Javaをこよなく愛しています。
Campでは、typetalkのチャットからエアコンを操作するbotの改良を行いました。

チャイナでご満悦の室長


遅れてきたのに、いち早くbotを開発し終えた

遅れてきたのに、いち早くbotを開発し終えた

K.A:乗り換えbot

GJチームのインフラ担当。自己啓発本を読みまくり、メンタル的な面でも、技術的な面でも自分のブラッシュアップを怠らない、常に進化し続けるエンジニアの鏡です。Campでは天気の情報と、乗り換え案内を駆使して、どの電車に乗るべきかを教えてくれそうなbotを開発。ソースを全然公開してくれません。


紹興酒を飲みまくっている 懇親会にて

紹興酒を飲みまくっている 懇親会にて

O.F:

GJのご意見番。仕事が忙しすぎて、チームミーティングや活動にジョインできていません。会社への貢献度は計りしれません。飲み会も遅れてやってきました。


真剣なときのナムさんと、メガネを取ったときのナムさんはイケメン。

真剣なときのナムさんと、メガネを取ったときのナムさんはイケメン。

Nam Lai:connect server

GJのチャーミング担当。ナムさん。Goをこよなく愛するベトナムからの刺客。5月からアットウェアにジョインしましたが、新卒とは思えないほどの実力者です。Campではスケールが壮大すぎるプロジェクトに手をつけ出して終わってしまいました。
日本人の彼女募集中。


当日はカメラマンだったので、ナムさんに撮られたこの写真しかなかった。

当日はカメラマンだったので、ナムさんに撮られたこの写真しかなかった。

Massan:weekCheck.go

GJのフレッシュ担当。大学が情報系だったが、さぼりにさぼってここまできてしまいました。すこしずつ成長中です。Campでは、Goで曜日bot開発を行いました。


懇親会

関内で作業を行っていたので、近くの中華屋さんで懇親会を行いました。チームに加入してから初めて、全員と顔をあわすことができて、とてもよいCampとなりました。ボス曰く、チームとしても今期初の全員集合会だったらしく、まとまり感が出てきていい感じだそうです。

今回はクローズドなCampでしたが、今後はオープンな勉強会なども行っていく予定です。
今後ともGJチームをよろしくお願いしまーす!!!

HerokuでJavaのバージョンを固定しないと起こりうる問題

HerokuでJavaのバージョンを固定しないと起こりうる問題

HerokuでWebアプリケーションを稼働させる時に気にしておくべきことを紹介します。

HerokuはPaaSなのでライブラリなどはHerokuがプラットホームとして用意し提供してくれます。セキュリティパッチや新バージョンへのメンテナンスも全てHerokuが実行してくれます。言い換えれば、自分でメンテナンスしなくても済むというメリットはありますが、いつもならやっていた互換性を確保するという事を自身で管理しなくてもいいというわけではありません。

例えば一般的なJavaのwebアプリケーションならこんな事を気にするでしょう。

  • JDKのバージョンを固定する
  • 使用しているライブラリのバージョンを固定する
  • 実行環境の条件を固定する

最近ですと開発環境とステージング環境と本番環境全て同じ環境にして、オーケストレーションツールを利用し構築・再現方法も同じにするという事を行うのが一般的です。

HerokuのTwelve-Factor Appでも述べられている通りです。

http://12factor.net/ja/dev-prod-parity

現時点ですがHerokuのJavaがdynoを再起動すると最新のJavaのバージョンを参照するようになっているので、マイナーバージョンアップした時に前提条件が全く同じでないので、タイミングによっては前提条件が崩れる事があります。

下記のような致命的なエラーが発生するケースもあったので、原因と回避方法をお伝えしておきます。

現象

JDK8u60を利用するようになってから、バージョンを固定して使っていたAWS SDKのS3へのアクセスでエラーが発生。

原因

JDK8u60で時刻関係の扱いに変更が入ったのと、JodaTimeのバグとAWS SDKの認証トークン・シグネチャの生成の仕組みの組み合わせが重なり、不正なトークンが生成される形となった。

詳細はaws-sdk-javaのIssueを参照

https://github.com/aws/aws-sdk-java/issues/444 https://github.com/aws/aws-sdk-java/issues/484

対策方法

  • joda-timeのバージョンを事情があって変更できない場合
    • Java8u51を固定して利用する
    • Java8u60を使う場合
      • aws-sdk-javaのバージョンを最新にする

Javaのバージョンを固定する

HerokuでJavaのバージョンを固定化して利用するにはherokuコマンドでパラメータで実行します。

$heroku config:set JDK_URL_1_8=http://lang-jvm.s3.amazonaws.com/jdk/openjdk1.8.0_51-cedar14.tar.gz

固定する事で万が一dynoのrebootが走っても前提条件を担保できます。

根本的な対応

JDKのバージョンを固定するというのは意図しない動作をしないためのものであって、長い運用の中では一定のサイクルで見直すべき事です。テスト実施後にリリースタイミングを見計らい最新バージョンでも動くようしましょう。

今回の例なら根本的な対応しとして、根本的に解決するにはJodaTimeを2.8.1を使用する必要があり、aws-sdk-javaを1.10.1以降のバージョンに更新することで問題を解消できます。

最後に

オーケストレーションツールを使ってImmutable Infrastructureを意識し構築していく事は対応速度・開発効率だけでなく運用トラブルを避ける事にも繋がります。 クラウドサービスは便利な反面、押さえておかないポイントも多々あるので意識して使っていきたいですね。

2017/06/07 追記

Twitterにてコメントをいただきましたので追記します。

言及ありがとうございます。タイトルが少しミスリードでしたね。 実行環境がデプロイした時に想定していないバージョンの組み合わせになっていたという所から発生するので、PaaSに限らずこの辺意識していきたいところです。

atWare girls

atWare girls

Hi, everyone! Thanks for reading my post. I am Kaoru Matsuoka and I work for atWare as a developer.I am a member of KEY TEAM in atWare.

I am not that a good writer so I just want to simply introduce atWare's girls today.

There are 6 girls at atWare includ me. I'd like to interpret them one by one.


The first is H.K. さん

1
She is a great manager and besides, a completely tokyo citizen own a good sense of style.



The second is Y.K. さん

2
She belongs to Back Office at atWare. She is a working mother.
Balancing work and family life perfectly.



The Third is M.I. さん

3
She also works in Back Office at atWare.
She is always smiling and do many paper works for us.
In every monthly routine meeting day, She prepares lunch boxes for us.
And bellow is the pleasent moment picture I token at last week.

4



The fourth is S.K. さん

5
She is the only female leader at atWare.
With strong ability in listening, communication and organization.
Sometimes she speak with a Kansai accent.
As far as I know, her favorite food is chicken.



The last is J.I. さん

6
She is the youngest girl at atWare. Sometimes a kind of Shy.
As a system engineer, she has a great experience in web application development.
She is now lives in Houkaidou.



As a minority group , we always eat lunch together.
We like each other and enjoy great time together.
At the end, I want to show a picture of what we have lunch together.

7

Couchbase Live Tokyo 2015

Couchbase Live Tokyo 2015

みなさん、こんにちは。アットウェアの矢納です。
先日8/31(月)に豊洲で開催されたCouchbase Live Tokyo 2015にスピーカとして参加してきました。今回は発表の内容を紹介して行きたいと思います。

IoT Platform 「Yanoh!(TBD)」

今回のセッションのタイトルは"IoT Platform 「Yanoh!(TBD)」"です。「Yanoh!」は正式名ではありません。正式名は後ほど。

プラットフォーム名

zabuton-couch.png

内容の紹介に入る前にプラットフォーム名をご紹介します。

Zabutton




なぜZabutonなのか?

Couchbaseからカウチ(ソファ)を連想することができると思います。ソファは家人や来客がゆったりとくつろげるようにする物です。カウチの歴史は18世紀にフランスで誕生したものです。つまり西洋風の物なのです。
では和風な家人や来客がゆったりとくつろげるようにする物はなんでしょうか。そうです。座布団です。さらに座布団はどこにでも持ち運びが可能でどこでも使う事ができます。

これらの意味をこめて「Zabuton」という名がつきました。

Couchbase Mobile × IoT

さて、「IoTの分野にCouchbase Mobileは合致するのだろうか」という率直な疑問に答えていきましょう。

  • IoTの分野では多くのデータのやり取りを行います。リアルタイムを求められる状況で1ms以下の応答時間は非常に大事な物になって行きます。
  • 複数デバイスとの同期 IoTの分野ではセンサー等を使い、多くの場所からのデータを取得すると思います。その際のデータの同期処理を独自で実装するには非常にコストがかかります。この同期の処理が非常に簡単に書く事できます。

この2つの要点からCouchbase MobileとIoTのコラボができることを判断しました。

Office × IoT

CouchbaseとIoTをコラボさせるのは分かっていただけたでしょうか。では、次はどの分野とコラボするかです。今日、IoTは様々な分野に進出しています。家や鉄道、農業、学業、オフィス、商業施設など様々です。その中、今回選択したのは オフィス です。
農業じゃないのか!?と思われた人もいるかもしれません。確かに気温や空気流れ等を測定し、温度調整や換気窓の開閉の制御など色々と思い浮かべるかもしれません。ですが、農業とコラボをしようするとかなり多くのコストがかかります。自分でビニールハウスを建てるわけにはいきません。農家さんと協力が得れても、窓の開閉に使うモータの設置にコストがかかります。
それに比べオフィスはどうでしょう。私たちに身近なところにもなります。みなさん、会社の中を見回してみてください。解決したい問題なのに軽視されているものはありませんか。今回考えたユースケースはそのような問題に対してのソリューションです。

Technology

ユースケース紹介の前に「Zabuton」がどのような技術を使って実現しているかを見て行きましょう。

ベースレイヤー

ここはCouchbase社の Couchbase Mobile です。Couchbase Mobileは "Couchbase Server""Sync Gateway""Couchbase Lite" で構成されています。
Sync Gatewayを使う事により、複数のモバイル端末とデータの同期を簡単に行う事ができます。

エンドレイヤー

ここは 人とモノをつなげる 部分をなります。
iBeaconやNFC、各種センサーを使い、身の回りのデータを集めます。

ミドルレイヤー

ベースレイヤーとエンドレイヤーだけではデータを集めて、それを保存しているだけです。この二つのレイヤーだけでは動きません。 なので 収集したデータを中継・表示する ものが必要となります。スマートフォンやブラウザ、RaspberryPi等を使って、それらをやります。

アプリケーション

では、今回作成した「Zabuton」の紹介と「Zabuton」を使ったアプリケーションを紹介していきます。
ここで今回考えたユースケースを簡単に理解してもらうために動画を用意致しました。こちらをどうぞ。

今回考えたユースケースはこちらになります

  • リソース空き状況確認
  • チェックイン/チェックアウト
  • トラッキング

リソース空き状況確認

最初は リソース空き状況確認 ですね。動画でもあった通りトイレの空き状況チェックアプリです。

オフィスビルだとトイレの数はそれほど多くないのですぐに渋滞になることがあります。またオフィスビルだけでは無く、将来的に商業施設への展開を考えました。トイレについてから状況が分かっても仕方ないのです。トイレに着く前に空いているトイレがどこかを知りたいのです。

処理フロー

  1. IR Sensar(赤外線センサー)で人を認識。常にONになっているiBeaconをOFFにします。
  2. RaspberryPiがiBeaconのステータスを監視
  3. iBeaconのステータスを更新。
    iBeaconのステータスを更新する際に今回作成した「Zabuton」の一部、 "Zabuton Server"のAPI を呼びます。この"Zabuton Server"がSync GatewayのREST APIを使いデータを更新します。
  4. スマートフォンとはSync Gatewayにより自動同期され、空き状況を確認することができます






「なぜRaspberryPi上にCouchbase Liteを起動させないのか」と疑問を持たれた方もいるのではないでしょうか。
開発初期の頃はRaspberryPi上にCouchbase Liteを起動させ、Sync Gatewayを使って自動同期を行っていました。ですが、データ同期に10秒以上という非常に時間がかかっていました。この問題を解決するために"Zabuton Server"を開発し、そのAPIを呼ぶようにしました。
では、なぜ同期に時間がかかったのでしょうか。簡単な話でした。Couchbase ServerとSync Gatewayを動かしているサーバのスペック不足でした。サーバのスペックを上げたところ、同期にかかる時間が1秒近くになりました。

チェックイン/チェックアウト

次に2つ目の チェックイン/チェックアウト です。動画ではある場所についた際、アプリを使ってその場所のロックを解除することができるものでした。当初はiBeaconを使ってそれを実現しようと考えていましたが、時間との都合がつかず完成に至りませんでした。
ですが、その人がある場所に来たというのをNFCを利用して実現することができました。

処理フロー

  1. ICカードリーダでカード情報読みます。
  2. カードのIDをKEYにして、その人がどの場所に入った(出た)かを記録します。
    この際も"Zabuton Server"を経由してデータを更新しています。
  3. チェックイン状況はWEBから確認することができます。


これで誰がどこに行ったかは記録できるのですが、どのNFC(RaspberryPi)がどの場所なのかを事前に登録しておく必要が有ります。これは専用のサイトから登録が可能です。





トラッキング

最後に3つ目のトラッキングです。動画ではボスの位置を把握して慌てずに会議室に行くというものでした。ボスの位置を見ながらではなく、時間前に会議室に行くのがベストですよ。
さて、これを実現するにはこれは各所にiBeaconが配置されている前提です。各所に配置されたiBeaconを使ってその人がどこにいるかを記録するものです。

処理フロー

  1. スマートフォンでiBeaconシグナルを受けとる。
  2. 10秒以上連続でシグナルを受け取っている場合にその場所にいると判断する
  3. データの更新


これを利用すればチェックイン/チェックアウトにも適用することは可能です。





今後

「Zabuton」があることでほんの少し皆さんが幸せになるのではないのでしょうか。
ですが、まだ問題はたくさんあります。トラッキングでは個人がどこに行ったのかがまるわかりになってしますので、プライバシーの問題になりかねません。また、各所に配置するiBeaconの情報登録サイトは作成したのですが、セキュリティがありません。全員がすべてのiBeacon情報を更新することができます。
もちろん問題だけではありません。期待もあります。限度はあると思いますが、個人の情報を集めることができますので、その人だけの情報をお届けすることが可能となります。

スマートフォン向けのライブラリは現状Androidしかありません。iOS版は作成中です。また、RaspberryPi上でCouchbase Liteを動作させていませんでしたので、Couchbase Liteを使ったタイプを作成する予定です。
今回作成したライブライはatWareのGithubで公開予定です。公開した際にはこのブログで紹介したいと思います。

開発協力者

名前:Nguyễn Anh Huy(ベトナムインターンシップ生)
ニックネーム:ジャック
好きなこと:食、旅行、スポーツ、音楽
スキル:英語、Android、Go言語

名前:Tue Ngo(ベトナムインターンシップ生)
ニックネーム:けんじ
好きなこと:飲み、スポーツ
スキル:ハードウェア、Python

名前:Priyatam Mudivarti
会社:Facjure, LLC
「Zabuton」の名付け親

名前:北野弘治
役職:福社長
「Zabuton」のアドバイザー

AngularJS+GoogleMapに挑戦したら予想以上にはまった話

AngularJS+GoogleMapに挑戦したら予想以上にはまった話

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

現在GoogleMapを使ったWebアプリを作っています。
ほぼ初挑戦となるAngularJSを使っています。
予想では2時間程でできるかなと思っていたのですが、
かなりはまったので今後同じことにならないよう自分のためにも記録しておこうと思います。

その際使用していたのが「angular-google-maps」です。
こちらを使用した日本語の記事がいくつかあったのでそちらを参考にしていたのですが、上手くいかず
サンプルコードをそのままコピー下にもかかわらず動きませんでした(汗)

原因としては「angular-google-maps」のバージョンアップに伴い使い方が一部変化しており、
私が参考にした日本語の記事のものでは動かなかったということでした。

では、はまった部分も含めて実際のコードを見ていきましょう。
今回作成したものはGoogleMapを表示してマップ上に複数のマーカーを表示するというものです。

「angular-google-maps」のインストール

以下コマンドを実行

bower install angular-google-maps --save

scriptタグを追加 bower install を実行後は「angular-google-maps.js」が追加されています。 それよりも前に以下のタグを追加します。

<script src="//maps.googleapis.com/maps/api/js?sensor=false"></script>

app.jsの作成

map.jsの作成

map.htmlの作成

CSSの設定

実はこれに一番悩みました。
これを行わないとGoogleMapは表示されないのですが、
私は指定しなくても適当なサイズで表示されるものだと勝手に思い込んでいました。
1時間弱悩んでまさかと思い、追加してみて表示された時は本当にムダな時間を使ったと感じてしまいました。
解決した後に公式をもう一度見直すと

Specify an height via CSS for the map container

としっかり書かれてました。見落としてました。。。

実際に動かしてみたものがこちらになります。

表示させてみると非常に単純なものなのに予想以上に時間がかかりました。

最後に

色々悩みましたが目的としていた部分までほぼ知識がない状態で辿りつけたので動作した時には嬉しかったですね。
同じようなはまり方をしている人の少しでも参考になれば幸いです。
今回使用したAngularJSは1系で2系では書き方が大幅に変わるらしいのでそちらも勉強していきたいです。

Go for Argentina

Go for Argentina

KEYチームのアライです。
以前 footgolf について書きましたが(記事はコチラ)、最近更にテレビや雑誌で取り上げられることが多くなってきました。
それもそのはず!2012年に第一回ワールドカップが開催されたので、サッカーワールドカップ開催周期と同様に、
4年後の来年2016年に第二回ワールドカップがアルゼンチンで開催されます。

余談ですが、サッカーワールドカップの開催周期が4年なのは、オリンピックに対抗したためだそうです。
アマチュアだけでは世界一を決められないとサッカー界が主張していたものの、
オリンピックは今でこそプロも参加していますが、以前はアマチュア主義を貫いていたため、 サッカー界は独自の大会を主催し、ワールドカップが誕生しました。

 日本では、2015年7月の大会を皮切りに、既に日本代表の選考が始まっています。
今回は10名の選出を予定していて、選出規程は以下の通り(詳細は日本フットゴルフ協会HP参照コチラ)。
 第13回から第18回の「フットゴルフジャパンオープン 」で各大会の上位5名に入ることで、
11月8日に開催される「フットゴルフジャパンオープン ファイナル 2015」への出場資格を取得できます。
「フットゴルフジャパンオープン ファイナル 2015」で上位5位までに入賞された選手5名と、
協会が対象大会及び「ファイナル2015」に出場した選手などから選出する5名の合計10名が選出されます。

このブログの投稿日9月27日は、第17回フットゴルフジャパンオープンがまさに行われていて、 アライも参加しています。
第14回大会で3位になったので、ファイナルへの出場権は得ていますが、
外国人選手との実戦経験を比べると差は歴然としているので、出来る限り大会に参加しています。
このタイミングでは結果を載せられませんが、国内でまだ一度も優勝したことがないので、
優勝を目指して頑張っていると思います!

もちろんワールドカップ日本代表を目指しています。
11月に良い報告を期待してください!!
Go For Algentina !!

Thinking about INVEST

Thinking about INVEST

INVEST

Have you ever heard the acronym "INVEST"?

The INVEST mnemonic was created by Bill Wake and it is introduced in The Agile Samurai(@jrasmusson 2010) .

"INVEST" is as a reminder of the characteristics of a good quality user story,

  • Indipendent
    • The user story should be self-contained, in a way that there is no inherent dependency on another user story.
  • Negotiable
    • User stories, up until they are part of an iteration, can always be changed and rewritten.
  • Valuable
    • A user story must deliver value to the end user.
  • Estimable
    • You must always be able to estimate the size of a user story.
  • Small
    • User stories should not be so big as to become impossible to plan/task/prioritize with a certain level of certainty.
  • Testable
    • The user story or its related description must provide the necessary information to make test development possible.

quated from wikipedia)

"Valuable" is easy understand Of these six words, So everyone will care But Testable,Small and Estimable are often forgotten.

If you noticed follow problems, It may be able to solve it by being conscious of INVEST.

  • Story goal is difficult to understand, Because acceptance criteria is not clear.
  • Story is hard to estimate, Because the size is huge.

INVEST User Story

Then I think about an example about the user story that is INVEST.

As a Administrator,
I want search user by name
So that I don't use time for find user in list.
  • Indipendent
    • OK. This story is inipendent feature.
  • Negotiable
    • OK. This story is not specified implementation.
  • Valuable
    • OK. To improve Administrator's work efficiency
  • Estimable
    • OK. It story may be modified 1 view (and 1 logic)
  • Small
    • OK. It is simple and small.
  • Testable
    • OK. Story is simple, (please confirm the acceptance criteria properly in PO.)

It is INVEST and good user story.

As a ramen JIRO lovers (sometimes called Jirolian),
I want to know which JIRO is open now
So I wants to go to Jiro as soon as I thought.

And this user story is INVEST too.

Conclusion

INVEST is good practice for writing user story.

How about if you try a Story-Gathering workshop while being conscious of INVEST?

Will be valuable to the workplace

Will be valuable to the workplace

My day

The most important thing is to serve as my role on the team. Create a team atmosphere that we can remove all the obstacles and support the consensus of the team. Sometimes you can make a midnight snack in the team. As well as give advice and, if necessary, the team fills a hole to proceed smoothly.

The work would defile my hand.

Company has a harmful person

It does not have a band or a person other than social etiquette. Do not chase him the same thing. Give it a good map to help chase the man of action. 1 and 2 will listen on that 5 and 6 times. Otherwise, this was detrimental to the team who continue No competent people to leave good people coming into the team.

People are not perfect.

Priority

If you want to achieve their professional duties at work, you must set the priorities. Mentors also receive comprehensive idea. However, it has the right to determine how to achieve their goals.

With strict with myself.