文字列⇔数値文字参照相互変換ページ

Posted on

数値実態参照というのは、HTMLやXMLで直接記述できない文字を記述するための方法です。HTMLを書いた事のある方は、一度は「&」とか「<」とか見たことがあるんじゃないでしょうか。これらはHTMLのいわゆる”タグ”を表記したりするのに使うので、直接書くとタグの一部なのかどうか区別が付かなくなっちゃいます。だから、このように迂回して書くことで混同されるのを避けます。

HTMLやXMLには「&」を「&」と表すだけでなく、「&」と数字で表すこともでき、前者を文字実体参照、後者を数値文字参照と呼びます。前者の文字実体参照では表せる文字は限られますが、後者の数字文字参照ではUNICODEで表せる文字ならどんな文字でも表すことができます。

今回はこの文字と数値文字参照の相互変換、つまり「☆」を「☆」に変換したり、逆に「♡」を「♡」に変換したりしてくれるスクリプトです。たまに使う、かつありそうで無いスクリプトだったので昔作ったやつを公開します。

20110113.png

サーバは停止中

Posted on

 本日、地震が発生しました。無駄な電力の使用を抑えるため、サーバは停止とさせていただきます。アニメもやってないしつける理由無いさね。

 おっ、こちらでの最後の投稿は去年の昨日(?)だったんですね。なんか感慨深い。

rails2.xの**_remoteをrails3.xに機械的に移植するには

Posted on

 「UFO大好き霊子さん」をRails2.x系から3.x系に移植するに当たってぶち当たった問題のひとつです。かなり汎用性のある内容と思われるので、今回こちらにメモしておきます。

 めんどくさい人は最後だけ見てね。

rails2系でのお手軽Ajax

 Rails2系では、こんなヘルパを書くことで簡単なAjax通信ができます。

<%= link_to_remote 'イイネ!', :url => {:controller => 'votes', :action => 'create', :moderate => 'yes', :post_id => @post.id}, :update => "post_voting_#{@post.id}" %>

 こうすることで、’イイネ!’というリンクが現れます。これをクリックすると、VotesコントローラのCreateアクションがpost_idとmoderate=yesというパラメータで呼ばれ、その結果が”post_voting_#{@post.id}”というIDを持つ要素のinnerHTMLに書きこまれます。殆どJavaScriptを意識すること無く書けるので、とても便利で楽でした。

rails3系では”:remote=>true”で出来ると言うものの…

 rails3系では「link_to_remote」が廃止され、代わりに「link_to」に:remote=>trueというオプションが加わりました。が、完全互換ではなく、:updateオプションはありません。

 rails3.x系で正攻法で今までと同じことをするには、ビューの元の部分を

<%= link_to 'イイネ!', {:controller => 'votes', :action => 'create', :moderate => 'yes', :post_id => @post.id}, :remote=>true %>

 と書き換え、さらにこの上でVotes#createがJavaScriptをrenderして返さなければなりません。たとえば、”view/votes/create.js.erb”を作って、

Element.update($("post_voting_<%= @post.id %>"),'投票ありがとう!');

 みたいな感じですね。正直めんどくさい。

移植のため、Prototype.jsだけで機械的になんとか移植するには!

 正直めんどくさいので、最小の手順でなんとかしましょう。Rails3系では、JavaScriptとHTML部分が完全に分離され、上記のlink_toで:remote=>trueをしても出力されたHTMLにはこのようにJavaScriptは一切含まれていません。こんな出力です:

<a href="/votes?moderate=true&amp;post_id=1" data-remote="true" rel="nofollow">イイネ!</a>

 ではどうやってJavaScriptで通信してるのかというと、rails.jsを見ればわかりますが、”data-remote”が指定されてる要素に対して”click”イベントハンドラを追加することで処理しています。こんな感じ:

document.on("click", "a[data-remote]", function(event, element) {
if (event.stopped) return;
handleRemote(element);
event.stop();
});

 で、Ajax通信がとりあえず終わったらajax:competeイベント、成功するとajax:successイベントが、失敗するとajax:failureイベントが投げられます。rails.jsのイカの部分でゲソ:

function handleRemote(element) {
(略)
new Ajax.Request(url, {
method: method,
parameters: params,
evalScripts: true,
onComplete:    function(request) { element.fire("ajax:complete", request); },
onSuccess:     function(request) { element.fire("ajax:success",  request); },
onFailure:     function(request) { element.fire("ajax:failure",  request); }
});
(略)
}

 じゃ、このイベントを活用すれば良いんじゃなイカ?というわけで、イベントを追加して結果を流しこめばおk。こんなのをapplication.jsにでも追加しましょう:

document.on("ajax:success", "a[data-remote]", function(event, element) {
alert(event.memo.responseText); //結果が出てくる
});

 あれ?結果を書きこむ先は?

 link_toでは任意の属性を出力される要素に追加することができるので、これを使いましょう。また、createはpostメソッドなので、それも指定します。

<%= link_to_remote 'イイネ!', {:controller => 'votes', :action => 'create', :moderate => 'yes', :post_id => @post.id}, :remote=>true, 'data-update'=>"post_voting_#{@post.id}", 'data-method'=>:post %>

 application.jsではこのようにして結果を書き込みます:

