Monthly Archives: 8月 2015

[FreeBSD] jailのetcを更新する(qjail)

Pocket

qjailだと、ここで示したようにqjail update -bでjailのバイナリアップグレードをしてくれる。

アップグレードといっても、ホストのバイナリをjailのsharedfsにまるまるコピーしているだけである。
ということは、通常のアップグレードで更新されるはずの/etc下ファイルには一切、手を付けないということ。

jailのetc更新にはmergemaster

実はmergemasterは更新するフォルダを-Dオプションで選ぶことができる。
つまり、ホストのsrcをベースにjailのetcを更新できる。

jailの/etcを更新するには

jail ex01を更新する場合は、以下の通り。-D以外のオプションはUPiF。

$ sudo mergemaster -UPiFD /usr/jails/ex01/

新しくjailを作る際のテンプレートも更新しておく。

$ sudo mergemaster -UPiFD /usr/jails/template/

以上

[FreeBSD][メモ] PlexConnectに関する情報

Pocket

PlexConnect

https://github.com/iBaa/PlexConnect

最低限入れておくべきもの(jailを想定)

  • plexmediaserver(これは当然)
  • ca_root_nss
  • python2.*

スタートアップスクリプト

/usr/local/etc/rc.dに設置。
/etc/rc.confにplexconnect_enable=”YES”

#! /bin/sh
#
#
# PROVIDE: plexconnect
# REQUIRE: DAEMON
# KEYWORD: shutdown

. /etc/rc.subr

name="plexconnect"
rcvar=plexconnect_enable

command="/usr/local/bin/python"
pidfile="/var/run/${name}.pid"
plexconnect_flags="/usr/local/PlexConnect/PlexConnect_daemon.py --pidfile $pidfile"
eval ${name}_flags=\"${plexconnect_flags}\"


load_rc_config $name
run_rc_command "$1"

[FreeBSD] pkg quarterlyとlatestレポジトリの共存

Pocket

ここでも触れたが、10.2-RELEASEから、pkgレポジトリのデフォルト参照先がlatestからquarterlyになった。
具体的には/etc/pkg/FreeBSD.confの内容が変わった。

だからして、引き続きlatestを参照したい場合には、/etc/pkg/FreeBSD.confを書き換えればいいや、と思っていたものの、どうもこのファイルは「なるべく触るな」ということのようである。

つまり、もしもの時にlatestを参照する場合には、quarterly(すなわちデフォルト)の他に、latest向けのレポジトリ設定ファイルを作る必要がある。

それぞれを、いちいちenable/disableするのも面倒なので、latest、quarterlyの双方を参照するよう、Multi-repositoryの設定をした。

本記事ではMulti-repositoryの設定方法について示す。
と同時に、普段はquarterlyを使い、特定のときだけlatestを使うための方法を示す。

まずデフォルトの/etc/pkg/FreeBSD.confについて

/etc/pkg/FreeBSD.confは触るな

/etc/pkg/FreeBSD.confの中身を見てみると、以下のような記載がある。

# To disable this repository, instead of modifying or removing this file,
# create a /usr/local/etc/pkg/repos/FreeBSD.conf file:
#
#   mkdir -p /usr/local/etc/pkg/repos
#   echo "FreeBSD: { enabled: no }" > /usr/local/etc/pkg/repos/FreeBSD.conf
#

すなわち、この設定を無効化したい場合には、/etc/pkg/FreeBSD.confは触らずに、/usr/local/etc/pkg/repos/FreeBSD.confを作ったうえで、無効化の宣言をしろ、ということである。

/etc/pkg/FreeBSD.confはデフォルト設定として扱いたい雰囲気丸出しであるが、そうならrc.confのデフォルト設定が/etc/defaultsの下にあるように、/etc/pkg/defaults/FreeBSD.conf的なものを作ってくれても良いのではないかと思った。

しかしそもそも、レポジトリの設定ファイルはどのように読み込まれるのであろうか。

レポジトリ設定ファイルの読み込まれる順番

/usr/local/etc/pkg.confで指定する。
上記ファイルの中に、REPOS_DIRがある。
pkgは、ここに記載された順番通りにレポジトリ設定ファイルを読み込む。
特に変更していないのであれば、内容は下記の通り。

REPOS_DIR [
    "/etc/pkg/",
    "/usr/local/etc/pkg/repos/",
]

仮に複数のディレクトリに、同じレポジトリに対する設定ファイルがあったならば、後から読み込まれたもので上書きされる。
同じディレクトリに複数のファイルがあったならば、ファイルはアルファベット順に読み込まれる。

以下、マニュアルからの引用

