- 1. Promiseを効率的に処理していく方法
- 2. NotionのAPIにNode.jsからアクセスしてみるメモ #Notion
- 3. Node.js Shift-JISに変換する方法
- 4. npm init vue@latestをしたらesbuildのinstallでエラーが出た
- 5. さくっとnode-fetch+node-html-parserでスクレイピングする
- 6. nextTick vs queueMicrotask vs Promise.resolve vs setTimeout
- 7. AWS lambda nodeをローカルでdocker開発して、イメージデプロイする
- 8. JavaScriptで非重複な配列・オブジェクト配列を作るって話
- 9. Node.jsをnodebrewを用いて管理する(Mac向け)
- 10. Electronでデスクトップアプリをサクッと作る(ボタンイベント付き)
- 11. SlackからDiscordへメッセージを移行させるDiscord botを作った
- 12. OTP(One-Time-Password)発行管理アプリを作った
- 13. 【Node】CloudFunctionsでincrement/decrementしたい
- 14. Amazon Cloudsearch をlocalのDocker Lamda node.jsから叩く
- 15. 【超簡単】Next.jsアプリ(やその他Node.jsアプリ)をAmazon Lightsailでホスティング
- 16. WebRTC + Socket.ioについてSTUNサーバとの接続で701エラー
- 17. 特定のUSBデバイスを鍵にして、プログラムと連携させる
- 18. nodeアプリをさくらのVPS で動かす
- 19. (再現度高め・無料)初学者のためのWEBアプリ公開マニュアル
- 20. 誰にも見つからない暗号通貨の秘密鍵の隠し方
Promiseを効率的に処理していく方法
# promise-pool
## やりたいこと
あるAPIを叩いて、データを取ってきたい。20個くらいAPIを叩く先があるけれども、10個ずつ取りにいって、1つの処理が終われば次のAPIを叩きたい。
## 1つずつ取ってくる場合(async await)
“`TypeScript
import axios from ‘axios’;
const first = async () => {
const start = performance.now();
const result1 = await axios.get(‘https://yahoo.co.jp’);
const result2 = await axios.get(‘https://yahoo.co.jp’);
const result3 = await axios.get(‘https://yahoo.co.jp’);
const result4 = await axios.get(‘https://yahoo.co.jp’);
const result5 = await axios.get(‘ht
NotionのAPIにNode.jsからアクセスしてみるメモ #Notion
Notionを最近触っていますが、APIおよびJavaScript SDKがある模様なので触ってみました。
## インテグレーションを作成する
> https://www.notion.so/my-integrations
> ![スクリーンショット 2022-08-29 17.55.05.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/35387/232cd59d-c2af-8fa9-cf1d-8dafebbf2825.png “スクリーンショット 2022-08-29 17.55.05.png”)名前などを適当に入れて進めてみます。試しに、`Node.jsテスト`としておきました。
> ![スクリーンショット 2022-08-29 17.55.41.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/35387/30d8fa3c-5bfb-d30f-4cfc-aac654002fc7.png “スクリーンショット
Node.js Shift-JISに変換する方法
Node.jsで簡単に文字列をShift_JISに変換する方法を明記します。
環境: Mac OSX
利用するライブラリ [iconv-lite](https://www.npmjs.com/package/iconv-lite)
まずはライブラリのインストールをします。“`qiita:ターミナル
$npm install –save iconv-lite
“`“`convert.ts
import {convert} from ‘iconv-lite’;const str = ‘変換したい文字列’;
const encoded = encode(str, ‘SJIS’); //文字列をShift_JISに変換
console.log(encoded);
“`
npm init vue@latestをしたらesbuildのinstallでエラーが出た
記事作成日: 2022/8/29
### TL;DR
`npm init vue@latest`して`npm install`するとエラーが出た(エラーログは下に有)。
原因はnodeのバージョンが古かった。#### 実行環境
“`
macOS Monterey (version12.5.1)
node -v:v16.14.2
npm -version:8.5.0
“`### 詳細
`npm init vue@latest`し`てnpm install`すると、以下のようなエラーが出た。ログを読むと、esbuildの`install.js`で問題が生じている様。
“`
npm ERR! code 1
npm ERR! path /Users/xxx/xxx/xxx/vuetest/vue-project/node_modules/esbuild
npm ERR! command failed
npm ERR! command sh -c node install.js
npm ERR! node:child_process:828
npm ERR! err =
さくっとnode-fetch+node-html-parserでスクレイピングする
## node-fetchでいいじゃん
もともとSeleniumとかPuppeteerとかPlayWrightで当然ながら合法的な範囲内でスクレイピングをしていました。しかし、golangでスクレイピングのスクリプトを書いたあとに、そもそもfetchでもいけるじゃないか、と気づきました。node-fetchで簡単にスクレイピングができるので記事にしてみました。
## 完成物
“`TypeScript
import fetch from ‘node-fetch’;
import { parse } from ‘node-html-parser’;const main = async () => {
const url = ‘https://qiita.com/’;
const response = await fetch(url);
const body = await response.text();
const root = await parse(body);
const h2s = root?.querySelectorAll(‘h2’);
h2s.for
nextTick vs queueMicrotask vs Promise.resolve vs setTimeout
## はじめに
普段の開発でなかなかお目にかかることも使うことも滅多にない `queueMicrotask` について興味を持ったついでに、 `process.nextTick` や `Promise`, `setTimeout` などとの比較をしてみました。
## TL;DR
– 下記の優先度順でキューからタスクが取り出され処理される。
– `nextTick`
– `queueMicrotask`, `Promise.resolve`
– → Microtask
– `setTimeout`
– → Task (a.k.a. Macrotask)
– より具体的には、MicrotaskキューとTaskキューの2つのキューがあり、Microtaskキューが優先的に処理されるようになっている。
– Microtaskキューが空でない限りはTaskキューの中身を実行しない構造となっており、`queueMicrotask`, `Promise.resolve` では Microtaskキューにコールバックを追加し、`s
AWS lambda nodeをローカルでdocker開発して、イメージデプロイする
https://aws.amazon.com/jp/builders-flash/202103/new-lambda-container-development/?awsf.filter-name=*all
AWS lambdaの開発にSAMを使用していましたが、ローカルでdocker開発して、そのままデプロイできるようになったらしいので手順の確認。
dockerのイメージ生成→AWSのECRリポジトリにPUSH→AWS Lambda にECRからデプロイ。
https://qiita.com/rei-ta/items/e86546130d157561ba8e
Dockerfile
docker-compose.yml
package.json
app.jsDockerfile
“`
FROM public.ecr.aws/lambda/nodejs:16
COPY app.js package*.json ./
RUN npm install
CMD [ “app.lambdaHandler” ]
“`ecrイメージでのdockerを作成。public.ec
JavaScriptで非重複な配列・オブジェクト配列を作るって話
非重複な配列って、たまに必要になりますよね。
しかも、すぐ忘れる。てなわけで、今回は『プリミティブ配列』と『オブジェクト配列』の場合の2パターンを実装していきます!
:::note warn
プリミティブ配列って言ってみたけど ”数値や文字列の配列” です。
オブジェクト配列って言ってみたけど ”オブジェクトの配列” です。
※意味合ってんのか??
:::## まずは完成系のコード
“`js:数値や文字列(プリミティブ)の場合
const data = [ 1, 3, 5, 3, 2, 4, 1, 4 ];// 非重複の配列を生成
const setObject = new Set(data);
const result = [ …setObject ];// 出力:[ 1, 3, 5, 2, 4 ];
console.log(result)
“`“`js:オブジェクトの場合
const data = [
{ id: 1, name: ‘キリン’ },
{ id: 2, name: ‘アサヒ’ },
{ id: 1, name: ‘キリン’
Node.jsをnodebrewを用いて管理する(Mac向け)
## はじめに
ローカルマシンでバージョンの違う複数のプロジェクトを開発することは往々にしてあると思います。
単一バージョンをインストールしていると、毎回インストールとパスを通す作業が発生しますが、
nodebrewの場合はコマンドだけでNode.jsのバージョンの切り替えが可能です。
(最近はDockerを使うのでホストマシン側のNodeに依存することは少ないかもしれませんが。。)今回はnodebrewのインストールとバージョン変更手順を説明します。
## Homebrewのインストール
ターミナルを開き、以下のコマンドでMacのパッケージ管理ツールのHomebrewをインストールします。
“`
% /bin/bash -c “$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)”
“`
参考
https://brew.sh/index_ja## nodebrewのインストール
ターミナルで以下のコマンドを実行します。
“`
% brew install nod
Electronでデスクトップアプリをサクッと作る(ボタンイベント付き)
Electonは、JavaSriptとHTML、CSSを知っていればアプリを作ることができるフレームワーク。
公式のドキュメントが日本語対応しているところもうれしい。
https://www.electronjs.org/ビルド時のコマンドにオプションを指定すると、winodwsやMac、Linux用のアプリも作れる。
## 1. インストール
`electron`は、devDependenciesにインストール。
“`console
npm init -y
npm i -D electron
“`## 2. index.htmlを用意
ルートディレクトに`index.html`を作成。
アプリを実行したときのトップページになる。
“`html:index.html
SlackからDiscordへメッセージを移行させるDiscord botを作った### 2022/08/29追記
dicordに送信できる最大文字数 < slackに送信できる最大文字数 みたいなので、slack側の文字数が多い場合には分割して送るようにしました。 --- 先月に↓の記事を投稿したのですが、 https://qiita.com/yuki-n/items/25e73490d82a0ad3c3fd 我ながら使いづらいなと思ったのと、思ったよりも使っている人がいて、わかりずらそうだったので、なんかもっとイケてる感じにしたいなと思いました。 で、「これ最初からdiscord側のbotにしちゃえばいいんじゃね?」と思い立ち、そうすることにしました。 botは以下からサーバーに追加することができます。 https://discord.com/api/oauth2/authorize?client_id=1012738353231302667&permissions=2048&scope=bot ## 雑な使い方 例のごとく雑に使い方を書いておきます。 ### slackのデータをエクスポートする 以下を参考に、エクスポートします。 h
OTP(One-Time-Password)発行管理アプリを作った
OTP(One-Time-Password)を自分で発行管理できるようにします。
パスワード自体はサーバ側に保管し、OTPのコード生成もサーバ側で実施するようにします。実は、OTPからコードの生成は、有志のnpmモジュールのお陰で、容易に実装できました。
一方で、OTPのQRコードをPCやスマホに取り込んだり、Windowsでのコピー&ペーストを活用しようとするといろいろ対応しないといけなかったです。ということで、一応OTPの説明ですが、どちらかというと後者の取り込み方法の方が中身が濃い投稿となりました。。。
# OTPのフォーマット
OTPを初めて生成すると、だいたいQRコードが表示されて、Google Authenticatorなどに取り込むことがほとんどだと思います。
そのQRコードの中身は以下のような形です。“`otpauth://[メソッド]/[アカウント名]?secret=[シークレット]&issuer=[発行者名]・・・“`
以下例です。
“`otpauth://totp/hogehoge?secret=ABCDEFGHIJK&issuer=%E
【Node】CloudFunctionsでincrement/decrementしたい
# はじめに
Firebase CloudFunctionsでフィールド値をインクリメントしようとしてちょいハマりかけたので備忘録# 更新履歴
2022.8.27 初回投稿# 環境
– macOS Monterey 12.5.1
– Node:v18.7.0
– npm:v8.18.0# 参考にしたサイト
https://cloud.google.com/firestore/docs/samples/firestore-data-set-numeric-increment?hl=jahttps://www.codegrepper.com/code-examples/typescript/firestore.FieldValue.increment%281%29
https://stackoverflow.com/questions/51016210/increment-counter-with-cloud-functions-for-firebase
# やりたいこと
– Cloud FunctionsのFirestoreの特定のフィールドでincrement/
Amazon Cloudsearch をlocalのDocker Lamda node.jsから叩く
資料がなかったので、備忘録代わりに。
client-cloudsearch-domain、ローカルなので認証のためにcredentialが必要。endpointだけじゃなくて、regionも必要でした。cloudに持っていくと、認証は別方式のほうが良いと思われるので、消してください。参考(AWS公式、node用のサンプルがあります)
https://docs.aws.amazon.com/AWSJavaScriptSDK/v3/latest/clients/client-cloudsearch-domain/index.htmldocker-compose.yml
Dockerfile
package.json
app.js (実行ファイルなので、任意にindex.jsなどに)docker-compose.yml
“`
version: ‘3’
services:
cloudsearch-api:
image: cloudsearch-api
build: .
ports:
– 9199:8080
tty: true
【超簡単】Next.jsアプリ(やその他Node.jsアプリ)をAmazon Lightsailでホスティング
vercelだと簡単にホスティングできるが、DBを持っておらず外部のDBに繋ぐとクソ重いので、LightsailでホスティングもDBも持つ
[Bitnami](https://bitnami.com/)が導入されているため、ほぼ何も導入しなくてもサイトの公開が可能
性能面を考えるとこの方法が一番楽# この記事で出来ること
Next.jsで作られたHTTPSサイトのホスティング# Lightsailで構築するメリット
– 他のnodeアプリでも応用可能(ポート3000で起動しているアプリならなんでも可)
– 10分くらいでできる
– DNSもDBもウェブサービスに必要なサービスがこれ一本で完了する
– Firewallなども含め必要な設定が最初から全部完了している# 作業内容
[Aamazon Lightsail](https://aws.amazon.com/jp/lightsail/)でnode.jsインスタンスを起動
STATIC IP ADDRESSを取得、アタッチDNSを設定する
インスタンスにsshでログイン
アプリをgitからclone
apacheが
WebRTC + Socket.ioについてSTUNサーバとの接続で701エラー
備忘録です。
Node.js
Socket.io
Angular
で
webRTCを使って、
STUNサーバを使ってNAT越えを試みるも
701エラー原因は、
マイク・カメラを使うために、サイトをhttps対応させたのに対し、
socket.ioでの通信をhttps対応させていないことでした。下記参考
https://qiita.com/MahoTakara/items/71977be2d18405fe7339
https://socket.io/docs/v3/server-initialization/
https://qiita.com/jinnai73/items/638dcc1434d47b12e6basocket.ioをhttps通信に切り替えて、通信成功
なお、CORS対応がhttpのままでエラーを吐いたりしたので、
そこの修正もお忘れなく。
またクライアント側から接続を試みるURLも当然httpsに変更になります。資料には、ApacheをSSL対応する資料も。
雑ですが、以上です。
特定のUSBデバイスを鍵にして、プログラムと連携させる
USBデバイスにはそれぞれ固有のIDが割り振られています。
特定のUSBデバイスが挿入されたときに、プログラムで処理をしたいときに使えるNode.jsのライブラリを公開しました。https://github.com/TakutoYoshikai/usbkey
## 使い方
### インストール
以下の二つのコマンドを実行する。
“`bash
npm install -g TakutoYoshikai/usbkey# ローカルのnode_modulesにもインストール
cd /path/to/project
npm install –save TakutoYoshikai/usbkey
“`### USBデバイスの登録
このコマンドを実行した後、USBデバイスを挿入する。
“`bash
usbkey-register
“`
`./usbkey`というファイルが生成されます。これが登録されたUSBメモリを検知する、ハッシュ化されたパスワードのようなものです。以下のJavaScriptファイルを用意し、好きな処理を追加する。
“`javascript:inde
nodeアプリをさくらのVPS で動かす
忘備録です。
## OSインストール
https://manual.sakura.ad.jp/vps/os-reinstall/reinstall.html「スタートアップスクリプト」 ・・・ なんか色々機能があって便利だった。必要なものを入れる。
「パケットフィルター設定」 ・・・ firewallの代わり? 必要なポートは開けておく
「サーバーへのSSHキー登録」## 初期設定
“`terminal
ssh root@xxx.xxx.xxx.xxx
yum update
adduser 〇〇〇〇
passwd 〇〇〇〇
cd /etc/ssh
cp sshd_config sshd_config.old
vim sshd_config
“`
↓ここを変える
“`terminal:sshd_config
PermitRootLogin no
“`“`terminal
systemctl restart sshd.service
“`## 環境設定
“`terminal
yum install httpd
systemctl start httpd
(再現度高め・無料)初学者のためのWEBアプリ公開マニュアル
初学者ながらjavascriptでアプリを作成して誰かに見せたいが、
・公開をする方法がわからない・・・
・ものすごく公開するまでが大変な気がする・・・
というのが悩みでした。しかし、簡単なNode.js(express)の記述と、GitHUbへのpushさえできてしまえば、Herokuでそこそこ簡単に公開できることを学びました。
スマホにも対応してくれます。実際の公開方法を細かく説明いたします。
■注意:
・筆者自身、GitHubをよく理解しておらず、Herokuもよく理解していないため、GitHUbにpushすると、Herokuで公開できるという認識しかございません。
・コードを簡潔に理解するため、非同期処理を用いません。
・個人情報を含むアプリはpushしないでください。
・GitHUbへのpushに相当てこずりました・・・正しい方法でない可能性があります。■実行環境
・windows10 pro
・vscode
・node.js(16.17.0 LTS)—要インストール
・git bush—要インストール
(ターミナルはgit bushを使ってください)
誰にも見つからない暗号通貨の秘密鍵の隠し方
暗号通貨の秘密鍵を管理するときに、どこに保管するかは迷うところ。紙に書く人もいれば、iPhoneのメモ帳に保存しておいたり、どこに保存していても盗まれてしまう可能性があります。
どこに保管していたら、見つかりにくいだろうと考え、その一つの選択肢として、コマンドラインツール「dirsha」を開発しました。
![スクリーンショット 2022-08-26 0.42.28.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/149717/5761e0c2-1e99-e8ce-b011-96c0bd63b849.png)
これはただのnpmパッケージがインストールされたnode_modulesディレクトリですが、ここにEthereumの秘密鍵が隠されています。この中のどれかのディレクトリに記録されてる訳ではありません。
### インストール
“`bash
npm install -g TakutoYoshikai/dirsha
“`先ほどのnode_modulesの中で以下のコマンドを実行する
“`b