yamicha.com's Blog - Presented by yamicha.com
Blog yamicha.com's Blog - 2018/12 の記事
[1] [2] [3] [4] [5] [6] [7] [8] [9] [10] [11] [12] [13] [14] [15] [16] [17] [18] [19] [20] [21] [22] [23] [24] [25] [26] [27] [28] [29] [30] [31]

yamicha.com's Blog
 諸事情により、現在更新休止中。ご了承ください。もし今後ブログを再開することがあるとすれば、その際にはこのブログスクリプトではなく、新しく開発したものによるかもしれません。
 当ブログ管理者についてはこちらをご参照。
開発魔法(737)
社会問題(733)
お知らせ(11)
質問・バトン回答(15)
ゲスト出演(8)
経済・知的財産(150)
ゲーム開発(182)
[Ada] 勝手に補足
- Note
- 金配りの次の一手


- Endless Ultimate Diary
- 銃世界

漢字バトン
- うるる雑記帳
- 漢字接力棒

ツキアイゲノムバトン
- ブログ@うにうに画像倉庫
- あぶ内閣

縺イ縺セ縺、縺カ縺励ヰ繝医Φ
- 月夜のボヤキ
- 騎士サーラバトン
パスワードを使う
名無し (2012/02/27)


開発者解放裁判
yamicha.com (2010/03/14)
Winnyに関しては、私も「純白」とまでは考えておりませんし、使用し..

開発者解放裁判
通りすがり (2010/03/08)
winnyに関しては「ダウンロードソフト板」なんてところを拠点に開発..

新型インフルエンザの恐怖
いげ太 (2009/11/03)
> C#などの「int Some(int , int)」は、F#では「(int * int) ->..

時効に関する思考
yamicha.com (2009/08/31)
>いげ太さんコメントありがとうございます。手元にドキュメントが少..
Homepage
Blog Top
Normal View
List View
Search
Calendar
Comment List
Trackback List
Blog RSS
Send Trackback
Phone Mode
Administrator
yamicha.com
Blog
るううるる。
Source
法令データ提供システム
FindLaw
Development
Java2 Platform SE 6
Java EE 6 API
MySQL Developer Zone
PHP Reference
MSDN Library
Ada Reference Manual
Objective Caml
Python Documentation
Erlang
Prolog Documents
 垂オ訳ございませんが、現在このブログではトラックバックを受け入れていません。

 この記事に対してリンクされる場合には、こちらのURLをご利用ください。
http://void.yamicha.com/blog/blog.cgi?mode=view&number=262
 上記URLをトリプルクリックされますと、簡単にURL全体の選択が行えます。

※以下の記事がトラックバックされます。
Namespace 小泉:偽改革
2006/01/03(Tue)14:22:19
 同じ組織で同じ名前の人間がいたら紛らわしいものです。上の名前が同じ人がいるからと、下の名前で区別しようとしてみても、やっぱり同じ名前の人が。大体、下の名前を知る機会はせいぜい名刺しかありませんし、フリガナなしの名刺だと一巻の終わりです。田中や鈴木といった名はありがちですし、地方によって多い苗字というのもあるそうです。
 ストーリーなどでも、「イリアス」はともかく「サーラ」はありがちな名前です。バッティングすると感情移入度が下がります。さすがに「騎士サーラ」が他に存在する可能性は低いでしょうが。ですから、サーラさんを呼ぶ時には「騎士サーラ」と接頭語をつけると確実に区別がつくわけです。当サイトでは今からこれを推奨することにします。ゲーム中の会話でも、キャラ名は「騎士サーラ」「剣聖ハードゥン」「聖騎士シェイン」のように表示されますし。
 ここまではともかく、さらに深刻なのがプログラミング時のバッティングです。例えばC/C++やJavaで「int」という名前の変数や関数は作れませんが、これはint型とバッティングするからです。その他、標準関数などでバッティングが起こりやすいので、既存の名前をうっかり使わないように注意する必要があります。
 ちなみに、Javaはこれを「パッケージ」の考え方で解決しています。例えば「Integer」というクラスを定義した場合、これを普通に呼び出すと自分が作ったIntegerが呼び出されることになります。しかし、Javaに用意された同名のクラスが使えなくなるわけではなく、「java.lang.Integer」と指定してやることでそちらのクラスも呼び出せます。
 といっても、パッケージ名までデタラメにつけられるようでは、これまた他とバッティングする恐れがあるため、ドメイン名を「com.yamicha.任意のパッケージ名」のように用いることが推奨されています。ドメインなら世界に1つしかないため、誰もがこの規則に従っている限り、バッティングすることがなくなります。
 さて本題。XMLにもこれと似たような機構があり、「Namespace」と呼ばれています。例えば私がブログのインデックスにXMLを使ったとして、「title」というタグが用いられている場合を考えると、これはHTMLのタイトル指定なのか、ブログのタイトルなのかが分かりません。別に分からなくても良いのですが、Namespaceでこれを解消できるとのこと。
 さて、Namespaceを使う際には、まず「宣言」なる面倒な工程を踏まなければなりません。とりあえず書いていればどんな風でも動くHTMLと違って、XMLは平気でパースエラーを投げてきますから。というわけで、宣言の文法ですが、
