2022年5月26日木曜日

node_modules を対象に入れたままコミットを積み上げて、 master にマージまでしてしまったのを解消する

つらい。

前提

おひとり様リポジトリで、並行してほかの人が作業するようなことはない。

手順メモ

master ブランチをマージコミット直前にまで戻す

git checkout master
git reset --hard HEAD^
git push -f

やらかしたブランチをチェックアウト

git checkout -b langium-firststep origin/langium-firststep

filter-branch でブランチから対象ファイル群を削除

git filter-branch -f --tree-filter "rm -rf Langium/firststep/firststep/node_modules" --prune-empty -- --all
git gc --aggressive --prune=now
git push -f

あとは push しなおしたブランチを元に Pull Request を作り直してマージしなおす。

参考資料

Langium で DSL と LSP サーバーを作る(1) 文法定義から文法チェックまで

DSL を定義すると、 LSP サーバーの実装を吐き出してくれるツール Langium を試す。

目標

以下の文法の DSL を作る。

person <NAME> {
    age: <INTEGER>;
    rank: <INTEGER>;
}
  • <NAME>: 任意の名前, 半角小文字アルファベットのみ許容
  • <INTEGER>: 任意の整数

前提

  • OS: Arch Linux
  • Docker: Docker version 20.10.16, build aa7e414fdc
  • 使用する Docker イメージ: node:18

作業用コンテナ起動

docker run -it --rm -v "$(pwd):/work" --workdir /work node:18 bash

Langium のジェネレーターをインストール

npm i -g yo generator-langium

Langium のプロジェクトを作成

# su - node
$ cd /work
$ yo langium
? ==========================================================================
We're constantly looking for ways to make yo better! 
May we anonymously report usage statistics to improve the tool over time? 
More info: https://github.com/yeoman/insight & http://yeoman.io
========================================================================== Yes
┌─────┐ ─┐
┌───┐    │  ╶─╮ ┌─╮ ╭─╮ ╷ ╷ ╷ ┌─┬─╮
│ ,´     │  ╭─┤ │ │ │ │ │ │ │ │ │ │
│╱       ╰─ ╰─┘ ╵ ╵ ╰─┤ ╵ ╰─╯ ╵ ╵ ╵
`                   ╶─╯

Welcome to Langium! This tool generates a VS Code extension with a "Hello World" language to get started 
quickly. The extension name is an identifier used in the extension marketplace or package registry.
? Your extension name: firststep
The language name is used to identify your language in VS Code. Please provide a name to be shown in the 
UI. CamelCase and kebab-case variants will be created and used in different parts of the extension and 
language server.
? Your language name: firststep
Source files of your language are identified by their file name extension. You can specify multiple file 
extensions separated by commas.
? File extensions: .firststep
   create firststep/langium-config.json
   create firststep/langium-quickstart.md
   create firststep/language-configuration.json
   create firststep/package.json
   create firststep/tsconfig.json
   create firststep/bin/cli
   create firststep/src/extension.ts
   create firststep/src/cli/cli-util.ts
   create firststep/src/cli/generator.ts
   create firststep/src/cli/index.ts
   create firststep/src/language-server/firststep-module.ts
   create firststep/src/language-server/firststep-validator.ts
   create firststep/src/language-server/firststep.langium
   create firststep/src/language-server/main.ts
   create firststep/.vscode/extensions.json
   create firststep/.vscode/launch.json
   create firststep/.eslintrc.json
   create firststep/.vscodeignore

added 173 packages, and audited 174 packages in 23s

27 packages are looking for funding
  run `npm fund` for details

found 0 vulnerabilities
npm notice 
npm notice New minor version of npm available! 8.9.0 -> 8.11.0
npm notice Changelog: https://github.com/npm/cli/releases/tag/v8.11.0
npm notice Run npm install -g npm@8.11.0 to update!
npm notice 

> firststep@0.0.1 langium:generate
> langium generate

Reading config from langium-config.json
src/language-server/firststep.langium:14:10 - This rule is declared but never referenced.
src/language-server/firststep.langium:15:10 - This rule is declared but never referenced.
Writing generated files to /work/firststep/src/language-server/generated
Writing textmate grammar to /work/firststep/syntaxes/firststep.tmLanguage.json
Langium generator finished successfully in 218ms

> firststep@0.0.1 build
> tsc -b tsconfig.json


No change to package.json was detected. No package manager install will be executed.

DSL 開発(文法チェックまで)

grammar コードの実装

以下コマンドで修正をウォッチしながら、src/language-server/firststep.langium を修正する。

npm run langium:watch

src/language-server/firststep.langium

// DSL の文法名
grammar Firststep

// モデル定義。
// 「この DSL ではゼロから複数の Person を定義できる」という定義をしている
entry Model:
    (persons+=Person)*;

/**
 * 以下形式の文法を定義。
 *
 * person <NAME> {
 *   age: <INTEGER>;
 *   rank: <INTEGER>;
 * }
 *
 * ※ このとき、 AST 上の person ノードは、 `age``rank` のパラメーターを持つ。

 */
Person:
    'person' name=NAME '{'
        'age' ':' age=INTEGER ';'
        'rank' ':' rank=INTEGER ';'
    '}'
    ;


// `<NAME>`: 任意の名前, 半角の小文字アルファベットのみ許容
terminal NAME: /[a-z]+/;

// `<INTEGER>`: 任意の整数
terminal INTEGER returns number: /[0-9]+/;

// 空白文字は AST に含めない
hidden terminal WS: /\s+/;

// マルチラインコメント(`/* XXX */`)  AST に含めない
hidden terminal ML_COMMENT: /\/\*[\s\S]*?\*\//;

// シングルラインコメント(`// XXX`)  AST に含めない
hidden terminal SL_COMMENT: /\/\/[^\n\r]*/;

