October 2007 Archives

『下流社会 新たな階層集団の出現 』を読んだ。
つまらなかった。

下流社会 新たな階層集団の出現
三浦 展
光文社 (2005/09/20)
売り上げランキング: 2562

『年収崩壊』を読んだ。
非正社員労働者の平均年収は120万円とか、そんなものらしい。
大変だと思う。

年収崩壊―格差時代に生き残るための「お金サバイバル術」
森永 卓郎
角川・エス・エス・コミュニケーションズ (2007/10)
売り上げランキング: 2574

久しぶりにお金のことをまじめに考えたのだけれど、
やはり中長期的に見ると自分のポートフォリオは不安がいっぱいだよな。
年収は年収として、仮にそれが長期的に上がらないものであるとしても
安心して暮らせるような資産の持ち方をしないといけないですね。

あと、年金の「マクロ経済スライド」について理解した。
そんなの、下方修正しかないと思うのですが。

パーマリンク

| | Comments (0) | TrackBacks (0)

パーマリンクはパーマネントであることが期待されているわけで、
いきなりリンク切れになっていたりするとビビる。

友だち以上、恋人未満

| | Comments (0) | TrackBacks (0)

プログラマは条件分岐節の範囲指定に敏感なので、
「あなたは友だち以上、恋人未満なの」
と言われて、自分はどの範囲にいるのか真剣に考えてしまうわけである。

"友だち以上、恋人未満" というと、友だちも範囲内に含まれるので、
「あなたは友だちにしか見えないの」というならば、
「あなたは友だち以上、恋人未満なの」と言い換えても問題ない。
後者の方が相手に無意味に期待を持たせることができるしね。

Yahoo! Japanの新しいトップページを利用できるようになったわけだけど、
どう考えても横幅広すぎだろう。

ちょっとページ下のアンケートで文句言ってくる。

Yahoo!ポイントを現金化できるようになって久しいけれど、
誰かが現金化したという話をついぞ聞いたことはない。
どう考えても、100ポイント -> 85円のレートはおかしい。

Yahoo!様の仮想通過には15%の税金がかかる、と読み替えてもよい。
高い税金ですよ。

テキストボックスに文字列を入れて、submitするとパーマリンクができるという。
こんな感じですたい。

面白そうではあるけど、どう使うと面白いのかわからない。

四六時中ブログを書く

| | Comments (0) | TrackBacks (0)

最近、「ブログさぼってるよね」とか言われるのですが、書き分けているのです。

  • blog: これ。
  • minilog: ↑より短いブログ。twitter以上blog未満。
  • techlog: 技術に偏ったブログ。みんなそんなの読みたくないだろうと思って分離した。

がんばっています。

ドラえもんは大泣きしたから... - いや、そのりくつはおかしい - はてなセリフ

とか。

その顔でネコにモテたいなん... - いや、そのりくつはおかしい - はてなセリフ

とか。

田中さんとこまたマグロです... - ネコ2匹 - はてなセリフ

とか。

はてなセリフはたまに見ると面白いけど、
常時ウォッチしていてもそんなに面白いものではない。

はまった...
Citiカードからのメールが、GMailだとデフォルトで迷惑メールになるらしくて、
ギフト券のIDが記述されたメールをロストしてしまった。

GMailで迷惑メールフォルダに入ったメールが30日ごとに
自動的に消去される設定はどうにかならないものか。
ならないんだろうなぁ。

NTTの固定電話を解約した

| | Comments (0) | TrackBacks (0)

NTTの固定電話の解約申請をした。
携帯電話で満足しているし、もし誰かと長話をしたいのならSkypeを使えばよい。

解約申請はNTTのページから行える。

何か翻訳作業を放棄したような文章だ。
ITProより

入社から10カ月ほどで、こんなに大きな動きになるなんて、まさにドリームズカムトゥルーです。

まさにドリカムですよ。

やばい

| | Comments (0) | TrackBacks (0)
自分のレベルの低さを感じる瞬間がある。
たくさんある。

前回のエントリでmultipartのバウンダリ文字列を抜き取る処理を記述したけれど、
multipartを分解したいだけなら、Mail/mimeDecode.php の基本処理で事足りたようである...

<?php 
require_once('Mail/mimeDecode.php');

$_params['include_bodies'] = true;
$_params['decode_bodies'] = true;
$_params['decode_headers'] = true;
$_params['input'] = file_get_contents('php://stdin');
$_structure = Mail_mimeDecode::decode($_params);

