RAKUS Developers Blog | ラクス エンジニアブログ

株式会社ラクスのエンジニアブログ

大阪開発部のビアバッシュを開催しました(8月) ~ツール特集~

kuwa_38です。ラクスでは月1回のペースで開発メンバーの交流会としてビアバッシュを開催しています。

ビアバッシュとはビールなどと軽食を片手にフランクに技術内容について発表したり語り合う交流会です。 (7月分のビアバッシュについては下記の記事をご覧ください)

tech-blog.rakus.co.jp

大阪開発部のビアバッシュでは、決められたテーマに沿った発表を行う「テーマ枠発表」と自由なテーマで発表を行う「LT(Light Talk)枠」が存在します。 今月のテーマは「ツール特集」です。各々が使用している便利なツールや業務効率化のために使っているツールについて発表して頂きました。

本記事ではテーマ枠、LT枠(自由発表)それぞれの発表についてご紹介します。

テーマ枠(ツール特集)

テーマ枠で行われた6件の発表についてご紹介します。各発表の紹介を少し記載した後、発表内で述べられていたツールを列挙します。

ツール紹介

Snipping ToolTampermonkeyスクリプトなど業務で使用している便利なツールやスクリプトを紹介して頂きました。業務でどのような時に使っているのかというお話もあったため、使う場面が想像し易すく、他のチームの方がどのような業務や進め方をしているのかといった点でも参考になる発表でした。また、Snipping Toolが廃止されることは知らなかったため驚きでした。

Node.jsとnpmの関連ツール

WindowsでのNode.jsやnpmのバージョン管理ツールであるNodistやnpmのバージョン5.2.0で導入されたnpx、自作したパスワードを生成するツールについて紹介して頂きました。npmを使用する従来の方法と、npxを使う方法を前で実践して下さったため、npxを使うことでワンラインで簡潔に実行できることがわかる発表になっていました。

My Powerful Scripts

Tampermonkeyで自作した便利なスクリプトについてランキング形式で発表して頂きました。GitLabでのレビューを簡単にするために優先度を付加するボタンを表示するスクリプトやMattermostで未読のみを表示するスクリプトなどを紹介して頂きました。「Mattermostで未読のみを表示するスクリプト」はチャットがスッキリして見易くなるので私も普段から使わせてもらっています。

タスク管理のやりかたとツールの使いかた

色々なタスク管理ツールを紹介した後、現在使っているタスク管理ツール(Google Keep)とその使い方、何が良いのかについて発表して頂きました。業務向きというよりはプライベートでのタスク管理にフォーカスしたお話でした。Google KeepではGoogleカレンダーなどの他のGoogleアプリと連携ができること、どこでも見れることが便利とのことです。また、メモのように手軽に書き込み週末に優先順位を変更し、次の1週間のタスクを決めているそうです。

個人的に使っている便利ツール

コピー履歴を保存してくれるツール(Clipy)やMarkdown記法を用いて綺麗に書くことのできるエディタ(Typora)、Mac上のアプリ・ファイルなどを検索できるツール(Spotlight検索)など業務の中で個人的に使っている便利なツールの紹介を行いました。業務でMarkdown記法を用いることが多いため、TyporaやMarpは愛用しています。

業務効率UP iOSアプリ

業務効率化のために使用しているiOSアプリについて紹介して頂きました。現在、発表者の方が行っている業務の関係上、Office LensやSkitchなどの画像加工アプリがメインでした。おまけとして、文字に濁点を付けていく、Dakutenといった面白いアプリの紹介もあったため、堅苦しいものでなく聞き手から笑いの起こる発表でした。私も情報共有のためにスクリーンショットをとり、説明を付加することは良く行うためいつくか試してみようと思います。

LT枠(自由発表)

LT枠で行われた2件の発表についてご紹介します。

インフラエンジニアの怖い話

夏といえば怖い話。この発表ではインフラエンジニアが実際に起こした、または、起こすと肝が冷えるミスについてご紹介頂きました。発表中は笑いが起こっていましたが、rm -rf /やshutdownコマンドなど、誤って実行してしまうと笑いごとでは済まないミスについてご紹介頂きました。rmコマンドやshutdownコマンドを業務で使ったことはありませんが、機会があるときは本当に気を付けないといけないなと考えさせられる発表でした。

トウダン・ジャーニー

php conference 2018 Kansaiに登壇したことについて、登壇が決まるまで、業務として登壇するにあたり準備したこと、資料作成などについてご説明頂きました。公開リハーサルや当日の発表に至るまでの発表者間でのタスク管理や情報共有など、登壇までの過程や裏側について知ることができる発表となっていました。 (登壇された様子については下記の記事を御覧ください)

tech-blog.rakus.co.jp

おわりに

今月も様々なタイプの発表が聞くことができて、大変充実したビアバッシュになりました。 次回のテーマは「他人のスライド発表会」です。他の人が作ったスライド、面白かった記事やスライドを用いて発表して頂きます。今までにない発表形式なので、どのような発表がされるのか楽しみです。

