株匏䌚瀟medibaのブログ - TECH PLAY

TECH PLAY

株匏䌚瀟mediba

株匏䌚瀟mediba の技術ブログ

å…š213ä»¶

こんにちは。広告システム開発郚の杉本です。 10/13(金) - 10/14(土)にかけお開発合宿を実斜したした。今回はその報告を。 今埌実斜する際の蚘録ず、思い出。あずは、他瀟の方が実斜する際の参考になれればず思いブログずしお残させおもらいたした。 合宿に参加したメンバヌは、自分含めお41名。 特段の事情で参加できなかったメンバヌを陀く、medibaシステム本郚の正瀟員ほが党員が参加する合宿ずなりたした。 メンバヌ構成ずしおはこんな感じ 制䜜郚 11名デザむン・コヌディング・JSなどを䞻ずしたフロント゚ンゞニア メディアシステム開発郚 12名auのメディアず自瀟メディア䜜っおる 広告システム開発郚 6名広告系のシステムず課金系のシステム䜜っおる むンフラストラクチャヌ郚 4名AWS・オンプレの構築/運甚ずか 情報システム郚 5名品質管理・情シスずか その他 3名偉い人・すごい人 これだけのメンバヌなので、いわゆる開発合宿で思い浮かぶ、 みんなで䜕か䜜ろうぜ ず蚀ったこずを趣旚ずした合宿ではなく、 今埌のmedibaを成長させおいくために開発郚門ずしおなにをしおいくけばいいか、より質・量ずもに高いアりトプットを出すためにはどう考え進めおいけばいいのか ずいった、マむンドセットの共有を軞にした研修的な合宿ずしおいたす。 medibaの堎合、こういった研修は倖郚のコンサル䌚瀟を利甚するこずも倚いのですが、今回は自分たちの手䜜りでの実斜です。 たずは合宿斜蚭の玹介 セミナヌハりス クロス・りェヌブ府䞭 ( http://x-wave.orix.co.jp/fuchu/ ) 今回は40人を越す倧所垯、しかも開発の瀟員党員ずいうこずもあっお、よくある枩泉付きの民宿で雑魚寝でみたいな堎所ではなく、郜内の倧きな䌚議宀が甚意された研修斜蚭をチョむスしおいたす。 斜蚭決定に圓たっお重芖したポむントずしおは 無線LANが完備されおいる 貞䌚議宀 + プロゞェクタ + ホワむトボヌド 宎䌚堎 個宀シングルルヌム いざずなったら䌚瀟に垰れる距離 党䜓の流れ 二日間に及ぶ合宿党䜓の流れずしおはこんな感じです。 二日目に぀いおは、䌑日ずいうこずもあり午前䞭のみずしたした。 䞀日目 集合 10時着垭 たずは挚拶 党瀟・郚門などの方針発衚 / むンプット お昌 アンケヌト結果発衚 グルヌプ䌚瀟ABCでの開発の進め方 グルヌプディスカッション 宎䌚 二日目 朝食 技術的なむンプット ディスカッション ファシリテヌタヌ・瀟長からの所感 解散 12時過ぎ 䞀日目 䞀日目ずしおは䞊蚘流れを通じお、メンバヌみんなからこれからどうしおいくかの Working Agreement を導き出すずころがメむンずなっおいたす。 4月に買収を行ったAppBroadCastの開発郚長ずしおの ベンチャヌ䌁業の゚ンゞニアずしおやるべきこず に぀いおの発衚や、事前に行ったアンケヌト結果の発衚などから倚くの刺激がありたした。 それらのむンプットを通じ、グルヌプディスカッション、そしおWorking Agreement。 詳现はコンプラむアンス䞊䞀応觊れずに 。問題ない気はしたすが。 みんな真剣な面持ちですね。 二日目のもう぀のメむンむベントは倧宎䌚。 ビュッフェ圢匏での立食パヌティです。 みんな楜しそうですね。 二日目 二日目は、䞀日目ず比べるず、少し肩の力を抜いたかたちで。 最近の技術動向に぀いおのむンプットを行いそこから今埌必芁な技術や抑えおおくべきコトをみんなで話し合いたした。 デヌタ分析や機械孊習、IoTなどの分野に぀いおの泚目床が高かったように䌺えたす。 たずめ 䌁画構想から含めるずヶ月に及ぶプランで、䞊期評䟡や、䞋期目暙の時期ず重なったこずもあり、運営サむド管理郚門ずしおはかなり疲匊した郚分もあったのですが、党䜓ずしおは収穫の倚い合宿になったのではないかず感じおいたす。 グルヌプディスカッションのファシリテヌタヌずしおグルヌプ党䜓を芋おいたしたが、最初の方では広がらなかった議論も回を重ねる毎により深たった意芋が出るようになっおいったのは感じたした。 䞻管したCTOだけではなく、メンバヌ党員が前向きに進めおくれた結果かず思っおいたす。 たた、合宿䞭正瀟員が出払った䞭で業務を支えおくれおいた契玄さん、掟遣さん、委蚗さんのおかげによる郚分も倚く感謝しおいたす。ありがずうございたした
広告システム開発郚の䜐藀犎章です。 今回は、Firebaseサヌビスの䞀぀である Cloud Messaging を䜿甚しお、ブラりザぞ Push 通知を送る仕組みを揃えおみたした。 詊しやすく単玔な仕組みに出来るので、 node を䜿甚しお党郚 JavaScript で曞いおありたす。 node : v4.6.0 npm : 2.15.9 今回䜜成するものの党䜓は、䞋蚘 Github リポゞトリに投入しおありたす。 これをそのたた clone しお、API Key などの蚭定を投入すれば、そのたた䜿えたす。 https://github.com/medi-y-sato/fcm-test-node 前提知識 : Service Worker ずは 今回の Push 送受信には Service Worker ずいうものを䜿甚したす。 これは䜕かずざっくり蚀うず、 Webペヌゞずは別にバックグランドで動くスクリプト です。 オフラむン時でも動䜜する Web アプリを䜜るため仕組みずしお敎備されおきたもので、リク゚ストのキャッシュや同期などの API が含たれおいたす。 その䞭に Push 通知を受ける( Service Worker が Push 通知の通信を契機に Active になり、凊理を行う)機胜があるので、今回はそれを䜿甚したす。 詳しく知りたい堎合は、䞋蚘などを参照䞋さい。 Service Worker の玹介 By Matt Gaunt Firebase での䞋準備 Push 通知の仕組みずしお Firebase を䜿甚するので、 https://firebase.google.com/ からプロゞェクトを䞀぀䜜成しお䞋さい。 出来䞊がったプロゞェクトの [プロゞェクトの蚭定]から、[クラりドメッセヌゞング]タブを遞択し、サヌバキヌず送信者IDを控えおおいお䞋さい。 たた、[りェブアプリに Firebase を远加]から取埗できる Javascript のコヌドも、同様に控えおおいお䞋さい。 クラむアントサむドの蚭定 クラむアントサむドの蚭定を入れおいきたす。 index.html 通知を受けるブラりザで開く HTML / JavaScript になりたす。 index.html の党䜓はこちらになりたす。 https://github.com/medi-y-sato/fcm-test-node/blob/master/index.html 蚭定の投入が必芁です、䞋蚘。 <script src="https://www.gstatic.com/firebasejs/3.4.1/firebase.js"></script> <script> var config = { apiKey: "<<CHANGE HERE>>", authDomain: "<<CHANGE HERE>>", databaseURL: "<<CHANGE HERE>>", storageBucket: "<<CHANGE HERE>>", messagingSenderId: "<<CHANGE HERE>>" }; firebase.initializeApp(config); </script> [りェブアプリに Firebase を远加]の所で控えたコヌドを、そのたた貌り付けたす。 これで、このペヌゞ内で Firebase のサヌビスが䜿甚できるようになりたす。 <link rel="manifest" href="manifest.json"> Web アプリの蚭定を蚘述する manifest ファむルを指定したす。 䞭身に぀いおは埌述。 if ('serviceWorker' in navigator) { console.log('Service Worker is supported'); navigator.serviceWorker.register('./serviceworker.js').then(function(reg) { console.log('Service Worker is ready :^)', reg); reg.pushManager.subscribe({userVisibleOnly: true}).then(function(sub) { console.log('subscribed:' , sub) console.log('endpoint:', sub.endpoint); var iframe = document.createElement("iframe"); iframe.src = './send?endpoint=' + sub.endpoint; iframe.width = 1 iframe.height = 1 document.body.appendChild(iframe); }); }).catch(function(error) { console.log('Service Worker error :^(', error); }); } ブラりザに Service Worker が存圚した堎合に、 serviceworker.js を登録、成功したら Push 通知の賌読を行い、それにも成功したら iframe を䜜成しおサヌバ偎に Endpoint を送信したす。 ….別にこんな広告っぜい情報送信の仕方しなくおも良いんですけど、今回はお手軜さ重芖で自動送信するようにしおみたした。実際に䜿甚する堎合はボタン契機で XMLHttpRequest するようにしおみおもいいですし、ナヌザ登録などのフロヌに混ぜ蟌む圢にしおもいいず思いたす。 serviceworker.js こちらが Service Worker ずしお登録されるスクリプト本䜓になりたす。 serviceworker.js の党䜓はこちらになりたす。 https://github.com/medi-y-sato/fcm-test-node/blob/master/serviceworker.js install / activate / push / notificationclick のむベントリスナを仕蟌んでありたすが、実際にコヌドを曞いおあるのは push ず notificationclick の2぀になりたす。 self.addEventListener('push', function(event) { console.log('Push message received', event); event.waitUntil( self.registration.showNotification('Push Received', { body: 'メッセヌゞを受信したした', icon: './corp_logo.png', tag: 'push-notification-tag' }) ); }); こちらが Push 通知を受け取った際の凊理。 今回は通知りむンドりをそのたた衚瀺しおみるこずにしたした。 self.registration ( ServiceWorkerRegistration ) の showNotification メ゜ッド を呌ぶず、ブラりザが通知をよしなに衚瀺しおくれたす。 もちろん䜕の凊理を曞いおもいいので、 push を契機に特定の API を叩きに行っお Service Worker 内のキャッシュを曎新するずか、 showNotification で衚瀺したい䞭身を改めお API アクセスしお取埗するずか、色んな事が出来たす。 self.addEventListener("notificationclick", function(event) { console.log('notification clicked:' + event) event.notification.close(); }, false); こちらは通知りむンドりをクリックされた時の凊理。単に通知りむンドりをクロヌズしおいたす。 clients.openWindow() ずかを䜿っお、通知りむンドりがクリックされたら特定のURLを開く、なんおこずも出来るでしょう。 manifest.json manifest.json は web アプリの蚭定を蚘述する所です。 manifest.json の党䜓はこちらになりたす。 https://github.com/medi-y-sato/fcm-test-node/blob/master/manifest.json 蚭定が必芁な堎所がありたす、䞋蚘。 "gcm_sender_id": "<<CHANGE HERE>>", 先ほど控えた 送信者ID を、ここに蚘茉しお䞋さい。 gcm (google cloud messaging) ずか曞いおありたすが、 fcm (firebase cloud messaging) でもこのフィヌルド名を䜿甚したす。 これで、この Service Worker が Firebase Cloud Messaging の埅ち受けを行えるようになりたす。 サヌバサむドの蚭定 サヌバサむドは二段構えです。 index.html などのファむルをホストする server.js ず、実際に push 通知を送信する pushMessage.js コマンドラむンツヌル。 server.js Service Worker の皌働条件ずしお https もしくは localhost が必芁 、ずいうものがあったので、 localhost でサヌバ立おるために甚意したした。 実は先ほど甚意した index.html などをロヌカルのブラりザなどで開いおも、Service Worker は皌働しおくれないのです。 ずはいえいちいち Firebase Web Hosting などの https 環境にデプロむするのも面倒だったので、手軜にロヌカルで皌働できるサヌバを䜜っちゃいたした。 server.js の党䜓はこちらになりたす。 https://github.com/medi-y-sato/fcm-test-node/blob/master/server.js こちらを䜜るにあたっおの倧郚分に぀いお、 node.jsでシンプルなwebサヌバヌ を参考にさせおいただきたした、ありがずうございたす。 䞋蚘のようにしお起動したす。 $ node server.js デフォルトでポヌト 8888 で埅ち受けるので、 http://localhost:8888 をブラりザで開いお䞋さい。 こちらの芁になるのは䞋蚘。 if (uri === '/send'){ if(req.method=='GET') { var url_parts = url.parse(req.url,true); var match = /https:\/\/android.googleapis.com\/gcm\/send\/(.*)/ endpoint = match.exec(url_parts.query.endpoint)[1] console.log('receive endpoint : ' + endpoint) console.log('use this command line to send pus message') console.log('$ node pushMessage.js -e ' + endpoint) res.writeHead(200, {"Content-Type": "text/plain"}); res.write("accepted\n"); res.end(); } } /send がリク゚ストされた時に発火する凊理で、 index.html の iframe から呌び出されたリク゚ストを受け取り、 endpoint を切り出しおコン゜ヌルに出力しおいたす。それだけ。 use this command line to send push message $ node pushMessage.js -e <<endpoint>> この行をコピペすれば Push 送信コマンドが送れたす。ものぐさですね。 実のずころ、 index.html の時点で endpoint を Web ペヌゞなり console.log() なりに出力し、それをコピペしお送信コマンドをこさえる、ずいう方法でも党く問題ないのですが、Chrome Developer Toolを開くのすら面倒だなあ、ず思っちゃったのでこんな仕組みにしおありたす。 Push 通知を送るコヌド pushMessage.js こちらが、 Firebase Cloud Messaging に察しお Push 通知を送るよう指瀺を出すスクリプトになりたす。 pushMessage.js の党䜓はこちらです。 https://github.com/medi-y-sato/fcm-test-node/blob/master/pushMessage.js 蚭定が䞀぀必芁です。 var authKey = '<<CHANGE HERE>>' こちらに、クラりドメッセヌゞングのずころで控えた サヌバキヌ を入れお䞋さい。 送信の芁になるのは䞋蚘です。 var options = { url: apiUrl, method: 'POST', headers: { 'Content-Type':'application/json', 'Authorization':'key=' + authKey }, json: true, form: { "to" : endpoint } } request を䜿甚しお FCM の API を叩くこずになるのですが、そのための諞々のパラメヌタになりたす。倧事なのは䞋蚘3぀。 method は POST リク゚ストヘッダの Authorization にサヌバキヌを指定 デヌタペむロヌドは body ではなく form を䜿甚 䞀応、䜿い方は䞋蚘のようになりたす。 $ node pushMessage.js -e <<endpoint>> 先ほど server.js が出力しおくれた内容をそのたたコマンドラむンで実行すれば、ブラりザで埅ち受けおいる Service Worker に Push が飛び、 Service Worker に登録されおいるむベントリスナが発火しお、通知りむンドりが衚瀺されたす。 たずめ 元々 Cordova / ionic2 で Push 通知を行うために調べ始めた Firebase Cloud Messaging ですが、 意倖に簡単に Web Push たで実装できおしたったので驚きたした。 この送信郚分はそのたた Android / iOS ぞの Push 通知にも䜿えおしたうので、 Firebase Cloud Messaging を採甚するず、バック゚ンドが考えるこずがすごく少なく枈みそうです。 たた、 Service Worker に぀いおもなんか面倒そうなむメヌゞが有りたしたが、こず Push 受信に関しおは、やっおいるこずはわりかし単玔です。 もっず蚀うず、この Web Push ずいう仕組みは Service Worker に登録されたむベントリスナを発火させる 機胜、なので、通知以倖の䜿いかたをいろいろ考えおみるず、新しいサヌビスのネタにもなるかもしれたせんね。 今回の蚘事では党く觊れおいたせんが、 Firebase にはプロバむダを耇数から遞べる ID 認蚌の基盀もありたすし、リアルタむム Sync が売りのデヌタベヌスもありたす。 Firebase は SDK が匷力なため、殆どコヌドを曞かずにこれらの機胜を䜿甚でき、お手軜感が玠晎らしいです。 チャットアプリをデプロむするチュヌトリアル 蟺りから、パワフルさを䜓感しおみお䞋さい。 そんなわけで Firebase Database に怜玢機胜远加垌望
こんにちは、広告システム開発郚Emacs掟の吉田です。 先月(2016幎9月14日)に出たEmacs 25.1で、 Emacsのバッファでwebブラりザが動かせる機胜がリリヌスされたした しかしXWidgetsはgtk3環境のみ動䜜なので、CocoaなMacでは動かないんです。 でもX11でどうにか動かす事ができたのでその方法を蚘茉したす 参考 Emacs 25.1 released 参考 Configure.ac#L2590 | Enable xwidgets if GTK3 and WebKitGTK+ are available. 参考 GNU Emacs For Mac OS X | XWidget support ? #52 mac portsをむンストヌル www.macports.org からむンストヌラヌ拟っおむンストヌル webkit-gtk3をむンストヌル $ sudo port install webkit-gtk3 Emacs 25.1の゜ヌスコヌドを展開 $ cd /usr/local/src/ $ wget https://ftp.gnu.org/gnu/emacs/emacs-25.1.tar.xz $ tar xzf emacs-25.1.tar.xz (tarはJオプション必芁かもしれない) ビルド&むンストヌル $ cd /usr/local/src/emacs-25.1 $ sh autogen.sh $ ./configure --with-xwidgets --with-x-toolkit=gtk3 --without-ns --with-gif=no $ make $ sudo make install (configureのオプションはお奜みでどうぞ) 起動 $ /usr/local/bin/emacs XWidgetsを詊す M-x xwidget-webkit-browse-url スクリヌンショット 感想 おずなしくTerminal版( emacs -nw )䜿っおおきたす。
はじめに はじめたしお、メディアシステム開発郚の森ず申したす。 䞻にauスマヌトパスの䞀郚サヌビスの開発呚りを担圓しおいたす。 皆様はAWS OpsWorksは利甚されおいたすか AWS OpsWorks(以埌OpsWorksず衚蚘)ずは、EC2やELBずいったAWSリ゜ヌスをスタックずいう単䜍にたずめお管理や運甚ができる゜リュヌションです。 Webサヌビスの保守、運甚に必芁な情報むンスタンスの台数や皌働状況 が集玄されおいる䞊、Chefのレシピさえ䜜っおしたえばアプリのデプロむからミドルりェアアップデヌトたで、管理コン゜ヌルから䞀通り熟せる優れものです。 詳现は 公匏 をご芧ください。 Time-basedむンスタンスっお OpsWorksには皌働スケゞュヌルを “曜日” ず “時間” で指定できる Time-basedむンスタンス ずいうものを䜜る事ができたす。 これは、アクセスの倚い曜日や時間垯が事前に予枬できるサヌビスであれば、 ピヌクに備えおむンスタンス数を増やしたり、逆に深倜垯は必芁最䜎限のむンスタンスのみを動かしお他は停止しおおく、ずいった皌働スケゞュヌルを予め蚭定するこずが可胜ずなる䟿利な機胜です。 個人的な所感ですが、オヌトスケヌルではないので、決められた運甚コスト内でやりくりするサヌビスに向いおいるず思いたす。各むンスタンスの負荷状況はOpsWorks䞊で、たずめおモニタリングできたすし 蚭定倉曎も簡単で、コン゜ヌル䞊からポチポチずクリックするだけです。 コン゜ヌル䞊の時間の衚蚘はUTCなので泚意。 Time-basedのちょっず䞍䟿な所 倧倉䟿利な機胜なのですが、欠点もありたす。 蚭定は1時間単䜍 コン゜ヌル䞊で蚭定できるのは 1時間単䜍 なので、むンスタンス数が倚かったり24時間党郚に察しお蚭定倉曎が必芁だったりするず、延々ずクリックをし続ける必芁がありたす。 10台以䞊の蚭定をしないずいけない堎合は挫けそうになりたす。 蚭定は曜日ベヌス 前述の通り蚭定できるスケゞュヌルは “曜日ベヌス” ですので、毎月X日に皌働したいor停止させたいずいった蚭定はできたせん。せいぜいが察象日に圓たる曜日蚭定を数日前に倉曎しお察応ずいったこずが出来る皋床です。(それでも充分かもしれたせんが) 欠点を無理やり解消しおみる 前眮きが長くなりたしたが、前述の欠点を解消するべく少し工倫しおみたす。 蚭定の䞀括倉曎 たずはTime-based蚭定を曜日単䜍で䞀気にやる方法から。 ずいっおも、これは特別な工倫も䜕も必芁なく、AWS CLIにTime-basedの蚭定倉曎コマンドが存圚したすので、それを䜿えば蚭定の䞀括倉曎は簡単にできたす。 公匏ドキュメント を元に、䞀぀コマンドを䜜っおみたす。 aws opsworks --region us-east-1 set-time-based-auto-scaling --instance-id むンスタンスID(OpsWorks ID) --auto-scaling-schedule '{"Monday": {"0": "on","1": "on"}、,"Friday": {"0": "on","1": "on"}}' 基本的なパラメヌタは他のCLIず倧差なく、このコマンド特有のパラメヌタは皌働蚭定の内容を枡すための"–auto-scaling-schedule"くらいでしょうか。 皌働蚭定は䞊蚘䟋の通りjson圢匏で蚭定したす。こちらも時間はUTCでの蚘述ずなるので、日本の堎合は+9時間であるこずに泚意したしょう。 この䟋の堎合、 月曜日ず金曜日の9時台および10時台だけ察象のむンスタンスを皌働させる ずいうスケゞュヌル蚭定になりたす。(正確には9:00からむンスタンスを立ち䞊げ始める) ちなみに {"Monday": {}、,"Friday": {}} ずいう蚭定だず、 月曜日ず金曜日は皌働しない ずいう蚭定になりたす。 擬䌌的な日付ベヌスの皌働スケゞュヌル蚭定 CLIのコマンドを利甚し、日付ベヌスで皌働スケゞュヌル蚭定をするシェルを倧雑把にですが䜜っおみたした。 今回䜜ったシェルの抂芁は、 前提ずしお毎日深倜に本シェルを実行する。 察象むンスタンスに察し、日単䜍で皌働スケゞュヌルを䞋蚘条件で蚭定しおいく 毎月2日ず22日 スマパスの日ですね )は9:00翌9:00皌働させる。 それ以倖の日は皌働停止。 シェル実行日圓日ずその次の日は蚭定察象から倖す。 ずいった内容です。 3に関しおは蚭定ファむルのミス等により、いきなり圓日の皌働スケゞュヌルが倉わっおしたった等ずいう事態を避ける為の保険です。 たずは"–auto-scaling-schedule"に入れる皌働スケゞュヌル蚭定のテンプレヌトを䜜りたす。 今回の皌働スケゞュヌルパタヌンは2぀のみです。 フル皌働蚭定のテンプレヌト(time_based_full.json) {"%Target%":{ "0": "on", "1": "on", "2": "on", "3": "on", "4": "on", "5": "on", "6": "on", "7": "on", "8": "on", "9": "on", "10": "on", "11": "on", "12": "on", "13": "on", "14": "on", "15": "on", "16": "on", "17": "on", "18": "on", "19": "on", "20": "on", "21": "on", "22": "on", "23": "on" }} 皌働停止蚭定のテンプレヌト(time_based_off.json) {"%Target%":{}} %Target%は、蚭定察象日の曜日に眮換する文字列です。 次に、どの日にどの皌働スケゞュヌルを蚭定するかのカレンダヌみたいなものを䜜りたす。 皌働蚭定カレンダヌ(time_based_calendar.json) {"Schedule": { "full": [ "2", "22" ] } } 最埌に蚭定察象ずするむンスタンスのリストを䜜りたす。今回はAz-aしか䜿っおいたせんが、Az-cも察象ずする堎合は"AzC"の配列を远加すればOKです。 蚭定察象のむンスタンスリスト(instance.json) {"Instance":{ "AzA": [ "むンスタンスID(OpsWorks ID)その", "むンスタンスID(OpsWorks ID)その" ] } } 以䞊4぀の蚭定jsonファむルを䜿っお、日付ベヌスによる皌働スケゞュヌル蚭定の本凊理䜜りたす。 実行sh(opsworks_timebased_ctl.sh) 1 #!/bin/bash 2 target_date_list=(`cat ./time_based_calendar.json |jq -r '.Schedule.full[]|@text'`) 3 4 for i in {2..6}; do 5 # スケゞュヌルを操䜜する察象日を取埗したす。 6 # [0]・・・日、[1]・・・曜日 7 target_day=(`LANG=en_US.UTF-8 date -v+${i}d "+%d %A"`) 8 9 if `echo ${target_date_list[@]} | grep -q "${target_day[0]}"` ; then 10 schedule_type="full" 11 else 12 schedule_type="off" 13 fi 14 15 target_schedule=`cat ./time_based_${schedule_type}.json |sed -e "s/%Target%/${target_day[1]}/"` 16 17 for instance in `cat ./instance.json |jq -r '.Instances.AzA[]|@text'` 18 do aws opsworks --region us-east-1 set-time-based-auto-scaling --instance-id ${instance} --auto-scaling-schedule "${target_schedule}" 19 done 20 done ・行目 皌働蚭定カレンダヌから、フル皌働(full蚭定)させる日を取埗し、 target_date_list 配列に入れたす。 ・4行目以降のfor分 実行日の明埌日〜6日埌たでの日付を凊理したす。 6日埌たでなのは、元々が曜日ベヌスでの蚭定だからですね。 ・7行目 蚭定察象である実行日のi日埌の日付日のみず、その曜日を取埗しお target_day 配列に入れたす。 ・9行目13行目のif文 蚭定察象日の皌働スケゞュヌルパタヌンを蚭定したす。 今回の堎合、フル皌働蚭定の察象日配列 target_date_list に蚭定察象日が存圚した堎合は、time_based_full.jsonの内容で皌働スケゞュヌルを蚭定したす。 それ以倖は停止させるので、time_based_off.jsonの内容を蚭定したす。 15行目 蚭定テンプレヌトの%Target%を7行目で取埗した蚭定察象日の曜日文字列に差し替えお、 target_schedule に入れたす。 ・17行目〜19行目 CLIでTime-basedの蚭定を、むンスタンスの台数分for実行しおいたす。 実行環境等により倚少の手盎しは必芁かもしれたせんが、動かすだけであれば䞊蚘のファむル䞀匏を同じディレクトリ内に配眮すればOKです。 毎日深倜0時など日次でシェルを動かせば、毎月2日ず22日に関しおは、垞にその6日前には察象むンスタンスのフル皌働蚭定が完了しおいたす。 完璧にはただ遠い 結構倧雑把なんで、真に日付ベヌスの蚭定に察応させるには、ぱっず思い浮かぶだけでも 月末だけ動かしたいずいうパタヌンには察応できおいない。 時間が9:00翌日9:00ずいうUTCベヌスでの蚭定ずなっおいる。 0:00翌日0:00ずいった24時間蚭定をきちんずやるには、蚭定察象日ず合わせお、その前日の皌働スケゞュヌルも䞀緒に倉曎する必芁あり。 正盎このレベルなら、cronで察象日の早朝にでもむンスタンスを立ち䞊げるCLIを発行するシェルを実行したほうが楜じゃないのか ずいった点を解決する必芁がありたす・・・。 たずめ 拙いコヌドで倧倉恐瞮ではありたすが、OpsWorks䞊で日付ベヌスのむンスタンス皌働スケゞュヌルを蚭定したい時に、参考ずしお少しでもお圹に立おれば幞いです。 たぁ、OpsWorksに日付ベヌスで皌働蚭定ができる機胜を実装しおもらうのがBestなのですが・・・。 コヌドをガリガリず曞くずいうこずが最近は枛っおきおいたのですが、こういった限られた材料から自分の欲しい機胜をどう実珟するかずいう詊行錯誀は、久々にやっおみおもやっぱり楜しかったです。
こんにちは、むンフラストラクチャヌ郚の沌沢です。 耇数の AWS アカりントを運甚しおいるず、それぞれのアカりントの S3 バケットに CloudTrail のログが溜たっおいきたすが、そのログ、1箇所に集玄しお監芖や可芖化をしたくはありたせんか そこで今回は、耇数の AWS アカりント䞊にそれぞれ保存されおいる CloudTrail ログを集玄・可芖化する仕組みに぀いおです。 構成図 ① CloudTrail が S3 にログを Put したのをトリガヌに、集玄先に甚意しおいる Lambda を起動 ② Lambda から S3 ぞログを取りに行くRoleで暩限委譲しお取埗 ③ Lambda でログファむルを展開し、内容を無加工で CloudWatch Logs に投入 ④ CloudWatch Logs からストリヌミングで Elasticsearch Service にログを流す では、これを構築する手順を解説しおいきたす。 構築手順 000000000000 は A環境集玄元の AWS アカりント ID で読み替えたしょう 999999999999 は B環境集玄先の AWS アカりント ID で読み替えたしょう 今回は東京リヌゞョンap-northeast-1に構築するこずを前提ずしおいたす ② に関しおは某ブログの䌚瀟の「 S3保管したCloudTrailログに別アカりントのLambdaからアクセスする 」を倧いに参考にしおいたす B環境に Elasticsearch Service のドメむン䜜成 AccessPolicy ↓ { "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Principal": { "AWS": "*" }, "Action": "es:*", "Resource": "arn:aws:es:ap-northeast-1:999999999999:domain/蚭定したドメむン名/*", "Condition": { "IpAddress": { "aws:SourceIp": "xxx.xxx.xxx.xxx/32" } } } ] } Condition -> IpAddress で、Kibana ぞのアクセスを xxx.xxx.xxx.xxx のみに制限 AccessPolicy 以倖は党お任意に蚭定 B環境に CloudWatch Logs のロググルヌプ䜜成 ロググルヌプ名: 任意のロググルヌプ名 ログストリヌム名: 任意のログストリヌム名 䜜成したロググルヌプにチェックを入れ、以䞋の通り蚭定 アクションから「Amazon Elasticsearch Service ぞのストリヌミングの開始」を遞択 Amazon ES クラスタヌ: ↑で䜜成した Elasticsearch Service のドメむンを指定 ログの圢匏: AWS CloudTrail A環境で暩限委譲甚の IAM ロヌル/カスタムポリシヌを䜜成 以䞋の条件でカスタムポリシヌを䜜成 ポリシヌ名: 任意 ポリシヌJSON ↓ { "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": [ "s3:Get*", "s3:List*" ], "Resource": "arn:aws:s3:::CloudTrailのログ出力先のバケット名/*" } ] } 以䞋の条件でロヌルを䜜成 ロヌル名: 任意 ロヌルタむプ: クロスアカりントアクセスのロヌル -> 所有しおいる AWS アカりント間のアクセスを提䟛したす アカりントID: 999999999999 ポリシヌ ↑で䜜成したカスタムポリシヌ B環境の Lambda 甚の IAM ロヌル/カスタムポリシヌを䜜成 以䞋の条件でカスタムポリシヌを䜜成 ポリシヌ名: 任意 ポリシヌJSON ↓ { "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": [ "sts:AssumeRole" ], "Resource": [ "*" ] } ] } 以䞋の条件でロヌルを䜜成 ロヌル名: 任意 ロヌルタむプ: AWS サヌビスロヌル -> AWS Lambda ポリシヌ ↑で䜜成したカスタムポリシヌ AmazonS3FullAccess  ※バケットを絞るなどは適宜行っおください AWSLambdaExecute B環境に Lambda ファンクション䜜成 ファンクション名: 任意 Runtime: Python2.7 Handler: lambda_function.handler Role: B環境に䜜成した Lambda 甚の IAM ロヌル Timeout: 10 sec ゜ヌスコヌドは こちら 䜜成されたファンクションの ARN のメモを取っおおきたしょう A環境の S3 バケットから B環境の Lambda を実行するための暩限を Lambda に付䞎する 2016幎09月珟圚、ManagementConsole からではからこの蚭定ができないため、CLI で暩限を付䞎 $ aws lambda add-permission \ --region ap-northeast-1 \ --function-name 察象のLambdaFunction名 \ --statement-id 任意で䞀意ずなるID \ --principal s3.amazonaws.com \ --action lambda:InvokeFunction \ --source-arn arn:aws:s3:::CloudTrailのログ出力先のバケット名 \ --source-account 000000000000 A環境の CloudTrail 甹 S3 バケットにむベント登録 察象のバケットを遞択し、プロパティを衚瀺 むベント -> 「通知の远加」 -> 以䞋を入力/遞択しお「保存」 名前: 任意 むベント: Put 送信先: Lambda 関数 Lambda 関数の ARN を远加 Lambda 関数の ARN: 䜜成したB環境の Lambda ファンクションの ARN CloudTrail のログが耇数のバケットにある堎合は必芁な分だけ䞊蚘を登録 たずめ 䞊蚘の蚭定が完了するず、S3 に CloudTrail のログが出力される床に Lambda が起動し、CloudWatch Logs を経由しお Elasticsearch にログが攟り蟌たれるこずになりたす。 あずは、Elasticsearch の Kibana の URL にアクセスし、奜きに閲芧しおみおください。 なお、途䞭に CloudWatch Logs を経由しおいたすので、ここでログ監芖を入れるこずも可胜です。 たた、今回は簡単に可芖化を実珟するために Elasticsearch Service を利甚したしたが、Elasticsearch Service では、構築時にディスクサむズを決める必芁があるため、集玄したい環境が増えおいくず、ディスクが足りなくなる可胜性がありたす。 可芖化郚分を自分で実装する手間をかけられるのであれば、Lambda から DynamoDB にログを攟り蟌んで、可芖化郚分を自力で実装するようにすれば、ディスクサむズを気にしなくお枈みたすね。 この構成をもずに、いろいろアレンゞしおみおください。
こんにちは、広告システム開発郚 山浊です。 2回目の投皿ずなりたす今回は、LINE BOT APIでBOTを䜜成しおみたいず思いたす。 LINE BOT APIずは サヌビスずLINEナヌザずのコミュニケヌションを可胜にするAPI開発が行えるものです。 ただトラむアルの状態であるためデフォルトでは友だち䞊限数が50人たでに制限されおいたり、䜿甚可胜な機胜がメッセヌゞの送受信皋床に限られおいたす。 2016幎に突劂ChatBotが盛り䞊がったのは蚘憶に新しいずころですが、 このLINE BOT APIの発衚もその芁因の䞀぀だず蚀われおいたす。 䜕を䜜るか 倚くの人は毎日なにげなく倩気をチェックしおいるず思いたす。 い぀もの堎所ならアプリにお気入り登録しおいるかもしれたせんが、お出かけ先など知らない地名から倩気を怜玢するのはなかなか面倒だったりしたす。 そんなちょっずしたストレスを解消するために、LINE API BOTず䜍眮情報を䜿っお簡単な倩気怜玢を䜜っおみるこずにしたした。 䜜成の前に LINE BOT APIを利甚するためには、Developerアカりントが必芁なので取埗したす。 https://business.line.me/ja/products/4/introduction 登録しただけでは利甚できず、若干高いハヌドルを超える必芁がありたす。 Callback URLにはHTTPSを必ず指定するこず APIサヌバヌのOutbound IPアドレスが固定されおいるこず これらをクリアするためにHTTPS通信が行えるHerokuず、Outbound IPを固定できるアドオンFixieを䜿甚したすので、 Herokuにアプリを䜜成しFixieを適甚しおおきたす。 䜜成 それでは早速䜜成しおいきたす。 開発環境 Go 1.6 Heroku + Fixieアドオン OpenWeatherMap API LINE BOT APIにホワむトリストIPアドレスを登録 FixieのAccount Detailsに衚瀺されおいるIPを、LINE BOT API偎に登録したす。 LINE BOT APIはこのIPアドレスからのみメッセヌゞを受信したすので、忘れずに蚭定したす。 LINE BOT APIにアクセスする 圓蚘事のメむンパヌトです。 LINEがGo蚀語甚のSDKを提䟛しおいるので、そちらを利甚するのがよいず思いたす。 https://github.com/line/line-bot-sdk-go たた倩気の取埗にはOpenWeatherMap APIを利甚したす。 OpenWeatherMapずは、様々な気象デヌタを無料APIずしお提䟛しおいる倧倉䟿利なサヌビスです。 http://openweathermap.org/ 早速ですが、䜜成したサンプルコヌドず䜜成にあたっおの芁点をたずめたした。 package main import ( "encoding/json" "fmt" "io/ioutil" "log" "net/http" "net/url" "os" "strconv" "github.com/line/line-bot-sdk-go/linebot" ) // Wdata represents Json core fields. type Wdata struct { Weather []Weather `json:"weather"` Info Info `json:"main"` } // Weather represents weather item. type Weather struct { Main string `json:"main"` Icon string `json:"icon"` } // Info represents main item. type Info struct { Temp float32 `json:"temp"` // æ°—æž©(ケルビン) Humidity float32 `json:"humidity"` // 湿床 } func main() { port := os.Getenv("PORT") if port == "" { port = "8080" } // Proxyの蚭定 proxyURL, _ := url.Parse("") client := &http.Client{ Transport: &http.Transport{Proxy: http.ProxyURL(proxyURL)}, } bot, err := linebot.NewClient(Channel ID, "Channel Secret", "MID" linebot.WithHTTPClient(client)) if err != nil { fmt.Println(err) return } //コヌルバック http.HandleFunc("/callback", func(w http.ResponseWriter, req *http.Request) { // メッセヌゞ受信 received, err := bot.ParseRequest(req) if err != nil { fmt.Println("ParseRequest error:", err) return } for _, result := range received.Results { content := result.Content() if content != nil && content.IsMessage && content.ContentType == 7 { // 緯床経床から倩気問い合わせのURLを䜜成 location, _ := content.LocationContent() lat := strconv.FormatFloat(location.Latitude, 'f', 6, 64) lon := strconv.FormatFloat(location.Longitude, 'f', 6, 64) u := "http://api.openweathermap.org/data/2.5/weather?lat=" + lat + "&lon=" + lon + "&APPID=APP ID" // 倩気情報を取埗 resp, _ := http.Get(u) defer resp.Body.Close() byteArray, _ := ioutil.ReadAll(resp.Body) jsonBytes := ([]byte)(string(byteArray[:])) wdata := new(Wdata) if err := json.Unmarshal(jsonBytes, wdata); err != nil { fmt.Println("JSON Unmarshal error:", err) return } //メッセヌゞ送信 _, senderr := bot.NewMultipleMessage(). AddText("珟圚の倩気をお知らせしたす。"). AddText("倩気 : "+wdata.Weather[0].Main). AddImage("http://openweathermap.org/img/w/"+wdata.Weather[0].Icon+".png", "http://openweathermap.org/img/w/"+wdata.Weather[0].Icon+".png"). AddText("æ°—æž© : " + fmt.Sprintf("%.2f", (wdata.Info.Temp-273.15))). AddText("湿床 : " + fmt.Sprintf("%.2f", wdata.Info.Humidity)). Send([]string{content.From}) if senderr != nil { fmt.Println("message error:", senderr) } } else { bot.SendText([]string{content.From}, "䜍眮情報を送信しおください。") } } }) if err := http.ListenAndServe(":"+port, nil); err != nil { fmt.Println("port error:", senderr) } } 芁点をたずめおいきたす。 プロキシの蚭定 FIXIEのProxy URLを蚭定するこずでOutbound IPが有効になりたすので忘れずに蚭定したす。 proxyURL, _ := url.Parse("") client := &http.Client{ Transport: &http.Transport{Proxy: http.ProxyURL(proxyURL)}, } 䜍眮情報の取埗 どの地域の倩気情報が欲しいかをBOTに䌝えるため、䜍眮情報(緯床経床)を取埗したす。 BOTが受信するメッセヌゞはcontentに栌玍されおおり、䞋蚘のようなパラメヌタを持っおいたす。 プロパティ名 詳现 id メッセヌゞID contentType メッセヌゞの皮類 from 送信者のMID createdTime メッセヌゞ送信時間 to メッセヌゞの受信者 toType メッセヌゞを受信するナヌザのタむプ contentMetadata メッセヌゞのメタデヌタ text 送信されたメッセヌゞ location 䜍眮情報 䜍眮情報メッセヌゞ以倖を受信した堎合は䜕も凊理したくないので、【䜍眮情報を送信しおください。】ずいうメッセヌゞを送信したいず思いたした。 この時泚目するのが【contentType】で、これにはどのような皮類のメッセヌゞをナヌザが送ったかが栌玍されたす。 contentTypeの倀 詳现 1 テキストメッセヌゞ 2 画像メッセヌゞ 3 動画メッセヌゞ 4 音声メッセヌゞ 7 䜍眮情報メッセヌゞ 8 スタンプメッセヌゞ 10 ナヌザ情報メッセヌゞ 凊理したいのは contentType : 7の䜍眮情報メッセヌゞのため、それ以倖は凊理しないように分岐を蚭ける堎合は content.ContentType == 7 ずすればよいこずが分かりたす。 䜍眮情報メッセヌゞが送信された堎合、locationプロパティに情報が栌玍されたす。(それ以倖はnil) プロパティ名 詳现 title 䜍眮情報名、通垞は䜏所 latitude 緯床 longitude 経床 ここでようやく 䜍眮情報(緯床・経床) の取埗ができたした。 倩気情報の取埗 倩気情報の取埗にはOpenWeatherMap APIを利甚したす。 本題ずはズレたすが、OpenWeatherMap APIの利甚方法を簡単に玹介したす。 倩気を怜玢する時のキヌには、地域名・地域コヌド・緯床経床のいずれかが利甚可胜ですが、緯床経床を取埗できおいるので悩むこずなくそれを利甚したす。 http://api.openweathermap.org/data/2.5/weather?lat= <"latitude">&lon=<"longitude">&APPID=<"App ID"> latには緯床、lonには経床を指定し、APIアクセスを行うず倩気情報JSONが返っおきたす。 APPIDはOpenWeatherMapのwebペヌゞから取埗可胜なので、別途取埗しおおきたす。もちろん無料です。 メッセヌゞの送信 いよいよメッセヌゞ送信郚分です。 ひずえにメッセヌゞ送信ずいっおも色々ありたすが、今回は぀の送信方法を実装しおいたす。 どちらも送信先を指定するためにはMIDずいうナヌザ特定IDが必芁なのですが、ナヌザからのメッセヌゞ受信時に䞀緒に受け取っおいる(䞊蚘衚のfromに該圓)ので、それをそのたた䜿うのが䞀番簡単です。 䜍眮情報メッセヌゞ以倖の堎合、Sending messages API bot.SendText([]string{content.From}, "䜍眮情報を送信しおください。") 倩気情報を送信する堎合、Sending multiple messages API bot.NewMultipleMessage(). AddText("珟圚の倩気をお知らせしたす。"). AddText("倩気 : "+wdata.Weather[0].Main). AddImage("http://openweathermap.org/img/w/"+wdata.Weather[0].Icon+".png", "http://openweathermap.org/img/w/"+wdata.Weather[0].Icon+".png"). AddText("æ°—æž© : " + fmt.Sprintf("%.2f", (wdata.Info.Temp-273.15))). AddText("湿床 : " + fmt.Sprintf("%.2f", wdata.Info.Humidity)). Send([]string{content.From}) Sending messages APIでは1送信1メッセヌゞですが、Sending multiple messages APIでは1送信nメッセヌゞずなっおいるのが特城です。 この他にもむンタラクティブなメッセヌゞが送れる Sending rich messages API ずいうものもあり、商甚利甚する際はメッセヌゞの䜜りこみが重芁になっおくるように思いたす。 Herokuぞデプロむ 最埌にHerokuぞデプロむしたす。 Herokuの動䜜に必芁なProcfileを䜜成したす。 $ cd $GOPATH/src/line-bot-api $ echo 'web: line-bot-api' > Procfile 続いおラむブラリの䟝存関係をgodepを利甚しお保存したす。 $ go get -u github.com/tools/godep $ cd $GOPATH/src/line-bot-api $ godep save ./... $ godep go install ./... 最埌にHerokuぞ゜ヌスをPUSHしたす。 $ cd $GOPATH/src/line-bot-api $ git init $ heroku git:remote -a $ git add . $ git commit -m "hoge" $ git push heroku master 動䜜確認 ちゃんずBOTは倩気を教えおくれるのでしょうか。枋谷区の倩気を聞いおみたす。 ちゃんず教えおくれたした地図から堎所さえ䌝えおあげれば自動的に倩気を返しおくるBOTができたので、日々のストレスから少し開攟されそうです。 (OpenWeatherMapが甚意しおいる倩気アむコンがボダケおしたっおいるのがやや残念です。) 䜍眮情報を送っおから結果が返っおくるたで、おおよそ1~2秒皋床なのでストレスを感じるこずもありたせんでした。 たずめ LINE BOT APIはSDK利甚するこずで簡単に利甚できるこずが分かりたした。 特に䜍眮情報の利甚が非垞に簡単なのは驚きでした。 Callback URLはHTTPSしか利甚できないこずや、固定IPを蚭定しなければならないなどの若干のハヌドルはあるものの、アむディア次第で有効掻甚できるのではないでしょうか。 正匏リリヌスでさらに機胜が拡充されるようなので、他にもBOTを䜜っおいければず思いたす。
こんにちは。制䜜郚の西野です。 このmediba Creator × Engineer ブログの立ち䞊げ担圓をしおおりたした。 9月でブログの開蚭から1幎になりたすので、少し早いですが振り返りをしようず思いたす。 ブログ立ち䞊げの背景 このブログは、medibaの゚ンゞニア、デザむナヌが最近経隓したこず、興味があっお調べたこず、孊んだこずを投皿しおいるブログです。 medibaの開発のこずをもっず知っおもらいたい サヌビスを開発、運甚する䞊で貯めたナレッゞを瀟内倖に共有したい 技術を広めるこずで瀟䌚貢献に繋げたい ずいう思いから䜜られたした。 数倀で振り返る 瀟内の゚ンゞニア、デザむナヌが週に1床蚘事を投皿しおおり、初回投皿から玄1幎が経過した今では蚘事数は45件超ずなりたした。 蚘事数が増えるに぀れ、順調にPV数も増加しおいたす。1幎前ず比范するずPVは玄10倍になりたした。 プロゞェクトの進め方や、新しい技術に関する共有、䟿利なツヌルのtipsなど蚘事の皮類も様々ですが、 その䞭でもブログ開蚭から1幎間で特にアクセス数が倚い蚘事はこちらです。 Cloud Vision APIの画像認識粟床を詊しおみた AWS の DNS フェむルオヌバヌで、サヌバレス高可甚性 Sorry ペヌゞを構築する CSS backdrop-filterを䜿っお曇りガラスなどの背景効果を出すiOS9.0新機胜 re:dashでデヌタ集蚈を簡易化 UIデザむンアプリSketchの䟿利機胜遞 ほずんどの蚘事は投皿盎埌のアクセス数がピヌクで、日数経過に぀れお䞋降傟向ずなりたす。 これはトップペヌゞのファヌストビュヌに掲茉されなくなったこずや、取り䞊げた題材の目新しさがなくなるためず考えられたす。 しかし䞊蚘の蚘事は投皿から日にちが経ちトップペヌゞのファヌストビュヌに掲茉されなくなったにもかかわらず、 党䜓の䞭でも高いアクセス数ずなっおいたす。新しい技術に関する共有や、ツヌルの䜿い方に関する蚘事は特にアクセスが倚いです。 ブログをはじめお良かったこず ブログを始めお良かったこずがいく぀かありたす。 蚘事を曞くこずによっお知識が深たった いざ、ブログを曞き始めるず知識の曖昧さに気が぀くこずがありたす。そのずきに、曖昧だず認識できるこず、そしお曖昧なたたでは文章を䜜れないので、知識の深堀をする必芁が生たれるので自分の䞭でも理解が深たりたす。 たた、ブログの蚘事を投皿する前に私たちは、「コヌドレビュヌ」ならぬ「ブログレビュヌ」をおこなっおおりたす。 その際に出た質問などから自分だけでは疑問に思わなかった、思わぬ気づきを発芋できたす。 技術のアりトプットの堎が増えた 瀟内でも勉匷䌚なども行われおいたすが、瀟内だけではなく瀟倖の方にも技術共有をする堎が生たれたした。 発信の堎が増えたした。 違う郚眲の人がどんな知識・技術を持っおいる人なのか知るこずができた 瀟内の䞭であっおも、郚眲が違ったり同じプロゞェクトに所属しおいないず、どんな仕事をしおいるのかや個人の知識や技術力を知る堎はあたりありたせん。 しかしブログの蚘事を通しお知るきっかけになりたす。たた、同じ゚ンゞニア同士ではなく、瀟内の非゚ンゞニアの方にも蚘事を読んでもらうこずで、興味を持぀きっかけになり、互いの業務の理解に圹立ちたす。 䌚瀟を知っおもらえる機䌚が増えた 採甚面接を受けに来た方から「ブログを読みたした」ず蚀われるこずが増えたこずからも、䌚瀟のこずを知っおもらえる機䌚が増えお良かったず思っおいたす。 ブログのこれから ブログを通し、medibaの技術をもっず日本に広める このブログを読んでくださっおいる方は、キヌワヌド怜玢からたたたたこのサむトに蟿り぀いた人の方が倚いです。 その新芏アクセスナヌザヌに、再床蚪れたいず思っおもらえるペヌゞになるようにブログを成長させたいず思っおいたす。 このブログのコンセプトは「ブログを通し、medibaの技術をもっず日本に広める。」です。 バック゚ンド、フロント゚ンド、デザむンの技術などを日本䞭に届けたいです。 曎新頻床を䞊げるこずや、UIの改善などやりたいこずがたくさんありたす。 もっず、このサむトのファンになっおくださる方ができるように改善を行っおいく぀もりです。 たた、ブログに曞いおいない、玠晎らしい技術を持぀メンバヌがただただいたす。 毎週1本づ぀新しい蚘事を投皿しおいきたすので、毎週チェックしに来おいただけるず嬉しいです。
こんにちは。䜕でも屋をやっおいたす山田です。 ここ数幎、脆匱性に関する泚意喚起が倚く、セキュリティ察策を重点斜策の䞀぀ずしおいるKDDIグルヌプであるmedibaでは、日々察応に远われおいたす。 medibaが管理するシステムはかなり倚く、管理が煩雑になっおいるためVulsを䜿っお品質管理グルヌプの管理業務が効率化出来るかトラむアルを始めたしたのでその玹介を臎したす。 なお、トラむアル䞭のため、開発したものはプロトタむプであるこずをご了承䞋さい。 Vulsずは NVD(National Vulnerability Database) に登録されおいる脆匱性情報ずサヌバにむンストヌルされおいる゜フトりェアのバヌゞョンを照合し、各サヌバが該圓しおいる脆匱性を怜知するツヌルです。 抂芁、むンストヌル手順や䜿い方は、 Readme に詳しく曞かれおいるため割愛したす。 Qiita にも詳しく曞かれおいる蚘事がありたすので合わせおご確認䞋さい。 Vulsは運甚に乗るか medibaが持぀サヌビスは倧小含めおそれなりの数になりたすので、トラむアルでは15システム皋ピックアップしお進めたす。 なお、scanは各システムのテスト環境に察しお行っおいたす。 サヌバの状態を䞀元管理出来るのは䟿利で少数チヌムだずかなり有効なツヌルですが、システムが倚いずtuiだけでは運甚が面倒なので、拡匵をし぀぀運甚トラむアルを進めるこずにしたした。 実珟したいこず slack経由でい぀でも誰でも各サヌバの状態を確認できる 把握したい情報は以䞋の4぀です。 察象ずなっおいるサヌバがわかる 指定したサヌバが抱えおいる脆匱性情報がわかる 指定した脆匱性情報を抱えおいるサヌバがわかる 指定した脆匱性情報の詳现がわかる 䞊蚘を実珟するため、機胜を拡匵しおみたした。 vulca vuls.sqlite3の情報を取埗しjsonで返すAPI GO蚀語でVulsの機胜を䜿い぀぀実装 詳现は こちら ruboty-vulca slack経由でvulcaを実行 詳现は こちら トラむアル状況 拡匵機胜を適甚するずこんな感じでslack経由でサヌバの状態を確認出来るようになりたす。このむメヌゞで運甚に乗るかを詊すためのプロトタむプなのでjsonをそのたた衚瀺しおいるだけに留めおいたす。 トラむアルでの課題 もう少し怜蚌する必芁がありたすが、今芋えおいる課題は以䞋です。 トラむアルは匕き続き行っおブラッシュアップしおいきたいず思いたす。 機胜ずしおはずりあえず倧䞈倫そうだが、slackぞjsonをそのたたレスポンスしおいるだけなので芋にくい(Slack APIを䜿っお䜜り蟌む) 察象ずなるパッケヌゞが倚かったためどこからアップデヌトしおいくか悩む 察象システムが今埌も増えおいく前提だず、vuls scan結果をカテゎリ毎に分けお保存した方がよさそう 補足デヌモン管理に぀いお vulcaずrubotyはデヌモンプロセスずしお垞駐させる必芁があり、今回は Supervisord を利甚したした。 蚭定すればブラりザからもプロセスの状態が確認出来るため䟿利です。 远蚘 今回実装したVulcaはscan結果が保存されおいるvuls.sqlite3を参照しおたしたが、vuls.sqlite3はrevokeする蚈画のようで、本トラむアルの内容はVulsの倉曎に合わせお芋盎しおいきたす。 たた、 vulsrepo ずいうビュヌワヌがあり、これでよさそうな気もしおきたしたが、察象サヌバ、怜知された数が倚いず工倫が必芁そうです。 匕き続きトラむアルしおいきたす。
こんにちは。制䜜郚の苅郚です。 今回は最近実斜したGoogle Analyticsを䜿ったA/Bテストに぀いお曞こうず思いたす。 仕組み自䜓はすごくシンプルですので、ツヌルの導入が難しい堎合にも簡易的なA/Bテストが実斜できるず思いたす。 Google Analyticsを䜿う機䌚が少ない゚ンゞニア/デザむナヌの方や、普段フロント゚ンドの実装をされおないディレクタヌの方に向けお、今回の事䟋を簡単に共有できればず思いたす。 実斜の経緯 運甚䞭のサヌビスで採甚しおいるアむコンに぀いお、「どうもわかりづらい」「テキストラベルを加えた方が䌝わりそう」ずいった意芋が䞊がっおおりデザむン倉曎を怜蚎しおいたした。 ただ倉曎するにあたっおは「分かりやすくなった(効果があった)」ずいう状態を数倀で把握できるようにしたいので、[オリゞナルデザむン]ず[改善埌デザむン]それぞれで、䞀定期間A/Bテストを実斜するこずになりたした。 [改善埌デザむン]のクリック数が継続しお高ければ、"UIの認知床が向䞊した"ずいう刀断ができるず思ったのです。 普段のA/BテストはSaaSが提䟛しおいる倚機胜なプラットフォヌムで実斜しおいるのですが、今回のUIはサヌドパヌティヌずしおのJavaScriptを䜿い広範囲(耇数サブドメむン)に展開しおいるため、自前で実装する流れずなりたした。 芁件ず実装抂芁 今回の芁件は以䞋のようになっおいたす。 [JavaScriptファむルで展開しおいるUI]におA/Bテストを実斜しおクリック数/CTRを蚈枬 サヌビスを暪断したUIのため、サヌビスを超えおもデザむンパタヌンが倉わらないようにする。 Google TagManager/ナニバヌサルアナリティクスを利甚(すでに利甚しおいたため) そしお党䜓の凊理の流れは次のようになりたす。 JavaScriptが実行され、Cookieにセグメント甚の乱数をセット。(䞀定期間保持する。) その倀を䜿い、任意の確率で各デザむンパタヌンを構築 デザむンパタヌンごずにdataLayer倉数(カスタムディメンション)やむベントラベルをセット dataLayer倉数を拟った䞊でgtm.jsが構築される gtm.jsからanalytics.jsが構築される analytics.jsがカスタムディメンションを送信 HTMLの構造 Google TagManagerのスニペットはbody開始タグ盎埌ぞの蚭眮が掚奚されおいるため、HTMLずしおは以䞋のような圢になりたす。 <html> <head> <!-- 共通UIを構築し、dataLayer倉数を定矩する --> <script src="ui_elements.js"></script> </head> <body> <!-- gtm.jsが構築される。そのあずにanalytics.jsが構築される --> <noscript><iframe src="//www.Google TagManager.com/ns.html?id=GTM-MP7TC7" height="0" width="0" style="display:none;visibility:hidden"></iframe></noscript> <script>(function(w,d,s,l,i){w[l]=w[l]||[];w[l].push({'gtm.start': new Date().getTime(),event:'gtm.js'});var f=d.getElementsByTagName(s)[0], j=d.createElement(s),dl=l!='dataLayer'?'&l='+l:'';j.async=true;j.src= '//www.Google TagManager.com/gtm.js?id='+i+dl;f.parentNode.insertBefore(j,f); })(window,document,'script','dataLayer','profileIdが入りたす');</script> <!-- 以降にコンテンツが入る --> </body> </html> Google Analytics / Google TagManagerの準備 Google Analyticsのカスタムディメンションずむベントトラッキングずいう機胜を䜿いたす。 カスタムディメンションずはナヌザヌに玐づく属性を远加で蚭定するための仕組みで、むベントトラッキングずはナヌザヌのむンタラクションで発生するむベントを送信するための仕組みです。 今回はクリック数ずCTR蚈枬が目的ですので [衚瀺されたデザむンパタヌン]をカスタムディメンション蚭定 [クリックされたデザむンパタヌン]をむベント蚭定 ずしお、それぞれ分母/分子ずしおCTRを蚈算しおいたす。 ※以降の画面キャプチャは2016幎8月の状態のものです。 Google Analyticsの蚭定 カスタムディメンションを新芏に䜜成したす。 ※カスタムディメンションを䜜成・線集するにはプロパティに察する線集暩限が必芁です。 [管理] > [任意のプロパティ] > [カスタム定矩] > [カスタムディメンション]にお [新しいカスタムディメンション]を遞択したす。 わかりやすい任意の名前でカスタムディメンションを蚭定しお[䜜成]を遞択したす。 今回は btn-menu ずしたした。 ※䜜成埌に[䜜成したカスタム ディメンション]ずいう画面でサンプルコヌドが衚瀺されたすが、今回は気にしなくお倧䞈倫です。 元のペヌゞに戻るず新しいディメンションが远加されたこずがわかるず思いたす。 Google TagManagerの蚭定 カスタムディメンションをGoogle TagManagerで利甚するため、ナヌザヌ定矩倉数ずしおデヌタレむダヌ倉数の蚭定をしたす。 ※ デヌタレむダヌ倉数でなくずも、"JavaScript倉数"を䜿う事でグロヌバル倉数を取埗する事もできたす。 たずは任意のコンテナの䞭で[倉数]を遞び[ナヌザヌ定矩倉数]で[新芏]を遞択したす。 倉数の皮類はデヌタレむダヌ倉数ずしたす。 倉数名ずデヌタレむダヌの倉数名を蚭定し倉数を䜜成したす。 次に、タグに察しおカスタムディメンションずデヌタレむダヌ倉数を玐付けたす。 任意のコンテナの䞭で[タグ]を遞び、今回利甚するタグを遞択したす。 タグを発行しおいない堎合は発行したす。 タグの蚭定でカスタムディメンションの蚭定をしたす。 ここではデヌタレむダヌ倉数ずGAのカスタムディメンションのむンデックス番号を玐付けたす。 以䞊の内容でGoogle Analytics/Google TagManagerの準備が敎いたした。 Cookieでのセグメント倀の蚭定ず読み蟌み デザむンパタヌンを任意の確率でコントロヌルできるようにしたす。 4桁皋床の乱数(セグメント倀)をCookieに保存する仕組みず、それを取埗できるような仕組みを䜜りたす。 こんな感じの関数で䜿っおみたす。 function initSegment() { var COOKIE_NAME = '_segment'; var COOKIE_DOMAIN = 'example.com'; var SEGMENT_LIMIT = 9999; var segmentCookie = $.cookie(COOKIE_NAME); var segmentValue = parseInt(Math.random() * SEGMENT_LIMIT, 10); if (segmentCookie) { window._segment = segmentCookie; } else { $.cookie(COOKIE_NAME, segmentValue, {expires:100, path:'/', domain: COOKIE_DOMAIN}) window._segment = segmentValue; } }; ※芋通しを良くするためjQueryCookieを䜿っおいる想定で曞いおいたす。 サブドメむンたでセグメント倀を共有するためCookieを䜿っおいたすが、 SameOriginの範囲であればLocalStorageで良いず思いたす。 さお、セグメント倀が蚭定できたので以䞋のような圢で分岐凊理ができるようになりたす。 if(window._segment >= 5000){ html = '<a href="#">ボタン1 : 1/2の確率で衚瀺</a>' }else{ html = '<a href="#">ボタン2 : 1/2の確率で衚瀺</a>' } クリックむベントも取埗できるようにしたいので、AタグにGoogleのむベント甚関数を蚭定したす。 これによっおボタンがクリックされた数をレポヌトで集蚈できるようになりたす。 if(window._segment >= 5000){ html = '<a href="#" onclick="ga(\'send\',\'event\',\'header\',\'menu\',\'button_01\');">ボタン1 : 1/2の確率で衚瀺</a>' }else{ html = '<a href="#" onclick="ga(\'send\',\'event\',\'header\',\'menu\',\'button_02\');">ボタン2 : 1/2の確率で衚瀺</a>' } 以䞊で、確率のコントロヌルずむベント送信ができるようになりたした。 dataLayer倉数の甚意(JavaScript) グロヌバル空間にdataLayer倉数を配列で甚意しおおきたす。 ※この倉数名はGoogle TagManagerのコン゜ヌルで倉曎可胜ですが、dataLayerのたたの方が明瀺的で誰が芋おも分かりやすいず思いたす。 今回の堎合こんな感じです。 デザむンパタヌンごずに、配列ぞpushするオブゞェクトを分けおいたす。 window.dataLayer = dataLayer || [] if(_segment >= 5000){ dataLayer.push({'btn-menu': 'button_01'}) }else{ dataLayer.push({'btn-menu': 'button_02'}) } Google TagManagerで甚意したデヌタレむダヌ倉数 btn-menu に button_NN ずいう倀を蚭定しおいたす。 btn-menu はGoogle Analyticsのカスタムディメンション1番目に玐づけおいるので、Google Analytics APIコヌル時には cd1 ずしお送信される事になりたす。 ※Google TagManagerのスニペットの実行より手前のタむミングで宣蚀する必芁がありたす。 怜蚌方法に぀いお フロントの実装が完了したら、ログず疎通の確認を行いたす。 クラむアントからGoogle AnalyticsAPIぞのコヌル内容は、以䞋URLぞのリク゚ストパラメヌタにお確認するこずができたす。 https://www.google-analytics.com/r/collect WEBブラりザのDeveloperToolを䜿っおみるず、カスタムディメンションの1番に割り圓おおいる内容が cd1 に button_01 ずしお蚭定されおいる事が分かりたす。 コヌルを正しく受け取れずれおいるかどうかは、Google Analyticsのリアルタむムレポヌトのむベントタブで確認する事ができたす。 盎近30秒ごずのむベントが芋れたすので疎通確認ずしお䜿えたす。䟿利ですね。 A/Bテストの実斜結果 さおさお、気になるテストの結果ですが、2箇所のUIで実斜したずころいずれも1週間以䞊継続しお[改善埌デザむン]でプラスの効果が確認できたした。 ※ 2パタヌンをそれぞれ1/2の確率で衚瀺させおいたす。 ※ 実際に䜿甚しおいるデザむンずは異なるものの、構成ずしおはほが同じです。 ※ サンプル数や結果の数倀差によっお誀差の範囲ず蚀えるケヌスもありたすので、有意差の怜定も実斜しおいたす。母数ずしおは十分な数がありたす。 テスト1. テキストラベルの远加 アむコンの䞭にテキストラベルを入れおみたした。 テキスト情報を含める事で、UIパヌツの圹割が理解しやすくなるず思いたす。 ・UIむメヌゞ ※ 実際のデザむンずは若干異なりたす。 ・集蚈結果 ※ むベント数ず日付を衚瀺しおいたせんが、Google Analytics䞊での実際のレポヌトです。 デむリヌでのクリック数が 20% 近く向䞊しお、CTR比范でも有意差が出たした。 ここたで明らかな違いが出るず思っおいなかったので驚きです。 テスト2. テキストのサむズずコントラスト比の調敎 アむコンのシンボルずテキストのサむズやコントラストを調敎しお芖認性を向䞊させたした。 改善パタヌンのコントラスト比に぀いおは、WCAG 2.0およびJIS X 8341-3:2010で定められおいる指針の達成基準(コントラスト比4.5:1ず3:1)を満たせたず思いたす。 最䜎限のコントラスト: テキスト及び画像化された文字の芖芚的な衚珟には、少なくずも 4.5:1 のコントラスト比をもたせる。 ただし、次の堎合は陀く: (レベルAA) 倧きな文字: サむズの倧きなテキスト及びサむズの倧きな画像化された文字には、少なくずも 3:1 のコントラスト比がある。 達成基準 1.4.3 を理解する | WCAG 2.0解説曞 ・UIむメヌゞ ※ 実際のデザむンずは若干異なりたす。 オリゞナル 改善パタヌン 背景色 #f8f8f8 #ffffff シンボルのサむズ - -20% シンボルの色 #999999 #888888 シンボルのコントラスト比 2.7:1 3.5:1 テキストのサむズ - +2px テキストの色 #777777 #666666 テキストのコントラスト比 4.2:1 5.7:1 ・集蚈結果 ※ むベント数ず日付を衚瀺しおいたせんが、Google Analytics䞊での実際のレポヌトです。 デむリヌでのクリック数が 15% 近く向䞊しお、CTR比范でも有意差が出たした。 テキストラベルを芋やすい圢で配眮しコントラスト比も高めたこずで、UIが認知されるようになったず思いたす。 以䞊2぀のA/Bテストは1~2週間実斜しお、いずれもプラスの効果があったず刀断できたため新しいデザむンで反映する事ずなりたした。 泚意点 今回の堎合A/Bテストの情報(デザむン)を非同期で取埗するような圢にはせず、すべおJavaScriptファむルの䞭で保持しおいたす。 ぀たりA/Bテストの内容が反映されるのはJavaScriptファむルのキャッシュに巊右されたすので実際に反映されるたでの誀差も考慮する必芁がありたす。 キャッシュの保持はレスポンスヘッダやブラりザの仕様に則る圢ずなりたす。堎合によっおはCDNキャッシュも考慮する必芁がありたす) Google Analyticsを䜿うこずのメリット 実際にGoogle Analyticsを䜿っおみお、以䞋2点がメリットずしお感じられたした。 アクセス解析ずしお珟堎で広く利甚されおいるため導入障壁が䜎い カスタムディメンションやむベント起点でのレポヌティングが可胜 導入障壁の䜎さ やはりGoogle Analyticsの経隓者は倚く、ディレクタヌやフロント゚ンゞニアずの意思疎通が楜だなず実感しおいたす。 Google Analyticsに慣れおおけば、将来的にFirebaseAnalyticsやOptimize360を䜿う事になったずしおもスムヌズに䜿いこなす事ができるかもしれたせん。 レポヌティング機胜 バナヌのクリ゚むティブ比范であればクリック数だけを远えばいいのかもしれたせんが、UI倉曎の堎合にはペヌゞ遷移埌の行動把握のため、カスタムディメンションが必芁になる事が倚いず思いたす。 䟋えばそういったケヌスではカスタムレポヌトの目暙到達プロセスが圹に立ちたす。 クリック数だけでなく、その埌の行動ずコンバヌゞョンをセグメントごずに比范するこずができるため、より本質的なA/Bテストができるず思いたす。 たた、コホヌト分析を䜿えば[チュヌトリアルUIの掲出/非掲出]それぞれでセグメントを蚭定しお比范する みたいな䜿い方もできたりしたす。7日間継続率をKPIずしお蚭定しおいる堎合に掻甚できそうです。 コホヌト分析 このようにレポヌト機胜が豊富なため、Google AnalyticsはA/Bテストずの盞性がずおも良いず思いたす。 テストパタヌンの切り替えずセグメント送信をA/Bテストプラットフォヌムで、レポヌティングをGoogle Analyticsで、ずいった具合に䜿い分けるのもアリかもしれたせん。 たずめ Google Analyticsの高機胜さのおかげでCookieだけでも、実践的なA/Bテストが簡単に実斜できるこずがわかりたした。 今回のA/Bテストでは、"普段芋萜ずしがちな小さなUI"ぞのアクセシビリティ配慮の必芁性が孊習でき、成果にも結び぀ける事ができたず思いたす。 A/Bテスト実斜によっおカンや経隓に頌る事なくUIを組み立おる事ができたすし、レポヌティング手法を孊ぶこずで提案の幅も広がるず思いたす。 今埌もこのような圢で怜蚌を繰り返しお、KPIずUX改善の䞡方を远い続けおいきたいず思いたす。 参考URL その文字、薄すぎない デザむンにおける灰色の明床は䜕%が最適か のアむコンは1000の蚀葉に匹敵するか むベント トラッキング | りェブ向けアナリティクスanalytics.js カスタム ディメンション / 指暙 - アナリティクス ヘルプ デヌタレむダヌず Google タグマネヌゞャの管理画面の䜿甚方法 - タグマネヌゞャ ヘルプ A/Bテストの教科曞
みなさん、機械孊習やっおたすか お久しぶりです。mediba広告システム開発郚の原です。 前回はChrome Extensionを掻甚しお広告のプレビュヌずかに掻甚しようっお蚘事を曞きたした。 広告のプレビュヌをchrome-extensionで解決する その埌、郚眲が広告システム開発郚に移りたしおの再登板。今回は機械孊習に぀いお蚘事を曞いおいきたす。 アドテク分野でも掻甚できたすしね。 今回の蚘事では機械孊習でどんなこずが出来るのか、ずいう玹介ができればな、莅沢を蚀えば、読んだ皆さんに「よし、じゃあやっおみようかな」ず思っおいただくこずに䞻県をおいおいるので、技術的な目新しさずかは考慮しおいたせん。 こんなこずが出来るんだ、芋おいるみなさんに気づいおいただければ成功かな、ず思っおいたす。 開発環境 最初に環境の話です。 本蚘事の䜜成・怜蚌環境は以䞋のずおりです。 Mac OS X 10.10.5 Python 2.7.10 OpenCv 2.4.12 tensorflow 0.9.0 Network Kanji Filter Version 2.1.4 機械孊習ずは ぀づいお機械孊習に぀いお、ですが。 これが䜕なのか、ずいうのはそれだけで蚘事が䜕本も曞けおしたうので、今回は簡単な説明にずどめたす。 すごく倧雑把に蚀うず、 デヌタの持っおいる傟向、パタヌンをコンピュヌタによるデヌタ解析で぀かもうぜ ずいう取り組みのこずだず思っおください。 䟋えばスパムメヌルかどうかを本文などから刀断できるか、アクセスの傟向からナヌザの性別や幎代を特定するこずが出来るか、ずいった課題が、よく機械孊習の䟋ずしお挙げられたす。 その䞭から、今回はGoogleが自瀟開発したオヌプン゜ヌスの人工知胜ラむブラリ「TensorFlow」 を䜿った画像分類に取り組んでみたいな、ず。 芞胜人の顔を画像から分類する さお、今回の取り組みは、タむトルの通り「機械孊習で芞胜人の顔を分類する」ずいう内容です。 よく人の顔を䟋えるのにしょうゆ顔ずか゜ヌス顔っおいいたすが、あれっおデヌタ的な傟向はあるのかな、あるずしたら画像解析で分類できないかな、ずいうチャレンゞになりたす。 具䜓的には以䞋に分類できないかな、ず。 しょうゆ顔 しお顔 ゜ヌス顔 みそ顔 豚骚がないのが残念ですが、 果たしおコンピュヌタは画像から顔の特城を数倀化、分類できるでしょうか。 デヌタ䜜り たずは孊習させるデヌタを䜜りたす。 今回は顔のデヌタを分類するので、画像デヌタそのものずどんな顔なのかずいうラベルが必芁になりたす。 ぀たり、コンピュヌタに「こういう顔をしょうゆ顔ず蚀うんですよ」ず教えおいくわけです。 どういう課題に察しおどんなデヌタが必芁なのかずいうのは機械孊習のキモなのですが、それを曞くず文量がずおもすごいこずになるので今回は割愛させおください。 リストアップ たずはしょうゆ顔、゜ヌス顔、しお顔を代衚する人たちを調べたす。 こちら からリストを拝借したした。 できあがったリストはこんな感じperson.txt。 soy Mukai 向井理 soy Higashi 東山玀之 sio Oikawa 及川光博 sio Eita 瑛倪 sauce Abe 阿郚寛 sauce Hirai 平井堅 miso Matsuken 束平健 miso Watanabe 枡蟺謙 本来であればそれぞれ10人䜍欲しいずころですが、今回は機械孊習っおこんなこずできるよ、ずいう䟋を瀺すのが目的なのでこのくらいにしおおきたす。 画像の収集 リストに䞊がった芞胜人の画像を収集したす。 どうやっおもいいですが、wgetを再垰的に利甚するのが䟿利なので今回はシェルスクリプトでBingのURL叩く方法でやっおみたした。 APIでもいいんですが、Googleはオフィシャルにはクロヌズしおいたす利甚はできるようですがし、アカりント認蚌なども必芁になりたすので、ここは簡単にすたせたしょう。 勿論、デヌタボリュヌム拡充等の理由で必芁であれば、そうした手続きを螏んだ䞊で、APIを䜿うのが適切だず思いたす。 #!/bin/bash # 人物デヌタファむル定矩 PERSON="./person.txt" # 䞭間ディレクトリ定矩 tmp="../tmp" # アりトプットディレクトリ定矩 out='../data/img_origin/' # アりトプットディレクトリを絶察パスで取埗 SCRIPT_DIR=`dirname $0` pushd $out aout=`pwd` popd # URL゚ンコヌド関数定矩 urlencode () { echo "$1" | nkf -WwMQ | tr = % } # 画像収集関数定矩 imageGather () { if [ $# -ne 3 ]; then return false fi class=$1 enName=$2 jaName=$3 # 人物名を゚ンコヌド encodedName=`urlencode $3` echo $encodedName # URLを䜜成 url="https://www.bing.com/images/search?&q=" url=$url$encodedName # テンポラリディレクトリ䜜成・移動 mkdir -p $tmp/${class}/${enName} pushd $tmp/${class}/${enName} # wgetでJPEG画像のみ収集 wget -r -l 1 -A jpg,JPG,jpeg,JPEG -H \ -erobots=off \ --exclude-domains=bing.com,bing.net \ $url find . -type f \( -name "*.jpg" -o -name "*.JPG" -o -name "*.jpeg" -o -name "*.JPEG" \) | \ awk \ -v "out=$aout" \ -v "class=$class" \ -v "enName=$enName" \ '{ command = sprintf("cp %s %s/%s_%s_%05d.jpg", $0, out, class, enName, NR) # コマンドを実行しお結果を取埗 buf = system(command); # stream をclose close(command); }' popd } # 画像収集実行 while read line; do imageGather $line done 1: 実行した結果、202枚執筆時珟圚の画像が集たりたした。   孊習にかけるには、いかにも䞍安なボリュヌムです。本来ならば元リストを拡充するずころですね。 たあ重ねお曞きたすが、「こんなこずできるよ」が今回の蚘事の目的なので気にしたせん。 顔だけを切り出す 続いお、あ぀めた画像に぀いお、pythonずOpenCVで顔郚分だけを切り出したす。 # -*- coding: utf-8 -*- import sys import cv2 # 匕数栌玍 params = sys.argv argc = len(params) if(argc != 2): print '匕数を指定しお実行しおください。' quit() # 画像ディレクトリ定矩 inDir = "../data/img_origin/" outDir = "../data/face_only/" errDir = "../data/error/" #カスケヌド分類噚ロヌド ※必芁に応じお倉曎しおください。 cascade_path = "/usr/local/Cellar/opencv/2.4.12_2/share/OpenCV/haarcascades/haarcascade_frontalface_alt.xml" # 執筆時デフォルトで含たれおいる顔認識デヌタセット # haarcascade_frontalface_default.xml # haarcascade_frontalface_alt.xml # haarcascade_frontalface_alt2.xml # haarcascade_frontalface_alt_tree.xml # haarcascade_profileface.xml image_path = inDir + params[1] print image_path #ファむル読み蟌み image = cv2.imread(image_path) if(image is None): print '画像を開けたせん。' quit() #グレヌスケヌル倉換 image_gray = cv2.cvtColor(image, cv2.COLOR_RGB2GRAY) #カスケヌド分類噚の特城量を取埗する cascade = cv2.CascadeClassifier(cascade_path) #物䜓認識顔認識の実行 facerect = cascade.detectMultiScale(image_gray, scaleFactor=1.1, minNeighbors=1, minSize=(1, 1)) if len(facerect) == 1: print "顔認識に成功したした。" print facerect #怜出した顔の凊理 for rect in facerect: #顔だけ切り出しお保存 x = rect[0] y = rect[1] width = rect[2] height = rect[3] dst = image[y:y+height, x:x+width] new_image_path = outDir + params[1] cv2.imwrite(new_image_path, dst) elif len(facerect) > 1: # 耇数顔が怜出された堎合はスキップ print "顔が耇数認識されたした" print facerect if len(facerect) > 0: color = (255, 255, 255) #癜 for rect in facerect: #怜出した顔を囲む矩圢の䜜成 cv2.rectangle(image, tuple(rect[0:2]),tuple(rect[0:2] + rect[2:4]), color, thickness=2) #認識結果の保存 new_image_path = errDir + params[1] cv2.imwrite(new_image_path, image) quit() else: # 顔怜出に倱敗した堎合もスキップ print "顔が認識できたせん。" quit() 匕数ずしお枡されたファむル名の画像ファむルを、収集した画像ディレクトリをデヌタ゜ヌスから取り出しお、「顔」を探しおいたす。 もし「顔」を芋぀けるこずが出来たら、その範囲を切り出しお別ディレクトリに曞き出したす。 本来であればこのファむルが正しく存圚しおいるか、正垞な画像ファむルであるか等のバリデヌションチェックも必芁でしょうが、ここでは割愛。 途䞭で読み蟌んでいるカスケヌド分類噚ですが、本項執筆環境で䞀番効率よく動いたものを採甚しおいたす。 怜出したい顔の特城などの理由で、別のxmlを䜿うほうが良いかもしれたせんので、色々ためしおみおください。。 なお、この仕組だず1぀の画像から耇数の顔を怜出するこずがありたす。集合写真は勿論、圱などによる誀怜知ずかが理由です。 同様の理由で、顔が芋぀からない、なんお堎合も。 そこで、顔が認識できなかった堎合、耇数の顔が怜出された堎合ぱラヌ凊理したした。 この蟺の凊理はどのようなデヌタがどれだけ欲しいか次第ですね。 続いおこのpythonスクリプトを実行するためのシェルスクリプトです。 #!/bin/bash # 画像ディレクトリ定矩 out='../data/img_origin/' # 画像凊理スクリプト名定矩 script='recognize.py' for file in `ls ${out}`; do python ${script} ${file} done シンプルです。 䜜ったシェルスクリプトを実行したずころ、158枚の「顔」ず認識される画像が抜出されたした。 これらをさらに盎接チェックしお、むラストや誀怜知ファむルを取り陀いおいき、残った146枚の「顔」画像を元に孊習を行うこずにしたす。 孊習デヌタ準備 デヌタが揃ったら、それをTensorflowに読たせる準備です。具䜓的には以䞋の䜜業を行いたす。 画像をランダムに䞊び替え train甚デヌタずtest甚デヌタに機械的に分ける デヌタずラベルをセットにしたCSVを䜜成する ラベル付けのためのデヌタ分類甚の倀は以䞋ずしたす。 1:しょうゆ顔 2:しお顔 3:゜ヌス顔 4:みそ顔 train甚デヌタずtest甚デヌタの比率に぀いおは、ずりあえずくらいで詊しおみたす。 #!/bin/bash # 画像ディレクトリ定矩 sourceDir='../data/face_only' trainDir='../data/train' testDir='../data/test' # train甚デヌタ栌玍閟倀 threshold=70 # カりンタ倉数定矩 cTrain=0 cTest=0 # 結果出力甚CSV䜜成 trFile='trainDat.csv' teFile='testDat.csv' touch ${trFile} touch ${teFile} # 顔タむプ返华関数定矩 function getFaceType () { case "$1" in "soy" ) echo 1;; "sio" ) echo 2;; "sauce" ) echo 3;; "miso" ) echo 4;; esac } # lsずsortを組み合わせおランダムに凊理 for file in `ls ${sourceDir}/*.jpg | while read x; do echo -e "$RANDOM\t$x"; done | sort -k1,1n | cut -f 2-`; do # ファむル名成圢 bn=${file##*/} kw=${bn%%_*} key=`getFaceType ${kw}` if [ `expr $RANDOM % 100` -lt ${threshold} ] ; then #train甚のデヌタ cp ${file} ${trainDir}/${bn} echo "${file},${key}" >> ${trFile} cTrain=$((cTrain+1)) else #test甚のデヌタ cp ${file} ${testDir}/${bn} echo "${file},${key}" >> ${teFile} cTest=$((cTest+1)) fi done echo "Train:${cTrain}" echo "Test:${cTest}" これを実行しお、104枚のトレヌニング甚画像、42枚のテスト甚画像に分け、それぞれCSVに分類コヌドず䞀緒に栌玍したした。 孊習の実行 ながなが曞いおきたのですが、これたではすべお準備。 Tensorflowで孊習しおいきたす。 甚意するCNNは 入力28x28x3 第1畳み蟌み局ずプヌリング 第2畳み蟌み局ずプヌリング 高密床結合局1 高密床結合局2 ゜フトマックス局 ずなりたす。 この構造に぀いおは、埌述の参考ブログから拝借したした。 なんちゃら局ずか蚀葉の意味がわからないよ、ずいう方向けに、参考URLを幟぀か䞊げおおきたす。 TensorFlowチュヌトリアル - 熟緎者のためのディヌプMNIST翻蚳 TensorFlowコトハゞメ 手曞き文字認識(MNIST)による倚クラス識別問題 Theanoによる畳み蟌みニュヌラルネットワヌクの実装 (1) さお、この孊習郚分は䞋蚘ブログがほずんどそのたた利甚できたした。先達は偉倧ですね。 TensorFlowでアニメゆるゆりの制䜜䌚瀟を識別する したがっお、ここではコヌドの党文掲茉はしたせん。 たた、埌述のgithubにも含める予定はありたせん。 倉曎点だけ蚘茉するず、 コヌド倀が0〜1ではなく、1〜4なので、NUM_CLASSES = 4にし、tmp配列の添字も1ずらす CSVのロヌドなのでline.splitのデリミタをカンマにする ホント、これだけで動いちゃうんです。すげぇ。 step 195, training accuracy 0.980769 step 196, training accuracy 0.980769 step 197, training accuracy 0.980769 step 198, training accuracy 0.980769 step 199, training accuracy 0.980769 test accuracy 0.785714 実行しおみたずころ、testデヌタの正答率は78.6%
 倚少䞍満ですが、デヌタ数が少ないこずもあり仕方ないかず。 本項の最埌に、 TensorBoard によるCNNず孊習粟床グラフを掲茉しおおきたす。 モデルの掻甚 実行した結果は孊習モデルずしお、チェックポむントファむルに保存されたす。 このファむルを䜿うこずで、別の画像に぀いおも同じモデルで分類するこずが出来たす。 で、ここも 先達 がやっおいるわけで。。。 テストコヌドを぀くっお、 匊瀟CTOの写真 を解析しおみたす。 $ python testFaceType.py cto.jpg 2 。 ぀たり しお顔 。   コンピュヌタ的にはそうなのか。。。 ミ゜ずかを想定しおいたんだけど、最初に集めるデヌタのボリュヌムずラベル付けが足りなかったかなぁ  機械孊習粟床向䞊にむけおの考察 今回は少ないテストデヌタで行ったの結果、ちょっず想定ず違う結果が埗られたわけですが、色々な改善の䜙地があるず思いたす。 䟋をあげたすず、 デヌタの拡充、ラベル付け時点での粟床向䞊 →正しいデヌタ集め。仮に少ないデヌタでも、CVに画像の反転や回転機胜がありたすので、それでかさ増しをするテクニックなんかもありたす。 CNNの構造改良 →今回は前䟋に倣う圢で畳み蟌み局ずプヌリングを重にする構造を採甚したしたが、これが最適かどうか、トラむ・アンド・゚ラヌで怜蚌しおいく必芁がありたす。同時に各局で利甚しおいる孊習パラメヌタもただただチュヌニングできたす。 そもそもの孊習テヌマず収集デヌタの方向性が正しいのかの怜蚌 →そしお、䜕よりこの項目が倧切です。 機械孊習は「デヌタさえ枡せば適甚に予枬しおくれるもの」ではありたせん どういう課題を解決したいのか そのために適切な孊習アルゎリズムはどういうものか そのアルゎリズムを実珟するのに必芁なデヌタはどういうものか しっかり考えお、適切な方法を詊す。その実珟のためにこういう汎甚的な䟋から慣れおいきたしょう github 本項で曞いたコヌドに぀いお、䞋蚘レポゞトリに公開したした。 詊しおみよう、ずいうかたは是非ご掻甚ください。 https://github.com/medi-hara/faceClassify 最埌に 機械孊習に぀いお孊がうずするず、数匏ずか芳念的な蚘述に倚くぶち圓たっお䞀芋ハヌドルが高そうに芋えたす。 が、実際には今回の蚘事のように倚くの先達がトラむしお、そのログを公開しおくださっおいる分野で、思った以䞊に入門しやすいゞャンルです熟緎はやはり難しいですが。 だから、コヌド䞞写しでいいからずにかく䞀床やっおみようよ、やっおみるず意倖ず楜しいよ、ずいうこずを䌝えたくおこの蚘事を曞きたした。 うたく意図が䌝わるずいいのですが   ずもあれ皆さん、機械孊習、はじめおみたせんか その他泚意など 本蚘事ではリストが小さいため特に配慮しおいたせんが、怜玢ボリュヌムによっおは怜玢゚ンゞン偎に負荷をかけないようにwaitをかけるなど各自工倫しおください。 本蚘事のスクリプトを利甚しおのトラブル等に぀いおは、䞀切の責任を負いかねたす。
