5月 2009 のブログ記事

最近、Filemakerの内容をエクセルへ書き出すということが増えてきて、
単純にエクセルファイルを出力するだけなら、FM単体でできるんですが、
罫線や計算式がすでに設定されたテンプレートファイルを用意しておいて、
そこへFMのDB内容を流し込むということはFM単体ではできません。

ということで、
ODBCでFMDBに接続

適切なSQLを発行してエクセルに出力したい内容を得る

エクセルをOLEとかで制御
という手段でエクセルファイルを出力したい。

VBAとかWSHを使えばできるんでしょうけど、
ADOでFMに接続して、エクセル起動して、
そのためにはDLLを呼び出してfasdlkdfjpaodfi:aoあうdsf…
と、まぁとてもめんどくさいわけですよ。

そこで登場するのがわれらがなでしこ
特に何かライブラリをインクルードしたりすることなく、
標準でADO接続したり、エクセル制御したりということができるようになっているので、
リファレンスどおりの命令文を使えば、
大体実現可能です。

が、ひとつ問題があります。
以前、なでしこからODBC接続で
FMのDBへ接続する方法という記事を書いたのですが、
ここを読んでもらえば分かるとおり、
FMへの接続はちょっと特殊です。

接続の下準備とか、SQL文の仕様はどうにもならないにしても、
接続するのに毎回UTFエンコードして,,ウダウダウダと接続文字列を作るのはめんどくせぇよぉ。
ってことで、FMのDBへODBC接続するための
なでしこ関数を作りました。

ここからダウンロードして下さい

使い方は、ダウンロードファイルに書いてあります。

※改変OKです。自作ソフトにバンドルの配布や販売もOKです。
 自己の全責任においてご利用ください。
※すみませんが、この関数のみの、再配布や再販は行わないで下さい。
※DB接続時、ハンドルをとらない仕組みなっているので、
 必要な人は、改造して利用してください。
※なでしこプラグインは未テストです。

何かと便利なLightbox。

だが、Lighbox2をSSL通信領域で使うと、

ブラウザ界を代表する困ったちゃんIEでセキュリティ警告が出る。


SSL通信になってない項目がページの中にあるよ。っていう警告なんだけど、

いくら調べてもそんなのページの中にない(>_<)
何が原因なのかさっぱりで、丸二日悩んだ・・・。Lightboxが悪いのか、IEが悪いのか。


で、最終的に、Lightboxディレクトリ中「/css/lightbox.css」に原因があることが判明。
13行目の記述。

#prevLink, #nextLink{ width: 49%; height: 100%; background-image: url(data:image/gif;base64,AAAA); /* Trick IE into showing hover */ display: block; }

「background-image: url(data:image/gif;base64,AAAA);」
↑どうやらこれが問題らしい。。。見慣れない記述だ。
おそらく、BASE64エンコードしたときに値が「AAAA」となる、Content-typeが「image/gif」のデータを背景として読み込んでいる様子。

だったら、こういうファイルを実際につくればいいのでは。
ってことで、そのファイルをまずPerlで作る。

#!/usr/bin/perl -w

use strict;
use MIME::Base64;

my $fh;
open( $fh,'> hover.gif') || die("だめだった...orz\\n");
print $fh decode_base64('AAAA');
close( $fh );

print "できた!\\n";

まあこんな感じ。適当で申し訳ない(^-^;

それで、このスクリプトで作った「hover.gif」を、
lighbox内のディレクトリ「images」へアップロードし、
「/css/lightbox.css」の13行目を

#prevLink, #nextLink{ width: 49%; height: 100%; background-image: url(../images/hover.gif); /* Trick IE into showing hover */ display: block; }

に変更したら、警告は出なくなった。


今回は、一応CSSに記述されている内容にしたがって改造したけど、
そもそもBASE64にしたとき「AAAA」なGIF画像なんて意味があるわけがないので、
もしかしたら、そんな画像をわざわざ作らなくても、何か適当なGIFを背景に指定してやればよかったのかも。

大好きな言語「なでしこ」がVer.1.521からLua言語を内包した。

???Luaって何じゃ???
恥ずかしながら、知らなかった。

ググってみた。こんなサイトがあった。。。

ほうほう。組み込み向けも言語なのですな。。。
Cに組み込んだり、Delphiに組み込んだり。。。
しかも、PerlやらRubyやらより高速らしい。ほぉ。

言語体系は、
見た感じJavascriptとQuickBasic系の中間って感じかな?
無名関数なんかもつくれて、言語としてはかなり完成されているよう。
それでいて、やっぱりJSに似てるということで、初心者でも使えそう。

これはいい!早速覚えよう!!

なでしこは、非常に利用しやすくてしかも強力で、そして何より日本語で書けるプログラミング言語なのだが、Luaを内包したことで、なでしこならではの弱点をカバーできそう。(なんか CにSmalltalkのオブジェクト指向を内包したobjective-Cを思い出すね。)

ただ、Luaを使おうとすると、日本語プログラミング言語としての簡易さは揺らぐ?バランスよく使わなきゃ。

Luaって、Perlで言うところのCPANみたいなものはないのかなぁ。あれば、さらにいいんだけど。
というか、本当はなでしこにCPANみたいなものがあってほしいんだけどね。

LuaにCAPNみたいなものがあるなら、Filemaker用のLua実行プラグインをつくっても楽しいかも。

とりあえず、勉強しなければならないことが増えました。

script.aculo.usが何かと便利だ。

とか書いていると、

「prototype.jsマンセーな人か?}
という突っ込みを受けそうですが、
否定はしません。
jQueryよりprototype.jsが好きです。
HTML制作をする上で、使いやすいのは多分圧倒的にjQueryなんだと思いますが、
いかにもjavascriptを拡張したっぽいprototype.jsのが親しみを感じるのです。個人的に。

