‘Sample’カテゴリーの記事

表示・非表示スクリプト »

最近わりとちょくちょく使うので、コピペ用に。超シンプル。
(もっと複雑なことがしたかったら、Ajaxライブラリを使った方がいい)

※ サンプルは、表示・非表示がトグルになっている。

<script type="text/javascript">
// <![CDATA[
    function OpenClose() {
        tgl = document.getElementById('DivID').style.display;
        if (tgl == 'block') {
            document.getElementById('DivID').style.display = 'none';
        } else {
            document.getElementById('DivID').style.display = 'block';
        }
    }
// ]]>
</script>

Tail-Lagoon @ 18:25   |   PageUp

onSubmit »

久し振りに使った。すっかり忘れてた。おまけに昔書いたコードも見つからなくて手間取った。ので、備忘としてここに置いておく。特になんということもないスクリプトなんだけどね。

<script type="text/javascript" language="JavaScript">
// <![CDATA[
function FormCheck() {
    if (!document.getElementById("Assent").checked) {
        alert('「Assent がチェックされていません」');
        return false;
    } else {
        return confirm('「送信します、よろしいですか?」');
    }
}
// ]]>
</script>

<form id="Form1" action="" method="post" onsubmit="javascript:return FormCheck();">

onsubmit の中の return(強調部分)を忘れると、関数から false が返されても submit されてしまうので、注意。なんで submit されてしまうのかってことに気づくのに多少時間がかかった。すっかり忘れてたよ、まったく。

Tail-Lagoon @ 23:27   |   PageUp

書籍ISBNのチェックディジット計算と10桁⇔13桁変換 »

なんとなく、作ってみた。ただし、コード中のコメントにも書いたとおり、接頭記号 978 だけでなく、979 が増えてきたら、たぶん無効になるのだろう。
ただ変換するだけなら既に WEB 上にそういうサービスはいくつも見つかる筈なので、わざわざこんなもの作る必要はないのだけれど、ちょっと自分のページの中で(amazon へのリンクを作成するために、当面の間だけでも)使いたかったので、PHP で書いてみた。……まだきちんと検証はしていないので、間違いがないとはいえない。

checkdigit.php

<?php

// ISBN10 のチェックディジットの算出
function ChkDgt10($nine) {
    /* 計算方法
        (1) 10桁コードの各桁の桁数(d)と値(Vd)の積の合計を求める(ただし d > 1)。
            V10×10 + V9×9 + V8×8 + … + V2×2
        (2) チェックディジット = 11 −((1)の答を 11 で割った剰余) となる。
            ただし、求めた数字が 10 の場合は X とし、11 の場合は 0 とする。
    */

    // $nine : チェックディジットを除いた9桁の数字
    // $nine = trim(str_replace('-', '', $nine)); // この行は必要に応じて活殺
    if (strlen($nine) === 9) {
        $sum = 0;
        for ($i = 0; $i < 9; $i ++) {
            $dgt = 10 - $i; // 添字(オフセット)と桁数の関係
            $sum += (int)$nine[$i] * $dgt;
        }
        $ChkDgt = 11 - ($sum % 11);
        if ($ChkDgt === 10) $ChkDgt = 'X';
        if ($ChkDgt === 11) $ChkDgt = '0';
        return $ChkDgt;
    } else {
        return FALSE;
    }
}