grammar コードからパーサーコード(TypeScript)の生成

npm run langium:watch していればすでに生成済みのはずだが、ワンショットで再生成したい場合には以下コマンドを実行。

npm run langium:generate

パーサーコード(TypeScript)のビルド

以下コマンドでビルド。

npm run build

Langium プロジェクト生成時に実装済みの Person, Greeting 文法用のコードになっているため、ビルドに失敗する。

今回自分が実装した Person 文法用の実装に修正しなければならない。

Person, Greeting 文法用のコード削除

src/cli/generator.ts, src/language-server/firststep-validator.ts の削除

generator は、「Greeting 情報を読み込んでコンソールに出力する TypeScript コードを生成する」という実装になっているため、削除。

firststep-validator は、「Person の ID の先頭が大文字でないとだめ」という実装になっているため、削除。

rm src/cli/generator.ts
rm src/language-server/firststep-validator.ts

src/cli/index.ts の修正

src/cli/generator.ts を削除したことで、ビルドが失敗するようになるので解消。

diff --git a/firststep/src/cli/index.ts b/firststep/src/cli/index.ts
index eeafcac..4322246 100644
--- a/firststep/src/cli/index.ts
+++ b/firststep/src/cli/index.ts
@@ -1,17 +1,9 @@
-import colors from 'colors';
+//import colors from 'colors';
 import { Command } from 'commander';
