学習ノート 名前: Dozi0116

プログラムのことか、ゲームのことか、サイト作ったらそっちに移転したい

chrome extentionを作った話

身内の趣味のサポートをプログラムで行えないかと考えたところ、chrome extentionを使えばできるやん!と思い立ったが、2時間くらい動かせなかったのでその時の備忘録。

内容は全く触れず、躓いたところとその対処法だけ書くので今回は短め。

Unchecked runtime.lastError: Could not establish connection. Receiving end does not exist.

これ。
このエラーに2時間位悩まされた。

やったこととしては、

  1. 他の友人が書いていたextentionのソースをコピって来て、
  2. 動作することを確認
  3. 適当にhello, worldレベルのコードを追加して
  4. 拡張機能のページからリフレッシュ
  5. 何故か動かない

の5ステップ。明らかに動作に影響を与えない部分を変更しているのに、なぜかこのエラーが出て動かなくなってしまう。

解決法

動作させるページをリフレッシュしましょう!!!!

これだけでした。。。

更新ボタンを押しただけでは拡張機能の更新歯科行われず、使っているページヘの連携部分(イベントリスナーとか)はそのページをリフレッシュしないと動かないので注意。

また出た

いざ、目的のサイトに移動して動作確認…!と思ったら、また同じエラーが出た。

どうやら、manifest.jsonで許可していないページで使おうとしても同じエラーを吐くようだ。


コードのコピペで動かそうって考えてると簡単なエラーにも多大な時間がかかってしまうので、用法用量を守って適度にコピペしよう!

GoでREST APIサーバーを作ったときの備忘録

概要

Golangなんもわからない状態からREST APIを提供できるようになったので、その時の備忘録

TL; DR

github.com/julienschmidt/httprouter を使えば簡単に作成できる
net/http とは違い、ハンドラにわたす引数が1つ多いのでそこだけ注意

encoding/json を組み合わせてJSONレスポンスまで作れたよ

完成物

本来は複数ファイルに分かれているけど、わかりやすさのためにまとめた

package main

import (
    "encoding/json"
    "fmt"
    "log"
        "net/http"

    "github.com/julienschmidt/httprouter"
)

// ------------------ レスポンス作成/レンダー部分 ----------------------

type StatusCode int

// レスポンス形式 resultの中に返したいものが含まれる
// interface{} はどんな型でも受け付けるくん
type Response struct {
    Status StatusCode  `json:"status"`
    Result interface{} `json:"result"`
}

// 結果にステータスコードをつけ、JSON化する
// []byteはjson.Marshalの返り値
func CreateJSON (data interface{}, status StatusCode) []byte {
    response := Response{status, data}

    res, err := json.Marshal(response)

    if err != nil {
        log.Panic(err) 
    }

    return res
}

// 200のときはステータスコードを省略できる
func RenderJSONOK(w *http.ResponseWriter, data interface{}) {
    RenderJSON(w, data, http.StatusOK)
}

// レスポンスの原型を受け取り、JSON形式で返す
func RenderJSON(w *http.ResponseWriter, data interface{}, status StatusCode) {
    res := CreateJSON(data, status)
    (*w).Header().Set("Content-Type", "application/json")
        (*w.)WriteHeader(status)
    (*w).Write(res)
}

// ---------------------------------------------------------------------
// ------------------------ APIメソッド部分 ----------------------------

func GetMessageList(w http.ResponseWriter, req *http.Request, _ httprouter.Params) {
    RenderJSONOK(&w, "Call GetMessageList!") // -> { "status": 200, "result": "Call GetMessageList!" }
}

func PostMessage(w http.ResponseWriter, req *http.Request, _ httprouter.Params) {
    RenderJSON(&w, "coming soon", http.StatusNotFound) // -> { "status": 404, "result": "comming soon" }
}

func GetMessageById(w http.ResponseWriter, req *http.Request, _ httprouter.Params) {
    RenderJSON(&w, "coming soon", http.StatusNotFound) // -> { "status": 404, "result": "comming soon" }
}

// -------------------------------------------------------------------
// -------------------- ルーティング登録部分 --------------------------

// ルーティング登録を切り出して見やすくしたつもり
func Registration(router *httprouter.Router) {
    router.GET("/message", GetMessageList)
    router.POST("/message", PostMessage)
    router.GET("/message/:id", GetMessageById)
}

func main() {
    router := httprouter.New()
    Registration(router)

    err := http.ListenAndServe(":8080", router)
    if err != nil {
        log.Panic(err)
    } else {
        fmt.Println("something wrong")
    }
}

