nidの技術メモ

IT系の技術メモを中心につらつら書いています。文章力がなく、読みづらいかもしれません。

AWS Dev Day Challengeに参加してきた

チーム「羽根つき餃子」で開発コンテストにチャレンジしてきました。

3分のピッチだと話しきれなかったので、ここに熱い想いを残しておくw

テーマ

以下の4つからの選択制(5つ目の選択肢として自由もあったけど)

  • チャット
  • 動画投稿サイト
  • SNS
  • チャットボット

自分たちは「チャット」を選択

作ったもの

「強制ニコニコチャット」

  • ログイン画面(スマイル認証 笑顔じゃないと使えませんw) f:id:nidstyle3:20181103003407p:plain

  • チャット画面(ネガティブワードを「ピーー」に自動変換) f:id:nidstyle3:20181103003420p:plain

目指したアーキテクト図

f:id:nidstyle3:20181103003724p:plain

  • Cloudfrontで公開
  • API Gateway + Lambda + Rekognition + Cognitoでスマイル認証
  • AWS IoTでメッセージのやり取り
  • Lambda + Comprehendでネガティブワード変換

実際のアーキテクト図

f:id:nidstyle3:20181103003807p:plain

できなかったこと

docs.aws.amazon.com

S3の画像ではRekognitionの動作が確認できてたので、ここは要調査。Lambdaでbase64形式で受け取れてたかも。詳しい人教えてください。。

  • Cognitoでの認証

    今回はIAM認証情報を固定で返すように設定

  • 感情認識

Comprehendの日本語対応をお願いします!

Mecabと単語感情極性対応表PN Tableを使って頑張ろうとしたけど、力尽きた。

ピッチの時に「translateで日本語→英語変換を行った後Comprehendに渡す」というのを聞いて、後で試してみたらなんとなく動いた。
でも、精度を上げるのは難しそう。

f:id:nidstyle3:20181103005621p:plain

f:id:nidstyle3:20181103005634p:plain

できたこと

  • SPA + API のサーバーレス構成(フロントはjQuery
  • AWS IoTでチャットメッセージのやり取り
  • Serverless Frameworkを使ったLambdaへのデプロイ
  • Cloudfrontで公開

やらなかったこと

  • CI/CD
  • ロギング
  • モニタリング

ハッカソンなので継続的にデプロイする必要もないし、安定運用する必要もないので切り捨てた。
でも、本当はここが一番やりたかったかも。

感想

ComprehendやRekognitionなど、今まであまりさわれてなかったサービスに触れることができて面白かった。
またこういう機会があれば参加したい!

OpenShift Meetup Tokyo #1に参加してきました

openshift.connpass.com

海外からOpenshiftのキーマンが来られるという事で、行ってきました

  • Joe Fernandes (VP, Strategic Business Unit)
  • Christian Vogel (CoreOS Product Management)

以下、トピックスをずらずらとメモしてます。

何か間違いがあればコメントにて指摘いただければと思います。

OPENSHIFT 3.11 TOPICS

1.管理コンソールがあたらしくなった(モニタリング、オペレーターライフサイクルマネジメント、メータリング)

2.モニタリング&メトリクス(上記管理コンソールのMonitoringメニューから可能)

  • Prometheus and Grafana
  • AlertマネージャーがSlackやPagerDuty、Emailに通知

3.オペレーターフレームワーク

HELM chartと連携

OPENSHIFT 4.0 TOPICS

  1. CoreOSもサポート

  2. Unified Hybrid Cloud

  3. Kubernetes Apps MarketPlace

  4. Ansible Operator(Ansibleでコンテナイメージを作れる)

  5. ISTIO Service Mesh

  6. Container Native Virtualization(https://kubevirt.io/)

所感

Prometheus、Grafana、ISTIO等積極的にエコシステムを取り込む方向性なのは嬉しいですね。

自社で運用するのではなく、お客様先にKubernetesを構築するとなった場合にサポートのあるKubernetesとしてOpenShiftはアリだなと感じました。

あと、通訳の人凄かったです。感謝してます。

シェルスクリプトで例外処理

シェルスクリプトで例外処理ができないかと調べてたら、trapというものがあったのでメモしておく。

lagendra.s.kanazawa-u.ac.jp

使用方法

trap トラップ時の処理 シグナル

ubuntu14.04の場合は以下のシグナルが使用可能。

trap -l
1) SIGHUP 2) SIGINT 3) SIGQUIT 4) SIGILL 5) SIGTRAP
6) SIGABRT 7) SIGBUS 8) SIGFPE 9) SIGKILL 10) SIGUSR1
11) SIGSEGV 12) SIGUSR2 13) SIGPIPE 14) SIGALRM 15) SIGTERM
16) SIGSTKFLT 17) SIGCHLD 18) SIGCONT 19) SIGSTOP 20) SIGTSTP
21) SIGTTIN 22) SIGTTOU 23) SIGURG 24) SIGXCPU 25) SIGXFSZ
26) SIGVTALRM 27) SIGPROF 28) SIGWINCH 29) SIGIO 30) SIGPWR
31) SIGSYS 34) SIGRTMIN 35) SIGRTMIN+1 36) SIGRTMIN+2 37) SIGRTMIN+3
38) SIGRTMIN+4 39) SIGRTMIN+5 40) SIGRTMIN+6 41) SIGRTMIN+7 42) SIGRTMIN+8
43) SIGRTMIN+9 44) SIGRTMIN+10 45) SIGRTMIN+11 46) SIGRTMIN+12 47) SIGRTMIN+13
48) SIGRTMIN+14 49) SIGRTMIN+15 50) SIGRTMAX-14 51) SIGRTMAX-13 52) SIGRTMAX-12
53) SIGRTMAX-11 54) SIGRTMAX-10 55) SIGRTMAX-9 56) SIGRTMAX-8 57) SIGRTMAX-7
58) SIGRTMAX-6 59) SIGRTMAX-5 60) SIGRTMAX-4 61) SIGRTMAX-3 62) SIGRTMAX-2
63) SIGRTMAX-1 64) SIGRTMAX