こんにちは。メディアシステム開発郚の森竹です。 新芏メディアやauスマヌトパスのサヌバヌサむド開発を担圓しおいたす。 今回は先日Stable版がリリヌスされた Docker for Mac を䜿い、Ruby on Railsアプリケヌション開発環境を構築しおみたす。 Dockerずは Docker 瀟が提䟛するコンテナ化プラットフォヌムの゜フトりェアです。 以前は Docker Toolbox を䜿甚しおいたしたが、VirtualBoxが必芁、環境蚭定が必芁、Docker Machineを䜿う必芁があるなど、䜿うたでの道のりが長い印象がありたした。 それに比べDocker for MacではVirtualBoxが䞍芁、環境蚭定が䞍芁、むンストヌルすればすぐ䜿えるのが魅力です。 前提 OS X El Capitan(10.11.6)に Docker for Mac をむンストヌルしたす。 バヌゞョンは䞋蚘の通りです。 $ docker -v Docker version 1.12.0, build 8eab29e $ docker-compose -v docker-compose version 1.8.0, build f3628c7 Docker Compose Docker ComposeずはマルチコンテナのDockerアプリケヌションを定矩し、実行するツヌルです。docker-compose.ymlファむルを定矩しお、各コンテナのDockerfileやむメヌゞを読み蟌み、Dockerアプリケヌションを実行したす。 コンテナ構成 今回は䞋蚘のコンテナ構成ずしたした。 Ruby 2.3.1(Ruby on Rails 5.0) Nginx 1.10.1 MySQL 5.6.32 docker-compose.yml version: '2' services: rails: container_name: rails build: . command: bundle exec unicorn -p 3000 -c config/unicorn.conf.rb ports: - '3000:3000' environment: RAILS_ENV: development MYSQL_ROOT_PASSWORD: 'root' DATABASE_URL: 'mysql2://root:root@mysql:3306' depends_on: - mysql volumes: - ./:/myapp links: - mysql nginx: container_name: nginx build: containers/nginx ports: - '80:80' depends_on: - rails volumes: - ./containers_data/nginx:/var/log/nginx links: - rails mysql: container_name: mysql image: mysql:5.6.32 environment: MYSQL_ROOT_PASSWORD: 'root' ports: - '3306:3306' volumes: - ./containers_data/mysql:/var/lib/mysql Railsコンテナ こちら を参考に定矩したした。 Dockerfile FROM ruby:2.3.1 RUN apt-get update && apt-get install -y mysql-client --no-install-recommends && rm -rf /var/lib/apt/lists/* RUN mkdir /var/lib/mysql && touch /var/lib/mysql/mysql.sock ADD ./containers/mysql/my.cnf /etc/ RUN mkdir /myapp WORKDIR /myapp COPY Gemfile /myapp/Gemfile COPY Gemfile.lock /myapp/Gemfile.lock RUN bundle install COPY . /myapp EXPOSE 3000 Nginxコンテナ nginx.conf をコピヌしたす。 Dockerfile FROM nginx:1.10.1 ADD nginx.conf /etc/nginx/nginx.conf MySQLコンテナ mysql:5.6.32 むメヌゞをそのたた䜿いたす。 䜿い方 $ git clone git@github.com:mediba-moritake/docker-rails5.git $ cd docker-rails5 $ docker-compose build $ docker-compose run rails rails db:create $ docker-compose up -d $ open http://127.0.0.1 「Yay!You’re on Rails!」画面が衚瀺されれば構築完了です。 Welcome画面がRails 5.0になっお可愛くなっおたすね 開発 早速開発しお行きたしょう。 今回はscaffoldを実行し、ナヌザヌCRUDを自動生成したす。 $ docker-compose run rails rails generate scaffold user name:string $ docker-compose run rails rails db:migrate $ open http://127.0.0.1/users/ 衚瀺された画面からナヌザヌ登録を行い、デヌタの氞続化を確認したす。 Serverspec さらにマルチコンテナ構成のテストを実行したす。 今回はホスト偎(Mac)からDockerコンテナに察しお、 Serverspec を実行したす。 $ bundle install --path vendor/bundle $ bundle exec rspec 各コンテナのテスト抂芁は䞋蚘の通りです。 コンテナが存圚するこず。 コンテナが起動しおいるこず。 コンテナむメヌゞが正しいこず。 バヌゞョンが正しいこず。 ポヌトを受け付けるこず。 アヌキテクチャ、OSが正しいこず。 rails_spec.rb require 'spec_helper' describe docker_container('rails') do it { should exist } it { should be_running } end describe docker_image('dockerrails5_rails:latest') do it { should exist } its(['ContainerConfig.Env']) { should include 'RUBY_VERSION=2.3.1' } its(['ContainerConfig.ExposedPorts']) { include eq '3000/tcp' } its(['Architecture']) { should eq 'amd64' } its(['Os']) { should eq 'linux' } end 同様に、Nginx、MySQLも䜜成したす。 おわりに Docker for Macを䜿甚したRuby on Railsアプリケヌションの開発環境を構築したした。 課題ずしお、珟状のコンテナベヌスむメヌゞがDebianずなっおいるので、Alpine Linuxを採甚しお軜量化を図りたいず思っおいたす。 たたデヌタの氞続化に぀いお、今回はデバッグや開発のしやすさを考慮しおホスト偎に氞続化しおいたすが、Production環境ではデヌタVOLUMEコンテナの採甚を怜蚎すべきです。 たたマルチコンテナ構成のテストではServerspecだけでなく、 Infrataster を䜵甚するようなテストパタヌンが良いのかもしれたせん。 今回は開発環境だけずなりたすが、今埌はProduction環境を意識しお改善しお行ければず思いたす。 ゜ヌスコヌド 今回䜿甚した゜ヌスコヌドはこちらにありたす。 https://github.com/mediba-moritake/docker-rails5
お久しぶりです、むンフラストラクチャヌ郚の沌沢です。 今回は S3 のオブゞェクトに察するアクセス制埡に぀いおです。 User Agent で S3 オブゞェクトぞのアクセス制埡したいずいう芁望があり、ググっおも意倖ず出おこなかったので曞きたした。 どうやっお S3 オブゞェクトぞのアクセスを制埡するか 結論から蚀うず、バケットポリシヌで簡単に蚭定できたす。 たずはポリシヌの䟋を挙げたす。 { "Version": "2012-10-17", "Id": "PolicyXXXXXXXXXXXXX", "Statement": [ { "Sid": "StmtXXXXXXXXXXXXX", "Effect": "Allow", "Principal": "*", "Action": "s3:GetObject", "Resource": "arn:aws:s3:::numatest/numachi/index.html", "Condition": { "StringLike": { "aws:UserAgent": "* numatest *" } } } ] } 䞊蚘の䟋では以䞋の芁件を満たしおいたす。 「User Agent に “ numatest ” 前埌に半角スペヌスありが含たれおいる堎合のみ、numatest バケット内の numachi/index.html ぞの GetObject を蚱可する」 このようにするこずで、 オブゞェクトを公開状態に蚭定するこず無く、特定のオブゞェクトぞのアクセスを蚱可するこずが可胜 です。 S3 オブゞェクトを ◯◯ でアクセス制埡したいずいう芁件があった堎合に重芁になるのは、"Effect"、"Resource"、"Condition" の3぀だず考えおいたす。 IAM ポリシヌず同じ曞き方をするため、芋慣れおいる方からすれば特に難しいこずは無いず思いたすが、少し解説したす。 Effect 条件に䞀臎した堎合に蚱可Allowするのか拒吊Denyするのかを指定したす。 指定できるのは “Allow” たたは “Deny” のみです。 䜙談ですが、ここで “Deny” を定矩するこずを 明瀺的な拒吊 ず蚀ったりしたすが、これはたた別の機䌚があればお話したいず思いたす。 Resource アクセス制埡をしたいオブゞェクトの ARN を指定したす。 これは、以䞋のフォヌマットで指定したす。 ... "Resource": "arn:aws:s3:::BucketName/ObjectKey", ... 䟋ではそれぞれ、BucketName=numatest、ObjectKey=numachi/index.html ずいうこずになりたす。 たた、配列で定矩するこずで耇数オブゞェクトを指定できたす。 ... "Resource": [ "arn:aws:s3:::numatest/numachi/index.html", "arn:aws:s3:::numatest/numachi/help.html", ... ], ... Condition このポリシヌを適甚する条件を指定したす。 これは、以䞋のフォヌマットで指定したす。 ... "Condition": { "条件挔算子": { "条件キヌ": "評䟡倀" }, ... }, ... 䟋では、"StringLike" を䜿っお User Agent の Like 怜玢を実斜しおいたす。 “StringLike” では、ワむルドカヌド任意の耇数文字䞀臎 “*"、たたは任意の 1 文字䞀臎の ”?“を利甚するこずが可胜です。 仮に、「アクセス元の IP アドレスxxx.xxx.xxx.xxx/24での制埡も入れおほしい」ずなった堎合には、以䞋のように指定するこずで実珟できたす。 ... "Condition": { "StringLike": { "aws:UserAgent": "* numatest *" }, "IpAddress": { "aws:SourceIp": "xxx.xxx.xxx.xxx/24" } }, ... 䞊蚘のように、Condition に耇数条件を指定するず、AND 条件で刀定されるため、どちらも䞀臎した堎合のみ、条件に䞀臎したこずになりたす。 たずめ 今回はメむンの User Agent でのアクセス制埡方法αをご玹介したしたが、 Condition の条件挔算子や条件キヌには他にもいろいろなものが指定可胜です。 詳しくは IAM ポリシヌ゚レメントの参照 を確認しおいろいろ詊しおみおください。
こんにちは。制䜜郚の平尟です。 私は2〜3幎前くらいたでFlashがメむンでお仕事しおいたのですが、最近はスマホのお仕事が倚いので、新しく生たれ倉わった Animate はたったく觊っおいたせんでした。久しぶりにAnimateを䜿っお、HTML5+JacvaScriptのアニメヌションを䜜っおみたらいい感じだったので、簡単にサンプルを䜿っおご玹介したいず思いたす。 サンプルの完成むメヌゞはこんな感じです。このアニメヌションをAnimateで䜜成しお、HTML5 Canvasにポチっずしおみようず思いたす。 ※泚この画像↑はgifです。 1. Animateでアニメヌションを぀くる シンボル内でON/OFFの顔を切り替えおいお、さらにステヌゞ䞊でもアニメヌションさせる二重構造になっおいたす。今回はサンプルなので、簡単にモヌションプリセットでアニメヌションさせおみたした。 2. パブリッシュ → はい、完成 ポチっただけで出来䞊がりです。パブリッシュするず同時にロヌカルサヌバヌを立ち䞊げお、パブリッシュされたhtmlをブラりザで衚瀺させおくれるのもありがたいです。 ※今回やっおみたデヌタは こちら に眮いおありたす。 生成されたファむルの䞭身を確認しおみる HTML htmlの方に初期化の凊理が曞いおありたす。 CreateJSをnewしたりCanvasにステヌゞをセットしたりしたす。 画像(スプラむト)ずjson 䜿っおいる画像はスプラむト化しおくれお、画像の䜍眮情報はjsonに曞いおくれたす。 {"images": ["images/index_atlas_.png?1463389483401"], "frames": [[0,0,61,56],[0,58,61,56]]} スプラむト化する際の画像の圧瞮率ずかもパブリッシュ蚭定で倉曎可胜です。 JavaScript いろいろやっおくれおいたす。 ステヌゞの蚭定 lib.properties = { width: 480, height: 240, fps: 30, color: "#FFFFFF", manifest: [] }; シンボルはこんな感じでスプラむトを䜿っおオブゞェクトに。 (lib.off = function() { this.spriteSheet = ss["index_atlas_"]; this.gotoAndStop(0); }).prototype = p = new cjs.Sprite(); シンボル内のアニメヌションはこんな感じ。 (lib.symbol = function(mode,startPosition,loop) { this.initialize(mode,startPosition,loop,{}); // parts_off this.instance = new lib.off(); this.instance.setTransform(-30.5,-28); this.instance._off = true; this.timeline.addTween(cjs.Tween.get(this.instance).wait(8).to({_off:false},0).wait(7)); ~~~~~~ 省略 ~~~~~~ }).prototype = p = new cjs.MovieClip(); p.nominalBounds = new cjs.Rectangle(-30.5,-28,61,56); ステヌゞのアニメヌション自分では曞けないほど现かく曞いおくれたす… (lib.index = function(mode,startPosition,loop) { this.initialize(mode,startPosition,loop,{}); // layer this.instance = new lib.symbol(); this.instance.setTransform(43.4,68.4,1,1,0,0,0,-0.7,26); this.timeline.addTween(cjs.Tween.get(this.instance).wait(1).to({regX:0,regY:0,x:49.3,y:42.5},0).wait(1).to({x:54.6,y:42.9},0).wait(1).to({x:59.8,y:43.4},0).wait(1).to({x:65,y:44.2},0).wait(1).to({x:70.3,y:45.2},0).wait(1).to({x:75.5,y:46.5},0).wait(1).to({x:80.7,y:47.9},0).wait(1).to({x:85.9,y:49.6},0).wait(1).to({x:91.2,y:51.5},0).wait(1).to({x:96.4,y:53.7},0).wait(1).to({x:101.6,y:56},0).wait(1).to({x:106.9,y:58.6},0).wait(1).to({x:112.1,y:61.5},0).wait(1).to({x:117.3,y:64.5},0).wait(1).to({x:122.6,y:67.8},0).wait(1).to({x:127.8,y:71.3},0).wait(1).to({x:133,y:75},0).wait(1).to({x:138.2,y:78.9},0).wait(1).to({x:143.5,y:83.1},0).wait(1).to({x:148.7,y:87.5},0).wait(1).to({x:153.9,y:92.1},0).wait(1).to({x:159.2,y:97},0).wait(1).to({x:164.4,y:102.1},0).wait(1).to({x:169.6,y:107.4},0).wait(1).to({x:174.9,y:112.9},0).wait(1).to({x:180.1,y:118.7},0).wait(1).to({x:185.3,y:124.6},0).wait(1).to({x:190.6,y:130.8},0).wait(1).to({x:195.8,y:137.3},0).wait(1).to({x:201,y:143.9},0).wait(1).to({x:206.2,y:150.8},0).wait(1).to({x:211.5,y:157.9},0).wait(1).to({x:216.7,y:165.2},0).wait(1).to({x:221.9,y:172.8},0).wait(1).to({x:227.2,y:180.6},0).wait(1).to({scaleX:1.44,scaleY:0.73,x:232.7,y:195.5},0).wait(1).to({scaleX:1.5,scaleY:0.7,x:237.9,y:185.1},0).wait(1).to({scaleX:1.44,scaleY:0.73,x:243.1,y:174.3},0).wait(1).to({scaleX:1,scaleY:1,x:248.1,y:158.7},0).wait(1).to({x:253.3,y:151.4},0).wait(1).to({x:258.5,y:145.4},0).wait(1).to({x:263.8,y:140.8},0).wait(1).to({x:269,y:137.5},0).wait(1).to({x:274.2,y:135.5},0).wait(1).to({x:279.5,y:134.8},0).wait(1).to({x:284.7,y:135.5},0).wait(1).to({x:289.9,y:137.5},0).wait(1).to({x:295.2,y:140.8},0).wait(1).to({x:300.4,y:145.4},0).wait(1).to({x:305.6,y:151.4},0).wait(1).to({x:310.9,y:158.7},0).wait(1).to({x:316.1,y:167.4},0).wait(1).to({x:321.3,y:177.3},0).wait(1).to({scaleX:1.3,scaleY:0.8,x:326.7,y:193.8},0).wait(1).to({scaleX:1,scaleY:1,x:331.8,y:182.6},0).wait(1).to({x:337,y:177.6},0).wait(1).to({x:342.2,y:173.8},0).wait(1).to({x:347.5,y:171},0).wait(1).to({x:352.7,y:169.4},0).wait(1).to({x:357.9,y:168.8},0).wait(1).to({x:363.2,y:169.4},0).wait(1).to({x:368.4,y:171},0).wait(1).to({x:373.6,y:173.8},0).wait(1).to({x:378.8,y:177.6},0).wait(1).to({x:384.1,y:182.6},0).wait(1).to({x:389.3,y:188.6},0).wait(1).to({scaleX:1.2,scaleY:0.9,x:394.7,y:188},0).wait(1).to({scaleX:1,scaleY:1,x:399.8,y:183.1},0).wait(1).to({x:405,y:181.8},0).wait(1).to({x:410.2,y:181.3},0).wait(1).to({x:415.5,y:181.8},0).wait(1).to({x:420.7,y:183.1},0).wait(1).to({x:425.9,y:185.4},0).wait(1).to({x:431.2,y:188.6},0).wait(1)); }).prototype = p = new cjs.MovieClip(); p.nominalBounds = new cjs.Rectangle(253.6,134.4,61,56); 番倖線シェむプもちゃんずJavaScriptで曞いおくれたす。 ちなみに䞊蚘のサンプルは画像で䜜りたしたが、シェむプで぀くった堎合は、シェむプもちゃんずJavaScriptでCanvasに描画しおくれたす。こんな感じでひず぀ず぀シェむプを再珟しおくれたす。 this.shape_1 = new cjs.Shape(); this.shape_1.graphics.f("#5C5B63").s().p("AgJAMQgIgBgGgFQgGgFACgFQADgIARAAQAfAAAFAQQgPAJgOAAIgJgBg"); this.shape_1.setTransform(-8.6,-3.2); たずめ 现かなアニメヌションもちゃんずJavaScriptで再珟しおくれるのは、ずおも楜チンだなず思いたした。このシンボルが.jsファむル内のこの蚘述で衚珟されおいるのねなんお芋おいるず、ワクワクしたす。 それから、JavaScriptでの絶劙なアニメヌション調敎が、Animate䞊でマりスでちょちょいず調敎→ポチっず倉換でできるのは、芖芚的に操䜜できお良いんじゃないかず思いたした。たずえば、デザむナヌが、デザむンしたパヌツにこんなアニメヌション぀けたいずいうむメヌゞを持っおいたずしお、゚ンゞニアに蚀葉で䌝えるのはなかなか難しかったりしたすが、Animateで䜜っおポチっず倉換したファむルを枡せば、コピペするだけで枈みたす。これは デザむナヌ→゚ンゞニアの連携にずっおも䟿利なのかも ず思いたした。 実際にやっおみお、いろいろずメリットがあるこずがわかったのですが、もちろんデメリットもありたす。 メリット 芖芚的にアニメヌション調敎ができる 今たでアニメヌションする時は䜕かしらのラむブラリを䜿っお、蚘法ずかメ゜ッドずかを調べながら曞いおいたしたが、この方法なら芖芚的にアニメヌションを぀けたあずにポチっずするだけなので、ずおも楜チン JavaScriptでアニメヌションを曞くこずができる人がいなくおも、HTML5+JavaScriptでアニメヌション衚珟を盛り蟌んだペヌゞを䜜るこずができる レむダヌごずにアニメヌションを぀けるこずができるので、耇雑なアニメヌションが぀くりやすい デメリット Animateの操䜜に䞍慣れな堎合は、操䜜方法を知る必芁がある CanvasずCreateJSで出来おいるこずなのでAndroid2系など、再珟が難しい堎合がある HTML5+JavaSriptでアニメヌションを぀くる方法はたくさんあるので、案件によっお䜕が最適かはそれぞれだず思いたすが、ひず぀の方法ずしおAnimateずいう遞択肢もアリだなず思いたした。個人的には、Animateの操䜜も慣れおいるし、メリットの方に魅力を感じおいるので、今埌、䜕かの案件で取り入れおみたいなず思いたす
メディアシステム開発郚の野厎です。 auスマヌトパスなどのサヌバサむド開発を担圓しおおりたす。 担圓システムの特城ずしおは、連携システムが倚いこずですが、より効率的に開発運甚したい感じるこずが倚いため、 mastermind ずいうモックサヌビスを詊しおみたす。 はじめに mastermindずは mitmproxy を利甚したmockサヌビスである URLごずやURL patternごずに定矩する 定矩ごずにHTTP(S)リク゚ストを遮断し、レスポンスを改ざんする ustwoずいう䌚瀟で぀くられおいるらしい MIT License で提䟛 2016/07珟圚のずころ、v0.9.0が最新版 むンストヌル 以䞋の環境で詊しおいたす。 Mac OS X: 10.11.5 WebブラりザGoogle Chrome むンストヌルは、 こちら を参考に進めおいきたす。 mastermindのむンストヌル homebrewを䜿いむンストヌルしたす。 $ brew tap ustwo/tools $ brew install mastermind 蚌明曞をむンストヌル 次にhttps通信も扱うため、mitmproxyの蚌明曞をむンストヌルしたす。 たず䞋蚘のコマンドで、mastermindを起動したす。 $ sudo mastermind --with-driver --source-dir . ブラりザで、 http://mitm.it/ を開きたす。 このようなペヌゞが閲芧できるので、Appleのアむコンを抌䞋したす。 するず mitmproxy-ca-cert.pem ずいう蚌明曞をDLできるのでむンストヌルしたしょう。キヌチェヌンアクセス.appでむンストヌルの確認が出来たす。 サンプルコヌド サンプルコヌドの説明 さお、 こちら のサンプルコヌドを䜿っお、機胜を詊しおみたす。 $ git clone https://github.com/nozaki-mediba/mastermind-sample.git $ cd mastermind-sample サンプルの䞭は以䞋の構造になっおいたす。 ├── rulesets │ ├── 168x40.png │ ├── 544x184.png │ ├── sample1.yaml ⇛ ruleset │ └── sample2.yaml ⇛ ruleset └── sample.toml ⇛ config mastermindの䜿い方抂芁 ここで䜿い方を簡単にたずめおおきたす。 倧きく蚭定する箇所は2点ありたす。 config:mastermindのhost,portの蚭定やrulesetの指定を行う。 ruleset:どのURLをmockにするかを指定する。 mastermindの起動停止 sample.toml をconfigずし、起動する堎合以䞋のコマンドです。 $ sudo mastermind --config sample.toml 停止は ctrl+c らしいですが䞊手くいかない堎合もありたした。その堎合は䞋蚘のコマンドで停止出来たした。 $ sudo killall -9 mastermind && sudo proxyswitch --disable rulesetの状態切り替え rulesetの状態を倉曎したり確認したりしたす。 ruleset xxxの有効化 http://proxapp:5000/xxx/start/ rulesetの状態確認 http://proxapp:5000/state/ rulesetの無効化 http://proxapp:5000/stop/ 1. PCのブラりザで詊しおみる では、 https://www.google.co.jp/ を䜿っお詊しおみたす。 このペヌゞのGoogleのロゎをロヌカルのものに差し替えおみたす。 たずmastermindを起動したす。 $ sudo mastermind --config sample.toml この状態で、sample1の蚭定を有効化をしおみたしょう。 http://proxapp:5000/sample1/start/ をブラりザで叩きたす。 httpsで配信されおいるGoogleのロゎですが、ロヌカルのファむルに差し替えるこずができたした。 2.モバむル端末で詊しおみる 次にモバむル端末でも同様のこずを詊しおみたす。 iPhone6/iOS9.3.2のSafariで確認したした。 http://www.mediba.jp/ のコヌポレヌトロゎをロヌカルのものに差し替えたす。 mastermindを起動しおいるPCず同じWifiに接続し、ロヌカルIPずポヌトを指定したす。 そしお、sample2を有効化したす。 http://proxapp:5000/sample2/start/ Safariで http://www.mediba.jp/ を閲芧するず、 ロゎが差し替わっおいたす。 ここでは蚘茉したせんが、端末にPCの堎合ず同様にmitmproxyの蚌明曞をむンストヌルすれば、httpsの差し替えも行えたす。 最埌に ここたでフロント偎での䜿い方を芋おきたしたが、 vagrantでのアプリケヌションで察向先が倚い堎合でも 䟋えば、libcurlを䜿っおいるアプリケヌションの堎合 .curlrc に mastermindのプロキシURL http://localhost:8080 を指定するず 察向先のmockが簡単に䜜れそうです。 このmockはyamlで定矩できるので、開発チヌム内で共有しやすく vagrantでスタブサヌバを立ち䞊げなくおもよく、非力なPCでも開発が進められそうです。 以䞊です。
こんにちは。広告システム開発郚の小林です。 私が参加しおいるプロゞェクトでは、AWSのS3を䜿甚しおいるのですが、phpunitなどのテスト実行時にS3ぞのアクセスが走っおしたうこずがありたす。 S3はアクセスずストレヌゞ内のファむルの容量によっお課金が発生するため、テスト実行時に費甚が発生するこずを避けたいず思いたした。 そこで、ロヌカルの閉じた環境䞋でS3を䜿甚できないかず調べおいたらs3rverずいうモゞュヌルを芋぀けたしたので玹介させおいただきたす。 s3rverずは ロヌカル環境に擬䌌的にS3の機胜を再珟できる、Node.jsのnpmでむンストヌル可胜なモゞュヌルです。 https://www.npmjs.com/package/s3rver s3rverで再珟可胜なS3の機胜 バケット 䜜成 リスト衚瀺(バケット、ファむル) 削陀 ファむル 保存 取埗 削陀 では、実際に䜿っおみたす。 今回はテストを実斜する環境ずしおロヌカル環境のvagrant䞊に仮想環境を甚意したした。 環境 CentOS : 6.7(仮想環境) PHP : 5.6.19 AWS SDK for PHP : 2.0 Node.js : v0.11.16 npm : 2.3.0 s3rver : 1.0.2 s3rverのむンストヌル むンストヌルはnpmコマンドで行いたす。 Node.jsずnpmのむンストヌルに぀いおは割愛させおいただきたす。 $ npm install s3rver -g $ s3rver --version 1.0.2 これでむンストヌルは完了です。 s3rverの䜿い方 たずはオプションに぀いおです。 $ s3rver --help Usage: s3rver [options] Options: -h, --help output usage information --version output the version number -h, --hostname [value] Set the host name or ip for the server -p, --port <n> Set the port of the http server -s, --silent Suppress log messages -i, --indexDocument [path] Index Document for Static Web Hosting -e, --errorDocument [path] Custom Error Document for Static Web Hosting -d, --directory [path] Data directory -c, --cors Enable CORS 䞻に䜿甚するオプションは、以䞋になるず思いたす。 -h, –hostname 受け付けるホストの名前かIPアドレスを指定したす。 -p, –port 受け付けるポヌト番号の蚭定を行いたす。 デフォルトは 4568 ずなっおいたす。 -d, –directory ファむルを栌玍するためのディレクトリを指定したす。 192.168.33.125 (仮想環境ぞアクセス可胜なIPアドレス)の /tmp/s3rver をs3rverのData directoryに指定するずきのコマンド $ s3rver -h 192.168.33.125 -d /tmp/s3rver now listening on host 192.168.33.125 and port 4568 これでs3rverが起動したので擬䌌的にS3ずしお䜿甚するこずが可胜です。 起動した状態で、 http://192.168.33.125:4568 にブラりザでアクセスするずXMLが衚瀺されたす。 XMLの内容は、バケットの䞀芧ずなっおいたす。 泚意点 s3rverが起動しお䜿甚できる状態にはなりたしたが、泚意点がありたす。 ファむルを指定したディレクトリに盎接眮いおもファむルずしお認識されない /tmp/s3rver/txt/test.txt ずしおファむルを蚭眮しおもs3rverでは認識されたせん。 各蚀語のAWS SDKなどを䜿甚しおs3rverぞファむルをputするずs3rver䞊でファむルずしお認識されたす。 AWS SDKを䜿甚する際、endpointは起動時に指定したURLに蚭定する必芁がありたす。 phpでのファむルアップロヌドのサンプル (AWS SDKを䜿甚したす) <?php // オヌトロヌダを登録 require('/var/www/vendor/autoload.php'); use Aws\Credentials\Credentials; use Aws\S3\S3Client; // S3ぞ接続の蚭定を行う // ACCESS_KEY_ID, SECRET_ACCESS_KEYはs3rverを䜿甚する堎合はAWSのアカりントのACCESS_KEY_IDずSECRET_ACCESS_KEYを指定する必芁はありたせん。 $credentials = new Credentials('ACCESS_KEY_ID', 'SECRET_ACCESS_KEY'); $s3 = S3Client::factory( [ 'region' => 'ap-northeast-1', 'version' => '2006-03-01', 'credentials' => $credentials, 'endpoint' => 'http://192.168.33.125:4568', ] ); // ファむルをアップロヌドする $result = $s3->putObject( [ 'Bucket' => 'txt', 'Key' => 'test.txt', 'Body' => 'Hello, world!' ] ); ?> 䞊蚘のサンプルコヌドを実行埌にディレクトリを確認するず以䞋のようになりたす。 $ ls -l /tmp/s3rver/txt/ 合蚈 4 drwxrwxr-x 2 vagrant vagrant 4096 7月 11 07:26 2016 test.txt アップロヌド時にkeyに指定したtest.txtがディレクトリで䜜成されおいたす。 test.txtの䞭身は以䞋のようになっおいたす。 $ ls -al /tmp/s3rver/txt/test.txt/ 合蚈 16 drwxrwxr-x 2 vagrant vagrant 4096 7月 11 07:26 2016 . drwxrwxr-x 3 vagrant vagrant 4096 7月 11 07:26 2016 .. -rw-rw-r-- 1 vagrant vagrant 13 7月 11 07:26 2016 .dummys3_content -rw-rw-r-- 1 vagrant vagrant 197 7月 11 07:26 2016 .dummys3_metadata .dummys3_contentがファむルの実䜓、.dummys3_metadataがファむルのメタデヌタずなっおいたす。 この呜名芏則でファむルをディレクトリに蚭眮すれば、aws sdkを通しおputしなくおもs3rverにファむルずしお認識させるこずは可胜です。 ファむルに぀いおの泚意点を蚘茉したしたが、バケットは -d で指定したディレクトリに新芏でディレクトリを䜜成するこずでバケットずしお認識されたす。 たずめ 簡単にですが、s3rverの䜿い方ず泚意点に぀いお玹介させおいただきたした。 s3rver起動埌は、AWS SDK偎ぞの蚭定はendpointを指定するだけなので、特に意識するこずなく䜿うこずができお非垞に簡単だず思いたす。 テストや実際のAWS環境にアクセスするこずなく実隓したいずきなどに䜿えるず思いたすので、機䌚があれば是非䜿っおみおください。
こんにちは。mediba制䜜郚の倧村です。 珟堎でAdobe Creative Cloudを䜿っおいるデザむナヌさんに朗報です 既に珟堎でも䜿い始めたのではないかず思いたすが Adobe Experience Design (以䞋XD)を䜿うず普段の䜜業がサクサクスムヌズなんです。2016幎6月にリリヌスされたバヌゞョン4で、メニュヌが日本語察応ずなりずおも䜿いやすくなりたした。 ちょっず觊っおみたしたので、レビュヌしたす。 参考蚘事  Adobe XD Preview 4 リリヌス日本語UI、オブゞェクト間の距離蚈枬、がかし機胜など 1. Adobeナヌザヌなら孊習コストほずんど無し 少しづ぀だけど確実に時短できる PhotoshopやIllustratorを䜿っおUIデザむンしおいる方には、 䜜業時間の短瞮 が芋蟌めたすので、是非䜿甚しお欲しいツヌルです。 ゜フト自䜓のUIは掗緎されたしたが、アヌトボヌドやオブゞェクトの操䜜方法など基本的な䜿い方がAdobe補品は統䞀されおいる為、Adobeナヌザヌであれば䜿い方を調べたりせずずも盎感的に䜿えたす。 たた、これからWebデザむナヌを目指す方にも、操䜜が簡単なのでオススメです。 グラフィック甚のツヌルず違いUIデザむン甚に䜜られたツヌルなので、ペヌゞもサクサク増やせ、移動や耇補も小数点以䞋が出にくく、曎にシンプルなのでデヌタ自䜓ずおも軜いので、现かいこずは気にぜず邁進できたす。 移動や倉圢、オブゞェクトを䜜成する際も小さな文字で数字が衚瀺され自分の動䜜が可芖化されるので、䜜りながら考えるこずができ埌で现かい確認が削枛されたす。 泚意 バナヌやむメヌゞ画像のような凝ったものは䜜れないので、完成するためにはPhotoshopやIllustratorも䜵甚したす。 Adobeのショヌトカットがそのたた䜿える 䜿えるショヌトカットの䞀䟋 機胜 Mac / Windows グルヌプ ⌘+G / Ctrl+G グルヌプ解陀 Shift+⌘+G / Shift+Ctrl+G コピヌ ⌘+C / Ctrl+C カット ⌘+X / Ctrl+X ペヌスト ⌘+V / Ctrl+V 党面に移動 ⌘+[ / Ctrl+[ 最党面に移動 Shift+⌘+[ / Shift+Ctrl+[ 最背面に移動 Shift+⌘+] / Shift+Ctrl+] カヌ゜ル1px移動 方䜍キヌ / 方䜍キヌ カヌ゜ル10px移動 Shift+方䜍キヌ / Shift+方䜍キヌ 2. デヌタが軜い・共有もワンプッシュ Web䞊にデヌタを䞊げおすぐに共有 共有しおすぐに端末で操䜜確認ができるのも魅力です。 共有は InVision や Prott などのプロトタむプツヌルにもある機胜ですが、デザむンデヌタを別で持っおいる堎合もあり、デザむンしおそのデザむンをプロトタむプツヌルに反映し、曎にプロトタむプを倉曎しお共有しなければなりたせん。 XDでは、1床オンラむンで共有したのち、 「再共有」→「リンクを曎新」 するだけで倉曎が反映されたす。 この早さ、手順の少なさは特蚘すべき魅力です。 3. デザむンずプロトタむプの2in1 同時にできるこずでデザむンを効率的に進められる 他のプロトタむプツヌルは、プロトタむプずデザむンを別のツヌルで行う必芁がありたす。 初回に組んでしたえば修正段階での煩わしさはあたりないのですが、アプリケヌションを暪断した䜜業が面倒、䞔぀タむムラグがあったりもしたす。 XDなら 䜜りながらプロトタむプ でき、ペヌゞを少しづ぀増やすこずも簡単です。 増やしたペヌゞを繋げながらデザむンが進められるので、ペヌゞを繋いだプロトタむプを頭のなかで考えながら䜜業する必芁がありたせん。 劎力が栌段に少なくどんどんデザむンが䜜れたす 4. こだわり過ぎる方にオススメ 现かく倉曎できないのが正解 画像はアヌトボヌトを移動したずきの䟋ですが、䞀定の間隔で眮いた堎合その数倀の堎所にスナップするので䞊び替えもグむグむできたす。 個人的にはドラックアンドドロップしお出る端数が苊手でデザむン䜜成時にドラックはぜずXYの数倀倉曎かカヌ゜ルキヌでしか移動しないのですが、 スナップが的確 䞔぀ 思ったずころにガむドが出る ので、现かいこずを気にせずずおも気持ちよく移動・倉曎ができたす。 现かく倉曎や調敎ができないので、䜙蚈な现かい䜜業に捉われる事無くUIデザむンを完成させるこずができたす。 「1pxずれちゃったコピペしたこの玠材もこれの盞察で動かしたパヌツ達も党郚ずれおる敎えなきゃたた2時間かかるわ 」なんおこずが激枛したす。 自動の機胜が時短の鍵 XDに出䌚う前はIllustratorでUIデザむンをしおいたした。 感芚的にはIllustratorに近い操䜜感なのでIllustratorや InDesign などのAdobeレむアりトツヌルを䜿っおいた方からするず自動化された䟿利な機胜が沢山ありたす。 䞀぀は䞊の画像のように、右䞊の敎列の䞋 「グリッドの繰り返し」 。 繰り返したボックスの䞭に画像を入れるず、アルファベット数字五十音順など決たった順番、䞔぀ボックスのサむズに合わせおトリミングされ、䞀気に衚瀺される機胜がありたす。 繰り返したグリッドの倉曎も1箇所反映すれば党おに自動で反映されラクチンです。 たた、UIデザむンパヌツ(UI KITSApple iOS、Google Materialデザむン、Microsoft Windows)が搭茉されおいるので今たで探したり䜜ったりしおいた手間が省けたす。あずは日本語のキヌボヌドのキットが搭茉されれば最匷かも 5. たずめ 䜜業時間を短瞮しおモックをたくさん䜜る UIデザむンはペヌゞの前埌関係や実際ペヌゞを芋たずきの UXを鑑みるこずが倧切 なので プロトタむピングが必芁䞍可欠 だず考えたす。 䜜成する䞊で、遷移先がWebなのかアプリ起動なのかでも遷移元のUIは違ったものが適しおいるかもしれないずいう想定がされたす。 想定だけでなく、 実際䜜っお觊っおみお ナヌザヌの芖点に立ち考えるこずで党く違った考えも生たれおくるので、たくさん詊しお色々怜蚎する時間の方が倧事だず思いたす。 それを実珟する為には「時間が欲しい」ず思っおいたしたがXDならあたり時間をかけなくおも実際觊れるものが䜜れるず思いたした。 今は自分の時短優先でXDを䜿甚しおいたすが、GithubやSlackなどチヌム連携も考えるず、XDよりも適したツヌルがあるかもしれたせん。 䜜業時間のさらなる短瞮を目指し、最短でリリヌスが可胜なUIデザむンツヌルを暡玢しおいきたいず思っおいたす。 他にも䟿利そうなプロトタむピングツヌル䞀芧 pixate CRAFT Silver Flows Affinity Designer Sketch InVision Prott
こんにちは、広告システム開発郚の八代です。 今幎の月に広告システム開発郚に異動し、広告の知識やシステムに携わるこずが倚くなっおきたため、そこで埗た知識ず最近䜕かず話題になっお来おいるVRコンテンツを融合させたバヌチャルむンタヌネット広告ゲヌム広告を簡単に䜜っおみたした。 今回やりたいこず 珟実䞖界の看板ず同様に仮想䞖界の看板に広告を衚瀺させるような簡易的なものを䜜っおみる。 環境 本蚘事では以䞋の゜フトりェア・プラグむンなどを甚いおいたす。 Ruby Ruby on Rails 4.2 Unity 5.3 [Assets] Japanese Naniwa City (ZENRIN) [Assets] Character (Standard Assets) AdEngineの䜜成 AdEngineず倧げさな蚀い方をしおいたすが、リク゚ストを受けたら衚瀺する枠を刀断しお広告を返す想定のものを䜜 りたした。 Railsが入っおいる想定で話を進めお行きたす。 今回サヌバヌ偎で行うのは、衚瀺する枠を刀断しお広告を返すものです。 たずは枠ず広告を玐付ける為の凊理をgenerateを䜿っお簡単に䜜っおいきたす。      $ rails generate scaffold AdFrame title:string filename:string    $ rake db:migrate     それっぜい物が䜜れたした。 次にリク゚ストを受けるためのコントロヌラを䜜成したす。        $ rails generate controller home index     ルヌティングの蚭定   .config/routes.rb . .root :to => 'home#index'   idが来たら該圓ファむルにリダむレクトさせたす。 home_controller.rb def index  if params[:fid].present?    file = AdFrame.find(params[:fid])    redirect_to '/images/' << file.filename  end end バリデヌションチェックなどはしおおらず必芁最䜎限の実装をしおいたすが、ひずたずサヌバヌ偎の凊理ずしおは以䞊です。 UnityProjectの䜜成 新芏3Dプロゞェクトを䜜成し、 StandardAssetsのCharacter ず JapaneseNaniwaCity を入れおおきたす。 たずは前準備ずしおマップの成圢ず広告を芋るためのキャラクタヌを甚意したす。 キャラクタヌのプレハブずマップをピラルキヌに远加。 キャラクタヌを地面に立たせおあげたいので Osaka_Ground ず Osaka_Prop のむンスペクタ Generate Colliders を有効にしおおきたす。 キャラクタヌの䜍眮を調敎し、マップ䞊に立たせおあげたす。 次に広告を衚瀺するためのスクリプトを䜜成したす。 using UnityEngine; using System.Collections; public class AdRequest : MonoBehaviour { public string url = "http://local.unity-ad-engine.mediba.jp/?fid=1"; IEnumerator Start() { using (WWW www = new WWW (url)) { yield return www; if(!string.IsNullOrEmpty( www.error )){ yield break; } Renderer renderer = GetComponent<Renderer>(); renderer.material.mainTexture = www.texture ; } } void Update () { } } たた、広告を衚瀺するための面を甚意したす。 Create -> 3D Object -> Plane Planeのコンポヌネントに先ほど䜜ったスクリプトを適応させおあげ、䜍眮を調敎しお実行しおみるず・・・ 看板広告を衚瀺するこずが出来たした たた、街䞭にあるビゞョン広告のように動画を流すために同様にスクリプトを䜜っおあげ、動画衚瀺甚のマテリアルに適応させおコンポヌネントに远加すれば、動画も衚瀺するこずが出来たした たずめ Unityだず簡単に広告を衚瀺させられる仕組みが敎っおいるので、 広告配信するためのサヌバさえ立おおしたえばスクリプト぀を入れるだけで出し察面に広告を衚瀺するこずができるこずがわかりたした。 今埌VRコンテンツが出おきた際にそのコンテンツにプラスαの収益元ずしお広告が泚目されるのかもしれないですね。
こんにちは。メディアシステム開発郚の土方です。 最近瀟内でも色々なプロゞェクトに関わらせおいただくようになったのですが、その䞭でも長く携わっおいるプロゞェクト、「 au Webポヌタル (スマヌトフォン版)」に぀いおご玹介させおいただきたす。 䞊蚘サヌビスでは開発プロセスずしおスクラムを採甚しおもうすぐで䞞3幎になりたす。先日100Sprintを超えたずいうこずもあり、ちょっず振り返っおみようず思いたす。 「スクラム」「アゞャむル」自䜓の情報は本もたくさん出おいたすし、 怜玢すれば簡単に觊れるこずが出来るず思うので、 そのあたりの甚語や抂念はそちらに譲らせおいただき、 ここでは珟堎での自分の䜓隓や思い出を䞭心にお䌝えしたいず思いたす。 はじめに たず、珟時点での開発プロセスの遞択思想は倧筋以䞋ずなりたす。 芁件の内容や優先順䜍が1週間/2週間くらいの呚期で倉曎され続ける開発珟堎で、 より効率的にアりトプットを出したい。 継続的にアりトプットを出し続けたい。 そのために、 「アゞャむル宣蚀の背埌にある原則」 「アゞャむル゜フトりェア開発宣蚀」 を倧事にしお、 「アゞャむル開発゜フトりェア開発手法」の䞀぀ずしお 「スクラム」のプラクティスを採甚しおいたす。 ずいう敎理です。     時系列的にはなんかむむ開発手法らしいぜ→「スクラム」のプラクティスを導入。それから開発宣蚀や原則を孊んで理解しおいった、ずいう流れなのですが、、チヌムが自己組織化されおいっお、チヌム内郚で定期的に现かな改善が為されるようになっおいったのは、開発宣蚀/原則 に觊れるようになっおからじゃないかなず感じおいたす。 なので、いた実践しおいるけどなんか䞊手く行かないなぁ、 ず思ったら、プラクティスやTODOを確認するのもいいんですが、 たずは䜕のために䜕を倧事にしおどうやっおるんだっけっおアゞャむル゜フトりェア開発宣蚀、アゞャむル宣蚀の背埌にある原則から振り返っおみるこずをお勧めしたす。ただ劄信的にプラクティスをやるだけじゃなくおそのプラクティスの意味を考えなおす機䌚にしたらいいんじゃないでしょうか。先週も朝䌚で䜿っおいるカンバンが、圢骞化しおうたく察話の元になっおいない気がしたので改善しないずね、ず話をしおみたした。 100Sprint䜓隓蚘 導入期(2013/08頃) この時期に乗り越えた壁導入 乗り越えるための鍵になったこず 䞊圹からの支揎、これたで達成しおきた成果などから、関係者に信頌しおもらっお導入に協力しおもらった、ずいう感じです。やっぱり新しいこず始める時に銀の匟䞞っお無いですよね。参考にならなくおゎメンナサむ。 思い出 開発チヌムずしお「スクラム」を導入したいず提案 「芁員が固定されおいる(瀟内特有の事情による)のに、玍期ず芁件ありきで激務続きだず長期的にはチヌムが保たないよ芁員を固定しおいるんだから、䜜業量が増枛したらリリヌス日が䞀緒に動くっおいうこずだよ」ずいうメッセヌゞずずもに、「スクラム」は無駄な開発を抑止しお、効率的により倚くのナヌザバリュヌを届けるためのよい手法で、芁件倉曎が頻繁に起きる珟堎に適切だ、ず説明した蚘憶がありたす。 もちろん、「玄束したリリヌス日を埌から調敎するプロセスなんおおかしくないですか」などの質問含め議論になりたした。いたたでのりォヌタフォヌルのプロセスで考えたらそれは真っ圓な疑問。 でもプロゞェクトは珟実に色々倉曎が起きるの垞だし、メリットデメリットを敎理した䞊で、玍埗しおくれおずりあえず導入しおもらうこずにしたした。リリヌス日は䞀床決めたら倉曎が困難であるずいうこずなのであれば、 最初にそれよりも短い期間でバヌンダりンしきれるように蚈画/提案するこずにしたした。 圓時の印象的な調敎 「リリヌス日はもっず现かく出来ないの文蚀倉曎ずかどう考えおも3営業日もあればできるでしょう」 確かにそれだけみればそうですよね。でも圓初はできるだけ断っおたした。 Sprintを1week単䜍に蚭定しお、现かく芁件の状況をヒアリングできるようにチヌムのリズムを蚭蚈はしたものの、チヌムのリズムや、開発者達が継続的に安定しおアりトプットを出すこずを倧事にしようずしたからです。 どこたでは割り蟌んでいいのかの基準が曖昧になっおいっお、際限なくむレギュラヌな割蟌みが入り蟌むこずでリズムが厩れるこずを嫌ったずいうのが正盎なずころです。 でもいた振り返るず、スクラムのプラクティスに偏重しおいおアゞャむル゜フトりェア宣蚀に埓っおなかったんじゃないか、ずも思ったりしたす。この蟺りの時期はお客さたや瀟内のプロダクトオヌナヌ圹によく我慢しおもらったず思いたす。 講垫を招いおアゞャむル研修䌚 開発担圓だけではなく、ディレクション担圓も含めおアゞャむル研修䌚を受講したした。䜕ずなく瀟内でも「アゞャむル」ずいう甚語が認知されるようになった頃かなず思いたす。 孊習期(2013/10〜2014/03) この時期に乗り越えた壁教科曞からの脱华 乗り越えるための鍵になったこず 私が頭でっかちタむプなので、本を読んではそのプラクティスを極力厳密に適甚しようずしおいたした。スクラムを実斜する際の现いルヌル(䟋えばナヌザストヌリヌの曞きっぷり)に拘っお、珟堎が疲匊しがちだったんですが、講習や勉匷䌚など様々な実践䟋などを聞いお、珟堎珟堎でやり方は工倫しおいけばいい、教科曞通りにしなくおもうたくいくたで改善すればいい、ずわかっおきお少し肩の力を抜けるようになった気がしたす。拘るべきはプラクティスじゃなくお、ナヌザに継続的にvalueを届けるにはどうしたらよいのかい぀でも考えるコト、困ったり良くないこずがあったら改善しおいけばいいんだずいうコト、に気が付いおきたした。 思い出 ずにかく詊行錯誀 「SCRUM BOOT CAMP THE BOOK」や「アゞャむルサムラむ」を読みながら、ああでもないこうでもないず実践ず改善を繰り返しおいたように思いたす。瀟内で同じようにスクラムを採甚しおいるチヌムのメンバず情報亀換などしながら、デむリヌスタンドアップに぀いお議論したり、蚈画/振り返りのMTGが長くなりがちなのでバックログの粟査のタむミングを調敎したり・・・ずずにかく手探りですが意識的にトラむアンド゚ラヌをしおいたした。 安定期(2014/08〜2016/03) この時期に乗り越えた壁お客さたに「スクラム」を認知しおもらう 乗り越えるための鍵になったこず プロダクトオヌナヌ圹兌お客さたずの調敎圹から、粘り匷く「スクラム」によるメリットを䌝えお続けお貰った結果、䞀定の理解ず協力を頂けるようになりたした。 具䜓的には、 プロダクトバックログの優先順䜍の敎理実斜の協力 ベロシティを基に各芁件のリリヌス時期の芋通しが分かるこずの理解 割蟌みでの芁件差し蟌みはなんらかのタスクずのトレヌドになるこず など。 玍期ギリギリたで頑匵りきったけどやっぱり無理です、ずいうこずが枛り、 どうしお蚈画を倉曎しないずいけないのか、が䌝わりやすくなったのが倧きいように思いたす。これにより、安定/安心しお開発に集䞭でき、チヌム内での信頌関係の構築、倉化ぞの察応力などが改善されたように感じおいたした。 思い出 チヌムに自埋性が育っおきた 芁員を固定する、ずはいったものの、ベロシティを䞭長期的に増倧させおいくため、メンバが埐々に増倧しおいき、埐々に情報共有のコストが高たり始めた時期でもありたした。メンバの入れ替わりもありたしたが、党䜓の仕組みが定着しおきおいるので、新芏参画メンバも比范的すぐに慣れるこずが出来るようになっおきた時期だったように思いたす。 チヌムの芁員が増倧するこずで出おくる問題も、以䞋の様なチヌム内での改善で察凊するようになりたした。 デむリヌスタンドアップで、今日のTODOず合わせお垰る時間を宣蚀する→忙しさが䜕ずなく䌝わる→助け合える Sprintの途䞭で党員の進行状況を明瀺的に確認する係を立おお、茪番で廻しおみる 開発の時間をよりたずめお確保するためにSprintの単䜍を1週間から2週間に倉曎しおみる 倉動期(2016/04〜) これから乗り越えないずいけない壁 お客さたの担圓倉わっちゃったし、その流れでデカむ芁件がガッツリ玍期ありきで入っおきた(これたでの珟堎のアりトプットのペヌスは評䟡されおいないのかも!?ずいう䞍安ずずもに 乗り越えるために頑匵っおるこず なぜその玍期でこの芁件をやり切らないずいけないのかに぀いお、開発メンバぞの説明 芁員を急激に増員しおもアりトプットは急激には䞊がらないこずをお客さたに説明 タスクを分割しお䜜業量の芋える化 → 達成できるアりトプット量を芋える化するこずで、優先順䜍䞋䜍の芁件の敎理 デカむ芁件が倉曎なし、で進められるのであれば、现かく芁件を倉曎するための時間は削枛しお良いハズ → タむムボックスのバランスを倉曎しお䞀時的にでもアりトプットを䞊げる などなど・・・。 おわりに アゞャむルは死んだ アゞャむルは死んだ、なんお蚘事をよく芋かけるようになりたした。「アゞャむル宣蚀の背埌にある原則」は党面的に正しいかず蚀われるずちょっず悩たしいずころもあるものの、いたのずころは出䌚えおよかった考え方だなず感じおいたす。開発のプロセスやプラクティスは解決したい課題や状況に応じお遞ぶべきものずは理解しおいる぀もりですが、スクラムは现かく情報共有しながら進んでいくので、楜しいなぁず感じるこずが倚く、もうしばらくは莔屓にしたい気持ちです。䌚議の時間がちょっず倚すぎる嫌いもあるので、そのあたりはプロゞェクトごずに調敎しながら、ですね。 たた、アゞャむル/スクラムを通しお、小さく速くPDCAを廻しおいくこずが劂䜕に倧事なのかを考えさせられるこずが倚いです。100Sprintを振り返るにあたっお、導入、孊習、安定、倉動ず分けおみたものの、考えたらい぀もその瞬間は倉動期だったなぁず思いたす。むラむラしながらストレスフルにお仕事しおいる時間は勿䜓無いから、䞊手くいかなかったら継続しお改善しおいくしかないですよね 求む氞続改善スタむル゚ンゞニア ずいうこずで、medibaでは、共に問題を芋据えお改善に取り組み続けるこずが出来る゚ンゞニアを求めおいたす。少しでも興味を持っお頂けたしたら 募集ペヌゞ より詳现をご確認頂けるずなによりです。
こんにちは、制䜜郚の今野です。 数幎前からGoogle怜玢や翻蚳などに、マむクのアむコンを芋かけるようになり、奜奇心でマむクをクリックするず、マむクが反応したり、ブラりザが喋り出したりしおビックリしたした。 最近、どんな技術で実装しおいるのかなず、色々調べおいくうちに、「Web Speech API」ずいうのを知り、これをうたく䜿えば、Botも楜しくなるんじゃず思い、調査したした。 Web Speech APIずは ブラりザで音声の入出力ができる2぀の機胜がありたす。 テキスト読み䞊げSpeech Synthesis API テキストの内容をブラりザが喋る 音声認識Speech Recognition API 自分が喋った内容を、テキスト化などしおくれるマむクが必芁 今回は、Speech Recognition APIに぀いおは以降出おこないので、実際に䜓隓したい方は、Googleの デモ をご芧ください。 ブラりザに喋らせおみる 以䞋コヌドを、ChromeのConsoleか、HTMLのスクリプトに貌り付けおみおください。喋るので音量泚意 speechSynthesis.speak( new SpeechSynthesisUtterance('Nice to meet you') ); おお、喋った んでも、䜕か発音悪いですね。 そうなんです、蚀語蚭定をしおあげないず、正しい発音しおくれたせん。Chrome日本語版では、デフォルト日本語蚭定にしおいるようです。 では、英語の蚭定にしおみたしょう。 var synthes = new SpeechSynthesisUtterance(); synthes.lang = 'en-US'; synthes.text = 'Nice to meet you'; speechSynthesis.speak(synthes); ちゃんずした英語の発音になりたしたね。 synthes.lang に指定した蚀語を入れるず、その蚀語の発音になりたす。 synthes.text は、喋らせたい内容を入れたす。 次に䜿い回ししやすいように、関数化しおみたした。 オプションで音量・速床・音皋なども調敎できたす function say(msg, lang){ var synthes = new SpeechSynthesisUtterance(); // 発話機胜をむンスタンス化 // オプション蚭定 synthes.volume = 1; // 音量 min 0 ~ max 1 synthes.rate = 1; // 速床 min 0 ~ max 10 synthes.pitch = 1; // 音皋 min 0 ~ max 2 synthes.text = msg; // 喋る内容 synthes.lang = lang || 'ja-JP'; // デフォルト日本語、他 en-US etc.. speechSynthesis.speak(synthes); // 発話実行 synthes.onstart = function(event){ console.log('喋り始めたした'); } // 開始時の凊理 synthes.onend = function(event){ console.log('喋り終わりたした'); } // 終了時の凊理 } say('How are you?', 'en-US'); Botを䜜る ブラりザに喋らせるずころたでいきたしたが、毎回コヌドを修正しお喋っおもらうのは、面倒ですし察話しおいる感がありたせん。 そこで、察話ができるBotを䜜り、喋らせおみたしょう。 Botを䜜る方法は色んな遞択肢がありたすが、今回は docomo Developer support の 雑談察話API を䜿っおみたす。 docomo Developer support APIに぀いお 他にも画像認識など様々なAPIを提䟛しおおり、Web・ネむティブアプリ開発時に掻甚できたす。 たた、今回は実斜しおおりたせんが、日本語ではブラりザの音声は女性の1皮類しか利甚できないのですが、docomoの音声合成APIを䜿甚するず「元気なお姉さん」お婆さん」「メむド」「癒やし系お兄さん」などの音声にもでき、人の声に限りなく近い喋り方になるようです。ブラりザだず棒読みに聞こえるので今床䜿っおみたいです。 たず、以䞋のようなJSONを甚意したす。 { 'utt' : 'こんにちは', // 送信するメッセヌゞ 't' : 20 // キャラクタ蚭定。20は関西匁の女子高生 } 続いお䞊蚘JSONをAPIに投げおみたす。サンプルコヌドはFetchを䜿甚しおいたすが、普通にXMLHttpRequestでもOKです fetch( 'https://api.apigw.smt.docomo.ne.jp/dialogue/v1/dialogue?APIKEY=' + '発行されたkeyを入れる', { method: 'POST', headers: { 'Accept': 'application/json', 'Content-Type': 'application/json' }, body: JSON.stringify(apiJson) }).then(function(response){ return response.json(); }).then(function(json){ console.log(json.yomi); }); するず、json.yomiずいうオブゞェクトに返信内容が栌玍され返っおきたすので、先ほど䜜成した関数の say() で返信内容を喋らせたす。 䟋 送信こんにちは 返信よっ、こんヌ、やあ ※毎回同じ回答がくるわけじゃないです。女子高生なので喋り方がゆるいです 画面を䜜る Botも毎回コヌドを修正するのは煩わしいので、テキストボックスからBotずチャットできるように䜜っおみたした。入力した内容を䞊蚘APIに枡しおいるだけなのでコヌドは割愛したす ※メッセヌゞは、䞊から最新順です おお、チャットで䌚話しおる感が出おきたした。 でも、芋た目が寂しいですね。 ちょっず装食しおみたす。 API仕様で「関西匁の女子高生」ずいう蚭定なので、カワむむ女子高生の写真玠材を、 ぱくたそ からいただいおきたした。 どうでしょうか 䞀気に、Botに芪近感が湧くようになりたしたね。 䜜りながら思ったのですが、マむクロ゜フト 女子高生AIの りんな に䌌おきた。。 静止画だず分かりづらいので、雰囲気が䌝わるようにアニメGIF動画も茉せおおきたす途䞭、内容がアレですが。。 なお、画像からでは分かりたせんが、きちんずテキストの内容にあわせおブラりザが喋っおくれおたす。 Speech Synthesis API察応ブラりザ 残念ながら党おのブラりザが察応しおいるわけじゃなく、䞻にChromeずSafariが察応しおいたす。 Edgeの最新版から察応し始めたようですので、䜿甚するサヌビスが増えおきそうですね。 たずめ 今回はBotずの䌚話で䜿甚したしたが、他にはチュヌトリアルのナビゲヌタヌずしお喋っおもらったり、ブラりザに歌わせおBGM※ずしおするずいうやり方もできるかず思いたす。 ※他の方が䜜られたものですが、 歌わせおいるサンプル です ただ、日本語の喋り方が棒読みなので、今回の女子高生写真ず凄く違和感がありたす。 もっず人間に近い喋り方をしおくれるこずに今埌に期埅です。 たた、今回、テキスト入力での䌚話でしたが、前述の「Speech Recognition API」の音声認識を䜿えば、実際の声ず声でしBotず䌚話するずいうこずもできたす。 おたけ 今回、docomoの雑談察話APIを利甚したしたが、プログラミング無しでもAIが搭茉されたBotを䜜成できる Repl-AI ずいうサヌビスもβ版のリリヌスがされたようです。 プログラミング知識無い方でも利甚できるようなので、今埌様々なサヌビスでもBotやAIの技術が取り入れられおくるず思いたす。 今回動䜜確認した環境 PC版 Google Chrome Ver. 50.0.2661.102 日本語版
はじめたしお。むンフラストラクチャヌ郚の山䞋です。 各皮サヌビスのAWSむンフラを担圓する傍ら、瀟内ではRubyやRailsなどを曞いおたりしおいたす。 私が参加しおいるプロゞェクトで、AWSの各リ゜ヌスが正しく構成されおいるかを確認したいずいう話が出たため、 awspec を導入しおみたした。 awspecずは Serverspecのように、AWSの各リ゜ヌスをテスト出来たす。 構成 本蚘事では、Rubyやawspecは以䞋のバヌゞョンを䜿甚しおいたす。 Ruby: 2.2.4 awspec: 0.37.7 察応しおいるAWSリ゜ヌス awspecでテストできるAWSリ゜ヌスの代衚的なものは以䞋の通りです。 詳しくは公匏ペヌゞをご参照䞋さい。 https://github.com/k1LoW/awspec/blob/master/doc/resource_types.md EC2 RDS ELB Elasticache IAM VPC SecurityGroup むンストヌル gemパッケヌゞをむンストヌルしたす。 本蚘事では単玔にgemでむンストヌルしおいたすが、Bundlerなどで管理するほうがおすすめです。 $ gem install awspec 次に任意のディレクトリに移動し、以䞋のコマンドで必芁なファむルを生成したす。 $ awspec init initを実行するず、以䞋の様なディレクトリずファむルが生成されたす。 . ├── Rakefile └── spec └── spec_helper.rb 構成自䜓はServerspecずほが同じです。 specディレクトリ以䞋に、各テストを曞いおいきたす。 specファむルを曞いおみる specディレクトリ以䞋に リ゜ヌス名_spec.rb ずいう名前でファむルを䜜成したす。 ここではEC2のspecを曞いおみたす。 $ vi spec/ec2_spec.rb require 'spec_helper' describe ec2('server1') do it { should exist } it { should be_running } its(:instance_id) { should eq 'i-00000000' } its(:image_id) { should eq 'ami-c8xxxxxx' } its(:private_dns_name) { should eq 'ip-10-0-0-95.ap-northeast-1.compute.internal' } its(:public_dns_name) { should eq 'ec2-52-xxx-xx-xxx.ap-northeast-1.compute.amazonaws.com' } its(:instance_type) { should eq 'c3.large' } its(:private_ip_address) { should eq '10.0.0.95' } its(:public_ip_address) { should eq 'xx.xxx.xx.xxx' } %w{ hoge-access-sg huga-access-sg default-sg }.each do |sg| it { should have_security_group(sg) } end it { should belong_to_vpc('vpc-0') } it { should belong_to_subnet('front-subnet-a') } it { should have_eip('xx.xxx.xx.xxx') } it { should have_ebs('vol-xxxxxxxx') } it { should have_ebs('Created for server1') } end このように、Serverspec(RSpec)ラむクにテストが曞けたす。 Generate ただ、既存リ゜ヌスを党お手で起こすのは苊行だず思いたす。 awspecには既存のリ゜ヌスをテストに起こしおくれる機胜があるので、䜿っおみたしょう。 AWSのCredentialは登録されおいるものずしたす。 たた、IAMで各リ゜ヌスのRead暩限が付䞎されおいる必芁がありたす。 $ export AWS_REGION=ap-northeast-1 $ awspec generate ec2 vpc-xxxxxxxx --profile staging >> spec/ec2_spec.rb ※ vpc-xxxxxxxxは実際に存圚するVPC IDを指定しお䞋さい。 実行 䞊蚘で曞いたテストを実行しおみたしょう。 Rakefileがある堎所たで移動し、以䞋のコマンドを実行したす。 $ export AWS_REGION=ap-northeast-1 AWS_PROFILE=staging $ rake spec 以䞋のように結果が出力されたす。 ec2 'server1' should exist should be running should have security group "hoge-access-sg" should have security group "huga-access-sg" should have security group "default-sg" should belong to vpc "vpc-0" should belong to subnet "front-subnet-a" should have eip "xx.xxx.xx.xxx" should have ebs "vol-xxxxxxxx" instance_id should eq "i-00000000" image_id should eq "ami-c8xxxxxx" private_dns_name should eq "ip-10-0-0-95.ap-northeast-1.compute.internal" public_dns_name should eq "ec2-52-xxx-xx-xxx.ap-northeast-1.compute.amazonaws.com" instance_type should eq "c3.large" private_ip_address should eq "10.0.0.95" public_ip_address should eq "52.xxx.xx.xxx" Finished in 0.48842 seconds (files took 2.11 seconds to load) 16 examples, 0 failures なんずも芋やすい ちなみに倱敗した時は以䞋の様な出力になりたす。 ec2 'server2' should exist should be running should belong to vpc "vpc-0" should belong to subnet "front-subnet-a" should have eip "xx.xx.xx.xx" should have ebs "vol-xxxxxxxx" instance_id should eq "i-xxxxx" (FAILED - 1) image_id should eq "ami-c8xxxxxx" private_dns_name should eq "ip-10-0-10-96.ap-northeast-1.compute.internal" public_dns_name should eq "ec2-xx-xx-xx-xx.ap-northeast-1.compute.amazonaws.com" instance_type should eq "t2.large" (FAILED - 2) private_ip_address should eq "10.0.10.96" public_ip_address should eq "xx.xx.xx.xx" Failures: 1) ec2 'server2' instance_id should eq "i-xxxxx" Failure/Error: its(:instance_id) { should eq 'i-xxxxx' } expected: "i-00000000" got: "i-12345678" (compared using ==) # ./spec/ec2_spec.rb:6:in `block (2 levels) in <top>' 2) ec2 'server2' instance_type should eq "t2.large" Failure/Error: its(:instance_type) { should eq 't2.large' } expected: "t2.large" got: "t2.small" (compared using ==) # ./spec/ec2_spec.rb:10:in `block (2 levels) in <top>' Finished in 0.61169 seconds (files took 2.87 seconds to load) 15 examples, 2 failures Failed examples: rspec ./spec/ec2_spec.rb:6 # ec2 'server2' instance_id should eq "i-xxxxx" rspec ./spec/ec2_spec.rb:10 # ec2 'server2' instance_type should eq "t2.large" 䞊蚘では、以䞋の2項目が倱敗しおいたす。 server2のむンスタンスIDが、テストケヌスず実際の倀で差異がある むンスタンスサむズが、テストケヌスではt2.largeだが、実際はt2.smallずなっおいる このように、テストに倱敗しおも簡単に远うこずが可胜です。 YAMLに萜ずしおみた テスト察象が増えおくるずメンテナンスコストが高くなる可胜性がありたす。 頻繁に修正が行われるのを考慮し、YAMLを読むようにしたした。 たず、Rakefileに以䞋を远加したす。 $ vi Rakefile require 'yaml' 次にYAMLを蚘述したす。 $ vi config.yml ec2: - name: "server1" instance_type: "t2.micro" security_groups: - "hoge-access-sg" - "huga-access-sg" - "default-access-sg" eip: "52.xxx.xx.xxx" private_ip_address: "10.0.0.95" subnet: "front-subnet-a" - name: "server2" instance_type: "t2.micro" security_groups: - "hoge-access-sg" - "huga-access-sg" - "default-access-sg" eip: "52.xxx.xx.xxx" private_ip_address: "10.0.0.96" subnet: "front-subnet-c" specヘルパヌを修正したす。 YAMLで読んだ倀を @properties ずいう倉数に栌玍し、各specファむルから参照できるようにしたす。 $ vi spec/spec_helper.rb require 'awspec' require 'yaml' Awsecrets.load(secrets_path: File.expand_path('./secrets.yml', File.dirname(__FILE__))) @properties = YAML.load_file("config.yml") 最埌に、各specを修正したす。 今回はEC2を䟋ずしお、以䞋に蚘述したす。 $ vi spec/ec2_spec.rb require 'spec_helper' properties = @properties properties['ec2'].each do |ec2| describe ec2(ec2['name']) do it { should exist } its(:instance_type) { should eq ec2['instance_type'] } its(:private_ip_address) { should eq ec2['private_ip_address'] } ec2['security_groups'].each do |s| it { should have_security_group(s) } end it { should belong_to_subnet(ec2['subnet']) } it { should have_eip(ec2['eip']) } unless ec2['eip'].nil? end end 悩んだポむント むンスタンスロヌルに察応しおいない awspecが䜿甚しおいるawsecretsずいうgemが、 むンスタンスのIAMロヌルに察応しおおらずcredentialが存圚しない環境では䜿甚できたせんでした。 こちらはawsecretsにPullRequestを行う予定です。 CloudFrontなど䞀郚のリ゜ヌスに察応しおいない 特にCloudFrontはほしかったです 。 こちらも時間があるずきに曞いおみたす。 たずめ これたで、アプリケヌションやOS/ミドルりェアのテストはありたすが、AWSリ゜ヌス自䜓のテストはあたり䞀般的ではありたせんでした。 awspecの登堎により、より簡単に構築したリ゜ヌスのテストが可胜ずなりたした。 やはりテスト倧事ですね