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/", で動きます。

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,江端さんの技術メモ

おそらくAmazonで購入できる、日本で(世界でも?)もっとも安価な3Dプリンタの一つを購入しました。

お世話になっている同僚から「迷っているようなら、一番安いものを、とっと買って試した方がいい」と言われたことに因ります。1日の勉強代としてペイするくらいの値段です。

で、まあ、このメモを読んで、購入する人もいると思いますので、最初に申し上げると、「添付マニュアルの記載はゴミです(日本語ページも5Pしかない)ので、これを日本語字幕ONにして、このビデオクリップのまま実施することをお勧めします。

こっち↓が公式ですが、上の方が分かりやすいと思う(日本語字幕をONにすれば)

台座の位置調整が大切で、「A4の紙が入る程度」と説明されていますが、「A4の紙を入れるとちょっと抵抗がある程度の調整する」ほうが良いです。

これをいい加減にやると、

になります。

で、この調整の際に、電源外して、台座を動かすのですが、これが「固く」て結構怖いですが、力づくで動かして下さい(電源外していることが重要です)。

現時点では、パソコンから直接印刷することができなくて(できるのかしれないけど、まだ分からん)、SDカードから読みとらなければなりません。

今日一日で分かったこと

■3Dプリンタの印刷時間が半端なく長い。キーホルダー程度のブツに、約1時間
■この格安プリンタのできあがりは、シャレにならないくらいキレイ
■アームやら台座やらは、ある程度力づくで動かしてもOK(キャリブレーションがずれるということもなさそう)

で、今日一日の結果として、経験的に分かったことを、記載しておきます(多分、私だけしか分からん内容)。

これが、印刷中の外観。

で、大切なのが「操作の順番(手順)」


SDカードしか使えないのであれば、『このUSBケーブルは一体何の為にあるんだろう? 』と思っていますが、今日は、この辺で切り上げたいと思います。

で、今日の成果(失敗も多かったですが)です。右の舟を作っている途中で、添付した溶剤(フェラメント)が無くなりました。

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文で使えるようになります。

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

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

以上

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

keyword WTC 5331 WK panasonic あけたらタイマ 実家

先程、玄関(外と中)の電灯も、自動的に点灯/消灯する装置を設置しました。

 

image.png

18:30 ± 30分 に点灯し、 23:30 ± 30分 に消灯するようにセットしておきました。
今、実験しています。


基本的には、私が帰省する時に設定しなおせば良いと思っていますが、
この設定、多分ラジカセより簡単だと思いますので、設定を試みて頂けると助かります。
(ちなみにラジオの方が動いているのは、内蔵の電池が停電中も電力を供給し続けているからです)

マニュアルをここに置いておきました(ちなみに館の2Fのテーブルの上にも、分かるように置いてあります)
http://kobore.net/genkan.pdf

が、マニュアルなんぞ読むのは面倒でしょうから、

まず、

でボタンを確認して、

の赤枠でかこった部分をまねて操作して下さい。

万一設定に失敗しても、問題は発生しませんので、御安心下さい。

智一


停電後に、このスイッチが動かなくなった時の普及の方法は簡単です。

玄関のタイマー直しておきました。

写真の赤色のボタンを押して時刻(2400表記)を直すだけで、あとは何もしなくても大丈夫のようです(設定ボタンなどの操作不要)。

 

 

 

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

背景は、

階段の電気をつけっぱなしにすると、3分後にブザーが鳴るシステムを作ってみた

に記載した通りなのですが、家族から「警告音がうるさい!」と文句を言われて、システムを停止させております。

そこで、添付ファイルのようなものを実現したいと考えています。ただ、これを実現する回路図や、または、製品を見つけられずにおります。

ご知見のある方のアドバイスをお待ち申し上げております。


追記:読者の方から、「遅れ消灯スイッチ」
https://www2.panasonic.biz/ls/densetsu/haisen/switch_concent/cosmo_wide21/lineup/switch/delay/

を勧めて頂きました。しかし、私の環境では、階段に設置する3つのスイッチ(3路、4路スイッチ)を使うもの(私が、説明していませんでした)で、このデバイスは使えないと思います。


追記:さらに読者の方から「あけたらタイマ」の利用を教えて貰いました。
https://www2.panasonic.biz/ls/densetsu/haisen/switch_concent/cosmo_wide21/lineup/switch/timer/

『このスイッチ(親機、WTC5332W)はタイマー機能のほか、遅れ消灯機能もあります。これと、子機WT5652を3路の位置、Wt5654を4路の位置に使用すれば、いずれのスイッチからも遅れ消灯が可能かと思われます。』

仕様書を読んでみたら、ドンピシャと思われる記載がありました。

なるほど、これならできる(かもしれない)。

合計金額が、7900円 + 2600円 + 2900円 = 13000円 になりますね。

これでちゃんと動くのであれば、この出資には意味がありそうです。しかも、居留守対策もできそうです。

