プログラム

ったく。

寝れないので仕方ないので本日巷で話題のGoogle Chart APIを使ってみた。
お約束通り、自作のフィードリーダ(http://feeddown.sakura.ne.jp/)のトップページでグラフを書かせてみた。
最近10日間の回収フィードアイテム数を表示するというもの。あっという間に書けてしまった。
すごくシンプルだけど使い勝手がよくて用途も多いのではないだろうか。
というか、いままでいろんな言語のライブラリとかでグラフ出力できるものがあったけど、選ぶとしたらこちら使ってしまいそうだ。

とりあえず。

動き始めたので...。
http://feeddown.sakura.ne.jp/intro/?account=hideack
ちょっといろいろ変えたいところはあるのですが、とりあえずということで。
購読しているフィードで、おもしろい!とか、これいい!という記事があったらすぐに紹介できる仕組みを作りました。
将来的にはここからコメント付きでRSSなりAtomなりを派生生成させたいなぁ。

MySQLでLIMITとOFFSETは併用できない。

テーブルの6行目から10行分抽出とかというクエリーを発行したいとき、

SELECT * FROM table名 LIMIT 10 OFFSET 5;

と書きたくなるところだが、MySQLの場合は、

SELECT * FROM table名 LIMIT 5,10;

と書く。
OFFSET指定は先頭が0開始。

shortcut.js

JavaScriptで簡単にキーボードのショートカットを実装するためのライブラリ "shortcut.js"
シンプルで且つ激しく便利。使い方は、見ての通り。

shortcut.add("r",function() {
alert("rが押されました");
},{
'type':'keydown',
'propagate':true,
'disable_in_input':true,
'target':document
});

第1引数はショートカットの定義。"Ctrl+C"といった書き方もできます。
第2引数はショートカットが実行された場合の処理内容。
第3引数は設定用のパラメータを含めたArrayを渡す。
Arrayの詳細は

  • type:String
    • 種類は'keydown','keyup','keypress'の3通り。指定が無い場合は'keydown'となる
  • disable_in_input:Boolean
    • 入力フォームであるINPUT要素にフォーカスがあっているときにショートカットを有効にするか否かの設定。指定しないとfalse
  • target:DOM Node
    • 指定しないとdocumentが指定されます。

もっとも、おそらくページを見れば全てわかるでしょう...。
あと久しぶりに技術的なこと書いた。

sakuraサーバ

今年の3月くらいから自作feedリーダーが動き続けていて、細々と作って細々と利用しているのだけど、そういえばどのくらいの量なのかな。と思い調べてみた。

mysql> SELECT COUNT(*) FROM FEED_DATA;

                      • +
COUNT(*)
                      • +
17074
                      • +

1 row in set (0.01 sec)

件数で17000かぁ。
容量にして24Mbyte程度。まだ全然少ないな。
記事が一定量以上たまったら検索の方法で少し試みたいアイディアがあるので試してみる予定。
「この考え方、結構おもしろいかも。」と、私が思うくらいなので世界には1000人(いや、それ以上)同じことを考えている人はいるだろう。きっと。ただ、手を動かすのがそのうち何人居るか知らないけど。それと、肝心な「実用になるのか!」という大きな問題もあるが...。

あと、もしこのフィードリーダーを使ってもらえる人*1が自分以外にも出てきたら、そこでも試してみたいことがあったり。
試したいことはたくさんあるのだけど、実力が追いつかず。修行が足りない。

…ふと思ったが、これはナンなんだ?仕事ではないしな。趣味か?

*1:相当忍耐強い人でないと無理である

VisualStudio2005の文字コード

扱いのデフォルトはUNICODEなのですね。
なので、プログラムの中でWindowsのクリップボードに文字列をコピーしなければならない時は、

SetClipboardData(CF_TEXT, strSource);

では無く、

SetClipboardData(CF_UNICODETEXT, strSource);

としなければならない。*1
google等の検索エンジンで「クリップボード VC コピー」などとやると、VisualStudio2005以前の例が多いので、CF_TEXTを使っていることが多いが、これをそのままVS2005でやるとコピーできない。

*1:プロジェクトの設定で使用する文字コードを切り替えれば問題ないけど、デフォルトはUNICODEになっている

MFCでチェックボックス制御

いつか調べていた気もするが再び忘れていたのでメモ。
VC++MFCを使ったプログラムのいて、IDC_RADIO1, IDC_RADIO2, IDC_RADIO3とラジオボタンにIDが振ってあり、IDC_RADIO2をデフォルトとしてあらかじめラジオボタンで選択した状態にしておきたい場合。

CheckRadioButton(IDC_RADIO1, IDC_RADIO3, IDC_RADIO2);

と、書けばよい。
あと、クラスウィザードでラジオボタンそれぞれに変数を割り当てる場合はあらかじめグループ化を行わないとNG。

YoutubeのURLの配列→MP4自動変換

気を紛らわせるためと勉強にコーディング。
プログラム中の配列にYoutubeのURLを貯めて作ったプログラムの引数に渡すと動画ファイルをサイトから取ってきてffmpegでMP4に変換して保管するプログラムを書いた。*1
あとは、URLをソーシャルブックマークRSSから取ってくる様にして、変換したMP4を自宅内のみからアクセスできるコンピュータからRSS生成してPodCastさせる*2様にすれば普段ブックマークしておいたYoutubeのリストからiTunes登録, iPod同期まで自動的にできる様になって結構楽しいかも。

いや、もっとも、そもそもうまくいくのかわかんないけど。…。と、今一度試したらうまく動かなくなってしまった。ううむううむ。

*1:厳密には以前書いていたの改良か...

*2:外に見せるとあまりよくない気がするので...

Ethnaのフォームヘルパ

EthnaにはフォームヘルパがあるのでActionFormに定義した内容を基に自動的にHTMLタグ(formとかinput)を出力してくれるのだけど、Ethnaのバージョンによる出力内容で少しトラブったのでメモ。
なお、元々書き方が甘かったということを前提に書きます。
しかも、今の最新バージョンは2.3.2であることを併せて書いておきます。(なぜか2.3.1と比較...)

早速。
ActionFormでは次の様に定義。

<?php
$form = array(
'hoge' => array(
'type'        => VAR_TYPE_STRING,
'form_type'   => FORM_TYPE_TEXT,
// 以下省略
),
);
?>

で、テンプレートに次の様に書くと...

{form ethna_action="main_foo"}
{form_input name="hoge"}
{/form}

HTMLヘルパが解釈してHTMLを出力してくれるのだけど、この出力結果がEthnaのバージョンによって微妙に違った。
Ethna2.1.2(class/Ethna_SmartyPlugin.php (rev1.14))のときは、

<form action="" method="post">
<input type="hidden" name="action_main_foo" value="true">
<input type="text" name="hoge" value="" />
</form>

これが、Ethna2.3.1(class/Ethna_SmartyPlugin.php (rev1.21))では、

<form method="post">
<input type="hidden" name="action_main_foo" value="true">
<input type="text" name="hoge" value="" />
</form>

となっていた。action属性がテンプレートに「{form ethna_action="main_foo" action="index.php"}」などと明記しない限り出力されなくなった。
一応、Ethna本体のソースを読むと、2.1.2の頃は、

<?php
// class/Ethna_SmartyPlugin.php (rev1.14)の一部
if ($action !== false) {
if (isset($action) == false) {
$action = basename($_SERVER['PHP_SELF']);
}
$s .= sprintf(' action="%s"', htmlspecialchars($action, ENT_QUOTES));
}
?>

となっていて、未指定の場合でも入る様になっていたのだけど、レンダラをSmarty以外にも使える対応が行われたとき修正された?のかもしれない。
もっとも自分がテンプレートにきちんとactionを明記しておくべきなのだけど、うっかり抜けている箇所があった…。と。
で、これでEthna2.1.2をEthna2.3.1に上げたときに一般のPC向けブラウザだと確認した限りでは問題なく動いてたり。
(ドキュメントを開いたコントローラと同じ箇所にaction属性が指定されたことになるみたい?)
ただ、問題があるのがケータイ。
iモード用ブラウザだと、出力HTML中にformタグにaction属性が抜けていると、formタグに挟まれた間にあるinputタグで表現される入力フォームが全く表示されない。(PCブラウザだと出力される)
2.1.2の頃は未記述でも空の「action=""」という属性がformタグに出力されていたので表示されていたのかなぁ。

ともかく、フォームヘルパで{form}と書くときにはactionを必ず指定する様にしたいと思います。。。