20200523のNode.jsに関する記事は7件です。

nodeでAbemaTVをダウンロードしてみる【スマホでもできる】

こんにちは。ひさしぶりです。

以前にはてなでAbemaTVが落とせなくなった〜!とかやり方見つけた!とか言うことを書いてたんですけど暇なんでqiitaにも書きます。

ざっと大まかに言うとminyamiっていうnodeライブラリを使います!以上!

Windowsとかのやり方ははてなを見てくれ。
https://ysok2135.hateblo.jp/entry/2020/01/04/022105

今はこの方法以外ではDLできない。(当方調べ)

minyamiをぶち込む

とりあえずいつものようにnpmでインスコします。
(グローバルのほうがおすすめ。)

terminal
npm install -g minyami

Chrome拡張機能を入れる

今回は拡張機能でhlsのリンクをゲットする寸法。

https://chrome.google.com/webstore/detail/minyami/cgejkofhdaffiifhcohjdbbheldkiaed

あとはDLするだけ。

Abemaのページを開いて、minyamiのマークをクリック。
20200104013519.png
適当な解像度を選びコピー。
20200104013516.png

あとはターミナルにそのまま貼り付ける。
20200104013559.png

結構早く終わるよ。
20200104013546.png

スマホでできんのかコラァ!?

できますよ。

◆必要なもの◆
VPS(これチート。)
・JuiceSSH(Android用SSHターミナル。iOSはしらね。ggrks)
・KiwiBrowser(スマホ上で拡張機能が使える神ブラウザ。)
これさえあればできます。

結構便利ですよね?ぜひお試しください!!

【注意】
ダウンロードしたファイルは必ず個人利用にとどめてください。またダウンロードしたファイルには著作権保有者様のコンテンツが含まれる場合があるため他人への譲渡賃貸などは著作権法に抵触する恐れがあります。また一切の責任を負いかねます。また、この方法は技術的保護手段の回避には当たりません。

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

node 14.3.0 top level await

https://github.com/nodejs/node/blob/master/doc/changelogs/CHANGELOG_V14.md#support-for-top-level-await

非同期関数の外でawaitキーワードを使用できるようになりました。

denoが出たと思ったら、nodeもtop level awaitをサポートしたのか
https://deno.land/

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

ランダムな(重複しない)ID的文字列を生成する

概要

IDとかに使う重複しない文字列を生成するメモ。
node.jsのcryptoを使う

生成方法

cryptoのrandomBytesを利用して、ランダムなBufferを生成し、それをエンコードして整形する。

  • 重複しないためにはある程度長さが必要なので20文字以上を生成するようにする(今回は20文字)。
  • エンコードはbase64。ただし+とか/が入るのでreplaceで削除
const crypto = require("crypto");
const Length = 20;

const ids = [];
console.log("生成開始");
for (let i = 0; i < 10; i++) {

    const _id = crypto.randomBytes(Length + 2).toString("base64");
    const id = _id.replace(/\W/g, '').substring(0, Length);
    ids.push(id);

}
console.log(ids);
console.log("生成終了");

実行するとこんな感じで取得できる。

生成開始
[
  '5ijpeWvWucz0TQiK0M5u',
  'gatv1ox3SkoTeq8dEOce',
  'wis9LuhRwp2E5Iq8f4Jt',
  'ZuD1MSCdAUkstja4OCVO',
  '9lWprxeENzriFYuRDk8k',
  'oyzZeimnb83fswto3qpC',
  '2mG32SOm9KaYkVlQtbOQ',
  '6XQUoKUlNWieRWBEmXq7',
  'Xyg4BBNM9gxPYzhE06cM',
  'wDdQqIguxUwhV7aHEHKT'
]
生成終了

重複チェック

一応重複チェックしてみる。

console.log("重複チェック開始");
ids.forEach((id, index) => {
    ids.forEach((id2, index2) => {
        if (id == id2 && index !== index2) {
            console.log("重複:" + id);
        }
    });
});
console.log("重複チェック終了");

10件くらいだと何やっても大体重複しませんが、1万件生成してやってみても重複しなかったので大丈夫そうでした。

以下は1,000件生成時の結果(一応)。

