Sunマイクロシステムズ様。realpath関係で怒られました。Solaris10でrealpathが使えるようになるには、以下の条件を満たす必要があるみたいです。__STRICT_ANSI__マクロが定義されます。/usr/include/sys/feature_tests.hをひもといていくと、_STRICT_STDCが定義されるので上記の条件(の2行目のやつ)を満たさなくなってしまうようです。ここ(manpage)を見ると色々書いてあります。これを回避するには以下の2つの方法があります。(正確にはもっとありますけど、試していません)__EXTENSIONS__を定義するstd=c99をstd=gnu99にするどれくらい影響範囲があるのか分からないので自己責任で好きな方を選択すれば良いと思います。前者の場合は、以下のようにconfigureで指定します。CFLAGS="-D__EXTENSIONS__"後者の場合は、configureとconfigure.inに記述されている内容を置換します。configure*あとは普通にビルドをします。libtokyocabinet.a出ている警告は全て動作に対して影響はありません。最初の2個の警告は前回の記事に回避策が書いてあります。Cabinetビルドしたらこのマクロももれなくついてきたので。実際のソースに対してやると何千行も出てきてしまいますが、以下の場合はその環境で最低限定義されるものが出てきます。/dev/nullちょっと気になった点について。1.4.2,3,4辺りでpthread_yield()の実装が毎回変更されていて今はusleepになっていますが、これってやっぱりusleepのが速いからなんでしょうか。Subversion例えばツールで、何かをバージョン管理したい時はバックエンドにSVNを使っていたりするのですが、Davによる自動コミットがONになっていない環境だとファイルの更新が面倒です。ファイルの追加はSVNコマンドでIMPORTを使えば可能ですが、既に存在するファイルの更新は事前にローカルのワークファイルが存在しないとコミットできません。いうわけで、既に登録されているファイルを、チェックアウトしなくても更新できるプログラムを書いてみました。本当はきちんとクラス化してあるのですが、長くなるので主要な部分を切り貼りしていきます。repos;}まずはファイルをSVNに追加するコードです。ファイルをSVNに追加する。cInfo;}次はSVNのファイルの内容を更新するコードです。上の登録のコードもそうですが、基本は差分(DELTA)を計算してそれを送信しているだけです。SVNのファイルの内容を更新する(変更する)。cInfo;}複数ファイルを変更する場合、上記のメソッドを複数回呼び出すと別々のコミットになってしまいます。editor.closeEdit()を複数回呼んでいるので、当然と言えば当然ですが。いうわけで、複数のファイルを1回で追加・更新するコードを書いてみます。その前にファイルが存在するかを確認するメソッドを追加します。RuntimeException(e);}}複数のファイルを良い感じに更新するメソッドです。BLOGにコードを書き写した時に手動で一部のメソッドを書き換えているのでコピペしても動かないかもしれません。事前にexists等を求めているのはlockメソッドでエラーが出るからです。SVNKitのバグかどうかは知りません。複数のファイルをSVNに追加する。ファイルが存在する場合は更新される。コミットは1回で行われる。cInfo;}使い方はこんな感じです。他のメソッドも同じ感じです。addFile(baseUrl,"test01.txt","test01_init_data".getBytes(),"プログラムからからファイルを追加してみる\nテスト。更新したいファイルの数だけList化すれば良いです。́)ノ/dev/pollのサンプルが全然なかったので、Sunのページとlibeventを参考にしました。http://software.schmorp.de/pkg/libev.html今更だけどlibevも見れば良かった・・。簡単なechoサーバのサンプルがあると嬉しかったのですが、見つけられなかった。環境的なところで詰まったのは、/usr/ccs/bin/ldだと-soname指定が上手く動かない事。--with-ldとか指定してもダメだったので、とりあえず以下のページを参考にして/usr/local/bin/ldにシンボリックリンクを張りました。Cabinet同様にconfigure中のstd=c99をstd=gnu99に変更。今は最初に確保した配列を全部/dev/pollのハンドラに書き込んでいるので、これを必要な分だけ登録する。(配列[fd].xxxxって処理してるのを0,1,2,と使うように変更する。)でもどっちが良いのかな・・。́ω・`*)─ン...あとは↑の配列の確保をcallocで処理しているので、終了時にメモリ解放のコードを入れてあげる。́・д・`))なんでcalloc使っているかと言うと、以下のようなコードで配列の添え字を求めているからです。rl.rlim_cur;もうちょっと負荷かけたりスレッド周りの検証したらコードも公開します。追加したコードはfprintfのデバッグコードも含めて100行くらいでした。23:00複数接続でIOがブロックされちゃうのと、切断時に何回もCLOSEを試みて↓のエラーが数秒出続けてしまう。その間は新規接続も受け付けてくれない・・。TyrantをSolaris10に対応させる方法として考えられる方針は以下になります。epoll_waitをエミュレートするソースを見るとkqueueの場合はepollのエミュレートをしていてepollに寄せているみたいなので、とりあえず/dev/pollの実装も寄せる方向で実装してみようと思います。Cabinetってなんぞ?という人は、http://tokyocabinet.sourceforge.net/このページを。Cabinetをビルドしようとしたらいろいろと怒られたので無理矢理ビルドを通してみました。正しい修正かどうかは知りません(*・ε・*)なので指摘は大歓迎です。Solaris」です。あとgccやccが混在していたり、いろいろ弄っていた環境なので実は素のSolarisだとすんなり通っちゃうのかもしれません。アーカイブをげっちゅ。tokyocabinet-1.4.1まずはconfigureを弄ります。これはrealpathが云々と怒られる対策です。std=c99をstd=gnu99にします。外から設定を与えない場合は1カ所の修正で大丈夫ですが、fastestの場合とか中で結構分岐していたので弄くり倒す予定の人は一括置換してください。-O2"Solaris10では「pthread_yield()なんて実装は排除しちゃったよ。あなたたちは違うんです。」という事らしいので、その代わりに「sched_yield」を使います。本当は「_POSIX_PRIORITY_SCHEDULING」が定義されているか確認して、定義されていれば↓を、そうでなければ別の代替実装をするのが正しいのかもしれません。sched_yield()#endif警告が気持ち悪いのでtcutils.cを弄ります。{PTHREAD_ONCE_INIT};あとはconfigureしてgmakeします。localtime_rの実装を有効にするために、LIBS="-lrt"はsched_yield関連で必要です。́)これで動いたら次はTokyoTyrantの/dev/poll対応してみます。Subversion普通にSubversionを設定するだけなら簡単ですが、Rootを持っていないサーバに対して設置して貰う場合は依頼内容を明確にしないといけないのでそのメモ。on</Location>HTTPSのみ受け付けるようにするには、以下の記述を追加する。/data/svn/proj1○コミットメールの設定コミットメールはhookディレクトリにpost-commitというファイルを作成します。検索するとRubyを使ってメールを送信しているものが多いですが、会社のサーバには標準インストールされていないのでPERLで書いてみます。これは別の記事に書こう。Subversion以下のコマンドでリビジョンを取得できます。ディレクトリ指定するディレクトリは.svnディレクトリが存在しなければいけません。-nオプションをつけると末尾の改行を出力しません。この機能を使って今回はビルドバージョンを埋め込むようにしました。具体的なコードは面倒なので書きませんが、Antで以下の手順で処理します。・リビジョン番号を取得する・コンパイルする→DESTディレクトリへ・必要なファイルをDESTへコピーする・DESTにあるXMLファイルへリビジョンを埋め込む・WARファイルを作成する・サーバへデプロイするこんな感じかな。正確にはXMLの設定ファイルに「svn.revesion」みたいな定数を定義して、その値を置換しています。(このXMLファイルの設定は実行時にDIで設定保持クラスにInjectしています)バイナリに埋め込む場合はコンパイルする前に埋め込まないといけないですね。これで共有環境のアプリがどのバージョンでコンパイルされたものなのか分かるようになりました。MySQLRDBで文字列にインデックスをそのまま張ってる事って結構あると思います。(普通はないかな?)例えばURLに対してINDEXを作った場合、1エントリに対してのインデックスの量が多くなってしまいます。そこでカラムを一つ追加して、その文字列のハッシュ値を格納するようにします。文字列のカラムにはインデックスを張りません。文字列カラム」とします。これでインデックスツリーが小さくなってDBサーバのメモリ効率が上がります。クライアントサイドでハッシュを求めることになりますが、クライアントサイドはスケール化が簡単な事と、ハッシュ値計算なんて微々たるものなので問題にはならないと思います。Javaの場合であればhashCode()メソッドがあるので自前でハッシュ関数を作る必要はありません。MySQLを例にしてみます。Javaすごく手抜き処理の動けばいいやー程度のやっつけコードです。Amazonこちらの公式リファレンスを見てBrowseNodeIdの一覧を取得していたのですが、どうにも結果がおかしいので調べてみると値がすっごい適当だという事が判明しました。いうわけで、アマゾンのTOPページからBrowseNodeIdを引っこ抜いてみました。́・ω・`)まぁレスポンスは全てキャッシュしてあるので無駄にはならないですけど・・。ためしにFreeMindの形式にしてみたら、項目が多すぎて(1万ノードくらい)ひどいことになった・・。Amazonアマゾンでは検索や購入のAPIの他にもいろいろなサービスを提供しています。今はアマゾンを使って本の管理をするアプリを作っていますが、その話は後日ということで今回はアマゾンの他のサービスを見てみたいと思います。サービスの種類を表にしてみました。WEB+DBの無断転載とも言います。WEB+DBの記事を書いた人のサイトはこちらです。ちなみにA2S(ECS)以外は有料です。書籍情報などを提供しているAPI郡。S3を使っているみたいなので気になりました。ダウンロードリストうーん・・。ドキュメント読んでないけど、このダウンロードリクエストというのはHTTPリクエストも含まれるのかな・・。EC2にマウントした場合もカウントされるのかな・・。使わないだろうから、調べるのはやめておこう。NFSLinux(UNIX)でネットワーク上にあるファイラーをマウントするときはNFSを使います。ちなみにWindowsから見たい場合はSambaを使います。NFSとSambaの違いは、、、NFSはメッセージ単位でやりとりするのに対して、Sambaはファイル単位でやりとりをする事ですかね。いうわけでファイルサーバにあるディレクトリを別のサーバにマウントしてみたいと思います。○tamsvr01ファイラー(1.5TB)FedoraCore5○tamsvr02FedoraCore8(64Bit)まずはtamsvr01(ファイラー)の設定nfsのサービスが入っているのでそれを使います。書式は以下のようになります。rwで設定していますが、roにすれば読み込み専用になります。192.168.1.0/255.255.255.0(rw)サービスを有効にします。start次はtamsvr02の設定です。defaults次はトラブル系です。なんてやっても帰ってこなくなりました。その解決策としては、tamsvr01(共有元)の/etc/exportsから対象の記述を消してreloadなりrestartなりします。これで何とかなりました。最初から同期とっているので分かりません・・。WebDavLinuxの設定ファイルをSubversionで管理したいと思います。以下のようなケースで困った事が起こったのでその解決策としてのメモを残しておきます。commitでもファイル単位なので、例えばtomcatのserver.xmlだけを対象としたい場合に困る。サーバ側の設定ファイル置き場に.svnが出来てしまう。単純に保存するだけならimportで十分だが、上書きができない。■理想importで上書きしてほしい→そんなん無理です。■解決策WebDAVと自動コミットを使って解決するそうでした・・・。WebDAVを使えば自動コミットが出来るのでした。WebDAVクライアントからファイルをPUTすれば勝手にSVNにコピーされます。いうわけで、早速設定してみました。webdavのクライアントが必要です。Windowsでは標準でしょぼいクライアントがついてきますが、サーバはLinuxなのでLinuxのWebDAVクライアントを探しました。cadaverというのが有名みたいです。Fedora8ではyumからインストールできます。便利!次にApache(WebDAV)の設定をします。設定全部をさらすと私の場合はこんな感じです。(必要に応じて自分の設定に変更してください。valid-user</Location>これで設定は完了です。Apacheの設定をreloadしてLinuxのcadaverからアクセスしてみたいと思います。quit=exit=byeSubversionのレポジトリがWebDAVとして公開してあるので、cadaverでURLを指定して実行します。証明書がオレオレ証明書かつ有効期限が切れているので警告が出ています。(会社からアクセスする時に中身を閲覧されたくないのでSSL暗号を使うためだけにHTTPSにしてます)YESを選択して、ユーザー名とパスワードを入力します。認証が成功したらFTPのようにWebDAVプロンプトが出てきます。どんなコマンドが使えるのか確認するためにhelpを実行してみました。コマンドがFTPに似ていますね。ローカルファイルをリモートにアップロードするコマンドはputなので、putを実行してみます。その前に、自動コミットで正しくリビジョンがあがるのか確認するために、一度ファイルをインポートしてみます。https://tamsvr01/svn/repos/settings/tamsvr02/server.xml次にWebDAVクライアントからputしてみます。