20190915のNode.jsに関する記事は9件です。

FOSS4G 2019 Niigata で得たものの整理

ハンズオンマテリアル関係

こちらこちらを用いて、柴本さん・松澤さんとともにハンズオンを行なった。

asciinema を使うようにしたい

ango の開発の際に検討はしていて採用はしていなかったのだが、やはりasciinema のような CUI のスクリーンキャストを使う等にすると良いと思う。

なぜなら、聴講者に対して「何がコマンド入力で、何がコマンド出力か」を確実に伝えるのは、スタティックな表示では難しいからだ。

modify.js や modify.sql の意義を丁寧に説明する

国連ベクトルタイルツールキットはストリーム志向のソフトウェアなのだが、その処理の中で modify.js や modify.sql が入る理由について、今回は質問をいただいた。

次のような理由を、積極的に説明していくことが適切だと思う。

  1. modify.js を使うことで、中間ファイルの保存を行わずに済ませ、ストレージを節約するとともに、処理速度を向上することができる。
  2. ベクトルタイルの生産担当者には、必ずしもマスターデータを変更する権限がない場合が多い。ベクトルタイル生産の都合によるデータの調整は、マスターデータに対しては行えないので、modify.js を使う。

そもそもベクトルタイルとは何かについて説明する

私は次のように説明します。

  1. ウェブ地図では地図を細切れに分けてストリームするが、その細切れのことをタイルと言い、タイルには画像タイルやベクトルタイルがある。画像タイルもベクトルタイルも表示された見た目は同じ。
  2. しかし、画像タイルはレンダリングした画像であり、ベクトルタイルは機械可読なデータである。
  3. 画像よりもデータの方が75%ほど軽い。その軽さがイノベーションをもたらす。

スマートな Raspberry Pi の使い方

PC に Raspberry Pi をイーサネットケーブルで直結して、 raspberrypi.local というホスト名に ssh するという方法がもっともスマートであるように思われる。

電源ケーブルとイーサネットケーブルを十分短いものにすれば、かなりスマートな提示ができると思われる。

実際には、PC 側に必ずしもイーサーネットポートがあるわけではないので、USB/イーサネット変換や、USB-C/イーサネット変換のアダプタもある程度の数持っておく必要があると考える。

Docker Toolbox ではポート転送が必要

Docker Toolbox を使う人に対しては、 Oracle VirtualBox でポート転送を設定してもらう必要がある。そのほかの場合には、既存の案内内容で十分にポート転送ができている。

自ホスト名をスマートに扱う

自ホスト名が localhost になるパターンと raspberrypi.local になるパターンが発生し、 style.(h)json を書き換える必要が発生した。

自ホスト名を config/default.hjson あたりに逃し、rake build の時に自ホスト名を style.json に埋め込むようにすると、面倒な編集が不要になる。

自ホスト名は、タイルのテンプレート URL、スプライトの URL、フォントの URL と三回使われることになるので、rake build のときに埋めるようにしたほうが安全、ということである。

tippecanoe のコマンドラインオプションは short form? long form?

ango では、私が long form のオプションを使い、柴本さんが short form のオプションを使った。統一できた方が良い。

私は rake にコマンドを書いて、研修の中で解説だけすることにしたので、long form を使った一方、柴本さんはコマンドを直接打ってもらうことにしたので、short form を使ったのである。よって、rake を使うかどうかの判断に合わせて、long か short かを決断すれば良いと思う。

地球地図に取り組んでいく

地球地図はすでにベクトルタイルにされているから、ハンズオンにそれをなぞるような感じになる。まずは、地球地図 GeoJSONS を optgeo の中に作るのも一つの方法だと思う。

レポジトリを私が作るとしたら Inazo という名前にすると思う。

サポート要員の数

サポート要員の必要数は、同時に発生するサポート要求の数に合わせれば良い。今回はサポート要員2名で16名程度への対応であったので、かなり余裕を持って対応することができた。最小のサポート要員数は1だと思う。サポート要員をゼロにして講師だけで対応しようとすると、ハンズオンの質がかなり下がる可能性がある。

