tag:blogger.com,1999:blog-20346730507319238922024-02-21T01:44:04.001+09:00開発ブログmosaicerhttp://www.blogger.com/profile/16945653025471194074noreply@blogger.comBlogger3125tag:blogger.com,1999:blog-2034673050731923892.post-50569782290395451072016-01-25T10:36:00.000+09:002016-01-27T21:54:42.563+09:00ツイッターWebのページ遷移の仕組みについて調べた私が作った<a href="https://greasyfork.org/ja/scripts/4154-muting-on-twitter" target="_blank">Muting on Twitter</a>というユーザースクリプトはその名の通り,<br />
<div>
<b>ツイッターWeb(Twitter Web Client)と検索ページでよくあるミュート機能を使えるようにする</b>,</div>
<div>
というものです.</div>
<div>
長らく悩ませていたページ遷移問題に決着をつけることができた(と思う)ので,それについてここに書いておきます.</div>
<div>
<br /></div>
<h3>
ページ遷移問題とは</h3>
<div>
ページ遷移しても別ページ扱いにならず,ホームに戻った時にスクリプトが死んでる.</div>
<h3>
原因</h3>
<div>
別ページに飛んだ場合,ページが変わるわけではなく,中身のHTMLのコンテンツ部分が切り替わる.</div>
<div>
そのため,ホームに戻った場合,HTMLが切り替わってしまうのでスクリプトも(見た目上は)死んでる.</div>
<h3>
解決するために必要なこと</h3>
<div>
<ul>
<li>ページの切り替わりを監視する</li>
<li>動的にHTMLをまた作り直す</li>
<li>変数に格納したノードも死んでるので再び格納する</li>
</ul>
</div>
<h3>
修正</h3>
<div>
まず.ページの切り替わりがわからないと何もできない.</div>
<div>
デベロッパーツールを開いてページが切り替わる際のHTMLを見てみると,</div>
<div>
BODYタグが変更されたのがまず目についたのでMutationObserverを使って監視してみる.</div>
<div>
(MutationObserverはとても面白いAPIなので,またどこかに書きます.)</div>
<div>
するとクラス名やスタイルがコロコロと変わることが確認できた.</div>
<div>
しかし1回の変更部分が多くて条件を書くのがちょっと大変だし,判定漏れする可能性もあった.</div>
<div>
そこで他にも変更があったノードの一つ,div#docを監視してみた.</div>
<div>
すると少ない変更部分でページ切り替えを感知することができたのでそちらを監視対象にすることにした.</div>
<div>
どのような判定で再処理を行っているかはコードを参照.</div>
<div>
<br /></div>
<div>
なお,ページによっては別ページ扱いになる場合もあったので,</div>
<div>
以下にホームから各ページに遷移した場合の扱いをまとめた.</div>
<div>
<ul>
<li>別ページ扱い</li>
<ul>
<li>リスト</li>
<li>ヘルプ</li>
<li>おすすめユーザー</li>
<li>Twitterについて</li>
<li>規約</li>
<li>プライバシー</li>
<li>クッキー</li>
<li>広告ヘルプ</li>
<li>ブランド</li>
<li>ブログ</li>
<li>ステータス</li>
<li>アプリ連携</li>
<li>採用情報</li>
<li>広告管理画面</li>
<li>広告掲載方法</li>
<li>メディア</li>
<li>開発者</li>
<li>おすすめユーザー部分</li>
</ul>
<li>別タブで開く</li>
<ul>
<li>Twitter広告</li>
<li>アナリティクス</li>
</ul>
</ul>
<div>
あとはページがホームor検索の時に再びHTMLを動的に作って,必要なノードを格納するだけ.</div>
</div>
<div>
イベントリスナーなどの1回きりの処理とそうでない処理を分けて,ページ切り替え時に後者を実行する.</div>
<h3>
まとめ</h3>
<div>
ページ遷移に対応できた.</div>
<div>
しかし,別ページにいる時間が長い,もしくはさらに別ページに遷移した場合,再構成できないことがあった.</div>
<div>
詳しい条件がわからないので,判定をすり抜けたのか,切り替えを感知できなかったのかは断言できない.</div>
<div>
そのどちらでもないとしたら新たな解決法を探す必要がある.</div>
<div>
また追ってその問題は確認したいと思う.</div>
<div>
もし再現できた人はどこでもいいので教えて欲しい.<br />
<br />
<h3>
追記(17:17:40)</h3>
報告により原因が解明できた.<br />
<br />
<b>他のページ(ユーザーページなど)を起点としてホームや検索に行った場合,ホームと検索以外ではスクリプトが動かないから,当然スクリプトは動いてない状態だしページ内移動扱いだから新たにスクリプトが動くこともない</b><br />
<br />
これは例えばユーザーページへアドレスバーとかブックマークとかで移動した場合に限らず,ホームや検索で別ページ扱いになるページに移動した後,上部の「ホーム」でホームに戻った場合も該当する.<br />
ホームを出す(スクリプト動く)→別ページに行く (ページが新たに読み込まれる.スクリプト死ぬ)→ホームに行く(ページ内移動扱いなのでHTMLが切り替わるだけで,ページは再読み込みされないし当然スクリプトは実行されない)<br />
<br />
解決法として,スクリプトが動く範囲を Twitterのページ全てにすることでどのページでも動くようにした<br />
しかし内部のページ読み込み(iFrame)でも反応してしまうので,そこらへんのページの除外を地道にやっていく必要がある<br />
十分に検証をしたら修正版をあげる<br />
<br />
<h3>
追記(2016/01/27)</h3>
修正版を上げた.もしexcludeに不足があれば今後修正していく</div>
mosaicerhttp://www.blogger.com/profile/16945653025471194074noreply@blogger.com0tag:blogger.com,1999:blog-2034673050731923892.post-7425545693869385312015-12-24T11:57:00.002+09:002015-12-24T11:57:41.751+09:00ユーザースクリプトを書くときにjQueryを使おうと思ったけど変なところがあったので詰まったのを解決?した話<h3>
おさらい</h3>
ユーザースクリプトでjQueryを使う時は,<br />
<code>@require http://ajax.googleapis.com/ajax/libs/jquery/1.9.1/jquery.min.js</code><br />
のように宣言してjQueryを利用します.<br />
コンフリクトした場合は,<br />
<code>this.$ = this.jQuery = jQuery.noConflict(true);</code><br />
と書くと回避できます.<br />
ここらへんは<a href="http://wiki.greasespot.net/Third-Party_Libraries" target="_blank">公式のリファレンス</a>を見てもらったほうが早いと思います.<br />
<h3>
実は…</h3>
Chrome+Tampermonkeyだと何もしなくても使えます.<br />
ウェブページのjQueryを自動的に適用してくれているみたいです.<br />
なのでChromeでは詰まりませんでした.<br />
<h3>
しかし</h3>
Firefox+Greasemonkeyではそうはいかないので素直に@requireして使います.<br />
だけど正しく動かない.<br />
あるノードのイベント一覧を取得したかったのですが,<br />
なぜかundefined,未定義と言われてしまう….<br />
しかしコンソールから同じコードを実行するとちゃんとイベント一覧が取れる!<br />
ドキュメントの読み込みのタイミングかと思いましたがそうではありませんでした.<br />
<h3>
原因</h3>
Chromeではなぜか動くということから無事糸口を見つけることができました.<br />
読み込んだjQueryではなくウェブページのjQueryを使う必要があったのです!!!<br />
それぞれのjQueryが完結しているみたいなので,外部からは触れられないっていう話だと思います.<br />
なのでjQueryで実行部分をスクリプトタグの中に入れて,スクリプトタグをページに挿入し,<br />
該当スクリプトをページ内で実行させるようにしました.<br />
(ユーザースクリプトからウェブページのjQueryを利用する方法がわからなかった…)<br />
そうすることで無事,FirefoxでもChromeでも動くようになりました!<br />
<h3>
ちなみに</h3>
そのユーザースクリプトというのが<a href="https://greasyfork.org/ja/scripts/15132-disable-disable-right-click" target="_blank">これ</a>.<br />
右クリック禁止とかコピペ禁止を禁止するスクリプトです.mosaicerhttp://www.blogger.com/profile/16945653025471194074noreply@blogger.com0tag:blogger.com,1999:blog-2034673050731923892.post-66593830981513844572015-12-13T21:57:00.001+09:002015-12-13T22:57:16.289+09:00Android用Twitterクライアント「Peafowl」を作りましたこの記事は「<a href="http://www.adventar.org/calendars/813" target="_blank">Twitterクライアント開発マン Advent Calendar 2015</a>」の13日目の記事です<br />
<br />
***<br />
<br />
機能とかスクリーンショットとかは<a href="https://sites.google.com/site/cyanoa0504/android/peafowl" target="_blank">こちら</a><br />
Google Playのリンクは<a href="https://play.google.com/store/apps/details?id=jp.cyanoa.peafowl" target="_blank">ここ</a>です<br />
<br />
<br />
世の中には数多くのTwitterクライアントがあるのになぜ作ったのかというと,<br />
・Androidアプリの勉強をしたかった<br />
・Twitterをそれなりに使っているので作りやすいんじゃないか<br />
という理由です.<br />
<br />
デザインはみなさんお馴染みのマテリアルデザインを元に設計しています.<br />
<a href="http://www.google.com/design/spec/material-design/introduction.html" target="_blank">ガイドライン</a>を見れば大体なんとかなります.<br />
すごく細かく書いてあるので何か困ったらガイドラインっていう感じです.<br />
それでもわからなかったり腑に落ちなかったりした場合は,<br />
Google謹製のアプリのデザインや<a href="http://www.materialup.com/" target="_blank">MaterialUp</a>を参考にしました.<br />
前者に関してはデザイン作ったのはいいけど実際に動かしてみたらどうなんだろう,<br />
というのがわかるのでオススメです.<br />
後者に関してはデザインのアイデアが浮かばないな〜〜〜っていうときにオススメです.<br />
それを作るかどうかはともかくとして,とてもいい刺激になります.<br />
<br />
システムは公式で使える機能を網羅するように頑張りました<br />
それだけじゃなくて細かいところに手が届くように気を配りました<br />
ですので一応「多機能」と謳っていますが多分他のクライアントのほうが機能がある…と思います<br />
まだまだ実装したい機能があるので今後のアップデートで追いつきたい!です!<br />
<br />
<br />
最初のリリースということで不具合があるかもしれませんが,<br />
継続的にアップデートを行っていくつもりです.<br />
もしよかったら使ってみてください!mosaicerhttp://www.blogger.com/profile/16945653025471194074noreply@blogger.com0