最近の更新

関連


その他いろいろ

MODxでつくる! 最強のCMSサイト カバー
MODxでつくる! 最強のCMSサイト

はやくMODx 2.0でないかなあ

Android機を買ってPCと連携させる場面が増えてきました。ネット越しにデータをやりとりしてもいいのですが、一過性の物だったり、自分以外の人に提示する必要があったりした場合にはQRコードが便利です。

Google Chart APIを用いると簡単にQRコードが作成できるようなので、ひとつ試しにテキストエリアの文字列をQRコード化するページを作ってみました。

text2QR

テキストをペーストするか、Ctrl+Enterを押すか、3秒経つとQRコード化が行われます。一文字入力するごとにやっても良かったのですが、負荷が掛かりそうなのと、実際は入力→撮影まで時間がかかる筈なので、最後の3秒ルールでなんとかなります。

試しに置いておきますが、将来予告無く仕様やURLやらが変わる可能性があります。

参考:

jQueryを利用してHTMLのテキストエリアの高さを行数にあわせて自動調整してくれるプラグイン、autoResizeというものがあります。

jQuery plugin: ‘autoResize’ – James Padolsey

今までPukiWikiの編集画面はスクロールしにくく使いづらいと感じていたので、即組み込みます。PukiWikiは1.4.7を使用。

$ cd pukiwiki
$ wget 'http://james.padolsey.com/demos/plugins/jQuery/autoresize.jquery.min.js' -O autoresize.jquery.min.js
$ wget 'http://code.jquery.com/jquery-1.4.2.min.js' -O jquery.min.js

そして以下のパッチを適用。lib/html.phpとskin/pukiwiki.skin.phpを変更します。

diff -ur lib/html.php lib/html.php
--- lib/html.php 2010-06-23 02:04:17.000000000 +0900
+++ lib/html.php 2010-06-23 02:17:21.000000000 +0900
@@ -245,7 +245,11 @@
   <input type="hidden" name="cmd"    value="edit" />
   <input type="hidden" name="page"   value="$s_page" />
   <input type="hidden" name="digest" value="$s_digest" />
-  <textarea name="msg" rows="$rows" cols="$cols">$s_postdata</textarea>
+  <textarea id="expandingmsg" name="msg" rows="$rows" cols="$cols">$s_postdata</textarea>
+  <script type="text/javascript">
+  $('textarea#expandingmsg').autoResize({limit: 9000});
+  $('textarea#expandingmsg').keydown();
+  </script>
   <br />
   <div style="float:left;">
    <input type="submit" name="preview" value="$btn_preview" accesskey="p" />
diff -ur skin/pukiwiki.skin.php skin/pukiwiki.skin.php
--- skin/pukiwiki.skin.php       2010-06-23 02:04:18.000000000 +0900
+++ skin/pukiwiki.skin.php       2010-06-23 02:14:49.000000000 +0900
@@ -79,6 +79,8 @@
  <link rel="stylesheet" type="text/css" media="screen" href="skin/pukiwiki.css.php?charset=<?php echo $css_charset ?>" charset="<?php echo $css_charset ?>" />
  <link rel="stylesheet" type="text/css" media="print"  href="skin/pukiwiki.css.php?charset=<?php echo $css_charset ?>&amp;media=print" charset="<?php echo $css_charset ?>" />
  <link rel="alternate" type="application/rss+xml" title="RSS" href="<?php echo $link['rss'] ?>" /><?php // RSS auto-discovery ?>
+ <script type="text/javascript" src="jquery.min.js"></script>
+ <script type="text/javascript" src="autoresize.jquery.min.js"></script>

 <?php if (PKWK_ALLOW_JAVASCRIPT && $trackback_javascript) { ?> <script type="text/javascript" src="skin/trackback.js"></script><?php } ?>

コメント欄にある通り、autoResizeの後で

$("textarea#expandingmsg").keydown();

をしないと、元々長いテキストに関しては初期状態ではサイズが不適当になります。

モバイル機器でビデオを撮影しリアルタイムで配信/保存して公開できるサービス、Qikのビデオのダウンロード方法。

Python2.6で以下をqik_download.pyとして保存。

#!/usr/bin/python
# -*- coding: utf-8 -*-
import re
import urllib2

def get_streamID_for_uri(uri):
        streamID_parser = re.compile(ur'href="http://qik.com/swfs/qikPlayer[0-9]+\.swf\?streamID=([0-9a-f]+)', re.M)
        body = urllib2.urlopen(uri).read()
        streamID = streamID_parser.search(body).group(1)
        return streamID