Rakus Meetup Tokyo #1 を開催します。

f:id:tech-rakus:20180814160204p:plain

ラクスは「IT技術で中小企業を強くします!」をミッションに掲げ、 メール共有・管理システムのメールディーラーから始まり、経費精算システムの楽楽精算に至るまで、 延べ40,000社を超えるお客様に自社開発したクラウドサービスを提供してきました。

今回(9/13(木))は、ラクスで主力クラウドサービスの開発を牽引するエンジニアによるトークセッションと交流会を開催します。 クラウドサービス開発のエンジニアとして活躍している方はもちろん、 クラウドサービス開発にご興味をお持ちのエンジニアの方も気軽にご参加頂ければと思います。

自社開発ならではの技術・運用ノウハウや、新しい取り組みの成果や失敗談など ご参考にして頂ける情報を積極発信していきたいと考えております。 このイベントが新しい気づきや成長につながる機会を提供する場になるとともに、 ラクス社員と参加者の皆さま、また参加者の皆さま同士で新たなつながりが生まれるきっかけになれば幸いです!

開催概要

【日時】2018/9/13(木) 19:30~21:30(開場は19:00)
【会場】ラクス 東京本社
(〒151-0051 東京都渋谷区千駄ヶ谷5-27-11 アグリスクエア新宿2F [アクセス]
【定員】30名
【申込み】connpass
【参加費】無料
【主催】ラクス

今回のトークテーマ

終わらないスクラム ~楽楽精算のサービス拡大を支えるスクラム開発の取り組み

大塚正道(おおつかまさみち)

ラクスでは、まだ多くの開発チームがウォーターフォール型の開発プロセスを採用していますが、 一部のチームでスクラムによるアジャイル開発に取り組んでいます。 今回は楽楽精算チームでの取り組みを紹介します。 実際にやってみると様々な問題が発生しました。問題解決に向けたアクションや取り組みを通じて得た知見、今後の課題等を事例を交えてお話しします。

テックリード(自称)としてのやっていき! ~iOSアプリ開発チームを率いて

川並裕(かわなみゆう)

若手エースエンジニアが初めてのiOSアプリ開発でテックリードとして奮闘したお話しです。 iOSアプリ開発は、自身も初、メンバーも初、しかも短納期(3ヵ月...)。 このデスマーチを予感させる不利な条件下で、テックリードとしてどのようにチームをリーディングしたのか。 様々な事例を交えてご紹介します。

流行の開発手法ChatOpsとは ~楽楽明細チーム/ChatOpsでルーティン作業をまるごと自動化~

三田英一(みたえいいち)

Jenkinsの導入で自動化が進んだけど、「Jenkinsを毎回開くのは面倒」、「アカウントの作成も面倒」、「非エンジニアに使ってもらうにはちょっとハードルが高い」。 そこで導入したのがChatOps! Slack互換のチャットツール「Mattermost」でルーティン作業を丸ごと自動化しました。 利用したbotツール、システム構成、Hubotスクリプトの実例など、ノウハウを余すことなくご紹介します。

タイムテーブル

  • 19:00 開場・受付開始
  • 19:30 イベントスタート
  • 21:30 終了予定

トークが終わり次第、交流会に移ります。
交流会では、フィンガーフード、ドリンクをご用意致します。
お気軽にご参加ください。

エントリー方法

  • [connpass]よりエントリーをお願いします。
  • ※当日はお名刺2枚ご持参ください
  • ※提供可能な設備:Wi-Fi、電源

会場

ラクス 東京オフィス2F セミナールーム
東京都渋谷区千駄ヶ谷5-27-11 アグリスクエア新宿2F [アクセス]

新人エンジニアが「JavaScriptで遊ぶ」べき3つの理由

こんにちは。エンジニアのmickey-STRANGEです。 今まではめんどくさがりをテーマに、「簡単に○○する方法」を紹介してきました。

tech-blog.rakus.co.jp

今回の記事では、3年目になった私が、これまでのエンジニア生活の中でやっててよかったと感じる「JavaScriptで遊ぶ」ことについてお話したいと思います。

エンジニアになると周りから「勉強しといた方がいいよ」「いろんな技術触っといた方がいいよ」と声をかけられることが多いと思います。 しかし、何から手を付けていいか分からない、どんな技術を、どんな言語を触ってみればいいか分からない、と最初は思うかもしれません。
そういった新人エンジニアの方が勉強と気負い過ぎず、軽い気持ちで「JavaScriptで遊ぶ」ことから始めるメリットについてお話していきます。

実行環境の準備が要らない

JavaScriptの実行環境はブラウザです。勉強を始めるための環境構築というフェーズが必要ありません。 テスト用のHTMLファイルさえ用意してしまえばブラウザで開くだけで実行してくれます。

ただ、最初はHTMLの記述とJavaScriptの記述を同時に考えるのが難しいと思います。そんな時は普段見るサイトのHTML構成をそのまま引っ張ってくることをお勧めします。 実際に公開されているHTML構成なので作り込みがされていて、簡単にしっかりとしたテスト用HTMLを用意することができます。 こうすることで、自分でベースのHTMLを用意しなくてもJavaScriptの練習が出来るようになります。

環境構築が必要ないのは、とっつきやすさという面でかなりの強さになりますね。

実際に使える業務知識が得られる

JavaScriptは業務でもよく使う言語です。Web系エンジニアなら当然、画面上の動きはJavaScriptで記述することになります。 とはいえ、非同期処理があったり、画面上のユーザ操作との兼ね合いがあったりで、実行順が分かりにくくなる傾向があり、私の周りでもJavaScriptに対して苦手意識を持つメンバがちらほらいます。

私も最初はそうでしたが、JavaScriptでちょくちょく遊んでいた結果、大規模な画面改修タスクを担当することになっても怯まなくなり、今では苦手意識は自分ではほぼないと感じています。

また、JavaScriptはもはやブラウザ上だけの言語だけではなく、JavaScriptベースの言語でネイティブアプリの画面を構成できたり、サーバサイドの処理を記述したりすることもできます。 以前投稿されたGASも、JavaScriptベースの言語だったりします。

tech-blog.rakus.co.jp

JavaScriptは他の言語と比べて、得た知識がどこかで業務に繋がる可能性の高い言語であるといえるでしょう。

小さな改善がすぐにできるようになる

普段見るサイトやブラウザアクセスするシステムの画面に対して、使いにくいなーめんどくさいなー、と思ったことはありませんか? そんな時はchrome拡張機能のTampermonkeyがおすすめです。

chrome.google.com

Tampermonkeyは、指定したURLのページが開いたときに自動でJavaScriptを実行してくれる拡張機能です。 これを利用することで、普段使うシステムの画面をちょっと使いやすくする、といったことが気軽に行えます。
また、作成したスクリプトは他のメンバのTampermonkeyの画面に貼り付けしてもらうだけで共有が出来るので、小さな改善をすぐチームに共有することが出来ます。

私も社内の基幹システムの膨大な数のメニューをいい感じに検索出来るスクリプトを作成して、チーム内に共有していたのですが、いつの間にか広まっていき、他のチームの方から感想をいただくこともありました。 用事がない限り他チームの方に話しかける機会はあまりないので、こういった面でもとてもよかったと思います。

さいごに

私が感じた「JavaScriptで遊ぶ」ことで得られたよかった点をまとめてみました。いかがでしたでしょうか。 とっつきやすく業務に繋がりやすく改善にもつながる、というのはかなりのメリットだと思います。
また、JavaScriptajaxを用いることで他システムのAPIを叩くことも可能ですので、1つのスクリプト内で出来ることの幅がかなり広いです。

「勉強しよう」と思うと難しいかもしれませんが、このページのここをこうしたいな、を原動力に「JavaScriptで遊ぶ」感覚で手を付け始めると楽しさが分かっていただけるかと思います。 楽しいという感覚になってしまえば勝手に持続するので、遊び感覚でスキルアップしてみましょう!

新卒社員&ベトナムメンバーの歓迎会を開催いたしました!

はじめに

エンジニアのFM_Harmonyです。
Rakus Developers Blogには、何度か記事を投稿させていただきました。

tech-blog.rakus.co.jp ↑前回の投稿記事はこちらです

さて、今年も早いもので7月初旬に開発部へ新卒社員が配属されました。
また、同時期にオフショア先のベトナム子会社から出張者の受け入れを行いました。

そこで先日、新卒社員&ベトナムメンバーの歓迎会を開催いたしました!
歓迎会の内容をまとめましたので、みなさまにラクス社内の雰囲気が伝われば幸いです。

交流の様子

f:id:FM_Harmony:20180731115223j:plain

まずは自己紹介から行いました、名前と顔を覚えていただくのは重要です。

f:id:FM_Harmony:20180731115100j:plain

今回は、普段のビアバッシュで用意しているものよりも、豪華な食事をご用意させていただきました!
参加された方に伺ったところ、みなさんご満足いただけたようで何よりです。

f:id:FM_Harmony:20180731115118j:plain

普段はなかなか話す機会のない、先輩や管理職の方ともこうして話す機会を設けることができるのが、歓迎会のよいところです。
新卒の方も積極的に話しかけています。

f:id:FM_Harmony:20180731115206j:plain

ベトナムのメンバーの方はすっかり日本のメンバーとも打ち解けられようで、こうして記念撮影も行っておられました。

アイスブレイク:ペーパータワー

会の終わりごろには、アイスブレイク(Ice break)としてペーパータワーというゲームを行いました!
簡単に説明しますと、A4用紙20枚を使って最も高いタワーを作ったチームが勝利するというゲームです。

では、ゲームの様子を写真とともにご覧ください。

ルール紹介

今回は以下のようなルールでゲームを実施いたしました。

  • 1チーム4~5名で行う
  • 2回ゲームを行い、それぞれで勝利チームを決定する
  • 作戦を検討する時間は5分、実際にタワーを組み立てる時間も5分とする
  • 利用して良いのは、A4用紙20枚および紙テープ1m分のみとする

↓ルールはこちらのサイトを参考にさせていただきました
heart-quake.com

↓ルール紹介の様子、彼の厳正な審査により各チームの勝敗が決まります f:id:FM_Harmony:20180725195741j:plain

作戦タイム

↓あるチームの作戦会議の様子、このプランニングにより作業がスムーズに行えるか決まります f:id:FM_Harmony:20180725195906j:plain

↓別のチームの様子、紙を片手に作戦会議中です
f:id:FM_Harmony:20180725195913j:plain

ベトナムメンバーの方々は1チームとして集まっていただきました
f:id:FM_Harmony:20180725195936j:plain

続いて実際の組み立ての様子といきたかったのですが、残念なことに撮影担当者もゲームに参加していたため、組み立て時の写真はありませんでした…
そのため、結果発表の様子に移りたいと思います。

結果発表

↓計測の様子、タワーが倒れないようみなさん必死です
f:id:FM_Harmony:20180725202210j:plain

↓中には予想外の組み立て方をされたチームも!
f:id:FM_Harmony:20180725202215j:plain

肝心の結果はどうなったかというと、なんと2回ともベトナムメンバーチームの勝利でした!!

↓成果物と一緒に記念撮影、みなさんおめでとうございます!
f:id:FM_Harmony:20180725200855j:plain

おわりに

というところで、今回はここまでとさせていただきます。
この記事を通して、みなさまにラクスという会社の雰囲気を伝えることができたのであれば幸いです。

今回は私もイベント開催を担当したのですが、本当に楽しい歓迎会を開催することができて良かったです。
また、新人やベトナムの方だけでなく、私たちも普段あまり話す機会のない方とお話しできたことも良かったと思いました。

最後になりますが、新卒の方にはこれからの活躍を、ベトナムの方には日本で貴重な経験が得られるよう、心から祈っております。

この前登壇してた人にまたもインタビューしてみた

こんにちは。開発エンジニアのamdaba_sk(ペンネーム未定)です。

前回の冒頭で、ちょろっと以下のように書きました。

「OWASP ZAPについて調べてみた」という記事を書きました。単体テスト中にこっそり使ってみようかと思っていたのですが、手元の環境ではポート待ち受けでエラーが出てしまって放置しています……。

この件について、実はポート番号を選べばローカルプロキシとして使えそうだということがわかったのでそのことで続報を、と思ったのですが。

いいタイミングでまたもあの人が目立ってくれましたね!

2018.kphpug.jp

tech-blog.rakus.co.jp

先日開催された PHP カンファレンス関西 2018 にラクスのエンジニアが登壇しました。我らが坂田くんがそのうちの一人として参加しています。

当日は私も見に行きました。開始前のえらく緊張してそわそわしている姿と、発表中の堂々と話す姿のギャップが激しかったのがすごく印象的でした。

というわけで、このブログへの次の投稿もこれをネタにするしかあるまいと思った次第です。例によって雑談に見せかけてまた坂田くんにインタビューしてみましたので、その時の話を今回は書こうと思います。 (※本人了承済み。ただし写真は気恥ずかしいのでやっぱりNGだそうです。ほんともう今さらな感じもしますが)

なおイベントそのものと、弊社がこのイベントに公式に参加することになった経緯などについてはリンク先をご覧ください。

カフェスペースにて

PHPカンファレンス関西の開催された翌週、私はいい感じに話を聞けるタイミングを見計らっていました。坂田くんは何やら忙しそうで、なかなか昼食もいっしょに行けない様子。無理に時間を作ってもらうのも悪いのでどうしたものかと思っていたところ、ちょっとした休憩でも取るつもりなのかコップを持って執務室を出ていく坂田くんの姿が。私はチャンスとばかりに後を追いました。

ペンネーム未定(以後ペン未)「というわけでお話をしましょう」

坂田くん(以後 坂田)「何が『というわけ』なんだ……。ていうかそのメモ紙とペンは何? またブログのネタにされるやつ?」

ペン未「ちっ、君のような勘のいいガキは……」

坂田「嫌いだというなら無理にお話しなくてもいいのだけど」

ペン未「いやいや好きだから。もうめっちゃ好き。察しがよくて助かるわ~」

スピーカーディナーのこと

ペン未「前日にも業務後に何か行ってたよね?」

坂田「スピーカーディナーっていうのに参加してた。当日はお互い発表があって話す時間が取れないからだと」

ペン未「飲み会自体あんまり好きじゃないって言ってたのによく行く気になったね」

坂田「せっかくの機会だからと思って。社外の人と交流する機会もあんまりないし」

ペン未「どんな感じだった?」

坂田「ネットの知り合いとのオフ会って感じだった。みんな私服だし、『もしかして、○○さんですか?』みたいな声のかけ方とかも。全員集まるまで適当にだべってる感じもまさしく」

ペン未「へー。その場にいた人はみんなお互い初対面だった感じ?」

坂田「いや、けっこう知り合いって感じの人も多かったかな。毎回登壇してるような人とか、現運営、元運営みたいな人達はお互いに知り合いで、むしろ私みたいな新参者の方が珍しかったような印象。それもあってちょっと話に加わりづらい感じがした」

坂田「でも実行委員長の人は席も近かったしけっこう話せた。そういえば今回はスポンサーの応募も例年よりすごく多かったみたいで、しかも初めてスポンサーするってところも多かったらしい。それで問合せがいっぱい来て対応が大変だったとか」

ペン未「そうなんだ。それはちょっと申し訳なかった感じがあるね……」

当日のこと

ペン未「発表直前はめっちゃそわそわしてたよね。坂田くんでも緊張するんだって思った」

坂田「私だって緊張ぐらいします。ビアバッシュの発表のときだって緊張してるんですが」

ペン未「全然そうは見えない」

坂田「それ他の人にも言われたんだけど。なんでそう見られているのか……」

ペン未「それは君がそういう振る舞いをしているからとしか言いようがないけど。でもあの時はことさら緊張してたってことでしょう?」

坂田「まあね。発表が始まってからは多少落ち着くんだけど、発表前の5分間は結構つらかった」

ペン未「発表前にパソコントラブルもあったしね」

坂田「そうそれ。私の持ってる唯一のノートパソコンが元XPで現Linux搭載の古いやつで、もともと使えるかどうかわからないねって話はしてたのだけど。VGAのケーブルがあったから自分のパソコン繋げられると思っのに、いざ繋げてからパソコン起動させてみるとなぜかログインできなくなっているという。わけが分からなかったし時間も無かったから急遽パソコンを貸してもらった」

ペン未「あせってパスワードミスってただけでは」

坂田「間違ってはいなかったと思うのだけどなあ。後でVGAを外してから同じようにログイン試行してみたら普通に入れたし」

ペン未「まあでも発表始まったら急にスイッチ入った感じだったよね。なんか練習よりも一段と分かりやすくなってたような気がするし。何か準備してた?」

坂田「別に直前に特別なことはしてない。スライド見返すとかその程度で」

ペン未「それで話せるとかすごいな。時間もほぼぴったりだったよね」

坂田「時間は、実はちょっと遅いかもって思ってた。一回時計を見たのだけどいつ始まっていつ終わらないといけないのかわからくなって、もういいやって」

ペン未「まじで。それめっちゃ不安じゃない?」

坂田「今思うと不安なんだけど、発表中はなぜか時間のこと忘れてられたんだよね。不思議なことに」

坂田「でも発表中に出ていっちゃた人がいたのは残念だったなあ」

ペン未「あー、そういえばいたね。でもそれって仕方ないんじゃない?」

坂田「そうかもしれないけど。でも今思い返してみると、確かに『Laravelの良かったところ』のセクションは確かに聞いててつまらないかもとも思うんだよね。Laravelの宣伝してるだけみたいな感じになってて。といってもどう変えればいいのかよくわからないのだけど」

ペン未「まあそれは今後の課題ということで。また同じような発表をする機会があればその時考え直してみるといいですね」

坂田「そうですね。そう頻繁に同じような発表をすることになっても困るけど」

そして仕事はつづく

まだまだ話は引き出せそうでしたが、息抜きには十分なほどに話をしていました。 私たちは話をするうちに飲み干してしまったお茶を入れなおし、自席に戻りました。

これからは会社としてもPHPカンファレンスのようなイベント、勉強会への参加を推進していくとのことなので、坂田くんに活躍してもらう機会が今後もたびたびあるのでしょう。 私は心の中でエールを送りつつ、先ほど聞いた話をブログにまとめるべくキーボードをたたくのでした。

PHP カンファレンス関西 2018 に登壇してきました

@kawanamiyuu です。以前の投稿でお知らせしましたとおり、先日開催された PHP カンファレンス関西 2018 にラクスのエンジニアが登壇しました。 また、ラクスはシルバースポンサーとしてイベントに協賛いたしました。

f:id:kawanamiyuu:20180720104230j:plainf:id:kawanamiyuu:20180720104256j:plain
f:id:kawanamiyuu:20180720113549j:plainf:id:kawanamiyuu:20180720114104j:plain

イベント概要

2018.kphpug.jp

登壇

チャットディーラーの高速開発を支える Laravel(30分セッション)

speakerdeck.com

f:id:kawanamiyuu:20180720111516j:plain

(本人コメント)

PHP カンファレンスに限らず技術系のイベント初参加でした。最終的に私が登壇することになりましたが、会社としての参加が決まってからネタ出し、アウトライン作成、資料作成、発表練習等、最後までチームで準備を進めました。当日もちろん緊張はしましたが、不安を感じずに発表ができたのはチームのみんなのおかげです。 また発表以外の時間では聞く側としても楽しめましたし、勉強にもなりました。これからはもっと積極的にこういった社外のイベントや勉強会に参加してみようかなと思い始めています。

mixed 型なんてけしからんと社内チャットでつぶやいたら炎上した(ライトニングトーク

私、@kawanamiyuu も実はライトニングトークが採択されましたので話してきました。

speakerdeck.com

f:id:kawanamiyuu:20180720104725j:plain

(本人コメント)

今回がカンファレンスでの初 LT 体験でした。ネタはけっこう前から温めていて、社内のビアバッシュとかで話そうかと思っていましたが、今回弊社のエンジニアが 30 分セッションにも登壇するし、LT もやったれ!と思って応募したら採択されて、ドキドキしたけどとても楽しめました。 イベント 2 日前にオフィスで行った公開発表練習では 1 分半も時間が余ってしまい焦りましたが、自主練の結果、本番では時間ちょうどくらいで終われて安心しました。ほんとうはドラを鳴らされてみたかったです (^m^)

所感

今回、ラクスにとって初めての技術イベントへの協賛および登壇でした*1。いろいろ勝手が分からず、ちゃんとイベント当日まで漕ぎ着けることができるか不安でしたが、担当サービスを横断した登壇推進チームで協力して資料作成や発表練習を行い、当日、自分の会社のエンジニアが目の前で発表している姿を見てとても嬉しくなりました。 今後も継続して技術イベントに登壇していけるよう、また、コミュニティに貢献していけるよう、開発組織のレベルアップやエンジニアリング文化の醸造に取り組んでいきたいと思います。

*1:これまでも弊社のエンジニアがプライベートで技術イベントで登壇することはありましたが、開発部の公式な取り組みとして登壇や協賛を行ったのは初めてでした。

【図多め】APIを使ってGoogleサービスを操る

f:id:Y-Kanoh:20180724020907p:plain

Google APIとは、Googleが提供するのサービスやプラットフォームを扱えるAPIです。 これらのAPIを使いこなすことで、Googleのサービスを自身のアプリケーションへ組み込み、様々なことを実現できます。

ここでは、Gmailを扱うAPIと、GoogleDriveを扱うAPIPHPアプリケーションから利用する例に紹介します。 (内容は2018年7月現在の情報です。)

この記事の内容

今回は、Google APIのガイドに記載されているQuickstartを用いて、OAuth認証を行いAPIを実行します。*1

概要は以下の図のような感じです。

f:id:Y-Kanoh:20180724013731p:plain

この記事では、「その1:プロジェクトの用意」で、Google Cloud プラットフォームにプロジェクトを用意し、 「その2:認証情報の作成」にて、OAuthに必要な認証情報ファイルの作成、 「その3:APIを叩く」でサンプルプログラムを用いて上記図の①~④に示す認証処理とAPIの実行を行います。

少し内容が長くなってしまったので、目次を見て必要な情報のところをご覧ください。

(余談ですが、恥ずかしながら、この記事を書くまで、私は「OAuth」を、他のシステムで認証するから「Other Auth」の略だと思っていました。正しくは「Open Auth」ですね。。。)


その0:Googleアカウントの用意

言わずもがな、APIを利用して操作するGoogleアカウントが必要です。 詳しい方法は割愛。作成したら、ログインしてください。


その1:プロジェクトの用意

APIを利用するため、Googleアカウントに紐づいたプロジェクトを作成する必要があります。

プロジェクトを作成する

使用するGoogleアカウントにログインしたら、Google Cloud プラットフォームにアクセスしましょう。

左上のハンバーガーメニューから、「IAMと管理 > リソースの管理」を選択します。 f:id:Y-Kanoh:20180723233137p:plain

リソースの管理画面に、「プロジェクトを作成」リンクがあるので、クリックします。 f:id:Y-Kanoh:20180723233132p:plain

その後の画面でプロジェクト名を入力し、「作成」します。 これでプロジェクトが作成できました。 (少し画面表示に時間がかかることがあります。) f:id:Y-Kanoh:20180723233129p:plain

プロジェクトで使用するAPIを指定する

次に、作成したプロジェクトで使用するAPIを指定します。 Google Cloudプラットフォームの画面上部から、先ほど作成したプロジェクトを選択した状態で、「APIとサービス > ライブラリ」を選択します。 f:id:Y-Kanoh:20180723233126p:plain ここでは、使用することができるGoogleAPIライブラリを選ぶことがあります。 どのAPIも面白そうですが、とりあえず今回は「Gmail」と「GoogleDrive」を利用するので、まず、「Gmail API」を探し、「有効にする」を選択します。 これで、このプロジェクトでGmail APIを有効にすることができます。 f:id:Y-Kanoh:20180723233123p:plain なお、この画面からはGmail APIのガイドやリファレンスなどのドキュメントを閲覧することができます。

同様に、「Google Drive API」を、APIライブラリから探し、有効にします。

これで、使いたいAPIを有効にしたプロジェクトが作成できます。


その2:認証情報の作成

さて、プロジェクトは準備できましたが、APIを叩くにあたり、認証が必要です。 次は認証情報を作成し、自分が作成するアプリケーションからのリクエストのみを受け付けるようにしましょう。

Google Cloudプラットフォームの画面上部から、先ほど作成したプロジェクトを選択した状態で、「APIとサービス > 認証情報」を選択します。

f:id:Y-Kanoh:20180723233927p:plain

その後、「認証情報を作成」から「OAuth クライアント ID の作成」をクリックします。

OAuth 2.0 クライアント ID を作成する

OAuthの設定をするにあたり、まずはAPIを叩くアプリケーションの種類を指定します。

今回は、「その他」を選んでください。APIガイドに載っている「Quickstart」を使うためには、「その他」を選ぶ必要があります。 選択したら、クライアントの識別名を入力し、作成します。

f:id:Y-Kanoh:20180723233924p:plain

OAuth 2.0 同意画面を設定する

次に、 OAuth 2.0 同意画面の設定を行うため、 「認証情報を作成」から「OAuth 2.0 同意画面」を選択します。 OAuth 2.0 同意画面とは、設定しているAPIによってユーザのデータへアクセスするときに、表示される画面で、データへのアクセス前に認証を行う画面のことです。

この画面で認証を行うため、メールアドレスと、表示する任意のアプリ名を指定します。 ここで指定したアプリ名は、以下のように認証画面にて表示されます。

f:id:Y-Kanoh:20180723233921p:plain

設定出来たら「次へ」ボタンを押下します。

これで認証情報の作成が完了しました。

ハンバーガーメニューから、「APIとサービス > 認証情報」を選択すると、認証情報が作成できていることが確認できます。


その3:APIを叩く

次に、アプリケーションからGoogle APIの認証を行い実際にAPIを実行します。

ここからはGmail APIの公式ドキュメントを参考にしながら進めましょう。 「APIとサービス > ライブラリ」から「Gmail API」を探し出し、「チュートリアルとドキュメント」の「Learn more」をクリックし、公式ドキュメントを表示します。

表示したら、「ガイド」タブの「Quickstarts」から、使用する言語を選択します。 今回はPHPで説明します。他の言語でAPIを扱いたい場合は、対象の言語を選択して、頑張ってください。(←丸投げ) f:id:Y-Kanoh:20180723233918p:plain

PHPのQuickstartでは、Step1~Step4の手順が紹介されていますが、Step1のAPIを有効化する手順はもう完了しているので、Step2から行います。

Google Client Libraryのインストール

QuickstartのStep2です。GoogleAPIを使用するために、Google Client Libraryをインストールする必要があります。 PHPの場合、composerを用いることで簡単にインストールできます。

composer require google/apiclient:^2.0

認証情報をダウンロード

先ほど作成したOAuth2.0クライアントの認証情報が記載されたJSONファイルをダウンロードします。 Google Cloud プラットフォームのメニューから、「APIとサービス > 認証情報」を選択し、先ほど作成したOAuth2.0クライアントのダウンロードアイコンをクリックすることで、ダウンロードできます。 f:id:Y-Kanoh:20180723234812p:plain

ダウンロードしたクライアントの認証情報ファイルは、次のサンプルプログラム実行で使います。

サンプルプログラムの作成

QuickstartのStep3です。quickstart.phpという名前で以下のコードを保存します。

<?php
require __DIR__ . '/vendor/autoload.php';

if (php_sapi_name() != 'cli') {
    throw new Exception('This application must be run on the command line.');
}

/**
 * 指定した権限が付与されたAPIクライアントを返す
 * @return 権限が付与されたGoogle_Clientオブジェクト
 */
function getClient()
{
    $client = new Google_Client();
    $client->setApplicationName('Gmail API PHP Quickstart');
    $client->setScopes(Google_Service_Gmail::GMAIL_READONLY); // ※1:スコープの設定
    $client->setAuthConfig('credentials.json');  // 取得したJSONファイルのパス
    $client->setAccessType('offline');

    // クライアント証明書ファイルが存在しない場合(初回実行時)は
    // 認証情報JSONファイルを用いて取得する。
    // 存在する場合(2回目以降の実行時)は、クライアント証明書を読み込む。
    $credentialsPath = 'token.json';  // クライアント証明書ファイルのパス
    if (file_exists($credentialsPath)) {
        $accessToken = json_decode(file_get_contents($credentialsPath), true);
    } else {
        // ユーザからの認証を行う
        $authUrl = $client->createAuthUrl();
        printf("Open the following link in your browser:\n%s\n", $authUrl);
        print 'Enter verification code: ';
        $authCode = trim(fgets(STDIN));

        // 認証コードをアクセストークンに変換する
        $accessToken = $client->fetchAccessTokenWithAuthCode($authCode);

        // クライアント証明書をファイルに保存する
        if (!file_exists(dirname($credentialsPath))) {
            mkdir(dirname($credentialsPath), 0700, true);
        }
        file_put_contents($credentialsPath, json_encode($accessToken));
        printf("Credentials saved to %s\n", $credentialsPath);
    }
    $client->setAccessToken($accessToken);

    // クライアント証明書が有効期限切れの場合は更新し、ファイルへ保存しなおす
    if ($client->isAccessTokenExpired()) {
        $client->fetchAccessTokenWithRefreshToken($client->getRefreshToken());
        file_put_contents($credentialsPath, json_encode($client->getAccessToken()));
    }
    return $client;
}

/**
 * メイン処理
 */
// APIクライアントを作成し、サービスオブジェクトを作成する
$client = getClient();
$service = new Google_Service_Gmail($client);  // 使用するAPIごとのサービスオブジェクトを作成

// Print the labels in the user's account.
$user = 'me';
$results = $service->users_labels->listUsersLabels($user);

if (count($results->getLabels()) == 0) {
  print "No labels found.\n";
} else {
  print "Labels:\n";
  foreach ($results->getLabels() as $label) {
    printf("- %s\n", $label->getName());
  }
}

上記コードでは、大きく分けて、以下の処理を行っており、一部APIの実行目的によって変更する必要があります。

  • APIクライアントオブジェクトの取得
    • クライアント証明書の取得と更新
    • APIクライアントオブジェクトの作成
  • 利用するAPIのサービスオブジェクト作成

APIクライアントオブジェクトの取得

APIを実行するクライアントのオブジェクトを作成します。 作成時には、先ほどダウンロードした、クライアントの認証情報を利用して、クライアント証明書を取得し、ファイルに保存します。 クライアント証明書には、特別な設定をしない限り利用期限があり、利用期限が過ぎていた場合は更新されます。

また、クライアントオブジェクトを作成する際に、「スコープ」を指定します。 「スコープ」は、そのクライアントが、APIを用いて「どこまでの操作が実行できるか」を指定するものです。(コード内コメント※1) スコープはAPIを使って何を実行したいのかによるため、場合によって書き換える必要があります。 スコープは各サービスオブジェクトの定数を指定するか、APIガイドにあるURIを指定することで、設定できます。

たとえば、Gmailでメールを送信したい場合は以下の通りに書き換えます。

$client = new Google_Client();
$client->setScopes(Google_Service_Gmail::GMAIL_SEND);

Google Driveでファイルをアップロードしたい場合はこんな感じ。

$client = new Google_Client();
$client->setScopes(Google_Service_Drive::DRIVE);

複数のスコープを指定する場合は、定数を配列に格納することで可能です。

$client = new Google_Client();
$scopeList = array(Google_Service_Gmail::GMAIL_SEND, Google_Service_Drive::DRIVE);
$client->setScopes($scopeList);

利用するAPIのサービスオブジェクト作成

取得したクライアントオブジェクトを利用して、各サービスのAPIを扱うためのサービスオブジェクトを作成します。 ここは各サービスごとに異なるため、ドキュメントをご覧ください。 作成したサービスオブジェクトを使うことで、そのサービスのAPIリクエストが可能になります。

サンプルプログラムの実行

作成したサンプルプログラムをコマンドラインから実行します。

$ php quickstart.php

実行すると、URLが表示され、入力待ちになりますので、表示されたURLへブラウザからアクセスしてください。 アクセスすると、認証情報の作成時に設定したOAuth 2.0の同意画面が表示されますので、画面に従って実行を許可してください。アクセストークンが表示されるので、コマンドラインにコピペすることで、クライアント証明書を取得することができます。

f:id:Y-Kanoh:20180724000609p:plain

次回実行時からは、この作業で取得したクライアント証明書をもとに認証を行うため、同意画面での実行許可は不要になります。

また、サンプルプログラムはGmailAPIガイドから取得しましたが、この認証で今回作ったプロジェクトへの認証ができるので、他APIも利用可能になります。

これでAPIを実行する準備はできました。 あとは各サービスオブジェクトのメソッドを使ってGmailを送ったり、Google Driveを操作したりできます。

例として、Gmailでメールを送るときのコードを記載します。*2

/**
   * Gmailを送信する
   */
  public function sendGmail($client) {
    $data = "";
    $data .= "To:xxxx@xxx.xxx.xx\n";
    $data .= "Subject: メールたいとる\n";
    $data .= "\n"; // ヘッダーと本文を区切る空行
    $data .= "本文";

    $data = base64_encode($data); //base64エンコード

    $service = new Google_Service_Gmail($client);
    $msg = new Google_Service_Gmail_Message();
    $msg->setRaw($data);
    $result = $service->users_messages->send('me', $msg);
    return $result;
  }
Copyright © RAKUS Co., Ltd. All rights reserved.