LiveScript - JavaScript - ECMAScript
Bookmarklets
Firefox では、改行を含むと Error になるようです。
- decode HTML
blog や wiki 等で link 先が scheme://server.domain/path/
%E3%83%AA%E3%83%B3%E3%82%AF%E5%85%88%E3%81%8C%E8%AA%AD%E3%82%81%E3%81%AA%E3%81%84%E3%82%88%E3%81%85の様な読めない状態の時に decode してみる (encoding が合わなければ結局文字化けする丈けでは在るけれども)。(function($) { for (i in $) if ($[i].innerHTML.indexOf('%') > -1) $[i].innerHTML = decodeURIComponent($[i].innerHTML); })(document.getElementsByTagName('a'))- Background Color Change
古い HTML の Background Color が酷くて読み辛い場合がありますが、Prompt で入力し直せば済みます。
with (document) { eval(prompt('Reset Colors', 'bgColor="' + bgColor + '",fgColor="' + fgColor + '",linkColor="' + linkColor + '",vlinkColor="' + vlinkColor + '",alinkColor="' + alinkColor + '"')); stop(); }最近でも CSS の Color を入力し直す必要が在ったりしますが、まぁ色々やるのも面倒なので普段は纏めてやっつけてますが。
with (document) { (function($) { for (i in $) { $[i].background = ''; $[i].bgColor = '#ffffff'; $[i].fgColor = '#000000'; $[i].style.backgroundColor = '#fff'; $[i].style.backgroundImage = 'none'; $[i].style.color = '#000'; } })([body, getElementsByTagName('div'), getElementsByTagName('span')]) }- amazon.{ca, cn, co.jp, co.uk, com, de, es, fr}: Short URI amazon, View Original Image amazon
商品 URI を短くして表示する.
(function($) { prompt('', $.protocol + '//' + $.hostname.replace('www.', '') + '/dp/' + document.getElementsByName('ASIN')[0].value); })(location)余白のない元の Size の画像を表示する.
(function($) { if ($.indexOf('/dp/') > -1 || $.indexOf('/gp/') > -1) window.open(document.getElementById('prodImage').src.replace(/\._.*_/, '')); })(location.pathname)- ameblo.jp: Alter alt, View Original Image ameblo
こえのブログ と云うのが出来た様ですが、何故平仮名表記なんでしょう? 「こえ=声」とは限らないでしょう? 「こえ=肥え」かも…。んで、例に依って iframe 無効化してる人=私 用に file を開く bookmarklet.
(function($){ for (_ in $) if ($[_].src.indexOf('voice.ameba.jp/embed') > -1) window.open([$[_].src.replace('embed','assets/audios/standard'), 'mp3'].join('.')); })(document.getElementsByTagName('iframe'))Text Blowser で Ameblo を読むと img 要素の alt 属性の設定の仕方が酷過ぎるのが確認出来ますが、普通の Browser で単に画像表示を Off にしてる場合なんかは Script でちょちょいとやっつけてしまえって事で。
(function(G, T) { for (i in G) G[i].alt = G[i].alt.replace(T, ''); })(document.getElementsByTagName('img'), document.getElementsByTagName('h1')[0].textContent || document.title.split('|').reverse()[0])殆どの場合 Title に Hyphen が付く文字列が頭に挿入されてるみたい。たまに $ から始まる変なのもあるけど。
ameblo.jp の画像を元の Size で見るのに Flash が必要な場合に thumbnail の URI を変換して表示.
(function($) { for (i in $) $[i].src = $[i].src.replace(/\/t\d+_/,'/o').replace(/_s\.jpg$/,'.jpg').replace(/\?.*$/,''); })(document.getElementsByTagName('img'))Safari v4 では何故だか oncontextmenu を弄らないと Context Menu が出ません。
- dempagumi.dearstage.com: dempagumi link as simple
以前の でんぱ組.inc公式サイト - profile の Link が何か長ったらしい汚らしかったんで、分かりやすくしてみました。/redirect?z=http:.*&p=http:.* って最終的にどこに飛ばされるのか分かりにくくて嫌じゃないのかな…? それと twitter の Path が /#! で始まるヤツ、まだ続ける必要ある?
(function($) { for (_ in $) { U = $[_].href.replace(/http:.*?=(?=http)/, '').replace(/&.*/, '').replace('#!/', ''); try { $[_].href = encodeURI(decodeURIComponent(decodeURI(U))); } catch(e) { $[_].href = U; } } })(document.getElementsByTagName('a'))- diamondblog.jp: feed to http
Safari v4.1.3(4533.19.4) で feed://diamondblog.jp/sari/?feed=rss2 だと画像が表示される (その後此っちも表示されなくなった) のに feed://diamondblog.jp/mihiro/feed/ は画像が表示されない。中身を覗くと表示される方は http://www.diamondblog.jp/sari/../contents/sari/*.jpg となってゐるのに対し表示されない方は絶対 path 丈けの /contents/mihiro/*/*/*.jpg となってゐるので 画像 URL も feed: の儘になってしまう。
Web Inspector で
<head>を見ると<base href>と値が空になってゐるので <base href="http://diamondblog.jp/"> 等に書き換えてから、Recent Articles: の項目を Click すると、画像が表示されます。これも面倒臭いので幾つか試してみた。HTMLBaseElement.href = 'http://diamondblog.jp/mihiro/';document.baseURI = 'http://diamondblog.jp/mihiro/';document.head.base.href = 'http://diamondblog.jp/mihiro/';document.head.base.setAttribute('href', 'http://diamondblog.jp/mihiro/');
何れも内容が変更されない様 (
base要素は Read Only?) なので、(function(G, L) { for (i in G) G[i].src = G[i].src.replace('feed:', 'http:').replace(/^\//, 'http://diamondblog.jp/'); for (i in L) if (L[i].rel == 'lightbox') L[i].href = L[i].href.replace('feed:', 'http:'); })(document.getElementsByClassName('attachment-medium'), document.getElementsByTagName('a'))とかしてみると、一時的には表示されました。何かもっと良い方法があるのかなぁ…。
- duckduckgo.com: Remove DuckDuckGo Redirect Link
Google のを作った序でに DuckDuckGo のも。
(function($) { for (_ in $) if ($[_].href.indexOf('/l/') > -1) { U = $[_].href.replace(/^.*?uddg=/, '').replace(/&.*/, ''); try { $[_].href = encodeURI(decodeURIComponent(decodeURI(U))); } catch(e) { $[_].href = U; } } })(document.getElementsByTagName('a'))- elaiza.com: Open Background Image
elaiza.com/photoの td[background] に画像を設定して <img src="space.gif"> というやり方、時たま見掛けるけど莫迦過ぎて厭きれる。何の為にやってるのか知らんけど、隠したいとか保存させたくないとかなのかも。でも保存する時に Web Page, Comlete とか Web Archive を選ぶだけで保存出来るから違うか……。今 Netscape Navigator v3 方式 (1996年) を使うなんて… 24年前の遣り方から変えられない人、どんな人? まぁ、現代人なら CSS で
img {pointer-events: none}でしょうな。で、手間を掛けずに簡単に画像を取り出すのに割と良く使う方法が大体こんな感じ……。(function($, _) { for (i in $) (function(b) { if (b != undefined) window.open([_.protocol, '//', _.hostname, _.pathname, b].join('')); })($[i].getAttribute('background')); })(document.getElementsByTagName('td'), location)序でに sonymusic.co.jp/artist/*/discography のも
(function($) { for (_ in $) $[_].src = ($[_].src.indexOf('.gif') > -1) ? '' : $[_].src.replace(/__[^.]*/,''); })(document.getElementsByTagName('img'))- flickr.com: Link to All Sizes
flickr も中々画像に辿り着けんね。
(function($) { for (i in $) if ($[i].href.indexOf('/in/') > -1) $[i].href = $[i].href.replace('/in/', '/sizes/o/in/'); })(document.getElementsByTagName('a'))- google Google Safe Browsing, View Larger Image Google+, Translate Japanize, Cache Search, Remove Google Redirect Link
Google Safe Browsing で確認する。
(function($) { $.href = $.protocol + '//www.google.com/safebrowsing/diagnostic?site=' + $.hostname; })(location)Google+ の画像 URI を thumbnail より一寸大きい Size に変更。でも Original なのかどうかよく判らない。
(function($) { if ($.hostname.indexOf('googleusercontent.com') > -1) $.pathname = $.pathname.replace(/\/[wsh]\d+(?:-[wtsponkhd]\d*)*\//, '/s0/'); })(location)URI を Google の Cache で見る.
(function($) { window.open($.protocol + '//www.google.com/search?q=cache:' + $.hostname + $.pathname); })(location)URI を Google 翻訳 で日本語にする.
(function($) { window.open($.protocol + '//translate.google.com/translate?hl=ja&u=' + $.hostname + $.pathname); })(location)Google Search からの Link は、
hrefが書き換えられて迚も面倒臭いので、 Redirect URI に変換させない様に抑制する。検索結果の URI を Copy する事も許されないと云うのはどういう事?- 検索結果の状態で実行すれば Link 先が元の URI の儘になる。
- でも、検索後に JavaScript を Off にした方が簡単。
- JavaScript Off で検索 (Safari v4 で Site Search を行うと JavaScript が使えなくなる) したり、Text Browser の場合は最初から
hrefに含まれるので意味なし。というか、その場合は Link 先が毎回変わるので visited かどうか判らなくなり最悪の Interface とゐえる。はっきり云ってカスですね。Google って莫迦だなぁ。 - カスタム検索の場合と SSL でない場合や確認 Dialog を表示する設定でなければ特に何も対策が必要でない。
mousedownEvent 時に呼び出す Function を空にしてしまう方法。(function($) { $.google = $.hlprwt = $.rwt = {}; })(window)onmousedownEvent 其の物を無効にする方が無難かな? ということで別の書き方。(function($) { for (i in $) $[i].removeAttribute('onmousedown'); )(document.getElementsByClassName('l'))一応 Click してしまった後で元に戻す方法も。それと、私は使わないのですが、{ last.fm, rhapsody.com, myspace.com } 等への Link 等も書き換えたい場合は、全ての Link に変更が必要。
(function($) { for (i in $) { if ($[i].href.indexOf('/url?') > -1) { _ = $[i].href.replace(/^[^=]+=/, '').replace(/&.*/, '') // .replace(/^http:(.*?(?:wikipedia|youtube|twitter|mozilla|facebook)\.(?:com|org))/, location.protocol + '$1'); try { $[i].href = encodeURI(decodeURIComponent(decodeURI(_))); } catch(e) { $[i].href = _; } } } })(document.getElementsByClassName('l')) // document.getElementsByTagName('a')んで、%3F が Decode されてしまって ? が含まれる場合に上手くいかないという……。
Secure Scheme で検索しても Link 先が Insecure に固定されてるのが面倒臭いなぁもぅ……、DuckDuckGo は気が利いてる。で、結局、私は Default を設定出来る Browser は DuckDuckGo に変更しました。DuckDuckGo も転送するんですが、JavaScript On の時は
hrefを書き換えないので面倒臭い事は起こりません。 こんな状態なら、もう Google を Default にする事はなさそう。怖いくらいに野心的なスタートアップのアイデア を読んだら一寸関連あるかも、と思った。
- hicbc.com: oncontextmenu=undefined body.setAttribute('oncontextmenu',undefined)
hicbc.com: AKB48 今夜は帰らない なんかを見ようとすると Context Menu が使えない。クソ不便。
原因は browseControl.js の1行目の
document.oncontextmenu = function() { return false };なので function を何かで上書きすれば良い。document.oncontextmenu = undefined;
も一つ序でに yanmaga.jp/gravure でも Context Menu が出ない。此処も同じ。こっちは
<body oncontextmenu="return false;">と直で書いてあって、更に莫迦っぽい。document.body.setAttribute('oncontextmenu', undefined);それにしても嫌がらせが下手。何を制限したいのか知らんけど、Fx 等では通常 Site Preferences (とか書いたけど ExExceptions の機能でした) で Script を Off に設定すれば良い丈け。
BSN新潟放送ラジオ: NGT48のガチ!ガチ?カウントダウン! のは HTML Attribute で設定してゐないので Web Inspector とか Firebug の Elements では見つからない。画像の Event Listeners を見れば 無名 function である事が確認出来るが、Script File 内に同じ function は無く生成されたモノの様。こういう場合は只々面倒臭いばかりなので SafariStand (Old SafariStand), ExExceptions 等の Site Preferences で ohbsn.com の Script を Off にしました。
- instagram.com: instagram.media.nodes, instagram.owner.username, instagram.is_video?video_url:display_url, Link to Instagram and Twitter
Safari v4, Fx3, Camino 等 https://www.instagram.com/{*USERNAME*}/ で何も表示されてゐない状態から、Entry への Link.
(function($) { for (_ in $) document.write('<a title="', ($[_].node.edge_media_to_caption.edges[0].node.text || ''), '" href="/p/', $[_].node.shortcode, '/"><img src="', $[_].node.thumbnail_src, '"></a>'); })(window._sharedData.entry_data.ProfilePage[0].graphql.user.edge_owner_to_timeline_media.edges)Safari v4, Fx3, Camino 等 https://www.instagram.com/p/*/ で何も表示されてゐない状態から、その User の Top を開く。
(function($) { window.open([location.protocol, '', $.hostname, $.entry_data.PostPage[0].graphql.shortcode_media.owner.username, ''].join('/')); })(window._sharedData)Safari v4, Fx3, Camino 等 https://www.instagram.com/p/*/ で何も表示されてゐない状態から、動画と画像への Link.
(function(_, $) { for (x in _.edge_media_to_caption.edges) document.write('<dt>', _.edge_media_to_caption.edges[x].node.text); _.__typename != 'GraphSidecar' ? $(_) : (function(N){ for (x in N) $(N[x].node); })(_.edge_sidecar_to_children.edges); })(window._sharedData.entry_data.PostPage[0].graphql.shortcode_media, function(W){(function(B,I,V){ document.write(['<dd><a href="',(B?V:I),'"><img src="',I,'"></a>'].join('')) })(W.is_video,W.display_url,W.video_url)})Link してはゐないが @id は示されてゐる場合 Copy して URL を追加して……とか、面倒臭いやんけ。
(function($) { for (_ in $) $[_].innerHTML = $[_].innerHTML.replace(/@(\w+)/g, '@<a href="https://instagram.com/$1/">$1</a>'); })(document.getElementsByTagName('p')) // <p> 内の文字列 // document.getElementsByClassName('articlebody') // Safari Feed // document.getElementsByClassName('feedEntryContent') // Firefox FeedInstagram と Twitter の記載がある場合に面倒臭くない奴。
(function($) { for (_ in $) $[_].innerHTML = $[_].innerHTML .replace(/((?:Instagram|インスタグラム)[^[:alnum:]]*@)([.\w]+)/g, '$1<a href="https://instagram.com/$2/">$2</a>') .replace(/((?:Twitter|ツイッター)[^[:alnum:]]*@)(\w+)/g, '$1<a href="https://twitter.com/$2">$2</a>'); })(document.getElementsByTagName('p'))- kyoto-np.co.jp: Article Link for Print
京都新聞 の記事への Link を印刷用に書き換えて転送量を減らす。
(function($) { for (i in $) { _ = $[i].href.split('/'); if (_[4] == 'article' && _[5][0] == '2' && _.length == 6) _[6] = 'print'; $[i].href = _.join('/'); } )(document.getElementsByTagName('a'))- lockerz.com: RSS URI
http://lockerz.com/gallery/{ID} と http://api.plixi.com/api/tpapi.svc/rss/users/{ID}/photos を 相互変換。
(function($, _) { if (_ == 'lockerz.com' && $[1] == 'gallery') location = 'http://api.plixi.com/api/tpapi.svc/rss/users/' + $[2] + '/photos'; else if (_ == 'api.plixi.com' && $[2] == 'tpapi.svc') location = 'http://lockerz.com/gallery/' + $[5]; })(location.pathname.split('/'), location.hostname)- logirl.favclip.com: logirl.favclip.com
もう直ぐ (2017年3月末) 終わる logirl.favclip.com の超絶汚い Script から必要な画像 URI 丈け One Action で抜き出す。
Safari v4, OmniWeb v5 等の WebKit Browser で Access すると Clash するので TenFourFox が要る。
Camino や Firefox v3 だと何も表示されないが、Camino で Test したら上手くいったので TenFourFox でも使えるかと思ったら
.join('\n')で改行が空文字列になるなぁ……、困った。(function($, _) { _ = [$.thumbnailURL.replace(/_[a-z]+$/, '')]; for (x in $.bodyContainsImageURLs) _.push($.bodyContainsImageURLs[x].replace(/\?.*$/, '')); for (x in $.galleries) _.push($.galleries[x].media.full.url); prompt('URIs', _.join('\n').replace(/[-a-z]+\.appspot\.com/g, 'ucon.favclip.com')); })(ARTICLE_DATA[location.pathname.split('/').reverse()[0]], [])でも、元々 Shell Script 書いて、専らそっち使ってて本当は困ってないけど。
- TEPPENラジオ Top Page's Link Fix
NMB48のTEPPENラジオ - MBSラジオ AM1179 FM90.6 の Navigation は無駄の積み重ね。
毎週の番組内容の Digest を Click すると…もう一度同じ内容の Digest が一月分程出てきて、目的の記事を Click すると…漸く個別の内容が読める。
面倒臭いとボヤくよりも、適当に何とかして気楽に暮らそう。
(function($) { for (_ in $) { a = $[_].getElementsByTagName('a')[0]; a.href += $[_].getElementsByClassName('box_li')[0] .getElementsByTagName('h5')[0].innerHTML.split('.').join('/'); } })(document.getElementsByClassName('blog')[0].getElementsByTagName('li'))- nhk.or.jp: Program Flip, Program Change
NHK 番組表, 携帯.読み上げ版 の URI を相互変換する.
(function($, p, L) { for (var _ = [], q = L.search.split('?')[1].split('&'), i = 0; i < q.length; i++) { _ = q[i].split('='); $[_[0]] = _[1]; } window.open((L.protocol + '//www2.nhk.or.jp' + p[0]) + ( (L.pathname == (p[0] + p[2])) ? (p[1] + p[2] + '?a=' + $.area + '&c=' + $.ch + '&d=' + $.date + '&e=' + $.eid) : (L.pathname == p.join('')) ? (p[2] + '?area=' + $.a + '&ch=' + $.c + '&date=' + $.d + '&eid=' + $.e) : (p[1] + '/index.cgi?a=' + ($.a || $.area)) )); })({}, ['/hensei/program', '/text', '/p.cgi'], location)NHK 番組表 キーワード検索 結果 等を 携帯 読み上げ版 で辿れる様に変換する.
(function($) { if (location.pathname.search('/hensei/program/p/') == 0) window.open('http://www2.nhk.or.jp/hensei/program/text/c.cgi?a=201&c=' + $[2] + '&d=' + [$[0].substr(0, 4), $[0].substr(4, 2), $[0].substr(6,2)].join('-') + '&tz=' + ($[3] >= 2400 ? 'midnight' : $[3] >= 1800 ? 'night' : $[3] >= 1200 ? 'afternoon' : 'morning')); })(location.pathname.substring(18).split(/\D/))- nicovideo.jp: Short URI nicovideo
Link する時なんかに便利な の Short URI を表示します。
(prompt('', 'http://nico.ms/' + ( location.href.indexOf('nicovideo.jp/watch/') < 0 || location.pathname.split('/').reverse()[0] ))()外部 Player 等、Server 取っ替え (pathname が同じ場合).
(function(_) { location.hostname = (location.hostname != _) ? _ : 'www.nicovideo.jp' })('your.favorite.hostname')Extract Audio
NicoSound で Download 出来ない場合(私の環境の事)、Video を Get して自前で何とかするしか無い訳ですが…
nicovideo の FLV は Audio Track が MP3 なので抜き出す丈けです。
を事前に準備してから
- QuickTime Player で FLV を開いて Menu: Window: Show Movie Properties (command+J) で Video Track を Delete (又は Audio Track を Extract)。
- MP3 Track 丈けの QuickTime Movie に保存 (Save as a self-contained movie)。
- Terminal で
mp3splt {filename}.mov 0.0 EOFを実行。
この方法は Install も簡単で、読み込み→保存→抜き出し に掛かる時間も夫々数秒なので気楽に出来ます。
只、mp3splt は Xing header の MPEG frame 数が狂う事があるので mp3sar 等で修正したくなりますね。
ぁ、『Mac OS X 向けのコーデック集「Perian」プロジェクト終了へ』ですか。
Audio Track が AAC の場合にも対応出来る方法は
ffmpeg -i {infile}.mp4 -vn -c:a copy {outfile}.m4aで抜き出すのが簡単そうです。只、Install が簡単じゃない場合も在るので其処等辺が一寸アレですが。aiff, aac 等を m4a に変換しても QuickTime Player や iTunes で読めませんでした。
拡張子が aac でも QuickTime Player + Perian の他に Cog, Play, Songbird, VLC 等の Player で聞けます。この方が手軽ですね。
curl -e ';auto' -LO http://download.songbirdnest.com/installer/macosx/ppc/Songbird_0.6.1_macosx-ppc.dmg- photozou.jp: View Original Image photozou
なかなか辿り着けない photozou.jp の「元画像」を表示する。
Twitter の entry から http://photozou.jp/photo/show/*/* に行き、「他のサイズで見る」を選び、「元画像」を…、と三段階の手順が必要な interface を考えた人はきっと頭が『ほほほっほい、ほいほいほいほい』(™ by 安尾信乃助) であらう。
with (location) { (function(_) { _ == null ? undefined : (pathname.indexOf('/photo/photo_only/') > -1) ? (search = '') : (pathname.indexOf('/photo/show/') > -1) ? (href = _) : window.open(_) })(prompt('', ( pathname.indexOf('feed') > -1 || pathname.indexOf('list') > -1 || pathname.indexOf('top') > -1 || hostname.indexOf('photozou') < 0 ) ? 'http://' : href).replace('show', 'photo_only')) }暫く使ってみたら
locationを変更するよりwindow.open()の方が便利だったので変更。 dom.popup_maximum が 0 でなければ (普通の設定なら) 開きます。Safari の feed を書き換え。
(function($) { for (i in $) if ($[i].href.indexOf('/photo/show/') > -1) $[i].href = $[i].href.replace('/show/', '/photo_only/'); })(document.getElementsByClassName('articlehead'))- shm-rss.osdn.jp: Security Hole Memo RSS Heading Decode
セキュリティホール memo の RSS を Mozilla で読むと
h2#feedSubtitleText内に Escape された HTML Tag が見えて不細工なので Decode する、と云う丈けの事。後、h2内にpは書けないので削除もするけど。(function($) { $.innerHTML = $.innerHTML.replace(/</g, '<').replace(/>/g, '>').replace(/<\/?p>/g, ''); })(document.getElementById('feedSubtitleText'))- shupure-net: a.href.replace mp4
shupure-net.shueisha.co.jp って WMV の Link は直なのに MP4 は HTML を読み込む丈けの変な JavaScript になってる。何で?
(function($){ for (_ in $) if ($[_].href.indexOf('/free0') > -1) $[_].href = $[_].href.replace(/^[^']*'/, '').replace(/_mv\.html.*/, '.mp4'); })(document.getElementsByTagName('a'))- twitter.com: s/$/:orig/, Link to Instagram and Twitter
https://twitter.com/{*ID*}/media 等で、Default で表示される画像を Original (らしきモノ) に置き換える。んで、これ作って開いて置き換えて丸ごと保存して楽チ〜ンと思ってたら、私の環境ではもう何にも表示出来なくなくなっちった。 別にいいけど…。ぁ、そういえば、TenFourFox 31.8 の TenFourFox7450.app/Contents/MacOS/browser/chrome/browser/content/browser/browser.js が ClamXav で Html.Exploit.CVE_2017_8757-6336185-0 とか表示されますが、Windows でない場合は問題ないそうです。
Tabs/Windows を開いてもいいけど、最大 80 になるので https://mobile.twitter.com/{*ID*}/media 用でしょうね。でも mobile の方って一つ目の画像しか表示されない上に、二つ目以降の画像に Access する方法が判らないんですよね。
(function($) { for (_ in $) if ($[_].src.indexOf('pbs.twimg.com/media') > -1) $[_].src = $[_].src.replace(/(:\w+)?$/, ':orig'); // window.open($[_].src.replace(/:\w+$/, ':orig')); })(document.getElementsByTagName('img'))Link してはゐないが @id は示されてゐる場合 Copy して URL を追加して……とか、面倒臭いやんけ (二回目)。
(function($) { for (_ in $) $[_].innerHTML = $[_].innerHTML.replace(/@(\w+)/g, '@<a href="https://twitter.com/$1">$1</a>'); })(document.getElementsByClassName('articlebody')) // Safari Feed // document.getElementsByClassName('feedEntryContent') // Firefox FeedInstagram と Twitter の記載がある場合に面倒臭くない奴。
(function($) { for (_ in $) $[_].innerHTML = $[_].innerHTML .replace(/((?:Instagram|インスタグラム)[^[:alnum:]]*@)([.\w]+)/g, '$1<a href="https://instagram.com/$2/">$2</a>') .replace(/((?:Twitter|ツイッター)[^[:alnum:]]*@)(\w+)/g, '$1<a href="https://twitter.com/$2">$2</a>'); })(document.getElementsByTagName('p'))- visualweb.youngsunday.com: Open Sample Images
Safari で feed の最初の項目の Sample Images を開く。
(function($, _) { for (v in $) { if ($[v].href.indexOf('http://visualweb.youngsunday.com/index.html?') > -1) u = 'http://visualweb.youngsunday.com/sample/vol' + $[v].href.substring(52) + '/files/'; for (i in _) window.open(u + _[i] + '.jpg'); return; } })(document.getElementsByClassName('articlehead'), ['101', '102', 'hq1'])- watanabepro.co.jp: View Original Image watanabepro
Link されてゐない blog.watanabepro.co.jp の「元画像」を表示する。
Inline Image Address が http://blog.watanabepro.co.jp/showimg.php?src=http://blog.watanabepro.co.jp/*/archives/mb/*.jpg&w=240 の様になってゐれば Query の URI を取り出す丈けなので、画像を別 Tab で開くか Address を Copy してから実行。
(function($) { null != ( _ = prompt('', ( $.indexOf('blog.watanabepro.co.jp') > -1 ? $ : 'http://blog.watanabepro.co.jp/showimg.php?src=' )).replace(/\.jpg.*$/, '.jpg') .replace(/^.*http:/, 'http:') ) ? window.open(_) : undefined; })(location.search)- webarchive.org: Wayback Machine Search
URI を web.archive.org 又は waybackmachine.org で検索する.
(function($) { window.open( 'http://web.archive.org/web/*/' + // 'http://waybackmachine.org/*/' + $.hostname + $.pathname); })(location)Firefox Add-ons が結構前から在った様です…: Resurrect Pages Version History :: Firefox Add-ons
- youngjump.jp: Gravure background-image
http://youngjump.jp/gravure/ の background-image が Flash の中から呼び出されてゐて見付けにくいので。まぁ、木曜日限定 Script ですが。
(function($, z) { window.open(prompt('', [ 'http://youngjump.jp/gravure/assets/images/top/bg_', $.getFullYear().toString().substring(2), z(1 + $.getMonth()), z($.getDate()), 'g.jpg' ].join('')) || document.stop()); })(new Date(), function(_){return [Math.floor(_ / 10), (_ % 10)].join('')})- youtube.com: iframe.src, live_chat?is_popout, Short URI youtube, Duration, Remove feature(s), xml<=>http
Blog 等の埋め込み要素の Video を Default で読み込まない (permissions.default.subdocument が 1 ではない) 設定の場合 Access し易さが Browser 毎に異なるので Camino とかの面倒臭いヤツでどうするかと云う問題。
(function($) { for (_ in $) if ($[_].src.indexOf('youtube.com') > -1) prompt('', $[_].src.split('?')[0].replace('embed', 'video')); })(document.getElementsByTagName('iframe'))画像を自動で読み込まない設定の場合は Thumbnail も表示されないので見たい場合は手動で開く。Thumbnail の URI は https://i.ytimg.com/vi/{*VIDEO_ID*}/([0-3] | {*RESOLUTION*}default).jpg の最大のヤツかな? 4:3 の時期に設定されたモノが多いので無駄な余白(といっても黒いけど)が在ってイマイチ使い辛いけど、maxres 以外は興味ないから別にどうでもいいっちゃぁどうでもいいし、Live 配信中の Thumbnail 画像が *default_live.jpg に設定されて *default.jpg の方が Video の Poster Frame になってるっぽいのが「逆じゃないの?」と思ふ。
File Name Width Height Aspect Ratio default.jpg 120 90 4:3 1.jpg 120 90 4:3 2.jpg 120 90 4:3 3.jpg 120 90 4:3 mqdefault.jpg 320 180 16:9 0.jpg = hqdefault.jpg 480 360 4:3 sddefault.jpg 640 480 4:3 maxresdefault.jpg 1280 720 16:9 window.open(ytplayer.config.args.raw_player_response.microformat.playerMicroformatRenderer.thumbnail.thumbnails[0].url)()
Chat 欄が邪魔で、普段は CSS で非表示にしてゐるので、見たい時は別窓に開く。背景色は gaming.youtube.com が黒 www.youtube.com は白。
(function($){ window.open([$.protocol, '', $.hostname, 'live_chat?is_popout=1&v=' + ytplayer.config.args.raw_player_response.videoDetails.videoId].join('/')); })(location)Short URI を prompt で表示 (共有 Button を Click するのと略同じ)。permissions.default.script 設定が 1 ではない場合に必要。
(function($, v){ if (v != undefined) _ = $.protocol + '//youtu.be/' + v; else if ($.pathname.indexOf('/user/') == 0 || $.pathname.indexOf('/c/') == 0) _ = $.protocol + '//youtube.com/' + $.pathname.split('/')[2]; prompt('', _); })(location,ytplayer.config.args.raw_player_response.videoDetails.videoId)検索結果等に表示されるのに、当該 URI を表示すると duration が判らない (Image, Video の読み込みが自動ではない場合)。
(function(_, $) { $ = [ [ Math.floor(_ % 60 / 10), (_ % 60 % 10) ].join(''), Math.floor(_ / 60) ]; if ($[1] > 59) { $[2] = Math.floor($[1] / 60); $[1] = [ Math.floor($[1] % 60 / 10), ($[1] % 60 % 10) ].join(''); } prompt('', $.reverse().join(':')); })(ytplayer.config.args.raw_player_response.videoDetails.lengthSeconds, [])Video への Link の
feature={*}を無効に。一々、iframe やら script やら読み込んだりして時間が掛かってどう仕様もない。そんなの要らない。目的の物丈け表示したい。
(function($) { for (i in $) if ($[i].href.indexOf('watch?v=') > -1) $[i].href = $[i].href.replace(/&.*/, ''); })(document.getElementsByTagName('a')) // document.getElementsByClassName('articlehead') /* Safari の Feed を書き換える場合 */Bookmark に gdata.youtube.com で始まる URI が 残ってゐる場合、YouTube Help 云々にしか Access 出来なくなってゐるので User Page に戻してからでないと何も出来ない。不便。Google/YouTube は本当にお莫迦さん。
(function($) { $.href = $.protocol + '//youtube.com/' + $.pathname.split('/')[4]; # /user/ は省略出来る })(location)RSS/HTML を切り替え。YouTube Data API - チャンネル ID への対応 に因る変更。
javascript:(function($, L, M) { try { for (_ in M) if (M[_].getAttribute('itemprop') == 'channelId') $['channelId'] = M[_].getAttribute('content'); } catch(e) {} try { for (_ = [], q = L.search.split('?')[1].split('&'), i = 0; i < q.length; i++) { _ = q[i].split('='); $[_[0]] = _[1]; } } catch(e) {} L.href = (L.pathname.indexOf('/channel/') > -1 || L.pathname.indexOf('/user/') > -1 || L.pathname.indexOf('/c/') > -1) ? ['https://youtube.com/feeds/videos.xml?channel_id=', $.channelId].join('') : (L.search.indexOf('channel_id') > -1) ? ['https://youtube.com/channel/', $.channel_id].join('') : L.href; })({}, location, document.getElementsByTagName('meta'))Video を保存。
Camino (v2.1.2) には ClickToFlash (Safari, OmniWeb), Video DownloadHelper (Firefox) みたいな便利な plugin が欲しくても FlashBlock しかないので、
YouTubeブックマークレット等で生成した Link を option + Click で保存するのが一番便利そうです。- d.getElementById('eow-title').getAttribute('title') + /* Title を取得しても Query で Filename に設定する事が出来なくなったので不必要 */ - yt.playerConfig.args.url_encoded_fmt_stream_map.split(',') + ytplayer.config.args.raw_player_response.streamingData.formats - m.push(0);i=-1;while(m[++i]){x=m[i].split('\x26');f={};x.push(0);j=-1; while(x[++j]){h=x[j].split('=');f[h[0]]=decodeURIComponent(h[1])}t=f.type .match(/video\/([^;]+)/)[1];if((!no_webm||t!='webm')&&(!no_3gpp||t!= '3gpp')){h=d.createElement(f.url?'a':'s');x=f.itag+'.'+f.quality;g=f.url+ (f.sig?'\x26signature='+f.sig:'')+'\x26title='+u+'.'+x;j=g.indexOf('?'); h.setAttribute('href',g.slice(0,j)+'?'+g.slice(j+1).split('\x26').sort() .join('\x26'));h[a](d.createTextNode('['+x+'.'+t+']\x20'));s[a](h)}} + for(_ in m){h=d.createElement(m[_].url?'a':'s');h.setAttribute('href', m[_].url);h[a](d.createTextNode('['+[m[_].itag,m[_].qualityLabel,m[_] .mimeType.match(/video\/([^;]+)/)[1]].join('.')+']\x20'));s[a](h)} - d.getElementById('watch-headline')[a](s); + d.getElementById('title')[a](s); /* TenFourFox v31.*, Camino, Safari v4 用 */ + d.getElementById('clarify-box')[a](s); /* TenFourFox v45.* 用 */因みに、Fx3 (Camino 2.1.2 Gecko 1.9.2.28 20120308211433 ≒ Firefox 3.6.28 Gecko 1.9.2.28 20120306) に FlashBlock を Install しようとすると v1.5.17 を試みて失敗しますが、v1.5.16 を Install してから Update すると v1.5.17.1-signed になります。
んで、Camino に予め Install されてゐる FlashBlock は v1.5.15 以前のモノの様なので v1.5.17.1-signed の .manifest を一寸書き換えて入れ替えて見た処、どうやら正常に動作してゐる様です。
Camino で保存時に Save Dialog が出ない場合は browser.download.useDownloadDir を false にします。
Firefox の初期設定:Applications で Video の項目が Save File にしてあれば、Click する丈けで普通に Save Dialog が出ます。option + Click すると Save Dialog で File name が videoplayback.htm になりますが、{filename}.mp4 等と入力し直せば普通に保存出来る事が多い様です。
Safari では HTML5 を使う設定にすると、MP4 file を再生する様になるので Activity Window の /videoplayback を含む行を Downloads Window に Copy & Paste する丈けで Get 出来たりします。
Audio を保存。
Google が変換 Service を Block してしまったので、結局自前で変換せざるを得ない状況に。転送量も増えるし手間も増えるし良い事が何にも無い。取り敢えず何種類か Get して QuickTime Player + Perian で聞いて比較してみる。内容は Radio 番組で、画像は静止画。Large 以上のモノは画質の Quality は高くても Audio は差が無さそうだし時間が掛かるので Pass.
- mp4 (18: medium)
- AAC, Stereo (L R), 44.100 kHz
- flv よりは File Size は小さくて Audio 部分は少し Bitrate が低いが Radio 番組を聞くのには大差無い感じ。
結局 MP4 以外の選択肢を殆ど排除されてしまったので YouTube 側は負担が減るんだろうけど……、ね。
参考: YouTube: Quality and formats: Comparison of YouTube media encoding options - Wikipedia
- webm (43: medium)
- Vorbis (Perian), Stereo, 44.100 kHz
- 音質は悪くない。分割は mp3splt/vcut で、連結は cat で出来るが、cat した File は QuickTime Player + Perian では再生出来んなぁ……、っと思ったら
ffmpeg -i {infile}.ogg -c:a copy {outfile}.oggで大丈夫みたい。 - 3gpp (36: small)
- AAC, Mono, 22.050 kHz
- Audio 部分が Monaural で Size が小さいのは個人的には有り難い。Radio 番組を聞くのは Talk が主で音楽が聴きたい訳ではないから。
- flv ( 5: small)
- MPEG-2 Layer 3, Stereo, 22.050 kHz
- File Size がデカくて音質が結構悪いが、mp3 audio なので扱える Tool が豊富で、一応 Download 候補 (でも、何故だか転送速度が遅くてやってられない)。Audio 部分は 3gpp に次いで小さい。
- flv (34: medium)
- AAC, Stereo, 44.100 kHz
- 単純に File Size を比較するとデカいので Audio を抜き出す丈けの場合は回避した方が時間の節約になりそう。
遂に此の度 YouTube から FLV が消え去りました。そして何故だか 3GPP も。
Calendar
最近は <table> を使った Calendar が主流ですが、 Source を覗かせて貰うと結構冗長な様ですので cal command に近い Simple なモノを作ってみました。
- ゎ、 jcal っちゅうのがあんねんな。
- 国立天文台 天文情報センター 暦計算室
- 旧暦2033年問題について
- 計算サイト
鶏卵の賞味期限
まぁ、やってみれば判りますが、22℃以上では Minus の値が出てしまうので、暖かい季節は冷蔵庫有りきという結果に。
function salmonella_increase_days(T) { /* T: celsius */
D = 86.939 - 4.109 * T + 0.048 * T ^ 2;
return D; /* (D > 0) ? D : 0; でもいいかも */
}
function celsius2fahrenheit(T) {
return 9 / 5 * T + 32;
}
function fahrenheit2celsius(T) {
return 5 / 9 * (T - 32);
}
不快指数
| 指数 | 感覚 |
|---|---|
| 〜55 | 寒い |
| 55〜60 | 肌寒い |
| 60〜65 | 何も感じない |
| 65〜70 | 快い |
| 70〜75 | 暑くない |
| 75〜80 | やや暑い |
| 80〜85 | 暑くて汗が出る |
| 85〜 | 暑くてたまらない |
初期値は京都の我が家の西日が射す便所の夏の夕方の平均的な環境です ;-(
function celsius2fahrenheit(T) {
return 9 / 5 * T + 32;
}
function fahrenheit2celsius(T) {
return 5 / 9 * (T - 32);
}
function celsius(T, H) {
return 0.81 * T + 0.01 * H * (0.99 * T - 14.3) + 46.3;
}
function fahrenheit(T, H) {
return T - 0.55 * (1 - H / 100) * (T - 58);
}
落雷点迄の距離
音速は気温の影響があるので、それも考慮すると大体こんな感じ?
function speed_of_sound(T) {
return 331.5 + 0.61 * T;
}
function celsius2fahrenheit(T) {
return 9 / 5 * T + 32;
}
function fahrenheit2celsius(T) {
return 5 / 9 * (T - 32);
}
結婚を考えるのに最適な年齢
Professor Anthony Dooley の New fiancée formula for marriage
First of all, set out the last possible age by which you want to get married, for example, 39. Call this number n.
Then, decide the earliest age at which you'll start to consider women as potential wife material, for example, from when you turn 20 onwards. This age becomes p.
Subtract p from n (i.e 39-20), then multiply the result by 0.368. This gives you 6.992, which then needs to be added back to your minimum age (20), which more or less equals 27.
This result is your optimal proposal age. Ideally you should not propose to anyone before you hit this age, but afterwards you should prepare to pop the question to the very next girl you date - as long as she's the best of the bunch so far.
を式にすると p + (n - p) * 0.368 ですが、括弧を展開すると p - p * 0.368 + n * 0.368 となり p を纏めて p * (1 - 0.368) + n * 0.368 の括弧を外すと p * 0.632 + n * 0.368 です。
function nfffm(p, n) {
return 0.632 * p + 0.368 * n;
}
BMI
簡単な計算式なので筆算でも直ぐ出来ますが 18.5〜25 ならば、標準体重と考えて問題ないようです。 Body mass index @Wikipedia
function bodymassindex(W, H) {
return W / H / H;
}
最大公約数と最小公倍数
検索すると迚も冗長な Script も沢山出て来ますが、再帰を使うと Simple に書けて (GameSprit, UchのX40記) 簡単なので、序でに高速化 (ユークリッドの互除法) もしました。
function gcd(x, y) {
return (y != 0) ? gcd(y, (y / 2 < x % y) ? y - x % y : x % y) : x;
}
// GCD: gcd(#1, #2);
// LCM: #1 * #2 / gcd(#1, #2);
簡易素数判定:試行除算法
試行除算法で素数判定します。あまり大きくない数であれば時間も然程掛からない筈。
function primality_test(n) {
if (n % 2 == 0)
return 0;
for (var i = 3, x = Math.sqrt(n); x >= i; i += 2)
if (n % i == 0)
return 0;
return n;
}
懶 Matching
function make_pat_sub(str) {
var firstchar; var lastchar; var butlast; var ret;
if (str.length == 0)
return "";
if (str.length == 1)
return "[^" + str + "]*";
firstchar = str.substr(0, 1);
lastchar = str.substr(str.length-1, 1);
butlast = str.substr(0, str.length - 1);
middle = str.substr(1, str.length - 2);
ret = "((" + make_pat_sub(butlast) + ")*" +
"(" + firstchar + "+" + middle +
"[^" + lastchar + "][^" + firstchar + "]*)*)*"
return ret;
}
function make_pat() {
var result; var inp; var out;
inp = document.getElementById("input-pattern")
result = make_pat_sub(inp.value);
out = document.getElementById("output-pattern");
out.value = result;
}
ものぐさまっちんぐ が、何か長いので短く丈けしてみた。代入を取り除いて入出力部分を HTML の方に記述すると function 一つ丈けで済む。
function mmf(mms) {
return
(mms.length == 0) ? '' :
(mms.length == 1) ? '[^' + mms + ']*' :
'((' + mmf(mms.substr(0, mms.length - 1)) + ')*' + '(' +
mms.substr(0, 1) + '+' +
mms.substr(1, mms.length - 2) + '[^' +
mms.substr(mms.length - 1, 1) + '][^' +
mms.substr(0, 1) + ']*)*)*';
}
<input id="mmi" name="mmi" placeholder="please input text" onkeyup="mmo.value=mmf(mmi.value)">
⇒
<input id="mmo" name="mmo" placeholder="result">
Shift JIS - X0208 <=> ASCII 変換
x5C(\) を { x815F(\), x818F(¥) } のどちらにするかが悩ましい処。
この Script は System 7.5/Mac OS 8 の iCab v2.9.9/Netscape Communicator 4.8 で動く事を示した迚も古いモノです。もっと包括/総括的に処理するには 404 Blog Not Found: javascript - hanzenkaku.js で半角全角処理 の様にしませう (Quote, Hyphen, Back Slash, Tilde の扱いが違うけど)。
FizzBuzz
Colors
References
- JavaScript License Web Labels - GNU Project - Free Software Foundation
- The JavaScript Trap
- GNU LibreJS (TenFourFox に Install すると文字化けして使い物にならなくなるけど一応 Link 丈け)
- Privacy Badger | Electronic Frontier Foundation : 序でに此れも
- ECMA Script
- ECMA-262
- ECMA-290
- ECMA-327
- JavaScript - Wikipedia (English)
- JavaScript - Wikipedia (日本語)
- SpiderMonkey - MDN
- JavaScript - MDN
- JavaScript Guide - MDN
- Safari Developer FAQ
- Google Chrome 版 Firebug: デベロッパーツール取扱説明書 | gihyo.jp … 技術評論社
- bkブログ
- 404 Blog Not Found: 私がJavaScriptを初心者用の言語として選んだわけ
- 404 Blog Not Found: Lightweight Languages
- JavaScript によるオブジェクト指向プログラミング: CodeZine
- オブジェクト指向言語としてのJavaScript
- JavaScript Tips collection
- JavaScript HowTo
- Handlebars.js: Minimal Templating on Steroids
- JavaScriptでマンデルブロ集合を描く
- JSLint
- 安岡孝一のJavaScriptプログラム
- ペグ・ソリテア - パズル (Peg Solitaire)
- 小さなツールたち:HTML雛形
- うえぽんSW局 | 適当なページをウゴウゴルーガ化するブックマークレット
- slayeroffice
- FC 版 DQ2 姓名判断
- 高度な JavaScript 技集
- Ajax RFC 検索
- fj.comp.lang.javascript
- japan.comp.lang.javascript
- Computers: Programming: Languages: JavaScript (dmoz.org)
- World: Japanese: コンピュータ: プログラミング: 言語: JavaScript (dmoz.org)
Books
- JavaScript & DHTMLクックブック 第2版
- Prototype & script.aculo.us
- Head First JavaScript
- JavaScript: The Good Parts
- 初めての JavaScript 第2版
- JavaScript パターン
- ハイパフォーマンス JavaScript
- JavaScript クックブック
- JavaScript グラフィックス
- JavaScript リファレンス 第6版
- ステートフル JavaScript
- JavaScript 第6版
- 入門 モダン JavaScript
- メンテナブル JavaScript
- JavaScript デザインパターン
- 開眼! JavaScript
- テスタブル JavaScript
- JavaScript で学ぶ関数型プログラミング
Script の整形に OS 付属の indent を使ってゐました。引数はこんな感じ…
が、 Multibyte に対応してないので結構困ります。んで仕方なく GNU indent を install.
HUNDOSHI-EDIT で使ってます。
#!/bin/sh /opt/local/bin/gnuindent \ -ts8 -pi8 -ip8 -i8 -di8 -ci8 -cli0 -cbi0 -bli0 -lc128 -l128 \ -ut -ss -sob -sc -saw -sai -saf -hnl -fca -fc1 -cdb -brs -br -bc -bbo \ -npsl -nprs -npcs -nlp -nce -nbap -nbad "$1" -o "$2"SpiderMonkey は MacPorts で簡単に install 出来ます。