おがさわらなるひこのオープンソースとかプログラミングとか印刷技術とか

おがさわらなるひこ @naru0ga が技術系で興味を持ったりなんだりしたことをたまーに書くブログです。最近はてなダイアリー放置しすぎて記事書くたびにはてな記法忘れるのではてなブログに移行しました。

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

LibreOfficeの質問をメーリングリスト以外にするには(Ask.LibreOffice.orgのご紹介)

今日はスーパー小ネタ。

先日はNabbleフォーラムを用いたメーリングリストの投稿の仕方を説明しましたが、今日はそれ以外にLibreOfficeで質問をしたい場合はどこを使えばいいかという話を超カンタンにします。

Ask.LibreOffice.org

というサイトを皆さんご存知でしょうか?

http://ask.libreoffice.org/

これは、知っている人は知っている(技術系の人はご存じの方が多いかな?)StackOverflowとかに近い質問投稿サイトです。AskBotとか呼ばれます。

このサイトのポイントは:

  • 投稿した質問に情報が足りなかった場合、あとから質問自体を編集できる。これによって「後から同じ問題にハマった人にも役立つ、よりよいQ&A」を作れる
  • 質問や回答に対してプラスやマイナスの投票をユーザーがすることができ、有益なやりとりだったかどうかを判断できる
  • 「この回答で解決したよ」という回答にチェックを付けられる

ので、使うときには「単なる質疑応答」ではなくて、「よりよいQ&Aを作るんだよ」ということを意識してもらえるとうれしいです。

あまり知られていないのかまだまだ質問・回答共に少ないので、みんな使ってもらえるとうれしいです。

今日はスーパー小ネタなので使い方とかは次回に譲ります。すみません。すみません。

LibreOfficeのメーリングリストへの投稿

この記事はLibreOffice Advent Calendar 2015の9日目でした。昨日はkomiyatatshさんの「「リブレオフィス(仮)」を導入してみたテンマツ」でした。

(注: この記事については事実誤認がありました。詳しくはこの記事の終わりを参照してください。)

LibreOfficeについてなにか質問や不具合を見つけたら、メーリングリスト(Mailing List、以下MLと略すこともあり)に投稿するのが、一番みんなに見てもらいやすい方法です……そんな文章を目にしたり耳にしたり、というご経験があるかたもいるかもしれません。

とはいえ、LibreOfficeメーリングリスト事情はちょっと過渡期で、情報が不足しているところもあるので、ここでカンタンに紹介しましょう。

そもそもメーリングリストとは

メーリングリスト」というのは、あるアドレスにメールを投稿すると、登録されたメールアドレスにそのメールが一斉に送信されてみんなで情報を共有できるしくみのことです(Wikipediaの説明)。

LibreOfficeの日本語コミュニティには一般に投稿できる二つのメーリングリスト

  • users@ja.libreoffice.org (一般ユーザー向け)
  • discuss@ja.libreoffice.org (コミュニティについての議論向け)

があります。また、購読だけができ、限られた管理者だけが投稿できるリストとして:

もあります。

これ以外にも世界中ではいろんなメーリングリストがありますが、その説明はまた、別の機会に……。

メーリングリストへの投稿は「Nabbleフォーラム」から

LibreOfficeの日本語ページである http://ja.libreoffice.org/ のトップバーにある「ヘルプ」(これは「役立つ情報」ぐらいのニュアンスなのですが、歴史的理由でこうなってます)に、昔はメーリングリストの情報がありました。

が、今は存在しません……。

f:id:naruoga:20151209001444p:plain

代わりにあるのが「Nabbleフォーラム」というものです。ともあれ、これをクリックしてみましょう。

f:id:naruoga:20151209001610p:plain

こんな感じの画面になると思います。

これはメーリングリストをWebフォーラムのようにみせるNabbleというソフトウェアで、先ほどのべた users メーリングリストを表示しているところです。

他人の記事を読んでみる

読むだけであればWebフォーラムのようにカンタンです。記事のタイトルがリンクになっていますから、

f:id:naruoga:20151209002746p:plain

これをクリックしてみましょう。次のように記事が読めます。

f:id:naruoga:20151209002912p:plain

Nabbleにアドレスを登録する

読むだけならよいのですが、新しく記事を書いたり、誰かの記事に返信したりといった場合には、メールアドレスを登録しなければなりません。Nabbleはあくまでも見せ方をWebフォーラム風にしているだけで、記事の投稿・返信といった機能は、実際にはメールのやりとりが発生するからです。

アドレスの登録には、さきほどのトップ画面から「Register」をクリックします。

f:id:naruoga:20151209003206p:plain

するとこんな画面が表示されるので、必要事項を記入します。

