- 投稿日:2019-10-20T21:27:37+09:00
【Node.js】e-Statを使った処理を考える
はじめに
Node.jsの練習中です。空き時間をなんとか捻出して、少しでも何か作れないかと苦心しています。
今回の目的
REST APIを使って色々なデータを取得してみたいと考えています。
様々なプラットフォームからデータを得る⇨多種多様なデータ種が自分のプラットフォームに集まる⇨集まったデータを使っていろんな新しい価値に繋げる
こんな妄想をしています。その練習として政府統計の総合窓口 e-Statから統計データを取得する実装してみます。
何か面白そうなAPIはないかと以下の記事を探して、今回のAPIを見つけました。
個人でも使える!おすすめAPI一覧実装内容
早速ですが、以下のような実装をNode.jsで行いました。
今回は実装内容について記述をしたく、APIの仕様についてはかなり割愛します。(というかまだ勉強中)getInfo.jsvar req = require('request'); var urljoin = require('url-join'); var parser = require('fast-xml-parser'); var url = 'https://api.e-stat.go.jp/rest/1.0/app/getStatsList';//統計表情報の取得API var appId = 'XXXXXXXXXXXXX';//発行した個人のappId var lang = 'ja';//言語を日本語に指定 //政府統計コード var statsCode = '00552010'; //クエリパラメータを結合してURL生成 var fullUrl = urljoin(url,'?appId='+appId,'?land='+lang,'?statsCode='+statsCode); console.log(fullUrl); var options = { url: fullUrl, method: 'GET' } req(options, function (error, response, body) { if (error) { console.log('Error: ' + error.message); return; } var xmlOption = { attributeNamePrefix : "",//Attribute名の先頭prefixを指定しない ignoreAttributes : false//XMLのattributeを取るためにはtrue } var jsonData = parser.parse(body,xmlOption); var listData = jsonData.GET_STATS_LIST.DATALIST_INF.LIST_INF; //console.log(listData); var spredData = listData[0]; console.log(spredData); nextFunction(spredData); }) function nextFunction(data){ var url2 = 'https://api.e-stat.go.jp/rest/1.0/app/getStatsData'; var statsDataId = data.id; var fullUrl2 = urljoin(url2,'?appId='+appId,'?land='+lang,'?statsDataId='+statsDataId); console.log(fullUrl2); var options = { url: fullUrl2, method: 'GET' } req(options, function (error, response, body) { if (error) { console.log('Error: ' + error.message); return; } var xmlOption = { attributeNamePrefix : "",//Attribute名の先頭prefixを指定しない ignoreAttributes : false//XMLのattributeを取るためにはtrue } var jsonData = parser.parse(body,xmlOption); console.log(jsonData.GET_STATS_DATA.STATISTICAL_DATA.DATA_INF.VALUE); }) }
最初にコールするAPI(getStatsList)
統計表の情報(表タイトルや提供省庁など)を取得するAPIです。今回は特許庁の知的財産活動調査の統計表情報を取得するため、政府統計コード(statsCode)を00552010を指定します。2回目にコールするAPI※nextFunction(getStatsData)
上記で取得した統計表ID(statsDataId)を指定して統計データを取得します。実装で悩んだこと
requestモジュールはオプションで下記みたいにjson:trueすることでレスポンスのjsonをパースしてくれます。
var options = { url: url, method: 'GET', json:true }e-StatのAPIは/rest/1.0/app/json/getStatsListのようにURLを指定することでJSONでレスポンスを受けれるみたいなのですが、試してみると404エラー。ここは、XMLをパースして処理してみるのもいい実践知になるかもしてないと、色々試してみることに。
XMLパースに使用したモジュール
NodeJSでXMLをパースする
これを参考にfast-xml-parserというモジュールを使いました。
インストールは下記のコマンド。$npm install fast-xml-parserxmlOptionを指定し、parseを実行することでJSONオブジェクトに変換され取得することができます。
あとはこれをjsonData.GET_STATS_DATA.STATISTICAL_DATA.DATA_INF.VALUEのようにアトリビュートをしてして値を取得していきます。
これを使ってやりたいこと
取得した統計情報を統計解析して相関を定量的に評価することで意外と面白い関係が見出せるのでは?なんて思っています。Simple Staticsという解析モジュールがNode.jsにはあるようなので、これが使えるのではないかと企んでます。とはいえ、時間がない・・・なんとか時間を捻出し次のステップを踏めればと思います。
- 投稿日:2019-10-20T18:53:29+09:00
Dependabot で依存パッケージをアップデートする
はじめに
昨今のアプリケーション開発では、依存するライブラリの機能追加やセキュリティのアップデートに追従することが求められます。
また、しばしば導入したライブラリは導入時点のバージョンのまま利用され、アップデートされないことがありますがそれは後々の負債になりがちです。
しかし、日々アップデートを検知して更新していくのは辛いものがあります。
そこで Dependabot の登場です。Dependabot とは
Dependabot は Gemfile や package.json など、言語が持つパッケージ管理のマニフェストファイルを見て古かったり、安全ではないライブラリを発見してくれます。発見した依存関係を元に Pull Request を作成して通知してくれるツールです。設定によっては CI を通過したら自動でマージすることもできます。
Dependabot は、GitHub に買収されたことでプライベートリポジトリでも無料で利用できます。現在は以下の言語に対応しています。Ruby や JavaScript といった言語を始め、Docker や Terraform などにも対応しています。
Dependabot の導入
早速インストールしていきます。
GitHub の Marketplace から Dependabot Preview を開きます。画面下に遷移して
Install it for free
からインストールします。
Complete order and begin installation
から続行します。ここでアカウントのパスワードが求められた場合はパスワードを入力して続行します。全リポジトリ、または特定のリポジトリに権限を付与するかを選び、
Install
を押して続行します。次に Dependabot に GitHub アカウントでログインします。
Dependabot から GitHub へのアクセスを許可します。
これで Dependabot のダッシュボードまで接続が完了しました。
Dependabot の設定
続いて設定するリポジトリを追加します。
Select repos to add
またはAdd repos
から追加します。
ここでは GitHub から権限を付与したリポジトリが表示されます。
追加したいリポジトリにチェックを入れ、Add selected
で追加します。追加するとダッシュボードに追加されていることが分かります。
歯車のアイコンから設定を開くといくつかの設定が可能です。この画面からでも設定可能ですが、ここでは別リポジトリを作成した際にも使いまわせるように、設定ファイルを用いて設定していきます。
リポジトリの
.dependabot/config.yml
のパスに以下のような設定ファイルを作成します。
今回は設定ファイルとして必要そうなものを設定していきますが、他にもいくつかの設定があるため詳細はドキュメントを参照してください。.dependabot/config.ymlversion: 1 update_configs: - package_manager: "javascript" directory: "/" update_schedule: "live" default_reviewers: - "takasp" default_labels: - "dependencies" allowed_updates: - match: update_type: "all" automerged_updates: - match: dependency_type: "development" update_type: "all" - match: dependency_type: "production" update_type: "semver:patch" version_requirement_updates: "increase_versions"いくつか設定に使った項目について触れていきます。
package_manager
使用している言語を選択します。
ここでは JavaScript のプロジェクトのため、JavaScript を選択します。directory
マニフェストファイル(ここでは package.json)があるディレクトリを指定します。update_schedule
更新頻度と Pull Request を作成するタイミングを指定します。
daily
やweekly
を指定する場合は実行日や時間を指定できます。default_reviewers
作成した Pull Request をレビューする GitHub アカウントを指定します。default_labels
作成した Pull Request に付けるラベルを指定します。allowed_updates
更新するアップデートを制限します。セキュリティ更新のみに制限したり、名前の一致するものや依存関係の種類(development や production)によって制限できます。automerged_updates
自動的にマージする Pull Request の条件を指定します。
ここでは development と production で分割し、development は全て、production はパッチバージョンのみを自動マージする設定を記載しています。development や production は言語ごとのパッケージ管理に依存しています。JavaScript の場合は、devDependencies が development、dependencies が production に相当します。version_requirement_updates
マニフェストファイルをどのように更新するか指定します。これによって常に更新するか、ロックファイルのみ、必要な場合だけマニフェストファイルを更新したりと柔軟にアップデート戦略が選べます。今回は自動マージを有効にするため、
Account - Settings
からAllow auto-merging to be enabled on projects
にチェックを入れ、Update settings
から保存します。
また、CI がセットアップされていない場合は自動マージが有効にならないため設定が必要です。ダッシュボードに戻って
Bump now
を押してしばらく待つとPull Request
が作成されていることが分かります。さいごに
パッケージ管理というものは古くからありながら日々バージョンを更新していくというのは計画していても継続的に行っていくのは難しいものがあり、疎かにしていると後々の負債になりがちでした。
Dependabot を導入することで日々のアップデートに気づけるので随分と更新が楽になります。
GitHub では無料で使えるので是非導入してみてください。参考
Dependabot
Dependabot を導入してみた | DevelopersIO
Dependabot の設定ファイルを置くようにした - くりにっき
- 投稿日:2019-10-20T17:36:49+09:00
JavaScript / Node.js の変数スコープ
変数のスコープ
- 定義なし・・・グローバル
- var・・・関数レベル
- let・・・ブロックレベル
Node.jsのプレイグラウンドで実行してみてください。
food = 'banana'; //グローバル supermarket(); function supermarket() { var food = 'apple'; //関数レベル { let food = 'berry' //ブロックレベル console.log(`ブロックレベル: ${food}`); //berry } console.log(`関数レベル: ${food}`); //apple } console.log(`グローバル: ${food}`); //banana出力結果
ブロックレベル: berry 関数レベル: apple グローバル: banana
- 投稿日:2019-10-20T17:36:49+09:00
Node.jsのスコープ
変数のスコープ
- 定義なし・・・グローバル
- var・・・関数レベル
- let・・・ブロックレベル
food = 'banana'; //グローバル supermarket(); function supermarket() { var food = 'apple'; //関数レベル { let food = 'berry' //ブロックレベル console.log(`ブロックレベル: ${food}`); //berry } console.log(`関数レベル: ${food}`); //apple } console.log(`グローバル: ${food}`); //banana出力結果
ブロックレベル: berry 関数レベル: apple グローバル: banana
- 投稿日:2019-10-20T17:26:10+09:00
gulpでReferenceError: 〇〇 is not definedがでた
nodeのバージョン12とgulp3の相性が悪く、エラーを起こしてしまうらしい。
参考:How to fix ReferenceError: primordials is not defined in node
環境
mac
解決法
gulpのバージョンを上げる? or nodeのバージョンを下げる?
私の場合はgulp3を使いたかったので、nodeのバージョンを下げました。nを使ってnodeのバージョンを下げる
バージョンの下げ方はhomebrewを使う方法もあったのですが
nを使ったのが一番わかりやすかったです。
参考:Node.jsのバージョンを管理するライブラリ「n」npmを使ってnのインストール
# npm を使う方法 *環境によってはsudoを使って下さい npm install -g nnを使って切り替えたいnodeのバージョンを指定する
$ sudo n [切り替えたいバージョン]※macの場合はsudoが必要です。
私はnode v10.15.0をダンロードしました。なんとかエラー解決できましたとさ…。
- 投稿日:2019-10-20T15:26:25+09:00
Node.jsとDenoをそれぞれ検出する方法 with globalThis
UniversalなJavaScript/TypeScriptを書くなら、Node.jsとDenoそれぞれ双方で動くコードを書きたいものです。
おそらく時間はかかるけど、確実な方法は、
Deno
モジュールをNode.jsに移植するという力業でしょう。Node.jsやオンブラウザで動くDeno
互換モジュールさえあれば解決しそうです。ただ、それはさておいて、まずはNode.jsとDenoをそれぞれ判別するところから初めてみます。
if ("Deno" in globalThis) { console.log("Deno", globalThis.Deno.version.deno); globalThis.Deno.exit(0); } if ("process" in globalThis) { console.log("Node", globalThis.process.versions.node); globalThis.process.exit(0); } console.log("unknown environments");このコードをDenoで動かすと
$ deno hoge.ts Deno 0.21.0のように、
Deno 0.21.0
というバージョン情報を取得できます。$ node hoge.ts Node 12.6.0Node.jsの方ではTypeScriptではなくJavaScriptとして実行してますが気にしないでください。
ひとまず、
globalThis
といういささか気持ち悪いグローバルオブジェクトに、Deno
が定義されていればDeno環境で、process
が定義されていればNode.jsだと判定して良いと思います。本当は
globalThis.process.versions.node
まで見た方が確実ではあります。判別したあとは、型定義があれば
Deno.version
やprocess.versions
のように、直接それぞれのグローバルオブジェクトを触っても安全ですが、TypeScriptで、@types/node
とdeno.d.ts
を共存させるのは面倒なので、ここではglobalThis
経由で触っています。
- 投稿日:2019-10-20T11:09:47+09:00
老眼と加齢性難聴のチェックができるLINEbotとIotの作成
概要
プログラムの勉強を始めて3か月程の開業医です。最近ディスプレイを見る時間が長くなったせいか、年齢のせいか、近くの文字が見えにくくなってきました。
リーディンググラス(老眼鏡)について調べていると、人差し指の指紋が一番鮮明に見える距離(近点)が30cm以上離れると老眼鏡が必要で、近点の長さによってピント調節力が年齢相応かどうかや老眼度数もある程度わかるようです。
今回、近点距離(人差し指の指紋が見える距離)を入力すると、ピント調節力がどの年齢相当か?老眼かどうか?老眼度数はどの程度か?がわかるLINE botを作成してみようと思いました。
同時にobnizでIotを作る勉強を始めたので、老眼判定LINE botと連携させて、判断された年齢でぎりぎり聴きとることができる高音(モスキート音)をスピーカーから出し、自分の可聴周波数がわかる加齢性難聴判定Iotを作成しました。
※老眼や加齢性難聴の診断を行う為には医療機関での検査が必要です。今回の記事の医療情報に関しては参考程度にして頂きたいと思います。
実装内容
・LINE上に近点距離を入力すると老眼かどうか返答されるFAQBOT。
・返答と同時にその年齢でぎりぎり聞きとることができる高音(モスキート音)を出すIot。概念図
node.js expressでLINE bot APIとobnizを連携しました。
作成方法
前回はGoogle Spread Sheet × Google Apps Script × LINE の組み合わせでLINE botを作成しました。
保育園・小中学校での感染症流行状況がわかる Line Botの作成今回はこちらの記事を参考にnode.js express × LINE bot API × obnizの組み合わせでLINE botとIotを作成しました。
1時間でLINE BOTを作るハンズオン (資料+レポート) in Node学園祭20171. Botアカウントを作成する
2. Node.jsでBot開発
3. ngrokでトンネリング
上記の1~3を参考記事の通りに行います。初めての方でも1~2時間ほどで質問をオウム返しされるLINE botを作ることができます。
4.obnizとの連携
ここから先は、参考記事に掲載されている以下のコードに変更を加えていきます。
'use strict'; const express = require('express'); const line = require('@line/bot-sdk'); const PORT = process.env.PORT || 3000; const config = { channelSecret: '作成したBOTのチャンネルシークレット', channelAccessToken: '作成したBOTのチャンネルアクセストークン' }; //////////////////////////////////////////////////////////////// ここにコードAをコピペしてください //////////////////////////////////////////////////////////////// const app = express(); app.get('/', (req, res) => res.send('Hello LINE BOT!(GET)')); //ブラウザ確認用(無くても問題ない) app.post('/webhook', line.middleware(config), (req, res) => { console.log(req.body.events); //ここのif分はdeveloper consoleの"接続確認"用なので削除して問題ないです。 if(req.body.events[0].replyToken === '00000000000000000000000000000000' && req.body.events[1].replyToken === 'ffffffffffffffffffffffffffffffff'){ res.send('Hello LINE BOT!(POST)'); console.log('疎通確認用'); return; } Promise .all(req.body.events.map(handleEvent)) .then((result) => res.json(result)); }); const client = new line.Client(config); function handleEvent(event) { if (event.type !== 'message' || event.message.type !== 'text') { return Promise.resolve(null); } ///////////////////////////////////////////////////////////////// ここにコードBをコピペしてください。 ///////////////////////////////////////////////////////////////// return client.replyMessage(event.replyToken, { type: 'text', text: event.message.text //実際に返信の言葉を入れる箇所 }); } app.listen(PORT); console.log(`Server running at ${PORT}`);コードA
このコードをコピペすることでobnizが準備され、接続したスピーカーが使えるようになります。// コードA // Obnizの準備 var Obniz = require("obniz"); var obniz = new Obniz("Obniz ID"); // Obniz ID を入力 var speaker; // 全体で使えるようにするスコープ obniz.onconnect = async function () { speaker = obniz.wired("Speaker", {signal:0, gnd:1}); }コードB
このコードをコピペすることで近点距離によってLINE botからの回答を変え、スピーカーから出る音の周波数も変えます。//コードB // LINE botのプログラム let ans = ""; let question = event.message.text; let distance = parseInt(question); let hz;//モスキート音のhz if (distance>=80) { ans = "ピント調整力は61歳以上相当です。老眼の可能性が高いです。老眼度数は3以上と思われます。今流れているモスキート音は8000Hzです。"; hz = 8000; }else if (distance >= 60){ ans = "ピント調整力は56~60歳相当です。老眼の可能性が高いです。老眼度数は2.5程度と思われます。今流れているモスキート音は8000Hzです。"; hz = 8000; }else if (distance >= 50){ ans = "ピント調整力は51~55歳相当です。老眼の可能性が高いです。老眼度数は2程度と思われます。今流れているモスキート音は10000Hzです。"; hz = 10000; }else if(distance >= 40){ ans = "ピント調整力は46~50歳相当です。老眼の可能性が高いです。老眼度数は1.5程度と思われます。今流れているモスキート音は12000Hzです。"; hz = 12000; }else if(distance >= 30){ ans = "ピント調整力は41~45歳相当です。老眼の可能性が高いです。老眼度数は1程度と思われます。今流れているモスキート音は15000Hzです。"; hz = 15000; } else if(distance<30) { ans = "ピント調整力は40歳未満相当です。老眼の可能性は低いです。今流れているモスキート音は16000Hzです。"; hz = 16000; }else { ans = "指先にピントが合い、人差し指の指紋がはっきりと見えた距離を数字で入力してください。"; } speaker.play(hz);最後に textの部分をansに変更して完了です。
return client.replyMessage(event.replyToken, { type: 'text', text: ans });動作確認
— 病気のセルフチェック (@Selfcheckhealt1) 2019年10月20日
考察
今回node.jsでLINE botを作成しました。前回のGoogle Spread Sheet × Google Apps Script × LINE の組み合わせに比べるとやや面倒なところはありますが、他のAPIと連携しやすいので応用が利きやすいと感じました。
また、初めてのobnizでしたが、スピーカーはピンを入れるだけで使えるので作成は驚くほど簡単でした。今度は超音波センサーを使って近点距離を自動で取得できるようにしたいと思いました。
ちなみに私は老眼は大丈夫そうでしたが、15000Hz以上の音は耳をスピーカーに近づかないと聞こえませんでした。
- 投稿日:2019-10-20T11:09:47+09:00
老眼と加齢性難聴のチェックができるLINE Bot×Iotの作成
概要
プログラムの勉強を始めて3か月程の開業医です。最近ディスプレイを見る時間が長くなったせいか、年齢のせいか、近くの文字が見えにくくなってきました。
リーディンググラス(老眼鏡)について調べていると、人差し指の指紋が一番鮮明に見える距離(近点)が30cm以上離れると老眼鏡が必要で、近点の長さによってピント調節力が年齢相応かどうかや老眼度数もある程度わかるようです。
今回、近点距離(人差し指の指紋が見える距離)を入力すると、ピント調節力がどの年齢相当か?老眼かどうか?老眼度数はどの程度か?がわかるLINE botを作成してみようと思いました。
同時にobnizでIotを作る勉強を始めたので、老眼判定LINE botと連携させて、判断された年齢でぎりぎり聴きとることができる高音(モスキート音)をスピーカーから出し、自分の可聴周波数がわかる加齢性難聴判定Iotを作成しました。
※老眼や加齢性難聴の診断を行う為には医療機関での検査が必要です。今回の記事の医療情報に関しては参考程度にして頂きたいと思います。
実装内容
・LINE上に近点距離を入力すると老眼かどうか返答されるFAQBOT。
・返答と同時にその年齢でぎりぎり聞きとることができる高音(モスキート音)を出すIot。概念図
node.js expressでLINE bot APIとobnizを連携しました。
作成方法
前回はGoogle Spread Sheet × Google Apps Script × LINE の組み合わせでLINE botを作成しました。
保育園・小中学校での感染症流行状況がわかる Line Botの作成今回はこちらの記事を参考にnode.js express × LINE bot API × obnizの組み合わせでLINE botとIotを作成しました。
1時間でLINE BOTを作るハンズオン (資料+レポート) in Node学園祭20171. Botアカウントを作成する
2. Node.jsでBot開発
3. ngrokでトンネリング
上記の1~3を参考記事の通りに行います。初めての方でも1~2時間ほどで質問をオウム返しされるLINE botを作ることができます。
4.obnizとの連携
ここから先は、参考記事に掲載されている以下のコードに変更を加えていきます。
'use strict'; const express = require('express'); const line = require('@line/bot-sdk'); const PORT = process.env.PORT || 3000; const config = { channelSecret: '作成したBOTのチャンネルシークレット', channelAccessToken: '作成したBOTのチャンネルアクセストークン' }; //////////////////////////////////////////////////////////////// ここにコードAをコピペしてください //////////////////////////////////////////////////////////////// const app = express(); app.get('/', (req, res) => res.send('Hello LINE BOT!(GET)')); //ブラウザ確認用(無くても問題ない) app.post('/webhook', line.middleware(config), (req, res) => { console.log(req.body.events); //ここのif分はdeveloper consoleの"接続確認"用なので削除して問題ないです。 if(req.body.events[0].replyToken === '00000000000000000000000000000000' && req.body.events[1].replyToken === 'ffffffffffffffffffffffffffffffff'){ res.send('Hello LINE BOT!(POST)'); console.log('疎通確認用'); return; } Promise .all(req.body.events.map(handleEvent)) .then((result) => res.json(result)); }); const client = new line.Client(config); function handleEvent(event) { if (event.type !== 'message' || event.message.type !== 'text') { return Promise.resolve(null); } ///////////////////////////////////////////////////////////////// ここにコードBをコピペしてください。 ///////////////////////////////////////////////////////////////// return client.replyMessage(event.replyToken, { type: 'text', text: event.message.text //実際に返信の言葉を入れる箇所 }); } app.listen(PORT); console.log(`Server running at ${PORT}`);コードA
このコードをコピペすることでobnizが準備され、接続したスピーカーが使えるようになります。// コードA // Obnizの準備 var Obniz = require("obniz"); var obniz = new Obniz("Obniz ID"); // Obniz ID を入力 var speaker; // 全体で使えるようにするスコープ obniz.onconnect = async function () { speaker = obniz.wired("Speaker", {signal:0, gnd:1}); }コードB
このコードをコピペすることで近点距離によってLINE botからの回答を変え、スピーカーから出る音の周波数も変えます。//コードB // LINE botのプログラム let ans = ""; let question = event.message.text; let distance = parseInt(question); let hz;//モスキート音のhz if (distance>=80) { ans = "ピント調整力は61歳以上相当です。老眼の可能性が高いです。老眼度数は3以上と思われます。今流れているモスキート音は8000Hzです。"; hz = 8000; }else if (distance >= 60){ ans = "ピント調整力は56~60歳相当です。老眼の可能性が高いです。老眼度数は2.5程度と思われます。今流れているモスキート音は8000Hzです。"; hz = 8000; }else if (distance >= 50){ ans = "ピント調整力は51~55歳相当です。老眼の可能性が高いです。老眼度数は2程度と思われます。今流れているモスキート音は10000Hzです。"; hz = 10000; }else if(distance >= 40){ ans = "ピント調整力は46~50歳相当です。老眼の可能性が高いです。老眼度数は1.5程度と思われます。今流れているモスキート音は12000Hzです。"; hz = 12000; }else if(distance >= 30){ ans = "ピント調整力は41~45歳相当です。老眼の可能性が高いです。老眼度数は1程度と思われます。今流れているモスキート音は15000Hzです。"; hz = 15000; } else if(distance<30) { ans = "ピント調整力は40歳未満相当です。老眼の可能性は低いです。今流れているモスキート音は16000Hzです。"; hz = 16000; }else { ans = "指先にピントが合い、人差し指の指紋がはっきりと見えた距離を数字で入力してください。"; } speaker.play(hz);最後に textの部分をansに変更して完了です。
return client.replyMessage(event.replyToken, { type: 'text', text: ans });動作確認
— 病気のセルフチェック (@Selfcheckhealt1) 2019年10月20日
考察
今回node.jsでLINE botを作成しました。前回のGoogle Spread Sheet × Google Apps Script × LINE の組み合わせに比べるとやや面倒なところはありますが、他のAPIと連携しやすいので応用が利きやすいと感じました。
また、初めてのobnizでしたが、スピーカーはピンを入れるだけで使えるので作成は驚くほど簡単でした。今度は超音波センサーを使って近点距離を自動で取得できるようにしたいと思いました。
ちなみに私は老眼は大丈夫そうでしたが、15000Hz以上の音は耳をスピーカーに近づかないと聞こえませんでした。
- 投稿日:2019-10-20T00:06:00+09:00
node.js のreadFileでline number付き出力 (個人的メモ)
node.jsでファイルを読み込むには、
以下のように3行書けばいい。stringで、ファイルの中身を取得出来る。
toString()を使って、bufferを文字列に変換するのがミソ!const fileContent = require('fs') .readFileSync('README.md') .toString() console.log(fileContent)しかし、line number付きで、ファイルの中身を標準では取得出来ない。
line numberをつけるには、以下のようにプログラミングをしてあげる必要がある。
const fileContent = require('fs') .readFileSync('README.md') .toString() .split('\n') .map((text, index) => `${index}` + text) .join('\n') console.log(fileContent)今度は、配列に変換してから、文頭に数字を入れているだけ
完!