投稿

12月 8, 2018の投稿を表示しています

AWS System Manager セッションマネージャーを利用してEC2インスタンスにシェルアクセスする時に楽したい

イメージ
AWS System Manager セッションマネージャーを利用してEC2インスタンスにシェルアクセスする時に楽したい : 昨日は @cfiken による TensorFlow で学習したモデルのグラフを tf.train.import_meta_graph でロードする でした。 とても素晴らしい内容でしたね! まだ、見てない方がいらしたらどうぞ!!! では、本題に入ります。 AWS System Manager セッションマネージャー インスタンスへアクセスをする時に使っているのが下記です。 $ aws ssm start-session --target instance-id 毎度、同じインスタンスへアクセスするのでしたら気にならないのですが別のインスタンスへアクセスする時もあります。 その都度、 aws ec2 describe-instances を利用してインスタンスIDを調べるのは面倒だったのでjqとpecoを使用して簡単にインスタンスへアクセスが出来るようにshellを作成しました。 作成したやつ #!/bin/sh PROFILE='' if [ $1 ]; then PROFILE="--profile $1" fi ID=`aws ec2 describe-instances $PROFILE | \ jq -r '.[][].Instances[] | [.InstanceId, [.Tags[] | select(.Key == "Name").Value][]] | @tsv' | \ column -t | \ peco | perl -pe 's/\s.*//'` aws ssm start-session --target $ID $PROFILE やっていること まず、 aws ec2 describe-instances でインスタンスの情報を取得します。 次にjqを使ってインスタンスIDとタグのNameをtsvで吐きます。 1 その結果をpecoに渡してサーチできるよ

ボイスワープのON/OFFを自動化してみた

ボイスワープのON/OFFを自動化してみた : JX通信社 Advent Calendar 2018 、8日目担当のkain_jyです。 社内の業務改善で取り組んだ小ネタを。 背景 弊社では抱えている顧客の業務上、深夜や休日でも会社の代表電話宛に電話がかかることがあります。 そういった顧客に対応するため、業務時間外に会社の代表電話宛への架電を、会社以外からも受けられる別の電話番号へ、電話転送(ボイスワープ)するようにしています。ボイスワープのON/OFFの設定は担当者を決め、業務開始・終了時に設定するようにしていました。 ですが、担当者がボイスワープをON/OFFするのを忘れてしまったり、風邪で休んだりしたときに別の人がいちいち設定方法を調べたりと、無駄な業務が増えてしまいました。 方針 そこで、ボイスワープの設定を自動化できないか、試みてみました。 ボイスワープ(NTT東日本・ひかり電話)の設定方法は3通りあります。 転送元の電話からの操作 外出先など別の電話からの操作(リモートコントロール) インターネットを利用した設定操作 仕事でTwilioを少し触ってて楽しかったため、2を試してみることにしました。 ちなみに、1は社内の電話設備的に難しいため断念。3はサイトが意外に複雑で、ブラウザの自動操作させるのが面倒なため、一旦保留。 実装 まずは、転送元の電話から、リモートコントロールする際に使う 暗証番号を登録 してメモっておきます。 次に、Twilioで音声が有効な国内の電話番号を取得して、電話番号とアカウントSID、AUTHTOKENをメモっておきます。 これで事前準備は完了。 弊社ではPythonを業務で使うことが多いため、今回はAWS Lambda(Python)で実装してみます。 main.py import os from twilio.rest import Client as TwilioClient SECRET = os.environ['SECRET'] # 転送元の電話で設定した暗証番号4桁 TWILIO_ACCOUNT_SID = os.environ['TWILIO_ACCOUNT_SID'] # TwilioのアカウントSID TWILIO

Graal VM の native image を使って Java で爆速 Lamdba の夢を見る

