NixOS

以前読んだヒラノ教授本を何冊か借りてきた。パワハラ、アカハラの実態が実名でバンバン 出て来る。そこまで言って委員会状態の本だ。なかなか面白い。

『工学部ヒラノ教授のアメリカ武者修行』なんてのに、アメリカのビジネススクールの話が 出てくる。MBAと言う金儲けの資格を取らせる大学の事ね。白熱教室で有名になった、ハーバード大学なんかが、その最たる所らしい。

著者のうがった見方では、あくどい金の亡者量産で、引け目を感じた大学が、正義を振り回して、世間を煙に巻く作戦に出たのではないかと。激同意。

金儲けの方法を教える学校なんで、いかにコストを切り詰めるかってのも重要なテーマになる。 その分野の有名な問題に、配送問題があるとか。大学の教授が書いた教科書には必ずこの問題が 取り上げてあるとか。(教科書を書いた教授は、毎年一定数売れるので、小遣いになる)

全国各地にビール工場があります。消費地は、全国津々浦々。輸送コストを減らすには、なるべく生産工場と消費地が近い方がよい。

とはいえ、キリンの生麦工場とサントリーの多摩川プラントで、東京の胃袋を満たす事は出来ないので、二番目もしくは三番目に近い所から供給する事になる。

生産工場が50か所、消費地が500か所ぐらいなら、力技でも解けるだろうけど、これが増えた場合、答えを出すのが非常に難しくなる。(同種なものには、サラリーマンの巡回問題が有る)

で、ヒラノ教授らが、一生懸命に研究して、単体法とかいう解決方法を提案する訳。でも、 大前提は、需要より供給が上回っているってのがある。十分に供給出来るから、後はどこから 持ってくれば良いか考えるだけ。

じゃ、供給より需要が多い場合の配送問題はどうするか? そんなの答え無しです、って済ませるわけにいかないのが、ビジネスの掟。

アメリカのビジネス・スクールでは、この問題を逆配送に置き換えて解決するそうな。すなわち、消費地から供給地へ配送するって事にして、問題を解く。答えが出たら、配送方向を逆にする。 スマートな方法だけど、これだと絶対にビールが飲めないへき地が出て来る。 アメリカでは、これでよしとするそうな。

これを教えたヒラノ教授は、どうも腑におちないので、この弱者切り捨てをどう思うって宿題を 出したそうな。

金の亡者予備軍の60%がこの方法を支持。他には、超過勤務で生産量を増やす、消費カットをお願いする、値上げする、ビールをアウトソーシング(クアーズのビールにバトワイザーのラベルを貼る)などの回答が有ったそうな。

日本の大学でこの宿題を出した所、第一にすべき事は、頑張って生産能力を上げるって事だった そうな。弱者切り捨てを良しと考える米国、機会平等を願う日本。国民性なんですかね。

ああ、長い枕になったわい。今読んでるH本に、こういうOR関係の例題は出てくるのかな? お茶大の先生が書いたocaml本には、地下鉄問題って事で取り上げてあるけどね。

輸送問題

ナップサック問題をHaskellで解く

Haskellでダイクストラ法

Install NixOS

先週見つけておいた、関数型パッケージマネージャが動く、NixOSとやらを入れてみた。 入れたのはvBOXの方。だって、インストールの途中でconfigファイルを編集させられるんだ けど、VMWAREのコンソール画面が拡大出来ないので、年寄りには無理と言う情けない理由です。

NixOSのインストール

詳細は上記を参照すると良い。

立ち上げると、いきなりrootでloginされる。 まずは、fdiskして領域を作れ、それをmkfs.ext4して整えろ。続いて、/mntにマウントしとけ。 それで準備完了。オイラーが作ったのは、32Gの / だけって言う、手抜きです。

そこまできたら、

nixos-generate-config --root /mnt

して、configファイルを発生させる。後は、それを編集してくれ。

  boot.loader.grub.device = "/dev/sda"; # or "nodev" for efi only

最初、コメントが付いているので、ここだけは外しておけ。そうしないと、どこに ローダーを入れるか不明って言われて、インストールでこけるぞ。

終わったら

nixos-install

ミニマムインストールなんで、10分ぐらいで完了。最後にrootのパスワードを聞かれるので 答えておしまい。インストール時には、変な事をせず、さっさと終了させるのがこつかな。