プレゼンテーションの内容関係

こちらのプレゼンテーションを行なった。

適切なガバナンスの確保について

OSGeo Incubation Process への応募を長期的に目指していくことで、オープンソースプロジェクトとしての適切なガバナンスを得ていくことを目指す。

そのための課題は、ここでじわじわと検討していくことになる。

統制されたネットワークへの対応について

次の世代のハンズオンマテリアルについて作業をするにあたって、「インターネットから独立したウェブ地図」として動作するようになることをまず目指す。

FOSS4G Monthly Online について

Zoom を使って月例開催する方向で考えていくが、目標は10月の第三木曜日に初実施、というあたりだと考えている。

ツールの勉強

とりあえず、次の二つのツールについて、動き始める前に勉強をしておく必要があると認識している。

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

[初心者向け] Ansible を体験してみよう

いきなりですが「Ansible」普段から使用していますか?
「infrastructure as Code」が当たり前になってきている世の中、インフラエンジニアの方は勿論アプリケーションエンジニアの方も知っておいて損はない技術です。

Ansibleとは、Red Hat社が開発するオープンソースの構成管理ツールです。
ソフトウェアのインストール、コマンド実行などのタスクをコード化し、自動化することが可能です。
詳細は「Ansibleとは」などでググってみてください。

本記事ではAnsibleを使用したことがない方に向けて1から手順を説明し、実際に実行するまでのデモを行います。
目標は以下の通りです。

  • ローカルPC上に仮想マシン(Ubuntu18.04)を2台立ち上げ、1台のマシンからもう1台の仮想マシンに対してnode.jsの自動インストールを行う

イメージはこんな感じです。

早速やっていきましょう!

前提条件

前提条件は以下を想定しております。

  • ローカルPCはMacOSであること

Windowsの方でも本手順は行えますが、vagrant 周りでエラーが発生する可能性があるかもしれません。
その際は GUI画面からVirtualBoxアプリを開き、仮想環境を2台手動で立ち上げるなどの方法でも問題ありません。

VirtualBox + Vagrant をMacにインストールする

本環境を作成するにあたり必要なソフトウェアのインストールを行います。

  • VirtualBox
  • vagrant

VirtualBoxは仮想マシンを作成するために必要なもので、vagrant はVirtualBoxをコードレベルで操作するものと覚えて頂いて問題ありません。

インストール方法ですが、以下の記事が大変わかりやすいです。

https://qiita.com/inouet/items/b36638adc2b5772db457

「2. VirtualBox を公式サイトからインストール」まで実行してください。

環境の立ち上げとAnsibleのインストール

インストールが完了したら仮想マシンの立ち上げから行います。

Vagrantfileを作成し、中を全削除後以下のように書き換えてください

$ vagrant init
$ ls
Vagrantfile
$ vim Vagrantfile

Vagrant.configure(2) do |config|
 config.vm.define "AnsibleServer" do |node|
    node.vm.box = "bento/ubuntu-18.04"
    node.vm.hostname = "AnsibleServer"
    node.vm.network :private_network, ip:"192.168.7.7"
    node.vm.provider "virtualbox" do |vb|
      vb.customize ["modifyvm", :id, "--memory", "1024"]
    end
    node.vm.provider "virtualbox" do |vb|
      vb.gui = false
    end
  end
 config.vm.define "AnsibleClient" do |node|
    node.vm.box = "bento/ubuntu-18.04"
    node.vm.hostname = "AnsibleClient"
    node.vm.network :private_network, ip:"192.168.8.8"
    node.vm.provider "virtualbox" do |vb|
      vb.customize ["modifyvm", :id, "--memory", "1024"]
    end
    node.vm.provider "virtualbox" do |vb|
      vb.gui = false
    end
  end  
end

ファイルの作成完了後、Vagrantfileがあるディレクトリで以下コマンドを実行します。
実行完了後、2台の仮想マシンが立ち上がっています。