foreach ($_structure->parts as $_part) {
    //$_part->body;
}

?>

この例では、foreachの中の

$_part->body;
で分解された個々のbodyを取得できる。
本来、multipartかどうかの処理や、その他の細かい処理が必要になるが、そこら辺はPHPプロ!の記事を参照されたい。

!!!!!multipartを分解するだけの処理を知りたい場合は、こちらを参照されたい。!!!!!

multipartのバウンダリ文字列がヘッダで渡ることを知らなくて、少しだけはまった。

本エントリでは、qmailが動いているサーバでメールを受信し、
/tmp/mail_sample.txtにバウンダリ文字列を出力するまでの過程を記述する。

qmailでは、$HOME/.qmailでメール本文を受けたときに起動するスクリプトを記述できる。
私の環境では、.qmailは次のようになっている。

$ cat ~/.qmail
| /usr/bin/php /tmp/sample_script.php

この例では、メールを受信したタイミングで/tmp/sample_script.php が起動する。

さて、/tmp/sample_script.php は次のようになっている。
(PEAR のMail_Mimeがインストールされていることを前提としている)

<?php
require_once('Mail/mimeDecode.php');

$_in = fopen("php://stdin", "r");
$_mail_text = '';
while($_line = fgets($_in)) {
    $_mail_text .= $_line;
}

$_decoder = & new Mail_mimeDecode( $_mail_text );
$_parts =$_decoder->getSendArray();
list( $_recipients, $_headers, $_body ) = $_parts;

$_ret = preg_match("/boundary=\"([0-9a-zA-Z_\-\+\=\.\:]+)\"/", $_headers['Content-Type'], $_matches);
if($_ret) {
    $_fp = fopen("/tmp/mail_sample.txt", "w");
    fwrite($_fp, $_matches[1]);
    fclose($_fp);
}
?>

ただ単純に、ヘッダからContent-Typeの列を取り出して、正規表現で抜き出すだけ。
本来なら、multipart/mixed かどうかも見るべきかと思うけれど、
multipart/mixed でない限りは"boundary"という文字列は存在しないはずなので、これでよしとしている。

なお、multipart/mixed の場合は、次のような感じの文字列を受け取れる。

multipart/mixed; boundary="-----=_NextPart_46196_50244_54292"

この場合、上記のスクリプトでは、

-----=_NextPart_46196_50244_54292

を取得できる。

コンパイラ - 構文解析 -

| | Comments (0) | TrackBacks (0)

身内の勉強会で話す(話した)内容を公開します。

前提知識

- CFG

文脈自由文法(ぶんみゃくじゆうぶんぽう、Context-free Grammar、CFG)とは、言語学や情報工学において全生成規則が以下の形式である形式文法のひとつである。 V → w ここで V は非終端記号であり、w は終端文字と非終端記号から構成される文字列である。「文脈自由」という用語は前後関係に依存せずに非終端記号 V を w に置換できることを意味している。文脈自由文法によって生成される形式言語を文脈自由言語という。(Wikipediaより)

- 記号表

名前とそれに関する型、スコープ、値(名前が定数のとき)などの情報をまとめたものを記号表という。コンパイラの中では、名前は記号表のエントリ(へのポインタ)で代表させるのがふつうである。コンパイラの解析部では記号表に名前の情報を集め、合成部では記号表を利用して目的コードを生成する。(『プログラミング言語処理系』より)

slideshareで使用したソースコードのアーカイブ(.tgz)はこちら

なお、本スライドで使用しているflexとbisonのバージョンは次の通りである。

$ flex --version
flex version 2.5.4

$ bison --version
bison (GNU Bison) 2.1
Written by Robert Corbett and Richard Stallman.

Copyright (C) 2005 Free Software Foundation, Inc.
This is free software; see the source for copying conditions.  There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
[参考訳 -- 法的効力は英文が適用されます]
これはフリーソフトウェアです -- 複製についての条件はソースを見ましょう。
一切の保証はありません -- 商業性や目的適合性についての保証すらありません。

カスピ海ヨーグルトを安価に食べ続けるために、
我々はカスピ海ヨーグルトを増やし続けるのである。


まずは何者をも恐れない強い心を持って、
カスピ海ヨーグルトと牛乳と、空のヨーグルトパックを用意する。


CA390054.JPG


