subversionのサーバを移行する手順

svnのサーバを別のマシンにする必要があったので、自分用メモ。
Ubuntu server 9.10 => Debian GNU/Linux 6.0

旧サーバのUbuntu側で
svnadmin dump /var/svn/レポジトリ名 | gzip > ./レポジトリ名.gz
てのをレポジトリ毎にやって
新サーバのDebianで
svnadmin create /var/svn/レポジトリ名
をレポジトリ分やって
gzip -dc レポジトリ名.gz | svnadmin load /var/svn/レポジトリ名
でバックアップを復元する。

後は、参照先を新しいサーバに変更する。
svn switch –relocate –username ユーザ名 svn://古いサーバ/レポジトリ/ svn://新しいサーバ/レポジトリ/

TracのCommitTicketUpdaterで利用できるコマンド一覧と書き方のまとめ

TracのCommitTicketUpdaterで利用できるコマンド一覧と書き方のまとめ。

Tracでチケットの管理をする際にコミットログからチケットの関連、クローズを管理するときに利用できる書式とコマンドをまとめる。

これってプラグインのところに記述があるんだけど、あれ、なんだったかな、ってなりやすいのでココにメモメモ。

まず書式は以下の二種類。チケットの書き方が#1ってやつと、ticket:1っていう二通りあるみたい。

下は#(たぶんシャープ(ハッシュ)じゃなくてナンバーの方)を使った書き方

command #1
command #1, #2
command #1 & #2 
command #1 and #2

そしてこちらがticket:1方式。

command ticket:1
command ticket:1, ticket:2
command ticket:1 & ticket:2 
command ticket:1 and ticket:2

それぞれにあるコマンドは、チケットの参照、もしくはクローズさせるときに使う。

参照、クローズのコマンドは以下の通り。

クローズ用

close, closed, closes, fix, fixed, fixes

参照用

references, refs, addresses, re, see

英語なのであまり違いがわからないけど、自然な文章で書くためにいくつか用法があるみたいだね!

wordpressで子テーマが有効にならない。

wordpressで子テーマが有効にならない on wordpress 3.1.1

自分でちょっとだけ変更したい内容があったので子テーマを作ってはみたものの、どうしてもそれが反映されない。

最初は自分のところのどこかしらかが悪いのかと疑ってみたりして、再インストールとかをしてみたけれど直らない。

結局のところプラグインが原因だった。GYS Themed Categoriesというプラグインを使っていたんだけれど、コレを無効化したらちゃんと子テーマが反映されるようになった。

 

めでたしめでたし。

yubird

Ubuntuにsshでログインした時の長ったらしいmotdを無効化

Ubuntuにsshでログインすると

Linux victorique 2.6.32-31-server #61-Ubuntu SMP Fri Apr 8 19:44:42 UTC 2011 x86_64 GNU/Linux
Ubuntu 10.04.2 LTS

Welcome to the Ubuntu Server!
* Documentation: http://www.ubuntu.com/server/doc

System information as of Fri Apr 22 19:47:51 JST 2011

System load: 0.08 Processes: 66
Usage of /: 13.8% of 7.49GB Users logged in: 0
Memory usage: 44% IP address for eth0: 192.168.34.13
Swap usage: 0%

Graph this data and manage this system at https://landscape.canonical.com/
*
*
*

みたいな長いmotdが表示される。
こんなのあまり見ないので、無効にしたかったけど、ぐぐってもそれらしい情報が見つかりにくいのでメモ。

調べてみると、これはPAMがやってるらしいので、PAMの設定を探してみると
/etc/pam.d/sshd にそれらしき項目があった。
session optional pam_motd.so # [1]

この行をコメントアウトしてsshでログインしてみると、表示されるmotdは

Last login: Fri Apr 22 19:47:51 2011 from 192.168.34.1

のみになって、すっきりした。

ToolTipのスタイルをクラスセレクタで分けて使う

こっちに出すToolTipはこのスタイルで、あっちのはまた別のスタイルで。ということをやろうと思ったら、ちょっとだけ回り道しないといけないみたいだったのでメモ。(実は回り道しなくてもできるのかもしれないが……)