$ vagrant up

無事作成が完了したら、1度Server側となる仮想マシンにログインしてみましょう。

$ vagrant ssh AnsibleServer
vagrant@AnsibleServer:~$ 

無事ログインできましたね!
早速Server側にAnsibleのインストールを行いましょう。

vagrant@AnsibleServer:~$ sudo apt update
vagrant@AnsibleServer:~$ sudo apt install software-properties-common
vagrant@AnsibleServer:~$ sudo apt-add-repository ppa:ansible/ansible
vagrant@AnsibleServer:~$ sudo apt update
vagrant@AnsibleServer:~$ sudo apt install ansible
vagrant@AnsibleServer:~$ ansible --version
ansible 2.8.5

version 2.8.5 のansibleインストールが完了です!

Ansibleのコード作成

次に、Ansilbeのコードを確認します。
Server側の仮想マシンにログインしたまま以下の手順を実行してください。
今回のデモで使用するAnsibleのディレクトリ構造は以下のようになります。

.
├── ansible.cfg
├── hosts
├── playbook.yml
└── roles
    └── node
        └── tasks
            └── main.yml
  • ansible.cfg
    • 設定ファイルのようなもの。Clientへの初回接続SSHエラーが出ないように設定している
  • hosts
    • 接続先を定義します
  • playbook.yml
    • 実行するRoleを定義します。
  • roles
    • Roleの定義を行います。

まずは上記のディレクトリ構成を実現するため、Homeディレクトリでファイルとディレクトリの作成から行います。

vagrant@AnsibleServer:~$ touch hosts playbook.yml ansible.cfg
vagrant@AnsibleServer:~$ mkdir -p roles/node/tasks/
vagrant@AnsibleServer:~$ touch roles/node/tasks/main.yml

各ファイルの中身を以下のように編集してください。

vagrant@AnsibleServer:~$ vim hosts

[AnsibleClient]
192.168.8.8

vagrant@AnsibleServer:~$ vim playbook.yml

---
- hosts: AnsibleClient
  become: no
  roles:
    - {role: 'node', tags: ’node’}

vagrant@AnsibleServer:~$ vim ansible.cfg

[ssh_connection]
ssh_args = -o ControlMaster=auto -o ControlPersist=60s -o StrictHostKeyChecking=no -o UserKnownHostsFile=/dev/null

vagrant@AnsibleServer:~$ vim roles/node/tasks/main.yml

- name: remove node.js
  become: yes
  apt:
    name: node.js
    state: absent
    purge: yes

- name: add repository of node.js
  become: yes
  shell: curl -sL https://deb.nodesource.com/setup_10.x | sudo bash -

- name: apt-get update
  become: yes
  apt:
    update_cache: yes

- name: install latest node.js
  become: yes
  apt:
    name: nodejs

以上で準備完了です。
あと一息です!!

Ansibleの実行

いよいよAnsibleの実行です。

いきなり実行する前にClientの状態を確認しておきましょう。
今回の目標はClientにNode.jsをインストールすることだったので、事前に入っていないか確認します。
(ServerとClientを行き来するのでiTerm2を使用している方は2画面でやると良いです。)

vagrant@AnsibleServer:~$ exit
$ vagrant ssh AnsibleClient
vagrant@AnsibleClient:~$ node -v
-bash: node: command not found

入っていないことが確認できました!

ではもう一度Server側にログインします。

vagrant@AnsibleClient:~$ exit
$ vagrant ssh AnsibleServer
vagrant@AnsibleServer:~$

確認が取れたので改めてAnsibleの実行を行います。
以下コマンドをサーバ側で実行してください。
パスワードを求められるので、 vagrant と入力してください。

vagrant@AnsibleServer:~$ ansible-playbook -i hosts playbook.yml -u vagrant -k
SSH password:

PLAY [AnsibleClient] *************************************************************************************************************
TASK [Gathering Facts] ***********************************************************************************************************
ok: [192.168.8.8]
.
.
192.168.8.8                : ok=5    changed=3    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0