生成開始
[
  'KhU8XXnyNeA6NcLInDOs', '31IXFQJVJLFhheSkMSv7', 'ZkkkcmqSdMVfyA7z5jWk',
  'e29d1PifNUHuolBig0yY', '31cSIoNDqVMZO9e5qMSr', 'A2mAWgfM8NC8IeTMHC2J',
  'tx2IGh5bpUlNRzWmQgY4', 'epfcwUkdcjb1bJ2qMCP8', 'kITqkUqO6ZhnjHXE6Qo0',
  '0euYTpcRqyQ7fhIiSGej', '9eVrmlwH3goaEFgFARdT', 'LIM5sgYHCSFdMqCXX4r8',
  '7UBeOVcozIHk2ThhV50G', '8JEUiish4Ly81SNpuYkc', 'Mb3s6Xaycd2FZSlIKaQ6',
  'Q3NZNYiiAsNycXXKYyA3', 'oalTcnrH8YoTRcGkRiYS', 'XOcqrCHYRXyzaoJUJSqD',
  'lkm7XJfh8V64Ge16VrWY', 'jQtjEQhHCNbzuJqT5H5y', 'GdZY46ByCBfFjTtyInf7',
  'z0YGMmk8Bvsmb1DbSr0o', '8jDU6UULnyoOBCMDOker', 'hPoCtjTy5lY08HmUE6pG',
  'j28qcMYqmDiZXBDFVKPf', 'bPQb6lsagGvejFwLU1Tx', 'rXGXCZLJjXQvfhMiehed',
  'TJoaswumdySH3kRlyENu', 'QFECTerBcL7yqwW54vBd', 'xBb9VYDmbeZOMm8sPINU',
  'e69npMEyfvB368BHyhSa', 'd4ehXcuLs4J07Lfew6Uv', 'Bbun5vXWcVP9s5izIktf',
  'YroygL5r4DZz4b5OT0j8', '0sFbrsscezT6xAphfnmQ', 'TIMcxfa9dNJLEV0u7nf0',
  '6nooqflKNwNAeSMUr49r', 'ryuEkmwEiSyhFhUEDJqe', 'RuuU5kmyuTWhEj3385yp',
  'D5SVemMddF5iveCzNDN4', 'IFggTyHagkYB1tegJprZ', 'SAHe5u3jgKseZVNNAkJA',
  'PoNiSRshvjYMuLVwOpYH', 'iM9uZNLnLcAccbWP5CyF', 'ObEQIo9jtQHz6aiVdj4g',
  'RpcHmsTr9WYRulgfC9bd', 'S2UEsLFQ0iEqHc2QERDe', 'ec2MFmF0qcu3lOhfw676',
  '204YtC6TlJYA52lTGhTp', 'CQmAL3QcbwvSF1MJZzg5', 'LPhRcCJ2P4VteyKgsN63',
  'TyMe5iB81KinWHGdXSxb', 'UlfFcgIsbel3wyJhFUTH', 'KpSTwMtqBuRMSIo1aM0V',
  'alBf8wWFCW09qqIkgLTT', 'LDNuBcSKLH2TukqQlX0B', '2De2aOP9WJc8koImVNlC',
  'tPK0oeEavqMjgBC0siyh', 'NKNv7EDQEXSeOkvy3V8P', 'DMsXhNgCgXmCP0hbkOgR',
  'OqdmW3iqg13WLQ1nT8YH', '3rTUwtTTguR6v6Dxq7aZ', '5npiptejaxR8LPxopATd',
  'dEqXyAP7KVSJSdG7mdLb', 'mJfjEA5DbIdnkTzKTLkp', 'ORiVGtw5gnpFn9r7k4MW',
  'Li3xBB5Trlcn13Tsk0Qk', 'QIF74WIRUGrOHJvDAgBX', 'ylT05Bl4ZKKQ62rzjTQm',
  '0RYaQenLVXxcA5RM9OMp', 'm914UgXvXq3UO7swGeTR', 'q7DlJqCUql44JTMOqgj4',
  'scnAzdDH756t8muo35Hs', 'hukcWg9hIg8aIM0v5hOz', 'zz27UhFgPPkOz5h13mOD',
  'ob2z1Lj0GHpE39b4izEj', 'aYbEBJL52uZUB1Mbsnq9', 'PArJkEjz5x5J4UYD8ifR',
  'LnhLBzFIjjNoVhe7bgcA', 'kdpgNl8M2WhX68rNG7vI', 'Ke9YizGC17hslrivhNei',
  'OvxKN5KbWkfYFeXNK8aB', 'CSLngsPPKUlk6p3ayaLn', 'Ci9J3DJalgHae2g04r0y',
  '5FBlrZf9iEfGcoZjflKj', 'flWvyK1iCGygADkj5H5V', 'GWchhgbYvAj4PegEoirP',
  'bVHC7ahGiYVG9MKxecxj', 'XSc3McPRaa2ADT7KsFKJ', 'uHq38Ay6ICgaZKdUAW4U',
  'iI8teio406X0V6iGXBUQ', '4sbEbJ1ZjroTLPdAPI7J', 'ODJhSFHQHaXnaex6kwoP',
  'dR6XHHmRNJNy3hxtaI7s', 'xnMECDItfkmZUCDcKMtn', 'YePfE0tSUMB6ROHsejgU',
  'mEnFclJAezNIe9CjaFey', 'zBAjohTNQJ0ss6S8Nk6F', '0kTgqjeYkTGQ79P04mqM',
  'vNZJNgccPGbTcKvWWRsM',
  ... 900 more items
]
生成終了
重複チェック開始
重複チェック終了
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