Repositories are processed in the order they are found on the REPOS_DIR search path, with individual repository configuration files in the same directory processed in alphabetical order. Settings from files later in the search path will override those from earlier ones.

だから、/etc/pkg/FreeBSD.confのコメントに書いてある通り、/usr/local/etc/pkg/repos/FreeBSD.confでFreeBSDレポジトリを無効にする宣言をすると、設定が上書きされ、めでたくFreeBSDレポジトリは無効になる。

ところで、同じディレクトリ内の読み込み順序はアルファベット順、というのがキモで、実はレポジトリの名前と設定ファイルの名前は別々でも構わない。
だから、読み込ませたい順番に応じて、ファイル名の頭に数字を入れてもよい。

latestレポジトリ向けの設定はどこに?またどうやって?

さて。
仕組みはわかった。
どうも/etc/pkg/は触ってほしくないようだから、/usr/local/etc/pkg/reposにlatest向けの設定ファイルを置けばよいのだろう。
しかしちょっと待て。
latestとquarterlyを両立させるにはどのようにしたら良いのであろうか。

レポジトリの優先度について

複数のレポジトリを参照する場合、どちらをどの程度優先するか。
レポジトリ設定ファイルにpriorityという設定項目があるので、それを使えば優先度の設定ができる、ようだが。

以下はマニュアル。

PRIORITY: integer    Set the priority of the repository.  Higher
                     values are preferred.  Default: 0

レポジトリ設定ファイルにPRIORITYで優先度を指定すればよい。
数値が高ければ高いほど、優先度が高い。

ふむふむ。
では、動作は?

優先度設定されたときの動作

WORKING WITH MULTIPLE REPOSITORIES
  Where several different repositories are configured pkg will search
  amongst them all in the order specified by the PRIORITY settings in the
  repo.conf files, unless directed to use a single repository by the -r
  flag (略)

「複数のレポジトリが与えられた場合、pkgは、-rで参照先レポジトリを明示されない限り、PRIORITYの順番で検索を行う。」

ほほう。なるほど。
続けて読む。

  Where several different versions of the same package are available, pkg
  will select the one with the highest version (略)

「異なるバージョンのpackageが見つかった場合、最も高いバージョンが選ばれる。」

アレ!? 話が思わぬ方向に向かってきたよ!
優先度の高いレポジトリからインストールしてくれるんじゃないの!?

  even if a lower numbered version can be found in a
  repository earlier in the list

「低いバージョンが優先度の高いレポジトリにあったとしてもこの動作は変わらない。」

Oh…。

  This applies even if an explicit version is stated on
  the command line.  Thus if packages example-1.0.0 and
  example-1.0.1 are available in configured repositories(後略)

「さらにさらに、仮にバージョンを指定してインストールを実行しても、
動作は変わらない。
高いバージョンが見つかったら問答無用で新しい方をインストールする。」

ぐぬぬ。

基本、quarterlyを使い、特定のときだけlatestを使うためには

上記の動作を踏まえ、基本、quarterlyを使い、特定のときだけlatestを使うためには、以下の方法がある。

A. 都度、レポジトリ設定ファイルを使い分ける。
B. マルチレポジトリにしつつ、インストール時に考慮をする。

ここでA.を選ぶと芸がないので、B.の方法を示す。
B.の方法と言っても、以下の通りでOK。

最初にquarterlyレポジトリからインストールする。
-rオプションで参照先レポジトリを明示すること。

pkgは、そのpackageをどこからインストールしたかを覚えている。
後に示す設定を変えない限り、アップグレードの際には同じレポジトリを参照してくれる。
だから、最初のインストールでquarterlyを選んでおけば、次回アップグレードのときにも、原則としてquarterlyが選ばれるというわけ。

これをコンサバティブアップグレード(conservative upgrade)といい、pkg.confでデフォルト有効になっている。

  CONSERVATIVE_UPGRADE: boolean
    Ensure in multi repository mode that the priority is given
    as much as possible to the repository where a package was
    first installed from.  Default: YES.

説明を読むと;

  To override this
  behaviour, on first installation of the package select the repository
  with the appropriate version:
     pkg install -r repo-a example-1.0.0
  and then to make updates to that package ``sticky'' to the same reposi-
  tory, set the value CONSERVATIVE_UPGRADE to true in pkg.conf.

「(常に高いバージョンを選ぶ)この動作を変更するには、最初のインストールで
-rオプションによりレポジトリを選ぶ。
その後のアップグレードで同じレポジトリを使うには、pkg.confの
CONSERVATIVE_UPGRADEでtrueを選べばよい。」

