まじ忘れるので、めも

https://golang.org/pkg/go/build/

that lists the conditions under which a file should be included in the package. Constraints may appear in any kind of source file (not just Go), but they must appear near the top of the file, preceded only by blank lines and other line comments. These rules mean that in Go files a build constraint must appear before the package clause.

To distinguish build constraints from package documentation, a series of build constraints must be followed by a blank line.

罠だろこれ

MacVimをBuildした時のメモ

香り屋さんのMacVimのPythonが2.6ベースだったので、2.7にしたいなぁと、Buildし直したですよ。そしたら、まあ、色々大変だったので、忘れないうちにメモを。

まず、gitから持ってきて、さあコンパイルと makeしたら、ja_JP.UTF-8.moがねーよとエラーがでた。

../po/ja_JP.UTF-8.mo: No such file or directory

こんな感じ。これは、msgfmt、msgmergeあたりが無いのが原因らしい。

じゃ、入れてやるか、と。
brew install gettext
brew link gettext
これで入る。通常なら、installだけでいいけど、gettextは、linkもしないと駄目。先に進んで、makeして、ようやく、できたと喜んで起動したら、今度は migemoが使用できないよとエラー

ぐぬぬ。無視しても良いかなと思ったけど、なんかしゃくなので、cmigemoをいれる。

brew search cmigemo
export CPPFLAGS=-I/usr/local/include/

configureが/usr/local/includeを読んでくれないので、CPPFLAGSを設定して、configue

./configure --with-features=huge --enable-multibyte --enable-rubyinterp --enable-pythoninterp --enable-perlinterp --enable-cscope --with-tlib=ncurses --with-macarchs=x86_64
make

これで、おk
まとめると、

git clone git://github.com/splhack/macvim.git
cd macvim/src
brew install gettext
brew link gettext
brew search cmigemo
export CPPFLAGS=-I/usr/local/include/
./configure --with-features=huge  --enable-multibyte --enable-rubyinterp --enable-pythoninterp --enable-perlinterp  --enable-cscope --with-tlib=ncurses --with-macarchs=x86_64
make

まあ、よかったよ。;-p

CentOS 5.7 x86_64 版でchroot

あるサーバをファイルサーバとして使いたいという要望があって、いろいろ考えたんですが、chrootで一部解放することにしました。さくっと設定して終わりかと思ったのですが、なかなかどうして、一部引っかかったところがありましたので、備忘として記述しておきます。

環境がCentOS 5.7 x86_64でありまして、標準のopensshだと、chrootできないとのことなので、rpmbuildしてインストールしてあげました。まあ、インストール方法は、いろいろなところで紹介されていますので、詳しくは省きます。で、まずはじめの引っかかりポイントですが、2012年2月時点の最新版のopenssh-5.9p1-1だと、このbuildに失敗します。

cp: cannot stat `WARNING*': そのようなファイルやディレクトリはありません
エラー: /var/tmp/rpm-tmp.15281 の不正な終了ステータス (%doc)
ファイルの処理中: openssh-clients-5.9p1-1
Provides: config(openssh-clients) = 5.9p1-1

Obsoletes: ssh-server
ファイルの処理中: openssh-debuginfo-5.9p1-1
伸張ファイルの検査中: /usr/lib/rpm/check-files /var/tmp/openssh-5.9p1-buildroot


RPM ビルドエラー:
/var/tmp/rpm-tmp.15281 の不正な終了ステータス (%doc)

なんてこったい。えっと、WARNINGが無くなっとりますがな。
contrib/redhat/openssh.specの

%doc CREDITS ChangeLog INSTALL LICENCE OVERVIEW README* PROTOCOL* TODO WARNING*

%doc CREDITS ChangeLog INSTALL LICENCE OVERVIEW README* PROTOCOL* TODO

に変更してあげます。

再びbuild。まあ、あとは、CPUさん頑張ってで、rpmが出来上がるまで待ちます。出来上がって、

rpm -Uvh /usr/src/redhat/RPMS/x86_64/openssh-5.9p1-1.x86_64.rpm
rpm -Uvh /usr/src/redhat/RPMS/x86_64/openssh-clients-5.9p1-1.x86_64.rpm
rpm -Uvh /usr/src/redhat/RPMS/x86_64/openssh-server-5.9p1-1.x86_64.rpm

みたいな感じで、インストールすれば、OK.
で、お決まりの chroot-adduser スクリプトを貼付けて、userの作成っと。

cp: cannot create regular file `lib/': ディレクトリです
cp: cannot create regular file `lib/': ディレクトリです
cp: cannot create regular file `lib/': ディレクトリです
cp: cannot create regular file `./lib/': ディレクトリです
cp: cannot create regular file `lib/': ディレクトリです
cp: cannot create regular file `lib/': ディレクトリです
cp: cannot create regular file `lib/': ディレクトリです
cp: cannot create regular file `lib/': ディレクトリです
cp: cannot create regular file `lib/': ディレクトリです