f:id:naruoga:20151209003844p:plain

項目 意味
User Name ユーザーの名前。アルファベットのほうが無難かも
Email メールアドレス
Password パスワード
I have read ... 使用条件に同意するかどうかをチェックボックスで示します。

で、ロボット避けのコードを入力してSubmitします。

すると、こんなメールが飛んでくるはずです。 もしメールが届かない場合は、SPAMに落ちていないかどうかチェックしてください。

f:id:naruoga:20151209004748p:plain

黄色の部分のリンクをクリックして、メールアドレスを確認しましょう。

f:id:naruoga:20151209004947p:plain

こんな画面に遷移して、メールアドレスの登録完了です。「Continue」を押すと、登録したメールアドレスでNabbleにログインした状態で、users メーリングリストのNabbleフォーラムに移動します。

users メーリングリストを購読して、新規にメールを投稿する……手前まで練習する

では次にusersメーリングリストに記事を投稿してみましょう。……といっても、実際に記事を投稿すると、購読者みんなに行ってしまうので、実際の投稿の直前で止めます。

と、その前に、usersメーリングリストに投稿するには、usersメーリングリストを購読しなければいけません。「あれ、さっきメールアドレス登録したじゃん」と思うかもですが、先ほどの登録はNabble全体への登録で、メーリングリストの購読はそれぞれのメーリングリストごとに行う必要があるのです。

なお、「メーリングリストの購読」というのは、上で述べたように「メーリングリストを使っての情報交換に参加する」という意味なので、メーリングリストに投稿されたメールを受け取りますよ、という意思表示になります。人の投稿を受け取る気はないけど自分の質問だけはポストしたい、ということはできないので、ご注意ください。

購読の手続きはカンタンで、まずは記事の投稿を意味する「New Topic」をクリックします。

f:id:naruoga:20151209005800p:plain

すると、こんなポップアップが出てきます。

f:id:naruoga:20151209010044p:plain

英語でいろいろと書いてありますが要は「このフォーラムは users@libreoffice.org のゲートウェイなわけで、users@... は投稿するには購読が必要なんだけども、Nabbleは自動的に購読処理をしないので、投稿するんだったらその前に購読してね。今購読する?」と聞いてきてるわけです。

そこで「Subscribe」ボタンを押してください。users+help@libreoffice.org からこんなメールが届くはずです。

f:id:naruoga:20151209010621p:plain

このメールに空返信すると、今度はWelcomeメールが届くでしょう。ばんざい! usersメーリングリストを購読できました。

では、再度フォーラムに戻って「New Topic」を押下、さっきと同じポップアップが出ますが、「I'm a subscriber, let me post now」(私は購読者なので、投稿させてちょうだい)というボタンをクリックしましょう。

f:id:naruoga:20151209011401p:plain

投稿画面が出てきました。

あとは普通のWebフォーラムのように投稿できます。プレビューもあるのでうまく活用してください。また、メーリングリストにはいくつかのエチケットがありますが、それはここでは深入りしないことにします。ひとつだけ上げれば、表題は適切に付けましょう……ぐらいでしょうか。

メールを使った投稿

なお、メーリングリストをご存知の方は、この状態であれば単に users@libreoffice.org にメールすれば投稿できるんじゃないか? と思われるかたもいると思います。はい、そのとおりです。別にNabbleを使う必要はありません。

ただ、Nabbleを使ったほうがいい場合が一つあって、Nabbleには画像の貼り付け機能があるんですね(さっきのスクリーンショットの「Insert Image」)。LibreOfficeのMLは、メール経由での投稿では添付ファイルを許可しない設定になっていますので、バグ報告などでスクリーンショットを貼りたいときにはNabbleを使うのがよいでしょう。

返信

Nabbleフォーラムで投稿を読んだときに、これに返信したい、と思ったときには、Reply ボタンを押しましょう。

f:id:naruoga:20151209012544p:plain

そこから先は新規投稿とほとんど同じです。違いは、最初から表題が:

Re: <元投稿の表題>

となっていることです。便利ですね。

ほかのメーリングリストへの投稿

usersが分かってしまえばdiscussの投稿も同じなのですが、どうやってたどりつくかがわかりにくいです。

usersフォーラムの上のほうのパンくずリストから「Japanese」をクリックしましょう。

f:id:naruoga:20151209013130p:plain

すると日本語メーリングリストの三つがリスト化されているので:

f:id:naruoga:20151209013325p:plain

"Discuss" をクリックしましょう。

f:id:naruoga:20151209013905p:plain

discussメーリングリストのフォーラムに遷移できました。

フォーラムをブックマーク

