Monthly Archives: 2月 2014

Windowsのクリップボード操作系ツール

Pocket

クリップボードに移したデータに対し、何らかの操作を行うWindowsのツールをまとめる。

 

任意の文章を引用貼り付け

Thunderbirdでは、任意の文章であっても「引用文として貼り付け(Ctrl+Shift+O)」で引用貼り付けができる。
Outlookには同等の機能がない。
以下、二つのツールは、実行するとクリップボードの文字列先頭に引用記号”>”を付けてくれるもの。

ひと手間増えるのは悔しいが、ランチャーに本ツールを登録しておき、貼り付け前に実行するとよい

クリップボードの文字列に引用記号を付加するツール

Plus引用符
http://www.vector.co.jp/soft/dl/winnt/writing/se341366.html

引用くん
http://www.fukapon.com/showcase/softwares/inyokun.html

デフォルトでは引用記号は”>”。
実行すると以下のようにになる。

>実行すると以下のようになる。

気に入らない。
“>”のあとにスペースがあってほしい。

この場合、「引用くん」のほうがいいだろう。
オプションで引用記号を自由に変えられるから。
方法は同梱のドキュメントを参照のこと。

 

Excelの表をメールやテキストファイルに貼りつける

Excel文字罫線変換
http://www.ne.jp/asahi/soft/miday/Excel_Moji/Excel_Moji.html

文字通り。
Excelの表をコピーしクリップボードに送った状態で起動すると、文字罫線に変換してくれる。
変換後の例は以下の通り。

+----+----------------+--------+
| 年 |      都市      |   国   |
+----+----------------+--------+
|2016|リオデジャネイロ|ブラジル|
+----+----------------+--------+
|2020|東京            |日本    |
+----+----------------+--------+

以上

カスタムpkgをpoudriereで作ろう

Pocket

poudriereとは

中の人曰く:

primarily designed to test package production on FreeBSD. However, most people will find it useful to bulk build ports for FreeBSD.
「package生成のテストを主眼にデザインされたツールである。しかしながら、ほとんどの人はportsをまとめてコンパイルする点を有用と考えるだろう。」

とのこと。

ちなみにpoudriereとはフランス語であり、英語にするとgunpowder magazine、つまり弾薬庫のことだそうな。

物騒であるな。
あと、poudriereって綴りが覚えづらくて困る。

カスタムpackageのためのツール?

一方で、poudriereはカスタムpackageを欲する人にも勧められてたりする。
というのも。
現時点では、pkgでインストールするpackageのオプションは決め打ちされていて自由に選ぶことができない。
有名なところで例を挙げると、PHPのpackageにapacheモジュールが付属しない。
したがって、apacheモジュールが欲しければ自分でコンパイルするしかない。

コンパイルとくればportsである。
poudriereもコンパイルを行うが、こちらはpackageを作ることができる。
packageを作ってしまえば、pkgコマンドで手軽に管理できる。
おお。
これは便利なのか?

しかしながら準備段階でコンパイルが発生しているわけで、わざわざpkgコマンドなんて経由しないで、portsからコンパイルしてさっさと入れてしまったほうが効率的だろう。

それでもpoudriereが有用なケース①: 複数ホストが対象のとき

ずいぶんネガティブなことを書いたけれども、もしもカスタムpackageを複数ホストで使うのならば、poudriereの利点が活きてくる。
poudriereの優れているところは、公式のpackageレポジトリの構成とまったく同じものを作る点だ。
そのディレクトリをwebサーバで公開するだけで、自前のレポジトリができてしまう。
クライアントでは、pkgコマンドの見に行く場所を自前レポジトリに向けるだけでよい。

やってみると分かるけど、同じLANにあるレポジトリはめっぽう速くて気分がよい。速いのはあたりまえだけど。
こうしたことから、カスタムpackageを複数ホストにばら撒くならpoudriereはとても有用である。

それでもpoudriereが有用なケース②: オフラインマシン向け

もう一つ加えるとすれば、オフラインのマシンにpackageを展開する場合だろう。

pkgコマンドにはcreateというサブコマンドがあり、インストール済みのpakcageからpackageを再生成できる。
これを利用して、ネットに繋がるマシン(たいていはセキュリティポリシー上許可されたマシン(多くはWindows)の「上で」動く仮想マシン)でpackageをインストールしてpkg create、ネットに繋げないマシンにまるまる移すことができる。

また別の考え方をすると、テスト環境でpackageをインストールして検証し、問題のないことを確認したら、packageを本番環境に移す、ということもできるだろう。

ただこの方法には問題があって、現時点のpkgコマンドにはインストール済みのpackageをリプレイスする仕組みがないのである。

例えばターゲットとなるマシンのbashを更新したいとする。
通常であればpkg upgradeを使うところだが、このコマンドは手許にあるpackageを読んでくれないのである。
(もしできるのなら教えてください本当に)
どうしようもないので、いったんbashをアンインストールしてから再インストールするという、なんだかすごく頭の悪いことをする羽目になる。

bashなら悠長なこと言ってられるかもしれないが、これがサーバソフトウェアなら大変である。
またこれが1つ2つではなく、数百個になったらどうするのか。

ここで告白するが、私はとても面倒くさくなって、packageを根こそぎ削除して新規にまるまるインストールしようとした。
そしたら、pkgコマンドも削除されててリアルでorzとなった。
みんなは気をつけるように。

話を戻すと、こういうウッカリさんには、poudriereは便利、かもしれない。

注意点

仮想マシンでpoudriereを動かす人は以下の点に注意すべき。
端的に言って、firefox等のブラウザ、libreofficeなどの巨大packageを作る際には、膨大なメモリ、swapが必要である。メモリ、swapそれぞれ1GBでは失敗した。
メモリを用意できない場合には、出来合いのpackageを持ってくるしかないだろう。
なお、ブラウザに限って言えば、operaなら悠々とコンパイルできたことをお伝えしておく。