次に、二度と同じ過ちを繰り返さないと誓ったあの日の思い出と共に、
空のヨーグルトパックに、カスピ海ヨーグルトと牛乳を 2:8 の割合で投入する。


CA390055.JPG


いつまでも忘れられない夢に向かって、日中ひたすら仕事に打ち込む。
その間、↑でカスピ海ヨーグルトと牛乳を混ぜたものは常温(室温)で8-10時間くらい寝かせる。


CA390056.JPG


どこからどう見てもヨーグルトです。
本当にありがとうございました。

現在の勤務先にはデザイナ部隊がいなくて、
デザインが必要な場合は外部のデザイン企業に仕事を投げている。
おつきあいしているデザイン企業のスキルレベルは結構高くて、
いつも満足いく仕事をしてくれる。


ただし、あくまで実働部隊が"外部"にあるわけで、
簡単な修正作業であっても"仕事依頼"をしなければならなくて、それが結構面倒くさかったりする。
数pixel削ったり、文字列を含む画像の文字列を変更したり。
Photoshopファイル(.psd)をもらって、こちらでそういう細かい修正すればいいかと思ったけど、
(当然といえば当然...)商用のフォントを使用していたりして、
結局一揃いデザイン用のアイテムを揃える必要があることに気づいた。


どうしたものか。

勤務先の社長に教えてもらったのだけど、
DELLのキーボードの「カタカナ」キーは「カ夕カナ」と刻印されているっぽい。


CA390053.JPG


外人さんがよくわからないでフォント見ながら「カタカナ」っぽい輪郭の文字を探し出して、
刻印しまくってる内にヒッコミがつかなくなったんじゃないかと予想してニヤニヤしてみた。

PEARのLogパッケージを使用して、Firebugにログを出力する方法を次に示す。
元ネタは「cl.pocari.org - PEAR Log を使って Firebug にログを出力する」。

まず、Logパッケージをインストールする。

# pear install Log
WARNING: "pear/DB" is deprecated in favor of "pear/MDB2"
Did not download optional dependencies: pear/DB, pear/MDB2, use --alldeps to download automatically
pear/Log can optionally use package "pear/DB" (version >= 1.3)
pear/Log can optionally use package "pear/MDB2" (version >= 2.0.0RC1)
pear/Log can optionally use PHP extension "sqlite"
downloading Log-1.9.11.tgz ...
Starting to download Log-1.9.11.tgz (38,479 bytes)
..........done: 38,479 bytes
install ok: channel://pear.php.net/Log-1.9.11

あとはLogクラスのインスタンスを生成し、logメソッドを呼ぶだけ。
具体的なコードは次の通り。

<?php
require_once 'Log.php';

$log = &Log::singleton('firebug', '', 'PHP', array('buffering' => true), PEAR_LOG_DEBUG);

$log->log('デバッグレベル', PEAR_LOG_DEBUG);
$log->log('情報レベル', PEAR_LOG_INFO);$log->log('警告レベル', PEAR_LOG_WARNING);
$log->log('エラーレベル', PEAR_LOG_ERR);
$log->log('レベル??');
?>

これで、次のようにFirebugのエラーコンソールにメッセージが出力される。

php_firebug.png

Enjoy!

Yahoo! UI Library: YAHOO Global Object

| | Comments (0) | TrackBacks (0)

このエントリはhttp://developer.yahoo.com/yui/yahoo/を元に、日本語に翻訳したものです。



YAHOO Global Object には唯一のグローバル名前空間があり、そこに全てのYUIライブラリのコードが存在します。 YAHOO Global Object はYUIライブラリを使用する全てのページでインクルードされる必要があり、 またどのYUIコンポーネントよりも先に現れなければなりません。 YAHOO Global Object はライブラリ全体で使用可能な多くのメソッドが存在します。



はじめに

YAHOO Global Object は次のようにしてインクルードします。
<!-- YAHOO Global Object ソースファイル --> 
<script type="text/javascript" src="http://yui.yahooapis.com/2.3.1/build/yahoo/yahoo-min.js"></script>
<!-- 追加のソースファイルはここに記述する -->



YAHOO.namespace

YAHOO Object は自動的にYAHOO.utilYAHOO.widgetYAHOO.exampleなどの名前空間を自動的に生成します。 これらの名前空間はYUIライブラリの内部スクリプトのために予約されています。 カスタムアプリケーション(=ユーザが作成するアプリケーション)のために追加の名前空間を作成できます。
// "myproduct1"のための名前空間を作成する
YAHOO.namespace ("myproduct1");
YAHOO.myproduct1.Class1 = function(info) {
    alert(info);
};

