Node.js関連のことを調べてみた2020年11月26日

Node.js関連のことを調べてみた2020年11月26日

Node.js基礎 備忘録

#リクエストの対処する仕組み

##スレッドモデル(Apache)

リクエストが来た際にスレッドを作成して対応する
※スレッドは同時にひとつのリクエストしか処理できない。
新しいリクエストが来た際には、新しいリクエストを作成して対応する

###問題
スレッドを作成するとメモリを消費するため、スレッドの作成限界がある。
リクエストが多い場合、スレッドが立ちあげれず、リクエストが待ち状態になる。

##イベントループ(Node.js)

メインスレッドとバックスレッドの2つがあり、動作している。

メインスレッドには、処理待ちのキューがあり、リクエストが来た際には、キューに登録する。
※新しくスレッドは作成しない

キューをループで回し、バックグランドで動くスレッドに渡し、そちらで処理を実行していく。

###プログラムを書く際は、ループをブロックしないように記述する。(Non-blocking)
時間がかかりそうな処理は、コールバック関数で実装する

メインで動くスレッドが、新規に作成されない為、シングルスレッドと呼ばれる。

元記事を表示

WebSocket メモ

## WebSocket とは

– クライアントとリモートホストの間で双方向通信を可能とするプロトコル。
– セキュリティモデルはウェブブラウザでよく用いられるオリジンをベースとしたモデル。
– `XMLHttpRequest` やロングポーリングに頼らずにサーバとの双方向通信を必要とするブラウザアプリケーションのためのメカニズムを提供する。
– クライアント・サーバ間の双方向のトラフィックのためにTCPコネクションを一つだけ張る。

## プロトコルの概要

プロトコルは**ハンドシェイク**と**データ転送**の2つの部分からなる。

### ハンドシェイク

#### クライアント -> サーバ

“`http
GET /chat HTTP/1.1
Host: server.example.com
Upgrade: websocket
Connection: Upgrade
Sec-WebSocket-Key: dGhlIHNhbXBsZSBub25jZQ==
Origin: http://example.com
Sec-WebSocket-Protocol: chat, s

元記事を表示

Express Generatorを用いてプロジェクとを立ち上げる。

##1: Express Generatorをインストールする。

“`ターミナル.
npm install -g express-generator
“`

##2: Express Generatorでアプリケーションを作成する。

“`ターミナル.
express –view=ejs <アプリ名>

