ラベル Linux の投稿を表示しています。 すべての投稿を表示
ラベル Linux の投稿を表示しています。 すべての投稿を表示

2021年12月4日土曜日

OracleCloud に Node-RED をインスールして無料で使い倒す方法

OracleCloud の太っ腹すぎる Always Free Cloud Services(期間の制限なく使用できるサービス)で構築した VM へ Node-RED をインストールする方法です。

さも自分で考えたかのような書き出しですが、ほとんど公式ブログの手順に沿って作業しただけです🤤

Installing Node-RED In An Always Free VM On Oracle Cloud (えいご)

2019年の記事なので、今(2021年)とは少し異なる部分もありますがやることは同じです。

そのため基本的には、指示通り設定すれば OK なのですが、私が実際にやってみて、気がついた点がいくつかあるので、ここにメモしておきます。

あと、ついでに HTTPS 化ポート転送もやります。

ちゃんと Oracle Linux を選びましょう。

ついつい見知った Ubuntu を使いたくなるかもしれませんが、指示通り(?)Oracle Linux を選択しましょう。

もし Ubuntu を選択した場合、以降の手順が色々と変わってきてしまいます。
もし Ubuntu でないと残尿感があるという方は、Ubuntu で構築した方もいらっしゃるようなので、そちらを参考にしてください↓

NODE-REDをORACLEの無料VPSサービスで使う

インストールスクリプトの違いに注意!

Oracle Linux に Node-RED をインストールする際に使用するインストールスクリプトは、Ubuntu や Raspberry Pi OS(旧 Raspbian)へインストールする際に利用するインストールスクリプトとは、パスが違う点に注意してください。

ブログの指示通りに、

