古いPCにDebianを入れた記録(自分用メモ)

PCが一台余ったのでDebianを入れることにした.いままではLinuxといえばUbuntuしか使ったことがないのだけど,岡部さん(@master_q)にプッシュされたという理由で今回はDebianを入れてみた.

■インストール用isoファイルのダウンロード
余ったPCには今まで64ビットWindows 10 が入っていたので,アーキテクチャは「amd64」となる.
このページから firmware-9.5.0-amd64-DVD-1.iso をダウンロードする.(このページに限らず,大きなサイズのファイルをダウンロードするときには Free Download Manager のようなものを使うことは大事だ.このようなツールを使うと途中でDLに失敗しても再開できる).

■isoファイルの書き出し.
ダウンロードしたisoファイルをWin32Disk ImagerでUSBメモリに書き出す.

■古いPCのインストール前準備
十年ぐらい前からのPCでは起動時にF2を押そうがF8を押そうがすぐにWindowsが立ち上がってしまう.UEFI画面を出す方法などはPCによって少しずつ違う.各自調べてほしい.

■Debianのインストール
適当に終わらせた.

■stack のインストール
Debianのaptで入るstackはバージョン1.xで,これでは stack upgrade もできない.
仕方ないのでcurl経由で無理やり最新版stackを入れた:

$ su
パスワード:
# apt install curl
# curl -sSl https://get.haskellstack.org/ | sh -s - -f
# stack --version
Version 1.9.1, Git revision ....

参考にしたページ
Debian GNU/Linux インストールガイド

4.3. USB メモリでの起動用ファイルの準備

本気で Haskell したい人向けの Stack チュートリアル

■謝辞 この記事を書くにあたり,岡部さん(@master_q)にはいろいろお世話になりました.

広告

(a)WSLをCドライブ以外の場所に置き,(b)homeも別の場所に置いて,(c)chmodも使えるようにする方法.(自分用メモ)

Windows 再インストールした結果としてWSL環境を作り直すことになった.せっかくなので次の(a)(b)(c)をやってみた:

(a) Cドライブ以外の場所にWSLを置き直すことにした.(Cドライブ以外の場所に置きたいのは,開発にともなってディスクの書き換えが頻繁に起こるからである).

(b) WSLのホームディレクトリをなるべく浅いところに置いた.(たとえばホームディレクトリ以下で生成したファイルなどを取り出す場合,ホームディレクトリがわかりやすい場所にあると楽だ.)

(c) chmod できるようにする.デフォルトではWSLではchmodが無視される.このことにより問題が起こる場合もあるのでここを改善する.

1. Fドライブ(でもなんでも)直下に WindowsSubsystemForLinux と WSLHOME というフォルダを作っておく.WindowsSubsystemForLinux にWSLが置かれる予定である.WSLHOMEが将来WSLのホームディレクトリになる.

2. WSLを入れる準備を行う.Power Shell を管理者権限で開き,次のように入力する:

PS C:\Users\Henrik> Enable-WindowsOptionalFeature -Online -FeatureName Microsoft-Windows-Subsystem-Linux

再起動を要求されるのでそれに従う.

3. Microsoft Storeを開き,linux で検索すると色々候補がでる.ここでは Ubuntu 18.04LTS を選んだ前提で話を進める.Ubuntu@WSL を初回起動し username/password を入れておく.以下では username = konrad とする.その後 exit して Ubuntu を終了する.

4. Power Shell を管理者として実行する.(しばらくPower Shell での作業が続く).
まずchocolatelyを入れる:

PS C:\Users\Henrik> Set-ExecutionPolicy Bypass -Scope Process -Force; iex ((New-Object System.Net.WebClient).DownloadString('https://chocolatey.org/install.ps1'))

次にlxrunofflineを入れる:

PS C:\Users\Henrik> choco install lxrunoffline

質問されたら y で答えてインストールを完了し exit する.

5. 再び Power Shell を管理者権限で起動する
念のためユーザ名を確認しておく:

PS C:\Users\Henrik> whoami
desktop\henrik

すなわちユーザ名は henrik であることが確認できた.(この「henrik」の箇所は各自読み替えてほしい).次にFドライブ直下のWindowsSubsystemForLinux フォルダに書き込み権限を与える:

PS C:\Users\Henrik> icacls F:\WindowsSubsystemForLinux /grant "henrik:(OI)(CI)(F)"
処理ファイル: F:\WindowsSubsystemForLinux
1 個のファイルが正常に処理されました。0 個のファイルを処理できませんでした
PS C:\Windows\system32>

次に

PS C:\Users\Henrik> lxrunoffline move -n Ubuntu-18.04 -d f:\WindowsSubsystemForLinux

する.確かに移動ができたことを確認しておく:

PS C:\Windows\system32> lxrunoffline get-dir -n Ubuntu-18.04
f:\WindowsSubsystemForLinux