Ansibleの実行は完了しましたでしょうか?
無事成功すると、ok=5とレスポンスがあると思います。
ではClietにログインし、Node.jsがインストールされているか確認してみましょう。

vagrant@AnsibleServer:~$ exit
$ vagrant ssh AnsibleClient
vagrant@AnsibleClient:~$ node -v
v10.16.3

無事インストールされていまね!
今回はNode.jsのみのインストールでしたが、他にも自分の使いたいものや実行したいものをタスク化しておけばコマンド1回叩くだけで自動で行ってくれます。

おわりに

最後までみて頂きありがとうございます。
長い道のりでしたが、Ansibleのことについて少しでも理解して頂けたでしょうか。
今回はテストを手動で行いましたが、
業務で使用されるのであれば自動テストツールであるServerSpecも同時に学習すると良いと思います。
Ansibleを活用し、皆さんの作業が少しでも楽になれば幸いです!

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

WebAssemblyでお絵描きチャット"8bitpaint chat"を作った

公開先

https://minordaimyo.net/8bitpaintchat/
(現在デバッグ中)

8bitpaint chatの主な特徴・使い方

  • 高解像度のキャンバス(A4 600dpi相当)で軽快な描き味
  • 筆圧と傾き検知に対応
  • 参加人数は8人まで(ROMは現状16人まで)
  • 使える色は入室時に割り当てられた1色のみ
  • 任意の色をミュート(非表示)にできる機能
  • 2本指のタッチ操作でキャンバスのスクロール・拡縮
  • 2本指タップでUndo、3本指タップでRedo
  • キャンバスのダウンロード機能(pngとpsd形式)

動作環境

Windows上のChromeとペンタブレット・液晶タブレット
iPad上のSafariとApple-pencil
Android上のChrome
等々

ぎじゅつてきなこと

クライアントサイドはjs+WebAssembly(主にc言語)
サーバーサイドはnode.js+WebAssembly(クライアントと共通のコード)
で作成。

キャンバスサイズは、7016x4961pixel(A4 600dpiと同じ)。
クライアント側の消費メモリは300MBくらい、
サーバー側の消費メモリは150MBくらい。
サーバー側にもキャンバスを保持しているため、メモリ消費が大きくなっています。

ユーザーインターフェース周りを中心にjsを使用。
お絵描き機能部分はほぼc言語で記述(WebAssembly)。

苦労したこと

c言語は割と得意だけどWebプログラミングは全くの素人。
そのためjsでの記述部分はかなりの糞コードになってしまった…
あとまだデバッグ中なので、不具合は結構あります。

その他

初めてQiitaで発信しました。
必要なことは後から書き足す予定です。

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

nodebrewでバージョンを上げた際にグローバルインストールしてたコマンドが無くなる問題への対応

結論

nodeのバージョンを上げた後で下記コマンドを実行。
バージョンを上げる前にグローバルインストールしていたコマンド達を、バージョンアップ後のnodeに一括でグローバルインストールしてくれる。

nodebrew migrate-package 11.9.0(適宜置き換え)

11.9.0は今まで使っていたバージョンです。
私の場合は11.9.0から11.10.1にバージョンを上げたので、11.9.0を指定しました。

(助けて貰った記事一覧)

What's happend?

以下、この記事を書こうと思った事象についての日記となります...

(2019/9/15)

本日1週間ぶりにcreate-react-appすると、失敗するようになってました。

依存でインストールされるeslintが要求するnodeのバージョンと私が使用していたnodeのバージョン(11.9.0)が合わなくなった事が原因でした。

なのでnodebrewでnodeのバージョンを上げました。

改めてcreate-react-appすると...

$ create-react-app myapp
-bash: create-react-app: command not found

コマンドが無くなってしまいました...

コマンドの置き場所を確認してみると、
今まで入れてたものが無くなってしまっている...

(before)