<Base 
xmlns="http://www.yamicha.com/default"
xmlns:ilias="http://www.yamicha.com/ilias" >
	<ilias:elementname ilias:attributename="value" />
</Base>

「Base」及び「ilias」部分はもちろん任意の名前でも可
 といったところです。まずお約束の記述として「xmlns」を用いなければならないのですが、宣言は「xmlns:ネームスペース名="URL"」のように行います。上の例のようにネームスペース名を省略すると、それがデフォルトのネームスペースになり、明示的にネームスペース名を指定しなかった時にはこれが用いられるとのことです。
 さて、上で指定されているURLですが、実は何の意味もありません。もちろんアクセスしても404エラーが返ってきます。何のために使うかといえば、これもまたURLは1つしかないからバッティングが避けられるというJavaそっくりの理由なのです。上の「ilias」というのは、いわばURLにエイリアス名をつけているようなものであって、つまりは「http://www.yamicha.com/ilias.elementname」とみなされているわけです。
 上の例の場合はデフォルトのネームスペースがありますから、ネームスペース名を指定せずに要素なり属性なりを書くと、自動的に「http://www.yamicha.com/default.elementname」のようにみなされることになります(実際にJavaのパーサもそのように認識しています)。
 ここまで分かれば十分でしょう。早速実装に参ります。色々と試行錯誤しつつ、例によって以下のようなXMLを作成しました。
<Base 
xmlns:ilias="http://www.yamicha.com/ilias" 
xmlns:sara="http://www.yamicha.com/sara">
	<ilias:Ability ilias:use="108">Conflagration</ilias:Ability>
	<sara:Ability sara:use="0">Hado-fueiken</sara:Ability>
	<sara:Ability sara:use="75">Hishu-renzan</sara:Ability>
	<ilias:Ability ilias:use="86">Resurrect Life</ilias:Ability>
	<sara:Ability sara:use="350">Soryu-kikoken</sara:Ability>
	<ilias:Ability ilias:use="126">Ruined World</ilias:Ability>
	<ilias:Ability sara:use="200">Ryufu-reigeki</ilias:Ability>
</Base>
 どれもアビリティを表すものなのですが、魔道士イリアスと騎士サーラではアビリティの性格も正反対です。ですから、イリアスさんのuse属性は消費MRを表しているのですが(消費MR量はサンプル用のデタラメです)、サーラさんにMRなんざありません。というわけで、こちらのuseは反動による消費LAを表しています。
 しかし、世の中には例外というものもありまして、魔道士イリアスといえども技が使えないわけではありません。となると、LAの方を消費するわけですが、そこで「ilias:Ability」としながら「sara:use」と記述、両方を混在させています(例の1番下のAbility要素参照)。
 これを踏まえて実装を書くと、このようになりました。
DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
dbf.setNamespaceAware(true);
// 重要。これがないとNamespaceが認識されない
DocumentBuilder db = dbf.newDocumentBuilder();

Document d = db.parse("webapps\\ROOT\\ns.xml");

out.print("消費MR\t消費LA\tアビリティ\t使用者ネームスペース\n");

Element base = d.getDocumentElement();
NodeList nl = base.getChildNodes();
for(int i = 0; i < nl.getLength(); i++){
	if(nl.item(i).getNodeType() == Node.ELEMENT_NODE){
		Element e = (Element)nl.item(i);
		out.println(
		// ilias:use(消費MR)を表示
		e.getAttributeNS("http://www.yamicha.com/ilias" , "use") + "\t" +
		// sara:use(消費LA)を表示
		e.getAttributeNS("http://www.yamicha.com/sara" , "use") + "\t" +
		// Textノードを表示
		e.getFirstChild().getNodeValue() + "\t" +
		// ネームスペースを表示
		e.getNamespaceURI());
	}
}
 見ての通りこれはJSPですから、Content-typeをtext/plainにして吐き出させるなり、preタグで囲むなりすると、フォーマット化されて表示されます。大方ご想像の通りでしょうが、以下のような出力が得られました。
消費MR	消費LA	アビリティ	使用者ネームスペース
108		Conflagration	http://www.yamicha.com/ilias
	0	Hado-fueiken	http://www.yamicha.com/sara
	75	Hishu-renzan	http://www.yamicha.com/sara
86		Resurrect Life	http://www.yamicha.com/ilias
	350	Soryu-kikoken	http://www.yamicha.com/sara
126		Ruined World	http://www.yamicha.com/ilias
	200	Ryufu-reigeki	http://www.yamicha.com/ilias
 ちなみに、言うまでもありませんが、属性名が同じでもネームスペースが違う2属性を混在することは可能です。
<ilias:Ability ilias:use="154" sara:use="255">Inclusion</ilias:Ability>
 XMLもなかなか面白いではありませんか。絶対に使う気にはなれませんが。

 Excelにも数学関数は用意されているため、昨日に続いて少しばかりベクトルの計算をしてみました。具体的には、これは色々な局面で使えそうなのですが、「跳ね返り」について。
 例えば80度の位置から物体が横の壁にぶつかった場合、反射方向ベクトルは