イメージ
Graal VM の native image を使って Java で爆速 Lamdba の夢を見る : はじめに 前日は mike_neck さんの AWS Lambda のカスタムランタイムにて Java のカスタムランタイムで関数を動かす でした。 偶然にも(?)今日も引き続き、 Lambda Custom Runtime で Java を動かす話です。 AWS Lambda 提供する言語の一つに Java があります。 Java はホットスタートの処理速度は速いもの、コールドスタートでは 5 から 10 秒ほど要することがあります。 また、メモリ消費量も多く Lambda と Java の組み合わせは速度重視の場面では使われていないように思います。 2018年の re:invent で、 AWS Lambda の Csutom Runtime が発表されました。 お作法に従いさえすればどのような言語でも Lambda として実行可能になりました。 さらに近年 Java 界隈では新しい JIT コンパイラの Graal と Graal やその他周辺機能を盛り込んだ JVM である Graal VM が登場しました。 Graal VM の機能の一つにネイティブバイナリの生成機能があり、これを使えば JVM 起動の処理時間を短縮できます。 そのため、Graal VM でネイティブバイナリ化した Java プログラムを Lambda の Csutom Runtime で動かせば、 爆速の Lamdba を Java でできそうだと感じました。 実際にやってみたところ爆速になったので、その手順と結果を記述します。 今回、ネイティブバイナリを作るにあたって、 Micronaut というフレームワークを使っていますので、 micronaut に関する説明も一緒に行います。 説明する内容は次の通りです。 micronaut で Java の Lambda 関数を作る AWS Lambda Custom Runtime の説明 micronaut CLI アプリケーションを Graal VM で ネイティブにする ネイティブを Custom Runtime で動かす micronaut で Java の La

AWS Lambdaのrubyランタイムでalexaスキル実装

イメージ
AWS Lambdaのrubyランタイムでalexaスキル実装 : はじめに こんにちは。 日々の業務ではインフラをやっています @hayaosato です。 最近趣味でアレクサスキルの開発を始めました。 まだまだ勉強中ですが、アレクサスキルはエンドポイントにAWS Labmdaを設定でき、非常にお手軽です。 ところで、この間の re:Invent2018にてAWS Lambdaのランタイムにrubyが追加 されましたね! とういう事で今回はアレクサスキルをAWS Lambdaのrubyランタイムにて実装していきたいと思います! 作るもの 最小構成のアレクサスキルとして、アレクサに「おはよう」と言ったら今日の18時の天気と運勢を教えてくれるスキル 毎朝出かける前に天気と運勢を知りたいのですが、それらが一つになったスキルを作ってしまおうと思います。 また、朝なのでそんなにアレクサと会話するつもりもないですw こちらが呼びかけたら答えてくれて、そのまま会話終了となるようにしていきます。 もっと会話を楽しみたいという方はアレクサのサンプルも豊富にあるので そちら をご覧いただければと思います。 それでは早速作っていきます。 データ構造 アレクサは指定のデータ形式(JSON)のオブジェクトを渡せば答えてくれるので、今回は以下の データ構造をアレクサに送るようにします。 アレクサに返すデータ構造としては以下のhashを返すようにしました。 { 'version' => '1.0', 'response' => { 'outputSpeech' => { 'type' => 'PlainText', 'text' => "おはようございます" }, 'shouldEndSession' => true } } これが返ればひとまずはOK それぞれの項目を説明すると、 version アレクサに返す応答のバージョン。 とりあえず 1.0 で

JavascriptでURLのパラメータをオブジェクトで取得する

JavascriptでURLのパラメータをオブジェクトで取得する : javascript.js const param = window.location.search.replace(/^\?/, "").split("&").reduce((p,i)=>{const t = i.split("=");p[t[0]]=t[1];return p;},{}); Googleでhoge hogeを検索した場合以下のように取れます。 javascript.js window.location.search.replace(/^\?/, "").split("&").reduce((p,i)=>{const t = i.split("=");p[t[0]]=t[1];return p;},{}) {q: "hoge+hoge", rlz: "1C1CHZL_jaJP770JP770", oq: "hoge+hoge", aqs: "chrome..69i57j69i61l2j0l2j69i61.1744j0j8", sourceid: "chrome", …} aqs: "chrome..69i57j69i61l2j0l2j69i61.1744j0j8" ie: "UTF-8" oq: "hoge+hoge" q: "hoge+hoge" rlz: "1C1CHZL_jaJP770JP770" sourceid: "chrome" __proto__: Object テキストだと個別のパラメータにアクセスしにくいので便利。 自分用メモレベル。

[CreateJS] マウスオーバー時のイベントがうまく動かない時は