def get_download_uri(video_uri):
        streamID = get_streamID_for_uri(video_uri)
        flv_uri = 'http://qikimg.com/download/%s.flv' % streamID
        return flv_uri

if __name__=='__main__':
        while True:
                video_uri = raw_input('input your qik video URL > ')
                print get_download_uri(video_uri)

こんな感じで使います。

$ python qik_download.py
input your qik video URL > (ここでビデオのURLを入力) http://qik.com/61xxxx/32xxxxx
http://qikimg.com/download/12xxxxxxxxxxxxxxxxfae.flv
input your qik video URL > ^C (終了)

出力されたURLをブラウザなどで開いて保存します。

クリップボードを監視し、コピーされた語句で検索・バルーン表示するClipDic v1.1.0を公開しました。
.NET Framework 3.5以上が必要です。

今回のアップデートでクリップボードの行数、文字数、単語数をカウントする機能を追加しました。文字数制限を確認しながら就活のES書く際などに便利です。

screen shot

長い作業をしているシェルスクリプトをうっかりCtrl-Cしてしまって悲しい思いをすることはよくあります。

簡単な対処法としてSIGINTを無視するtrap '' 2をスクリプトに加えるというものがありますが、
常に無視されるというのも本当に終了させたいときに手間なものです。(Ctrl-Zでサスペンドしてkill -9など)

そこで、一度Ctrl-Cを押すと本当に終了して良いか質問した上で終了/続行するスクリプトを使ってみます。
(1/26 複数のシグナルを指定すると狂うバグがあったので修正しました)

以下、sigconfirm.sh

#!/bin/bash

# trap handler
function traphandler() {
  # disable SIG* inside this handler
  trap '' $@
  echo -n "Are you sure to quit? [y/n] "
  read c
  if [ "${c/Y/y}x" == 'yx' ]; then echo 'quit'; exit 1; fi
  echo 'continue.'
  trap "traphandler $*" $@
}

# register trap handler for SIG*
trap "traphandler $*" $@

これを自分のスクリプトでsourceすると、

#!/bin/bash

source sigconfirm.sh 2

while :; do echo ':'; sleep 1; done

(引数2は補足するシグナルの種類。source sigconfirm.h 1 2 3 15 のように複数指定できます)

以下のようになります。

$ ./testsigconfirm.sh
:
:
^CAre you sure to quit? [y/n] n
:
:
^CAre you sure to quit? [y/n] y
$

普通にtrapした場合、trap内部の処理中にまたCtrl-Cが押されると終了してしまうのですが、ここではハンドラの内部ではSIGINTを無視するように設定しているため、Ctrl-Cをうっかり連打してしまっても落としてしまうことがありません。

シェルを使っているとテンポラリのディレクトリやバックアップ用tar.gzの作成などで日付を入力したくなることがあります。

一々時計を見て入力するのは面倒で非効率。ここは自動的に入力させたい。
そしてzshの強力な履歴補完を考えると、日付文字列そのままを挿入するより、

$(date +%Y%m%d)

を入れてくれた方が再利用できて助かります。

以下の数行を.zshrcにコピペしましょう。F5でYYYYmmddに展開されるdateコマンド置換が挿入されます。


# insert `date` for YYYYMMDD on F5
function insert_date {
  LBUFFER=$LBUFFER'$(date +%Y%m%d)'
}
zle -N insert_date
bindkey '^[[15~' insert_date