[sakae@nixos:~]$ df
Filesystem     1K-blocks    Used Available Use% Mounted on
devtmpfs          202636       0    202636   0% /dev
tmpfs            2026324       0   2026324   0% /dev/shm
tmpfs            1013164    3376   1009788   1% /run
tmpfs            2026320     360   2025960   1% /run/wrappers
/dev/sda1       32895760 1154276  30047432   4% /
tmpfs            2026320       0   2026320   0% /sys/fs/cgroup
tmpfs             405264       0    405264   0% /run/user/1000

初期インストール後の結果。1Gをちょいと超える状況ね。

再起動して、必要なパッケージを入れていく。どんなパッケージが有るかカタログを 取り寄せておけば、中元ののカタログギフトみたいに好きに出来るぞ。

Chapter 6. Package Management

に、細かい事が書いてある。

[sakae@nixos:~]$ nix-env -qaP '*' | tee CATLOG
[sakae@nixos:~]$ wc CATLOG
  12405   24810 1046998 CATLOG

これで、カタログを取り寄せ。

[root@nixos:~]# nix-env -iA nixos.emacs25-nox

関数型の禁を破り、その場しのぎで、インストール。

nix-build              nix-install-package    nixos-option
nix-channel            nix-instantiate        nixos-rebuild
nix-collect-garbage    nix-log2xml            nixos-version
nix-copy-closure       nixos-build-vms        nix-prefetch-url
nix-daemon             nixos-container        nix-pull
nix-env                nixos-generate-config  nix-push
nix-generate-patches   nixos-help             nix-shell
nix-hash               nixos-install          nix-store

nixで始まるこのOS専用コマンドにどんなのが有るか調べてみたら、ガベコレなんののが出てた。ああ、ガベコレって和製英語か。正しくは、collect-gargageなんだな。

それはいいんだけど、その辺の使い方をまとめたhelpコマンドも有ったので、何気に叩いて みたら、見たいならブラウザーを入れろって言われたぞ。ブラウザーってw3m良いのでしょうか?

カタログを見たら、w3mがリストに載ってた。どうもmanの代わりになりそうなので、その場 しのぎのインストールは止めて、きちんとインストールしてみる。/etc/nixos/configuration.nixという設定ファイルに、パッケージ名を書くんだな。

   environment.systemPackages = with pkgs; [
       w3m-nox
   ];

頭に、nixosってのを付けるとエラーではじかれる。

nixos-rebuild switch

設定を有効にする為、上記のコマンドを叩く。これで、パッケージがDLされて、所定の場所に 収まって、普通に使えるようになる。

どうなってるの?

後は趣味で必要そうなのを root権限で入れた。どんなのが入ってるか確認するには

[sakae@nixos:~]$ sudo nix-env -q
[sudo] password for sakae:
emacs-nox-25.1
mlocate-0.26
nvi-1.79
sudo-1.8.20p1
tmux-2.3

root権限で入れたものは、平民もそのまま利用出来る。

[sakae@nixos:~]$ ps awx | grep openssh
  514 ?        Ss     0:00 /nix/store/vmisgqfbqywgsw9php70bbx90czr398i-openssh-7.4p1/bin/sshd -f /nix/store/9qv6c0ypqqh78ml3hfya111k7bmjd73v-sshd_config
  880 ?        Ss     0:00 /nix/store/vmisgqfbqywgsw9php70bbx90czr398i-openssh-7.4p1/bin/ssh-agent -a /run/user/1000/ssh-agent
 1124 pts/1    S+     0:00 grep openssh

重要なコマンドには署名が施されて、特別な場所に鎮座してるのかな? w3mはシステム扱いに したけど、何処に入ったかな?

[sakae@nixos:~]$ which w3m
/run/current-system/sw/bin/w3m

[sakae@nixos:~]$ ls -l `which w3m`
lrwxrwxrwx 1 root root 73 Jan  1  1970 /run/current-system/sw/bin/w3m -> /nix/store/nkgnwkd5yrhgndxf70lrk68vpcigyljp-w3m-0.5.3+git20161120/bin/w3m

珍しい場所だな。それじゃ、アドホックな方法で入れたやつは?

[sakae@nixos:~]$ which emacs
/nix/var/nix/profiles/default/bin/emacs