【AWS】Lambda+Amazon SESでメールを送信する

前回の記事でAmazon SNSを利用してSMSを送信するlambdaを書きました。
今回はメールを送信するためにAmazon SESを利用していきます。

やりたいこと

lambdaからのキックでメールを送信したいと思います。
ただし、宛先のメールアドレスはlambda内で指定したいと思います。

Amazon SMSでもメールの送信は可能ですが、予め作成したサブスクリプションで認証済みのメールアドレス宛にしか送信できません。
そこで今回はAmazon SESを使用します。

Amazon SESって?

システムエンジニアリングサービス…ではなく
Amazon Simple Email Serviceです。

従量課金制のEメール送信サービスです。
2020年5月現在、東京リージョンではサポートされていません。
エンドユーザーへのマーケティングや、ヘルスチェック系の通知などに利用できます。

コードとかより注意しておきたいこと

サンドボックスの解除

Amazon SESで送信元アドレス(ドメイン)を新たに登録すると、最初はサンドボックス環境で動作します。
サンドボックス環境においては送信数の制限があるうえ、
検証済みのメールアドレス宛にしか送信できません(SNSのような状態)。

そのため本番で運用するには制限解除を申請する必要があります。
制限解除は送信数の上限引き上げ、という名目ですが、これによりサンドボックス環境の解除がされるので、
検証済み以外のアドレスにも送りたい、という場合でも制限解除を申請します。

また、制限解除をする場合には、予めバウンス(送信失敗)や苦情(受信者にスパム登録される)への対策を行っておく必要があります。
バウンス率や苦情率が高いとメール送信ができなくなってしまうので、注意しましょう。

登録した送信元アドレス(ドメイン)ごとに、バウンス・苦情の発生時に通知する設定をSES内でできるので、
忘れずにやっておきましょう。

構成

キャプチャ.PNG

Amazon SESに新規アドレス(ドメイン)を登録

Amazon SESコンソールを開きます。
今回はバージニア北部リージョンで利用します。

左のメニューからDomainsまたはEmail Addressesを選択し、
新規の送信元アドレス(ドメイン)を登録します。

今回はメールアドレスの登録をやっていきます。
「Verify a new Email Address」を選択します。↓こんな画面です。
tempsnip.png

「Verify This Email Address」を選択すると、入力したメールアドレス宛に検証メールが届きますので、検証します。

以上です。
「Send a Test Email」からテストメールの送信ができるので一応確認しておきましょう。

また、サンドボックス環境の解除については、lambdaからのテストなどが一通り完了してから行いましょう。
最悪テストでバウンス率が高まってメール停止されるかもしれないので。

lambda関数

単にSESを呼び出して、指定したアドレスにメールを送信するだけのlambdaです。
ランタイムはNode.js 12.xです。

test_SendEmail.js
var aws = require('aws-sdk');
// バージニア北部リージョンを選択
var ses = new aws.SES({region: 'us-east-1'});


exports.handler = (event, context, callback) => {

    // メール送信設定
    var params = {
        Destination: {
            ToAddresses: ['送信先メールアドレス']
        },
        Message: {
            Body: { Text: { Data: 'メッセージ' } },
            Subject: { Data: '件名' }
        },
        Source: '検証済みの送信元アドレス'
    };

    // メール送信
    ses.sendEmail(params, function (err, data) {
        if (err) {
            console.log(err);
            context.fail(err);
        }
        console.log(data);
        context.succeed(data));
    });
};

以上!

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

AWS Lambda から Cloud Firestore を使ってみる

FirestoreのデータをAlexaSkillから呼び出したかったのでLambdaに接続してみました。
そのときの手順を残しておきます。
勉強中の身ですので温かい心で読んで頂けると嬉しいです。

1.環境

Windows 10
Node v11.13.0

2.Firebaseのプロジェクト作る

Firebaseのコンソールからプロジェクトを作成します。
プロジェクトを作るとDatabaseがサイドバーから選べるのでそこから新しいデータベースを作成します。

3.ローカルフォルダにNode.jsのプロジェクトを作る

