素人がプログラミングを勉強していたブログ

プログラミング、セキュリティ、英語、Webなどのブログ since 2008

連絡先: twitter: @javascripter にどうぞ。

2008-07-01から1ヶ月間の記事一覧

今見てるGreasemonkeyスクリプトをインストールするブックマークレット

javascript:void (location.href += "#.user.js"); リロードもしないのでいい感じ。 Greasemonkeyスクリプトも書いたけど、Greasemonkeyのユーザーメニュー自体アクセスしずらいから、インストールはブックマークレット、.user.jsで終わるリンクの修正はGrea…

配列のユニーク化、(unique)

追記2:concatだと配列のなかに配列が入ってると勝手に展開されて駄目だった。Constellationさんのコメントのコードを使うとその問題も起こらない。 追記:配列の中身に文字列以外が入ってるとうまくいかない。詳しくはコメント参照。 こうするといい。 func…

Greasemonkeyスクリプトの末尾に?.user.jsを付けるスクリプトを汎用的に使えるようにした(SITEINFO)

os0x's gist: 2000 — Gist に、gist.github.comにピンポイントで使えるものがあったのだけど、もう少しいろんなサイトで使いたかったから僕も書いた。 アドレスが.user.jsで終わるものに?をつけるGreasemonkeyスクリプト - 素人がプログラミングを勉強するブ…

Greasemonkeyから安全にconsole.logを利用する

console.logを使う時は、unsafeWindow.console.log.apply(unsafeWindow.console, arguments);みたいにしたり、 location.href = "javascript:console.log(" + Array.map(arguments, uneval).join() + ")";みたいにすることが多い。 だけど、前者は安全ではな…

gist.github.comから.user.cssのファイルをstylishにインストールするGreasemonkeyスクリプト(作成失敗、未完成)

gist.github.comに.user.cssのファイルを置いて、userstyles.orgの代わりにしようと思ったのだけど、Stylishのインストール機構が複雑で出来なかった。下のコードは破片。動きすらしない。分かったことは、 Stylishは、userstyles.orgのインストールボタンを…

XPathとSelectorsAPIとgetElementsBy〜の使い分け

微妙に役割の被っている、document.evaluateとSelectorsAPIを、どう使い分けるかという話。 僕は最近、 タグ名、クラス名、idで一発で取得できる場合は速度のためにgetElements系のものを使う。 XPathでできて、SelectorsAPIでできない時は、XPathを使う。 X…

要素を背景のように使用する(選択もコピーもされない)

XUL Apps > Text Shadow - outsider reflexで、XBLを使って、コピーも選択もされない要素を作成するというテクニックが紹介されている。 Greasemonkeyスクリプトの場合この方法はとれないが、Mozillaの拡張CSSを使ってそれらしいことを実現できる。コードは…

jQueryの独自セレクタについて

.querySelectorや.querySelectorAllを使えばAutoPagerize/SITEINFO3 - 958 Wiki*のSITEINFOをAutoPagerizeで使えるようになるかな、と思ったけど、、jQuery独自のセレクタがかなり使われているので駄目だった。 :first、:last、:even、:odd、:eq、:gt、:ltあ…

Firebugの$$を最新のCSSセレクタに対応させる

Firebugの$$は、自前でセレクタをXPathに直していたりして効率が悪く、CSS3のセレクタにも対応していない。 (プロファイルのフォルダ)/extensions/firebug@software.joehewitt.com/content/firebug/commandLine.jsの630行目あたりを this.$$ = function…

Greasemonkey用ユーティリティ関数(XPathとCSS Selectorの両方を受け取る関数、$nなど)

function Class() function () { if (typeof this.initalize == "function") return this.initalize.apply(this, arguments); } function extend(base, ext) { for (var prop in ext) if (ext.hasOwnProperty(prop)) { var g = ext.__lookupGetter__(prop), …

リンクのURL、画像のalt属性をポップアップ(jQuery風味)

jkQueryっていう名前に特に意味はない。かなり大げさだけど、書いてみたよってことで。 function jkQuery(selector, context) { if (!(this instanceof jkQuery)) return new jkQuery(selector, context); return jkQuery.prototype.init.apply(this, argume…

はてなの既読のリファラーを半透明にするGreasemonkeyスクリプト

CSSセレクタだけでは親要素をたどることができないので、SelectorsAPIで取得したもののparentNodeをたどってる。 // @name refferlistHighlight // @namespace http://d.hatena.ne.jp/javascripter/ // @include http://d.hatena.ne.jp/* // ==/UserScript==…

FirefoxのtrunkにSelectors APIが搭載された!

function _$$(selector) $A(document.querySelectorAll(selector)); function $A(obj) Array.slice(obj); _$$('a[href]'); こんな感じに動く。すごい。返り値がNodeListだからdocument.evaluateより使いやすいかもしれない。 関数名を$$ではなく_$$にしてい…

要素の小要素を取得する

いろいろ調べたけど、下のような原始的な方法をとるしかないようだ。 function getChild(parent) Array.filter(parent.childNodes,function(elem) elem.nodeType == Node.ELEMENT_NODE); ほかには、XPathを使って function getChild2(parent) { var xp = doc…

document.createTreeWalkerとArray.prototype.filterとXPathの比較、テキストノードを取得する場合

経由でTreeWalkerを知って、速度はどうなんだろうなーと思って調べた。 TreeWalkerについてはMozilla Developer Networkを参考にした。 function getTextNodes (parentNode) { var walker = document.createTreeWalker( parentNode, NodeFilter.SHOW_TEXT, {…

Firebugのxpiをソースから組み立てる

CUIをあまり使う機会がなかったので、だいぶ戸惑った。 ターミナルで下の通り実行するとFinderでxpiの入ったフォルダが立ち上がるからFirefoxにドロッグ&ドロップすればいい。 cd ~/tmp/ svn checkout http://fbug.googlecode.com/svn/trunk/ fbug cd fbug a…

.vimrc

GUIじゃないほうのvimを使い始めた。.vimrcは下のような感じ。 クリップボードにコピーする方法がよくわからない。Macではpbcopyコマンドでクリップボードの操作ができるので、手探りで:%!pbcopyとしたらコピーできたけど、日本語が化ける。 vim難しい。 se …

テキストエリアにタブを入力できるようにする

追記:MacのFirebugのF12は、Dashboardにショートカットを取られていただけだった。F12の割り当てをはずすと普通に動作する。 (function() { const TAB_SPACE = "\t"; var areas = document.getElementsByTagName('textarea'); Array.forEach(areas, functio…

NodeListやHTMLCollectionに直接アクセスするより、一旦静的な配列にしたほうが速い

console.time('nodeList'); var elems = document.getElementsByTagName('*'); for(var i=0;i<1000;i++) for(var j=0;j

getとsetについてのメモ

functionの省略表記のように、get、setも省略表記がつかえる。 ({ get x()1234 }).x; // 1234 クラス共有の変数を隠蔽したい場合、this._xみたいにしなくても window.__defineGetter__( 'foo', function() { var x = Date.now(); function foo() {} foo.prot…

配列内包を使った画期的なFizzBuzz

画期的でもなんでもなく、バッドノウハウ。 [++i%15?i%3?i%5?i:'Buzz':'Fizz':'FizzBuzz' for(i in Array(101).join())].join("\n"); 配列内包は文字列にも使えるので、 [c for each(c in 'foobar')]; // ["f", "o", "o", "b", "a", "r"] のようなことができ…

Objectへの分割代入

Objectへの分割代入を使うと、一部の引数を省略できる関数が書きやすくなる。分割代入というのは、下のようにいっぺんに必要なプロパティだけを変数に入れるための構文。 var { offsetWidth: x, offsetHeight: y } = document.body; console.log("bodyのoffs…

はてなブックマークの情報を並び替えるGreasemonkeyスクリプト

追記:このエントリーを含む日記、とかがない場合にうまく動かないので、下のスクリプトは使わないほうがいいです。 このエントリーの関連エントリー このエントリーをブックマークしているユーザー このエントリーを含むほかのエントリー このエントリーを…

Classコンストラクタ

function Class() function() { if (typeof this.initalize != 'function') return this; var ret = this.initalize.apply(this, arguments); if (ret === null) return { valueOf: function() null }; switch (typeof ret) { case 'number' : return new Nu…

オブジェクトが存在しているかどうかを確かめる

function isExist(str) { var p = window; return str.split('.').every(function(o) typeof(p = p[o]) != 'undefined'); } isExist('window.document.body'); //true isExist('navigator.foo.bar'); //false 一見"window.document"みたいなのがうまくいかな…

そろそろプログラミングキャンプについて一言言っておくか

404 Not Foundに応募したら受かったので、プログラミングコースのほうに参加します。 講師、参加者のみなさん、よろしくお願いします。

Twitterの文字数カウンタを入力中にも動作させたり、ロード時にテキストエリアにフォーカスしないようにするGreasemonkeyスクリプト

Twitterの残り文字数カウンターを、IMEで入力中にも動作させるGreasemonkeyスクリプト - 素人がプログラミングを勉強するブログとTwitterのテキストエリアに自動でフォーカスする機能をオフにするGreasemonkeyスクリプト - 素人がプログラミングを勉強するブ…

Object.prototype.__noSuchMethod__を使ってメソッドチェーン

function toChain(obj) { this._parent = obj; this.valueOf = function() obj; } toChain.prototype.__noSuchMethod__ = function(id, args) { var v = this._parent[id].apply(this._parent, args); this.valueOf = function() v; return this; } var chai…

pre要素の前にダウンロード用のリンクをつける

// ==UserScript== // @name preGet // @namespace http://d.hatena.ne.jp/javascripter/ // @include http* // ==/UserScript== function insertDownloadLink(doc){ var pre = doc.getElementsByTagName('pre'); Array.forEach(pre, function(pre){ var a =…

li要素の行番号をコピーしないようにするGreasemonkeyスクリプト

シンタックスハイライトなどのスクリプトを導入しているページで、li要素を含むものをコピーすると、行番号が入ってしまってそのまま実行することができない場合がある。 下のスクリプトを使うとそういったことが起こらなくなる。 // ==UserScript== // @nam…