[sakae@nixos:~]$ ls -l `which emacs`
lrwxrwxrwx 1 root root 64 Jan  1  1970 /nix/var/nix/profiles/default/bin/emacs -> /nix/store/05555inr2h6x6psrcwr68z0y7qf7407l-emacs-25.1/bin/emacs

普通のコマンドも、普段見慣れないような場所に置いてある。しかもそいつの実態は、やはり 署名されてて、倉庫とおぼしき場所に置いてあるなあ。

[sakae@nixos:~]$ ldd `which emacs`
        linux-vdso.so.1 (0x00007ffd05b7b000)
        librt.so.1 => /nix/store/kjwbqnh13dxh6w4pk2gb3ddmhpiaihqg-glibc-2.25/lib
/librt.so.1 (0x00007f445d2df000)
        libdbus-1.so.3 => /nix/store/0bs7m91wfkx6a90y1py1x5fsxz1h7wcj-dbus-1.10.
16-lib/lib/libdbus-1.so.3 (0x00007f445d08f000)
 :

中身のライブラリィーまで、書名付きで倉庫にある。徹底してるな。そして、=> て、記号が 一瞬Haskellで使われてる記号に見えてきたぞ。もうHaskell病にかかった証拠ですかね。

後、気になるのは、

[sakae@nixos:~]$ echo $PATH
/home/sakae/bin
:/run/wrappers/bin
:/run/wrappers/bin
:/home/sakae/.nix-profile/bin
:/home/sakae/.nix-profile/sbin
:/home/sakae/.nix-profile/lib/kde4/libexec
:/nix/var/nix/profiles/default/bin
:/nix/var/nix/profiles/default/sbin
:/nix/var/nix/profiles/default/lib/kde4/libexec
:/run/current-system/sw/bin
:/run/current-system/sw/sbin
:/run/current-system/sw/lib/kde4/libexec

思わず、Haskell風に、PATHを整理しちゃったけど、本当にびっくりするぐらい変な所が 列挙されてますなあ。これが関数型パッケージマネージャの正体?

[sakae@nixos:~]$ grep hugs CATLOG
nixos.hugs                                                      hugs98-200609

[sakae@nixos:~]$ nix-env -iA nixos.hugs
installing ‘hugs98-200609’
these paths will be fetched (0.70 MiB download, 4.53 MiB unpacked):
  /nix/store/ahj84k77ynvcjplrvi9c0ca30pfixd9f-hugs98-200609
fetching path ‘/nix/store/ahj84k77ynvcjplrvi9c0ca30pfixd9f-hugs98-200609’...

*** Downloading ‘https://cache.nixos.org/nar/1sckvb73cx5jnsxxdn34y2618i0s1i501vprlx28g9by3i23i5lf.nar.xz’ (signed by ‘cache.nixos.org-1’) to ‘/nix/store/ahj84k77ynvcjplrvi9c0ca30pfixd9f-hugs98-200609’...
  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
100  714k  100  714k    0     0   361k      0  0:00:01  0:00:01 --:--:--  361k

building path(s) ‘/nix/store/5vaxm5rfjwdrd251jcank82x5kasqf6m-user-environment’
created 3 symlinks in user environment

[sakae@nixos:~]$ ls -l `which hugs`
-r-xr-xr-x 1 root root 682104 Jan  1  1970 /home/sakae/.nix-profile/bin/hugs

ユーザーのエリアにもインストール出来るとな。そしてインストール日時はunixが日付を刻み 始めた時ってのが、意味深だなあ。

[sakae@nixos:~]$ locate Prelude.hs
/nix/store/ahj84k77ynvcjplrvi9c0ca30pfixd9f-hugs98-200609/lib/hugs/oldlib/EdisonPrelude.hs
/nix/store/ahj84k77ynvcjplrvi9c0ca30pfixd9f-hugs98-200609/lib/hugs/packages/base/Prelude.hs
/nix/store/ahj84k77ynvcjplrvi9c0ca30pfixd9f-hugs98-200609/lib/hugs/packages/hugsbase/Hugs/Prelude.hs

どうやら、何でも倉庫の中へ放り込む方針みたいだな。

tmpfs /tmp tmpfs rw,nosuid,nodev

RAMDISKもどきを作ろうと思って、/etc/fstabを編集しようとしたら、こやつは読み出し専用だ から、そんな不届きな事は許しませんと言われた。 実体を調べてみると、