-import { Model } from '../language-server/generated/ast';
-import { FirststepLanguageMetaData } from '../language-server/generated/module';
-import { createFirststepServices } from '../language-server/firststep-module';
-import { extractAstNode } from './cli-util';
-import { generateJavaScript } from './generator';
-
-export const generateAction = async (fileName: string, opts: GenerateOptions): Promise<void> => {
-    const services = createFirststepServices().Firststep;
-    const model = await extractAstNode<Model>(fileName, services);
-    const generatedFilePath = generateJavaScript(model, fileName, opts.destination);
-    console.log(colors.green(`JavaScript code generated successfully: ${generatedFilePath}`));
-};
+//import { Model } from '../language-server/generated/ast';
+//import { FirststepLanguageMetaData } from '../language-server/generated/module';
+//import { createFirststepServices } from '../language-server/firststep-module';
+//import { extractAstNode } from './cli-util';
 
 export type GenerateOptions = {
     destination?: string;
@@ -24,13 +16,7 @@ export default function(): void {
         // eslint-disable-next-line @typescript-eslint/no-var-requires
         .version(require('../../package.json').version);
 
-    const fileExtensions = FirststepLanguageMetaData.fileExtensions.join(', ');
-    program
-        .command('generate')
-        .argument('<file>', `source file (possible file extensions: ${fileExtensions})`)
-        .option('-d, --destination <dir>', 'destination directory of generating')
-        .description('generates JavaScript code that prints "Hello, {name}!" for each greeting in a sourc
e file')
-        .action(generateAction);
+    // const fileExtensions = FirststepLanguageMetaData.fileExtensions.join(', ');
 
     program.parse(process.argv);
 }

src/language-server/firststep-module.ts の修正

src/language-server/firststep-validator.ts を削除したことで、ビルドが失敗するようになるので解消。

--- a/firststep/src/language-server/firststep-module.ts
+++ b/firststep/src/language-server/firststep-module.ts
@@ -3,14 +3,12 @@ import {
     LangiumServices, LangiumSharedServices, Module, PartialLangiumServices
 } from 'langium';
 import { FirststepGeneratedModule, FirststepGeneratedSharedModule } from './generated/module';
-import { FirststepValidationRegistry, FirststepValidator } from './firststep-validator';
 
 /**
  * Declaration of custom services - add your own service classes here.
  */
 export type FirststepAddedServices = {
     validation: {
-        FirststepValidator: FirststepValidator
     }
 }
 
@@ -27,8 +25,6 @@ export type FirststepServices = LangiumServices & FirststepAddedServices
  */
 export const FirststepModule: Module<FirststepServices, PartialLangiumServices & FirststepAddedServices> 
= {
     validation: {
-        ValidationRegistry: (services) => new FirststepValidationRegistry(services),
-        FirststepValidator: () => new FirststepValidator()
     }
 };

パースに成功したかどうかを確認するためのサブコマンドを追加

src/cli/index.ts に、処理を実装する。

以下実装で、成功したときは「文法チェック OK」と表示し、失敗したときは、パーサーのエラーメッセージを表示するようになる。

diff --git a/firststep/src/cli/index.ts b/firststep/src/cli/index.ts
index 4322246..e0a4230 100644
--- a/firststep/src/cli/index.ts
+++ b/firststep/src/cli/index.ts
@@ -1,9 +1,16 @@
-//import colors from 'colors';
+import colors from 'colors';
 import { Command } from 'commander';
-//import { Model } from '../language-server/generated/ast';
-//import { FirststepLanguageMetaData } from '../language-server/generated/module';
-//import { createFirststepServices } from '../language-server/firststep-module';
-//import { extractAstNode } from './cli-util';
+import { Model } from '../language-server/generated/ast';
+import { FirststepLanguageMetaData } from '../language-server/generated/module';
+import { createFirststepServices } from '../language-server/firststep-module';
+import { extractAstNode } from './cli-util';
+
+export const testAction = async (fileName: string, opts: GenerateOptions): Promise<void> => {
+    const services = createFirststepServices().Firststep;
+    await extractAstNode<Model>(fileName, services);
+    console.log(colors.green(`文法チェック OK`));
+    // ※ extractAstNode から呼ばれる `extractDocument` 内で、 `process.exit(1)` されるので、 try-catch 
しない
+};
 
 export type GenerateOptions = {
     destination?: string;
@@ -16,7 +23,12 @@ export default function(): void {
         // eslint-disable-next-line @typescript-eslint/no-var-requires
         .version(require('../../package.json').version);
 
-    // const fileExtensions = FirststepLanguageMetaData.fileExtensions.join(', ');
+    const fileExtensions = FirststepLanguageMetaData.fileExtensions.join(', ');
+    program
+        .command('test')
+        .argument('<file>', `source file (possible file extensions: ${fileExtensions})`)
+        .description('文法チェック')
+        .action(testAction);
 
     program.parse(process.argv);
 }

動作確認

パーサーの動作確認

test.firststep ファイルを作って、先程実装した test サブコマンドで確認する。

$ node bin/cli test ./test-ok.firststep
文法チェック OK
$ node bin/cli test ./test-ng.firststep
There are validation errors:
line 1: Expecting keyword '{' but found `000`. [000]

OK.

今回はここまで。

コミット順序は前後するが、ここまでの修正を MiscellaneousStudy/Langium/firststep/firststep - GitHub に格納した。

あとは AST からコード生成などの所望の処理を行う実装をする感じ。

VSCode 拡張機能の動作確認

  1. npm run build でビルド
  2. Langium プロジェクトを、 ~/.vscode/extensions-oss にコピーして VSCode を起動
  3. 拡張子が .fiststep の空ファイルを作成し、 VSCode で開く
  4. grammar で実装した通りの補完やバリデーションの警告が出ることを確認

参考資料

2022年5月25日水曜日

Arch Linux への Docker インストールメモ

Docker をインストールして、一般ユーザーが sudo なしで実行できる環境を作る。

※ Docker Rootless ではない

インストール

sudo pacman -S docker

一般ユーザーを docker グループへ追加

sudo usermod -a -G docker mikoto

ログインし直すと、ユーザーの追加が反映される。

Docker デーモン起動

sudo systemctl start docker

必要に応じて自動起動設定をしましょう、今回はやらなかった。

sudo systemctl enable docker

自動起動しないと、どのみち sudo systemctl start dockersudo が必要なのであんまり嬉しくならなさそうだなぁ…

動作確認

[mikoto@letsarch ~]$ docker run -it --rm hello-world

Hello from Docker!
This message shows that your installation appears to be working correctly.

To generate this message, Docker took the following steps:
 1. The Docker client contacted the Docker daemon.
 2. The Docker daemon pulled the "hello-world" image from the Docker Hub.
    (amd64)
 3. The Docker daemon created a new container from that image which runs the
    executable that produces the output you are currently reading.
 4. The Docker daemon streamed that output to the Docker client, which sent it
    to your terminal.

To try something more ambitious, you can run an Ubuntu container with:
 $ docker run -it ubuntu bash

Share images, automate workflows, and more with a free Docker ID:
 https://hub.docker.com/

For more examples and ideas, visit:
 https://docs.docker.com/get-started/

参考資料

Arch Linux に Tauri 開発環境を構築する

前提

  • OS: Arch Linux
    • GUI 最小構成でセットアップした直後
  • Node.js: 18.2.0
  • Rust: rustc 1.61.0 (fe5b13d68 2022-05-18)

前提パッケージのインストール

sudo pacman -S base-devel webkit2gtk
  • base-devel: Rust プログラムのビルドに必要
  • webkit2gtk: Tauri プログラムのビルドに必要

Node.js のインストール

curl -LO https://nodejs.org/dist/v18.2.0/node-v18.2.0-linux-x64.tar.xz
sudo tar xfv node-v18.2.0-linux-x64.tar.xz -C /opt/
export PATH=$PATH:/opt/node-v18.2.0-linux-x64/bin
echo 'export PATH=$PATH:/opt/node-v18.2.0-linux-x64/bin' >> ~/.bashrc

Rust のインストール

curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh
echo 'source $HOME/.cargo/env' >> ~/.bashrc
source $HOME/.cargo/env

scab-player の開発開始

mkdir ~/project
cd ~/project
git clone git@github.com:mikoto2000/scab-player
cd scab-player
npm install
npm run tauri dev

以上。

参考資料

2022年5月24日火曜日

Arch Linux のデスクトップ環境作業メモ

前回 の続きから、以下を実施。

  • 基本的なツール群インストール
  • awesome 導入
  • 日本語入力環境構築

基本設定

vim のインストール

エディタ兼ターミナルとして gvim をインストール。

pacman -S gvim

フォントインストール

pacman -S otf-ipafont

もろもろインストール

pacman -S sudo firefox imagemagick git alsa-utils cbatticon
  • sudo: 必須のやつ
  • firefox: Web ブラウザ
  • imagemagick: magick import -window root screenshot.png でスクリーンショットがとれる
  • alsa-utils: alsamixer 音量調整
  • cbatticon: バッテリー残量表示

awesome 導入

pacman -S awesome lxdm
systemctl enable lxdm
reboot

GUI のキーボードレイアウト設定

日本語レイアウトにして、 Ctrl と Caps を交換。

localectl --no-convert set-x11-keymap jp pc106 "" ctrl:swapcaps

日本語入力

パッケージインストール

pacman -S fcitx5-mozc fcitx5-im

日本語入力設定

/etc/environment に IM の情報を追加。

cat << EOF >> /etc/environment
GTK_IM_MODULE=fcitx
QT_IM_MODULE=fcitx
XMODIFIERS=@im=fcitx
EOF

一般ユーザー作成

useradd -m mikoto
passwd mikoto

一般ユーザーを sudoers に追加

vim /etc/sudoers

mikoto ALL=(ALL:ALL) ALL を追加。

一般ユーザー設定

su - mikoto して作業続行。

awesome 設定

設定ファイルコピー

mkdir -p ~/.config/awesome
cp /etc/xdg/awesome/rc.lua ~/.config/awesome/

設定ファイル更新

~/.config/awesome/rc.lua を更新

--- /etc/xdg/awesome/rc.lua     2021-09-15 04:42:54.000000000 +0900
+++ /home/mikoto/.config/awesome/rc.lua 2022-05-22 11:50:16.703969952 +0900
@@ -48,9 +48,9 @@
 beautiful.init(gears.filesystem.get_themes_dir() .. "default/theme.lua")

 -- This is used later as the default terminal and editor to run.
-terminal = "xterm"
-editor = os.getenv("EDITOR") or "nano"
-editor_cmd = terminal .. " -e " .. editor
+terminal = "gvim -c terminal"
+editor = os.getenv("EDITOR") or "gvim"
+editor_cmd = editor

 -- Default modkey.
 -- Usually, Mod4 is the key with a logo between Control and Alt.
@@ -61,19 +61,19 @@

 -- Table of layouts to cover with awful.layout.inc, order matters.
 awful.layout.layouts = {
-    awful.layout.suit.floating,
-    awful.layout.suit.tile,
-    awful.layout.suit.tile.left,
-    awful.layout.suit.tile.bottom,
-    awful.layout.suit.tile.top,
-    awful.layout.suit.fair,
-    awful.layout.suit.fair.horizontal,
+    -- awful.layout.suit.floating,
+    -- awful.layout.suit.tile,
+    -- awful.layout.suit.tile.left,
+    -- awful.layout.suit.tile.bottom,
+    -- awful.layout.suit.tile.top,
+    -- awful.layout.suit.fair,
+    -- awful.layout.suit.fair.horizontal,
     awful.layout.suit.spiral,
-    awful.layout.suit.spiral.dwindle,
-    awful.layout.suit.max,
-    awful.layout.suit.max.fullscreen,
-    awful.layout.suit.magnifier,
-    awful.layout.suit.corner.nw,
+    --awful.layout.suit.spiral.dwindle,
+    --awful.layout.suit.max,
+    --awful.layout.suit.max.fullscreen,
+    --awful.layout.suit.magnifier,
+    --awful.layout.suit.corner.nw,
     -- awful.layout.suit.corner.ne,
     -- awful.layout.suit.corner.sw,
     -- awful.layout.suit.corner.se,
@@ -169,7 +169,7 @@
     set_wallpaper(s)

     -- Each screen has its own tag table.
-    awful.tag({ "1", "2", "3", "4", "5", "6", "7", "8", "9" }, s, awful.layout.layouts[1])
+    awful.tag({ "1", "2" }, s, awful.layout.layouts[1])

     -- Create a promptbox for each screen
     s.mypromptbox = awful.widget.prompt()
@@ -326,7 +326,9 @@
               {description = "lua execute prompt", group = "awesome"}),
     -- Menubar
     awful.key({ modkey }, "p", function() menubar.show() end,
-              {description = "show the menubar", group = "launcher"})
+              {description = "show the menubar", group = "launcher"}),
+
+    awful.key({ }, "Print", function () awful.util.spawn_with_shell("magick import -window root ~/screenshot.png") end)
 )

 clientkeys = gears.table.join(
@@ -561,4 +563,4 @@

 client.connect_signal("focus", function(c) c.border_color = beautiful.border_focus end)
 client.connect_signal("unfocus", function(c) c.border_color = beautiful.border_normal end)
--- }}}
\ ファイル末尾に改行がありません
+-- }}}