// "mysubproject1"のための名前空間"myproduct2"を作成する
YAHOO.namespace ("myproduct2.mysubproject1");
YAHOO.myproduct2.mysubproject1.Class1 = function(info) {
    alert(info);
};



YAHOO.lang

YAHOO.lang にはJavaScriptのユーティリティやYUIライブラリで使用するための拡張機能が含まれています。
// true、arrayリテラルは配列です
YAHOO.lang.isArray([1, 2]);

// false、objectリテラルは配列ではありません
YAHOO.lang.isArray({"one": "two"});

// しかし、 配列として宣言された場合にはtrue になります
function() {
    var a = new Array();
    a["one"] = "two";
    return YAHOO.lang.isArray(a);
}();

// false、エレメントの集合は配列のようですが、違います
YAHOO.lang.isArray(document.getElementsByTagName("body"));

// true、falseは論理型です
YAHOO.lang.isBoolean(false);

// false、1や"true"という文字列は論理型ではありません
YAHOO.lang.isBoolean(1);
YAHOO.lang.isBoolean("true");

// nullはnullですが、undefinedや""(空文字列)はnullではありません
YAHOO.lang.isNull(null); // true
YAHOO.lang.isNull(undefined); // false
YAHOO.lang.isNull(""); // false

// functionはfunctionですが、オブジェクトはfunctionではありません
YAHOO.lang.isFunction(function(){}); // true
YAHOO.lang.isFunction({foo: "bar"}); // false

// true、整数や少数は数です
YAHOO.lang.isNumber(0);
YAHOO.lang.isNumber(123.123);

// false, strings that can be cast to numbers aren't really numbers
// false、数にキャストできる文字列は、実際には文字列ではありません
YAHOO.lang.isNumber("123.123");

// false、未定義の値や無限大の値は数ではありません
YAHOO.lang.isNumber(1/0);

// true、オブジェクト、関数、配列はオブジェクトです
YAHOO.lang.isObject({});
YAHOO.lang.isObject(function(){});
YAHOO.lang.isObject([1,2]);

// false、プリミティブな値はオブジェクトではありません
YAHOO.lang.isObject(1);
YAHOO.lang.isObject(true);
YAHOO.lang.isObject("{}");

// 文字列
YAHOO.lang.isString("{}"); // true
YAHOO.lang.isString({foo: "bar"}); // false
YAHOO.lang.isString(123); // false
YAHOO.lang.isString(true); // false
 
// undefinedはundefinedですが、nullとfalseはundefinedではありません
YAHOO.lang.isUndefined(undefined); // true
YAHOO.lang.isUndefined(false); // false
YAHOO.lang.isUndefined(null); // false



YAHOO.lang.hasOwnProperty

YAHOO.lang.hasOwnPropertyはハッシュテーブルをイテレートする際に、オブジェクトのプロトタイプに追加されたプロパティを無視するために使用します。これは元々Aグレードのブラウザをサポートするものでしたが、つい最近までSafariはサポートされませんでした。(all internal usage of the hasOwnProperty test within YUI will use the version in YAHOO.lang for the forseeable future, and we recommend that you do the same in your own implementations.)。YAHOO.lang.hasOwnPropertyは可能な限りブラウザのネイティブな関数を使用します。 (訳者注:ブラウザをグレード分けし、優先的にサポートするブラウザとそれ以外を分けることがあります。詳しくはYahoo!のドキュメントを参照してください。)
// これが保護するものです
Object.prototype.myCustomFunction = function(x) {
    alert(x);
}

var o = {};
o["foo"] = "bar";
o["marco"] = "polo";

// これが保護する必要がある部分です
for (var i in o) {
    if (YAHOO.lang.hasOwnProperty(o, i)) {
        alert("good key: " + i);
    } else {
        alert("bad key: " + i);
    }
}



YAHOO.lang.extend

YAHOO.lang.extend は他のオブジェクトを継承したオブジェクトのプロトタイプ、コンストラクタ、スーパークラスのプロパティを設定する仕組みを提供します。また、継承先オブジェクトでコンストラクタが二度実行されるないようにします。YAHOO.lang.extend はバージョン2.3.1ではYAHOO.langパッケージに再配置されました。YAHOO.extendYAHOO.lang.extend のエイリアスですが推奨されていません。
YAHOO.namespace("test");

