1.023world - ヤドカリパークとマリンアクアリウム -

海洋の仕組みと細菌・微生物から学ぶマリンアクアリウムサイト

1.023world Facebook

結果 Oh! Life (旧ブログ)

懲りずに書いてみたりする結果オーライな日記

懐かしい10年前のトップページとXML

昨日の投稿で懐かしくなって、古いファイル漁ってきました。
1998/6から始めたホームページだけど、バックアップファイルで一番古いのは1999/2/21のしか無かったので、そのキャプチャを。

1998/02/21のトップページ

恥ずかしいってば。

いろいろ見てたら、覚えたての JavaScript がコテコテだし、JavaApplet は使ってるし、クッキーも使ってるし、もう完全にアクアを放棄してウェブに浸かってます(汗)

さらに驚いたことに、当時のXMLファイルが出てきた!?
ま、意味も判らず書いたんでしょうけど。記憶にないし。

<?xml version="1.0" encoding="shift_jis"?>
<channel href="" self="">
  <title></title>
  <abstract></abstract>
  <logo href="" style="image-wide" />
  <logo href="" style="image" />
  <logo href="" style="icon" />
  <schedule>
    <intervaltime day="" />
    <earliesttime hour="" />
    <latesttime hour="" />
  </schedule>
</channel>

恥ずかしいのでテキストを抜いてフォーマットのみ記述してます(笑)

これは、当時まったく流行らなかった(?)マイクロソフトのチャンネルと言う概念(?)があって、多分それ用に作成したものらしいです。マジで記憶がないんですけど。
こんな時代にまさかXMLに触れてたなんて、ホントに意味も知らずに使ってたんだなぁ。。。
ちなみに拡張子は CDF でした。

なんなのこの子(爆)

で、調べてみた。

しーでぃーえふふぁいる 【CDFファイル】 CDF file

Webサイトの情報(コンテンツ)を、情報提供者が望む形でパッケージ化して提供可能とするチャンネルを実現するための情報ファイルフォーマット。Microsoftが提唱し、W3Cでの標準化が進められている。CDFはChannel Definition Formatの略。

ちゃんねる 【チャンネル】 channel

既存のWWWサーバー上の情報を、情報提供者が望む形でパッケージ化して提供するための技術。MicrosoftのWWWブラウザーであるInternet Explorer 4.0では、新しくこのチャンネル対応の機能が追加された。

いずれもデジタル用語辞典より引用

うーん。。。フィードの失敗作??
なんかそういえば、IE のメニューかなんかに自分のチャンネルが出てたような?
あれ、何の役にたったんだろう。。。謎。

おまけ。

19990221-eiji

当時のプロフィールに貼ってた写真。
若かった。。。

こちらのエントリーもどうぞ♪

元祖ブログ

ふと改めて、「激動の時代に生きてるなぁ」、なんてしみじみ思います。
アクアサイト第一期生のみなさん、まだお元気ですか?
生きた化石、サンタマルターエイジです。

あの頃はみんな、手打ちでしたよね。
ええ、やっぱりコシが違いますから。
うどんか。

今でこそ本当の意味で日記を書くことだけに純粋に没頭できる時代ですが、当時はそれはもう苦難の連続でしたね。
やっとの思いで幾多の難関を乗り越えた暁には、僕が書いたのは日記なのかHTMLなのか、もはや目的を見失ったテーブルレイアウトのようでした。

しかしまあ、よくもあんな重労働をみんな愚痴もこぼさず乗り越えてきましたね。
でも中には乗り越えられず、かなりの中退や登校拒否もありました。
みんなで卒業したかった。。。

何の話だっけ。
そう、ブログの元祖、ウェブ日記のお話。

きっと今のブログユーザーには想像もできないでしょうね。
日記ひとつ仕上げるのにどんだけぇ~!って時間がかかった事を。
何より日記自体に集中できませんわよあなた。
日記なんかよりタグ覚えなきゃあなた。
三時のあなた。
と言う世代です。

僕の場合、当時は「きまま日誌」と言うタイトルで、ウェブ日記を公開してました。
そして当時の多くのアクアサイトでも、同様の形で日記が流行ってました。
有名なところではアキリン氏のベルリン日記!
初めて表題に触れたときは、きっとベルリン旅行記なんだろうな、なんて思ったり。。。
でも実際にアキリン氏に会ったことがある方なら、あの「今日もいつものように・・・」のフレーズを読むたび、リアルな声が天から聞こえたはずです。
日記もそうですが、アキリン氏ほどインパクトの強い方もそういないでしょう。

僕はたいしたことは書けませんでしたが、それでも1998/6~2000/8まで続きました。
リアルで日記なんて経験がない割には、まあ続いた方ですかね。
最後の方はスカスカでグダグダでしたけど。

20000131-diary

これは記念すべき1.023world水槽が誕生した頃の日記のキャプチャ。
ちょうど「ヤドカリパーク」と言う定義を唱えた頃でもあります。
ヤドカリの遊び場だからヤドカリパーク。そのまんまですが。

