なるひこの Linux Printing お勉強日記 RSSフィード

ご注意!

ここはあくまでも私個人のブログであり、いかなる団体や組織の立場から離れた、私個人の知見なり学んだことなり勝手な思い(妄想ともいう)を書く場所であります。それを踏まえてお楽しみいただければ幸いです。

クリエイティブ・コモンズ・ライセンス
特に断りがない場合は、本ブログの筆者によるコンテンツはすべて クリエイティブ・コモンズ 表示 - 継承 3.0 非移植 ライセンスの下に提供されています。

2014-12-21

関東LibreOfficeオフラインミーティングとはなにか

この記事はLibreOffice Advent Calendar 2014の21日目です。遅刻しちゃってスミマセン。

昨日はHidemune Tanakaさんの「楽ちんな LibreOffice Extension の作り方」でした。

私は関東におけるLibreOfficeのふわっとしたつながりを作りたいと思って、関東LibreOfficeオフラインミーティングという定期イベントを立ち上げました。イベント資料なんかはGithubにリポジトリがあってそこで管理されているので、覗いてみてください。

今回は、関東LibOオフの紹介……は、上のサイトを見ていただくとして、どんな狙いというか、思いで立ち上げたかという話をごくカンタンにしたいと思います。

ざっくりまとめると:

  • 小笠原は「主宰」ではなく「発起人」
  • 目指すのは「みんな同列」な「サロン」
  • 出会える場所をある程度の頻度で提供したい

ってな感じですかね。


小笠原は「主宰」ではなく「発起人」

関東LibreOfficeオフラインミーティングは、関東にはそういえばLibreOffice関係で定期的に集まれるイベントってないなあ(関西は関西LibreOffice勉強会が昔からあった)、と思って、私がなんとなく始めたものです。

で、今のところ私が会場を手配したり、資料作って喋ったり、あれこれやっているので、私が幹事とか主宰っぽい感じになっててちょっと私不満なんですけどw。

関東のオフって、別に私じゃなくて、誰かが「こんなイベントやりたい」とか「こんな話をしたい」とかあったら、どんどん名前を使ってもらってもいいんですよ。例えば今は東京でばかりやってますが、例えば関東の他の県でやりたい!と思ったらやってもらっていいですし、私のトークはコミュニティコミュニティうるさいから、もっとエンドユーザーに対して使い方を教えるようなイベントがいい、って思ったらそう思う人がやってくださればいいのです。

そーゆー方がいたら、私とうぜん可能な限りお手伝いはしますので、名乗りを上げてくださいませ。


目指すのは「みんな同列」な「サロン」

関東オフはぜんぜん人が来ないイベントとして(私の中で)有名です。最低では二人ってことがありました。昨日やった19.1回に至っては、私以外誰も来ませんでした。企業さんなどから無償で会場をお借りするような場合、あまり人が来ないとかなり心苦しいので、ちょっと悩んだりもしなくはないです。しかしこれは確信的でもあります。

イベント集客についての記事とか読むと、必ずターゲティングについて書いてありますね。どういう人がそのイベントの対象なのか。その対象に対してどういうベネフィットを提供できるのか。それを明確に分かるようにしなさい。うんぬん。うんぬん。

……私は、そういう、「登壇者が聴衆に何かを与える」タイプのイベントをやりたくなかったんですね。というか、「登壇者」「聴衆」という垣根を作るのがイヤ。みんなLibreOfficeというものを媒介にした、一つのコミュニティ*1 の仲間であって、その仲間同士、知恵を交換しあったり手助けしあったり、単に一緒にお酒飲んで馬鹿話したり、そういう場所が欲しいというのがあった。

今日は時間が開いたから、ってふらっと寄って、あ、いつもの仲間がいるな、って場所を目指しているんです。ターゲティングしない。参加してくれた人たちに何を与えるかも、まったく定義しない。しいていえば、LibreOfficeというものを中心にしてコミュニティを作ることに関心がある人がターゲットで、コミュニティへの参加感が与えたいものかな。

