読者です 読者をやめる 読者になる 読者になる

しーくさんのUp & Down - Thinking Notes

更新頻度はあまり高くないです。プログラミングやLinuxなどのことについてや、果てはゲーム記事まで。

【2017-02版】Arch Linux(x86_64,UEFI)の実機インストール手順(個人用、デスクトップ)メモ書き

8【前提】
・GPT-UEFIでマルチブート(主にWindows10との)環境の構築を目指す。
BIOSブートはしない予定だがUEFI画面で、レガシーモード=CSMモードは「ON」にしておき、「UEFIファースト」としておく。
 ※セキュアブートOFFでUEFI-onlyにできるならそっちにしても良いかも…?できるんかいな?
・「セキュアブート」や「EFIのFastboot」、「Windowsの高速スタートアップ」などは「OFF」にしておく
ブートローダはGrub2を使用する予定。
・os-proberは使用せず、UEFIによるファンクション(F8キー)などで起動時にGrub2やWindowsBootmgrを呼び出して切り替える予定。
・LANはとりあえず有線。
・モニタはフルHDVGAカードはGeForce 750Tiとする。
USBメモリ(スティック)からのインストールとする。
・時刻系に関して、Windowsと共存予定なので、ローカル(Asia/Tokyo)を使用し,Universal TimeはUTC, RTCもローカルで使う。
・欠けている情報は公式Wikiなどを参照すること

【インストールメディアの準備】
・2~4GB以上のUSBスティックを用意。1GBぐらいだとぎりぎりかも
・Arch公式から*-dual.isoみたいな最新イメージをダウンロード。必要なら検証する。
・この記事では、Windows上「Rufus」を使ってUSBに焼き付けることにする。fat32を選んで、ISOでダウンロードしたやつ指定してスタート。
Rufus - 起動可能なUSBドライブを簡単に作成できます

【インストールメディアの起動と確認】
どうにかしてUSB起動させる。※ASUSマザーならF8キーでピンポイント指定すると楽「UEFI:USB********」みたいなやつを指定。

起動後ブートローダの一番上を選び、対話が表示されるまで待つ。

キーマップ指定。
# loadkeys jp106

EFIシステムでロードされているか確認(色々ファイルが存在していればOKらしい)
# ls /sys/firmware/efi/efivars

対象ディスクの確認、GPTパーティション切り
# ls /dev/sd*
# lsblk -f
※出力の一例

NAME FSTYPE LABEL UUID MOUNTPOINT
sda
├─sda1 ntfs 回復 34***********BBC
├─sda2 vfat B**8-8**6
├─sda3
└─sda4 ntfs システムディスク C**************0
sdb
└─sdb1 ntfs HDD-SUB 0**************0
sdc

・/dev/sdaはWin10のCドライブがあるディスクでいじらない
・/dev/sdbはサブのデータドライブでいじらない
・今回いじるのは/dev/sdc

念の為中身を確認
# gdisk -l /dev/sdc


パーティション切り】
# gdisk /dev/sdc
・先頭に「EFIパーティション(/boot兼用)」
・次に「/」
残りお好きに。容量さえあればほぼ気の済むまでパーティション分割できるらしい(120ぐらい)
・今回はメモリが大量に余ってるのでSWAP作らない予定。
・別に順序はどうでもいいらしい?

【フォーマット】
# mkfs.vfat -F32 /dev/sdc1 ※EFIパーティション。「-F32」は必ずつける
# mkfs.ext4 /dev/sdc2 ※ルートファイルシステム

【とりあえずマウント】
# mount /dev/sdc2 /mnt
# mkdir /mnt/boot
# mount /dev/sdc1 /mnt/boot

【Let's Start】
# ping archlinuxjp.org ※ネット接続確認。

# timedatectl set-localtime Japan
# timedatectl set-local-rtc true
# timedatectl set-ntp true
# timedatectl status

Local time: 月 2017-03-13 13:46:57 JST
Universal time: 月 2017-03-13 04:46:57 UTC
RTC time: 月 2017-03-13 13:46:57
Time zone: Japan (JST, +0900)
Network time on: yes
NTP synchronized: no
RTC in local TZ: yes