閑話休題・・・いや、、、本題へ。



script.aculo.usには便利な機能が満載。フロートできる要素の設定も簡単だったので紹介。


まずは、例のごとくHTMLにライブラリをロードしなければお話になりません。

<script type="text/javascript" src="prototype.js"></script>
<script type="text/javascript" src="scriptaculous.js"></script>
<script type="text/javascript" src="dragdrop.js"></script>

うえの二つは、script.aculo.usのベースライブラリ。
最後のひとつは、フロートできる要素を作ったり、ドロップできる要素をつくったりしたいときに呼び出すライブラリです。

script.aculo.usのダウンロードはこちらから。


次に、フロートしたいブロック要素をつくります。

<div id="float">これをフロート</div>

当たり前ですが、IDはページ内でユニークなものを設定しましょう。



最後にjavascriptでフロートを作成です。

<script type="text/javascript">
	new Draggable('float');
</script>


↑これだけです。引数には、フロートしたい要素のIDを指定します。

まぁ、普通は、onloadで呼び出す関数などに入れておいて、
ページ読み込み完了時 にこの命令が有効になるようにしたほうがいいので、
実際は、

<script type="text/javascript">
	function loadFunction(){
		new Draggable('float');
	}
</script>


↑JSソースにはこのように書いておき、

<body onload="loadFunction();">

↑<body>
タグにこのようにonload属性をつけて、関数を呼び出すのが筋でしょうか。

onload属性を使うのがかっちょわりぃなぁという人もいると思いますが、
ソース書くのが面倒なので、自分で考えて書いてください。



あとは、フロートしたDIVにスタイルシートで飾りをつけてやれば、そこそこWindowっぽいものが出来上がります。

色々ゴニョゴニョしてやれば、擬似ウィンドウもできますから、自分専用の擬似ウインドウライブラリを作っておくと何かと便利だと思ったり。



上記例では、関数「Draggable」にはひとつしか引数を渡していませんが、
第二引数でオプションを設定可能です。

<script type="text/javascript">
new Draggable(
	'float',
    	{
        		ghosting : true,//ゴーストを表示させるか? true|false
                revert : true,//移動後元の位置に戻すか? true|false
                starteffect: function() {//ドラッグ開始時によばれる関数
                },
                endeffect: function() {//ドラッグ終了時に呼ばれる関数
                }
         }
);
</script>

だいたいこんな感じです。

ほかにも沢山オプションがありますし、
フロート指定した要素に「onDrag」(ドラッグ開始のとき)などの、
イベントハンドラが追加されます。
詳しくは公式ページをご覧下さい。

handleというオプションを使うとD&Dできるようになるらしいですが、
未確認のため、今回は記事には書きません。



javascriptで広告とかをフロートさせるライブラリが何万円で売ってることがありますが、
これなら安上がり?
script.aculo.usはMITライセンスだから、自分でつくって売ってもウマー(←あんまり感心しませんがね)

PHPは何かと叩かれやすい言語。

私もPHP使う人間だが、
PHPだけを利用するのはあまりよくないと思っている。
個人的には、PHPはプログラミング言語というよりは、
ほかの言語での勉強や経験を、
実践の場で簡単にフィードバックできる「ツール」くらいの感覚で利用している。
その辺の議論は、ググるといっぱいでてくるので、ここまで。

「ツール」という言葉を出したとおり、
PHPは、良くも悪くもWEBで利用するには
とても便利な便利な関数がそろえられている。

