まったりするmatayu

ツイートにゴミがついた感じのブログ

コーヒー

普段は紅茶やほうじ茶を飲むのだが,最近コーヒーをよく飲むようになった.

実は,コーヒーを飲むとお腹が痛くなることが多いのだが

コーヒの味自体は好きなので飲んでしまう.

しかし,お腹が比較的痛くならない飲み方を見つけた.

それはお菓子を一緒に食べることだ.

どら焼きとかクリームの入ったパンとかを一緒に食べる.

そうすると負担がかからないのか,あまりお腹を痛くしない.

それに苦味と甘味がマッチしてより美味しく感じるのだ.

コーヒーを飲む時のお菓子は必須である.

寝床から見えるところに時計を置かないという試み

大学が原則リモート講義になり1ヶ月と少しがたった.

それによって車での通学をする必要がなくなり,朝にやらなければならないことが無くなった.

自分の使える時間が増えたということだから得した気分になった.

しかしながら,人間は余裕が出るとその余裕を埋めたくなるような欲求があるのか知らないが,

私の余裕は二度寝で埋められてしまった.

せっかく通学の分の時間が自由に使えるようになったというのに,結局講義が始まる少し前まで寝ているのだ.

寝ることは大事なことだから,別にそれでも良いのではと言われればそうなのだが,

私は少し勿体なさを感じたからどうにか早く起きようといろいろ対策を考えた.

まず思いついた対策は「次の日の朝にやることを,寝る前に決めてから寝ること」だ.

そうすれば朝起きる目的ができて起きれるようになると思ったからだ.

しかしこの方法は失敗に終わってしまった.

なぜ失敗したかというと,朝やろうと決めたことは大抵朝でなくてもできることだったからだ.

自分がやろうと決めたのはプログラムを書くとか絵を描くとかそういうもので,自分の好きなことであった.

好きなことだから,寝る前はよしやるぞという気合いや楽しみの含まれた気持ちを持っているのだが,

不思議なことに朝になるとそんな気持ちは睡眠欲でかき消され,もう少し寝てからやろうといった感じで二度寝をしてしまう.

私の好きなことに対する熱意が足りないと言われるとそれまでだが,

睡眠欲というのは思ったより強烈なのだ.

同じように,「次の日にタスクを少し残しておく」という手法も失敗した.

だったら絶対朝にやらないといけないことを決めれば良いと思って考えてみるが,意外と思いつかない.

大抵のことは朝でなくてもできる.

それに絶対にやらないといけないことがあったらもうすでにやってるはずだから,

思いつくとかそういう話では無いなと思い至った.

しかし,ひょんなことから自分が朝に絶対にやっている行動を発見したのである.

それは,「時計を見ること」である.

自分はいつもapple watchをつけて寝るのだが,

その日はソフトウェアアップデートをするために充電器にセットして,身に付けずに寝た.

そうすると起きた時に時計を確認する手段がなくなるから,時計を確認するために起き上がらなくてはならない.

このことをそのまま利用すればきっと二度寝をせずにそのまま起きれるはず.

これは失敗する気がしない.きっと成功する.実践あるのみだ.

...

まだ実践していないから今日からやることにする.

後述

この記事を書くに至った経緯

この記事はあるエッセイを読んだ影響で, 試しに書いてみたくなった私によって書かれたものである.(黒歴史)

そのエッセイは2ページ(1000~1500文字くらい)で1つのテーマについて語るものであったから,

真似して文字数も大体それくらいにしてある.常体文であるのも真似した.

エッセイというものがいまいちピンとこなかったから日常っぽいものを書いてみた.

結論があやふやだ.

後から自分で読み返すととても読みづらい印象があったのだが,どうだろう.

エッセイとは

www.weblio.jp

根っこの意味に

試論「試みの論文」

というのがあるから,割と自分の思うエッセイと一致してるかも.

github api 叩いてユーザー情報を取得する

最終的に,こんな感じのコードを書いて取得できた.

type CredentialInfo struct {
    gorm.Model
    Login       string `json:"login"`
    AccessToken string `json:"access_token"`
    Scope       string `json:"scope"`
    TokenType   string `json:"token_type"`
}

func (c *CredentialInfo) GetGithubUserData() {

    req, err := http.NewRequest(
        "GET",
        "https://api.github.com/user",
        nil,
    )
    if err != nil {
        panic(err)
    }

    req.Header.Set("Accept", "application/json")
    req.Header.Set("Authorization", "bearer "+c.AccessToken)

    client := &http.Client{}
    resp, err := client.Do(req)
    if err != nil {
        panic(err)
    }
    defer resp.Body.Close()

    byteArray, _ := ioutil.ReadAll(resp.Body)

    json.Unmarshal(byteArray, &c)
}

直さないといけない点

ORMにgormを使用しているが,

このままだとgorm.ModelのIDとgithub APIの方のIDが被って,IDの上書きが起こってしまう.

別の構造体を用意すれば解決する.共用する意味ないし.

つまづいた点

この記事によると

developer.github.com

user情報をrequestする時は http リクエストをGET で行わなければならない感じだが,

ずっと,POST で頑張ってた...

今回はAPIがGETリクエストを要求していたからGETにしたが,

GETとPOSTの違いがいまいちわかっていない.

golangデバッガ delve

golangデバッガのdelveを使ってみた.

参考にした記事はこちら.

qiita.com

基本的な動作として,dlv debugでdlvのプロンプトを起動し,

helpでコマンド一覧を表示できる.