こんな感じになるはず。イメージ。警告は出るが、無視することにする。

/etc/pacman.d/mirrorlistをいじって、Japan系のやつを一番上に持ってくるjaistさんのやつがいいかな?と勝手に思う。
# pacstrap /mnt base base-devel
しばらく待つ。

UUIDでfstab自動記述。一応中身確認しておく
# genfstab -U /mnt >> /mnt/etc/fstab

chroot
# arch-chroot /mnt

タイムゾーン設定
# ln -sf /usr/share/zoneinfo/Asia/Tokyo /etc/localtime
# hwclock --systohc --local

ロケール、vconsole,hostname,hosts,割愛https://wiki.archlinuxjp.org/index.php/%E3%82%A4%E3%83%B3%E3%82%B9%E3%83%88%E3%83%BC%E3%83%AB%E3%82%AC%E3%82%A4%E3%83%89#.E3.83.AD.E3.82.B1.E3.83.BC.E3.83.AB

ネットワーク・DHCP設定
/etc/systemd/network/wired.networkを作成

[Match]
Name=en*

[Network]
DHCP=ipv4

# systemctl enable systemd-netoworkd
# systemctl enable systemd-resolved
# ln -sf /run/systemd/resolve/resolv.conf /etc/resolv.conf ※公式ライブ環境以外(arch-install-scriptsを使用)からインストール作業中の場合はchroot外からリンクを貼りなさい、とある。今回は関係なさそう。

必要があれば、
# mkinitcpio -p linux

# passwd ※rootのパスワード設定

普段遣いのUser作成
# useradd -m -G wheel,video [ユーザ名]
# passwd [ユーザ名]


【Grub2のインストール
# pacman -S grub efibootmgr
Intel の CPU を使っている場合は intel-ucode パッケージを追加インストール

# grub-install --target=x86_64-efi --efi-directory=/boot --bootloader-id=grub-arch
# grub-mkconfig -o /boot/grub/grub.cfg

【再起動して確認】
# exit
# umount -R /mnt
# reboot
再起動後、USB抜く。
起動中F8押して、
grub-arch:[P:3 ディスク名] のようなやつを選択

EFIシステムでロードされているか確認(色々ファイルが存在していればOKらしい)
# ls /sys/firmware/efi/efivars

時刻がずれてる場合は、もう一度確認する。
timedatectlの前述の設定と同じにして時刻同期。


【追加の色々】
# pacman -S gdisk

vfat,exfat,ntfsの読み書き
# pacman -S dosfstools exfat-utils ntfs-3g mtools

zsh
# pacman -S zsh
# chsh [ユーザ名] -s /bin/zsh

# EDITOR=nano visudo
wheel行1行をアンコメントして保存

AURヘルパー(yaourt)
Yaourt - ArchWiki

# pacman -S ccache
以下3つを好みにカスタマイズ
/etc/pacman.conf
/etc/makepkg.conf
/etc/yaourtrc
※CFALGS=>いじらないほうがよいということだが変更したいなら「gentoo Safe GCC CFLAGS」などを参考にするといいかも。
MAKEFLAGS="-j6"ぐらいにしてみた。
pacmanのcolor出力、makepkgのccache利用ぐらいはONにしておこうかな。

git
$ yaourt -S git
初期設定はやっておいたほうがよい

nkf
$ yaourt -S nkf


【Xサーバー関係のインストール
$ yaourt -S xorg-server xorg-server-utils xorg-apps xf86-input-libinput xf86-video-nouveau
※ここではオープンソース版のnvidiaを選択。mesa。

【フォント】
好きなの入れる。必要があれば当ブログ過去記事のどれか参照のこと。

【IMなど】
・当方はibus-mozcを愛用中。
Mozc - ArchWiki


emacs-nox(Xサポートなし)】
$ yaourt -S emacs-nox

※ディスプレイマネージャとかデスクトップ環境選択は、Wikiとかで調べて選んで入れる

以上、ここまで。

補足1:たとえばGDMからログインしてGNOME3環境のキー反応がおかしいときは、Xorg版を選択してログインすること。
補足2:# gdk-pixbuf-query-loaders --update-cache

