2020/05,江端さんの技術メモ

下記のプログラムをコンパイルする

/*
		go build -gcflags "-N -l" main.go
*/
package main

import (
    "fmt"
    "database/sql"
    _ "github.com/lib/pq"
    "os"
)

// ----------------------------------------------------------------
func main() {
    fmt.Fprintln (os.Stderr,"*** 開始 ***")
    db, err := sql.Open("postgres", "user=scott dbname=city password=tiger123 sslmode=disable")
    defer db.Close()

    sql_str := "select id,name,population,date_mod from cities order by id"

    rows, err := db.Query(sql_str)
    if err != nil {
        fmt.Println(err)
        }
    defer rows.Close()

    for rows.Next() {
        var id string
        var name string 
        var population int
        var date_mod string 
        if err := rows.Scan(&id,&name,&population,&date_mod); err != nil {
            fmt.Println(err)
        }
        fmt.Printf ("%s\t%s\t%d\t%s\n",id, name,population,date_mod)
    }

    if err := rows.Err(); err != nil {
        fmt.Println(err)
        }

    fmt.Fprintln (os.Stderr,"*** 終了 ***")
}

で "github.com/lib/pq" がない、とエラーが出てくる。

C:\Users\ebata>go get github.com/lib/pq

で、すんなりインストール成功。で、コンパイルをしたら通ったので、とりあえずメモしておく。これからdockerでDBつくって動作を試す。

2020/05,江端さんの技術メモ

package main

import (
	"fmt"
	"strings"
)

func main() {
	c0 := make(chan string)  // makeってなんだ? →"配列"でも"共有メモリ"でもいいが、
	c1 := make(chan string)  // 江端理解では「トンネル」とか「パイプ」とか「Amazonのダンボール箱」 

	go sourceGopher(c0)      // "c0"とラベルの付いたダンボール箱を使うぜ
	go filterGopher(c0, c1)  // "c0","c1"とラベルの付いたダンボール箱を使うぜ 
	printGopher(c1)          // "c1"とラベルの付いたダンボール箱を使うぜ
}

func sourceGopher(downstream chan string) {
	for _, v := range []string{"hello world", "a bad apple", "goodbye all"} {
		downstream <- v   // "c0"のダンボール箱に、(1)"hello world",(2)"a bad apple", (3)"goodbye all"を投げ入れる
	}
	downstream <- ""   // "c0"のダンボール箱の底にクッション(プチプチ)を入れる
}

func filterGopher(upstream, downstream chan string) {
	for {
		item := <-upstream     // "c0"のダンボール箱からクッションを取り出す
		if item == "" {        // クッションだったら
			downstream <- ""   // "c1"のダンボール箱にクッションを入れる
			return             // ダンボール箱の蓋を閉める
		}
		if !strings.Contains(item, "bad") {   // "bad"という文字列が入っていない荷物だったら
			downstream <- item // "c1"のダンボール箱に荷物を入れる
		}
	}
}
func printGopher(upstream chan string) {
	for {
		v := <-upstream // "c1"のダンボール箱から荷物を出す
		if v == "" {    // "c1"の荷物がクッションだったら
			 return     // ダンボール箱を閉める
		}
		fmt.Println(v)  // 荷物を読み上げる
	}
}

2020/05,江端さんの技術メモ

良く忘れるので書いておく。

(1)Goは一度も使われない変数があると、全部エラーにしてしまう → 「せっかく買ったのに、どうして使わないの?」と言い続ける、うっとうしい母親みたいなもの

(2)返り値のある変数があるけど、別に返り値が必要でないときがある。
例えば、2つの返り値がある関数で、「2つもはいらんわ」という時に、こうなる

f := func(num1 int, num2 int)(int, int){
	return num1 + num2, num1 - num2
}
ret1, ret2 := f(8, 7)  // "a"が不使用のためエラー:a declared and not used
fmt.Println(ret2)

(3)でも、こうすれば、エラーにならない

ret1 はいらん → これを"_"と書く

_, ret2 := f(8, 7)  // エラーがでてこなくなる
fmt.Println(ret2)

2020/05,江端さんの技術メモ

// go build -gcflags "-N -l" main.go ← これで、golangのプログラムをgdbで動かすことができたぞ(マグレかもしれないけど)

package main

