MacBook AirのVirtualBoxにArch Linux 2012.12.01をインストール

インストールしてみたはいいけど、遅い…。

VMの設定の何かがマズいのかと思ったのですが、ググると他にもチラホラ遅いという話が上がっているようなので、VirtualBoxの問題なんでしょうね。
VMWare Fusionへの乗り換えを検討しています。

なお、MacはVMWare Playerが使えないという悲劇…。

ちなみにどの位遅いのかというと、

  • CPU: 1core割当, 使用率制限100%
  • MEM: 2GB

で、phantom.jsが10時間かかってもビルドし終わらない、emacs (GUI) の起動に数分かかる、guard立ち上げてるとemacsのカーソル移動が数秒遅れて反応する、という程度です (core数増やせばいいの?いや、それにしたって…) 。

では、インストール手順をば。

VirtualBoxのインストール

本家サイトから、Mac用のdmgを落としてきてポチっとします。
https://www.virtualbox.org/wiki/Downloads

仮想イメージの作成

VIrtualBoxを起動し、「新規」ボタンからVDI形式で作ります。容量はとりあえず60GBにしてみました。
VMDXにしようかとも思いましたが、後でVDIから変換できるようですし、VirtualBox上で動かすのであればVDIの方が変なオーバーヘッドが出なそう (未検証) だなと思ってVDIを選びました。

ま、VMWare Fusionに乗り換えようとしてるんですけどね。

Arch LinuxのISO入手

Arch LinuxのサイトからISOを落としてきます。

https://www.archlinux.org/download/

ファイルは archlinux-2012.12.01-dual.iso です。
bit torrentでもHTTPでもお好きな手段で。

その後、VirualBoxのUIから、前項で作った仮想イメージのCD/DVDとしてマウントさせます。

Arch Linuxのインストール

ここからが本題です。