BIOS+GPT環境でのGrub2によるブート(BIOS+UEFIの両環境対応型の手順抜粋。一部未確認)

【ポイント】
・Arch Linuxでのインストールメモの一部だけど、応用が利きそうなメモです。
・自分がよくわかってないのであえてまとめてみました。
・gdiskなどの、GPT対応ツールを使ってパーティショニング。
・「gpt」(ラベル)で初期化。※(「msdos」ではない)
・そのディスクの先頭に1007KiBの未フォーマット領域(パーティション)を作る(システムタイプCODE=ef02)
・その後、rootパーティション、必要ならSWAPやBOOTなどを作成。
・一応、GPTなので128パーティションぐらいまで作成できるらしい。
UEFI対応させるならgrub2の他にefibootmgrとやらも必要になるみたい?インストール

※対象のHDD(SSDやUSB接続)を確認。
$ ls /dev/sd*
$ lsblk -f

※今回は、仮に/dev/sdaだとする。
※しつこく、対象を確認しておく。
# gdisk -l /dev/sda

パーティション情報の全消去
# gdisk --zap-all /dev/sda


# gdisk /dev/sda

プロンプトが表示されたら、
GPTで初期化する指示(「o」の入力?)をまずやる。

続いて、
n,default,default,+1007K,ef02(BIOS boot partition)

・あとは自由に作成して良い。
EFIパーティションを作成してUEFIブートも対応する場合、適当なパーティション(500MiB程度)を作成し、typeに「EF00」を指定する。

一通り終わったら、忘れずに「w」で実際に書き込んで抜ける。

・次にフォーマット。
※先頭に作ったBIOS-boot-partitionは絶対にフォーマットしないこと!!
※その後ろのどこかに作った(かもしれない)EFIパーティションは「mkfs.vfat -F32」で初期化する
rootfsとか他のパーティションは好きなフォーマットでどぞ。

・必要なパーティションをマウントしてインストール
例として、ここでは、EFI用とrootfs用だけ作成したものとする。(/dev/sda1=BIOS-BOOT-PARTITION,/dev/sda2=EFI-PARTITION,/dev/
sda3=rootfs)

# mount /dev/sda3 /mnt
# pacstrap /mnt base-devel
# arch-chroot /mnt
※とりあえずこれだけ。arch-chrootの前に、pacstrapとかやるけどね


・grub2(BIOSモード)を対象のディスクにイントールBIOS環境の場合必須。(手順で起動確認済み)
# grub-install --target=i386-pc /dev/sda
# grub-mkconfig -o /boot/grub/grub.cfg

・grub2(UEFIモード)。追加でUEFIBIOS両対応するには多分こうやる?(起動未確認……。HDD移したり実験するの面倒なので)
# mkdir /boot/efi
# mount /dev/sda2 /boot/efi
# grub-install --target=x86_64-efi --efi-directory=/boot/efi --bootloader-id=grub-bios-gpt
# grub-mkconfig -o /boot/grub/grub.cfg
※「grub-bios-gpt」の部分はおそらく名前なので自由にしてよい?
※これを実施しているのがEFIシステムじゃない場合、2行ほど同じ警告が表示されるが一応問題なく完了する。

【結論】
まあよくわからん。
とりあえずGPTでフォーマットしてBIOS環境でブートするまでは確認した。
この手順でそのままUEFIブートまで対応できてるのかは実際にマザボに挿してみないとよくわからないのであった。

Arch Linux インストールメモ:ibus-mozcのビルドでコケる問題

バージョン:ibus-mozc-2.18.2548.102-1 mozc-2.18.2548.102-1

「/usr/bin/rcc」を探しに行って、見つからないのでインストールがコケる。
現在時点では「/usr/lib/qt4/bin/rcc」に存在しているので、
(他のそれ系のパッケージに含まれてるみたいだがどれだか検索してないなワシ。あとで何かを入れた際にきちんと/usr/bin/rccが入ってた)、
PKGBUILDを少しいじるか、そもそも「ln -s /usr/lib/qt4/bin/rcc /usr/bin/rcc」してしまうかで、解決。

