2023,江端さんの技術メモ

単純だけど、これでオブジェクトを書いたり消したりすれば、実現できるかな?

 

<!doctype html>
<html>
<head>
    <title>Many Points with  leaflet Canvas</title>
    <meta charset="utf-8">

    <style>
        
        #map {
            position: absolute;
            height: 100%;
            width: 100%;
            background-color: #333;
        }
    </style>

</head>
<body>
    <div id="map"></div>
    <link rel="stylesheet" href="http://cdn.leafletjs.com/leaflet-0.7.2/leaflet.css" />
    <script src="http://cdn.leafletjs.com/leaflet-0.7.2/leaflet.js"></script>
    <script src="L.CanvasOverlay.js"></script>
    <script src="http://www.sumbera.com/gist/data.js" charset="utf-8"></script>


    <script>

        var points = data; // data loaded from data.js
        var leafletMap = L.map('map').setView([50.00, 14.44], 9);
        L.tileLayer("http://{s}.sm.mapstack.stamen.com/(toner-lite,$fff[difference],$fff[@23],$fff[hsl-saturation@20])/{z}/{x}/{y}.png")
            .addTo(leafletMap);

        L.canvasOverlay()
            .drawing(drawingOnCanvas)
            .addTo(leafletMap);

        function drawingOnCanvas(canvasOverlay, params) {
            var ctx = params.canvas.getContext('2d');
            ctx.clearRect(0, 0, params.canvas.width, params.canvas.height);
            ctx.fillStyle = "rgba(255,116,0, 0.2)";


            //for (var i = 0; i < data.length; i++) {
            for (var i = 0; i < data.length; i=i+300) {
                var d = data[i];
                if (params.bounds.contains([d[0], d[1]])) {
                    dot = canvasOverlay._map.latLngToContainerPoint([d[0], d[1]]);
                    ctx.beginPath();
                    //ctx.arc(dot.x, dot.y, 3, 0, Math.PI * 2);
                    ctx.arc(dot.x, dot.y, 10, 0, Math.PI * 2);
                    ctx.fill();
                    ctx.closePath();
                }
            }

            //for (var i = 0; i < data.length ; i++) {
            for (var i = 0; i < data.length ; i=i+10) {
                var d = data[i];
                if (params.bounds.contains([d[0], d[1]])) {
                    dot = canvasOverlay._map.latLngToContainerPoint([d[0], d[1]]);
					//ctx.beginPath();
					ctx.clearRect(dot.x-10, dot.y-10, dot.x+0, dot.y+0);
                    //ctx.closePath();
                }
            }


        };
    </script>
</body>
</html>

 

2023,江端さんの技術メモ

https://prideout.net/emulating-double-precision の ざっくり翻訳

頂点変換の精度を向上させる
WebGLとOpenGL ESは64ビット演算をサポートしていませんが、頂点シェーダーで少し足掻くだけでエミュレートできます。
まず、この記事に興味を持たれた方は、Patrick CozziとKevin Ringが出版した「3D Engine Design for Virtual Globes」というとても素晴らしい本に興味を持たれたのではないでしょうか。この本には、精度についての章があり、その他にも多くのことが書かれています。
地図画像を読み込むと、以下の2つのインタラクティブなWebGLキャンバスが表示されます。青い十字線は、バークレー・マリーナのすぐ北にあるセザール・チャベス公園の展望台です。ここは、私の2人の子供たちのお気に入りの場所で、十分に拡大すると見ることができます。Googleマップと同じように、ズームやパンをしてみてください。
子供たちが見えるくらいまで拡大すると、左のキャンバスでは十字線が揺れていますが、右のキャンバスでは揺れていないことに気がつくかもしれません。左のキャンバスでは従来のモデル・ビュー・プロジェクション・マトリックスを使用していますが、右のキャンバスでは MVP を計算する際にカメラが (0,0,0) にあるように見せかけ、バーテックスシェーダーで手動で変換を行っています。このためのGLSLを以下に示します。
ハイパートとローパートの2つのユニフォームを使って、目の位置をGPUに送信していることに注意してください。この2つのパーツを抽出するために、以下のCPUサイドのコードを使用することができます:
C言語ではなくJavaScriptを使用している場合、Float32Arrayを使用して、上記のスニペットで見られるdouble-to-floatキャストを行うことができるかもしれません。
64ビット頂点
これまで、64ビットのカメラ位置の扱い方について説明してきましたが、これは上記のデモで十分です。では、64ビットの頂点が必要な場合はどうでしょうか。この場合も、GPUに送る前に各2倍を2つの浮動小数点に分割することができます。この場合、VBOが2倍になり、バーテックスシェーダが少し複雑になるため、よりコストがかかります。
私はこれを完全にテストしたわけではありませんが、ドナルド・クヌース(Donald Knuth)の研究に基づく古い数学精度ライブラリであるDSFUN90で使用されている「ダブル・シングル」ルーチンをGLSLで移植したものがあります!
いくつかの脚注
このページの地図デモは、私が取り組んでいる小さなC99ライブラリを使い、MODULARIZE=1、PRECISE_F32=1のフラグを付けてEmscriptenで実行したものです。PRECISE_F32を使用しない場合、Emscriptenはfloat変数でもdoubleを使用するため、split_doubleのコードが壊れてしまいます。
デモ用のマップテクスチャを得るために、mapbox.comの本当に素晴らしいStatic maps APIを使用しました。

