- 投稿日:2020-05-23T23:59:35+09:00
nodeでAbemaTVをダウンロードしてみる【スマホでもできる】
こんにちは。ひさしぶりです。
以前にはてなでAbemaTVが落とせなくなった〜!とかやり方見つけた!とか言うことを書いてたんですけど暇なんでqiitaにも書きます。
ざっと大まかに言うとminyamiっていうnodeライブラリを使います!以上!
Windowsとかのやり方ははてなを見てくれ。
https://ysok2135.hateblo.jp/entry/2020/01/04/022105※今はこの方法以外ではDLできない。(当方調べ)
minyamiをぶち込む
とりあえずいつものようにnpmでインスコします。
(グローバルのほうがおすすめ。)terminalnpm install -g minyamiChrome拡張機能を入れる
今回は拡張機能でhlsのリンクをゲットする寸法。
https://chrome.google.com/webstore/detail/minyami/cgejkofhdaffiifhcohjdbbheldkiaed
あとはDLするだけ。
Abemaのページを開いて、minyamiのマークをクリック。
適当な解像度を選びコピー。
スマホでできんのかコラァ!?
→できますよ。
◆必要なもの◆
・VPS(これチート。)
・JuiceSSH(Android用SSHターミナル。iOSはしらね。ggrks)
・KiwiBrowser(スマホ上で拡張機能が使える神ブラウザ。)
これさえあればできます。結構便利ですよね?ぜひお試しください!!
【注意】
ダウンロードしたファイルは必ず個人利用にとどめてください。またダウンロードしたファイルには著作権保有者様のコンテンツが含まれる場合があるため他人への譲渡賃貸などは著作権法に抵触する恐れがあります。また一切の責任を負いかねます。また、この方法は技術的保護手段の回避には当たりません。
- 投稿日:2020-05-23T14:05:37+09:00
node 14.3.0 top level await
非同期関数の外でawaitキーワードを使用できるようになりました。
denoが出たと思ったら、nodeもtop level awaitをサポートしたのか
https://deno.land/
- 投稿日:2020-05-23T13:28:03+09:00
ランダムな(重複しない)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 ] 生成終了 重複チェック開始 重複チェック終了
- 投稿日:2020-05-23T13:08:42+09:00
【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内でできるので、
忘れずにやっておきましょう。構成
Amazon SESに新規アドレス(ドメイン)を登録
Amazon SESコンソールを開きます。
今回はバージニア北部リージョンで利用します。左のメニューからDomainsまたはEmail Addressesを選択し、
新規の送信元アドレス(ドメイン)を登録します。今回はメールアドレスの登録をやっていきます。
「Verify a new Email Address」を選択します。↓こんな画面です。
「Verify This Email Address」を選択すると、入力したメールアドレス宛に検証メールが届きますので、検証します。
以上です。
「Send a Test Email」からテストメールの送信ができるので一応確認しておきましょう。また、サンドボックス環境の解除については、lambdaからのテストなどが一通り完了してから行いましょう。
最悪テストでバウンス率が高まってメール停止されるかもしれないので。lambda関数
単にSESを呼び出して、指定したアドレスにメールを送信するだけのlambdaです。
ランタイムはNode.js 12.xです。test_SendEmail.jsvar 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)); }); };以上!
- 投稿日:2020-05-23T08:23:23+09:00
AWS Lambda から Cloud Firestore を使ってみる
FirestoreのデータをAlexaSkillから呼び出したかったのでLambdaに接続してみました。
そのときの手順を残しておきます。
勉強中の身ですので温かい心で読んで頂けると嬉しいです。1.環境
Windows 10
Node v11.13.02.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.jsconst 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ファイルに圧縮していきます
名前はなんでもok8.Lambdaファンクションを作成してzipをアップロード
AWSコンソールからファンクションを作成します。
Nodeのバージョンが11系を選べなかったので最新の12にしときました。
まあ大丈夫だろう、、、笑
できればここはローカル環境と合わせた方がいいかもしれませんね8.実行してFirestoreに書き込み
テストでもいいので実行してみます。
ログが成功となればFirestoreに書き込まれているはずです。
9.参考にしたサイト
公式のドキュメントの手順に沿ってやってみました。
Cloud Firestore を使ってみる
Lambda部分はこちらの記事がわかりやすかったです。Google翻訳にぶち込みましょう
How to use Cloud Firestore on AWS Lambda以上、誰かのお役に立てれば嬉しいです(^^)
- 投稿日:2020-05-23T07:42:18+09:00
nodenvでMacにNode.jsをインストールする(auto rehash対応版)
nodenvというNodeバージョン管理ツールを使って、Node.js環境を構築します。
nodenvインストール
Homebrewでインストール
$ brew install nodenvnodenvはnode-buildコマンドに依存していますが、このコマンド一発でnode-buildもインストールしてくれます。
一旦セットアップコマンドを実行する
$ eval "$(nodenv init -)"ドキュメントではこのコマンドをシェルの設定ファイルに追記するよう書いてますが、【最後】で実施します。
※【最後】の工程までシェルを閉じたり再起動しないようにしてください。再起動してしまった場合は、上記のセットアップコマンドを再度実行してください。
nodenvコマンドが使えることを確認する
$ nodenv -v nodenv 1.3.2Node.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/cli
でvue
コマンドをインストールしても、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
- 投稿日:2020-05-23T02:14:53+09:00
ts-node と ts-node-dev の違い
どちらも
typescriptでの開発には持って来いなパッケージ達ですが、初めて調べた時、似たような名前でどっちを使えばいいのか結構悩んだので、違いをまとめておきます。
ts-node
ts-nodeパッケージを追加します。
npm install typescript ts-nodetypescriptも追加しないと、tsファイルが動かないので、これも追加します。
※グローバルにインストール済みの場合は必要ないです。tsファイルを作成
src/index.tsconsole.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-devtsファイルを作成
src/index.tsconsole.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.tsconsole.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 }こいつがないと変更を検知するたびに、こんな感じででかい音と共に通知が飛んできます。
まとめ
ts-node
tsファイルをjsファイルにコンパイルすることなく、起動することができる
ts-node-dev
tsファイルをjsファイルにコンパイルすることなく、起動することができ、
さらに監視モードで素早く再起動が使用できるちなみに、現状nodemonのほうが結構有名かなと思ってるんですけど、nodemonよりts-node-devのほうが大幅に再起動の速度が早いらしい!
(試したわけじゃないですけど、公式に明記してあります。)参考