fcitx5 設定

コンフィグ

fcitx5-configtool で設定ダイアログを開き、所望の設定を行う。

fcitx5 &
fcitx5-configtool

自動起動

~/.xprofile で起動コマンドを叩く。

echo 'fcitx5 &' > ~/.xprofile
echo 'cbatticon &' >> ~/.xprofile

…ここで起動するなら、 /etc/environment の記述もこっちに持ってきた方が良いかも。

vim 設定

cd ~
rm -rf .vim
git clone --recursive https://github.com/mikoto2000/dotvim .vim

エディタ設定

echo 'export EDITOR=vim' >> ~/.bashrc

参考資料

2022年5月21日土曜日

Let’s Note CF-RZ6 に Arch Linux をインストールする

最近使っていなかったノート PC で遊ぶことにした。

今回は最低限のシステムを構築するところまで。

必要なもの

  • インストーラー作成用 OS: Windows 11 Pro
  • インストールする PC: Let’s Note CF-RZ6
  • インストールメディア: USB メモリ 2 GB

インストーラーの準備

インストーラー ISO の取得

Arch Linux JP Project - ダウンロード にアクセス -> jaist.ac.jp -> archlinux-x86_64.iso を選択。

USB インストールメディアの作成

Rufus のダウンロード

Rufus - 起動可能なUSBドライブを簡単に作成できます から Rufus 3.18 をダウンロードする。