// ISBN13 のチェックディジットの算出
function ChkDgt13($twelve) {
    /* 計算方法
        (1) (13桁コードの左から奇数桁の数字の合計×1)と(偶数桁の数字の合計×3)の合計を求める。
        (2) チェックディジット = 10 −((1)の答の下1桁の数字) となる。
            ただし、求めた数字が 0 または 10 の場合はチェックディジットを 0 とする。
            ※((1)の答の下1桁の数字)とは((1)の答を10で割った剰余)と同値。
    */

    // $twelve : チェックディジットを除いた12桁の数字
    // $twelve = trim(str_replace('-', '', $twelve)); // この行は必要に応じて活殺

    // 文字数が12桁であり、かつ左から3桁が 978 または 979
    if (strlen($twelve) === 12 && (substr($twelve, 0, 3) == '978' || substr($twelve, 0, 3) == '979')) {
        $odd_sum = $even_sum = 0;
        $odd_sum  = 9 + (int)$twelve[2] + (int)$twelve[4] + (int)$twelve[6] + (int)$twelve[8] + (int)$twelve[10];
        $even_sum = 7 + (int)$twelve[3] + (int)$twelve[5] + (int)$twelve[7] + (int)$twelve[9] + (int)$twelve[11];
        // ↑添字はオフセット 0 から始まるので、桁数-1 (奇数と偶数が逆転)となる
        $sum = $odd_sum + $even_sum * 3;
        $ChkDgt = 10 - ($sum % 10);
        if ($ChkDgt === 10) $ChkDgt = '0';
        return $ChkDgt;
    } else {
        return FALSE;
    }
}

// ISBN13 ⇒ ISBN10 に変換
function Isbn13210($ISBN13) {
    /* ※ 接頭記号が 979 の場合も、978 と同様の変換でOKなのかは未確認。
        というか、978 で不足した場合に 979 を用いるということらしいので、
        接頭記号取ったら重複する(区別できない)場合も出てくるということか?
        つまり、いずれ変換不可になるってことだろう。
    */

    $ISBN13 = trim(str_replace('-', '', $ISBN13)); // この操作で、もともとハイフンがない場合もデータ型は文字列になる?
    if (strlen($ISBN13) === 13) {
        $nine = substr($ISBN13, 3, 9);
        $ISBN10 = $nine . ChkDgt10($nine);
        return $ISBN10;
    } else {
        return FALSE;
    }
}

// ISBN10 ⇒ ISBN13 に変換
function Isbn10213($ISBN10) {
    /* ※ 強制的に接頭記号を 978 としている。たぶん、979 の ISBN10 は(上記のコメントにより)存在しない筈?
    */

    $ISBN10 = trim(str_replace('-', '', $ISBN10)); // この操作で、もともとハイフンがない場合もデータ型は文字列になる?
    if (strlen($ISBN10) === 10) {
        $twelve = '978' . substr($ISBN10, 0, 9);
        $ISBN13 = $twelve . ChkDgt13($twelve);
        return $ISBN13;
    } else {
        return FALSE;
    }
}

/*******************************************************/

$Chk = '';
$Str = '';

// 入力値を元に変換
if (isset($_GET['Chk']) && $_GET['Chk']) {
    $Chk = trim(str_replace('-', '', $_GET['Chk']));
    if (strlen($Chk) === 10) {
        $Str .= 'ISBN10 : ' . $Chk . '<br />';
        $Str .= 'ISBN13 : ' . Isbn10213($Chk) . '<br />';
    }
    elseif (strlen($Chk) === 13) {
        $Str .= 'ISBN10 : ' . Isbn13210($Chk) . '<br />';
        $Str .= 'ISBN13 : ' . $Chk . '<br />';
    }
}

?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="ja" lang="ja">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<meta http-equiv="Content-Style-Type" content="text/css" />
<meta http-equiv="Content-Script-Type" content="text/javascript" />
<title>ISBN 10 ⇔ 13 変換</title>

</head>
<body>
<h1>ISBN 10 ⇔ 13 変換</h1>

<form action="" method="GET">
    <input type="text" id="Chk" name="Chk" value="<?php echo $Chk; ?>" />
    <input type="submit" value="変換" />
</form>

<p><?php echo $Str; ?></p>

</body>
</html>

Tail-Lagoon @ 13:07   |   PageUp

WordPressのある特定の投稿に、固有のCSSを適用したい »

WordPress