解説

httprouterを使う

net/http だけでも、メソッドごとに分割して作れなくも無いっぽいが

func Test(w http.ResponseWriter, r *http.Request) {

    // メソッドチェック
    switch (r.Method) {
        case: http.MethodGet:
            // GET処理
        case: http.MethodPost
            // POST処理
    }
}

func Registration() {
    http.HandleFunc("/", Test) // GET, POST, PUT
}

このように記述することになる。 個人的には、Registrationの中で一発でメソッドを管理できないなど可読性が悪く感じるのでなし。

そこで、調べていたところ、12kスターが付いている github.com/julienschmidt/httprouter を見つけた。 これを使うと、完成コードのように、

func TestGet(w http.ResponseWriter, r *http.Request, _ httprouter.Params) {
    // GET処理
}

func TestPost(w http.ResponseWriter, r *http.Request, _ httprouter.Params) {
    // POST処理
}

func Registration(router *httprouter.Router) {
    router.GET("/", TestGet)
    router.POST("/", TestPost)
}

と、メソッドごとに処理を分けて記述することができる。

しかし、httprouterの基本機能として、Paramsが渡ってくる場所が別にあるため、これを受け取れるようにする必要がある。

ここまでで、自由にREST APIを作れるようになった。 ここからは、APIのレスポンスでおなじみのJSONを返すように少してを加える。

encoding/jsonを使う

encoding/jsonは標準で搭載されている。 構造体に一手間加えると、JSONを返せるようになる便利パッケージ。 使い方は以下の通り

// `json:""` を忘れると、Hoge, Fugaなど1文字目が大文字になる(属性名そのままになる)ので注意
type Response struct {
    Hoge int    `json:"hoge"`
    Fuga string `json:"fuga"`
}

func CreateJSON () []byte {
    response := Response{123, "abc"}

    json, err := json.Marshal(response)

    if err != nil {
        panic(err) 
    }

    return json // {"hoge": 123, "fuga": "abc"}
}

これで手軽にJSON形式を生成できるので、これをhttpレスポンスにのせて上げればもう完成。 それで、あちこち関数化などをして出来上がったのが上のコード。

まとめ

便利パッケージがある! 名前わかりにくすぎる! リファレンスちゃんと読まないと型が特定できないからドキュメントなどはちゃんと見よう!

参考にしたところ

へたへたQMA

アニメ・ゲーム

週間少年ジャンプに連載された、河下水希の漫画は?

いちご100%

河下水希の漫画作品。アニメ化もしていて単行本は全19巻と長め。 2002-2005年連載だったが、特別編が2017年に連載された。

どろどろした金融の世界を描いた青木雄二の漫画は?

ナニワ金融道

青木雄二の漫画作品。TVドラマ化がされていたり、作者の没後に続編が2シリーズ連載されていたりした。(現在も心ナニワ金融道Rが連載中っぽい)

孤島で奮闘する外科医を主人公とする山田貴敏(やまだ たかとし)の漫画は?

Dr.コトー診療所

主人公五島健助が離島の診療所に赴任し、島の患者を助けるお話

乗り込んで操縦するタイプの巨大ロボは?

マジンガーZ, ガンダム / 鉄人28号

マジンガーZは主人公兜甲児が乗って操縦、ガンダムは色々な人が乗って操縦する。 鉄人28号は小型操縦機(リモコン)を用いて操縦する

ALI PROJECTが歌った落第騎士の英雄譚のED曲は?

波羅蜜蓮華

去年結成35周年とのこと、おめでとうございます 「ダークなロック・官能ゴシック・妖しいロリータ・極上バラード・きらびやかでキュートなポップスから大和ロック・現代音楽」うーんわからん

女性主人公アニメは?

七つの海のティコ / ロミオの青い空, あらいぐまラスカル

ティコはシャチ。主人公はナナミ ラスカルはアライグマ。主人公はスターリング・ノース ロミオはロミオ

バッタに乗って旅をしている小さなガンマンは?

→アリンコキッド

芸能

林真理子の小説を原作とする2018年に放送された、NHK帯がドラマは?

西郷どん

林真理子の小説「西郷どん!」を原作に、明治維新150周年として企画された2018年の大河ドラマ。主演は鈴木亮平さん。(わからん)

ベトナム戦争を描いた映画「プラトーン」の監督はオリヴァー・ストーンですが、「地獄の黙示録」は?

フランシス・フォード・コッポラ