USB にインストーラーを焼く

  1. rufus-3.18.exe を実行
  2. 必要事項を入力して スタート ボタン押下
    • ドライブ プロパティ
      • デバイス: インストーラーメディアとして使用する USB メモリを選択
      • ブートの種類: 選択 ボタンを押下し、ダウンロードした archlinux-x86_64.iso を選択
      • パーティション構成: GPT
    • フォーマット オプション
      • ボリューム ラベル: ARCH_202205
      • ファイル システム: FAT32
      • クラスター サイズ: 4096 バイト (規定)
  3. ISOHybrid イメージの検出 ダイアログが開くので、 ISO イメージ モードで書き込む (推奨) を選択
  4. 「USB の内容が消えますよ」という警告ダイアログが表示されるので、 OK を押下
  5. 完了したら、 USB を取り出す

インストール作業

基本的に インストールガイド - ArchWiki の通りにやっていけば OK.

インストーラー起動

  1. インストールメディアを挿して CF-RZ6 の電源を入れる -> UEFI の画面が表示されるまで Del キー連打
  2. 終了 タブ -> デバイスを指定して起動 セクションに表示されるインストールメディアを選択
  3. Arch Linux install medium (x86_64, UEFI) を選択

キーボードレイアウトを日本語配列キーボードに設定