(カスタムフィールドの利用)

 WordPressで記事を書いていて、その記事投稿の一部分にのみ独自のCSSを適用したい、という要求がしばしば発生する。その場合の対処は、

  1. 独自のidもしくはclassを割当て、style.css等の共用CSSファイルにその部分を記述する。
  2. 適用したいタグの中に直接 style="…" とアトリビュートとして記述する。
  3. 投稿部分に <style> タグを記述する。
  4. JavaScript を用いるなどして、強引にスタイルを変更する。
  5. WordPressのカスタムフィールド欄にCSS文を記述し、テンプレートファイルでカスタムフィールドを <head> 内の任意の場所に出力できるように修正する。

 といった方法が考えられる。しかし……

続きを読む… »

Tail-Lagoon @ 17:56   |   PageUp

素因数分解 »

 特に利用目的はないけれど、任意の数字を因数分解する、ちょっとしたお遊びプログラム。

 数学の世界では、素数の数列を記述する有効な方程式はまだ発見されていない。だから大きな桁の素数を掛け合わせた場合、その結果だけを用いて再び素因数分解するのは、たとえコンピュータといえど膨大な計算時間を必要とする。現在の暗号化技術はこれを利用しているので、もし万が一、素数列を記述する方程式が発見され、悪用されたら、世界中に大激震が走ることになる。

 まあ、そんな大それた話は別としても、7桁や8桁の数字でも、手計算では結構大変だ。たとえば、次の5つの数字が約数を持つかどうか、手計算で(電卓くらい使ってもいいけど)調べてみてください。

  100000007、100000037、100639681、100639699、100639703

 実はこれらはどれも素数である(はずだ。……間違ってたら教えてください)。

 あるいはこんなのはどうか? 1010101 とか 101010101 といった数字。
 これはちゃんと因数分解できるけど、やっぱり手計算だと面倒くさい。結果は以下のとおり。

  1010101 = 73 x 101 x 137
  101010101 = 41 x 271 x 9091

 こんな約数になるなんて、まったく予測できないでしょう? 他にも、ぼくが面白いと思った素因数分解を、以下にあげておく。

  11111 = 41 x 271
  10101 = 3 x 7 x 13 x 37
  111111 = 11 x 10101 = 3 x 7 x 11 x 13 x 37
  1111111 = 239 x 4649
  11111111 = 11 x 1010101 = 11 x 73 x 101 x 137
  111111111 = 3 x 3 x 37 x 333667
  1111111111 = 11 x 101010101 = 11 x 41 x 271 x 9091
  1234567 = 127 x 9721
  123456789 = 3 x 3 x 3607 x 3803
  987654321 = 3 x 3 x 17 x 17 x 379721
  100000001 = 17 x 5882353
  1000000001 = 7 x 11 x 13 x 19 x 52579

 なんだか不思議な感じがしませんか?

続きを読む… »

Tail-Lagoon @ 13:56   |   PageUp

文字整形 »

 日本語を含む文字列で、全角英数字やアルファベット大文字を半角小文字に変換および半角カナを全角カナに変換する関数。検索キーワードを統一したい場合などに有効。(検索文字列および対象文字列の双方を変換してマッチさせる。ただし、表示する文字は変換前のものをそのまま使用したい場合は、データを二重化し、変換前と後をそれぞれ用意する必要あり)

<?php
function ABC2abc($Word) { // 文字列のうち英数文字を半角・小文字に統一
    $Word = mb_strtolower($Word, 'UTF-8');
    $Word = mb_convert_kana($Word, 'KVa', 'UTF-8');
    // option  K:半カナ→全カナ  V:濁点文字を一文字  a:全英数→半英数
    $Word = mb_strtolower($Word);
    return $Word;
}
?>

 例 : Japan2008, JAPAN2008 などの文字列を一律 japan2008 に変換

補足

 mb_convert_kana について、上記のように文字コードを指定するか、あるいはPHPスクリプトの内部エンコーディングを最初から指定しておく(下記例)かしないと、うまく機能しない場合がある。

<?php
mb_internal_encoding("UTF-8");
?>

Tail-Lagoon @ 15:31   |   PageUp

htaccess による PHP の設定 »