アメリカの映画監督。娘(ソフィア)も息子(ロマン)も映画監督やってる。 甥にニコラス・ケイジってめっちゃ映画界の覇権みたいな人っぽい

ナチュラリスト畑正憲(はた まさのり)の愛称は?

→ムツゴロウさん

プロ雀士らしい… ナチュラリスト自然主義者のこと。 東大出身。すごい。

ハンパねぇのツッコミでおなじみ、藤田憲右大村朋宏からなるお笑いグループは?

トータルテンボス

NSC3期生、同期は山田ルイ53世やAMEMIYAなど。

理系

「綿毛」が飛んでいくことで種を増やす、キク科の黄色い花は?

→たんぽぽ(o) よく見るのはセイヨウタンポポらしい。

コンピュータの画面上に現れるファイルの内容を絵で表した絵文字のことをなんという?

→アイコン

わかりにくい!!!

LPガスの主成分となっているC3H8

→プロパン

恒河沙は何川の砂という意味?

ガンジス川

欠乏すると鳥目の原因となるビタミンは?

→ビタミンA

鳥目とは、夜になると視力が衰える病気。 他の症状と合わせてビタミンA欠乏症と呼ぶことも。(主に目の疲れが発生する)

文系

ペルシア戦争はいつから始まった?

→BC499~

芸術家の出身国は?

ドラクロワ→フランス、 →ダビンチ→スペイン →ピカソ→スペイン

Arcaeaのポテンシャル管理シート作った

この記事は?

f:id:Dozi0116:20210117231745p:plain

趣味でArcaeaやっている人がArcaea Wikiの情報を参考にポテンシャル管理シートを作ったから良ければ使ってみてねという紹介記事です。 余計な機能がほぼほぼないので、シンプルさを求めている人にはぴったりかもしれません。
また、スプレッドシートなのである程度自由にカスタマイズができると思います。お好みのスタイルにして使ってみてください!

ポテンシャル管理シートはこちら

https://docs.google.com/spreadsheets/d/1uK-NyVwGIJJ3TcW3jyMEjoal9sLhCnu5VOtOnaDVd28/copy#gid=0

↑のリンクをクリックすると、「コピーを作成」と出るので、そこをクリックすると自分のシートが作成されます。
黒枠内に曲名とスコアを入力すると現在のベスト枠を表示してくれます。
また、現在のポテンシャルを入力すると、リーセント枠の推定値を見ることができるので、今自分がポテンシャルを盛っているのかがひと目で分かります。

書き方がわからない場合は自分の記入例をサンプルシートに載せているので、そちらを参考にするか、コメントで質問してください。(自分の実力には触れないでいただけると…)

注意点

FTR, BYDのみの対応です。PST, PRSへ対応させるには譜面定数表を引っ張ってくる必要があります。 結構雑に作っているので、バグが至るところにあるかもしれません。大目にみて報告してくれるととても喜びます。


ここから下は原理の説明なので、興味がある人だけどうぞー
ご要望があれば教えていただけると追加するかも…?です!


原理は?

Arcaea Wiki様のポテンシャル研究所を参考に(というかコピペ)式と譜面定数を埋めました。
入力規則で曲名バリデーションしており、該当する曲を入れるとそれに対応した譜面定数を勝手に呼び出し、スコアから曲別ポテンシャルを計算する式を埋め込んでいます。

また、入力値を降順で並び替え、ベスト枠をひと目で確認できるように、ベスト枠と現在レートから逆算してリーセント枠を算出できるようにしてあります。

こいつまたSSHの鍵生成からGitHubに登録するまでの流れ忘れてるよ

はじめに

コマンドラインだけでマイクラのMODサーバーを立てるっていう記事を書いていたけどバックアップデータが飛んで立ち直れなくなったので備忘録書きます

ゴール

sshの鍵ペアを作れるようになる 公開鍵をGitHubに登録して、ユーザー名やパスワードを入れずにリポジトリ操作ができるようになる

手順

1. ssh-keygenで鍵ペアを作る

$ ssh-keygen -t rsa -b 4096 -C "email@example.com"
Generating public/private rsa key pair.
Enter file in which to save the key (/root/.ssh/id_rsa): 
Enter passphrase (empty for no passphrase): 
Enter same passphrase again: 
Your identification has been saved in /root/.ssh/id_rsa.
Your public key has been saved in /root/.ssh/id_rsa.pub.
The key fingerprint is:
xxxxxxxxxxxxxxxxxxxxxxxxxxxxx
The key's randomart image is:
xxxxxxxxxxxxxxx