loadkeys jp106

ネットワーク接続

iwctl コマンドで無線 LAN 接続を行う。

iwctl コマンドの実行

iwctl

無線 LAN に接続

自宅の無線 LAN は、SSID を隠しているので、 connect-hidden で接続する。

以下コマンドを実行すると、パスフレーズが聞かれるので、入力する。

station wlan0 connect-hidden <SSID>
  • <SSID>: 自宅の無線 LAN の SSID

iwctl 終了

exit

接続確認

ping コマンドでインターネットに出れるか確認。

ping archlinux.jp

システムクロックの更新

timedatectl set-ntp true

パーティション設定

既存パーティションを全部削除して、 Arch Linux 用に efi, swap, linux filesystem のパーティションを作成。

fdisk の起動

fdisk /dev/sda

既存パーティション削除

すべてのパーティションがなくなるまで d コマンドで削除していく。

Command (m for help): d
Partition number (1-5, default 5): 1

GPT パーティションテーブル作成

Command (m for help): g

UEFI パーティション作成

パーティション作成

Command (m for help): n
Partition number (1-128, default 1):
First sector (2048-1000215182, default 2048):
Last sector, +/-sectors or +/-size{K,M,G,T,P} (2048-1000215182, default 1000215182): +300M

パーティションタイプの指定

Command (m for help): t
Partition type or alias (type L to list all): 1

swap パーティション作成

パーティション作成

Command (m for help): n
Partition number (1-128, default 2):
First sector (616448-1000215182, default 616448):
Last sector, +/-sectors or +/-size{K,M,G,T,P} (616448-1000215182, default 1000215182): +512M

パーティションタイプの指定

Command (m for help): t
Partition number (1,2, default 2):
Partition type or alias (type L to list all): 19

Linux filesystem パーティション作成

パーティション作成

Command (m for help): n
Partition number (3-128, default 3):
First sector (1665024-1000215182, default 2048):
Last sector, +/-sectors or +/-size{K,M,G,T,P} (1665024-1000215182, default 1000215182):

fdisk 終了

Command (m for help): w

パーティションのフォーマット

efi

mkfs.fat -F 32 /dev/sda1

swap

mkswap /dev/sda2

linux filesystem

mkfs.ext4 /dev/sda3