……そりゃ、人来ないよね(^^; そもそも「集客」じゃないもの。お客様が欲しい訳じゃないから。仲間が欲しいから。

あ、繰り返しますけど、「一般のユーザーにコミュニティの参加感とかいってもダメでしょう」という方がいたら、そういうイベントをやるためのプラットフォームとして使っていただくのは、大変に歓迎です。ぜひお申し出を。


出会える場所をある程度の頻度で提供したい

さっきも書きましたが、「今日は時間が開いたから」ってふらっと寄れるためには、時間が開いたときにオフがやってなければいけません。なので関東オフは毎月開催が基本です。

東京というところはとにかく人が多いですが、IT系に限ってもイベントもまた多いところなので、「仕事帰りにふらっと寄れるイベント」を作りたいと思って、平日夜開催というのはわりとこだわってきました。

でも、週末の方が時間取れるなーとか、ガッツリ作業する日もあったほうがいいなーという方もいるかなということで、最近はHackFestという形の、週末の午前中集合でランチを挟んで夜までというイベントもやるようにしてきました……というのが今年の進展でしょうか。

あとセミナースタイルというのはどうしても登壇者と聴衆って感じになってしまう感があって、それからの脱却ということで、平日夜のもくもく会というのも最近はやってます。本当はワークショップとかもやりたいのですが、これは仕込みが大変だなあということで、実現できてない……ですね。

スタイルを固定化しないというのも人集めには不利なんでしょうけど、しょうがないですね、これは。


まとめ

関東オフは今年で2年ちょっとになるわけですが、月一、平日夜開催というスタイルから、いろんなスタイルを模索し始めたところが今年の展開です。割と色んなことができて、個人的には満足しています。

一方で、立ち上げたときから、それぞれのイベントを開催して、(大抵は)なんかしゃべって、ということを一人でやってしまったので、関東オフは私の色がかなり強く出たイベントに外部からは見えてしまっているのかなあというのは、わりと悩んでいます。といって、人に仕事をお願いするのがとっても苦手なので、ズルズルと来てしまってるというのが今年の反省。

来年こそは、自分カラーを薄めたいなあ、と思っているところです。

ま、ともかく、そんな感じでやっているので、興味がある方、時間があえば遊びに来てくださいね。



明日はKenichiro MATOHARAさんです。よろしくお願いします!

*1コミュニティコミュニティうるさいですね、すみません。

2014-12-09

LibreOfficeバグハンティングセッションのご紹介

この記事はLibreOffice Advent Calendar 2014の9日目です。昨日はoshieさんの「Drawでかんたん! チラシ作り 」でした。

みなさん、LibreOfficeのバグハンティングセッションについてはご存知でしょうか。

リンク先から参照すると:

たったこれだけ!です。


タイムベースリリースとバグハンティングの意義

LibreOfficeのリリースは、タイムベースというポリシーになっています。つまり、「ベータとかRCとか正式リリースとかのスケジュールが、予め決められている」というポリシーです(LibreOfficeのリリースプラン参照)*1。他のFLOSSだと、例えばUbuntuとかopenSUSEといったディストリビューションGNOMEとかがタイムベースリリースですね。

タイムベースリリースの利点を雑駁にいうと:

  • 機能追加やバグ修正が定期的にリリースされることが保証されるため、進化が早い
  • ユーザーからのフィードバックが得られやすいので、変更に大胆になれる
  • コミュニティベースの作業のスケジュールが分かりやすい

といったことがあります。逆に見ようによっては欠点とされるものが:

  • QAプロセスをリリースマネージメントの中に入れ込むことが難しい

ということです。つまり、これこれの品質尺度を満たしたらリリース、といったマネージメントとはタイムベースリリースは馴染まないのです。

しかしこれは本当に欠点なのかというと、ものは考えようです。つまり、不具合があっても、それを発見することさえできればすぐに対応される可能性がある*2 のがタイムベースの強みです。したがってLibreOfficeにおける品質保証というのは、ユーザーが自らテストに参加し、不具合を発見して報告することを前提としているのです*3。品質保証チームは(もちろん自らテストもしますが、どちらかというと)報告された不具合を精査して開発者が分かりやすいように情報を付加したり、ユーザーがテストをするための基盤を整備したり、といった作業がメインとなっています。

おっと、脱線が過ぎました。バグハンティングセッションというのは、タイムベースリリースを採用しているLibreOfficeにおいて、リリース「前」になるべく多くのテストを行い、不具合を検出するということを目的としたバーチャルイベントです。エンドユーザーとしてはどうしても、自分でテストしてみるのはリリースされてから、ということになりがちですが、こういうイベントを設定することで、より多くの人に開発版を試してもらおう、ということです。

リリーススケジュールから一部を抜粋しました。

イベント
β1第47週, 2014年11月17日〜23日
RC1第51週, 12月15日〜12月21日
4.4.0リリース第5週, 2015年1月26日〜2月1日

前回のバグハンティングセッションはβ1のリリース直後、11月21日〜23日に設定されましたが、今回はRC1のリリース後なので、12月19日〜21日で予定されています。ここで多くのバグを洗い出すことができれば、4.4.0のリリースにはまだ一月近くあるので、(特に致命的なものは)間に合う可能性が高いと考えられます。


前回のバグハンティングセッション ミニレポート

前回は東京で11月20日九州(福岡)で11月21日の勉強会の一部を使って、それぞれバグハンティングをオフラインで行いました。また東京のHackFestにあたってはIRCチャネルfreenodeの#libreoffice-ja)を開けておいたので、リモートで参加いただける方もいました。

MozTrapベースでテストを行ったり、使い込んでいる機能のチェックをしたりと、いろんなテストをした結果、以下のバグを報告できました。


またオフラインセッション、やる?

もちろん各々が自分の手元でテストしてもよいのですが、オフラインでやることで、

  • バグ出しするぞ!というモチベーションが上がる
  • 見つかったバグ相互に確認できる
  • 違う環境での確認も素早く可能
  • 一人でもbibisectの環境を持っているとbibisectもできる

などなどとってもメリットがあったので、RC1合わせのバグハンティングセッションオフラインでやろうかな?と考えてます。

興味がある方はご連絡ください!


明日はnogajunさんで、 「Writerの原稿からImpressスライドのひな型を作る」だそうです。よろしくお願いします!

*1Apache OpenOfficeは、プロジェクトが定めた基準を達成するまでリリースしない戦略を取っています。

*2:当たり前ですが、不具合を見つけて報告したところで、それを直す開発者がいなければ不具合は直りません。しかし、発見されない不具合が黙って修正される可能性よりは、発見して報告されたものが修正される可能性は遥かに高いです。

*3:私がしばしば「エンドユーザーコミュニティの一員であることを自覚し、積極性を持って関わるほうが、LibreOfficeについては幸せになれる可能性が高い」というのは、こういうことです。

*4:先日リリースされたβ2では再現するかどうか確認してません。バグレポートもチェックできてないので、どなたか確認してほしいです。

2014-12-01

LibreOffice Conference 2014 Bern参加裏レポート

こんにちは。この記事はLibreOffice Advent Calendar 2014の初日です。すっかり忘れてたなんてのは秘密ですが、公開遅くなりましてすみません。

さてさて、今回はちょっと今更感もありますが、LibreOffice Conference 2014 Bernの参加「裏」レポートです。裏というのは、表は日経IT Proさんに書かせてもらったからです。

カンファレンスの内容とかは色んな所でしゃべったりなんだりしたので(聞きたいという人は呼んでください ^^)、ここは裏レポートというだけあって、準備とかオフタイムとかなんとかそういう話。

お金とかそういう話

今回のカンファレンス会場はスイスのBern(日本だとベルンと表記されるけど、向こうの人はバーンって発音してたと記憶してます)。スイスといえば美しい自然、観光地として外国人を暖かく受け入れてくれる人柄、美味しいチョコレートと乳製品、などが浮かびますが、もうひとつ、とにかく物価が高い、って印象があります。航空券とかホテルとか高そうってイメージがありました。

では実際のところ、かかった費用ってどんなもんでしょ? 見てみましょう。あ、スイスフランで支払った分は、今のレートで計算してます(当時のレートなんか忘れた)。

費目金額備考
航空券\147,630タイ国際航空 成田 - バンコク - チューリッヒ 往復(エコノミー)
鉄道\7,800SBB チューリッヒ - ベルン 往復(二等車)
鉄道(追加)\6,000帰りのみ、一等にアップグレード
宿泊\34,6206泊(9/1〜9/6)、AirBnB(後述)
合計\196,050

意外と高くないでしょう? タイ国際航空サマサマという感じではあります。トランジットも2時間と、短すぎず長すぎずでしたし。ただ、これは季節にも依るんだろうなあ。観光ハイシーズンだと、もっと高いかもしれません。

あ、SBBの一等アップグレードですが、これは別に贅沢したくなったというわけじゃなくて、乗るとこ間違えて「お客様ここ一等ですよ」「え、そうすか?」「どうします、二等に移動もできますけど」「(あーもう疲れてるしな……)いいです、追加料金払います」ってなっただけです。間抜け。

それ以外の費用ですが。

まず、LibreOffice Conference自体は参加費無料です。これはそう決まってるわけじゃなくて、一昨年参加したベルリンのカンファレンスだと50ユーロ払った記憶がある。けど、まあはした金です。国際カンファレンスはけっこう払うもんだったりしますからね。

それでついてくるのが:

  • カンファレンスそれ自体
  • カンファレンス会期中(9/4〜6)およびコミュニティデー(9/3)の朝食および昼食、フリードリンク(コーヒー、水、ソーダ類)
  • 9/4のHack Nightおよび、9/5のSocial Event(フードとビール飲み食べ放題)

ですよ。イベント中はほとんどお財布からお金が出て行かない。スポンサー様様ですよね。

あと、個人行動分とかみんなでご飯食べにいった分とかは当然お金払ってますが、これは渡航前に3万円ぐらいをスイスフランに換金して持っていったので足りたんじゃなかったかな。おみやげはちょっとショートして、カードで支払った記憶がある。

そんなわけで、LibreOffice Conferenceは原則ヨーロッパでやるので高いな、って思うかもしれませんが、参加費とか滞在費はかなり安くなるので思ったほどではありませんよ、ということです。

AirBnB

AirBnBは最近露出も増えてますし、利用されたって経験がある方も多いかと思います。私は今回が初めてだったので面白いなと思いましたが、ここで仔細にレビューしなくてもよいでしょう。なによりプライバシーが欲しいって人には向いてないかもしれませんが、そうでなければ、リーズナブルな値段だけでなく、色々ふれあいのチャンスが得られて、でも自分の時間は確保できて、オススメです。

以下思い出話をちらほらと。

  • 最初に申し込むときにメッセージするの推奨って書いてあったので「今度オープンソースのイベントでそっち行くんだ。LibreOfficeって知ってる?」ってメッセージしたら「知ってるよ!オープンソースコミュニティで活動してる人を泊められるなんて光栄だよ」って返事が帰ってきて、蓋を開けてみたらホストは現地でDrupalによるWeb構築の会社をやってたという。日本だとDrupalどうよ?みたいな話をした。面白いね。
  • AirBnBのメッセージ機能はかなりよくできてて、現地ではSMSで送受信できるのでネット切れてても携帯あれば繋がって便利。
  • ホストは超親切で、「えーと部屋にはどうやって行けばいいの?」「あ、わかりにくいから迎えに行くよ、駅で合流しよう」ってわざわざベルン駅まで来てくれて、バス乗り場の位置から切符の買い方、バス停の位置まで全部教えてくれました。お部屋も清潔だったしオススメ。もしベルン行く人がいたら紹介します。
  • とはいえ部屋から会場までは徒歩30分ぐらいだったので毎日歩いて行ってました。朝6時半に起きてのんびり支度して7時に家出て、朝の冷たい空気の中を歩いて行くのは気持ちよかったです。帰りも歩いてたけど、毎日飲んだくれてて遅い時間だったから、道によっては結構暗くて怖かったw
  • お部屋は普通の何室かあるアパートの一室を貸し出す感じ。他の部屋はホストやその相棒が使っているそうです(ここは彼らのオフィスで、お家は別にあるので、毎日来るわけではないとのこと)。そういう意味でバストイレが共用なので、タイミングを見計らう必要はあります。
  • そしてぼくは同居人がシャワーを浴びてる最中にトイレに行きたくなり、ぴょんぴょん飛び跳ねる勢いで我慢したことがあります。トイレは行けるときに行っておきましょう。
  • 毎日遅く帰って早く出かける日々だったのでホストとゆっくり話す機会があんまりなかったのは少し残念。せっかくのAirBnBなので、そういう機会を作っても良いかもね。

観光とかとか

ベルンはあんまり大きな街ではないので半日ぐらいで一回りできます。とっても良い街なので、行ったらぜひ観光しましょう。カンファレンスのローカルチームが、イベント終了後の9/7(土)にツアーを企画してくれてたのですが、私は残念ながら土曜日の飛行機だったので参加できませんでした。もし可能なら、日程合わせて参加すると二倍楽しいと思うので、みなさんはぜひ。

そのかわり、月曜日の朝に着いたので月曜日はフラフラと一人で歩きました。でも月曜日だと博物館とか全部しまってて残念。写真とかは機会があったらいずれ。

面白かったのは、昼ご飯食べたあと一旦駅に戻ってきて、トイレ行こうと思って構内を歩いてたら、LibreOfficeのTシャツを着た人が前を通りかかって「あれっ」と思ったら、それがThe Document FoundationのFlorianAlexの二人だったというね。ベルリンで一回あったきりなので、声をかけたとき向こうはぼくのことわからなかったみたいだけど、ベルリンであったよね!って言ったら、ああお前か〜ようこそベルンへ、ってなって、ホテルまで遊びに行きました。で、その後みんなでご飯を食べに行くという展開に。全然観光じゃないな。


言葉とか

カンファレンスは公用語は英語ですが、多くはネイティブではないので安心です(なんだそりゃ)。まあ共通の土台はありますし、なんとかなりますよ。てきとう。そもそも、なんともならないと思う人は行かないと思うので。

今回はLTしましたが、その話はまた別途。あとQA roundtableでは「日本からはなんか意見ない?」って聞かれたりして適当に答えたりしました。ヨーロッパ人が多いLibreOfficeコミュニティにおいて、日本から来ている、というのはそれだけで価値なので、向こうは話を聞こう、理解しよう、というバイアスが結構かかっていて、その点は楽ではあります。

街歩きしたりご飯食べたりという点についてですが、ベルンはドイツ語圏なのでドイツ語ができたらそりゃいいに決まっています。けど、観光地なので大抵の人は英語しゃべれますので、その点は安心。同じアジアなのに、北京で絶望したときに比べれば格段の差です。


LTの話

というわけでやったわけです。LT。

これも、「せっかく行くのだからなんか喋ったりできないかな」ってついったで書いてたら、それを読んでたからだと思いますが我らがCalc HackerであるKohei Yoshidaさんが、Hack Nightのときにライトニングトークの取りまとめをしてたJan (Kendy) Holesovskyさんにつないでくれて、それで「じゃ、明日よろしくね!」ってことになったわけです。

資料はこちら:

最初自己紹介とかダラダラ書いてたら「君、5分しかないって分かってるかい?」ってKendyに怒られましてw、そりゃそうだと思ってガサガサ削ってこうなりました。でも向こうのLTってわりと1枚のスライドを丁寧にしゃべってスライド2〜3枚ってことが多いみたいで、Koheiさんによると「なんで彼はあんなにスライド急いでめくるの?」って聞かれてたそうですw

まあ実際のところ準備不足も甚だしいし、練習なんかまったくしてないからスライドとにらめっこで聴衆の方見る余裕ないし、いろいろ酷くて、すっごい落ち込んで、あーだめだ、もうつらい、って頭抱えてたら、「さっきの話、面白かったよ」「続き聞かせてよ」って席まで来てくれる人がいて。はー。うれしいですね。

ここで満足して英語の勉強しないので上達しないんですが(こら)、でも、概ね受け手は優しい。これは主張しておきたいです。はい。


まとまってないまとめ

多分LibreOffice Conferenceはしばらくはヨーロッパを巡回することになると思います。この点はお酒飲みながらでも話題になったのですけど、やっぱりコミュニティの強さとか色々考えると、TDF(ドイツ)やLibreItalia(イタリア)、それからCollabora(イギリス)があるヨーロッパ*1 の強さは光りますわね。サポートベンダーの層も暑いし。

で、ダイバーシティは、TDFからの旅費補助によるカンファレンスへのローカルメンバーの誘致とか、あと地域カンファレンスに中核メンバーが参加するなどといったことで確保するほうがいいんじゃないか、という。

これは地理的・参加者の旅費補助費用とかの問題だけじゃなくて、例えば日本でLibreOffice Conferenceを開催したとして、日本のエンドユーザーが英語トラックを聞きに来るか、それを聞いて満足するか、それが日本コミュニティを盛り上げることにつながるのか、ということを考えると、まあそうだよね、という。我々はコンシューマプロダクトを扱うコミュニティなので、コンシューマにとって国際カンファレンスをやることが意味があるか、というのは考えなければいけないですね。

でも日本からの情報発信というのはとても期待されていて、とくに事例を発表できる人、旅費補助はするからぜひ来て欲しい、と色んな人にいわれました。来年はデンマークです。ぜひ皆さん、ご検討ください。

さて、初日終わり。明日は榎さんです。よろしくお願いします。

*1:イギリスはヨーロッパじゃない、とかいう話はおいといて。

2014-11-02

はじめてのLibreOfficeソースコミット

2014.11.05 追記:とても重要な参考資料を紹介するの忘れていたので後ろにくっつけます。見てくださいね。


私は口先野郎なので、「LibreOfficeの日本コミュニティに一番必要なのはコード書く人。オープンソースはコード書く人が正義*1」とか言っていながら、自分はぜんぜんコード書いてなかったんですよね。これでも元はプログラミングでおまんまを食べてた人間として、これはいかんよなーってずっと考えてた。

開発に挑戦することに対してはいろんなハードルがあるだろうけど、LibreOfficeの場合はコードベースも巨大だしコミュニティもいろんな人が関わってるのでそれなりのお作法もある。正直、どこから手を付けていいかわかんないところがあります。で、私的には、もちろん開発そのものの難しさもあるけれども、それ以前に、とにかく自分の修正のパッチを送ってレビュープロセス通してって、人が介在するところに心理的に抵抗があったわけです。英語では丁寧にドキュメント化されてるのだけど、私英語得意じゃないしね。

で、これは誇っていいことだと思うんですが、LibreOfficeにはEasy Hacksという「開発入門者のための誰でも直せそうなバグ」をタグ付けしたものがあって、もうほんっとに簡単なバグ(で、緊急性が高くない奴)とかを元に、修正してコンパイルしてレビューシステムにpushしてレビュー受けて、ってことをできるようになってる。よし、これにチャレンジしようと。

LibreOffic Conference 2014 Bernのときから初めて、ついついサボってたのでこれはイケナイと思い立ち、自分の尻叩きのために関東LibreOfficeHackFest(#1) with 第119回東京エリアDebian勉強会というイベントをやって*2 ようやっと目鼻がつき、こないだ送ったパッチは無事に取り込まれました。

すっごいしょぼい修正で恥ずかしいのですが一応コミッター*3 の仲間入りをしたので、記録として残しておきます。

課題の選定

Easy HacksはAll LibreOffice Easy Hacks by required Skillというページで必要なスキルごとに分類されているんですが、今回は曲がりなりにも昔はそれでご飯食べてたC++の、超簡単レベルな奴からピックアップ。

Bug 43157 - Clean up OSL_ASSERT, DBG_ASSERT, etc.

Bug Descriptionから引用すると:

The assertion/logging functionality from osl/diagnose.h (OSL_TRACE, OSL_ASSERT, OSL_ENSURE, OSL_FAIL) and tools/debug.hxx (DBG_ASSERTWARNING, DBG_ASSERT, DBG_BF_ASSERT, DBG_WARNING, DBG_WARNING1--5, DBG_WARNINGFILE, DBG_ERRORFILE) is obsolete and needs to be cleaned up:

  • To assert invariants of the code (that can only be violated if there are programming errors) use standard C/C++ assert.
  • To log warnings about unusual events (that the code nevertheless needs to handle in some way, like malformed input or I/O failures), use the SAL_WARN... macros from sal/log.h.
  • To log other information useful for debugging, use the SAL_INFO... macros.

See https://wiki.documentfoundation.org/Development#Assertions_and_Logging, the mail thread at http://lists.freedesktop.org/archives/libreoffice/2011-November/020864.html, and the documentation in the sal/log.h header for further information.

要は古くて非推奨になったアサーション・ロギングマクロを、今のスタイルに書き直しましょう、ってだけ。機械的な置換でいけそうだからこれなら自分でもできるやろと。

ビルド環境構築

まずはgitでソースコードをまるっと取って来ます。で、ビルドに必要なライブラリをがっと取ってきて、一回ビルド通します。LibreOfficeのフルビルドは環境にも寄りますけど数時間かかるので、ビルド投入して寝ちゃうのがいいでしょう。

$ git clone git://gerrit.libreoffice.org/core LibreOffice
$ sudo apt-get build-dep libreoffice
$ cd LibreOffice
$ ./autogen.sh --enable-gstreamer --disable-gstreamer-0-10 --with-lang="ALL"
$ make

ビルド終わったらちゃんと動くことを確認します。

$ instdir/programs/swriter &

ヘルプ→LibreOfficeDevについて、を確認。

f:id:naruoga:20141102094904p:image

大丈夫そうですね。


コードの修正

今回の修正は色んなところのソースをお掃除しましょうというネタなので、どこ直してもまあいいわけです。なので直せそうなところをgrepで探しましょう。

豆知識としては、LibreOfficeはビルド時に依存するライブラリのバージョンを固定するために、サーバーにおいてあるtar ballを落としてきてworkdir/UnpackedTarballというところに展開します。その他yaccの生成物とかもあるので、単にgrep -r するとそういうのがいっぱい引っかかってしまうので、git grep使うほうが100倍ぐらい賢いです。

ということで、git grep OSL_ したら、あるわあるわ。どれ直してももちろんよいのですが、一部のソースは特定のconfigureオプションをオンにしないとコンパイルされない(そして、そのconfigureオプションはほとんど誰も使っていない)とかある*4 ので、ちょっとだけ注意が必要です。今回は pyuno/source/module/pyuno.cxx というソースを直すことにしました。変更が2行しかないのでw

ターゲットが決まったらまずは作業ブランチ切りましょう。

git checkout -b work

修正はバグ票にあった他のコミットを見ながら、こんな感じに書き換えればいいのかなと*5

--- a/pyuno/source/module/pyuno.cxx
+++ b/pyuno/source/module/pyuno.cxx
@@ -66,7 +66,7 @@ void PyUNO_del (PyObject* self)
 
 OUString val2str( const void * pVal, typelib_TypeDescriptionReference * pTypeRef , sal_Int32 mode )
 {
-    OSL_ASSERT( pVal );
+    SAL_WARN_IF( !pVal, "pyuno", "pVal != NULL" );
     if (pTypeRef->eTypeClass == typelib_TypeClass_VOID)
         return OUString("void");
 
@@ -124,7 +124,7 @@ OUString val2str( const void * pVal, typelib_TypeDescriptionReference * pTypeRef
         buf.append( "{ " );
         typelib_TypeDescription * pTypeDescr = 0;
         TYPELIB_DANGER_GET( &pTypeDescr, pTypeRef );
-        OSL_ASSERT( pTypeDescr );
+        SAL_WARN_IF( !pTypeDescr, "pyuno", "pTypeDescr != NULL" );
 
         typelib_CompoundTypeDescription * pCompType = (typelib_CompoundTypeDescription *)pTypeDescr;
         sal_Int32 nDescr = pCompType->nMembers;

で、make。フルビルド済ませてあるので、今度はそんなにかからないです。本当はmake checkでユニットテストも通すべき(そもそも、このコードにユニットテスト書くべき)なんですが、私が作業したときのmasterはなぜかmake checkすると通らない(よくあることのようです ^^;)ので、うーんと悩んだ末そのまま。

とりあえず、ローカルの作業ブランチにコミットしておきます。コミットコメントはこんな感じ。バグ修正のときはバグ番号を書くのが決まりです。

fdo#43157 - Clean up OSL_ASSERT, DBG_ASSERT
    
- Clean up OSL_ASSERT

gerritの設定

LibreOfficeでは、Googleが開発したソースコードレビューシステムGerritを使用しています。gerritの持つgitリポジトリにpushすると、その上でdiffを確認しつつ、レビューコメントがついたり質疑応答したりできるシステムです。ビルドbotも走っていて、そのコミットでビルドがぶっ壊れないかも確認してくれます。超便利。MLにパッチ投げて議論して、ってのもいいけど、gerritを使うほうが推奨されてる……はず。

ので、まずはgerritの設定するところから始めます。TDF WikiのGerritの解説ページを見ながら。

最初は https://gerrit.libreoffice.org にてアカウント作成ですが、これは大昔にやったことがあったので省略。Googleアカウントがあれば簡単だった記憶が。で、アカウント設定でgit push用のssh公開鍵を設定しておきます。もちろん専用の鍵ペア作ってもかまいません。

次に、解説ページによると、

You must set your username to match your freenode IRC nick (see 'Username' in your gerrit account settings).

とあるので、freenodeのNick登録しなきゃいけません。IRC技能が低い私はここでしばらく調べまわったのですが、自分 irssi 使ってるので、

/msg NickServ REGISTER <password> youremail@example.com

しといて、

/NETWORK ADD -autosendcmd "/^msg nickserv id <username> <password>;wait 2000" Freenode

でFreenodeのNickとGerritのアカウント名を合わせればいい……のかな。今んとこそうしてます。ただ、irssi常時上げてるわけじゃないし、irssiもnotify上げてくれるわけじゃないので実のところIRCマトモに使えてない。なんかいい方法ないすかね。ま、それはまた別の話。

で、先の解説ページに戻りまして、手動セットアップします。まずは.ssh/configに:

Host logerrit gerrit.libreoffice.org
       IdentityFile /path/to/your/private-key
       User <username>
       Port 29418
       HostName gerrit.libreoffice.org

を追記。秘密鍵のところは、さっきGerritに登録した公開鍵とペアになる鍵を指定しましょう。当たり前ですね。

で、LibreOfficeのソースディレクトリに移動しておいて、

$ ./loggerit test

とやって、"Your gerrit setup was successful!" と表示されればOK。

さてgitにpush先を指定しておきましょう。

$ git config remote.origin.pushurl ssh://logerrit/core

これで準備完了です。


いよいよpush……の前に

なんだかんだで、ソースコードを修正してからココらへんの設定をのたのたやってたので、まる2日ぐらい経ってたのかな?

LibreOfficeは進化が早いソフトウェアなので、2日も経つと当然masterには大量に変更が溜まってる。まあ、ビルド通らなくなるとは思えないけど、もし同じファイルを修正した人がいたりしたら悲しくなるので、念のためmasterを最新にして、自分の変更をその先頭にぶら下げるようにしたい。

私、git力低いので、ホントはこういうときってrebaseでできるのかもなあって思いつつ、悩んだ末masterをpullして最新にした後新たにブランチ切って、そこに作業ブランチの変更をcherry-pickするようにしました。いいのかなあ、こんなやり方で。

$ git checkout master
$ git pull origin master
<ぞろぞろとファイルが降りてくる>
$ git checkuout work
$ git log --oneline | head
<先頭は自分のコミットなのでハッシュ値を見ておく>
$ git checkout -b fdo43157 master
$ git cherry-pick <さっき確認したハッシュ値>
$ make
<ちゃんとmake通ってできたものが動くこと確認>

Gerritにpush

ドキドキしながらpush……してもいいのですが、いきなり投げるのはちょっと怖いので、なんか稽古場があった気がする……って読んだら、

<ローカルブランチ名>:refs/for/master の代わりに <ローカルブランチ名>:refs/drafts/master に投げるとドラフトとしてコミットできるよ

って書いてある。これはドラフトに一旦おいて議論するみたいな使い方をするところなのかなってのも思うのですが、まあ、突っ込んですぐ消すなら大丈夫かな、と……。

で、今の場合は:

$ git push origin fdo43157:refs/drafts/master

すると、「このURLに登録されたよ!」って出るので、そこを見に行くと、draftsにちゃんとコミットがあることが確認できる。

ホントは、このdraftsにadd reviewerしてレビュープロセスに移動するのが正しい使い方らしいのですが、誰をレビュアーにするとかプロセスがわかんなかったので、一度abandonして再度pushすることにしました。いいのかな。不安なので、みなさんはポリシー各自確かめてね。とにかくうりゃっとpush!

$ git push origin fdo43157:refs/for/master

すると、こんな感じで登録されます。あ、これレビューコメント色々もらって修正したやつなので最初とは変わってます。古いパッチも見られますけどね。最初にpushしたのはPatch 1。

pushしてしばらく経つと「ビルドbotが起動したよ」「ビルド成功したよ」とメールが来ます。ほっと一安心。あとは人間のレビュアーの登場を待ちます。


ライセンス宣言

おっと、ライセンス宣言もしないといけません。開発者・貢献者リストのページにあるとおり、開発者メーリングリストに:

All of my past & future contributions to LibreOffice may be

licensed under the MPLv2/LGPLv3+ dual license.

というメールを投げる必要があります。著作権譲渡や契約の締結などは不要です。めっちゃカジュアルですね。

本当は先の開発者リストWikiに自分の名前書かなきゃらしいのですが、このWiki超重要なので間違って編集したら怖いな、いわれたらやろうということで一旦保留*6


レビュー指摘反映

さて、ドキドキしながら待ってたら、コメントがつきました。まずはTakeshi Abeさん*7からの二つのコメント。

  • SAL_WARN_IFの第三引数は「こういう状態だからおかしいよ」ってものをログに残すものだから、条件逆じゃない?
  • SAL_WARN_IFの第二引数に指定するログエリアはinclude/sal/log-areas.doxに定義しないとダメだよ。

二番目の指摘は完全に見落としだったんですが、最初の指摘は……私はなにを考えていたんでしょう。まあ、勘違いとしかいいようがないですね。お恥ずかしや。

次の指摘はバグ#43157のreporterでもあるStephan Bergmannさんによるもの。

  • これ両方とも、NULLだったら後ろ死ぬからワーニングじゃなくてアサートにすべきじゃない?

……むぐ。そりゃそうだ。何を考えていたんでしょうワタクシ。

言い訳するとSAL_WARN_IFとかを定義してるinclude/sal/log.hxxにはアサートに当たるものがなかったのと、同じバグ票に対するこちらのコミットだとOSL_ASSERTをSAL_WARN_IFに書き換えているコードがあったからというのはあるんだけど、それはプログラマー的には思考停止であって言い訳にもならん。あかんわ。

で、間抜けな私はあれ、アサートのマクロってなくない?どれ使えばいいんだろ?と動揺して、日本語メーリングリストで質問したら、「いやいやC++のassert()でいいでしょう」ってCalcハッカーのKohei Yoshidaさんから教えてもらった。……あ。そうだね。そりゃそうだ。というか、バグ票にも " To assert invariants of the code (that can only be violated if there are programming errors) use standard C/C++ assert." って書いてあるじゃんかー。頭悪いな。

ということで、assert() に直した奴を再度コミット。--amend でコミットするとChange-Id:を見て、同じgerritエントリーに登録してくれるとな。素晴らしい。ので、それをpush。えいっ。これがPatch 2。


再びレビュー待ち……そして。

またビルドbotからのメールを受け取ってドキドキしながら待ってたら、「いいみたいだね、でもassert()使うなら #include <cassert> を明示的にするほうがいいと思うな。この場合は他のヘッダでincludeされてるから問題ないけどね」って指摘をもらった。けど、それは別途直しておくよってことでパッチはacceptされて、無事コミットは取り込まれました。わーい!

http://cgit.freedesktop.org/libreoffice/core/commit/?id=922f2005f34589e60969be3f2bf74e4af58e2e69


感想

  • 仕組みはいろいろ良くできてる。ドキュメントが少し散らかってる感じはあるけど、ちゃんと読めばわかる。
  • Gerritすごく良くできてて感動。
  • みなさん大変親切でありがたや。お世話になりました。
  • 次はもうちょっと機能や不具合に関わる修正に挑戦したいな。


参考資料:Tomofumi Yagiさんの発表資料 (2014.11.05追記)

LibreOfficeへのコミットについては、Tomofumi Yagiさんのスライドが非常に参考になるので紹介しておきます。私が書かなかったOpenGrokなどについても説明されていて、必読です。

*1:あーもちろん、翻訳やアウトリーチ・プロモーションやその他の活動もやっぱり大事なんですよ。わかりやすいように極端な言い方をしてるだけで。

*2:タイトルの通り、東京エリアDebian勉強会の皆さんには大変お世話になりました。またコラボしましょう!

*3LibreOfficeはgitで管理されており、誰でも1行からコミット可能なので、例えばApache OpenOfficeのように特定のコミッターという権限を持つ人がいるわけではありません。コードが取り込まれれば誰でもコミッターです。

*4:BernのHackNightで挑戦したのがうまく行かなかったのはこれが原因。

*5:あ、間違ってるってのは知ってるので、ちょっと待ってね。

*6:結局は、後述のStephenさんがやってくれました。

*7LibreOffice日本語チームのメンバーで、アクティブにコミットされている安倍さん。

2014-08-28

SoftLayerでベアメタルインスタンスを借りてLibreOfficeをビルドしてみたよ

小ネタ。

IBM印のクラウドサービスであるSoftLayerは仮想化によるインスタンスだけでなくベアメタルサーバーをダッシュボード上ぽちぽちで借りられることで有名ですが、今まではひと月ごとの貸出だったのでシャレで借りるにはちょっと高いなって思って距離置いて見てました。

でもなんか、ある日突然、時間単位課金が可能になってるじゃないですか。超びっくり。これは試すしかない!

最初は一番格安な2coreあたりを借りようと思ったんですが、とりあえずいっちゃん高いのってどれぐらいなんやろって思ってえいっと16core 64GBメモリを選んで価格を見てみたら、時間あたり$1.2ちょっと。ペットボトル1本分? じゃあシャレで借りてみるか、破産するほどじゃないだろ、ってことで借りてみました。

ベアメタルサーバーの振り出しは早ければ30分と言われてますが、ぼくの場合、たぶん高い奴を選んだからなのでしょう、申し込みしてからacceptに1時間ぐらいかかり、課金しますよって連絡にそれから2時間、さらにプロビジョニング終了って言われたのがさらに1時間後ぐらいなので、結構かかってますね。

借りてなにをやるかというと、LibreOfficeのビルドをベンチするに決まっていますw

とりあえず /proc/cpuinfo と /proc/meminfo 貼っておきます。

$ cat /proc/cpuinfo 
processor       : 0
vendor_id       : GenuineIntel
cpu family      : 6
model           : 62
model name      : Intel(R) Xeon(R) CPU E5-2650 v2 @ 2.60GHz
stepping        : 4
microcode       : 0x416
cpu MHz         : 2600.052
cache size      : 20480 KB
physical id     : 0
siblings        : 16
core id         : 0
cpu cores       : 8
apicid          : 0
initial apicid  : 0
fpu             : yes
fpu_exception   : yes
cpuid level     : 13
wp              : yes
flags           : fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush dts acpi mmx fxsr sse sse2 ss ht tm pbe syscall nx pdpe1gb rdtscp lm constant_tsc arch_perfmon pebs bts rep_good nopl xtopology nonstop_tsc aperfmperf eagerfpu pni pclmulqdq dtes64 monitor ds_cpl vmx smx est tm2 ssse3 cx16 xtpr pdcm pcid dca sse4_1 sse4_2 x2apic popcnt tsc_deadline_timer aes xsave avx f16c rdrand lahf_lm arat epb xsaveopt pln pts dtherm tpr_shadow vnmi flexpriority ept vpid fsgsbase smep erms
bogomips        : 5200.10
clflush size    : 64
cache_alignment : 64
address sizes   : 46 bits physical, 48 bits virtual
power management:

processor       : 1
vendor_id       : GenuineIntel
cpu family      : 6
model           : 62
model name      : Intel(R) Xeon(R) CPU E5-2650 v2 @ 2.60GHz
stepping        : 4
microcode       : 0x416
cpu MHz         : 2600.052
cache size      : 20480 KB
physical id     : 0
siblings        : 16
core id         : 1
cpu cores       : 8
apicid          : 2
initial apicid  : 2
fpu             : yes
fpu_exception   : yes
cpuid level     : 13
wp              : yes
flags           : fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush dts acpi mmx fxsr sse sse2 ss ht tm pbe syscall nx pdpe1gb rdtscp lm constant_tsc arch_perfmon pebs bts rep_good nopl xtopology nonstop_tsc aperfmperf eagerfpu pni pclmulqdq dtes64 monitor ds_cpl vmx smx est tm2 ssse3 cx16 xtpr pdcm pcid dca sse4_1 sse4_2 x2apic popcnt tsc_deadline_timer aes xsave avx f16c rdrand lahf_lm arat epb xsaveopt pln pts dtherm tpr_shadow vnmi flexpriority ept vpid fsgsbase smep erms
bogomips        : 5200.10
clflush size    : 64
cache_alignment : 64
address sizes   : 46 bits physical, 48 bits virtual
power management:

processor       : 2
vendor_id       : GenuineIntel
cpu family      : 6
model           : 62
model name      : Intel(R) Xeon(R) CPU E5-2650 v2 @ 2.60GHz
stepping        : 4
microcode       : 0x416
cpu MHz         : 2600.052
cache size      : 20480 KB
physical id     : 0
siblings        : 16
core id         : 2
cpu cores       : 8
apicid          : 4
initial apicid  : 4
fpu             : yes
fpu_exception   : yes
cpuid level     : 13
wp              : yes
flags           : fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush dts acpi mmx fxsr sse sse2 ss ht tm pbe syscall nx pdpe1gb rdtscp lm constant_tsc arch_perfmon pebs bts rep_good nopl xtopology nonstop_tsc aperfmperf eagerfpu pni pclmulqdq dtes64 monitor ds_cpl vmx smx est tm2 ssse3 cx16 xtpr pdcm pcid dca sse4_1 sse4_2 x2apic popcnt tsc_deadline_timer aes xsave avx f16c rdrand lahf_lm arat epb xsaveopt pln pts dtherm tpr_shadow vnmi flexpriority ept vpid fsgsbase smep erms
bogomips        : 5200.10
clflush size    : 64
cache_alignment : 64
address sizes   : 46 bits physical, 48 bits virtual
power management:

(中略)

processor       : 15
vendor_id       : GenuineIntel
cpu family      : 6
model           : 62
model name      : Intel(R) Xeon(R) CPU E5-2650 v2 @ 2.60GHz
stepping        : 4
microcode       : 0x416
cpu MHz         : 2600.052
cache size      : 20480 KB
physical id     : 0
siblings        : 16
core id         : 7
cpu cores       : 8
apicid          : 15
initial apicid  : 15
fpu             : yes
fpu_exception   : yes
cpuid level     : 13
wp              : yes
flags           : fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush dts acpi mmx fxsr sse sse2 ss ht tm pbe syscall nx pdpe1gb rdtscp lm constant_tsc arch_perfmon pebs bts rep_good nopl xtopology nonstop_tsc aperfmperf eagerfpu pni pclmulqdq dtes64 monitor ds_cpl vmx smx est tm2 ssse3 cx16 xtpr pdcm pcid dca sse4_1 sse4_2 x2apic popcnt tsc_deadline_timer aes xsave avx f16c rdrand lahf_lm arat epb xsaveopt pln pts dtherm tpr_shadow vnmi flexpriority ept vpid fsgsbase smep erms
bogomips        : 5200.10
clflush size    : 64
cache_alignment : 64
address sizes   : 46 bits physical, 48 bits virtual
power management:
$ cat /proc/meminfo 
MemTotal:       65942284 kB
MemFree:        47738556 kB
Buffers:          602552 kB
Cached:         15199592 kB
SwapCached:            0 kB
Active:         12728520 kB
Inactive:        3615036 kB
Active(anon):     544096 kB
Inactive(anon):      540 kB
Active(file):   12184424 kB
Inactive(file):  3614496 kB
Unevictable:        3708 kB
Mlocked:            3708 kB
SwapTotal:        999420 kB
SwapFree:         999420 kB
Dirty:             36740 kB
Writeback:           176 kB
AnonPages:        545164 kB
Mapped:             9476 kB
Shmem:               744 kB
Slab:            1394684 kB
SReclaimable:    1319144 kB
SUnreclaim:        75540 kB
KernelStack:        1656 kB
PageTables:         3644 kB
NFS_Unstable:          0 kB
Bounce:                0 kB
WritebackTmp:          0 kB
CommitLimit:    33970560 kB
Committed_AS:     613892 kB
VmallocTotal:   34359738367 kB
VmallocUsed:      376288 kB
VmallocChunk:   34359354112 kB
HardwareCorrupted:     0 kB
AnonHugePages:    538624 kB
HugePages_Total:       0
HugePages_Free:        0
HugePages_Rsvd:        0
HugePages_Surp:        0
Hugepagesize:       2048 kB
DirectMap4k:       78800 kB
DirectMap2M:     3031040 kB
DirectMap1G:    66060288 kB

16コアなのでえらいことになってるな。途中省略しました。

あーついでに uname -a も。

Linux XXXXX 3.13.0-34-generic #60-Ubuntu SMP Wed Aug 13 15:45:27 UTC 2014 x86_64 x86_64 x86_64 GNU/Linux

で、LibreOfficeをさくっとビルドしましょう。まずはお約束:

# apt-get install build-essential git
# apt-get build-dep libreoffice

して、rootのままだとアレなので一般ユーザーにスイッチして、

$ git clone git://gerrit.libreoffice.org/core LibreOffice

してmasterを取ってくる。LibreOfficeにcdして、

$ ./autogen.sh --with-package-format="deb" --enable-epm --with-parallelism=16 --with-lang="ALL"

だ! 16コアでメモリもうんとこさ載ってるので、とーぜん--with-parallelism=16である。

おっと、gstreamerがなんとかいって怒られる。そういやmasterでは使ってるgstreamerのバージョンが違うかなんかだったな。ということで、

# apt-get install libgstreamer0.10-dev libgstreamer-plugins-base-0.10-dev

としてもっかいautogen叩くと、OK、Makefileができた。

あとは:

nohup time make &

して、そのままほっといた。

で、帰る途中にご飯食べてお家帰ってお風呂入ってから確認したら、正常にmakeは成功してるっぽい。

nohup.logの末尾はこんな感じ。

[build CUS] instsetoo_native/install
[build BIN] instsetoo_native
[build MOD] instsetoo_native
[build MOD] libreoffice
[build BIN] top level modules: libreoffice
[build BIN] loaded modules: UnoControls accessibility accessories android animations apache-commons apple_remote avmedia basctl basebmp basegfx basic bean beanshell binaryurp boost bridges canvas chart2 cli_ure clucene codemaker coinmp collada2gltf comphelper configmgr connectivity cppcanvas cppu cppuhelper cppunit cpputools cui curl dbaccess desktop drawinglayer dtrans editeng embeddedobj embedserv epm eventattacher expat extensions external extras filter firebird forms formula fpicker framework glew glm graphite harfbuzz helpcompiler hsqldb hunspell hwpfilter hyphen i18nlangtag i18npool i18nutil icu idl idlc instsetoo_native io javaunohelper jfreereport jurt jvmaccess jvmfwk l10ntools lcms2 libabw libcdr libcmis libebook libetonyek libexttextcat libfreehand libgltf liblangtag libmspub libmwaw libodfgen liborcus libpagemaker libpng librelogo libreoffice libreofficekit librevenge libvisio libwpd libwpg libwps libxmlsec lingucomponent linguistic lotuswordpro lpsolve mdds more_fonts mythes neon np_sdk nss o3tl odk offapi officecfg oovbaapi oox opencollada openldap openssl package poppler postgresql postprocess pyuno qadevOOo readlicense_oo redland registry remotebridges reportbuilder reportdesign rhino ridljar rsc sal salhelper sax sc scaddins sccomp scp2 scripting sd sdext setup_native sfx2 shell slideshow smoketest solenv soltools sot starmath stoc store svgio svl svtools svx sw swext sysui test testtools toolkit tools touch tubes ucb ucbhelper ucpp udkapi unodevtools unoidl unoil unotest unotools unoxml ure uui vbahelper vcl vigra winaccessibility wizards writerfilter writerperfect xmerge xmlhelp xmloff xmlreader xmlscript xmlsecurity
[build ALL] top level modules: build-non-l10n-only build-l10n-only
[build ALL] loaded modules: UnoControls accessibility accessories android animations apache-commons apple_remote avmedia basctl basebmp basegfx basic bean beanshell binaryurp boost bridges canvas chart2 cli_ure clucene codemaker coinmp collada2gltf comphelper configmgr connectivity cppcanvas cppu cppuhelper cppunit cpputools cui curl dbaccess desktop drawinglayer dtrans editeng embeddedobj embedserv epm eventattacher expat extensions external extras filter firebird forms formula fpicker framework glew glm graphite harfbuzz helpcompiler hsqldb hunspell hwpfilter hyphen i18nlangtag i18npool i18nutil icu idl idlc instsetoo_native io javaunohelper jfreereport jurt jvmaccess jvmfwk l10ntools lcms2 libabw libcdr libcmis libebook libetonyek libexttextcat libfreehand libgltf liblangtag libmspub libmwaw libodfgen liborcus libpagemaker libpng librelogo libreoffice libreofficekit librevenge libvisio libwpd libwpg libwps libxmlsec lingucomponent linguistic lotuswordpro lpsolve mdds more_fonts mythes neon np_sdk nss o3tl odk offapi officecfg oovbaapi oox opencollada openldap openssl package poppler postgresql postprocess pyuno qadevOOo readlicense_oo redland registry remotebridges reportbuilder reportdesign rhino ridljar rsc sal salhelper sax sc scaddins sccomp scp2 scripting sd sdext setup_native sfx2 shell slideshow smoketest solenv soltools sot starmath stoc store svgio svl svtools svx sw swext sysui test testtools toolkit tools touch tubes ucb ucbhelper ucpp udkapi unodevtools unoidl unoil unotest unotools unoxml ure uui vbahelper vcl vigra winaccessibility wizards writerfilter writerperfect xmerge xmlhelp xmloff xmlreader xmlscript xmlsecurity
50434.17user 2769.59system 1:20:07elapsed 1106%CPU (0avgtext+0avgdata 887460maxresident)k
42904inputs+66557720outputs (299major+781442922minor)pagefaults 0swaps

まあビルドログはいいとして、ビルド時間は1:20:07ってこと?

私Linux力弱いんで読み違いならすみません。まあ、そこそこ早いかなって思います。

とっととサーバー落とさないとお小遣い減っちゃうのでこんなとこで。小ネタで失礼しました。んじゃ!