<?xml version="1.0" encoding="utf-8"?>
<s:WindowedApplication xmlns:fx="http://ns.adobe.com/mxml/2009" 
					   xmlns:s="library://ns.adobe.com/flex/spark" 
					   xmlns:mx="library://ns.adobe.com/flex/mx">
	<s:layout>
		<s:HorizontalLayout/>
	</s:layout>
	
	<fx:Style>
		@namespace s "library://ns.adobe.com/flex/spark";
		@namespace mx "library://ns.adobe.com/flex/mx";
		
		mx|ToolTip.black {
			background-color: #000000;
			color: #FFFFFF;
		}
		mx|ToolTip.red {
			background-color: #FF0000;
			color: #FFFFFF;
		}
	</fx:Style>
	
	<fx:Script>
		<![CDATA[
			import mx.controls.ToolTip;
			import mx.events.ToolTipEvent;
			
			private function setStyleName(event:ToolTipEvent, styleName:String):void {
				if (!styleName) {
					return;
				}
				var tip:ToolTip = new ToolTip();
				tip.styleName = styleName;
				event.toolTip = tip;	//クラススタイルを指定したToolTipを渡す
			}
		]]>
	</fx:Script>
	
	<s:Button label="1" toolTip="hoge" toolTipCreate="setStyleName(event, 'black')" />
	<s:Button label="2" toolTip="hogehoge" toolTipCreate="setStyleName(event, 'red')" />
</s:WindowedApplication>

マウスオーバーになってからToolTipが表示されるまでの時間を変更する場合は、

ToolTipManager.showDelay = 200;   //ミリ秒

と書く。

Ubuntu server 10.04LTSでLDAPサーバ構築(2)

続き。PAM関連の設定。とりあえずLDAPでログイン出来るようにしてみる。

必要なパッケージのインストール
sudo apt-get install libnss-ldap
途中、対話式に設定をする画面になるので、設定する。
必要なら完了後、sudo dpkg-reconfigure ldap-auth-configで再度設定できる。
LDAPログインを有効にする
sudo auth-client-config -t nss -p lac_ldap
/etc/pam.d/common-passwordの編集
26行目
password [success=1 user_unknown=ignore default=die] pam_ldap.so authtok try_first_pass
の、authtokを消去。
ユーザは存在するがホームディレクトリが存在しない場合に、自動でホームディレクトリを作成するようにする。
/etc/pam.d/にあるcommon-sessionとcommon-session-noninteractiveに追記
session required pam_mkhomedir.so skel=/etc/skel umask=0022
PAMのアップデート
sudo pam-auth-update

これで、frontend.ldifに記述したテストユーザでログイン出来た。

ByteArray.readBytes と ByteArray.writeBytes

その前に FLVの分割方法を調べ中 の続き。

前回書いた通り、

  1. 適当な長さのByteArrayからキーフレームを探し出して
  2. キーフレームになっている FLV Tag(Video) から、終わりにしたい場所にあるキーフレームの直前の FLV Tag までを抜き出して
  3. 抜き出してきたByteArrayの先頭にFLV Header(46 4C 56 01 05 00 00 00 09) + FLV Stream(00 00 00 00)を書き足して
  4. ファイルに書き出し。

という感じで動くものができあがりました。

1つのFLVを4つくらいに分割したすると、2つ目の分割ByteArray以降は 2. の処理の後に FLV Tag のtimestamp(再生開始ミリ秒)の値を書き換える処理が入るくらいです。

今後の課題:

FLV Tag(Meta) を生成して、分割したファイルそれぞれに入れるようにする。

メモリの使い方をもうちょっと考えてコードを修正する。

分割されているファイルを1つに結合する処理も作る。

対応ファイルフォーマットを増やす。


で、これを書いているときに readBytes とか writeBytes をたくさん使いまして、ごちゃごちゃやっているうちに軽く混乱したのでまとめておきます。

var data:ByteArray = new ByteArray();
data.writeInt(0xAABBCCDD);
data.position = 0;
var ba:ByteArray = new ByteArray();

こういうコードがあったとして、data の値を ba にコピーしたいときに

data.readBytes(ba);

または

ba.writeBytes(data);

でコピーできます。

それでなんですが、このときにどちらを使うかをさして意識せずに使っているうちに data.position や ba.position の値の変わり方に混乱してしまいました。

data.readBytes(ba);  //data.position 変わる。 ba.position 変わらない。
ba.writeBytes(data);  //ba.position 変わる。 data.position 変わらない。

