Amazon Rekognitionを検証する名目による御遊び その2
tukino-salve.hatenablog.com
Expressのディレクトリ構造は大体分かったんで、本題に戻ります。
今回は
1. ファイルをアップロードする
2. アップロードしたファイルを分析する
3. 分析結果を画面に表示する
と言う流れができればいいかな、という目標でやります。
Node.js+Expressその2
前回の続きです。 tukino-salve.hatenablog.com
今回はRekognitionの検証用に作ったページをExpressのディレクトリ構造に当てはめて置き換えしていきます。
あとついでにRekognitionへの問い合わせを非同期化して、
画面問い合わせとRekognitionによる分析を切り分けるようにしていきます。
Node.js+Express
この件を進める前にヤルコトがある。 tukino-salve.hatenablog.com
Node.js自体ほとんど触った事ないからプロジェクトのディレクトリ構造何も知らん
このまま進めたら多分あとで分け分からんことになる…。
しょーがないので脇道にそれてお勉強ですよ。
ワカランケド、定番っぽいExpressにしてみることにする。
以下のサイト様を参考に進める。 qiita.com
ふむふむ。 とりあえずこれに則って進めていきマショウ。
しかし、これ処理かくところがapp.jsしかないよな?肥大化しねえ? 。。。っと思ってたらapp.jsからroute/*.jsが呼ばれるのか。なーる。
次はRekognitionのやつの置き換えをやってみよう。
Amazon Rekognitionを検証する名目による御遊び
Amazon Rekognitionを使ってみようという遊び
画像アップロード⇒自動でタグ付け⇒アルバムを分ける。みたいなことをやってみようかと。
目的としては以下をそれぞれ使ってみること。
- Amazon EC2
- Amazon S3
- Amazon RDS
- Amazon Rekognition
この中で多少触った事があるのはEC2のみ。RDSすら触った事がない。
なので勉強がてら。
以下のサイト様を参考にまずはRekognitionを動かしてみる。
qiita.com
これは勿論問題なく動いた。
次にEC2を立ててnode.js上で動くように改変してやると・・・。
// httpモジュールの読み込み var http = require('http'); var AWS = require('aws-sdk'); // AWSにアクセスキー、シークレットキー、リージョンの情報を渡す AWS.config.update({ accessKeyId: 'xxx', secretAccessKey: 'xxx', region: 'us-east-1', }); // 利用する AWS Rekognition のバージョンを設定 AWS.config.apiVersions = { rekognition: '2016-06-27', }; // hhtpサーバの作成 http.createServer(function (req, res) { var rekognition = new AWS.Rekognition(); // Rekoginiton API に渡すパラメータを設定する // バケット名、画像名を設定、最大取得ラベル数、ラベルの確度を指定している var params = { Image: { S3Object: { Bucket: "image-categorize", Name: "cat.jpg" } }, MaxLabels: 100, MinConfidence: 70 }; res.writeHead(200, {'Content-Type': 'text/plain'}); rekognition.detectLabels(params, function(err, data) { var mes = ""; if (err){ console.log(err, err.stack); // an error occurred } else { // successful response data.Labels.forEach(function(label) { mes += label.Name + ": " + Math.round(label.Confidence) + "\%\n"; }); } res.end(mes); }); }).listen(3000);// ポート番号3000版でコネクションの受入を行う // 実行時、コンソールに表示されるメッセージ console.log('Server running at http://[your_public_ip]:3000/');
よしよし。とりあえず想定通り動いたぞー。
これをいい感じに変えていきます。
しかし、EC2をTOKYOリージョンにして、S3をUSリージョンにしてあるんだけど、
VPC周りとかどうなるんじゃ?
Firefox network.dns.disabeleIPv6 私的メモ
会社で使っているPCでハブかネットワークドライブの調子が凄く悪くて、前々から半日おきくらいにネットワークアクセスできなくなる症状があった。
で、ネットワークドライブの再起動とかでだましだまし使っているんだけど、Firefoxだとそれをやっても改善しない。
※IEとかは一時的に繋がらなくてなってもネットワークドライブの再起動とかで復活していた。
かなり古い記事だけど、以下を試したらFirefoxの症状は改善した。・・・ぽい。
detail.chiebukuro.yahoo.co.jp
根本的な問題は未解決だけど。
Google Cloud Platformを使ってみた
AWSとAzureは少し触ってみたことがあるので、最近よく目にするGoogle Cloud Platformも触ってみよう、ってことでやってみた。
まずは無料トライアル登録。
cloud.google.com
してからのログイン。...ん?プロジェクトを作る?
プロジェクト毎に環境を管理できるとかそういう感じかな?
作るものの目標もなく始めたので、とりあえず以下のサイトを参考にしながら少し触ってみることに。
qiita.com
うーん。2015年記事みたいだし、結構変わってるみたいだなぁ。
とりあえず手探りでやってみる。
まずはCompute Engineを探す。
インスタンスを作成から適当に設定をポチポチ変える。
初期設定だとまともなCPU設定とかになってるみたいなので、最低限のスペックに設定。
まぁ、勿論できた。
SSH周りがちょっと面倒そう…。
あと試していたときの環境が云々カンヌンでコンソールからの接続が手間そうだったので、とりあえず、ブラウザから操作してみる。
うーん、とはいえ目標もなく始めたからやることは特にない。
とりあえずPingでも打っとくか。
できた。
さーて、これからこれでどう遊ぶか考えますカネ。
Visualforceハマリ。~apex:formとapex:repeat編~
メンバーから問い合わせあってちょっとハマった話。
<apex:form id="Sample"> <apex:repeat value="{!list}" var="item"> <apex:variable var="loopIndex" value="{! loopIndex + 1 }"/> <apex:pageBlock title="list"> <apex:pageBlockSection title="list"> <apex:inputField value="{!item.Name}"/> <apex:inputField value="{!item.xxx__c}"/> <apex:commandButton rerender="Sample" value="Save" action="{!save}"> <apex:param name="loopIndex" value="{!loopIndex}" assignTo="{!loopIndex}"/> </apex:commandButton> </apex:pageBlockSection> <apex:commandButton rerender="Sample" value="Save" action="{!save}"> <apex:param name="loopIndex" value="{!loopIndex}" assignTo="{!loopIndex}"/> </apex:commandButton> </apex:pageBlock> </apex:repeat> </apex:form>
これだとApex側のSaveメソッドでInputfieldの値がセットされていなかった。
<apex:form id="Sample"> <apex:repeat value="{!list}" var="item"> <apex:variable var="loopIndex" value="{! loopIndex + 1 }"/> <apex:pageBlock title="list"> <apex:pageBlockSection title="list"> <apex:inputField value="{!item.Name}"/> <apex:inputField value="{!item.xxx__c}"/> </apex:pageBlockSection> <apex:commandButton rerender="Sample" value="Save" action="{!save}"> <apex:param name="loopIndex" value="{!loopIndex}" assignTo="{!loopIndex}"/> </apex:commandButton> </apex:pageBlock> </apex:repeat> </apex:form>
こうしたらとりあえず解決した模様。
と思ったらちょっと違ったらしい。
そもそも前提ソースが少し違っていたようでapex:repeatの子要素にapex:formが指定されていたらしい。
リファレンスにも書いてあるけど、ダメな記述。
うーん、しかし何故ダメなんだろう。
しかもエラーにはならず、挙動が変わるってのはちと恐ろしい。
開発者ガイドに書いてあるとはいえ・・・。