またエラーがでてますよ><
あー、libじゃなく、lib64だよね。ということで、

cp /lib64/libnss_compat.so.2 lib64/
cp /lib64/libnsl.so.1 lib64/
cp /lib64/libnss_files.so.2 lib64/
cp /lib64/ld-linux.so.2 ./lib64/
cp /lib64/libc.so.6 lib64/
cp /lib64/libm.so.6 lib64/
cp /lib64/libpthread.so.0 lib64/
cp /lib64/librt.so.1 lib64/
cp /lib64/libthread_db.so.1 lib64/

と修正。再度実行...

cp: cannot stat `/lib64/ld-linux.so.2': そのようなファイルやディレクトリはありません

なんてこったい。なんでないの?

cp /lib64/ld-linux.so.2 ./lib64/

じゃなくって、

cp /lib64/ld-linux-x86-64.so.2 lib64/

ですがな。ということで、最終的には、

cp /lib64/libnss_compat.so.2 lib64/
cp /lib64/libnsl.so.1 lib64/
cp /lib64/libnss_files.so.2 lib64/
cp /lib64/ld-linux-x86-64.so.2 lib64/
cp /lib64/libc.so.6 lib64/
cp /lib64/libm.so.6 lib64/
cp /lib64/libpthread.so.0 lib64/
cp /lib64/librt.so.1 lib64/
cp /lib64/libthread_db.so.1 lib64/

後は、鍵なりを設定して、使用してもらえばokですね。;)

Eclipse で GAE 1.6 + Python 2.7 + Django 1.2

環境を作る機会があったので、メモとして残しておきます。main.pyに気をつければ、特に難しいことはないです。

インストール

当たり前の話ですが、EclipseおよびPyDev、Python 2.7、GAE SDK 1.6を入れておく必要があります。この際の注意点は、Djangoのインストールが必要ないということです。*1

プロジェクト

PyDev Google App Engine Project で、プロジェクトを作ってやります。空のプロジェクトでOKです。特に難しいところはないですが、${GOOGLE_APP_ENGINE}のパスは、覚えておくほうがいいです。

GAE

GAEで必要なファイルをカレントに作ります。

application: gae_application_id
version: 1
runtime: python27
api_version: 1
threadsafe: true

libraries:
- name: django
  version: "1.2"

handlers:
- url: /.*
  script: main.app
  • main.py
import os
import sys

path = 'src'
if path not in sys.path:
  sys.path.append(path)

os.environ['DJANGO_SETTINGS_MODULE'] = 'djangoproj.settings'

import django.core.handlers.wsgi
app = django.core.handlers.wsgi.WSGIHandler()

app.yamlは、Python2.7用になっています。main.pyでpathの設定していますが、これは、Eclipseのsrcディレクトリ内にDjangoをおくための処置です。srcディレクトリを使わないなら必要ありません。

Django

GAEのdjango-admin.pyを使います。Djangoのパス*2を通しておく必要があります。
Eclipseのsrcディレクトリ上で、

$ django-admin.py startproject {djangoproj(任意)}
$ cd djangoproj
$ django-admin.py startapp {djangoapp(任意)}

として、Djangoの環境を整えてやります。これで、好きなようにDjangoを使えるはずです。

一応、以降、確認用にコードを書いておきます。

  • src/djangoproj/djangoapp/views.py
from django.http import HttpResponse
def index(request):
  return HttpResponse("Hello World.")
  • src/djangoproj/settings.py
:
ROOT_URLCONF = 'djangoproj.urls'
:
INSTALLED_APPS = (
  'django.contrib.auth',
  'django.contrib.contenttypes',
  'django.contrib.sessions',
  'django.contrib.sites', 
  'django.contrib.messages',
  'djangoproj.djangoapp',
)
  • src/djangoproj/urls.py
from django.conf.urls.defaults import *
urlpatterns = patterns('',
  (r'^$', 'djangoproj.djangoapp.views.index'),
)

最終的なディレクトリはこんな感じ。

gae_application_id\
├ src\
│ └ djangoproj\
│  ├ djangoapp\
│  │ ├ __init__.py
│  │ ├ models.py
│  │ └ views.py
│  ├ __init__.py
│  ├ manage.py
│  ├ settings.py
│  └ urls.py
├ app.yaml
├ favicon.ico
└ main.py

Eclipseの実行環境を整えてやれば、たぶんこれで動くはず。:P

*1:GAE SDKDjangoを使うので、PATHや、PYTHONPATHを設定しておく必要があります。

*2:PATHに、${GOOGLE_APP_ENGINE}/lib/django_1_2/django/bin、PYTHONPATHに、${GOOGLE_APP_ENGINE}/lib/django_1_2

undefined reference to `sync_file_range'

