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

【Node.js】e-Statを使った処理を考える

はじめに

Node.jsの練習中です。空き時間をなんとか捻出して、少しでも何か作れないかと苦心しています。

今回の目的

REST APIを使って色々なデータを取得してみたいと考えています。
様々なプラットフォームからデータを得る⇨多種多様なデータ種が自分のプラットフォームに集まる⇨集まったデータを使っていろんな新しい価値に繋げる
こんな妄想をしています。

その練習として政府統計の総合窓口 e-Statから統計データを取得する実装してみます。
何か面白そうなAPIはないかと以下の記事を探して、今回のAPIを見つけました。
個人でも使える!おすすめAPI一覧

実装内容

早速ですが、以下のような実装をNode.jsで行いました。
今回は実装内容について記述をしたく、APIの仕様についてはかなり割愛します。(というかまだ勉強中)

getInfo.js
var 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-parser

xmlOptionを指定し、parseを実行することでJSONオブジェクトに変換され取得することができます。
あとはこれを

jsonData.GET_STATS_DATA.STATISTICAL_DATA.DATA_INF.VALUE

のようにアトリビュートをしてして値を取得していきます。

これを使ってやりたいこと

取得した統計情報を統計解析して相関を定量的に評価することで意外と面白い関係が見出せるのでは?なんて思っています。Simple Staticsという解析モジュールがNode.jsにはあるようなので、これが使えるのではないかと企んでます。とはいえ、時間がない・・・なんとか時間を捻出し次のステップを踏めればと思います。

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

Dependabot で依存パッケージをアップデートする

はじめに

昨今のアプリケーション開発では、依存するライブラリの機能追加やセキュリティのアップデートに追従することが求められます。
また、しばしば導入したライブラリは導入時点のバージョンのまま利用され、アップデートされないことがありますがそれは後々の負債になりがちです。
しかし、日々アップデートを検知して更新していくのは辛いものがあります。
そこで Dependabot の登場です。

Dependabot とは

Dependabot は Gemfile や package.json など、言語が持つパッケージ管理のマニフェストファイルを見て古かったり、安全ではないライブラリを発見してくれます。発見した依存関係を元に Pull Request を作成して通知してくれるツールです。設定によっては CI を通過したら自動でマージすることもできます。
Dependabot は、GitHub に買収されたことでプライベートリポジトリでも無料で利用できます。

現在は以下の言語に対応しています。Ruby や JavaScript といった言語を始め、Docker や Terraform などにも対応しています。

Dependabot のサポート言語

Dependabot の導入

早速インストールしていきます。
GitHub の Marketplace から Dependabot Preview を開きます。

Dependabot のページ

画面下に遷移して Install it for free からインストールします。

Dependabot のインストール

Complete order and begin installation から続行します。ここでアカウントのパスワードが求められた場合はパスワードを入力して続行します。

Dependabot のインストールを始める

全リポジトリ、または特定のリポジトリに権限を付与するかを選び、Install を押して続行します。

Dependabot の権限

次に Dependabot に GitHub アカウントでログインします。

Dependabot へのログイン

Dependabot から GitHub へのアクセスを許可します。

Dependabot と GitHub の認可

これで Dependabot のダッシュボードまで接続が完了しました。

Dependabot のダッシュボード

Dependabot の設定

続いて設定するリポジトリを追加します。Select repos to add または Add repos から追加します。
ここでは GitHub から権限を付与したリポジトリが表示されます。
追加したいリポジトリにチェックを入れ、Add selected で追加します。

リポジトリ追加

追加するとダッシュボードに追加されていることが分かります。

リポジトリを追加したダッシュボード

歯車のアイコンから設定を開くといくつかの設定が可能です。この画面からでも設定可能ですが、ここでは別リポジトリを作成した際にも使いまわせるように、設定ファイルを用いて設定していきます。

リポジトリの設定

リポジトリの .dependabot/config.yml のパスに以下のような設定ファイルを作成します。
今回は設定ファイルとして必要そうなものを設定していきますが、他にもいくつかの設定があるため詳細はドキュメントを参照してください。

.dependabot/config.yml
version: 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 を作成するタイミングを指定します。
    dailyweekly を指定する場合は実行日や時間を指定できます。

  • 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 がセットアップされていない場合は自動マージが有効にならないため設定が必要です。

Dependabot のアカウント設定

ダッシュボードに戻って Bump now を押してしばらく待つと Pull Request が作成されていることが分かります。

Pull Request 画面

さいごに

パッケージ管理というものは古くからありながら日々バージョンを更新していくというのは計画していても継続的に行っていくのは難しいものがあり、疎かにしていると後々の負債になりがちでした。
Dependabot を導入することで日々のアップデートに気づけるので随分と更新が楽になります。
GitHub では無料で使えるので是非導入してみてください。

参考

Dependabot
Dependabot を導入してみた | DevelopersIO
Dependabot の設定ファイルを置くようにした - くりにっき

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

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
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

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
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

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 n

nを使って切り替えたいnodeのバージョンを指定する

$ sudo n [切り替えたいバージョン] 

※macの場合はsudoが必要です。
私はnode v10.15.0をダンロードしました。

なんとかエラー解決できましたとさ…。

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

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.0

