電波ビーチ

☆(ゝω・)v

Goでjsonファイルを読もうとしたらエラー出た->BOM付きファイルでした

かなしい事件。

    
    .
    .
    .
    p := filepath.FromSlash(cur + "/peropero.json")
    f, err := os.Open(p)
    if err != nil {
        log.Fatalln(err)
    }
    defer f.Close()
    .
    .
    .

以下のようなエラーが出た

2022/05/07 22:56:16 invalid character 'ï' looking for beginning of value

かなしいね

vscode(英語表記)ならここから「UTF-8 with BOM」をクリックして「Reopen with Encoding」->「UTF-8」としてやる。逆にBOM付のファイルにすることはなぜかできなかった(たぶん)

あるいはメモ帳から「名前を付けて保存」するときにエンコード方式を選べて、BOM付もあるらしい。いつのwindowsバージョンからかは知らん。これはwindows11です


BOM付きのファイルは先頭にBOMの文字が3byteぶん入る。BOMはutf8でエンコードすると0xEF 0xBB 0xBFだが、これはwindows cp1252の表現ではになる。今回はファイルを変換したが、逆にos.OpenでBOM付きで開く方法があるかどうかは知らない。まあ先頭3byteを読めばいいだけではあるけど

VRChatの起動直後にクラッシュするときはアバターが原因かもしれない

TL;DR:

VRCにログイン後、ホームワールドで即落ちする/そのときに「赤字に白色の四角クスクラメーションつきのVRChatロゴ」が一瞬出る、みたいな場合、アバターを変えてみよう

  • TL;DR:
  • あらすじ
  • 調べた
  • 試してみてダメだったこと
  • 解決した操作
  • 解決した操作・具体編
  • Questなしでアバターを変える
  • PhysBone,OSC
続きを読む

古いmacbook proで起動ディスクが見えなくなって焦った話(インターネットリカバリさえつながればなんとかなる?)

ほぼ写真は無い。

あらすじ

約8年前のMBP(2014 mid・5年くらい前にメルカリで購入)を初期化して放置して起動したらフォーマット時にHDDを暗号化していたようで、毎回起動時にパスワードを求められた。記憶に無いが、ディスクユーティリティでフォーマットするときに MAC OS 拡張(ジャーナリング、暗号化)」 を選んでいたらしい

FinderからHDDを右クリックして解除しようとしたが、内部エラーになる。

discussionsjapan.apple.com

このあとがアホなのだが、何の下調べもなしに再起動して⌘+Rでリカバリモードに入り、HDDを消去した。細かい手順は覚えていないがやっちゃいけないことをやるときは興奮するものだ、高揚感がすべてを忘れ去った。そして再度起動するとはてなマークである。知ってる知ってる

support.apple.com

書いてある方法を試してもうまくいかず、何度か時間をおいて試したらリカバリモードに移行できたものの、ディスクユーティリティをみると起動ディスクが存在しなかった。バックアップとかなんもとってない。あーあ

手持ちのmacはこれだけであり、起動ディスクを作成することもできない(ひょっとしたらwindowsでも作成する方法があるのかもしれないが調べてないので知らない)。なんとかして復活できないものか、神よ

なおった

インターネットは偉大である。神はインターネットで見かけた。

www.whyit.work

試してみる。インターネットリカバリに異常に時間がかかり、最初は2時間かけた挙げ句に失敗。これもご存知の2003Fエラーコード。安心感はまったくないが馴染みだけはある。二度と見たくない

腹が立ったので時間をあけず再度試す。二回目のインターネットリカバリはすんなりとうまくいき、無事リカバリモードまでたどり着けた。

これ、最初に全部飛ばしたときはHDDが完全に消滅してたんだけど、なんか存在してた。よかった...これで先に進める...正直ここでHDDが見えなかったら会社のmac使ってこっそりUSBインストーラー作成せねばならんと思ってた(ともだちがいません)

記事に書いてあるとおりこれを一度フォーマットする。今度は間違えず「MacOS拡張(ジャーナリング)」で

そしてディスクユーティリティを終了し、OSを再インストール。ここでもちゃんとインストール先のディスクが見えていた。素晴らしい。そのまんまGo

あとは祈る。ここの経過時間はインターネットリカバリのときなんかよりよほど素直で体感的にも実測的にもだいたいそんな感じであった。そうならないこともあることくらい知ってる。昔やったとき10時間かけて5pxくらいしかプログレスバーが進まんかったヮ

ありがてぇ :pray:

消費したコンテンツ 3月2022

冬がやっと去ってくれたおかげで若干気分はいいものの街中の浮かれっぷりを横目につましく過ごさざるを得ない人生、そういう3月。なんかいろいろ気の利いたこと考えたりしたんだけど全部忘れた

  • 映画
  • 配信
    • Algorave tenth birthday stream
    • MONSTER
続きを読む

消費したコンテンツ 2月2022