グラブル始めました&コロゥ討滅戦EX攻略(闇属性PT)

最近はグラブルをやってます

表題の通りです。
ついに手を出してしまった、禁断の領域。
楽しく身内系の団で遊んでおります。

コロゥ討滅戦EX攻略(闇属性単色PT。SSRヨダルラーハ不使用)

てなわけで攻略した手順とかを記事にしてまとめておきます。
プレイヤーRANKは75前後。

今回の使用キャラ(闇単色PT)

スタメン

SSR:ナルメア(75lv:ドラフ)
SSRレディグレイ(66lv:ヒューマン)
・ SR:ザザ(53lv:ドラフ)

Sub(正直サブメンバーが出てきたら全滅必死orあと一撃ぐらいなのでなんでもいい)

・ SR:ルシウス(56lv)
・ SR:シャオ(65lv)

召喚石

メイン石:SSRバハ(無凸40lv)
サブ石 :SR闇カーバンクル(無凸30lv)
他:適当。
フレ石:SSRバハが楽でいいと思うが、闇属性加護30~40%↑ならなんでもよさげ?

武器

メイン:バハ短剣(初期段階:Slv6)
サブ1:バハ剣(初期段階:Slv3)
サブ2:ヨダ爺の持参品SSR闇刀(Slv3)
他サブ:適当なSR闇武器(Slv3程度)で埋めた。

主人公の職

闇ダークフェンサー1択。
EXにはブラインドをセット(アローレイン3でもいいかもね)
ゼニス強化は、攻撃力*3、HP*3ぐらいで十分。

表示戦力

・主人公攻撃力=26104
・主人公HP=5800程度

手順(非AT時)

【1バトル目】
ミゼラブルミストからのバハムート召喚からのナルメアおねえちゃん2アビ=>1アビ。
1ターン目から、素殴りでGOしてKO。(下の敵にターゲット固定してから)
2ターン目も素殴りで2体目ともKO。
※奥義は温存。

【2バトル目】
特に何もせず、素殴りして終わり。※適時ナルメアおねえちゃんの1アビを使っておく。奥義は温存。

【ボス戦】
ミゼラブルミスト、ブラインド、グラビティなどデバフのオンパレード。レディグレイの2アビ「ディープ」も使ったり。ダメージ入れる。
素殴りしながら奥義ゲージを4人共ためていき、温存しておく。※この時、OD反骨(ナルメア3アビ)をOD終盤で使えるように調整しつつ、1アビと2アビは適時使用してもよい。
 ※=>なお、闇カーバンクルはとっておく。
念のため、HP50%~60%程度まで削り(もうちょいゆるめでも行けるかもわからんHP計算してないけど)、相手のOD終盤で、闇鞄を使用。
ザザの3アビ(ダメカ)も念のため使う。主人公ぐらいはギリ生き残る可能性があるので。
OD中のはずなので、ナルメアの3アビ(反骨)を使いつつ、1アビは任意だが防御低下消したほうが安全か?(なお、HPも低めなので、HP50%特殊技を食らうとダメカ40%程度じゃ蒸発してしまう模様w)
一応、ポーションは使いきるなりして、全快しておく。
あとは4人奥義フルチェインバーストでフィニッシュ!
・主人公20万、ナルメア50万、レディグレイ20万だったかな?ザザは15万ぐらいだったきが。+フルチェインバーストで60万ぐらいか。合計140万程度↑で吹き飛ばせる。
 ※ヨダ爺を無理に入れて介護したりヒヤヒヤするより楽かもわからん。ただ、ボスは残り60%ぐらいまで削れれば属性とかキャラとか関係なく、ヨダ爺3幕奥義で吹っ飛ばせるので楽っちゃ楽。

というわけで

自分なりの手順とか状況を簡単にメモしてみました。

AeroGlassっぽいやつをWINAPIで設定したウィンドウを作る

こんな感じのやつね。
f:id:uys:20151017232320p:plain

#ifndef WINVER
#define WINVER 0x0600 //Vista以降をサポート(DWM≒AeroGlass用)
#endif

#include <windows.h>
#include <windowsx.h>
#include <stdlib.h>
#include <string.h>
#include <tchar.h>