以上でWSLがFドライブに置かれるようになった.

6. homeの移動.Ubuntu@WSL から

$ cd ~
$ cp -p .* /mnt/f/WSLHOME/

のようにして、「.bash_logout」、「.bashrc」、「.profile」などをなるべくそのまま(-p オプション)コピーしておく.

7. Ubuntu@WSL から
$ sudo vi /etc/passwd
して最後の方の行

konrad:x:1000:1000:"",,,:/home/konrad:/bin/bash

konrad:x:1000:1000:"",,,:/mnt/f/WSLHOME:/bin/bash

と変更し,:wqする.$ exitして一度WSLを終了する.

8. ふたたびWSLを起動して Ubuntu@WSL で

konrad@DESKTOP:~$ cd;pwd
/mnt/f/WSLHOME

となっていればよい.

9. chmod 対応.まず,/etc/wsl.conf というファイルを必要ならば作る:
$sudo touch /etc/wsl.conf
$sudo vim /etc/wsl.confのようにして編集する.
(case1)もし空ファイルだったら 

[automount]
options = "metadata"

のように書いて保存する.
(case2)もしすでに

[automount]
options = "foo"

という行があったら

[automount]
options = "metadata, foo"

のように修正し,保存する.

10. その他(git の設定)
改行コードを変更しないようにする.
$ git config --global core.autocrlf input

参考にした記事:
Can I move the linux subsystem to a different drive?
Bash on Windowsのホームディレクトリ変更
WSLからマウントしたWindowsのドライブでchmodしたい

32ビット?64ビット?(自分用メモ)

■gccが32ビットか64ビットか:
gcc -v の出力の Target: のところを見る.

32ビットの場合 Target: mingw32
64ビットの場合 Target: x86_64-pc-msys

などのようになる.システムの細かな差異によって文字列は少しずつ違うが,64ビットの場合 x86_64 が部分文字列としてしばしば含まれる.

■ghcが32ビットか64ビットか:
次のようなファイルを作る:

main = print ()

そして

$ ghc --make foo.hs
[1 of 1] Compiling Main             ( foo.hs, foo.o )
Linking foo.exe ...

$ file foo.exe

32ビットの場合には
PE32 executable (console) Intel 80386, for MS Windows

64ビットの場合には 
PE32+ executable (console) x86-64, for MS Windows

のようになる.

■おまけ:
自分がどの gcc を使ってるのかわからなくなった場合などは
which -a gcc
すればよい.使い分けをしたい場合は適宜 .bashrc に alias を張ればよさそう.

VMware Tools の手動アップグレード(自分用メモ)

ヘルプページには初回用の操作も書いてあって説明が分岐して読むのが疲れるので、手動アップグレードの手続きを自分用にメモしておく。

$ sudo su
[sudo] uname のパスワード:
# mount /dev/cdrom /mnt/cdrom
# cd /tmp
# rm -rf vmware-tools-distrib
# ls /mnt/cdrom

VMwareTools-xxx-yyy.tar.gz が見えてるはず

# tar zxpf /mnt/cdrom/VMwareTools-x.x.x-yyyy.tar.gz
# cd vmware-tools-distrib
# ./vmware-install.pl

質問されたら全部Enterで返事しておく。

(自分用メモ)omake -P が停止するトラブル(fam)とその解決

■短気な人のためのまとめ■
いつもは動いていたomake -P が「om_notify_open」とか言い出してコケたら fam が止まってることを疑って、 $sudo service fam start してみよ.

※そもそも fam が入っていなかった人は記事末尾のインストール法を見てください.

■症状■

omake -P& してたら

*** omake error:
Failure: om_notify_open: (null)

[2]+ 終了 123 omake -P

というメッセージが出て、omake が止まってしまった。 omake -P をもう一度走らせてみても、同じメッセージを吐いて omake が終了してしまう。 P オプションを付けずに omake を動かすぶんには何も支障はなかった。

■原因■
om_notify_open でググると、どうやら fam が止まってしまったらしい。

■そもそも fam is what■
fam とは file alternation monitor で、ファイルをリアルタイムで監視してくれているデーモン。 omake が P オプションで動作するときのリアルタイムファイル監視は、このデーモンが提供している。

■対策■
fam が止まってるらしいので、fam を再起動すればよい。

$ sudo service fam start

無事に omake -P も動くようになった。

■そもそもなぜ fam が止まったのか(未解決)■
omake が死ぬ直前に、omake -P が監視しているディレクトリで2000個近くのファイルを一度に rm した。関係あるかもしれないし、ないかもしれない。

■そもそも本当に fam が止まっていたのか■
$ ps -x | grep "fam"
してもっとちゃんと確認すればよかったと思いました(小学生並みの感想)。