ながながと前置きをしたが、以下にpoudriereでカスタムpackageを作る方法を示す。

前提

便宜上、「インターネットに繋がっていない」ことを「オフライン」と表現する。
「オフラインマシン」であれば、「インターネットには繋がっていないマシン」とする。
ただしオフラインマシンであっても、LANには接続されている前提。

ネット接続可能で、poudriereのインストールされているマシンをオンラインマシンとする。

オンラインマシンでpackageを作り、「レポジトリをオフラインマシンにコピーしてから」、オフラインマシンにインストールするという手順にする。
つまりこれは複数のオフラインマシンを前提にしているというわけ。

事前準備

オンラインマシンにpoudriereの環境があること。
作り方は本記事の前編であるこちらをどうぞ。
オフラインマシンには、pkgコマンド、webサーバ(nginx, lighttpd, apacheのいずれか。Pythonでもよい。 Python? ええPythonです)、あとはまあ転送用に、rsyncがあると便利。なくてもよい。

オフラインマシンへのpkgインストールはこちらを。
オフラインマシンへのpackageインストールは、poudriereに関するこちらを。

全体の流れ

poudriereでカスタムpackageを作るときの流れは以下のようなものである。

1.おもむろにテキストファイルを開く
2.カスタマイズしたいpackageの一覧をズラズラと並べる。
3.このとき、origin付きで並べること。php5ならlang/php5というように。
4.poudirereのサブコマンドoptionsを使って一括でoption設定をする。
5.あとは同じファイルでbulkコンパイルすればよい。

では。

カスタマイズしたいpackage一覧の作成

一例として、以下のようなファイルを作る。
pkg.custom.txt

lang/php5
lang/php5-extensions

originの探し方はpkg search -o phpなどとすればよい。

optionの設定

以下のようにする。

poudriere options -n <package一覧> -j <jail name>

optionsサブコマンドにテキストファイルを与えると、書かれているpackageのoptionを根こそぎ聞いてくれる。

実態は、おそらく当該portsに移ってmake config-recursiveをしている。
それはともかく、素のままoptionsを実行すると、再帰的にmake configされるので大変である。
大量の依存を抱えているといつまで経ってもoption選択が終わらない。ウンザリする。
そもそもカスタマイズしたいpackageだけを書いているのにこんなことをされては迷惑である。
そこで-nオプションを与えて、option設定を一階層に限るというわけ。

packageの作成

あとは同じテキストファイルを、bulkコマンドに与えて上げればよい。
待つだけ。

リポジトリの展開

オンラインマシン(”オンラインマシン”の定義は「前提」章を参照のこと)からオフラインマシンに移す。
オンラインマシンでいきなりリポジトリを公開するケースはこちらを。

さて以下の場所にリポジトリができたとする。

/usr/local/poudriere/data/packages/92i386-default

それをオフラインマシンに転送。

rsyncを使った。
ないならtarでもなんでも固めて持っていけ。
ここでは192.168.200.100がオフラインマシン。
オフラインマシンにいる普通のユーザのディレクトリに置いているが、気にしない。

$ cd /usr/local/poudriere/data/
$ rsync -avz —-delete ./packages/ vanilla@192.168.200.100:/home/vanilla/poudriere/

その後、オフラインマシンに移って該当箇所をwebで公開。

pythonが入っていれば以下のコマンドですぐに公開できる(Python 2の例)。

$ cd /home/vanilla/poudriere
$ python -m SimpleHTTPServer
Serving HTTP on 0.0.0.0 port 8000 ...

 

オフラインマシンでの設定

以下のような設定を書けばOK。

/usr/local/etc/pkg/repos/localpkg.conf

localpkg: {
url: "http://192.168.200.100:8000/92i386-default",
mirror_type: "http",
enabled: yes
}

 

リポジトリの設定を変えたら必ずpkg -vvで確認。

pkg -vv

Repositories:
localpkg: {
url : "http://192.168.200.100:8000/92i386-default",
enabled : yes,
mirror_type : "HTTP"
}

 

あとはpkg updateしていつもの流れ。

$ sudo pkg update
Updating repository catalogue
digests.txz 100% 26KB 25.6KB/s 25.6KB/s 00:00
packagesite.txz 100% 114KB 114.0KB/s 114.0KB/s 00:00
Incremental update completed, 537 packages processed:
0 packages updated, 0 removed and 537 added.

 

以上。

Pythonがあればwebサーバを動かせる件について

Pocket

Pythonがあれば、webサーバソフトウェアを追加することなくwebサーバを立ち上げることができる。
たいへん便利なのでメモしておく。

書式

Python 2.xの場合、以下のようにすると、「カレントディレクトリ」をwebサーバとして公開する。
ポートは8000。
つまりアドレスはhttp://<当該ホスト>:8000/となる。
なお、8000なので起動はスーパーユーザじゃなくても平気。

python -m SimpleHTTPServer

Python 3.xの場合。

python -m http.server

 

実行例

下記のようなindex.htmlを用意する。

$ cat ./index.html
it works!

pythonでwebサーバ起動。
2.7.6なので、python2の書式ですな。

$ python -V
Python 2.7.6

$ python -m SimpleHTTPServer
Serving HTTP on 0.0.0.0 port 8000 ...

w3mで繋いでみると。

$ w3m -no-proxy http://127.0.0.1:8000/
it works!

おお。
sockstatの結果は以下の通り。