COS(RADIANS(80)) * -1 = -0.17
SIN(RADIANS(80)) = (約)0.98
 であり、これに物体の速度を掛け合わせたものが反射後に飛ぶベクトル及びスピードになるわけです。では、これを角度にするとどうなるのか。DeltaライブラリではACOSを使って計算しているのですが、ATAN2を使うと非常に楽であることが分かりました。
(DEGREES(
	ATAN2(
		COS(RADIANS(80)) * -1 ,
		SIN(RADIANS(80))
	)
) + 360) % 360 = 100
 つまり、100度の方向に反射することが分かります。ちなみにATAN2は180度以上の数値でマイナスを返す(185度なら-175、355度なら-5)のですが、逆に言えばマイナスの時のみ360を足すか、もしくは360を足してから360で割った余剰を求めれば、飛ぶ方向を角度で得ることができるわけです。難しい条件判定を使わずとも、上のように1行で記述することすら可能です。これが左右でなく上下の壁に反射する場合には、COSではなくSIN側の符号を反転させれば良いだけです。
 なお、三角関数は右(X 1 , Y 0)から始まって反時計回りに角度が増えていきます。それを頭の中で描いてやれば、計算が比較的容易に行えます。クイックファストのエフェクトを作った時など、時計が3時15分の位置から反時計周りに回転して驚いたものです。

 ここでお知らせなのですが、ブログのRSSの書式を変更しました。RSSリーダーをお使いの方はすぐにお分かりになったことでしょう。descriptとして記事の内容を500バイト程度まで表示するようにしてみたのですが、何といっても苦慮したのがタグの扱い方です。
 CDATAで囲んでいるため、HTMLのタグをそのまま書き出せるとはいっても、500バイト制限によってうっかり閉じタグが消えたりしては冗談になりません。それに、descriptの文字が大きくなったり太くなったりされても、HTML式のRSSリーダーなどをお使いの方にとっては大変迷惑でしょう。しかし、改行なしでは書式がぐちゃぐちゃになりますから、brだけは残したいところです。
 そこで出てきた課題が「<>以外のタグを全部削除せよ。ただし<日本語>のような明らかにタグではないものは削除しない」「文字制限に引っかかり、タグが<brのように中途半端な切れ方をした時に備え、これを消せるようにせよ」の2つです。とりあえず後者は簡単ですが、前者がなんとも。
 タグだけ消したいなら「s/<[0-9a-zA-Z\/!][^>]*>//g;」で何とかなりますし([^>]部分を.*?にすると、改行でマッチが行われないので不可。見落としがちなので注意)、これまたbrだけ残したいなら「s/<[^(?:br)][^>]*>//ig」とすれば良いわけですが、では「<br>ではなく、その上に先頭が英数字のもののみ削除」とするにはどうすれば良いのでしょう。
 探してみたのですが、あいにくカッコにOR(「|」で区切り)はあってもANDはありませんでした。だからといって、「s/<([^(?:br)]|[0-9a-zA-Z\/!])[^>]*>//g;」などと書こうものなら、「brでないもの、または先頭が英数の少なくとも片方に当てはまるもの」が削除されますので、<>で囲まれたあらゆるものが削除されてしまいます
 しばらく悩んだ挙句、トリッキーな方法を用いることにしました。分かりづらくなるばかりなので、本当は使いたくなかったのですが。「s/<(?!br|[^a-zA-Z0-9\/!])[^>]*>//ig」とすれば、「先頭がbr、もしくは英数以外の値」の場合に真になりますが、カッコの先頭で「?!」によって条件が反転されているため、「先頭がbrではなく、かつ英数であること」が条件になり、改行以外のタグのみを削除することができます。
 これでRSSも少しは読みやすくなるでしょうか。

 本日はどこの社説もなぜか「少子化」や「福祉」を取り上げているのですが、そういえば育児休暇を取らせた中小事業所に対して100万円を支給するという地域振興券並みの愚策が始まったのでした。念のために言っておきますが、事業所に対して支給するのであって、親の側には1円も入りません。それほど金が余っているのなら、いくらでも少子化対策できるというのに。
 これを発表したのがちょうど選挙の時でした。こんなザル制度、どうせまともに利用する企業の方が珍しく、育児休暇を創設すると見せかけて100万だけ取り上げる企業の方がよっぽど多いでしょうから、おそらく少子化対策を隠れ蓑にしたバラマキにより、中小企業票を呼び込む作戦だったのでしょう。このようなことをする内閣を選ぶ人間も選ぶ人間といったところです。
 この問題に関しては、あまりにバカバカしすぎてこれ以上語る気にもなれません。これは「小泉改革の代名詞」として、以前の「地域振興券」「IT革命」とともに3大愚策として語り継がれるべきものでしょう。
カテゴリ [開発魔法][社会問題][お知らせ][ゲーム開発] [トラックバック 0][コメント 0]
<- 前の記事を参照 次の記事を参照 ->

- Blog by yamicha.com -