document.on("ajax:success", "a[data-update]", function(event, element) {
Element.update($(element.readAttribute('data-update')), event.memo.responseText);
});

 これで目的は達成されました。

手順まとめ

1:link_to_remoteは廃止されたので、link_toに書き換えて:remote=>trueを追加する。

 URLオプションの渡し方も微妙に変わってるので注意†1。:updateは’data-update’に変更し、アクションがpostの場合は’data-method’=>’post’も末尾に追加。

<%= link_to_remote 'イイネ!', :url => {:controller => 'votes', :action => 'create', :moderate => 'yes', :post_id => @post.id}, :update => "post_voting_#{@post.id}" %>

を、次のように変更します。

<%= link_to 'イイネ!', {:controller => 'votes', :action => 'create', :moderate => 'yes', :post_id => @post.id}, :remote=>true, 'data-update'=>"post_voting_#{@post.id}", 'data-method'=>:post %>

2:application.jsにこんな内容を追加する。

document.on("ajax:success", "a[data-update]", function(event, element) {
Element.update($(element.readAttribute('data-update')), event.memo.responseText);
});

以上です。Rails3のAjaxでHTMLを返してjQueryで処理する – とはえ領域を参考にしつつ、jQueryを使わない方法を模索しました。

  • †1: link_toが三つ引数を取るようになり、その二つ目がurlオプション

オカルト共有サイト「UFO大好き霊子さん」、完全復活のお知らせ

Posted on

運命の2012年まであと10ヶ月、霊子さんが帰ってきたぞっ!

 2009年に開始したしばらく後、アップデートがめんどくさいという諸事情により停止していた世界初?のオカルトスポット共有サイトUFO大好き霊子さん」ですが、2012年に世界が崩壊すると聞いて霊子さんも黙って居られなくなったようです。今回、URLも移転しながら完全復活と相成りました。

 立ち絵も得た霊子さんの活躍に刮目せよっ!イラストはりあたんです。

20110226.png

ついに立ち絵を得た霊子さん!

20110226reiko.png

 前述の通り霊子さんのキャラクターデザインは友人のりあたんがやってくれました、ありがとー!

 霊子さんは…えーと…なんか昔私が注文時に語った中二設定が有った気がしますが覚えてません!輪廻転生がどうとか運命がどうとかそんな感じの設定だったと思います!

 霊子さん初公開は私の大学受験の直前だったんですね。そりゃ落ちるわ。

GENETOSの音楽を聞こう!-“Oreshiki Decrypter”

Posted on

 なんか最近プログラミング・STGネタを投稿しなさすぎなので、たまにはそっち方面を投稿するテストw

 進化するシューティングゲーム”GENETOS”が最近一番の個人的ヒット作です!ゲームシステムがゲーム進行にあわせ進化してくという発想の斬新さ、STGの歴史をうまくまとめ上げた構成力、ドラマチックな演出、遊びやすい難易度…。そしてBGMです!特に最終面のBGMはステージ演出と相まって最高です!

 今回、そのGENETOSのBGMや画像ファイルに掛けられてる暗号を解除するツールを作成しました。ソースつき。

 また、このツールを利用することで、BGMを暗号化することもできます。BGMの差し替えも可能です!(※制限あり、後述)

ダウンロード

 ライセンスはGPL3です。(アーカイブ内のLICENSE.TXTを参照)

使い方

 GENETOSの、bgmフォルダ内の”○○○.mp3.ore”ファイル、または”○○○.mid.ore”を”oreshiki.exe”にドラッグアンドドロップすると同じフォルダに復号化されたファイルがでてきます。同様に、img内の.oreファイルも復号化できます。

20110123_01.png

 なお、soundフォルダ内に入っている効果音ファイルは実は暗号化されてないので、.wav.oreを.wavに変更するだけで再生することができます。

解説

 ファイルの先頭128バイトを、”oreshikioreshikioreshiki…..”という”oreshiki”がぐるぐると連続する文字列とxorを取っただけです。つまり、ファイルの大部分は平文ですw

 これを、再生直前に復号化して、再生が終わったら再び暗号化して再生できないようにする、という方法で暗号化しています。たぶんライブラリがメモリ上に展開されたmp3ファイルの再生に対応していなくて、その仕様と妥協しあった結果、でしょうか?

BGM差し替え

 .mp3ファイルや.midファイルをこのソフトにドラッグアンドドロップすることで暗号化することもできます!このソフトで暗号化したファイルを、元のBGMのファイルと入れ替えることでBGMの差し替えを行うことができます。

 ただしファイルフォーマットのチェックがシビアなのか、にこさうんど#等、ネット上から拾ってきたmp3はそのままでは再生に失敗することも多いので、一度wavに戻してからlame等で再エンコードして使うのを推奨します。

 さらに、この方法ではステージがmidiのステージはmidiのファイルで、mp3のステージはmp3ででしか差し替えることができません。プログラムを書き換えれば可能で、一応そのための改造パッチも作ってあります。もう少しテストした上で公開できそうなら公開する予定ですが、いつになるやら。