UNIX system resources。 Wikpedia によれば以前は UNIX source repository または UNIX system resources からきていたらしい。
UNIX 用語 由来/読み方辞書 version 1.6 (Feb 13 1995)には
"USeR" の略。と、誰もが(?)思っていたが、米国のユーザグループ UniForum が発行している機関誌 CommUNIXations(May/ June 1989) からの転載ということで、 JUS の /etc/wall No.8/1990/May に載っていた「UNIX Trivia -- UNIX に関するクイズ100問」によると、 "User Services and Routines" の略だそうである。
と書かれているが、検索しても日本語以外のWebページでは見あたらない。
また久しぶりに LaTeX2e でドキュメントを作成したくなった。 今まで Linux でも Windows でもコンパイルが通るように ISO-2022-JP で書いていたのだが差分も取りにくいし、そろそろ UTF-8 にしたい。 調べたら Linux なら ptexlive で UTF-8 対応の pLaTeX2e が使える模様。Windows については W32TeX が対応済みのようだ。
Debian GNU/Linux では ptexlive がないので、野良インストールした。
~/tmp/ptexlive の下でビルドして /usr/local/texlive/p2009 の下にインストール。
以下手順メモ:
手元の環境では以下を追加インストールした。
~/tmp/ptexlive を作りファイルをダウンロード。 ptexlive アーカイブを展開、TeX Live の方は ISO イメージを展開してマウントする。
cd mkdir -p tmp/ptexlive cd tmp/ptexlive wget http://tutimura.ath.cx/~nob/tex/ptexlive/ptexlive-20100711.tar.gz wget http://www.t.ring.gr.jp/pub/text/CTAN/systems/texlive/Images/texlive2009-20091107.iso.xz tar zxvf ptexlive-20100711.tar.gz 7za e texlive2009-20091107.iso.xz mkdir texlive mount -t iso9660 -o loop texlive2009-20091107.iso $PWD/texlive
(2010年9月18日追記: ここで TeX live をインストールする)
次に ptexlive を展開してディレクトリに移動して ptexlive.cfg を用意し編集する。
cd ptexlive-20100711 cp ptexlive.sample ../ptexlive.cfg emacs ../ptexlive.cfg
変更したところは以下。
そしてビルド。なお既存の ~/.texmf-var があると正しくないビルドができる可能性があると警告されるので移動しておく。
mv ~/.texmf-var ~/.texmf-var-tmp make make otf
最後にテストがこけるがこれは無視してもよいらしい。
そしてインストール。
su make install exit
以上で完了。
環境 PATH を通す。Debian GNU/Linux の TeX 関連パッケージより優先して使うように既存の PATH の前に設定。
export PATH=/usr/local/texlive/p2009/bin/i686-pc-linux-gnu/@:$PATH
UTF-8 なサンプル pLaTeX2e ファイルを作成して platex、dvipdfmx が通ることを確認。
Happy TeXing!
新しい開発プロジェクトでは Git + Redmine を使おうと思う。 で例により使えるのが Red Hat Linux 8.0 サーバなので対応する Ruby やライブラリを含めてソースコードからビルドしてインストールしたのだが、ちょっとハマったのでメモ。
システムにインストールされている OpenSSL を(パッケージがなくアップデートできないので)残したまま、新しい OpenSSL をいれて使うのだが Ruby でこれを使えるようにする方法に辿りつくまで8割の時間を費した。
OpenSSL のデフォルトである /usr/local/ssl へビルドしてインストールする。
tar zxvf openssl-1.0.0b.tar.gz cd openssl-1.0.0b ./config shared make make test make intall
何も指定しないと共有ライブラリ(so)がビルド・インストールされないのが落とし穴。
後は /usr/local/redmine 以下に Redmine に必要なものを入れる。
tar jxvf ruby-1.8.7-p302.tar.bz2 cd ruby-1.8.7-p302 CFLAGS='-I /usr/local/ssl/include' \ LDFLAGS='-L /usr/local/ssl/lib -Wl,-rpath=/usr/local/ssl/lib' \ ./configure --prefix=/usr/local/redmine --enable-rpath make make install
大きな落とし穴は Ruby に含まれている ext/openssl。 OpenSSL 用の共有ライブラリが作られるのだが、いくらやってもこいつが /lib に入っている古い OpenSSL 共有ライブラリの方をリンクしてしまい /usr/local/ssl/lib の方をリンクしてくれない。
configure や make 時に LD_RUN_PATH やら -rpath を指定しても効かないし、ext/Setup で openssl を静的に指定しても駄目だし。
結局 configure.in を眺めて AC_ARG_ENABLE(rpath, ...) があるのを発見して --enable-rpath したところようやく -rpath が共有ライブラリのビルドに反映されるようになった。
30m ぐらいの深さの大きい落とし穴。
/usr/local/redmine に Ruby が入ったので必要なものを入れていく。 確実にそこの Ruby を使うようにしばらくは /usr/local/redmine/bin 以下を絶対パス指定で作業。
tar zxvf rubygems-1.3.7.tgz cd rubygems-1.3.7/ /usr/local/redmine/bin/ruby setup.rb
Redmine のデータベースは一番お手軽な SQLite を使う。これもインストール。
tar zxvf sqlite-amalgamation-3.7.3.tar.gz cd sqlite-3.7.3 ./configure --prefix=/usr/local/redmine make make install
Ruby から SQLite を使うためのライブラリをインストール。
/usr/local/redmine/bin/gem install sqlite3-ruby -- --with-sqlite3-dir=/usr/local/redmine
SQLite のありかを示す --with-sqlite3-dir を -- の次に指定するというところに気がつくのに浅い落とし穴。
Redmine のインストールの説明では Passenger を推奨しているようなので入れてみる。
/usr/local/redmine/bin/gem install passenger
OK。しかし Apache モジュールを
/usr/local/redmine/bin/passenger-install-apache2-module
でインストールしようとすると失敗。Apache の dev 系のファイルがシステムに入っていないので、それはそうだな。しかし Passenger のコマンドは寡黙ではなく何が駄目で何をすべきかきちんと表示してくれるのでわかりやすい。
この落とし穴は、横を通って回避。
Passenger のインストールで最新の Rack が一緒にインストールされるのだが、Redmine には新しすぎて後の手順でエラーで止まる。 ので、ここで 1.0.1 にダウングレードしておく。
/usr/local/redmine/bin/gem install rack -v 1.0.1
これは皆が知っている落とし穴。
ようやく Redmine のインストール。 展開するだけ。
tar zxvf redmine-1.0.3.tar.gz mkdir -p /usr/local/redmine/var/lib mv redmine-1.0.3 /usr/local/redmin/var/lib/redmine
以下 /usr/local/redmine/var/lib/redmine で作業。
cd /usr/local/redmine/var/lib/redmine
config/database.yml を作成する。SQLite を使うように設定。
production: adapter: sqlite3 database: /home/naney/var/redmine/redmine.db
データベースは定期バックアップのある自分の home 以下に。
makdir -p ~/var/redmine
config/email.yml を作成する。今回は専用の redmine@example.com を作成して、その SMTP サーバ/アカウント経由で送信するようにする。
production: delivery_method: :smtp smtp_settings: address: smtpserver.example.com port: 25 domain: redmine.example.com user_name: "redmine@example.com" password: "mypassword"
必要なファイルやらデータベースの初期化やらを行う。
/usr/local/redmine/bin/rake config/initializers/session_store.rb /usr/local/redmine/bin/rake db:migrate RAILS_ENV=production /usr/local/redmine/bin/rake redmine:load_default_data RAILS_ENV=production
最後のコマンドでは言語を選ぶプロンプトが出るので ja を指定。
Apache 経由ではなく Passenger スタンドアローンで Redmine を使ってみる。
/usr/local/redmine/bin/passenger start
失敗。途中の処理で rake が見つからないという。
PATH=/usr/local/redmine/bin:$PATH passenger start
やっぱり失敗。自動的にダウンロードした ngix のビルドに失敗しているっぽい。 落とし穴。
/usr/local/redmine/bin/ruby script/server webrick -e production
Redmine 的には 本番向けではない WEBrick は無事起動。
http://インストールしたサーバ:3000/
にブラウザにアクセス。Redmine のページが見えたよオッカサン! admin:admin でログインしてあとは Web ブラウザから設定。 Git リポジトリの連携もすんなり。
やったね。
WEBrick で使い続けるなら script/server 起動時に -d オプションを指定する(記事)。
ぼちぼち Haskell を実行してみたり。すごいH本だと ghci で対話モードでの例示が多いんだけれど、個人的にかったるい。
UNIX ならワンライナーでしょ shebang でしょ。で確認したら GHC の ghci の方じゃなくて ghc の方でワンライナーはできるのね。
ghc -e 'putStr "Hello, World!"'
それと shebang での実行は runghc を使えば OK だった。
#!/usr/bin/runghc main = putStr "Hello, World!"
みたいな感じ。
Git の contrib/diff-highlight を使って行単位ではなく文字列単位で異なる部分をハイライトしてくれるという記事を教えてもらった。
自分の設定では .gitconfig の color のところは
[color] branch = auto diff = auto grep = auto interactive = auto showbranch = auto status = auto
となっていて pager 指定は .bashrc で
if command -v lv > /dev/null; then export GIT_PAGER='lv -Ou8 -c' fi
と今している。diff-highlight*1 を PATH の通っているところにおいて、
GIT_PAGER='diff-highlight | less -R' git diff HEAD~..HEAD
とかすると文字列単位で差分が反転色で表示される。
lv だと \x1b[7m で反転させるとそれまでの色属性が落とされてしまうのか、行のそれ以降が黒白/白黒になってしまう。 lv v.4.21*2 のソースコードを軽くみたけどちょっとしっかり読まないと対応できなさそうなので、今日は諦め。
diff-highlight は Perl スクリプトなので、こちらでハイライト開始とハイライト終了時のエスケープシーケンスをいじって lv で見栄え良くなるようにするのが簡単でいいかもなあ。
*1Debian GNU/Linux だと /usr/share/doc/git/contrib/diff-highlight/diff-highlight にある
*2(Debian GNU/Linux だと v.4.51.a が入っているので、見たのはちょっと古いバージョンだった模様)
Git のトピックブランチで開発している時に、他のブランチを同時にチェックアウトしておきたくなる事がままある。
いったんテンポラリコミットを作ったり、あるいは stash したりして作業ツリーを保存してチェックアウトしなおして用事を済ませて元に戻すとかはやるのだけれど、ちょっと面倒。3番目のケースは同時にチェックアウトしたいのでこの方法だと駄目だし、4番目のケースだとしばらくそのままにしておかないのでもっと困る。
そのような時はローカルリポジトリから別ディレクトリへ clone して、そちらをサブで使ったりするんだけれど、サブの方でちょっと修正したりした際にローカル間で push/pull とかしなければならなくてこれまた面倒。
なんかいいのないかなと思ったら Git の contrib に git-new-workdir というのがあるのを昨日知った。
git-new-workdir . ../sub あるいは git new-workdir . ../sub
で作業ツリーを新しく作れる。/tmp/git/main を /tmp/git/sub に new-workdir すると sub の方の .git の中は
drwxr-xr-x 3 naney naney 4096 1月 30 00:37 . drwxr-xr-x 3 naney naney 4096 1月 30 00:37 .. -rw-r--r-- 1 naney naney 23 1月 30 00:37 HEAD lrwxrwxrwx 1 naney naney 25 1月 30 00:37 config -> /tmp/git/main/.git/config lrwxrwxrwx 1 naney naney 24 1月 30 00:37 hooks -> /tmp/git/main/.git/hooks -rw-r--r-- 1 naney naney 104 1月 30 00:37 index lrwxrwxrwx 1 naney naney 23 1月 30 00:37 info -> /tmp/git/main/.git/info drwxr-xr-x 2 naney naney 4096 1月 30 00:37 logs lrwxrwxrwx 1 naney naney 26 1月 30 00:37 objects -> /tmp/git/main/.git/objects lrwxrwxrwx 1 naney naney 30 1月 30 00:37 packed-refs -> /tmp/git/main/.git/packed-refs lrwxrwxrwx 1 naney naney 23 1月 30 00:37 refs -> /tmp/git/main/.git/refs lrwxrwxrwx 1 naney naney 26 1月 30 00:37 remotes -> /tmp/git/main/.git/remotes lrwxrwxrwx 1 naney naney 27 1月 30 00:37 rr-cache -> /tmp/git/main/.git/rr-cache lrwxrwxrwx 1 naney naney 22 1月 30 00:37 svn -> /tmp/git/main/.git/svn
のような感じで HEAD と index と logs/HEAD 以外はもとのローカルリポジトリへのシンボリックになっている。なので sub での checkout や index の Git 操作など以外は main の方へ反映されるようになっている。わざわざ push/pull しなくて良いのでこれは楽ちん。もちろん作業ツリーはそれぞれ独立しているので、例えばサブの方で Web サーバを起動しておいたり時間のかかるフルテストを走らせておくとかもできる。
ただ複数チェックアウトして作業していると、気がつくと Emacs で違うほうの作業ツリーのファイルを開いて編集していたりして「あれ? 変更したけれどなぜか反映されない……」とかやっちゃうので(実際やった)ちょっと注意が必要ではある。
git-new-workdir は contrib の中(Debian GNU/Linux sid だと /usr/share/doc/git/contrib/workdir/git-new-workdir)にあるみじかいシェルスクリプトなので適当に PATH の通ったところにコピーして実行権限を設定しておけば OK。
Git はこういうところがカワイイよね。
台風の影響で風が強く雨もたまに強く降ったりする1日。間隙をぬってコンビニ行ったり、スーパーに行ったりした以外は家にいた。
先週の会社のキーボードのに続き、自宅の ThinkPad X200 のトラックポイントのキャップも交換。手持ちの在庫無くなってきた。ソフト・リム・キャップ派じゃない人と共同購入したい。
第26回東京湾大華火祭は今年は中止。遠目ながら見ようと思っていたのでちょっと残念。
そういえば3カ月前に uim-mozc を入れて、Debian GNU/Linux sid で Mozc を使っているんだけれど /usr/lib/mozc/mozc_tool --mode=config_dialog が落ちて設定できなくて困っていた(けど放置していた)。 uim-pref-qt4 でいったん「標準の入力方式を指定」で Mozc 以外にすれば落ちなくなって設定できるとしったので、とりあえずこれで対応。ようやく空白がデフォルト(いわゆる)半角で入力できるようになってストレス解消した。
双方向ファイル同期化ツール Unison File Synchronizer、 Mac で使っているのが Unison 2.48.6 の GUI 版なのだけれど、古いせいか macOS Catalina だと「Install command-line tool」 が機能しない(/usr/bin にインストールしようとしているからかな)。
macOS 上で text UI 版がちょっと使いたい & GUI 版も新しいのにしたいなと思ってビルドとかした。
2021年01月05日時点での安定版は 2.51.3。
$ brew install unison
で text UI 版の「unison version 2.51.3 (ocaml 4.10.0)」が入る。GUI 版は入らない。
Unison 最新版のバイナリ配布が見当たらないのでビルドしてみる。 Xcode が必要。
$ xcode-select --install
で入る Command Line Tools だけだと text UI 版の Unison しかビルドできないので App Store から Xcode をインストールした。
OCaml は Homebrew ので済ます。
$ brew install ocaml
今日時点で入るのは OCaml 4.10.0 だ。次に Unison 2.51.3 をビルドする。
$ cd ~/tmp $ curl -OL https://github.com/bcpierce00/unison/archive/v2.51.3.tar.gz $ tar zxvf v2.51.3.tar.gz $ cd unison-2.51.3 $ make all
make だけだと text UI 版しかビルドされないので make all してみた。が残念 GUI 版はエラーで途中で止まった。今はうまくビルドできないのかもしれない。
諦めて make で text UI 版だけバイナリを得ることにした。 make 後
$ ./src/unison -version
で実行できることを確認。 ./src/unison を適当なところにコピーしておく(これなら brew install unison で十分だった)。
ローカルホストの Unison とリモートホストの Unison のバージョンが合っていないと同期できないのでリモートホスト側 (FreeBSD 9.1-RELEASE-p24) でも同じバージョンのものをビルドする。さくらのレンタルサーバ プレミアムで root 権限はないのでユーザー権限にて。
まずは OCaml。最近の OCaml は opam というのでインストールして使うのが流儀らしい。 opam をインストール。
$ cd ~/tmp $ mkdir bin $ curl -OL https://raw.githubusercontent.com/ocaml/opam/master/shell/install.sh $ BINDIR=$HOME/tmp/bin sh install.sh
リモートホストの環境に合ったプレビルドが無いとエラーが出て install.sh ではインストールできず。
OCaml の前に遡って opam のビルドをする。
$ cd ~/tmp $ curl -OL https://github.com/ocaml/opam/archive/2.0.7.tar.gz $ tar zxvf 2.0.7 $ cd opam-2.0.7 $ gmake cold CONFIGURE_ARGS="--prefix ~/tmp/opam" $ gmake cold-install
ビルドできた。opam を初期化する。
$ PATH=$HOME/tmp/opam/bin:$PATH $ opam init
gpatch が無いとエラーで止まった。 patch へのシンボリックリンクで gpatch を作ってイケるかなと思ったけど今度は別のエラーで止まる。うーん。 opam で OCaml をインストールするのは断念。
OCaml のドキュメントを読んだら今まで通り configure して make も普通にできるじゃない。
$ curl -OL https://github.com/ocaml/ocaml/archive/4.10.0.tar.gz $ tar zxvf 4.10.0.tar.gz $ cd ocaml-4.10.0 $ ./configure --prefix $HOME/tmp $ gmake $ gmake install
次に Unison 2.51.3 をビルドする。出来上がったバイナリは今使っている Unison 2.48.3 と併用できるように別のディレクトリへ。
$ cd ~/tmp $ curl -OL https://github.com/bcpierce00/unison/archive/v2.51.3.tar.gz $ tar zxvf v2.51.3.tar.gz $ cd unison-2.51.3 $ PATH=$PATH:$HOME/tmp/bin $ gmake $ ./unison -version $ mkdir -p $HOME/local/unison-2.51.3/bin $ cp -a src/unison $HOME/local/unison-2.51.3/bin
Naney (なにい) です。株式会社MIXIで SNS 事業の部長をしています。
※本サイトの内容は個人的見解であり所属組織とは関係ありません。