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



go func() { defer close(done) for { _, message, err := c.ReadMessage() if err != nil { log.Println("read:", err) return } log.Printf("recv: %s", message) } }() ticker := time.NewTicker(time.Second) defer ticker.Stop() for { select { case <-done: return case t := <-ticker.C: err := c.WriteMessage(websocket.TextMessage, []byte(t.String())) if err != nil {

go func()で、defer close(done)が効いてくるまで、 case <-done:はロックされて、デッドロックになるじゃないか? と、ずっと考えて訳が分からなくなってきたところで、Go言語でチャネルとselect というページに、

チャネルに値が入っていない場合、受信はブロックする。ブロックせずに処理を行いたい場合は select を使う。

そんなSwitchの使いかた、あるかーーーー! と、叫びそうになりました(私の2時間を返せ)

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

C/C++では、構造体を丸ごと送信するのに、文字列にキャストを被せて無理矢理送り込むということをやっていました。

Goの場合、チャネルに ch chan interface{}を使うと、何でも運んでくれるようなので、これで同じように「手を抜く」を考えていました。

で、色々試した結果、こういう風に使えるらしいので自分用のメモとして残しておきます

// 単一通信の構造体
type SingleCaster struct {
	//ch   chan int   // 単一通信路
	ch   chan interface{}
	lock sync.Mutex // 単一通信路のロック
}

でもって、

type locInfo struct {
	lon float64
	lat float64
}
でもって、
type PERSON struct {
    number      int     // 人間番号
    live        bool    // 存在フラグ 存在:true 消滅:false
    destination locInfo // 出発座標
    arrival     locInfo // 到着座標
    distance    float64 // 到着座標と出発座標の距離
    present     locInfo // 現在位置
}

を、こんな風に運びたい時、

sc_person.ch <- person.present

これで、元に戻ります。

case v_p := <-sc_person.ch:
			fmt.Println("catched from person send", v_p)
			//var ll locInfo
			ll := v_p.(locInfo)
			fmt.Println(ll.lon, ll.lat)

channelで構造体を送り込む方法

var ch1 chan interface{}

type PERSON struct {
	number      int     // 人間番号
	action      int     // 0:リクエスト 1:乗車 2:降車
}

func sub1(){
	 var person PERSON
	 person.number = 1
	 person.action= 2

	 ch1 <- person 
} 

func sub2(){

	 p := <-ch1

	 person := p.(PERSON)
	 fmt.Println(person) 
}

2022/01,江端さんの技術メモ

「Microsoft Edgeをアンインストールせよ」の旨の指示がやってきたのですが、通常のアンインストールの方法では、できないように設定されているようです。

調べたら、ここにやりかたが書いてあったので、その通りに実行してみました。

①検索フォームに「cmd」と入力
②「コマンドプロンプト」を右クリックし
③「管理者として実行」しましょう

C:\>cd "Program Files (x86)\Microsoft\Edge\Application"
C:\Program Files (x86)\Microsoft\Edge\Application>dir

そこに出てくる、数字(ここでは、98.0.1108.50)を捜して下さい

C:\Program Files (x86)\Microsoft\Edge\Application>cd 98.0.1108.50
C:\Program Files (x86)\Microsoft\Edge\Application\98.0.1108.50>cd Installe

として、ここから、このコマンドを入力します。

setup --uninstall --force-uninstall --system-level

アンインストールの画面が、以下のようになっていれば成功です。

以上

2022/01,江端さんの技術メモ

とかとか作ったので、これをPrumeClusterで使いたいときの、JavaScriptの書き方

if (obj.id == 0){  // idが未登録の場合
			console.log("obj.id == 0")
			// データをマーカーとして登録
			// var marker = new PruneCluster.Marker(obj.lat, obj.lng);

			// 参考資料  http://embed.plnkr.co/WmtpkEqSDJFuFeuiYP54/
			//var marker = new PruneCluster.Marker(obj.lat, obj.lng);
			var marker = new PruneCluster.Marker(obj.lat, obj.lng, {
				popup: "Bell 206 ",
				icon: L.icon({
					//iconUrl: 'http://sintef-9012.github.io/PruneCluster/examples/helicopter.png', 
					iconUrl: 'http://localhost:8080/static/person-icon.png', 
					//iconUrl: 'helicopter.png', 
					//iconSize: [48, 48] 
				})
			});

2022/01,江端さんの技術メモ

以下の"main.go"が、c:\user\ebata\go_template\testsにあるとする。

package main

import (
	"log"
	"net/http"
)

func main() {

	// アクセスされたURLから /web 部分を取り除いてハンドリングする
	http.Handle("/web/", http.StripPrefix("/web", http.FileServer(http.Dir("static"))))

	if err := http.ListenAndServe(":8686", nil); err != nil {
		log.Fatal("ListenAndServe: ", err)
	}
}

で、c:\user\ebata\go_template\tests の下に、staticというディレクトリを掘って、そこに、画像ファイル(例:helicopter.png)を放り込んでおく。

で、go run main.goを起動して、ブラウザから、
http://localhost:8686/web/helicopter.png
と入力すると、画像が出てきます。

注意

http.Handle("/web", では動きません。

http.Handle("/web/", で動きます。

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

2022/01,江端さんの技術メモ

AmazonJSをインストールしたら、新規投稿画面に、こんなものが出てくるようになった。

さて、これに手を入れるべきか否か? 自動更新に任せて暫く放置するか。
色々手を入れて、wordpressが立ち上がらなくなった時は青冷めたしなぁ。

とりあえずターゲットのコードだけ書き出しておきます。

% pwd
/home/kobore/www/wp/wp/wp-content/plugins/amazonjs/js
% more tinymce-plugin.js
(function() {
        tinymce.PluginManager.add( 'amazonjs', function( editor, url ) {
                editor.addButton('amazonjs', {
                        title: amazonjsAdmin.mce.buttonTitle,
                        image: url + '/../images/amazon-icon.png',
                        onclick: function () {
                                editor.windowManager.open({
                                        title: amazonjsAdmin.mce.dialogTitle,
                                        url: amazonjsAdmin.mce.dialogUrl,
                                        width: $(window).width() * 0.9,
                                        height: $(window).height() * 0.9,
                                        id: 'amazonjs-insert-dialog'
                                });
                        }
                });
        });
})();
%

どうも原因が見あたらないのですが、

https://postgresweb.com/err-wordpress-failed-to-load-plugin-url

を見て、思い当たることがありあした。私も、chromoに"uBlock origin"という広告表示ブロックプラグインを入れていました。

これを一時外してみたら、メッセージが消えて、

が出てきました。まだ、リンクには失敗していますが、とりあえず第一の問題点は越えたか、と。

2022/01,江端さんの技術メモ

私は普段、PostgreSQLを使っています。主な理由は、PostGISを使いたいからですが、サーバとして立ち上げる必要があるので、そこそこ面倒くさいです。

dockerでPostGISを入れたPostgreSQL環境構築

1つのアプリケーションだけで使えれば良い、と割り切るのであれば、SQLite3が便利だと聞きましたので、golangでちょっと使ってみました。

golangで、SQLiteを使ってDB構築の手を抜く

アプリで使えて、SQL文が使えるようにするために、SQLite3をインストールしてみました。忘れないうちに、手順を記録しておきます。

https://www.sqlite.org/

で、

をダウンロードして解凍して、c:\sqlite3を作って、ここの中に放り込む。

で、あとは、c:\sqlite3にパスを通しておく。

これで環境構築は完了です。

あとは、csvファイルからDBを作ってみます。

まず適当なディレクリを掘ります。

https://people.sc.fsu.edu/~jburkardt/data/csv/csv.htmlあたりから、サンプルのcsvファイル("biostats.csv","cities.csv"あたり)をダウンロードして、ちょっと加工しました(空白とか、ダブルコーテーションを削除)。

biostats.csv
cities.csv

をクリックしてダウンロードする。

これで、このデイレクトリの中に、test_dbというデータベースファイルができます。
この中には、2つのデータベース、 biostats, cities が入っています。
これらのDBは、原則としてSQL文が使える(みたい)です。

"sqlite> .exit" で、コマンドプロンプトに戻れます。

で、もって、 "sqlite3 test_db" でDBをSQL文で使えるようになります。

あと、日本語を使えるようにする問題が、未解決ですが、まあなんとかなるでしょう。

取り敢えず、今日のところは、ここまで。

以上