でもね、こんな日記ひとつ書くのに、当時はタグの本片手にウロウロでオロオロですよ。
それが伝えられなくておじさん悲しいっ。

あぁ。。。それにしても良い時代になりました。
今こうして日記を書いてても、何も迷うことがありません。
ボタン一つで画像がアップされ、タグが自動で入って、勝手にページができちゃいます。
あとは日記も自動で書いてくれりゃ完璧ですのに。。。

そういえば、当時はKENTさんのダイアリーCGI(だっけ?)で日記付けてる人もいましたね。
あれこそ今のブログの原型に近いと言えそうだけど、なんでもうひとつ流行んなかったのかよくよく考えてみたら、やっぱりソースかしら。単に自動ってだけで、ソースはグダグダ(失礼)だったもんなぁ。
ま、当時はウェブ標準どころかヘッディングもパラグラフも使い方知らなんだけど。

それが今や本業になろうとは。。。

で、結局何が言いたいのか忘れたのでこの辺で。
グダグダは今も同じか。

こちらのエントリーもどうぞ♪

そろそろ透過PNG?

IE 7.0

IE 7.0 がリリースされてから、もうかれこれ2年以上が経過し、一方、IE 6.0 のシェアはそろそろ20%を切ったあたりだそうです。・・・って、まだ全然多いんですけど(汗)

とは言え、IE 7.0 になってから、ひとつだけ助かったことがあります。それは、24ビット PNG のアルファチャンネルに対応してくれたことです。これでようやく透過 PNG が貼れるようになりました。

透過PNGのサンプル

と言いたいところですが、まだ IE 6.0 ユーザーが残ってます。
そんなモン早く窓から放り投げてください(笑)

ちなみに IE 6.0 では、こんな風に表示されちゃいます。

透過PNGをIE6.0で表示した場合

なので、もし現時点で透過 PNG をウェブで使おうと思ったら、AlphaImageLoader フィルター(IE独自拡張)を活用せざるを得ないのが現状です。
(IE6ユーザーを切り捨てるなら話は別ですが)
幸いこれを使えば、辛うじて IE 6.0 でも透過 PNG を表示させることができます。

と言ってもコレ、ちょい面倒くさいんですよね。。。

AlphaImageLoader をどう使うか

例えば、透過 PNG を CSS の background 属性に限定して記述するなら、通常の background 属性の記述に続いて、filter 属性への AlphaImageLoader の設定と、アンダースコアハック(underscore hack)による background の消去を行うことで適用できます。(アンダースコアハックはIE6のみに適用させる場合に用いるハック方法)
但し、縦横のサイズが PNG と同一のレイヤに対しては問題ありませんが、PNG よりも大きなレイヤに背景として配置するような場合には注意が必要です。(AlphaImageLoader フィルターの sizingMethod オプションを crop にするか scale にするか等)

しかし、AlphaImageLoader フィルターを、HTML 内の <img> タグで貼られた透過 PNG に適用させる場合は、単に <img> タグに対して AlphaImageLoader フィルターを適用させただけでは、src 属性で指定された元々の PNG が残ったままなので、IE6 では相変わらず非透過の PNG が表示されたままとなります。これは外部 CSS ファイルで記述した場合でも、 <img> タグへ style属性で記述した場合でも同様です。そのため <img> タグの src 属性に透明 GIF を割り当てる等の最終処理が必要になります。そしてこの場合は何らかの JavaScript での処理に頼ることになります。

また、W3C に準拠した Valid でクリーンなソースを壊したくない場合や、ブラウザの独自拡張になるべくなら頼りたくない場合など、おかしなハックやコメントの記述をためらうこともあるでしょう。そう言う理由からも、このようなややこしい処理は初めからすべて JavaScript に丸投げする方法を推奨します。そうすることで、必要悪は最小限に抑えられるでしょう(苦笑)

ちょっと検索してみたら、この機能を持った JavaScript モジュールがいくつか配布されているようでした。ただ、実際にコードを見てみると、必要のない機能が多かったり、無駄にファイルサイズが大きかったりするので、PNG だけの処理には持てあますかも知れません。たかだか IE6 のためだけに資源を無駄に使うこともありませんし。

PNG → AlphaImageLoader 自動転換 JavaScript コード

そこで、PNG だけを処理してくれる JavaScript を組んでみました。(昔組んだものを少しいじっただけですが)
例によって、ページのヘッダに事前に読み込んでおくだけで、あとは自動的に処理してくれるものです。

このコードは、外部 CSS ファイルや HTML 内の <style> タグによる CSS や <img> タグの PNG をスキャンして、自動的に AlphaImageLoader を適用します。但し、<img> タグへの置換用に、予め透明 GIF をサーバーのどこかにアップロードして、ie-png.js 内の gif 変数に絶対パスで設定しておいてください。

変換対象
外部 CSS ファイル
  • background:url(PNG-URL) [color repeat position]
  • background-image:url(PNG-URL)
  • PNG 画像パスは自動的に解析し割り当てるので相対パスでもOK
  • PNG 画像パスをクオート(シングル・ダブル)で囲んであってもOK