bash <(curl -sL https://raw.githubusercontent.com/node-red/linux-installers/master/rpm/update-nodejs-and-nodered)

を使用しましょう。

一見、Debian 系と同じに見えますが、微妙にパスが異なります
Oracle Linux は Red Hat ベースなので、Debian 系のインストールスクリプトは使えません。

インストールスクリプトについては公式の「Linux Installers for Node-RED」をご覧ください。
あと公式の「ローカルでNode-REDを実行する」も見たらいいかも。

もし外部から繋がらなかったらポート設定してみて。

これはもしかしたらやらなくても良い手順なのかもしれないのですが、指示には書いてないのに私はうっかりやっちゃったので、一応書いておきます。

なお、Oracle Linux 7では、デフォルトのファイアウォール・ユーティリティは firewalld (firewall-cmd)です。(参考:Oracle® Linux 7セキュリティ・ガイド
iptables では無いので注意!

VM インスタンスに対して、

sudo firewall-cmd --permanent --add-port=1880/tcp

した後、

sudo firewall-cmd --reload

して、ポート 1880 を有効にしました。

このドキュメント「Free Tier: Install Node Express on an Oracle Linux Instance」の「4. Create a Node Express Application + Install and Set up Node Express」を参考にしました。

てか、https 化する手順でも 80 番に対して同じようなことしてるので、やっぱ必要な手順だと思う。

リンクされている https 化の手順は古い

このページね。

Free SSL Certificates In The Oracle Cloud Using CertBot And Let's Encrypt

certbot-auto はもうサポートされていません。

ポート 80 番を開放する方法以外は参考にしていない。

は?んじゃどーすんのさ。

私が勘で行った方法でよければどうぞ↓

Oracle Linux で動いている Node-RED の HTTPS 化手順

※ そもそもドメイン側の設定は別途済ませておきます。
※ Certbot で Let's Encrypt から証明書を発行してもらう想定です。

まず snap をインストールします。
参考にしたのはこちらのページ「Installing snap on Red Hat Enterprise Linux (RHEL)

sudo rpm -ivh https://dl.fedoraproject.org/pub/epel/epel-release-latest-7.noarch.rpm

sudo yum update

なんか指示が出たので、それに従って再度 update

sudo yum update --skip-broken

何度か確認させられるけど、Complete! した。

sudo yum install snapd

インストールできた。

sudo systemctl enable --now snapd.socket

sudo ln -s /var/lib/snapd/snap /snap

必要なのか分からないけどページの指示に従いやった。
そして再起動。

ここからは、Certbot の設定。

参考にしたのは「Web Hosting Product on CentOS 7」の組み合わせ。

sudo snap install core; sudo snap refresh core

コアなんて無いとかエラー出る。まぁ無視して次。

sudo snap install --classic certbot

インストールできた。

sudo ln -s /snap/bin/certbot /usr/bin/certbot

必要ない気もしたけど指示に従ってやった。

sudo certbot certonly --standalone

メールアドレス入力、利用規約に同意、メール送っていいかの確認、ドメインの入力をやった。

sudo certbot renew --dry-run

テストも成功した。

ここからは Node-RED の設定。

いつもの、

~/.node-red/settings.js

を編集します。
具体的な方法は「セキュリティ」のページを参照。

/** Option 1: static object */
https: {
  key: require("fs").readFileSync('/etc/letsencrypt/live/[ドメイン]/privkey.pem'),
  cert: require("fs").readFileSync('/etc/letsencrypt/live/[ドメイン]/cert.pem')
},

の項目のコメントを外して、秘密鍵と証明書へのパスを入力して有効にします。

[2024年4月8日追記:ここから]cert.pem (サーバー証明書のみ)では証明書チェーン(認証パス)が不完全なのでルート証明書、中間CA証明書、サーバー証明書が全部含まれている fullchain.pem を指定するほうが確実です。
例えば私の場合、cert.pem では Android 11 以降の端末から WebSocket 通信ができないなどの問題が発生しましたが fullchain.pem に変更することで解決することができました。[2024年4月8日追記:ここまで]

ただし、

/etc/letsencrypt/live/
/etc/letsencrypt/archive/

のパーミッションは、0700 になっていて Node-RED が読めません。
なので、

sudo chmod 0755 /etc/letsencrypt/live/

sudo chmod 0755 /etc/letsencrypt/archive/

して、さらに所有グループも自分(opc)に変更して↓

sudo chgrp opc /etc/letsencrypt/live/[ドメイン]/privkey.pem /etc/letsencrypt/live/[ドメイン]/cert.pem

Node-RED が読めるようにする必要があります。

以上でサーバーを再起動すれば、HTTP 化も完了です。

おしまい🤤

[2021年12月6日追記]

ポート 443(HTTPS)から 1880 へ転送したい

「https://ドメイン:1880/」ではなく「https://ドメイン」でアクセスしたいんじゃ!という場合の手順です。

まず今までの手順同様、ポートの設定をおこないます。

次に、firewalld で 443 へのアクセスを 1880 へ転送するようにします。

sudo firewall-cmd --permanent --add-forward-port=port=443:proto=tcp:toport=1880

そしたらリロードします。

sudo firewall-cmd --reload

これで :1880 なしでもアクセスできるようになります👍

めでたしめでたし🤤

2018年11月14日水曜日

redir コマンドでポートフォワードする方法

普通は iptables で転送するところを、わざわざ redir をインストールして実現する意図がよくわからない方法の備忘録。
なお、Raspberry Pi (Raspbian) で動作を確認。

使い方は
https://github.com/troglobit/redir
を参照。

そもそもインストールされていないので、まずはインストールする。
んで、ドキュメントに倣い以下のように実行。
sudo redir :80 127.0.0.1:8080
ポート番号は適宜変更しましょう。
例えば 1880 番の Node-RED に 80 番でアクセスできるようにするには
sudo redir :80 127.0.0.1:1880
です。

たぶん再起動のたびに実行しないとダメだよねコレ。
(ドキュメントに /etc/inetd.conf への追記サンプルあり)

2018年10月17日水曜日

Ubuntu 上の Dropbox フォルダを Windows と共有する方法

やる意味がわからないと思いますが、そういうシチュエーションもあるんですよ。
(Windows 側に空き容量がないとかね)

せっかく Ubuntu 入れてるんだから可能な限りコマンドは使わない方向でやります。
ちなみに Ubuntu 18.04.1 LTS でやりました。

なお、まるで熟知しているかのような書きっぷりですが、カンで作業した結果を書いてるだけなので、嘘、大げさ、紛らわしい可能性があることをご了承ください。

フォルダを右クリックして「プロパティ」でひらくやつ。
この画像は設定前の状態です。

まず素直に GUI 上で「ローカルネットワーク共有」を設定してみましたが、これでは Windows からの書き込みと Ubuntu での書き込みではユーザーが異なり権限(パーミッション)を変更しないと相互に上書きできない状態になってしまいました。

鍵がついちゃう

それではめんどいので、「ローカルネットワーク共有」ではなく samba をインストールして設定してみました。

注)以降の作業を行う前に全ての「ローカルネットワーク共有」の「このフォルダーを共有する」はチェック解除しておきましょう。
(もしくはそもそも触らない)

samba は「Ubuntu ソフトウェア」を起動して「samba」って検索すれば出てくるので、それをインストールします。

これをインストールする

しかし残念なことに、samba の設定画面はスーパーユーザー(管理者みたいなもん)でなければ開くことができません。
つまりマウスぽちぽちでは起動できません。
そのため「端末」アプリでコマンドを入力する必要があります。

CLI は説明不足の典型例w

そのコマンドは以下のとおりなのですが、
sudo system-config-samba
いきなりこれを入力してエンターキーを押しても、英語で「/etc/libuser.conf が無いよ」って言われてしまいます。
そこで、最初だけ次のコマンドを実行しておく必要があります。
(二回目移行は必要ありません)
sudo touch /etc/libuser.conf
上記コマンドで空のファイルが作れます。
このコマンドを実行するとパスワードを聞かれるので入力します。(何も表示されませんが入力されてます)
コマンドについて詳しく知りたい方は「sudo」コマンドと「touch」コマンドをググればいいと思います。
ファイルを作った上で再度
sudo system-config-samba
と入力しパスワードを入力すれば設定画面が開きます。
+ボタンで共有フォルダを追加したりなんやかんや設定しましょう(爆)

ちなみに当初の上書きできない問題については、プリファレンス > サーバー設定 > セキュリティのゲストアカウントを自分のアカウントにすることで、相互に上書き保存ができるようになります。

ゲストアカウントを自分にすることで解決
まぁセキュリティがザルになりますがねw
ちゃんとする場合は samba のユーザーも設定しておきましょう。

設定が終わり設定画面を閉じたら samba を再起動する必要があります。
以下のコマンドを実行します。
sudo systemctl restart smbd
あとは windows のネットワークから見られるかと、ちゃんと Dropbox が同期できてるかをチェックしましょう。

なお、共有しているフォルダ側もちゃんと自分にしておかないと意味ないので注意。

変えておけば以降は設定に準ずるはず
いつになったら Ubuntu は CLI 使わなくても良くなるんっすかねー。

2017年11月3日金曜日

at コマンドで秒を指定する方法

最近は cron がブイブイ言わせているようですが、1回きりの処理では at コマンドのほうがラクチンです。私は。

まぁ、そんなことはどうでもよくて、秒まできっちり指定したい場合には以下の方法が(環境によっては)使えるらしいです。

2017年12月01日15時00分30秒を指定したい場合。
$ at -t 201712011500.30
というように、「.」に続けて秒を指定すればOKらしいです。
-t オプションについてはググってください。

ただ、残念ながら Raspberry Pi の Raspbian では無視されてしまうようです。
(.30とか追加してもエラーにはならないが00秒で実行される)
なので実際に機能しているところは見たことありませんw

そもそも Raspberry Pi の Raspbian にはデフォで at コマンド入ってないので
$ sudo apt-get install at
する必要があります。

私は音声認識でタイマーをセットさせたかったので、0秒から59秒の sleep を含んだシェルを用意するという力技で解決しました。

2017年12月01日15時00分30秒を指定したい場合。
$ at -t 201712011500 -f ./timer30.sh
timer00.sh のなかには sleep と実行したいコマンドが記述されています。
かなり頭の悪い方法ですが cron でも使えるかもしれないです。(試してない)

つーか
$ at -t 201712011500 -f ./timer.sh 30
とかいう感じに引数指定できないんですか?
なんかいい方法あったら教えてください。

2017年10月30日月曜日

ChatBot(チャットボット) を無料で作れるツール・サービスまとめ

個人で利用できて無料プランがあるチャットボット作成サービスのまとめ。

2018年8月更新時点での無料プランの場合の情報。
2017年11月時点での無料プランの場合の情報。
サービス名ボット数APIコール数インテント数
シナリオ数
エンティティー数
クエリー数
連携
Repl-AI11,000 コール/月制限なし制限なしLINE
Facebook
API
Watson Assistant (旧Conversation)510,000 コール/月10025API
hachidori210,000 コール/月20--LINE
Facebook
Dialogflow集中しなきゃOK無いっぽい無いっぽいGoogle Assistant
LINE
Facebook
Twitter
Slack
Dialogflow Web Demo
Kik
Skype
Spark
Telegram
Tropo
Twilio
Twilio Programmable Chat
Viber
Amazon Alexa(?)
Microsoft Cortana
API
一見すると Dialogflow 一択のようにも思えるが、実際使ってみると会話フロー構築で弱い面がある。
それぞれを使ってみたレビューは以下の通り。

Repl-AI

https://repl-ai.jp/
docomo が提供するサービス。
ドキュメントやエディターはもちろん日本語なので、とてもわかりやすい。
エディターはボックスを線で繋いで作るという仕組みなので、簡単に使いこなせるようになるが、その仕様上、複雑な会話フローや大量なパターンを作ろうとすると破綻しがち。(その状態で整列ボタンを押すと死ぬw)

また、会話フローの条件で or が使えないことも地味に痛い。
単語の抽出(System Entities っぽいもの)は、場所や時刻、金額などが取得でき、特に人名が取得できる点はなにかと便利。
反面、辞書機能は同義語を定義する程度のもので、Entity として取得したりはできない。

LINE と Facebook とは簡単に接続できるが、Web サイトにサクッと載せられるような機能は最上位(Enterprise)プランにしか無い。
(ちなみに最上位プランは桁違いに高いゾ☆)
無料でやるには API で頑張る必要がある。

他のサービスにはない特長として、予め用意されている「知識Q&Aボット」「トレンド記事ボット」「雑談対話ボット」と連携できる機能があり、一般的な会話はそれらを利用することで手間が省ける。
ただし、「雑談対話ボット」はかなりフランクっていうかチャラいw

Watson Assistant (旧Conversation)

https://www.ibm.com/watson/jp-ja/developercloud/conversation.html
IBM のクラウドサービス IBM Cloud (旧Bluemix) 内のサービス。(どんだけ名前変んねんw)
Conversation とプラットフォームを繋げるために別途アプリケーション・サーバーが必要。
LINE や Facebook などに簡単につなげる機能などは一切ないので、API を利用してなんやかんやできる知識が必要。
ただしその分、汎用性は高く、Conversation 開発ツールは非常に洗練されているため、複雑な会話フローにも柔軟に対応できる。
この開発ツールへは、WEBブラウザからアクセスでき、プログラミング知識がなくても扱えるようにできている。(ただし英語)

プロフェッショナルな要求にも対応できる非常に高度なサービスを利用できるという点で、他のサービスとは一線を画する。
あとは System Entities で人名も取得できるようになれば最高なのだが……

hachidori

会話フロー作成ツール上でテストすることはできないので、LINE や Facebook に実際に連携してからでないと動作は確認できない。(連携自体は簡単)
しかし、カルーセルやボタン、スタンプなどを簡単に設定できる機能があり、それらはかなり有用。
また、お店の予約システムに使えるカレンダー機能や、クエリー(Entityのようなもの)の定義も可能。(System Entities は無い)
API は無いがテンプレートという機能を使って外部のシステムと情報のやり取りは可能。

マニュアルはないが、各画面の下部に説明があるので、それほど困ることはない。
対してチュートリアルはあるが、実際の動作を見るには上記の通り LINE や Facebook に接続する必要がある。

特徴であるカレンダー機能や LINE のスタンプなどを利用したいのであれば候補にはなるが、無料版だと制限がきつく Repl-AI に見劣りしてしまうのが難。

Dialogflow

https://dialogflow.com/
旧 Api.ai 。
そもそも無料しかない。 ← Google Cloud にサポートのついた Dialogflow Enterprise Edition が登場しました。
Dialogflow のボット(エージェント)数は GOOGLE PROJECT 依存なんだと思う。
その他、数に制限があるのかわからない。(無いっぽい)

インターフェイスは英語だが、日本語の処理には対応済み。(ただし Intent や Entity の名称には日本語を使わないほうが良さそう)

音楽アーティストなども取得できる System Entities の豊富さと、連携できるサービスの数が他の追随を許さない。
一問一答できれば良いチャットボットならこれで充分だが、それ以上を望む場合にはちょっと力不足なのは否めない。

現状、今回取り上げたサービスで唯一、テキストではなく音声ファイルを送りつけても単独で処理できるサービスでもある。