今日のPostScript - ujj問題

投稿者 nanki 2008-06-19 18:50:00 GMT

文字列をsplitしてsortしてuniqしてjoinする.(いわゆるujj問題)

array.string#concatはWikibooksから。 .sort はghostscript組み込みらしい。

% [(a) (b) ... (z)] array.string#concat -> (ab...z)
/array.string#concat
{ 0 1 index { length add } forall string
  0 3 2 roll
  {
    3 copy putinterval
    length add
  }
  forall pop
} bind def

% (string) string#chars -> [(s) (t) (r) (i) (n) (g)]
/string#chars {
  [ exch { 1 string dup 0 4 -1 roll put } forall ]
} bind def

% [0 0 1 1] array#uniq -> [0 1]
/array#uniq {
  dup 0 get /prev exch def
  [ prev 3 2 roll
    {
      dup /val exch def
      prev ne {
        val
        /prev val def
      } if
    } forall
  ]
} bind def

[(ujihisa) (jikka) (jissitsu)] array.string#concat string#chars {lt} .sort array#uniq array.string#concat ==
参考:

PostScript FAQ - Wikibooks, collection of open-content textbooks


JavaScript デバッグツール - コードゴルフIE杯

投稿者 nanki 2008-06-12 13:31:00 GMT

先ほどのdebug.jsを読み込むBookmarklet.

debug

javascript:void((function(r){var d=document,w=arguments.callee,v,t=r[0],n=r.slice(1);if(t){v=t.split('$');if(v[1]){try{eval(v[0]);t=v[1]}catch(e){setTimeout(function(){w(r)},100);return}}v=t.split('@');if(v[1]){try{eval(v[0]);w(n);return}catch(e){t=v[1]}}d.body.appendChild(d.createElement('script')).src='http://tools.netswitch.jp/jstools/'+t+'.js';w(n)}})(['Prototype@prototype','Prototype$Effect@effects','Effect$DebugTool@debug']))

外部のJavaScriptを読み込むには、JSONPなどでも使われているscriptタグの動的生成を使うのだが、これが非同期で、prototype.js, effect.js, debug.jsを順番に読み込まないといけない今回のような場合はちょっと工夫が必要になる。

effect.jsはPrototype定数が定義されるまで読まない、debug.jsはEffect定数が定義されるまで読まない、など。

それとは別に、すでにprototype.jsが読み込まれている場合は、prototype.jsの読み込みをご遠慮する機能もつけてある。 ブックマークレット中の最後の方の@とか$とかにはさまれているあたりがそれ。 evalして例外が上がらなければ、あるいは上がれば、ロードして、次へ。

しかし、どういうわけか、一番使いたいIEで動かない。 alertを追加するしないで、syntax errorがでたりでなかったりするあたりで、ようやく、bookmarkletの文字数制限を思い出した。

というわけでそこから先は、コードゴルフIE杯。 今では、400台前半に落ち着いて、無事動くようになり、IE6SP2でも余裕がある。

参考:

Rules for Bookmarklets


JavaScript デバッグツール

投稿者 nanki 2008-06-12 13:04:00 GMT

inspection

いろんなブラウザでチェックしているうちに、ちょくちょく使う機能をまとめてみた。

DebugTool.alertbox(msg)
  console.log の代わり。

DebugTool.report(target, filter)
  target内の関数呼び出しを監視。
  内部でprototype.js とかを使いまくってるので、DebugTool.report(Prototype)とかはやらないこと!

DebugTool.inspect(target)
  DOM ツリーを遡って、タグ名、id、class属性などを表示。

DebugTool.shell()
  シェルっぽいのがでてくる。未完成、おまけ。

などなど。

要 prototype.js, effect.js

debug.js

これを任意のページでロードするbookmarkletの話は、別エントリで書く。

reportの中身は結構面白いと思う。

  report: function(target, filter) {
    var func = function(name) {
      return (function(a){
        var result = a.apply((function() {return this}).apply(a), $A(arguments).slice(1));
        DebugTool.alertbox(name + '(' + $A(arguments).slice(1).inspect().gsub(/^\[|\]$/, '') + ') -> '+$A([result]).inspect()+'.');
        return result;
      });
    };

    for (key in target) {
      if (typeof target[key] == 'function' && (!filter || filter(key))) {
        target[key] = target[key].wrap(func(key));
      }
    }
  },

wait もおすすめ。

  wait: function(wait_for, callback) {
    var check = false;
    try{
      check = (typeof(wait_for) == 'function') ? wait_for() : eval(wait_for);
    }catch(e){
    }

    if(check){
      callback(check);
    } else {
      var wait = arguments.callee;
      setTimeout(function(){wait(wait_for, callback)}, 100);
    }
  },

vimで実行されたautocmdを知りたい

投稿者 nanki 2008-05-28 19:21:00 GMT

$ vim -V9 filename

とすればいいらしい。

あるいは、

:set verbose=9


JavaScriptでウィンドウがピタッ!

投稿者 nanki 2008-05-13 03:23:00 GMT

世間では window.moveByの時代がくるとか言われているそうですね。

こちらは、window.moveToだけど…

demo

参考:

window.moveBy の時代がくる、こない - 冬通りに消え行く制服ガールは、夢物語にリアルを求めない。 - subtech