2009/01/21


このサイトでは、jQuery Lightbox Plugin は"balupton edition"を入れているのですが、jQueryのバージョンを1.3に上げた途端、エラーが出る様になってしまいました。
調べた所、jQuery1.3ではSizzleという新しいセレクタが採用されており、以下の様な属性フィルタが動かない事が分かりました。
$('[@rel*=foo]')
さらに調べた所、どうやら"@"を付けている事自体が間違っているらしく"@"を取って $('[rel*=foo]')
としてやれば動く様になりました。なぜオリジナルの"@"付きのまま動いていたのかは分かりませんが...
本体への反映は以下
--- jquery.lightbox.js.orig 2008-09-12 02:46:50.000000000 +0900
+++ jquery.lightbox.js  2009-01-21 21:15:37.312500000 +0900
@@ -827,7 +827,7 @@
            var groups_n = 0;
            var orig_rel = this.rel;
            // Create the groups
-           $.each($('[@rel*='+orig_rel+']'), function(index, obj){
+           $.each($('[rel*='+orig_rel+']'), function(index, obj){
                // Get the group
                var rel = $(obj).attr('rel');
                // Are we really a group
ま、balupton edition使ってる人少ないかも知れませんが...
Posted at by



2009/01/16


今日、とある場所でkanaさんからvimに"syn-include"なんて物があるのを教えて貰いました。

:he syn-include
9. Including syntax files                               *:syn-include* *E397*

It is often useful for one language's syntax file to include a syntax file for
a related language.  Depending on the exact relationship, this can be done in
two different ways:

        - If top-level syntax items in the included syntax file are to be
          allowed at the top level in the including syntax, you can simply use
          the |:runtime| command: >

  " In cpp.vim:
  :runtime! syntax/c.vim
  :unlet b:current_syntax

<       - If top-level syntax items in the included syntax file are to be
          contained within a region in the including syntax, you can use the
          ":syntax include" command:

:sy[ntax] include [@{grouplist-name}] {file-name}

          All syntax items declared in the included file will have the
          "contained" flag added.  In addition, if a group list is specified,
          all top-level syntax items in the included file will be added to
          that list. >

   " In perl.vim:
   :syntax include @Pod <sfile>:p:h/pod.vim
   :syntax region perlPOD start="^=head" end="^=cut" contains=@Pod
<
          When {file-name} is an absolute path (starts with "/", "c:", "$VAR"
          or "<sfile>") that file is sourced.  When it is a relative path
          (e.g., "syntax/pod.vim") the file is searched for in 'runtimepath'.
          All matching files are loaded.  Using a relative path is
          recommended, because it allows a user to replace the included file
          with his own version, without replacing the file that does the ":syn
          include".
知らんかった...
これを使えばPerlのPodだけ別のsyntaxファイルから適用出来るといった物。
これは凄い!

つまりはregionだけ決められれば、その部分に言語毎のsyntaxが適用出来る事になる。試しに、はてなのスーパーPre記法に色を付けられる様にしてみた。
ベースはmotemenさんのhatena-vim
motemen's hatena-vim at master - GitHub

Vim scripts for posting/updating hatena diary/group

http://github.com/motemen/hatena-vim/tree/master
このsyntax/hatena.vimの最下行に以下のコードを貼り付ける。
" append to syntax/hatena.vim
function SyntaxSuperPre()
  let lnum = 1
  let lmax = line("$")
  let mx = '^>|\(.*\)|$'
  while lnum <= lmax
    let curline = getline(lnum)
    if curline =~ mx
      let lang = substitute(curline, mx, '\1', '')
      exec 'runtime! syntax/'.lang.'.vim'
      unlet b:current_syntax
      let syntaxfile = fnameescape(substitute(globpath(&rtp, 'syntax/'.lang.'.vim'), '[\r\n].*$', '', ''))
      if len(syntaxfile)
        exec 'syntax include @inline_'.lang.' '.syntaxfile
        exec 'syn region hatenaSuperPre matchgroup=hatenaBlockDelimiter start=+^>|'.lang.'|$+ end=+^||<$+ contains=@inline_'.lang
      endif
    end
    let lnum = lnum + 1
  endwhile
  " workaround for perl
  syn cluster inline_perl remove=perlFunctionName
endfunction
call SyntaxSuperPre()
適当なので使わないで下さい
perlFunctionNameはregionが広すぎるので無効にしてます
すると...
hatena super pre on vim
おーーー!出ました。

続きはこの辺でやっていきます。出来上がったらmotemenさんにmergeして貰うのも良いかも。
ちなみに、filetype適用時にロードしているので、pre記法の言語を編集途中で変更したり、新しくスーパーPre記法を追加したりするとsyntaxが適用されなくなります。ま、これからですな。

syn-include++
Posted at by



2009/01/14


追記
事情が変わった!(髭男爵)
変わってなかった...orz
詳細は下記。

おもしろい。
static - 素人がプログラミングを勉強するブログ
var counter = function () {
  var static = /(^o^)/;
  return ('i' in static)? ++static.i:
    static.i = 0;
};

console.log(counter()); // 0
console.log(counter()); // 1
console.log(counter()); // 2
console.log(counter()); // 3
http://d.hatena.ne.jp/javascripter/20090113/1231863436
正規表現リテラルがコンパイル時に生成され、静的保持される特性を利用したカウンタ。

でも使わない。気持ちワルイ!苦笑
皆、思いつくだろうけど私はやっぱりこう書く。
var counter = (function() {
  var static = 0;
  return function() {return static++};
})();

ちなみにベンチを取ってみた。
if (typeof console == 'undefined') console = {log:print};

var counter1 = function () {
  var static = /(^o^)/;
  return ('i' in static)? ++static.i:
    static.i = 0;
};

var counter2 = (function() {
  var static = 0;
  return function() {return static++};
})();

var start;
start = new Date().getTime();
for(var n = 0; n < 10000000; n++) counter1();
console.log(new Date().getTime() - start)

start = new Date().getTime();
for(var n = 0; n < 10000000; n++) counter2();
console.log(new Date().getTime() - start)
Windows XP、P4 3GHz CPU、1G Mem。

tracemonkey : JavaScript-C 1.8.0 pre-release 1 2007-10-03
6515
5500

v8 : V8 version 0.3.4 (internal)
1558
383

ま、やっぱりね...というところ。
結論
V8はえーーー!

追記 os0xさんから
var counter1 = function () { var static = /(^o^)/; return ++static.i || (static.i=0); }; こうすれば差は縮まる http://la.ma.la/blog/diary_200705301141.htm
とブックマークコメントを貰った。
counter3としてベンチに追加した所、結果が変わった
if (typeof console == 'undefined'{
  if (typeof print == 'function') console = {log:print};
  else if (typeof WScript != 'undefined') console = {log:function(s){WScript.StdOut.WriteLine(s)}};
  else console = {log:alert};
}

var counter1 = function () {
  var static = /(^o^)/;
  return ('i' in static)? ++static.i:
    static.i = 0;
};

var counter2 = (function() {
  var static = 0;
  return function() {return static++};
})();

var counter3 = function () {
  var static = /(^o^)/; return ++static.i || (static.i=0);
};

var start;
start = new Date().getTime();
for(var n = 0; n < 10000000; n++) counter1();
console.log("counter1:" + (new Date().getTime() - start))

start = new Date().getTime();
for(var n = 0; n < 10000000; n++) counter2();
console.log("counter2:" + (new Date().getTime() - start))

start = new Date().getTime();
for(var n = 0; n < 10000000; n++) counter3();
console.log("counter3:" + (new Date().getTime() - start))
さらにベンチにwindows scripting hostも足してみた。

tracemonkey : JavaScript-C 1.8.0 pre-release 1 2007-10-03
counter1:1624
counter2:381
counter3:529

v8 : V8 version 0.3.4 (internal)
counter1:1610
counter2:403
counter3:665

cscript : Microsoft (R) Windows Script Host Version 5.6
counter1:107282
counter3:44016
counter2:51297

おぉぉぉぉぉぉぉぉぉぉ!!!!なんと
正規表現オブジェクトの方が速いではないか!!!
詳細はos0xさんか何方かが書いてくれるとして...
失礼しました!!!
上の結果が正しいです。

結論
windows scripting hostおせーーー!

Posted at by