upsilonのBlog 2016-12-28T03:32:18+09:00 kim_upsilon Hatena::Blog hatenablog://blog/8454420450074947264 Webじゃない話題まとめ - Webじゃないアクセシビリティ Advent Calendar 2016 25日目 hatenablog://entry/10328749687201656800 2016-12-28T03:32:18+09:00 2016-12-28T03:36:07+09:00 Webじゃないアクセシビリティ Advent Calendar 2016 の 25 日目の記事です。 最終日なので今回のアドベントカレンダーに寄せられた記事について書いて行かうと思ひます。*1 「Web じゃないアクセシビリティ」は、Web Accessibility Advent Calendar を真似て「Web じゃない」アクセシビリティの話題を集めてみようと始めた企画です。「Web じゃない」といふのがなかなか雑な括りですが、例としてアドベントカレンダーの説明文には以下の 3 つを挙げてゐました。 「Webじゃない」例: スマートフォンあるいはデスクトップ用アプリにおけるアクセシビリテ… <p><a href="http://www.adventar.org/calendars/1799">Webじゃないアクセシビリティ Advent Calendar 2016</a> の 25 日目の記事です。</p> <p>最終日なので今回の<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%A2%A5%C9%A5%D9%A5%F3%A5%C8%A5%AB%A5%EC%A5%F3%A5%C0%A1%BC">アドベントカレンダー</a>に寄せられた記事について書いて行かうと思ひます。<a href="#f-2ab07d53" name="fn-2ab07d53" title="書いてみたら思ひのほか長くなって大遅刻…">*1</a></p> <p>「Web じゃない<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%A2%A5%AF%A5%BB%A5%B7%A5%D3%A5%EA%A5%C6%A5%A3">アクセシビリティ</a>」は、<a href="http://www.adventar.org/calendars/1589">Web Accessibility Advent Calendar</a> を真似て「Web じゃない」<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%A2%A5%AF%A5%BB%A5%B7%A5%D3%A5%EA%A5%C6%A5%A3">アクセシビリティ</a>の話題を集めてみようと始めた企画です。「Web じゃない」といふのがなかなか雑な括りですが、例として<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%A2%A5%C9%A5%D9%A5%F3%A5%C8%A5%AB%A5%EC%A5%F3%A5%C0%A1%BC">アドベントカレンダー</a>の説明文には以下の 3 つを挙げてゐました。</p> <blockquote><p>「Webじゃない」例:</p> <ul> <li><a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%B9%A5%DE%A1%BC%A5%C8%A5%D5%A5%A9%A5%F3">スマートフォン</a>あるいはデスクトップ用アプリにおける<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%A2%A5%AF%A5%BB%A5%B7%A5%D3%A5%EA%A5%C6%A5%A3">アクセシビリティ</a>の話</li> <li>支援技術(スクリーンリーダーなど)そのものに関する話</li> <li><a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%A2%A5%AF%A5%BB%A5%B7%A5%D3%A5%EA%A5%C6%A5%A3">アクセシビリティ</a>に関係する法令や規格、<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%AC%A5%A4%A5%C9%A5%E9%A5%A4%A5%F3">ガイドライン</a>などの話</li> <li>などなど</li> </ul> </blockquote> <p>これは<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%A2%A5%AF%A5%BB%A5%B7%A5%D3%A5%EA%A5%C6%A5%A3">アクセシビリティ</a>に最近関心を持ったばかりの自分がいろいろ例を考えた末に書いたものでしたが、結果としてこの 3 つ以外からも様々な記事を書いてくださる方が居てとても良かったと思ひます。<a href="#f-b192fb44" name="fn-b192fb44" title="むしろ 3 つ例示することで話題の幅を狭めてしまふのではないかと心配してゐた位でした">*2</a></p> <p>例えば TomokaTakahashi さんが書かれた「<a href="http://yuuka-k.blog.so-net.ne.jp/2016-12-08">身近な数字をわかりやすくするツール</a>」は、算用数字と<a class="keyword" href="http://d.hatena.ne.jp/keyword/%C5%C0%BB%FA">点字</a>が併記されたシールについて紹介する内容でした。原義の「<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%A2%A5%AF%A5%BB%A5%B7%A5%D3%A5%EA%A5%C6%A5%A3">アクセシビリティ</a>」は情報分野に限らず所謂<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%D0%A5%EA%A5%A2%A5%D5%A5%EA%A1%BC">バリアフリー</a>の文脈でも使える単語なんですね。「<a href="http://yuuka-k.blog.so-net.ne.jp/2016-12-20">日本視覚障害者 ICTネットワーク(JBICT.Net)の Webサイトができました</a>」では、家電製品についても紹介されて居ました。</p> <p>また、hoozukiyama さんの「<a href="http://hoozukiyama.shinke.com/2016/12/espr-developeresp-wroom-02.html">ESPr Developer(ESP-WROOM-02開発ボード) </a>」と motchie さんの「<a href="https://blog.motchie.com/accessibility/thinking-about-accssibility-of-IoT-systems.html">IoTシステムのアクセシビリティを考える</a>」はいづれも IoT に関する内容でした。今度は技術的な話ですが、ソフトウェアではなくハードウェアに関心を向けた記事です。</p> <p>アクセシブルでない IoT 製品よりも既存の<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%B9%A5%DE%A5%DB">スマホ</a>アプリの方が OS によって提供される支援技術が使へるいった逆転現象は十分起こり得るかもしれませんね。それを避けるためにも motchie さんの主張の様に IoT 製品に於いても<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%A2%A5%AF%A5%BB%A5%B7%A5%D3%A5%EA%A5%C6%A5%A3">アクセシビリティ</a>に配慮する意識を持つことが必要であると思ひます。</p> <p>一方で、私は「<a href="http://upsilon.hatenablog.jp/entry/2016/12/03/000000">AccCheckerでUIA Treeを覗く</a>」と「<a href="http://upsilon.hatenablog.jp/entry/2016/12/11/235830">WinFormsアプリ(OpenTween)でアクセシビリティを改善しようとしてる話</a>」で <a class="keyword" href="http://d.hatena.ne.jp/keyword/Windows">Windows</a> のデスクトップアプリ開発における<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%A2%A5%AF%A5%BB%A5%B7%A5%D3%A5%EA%A5%C6%A5%A3">アクセシビリティ</a>の話を書きました。よくよく考へるとデスクトップアプリとは言っても <a class="keyword" href="http://d.hatena.ne.jp/keyword/Twitter">Twitter</a> クライアントである OpenTween を「Web じゃない」に含めるのは変な感じもしますが、内容は <a class="keyword" href="http://d.hatena.ne.jp/keyword/Twitter">Twitter</a> <a class="keyword" href="http://d.hatena.ne.jp/keyword/API">API</a> とは関係ないのでまあいいかといふ感じです。</p> <p>デスクトップアプリ開発に関連して <a class="keyword" href="http://d.hatena.ne.jp/keyword/Mina">Mina</a>_Nono さんの「<a href="https://jouhouakusesu.wordpress.com/2016/12/09/%e3%82%a2%e3%82%af%e3%82%bb%e3%82%b7%e3%83%96%e3%83%ab%e3%81%aa%e3%82%bd%e3%83%95%e3%83%88%e3%82%a6%e3%82%a7%e3%82%a2%e3%81%b8%e3%81%ae%e6%89%8b%e3%81%8c%e3%81%8b%e3%82%8a/">アクセシブルなソフトウェアへの手がかり</a>」は、<a class="keyword" href="http://d.hatena.ne.jp/keyword/Python">Python</a> から利用できる <a class="keyword" href="http://d.hatena.ne.jp/keyword/GUI">GUI</a> ライブラリである tkinter と <a class="keyword" href="http://d.hatena.ne.jp/keyword/wxPython">wxPython</a> で<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%A2%A5%AF%A5%BB%A5%B7%A5%D3%A5%EA%A5%C6%A5%A3">アクセシビリティ</a>対応に差があるといふ事についての記事でした。</p> <p>NVDA で読み上げが出来なかったといふ tkinter は <a class="keyword" href="http://d.hatena.ne.jp/keyword/GUI">GUI</a> ツールキットの Tk (Tcl/Tk) の <a class="keyword" href="http://d.hatena.ne.jp/keyword/Python">Python</a> <a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%D0%A5%A4%A5%F3%A5%C7%A5%A3%A5%F3%A5%B0">バインディング</a>ですが、この Tk 自身が<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%A2%A5%AF%A5%BB%A5%B7%A5%D3%A5%EA%A5%C6%A5%A3">アクセシビリティ</a>に対応できていないために tkinter でもスクリーンリーダーによる読み上げが行えない状況の様です。<a href="#f-e05a134f" name="fn-e05a134f" title="[Tkinter-discuss] Accessibility issues and Tkinter">*3</a> 何にせよ、アクセシブルな <a class="keyword" href="http://d.hatena.ne.jp/keyword/GUI">GUI</a> アプリケーションを開発するためには使用する <a class="keyword" href="http://d.hatena.ne.jp/keyword/GUI">GUI</a> ライブラリ側のサポートが無いと困難であると思ひます。<a href="#f-88fc2c72" name="fn-88fc2c72" title="もちろんアプリケーション独自の GUI コントロールを作成する場合には、ライブラリのサポートの如何に関はらず自力で対応(Windows であれば UI Automation の対応など)をする必要があります。">*4</a></p> <p>支援技術に関する話題では 24motz さんの「<a href="http://d.nishimotz.com/archives/1964">NVDA で Excel を使う</a>」は、<a class="keyword" href="http://d.hatena.ne.jp/keyword/Excel">Excel</a> を操作するために NVDA が提供してゐる機能の紹介でした。冒頭に書かれて居る <a class="keyword" href="http://d.hatena.ne.jp/keyword/Excel">Excel</a> でのセルの罫線の報告は、既に 24motz さんが本家 NVDA に対しても Pull Request を作成されてゐます<a href="#f-89055caa" name="fn-89055caa" title="[https://github.com/nvaccess/nvda/pull/6492:title]">*5</a>。スクリーンリーダーといふと OS 固有の機能に強く依存するソフトウェアなのですが、NVDA はアドオンだけでなく本体の大部分が <a class="keyword" href="http://d.hatena.ne.jp/keyword/Python">Python</a> で書かれてゐることも特徴の一つであると思ひます。先ほどの Pull Request もドキュメント部分を除けば全て <a class="keyword" href="http://d.hatena.ne.jp/keyword/Python">Python</a> の<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%BD%A1%BC%A5%B9%A5%B3%A1%BC%A5%C9">ソースコード</a>で完結して居ます。C 言語が不得意な私でも <a class="keyword" href="http://d.hatena.ne.jp/keyword/Python">Python</a> なら読む気力が保てさうなので個人的には助かりますね。</p> <p>Minoru Hayakawa さんの「<a href="http://blog.e-riverstyle.com/2016/12/advnet-a11y-02.html">ただ視線入力への想いを述べただけのエントリー</a>」は、支援技術と呼ばれる中でもスクリーンリーダーとは異なる「視線入力」について紹介された記事でした。この記事を読んだ後、視線入力ではないですが Web カメラと Enable Viacam (顔認識で頭の動きに合わせて<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%DE%A5%A6%A5%B9%A5%DD%A5%A4%A5%F3%A5%BF">マウスポインタ</a>を操作するツール) で OptiKey を操作するのを試してみました。流石に Web カメラでは顔認識や頭の動きの追跡に難がある感じでしたが、OptiKey の動画を見る限りではすらすらキー入力をしてゐるので専用の視線追跡デ<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%D0%A5%A4">バイ</a>スは相当快適に操作できる様です。</p> <p>と、それぞれの感想をだらだらと書いていきましたが、この「Web じゃない」といふタイトルに対して皆さん本当に幅広い話題について書いて頂きました。参加して頂いた皆様ありがたうございました。もしかしたら来年も同じような<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%A2%A5%C9%A5%D9%A5%F3%A5%C8%A5%AB%A5%EC%A5%F3%A5%C0%A1%BC">アドベントカレンダー</a>をやるかもしれませんね<a href="#f-999190f9" name="fn-999190f9" title="当の本人は来年書けるネタがあるか怪しいですが…">*6</a></p> <div class="footnote"> <p class="footnote"><a href="#fn-2ab07d53" name="f-2ab07d53" class="footnote-number">*1</a><span class="footnote-delimiter">:</span><span class="footnote-text">書いてみたら思ひのほか長くなって大遅刻…</span></p> <p class="footnote"><a href="#fn-b192fb44" name="f-b192fb44" class="footnote-number">*2</a><span class="footnote-delimiter">:</span><span class="footnote-text">むしろ 3 つ例示することで話題の幅を狭めてしまふのではないかと心配してゐた位でした</span></p> <p class="footnote"><a href="#fn-e05a134f" name="f-e05a134f" class="footnote-number">*3</a><span class="footnote-delimiter">:</span><span class="footnote-text"><a href="https://mail.python.org/pipermail/tkinter-discuss/2013-September/003480.html">[Tkinter-discuss] Accessibility issues and Tkinter</a></span></p> <p class="footnote"><a href="#fn-88fc2c72" name="f-88fc2c72" class="footnote-number">*4</a><span class="footnote-delimiter">:</span><span class="footnote-text">もちろんアプリケーション独自の <a class="keyword" href="http://d.hatena.ne.jp/keyword/GUI">GUI</a> コン<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%C8%A5%ED%A1%BC%A5%EB">トロール</a>を作成する場合には、ライブラリのサポートの如何に関はらず自力で対応(<a class="keyword" href="http://d.hatena.ne.jp/keyword/Windows">Windows</a> であれば UI Automation の対応など)をする必要があります。</span></p> <p class="footnote"><a href="#fn-89055caa" name="f-89055caa" class="footnote-number">*5</a><span class="footnote-delimiter">:</span><span class="footnote-text"><a href="https://github.com/nvaccess/nvda/pull/6492">Excel cell border announcement #3044 by nishimotz &middot; Pull Request #6492 &middot; nvaccess/nvda &middot; GitHub</a></span></p> <p class="footnote"><a href="#fn-999190f9" name="f-999190f9" class="footnote-number">*6</a><span class="footnote-delimiter">:</span><span class="footnote-text">当の本人は来年書けるネタがあるか怪しいですが…</span></p> </div> kim_upsilon WinFormsアプリ(OpenTween)でアクセシビリティを改善しようとしてる話 - Webじゃないアクセシビリティ Advent Calendar 2016 11日目 hatenablog://entry/10328749687198436158 2016-12-11T23:58:30+09:00 2016-12-13T08:14:13+09:00 Webじゃないアクセシビリティ Advent Calendar 2016 の 11 日目の記事です。 また、OpenTween Advent Calendar 2014 の 742 日目の記事でもあります。 OpenTween は、かつてはオープンソースで公開されてゐた*1 Windows 用 Twitter クライアントである Tween のソースコードを基に派生したプロジェクトです。 OpenTween のユーザーには元々 Tween のユーザーであった人も多く居ますが、その中には PC-Talker や NVDA といったスクリーンリーダーを介して利用する方も含まれてゐます。元となった … <p><a href="http://www.adventar.org/calendars/1799">Webじゃないアクセシビリティ Advent Calendar 2016</a> の 11 日目の記事です。</p> <p>また、<a href="http://www.adventar.org/calendars/597">OpenTween Advent Calendar 2014</a> の 742 日目の記事でもあります。</p> <p><a href="http://www.opentween.org/">OpenTween</a> は、かつては<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%AA%A1%BC%A5%D7%A5%F3%A5%BD%A1%BC%A5%B9">オープンソース</a>で公開されてゐた<a href="#f-8f3ee22d" name="fn-8f3ee22d" title="現在はクローズドソースとなり開発が継続されてゐる">*1</a> <a class="keyword" href="http://d.hatena.ne.jp/keyword/Windows">Windows</a> 用 <a class="keyword" href="http://d.hatena.ne.jp/keyword/Twitter">Twitter</a> クライアントである <a href="https://sites.google.com/site/tweentwitterclient/">Tween</a> の<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%BD%A1%BC%A5%B9%A5%B3%A1%BC%A5%C9">ソースコード</a>を基に派生したプロジェクトです。</p> <p>OpenTween のユーザーには元々 Tween のユーザーであった人も多く居ますが、その中には PC-Talker や NVDA といったスクリーンリーダーを介して利用する方も含まれてゐます。元となった Tween の画面は <a class="keyword" href="http://d.hatena.ne.jp/keyword/Windows">Windows</a> Forms (WinForms) によって提供される標準の <a class="keyword" href="http://d.hatena.ne.jp/keyword/GUI">GUI</a> 部品のみでほぼ構成されてをり、素の状態でも使えるほどにはアクセシブルであったことも要因の様です。</p> <p>OpenTween で<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%A2%A5%AF%A5%BB%A5%B7%A5%D3%A5%EA%A5%C6%A5%A3">アクセシビリティ</a>に関する問題の改善に積極的に取り組む様になったのは2015年10月ごろからです。おそらく以下のコミットが最初の変更ではないかと思ひます。</p> <p><a href="https://github.com/opentween/OpenTween/commit/f17d2b9f8cd73cd7d29c9599456973dfeb29f66d">&#x30BF;&#x30D6;&#x540D;&#x306E;&#x8AAD;&#x307F;&#x4E0A;&#x3052;&#x5BFE;&#x5FDC;&#x306E;&#x305F;&#x3081;TabPage&#x3092;&#x4F7F;&#x7528;&#x3059;&#x308B;&#x7B87;&#x6240;&#x3067;AccessibleRole&#x3092;&#x660E;&#x793A; &middot; opentween/OpenTween@f17d2b9 &middot; GitHub</a></p> <p>これは、Tween では発言一覧にフォーカスが当たったときにタブ名が読み上げられるが OpenTween では読み上げられない、といった報告を受けて調べたものでした。分かったこととしては、NVDA には Tween.exe 専用の AppModule が用意されており、これによってタブ名の読み上げが実現されて居たことです。そのため、実際に OpenTween.exe を Tween.exe にファイル名を変更して実行してみると確かにタブ名が読み上げられました。以下がその AppModule です。<a href="#f-94dbc43b" name="fn-94dbc43b" title="実のところ、この AppModule がタブに対するロール変更以外に何をしてゐるのかよく分かってないので教へてくれる方募集中">*2</a></p> <p><a href="https://github.com/nvdajp/nvdajp/blob/release-2015.3jp-150825/source/appModules/tween.py">nvdajp/tween.py at release-2015.3jp-150825 &middot; nvdajp/nvdajp &middot; GitHub</a></p> <p>この機能を実現してゐるのは 66 行目付近にある <code>obj.role = controlTypes.ROLE_PROPERTYPAGE</code> の部分です。タブの内容となるパネル部分のロールを「プロパティページ」で上書きすることでタブの名前が NVDA で読み上げられる様になります。</p> <p>この「ロール」は <a class="keyword" href="http://d.hatena.ne.jp/keyword/Windows">Windows</a> Forms の各<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%B3%A5%F3%A5%DD%A1%BC%A5%CD%A5%F3%A5%C8">コンポーネント</a>に標準で備はる AccessibleRole といふプロパティで変更することができるため、これを使って AppModule と同様の機能を実現したのが最初に書いたコミットでした。</p> <p>OpenTween で使用してゐる <a class="keyword" href="http://d.hatena.ne.jp/keyword/Windows">Windows</a> Forms のやうな <a class="keyword" href="http://d.hatena.ne.jp/keyword/GUI">GUI</a> <a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%D5%A5%EC%A1%BC%A5%E0%A5%EF%A1%BC%A5%AF">フレームワーク</a>には、<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%A2%A5%AF%A5%BB%A5%B7%A5%D3%A5%EA%A5%C6%A5%A3">アクセシビリティ</a>に関するプロパティが標準で提供されてゐることがあります。<a class="keyword" href="http://d.hatena.ne.jp/keyword/GitHub">GitHub</a> を探してもなかなか参考になる例を見つけることは難しいですが、アクセシブルな WinForms アプリを作る一助として<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%AA%A1%BC%A5%D7%A5%F3%A5%BD%A1%BC%A5%B9">オープンソース</a>である OpenTween が参考になれる様に今後も対応を続けて行きたいなと思ひます。</p> <div class="footnote"> <p class="footnote"><a href="#fn-8f3ee22d" name="f-8f3ee22d" class="footnote-number">*1</a><span class="footnote-delimiter">:</span><span class="footnote-text">現在はクローズドソースとなり開発が継続されてゐる</span></p> <p class="footnote"><a href="#fn-94dbc43b" name="f-94dbc43b" class="footnote-number">*2</a><span class="footnote-delimiter">:</span><span class="footnote-text">実のところ、この AppModule がタブに対するロール変更以外に何をしてゐるのかよく分かってないので教へてくれる方募集中</span></p> </div> kim_upsilon AccCheckerでUIA Treeを覗く - Webじゃないアクセシビリティ Advent Calendar 2016 3日目 hatenablog://entry/10328749687197061831 2016-12-03T00:00:00+09:00 2016-12-03T00:08:59+09:00 Webじゃないアクセシビリティ Advent Calendar 2016 の 3 日目の記事です。 お気づきの方も居られるかと思ひますが、このアドベントカレンダーは早速 1 日目から欠けてます。 さすがに全ての枠を自分で書くのは辛いので、ほどほどのペースで書いて行かうかなあと思ひます。 ところで皆さんは自分が開発してるソフトウェアのアクセシビリティをチェックするために、どの様なツールを使ってますか? おそらく、実際にスクリーンリーダーを用ゐて何がどの様に読み上げられるかを確かめるのがよくある方法ではないかと思ひます。 私も初めて OpenTween の開発でアクセシビリティについて取り組み始め… <p><a href="http://www.adventar.org/calendars/1799">Webじゃないアクセシビリティ Advent Calendar 2016</a> の 3 日目の記事です。</p> <p>お気づきの方も居られるかと思ひますが、この<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%A2%A5%C9%A5%D9%A5%F3%A5%C8%A5%AB%A5%EC%A5%F3%A5%C0%A1%BC">アドベントカレンダー</a>は早速 1 日目から欠けてます。 さすがに全ての枠を自分で書くのは辛いので、ほどほどのペースで書いて行かうかなあと思ひます。</p> <p>ところで皆さんは自分が開発してるソフトウェアの<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%A2%A5%AF%A5%BB%A5%B7%A5%D3%A5%EA%A5%C6%A5%A3">アクセシビリティ</a>をチェックするために、どの様なツールを使ってますか?</p> <p>おそらく、実際にスクリーンリーダーを用ゐて何がどの様に読み上げられるかを確かめるのがよくある方法ではないかと思ひます。 私も初めて OpenTween の開発で<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%A2%A5%AF%A5%BB%A5%B7%A5%D3%A5%EA%A5%C6%A5%A3">アクセシビリティ</a>について取り組み始めたときは最初に NVDA をインストールする所から始めました。</p> <p>そんな中で、私が NVDA と共に使ひ始めた AccChecker といふツールについて紹介します。</p> <p>AccChecker は <a class="keyword" href="http://d.hatena.ne.jp/keyword/Windows">Windows</a> アプリケーションの<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%A2%A5%AF%A5%BB%A5%B7%A5%D3%A5%EA%A5%C6%A5%A3">アクセシビリティ</a>を自動で検証して問題点を指摘するツールです。 実はこれ、ググっても日本語はおろか英語ですら情報が乏しいのですが<a href="#f-25fed2f2" name="fn-25fed2f2" title="実際にググると一番始めに CodePlex の AccChecker プロジェクトのページが出てきますが、2010 年にリリースされたバージョンで更新が止まってます。この記事の最後にある Windows SDK に同梱されて居るバージョンがおそらく最新版です">*1</a>、<a class="keyword" href="http://d.hatena.ne.jp/keyword/Microsoft">Microsoft</a> が提供するれっきとした <a class="keyword" href="http://d.hatena.ne.jp/keyword/Windows">Windows</a> <a class="keyword" href="http://d.hatena.ne.jp/keyword/SDK">SDK</a> のツールの一つです。</p> <p>正直私は AccChecker のチェック機能はあまり使ったことがないのでよく分かりません。 私が紹介したいのは自動チェック機能ではなく、AccChecker に搭載されて居る UIA Tree の機能の方です。</p> <p>実行結果を確認して貰った方が分かりやすいかと思ふので、試しに <a class="keyword" href="http://d.hatena.ne.jp/keyword/Windows%2010">Windows 10</a> 標準の電卓アプリの UIA Tree を見てみます。</p> <p><span itemscope itemtype="http://schema.org/Photograph"><img src="https://cdn-ak.f.st-hatena.com/images/fotolife/k/kim_upsilon/20161202/20161202031455.png" alt="f:id:kim_upsilon:20161202031455p:plain" title="f:id:kim_upsilon:20161202031455p:plain" class="hatena-fotolife" itemprop="image"></span></p> <p>UIA Tree といふ文字通り、ウィンドウ内の要素がツリー形式で表示されます。</p> <ul> <li>(root) <ul> <li>電卓 <ul> <li>電卓 <ul> <li>(中略)</li> <li>除算</li> <li>乗算</li> <li>マイナス</li> <li>プラス</li> <li>等号</li> <li>正、負</li> <li>0</li> <li>1</li> <li>2</li> <li>(略)</li> <li>8</li> <li>9</li> <li>小数点</li> </ul> </li> </ul> </li> </ul> </li> </ul> <p>電卓の数字ボタンや加減乗除のボタンもちゃんと入ってますね。 ツリー内のそれぞれの名前を選択すると、選択した要素が画面上のどの位置にあるかを示した画像が右側のパネルに表示されます。</p> <p>また、選択した要素の詳細も表示されます。</p> <ul> <li>Name: 除算</li> <li>Value: (空欄)</li> <li>Control: button</li> <li>State: Enabled, Onscreen, Focusable</li> <li>Location: {X=435,Y=482,Width=118,Height=92}</li> </ul> <p>これらの情報が便利な点は、UIA はスクリーンリーダーが扱ふ生の <a class="keyword" href="http://d.hatena.ne.jp/keyword/API">API</a> であるため、もしスクリーンリーダーが不可解な読み上げをした時は AccChecker で確認することによってアプリ側の問題なのかスクリーンリーダー側の問題なのか原因の切り分けをしやすくなることです。</p> <p>また、初めてスクリーンリーダーを使ひ始めた開発者にとっても、画面上のオブジェクトがどの様にツリー構造で表現されて居るか理解する一助にもなるのではないかと思ひます。</p> <p>AccChecker の UIA Tree 機能は私が OpenTween で<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%A2%A5%AF%A5%BB%A5%B7%A5%D3%A5%EA%A5%C6%A5%A3">アクセシビリティ</a>対応するときに NVDA の次に役に立ったと言っても過言ではないツールなので、興味を持った方は試しに使ってみてはいかがでせうか。</p> <p>AccChecker は <a class="keyword" href="http://d.hatena.ne.jp/keyword/Windows">Windows</a> <a class="keyword" href="http://d.hatena.ne.jp/keyword/SDK">SDK</a> 内に同梱されてゐるツールであるため、例へば <a class="keyword" href="http://d.hatena.ne.jp/keyword/Windows%2010">Windows 10</a> なら <a href="https://developer.microsoft.com/ja-jp/windows/downloads/windows-10-sdk">Windows 10 SDK &ndash; Windows &#x30A2;&#x30D7;&#x30EA;&#x958B;&#x767A;</a> から <a class="keyword" href="http://d.hatena.ne.jp/keyword/SDK">SDK</a> をインストールすれば <code>C:\Program Files (x86)\Windows Kits\10\bin\x86\AccChecker\acccheckui.exe</code> から起動できる様になるはずです…たぶん(よく覚えてない)</p> <p>それでは「Webじゃない<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%A2%A5%AF%A5%BB%A5%B7%A5%D3%A5%EA%A5%C6%A5%A3">アクセシビリティ</a>」Advent Calendar 2016、明日以降もよろしくお願ひします。次の記事は…、12月11日?(余裕があればもう少し早い日にも書くかもしれません)</p> <div class="footnote"> <p class="footnote"><a href="#fn-25fed2f2" name="f-25fed2f2" class="footnote-number">*1</a><span class="footnote-delimiter">:</span><span class="footnote-text">実際に<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%B0%A5%B0%A4%EB">ググる</a>と一番始めに <a class="keyword" href="http://d.hatena.ne.jp/keyword/CodePlex">CodePlex</a> の AccChecker プロジェクトのページが出てきますが、2010 年にリリースされたバージョンで更新が止まってます。この記事の最後にある <a class="keyword" href="http://d.hatena.ne.jp/keyword/Windows">Windows</a> <a class="keyword" href="http://d.hatena.ne.jp/keyword/SDK">SDK</a> に同梱されて居るバージョンがおそらく最新版です</span></p> </div> kim_upsilon OpenTween AdventCalendar 10日目(遅刻) - OpenTween振り返り(その1) hatenablog://entry/8454420450077091192 2014-12-15T00:38:57+09:00 2016-12-13T07:59:56+09:00 この記事は OpenTween AdventCalendar の10日目の記事です。 今日は12月15日です。頑張って挽回せねば…。 この記事から数日に分けて OpenTween のこれまでの振り返りをしていきたいと思ひます。 OpenTween以前 id:kim_upsilon が Tween について言及したのは 2010/9/21 が最初でした。 TweenがXSS脆弱性受けるとかどういう発想だ、と思ったらwebをスクレイピングする機能とかあったんだっけか。いや関係ないけど— upsilon (@kim_upsilon) September 21, 2010 この日はどうやら twitt… <p><strong>この記事は <a href="http://www.adventar.org/calendars/597">OpenTween AdventCalendar</a> の10日目の記事です。</strong></p> <p>今日は12月15日です。頑張って挽回せねば…。 この記事から数日に分けて OpenTween のこれまでの振り返りをしていきたいと思ひます。</p> <h3>OpenTween以前</h3> <p><a href="http://blog.hatena.ne.jp/kim_upsilon/">id:kim_upsilon</a> が Tween について言及したのは 2010/9/21 が最初でした。</p> <p><blockquote class="twitter-tweet" data-lang="HASH(0xa80a9a8)"><p lang="ja" dir="ltr">Tweenが<a class="keyword" href="http://d.hatena.ne.jp/keyword/XSS%C0%C8%BC%E5%C0%AD">XSS脆弱性</a>受けるとかどういう発想だ、と思ったらwebを<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%B9%A5%AF%A5%EC%A5%A4%A5%D4%A5%F3%A5%B0">スクレイピング</a>する機能とかあったんだっけか。いや関係ないけど</p>&mdash; upsilon (@kim_upsilon) <a href="https://twitter.com/kim_upsilon/status/25110124797">September 21, 2010</a></blockquote><script async src="//platform.twitter.com/widgets.js" charset="utf-8"></script></p> <p>この日はどうやら <a class="keyword" href="http://d.hatena.ne.jp/keyword/twitter">twitter</a>.com の <a class="keyword" href="http://d.hatena.ne.jp/keyword/XSS">XSS</a> <a class="keyword" href="http://d.hatena.ne.jp/keyword/%C0%C8%BC%E5%C0%AD">脆弱性</a>で騒ぎになってゐたやうです。この頃は既に Tween といふクライアントがあることも<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%B9%A5%AF%A5%EC%A5%A4%A5%D4%A5%F3%A5%B0">スクレイピング</a>機能が備はってゐることも知ってました。Tween も OpenTween も内部で WebBrowser を使用してゐますが、もし <a class="keyword" href="http://d.hatena.ne.jp/keyword/XSS">XSS</a> <a class="keyword" href="http://d.hatena.ne.jp/keyword/%C0%C8%BC%E5%C0%AD">脆弱性</a>があったとしても <a class="keyword" href="http://d.hatena.ne.jp/keyword/JavaScript">JavaScript</a> 等は実行できないよう制限されてゐますし、セッション <a class="keyword" href="http://d.hatena.ne.jp/keyword/Cookie">Cookie</a> を持たせてゐるわけではないので万が一実行できたとしても alert 等でイタズラできる程度でせう。<a href="#f-e52b7e01" name="fn-e52b7e01" title="追記(2016/12/13): 呑気なことを書いてますが、もし XSS 脆弱性があれば img 要素とかは普通に読み込めてしまふのでちゃんと対策しますよ">*1</a></p> <p><span itemscope itemtype="http://schema.org/Photograph"><img src="https://cdn-ak.f.st-hatena.com/images/fotolife/k/kim_upsilon/20141214/20141214131502.png" alt="f:id:kim_upsilon:20141214131502p:plain" title="f:id:kim_upsilon:20141214131502p:plain" class="hatena-fotolife" itemprop="image"></span></p> <p>2011/3/28 から <a href="http://sourceforge.jp/projects/tween/scm/svn/">Tween-svn</a> のコミット通知をメールで受け取るやうにしてました。Tween は<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%AA%A1%BC%A5%D7%A5%F3%A5%BD%A1%BC%A5%B9">オープンソース</a>の <a class="keyword" href="http://d.hatena.ne.jp/keyword/Twitter">Twitter</a> クライアントの中でも UserStreams などの先進的な機能を早くから実装してゐるといふイメージが前々からあって購読したんだと思ひます。ちなみに当時の僕は <a class="keyword" href="http://d.hatena.ne.jp/keyword/Windows">Windows</a> を常用してゐなかったため Tween は使ったことがありませんでした。</p> <p>それから 5 ヶ月後、この頃は気付きませんでしたが Ver.1.0.5.0 の頃には既に広告が実装されてゐたさうです(リリース時には無効化されてゐます)。実際に広告が表示されるやうになったのはこの 3 ヶ月後の Ver.1.2.0.0 からですね。</p> <p><a href="http://sourceforge.jp/projects/tween/svn/view?revision=1567&root=tween&view=revision">http://sourceforge.jp/projects/tween/svn/view?revision=1567&root=tween&view=revision</a></p> <p><a class="keyword" href="http://d.hatena.ne.jp/keyword/Google%20Analytics">Google Analytics</a> を使用したオプトアウト不可の利用状況収集もこのコミットに含まれてますね。このコミットはメッセージの短さに反して<a href="http://sourceforge.jp/projects/tween/svn/view/trunk/Tween/Resources/ChangeLog.txt?root=tween&amp;r1=1567&amp;r2=1566&amp;pathrev=1567&amp;diff_format=u">大量の変更</a>を含むため、その後の OpenTween の開発中にも git blame とかでコミットログを漁るとこのコミットによく行き着くことがあります。その時は落ち着いて diff とにらめっこをしませう。</p> <p>そして次は OpenTween プロジェクトのきっかけとなる Tween Ver.1.2.0.0 のリリースが行はれます。<del>続きは11日目の記事で。</del><a href="#f-4a1abffb" name="fn-4a1abffb" title="追記(2016/12/13): 2年後になって今さら11日目を書いたものの全然違ふ話題になってしまった">*2</a></p> <div class="footnote"> <p class="footnote"><a href="#fn-e52b7e01" name="f-e52b7e01" class="footnote-number">*1</a><span class="footnote-delimiter">:</span><span class="footnote-text">追記(2016/12/13): 呑気なことを書いてますが、もし <a class="keyword" href="http://d.hatena.ne.jp/keyword/XSS">XSS</a> <a class="keyword" href="http://d.hatena.ne.jp/keyword/%C0%C8%BC%E5%C0%AD">脆弱性</a>があれば img 要素とかは普通に読み込めてしまふのでちゃんと対策しますよ</span></p> <p class="footnote"><a href="#fn-4a1abffb" name="f-4a1abffb" class="footnote-number">*2</a><span class="footnote-delimiter">:</span><span class="footnote-text">追記(2016/12/13): 2年後になって今さら11日目を書いたものの全然違ふ話題になってしまった</span></p> </div> kim_upsilon OpenTween AdventCalendar 9日目 - 例の▼に関するご案内 hatenablog://entry/8454420450076595512 2014-12-09T23:48:16+09:00 2014-12-09T23:48:16+09:00 この記事は OpenTween AdventCalendar の9日目の記事です。 例の▼とは OpenTween のウィンドウ右下にある「▼」です。id:kim_upsilon は毎日 OpenTween についてエゴサしながら例の▼の周知活動を行ってゐます。 例の▼を周知させる様子です #OpenTween http://t.co/Mcx79UvwbE— upsilon (@kim_upsilon) 2014, 10月 29 このメニューには「Tween(OpenTween)は○○が出来ない」的なことを言はれるまさにその機能が備はってゐたりゐなかったりします。実際見付けにくい位置にあるので… <p><strong>この記事は <a href="http://www.adventar.org/calendars/597">OpenTween AdventCalendar</a> の9日目の記事です。</strong></p> <h3>例の▼とは</h3> <p><span itemscope itemtype="http://schema.org/Photograph"><img src="http://cdn-ak.f.st-hatena.com/images/fotolife/k/kim_upsilon/20141209/20141209230233.png" alt="f:id:kim_upsilon:20141209230233p:plain" title="f:id:kim_upsilon:20141209230233p:plain" class="hatena-fotolife" itemprop="image"></span></p> <p>OpenTween のウィンドウ右下にある「▼」です。<a href="http://blog.hatena.ne.jp/kim_upsilon/">id:kim_upsilon</a> は毎日 OpenTween についてエゴサしながら例の▼の周知活動を行ってゐます。</p> <p><blockquote class="twitter-tweet" lang="ja"><p>例の▼を周知させる様子です <a href="https://twitter.com/hashtag/OpenTween?src=hash">#OpenTween</a> <a href="http://t.co/Mcx79UvwbE">http://t.co/Mcx79UvwbE</a></p>&mdash; upsilon (@kim_upsilon) <a href="https://twitter.com/kim_upsilon/status/527477853168746498">2014, 10月 29</a></blockquote><script async src="//platform.twitter.com/widgets.js" charset="utf-8"></script></p> <p>このメニューには「Tween(OpenTween)は○○が出来ない」的なことを言はれるまさにその機能が備はってゐたりゐなかったりします。実際見付けにくい位置にあるので何を言はれても仕方ないですね。</p> <p>そんな訳で、例の▼で快適 <a class="keyword" href="http://d.hatena.ne.jp/keyword/Twitter">Twitter</a> ライフを送るための FAQ 的なものを書いておくのでご活用下さい。</p> <h4>「OpenTweenには画像投稿機能が無いよね」</h4> <p>例の▼ → 「投稿画像選択」</p> <h4>「OpenTweenは改行を入力できないからクソ」</h4> <p>例の▼ → 「発言欄<a class="keyword" href="http://d.hatena.ne.jp/keyword/%CA%A3%BF%F4">複数</a>行入力」</p> <h4>「OpenTweenは投稿するたびフォーカスが外れて実況に向かない」</h4> <p>例の▼ → 「フォーカスを発言欄にロックする」</p> <h4>「OpenTweenで投稿すると勝手にドット(.)が入力される」</h4> <p>例の▼ → 「<a class="keyword" href="http://d.hatena.ne.jp/keyword/API">API</a>コマンドを回避する」</p> <h4>「OpenTweenだと全角スペースが勝手に半角になる」</h4> <p>例の▼ → 「全角スペースを半角スペースに変換する」</p> <h4>「OpenTweenにパクツイ機能が無い」</h4> <p>お帰り下さい</p> <hr /> <p><a href="http://upsilon.hatenablog.jp/entry/2014/12/08/235921">昨日のリスト機能の説明</a>に続き、今日は例の▼についてでした。</p> <p>ところで例の▼って何か名前とか付いてるんですかね、と思ってTweenの<a class="keyword" href="http://d.hatena.ne.jp/keyword/Wiki">Wiki</a>を探したところ「<a href="http://sourceforge.jp/projects/tween/wiki/%E5%90%84%E9%83%A8%E5%90%8D%E7%A7%B0#h2-.E5.85.A5.E5.8A.9B.E6.AC.84">POST動作切り替えメニュー</a>」と書かれてゐました。まあ今後も「例の▼」で通していきます。</p> kim_upsilon OpenTween AdventCalendar 8日目 - リスト機能の使ひ方 hatenablog://entry/8454420450076501663 2014-12-08T23:59:21+09:00 2014-12-09T00:46:44+09:00 この記事は OpenTween AdventCalendar の8日目の記事です。 今日はソースコードの解説ではなく、OpenTween(といふかTweenの頃から備はってる)リストに関する機能の使ひ方を解説します。意外と知られてゐない機能の一つですので、例の「▼」*1とともに周知していきたいですね。 リストタブの作成方法 まずはメニューの「タブ」→「タブ作成」からタブ名入力ダイアログを表示させます。このダイアログでは作成するタブの名前(後で変更可能です)を指定できますが、この時にタブ種類を「Lists」にするとリストのタイムラインを表示するためのタブが作成できます。 タブ名入力ダイアログで種… <p><strong>この記事は <a href="http://www.adventar.org/calendars/597">OpenTween AdventCalendar</a> の8日目の記事です。</strong></p> <p>今日は<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%BD%A1%BC%A5%B9%A5%B3%A1%BC%A5%C9">ソースコード</a>の解説ではなく、OpenTween(といふかTweenの頃から備はってる)リストに関する機能の使ひ方を解説します。意外と知られてゐない機能の一つですので、例の「▼」<a href="#f-9bbd3b0e" name="fn-9bbd3b0e" title="画面右下にある ▼ のメニューから使へる機能のこと。">*1</a>とともに周知していきたいですね。</p> <h3>リストタブの作成方法</h3> <p><span itemscope itemtype="http://schema.org/Photograph"><img src="http://cdn-ak.f.st-hatena.com/images/fotolife/k/kim_upsilon/20141208/20141208234014.png" alt="f:id:kim_upsilon:20141208234014p:plain" title="f:id:kim_upsilon:20141208234014p:plain" class="hatena-fotolife" itemprop="image"></span></p> <p>まずはメニューの「タブ」→「タブ作成」からタブ名入力ダイアログを表示させます。このダイアログでは作成するタブの名前(後で変更可能です)を指定できますが、この時にタブ種類を「Lists」にするとリストのタイムラインを表示するためのタブが作成できます。</p> <p><span itemscope itemtype="http://schema.org/Photograph"><img src="http://cdn-ak.f.st-hatena.com/images/fotolife/k/kim_upsilon/20141208/20141208234901.png" alt="f:id:kim_upsilon:20141208234901p:plain" title="f:id:kim_upsilon:20141208234901p:plain" class="hatena-fotolife" itemprop="image"></span></p> <p>タブ名入力ダイアログで種類をListsにした上で「OK」をクリックすると、次に表示するリストを選択するダイアログが表示されます。ここには自分がフォローしているリストと自分が作成したリストが表示されます。これ以外のリストを表示したい場合は、あらかじめ <a class="keyword" href="http://d.hatena.ne.jp/keyword/twitter">twitter</a>.com 等からそのリストをフォローする必要があります。<a href="#f-a32927a5" name="fn-a32927a5" title="あるいは設定ファイルを直接書き換えても実現可能です。">*2</a></p> <p>リストを選択して「OK」をクリックするとタブの作成が完了し、選択したリストのタイムラインが表示されるようになります。</p> <h3>リストの編集機能</h3> <p><span itemscope itemtype="http://schema.org/Photograph"><img src="http://cdn-ak.f.st-hatena.com/images/fotolife/k/kim_upsilon/20141209/20141209000452.png" alt="f:id:kim_upsilon:20141209000452p:plain" title="f:id:kim_upsilon:20141209000452p:plain" class="hatena-fotolife" itemprop="image"></span></p> <p>Tween 及び OpenTween にはリストの作成・編集機能も備はってゐます。メニューの「その他機能」→「リスト編集」からこの機能を利用できます。</p> <p><span itemscope itemtype="http://schema.org/Photograph"><img src="http://cdn-ak.f.st-hatena.com/images/fotolife/k/kim_upsilon/20141208/20141208234902.png" alt="f:id:kim_upsilon:20141208234902p:plain" title="f:id:kim_upsilon:20141208234902p:plain" class="hatena-fotolife" itemprop="image"></span></p> <p>このダイアログでは、左の「リスト」から編集するリストを選択し、真ん中のメンバーにある「取得」をクリックするとリストのメンバーを確認・削除できるようになります。</p> <hr /> <p>Tween 系クライアントに限らず、大抵の <a class="keyword" href="http://d.hatena.ne.jp/keyword/Twitter">Twitter</a> クライアントってリスト機能の存在感が薄いですよね。僕も<a class="keyword" href="http://d.hatena.ne.jp/keyword/%CC%EB%A5%D5%A5%AF%A5%ED%A5%A6">夜フクロウ</a>のリスト編集機能をどこから呼び出すのか思ひ出せずに半年が経ちます<a href="#f-3d524b48" name="fn-3d524b48" title="ググれ">*3</a>。折角なので明日は例の「▼」についても書いておこうと思ひます。</p> <div class="footnote"> <p class="footnote"><a href="#fn-9bbd3b0e" name="f-9bbd3b0e" class="footnote-number">*1</a><span class="footnote-delimiter">:</span><span class="footnote-text">画面右下にある ▼ のメニューから使へる機能のこと。</span></p> <p class="footnote"><a href="#fn-a32927a5" name="f-a32927a5" class="footnote-number">*2</a><span class="footnote-delimiter">:</span><span class="footnote-text">あるいは設定ファイルを直接書き換えても実現可能です。</span></p> <p class="footnote"><a href="#fn-3d524b48" name="f-3d524b48" class="footnote-number">*3</a><span class="footnote-delimiter">:</span><span class="footnote-text">ググれ</span></p> </div> kim_upsilon OpenTween AdventCalendar 6日目 - ふぁぼでタイムラインを作る hatenablog://entry/8454420450076321519 2014-12-06T23:56:48+09:00 2014-12-06T23:56:48+09:00 この記事は OpenTween AdventCalendar の6日目の記事です。 ふぁぼだけでタイムラインを作ってみた (あとでスクショ貼ります) OpenTween のソースコードに手を加へて、自分がフォローしてる人たちのふぁぼだけでタイムラインを作り上げる Twitter クライアントを実現しました。 これは何かといふと、「自分が興味を持ってフォローした人たちがふぁぼってゐるツイートは面白いのではないか?」といふ仮定に基づいた実験のためのクライアントです。結論から言ふとさうでもなかった感じですが、OpenTween を改造してみた一例として、軽く仕組みについて触れてみます。 仕組み まず… <p><strong>この記事は <a href="http://www.adventar.org/calendars/597">OpenTween AdventCalendar</a> の6日目の記事です。</strong></p> <h3>ふぁぼだけでタイムラインを作ってみた</h3> <p>(あとでスクショ貼ります)</p> <p>OpenTween の<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%BD%A1%BC%A5%B9%A5%B3%A1%BC%A5%C9">ソースコード</a>に手を加へて、自分がフォローしてる人たちのふぁぼだけでタイムラインを作り上げる <a class="keyword" href="http://d.hatena.ne.jp/keyword/Twitter">Twitter</a> クライアントを実現しました。</p> <p>これは何かといふと、「自分が興味を持ってフォローした人たちがふぁぼってゐるツイートは面白いのではないか?」といふ仮定に基づいた実験のためのクライアントです。結論から言ふとさうでもなかった感じですが、OpenTween を改造してみた一例として、軽く仕組みについて触れてみます。</p> <h3>仕組み</h3> <p>まず自分以外のふぁぼをどうやって受信してゐるのかといふと、UserStreamsに <code>include_followings_activity=true</code> を指定して接続することで実現してゐます。これは公式にドキュメント化されてゐないパラメータですが TweetDeck とかで使はれてるらしいです。とりあへず、これにより自分がフォローしてる人のふぁぼも流れてくる様になります。</p> <p><a href="https://github.com/upsilon/OpenTween/commit/97e00c3aed7f449163a13844fc6d7d31bea72ed2">https://github.com/upsilon/OpenTween/commit/97e00c3aed7f449163a13844fc6d7d31bea72ed2</a></p> <p>次に、OpenTween の発言一覧のリストにふぁぼが流れてくるやうにします。どんな感じかといふと、通常の OpenTween で公式 RT が「ほげほげ (RT: kim_upsilon)」と表示される感じで「ほげほげ (Fav: kim_upsilon)」としてふぁぼをタイムライン上に放流します。</p> <p><a href="https://github.com/upsilon/OpenTween/commit/697771fb4041f0ab83b22224d31b003f85962f4a">https://github.com/upsilon/OpenTween/commit/697771fb4041f0ab83b22224d31b003f85962f4a</a></p> <p>最後に通常の <a class="keyword" href="http://d.hatena.ne.jp/keyword/REST%20API">REST API</a> による home_timeline の取得処理を削除します。これでタイムラインがふぁぼだけで構成される様になりました。めでたしめでたし。</p> <p><a href="https://github.com/upsilon/OpenTween/commit/ee5005330c819a5b2fbfa22c5116c4345ae7d084">https://github.com/upsilon/OpenTween/commit/ee5005330c819a5b2fbfa22c5116c4345ae7d084</a></p> <h3><a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%BD%A1%BC%A5%B9%A5%B3%A1%BC%A5%C9">ソースコード</a></h3> <p><a class="keyword" href="http://d.hatena.ne.jp/keyword/GitHub">GitHub</a> の <code>upsilon/OpenTween</code> <a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%EA%A5%DD%A5%B8%A5%C8%A5%EA">リポジトリ</a>にある <code>favtimeline</code> ブランチを参照して下さい。</p> <p><a href="https://github.com/upsilon/OpenTween/compare/favtimeline">Comparing opentween:master...upsilon:favtimeline &middot; upsilon/OpenTween &middot; GitHub</a></p> kim_upsilon OpenTween AdventCalendar 5日目 - タブ振り分けルールの動作 hatenablog://entry/8454420450076238040 2014-12-05T23:59:08+09:00 2014-12-06T21:35:38+09:00 この記事は OpenTween AdventCalendar の5日目の記事です。 今日はタブ振り分けルールの動作についてです。実装について書かうとも思ったんですが、今のところ式木が生ひ茂る森なので説明するなら Yacq を導入してからにしたいなー、といふ感じです。 「タブ振り分けルール」って何 これです。 新規タブの種別を「タイムライン振り分け」にすると、この機能を使へるタブが作られます。振り分けルールを使ふ目的は、 自分の名前を含むツイートを別のタブに振り分けて通知する タイムラインから特定のキーワードを含むツイートを見えなくしたい 振り分けルールを使ってツイートを別のタブに「移動」するこ… <p><strong>この記事は <a href="http://www.adventar.org/calendars/597">OpenTween AdventCalendar</a> の5日目の記事です。</strong></p> <p>今日はタブ振り分けルールの動作についてです。実装について書かうとも思ったんですが、今のところ<a href="https://github.com/opentween/OpenTween/blob/OpenTween_v1.2.4/OpenTween/PostFilterRule.cs#L325">式木が生ひ茂る森</a>なので説明するなら Yacq を導入してからにしたいなー、といふ感じです。</p> <h3>「タブ振り分けルール」って何</h3> <p><span itemscope itemtype="http://schema.org/Photograph"><img src="http://cdn-ak.f.st-hatena.com/images/fotolife/k/kim_upsilon/20141205/20141205223426.png" alt="f:id:kim_upsilon:20141205223426p:plain" title="OpenTweenの「振り分けルール」ダイアログ" class="hatena-fotolife" itemprop="image"></span></p> <p>これです。</p> <p>新規タブの種別を「タイムライン振り分け」にすると、この機能を使へるタブが作られます。振り分けルールを使ふ目的は、</p> <ul> <li>自分の名前を含むツイートを別のタブに振り分けて通知する</li> <li>タイムラインから特定のキーワードを含むツイートを見えなくしたい <ul> <li>振り分けルールを使ってツイートを別のタブに「移動」することで<a class="keyword" href="http://d.hatena.ne.jp/keyword/NG%A5%EF%A1%BC%A5%C9">NGワード</a>的な機能を実現できます</li> </ul> </li> </ul> <p>などが主でせうか。<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%B9%A5%AF%A5%EA%A1%BC%A5%F3%A5%CD%A1%BC%A5%E0">スクリーンネーム</a>を<a class="keyword" href="http://d.hatena.ne.jp/keyword/%CA%A3%BF%F4">複数</a>指定して、ストリーミング可能な疑似リストタブのやうなものも作れたりします。</p> <h3>タブ振り分けルールの動作</h3> <p><blockquote class="twitter-tweet" lang="ja"><p>I just added <a class="keyword" href="http://d.hatena.ne.jp/keyword/%C6%FC%A4%CE%BD%D0%C0%BD%CC%CD">日の出製麺</a>所 to <a href="https://twitter.com/hashtag/OpenStreetMap?src=hash">#OpenStreetMap</a>. <a href="http://t.co/FF2GTsKHWO">http://t.co/FF2GTsKHWO</a> via <a href="https://twitter.com/pushpinapp">@pushpinapp</a></p>&mdash; upsilon (@kim_upsilon) <a href="https://twitter.com/kim_upsilon/status/445020513220304896">2014, 3月 16</a></blockquote><script async src="//platform.twitter.com/widgets.js" charset="utf-8"></script></p> <p>例として、このツイートを振り分けるときの挙動を見てみませう。<a href="#f-d9786140" name="fn-d9786140" title="メンションとハッシュタグと URL の全てが揃ったツイートを探したらたまたまうどんツイートになりました。うどんうどん。">*1</a></p> <p>振り分けルールで注意しなければならないのは、「<strong>URL検索</strong>」がオンの状態とオフの状態で判定に使はれるテキストが変はるといふことです。そのため、ここでは「URL検索」がオン/オフの場合を分けて解説します。</p> <h4>「URL検索」にチェックが入ってゐない場合</h4> <ul> <li>ScreenName <ul> <li><code>kim_upsilon</code></li> </ul> </li> <li>TextFromApi <ul> <li><code>I just added 日の出製麺所 to #OpenStreetMap. openstreetmap.org/browse/node/27… via @pushpinapp</code></li> </ul> </li> <li>Source <ul> <li><code>iOS</code></li> </ul> </li> </ul> <p>上のテキストを使って、次のやうな判定が行はれます。</p> <ul> <li>「複合条件」の場合 <ul> <li>ScreenName と「ユーザーID」<a href="#f-f346672b" name="fn-f346672b" title="Tween/OpenTween ではスクリーンネームのことを「ユーザーID」と呼んでゐます。表記変へたい…。">*2</a>が一致してゐるか?(完全一致)</li> <li>TextFromApi に「発言内容」(スペース区切り)が含まれてゐるか?(AND検索, 部分一致)</li> </ul> </li> <li>「単一条件」の場合 <ul> <li>ScreenName または TextFromApi に「発言内容」(スペース区切り)が含まれてゐるか?(AND検索, ScreenNameとは完全一致, TextFromApiとは部分一致)</li> </ul> </li> <li>共通 <ul> <li>Source が「Source」と一致してゐるか?(完全一致)</li> <li>「<a class="keyword" href="http://d.hatena.ne.jp/keyword/%B8%F8%BC%B0RT">公式RT</a>のみ」にチェックが入ってゐる場合、<a class="keyword" href="http://d.hatena.ne.jp/keyword/%B8%F8%BC%B0RT">公式RT</a>であるか?</li> </ul> </li> </ul> <h4>「URL検索」にチェックが入ってゐる場合</h4> <ul> <li>ScreenName <ul> <li><code>kim_upsilon</code></li> </ul> </li> <li>Text <ul> <li><pre><code>I just added 日の出製麺所 to &lt;a class="hashtag" href="https://twitter.com/search?q=%23OpenStreetMap"&gt;#OpenStreetMap&lt;/a&gt;. &lt;a href="http://t.co/FF2GTsKHWO" title="http://www.openstreetmap.org/browse/node/2720199696"&gt;openstreetmap.org/browse/node/27…&lt;/a&gt; via &lt;a class="mention" href="https://twitter.com/pushpinapp"&gt;@pushpinapp&lt;/a&gt;</code></pre></li> </ul> </li> <li>SourceHtml <ul> <li><code>&lt;a href="http://www.apple.com/"&gt;iOS&lt;/a&gt;</code></li> </ul> </li> </ul> <p>上のテキストを使って、次のやうな判定が行はれます。</p> <ul> <li>「複合条件」の場合 <ul> <li>ScreenName と「ユーザーID」が一致してゐるか?(完全一致)</li> <li>Text に「発言内容」(スペース区切り)が含まれてゐるか?(AND検索, 部分一致)</li> </ul> </li> <li>「単一条件」の場合 <ul> <li>ScreenName または Text に「発言内容」(スペース区切り)が含まれてゐるか?(AND検索, ScreenNameとは完全一致, Textとは部分一致)</li> </ul> </li> <li>共通 <ul> <li>SourceHtml が「Source」と一致してゐるか?(部分一致)</li> <li>「<a class="keyword" href="http://d.hatena.ne.jp/keyword/%B8%F8%BC%B0RT">公式RT</a>のみ」にチェックが入ってゐる場合、<a class="keyword" href="http://d.hatena.ne.jp/keyword/%B8%F8%BC%B0RT">公式RT</a>であるか?</li> </ul> </li> </ul> <h4>注意</h4> <ul> <li>「<a class="keyword" href="http://d.hatena.ne.jp/keyword/%C0%B5%B5%AC%C9%BD%B8%BD">正規表現</a>」が有効な場合、上記の動作の「完全一致」はすべて部分一致になります <ul> <li>完全一致でマッチさせる場合はパターンを <code>^</code> と <code>$</code> で囲ひます</li> </ul> </li> <li>「除外ルール」では各条件は OR 条件として機能します <ul> <li>マッチルールでは全ての条件に当てはまらなければ振り分けられないが、除外ルールでは一つでも条件が当てはまれば振り分け対象外となる</li> </ul> </li> </ul> <h3>例</h3> <p>ScreenName に <code>bot</code> が含まれてゐないアカウントの <code>twittbot.net</code> によるツイートを振り分ける:</p> <ul> <li>マッチルール <ul> <li>Source: <code>twittbot.net</code></li> </ul> </li> <li>除外ルール <ul> <li>ユーザーID: <code>.*bot</code></li> <li><a class="keyword" href="http://d.hatena.ne.jp/keyword/%C0%B5%B5%AC%C9%BD%B8%BD">正規表現</a>: オン</li> </ul> </li> </ul> <p>「#共感したらRT」的なツイートを振り分ける:</p> <ul> <li>マッチルール <ul> <li>発言内容: <code>[##].+([たな]ら|ひと|人は?|全員)RT</code></li> <li><a class="keyword" href="http://d.hatena.ne.jp/keyword/%C0%B5%B5%AC%C9%BD%B8%BD">正規表現</a>: オン</li> </ul> </li> </ul> <h3>まとめ</h3> <p>いい加減<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%E9%A5%E0%A5%C0%BC%B0">ラムダ式</a>復活させたい。</p> <div class="footnote"> <p class="footnote"><a href="#fn-d9786140" name="f-d9786140" class="footnote-number">*1</a><span class="footnote-delimiter">:</span><span class="footnote-text">メンションと<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%CF%A5%C3%A5%B7%A5%E5%A5%BF%A5%B0">ハッシュタグ</a>と URL の全てが揃ったツイートを探したらたまたまうどんツイートになりました。うどんうどん。</span></p> <p class="footnote"><a href="#fn-f346672b" name="f-f346672b" class="footnote-number">*2</a><span class="footnote-delimiter">:</span><span class="footnote-text">Tween/OpenTween では<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%B9%A5%AF%A5%EA%A1%BC%A5%F3%A5%CD%A1%BC%A5%E0">スクリーンネーム</a>のことを「ユーザーID」と呼んでゐます。表記変へたい…。</span></p> </div> kim_upsilon OpenTween AdventCalendar 4日目 - テストコード hatenablog://entry/8454420450076147550 2014-12-04T23:57:46+09:00 2014-12-05T02:54:36+09:00 この記事は OpenTween AdventCalendar の4日目の記事です。 今日は OpenTween のテストコードについて書きます。とはいへ、もうここ書いてる時点で23時を回ってるのでめっちゃ急いで書きます。 OpenTweenのテストコード まず OpenTween 初期のテスト状況ですが、TwitterクライアントのTweenのコードをコード分析にかけてみた - かずきのBlog@hatena でも指摘されてゐる通り、Tween の少なくとも Ver.1.1.0.0 までにはテストコードが一切存在してゐませんでした。これはフォーク直後の OpenTween についても同じ状況で… <p><strong>この記事は <a href="http://www.adventar.org/calendars/597">OpenTween AdventCalendar</a> の4日目の記事です。</strong></p> <p>今日は OpenTween のテストコードについて書きます。とはいへ、もうここ書いてる時点で23時を回ってるのでめっちゃ急いで書きます。</p> <h3>OpenTweenのテストコード</h3> <p>まず OpenTween 初期のテスト状況ですが、<a href="http://okazuki.hatenablog.com/entry/20110218/1298049484">Twitter&#x30AF;&#x30E9;&#x30A4;&#x30A2;&#x30F3;&#x30C8;&#x306E;Tween&#x306E;&#x30B3;&#x30FC;&#x30C9;&#x3092;&#x30B3;&#x30FC;&#x30C9;&#x5206;&#x6790;&#x306B;&#x304B;&#x3051;&#x3066;&#x307F;&#x305F; - &#x304B;&#x305A;&#x304D;&#x306E;Blog@hatena</a> でも指摘されてゐる通り、Tween の少なくとも Ver.1.1.0.0 までにはテストコードが一切存在してゐませんでした。これはフォーク直後の OpenTween についても同じ状況です。</p> <p>v1.0.7 から <a class="keyword" href="http://d.hatena.ne.jp/keyword/NUnit">NUnit</a> を使ってテストを書き始めて、その頃実装したサムネイル関係の処理を中心に網羅しました。v1.1.5 からは個人的な嗜好から xUnit.net に移行して、現在まで引き続き書いてゐます。</p> <h3>コード<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%AB%A5%D0%A5%EC%A5%C3%A5%B8">カバレッジ</a>の遍歴</h3> <p>テストを書いてると言ってもどの位網羅できてゐるのかが気になりますね。そこで OpenCover を使用して各バージョン時点でのコード<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%AB%A5%D0%A5%EC%A5%C3%A5%B8">カバレッジ</a>を調べてみました。</p> <p>結果: <a href="http://www.opentween.org/opencover/">http://www.opentween.org/opencover/</a></p> <p><span itemscope itemtype="http://schema.org/Photograph"><img src="http://cdn-ak.f.st-hatena.com/images/fotolife/k/kim_upsilon/20141205/20141205002030.png" alt="f:id:kim_upsilon:20141205002030p:plain" title="コードカバレッジのグラフ (v1.0.7 - v1.2.4)" class="hatena-fotolife" itemprop="image"></span></p> <table> <thead> <tr> <th> </th> <th> Coverable lines<a href="#f-103ccf40" name="fn-103ccf40" title="Windows フォームデザイナによって自動生成される *.Designer.cs の行数は除外してゐます。">*1</a> </th> <th> Covered lines </th> <th> Coverage </th> </tr> </thead> <tbody> <tr> <td> v1.0.7 </td> <td> 25,226 </td> <td> 1,072 </td> <td> 4.2% </td> </tr> <tr> <td> v1.0.8 </td> <td> 25,249 </td> <td> 1,075 </td> <td> 4.2% </td> </tr> <tr> <td> v1.0.9 </td> <td> 24,798 </td> <td> 1,168 </td> <td> 4.7% </td> </tr> <tr> <td> v1.1.0 </td> <td> 24,761 </td> <td> 1,296 </td> <td> 5.2% </td> </tr> <tr> <td> v1.1.1 </td> <td> 25,059 </td> <td> 1,327 </td> <td> 5.2% </td> </tr> <tr> <td> v1.1.2 </td> <td> 25,089 </td> <td> 1,276 </td> <td> 5.0% </td> </tr> <tr> <td> v1.1.3 </td> <td> 23,941 </td> <td> 1,408 </td> <td> 5.8% </td> </tr> <tr> <td> v1.1.4 </td> <td> 23,957 </td> <td> 1,410 </td> <td> 5.8% </td> </tr> <tr> <td> v1.1.5 </td> <td> 24,136 </td> <td> 1,459 </td> <td> 6.0% </td> </tr> <tr> <td> v1.1.6 </td> <td> 24,140 </td> <td> 1,443 </td> <td> 5.9% </td> </tr> <tr> <td> v1.1.7 </td> <td> 24,027 </td> <td> 1,411 </td> <td> 5.8% </td> </tr> <tr> <td> v1.1.8 </td> <td> 24,086 </td> <td> 1,578 </td> <td> 6.5% </td> </tr> <tr> <td> v1.1.9 </td> <td> 24,175 </td> <td> 1,620 </td> <td> 6.7% </td> </tr> <tr> <td> v1.2.0 </td> <td> 24,002 </td> <td> 1,834 </td> <td> 7.6% </td> </tr> <tr> <td> v1.2.1 </td> <td> 24,040 </td> <td> 1,851 </td> <td> 7.6% </td> </tr> <tr> <td> v1.2.2 </td> <td> 24,143 </td> <td> 1,852 </td> <td> 7.6% </td> </tr> <tr> <td> v1.2.3 </td> <td> 23,903 </td> <td> 1,852 </td> <td> 7.7% </td> </tr> <tr> <td> v1.2.4 </td> <td> 23,985 </td> <td> 1,922 </td> <td> 8.0% </td> </tr> </tbody> </table> <p>うーん、厳しい。最新の v1.2.4 でもやっと 8.0% といった所です。言ふまでもなく v1.0.7 より前は 0% です。</p> <h3><a class="keyword" href="http://d.hatena.ne.jp/keyword/Travis">Travis</a> CI との連携</h3> <p>定番の <a class="keyword" href="http://d.hatena.ne.jp/keyword/Travis">Travis</a> CI と連携してます。</p> <p><a href="https://travis-ci.org/opentween/OpenTween">https://travis-ci.org/opentween/OpenTween</a></p> <p>テストが壊れるやうなコミットをすると author にお叱りのメールが届きます。</p> <h3>まとめ</h3> <p>テスト書きませう。あと <a class="keyword" href="http://d.hatena.ne.jp/keyword/Travis">Travis</a> CI マジ感謝。</p> <div class="footnote"> <p class="footnote"><a href="#fn-103ccf40" name="f-103ccf40" class="footnote-number">*1</a><span class="footnote-delimiter">:</span><span class="footnote-text"><a class="keyword" href="http://d.hatena.ne.jp/keyword/Windows">Windows</a> フォームデザイナによって自動生成される *.Designer.cs の行数は除外してゐます。</span></p> </div> kim_upsilon OpenTween AdventCalendar 2日目 - サムネイル画像表示 hatenablog://entry/8454420450075895830 2014-12-02T23:58:33+09:00 2014-12-05T02:54:58+09:00 この記事は OpenTween AdventCalendar の2日目の記事です。 2日目に入りました。公開する前の日には記事を完成させて置かうといふ計画は早くも崩れ去りました。 今日は、Twitter クライアントにおいて重要な機能の一つである「サムネイル画像表示」について書きます。 Twitterクライアントにおけるサムネイル画像表示 例へばこんな感じのツイートがあります。 来年の干支 pic.twitter.com/FMuOGREv3s— upsilon (@kim_upsilon) September 15, 2014 このツイートは 来年の干支 https://pic.twitter… <p><strong>この記事は <a href="http://www.adventar.org/calendars/597">OpenTween AdventCalendar</a> の2日目の記事です。</strong></p> <p>2日目に入りました。公開する前の日には記事を完成させて置かうといふ計画は早くも崩れ去りました。 今日は、<a class="keyword" href="http://d.hatena.ne.jp/keyword/Twitter">Twitter</a> クライアントにおいて重要な機能の一つである「サムネイル画像表示」について書きます。</p> <h3><a class="keyword" href="http://d.hatena.ne.jp/keyword/Twitter">Twitter</a>クライアントにおけるサムネイル画像表示</h3> <p>例へばこんな感じのツイートがあります。</p> <p><blockquote class="twitter-tweet" lang="HASH(0x9781418)"><p>来年の干支 <a href="http://t.co/FMuOGREv3s">pic.twitter.com/FMuOGREv3s</a></p>&mdash; upsilon (@kim_upsilon) <a href="https://twitter.com/kim_upsilon/status/511341570981761025">September 15, 2014</a></blockquote><script async src="//platform.twitter.com/widgets.js" charset="utf-8"></script></p> <p>このツイートは <code>来年の干支 https://pic.twitter.com/FMuOGREv3s</code> といふテキストです。<code>https://pic.twitter.com/FMuOGREv3s</code> は画像を示す URL で、これを開くと<a href="http://www.yumebokujo.com/">成田ゆめ牧場</a>の「ふれん ZOO 広場」で撮影された十二支で 8 番目に数へられる未の動物であるヒツジの写真が出てきます。上の埋め込みツイートにもその写真が表示されてゐますね。</p> <p>四六時中 <a class="keyword" href="http://d.hatena.ne.jp/keyword/Twitter">Twitter</a> のタイムラインを眺める人々にとって <code>来年の干支 https://pic.twitter.com/FMuOGREv3s</code> とだけ書かれたツイートの画像を見るためにわざわざリンクを踏んでブラウザで画像を見るといふのはすげー面倒くさい行為です。なので、こんな感じにツイートと一緒にリンク先の画像も表示する機能が <a class="keyword" href="http://d.hatena.ne.jp/keyword/Twitter">Twitter</a> クライアントに求められるわけですね。</p> <p>今となっては上のツイートのように <a class="keyword" href="http://d.hatena.ne.jp/keyword/Twitter">Twitter</a> が公式に提供してゐる画像アップロード機能 (pic.<a class="keyword" href="http://d.hatena.ne.jp/keyword/twitter">twitter</a>.com) が利用されることが多いですが、それ以前は <a href="http://twitpic.com/">Twitpic</a> や <a href="http://yfrog.com/">yfrog</a> などの <a class="keyword" href="http://d.hatena.ne.jp/keyword/Twitter">Twitter</a> と連携する<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%B5%A1%BC%A5%C9%A5%D1%A1%BC%A5%C6%A5%A3">サードパーティ</a>の画像共有サービスが多く使はれてゐました。</p> <p>また、クライアントによっては画像共有サービスに限らず <a href="https://www.youtube.com/">Youtube</a> や<a href="http://www.nicovideo.com/">ニコニコ動画</a>などの動画共有サービスや <a href="http://www.pixiv.net/">Pixiv</a> や <a href="http://www.tinami.com/">TINAMI</a> に投稿されたイラストなどもサムネイル表示の対象としてゐるものもあります。</p> <h3>OpenTweenでのサムネイル画像表示の実装</h3> <p>画像共有サービスなどの URL からサムネイル画像を取得する方法はそのサービスによって異なり、大きく分けて次のような方法があります。</p> <ol> <li>URL の一部を書き換へるとサムネイル画像の URL になる</li> <li>各サービスが提供してゐる <a class="keyword" href="http://d.hatena.ne.jp/keyword/API">API</a> を呼び出してサムネイル画像の URL を取得する</li> <li>画像ページの HTML を<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%B9%A5%AF%A5%EC%A5%A4%A5%D4%A5%F3%A5%B0">スクレイピング</a>して画像 URL を取得する</li> </ol> <p>それぞれのパターンごとに、実際の OpenTween での実装を見てみませう。</p> <h4>1. URLの一部を書き換へる</h4> <p>Twitpic など多くの画像共有サービスで提供されてゐる方法です。例へば <code>https://twitpic.com/2oaupa</code> といふ URL があった場合、<code>http://twitpic.com/show/thumb/2oaupa</code> のやうに書き換へると直接サムネイル画像を取得することができます。簡単ですね。</p> <p>OpenTween v1.2.4 では Twitpic のサムネイルについて次のように記述してゐます。</p> <p><a href="https://github.com/opentween/OpenTween/blob/OpenTween_v1.2.4/OpenTween/Thumbnail/ThumbnailGenerator.cs#L66-70">ThumbnailGenerator.cs 66-70行目</a></p> <pre class="code lang-cs" data-lang="cs" data-unlink><span class="synComment">// Twitpic</span> <span class="synStatement">new</span> SimpleThumbnailService( <span class="synSpecial">@</span><span class="synConstant">&quot;^http://(www\.)?twitpic\.com/(?&lt;photoId&gt;\w+)(/full/?)?$&quot;</span>, <span class="synConstant">&quot;http://twitpic.com/show/thumb/${photoId}&quot;</span>, <span class="synConstant">&quot;http://twitpic.com/show/large/${photoId}&quot;</span>), </pre> <p><a href="https://github.com/opentween/OpenTween/blob/OpenTween_v1.2.4/OpenTween/Thumbnail/Services/SimpleThumbnailService.cs">SimpleThumbnailService</a> に渡してゐる 1 番目の引数は Twitpic の URL を検知するための<a class="keyword" href="http://d.hatena.ne.jp/keyword/%C0%B5%B5%AC%C9%BD%B8%BD">正規表現</a>です。もし<a class="keyword" href="http://d.hatena.ne.jp/keyword/%C0%B5%B5%AC%C9%BD%B8%BD">正規表現</a>にマッチする URL があれば 2,3 番目の文字列に従って URL を置換します。簡単ですね。</p> <h4>2. 各サービスが提供してゐる<a class="keyword" href="http://d.hatena.ne.jp/keyword/API">API</a>を呼び出す</h4> <p>これは画像共有サービスといふよりは <a class="keyword" href="http://d.hatena.ne.jp/keyword/Youtube">Youtube</a> や <a class="keyword" href="http://d.hatena.ne.jp/keyword/Tumblr">Tumblr</a> などのサービスでサムネイル画像を取得する方法として提供されてゐます。</p> <ul> <li><a href="https://github.com/opentween/OpenTween/blob/OpenTween_v1.2.4/OpenTween/Thumbnail/Services/Tinami.cs">Tinami.cs</a></li> <li><a href="https://github.com/opentween/OpenTween/blob/OpenTween_v1.2.4/OpenTween/Thumbnail/Services/Tumblr.cs">Tumblr.cs</a></li> <li><a href="https://github.com/opentween/OpenTween/blob/OpenTween_v1.2.4/OpenTween/Thumbnail/Services/Youtube.cs">Youtube.cs</a></li> </ul> <p>このパターンの殆どは各サービスの <a class="keyword" href="http://d.hatena.ne.jp/keyword/API">API</a> キーを作成しに行く必要があるといふのが若干面倒なところです。</p> <h4>3. HTMLを<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%B9%A5%AF%A5%EC%A5%A4%A5%D4%A5%F3%A5%B0">スクレイピング</a>する</h4> <p>ザ・最終手段です。できれば避けたい方法ですね。</p> <p>とはいへ、多くの場合は <a href="http://ogp.me/">Open Gragh protocol</a> と呼ばれる仕様に沿って書かれた META 要素が HTML コンテンツの中に記述されてゐるため、それを読み取ればサムネイル画像の URL も大抵取得できます。</p> <p><a href="https://github.com/opentween/OpenTween/blob/OpenTween_v1.2.4/OpenTween/Thumbnail/ThumbnailGenerator.cs#L130-131">ThumbnailGenerator.cs 130-131行目</a></p> <pre class="code lang-cs" data-lang="cs" data-unlink><span class="synComment">// flickr</span> <span class="synStatement">new</span> MetaThumbnailService(<span class="synSpecial">@</span><span class="synConstant">&quot;^https?://www\.flickr\.com/.+$&quot;</span>), </pre> <p><a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%B9%A5%AF%A5%EC%A5%A4%A5%D4%A5%F3%A5%B0">スクレイピング</a>処理は <a href="https://github.com/opentween/OpenTween/blob/OpenTween_v1.2.4/OpenTween/Thumbnail/Services/MetaThumbnailService.cs">MetaThumbnailServiceクラス</a> 内で行はれます。今のところ OpenTween では OpenGraph でも取得できないやうなページの<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%B9%A5%AF%A5%EC%A5%A4%A5%D4%A5%F3%A5%B0">スクレイピング</a>はしてゐないため、あまり複雑な例はありません。</p> <hr /> <p>時間ギリギリだー。次回から余裕を持って記事を書きます…。</p> <p>OpenTween のサムネイル取得処理は、Tween からフォークして初めて大幅に手を加へた箇所でもあります。 OpenTween v1.0.0 の頃の <a href="https://github.com/opentween/OpenTween/blob/OpenTween_v1.0.0/OpenTween/Thumbnail.cs">Thumbnail.cs</a> とかと現在の実装を比較してみると、なかなか感慨深いものがありますね。</p> kim_upsilon OpenTween AdventCalendar 1日目 hatenablog://entry/8454420450074953792 2014-12-01T01:12:41+09:00 2014-12-05T02:55:09+09:00 この記事は OpenTween AdventCalendar の1日目の記事です。 初日です。アドベントカレンダーとか4年前にちょっと書いたことしかないのに始めちゃったけど、まあ何とかなるでせう。と言ふか、技術系のアドベントカレンダーって大体 25 日分書いてるけど、クリスマスまで「もういくつ寝ると〜」をやるなら正しくは 24 日分になる気がしますよね…。気がしません? 最初なので「OpenTween とは何か」から始めます。もう休み明けですからとっとと読んで寝ませう。 OpenTween #とは OpenTween は C# で書かれたオープンソースの Twitter クライアントです。 O… <p><b>この記事は <a href="http://www.adventar.org/calendars/597">OpenTween AdventCalendar</a> の1日目の記事です。</b></p> <p>初日です。<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%A2%A5%C9%A5%D9%A5%F3%A5%C8%A5%AB%A5%EC%A5%F3%A5%C0%A1%BC">アドベントカレンダー</a>とか<a href="http://ex.bucyou.net/op36/doc/22_event.html">4年前にちょっと書いた</a>ことしかないのに始めちゃったけど、まあ何とかなるでせう。と言ふか、技術系の<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%A2%A5%C9%A5%D9%A5%F3%A5%C8%A5%AB%A5%EC%A5%F3%A5%C0%A1%BC">アドベントカレンダー</a>って大体 25 日分書いてるけど、クリスマスまで「もういくつ寝ると〜」をやるなら正しくは 24 日分になる気がしますよね…。気がしません?</p> <p>最初なので「OpenTween とは何か」から始めます。もう休み明けですからとっとと読んで寝ませう。</p> <h3>OpenTween #とは</h3> <p>OpenTween は <a class="keyword" href="http://d.hatena.ne.jp/keyword/C%23">C#</a> で書かれた<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%AA%A1%BC%A5%D7%A5%F3%A5%BD%A1%BC%A5%B9">オープンソース</a>の <a class="keyword" href="http://d.hatena.ne.jp/keyword/Twitter">Twitter</a> クライアントです。</p> <p><iframe src="http://hatenablog.com/embed?url=https%3A%2F%2Fsourceforge.jp%2Fprojects%2Fopentween%2F" title="OpenTween プロジェクト日本語トップページ - SourceForge.JP" class="embed-card embed-webcard" scrolling="no" frameborder="0" style="width: 100%; height: 155px; max-width: 500px; margin: 10px 0px;"><a href="https://sourceforge.jp/projects/opentween/">OpenTween プロジェクト日本語トップページ - SourceForge.JP</a></iframe></p> <p>かつて<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%AA%A1%BC%A5%D7%A5%F3%A5%BD%A1%BC%A5%B9">オープンソース</a>で公開されてゐた <a href="https://sites.google.com/site/tweentwitterclient/">Tween</a> が 2011 年にライセンスを変更しクローズドソースとなったことを受けて、最後に<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%AA%A1%BC%A5%D7%A5%F3%A5%BD%A1%BC%A5%B9">オープンソース</a>で公開されたバージョンである Tween Ver1.1.0.0 <a href="#f-7abefeb1" name="fn-7abefeb1" title="正確には Tween の SVN リポジトリに Ver1.1.0.0 よりも少し進んだリビジョン (r1643) が公開されてゐたためそこからフォークした">*1</a> を元にフォーク(分岐)して OpenTween プロジェクトが始まりました。</p> <h3>機能とか</h3> <p>主要な機能は Tween Ver1.1.0.0 とあまり変はらないです。とは言っても Tween Ver1.1.0.0 は現行の <a class="keyword" href="http://d.hatena.ne.jp/keyword/Twitter">Twitter</a> <a class="keyword" href="http://d.hatena.ne.jp/keyword/API">API</a> ではもう殆どの機能が動作しませんから、Tween Ver1.1.0.0 と比べて“動く”といふ決定的な違ひがあります(?)。</p> <p>新しい Tween と OpenTween ではどの位機能が<s>乖離した</s>違ふのかは、少し古い情報ですが OpenTween の <a class="keyword" href="http://d.hatena.ne.jp/keyword/Wiki">Wiki</a> に適当にまとめた記事があります。</p> <p><a href="https://sourceforge.jp/projects/opentween/wiki/FeatureComparison">OpenTweenとTweenの比較表</a></p> <h3>プロジェクトの状況</h3> <p>OpenTween プロジェクトの開始は 2011/11/19 なので、もう 3 年が経ちます。Git <a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%EA%A5%DD%A5%B8%A5%C8%A5%EA">リポジトリ</a>には 8 名が push 権限を持ち、<a class="keyword" href="http://d.hatena.ne.jp/keyword/GitHub">GitHub</a> での Pull Request は 20 件受け付けました。変更量では、最新の OpenTween v1.2.4 までの間に 972 コミット (<span style="color: #00cc00">+114,875</span>/<span style="color: #cc0000">-102,462</span>行) の変更が行はれてゐます。</p> <p>現状、OpenTween のリリースは完全に <a href="http://blog.hatena.ne.jp/kim_upsilon/">id:kim_upsilon</a> の気分に委ねられてゐるので、だいたい1,2ヶ月位の間隔でバグ修正等が溜まってきたら新しいバージョンをリリースするという状態です。適当ですね。とはいへ、長期間開発が停滞するような時期は何だかんだで今まで無かったような気がします。</p> <h3>あなたとOpenTween,今すぐダウンロード</h3> <p>OpenTween をぜひ使ってみたいといふ方は、<a href="http://sourceforge.jp/projects/opentween/releases/p12655">http://sourceforge.jp/projects/opentween/releases/p12655</a> から一番新しいバージョンの OpenTween をダウンロードして早速使ってみませう。</p> <ul> <li><a class="keyword" href="http://d.hatena.ne.jp/keyword/Windows%20Vista">Windows Vista</a> かそれっぽい新しいやつ</li> <li><a class="keyword" href="http://d.hatena.ne.jp/keyword/.NET%20Framework">.NET Framework</a> 4.5.1 以降</li> <li><a class="keyword" href="http://d.hatena.ne.jp/keyword/Twitter">Twitter</a> のアカウント</li> </ul> <p>の3つが用意できれば使えるはずです。</p> <hr /> <p>1日目終はり。明日もたぶん続きます。</p> <div class="footnote"> <p class="footnote"><a href="#fn-7abefeb1" name="f-7abefeb1" class="footnote-number">*1</a><span class="footnote-delimiter">:</span><span class="footnote-text">正確には Tween の <a class="keyword" href="http://d.hatena.ne.jp/keyword/SVN">SVN</a> <a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%EA%A5%DD%A5%B8%A5%C8%A5%EA">リポジトリ</a>に Ver1.1.0.0 よりも少し進んだリビジョン (<a href="https://sourceforge.jp/projects/tween/scm/svn/commits/1643">r1643</a>) が公開されてゐたためそこからフォークした</span></p> </div> kim_upsilon TrimSliceでWindows共有 (SMB/CIFS) をマウントできるやうにする hatenablog://entry/8454420450074947543 2012-01-01T22:24:54+09:00 2014-11-23T23:38:56+09:00 さくっと説明。TrimSliceでWindows共有がマウントできなかったからcifs.koをビルドして使へるやうにするよ。 Trim-Slice のカーネルのソースコードをダウンロードして展開する。 $ wget -O - https://gitorious.org/trimslice-kernel/trimslice-kernel/archive-tarball/trimslice-1.02 | tar zxfv - $ cd trimslice-kernel-trimslice-kernel カーネルのバージョンを合はせる。 $ uname -a Linux trimslice 2.6.… <p>さくっと説明。TrimSliceで<a class="keyword" href="http://d.hatena.ne.jp/keyword/Windows">Windows</a>共有がマウントできなかったからcifs.koをビルドして使へるやうにするよ。</p><p><ol> <li><br /> Trim-Slice の<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%AB%A1%BC%A5%CD%A5%EB">カーネル</a>の<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%BD%A1%BC%A5%B9%A5%B3%A1%BC%A5%C9">ソースコード</a>をダウンロードして展開する。</p> <pre>$ <a class="keyword" href="http://d.hatena.ne.jp/keyword/wget">wget</a> -O - <a href="https://gitorious.org/trimslice-kernel/trimslice-kernel/archive-tarball/trimslice-1.02">https://gitorious.org/trimslice-kernel/trimslice-kernel/archive-tarball/trimslice-1.02</a> | tar zxfv - $ cd trimslice-kernel-trimslice-kernel </pre><p></li></p><p><li><br /> <a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%AB%A1%BC%A5%CD%A5%EB">カーネル</a>のバージョンを合はせる。</p> <pre>$ <a class="keyword" href="http://d.hatena.ne.jp/keyword/uname">uname</a> -a Linux trimslice 2.6.38.3-trimslice-1.01-01643-g47e309c #243 SMP PREEMPT Wed Aug 31 14:23:59 IDT 2011 armv7l armv7l armv7l <a class="keyword" href="http://d.hatena.ne.jp/keyword/GNU/Linux">GNU/Linux</a> $ vi .config CONFIG_LOCALVERSION="-trimslice-1.01-01643-g47e309c" </pre><p></li></p><p><li><br /> 必要なモジュールを適当にビルドする。</p> <pre>$ make CONFIG_CRYPTO_MD4=m crypto/md4.ko $ make CONFIG_CIFS=m fs/cifs/cifs.ko </pre><p></li></p><p><li><br /> モジュールをロードする。</p> <pre>$ sudo insmod crypto/md4.ko $ sudo insmod fs/cifs/cifs.ko </pre><p></li></p><p><li><br /> よくできました。</p> <pre>$ <a class="keyword" href="http://d.hatena.ne.jp/keyword/grep">grep</a> cifs /proc/filesystems nodev cifs </pre><p></li></p><p><li><br /> いえーい。</p> <pre>$ sudo mount -t cifs -o uid=1000 //192.168.0.11/hogehoge /mnt/hogehoge </pre><p></li><br /> </ol></p> kim_upsilon OpenPNE3.7の開発#2 (openpne:installの正体) hatenablog://entry/8454420450074947547 2011-11-25T23:51:15+09:00 2014-11-23T23:38:59+09:00 まず現在の進捗。 [済] 認証以外の全プラグインの非バンドル化 [済] プラグインを外した状態での完全動作 [済] pc_frontend での prototype.js -> jQuery 移行 [済] ノンインタラクティブな openpne:install タスク [予 (来週から)] インストールに必要なプラグイン・コアを纏めたzipアーカイブを作成する [未] コア不必要機能の取り外し [未] パスワードを用ゐない認証機構が使へるやうにする [未] プラグインのバンドル化+2個 (opDiaryPlugin opMessagePlugin) では、「openpne:install とは… <p>まず現在の進捗。</p> <ul> <li>[済] 認証以外の全<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%D7%A5%E9%A5%B0%A5%A4%A5%F3">プラグイン</a>の非バンドル化</li> <li>[済] <a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%D7%A5%E9%A5%B0%A5%A4%A5%F3">プラグイン</a>を外した状態での完全動作</li> <li>[済] pc_frontend での <a class="keyword" href="http://d.hatena.ne.jp/keyword/prototype.js">prototype.js</a> -> <a class="keyword" href="http://d.hatena.ne.jp/keyword/jQuery">jQuery</a> 移行</li> <li>[済] ノン<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%A4%A5%F3%A5%BF%A5%E9%A5%AF%A5%C6%A5%A3%A5%D6">インタラクティブ</a>な <a class="keyword" href="http://d.hatena.ne.jp/keyword/openpne">openpne</a>:install タスク</li> <li>[予 (来週から)] インストールに必要な<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%D7%A5%E9%A5%B0%A5%A4%A5%F3">プラグイン</a>・コアを纏めたzipアーカイブを作成する</li> <li>[未] コア不必要機能の取り外し</li> <li>[未] パスワードを用ゐない認証機構が使へるやうにする</li> <li>[未] <a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%D7%A5%E9%A5%B0%A5%A4%A5%F3">プラグイン</a>のバンドル化+2個 (opDiaryPlugin opMessagePlugin)</li> </ul><p>では、「<a class="keyword" href="http://d.hatena.ne.jp/keyword/openpne">openpne</a>:install とは一体何だったのか」について。</p><p>正直に言ふと、僕は OpenPNE3 のインストールに <a class="keyword" href="http://d.hatena.ne.jp/keyword/openpne">openpne</a>:install タスクを使ってません。自分で config/databases.yml 設定して doctrine:build してゐます (<a href="http://d.hatena.ne.jp/kim_upsilon/20110827/1314460766">&#x53C2;&#x8003;</a>)。<br /> それでは先づ、<a class="keyword" href="http://d.hatena.ne.jp/keyword/openpne">openpne</a>:install とは何をするものなのか。大雑把に書くとこんな感じです。</p> <ol> <li>データベースの設定をユーザに入力させる</li> <li>入力されたデータベースの設定をファイル (config/databases.yml) に書き出す</li> <li>標準でインストールする<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%D7%A5%E9%A5%B0%A5%A4%A5%F3">プラグイン</a><a href="#f-1bc6fbb6" name="fn-1bc6fbb6" title="OpenPNEのウェブサイトでは「バンドルプラグイン」と表記されてゐる。">*1</a>のリストを Web からダウンロードする</li> <li>リストに従って<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%D7%A5%E9%A5%B0%A5%A4%A5%F3">プラグイン</a>をインストールする</li> <li>データベースの構築を行ふ<a href="#f-3b73c659" name="fn-3b73c659" title="この時に事前の予告無くデータベースの中身を全て空にしてしまふ問題がある。WordPressとかMediaWikiとかと一緒のデータベースにインストールしようとすると酷い目に遭ふ。">*2</a></li> <li>キャッシュファイルの削除</li> <li><a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%D7%A5%E9%A5%B0%A5%A4%A5%F3">プラグイン</a>で使はれてゐる画像や <a class="keyword" href="http://d.hatena.ne.jp/keyword/CSS">CSS</a> などの静的なファイルの配置をする</li> </ol><p>この時点で早速「オフラインでインストールできないぢゃん」といふ事が分かります。あとデータベースを勝手に全消去とかなかなかやばいですね。</p><p>で、このインストール行程を他のタスクで置き換へるとかうなります。</p> <ol> <li>vi config/databases.yml</li> <li>./<a class="keyword" href="http://d.hatena.ne.jp/keyword/symfony">symfony</a> opPlugin:sync <ul> <li>./<a class="keyword" href="http://d.hatena.ne.jp/keyword/symfony">symfony</a> opPlugin:install opAuthMailAddressPlugin</li> <li>./<a class="keyword" href="http://d.hatena.ne.jp/keyword/symfony">symfony</a> opPlugin:install opAuthMobileUIDPlugin</li> <li>(<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%D7%A5%E9%A5%B0%A5%A4%A5%F3">プラグイン</a>の数だけ続く)</li> </ul></li> <li>./<a class="keyword" href="http://d.hatena.ne.jp/keyword/symfony">symfony</a> doctrine:build --all --and-load <span class="deco" style="color:red">--no-confirmation</span> <ul> <li>./<a class="keyword" href="http://d.hatena.ne.jp/keyword/symfony">symfony</a> doctrine:drop-db --no-confirmation</li> <li>./<a class="keyword" href="http://d.hatena.ne.jp/keyword/symfony">symfony</a> doctrine:build-db</li> <li>./<a class="keyword" href="http://d.hatena.ne.jp/keyword/symfony">symfony</a> doctrine:build-model</li> <li>./<a class="keyword" href="http://d.hatena.ne.jp/keyword/symfony">symfony</a> doctrine:build-forms</li> <li>./<a class="keyword" href="http://d.hatena.ne.jp/keyword/symfony">symfony</a> doctrine:build-filters</li> <li>./<a class="keyword" href="http://d.hatena.ne.jp/keyword/symfony">symfony</a> doctrine:build-<a class="keyword" href="http://d.hatena.ne.jp/keyword/sql">sql</a></li> <li>./<a class="keyword" href="http://d.hatena.ne.jp/keyword/symfony">symfony</a> doctrine:insert-sql</li> <li>./<a class="keyword" href="http://d.hatena.ne.jp/keyword/symfony">symfony</a> doctrine:data-load</li> </ul></li> <li>./<a class="keyword" href="http://d.hatena.ne.jp/keyword/symfony">symfony</a> cache:clear</li> <li>./<a class="keyword" href="http://d.hatena.ne.jp/keyword/symfony">symfony</a> plugin:publish-assets</li> </ol><p>OpenPNE3.7 では <a class="keyword" href="http://d.hatena.ne.jp/keyword/openpne">openpne</a>:install の対話的な部分(データベース設定の入力を求める部分)を、コマンドオプションを使ってスキップできるやうにします。</p> <div class="footnote"> <p class="footnote"><a href="#fn-1bc6fbb6" name="f-1bc6fbb6" class="footnote-number">*1</a><span class="footnote-delimiter">:</span><span class="footnote-text"><a class="keyword" href="http://d.hatena.ne.jp/keyword/OpenPNE">OpenPNE</a>のウェブサイトでは「バンドル<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%D7%A5%E9%A5%B0%A5%A4%A5%F3">プラグイン</a>」と表記されてゐる。</span></p> <p class="footnote"><a href="#fn-3b73c659" name="f-3b73c659" class="footnote-number">*2</a><span class="footnote-delimiter">:</span><span class="footnote-text">この時に事前の予告無くデータベースの中身を全て空にしてしまふ問題がある。<a class="keyword" href="http://d.hatena.ne.jp/keyword/WordPress">WordPress</a>とか<a class="keyword" href="http://d.hatena.ne.jp/keyword/MediaWiki">MediaWiki</a>とかと一緒のデータベースにインストールしようとすると酷い目に遭ふ。</span></p> </div> kim_upsilon OpenPNE3.7の開発#1 (目標と現在) hatenablog://entry/8454420450074947552 2011-11-15T00:59:46+09:00 2014-11-23T23:38:59+09:00 OpenPNE3.7の開発が始まった。HOUOUのサクセスレベル に書いてある通り、下記のやうなOpenPNE3.7で実現する目標や3.8をリリースする最低限のラインが設定されてゐる。 ミニマムサクセス スピード スピードアップ+15% シンプル 認証以外の全プラグインの非バンドル化 プレーン状態での完全動作 インタラクティブをスキップするインストールオプション コア不必要機能の取り外し(1割削除) スマートフォン基盤対応 招待メール 画像投稿メール キャリアIDを使わない新規登録、クッキー認証 スマートフォン新規 コア機能UI対応(一部画面) コアプラグインスマートフォンUI(一部画面) ほ… <p>OpenPNE3.7の開発が始まった。<a href="http://www.tejimaya.com/20111111houou%E3%81%AE%E3%82%B5%E3%82%AF%E3%82%BB%E3%82%B9%E3%83%AC%E3%83%99%E3%83%AB/">HOUOU&#x306E;&#x30B5;&#x30AF;&#x30BB;&#x30B9;&#x30EC;&#x30D9;&#x30EB;</a> に書いてある通り、下記のやうなOpenPNE3.7で実現する目標や3.8をリリースする最低限のラインが設定されてゐる。</p> <blockquote> <p><dl> <dt>ミニマムサクセス</dt> <dd></p> <ul> <li>スピード <ul> <li>スピードアップ+15%</li> </ul></li> <li>シンプル <ul> <li>認証以外の全<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%D7%A5%E9%A5%B0%A5%A4%A5%F3">プラグイン</a>の非バンドル化</li> <li>プレーン状態での完全動作</li> <li><a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%A4%A5%F3%A5%BF%A5%E9%A5%AF%A5%C6%A5%A3%A5%D6">インタラクティブ</a>をスキップするインストールオプション</li> <li>コア不必要機能の取り外し(1割削除)</li> </ul></li> <li><a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%B9%A5%DE%A1%BC%A5%C8%A5%D5%A5%A9%A5%F3">スマートフォン</a>基盤対応 <ul> <li>招待メール</li> <li>画像投稿メール</li> <li>キャリアIDを使わない新規登録、クッキー認証</li> </ul></li> <li><a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%B9%A5%DE%A1%BC%A5%C8%A5%D5%A5%A9%A5%F3">スマートフォン</a>新規 <ul> <li>コア機能UI対応(一部画面)</li> <li>コア<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%D7%A5%E9%A5%B0%A5%A4%A5%F3">プラグイン</a><a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%B9%A5%DE%A1%BC%A5%C8%A5%D5%A5%A9%A5%F3">スマートフォン</a>UI(一部画面)</li> </ul></li> <li>ほか <ul> <li>フロント画面のprototype => <a class="keyword" href="http://d.hatena.ne.jp/keyword/jQuery">jQuery</a>化(管理画面は除外)</li> <li><a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%D7%A5%E9%A5%B0%A5%A4%A5%F3">プラグイン</a>のバンドル化+2個(opDiaryPlugin opMessagePluginなど)</li> <li>認証<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%D7%A5%E9%A5%B0%A5%A4%A5%F3">プラグイン</a>の見直し、パスワード無しの運用を可能にする<a href="#f-69f636c9" name="fn-69f636c9" title="現行のOpenPNEでは、OpenID等のパスワードが不要なはずの認証方式を用ゐてもOpenPNE側にパスワードの設定が必要となる。参考: [http://twilog.org/kim_upsilon/date-110520:title=@kim_upsilonの2011/05/20のツイート]">*1</a></li> </ul></li> </ul><p></dd><dt>フルサクセス</dt><br /> <dd></p> <ul> <li>スピードアップ+15%</li> <li>エンドユーザー向けキラー<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%D7%A5%E9%A5%B0%A5%A4%A5%F3">プラグイン</a>1つ(<a href="https://github.com/kashiwasan/opTimelinePlugin">opTimeLinePlugin</a>)</li> <li><a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%D7%A5%E9%A5%B0%A5%A4%A5%F3">プラグイン</a>のバンドル化+2個(opCommunityTopicPlugin opTimeLinePlugin)</li> <li>コア不必要機能の取り外し(1割削除)</li> </ul><p></dd><dt>アドバンスドサクセス</dt><br /> <dd></p> <ul> <li>スピードアップ+15%</li> <li><a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%B9%A5%AF%A5%EA%A1%BC%A5%F3%A5%CD%A1%BC%A5%E0">スクリーンネーム</a>、コミュニティ<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%B9%A5%AF%A5%EA%A1%BC%A5%F3%A5%CD%A1%BC%A5%E0">スクリーンネーム</a>をコアに</li> <li><a class="keyword" href="http://d.hatena.ne.jp/keyword/AJAX">AJAX</a>&アプリを見据えた<a class="keyword" href="http://d.hatena.ne.jp/keyword/API">API</a>の見直し</li> <li><a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%D7%A5%E9%A5%B0%A5%A4%A5%F3">プラグイン</a>のバンドル化+2個</li> <li>コア不必要機能の取り外し(<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%D7%A5%E9%A5%B0%A5%A4%A5%F3">プラグイン</a>化)</li> </ul><p></dd></dl></p> </blockquote> <p>さらに、このサクセスレベルで「アドバンスドサクセス」を達成した場合は<a class="keyword" href="http://d.hatena.ne.jp/keyword/OpenPNE">OpenPNE</a><span class="deco" style="font-weight:bold;">4.0</span>をリリースすると宣言してゐる。開発期間は来年(2012年)の4月まで。テスト等の期間を除いた実質開発期間は3ヶ月だ。</p><p>なほ、現在OpenPNE3.7の開発は<a class="keyword" href="http://d.hatena.ne.jp/keyword/GitHub">GitHub</a>の <a class="keyword" href="http://d.hatena.ne.jp/keyword/openpne">openpne</a>/OpenPNE3 <a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%EA%A5%DD%A5%B8%A5%C8%A5%EA">リポジトリ</a>ではなく、 <a href="https://github.com/houou/HOUOU">github.com/houou/HOUOU</a> の <a href="https://github.com/houou/HOUOU/tree/houou">houou&#x30D6;&#x30E9;&#x30F3;&#x30C1;</a> で行はれる予定である。これはあくまで「メンバーがコミットするルールなどに慣れていない」<a href="#f-56d5562b" name="fn-56d5562b" title="https://groups.google.com/d/msg/openpne-dev/IoTnDVSZU3M/TkH9dbZnUukJ">*2</a>といふ<span class="deco" style="font-weight:bold;">一時的な</span>理由のためで、OpenPNE3の<a href="http://redmine.openpne.jp/projects/op3/wiki/Rule_of_Shared_Repository_%28ja%29">&#x5171;&#x6709;&#x30EA;&#x30DD;&#x30B8;&#x30C8;&#x30EA;&#x306E;&#x30EB;&#x30FC;&#x30EB;</a>を身につけた上で <a class="keyword" href="http://d.hatena.ne.jp/keyword/openpne">openpne</a>/OpenPNE3 <a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%EA%A5%DD%A5%B8%A5%C8%A5%EA">リポジトリ</a>で作業するやう積極的に働きかけるべきであると(僕は)考へてゐる。</p><p>ところで、手嶋屋外部の人がOpenPNE3.7の開発に貢献する場合はどうすればいいのか?といふのが気になってゐる。早くも houou/HOUOU <a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%EA%A5%DD%A5%B8%A5%C8%A5%EA">リポジトリ</a>については<a class="keyword" href="http://d.hatena.ne.jp/keyword/OpenPNE">OpenPNE</a>開発者の混乱を招くこととなった。<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%BD%A1%BC%A5%B9%A5%B3%A1%BC%A5%C9">ソースコード</a>だけでなく意志決定やその過程までもが適切に公開できてゐるか?「<a class="keyword" href="http://d.hatena.ne.jp/keyword/OpenPNE">OpenPNE</a>プロジェクトの」開発者が意志決定のプロセスに関はれてゐるだらうか?といふことにはこれからも気を遣ふつもりだ。</p><p>話を戻すと、まづ僕は「認証<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%D7%A5%E9%A5%B0%A5%A4%A5%F3">プラグイン</a>以外のバンドル<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%D7%A5%E9%A5%B0%A5%A4%A5%F3">プラグイン</a>を外す」「<a class="keyword" href="http://d.hatena.ne.jp/keyword/prototype.js">prototype.js</a>を廃止して<a class="keyword" href="http://d.hatena.ne.jp/keyword/jQuery">jQuery</a>へ移行する」から取り掛かる予定。特に2つ目の<a class="keyword" href="http://d.hatena.ne.jp/keyword/jQuery">jQuery</a>移行は<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%B9%A5%DE%A1%BC%A5%C8%A5%D5%A5%A9%A5%F3">スマートフォン</a>対応や <a href="https://github.com/openpne-ospt/opOpenSocialPlugin">opOpenSocialPlugin</a> の <a href="http://redmine.openpne.jp/issues/2068">#2068</a> を解決するためにも重要である。</p><p>そんな訳で、もし気になることがあればMLでも<a class="keyword" href="http://d.hatena.ne.jp/keyword/Twitter">Twitter</a>でもどんどん発言して下さい。ちなみに<a class="keyword" href="http://d.hatena.ne.jp/keyword/Twitter">Twitter</a>では #op3dev 付きのツイートはだいたい見てゐるので<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%CF%A5%C3%A5%B7%A5%E5%A5%BF%A5%B0">ハッシュタグ</a>付けてボソッと発言するだけでも大丈夫です。</p> <div class="footnote"> <p class="footnote"><a href="#fn-69f636c9" name="f-69f636c9" class="footnote-number">*1</a><span class="footnote-delimiter">:</span><span class="footnote-text">現行の<a class="keyword" href="http://d.hatena.ne.jp/keyword/OpenPNE">OpenPNE</a>では、<a class="keyword" href="http://d.hatena.ne.jp/keyword/OpenID">OpenID</a>等のパスワードが不要なはずの認証方式を用ゐても<a class="keyword" href="http://d.hatena.ne.jp/keyword/OpenPNE">OpenPNE</a>側にパスワードの設定が必要となる。参考: <a href="http://twilog.org/kim_upsilon/date-110520">@kim_upsilon&#x306E;2011/05/20&#x306E;&#x30C4;&#x30A4;&#x30FC;&#x30C8;</a></span></p> <p class="footnote"><a href="#fn-56d5562b" name="f-56d5562b" class="footnote-number">*2</a><span class="footnote-delimiter">:</span><span class="footnote-text"><a href="https://groups.google.com/d/msg/openpne-dev/IoTnDVSZU3M/TkH9dbZnUukJ">https://groups.google.com/d/msg/openpne-dev/IoTnDVSZU3M/TkH9dbZnUukJ</a></span></p> </div> kim_upsilon OpenPNE3をlighttpd上で動かしてみる hatenablog://entry/8454420450074947555 2011-08-27T00:59:26+09:00 2014-11-23T23:39:03+09:00 をととひの夜に upsilo.net の HTTP サーバを Apache から lighttpd に置き換へる作業をしてました。別にあれが気になってた訳ぢゃないんですが、まあ気分転換みたいなものです。今回使ふディストリビューションはいつもの Debian GNU/Linux ではなく Ubuntu (oneiric) です。なぜなら upsilo.net のサーバは Ubuntu だからです。1. PHP5 をインストールするなるべく aptitude 使ひますよ。 sudo aptitude install php5-cgi php5-cli php5-gd php5-sqlite php… <p>をととひの夜に upsilo.net の HTTP サーバを <a class="keyword" href="http://d.hatena.ne.jp/keyword/Apache">Apache</a> から <a class="keyword" href="http://d.hatena.ne.jp/keyword/lighttpd">lighttpd</a> に置き換へる作業をしてました。別に<span class="deco" style="font-weight:bold;"><a href="http://sourceforge.jp/magazine/11/08/25/0351236">&#x3042;&#x308C;</a></span>が気になってた訳ぢゃないんですが、まあ気分転換みたいなものです。</p><p>今回使ふ<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%C7%A5%A3%A5%B9%A5%C8%A5%EA%A5%D3%A5%E5%A1%BC%A5%B7%A5%E7%A5%F3">ディストリビューション</a>はいつもの <a class="keyword" href="http://d.hatena.ne.jp/keyword/Debian%20GNU/Linux">Debian GNU/Linux</a> ではなく <a class="keyword" href="http://d.hatena.ne.jp/keyword/Ubuntu">Ubuntu</a> (oneiric) です。なぜなら upsilo.net のサーバは <a class="keyword" href="http://d.hatena.ne.jp/keyword/Ubuntu">Ubuntu</a> だからです。</p><p>1. PHP5 をインストールする</p><p>なるべく <a class="keyword" href="http://d.hatena.ne.jp/keyword/aptitude">aptitude</a> 使ひますよ。</p> <pre class="code lang-sh" data-lang="sh" data-unlink>sudo aptitude <span class="synStatement">install</span> php5-cgi php5-cli php5-gd php5-sqlite php-apc </pre><p>2. OpenPNE3 をダウンロード・設定する</p><p>まあこの辺は適当にさくっと。数十回ほどインストール作業すれば慣れます。</p> <pre class="code lang-sh" data-lang="sh" data-unlink><span class="synStatement">cd</span> /usr/<span class="synStatement">local</span>/share/ git clone git://github.com/openpne/OpenPNE3.git openpne3 <span class="synStatement">cd</span> openpne3 cp config/ProjectConfiguration.class.php<span class="synSpecial">{</span>.sample,<span class="synSpecial">}</span> cp config/OpenPNE.yml<span class="synSpecial">{</span>.sample,<span class="synSpecial">}</span> </pre><p>3. <a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%D7%A5%E9%A5%B0%A5%A4%A5%F3">プラグイン</a>とか入れまくる</p><p>git とかよく知らない人はこの手順ではなく他のブログ記事見ながら ./<a class="keyword" href="http://d.hatena.ne.jp/keyword/symfony">symfony</a> <a class="keyword" href="http://d.hatena.ne.jp/keyword/openpne">openpne</a>:install を使った方がいいです。</p> <pre class="code lang-sh" data-lang="sh" data-unlink><span class="synStatement">cd</span> /usr/<span class="synStatement">local</span>/share/openpne3/plugins git clone git://github.com/ebihara/opAuthMailAddressPlugin.git git clone git://github.com/balibali/opDiaryPlugin.git git clone git://github.com/tejimaya/opCommunityTopicPlugin.git git clone git://github.com/tejimaya/opAshiatoPlugin.git git clone git://github.com/martini2002jp/opMessagePlugin.git git clone git://github.com/openpne-ospt/opAlbumPlugin.git git clone git://github.com/nothan/opRankingPlugin.git git clone git://github.com/ShinichiU/opCalendarPlugin.git git clone git://github.com/kawahara/opPointPlugin.git <span class="synStatement">cd</span> ../ ./symfony openpne:permission ./symfony plugin:publish-asset </pre><p>4. データベースの設定をする</p><p><a class="keyword" href="http://d.hatena.ne.jp/keyword/MySQL">MySQL</a> めんどい。<a class="keyword" href="http://d.hatena.ne.jp/keyword/SQLite">SQLite</a> 知らない人はこの手順ではなく(以下略</p> <pre class="code lang-sh" data-lang="sh" data-unlink><span class="synStatement">cd</span> /usr/<span class="synStatement">local</span>/share/openpne3/ <span class="synStatement">mkdir</span> /var/<span class="synStatement">local</span>/dbfiles cat <span class="synStatement">&gt;</span> config/databases.yml <span class="synStatement">&lt;&lt;EOF</span> <span class="synConstant">all:</span> <span class="synConstant"> doctrine:</span> <span class="synConstant"> class: sfDoctrineDatabase</span> <span class="synConstant"> param:</span> <span class="synConstant"> dsn: 'sqlite:/var/local/dbfiles/openpne3.sqlite'</span> <span class="synConstant"> username: ~</span> <span class="synConstant"> password: ~</span> <span class="synConstant"> encoding: utf8</span> <span class="synConstant"> profiler: false</span> <span class="synStatement">EOF</span> ./symfony doctrine:build <span class="synSpecial">--all</span> <span class="synSpecial">--and-load</span> chgrp <span class="synSpecial">-R</span> www-data /var/<span class="synStatement">local</span>/dbfiles <span class="synStatement">chmod</span> <span class="synSpecial">-R</span> g+w /var/<span class="synStatement">local</span>/dbfiles </pre><p>5. <a class="keyword" href="http://d.hatena.ne.jp/keyword/lighttpd">lighttpd</a> のインストール・設定をする</p><p>設定に <a href="http://redmine.lighttpd.net/wiki/1/Docs:ModRewrite#urlrewrite-repeat-if-not-file">url.rewrite-if-not-file</a> が必要なので <a class="keyword" href="http://d.hatena.ne.jp/keyword/lighttpd">lighttpd</a> のバージョンは 1.4.24 以上が必須。</p> <pre class="code lang-sh" data-lang="sh" data-unlink>sudo aptitude <span class="synStatement">install</span> lighttpd ln <span class="synSpecial">-s</span> /usr/<span class="synStatement">local</span>/share/openpne3/web /var/www/openpne3 sudo tee /etc/lighttpd/conf-available/<span class="synConstant">90</span>-openpne3.conf <span class="synStatement">&lt;&lt;EOF</span> <span class="synConstant">server.modules += (&quot;mod_rewrite&quot;)</span> <span class="synConstant">url.rewrite-if-not-file += (</span> <span class="synConstant"> &quot;^/openpne3/[^/]+\.php/.*$&quot; =&gt; &quot;</span><span class="synPreProc">$0</span><span class="synConstant">&quot;,</span> <span class="synConstant"> &quot;^/openpne3/(.+)$&quot; =&gt; &quot;/openpne3/index.php/</span><span class="synPreProc">$1</span><span class="synConstant">&quot;</span> <span class="synConstant">)</span> <span class="synStatement">EOF</span> sudo lighttpd-<span class="synStatement">enable</span>-mod fastcgi fastcgi-php openpne3 sudo /etc/init.d/lighttpd force-<span class="synStatement">reload</span> </pre><p>6. ブラウザで見てみる</p><p>どうかなどうかな。</p> <pre><a href="http://localhost/openpne3/">http://localhost/openpne3/</a> </pre> kim_upsilon opKdtPluginで大量のテスト用データを生成したときの覚え書き hatenablog://entry/8454420450074947572 2011-07-09T01:52:40+09:00 2014-11-23T23:39:06+09:00 めもめも。まず、そもそもどういふ状況の話かといふと「テスト用にメンバー情報を300,000件用意するのでopKdtPluginで生成しまくる」といふやうな感じです。とりあへず、これをそのまま $ ./symfony opKdt:generate-member --number=300000 とか実行しようとしてもダメなのです。メモリ食ひまくって自滅します。生成する件数が少ないときは数千件ごとに分けて実行すればいいですが、今回はさすがにその方法は面倒なので却下。で、このメモリリークの原因を調べたところ、↓の2つだった。どちらも件数が増えるごとにメモリ使用量が右肩上がり。 sfDoctrineCo… <p>めもめも。</p><p>まず、そもそもどういふ状況の話かといふと「テスト用にメンバー情報を300,000件用意するので<a href="https://github.com/kawahara/opKdtPlugin">opKdtPlugin</a>で生成しまくる」といふやうな感じです。</p><p>とりあへず、これをそのまま</p> <pre>$ ./<a class="keyword" href="http://d.hatena.ne.jp/keyword/symfony">symfony</a> opKdt:generate-member --number=300000 </pre><p>とか実行しようとしてもダメなのです。メモリ食ひまくって自滅します。生成する件数が少ないときは数千件ごとに分けて実行すればいいですが、今回はさすがにその方法は面倒なので却下。</p><p>で、この<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%E1%A5%E2%A5%EA%A5%EA%A1%BC%A5%AF">メモリリーク</a>の原因を調べたところ、↓の2つだった。どちらも件数が増えるごとにメモリ使用量が右肩上がり。</p> <ul> <li>sfDoctrineConnectionProfiler (sfDoctrinePluginでデフォルト有効。今回は要らない)</li> <li>MemberConfigTable (自前でモデルをキャッシュしようとして参照握りっぱなし)</li> </ul><p>んで、原因が分かった所でどこを修正するか。まずプロファイラは使用しないので config/databases.yml をサクッと修正。これでプロファイラは使用されなくなる。</p> <pre class="code lang-yaml" data-lang="yaml" data-unlink><span class="synIdentifier">all</span><span class="synSpecial">:</span> <span class="synIdentifier">doctrine</span><span class="synSpecial">:</span> <span class="synIdentifier">class</span><span class="synSpecial">:</span> sfDoctrineDatabase <span class="synIdentifier">param</span><span class="synSpecial">:</span> <span class="synIdentifier">dsn</span><span class="synSpecial">:</span> <span class="synConstant">'mysql:dbname=hogehoge;host=localhost'</span> <span class="synIdentifier">username</span><span class="synSpecial">:</span> root <span class="synIdentifier">encoding</span><span class="synSpecial">:</span> utf8 <span class="synIdentifier">attributes</span><span class="synSpecial">:</span> <span class="synSpecial">{</span> <span class="synIdentifier">164</span><span class="synSpecial">:</span> <span class="synConstant">true</span> <span class="synSpecial">}</span> <span class="synIdentifier">profiler</span><span class="synSpecial">:</span> <span class="synConstant">false</span> <span class="synComment"> # ←ここ!</span> </pre><p>この方法はopKdtPlugin以外でも opOpenSocial:execute-lifecycle-event などの大量のレコードを処理するタスクでもかなり効果があります。たぶん。</p><p>次は MemberConfigTable。OpenPNE3 Core側を修正するのは面倒なので今回はパス。修正内容は下記URLを参照して下さい。</p><p><a href="https://github.com/kawahara/opKdtPlugin/commit/ab4ea10">https://github.com/kawahara/opKdtPlugin/commit/ab4ea10</a></p><br /> <br /> <p>・・・かうして、心置きなく大量のダミーデータを生成することができるやうになった。</p><p>ちなみに修正後は、生成するデータ件数に関はらずピーク時のメモリ使用量が 33MB ほどになりました。修正前は 2,000 件生成で 184MB くらゐ使ってゐた (しかも件数とともに増加) のでかなりの改善。よかったよかった。</p> kim_upsilon モテる商業高校系女子力を磨くための4つの心得「減価償却ができない女をアピールせよ」等 hatenablog://entry/8454420450074947576 2011-05-24T00:24:35+09:00 2014-11-23T23:39:08+09:00 元ネタ: モテる女子力を磨くための4つの心得「オムライスを食べられない女をアピールせよ」等 – Be Wise Be Happy Pouch[ポーチ] 1. あえて簿記の授業に算盤(そろばん)を持って行くあえて簿記の授業には算盤を使うようにしましょう。そして教室で好みの男がいたら話しかけ、わざとらしく算盤を出していじってみましょう。そして「あ〜ん! この算盤、本当にマジでチョー湿気ってるんですけどぉぉお〜!」と言って、男に「どうしたの?」と言わせましょう。言わせたらもう大成功。「電卓とか詳しくなくてぇ〜! ずっとコレ使ってるんですけどぉ〜! 使いにくいんですぅ〜! ぷんぷくり〜ん(怒)」と言い… <p><span class="deco" style="font-weight:bold; color:red">元ネタ</span>: <a href="http://youpouch.com/2011/04/26/162331/">&#x30E2;&#x30C6;&#x308B;&#x5973;&#x5B50;&#x529B;&#x3092;&#x78E8;&#x304F;&#x305F;&#x3081;&#x306E;4&#x3064;&#x306E;&#x5FC3;&#x5F97;&#x300C;&#x30AA;&#x30E0;&#x30E9;&#x30A4;&#x30B9;&#x3092;&#x98DF;&#x3079;&#x3089;&#x308C;&#x306A;&#x3044;&#x5973;&#x3092;&#x30A2;&#x30D4;&#x30FC;&#x30EB;&#x305B;&#x3088;&#x300D;&#x7B49; &ndash; Be Wise Be Happy Pouch&#xFF3B;&#x30DD;&#x30FC;&#x30C1;&#xFF3D;</a></p><br /> <p><h3>1. あえて簿記の授業に<ruby><rb>算盤</rb><rp>(</rp><rt>そろばん</rt><rp>)</rp></ruby>を持って行く</h3>あえて簿記の授業には算盤を使うようにしましょう。そして教室で好みの男がいたら話しかけ、わざとらしく算盤を出していじってみましょう。そして「あ〜ん! この算盤、本当にマジでチョー湿気ってるんですけどぉぉお〜!」と言って、男に「どうしたの?」と言わせましょう。言わせたらもう大成功。「電卓とか詳しくなくてぇ〜! ずっとコレ使ってるんですけどぉ〜! 使いにくいんですぅ〜! ぷんぷくり〜ん(怒)」と言いましょう。だいたいの男は税計算機能付きの12桁電卓を持ちたがる習性があるので、違ったとしてもまず算盤は持ち歩いていないはずです。</p><p>そこで男が「電卓は使わないの?」と言ってくるはず(言ってこない空気が読めない男はその時点で仕訳不要)。そう言われたらあなたは「なんかなんかぁ〜! みんな<a class="keyword" href="http://d.hatena.ne.jp/keyword/%B4%D8%BF%F4%C5%C5%C2%EE">関数電卓</a>使ってるんでしょー!? あれってどうなんですかぁ? 新しいの欲しいんですけどわかんなぁぁああい!! 私かわいそーなコ★」と返します。すると男は「普通の電卓でしょ? <a class="keyword" href="http://d.hatena.ne.jp/keyword/%B4%D8%BF%F4%C5%C5%C2%EE">関数電卓</a>は打ちにくいよ。本当に良くわからないみたいだね。どんなのが欲しいの?」という話になって、次の休みの日にふたりで電卓選びのデートに行けるというわけです。あなたの女子力が高ければ、男が電卓買ってくれるかも!?<br />  <h3>2. お小遣い帳に<a class="keyword" href="http://d.hatena.ne.jp/keyword/%CA%A3%BC%B0%CA%ED%B5%AD">複式簿記</a>を使うとモテる</h3>「借方!」とか「貸方!」とかで表現する「<a class="keyword" href="http://d.hatena.ne.jp/keyword/%CA%A3%BC%B0%CA%ED%B5%AD">複式簿記</a>」で自分のお小遣い帳を付けると、商業高校の男子生徒は「なんかこの子カワイイなぁ」や「支えてあげたいかも」と思ってくれます。帳簿上では現実世界よりもイメージが増幅されて相手に伝わるので「<a class="keyword" href="http://d.hatena.ne.jp/keyword/%CA%A3%BC%B0%CA%ED%B5%AD">複式簿記</a>」を活用することによって、男性はあなたの財務体質を堅実で透明性があると評価してくれるのです。お小遣い帳を<a class="keyword" href="http://d.hatena.ne.jp/keyword/%CA%A3%BC%B0%CA%ED%B5%AD">複式簿記</a>にするとほぼ確実に費用勘定の使い方に困りますが適当に記帳しておきましょう。<br />  <h3>3. とりあえず男には「えー! なにそれ!? 知りたい知りたーい♪」と言っておく</h3>行事の打ち上げなどで男が女性に話すことといえば自慢話や趣味の話ばかり。よって、女性にとってどうでもいい話ばかりです。でもそこで適当に「へぇーそうなんですかぁ〜?」とか「よくわかんないですけど貸借が逆ですよねぇ」と返してしまうと、さすがの男も「この女ダメだな」と気がついてしまいます。勘定の合わない女だとバレたら終わりです。そこはテンションを水増しして、「えー! なにそれ!? 知りたい知りたーい♪」と言っておくのが正解。たとえ重要性の乏しい話題でも、テンションと積極性でその場を乗り切りましょう。積極的に話を聞いてくれる女性に男は弱いのです。</p><p>いろいろと話を聞いたあと、「借方は〇〇で、貸方が〇〇なんですね! 覚えたぞぉ! メモメモ!」とコメントすればパーフェクト。続けて頭に指をさしてくるくる回しつつ「キュンキュンキュン! キュンキュンキュン!」と言って、「どうしたの?」と男に言わせるのもアリ。そこで「私の特殊仕訳帳に記帳しているのでありますっ☆」と言えば女子力アップ! そこでまた男は「この子おもしろくてカワイイかも!?」と思ってくれます。私は学歴も知識もありませんし特殊仕訳帳とかまだ習っていませんが、こういうテクニックを使えば知識がない私のようなバカ女のほうがモテたりするのです。男は優越感に浸りたいですからね。<br />  <h3>4. 検定勉強では<a class="keyword" href="http://d.hatena.ne.jp/keyword/%B8%BA%B2%C1%BD%FE%B5%D1">減価償却</a>ができない女をアピールせよ</h3>簿記検定の勉強を始めたら、真っ先に<a class="keyword" href="http://d.hatena.ne.jp/keyword/%B8%BA%B2%C1%BD%FE%B5%D1">減価償却</a>費の計算を含む仕訳問題を探して「あーん! 私これ計算できないんですよねぇ〜(悲)」と言いましょう。するとほぼ100パーセント「どうして? 苦手なの?」と聞かれるので、「苦手じゃないし解きたいけど解けないんですっ><」と返答しましょう。ここでまた100パーセント「苦手じゃないのにどうして解けないの?」と聞かれるので、うつむいて3〜5秒ほど間をおいてからボソッとこう言います。「……だって、……だって、<a class="keyword" href="http://d.hatena.ne.jp/keyword/%B8%BA%B2%C1%BD%FE%B5%D1">減価償却</a>したら固定資産の価値が落ちちゃうじゃないですかぁっ! 商品棚とか社用車とかかわいそうですぅ! まだ使えるのにぃぃ〜(悲)。9割も安く見積もられるんですよ……」と身を震わせて言うのです。</p><p>その瞬間、あなたの女子力がアップします。きっと男は「なんて優しい天使のようなコなんだろう! 絶対にゲットしてやるぞ! コイツは俺の女だ!」と心のなかで誓い、あなたに惚れ込むはずです。意中の男と付き合うことになったら、そんなことは忘れて好きなだけ<a class="keyword" href="http://d.hatena.ne.jp/keyword/%B8%BA%B2%C1%BD%FE%B5%D1">減価償却</a>して大丈夫です。「解けないじゃなかったっけ?」と言われたら「大丈夫になった」とか「慣れた」、「中古屋に売ったら10%にもならない」と言っておけばOKです。</p><br /> <br /> <br /> <p>・・・早くも<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%AA%A5%EF%A5%B3%A5%F3">オワコン</a>な雰囲気のネタだけど気にしない。<br /> <br /> </p> <dl> <dt> 元ネタ </dt> <dd> <a href="http://youpouch.com/2011/04/26/162331/">&#x30E2;&#x30C6;&#x308B;&#x5973;&#x5B50;&#x529B;&#x3092;&#x78E8;&#x304F;&#x305F;&#x3081;&#x306E;4&#x3064;&#x306E;&#x5FC3;&#x5F97;&#x300C;&#x30AA;&#x30E0;&#x30E9;&#x30A4;&#x30B9;&#x3092;&#x98DF;&#x3079;&#x3089;&#x308C;&#x306A;&#x3044;&#x5973;&#x3092;&#x30A2;&#x30D4;&#x30FC;&#x30EB;&#x305B;&#x3088;&#x300D;&#x7B49; &ndash; Be Wise Be Happy Pouch&#xFF3B;&#x30DD;&#x30FC;&#x30C1;&#xFF3D;</a></dd> <dt> 関連記事 </dt> <dd> <a href="http://ameblo.jp/takkuya84/entry-10886580595.html">&#x30E2;&#x30C6;&#x308B;&#x4F1A;&#x8A08;&#x7CFB;&#x5973;&#x5B50;&#x529B;&#x3092;&#x78E8;&#x304F;&#x305F;&#x3081;&#x306E;4&#x3064;&#x306E;&#x5FC3;&#x5F97;~&#x96FB;&#x5353;&#x306E;&#x6253;&#x3066;&#x306A;&#x3044;&#x5973;&#x3092;&#x30A2;&#x30D4;&#x30FC;&#x30EB;&#x305B;&#x3088;</a></dd> </dl> kim_upsilon 情報処理技術者試験の過去問題をNetWalkerにそれっぽく表示させてみた hatenablog://entry/8454420450074947581 2010-10-18T19:02:38+09:00 2014-11-23T23:39:10+09:00 10/17(日)に実施された情報処理技術者試験の問題が公開されているのでさっそく見てみたところ、やっぱり重い。いつものことですが*1。 で、このPDFをNetWalkerに入れて外出先でも見られるようにしたかったのですが、NetWalkerで過去問PDFを開くとページを切り替える度に「読み込み中...」の表示で止まる。NetWalkerに入っているevinceというPDFビューアはAdobe Readerのようにフルスクリーン表示や回転表示ができるので、左に90度回転した状態でフルスクリーンにすると画面に合わせて目一杯の大きさに表示されます。しかし何度も言いますが重いです。ここから本題。 情報… <p>10/17(日)に実施された<a class="keyword" href="http://d.hatena.ne.jp/keyword/%BE%F0%CA%F3%BD%E8%CD%FD%B5%BB%BD%D1%BC%D4%BB%EE%B8%B3">情報処理技術者試験</a>の問題が<a href="http://www.jitec.jp/1_04hanni_sukiru/mondai_kaitou_2010h22.html">&#x516C;&#x958B;&#x3055;&#x308C;&#x3066;&#x3044;&#x308B;</a>のでさっそく見てみたところ、やっぱり<span style="color:#FF0000">重い</span>。いつものことですが<a href="#f-f008b811" name="fn-f008b811" title="各ページに4,300x6,100pxぐらいの大きさの画像がベタッと貼り付けられているのだから当然重い">*1</a>。<br /> で、このPDFを<a class="keyword" href="http://d.hatena.ne.jp/keyword/NetWalker">NetWalker</a>に入れて外出先でも見られるようにしたかったのですが、<a class="keyword" href="http://d.hatena.ne.jp/keyword/NetWalker">NetWalker</a>で過去問PDFを開くとページを切り替える度に「読み込み中...」の表示で止まる。</p><p><a class="keyword" href="http://d.hatena.ne.jp/keyword/NetWalker">NetWalker</a>に入っているevinceというPDFビューアは<a class="keyword" href="http://d.hatena.ne.jp/keyword/Adobe%20Reader">Adobe Reader</a>のようにフルスクリーン表示や回転表示ができるので、左に90度回転した状態でフルスクリーンにすると画面に合わせて目一杯の大きさに表示されます。しかし何度も言いますが重いです。</p><p>ここから本題。<br /> <a class="keyword" href="http://d.hatena.ne.jp/keyword/%BE%F0%CA%F3%BD%E8%CD%FD%B5%BB%BD%D1%BC%D4%BB%EE%B8%B3">情報処理技術者試験</a>の過去問題PDFを<a class="keyword" href="http://d.hatena.ne.jp/keyword/NetWalker">NetWalker</a>で表示しやすい状態に加工します。</p><p>やりたいことは、</p> <ol> <li>PDFから画像を取り出したい</li> <li>取りだした画像を縮小・回転したい</li> <li>修正した画像を閲覧しやすい形式にまとめたい</li> </ol><p>の3つです。</p><p>最後の「修正した画像を閲覧しやすい形式にまとめたい」は、もう一度PDF形式に戻せば実現できそうですが、<br /> <a href="http://d.hatena.ne.jp/itiri/20080626/1214485037">Evince&#x3067;zip&#x66F8;&#x5EAB;&#x5185;&#x90E8;&#x306E;&#x753B;&#x50CF;&#x30D5;&#x30A1;&#x30A4;&#x30EB;&#x3092;&#x95B2;&#x89A7;&#x3059;&#x308B; - Sickly Life &#x306F;&#x3066;&#x306A;&#x7248;</a><br /> に書いてあるとおり、画像を格納したZIPファイルの<a class="keyword" href="http://d.hatena.ne.jp/keyword/%B3%C8%C4%A5%BB%D2">拡張子</a>をCBZに変えればそのままevinceで閲覧することができます。PDFにするより楽なのでこの方法を使います。</p><br /> <p>…完成した<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%B9%A5%AF%A5%EA%A5%D7%A5%C8">スクリプト</a>はこちらです。<br /> <a href="http://gist.github.com/631946">gist: 631946 - &#x60C5;&#x5831;&#x51E6;&#x7406;&#x6280;&#x8853;&#x8005;&#x8A66;&#x9A13;&#x306E;&#x904E;&#x53BB;&#x554F;PDF&#x3092;CBZ&#x306B;&#x5909;&#x63DB;&#x3059;&#x308B;&#x30B9;&#x30AF;&#x30EA;&#x30D7;&#x30C8;- GitHub</a></p><br /> <p>説明が長くなりそうな気がしたので省略。この<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%B9%A5%AF%A5%EA%A5%D7%A5%C8">スクリプト</a>を実行するためには popplar-utils パッケージ内の pdfimages と <a class="keyword" href="http://d.hatena.ne.jp/keyword/imagemagick">imagemagick</a> パッケージ内の convert が必要なのでご注意下さい。</p><p>で、<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%B9%A5%AF%A5%EA%A5%D7%A5%C8">スクリプト</a>を実行して変換が終わるまで数時間(!)待って完成したCBZファイルをevinceで開くとこのようになります。(プレゼンテーション表示時)<br /> <span itemscope itemtype="http://schema.org/Photograph"><a href="http://f.hatena.ne.jp/kim_upsilon/20101018175202" class="hatena-fotolife" itemprop="url"><img src="http://cdn-ak.f.st-hatena.com/images/fotolife/k/kim_upsilon/20101018/20101018175202.jpg" alt="f:id:kim_upsilon:20101018175202j:image:left:w320" title="f:id:kim_upsilon:20101018175202j:image:left:w320" class="hatena-fotolife hatena-image-left" style="width:320px" itemprop="image"></a></span><br /> <span itemscope itemtype="http://schema.org/Photograph"><a href="http://f.hatena.ne.jp/kim_upsilon/20101018175203" class="hatena-fotolife" itemprop="url"><img src="http://cdn-ak.f.st-hatena.com/images/fotolife/k/kim_upsilon/20101018/20101018175203.jpg" alt="f:id:kim_upsilon:20101018175203j:image:left:w320" title="f:id:kim_upsilon:20101018175203j:image:left:w320" class="hatena-fotolife hatena-image-left" style="width:320px" itemprop="image"></a></span><br /> <br style="clear: both" /></p> <div class="footnote"> <p class="footnote"><a href="#fn-f008b811" name="f-f008b811" class="footnote-number">*1</a><span class="footnote-delimiter">:</span><span class="footnote-text">各ページに4,300x6,100pxぐらいの大きさの画像がベタッと貼り付けられているのだから当然重い</span></p> </div> kim_upsilon Twitter の User Streams を眺めてみた hatenablog://entry/8454420450074947586 2010-09-01T06:05:11+09:00 2014-11-23T23:39:11+09:00 更新: User StreamsのURLが変わったので修正しました。 TwitterのAPI Documentationを眺めてゐたらStreaming APIとやらが気になった。Streamingと聞くと何もしなくても勝手に流れてきさうなイメージがあるのですが、まさにその通りで数分おきにいちいちAPIを叩かなくてもtweetが流れてきます。で、さうなるとやってみたくなるのがhome_timelineの取得。 現在ベータ版の機能としてUser StreamsというAPIが提供されており、home_timelineに相当するデータが容赦なく流れてきます。home_timelineと違ふところは、… <p><span style="color:#FF0000;">更新</span>: User StreamsのURLが変わったので修正しました。</p><br /> <p><a class="keyword" href="http://d.hatena.ne.jp/keyword/Twitter">Twitter</a>の<a href="http://dev.twitter.com/doc">API Documentation</a>を眺めてゐたらStreaming <a class="keyword" href="http://d.hatena.ne.jp/keyword/API">API</a>とやらが気になった。</p><p>Streamingと聞くと何もしなくても勝手に流れてきさうなイメージがあるのですが、まさにその通りで数分おきにいちいち<a class="keyword" href="http://d.hatena.ne.jp/keyword/API">API</a>を叩かなくても<a class="keyword" href="http://d.hatena.ne.jp/keyword/tweet">tweet</a>が流れてきます。</p><p>で、さうなるとやってみたくなるのがhome_timelineの取得。<br /> 現在ベータ版の機能としてUser Streamsという<a class="keyword" href="http://d.hatena.ne.jp/keyword/API">API</a>が提供されており、home_timelineに相当するデータが容赦なく流れてきます。home_timelineと違ふところは、<a class="keyword" href="http://d.hatena.ne.jp/keyword/tweet">tweet</a>だけでなくfavoriteやfollowなどの情報までリアルタイムに流れてくることです。</p><br /> <p>早速この<a class="keyword" href="http://d.hatena.ne.jp/keyword/API">API</a>を使ってみようとググってみると、認証で<a class="keyword" href="http://d.hatena.ne.jp/keyword/BASIC%C7%A7%BE%DA">BASIC認証</a>を使ってゐる記事ばかりでがっかり<a href="#f-ceb8ce21" name="fn-ceb8ce21" title="「えーマジ Basic Auth !?」「キモーイ」 この記事を書いた時点(9/1)で既にBasic Authは廃止されてゐます。Streaming APIはどうなのか知らないけど。">*1</a>。</p><p>ただ、OAuthが使へないといふわけではないので<br /> <a href="http://d.hatena.ne.jp/mizchi/20100704/1278195438">ChirpUserStream&#x304C;Oauth&#x8A8D;&#x8A3C;&#x3067;&#x4F7F;&#x3048;&#x305F;&#x308A;&#x672A;&#x3060;&#x306B;delete&#x30A4;&#x30D9;&#x30F3;&#x30C8;&#x304C;&#x6D41;&#x308C;&#x3066;&#x304D;&#x305F;&#x308A;&#x3059;&#x308B;&#x4EF6;</a><br /> を参考に<a class="keyword" href="http://d.hatena.ne.jp/keyword/OAuth%C7%A7%BE%DA">OAuth認証</a>で使用してみました。</p><p>上記の記事の<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%BD%A1%BC%A5%B9%A5%B3%A1%BC%A5%C9">ソースコード</a>はGistで公開されてゐる(<a href="http://gist.github.com/462891">gist: 462891 - GitHub</a>)ので、forkして自分用に弄ったものも公開しました(<a href="http://gist.github.com/550448">gist: 550448 - GitHub</a>)。<br /> 変更した所は出力に色つけたり<a class="keyword" href="http://d.hatena.ne.jp/keyword/https">https</a>使ふやうにしたくらゐなので、処理はほとんど変はってゐません。<br /> 詳しく説明する必要はなささうですが、OAuthに必要なtokenは各自で念力とかで取得してください。権限はreadonlyで十分です。</p><br /> <p>これでUser Streamsを眺める環境が整ったのですが、普段40秒間隔でTLを更新してゐるやうな人だとあまり更新が速くは見えないかもしれません。<br /> それだと面白くないといふ人は、下記のやうに修正してみると幸せになれるかも。</p> <pre class="code lang-diff" data-lang="diff" data-unlink><span class="synStatement">58a59</span> <span class="synIdentifier">&gt; params[&quot;replies&quot;] = &quot;all&quot;</span> <span class="synStatement">60c61</span> <span class="synSpecial">&lt; sig = make_signature(params, chirp_url, &quot;GET&quot;, csecret, atoken_secret)</span> <span class="synStatement">---</span> <span class="synIdentifier">&gt; sig = make_signature(params, chirp_url, &quot;POST&quot;, csecret, atoken_secret)</span> <span class="synStatement">61a63</span> <span class="synIdentifier">&gt; del params[&quot;replies&quot;]</span> <span class="synStatement">63a66</span> <span class="synIdentifier">&gt; req.add_data(&quot;replies=all&quot;)</span> </pre><p>勘のいい人は予想が付くかもしれませんが、こんな感じでパラメータにreplies=allを付けると「普段は表示されないリプライ」まで表示されるやうになります。乗り物酔いを起こしたら元に戻しませう。</p><p>あるいはfavoriteやfollowなどのイベントだけ表示させておくのも便利かもしれません。これは56, 57行目を<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%B3%A5%E1%A5%F3%A5%C8%A5%A2%A5%A6%A5%C8">コメントアウト</a>するだけで済みます。</p> <div class="footnote"> <p class="footnote"><a href="#fn-ceb8ce21" name="f-ceb8ce21" class="footnote-number">*1</a><span class="footnote-delimiter">:</span><span class="footnote-text">「えーマジ <a class="keyword" href="http://d.hatena.ne.jp/keyword/Basic">Basic</a> Auth !?」「キモーイ」 この記事を書いた時点(9/1)で既に<a class="keyword" href="http://d.hatena.ne.jp/keyword/Basic">Basic</a> Authは廃止されてゐます。Streaming <a class="keyword" href="http://d.hatena.ne.jp/keyword/API">API</a>はどうなのか知らないけど。</span></p> </div> kim_upsilon ATOKユーザー辞書のデータをAnthyに入れてみた hatenablog://entry/8454420450074947591 2010-01-03T19:40:49+09:00 2014-11-23T23:39:13+09:00 「東方ATOK的なもの」をAnthy用の辞書に変換して使ってみました。以下、手順 1. http://www.geocities.jp/nagi_tindalos/DIC/Toho/Toho.html からATOK版「メイン辞書」「スペルカード」「旧作・幺樂団」の3つを入手2. くっつけます $ cat th-atok_ver5.1a.txt th-atok_spell_ver5.1a.txt th-atok_oldmusic_ver2.0c.txt > th-atok.txt3. 文字コードをUTF-8に、改行コードをLFに変換します。ついでにコメント行と空行も削ってしまひませう $ nkf… <p><a href="http://www.geocities.jp/nagi_tindalos/DIC/Toho/Toho.html">&#x300C;&#x6771;&#x65B9;ATOK&#x7684;&#x306A;&#x3082;&#x306E;&#x300D;</a>を<a class="keyword" href="http://d.hatena.ne.jp/keyword/Anthy">Anthy</a>用の辞書に変換して使ってみました。</p><p>以下、手順<br /> 1. <a href="http://www.geocities.jp/nagi_tindalos/DIC/Toho/Toho.html">http://www.geocities.jp/nagi_tindalos/DIC/Toho/Toho.html</a> から<a class="keyword" href="http://d.hatena.ne.jp/keyword/ATOK">ATOK</a>版「メイン辞書」「スペルカード」「旧作・幺樂団」の3つを入手</p><p>2. くっつけます</p> <pre class="code" data-lang="" data-unlink>$ cat th-atok_ver5.1a.txt th-atok_spell_ver5.1a.txt th-atok_oldmusic_ver2.0c.txt &gt; th-atok.txt</pre><p>3. <a class="keyword" href="http://d.hatena.ne.jp/keyword/%CA%B8%BB%FA%A5%B3%A1%BC%A5%C9">文字コード</a>を<a class="keyword" href="http://d.hatena.ne.jp/keyword/UTF-8">UTF-8</a>に、改行コードをLFに変換します。ついでにコメント行と空行も削ってしまひませう</p> <pre class="code" data-lang="" data-unlink>$ nkf -w --overwrite th-atok.txt $ sed -i -e &#39;s/\r//&#39; th-atok.txt $ sed -i -e &#39;s/^!.*$//&#39; -e &#39;/^$//d&#39; th-atok.txt</pre><p>4. 次に<a href="http://smdn.invisiblefulmoon.net/programming/tips/atokdictoanthy/">ATOK&#x30E6;&#x30FC;&#x30B6;&#x8F9E;&#x66F8;&#x3092;Anthy&#x306E;&#x500B;&#x4EBA;&#x8F9E;&#x66F8;&#x5F62;&#x5F0F;&#x306B;&#x5909;&#x63DB;&#x3059;&#x308B;</a> の「辞書を<a class="keyword" href="http://d.hatena.ne.jp/keyword/Anthy">Anthy</a>のフォーマットに変換する」にある<a class="keyword" href="http://d.hatena.ne.jp/keyword/perl">perl</a>の<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%B9%A5%AF%A5%EA%A5%D7%A5%C8">スクリプト</a>を使ひます<br /> ただし、この<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%B9%A5%AF%A5%EA%A5%D7%A5%C8">スクリプト</a>をそのまま使ふと、同じ読みの単語が消されてしまひ「@こうまきょう」のやうな変換が壊滅的なことになるので修正します。<br /> 例えばこんな感じ。</p> <pre class="code lang-perl" data-lang="perl" data-unlink><span class="synPreProc">#!/usr/bin/perl</span> <span class="synComment">#</span> <span class="synComment"># Usage: atok2anthy.pl atoc-dic.txt &gt; ~/.anthy/private_words_default</span> <span class="synComment">#</span> <span class="synStatement">my</span> <span class="synIdentifier">%hinshi</span> = ( <span class="synConstant">&quot;独立語&quot;</span> =&gt; <span class="synConstant">&quot;KJ&quot;</span>, <span class="synComment">#単漢字</span> <span class="synConstant">&quot;単漢字&quot;</span> =&gt; <span class="synConstant">&quot;KJ&quot;</span>, <span class="synComment">#単漢字</span> <span class="synConstant">&quot;名詞サ変&quot;</span> =&gt; <span class="synConstant">&quot;T30&quot;</span>, <span class="synComment">#名詞 - する接続</span> <span class="synConstant">&quot;名詞ザ変&quot;</span> =&gt; <span class="synConstant">&quot;T30&quot;</span>, <span class="synComment">#名詞 - する接続</span> <span class="synConstant">&quot;固有人名&quot;</span> =&gt; <span class="synConstant">&quot;JNM&quot;</span>, <span class="synComment">#名詞 - 人名</span> <span class="synConstant">&quot;固有人他&quot;</span> =&gt; <span class="synConstant">&quot;JNM&quot;</span>, <span class="synComment">#名詞 - 人名</span> <span class="synConstant">&quot;固有人姓&quot;</span> =&gt; <span class="synConstant">&quot;JNM&quot;</span>, <span class="synComment">#名詞 - 人名</span> <span class="synConstant">&quot;固有地名&quot;</span> =&gt; <span class="synConstant">&quot;CN&quot;</span>, <span class="synComment">#固有名詞 - 地名</span> <span class="synConstant">&quot;固有一般&quot;</span> =&gt; <span class="synConstant">&quot;KK&quot;</span>, <span class="synComment">#固有名詞 - その他</span> <span class="synConstant">&quot;名詞&quot;</span> =&gt; <span class="synConstant">&quot;T35&quot;</span>, <span class="synComment">#名詞 - 一般名詞</span> <span class="synConstant">&quot;感動詞&quot;</span> =&gt; <span class="synConstant">&quot;CK&quot;</span>, <span class="synComment">#感動詞</span> <span class="synConstant">&quot;一段動詞&quot;</span> =&gt; <span class="synConstant">&quot;KS&quot;</span>, <span class="synComment">#上下一段</span> <span class="synConstant">&quot;サ行五段&quot;</span> =&gt; <span class="synConstant">&quot;S5&quot;</span>, <span class="synComment">#サ行五段</span> <span class="synConstant">&quot;ガ行五段&quot;</span> =&gt; <span class="synConstant">&quot;G5&quot;</span>, <span class="synComment">#ガ行五段</span> <span class="synConstant">&quot;形容詞&quot;</span> =&gt; <span class="synConstant">&quot;KY&quot;</span>, <span class="synComment">#形容詞</span> ); <span class="synStatement">open</span>( <span class="synIdentifier">INPUT</span>, <span class="synConstant">&quot;&lt;</span><span class="synIdentifier">$ARGV[</span><span class="synConstant">0</span><span class="synIdentifier">]</span><span class="synConstant">&quot;</span> ); <span class="synStatement">while</span> ( <span class="synIdentifier">&lt;INPUT&gt;</span> ) { <span class="synComment"># ATOK辞書ユーティリティで出力した辞書ファイルは「読み、単語、品詞」の</span> <span class="synComment"># 順番に並んでいて、区切り文字としてタブ文字が間に入る</span> <span class="synComment">#</span> <span class="synComment"># 例: しゃんはいありすげんがくだん[\t]上海アリス幻樂団[\t]固有名詞*</span> <span class="synComment">#</span> <span class="synComment"># ※ この部分は東方ATOK辞書用に変へてゐます。正規表現と辞書を照らし合はせて察してください</span> <span class="synStatement">if</span> ( <span class="synIdentifier">$_</span> =~ <span class="synStatement">/</span><span class="synSpecial">(</span><span class="synConstant">[^</span><span class="synSpecial">\t</span><span class="synConstant">]</span><span class="synSpecial">+)\t(</span><span class="synConstant">[^</span><span class="synSpecial">\t</span><span class="synConstant">]</span><span class="synSpecial">+)\t(</span><span class="synConstant">[^</span><span class="synSpecial">\t</span><span class="synConstant">]</span><span class="synSpecial">+)(\t</span><span class="synConstant">[^</span><span class="synSpecial">\t</span><span class="synConstant">]</span><span class="synSpecial">+)?</span><span class="synConstant">$</span><span class="synStatement">/</span> ) { <span class="synStatement">my</span> <span class="synIdentifier">$reading</span> = <span class="synIdentifier">$1</span>; <span class="synComment"># 読み</span> <span class="synStatement">my</span> <span class="synIdentifier">$word</span> = <span class="synIdentifier">$2</span>; <span class="synComment"># 単語</span> <span class="synStatement">my</span> <span class="synIdentifier">$class</span> = <span class="synIdentifier">$3</span>; <span class="synComment"># 品詞</span> <span class="synComment"># Anthyの品詞に相当する品詞に置き換え、辞書に追加する</span> <span class="synStatement">if</span> ( <span class="synStatement">exists</span>( <span class="synIdentifier">$hinshi{$class}</span> ) ) { <span class="synStatement">print</span> <span class="synConstant">&quot;</span><span class="synIdentifier">$reading</span><span class="synConstant"> #</span><span class="synIdentifier">$hinshi{$class}</span><span class="synConstant">*500 </span><span class="synIdentifier">$word</span><span class="synSpecial">\n</span><span class="synConstant">&quot;</span>; } <span class="synStatement">else</span> { <span class="synComment"># その他の品詞は(対応させるのが面倒なので)変換しない</span> <span class="synStatement">print</span> <span class="synIdentifier">STDERR</span> <span class="synConstant">&quot;unsupported class '</span><span class="synIdentifier">$class</span><span class="synConstant">' - </span><span class="synIdentifier">$word</span><span class="synConstant"> (</span><span class="synIdentifier">$reading</span><span class="synConstant">)</span><span class="synSpecial">\n</span><span class="synConstant">&quot;</span>; } } <span class="synStatement">else</span> { <span class="synComment"># コメント行・空行などは無視する</span> <span class="synStatement">print</span> <span class="synIdentifier">STDERR</span> <span class="synConstant">&quot;not match '</span><span class="synIdentifier">$line</span><span class="synConstant">'</span><span class="synSpecial">\n</span><span class="synConstant">&quot;</span>; } } <span class="synStatement">close</span>( <span class="synIdentifier">INPUT</span> ); </pre><p><a class="keyword" href="http://d.hatena.ne.jp/keyword/perl">perl</a>弄ったの初めて。それっぽい感じに修正したらそれっぽく動いてくれたのでだいたい合ってゐるのでせうか…(^^;</p><p>ちなみに読みの順で並び替へる処理が削られてゐますが、「<a class="keyword" href="http://d.hatena.ne.jp/keyword/Anthy">Anthy</a>辞書管理」(kasumi) で一度開いて保存すれば勝手に並び替へられるので大丈夫です。(つまり手抜き</p><p>5. この<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%B9%A5%AF%A5%EA%A5%D7%A5%C8">スクリプト</a>を実行します</p> <pre class="code" data-lang="" data-unlink>$ ./atok2anthy.pl th-atok.txt &gt; th-anthy.txt</pre><p>6. <a class="keyword" href="http://d.hatena.ne.jp/keyword/Anthy">Anthy</a>で使用できない「読み」を削る<br /> <a class="keyword" href="http://d.hatena.ne.jp/keyword/Anthy">Anthy</a>ではひらがな以外の読みを登録することができません。「こいつ何当然のこと言ってんだ」と思ふかもしれませんが、この辞書の中には「めるらん<span style="color:red">・</span>ぷりずむりばー」や「てぇ<span style="color:red">g</span>りもいれおふぁぃせ」<a href="#f-2f01cddf" name="fn-2f01cddf" title="「the Grimoire of Alice」と変換されるらしゐ">*1</a>のような読みも登録されてゐます。<a class="keyword" href="http://d.hatena.ne.jp/keyword/Anthy">Anthy</a>ではそのまま使ふことができないので、まとめて削ってしまひませう。<a href="#f-b39adb3d" name="fn-b39adb3d" title="さっきのスクリプトの中で該当行を消してしまへばよかったのにといふツッコミは無しの方向で…。">*2</a><br /> </p> <pre class="code" data-lang="" data-unlink>$ grep -v &#39;^[^ ]*[abcdefghijklmnopqrstuvwxyz]&#39; th-anthy.txt &gt; tmp-dic $ grep -v &#39;^[^ ]*・&#39; tmp-dic &gt; tmp-dic2 $ mv tmp-dic2 th-anthy.txt; rm tmp-dic</pre><p>7. ~/.<a class="keyword" href="http://d.hatena.ne.jp/keyword/anthy">anthy</a>/private_words_default へコピー</p> <pre class="code" data-lang="" data-unlink>$ cp th-anthy.txt ~/.anthy/private_words_default</pre><p>8. 「<a class="keyword" href="http://d.hatena.ne.jp/keyword/Anthy">Anthy</a>辞書管理」(kasumi) で辞書を開いてみる<br /> 開いたら、そのまま「保存」をクリックします。ついでにエラーで追加されなかった単語を手動で追加してしまひます。</p><p>&#9320;. 完成!<br /> お疲れさまでしたm(_ _)m</p> <div class="footnote"> <p class="footnote"><a href="#fn-2f01cddf" name="f-2f01cddf" class="footnote-number">*1</a><span class="footnote-delimiter">:</span><span class="footnote-text">「the Grimoire of Alice」と変換されるらしゐ</span></p> <p class="footnote"><a href="#fn-b39adb3d" name="f-b39adb3d" class="footnote-number">*2</a><span class="footnote-delimiter">:</span><span class="footnote-text">さっきの<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%B9%A5%AF%A5%EA%A5%D7%A5%C8">スクリプト</a>の中で該当行を消してしまへばよかったのにといふツッコミは無しの方向で…。</span></p> </div> kim_upsilon 放置しすぎ hatenablog://entry/8454420450074947590 2010-01-03T19:40:48+09:00 2014-11-23T23:39:12+09:00 約半年ぶりの更新です。交信ともいふかもしれません (存在確認的な意味で)。 <p>約半年ぶりの更新です。交信ともいふかもしれません (存在確認的な意味で)。</p> kim_upsilon Iceweasel 3.5 hatenablog://entry/8454420450074947596 2009-07-06T23:38:26+09:00 2014-11-23T23:39:16+09:00 プレリリース版を見つけたので使ってみる。後で報告とかもするかも。iceweasel (3.5-0) http://glandium.org/blog/?p=376libmozjs2d (1.9.1-0) xulrunner-1.9.1 (1.9.1-0) http://glandium.org/blog/?p=370 追記 - 2009-07-07 22:38 特に問題なく使用できました。起動時間はあまり変はらないものの動作は明らかに軽くなってゐました。 <p>プレリリース版を見つけたので使ってみる。後で報告とかもするかも。</p><p><a class="keyword" href="http://d.hatena.ne.jp/keyword/iceweasel">iceweasel</a> (3.5-0)<br /> <a href="http://glandium.org/blog/?p=376">http://glandium.org/blog/?p=376</a></p><p>libmozjs2d (1.9.1-0)<br /> xulrunner-1.9.1 (1.9.1-0)<br /> <a href="http://glandium.org/blog/?p=370">http://glandium.org/blog/?p=370</a><br /> </p> <div class="section"> <h4>追記 - <a class="keyword" href="http://d.hatena.ne.jp/keyword/2009-07-07">2009-07-07</a> 22:38</h4> <p>特に問題なく使用できました。起動時間はあまり変はらないものの動作は明らかに軽くなってゐました。</p> </div> kim_upsilon 独り言 hatenablog://entry/8454420450074947599 2009-07-06T23:25:21+09:00 2014-11-23T23:39:17+09:00 この日記、見て分かるとおりどう見ても「日記」としては機能してゐないので、さういふ内容を期待してゐる人向けにTwitterへのリンクを貼ってみる。http://twitter.jp/kim_upsilonとは言っても、更新頻度が少し短くなっただけで内容はあまり変わってなかったり…(^^; <p>この日記、見て分かるとおりどう見ても「日記」としては機能してゐないので、さういふ内容を期待してゐる人向けに<a class="keyword" href="http://d.hatena.ne.jp/keyword/Twitter">Twitter</a>へのリンクを貼ってみる。</p><p><a href="http://twitter.jp/kim_upsilon">http://twitter.jp/kim_upsilon</a></p><p>とは言っても、更新頻度が少し短くなっただけで内容はあまり変わってなかったり…(^^;</p> kim_upsilon ダイアリーのバックアップ機能 hatenablog://entry/8454420450074947604 2009-07-06T23:21:24+09:00 2014-11-23T23:39:17+09:00 さっきDropboxをNautilus無しで実行する方法とか書いてゐたら、途中でブラウザがこけて作成途中の分が全て消えてしまった。で、はてなダイアリーには「バックアップ機能」なるものが存在するのだが、見てみるとどうも機能してゐない。まさかと思ひ、スクリプトを漁ってみると…、http://d.hatena.ne.jp/js/local_storage.js isUsable: function() { var ua = navigator.userAgent; if (ua.indexOf("Win")<0 && ua.indexOf("Mac")<0) return false; if (wi… <p>さっき<a class="keyword" href="http://d.hatena.ne.jp/keyword/Dropbox">Dropbox</a>を<a class="keyword" href="http://d.hatena.ne.jp/keyword/Nautilus">Nautilus</a>無しで実行する方法とか書いてゐたら、途中でブラウザがこけて作成途中の分が全て消えてしまった。</p><p>で、<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A4%CF%A4%C6%A4%CA%A5%C0%A5%A4%A5%A2%A5%EA%A1%BC">はてなダイアリー</a>には「バックアップ機能」なるものが存在するのだが、見てみるとどうも機能してゐない。まさかと思ひ、<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%B9%A5%AF%A5%EA%A5%D7%A5%C8">スクリプト</a>を漁ってみると…、</p><p><a href="http://d.hatena.ne.jp/js/local_storage.js">http://d.hatena.ne.jp/js/local_storage.js</a></p> <pre class="code lang-javascript" data-lang="javascript" data-unlink> isUsable: <span class="synIdentifier">function</span>() <span class="synIdentifier">{</span> <span class="synIdentifier">var</span> ua = navigator.userAgent; <span class="synStatement">if</span> (ua.indexOf(<span class="synConstant">&quot;Win&quot;</span>)&lt;0 &amp;&amp; ua.indexOf(<span class="synConstant">&quot;Mac&quot;</span>)&lt;0) <span class="synStatement">return</span> <span class="synConstant">false</span>; <span class="synStatement">if</span> (<span class="synStatement">window</span>.opera) <span class="synStatement">return</span> <span class="synConstant">false</span>; <span class="synStatement">if</span> (LocalStorage.getFlashVersion()&lt;8) <span class="synStatement">return</span> <span class="synConstant">false</span>; <span class="synStatement">return</span> <span class="synConstant">true</span>; <span class="synIdentifier">}</span>, </pre><p><span style="font-size: 130%;">うわーw <a class="keyword" href="http://d.hatena.ne.jp/keyword/Linux">Linux</a>とか<span style="color: red">全く眼中にない</span>ぢゃないかww</span></p><p>どうするよこれ。UserAgent変更するのも一つの手だけど、なんか気に食はない。なんか良い方法無いかなぁ。</p> kim_upsilon シェルスクリプトで作ってみた hatenablog://entry/8454420450074947608 2009-06-19T05:16:18+09:00 2014-11-23T23:39:19+09:00 このシェルスクリプトは、 Linuxを使ってゐて (もちろんCUIで簡単なコマンドが使へる程度の能力が必要) 作業用BGMにニコニコ動画を使ってゐて NicoCacheを常用してゐて マイリスト内の動画を、キャッシュを使ってMPlayerのやうなプレーヤーで一括再生したいなーと思ってゐる といふ人向けです。 その1 - mylist2lst.sh ニコニコ動画からマイリストのRSSを取得し、動画ID(sm9など。動画URLではない)の一覧を標準出力へ出力する。使ひ方: $ ./mylist2lst.sh http://www.nicovideo.jp/mylist/5822120 > 5822… <p>この<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%B7%A5%A7%A5%EB%A5%B9%A5%AF%A5%EA%A5%D7%A5%C8">シェルスクリプト</a>は、</p> <ul> <li><a class="keyword" href="http://d.hatena.ne.jp/keyword/Linux">Linux</a>を使ってゐて (もちろん<a class="keyword" href="http://d.hatena.ne.jp/keyword/CUI">CUI</a>で簡単なコマンドが使へる程度の能力が必要)</li> <li>作業用BGMに<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%CB%A5%B3%A5%CB%A5%B3%C6%B0%B2%E8">ニコニコ動画</a>を使ってゐて</li> <li><a href="http://http://homepage1.nifty.com/asr/tools/nicocache.html">NicoCache</a>を常用してゐて</li> <li>マイリスト内の動画を、キャッシュを使って<a class="keyword" href="http://d.hatena.ne.jp/keyword/MPlayer">MPlayer</a>のやうなプレーヤーで一括再生したいなーと思ってゐる</li> </ul><p>といふ人向けです。</p> <div class="section"> <h4>その1 - mylist2lst.sh</h4> <p><a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%CB%A5%B3%A5%CB%A5%B3%C6%B0%B2%E8">ニコニコ動画</a>からマイリストの<a class="keyword" href="http://d.hatena.ne.jp/keyword/RSS">RSS</a>を取得し、動画ID(sm9など。動画URLではない)の一覧を標準出力へ出力する。</p><p>使ひ方:</p> <pre>$ ./mylist2lst.sh <a href="http://www.nicovideo.jp/mylist/5822120">http://www.nicovideo.jp/mylist/5822120</a> > 5822120.lst </pre><p>mylist2lst.sh</p> <pre class="code lang-sh" data-lang="sh" data-unlink><span class="synComment">#!/bin/bash</span> wget <span class="synSpecial">-O</span> - <span class="synPreProc">$1</span>?<span class="synIdentifier">rss</span>=2.0 | <span class="synStatement">sed</span> <span class="synSpecial">-e</span> <span class="synStatement">'</span> <span class="synConstant"># &lt;link&gt;タグ以外は無視する</span> <span class="synConstant">/&lt;link&gt;.*watch/!{</span> <span class="synConstant"> D</span> <span class="synConstant">}</span> <span class="synConstant"># URLを取り出す</span> <span class="synConstant">s/^[^&lt;]*&lt;link&gt;http:\/\/www.nicovideo.jp\/watch\/\([^&lt;]*\)&lt;\/link&gt;/\1/</span> <span class="synConstant"># 改行コードの変換 (\r\n → \n)</span> <span class="synConstant">s/\r$//</span> <span class="synStatement">'</span> </pre> </div> <div class="section"> <h4>その2 - lst2m3u.sh</h4> <p>↑のmylist2lst.shで生成したlstファイルを元に、キャッシュ内の対応する動画ファイルの一覧を標準出力へ出力する。</p><p>検索方法: 例へば sm9 に対応する動画を探す場合、キャッシュの置かれてゐるディレクトリ内 (サブディレクトリも含む) で sm9_* に当てはまるファイルを検索します。</p><p>使ひ方:</p> <pre>$ ./lst2m3u.sh < 5822120.lst > 5822120.m3u </pre><p>または</p> <pre>$ ./mylist2lst.sh <a href="http://www.nicovideo.jp/mylist/582212">http://www.nicovideo.jp/mylist/582212</a> | ./lst2m3u.sh > 5822120.m3u </pre><p>lst2m3u.sh</p> <pre class="code lang-sh" data-lang="sh" data-unlink><span class="synComment">#!/bin/bash</span> <span class="synStatement">while read id</span> <span class="synStatement">do</span> <span class="synStatement">find</span> /var/cache/nicocache/cache/ <span class="synSpecial">-name</span> <span class="synStatement">&quot;</span><span class="synPreProc">${id}</span><span class="synConstant">_*</span><span class="synStatement">&quot;</span> <span class="synStatement">echo</span><span class="synConstant"> -n </span><span class="synStatement">&quot;</span><span class="synConstant">. </span><span class="synStatement">&quot;</span><span class="synConstant"> </span><span class="synStatement">&gt;&amp;</span><span class="synConstant">2</span> <span class="synStatement">done</span> <span class="synStatement">echo</span><span class="synConstant"> </span><span class="synStatement">&quot;</span><span class="synSpecial">終了しました</span><span class="synStatement">&quot;</span><span class="synConstant"> </span><span class="synStatement">&gt;&amp;2</span> </pre><p><span style="color:#FF0000;">「/var/cache/nicocache/cache/」の部分は自分が設定してゐるディレクトリに置き換へてください。</span><br /> </p> </div> <div class="section"> <h4>まとめ</h4> <p>作業用BGMとして<a class="keyword" href="http://d.hatena.ne.jp/keyword/MPlayer">MPlayer</a>で聞くなら、</p> <pre>$ ./mylist2lst.sh <a href="http://www.nicovideo.jp/mylist/582212">http://www.nicovideo.jp/mylist/582212</a> | ./lst2m3u.sh > 5822120.m3u $ <a class="keyword" href="http://d.hatena.ne.jp/keyword/mplayer">mplayer</a> -novideo -playlist 5822120.m3u </pre><p>とするといいよ!</p> </div> kim_upsilon Btrfsでのバックアップ hatenablog://entry/8454420450074947612 2009-05-22T21:04:59+09:00 2014-11-23T23:39:21+09:00 Btrfsにはスナップショット機能が備わってゐるので、一旦スナップショットを取ってしまへば他の作業をしながら別のメディアへのコピー作業を行へるやうだ。↓こんな感じ ファイルシステム全体のスナップショットを取る ↓ スナップショット上のファイルをどんどん別のメディアへコピーする ↓ コピー中は別の作業をしてゐてもおk(スナップショットにあるファイルには影響がないから) これなら面倒になってバックアップを怠るといふことも少なくなりさうだwただ一つ気になるのが、どうやらスナップショットの作成機能はあるものの削除機能が備わってゐないらしい。まぁ容量にも余裕があるのでそのまま放置してゐても問題ないとは思… <p>Btrfsにはスナップショット機能が備わってゐるので、一旦スナップショットを取ってしまへば他の作業をしながら別のメディアへのコピー作業を行へるやうだ。</p><p>↓こんな感じ</p> <blockquote> <p><a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%D5%A5%A1%A5%A4%A5%EB%A5%B7%A5%B9%A5%C6%A5%E0">ファイルシステム</a>全体のスナップショットを取る<br /> ↓<br /> スナップショット上のファイルをどんどん別のメディアへコピーする<br /> ↓<br /> コピー中は別の作業をしてゐてもおk(スナップショットにあるファイルには影響がないから)</p> </blockquote> <p>これなら面倒になってバックアップを怠るといふことも少なくなりさうだw</p><p>ただ一つ気になるのが、どうやらスナップショットの<span style="font-weight: bold">作成</span>機能はあるものの<span style="font-weight: bold">削除</span>機能が備わってゐないらしい。まぁ容量にも余裕があるのでそのまま放置してゐても問題ないとは思ふが。</p><p>時間のあるときに実験してみやうかな。</p> kim_upsilon ファイル転送に使うプロトコルを勝手に比較してみた hatenablog://entry/8454420450074947614 2009-05-21T03:50:19+09:00 2014-11-23T23:39:23+09:00 自分用に作ったメモ書きのやうなものなので、間違ってゐる部分や個人的な感想も混じってゐたりします。(あとで追記するかも) プロトコル Windowsでそのまま使へるか*1 長所 短所 FTP ○ ファイアウォール越しでも使へる*2。プロキシを通す必要のある環境でも、FTPプロキシが用意されてゐればそれを使へる。 パスワードを含むすべての通信は平文で流れる。 Dropbox △*3 複数のPC間で同期を取りやすい。通信はSSLで暗号化される。SVNのやうにリビジョン管理ができる。 Linux版のクライアントがNautilus用プラグインなので、Nautilusを使はないユーザにとっては不便。 We… <p>自分用に作ったメモ書きのやうなものなので、間違ってゐる部分や個人的な感想も混じってゐたりします。(あとで追記するかも)</p> <table> <tr> <th> <a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%D7%A5%ED%A5%C8%A5%B3%A5%EB">プロトコル</a> </th> <th> <a class="keyword" href="http://d.hatena.ne.jp/keyword/Windows">Windows</a>でそのまま使へるか<a href="#f-7384cb0d" name="fn-7384cb0d" title="別途アプリケーションをインストールする必要があるかといふ意味。">*1</a> </th> <th> 長所 </th> <th> 短所 </th> </tr> <tr> <td> <a class="keyword" href="http://d.hatena.ne.jp/keyword/FTP">FTP</a> </td> <td> ○ </td> <td> <a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%D5%A5%A1%A5%A4%A5%A2%A5%A6%A5%A9%A1%BC%A5%EB">ファイアウォール</a>越しでも使へる<a href="#f-feea2fe0" name="fn-feea2fe0" title="パッシブモードの場合。">*2</a>。プロキシを通す必要のある環境でも、<a class="keyword" href="http://d.hatena.ne.jp/keyword/FTP">FTP</a>プロキシが用意されてゐればそれを使へる。 </td> <td> パスワードを含むすべての通信は平文で流れる。 </td> </tr> <tr> <td> <a class="keyword" href="http://d.hatena.ne.jp/keyword/Dropbox">Dropbox</a> </td> <td> △<a href="#f-dd433231" name="fn-dd433231" title="Web上からもアップロード可能。">*3</a> </td> <td> <a class="keyword" href="http://d.hatena.ne.jp/keyword/%CA%A3%BF%F4">複数</a>のPC間で同期を取りやすい。通信は<a class="keyword" href="http://d.hatena.ne.jp/keyword/SSL">SSL</a>で暗号化される。<a class="keyword" href="http://d.hatena.ne.jp/keyword/SVN">SVN</a>のやうにリビジョン管理ができる。 </td> <td> <a class="keyword" href="http://d.hatena.ne.jp/keyword/Linux">Linux</a>版のクライアントが<a class="keyword" href="http://d.hatena.ne.jp/keyword/Nautilus">Nautilus</a>用<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%D7%A5%E9%A5%B0%A5%A4%A5%F3">プラグイン</a>なので、<a class="keyword" href="http://d.hatena.ne.jp/keyword/Nautilus">Nautilus</a>を使はないユーザにとっては不便。 </td> </tr> <tr> <td> <a class="keyword" href="http://d.hatena.ne.jp/keyword/WebDAV">WebDAV</a> </td> <td> ○<a href="#f-1f76c3b3" name="fn-1f76c3b3" title="ただしVistaの場合、デフォルトではBASIC認証が使へない。まぁ外に晒すやうなサーバにBASIC認証など使はないだろうが。">*4</a> </td> <td> <a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%A8%A5%AF%A5%B9%A5%D7%A5%ED%A1%BC%A5%E9">エクスプローラ</a>から接続できるため、通常のフォルダと同じやうな感覚で使用することができる。また、HTTPの拡張なのでHTTPプロキシがそのまま使へる。 </td> <td> <a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%D7%A5%ED%A5%C8%A5%B3%A5%EB">プロトコル</a>自体の問題ではないが、<a class="keyword" href="http://d.hatena.ne.jp/keyword/WebDAV">WebDAV</a>を使った無料のオンラインストレージサービスが少ない。</td> </tr> <tr> <td> SMB (<a class="keyword" href="http://d.hatena.ne.jp/keyword/Samba">Samba</a>) </td> <td> ○ </td> <td> まぁ…もともと<a class="keyword" href="http://d.hatena.ne.jp/keyword/Windows">Windows</a>の「共有フォルダ」だからねぇ。 </td> <td> そもそもLAN内で使ふ<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%D7%A5%ED%A5%C8%A5%B3%A5%EB">プロトコル</a>なので、外向けには使はない。 </td> </tr> <tr> <td> SCP (<a class="keyword" href="http://d.hatena.ne.jp/keyword/SSH">SSH</a>) </td> <td> × </td> <td> <a class="keyword" href="http://d.hatena.ne.jp/keyword/SSH">SSH</a>を利用したセキュアなファイル転送。認証情報・データの両方とも暗号化される。 </td> <td> <a class="keyword" href="http://d.hatena.ne.jp/keyword/Linux">Linux</a>どうしなら使へるんだけどね… </td> </tr> <tr> <td> <a class="keyword" href="http://d.hatena.ne.jp/keyword/Skype">Skype</a> </td> <td> × </td> <td> <a class="keyword" href="http://d.hatena.ne.jp/keyword/Skype">Skype</a>のファイル転送機能。<a class="keyword" href="http://d.hatena.ne.jp/keyword/P2P">P2P</a>を用ゐた転送なので高速である。転送されるデータも暗号化される。 </td> <td> 直接相手にファイルを送りつけるので、相手がオンラインでないと転送が出来ない。 </td> </tr> <tr> <td> 電子メール </td> <td> ○(?) </td> <td> <a class="keyword" href="http://d.hatena.ne.jp/keyword/SMTP">SMTP</a>・POPを利用した転送。</td> <td> 言ふまでもなく、ただの添付ファイル付き<span style="text-decoration: line-through">迷惑</span>メール。でも、<a href="http://lowlife.jp/yasusii/stories/20.html">&#x304B;&#x3046;&#x3044;&#x3075;&#x3053;&#x3068;</a>を考える人は居るんだねぇ。 </td> </tr> </table><div class="footnote"> <p class="footnote"><a href="#fn-7384cb0d" name="f-7384cb0d" class="footnote-number">*1</a><span class="footnote-delimiter">:</span><span class="footnote-text">別途アプリケーションをインストールする必要があるかといふ意味。</span></p> <p class="footnote"><a href="#fn-feea2fe0" name="f-feea2fe0" class="footnote-number">*2</a><span class="footnote-delimiter">:</span><span class="footnote-text">パッシブモードの場合。</span></p> <p class="footnote"><a href="#fn-dd433231" name="f-dd433231" class="footnote-number">*3</a><span class="footnote-delimiter">:</span><span class="footnote-text">Web上からもアップロード可能。</span></p> <p class="footnote"><a href="#fn-1f76c3b3" name="f-1f76c3b3" class="footnote-number">*4</a><span class="footnote-delimiter">:</span><span class="footnote-text">ただし<a class="keyword" href="http://d.hatena.ne.jp/keyword/Vista">Vista</a>の場合、デフォルトでは<a class="keyword" href="http://d.hatena.ne.jp/keyword/BASIC%C7%A7%BE%DA">BASIC認証</a>が使へない。まぁ外に晒すやうなサーバに<a class="keyword" href="http://d.hatena.ne.jp/keyword/BASIC%C7%A7%BE%DA">BASIC認証</a>など使はないだろうが。</span></p> </div> kim_upsilon Btrfs hatenablog://entry/8454420450074947617 2009-05-19T19:21:48+09:00 2014-11-23T23:39:23+09:00 数週間前にBtrfsを使い始めてみました。その移行作業の時、Debianのbtrfs-toolsパッケージにbtrfs-convertが入ってゐないことに気づき、ソース持ってきてビルドして使いました。で今日、btrfs-toolsパッケージの更新があって、 btrfs-tools (0.18-4) unstable; urgency=low * Using correct rfc-2822 date formats in changelog. * Including btrfs-convert, thanks to Uwe Kleine-König (Closes: #529168). -- … <p>数週間前にBtrfsを使い始めてみました。その移行作業の時、<a class="keyword" href="http://d.hatena.ne.jp/keyword/Debian">Debian</a>のbtrfs-toolsパッケージにbtrfs-convertが入ってゐないことに気づき、ソース持ってきてビルドして使いました。で今日、btrfs-toolsパッケージの更新があって、</p> <pre>btrfs-tools (0.18-4) unstable; urgency=low * Using correct <a class="keyword" href="http://d.hatena.ne.jp/keyword/rfc">rfc</a>-2822 date formats in <a class="keyword" href="http://d.hatena.ne.jp/keyword/changelog">changelog</a>. * <span style="color:#FF0000;">Including btrfs-convert</span>, thanks to Uwe Kleine-König <u.kleine- koenig@pengutronix.de> (Closes: #529168). -- Daniel Baumann <daniel@debian.org> Sun, 17 May 2009 22:18:27 +0200 </pre><p>なんと言ふタイミングorz</p> kim_upsilon Windows 7 RC に Adobe Flash Player を入れる hatenablog://entry/8454420450074947619 2009-05-10T18:28:20+09:00 2014-11-23T23:39:23+09:00 Windows 7にFlash Plyaerを入れようとして http://get.adobe.com/jp/flashplayer/ にアクセスすると、「別のバージョンのAdobe Flash Playerをインストール」のページに飛ばされ、先に進むことさへできなくなってゐました。なんだこれ。 とりあへず、Configuration ManiaをFirefoxにインストールして、UserAgentをVistaに偽装することでFlashをインストールできました。 今のところ特に問題なく使へてゐるので、たぶん大丈夫でせう (^^; 追記 (5/10 20:00): http://toomva.b… <p><a class="keyword" href="http://d.hatena.ne.jp/keyword/Windows%207">Windows 7</a>に<a class="keyword" href="http://d.hatena.ne.jp/keyword/Flash">Flash</a> Plyaerを入れようとして <a href="http://get.adobe.com/jp/flashplayer/">http://get.adobe.com/jp/flashplayer/</a> にアクセスすると、「<span style="font-weight:bold;">別のバージョンの</span><a class="keyword" href="http://d.hatena.ne.jp/keyword/Adobe">Adobe</a> <a class="keyword" href="http://d.hatena.ne.jp/keyword/Flash">Flash</a> Playerをインストール」のページに飛ばされ、先に進むことさへできなくなってゐました。なんだこれ。<br /> とりあへず、<a href="https://addons.mozilla.org/ja/firefox/addon/4420">Configuration Mania</a>を<a class="keyword" href="http://d.hatena.ne.jp/keyword/Firefox">Firefox</a>にインストールして、UserAgentを<a class="keyword" href="http://d.hatena.ne.jp/keyword/Vista">Vista</a>に偽装することで<a class="keyword" href="http://d.hatena.ne.jp/keyword/Flash">Flash</a>をインストールできました。<br /> 今のところ特に問題なく使へてゐるので、たぶん大丈夫でせう (^^;</p> <div class="section"> <h4>追記 (5/10 20:00):</h4> <p><a href="http://toomva.blog60.fc2.com/blog-entry-216.html">http://toomva.blog60.fc2.com/blog-entry-216.html</a><br /> 言語設定を変へて<a class="keyword" href="http://d.hatena.ne.jp/keyword/%B1%D1%B8%EC%C8%C7">英語版</a>のダウンロードページからインストールする方法もあるようです。といふか、こちらの方法のほうが良ささうです。</p> </div> kim_upsilon ATI Mobility Radeon M6 で3Dアクセラレーションを有効にする hatenablog://entry/8454420450074947622 2009-05-10T18:13:56+09:00 2014-11-23T23:39:24+09:00 http://ubuntuforums.org/archive/index.php/t-246746.html を参考にしてxorg.confを書き換へました。変更前: Section "Device" Identifier "Configured Video Device" Driver "ati" BusID "PCI:1:0:0" EndSection 変更後: Section "Device" Identifier "ATI Technologies, Inc. Radeon Mobility M6 LY [Radeon Mobility 9000]" BusID "PCI:1:0:0… <p><a href="http://ubuntuforums.org/archive/index.php/t-246746.html">http://ubuntuforums.org/archive/index.php/t-246746.html</a> を参考にして<a class="keyword" href="http://d.hatena.ne.jp/keyword/xorg.conf">xorg.conf</a>を書き換へました。</p><p>変更前:</p> <pre>Section "Device" Identifier "Configured Video Device" Driver "<a class="keyword" href="http://d.hatena.ne.jp/keyword/ati">ati</a>" BusID "<a class="keyword" href="http://d.hatena.ne.jp/keyword/PCI">PCI</a>:1:0:0" EndSection </pre><p>変更後:</p> <pre>Section "Device" Identifier "<a class="keyword" href="http://d.hatena.ne.jp/keyword/ATI%20Technologies">ATI Technologies</a>, Inc. <a class="keyword" href="http://d.hatena.ne.jp/keyword/Radeon">Radeon</a> Mobility M6 LY [<a class="keyword" href="http://d.hatena.ne.jp/keyword/Radeon">Radeon</a> Mobility 9000]" BusID "<a class="keyword" href="http://d.hatena.ne.jp/keyword/PCI">PCI</a>:1:0:0" Driver "<a class="keyword" href="http://d.hatena.ne.jp/keyword/radeon">radeon</a>" Option "DRI" "true" #Optimized values (changed from driver default) Option "AGPMode" "4" Option "AGPFastWrite" "on" #Faster than default (off) Option "SWcursor" "off" #Faster than default (on) Option "EnablePageFlip" "on" #Faster than default (off) Option "AccelMethod" "EXA" # or XAA, EXA, XAA more stable, XAA is deafult Option "DynamicClocks" "on" Option "BIOSHotkeys" "on" #These are not mentioned in man page for driver Option "AGPSize" "32" # default: 8 Option "EnableDepthMoves" "true" EndSection </pre><p>僕の環境ではこの変更をする前から3D<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%A2%A5%AF%A5%BB%A5%E9">アクセラ</a>レーションが有効になってゐたのですが、この変更をしてから<a class="keyword" href="http://d.hatena.ne.jp/keyword/%C5%EC%CA%FD%C8%EC%C1%DB%C5%B7">東方緋想天</a>が快適に動くやうになりました。あとは変更前よりも若干描画が速くなったやうな…、気がしました。</p> kim_upsilon