$ sockstat -l4
USER     COMMAND    PID   FD PROTO  LOCAL ADDRESS         FOREIGN ADDRESS
vanilla  python2.7  69678 3  tcp4   *:8000                *:*
root     sshd       980   4  tcp4   *:22                  *:*

 

[UNIX tips] 復活祭(イースター)の日付に神代の遊び心を見た(2014年のイースターは4/20です)

Pocket

cal/ncalにはイースター(復活祭)を表示するオプションがある。
私はキリスト教徒ではないのですが、コマンドにこういったオプションが自然に入っていることに感銘したので記録する。

結論

ncal -e (西方教会向け)
ncal -o (東方教会向け)

* Linux(GNU cal)ならcal -e/cal -oでOK。

calコマンド

UNIXにはcalコマンドという、カレンダーを表示するコマンドがある。
手許のMacにもきちんと入っていて(MacなのでFreeBSD由来です)、実行してみると以下のように表示される。

$ cal

2月 2014
日 月 火 水 木 金 土
1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28

 

復活祭とは

wikiがこちら。
http://ja.wikipedia.org/wiki/復活祭

「復活祭は基本的に「春分の日の後の最初の満月の次の日曜日」に祝われるため、年によって日付が変わる移動祝日である。」ということなので、コンピュータに計算させるニーズは、それなりにあるというわけですな。

コマンド実行例

OS XやFreeBSDで復活祭の日付を表示させるには、calコマンドではできず、ncalコマンドを使う必要がある。
GNU calなら問題なし、つまり大半のLinuxでも問題なし。
ncalコマンドは、calコマンドにさらにレイアウトやオプションを追加したもの。

-e、つまりeaster、で復活祭の日付を表示する。
-o、つまりOrthodox(正教)での復活祭の日付を表示する。

$ ncal -e
4月 20 2014

$ ncal -o
4月 20 2014

東方、西方、同じようですな。

おわりに

マニュアルを見ると、calコマンドはAT&T UNIXのVersion 5で現れたとのこと。
1975年ごろ。
まさに神代である。

そして、そんな時代でターミナル上にカレンダーを豪快に表示させるという、ロックなコマンドが生まれてるんである。
「真面目にやれよ」とか怒られなかったんですかね。
そしていつごろか、そこに復活祭のような移動祝祭日を計算するオプションが入ってくる。
のびのびしているというか、融通無碍というか。
気持ちよくて、駄文を記した次第でございます。

UNIX界の既読問題はfingerで解決…?

Pocket

埋め草ネタです。
LINEでは既読になっているのに返信ないとかが問題になるらしいんですがどうでもいいですね。

先日、ふとfingerしてみたら、メールをいつから読んでないか、表示されることに気が付いた。
知らなかったよ…。

$ finger nobwak
Login: nobwak                              Name: John nobwak
Directory: /home/nobwak                    Shell: /usr/local/bin/bash
On since 月  2月 10 23:50 (JST) on ttyv0, idle 0:12 (messages off)
On since 月  2月 10 23:53 (JST) on pts/0 from 192.168.17.88
Last login 月  2月 10 23:58 (JST) on pts/1 from 192.168.17.88
New mail received 月  2月 10 09:35 2014 (JST)
     Unread since 木  3月 14 22:17 2013 (JST)
No Plan.

 

 

No tags for this post.

poudriereでhomebrew(自前) pkgリポジトリを

Pocket

poudriereを使ったので経緯を記す。
poudriereは自前のpkgngレポジトリを作るツール。
自前のレポジトリを作るのは、自前のpackageを置きたいときや、オフラインマシンにpackageを提供したいとき、である。

poudriereの構築は、以下二つのサイトに沿えばできる。
ただ、簡潔にまとめられているので、本記事では補足も併せてまとめる。
http://blog.etoilebsd.net/post/Home_made_pkgng_repo
http://w.vmeta.jp/tdiary/?date=20130205

仕組み

poudriereがどのようにしてpackageを作るかというと。
OS/アーキテクチャごとにjailを作り、そこでportsからpackagesを作る。
つまりホストのOS|アーキテクチャと違っていても大丈夫だが、ホストは最新にしておいた方がよい。

packagesはあるディレクトリにまとめられる。
ディレクトリはそのままwebで公開できる形式になっている。
他のマシンから、pkgngでつなげば、自家製packagesを取得できる。

作成するpackagesは自分で選ぶことができる。
また、オプションも選ぶことができる。
オプションはまた別途。

必要なもの

zpoolを最低7GB用意しておくこと。

インストール

ports-mgmt/poudriereからportsでもpkgでもよいのでインストール。

設定ファイル

まず設定ファイルを作る。
/usr/local/etc/poudriere.conf.sampleをもとに。

/usr/local/etc/poudriere.conf

# 作成しておいたzpoolの名前をここで指定
ZPOOL=vault

# 上記のzpoolから切り出したzfsを、
# ここで示したディレクトリにマウントしておく。
ZROOTFS=/poudriere

# FreeBSDの部品の取得先。国内にしておこう。
FREEBSD_HOST=ftp://ftp2.jp.freebsd.org

# デフォルトのまま
RESOLV_CONF=/etc/resolv.conf

# デフォルトでいいでしょう。
BASEFS=/usr/local/poudriere

# デフォルトでいいでしょう。
USE_PORTLINT=no

# デフォルトでいいでしょう。
USE_TMPFS=yes

# デフォルトでいいでしょう。
DISTFILES_CACHE=/usr/ports/distfiles

# proxyの指定が必要であれば
export HTTP_PROXY="http://proxy:8080/"
export FTP_PROXY="http://proxy:8080/"

 

poudriere作業用zfsの準備

zpoolからzfsを切り出し、/poudriereにマウント。
poudriere.confを参照すると、最低でも7GBとある。

