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でも好きなのを。とりあえず割愛します。
はるかぜちゃんブックマークレット
ネタです。
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ユーザとしては幸せです。