コレクションを識別するための名前です(文字列です)。Identifierと内部的に1:1に対応しています。命名規則は先頭が英字で他は英数かアンダーバー、ハイフンで構成されます。ハイフンを除けば常識的なプログラミング言語の変数名の規則と同じです。Documentを識別するための内部ID(整数型です)。これを直接使うことはほとんどありません。↓のDocumentHandleを通常は使います。Documentを識別するためのHandle名(文字列です)。DocumentIDとなります。Version)のバージョン番号にあたるものです。Etagを併せて説明しないといけないのですが、今回は省略します・・。HTTP-RESTのInterfaceではCollectionNameもCollectionIDも両方サポートしています。Documentの実際の値はJSONになります。JSONObjectでも、JsonArrayでも大丈夫ですし、AvocadoDBはKVSでもあるのでJSONの要素(文字列、整数、Boolean、NULL)も受け付けます。GraphDBとしてのAvocadoDBも説明します。Graph構造はVertexとEdgeで構成されます。VertexはDocumentに相当します。Edgeは専用で作るAPIが存在します。有向グラフか無向グラフ(要はエッジの向きがあるか無いか)はEdgeを作るときには指定できません。基本は有効グラフとしてEdgeを作ります。outを指定して取ります。VertexはDocumentなので任意の属性を保存する事ができ、Edgeも同様に任意の属性を保存する事ができます。Indexの種類は今は3つあります。(B-treeが無い理由はVideo見ればわかったりするのかな?)。Indexは要素は2つまでの制約があります。Indexはユニーク制約を付けることができます。HashとSkipListsの特性の違いの説明は必要ありませんよね。CollectionやDocumentを作るときに、Diskへの書き込みを同期化するかのオプションがあります。InnoDBのFlushパラメータみたいなのですが、これは基本的にAsyncにしないと性能が出ません。(※性能テストはRoadMapの1.0betaで行う事になっているので、今の段階で性能云々を言うのはちょっとお門違いです)さて、次はJavaで扱う方法です。Javaのドライバはこちらにあります。JARファイル作っていません。作った方がいいかな?※prototypeですので、サーバが落ちている時のハンドリングを入れていません。Edgeの操作ができます。使い方はREADMEかExampleに書いてあります。単体テストを見るのが良いと思います。以下はDocumentを1000個適当に作ってクエリで検索するサンプルです。Cursorを扱いやすくするためにResultSetを作ってみました。}}グラフも扱えます。グラフの扱い方は以下のようになります。効果的にトラバーサルする方法がまだ提供されていません。TinkerPopのBluePrintsとGremlinに対応するらしいので、そのあたりで出来ることは将来的にできるようになると思います。(私はGremlinでGraphを操作した事がないので詳細はわかりません。e3=v2->v3)作り、v0のエッジを求めています。Hiveこんにちは、ポテトサラダを極めようと心に決めたタムタムです。(昨日作って食べたら満足しました(・w・))今日はHiveのパッチの書き方をまとめます。Hadoop本体とはちょっと作法が違います。Hadoop本体はパッチを投げると自動でJenkinsがテストしてくれたりするらしいのですが、Hiveはそんなことやってくれません。パッチもJIRAに添付するだけではダメで、Phabricator(Reviewボードみたいなもの)というツールを使ってDiffをアップしてReviewしてもらう必要があります。今回は実際にHIVE-2703のパッチを投げるまでの手順を書いていきます。こちらの内容と被っていますが、こっちでは説明しきれなかったところも書いていきます。手順はsubversionの手順になっています。ぶっちゃけgitの方をオススメします。subversionだと複数のパッチを書くときにローカルでブランチを切れないのでとってもとってもつらいです・・。HIVE-xxxでパッチをあげることができなかったからです)なお私はFedora16をVirtualBoxの上で動かして開発しています。(MacbookとかオシャレなPC持っていません・・)あと、Hadoopの環境は普通に作っておいてください。ローカルモードで良いです。今やいろんな本が出ていますが、Hadoop徹底入門がオススメです。した手順は以下のようになります。ソースを落とすソースをいじるテストする(JIRAで適宜コメント書いたり、やりとりしたり)Phabricatorでreviewして貰う最終版のDIFFをJIRAに添付する(ASFライセンス付ける)細かい手順を説明していきます。ソースを落としてEclipseのプロジェクトを作ります。(Eclipse使わなくてもパッチは投稿できます。JavaのソースをIDE無しで書くのは結構つらいと思います。HIVE-2904のパッチを当てましょう。今のバージョンだと正しいEclipseのテンプレートを作ってくれません。パッチのバージョンを変更しました。最新のソースだとDDLTaskがjson形式で出力できるようになっていて、JsonMetaDataFormatterがjacksonに依存するようになっていました。これでhive-trunkにeclipseのprojectファイルが出来ています。あとはEclipseからインポートするだけです。Eclipseの使い方は今更説明するようなものではないので省略します。注意点としては、ワークスペースの文字コードをUTF-8に、JDKは6を使いましょう。保管アクション」の設定でインポートの編成が行われるようになっています。パッチを書いた時にdiffを取ったらいじっていないところも変更されている事があります。これは気にしたら負けです。1つ、プロジェクトの設定の「ビルダー」で「Hive_Ant_Builder」のチェックは外した方が良いです。保存する度にAntが走って重めのビルドが走ることになってちょっとイラッとします。ここまでで、開発環境は整いました。いうわけで、普通に開発をしましょう。パッチを出す時は基本的にテストケースも一緒に追加します。(パッチの内容にもよりますけど)。次にテストの方法です。単体テストはJUnitで書かれています。Eclipse用のプロジェクトを生成した時に、実行構成も既に設定されています。ディレクトリなど)が入っています。どのクラスがどの単体テストが担当しているのかは、クラスの参照を調べればなんとなく推測できます。関連する単体テストがピンポイントで通るようにするのが良いです、なお、UDF関数やクエリのテストはまたちょっと違います。後者のテストの方法は以下のようにします。このテストは、「ql/src/test/queries/clientpositive/timestamp_udf.q」を実行した時に「ql/src/test/results/clientpositive/timestamp_udf.q.out」の結果になるかというテストです。前回の記事にも書いてあります。-Dqfileを省略すると全部のテストを実行します。testこのあたりをピンポイントで実行してから、最後に全体のテストを実行します。非情に時間がかかります。4,5時間は覚悟してください。寝る前に実行しましょう。いうファイルが生成されます。このファイルにテストの結果が書いてあります。diffを取って差分を確認してください。(※最初に環境構築をするためにパッチを当てたやつは除外する必要があります。HIVE-xxxx.1.patch.txtgitの場合は、以下のような感じです。HIVE-xxxx.1.patch.txtこれでパッチを投げる準備ができました。(後述するPhabricatorを使わない場合は、このDIFFをJIRAにファイル添付すれば良いです。)チケットの開き方は前回の記事を参考にしてください。※こんな事を書くと怒られるかもしれませんが、ぶっちゃけ英語なんて適当で通じます(たぶん)。英語が出来なくてウジウジするくらいならコードを書いてパッチを投げましょう。(もしくは知り合いに英訳して貰いましょう)。自分たちが外国人のニンジャ語を理解できるように向こうの人もきっと理解してくれます。パッチの投稿の仕方です。Phabricatorをインストールする必要があります。以下のURLを参考にします。arcanist/resources/shell/bash-completionその後、以下のコマンドを叩いて準備をします。環境変数PATHに通しておくと良いです。install-certificatePhabricatorにパッチを投げる手順は以下になります。これは実際にsvnかgitでdiffを取ってPhabricatorに投稿します。これでJIRAにパッチが添付されます。Patch」を押します。Availableになります。パッチがNGな場合は、レビューの内容やコメントの内容を見て修正しましょう。レビューが終わったら最終バージョンのパッチをJIRAに添付します。添付する時はASFライセンスを付与しましょう。この時に新機能の追加や互換性が無くなる変更の場合はReleaseNoteを各必要があります。私はHiveにはそんなに詳しくない初級者ですが、何か困ったことがあれば協力できるかも。Hackathonというものがあります。http://www.zusaar.com/event/250002私が参加した時は、JIRAの使い方とパッチの書き方を最初に教えていただきました。基本は黙々とハッカソンするわけですが、お菓子を食べながらプロジェクターにソースを映してアレやコレやと楽しかったです。開発環境とJavaさえ書ければ、英語は出来なくてもみんな英語が出来るので誰かが助けてくれます。Hadoopのここが気にくわないわー。Hiveのここが気にくわないわー。あのBug放置されてるわー、直したいわー。いう人は参加を考えてみると良いかも。書こう書こうと思って今更ながら記事を書きます。TwitterJapanに遊びに行ったので、その時の写真を載せておきます。先月はハッカソンイベントのために行ってきました。動くもの2個つくった。(Twitterの内容をIRCへ垂れ流すやつと、Stream中のURLをリアルタイム集計していくやつ)。RedisとTwitter4jサマサマ。このクッション欲しい・・。4/3(風強すぎ・・)にも行ってきました。こっちはメディアの方もいっぱい来ていたのであちこちで記事になっていると思います。聞いた内容をずらずらと書いても良いのですが、他の人が綺麗にまとめているので省略。RobがJavaOneのために来日していて、Twitterのアーキテクチャの話をしてくれました。写真はこの前のバルスの時の負荷に関するもの。個人的に気になるのは、Staging環境とPreFlight環境でのテストデータについて。Production環境から引っ張ってきていると思うんだけど、そこがどういうアーキテクチャになっているのかが気になる。ストレージのレイヤがMySQLと言っていたけど、ストレージのレイヤで解決しようとすると、単純にレプリケーションでStaging用のデータ作ってる場合はWriteしたら色々おかしくなるだろうし。Thriftでうにうにやってるレイヤーでやってるのかな・・。いうあたりがモヤモヤ。Houseのまとめはこちら。WorldのさくらさんのZFSの話ってどこかに載ってないのかな。10:50日記2012前期このたび、株式会社スクウェア・エニックスを退職しました。正確には4月2日が最終出社、4月30日付けで退職となります。2006年に入社し、約6年勤めた事になります。PlayOnlineというプロジェクトに始まり、FinalFantasyシリーズに関われた事はとても貴重で刺激の多い体験をする事ができました。(他にも兼任していたけど省略します)エンジニア業務としては、サーバも書かせて頂きましたし、Webのお仕事も立ち上げから運用まで一貫して携わらせて頂きました。独自のプロトコルを実装したり、フロムスクラッチでサイトを立ち上げたり。ステージング環境の構築も含めてサーバ構成なども良い経験でした。さっき数えたらそのサイトのために実装したクラスは1000ちょっとでした(意外と少ない)。Webサイトと言ってもSNSとしての機能をだいたい実装し、ゲームと連動させるためにMMOのサーバやスクリプトを読み解いたり、モデルの仕様を聞いてキャラクタの画像を表示できるようにしたり。ゲームのサーバからクライアント、スクリプト、モデル仕様等までわかるようになっていました。問題の多いプロジェクトでもありましたが、逆にそのおかげで領域、職種関係なく自分でやらないと物事が進まないことも多く、様々な知見を得ることができました。本当に0~10までやった感じです。いえばマイニング的な事もしてました。統計やマイニングって楽しいですよね。自分しか知らない秘密の性質を発見したり。自分で企画書書くときに、刺さるレイヤーがどんな感じかというのを知りたいためにやっていました。ちなみに、こういうのは目的ありきでやらないと意味がないですし、その結果やその先にあるものを誰に(何に)フィードバックするかが重要だと考えています。データは(読み方を間違えなければ)嘘をつきませんが、データが全てではありません。経験や直感も大切です。Webディレクター的な事やプランナー的な事もやらせて頂きました。自分で企画書を書き、トップレベルのレイヤーに「やっていいよね?」程度の軽く承認を取っただけで、他セクションのいろんな人を巻き込んで物事を進めていったのは良い思い出です。直近では、あの企画がノリノリで一番楽しかったです。自分のスキルセットではどうにもならない部分(BG、フェイシャル、キャラ、ライト、モーション等)を協力してくれた方に特に感謝してます。「実は動く物あります。いう感じで巻き込んでいったのが多かった気がします。良いやり方とは言えませんが(リスクが高いですし)、世の中にはやりたいしか言わない人も多いので「やりたいじゃないんだよ、やるんだよ!」という感じで自分から動けば物事を進めやすい環境でした。仕事をする上で重点を置いていた事がいくつかあります。(細かく言うと他にもたくさんありますがきりが無いので。)・自分より後に作業をする人には徹底的に配慮する。(デザイナ、QAチーム、運用チームなど)・ユーザーサポート系の問い合わせ(ユーザーへ返信が必要なもの)については最優先(障害対応を除く)で対応する。・ルールや規則が何度も弊害になる場合、ルールが間違っている事を疑う。・拘るところには徹底的に拘る。ないところは(良い意味で)手を抜く。・最初にやりたい事のMAXを出してどうあるべきかの理想型を考える。内容をそぎ落としたりしない。・出来ない理由を探して「出来ません」じゃなくて、「どうやったら出来るのか」を考える方が遙かに生産的。ところで、私が毒吐きキャラというのは、まぁ周知の事実だとは思います。(※ただし私が毒を吐くときは、"なんでこんなこともできないんだ"という事で吐くことはありません。基本的には自分でやるって言ったことをやらない場合に毒を吐きます。できないと言ったことはそもそも要求しません。)それでも大人な対応でサポートしていただき、自分は周りに恵まれていたと思います。本当に自由にやらせて頂きました。この会社では珍しいほど自由に動き回れました。これも周りの人のサポートがあったからだと思います。本当に多くのご迷惑をおかけしました。本当にありがとうございました。ある上司に言われた「やりたいようにやれ。やっちゃいけない事をやったら叱るから、叱られるまでやれ(意訳)」という言葉は印象的でした。その結果こんな人材ができあがりました(笑)辞めた人が在籍していた会社をDisっているのを時々見かけますが、私はこの会社が好きでしたし今でも好きな会社です。私がたまたま環境に恵まれていただけかもしれませんが、少なくとも私には働きやすい良い会社でした。楽しい楽しい充実した日々を駆け抜ける事ができました。やり残した事も正直多いです。それ以上にやりたい事も多くなりました。退職の理由は「いい年してなにゆってるの?」と言われそうなので恥ずかしいのですが、同じ方向性のスキルや問題意識を持ったエンジニアの方々と肩を並べてお仕事をしたい、自分もトップエンジニアの領域まで登り詰めたいと思った事です。そのために暫く充電期間を取ろうと思いました。今まで多くの企業からお声をかけていただきました。在職中にお話をしたところも多々あります。その時は状況とタイミングが悪かったため全てお断りをしていました。今は心身ともに余裕があります。いうお話などなど、カジュアルにいつでもWelcomeです(・ω・)ノそれでは、今後ともよろしくお願いします。JavaリハビリのためにMurmurHashをJavaに移植してみました。Version1,2,3全てありますので、32bit,64bit,128bitのハッシュを求めることができます。https://github.com/tamtam180/MurmurHash-For-Javaオリジナルと同じ結果を返すことは確認済みです。MurmurHashってなんぞという人はオリジナルのサイトをどうぞ。Projectの方が良いような気がしてる。パッケージをダウンロードさせたい場合、Githubではどうやるのかわかんないや。実行すると、以下のエラーが発生します。place.<if>というタスクが無いよーというエラーです。このJARファイルのIfTaskは中に入っており、build.xml中でtaskdefしてあげないといけません。以下の定義を追加してあげる必要があります。${hive.root}/build.xmlには定義されているんですけどね。</classpath></taskdef>この定義をql/build.xmlのgen-testのtarget配下に書いてもいいのですが、いろんなbuild.xmlがbuild-common.xmlをimportしていて、さらにbuild-common.xmlでも<if>タスクを使っているので、build-common.xmlに定義するのが良いかと思います。diffはこんな感じです。value="[conf]/[artifact]-[revision](-[classifier]).[ext]"/>つか、誰も困って無いのかな・・。それっぽいチケットも無いんだけど。Spring発熱でDOWNしているタムタムです。インフルエンザのようなすごい高熱というわけでもなく、プリン食べて家でしょぼーんとしてます。今回はHiveのUDF一覧を自動生成してみました。Hive0.8用はURLを変更して、こちらにtrunk(rev1293519)のバージョンを起きました。reflect関数とかWikiには載っていないと思います。builtinと書いてあるやつはFunctionRegistryのstaticイニシャライザで関数登録しているやつです。Alias名がある関数はそれぞれ1つの項目に作ってあります。作り方は至ってシンプルで、UDF関数はDescriptionというアノテーションが定義されています。xxxxという構文で表示される説明は、このアノテーションの情報を表示しているだけです。いうわけで、SpringFrameworkのClassPathScanningCandidateComponentProviderを使ってClassPath中のDescriptionアノテーションが定義してあるクラスを取得して情報を拾っているだけです。scanner.findCandidateComponents("");取得したBean定義を回して、リフレクション使ってAnnotation情報を取得します。nameをカンマで区切っているのは、Aliasがある場合はカンマ区切りで入っているからです。あとはdescから情報を普通に引っこ抜けます。HiveHiveのチケットを開いてBug報告をしてみたのでその手順をメモメモ。テストの方法とかも書いておきます。(チケットの内容はほとんどshiumachiさんに書いたもらったものですけどね(ノ∀`))shiumachiさん、丁寧に教えていただきましてありがとうございます。https://cwiki.apache.org/confluence/display/Hive/HowToContributeWikiにも書いてあるので、こちらを参考にすると良いと思います。trunkで再現するかの確認についてEclipseを使ってやる場合は、こちらのページが参考になると思います。今回は簡単な修正だったのでコンソール上だけで行いました。trunkを落としてきてビルド、Hiveを起動する手順を以下に書きました。設定ファイルを特に作っていないのでMetastoreはカレントディレクトリに作られます。MetastoreをMySQLに入れるところがーとかを修正する場合は、ちゃんとconfの下に設定ファイルを作って設定しましょう。./hive今回初めてgitを使いました。Hiveの規模であれば、--depthオプション無くてもいけます。svnの場合はwikiにある通りに、以下のようにソースを持って来ます。hive-trunk■ソースを修正したらテストをします。私のPCではテスト全部通すと4時間程度かかりました。全てのテストを実行する場合は以下のように実行します。テストが終わったらテストレポートも作ります。テストレポートはbuild/testディレクトリにjunit-noframes.htmlというファイルが作られます。このレポートファイルを見ると、何のテストが失敗したのかと、簡単な情報(例えばExceptionが出ているとか)がわかります。testreport個別にテストをする場合は、以下のようにします。qファイルはフルパスではなくファイル名を指定します。-Dtest.silent=falseなお指定したqueryのテストに対応する正解データは.q.outファイルです。上記の場合は、ql/src/test/results/clientpositive/timestamp_udf.q.outのファイルが正解データとなります。正解データを実行結果で上書きする事ができます。以下のコマンドで上書きできます(-Doverwrite=trueを追加)。-Dtest.silent=false私は今回上記のテストケースファイルに追加する形で対応しました。テストする時は、上記のように影響があるテストをピンポイントで実行して最後にテストを全部通すと良いと思います。全体テストは時間がかかるので、並列実行する方法があります。(直列のまま実行する場合は、寝る前に実行すれば良いと思うよ!!)テストに関する情報は、こちらのWikiのページのTestingの項目が参考になります。(パッチを投稿する場合)テストが通ったらパッチを作ります。Contributeのページに書いてあるとおり、以下のように作ります。パッチファイルはテキストファイルとして作った方がブラウザで見れるのでその方が良いです。browser.」とWikiに書いてありますし、shiumachiさんからもその方がいいよーとの事です。HIVE-xxxx.1.patch.txt■JIRAのチケットをOPENします。これを参考にすると良いよ!shiumachiさんの添削が載っているので、とっても参考になると思います。(githubのアカウントもこの時に作ったので、今度からちょこちょこ何かソースアップしていきます。)実際にOPENする方法は、まずはJIRAのアカウントを作ります。(アカウントの設定でLanguageを日本語に出来ますが、逆にわかりづらくなって発狂するのでEnglishのままのが良いです。(下の絵を参照)Issueの内容ですが、IssueTypeにはBugが設定されていると思うので、他の項目を入力していきます。いわゆるタイトルです。この項目は以下を参考にします。対象のコンポーネントを選択します。今回は「UDF」を選択しました。発生するバージョンを選択します。今回はHive0.8を選択しました。Trunkの場合は選択しないようです。選択されているチケットが少ない気がするのですが、リリースされているバージョンで発生するので、ちゃんと選択してみました。なんか書いている人が少ない。Hadoopのバージョンとか書くのかな・・。空欄にしちゃいました。チケットの内容を書きます。あとは空欄にしちゃいました。(ノ∀`)パッチを添付する場合は一度チケットを作ってから添付します。Filesを選択すると添付できます。実際に作ったチケットはこれです。HiveHadoopアドベントカレンダーでTimestampの機能について書いた時に見つけた不具合を調査してみました。自分の備忘録用にメモメモ。from_utc_timestampまたはto_utc_timestampをSELECT句に複数書くと値がおかしくなるというものです。正確には、1つ書いても壊れます。18:00:00おや、全部の値が変わってしまいました。'JST')を追加してみます。03:00:00SELECT句で書いたt1が全て同じ値になります。次に実装クラスを見てみます。org.apache.hadoop.hive.ql.udf.genericパッケージのGenericUDFFromUtcTimestampとGenericUDFToUtcTimestampです。GenericUDFToUtcTimestampはGenericUDFFromUtcTimestampを継承していて、フラグに応じてOffset値の正負を反転させているだけです。問題はGenericUDFFromUtcTimestampのapplyOffsetメソッドです。ソースを下に書きました。}行を評価中、timestamp変数は同じインスタンスを毎回返してきます。そのインスタンスに対してapplyOffsetでsetTimeしちゃってます。その行を評価中はt1は同じインスタンスを使い回してしまいます。SELECT句に書いたOffset値全てが計算された結果が出力されるわけです。1列評価→出力→1列評価→出力ではなく、全ての列を評価→出力なので、出力時には全て同じtimestampインスタンスを指すことになって、全て同じ値が表示されるわけです。(ここで言う全てはt1を参照している列という意味です)修正方法ですが、結局のところは同じインスタンスを指せないという事で、インスタンスを生成する必要が出てきます。いうわけで、手っ取り早く修正するのであればapplyOffsetを修正します。}(追記)上記のコードはダメでした。nano時間のところがそもそもバグっていて秒未満の値がずれます。以下のコードの方が良いです。}hiveをビルドしなおして再度実行してみます。18:00:00直りました。Hadoop、Hiveのコミュニティっていきなりチケットを開いてもいいのかな。MLとJIRAを漁って作法を調べよう。チケット開く前にパッチを置いておこう。Javaソースとテスト用のqファイル、q.outファイルのパッチは分離して2つに分けた方が良かったかな・・。Hivefluentの勉強会に参加したら、まわりがモヒカンばっかりで消毒されそうになったタムタムです。apacheもjsonとしてデータが飛んでいるとの事で、相性は悪くないよねーというわけでサンプルを作ってみました。(スライドを見ていた感じではこんな感じだったはず)まずサンプルデータを用意します。適当に100件ほど作りました。"exam3":46}....まずはデータをそのまま1つの列に入れます。今回はサンプルなのでPARTITIONは切っていません。raw_data;このJSONデータをテーブル化するクエリは以下のように書けます。(Hiveのマニュアルには、上記のようなクエリを書くなら下記のようなクエリを書きましょうねと書いてあります。exam3;json_tupleはstring型として返ってくるので、これを整数型にします。SELECT句でCastしているだけです。exam3;これをView化します。exam3;簡単な集計をしてみます。50.43集計できました。hive.optimize.ppd=false;」と設定するみたいです。https://issues.apache.org/jira/browse/HIVE-1056ちなみにJSON用のSerdeもあります。http://code.google.com/p/hive-json-serde/ぶっちゃけ、こっち使った方がスマートに書けますwというわけで、hiveはfluentとの相性も良さそうですね。Tycoonをビルドする。Tycoonが0.9.53でSolaris10でも動くようになったのでメモメモ。0.9.52まではSolaris10ではsetsockoptのSO_RCVTIMEOとSO_SNDTIMEOが必ず失敗するのでSocketの接続が全てRejectされていました。0.9.53では設定は試みるけどエラーチェックをしなくなったので、Solaris10でも繋がるようになりました。ビルドをするためにGCC4.4を入れます。GCC4.6じゃないの?と言われそうですが、依存ライブラリのmpc(gcc-4.5から必要)のビルドがgcc3.4.3で出来ないので1回GCC4.4系を入れます。gcc3.4.3でもconfig.hを書き換えればいけると思いますけど。gmpとmpfrとmpcはgcc4-deps-libへ入れるという方向で行きたいと思います。事前にgrepが/usr/xpg4/bin/grepを使うようにPATHを調整します。しないと、/usr/bin/grepを使ってしまいconfigure時にオプションを解釈できなくてチェックが正常に動きません。installlibgccのビルドにこけるので、以下を設定します。(GCC)環境変数はこんな感じで設定しております。LD_LIBRARY_PATH=/usr/local/gcc446/lib/amd64:/usr/local/gccc446/lib:/usr/local/gcc4-deps-lib/lib:/usr/local/lib:/usr/ccs/lib:/usr/sfw/lib:/opt/sfw/lib:/usr/lib:/lib:/etc/libPATH=/usr/local/gcc446/bin:/usr/local/bin:/usr/xpg4/bin:/usr/xpg6/bin:/usr/ccs/bin:/usr/sfw/bin:/opt/sfw/bin:/usr/local/bin:/usr/bin:/usr/local/sbin:/usr/sbin次にKCを入れます。install次はKTを入れます。注意点としては、-m64を付けないとconfigure時にlibkyotocabinetが認識できません。これは、libkyotocabinetが64ビットのSOであるのにconftest.cppを作ってリンクの確認をする時に-m64がつかなくて32ビットのELFに64ビットのSOをリンクしようとするからです。CXXに明示的にg++を指定しているのは、-m64つけた時にこれを指定しないとpthreadなどの他のライブラリを認識できなかったからです。install確認をします。ktserverを立ち上げて以下のコマンドを打ちます。http://localhost:1978/test1hello動いた動いた。Java本当は食べ物の写真とか載せたいんですけどね。この前やらかしちゃった事を備忘録としてメモメモ。Javaでは基本的にSerializableを実装していないと(Externalizableでもいいけど)、Objectをシリアライズできません。MemcachedにそのままObjectをまるっと保存する場合は、ObjectOutputStreamを介して保存する事が多いと思います。(MsgPackとかJSONICとかを使う方が良いかもしれませんが)。この前やらかしてしまったのは、JavaのListインターフェースにあるsubListで返ってくるリストはSerializableインターフェースを実装していないListなので、キャッシュに保存できないでエラーが出まくりでした。書くと語弊があるので正確に書くと、ArrayListとLinkedListはAbstractListを継承しており、subListの実装はAbstractListが持っています。AbstractList#subListの実装は、RandomAccessを実装しているクラスの場合はRandomAccessSubListを、実装していない場合はSubListのObjectを返します。RandomAccessSubListもSubListもSerializableは実装されていません。toIndex));}ちなみに、subListは要素をコピーして作っているわけでは無く、単純に元リストのラッパークラスのように振る舞っているだけなので、そこも注意なのです。subListで返ってきたリストに対して操作するとどうなるかのサンプルを書きました。Tycoonをビルドする。