zfsの操作はよろしければこちらをどうぞ。
http://april.fool.jp/blogs/?p=1827

結果として以下のような環境。
20.0Gのzpoolをvaultとして作成している。

$ zpool list
NAME    SIZE  ALLOC   FREE    CAP  DEDUP  HEALTH  ALTROOT
vault  19.9G   190K  19.9G     0%  1.00x  ONLINE  -
$ zpool status
  pool: vault
 state: ONLINE
  scan: none requested
config:

        NAME        STATE     READ WRITE CKSUM
        vault       ONLINE       0     0     0
          ada1      ONLINE       0     0     0

errors: No known data errors

ここからpoudriereとして切り出し。

$ zfs list
NAME              USED  AVAIL  REFER  MOUNTPOINT
vault            45.7M  19.5G    31K  /vault
vault/poudriere  45.0M  19.5G  45.0M  /poudriere

それを/poudriereにマウント。

$ mount
/dev/ada0p2 on / (ufs, local, journaled soft-updates)
devfs on /dev (devfs, local, multilabel)
vault/poudriere on /poudriere (zfs, local, nfsv4acls)

再起動しても大丈夫なようにfstabに書き込み

$ cat fstab
# Device        Mountpoint      FStype  Options Dump    Pass#
/dev/ada0p2     /               ufs     rw      1       1
/dev/ada0p3     none            swap    sw      0       0
vault/poudriere /poudriere      zfs     rw      0       0

以降、本格的な作業に。

デフォルトのportstreeを作る。: poudriere ports

jailごとにportsディレクトリを持っていてはディスクがいくらあっても足らない。
そこでportsディレクトリは全jailsで共有する。
そのportsディレクトリ、portstreeを作る。

poudriere ports -cで作成。
場所は/poudriere/ports/defaultに作られる。

ちなみに、二回目からは-uで更新。
指定がなければportsnapが使われる。
svnとかが使いたければ-m svnなどと指定する。

作成例

$ sudo poudriere ports -c
====>> Creating default fs... done
====>> Extracting portstree "default"...
Looking up portsnap.FreeBSD.org mirrors... none found.
Fetching public key from portsnap.FreeBSD.org... done.
Fetching snapshot tag from portsnap.FreeBSD.org... done.
Fetching snapshot metadata... done.
Fetching snapshot generated at Fri Nov  1 21:00:43 JST 2013:
98c3a00130d24348ff5bcca8474e4c6cb777d838e8f5d2100% of   69 MB 3590 kBps 00m19s
Extracting snapshot... done.
Verifying snapshot integrity...
(略)

二回目以降の例
すでにportsがある状態で-cを指定すると怒られる。

$ sudo poudriere ports -c
====>> Error: The ports tree default already exists

$ sudo poudriere ports -u
====>> Updating portstree "default"
Looking up portsnap.FreeBSD.org mirrors... none found.
Fetching snapshot tag from portsnap.FreeBSD.org... done.
Fetching snapshot metadata... done.
Updating from Fri Nov  1 21:27:07 JST 2013 to Fri Jan 17 22:08:55 JST 2014.
Fetching 4 metadata patches... done.
Applying metadata patches... done.
Fetching 4 metadata files... done.
Fetching 11146 patches.....10
(略)

 

各システム向けのJailを作る: poudriere jail

いよいよ個別のjail。
pkgを提供したいシステムに合わせてjailを作る。

jailを作るにはpoudriere jailを使う。
poudriere jailでオプション一覧が表示される。

-jでjailname指定、-vでFreeBSDバージョン、-aでアーキテクチャ(i386かamd64)を指定。
-cで作成、-dで削除、-lで一覧、-sで開始、-kで停止、-uで更新。

後で見返した時に分からなくなるので、jail名にはシステム関連の情報を入れておくとよい。
たとえば9.2-RELEASE i386向けなら92i386というように。

実行例

$ sudo poudriere jail -c -j 92i386 -v 9.2-RELEASE -a i386
====>> Creating 92i386 fs... done
====>> Fetching base.txz for FreeBSD 9.2-RELEASE i386
/poudriere/jails/92i386/fromftp/base.txz      100% of   60 MB 6703 kBps 00m10s
====>> Extracting base.txz... done
====>> Fetching src.txz for FreeBSD 9.2-RELEASE i386
/poudriere/jails/92i386/fromftp/src.txz       100% of   95 MB 6049 kBps 00m16s
====>> Extracting src.txz... done
====>> Fetching games.txz for FreeBSD 9.2-RELEASE i386
/poudriere/jails/92i386/fromftp/games.txz     100% of  861 kB 4705 kBps 00m00s
====>> Extracting games.txz... done
====>> Cleaning up... done
====>> Jail 92i386 9.2-RELEASE i386 is ready to be used

一覧の例

$ sudo poudriere jail -l
JAILNAME             VERSION              ARCH    METHOD
92i386               9.2-RELEASE          i386    ftp

削除例

$ sudo poudriere jail -d -j 92i386
====>> Removing 92i386 jail... done
$
$ sudo poudriere jail -l
JAILNAME             VERSION              ARCH    METHOD
$

このときのmountの出力
えらいことに。

$ mount
/dev/ada0p2 on / (ufs, local, journaled soft-updates)
devfs on /dev (devfs, local, multilabel)
vault/poudriere on /poudriere (zfs, local, nfsv4acls)
vault/poudriere/data on /usr/local/poudriere/data (zfs, local, nfsv4acls)
vault/poudriere/ports on /poudriere/ports (zfs, local, nfsv4acls)
vault/poudriere/ports/default on /usr/local/poudriere/ports/default (zfs, local, nfsv4acls)
vault/poudriere/jails on /poudriere/jails (zfs, local, nfsv4acls)
vault/poudriere/jails/92i386 on /usr/local/poudriere/jails/92i386 (zfs, local, nfsv4acls)

 