■やらないほうがいいかもしれないこと■
サービスの名前から locate して init.d あたりにあるやつを指定して $ sudo hogehoge start みたいなことをすると良くないかもしれないそうです。

■ fam が入ってなかった人はインストールしよう■
MSYS:$ sudo apt-get install fam
Linux: $ sudo apt-get install gamin

更新情報
2016/02/04 投稿
2018/11/15 Linuxへのインストール情報を追加

(自分用メモ)sort して uniq しても同じ行が残る問題とその解決

■症状■
記事タイトルの通り、sort して uniq したのにエディタで見ると同じ行が並んで残ってしまう。

■原因■
改行コードだけで異なる行が入力テキストに含まれていた。

■解決方法■
$ sed ‘s/\r//’ input.txt | sort -u | uniq > input-u.txt

■参考にしたページ■
http://stackoverflow.com/questions/15493774/sort-filename-uniq-does-not-work-on-large-files

treeとかいうぐう有能なコマンドwwwww

ディレクトリの構成をアスキーアートで示したい場合があります。
たとえば

A
├── b.txt
├── c.txt
└── D
    ├── e.txt
    ├── f.txt
    ├── G
    └── H

みたいな感じに。これを作ってくれるコマンドが tree です。(このコマンドを知らなくて、今までは手でちまちま書いてました。)
Ubuntuの人は

$ sudo apt-get install tree

Windows+MSYS2 の人は

$ pacman -S tree

linuxからの印刷(自分用メモ)

都合によりメインのデスクトップマシンにUbuntuを入れて使っている。プリンタを操作する lp コマンドを使うようになったがオプションを覚えるのが辛いので、よく使うコマンドをまとめて ~/.bashrc に次のように書いておくことにした:

lp2(){
  for x in $@
  do
  if test -f $x
  then 
  lp $x -o sides=two-sided-long-edge
  fi
  done
}

pptlp(){
  for x in $@
  do
  if test -f $x
  then 
  lp $x -o sides=two-sided-long-edge -o number-up=2
  fi
  done
}

lp2 は両面印刷に、pptlp はパワポ資料から作ったPDFを印刷するために使っている。


$ lp2 foo.pdf bar.pdf baz.pdf

のように使う。

OMakeを使った(簡易)継続的インテグレーション

※自分用のメモです。色々説明していません。Windows+MSYSが前提。
参考にした記事:たぶんプログラミングとかについて書いていくブログ/OMakeの使い方復習

■目標:foo.py を保存する毎に、自動的に pylint にかけたい。(矢印キーすら打ちたくない)。

■主要なツール:OMake

■例示のための前提となるディレクトリ構成
dev ┐
├ foo.py
└ bar.py

■OMake 関係のファイルを作る

$ pwd
dev
$ ls
bar.py   foo.py
$ omake --install
*** omake: creating OMakeroot
*** omake: creating OMakefile
*** omake: project files OMakefile and OMakeroot have been installed
*** omake: you should edit these files before continuing
$ ls
OMakefile   OMakeroot   bar.py   foo.py

■OMakefileを編集する
以下の行を適当なところに書き加える:

PYLINT = pylint.exe
PATH += C:\Python278-32bit\Scripts\

foo_pylint : foo.py
    $(PYLINT) -E foo.py

■(ゴール):OMakeで foo.py に対して継続的に pylint をかける

$ pwd
dev
$ omake -P foo_pylint

これで、foo.py をエディタ上で保存するたびに pylint -E がかかるようになります。

■追記: Ctrl+C で中断できる(あたりまえ)。

■(重要) fam が入ってない人は Pオプションがうまく動きません。インストールしましょう■
MSYS:$ sudo apt-get install fam
Linux:$ sudo apt-get install gamin

更新
2015/02/15:投稿
2018/11/15:インストール情報を更新

ライブラリ

僕はライブラリとか知りたいとあんまし思わないんですが,
なんで皆さんはライブラリとかを珍重するんでしょうか.バイト列じゃん.
わかんない.
nmとかもわかんない.
得るものが少ないとおもいます.
したがって技術系同人誌に載ってるABI(アプリケーションバイナリインタフェース)をテーマにしたラブコメというかライブラリコメディもよくわかりません.ただのバイト列です.
さらにそもそもOSはなぜライブラリを扱うのですか.
あまつさえ動的にリンクしたりするのですか.僕は賛成ですが.いや賛成なのはライブラリが好きだからじゃないです.
動的にリンクすることで実行時まで何かを遅延できるのがなんとなくいいからです.
ぼくはOSとかリンカとかローダみたいなバイナリユーティリティは大好きです.
いや問題なのはOSじゃなくてライブラリです.
ライブラリが見えていてもかまいませんが,ただのバイト列だとおもいます.
いやそうではなく,なぜC呼び出し規約で読めるようなバイト列を大事にするかということです.
僕は賛成ですが.
間違いました.
もういいです.