ちょっと落ち着いて考えれば、メソッドを持っているオブジェクトのpositionプロパティが変わるのはそうだよなと納得できますし、引数の方も省略なしの ByteArray.xxxBytes(bytes:ByteArray, offset:uint=0, length:uint=0) を眺めれば変わらないだろうなと予測できるんですけどね。

今後は気にしながら書くのでもう大丈夫だと思いますが、また混乱とか勘違いしながら書いてたらバグる!ということでメモしておきます。

Ubuntu server 10.04LTSでLDAPサーバ構築(1)

LDAP的な物をインストール
sudo aptitude install slapd
sudo aptitude install ldap-utils
よくわからないけど、スキーマをロードするよう色々なサイトに書いてあった。
sudo ldapadd -Y EXTERNAL -H ldapi:/// -f /etc/ldap/schema/cosine.ldif
sudo ldapadd -Y EXTERNAL -H ldapi:/// -f /etc/ldap/schema/nis.ldif
sudo ldapadd -Y EXTERNAL -H ldapi:/// -f /etc/ldap/schema/inetorgperson.ldif
backend.ldifを作成
exampleとかcomとかの部分は環境に合わせて。
参考までに書き換えた行には印付けておく。

# Load dynamic backend modules
dn: cn=module,cn=config
objectClass: olcModuleList
cn: module
olcModulepath: /usr/lib/ldap
olcModuleload: back_hdb

# Database settings
dn: olcDatabase=hdb,cn=config
objectClass: olcDatabaseConfig
objectClass: olcHdbConfig
olcDatabase: {1}hdb
olcSuffix: dc=example,dc=com # 書き換え
olcDbDirectory: /var/lib/ldap
olcRootDN: cn=admin,dc=example,dc=com # 書き換え
olcRootPW: secret # 書き換え
olcDbConfig: set_cachesize 0 2097152 0
olcDbConfig: set_lk_max_objects 1500
olcDbConfig: set_lk_max_locks 1500
olcDbConfig: set_lk_max_lockers 1500
olcDbIndex: objectClass eq
olcLastMod: TRUE
olcDbCheckpoint: 512 30
olcAccess: to attrs=userPassword by dn="cn=admin,dc=example,dc=com" write by anonymous auth by self write by * none # 書き換え
olcAccess: to attrs=shadowLastChange by self write by * read
olcAccess: to dn.base="" by * read
olcAccess: to * by dn="cn=admin,dc=example,dc=com" write by * read # 書き換え

作成したbackend.ldifをロード
sudo ldapadd -Y EXTERNAL -H ldapi:/// -f backend.ldif
frontend.ldifを作成
backendと同じく書き換えた部分には印を付けておく。
# Create top-level object in domain
dn: dc=example,dc=com # 書き換え
objectClass: top
objectClass: dcObject
objectclass: organization
o: Example Organization
dc: Example
description: LDAP Example

# Admin user.
dn: cn=admin,dc=example,dc=com # 書き換え
objectClass: simpleSecurityObject
objectClass: organizationalRole
cn: admin # 書き換え
description: LDAP administrator # 書き換え
userPassword: secret # 書き換え

dn: ou=people,dc=example,dc=com # 書き換え(peopleをusersにしてみた)
objectClass: organizationalUnit
ou: people # 書き換え

dn: ou=groups,dc=example,dc=com # 書き換え
objectClass: organizationalUnit
ou: groups

# この辺がユーザだと思う
dn: uid=john,ou=people,dc=example,dc=com # 書き換え
objectClass: inetOrgPerson
objectClass: posixAccount
objectClass: shadowAccount
uid: john # 書き換え
sn: Doe # 書き換え
givenName: John # 書き換え
cn: John Doe # 書き換え
displayName: John Doe # 書き換え
uidNumber: 1000 # 書き換え
gidNumber: 10000 # 書き換え
userPassword: password # 書き換え
gecos: John Doe # 書き換え
loginShell: /bin/bash
homeDirectory: /home/john # 書き換え
shadowExpire: -1
shadowFlag: 0
shadowWarning: 7
shadowMin: 8
shadowMax: 999999
shadowLastChange: 10877
mail: [email protected]
postalCode: 31000
l: Toulouse
o: Example
mobile: +33 (0)6 xx xx xx xx
homePhone: +33 (0)5 xx xx xx xx
title: System Administrator
postalAddress:
initials: JD