jailの作成が失敗するとき

失敗しなかったらこの章は読み飛ばしてOK.
最初のCreatingで失敗するときは、以前に作った何かが邪魔しているはず。

$ sudo poudriere jail -c -j 92i386 -v 9.2-RELEASE -a i386
====>> Creating 92i386 fs... done
mkdir: /poudriere/jails/92i386: No such file or directory
====>> Fetching base.txz for FreeBSD 9.2-RELEASE i386
fetch: /poudriere/jails/92i386/fromftp/base.txz: open(): No such file or directory
fetch: /poudriere/jails/92i386/fromftp/base.txz: open(): No such file or directory
====>> Error: Failed to fetch from ftp://ftp2.jp.freebsd.org/pub/FreeBSD/releases/i386/i386/9.2-RELEASE/base.txz
====>> Error while creating jail, cleaning up.
====>> Removing 92i386 jail... done

zfs listすると同じ名前の残骸がある。

$ zfs list
NAME                            USED  AVAIL  REFER  MOUNTPOINT
vault                          2.06G  17.5G    31K  /vault
vault/poudriere                2.06G  17.5G   561M  /poudriere
vault/poudriere/data             32K  17.5G    32K  /usr/local/poudriere/data
vault/poudriere/jails          1000M  17.5G    32K  /poudriere/jails
vault/poudriere/jails/92i386   1000M  17.5G  1000M  /poudriere/jails/92i386
vault/poudriere/ports           545M  17.5G    31K  /poudriere/ports
vault/poudriere/ports/default   545M  17.5G   545M  /usr/local/poudriere/ports/default

削除。オプションなしではうまくいかないので-rで再トライ。

$ sudo zfs destroy vault/poudriere/jails/92i386
cannot destroy 'vault/poudriere/jails/92i386': filesystem has children
use '-r' to destroy the following datasets:
vault/poudriere/jails/92i386@clean
$ sudo zfs destroy -r vault/poudriere/jails/92i386
$

きれいになった。

$ zfs list
NAME                            USED  AVAIL  REFER  MOUNTPOINT
vault                          1.08G  18.5G    31K  /vault
vault/poudriere                1.08G  18.5G   561M  /poudriere
vault/poudriere/data             32K  18.5G    32K  /usr/local/poudriere/data
vault/poudriere/jails            32K  18.5G    32K  /poudriere/jails
vault/poudriere/ports           545M  18.5G    31K  /poudriere/ports
vault/poudriere/ports/default   545M  18.5G   545M  /usr/local/poudriere/ports/default

 

作成したいpackagesのリストを作る

作成したいpackagesを指定する。
テキストファイルにpackagesを並べればよい。

ただしOriginで記載すること。
Originっていうのは…たとえばrsyncならnet/rsyncと書く。
Originが分からなければ、pkg searchするときに-oを付ければよい。

$ pkg search -o rsync
net/grsync
net/librsync
mail/maildirsync
net/rsync
sysutils/rsyncbackup
sysutils/rsyncmanager
sysutils/rsyncrypto

psearch(ports-mgmt/psearch)でもできる。

$ psearch rsync
archivers/rvm             Archive manager that uses rsync to manage backups
devel/p5-File-DirSync     Perl5 module for synchronizing two directories rapidly
mail/maildirsync          Online synchronizer for Maildir-format mailboxes
net/grsync                GTK frontend for rsync
net/librsync              Library for delta compression of streams
net/p5-File-Rsync         Perl convenience wrapper for the rsync(1) program
net/p5-File-RsyncP        Perl Rsync client
net/rsync                 Network file distribution/synchronization utility
sysutils/dirvish          Network backup system based off of rsync
(略)

試しにrsyncだけ書く。

$ cat ./pkg.list
net/rsync

 

packagesの作成: poudriere bulk

いよいよ作成。
作成にはpoudriere bulkを使う。
poudriere bulkでオプションを一覧できる。

-fで作成するパッケージリストを指定。さっき作ったやつ。

特定のjailでのみ実施したい場合は-jでjailname指定。
-cで作成したpackagesをすべて吹き飛ばす。
-C -f <file>に書かれたpackagesのみ消す。

では実行。
初回なのでpkgも作ってくれているようですな。

$ sudo poudriere bulk -j 92i386 -f ./pkg.list
====>> Creating the reference jail... done
====>> Mounting system devices for 92i386-default
====>> Mounting ports/packages/distfiles
====>> Mounting packages from: /usr/local/poudriere/data/packages/92i386-default
====>> Logs: /usr/local/poudriere/data/logs/bulk/92i386-default/2014-01-20_22h03m21s
====>> Appending to make.conf: /usr/local/etc/poudriere.d/92i386-make.conf
/etc/resolv.conf -> /usr/local/poudriere/data/build/92i386-default/ref/etc/resolv.conf
====>> Starting jail 92i386-default
====>> Calculating ports order and dependencies
====>> pkg package missing, skipping sanity
====>> Cleaning the build queue
====>> Building 2 packages using 1 builders
====>> Starting/Cloning builders
====>> Hit CTRL+t at any time to see build progress and stats
====>> [01] Starting build of ports-mgmt/pkg
====>> [01] Finished build of ports-mgmt/pkg: Success
====>> [01] Starting build of net/rsync
====>> [01] Finished build of net/rsync: Success
====>> Stopping 1 builders
====>> Creating pkgng repository
Generating repository catalog in /packages: done!
====>> Cleaning up
====>> Umounting file systems
====>> Built ports: ports-mgmt/pkg net/rsync