以上

[メモ] 写真、ホームビデオ等をため込んだFreeBSDホストのjailにPlex Media Serverをインストール

Pocket

件名の通り。
FreeBSDホストに格納してある写真、動画を各種メディアプレイヤー向けに公開したいが、オリジナルのホストを直接は公開したくないな、というときのため。
jailなら物理的に同じマシンを使いつつ、論理的には別マシンとして振る舞えるので適任である。

jailの作成

jailとくればezjailが定番だが、私はqjailが好き。
qjailについてはこちらを。

以下、qjail installまで終わっている前提で勧める。

flavorにssh-defaultを選んでplexという名前で作成。

$ sudo qjail create -f ssh-default -4 192.168.200.19 plex
Successfully created  plex
$ sudo qjail list

STA JID  NIC IP              Jailname
--- ---- --- --------------- --------------------------------------------------
DS  N/A  bge0 192.168.200.19     plex

jail plexをスタートし、pkgをインストール
インストールはとにかくpkgコマンドを叩けばOK。

$ sudo qjail start plex
Jail successfully started  plex
$ sudo qjail console plex
FreeBSD 10.2-RELEASE (GENERIC) #0 r286666: Wed Aug 12 15:26:37 UTC 2015

Welcome to your FreeBSD jail.
plex /root >
plex /root > pkg info
Bootstrapping pkg from pkg+http://pkg.FreeBSD.org/freebsd:10:x86:64/latest, please wait...
Verifying signature with trusted certificate pkg.freebsd.org.2013102301... done
[plex] Installing pkg-1.5.6...
[plex] Extracting pkg-1.5.6: 100%
Message for pkg-1.5.6:
If you are upgrading from the old package format, first run:

  # pkg2ng
(略)

plexmediaserverインストール

そのままplexmediaserverをインストール。
もちろん、マシンは64bitです。

plex /root >uname -a
FreeBSD plex 10.2-RELEASE FreeBSD 10.2-RELEASE #0 r286666: Wed Aug 12 15:26:37 UTC 2015     root@releng1.nyi.freebsd.org:/usr/obj/usr/src/sys/GENERIC  amd64
plex /root >pkg install plexmediaserver
(略)
The following 2 package(s) will be affected (of 0 checked):

New packages to be INSTALLED:
        plexmediaserver: 0.9.12.8.1362
        compat9x-amd64: 9.2.902000.201310
(略)
[plex] [1/2] Installing compat9x-amd64-9.2.902000.201310...
[plex] [1/2] Extracting compat9x-amd64-9.2.902000.201310: 100%
[plex] [2/2] Installing plexmediaserver-0.9.12.8.1362...
===> Creating users and/or groups.
Creating group 'plex' with gid '972'.
Creating user 'plex' with uid '972'.
[plex] [2/2] Extracting plexmediaserver-0.9.12.8.1362: 100%
Message for plexmediaserver-0.9.12.8.1362:
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *

multimedia/plexmediaserver includes an RC script:
/usr/local/etc/rc.d/plexmediaserver

TO START PLEXMEDIASERVER ON BOOT:
sysrc plexmediaserver_enable=YES

START MANUALLY:
service plexmediaserver start

Once started, visit the following to configure:
http://localhost:32400/web

* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
plex /root >

plexmediaserver起動

rc.confに一行加えてさっさと起動。

plex /root >sysrc plexmediaserver_enable=YES
plexmediaserver_enable:  -> YES
plex /root >service plexmediaserver start
Starting plexmediaserver.
plex /root >

ブラウザからhttp://<IPアドレス>:32400/webに繋ぐ。
もし「このサーバに権限(permission)がない」というようなことを言われたなら、以下のファイルを変更するといいかもしれない。
「かもしれない」というのは、以下の通り変更したら症状が改善したので、確認のために戻してみたら、二度と症状が再現しないから。
うーん…。

/usr/local/plexdata/Plex Media Server/Preferences.xml

Preferences (略)allowedNetworks="192.168.1.0/255.255.255.0"

いったんそのままにしておく。

plexmediaserver向けにディレクトリをマウント

jailから抜けてホスト側で作業
jailであるplexのファイルシステムは、ホスト側では/usr/jails/plexにある。
/usr/jails/plex/がjail plexのルートディレクトリ。
だからホストの/warehouseにデータがあるとして、/usr/jails/plex/mediaにマウントすれば、jail plexでは/mediaとして見える。

せっかくだからread onlyでね。

$ sudo mount_nullfs -o ro /warehouse /usr/jails/plex/media

jail plexから見えるのを確認したら、ホスト側のfstabに書き込み。