フォーラムの右上にある、先ほど利用した「Register」の並びの「permalink」をクリックすると、それぞれのフォーラムに直接飛べるリンクを取得できます。これをブックマークしておけば、メーリングリストへの投稿も楽ちんになります。

おわりに

今回はNabbleインタフェースを利用したメーリングリストへの投稿について紹介しました。実のところ、私もサイトの構造がNabble推しになっている(昔ながらのメールを使って登録するメーリングリストの紹介ページがトップから辿りつけない)ことをつい最近知ったので、ここ一度整理しておかなきゃなと思っていたところでした。

私は古い人間なのでメーリングリストはメールでやり取りするほうがラクだったりするのですが、それでも画像添付などNabbleならではの機能もありますし、賢く使い分けていきたいですね。あと、Nabbleには英語が大量に残っているので、どうやったら翻訳できるのか調べて、日本語化も進めていきたいと思います。

明日はnogajunさんの「LibreOfficeの文書とPDFに電子署名するよ」ですね。よろしくお願いします!


2015.12.13追記:メーリングリストのアドレスに、日本語メーリングリストであることを意味する「ja.」が抜けてましたので修正しました。


2015.12.31追記:

この記事は「LibreOfficeのWebサイトを参照すると、LibreOfficeプロジェクト的にはメーリングリストは非推奨でNabble推し」という視点の元に書かれております。その根拠として、http://ja.libreoffice.orgの「ヘルプ」のメニューに「メーリングリスト」のリンクが存在しないという理由を挙げていました。

ですが、英語版のサイトhttp://www.libreoffice.orgのメニューを見ると……あれ?

f:id:naruoga:20160101012306p:plain

あるじゃない!

い、言い訳なんですけど、昔のある時期にない時代があったんですよ、たぶん。ちょっと前のどこかのOSCで、何かの質問に答えようとして、あれっと思った記憶がある。で、それに伴って日本語のメニューからも消え失せた。

なので、たぶんですけど、LibreOfficeプロジェクトとして、Nabble推奨という方向に一度は行ったというのはそうだと思うんですよ。

でも、やっぱMLの方がいいじゃん、いやNabble推してもいいけど、MLについてを隠さなくても良くない?みたいな議論でもあって復活したとか、そういう話じゃないのかなあ。想像ですが。勘違いでしたらすみません。

どっちにしても、今「ヘルプ」以下に「メーリングリスト」ってリンクがないのは不具合なので、それは対応をお願いすることにします。本エントリーを書く際に、英語版のサイトを確認しなかったのは申し訳ないです。ぺこり。

けどNabbleはスクショとか添付できて便利なこともあるので、もしよかったら使ってみてくださいね。ということで。

LibreOffice Conference 2015 Aarhus 裏リポート

どうもこんにちは。今年もあっという間に12月になってしまいました。クリスマスまで、また新しい年まで、あとちょっとですね。

ということでこのエントリーは、LibreOffice Advent Calendar 2015の初日ということになります。

表題のとおり、LibreOffice Conference 2015 Aarhusに行ってきました。カンファレンスレポートはITProさんに載せていただきました:

itpro.nikkeibp.co.jp

が、ここではレポートに書かなかった細々としたあれこれを。

昨年も同じネタを書いたのですが、LibreOffice Conferenceに限らず、海外のカンファレンス参加してみようかなーという人の参考になればいいなと思いまして。

お金とかそういう話

ヨーロッパにぶち抜き1週間で滞在するとなると、お金の面が気になる方もいるかなあと思いまして最初にこの話を持ってきました。

まずお断りですが、LibreOffice Conferenceは無償です。私が参加した3回(2012年ベルリン、2014年ベルン、2015年オーフス)では、ベルリンだけ50EURの参加費用がありましたが、それ以外は毎回参加費なしです。

参加登録することによって受けられるサービスは:

  • すべてのカンファレンスのプログラムに参加する権利
  • 会期中すべての
    • コーヒーあるいはお茶飲み放題
    • ランチ
    • ティータイムのお菓子
  • 事前登録したディナー(9/22、9/23、9/24の3夜)

です。うーん、太っ腹。スポンサーさまさまです。

f:id:naruoga:20150923124540j:plain スポンサーフラッグ。隣りにあるのはメインスポンサーの一社CIBのもの。

さて、それ以外にかかる経費ということで、旅費交通費が主でしょうか。だいたいこんな感じです。

費目 費用(日本円) 備考
航空券 270,940 スカンジナビア航空 成田-コペンハーゲン-オーフス
宿泊 38,893 9/20〜9/27 7泊8日
309,833