====>> [92i386-default] 2 packages built, 0 failures, 0 ignored, 0 skipped
====>> Logs: /usr/local/poudriere/data/logs/bulk/92i386-default/2014-01-20_22h03m21s
$

 

自家製packagesの公開

さて。
作成したpackagesはどこにあるかというと、今回の場合は以下である。

/usr/local/poudriere/data/packages/92i386-default/

このディレクトリをwebサーバで公開する。
※もちろん、webサーバで公開しているディレクトリに中身を移しても可。

この場所は、poudriere.confのPOUDRIERE_DATAで決まる。
${POUDRIERE_DATA}/packages/<jailname>-default/となる。
もしこの場所が気に食わなかったら、POUDRIERE_DATAを変える。

lsで中身を見てみると、オフィシャルpkgsiteのものと全くそっくりな内容になっている。

$ ls /usr/local/poudriere/data/packages/92i386-default/
All             Latest          digests.txz     packagesite.txz

ではこれをwebサーバで公開する。
ここではnginxを例にとる。
nginx.confは下記のように。

worker_processes  1;
events {
    worker_connections  1024;
}
http {
    include       mime.types;
    default_type  application/octet-stream;
    sendfile        on;
    keepalive_timeout  65;
    server {
        listen       80;
        server_name  localhost;
        location / {
            autoindex on; #Here!
            root   /usr/local/poudriere/data/packages; #Here!
            index  index.html index.htm;
        }
        error_page   500 502 503 504  /50x.html;
        location = /50x.html {
            root   /usr/local/www/nginx-dist;
        }
    }
}

デフォルトからほとんど変えていない。
変えたのは、#Here!と記載した箇所。
rootを/usr/local/poudriere/data/packagesに向ける。
autoindexをonにする。
nginxは、デフォルトではautoindex offなので、明示的に指定しないとForbiddenを食らってしまう。

nginxを起動して;

$ sudo service nginx start
Performing sanity check on nginx configuration:
nginx: the configuration file /usr/local/etc/nginx/nginx.conf syntax is ok
nginx: configuration file /usr/local/etc/nginx/nginx.conf test is successful
Starting nginx.

接続確認。良さそうですな。

$ w3m http://localhost/92i386-default/
Index of /92i386-default/

━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━

../
All/                                               20-Jan-2014 22:24
Latest/                                            20-Jan-2014 22:06
digests                                            20-Jan-2014 22:24
digests.txz                                        20-Jan-2014 22:07                 3
packagesite.txz                                    20-Jan-2014 22:07                12
packagesite.yaml                                   20-Jan-2014 22:24

━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━