ファイルシステムのマウント

Arch Linux のファイルを配置するため、作成・初期化したパーティションをマウントする。

mount /dev/sda3 /mnt
mount --mkdir /dev/sda1 /mnt/boot
swapon /dev/sda2

Arch Linux ファイルの配置

最小限のファイルを、マウントしたパーティションに配置する。

pacstrap /mnt base linux linux-firmware

システム設定

fstab の生成

genfstab -U /mnt >> /mnt/etc/fstab

chroot

arch-chroot /mnt

タイムゾーン設定

ln -sf /usr/share/zoneinfo/Asia/Tokyo /etc/localtime
hwclock --systohc

ローカリゼーション設定

ロケール生成

sed -i -e 's/#en_US.UTF-8 UTF-8/en_US.UTF-8 UTF-8/' /etc/locale.gen
sed -i -e 's/#ja_JP.UTF-8 UTF-8/ja_JP.UTF-8 UTF-8/' /etc/locale.gen
locale-gen

LANG 環境変数

echo 'LANG=ja_JP.UTF-8' > /etc/locale.conf

キーマップ

echo 'KEYMAP=jp106' > /etc/vconsole.conf

ネットワーク設定

ホスト名

echo 'letsarch' > /etc/hostname

ネットワークマネージャーインストール

pacman -S networkmanager
systemctl enable NetworkManager.service

Root パスワード設定

passwd

ブートローダーインストール

GRUB をインストールする。

pacman -S grub efibootmgr intel-ucode
grub-install --target=x86_64-efi --efi-directory=/boot --bootloader-id=GRUB_UEFI
grub-mkconfig -o /boot/grub/grub.cfg

再起動

これでミニマムなシステムのインストールが完了したので、 chroot 環境から抜けて再起動する。

exit
reboot

再起動後のネットワーク設定

wifi 設定

nmcli dev wifi connect <SSID> password <PASSWORD> hidden yes
  • <SSID>: 自宅無線 LAN の SSID
  • <PASSWORD>: 自宅無線 LAN のパスワード

モバイル設定

LinksMate の SIM を入れているので、その設定を行う。

pacman -S usbutils usb_modeswitch modemmanager
systemctl enable ModemManager.service
systemctl start ModemManager.service
nmcli con add con-name "LinksMate" type gsm ifname "*" apn linksmate.jp user user password mate

再起動後、 nmtuinmcli con up nmcli con down でアクティベート・ディアクティベートできるようになる。

今回はここまで。

参考資料

2022年5月15日日曜日

Tauri アプリのアイコンを作るやつ備忘録

logo.svg を基に、各種サイズのアイコンを生成するコマンド群。

ImageMagick 7 以上をインストールしておく必要あり。

src-tauri

magick.exe convert -background none .\logo.svg -define icon:auto-resize .\icon.ico

magick.exe convert -background none -resize 128x128 .\logo.svg 128x128.png
magick.exe convert -background none -resize 256x256 .\logo.svg 128x128@2x.png
magick.exe convert -background none -resize 32x32 .\logo.svg 32x32.png
magick.exe convert -background none -resize 512x512 .\logo.svg icon.png
magick.exe convert -background none -resize 107x107 .\logo.svg Square107x107Logo.png
magick.exe convert -background none -resize 142x142 .\logo.svg Square142x142Logo.png
magick.exe convert -background none -resize 150x150 .\logo.svg Square150x150Logo.png
magick.exe convert -background none -resize 284x284 .\logo.svg Square284x284Logo.png
magick.exe convert -background none -resize 30x30 .\logo.svg Square30x30Logo.png
magick.exe convert -background none -resize 310x310 .\logo.svg Square310x310Logo.png
magick.exe convert -background none -resize 44x44 .\logo.svg Square44x44Logo.png
magick.exe convert -background none -resize 71x71 .\logo.svg Square71x71Logo.png
magick.exe convert -background none -resize 89x89 .\logo.svg Square89x89Logo.png
magick.exe convert -background none -resize 50x50 .\logo.svg StoreLogo.png

public

magick.exe convert -background none .\logo.svg -define icon:auto-resize .\favicon.ico

magick.exe convert -background none -resize 192x192 .\logo.svg  logo192.png
magick.exe convert -background none -resize 512x512 .\logo.svg  logo512.png