$ ls /Users/gossan/.nodebrew/current/bin/
create-react-app    npm         surge
firebase        npx         wscat
gatsby          serverless      yarn
node            sls         yarnpkg
nodebrew        slss

(after)

$ ls /Users/gossan/.nodebrew/current/bin/
node        nodebrew    npm     npx

この時点でやっと気づきました。
グローバルインストールしたコマンドはインストール時のnodeのバージョンに紐づけられると言う事に。

一括で引き継ぐためのコマンドが無い筈が無いと思い調べると、
nodebrew migrate-package xx.xx.xx(旧バージョン)で解決するらしい事を発見。

元々11.9.0を使っていたので下記のよう試しました。

$ nodebrew migrate-package 11.9.0

〜(略)〜

Try to install yarn ...
/Users/gossan/.nodebrew/node/v11.10.1/bin/yarnpkg -> /Users/gossan/.nodebrew/node/v11.10.1/lib/node_modules/yarn/bin/yarn.js
/Users/gossan/.nodebrew/node/v11.10.1/bin/yarn -> /Users/gossan/.nodebrew/node/v11.10.1/lib/node_modules/yarn/bin/yarn.js
+ yarn@1.17.3
added 1 package in 0.052s

〜(略)〜

Try to install create-react-app ...
/Users/gossan/.nodebrew/node/v11.10.1/bin/create-react-app -> /Users/gossan/.nodebrew/node/v11.10.1/lib/node_modules/create-react-app/index.js
+ create-react-app@3.1.1
added 1 package in 0.248s

Installed successfully:
serverless
surge
yarn
gatsby-cli
firebase-tools
wscat
create-react-app

11.9.0でグローバルインストールしていたものをグローバルインストールし直してくれているようですね。

改めてグローバルインストールされたコマンドを確認すると、、、

$ ls /Users/gossan/.nodebrew/current/bin/
create-react-app    npm         surge
firebase        npx         wscat
gatsby          serverless      yarn
node            sls         yarnpkg
nodebrew        slss

全部ありました!

元々使いたかったcreate-react-appも復活しました!

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

Alexa はじめてのスキル内課金

はじめに

今回はAlexaのスキル内課金の作り方を説明します。

今回実施する内容

スキルの中に課金の仕組みを作りこみます。

環境

OS:Windows 10 JP
Alexaスキル言語:Node.js
Editor:Visual Studio Code
Alexa developer console

参考

用語

スキル内課金 (ISP)

スキルの中の課金の仕組みこと。
In Skill Product

前提条件

特になし

スキル内課金の概要

スキル内課金の導入にあたり、スキル内課金を実現するための仕組みの概念図を示します。

画像添付

  • スキル内商品リスト スキル内課金商品の商品名やID、商品の説明などや、購入できるか、購入済みかなどの情報が保存されたリストで、サーバー上に保持される。
  • スキル内課金商品の説明・購入 スキル内課金商品の説明や、購入を実施する。 ユーザーに「購入する。」といった意思表示をしてもらうまでは、スキルの役割であり、購入手続きは、Alexaが実施する。
  • スキル内課金商品の実行 スキル内課金商品を購入したら、その商品に対する処理はスキルが実行する。

スキル内課金の説明や購入前後のガイド
ここは、プログラム
- スキル内課金の購入・キャンセルなどの処理
ここは、アレクサ

スキル内商品リストの作成

スキル内商品のリストは、ASK CLIでも作成できるようですが、Alexa developer consoleから作成します。
スキル内商品リストは、ソースコードからその情報を取得できますが、以下の情報が含まれます。
作成時この中のうち、購入情報を除く情報と、購入するための補足や、amazonでの審査のために必要な情報を作成します。

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

【Node.js】文字列をハッシュ化

関連

サンプルコード

const crypto = require('crypto');

const plainText = 'password';

// サポートされているハッシュアルゴリズムを確認
console.log(crypto.getHashes());
// => [ 'RSA-MD4',
//      'RSA-MD5',
//      'RSA-MDC2',
//      'RSA-RIPEMD160', ...