CentOS 5.6 でのお話です。たぶん、CentOS 5系であれば、同じ結果になるのではないかな思います。
node.jsのv0.5.1を本家からダウンロード(http://nodejs.org/dist/v0.5.1/node-v0.5.1.tar.gz)して、makeをすると、


/usr/local/src/node-v0.5.1/build/default/deps/uv/src/eio/eio.c:923: undefined reference to `sync_file_range'
collect2: ld はステータス 1 で終了しました
Waf: Leaving directory `/usr/local/src/node-v0.5.1/build'
Build failed: -> task failed (err #1):
{task: cxx_link node_main_5.o,node_5.o,node_buffer_5.o,node_javascript_5.o,
node_extensions_5.o,node_http_parser_5.o,node_constants_5.o,node_events_5.o,
node_file_5.o,node_script_5.o,node_os_5.o,node_dtrace_5.o,node_string_5.o,
timer_wrap_5.o,tcp_wrap_5.o,cares_wrap_5.o,node_cares_5.o,node_net_5.o,
node_signal_watcher_5.o,node_stat_watcher_5.o,node_io_watcher_5.o,node_stdio_5.o,
node_child_process_5.o,node_timer_5.o,platform_linux_5.o,node_crypto_5.o,
http_parser_3.o -> node}

make: *** [program] エラー 1

と、いわれて*1コンパイルエラーになります。:P

あれ?と、思って少し調べてみると、undefined reference to `sync_file_range'は、RHEL5のBugのバグのようです。
518581 – [RHEL5] glibc misses sync_file_range syscall interface


この問題、glibc を2.6にするという対処方もあるようですが、明らかにめんどくさいので根本的な原因をつかんで、対象してみました。
結論としては、sync_file_rangeの使用判断をしているファイル、

deps/uv/src/eio/config_linux.h

を書き換えてしまえばOKです。マクロ HAVE_SYNC_FILE_RANGE でsync_file_rangeの使用可能判断をしていますので、これをちょこっと変えてあげればコンパイルできます。

変更方法は、

#define HAVE_SYNC_FILE_RANGE LINUX_VERSION_AT_LEAST(2, 6, 17)

となっている部分をコメントアウトしてしまってもいいのですが、汎用的に変更する方法がFix to check glibc version for HAVE_SYNC_FILE_RANGE by shigeki · Pull Request #1338 · nodejs/node-v0.x-archive · GitHubに載っています。「glibcを使用している場合は、version2.6以降でないと、sync_file_rangeは、使用しませんよ。」という変更を加えるだけです。簡単ですね。:)

なお、v0.4.xだと、./configureの際、sync_file_rangeが使用できない事を確認します*2が、v.0.5.x系の場合は、headerファイルのマクロ内でkernelバージョンだけで判断しているということが影響しているようです。

*1:見難いので手動で改行入れています。

*2:詳しい確認はしていません

sudoを使用時の環境変数PATHの設定

node.jsをインストール・設定している時に気がついたのですが、いつのころからか、sudoを使用する時の環境変数PATHが引き継がれないようです。
調べてみると、いくつかの対応方法があるようです。

  • aliasで対応する方法
alias sudo="sudo env PATH=$PATH"
  • /etc/sudoersを変更する方法(下記を/etc/sudoersに追加)
Defaults    env_keep += "PATH"

/etc/sudoersを変更する方が根本な解決方法ですが、sudo使用者すべてに影響があります。
まあ、sudoを使用出来る権限で、PATHを制限する必要はあまりないような気もしますけどね :p