コマンドラインから任意のディレクトリに移動して
npm initを実行。
package.json が作成されます

4.Firebase Admin SDK をダウンロード

Firebaseのドキュメントに従ってnode-moduleをインストールしましょう
npm install firebase-admin --save
node-modules と package-lock.json が作成されたことを確認してください

5.プロジェクトの秘密鍵をダウンロード

Firebaseコンソールの「プロジェクトの設定」から「サービスアカウント」のタブ選択
Node.jsが選択された状態で「新しい秘密鍵の生成」をします。

プロジェクト情報をJSONでダウンロードできますので "serviceAccount.json" にリネームして先ほどのディレクトリ内に保存します。

6.index.jsを作成

Firestoreを操作する処理を書いていきます。
詳細は公式ドキュメントに載ってますのでそちらを参照してください。
以下はデータ保存する時のサンプルです。
Lambdaで実行するのでhandlerの中に処理を書きます

index.js
const admin = require('firebase-admin');
const serviceAccount = require('serviceAccount.json');

admin.initializeApp({
  credential: admin.credential.cert(serviceAccount)
});

const db = admin.firestore();

exports.handler = (event, context, callback) => {
  // Write a simple document with two fields
  const data = {
    field1: "aaa",
    field2: new Date()
  };

  db.collection('lambda-docs').add(data).then((ref) => {
    // On a successful write, return an object
    // containing the new doc id.
    callback(null, {
      id: ref.id
    });
  }).catch((err) => {
    // Forward errors if the write fails
    callback(err);
  });
}

7.zipファイルにまとめる

ファイルがすべて揃っていることを確認してzipファイルに圧縮していきます
新しいビットマップ イメージ (4).jpg
名前はなんでもok

8.Lambdaファンクションを作成してzipをアップロード

AWSコンソールからファンクションを作成します。
Nodeのバージョンが11系を選べなかったので最新の12にしときました。
まあ大丈夫だろう、、、笑
できればここはローカル環境と合わせた方がいいかもしれませんね

普通にコンソール画面からアップロードしていきましょう。
新しいビットマップ イメージ (3).jpg

8.実行してFirestoreに書き込み

テストでもいいので実行してみます。
ログが成功となればFirestoreに書き込まれているはずです。
新しいビットマップ イメージ (2).jpg

9.参考にしたサイト

公式のドキュメントの手順に沿ってやってみました。
Cloud Firestore を使ってみる
Lambda部分はこちらの記事がわかりやすかったです。Google翻訳にぶち込みましょう
How to use Cloud Firestore on AWS Lambda

以上、誰かのお役に立てれば嬉しいです(^^)

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

nodenvでMacにNode.jsをインストールする(auto rehash対応版)

nodenvというNodeバージョン管理ツールを使って、Node.js環境を構築します。

nodenvインストール

Homebrewでインストール

$ brew install nodenv

nodenvはnode-buildコマンドに依存していますが、このコマンド一発でnode-buildもインストールしてくれます。

一旦セットアップコマンドを実行する

$ eval "$(nodenv init -)"

ドキュメントではこのコマンドをシェルの設定ファイルに追記するよう書いてますが、【最後】で実施します。

【最後】の工程までシェルを閉じたり再起動しないようにしてください。再起動してしまった場合は、上記のセットアップコマンドを再度実行してください。

nodenvコマンドが使えることを確認する

$ nodenv -v
nodenv 1.3.2

Node.jsインストール

バージョン一覧

インストールしたいバージョンを確認します。
ちなみに2020/05現在の最新推奨版(LTS)は12.16.3です。
最新推奨版(LTS)はNode.js公式ページで確認できます。

$ nodenv install -l
~~
12.16.1
12.16.2
12.16.3

インストール

$ nodenv install 12.16.3

グローバルに設定

$ nodenv global 12.16.3

インストールしただけでは使えないので、グローバルで使用するnodeのバージョンを指定します。

インストール確認

$ node -v
v12.16.3

$ npm -v
6.12.1

【必須】 nodenv-package-rehashプラグインのインストール

通常nodenvでグローバルにCLIコマンドアプリをインストールしても、その後に手動でnodenv rehashを実行しないとシムリンクが更新されないので、すぐ使えず面倒です。
例:npm install -g @vue/clivueコマンドをインストールしても、nodenv rehashを実行しないとvueコマンドが使えない。

このプラグインはシムリンクの更新を自動で行ってくれるので、nodenv rehashを手動で叩く必要がなくなります。

インストール

$ git clone https://github.com/nodenv/nodenv-package-rehash.git "$(nodenv root)"/plugins/nodenv-package-rehash