例) trap 'echo trap' 15
シグナルに'ERR'と書くと、0以外の終了コードに対応してくれる。

これでcurlの失敗や外部ファンクションを呼び出しエラーを捕捉できそう。

fluentdのudp通信ではまったこと。

fluentdでforwardすると、「detached forwarding server」が出力されて結構ハマったのでメモ。

先に環境を。
OS RedHatEnterpriseLinux 6.2 (ESX5.0上で動作)
ruby 1.9.3p194 (2012-04-20 revision 35410) [x86_64-linux

fluentd (0.10.19, 0.10.13)
 

送信元(fluent_send)からfowardでログ管理サーバー(fluent_recv)にsendmailのログを送りたくて、ざっくり以下を設定。(forward部分のみ抜粋)

送信側(fluent_send)

<source>
  正規表現等々
</source>
<match sendmail.*>
    type forward
    host fluent_recv
    port 24224
    buffer_type file
    buffer_path /var/log/fluent/myapp-forward
    retry_limit 50
    flush_interval 10s
  </store>
</match>


受信側(fluent_recv)

<source>
  type forward
  port 24224
  bind 0.0.0.0
</source>
<match sendmail.*>
  // マッチング処理
</match>

 「detached forwarding server」が出力されたので、twitterで嘆いてると、@kzk_moverさんにありがたい助言を頂いてhttp://d.hatena.ne.jp/oranie/20120323/1332498317あたりを参考にしながらUDPが怪しいんじゃないかってところまではわかった。
でも、一つの物理サーバー上で動いてるVM間での通信なので、VMのネットワークのみを使用してる。
もちろんFWはないし、iptablesもSE Linuxもオフってみる。

・・・が、うまくいかない。

実際にtcpdumpで見てみると、確かにudpの通信が来ていない。。
コマンド:tcpdump -X port 24224 -e -vv
※念のため-eを指定して、MACアドレスも確認する。(仮想NICのため)
だがしかし!
nmapしてみると、ちゃんとudpが通ってる。※ 受信側のtcpdumpでパケットを確認。
コマンド:nmap -p 24224 -sU あて先IP

ってことは、rubyudpが問題??ってことで、シンプルなudpテストコードを書いてみる。

Require “socket”
udp = UDPSocket.open()
sockaddr = Socket.pack_sockaddr_in(24227,”IPADDR”)
udp.send(“hello”, 0, sockaddr)
udp.close()

で、結果はNG。tcpdumpでは送信側のパケットは見えるけど、受信側には何も出てこない。
どうもrubyが怪しいってことはわかったけど、原因がわからない。

VMが怪しいのではと思い、送信元を物理マシンに変更すると、正常に送信された!
VMrubyの組み合わせがNGってところまで絞れた。

ネットワークを一時的に無差別モードにしてみたけど、変わらない。
VMwareToolsのバージョンを上げたり、仮想HWのバージョンを上げても変化なし。
VMの切り分けで策が尽きたので、yum updateを走らせてみる。
そしてOSをrebootすると、rubyのテストコードが送信、受信側それぞれでパケットを確認できた!
ってことは、OS or ソフトレベルの問題っぽい。

アップデートされたソフトを"/var/log/yum.log"で確認して、怪しそうなのを絞り込む。
数が多かったけど、あやしそうなのは・・・カーネル
VMのスナップショット機能を使って、update前に戻してから、カーネルのみアップデートしてOSをrebootしてテストコードを流すと、バッチリパケットを確認できた。

これをもとにググってみると、この情報を発見!
https://access.redhat.com/knowledge/ja/node/67823 

要するに、下記の環境だと小さいudpパケットをロスしちゃいますよーってことらしい。
今回たまたまこれに該当してた。

Environment
  • RHEL 6 update 2

  • kernel-2.6.32-220.el6.i686 / kernel-2.6.32-220.2.1.el6.x86_64 / kernel-2.6.32-220.el6.x86_64

  • vmxnet3 1.1.18.0-k

  • Vmware ESX Host

それにしても、fluentdをVM上のマシンで使うってのは結構ありそうな話やけど日本語の情報は全然なかった。
みんな人知れず解決しちゃってるのかなー。

WindowsからUbuntuにお乗り換え

普段使ってるPCのOSをWindows7 32bit からUbuntu11.10 32bit に入れ替えたので、設定の備忘録

[PC環境]
Lenovo X220
CPU Intel(R) Core(TM) i5-2520M CPU @ 2.50GHz
Memory 2GB

[インストール]
B5ノートのためDVDドライブがなく、UNetbootinを使ってUSBからUbuntuを導入しました。
使い方はtextdropのブログ参照
http://www.textdrop.net/soft/unetbootin-usb-instal/

USBからブートするために、BIOS設定を変更。
Lenovoロゴ画面でF1押せばBIOS設定画面になります。
変更したら、USB差して再起動すればUbuntuのセットアップ画面になります。
インストール手順はこの辺見てください。
昔とは比べ物にならないぐらい楽になりましたねー。
20分ぐらいで導入完了しました!早い!!!

[デスクトップ環境]
Unityがアレなので、デスクトップ環境を軽くするためにlubuntu-desktop環境をインストールしました。
Ubuntuソフトウェアセンターで"lubuntu-desktop"で検索かけると自動的にダウンロードしてインストールが実行されます。
これで簡単にLXDE+Openboxな環境が出来上がっちゃいました。

[F5Networks SSL-VPN設定]
SSL-VPNで接続することがあるので、その設定。
firefoxJavaアプレット動かすためにjreが必要なのでhttp://java.com/ja/download/から自己解凍ファイルをDL。
以下、こんな感じ。
chmod +x jre-6u31-linux-i586.bin
sudo jre-u31-linux-i586.bin
sudo mv jre1.6.0_31 /usr/lib/jvm/
cd /usr/lib/firefox/plugins/
ln -s /usr/lib/jvm/jre1.6.0_31/plugin/i386/ns7/libjavaplugin_oji.so

次に、SSL-VPNで接続してnp_F5_SSL_VPN.soとSSLVpn.tgzをDLする。
mv np_F5_SSL_VPN.so ~/.mozilla/plugins
tar zxvf SSLVpn.tgz
※/usr/local/lib/にF5Networksが作成されます。
これでfirefox再起動で無事接続できました!

外出先でプロジェクターにPCの画面映そうと思ったらうまく映らずorz
iPadにも資料置いてたから、そっち映して事なきを得たけど、
まだまだ設定することがたくさんありそうなので順次アップしたいと思います。
今日のところはここまで。

CassandraをWindowsで検証してみる。

会社で使ってるPCがWindowsなのでローカルでさくっと検証したいと思って入れてみました。

せっかくなので、最近出たVer1.0.0を検証してみます!
※現在はVer1.0.1が最新です。
■前提条件cassandraはJavaで書かれているため、JDKが必要です。JDKの最新バージョンをインストールしておいて下さい。
DL先http://java.sun.com/javase/ja/6/download.html

■導入手順

http://cassandra.apache.org/download/からapache-cassandra-1.0.0-bin.tar.gzをダウンロードする。
適当な場所に解凍する
※今回は"c:\tools"

環境変数を以下の通り登録
CASSANDRA_HOME c:\tools\apache-cassandra-1.0.0
コマンドプロンプトを開き、cassandra.batを実行する。
※こいつは起動しっぱなしにしておく。

この辺を参考にしながらcassandra-cliを使ってみる。

Cassandraに接続
connect localhost/9160;※デフォルトでTest Clusterというクラスターが存在している。
keyspaceの作成
create keyspace keyspace1;※キースペースはRDBMSでいうところのデータベースをあらわす。
keyspaceの使用
use keyspace;※キースペースを使用する時は明示的に指定する必要がある。この辺はMySQLとか、RDBMSやってれば雰囲気は一緒。
column familyの作成
create column family columnfamily1;
値の入力
set columnfamily1['1']['1'] = 'aaa';
※デフォルトではキーに数字しか使えないみたい
http://wiki.apache.org/cassandra/CassandraCli
textキーを使いたい場合はカラムファミリーをUTF8にしろと書いてある。
update column family User with key_validation_class=UTF8Type; 
あと、キーを作るときに以下の2つの方法で指定(どちらでもOK)
set User[utf8('jsmith')]['first'] = 'John';
assume User keys as utf8;
set User['jsmith']['first'] = 'John';

カラム名については事前に定義することでテキストを使用できた。
create column family User with
  comparator = UTF8Type and
  column_metadata =
  [
    {column_name: first, validation_class: UTF8Type},
    {column_name: last, validation_class: UTF8Type},
    {column_name: age, validation_class: UTF8Type, index_type: KEYS}
  ];
以上で一通りの操作は完了!
次回はCassandra-cliについてもう少し深く突っ込んでみます。