09 | 2017/10 |  11

  1. 無料サーバー

User forum-FC2BLOG-Info-Edit Template-Post-Edit-Upload-LogOut

CSSやJavascript自習の苦闘史を綴っていきたい。恐縮ですがJavascriptを有効にしてご覧ください。
2005年12月から社会問題も掲載!

スポンサーサイト

上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。

 

jQuery()の挙動を解読する(6) jQuery.clean()メソッド解読──jQuery解読(10)

このエントリイの改訂履歴
  • 初稿:2007/11/13
  • 抜本改定:2009/3/20-23……jquery 1.3.2 対応改訂並びに新たに clean() メソッドコード全文解読を履行

直前のエントリイにおいて、何とか jQuery.each() メソッドを解明できましたので、次に clean( elems, context, fragment ) メソッドにチャレンジします。

まず、このメソッドが jquery.js 内で呼び出されるのは次の 3 箇所だけです。

  1. ユーザーが入力した jQuery(s) において、引数 s 文字列が html 文字列であった場合に init() メソッドから ( #57 )

    ここに html 文字列とは、<> で囲われた whitespace を含む何らかの文字列で、例えば<a href="hoge.html">を意味しています。

  2. clone() メソッドから ( #320 )
  3. domMaip() メソッドから ( #517 )

これら全てにおいて、clean() メソッドは、DOM を走査する前に、引数 elems 配列内の html 文字列を正しい表現に修正したり、IE バグ対策を施したりする役割を担っています。名にし負う「 html 文字列クリーナー 」です。

更に 3. のケースだけ fragment 引数が使われており、単なる html 文字列整形だけではなく、文書断片( =Document Fragment )を活用して、当該文字列内に埋め込まれたスクリプトを実行することまでやってのけます。

さて、clean()メソッドはかなり長大で難解です。以下に各行への解説を付けた cleaner() コード全行を掲載しますが、解読には多くの時間を要しました。

このエントリイが対象とする jquery.js 1.3.2 における箇所
■ jQuery.clean() メソッド
847:clean: function( elems, context, fragment ) {
848: context = context || document;
849:// ▼第 1 ブロック--------------------------------------------------------
850: // !context.createElement fails in IE with an error but returns typeof 'object'
   // IE は document ノードにしか要素を作れず、context が document 以外
   // の時にエラーを発生させてしまう。当該エラー処理のために #851-852がある。
851: if ( typeof context.createElement === "undefined" )
    // 要は context に document オブジェクト を代入する。上記原典コメ
    // ントにあるように、このフレーズは IE のみが通過する。他のブラウザ
    // はこのフレーズはパスして 848 の後には 856 行が適用される。
852:  context = context.ownerDocument || context[0] && context[0].ownerDocument || document;
853:// ▼第 2 ブロック--------------------------------------------------------
854: // If a single string is passed in and it's a single tag
855: // just do a createElement and skip the rest
856: if ( !fragment && elems.length === 1 && typeof elems[0] === "string" ) {
857:  var match = /^<(\w+)\s*\/?>$/.exec(elems[0]);
858:  if ( match ) // 1つだけ tag がある場合 ex. "<img src='xx.jpg' />";
     // match に代入された文字列から context 内に Element Node を作って配列に入れる。
     // 返値は作成されたノードへの参照を要素とする配列になる。
859:   return [ context.createElement( match[1] ) ];
860: }
  // ▼第 3 ブロック--------------------------------------------------------
861: // 以後の処理をするために、変数 div は新規に作成した div 要素ノードを参照する
862: var ret = [], scripts = [], div = context.createElement("div");
863:// ▼第 3-1 ブロック------------------------------------------------------
864: jQuery.each(elems, function(i, elem){ // elems の要素を巡回処理する
865:  if ( typeof elem === "number" )
866:   elem += ''; // 数値ならば文字列化する
867:// ▼第 3-2 ブロック------------------------------------------------------
868:  if ( !elem ) // なければ、あるいはなくなれば
869:   return;   // 何もしないでコード進行を終える。
870:// ▼第 3-3 ブロック------------------------------------------------------
871:  // Convert html string into DOM nodes  文字列をノードに変換する
872:  if ( typeof elem === "string" ) {
  // ▼第 3-3-1 ブロック----------------------------------------------------
873:   // Fix "XHTML"-style tags in all browsers
874:   elem = elem.replace(/(<(\w+)[^>]*?)\/>/g, function(all, front, tag){
875:    return tag.match(/^(abbr|br|col|img|input|link|meta|param|hr|area|embed)$/i) ?
876:     all : // 終了タグを持たないタグ名の時にはヒットした文字列をそのまま返し、
       // 終了タグを持つタグ名の場合には、開始タグ内にある / を除いてから開始
       // タグを閉じ、その後に終了タグを付加する。
877:     front + "></" + tag + ">"; // ex. <div /> → <div ></div>
878:   });
879:// ▼第 3-3-2 ブロック----------------------------------------------------
880:   // Trim whitespace, otherwise indexOf won't work as expected
     // ホワイトスペースがあると indexOf メソッドが期待通りに
     // 作動しないので、冒頭の witespace を削除して最初から 10 文字を切り取り
     // 全て小文字にする。★しかし何故10文字? 最長のタグ名が 10 文字か?
881:   var tags = elem.replace(/^\s+/, "").substring(0, 10).toLowerCase();
882:   // 以下の !tags.indexOf(str) は tags の先頭に str がある場合のみ true となる
883:   var wrap = // elem を囲む文字列を準備する。
884:    // option or optgroup 
885:    !tags.indexOf("<opt") &&
886:    [ 1, "<select multiple='multiple'>", "" ] ||
887:
888:    !tags.indexOf("<leg") &&
889:    [ 1, "<fieldset>", "</fieldset>" ] ||
890:
891:    tags.match(/^<(thead|tbody|tfoot|colg|cap)/) &&
892:    [ 1, "<table>", "</table>" ] ||
893:
894:    !tags.indexOf("<tr") &&
895:    [ 2, "<table><tbody>", "</tbody></table>" ] ||
896:
897:    // <thead> matched above
      // tags 文字列内に <td かも <th がある場合
898:    (!tags.indexOf("<td") || !tags.indexOf("<th")) &&
899:    [ 3, "<table><tbody><tr>", "</tr></tbody></table>" ] ||
900:
901:    !tags.indexOf("<col") &&
902:    [ 2, "<table><tbody></tbody><colgroup>", "</colgroup></table>" ] ||
903:
904:    // IE can't serialize <link> and <script> tags normally
905:    !jQuery.support.htmlSerialize &&
906:    [ 1, "div<div>", "</div>" ] ||
907:
908:    [ 0, "", "" ];
909:
910:   // Go to html and back, then peel off extra wrappers
     // wrap 配列の 2 番目と 3 番目の要素で elem を挟み込んで div 内に代入する。
911:   div.innerHTML = wrap[1] + elem + wrap[2];
912:
913:   // Move to the right depth
914:   while ( wrap[0]-- ) // wrap[0] が 1 以上の間は 1 になるまで
915:    div = div.lastChild; // 最後の childNode を div に代入する。
916:
917:   // Remove IE's autoinserted <tbody> from table fragments
     // IE は自動的に tbody タグを挿入してしまうのでこれを取り除く処理
918:   if ( !jQuery.support.tbody ) {
919:// ▼第 3-3-3 ブロック----------------------------------------------------
920:    // String was a <table>, *may* have spurious <tbody>
      // 偽の tbody タグを調査するため、elem 内に <tbody があるかどうか走査
921:    var hasBody = /<tbody/i.test(elem), // tbody 有無を調べる
       // table タグが tags の先頭にあり、elem 内に tbody がなければ
922:     tbody = !tags.indexOf("<table") && !hasBody ?
        // div に第一子があればその childeNodes を tbody に代入
923:      div.firstChild && div.firstChild.childNodes :
924:
925:     // String was a bare <thead> or <tfoot>
       // #925-928 は tags 内に table タグがある場合の
       // 処理である。#922-928 内で 3 項演算子が入れ子になっている。
       // table タグだけがあって tbody がなければ
926:     wrap[1] == "<table>" && !hasBody ?
927:      div.childNodes : // childNodes を tbody に代入し、
928:      []; // さもなくば空配列を tbody に代入する。
929:    // 以上で処理した tbody を巡回処理する。
930:    for ( var j = tbody.length - 1; j >= 0 ; --j )
       // tbody[j] が tbody ノードで子ノードを持たなければ
931:     if ( jQuery.nodeName( tbody[ j ], "tbody" ) && !tbody[ j ].childNodes.length )
        // tbody[j] の親ノードから tbody[j] 子ノードを削除する。
        // つまり IE が勝手に作った空の tbody ノードを削るのである。
932:      tbody[ j ].parentNode.removeChild( tbody[ j ] );
933:
934:    } // End of #918 if
935:// ▼第 3-3-4 ブロック----------------------------------------------------
936:   // IE completely kills leading whitespace when innerHTML is used
     // IE で elem の先頭文字が半角スペースなどの whitespace の場合
937:   if ( !jQuery.support.leadingWhitespace && /^\s/.test( elem ) )
      // elem 文字列の 最初の ゼロ個以上の whitespace を、div の最初の
      // 子ノードの前に挿入する。ここで使われている insertBefore は
      // jQuery のインスタンスメソッドではなく native な DOM エレ
      // メントメソッドである。
938:    div.insertBefore( context.createTextNode( elem.match(/^\s*/)[0] ), div.firstChild );
  // ▼第 3-3-5 ブロック----------------------------------------------------
939:   // div の子ノード群を配列の要素に入れ、できあがった配列を elem に返す。
940:   elem = jQuery.makeArray( div.childNodes );
941:  } // End of #872 if(長~い if 文がここで終わる。)
942:// ▼第 3-4 ブロック------------------------------------------------------
943:  if ( elem.nodeType ) // elem が何らかの DOM ノードの場合
944:   ret.push( elem ); // 配列 ret の要素として elem を追加
  // ▼第 3-5 ブロック------------------------------------------------------
945:  else // elem DOM ノードでない場合
     // elem が文字列の場合には #872-941 において一連の処理が施され、#940
     // で elem は配列となっている。
946:   ret = jQuery.merge( ret, elem ); // 配列 ret に配列 elem を合体する。
947:
948: });
  // ▼第 4 ブロック----------------------------------------------------------
949: // やっと fragment がある場合の処理が始まる。
   // なおこのメソッド内には createDocumentFragment() メソッドは存在しないので、
   // fragment を使う場合には、別途、cleanメソッドに先だって、 fragmentNodeを
   // 作っておかなければならない。domManip() メソッドにその実例がある。
950: if ( fragment ) {
951:  for ( var i = 0; ret[i]; i++ ) { // 配列 ret を巡回処理する
     // #952-953 のコードは配列 elems の要素として存在するscript タグを
     // 取り出すとと共に当該の script タグを削除するためのものである。
     // 処理対象のノード名が script でその type 属性がないか、または "text/javascript" の場合には
952:   if ( jQuery.nodeName( ret[i], "script" ) && (!ret[i].type || ret[i].type.toLowerCase() === "text/javascript") ) {
      // 処理対象に親ノードがあれば、当該親ノードから処理対象ノードを
      // 除去した上で、その除去ノードを scripts 配列に追加する。
      // 親ノードがない場合には単純に処理対象を scripts 配列に追加する。
      // ここに親ノードがない場合とは、処理対象がスクリプトタグのみから
      // 構成されている場合である。
953:    scripts.push( ret[i].parentNode ? ret[i].parentNode.removeChild( ret[i] ) : ret[i] );
954:   } else {
955:    if ( ret[i].nodeType === 1 ) // 処理対象が要素ノードならば
       // 処理対象内にある script タグを取得して配列に入れ、その配列を
       // [i+1,0] 配列に結合する。こうして出来た splice メソッドの引数を使って
       // ret 配列の i+1 位置から、script タグの配列要素を ret 配列に追加する。
956:     ret.splice.apply( ret, [i + 1, 0].concat(jQuery.makeArray(ret[i].getElementsByTagName("script"))) );
      // 別途作成済みの fragment ノードの最後の子ノードとして、
      // 処理対象を追加する。なお、この fragment ノードは clean メソッド
      // からは返されないので、利用するには別途 fragment ノードを呼び出さ
      // なければならない。
957:    fragment.appendChild( ret[i] );
958:   }
959:  }
960:  
961:  return scripts; // 整形された要素を持つ配列 scripts を返す。
962: } // End of #950 if
963:// ▼第 5 ブロック--------------------------------------------------------
964: return ret; // 配列 ret を返す。
965:},

clean(elems, context, fragment) メソッドの構成

clean メソッドの引数は順に、(1) 要素ノードを指し示す html 文字列を格納した配列、(2)コンテキスト、(3)フラグメントノード。返値は配列で、コードの構成は以下のようになっています。

ここに、番号は上のコード説明内に設けた▼で始まる番号に符合します。

    ※ 以下において、elem は 配列 elems の各要素を表す
  1. IE の createElementメソッドバグ対策……#850-852
  2. 第 3 引数がなくて、html 文字列が 1 つだけのタグで構成されている場合への対応……#854-860
  3. 配列 elems の要素に対する巡回処理(このメソッドの肝部分)……#864-948
    1. elem が数値の場合の処理……#865-866
    2. elem が空文字の場合の処理……#868-869
    3. elem が html 文字列の時に、それを DOM ノードに変換する処理
       この部分こそが clean 処理の核心部分 ……#871-941
      1. elem をXHTML表記に変換する……#873-878
      2. ホワイトスペースの削除などを処理する……#880-915
      3. IE の tbody タグに係るバグ対策……#917-934
      4. IE の innerHTML メソッドのバグ対策……#936-938
      5. 正規化され、DOMノードに変換された文字列を elem に代入する……#940
    4. elem がノードの時に返値を作る……#943-944
    5. elem がノードではない時の返値を作る……#945-946
  4. 第 3 引数がある(flagment ノードを作成する)場合……#950-962
  5. 最終処理(修正を施した配列を return する)……#964

学習その 1 ── str.replace(RexExp,function())……#874-878

clean() メソッド内には、replace メソッドが引数に関数を取る例が出てきます。

これまでは string.replace(regexp, newString) しか知らなかったのです。関数を指定できるようになったのは Javascript1.3 以降だそうですから、決して最近のことではないのですが、関数を使った replace の例はこれまで見たことがなかったのです。

さて書籍等に拠ればこの場合の関数の引数は、順に「ヒットした文字列」、「最初の部分文字列」、「2番目の部分文字列」、・・・となるようです。

正規表現文字列「/(<(\w+)[^>]*?)/>/g」によって elem 内でヒットした文字列が第1引数 all に代入され、第 2 引数 front には第1部分文字列である <(\w+)[^>]*? (all から末尾の2文字 "/>" を省いた文字列)が、また tag には 第2部分文字列である \w+ (タグ名になる)が、それぞれ代入されることになります。

例えば elem が"<img src='test' alt='test' />"である場合には all="<img src='test' alt='test' />"、front="<img src='test' alt='test' "、tag="img" と順に代入されます。

なお、この置換メソッドは不正なXHTML構文を正す役割を負っています。ユーザーによって終了タグを記述しない誤記があった場合には、自動的に終了タグを挿入するのです。しかし同時に、終了タグがない要素名であって / が付いていないタグ記述に対して、それを付与する機能は持っていません。

▲ToTop

学習その 2 ── 空白文字の削除と div エレメントの生成……

jQuery.trim()───(911-913行)これは trim の名から推測されるとおり不要な空白文字列を削除するメソッドです。正確に言うとjQuery.trim(arg)メソッドは、arg文字列の先頭または末尾に存在する1個以上の空白文字列を削除し、途中にある空白文字は削除しません。引数tがなかった場合にエラーにならぬよう、(t||"")をreplace対象文字列としています。これによりarg文字列の先頭又は末尾にあるホワイトスペースが削除され、変数 s にその結果が代入されます。

このように空白文字を削除するのは、直後に生成されるdivエレメントと併せて、この後に続く"入力値に対する次なるエラーチェック"を行うためです。

学習その 3 ── 誤ったタグ記述を正しく修正する……#880-915

clean メソッドのの 1 つの神髄がここにあります。誤ったタグ記述を正しく修正する為のコードがvar wrap に続く部分です。

この部分では極めてトリッキーなコードが3つあります。

第一は indexOf() メソッドの特異な利用方法です。string.indexOf("str")は、string 文字列内に str が含まれる場合には 0 または自然数を返します。含まれなければ -1 が返ります。さて、否定演算子を前に置いて、!string.indexOf("str")とすると、string.indexOf("str") = 0 の時だけこの値は true となり、その他は false になります。0 の否定だけが true だからです。

こうして !string.indexOf("str") は string 文字列の先頭に str が含まれる場合にだけ true となります。このトリッキーな方法を使って s 文字列の先頭に或る文字列が含まれる場合に、或る配列を指定しそれを変数 wrap に代入しています。

トリッキーなコードの第二は、&& 演算子及び || 演算子の使い方です。var wrap への代入値は、連続する || 演算子によってその前後にあるいずれか一つの値となりますが、そのいずれかを選択するのは && の前に置かれたコードです。&& の前に置かれた式の値が true の時だけ && の右の値が取得されるからです。

因みにここで行われることを馴染みのコードで書けば、極めて冗長ですが次のようになります。

&& と || の2つの演算子を巧みに組み合わせて条件分岐を行っているわけで switch 文を代行していることになります。この記述方法は自作コード内でも極めて重宝します。

第三のトリッキーコードは極めつけです。915 行の div=div.lastChild がタグの入力ミスを修正する役割を負っているのです。

どういうことかと言うと、wrap に代入された配列と elem の値を組み合わせて、コード内で生成した div タグ内に wrap[1] + elem + wrap[2] を代入していますが、これは例えば<table><tbody></tbody><colgroup><col></col></colgroup></table>のような文字列になります(elem が <col を含んでいた場合)。そして914-915行によって、生成した div タグ内に <col></col> を代入しています。

これだけ見ると元の値を返して一体何をしているのか?、と疑問に思いますが、実はこの一連のコードは入力ミスを修正してくれる機能を持っているのです。例えばjQuery("<col>abc</tr>").*** のようにタイプミスをしたとします。これがclean()メソッドに掛けられて<col>abc</tr>の部分が<col>abc</col>と修正されるのです。

どうしてこのような修正が行われるかと言えば、lastChild(別に firstChild でも構わない)プロパティの効能です。一端ラッピングされたタグ文字列から DOM のプロパティを利用することによってエラーを修正しているのです。この方法には驚きました。そんな効能が DOM ツリー検索機能に存在していることなど、全く知らなかったからです。

とにかくこれらのトリッキーなコードを重ねて、ユーザーによるタグ標記のエラー訂正を行っているわけです。

▲ToTop

学習その 4 ── IE バグ対策……

cleanメソッド内にもまた、IE バグ対策が盛りだくさんあります。列挙すれば

  1. document ノード以外のノードにはノードが作れない(#850-852)
  2. tbody 強制挿入対策(#917-934)
  3. innerHTML メソッドによる whitespace の除去対策(#936-938)

以上のとおりです。

ここではまず、2番目のバグ対策=IEによって自動挿入されてしまうことがある tbody 空要素 を削除している部分について学習します。

まず、ユーザーが入力した標記文字列の先頭に <table が含まれ、かつ当該タグ標記文字列内に <tbody が含まれなかったら、tbody に div の孫ノード全てを代入し(921-923行)、elem を囲むタグが table だけで、elem に tbody がなければ、tbody に div の子ノードを代入しています。(9256-928行)つまり table タグの子要素を抽出しています。

次に、tbノードの要素数を頼りにその最後から順に「子ノードを持たない tbody ノード」を抽出し(931行)、当該tbodyノードを削除しています。(931-832行)

以上により IE が勝手に挿入する tbody タグ(それは子要素を持たない)を削除することが出来るわけです。

次に、3 番目の空白文字の扱いです。elem の最初に空白文字がある場合に(835行)、その空白文字列を取りだして、補正されたelem つまり div.firstChild の前に挿入しています。(936-938行)

▲ToTop

学習その 5 ─── script の実行

clean() メソッドの第 3 引数 「 fragment 」 は ver 1.3.x で初めて登場しました。1.2.6 まではこのメソッドは 2 つの引数しか取りませんでした。この fragment 引数は一体何をするために設けられたのか?───それがなかなか解明できませんでした。今でも完全に解明しきったとは思えません。まが霧が完全には晴れないからです。

それでも、コードを睨み続け、サンプルを幾つか試してみて分かったことがあります。

新たに追加する html 文字列内にスクリプトを埋め込んで、fragment 引数つきで clean() メソッドを実行すると興味深いことが起こるのです。

くだくだ説明するよりも、実例を示すのが手っ取り早いでしょう。

下のボタンをクリックすると 2 つの変化が起こります。或る文章がボタンの前に挿入され(文字列を内包する p タグです)、同時に画面中央に alert 表示が出ます。

ここで行ったことは以下の通りです。

上のボタンがクリックされると、このページに埋め込まれた或る Javascript コードが起動します。そのコードでは jQuery().before() メソッドを使って、このボタンの前に兄弟要素 p タグとスクリプトタグを挿入します。

このとき、jQuery().before() メソッドはその定義により、domManip メソッドを呼び出し、その中では cleanメソッドが fragment 引き数付きで起動されます。この結果、挿入する html 文に記述されているスクリプトタグは挿入された直後に削除され、かつ実行されるのです。こうして alert 表示が実行されます。

なお、以上を実現する Javascript コードでは name エンティティに悩まされました。フゥ~(;´_`;)

jQuery.clean()メソッド全体の意味

途中で Javascriptの学習を深めながら、延々と jQuery.clean() メソッドの解読を続けてきました。何とかその全容を解き明かすことが出来たと思っていますが、最後に、init()メソッドから呼び出された jQuery.clean() メソッドが果たす役割についてまとめておきます。

それは第一に、ユーザーが記述したタグ名(子孫を持つ場合を含む)の整合性をチェックし、もし記述にミスがあればそれを修復します。開始タグと終了タグがきちんと対になっているかを調べます。

第二に、IE の各種バグ対策を行います。

第三に、fragment 引数の活用です。これによりスクリプトタグを含むノード管理が出来るようになります。

以上のように、jQuery.clean()メソッドは3つの清掃作業をおこなうメソッドとして定義されていると理解することが出来ます。

 

■ コメントの投稿 ■

管理者にだけ表示を許可する

●トラックバック●

■トラックバックURLはこちら■
http://hkom.blog1.fc2.com/tb.php/579-a2eddfed

●参照元一覧●

<provided Fc2>
<provided i2i>

▲ToTop

 90%近いシェアを握っているインターネットエクスプローラの描画エンジンを利用したタブbrowser。沢山のタブbrowserがあるが、多機能、カスタマイズフリー、スクリプト利用等で一日の長がある。Gekkoエンジンへの対応も行われ、IEからの自立独立の方向に向かっている。2005年7月にはIE7が登場する見通しの中で、今後の発展が望まれる。

 多様なCSS作成支援機能を備えた、タグ入力式 HTML&CSS作成支援エディタ。スキンデザインもすっきりしている。テキストエディター上で作成するよりも確実で安全にタグ打ちが出来る。
文字コードを選べないのが欠点。

 StyleNote同様のタグ入力式 HTML&CSS 作成支援エディタ。長年使用してきたが現在StyleNoteに乗り換えつつある。

 クリップボード履歴情報を活用する為のソフト。画像まで履歴を取ってくれるのが嬉しい。このソフトを使わない日は絶対ない程に重宝し、愛用している。

 起動中のウィンドウの「コピーできない」説明文などの文字列を取得し、コピー可能な文字データにするツール。何かと便利。

 ストリーミングデータを保存することが出来るソフト。動画利用には不可欠なソフトだ。

 無料ながらレイヤー機能を有し、スクリプトによる拡張も可能な、sleipnir作者が提供している優れもの画像編集ソフト。

 画面キャプチャソフトと言えばこれに勝るものなし、ではないだろうか? 様々な取得方法を有しており、ブログ作成にもHomepage作成に不可欠だ。Jtrimと並んでWoodyBellsの作品。

 複数ファイルの同時編集は出来ないが、透過pngも作れる画像編集ソフト。
(以下当該サイトから抜粋)初心者にも簡単に操作が出来るフォトレタッチソフトです。多くの加工機能で画像に様々な効果を与えることができます。非常に軽快に動作するため、ストレスなく操作できます。

 Animation Gifファイルを作れる無料ソフト。

 キャプチャソフト。画面内にサイト全体が表示しきれない場合でも、これを使えば全体をキャプチャすることが出来る。

 画像処理。画像のフォーマット変換のみならず、色数やサイズ、圧縮率の変更まで一括処理できてしまう『BatchGOO!』は、大量の画像をまとめて処理したいときに大変便利なソフト。BMP, TIFF, JPEG, PCX, PNG の相互変換をはじめ、色数・サイズ・解像度の統一、JPEG圧縮率の調節など、ホームページ用の画像や携帯電話用の壁紙を揃えるのに抜群の相性を見せる。(Vectorの当該ソフト紹介頁より抜粋引用)

 名前から直ぐに想像が付くように画像のサイズを測るためのソフトだ。Homepage作成には欠かせない。2カラム、3カラムのレイアウトを行う場合に大変重宝する。

 ランチャーソフトは沢山あるが、中でもこれが一押しだ。2年以上使ってきたがその操作性には毎日満足している。これを使い始めてからデスクトップには一切のアイコンを表示することをやめてしまった。

 AdobeReader7によって、起動時間が長すぎるという長年のユーザーの不満はある程度解消した。そのためこの高速化ソフトは存在価値が低下してしまったかもしれない。AdobeReader6迄はこのソフトによる起動高速化で恩恵を受けてきた。

 IE専用が難点だが、様々なサイト内でIDやパスワードを入力するのに重宝するソフト。コンテキストメニューから簡単に起動できるのがGood! sleipnir等のIEの描画エンジンを利用しているブラウザでも使える。

 利用しているパソコンの諸元値を取得するには、このソフトがベストだ。インストール済みソフトの一覧が取得できるのも嬉しい。

 WMPは機能が豊富なだけ重い。RealPlayerも同様だ。そこでMedia Player Classicを使いたい。動作が軽快なだけではなく、対応しているファイル形式もすこぶる多く、これひとつで、wmvもrmも表示できてしまうのだから凄い! 数多あるMedia Playerの王様と言えるだろう。

 自宅でPCを起動しているときには必ず起動しているメディアプレーヤー。何かと過剰なWinampよりも、起動も速くスキンはシンプルだ。

 DivX, Xvid, Mov, Vob, Mpeg, Mpeg4, avi, wmv, dv, などの動画をDVD-Video形式に変換できるフリーソフト。クリックするとDVD関連ソフト紹介サイト=「DVDなToolたち」なるHomepageが開きます。

----------
200711131104
上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。