# –view=ejs テンプレートエンジンにejsを指定するオプション。
“`

– bin (アプリケーションを実行するためのwwwファイルが配置)
– public (公開ディレクトリ images javascripts stylesheets配置)
– routes (ルーティング)
– views (テンプレートファイルを配置)
– app.js (メインプログラム)
– package.json (npmを管理)

が作成される。

##3:パッケージをインストールする。

“`ターミナル.
npm install
“`
package.jsonを元に必要なパッケージがインストールされる。

“`初期package.json{
“name”: “n

元記事を表示

EJSのif文でtrueの時だけ出力する。

## やりたいこと
“`js
<% const person = { name: 'taro' };%>
<% if (person.name) { %><%= person.name %><% } %>
“`
– 上記のような値があったときだけ出力する記述をスマートに書きたい。
– `<%`が多いので減らしたい。 ## 結論 以下のように書くと完結に書くことができます。 ```js <%= person.name ? person.name : '' %>
“`
三項演算子を使用します。偽値の場合は空文字です。

## 試したこと
“`js
<%= if(person.name) { person.name } %> // エラー
<%= if(person.name) person.name %> // エラー
<% if(person.name) person.name %> // 出力されない
“`

偽値を省略できていないのが心残りですが、
結論の`<%= person.name ? person.name : '' %>`がシンプル。

他にいい方法があった

元記事を表示

v8::Local と std::basic_string の相互変換

node.js C++ addons での文字列変換について
nan 等は使わずに [V8 API (14.x)](https://v8docs.nodesource.com/) 向け

# 共通

windows は `_UNICODE` が定義されている必要があります

“`cpp
#define ISOLATE v8::Isolate::GetCurrent()

#if defined(_WIN32)
// windows
typedef wchar_t _char_t;
#else
// mac, linux
typedef char _char_t;
#endif

typedef std::basic_string<_char_t> _string_t;
“`

# v8::Local<v8::String> → std::basic_string

“`cpp

_string_t to_string(const v8::Local& str)
{
#if defined(_WIN32)
// windows

元記事を表示

Intl.DateTimeFormatを使った日付や時間の0詰め

# 本題

最近仕事でNode.jsとV8のチェンジログを追っていたところ、`Intl.DateTimeFormat`という新機能を見つけました。使うと、日付や時間の0詰めを外部ライブラリに頼らずにシュッと書けそうなので試してみました。

サンプルコードは以下のような感じです。

“`
const date = new Date(‘2020-01-01’);
const dateStr =new Intl.DateTimeFormat(‘jp’, {
year: ‘numeric’, month: ‘2-digit’, day: ‘2-digit’,
}).format(date);
console.log(dateStr); // 2020/01/01
“`
“`
const date2 = new Date(‘2020-01-01’);
const dateStr2 = new Intl.DateTimeFormat(‘jp’, options = {
year: ‘numeric’, month: ‘2-digit’, day: ‘2-digit’,
hour

元記事を表示

Vue.jsのvue-cursol-fxを使ってみる

最近は就活中で暇なんでちょこちょこVue.jsを触っています。Railsでのバックエンドばかりだったのでフロントの知識もなく、Vue用のプラグインでとりあえずそれっぽくしたいなと思いvue-cursol-fxを使ってみました。

githubのインストレーションを参考にしています。詳しくはREADME.mdを見てください。
https://github.com/LuXDAmore/vue-cursor-fx?ref=kabanoki.net
## 環境
– Windowns 10
– Node.js v14.15.1
– @vue/cli 4.5.9

言い訳なんですがバーチャルボックスだとnodeのサーバー立ち上げた際ホットリロードが異常に遅い(約1分)ため仕方なくWindowsに直接Nodeをインストールして最近は遊んでいます。仮想環境でホットリロードがなんで遅いのかはいまだ原因分からないです。誰か教えて…

## 導入
まずはvue-cliでプロジェクトを作ります。

“`
vue create sample_app
“`

作成時の設定はデフォルトで、Vue2にしておき

元記事を表示

Node.js: Google Cloud Translation API の使い方 (Advanced)

“`js:advanced01.js
#! /usr/bin/node
//
// advanced01.js
//
// Nov/25/2000
//
// —————————————————————
‘use strict’

// —————————————————————
const projectId = “project-translation”
const location = ‘global’
const text = “Es war einmal ein kleines Mädchen.”

const {TranslationServiceClient} = require(‘@google-cloud/translate’)

const translationClient = new TranslationServiceClient()

async function translat

元記事を表示

Node.js: Google Cloud Translation API の使い方 (Basic)

“`js:basic01.js
#! /usr/bin/node
//
// basic01.js
//
// Nov/25/2000
//
// —————————————————————
‘use strict’

async function translateText() {
let [translations] = await translate.translate(text, target)
translations = Array.isArray(translations) ? translations : [translations]
console.log(‘Translations:’)
translations.forEach((translation, i) => {
console.log(`${text[i]} => (${target}) ${translation}`)
console.error (“*** 終了 ***”)
})
}

/

元記事を表示

alpine環境でyarn add cwebp-binする

# やりたいこと
– alpineベースのdockerコンテナにnodeのパッケージ `cwebp-bin`をインストールする

# やったこと

– alpine linuxはOSレベルで画像処理ライブラリが欠けてるので追加でインストールを実施するべし
– `apk add make automake nasm g++ libc6-compat libjpeg-turbo-dev libpng-dev`
…でいけるはず

### そもそもの経緯
1. まあまあデカめのプロダクトのCI設定の見直しをしていた
2. ビルドにalpine環境を使えば高速化できるのでは?と思い至った
3. やってみると `yarn`を実行したときの`cwebp-bin`のインストールで何故かコケる

### そもそもcwebp-binとは
https://github.com/imagemin/cwebp-bin
https://www.npmjs.com/package/cwebp-bin

>WebP is a new image format that provides lossles

元記事を表示

近すぎると小池都知事が『密です。』と連呼するデバイスを作ったら腹筋が崩壊したので、皆さんにも試して欲しい。

# 怒涛の「密です。」攻撃。
私は直接新型コロナと戦ってはいませんが、医療従事者の端くれとして、最前線で戦っている仲間のためにも、少しでも新型コロナ感染予防につながるデバイスを世の中に生み出したいと思い、こちらのデバイスを作りました。

挙動は以下の通りです。

Docker環境でNodeJSのライブラリsharpを使用するときの darwin-x64 エラー

MacでNode.jsのライブラリsharpを使用するときに darwin-x64 エラーが発生しました。
Docker環境のため、sharpの公式ドキュメントで書いた対処方法ですぐ解決できなかったのではまりました。

“`
/var/www/xxxxx/node_modules/sharp/lib/libvips.js:68
throw new Error(`‘${vendorPlatformId}’ binaries cannot be used on the ‘${currentPlatformId}’ platform. Please remove the ‘node_modules/sharp/vendor’ directory and run ‘npm install’.`);

Error: ‘darwin-x64’ binaries cannot be used on the ‘linux-x64’ platform. Please remove the ‘node_modules/sharp/vendor’ directory and run ‘npm in

元記事を表示

【Win】Node.jsのインストール

#Node.jsのインストール
##環境
OS: Windows10 Pro
Node.js: v12.18.3

##手順
1. [Node.js公式サイト](https://nodejs.org/ja/)へアクセスして推奨版をDL
2. DLしたmsiを実行
3. コマンドプロンプトでバージョン確認

###1.公式サイトへアクセス
[https://nodejs.org/ja/](https://nodejs.org/ja/)へ移動して推奨版を選択します。
![nodejs.org_ja_.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/684640/358965b4-c09f-41dc-80dd-2000ff550050.png)

###2.DLしたmsiを実行
![msi_bn.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/684640/7fe2fd2b-07b0-5421-c238-7e8c1ed5605b

元記事を表示

【Node.js csvファイルを一行ずつストリーミング】

Streamの使い方を試すためにcsvファイルを一行ずつストリーミングして表示するものを作ってみることにした。

今回はconsoleに表示するだけなので、読み込みstreamだけ使う。

readlineモジュールと読み込みStreamを組み合わせる。

“`jsx
const fs = require(‘fs’);
const readline = require(‘readline’);

//index.csvは50行あることにする
var fileName = ‘index.csv’;

const rs = fs.createReadStream(fileName, {encoding: “utf8”});
const rl = readline.createInterface({ input: rs });

let count = 0;
rl.on(‘line’, (army) => {
count++;
console.log(army + ‘\n’);
});
rl.on(‘close’, () => {
console.log(cou

元記事を表示

DockerでNode.js環境構築

# 概要
`Dockerfile`と`Docker-compose`を使って簡単にnode.jsの環境を作る。

# ディレクトリ構造
“`
node_app
├─ Dockerfile
└─ docker-compose.yml
“`

### Dockerfile の記載
“`Dockerfile:Dockerfile
#イメージを指定
FROM node:12.4.0-alpine

# 環境変数を定義
ENV NODE_ENV=development

# 雛形パッケージのインストール
RUN npm install -g express-generator

# 初期カレントディレクトリ
WORKDIR /app

# 開放ポート
EXPOSE 3000
“`
### docker-compose.yml の記載
“`javascript:docker-compose.yml
version: ‘3.7’
services:
app:
build:
context: .
dockerfile: Dockerfile
con

元記事を表示

院内SEへの問い合わせをAIで!FAQ-botの作り方

最近私の勤務している病院が移転したことにより、建物が大きくなり部署も増え、職員も増えたので問い合わせの量も増えました。しかしシステム課の人員は移転前と同じままです。明らかに業務量が目に見えて増えるようになりました。人員はすぐには増やせないのでこの人数で対応を行わなければなりません。

そんな中移転作業の振り返りで、AIで業務負担を軽減できないかなぁと話が挙がりました。AIは最近のニュースで何度も話題なっていて興味はあったのですが、大企業とか大規模なデータを持っている会社しかできないだろうと思っていました。

しかし、同じ沖縄の情シスの方が**DialogFlow**というサービスを使ったAIを構築していると伺いました。調べてみると、そのDialogFlowを応用して、AIを使ったチャットボットシステムが意外と簡単にしかも**無料**で作れました。

今回はそのAI-FAQ-botの概要と、その作成方法についてご紹介いたします。

## FAQ-botの概要

まず今回のbotはLINE株式会社の社員さんが紹介している[記事](https://engineering.linecorp.c

元記事を表示

npmを特定のポート番号で動かしたい

ご無沙汰してます、おおのんです。
一時的に指定したポート番号でnuxtアプリを立ち上げる方法。

“`javascript:ターミナルでnuxtアプリを5000番で動かす。
npm run dev — –port 5000
“`

はい。

元記事を表示

【Node.js ~環境構築~】勉強メモ

開発環境用意

– Node.jsが既にインストールされているか確認

ターミナルで下記のコマンドを実行

“`
~ % node -v
“`
`v12.13.1` のようにバージョンが表示された場合は、既にNode.jsがインストール済み
`command not found: node` と表示された場合は、まだインストールされていない。

– Node.jsのインストール

Node.jsのインストーラーは公式サイトからダウンロード。
[Node.js公式サイト](https://nodejs.org/ja/download/)
今回は、推奨版をダウンロード。
後は、OSに合わせて、Windows及びmacを選択。
![image](https://i.gyazo.com/d855f271e4ebe0d2baeb98c01a0605f7.png)
ちなみに、Node.jsに加えて、npmもインストールされる。
(ダウンロードの下に同梱npmと記載あり)
npm (Node Package Manager)とは、パッケージを用意する為のシステム、
Railsでいうと

元記事を表示

Elasticsearchの検索結果をベクトルタイルとしてNodejsで配信する

## 概要

個人的な興味で、ベクトルタイル活用の可能性を試してみたいと思い、Elasticsearchでの検索結果をMapboxのバイナリベクトルタイル形式にして配信するというよくわからないタイルサーバーをNodejsで作って、オープンソースプロジェクトとして公開してみました。作ったリポジトリは以下の通り。

– [elastic2mvt](https://github.com/JinIgarashi/elastic2mvt): z/x/yと検索クエリを受け取ってバイナリベクトルタイルを1枚だけ生成するモジュール
– [es_tileserv](https://github.com/JinIgarashi/es_tileserv): NodejsのExpressで構築したElasticsearch用のベクトルタイル配信サーバー

こういう使い方がそもそも可能なのかも含めて、かなり試験的で、手探りでAPI仕様など考えていますので、今後ここで書いた以上に内容がガラッと変わる可能性がありますが、もし何かアイデアなどいただけたらと思い、ツールの紹介をします。

長くなりそうなので、ソースコー

元記事を表示

OTHERカテゴリの最新記事