2021/03,江端さんの技術メモ

https://www.meti.go.jp/meti_lib/report/H30FY/000677.pdf

 

マイクロトランジッド

 

Chariot (サンフランシスコ周辺など)
• フォードが買収した通勤者向けの乗合バスサービス
• 利用者数に基づく柔軟なルート設定に特徴
• 14人乗りのシャトルバスを利用し、1日当たり100を超える路線
でサービス提供
出所: Tech Crunch, Chariot
Via (ニューヨーク、ワシントン、シカゴ 等)
• 乗客と車両の座席とをリアルタイムに関連づけ、同一ルートで
移動できる乗客をグループ化して配車する乗合バスサービス
• 車両の最適なルートに合わせて、利用者の乗降車スポットを
自動的に指定する仕組み
• テキサス州アーリントン市と提携。市の補助で運賃3ドルで運行

2021/03,江端さんの技術メモ

C 言語から GO 言語の関数を呼ぶ方法

を参考にさせて頂いて、実験中です。

大変申し訳ありませんが、ほぼ丸パクりさせて下さい。これから、頻繁に見る必要があり、万一ページがexpiredされたら青冷めますので。

hoge.goというファイル名のPrintHoge関数を C 言語から呼べるようにします。

  1. Cをインポートする
  2. C 言語から呼びたい関数に//export XXXXを書く (普通、//とするとコメントなんだけどなぁ)
  3. コンパイルする
package main

import (
    "C"
    "fmt"
)

//export PrintHoge
func PrintHoge() {
    fmt.Println("hoge")
}

func main() {}

main関数がないとエラーになるので、空で良いので書いておきます。

-buildmode=c-archiveオプションをつけてgo buildします。

$ go build -buildmode=c-archive hoge.go

すると、hoge.aアーカイブとhoge.hヘッダが生成されます。

生成されたヘッダをインクルードして、Go 言語の関数を呼びます。

#include <stdio.h>
#include "hoge.h"

int main() {
    PrintHoge();
    return 0;    
}

生成されたアーカイブと一緒にコンパイルします。

$ gcc -o hoge hoge.a main.c

ところが、