[CreateJS] マウスオーバー時のイベントがうまく動かない時は : var stage = new createjs.Stage("myCanvas"); // マウスオーバーを有効にする stage.enableMouseOver(); これを忘れていないか確認しましょう。 object.addEventListener("mouseover", handleMouseOver); object.addEventListener("mouseout", handleMouseOut); // マウスオーバー function handleMouseOver(event) { } // マウスアウト function handleMouseOut(event) { } マウスオーバー/マウスアウトを使う時は要注意。

ReactNative detox E2E

イメージ
ReactNative detox E2E : はじめに この記事はReact Nativeアドベントカレンダーの8日目の記事です。 今年からReactNatvieがっつり触り始めました AdventCalendarを投稿するならReactNativeだなと思い投稿しました ここ最近はテストばっかりやっているのでテストで使っているdetoxをご紹介しようと思います detoxとは ReactNativeのE2Eライブラリです ios/androidの両方に対応しているので使っています androidは数ヶ月前くらいに対応したのかな? まぁ普通に使えている 環境 今回は最新Versionで試しに動かしてみます OS: macOS XCode: 10.1 ReactNative: 0.57.7 detox: 9.1.2 準備 iosセットアップ手順とか説明してきます androidは別の機会に 新規プロジェクト作成 $ react-native init detoxSample 必要なコマンドのインストール $ brew tap wix/brew $ brew install --HEAD applesimutils $ npm i -g detox-cli プロジェクト内に導入 今回は mocha を使用するつもりなので mocha detox をインストール $ npm i --save-dev detox mocha 下記コマンドを実行すると e2eディレクトリが作成される $ detox init -r mocha package.jsonを少し修正 detoxSampleとなっているところは作成したProjectの名前に置き換えてください 今回はdetoxSampleという名前で行っていますので iPhone 7となっているところはテストしたいデバイスを指定できます { "detox": { "configurations": { "ios.sim.debug": { "binaryPath": "ios/buil

Pure JavaScript vs Lodash

Pure JavaScript vs Lodash : この記事は、 Business Bank Group Developers Advent Calendar 8日目の記事です。 こんにちは、BBGの清水です。 Lodash はリスト操作やオブジェクト操作に便利なライブラリです。 chainメソッドでeach, map, filterなどの処理を繋げて実装すると可読性も上がるためよく使用しています。 ただ、純粋なJavaScriptのメソッドの方がパフォーマンスが良いと聞いて気になったので比較してみました。 今回は、私がよく開発で使っていた処理を比較してみました。(今Angularで開発しているのでコードはtypescriptです) 事前データ let data1: { a: number, b: number[] }[] = []; let data2: { a: number, b: number[] }[] = []; Array.from({ length: 10000 }, (_) => { const num = Math.random(); data1.push({ a: num, b: [1,2,3] }); data2.push({ a: num, b: [1,2,3] }); }); Pattern 1 リスト内の特定の値をフィルタしたものをsummaryしたい pureJS(data: { a: number, b: number[] }[]) { let sum = 0; const start_ms = performance.now(); data.map((list) => { return list.a }) .filter((a) => a % 2) .forEach((o) => sum += o); return performance.now() - start_ms; } lodash(data: { a: number, b: number[] }[]) { const start_ms = performance.now(); _.chain(document)

Vue.js: TodoMVCの例で日本語の項目が正しく入力できるようにする

イメージ
Vue.js: TodoMVCの例で日本語の項目が正しく入力できるようにする : 本稿は、 Vue.js 公式サイトの「 例 」のページにおける「TodoMVC の例」の、日本語入力の不具合とその修正の仕方についてご説明します。 TodoMVC の例 Vue.jsサイトの「 TodoMVC の例 」は、洗練されたインタフェースのTodoリストです(図001)。機能は、項目の追加と削除、未処理と処理済みの表示切り替えなど、基本的といえます。 図001■TodoMVCの画面表示 けれど、ありがちのTodoリストのようなボタンだらけの画面ではありません(図002)。削除ボタンは項目にロールオーバーすると表れ、項目の追加は[enter]キーで確定します。 図002■ありがちのTodoリスト >> 「Vue.js入門」01-07 より 日本語変換確定の[enter]キーで項目が追加されてしまう ところが、この洗練されたインタフェースが、日本語入力ではアダになります。日本語変換確定の[enter]キーで項目が追加されてしまうのです(図003)。 図003■日本語変換確定の[enter]キーで追加された項目 はじめはChromeで、イベント @keyup.enter と @keydown.enter とでは、取得する入力値に時間差があることを見つけました。そこで、ふたつの値を比べることにより、変換の確定と[enter]キーの単独入力を切り分けたのです。けれど、Safariではふたつの値は同じでした。つまり、この案は却下ということです。 keypressイベントを捉える 調べたところ、 @keypress イベントは変換確定の[enter]キーは拾わないことがわかりました。つまり、 @keypress イベントで、押されたキーが[enter]( keyCode : 13)のとき、単独で入力されたということです。 そこで、TodoMVCの修正です。 <header> に置かれた <input> 要素のキーイベントを、つぎのように @keyup.enter から @keypress に書き替えます。 <section class="todoapp"> <h

【AWS】いまさら空メール【SES】

イメージ
【AWS】いまさら空メール【SES】 : やりたいこと 空メール自動受付システム的なものを作る。 Lambdaで便利な関数を作ったは良いが、それを任意のタイミングで起動したい時どうすべか?かと考えた挙句、 古から伝わる”空メール”という技法を使うことにした。 作り方 概要は・・・ 1. DNS設定:メールがSESに到着するようにする 2. SES設定:受信したメールをLambdaに流し入れる 3. Lambda:受け取ってから何かする 受信メールを受け付ける設定 このあたり を参考に。 私が持っているドメインは、MXレコードがGoogleに向いているのでサブドメインを作ることにする。 ↓翻訳 現在、私がRoute53で管理しているドメイン�� hoge.com hoge.comのMXレコードは、Google提供のものを設定している 変な設定をして、メールが受け取れなくなると困るので、サブドメインで受けることにする Route53でレコードを1つ追加する aws.hoge.com MX [SESで指定されたもの] これで、 ore@aws.hoge.com みたいなメールアドレスで受信できる 受信したメールをさばく 上図のように、東京リージョンにはSESがないので、オレゴンあたりで受けます。 リージョン違いでうまくいかなかった。下記テスト結果 ❌オレゴンSES→東京Lambda ❌オレゴンSES→東京SNS ⭕️オレゴンSES→オレゴンSES→東京Lambda これでLambdaにメールが届きます。 SNSで到着するので、形式はJSONです! Amazon SES の Amazon SNS 通知のコンテンツ ��これのMailオブジェクトです。 Lambda SNSを受け取って起動 送信者が知っている人か?を判定 宛先のアドレスによって、処理方法を分岐 という感じです。 SES→SNSで発火するもの exports.handler = function(event, context) { var eventSns = event.Records[0].Sns; var msg = eventSns.Message; var m

【Handsontable】全選択/全解除チェックと行削除

イメージ
【Handsontable】全選択/全解除チェックと行削除 : はじめに これは、 Handsontable Advent Calendar 2018 の8日目の記事となります。 前回「 【Handsontable】データの読み込みと行追加 」ではデータの読み取りと行追加を行いました、今回は全選択/全解除チェックと行削除を実装していきます。 全選択/全解除チェック 画面上部に全選択/全解除チェックボックスがあり、全行の先頭列チェックボックスを全選択/全解除チェックボックスの値を同じにします。 // 全選択/全削除チェック処理 function allCheck(checkbox) { for (var i = 0; i < hot.countRows() ; i++) { hot.setDataAtCell(i, 0, checkbox.checked) } } 素直にこのように書いたところ、IE11では40件データで15秒程かかったが、Chromeでは問題ない速度であった。 たぶんイベントなど余分な制御が入るために遅くなると思われる。BeginEdit/EndEditのような余分な制御を停止する機能はないようである。 高速化 調査した結果、populateFromArrayで高速化できることが分かった。 // 全選択/全削除チェック処理 function allCheck(checkbox) { var col = hot.propToCol(COL_SELECTConst.Select); hot.populateFromArray(0, col, [[checkbox.checked]], hot.countRows() - 1, col, null, null, 'down'); } 行削除 対象行を指定する。 hot.alter('remove_row', row); 行削除ボタンの実装 ループ処理で行を削除する場合は、下から上に向かって行うのが鉄則です。 全行無くなったら1行追加するのと、全選択チェックを解除しています。 ※本来は確認メッセージと完了メッセージを実装するのですが、今回は省略 //