2006/12/24

this blog's layout is broken

暇ができたのでこのブログをIEやFirefoxで表示させてみたら、なかなか面白いことになっている。
IEは、ソースコード表示のwhite-space:preが効いていない。改行無視しまくりの折り返しまくり。各投稿のタイトルにセットしている色指定も効いていない。
Firefoxでは、背景色と枠線がほとんど全滅。
因みに、普段使っているブラウザはOpera。表示確認もOperaでやっているので、このブログも意図したとおり表示されている。

このブログのテンプレートはCSSレイアウトになっている。大体の表示イメージは、Blogger templatesのBeckettと同じ。というか、コレに少し手を入れた状態だ。同じテンプレートを使ったブログはIEやFirefoxでもちゃんと表示されているので、自分で手を入れたところだけまずいんだろう。
どうするかな…

[CSS, HTML]table layout with CSS

毎日考ブログ:Web標準に進路を取れ 第5回「テーブルレイアウトは罪なのか」をみて思い出した。

CSS2のdisplayプロパティには、table形式の表示をする属性値がある。TABLE関連のそれぞれのタグに相当する属性値が用意されている。w3cの説明では、table要素があらかじめ用意されていない言語(XMLとか)でテーブル表示をやるために用意しているんだそうな。

この属性値を使えば、テーブルレイアウトが使い放題だ。やり方はレイアウト用のtableタグとほぼ同等だ。違いはcolspanやrowspanが無いこと。
CSSを使ったときの 大まかなレイアウトがやりにくい という問題も解決する。table, table-row, table-cellの3つが使えていればfloat使っていたら、要素がどこかに飛んでいってしまったみたいな大きな崩れも無いはずだ。

ちょっと気になるのは、CSSでもHTMLのtableタグと同等の構成が欲しいものなのか?
tableタグは結構ネストが深いので、単純なものでも<table><tbody><tr><td>と同じ深さのネストになる。入れ子にしていると結構辛いかも知れない。

table-rowやtable-cellは表示したい要素自身に設定するようにした方が余計なdivが増えない。colspanやrowspanはCSSの指定を工夫しよう、ページのヘッダをtable-header-group, フッタをtable-footer-group, メニューリストをtable-caption指定にすればOK。メニューリストをページの上下左右どこに表示するかはcaption-sideで調整できるはずだ。
#thead, tfootタグをまともにサポートしているブラウザが少ないので、table-header-groupとtable-footer-groupは表示位置がおかしいブラウザが多いかもしれない。

注意。IEはdisplay:tableをサポートしてません :P

2006/12/23

[Blogger]post script tag

Bloggerにscriptタグを投稿できたので、ちょっと調べてみた。

  1. 普通にscriptタグ入りの記事を書くスクリプトタグを拒否らせてみる。 <script type="text/javascript"> function scriptTagTest(){ alert("script tag test OK!!") } </script> <button onclick="javascript:scriptTagTest()">test</button>
  2. 公開するボタンで公開
  3. 作成された HTML ファイルは承認できません: Tag is not allowed: <script type="text/javascript">と言われ、この時点で投稿は公開されないreject message
  4. 投稿のステータスを確認すると、公開状態になっているstatus of posts
  5. 全部ログの再構築(投稿 > ステータスにある)を行う
  6. ブログに、さっき拒否された投稿が公開される

もちろん、テンプレート部分なら最初からスクリプトでも何でも入れ放題。scriptタグを投稿内で使えると、外部ファイルを用意したりせずに一つの投稿で完結できる。

因みに、コレを試しているのは旧版のBloggerなので、新しいBloggerでどうなっているかは不明。移行したらばっさり消されたりして…。あ、配信してるrssもどうなってるのか怖いな。

[Blogger]blogger rejects script tag. but...

この投稿(scribble: [math]Monty Hall game in a conversation)、<script>を使うと、Bloggerにscriptタグはダメっていわれたから、公開されていないと思ってたんだけどなぁ。何でいるんだろう。

あとでテスト用のブログを作って試してみよう。