というか、この装置を買って、分解して、リバースエンジニアリングしてみてもいいな、と思っています。


ちなみに、居留守対策装置は、実家でも稼動中です。

実家の玄関のタイマーの設定

 

 

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

<論説の4要素>
(1)解説 (物事がどのようにして、なぜ起こるのかを説明する)→現在形
(2)叙述 (何が起ったのか述べる)→過去形
(3)描写 (図表によるイメージを与える)→現在形
(4)論拠 (理由を挙げることによって納得させる)→現在形

アブストラクト(要約)は通常現在形で書く→(1)解説
サマリー(概要)は通常過去形で書く→(2)叙述
■過去の研究(例えば参考文献にある)は通常過去形で書く→(2)叙述
恒久施設現在形で書く→(1)解説
特定の研究の為の実験手順および装置過去形で書く→(2)叙述
図表に示された結果現在形で書く→(3)描写
研究した試薬品、資料等の挙動過去形で書く→(2)叙述
結論部分では、結論そのものを除いては通常過去形で書く
導かれた結論(演繹)は、研究調査の条件に関係なく「一般真理」であるので、現在形で書く→(1)解説

仮定法は、書き手が「強い疑いを暗示したい場合」のみに使用する

(出典:NASAに学ぶ英語論文・レポートの書き方)

 

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

私が普段使っているDBは、PostgreSQLを使っているのですが、構築手順が面倒くさいし、なによりDBサーバ立てるのを省略したかったです。

ですので、SQLiteを使ってDB構築の手を抜くことにしました。

今日のところは、mattn/go-sqlite3 に _example/simple/simple.go というサンプルファイルがあったので、これを動くことを確認するところまでやりました。

/*
	C:\Users\ebata\kese\gonet-html\1-1
	go get github.com/mattn/go-sqlite3

	どういう訳か、VSCodeのデバッグでトレースができなかったので、fmt.Println("----->10") と入れて確認をしている。
	このプログラムは、

*/

package main

import (
	"database/sql"
	"fmt"
	"log"
	"os"

	_ "github.com/mattn/go-sqlite3"
)

func main() {
	os.Remove("./foo.db")

	fmt.Println("----->10")

	db, err := sql.Open("sqlite3", "./foo.db")
	if err != nil {
		log.Fatal(err)
	}
	defer db.Close()

	sqlStmt := `
	create table foo (id integer not null primary key, name text);
	delete from foo;
	`
	_, err = db.Exec(sqlStmt)
	if err != nil {
		log.Printf("%q: %s\n", err, sqlStmt)
		return
	}

	fmt.Println("----->9")

	tx, err := db.Begin()
	if err != nil {
		log.Fatal(err)
	}

	fmt.Println("----->8")

	stmt, err := tx.Prepare("insert into foo(id, name) values(?, ?)")
	if err != nil {
		log.Fatal(err)
	}
	defer stmt.Close()
	for i := 0; i < 100; i++ {
		_, err = stmt.Exec(i, fmt.Sprintf("こんにちわ世界%03d", i))
		if err != nil {
			log.Fatal(err)
		}
	}
	tx.Commit()

	fmt.Println("----->7")

	rows, err := db.Query("select id, name from foo")
	if err != nil {
		log.Fatal(err)
	}
	defer rows.Close()
	for rows.Next() {
		var id int
		var name string
		err = rows.Scan(&id, &name)
		if err != nil {
			log.Fatal(err)
		}
		fmt.Println(id, name)
	}

	fmt.Println("----->6")

	err = rows.Err()
	if err != nil {
		log.Fatal(err)
	}

	fmt.Println("----->5")

	stmt, err = db.Prepare("select name from foo where id = ?")
	if err != nil {
		log.Fatal(err)
	}
	defer stmt.Close()
	var name string
	err = stmt.QueryRow("3").Scan(&name)
	if err != nil {
		log.Fatal(err)
	}
	fmt.Println(name)

	fmt.Println("----->4")

	_, err = db.Exec("delete from foo")
	if err != nil {
		log.Fatal(err)
	}

	fmt.Println("----->3")

	_, err = db.Exec("insert into foo(id, name) values(1, 'foo'), (2, 'bar'), (3, 'baz')")
	if err != nil {
		log.Fatal(err)
	}

	fmt.Println("----->2")

	rows, err = db.Query("select id, name from foo")
	if err != nil {
		log.Fatal(err)
	}
	defer rows.Close()
	for rows.Next() {
		var id int
		var name string
		err = rows.Scan(&id, &name)
		if err != nil {
			log.Fatal(err)
		}
		fmt.Println(id, name)
	}

	fmt.Println("----->1")

	err = rows.Err()
	if err != nil {
		log.Fatal(err)
	}

	fmt.Println("----->0")

}

もう一つのサンプルコード

https://qiita.com/geniusmaaakun/items/b3cb44de3b10a526be98 を参照させて頂き、微小修正

package main