webサーバを他の用途にも使っている場合には、以下のようにlocation /packages/を/usr/local/poudriere/dataに向ければよい。
※冗長なのでserverディレクティブの中しか引用しない。

    server {
        listen       80;
        server_name  localhost;
        location / {
            root   /usr/local/www/nginx;
            index  index.html index.htm;
        }
        location /packages/ {
            autoindex on;
            root   /usr/local/poudriere/data;
        }

 

クライアント側の設定

やっとたどり着いた。
クライアント側では/etc/pkg/の下か、/usr/local/etc/pkg/repos/の下に以下のような設定ファイルを作る。
ここで192.168.200.111はサーバのアドレス。

/etc/pkg/homebrew.conf

homebrew: {
  url: "http://192.168.200.111/92i386-default",
  enabled: yes
}

こうしておき、pkg -vvとすると見えるはず。

Repositories:
  homebrew: {
    url             : "http://192.168.200.111/92i386-default",
    enabled         : yes
  }

pkg updateするとさっき作ったpackagesも見える。

$ sudo pkg update
Updating repository catalogue
digests.txz                         100%  352     0.3KB/s   0.3KB/s   00:00
packagesite.txz                     100% 1904     1.9KB/s   1.9KB/s   00:00
Incremental update completed, 2 packages processed:
0 packages updated, 0 removed and 2 added.

いろんな工夫については別途。

pkgのデータが壊れたでござる。よろしい。消しておしまい。

Pocket

pkgngで色々と遊んでたりすると、ごくごく稀に以下のような表示が出ることがある。

pkg: sqlite: database disk image is malformed (pkgdb_repo.c:545)

 

要するにpkgのdatabaseが壊れたということである。

これを復旧するにはどうしたらよいか。
実はすごく簡単だし、大した問題ではない。
ここで壊れているのは、repository catalogueつまりpkgサーバに何が格納されているか、というデータベースなので、消してもう一回ダウンロードすればよい。

# rm /var/db/pkg/repo-*.sqlite

 

として、それからpkg updateすればよいだけ。
ただし削除するときは注意。
local.sqliteは、そのホストにどのpkgがインストールされているか、というデータベースである。
これを消してしまうと、当然ながらそのホストにはpkgが一つもインストールされていない、ということになって、たいへん面倒なことになるから注意。
告白すると私は一度やりました。ええ。

[メモ] pkgngで更新のあるpackagesを一覧にするには

Pocket

pkg updateとやったあと、更新のあったpackagesを一覧するには。

スマート: “pkg version -vRL=”とすればよい。
かっこよくない: いきなりpkg upgradeして表示させる。

実行例

$ pkg version -vRL=
gvfs-1.12.3_1                      ?   orphaned: devel/gvfs
mate-file-archiver-1.6.0           ?   orphaned: archivers/mate-file-archiver
mate-file-manager-1.6.2            ?   orphaned: x11-fm/mate-file-manager
mate-text-editor-1.6.0             ?   orphaned: editors/mate-text-editor

…なんか面倒くさいことになってるけど、この通り。

portsのINDEXを使う場合

/usr/portsがあり、OSバージョンに合ったINDEXがあれば、version -vIL=も使える。
INDEXとは、/usr/ports/INDEX-10などの、portsの目次。
portsを使わない場合は不要だけど、poudriereで自家製packagesを使うときには重宝するかも。

$ pkg version -vIL=
gnutls-2.12.23_2                   <   needs updating (index has 2.12.23_3)
libXfont-1.4.6,1                   <   needs updating (index has 1.4.7,1)
pkg-1.2.4_1                        <   needs updating (index has 1.2.5)
zsh-5.0.4                          <   needs updating (index has 5.0.5)

 

オプション補足

-Iと-Rの違いは下記の通り。

-I  portsのINDEXを使う。
-R リポジトリのカタログを使う。

-vと-Lの意味は以下の通り。

-v 出力を詳細にする。ないと更新の有無しか表示しない。
-L "-L ="とすると、"="を含まない場合だけ表示。すなわち、更新のある場合のみ表示。

 

pkgngが死んで詰んだときには

Pocket

 

pkgコマンドが何らかの要因で壊れてしまい、pkgコマンド自体の再インストールすらできず詰んでしまったときの対処方法を示す。
お急ぎの方は「蘇生方法」からお読みください。

背景: pkgはベースシステム?package?

pkgコマンドは、ベースシステムに組み込まれていながら、pkgシステムで管理されている。
言い換えると、ベースシステムに含まれているのに追加ソフトウェアとしてのpackagesでもある、というちょっと変わった存在である。

これは、pkgコマンド自体を、OSのバージョンに固定されることなく、更新できるための仕組み。
pkgコマンドが純然たるベースシステムであった場合、pkgコマンドを更新するたびにOSリリースが発生してしまうからである。

だから、皆さんご存知の通り、初めてpkgコマンドを実行すると最新のpkgをダウンロード&インストールするのだが、それは上記のような理由である。

なお、ここでの「ベースシステム」とは、FreeBSD projectがリリースする一式(カーネル+ユーザランド)を指す。packagesはユーザが任意に追加するソフトウェア。

問題: pkgはpackageなのでpkgが壊れると詰む。

よろしい。背景は、わかる。
しかし、問題もあって、すなわち;
pkgコマンドもpkgngで管理しているので、pkgコマンドが壊れてしまった場合、pkgの再インストールができず詰む
ということである。

たとえば、pkgコマンドが依存しているshared objectが無くなったとか、壊れた場合である。
FreeBSDではこういう場合に備えて、/rescueにスタティックリンクされたコマンドが並べられているが、pkgはここにない(9.2-RELEASEで確認)。

どうしたらよいか。

蘇生方法: pkgコマンドをダウンロードして、それでpkgコマンドをインストールせよ。

結論。pkgのpackageにはスタティックリンクされたpkgが含まれているのでそれを使う。
以下、手順。

pkgコマンドのダウンロード

まず、pkg.freebsd.orgからpkgコマンドのpackageをダウンロードする。
OSバージョン、アーキテクチャに合ったpackageを選ぶこと。

9.2 i386なら、以下
http://pkg.freebsd.org/freebsd:9:x86:32/latest/Latest/pkg.txz

10.0 amd64なら、以下
http://pkg.freebsd.org/freebsd:10:x86:64/latest/Latest/pkg.txz

※URLは変わる可能性があるので、都度、確認すること。
pkg.freebsd.orgから辿っていけばよい。

実行例

$ uname -a
FreeBSD ascomoid 9.2-RELEASE FreeBSD 9.2-RELEASE #0 r255898: Fri Sep 27 03:52:52 UTC 2013     root@bake.isc.freebsd.org:/usr/obj/usr/src/sys/GENERIC  i386
$ fetch http://pkg.freebsd.org/freebsd:9:x86:32/latest/Latest/pkg.txz
pkg.txz                                       100% of 1811 kB   53 kBps 00m34s

pkg-staticの取り出し。

以下のようにしてpkg-staticを取り出す。
このpkg-staticがスタティックリンクされたpkg

$ tar xvf ./pkg-1.2.4_1.tgz -s",/.*/,,g" "*/pkg-static"
x pkg-static

pkgのインストール

このpkg-staticを使って、ダウンロード済みのpkg packageをインストールする。
ローカルにダウンロード済みのpackageをインストールする場合には引数にaddを与える。
壊れたpkgが邪魔でインストールできないなら、-fを付けて強制的にインストールする。

$ sudo ./pkg-static add -f ./pkg-1.2.4_1.tgz 
Installing pkg-1.2.4_1...pkg-static: package pkg is already installed, forced install
 done
If you are upgrading from the old package format, first run:

  # pkg2ng

あとは通常通りpkg updateなど。

pkgの設定確認

pkgの設定を一覧したり、どのリポジトリを見ているかを確認するにはpkg -vvとする。
pkgについて、誰かに質問するときには、この出力も必ず付けること。

$ pkg -vv
Version                 : 1.2.4_1
PACKAGESITE             :
PKG_DBDIR               : /var/db/pkg
PKG_CACHEDIR            : /var/cache/pkg
PORTSDIR                : /usr/ports
PUBKEY                  :
HANDLE_RC_SCRIPTS       : no
ASSUME_ALWAYS_YES       : no
REPOS_DIR               : [
  /etc/pkg/,
  /usr/local/etc/pkg/repos/,
]
PLIST_KEYWORDS_DIR      :
SYSLOG                  : yes
AUTODEPS                : yes
ABI                     : freebsd:9:x86:32
DEVELOPER_MODE          : no
PORTAUDIT_SITE          : http://portaudit.FreeBSD.org/auditfile.tbz
VULNXML_SITE            : http://www.vuxml.org/freebsd/vuln.xml.bz2
MIRROR_TYPE             : SRV
FETCH_RETRY             : 3
PKG_PLUGINS_DIR         : /usr/local/lib/pkg/
PKG_ENABLE_PLUGINS      : yes
PLUGINS                 : [
]
DEBUG_SCRIPTS           : no
PLUGINS_CONF_DIR        : /usr/local/etc/pkg/
PERMISSIVE              : no
REPO_AUTOUPDATE         : yes
NAMESERVER              :
EVENT_PIPE              :
FETCH_TIMEOUT           : 30
UNSET_TIMESTAMP         : no
SSH_RESTRICT_DIR        :
PKG_SSH_ARGS            :
PKG_ENV                 : {
}
DISABLE_MTREE           : no
DEBUG_LEVEL             : 0
ALIAS                   : {
}

Repositories:
  FreeBSD: {
    url             : "pkg+http://pkg.FreeBSD.org/freebsd:9:x86:32/latest",
    enabled         : yes,
    mirror_type     : "SRV"
  }

pkgの設定ファイルなど。

以下があれば何とかなるはず。

/usr/local/etc/pkg/repos/FreeBSD.conf

FreeBSD: {
  url: "pkg+http://pkg.FreeBSD.org/${ABI}/latest",
  mirror_type: "srv",
  enabled: yes
}

以上

Windowsでcurlを使おう。あるいはMicrosoft Security Essentialの定義ファイルをcurlでダウンロード。

Pocket

Windowsでもバッチファイルでファイルのダウンロードをしたい事がある。
そうすると、たとえばIEにURLを渡して起動するといったような事が考えられるが、いちいち保存を選ばないといけないとか、何かの操作が必要になってしまう。
これではバッチファイルの意味がない。
無人で行う方法にはいくつかあるだろうが、ここではcurlを使ってみる。

curlとは

curlとは、URLを使った、データ送受信コマンドである。
UNIX/Linux系では有名なコマンドだけれども、実はWindows向けバイナリも配布されている。

公式サイト
http://curl.haxx.se/
Wikipedia
http://ja.wikipedia.org/wiki/CURL

インストール

上記サイトのダウンロードページから取得。
http://curl.haxx.se/download.html

Windows向けには32bit版, 64bit版のほか、Generic版, MSVC版がある。
さらにMSIとzipが選べる。

Genericの方が最新なのでこちらを使った。2014/1/7現在のバージョンは7.34.0。
Windows7だけど2000/XPのもので問題なし。

インストーラは使いたくないのであれば、MSIではなくzipの方でどうぞ。
ただしzipの場合は、PATHを通すなどの作業は自分でしないといけないよう。

curlの使い方

curlはオプションが多くてウンザリする。
以下のサイトが適切な量にまとまっていると思う。

http://d.hatena.ne.jp/hogem/20091122/1258863440

curlの使い方例

proxy越しにMicrosoft Security Essential定義ファイルのダウンロードをする例。

C:¥home¥tools¥curl>curl -O -x this.is.sample.proxyserver.com:8080 "http://download.microsoft.com/download/DefinitionUpdates/mpam-fe.exe"

curlは、そのままだとダウンロードした内容を標準出力に表示する。
-Oを付けると、ダウンロード先のファイル名で保存する。
この場合だとmpam-fe.exeとして保存する。

proxyサーバは、-xあるいは–proxyで指定する。
書式は<[protocol://][user:password@]proxyhost[:port]>

プロトコル指定がなければHTTP proxyとして扱われる。
ポート番号については、指定がなければ1080として扱われる。

例ではproxyサーバとしてthis.is.sample.proxyserver.com:8080を指定。
定義ファイルのダイレクトリンクとして http://download.microsoft.com/download/DefinitionUpdates/mpam-fe.exe を指定している(いつまで使えるかは分からない)

追記: リトライ数、リトライ感覚の指定

サーバの反応が悪く、ダウンロード途中で失敗してしまうことがある。
そういう場合には、–retry <num> –retry-delay <sec>を指定しておこう。

 

curlのman抜粋

以下、-xと-Oのマニュアルを抜粋。

-x, --proxy <[protocol://][user:password@]proxyhost[:port]>

Use the specified proxy. 

The proxy string can be specified with a protocol:// prefix to specify alternative proxy protocols. Use socks4://, socks4a://, socks5:// or socks5h:// to request the specific SOCKS version to be used. No protocol specified, http:// and all others will be treated as HTTP proxies. (The protocol support was added in curl 7.21.7)

If the port number is not specified in the proxy string, it is assumed to be 1080.

This option overrides existing environment variables that set the proxy to use. If there's an environment variable setting a proxy, you can set proxy to "" to override it.

All operations that are performed over an HTTP proxy will transparently be converted to HTTP. It means that certain protocol specific operations might not be available. This is not the case if you can tunnel through the proxy, as one with the -p, --proxytunnel option.

User and password that might be provided in the proxy string are URL decoded by curl. This allows you to pass in special characters such as @ by using %40 or pass in a colon with %3a.

The proxy host can be specified the exact same way as the proxy environment variables, including the protocol prefix (http://) and the embedded user + password.

If this option is used several times, the last one will be used.
-O, --remote-name

Write output to a local file named like the remote file we get. (Only the file part of the remote file is used, the path is cut off.)

The remote file name to use for saving is extracted from the given URL, nothing else.

Consequentially, the file will be saved in the current working directory. If you want the file saved in a different directory, make sure you change current working directory before you invoke curl with the -O, --remote-name flag!

There is no URL decoding done on the file name. If it has %20 or other URL encoded parts of the name, they will end up as-is as file name.

You may use this option as many times as the number of URLs you have.