優・良・可だけで書き表せばこうなる

今日家に帰ってみると、成績が届いていたので見た。
実は昨日届いていたんですけどね。
友人たちは先週の金曜日に届いていたんですけどね。
うーん…普通に考えたら翌日つくもんなんですけどね。
ちょっと夜遅く出し過ぎたのかな。そうなると近所以外は間に合いませんからね。
それはそうと、こうやって郵便で成績が送られてくるのにも慣れましたね。


いきなり郵便で成績送られてきて、不可あったでは随分なショックだが、
実際はそういうことになっていれば担任から連絡が来るものだろう。
だからそこまでは悪くないというのは郵便受け取る前にはわかってたことではあるわけだ。
もっともそうでなければ教えてくれないので、あれが何点とかいうのは届いて初めてわかることだが。
ところが届くのがすごく遅い。
成績は今月の12日に概ね決まっていたらしい。この時点で連絡が来た人もいるだろう。
ただ全く決まっているというわけではないから、少々変わることはある。
それにしても発送がおそらく26日というのはなんというか。


ところでうちの学校の成績は100点満点で出て、60点切ると不可ということだ。
もっとも60点切った科目があるからといってそれだけで留年にはならない。
まぁ進級したとしても不可のままではだめだからなんとか合格まで持って行かないとだめだけど。
とりあえず最終的には60点以上の点数がつくわけだ。
その点数が100点~80点なら優、79点~65点なら良、64点~60点なら可とつくわけだ。
可の範囲がすごく狭いところに注目。ギリギリでもなければ65点超えてることが多いみたい。
成績は100点満点でつく一方で、こういう風に書かれることもあると。
だから100点でも80点でも一見すれば同じように見えると。そういうこともあるんですね。
だから80点以上取れればそれでいいですねっていうのはよく言われていることです。
80点は結構な点数ですから。
それで届いた成績を見てみると、非常に調子のよかった物理はものすごく点数が高いし、
やはり得意な科目は相当点数が高い。90点台だってある。
それで80点台の科目も結構ある。まぁまぁがんばったものです。
ただちょうど80点の成績がついてた科目が2つほどあったのね。
体育と歴史ですね。体育はともかく、歴史はものすごくテストの点数が低い。全部60点台だったはず。
結構簡単なテストなんですけどね。それでもようやらん。
それでもまじめにレポートも出してることだし、70点ぐらいはあるかなとは思ってたけど、
結果は80点と。案外高い点数だなというのは確かな話だが、80点あれば優なんですよね。
うれしいですけど、もっともっとよい結果を出している人と一見すれば同じように見えるのか、
と思うとなんとも不思議なことだなと。


優という評価がつくからにはものすごくよい点数に見えるわけですが、
少々それとは遠いものも混じっていたりするのです。
まぁほとんどはものすごくよい点数を指してるんですけどね。
良と言えば、まぁ3つの真ん中だから並ぐらいかなというのはだいたい当たってるけど、
いかんせん可の範囲が細いので、合格すれすれの人でもたまに入ってしまうらしい。
そうじゃなくても64点よりかは65点だろ、とつけられることもあるとかないとか。
たった3段階で表せるとは誰も思ってないでしょうけどね。

春になって寒い寒い言っていられない

今日はちょっと出かけています。
泊りがけで出かけているのだけど、かなり久しぶりだなとか。
そうなんですね、日帰りで済む用事が多くてね。
まぁ今日の用事はそうもいかないと。


ところでもう3月も末ですが、寒いですね。
だいぶ前にもう暖房いらんでと言って、暖房をのけたのはよかったのですが、
暖房はいらないにせよ寒いですね。特に夜とかね。
ただ、そこで少々問題となるのが、上着を着ていくかどうか。
今持ってる上着は少々厚くて、冬にはよいのですが、今きると昼には暑い。
それなら必要ないときは脱げばいいじゃないかというのは確かなのですが、
けっこうかさばるんですね。だから脱いで持って歩きたくは無いわけだ。
結局着ない時間が出てきた時点で着ていくのはやめた。
朝は少々寒いけど、それも春と思って出ている。
まぁ学校が授業なくなってから、学校に行くといっても出る時間が少々遅いから、
それで少しは暖かくなってから出れるというのも大きいですけどね。


なんてことをわざわざ出かけた先でPCを借りてやってるわけですけどね。
かな入力にセットされていて、いちいちローマ字入力に変えないと打てないもので、
少々苦労していますけど、一応は何か書いておかないとなと思って書いているわけだ。
これは習慣ですから。

世の中にはマイクはいろいろあってね

そういえば瀬田川って正式名称は淀川なんだよなと。
実際どうなってるんでしょうね。しかしあそこを淀川だと言う人は残念ながら見たことない。
以前吉野川と言われて、僕が吉野川だと思っていたそれは紀の川だった、
という話を以前書いたような気もするけど、川の名前というのは時々ややこしいですね。


ところで僕のPCで使ってるマイクは、そう驚くこともないPC用のマイクなのですが、
実はこのマイクは少々面白い動きをしています。
というのもこれってコンデンサマイクなんだよね。驚くことではないけど。
このコンデンサマイクの動作原理というのはそう難しくない。
コンデンサに直流電圧をかけておいて、これに振動を与えると電圧が変化するから、
この変化する分、すなわち交流成分だけを取りだして使うということなんですね。
なかなかおもしろい仕組みですね。
それではあまりに高い電圧が必要となるので、家庭で使われているのは少々工夫されていて、
エレクトレット素子とかいう電荷を貯める素子がついているらしい。それでそうも高い電圧はいらんと。
確か1.5Vぐらいのはずです。そしてどこから供給しているかと言えば端子からですね。
こういう方法をとるのをプラグインパワー方式というらしい。そのままですね。
というわけでそうも気にせずに使うことができるわけです。便利だな。