後述しますが今回のLibreOffice Conferenceの会期はシルバーウィークともろかぶりで、休みやすかったのはよいのですが、ちょっと手配が遅れたら飛行機代がガツンとあがりました。手配する1ヶ月ぐらい前に見積もり取ったら20万ちょっとだった記憶があります。この便も空席ギリギリで確保した次第です。何事もギリギリまで引っ張るのはよくないですね。

それ以外に現地でご飯食べたりおみやげ買ったりするために、3万円を現地通貨(デンマーククローネ)に変えて持って行って、カード支払いの分も含めると5万円ぐらいはつかってたかもしれない。デンマークは一概に物価が高いですね。

うへー、35万かぁ〜〜〜〜。と、思いますが、実はThe Document Foundationのメンバーであれば宿泊費と現地までの旅費(つまり上の表にある分)については満額補助が出ます*1。これもTDFに寄付してくれている皆さん&TDFをスポンサーしてくれている企業のお陰であります。ありがたやありがたや。そんなわけで、せいぜい5万円で楽しめるわけです。

TDFのメンバーじゃない場合でも、発表者であれば、交渉すればいくらかの補助は得られると思います(約束はできませんが、アジア圏からの発表は求められているので、お金の問題だったらなんとかするよ、とはいわれました)。

現地の交通の話

まずは、どうやって行って帰るかです。

オーフスまでは直行便がないので、コペンハーゲンまで飛んでから鉄道で入る方法、飛行機で入る方法とあります。ぼくはめんどくさかったのでJTBに手配をお任せしたら、鉄道という選択肢はありませんでした。

ただ、コペンハーゲンまでの飛行機がもう十分高くて、オーフスまで飛ぶ国内線はたいした値段ではなかったので、鉄道と値段は驚くほど差はなかったと思います。鉄道旅の方が旅情があってよかったかなーとは思いましたけども、国内便の飛行機はキュートでこれはこれでよかったです。

f:id:naruoga:20150920185544j:plain 確かATR-72っていったかな。窓越しにプロペラがぶんぶん回っていていい感じ。

ここらへんを悩むのが、めんどうっちゃめんどうですがヨーロッパっぽくて楽しいともいえます。

オーフスの空港から都市部までは直行バスが出てます。飛行機の時間に併せて出てるはずなんですが、あんまり時間の余裕がなくて「ホントに乗れるのかよこれ」ってちょっと焦ったりしましたが、空港が小さかったので余裕でした。

オーフスはちっちゃい街なので、観光その他はぜんぶ歩き通しました。バスもあるけど一度も乗らなかった。 厳密にいえば、HackNightをやったオーフス大学まではかなり遠かった(徒歩40分ぐらいかな?)んですが、地図を見間違えて半分ぐらいの距離だと思い込んでて歩き始めて、気づいたときにはもうバス路線から離れてしまったので歩くしかなかったというね(しかも雨に降られて非常に悲しかった)。

宿泊

宿は今回もAirBnBでした。毀誉褒貶あるサービスだけど、現地のホストとのふれあいみたいなものを求めるならいいんじゃないかなーと思います。ホストがすっごい親切な人でよかったです。

会場までは徒歩10分強で、近くはなかったけど散歩にはよい距離でした。市街地からは少し離れた住宅街だったので、静かでよかったですね。

多くの参加者はローカルチームが紹介していた会場近くのホテルに泊まっていました。飲んだ後一緒に帰れるのは少しうらやましかったかも。どうせ旅費出るんだし、同じホテルに泊まるのもいいですね。

日程とか観光とか

今回はシルバーウィークと重なったお陰で、夏休み2日くっつけるだけで土日月火水木金土日月と11日もお休み取れたんですよね。しかし飛行機の都合があり出発は9/20の日曜日、帰ってきたのが9/28月曜日の朝でした。本当は日曜日のうちに帰ってきて、ゆっくり休んでから仕事と思ってたんですが、飛行機取れなかったのでしょうがない。朝着だっただけマシと思いましょう。

それはさておき、カンファレンスは:

  • 9/22(火) コミュニティデー;ネイティブ言語コミュニティのラウンドテーブル
  • 9/23(水)〜9/25(金):カンファレンス本番

という会期なので、9/21はフリーでした。が、資料作りに忙しくて……ははは。

気分転換に会場のDokk1を下見に行ったら、知り合いがいっぱいいて、なんだ、お前たちも今日から来てたのかー、じゃあ晩飯でも行くか!みたいな感じになるところが、まあ、いつもの感じです。

9/26(土)はすべて終わってのんびりだったので、街歩きをしました。美術館のARoSとか大変楽しかったです。町並みも綺麗ですしね。

f:id:naruoga:20150926150707j:plain 名物「巨大な少年」。