忙しさ大爆発?いいえ祈りの時間が増えただけです。毎月終わりに書くようにしているが先月は28日までしかないし実質まだ2月だろ。ということで2月

  • 映画
    • The Peanut Butter Falcon
    • JUNK HEAD
  • イベント
    • NEOKET2
    • Kizuna AI last live ~hello,world 2022~
続きを読む

cobraで引数不要なフラグを受け取る

あらすじ及び結論

-hとか--listとか、そういうやつが欲しかった。ふつのコマンドでよく使うし標準で専用のメソッドなりがあるのかと思ったがそんなことはない?見つけたのは以下のやつ。ちょっと古い||もっといい方法があるのかもしれませんが

github.com

rootCmd.BoolVarP(&verbose, "verbose", "v", false, "verbose output")

このようにBoolVarPして成否判定やってみてけろ、ということらしい。たとえば今回は「viperで設定ファイルにある宛先メールアドレスをリストでほしい」という自作コマンドの要望上で欲しかった機能で、サブコマンドconfigを使って次のようにして表示したかったのです。ショートフラグ非対応なのは趣味です

<メインのコマンド> config --sendto

こうなった

サブコマンドのgoファイル。cobra add <サブコマンド名>で生成されたやつ

package cmd

import (
    "fmt"

    "github.com/spf13/cobra"
    "github.com/spf13/viper"
)

var sendtoFlag bool

var configCmd = &cobra.Command{
    Use:   "config",
    Short: "設定ファイルでよく参照しそうな中身を表示",
    Long: `設定ファイルでよく参照しそうなものを表示します。
  
--sendto  送信先のメールアドレスいちらん
`,
    Run: func(cmd *cobra.Command, args []string) {
        mails, _ := cmd.Flags().GetBool("sendto")

        if mails && len(cmd.Flags().Args()) == 0 { // `--sendto`以外は不要
            for _, address := range viper.GetStringSlice("sendto") {
                fmt.Println(address)
            }
        } else {
            fmt.Printf("不正な引数もしくはオプションがあります。\n Args: %v\n", cmd.Flags().Args())
        }
    },
}

func init() {
    rootCmd.AddCommand(configCmd)
    configCmd.Flags().BoolVarP(&sendtoFlag, "sendto", "", false, "送信先のメールアドレス")

}

yamlはこんなのとする。同じ階層にあるのと名前は以下のroot.go参照。要らん設定たくさんあるけど省くのもめんどくさかったので載せる。記事内のsnippetでは当然sendtoしか使ってないです

applicationName: "ニャー"
debug: false
user: 
  name: "this is fuckin awesome name"
  age: 34882349
sendto: [aaa@mail.domain, bbb@mail2.gandum, ccc@koikeya.umai]

root.go載せる意味あんまなさそうだけどメモとして一部必要そうなところを置いておく。viperすらも初めて触ったんですがそもそもgoの文法とかよくわかってないので使いやすいのかどうか判断がつきましぇん

.
.
.
type Config struct {
    User            User     `yaml:user`
    ApplicationName string   `yaml:applicationName`
    Debug           bool     `yaml:debug`
    SendTo          []string `yaml:sendto`
}

type User struct {
    Name string `yaml:"name"`
    Age  int    `yaml:"age"`
}

var config Config

// 読み込む設定ファイル。定義してない(適当にネット上のソースをコピペしたなのでなんで定義されてないのか知らない)
var cfgFile string
.
.
.



func init() {
    cobra.OnInitialize(initConfig)
    // bra bra bra...
}

func initConfig() {
    if cfgFile != "" {
        // Use config file from the flag.
        viper.SetConfigFile(cfgFile)
    } else {
        viper.AddConfigPath(".")
        viper.SetConfigName("cfg")
        viper.SetConfigType("yaml") // もしかして明示的に書く必要ないかもしれない
    }

    if err := viper.ReadInConfig(); err != nil {
        fmt.Println("Can't read config:", err)
        os.Exit(1)
    }

    if err := viper.Unmarshal(&config); err != nil {
        fmt.Println("config file Unmarshal error")
        fmt.Println(err)
        os.Exit(1)
    }
}

試してみるよ

$ go run main.go config --sendto
aaa@mail.domain
bbb@mail2.gandum
ccc@koikeya.umai

$ go run main.go config --sendto 193838795237984
不正な引数もしくはオプションがあります。
 Args: [193838795237984]

$ go run main.go config sendto
不正な引数もしくはオプションがあります。
 Args: [sendto]

$ go run main.go config --send2 nya-
Error: unknown flag: --send2
Usage:
  cobra_practice config [flags]

Flags:
  -h, --help     help for config
      --sendto   送信先のメールアドレス

exit status 1

ちゃんと--sendtoとロングオプションのみつけたときだけ取れてますねぇ。CLIツールとかCLI用ライブラリとかのお作法って知らないんですがどのライブラリもこんな感じなのかな。