いつの間にやら、Arch Linuxはインストーラらしいインストーラがいなくなっていました。
時代と逆行していてかわいいですね(ぉ

まずはVMを起動します。
Arch Linuxブートローダが現れます。

パーティションを切る

これ、自分でやらないといけません。/dev/sdaがディスクにあたるので、これをfdiskでパーテイショニングします。

# fdisk /dev/sda

で、

  • sda1 -> 100MB, /boot 用, bootable
  • sda2 -> 1GB, swap 用
  • sda3 -> 残り, / 用

としました。

どうせVMだし、と思って /home やら /var は切ってません。

なお、sda1にbootable flagを立てるのを忘れると起動しません。
fdiskの使い方はググればすぐ出ますし、ヘルプもあるのでそう迷わないはず。

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

これも自分でやらないと行けません。

# mkfs.ext2 /dev/sda1
# mkfs.ext4 /dev/sda3
# mkdswap /dev/sda2

/boot は 無難に ext2 です。

フォーマットしたらマウントします。

# mount /dev/sda3 /mnt
# mkdir /mnt/boot
# mount /dev/sda1 /mnt/boot

で、このマウントしたディレクトリに色々とブツをインストールするわけです。

中の人をインストール

まずはレポジトリのミラーを設定します。

# vi /etc/pacman.d/mirrorlist

で、JapanのレポジトリのScoreを 0.1 にするとよいようです (<-Scoreが何者なのかまだ調べてない) 。

ではインストールします。

# pacstrap /mnt base base-devel

続いて、grubインストールします。

# arch-chroot /mnt pacman -S grub-bios

fstabを生成します。これがないと使えませんね。

# genfstab -p /mnt >> /mnt/etc/fstab
各種設定

さて、/mnt に必要なものをインストールしたわけなので

# arch-chroot /mnt

として /mnt を見せかけの / として扱います。
これによって、普通のLinuxっぽいファイルシステム構成として作業が進められます。

ホスト名の設定

# echo 'ホスト名前' >> /etc/hostname

タイムゾーンの設定

# ln -s /usr/share/zoneinfo/Asia/Tokyo /etc/localtime

ロケールの設定

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

続いて

# vi /etc/locale.gen

で「ja_JP.UTF-8 UTF-8」の行をアンコメントして

# locale-gen

コンソールキーマップとフォントの設定
とりあえず困ってないから初期状態のままで
直したくなったら
https://wiki.archlinux.org/index.php/KEYMAP_(%E6%97%A5%E6%9C%AC%E8%AA%9E)

イニシャルRAMディスク

いらないような気がします。試行錯誤の末、やらないようにした記憶がありますが、一応。。

# mkinitcpio -p linux

ブートローダ

# grub-install --target=i386-pc --boot-directory=/boot --recheck --debug /dev/sda

ちなみにここで target を x86_64-pc にしたら

source_dir doesn't exist. Please specify --target or --directory

と怒られました。なぜ…。

この後

# grub-mkconfig -o /boot/grub/grub.cfg

これをやらないとインストール後の起動で以下のエラーが出ます。

No such Device: ad4103fa-d940-47ca-8506-301d8071d467.
Loading Linux core repo kernel ...
error: no such partition.
Loading initial ramdisk ...
error: you need to load the kernel first.

Press any key to continue..._

rootのパスワード

# passwd
設定後
# exit

chroot を抜けて

# umount /mnt/boot

で /mnt 配下をアンマウントします (home や varがあればそれも)。そしてVMをシャットダウンします。

# shutdown -h now

VirtualBoxのUIからCDイメージをアンマウントして (しないとまたCDブートします) 再起動します。

以上でOSのインストールは完了です。

OSインストール後の設定

ネットワークの設定
# ip link set eth0 up
# systemctl start dhcpcd@eth0

どうも、起動の度に systemctrl しないとダメみたいです。起動時に自動でやって欲しいですが、まだその辺は調べてません。

あ、ちなみに ifconfig は初期状態では入っていないのでご注意を。

参考
https://wiki.archlinux.org/index.php/Beginners%27_Guide/Extra_(%E6%97%A5%E6%9C%AC%E8%AA%9E)

パッケージを最新に
# pacman -Syu
一般ユーザの作成

# useradd -m {username}
これでまずユーザを作った後

# pacman -S sudo
# sudoedit /etc/sudoers

として

{username} ALL=(ALL) ALL

を追記して、作ったユーザで sudo すれば色々できる便利設定をしておきます。

パスワードを

# passwd {username}

で設定します。

X Window System
# pacman -S xorg-server xorg-xinit xorg-server-utils

VitualBoxのゲストOSだったらビデオドライバのインストールは不要、とのことです。

続いて、VirtualBoxのゲストアドイン設定をします https://wiki.archlinux.org/index.php/VirtualBox#Arch_Linux_guests

# pacman -S virtualbox-guest-utils
# modprobe -a vboxguest vboxsf vboxvideo
# vi /etc/modules-load.d/virtualbox.conf

virtualbox.confの内容は

vboxguest
vboxsf
vboxvideo

となります。サービスの起動は

# VBoxClient-all &

とやるので、後ほど .xinitrc に記述しておきます。

Window Managerを入れます。

# pacman -S openbox

ターミナルエミュレータはひとまず

# pacman -S xterm

一般ユーザにします。

# su {username}

.xinitrc を記述します。

$ cd
$ vi .xinitrc

内容は

VBoxClient-all &
xterm &
exec openbox

Xを起動します。

$ startx
いつものパッケージをインストール

よく使うものを入れます。

$ sudo pacman -S zsh tmux openssh git emacs

自分の場合、GitHub にドットファイルを置いているので

$ git clone {れぽじとり} dotfiles
$ ln -s dotfiles/.zshrc .
$ ln -s dotfiles/.tmux.conf .
$ ln -s dotfiles/.emacs .

という感じにします。

ログインシェルをzshにします。

$ sudo vi /etc/passwd

自分の{username}の行で /bin/bash -> /bin/zsh とします。
または chsh コマンドを使います (こっちのが楽か…) 。
再起動しないと反映されない??

yaourt

AUR から便利にパッケージインストールできるようにします。

先ずは yaourt と依存関係にある package-query を入れるのですがそれがさらに依存関係にある yajl をインストールします。

$ sudo pacman -S yajl

package-query を入れます。AUR から落としてきてローカルでパッケージを作ってインストールします。

$ curl -O https://aur.archlinux.org/packages/pa/package-query/package-query.tar.gz
$ tar zxvf package-query.tar.gz
$ cd package-query
$ makepkg
$ sudo pacman -U package-query-*.pkg.tar.xz

yaourt 本体を入れます。要領は package-query と同じです。

$ curl -O https://aur.archlinux.org/packages/ya/yaourt/yaourt.tar.gz
$ tar zxvf yaourt.tar.gz
$ cd yaourt
$ makepkg
$ sudo pacman -U yaourt-*pkg.tar.gz
フォント

とりあえずRictyを入れておけば何とかなるでしょう。

$ yaourt -S ttf-ricty
キーコード

MacBook Air(日本語版)だと、英語配列にしたときにバッククオート/ティルダに相当するキーがないので

$ echo "keycode 132 = grave asciitilde grave asciitilde" > ~/.modmap

として
~/.xinitrc の openbox 実行前に

xmodmap ~/.xmodmap

を記述します。
これによって、バックスラッシュキー(deleteの横)がバッククオート/ティルダになります。ちょっと変則的ですけどね。

まあ、素直に日本語配列で使えばいいのかもしれませんが…。

日本語入力

mozcでもanthyでも好きなのを。とりあえず割愛します。

X Windowが起動しなくなったので

ある日の yaourt -Syua で何かがやられた様子。

症状

Xが起動しない
コンソールに

INIT: Id "x" respawning too fast: disabled for 5 minutes ntconfig

と定期的に出る
startxすると

ERROR: could not insert nvidia : No such device

と出る

対応

$ yaourt -S nvidia-beta


リーナス氏に中指を立てられたNVIDIAが…。今まで nvidia (パッケージ名) でちゃんと動いていたのに、何故ここへきてbetaじゃないとダメに?

はるかぜちゃんブックマークレット

ネタです。

javascript:(function(){var%20b=document.getElementsByTagName('body')[0];b.innerHTML=b.innerHTML.replace(/。/g,'(ω)')}())

これをブックマークのURLとして設定し、任意のページでそのブックマークをポチっとすると、句点を(ω)に変換します。
かなり強引なやり方をしているのでいらんものまで変換してしまうような気がしますが、要件は満たすでしょう。


8/17追記
なんでこんな中途半端にURLエンコーディングしたんだ…

forもwhileもifも剰余算も使わないJavaScriptのFizzBuzz、byte数徹底して減らしました

先日のネタ的Pythonの解答
http://d.hatena.ne.jp/xorphitus/20120411/1334147796
とは趣を変えて、直球勝負してみたJavaScriptのコードです。

まずは問題をおさらい。

問題:下記1〜4の制約それぞれについてFizzBuzz問題を解け
JavaScript (ECMAScript 5th) および Python (2.6 or higher) のコードを提出すること

1. for/whileループ禁止
2. 剰余算禁止
3. if/switch分岐禁止 (三項演算子もダメ)
4. 文の数を徹底的に減らせ

徹底的に減らそうと努力したのは、文の数ではなくbyte数ですが。

(new Array(100+1)).join('0').split('').map(function(i,j){m=function(p,q){return p-Math.floor(p/q)*q;};console.log(!!(m(++j,3)*m(j,5))*j||((m(j,3)||'Fizz')+(m(j,5)||'Buzz')).replace(/\d/,''));});

Array + 無名関数、というのが常套手段な気がします。再帰でループしようものならコード量が増えてしまいますので。
ただJSの場合はArrayの作成が面倒です。例えばPythonならrangeで簡単に作れるのですが…。
最初に試みたコードは

(new Array(100)).forEach();

だったのですが、これは配列の中身がトラバースされません。
ところがjoinはできるんですね。

(new Array(100+1)).join('0');

あとは空文字列でsplitしてやれば、任意のサイズのArrayができあがります。なお、joinで文字数がArrayのサイズより1つ小さくなるので1を足しておきます。

次にArrayのトラバースについてですが、意味としてはforEachが最も適切ではありますが、正直、filterやmapでもいいので最も文字数が少ないmapを用います。無名関数の第二引数がインデックスとなります。

無名関数内ですが、まず剰余算をする関数を定義しておきます。

m = function(p, q){return p - Math.floor(p / q) * q;};

ささやかな可読性のためにホワイトスペースを入れました。
何度かコールするので、これによってbyte数が削減できます。なお、varの宣言はこのコードにおいて何の意味もなさないのでこれもカットします。

あとは数値と真偽値の型変換をうまくつかってゴリゴリします。!!で数値は真偽値になり、積算すると真偽値は0/1として扱われます。

ただ、最後のreplaceがちょっとカッコ悪いですね。

追記: 記事をsubmitしてから気づいた

byte数削減狙いだったら、変数の使い方を変えて

(new Array(100+1)).join('0').split('').map(function(i,j){r=++j-Math.floor(j/3)*3;s=j-Math.floor(j/5)*5;console.log(!!(r*s)*j||((r||'Fizz')+(s||'Buzz')).replace(/\d/,''));});

の方が短い!
タイトルがちょっと恥ずかしくなりました…。

【ネタ】forもwhileもifも剰余算も使わないPythonのFizzBuzzワンライナー

新人が入社してきたので、こんな問題を出してみました。

問題:下記1〜4の制約それぞれについてFizzBuzz問題を解け
JavaScript (ECMAScript 5th) および Python (2.6 or higher) のコードを提出すること

1. for/whileループ禁止
2. 剰余算禁止
3. if/switch分岐禁止 (三項演算子もダメ)
4. 文の数を徹底的に減らせ

まあ、よくありそうですね。
上記の制約は「それぞれ」満たせばよいので、全部クリアしている必要はないという、解くだけなら簡単な問題です。
(単に解くだけではなく、「おっ」と思わせるコードを書いてみせて欲しいなと思っていますが)

で、1〜4を全て満たすコードってどんなのがあるかなあと自分自身考えてみたんですが、何というか、バカっぽいものをPythonで思いつきました。

import zlib; exec zlib.decompress('x\x9cK\xcb/R\xc8T\xc8\xccS(J\xccKO\xd50\xd4Q040\xd0\xb4\xe2R\x00\x82\xcc4\xa0\x94\xaa\x82\xa1\xa9\x82\xad\xad\x82\x01D\x0c\x04\n\x8a2\xf3J\x14\x94\xdc2\xab\xaa\x9cJ\xab\xaa\x94\xc0\x12\xa99P\xe5\xc6\xb8U\xa3\xa9\xc4a.\xb2\x99\xc5\xa9\xe8\xd2\x99\\\x005\xd2*\xe3')

おあとがよろしいようで…。

URXVT + zsh + tmuxすると、zshの補完候補のハイライトが正常にされない

zshのtab補完で候補がハイライトされるアレが、tmuxと併用するとまともにハイライトされずイタリック (ボールド?) になるという謎現象。見づらいったらありゃしない。
.Xdefaultsに

URxvt*termName: xterm

って書いたら直りました。

Arch LinuxにMozcを導入してみた

「おんな」を「オンな」に、「しぶや」を「支部や」に変換するくせに、らきすた」を「らき☆すたに変換する我が家のスーパーファンキー辞書Anthy (デフォルトですよ!) からとうとう卒業することといたしました。
非常に楽しませていただいていたのですが、さすがに不便ということで…。
後継は栄えあるMozcです。
では早速導入手順を。
まずは

$ sudo yaourt -S mozc

にてMozcを入れましょう。コンパイルやらで割と待たされます。

えーと、これがですね、
原因はよく分からないのですが、よくコケたりするようです。対処方法としては、↑のyaourtをするといつの間にかインストールできるという謎の技があります…。

無事インストールできたら ~/.xinitrc を編集してibusを起動するようにしましょう。
ウィンドウマネージャの起動よりも前に (もしかしたら後ろでもいいかも)

export GTK_IM_MODULE="ibus"
export QT_IM_MODULE="ibus"
export XMODIFIERS=@im=ibus
ibus-daemon --xim -d &

と、入れます。
自分の場合、もともとibusではなくscimを使っていたので、その起動と環境変数設定をしている行は削除しました。
で、再ログイン。
続いてibusでMozcを使えるようにします。

$ ibus-setup

として、後はGUIでの設定をしました。
「インプットメソッド」タブの「インプットメソッドの選択」から「日本語」、「Mozc」と選択します。
もしここで「日本語」なり「Mozc」なりが出てこないようなら、最初のyaourtでibus-mozcがインストールされていない可能性があるので疑ってかかった方がよいでしょう (その場合は再びyaourtです)。
これで基本的には完了です。
ただ、Ctrl + Spaceがデフォルトでibusの入力メソッド切換に割り当てられているので、ibus-setupのGUIからこれを削除し、Ctrl + \ 等を割り当てておいた方がemacsユーザとしては幸せです。