f:id:naruoga:20150926134908j:plain レインボーカラーの展望台から町並みを眺める

せっかくなので、余裕があれば一日ぐらい観光する日を作ったほうがいいと思います。できればカンファレンスが終わった「後」に。

言葉とか

去年と同じことを書きますけど、カンファレンスの公用語は英語です。が、みんな別にネイティブではないし、共通の話題もあるので、英語っぽい何かで通じます。だいじょぶです。

去年のベルンや今年のオーフスは観光地だったせいか、現地語がわからなくて困るという状況はほとんどなかったですねえ。というか、挨拶とありがとうぐらいはデンマーク語覚えていけばよかった。失敗。

さて来年

来年のカンファレンスは、2016年9月7〜9日で、チェコのブルノで行われる予定です。今年のように休みとくっついていないので大変ですが、また行きたいなーと考えています。またレポートかければいいな。

なんか散漫なレポートですみません。明日は榎さんの「今年のLibreOfficeイベント振り返り」ですね。よろしくお願いします!

*1:これを書いてる現在、まだ申請出してないんですけどね……早く手続きしなきゃ。

NVDAワールド2015東京に参加してきました。

ブログお引っ越し記念に、久しぶりの新着記事。

昨日は、オープンソースの画面読み上げソフト(スクリーンリーダー)NVDAのイベント「NVDAワールド2015 東京」に行ってきました。

私は「特別講演」という枠で「LibreOffice〜自由なオフィス統合環境とそのアクセシビリティ事情〜」という内容を話してきました。発表資料をおいておきます。

NVDA日本語チームの西本さんからお声がけいただいたときは、そういうトランスコミュニティの試みはすごく意義があると思うけれど、私アクセシビリティ事情詳しくないですよ、ということをお伝えしたら、いや同じオープンソースとして、LibreOfficeというコミュニティがどういう風に活動しているのかを紹介して貰いたい、ということで、そういうことなら、ということでお引き受けしました。

とはいえ、LibreOfficeアクセシビリティの現状についてまったく(私が)知らないのもどうかなと思ったので、超大急ぎで調べたのですが、そもそも手元に自由にいじれるWindowsがなくて、NVDAをインストールすることすらできず。 やはり付け焼刃はいけませんね、「アクセシビリティの現状、という割にLibreOffice+NVDAで実際何がどこまでできるのかの内容がない」とTwitterでお叱りを受けてしまいました。はい、おっしゃる通りです。すみません。

でもそこの点は、西本さんがしっかりデモで補ってくださって、Writerでしっかり文書中の表読み上げとかできるということを教えていただきました。すごいすごい。ちゃんと動いてるんだなー(当たり前の感想)。 CalcやImpress(とくにPresenter Console)の動作も確認してみたいですね。

コミュニティについてのお話は自分で言うのも気恥ずかしいですが好評だったと思います(まあ、面と向かって、あんたの話は面白くなかったという人はあまりいませんが)。 「話を聞いてみて、LibreOffice使ってみようと思った」という声も、(嬉しがらせかもしれませんが)「今日はこの話が聞けるということでわざわざ来た」という方もいらっしゃって、すごく嬉しかったです。

他の発表もすごく興味深かったです。GmailGoogle Docsがあれだけアクセシブルであるということは驚きましたし(リッチなアプリだからアクセシブルにできない、という声には、お前のアプリはGmailGoogle Docsよりもリッチなのか、と言えるのかもしれませんね、Webアプリはよくわからないですが)、こういう言い方は失礼なのかもしれませんが、支援技術を利用しつつコンピューターを生業になされていらっしゃる方の使い熟し術、工夫の数々もびっくりしました。

NVDAのコミュニティというのは普通のオープンソースコミュニティとは少し毛色を異にしているところがありますが、懇親会にもご一緒させていただいてお酒をいただきながら少しくだけた話をして、すごくいろいろ得るものがありました。 白杖を持って歩く方をガイドして歩くというのは初めての経験でしたけど、すごくドキドキしました。ガイドされてる方はもっとドキドキしましたよね。普段とは異なる経験をいろいろして、あるいは経験談をいろいろ聞いて、なるほどなー、とばかり言ってた記憶があります(飲み過ぎて覚えていない)。

西本さん、NVDA日本語チームのみなさん、貴重な機会をいただきありがとうございました。 会場で、あるいは中継でお話聞いてくださった方、LibreOfficeに関心を持っていただけたら嬉しいです。 また一緒に何かできるといいですね!

転職します

以上。終わり。

……でもいいですが、もうちょっと追記。

3月31日付けでミライト情報システムを出て、4月1日から新しい仕事につきます。


