未分類

  1. 内容:位置情報をサーバからクアイアント(Webブラウザ)に1回のみ一回だけ送信して、その情報を、適当にランダムウォークさせるだけのプログラム
  2. 方針 できるだけ、プログラムは汚いまま残す
/*
// server7.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

// 使い方
// go run server7.go      (適当なシェルから)
// http://localhost:8080  (ブラウザ起動)
*/

package main

import (
	"flag"
	"html/template"
	"log"
	"net/http"

	"github.com/gorilla/websocket"
)

// GetLoc GetLoc
type GetLoc struct {
	ID  int     `json:"id"`
	Lat float64 `json:"lat"`
	Lng float64 `json:"lng"`
	//Address string  `json:"address"`
}

//var addr = flag.String("addr", "localhost:8080", "http service address")
var addr = flag.String("addr", "0.0.0.0:8080", "http service address") // テスト

var upgrader = websocket.Upgrader{} // use default options

func echo(w http.ResponseWriter, r *http.Request) {
	c, err := upgrader.Upgrade(w, r, nil) // cはサーバのコネクション
	if err != nil {
		log.Print("upgrade:", err)
		return
	}
	defer c.Close()

	/*
		for {
			//mt, message, err := c.ReadMessage() // クライアントからのメッセージの受信(mtはクライアント識別子)
			_, _, err := c.ReadMessage() // クライアントからのメッセージの受信(mtはクライアント識別子)
			if err != nil {
				log.Println("read:", err)
				break
			}

			// JSON(位置情報)を無理やり入れてみた

			gl := GetLoc{
				ID:  1,
				Lat: 35.653976,
				Lng: 139.796842,
			}

			//log.Printf("recv_serv: %s", gl)
			//err = c.WriteJSON(mt, gl)
			err = c.WriteJSON(gl)
			if err != nil {
				log.Println("write:", err)
				break
			}
		}
	*/

	gl := GetLoc{
		ID:  1,
		Lat: 35.653976,
		Lng: 139.796842,
	}

	//log.Printf("recv_serv: %s", gl)
	//err = c.WriteJSON(mt, gl)
	err = c.WriteJSON(gl)
	if err != nil {
		log.Println("write:", err)
	}

}

func home(w http.ResponseWriter, r *http.Request) {
	homeTemplate.Execute(w, "ws://"+r.Host+"/echo")
}

func main() {
	flag.Parse()
	log.SetFlags(0)
	http.HandleFunc("/echo", echo)             // echo関数を登録 (サーバとして必要)
	http.HandleFunc("/", home)                 // home関数を登録
	log.Fatal(http.ListenAndServe(*addr, nil)) // localhost:8080で起動をセット
}

var homeTemplate = template.Must(template.New("").Parse(`
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="utf-8" />
    <title>PruneCluster - Realworld 50k</title>

	<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/leaflet/1.0.0-beta.2.rc.2/leaflet.css"/>
	<script src="https://cdnjs.cloudflare.com/ajax/libs/leaflet/1.0.0-beta.2.rc.2/leaflet.js"></script>

	<script src="http://kobore.net/PruneCluster.js"></script>           
	<link rel="stylesheet" href="http://kobore.net/examples.css"/>      


</head>
<body>
<div id="map"></div>

<script>

	ws = new WebSocket("{{.}}"); // websocketの確立

	/*
	var print = function(message) {
		var d = document.createElement("div");
		d.textContent = message;
		output.appendChild(d);
	};
	*/

	//引数にはミリ秒を指定。(例:5秒の場合は5000)
	function sleep(a){
  		var dt1 = new Date().getTime();
  		var dt2 = new Date().getTime();
  		while (dt2 < dt1 + a){
			dt2 = new Date().getTime();
		}
  		return;
	}

    var map = L.map("map", {
        attributionControl: false,
        zoomControl: false
    }).setView(new L.LatLng(35.654543, 139.795534), 18);

    L.tileLayer('http://{s}.tile.osm.org/{z}/{x}/{y}.png', {
        detectRetina: true,
        maxNativeZoom: 18
    }).addTo(map);

    var leafletView = new PruneClusterForLeaflet(1,1);  // (120,20)がデフォルト

	/*
	// 送信5発(3秒単位)を送信
	ws.onopen = function (event) {
		for (let i = 0; i < 1; i++){
			ws.send("Ebata is great"); 
			//print("send: Ebata is great");
	
			//print("Start sleep");
			sleep(1000);
			//print("End sleep");
		}
	}
	*/

	var markers = [];

	// 受信すると、勝手にここに飛んでくる
	ws.onmessage = function (event) {
		// データをJSON形式に変更
		var obj = JSON.parse(event.data);

		// データをマーカーとして登録
		var marker = new PruneCluster.Marker(obj.lat, obj.lng);
		markers.push(marker);
		leafletView.RegisterMarker(marker);

        // leafletView.ProcessView();  // 変更が行われたときに呼び出されなければなりません。		
	}


	/*
	// 100人分を登録する
    var size = 1;
    var markers = [];
    for (var i = 0; i < size; ++i) {
        var marker = new PruneCluster.Marker(35.654543 + (Math.random() - 0.5) * 0.00001 * size, 139.795534 + (Math.random() - 0.5) * 0.00002 * size);

        markers.push(marker);
		leafletView.RegisterMarker(marker);
		
	}
	*/
	
	/*
		ちなみにオブジェクトの削除は、以下の様らしい
		// Remove all the markers
		pruneCluster.RemoveMarkers();

		// Remove a list of markers 
		pruneCluster.RemoveMarkers([markerA,markerB,...]);  リスト単位で消去する、ことか → marker[0],maker[1] と指定して消していくのだと思われ

		// こんなのがあった random.10000-delete.html
		document.getElementById('delete').onclick = function () {
			if (size >= 1000) {
				var deleteList = markers.splice(0, 1000);
				leafletView.RemoveMarkers(deleteList);
				size -= 1000;
			}
			return false;
		};

	*/
	
	// ランダムウォークさせる
    window.setInterval(function () {
        for (i = 0; i < 1; ++i) {
			//var coef = i < size / 8 ? 10 : 1;
			var coef = 10;
            var ll = markers[i].position;
            ll.lat += (Math.random() - 0.5) * 0.00001 * coef;
            ll.lng += (Math.random() - 0.5) * 0.00002 * coef;
        }

        leafletView.ProcessView();  // 変更が行われたときに呼び出されれなければならない
	}, 500);


	// サーバを止めると、ここに飛んでくる
	ws.onclose = function(event) {
		//print("CLOSE");
		ws = null;
	}


    map.addLayer(leafletView);
</script>



</body>
</html>
`))