ただマイクというと、どちらかというとスピーカーを逆にしたような、
そういうのを思い浮かべる人もいるだろうし、実は正解です。
というか給電回路がないとコンデンサマイクって動かないのよね。
マイクに電池入れるタイプとかいろいろあるだろうけど、普通は端子から供給されないと使えないと。
そのスピーカーを逆にしたようなマイクをダイナミックマイクと言うわけだ。
実はダイナミックマイクを使うことを想定しているところでは、
イヤホンをさして、それに声を入れても音が出てきたりする。
普通はそういうところからは給電してくれないから、PCで使ってるマイクは使えなかったりするから余計に不思議なところ。
昔から少々不思議に思ってたけど、なるほどね。
ただそうも出力が大きいわけじゃないから増幅しないと使い物にならない。
というわけでPCに直接接続しても使えない。
ライン入力から入れれば給電回路ないから、プラグインパワー方式じゃないマイクも壊れない。
しかしながら、そのままではよう拾わない。というわけであらかじめ増幅する必要があると。
それを考えるとPCでダイナミックマイクを使うのは難しいわけですね。
もちろんマイクアンプを入れれば問題ないんだけどね。


しかし知らない人が聞けば結構混乱する話ではありますよね。
ちょっとこの辺理解する必要があって調べてたけど、
本当に知らないとどこがだめなのか説明書に書いてあるというのに理解していないとかいう、
かなり残念な状態になりますからね。いや調べてすっきりしましたよ。
普段簡単に使えているマイクは実はかなり工夫されてのことなのだなとわかったものです。
本当にコンデンサマイクを簡便に使えてありがたいですねと思ったものだ。

XSLTはXMLからXMLを作る錬金術師

今日はXSLTって面白いよなと思って調べてみた。
XSLTというのはXMLを他の形態に変換するためのスタイルシート。
スタイルシートといえどHTMLと組み合わせて使うCSSのようなものとは全く違う。
と思うんだけど少々自信がない。しかしHTMLとXSLTを組み合わせて使う話は聞かないしなぁ。
これを使えばXMLで書かれた文書を、XHTMLとかRSSとか他のXMLや、プレーンテキストとかTeXとか、
そんな風に変換できると。これで1つのXML文書をいろんなところで使えるよと。
Mozilla FirefoxはXSLTにネイティブに対応しているのでXMLにちょっと書いてやるだけで変換して見られる。


しかし調べてたが、これはXMLをXMLに変換することばかり考えている。
当初XMLをHTMLに変換しようと思ってXSLTで書いていたが、どうも無理っぽい。
というのもXSLT自体がXMLで出来ていて、その中に生で<br>など埋め込んでも、
整形式じゃないと言われてしまう。
かといって&lt;br&gt;と書いたり、CDATAセクションに入れたりしても、それはそれでHTMLの要素として通じない。
ただそれはFirefox上での話であって、SAXONとか使って変換すれば、HTML文書として完成しているわけですが。
しかしながら、XML以外への変換はめんどくさそうだなというのはよくわかった。
だって、XMLの特殊文字のことを考えないとだめだから。


さて、実際にやってみたわけだが、XSLTは実にいろいろなことができる。
まずこれが作ったXML文書。



<my:test xmlns:my="http://libserver.ddo.jp/fdiary/?e=320" xmlns="http://www.w3.org/1999/xhtml">
<my:title>XML研究所
<my:desc>THERE IS NO DATA. THERE IS ONLY XML.
<my:url>http://xml.example.com/
<my:rss>http://xml.example.com/rss.xml
<my:user name="木村裕介" email="yusuke@example.com" id="USER1" />
<my:user name="尾崎隼人" email="hayato@example.com" id="USER2" />
<my:user name="大森翔大" email="shota@example.com" id="USER3" />
<my:article author="USER1" title="XSLT活用術" ref="http://www.example.com/~yusuke/article001.html"
year="2009" month="03" date="27" day="6" hour="23" min="59" sec="09" zone="+09:00">
<p>
くわしくは次に示すページを見て欲しい。<br />
<a href="http://libserver.ddo.jp/fdiary/?e=320">「XSLTはXMLからXMLを作る錬金術師」
</p>
</my:article>
</my:test>

my:testのようにmy:がついてるのは自分で作った要素。何もついてないのはXHTMLの要素。
ということをxmlnsで指定してあるわけね。この指定は大切な事。
まぁこんな風にXHTMLの機能を一部借りたXML文書が出来たわけだ。
この文書は少々複雑で、article要素のauthor属性に指定してあるのはその人のユーザーを定義しているuser要素のidなんですね。
こうしておけば同じ事を何度も書かなくて済むし、idからたどっていけば深い情報を知ることができるかもしれない。


これだけのことを解釈するXSLTスタイルシートを作る必要があるということだ。