2006/12/18

[math]Monty Hall game in a conversation

モンティ・ホール問題が会話に出てきた。この問題、ベイズの定理やら図入りやらで説明しないと伝えにくいんだけど、話をゲームにできるからちょっとしたねたによかった。そのときの会話の内容を…。

3つの扉があって、一つには商品が入ってる。プレイヤーは司会者と一緒に、次の手順で商品が入ってる扉を当てる。

  1. まず、一度扉を選ぶ
  2. 必ず、司会者(商品が入ってる扉を知ってる)が、選ばれなかった扉からハズレの扉を開く
  3. プレイヤーは、ココで扉を選びなおすことができる

プレイヤーは、扉を変えたほうがいい?変えない方がいい?

説明すると、そのままの扉のとき、当たる確立は1/3。OK?
選びなおしたときの確立の方は…パターンは、ハズレ→当たり と 当たり→ハズレ の2パターン。最初にハズレを選んでれば当たるから、2/3。
だから、扉を変えるほうがいい。

詳しい話はWikipediaの記事ネコでもわかるモンティホールジレンマが分かりやすい。

2006/12/17

[Java]volatile alternate synchronized?

volatileは排他制御用の機能ではなく、変数のロード/ストアをatomicに行うための機能。synchronizedと同等に機能することを期待できるのは、参照や更新が各処理で一度だけですむ場合だけだ。この辺の考えは、 static Map syncMap = Collections.synchronizeMap(new HashMap()); static Object getCachedObject(Object key) { if (syncMap.containsKey(key)) { return syncMap.get(key); } else { Object value = new Value(key); syncMap.put(key, value); return value; } } このコードがうまく動かないのと同じような感じだ。複数回の読み書きの間に他のスレッドが更新を行うかもしれないから。

Javaのリオーダとメモリモデルの話もある。

  • リオーダ…スレッド自身にとって問題が無ければ、処理の順序は入れ替わる
  • メモリモデル…スレッドは、自分用のキャッシュだけを読み書きしていることがある

例えば、 volatile static instance; static Object getInstance() { if (instance == null) { insntacre = new Singleton(); } return instance; } この処理はうまく動かない。
volatileを使っているので、instanceのnull判定はうまくいく。でも、new Singletonの初期化処理が終わっているかどうかは分からない。リオーダで、Singletonのコンストラクタがやっている初期化は代入より後になっているかもしれない。
初期化処理が終わっていても、Singletonクラスのインスタンスフィールドはメインメモリに書き出されていないかもしれない。volatileは変数の代入部分を書き出すことしか保障してくれない。
気の利いたVMやコンパイラなら 初期化が終わるまでインスタンスを公開しない とか、volatileを見かけたらインスタンスフィールドの書き出しを代入より先にやる ってこともやってくれる。
#new した後でinit()を呼び出して初期化 なんて変な作りならコレもダメだろうけど

この辺の話は、synchronizeを使わないと動かない。synchronizedでも動かないパターンはまた今度書こ。

JSR133でメモリモデルの仕様が見直されているので、volatileの扱いはもう少し上になる。でも、Javaがオープンソース化されて今後は大量の亜種が出回ることになるだろうから、この辺をしっかりと実装してくれるか分からない。

ラベル:

2006/12/16

[CSS]this is surprise!!

<font class="red"> CSSを根底から覆す斬新なアイディア。まさか職場でこんなものに出会えるとは…
#このブログも人のことをうだうだ言えるようなHTMLじゃないけど

[Blogger]Backlinks link to Links

なんかややこしいタイトルになってしまった。

Bloggerの記事を個別で見ると、リンクリスト部分にリンクを作成するという表示がある。コレをクリックすると、当該記事にリンクした投稿を簡単に作成できる。

ただこの機能、なぜか個別ページの#linksアンカー(バックリンクのリンクリスト部分)にリンクを貼ろうとする。create link form画像はリンクを作成する機能が生成する投稿フォーム。リンク先が.html#linksになっている。

