やること: チケット
https://dev.mikutter.hachune.net/
https://dev.mikutter.hachune.net/favicon.ico?1619448608
2018-05-14T13:43:14Z
やること
Redmine
mikutter - 機能 #1245 (却下): Miracle Painter 2
https://dev.mikutter.hachune.net/issues/1245
2018-05-14T13:43:14Z
toshi_a 初音
toshi.alternative@gmail.com
<p>MiraclePainterを書き直す。</p>
<ul>
<li>MiraclePainterのスーパクラスがGtk::Objectになっているのをやめる
<ul>
<li>Gtk3にはそんなクラス無いので</li>
</ul>
</li>
<li>MiraclePainterをTreeViewから独立させる
<ul>
<li>現在は、必ず親となるTreeViewの参照を持つ必要がある</li>
<li>MiraclePainterを単体で利用して、Photo Modelなどに出力できるようにしたい
<ul>
<li>Dialog DSLのModelビューアなどに転用したい</li>
</ul>
</li>
</ul>
</li>
<li>MiraclePainterを単一のプラグインにする</li>
<li>再描画の最適化
<ul>
<li>再描画の回数を抑える</li>
<li>再描画のコストを抑える</li>
</ul></li>
</ul>
mikutter - 最適化 #1121 (却下): Photoは実質同じ画像を複数保持する可能性がある
https://dev.mikutter.hachune.net/issues/1121
2017-12-19T22:02:45Z
toshi_a 初音
toshi.alternative@gmail.com
<p>GdkPixbufはvariant毎にキャッシュされるため、実質同じPixbufが複数のvariantにキープされる可能性がある。要求サイズより大きいvariantであればどれを縮小してGdkPixbufを作っても同じなので、GdkPixbufのインスタンスプールをそれらのvariantで共有する</p>
mikutter - バグ #1069 (却下): bundlerを使ってGemをインストールする時、pluginグループを除外してもプラグインの要求するGemがインストールされる。
https://dev.mikutter.hachune.net/issues/1069
2017-09-27T18:02:51Z
toshi_a 初音
toshi.alternative@gmail.com
<p>次のようにしても、例えばgtk2などのプラグインがインストールされてしまっている。</p>
<pre>
bundle install --without plugin
</pre>
<p>理由は、プラグインのGemfileでロードされる物をpluginグループに所属させる処理が、最近のBundlerでは期待通り動いていないから。</p>
mikutter - 機能 #989 (却下): World
https://dev.mikutter.hachune.net/issues/989
2017-03-04T09:51:52Z
toshi_a 初音
toshi.alternative@gmail.com
<p>mikutterが扱うアカウント情報をホストしているSNSなどのサービスをmikutter側から取り扱うための仕組みをWorldと名付け、実装する。</p>
<a name="Worldとは"></a>
<h1 >Worldとは<a href="#Worldとは" class="wiki-anchor">¶</a></h1>
<p>Worldというクラスを実際に用意するわけではなく、Worldとして期待される特定の振る舞いを全て実装したModelのことをWorldと呼ぶ。したがってWorldのスーパークラスは全て <code>Diva::Model</code> となる。</p>
<a name="目的"></a>
<h1 >目的<a href="#目的" class="wiki-anchor">¶</a></h1>
<p>従来であればアカウントは全てTwitterだったため、特定のMessage ModelがTwitterに属しているかどうかが、ふぁぼれるか、リプライできるかといったことの判断基準となっていた。<br />マルチワールドが実現された暁には、特定のMessage Modelが「Twitterか否か」ではなく「どういったサービスで提供されたものか」判断する必要がある。Worldが存在することで、アカウントや全てのModelは、それが所属するWorldを取り扱うことが出来るようになるため、例えばRSSのトピックに対してリツイートをしようとした時に、それが不可能であることがわかる。</p>
<p>アカウントを登録する時、最初にどのWorldクラスを利用するかをユーザに選ばせる。具体的にはこれが、TwitterやFacebookといった、アカウントが所属するサービスを選ぶことになる。</p>
<a name="要求する振る舞い"></a>
<h1 >要求する振る舞い<a href="#要求する振る舞い" class="wiki-anchor">¶</a></h1>
<p>一般的なプラグインがWorldのメソッドを直接扱うことは恐らく無く、二つのWorldインスタンスまたはクラスを比較することに意味があると思われる。<br />一方で、WorldはTwitterのCK/CSなど、大域的な認証情報を保持することができる。TwitterAccountは、TwitterWorldのインスタンスを親として持つことで、そのトークンがどのCK/CSの組み合わせで利用できるかを記録することができる。</p>
<a name="例"></a>
<h1 >例<a href="#例" class="wiki-anchor">¶</a></h1>
<a name="Twitterの場合"></a>
<h2 >Twitterの場合<a href="#Twitterの場合" class="wiki-anchor">¶</a></h2>
<p>Twitterの場合は、一つのTwitterクライアントがこれに当たる。実際のUIとして提供するかどうかは別として、TwitterWorldをCK/CS毎に作れば、それぞれにぶら下がるアカウントを別々に持てるため、アカウントごとに投稿元Twitterクライアントを変更することができる。また、別々のTwitterWorldに同じユーザでログインすることで、同じユーザで複数の投稿元Twitterクライアントを切り替えることが出来る。実用性はないが、BOTとして利用する時にmikutterを書き換えずに独自のクライアントキーに変更することができるようになる可能性がある。</p>
<p>現実的には、mikutterのTwitterWorldインスタンスをひとつだけ提供することになるし、異なるTwitterWorldであっても同じTwitterであるため、出来ることは変わらない。Twitterに関して言えばWorldのインスタンスを作成することが出来るという性質の恩恵はあまりないと思われる。</p>
<a name="実用的な例-Slackの場合"></a>
<h2 >実用的な例: Slackの場合<a href="#実用的な例-Slackの場合" class="wiki-anchor">¶</a></h2>
<p>Slackの場合、Worldはチームにあたる。新たなSlackチームに参加する場合は、対応するSlackWorldを作成し、アカウントをぶら下げることになる。Slackでは、チーム内にユーザが作成されるので、Twitterと違ってユーザは特定のSlackWorldのインスタンスに属する。</p>
mikutter - 機能 #961 (却下): レジュームされたプロフィールについても、スクリーンネームをクリックした時にIntentの候補からプロフィールを省くようにしたい
https://dev.mikutter.hachune.net/issues/961
2017-01-02T10:09:33Z
toshi_a 初音
toshi.alternative@gmail.com
<p><a class="issue tracker-1 status-5 priority-4 priority-default closed" title="バグ: プロフィールのアカウント名をクリックした時に、Intentの候補にプロフィールが挙がっている (終了)" href="https://dev.mikutter.hachune.net/issues/957">#957</a> のような経緯があったので、 <a class="issue tracker-2 status-5 priority-4 priority-default closed" title="機能: Modelをシリアライズ可能にする (終了)" href="https://dev.mikutter.hachune.net/issues/960">#960</a> でIntentTokenが保存できるようになったら、ユーザタブの情報と一緒にIntentTokenも保存するようにしてみる</p>
mikutter - 機能 #940 (却下): プロフィール画面で非公開アカウント・認証済みアカウントの確認をできるようにする
https://dev.mikutter.hachune.net/issues/940
2016-12-01T02:54:26Z
toshi_a 初音
toshi.alternative@gmail.com
<blockquote>
<p>DeNA公式アカウントがまさかの鍵垢に <a class="external" href="https://twitter.com/suisse_credit/status/804080136316256256/photo/1">https://twitter.com/suisse_credit/status/804080136316256256/photo/1</a> <a class="external" href="https://twitter.com/suisse_credit/status/804080136316256256">https://twitter.com/suisse_credit/status/804080136316256256</a><br />やばい 認証済かつ鍵というTwitterクライアント的には激レアテストケースだ <a class="external" href="https://twitter.com/wakamesoba98/status/804149400394047488">https://twitter.com/wakamesoba98/status/804149400394047488</a><br />SobaCha、DeNAcorp正しく表示できねえ!!!!!!https://twitter.com/wakamesoba98/status/804149657320329216</p>
</blockquote>
<p>mikutterではプロフィール画面で鍵垢・認証アカウントであることを直接確認する手段がないので波に乗れなかった。アイコン表示するだけで良いと思うので、確認できるようにしておきたい。</p>
mikutter - 機能 #899 (却下): ツイートする内容を新しいMessageインスタンスに格納し、その内容を投稿する仕組み
https://dev.mikutter.hachune.net/issues/899
2016-09-27T12:47:47Z
toshi_a 初音
toshi.alternative@gmail.com
<p>tweetはどんどん複雑になっていて、 <a class="issue tracker-7 status-5 priority-4 priority-default closed parent" title="環境対応: TwitterのTweet文字数制限の変更 (終了)" href="https://dev.mikutter.hachune.net/issues/890">#890</a> のような仕様変更・追加で投稿APIのインターフェイスがどんどん変わっていってる。<br />この変化を吸収し、クライアントサイドバリデーションの仕組みを共通化するために、Messageクラスに新しいtweetを作成する機能を追加する。</p>
<a name="例"></a>
<h1 >例<a href="#例" class="wiki-anchor">¶</a></h1>
<pre><code class="ruby syntaxhl"><span class="c1"># いままで</span>
<span class="no">Service</span><span class="p">.</span><span class="nf">primary</span><span class="p">.</span><span class="nf">post</span><span class="p">(</span>
<span class="ss">message: </span><span class="s2">"魔剤ンゴ!?"</span><span class="p">,</span>
<span class="ss">receiver: </span><span class="n">toshi_a</span><span class="p">,</span>
<span class="ss">replyto: </span><span class="n">parent_message</span><span class="p">,</span>
<span class="ss">mediaiolist: </span><span class="p">[</span><span class="o">...</span><span class="p">]</span>
<span class="p">)</span>
<span class="c1"># 新しいの</span>
<span class="no">Message</span><span class="p">.</span><span class="nf">new</span><span class="p">(</span>
<span class="ss">user: </span><span class="no">Service</span><span class="p">.</span><span class="nf">primary</span><span class="p">.</span><span class="nf">user_obj</span><span class="p">,</span>
<span class="ss">body: </span><span class="s2">"魔剤ンゴ!?"</span><span class="p">,</span>
<span class="ss">receivers: </span><span class="p">[</span><span class="no">User</span><span class="p">.</span><span class="nf">findbyidname</span><span class="p">(</span><span class="s1">'toshi_a'</span><span class="p">),</span> <span class="o">...</span><span class="p">],</span>
<span class="ss">replyto: </span><span class="n">parent_message</span><span class="p">,</span>
<span class="ss">attachments: </span><span class="p">[</span><span class="o">...</span><span class="p">]</span>
<span class="p">).</span><span class="nf">compose</span>
</code></pre>
<a name="利点"></a>
<h1 >利点<a href="#利点" class="wiki-anchor">¶</a></h1>
<a name="学習コスト低減"></a>
<h2 >学習コスト低減<a href="#学習コスト低減" class="wiki-anchor">¶</a></h2>
<p>ReadとWriteのインターフェイスがMessageに統一されることで、フィールドの名前を知ることでTweetからの値の読み出し・投稿の両方が出来るようになり、覚えることが減る。</p>
<a name="投稿前に情報を取得することが容易になる"></a>
<h2 >投稿前に情報を取得することが容易になる<a href="#投稿前に情報を取得することが容易になる" class="wiki-anchor">¶</a></h2>
<p>Messageには現在でも、ツイートに関する情報を集めるためのメソッドがたくさん用意されているが、これを投稿前に利用しながら、バリデーションなどのユーザへの情報の提供ができる。<br />具体的には、文字列のどの範囲がURLとして扱われるか、hidden header, hidden footerはどこからどこまでかといった情報が提供できると思う。</p>
<a name="懸念"></a>
<h1 >懸念<a href="#懸念" class="wiki-anchor">¶</a></h1>
<a name="IDがない"></a>
<h2 >IDがない<a href="#IDがない" class="wiki-anchor">¶</a></h2>
<p>IDはTwitterが決定するので、新しく作成したインスタンスにはIDがセットされない。Messageを扱う多くの処理が、IDがあることを前提にしているので、後方互換性を保ってこれを行うのは難しいかもしれない。</p>
mikutter - 機能 #875 (却下): Activityの表示のためのMiraclePainter
https://dev.mikutter.hachune.net/issues/875
2016-09-02T23:26:44Z
toshi_a 初音
toshi.alternative@gmail.com
<p>mikutter 3.4のActivity同様、1行で表示する。<br />収まりきらない範囲はカットし、横スクロールは実装しない(できないんだけどね)。</p>
<p>そのままでは、開かない限り通知の全文を見ることができないので、フォーカスされている間だけ複数行表示する。<br />あまりにも行数が長いならそれはタイムライン上からカットして、通知を開いて見てもらう感じにする。</p>
mikutter - 機能 #874 (却下): ActivityのListViewを廃止し、Timelineを使う
https://dev.mikutter.hachune.net/issues/874
2016-09-02T23:25:11Z
toshi_a 初音
toshi.alternative@gmail.com
<p>Activityが独自のListViewになっているので、Timelineを利用する。</p>
<p>これに伴って、mikutter 3.4のような、画面を上下に割って、上にリスト、下に選択されている項目を表示するというのをやめる。</p>
mikutter - 機能 #872 (却下): MiraclePainterをModel毎に提供する
https://dev.mikutter.hachune.net/issues/872
2016-09-02T23:12:07Z
toshi_a 初音
toshi.alternative@gmail.com
<p>現在のmikutterでは、MiraclePainterは全て同じものを使っている。Twitter用の最適化されていて、アイコンやSubPartsといったものが表示されてしまう。<br />Twitter以外のサービスでは基本的にこれは好ましくないので、タイムライン上に表示する時のMiraclePainterをModelから指定できるようにする。</p>
<a name="目的"></a>
<h1 >目的<a href="#目的" class="wiki-anchor">¶</a></h1>
<p>User、ListといったものもTimelineに表示できるようにする。<br />今はUserはGtk::UserList、ListはGtk::ListListといったようにそれぞれ独自のリストビューを定義して表示しているが、どれもModelなのだから、Viewさえ指定すればTimelineで扱えるという状態にしたい。</p>
<a name="雰囲気"></a>
<h1 >雰囲気<a href="#雰囲気" class="wiki-anchor">¶</a></h1>
<pre><code class="ruby syntaxhl"><span class="k">class</span> <span class="nc">MikuPainter</span> <span class="o"><</span> <span class="no">Cairo</span><span class="o">::</span><span class="no">MiraclePainter</span>
<span class="c1"># pixbufとかを書き出す処理をいろいろ書く</span>
<span class="k">end</span>
<span class="k">class</span> <span class="nc">Miku</span> <span class="o"><</span> <span class="no">Retriever</span><span class="o">::</span><span class="no">Model</span>
<span class="n">paint_by</span> <span class="no">MikuPainter</span>
<span class="k">end</span>
</code></pre>
<a name="その他"></a>
<h1 >その他<a href="#その他" class="wiki-anchor">¶</a></h1>
<p>複数のMiraclePainterを提供して選べるようにしても面白いかも。このチケットでは取り扱わない。<br />あとこれもやらないかもしれないけどプラグインが特定のModelに対してMiraclePainterを提供できると便利そう。ツイートを1行で表示するプラグインみたいなものが実現できる可能性がある。</p>
mikutter - 絵 #865 (シール化): mikutter 3.5のアイコン
https://dev.mikutter.hachune.net/issues/865
2016-08-22T15:33:28Z
toshi_a 初音
toshi.alternative@gmail.com
<p><a class="external" href="http://mikutter-ilust.tumblr.com/image/148150671145">http://mikutter-ilust.tumblr.com/image/148150671145</a></p>
<p>これをベースにいくつかデザイン案をよろしく。<br />ディテールは事前打ち合わせのとおり。最初の期日は9/15。たのむゾ〜</p>
mikutter - 機能 #840 (却下): spotlightみたいな機能
https://dev.mikutter.hachune.net/issues/840
2016-05-25T00:56:41Z
toshi_a 初音
toshi.alternative@gmail.com
<p>適当にキーワード打ったらmikutter上のあらゆるリソースからそれっぽいものを引っ張ってきて表示できるような仕組みが欲しい。</p>
<p>コマンドを実行するとポップアップウィンドウを表示し、以下の内容を横断的にインクリメンタルサーチできる</p>
<ul>
<li>タブ</li>
<li>Retriever
<ul>
<li>User(名前、Screen Name)</li>
<li>Message(本文)</li>
</ul></li>
</ul>
<p>当然、サードパーティプラグインが補完候補を拡張・新規提供することができる。補完でなくてもいけるよ</p>
<ul>
<li>入力された内容でTwitter検索</li>
<li>入力された内容でユーザ検索 (New!)</li>
<li>入力されたScreen Nameのユーザを開くことを試みる</li>
</ul>
<p>選ぶと、タブの場合はそれがアクティブになり、Retrieverの場合はopenメソッドが呼ばれる(「開く」アクション)。<br />検索のタブとか不要になるので、非表示にするオプション付けても良いかもしれんね</p>
<p>あと名前募集します。</p>
mikutter - 致命的 #803 (却下): postboxを作成するときにクラッシュ?
https://dev.mikutter.hachune.net/issues/803
2015-12-25T14:23:38Z
toshi_a 初音
toshi.alternative@gmail.com
<p>クラッシュレポート<br /><pre>
/opt/mikutter/core/plugin/gtk/mikutter_window.rb:34:in `new': wrong number of arguments (1 for 2) (ArgumentError)
from /opt/mikutter/core/plugin/gtk/mikutter_window.rb:34:in `add_postbox'
from /opt/mikutter/core/plugin/gtk/gtk.rb:258:in `block (2 levels) in <top (required)>'
from /opt/mikutter/vendor/pluggaloid/listener.rb:21:in `call'
from /opt/mikutter/vendor/pluggaloid/listener.rb:21:in `call'
from /opt/mikutter/vendor/pluggaloid/event.rb:95:in `block (2 levels) in call_all_listeners'
from /opt/mikutter/vendor/pluggaloid/event.rb:94:in `each'
from /opt/mikutter/vendor/pluggaloid/event.rb:94:in `block in call_all_listeners'
from /opt/mikutter/vendor/pluggaloid/event.rb:93:in `catch'
from /opt/mikutter/vendor/pluggaloid/event.rb:93:in `call_all_listeners'
from /opt/mikutter/vendor/pluggaloid/event.rb:49:in `block in call'
from /opt/mikutter/vendor/delayer/procedure.rb:24:in `call'
from /opt/mikutter/vendor/delayer/procedure.rb:24:in `run'
from /opt/mikutter/vendor/delayer/extend.rb:58:in `run_once'
from /opt/mikutter/vendor/delayer/extend.rb:30:in `run'
from /opt/mikutter/vendor/delayer.rb:43:in `method_missing'
from /opt/mikutter/core/plugin/gtk/delayer.rb:10:in `block in boot'
from /opt/mikutter/core/plugin/gtk/mainloop.rb:10:in `call'
from /opt/mikutter/core/plugin/gtk/mainloop.rb:10:in `main'
from /opt/mikutter/core/plugin/gtk/mainloop.rb:10:in `mainloop'
from /opt/mikutter/mikutter.rb:62:in `boot!'
from /opt/mikutter/mikutter.rb:91:in `<main>'
</pre></p>
mikutter - 致命的 #714 (却下): mikutter以外でリストを追加したあとmikutterを起動すると、リスト更新時にクラッシュする?
https://dev.mikutter.hachune.net/issues/714
2014-09-29T01:51:31Z
toshi_a 初音
toshi.alternative@gmail.com
<p>たまに来ているエラー報告。<br />再現出来たが、起動して暫くしたら突然クラッシュした。<br />リストを別のクライアントで追加したことが原因か</p>
<pre>
TypeError destroyed GLib::Object
(eval):1:in `model'
{MIKUTTER_DIR}/core/mui/gtk_listlist.rb:46:in `block in add_hook'
{MIKUTTER_DIR}/core/mui/gtk_listlist.rb:45:in `each'
{MIKUTTER_DIR}/core/mui/gtk_listlist.rb:45:in `add_hook'
{MIKUTTER_DIR}/core/mui/gtk_listlist.rb:27:in `block in set_auto_getter'
{MIKUTTER_DIR}/core/event_listener.rb:25:in `call'
{MIKUTTER_DIR}/core/event_listener.rb:25:in `update'
/usr/local/Cellar/ruby/2.1.2/lib/ruby/2.1.0/observer.rb:196:in `block in notify_observers'
/usr/local/Cellar/ruby/2.1.2/lib/ruby/2.1.0/observer.rb:195:in `each'
/usr/local/Cellar/ruby/2.1.2/lib/ruby/2.1.0/observer.rb:195:in `notify_observers'
{MIKUTTER_DIR}/core/event.rb:46:in `block (2 levels) in call'
{MIKUTTER_DIR}/core/event.rb:46:in `catch'
{MIKUTTER_DIR}/core/event.rb:46:in `block in call'
{MIKUTTER_DIR}/vendor/bundle/ruby/2.1.0/gems/delayer-0.0.2/lib/delayer/procedure.rb:24:in `call'
{MIKUTTER_DIR}/vendor/bundle/ruby/2.1.0/gems/delayer-0.0.2/lib/delayer/procedure.rb:24:in `run'
{MIKUTTER_DIR}/vendor/bundle/ruby/2.1.0/gems/delayer-0.0.2/lib/delayer/extend.rb:58:in `run_once'
{MIKUTTER_DIR}/vendor/bundle/ruby/2.1.0/gems/delayer-0.0.2/lib/delayer/extend.rb:30:in `run'
{MIKUTTER_DIR}/vendor/bundle/ruby/2.1.0/gems/delayer-0.0.2/lib/delayer.rb:43:in `method_missing'
{MIKUTTER_DIR}/core/plugin/gtk/delayer.rb:10:in `block in boot'
{MIKUTTER_DIR}/core/plugin/gtk/mainloop.rb:10:in `call'
{MIKUTTER_DIR}/core/plugin/gtk/mainloop.rb:10:in `main'
{MIKUTTER_DIR}/core/plugin/gtk/mainloop.rb:10:in `mainloop'
mikutter.rb:63:in `boot!'
mikutter.rb:92:in `<main>'
</pre>
mikutter - 機能 #706 (却下): saved searchをデータソースとして提供する
https://dev.mikutter.hachune.net/issues/706
2014-08-05T01:53:45Z
toshi_a 初音
toshi.alternative@gmail.com
<p>saved searchプラグインは、タブの提供をやめて、抽出タブのデータソースを提供する。</p>
<p>saved searchデータソースは、利用されているときだけ自動更新をかける。<br />不要な検索タブが表示されないようになること、データソースとタブが分離するので、起動時にUI上に空のタブが生成されてしまう問題などを回避できる。</p>
<p>ただし、「保存した検索」を削除する機能をどこかにつけなければいけない。現状ではタブのコマンドになっているが、これは無くなる。</p>