内部 <style> タグによる CSS
  • background:url(PNG-URL) [color repeat position]
  • background-image:url(PNG-URL)
  • PNG 画像パスは自動的に解析し割り当てるので相対パスでもOK
  • PNG 画像パスをクオート(シングル・ダブル)で囲んであってもOK
<img> タグの PNG
  • 予め透明 GIF をサーバーにアップロードして、JavaScript コードにその透明 GIF 画像パス(絶対パス推奨)を設定してください
    var gif = 'アップロードした透明GIFの絶対パス';
  • PNG 画像パスは自動的に解析し割り当てるので相対パスでもOK

テスト結果:サンプルページ * IE 6.0 で見ないと効果が判りません
ダウンロード:ie-png.js

ひとりごと

確か、IE 6.0 だけじゃなくて、IE 5.5 とかにも AlphaImageLoader は使えたと思ったのですが、今手元の IETester で試してみると IE 5.5 では AlphaImageLoader による透過 PNG が表示されません(汗)
一応、コード自体は IE 5.5 でも走るように書いたつもりですが、もし動作確認がとれた方はご一報いただけると嬉しいです。

また、インライン CSS 分の画像パスや絶対パスによる記述分は良いとして、外部 CSS ファイル内の相対パスによる画像パスについて、なんかもっとうまく処理する方法はないかしら。例えば、外部 CSS ファイルを HTML とは別の階層から呼び出していた場合に、相対パスだと AlphaImageLoader に渡す画像パスがずれてしまうので、今は地道に生成するようにしてあります。

その他、background 関係以外の画像適用 CSS プロパティ(list-style-image とか)までは面倒なので実装を省略しました(汗)

以下、一応 ie-png.js のコードです。

var gif = 'null.gif';

var env = new Object;
env.ua = navigator.userAgent.toLowerCase();
env.win = (env.ua.indexOf('windows') != -1)? 1: 0;
env.ie = (!window.opera && env.ua.indexOf('msie') != -1)?
           Number(env.ua.charAt(env.ua.indexOf('msie ') + 5)): 0;

var url = new Object;
url.host = 'http://' + window.location.host;
url.path = window.location.pathname.replace(/^(.*?)/[^/]*$/,'$1') + '/';

function setOnload(func){
  (window.addEventListener)? window.addEventListener('load',func,false):
  (window.attachEvent)? window.attachEvent('onload',func):
  window.onload = func;
}

var checkPNG = {
  CSS: function() {   // background, background-image propaty only.
    if(!env.win || env.ie > 6 || env.ie < 5) return false;
    var path = new Array();
    var num = 0;
    var node = document.getElementsByTagName('head')[0].childNodes;
    for(var i=0;i<node.length;i++){
      if(node[i].nodeName.match(/^style$/i))
        path[num] = url.host + url.path;
      else if(node[i].nodeName.match(/^link$/i) &&
          node[i].getAttribute('rel') &&
          node[i].getAttribute('rel').match(/stylesheet/i)){
        var href = node[i].getAttribute('href');
        if(href.match(/^//)) path[num] = url.host + href;
        else if(!href.match(/^https?:///))
               path[num] = url.host + url.path +
                 href.replace(/^(([^/]*/)*).*?$/,'$1');
        else path[num] = href;
      }
      if(path[num]) num++;
    }
    for(var i=0;i<document.styleSheets.length;i++){
      var rule = document.styleSheets[i].rules;
      for(var j=0;j<rule.length;j++) {
        var png = checkStyle(rule[j],'background');
        if(!png) png = checkStyle(rule[j],'backgroundImage');
        if(!png) continue;
        png = (png.match(/^//))? url.host + png:
          (!png.match(/^https?:///i))? path[i] + png: png;
        rule[j].style['filter'] =
          'progid:DXImageTransform.Microsoft.AlphaImageLoader(src=' +
          png + ',sizingMethod=crop)';
      }
    }
    function checkStyle(obj,propaty){
      var value = obj.style[propaty];
      if(!value || !value.match(/.png/i)) return false;
      var png = value.replace(/^.*?url(["']*([^"']+.png)["']*).*$/i,'$1');
      obj.style[propaty] = '';
      return (!png.match(/^[^"']+.png$/i))? '': png;
    }
  },
  HTML: function(){   // '<img>' elements only.
    if(!env.win || env.ie > 6 || env.ie < 5) return false;
    var img = document.getElementsByTagName('img');
    for(var i=0;i<img.length;i++){
      var src = img[i].getAttribute('src');
      if(!src.match(/.png/i)) continue;
      if(!src.match(/^https?:///i)) src = url + src;
      img[i].setAttribute('src',gif);
      img[i].style.filter =
        'progid:DXImageTransform.Microsoft.AlphaImageLoader(src=' +
        src + ',sizingMethod=scale)';
    }
  }
}

function onloads(){
  checkPNG.HTML();
}

checkPNG.CSS();

setOnload(onloads);

こちらのエントリーもどうぞ♪