YAHOO.test.Class1 = function(info) {
    alert("Class1: " + info);
};

YAHOO.test.Class1.prototype.testMethod = function(info) {
    alert("Class1: " + info);
};

YAHOO.test.Class2 = function(info) {
    // コンストラクタを繋げる
    YAHOO.test.Class2.superclass.constructor.call(this, info);
    alert("Class2: " + info);
};

// Class2がClass1を継承する。これはClass2のコンストラクタの直後に実行される必要がある
YAHOO.lang.extend(YAHOO.test.Class2, YAHOO.test.Class1);

YAHOO.test.Class2.prototype.testMethod = function(info) {
    // 関数を繋げる
    YAHOO.test.Class2.superclass.testMethod.call(this, info);
    alert("Class2: " + info);
};

var class2Instance = new YAHOO.test.Class2("constructor executed");
class2Instance.testMethod("testMethod invoked");



YAHOO.lang.augment

YAHOO.lang.augment はプロトタイプのプロパティを複数のオブジェクトに適用することで、コードを再利用する手段を提供します。YAHOO.augmentYAHOO.lang.augment のエイリアスですが、推奨されません。
<!-- debugger output for environments without "console" -->
<!-- コンソールがない環境ではここにデバッガの出力が与えられます -->
<div id="consoleelement"> </div>

<script>
////////////////////////////////////////////////////////////////////////////
// ConsoleProvilderの例はコンソールがある場合はコンソールにログを出力します
// コンソールがない場合は"consoleelement"にログを出力します
////////////////////////////////////////////////////////////////////////////
YAHOO.example.ConsoleProvider = function() { };
YAHOO.example.ConsoleProvider.prototype = {
    log: function(msg) {
        // use the error console if available (FF+FireBug or Safari)
        if (typeof console != "undefined") {
            console.log(msg);
        // write the msg to a well-known div element
        } else {
            var el = document.getElementById("consoleelement");
            if (el) {
                el.innerHTML += "<p>" + msg + "</p>";
            }
        }
    }
};

////////////////////////////////////////////////////////////////////////////
// デバッグメッセージを出力するクラスを定義します
////////////////////////////////////////////////////////////////////////////
YAHOO.example.ClassWithLogging = function() { };
YAHOO.lang.augment(YAHOO.example.ClassWithLogging, YAHOO.example.ConsoleProvider);

////////////////////////////////////////////////////////////////////////////
// テスト
////////////////////////////////////////////////////////////////////////////
var c = new YAHOO.example.ClassWithLogging();
c.log("worked");

</script>



YAHOO.log

YAHOO.log はYAHOO Global Object に含まれており、(YUI Logger Controlがページ中に存在せずとも)YUIのコード中のどこでもログ出力を行うことが可能です。このため、デバッグ情報を除去する前にエラーが出現することを抑止できます。YAHOO.log はLogger Controlを使用できる環境ではYAHOO.widget.Logger.log を実行しますが、そうでない場合は何もしません。 使用方法についてはLogger Controlのドキュメントを参照してください。
YAHOO.namespace("test");

YAHOO.test.Class1 = function(info) {
    YAHOO.log("Class1: " + info, "error", "Class1");
};



YAHOO_config and YAHOO.env

YAHOO.env はブラウズ環境、特にページ表示のためにロードしたYUIコンポーネントの情報を保持します。 この情報はYAHOO.env.getVersion を介してどのコンポーネントからも取得可能で、特にライブラリがダイナミックにロードされる環境で有用です。 YAHOOやその他のYUIライブラリがロードされているか確認するために、ポーリングする代わりにYAHOO_configコールバック関数を定義することができます。
<html>
<head>
<script type="text/javascript">

// モジュールがロードされる度にコールバックされます
function mycallback(info) {
 
    alert(info.name + " loaded");

    // loggerがページでロードされると動作します
    if (info.name == "logger") {
        YAHOO.widget.Logger.enableBrowserConsole() 
        var l = new YAHOO.widget.LogWriter("(");

        YAHOO.example.EnvTest = function() {
            function log(msg,cat) {
                var c=c||"info";
                YAHOO.log(msg,c,"LangTest");
            }

            return { 
                init: function() {
                    new YAHOO.widget.LogReader("logoutput");
                    log("init");
                },
                
                showInfo: function(e, module){
                    // YAHOO.env.getVersion はYAHOO_config.listener が受け取るデータと同じデータを返します
                    var info = YAHOO.env.getVersion(module);

                    log("name: " + info.name);
                    log("version: " + info.version);
                    log("build: " + info.build);
                    log("versions: " + info.versions);
                    log("builds: " + info.builds);
                    log("mainClass version: " + info.mainClass.VERSION);
                }
            };
        } ();

        YAHOO.util.Event.addListener(window, "load", YAHOO.example.EnvTest.init);
        YAHOO.util.Event.addListener("showeventbutton", "click", YAHOO.example.EnvTest.showInfo, "event");
    }
}