2020/09,未分類,江端さんの技術メモ

WiMAX 2+ は、有線(USB)で使えないと思っていたけど、USBで表示されたドライブ(D:)をクリックしたら使えるようになった。本体の方で特別な設定はしなかった。とりあえずメモで。

未分類

娘(長女)によれば、アニメ「日本沈没2020」は大変良いアニメだそうです。

私は、3分ほど視聴しただけで、現在見ていません。

原作からの乖離が、とても大き過ぎるように思えて、ちょっと辛いのです。

もちろん、私は、「いかなる二次創作も肯定する」と明言していますし、そのような創作物を「きちんと視聴しないままでで批判する人間」を批判していますので、当然、自分にもそのルールを適用しています。

私の体は、故小松左京先生の原作「日本沈没」と「さよならジュピター」(を一部として)できているといっても過言でもありません。

特に原作「日本沈没」は、巨大な地球科学のシミュレーションと、科学の本質的概念が登場し、これは、私の基本的な思想として定着しています。

で、皆さんに質問です。

アニメ「日本沈没2020」の中には、原作に含まれる、いかのようなパラダイムは登場しますか?

もし、このような、考え方が、アニメ「日本沈没2020」に登場するのであれば、私、がんばって、このアニメを見たいと思っています。

未分類

  1. 背景
    (1)先週、歯の詰め物が抜けた(歯が崩れた感じがした)ようなで、歯医者にいった
    (2)虫歯があると言われて歯を削られたが、神経を直接触るような削り方を続けられ、随分痛い思いをした。
    (3)麻酔を8回ほど打たれて、1時間弱かかっても同じようなことが続いた
    (4)ついには「神経を抜く」ということを言われたが、その神経を抜くこともできなかった
    (5)結局、治療は「削られるだけ」で終了。そのまま次回、"蓋"をすることになった
  2. 現在の状況
    現状、治療前にはなかった"鈍い"痛みが続いていて、時々、鎮痛剤(ロキソニン)を投入しないと、仕事に集中できない
  3. 所感
    (A)近年体験したことのない手際の悪さと治療時の痛さ → これ以上通院したら、もっと酷い目にあうような気がする
    (B)「麻酔が効かない」などということは、これまで一度もなかった("8回麻酔"なんてことがあるだろうか)
    (C)このまま"蓋"をされるだけなら、今後も"鈍い"痛みが続くことになって困る
  4. お願いしたいこと
    (1)現状の具体的対応が分からいので、その状況を教えて頂き、かつ、治療の方針を相談させて下さい。
    なお、個人的に
    (2)「根治治療」を望みません。痛くない場所を「予防治療」することも望みません。これまでの経験上、治療をすることで、状況がさらに悪くなっているようなことが多い様に思えます。
    (2)個人的には、痛みが発生した時に発生した場所のみの「対処治療」を希望します。痛みが発生しない状況が、長期間に至れば良いと考えています。

以上

2020/06,未分類,江端さんの技術メモ

「COCOAが「まもりあいJapan」のコードをベースにしている」という誤記を記載して、現在、COCOAのコードを探していましたが、どうやら、https://github.com/Covid-19Radar/Covid19Radar がソースコードの場所のようです。

現在、パッケージ一式をダウンロードして、読んでいます。