- 投稿日:2020-06-19T22:34:57+09:00
まっさらなSSDにmint20betaをインストール
まず、editorなににしようかな?
この時間って、かなり至福な時間。emacsとか、むかしのSSDもあるので、そこから.emacsを引っ張ってくれば
すぐに設定は終わると思いきや。。まず、ちょうひさしぶりのosインストールから、さらにはeditor
時代が変わりすぎていた。aptでとか思ったら、いまはsnapd? , flatpak?
なんじゃそれ?
なにげジェネレーションギャップを感じたまた、mintだけsnapdは、拒否られているさまw
あとからしらべてやっとわかったのだが、自分もsnapdのような文化はいやかもw
mintが拒否るのもしかたないというか、良い方向かもwaptでなく、今回はgimpとemacsは、flatpakでいれてみた。
また、ここでジェネレーションギャップが。。
/usr/local/binあたりにemacsがあるのかな?と思ったら、
ちがうじゃんwしかたないから、デスクトップにemacsをピンとめして、
そのファイルを見て、どこから起動してるかしらべるところからwまた、ここで、びっくりw
/usr/bin/flatpak その引数に emacsやらgimpがw
まあ、かなりのジェネレーションギャップだなwとりあえず、emacsはインストールできたっと。(このさい、spacemacsにもこころが行ったが、やめといた)
で、go-modeのライブラリーをgo get で、。。
え??なんか、様子がおかしいw
またここでw
”LSP”というあたらしい用語がw
さいしょemacsのLISP??のこと?とよぎったが、ちがったwどんだけ世界が変わってるのだ?w
language server?w emacsの起動時もしくは、go関連のファイルを開いたら
ネットにってw重くないか?wそれも、goplsをgetしてとかよくわからないんだがw
emacsでちゃんとgoソースを開いて、autocompleteしてくれるまで、まだまだ道のりがながそうだw
- 投稿日:2020-06-19T15:38:37+09:00
Go言語でHelloWorldを実行しようとしたらエラーになった
Hello world が出来なかった話
業務でGolangを使用する機会がありました。
本格的には触らなかったので、とりあえず自習しようとしました。
- とりあえず
hello.goを作ってhello worldを表示しようとします。$ go run hello.go exec: "C:\\Users\\xxxxx\\AppData\\Local\\Temp\\go-build929698758\\b001\\exe\\hello": file does not existああ??なんだこれ?hello World で死ぬか?普通?ってなったわけです。
失敗した原因
とりあえず build だけやってみる
xxxxx@xxx MSYS /c/Users/xxxxx/Documents/test/go $ go build hello.go xxxxx@xxx MSYS /c/Users/xxxxx/Documents/test/go $ ls hello hello.go
- バイナリ?が windows のじゃない!!
windowsで実行するなら
$ ls hello.exe hello.goができるのが正解ですよね~
こうなる原因が環境変数のGOOSでした。
$ env | grep GOOS GOOS=linuxこうなっていたわけですよ。この
GOOS=linuxがいけなかった。
業務中にテキトーに設定したのがいけなかった。
GOOS=linuxって環境変数を設定しているとbuildして作られるバイナリファイルがLinux向けに作られるっぽい?
MSYS2またはgit-for-windows上でなら実行できるのでは?とか思ったのですがエラーでしたね。
てことで、どうすれば良いのか
GOOSを変えます
$ export GOOS=windows # cmdだったら以下 set GOOS=windowsをした後に build すると
hello.exeが生成されますよっと。
これで解決。
GOOS=windowsに設定するのが正しいのかは知らない。
もうこの環境変数消した方がいいのかな。
- 投稿日:2020-06-19T09:17:41+09:00
go修行8日目 Panicとか
エラーハンドリング
package main import ( "fmt" "log" "os" ) func main() { file, err := os.Open("./tt.go") if err != nil { log.Fatalln("Error") } defer file.Close() data := make([]byte, 100) // errは上書きでinicializeしている count, err := file.Read(data) if err != nil { log.Fatalln("Error") } fmt.Println(count, string(data)) }2020/06/19 08:37:42 Errorパニック
- 例外エラーの中の例外
- 何をしたらいいかわからない状態なのでなるべくエラーハンドリングするとよい
package main import "fmt" // DB接続パッケージ func thirdPirtyConnectDB() { panic("Unable to connect database") } func save() { // 強制終了させないようにrecoverする defer func() { s := recover() fmt.Println(s) }() thirdPirtyConnectDB() } func main() { save() fmt.Println("OK?") }Unable to connect database OK?
- 投稿日:2020-06-19T08:34:29+09:00
Vue.jsからaxiosでGoにパラメータ渡せなくてつまり続けたが、Echo導入したら即解決した
Vueで入力された値をJson形式でGoに渡して処理をさせたかった。
うまい感じに渡せず、詰まったがEcho導入したら即解決した。やりたいこと
- VueからPost(非同期)でパラメータを渡して、Goで処理をさせたい。
- とりあえず、Axiosで送信したparamsがGoで受け取れていることを確認したい。
VueとAxios
あるボタン押下時にtestを実行して、data1とdata2をjson形式でpostする。
Goの処理結果をconsoleに表示する。axiosはpost時、以下のように渡せば自動的にjson形式にしてくれるらしい。
vue.js(一部抜粋)<script> export default { name: 'SqlGenerater', data() { return { data1:'1', data2:'2', } }, methods:{ test(){ let params= { data1: this.data1, data2: this.data2, } this.$axios.get('/api',{ params: params }) .then(response => { console.log(response.data) }) } } } </script>Go(Echo)
Echo公式のrequestにかなりわかりやすく書いてある。
下記のようにすれば自動でバインドできるみたい。すごく便利ぃmain.gopackage main import ( "net/http" "github.com/labstack/echo" ) type Test struct { Data1 string `json:"data1" form:"data1" query:"data1"` Data2 string `json:"data2" form:"data2" query:"data2"` } func main() { e := echo.New() e.GET("/", index) e.Logger.Fatal(e.Start(":8081")) } func index(c echo.Context) (err error) { t := new(Test) if err = c.Bind(t); err != nil { return } return c.JSON(http.StatusOK, t) }実行したら、ちゃんと取れてることが確認できた。
console{data1: "1", data2: "2"}ありがとうEcho
- 投稿日:2020-06-19T02:41:07+09:00
【Golang】テスト
【Golang】テスト
Golangの基礎学習〜Webアプリケーション作成までの学習を終えたので、復習を兼ねてまとめていく。 基礎〜応用まで。
//main.go package main //testing //テストを書く位置は、テストしたいファイルと同じ階層に書く. //math.go = math_test.go という名前で作成。_test.goを探して実行される //math_test.goに移動 //ターミナルで プロジェクトの中で、go test ./... で実行できる //詳しいテスト内容を表示 go test -v ./... /* ? kiso_blog/go_test [no test files] ok kiso_blog/go_test/alib 0.328s */ //相対パスでテストをやる場合、go test ./alib /* aoyagimasanori@aoyagimasanorinoMacBook-Pro go_test % go test ./alib ok kiso_blog/go_test/alib 0.302s */ //カバー率 go test -cover ./alib /* ok kiso_blog/go_test/alib 0.246s coverage: 100.0% of statements */ //mainパッケージのテスト //go test -v /* === RUN TestIsOne TestIsOne: main_test.go:15: 2 != 1 --- FAIL: TestIsOne (0.00s) FAIL exit status 1 FAIL kiso_blog/go_test 0.226s */ //ユニットテストをやる場合は、Ginkgo(rubyっぽい),Gomega(jsっぽい)などを使ったりする import ( "fmt" //ここのエラーは相対パスだから //"./alib" "kiso_blog/go_test/alib" ) func IsOne(i int) bool { if i == 1{ return true }else{ return false } } func main() { s := []int{1,2,3,4,5} fmt.Println(s) fmt.Println(alib.Average(s)) }//main_test.go package main //mainパッケージのテスト import "testing" var Debug bool = false func TestIsOne(t *testing.T) { i := 2 if Debug{ t.Skip("スキップする") } v := IsOne(i) if !v{ t.Errorf("%d != %d",i, 1) } }//alib/alib.go package alib func Average(s []int) int { total := 0 for _, i := range s { total += i } return int(total / len(s)) }//alib/alib_test.go package alib //テスト用パッケージを読み込み import "testing" //このテストを飛ばしたい時はtrueにする var Debug bool = false //テスト //Average関数のテスト例 //Test関数名にする //引数はtにする。Errorなどの関数が使える。Skipなど func TestAverage(t *testing.T) { if Debug { t.Skip("スキップします") } //ave3.5(1,2,3,4,5,6)は3になるらしい。 //7までにすると、下記エラーが出る /* === RUN TestAverage TestAverage: alib_test.go:22: 3じゃない 4 TestAverage: alib_test.go:23: 4 != 3 --- FAIL: TestAverage (0.00s) FAIL FAIL kiso_blog/go_test/alib 0.308s FAIL */ v := Average([]int{1, 2, 3, 4, 5}) //6,7 でエラー //もし、3でなければエラー if v != 3 { //エラー文字、値 t.Error("3じゃない", v) t.Errorf("%d != %d", v, 3) } }
- 投稿日:2020-06-19T02:27:17+09:00
【Golang】データベース操作 sqlite3
【Golang】データベース操作 sqlite3
Golangの基礎学習〜Webアプリケーション作成までの学習を終えたので、復習を兼ねてまとめていく。 基礎〜応用まで。
package main /* sqliteをインストールする際の手順の確認 PostgreSQL は次回。ほぼ同じだが。 インストール済 https://qiita.com/__init__/items/2edfc7acf11234e5b1aa Mac # brew のインストール -> https://brew.sh/index_ja # sqlite3 をインストール brew install sqlite Install gcc C言語のライブラリをインポートするので、GOがビルドする際に必要 -> https://developer.apple.com/xcode # ドライバのインストール go get github.com/mattn/go-sqlite3 # 不要だが一応 export CGO_ENABLED=1 Windows Install sqlite3 -> https://www.sqlite.org/download.html Install gcc -> http://tdm-gcc.tdragon.net/ # ドライバのインストール go get github.com/mattn/go-sqlite3 # 不要だが一応 set CGO_ENABLED=1 macでバージョン確認 # sqlite3 インストール確認 $ sqlite3 SQLite version 3.19.3 2017-06-27 16:48:08 Enter ".help" for usage hints. Connected to a transient in-memory database. Use ".open FILENAME" to reopen on a persistent database. sqlite> # sqlite3 を抜ける sqlite> .exit # xcode のコマンドラインツールの確認 $ xcode-select --install xcode-select: error: command line tools are already installed, use "Software Update" to install updates # gcc インストール確認 $ gcc --version Configured with: --prefix=/Applications/Xcode.app/Contents/Developer/usr --with-gxx-include-dir=/usr/include/c++/4.2.1 Apple LLVM version 10.0.0 (clang-1000.11.45.5) Target: x86_64-apple-darwin17.7.0 Thread model: posix InstalledDir: /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin //データベース操作 */ import ( "database/sql" "fmt" "log" //インポート _にしないとコンパイルエラーになる。使用しない為 _ "github.com/mattn/go-sqlite3" ) var DbConnection *sql.DB type Person struct { Name string Age int } func main() { //1 //DBを開く なければ作成される DbConnection, _ := sql.Open("sqlite3", "./example.sql") //終わったら閉じる defer DbConnection.Close() //DB作成 SQLコマンド cmd := `CREATE TABLE IF NOT EXISTS person( name STRING, age INT)` //実行 結果は返ってこない為、_にする _, err := DbConnection.Exec(cmd) //エラーハンドリング if err != nil { fmt.Println("エラー") log.Fatalln(err) } //ターミナル //sqlite3 //.table //SELECT * FROM tablename; //で確認 //2 CRUD処理 //Create //データを追加 //VALUES (?, ?) 値は後で渡す。セキュリテイの関係でこのようにする方がいい //SQLインジェクション 悪意あるコマンドでDBが操作されてしまうのを防ぐ ?でエスケープしてくれる cmd = "INSERT INTO person (name, age) VALUES (?, ?)" //実行 //レコードを取得する必要のない、クエリはExecメソッドを使う //第二引数からは、コマンド?部の値 _, err = DbConnection.Exec(cmd, "Nancy", 20) if err != nil { log.Fatalln(err) } //Update //データの更新 Mike が存在する場合 cmd = "UPDATE person SET age = ? WHERE name = ?" _, err = DbConnection.Exec(cmd, 25, "Mike") if err != nil { log.Fatalln(err) } //Read //Get All //マルチセレクト //データ全てをループで表示 //Queryは全て取得する cmd = "SELECT * FROM person" rows, _ := DbConnection.Query(cmd) defer rows.Close() //structを作成 var pp []Person //取得したデータをループでスライスに追加 for rows.Next() for rows.Next() { var p Person //scan データ追加 err := rows.Scan(&p.Name, &p.Age) if err != nil { log.Println(err) } pp = append(pp, p) } err = rows.Err() if err != nil { log.Fatalln(err) } //表示 for _, p := range pp { fmt.Println(p.Name, p.Age) } //特定のデータを取得 cmd = "SELECT * FROM person where age = ?" //age = 20にして実行 //QueryRowは最初の一件だけ取得する。 row := DbConnection.QueryRow(cmd, 20) var p Person err = row.Scan(&p.Name, &p.Age) if err != nil { //データがなかったら if err == sql.ErrNoRows { log.Println("No row") //それ以外のエラー } else { log.Println(err) } } fmt.Println(p.Name, p.Age) //Delete //データの削除 全て cmd = "DELETE FROM person WHERE name = ?" _, err = DbConnection.Exec(cmd, "Nancy") if err != nil { log.Fatalln(err) } //マルチセレクト テーブルもSQLインジェクション対策 //こちらを推奨 //データを構造体に入れて表示 //テーブルはSQLインジェクション対策が使えない tableName := "person" //テーブル名指定は?が使えない為、%sを使う。 //後に対応されるかも? cmd = fmt.Sprintf("SELECT * FROM %s", tableName) rows1, _ := DbConnection.Query(cmd) defer rows1.Close() var pp1 []Person //パターンとして覚える for rows1.Next() { var p Person //データを構造体に追加 err := rows1.Scan(&p.Name, &p.Age) if err != nil { log.Println(err) } //ppに追加 pp1 = append(pp1, p) } //まとめてエラーチェック err = rows1.Err() if err != nil { //エラーなら終了 log.Fatalln(err) } for _, p := range pp1 { fmt.Println(p.Name, p.Age) } }