2023,江端さんの技術メモ

■wsl2は通常状態ではdockerにアクセスできない。
→ Docker Desktopで、wsl2を使えるようにチェックを付ける

■wsl2からpsqlを使えるようにできるように、"sudo apt psql なんとか"で、psqlをインストールしておく
→ 要するに、wsl2からDBアクセスできなければ、お話にならない
こんなエラーで面倒な目にあった(なんか色々やっているうちに動くようになった)

psql: error: connection to server at "localhost" (::1), port 15432 failed: Connection refused (0x0000274D/10061)
Is the server running on that host and accepting TCP/IP connections?
connection to server at "localhost" (127.0.0.1), port 15432 failed: Connection refused (0x0000274D/10061)
Is the server running on that host and accepting TCP/IP connections?

とか、

psql: error: connection to server on socket "/var/run/postgresql/.s.PGSQL.5432" failed: No such file or directory

などが出てくるが、やっかいなことに、DBを3回くらい作り直すと、直っていたりするので、原因が特定できないことが多い。

T.B.D.

 

2023,江端さんの技術メモ

https://development.relaxes.jp/windows11にwsl2+ubuntu20-04をインストールする/

これまで、VMWareやら、VirtualBoxやら、(Dockerも、)仮想環境というのは基本的に面倒くさい思い出ばかりなの(特に通信I/F回り)で、Windows10/11をインストールする時も、意図してWSLは弾いてきたのですが ―― そのツケが回ってきました。

Golangは、Windowsで実行するより、WSL on Windows10/11の方が実行速度が速い 

という驚愕の情報をデータ付きで教えて頂き、現在、WSLの環境構築と、Golangのインストールを実行しています。

以外に簡単でしたし、通信I/F回りも今のところ、あまり問題になっていないようです。


さて、wslのインストールがコマンドプロンプトから、

>wsl -d Ubuntu-20.04

の環境を立ち上げて、

>sudo apt update
>sudo apt install golang-go

をしました。これでgolangは動くようになりました。

で、実際のプロウラムを動かしてみると、

# m/AgentSimulation
./db_util.go:280:24: undefined: sql.NullInt16
note: module requires Go 1.17

というエラーが出て止まります。

Go 1.17にモジュールが必要と言われているようですが、

$ go version
go version go1.13.8 linux/amd64

と出てきます。全然足りないようです。

ここからは、めんどくないGoのバージョンアップ を参考にして作業を進めました。

$sudo apt install golang-go

では、失敗するようです。

やっぱり

$sudo add-apt-repository ppa:longsleep/golang-backports

が重要なようでした。

定番の

$sudo apt autoremove
$sudo apt update
$sudo apt install
$sudo apt upgrade
をやって、再度
$sudo apt install golang-go
を実施したら、
$ go version
go version go1.20.2 linux/amd64
となりました。
-----

2023,江端さんの技術メモ

現在時刻を入れた、agoopデータ形式のcsvファイルをGolangで作る

// C:\Users\ebata\yamaguchi\src_try2\others\main9.csv

/*
	このデータ形式のcsvを作成する

	Dailyid,Year,Month,Day,Hour,Minute,Second,Latitude,Longitude
	14,2017,12,1,8,17,5,33.749583,132.709375
*/

package main

import (
	"encoding/csv"
	"fmt"
	"log"
	"os"
	"time"
)

func main() {

	const STATIONS_PATH string = "test.csv"

	// csvファイル
	csvFile, err := os.Create(STATIONS_PATH)
	if err != nil {
		log.Fatal(err)
	}
	defer csvFile.Close()

	// CSVファイルの中身を読み込み
	w := csv.NewWriter(csvFile)

	//str := "Dailyid,Year,Day,Hour,Minute,Second,Latitude,Longitude"
	str := []string{"Dailyid", "Year", "Day", "Hour", "Minute", "Second", "Latitude", "Longitude"}
	fmt.Println(str)

	if err = w.Write(str); err != nil {
		log.Fatal(err)
	}

	/////

	id := 1
	dt := time.Now()
	year := dt.Year()
	day := dt.Day()
	hour := dt.Hour()
	minute := dt.Minute()
	second := dt.Second()
	latitude := 33.749583
	longitude := 132.709375

	str = []string{fmt.Sprint(id), fmt.Sprint(year), fmt.Sprint(day), fmt.Sprint(hour), fmt.Sprint(minute), fmt.Sprint(second), fmt.Sprint(latitude), fmt.Sprint(longitude)}

	if err = w.Write(str); err != nil {
		log.Fatal(err)
	}

	w.Flush() // バッファに残っているデータを書き込む

}

2023,江端さんの技術メモ

使う度に調べるので、メモしておきます。

1. 40歳から44歳の人の人数を数えろ
=COUNTIFS($B$1:$B$498, ">=45",$B$1:$B$498, "<50" )

2.55歳から59歳の人の不満値の平均値を求めよ
=AVERAGEIFS($J$1:$J$498, $B$1:$B$498, ">=55",$B$1:$B$498, "<60" )

Keywords: COUNTIF, COUNTIFS, AVERAGEIFS