Hatena::ブログ(Diary)

分室の分室 このページをアンテナに追加

2012-09-05 Wed

【280】ホームページで古いページを『過去ログフォルダ』に移動 (リンク切れ対策)

 どうも。久し振りに JavaScript ネタ。

 メインサイトでホームページを公開している人…けっこういると思う。自分もその一人なんだけど。

 で、題名のとおり


    ホームページで古いページを『過去ログフォルダ』に移動


…すると、リンク切れが発生し、修正するのが面倒くさい。こんな時、リンクの記述を JavaScript で書き込んでおくとラクだな、と。↓

// リンク・データ
var mymy_data = [
    {   name:'14: circle',
        href:'./14-circle.html',
        line:'【円弧】真円、円弧を描く'    },

    {   name:'15: circle0',
        href:'./15-circle0.html',
        line:'【円弧】真円、楕円、円弧を描く (昔の circle 文)'    },

    {   name:'27: circle_p',
        href:'./27-circle_p.html',
        line:'【多角】円周上に点を打つ (点を結んで多角形を描く)'  },

    {   name:'28: wipe_out',
        href:'./28-wipe_out.html',
        line:'【除去】描画範囲からはみ出た座標を拭き取る'   },

    {   name:'30: rnd_p',
        href:'./30-rnd_p.html',
        line:'【点描】指定範囲内にランダムに点を打つ'       }
];

// リンク生成
var num = mymy_data.length;
for (var i=0; i<num; ++i) {
    var name = mymy_data[i].name;       // 関数名
    var line = mymy_data[i].line;       // 説明文
    var href = mymy_data[i].href;       // url
    var link = '<a href="' + href + '">' + name + '</a><br>';
    var str  = '<div class="mymyleft">'  + line + '</div>';
    document.write(link + str);         // 出力
}

 これを仮に link.js として ./ (カレントディレクトリ) に html ファイルと一緒に放り込んでおく。で、html には(例えばサイドバーとかに)

<script type="text/javascript" src="./link.js"></script>

…という 1行を記述。こうしておくと、その html を別のディレクトリに移動すると、リンク切れのリンク自体が表示されなくなる。つまり『無かった事になる』ので、修正する必要もなくなる。これは便利だー。


 JavaScript を覚えてしまうと、CGI が面倒くさく感じる。。。

2012-05-03 Thu

【233】自作ブログパーツを作ってみた…

			

まず、

 サンプル置場のツリー構造を変えました。 新サンプル置場:http://blue.zero.jp/foussin/cgi/src/  ブログパーツを作った。で、それを公開するとして、どこに置こうか…ここで 詰まってしまった。管理しやすい容れ物を作っておかないと、後がキツイぞ…。  このことである。 …で、その『容れ物』の型を決めることを最優先した。それ用に index_list.cgi という CGI を急遽『マルチバイト対応』に作り直した。 ファイルの分類を文字 コード別にフォルダを分ける…というのをヤメるためだった。  やっつけ仕事なので、改善の余地がたくさんあるコードだが、今は贅沢は言う まい。この件については、もう少し推敲して、改めて投稿するつもり。  さて、ブログパーツですが。

サンキュー、メリル

●名前:名前はテキトーです。(サンキュー、メリル) thank-you-meryl.js_sjis.txt (sjis 版) thank-you-meryl.js_utf8.txt (utf8 版) thank-you-meryl.js_euc.txt (euc 版) ●置き場所(サンプル置場): http://blue.zero.jp/foussin/cgi/src/js/thank-you-meryl/ (sjis版、utf8版、euc版、全部ここに置いてあります) ●対応状況: ・はてなダイアリー ←(現時点では動作しない) ← たぶん無理… ・はてなブログ ←(想定どおりの動作を確認) ・アメーバ ←(動作はするが、レイアウトが崩れる) ・ヤプログ ←(想定どおりの動作を確認) のサイドバーに貼り付けて使う…予定だったんだけど、コードがデカ過ぎる らしくて、どのブログでも表示できなかった。がっかり。 そこで、このファイルを『 thank-you-meryl.js 』にリネームして、 さらにアップロード可能、アクセス可能な外部ストレージに置いて、 仮に、その場所を『 http://host/path/ 』と仮定すると… ブログの編集ページに、次のように記述する。↓
<script type="text/javascript"> <!-- /* 『ありがたい お言葉』『感謝の意』の【ユーザー設定】 * * はてなブログで使う :var mymy_product = ''; * アメーバで使う :var mymy_product = 'ameba'; * ヤプログで使う :var mymy_product = 'yaplog'; * * メインサイトで使う場合:var mymy_product = ''; * (空文字列:自作 Web ページの場合) * * 上記いずれかの指定を『ブログで行う』 */ var mymy_product = ''; // --> </script> <script type="text/javascript" src="http://host/path/thank-you-meryl.js"></script>
…このようにしてブログから呼び出す仕様に変更した。 ●注意点:ブログサービスによって『文字コード』が違います。このファイルを 適切な文字コードに変換しないと『文字化け』します。ちなみに… はてなダイアリー .. euc ← 動作しないけど… はてなブログ ...... utf8 アメーバ .......... utf8 ヤプログ .......... sjis となっています。(一応 utf8 版と euc 版も用意しました) ●概要: ・『ありがたい お言葉』 ・『感謝の意』(上記と連動する) …の 2つのパーツで構成されています。 url を指定する使い方ではつまらない。これに自分なりのオリジナリティを 加えて、自分のブログに貼り付けた方が面白い。 そのため拡張子は .js で はなく js_.txt にした。つまり、改造して使う前提です。 ご自由に改造し てください。  あとで、これを使ったサンプルページを作って、サンプル置場に置いてみる。 今日は、ちょっと疲れたので、もうおしまい。