/*
C:\Users\ebata\kese\gonet-html\1-1-1
sqliteをインストールする際の手順の確認

# ドライバのインストール
go get github.com/mattn/go-sqlite3

*/

import (
	"database/sql"
	"fmt"
	"log"
	"os"

	//インポート _にしないとコンパイルエラーになる。使用しない為
	_ "github.com/mattn/go-sqlite3"
)

var DbConnection *sql.DB

type Person struct {
	Name string
	Age  int
}

func main() {

	os.Remove("./example.sql") // これを入れないと、DBが太り続ける

	//1
	//DBを開く  なければ作成される
	DbConnection, _ := sql.Open("sqlite3", "./example.sql")
	//終わったら閉じる
	defer DbConnection.Close()
	//DB作成 SQLコマンド
	cmd := `CREATE TABLE IF NOT EXISTS person(
        name STRING,
        age  INT)`

	//実行 結果は返ってこない為、_にする
	_, err := DbConnection.Exec(cmd)

	//エラーハンドリング
	if err != nil {
		fmt.Println("エラー")
		log.Fatalln(err)
	}

	//ターミナル
	//sqlite3
	//.table
	//SELECT * FROM tablename;
	//で確認

	//2 CRUD処理
	//Create
	//データを追加
	//VALUES (?, ?)  値は後で渡す。セキュリテイの関係でこのようにする方がいい
	//SQLインジェクション 悪意あるコマンドでDBが操作されてしまうのを防ぐ ?でエスケープしてくれる
	cmd = "INSERT INTO person (name, age) VALUES (?, ?)"
	//実行
	//レコードを取得する必要のない、クエリはExecメソッドを使う
	//第二引数からは、コマンド?部の値
	_, err = DbConnection.Exec(cmd, "Nancy", 20)
	if err != nil {
		log.Fatalln(err)
	}

	_, err = DbConnection.Exec(cmd, "Mike", 20)
	if err != nil {
		log.Fatalln(err)
	}

	_, err = DbConnection.Exec(cmd, "Tom", 55)
	if err != nil {
		log.Fatalln(err)
	}

	//Update
	//データの更新 Mike が存在する場合
	cmd = "UPDATE person SET age = ? WHERE name = ?"
	_, err = DbConnection.Exec(cmd, 25, "Mike")
	if err != nil {
		log.Fatalln(err)
	}

	//Read
	//Get  All
	//マルチセレクト
	//データ全てをループで表示
	//Queryは全て取得する
	cmd = "SELECT * FROM person"
	rows, _ := DbConnection.Query(cmd)
	defer rows.Close()
	//structを作成
	var pp []Person

	//取得したデータをループでスライスに追加 for rows.Next()
	for rows.Next() {
		var p Person
		//scan データ追加
		err := rows.Scan(&p.Name, &p.Age)
		if err != nil {
			log.Println(err)
		}
		pp = append(pp, p)
	}
	err = rows.Err()
	if err != nil {
		log.Fatalln(err)
	}
	//表示
	for _, p := range pp {
		fmt.Println(p.Name, p.Age)
	}

	//特定のデータを取得
	cmd = "SELECT * FROM person where age = ?"
	//age = 20にして実行
	//QueryRowは最初の一件だけ取得する。

	//row := DbConnection.QueryRow(cmd, 20)
	//row := DbConnection.QueryRow(cmd, 25)
	row := DbConnection.QueryRow(cmd, 55)

	var p Person
	err = row.Scan(&p.Name, &p.Age)
	if err != nil {
		//データがなかったら
		if err == sql.ErrNoRows {
			log.Println("No row")
			//それ以外のエラー
		} else {
			log.Println(err)
		}
	}
	fmt.Println(p.Name, p.Age)

	//Delete
	//データの削除  全て
	cmd = "DELETE FROM person WHERE name = ?"
	_, err = DbConnection.Exec(cmd, "Nancy")
	if err != nil {
		log.Fatalln(err)
	}

	//マルチセレクト  テーブルもSQLインジェクション対策
	//こちらを推奨
	//データを構造体に入れて表示
	//テーブルはSQLインジェクション対策が使えない
	tableName := "person"
	//テーブル名指定は?が使えない為、%sを使う。
	//後に対応されるかも?
	cmd = fmt.Sprintf("SELECT * FROM %s", tableName)
	rows1, _ := DbConnection.Query(cmd)
	defer rows1.Close()
	var pp1 []Person
	//パターンとして覚える
	for rows1.Next() {
		var p Person
		//データを構造体に追加
		err := rows1.Scan(&p.Name, &p.Age)
		if err != nil {
			log.Println(err)
		}
		//ppに追加
		pp1 = append(pp1, p)
	}
	//まとめてエラーチェック
	err = rows1.Err()
	if err != nil {
		//エラーなら終了
		log.Fatalln(err)
	}
	for _, p := range pp1 {
		fmt.Println(p.Name, p.Age)
	}
}