別に、リンクリストにリンクしたいわけじゃないんだけど…何か意味があるんだろうか?バックリンク機能は#linksがないと識別しないとか?

[MS Excel]paste cell as picture

後輩が知らなかったので…。

Excelには、作成した表を画像として使用する機能がある。
別シートを参照するとセル幅が違ったり、無関係な表でも同一領域内に混在させることができるので便利。俺は、具体的なデータを入れた表の上に、その傾向を分析してパターン化した表を入れるときなんかに使う。

ポイントは、メニューの編集をShiftを押しながらクリック。 Excelで適当なセル範囲を選択→コピーして、Shift+メニューの編集。いつもとメニューが違い、図の貼り付け図のリンク貼り付けが出る。
2つの違いはリンク元やリンク元の参照先が変更されたとき、貼り付けた図が更新されるかどうか。リンク貼り付けは操作する度に更新されるので、同一ファイル内を参照するときはこっちの方が使い勝手がいい。ただし、再計算の量が大きいと反応が遅くなることがある。

おまけOfficeなんかのMicrosoft系のソフトは、コピーした内容をペイントに画像として貼り付けることができる。あんまり使わないけど。IBMのNotesなんかも画像として貼り付けできるので、手元のソフトにコピー結果を貼り付けてみると面白い結果が出るかも。

ラベル: ,

2006/12/10

[Blogger]Backlinks is broken - 2

ちょっと調べてみた。

<BlogItemBacklinks>は、HTMLになると次の状態に展開されていた。 <div id="blogger-dcom-block" style="display:none"> <script type="text/javascript" src="http://www.blogger.com/dyn-js/backlink.js?blogID=ブログのID&postID=投稿のID" charset="utf-8" defer="true"> </script> <noscript><a href="ブログサーチのURL">See links to this post</a></noscript> <div id="blogger-dcom-block" style="display:none"> BlogItemBacklinksタグの中に書いた内容。 </div>

どうやら、<BlogItemBacklinks>の中に書いた内容はそのまま出力し、CSS(style="display:none"部分)で隠しているらしい。 出力しなきゃいいのに。

そのまま出力されるんじゃ意味無いと思って、<BlogItemBacklinks>の中身を消してみたら…リンクが出力されなくなってしまった。
もしかして、Javascriptで<div id="blogger-dcom-block" style="display:none">を探して、その中をテンプレートにして置換えをやってるのかな?バックリンクを有効にしたときに出力されるようになるスクリプトファイルを調べると、backlink.jsにその内容があった。

なんか静的HTML生成して公開する方式だと、後からリンクされてもわかんないじゃんって後付にしたような作りだなぁ…
これだと、CSSを使えないブラウザは諦めるしかないか。scriptタグの中コメントアウトしてdocument.write()で書き出してくれればましなんだけど。

[Windows]Open Word as read-only - 2

[Windows]Open Word as read-onlyで書いた、Explorer上でWordファイルを右クリックした時のコンテキストメニューに読み取り専用を開くを追加する方法を試したらダメだった。手元にOfficeがないのが辛い…

DDEメッセージ に入力した内容は一時的にVBAコードに置き換えられてから実行されるらしい。ExcelはOpen(FileName, ,ReadOnly)で呼び出せるけど、WordはDocuments.Open()らしい。でも、Documents.Openで書こうとするとWordBasic.Call "オブジェクト.関数"と文字列として置き換えられてしまった。何だコレ?
これはDDEのマニュアルが見つかるまで放置だな。

ラベル:

2006/12/08

[Blogger]Backlinks is broken