<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xml"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns="http://www.w3.org/1999/xhtml" xmlns:xhtml="http://www.w3.org/1999/xhtml"
xmlns:my="http://libserver.ddo.jp/fdiary/?e=320" exclude-result-prefixes="my xhtml">
<xsl:output method="xml" media-type="application/xhtml+xml" encoding="UTF-8"
doctype-public="-//W3C//DTD XHTML 1.1//EN"
doctype-system="http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd" />
<xsl:template match="/">
<html xml:lang="ja">
<xsl:apply-templates />
</html>
</xsl:template>
<xsl:template match="my:test">
<head>
<title><xsl:value-of select="my:title" /></title>
<style type="text/css">
<![CDATA[
h1 { padding:0.2em; font-size:2em; background-color:white; color:blue; }
h2 { color:purple; font-size:1.5em; border-left:solid 1.5em green; padding:0 0.2em; }
#footer { border:solid 2px aqua; background-color:#FFFF99; margin:1em; }
.article { border:solid 2px fuchsia; background-color:#CCFFFF; margin:1em; }
p.info { font-size:0.8em; text-align:right; margin:0.2em 3em; }
]]>
</style>
</head>
<body>
<h1><xsl:value-of select="my:title" /></h1>
<xsl:apply-templates select="my:article" />
<div id="footer">
<h2>構成員一覧</h2>
<xsl:choose>
<xsl:when test="my:user"><ul><xsl:apply-templates select="my:user" /></ul></xsl:when>
<xsl:otherwise><p>誰もいません</p></xsl:otherwise>
</xsl:choose>
</div>
</body>
</xsl:template>
<xsl:template match="my:article">
<div class="article">
<h2><xsl:value-of select="@title" /></h2>
<p class="info">
<xsl:variable name="userid" select="@author"/>
作者 : <xsl:value-of select="/.//my:user[@id=$userid]/@name" /><br />
作成日時 : <xsl:value-of select="@year" />年<xsl:value-of select="@month" />月
<xsl:value-of select="@date" />日(<xsl:value-of select="substring('日月火水木金土',@day,1)" />)
<xsl:value-of select="@hour" />時<xsl:value-of select="@min" />分<br />
(<a href="{@ref}">Link)
</p>
<xsl:apply-templates />
</div>
</xsl:template>
<xsl:template match="xhtml:*">
<xsl:element name="{local-name()}">
<xsl:copy-of select="@*" />
<xsl:apply-templates />
</xsl:element>
</xsl:template>
<xsl:template match="my:user">
<li><xsl:value-of select="@name" /> (<a href="mailto:{@email}">E-mail</a>)</li>
</xsl:template>
</xsl:stylesheet>

長いですね。知らない人が見ればなんのことやらですが、わかれば多少は読める。
ここではXSLTの要素はxsl:、自作要素はmy:、XHTMLの要素は何もつけないかxhtml:をつけて表す。
xsl:output要素でxhtmlとして出力することについていろいろ書いてある。
まぁいろいろ考えるところはあるのだがコピペでOK。これでXHTML 1.1の文書となる。
基本的な使い方はxsl:template要素でmatch要素に書いたXPath式に一致する要素を処理するという調子。
XPath式は生で書けば要素名、@をつければ属性名、/で連ねて書いていくことが基本。
ここで重要なのは名前空間を決めてある場合は必ずmy:testやxhtml:pのように:を使ってかかないといけない。
単にpと書けば何も名前空間が指定されていないpでXHTMLのpということにはならないので注意。
まず/、文書全体に対するテンプレートを決める。
それでその子要素を別のテンプレートに当てはめるということでxsl:apply-templates要素を置くと。
実際にXMLの文書の内容をどうやって変換先の文章に当てはめるのかと言えば、xsl:value-of要素を使う。
select属性でXPath式を書いて、それの内容を当てはめると。
ちなみにselect属性はxsl:apply-templates要素にもあり、これを使えば当てはまる子要素だけ投げられる。
属性値に当てはめるときはhref=”{@ref}”のように{}でXPath式を入れて書けばいいと。
これが基本だが、さらに進んだ使い方もたくさんできる。
まず条件分岐。xsl:choose・xsl:when・xsl:otherwise要素、これはswitch文のようなものです。
これを使えば条件に合うかどうかで表示を変えることができる。
xsl:whenのtest要素にXPath式を書く。このXPath式が真か偽かで動作を変えられると言うこと。
ここではmy:userという式が条件だが、これはmy:usersがあるかないかという条件ね。
あとxsl:if要素という条件分岐の要素があるな。これも使い方はほぼ同じでtestを指定して使う。
author属性の属性値はその人を定義するuser要素のidとしてあると書いたが、
これを解釈してそのユーザーの名前を取り出すことも工夫すればできる。
実はXSLTでは変数を使えて、それはxsl:variable要素で定める。name属性に変数名、select属性に値をXPath式で書く。
これでauthor属性の値をuserid変数に入れて、あとは任意のXPath式で$useridと使えると。
それでuser要素のidがそれであるもののXPath式は少々難しい。
/.//my:user[@id=$userid]/@nameだが、これの意味を読みほどいてみる。
/は文書全体、.はそれ自身、//は子孫、すなわち/.//my:useridで全部のmy:userid要素ということ。
.を入れてるのは.を入れないで///と書くと認識しないから。
[@id=$userid]をつけると条件を満たすそれということになる。
/.//my:user[@id=$userid]で、全部のmy:userid要素のうちid要素が$useridであるもの。ということであとはこれのname属性を取ればいいと。
こんな複雑なことをXPathはやれるんです。えらいもんです。
日時だが、year・month・date・day・hour・min・sec属性でバラバラに入れてある。
というのもXSLT 1.0では日付関係の対応が不十分だから。だからバラバラにしてある。
曜日をどうやって日本語に変えるか、というのでsubstringを使った。これもXPath式です。
XSLT 2.0ではもうちょっとスマートにできると思いますけど。
XHTMLの要素が混ざってるが、これをそのまま移し替えるために、
記事の内容全体をxsl:apply-templates要素で投げて、
xhtmlの要素についてテンプレートを用意しておく。match=”xhtml:*”のテンプレートがそれです。
これも必要ならコピペでOK。こうすれば要素を再構築してくれる。
これを用意しなければXHTMLの要素は中身の文章だけが移し替えられる。


このXSLTスタイルシートを使うということをXML文書に少し書いてあります。
<?xml-stylesheet type=”text/xsl” href=”test-html.xsl”?>ってところです。
こうしておけばMozilla Firefoxなどで見たときXHTMLに変換して見れると。
いままで何が書いたあるかわかりにくかったXML文書が読みやすくなりましたね。
すばらしい!!XSLTが用意されてればよくわからないXML文書でも役立てられますね。
また、初めの方で紹介したSAXONを使ってXSLTスタイルシートを適用してみる。
これはJavaで動くんですね。実は.NET版もあるんだけどね。ここでJava版で話を進める。
Saxon-B 9をダウンロードして、展開するとjarがたくさんある。使い方。

java -jar saxon9.jar -s:test1.xml -xsl:test-html.xsl -o:out.xhtml

これで変換されたのが出てくる。
ところで、さっき取り上げなかったのだが、実は少し工夫がしてある。
というのはxsl:stylesheet要素のexclude-result-prefixes属性ですね。
ここで新しく作られるXML文書で出現しないプレフィックスを書いてある。
あたらしく出来る文書では何もつかないXHTMLの要素ばっかりなのでmyとxhtmlは出てこない。
というわけで書いておくと、新しくできる文書にはmyとxhtmlの名前空間の宣言が移されない。
もしこれを書かなければ使いもしない名前空間宣言が移されてしまうのだね。
ちょっと厄介。しかしこんなおせっかいからしてXMLからXMLを作ることに特化してるなぁと感じさせてくれる。
あとstyle要素のCDATAセクションが新しい文書では消えてるが、
これは大した問題ではない。
XSLTスタイルシートに書いたCDATAセクションは、スタイルシートの解釈の時に消えたわけだが、
もし特殊文字があっても、その特殊文字をエスケープして新しいXML文書に書いてくれる。
というわけでCDATAセクションは消えたが、CDATAセクションの心は残ったままだと。
なので安心してCDATAセクションを使ってくれてOKです。


RSSにも加工できるぞと言ったのでRSSに加工するXSLTスタイルシートも作ってみた。

<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xml"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns="http://purl.org/rss/1.0/" xmlns:xhtml="http://www.w3.org/1999/xhtml"
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
xmlns:dc="http://purl.org/dc/elements/1.1/"
xmlns:my="http://libserver.ddo.jp/fdiary/?e=320" exclude-result-prefixes="my">
<xsl:output method="xml" media-type="application/rss+xml" encoding="UTF-8" />
<xsl:template match="/">
<rdf:RDF xml:lang="ja">
<xsl:apply-templates />
</rdf:RDF>
</xsl:template>
<xsl:template match="my:test">
<channel rdf:about="{my:rss}">
<title><xsl:value-of select="my:title" /></title>
<link><xsl:value-of select="my:url" /></link>
<description><xsl:value-of select="my:desc" /></description>
<dc:language>ja</dc:language>
<items>
<rdf:Seq>
<xsl:for-each select="my:article">
<rdf:li rdf:resource="{@ref}" />
</xsl:for-each>
</rdf:Seq>
</items>
</channel>
<xsl:apply-templates select="my:article" />
</xsl:template>
<xsl:template match="my:article">
<item rdf:about="{@ref}">
<link><xsl:value-of select="@ref" /></link>
<title><xsl:value-of select="@title" /></title>
<dc:date>
<xsl:value-of select="@year" />-<xsl:value-of select="@month" />-<xsl:value-of select="@date" />
<xsl:text>T</xsl:text><xsl:value-of select="@hour" />:<xsl:value-of select="@min" />
<xsl:text>:</xsl:text><xsl:value-of select="@sec" /><xsl:value-of select="@zone" />
</dc:date>
<description><xsl:value-of select="substring(normalize-space(.) ,1,30)" /></description>
<xsl:variable name="userid" select="@author"/>
<dc:creator><xsl:value-of select="/.//my:user[@id=$userid]/@name" /></dc:creator>
</item>
</xsl:template>
</xsl:stylesheet>

相変わらず長い。基本はさっきと同じです。
名前空間の宣言は全部ルート要素でまとめて行うのがポイントです。
xsl:for-each要素なんてのもあります。selectで取り出したのをそれぞれ処理していくと。
これ使えば、数字の和とかも求められますよね。なかなかおもしろい。
日時の生成の中でxsl:text要素を使ってますが、これは結構重要なところです。
というのも要素の中に文字を書けば、それはそのままテキストなんですが、
前後に空白があるとそれもまとめてそのままテキストとして出してしまう。
それを避けるためにはxsl:text要素を使うみたいです。だから改行直後だけ使ってるのね。
まぁそんなところです。これでRSSも作れちゃいます。


なかなか便利なものだなと思いましたね。あまりに難しすぎるけど。
Blogのテンプレートとかで使うと楽しそう。ほとんどXSLTで済むなぁと。
ただサーバー側でこれを処理する必要があるかなという気もする。
PHPでXSLTProcessorクラスを使って、DOMツリーを用意しておいたXSLTスタイルシートでもって加工して、
これを表示するというのはなかなかよさそうだ。
まぁXMLの解釈のコストがかかりかかりそうだが。XMLって重いんですよ。
Blognplusのテンプレートを編集してて、都合が悪いところがあれば本体を改造してるが、
そもそもテンプレートの能力がそうも高くないから改造が必要なんであって、
テンプレートの能力がすごく高ければなぁと思うところではあるわけです。
XSLTなら完璧ですね。それぐらいのテンプレートの方がありがたいのではないかなと。
まぁちょっと検討してみようかな。結構面白いですしね。

ものすごい広域連合だってさ

今日新聞で見たのですが、関西広域連合の設立の方向が決まったとか。
大阪府・京都府・兵庫県・和歌山県・徳島県、あと多分奈良県、滋賀県の広域連合ね。
これの母体となった関西広域機構にはこれに加えて、福井県・三重県・鳥取県が入ってるけど、
これは広域連合に入る気はなさそう。
都道府県のみからなる広域連合では初めてのものになるのではないかなと。
都道府県の入る広域連合自体は 彩の国さいたま人づくり広域連合 (埼玉県、埼玉県内の全市町村)がありますからね。
まぁ元々は大阪市・京都市・神戸市・堺市あたりも入る計画もあったらしいけど、
それは見送られたようだ。必要とあらば入るだろう。


そもそも広域連合って何かといえば、一部事務組合の民主化バージョンらしい。
一部事務組合といえば柏羽藤環境事業組合とかね。ゴミ処理とか、消防とかで出てくるあれです。
それとそう変わるようには見えないのだが、総務省の説明によれば、広域連合長と議員は投票で選ばれるあたりが民主的らしい。
この投票は住民の直接投票か、構成する団体の議員の投票かとかそういうの。
例えば桜井宇陀広域連合とか。何やってるのかあんまり知らんのだが、
介護認定と障害程度認定とふるさと市町村圏基金の実施といったことをやってるそうだ。
あと、後期高齢者医療制度の実施は都道府県ごとに全市町村からなる広域連合を作って実施することになってるそうだ。
保険というのはたくさんの人が加入していることに意味がありますからね。
そのために広域でやってると。そういうことですね。
それなら国民健康保険も持って行けばいいじゃないのとか思うけど。


それで広域連合でやることだが、まずは
広域防災とか観光とか文化とか産業とか環境とか、驚くようなことをするわけじゃない。
驚くべきことといえば、ドクターヘリの広域運用とか、調理師・製菓衛生師・准看護師の試験と免許の共同化とか。
というか今まで都道府県でやってたのね。
まずそういうところから始めていくのだが、最終的な目標は、この地域の国が行っていることを譲り受けること。
都道府県から譲り受けたこととあわせて統一的にやっていくこと。
例えば国道165号なんだが、これは起点の梅田新道交差点から橿原市までは国の直轄区間、
橿原市から津市までは都道府県の管理する区間。ということは奈良県の区間は奈良県が、三重県の区間は三重県がということ。
国道の指定区間は結構もめ事の原因となっていて、
御堂筋のうち国道25号の区間を指定区間から外して大阪市に管理を譲れとか。
というのも国が管理する区間があるがために、占有とかの許可がめんどくさいとかいう事情があるらしい。
一級河川の指定区間外(一級河川の指定区間は都道府県が管理する区間、道路と意味が違う)もちょっともめ事に、
これはダムのことですね。かなり醜い話になってますね。
この辺を統一的にやれんもんだろうかということらしい。
ただし、そこまでたどり着けるのはだいぶ先の話でしょう。
そもそも国道25号の御堂筋の区間でさえ少々もめたのに、
区域内の全部よこせとかむちゃくちゃ厳しいんじゃないかなと。
それまでに実績を積まなければね。


そういえば、なにげに徳島県が関西広域連合に入るリストに入ってますね。
海を超えて四国の県ですが、逆に言えば海を越えれば関西なんですね。
かつてはフェリーで、今は高速バスで行けてしまうからね。
そういうものらしいです。四国なのにと思うけど、そう驚くことではないようです。
あと、関西広域機構には福井県・三重県・鳥取県もいますねぇ。
福井県は、若狭と敦賀がかつて滋賀県だったことがあるそうだ。
あと、昔は琵琶湖を運んできた荷物を敦賀まで運んで日本海に出していたと。
こうやって京から日本海に荷物を出していたんですね。なかなかえらいルートですね。
三重県は、名張市と青山町(現在は伊賀市の一部)が京阪神大都市圏に、
桑名市・いなべ市・東員町・四日市市・菰野町が名古屋大都市圏に入るあたりからして
どうすればいいのかわからない状態らしく、とりあえずどちらともお付き合いしようとか考えているそうだ。
まぁさすがに大阪の都心と名古屋の都心と直接つながってる地域が端と端にあるわけですからね。
だから関西広域機構にも入ってるけど、さすがに広域連合はと思ったのだろう。
鳥取県はさすがに関西には入らないと思います、けどお付き合いがそれなりにあるからと入ったものらしい。


まぁまだできてないわけですが、今年中にはできるようです。
ぜひマネしたくなるような成果を上げてほしいですね。

そうも役に立たなそうなtieを活用してみた

ちょっと面白いものを見つけた。
perl – Tie::Expression (404 Blog Not Found)の記事で取り上げられてるTie::Expressionですね。
ところで小飼弾さんは妙に有名ですね。
Perlの世界においてはEncodeモジュールの元になったJcode.pmの作者ということで有名なのね。
まぁ何かと有名な方ですが、その方が作ってしまったパッケージの話。
実に短いがちゃんとCPANにあるんですよ。


CPANでTie::Expressionを入れてみた。使い方はこう。

use Tie::Expression;
tie %_,'Tie::Expression';
print "料金は$_{100*50}円です。\n";

以前@{[ ]}を使えば””の中に式を埋め込めるという話題を出した気がします。
ただどうもめんどくさいと。そういうわけで考えられた話です。
そこで特殊なハッシュ%_を作って、それの機能を使って実現してるわけ。
それでtieとか使って作った%_というのはいかなるものなのか、
というのを説明しようとすると実に難しい。


tieというのは変数の裏にオブジェクトを隠した変数を作る関数。

tie %_,'Tie::Expression';  # $obj=Tie::Expression->TIEHASH();

#以降に示したようにオブジェクトを裏で作ってるわけだ。
それで要素の参照を裏で次に示すように読み替えて実現すると。

my $x=$_{$foo};  # my $x=$obj->FETCH($foo);
$_{$foo}=100 # $obj->STORE($foo,100);
delete $_{$foo}; # $obj->DELETE($foo);

tieの裏で起きてることの一部をここに書いてみた。
こんな風にできるオブジェクトを作ればいいと。
このTie::Expressionというのは、FETCHすると、キーとして与えたものをオウム返しするだけのオブジェクト。
これによって@{[ ]}のように””の中に埋め込むのに活用できると。


なるほど、というわけでこれをマネしてTie::Printfというのを作ってみた。

use Tie::Printf;
tie my %f,'Tie::Printf';
print "U+$f{'04X'}{30000}\n";

$f{’04X’}とすると、キーを与えたらそれをsprintfで%04Xというフォーマットで文字列化したものを返すようにtieした、
ハッシュリファレンスを返すようにして、$f{’04X’}->{30000}と使うと。
ちなみにPerlでは[ ]または{ }にはさまれた->は省略できるので上のようにかけると。
そういえばちょっと友人とカリー化って何?というような話で盛り上がったのだが、
あれは関数が1つしか引数を取れない世界で2つ以上の引数を与えたいとき、
1つ目の引数を与えたら2つ目の引数を受け取って結果が出る関数が帰ってくるというようにして、
2つ以上の引数を受け取れるようにするというものなのね。
それそのものだよね。1つ目の引数であるフォーマットをキーとして与えると、
2つ目の引数である値をキーとして受け取り、sprintfされた文字列を返すハッシュリファレンスを得ると。
まぁ案外驚くことのない工夫なのかもしれません。
それで作ったPrintf.pmを貼ってみる。

use strict;
use warnings;
our $VERSION='0.80';
package Tie::Printf;
sub TIEHASH{
my $pkg=shift;
my $f=shift;
return bless(\$f,$pkg);
}
sub FETCH{
my $self=shift;
if(!defined $$self){
tie my %f2,'Tie::Printf',shift;
return \%f2;
}else{
my $format=$$self;
my $out=shift;
return sprintf("%$format",$out);
}
}
sub STORE { undef }
sub FIRSTKEY{ undef }
sub NEXTKEY { undef }
sub DELETE { undef }
sub CLEAR { undef }
1;

引数に何も与えなければさっきのような%fにtieできて、
引数を与えればキーをフォーマットに沿ってsprintfしたものを返すハッシュにtieできると。
まぁそんなところです。


しかしtieというのはそうも面白くない。
まぁまぁハッシュにtieするのは楽しいかも知れないけど、
面白くないのは配列にtieすること。
やはり配列にtieできるとなれば無限数列とか作りたいけど、
どうしても通常の配列と同様の性質を持たなければならないのでそんなものは作れない。
また面白くないのはtieしたものは、ただのハッシュやら配列と性質が変わらないと言うこと。
例えばこういうことはできないと。

%foo->bar(100);

普通のハッシュにbarというメソッドを加えるなんてことはいかにtieしたものでも無理だと。


まぁPerl 5のオブジェクト指向はそれなりに役に立つものであるけれど、
やはり元々そう考えてこられたものと比べると見劣りしてしまう。
いろんなオブジェクトがforeach出来たら楽しいよね、
.NET FrameworkではSystem.IEnumerableを実装すればなんでもできる、
Rubyではeachというメソッドを用意すればEnumerableをincludeしてやればreduceさえできる。
別にそれが配列と同じような性質を持ってる必要はないわけで、いろいろ自由にできる。
さらにいうと添え字を使うことも.NET Frameworkの場合インデクサ( this[int i]のような特殊なプロパティ )、
Rubyの場合は[]演算子、[]=演算子のオーバーロードでできると。
Rubyは違う世界だから事情は違うけど、キーを取ってなんかするオブジェクトを作りたければ[]演算子をオーバーロードするだけなのね。
けどPerlにそれはない。ただ非力なわけじゃないから、以前書いたようにイテレータでいろいろできる。
ただ全くないわけじゃなくてtieはありますね。tieすればキーを得ることができると。
ただそうも役に立たんなぁと。それはさっき言ったように普通のハッシュ以上でも以下でもない能力しか持てないから。
どちらかというと、普通の変数に読み取り専用とか、そういう特殊な性質をつけるための道具なのかなと。
全く新しく作ったオブジェクトに配列に似た機能も与えようとか、そういう道具ではなさそうだと。
本当に惜しいなぁと。
まぁそんな道具をちょっと変な使い方をしてみたというお話でした。

evalブロックをuseでも活用するんだ

Perlにはevalブロックというのがある。
普通evalというと文字列で与えられたコードを実行するというものですけどね。

eval 'print $x+$y;';

これとは似て非なるもの。確かにこれと同じ事はできるのだけどね。
evalブロックは、違うものだがC#とかJavaとかのtry~catch構文のようなもの。

my $x=<>; chomp $x;
my $y=<>; chomp $y;
my $z;
eval{
$z=$x/$y;
1;
} or do{
print "Error : $@";
exit;
};
print "$x/$y=$z\n";

Perlのプログラムを動かしてると途中で死んでしまうことがある。
けどevalブロックの中で動かしてると、evalブロックの返り値が空リスト、すなわち偽になるだけで、プログラム自体は死なない。
最後まで処理を終えたときの返り値が真になるようにしておけば、死んだときはorなどでエラー処理ができる。
エラーの情報は特殊変数$@に入る。
そういう利点があります。


まぁあんまり使うところはないのですが、パッケージの読みこみ時にパッケージが無かったときの処理を入れられるといいなと。
例えばList::MoreUtils::minmaxを読み込めればそれを使い、
そうでなければList::Utils::minとList::Utils::maxを別々に使うとか。
まぁそういう選択があってもよいのではないかということです。
それにuseのときに死んだら、”Can’t locate List/MoreUtils.pm in @INC”とかいう微妙な表示でしょ。
どちらかというと、”List::MoreUtilsが必要です。導入してください。”の方がうれしい。
まぁこういうことができてほしいということです。


しかしこんなの簡単だろと。

eval{ use NoPackage qw(foo bar); 1; } or die '親切なメッセージ';

これでいけるんじゃないかなと。
しかしそうなる前に死んでしまった。あらー、なんでだろ。
調べるとuseというものはこれと等価らしい。

BEGIN{
require NoPackage;
import NoPackage qw(foo bar); # NoPackage->import( qw(foo bar) );
}

このBEGINブロックというのは、コンパイル時に実行されるものらしい。
そのためevalブロックとして実行される前にuseは実行されて、そこで死んでいると。
これはrequireでモジュールをロードすることと、importで必要に応じてインポートしてもらうこと。
実は#以降に書いたことと一緒です。そのためimportというメソッドを用意して、
これの第一引数にnew同様パッケージ名が来ることだけ考えておけば、
インポート以外のためにもuseのとき渡すリストは活用できるようです。
このimportというのは特殊な関数じゃなくて、そのパッケージのimportメソッドを呼び出しているに過ぎないわけね。
このような表記法はimportやnewに限らずなんでもいける。uniqでもいけます。

my @a=uniq List::Util qw(foo bar foo List::Util);
#List::Util::uniq('List::Util' , qw(foo bar foo List::Util) )
print join(',' , @a) , "\n";

まぁそれはともかく、必ずしもコンパイル時に実行しなければならないものでもないから、
こうすればOKです。

eval{
require NoPackage;
import NoPackage qw(foo bar);
1;
} or die '親切なメッセージ';

こうすると親切なメッセージを吐いて死ぬ。
ところでこんな風になった理由はevalブロックの中身も始めにコンパイルしているからで、
文字列をevalした場合はこうではない。

eval 'use NoPackage; 1;' or die '親切なメッセージ';

特に問題なく動く。この場合はevalを実行するときになってコンパイルするから。
けどこんな風に途中でevalを入れるのは効率が悪いらしい。
あとコンパイル時にエラーに気づけなかったり。
というわけなのでevalブロックの方が都合がいい。


ちなみにuseできなかったときは別にサブルーチンを定めようというのなら、
そのサブルーチンを定める部分は文字列でコードを与えるevalを使う必要がある。
というのもサブルーチンの定義ってコンパイル時にやるみたい。
だからサブルーチンの宣言よりも前に使うことができたりする。
そんなわけでこれを応用して作ってみた例。

eval{ minmax(1,6,7,5); } or print "miss\n";
eval{
require List::MoreUtils;
import List::MoreUtils qw(minmax);
1;
} or eval <<'EOF';
sub minmax{
#print "Call pure perl\n";
my ($min,$max);
$min=$max=shift;
while(@_){
my ($minelem,$maxelem);
$minelem=$maxelem=shift;
if(@_){
my $elem=shift;
if($maxelem < $elem){ $maxelem=$elem; }
else { $minelem=$elem; }
}
$min=$minelem if($min>$minelem);
$max=$maxelem if($max<$maxelem);
}
return ($min,$max);
}
EOF
my ($min,$max)=minmax(6,8,15,7,3,10,5,10,4,9);
print "min : $min\nmax : $max\n";

minmaxの定義をevalブロックでやると、それより前のevalでminmaxを実行しているところでも、
ここで作ったPerl版minmaxが動いてしまう。というわけでコードを文字列で与えると。
これでList::MoreUtilsを読み込めなかったときの対応もできてると。
ちなみにminmaxのアルゴリズムだが、
要素を1つ取り出して、これを暫定最大・暫定最小にする。
そして要素を2つ取り出して、このうち大きい方を暫定最大と比較して必要に応じて入れ替えて、
小さい方を暫定最小と比較して必要に応じて入れ替えて、というのを要素がなくなるまで繰り返し。
これで要素2つあたり3回の比較で済むという寸法。
こんなのList::MoreUtilsにあるからそれでいいじゃないのというのはもっともな話だが、
知っておくとお得なこともあるかも。

見知らぬ切符を見せられたら困る

五條市の五条駅に行くとき、近鉄の駅からだと、吉野口でJRに乗り換えて行く。
わざわざ五條市の五条駅と行ったのは、京都の地下鉄烏丸線にも五条駅があるから。
近鉄奈良駅で五条駅までの切符を求めたら、吉野口までの切符を売ってくれるのだろうか。
まぁ烏丸線の五条駅には乗換無しで行けるんだけどね。


その吉野口駅では乗換の時切符を回収されない。
そのためJRから近鉄に乗り換える時はJRの切符を持ったまま乗り換えると。
それで降りる駅で吉野口からの運賃を支払うと。これが普通です。
ただ、けいはんな線に行くときだけは事情が違うはず。
というのも生駒駅で乗り換える時改札を通るんですが、
ここで料金が足りないときは精算しないといけない。足りてれば素通りですけど。
ここで料金を払って、切符をかえてもらって、目的地まで行くと。
まぁそんなわけでけいはんな線の人はJRの切符を拝む事なんて無かったはず。
ちなみになんでこんなところに改札機があるのかという理由の1つが、
地下鉄の人がJRの切符を見たくなかったかららしい。
まぁもう1つは不正乗車防止らしいけど、これについては今はそう意味はないらしい。
西大寺~難波の定期券で西大寺駅で入って、難波~本町の定期券で本町駅で降りる、
というようなことを防止するためだが、今はそれをすると、本町駅で入場記録がないと弾かれるからそう意味はないと。


ところが3月20日から、けいはんな線でもJRの切符を持ったまま行く可能性があると。
五条―(JR)→吉野口―(近鉄)→難波―(阪神)→元町―(神戸高速)→阪急三宮―(阪急)→天六―(地下鉄)→長田―(近鉄)→登美ヶ丘
のようなルートを通れば。明らかにおかしいですけどね。
すると学研奈良登美ヶ丘駅の駅員は生駒で乗り換えたものと勘違いするかも知れない。
けどよく考えればおかしいと気付くはず。
それでこのルートが出てくるかはよくわかりませんけど。
しかし料金を徴収してもどうするんだか。
阪急にどうやってお金を渡すんだ。なんとかなるのかな。


ちなみにPiTaPaで改札を出ずに通過できる交通事業者の数を最大とするルートは
(神戸市営地下鉄西神・山手線)―新神戸―(北神)→谷上―(神鉄)―湊川―(神戸高速)→高速神戸―(神戸高速)→阪神元町→阪神三宮
―(阪神)→難波―(近鉄)→竹田―(京都市営地下鉄 烏丸線)→烏丸御池―(東西線)―御陵→(京阪京津線)
というルートだそうだ。正直わかりたくもないルート。
多分計算で失敗するはず。さすがにこのルートはおかしいですね。
というわけでたくさんの交通事業者を通過するときは、
あらかじめ接続駅までの切符を買っておくとか、
余裕があれば接続駅で一回出るとかすればいいですね。
しかしこのルートで旅行するからといって、あらかじめ切符を買っておくのは難しいよな。
そう考えるとこれは実現不可能なことなんだろうなと。
いや、車掌から切符を買えばなんとか。けどそんな律儀なひとばっかりじゃないしね。
こんな変わった乗客で改札が混乱しないことを祈るところです。


そういえば、関西に九条なる駅が3つあるのだが、どうもどれも近鉄とご縁があるそうで。
1つは大和郡山市の九条駅、周囲は住宅地だったはず。
1つは京都市営地下鉄烏丸線の九条、烏丸九条交差点の地下に埋まってる。
それなら烏丸九条にしろという話もあるとか。
もう1つが、大阪市西区の九条駅。この駅は高架を走る大阪市営地下鉄中央線の駅と、
地下鉄より下の地下を走る阪神なんば線の駅がある。
どれも近鉄の駅から乗換無しで行くことができるわけですが…
九条駅までの切符を買いたい人にはどの切符を売ればよいのやら。
まして九条駅で九条までの切符を売ってと言ったらどうなることやら。

irbをパクってiplを完成させてみた

やっと冊子が完成した。
やっと春休みがやってきた、というのが部員の感想ですね。
僕の記事はただでさえページ数が多いのに、それで字がすごく多いから、インクの消耗量がすごいはず。
いろいろ大変でしたが、最終的にはうまくいってよかった。


そういえばperlshっていうものは世の中にあるんですね。
Term::ReadLine::Gnuのおまけとしてついてるんですね。
Tabで候補が出てくる以外はそう素晴らしい機能があるわけではない。
というかData::Dumper使ってないあたりからして残念すぎる。それにWindowsで使えない。
それと自分の作ったやつ(「perlshで気軽にできる自動化」参照)の名前がかぶってるなぁと。
それならと自作の方をiplに名前を変えてみた。irbのパクリですね。
それにあわせていろいろ変えてみた。


複数行の入力がしたいときというのはやはりあるのだが、
そのために2つの方法を用意した。
1つは1行目の行末が{で終われば、そこから継続して入れられて、空行が来たらそこで終わりと。

> for(1..10){
* print "$_,";
* }
*
1,2,3,4,5,6,7,8,9,10,=> ''

もう1つ空行があっても大丈夫な方法を考えてみた。

> ##foo
* $x=q{
* 111
* 222
*
* 333
* }
* ##foo

##xxxからはじめて##xxxで終わると。これならいくらでも打てますね。
あと、以前から取り付けていたファイルを読み込むfr、ファイルに書き込むfw、追記するfa、
ファイル一覧を取り出すlsと、データをわかりやすく表示するpを用意しておいた。


ipl.batをBZip2で圧縮したものをActivePerlのbinに入れれば動きますよと。
結構使い勝手はいいと思う。
前から使ってるけど電卓代わりに役に立つ。
まぁカンマで桁区切りできないけどね。Perlの桁区切りは_です。1_000_000のように書けるんですよ。
それさえ気にすれば電卓に使うには便利。

10m延長ケーブルは売ってないなら作ればいい

今日は日本橋に行ってきた。
いろいろ買い物してたが、部の買い物が主で、
領収書をもらっては「ハンコを押してもらえませんか」と言ってましたね。
店によって角印だったりレジの人の印鑑だったり。
しかしレシートのどこに押してもいいと思ったのか、長い領収書の明細部分に上下逆に押した人には困った。
まぁそれでも問題ないかと思ったけどね。全部提出すれば特に問題ではない。


さて、今回の購入品目の中に10mの延長ケーブルというのがありました。
そんなものありませんね。予想通りです。
というわけで自作するしかないですね。
それで堺筋の東側にある、ある電材屋に行って、いろいろ探してきた。
まず電線だが、種類によって流せる電流があるみたいで吟味してみた。
それで12A流せるVVFケーブルを見つけて、これを10m切ってくれと頼んで出してもらった。
1mあたり57.75円なので、10mで578円です。安いですね。
先にはプラグとタップをつけるので、プラグは79円、タップは199円と。
合計886円でしたと。すごく安いですね。まぁタップはケチって3口にしたけどね。
ちなみに既製品の5mの延長ケーブルは2000円近くしてた。
まぁなんというか、工作が少々めんどくさいのよね。
ついでに420円でワイヤストリッパが売ってたので買ってみた。


自宅でケーブルの工作方法をちょっと考えていた。
VVFケーブルというのは、導線にビニール皮膜をつけたものにビニール皮膜をつけたものと。
つるつるしたちょっと太めのケーブルありますよね。あれがそうです。
割ってみるとよくわかります。まぁ実感したことがある人はそんなに多くないかも知れないけど。
まずこの外側の皮膜をはがすわけですが、これはカッターでやるのがよさそう。
カッターで切れ目を入れて、はがしてしまうと。
こうすればあとは1本ごとのケーブルが出てくるので、これをニッパーとかワイヤストリッパで皮膜をはがすと。
それでOKと。あとはこれをプラグとタップにつけると。
これらの中の接続は端子のねじに導線をつなぐと。
ねじの周りに一周巻き付けて、それで端子にしっかりそのねじを止めればOKかなと。
圧着端子を使ってやる方法もあるのですが、圧着端子をつける工具がいるからね。
実はすごい工具があるんですね。圧着しきるまで開かない工具が。
まぁそういうのないし、それならいいかと思ってね。
剥いた導線をよくねじって、それでしっかり巻き付けて止めればいいですね。


一度こういう工作をしているから、まぁ思い出しつつうまくできると。
この調子でやっていけばそれなりによいものができそう。
まぁ12A使えるといいましたけど、多分そこまでは流れないはず。
しかしさすがに7Aはないわなと思ってこうしたわけだけど。
まぁこうやってオーダーメイドの延長ケーブルは作られると。
そういうことですね。