(dlv) help
The following commands are available:

Running the program:
    call ------------------------ Resumes process, injecting a function call (EXPERIMENTAL!!!)
    continue (alias: c) --------- Run until breakpoint or program termination.
    next (alias: n) ------------- Step over to next source line.
    restart (alias: r) ---------- Restart process.
    step (alias: s) ------------- Single step through program.
    step-instruction (alias: si)  Single step a single cpu instruction.
    stepout (alias: so) --------- Step out of the current function.

Manipulating breakpoints:
    break (alias: b) ------- Sets a breakpoint.
    breakpoints (alias: bp)  Print out info for active breakpoints.
    clear ------------------ Deletes breakpoint.
    clearall --------------- Deletes multiple breakpoints.
    condition (alias: cond)  Set breakpoint condition.
    on --------------------- Executes a command when a breakpoint is hit.
    trace (alias: t) ------- Set tracepoint.

Viewing program variables and memory:
    args ----------------- Print function arguments.
    display -------------- Print value of an expression every time the program stops.
    examinemem (alias: x)  Examine memory:
    locals --------------- Print local variables.
    print (alias: p) ----- Evaluate an expression.
    regs ----------------- Print contents of CPU registers.
    set ------------------ Changes the value of a variable.
    vars ----------------- Print package variables.
    whatis --------------- Prints type of an expression.

Listing and switching between threads and goroutines:
    goroutine (alias: gr) -- Shows or changes current goroutine
    goroutines (alias: grs)  List program goroutines.
    thread (alias: tr) ----- Switch to the specified thread.
    threads ---------------- Print out info for every traced thread.

Viewing the call stack and selecting frames:
    deferred --------- Executes command in the context of a deferred call.
    down ------------- Move the current frame down.
    frame ------------ Set the current frame, or execute command on a different frame.
    stack (alias: bt)  Print stack trace.
    up --------------- Move the current frame up.

Other commands:
    config --------------------- Changes configuration parameters.
    disassemble (alias: disass)  Disassembler.
    edit (alias: ed) ----------- Open where you are in $DELVE_EDITOR or $EDITOR
    exit (alias: quit | q) ----- Exit the debugger.
    funcs ---------------------- Print list of functions.
    help (alias: h) ------------ Prints the help message.
    libraries ------------------ List loaded dynamic libraries
    list (alias: ls | l) ------- Show source code.
    source --------------------- Executes a file containing a list of delve commands
    sources -------------------- Print list of source files.
    types ---------------------- Print list of types

Type help followed by a command for full documentation.

break main.mainでmain packageのmain関数にブレークポイントを設定する.

nで1行進めて,p 変数名で変数の内容を確認できる.

終了する時はqという具合.

使いながら追記していく.

追記(2020/06/07)

step in はs

step outはstepout

golangのパッケージ分け

main package直書き開発をしていたから,そろそろしっかりパッケージ分けをしたいと思う.

packageを分ける際の決まり事

golangはpackageを分ける際に,例えばdatabase packageだったら

ファイルの頭で package database と宣言すればいい...だけではない!

packageごとにディレクトリも分けなければならない.

例えば次のような感じ.

ChatApp
├── chat
│   └── melody.go
├── database
│   └── db.go
├── main.go
├── oauth
│   └── oauth.go
└── router
    └── router.go

chatディレクトリの中のmelody.goはpackage chat で,databaseディレクトリの中のdb.goはpackage databaseといった具合である.

この時,ディレクトリ名とpackage名は一致させる必要がある.

関数のスコープ

引っかかったのは関数のスコープ.

golangは他のpackageから関数を参照する時,関数名の先頭が大文字のものでないといけないようだ.

database.sqlConnect()のようにpackage databaseのsqlConnect()関数を呼び出そうとしたが,

"sqlConnect not exported by package database"というコンパイラエラーが出てしまい呼び出せなかった.

関数名の先頭を大文字にしてdatabase.SqlConnect()として呼び出すことでエラーが消えた.

ちなみにpackage外から参照したいものの名前の先頭を大文字にするというのは,

関数名だけでなく,変数名や構造体名にも適用される.

関数をpackageに分類するための基準

たくさんのmainに直書きされた関数たち.

これらをどういった基準でどのpackageに分けていくのか.

そもそも,どのようなpackageを作れば良いのか.

その辺りが"何となく"でしかわからない.

そのうちわかるようになるか.

追記.

使用する外部packageがlocal package 同士で重複しないようにする.

という自分なりのpackageの分け方を思いついた.

golintの警告を見て清書

golintがコメントの書き方とかパッケージ名の決め方をレクチャーしてくれる感じだった.

素直に従ってぽちぽち直していった.

golintはgolangの書き方を学ぶのに良いかも.

お絵かき配信振り返り10~12

今回振り返るのはこの動画.

https://youtu.be/-D27r997ifo

https://youtu.be/flWqBNzhoYc

https://www.youtube.com/watch?v=pMnaz_enbYU

髪の毛の影は結構うまくつけられてる気がする.

やっぱり髪の流れを意識するのは大事で,後の工程もやりやすくなる.

よく考えたらスバルちゃんは黒髪だよな.こんな緑色じゃない.

まあそういうのもありか.色ちがいスバル.

そう考えたらいろんな色のスバルちゃんを描きたくなってきた.

影を塗る時は乗算レイヤで濃い水彩(自作)を使って塗るのが楽.

その時の色は薄い灰色(明度高めで彩度低め)がいい感じ.

もうちょいで完成.時間かけすぎ?