iモードブラウザでブログ見ててBloggerのBacklinksがバグっているのに気がついた。 Bloggerのヘルプにあるテンプレート <BlogItemBacklinksEnabled> <a name="links"></a> <h4><Links to this post:</h4> <dl id="comments-block"> <BlogItemBacklinks> <dt class="comment-title"> <$BlogBacklinkControl$> <a href="<$BlogBacklinkURL$>" rel="nofollow"> <$BlogBacklinkTitle$></a> <$BlogBacklinkDeleteIcon$> </dt> <dd class="comment-body"><$BlogBacklinkSnippet$> <br /> <span class="comment-poster"> <em>posted by <$BlogBacklinkAuthor$> @ <$BlogBacklinkDateTime$></em> </span> </dd> </BlogItemBacklinks> </dl> <p class="comment-timestamp"><$BlogItemBacklinkCreate$></p> </BlogItemBacklinksEnabled> バックリンク関連のタグのうち、<$BlogBacklinkSnippet$>など、ブログの内容を表示するタグが置き換えられずにそのままHTMLに出力されている。メインページでは表示されないようにしている人が多いので、単独の投稿項目を表示しないと分からない。普通のブラウザは変なタグとして表示しなくなってしまうようだけど、iモードブラウザではなぜか普通の文字として表示される。 日本語サイトでBacklinksについて書いているのはクリボウさんのBlog(クリボウの Blogger Tips: Blogger に新機能 Backlinks)ぐらいだけど、このバグについては気付いていない模様。英語サイトも含めて調べてみないといけなさそうだ。

2006/12/06

[Windows]Open Word as read-only

ファイルサーバにあるExcelやWordを開くとき、ファイルをロックしてしまわないように読み取り専用で開きたいことがある。Excelは設定を見かけるが、Wordが見あたらないので書いておく。

Excelの場合
  1. エクスプローラを開き、メニューから ツール → フォルダオプション
  2. ファイルの種類 タブを選択
  3. 登録されているファイルの種類 から、XLS を選択(キーボードでxlsと打てば探しやすい) → 詳細設定 ボタン
  4. 新規 ボタン
  5. 次の通り入力
    アクション
    読み取り専用で開く(&1)
    アクションを実行するアプリケーション
    Excelのパスを入力する"C:\Program Files\Microsoft Office\Office\EXCEL.EXE" /e /r
    DDEメッセージ
    [open("%1", 0, True)]
    アプリケーション
    Excel
    DDEアプリケーションが実行していないとき
    空のまま
    トピック
    system
  6. 今まで開かれたウィンドウ全部 OK ボタン
Wordの場合
  1. エクスプローラを開き、メニューから ツール → フォルダオプション
  2. ファイルの種類 タブを選択
  3. 登録されているファイルの種類 から、DOC を選択 → 詳細設定 ボタン
  4. 新規 ボタン
  5. 次の通り入力
    アクション
    読み取り専用で開く(&1)
    アクションを実行するアプリケーション
    Wordのパスを入力する"C:\Program Files\Microsoft Office\Office\WORD.EXE"
    DDEメッセージ
    [FileOpen ("""%1"""),.ReadOnly]
    アプリケーション
    WinWord
    DDEアプリケーションが実行していないとき
    空のまま
    トピック
    system
  6. 今まで開かれたウィンドウ全部 OK ボタン

因みに、Excelにはツールバーのカスタマイズの中に読み取り専用の設定/解除というボタンがある。メニューから ツールバー → ユーザ設定 → ファイルのグループの一番下 にある。ツールバーの好きなところに配置しておくと表示中に簡単に切り替えできて便利。

レジストリの設定を書き出してアップしておこうと思ったら、自分のPCにはOffice入れてないんだった。しかも、Bloggerで普通のファイルをアップする方法がよく分からない。皆ちまちま設定してくれ。

[Java]side-effect from finalize

SingletonやTypeSafeEnumなどのパターンとシリアライズが相性が悪いことを前に書いた
そこでは、readResolveメソッドを実装することを書いたが、readResolveの実装には一つ注意点がある。

readResolveでオブジェクトを置き換えるようにすると、ObjectInputStreamの利用側にはデシリアライズされたオブジェクトは公開されなくなる。
しかし、VMとファイナライザはreadREsolveメソッドが破棄したオブジェクトを認識しているため、次回のGCでObject#finalize()が呼び出されることになる。 リソースの開放などをfinalizeに書いている場合、readResolveによって破棄されたオブジェクトが悪さをしないように注意する必要がある。

ラベル: