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

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

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

2009-01-01から1年間の記事一覧

Grab and Drag for Google Chrome

MacのChromiumの最新版でしか確認していないのでそれ以外の環境で動くかは未確認。それから、cursor: -webkit-grab等の値は認識されているがカーソルに反映されていないようであり、よくわからないのでそのままにしてある。 乗り遅れないうちに、Google Chro…

クリップボードにコピー

Chromeのcopyは, たしか, 隠しinput[type=text]作ってcopyさせたいものをvalueにいれて, selectionStart/Endをいじって, focusあてて, document.execCommand('copy')すればJSだけでできる. http://twitter.com/Constellation/status/7188365498 これを参考に…

足し算引き算で10を作るゲームと部分和問題、DP

切符の問題 切符の裏に印刷してある4桁の数字を4つの数字と考えて、足し算と引き算だけで10を作るゲームの解き方。 例えば、1,2,3,4の場合は1+2+3+4=10。プログラム的には、 prob([1,2,3,4]); // [{plus: [1,2,3,4], minus: []}] こんな感じに返ってくるよう…

カード配り問題

10分でコーディング|プログラミングに自信があるやつこい!!を見て、僕だったらどう書くかなと考えた。 まず、10分で解くことを目標に急いで書いた物。最後のほう読むの忘れて引数名などをミスった。 function range(start, end) { var a = []; var i; f…

YouTube

javascript:(function () { var get_video_id = function () { return yt.getConfig("VIDEO_ID"); }; var get_title = function () { return yt.getConfig("VIDEO_TITLE"); }; var get_t = function () { return yt.getConfig("SWF_ARGS").t; }; var make_do…

キャッシュと効率

Life is beautiful: Python Hack : 噛めば噛むほどおいしくなるクロージャの話を見て、いろいろと気になるところがあったので書いてみる。 import yaml def _get_from_disk(): data = open('config.yaml').read().decode('utf8') config = yaml.load(data) …

メモ

sprintfっぽい物を先頭に書いておくと、けっこう便利。 function sprintf() { // limited implementation of sprintf. var format = arguments[0], argv = arguments, i = 1; return format.replace(/%([s%])/g, function (all, type) { return type == "%" …

Selectors APIのmatchesSelectorと、動的なページでのイベント処理

Selectors APIのDraftに、matchesSelectorというAPIが定義されていて、現在、WebKitとMinefieldのNightlyに搭載されている。 ただし、ドラフトなのでベンダープレフィックスがついていて、Element#webkitMatchesSelectorやElement#mozMatchesSelectorを使わ…

Firefox trunkにtransitionとかが入った

CSS Transitionsと呼ばれる機能で、CSSでアニメーションとかを実現する物。Safariには前からあった。 <style> body { -moz-transition: 5s all linear 0s; -webkit-transition: 5s all linear 0s; transition: 5s all linear 0s; text-align: center; text-shadow: </style>…

リストがソート済みかどうか

isSorted :: (Ord a) => [a] -> Bool isSorted [] = True isSorted [_] = True isSorted l = and $ zipWith (<) l (tail l) こんな感じに書ける。最近、zipやzipWith、mapといった基本的な高階関数が最初から(もしくは、builtinのモジュールとして)存在し…

WebKitでサポートされつつあるECMAScript5の新機能たち

最近、WebKitにObject.defineProperty、Object.defineProperties、Object.getOwnPropertyDescriptor等、今まで間接的にしかいじれなかったり、JSからは設定することのできなかった内部プロパティを操作するためのメソッドが入った。現時点のWebKitに入ってい…

1のビットを数える

01011010を4にする関数。 結論から言うと、__builtin_popcountを使えば良い。 int popcount(unsigned int n) { int i = 0; while (n) { i += n & 1; n >>= 1; } return i; } ごく普通にやるとこう。遅い。 int popcount(unsigned int n) { int i = 0; while …

location.protocol

location.protocolに変な文字列を入れた場合の挙動。 location.protocol = "javascript://\nalert(1)//" Safariでalertが表示される。XSSAuditorがコメント部分をチェックしないので最近のWebKitでもrefuseされない。 http://twitter.com/javascripter/statu…

Snow Leopardでghcを使う

現時点ではMacPorts上のghcはsudo port install ghcでは入らない。 Snow Leopardで動くghcは、GHC: Download version 6.10.4だ。 ただし、ghciやrunghcは動くがghcでのコンパイルは失敗するので、MacPortsのghcが動くようになったら、sudo /Library/Framewor…

重み付き配列

重みを考慮しつつランダムに配列から値を取り出す。 javascripter's gist: 180816 — Gist に置いた。 人口密度を元に、都道府県を取り出す場合を例にとって説明する。 |東 京|大 阪|神奈川|埼玉|..|.||上記のように一本の線として捉えて、chioce時にrand(0, …

ゴミ箱に入れるコマンド

WindowsだとdelコマンドがあるらしいがMacにはない。 javascripter's gist: 177415 — Gist に置いた。 del file1 file2 file_or_directory3のように使う。ファイル名に空白が含まれていても平気。 ファイル名が重なったら、1.foo、2.foo、…という風に数字を…

evalにハッシュを渡せるように

RubyのERB#run、ERB#resultがbindingを受け取るのが気持ち悪いので、ハッシュを受け取れるようにしたらどうか、という話。 def hashing(pair) Class.new { pair.each {|key, value| define_method(key.to_sym) { value} } }.new.instance_eval { binding } e…

今月が何日まであるかを表示する

次の月の一日前のDateTimeオブジェクトのdayメソッドが今月の終わりの日付。 追記:id:udzuraによると、DateTime.new(t.year, t.month, -1)と書けるらしい。このほうがオブジェクトをたくさん作らなくていいのでスマートだ。 #!/usr/bin/env ruby require 'e…

rangeとジェネレータとzip

range()オブジェクトとジェネレータの違いについて調べた。 def enum_from_to(begin, end): i = begin while i < end: yield i i += 1 まず、rangeの機能を限定したようなジェネレータを定義する。 print (list(zip(enum_from_to(0, 10), enum_from_to(0, 10…

classList、relListがFirefoxに入った

HTML5で定義されている、classNameやrelを操作するための新しいAPIがFirefoxのナイトリーに入った。 var p = document.createElement("p"); p.classList.add("foo"); console.assert(p.className == "foo"); p.classList.add("bar"); console.assert(p.class…

GeolocationとGoogle Maps

Personalize Your Homepageからインストールできる。 Firefox等に搭載されているGeolocation API(Geolocation API Specification)を使って、Google Mapsに現在位置を表示する。 マップレットと呼ばれる、Google Maps APIが使えるWidgetのような物を使用する…

query_string

javascripter's gist: 159058 — Gist に置いた。 a=b=cという文字列を["a", "b=c"]に分離するために.split("=")を使うことはできない。あまり使われることのない第二引数のlimitを使って.split("=, 2)としても、["a, "b"]になってしまうので、使えない。 追…

円周率の近似値の計算

何か新しい言語をはじめる時、Hello, World!だと簡単すぎるので代わりに円周率を計算するようにしている。 javascripter's gist: 156960 — Gist foldlに無限リストを渡すと止まらなくなってしまうので、pi'で精度を指定するようにしたけれど、微妙…。 あと、…

ナイトリーでGreasemonkeyを動かすパッチ&GreasemonkeyでJavaScript1.8

Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10.5; en-US; rv:1.9.2a1pre) Gecko/20090719 Minefield/3.6a1preで確認。 Illegal valueといったエラーで動かなくなるのを修正する。 (function () {})();で囲っている部分のコードがまずかったようなのでそれを…

WebKitに入ったXSS検知機能

追記: 下記のXSSは修正された。修正前は下記のURLにアクセスすると <link rel="alternate" type="application/rss+xml" title="RSS2.0" href="http://live.nicovideo.jp/recent/rss?tab=&sort="><script>alert("XSS");</script><meta id="&p=1" /> のようになっていた。追記ここまで。 ttp://live.nicovideo.jp/search?sort="><script>alert("XSS");</script></meta></link>

wait

同期XMLHttpRequestを使ってJavaScriptでwaitする。 wait.html <html> <head> <title>wait test</title> <script>window.onload = function () { var script = document.getElementsByTagName("script").item(0); var code = document.getElementsByTagName("code").item(0); code.appendChild(</head></html>…

オブジェクトが循環参照を持つかどうか判定する

javascripter's gist: 139376 — Gist に載せた。 function isCircular(obj) { function isCircularWithAncestors(obj, ancestors) { var k; for (k in obj) if (ancestors.indexOf(obj) >= 0 || obj[k] instanceof Object && isCircularWithAncestors(obj[k]…

JSON、8進数

クライアントサイドでjQueryを使う場合にサーバが返すJSONで気をつけないといけないこと - 文殊堂を見て興味が湧いたので調べた。まず、0123のように、0以外で先頭が0の数値はJSONとして不正である。 2.4. Numbers (略) Octal and hex forms are not allowed…

独自ドメイン+Google Apps

VALUE-DOMAINで取得したドメインをGmailで使えるようになるまで。 Google Appsに登録する。無料アカウントで良い。 VALUE-DOMAINのドメイン別操作の、ネームサーバー変更から、「VALUE-DOMAIN独自のネームサーバー(国内)」を選ぶ。 Google AppsのDashboardか…

valueOfとtoString

var o = { valueOf: function () { return "valueOf"; }, toString: function () { return "toString"; } }; alert("" + o); }; のようなコードは、"valueOf"になる。toStringよりもvalueOfのほうが優先される。 サイ本を読み返したら、きちんと書いてあった…