$ sudo sh -c "mount -p|grep /usr/jails/plex/media >> /etc/fstab"

あとはブラウザからplex media serverにつないで、メディアの追加で/mediaを選ぶだけ

以上

atomのpackageをproxyの背後からインストールするには(Windows 7)

Pocket

atomのpackage管理をproxy越えで行う方法を示す。
atomは1.01、Windows 7である。

atomのpackage管理について

atomのpackageはapm(atom package manager)で管理される。
proxyの背後からapmを使うには、ちょっと面倒な作業が必要だ。

apmはそれ自体で独立しているCUIプログラムである。atomの中の機能ではない。
だから、proxyの設定をしようとしたら、atomの設定を変更するのではなく、apmの設定を変更しないといけない。
つまり、atomのシャレオツなインタフェース経由ではなく、apmをコマンド操作したり、テキストファイルを修正することが必要だ。

なお、apmも実はwrapperなのだが、proxyの設定に限れば無視して構わない。

 

apmはどこにある?

apmは以下の場所にインストールされている。

<インストールディレクトリ>\Atom\resources\app\apm\bin\apm.cmd

拡張子が.cmdで、中身を見ると、実体は同ディレクトリにあるnode.exeであることが分かるが、ここでは関係ない。

コマンド操作をするならパスを通さないといけないところだが、面倒くさい。
どうせ滅多に使わないので、<インストールディレクトリ>\Atom\resources\app\apm\bin\ で作業をする。

apm helpで使い方の説明が表示される。

C:\Atom\resources\app\apm\bin>apm help

apm - Atom Package Manager powered by https://atom.io

Usage: apm 

where  is one of:
    clean, config, dedupe, deinstall, delete, dev, develop, docs, erase,
    featured, home, init, install, link, linked, links, list, ln, lns, login,
    ls, open, outdated, publish, rebuild, rebuild-module-cache, remove, rm,
    search, show, star, starred, stars, test, uninstall, unlink, unpublish,
    unstar, update, upgrade, view.

Run `apm help ` to see the more details about a specific command.

Options:
  --color        Enable colored output [boolean] [default: true]
  -v, --version  Print the apm version
  -h, --help     Print this usage message

  Prefix an option with `no-` to set it to false such as --no-color to disable
  colored output.
C:\Atom\resources\app\apm\bin>

 

apmの設定方法は二通り

apmの設定方法には二つの方法がある。
一つは、apmをコマンド操作する方法
もう一つは、設定ファイルを直接書き換える方法

一つ目の、コマンド操作での設定方法だが、結局のところ言われた通りに設定ファイルの書き換えをしている「だけ」なので、実施的な違いはない。
もう少し踏み込んでいうと、仮にコマンド操作で設定をしても、設定値の妥当性はいっさい、してくれない。
仮に間違った設定値を指定しても、言われた通りに設定ファイルに加えるだけなので注意。

 

【参考】apm設定ファイルのひな形作成

apmの設定は、ユーザごとのテキストファイル.apmrcで変更する。
ところが、インストール直後には、(ユーザごとの).apmrcは存在しない。
自分で作っても良いのだが、以下のようにするとひな形が作られる。

C:\Atom\resources\app\apm\bin>apm config edit

上記コマンドを実行すると、メモ帳が開き、.apmrcの内容が表示される。

何もしないで閉じてもよいし、後述するように、後で同じファイルを開くので、今ここで書き換えてしまってもよい。
書き換える場合は開きっぱなしにしておく。

なお、ひな形を作ったとしても、コマンド経由で書き換えた場合、コメント行はバッサリ削られてしまうようだ。

;;;;
; npm userconfig file
; this is a simple ini-formatted file
; lines that start with semi-colons are comments.
; read `npm help config` for help on the various options
;;;;

;;;;
; all options with default values
;;;;
; access=null
; always-auth=false
; bin-links=true
(略)

 

apm設定ファイル.apmrcの保存場所

前章の手順に沿うと、以下の場所に.apmrcが生成される。
いわゆるホームディレクトリである。

C:\Users\<ユーザ名>\.atom\.apmrc

なお、以下にも同じようなファイルがある。
が、これはデフォルト設定(global config)なので触ってはいけない。

C:\Users\<ユーザ名>\.atom\.apm\.apmrc

 

apm設定ファイルでproxy設定する場合

設定ファイルを直接書き換える場合には、上記のファイルを開き、以下の行を書き込むだけ。

proxy=http://<ID>:<password>@<address>:<port>
https-proxy=http://<ID>:<password>@<address>:<port>

httpsの接続で問題の出る場合には、以下も追加する。

