Vue.js と jQuery を共存させる

DOM操作、イベント処理などは Vue.js に任せるとして、
アニメーションなど jQuery で簡単に実装出来ることは jQuery でやってしまおうと思い、
Vue.js で jQuery を使う。

思想的には共存させない方が良いのかな?と思いますが一旦効率重視で。

まずはインストール。

$ npm install -D jquery
$ npm install -D @types/jquery

使う時は下記のような感じです。

import $ from "jquery";

$("html,body").animate({scrollTop: 0}, 500, "swing");

型定義が合わないのか、
$(“.xxx”).offset().top
の offset() が見つからないとかエラーが出てしまい、
// @ts-ignore
で抑制してしまったり、少しもどかしい感じです。

Vue.js(TypeScript) でグローバル変数を使う

Vue.js で開発していてアプリケーション内でデータを共有したくなりました。
いくつか方法があると思います。
・Vuex
・Cookie
・LocalStrage
・グローバル変数

Vuex とかが正しいのかもしれないですが、少し冗長な気がしたし、Cookie だとデータの保存期間の制御など要件に合わすのが大変そうだった。
アプリが起動しているときだけ保持して、且つ複数のウィンドウでアプリが起動されウィンドウごとに別のデータとして管理する想定です。
もっとも簡単そうですし要件にも合うのでグローバル変数を使う方針にしました。

今回はプラグインとして実現することにしました。
まずはプラグインと、データを保持するクラスの定義です。

import _Vue from "vue";

export default function AppDataPlugin<AppDataPluginOptions>(Vue: typeof _Vue, options?: AppDataPluginOptions): void {
    Vue.prototype.$appData = new AppData();
}

export class AppDataPluginOptions {
}

export class AppData {
    public dataAaa: string = "";
    public dataBbb: string = "";
}

VisualStudioCode などのためにコード型定義ファイルも用意。
AppDataPlugin.d.ts とかのファイル名で src 直下に保存

import AppDataPlugin, { AppData } from "./components/AppDataPlugin";
declare module 'vue/types/vue' {
  interface Vue {
    $appData: AppData
  }
}

使う側は下記のような感じです。

<script lang="ts">
import Vue from "vue";
import AppDataPlugin from "./AppDataPlugin";

Vue.use(AppDataPlugin);

export default Vue.extend({
    ・・・
    methods: {
        xxx() {
            console.log(this.$appData.dataAaa);
        }
    }
    ・・・
});

クレジットカードの不正利用

突然クレディセゾンから携帯宛に電話があって、私の家族カードが不正利用されている可能性があるとのこと。
いくつかの決済について「心当たりありますか?」と聞かれました。

家族に確認したところ心当たりはないということで、折返して私のカードも停止してもらいました。

9万円くらいの支払いは失敗し、10万円くらいの支払い決済されているということで、焦りましたがカード会社の方で何とかしてくれ、支払いは発生しないとのことでした。

それ以外にも私のカードで支払いが失敗したり、いくつかのサイトにカードを登録しようとした形跡があったそうです。

すぐに対応してくれるし、怪しい時に確認してくれ、さらに不正利用分の支払いも発生しないのでとても心強いと思います。

しかし、特定の用途でしか使っていないカードなのに何故不正利用され、しかも決済されるのか?不思議です。

ちなみにクレディセゾンからの電話も一瞬怪しいと思い、折り返す前に電話番号をネットで検索し、”セゾンカード/不正利用照会”と確認しました。

Alexa スキルで外部APIを使う

Alexaスキルから実行するLambda 内で外部APIを利用したい。
APIの呼び出しを非同期で行ったところ、うまくいかなかった、、、

var options = {
    uri: "https://xxxxxxx",
    headers: {
        "Content-type": "application/json",
    },
    json: {
        "data1": "xxxx",
        "data2": "yyyy"
    }
};
request.post(options, function(error, response, body){
    // this.emit(':tell', "外部API呼び出し"); // ← ここでemitを実行するとAPIコールするが、Alexaへの応答が空になる
});
// this.emit(':tell', "外部API呼び出し");  // ← ここでemitを実行するとAPIコールされず、Alexaへの応答は正常にされる

本来あるべき姿ではないと思うが、APIコールを同期的に行うことで一旦解決。

npm install sync-request

呼び出しはこんな感じ

var response = request(
    'POST',
    "https://xxxxxx",
    {
        json: {
            "data1": "xxxxx",
            "data2": "yyyy"
        }
    }
);
this.emit(':tell', "外部API呼び出し");

一応GETの場合はこんな感じ

var response = request(
    'GET',
    "https://xxxxxxx"
);
var data = JSON.parse(response.getBody('utf8'));
this.emit(':tell', "データ1は" + data.data1 + "です");

Lambda のコードをアップロードする

Lambda で開発していてコードをアップロードするのに毎回Webコンソールからアップロードするのは大変なのでシェルを組みます。

zipに圧縮して、S3にアップ、それをLambdaに紐付ける流れです。
実際のシェルはこんな感じです。

#!/bin/sh
zip -r app.zip index.js node_modules
aws s3 cp ./app.zip s3://{バケット名}/app.zip --profile={プロファイル}
aws lambda update-function-code --function-name {Lambdaファンクション名} --s3-bucket {バケット名} --s3-key app.zip --publish --profile={プロファイル}