2021/08,江端さんの技術メモ

// 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, &timestr, &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, &timestr, &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)
}

2021/08,江端さんの技術メモ

PostgreSQLのデータベースは、全部Dockerの中に閉じ込めることにしたので、バージョン管理とかを忘れることができてストレスフリーです。

でも、Windows10から、ちょいちょいっと、DBの中を見たい時にpsqlがないのは不便です。

ですので、ここを参照させていただきpsqlだけインストールしました。

【PostgreSQL】Windows に psql コマンドだけをインストールする手順

ちなみに、どのシェルでも使えるように、私は、PATHはこっちに書き込みました。

 

 

以上

 

2021/08,江端さんの技術メモ

パワーポイントに比べると、ホワイトノイズは気にならない程度まで小さくなっていました。

あとは、パワポの音声としてリンクすれば、完成です。

Windows10 音声 録音 ホワイトノイズ ノイズ

 

2021/08,江端さんの技術メモ

SAIのブラシ濃度を変更した場合、こんな感じになります。

2021/07,江端さんの技術メモ

どなたか、良いアイデアを頂けませんか?

(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のセット一式を購入しました。

―― もし、kobore.netや、wp.kobore.netが、事故でクラッシュしたらどうしよう?

これです。

説明書が不親切なので、組立方の手順を簡単に残しておきます。

(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: active

To 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: active

To 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サーバー構築【マルチドメイン】

2021/07,江端さんの技術メモ

これは困った・・・

Amazon Associates アマゾン アソシエート アソシエートID アクセスキー シークレットキー

あたりを弄った後で、できなくなったのは間違いなのだけど・・・

で、Amazonに質問を出したところ、以下の回答を頂きました。

江端様

Amazon.co.jpアソシエイト・プログラムにお問い合わせいただき、ありがとうございます。

当プログラムにて確認いたしましたが、問題なくプレビューにHTMLが表示され、取得出来ることを確認いたしました。

また、現在不具合報告はなく、同様のお問い合わせもございません。

ご連絡の件につきましては、下記の点をお試しください。

・ご利用ブラウザのcookieならびに一時ファイル(キャッシュ)を削除のうえ、更新をお試しください。
※cookieならびに一時ファイル(キャッシュ)を削除いただく場合、お手数ではございますが、事前に重要なデータをバックアップしてから削除をお試しください

・異なるブラウザでも同様となるのかをお試しください。
※Internet Explorer、Firefox、Chromeの3つは必ずお試しください。

アソシエイト・プログラムをご利用いただき、ありがとうございます。

 

Amazon.co.jp カスタマーサービス アソシエイト・プログラムスタッフ
ご利用ありがとうございました。
Amazon.co.jp
以下のボタンから、お客様のご意見をお送りください。

 

現在、Chromoを使っているので、まずキャッシュを削除してみました → 効果なし

ブラウザをIEにして試してみました → 表示されました

まあ、取り敢えず、当面の間は必要な時に、IE立ち上げて対応する、で対応することといたします。

 

 

2021/07,江端さんの技術メモ

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

2021/07,江端さんの技術メモ

入社して数年後に、会社のテニス部の部長をやっていたことがありました。

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