strict-ssl = false

 

コマンドで設定する場合

apmを実行できる状態で、以下のようにコマンドを叩く

C:\Atom\resources\app\apm\bin>apm config set https-proxy="http://<ID>:<password>@<address>:<port>"
C:\Atom\resources\app\apm\bin>apm config set proxy="http://<ID>:<password>@<address>:<port>"

apm config listで設定内容を確認できる。

C:\Atom\resources\app\apm\bin>apm config list
(略)
; userconfig C:\Users\avedakedavra\.atom\.apmrc
https-proxy = "http://<ID>:<password>@<address>:<port>"
proxy = "http://<ID>:<password>@<address>:<port>"

もし設定変数を間違えてしまった場合には、以下のようにすれば削除できる。
(https-proxyとすべきところ、https-proproxyしてしまったと仮定)

C:\Atom\resources\app\apm\bin>apm config del https-proproxy

 

設定変数名について(https-proxy、proxy)

設定変数名について、webを検索すると、proxyではなくhttp-proxyだったり、https-proxyではなくhttps_proxy(httpsとproxyの間がアンダースコア)になっている情報もある。
少なくとも1.0.3の時点では、それぞれproxy, https-proxyが正しい。
ソースから確認できる。

https://github.com/atom/apm

[FreeBSD] 10.2-RELEASEから適用されるpkg quarterlyてなんだ。

Pocket

10.2-RELEASEから、pkgのデフォルト参照先レポジトリが”quartely”のものになる。

◎pkg.confの変更

-# $FreeBSD: releng/10.1/etc/pkg/FreeBSD.conf 263938 2014-03-30 15:29:54Z bdrewery $
+# $FreeBSD: releng/10.2/etc/pkg/FreeBSD.conf 285830 2015-07-23 23:31:40Z gjb $

 FreeBSD: {
-  url: "pkg+http://pkg.FreeBSD.org/${ABI}/latest",
+  url: "pkg+http://pkg.FreeBSD.org/${ABI}/quarterly",
}

ご覧のとおり、いままでは”latest”。
これは言わばpkgのheadのようなもので、最新のpkgは手に入るものの、うっかりインストールすると地雷を踏むことがが多かった。

quarterlyは上記の問題を解決するために設けられる。
中の人によれば「意図的に更新速度を控えめにすることで、問題の発生を抑える一方、セキュリティ更新は受け取れるようにする」とのこと。
もちろん、望ならば今まで通りlatestを参照することもできる。

“In general, the quarterly package set is less prone to having build failures, since the changes in the branch are (by intent) less intrusive, while still receiving security updates. “

latestからquarterlyに変更してバージョンチェックしてみると、すでにインストール済みのpackageからバージョンの下がるケースも見られた。

python27-2.7.10                    >   succeeds remote (remote has 2.7.9_1)

詳細は待て10.2-RELEASEのアナウンス。

“(This will be noted in the final 10.2-RELEASE announcement, as well as
the release notes, and will also include instructions on how to switch
to the ‘latest’ branch if that is what is desired.)”

中の人の発言は以下から引用。
https://lists.freebsd.org/pipermail/freebsd-stable/2015-July/082905.html

[Python] wxPythonで、タイトルバーにアイコンを表示するには

Pocket

Pythonからpy2exeなどでWindowsアプリケーションを作成したときに、アイコンを設定することができる。
しかし、作成したアプリケーションがGUI版の場合、GUIタイトルバーのアイコンを設定するには、ちょっとしたテクニックが必要である。
py2exe等でアイコン設定済み、かつGUIはwxPythonで作成している前提で、その方法を示す。

サンプル

class MyFrame(wx.Frame):
    def __init__(self, *args, **kwds):
	(略)
		if os.path.exists("myWxApp.exe"):
    		self.SetIcon(wx.Icon("myWxApp.exe",wx.BITMAP_TYPE_ICO))

Frameクラスの初期化defの中で、上記のような記載を加える。
もちろんmyWxApp.exeは最終的なファイル名。

説明

py2exe等でiconファイルを設定するというのは、つまり実行ファイルに埋め込むということ。
上記のようにSetIconで自分自身の実行ファイルを参照すると、埋め込んでおいたアイコンファイルを読み取ることができる。

元ネタ
How to use py2exe icon_resources in wxPython application?

【参考】wxPython

http://ja.wikipedia.org/wiki/WxPython
wxPythonは、「wxPythonはPythonで記述されたクロスプラットフォームなウィジェット・ツールキットである。」
要するにPythonをGUIで動かすツールキット。OSをまたがって使用できる。