入社のときのエントリーを見ると色々気恥ずかしいですね。3年に満たない期間で離れてしまったのは、まあ、勤まらなかった、といえばそうです。これに関してはなにを書いても言い訳っぽくなるのでやめます。

前職はいわゆる揶揄されることの多い中堅どころの「えすあいやー」であって、そういうところにはITを専門に学んできてない人がいっぱいいて、仕事にも技術にも興味なんかぜんぜんなくて、でもデスマって消耗してるって、ついったとか見てるとそんな感じですよね。

でもそんなことなくて、技術や業務知識について学習意欲もあるし実力もある特に若い層が結構いて、あるいは育っていて、中堅どころもそれぞれに持ち味もあって、上は面白いことに関心があったり本人が面白かったり(ぉ、すごくいい職場でした。一緒に働くことができて幸せでした。えすあいやーを十把一絡げに悪くいわないで欲しいなあ、と思ったりしました。

ぼくの立ち位置は社内R&Dというか、自分のチームでやってることの先行技術探索とか、そのためのちょっとしたプロトタイピングとかで、それはとても面白い仕事でよかったんだけど、そんなにお金儲かってない中でなんでぼくがそんな仕事させてもらえたかっていうと、それは単純にぼくが体調を崩してしまったので納期がタイトな仕事をやれなかったという点もあって、ね。フクザツではあります。

知ってる人は知ってますがぼくがMongoDBと関わったのはこれをビジネスにしようという動きがあったからです。今の会社辞めるので仕事的には縁が切れます。けど、MongoDBは好きだしMongoDBを通じて知り合った人たちともこれからも仲良くなんかできたらいいなとは思ってます。


転職……ということなので、次の仕事は決まってます。というか明日初出社なので日記なんか書いてないで寝ないといけません。

普段のぼくなら社名をじゃじゃーんと書きたいのですが、正直、まだ自分に自信が持てないというのがあります。健康不安を抱えつつ、ほんとうに新しい会社にコミットできるのかどうか。なので、自信が持てるまでは、隠すわけではないけど、大々的に書くのは控えようかなと。

ただ、新しい会社でやっていることが本当に面白そうで興味を持てて、こういうことをやっていれば健康面でもプラスになるんじゃないか、って思ったのはそうです。それと、健康面にも不安があるということを伝えてなおかつ一緒に仕事をしたい、という、とてもありがたい言葉をもらいました。ですから、自分と周りと相談しつつ、今の(残念ながら)悪いループから抜けだすチャンスだと思っているので、そうなったって自分に自信を持てるようになったら、もっと堂々と「こういう会社でこういう活動をやってます!」っていおうと思います。いえるようになるべく、ぼちぼちやりますね。

それと、各種コミュニティ活動についてはむしろ推奨という感じに受け取っているので、そっちのほうから自然に名前が出るかもしれません。というか、出るといいですね。


そんなわけで、とりとめもありませんがよろしくお願いします。ぺこり。

デザパタを一人でこっそり振り返ろう #5 (Singleton)

なんと前の記事を確認したら3年近く前だよ…… orz

この連載?は、へっぽこプログラマー(厳密には足を洗ったので「元」)のぼくがひょんなきっかけから、Javaプログラマー向けデザインパターンの入門書として有名な:

増補改訂版Java言語で学ぶデザインパターン入門

増補改訂版Java言語で学ぶデザインパターン入門

(以下 JDP)を買ったはいいけどなんかやる気なくて放置してたところに、これまた Smalltalk 界隈の人に教えてもらった:

Design Patterns Smalltalk Companion, The (Software Patterns Series)

Design Patterns Smalltalk Companion, The (Software Patterns Series)

(以下DPSC)を買って読んだらむちゃくちゃ面白くて、じゃあ JDP の内容を Smalltalk で実装したあと、DPSC を答え合わせ的に読む、ということをやったら自分の勉強になるし、「動的言語におけるデザインパターンは静的言語のそれと違う」って意味が噛み締められるんじゃないかと思って始めたものです。

過去の記事は次のとおり。

ということで今回は Singleton パターン。言わずもがなではありますが、JDP から引用すると(p.58)、

指定したクラスのインスタンスが絶対に1個しかないことを保証したい

というものですな。これまた同じページから引用すると:

現在のシステム設定を表現したクラス、ウィンドウシステムを表現したいクラスなどが代表的な例

だそうです。ウィンドウシステムって、どのウィンドウもどっかからちゃんと手繰れないといけないんだけど(でないと、例えばマウスクリックとかのイベントを誰に渡せばいいんだかわかんなくなる)、そういうときに「全部のウィンドウの根っこ」とか持ちたくなるわけですね。そういうのをシングルトンで管理するよと。

そんなにインスタンスの作成を抑制したいんだったら、全部クラスメソッドでさばいてインスタンス作んなければいいんじゃね?と思うんですが、まあよくわかんないので教科書を追います。

ひとまず実装

JDP の例を見てみましょう。シングルトンであるクラス Singleton を作ります。

平たく言ってしまえば new を禁止して、代わりに「まだインスタンスがなければ new したものを、そうでなければすでにあるインスタンスを返す」メソッド getInstance を提供するってな感じです。Java の場合は new を禁止するにはコンストラクタ Singleton を private にすればいいわけですが、さて Smalltalk だとどうするか。private なんて Smalltalk にはねーよ。

まあ new 禁止を考えずにクラスの定義をば。


super new については前回 #4 で説明したとおり。ここで Singleton new ってやっちゃうと怒られる。……いや、これ self basicNew のほうがいいね。あとで気づいた。

でも自身の new 潰してないんだよなあ。ということで new にカーソル当てて alt-M でインプリメンタ出してなんかいいのないかなーと見てると、お、こんなんあった。

Bool class>>new
self error: 'You may not create any more Booleans - this is two-valued logic'

ふむ。self に error: で適切なエラーメッセージを投げてやればいいのね。じゃあこんなん?

そうすると「new 潰すと酷いことになるかも知んないけどマジいいの?」って聞かれるけどまあ構わずセーブ。

さてとワークスペース開けて試してみましょう。

a := Singleton getInstance.
b := Singleton getInstance.
a == b[print it]→true

ほい。うまくいったっぽい。

DPSC の解説

さて答え合わせ答え合わせ。DPSC の Singleton パターンは 91 ページから。ふむ。大筋は合ってるっぽい。new は self>>error: で潰せというのも正解でした。

Smalltalk 的にはシングルトンそのもの、あるいはシングルトンっぽいものはたくさん使われてるよって書いてあります。例えば Squeak の場合は Smalltalk 変数というのがいてコイツがグローバルな色々な何かを持ってたりしますが、このクラスである SmalltalkImage というクラスは new は「Smalltalk 使えよ」ってエラーを出すように潰してあります。

ということで、大抵のシングルトンパターンの場合は、システムそれ自体のグローバル変数とかに持っててそれ経由のアクセスをするのが普通なわけです。例えば上の例で示した Smalltalk 変数とかね。で、コイツの初期化はシステムのブートアップにやりますよと。でもシングルトンのオブジェクトってそれこそシステム根幹の情報なわけで、それをグローバル変数に持つってのはどうなのよ? 危なそうに見えるよね? と。

で、答えとしては、グローバル変数じゃなくてシングルトンオブジェクトのクラスに一つのメッセージを用意して、そいつからインスタンス変数にルーティングすればいいじゃんって。オブジェクトが生成されたとき、初期化されたとき、GCによって破棄された時など、クラスなら適切に扱えるじゃんねーと。なるほどね。でも実際のところ Smalltalk の大抵のシングルトンオブジェクトはグローバル変数で管理されてますよと。なんでやねん。

ちょっと英語苦手なんで実は意味読み取れてないんだけど引用:

Design Patterns states that Singletons accessed through global variables are not really example of the Singleton pettern (DP 127). One might argue that other examples are Singletons and they're just not implemented optimally.

デザインパターンではグローバル変数経由でアクセスされるシングルトンを Singleton パターン (DP 127) の実際の例とはしていません。一つ考えられることは、他の例はシングルトンなのですが、最適な実装がされていなかったということです。

つまるところ GoF ではシングルトンオブジェクトをグローバル変数に突っ込むのを「パターン」ではないとしてるけど、それっぽい例があるから「おーこうやって実装するといいねー」って最初実装しちゃったって話? そうなんかな。まあいいや。あ、ここで DP 127 っていうのはいわゆる Gang of Four (GoF) のデザインパターン

のページ 127 にあるパターンって意味です。はい。

とにかく本当はグローバル変数に突っ込むのは良いやり方ではないけど、Smalltalk ではそういう例がいっぱいあるってことはわかった。

シングルトンのバリエーション

シングルトンには persistent (永続)、transient (一時的)、single-active-instance (単独アクティブインスタンス) の三つのバリエーションがあるとのこと。

  • 永続シングルトン - 特定のクラスの唯一のインスタンスであり、なおかつ永遠に変わらないもの。
  • 一時的シングルトン - あるクラスの唯一のインスタンスだけども、インスタンスは変わりうるもの。例えばセッション情報を管理するオブジェクトはシングルトンであるが、セッションが破棄されると破棄され、新規にセッションが起きると再生成される。
  • 単独アクティブインスタンス - あるクラスに対し、アクティブまたは有効であるインスタンスは一つだけだが、インスタンス自体は複数存在するもの。例えば IDE のプロジェクトを管理するクラスがあるとして、IDE複数のプロジェクトをオープンできるのでインスタンス複数存在するけど、実際にプログラマーが弄ってるプロジェクトに対応するプロジェクトだけが有効とかそういう。実際にはシングルトンではないけど、性質的には似てるから一緒に論じますよと。
予約語

Smalltalknil, true, false とかは実は UndefinedObject, True, False という「クラス」のシングルトンオブジェクトとみなせますよと。実際 true をインスペクトすると True ってクラスのオブジェクトだよって言われるしね。

Smalltalk における実装について

Smalltalk 内部で実際に使ってるケースを紹介してくれるところが DPSC のうれしいところ。
GoF では Singleton パターンの要件として「(A)あるクラスがただひとつのインスタンスしか持たないこと」だけでなく、「(B)グローバルにアクセスできる方法を提供すること」を挙げているらしいです。ん? JDPにはその要件はスルーされていたような……。まあいいや。

単一インスタンスの保証

で、(A)はさっき議論したように、Smalltalkの場合はクラス変数 (Java の場合は静的メンバー変数っていうのかな)に作ったインスタンス放り込んでおいて new 禁止ってやり方でいいよねと。で、ついでにこんなふうな実装もありうるねと。これは Visual Smalltalk の UndefinedObject クラス。

UndefinedObject>>new
"レシーバーの新たなインスタンスを作る。このクラスでは単一のインスタンス nil が
存在するため許可されない。"
^self invalidMessage

で、invalidMessage を別途定義することで再利用性を上げると。ただ、VisualWorks とか Squeak とかこういうふうにしてなくて素朴に self>>error: 投げてる処理系も多いよと。

C++とかJavaの場合はnewをプライベートにするだけでできることなんだけど、すでにあるクラスを隠すって概念がないSmalltalkの場合は実行時例外を上げるしか方法がなく、文法レベルでチェックができないのは欠点だよねってことが書いてありました。まあそれは一理あるわなー。

インスタンスへのアクセスの提供

(B) についてですけど、さっきも書いたとおりグローバル変数を使うやり方は乱暴ではあるけど一応機能はする。もっと良いやり方はクラスでプロキシーする方法で、getInstance って名前はいかにも「インスタンスを貰う(貰った側が代入して持つ)」って名前でこれはちょっとよろしくない。ので、名前をcurrentとかに変えれば:

Singleton current someMessage.

みたいに自然に書けるでしょ? というお話でした。

new を潰さない方法ってどう?

よくよく考えてみると、newを潰す必要は別になくて、単にこうすればいいんじゃないかと。

Singleton class>>new
^self current

上の議論により self current はシングルトンオブジェクトを(必要なら内部で new して)返すんだから、これによって常に new で同じものが帰るよねと。

問題は、new って名前が「いかにもインスタンスを生成しそう」って名前なので:

| roadRunner wileECoyote |
roadRunner := SingleToon new.
wileECoyote := SingleToon new.
roadRunner position: 100@100.
wileECoyote position: 200@200.

で、実は roadRunner と wileECoyote が同じオブジェクトだとはお釈迦様でも気づくめえってことですわね。ので、やっぱ new は潰しておくほうが無難かなと。プログラマーが混乱したんじゃ意味ないんで。

クラス階層の中でのシングルトン

「このクラスのサブクラスの中のインスタンスは一個しかあっちゃダメ」みたいなことが欲しいときはどうするかって話ですね。Smalltalk の場合は一瞬で、クラス変数の代わりにクラスインスタンス変数を使えばいいですよと。つまり:

Object subclass: #Singleton
instanceVariableNames: ''
classVariableNames: ''
poolDictionaries: ''
category: 'DPStudy-Singleton'

Singleton class instanceVariableNames 'Singleton'

とやれば後は同じでいいですね。っていうかクラスインスタンス変数ってこんなふうに使うんだー。

おっと、単なるテキストの引き写しになってる。いかんいかん。
その後も DPSC は「アクセサの名前 current とか default とかってどう決める?」とか、ぼくが最初に書いた「全部クラスメソッドでよくね?」とかそういう話があって、もっと具体的なコード例(データベースのラッパークラス)とかSmalltalkクラスライブラリの中での使用例とかいろいろ書いてあるわけでこれもまためちゃくちゃ面白い。が省略。買って読んで。

さて次回はいつになるかわかりませんがPrototypeパターンだそうです。お楽しみに。

関東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:コミュニティコミュニティうるさいですね、すみません。