Ubuntu 22.04のインストール出来ない時の解決策
Windows 11を入れていたPCにUbuntu 22.04をインストールしようとしたら、2箇所、詰まるポイントがあったので覚書。
ISOをDVDに焼いてインストールを開始するとしばらくして[FAILED] Failed to start Ubuntu live CD installer.とログを吐いてインストールできなくなった。
これは起動オプションをいじることで解決出来た。
…… splash fsck.mode=skip --- ……
上記のように編集した後にF10でインストールを開始。
参考: Ubuntu日本語フォーラム / 22.04LTS 日本語Remix ライブDVD 動作報告
インストールの途中でThe attempt to mount a file system with type vfat in SSI1(0,0,0), partition#1(sda) at /boot/efi failed云々とでてまたもインストールが進まなくなった。
これはCtrl+Alt+tでターミナルを呼び出して下記のコマンドで解決できた。
# 自分の環境ではsda1でいけた # fdisk -l で色々見てみるほうがいいかも sudo mkfs.vfat -F 32 /dev/sda1
nimcacheの場所を変える
# %APPDATA%/nim/nim.cfg (Windows) # https://nim-lang.org/docs/nimc.html#compiler-usage-configuration-files @if release or danger: --nimcache:"c:/msys64/home/sizu/nimcache/${projectName}_r" @else: # debug --nimcache:"c:/msys64/home/sizu/nimcache/${projectName}_d" @end
vim-goの使い方
普段使用しているコマンド郡のメモ。
コマンド名の後ろの[!]は、!をつけてそのコマンドを実行するとエラーが起きた場合でもその箇所へ飛ばないようになる。コマンドによっては例外もあるので、その場合は注記している。
ビルドと実行
ビルドする
:GoBuild[!] [expand]
ビルドを行いエラーがあればエラー箇所へ飛ぶ。環境を汚さない(現在のディレクトリにバイナリなどは作られない)。引数は[expand]へ。オプションについて詳しくはgo help build。
- ビルド時に自動的にファイルを保存する
" vim set autowrite
パッケージをビルドし実行する
:GoRun[!] [expand]
ビルドに失敗した場合は実行されない。引数は[expand]へ。オプションについて詳しくはgo help run。
- カレントファイルをビルドし実行する
:GoRun[!] %
main関数は必須。
(例)
// hello.go package main import "fmt" func main() { fmt.Println("Hello") } // Hello
テスト
テストする
:GoTest[!] [expand]
エラーがあればエラー箇所へ飛ぶ。***_test.goを開かなくても使える。引数は[expand]へ。オプションについて詳しくはgo help test。
- タイムアウト時間を設定
let g:go_test_timeout= '10s' " デフォルト let g:go_test_timeout= '15s' " 15秒へ
関数単体でテストする
:GoTestFunc[!] [expand]
カーソル下のテスト関数をテストする。
テストファイルをコンパイルする
:GoTestCompile[!] [expand]
テストファイルをコンパイルしてエラーがあればエラー箇所へ飛ぶ。コンパイルが成功してもテストは実行されない。大きいテストファイルを編集している時に使うと便利かも。
テスト漏れを調べる
:GoCoverage[!] [options]
テストされている関数は緑色、テストされていない関数は赤色で色付けされる。[options]はよく分からない。カバレッジ系のヘルプは"go help testflag"や"go tool cover -help"でみられる。
:GoCoverageClear [options]
色付けを元に戻す。
:GoCoverageToggle[!] [options]
上記2つのコマンドをトグルする。
:GoCoverageBrowser[!] [options]
ブラウザでカバレッジを表示。
整形
コードを整形する。
:GoFmt
整形時にエラーがあればエラー箇所へ飛ぶ。
- 整形時にエラーがでてもエラーリストを表示しない
let g:go_fmt_fail_silently = 1
- デフォルトでファイル保存時に自動整形(gofmt)される
let g:go_fmt_autosave = 1 " デフォルト let g:go_fmt_autosave = 0 " オフ
- デフォルトで自動整形がオンの場合に使われるコマンドはgofmt
let g:go_fmt_command = "gofmt" " デフォルト let g:go_fmt_command = "goimports" " goimportsに変更
:GoImport
GoImport strings すると、import "strings" が追加される。
:GoImportAs
GoImportAs str strings すると、import str "strings" が追加される。
:GoDrop
GoDrop strings すると、import "strings" や import str "strings" が追加される。
:GoImports
GoFmtとGoImportとGoDropを同時にやってくれる感じ。
テキストオブジェクト
関数やコメントの内側やそれ自体を操作する
Key | Meaning |
---|---|
if (inner function) | 関数の内側が対象 |
af (a function) | 関数全体が対象 |
ic (inner comment) | コメントの内側が対象 |
ac (a comment) | コメント全体が対象 |
- 削除 (d)
- 内側 dif
- 全体 daf
- コピー (y)
- 内側 yif
- 全体 yaf
選択 (v)
- 内側 vif
- 全体 vaf
*af 系はデフォルトで関数の上部にあるコメント部分も対象とする。変更可。
let g:go_textobj_include_function_doc = 1 " デフォルト let g:go_textobj_include_function_doc = 0 " オフ
前後の関数へ移動、操作する
Key | Meaning |
---|---|
[[ (inner function) | 前の関数へ移動 |
]] (a function) | 後ろの関数へ移動 |
テキストオブジェクトと同様に色々と組み合わせて使える。
- 削除 (d)
- 前の関数 d[[
- 後ろの関数 v[[
スニペット
インストールなど基本的な使い方はこちら
デフォルトで構造体のタグはスネークケース(snake_case)で展開される。変更可。
let g:go_addtags_transform = "snakecase" " デフォルト let g:go_addtags_transform = "camelcase" " キャメルケース
シンタックスハイライト
詳しくはこちら。
静的解析
ソースコードを静的解析する開発補助郡。
:GoErrCheck[!]
errcheckを実行。関数などから返されるエラーがちゃんとチェックされているかをチェックする。
:GoVet[!]
go vetを実行。
:GoLint[!]
golintを実行。
:GoMetaLinter
デフォルトでgo vet、golint、errcheckをまとめて実行。変更可。
let g:go_metalinter_enabled = ['vet', 'golint', 'errcheck'] " デフォルト let g:go_metalinter_enabled = ['golint'] " golintだけに
- ファイル保存時に自動でGoMetaLinterを呼ぶ設定。
let g:go_metalinter_autosave = 1
- 自動で呼ぶものを設定。
let g:go_metalinter_autosave_enabled = ['vet', 'golint']
- デフォルトでGoMetaLinterのタイムアウト設定は5秒。変更可。
let g:go_metalinter_deadline = "5s" " デフォルト let g:go_metalinter_deadline = "7s" " 7秒に
移動
対応するテストファイルへ移動する
:GoAlternate[!]
- a.go上で実行するとa_test.go を開く
- a_test.go上で実行するとa.go を開く
コマンドの後ろに!をつけると、ファイルが存在しない場合に新規作成して開く挙動になる。
定義元へ移動する
:GoDef
カーソル下の文字列の定義元へ移動。(ノーマルモード: gd、ctrl-])
:GoDefPop [count]
元の場所に戻る。ctrl-oでも戻れるが、何度もジャンプしていると複数回押さなけれならなくなるので面倒。
:GoDefStack
以前にGoDefで飛んだ箇所がリスト表示され、そこから移動できる。
:GoDefStackClear
上記のリストをクリアする。
デフォルトでGoDefはguruを使用する。変更可。
let g:go_def_mode = 'guru' " デフォルト let g:go_def_mode = 'godef' " godefへ
関数一覧から関数を探す
要インストール: github.com/ctrlpvim/ctrlp.vim
:GoDecls [file]
関数一覧表示。
:GoDeclsDir [dir]
関数一覧表示。テストファイルの中の関数は含まれるが、サブディレクトリは含まれない。
- デフォルトでGoDeclsとGoDeclsDirは関数とタイプを表示する。変更可。
let g:go_decls_includes = "func,type" " デフォルト let g:go_decls_includes = "func" " 関数のみ
情報
:GoDoc
カーソル下の文字列のドキュメントを表示(ノーマルモード: K)。適当なフォルダでGoDocを実行しても"vim-go: no package to containing file ****"というエラーがでた。${GOPATH}/src/****/以下で作業すると成功した。
:GoInfo
カーソル下の文字列の情報を表示。(関数シグネチャやタイプなど)
- 自動でカーソル下の文字列の情報を表示することも出来る。
let g:go_auto_type_info = 1
- デフォルトで更新間隔は800ミリ秒(800ms)。変更可。
let g:go_updatetime = 800 " デフォルト let g:go_updatetime = 100 " 100ミリ秒へ
識別子ハイライト
:GoSameIds
カーソル下の文字列(識別子)をハイライトする。
:GoSameIdsClear
ハイライトをオフにする。
:GoSameIdsToggle
上記2つのコマンドをトグルする。
:GoSameIdsAutoToggle
自動でハイライトとオフのトグル。
- デフォルトで自動でハイライトはオフ。変更可。
let g:go_auto_sameids = 0 " デフォルト let g:go_auto_sameids = 1 " オン
- デフォルトで更新間隔は800ミリ秒(800ms)。この挙動は変更できる。
let g:go_updatetime = 800 " デフォルト let g:go_updatetime = 100 " 100ミリ秒へ
構成ファイルと依存
:GoFiles [source_files]
パッケージを構成しているファイルを表示。****_test.goファイルは表示されない。
:GoDeps
今開いているファイルの依存ファイルを表示。
Guru
詳しくはこちら。
リファクタリング
識別子名の変更
:GoRename[!] [to]
カーソル下の名前を"to"に変更する。パッケージ内の他のファイル内で使われているものも賢く変更してくれる。
関数を抽出する
:GoFreevars
抽出したい箇所を選択して(visual mode)、実行。詳しくはこちら。
コード生成
インターフェイス実装の補助
:GoImpl [receiver] [interface]
カーソルを"type T struct{}"の"T"にもっていき実行。次にインターフェイスタイプ(例えば"io.ReadCloser"など。補完も効く。)を入力。josharian/impl
カーソル位置に関係なくどこからでも可能。
(例) :GoImpl t *T io.ReadCloser
その他
コードシェア
vimから離れることなくplay.golangでシェアできる。
:GoPlay
- デフォルトで自動でブラウザが開くようになっている。変更可。
let g:go_play_open_browser = 1 " デフォルト let g:go_play_open_browser = 0 " オフ
- 開くブラウザを指定できる。
let g:go_play_browser_command = "chrome" " chromeで開く
テンプレートファイルのシンタックスハイライト
- HTML template
デフォルトでGo HTMLテンプレートのシンタックスハイライトは*.tmplファイルに対して有効になっている。 変更可。
au BufRead,BufNewFile *.gohtml set filetype=gohtmltmpl " *.gohtml で有効
- TEXT template
Go TEXTテンプレートのシンタックスハイライトはファイルタイプをgotexttmplへ変更すると有効になる。
se ft=gotexttmpl
GOPATHを変更する
:GoPath [path]
GOPATHを[path]へ変更する。[path]が""だった場合、元のGOPATHへと戻る。引数を与えなかった場合は現在のGOPATHを表示する。
Go アセンブラファイルを整形する
:Asmfmt
デフォルトでファイル保存時の自動整形はオフになっている。変更可。
let g:go_asmfmt_autosave = 0 " デフォルト let g:go_asmfmt_autosave = 1 " オン
:GoAsmFmtAutoSaveToggle
ファイル保存時の自動整形のオンとオフのトグル。
asmfmtの詳細はこちら。
GNU C Library(glibc)の実装を覗く
ソースファイルを入手
Index of /gnu/glibcにあるglibc-*というのがソースファイル。
$ curl https://ftp.gnu.org/gnu/glibc/glibc-2.27.tar.gz | tar zx $ cd glibc-2.27
目的の関数を探す
# ファイル名から関数を探す $ find . -type f -name "*printf*" | less # ファイル内から関数を探す $ find stdio-common -type f -print | xargs grep 'printf' | less
stdlib.h に含まれている関数 abs を覗いてみよう
/usr/include/stdlib.h
/* Return the absolute value of X. */ extern int abs (int __x) __THROW __attribute__ ((__const__)) __wur;
glibc-2.27/stdlib/abs.c
/* Copyright (C) 1991-2018 Free Software Foundation, Inc. ... */ #include <stdlib.h> #undef abs /* Return the absolute value of I. */ int abs (int i) { return i < 0 ? -i : i; }