$ nodenv package-hooks install --all

 【最後】 シェル設定ファイルにnodenvセットアップコマンドを追記

ご利用のシェルの設定ファイルにセットアップコマンドを追記してください。
(デフォルトのシェルはmacOS Catalina以降ならzshなので.zprofile、macOS mojave以前ならbashなので.bash_profile
プラグインを有効にするため、--no-rehashオプションを付けています。

# 手動追記する場合は、以下をシェル設定ファイルに追記
eval "$(nodenv init - --no-rehash)"
# 自動追記
# zshの場合
$ echo 'eval "$(nodenv init - --no-rehash)"' >> ~/.zprofile

# bashの場合
$ echo 'eval "$(nodenv init - --no-rehash)"' >> ~/.bash_profile

以上でnodenvのインストールはすべて完了です。

備考

nodenvをアップグレードする場合

brew upgrade nodenv node-build
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

ts-node と ts-node-dev の違い

どちらも

typescriptでの開発には持って来いなパッケージ達ですが、初めて調べた時、似たような名前でどっちを使えばいいのか結構悩んだので、違いをまとめておきます。

ts-node

ts-nodeパッケージを追加します。

npm install typescript ts-node

typescriptも追加しないと、tsファイルが動かないので、これも追加します。
※グローバルにインストール済みの場合は必要ないです。

tsファイルを作成

src/index.ts
console.log("Hello World");

package.jsonに下記を追加

pacage.json
  "scripts": {
    "ts-node": "ts-node src/index.ts"
  },

実行してみます。

実行結果
npm run ts-node       

> ts-node_t@1.0.0 ts-node C:\Users\ne240\Desktop\work\module_learning\ts-node_t
> ts-node src/index.ts

Hello World

コンパイルなしで結果が出力されました。

オプション

一部オプションを紹介しておきます。

-T, --transpile-only    // 型チェックを行わず、トランスパイル(ts->js)のみ行う
                        // 高速な起動が可能

-P, --project <path>    // tsconfig.ts のパスを指定できる
                        // 1つのプロジェクト内で複数の tsconfig.ts を使用したい時に便利

ts-node-dev

続いて、ts-node-dev
ts-nodeとnode-devの合体版だそうな

ts-nodeと同様にts-node-devを追加します。

npm install typescript ts-node-dev

tsファイルを作成

src/index.ts
console.log("Hello World");

package.jsonに下記を追加
※オプションについては後述

pacage.json
  "scripts": {
    "ts-node-dev": "ts-node-dev --respawn src/index.ts"
  },

実行してみます。

実行結果
npm run ts-node-dev

> ts-node-dev_t@1.0.0 ts-node-dev <PATH>
> ts-node-dev --respawn src/index.ts

Using ts-node version 8.10.1, typescript version 3.9.3
Hello World

適当にtsファイルの出力文言を変えて保存してみます。

src/index.ts
console.log("Goodbye World");

ソースコードの変更を検知して、自動で変更後のメッセージを出力してくれました。

[INFO] 13:13:44 Restarting: <PATH>\src\index.ts has been modified
Using ts-node version 8.10.1, typescript version 3.9.3
Goodbye World

オプション

こちらもオプションを一部紹介しておきます。

--respawn               // 今回のサンプルのように本来実行して即終了のプログラムも、
                        // 終了せず監視状態になってくれる
                        // 常時起動の待ち受けサーバとかならいらない

--ignore-watch <path>   // 監視対象から除外するファイルを指定
                        // 公式には正規表現が使えるっぽいことが書いてあり試してみたが動作せず…
                        // できた方いれば教えてください。

オプションの指定順は

ts-node-dev [node-dev|ts-node flags] [ts-node-dev flags] [node cli flags] [--] [script] [script arguments]

ちなみに、ts-node-devって長いですよね。
tsndって省略もできるので、こちらも試してみてください。

通知抑制

それから意外と重要なのがこれ

.node-dev.json
{
  "notify" false
}

こいつがないと変更を検知するたびに、こんな感じででかい音と共に通知が飛んできます。
image.png

まとめ

ts-node

tsファイルをjsファイルにコンパイルすることなく、起動することができる

ts-node-dev

tsファイルをjsファイルにコンパイルすることなく、起動することができ、
さらに監視モードで素早く再起動が使用できる

ちなみに、現状nodemonのほうが結構有名かなと思ってるんですけど、nodemonよりts-node-devのほうが大幅に再起動の速度が早いらしい!
(試したわけじゃないですけど、公式に明記してあります。)

参考

npm公式 : ts-node
npm公式 : ts-node-dev

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む