2012-04-08 Sun

【223】JavaScript の予約語

【追記】04/08 Sun 20:29(明らかなバグを修正…)
04/08 23:50(記事も一部修正)

			

制作メモ

 そうだ。予約語を表示してみよう、と思った。  js を覚えきれていない現状では、コーディング中によく手が止まる。 変数名 を決める時に、 これは予約語だっけ ? となるので。そこで 1. テキストボックスに 英字1文字 を入力すると、 その文字から始まる予約語を表示する。 2. テキストボックスに 英単語 (2文字以上)を入力すると、 その文字列が予約語にマッチするかどうかを調べる。 …というのを作ってみる(英字は大文字と小文字を区別する)。 予約語については、次のページを参考にしました。↓ http://www.ajaxtower.jp/js/ini/index5.html (AjaxTower - 予約語:buzzword 氏のページ)  上記の資料をまるごと変数 heredoc に格納した。 あとは入力単語と heredoc を照合する。さほど難しいことではないかと。実現するために必要なことは… ・入力文字列が何文字かを特定(単語 or 1文字) ・1文字ならば、その文字から始まる予約語を探し、配列 reserve に格納 ・具体的には、 /\s文字[a-zA-Z]+\s/gm にマッチする予約語を探す ・配列要素を sort() で並べ替え、join() で連結して表示 ・配列が null なら『"文字" から始まる予約語はありません』…となる ・単語の場合は、 /単語/m にマッチする予約語があるかを探す ・単語の場合は、 /\s単語\s/m にマッチする予約語があるかを探す ・マッチしたら 『"単語" は予約語です』 …となる ・マッチしなければ『"単語" は予約語ではありません』…となる  Perl だったら、ここまで仕様が固まれば、もう出来たも同然なんだけど、js の場合、さらに html フォームとか、色々と面倒くさい…  とまあ、こんな感じでやってみた。ソースは『サンプル置場』に http://blue.zero.jp/foussin/cgi/sjis-src/trial-run/js/ reserved_words0.html .......... オリジナル reserved_words0_hatena.html ... はてなブログ用に書き直したもの reserved_words1.html .......... オリジナル reserved_words1_hatena.html ... はてなブログ用に書き直したもの …を置いてある。今回のサンプルでは、正規表現、sort、join、innerHTML など、 js でよく使うと思われる構文を一通り試した。これでやっと『じゃじゃ馬 js 』 を乗りこなせた気がする。乗れただけで、走らすには至っていないが、コイツを 疾走させるのはプロに任せて、当方としてはのんびりゆったりと歩を進めたい。

はてなブログでプチトラブル…

 今回はちゃんと表示できた。フォームから起動させれば動くようだ。ブログの 記事の中で js を動かす場合、ヘッダではなく、ボディに記述することになる。 body 内では、html のレンダリングが終わるまで待つ…ということができないの で、js コードを最後に記述する。これで良いみたい。  しかし、ちょっとしたトラブルが発生した。前回に投稿した時計の時刻が、今 回の記事のテキスト窓に表示されてしまった。  JavaScript の時計は、こんなソースだった。↓