//DWM(AeroGlass)用
#include <dwmapi.h>
#pragma comment(lib, "dwmapi.lib")

namespace g {
	const TCHAR* CLASS_NAME = _T("__Win32_DWM_Window_Test__");
	const TCHAR* TITLE_DEFAULT = _T("Win32 Guided Tour Application");
};

//DWM(AeroGlass)を使用可能かチェックします
bool CheckEnableDWM() {
	BOOL enable = FALSE;
	DwmIsCompositionEnabled(&enable);
	if (enable)
		return true;
	else
		return false;
}

//DWM(AeroGlass)を有効化します
void EnableDWM(HWND hWnd) {
	DWM_BLURBEHIND dwm_bb;
	dwm_bb.dwFlags = DWM_BB_ENABLE;
	dwm_bb.fEnable = TRUE;
	DwmEnableBlurBehindWindow(hWnd, &dwm_bb);
}
//DWM(AeroGlass)を使用できるかチェックし、有効化します
//マージンの設定で-1を指定すると、クライアント領域全体に拡張されます。
void SetDWM(HWND hWnd, bool extend = true, MARGINS margin = {-1}) {
	//DWMが使用可能?
	if (CheckEnableDWM()) {
		//可能なので設定する
		EnableDWM(hWnd);
		if (extend) {
			DwmExtendFrameIntoClientArea(hWnd, &margin);
		}
	}
}

LRESULT CALLBACK WndProc(HWND hWnd, UINT msg, WPARAM wp, LPARAM lp) {
	switch (msg) {
	case(WM_CREATE):
		SetDWM(hWnd);
		break;
	case(WM_DWMCOMPOSITIONCHANGED) ://時折流れてくるメッセージらしい。
		//無効化されてるので、必要なら再度チェックしてから有効化する。
		SetDWM(hWnd);
		break;
	case(WM_DESTROY) :
		PostQuitMessage(0);
		break;
	default:
		return ::DefWindowProc(hWnd, msg, wp, lp);
	}
	return 0;
}

int APIENTRY _tWinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPTSTR lpCmdLine, int nCmdShow) {
	WNDCLASSEX wcex = { 0 };
	wcex.cbSize = sizeof(WNDCLASSEX);
	wcex.cbClsExtra = 0;
	wcex.cbWndExtra = 0;
	wcex.lpfnWndProc = ::WndProc;
	wcex.hInstance = hInstance;
	wcex.style = CS_HREDRAW | CS_VREDRAW;
	wcex.hbrBackground = GetStockBrush(BLACK_BRUSH);
	wcex.hIcon = LoadIcon(hInstance, MAKEINTRESOURCE(IDI_APPLICATION));
	wcex.hCursor = LoadCursor(NULL, IDC_ARROW);
	wcex.hIconSm = LoadIcon(hInstance, MAKEINTRESOURCE(IDI_APPLICATION));
	wcex.lpszClassName = g::CLASS_NAME;
	wcex.lpszMenuName = nullptr;
	if (!RegisterClassEx(&wcex)) {
		MessageBox(NULL, _T("Call to RegisterClassEx is Failed!"), _T("Error-Info"), MB_OK | MB_ICONERROR);
		return 1;
	}

	HWND hWnd = CreateWindow(
		g::CLASS_NAME,
		g::TITLE_DEFAULT,
		WS_OVERLAPPEDWINDOW | WS_VISIBLE,
		CW_USEDEFAULT, CW_USEDEFAULT,
		800, 600,
		NULL,
		NULL,
		hInstance,
		NULL);

	if (hWnd == NULL) {
		MessageBox(NULL, _T("Call to CreateWindow is Failed!"), _T("Error-Info"), MB_OK | MB_ICONERROR);
		UnregisterClass(g::CLASS_NAME, hInstance);
		return 1;
	}

	ShowWindow(hWnd, nCmdShow);
	UpdateWindow(hWnd);

	MSG msg;
	while (GetMessage(&msg, NULL, 0, 0)){
		TranslateMessage(&msg);
		DispatchMessage(&msg);
	}
	return (int)msg.wParam;
}