[root@nixos:~]# ls -l /etc/fstab
lrwxrwxrwx 1 root root 17 Aug 12 14:44 /etc/fstab -> /etc/static/fstab

[root@nixos:~]# ls -l /etc/static/fstab
lrwxrwxrwx 1 root root 53 Jan  1  1970 /etc/static/fstab -> /nix/store/z4q4smyp69hq44cpbnpd3lflf5gd35qm-etc-fstab

[root@nixos:~]# ls -l /nix/store/z4q4smyp69hq44cpbnpd3lflf5gd35qm-etc-fstab
-r--r--r-- 1 root root 269 Jan  1  1970 /nix/store/z4q4smyp69hq44cpbnpd3lflf5gd35qm-etc-fstab

なかなか、リンクが好きな人達だ。リンクと言えば、LispとかHaskellのリストを思い出すな。 開発者達は、リンク大好き人間なんだな。と、いう冗談は兎も角、元ネタを書き込み可に しようとすると、

[root@nixos:~]# chmod 644 /nix/store/z4q4smyp69hq44cpbnpd3lflf5gd35qm-etc-fstab
chmod: changing permissions of '/nix/store/z4q4smyp69hq44cpbnpd3lflf5gd35qm-etc-fstab': Read-only file system

あろう事か Read-only になってました。悔し紛れに

[root@nixos:~]# mount | grep /nix/store
/dev/sda1 on /nix/store type ext4 (ro,relatime,data=ordered)

mount情報をみると、やはりロックがかかってましたよ。暴走してもデータは保護するって言う 強い意志が伺えますよ。

で、ちまちまと取り扱い説明書を見ていたら、付録の A. Configuration Options に オイラーの要求を満たすぴったりなのが出てた。

boot.tmpOnTmpfs

    Whether to mount a tmpfs on /tmp during boot.

    Type: boolean

    Default: false

    Declared by:

    <nixpkgs/nixos/modules/system/boot/tmp.nix>

これをヒントに、設定ファイルに下記を書いてrebuild

  boot.tmpOnTmpfs = true;
[sakae@nixos:/tmp]$ df -t tmpfs
Filesystem     1K-blocks  Used Available Use% Mounted on
tmpfs            2026324     0   2026324   0% /dev/shm
tmpfs            1013164  3392   1009772   1% /run
tmpfs            2026320   360   2025960   1% /run/wrappers
tmpfs            2026320     0   2026320   0% /sys/fs/cgroup
tmpfs             405264     0    405264   0% /run/user/1000
tmpfs            2026320    64   2026256   1% /tmp

これにて、目的達成!

改めて、/etc/fstabに /tmpのマウント情報が反映されてるか調べてみたら、否かでした。 おまけに、このファイルは、自動作成されてるんで、編集不可って但し書きされてた。 なんか、裏でこそこそやられているみたいで、プチ気持ち悪いな。

久々の init.el

emacsが事の他、さっと立ち上がってくるので、そのスピードを削がないように、余計な ものを取り除いて、さっぱり、すっきりさせた。

auto-save-buffers-enhancedは、頻繁にsaveしてくれるというもの。 使うか使いまいか、迷っている。また、パッケージのリフレッシュを有効にしておくと 起動スピードがガタ落ちになるんで、殺してる。

(require 'package)
(add-to-list
  'package-archives
  '("melpa" . "http://melpa.org/packages/") t)
(package-initialize)
;;(package-refresh-contents)

;(require 'auto-save-buffers-enhanced)
;(auto-save-buffers-enhanced t)
(setq auto-save-default nil)
(setq make-backup-files nil)

(menu-bar-mode -1)
(column-number-mode t)

(global-set-key   "\M-," 'pop-tag-mark)       ;; replace M-*
(define-key mode-specific-map "v" 'view-mode) ;; C-c v to toggle view-mode

(defun other-window-or-split ()
  (interactive)
  (if (one-window-p)
    (progn
     (split-window-vertically)
     (shrink-window 9))
    (progn
     (other-window 1)
     (balance-windows)
     (enlarge-window 9))))
(global-set-key (kbd "C-z") 'other-window-or-split)

これに、色々追加してくんだろうね。

Brainfuck ando Haskell

Brainfuck

Haskellで書くBrainfuckインタープリタ

Haskell で brainfuck

HaskellでBrainfuck