zshでファンクションキーをbindkeyする方法が分からなくて困りましたが、普通にシェル上でC-V F5と押せば^[[15~とでたので、それを使ってみました。

LinuxのWiiリモコン(Wiimote)用ライブラリ、CWiidを用いて、音楽プレーヤSongbirdをコントロールするスクリプトを書いてみました。

操作方法

操作はきわめて単純です。

python wiimote-songbird-*.py

とすると監視プログラムがforkされるので、あとは1+2同時押しで接続し、適当にボタンを押して操作するだけ。電源ボタンを長押し(4秒くらい?)で切断し、再び接続待ちに入ります。

ボタンと動作の対応表

キー 動作
上/下 音量 +/-
左/右 次の曲/前の曲
B 再生・停止トグル

スクリプトのダウンロードはこちらから: wiimote-songbird-20090907.py
MIT Licence. Python 2.5.2, CWiid 0.6.00で動作確認しています。

ExactAudioCopy等でCDをリッピングする際、freedbに曲情報がないとCUEのタイトルなどが空欄になってしまいます。

その後mp3に変換した後で曲名などを設定しても、元のCUEにもそれを反映させるのは結構面倒です。

mp3tocue.py は、「タグ設定済みのmp3」から「対応するタグなし/不完全なCUE」にTITLEとPERFORMER情報をコピーするためのPythonスクリプトです。

mp3tocue-0.1.1.zip をダウンロード

python mp3tocue.py -t -e utf-8 -i CDImage.cue --in-place C:\Music\test\*.mp3

のようにすると、*.mp3のタグを読み出し、トラック番号順に並べ(-tオプション)、UTF-8で(-eオプション)、CDImage.cue を更新します。

-tを指定しなければ入力mp3を指定した順に、-eを指定しなければエンコーディングは元々のCUEのエンコーディングと同じになります。

※トラック長はCUE中のものを流用する必要があり、一からCUEを作り出すことはできません。あくまで曲/奏者情報の書き換えに特化しています。

2009 07 24

テンプレート

最近boost::mplに興味を持って、ちょっと色々試しています。

Base::template tmp<0>::get()

なんていう気持ち悪い場所にtemplateが書けるなんてのもここ数日で知りました。

それでテンプレートを使って、TI_0, TI_1, …, TI_n の入力型を処理してTO_0, TO_1, …, TO_m の出力型を吐くような、functionもどきを作ったりしています。

主に画像処理に使う目的(つまりTIとかTOには画像が入る)で書いていますが、
単に画像だけならvector<shared <IplImage> >+仮想関数とかでいいわけです。
ところが時々特徴点集合とか整数値とか、画像じゃないものも受け渡す必要がでてきます。

これらを全部同様に扱えるようにというひねくれた目標を掲げたら途端にテンプレートの世界へ…
だんだん慣れてきて、クソ長いコンパイルエラーもなんとか意図するところがわかるようになってきました。

ちなみにその画像処理ライブラリはテンプレートのコンパイル時inline展開の恩恵に与れているようで、結構面倒な処理を渡しても30fpsカメラで27fpsくらい出ています。

しかしcvShowImageまわりがマルチスレッドで微妙な挙動を示すのには参りました。どうやらcvNamedWindowとcvShowImageは同じスレッドで起動しなくてはならず、cvShowImageはメインスレッド(というかcvWaitKeyスレッド?)でコールしないと画像が表示されない等など。ちょっとソース見たわけではないので怪しい経験則ですが、暇があったらちゃんと読んで調べておこうと思います。
目下の所は全処理スレッドが完了するのを待った後でcvShowImageだけメインスレッドに回しています。若干汚い。

ソースコードを編集しているときにありがちな状況として、一行の先頭や末尾にはそれほど興味がないが、中央付近を編集したいというものがあります。

例えば、今次に示す行の先頭にカーソルがあるとします。

  cord.set_slot(0, boost::shared_ptr<PipelineCallback<Image> >(new PipelineCallback<Image>()));

ここでshared_ptrの中身を書き換えたい場合、ちょっと思いつくだけでも

  1. 検索する /Pi<CR>
  2. カギ括弧へ移動して右 f<l
  3. Pへ移動する fP
  4. 11番目の単語に移動する 11w
  5. カラム指定 37| (エルでもいいけどパイプ)
  6. lllllllllllllllllllllllllllllllllllll

など様々な方法がありますが、2,3,4,5は確実性・直観性に劣り、1はタイプ数に劣り、6はvim使いとして許されざる入力です。この中なら一番まっとうなのは検索でしょうか。
fやtは明らかに次に何処に行くか分かっていれば使い出がありますが、ひとたび変な場所に飛ばされると混乱するのが常です。(vim歴が浅いだけかも知れませんが)

そこで、ここは自分をはじめとする脳の緩いvimユーザのために、最後の6. lllllllllllllllllllllllllllllllllllllに活路を見出そうと思いました。

37回もlをキーリピートするかわりに、最初に行の中央に移動してからlなりhなりで目的の場所へ行こうという方法です。

幸いvimにはvirtualedit/virtcolという、見た目の文字幅を考慮する仕組みが備わっているのでこれをそのまま利用します。

noremap <expr> gm (virtcol('$')/2).'\|'

元々のgmは画面幅に対して中央になるように、カーソルを水平移動するキーですが、あまり使いそうも無いので上書きしてしまいました。

次のページ »