YAHOO_config = {
    listener: mycallback
};

</script>
<script src = "../src/js/YAHOO.js" ></script>
<script src = "../../build/event/event.js" ></script>
<script src = "../../build/dom/dom.js" ></script>
<script src = "../../build/dragdrop/dragdrop.js" ></script>
<script src = "../../build/logger/logger.js" ></script>
<link rel="stylesheet" type="text/css" href="../../build/logger/assets/logger.css">
<style> #logoutput {float: right}</style>
</head>
<body>
<input type="button" id="showeventbutton" value="show event version" />
<div id="logoutput"></div>
</body>
</html>

YUI Module NamesYUI on Mobile: Using YAHOO Global Object with "A-Grade" Mobile Browsersは割愛します。

Macを操作する(フォーカスの切り替え、マウスのクリックなど)度に何かMacが英語で話しかけてきて、
何かと思ったらVoiceOverをOnにしていたようだ。
VoiceOverなんてユーティリティを知らなかったので、かなりビビった。


コマンドキーとF5を一緒に押すと、VoiceOverが起動するので、すぐにMac OS X Tigerコンピュータを使用できます。VoiceOverの操作に慣れていなくても、開始方法が音声で指示され、VoiceOver QuickStartが開きます。このVoiceOver QuickStartを使って、アップルのキーボードのキーの名前と場所を把握し、VoiceOverを使った操作を学習できます。


ということで、「コマンドキー + F5」でVoiceOverを起動できるので、マカーな人はお試しあれ。
ビビること請け合いである。

芋煮会@二子玉川

| | Comments (0) | TrackBacks (0)

昨日は二子玉川の辺りで芋煮会をしてきた。
同郷の先輩に誘われたのだけれど、「芋煮会は東北の文化なんだよ」とのこと。
知らなかった。


河原は時間がゆったり流れる説。


CA390039.JPG


先輩が下地に具を入れようとしているところ。


CA390043.JPG


できあがり。
仙台の芋煮は「味噌ベース + 豚肉」なのがポイントらしい。
確かに、岩手の芋煮を食べたら、「醤油ベース + 牛肉」で、違和感があった。
それでもおいしかったけど。


CA390049.JPG


なぜか仙台の鍋をお守りすることになった。


CA390050.JPG


とても楽しかった。
とてもおいしかった。
そして、そのまま夜の飲み会には遅刻した。

東京マラソンに落選した。


マハタ ヤスノリ様
受付番号:xxxxxxx


このたびは東京マラソンにご応募いただき誠にありがとうございました。
お陰様をもちまして定員を大幅に上回る申込があり厳正なる抽選を行いました
ところ、誠に残念ながら今回はご意向に沿えない結果となりました。
今後、参加料の未入金者が多かった場合には、追加当選者を出すことがございます。
その場合、11月中旬頃に再度『東京マラソン追加当選のお知らせ』にて通知させて
いただく予定です。


ちょw「参加料の未入金者が多かった場合」www
そんなケースを想定しているのか。
やるな東京マラソン。


光の速さで青梅マラソンに鞍替えした。

MT3系(たぶん4系でもそのまま使える)のダイナミックパブリッシング用の条件タグの実装方法を次にメモする。
まず、下記のテンプレートは『MovableType上級カスタマイズ術』からの引用である。

<?php
function smarty_block_条件タグ($args, $content, &$ctx, &$repeat) {
    if( $issset($content) ) {
        // 条件判断処理
        return $ctx->_hdlr_if($args, $content, $ctx, $repeat, $retcode);
    } else {
        return $ctx->_hdlr_if($args, $content, $ctx, $repeat);
    }
}
?>

これだと$argsにMTの変数を渡せないけど、どうすればいいのかわからない。

ドラフト会議

| | Comments (3) | TrackBacks (0)

