- 投稿日:2019-09-15T21:19:15+09:00
FOSS4G 2019 Niigata で得たものの整理
ハンズオンマテリアル関係
こちらとこちらを用いて、柴本さん・松澤さんとともにハンズオンを行なった。
asciinema を使うようにしたい
ango の開発の際に検討はしていて採用はしていなかったのだが、やはりasciinema のような CUI のスクリーンキャストを使う等にすると良いと思う。
なぜなら、聴講者に対して「何がコマンド入力で、何がコマンド出力か」を確実に伝えるのは、スタティックな表示では難しいからだ。
modify.js や modify.sql の意義を丁寧に説明する
国連ベクトルタイルツールキットはストリーム志向のソフトウェアなのだが、その処理の中で modify.js や modify.sql が入る理由について、今回は質問をいただいた。
次のような理由を、積極的に説明していくことが適切だと思う。
- modify.js を使うことで、中間ファイルの保存を行わずに済ませ、ストレージを節約するとともに、処理速度を向上することができる。
- ベクトルタイルの生産担当者には、必ずしもマスターデータを変更する権限がない場合が多い。ベクトルタイル生産の都合によるデータの調整は、マスターデータに対しては行えないので、modify.js を使う。
そもそもベクトルタイルとは何かについて説明する
私は次のように説明します。
- ウェブ地図では地図を細切れに分けてストリームするが、その細切れのことをタイルと言い、タイルには画像タイルやベクトルタイルがある。画像タイルもベクトルタイルも表示された見た目は同じ。
- しかし、画像タイルはレンダリングした画像であり、ベクトルタイルは機械可読なデータである。
- 画像よりもデータの方が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
- 投稿日:2019-09-15T19:22:20+09:00
[初心者向け] 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.5version 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=0Ansibleの実行は完了しましたでしょうか?
無事成功すると、ok=5とレスポンスがあると思います。
ではClietにログインし、Node.jsがインストールされているか確認してみましょう。vagrant@AnsibleServer:~$ exit $ vagrant ssh AnsibleClient vagrant@AnsibleClient:~$ node -v v10.16.3無事インストールされていまね!
今回はNode.jsのみのインストールでしたが、他にも自分の使いたいものや実行したいものをタスク化しておけばコマンド1回叩くだけで自動で行ってくれます。おわりに
最後までみて頂きありがとうございます。
長い道のりでしたが、Ansibleのことについて少しでも理解して頂けたでしょうか。
今回はテストを手動で行いましたが、
業務で使用されるのであれば自動テストツールであるServerSpec
も同時に学習すると良いと思います。
Ansibleを活用し、皆さんの作業が少しでも楽になれば幸いです!
- 投稿日:2019-09-15T19:15:25+09:00
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で発信しました。
必要なことは後から書き足す予定です。
- 投稿日:2019-09-15T17:40:59+09:00
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-app11.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
も復活しました!
- 投稿日:2019-09-15T16:14:27+09:00
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での審査のために必要な情報を作成します。
- 投稿日:2019-09-15T14:47:22+09:00
【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参考
- 投稿日:2019-09-15T14:17:46+09:00
【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();参考
- 投稿日:2019-09-15T13:38:43+09:00
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.jsconst 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();まとめ
かなり少ない行数で実装可能。
ただし、ボイスで話している途中に追加で話されるときに出るエラーの対策ができていないので注意。
対策したら追記します。
- 投稿日:2019-09-15T12:04:01+09:00
Node.jsとは?
目的
- Slackでアプリを作成したときにNode.jsというものに触れたが不明なことが多かったため調べたことをまとめる。
特徴
- サーバで動くJavaScript
- 小さい計算が得意で速い
- マイクロソフトやYahooが推奨している
- リアルタイムWebの分野に強い
- 小規模で機動性の高いWebアプリで、リアルタイム性が求められるアプリに最適
ちょっと深堀した特徴
非同期処理で動く(動作が高速な理由)
データベースからデータを取得するプログラムで同期処理の場合はデータベースからの反応を待つが、非同期処理だとデータベースからの反応を待っている間に別の処理を実行することができる。前述の方法をとっているため大量のアクセスを高速に処理することが可能。シングルスレットでメモリの消費効率化(小さい計算が得意な理由)
本来サーバに複数のアクセスがあった時にそれぞれにメモリを割り当てて実行する(マルチスレッド)が、1万人規模のアクセスがあるとメモリが上限にあたり効率が悪くなる。Node.jsでは一つのメモリでひとつずつアクセスを処理する方法をとることでメモリ効率を向上させている。
一見一つのメモリで一つの処理しかできないため処理が遅そうに感じるが前述した非同期処理のおかげで、メモリでの処理を待たずして処理を実行できるため、少ないメモリ消費量を抑えて大量のアクセスを高速に処理できる。