背景はこちら。
会社の方に教えて貰ったのがこちら
curlコマンドにてproxy設定
を参考にしながら、手抜き(taro:passwordを省略)で、
$ curl kobore.net -x http:192.168.1.1:8080
としてみたが、通った。
現在は、~/.curlrc に
proxy=http:192.168.1.1:8080
と書き込んで使用中。
キーワード: curl proxy
江端智一のホームページ
背景はこちら。
会社の方に教えて貰ったのがこちら
を参考にしながら、手抜き(taro:passwordを省略)で、
$ curl kobore.net -x http:192.168.1.1:8080
としてみたが、通った。
現在は、~/.curlrc に
proxy=http:192.168.1.1:8080
と書き込んで使用中。
キーワード: curl proxy
/etc/apt/apt.confに
1
2
3
|
Acquire::http::Proxy
"http://proxy server : port 番号";
Acquire::https::Proxy
"https://proxy server : port 番号";
("s"をつけるとマズい時もある) Acquire::ftp::Proxy
"ftp://proxy server : port 番号";
|
を追記してみたら、apt-get update できるようになった。pingなどは通る。
curl http://sample.com では、コマンドも戻ってこない。
明日は、
(1)シェルを変えてみる。
1
2
3
|
export http="http://proxy server : port 番号"
export https="https://proxy server : port 番号"
export ftp="ftp://proxy server : port 番号
|
1
|
printenv
|
grep
-i
proxy
|
https://qiita.com/tkyonezu/items/0f6da57eb2d823d2611d から
+ sh -c echo "deb [arch=amd64] https://download.docker.com/linux/ubuntu xenial edge" > /etc/apt/sources.list.d/docker.list
https://askubuntu.com/questions/1230189/how-to-install-docker-community-on-ubuntu-20-04-lts
// simple_csv_1_socket.go
// 2021/01/14
// simple_cvs.go の場合、数万のエージェント全部とwebsocket通信することになるため、
// サーバとの通信用のソケットを1つに限定して、この問題を回避した。
// ただエージェントは、従来通り、全部の数(数万から十万くらい?)作成したがそれでも。動いている。
// golang まじ凄い
// 変更点は、mainルーチンで、エージェント用のソケットを作って、goroutineでエージェント用のスレッド作る時に、それを渡している点
// あと通信は、送信→受信で1セットになるように、ミューテックスロックで競合回避を行った点(まあ通信が混乱するのを回避するため)
// 普通なら、これで相当の実行速度の低下が発生するはずなんだけど、体感的には遅くなかった。
// 現状の問題点は、chromoの方が先に落ちる、ということかな。まあ、数万のオブジェクトを1秒以内に動かされたら、chromoも文句の一つも言いたかろう。
// この問題は、メモリが潤沢に搭載されているPCでなら回避できるような気がするので、当面は放置することにする
package main
import (
"encoding/csv"
"flag"
"fmt"
"log"
"math"
"net/url"
"os"
"strconv"
"sync"
"time"
"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"`
}
// 構造体の作り方
type unmTbl struct {
uniName string // User Name: Example 6ca....
objType string // "Bus" or "User"
simNum int
pmNum int
lon float64
lat float64
}
var list = make([]unmTbl, 0) // 構造体の動的リスト宣言
var addr = flag.String("addr", "0.0.0.0:8080", "http service address") // テスト
func main() {
file, err := os.Open("1.csv")
if err != nil {
panic(err)
}
defer file.Close()
var wg sync.WaitGroup
reader := csv.NewReader(file)
var line []string
// サーバとのコネクションを1つに統一
//var upgrader = websocket.Upgrader{} // use default options
_ = websocket.Upgrader{} // use default options
// rand.Seed(time.Now().UnixNano())
flag.Parse()
log.SetFlags(0)
u := url.URL{Scheme: "ws", Host: *addr, Path: "/echo2"}
//log.Printf("connecting to %s", u.String())
c, _, err := websocket.DefaultDialer.Dial(u.String(), nil)
if err != nil {
log.Fatal("dial:", err)
}
for {
time.Sleep(time.Millisecond * 1) // 0.001秒休む
line, err = reader.Read()
if err != nil {
break
}
uniName := line[0]
//fmt.Printf("%s\n", uniName)
objType := line[9]
//fmt.Printf("%s\n", objType)
lon, _ := strconv.ParseFloat(line[8], 64)
//fmt.Printf("%f\n", lon)
lat, _ := strconv.ParseFloat(line[7], 64)
//fmt.Printf("%f\n", lat)
// 特定範囲に限定する
//if lon > 139.744330 && lon < 139.866586 && lat > 35.574777 && lat < 35.694479 {
if lon > 139.7583407156985 && lon < 139.81403350119444 && lat > 35.62835195825786 && lat < 35.66678018870369 {
flag := 0
for i := range list {
if i != 0 && list[i].uniName == uniName { // 同一IDを発見したら
list[i].lon = lon // 新しい経度情報の更新
list[i].lat = lat // 新しい緯度情報の更新
flag = 1
break
}
}
uniNum := len(list)
if flag == 0 { // 新しいIDを発見した場合
wg.Add(1) // goルーチンを実行する関数分だけAddする
go movingObject(uniNum, uniName, objType, lon, lat, &wg, c)
}
}
}
}
var mutex sync.Mutex
func movingObject(uniNum int, uniName string, objType string, lon float64, lat float64, wg *sync.WaitGroup, c *websocket.Conn) {
fmt.Printf("start movingObject\n")
defer wg.Done() // WaitGroupを最後に完了しないといけない。
defer c.Close()
// リストを作る前にテストをする
//fmt.Printf("%s\n", objType)
//fmt.Printf("%d\n", uniNum)
//fmt.Printf("%f\n", lon)
//fmt.Printf("%f\n", lat)
ut := unmTbl{} // 構造体変数の初期化
ut.uniName = uniName
ut.objType = objType
ut.simNum = uniNum
ut.lat = lat
ut.lon = lon
gl := new(GetLoc)
gl.ID = 0
gl.Lat = ut.lat
gl.Lng = ut.lon
mutex.Lock() // 送受信時にミューテックスロックしないと
err := c.WriteJSON(gl) // PruneMobile登録用送信
if err != nil {
log.Println("write1:", err)
}
gl2 := new(GetLoc) // PruneMobile登録確認用受信
err = c.ReadJSON(gl2)
mutex.Unlock()
ut.pmNum = gl2.ID // PrumeMobileから提供される番号
//fmt.Printf("ut.objType=%v\n", ut.objType)
list = append(list, ut) // 構造体をリストに動的追加
// ここからは更新用のループ
for {
time.Sleep(time.Millisecond * 100) // 0.1秒休む
// 前回との座標に差が認められれば、移動させる
if math.Abs(list[uniNum].lat-gl.Lat) > 0.000000001 || math.Abs(list[uniNum].lon-gl.Lng) > 0.000000001 {
fmt.Print("MOVING!\n")
gl.Lat = list[uniNum].lat
gl.Lng = list[uniNum].lon
gl.ID = gl2.ID
// 座標の送信
mutex.Lock()
err = c.WriteJSON(gl)
if err != nil {
log.Println("write2:", err)
}
// 応答受信
gl3 := new(GetLoc)
err = c.ReadJSON(gl3)
mutex.Unlock()
}
}
}
// simple_csv.go
package main
import (
"encoding/csv"
"flag"
"fmt"
"log"
"math"
"net/url"
"os"
"strconv"
"sync"
"time"
"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"`
}
// 構造体の作り方
type unmTbl struct {
uniName string // User Name: Example 6ca90e
objType string // "Bus" or "User"
simNum int
pmNum int
lon float64
lat float64
}
var list = make([]unmTbl, 0) // 構造体の動的リスト宣言
var addr = flag.String("addr", "0.0.0.0:8080", "http service address") // テスト
func main() {
file, err := os.Open("1.csv")
if err != nil {
panic(err)
}
defer file.Close()
var wg sync.WaitGroup
reader := csv.NewReader(file)
var line []string
for {
time.Sleep(time.Millisecond * 1) // 0.001秒休む
line, err = reader.Read()
if err != nil {
break
}
uniName := line[0]
//fmt.Printf("%s\n", uniName)
objType := line[9]
//fmt.Printf("%s\n", objType)
lon, _ := strconv.ParseFloat(line[8], 64)
//fmt.Printf("%f\n", lon)
lat, _ := strconv.ParseFloat(line[7], 64)
//fmt.Printf("%f\n", lat)
// 特定範囲に限定する
//if lon > 139.744330 && lon < 139.866586 && lat > 35.574777 && lat < 35.694479 {
if lon > 139.7583407156985 && lon < 139.81403350119444 && lat > 35.62835195825786 && lat < 35.66678018870369 {
flag := 0
for i := range list {
if i != 0 && list[i].uniName == uniName { // 同一IDを発見したら
list[i].lon = lon // 新しい経度情報の更新
list[i].lat = lat // 新しい緯度情報の更新
flag = 1
break
}
}
uniNum := len(list)
if flag == 0 { // 新しいIDを発見した場合
wg.Add(1) // goルーチンを実行する関数分だけAddする
go movingObject(uniNum, uniName, objType, lon, lat, &wg)
}
}
}
}
func movingObject(uniNum int, uniName string, objType string, lon float64, lat float64, wg *sync.WaitGroup) {
fmt.Printf("start movingObject\n")
defer wg.Done() // WaitGroupを最後に完了しないといけない。
//var upgrader = websocket.Upgrader{} // use default options
_ = websocket.Upgrader{} // use default options
// rand.Seed(time.Now().UnixNano())
flag.Parse()
log.SetFlags(0)
u := url.URL{Scheme: "ws", Host: *addr, Path: "/echo2"}
//log.Printf("connecting to %s", u.String())
c, _, err := websocket.DefaultDialer.Dial(u.String(), nil)
if err != nil {
log.Fatal("dial:", err)
}
defer c.Close()
ut := unmTbl{} // 構造体変数の初期化
ut.uniName = uniName
ut.objType = objType
ut.simNum = uniNum
ut.lat = lat
ut.lon = lon
gl := new(GetLoc)
gl.ID = 0
gl.Lat = ut.lat
gl.Lng = ut.lon
err = c.WriteJSON(gl) // PruneMobile登録用送信
if err != nil {
log.Println("write:", err)
}
gl2 := new(GetLoc) // PruneMobile登録確認用受信
err = c.ReadJSON(gl2)
ut.pmNum = gl2.ID // PrumeMobileから提供される番号
//fmt.Printf("ut.objType=%v\n", ut.objType)
list = append(list, ut) // 構造体をリストに動的追加
// ここからは更新用のループ
for {
time.Sleep(time.Millisecond * 100) // 0.1秒休む
// 前回との座標に差が認められれば、移動させる
if math.Abs(list[uniNum].lat-gl.Lat) > 0.000000001 || math.Abs(list[uniNum].lon-gl.Lng) > 0.000000001 {
fmt.Print("MOVING!\n")
gl.Lat = list[uniNum].lat
gl.Lng = list[uniNum].lon
gl.ID = gl2.ID
// 座標の送信
err = c.WriteJSON(gl)
if err != nil {
log.Println("write:", err)
}
// 応答受信
gl3 := new(GetLoc)
err = c.ReadJSON(gl3)
}
}
}
以下、上記記事のコピペ
// udp_sendto.go
// go run udp_sendto.go
// golangによるudpの送信"だけ"するプログラム
package main
import (
"fmt"
"math/rand"
"net"
"time"
)
func random(min, max float64) float64 {
return rand.Float64()*(max-min) + min
}
type unmTbl struct {
uniNum int
objType string // "Bus" or "User"
simNum int
pmNum int
lon float64
lat float64
}
func main() {
conn, err := net.Dial("udp4", "localhost:12345")
if err != nil {
panic(err)
}
defer conn.Close()
// 初期化
var ut [5]unmTbl
for i, _ := range ut {
ut[i].objType = "User"
ut[i].uniNum = i
ut[i].lat = 35.653976
ut[i].lon = 139.796821
}
for {
fmt.Println("Sending to server")
for i, _ := range ut {
ut[i].lat += random(0.5, -0.5) * 0.00001 * 10 * 5
ut[i].lon += random(0.5, -0.5) * 0.00002 * 10 * 5
str := ut[i].objType + "," + fmt.Sprint(ut[i].uniNum) + "," + fmt.Sprint(ut[i].lon) + "," + fmt.Sprint(ut[i].lat) + ","
fmt.Println(str)
_, err = conn.Write([]byte(str))
if err != nil {
panic(err)
}
time.Sleep(3 * time.Second) // 1秒休む
}
}
}
// udp_recvfrom.go
// go run udp_recvfrom.go
// golangによるudpの受信"だけ"するプログラム
package main
import (
"fmt"
"net"
)
func main() {
addr, _ := net.ResolveUDPAddr("udp", ":12345")
sock, _ := net.ListenUDP("udp", addr)
i := 0
for {
i++
buf := make([]byte, 1024)
rlen, _, err := sock.ReadFromUDP(buf)
if err != nil {
fmt.Println(err)
}
fmt.Println(string(buf[0:rlen]))
//fmt.Println(i)
//go handlePacket(buf, rlen)
}
}
package main
import (
"fmt"
)
// 構造体の作り方
type unm_tbl struct {
obj_type string // "Bus" or "User"
sim_num int
pm_num int
}
func main() {
list := make([]unm_tbl, 0) // 構造体の動的リスト宣言
ut := unm_tbl{} // 構造体変数の初期化
ut.obj_type = "User"
ut.sim_num = 1
ut.pm_num = 0
list = append(list, ut) // 構造体をリストに動的追加
ut = unm_tbl{} // 構造体変数の初期化
ut.obj_type = "Bus"
ut.sim_num = 2
ut.pm_num = 1
list = append(list, ut) // 構造体をリストに動的追加
ut = unm_tbl{} // 構造体変数の初期化
ut.obj_type = "Taxi"
ut.sim_num = 3
//ut.pm_num = 3
list = append(list, ut) // 構造体をリストに動的追加
for i, _ := range list { // リスト分、ループする
fmt.Println(list[i].obj_type)
fmt.Println(list[i].sim_num)
fmt.Println(list[i].pm_num)
}
fmt.Println(list)
}
新しい言語の勉強って、たいてい、文字列処理で挫折するよね。
https://www.openstreetmap.org/export#map=13/35.6367/139.8312 から、"You requested too many nodes (limit is 50000). Either request a smaller area, or use planet.osm"(ノード数が多すぎます(制限は50000)。もっと小さい領域を要求するか、 planet.osm を使用してください。) と言われた時の対応方法は以下の通りです。
(Step.1) 「ドラッグして別の領域を選択」を選択
(Step.2) 領域をマウスで拡大・変形した後、「Overpass API」を選択
(Step.3) 名前を付けて保存で、適当なファイル名(例 toyosu.osm)でセーブする
以上
最近、PC起動時に、
C:\Users\ebata>docker ps
Error response from daemon: open \\.\pipe\docker_engine_linux: The system cannot find the file specified.
などが出てきて、ドキっとさせられる症状が頻発している。
基本的には、Dockerアイコンを使って再起動(Restart docker...)で、改善するんだけど、心臓に悪い。
近い内に、何か起こりそうな気がします。