// `crypto.createHash('アルゴリズム名').update('文字列').digest('hex')`
console.log('md5:    ' + crypto.createHash('md5').update(plainText).digest('hex'));
console.log('rmd160: ' + crypto.createHash('rmd160').update(plainText).digest('hex'));
console.log('sha1:   ' + crypto.createHash('sha1').update(plainText).digest('hex'));
console.log('sha256: ' + crypto.createHash('sha256').update(plainText).digest('hex'));
console.log('sha384: ' + crypto.createHash('sha384').update(plainText).digest('hex'));
console.log('sha512: ' + crypto.createHash('sha512').update(plainText).digest('hex'));

// => md5:    5f4dcc3b5aa765d61d8327deb882cf99
//    rmd160: 2c08e8f5884750a7b99f6f2f342fc638db25ff31
//    sha1:   5baa61e4c9b93f3f0682250b6cf8331b7ee68fd8
//    sha256: 5e884898da28047151d0e56f8dc6292773603d0d6aabbdd62a11ef721d1542d8
//    sha384: a8b64babd0aca91a59bdbb7761b421d4f2bb38280d3a75ba0f21f2bebc45583d446c598660c94ce680c47d19c30783a7
//    sha512: b109f3bbbc244eb82441917ed06d618b9008dd09b3befd1b5e07394c706a8bb980b1d7785e5976ec049b46df5f1326af5a2ea6d103fd07c95385ffab0cacbc86

参考

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

【Node.js】AWS SSMパラメータストアの値を取得する

関連

使用するモジュール

  • aws-sdk
    公式で提供されているライブラリ
npm i --save-dev aws-sdk

サンプルコード

今回はAWS SSM パラメータストアに以下のようなパラメータが作成してある。

パラメータ名
sample-parameter HOGEHOGE!!
const AWS = require('aws-sdk');

const main = async () => {
    // 認証情報
    // `~/.aws/credentials`に認証情報が設定されている場合、
    // または環境変数`AWS_ACCESS_KEY_ID`, `AWS_SECRET_ACCESS_KEY`に認証情報が設定されている場合は
    // `access_key_id`と`secret_access_key`は不要
    const credentials = {
        accessKeyId: 'xxxxxxxxxxxxxxxxxxxx',
        secretAccessKey: 'xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx',
        region: 'ap-northeast-1'
    };

    // SSMクライアントを作成
    const ssm = new AWS.SSM(credentials);

    // リクエスト
    const request = {
        Name: 'sample-parameter', // パラメータ名
        WithDecryption: true      // 暗号化されている場合は復号し、暗号化されていない場合は何もしない
    };
    const response = await ssm.getParameter(request).promise();

    console.log(response);
    // => { Parameter:
    //      { Name: 'sample-parameter',
    //        Type: 'SecureString',
    //        Value: 'HOGEHOGE!!',
    //        Version: 1,
    //        LastModifiedDate: 2019-09-12T15:28:02.134Z,
    //        ARN:
    //         'arn:aws:ssm:ap-northeast-1:xxxxxxxxxxxx:parameter/sample-parameter' } }

    console.log(response.Parameter.Value);
    // => HOGEHOGE!!
};
main();

参考

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

Eris+VoiceTextWebAPIでしゃべるDiscordBot

DiscordBotをしゃべらせる

DiscordBotをボイスチャットに参加させて特定のチャンネルの内容を話させる。Node.jsを利用。

処理の内容

開始のコマンドでボイスチャットに参戦させる

開始コマンドを打ち込んだチャンネルの投稿を取得する

VoiceTextWebAPIで文字を音声に変換する

ボイスチャットに流す

(繰り返し)

終了コマンドでボイスチャットから出る

下準備

DiscordBot用のAPIKEYを取得しておく。
参照→簡単なDiscord Botの作り方(初心者向け)

VoiceTextWebAPI用のAPIKEYを取得しておく。
VoiceText Web API
ここから無料利用登録するとAPIKEYがメールで送られてきます。