仙台育英の佐藤くんは、抽選の結果ヤクルトが交渉権を握った。
地元民として楽天を贔屓にしているので、ちょっと残念。


毎年思うのだけど、高校球児がプロ野球選手になるというのは、すなわち高校生が球団に「就職」することと同義なわけである。
就職先くらい本人に選ばせてあげればいいのに。
就職先をしくじることで大損するなんてのはよくあること。
就職先を自分で選べれば自己責任として納得できるかもしれないけど、ドラフトの場合はどうなんだろう。


球団間の格差の問題が... というのも尤もな話だけど、それは高校生と大学生と社会人の間に差異があることの説明にはならない。

last.fm から自分の再生履歴を配列として取得するphpスクリプトのサンプルを以下に示す。


<?php

// --
// VERSION CHECK
// --
if( version_compare(phpversion(), '5.0', '<') ) {
    echo "本スクリプトはPHPのVersion5.0以降でのみ動作します\n";
    exit;
}

// --
// LOAD XML
// --
$_lastfmName = 'mahata';
$_targetUrl = "http://ws.audioscrobbler.com/1.0/user/{$_lastfmName}/recenttracks.xml";
$_xmlObj = simplexml_load_file($_targetUrl);

// --
// MAKE ARRAY
// --
$_playList = array();
foreach( $_xmlObj as $_xmlObj_ ) {
    $_tArray = array();
    $_tArray['artist']  = (string)$_xmlObj_->artist;
    $_tArray['name']    = (string)$_xmlObj_->name;
    $_tArray['album']   = (string)$_xmlObj_->album;
    $_tArray['date']    = date('Y/m/d H:i:s', (int)strtotime($_xmlObj_->date));

    $_playList[] = $_tArray;
}

// --
// DUMP ARRAY
// --
print_r( $_playList );

?>


ここで、$_lastfmNameに任意のIDを設定すればよい。
実行結果は次のようになる。


$ php playlist2array.php
Array
(
    [0] => Array
        (
            [artist] => Surface
            [name] => クセになりそうだ
            [album] => resurface
            [date] => 2007/10/03 14:42:00
        )

    [1] => Array
        (
            [artist] => Surface
            [name] => ハニカムハニ
            [album] => resurface
            [date] => 2007/10/03 14:37:00
        )

    [2] => Array
        (
            [artist] => Surface
            [name] => WAIT!
            [album] => resurface
            [date] => 2007/10/03 14:34:00
        )

    [3] => Array
        (
            [artist] => Surface
            [name] => Re:START
            [album] => Re:START
            [date] => 2007/10/03 14:30:00
        )

    [4] => Array
        (
            [artist] => Surface
            [name] => ちりつもたれつ
            [album] => resurface
            [date] => 2007/10/03 14:26:00
        )

    [5] => Array
        (
            [artist] => Surface
            [name] => ワクチン
            [album] =>
            [date] => 2007/10/03 14:20:00
        )

    [6] => Array
        (
            [artist] => Surface
            [name] => 夢の続きへ
            [album] =>
            [date] => 2007/10/03 14:15:00
        )

    [7] => Array
        (
            [artist] => LINDBERG
            [name] => Brand New Day
            [album] => XII
            [date] => 2007/10/03 14:09:00
        )

    [8] => Array
        (
            [artist] => LINDBERG
            [name] => アタシは磨けば光るダイアモンドなのに
            [album] => XII
            [date] => 2007/10/03 14:05:00
        )

    [9] => Array
        (
            [artist] => LINDBERG
            [name] => 自転車に初めて乗れた日
            [album] => XII
            [date] => 2007/10/03 13:59:00
        )

)
google-code-prettifyでソースコードをシンタックスハイライトする方法を示す。
本ブログではgoogle-code-prettifyを導入済みなので、HTMLソースを適宜参照されたい。


手順は大まかに次の通りである。


  1. google-code-prettifyをダウンロード
  2. google-code-prettifyをウェブサーバにアップロード
  3. google-code-prettify本体(jsおよびcss)をインクルード
  4. google-code-prettifyのprettyPrint()をbodyタグのonloadイベントでcall
  5. シンタックスハイライトしたい部分をpreタグでくくりprettyprintクラスを適用


1. google-code-prettifyはgoogleのサイトからダウンロードする。
2. アップロードはffftpwinscpなど、任意の方法でアップロードする。
3. headタグは次のようにする。