import (
    "fmt"
    "time"
)

func counting(c chan<- int) {
    for i := 0; i < 10; i++ {
        time.Sleep(2 * time.Second)
        c <- i
    }
    close(c)
}

func main() {
    msg := "Starting main"
    fmt.Println(msg)
    bus := make(chan int)
    msg = "starting a gofunc"
    go counting(bus)

    for count := range bus {
        fmt.Println("count:", count)
    }
}

2020/05,江端さんの技術メモ

PostgresSQLは使い慣れてくると手放せなくなります。もう、テーブルをプログラムの中に作るな面倒くさくてやっていられません。どんなに小さいテーブルでも、PostgreSQLにつくって、そのまま放置しておきます。CSVすら面倒くさい。

しかし、PostgreSQLは頻繁にバージョンアップするので、結構面倒くさい思いをします。

そこで、Dockerで作って、そのまま放置するという戦略を取ることにしました。理屈は分からないけど、取り敢えず、ネットの情報を使ってここまでやってみたところ、動いているっぽいです。

C:\Users\ebata> docker run --rm -d -p 15432:5432 -v postgres-tmp:/var/lib/postgresql/data -e POSTGRES_HOST_AUTH_METHOD=trust postgres:12-alpine

C:\Users\ebata>docker container ls

CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
e373f69553b8 postgres:12-alpine "docker-entrypoint.s…" 11 minutes ago Up 11 minutes 0.0.0.0:15432->5432/tcp frosty_golick

C:\Users\ebata>docker container exec -it frosty_golick bash

bash-5.0# psql -U postgres
psql (12.3)
Type "help" for help.

postgres=#

2020/05,江端さんの技術メモ

現在、お名前.comで、2つのドメイン名取得して、AWSで運用しています。しかし、そのうち一つは上手く動いているのに、もう一つでは動かずに困っていました。

AWSのLBSやらRoute53の設定を消したり追加したりしても、何も状況が改善されません。

PCにwiresharkをインストールして、調べたのですが、そもそも名前解決事態ができておらず、AWSのネームサーバに飛んでいないようです。

お名前.comの登録を調べてみると、以下の「登録済み」がどうしても消せない。

とりあえず、これを全滅させなければ、お話にならないので、

の一番下の方にある

なんかねー、ドメインを削除されるんじゃないかと、ドキドキしながらボタン押しました。

やっとこれで、全削除に成功しました。

さて、Route53の情報を書き込みましたが、明日くらいに反映されているといいな

EC2を停止して開始した時はELBに再登録する
https://dev.classmethod.jp/articles/elb-re-register/

2020/05,江端さんの技術メモ

以下の手続が必要だったらしい

(1)"DNS設定をファイルにエクスポート"を押して、excelファイルを得る。

(2)_2063067eb965145f723aadfgfd2c0b1302e78.more.more. てな感じも文字列と、_866388707fdaetouadfhioe3c9c5c8c3854a613.auiqqraehs.acm-validations.aws.てな感じの文字列をコピーしておく

(3)Route53の初期画面から、more.moreを選んで、「レコードセットの作成」をクリックして、タイプに"CNAME"を選ぶ。

(4)"名前"のところに、_2063067eb965145f723aadfgfd2c0b1302e78 を放り込む

(5)"値"のとろに_866388707fdaetouadfhioe3c9c5c8c3854a613.auiqqraehs.acm-validations.aws. を放り込む

(6)"レコードセットの保存"をクリックして、"Certificate Manager" の画面に戻って、数分待つと、"検証状態"が、"成功"になっている

―― といいな。(今回は上手くいったけど)

2020/05,江端さんの技術メモ

セキュリティの問題は後回しとして、考えうるポートを全部開けてしまう(デフォルトでは、SSHだけ開いていた)

これで、EC2のWebサーバへの直接アクセスが可能状態になる

リモートから、>curl (IPアドレス (SSHのログインアドレス)) の直打ちで、htmlの内容が表示されれば成功

2020/05,江端さんの技術メモ

嘘です。コンパネを真っ二つにする裁断を1回だけやりました(Unidyでやってもらった)。

使った材料は、1800x900のコンパネ3枚と、4X2の1800の角材5本、木ネジ60本、自宅の庭に放置されていたコンクリートの固定具です。制作時間は2時間強くらいでした。