つきのさんアソビバ。

IT的なことからアケゲー、オンゲなど趣味もつらつら

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

qiita.com

ふむふむ。 とりあえずこれに則って進めていきマショウ。

しかし、これ処理かくところがapp.jsしかないよな?肥大化しねえ? 。。。っと思ってたらapp.jsからroute/*.jsが呼ばれるのか。なーる。

次はRekognitionのやつの置き換えをやってみよう。

Amazon Rekognitionを検証する名目による御遊び

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/');




f:id:tukino_salve:20170317154708p:plain

よしよし。とりあえず想定通り動いたぞー。

これをいい感じに変えていきます。




しかし、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を探す。
f:id:tukino_salve:20170316135216p:plain

インスタンスを作成から適当に設定をポチポチ変える。
初期設定だとまともなCPU設定とかになってるみたいなので、最低限のスペックに設定。
f:id:tukino_salve:20170316135201p:plainf:id:tukino_salve:20170316135209p:plain

まぁ、勿論できた。
f:id:tukino_salve:20170316135221p:plain

SSH周りがちょっと面倒そう…。
あと試していたときの環境が云々カンヌンでコンソールからの接続が手間そうだったので、とりあえず、ブラウザから操作してみる。
f:id:tukino_salve:20170316135228p:plain

f:id:tukino_salve:20170316135227p:plain


うーん、とはいえ目標もなく始めたからやることは特にない。
とりあえずPingでも打っとくか。
f:id:tukino_salve:20170316135229p:plain


できた。


さーて、これからこれでどう遊ぶか考えますカネ。

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が指定されていたらしい。

developer.salesforce.com

リファレンスにも書いてあるけど、ダメな記述。

うーん、しかし何故ダメなんだろう。
しかもエラーにはならず、挙動が変わるってのはちと恐ろしい。
開発者ガイドに書いてあるとはいえ・・・。