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

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

アセンブリで”HelloWorld!!”(nasm,64bit,linux)

というわけサンプルコード

ファイル名:hello.asm

bits 64 ;64bitモードのプログラムであることを指定

section .text
global _start

_start:
    mov rax, 1 ; Linuxシステムコールのsys_writeを指定
    mov rdi, 1 ; stdoutを指定
    mov rsi, msg ; msgのアドレスを格納
    mov rdx, length ; lengthを格納
    syscall     ; 上記でシステムコール実行

    mov rax, 60 ; sys_exitを指定
    mov rdi, 0  ; return 0;
    syscall     ; システムコール実行して終了

section .data
    msg db 'Hello, World!! for NASM.', 0x0A   ;文字列データ配列 "0x0a"は改行
    length equ $ - msg ;文字列の長さ

ビルド

nasm -f elf64 hello.asm
ld -s -o a.out hello.o

./a.outで実行

Windows上(Win10)でのキーバインド変更を実現する

「keyhac」というソフトを導入、設定すれば自由に設定できるらしい

ここでどうぞ。
Keyhac - Pythonによる柔軟なキーカスタマイズツール - craftware

ダウンロードしてとりあえず起動する。

ZIPファイルで、中に添付物一式が入ってるので展開して好きなところに配置。
exeで起動して、起動中はシステムトレイに常駐する感じ。
※トレイアイコン左クリックとかで、「keyhac」の起動ログや操作ログが出る。

設定ファイルを編集

設定ファイルは、Windows10なら「C:\Users\"ユーザ名"\AppData\Roaming\Keyhac\」にあるiniファイルとpyファイル辺りがそうらしいのだが、
説明によると、

また、最初の起動で、アプリケーションデータディレクトリに自動的に以下のファイルが作られます。 ( Vista/7/8/10 では c:/Users/(name)/AppData/Roaming/Keyhac、XP では c:/Documents and Settings/Application Data/Keyhac)

config.py 設定ファイル
keyhac.ini 状態保存ファイル

config.py と keyhac.ini は、keyhac.exe と同じディレクトリにおいておけば、 そちらが優先的に使われます。USBメモリなどで持ち歩く際に便利な方法です。

らしいので、展開したファイル群の中に両ファイルを設置でもOKみたい

一応トレイアイコン右クリックすると設定ファイル編集ってでるのでそれ選んでも良い。


ここではとりあえず試しに、Ctrl+kとCtrk+uにそれぞれ例の動作を設定したい。ただの例だが。

Python言語で記述する。※あんまり触ったことないけど、サンプルを利用して勘で書いてみた。
※シンプルにするため、余計と思われるところは全部削除してから書いたので、必要なら色々追記したり書き換えると良い。

import sys
import os
import datetime

import pyauto
from keyhac import *


def configure(keymap):

    # --------------------------------------------------------------------
    # Text editer setting for editting config.py file
    # キーバインド変更するためのエディタ。標準ではnotepad.exeだがここでは好きなエディタ(Mery)を指定
    # Setting with program file path (Simple usage)
    if 1:
        keymap.editor = "C:\\Program Files (x86)\\Mery\\Mery.exe"

    # Setting with callable object (Advanced usage)
    if 0:
        def editor(path):
            shellExecute( None, "C:\\Program Files (x86)\\Mery\\Mery.exe", '"%s"'% path, "" )
        keymap.editor = editor

    # --------------------------------------------------------------------
    # Customizing the display

    # Font
    # 好きなフォントを指定。うちは自作のRictyファミリで
    keymap.setFont( "Ricty alters", 14 )

    # Theme
    keymap.setTheme("black")

    # --------------------------------------------------------------------

    
    # これは、OS全体に関わる設定
    # Global keymap which affects any windows
    if 1:
        # Windows OSのデフォルトキーバインドをとりあえず設定
        keymap_global = keymap.defineWindowKeymap()
        # 現在位置から行先頭までを選択し、削除。[Ctrl-U]に割り当て
        keymap_global[ "Ctrl-U" ]   =   "Shift-Home", "Back"
        # 現在位置から行末までを選択し、削除.。[Ctrl-K]に割り当て
        keymap_global[ "Ctrl-K" ]   =   "Shift-End", "Delete"
    
    # 【個別ソフト】「Chrome」の設定
    if  1:
        keymap_chrome = keymap.defineWindowKeymap( exe_name="chrome.exe" )
        keymap_chrome[ "Ctrl-H" ]   = "Back" #Backspace


** とりあえず望みはかなったが、Chromeとかでは効かないのでどうにかしたい
※VisualStudioとかもそうだが、個別のキーバインドが優先されてしまうので上記のように個別に書き足すと良いらしい。
(配列名=個別のソフト名など適当、exe_name=個別のEXEファイル)
自動起動したければ適当に。解説は省く。

【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」してしまうかで、解決。