// position_log_sample.go
// position_logから座標情報を読み出すサンプル (要pq)
// go get github.com/lib/pq
package main
import (
"fmt"
"os"
"database/sql"
_ "github.com/lib/pq"
)
const port int = 8910 // DBコンテナが公開しているポート番号
func trackUser(db *sql.DB, userID int, dateIndex int) {
// SQLステートメント
sql := "SELECT id, to_char(time, 'HH24:MI:SS'), x, y, satisfaction FROM position_log "
sql += " WHERE date_index = $1 AND user_or_bus = 'USER' AND id = $2;"
prepared, err := db.Prepare(sql)
rows, err := prepared.Query(dateIndex, userID)
if err != nil {
fmt.Printf("error : %v", err)
os.Exit(1)
}
fmt.Printf("time, x, y, satisfaction (userID: %v)\n", userID)
for rows.Next() {
var id int
var timestr string
var x float64
var y float64
var satisfaction float64 // 満足度・現実装では、リクエスト発行直後に変化する
rows.Scan(&id, ×tr, &x, &y, &satisfaction)
fmt.Println("-", timestr, x, y, satisfaction)
}
}
func trackBus(db *sql.DB, busID int, dateIndex int) {
// SQLステートメント
sql := "SELECT id, to_char(time, 'HH24:MI:SS'), x, y FROM position_log "
sql += " WHERE date_index = $1 AND user_or_bus = 'BUS' AND id = $2;"
prepared, err := db.Prepare(sql)
rows, err := prepared.Query(dateIndex, busID)
if err != nil {
fmt.Printf("error : %v", err)
os.Exit(1)
}
fmt.Printf("time, x, y (busID: %v)\n", busID)
for rows.Next() {
var id int
var timestr string
var x float64
var y float64
// var satisfaction float64 バスの満足度はNULL
rows.Scan(&id, ×tr, &x, &y)
fmt.Println("-", timestr, x, y)
}
}
func main() {
// db: データベースに接続するためのハンドラ
var db *sql.DB
// Dbの初期化
dbParam := fmt.Sprintf("host=localhost port=%d user=postgres password=ca_sim dbname=ca_sim sslmode=disable", port)
db, err := sql.Open("postgres", dbParam)
if err != nil {
fmt.Println("cannot open db")
os.Exit(1)
}
dateIndex := 1 // 1日目
busID := 8 // バス番号
userID := 11 // ユーザ番号
trackBus(db, busID, dateIndex)
trackUser(db, userID, dateIndex)
}
postgreSQLからデータを読み出すGOプログラムサンプル
【PostgreSQL】Windows に psql コマンドだけをインストールする手順
PostgreSQLのデータベースは、全部Dockerの中に閉じ込めることにしたので、バージョン管理とかを忘れることができてストレスフリーです。
でも、Windows10から、ちょいちょいっと、DBの中を見たい時にpsqlがないのは不便です。
ですので、ここを参照させていただきpsqlだけインストールしました。
ちなみに、どのシェルでも使えるように、私は、PATHはこっちに書き込みました。
以上
パワーポイントの音声録音のホワイトノイズが酷いので、Windows 10 の「ボイスレコーダー」を使い、音声の録音をった件
パワーポイントに比べると、ホワイトノイズは気にならない程度まで小さくなっていました。
あとは、パワポの音声としてリンクすれば、完成です。
Windows10 音声 録音 ホワイトノイズ ノイズ
SAIのブラシ濃度を使った場合の効果
SAIのブラシ濃度を変更した場合、こんな感じになります。
kobore.netやwp.kobore.netのバックアップ機を作成する
どなたか、良いアイデアを頂けませんか?
(1)最初にhttp://192.168.0.19(ローカル) でアクセスしたWebサーバのコンテンツに記載された"*.kobore.net"のIPアドレスは、無条件で"192.168.0.19"に変換されて、自分のサーバにループしてアクセスさせるようにする方法です。
(2)http://kobore.net でアクセスした場合は、従来通りの反応をする
「kobore.netや、wp.kobore.netが、事故でクラッシュした」時でも運用が続けられるように、先日、Raspberry Pi 4のセット一式を購入しました。
これです。
説明書が不親切なので、組立方の手順を簡単に残しておきます。
(1)基盤を一番下のプラ板に設置
(2)基盤に放熱版(3つを設置) # 虫めがねとピンセットがないと辛いかも
(3)ファンを設置する(方向は、#(多分)コードがプラ版につく方向だと思う
経験的に、ラズパイをサーバとして使うと、夏場に熱でダウンすることは知っていますので、今回は「冷却(といっても空冷だけど)」に投資しています。
私、通常はubuntuなのですが、今回は、SDカードにプレインストールされていたOSをそのまま使うことにしました(SDカード焼き込みとか、面倒なので)
ちなみに、HDMIのインターフェースが、Pi3から変っています(MiniHDMIになっている)ので、こんなのも追加で購入しました。
取り敢えず、部屋の中のWiFiに繋いで、apt-get install, update, upgradeを実施中です。
======
GUIから、SSHサーバの設定ができる
これだけ。これでTeraTerm IPアドレス(192.168.0.19)、ポート22 でアクセスできるようになりました。
さてWebサーバは、apache と nginx の2択がありますが、今回はnginxを使うことにしました。理由は、最近、これしか使っていないからです。その他、色々メリットもあるようです。
さて、次はngnixの構築だけど、ここで(私は)初めて、ufwなるもの設定する必要が出てきたので、メモを残しておきます(なんでもiptablesのコマンドライン設定ツールだとか)。
$ sudo apt-get install ufw
は、さくっとできたのですが、状態を調べたら
$ sudo ufw status
ERROR: Couldn't determine iptables version
てなものが出てきます。sudo rebootで、
$ sudo ufw status
Status: inactive
となりました。
では、全アクセスを禁止した上で、sshポート(22)だけをオープンしておきます。
$ sudo ufw default deny
Default incoming policy changed to 'deny'
(be sure to update your rules accordingly)
$ sudo ufw allow 22
Rules updated
Rules updated (v6)
次に、ufwを有効化します。
$ sudo ufw enable
Command may disrupt existing ssh connections. Proceed with operation (y|n)? y
Firewall is active and enabled on system startup
再度状態を確認します
$sudo ufw status
Status: activeTo Action From
-- ------ ----
22 ALLOW Anywhere
22 (v6) ALLOW Anywhere (v6)
とりあえず、web用に80と443をオープンしておきます。
$ sudo ufw allow 80
Rule added
Rule added (v6)
$ sudo ufw allow 443
Rule added
Rule added (v6)
$ sudo ufw status
Status: activeTo Action From
-- ------ ----
22 ALLOW Anywhere
80 ALLOW Anywhere
443 ALLOW Anywhere
22 (v6) ALLOW Anywhere (v6)
80 (v6) ALLOW Anywhere (v6)
443 (v6) ALLOW Anywhere (v6)
と、こんなところで準備完了かな?
ためしに、http://192.168.0.19をやってみたところ、成功しました。
https://192.168.0.19 は失敗しますね。
当然ですね。まだ、秘密鍵も仕込んでいませんし。まあ、とりあえずこちらは後回しにして、kobore.netからコンテンツのフルダウンロードをします。
sshを使ってシェルにログインした後(詳細は「ホームページのフルバックアップ」を参照
$cd /home/kobore
$cp -r www www2 // Don't touch "www" itself
$tar -czvf www2.tgz www2
$mv www2.tgz www.kobore.net.20210713.tgz
$rm -r www2 // Never delete directory "www"
でもって、
"www.kobore.net.20210713.tgz" をローカルにダウンロードする
そんでもって、これをさらに、teratermの「ファイル(F)→SSH SPC...」でもってラズパイに送り込みます。
ちなみにkoboreというアカントは予め作っておいて、そちらにSSHログインしておきます。
ちなみに、kobore.net → ローカルPCのダウンロードに4時間、さらにラズパイへの転送に4時間かかりました。
でもって、
tar zxvf www.kobore.net.20210731.tgz
で解凍します。
$mv www2 www
として、とりあえずコンテンツの配置は完了。さて、次は、ngnixに、この、/home/kobore/wwwをリンクさせます。
/etc/nginx/sites-available/default の、ここだけを変更
これで変更できて、http:/192.168.0.19 で表示を確認しましたが・・・
ここで「どエラい見落し」を見付けました。
ラズパイの中の、/home/kobore/wwwに記載された、"kobore.net"は、全部、本物のサーバに向かってしまい、ラズパイの中のコンテンツには向かない
考えてみれば当然です。これでは、ラズパイの中にindex.shtmlのリンクを張っただけのことで、サーバとしては全く役に立ちません。
江端家ネットワーク内に、DNSサーバを立てることもできるけど、そうしてしまったら、本家の、kobore.netにアクセスできなくなるし、"*.kobore.net"→"192.168.0.19"と強制的に書き換えすることもできるけど、かなり面倒な作業になるし、美しくない。
ラズパイの中のみで作業をする、という手もあるけど、江端家ネットワーク内のPCから、こちらのサーバも使いたい(特に、ローカルなWordPressに、守秘情報を保存したい)
DNSサーバに、"*.kobore.net"→"*.local.kobore.netとして、"192.168.0.19"と書き込むか? 先ずできるとは思えないし、モラルとしても論外だろうなぁ。
という訳で、
どなたか、良いアイデアを頂けませんか?
(1)最初にhttp://192.168.0.19(ローカル) でアクセスしたWebサーバのコンテンツに記載された"*.kobore.net"のIPアドレスは、無条件で"192.168.0.19"に変換されて、自分のサーバにループしてアクセスさせるようにする方法です。
(2)http://kobore.net でアクセスした場合は、従来通りの反応をする
ホスト名 http://raspberrypi/ でアクセスできることを確認した。ならば、ホスト名を変えみようか。"koborepi", "tech_koborepi", "wp_koborepi" とか複数の名前を設置できるか?試してみよう
(参考文献)
【ど忘れシリーズ】tarコマンドのzxvfのおさらい
UbuntuにNginxをインストールしてWebサーバー構築【マルチドメイン】
Amazonアソシエイトのテキストリンクの"HTML取得"ボタンを押しても、プレビューにHTMLが全く表示されなくなった件
これは困った・・・
Amazon Associates アマゾン アソシエート アソシエートID アクセスキー シークレットキー
あたりを弄った後で、できなくなったのは間違いなのだけど・・・
で、Amazonに質問を出したところ、以下の回答を頂きました。
|
現在、Chromoを使っているので、まずキャッシュを削除してみました → 効果なし
ブラウザをIEにして試してみました → 表示されました
まあ、取り敢えず、当面の間は必要な時に、IE立ち上げて対応する、で対応することといたします。
アンケートフォーム
<html>
<head>
<title>アンケートフォーム</title>
</head>
<body>
<form action="mailto:sea-anemone2021@google.com" method="post" enctype="text/plain">
<table>
<tr>
<td colspan="2">
<strong>アンケートフォーム</strong>
</td>
</tr>
<tr>
<td>
<strong>アクセスナンバー:</strong>
</td>
<td>
<input type="text" name="アクセスナンバー" maxlength="5">
</td>
</tr>
<td >
<strong>普段いらっしゃる場所:</strong>
</td>
<td>
<select name="普段いらっしゃる建屋">
<option>土木棟</option>
<option>理工学棟</option>
<option>図書館</option>
<option selected>学生食堂</option>
<option>文学部棟</option>
<option>それ以外</option>
</select>
</td>
<td >
<strong>パソコン歴:</strong>
</td>
<td>
<input type="checkbox" name="パソコン歴" value="一年未満">一年未満
<br>
<input type="checkbox" name="パソコン歴" value="一年以上">一年以上
</td>
</tr>
<tr>
<td colspan="4">
<strong>メッセージ:</strong>
<br>
<textarea name="メッセージ" rows="5" cols="75"></textarea>
</td>
</tr>
<tr>
<td>
<strong>あなたのIDは以下になります。大切に記録しておいて下さい。</strong>
<center>
<!--タグはここから--><table border="0" cellspacing="0" cellpadding="0"><tr><td align="center"><a href="http://www.rays-counter.com/"><img src="http://www.rays-counter.com/d451_f3_022/5e2836308f717/" alt="アクセスカウンター" border="0"></a></td></tr><tr><td align="center"><img src="http://www.rays-counter.com/images/counter_01.gif" border="0"><img src="http://www.rays-counter.com/images/counter_02.gif" border="0"><img src="http://www.rays-counter.com/images/counter_03.gif" border="0" alt=""><img src="http://www.rays-counter.com/images/counter_04.gif" border="0"><img src="http://www.rays-counter.com/images/counter_05.gif" border="0" ></td></tr></table><!--ここまで-->
</center>
<tr>
<td colspan="2">
<input type="submit" value="送信する">
</td>
<td colspan="2">
<input type="reset" value="やり直し">
</td>
</tr>
</table>
</form>
</body>
</html>
―― お前なら、じゃじゃ降りの雨を見ながら、午後からの試合の実施を決断できるか?
入社して数年後に、会社のテニス部の部長をやっていたことがありました。
A few years after I joined the company, I was the head of the company's tennis club.
社内テニストーナメントの当日、朝から雨がじゃじゃ降りの状態だったので、私は、参加者に対して、メールで中止を指示しました。
On the day of the in-house tennis tournament, it had been heavy raining since the morning, so I sent an email to the participants instructing them to cancel the tournament.
ところが午後になると、天気は一転し、晴天になりました。
In the afternoon, however, the weather changed and it became sunny.
参加者からは、『午後からは、晴れるという予想があったんだから・・・』という不満の声が上がっていました。
Some of the participants complained, "The weather forecast said it would be sunny in the afternoon...."
しかし、私は、
However, I wanted to ask them
―― お前なら、じゃじゃ降りの雨を見ながら、午後からの試合の実施を決断できるか?
"Would you be able to make the decision to hold the game in the afternoon while watching the heavy rain pour down?"
と、問いたいと思いました。
仮に午後から晴れたとしても、開催が延期になるだけのことです。
Even if the weather cleared in the afternoon, the event would only be postponed.
雨の中での試合を強行するよりは、ずっとマシなはずです。
It should be much better than forcing the game to be played in the rain.
このように、「中止」とか「延期」とかは、『問題を先送りにする』という最適戦略なのです。
Thus, "cancel" or "postpone" is the optimal strategy to 'postpone the problem'.
-----
ただ、この「中止」とか「延期」は、『何度も切れないカード』というのも事実です。
However, it is also true that "cancel" or "postpone" is a card that cannot be played again and again.
上記の例であれば、次回のトーナメントについては、『どしゃ降りの中での試合の実施』か『本年度の社内トーナメントの中止』のどちらかの決断を強いられることになるでしょう。
In the above example, for the next tournament, we will be forced to make a decision between 'playing in a downpour' or 'cancelling this year's in-house tournament'.
実施担当者であれば、『どしゃ降りの中での試合の実施』を選び易くなるのは、当然と言えます。
If you are in charge of implementation, it is only natural that you would be more likely to choose to hold the game in a downpour.
・・・いえいえ、単なる「思い出」の話です。
...No, no, it's just a memory.
-----
そういえば、昨日、第4度目の緊急事態宣言 + 東京五輪の1都3県の「無観客開催」が決定したようです。
Oh, by the way, it seems that yesterday, the fourth state of emergency was declared + the decision was made to hold the Tokyo Olympics in one or three prefectures "without spectators".