- 投稿日:2020-11-22T20:16:53+09:00
Node.js バージョン管理nodenvを使ってみる
nodeのバージョン管理についてnというものを使ってみたが、
今回CentOs環境で別のnodenvを使ってみることにしました。バージョン管理には他にも、
nodebrewがありますが、nodenvだとディレクトリごとにバージョンが変更できるみたいです
※ ついでに、win機はNodistというのがあるみたいですanyenv インストール
「anyenv」というツールを用いてインストールします
[vagrant@vagrant ~]$ git clone https://github.com/riywo/anyenv ~/.anyenvパスを通して設定します
[vagrant@vagrant ~]$ echo 'export PATH="$HOME/.anyenv/bin:$PATH"' >> ~/.bash_profile [vagrant@vagrant ~]$ echo 'eval "$(anyenv init -)"' >> ~/.bash_profile [vagrant@vagrant ~]$ exec $SHELL -lこちらを実行すると以下のようにでました。
ANYENV_DEFINITION_ROOT(/home/vagrant/.config/anyenv/anyenv-install) doesn't exist. You can initialize it by: > anyenv install --init指示通り初期をおこないます
anyenv install --initnodenv インストール
anyenvを使用し、nodenvをインストールします
anyenv install nodenv exec $SHELL -l以下のコマンドを実行できたら成功です
nodenvバージョンを切り替え
欲しいnode.jsのバージョンを以下のコマンドでインストールします
nodenv install 12.19.0切り替えます
nodenv local 12.19.0参考URL
https://qiita.com/tonkotsuboy_com/items/5322d226b6783d25b5df
- 投稿日:2020-11-22T19:05:17+09:00
nodeのコマンドプロントのconsole.logで出力に色を付ける
はじめに
Nodeでコマンドプロンプトの出力(console.log)に色をつけたかったので、その方法を投稿します。
検索してもwebブラウザのconsoleに色を付ける方法が多くヒットしたので、私と同じように困っている人の助けになれば…(こんなことで困ってないか)。
結論
色を付けるnpm がありました!!
chalknpm i chalk前提条件
環境
- node
v10.16.3
- npm
6.9.0
使用例
ざっくりと使用例と出力結果を投稿します。
全ての例を投稿するわけではないので詳しく見たい方はchalkのページで確認してください。色を変える
色を変えたい文字列を、変えたい色の修飾子で囲う
※変えられる色の種類はchalkのページで確認してください。index.jsconst Chalk = require('chalk') const log = console.log; //文字の色変更 log(Chalk.red('Hello') + ' World' + Chalk.red('!')); log(Chalk.blue('Hello Blue world!')); log(Chalk.green('Hello Green world!')); log(Chalk.yellow('Hello Yellow world!'));背景色を変える
色を変えるのとほぼ変わらない。
index.jsconst Chalk = require('chalk') const log = console.log; //文字の背景色変更 log(Chalk.bgRed('Hello') + ' World' + Chalk.bgRed('!')); log(Chalk.bgBlue('Hello Blue world!')); log(Chalk.bgGreen('Hello Green world!')); log(Chalk.bgYellow('Hello Green world!'));文字のスタイルを変える
スタイルを変更したい文字列に対して、スタイルの修飾子で囲う
index.jsconst Chalk = require('chalk') const log = console.log; //文字のスタイル変更 log(Chalk.underline('Hello UnderLine world!')); log(Chalk.bold('Hello Bold world!'));文字のスタイルと色を変える
スタイルと色の修飾子を
.
でつなぐindex.jsconst Chalk = require('chalk') const log = console.log; //スタイルと文字の色を変える log(Chalk.green( 'I am a green line ' + Chalk.blue.underline.bold('with a blue substring') + ' that becomes green again!' ));おまけ 公式ページ使用例の出力結果
参考として、公式ページにある使用例の出力結果を載せておきます。
index.jsconst chalk = require('chalk'); const log = console.log; // Combine styled and normal strings log(chalk.blue('Hello') + ' World' + chalk.red('!')); // Compose multiple styles using the chainable API log(chalk.blue.bgRed.bold('Hello world!')); // Pass in multiple arguments log(chalk.blue('Hello', 'World!', 'Foo', 'bar', 'biz', 'baz')); // Nest styles log(chalk.red('Hello', chalk.underline.bgBlue('world') + '!')); // Nest styles of the same type even (color, underline, background) log(chalk.green( 'I am a green line ' + chalk.blue.underline.bold('with a blue substring') + ' that becomes green again!' )); // ES2015 template literal log(` CPU: ${chalk.red('90%')} RAM: ${chalk.green('40%')} DISK: ${chalk.yellow('70%')} `); // Use RGB colors in terminal emulators that support it. log(chalk.keyword('orange')('Yay for orange colored text!')); log(chalk.rgb(123, 45, 67).underline('Underlined reddish color')); log(chalk.hex('#DEADED').bold('Bold gray!'));
- 投稿日:2020-11-22T18:12:34+09:00
M1 MacbookでNode.js環境構築
初macOSで操作方法すら良くわからない中、Apple Silicon(M1)搭載ということでNode.js環境の構築に一工夫が必要でした。M1対応するまではRosettaで回避するのが無難そう。homebrewもこれでインストールできました。
TerminalをRosettaで開く
Finder -> 移動 -> ユーティリティ
Rosettaを使用して開くにチェックして、Terminalを起動。
nvmをインストールする
https://github.com/nvm-sh/nvm#installing-and-updating
curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.37.0/install.sh | bash一旦Terminalを終了して、再起動。
なぜか以下のようなwarningが出始めるが、落ち着いてググって解決する。#homebrewも同時にインストールしたからかな?
zsh compinit: insecure directories, run compaudit for list. Ignore insecure directories and continue [y] or abort compinit [n]?Node.jsをインストール
nvm i v14.15.1% npm -v 6.14.8 % node -v v14.15.1めでたし、めでたし
以上
- 投稿日:2020-11-22T16:40:05+09:00
最近朝起きると喉がカラカラになっているので、いい感じの湿度を保つ加湿器コントローラーを2時間で作る
朝起きると喉が痛い
最近、冬になって空気が乾燥してきていますね。
夜寝るときは気にならないのですが、朝起きると口から鼻から粘膜が乾燥してしまいます。我が家にも超音波式の加湿器があるのですが、つまみで噴出量を調整するタイプのもので、
- 量が少ないと加湿しきれず、朝喉がカラカラになり、
- 量が多すぎると加湿は良いが、床がびちょびちょになり、
ちょうどつまみの回し具合を探し当てるのが大変です。
本記事では、加湿器の電源を自動でON/OFFさせることで、いい感じの湿度にしてくれるコントローラーを実働2時間で作成していきます。
(※材料は前もって用意しておいてください)睡眠時の適切な湿度は50%~60%
布団の西川さんによると、寝室の湿度は50%~60%が丁度良いみたいです[1]。
今回はこの範囲を狙っていきましょう。動作イメージ
ちょっと見えにくいけど動くようになった pic.twitter.com/y6jnFNpDqz
— Takahiro Mitsuoka (@tmitsuoka0423) November 19, 2020用意する材料
HS105のエラー解決しなそうなので、赤外線でコントロールできるコンセントOCR-05Wに変更#朝活 pic.twitter.com/hpvGVPc1nC
— Takahiro Mitsuoka (@tmitsuoka0423) November 19, 2020
- obniz Board
- IoTプロトタイピングボード。JavaScriptで動くのでWebアプリエンジニアにも優しい。
- 6000円くらい
- 公式で購入:https://obniz.com/ja/products/obnizboard/
- 温湿度センサー SHT31
- 湿度が測定できれば何でもOK。
- 1000円くらい
- 秋月で購入:https://akizukidenshi.com/catalog/g/gK-12125/
- リモコンコンセント OCR-05W
- 赤外線リモコンでON/OFFできるコンセント
- 2000円くらい
- Amazonで購入:https://www.amazon.co.jp/dp/B01ABMGGQ8
- 赤外線LED
- 何でもOK
- 100円くらい
- 秋月で購入:https://akizukidenshi.com/catalog/g/gI-03261/
- 抵抗
- 5Ωのもの
- セットで100円くらい
- 秋月で買えます(ページ見つからなかった)
- 加湿器
- 電源をつけたり消したりしても継続して動くもの
- ホームセンターで購入
- その他あると良いもの
- ブレッドボード
- オスオスのピン or ジャンパワイヤ
加湿器コントローラーを作っていく
obnizと湿度センサー&赤外線LEDを接続する
こんな感じで、”obnizの0番ピン”と”SHT31のV+”がつながるようにブレッドボードにさす pic.twitter.com/9kO4jqUFn1
— Takahiro Mitsuoka (@tmitsuoka0423) November 13, 2020ブレッドボードには赤外線LEDと抵抗を追加。
— Takahiro Mitsuoka (@tmitsuoka0423) November 19, 2020
obnizの6番ピンと11番ピンに接続。#朝活 #obniz pic.twitter.com/Pka7gwQa0Iプログラムを書く
基本動作としては、湿度を取ってきて、赤外線LEDから信号を送るだけのシンプルなプログラムです。
1分間隔で動作するようにループさせています。
(追記:@il9437さんのアドバイスにより改良。ありがとうございます。)const Obniz = require('obniz'); const { on, off } = require('./signal'); const callback = async () => { const obniz = new Obniz(process.env.OBNIZ_ID); obniz.connect(); // obnizに接続 await obniz.connectWait(); const sensor = obniz.wired("SHT31", { vcc: 0, sda: 1, scl: 2, adr: 3, gnd: 4, addressmode: 5 }); const irLed = obniz.wired('InfraredLED', { anode: 6, cathode: 11 }); const { temperature, humidity } = await sensor.getAllWait(); console.log(new Date(), temperature, humidity); if (humidity < 50) { // 湿度に応じてOCR-05WをON/OFF irLed.send(on); } else if (humidity > 60) { irLed.send(off); } obniz.close(); // 繰り返し実行するので1回毎に切断する }; setInterval(callback, process.env.INTERVAL || 60 * 1000); // 1分毎に実行するソースコードはGitHubにアップしています。
https://github.com/tmitsuoka0423/obniz-auto-humidifierSHT31を使用して、上記の写真通りピンを接続すれば、そのまま使えるはずです。
ピンの位置を変える場合は、プログラムを修正してください。実行する
以下のコマンドで動作します。
OBNIZ_ID
は、obniz Boardの画面に表示されている4桁-4桁の数字を入れてください。$ npx cross-env OBNIZ_ID=xxxx-xxxx node index.js使ってみてわかったこと:ON/OFFさせる条件には幅を持たせた方が良い
さっそく動かしてみてるけど、数分おきに加湿器が動いたり止まったりして、めっちゃ気になる?
— Takahiro Mitsuoka (@tmitsuoka0423) November 19, 2020最初は、
if 湿度 < 55% → 加湿器ON
else → 加湿器OFF
で制御していたのですが、湿度が55%を行ったり来たりするたびに加湿器がON/OFFされ、気になり寝られず、すぐに以下の条件にプログラムを修正しました。
if 湿度 < 50% → 加湿器ON
else if 湿度 > 60% → 加湿器OFF
こうすることで、湿度が50%未満になったら加湿器がONになり60%を超えるまでOFFになりません。(逆も然り。)
気にならないレベルになりました。使ってみるって大事ですね。まとめ
実働2時間くらいで作りましたが、割と満足いくものができました。
寝てる間は加湿器を調整することはできないので、自動で制御させるのが良いですね。参考文献
- 投稿日:2020-11-22T15:27:04+09:00
Node.jsのバージョン管理で苦労したお話…
バージョンが上がった!さぁ更新しよう!
私maresukeはwebフロントが好きなのでよくJavaScript(React)を使った開発をするんですが、まぁパッケージ管理はnode.jsさんにお任せ!っていう感じなんですね〜
しかしあるときからやたらGitHubさんから警告がくるんですよね…!
もしかして垢BAN!かと思ったら、nodeのバージョンがあまりよろしくないものを使っているだけでした…!
nodeのバージョンって新しくなったり、安定版が変更されていたりしますが、僕いい子ちゃんじゃないからいつも更新を後回しにしちゃって〜気付いたら僕が使ってるバージョンは遥か昔江戸時代ぐらいのものになっているんです…
こら〜そこのあなた〜「このアンポンタンの頭はチンパンジーか」とか思っちゃダメですよ〜
しかし、このバージョン管理は非常に大事です!サービスの脆弱性につながってしまうので、nodeのバージョンはこまめにチェックしましょう!と前置きはこのくらいにして、早速に本題に入らなくては!
実際にバージョンアップしてみよう!
実際に僕が当時直面した時の手順でやっていきます。
今回は私がmacOSユーザーなので基本はmacOSベースに進めていきますが、Windowsも対応していきます。ただしWindowsはUbuntu上での環境構築を想定しています。もしこの記事のやり方でやろうと思われている方がいましたらUbuntuのインストールから行ってください。
Ubuntu公式にUbuntuのセットアップ手順など全て記載してあるので参照しみてください。今現在の状態を確認してみよう
そんなこんなで怒られるのは嫌だし、サービスが大変なことになるのも嫌なのでnodeのバージョンを変更することにしました。ちなみに今まで使っていたものは
v12.12.0
でした。もし僕と同じでnodeのバージョンで困っている方も確認してみてください。確認方法は…$ node -v # もしくは $ node --versionこちらのどちらかのコマンドを実行して貰えば今現在自分のローカル環境のnodeのバージョンが表示されます。
ちなみにnodeがインストールされていなければエラーが出てきます。では安定版をインストールします
今回は
anyenv
とnodenv
を用いてやっていきます。まだanyenv,nodenvが入っていなかった場合
まずは
anyenv
をインストールします。このanyenvはいろんな言語の開発環境をコマンドを二つ三つぐらい実行するだけでできてしまうという超便利なセットアップツールなんです。ぜひ入れましょう!
そしてanyenvを用いてnodenv
というnode.jsのバージョンを管理できるツールをインストールし、nodenvでバージョンを上げたり下げたりします。
ちなみに今回はすでにNode.jsが入っているという設定ですが、ここから読めばNode.jsが入っていない人もNoe.jsの環境構築を楽々できちゃいます。
- anyenvの設定
// macOS $ brew install anyenv // Windows $ git clone https://github.com/anyenv/anyenv ~/.anyenv $ echo 'export PATH="$HOME/.anyenv/bin:$PATH"' >> ~/.bashrc $~/.anyenv/bin/anyenv init以上のコマンド実行すると以下のようなコメントが出てきます
// macOS # Load anyenv automatically by adding # the following to ~/.zshrc: eval "$(anyenv init -)" // Windows # Load anyenv automatically by adding # the following to ~/.bash_profile: eval "$(anyenv init -)"どうやら
eval "$(anyenv init -)"
の一文を.zshrcに記述してくださいとのことですので記述します。
以下要注意事項
ちなみに2行目の最後の辺の~/.~rcの部分はお使いのshellによって異なります。zshならzsh、bashならbash、fishは確認ができてませんがおそらくfishと出ているでしょう…
以降~rcや~_profileのような表記があればその都度自身の使用しているshellに変更してお考えください!では記述して行きます!
// macOS vi ~/.zshrc // Windows vi ~/.bash_profileさっきの一文(
eval "$(anyenv init -)"
)を記述して:wq
で保存しましょう。
できましたら一度Shellを再起動して次に以下のコマンドを実行します。
おそらくsource .zshrc
でもいけるんじゃないかな〜とおもいます。// macOS echo 'eval "$(anyenv init -)"' >> ~/.zshrc exec $SHELL -l // Windows echo 'eval "$(anyenv init -)"' >> ~/.bashrc exec $SHELL -lこれで
anyenv
のインストールは完了です!
試しに$ anyenv -v // もしくは $ anyenv --versionを実行してください。きちんとインストールできていればインストールされたバージョンが表示されます。
さぁ〜ここまでやってきましたがやっと本番です!
Node.jsをいじりますよ〜
まずはNode.jsをインストール、アップデート、ダウングレードするためのnodenvをインストールしましょう!
- nodenvの設定
先ほどインストールした
anyenv
でnodenv
をインストールします。$ anyenv install nodenv実行がうまくいくとこうなります
// これより上は長ったらしい文章が出てきやがるので省略 Install nodenv succeeded! Please reload your profile (exec $SHELL -l) or open a new session.とまぁ再起動しいやと言われるので素直に従いましょう。
そしてお次は$ $ exec $SHELL -lを実行してみましょう!
特にエラーが出なかったらきちんとnodenv
がインストールされているはずです…
不安なので確認します$ nodenv -v // もしくは $ nodenv --versionsを実行します…
nodenv 1.4.0+3.631d0b6よかった〜ちゃんと入ってました〜
- Node.jsのインストール
さて、ここまでちょっと時間がかかってしまいましたが最終段階だ〜 node.jsのインストール及びアップグレード、ダウングレードは以降nodenv
を用いてぽちぽちするだけで終わります。やった〜これで今後楽にバージョン管理ができるぞ〜やっフォ〜い
え〜ごほん!お見苦しいところをお見せしました。 ではまずはNode.jsをインストールします。が、その前に今現在インストール可能なバージョンがなんなのかを確認しましょう。$ nodenv install listすると今現在インストール可能なnode.jsのバージョンが全て表示されます。
今回も実行結果を載せたいのですが実行結果が多すぎて載せると記事がとんでもないことになりそうなので割愛します。
- さぁてnode.jsの安定版をインストールしていきましょう!
今現在インストール可能で最新のnode.jsはv15.2.1
になります。しかしこれは未だ動作の安定が未確認もしくは改良途中、対応中のためお勧めはしません。動作安定版として一番お勧めされるのはv14.15.1
になります。 てなわけで今回(この記事の執筆時2020/11/22)は安定版のv14.15.1
をインストールしていきます。$ nodenv install 14.15.1これでインストールは完了!
あとはローカルに反映させれば終わりです!$ nodenv global 14.15.1よし!
ここまで全てが順調に終わってる!
俺って天才なのでは!
JS完全に理解した!
確認確認!$ node -v v12.12.0…
誰だ!貴様!
ふぇ〜
なんじゃこれ〜どないなことになってんねん!
僕なんも悪いことしてないんだぞ!
よくわからなかったけど調べていくうちにバージョンの更新がうまくいかない時によくある問題としてnodeのpathが悪さをしてる場合があるらしいのでnodeのpathがnodenvとつながっているかを確認しましょう。$ which nodeで調べれるらしい。
which
コマンドはpathを調べるコマンドなので今後何かしらpathを調べることがよくあると思うので覚えときましょう。
ほとんどの場合はつながっておらずuser/local/bin/node
になってることが多いそうです。調べてる間僕と同じこのようなpathになっている人がほとんどでした。
ということなのでこのpathを殲滅します!
くらえ!$ sudo rm -rf user/local/bin/node // 注意 rm -rf の利用は気をつけましょう問答無用で全てを消し去ります。取り返しがつかなくなる!危険!これで邪魔者はいなくなった!
$ node -v 14.15.1やった〜!
みたかv12.12.0
!
いや、失礼ですねちゃんとお礼を言わなくては!
今までありがとう12.12.0
!以上!これにて更新終了
すでにnodenvがある方
こちらの方は凄〜〜〜〜く簡単です!
なぜならこうです。$ nodenv install 14.15.1 $ nodenv global 14.15.1終わり…
つまり、更新したいバージョンをインストールし、それを反映させるだけなのでコマンドとしては二つで終わりでダス。
もし問題があった場合はやはりpathの問題が多いみたいです。
なので焦らず急がずpathを治してあげて終了です。そういえば…
なんで今回はnodenvを使ったの?
調べるとnodebrewってのもあるよね?
こんな質問が飛んできそうですね〜
実は僕も詳しくはよくわかっていはいないんですが、はっきりと言えるのはNode.jsのバージョン管理が一番楽!ということです。
本来Node.jsのバージョン管理はディレクトリ(サービス)ごとというのが暗黙の了解というか、当たり前なのです。したがってhogeというディレクトリではv1を使ってるがfugaというディレクトリではv2を使う、このようなことが頻繁に起きます。その場合nodebrew
ではいちいちコマンドを実行してnodeのバージョンを切り替えなくてはなりません。しかしnodenv
さんはすごくてですね〜ディレクトリを移動しただけで自動的にバージョンを変更してくれるんですよ〜すごくないですか⁉︎多分調べればもっと出てくるんでしょうが、僕はこの程度のことしか知らないので許してください。どうでした?
web大好きマンならこのくらい当たり前かもしれませんが、意外とバージョン管理でてこずる人って多いと思うんですよ〜
なので今回の僕の経験が誰かの役に立ってくれればと…
- 投稿日:2020-11-22T15:02:30+09:00
誰が使うかわからないけど、膝のレントゲン写真を送ったら、その膝がどの程度膝が痛んでいるか教えてくれるラインbotを作ってみた。
はじめに
突然ですが、最近、膝痛くないですか?
階段降りる時や立ち上がる時など、特に痛くないですか??
気づいたら、足がO脚になっていないですか???もしかしたらそれ、変形性膝関節症かもしれません。
*「変形性膝関節症って何?」という方は、僕が書いたこちらの記事をぜひお読みください。
変形性膝関節症とは:その治療法・進行予防について自分や家族の膝のレントゲン写真を持っている人がどれほどいるのか甚だ疑問ですが、膝の痛みに悩んでいる人の一助になればと作成しました。
注意)このボットはあくまで参考程度に作成したもので、正確な診断ツールではありません!
最終的な診断については、おかかりいただいた先生にお伺いください。開発環境の下準備
1) VScodeのインストール
VScodeのインストールついては、googleなどで他の記事を検索してください。
2) node.jsとnpmのインストール
Macでの環境作りは、こちらの別の記事にまとめてあります。
参考にしてください。
Macにnode.js,npmのインストール方法開発環境の準備
1) kneepainというフォルダを作成
2) VSCodeで上記フォルダを開き、フォルダ内にkneeOA.jsを作成
3) VSCode内でターミナルを開き、フォルダをnpm管理できるように初期化terminalコマンド$ npm init -y4) フォルダ内にラインボット用のパッケージをnpmでインストール
terminalコマンド$ npm i @line/bot-sdk expressシステムの概要
AIメーカーによる画像認識AIの作成
こちらの記事を参考に、画像認識AIを作成しました。
画像認識AIを使ったLINE BOTの作り方kneeOA.jsのコード
kneeOA.js'use strict'; const lineAccessToken = '作成したBOTのチャネルアクセストークン'; const lineSecret = '作成したBOTのチャネルシークレット'; const express = require('express'); const line = require('@line/bot-sdk'); const PORT = process.env.PORT || 3000; const config = { channelSecret: lineSecret, channelAccessToken: lineAccessToken }; const userID = '作成したBOTのチャネルユーザーID'; // AIメーカーで作成したAIの定数 const aimakerClient = require('request'); const aimakerModelId = AIメーカーで作成したAIモデルのIDを入力; const aimakerApiKey = 'AIメーカーで作成したAIモデルのAPIキーを入力'; // 返信用定数 const normalrtAdvice = '正常の右膝です。'; const normalltAdvice = '正常の左膝です。'; const kl1rtAdvice = '関節軟骨が痛んでいる可能性のある右膝です。'; const kl1ltAdvice = '関節軟骨が痛んでいる可能性のある左膝です。'; const kl2rtAdvice = '関節裂隙が軽度狭小化した右膝です。'; const kl2ltAdvice = '関節裂隙が軽度狭小化した左膝です。'; const kl3rtAdvice = '関節裂隙が高度狭小化した右膝です。'; const kl3ltAdvice = '関節裂隙が高度狭小化した左膝です。'; const kl4rtAdvice = '関節裂隙が無くなってしまった右膝です。'; const kl4ltAdvice = '関節裂隙が無くなってしまった左膝です。'; const OAImportant = '変形性膝関節症の進行には、膝関節周囲の筋力の衰えることによる、膝関節の不安定性が影響を与えます。'; const OAImportant2 = '膝関節の安定には四頭筋の筋力upが重要です。適切な運動を心がけましょう。'; const app = express(); app.post('/webhook', line.middleware(config), (req, res) => { 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 !== 'image') { return Promise.resolve(null); }; const getImageOptions = { url: `https://api.line.me/v2/bot/message/${event.message.id}/content`, method: 'get', headers: { 'Authorization': 'Bearer ' + lineAccessToken, }, encoding: null }; let resultMessage = ''; resultMessage = '解析中です。'; aimakerClient(getImageOptions, function (error, response, body) { if (!error && response.statusCode == 200) { console.log('成功'); //console.log(body); const buffer = new Buffer.from(body); const base64String = buffer.toString('base64'); imageRecognition(base64String, event.source.userId); } else { console.log(error); resultMessage = restartMessage; } }); return client.replyMessage(event.replyToken, [{ type: 'text', text: resultMessage }, { type: 'text', text: OAImportant }]); }; function imageRecognition(base64, userId) { // Aiメーカー関数 let message = ''; aimakerClient.post({ // AiメーカーAPI接続 uri: "https://aimaker.io/image/classification/api", headers: { "Content-type": "application/x-www-form-urlencoded", }, timeout: 20000, form: { id: aimakerModelId, apikey: aimakerApiKey, base64: base64 } }, function (error, response, body) { if (error) { console.log('imegerecエラー'); console.log(error); message = restartMessage; } else { console.log(body); var imageScores = JSON.parse(body); var labels = imageScores.labels.sort(function (a, b) { if (a.score > b.score) return -1; if (a.score < b.score) return 1; return 0; }); console.log(imageScores.labels); if (labels[0].label && labels[0].score) { switch (labels[0].label) { case 'Normal:Rt': message = 'この膝は「' + labels[0].label + '」です。' + normalrtAdvice; break; case 'Normal:Lt': message = 'この膝は「' + labels[0].label + '」です。' + normalltAdvice; break; case 'KL1:Rt': message = 'この膝は「' + labels[0].label + '」です。' + kl1rtAdvice; break; case 'KL1:Lt': message = 'この膝は「' + labels[0].label + '」です。' + kl1ltAdvice; break; case 'KL2:Rt': message = 'この膝は「' + labels[0].label + '」です。' + kl2rtAdvice; break; case 'KL2:Lt': message = 'この膝は「' + labels[0].label + '」です。' + kl2ltAdvice; break; case 'KL3:Rt': message = 'この膝は「' + labels[0].label + '」です。' + kl3rtAdvice; break; case 'KL3:Lt': message = 'この膝は「' + labels[0].label + '」です。' + kl3ltAdvice; break; case 'KL4:Rt': message = 'この膝は「' + labels[0].label + '」です。' + kl4rtAdvice; break; case 'KL4:Lt': message = 'この膝は「' + labels[0].label + '」です。' + kl4ltAdvice; break; default: message = 'もう一度、画像を送ってください。'; break; } } console.log('アゲイン'); client.pushMessage(userId, [{ type: 'text', text: message }, { type: 'text', text: OAImportant2 }]).then(); }; }); }; app.listen(PORT); console.log(`Server running at ${PORT}`);Herokuへのデプロイ
node.jsが動作する無料のクラウドサーバーであるHerokuにデプロイします。
下準備
1) Heroku CLIのインストール
https://devcenter.heroku.com/articles/heroku-cli2) Herokuアカウントの作成
https://signup.heroku.com/デプロイ
ターミナルで下記コマンドを実行します。
terminalコマンド$ heroku login実行するとブラウザが自動的に起動するので、ログインします。
すると、ターミナル上でもログインが完了します。その後、package.jsonの"scripts"の中に、"start"を下記のように追記します。
package.json"scripts": { "test": "echo \"Error: no test specified\" && exit 1", "start": "node kneeOA.js" },Heroku内にデプロイ先のディレクトリを作成します。
下記の順でターミナルにコマンドを入力します。terminalコマンド$ git initterminalコマンド$ heroku createHeroku内にデプロイ先のディレクトリが作成されると、ターミナルに下記のように表示されます。
terminalCreating app... done, ⬢ デプロイ先の名前 https://デプロイ先の名前.com/ | https://git.heroku.com/デプロイ先の名前.gitこのデプロイ先ディレクトリに、作成したディレクトリを入れていきます。
下記の順でターミナルにコマンドを入力します。terminalコマンド$ git add .terminalコマンド$ git commit -m 'init'terminalコマンド$ git push heroku master最終的に下記のように表示されれば完了です。
terminalremote: https://デプロイ先の名前.herokuapp.com/ deployed to Heroku remote: remote: Verifying deploy... done. To https://git.heroku.com/デプロイ先の名前.git * [new branch] master -> masterこれでデプロイ完了です。
ファイルを更新する時
まず、更新するファイルが入ったディレクトリがherokuのデプロイ先のディレクトリと紐づいているかを確認します。
terminalコマンド$ git remote -v紐づいている場合
紐づいている場合は、ターミナルに下記のように表記されます。
terminalheroku https://git.heroku.com/heroku上のデプロイ先の名前 (fetch) heroku https://git.heroku.com/heroku上のデプロイ先の名前 (push)紐づいていない場合
紐づいていない場合は、ターミナルに下記のように表記されます。
terminalfatal: not a git repository (or any of the parent directories): .gitその場合は、ターミナルに下記の順に入力し、空のディレクトリを作成し、heroku上のデプロイしたいディレクトリと紐付けを行います。
terminalコマンド$ git init //空のディレクトリを作成terminalコマンド$ heroku git:remote -a heroku上のデプロイしたいディレクトリ名 //herokuのデプロイ先と先ほど作成した空のtディレクトリを紐付けその上で、下記の順にコマンドを入力し、ファイルを更新します。
terminalコマンド$ git add .terminalコマンド$ git commit -m 'init'terminalコマンド$ git push heroku masterLINE Developersからbot作成
1) LINE Developersにアクセスし、LINEアカウントでログイン
2) プロバイダー作成
3) 新規チャンネルの作成
4) チャネルアクセストークンとチャネルシークレットの取得
1)〜4)までは下記を参考に進みました。
1時間でLINE BOTを作るハンズオン (資料+レポート) in Node学園祭2017 #nodefest
5) webhookの設定
Herokuから取得したデプロイ先のURLを入力。
/webhookをつけることを忘れずに。
完成したラインbot
ちなみに動作はこんな感じになります。
動作はこんな感じです。 pic.twitter.com/J1rZ5U0pWo
— 北城雅照@足立慶友整形外科 (@kutuyanomusuko) November 22, 2020
繰り返しになりますが、こちらは診断ツールではありませんので、ご注意ください!!
- 投稿日:2020-11-22T15:02:30+09:00
誰が使うかわからないけど、膝のレントゲン写真を送ったら、その膝がどの程度痛んでいるのか教えてくれるラインbotを作ってみた。
最近、膝、痛くない??
突然ですが、最近、膝痛くないですか?
階段降りる時や立ち上がる時など、特に痛くないですか??
気づいたら、足がO脚になっていないですか???もしかしたらそれ、変形性膝関節症かもしれません。
*「変形性膝関節症って何?」という方は、僕が書いたこちらの記事をぜひお読みください。
変形性膝関節症とは:その治療法・進行予防について自分や家族の膝のレントゲン写真を持っている人がどれほどいるのか甚だ疑問ですが、膝の痛みに悩んでいる人の一助になればと作成しました。
注意)このボットはあくまで参考程度に作成したもので、正確な診断ツールではありません!
最終的な診断については、おかかりいただいた先生にお伺いください。開発環境の下準備
1) VScodeのインストール
VScodeのインストールついては、googleなどで他の記事を検索してください。
2) node.jsとnpmのインストール
Macでの環境作りは、こちらの別の記事にまとめてあります。
参考にしてください。
Macにnode.js,npmのインストール方法開発環境の準備
1) kneepainというフォルダを作成
2) VSCodeで上記フォルダを開き、フォルダ内にkneeOA.jsを作成
3) VSCode内でターミナルを開き、フォルダをnpm管理できるように初期化terminalコマンド$ npm init -y4) フォルダ内にラインボット用のパッケージをnpmでインストール
terminalコマンド$ npm i @line/bot-sdk expressシステムの概要
AIメーカーによる画像認識AIの作成
こちらの記事を参考に、画像認識AIを作成しました。
画像認識AIを使ったLINE BOTの作り方kneeOA.jsのコード
kneeOA.js'use strict'; const lineAccessToken = '作成したBOTのチャネルアクセストークン'; const lineSecret = '作成したBOTのチャネルシークレット'; const express = require('express'); const line = require('@line/bot-sdk'); const PORT = process.env.PORT || 3000; const config = { channelSecret: lineSecret, channelAccessToken: lineAccessToken }; const userID = '作成したBOTのチャネルユーザーID'; // AIメーカーで作成したAIの定数 const aimakerClient = require('request'); const aimakerModelId = AIメーカーで作成したAIモデルのIDを入力; const aimakerApiKey = 'AIメーカーで作成したAIモデルのAPIキーを入力'; // 返信用定数 const normalrtAdvice = '正常の右膝です。'; const normalltAdvice = '正常の左膝です。'; const kl1rtAdvice = '関節軟骨が痛んでいる可能性のある右膝です。'; const kl1ltAdvice = '関節軟骨が痛んでいる可能性のある左膝です。'; const kl2rtAdvice = '関節裂隙が軽度狭小化した右膝です。'; const kl2ltAdvice = '関節裂隙が軽度狭小化した左膝です。'; const kl3rtAdvice = '関節裂隙が高度狭小化した右膝です。'; const kl3ltAdvice = '関節裂隙が高度狭小化した左膝です。'; const kl4rtAdvice = '関節裂隙が無くなってしまった右膝です。'; const kl4ltAdvice = '関節裂隙が無くなってしまった左膝です。'; const OAImportant = '変形性膝関節症の進行には、膝関節周囲の筋力の衰えることによる、膝関節の不安定性が影響を与えます。'; const OAImportant2 = '膝関節の安定には四頭筋の筋力upが重要です。適切な運動を心がけましょう。'; const app = express(); app.post('/webhook', line.middleware(config), (req, res) => { 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 !== 'image') { return Promise.resolve(null); }; const getImageOptions = { url: `https://api.line.me/v2/bot/message/${event.message.id}/content`, method: 'get', headers: { 'Authorization': 'Bearer ' + lineAccessToken, }, encoding: null }; let resultMessage = ''; resultMessage = '解析中です。'; aimakerClient(getImageOptions, function (error, response, body) { if (!error && response.statusCode == 200) { console.log('成功'); //console.log(body); const buffer = new Buffer.from(body); const base64String = buffer.toString('base64'); imageRecognition(base64String, event.source.userId); } else { console.log(error); resultMessage = restartMessage; } }); return client.replyMessage(event.replyToken, [{ type: 'text', text: resultMessage }, { type: 'text', text: OAImportant }]); }; function imageRecognition(base64, userId) { // Aiメーカー関数 let message = ''; aimakerClient.post({ // AiメーカーAPI接続 uri: "https://aimaker.io/image/classification/api", headers: { "Content-type": "application/x-www-form-urlencoded", }, timeout: 20000, form: { id: aimakerModelId, apikey: aimakerApiKey, base64: base64 } }, function (error, response, body) { if (error) { console.log('imegerecエラー'); console.log(error); message = restartMessage; } else { console.log(body); var imageScores = JSON.parse(body); var labels = imageScores.labels.sort(function (a, b) { if (a.score > b.score) return -1; if (a.score < b.score) return 1; return 0; }); console.log(imageScores.labels); if (labels[0].label && labels[0].score) { switch (labels[0].label) { case 'Normal:Rt': message = 'この膝は「' + labels[0].label + '」です。' + normalrtAdvice; break; case 'Normal:Lt': message = 'この膝は「' + labels[0].label + '」です。' + normalltAdvice; break; case 'KL1:Rt': message = 'この膝は「' + labels[0].label + '」です。' + kl1rtAdvice; break; case 'KL1:Lt': message = 'この膝は「' + labels[0].label + '」です。' + kl1ltAdvice; break; case 'KL2:Rt': message = 'この膝は「' + labels[0].label + '」です。' + kl2rtAdvice; break; case 'KL2:Lt': message = 'この膝は「' + labels[0].label + '」です。' + kl2ltAdvice; break; case 'KL3:Rt': message = 'この膝は「' + labels[0].label + '」です。' + kl3rtAdvice; break; case 'KL3:Lt': message = 'この膝は「' + labels[0].label + '」です。' + kl3ltAdvice; break; case 'KL4:Rt': message = 'この膝は「' + labels[0].label + '」です。' + kl4rtAdvice; break; case 'KL4:Lt': message = 'この膝は「' + labels[0].label + '」です。' + kl4ltAdvice; break; default: message = 'もう一度、画像を送ってください。'; break; } } console.log('アゲイン'); client.pushMessage(userId, [{ type: 'text', text: message }, { type: 'text', text: OAImportant2 }]).then(); }; }); }; app.listen(PORT); console.log(`Server running at ${PORT}`);Herokuへのデプロイ
node.jsが動作する無料のクラウドサーバーであるHerokuにデプロイします。
下準備
1) Heroku CLIのインストール
https://devcenter.heroku.com/articles/heroku-cli2) Herokuアカウントの作成
https://signup.heroku.com/デプロイ
ターミナルで下記コマンドを実行します。
terminalコマンド$ heroku login実行するとブラウザが自動的に起動するので、ログインします。
すると、ターミナル上でもログインが完了します。その後、package.jsonの"scripts"の中に、"start"を下記のように追記します。
package.json"scripts": { "test": "echo \"Error: no test specified\" && exit 1", "start": "node kneeOA.js" },Heroku内にデプロイ先のディレクトリを作成します。
下記の順でターミナルにコマンドを入力します。terminalコマンド$ git initterminalコマンド$ heroku createHeroku内にデプロイ先のディレクトリが作成されると、ターミナルに下記のように表示されます。
terminalCreating app... done, ⬢ デプロイ先の名前 https://デプロイ先の名前.com/ | https://git.heroku.com/デプロイ先の名前.gitこのデプロイ先ディレクトリに、作成したディレクトリを入れていきます。
下記の順でターミナルにコマンドを入力します。terminalコマンド$ git add .terminalコマンド$ git commit -m 'init'terminalコマンド$ git push heroku master最終的に下記のように表示されれば完了です。
terminalremote: https://デプロイ先の名前.herokuapp.com/ deployed to Heroku remote: remote: Verifying deploy... done. To https://git.heroku.com/デプロイ先の名前.git * [new branch] master -> masterこれでデプロイ完了です。
ファイルを更新する時
まず、更新するファイルが入ったディレクトリがherokuのデプロイ先のディレクトリと紐づいているかを確認します。
terminalコマンド$ git remote -v紐づいている場合
紐づいている場合は、ターミナルに下記のように表記されます。
terminalheroku https://git.heroku.com/heroku上のデプロイ先の名前 (fetch) heroku https://git.heroku.com/heroku上のデプロイ先の名前 (push)紐づいていない場合
紐づいていない場合は、ターミナルに下記のように表記されます。
terminalfatal: not a git repository (or any of the parent directories): .gitその場合は、ターミナルに下記の順に入力し、空のディレクトリを作成し、heroku上のデプロイしたいディレクトリと紐付けを行います。
terminalコマンド$ git init //空のディレクトリを作成terminalコマンド$ heroku git:remote -a heroku上のデプロイしたいディレクトリ名 //herokuのデプロイ先と先ほど作成した空のtディレクトリを紐付けその上で、下記の順にコマンドを入力し、ファイルを更新します。
terminalコマンド$ git add .terminalコマンド$ git commit -m 'init'terminalコマンド$ git push heroku masterLINE Developersからbot作成
1) LINE Developersにアクセスし、LINEアカウントでログイン
2) プロバイダー作成
3) 新規チャンネルの作成
4) チャネルアクセストークンとチャネルシークレットの取得
1)〜4)までは下記を参考に進みました。
1時間でLINE BOTを作るハンズオン (資料+レポート) in Node学園祭2017 #nodefest
5) webhookの設定
Herokuから取得したデプロイ先のURLを入力。
/webhookをつけることを忘れずに。
完成したラインbot
ちなみに動作はこんな感じになります。
動作はこんな感じです。 pic.twitter.com/J1rZ5U0pWo
— 北城雅照@足立慶友整形外科 (@kutuyanomusuko) November 22, 2020
繰り返しになりますが、こちらは診断ツールではありませんので、ご注意ください!!その他の記事
- 投稿日:2020-11-22T14:15:51+09:00
awaitって大事メモ
- 投稿日:2020-11-22T13:03:48+09:00
LINE Messaging APIで文末に絵文字を入れるメモ
テキストの長さをとってそれをindexとしておく。
var pushText = "hogehoge"; // 文末に絵文字を入れるための準備 let textLength = pushText.length; pushText += "$"; // メッセージ配列の初期化 let messageList = []; // メッセージの作成 messageList = [{ "type": "text", "text": pushText, "emojis": [ { "index": textLength, "productId": "5ac1bfd5040ab15980c9b435", "emojiId": "005" } ] },{ "type": "sticker", "packageId": "11537", "stickerId": "52002755" }];
- 投稿日:2020-11-22T12:32:32+09:00
Raspberry Piとhostapdでローカルサーバに接続する
やりたいこと
Raspberry Pi内臓のWi-Fiをアクセスポイントとして使い、他のデバイス(スマホやPC)で接続することでRaspberry Piで構築したサーバに接続する。
使ったもの
- Raspberry Pi3 Model B
- 3B以上のモデルだとWi-Fiを内蔵しているのでこれだけでいい。
やり方
インストール(hostapd, dnsmasq, Node.js)
Node.jsが入ってるかを確認
$ node -v入ってなかったら、入れる。
こちらの記事を参考にされると良いと思います。
ラズベリーパイ4にNode.jsをインストールするまで$ sudo apt-get install hostapd dnsmasqhostapdの設定
/etc/hostapd/hostapd.confを以下の内容で生成。
ssidとwpa_passphraseは自由に設定。/etc/hostapd/hostapd.confinterface=wlan0 driver=nl80211 ssid=test-hostapd hw_mode=g channel=7 wmm_enabled=0 macaddr_acl=0 auth_algs=1 ignore_broadcast_ssid=0 wpa=2 wpa_passphrase=test1234 wpa_key_mgmt=WPA-PSK wpa_pairwise=TKIP rsn_pairwise=CCMPこの設定を読み出すように、/etc/default/hostapdの以下を変更。
DAEMON_CONF="/etc/hostapd/hostapd.conf"DHCPの設定
isc-dhcp-serverでも同じことができるようだが、うまくいかなかったのでdnsmasqを使用。
/etc/dnsmasq.confに以下を追記。/etc/dnsmasq.confinterface=wlan0 dhcp-range=192.168.2.2,192.168.2.50,255.255.255.0,24hネットワーク設定
/etc/dhcpcd.confに以下を追記。
IPアドレスを固定。/etc/dhcpcd.confinterface wlan0 static ip_address=192.168.2.1/24 nohook wpa_supplicant起動
$ sudo systemctl restart dhcpcd $ sudo systemctl start dnsmasq $ sudo systemctl enable dnsmasq $ sudo systemctl unmask hostapd $ sudo systemctl enable hostapd $ sudo systemctl start hostapd再起動。
$ sudo reboot簡単なWebサーバを構築
以下のソースでtest.jsを生成。
test.jsvar http = require('http'); var server = http.createServer(); server.on('request', function(req, res) { res.writeHead(200, {'Content-Type' : 'text/plain'}); res.write('hello world'); res.end(); }); server.listen(3000, '0.0.0.0');以下で実行。
$ node test.js接続
PC等で自分でつけたssid(例:test-hostapd)のWi-Fiに接続。
http://192.168.2.1:3000 にアクセスし、hello Worldと出てくれば成功。
- 投稿日:2020-11-22T10:59:16+09:00
node.jsで簡易ftpサーバーを立てる(Qemu用)
概要
Qemuではフォルダ共有機能が実質存在しないので、ゲストOSからホストのファイルにアクセスするためのftpサーバーをnode.jsでサクッと構築する。
パッケージのインストール
npm install ftpdソース
ftpd.jsvar ftpd = require('ftpd'); var fs = require('fs'); var path = require('path'); //コマンドライン引数からポートとルートになるフォルダの設定 var port = process.argv[2] || 10021; var root = process.argv[3] || process.cwd(); //サーバーの設定 var server = new ftpd.FtpServer('127.0.0.1', { //接続後の初期ディレクトリ getInitialCwd: function() { return '/'; }, //ルートとなるフォルダの設定 getRoot: function() { return root; }, pasvPortRangeStart: 1025, pasvPortRangeEnd: 1050, tlsOptions: null, allowUnauthorizedTls: true, }); //エラー server.on('error', function(error) { console.log('FTP Server error:', error); }); //クライアントが接続してきたら認証(してるフリ) server.on('client:connected', function(connection) { var username = null; connection.on('command:user', function(user, success, failure) { if (user) { username = user; success(); } else { failure(); } }); connection.on('command:pass', function(pass, success, failure) { if (pass) { success(username); } else { failure(); } }); }); //コンソールへの出力を最低限に server.debugging = 0; //指定したポートでサーバー起動 server.listen(port); console.log('Listening on port ' + port);起動
node ftpd.js 10020 x:\DocumentsQemuからアクセス
(特に設定をしていなければ)IPアドレス
10.0.2.2
でqemuのゲストからホストのサーバーにアクセスできるようです。
- 投稿日:2020-11-22T10:58:16+09:00
Steinを使って名前マスタから情報を取得するメモ
名前の登録があれば設定、なければ登録を促す処理
ユーザIDをもとにユーザ名を取り出す処理。function getUserName(userId){ let userName ; userName = store.read("name_master", { search: { user_id: userId } }).then(data => { console.log(data); let uName; console.log(data.length); if(data.length === 0 ){ uName = ""; }else{ uName = data[0].user_name; } console.log(uName); //1行しか取れないので1つ目のユーザ名を指定 return uName; }); return userName; }