<FORM METHOD="post"> ただいま<INPUT NAME="watch" SIZE=15>です。 </FORM> <SCRIPT LANGUAGE="JavaScript"> function watch() { now = new Date(); : : (中略) : document.forms[0].elements[0].value = hour+":"+min+":"+sec; setTimeout('watch()', 999); // 1000msec = 1sec } watch(); </SCRIPT>
 これは、とある有名な Webサイトからコピペしただけのものなんだけど、今回 これが問題なのは、 『名無しの <form> 』を使っている 『document.forms[0].elements[0].value』…抽象的に指定している …ここが問題だった。で、次のように修正した。↓
<form method="post" name="fwatch"> ただいま<input type="text" name="iwatch" size="15" />です。 </form> <script type="text/javascript">// <![CDATA[ function watch() { now = new Date(); hour = now.getHours(); min = now.getMinutes(); sec = now.getSeconds(); if (hour < 10) { hour = "0" + hour; } if (min < 10) { min = "0" + min; } if (sec < 10) { sec = "0" + sec; } document.fwatch.iwatch.value = hour + ":" + min + ":" + sec; setTimeout('watch()', 999); // 1000msec = 1sec } watch(); // ></script>
…このように修正し、再読込で表示したら正常に戻った。ところで、 コメントの <!-- … --> が、 // <![CDATA[ … // > に 変換されているのは『はてなブログ』の自動化によるもの。 詳細はわかんない…。  ブログで JavaScript するなら、name 属性、id 属性が重複しないように管理 する必要がある。『通し番号』とか『年月日』とかで区別する必要があるな。  今日は、これでおしまい。

2012-04-06 Fri

【222】 正規表現

…といえば、Perl のお家芸。


    my $pattern = "abc";
    my $bool;
    ($str =~ /$pattern/) && ($bool = "true");   # マッチすれば真


これを JavaScript でやるには、こうするらしい。↓


    var pattern = "abc";
    var bool;
    var pat = new RegExp(pattern);          // パターンオブジェクトを作る
    str.match(pat) && (bool = "true");


正規表現の記述自体は、だいたい Perl と同じみたいなので、詳細は省く。Perl
をやってて良かった。。。


文字列が "abc" にマッチすれば真(true)。↓

xyz      => false
cdef     => false
xyzabcd  => true
foo      => false

これのソース。↓


<pre> <script type="text/javascript"> <!-- var pattern = "abc"; var re = new RegExp(pattern); var bool = ""; var str = ["xyz", "cdef", "xyzabcd", "foo"]; var num = str.length; for (var i=0; i<num; ++i) { bool = "false"; str[i].match(re) && (bool = "true"); document.writeln(str[i] + "\t => " + bool); } // --> </script> </pre>

…ブログで JavaScript のソースや実行結果を掲載するのは、正直ちょっと面倒。 そこで、メインサイトに『サンプル置場』を作った。興味があったらどうぞ。 サンプル置場(JavaScript): http://blue.zero.jp/foussin/cgi/sjis-src/trial-run/js/ パターンマッチを使ったサンプルを追加(2つ): reg-exp.html money-changing2.html  今回はここまで。

2012-04-05 Thu

【221】間に合わんかった…(jsネタ)

 昨日は 4月4日(水)。3月3日(雛祭)と5月5日(こどもの日)の間をとって『オカマ
の日』とか。すっかり忘れていたがゾロ目の日だ。ブログを投稿する日だった。

 実は、相変わらず JavaScript をいじっている。JavaScript を使ってローカル
アプリを作るのはキビシイ事が分かってしまったが、それでも  JavaScript には
利用価値がある。

 例えば、今まで『表計算』で雛形を作って、それに CSV データを流し込んで、
仕事用の文書を作ったりしていたが、こういう作業の大部分が JavaScript で代
用できるな、と。。。

 苦労してエクセル関数を使いこなすより、プログラミング言語 JavaScript を
使った方が、よりキメ細かい処理が自在に記述できる。

 そんな訳でさっきまで、自分の仕事で使えそうな JavaScript コードを書いて
いたんだけど、それを素のまま公開するのはちょっとマズイ。企業情報、個人情
報等が含まれているので…公開するなら、ちゃんと抽象化しないと。

 代わりに、簡単な何かを書いてお茶を濁すことにした。

 あと、JavaScript のトライアルな記事を書くなら、はてダよりはてなブログの
方が適している…と思ったんだけど、どうもうまくいかない。 何度も編集し直し
て試したんだけど、結局削除した。。。

 今回は…

			

金種計算のサンプル(JavaScript)

 複雑なことはまだ覚えてないので、 document.write() を羅列しているだけ…。  給料は、ほとんどの人が銀行振り込みだと思うので、金種計算なんて今さらな 気もするが、週払い・現金払いの前提で…。  で、メインサイトにサンプルページとして置いときました。↓ http://blue.zero.jp/foussin/cgi/src/example/js/money-changing3.html url で察しがつくと思うけど、文字コードsjis です。