ffmpegを導入しておく
Windowsだけ挙げておく
【windows】FFmpegをインストールする手順

npm等パッケージマネージャでeris,voice-textをインストールしておく

実際のコード

server.js
const eris = require("eris");
let bot = new eris("<DiscordのAPIKEY>");

const {VoiceText} = require("voice-text");
const vt = new VoiceText("<VoiceTextWebAPIのAPIKEY>");

const VOICE_CONNECTION = null;
const TtoV_CHANNEL = "";


bot.on("ready", () => {
    console.log("bot is ready");
});

bot.on("messageCreate", (msg) => {
    // botのメッセージは無視
    if (msg.author.bot) return;
    // ボイスチャンネルに入っているかどうか
    let isConnection = !!VOICE_CONNECTION;
    // 開始コマンド !startspeech
    if(msg.content=="!startspeech"&&!isConnection)
    {
        const vc = msg.member.voiceState.channelID;
        // メッセージを書いた人がボイチャにいるかどうか
        if(!!vc)
        {
            // メッセージを書いた人のいるボイスチャットに入る
            TtoV_CHANNEL = msg.channel.id;
            bot.getChannel(vc).join().then(connection => {
                VOICE_CONNECTION= connection;
                bot.createMessage(TtoV_CHANNEL, "Start Speech");
            });
        }else{
            bot.createMessage(msg.channel.id, "You must join a voice channel before you use it.");
        }
    }else if(msg.channel.id==TtoV_CHANNEL)
    {
        // 終了コマンド !endspeech
        if(msg.content == "!endspeech")
        {
            if(!!isConnection){
                VOICE_CONNECTION.disconnect();
                VOICE_CONNECTION = null;
                bot.createMessage(TtoV_CHANNEL, "End Speech");
                return;
            }
        }else{
            // ボイスで話している途中に追加で話されるとエラーが発生する。
            // 対策としてはスタックにどんどんメッセージを入れるようにするなど
            // ボイスが終了するイベントが取得できれば改善される(未実装)
            try{
                // APIの制限で200文字までしか話せない
                let stream = vt.stream(msg.content.slice(0,200), {
                    speaker: "hikari"
                });
                const dispatcher = VOICE_CONNECTION.play(stream);
            }catch(e){
                bot.createMessage(TtoV_CHANNEL, "Wait until the end of the voice.");
            }
        }

    }
});


bot.connect();

まとめ

かなり少ない行数で実装可能。
ただし、ボイスで話している途中に追加で話されるときに出るエラーの対策ができていないので注意。
対策したら追記します。

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

Node.jsとは?

目的

  • Slackでアプリを作成したときにNode.jsというものに触れたが不明なことが多かったため調べたことをまとめる。

特徴

  • サーバで動くJavaScript
  • 小さい計算が得意で速い
  • マイクロソフトやYahooが推奨している
  • リアルタイムWebの分野に強い
  • 小規模で機動性の高いWebアプリで、リアルタイム性が求められるアプリに最適

ちょっと深堀した特徴

  • 非同期処理で動く(動作が高速な理由)
    データベースからデータを取得するプログラムで同期処理の場合はデータベースからの反応を待つが、非同期処理だとデータベースからの反応を待っている間に別の処理を実行することができる。前述の方法をとっているため大量のアクセスを高速に処理することが可能。

  • シングルスレットでメモリの消費効率化(小さい計算が得意な理由)
    本来サーバに複数のアクセスがあった時にそれぞれにメモリを割り当てて実行する(マルチスレッド)が、1万人規模のアクセスがあるとメモリが上限にあたり効率が悪くなる。Node.jsでは一つのメモリでひとつずつアクセスを処理する方法をとることでメモリ効率を向上させている。

    一見一つのメモリで一つの処理しかできないため処理が遅そうに感じるが前述した非同期処理のおかげで、メモリでの処理を待たずして処理を実行できるため、少ないメモリ消費量を抑えて大量のアクセスを高速に処理できる。

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