この関数をJavascriptへユーザー定義関数として実装してしまおう!
というのが「PHP.js」です。

http://kevin.vanzonneveld.net/techblog/article/phpjs_licensing/

関数別に説明ページとソースがある。

すべての関数をまとめたJSファイルをダウンロードもできるようだが、
ほかのJSライブラリと重複する機能も多々あるので、
関数別にソースを拝借して、利用したほうがよさそうだ。

個人的にmd5()、file_get_contents(),basename(),dirname()あたりを良く使いそうな予感。

スムーススクロールを使いたいときのメモ。



今回はすでにprototype.jsが導入済みのサイトへの導入のため、
jQeuryを使わずに prototype.js + scriptaculous.js でスクロールする方法です。

jQueryの場合は、
http://coliss.com/articles/build-websites/operation/javascript/296.html
↑こちらが良さげです。
(さまざまなエフェクトが用意されているjQueryに標準で用意されていないのが意外でした。)

あ、そうそう、scriptaculous.jsのダウンロードはこちらで、、、
http://script.aculo.us/



では、実装。

<script type="text/javascript" src="prototype.js"></script>
<script type="text/javascript" src="scriptaculous.js?load=effects"></script>

↑まずはライブラリをHTMLにロードしてやらないことにはお話にならないので、
ロードしましょう。



で、スクロール先のエレメントを用意します。

<div id="scrollToID"></div>

とか

<a name="scrollToID" id="scrollToID"></a>

とか。

とにかくエレメントがあればブロック要素だろうがアンカーだろうがスクロールしてくれるみたいです。
便利。



で、スクロールする関数を用意しましょう。

<script type="text/javascript">
function _scrollTo( id ){
    new Effect.ScrollTo(id);

}
</script>

たったこれだけ。

new Effect.ScrollTo(スクロールさせたいエレメントのID);

↑そう、たったこれだけなのだ。

上記例では、第二引数は省略してあるけれど、
第二引数でオプションを指定して、スクロールする時間を変えたり、スクロール完了後のコールバック関数を指定できたりするらしい。めちゃ便利。詳しくはこちらをご覧下され。


じゃあ最後は、定義した関数を呼び出すだけ。

<a href="javascript:_scrollTo('scrollToID');">クリックしてね☆</a>

リンクでやるならこんな感じね。
アンカーへジャンプするのの代わりに使うとかっちょいいサイトになるんじゃないかな。
当然、ボタンでやるならonclick属性で関数を呼び出してあげましょう。


ちなみに、アニメーションなしでスクロールするには、

Element.scrollTo(スクロール先のエレメントID);

を使います。こちらは、よりアンカータグへのジャンプに似た動きをします。<a>タグを使ってアンカーへジャンプした場合、ジャンプ前のURLとジャンプ後のURLが、WEBブラウザの履歴に残ってしまい、エンドユーザーに迷惑をかけることが多々ありますが、この方法なら、そんなことはありません。



ちなみに、当然といえば当然ですが、CSSで「display:none;」などを指定して見えていないエレメントへはスクロールしません。たとえばscriptaculous.jsのEffect.BlindDown関数などを使って表示/非表示の切替を行っている場合などは、確実に表示が完了した時点で、スクロールを開始しなければ、ページ最上部へスクロールされてしまうので注意が必要です。



で、まぁ動かしてみたところ、私の環境では、Firefoxでうまく動いてくれませんでした。
なんだかよく分からず小一時間悩んだところ、
http://d.hatena.ne.jp/zariganitosh/20081006
こちらのページの「スクロールアニメーションしない時…」を実践したところ、うまく動きました。

読んでも理屈が良く分からない・・・。うーむ・・・。

が、とりあえず動作は満足。ありがとうございます。



さらに、#を使ったアンカーへのジャンプを自動でscriptaculous.jsのスクロールに振り替えてくれるという話も見つけた。
http://www.u-ziq.com/blog/2007/03/prototypejs.html
今回は未実装だけど、使うケースは増えそうな予感。



【2009年5月21日追記】

名古屋のWEB開発業者さん「音生(ねお)」さんが、
スクロール専用のライブラリをリリースしてらっしゃいます。
ほかのライブラリと競合しないことがすばらしい。

scriptaculous.jsのスクロールを数日試してみましたが、
バグなのか仕様なのか、環境によって動作が????なところが沢山ありました。
こちらのライブラリのがよさそうです。
おかしな動作がないわけではないですが、
ページのつくり方、スクリプトの書き方でほとんど改善できました。
ちなみにライセンスはMITなので、使いやすいです。