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

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

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

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

DOM構築後に実行する、すでにDOMが構築されてても実行する

addEventListener("DOMContentLoaded")だと、DOM構築後にリスナを設定した場合一度も呼ばれないので、ブックマークレットのようにいつ実行されるか分からないような時には使えない。 WebKitだと、document.readyStateがあるから、それを使えばいいけど、Fire…

SuffixArray

接尾辞配列 - Wikipediaを見ながら書いたのだけど、どう使うのかよく分かってない。 function SuffixArray(str) [str.substr(i) for(i in xrange(str.length))].sort(); function xrange(start, end, step) { if (typeof end != "number") [start, end] = [0…

配列のシャッフル

検索しないで自分で考えたら、下のようなのができた。均等にランダムになるといいな。自信ない。 function shuffle(list) { var mark = {}, ret = [], max = list.length, n = null; while (max--) { n = Math.random() * max | 0; while (n in mark) n = ma…

配列のシャッフル

追記:from random import shuffle from random import random shuffle = lambda lis: [i[1] for i in sorted([[random(), i] for i in lis], lambda x, y: cmp(x[0], y[0]))] shuffle(range(10)) # [9, 1, 2, 3, 0, 8, 7, 5, 6, 4] list#sortは破壊的なので…

Pythonみたいにforを使う

JavaScript1.8+のみ function xrange(start, end, step) { if (typeof end != "number") [start, end] = [0, start]; if (typeof step != "number") step = 1; if (step > 0 ? end > start : start > end) { var sz = parseInt(Math.abs((end - start) / ste…

素数を探す

Pythonのrange関数は、個数が決まっていないと使えないので、無限ループして条件が揃ったらbreak、みたいな使いかたができない。 なので、infrange関数を作っておくと便利かもしれない。 def infrange(start = 0, step = 1): while True: yield start start …

リンクの文字列を選択できるようにするGreasemonkeyスクリプト

Firefoxのデフォルトの状態だと、リンクの途中からや、リンクの途中までを選択しようとすると、ページが移動してしまう。 // ==UserScript== // @name BetterLinkSelection // @namespace http://d.hatena.ne.jp/javascripter/ // @include http* // ==/User…

LDRをFirefoxのnightlyでも動くようにするGreasemonkeyスクリプト

追記:Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10.5; en-US; rv:1.9.1b1pre) Gecko/20080926210429 Minefield/3.1b1preで、window.Function == Functionがtrueになり、それにともないLivedoorReaderも普通に動くようになりました。下のスクリプトはもう…

複数ウィンドウのスクロール、入力を同期するGreasemonkeyスクリプト(globalStorageを使った同ドメイン間のスクリプトの通信)

デモ動画: 2008-09-24_1540 - javascripter's library // ==UserScript== // @name syncScroll // @namespace http://d.hatena.ne.jp/javascripter/ // @include http* // ==/UserScript== GM_registerMenuCommand("start demo", function(e){ syncScroll()…

4Uから画像をダウンロードする

imgフォルダ以下にダウンロード。 #!/usr/bin/env python import urllib2 import urllib import urlparse import os import time from BeautifulSoup import BeautifulSoup BASE_URL = "http://4u.straightline.jp/?page=" if not os.path.isdir("img"): os.…

Python、クロージャ、自己代入

一回目に実行した時に上書きすればできるみたい。 def power(*args): memo = {} def tmp(n): if n in memo: print "memoized" ret = memo[n] else: ret = 0 for i in range(n): ret += n memo[n] = ret return memo[n] global power power = tmp return powe…

4つの数字から四則演算で10になるのを見つける

function calc(a,b,c,d){ var all = [add, sub, mul, div]; var r = []; all.forEach(function(op1){ all.forEach(function(op2){ all.forEach(function(op3){ if (op3(op2(op1(a, b), c), d) == 10){ r.push("((" + a + op2s(op1) + b + ")" + op2s(op2) + …

ファイル読み込み、yield

追記:コメント欄によると、openをforで回す時、自動的にcloseされるので下のようにはしなくていいみたい。 下のソースをtest.pyとして保存して実行すると、自分自身のソースコードを表示する。 #!/usr/bin/env python def getline(fname): f = open(fname) f…

unique、ジェネレータ

連想配列のキーに使えないものが配列の要素に入ってると駄目だろうけど、数値とか文字列とかTupleなら動くと思う。 def uniq(lis): done = {} for it in lis: if it not in done: done[it] = True yield it [i for i in uniq([3, 4, 2, 1, 3, 4, 6, 8, 1])] …

数字にコンマを振る

一応出来たには出来たのだけど、すごく格好が悪い。JavaScriptの感覚でstr(num).split("")ってすると、ValueError: empty separator。 list(str(num))だと平気。なんでだろう。 def toCommaStr(num): nums = list(str(num)) sz = len(nums) ret = nums[:sz %…

Python、FizzBuzz

ついさっきPythonをはじめた(教わった)ので、FizzBuzzを書いた。 for i in range(1, 100 + 1): if i % 15 == 0: print "FizzBuzz" else: if i % 3 == 0: print "Fizz" else: if i % 5 == 0: print "Buzz" else: print i sudo easy_install ipython して、ipy…

NodeItearatorを使う

NodeIteratorは、TreeWalkerのショボい版のような物で、Nodeを辿っていける。ただ、絞り込む条件として、要素や属性、テキストノードなどしか指定できないので、関数呼び出しが増えて、XPathと組み併せる場合と比べると総合的な速度が落ちる事が多い。下のス…

プライベートなメンバ

function createClass(base){ var self = {}; function Class() self.initialize.apply(self, arguments); for(var key in base) if(base.hasOwnProperty(key)){ extend(base, key, self, self); if(key.charAt(0) != "_"){ extend(base, key, Class.prototy…

Generatorのprototypeの取得方法

下のようにする。yieldとかgetPrototypeOfとか使ってるので、最近のFirefoxでしか動かないと思う。 let __proto__ = Object.getPrototypeOf( function dummy(){yield;}()); __proto__.toArray = function() [i for(i in this)]; function range(start, end){…

Arrayにfor..in、for eachを使っても順序が保証されるようにする(__iterator__)

Array.prototype.__iterator__ = function(isKey) { var self = this; return (isKey ? i[0] : i[1] for (i in new Iterator(self))); }; for(var i in [1, 2, 3]) console.log(i); // 0, 1, 2 これで、Arrayに対しても安心してfor..inを使うことができる。…

グローバル変数とnew Function(バッドノウハウ)

関数内からグローバル変数を設定したい場合、 var global; (function(){ global = 42; })(); とする事ができる。 ただし、グローバル以外にも同じ名前の物があると使えない。 var $; (function(){ $ = $; function $(id){ return document.getElementById(id…

JavaScriptでマルチスレッド(navigator.newWorkerPool)

437152 – implement worker threadsを使ってみる。 var thread = navigator.newWorkerPool(); thread.createWorker(function(){ setTimeout( clearInterval, 1000, setInterval(postMessageToPool, 5, "thread1")); }.toSource() + "()"); thread.createWork…

空配列の真偽値へのキャストとBoolean

==を使う時はてっきり、Booleanで真偽値にキャストされると思ってたのだけど、違うみたい。 var empty = []; empty == empty; // true new Boolean(empty); // new Boolean(true) Boolean(empty); // true !!empty; // true empty == true; // false Boolean…

setIntervalの便利版

setIntervalは、登録したcallback関数のthisがおかしくなったり、callback関数に値を渡すのが面倒臭かったり(値を渡すにはsetIntervalの第三引数を使えばいいけど、それだと引数が固定されちゃう)、タイマーのidが、setIntervalの戻り値にしか渡されないから…

pre要素をダブルクリックで選択する

// ==UserScript== // @name BetterDoubleClick // @namespace http://d.hatena.ne.jp/javascripter/ // @include http* // ==/UserScript== document.addEventListener("dblclick", function({target: elem}){ elem = document.evaluate( "ancestor-or-self…

はてなダイアリー、グループ用のコンパクトなAutoPagerize

はてなにはクリックで次ページをAjaxに読み込む、はてなスターにも対応してるスクリプトがついてるのに、使わないのはもったいない。かなり力技だけど、下みたいにするとAutoPagerizeみたいにスクロールだけで継ぎ足すようになる。 // ==UserScript== // @na…

AutoPagerizeのSITEINFO探索にはどれくらいの時間がかかっているのか

document.getElementsByTagName("head")[0] .appendChild( document.createElement("script")) .src = "http://wedata.net/databases/AutoPagerize/items.json?callback=callback"; function callback(siteinfo) { console.time("siteinfo"); for (var i = 0…

いろんなサイトに落書きするブックマークレット

Firefox、Opera、WebKitで確認。けっこう楽しい。 javascript:(function(){ var canvas = document.createElement("canvas"); canvas.width = Math.max(document.documentElement.scrollWidth, window.innerWidth); canvas.height = Math.max(document.docum…

20〜30行くらいでjQueryっぽくする

jQueryを使うと短く書けていいのだけど、Greasemonkeyで使うのにはちょっと大げさ。なので、ネイティブのメソッドを簡単に呼べるようなものを書くと、コンパクトで便利。 メソッドチェーンにはあまりこだわってない。 var $ = // Firebugで実行できるように…

Array.prototype[2] = "hoge";としたらどうなるか

var a = [1,2,,4]; console.log(2 in a); // false Array.prototype[2] = "hoge"; console.log(2 in a); // true for(var i = 0;i < a.length;i++) console.log(a[i]); // [1,2,"hoge",4] a.forEach(console.log); // [1,2,"hoge",4] for(var [key,value] in…