{"id":1428,"date":"2020-10-15T14:23:23","date_gmt":"2020-10-15T05:23:23","guid":{"rendered":"https:\/\/wp.kobore.net\/?p=1428"},"modified":"2020-10-15T14:26:30","modified_gmt":"2020-10-15T05:26:30","slug":"post-1428","status":"publish","type":"post","link":"https:\/\/wp.kobore.net\/2020\/10\/15\/post-1428\/","title":{"rendered":"\u4eca\u65e5\u306e\u30b3\u30fc\u30c9"},"content":{"rendered":"
\u25a0\u30b5\u30fc\u30d0\u5074\u3067\u3001\u901a\u4fe1\u30a8\u30e9\u30fc\u304c\u767a\u751f\u3057\u305f\u3089\u3001\u554f\u7b54\u7121\u7528\u3067break\u3057\u3066\u30eb\u30fc\u30d7\u306e\u5916\u306b\u8ffd\u3044\u51fa\u3057\u305f\u3002<\/p>\n
\/*\r\n\/\/ server13.go \u30da\u30a2\u306fclient8.go\r\n\r\n\/\/ Copyright 2015 The Gorilla WebSocket Authors. All rights reserved.\r\n\/\/ Use of this source code is governed by a BSD-style\r\n\/\/ license that can be found in the LICENSE file.\r\n\r\n\/\/ +build ignore\r\n\r\n\/\/ \u4f7f\u3044\u65b9\r\n\/\/ go run server13.go (\u9069\u5f53\u306a\u30b7\u30a7\u30eb\u304b\u3089)\r\n\/\/ http:\/\/localhost:8080 (\u30d6\u30e9\u30a6\u30b6\u8d77\u52d5)\r\n*\/\r\n\r\npackage main\r\n\r\nimport (\r\n\t\"flag\"\r\n\t\"fmt\"\r\n\t\"html\/template\"\r\n\t\"log\"\r\n\t\"net\/http\"\r\n\t\"sync\"\r\n\r\n\t\"github.com\/gorilla\/websocket\"\r\n)\r\n\r\n\/\/ GetLoc GetLoc\r\ntype GetLoc struct {\r\n\tID int `json:\"id\"`\r\n\tLat float64 `json:\"lat\"`\r\n\tLng float64 `json:\"lng\"`\r\n\t\/\/Address string `json:\"address\"`\r\n}\r\n\r\n\/\/var addr = flag.String(\"addr\", \"localhost:8080\", \"http service address\")\r\nvar addr = flag.String(\"addr\", \"0.0.0.0:8080\", \"http service address\") \/\/ \u30c6\u30b9\u30c8\r\n\r\nvar upgrader = websocket.Upgrader{} \/\/ use default options\r\n\r\nvar chan2_1 = make(chan GetLoc)\r\n\r\nvar maxid = 0\r\n\r\nvar mutex sync.Mutex\r\n\r\nfunc echo2(w http.ResponseWriter, r *http.Request) {\r\n\tc, err := upgrader.Upgrade(w, r, nil) \/\/ c\u306f\u30b5\u30fc\u30d0\u306e\u30b3\u30cd\u30af\u30b7\u30e7\u30f3\r\n\tif err != nil {\r\n\t\tlog.Print(\"upgrade:\", err)\r\n\t\treturn\r\n\t}\r\n\tdefer c.Close()\r\n\r\n\t\/\/mutex := new(sync.Mutex)\r\n\r\n\tfor {\r\n\t\t\/\/mt, message, err := c.ReadMessage() \/\/ \u30af\u30e9\u30a4\u30a2\u30f3\u30c8\u304b\u3089\u306e\u30e1\u30c3\u30bb\u30fc\u30b8\u306e\u53d7\u4fe1(mt\u306f\u30af\u30e9\u30a4\u30a2\u30f3\u30c8\u8b58\u5225\u5b50)\r\n\t\t\/\/_, _, err := c.ReadMessage() \/\/ \u30af\u30e9\u30a4\u30a2\u30f3\u30c8\u304b\u3089\u306e\u30e1\u30c3\u30bb\u30fc\u30b8\u306e\u53d7\u4fe1(mt\u306f\u30af\u30e9\u30a4\u30a2\u30f3\u30c8\u8b58\u5225\u5b50)\r\n\r\n\t\tmutex.Lock()\r\n\r\n\t\tgl := new(GetLoc)\r\n\r\n\t\terr := c.ReadJSON(&gl) \/\/ \u30af\u30e9\u30a4\u30a2\u30f3\u30c8\u304b\u3089\u306e\u30e1\u30c3\u30bb\u30fc\u30b8\u306e\u53d7\u4fe1\r\n\r\n\t\t\/\/ \u539f\u56e0\u4e0d\u660e\u306e\u5bfe\u51e6\u51e6\u7406\r\n\t\tif gl.ID == 0 && gl.Lat < 0.01 && gl.Lng < 0.01 {\r\n\t\t\tmutex.Unlock()\r\n\t\t\tbreak\r\n\t\t} else if gl.ID < -1 { \/\/ \u53d7\u7406\u3067\u304d\u306a\u3044\u30e1\u30c3\u30bb\u30fc\u30b8\u3068\u3057\u3066\u8fd4\u4fe1\u3059\u308b\r\n\t\t\t\/\/\u6761\u4ef6\u5206\u5c90 (\u5909\u306aID\u304c\u4ed8\u4e0e\u3055\u308c\u3066\u3044\u308b\u30e1\u30c3\u30bb\u30fc\u30b8\u306f\u6f70\u3059)\r\n\t\t\t\/\/if (gl.ID > maxid) || (gl.ID < -1) { \/\/ \u53d7\u7406\u3067\u304d\u306a\u3044\u30e1\u30c3\u30bb\u30fc\u30b8\u3068\u3057\u3066\u8fd4\u4fe1\u3059\u308b\r\n\r\n\t\t\tgl.ID = -1\r\n\t\t\tgl.Lat = -999\r\n\t\t\tgl.Lng = -999\r\n\t\t\terr2 := c.WriteJSON(gl)\r\n\t\t\tif err2 != nil {\r\n\t\t\t\tlog.Println(\"write1:\", err2)\r\n\t\t\t\tbreak\r\n\t\t\t}\r\n\t\t} else { \/\/ \u305d\u308c\u4ee5\u5916\u306f\u8ee2\u9001\u3059\u308b\r\n\t\t\tlog.Printf(\"echo2 after c.WriteJSON(gl) ID:%d\", gl.ID)\r\n\t\t\tlog.Printf(\"echo2 after c.WriteJSON(gl) Lat:%f\", gl.Lat)\r\n\t\t\tlog.Printf(\"echo2 after c.WriteJSON(gl) Lng:%f\", gl.Lng)\r\n\r\n\t\t\tif err != nil {\r\n\t\t\t\tlog.Println(\"read:\", err)\r\n\t\t\t\tbreak\r\n\t\t\t}\r\n\t\t\tfmt.Printf(\"echo2 before chan2_1 <- *gl\\n\")\r\n\t\t\tchan2_1 <- *gl\r\n\t\t\tfmt.Printf(\"echo2 after chan2_1 <- *gl\\n\")\r\n\r\n\t\t\t\/\/\u3067\u3001\u3053\u3053\u3067\u53d7\u3051\u3068\u308b\r\n\t\t\t\/\/gl2 := new(GetLoc)\r\n\t\t\tfmt.Printf(\"echo2 before gl2 := <-chan2_1\\n\")\r\n\t\t\tgl2 := <-chan2_1\r\n\t\t\tmaxid = gl2.ID \/\/ ID\u6700\u5927\u5024\u306e\u66f4\u65b0\r\n\t\t\tlog.Printf(\"echo2 after gl2 := <-chan2_1 ID:%d\", gl2.ID)\r\n\t\t\tlog.Printf(\"echo2 after gl2 := <-chan2_1 Lat:%f\", gl2.Lat)\r\n\t\t\tlog.Printf(\"echo2 after gl2 := <-chan2_1 Lng:%f\", gl2.Lng)\r\n\r\n\t\t\tfmt.Printf(\"echo2 before err2 := c.WriteJSON(gl2)\\n\")\r\n\t\t\terr2 := c.WriteJSON(gl2)\r\n\t\t\tfmt.Printf(\"echo2 after err2 := c.WriteJSON(gl2)\\n\")\r\n\t\t\tif err2 != nil {\r\n\t\t\t\tlog.Println(\"write2:\", err2)\r\n\t\t\t\tbreak\r\n\t\t\t}\r\n\t\t\tfmt.Printf(\"end of echo2\\n\")\r\n\r\n\t\t}\r\n\r\n\t\tmutex.Unlock()\r\n\t}\r\n}\r\n\r\nfunc echo(w http.ResponseWriter, r *http.Request) {\r\n\r\n\tc, err := upgrader.Upgrade(w, r, nil) \/\/ c\u306f\u30b5\u30fc\u30d0\u306e\u30b3\u30cd\u30af\u30b7\u30e7\u30f3\r\n\tif err != nil {\r\n\t\tlog.Print(\"upgrade:\", err)\r\n\t\treturn\r\n\t}\r\n\tdefer c.Close()\r\n\r\n\t\/*\t\u3053\u3053\u3067\u30ed\u30c3\u30af\u3057\u3066\u5f85\u3064 *\/\r\n\r\n\tfor {\r\n\r\n\t\tfmt.Printf(\"echo before gl := <-chan2_1\\n\")\r\n\t\tgl := <-chan2_1\r\n\t\tfmt.Printf(\"echo after gl := <-chan2_1\\n\")\r\n\r\n\t\tfmt.Printf(\"echo before err = c.WriteJSON(gl) gl2.id = %d\\n\", gl.ID)\r\n\t\tfmt.Printf(\"echo before err = c.WriteJSON(gl) gl2.lat = %f\\n\", gl.Lat)\r\n\t\tfmt.Printf(\"echo before err = c.WriteJSON(gl) gl2.lng= %f\\n\", gl.Lng)\r\n\t\terr = c.WriteJSON(gl)\r\n\t\tif err != nil {\r\n\t\t\tlog.Println(\"WriteJSON1:\", err)\r\n\t\t}\r\n\t\tfmt.Printf(\"echo after err = c.WriteJSON(gl)\\n\")\r\n\r\n\t\tfmt.Printf(\"echo before err = c.RreadJSON(gl)\\n\")\r\n\t\tgl2 := new(GetLoc)\r\n\t\terr2 := c.ReadJSON(&gl2)\r\n\t\tfmt.Printf(\"echo after err = c.ReadJSON(&gl2) gl2.id = %d\\n\", gl2.ID)\r\n\t\tfmt.Printf(\"echo after err = c.ReadJSON(&gl2) gl2.lat = %f\\n\", gl2.Lat)\r\n\t\tfmt.Printf(\"echo after err = c.ReadJSON(&gl2) gl2.lng= %f\\n\", gl2.Lng)\r\n\t\tif err2 != nil {\r\n\t\t\tlog.Println(\"ReadJSON:\", err2)\r\n\t\t}\r\n\t\t\/\/ \u3053\u3053\u304b\u3089\u30c1\u30e3\u30cd\u30eb\u3067\u8fd4\u3059\r\n\t\tfmt.Printf(\"echo before chan2_1 <- *gl2 gl2.id = %d\\n\", gl2.ID)\r\n\t\tfmt.Printf(\"echo before chan2_1 <- *gl2 gl2.lat = %f\\n\", gl2.Lat)\r\n\t\tfmt.Printf(\"echo before chan2_1 <- *gl2 gl2.lng = %f\\n\", gl2.Lng)\r\n\t\tchan2_1 <- *gl2\r\n\t\tfmt.Printf(\"echo after chan2_1 <- *gl2\\n\")\r\n\t\tfmt.Printf(\"end of echo\\n\")\r\n\t}\r\n\r\n}\r\n\r\nfunc home(w http.ResponseWriter, r *http.Request) {\r\n\thomeTemplate.Execute(w, \"ws:\/\/\"+r.Host+\"\/echo\")\r\n}\r\n\r\nfunc main() {\r\n\tflag.Parse()\r\n\tlog.SetFlags(0)\r\n\r\n\thttp.HandleFunc(\"\/echo2\", echo2) \/\/ echo\u95a2\u6570\u3092\u767b\u9332 (\u30b5\u30fc\u30d0\u3068\u3057\u3066\u5fc5\u8981)\r\n\thttp.HandleFunc(\"\/echo\", echo) \/\/ echo\u95a2\u6570\u3092\u767b\u9332 (\u30b5\u30fc\u30d0\u3068\u3057\u3066\u5fc5\u8981)\r\n\thttp.HandleFunc(\"\/\", home) \/\/ home\u95a2\u6570\u3092\u767b\u9332\r\n\tlog.Fatal(http.ListenAndServe(*addr, nil)) \/\/ localhost:8080\u3067\u8d77\u52d5\u3092\u30bb\u30c3\u30c8\r\n}\r\n\r\nvar homeTemplate = template.Must(template.New(\"\").Parse(`\r\n<!DOCTYPE html>\r\n<html lang=\"en\">\r\n<head>\r\n <meta charset=\"utf-8\" \/>\r\n <title>PruneCluster - Realworld 50k<\/title>\r\n\r\n\t<link rel=\"stylesheet\" href=\"https:\/\/cdnjs.cloudflare.com\/ajax\/libs\/leaflet\/1.0.0-beta.2.rc.2\/leaflet.css\"\/>\r\n\t<script src=\"https:\/\/cdnjs.cloudflare.com\/ajax\/libs\/leaflet\/1.0.0-beta.2.rc.2\/leaflet.js\"><\/script>\r\n\r\n\t<script src=\"http:\/\/kobore.net\/PruneCluster.js\"><\/script> <!-- \u3053\u308c\u3001\u3044\u305a\u308c\u30ed\u30fc\u30ab\u30eb\u30db\u30b9\u30c8\u304b\u3089\u53d6\u308c\u308b\u3088\u3046\u306b\u63db\u3048\u308b -->\r\n\t<link rel=\"stylesheet\" href=\"http:\/\/kobore.net\/examples.css\"\/> <!-- \u3053\u308c\u3082\u3001\u3044\u305a\u308c\u30ed\u30fc\u30ab\u30eb\u30db\u30b9\u30c8\u304b\u3089\u53d6\u308c\u308b\u3088\u3046\u306b\u63db\u3048\u308b -->\r\n\r\n\t<!-- go\u306e\u30c6\u30f3\u30d7\u30ec\u30fc\u30c8\u306e\u30ed\u30fc\u30ab\u30eb\u3063\u3066\u3001\u3069\u3053\u306b\u306a\u308b\u3093\u3060\u308d\u3046\uff1f -->\r\n\r\n<\/head>\r\n<body>\r\n<div id=\"map\"><\/div>\r\n\r\n<script>\r\n\r\n\tws = new WebSocket(\"{{.}}\"); \/\/ websocket\u306e\u78ba\u7acb\r\n\r\n\t\/*\r\n\tvar print = function(message) {\r\n\t\tvar d = document.createElement(\"div\");\r\n\t\td.textContent = message;\r\n\t\toutput.appendChild(d);\r\n\t};\r\n\t*\/\r\n\r\n\t\/\/ \u5f15\u6570\u306b\u306f\u30df\u30ea\u79d2\u3092\u6307\u5b9a\u3002\uff08\u4f8b\uff1a5\u79d2\u306e\u5834\u5408\u306f5000\uff09\r\n\tfunction sleep(a){\r\n \t\tvar dt1 = new Date().getTime();\r\n \t\tvar dt2 = new Date().getTime();\r\n \t\twhile (dt2 < dt1 + a){\r\n\t\t\tdt2 = new Date().getTime();\r\n\t\t}\r\n \t\treturn;\r\n\t}\r\n\r\n var map = L.map(\"map\", {\r\n attributionControl: false,\r\n zoomControl: false\r\n }).setView(new L.LatLng(35.654543, 139.795534), 18);\r\n\r\n L.tileLayer('http:\/\/{s}.tile.osm.org\/{z}\/{x}\/{y}.png', {\r\n detectRetina: true,\r\n maxNativeZoom: 18\r\n }).addTo(map);\r\n\r\n var leafletView = new PruneClusterForLeaflet(1,1); \/\/ (120,20)\u304c\u30c7\u30d5\u30a9\u30eb\u30c8\r\n\r\n\tws.onopen = function (event) {\r\n\t}\r\n\r\n\tvar markers = [];\r\n\r\n\t\/\/ \u53d7\u4fe1\u3059\u308b\u3068\u3001\u52dd\u624b\u306b\u3053\u3053\u306b\u98db\u3093\u3067\u304f\u308b\r\n\tws.onmessage = function (event) {\r\n\t\t\/\/ \u30c7\u30fc\u30bf\u3092JSON\u5f62\u5f0f\u306b\u5909\u66f4\r\n\t\tvar obj = JSON.parse(event.data);\r\n\r\n\t\tconsole.log(\"233\");\t\r\n\t\tconsole.log(obj.id);\r\n\t\tconsole.log(obj.lat);\t\t\t\t\t\t\r\n\t\tconsole.log(obj.lng);\t\r\n\r\n\r\n\t\tif (obj.id == 0){ \/\/ id\u304c\u672a\u767b\u9332\u306e\u5834\u5408\r\n\t\t\tconsole.log(\"obj.id == 0\")\r\n\t\t\t\/\/ \u30c7\u30fc\u30bf\u3092\u30de\u30fc\u30ab\u30fc\u3068\u3057\u3066\u767b\u9332\r\n\t\t\tvar marker = new PruneCluster.Marker(obj.lat, obj.lng);\r\n\t\t\tconsole.log(marker.hashCode);\t\t\r\n\t\t\tmarkers.push(marker);\r\n\t\r\n\t\t\tleafletView.RegisterMarker(marker);\r\n\t\r\n\t\t\tconsole.log(markers);\r\n\t\t\tconsole.log(markers.length)\r\n\r\n\t\t\tobj.id = marker.hashCode;\r\n\t\t\t\/\/ws.send(marker.hashCode); \/\/ \u30c6\u30ad\u30b9\u30c8\u9001\u4fe1\r\n\t\t\tvar json_obj = JSON.stringify(obj);\r\n\t\t\tws.send(json_obj);\t\t\t\r\n\t\t} else if ((Math.abs(obj.lat) > 90.0) || (Math.abs(obj.lng) > 180.0)){ \/\/ \u7570\u5e38\u306a\u5ea7\u6a19\u304c\u5165\u3063\u305f\u5834\u5408\u306f\u3001\u30de\u30fc\u30ab\u30fc\u3092\u6d88\u53bb\u3059\u308b\r\n\t\t\tconsole.log(\"Math.abs(obj.lat) > 180.0)\")\r\n\t\t\tfor (let i = 0; i < markers.length; ++i) {\r\n\t\t\t\tif (obj.id == markers[i].hashCode){\r\n\t\t\t\t\tconsole.log(i)\r\n\t\t\t\t\tconsole.log(obj.id)\t\t\t\t\t\t\t\t\t\t\r\n\t\t\t\t\tconsole.log(\"obj.id == markers[i].hashCode\")\r\n\t\t\t\t\tleafletView.RemoveMarkers(markers[obj.id]);\r\n\t\t\t\t\t\/\/leafletView.RemoveMarkers(markers[i-1]);\r\n\t\t\t\t\t\/\/leafletView.RemoveMarkers(markers);\t\t\t\t\t\r\n\t\t\t\t\tbreak;\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t\tobj.lat = 91.0;\r\n\t\t\tobj.lng = 181.0;\r\n\t\t\tvar json_obj = JSON.stringify(obj);\r\n\t\t\tws.send(json_obj);\t\t\t\t\r\n\t\t} else {\r\n\t\t\t\/\/ \u4f4d\u7f6e\u60c5\u5831\u66f4\u65b0\r\n\t\t\tconsole.log(\"else\")\r\n\t\t\tfor (let i = 0; i < markers.length; ++i) {\r\n\t\t\t\tif (obj.id == markers[i].hashCode){\r\n\t\t\t\t\tvar ll = markers[i].position;\r\n\t\t\t\t\tll.lat = obj.lat;\r\n\t\t\t\t\tll.lng = obj.lng;\r\n\t\t\t\t\tbreak;\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t\tvar json_obj = JSON.stringify(obj);\r\n\t\t\tws.send(json_obj);\t\r\n\t\t}\r\n\t}\r\n\r\n\t\/\/ \u4f4d\u7f6e\u60c5\u5831\u306e\u66f4\u65b0\r\n window.setInterval(function () {\r\n leafletView.ProcessView(); \/\/ \u5909\u66f4\u304c\u884c\u308f\u308c\u305f\u3068\u304d\u306b\u547c\u3073\u51fa\u3055\u308c\u308c\u306a\u3051\u308c\u3070\u306a\u3089\u306a\u3044\r\n\t}, 1000);\r\n\r\n\t\/\/ \u30b5\u30fc\u30d0\u3092\u6b62\u3081\u308b\u3068\u3001\u3053\u3053\u306b\u98db\u3093\u3067\u304f\u308b\r\n\tws.onclose = function(event) {\r\n\t\t\/\/print(\"CLOSE\");\r\n\t\tws = null;\r\n\t}\r\n\r\n\r\n map.addLayer(leafletView);\r\n<\/script>\r\n\r\n\r\n\r\n<\/body>\r\n<\/html>\r\n`))<\/code><\/pre>\n\n\u25a0\u30af\u30e9\u30a4\u30a2\u30f3\u30c8\u5074\u306f\u30011000\u500b\u306eGo\u30eb\u30fc\u30c1\u30f3\u304c\u5168\u90e8\u7d42\u308f\u308b\u307e\u3067\u5f85\u3064\u3088\u3046\u306b\u3057\u305f<\/div>\n\nfunc main() {\r\n\r\n\tvar wg sync.WaitGroup\r\n\r\n\tfor i := 1; i < 1000; i++ {\r\n\t\twg.Add(1) \/\/ go\u30eb\u30fc\u30c1\u30f3\u3092\u5b9f\u884c\u3059\u308b\u95a2\u6570\u5206\u3060\u3051Add\u3059\u308b\u3002\r\n\t\tgo passenger(i, &wg)\r\n\t}\r\n\t\/\/ go\u30eb\u30fc\u30c1\u30f3\u3067\u5b9f\u884c\u3055\u308c\u308b\u95a2\u6570\u304c\u7d42\u4e86\u3059\u308b\u307e\u3067\u5f85\u3064\u3002\r\n\twg.Wait()\r\n\t\/\/ time.Sleep(250 * time.Second)\r\n}\r\n\r\nfunc passenger(count int, wg *sync.WaitGroup) {\r\n \/\/\/\/.............................\r\n}<\/code><\/pre>\n<\/div>\n\u25a0\u30af\u30e9\u30a4\u30a2\u30f3\u30c8\u30d7\u30ed\u30b0\u30e9\u30e0\u306f\u4ee5\u4e0b\u306e\u901a\u308a<\/div>\n\n\/\/ client8.go \u30da\u30a2\u306f server13.go\r\n\r\npackage main\r\n\r\nimport (\r\n\t\"flag\"\r\n\t\"log\"\r\n\t\"net\/url\"\r\n\t\"sync\"\r\n\r\n\t\"github.com\/gorilla\/websocket\"\r\n\r\n\t\"math\/rand\"\r\n\t\"time\"\r\n)\r\n\r\n\/\/ GetLoc GetLoc\r\ntype GetLoc struct {\r\n\tID int `json:\"id\"`\r\n\tLat float64 `json:\"lat\"`\r\n\tLng float64 `json:\"lng\"`\r\n\t\/\/Address string `json:\"address\"`\r\n}\r\n\r\nvar addr = flag.String(\"addr\", \"0.0.0.0:8080\", \"http service address\") \/\/ \u30c6\u30b9\u30c8\r\n\r\nfunc random(min, max float64) float64 {\r\n\treturn rand.Float64()*(max-min) + min\r\n}\r\n\r\nfunc main() {\r\n\r\n\tvar wg sync.WaitGroup\r\n\r\n\tfor i := 1; i < 1000; i++ {\r\n\t\twg.Add(1) \/\/ go\u30eb\u30fc\u30c1\u30f3\u3092\u5b9f\u884c\u3059\u308b\u95a2\u6570\u5206\u3060\u3051Add\u3059\u308b\u3002\r\n\t\tgo passenger(i, &wg)\r\n\t}\r\n\t\/\/ go\u30eb\u30fc\u30c1\u30f3\u3067\u5b9f\u884c\u3055\u308c\u308b\u95a2\u6570\u304c\u7d42\u4e86\u3059\u308b\u307e\u3067\u5f85\u3064\u3002\r\n\twg.Wait()\r\n\t\/\/ time.Sleep(250 * time.Second)\r\n}\r\n\r\nfunc passenger(count int, wg *sync.WaitGroup) {\r\n\r\n\t\/\/var addr = flag.String(\"addr\", \"0.0.0.0:8080\", \"http service address\") \/\/ \u30c6\u30b9\u30c8\r\n\t\/\/var addr = flag.String(\"addr\", \"localhost:8080\", \"http service address\") \/\/ \u30c6\u30b9\u30c8\r\n\r\n\tdefer wg.Done() \/\/ WaitGroup\u3092\u6700\u5f8c\u306b\u5b8c\u4e86\u3057\u306a\u3044\u3068\u3044\u3051\u306a\u3044\u3002\r\n\r\n\t\/\/var upgrader = websocket.Upgrader{} \/\/ use default options\r\n\t_ = websocket.Upgrader{} \/\/ use default options\r\n\r\n\trand.Seed(time.Now().UnixNano())\r\n\r\n\tflag.Parse()\r\n\tlog.SetFlags(0)\r\n\tu := url.URL{Scheme: \"ws\", Host: *addr, Path: \"\/echo2\"}\r\n\tlog.Printf(\"connecting to %s\", u.String())\r\n\r\n\tc, _, err := websocket.DefaultDialer.Dial(u.String(), nil)\r\n\tif err != nil {\r\n\t\tlog.Fatal(\"dial:\", err)\r\n\t}\r\n\tdefer c.Close()\r\n\r\n\tgl := GetLoc{\r\n\t\tID: 0,\r\n\t\tLat: 35.653976,\r\n\t\tLng: 139.796821,\r\n\t}\r\n\r\n\tlog.Printf(\"count:%d before 1 ID:%d\", count, gl.ID)\r\n\tlog.Printf(\"count:%d before 1 Lat:%f\", count, gl.Lat)\r\n\tlog.Printf(\"count:%d before 1 Lng:%f\", count, gl.Lng)\r\n\t\/\/err = c.WriteJSON(mt, gl)\r\n\terr = c.WriteJSON(gl)\r\n\tif err != nil {\r\n\t\tlog.Println(\"write:\", err)\r\n\t}\r\n\r\n\tgl2 := new(GetLoc)\r\n\terr = c.ReadJSON(gl2)\r\n\tlog.Printf(\"count:%d after1 ID:%d\", count, gl2.ID)\r\n\tlog.Printf(\"count:%d after1 Lat:%f\", count, gl2.Lat)\r\n\tlog.Printf(\"count:%d after1 Lng:%f\", count, gl2.Lng)\r\n\r\n\tgl.ID = gl2.ID\r\n\tfor i := 0; i < 20; i++ {\r\n\t\tgl.Lat += random(0.5, -0.5) * 0.00001 * 10 * 5\r\n\t\tgl.Lng += random(0.5, -0.5) * 0.00002 * 10 * 5\r\n\r\n\t\tlog.Printf(\"count:%d-%d before 2 ID:%d\", count, i, gl.ID)\r\n\t\tlog.Printf(\"count:%d-%d before 2 Lat:%f\", count, i, gl.Lat)\r\n\t\tlog.Printf(\"count:%d-%d before 2 Lng:%f\", count, i, gl.Lng)\r\n\r\n\t\terr = c.WriteJSON(gl)\r\n\t\tif err != nil {\r\n\t\t\tlog.Println(\"write:\", err)\r\n\t\t}\r\n\t\tgl2 := new(GetLoc)\r\n\t\terr = c.ReadJSON(gl2)\r\n\t\tlog.Printf(\"count:%d-%d after 2 ID:%d\", count, i, gl2.ID)\r\n\t\tlog.Printf(\"count:%d-%d after 2 Lat:%f\", count, i, gl2.Lat)\r\n\t\tlog.Printf(\"count:%d-%d after 2 Lng:%f\", count, i, gl2.Lng)\r\n\r\n\t\ttime.Sleep(1 * time.Second) \/\/ 1\u79d2\u4f11\u3080\r\n\t}\r\n\r\n\tgl.ID = gl2.ID\r\n\tgl.Lat = 999.9\r\n\tgl.Lng = 999.9\r\n\r\n\tlog.Printf(\"count:%d before 3 ID:%d\", count, gl.ID)\r\n\tlog.Printf(\"count:%d before 3 Lat:%f\", count, gl.Lat)\r\n\tlog.Printf(\"count:%d before 3 Lng:%f\", count, gl.Lng)\r\n\r\n\terr = c.WriteJSON(gl)\r\n\r\n\terr = c.ReadJSON(gl2)\r\n\tlog.Printf(\"count:%d after3 ID:%d\", count, gl2.ID)\r\n\tlog.Printf(\"count:%d after3 Lat:%f\", count, gl2.Lat)\r\n\tlog.Printf(\"count:%d after3 Lng:%f\", count, gl2.Lng)\r\n}<\/code><\/pre>\n<\/div>\n\n<\/pre>\n<\/div>\n<\/div>\n\u25a0\u3053\u306e\u30af\u30e9\u30a4\u30a2\u30f3\u30c82\u3064(\u5408\u8a082000\u30aa\u30d6\u30b8\u30a7\u30af\u30c8)\u52d5\u304b\u3057\u3066\u3082\u3001\u843d\u3061\u306a\u304f\u306a\u3063\u305f<\/p>\n
\u3088\u3046\u3084\u304f\u4e00\u5b89\u5fc3<\/p>\n
<\/p>\n","protected":false},"excerpt":{"rendered":"
\u25a0\u30b5\u30fc\u30d0\u5074\u3067\u3001\u901a\u4fe1\u30a8\u30e9\u30fc\u304c\u767a\u751f\u3057\u305f\u3089\u3001\u554f\u7b54\u7121\u7528\u3067break\u3057\u3066\u30eb\u30fc\u30d7\u306e\u5916\u306b\u8ffd\u3044\u51fa\u3057\u305f\u3002 \/* \/\/ server13.go \u30da\u30a2\u306fclient8.go \/\/ Copyright 2015 The Gorilla WebS […]<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_editorskit_title_hidden":false,"_editorskit_reading_time":0,"_editorskit_is_block_options_detached":false,"_editorskit_block_options_position":"{}"},"categories":[1],"tags":[],"amp_enabled":true,"_links":{"self":[{"href":"https:\/\/wp.kobore.net\/wp-json\/wp\/v2\/posts\/1428"}],"collection":[{"href":"https:\/\/wp.kobore.net\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/wp.kobore.net\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/wp.kobore.net\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/wp.kobore.net\/wp-json\/wp\/v2\/comments?post=1428"}],"version-history":[{"count":3,"href":"https:\/\/wp.kobore.net\/wp-json\/wp\/v2\/posts\/1428\/revisions"}],"predecessor-version":[{"id":1431,"href":"https:\/\/wp.kobore.net\/wp-json\/wp\/v2\/posts\/1428\/revisions\/1431"}],"wp:attachment":[{"href":"https:\/\/wp.kobore.net\/wp-json\/wp\/v2\/media?parent=1428"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/wp.kobore.net\/wp-json\/wp\/v2\/categories?post=1428"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/wp.kobore.net\/wp-json\/wp\/v2\/tags?post=1428"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}