Ubuntu に Vagrant をインストール

Ubuntu 16.04 上で Vagrant を動かしたメモ.よくわからないエラーが出てハマった.

VirtualBox のインストール

最新版の deb をダウンロードしてきて,インストール.

Oracle VM VirtualBox - Downloads | Oracle Technology Network | Oracle

Vagrant のインストール

最新版の deb をダウンロードしてきて,インストール.

Vagrant by HashiCorp

仮想環境の作成

今回はとりあえず hashicorp/precise64 という公式の box を使ってみる.

% vagrant box add hashicorp/precise64

途中でプロバイダを聞かれるので,ここでは 2 (virtualbox) を選択.box がダウンロードされるまで数分間待つ.

次のコマンドで,ちゃんと box が追加できたか確かめる.

% vagrant box list
hashicorp/precise64 (virtualbox, 1.1.0)

そしたら,ディレクトリを作って,仮想環境を作成する.

% mkdir box1
% cd box1
% vagrant init hashicorp/precise64

そうすると Vagrantfile というファイルができるので,それをいじるといろんな設定ができるらしい.

仮想環境の立ち上げ

仮想環境を立ち上げてみる.

% vagrant up
VirtualBox is complaining that the kernel module is not loaded. Please
run `VBoxManage --version` or open the VirtualBox GUI to see the error
message which should contain instructions on how to fix this error.

エラー発生.エラーメッセージにしたがって,VBoxManage --version を叩いてみる.

% VBoxManage --version
WARNING: The vboxdrv kernel module is not loaded. Either there is no module
         available for the current kernel (4.4.0-112-generic) or it failed to
         load. Please recompile the kernel module and install it by

           sudo /sbin/vboxconfig

         You will not be able to start VMs until this problem is fixed.
5.1.26r117224

今度は /sbin/vboxconfig を叩いてみる.

% sudo /sbin/vboxconfig
vboxdrv.sh: Stopping VirtualBox services.
vboxdrv.sh: Building VirtualBox kernel modules.
vboxdrv.sh: Starting VirtualBox services.
vboxdrv.sh: Building VirtualBox kernel modules.
vboxdrv.sh: failed: modprobe vboxdrv failed. Please use 'dmesg' to find out why.

どうも一筋縄では解決できなさそう.調べたら次のページに解決策が載っていた.

askubuntu.com

このページの内容を全部やって vagrant up したら,今度は別のエラーが出るように.

% vagrant up 
[...]
There was an error while executing `VBoxManage`, a CLI used by Vagrant
for controlling VirtualBox. The command and stderr is shown below.

Command: ["startvm", "8b358478-0e96-4b23-90bf-ca7a63c05053", "--type", "headless"]

Stderr: VBoxManage: error: VT-x is disabled in the BIOS for all CPU modes (VERR_VMX_MSR_ALL_VMX_DISABLED)
VBoxManage: error: Details: code NS_ERROR_FAILURE (0x80004005), component ConsoleWrap, interface IConsole

エラーメッセージの啓示にしたがって BIOS の設定をいじった.これで,無事に立ち上がった.

% vagrant up
[...]

あとは ssh で接続するだけ.

% vagrant ssh
Welcome to Ubuntu 12.04 LTS (GNU/Linux 3.2.0-23-generic x86_64)

 * Documentation:  https://help.ubuntu.com/
New release '14.04.5 LTS' available.
Run 'do-release-upgrade' to upgrade to it.

Welcome to your Vagrant-built virtual machine.
Last login: Sat Feb  3 05:42:45 2018 from x.x.x.x

Coq のカリー・ハワード同型周辺について

Coq のカリー・ハワード同型周辺についてメモ.

qiita.com

OCJP Silver SE 8

とりあえず無事合格してたらしい。

Silver 試験は、問題集を 1 冊ちゃんとやっとけば受かるみたい。試験時間にも余裕あり。Gold 試験はそうもいかないらしいけど...。

問題集をやってて「なんか設問がイマイチだなあ。この問題集はずれか?」なんて思ってたら、試験にそれと全く一緒の設問が出てびっくり。心の中で問題集(著者)に謝りました。

OCJP Silver 試験のお勉強

"Oracle Certified Java Programmer, Silver SE 8" という資格の勉強をしてるけど、Java の言語仕様がごちゃごちゃしていて悶絶している。

以下、個人的に疑問符がついたところ 2 つ。

可変長引数の書き方

メソッドの定義でコンパイルエラーとなるのは次のうちどれか、という問題。

  1. void foo(int[] args) { }
  2. void foo(int args[]) { }
  3. void foo(int... args) { }
  4. void foo(int args...) { }

答えはd の foo(int args...) { } なんだけど、b がコンパイルできて d がコンパイルエラーなのは自然じゃないなという感想。 まあ、b は C/C++ の名残で許容されているだけなので、そういう背景を知ったうえで、広い心で Java の言語仕様を受け入れようと思う。

関数式の引数

次のようなプログラムをコンパイルしたらどうなるかという問題。

import java.util.function.Function;

public class Main {
    public static void main(String[] args) {
        int n;

        Function<Integer, Integer>
            succ = n -> n + 1;  // コンパイルエラー
        System.out.println(succ.apply(0));
    }
}

このプログラムはコンパイルできない。 関数式の引数は、まわりのスコープのローカル変数とダブってはいけないということなので。 コンパイラは、"Lambda expression's parameter n cannot redeclare another local variable defined in an enclosing scope." というエラーを吐く。

Java の関数式まわりの仕様は、プログラムを組むときに気をつけなければならないことが結構多い。 この辺りの仕様は、もうちょっとなんとかしてほしかったかも。

Haskell Advent Calendar に投稿した

今年は Haskell Advent Calendar 2017 (その1) に投稿してみた。

次の論文で提案された、スーパーモナドという概念を解説するという内容。

  • J. Bracker and H. Nilsson. Supermonads: one notion to bind them all. In Proceedings of the 9th International Symposium on Haskell, pages 258-269, 2016.

用語の日本語訳は適当に充ててみたけど、自然な訳になってるか一抹の不安が。

一応、指標付きモナド"What I Wish I Knew When Learning Haskell" の日本語訳 から。 他は本当に適当。

スーパーモナドは "超モナド" と訳したほうが面白かったかな?