<head>
<title>this is a title.</title>
<link href="/js/google_code_prettify/prettify.css" rel="stylesheet" type="text/css"/>
<script src="/js/google_code_prettify/prettify.js" type="text/javascript"></script>
</head>


ただし、pretty.cssおよびpretty.jsの場所はアップロード先によって変更の必要がある。


4. bodyタグは次のようにする。


<body onload="prettyPrint()">


5. preタグの適用は次のようにする。


<pre class="prettyprint">ソースコード</pre>


Enjoy!! ともにソースコードを晒しましょう。
次の例では、<$SampleImage$>があるかないかで、出力する内容を分岐させる例である。


<MTIfNonEmpty tag="SampleImage">
<img src="<$SampleImage$>" alt="" width="32" />
<MTElse>
<img src="/noimage.gif" alt="" width="32" />
</MTElse>
</MTIfNonEmpty>


MTIfNonEmpty はtagに与えた変数が空であるかどうかを判断し、"空である場合"に処理を続ける。また、
MTElseで"空の場合"の処理を記述できる。

拡張子がphpのファイル(というか、phpコードが実行される環境)で、
かつphp.iniのshort_open_tagがOnになっていると、XHTMLのxml宣言でエラーが出る。
なぜかというと、インタプリタが<?xml から始まる文字列をphpコードとして解釈するからである。


通常、次のようなerror_logが出力される。


Parse error: parse error, unexpected T_STRING in *.php on line 1


php.ini のshort_open_tag をOffにするのが正しい解決方法だが、
php.ini を勝手に変更してはならないケースでは、次のような回避方法もある。


<?php echo '<?xml version="1.0" encoding="utf-8"?>'."\n" ?>


PHPの仕様に文句をこぼさずに生きていきたいものですね。

ソースコードをブログ(MT)に貼り付けられる形式に変換するツールを作成した。
ここ(mahata.net内)からツールに遷移できる。


ためしに、ツールそのもののコードを貼り付けて添付してみる。


(strip_tags.html)


<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html lang="ja">
<meta http-equiv="content-type" content="text/html; charset=utf-8">
<meta name="description" content="mahata.net">
<meta name="keywords" content="mahata, mahata.net, programming, tool">
<meta name="author" content="Yasunori MAHATA">
<title>mahata.net - strip tags</title>


<body>


<p>
ブログにソースコードを貼り付けるツール。
</p>

<p>
<form action="strip_tags_proc.html" method="post">
<textarea name="code" cols="96" rows="32"></textarea><br />
<input type="submit" />
</form>
</p>

</body>

</html>


(strip_tags_proc.html)


<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html lang="ja">
<meta http-equiv="content-type" content="text/html; charset=utf-8">
<meta name="description" content="mahata.net">
<meta name="keywords" content="mahata, mahata.net, programming, tool">
<meta name="author" content="Yasunori MAHATA">
<title>mahata.net - strip tags</title>


<body>


<p>
ブログに貼り付けられる形態に変換しました。
</p>


<p>
<textarea cols="96" rows="32"><?php echo str_replace('&', '&amp;', htmlspecialchars($_POST['code'])); ?></textarea><br />
</p>

<hr />

<p>
再度の変換を試したい場合は、次のテキストボックスを利用してください。
</p>

<p>
<form action="strip_tags_proc.html" method="post">
<textarea name="code"  cols="96" rows="32"><?php echo $_POST['code']; ?></textarea><br />
<input type="submit" />
</form>
</p>

</body>

</html>


何ていうことはしていなくて、ただ単にhtmlspecialcharsを通したものの&をさらに&amp(←本当は半角) に変換しただけ。

めぞん一刻

| | Comments (2) | TrackBacks (0)

『めぞん一刻』の新装版が目に留まってしまい、懐かしくて購入してしまった。


CA390027.JPG


周囲に未亡人がいないから、自分の人生には潤いがないのだと気づいた。
どこに行けば未亡人に会えるのか、識者にご教示願いたい。

MTのテンプレートを一部コメントアウトするには、
<MTIgnore>タグを使えばよい。


<blockquote><MTIgnore> コメントアウトしたい内容 </MTIgnore></blockquote>


コメントアウトしたい内容に <!-- や --> が含まれている場合も問題なく使用できる。

About this Archive

This page is an archive of entries from October 2007 listed from newest to oldest.

September 2007 is the previous archive.

November 2007 is the next archive.

Find recent content on the main index or look in the archives to find all content.