Node.jsの方ではTypeScriptではなくJavaScriptとして実行してますが気にしないでください。

ひとまず、globalThisといういささか気持ち悪いグローバルオブジェクトに、Denoが定義されていればDeno環境で、processが定義されていればNode.jsだと判定して良いと思います。

本当はglobalThis.process.versions.nodeまで見た方が確実ではあります。

判別したあとは、型定義があればDeno.versionprocess.versionsのように、直接それぞれのグローバルオブジェクトを触っても安全ですが、TypeScriptで、@types/nodedeno.d.tsを共存させるのは面倒なので、ここではglobalThis経由で触っています。

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

老眼と加齢性難聴のチェックができるLINEbotとIotの作成

概要

プログラムの勉強を始めて3か月程の開業医です。最近ディスプレイを見る時間が長くなったせいか、年齢のせいか、近くの文字が見えにくくなってきました。

リーディンググラス(老眼鏡)について調べていると、人差し指の指紋が一番鮮明に見える距離(近点)が30cm以上離れると老眼鏡が必要で、近点の長さによってピント調節力が年齢相応かどうかや老眼度数もある程度わかるようです。

参考サイト1  参考サイト2

今回、近点距離(人差し指の指紋が見える距離)を入力すると、ピント調節力がどの年齢相当か?老眼かどうか?老眼度数はどの程度か?がわかるLINE botを作成してみようと思いました。

同時にobnizでIotを作る勉強を始めたので、老眼判定LINE botと連携させて、判断された年齢でぎりぎり聴きとることができる高音(モスキート音)をスピーカーから出し、自分の可聴周波数がわかる加齢性難聴判定Iotを作成しました。

※老眼や加齢性難聴の診断を行う為には医療機関での検査が必要です。今回の記事の医療情報に関しては参考程度にして頂きたいと思います。

実装内容

・LINE上に近点距離を入力すると老眼かどうか返答されるFAQBOT。
・返答と同時にその年齢でぎりぎり聞きとることができる高音(モスキート音)を出すIot。

概念図

node.js expressでLINE bot APIとobnizを連携しました。
rougann.jpg

作成方法

前回は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学園祭2017

1. 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
  });

動作確認

ちゃんと返信されています。
IMG-0708.PNG
IMG-0709.PNG
音もちゃんと出ていました。


考察

今回node.jsでLINE botを作成しました。前回のGoogle Spread Sheet × Google Apps Script × LINE の組み合わせに比べるとやや面倒なところはありますが、他のAPIと連携しやすいので応用が利きやすいと感じました。
また、初めてのobnizでしたが、スピーカーはピンを入れるだけで使えるので作成は驚くほど簡単でした。今度は超音波センサーを使って近点距離を自動で取得できるようにしたいと思いました。
ちなみに私は老眼は大丈夫そうでしたが、15000Hz以上の音は耳をスピーカーに近づかないと聞こえませんでした。

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

老眼と加齢性難聴のチェックができるLINE Bot×Iotの作成

概要

プログラムの勉強を始めて3か月程の開業医です。最近ディスプレイを見る時間が長くなったせいか、年齢のせいか、近くの文字が見えにくくなってきました。

リーディンググラス(老眼鏡)について調べていると、人差し指の指紋が一番鮮明に見える距離(近点)が30cm以上離れると老眼鏡が必要で、近点の長さによってピント調節力が年齢相応かどうかや老眼度数もある程度わかるようです。

参考サイト1  参考サイト2

今回、近点距離(人差し指の指紋が見える距離)を入力すると、ピント調節力がどの年齢相当か?老眼かどうか?老眼度数はどの程度か?がわかるLINE botを作成してみようと思いました。

同時にobnizでIotを作る勉強を始めたので、老眼判定LINE botと連携させて、判断された年齢でぎりぎり聴きとることができる高音(モスキート音)をスピーカーから出し、自分の可聴周波数がわかる加齢性難聴判定Iotを作成しました。

※老眼や加齢性難聴の診断を行う為には医療機関での検査が必要です。今回の記事の医療情報に関しては参考程度にして頂きたいと思います。

実装内容

・LINE上に近点距離を入力すると老眼かどうか返答されるFAQBOT。
・返答と同時にその年齢でぎりぎり聞きとることができる高音(モスキート音)を出すIot。

概念図

node.js expressでLINE bot APIとobnizを連携しました。
rougann.jpg

作成方法

前回は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学園祭2017

1. 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
  });

動作確認

ちゃんと返信されています。
IMG-0708.PNG
IMG-0709.PNG
音もちゃんと出ていました。


考察

今回node.jsでLINE botを作成しました。前回のGoogle Spread Sheet × Google Apps Script × LINE の組み合わせに比べるとやや面倒なところはありますが、他のAPIと連携しやすいので応用が利きやすいと感じました。
また、初めてのobnizでしたが、スピーカーはピンを入れるだけで使えるので作成は驚くほど簡単でした。今度は超音波センサーを使って近点距離を自動で取得できるようにしたいと思いました。
ちなみに私は老眼は大丈夫そうでしたが、15000Hz以上の音は耳をスピーカーに近づかないと聞こえませんでした。

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

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)

今度は、配列に変換してから、文頭に数字を入れているだけ

完!

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