$ gcc -o hoge hoge.a main.c
C:/msys64/mingw64/bin/../lib/gcc/x86_64-w64-mingw32/10.2.0/../../../../x86_64-w6
4-mingw32/bin/ld.exe: C:\Users\ebata\AppData\Local\Temp\cc1F3Mbe.o:main.c:(.text
+0xe): undefined reference to `PrintHoge'
collect2.exe: error: ld returned 1 exit status

が出てきて、「変だなー」と思いつつ、色々調べてみたのですが、hoge.aを一番最後にしたら、動きました。

$ gcc -o hoge main.c hoge.a
$ ./hoge
hoge
以上

2021/03,江端さんの技術メモ

■外部から強制的に書き込もうとすると失敗します

ubuntu@ip-172-26-7-19:~/codes/xxxxxxx_ride_hailing_go$ docker ps

095fe60f02cc nginx:1.15-alpine "nginx -g 'daemon of…" 8 weeks ago Up 22 minutes 0.0.0.0:80->80/tcp, 0.0.0.0:443->443/tcp xxxxxxx_ride_hailing_go_nginx_1

でもって、

ubuntu@ip-172-26-7-19:~/codes/xxxxx_ride_hailing_go$ sudo docker cp fullchain.pem 095fe60f02cc://etc/nginx/conf.d/

Error response from daemon: Error processing tar file(exit status 1): unlinkat /etc/nginx/conf.d/fullchain.pem: device or resource busy (失敗します)

しかし、dockerの中に入って、

ubuntu@ip-172-26-7-19:~/codes/xxxxxx_ride_hailing_go$ docker exec -i -t xxxxx_ride_hailing_go_nginx_1 sh

で内側から、killすると、dockerごとダウンして、なんとも悩ましい、にわとりと卵の関係になってしまいます。

■解決方法

ubuntu@ip-172-26-7-19:~/codes/xxxxxxx_ride_hailing_go$ sudo docker cp fullchain.pem 095fe60f02cc://etc/nginx/conf.d/fullchain.pem.new

ubuntu@ip-172-26-7-19:~/codes/xxxxxxx_ride_hailing_go$ sudo docker cp privkey.pem 095fe60f02cc://etc/nginx/conf.d/privkey.pem.new

でもって、 (今後は、new2, new3, new4 とか、どんどん増やしていく)

ubuntu@ip-172-26-7-19:~/codes/xxxxxxx_ride_hailing_go$ vi nginx.conf

をして、

———————————————————

ssl_certificate /etc/nginx/conf.d/fullchain.pem.new;

ssl_certificate_key /etc/nginx/conf.d/privkey.pem.new;

———————————————————

と書き換える。

さらに、

docker-compose.yml の最後の行に、

volumes:

- "./nginx.conf:/etc/nginx/conf.d/default.conf"

- "./fullchain.pem:/etc/nginx/conf.d/fullchain.pem.new"

- "./privkey.pem:/etc/nginx/conf.d/privkey.pem.new"

も変える。

でもって、 docker-compose stop; docker-compose start をすれば、新しい鍵で動き出します。不細工ではありますが、プログラムは動くようになります。

■ところで今思いついたんだけど、いい方法がありました。

現在は、fullchain.pem.new と、privkey.pem.new で動いているのだから、fullchain.pem と、privkey.pemは、rm できるはず。

で、cp fullchain.pem.new fullchain.pem, cp privkey.pem.new privkey.pem として、さらに、nginx.confの設定を元に戻せば、fullchain.pem と、privkey.pem の名前を使えるはずです

(まあ、動いているので、今は、このままにしています)

■もっと、いい方法がありました。

docker-compose.yml の最後の行に、

volumes:

- "./nginx.conf:/etc/nginx/conf.d/default.conf"

- "./fullchain.pem:/etc/nginx/conf.d/fullchain.pem"

- "./privkey.pem:/etc/nginx/conf.d/privkey.pem"

の3行を加えれば、Dockerの外側に、最新の"fullchain.pem"と、"privkey.pem"を置いておけば、自動的にDockerコンテナの中に取り込まれます(今、そうなっている)

2021/03,江端さんの技術メモ

Go言語をVSCodeを使ってデバッグをしようとするとすると以下のメッセージが出てきて、困っていました。

"Failed to continue: Check the debug console for details."

が消えなくて、困っていたのですが、

// +build ignore
package main

の "// +build ignore"を消したら、消えました。

 

 

2021/03,江端さんの技術メモ

go run xxxx.go で起動すると、「このアプリの機能のいくつかがwindows defenderファイアウォールでブロックされています」が出てきます

素直に、go build xxxxx.go として、exeファイルを作って、実施すれば、出てこなくなります。

2021/03,江端さんの技術メモ

swigを使ってgoとc++をブリッジをやっているのですが、そうなると、コンパイルオプションの

gcc xxxx xxxxx  -I c:\users\ebata\json\include

というような、力づくが使えないです。

まあ、色々やり方はありますが、一番簡単なのは、Windows10のコントロールパネルから、"CPATH" を作って、 ダイレクトに"c:\users\ebata\json\include"を書き込むのが簡単です。

スマートとか、かっこいいとか、汎用性とか、そういうことは、考えないのが良いです。

2021/03,江端さんの技術メモ

まず、何も考えないで以下のプログラムを実行

// go run main2.go

package main

import (
	"fmt"
)

func subPerson(i int) {
	fmt.Printf("Now... sub_person(%v)\n", i)
}

func person(i int) {
	fmt.Printf("Now... person(%v)\n", i)

	go subPerson(i)
}

func main() {

	for i := 0; i < 5; i++ {
		go person(i)
	}

}

当然、何も表示されれない。go routineが起動する前に、main()が終了してしまうから

なので、最後のスレッドが完了するまでは待機するようにする

// go run main2.go

package main

import (
	"fmt"
	"sync"
)

func subPerson(i int) {
	fmt.Printf("Now... sub_person(%v)\n", i)
}

func person(i int, wg *sync.WaitGroup) {
	defer wg.Done() // WaitGroupを最後に完了しないといけない。
	fmt.Printf("Now... person(%v)\n", i)

	go subPerson(i)
}

func main() {

	var wg sync.WaitGroup
	for i := 0; i < 5; i++ {
		wg.Add(1) // goルーチンを実行する関数分だけAddする
		go person(i, &wg)
	}
	wg.Wait()
}

$ go run main2.go
Now... person(0)
Now... sub_person(0)
Now... person(4)
Now... sub_person(4)
Now... person(2)
Now... person(3)
Now... sub_person(3)
Now... person(1)

ただ、これの場合、subPerson()が実行されないまま終了することがある。例えば、、上記の場合、sub_person(1)が実施されずに終了してしまっている。

なので、subPerson()の終了を持って、main()の終了とするようにすると、こうなる。

// go run main2.go

package main

import (
	"fmt"
	"sync"
)

func subPerson(i int, wg *sync.WaitGroup) {
	defer wg.Done() // WaitGroupを最後に完了しないといけない。
	fmt.Printf("Now... sub_person(%v)\n", i)
}

func person(i int, wg *sync.WaitGroup) {
	subWG := wg
	//defer wg.Done() // WaitGroupを最後に完了しないといけない。
	fmt.Printf("Now... person(%v)\n", i)

	go subPerson(i, subWG)
}

func main() {

	var wg sync.WaitGroup
	for i := 0; i < 5; i++ {
		wg.Add(1) // goルーチンを実行する関数分だけAddする
		go person(i, &wg)
	}
	wg.Wait()
}

結果は、以下の通りとなり、問題なし。

 

$ go run main2.go
Now... person(0)
Now... person(1)
Now... sub_person(1)
Now... person(4)
Now... sub_person(4)
Now... sub_person(0)
Now... person(2)
Now... sub_person(2)
Now... person(3)
Now... sub_person(3)

 

 

 

 

 

 

 

 

 

 

 

2021/03,江端さんの技術メモ

「ドメイン "sea-anemone.tech "のLet's Encrypt証明書期限切れのお知らせ」というのがメールで届きました。
一通りメールを読んだのだけど、詰るところ「作り直せ」ということかな、理解して、以前書いたメモ通りを実施して、関係のあるディレクトリに片っぱしからバラまくことにました 。
に記載されたことを、唯唯諾諾と実施しました。
―― 自動化シェルスクリプトなどというシャレたものを"作らない"ことが寛容だ、ということを、私は知っています。
Let's Encrypt certificate expiration notice for domain "sea-anemone.tech"


ドメイン "sea-anemone.tech "のLet's Encrypt証明書期限切れのお知らせ。


Hello,


こんにちは。


Your certificate (or certificates) for the names listed below will expire in 19 days (on 29 Mar 21 23:38 +0000). Please make sure to renew your certificate before then, or visitors to your web site will encounter errors.


以下の名前に対するあなたの証明書(または複数の証明書)は、19日後(29 Mar 21 23:38 +0000)に期限切れとなります。それまでに証明書を更新しないと、あなたのウェブサイトにアクセスした際にエラーが発生します。


We recommend renewing certificates automatically when they have a third of their total lifetime left. For Let's Encrypt's current 90-day certificates, that means renewing 30 days before expiration. See https://letsencrypt.org/docs/integration-guide/ for details.


私たちは、証明書の有効期間の3分の1が経過した時点で、証明書を自動的に更新することをお勧めします。現在のLet's Encryptの90日証明書の場合、期限切れの30日前に更新することになります。詳細は https://letsencrypt.org/docs/integration-guide/ をご覧ください。


sea-anemone.tech


For any questions or support, please visit: https://community.letsencrypt.org/ Unfortunately, we can't provide support by email.


ご質問やサポートについては、次のサイトをご覧ください: https://community.letsencrypt.org/ 残念ながら、電子メールによるサポートは行っておりません。


For details about when we send these emails, please visit: https://letsencrypt.org/docs/expiration-emails/ In particular, note that this reminder email is still sent if you've obtained a slightly different certificate by adding or removing names. If you've replaced this certificate with a newer one that covers more or fewer names than the list above, you may be able to ignore this message.


特に、名前を追加または削除してわずかに異なる証明書を取得した場合にも、このリマインダーメールが送信されますのでご注意ください。この証明書を、上記のリストよりも名前の数が多かったり少なかったりする新しい証明書に差し替えた場合は、このメッセージを無視することができるかもしれません。


If you are receiving this email in error, unsubscribe at:


誤ってこのメールを受信している場合は、以下の方法で配信を停止してください。


  http://delivery.letsencrypt.org/track/unsub.php?u=30850198&id=f76fe707fe6142509a23d40dde02c153.3i5yYrnKlNWIWqOs%2Fn8YMBMPOVU%3D&r=https%3A%2F%2Fmandrillapp.com%2Funsub%3Fmd_email%3Dt%252A%252A%252A%252A%2540g%252A%252A%252A%252A.%252A%252A%252A




Please note that this would also unsubscribe you from other Let's Encrypt service notices, including expiration reminders for any other certificates.


これにより、他の証明書の期限切れのお知らせなど、Let's Encryptの他のサービスのお知らせも配信停止となりますので、ご注意ください。




Regards,
The Let's Encrypt Team


Let's Encryptチーム