やること: チケット
https://dev.mikutter.hachune.net/
https://dev.mikutter.hachune.net/favicon.ico?1619448608
2024-03-16T03:50:32Z
やること
Redmine
mikutter - バグ #1597 (実装待ち): mastodon の public/unlisted/privete/direct のアイコンファイル名を参照しているプラグインがある
https://dev.mikutter.hachune.net/issues/1597
2024-03-16T03:50:32Z
Izumi Tsutsui
tsutsui@ceres.dti.ne.jp
<p><a class="changeset" title="リファクタリング refs #1575" href="https://dev.mikutter.hachune.net/projects/mikutter/repository/main/revisions/a860fae8667de5cade577287066e421a075872ce">a860fae</a> の <a class="source" href="https://dev.mikutter.hachune.net/projects/mikutter/repository/main/revisions/a860fae/entry/plugin/mastodon_gtk/subparts_status_info.rb">source:plugin/mastodon_gtk/subparts_status_info.rb@a860fae</a> 他の変更で<br />mastodon の public/unlisted/private/direct のアイコンファイルが変更されたため、<br />それらのファイル名を直接指定していたプラグインでアイコン表示ができなくなっています。</p>
<p>具体的にはしばふ氏の mastodon_postbox_visibility<br /><a class="external" href="https://github.com/shibafu528/mikutter_mastodon_postbox_visibility/blob/c0c3b15/mastodon_postbox_visibility.rb#L141-L145">https://github.com/shibafu528/mikutter_mastodon_postbox_visibility/blob/c0c3b15/mastodon_postbox_visibility.rb#L141-L145</a><br />で直接参照していて、 <a class="changeset" title="リファクタリング refs #1575" href="https://dev.mikutter.hachune.net/projects/mikutter/repository/main/revisions/a860fae8667de5cade577287066e421a075872ce">a860fae</a> 以降だと少なくとも private と direct のアイコンが error になります。</p>
<p>ただ、これをどう対処するのが正しいのか(mikutter側で互換を残すのか、プラグイン側を直すのか)がよくわかりません。</p>
<pre><code class="ruby syntaxhl"> <span class="vi">@icons</span> <span class="o">=</span> <span class="p">{</span>
<span class="ss">default: </span><span class="s1">'visibility-default.png'</span><span class="p">,</span>
<span class="ss">public: </span><span class="s1">'etc.png'</span><span class="p">,</span>
<span class="ss">unlisted: </span><span class="s1">'unlisted.png'</span><span class="p">,</span>
<span class="ss">private: </span><span class="s1">'private.png'</span><span class="p">,</span>
<span class="ss">direct: </span><span class="s1">'direct.png'</span><span class="p">,</span>
<span class="p">}.</span><span class="nf">freeze</span>
</code></pre>
mikutter - 提案 #1581 (分類待ち): Color Model
https://dev.mikutter.hachune.net/issues/1581
2022-01-16T03:51:58Z
toshi_a 初音
toshi.alternative@gmail.com
<p>mikutter上で色を表現するデータオブジェクトを標準提供する。</p>
<a name="やりたいこと"></a>
<h1 >やりたいこと<a href="#やりたいこと" class="wiki-anchor">¶</a></h1>
現在、色情報を利用する場面は以下のとおりだが、色の表現方法が異なる:
<table>
<tr>
<th>名前</th>
<th>形式</th>
<th>値の範囲</th>
</tr>
<tr>
<td> UserConfig </td>
<td> RGB </td>
<td> 0..0xffff </td>
</tr>
<tr>
<td> Cairo::Color::RGB </td>
<td> RGBA </td>
<td> 0..1 (Float) </td>
</tr>
<tr>
<td> Gtk::Color </td>
<td> RGB </td>
<td> 0..0xffff </td>
</tr>
<tr>
<td> Gdk::RGBA </td>
<td> RGBA </td>
<td> 0..1 (Float) </td>
</tr>
<tr>
<td> CSS </td>
<td> RGB </td>
<td> 0..0xff </td>
</tr>
</table>
<p>現状だと、色をどこで利用するかによって適切に変換しなければならない。<br />異なるクラスなのは仕方ないにしても、UserConfigからCairoに変換するために、各要素を0xffffで割るみたいな処理を毎回実装しなければならない。</p>
<p>レンダリングを行う層以外ではそういった詳細には立ち入りたくないし、現にGtk3移行のときに変換処理がバグっていたことがあった。</p>
<p>mikutterプラグインの共通の色の表現があると、こういった問題を解決できる。</p>
<a name="インターフェイス"></a>
<h1 >インターフェイス<a href="#インターフェイス" class="wiki-anchor">¶</a></h1>
<p>RGBAの要素のみを要求する。<br />精度は、各要素を8bitで返すインターフェイスと、0-1のFloatやRationalで返すインターフェイスが考えられる。<br />アルファブレンド値自体は、無いと困るケースがあるので、このデータオブジェクトで表現に対応する。</p>
<p>ディスプレイは1677万色の表現能力しか持っておらず、24bit (0-255)で十分表現できる。したがって、現在採用しているほとんどの表現形式が過剰である。<br />また、これは人間の識別精度を十分超えているらしく、mikutterのユーザは今のところ地球人のみであると考えているので、これ以上の精度は不要である。</p>
<p>以上のことから、各8bitでも十分である。</p>
<p>一方で、0-1で表現すると、計算が楽で、何をやっているのかわかりやすいというメリットがある。<br /><pre><code class="c++ syntaxhl"><span class="kt">uint16_t</span> <span class="nf">conv</span><span class="p">(</span><span class="kt">uint8_t</span> <span class="n">c</span><span class="p">)</span> <span class="p">{</span>
<span class="k">return</span> <span class="n">c</span> <span class="o">*</span> <span class="mh">0x101</span><span class="p">;</span>
<span class="p">}</span>
<span class="kt">uint16_t</span> <span class="nf">conv</span><span class="p">(</span><span class="kt">float</span> <span class="n">c</span><span class="p">)</span> <span class="p">{</span>
<span class="k">return</span> <span class="n">c</span> <span class="o">*</span> <span class="mh">0xffff</span><span class="p">;</span>
<span class="p">}</span>
</code></pre><br />ん〜どうしよっかな〜</p>
<a name="永続化について"></a>
<h1 >永続化について<a href="#永続化について" class="wiki-anchor">¶</a></h1>
<p>UserConfigは古いバージョンとの互換性のために現在の形式を維持しなければならない。</p>
<a name="表現"></a>
<h1 >表現<a href="#表現" class="wiki-anchor">¶</a></h1>
<p>各データクラスは、異なる方法でデータを保持するが、同じインターフェイスを持っている。</p>
<p>TrueColor (32bit color)<br /><pre><code class="ruby syntaxhl"><span class="no">Color</span><span class="p">.</span><span class="nf">new</span><span class="p">(</span><span class="mi">255</span><span class="p">,</span> <span class="mi">0</span><span class="p">,</span> <span class="mi">0</span><span class="p">)</span> <span class="c1"># red</span>
<span class="no">Color</span><span class="p">.</span><span class="nf">new</span><span class="p">(</span><span class="mi">255</span><span class="p">,</span> <span class="mi">0</span><span class="p">,</span> <span class="mi">0</span><span class="p">,</span> <span class="mi">0</span><span class="p">)</span> <span class="c1"># red</span>
<span class="no">Color</span><span class="p">.</span><span class="nf">parse</span><span class="p">(</span><span class="s1">'#FF0000'</span><span class="p">)</span> <span class="c1"># red</span>
</code></pre></p>
<p>ContinuouslyColor<br /><pre><code class="ruby syntaxhl"><span class="no">ContinuouslyColor</span><span class="p">.</span><span class="nf">new</span><span class="p">(</span><span class="mf">1.0</span><span class="p">,</span> <span class="mi">0</span><span class="p">,</span> <span class="mi">0</span><span class="p">)</span> <span class="c1"># red</span>
<span class="no">ContinuouslyColor</span><span class="p">.</span><span class="nf">new</span><span class="p">(</span><span class="mf">1.0</span><span class="p">,</span> <span class="mi">0</span><span class="p">,</span> <span class="mi">0</span><span class="p">,</span> <span class="mi">0</span><span class="p">)</span> <span class="c1"># red</span>
</code></pre><br />同じインターフェイスを実装しColor Modelの要件を満たす独自の実装をプラグインが行うことによって、mikutterの色の表現方法を拡張できるように注意する。</p>
<a name="操作"></a>
<h1 >操作<a href="#操作" class="wiki-anchor">¶</a></h1>
<p>spellを使った場合、結果は必ずPromiseを受け取ることになる。色の操作はリアルタイム性が求められることが多く、spellは不適切である。<br />よくありそうな操作についてはColor Pluginで用意する。</p>
<a name="UserConfigの読み込み書き出し"></a>
<h2 >UserConfigの読み込み、書き出し<a href="#UserConfigの読み込み書き出し" class="wiki-anchor">¶</a></h2>
<p>RGBAの各要素は同じ方法で取得できるため、UserConfigに書き出せるはず。<br />現実的には、今の所UserConfigはあらゆるModelを永続化するような機能はもっていないため、別のところに変換ルーチンを実装しなければならない。<br /><pre><code class="ruby syntaxhl"><span class="n">c</span> <span class="o">=</span> <span class="no">Plugin</span><span class="o">::</span><span class="no">Color</span><span class="p">.</span><span class="nf">new</span><span class="p">(</span><span class="mi">255</span><span class="p">,</span> <span class="mi">255</span><span class="p">,</span> <span class="mi">255</span><span class="p">)</span>
<span class="no">UserConfig</span><span class="p">[</span><span class="ss">:color</span><span class="p">]</span> <span class="o">=</span> <span class="n">c</span> <span class="c1"># 理想</span>
<span class="no">UserConfig</span><span class="p">[</span><span class="ss">:color</span><span class="p">]</span> <span class="o">=</span> <span class="no">Color</span><span class="p">.</span><span class="nf">export_to_user_config</span><span class="p">(</span><span class="n">c</span><span class="p">)</span> <span class="c1"># 現実</span>
</code></pre><br />一方、読み込みはColor Modelだったらどんなものに復元しても良いため、もう少し直接的になりそう。<br /><pre><code class="ruby syntaxhl"><span class="n">c</span> <span class="o">=</span> <span class="no">UserConfig</span><span class="p">[</span><span class="ss">:color</span><span class="p">]</span> <span class="c1"># 理想</span>
<span class="no">Plugin</span><span class="o">::</span><span class="no">UserConfigColor</span><span class="p">.</span><span class="nf">new</span><span class="p">(</span><span class="ss">:color</span><span class="p">)</span> <span class="c1"># こういうのがあってもよい?</span>
</code></pre></p>
<a name="印字変換"></a>
<h2 >印字、変換<a href="#印字変換" class="wiki-anchor">¶</a></h2>
<p>例えばHTML形式で印字したいなど。すべてのColor Modelに実装を要求すると印字形式が拡張できないが、インターフェイスが統一されているのでどうとでもなる。<br /><pre><code class="ruby syntaxhl"><span class="k">def</span> <span class="nf">html_color</span><span class="p">(</span><span class="n">color</span><span class="p">)</span>
<span class="s1">'#%02f%02f%02f'</span><span class="p">.</span><span class="nf">format</span><span class="p">(</span><span class="n">color</span><span class="p">.</span><span class="nf">r</span><span class="p">,</span> <span class="n">color</span><span class="p">.</span><span class="nf">g</span><span class="p">,</span> <span class="n">color</span><span class="p">.</span><span class="nf">b</span><span class="p">)</span>
<span class="k">end</span>
</code></pre><br />Cairo::Colorに変換するといった処理は、gtk3プラグインなどが各々提供する。<br /><pre><code class="ruby syntaxhl"><span class="no">Plugin</span><span class="o">::</span><span class="no">Gtk3</span><span class="p">.</span><span class="nf">cairo_color</span><span class="p">(</span><span class="n">c</span><span class="p">)</span>
</code></pre></p>
<a name="比較"></a>
<h2 >比較<a href="#比較" class="wiki-anchor">¶</a></h2>
<p>==で比較する場合、RGBA各要素を0-255で表現した値が等しければ等しいとする。<br />Color Modelインターフェイスの精度以上で比較する意味がないからである。</p>
<p>同様に、eql?とhashもすべてのColorModelが同じ計算式で値を算出しなければならない。</p>
<p>大小比較は、多分ソートすることがないので別にいいや</p>
<a name="標準色"></a>
<h2 >標準色<a href="#標準色" class="wiki-anchor">¶</a></h2>
<pre><code class="ruby syntaxhl"><span class="n">c</span> <span class="o">=</span> <span class="no">Plugin</span><span class="o">::</span><span class="no">Color</span><span class="o">::</span><span class="no">RED</span>
</code></pre>
<p>16色とか256色とか用意する。</p>
<a name="備考"></a>
<h1 >備考<a href="#備考" class="wiki-anchor">¶</a></h1>
<p><a href="https://github.com/red-data-tools/red-colors" class="external">red-colros gem</a> は採用しない。<br />目的に対してできることが多すぎるため。<br />あと、色に対する複雑な演算をしたいわけじゃないので、その程度の理由で直接依存を増やしたくない。</p>
<p>Diva::Modelのatomic typeとして追加することも考えたが、wellknownではあるけどatomicではないかな</p>
mikutter - 提案 #1565 (分類待ち): mastodon_restプラグインとmastodon_sse_streamingプラグインの統合
https://dev.mikutter.hachune.net/issues/1565
2021-12-31T09:21:54Z
toshi_a 初音
toshi.alternative@gmail.com
<p><a class="issue tracker-12 status-5 priority-4 priority-default closed" title="提案: 起動時、直近のリプライが読み込まれない (終了)" href="https://dev.mikutter.hachune.net/issues/1427">#1427</a> の派生タスク。<br />この2つのプラグインは、Mastodonからデータを取ってきてデータソースの更新やイベントの発行を行っている。<br />データソースを使うとき、データの取得方法には関心がないので、別々に制御する必要がない。<br />mastodon_sse_streamingのAPI接続の方法としてREST APIの定期アクセスを実装すればシンプルに収まりそうなので、統合を検討してみる。</p>
mikutter - バグ #1558 (実装待ち): mikutter 5.0 AppImage出力ができない
https://dev.mikutter.hachune.net/issues/1558
2021-12-19T14:42:56Z
toshi_a 初音
toshi.alternative@gmail.com
<p>Gtk3になったことで現在のAppImageビルド用のスクリプトが使えなくなったので対応する。<br />また、Ubuntu 16.04のサポートは終わっているため、Ubuntu 18.04でAppImageを作る。</p>
mikutter - バグ #1485 (実装待ち): libpango >= 1.48.3 の環境で AppImage 版がクラッシュして起動しない
https://dev.mikutter.hachune.net/issues/1485
2021-03-17T12:17:51Z
goma sy
<p><a class="external" href="https://aur.archlinux.org/packages/mikutter/#comment-796812">https://aur.archlinux.org/packages/mikutter/#comment-796812</a><br />AUR にてコメントが有りましたので確認したところ、再現しました。<br />libpango が 1.48.3 以降だと起動できないようです。(1.48.2 はクラッシュせず)<br /><a class="issue tracker-1 status-5 priority-4 priority-default closed" title="バグ: libpangoが新しめのLinux環境でAppImage版を起動するとクラッシュする (終了)" href="https://dev.mikutter.hachune.net/issues/1416">#1416</a> と同じような問題に思えます。</p>
<pre>
g_module_open() failed for /tmp/.mount_mikuttJHbYoi/usr/lib/gdk-pixbuf-2.0/2.10.0/loaders/libpixbufloader-svg.so: /usr/lib/libpangoft2-1.0.so.0: undefined symbol: g_task_set_name
(null)-WARNING **: Failed to load shared library 'libpangocairo-1.0.so.0' referenced by the typelib: /usr/lib/libpangoft2-1.0.so.0: undefined symbol: g_task_set_name
from /tmp/.mount_mikuttJHbYoi/usr/lib/ruby/gems/2.6.0/gems/gobject-introspection-3.4.1/lib/gobject-introspection/loader.rb:544:in `load_interface_info'
from /tmp/.mount_mikuttJHbYoi/usr/lib/ruby/gems/2.6.0/gems/gobject-introspection-3.4.1/lib/gobject-introspection/loader.rb:70:in `load_info'
from /tmp/.mount_mikuttJHbYoi/usr/lib/ruby/gems/2.6.0/gems/gobject-introspection-3.4.1/lib/gobject-introspection/loader.rb:40:in `block in load'
from /tmp/.mount_mikuttJHbYoi/usr/lib/ruby/gems/2.6.0/gems/gobject-introspection-3.4.1/lib/gobject-introspection/repository.rb:34:in `block (2 levels) in each'
from /tmp/.mount_mikuttJHbYoi/usr/lib/ruby/gems/2.6.0/gems/gobject-introspection-3.4.1/lib/gobject-introspection/repository.rb:33:in `times'
from /tmp/.mount_mikuttJHbYoi/usr/lib/ruby/gems/2.6.0/gems/gobject-introspection-3.4.1/lib/gobject-introspection/repository.rb:33:in `block in each'
from /tmp/.mount_mikuttJHbYoi/usr/lib/ruby/gems/2.6.0/gems/gobject-introspection-3.4.1/lib/gobject-introspection/repository.rb:32:in `each'
from /tmp/.mount_mikuttJHbYoi/usr/lib/ruby/gems/2.6.0/gems/gobject-introspection-3.4.1/lib/gobject-introspection/repository.rb:32:in `each'
from /tmp/.mount_mikuttJHbYoi/usr/lib/ruby/gems/2.6.0/gems/gobject-introspection-3.4.1/lib/gobject-introspection/loader.rb:39:in `load'
from /tmp/.mount_mikuttJHbYoi/usr/lib/ruby/gems/2.6.0/gems/pango-3.4.1/lib/pango.rb:32:in `<module:Pango>'
from /tmp/.mount_mikuttJHbYoi/usr/lib/ruby/gems/2.6.0/gems/pango-3.4.1/lib/pango.rb:24:in `<top (required)>'
from /tmp/.mount_mikuttJHbYoi/usr/lib/ruby/2.6.0/rubygems/core_ext/kernel_require.rb:54:in `require'
from /tmp/.mount_mikuttJHbYoi/usr/lib/ruby/2.6.0/rubygems/core_ext/kernel_require.rb:54:in `require'
from /tmp/.mount_mikuttJHbYoi/usr/lib/ruby/gems/2.6.0/gems/gtk2-3.4.1/lib/gtk2/base.rb:14:in `<top (required)>'
from /tmp/.mount_mikuttJHbYoi/usr/lib/ruby/2.6.0/rubygems/core_ext/kernel_require.rb:54:in `require'
from /tmp/.mount_mikuttJHbYoi/usr/lib/ruby/2.6.0/rubygems/core_ext/kernel_require.rb:54:in `require'
from /tmp/.mount_mikuttJHbYoi/usr/lib/ruby/gems/2.6.0/gems/gtk2-3.4.1/lib/gtk2.rb:11:in `<top (required)>'
from /tmp/.mount_mikuttJHbYoi/usr/lib/ruby/2.6.0/rubygems/core_ext/kernel_require.rb:130:in `require'
from /tmp/.mount_mikuttJHbYoi/usr/lib/ruby/2.6.0/rubygems/core_ext/kernel_require.rb:130:in `rescue in require'
from /tmp/.mount_mikuttJHbYoi/usr/lib/ruby/2.6.0/rubygems/core_ext/kernel_require.rb:34:in `require'
from /tmp/.mount_mikuttJHbYoi/usr/share/mikutter/core/mui/cairo_miracle_painter.rb:3:in `<top (required)>'
from /tmp/.mount_mikuttJHbYoi/usr/lib/ruby/2.6.0/rubygems/core_ext/kernel_require.rb:54:in `require'
from /tmp/.mount_mikuttJHbYoi/usr/lib/ruby/2.6.0/rubygems/core_ext/kernel_require.rb:54:in `require'
from /tmp/.mount_mikuttJHbYoi/usr/share/mikutter/core/mui/cairo_cell_renderer_message.rb:3:in `<top (required)>'
from /tmp/.mount_mikuttJHbYoi/usr/lib/ruby/2.6.0/rubygems/core_ext/kernel_require.rb:54:in `require'
from /tmp/.mount_mikuttJHbYoi/usr/lib/ruby/2.6.0/rubygems/core_ext/kernel_require.rb:54:in `require'
from /tmp/.mount_mikuttJHbYoi/usr/share/mikutter/plugin/gtk/gtk.rb:5:in `<top (required)>'
from /tmp/.mount_mikuttJHbYoi/usr/share/mikutter/core/miquire_plugin.rb:157:in `load'
from /tmp/.mount_mikuttJHbYoi/usr/share/mikutter/core/miquire_plugin.rb:157:in `block in load'
from /tmp/.mount_mikuttJHbYoi/usr/share/mikutter/core/utils.rb:288:in `block in atomic'
from /tmp/.mount_mikuttJHbYoi/usr/lib/ruby/2.6.0/monitor.rb:235:in `mon_synchronize'
from /tmp/.mount_mikuttJHbYoi/usr/share/mikutter/core/utils.rb:288:in `atomic'
from /tmp/.mount_mikuttJHbYoi/usr/share/mikutter/core/miquire_plugin.rb:147:in `load'
from /tmp/.mount_mikuttJHbYoi/usr/share/mikutter/core/miquire_plugin.rb:149:in `block (2 levels) in load'
from /tmp/.mount_mikuttJHbYoi/usr/share/mikutter/core/miquire_plugin.rb:148:in `each'
from /tmp/.mount_mikuttJHbYoi/usr/share/mikutter/core/miquire_plugin.rb:148:in `block in load'
from /tmp/.mount_mikuttJHbYoi/usr/share/mikutter/core/utils.rb:288:in `block in atomic'
from /tmp/.mount_mikuttJHbYoi/usr/lib/ruby/2.6.0/monitor.rb:235:in `mon_synchronize'
from /tmp/.mount_mikuttJHbYoi/usr/share/mikutter/core/utils.rb:288:in `atomic'
from /tmp/.mount_mikuttJHbYoi/usr/share/mikutter/core/miquire_plugin.rb:147:in `load'
from /tmp/.mount_mikuttJHbYoi/usr/share/mikutter/core/miquire_plugin.rb:149:in `block (2 levels) in load'
from /tmp/.mount_mikuttJHbYoi/usr/share/mikutter/core/miquire_plugin.rb:148:in `each'
from /tmp/.mount_mikuttJHbYoi/usr/share/mikutter/core/miquire_plugin.rb:148:in `block in load'
from /tmp/.mount_mikuttJHbYoi/usr/share/mikutter/core/utils.rb:288:in `block in atomic'
from /tmp/.mount_mikuttJHbYoi/usr/lib/ruby/2.6.0/monitor.rb:235:in `mon_synchronize'
from /tmp/.mount_mikuttJHbYoi/usr/share/mikutter/core/utils.rb:288:in `atomic'
from /tmp/.mount_mikuttJHbYoi/usr/share/mikutter/core/miquire_plugin.rb:147:in `load'
from /tmp/.mount_mikuttJHbYoi/usr/share/mikutter/core/miquire_plugin.rb:99:in `block in load_all'
from /tmp/.mount_mikuttJHbYoi/usr/share/mikutter/core/miquire_plugin.rb:40:in `block in each_spec'
from /tmp/.mount_mikuttJHbYoi/usr/share/mikutter/core/miquire_plugin.rb:35:in `each'
from /tmp/.mount_mikuttJHbYoi/usr/share/mikutter/core/miquire_plugin.rb:35:in `each'
from /tmp/.mount_mikuttJHbYoi/usr/share/mikutter/core/miquire_plugin.rb:38:in `each_spec'
from /tmp/.mount_mikuttJHbYoi/usr/share/mikutter/core/miquire_plugin.rb:98:in `load_all'
from /tmp/.mount_mikuttJHbYoi/usr/share/mikutter/core/boot/load_plugin.rb:13:in `<top (required)>'
from /tmp/.mount_mikuttJHbYoi/usr/lib/ruby/2.6.0/rubygems/core_ext/kernel_require.rb:54:in `require'
from /tmp/.mount_mikuttJHbYoi/usr/lib/ruby/2.6.0/rubygems/core_ext/kernel_require.rb:54:in `require'
from /tmp/.mount_mikuttJHbYoi/usr/share/mikutter/mikutter.rb:56:in `<main>'
(null)-WARNING **: Failed to load shared library 'libpangoft2-1.0.so.0' referenced by the typelib: /usr/lib/libpangoft2-1.0.so.0: undefined symbol: g_task_set_name
from /tmp/.mount_mikuttJHbYoi/usr/lib/ruby/gems/2.6.0/gems/gobject-introspection-3.4.1/lib/gobject-introspection/loader.rb:544:in `load_interface_info'
from /tmp/.mount_mikuttJHbYoi/usr/lib/ruby/gems/2.6.0/gems/gobject-introspection-3.4.1/lib/gobject-introspection/loader.rb:70:in `load_info'
from /tmp/.mount_mikuttJHbYoi/usr/lib/ruby/gems/2.6.0/gems/gobject-introspection-3.4.1/lib/gobject-introspection/loader.rb:40:in `block in load'
from /tmp/.mount_mikuttJHbYoi/usr/lib/ruby/gems/2.6.0/gems/gobject-introspection-3.4.1/lib/gobject-introspection/repository.rb:34:in `block (2 levels) in each'
from /tmp/.mount_mikuttJHbYoi/usr/lib/ruby/gems/2.6.0/gems/gobject-introspection-3.4.1/lib/gobject-introspection/repository.rb:33:in `times'
from /tmp/.mount_mikuttJHbYoi/usr/lib/ruby/gems/2.6.0/gems/gobject-introspection-3.4.1/lib/gobject-introspection/repository.rb:33:in `block in each'
from /tmp/.mount_mikuttJHbYoi/usr/lib/ruby/gems/2.6.0/gems/gobject-introspection-3.4.1/lib/gobject-introspection/repository.rb:32:in `each'
from /tmp/.mount_mikuttJHbYoi/usr/lib/ruby/gems/2.6.0/gems/gobject-introspection-3.4.1/lib/gobject-introspection/repository.rb:32:in `each'
from /tmp/.mount_mikuttJHbYoi/usr/lib/ruby/gems/2.6.0/gems/gobject-introspection-3.4.1/lib/gobject-introspection/loader.rb:39:in `load'
from /tmp/.mount_mikuttJHbYoi/usr/lib/ruby/gems/2.6.0/gems/pango-3.4.1/lib/pango.rb:32:in `<module:Pango>'
from /tmp/.mount_mikuttJHbYoi/usr/lib/ruby/gems/2.6.0/gems/pango-3.4.1/lib/pango.rb:24:in `<top (required)>'
from /tmp/.mount_mikuttJHbYoi/usr/lib/ruby/2.6.0/rubygems/core_ext/kernel_require.rb:54:in `require'
from /tmp/.mount_mikuttJHbYoi/usr/lib/ruby/2.6.0/rubygems/core_ext/kernel_require.rb:54:in `require'
from /tmp/.mount_mikuttJHbYoi/usr/lib/ruby/gems/2.6.0/gems/gtk2-3.4.1/lib/gtk2/base.rb:14:in `<top (required)>'
from /tmp/.mount_mikuttJHbYoi/usr/lib/ruby/2.6.0/rubygems/core_ext/kernel_require.rb:54:in `require'
from /tmp/.mount_mikuttJHbYoi/usr/lib/ruby/2.6.0/rubygems/core_ext/kernel_require.rb:54:in `require'
from /tmp/.mount_mikuttJHbYoi/usr/lib/ruby/gems/2.6.0/gems/gtk2-3.4.1/lib/gtk2.rb:11:in `<top (required)>'
from /tmp/.mount_mikuttJHbYoi/usr/lib/ruby/2.6.0/rubygems/core_ext/kernel_require.rb:130:in `require'
from /tmp/.mount_mikuttJHbYoi/usr/lib/ruby/2.6.0/rubygems/core_ext/kernel_require.rb:130:in `rescue in require'
from /tmp/.mount_mikuttJHbYoi/usr/lib/ruby/2.6.0/rubygems/core_ext/kernel_require.rb:34:in `require'
from /tmp/.mount_mikuttJHbYoi/usr/share/mikutter/core/mui/cairo_miracle_painter.rb:3:in `<top (required)>'
from /tmp/.mount_mikuttJHbYoi/usr/lib/ruby/2.6.0/rubygems/core_ext/kernel_require.rb:54:in `require'
from /tmp/.mount_mikuttJHbYoi/usr/lib/ruby/2.6.0/rubygems/core_ext/kernel_require.rb:54:in `require'
from /tmp/.mount_mikuttJHbYoi/usr/share/mikutter/core/mui/cairo_cell_renderer_message.rb:3:in `<top (required)>'
from /tmp/.mount_mikuttJHbYoi/usr/lib/ruby/2.6.0/rubygems/core_ext/kernel_require.rb:54:in `require'
from /tmp/.mount_mikuttJHbYoi/usr/lib/ruby/2.6.0/rubygems/core_ext/kernel_require.rb:54:in `require'
from /tmp/.mount_mikuttJHbYoi/usr/share/mikutter/plugin/gtk/gtk.rb:5:in `<top (required)>'
from /tmp/.mount_mikuttJHbYoi/usr/share/mikutter/core/miquire_plugin.rb:157:in `load'
from /tmp/.mount_mikuttJHbYoi/usr/share/mikutter/core/miquire_plugin.rb:157:in `block in load'
from /tmp/.mount_mikuttJHbYoi/usr/share/mikutter/core/utils.rb:288:in `block in atomic'
from /tmp/.mount_mikuttJHbYoi/usr/lib/ruby/2.6.0/monitor.rb:235:in `mon_synchronize'
from /tmp/.mount_mikuttJHbYoi/usr/share/mikutter/core/utils.rb:288:in `atomic'
from /tmp/.mount_mikuttJHbYoi/usr/share/mikutter/core/miquire_plugin.rb:147:in `load'
from /tmp/.mount_mikuttJHbYoi/usr/share/mikutter/core/miquire_plugin.rb:149:in `block (2 levels) in load'
from /tmp/.mount_mikuttJHbYoi/usr/share/mikutter/core/miquire_plugin.rb:148:in `each'
from /tmp/.mount_mikuttJHbYoi/usr/share/mikutter/core/miquire_plugin.rb:148:in `block in load'
from /tmp/.mount_mikuttJHbYoi/usr/share/mikutter/core/utils.rb:288:in `block in atomic'
from /tmp/.mount_mikuttJHbYoi/usr/lib/ruby/2.6.0/monitor.rb:235:in `mon_synchronize'
from /tmp/.mount_mikuttJHbYoi/usr/share/mikutter/core/utils.rb:288:in `atomic'
from /tmp/.mount_mikuttJHbYoi/usr/share/mikutter/core/miquire_plugin.rb:147:in `load'
from /tmp/.mount_mikuttJHbYoi/usr/share/mikutter/core/miquire_plugin.rb:149:in `block (2 levels) in load'
from /tmp/.mount_mikuttJHbYoi/usr/share/mikutter/core/miquire_plugin.rb:148:in `each'
from /tmp/.mount_mikuttJHbYoi/usr/share/mikutter/core/miquire_plugin.rb:148:in `block in load'
from /tmp/.mount_mikuttJHbYoi/usr/share/mikutter/core/utils.rb:288:in `block in atomic'
from /tmp/.mount_mikuttJHbYoi/usr/lib/ruby/2.6.0/monitor.rb:235:in `mon_synchronize'
from /tmp/.mount_mikuttJHbYoi/usr/share/mikutter/core/utils.rb:288:in `atomic'
from /tmp/.mount_mikuttJHbYoi/usr/share/mikutter/core/miquire_plugin.rb:147:in `load'
from /tmp/.mount_mikuttJHbYoi/usr/share/mikutter/core/miquire_plugin.rb:99:in `block in load_all'
from /tmp/.mount_mikuttJHbYoi/usr/share/mikutter/core/miquire_plugin.rb:40:in `block in each_spec'
from /tmp/.mount_mikuttJHbYoi/usr/share/mikutter/core/miquire_plugin.rb:35:in `each'
from /tmp/.mount_mikuttJHbYoi/usr/share/mikutter/core/miquire_plugin.rb:35:in `each'
from /tmp/.mount_mikuttJHbYoi/usr/share/mikutter/core/miquire_plugin.rb:38:in `each_spec'
from /tmp/.mount_mikuttJHbYoi/usr/share/mikutter/core/miquire_plugin.rb:98:in `load_all'
from /tmp/.mount_mikuttJHbYoi/usr/share/mikutter/core/boot/load_plugin.rb:13:in `<top (required)>'
from /tmp/.mount_mikuttJHbYoi/usr/lib/ruby/2.6.0/rubygems/core_ext/kernel_require.rb:54:in `require'
from /tmp/.mount_mikuttJHbYoi/usr/lib/ruby/2.6.0/rubygems/core_ext/kernel_require.rb:54:in `require'
from /tmp/.mount_mikuttJHbYoi/usr/share/mikutter/mikutter.rb:56:in `<main>'
/tmp/.mount_mikuttJHbYoi/usr/lib/ruby/2.6.0/rubygems/core_ext/kernel_require.rb:130:in `require': /usr/lib/libpangoft2-1.0.so.0: undefined symbol: g_task_set_name - /tmp/.mount_mikuttJHbYoi/usr/lib/ruby/gems/2.6.0/gems/gtk2-3.4.1/lib/gtk2.so (LoadError)
from /tmp/.mount_mikuttJHbYoi/usr/lib/ruby/2.6.0/rubygems/core_ext/kernel_require.rb:130:in `rescue in require'
from /tmp/.mount_mikuttJHbYoi/usr/lib/ruby/2.6.0/rubygems/core_ext/kernel_require.rb:34:in `require'
from /tmp/.mount_mikuttJHbYoi/usr/lib/ruby/gems/2.6.0/gems/gtk2-3.4.1/lib/gtk2/base.rb:17:in `<top (required)>'
from /tmp/.mount_mikuttJHbYoi/usr/lib/ruby/2.6.0/rubygems/core_ext/kernel_require.rb:54:in `require'
from /tmp/.mount_mikuttJHbYoi/usr/lib/ruby/2.6.0/rubygems/core_ext/kernel_require.rb:54:in `require'
from /tmp/.mount_mikuttJHbYoi/usr/lib/ruby/gems/2.6.0/gems/gtk2-3.4.1/lib/gtk2.rb:11:in `<top (required)>'
from /tmp/.mount_mikuttJHbYoi/usr/lib/ruby/2.6.0/rubygems/core_ext/kernel_require.rb:130:in `require'
from /tmp/.mount_mikuttJHbYoi/usr/lib/ruby/2.6.0/rubygems/core_ext/kernel_require.rb:130:in `rescue in require'
from /tmp/.mount_mikuttJHbYoi/usr/lib/ruby/2.6.0/rubygems/core_ext/kernel_require.rb:34:in `require'
from /tmp/.mount_mikuttJHbYoi/usr/share/mikutter/core/mui/cairo_miracle_painter.rb:3:in `<top (required)>'
from /tmp/.mount_mikuttJHbYoi/usr/lib/ruby/2.6.0/rubygems/core_ext/kernel_require.rb:54:in `require'
from /tmp/.mount_mikuttJHbYoi/usr/lib/ruby/2.6.0/rubygems/core_ext/kernel_require.rb:54:in `require'
from /tmp/.mount_mikuttJHbYoi/usr/share/mikutter/core/mui/cairo_cell_renderer_message.rb:3:in `<top (required)>'
from /tmp/.mount_mikuttJHbYoi/usr/lib/ruby/2.6.0/rubygems/core_ext/kernel_require.rb:54:in `require'
from /tmp/.mount_mikuttJHbYoi/usr/lib/ruby/2.6.0/rubygems/core_ext/kernel_require.rb:54:in `require'
from /tmp/.mount_mikuttJHbYoi/usr/share/mikutter/plugin/gtk/gtk.rb:5:in `<top (required)>'
from /tmp/.mount_mikuttJHbYoi/usr/share/mikutter/core/miquire_plugin.rb:157:in `load'
from /tmp/.mount_mikuttJHbYoi/usr/share/mikutter/core/miquire_plugin.rb:157:in `block in load'
from /tmp/.mount_mikuttJHbYoi/usr/share/mikutter/core/utils.rb:288:in `block in atomic'
from /tmp/.mount_mikuttJHbYoi/usr/lib/ruby/2.6.0/monitor.rb:235:in `mon_synchronize'
from /tmp/.mount_mikuttJHbYoi/usr/share/mikutter/core/utils.rb:288:in `atomic'
from /tmp/.mount_mikuttJHbYoi/usr/share/mikutter/core/miquire_plugin.rb:147:in `load'
from /tmp/.mount_mikuttJHbYoi/usr/share/mikutter/core/miquire_plugin.rb:149:in `block (2 levels) in load'
from /tmp/.mount_mikuttJHbYoi/usr/share/mikutter/core/miquire_plugin.rb:148:in `each'
from /tmp/.mount_mikuttJHbYoi/usr/share/mikutter/core/miquire_plugin.rb:148:in `block in load'
from /tmp/.mount_mikuttJHbYoi/usr/share/mikutter/core/utils.rb:288:in `block in atomic'
from /tmp/.mount_mikuttJHbYoi/usr/lib/ruby/2.6.0/monitor.rb:235:in `mon_synchronize'
from /tmp/.mount_mikuttJHbYoi/usr/share/mikutter/core/utils.rb:288:in `atomic'
from /tmp/.mount_mikuttJHbYoi/usr/share/mikutter/core/miquire_plugin.rb:147:in `load'
from /tmp/.mount_mikuttJHbYoi/usr/share/mikutter/core/miquire_plugin.rb:149:in `block (2 levels) in load'
from /tmp/.mount_mikuttJHbYoi/usr/share/mikutter/core/miquire_plugin.rb:148:in `each'
from /tmp/.mount_mikuttJHbYoi/usr/share/mikutter/core/miquire_plugin.rb:148:in `block in load'
from /tmp/.mount_mikuttJHbYoi/usr/share/mikutter/core/utils.rb:288:in `block in atomic'
from /tmp/.mount_mikuttJHbYoi/usr/lib/ruby/2.6.0/monitor.rb:235:in `mon_synchronize'
from /tmp/.mount_mikuttJHbYoi/usr/share/mikutter/core/utils.rb:288:in `atomic'
from /tmp/.mount_mikuttJHbYoi/usr/share/mikutter/core/miquire_plugin.rb:147:in `load'
from /tmp/.mount_mikuttJHbYoi/usr/share/mikutter/core/miquire_plugin.rb:99:in `block in load_all'
from /tmp/.mount_mikuttJHbYoi/usr/share/mikutter/core/miquire_plugin.rb:40:in `block in each_spec'
from /tmp/.mount_mikuttJHbYoi/usr/share/mikutter/core/miquire_plugin.rb:35:in `each'
from /tmp/.mount_mikuttJHbYoi/usr/share/mikutter/core/miquire_plugin.rb:35:in `each'
from /tmp/.mount_mikuttJHbYoi/usr/share/mikutter/core/miquire_plugin.rb:38:in `each_spec'
from /tmp/.mount_mikuttJHbYoi/usr/share/mikutter/core/miquire_plugin.rb:98:in `load_all'
from /tmp/.mount_mikuttJHbYoi/usr/share/mikutter/core/boot/load_plugin.rb:13:in `<top (required)>'
from /tmp/.mount_mikuttJHbYoi/usr/lib/ruby/2.6.0/rubygems/core_ext/kernel_require.rb:54:in `require'
from /tmp/.mount_mikuttJHbYoi/usr/lib/ruby/2.6.0/rubygems/core_ext/kernel_require.rb:54:in `require'
from /tmp/.mount_mikuttJHbYoi/usr/share/mikutter/mikutter.rb:56:in `<main>'
/tmp/.mount_mikuttJHbYoi/usr/lib/ruby/2.6.0/rubygems/core_ext/kernel_require.rb:54:in `require': /usr/lib/libpangoft2-1.0.so.0: undefined symbol: g_task_set_name - /tmp/.mount_mikuttJHbYoi/usr/lib/ruby/gems/2.6.0/gems/gtk2-3.4.1/lib/gtk2.so (LoadError)
from /tmp/.mount_mikuttJHbYoi/usr/lib/ruby/2.6.0/rubygems/core_ext/kernel_require.rb:54:in `require'
from /tmp/.mount_mikuttJHbYoi/usr/lib/ruby/gems/2.6.0/gems/gtk2-3.4.1/lib/gtk2/base.rb:17:in `<top (required)>'
from /tmp/.mount_mikuttJHbYoi/usr/lib/ruby/2.6.0/rubygems/core_ext/kernel_require.rb:54:in `require'
from /tmp/.mount_mikuttJHbYoi/usr/lib/ruby/2.6.0/rubygems/core_ext/kernel_require.rb:54:in `require'
from /tmp/.mount_mikuttJHbYoi/usr/lib/ruby/gems/2.6.0/gems/gtk2-3.4.1/lib/gtk2.rb:11:in `<top (required)>'
from /tmp/.mount_mikuttJHbYoi/usr/lib/ruby/2.6.0/rubygems/core_ext/kernel_require.rb:130:in `require'
from /tmp/.mount_mikuttJHbYoi/usr/lib/ruby/2.6.0/rubygems/core_ext/kernel_require.rb:130:in `rescue in require'
from /tmp/.mount_mikuttJHbYoi/usr/lib/ruby/2.6.0/rubygems/core_ext/kernel_require.rb:34:in `require'
from /tmp/.mount_mikuttJHbYoi/usr/share/mikutter/core/mui/cairo_miracle_painter.rb:3:in `<top (required)>'
from /tmp/.mount_mikuttJHbYoi/usr/lib/ruby/2.6.0/rubygems/core_ext/kernel_require.rb:54:in `require'
from /tmp/.mount_mikuttJHbYoi/usr/lib/ruby/2.6.0/rubygems/core_ext/kernel_require.rb:54:in `require'
from /tmp/.mount_mikuttJHbYoi/usr/share/mikutter/core/mui/cairo_cell_renderer_message.rb:3:in `<top (required)>'
from /tmp/.mount_mikuttJHbYoi/usr/lib/ruby/2.6.0/rubygems/core_ext/kernel_require.rb:54:in `require'
from /tmp/.mount_mikuttJHbYoi/usr/lib/ruby/2.6.0/rubygems/core_ext/kernel_require.rb:54:in `require'
from /tmp/.mount_mikuttJHbYoi/usr/share/mikutter/plugin/gtk/gtk.rb:5:in `<top (required)>'
from /tmp/.mount_mikuttJHbYoi/usr/share/mikutter/core/miquire_plugin.rb:157:in `load'
from /tmp/.mount_mikuttJHbYoi/usr/share/mikutter/core/miquire_plugin.rb:157:in `block in load'
from /tmp/.mount_mikuttJHbYoi/usr/share/mikutter/core/utils.rb:288:in `block in atomic'
from /tmp/.mount_mikuttJHbYoi/usr/lib/ruby/2.6.0/monitor.rb:235:in `mon_synchronize'
from /tmp/.mount_mikuttJHbYoi/usr/share/mikutter/core/utils.rb:288:in `atomic'
from /tmp/.mount_mikuttJHbYoi/usr/share/mikutter/core/miquire_plugin.rb:147:in `load'
from /tmp/.mount_mikuttJHbYoi/usr/share/mikutter/core/miquire_plugin.rb:149:in `block (2 levels) in load'
from /tmp/.mount_mikuttJHbYoi/usr/share/mikutter/core/miquire_plugin.rb:148:in `each'
from /tmp/.mount_mikuttJHbYoi/usr/share/mikutter/core/miquire_plugin.rb:148:in `block in load'
from /tmp/.mount_mikuttJHbYoi/usr/share/mikutter/core/utils.rb:288:in `block in atomic'
from /tmp/.mount_mikuttJHbYoi/usr/lib/ruby/2.6.0/monitor.rb:235:in `mon_synchronize'
from /tmp/.mount_mikuttJHbYoi/usr/share/mikutter/core/utils.rb:288:in `atomic'
from /tmp/.mount_mikuttJHbYoi/usr/share/mikutter/core/miquire_plugin.rb:147:in `load'
from /tmp/.mount_mikuttJHbYoi/usr/share/mikutter/core/miquire_plugin.rb:149:in `block (2 levels) in load'
from /tmp/.mount_mikuttJHbYoi/usr/share/mikutter/core/miquire_plugin.rb:148:in `each'
from /tmp/.mount_mikuttJHbYoi/usr/share/mikutter/core/miquire_plugin.rb:148:in `block in load'
from /tmp/.mount_mikuttJHbYoi/usr/share/mikutter/core/utils.rb:288:in `block in atomic'
from /tmp/.mount_mikuttJHbYoi/usr/lib/ruby/2.6.0/monitor.rb:235:in `mon_synchronize'
from /tmp/.mount_mikuttJHbYoi/usr/share/mikutter/core/utils.rb:288:in `atomic'
from /tmp/.mount_mikuttJHbYoi/usr/share/mikutter/core/miquire_plugin.rb:147:in `load'
from /tmp/.mount_mikuttJHbYoi/usr/share/mikutter/core/miquire_plugin.rb:99:in `block in load_all'
from /tmp/.mount_mikuttJHbYoi/usr/share/mikutter/core/miquire_plugin.rb:40:in `block in each_spec'
from /tmp/.mount_mikuttJHbYoi/usr/share/mikutter/core/miquire_plugin.rb:35:in `each'
from /tmp/.mount_mikuttJHbYoi/usr/share/mikutter/core/miquire_plugin.rb:35:in `each'
from /tmp/.mount_mikuttJHbYoi/usr/share/mikutter/core/miquire_plugin.rb:38:in `each_spec'
from /tmp/.mount_mikuttJHbYoi/usr/share/mikutter/core/miquire_plugin.rb:98:in `load_all'
from /tmp/.mount_mikuttJHbYoi/usr/share/mikutter/core/boot/load_plugin.rb:13:in `<top (required)>'
from /tmp/.mount_mikuttJHbYoi/usr/lib/ruby/2.6.0/rubygems/core_ext/kernel_require.rb:54:in `require'
from /tmp/.mount_mikuttJHbYoi/usr/lib/ruby/2.6.0/rubygems/core_ext/kernel_require.rb:54:in `require'
from /tmp/.mount_mikuttJHbYoi/usr/share/mikutter/mikutter.rb:56:in `<main>'
/tmp/.mount_mikuttJHbYoi/usr/lib/ruby/2.6.0/rubygems/core_ext/kernel_require.rb:54:in `require': cannot load such file -- gtk2 (LoadError)
from /tmp/.mount_mikuttJHbYoi/usr/lib/ruby/2.6.0/rubygems/core_ext/kernel_require.rb:54:in `require'
from /tmp/.mount_mikuttJHbYoi/usr/share/mikutter/core/mui/cairo_miracle_painter.rb:3:in `<top (required)>'
from /tmp/.mount_mikuttJHbYoi/usr/lib/ruby/2.6.0/rubygems/core_ext/kernel_require.rb:54:in `require'
from /tmp/.mount_mikuttJHbYoi/usr/lib/ruby/2.6.0/rubygems/core_ext/kernel_require.rb:54:in `require'
from /tmp/.mount_mikuttJHbYoi/usr/share/mikutter/core/mui/cairo_cell_renderer_message.rb:3:in `<top (required)>'
from /tmp/.mount_mikuttJHbYoi/usr/lib/ruby/2.6.0/rubygems/core_ext/kernel_require.rb:54:in `require'
from /tmp/.mount_mikuttJHbYoi/usr/lib/ruby/2.6.0/rubygems/core_ext/kernel_require.rb:54:in `require'
from /tmp/.mount_mikuttJHbYoi/usr/share/mikutter/plugin/gtk/gtk.rb:5:in `<top (required)>'
from /tmp/.mount_mikuttJHbYoi/usr/share/mikutter/core/miquire_plugin.rb:157:in `load'
from /tmp/.mount_mikuttJHbYoi/usr/share/mikutter/core/miquire_plugin.rb:157:in `block in load'
from /tmp/.mount_mikuttJHbYoi/usr/share/mikutter/core/utils.rb:288:in `block in atomic'
from /tmp/.mount_mikuttJHbYoi/usr/lib/ruby/2.6.0/monitor.rb:235:in `mon_synchronize'
from /tmp/.mount_mikuttJHbYoi/usr/share/mikutter/core/utils.rb:288:in `atomic'
from /tmp/.mount_mikuttJHbYoi/usr/share/mikutter/core/miquire_plugin.rb:147:in `load'
from /tmp/.mount_mikuttJHbYoi/usr/share/mikutter/core/miquire_plugin.rb:149:in `block (2 levels) in load'
from /tmp/.mount_mikuttJHbYoi/usr/share/mikutter/core/miquire_plugin.rb:148:in `each'
from /tmp/.mount_mikuttJHbYoi/usr/share/mikutter/core/miquire_plugin.rb:148:in `block in load'
from /tmp/.mount_mikuttJHbYoi/usr/share/mikutter/core/utils.rb:288:in `block in atomic'
from /tmp/.mount_mikuttJHbYoi/usr/lib/ruby/2.6.0/monitor.rb:235:in `mon_synchronize'
from /tmp/.mount_mikuttJHbYoi/usr/share/mikutter/core/utils.rb:288:in `atomic'
from /tmp/.mount_mikuttJHbYoi/usr/share/mikutter/core/miquire_plugin.rb:147:in `load'
from /tmp/.mount_mikuttJHbYoi/usr/share/mikutter/core/miquire_plugin.rb:149:in `block (2 levels) in load'
from /tmp/.mount_mikuttJHbYoi/usr/share/mikutter/core/miquire_plugin.rb:148:in `each'
from /tmp/.mount_mikuttJHbYoi/usr/share/mikutter/core/miquire_plugin.rb:148:in `block in load'
from /tmp/.mount_mikuttJHbYoi/usr/share/mikutter/core/utils.rb:288:in `block in atomic'
from /tmp/.mount_mikuttJHbYoi/usr/lib/ruby/2.6.0/monitor.rb:235:in `mon_synchronize'
from /tmp/.mount_mikuttJHbYoi/usr/share/mikutter/core/utils.rb:288:in `atomic'
from /tmp/.mount_mikuttJHbYoi/usr/share/mikutter/core/miquire_plugin.rb:147:in `load'
from /tmp/.mount_mikuttJHbYoi/usr/share/mikutter/core/miquire_plugin.rb:99:in `block in load_all'
from /tmp/.mount_mikuttJHbYoi/usr/share/mikutter/core/miquire_plugin.rb:40:in `block in each_spec'
from /tmp/.mount_mikuttJHbYoi/usr/share/mikutter/core/miquire_plugin.rb:35:in `each'
from /tmp/.mount_mikuttJHbYoi/usr/share/mikutter/core/miquire_plugin.rb:35:in `each'
from /tmp/.mount_mikuttJHbYoi/usr/share/mikutter/core/miquire_plugin.rb:38:in `each_spec'
from /tmp/.mount_mikuttJHbYoi/usr/share/mikutter/core/miquire_plugin.rb:98:in `load_all'
from /tmp/.mount_mikuttJHbYoi/usr/share/mikutter/core/boot/load_plugin.rb:13:in `<top (required)>'
from /tmp/.mount_mikuttJHbYoi/usr/lib/ruby/2.6.0/rubygems/core_ext/kernel_require.rb:54:in `require'
from /tmp/.mount_mikuttJHbYoi/usr/lib/ruby/2.6.0/rubygems/core_ext/kernel_require.rb:54:in `require'
from /tmp/.mount_mikuttJHbYoi/usr/share/mikutter/mikutter.rb:56:in `<main>'
</pre>
mikutter - バグ #1438 (実装待ち): Mastodon: ストリーミングAPIを無効にする設定をしてもストリーミング接続される
https://dev.mikutter.hachune.net/issues/1438
2020-03-18T14:40:33Z
toshi_a 初音
toshi.alternative@gmail.com
<p>タイトルの通り。ストリーミング接続処理の大幅な変更の残作業。</p>
mikutter - バグ #1429 (実装待ち): Cairo::InvalidSize 例外でクラッシュすることがある
https://dev.mikutter.hachune.net/issues/1429
2020-01-12T04:16:12Z
toshi_a 初音
toshi.alternative@gmail.com
<p><a class="source" href="https://dev.mikutter.hachune.net/projects/mikutter/repository/main/revisions/0b6ec3e0/entry/core/mui/cairo_miracle_painter.rb#L446">source:core/mui/cairo_miracle_painter.rb@0b6ec3e0#L446</a> でこの例外が発生してクラッシュすることがある。<br />状況がよくわからないので、受け取ったMessageに規則性があるか検証したい。</p>
mikutter - バグ #1425 (実装待ち): Mastodon: subparts_status_info.rbでSkinを使用できないか?
https://dev.mikutter.hachune.net/issues/1425
2020-01-06T17:01:26Z
Shibafu Midorino
<p>subparts_status_info.rb内では、可視性やbotフラグなどを表わすアイコンをPhoto Modelで取り扱っています。<br />動作に問題はありませんが、このようなリソースはユーザが自由に差し替えできるSkinとして参照するべきではないでしょうか。</p>
mikutter - 提案 #1424 (実装待ち): mastodon プラグインに追加したい機能
https://dev.mikutter.hachune.net/issues/1424
2020-01-04T18:02:00Z
Izumi Tsutsui
tsutsui@ceres.dti.ne.jp
<p>以前 slack や KOF で話が出ていて、 2020/1/4 のてオフで再度話が挙がって<br />「チケットに書いておいて欲しい」とのことだったので、<br />パッチなしですが提案チケットとして記載します。</p>
<a name="mastodon-プラグインで実現したいこと"></a>
<h3 >mastodon プラグインで実現したいこと<a href="#mastodon-プラグインで実現したいこと" class="wiki-anchor">¶</a></h3>
Twitter プラグインではできていて、現状の mastodon プラグインでできていない以下:
<ul>
<li>ユーザープロフィールタブ内のユーザーTLタブの表示について、<br />そのユーザーの新たなトゥートを受信したらユーザーTLタブにも追加する
<ul>
<li>現状はタブを開いた時のTLからは更新されない</li>
<li>各受信トゥートのデータソースの扱いの問題だとすると結構大変かもしれませんが。</li>
</ul>
</li>
<li>mikutter 起動時に、mastodon の reply タブに起動時点から過去に遡って一定数のリプライを表示する
<ul>
<li>TwitterだとAPIがそういう仕様だったということかもしれませんが、<br />現状の mastdon plugin では起動以降のリプライのみの表示<br />(ただし、Twitter APIも今は「過去xx個のリプライ」ではなく「過去N日間のリプライ」に変わっている気がする)</li>
</ul>
</li>
<li>ユーザープロフィールタブを再起動時に復元する
<ul>
<li>ユーザープロフィールタブ内のタブの並び順は復元されますが、<br />ユーザープロフィールタブ自体は再起動時復元されないと思います</li>
</ul></li>
</ul>
<a name="mastodon-プラグインの動作で確認したいこと"></a>
<h3 >mastodon プラグインの動作で確認したいこと<a href="#mastodon-プラグインの動作で確認したいこと" class="wiki-anchor">¶</a></h3>
<ul>
<li>mikutter 起動時、 mastodon の HTL にトゥートが一定数表示されるが、<br />これが「起動時から一定数遡ったトゥート」ではなく、飛び飛びのトゥートになっている(ような気がする)</li>
</ul>
<a name="忘れていること"></a>
<h3 >忘れていること<a href="#忘れていること" class="wiki-anchor">¶</a></h3>
<p>思い出したらまた書き足します。</p>
mikutter - 機能 #1380 (実装待ち): Gtk::CRUDに依存しているコードを減らす
https://dev.mikutter.hachune.net/issues/1380
2019-09-15T02:08:00Z
toshi_a 初音
toshi.alternative@gmail.com
<p><a class="issue tracker-2 status-5 priority-4 priority-default closed parent" title="機能: gtk3 (終了)" href="https://dev.mikutter.hachune.net/issues/887">#887</a> Gtk3のために、Gtkに依存するなかでもかなり複雑な、Gtk::CRUDへの依存を緩和して、Gtk依存部分を減らす。</p>
<a name="読み取り専用のGtkCRUD"></a>
<h1 >読み取り専用のGtk::CRUD<a href="#読み取り専用のGtkCRUD" class="wiki-anchor">¶</a></h1>
<p>実は多くの利用箇所で、Gtk::CRUDをListViewのためだけに使っており、Create, Update, Deleteの機能を潰して使っている。<br />もはやCRUDではないので、そういうのをわかりやすいように一旦別のクラスにしてしまって、どこまで使っているのかを明確にする。</p>
<a name="Form-DSLにlistviewを追加"></a>
<h1 >Form DSLにlistviewを追加<a href="#Form-DSLにlistviewを追加" class="wiki-anchor">¶</a></h1>
<p>設定でGtk::CRUDを使っている箇所を、Gtk非依存にできる。</p>
<p>- Intent<br />- World<br />- Extract<br />- Mastodon<br />- Shortcut key</p>
<p>WorldだけDnDで入れ替えとか対応しちゃってるので、これも全体に適用できるようになるはず。</p>
<a name="Mtkをobsoleteに"></a>
<h1 >Mtkをobsoleteに<a href="#Mtkをobsoleteに" class="wiki-anchor">¶</a></h1>
<p>Mtkモジュールは、Gtk::CRUDの編集ダイアログからしか使われていない。</p>
<p>このダイアログをDialog DSLで置き換えてしまっても動くようにしたら、Mtkをまるごと消せる(一応互換性のために、消すのは4.0のタイミング)。</p>
<p>Form DSLで同等のものが再実装されているので、置き換えで障害になるとしたらレイアウトくらい?</p>
mikutter - バグ #1377 (実装待ち): Diva::Modelの子クラス(A)で定義したフィールドの型がAの子クラス(B)で適用されない
https://dev.mikutter.hachune.net/issues/1377
2019-08-27T11:12:50Z
Yuto Tokunaga
yuntan.sub1@gmail.com
<p>Diva::Modelの子クラス(A)で<code>field.uri</code>等で定義したフィールドの型が,Aの子クラス(B)では<code>String</code>になってしまい,期待した型が得られません.</p>
<pre><code class="ruby syntaxhl"><span class="nb">require</span> <span class="s1">'diva'</span>
<span class="k">class</span> <span class="nc">A</span> <span class="o"><</span> <span class="no">Diva</span><span class="o">::</span><span class="no">Model</span>
<span class="n">field</span><span class="p">.</span><span class="nf">uri</span> <span class="ss">:uri</span>
<span class="n">field</span><span class="p">.</span><span class="nf">time</span> <span class="ss">:created</span>
<span class="k">end</span>
<span class="k">class</span> <span class="nc">B</span> <span class="o"><</span> <span class="no">Base</span>
<span class="n">field</span><span class="p">.</span><span class="nf">uri</span> <span class="ss">:alt_uri</span>
<span class="n">field</span><span class="p">.</span><span class="nf">time</span> <span class="ss">:updated</span>
<span class="k">end</span>
<span class="n">s</span> <span class="o">=</span> <span class="s1">'https://example.com/'</span>
<span class="n">t</span> <span class="o">=</span> <span class="s1">'2019-08-27T20:01:00'</span>
<span class="n">a</span> <span class="o">=</span> <span class="no">A</span><span class="p">.</span><span class="nf">new</span> <span class="ss">uri: </span><span class="n">s</span><span class="p">,</span> <span class="ss">created: </span><span class="n">t</span>
<span class="n">b</span> <span class="o">=</span> <span class="no">B</span><span class="p">.</span><span class="nf">new</span> <span class="ss">uri: </span><span class="n">s</span><span class="p">,</span> <span class="ss">alt_uri: </span><span class="n">s</span><span class="p">,</span> <span class="ss">created: </span><span class="n">t</span><span class="p">,</span> <span class="ss">updated: </span><span class="n">t</span>
<span class="nb">p</span> <span class="n">a</span><span class="p">.</span><span class="nf">uri</span><span class="p">.</span><span class="nf">class</span><span class="p">.</span><span class="nf">name</span> <span class="c1"># => "Diva::URI" </span>
<span class="nb">p</span> <span class="n">a</span><span class="p">.</span><span class="nf">created</span><span class="p">.</span><span class="nf">class</span><span class="p">.</span><span class="nf">name</span> <span class="c1"># => "Time" </span>
<span class="nb">p</span> <span class="n">b</span><span class="p">.</span><span class="nf">uri</span><span class="p">.</span><span class="nf">class</span><span class="p">.</span><span class="nf">name</span> <span class="c1"># => "String" </span>
<span class="nb">p</span> <span class="n">b</span><span class="p">.</span><span class="nf">alt_uri</span><span class="p">.</span><span class="nf">class</span><span class="p">.</span><span class="nf">name</span> <span class="c1"># => "Diva:URI" </span>
<span class="nb">p</span> <span class="n">b</span><span class="p">.</span><span class="nf">created</span><span class="p">.</span><span class="nf">class</span><span class="p">.</span><span class="nf">name</span> <span class="c1"># => "String" </span>
<span class="nb">p</span> <span class="n">b</span><span class="p">.</span><span class="nf">updated</span><span class="p">.</span><span class="nf">class</span><span class="p">.</span><span class="nf">name</span> <span class="c1"># => "Time" </span>
</code></pre>
<p>Ruby v2.6.2, diva v1.0.0 で確認.</p>
mikutter - 機能 #1340 (実装待ち): Mastodonのtootの情報をアイコンボタンに反映させる
https://dev.mikutter.hachune.net/issues/1340
2019-06-02T10:29:18Z
toshi_a 初音
toshi.alternative@gmail.com
<p>Tootの情報がアイコンボタンにいろいろ反映させる</p>
<a name="不具合"></a>
<h1 >不具合<a href="#不具合" class="wiki-anchor">¶</a></h1>
<p>- リプライアイコンがstickyになる条件が間違っている<br /> - mentioned_by_me? が真を返すのは、そのMessageに自分がリプライを既に送っている時(返信済み)<br /> - 「自分」とは、登録されているWorldのうちのいずれか</p>
<a name="追加"></a>
<h1 >追加<a href="#追加" class="wiki-anchor">¶</a></h1>
<p>subparts_status_infoが既にあるが、これを廃止してアイコンボタンにまとめる。</p>
<a name="未収載非公開ダイレクト"></a>
<h2 >未収載、非公開、ダイレクト<a href="#未収載非公開ダイレクト" class="wiki-anchor">¶</a></h2>
<p>鍵が外れたようなアイコン等を用意して、左上に表示する。<br />マウスオーバーした時には、retweetにする。</p>
<p>左上はもともとMessageの公開範囲を表示する場所なので、未収載などを表示することには問題はない。</p>
<a name="bot"></a>
<h2 >bot<a href="#bot" class="wiki-anchor">¶</a></h2>
<p>アカウントがBOTであるなら、左下にロボットみたいなアイコンを作って表示する。<br />既にまりもは、Twitterのverifiedを表すために利用しているので、ここで違和感はないと思う。</p>
<a name="pin"></a>
<h2 >pin<a href="#pin" class="wiki-anchor">¶</a></h2>
<p>どうしようかなぁ、困ったなぁ</p>
mikutter - 最適化 #1315 (新規): filterの戻り値を加工しない場合、配列よりもアロケートのコストが軽いオブジェクトで代用する
https://dev.mikutter.hachune.net/issues/1315
2019-02-09T17:41:29Z
toshi_a 初音
toshi.alternative@gmail.com
<a name="動機"></a>
<h1 >動機<a href="#動機" class="wiki-anchor">¶</a></h1>
<p>メモリプロファイルを取ったところ、以下のようなコードで作成される配列が大量にあった。フィルタを過剰に呼び出さない工夫も必要だが、大抵のフィルタは値を加工しないので、値を加工しなかったことを示すキーワードを代わりに返すことで、ほとんどのフィルタ呼び出しで配列の作成を1回削減できる。</p>
<a name="対応"></a>
<h1 >対応<a href="#対応" class="wiki-anchor">¶</a></h1>
<p>値を加工しなかったことを示す値には以下の候補がある:</p>
<p>- <code>nil</code> : やりやすいが見慣れていないと何のことかわからない<br />- <strong>何らかのSymbolや定数:</strong> オブジェクトを作成しない。意図が明確になる。<br />- <strong>何らかのメソッド:</strong> 今もフィルタを強制的にキャンセルするために <code>Filter.cancel</code> とか書いてるので、 <code>Filter.pass</code> とか書いたら帯域脱出した上でパスできると良いかも。<br />- <strong>filter_xxxの引数に加工しないという宣言を与える:</strong> 戻り値が偶然衝突することはないが融通は効かない</p>
mikutter - バグ #1188 (新規): method_missingが反応できるメソッド名にはrespond_to_missing?が真を返すようにする
https://dev.mikutter.hachune.net/issues/1188
2018-03-08T06:11:34Z
toshi_a 初音
toshi.alternative@gmail.com
<p>Plugin::Twitter::World がTwitter APIのオブジェクトにメソッドを移譲しているが、respond_to_missing?を実装していないため移譲先として使われず、正しく呼ばれていない。</p>
<p>method_missingでソースコードをgrepした結果まあまあな数があった。</p>
mikutter - バグ #1012 (新規): cascadeのtypo
https://dev.mikutter.hachune.net/issues/1012
2017-03-28T12:19:31Z
あひる 家鴨
<p>cascade を cuscade と typo しています。<br />影響範囲は広く、 cuscaded 及び cuscadable を合わせて 18ファイル46箇所に使用されており、ファイル名にも適用されています。<br />typoの修正自体は用意ですが、それによる影響がどのように出るかわからないため、修正したくてもできない状態です。</p>
<p>どのような修正にするか、修正した場合に何を持って問題がないとするかなどに関する情報が欲しいです。</p>