2012年9月20日

Tumblrでリブログできないのを修正するTomblooパッチ

Firefox アドオン Tombloo のパッチです。

機能概要

Tombloo からリブログが失敗するようになってたので、その修正パッチです
本体のほうが修正されたらパッチは削除したほうがよいです
(同じ修正を pull request してます)

パッチ (Download or Update):

インストール/アップデート:

上のパッチリンクを
右クリック→「Tombloo」→「Tomblooパッチのインストール」でインストール/アップデート。


※直接右クリックからインストールできない場合:

できない場合は
「Tomblooパッチのインストールに失敗しなくなるパッチ」 のパッチ/記事をインストールもしくは参照ください。

レポジトリ



2012年9月4日

重い処理を軽くできるJavaScriptライブラリ作ってみた

追記: この記事のものは古くメンテナンスされていません。
CPU負荷をかけずにループ処理するJavaScriptライブラリは「CPU負荷を抑えて重い処理を軽くするJavaScriptライブラリ「chillout.js」 | 圧縮電子どうのこうの」を参照ください。

lazyIter.js

lazyIter.js は CPU 負荷をかけずにループ処理が可能な JavaScript ライブラリです。

重いループ処理などを軽くすることができます。
ループ内で処理の負荷に応じて遅延させ、結果的に重い処理は軽くなり
元々軽い処理は、ほぼ従来の速度のまま実行できます。

処理の負荷だけでなく、時間のかかるループ処理は
「応答のないスクリプト」警告がでてしまいます。
そのような警告なしで実行できるのも特徴の一つです。

どうに違いがあるのかは CPU 負荷テストページ で実際に試してみてください

Pot.js が実装しているイテレータから派生しています。
パフォーマンスなどは Pot.js のイテレータとほとんど同じです

ループ処理は非同期で実行されます。

使い方は Pot.js のイテレータ と同じですが、Deferred を使っていないので
引数にコールバックを指定する点が違います。

動作環境

主な Web ブラウザで動作します
  • Mozilla Firefox *
  • Internet Explorer 6+
  • Safari *
  • Opera *
  • Google Chrome *
また、以下の環境でも動作します
  • Greasemonkey (userscript)
  • Mozilla Firefox Add-On (on XUL)
  • Node.js
  • Other non-browser environment

lazyIter.js は、CommonJS などに対応しています

使い方

lazyiter.js を読み込みます (Webページの場合)

  1. <script src="lazyiter.js"></script>  

読み込むと、lazyIter というオブジェクトが定義されます (定義されるのは lazyIter だけです)。

lazyIter.forEach :

オブジェクトや配列に対してループ実行します

  1. // forEach:  
  2. //  
  3. // lazyIter.forEach(object, func, callback [, speed [, context]])  
  4.   
  5. // Array.  
  6. lazyIter.forEach(['a''b''c'], function(val, i) {  
  7.   console.log(i + ':' + val);  
  8. }, function() {  
  9.   console.log('End loop');  
  10. });  
  11. // result:  
  12. //   '0:a'  
  13. //   '1:b'  
  14. //   '2:c'  
  15. //   'End loop'  
  16.   
  17. // Object.  
  18. lazyIter.forEach({a: 1, b: 2, c: 3}, function(val, key) {  
  19.   console.log(key + ':' + val);  
  20. }, function() {  
  21.   console.log('End loop');  
  22. });  
  23. // result:  
  24. //   'a:1'  
  25. //   'b:2'  
  26. //   'c:3'  
  27. //   'End loop'  

lazyIter.repeat :

指定の数だけループ実行します

  1. // repeat:  
  2. //  
  3. // lazyIter.repeat(max, func, callback [, speed [, context]])  
  4.   
  5. // Specify as number.  
  6. lazyIter.repeat(10, function(i) {  
  7.   console.log(i);  
  8. }, function() {  
  9.   console.log('End loop');  
  10. });  
  11. // result:  
  12. //   0  
  13. //   1  
  14. //   2  
  15. //   3  
  16. //   4  
  17. //   5  
  18. //   6  
  19. //   7  
  20. //   8  
  21. //   9  
  22. //   'End loop'  
  23.   
  24. // for文のように 初め(begin)、ステップ(step)、終わり(end) を指定  
  25. lazyIter.repeat({begin: 0, step: 5, end: 30}, function(i) {  
  26.   console.log(i);  
  27. }, function() {  
  28.   console.log('End loop');  
  29. });  
  30. // result:  
  31. //   0  
  32. //   5  
  33. //   10  
  34. //   15  
  35. //   20  
  36. //   25  
  37. //   'End loop'  

lazyIter.forEver :

lazyIter.StopIteration が throw されるまでループし続けます

  1. // forEver:  
  2. //  
  3. // lazyIter.forEver(func, callback [, speed [, context]])  
  4.   
  5. var end = 10;  
  6. lazyIter.forEver(function(i) {  
  7.   if (i === end) {  
  8.     throw lazyIter.StopIteration;  
  9.   }  
  10.   console.log(i);  
  11. }, function() {  
  12.   console.log('End loop');  
  13. });  
  14. // result:  
  15. //   0  
  16. //   1  
  17. //   2  
  18. //   3  
  19. //   4  
  20. //   5  
  21. //   6  
  22. //   7  
  23. //   8  
  24. //   9  
  25. //   'End loop'  

throw lazyIter.StopIteration; により各イテレートを止めることができます。
引数 'context' は、コールバック関数の 'this' として使われます (省略可)。
引数 'speed' を指定することで速度の調節ができます (省略可)。
  • 'ninja' : もっと速い
  • 'rapid' : 速い
  • 'fast' : 速め
  • 'normal' : 通常 (default)
  • 'slow' : 遅め
  • 'doze' : 遅い
  • 'limp' : もっと遅い

速度の指定 (rapid, ninja など) は、Pot.js と同じです

Download

ダウンロード

動作テスト (サンプル)

レポジトリ



その他、なにか問題・バグ・感想・指摘などあれば、
コメントやメールまたは @polygon_planet まで送っていただけるとうれしいです。



ランレングス法をJavaScriptの正規表現で書いてみた

ランレングス法は、BMP などに使われるデータ圧縮アルゴリズムです

連続したデータが多ければ圧縮率は上がりますが、
そうでない場合、逆にデータ量が増えることもあります
  1. // ランレングス圧縮/解凍  
  2. var RunLength = {  
  3.   compress : function(s) {  
  4.     return s.replace(/([\s\S])\1{0,8}/gfunction(a, c) {  
  5.       return c + a.length;  
  6.     });  
  7.   },  
  8.   decompress : function(s) {  
  9.     return s.replace(/([\s\S])(\d)/gfunction(a, c, n) {  
  10.       return new Array(++n).join(c);  
  11.     });  
  12.   }  
  13. };