キーの保存場所と、使用する際にパスフレーズを要求するか否かを聞かれるので、適切なキーの場所(基本的にはデフォルトでいいはず)と適切なパスワード(なしでEnterでもOK)を入力する。

2. 公開鍵をGitHubに登録する

GitHubSetting -> SSH and GPG keysにアクセスして、右上のNew SSH keyを押し、公開鍵を貼り付ければ終わり!

参考

https://qiita.com/suthio/items/2760e4cff0e185fe2db9

Go言語の違うところ #3

はじめに

dozi0116.hatenablog.jp

これの続き。

CやPythonをかじったことある人が、『基礎からわかるGo言語』を読んで順番に思ったことを書き連ねていくノート的なやつ

今日は眠いし遅いので短め

ポインタ

Cのポインタを理解していれば全く同じものなのでOK。 ただし、ポインタの演算は安全性を考慮して禁止されている。

package main

import "fmt"

func main() {
    var a, b int = 1, 1

    f(a, &b)

    fmt.Println(a, b); // 1, 3
}

func f(a int, b *int) {
    a += 2
    *b += 2
}

ポインタでメモリだけ先に確保しておきたい場合は、mallockではなく、 new(<type>) を使う。

ゼロ値

変数宣言時に値を入れない場合、Goはゼロ値で自動的に初期化してくれる。(すごく便利)

数値型→0 bool→false string→'' 配列(notスライス)→各要素をゼロ値にしたもの 構造体→各要素をゼロ値にしたもの その他→nil, NULLでもNoneでもない

ラベル

(break|continue)のあとにラベルを指定すると、任意の位置へジャンプできる。

func main() {
    for {
        for i := 0;i < 5;i++ {
            if i == 3 {
                break INNER_BREAK_DEST
            }
        }
    }

INNER_BREAK_DEST:
    // ここに飛べる
}

goto

Go言語の違うところ #2

はじめに

dozi0116.hatenablog.jp

これの続き。

CやPythonをかじったことある人が、『基礎からわかるGo言語』を読んで順番に思ったことを書き連ねていくノート的なやつ


パッケージ

ソースが複数ファイルからなる場合、「パッケージ」という単位でソースを扱う。 同一パッケージなら、別ソースで宣言された変数や関数にアクセスすることができるのが特徴。

そして、外部のパッケージのものを扱いたい場合は import する。 独自パッケージを作る場合、GOPATHを通してあるディレクトリ以下に置かないと認識されないので注意!!

GitHubとかを用いてちゃんとしたプロジェクトコードレベルで管理したいなら以下のサイト様が参考になりそう。

qiita.com

package main

import "fmt"
import "my/sample" // $GOPATH/src/my/sample 以下にあるソースを読む
import rename "my/sample2" // python の as 的なこともできる

for文

Goのforは (Cのwhile + for + pythonのfor) というイメージ。 紛らわしくないようにwhileキーワードがない。 break, continue どちらも完備。

// 基本パターン
for var i int = 0; i < 5;i++ {
    // () がないのはpythonっぽいよね
    // もちろん条件式を省略してもOK
}

// whileっぽいパターン
i := 0
for i < 5 {
     i++
}

// 無限ループは条件節を省略する
for {
    // infinity!
}

// python for パターン
arr := [...]string["hoge", "fuga", "piyo"]
for element := range arr {
    // 順番に取り出せる
}

// enumrate for みたいなこともできる
arr := [...]string["hoge", "fuga", "piyo"]
for index, element := range arr {
    // 便利
}

if文

ほぼほぼ同じ。 Cとの違いは条件節の()がないこと、pythonとの違いは、ブロックをちゃんと{}で囲み、elif じゃなくて else if なところ。 そして共通で違うところは、初期化節があるところ。

if x < y {
    // ほぼ同じ
} else if y < 100 {
    // 感覚で
} else {
    // 使える
}

if a := add(3, 5);a < 10 {
    // 余計な変数宣言が減ってちょっと便利
}

switch文

switch - case - dafault の流れはCと一緒だけど、breakが必要なくなった。 代わりに、下の文まで続けて行いたい場合は fallthrough キーワードを記述する。

そして、待望の(?)switchの条件節に式がかけるようになった

switch number {
    case 3:
        // 3
    case 4, case 5:
        // 4, 5
    case 6:
        // 6
        failthrough
    case 7:
        // 6, 7
    default:
        // それ以外
}

// 条件節に式を用いる
switch {
    case num < 3:
        // 3未満
    default:
        // 3以上
}