2018年3月10日土曜日

JAWS DAYS 2018

2回目の参加。前回に送迎バスで苦労したことを思い出して、歩いて会場まで行った。
昨年行ったきりなので、我ながらよく覚えている。



参加したセッションのメモ

11:10~ #jd2018_f
X−Techセッション前説①
色んな産業とawsをつなげることらしい。


農業と太陽とサーバレス(EnergyTech)

https://jawsdays2018.jaws-ug.jp/session/449/
・TrexEdgeという会社
・LoRaWAN(停電力のデータ通信技術)の紹介
・複数の太陽発電業者の監視情報を集約して表示してくれるシステム
・インフラ
  - serverless(MicroservicePatten
  - APIを提供してないシステムに関してはlambda + phantomJSでデータを取得
  - serverlessのymlファイルを分割して管理


・cognitoの認証情報から組織IDを取得
・API Gatewayでステージキャッシュしている。
→cloud frontとの違いは?

音声・言語処理を使ったエンドユーザー向けサービスを少人数で開発する(EdTech)
 https://jawsdays2018.jaws-ug.jp/session/431/
・TerraTalk:採点付きのスピーキングアプリ
・heroku + aws(s3, EC2, Lambda, polly)
・クライアント側に処理を寄せている。
 12:00~ #jd2018_a(どっちでもOK)
・ランチタイムセッション。いつもような会社紹介。LINE bot開発をする会社があった。

14:00~ #jd2018_g 
ユーザー企業におけるサーバレスシステムへの移行
https://jawsdays2018.jaws-ug.jp/session/800/
・DAISOさん
・クラウドにした理由:スケールアップの限界


・スケールアップよりはスケールアウト
・クラウドデザインパターン
   Queuing Chainパターン
   Fanoutパターン
 ・SQS:冪等性(べきとうせい)が必要
・lambda:ソース容量50MB。外部ライブラリで越えてしまう場合がある。


→説明がわかりやすくてよかった。




15:00~ #jd2018_d
実践Serverless x Microservices
https://jawsdays2018.jaws-ug.jp/session/806/
・資料
https://www.slideshare.net/ssuser9d40ae/microservices-serverless-jawsug-86462235
・書籍:マイクロサービス・アーキテクチャー
 現場で役立つシステム設計の原則 ~変更を楽で安全にするオブジェクト指向の実践技法
→既に買っている。
※会社の知り合いが質問していた。

16:00~ #jd2018_g
Reusable serverless components accross Projects via Terraform
https://jawsdays2018.jaws-ug.jp/session/804/
・serverlessフレームワークを使用している話ぽいけど、訳してくれないからよく分からない。

LambdaとStepFunctionsを使った新しい負荷試験のカタチ
https://jawsdays2018.jaws-ug.jp/session/809/
・資料?
https://techblog.haroid.io/dynamic-stepfunctions/
・一瞬で大量のlambdaを呼び出してアクセスをさせる。


・fargateを利用して5分制約を克服
・10万クライアントでも100円


その他
・よくジェダイと言っているけど、awsユーザーを示しているぽい。
・韓国でもawsイベントをやっていたらしい。
AWSKRUG&JAWS-UG Meetup day #01


2018年3月3日土曜日

根府川 おかめ桜 2018

いつも通っている駅のポスタに根府川のおかめ桜が告っていてた。

根府川のおかめ桜

早いなーと思いながら、確かこの辺なら早咲きもあるだろうし
何よりも桜の写真も撮りたくなったので、行ってみることに。

根府川は会社のBBQで一回行ったとこがあって、小さい町だったような記憶があった。
やっぱり、駅前やっている直売買も小規模でやっていた。




取り敢えず、案内の地図に乗っていた
「離れのやど星ヶ山」と「きのこ宛お山のたいしょう」を目指して道を登ってみた。


f/6.3 1/320 210mm ISO100

f/6.3 1/320 177mm ISO125
だま少ないけど、キレイに咲いているのもあった。


f/5.6 1/250 70mm ISO100

「離れのやど星ヶ山」はすだれ桜が綺麗な山荘だった。
残念ながら付いた時間が早すぎて準備中だった。取り敢えず移動。





「きのこ宛お山のたいしょう」も山小屋みたいな作りなところだった。
普段は色々やっているらしい。



インテリアも今風で、こだわりが感じられるところだった。
f/4.5 1/80 55mm ISO100



帰りは直売買場で湘南ゴールドを買った。ここもみかんとかレモンが多かった。


あと、駅から出発するヒルトン小田原も気になったところ。
聞いた話だと良さそうな感じだった。

寒くなって行くところなかったら行ってみようか。

2018年2月25日日曜日

湘南パンまつり 2018

辻堂海浜公園で開催された湘南パンまつりに行ってきた。
思ったより家族連れが多く、店によっては凄い並んでいてた。




出店した店舗は東京から小田原までで、いくつか見覚えがある店もあった。




取り敢えず、自分の御飯とおやつのパンを買って帰ることに。
昨日より寒かったし。

パン屋だけという、面白そうなイベントだったのだが
今日はラーメンの気分だよな・・・

2018年2月24日土曜日

ついに江ノ島まで行けた

今日は昼御飯の縛りもなかったし、いつもより遠目に行くことに。
やっぱり、まだ茅ヶ崎で工事が終わってない区間があったが、内陸側に廻れば行けなくはない感じだった。
わりと風も弱かったし、いつの間にか昔行ったことがある景色が見えてきてた。

まだ冬にも関わらず、江ノ島は観光客で賑わっていてた。
とは言っても夏に比べると少ない感じもする。このぐらいが丁度良いかも。

f/5 1/1000 32mm ISO100


せっかくなので、橋を渡って島まで行ってみたかったが
工事中でだいぶ狭くなっていた。
無理すれば行けなくもないが、そこまでして行くつもりにはなれなかった。
まだいつでも来れるし。



f/11 1/200 41mm ISO100

家について、走った距離を調べてみたら
片道で約23kmだった。風がなくて休まずに行けば2時間半までは掛からないかと。

2年前に設定した目標に達成できて、帰りは満足した気分だった。
あと、体力が付いたお陰かも知れないが昨年の手前まで行けた時に比べると疲れが少なかった。

この調子で、今度は鎌倉まで行けると良いかも。
あと、流石にこの距離になると午前中に往復は無理そう。
お弁当も持参しないとダメか。

2018年2月12日月曜日

黒南風(くろはえ)の海 加藤清正「文禄・慶長の役」異聞

連休の間、前から読もうと思っていた加藤清正の本をさがしたところ
この本を見つけた。


黒南風(くろはえ)の海 加藤清正「文禄・慶長の役」異聞(amazon)

題名通り、「文禄・慶長の役」なので、朝鮮出兵前後の話はあまりないし
しかも主人公は別の人だったので、探していた加藤清正の話とが違っていた。

でも、久しぶりに面白い歴史小説を読んだ気がする。
結構ボリュームがあったので、連休明けもしばらく観ることになるのかな〜と思ったら
たった2日で読み終わってしまった。

何よりも戦国武将の話は好きだったので、日本側の登場人物にも馴染みがあったし
子供の頃、歴史授業で学んでいた内容がほぼそのまま語られていたので、読みながら懐かしい感じもしていた。

ストーリも面白いが、何よりも歴史的事実をここまで調べたことが驚きだった。
私が観る感じ、日韓どちらも寄せずに公平な観点から話を進めようとしているところで
韓国人が観ても面白いのではないかな。と思う。

今度、伊東潤さんの他の作品も観たいと思う。

※ちなみに気になってブログを観たら、昨年小田原にいらっしゃってたみたい。見たかったな・・・
http://jito54.blog13.fc2.com/

lambda + PhantomJS(webdriverIO)でamazon.co.jpをスクレイピング

概要


子ども用でfireタブレットを買ってあげたのは良いけど、いくら注意してもやりすぎてしまう。
あと何かしら言い訳・誤魔化ししようとしているところがムカつくようになった。

調べたところ、amazon.co.jpに購入したfireタブレットを登録するとwebから使用状況が確認できることが分かった。
ただし、毎回確認して子どもに注意するのも面倒なので
定期的にスクレイピングして、家族のLINEグループに通知する仕組みを作ってみた。




要件


・サーバーまで運用したくないことで、lambda限定で実装
・バージョン管理はgithub + serverlessフレームワーク使用
・結果をLINEグループへ通知する。そのために事前に作った通知用のbotアカウントをグループに追加する必要があった。
・fireタブレットは2台。どちらか使用時間が3時間超えたら通知を開始、以後はどちらかが1時間超えたら通知
・1回目は前日の使用時間を表示
・amazon.co.jpへのスクレイピング11:00〜21:00まで1時間1回行う
・勉強など使用しても問題ない履歴まで集計されてしまうので、明細まで表示されるようにする
・webサイトの明細までは表示しない。(息子が見たエロサイトまで表示されてしまうので)


構成図とフロー





課題と解決まで


1. amazon.co.jpサイトのスクレイピングが難しかった。

・始めはcheerio-httpcliで試してみたが、時間を置いて動的に表示されるcssセレクタがあった為、waitを掛けれるheadlessブラウザではないとダメだった。
・lambdaでできる候補としてchromelessとphantomJSに絞った。
・chromelessの方が実装的に楽だが、原因不明のsocketタイムアウトになったため使えなかった。あと、もう少し上手いやりかたがあるかも知れないが、公式に乗っているremote実装だとlambdaを2つに分けて制御部のlambdaからchromeless本体lambdaを呼ぶような大掛かりになりそうなのが嫌だった。
・phantomjsをlambdaで動かせる為にはphantomjs-prebuiltというパッケージが必要だった。幸いサンプルがあったので使わせてもらった。

Node.jsでウェブスクレイピングする色々な方法

ブラウザの自動操作で手軽さを追求したらAWS LambdaとPhantomJSの組み合わせにたどり着いた


2. デプロイしてもphantomjsが含まれない。

phantomjs-prebuiltをlambdaで動かせるためにはphantomjs-prebuiltのinstall.jsを実行して、そのバイナリファイルを含ませる必要があった。ちなみに英語だがマニュアルにもちゃんと乗っていたが見落としたのが痛かった。
install.jsを実行してない場合は既に開発環境でパス指定されているphantomjsのバイナリが実行されることで正常に動くように見えてるが、lambdaにデプロイするとバイナリなしのが実行される為、同然動かない。あと、デプロイしたs3上のzipファイルのサイズもバイナリあり・なしでだいぶ違っていた。

3. phantomJSの作りがいまいち理解できない。webdriverIOを挟むことに。

ネットで調べると、例は乗っていたがchromelessみたいに直感的ではない。webdriverIOを挟むことで、だいぶ似たような作りができた。もしかしたらwebdriverIOを排除することでオーバヘットを減らすことができるかも知れないが、今のままで満足。

AWS Lambda (Node.js 4.3) で PhantomJS + WebdriverIO を使用してヘッドレスWebブラウザを操作する

4. amazon.co.jpではphantomJSブラウザでログインができない。

chromelessだとamazon.co.jpでログイン→スクレイピングができたが、phantomJSだとwebdriverIOでほぼ同じ書き方ができるにも関わらず、ログイン画面で止まって、うまくできない。
試しで止まった時点の画像を取ってみたところ、見慣れないブラウザの画面だった。
もしかしたらamazon.co.jpでは変なブラウザだと弾く仕組みになっているかも?と思い、userAgentをfirefox(Mac)に設定したら上手く進めるようになった。
だが、場所によってはdomの認識ができず、cssセレクタでのwaitForExistなどが使えなかったりするので
格好悪いがwaitで数秒、描画を待つようにした。

5. botアカウントが入っているLINEグループIDを特定する必要があった。

LINEのbotにメッセージを送る際にはbotのLINE IDが必要で、同じ流れでグループになるとLINE GROUP IDが必要。ただし、これは普通に公開してくれるものではなく、特定する為には
botがグループに招待・脱退する際に返されるレスポンスに含まれているIDを見る必要があった。
これもlamdaで作ったが、面倒だった。そもそも、curlでもできたかも。




6. DynamoDB処理が非同期

仕様だから仕方ないけどログイン情報など、必要な情報を取得する為DynamoDBからのget/put処理を全部callbackで実装した。格好悪いけど、このまま放置。余裕がある時にpromisなどでキレイにしたい。

7. DynamoDBではNumber型でもstringに扱うべきらしい

カラム定義をNumberにしたのにも関わらず、数値をputすると下記のエラーになってしまう。

message: 'Expected params.Item[\'usage_minute\'].N to be a string'
 code: 'InvalidParameterType'

しかたなく、stringにcastしている。なかなか納得できない仕様。

DynamoDBでNumber型をputItemするときのエラー

8. lambdaの環境変数へ書き込みができない

認証情報などをlambda実行する度にDBから取得するのも非効率だったので、環境変数を利用することに。
ただし、githubにpushするserverless.ymlに残す訳にもいかないので、初回だけDBから取得して→環境変数へ書き込みをしようとしたが、nodejsからlambdaの環境変数へ書き込みができない。仕様ならしかたないけど、やり方が悪かったかも。

9. lambdaの日付がUTCだった。

nodejsで日付を取得すると+9:00のUTCになってしまう。環境変数にタイムゾーンを設定しないとダメらしい。

TZ: 'Asia/Tokyo'

東京リージョンって意味があるのか?

AWS Lambdaのタイムゾーン変更

10. ReadCapacityUnitsLimit / WriteCapacityUnitsLimitの意味がわからない。

取り敢えず正常に動くようにはなったけど、cloudwatchから見慣れない警告が出るようになった。
調べたところ、キャパシティを計測するためのデータが不足しているせいで出ているぽい?
そもそも、そんなに頻繁にDBアクセスをする訳でもないので、測定データがないのは同然?
という自分なりの推測した。

アラームの設定の「欠落データの処理方法」に何も指定されてなかったので「適正」に変えたら
取り敢えず、警告にはなれなくなった。これで良いのかは分からないが。



結果イメージ




今後の課題

・やる気になったら、callbackにした非同期実装をpromis化する。


その他

・amazon.co.jpでは「コンテンツと端末の管理」情報取得のAPIを提供してほしい。
・LINEは簡単にグループIDを特定できる方法を提供してほしい。
・dynamoDBからテーブル定義をjsonに抽出するコマンド。IAMポリシにあるdynamoDBのDescribeTable権限を付ける必要がある。

table_name=users
aws dynamodb describe-table --table-name ${table_name} > ${table_name}.json


既存のDynamoDBテーブルからテーブル定義を作成する

・fireタブレットのweb使用明細はslikブラウザを開いた時しか取れないらしい。
取り敢えず使用時間だけ知りたいだけだったので問題ないが、あまりにも子どもの利用時間が改善されなかったら家のルータからアクセス履歴を収集して公開する仕組みも考えてみる。


github

https://github.com/mwookpark/amazonJpConsole

2018年2月9日金曜日

パスポート更新

今回はパスポートの更新になるか・帰化になるか迷いもあったが
結局パスポートを更新することになった。

今のところ、それそれのメリットを比べると

韓国籍:会社から郷帰りの航空券代が出る
日本籍:選挙権が付与される

だけと、別に選挙は興味ないし、逆に年5万ぐらい節約できるのは大きい。
会社の方針が変わらない限り・またはこれ以上韓国に行くことがなくなったら
変わるのかな。

ということで、今回は初めて横浜の韓国領事館に行ってきた。
前日電話でも確認したが、朝一行ったら空いていてた。

パスポート申請に写真が必要なくなったのは良かった。
正確には運転免許みたいに領事館で撮ることができるようになってた。
あと、途中で来た人が公認認証書を申請するところをみて、ついでに申請した。

前から韓国の公認認証書がないことで、いくつか認証ができなかったのができるようになるかなーと思いきや
どうやら申請した際に書いたパスワードと違うパスワードになっているらしく、全然使えなかった・・・

まあ、本来の目的は達成したし、久しぶりに横浜観光もできたので良しとしようか。