.htaccess ファイルを用いて、Webサーバ(Apach)における PHP その他の動作設定を変更することはよくあるが、大概サイト構築時の初期の段階において行い、あとは殆ど顧みることがないため、そのうちすっかり忘れてしまうものだ。そして毎回新しいサイトを作るたび、何だったっけ? と探し回るはめになるので、下記に記録。

デフォルトで表示されるページのファイル名を変更したい

DirectoryIndex sample.php index.php index.html
(先に記述したものほど表示の優先順位が上になる)

拡張子 .html のままで PHP を走らせたい

AddType application/x-httpd-php .html .htm

セキュリティ上、下記項目は必ず phpinfo() で値をチェックし、違っていたら下記値で設定すること(必須)

php_flag register_globals Off
php_flag track_vars On
php_flag display_errors Off

  • register_globals オプションを無効にするのは、EGPCS(Environment, GET, POST, Cookie, Server)変数のグローバル変数登録を不可にするため。
  • その代わりに track_vars オプションを有効にして、上記変数をグローバル連想配列 $_ENV, $_GET, $_POST, $_COOKIE, $_SERVER として参照可にする。
  • display_errors はエラー表示するかしないかの設定。テスト環境では有効にしておいた方が開発しやすいのだが、本番(公開)環境では、エラー表示により重要なパスや変数名が表示されてしまうのを防ぐために無効化する。
  • ついでに書いておくと、チェックで使用した phpinfo() のファイルは、必ず削除しておくこと!

※ PHP の httpd オプションについては下記サイトに詳しい。
http://jamesthornton.com/php/japanese/configuration.directives.html

***

↓以下は、PHP じゃないけど、htaccess 関連としてついでに書いておくと

拡張子 .html のままで SSI を使いたい

Options +Includes
AddType text/x-server-parsed-html .shtml .html .htm

(Options は SSI 実行可能領域を設定するのだが、もともと実行可なら必要なし)

※ httpd の設定に関する参考サイト
http://www.tagindex.com/other/htaccess.html

Tail-Lagoon @ 16:03   |   PageUp

パスの取得 »

<?php
/*** Current URL ***/
$Path = pathinfo($_SERVER["PHP_SELF"]);
$DirName = $Path["dirname"];
$DirNameSlash = $DirName . '/';
$FileName = $Path["basename"];
?>

 わりとよく使うくせに、覚えていられない。いつも使う時になって、以前のファイルを探し回るはめになるので、ここに書いておく。

Tail-Lagoon @ 16:17   |   PageUp

ブログの更新情報をRSSから取り出す »

 ある複数のブログの更新状態をブログとは別の HTML ページでまとめて表示したい(例えば、ある企業のブログの更新状況を、その企業のサイトのトップページに自動で表示したいといった場合)。欲しいのは、エントリーのタイトルと日付とサマリー。

 というようなとき、最も手っ取り早いのは、ブログが吐き出す RSS を利用することだろう。でも XML を扱うのってちょっと面倒くさい。パースだのハンドラーだの、なんじゃそれは? いやちょっと待ってくれ、欲しい情報はほんのわずかなんだ。最新のエントリーひとつ分の上記の内容だけ。

 だったら、単純に文字列として取り込んで、必要なものだけ抜き出した方が早くないか? 使用する RSS のタイプも最初から決めてしまえば、RSS のバージョンに振り回される必要もない。別に汎用のリーダを作ろうってわけじゃないんだから。

 というわけで、文字コード UTF-8、データ形式は Atom、日付は降順になっていることを前提に、やってみた。以下がそのコード。

続きを読む… »

Tail-Lagoon @ 19:51   |   PageUp

Safari CSS Hack »

通常のCSS Link
<link href="ordinary.css" rel="stylesheet" type="text/css" media="screen‚print" />

Safari 専用のCSS Link
<link href="safari.css" type="text/css" media="screen‚print" />

このように rel 属性を除くことで、Safari にしか読み込めなくなる。

Tail-Lagoon @ 18:20   |   PageUp