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

Windows10のgolangのバージョンを上げる為に、古いバージョンをアンインストールして最新版(go version go1.17 windows/amd64)をインストールしました。

ところが、

// client.go

// Copyright 2015 The Gorilla WebSocket Authors. All rights reserved.
// Use of this source code is governed by a BSD-style
// license that can be found in the LICENSE file.

// +build ignore

package main

import (
        "flag"
        "log"
        "net/url"
        "os"
        "os/signal"
        "time"

        "github.com/gorilla/websocket"   ← ココ
)

var addr = flag.String("addr", "localhost:8080", "http service address")

で、こんなエラーが出てきます。

$ go run client.go
client.go:19:2: no required module provides package github.com/gorilla/websocket
: go.mod file not found in current directory or any parent directory; see 'go he
lp modules'

で、まあ、これは、いつものアレだな、と思い、

$go get github.com/gorilla/websocket

を対応したのですが、どういう訳か、このエラーが取れません。

ebata@DESKTOP-P6KREM0 MINGW64 ~/dummy/go_echo
$ go mod init go_echo  ← "go_echo"という名前にしたのは、ディレクトリ名に合わせただけ
go: creating new go.mod: module go_echo
go: to add module requirements and sums:
go mod tidy

で、

ebata@DESKTOP-P6KREM0 MINGW64 ~/dummy/go_echo
$ go get github.com/gorilla/websocket
go get: added github.com/gorilla/websocket v1.4.2

として、中を調べてみたら、こんな感じになっていました。

ebata@DESKTOP-P6KREM0 MINGW64 ~/dummy/go_echo
$ more go.mod
module go_echo

go 1.17

require github.com/gorilla/websocket v1.4.2 // indirect

で、まあ、以下のように動作を確認できました。

ebata@DESKTOP-P6KREM0 MINGW64 ~/dummy/go_echo
$ go run client.go
connecting to ws://localhost:8080/echo

よく分かりませんが、どうやら動かし方が変ったようです ―― 面倒くさいですけどね

さて、加えて、Visual Studio Code で、Golangのプログラムのデバッグですが、こっちも上手く動かなくなっていて、困っています。

で、今あきらかなことは、(1)上記のgo.modを作ることと、(2)1つのディレクトリに中には1goファイルを1つだけ入れること、そして、(3)setting.jsonを作ることです。

ebata@DESKTOP-P6KREM0 MINGW64 ~/dummy/go_test
$ more setting.json

{
    "go.gopath" : "C/go"
}

私の場合、C:\goにインストールしているので、上記のように記載しています。

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>