dn: cn=example,ou=groups,dc=example,dc=com # 書き換え
objectClass: posixGroup
cn: example # 書き換え
gidNumber: 10000

作成したfrontend.ldifをロード
sudo ldapadd -x -D cn=admin,dc=example,dc=com -W -f frontend.ldif
ユーザが追加されたか確認
ldapsearch -xLLL -b “dc=example,dc=com” uid=john sn givenName cn

ここまでの手順は丸々
https://help.ubuntu.com/10.04/serverguide/C/openldap-server.htmlを参考にした。

FreeBSDでtracを動かそうとしたときに起きたエラーについて

FreeBSDでtracを動かそうとしたときに起きたエラーについて。

ホームディレクトリが存在しないユーザでpythonを実行するとエラーになる件。pythonのことをよくしらないけど、厳密にはpythonのエラーではなくeggのエラー?になるような気がする。

以下エラーメッセージ


shell> sudo -u www python
Python 2.6.6 (r266:84292, Mar 16 2011, 02:49:37)
[GCC 4.2.1 20070719  [FreeBSD]] on freebsd8
Type "help", "copyright", "credits" or "license" for more information.
>>> import MySQLdb
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "build/bdist.freebsd-8.2-RELEASE-amd64/egg/MySQLdb/__init__.py", line 19, in <module>
File "build/bdist.freebsd-8.2-RELEASE-amd64/egg/_mysql.py", line 7, in <module>
File "build/bdist.freebsd-8.2-RELEASE-amd64/egg/_mysql.py", line 4, in __bootstrap__
File "build/bdist.freebsd-8.2-RELEASE-amd64/egg/pkg_resources.py", line 882, in resource_filename
File "build/bdist.freebsd-8.2-RELEASE-amd64/egg/pkg_resources.py", line 1351, in get_resource_filename
File "build/bdist.freebsd-8.2-RELEASE-amd64/egg/pkg_resources.py", line 1373, in _extract_resource
File "build/bdist.freebsd-8.2-RELEASE-amd64/egg/pkg_resources.py", line 962, in get_cache_path
File "build/bdist.freebsd-8.2-RELEASE-amd64/egg/pkg_resources.py", line 928, in extraction_error
pkg_resources.ExtractionError: Can't extract file(s) to egg cache

The following error occurred while trying to extract file(s) to the Python egg
cache:

[Errno 17] File exists: '/nonexistent'

The Python egg cache directory is currently set to:

/nonexistent/.python-eggs

Perhaps your account does not have write access to this directory?  You can
change the cache directory by setting the PYTHON_EGG_CACHE environment
variable to point to an accessible directory.

このエラーは、www, svnといったホームディレクトリを持たないユーザがpythonを使ったスクリプトを実行したときに遭遇する。 たとえばtrac-adminをwwwユーザで実行したとき、またsubversionでコミット時のフック、hooks/post-commitのところでもエラーがでてたりする。 今回はpost-commitのあとtrac-svn-hookを呼び出していたので、ログがtrac/log/svn-hooks-testrep.logにエラーが出ていた。コレに書いてあるだけで他にはwarningとか出ないのでなかなか気づかなかった。


shell> tail svn-hooks-testrep.log

Changeset 4 added
Traceback (most recent call last):
File "/usr/local/lib/python2.6/logging/handlers.py", line 796, in emit
self.socket.send(msg)
error: [Errno 40] Message too long
TracError: Unsupported database type "mysql"
FAILED: see the Trac log

同様にwwwユーザでtrac-adminを走らせてもエラーがでる。


> sudo -u www trac-admin /path/to/trac repository resync testrep
Traceback (most recent call last):
File "/usr/local/lib/python2.6/logging/handlers.py", line 796, in emit
self.socket.send(msg)
error: [Errno 40] Message too long
TracError: Unsupported database type "mysql"

で、解決方法は・・・、一筋縄ではいかない。 それぞれのユーザにホームディレクトリを持たせるのが一番手っ取り早い。でもこれらのユーザをnisで管理してたらそこも一斉に書き換わっちゃう。 いらないところは最小限に、ってことで、該当するホストに/nonexistentフォルダを作ってみる。いいのかな、こんなやりかたで・・・。


shell> sudo mkdir /nonexistent
shell> sudo chmod 777 /nonexistent/

ひとまずこれで動いた。 おしまい。