プログラム: 2008年4月アーカイブ

plagger on windows

| | コメント(0) | トラックバック(0)
ようやくいまさらになってPlaggerを入れる。
ppm版は楽チン。

installの仕方はあちこちに載ってるので省略。
ただ、基本的に「アレンジ一切不可」と考える。
特にPerlのバージョンは新しいと動かないので注意。
本当に書かれてるバージョンのPerlを入れよう。

とりあえず、RSSをもっと高速に読みたい。。。

みんな Perl やろうよ! - IT戦記に同意。に同意。

| | コメント(0) | トラックバック(0)
大学6年生のhogelogさんによると、「perlやる人の悪い癖」らしい。

よかったこういうコード使ってとりあえず下みたいなコード送るのはperlやる人の癖なんだ!(?)

''=~('(?{'.('-/@.*{([,,@}]/^,:|\\'^']])@^\\`>@@/]*@,@^]{').'})')

と、いうわけで普通のコードはこんな記号ばっかじゃなくて普通に読めます。大丈夫。
みんな Perl やろうよ!

半角「」ってなに?

| | コメント(0) | トラックバック(0)
以前作成したphpのmail用ライブラリで文字化け発生。
内部はUTF-8なんですが、外部へ送るときはフリーメール、携帯等への
対応も必要なんでISO-2022-JPに変換してます。
で、そのまま普通に変換するとUTF-8にあってISO-2022-JPにない文字が
化けるんですが、この辺は対応表作って変換かけてます。
今回抜けてたのは以下の文字。「」の半角版。
「」
。。。こんな文字初めて知ったよ。。。

と、いうわけで急遽以前つくったライブラリに以下の行を追加。
            "\xEF\xBD\xA2" => "\xE3\x80\x8C",
            "\xEF\xBD\xA3" => "\xE3\x80\x8D",

ややマイナーなおすすめ拡張

| | コメント(0) | トラックバック(0)
・AutoCopy
文字選択時に自動でクリップボードへコピー

・AutoAuth
Basic認証を自動でログイン

・Copy Plain Text
文字をコピーするときに自動で前後の空白を削除したり、空行を削除したり

・MIME Edit
各種ファイルを開くときの規定動作を変更

・XUL/Migemo
ローマ字で漢字を検索できる。でも、それ以上に検索ツールバーのカスタマイズができるのがいいかも。「/」で検索開始したりできるようになる。

LDR eachを超えた!超高速orz_loop

| | コメント(0) | トラックバック(0)
ベンチマーク

若干制約がありますが(*1)速度だけなら負けてません。いやまじで。

//ベンチマークのコードは以下の場所からもらいました。
http://d.hatena.ne.jp/os0x/20080310/1205154454

命名

| | コメント(0) | トラックバック(0)
プログラムで面倒と思うことの8割は命名だと思う。
どこかで「日本人にすごいプログラマが少ないのは
英語での命名が億劫だから」といのをを聞きました。
確かに構文書くのは楽しいですが、命名は面倒です。
。。。
今思いついたんですが、みんなが日本語で変数名つけて
それが普通になったら日本にもすごいプログラマが増えるのかな?
プログラマを増やすには言語の敷居を下げるよりも
主な変数名一覧をつくるか、ローマ字変数名を
普及させるのが近道かもしれない。
ただ、そうすると日本語がわからない人は不便なので
主な変数名とローマ字変数名の対応表を作ってIDE等で
自動的に翻訳するとか。
。。。
と、いう話をこんなコード書きながら考えてました。
if (({'aaa':function () {return true},'bbb':function () {return
false}})['aaa']()) { console.log(true) }

LDR each

| | コメント(0) | トラックバック(0)
from JSEnumerator

いまさらながらldr(malaさん)のコードをちょっと見て感動。
JSのforeachの実装ですが、先に全実行回数の内8で割り切れない
端数の回数を一回ずつ実行し、その後loopを8回ずつ一気に実行。
(8はビット演算で計算しやすい適当な数ってことか)

function foreach(a,f){
    var c = 0;
    var len = a.length; //全実行回数
    var i = len % 8;    //8で割った端数を取得
    if (i>0) do {       //端数を実行
        f(a[c],c++,a);
    } while (--i);
    i = parseInt(len >> 3);//ビット演算子を使って割る8
    if (i>0) do {       //8回一気に実行
        f(a[c],c++,a);f(a[c],c++,a);
        f(a[c],c++,a);f(a[c],c++,a);
        f(a[c],c++,a);f(a[c],c++,a);
        f(a[c],c++,a);f(a[c],c++,a);
    } while (--i);
};
(コメント追加)

たとえば、22回実行するなら、最初1回ずつの実行を6回行い、
その後8回実行を2回行う。

見つけた元
http://coderepos.org/share/changeset/8126

ベンチマークの話
http://d.hatena.ne.jp/os0x/20080310/1205154454

ldr foreachの元ねた?のブクマ(リンク先消失)
http://b.hatena.ne.jp/entry/2100562

元はprototype.jsの.eachを3倍早くするって内容だったらしい。

MySQLのVIEWは副問い合わせがサポートされていない

| | コメント(0) | トラックバック(0)
面倒。

別にviewを使ってやればいいじゃんってことなのかな?

MTPagenateに関して

| | コメント(0) | トラックバック(0)
MTPaginateNavigator tagで使える指定一覧。
微妙になんに使ってるか不明なものもありますが、指定できる内容はこれだけ。
(これ以外は無視されます)

list_pages(初期値「all」)
format(初期値「 %d 」)
format_current(初期値formatと同じ)
separator(初期値「 | 」)
format_all(フォーマット指定)
format_all_current(フォーマット指定)
place_all(「after」か「before」を指定。初期値「before」)
style(「popup」が指定できる。初期値空)
target(linkのtarget属性)
anchor(linkのanchor属性?)
format_title(linkのtitle属性?)
format_all_title(linkのtitle属性?)

ソースチラ見したので。とりあえず書いてみる。
(<MTPaginateNavigator separator="">とか指定する)


詰まったところ

・全体の表示件数を「0」にしていない。
>全体の表示件数/MTPagenateの表示件数なので、
>全体の表示件数が初期値の10の場合ページ数がおかしくなる。

・「</MTEntries>」の前に「<$MTPaginateSectionBreak$>」が入っていない。
>「<MTEntries>」の中身をそのままコピペしたら表示されずちょっと悩む。 

ノートのバッテリー寿命を延ばす方法

| | コメント(0) | トラックバック(0)
非電源接続時にではなくて、バッテリー自体の充電可能期間を延ばす方法。

1、頻繁に充電しない
バッテリーつけたままコンセントさして使うと、ちょっとバッテリー減った段階で充電するのでよくない。

2、半端に充電しない
充電開始したら100%まで充電する。

3、低温低湿度
長期保存時乾燥剤と一緒がいいかも。

4、長期保存は50%充電
半年に一度再度50%程度まで充電。

普段注意するのは1と2、予備バッテリーとかは3、4が重要。

ちなみにThinkpadは省電力マネージャーでバッテリーの充電開始容量を選択できる。
(「nn%以下になったらnn%まで充電」とか)
とりあえず30%切ったら100%まで充電するように変更。

設定方法はタスクバーの電源アイコンを右クリックして、「省電力マネージャー」を起動。
「バッテリー情報」タブの「バッテリーのメンテナンス(M)...」ボタンをクリック。
「充電のしきい値」を「カスタム(C):」に設定して、値を「30%」~「100%」に設定。

/index.html

| | コメント(0) | トラックバック(0)
ブックマーク系のサービスでは

http://example.com/



http:/example.com/index.html

が別物として扱われるので注意。
(結構有名なページなのにtagの補完が少なくてあれ?と思った)

SQLの知らないとわからない技11

| | コメント(0) | トラックバック(0)
「知らないとわからない」は「推測しにくい」って意味で。

1、DISSTINCT

GROUP BY *の代わりに
GROUP BYは暗黙のソートがあるので遅いので、重複削除だけならこっち推奨

2、ORDER BY RANDOM()

ランダムな順番でほしいとき
PostgreSQLは不可?SQLiteはいけた

3、ORDER BY ID=10 DESC, ID

10,1,2,3,4...って並ぶ

4、HAVING

GROUP BYを使わず、HAVING単独でも使える
fromここ
理解すれば便利だけど、使いどころは難しいかも

5、UNION ALL

UNIONは重複を削除するので暗黙のソートがある(遅い)
重複していいならALLが早い

6、ANY

INの演算子を指定できる版

7、REGEXP

文字列の正規表現一致。MySQL専用
ちなみにPostgreSQLでは「~」演算子

8、CASE WHEN THEN

条件分岐。非常に便利だけど、遅いし保守性悪い系
ちなみにこれはどこでも使えるので、
「SELECT CASE WHEN age > 10 THEN '10代' WHEN age > 20 THEN '20代' ...」
こんな感じのこともできるし、
「WHERE CASE WHEN age > 10 THEN true WHEN age > 20 THEN false」
見たいなことも。
(ORDER BYでも使えるんだ。。。)

9、BETWEEN AND

「n~nの間」って感じの比較ができる。日時系でも有効
指定された境界値が含まれる(<=, >=)ことに注意

10、EXISTS

INの早い版。ただし、他の列との比較ができない
SELECT 1してる感じ(ヒットすると即終了)

11、MATCH()

全文検索MySQL専用でMyISAM依存
ほかにORACLEにもあった気がする(SQL Serverだったか?)
PostgreSQLは基本的には持ってないけど、
ほかのソフトで全文検索できるようになるはず。


ほかにRDBで詰まりそうなところ。

特殊な取得順
簡単なorder byで取得できない条件での取得は難しい
(RDB自体順番の概念がないので)

行列変換
行を列に変換するのは基本無理と思ったほうがいい。
(最大列数固定ならできるけど)
ちなみに「ピボット変換」というらしい。

あんまり使われないですが、CREATE TEMPORARY TABLEも便利。
CASE WHEN THENと同じような「最後の手段」ではありますが。。。

http://oraclesqlpuzzle.hp.infoseek.co.jp/
SQLの複雑な条件集
Oracleに偏ってますが、この辺がSQLの限界なので
各項目のタイトルだけでもざっくり見とくといいかも。

とりあえず、気になったらこまめにEXPLAINかけると勉強になる。
(でも、MySQLのEXPLAINはちょっと読みにくい)

あと、MSDNは内容まとまってて質高い。
(IBMもかなりすごいが)
ただ、サイトの使い勝手は微妙だし、がんがんURI変わるのもいただけない。

SELECT COUNT (*)

| | コメント(0) | トラックバック(0)
SQLのSELECT部分で「COUNT (*)」って感じで「COUNT」と「(*)」の間にスペースあけるとエラーになる。
(by MySQL)

何でだろう?ASとかと誤認することになるからかな?

Error populating TableName object

| | コメント(0) | トラックバック(0)
Error populating TableName object [wrapped: Unable to convert value at column nn to timestamp: nn]

$c->clearSelectColumns();
したあと、doSelect($c);してたのが原因。
(doSelectRS($c);が正しい)

AutoHotKeyでCapsLock入れ替え

| | コメント(0) | トラックバック(0)
何でできないのか疑問だったけど、ここによると言語によってscan codeが違うせいらしい。
Change Keyつかって無理やり認識させてたけど戻そうかな。。。

KeePassにファイル保存

| | コメント(0) | トラックバック(0)
KeePassのエントリーにファイルを保存できることを知る。

今まで秘密鍵とかどう管理していいかわからなかったけど、こうやって保存するんだね。
でも、これだと使いたいときはいったんどこかに保存した後ssh clientで読まないといけないから、できればボタン押したら規定ファイルへ書き出し(一定時間後削除)とかなるとうれしいな。

Orchisのvista用最新版がProgram Filesにしかinstallできない件に関して

| | コメント(0) | トラックバック(0)
旧バージョンからocsetup.exeとquimon.dllを一時的に持ってきてinstallしたらいけた。
とりあえず「/usr/bin/rc.d/Orchis」へ入れる。

ck terminal emulator ver3

| | コメント(0) | トラックバック(0)
http://www.geocities.jp/meir/cygwin_ck/
Cygwin用まともなterminal emulator

ただし、ページは404

poderosaを勧められたので見てみる。
食わず嫌いだったけど、結構いいかも。
とりあえずcygwin端末として採用。

AutoPager

| | コメント(0) | トラックバック(0)
Firefoxの拡張でAutoPager入れたら死ぬほど重くなったので
以下のファイル内の不要なエントリを削除。
C:\Users\ユーザ名\AppData\Roaming\Mozilla\Firefox\Profiles\nnn.default\
autopager\*.xml

多少は軽くなったけどGreasemonkey版のAutoPagerizeの方がいいかな。。。

WebDevelopperのView Generated Source

| | コメント(0) | トラックバック(0)
WebDevelopperのView Generated Sourceを知った。

JS等で構築後のソースが見えるので、Google Mapsの構築後のHTMLソースを見たりできる。
FirebugのHTML tabでもいいけど全文検索できたりするのは便利。

SWFObjectの引数

| | コメント(0) | トラックバック(0)
6個とか、7個の引数の順番なんて覚えられん。

var so = new SWFObject();
so.setAttribute('swf', 'flash.swf');
so.setAttribute('id', 'swf_id');
so.setAttribute('width', '100');
so.setAttribute('height', '100');
so.setAttribute('version', '8');
so.write('target_id');

ExternalInterfaceとかの落とし穴まとめ

| | コメント(0) | トラックバック(0)
自分ではまったものに関してはその後検証してなかったりするので、実は別のバグだった可能性もあります。
(そのうちちゃんとした検証ページ作りたいな)

-------------------------------------------------------

・swf tagのallowScriptAccessを(sameDomain|always)にしないとExternalInterfaceが使えない。
(同じdomainから読み込むなら「sameDomain」、それ以外は「always」)

・form tagの中にswf tagを書き出すとIEでIDを取得できない。
(jsからcallできない)

・swf tagのIDに*external*が入ってないとIEでcallできない。

・jsからcallするときにHTML Elementの値を渡そうとすると 「Error calling method on NPObject!」といわれる。

・object tagにidとnameが指定されているとFirefoxでIDが取得できない。
fromここ

・swf tagがdisplay:noneだとcallできない。
fromここ

・swf内でSystem.security.allowDomain()が正しく指定されていないと呼べない。
(どこからでも呼ばれるなら「*」、指定domainのみならそのdomein)

・flash playerが変にインストールされているとswfobjectでswfが表示されない。
fromこことかここ
(ちなみに「セキュリティの穴をつつく裏技的」ではないと思う。AC_FL_RunContentも同じようなコードだし、実装はMSも推奨してる方法)

・ローカルのファイルから読み込むとswfからJSを呼べるけど、JSからswfを呼べない。
(ExternalInterface経由のみ。vista sidebar gadgetも含む。ここ参照)

・swf tagを書き出した瞬間はExternalInterfaceを呼べない。
fromここ

・ブラウザによって改行文字が変わる。
fromここ

・safari3で「再読み込み」を行うと、dom展開前でもExternalInterfaceで登録されたfunctionがtrueになる。
fromここ

・IEでDOM展開前にASからJS呼ぶとエラー
fromここ(自分とこだけど)

相対パス、絶対パスの変換

| | コメント(0) | トラックバック(1)
var img = new Image();
img.src = '../.././././.././g.gif';
console.log( img.src );

で相対パスを絶対パスに変換できる。

ただし、変換した要素はブラウザに読み込まれるので注意。
(参照元では「読み込まれない」とあるが、firebugで読み込んでいることを確認)

from
http://blog.kyosuke.jp/2008/03/06/49

sort

| | コメント(0) | トラックバック(0)
jsのsortは数値型の要素でもとにかく文字列で比較する。
( [ 1, 11, 3, 2 ] ).sort()
>
[1, 11, 2, 3]

数値として比較するならこう。
(UFO演算子(「<=>」)がないので書きにくい。。。)
( [ 1, 11, 3, 2 ] ).sort( function( a, b ){ return ( a - 0 > b - 0 ) ? 1
: -1 } )
>
[1, 2, 3, 11]

文字型と数値型が混ざっている場合、ソートした上で元の型を保持する。
( [ 1, '11', '3', 2 ] ).sort( function( a, b ){ return ( a - 0 > b - 0 )
? 1 : -1 } )
>
[1, 2, "3", "11"]

$.each

| | コメント(0) | トラックバック(0)
jQueryのeachの書式を間違って覚えていたことが判明。
「$( [] ).each( function() {} )」ではなくて、「$.each( [], function() {} )」の方が正しいよう。
(最初の書式はjQuery objectのeachで、arrayをeachするなら後の書式)

「$( [] ).map( function() {} )」をつかってて気づいた。
(帰ってくるのがjQuery objectなのでおかしいなと思った)

でも「$.map( [], function() {} )」より、「$( [] ).map( function() {} )」の方がかっこよくて好き。
(Arrayがいるなら「$.makeArray( $( [] ).map( function() {} ) )」となって
微妙だけど)

ついでに「$.map( [], function() {} )」は「[]」の要素をargumentsとして受けるけど、「$( [] ).map( function() {} )」は「[]」の要素をthisとして受ける。
(function内の書式が違うので注意)

goto

| | コメント(0) | トラックバック(0)
$([]).each(function () {});形式のループはlabel jumpができない。

$([]).each(
$([[],[]]).each(function () {
var f = true;
$(this).each(function () {
if (this) return;
return f = !f;//ほんとはここから二段抜けたい
});
return f;
});
});

こういうときはlabel gotoがほしくなる。

結局forで書き直したけど。

本日の一行コード

| | コメント(0) | トラックバック(0)
Math.max.apply(null, new Array(1,2,3)) // -> 3
Math.min.apply(null, new Array(1,2,3)) // -> 1

二行だけど。

単純にMath.max、Math.minを使うと固定個数の数値からしか取得できないけど、applyとあわせると任意個数の配列内から取得できるので便利。

最速の辺からぱくってきた気がする。

jQuery.getJSON

| | コメント(0) | トラックバック(0)
$.getJSONはJSONとして解析不能な値が返るとcallback functionを呼んでくれない。
エラーも出ずに単純に呼ばれないだけなので要注意。

btoa

| | コメント(0) | トラックバック(0)
Firefoxにはwindow.btoaなるものがあるらしい。

> >バイナリデータの文字列から Base-64 エンコードされた
> > ASCII 文字列を生成します。

組み込みでBase-64エンコードできるのか。すごいな。

http://developer.mozilla.org/ja/docs/DOM:window.btoa

AutoHotKey

| | コメント(0) | トラックバック(0)
vistaにmayu入れるとIE7が起動しなくなるらしい。

そういえば前に入れたときもそんな症状あったな。。。
「これだからvistaはっ!」とかいってたけど、mayuのせいだったのかも。ごめんよvista
(IETabやSleipnierは普通に動いたのでそんなに困らなかった)

と、いうわけでAutoHotKeyへ移行予定。
とりあえずinstallしてIE7が動くことは確認。
ただ、設定ファイルがmayu以上に意味不明なんだよなぁ。。。

jQuery plugin project ScrollTo

| | コメント(0) | トラックバック(0)
今までライセンス的にinterface.js使ってたけど、
jQuery1.1系にしか対応してなかったので微妙だった。

jQuery ScrollToがあるのは知ってたけど、
ライセンスがGPLなので避けてた。

が、こないだ見たらライセンスがGPL+MITになったらしい。
いっそ自分で書こうかと思ってたけど、
これで安心して使える。

個人的にはGPL好きなんだけど、
JSで使うとどこまでGPLになるのかわからないので不安。
(HTML本文は違うと思うけど、マークアップ部分は?とか、連携するswfは?とか)

http://plugins.jquery.com/project/ScrollTo

jQueryで実elementがほしいとき

| | コメント(0) | トラックバック(0)
$('#id').get(0);

$('#id')[0]よりきれい。

続: doSelectRSをHashで受ける

| | コメント(0) | トラックバック(0)
doSelectRSをHashで受ける

こんな方法も教えてもらった。
(リファレンスはここ
許容範囲か。

$c->addSelectColumn(TableNamePeer::ID);
$result = array();
$rs = TableNamePeer::doSelectRS($c);
$rs->setFetchMode(ResultSet::FETCHMODE_ASSOC);
while ($rs->next()) {
$result[] = $rs->getRow();
}
var_dump($result);

Criteriaで素のSQLを見る

| | コメント(1) | トラックバック(0)
from Propel Tips

$c->toString();

デバッグモードよりこっちのほうが分かりやすくていい。
この程度のことをフレームワークごとに覚えるなんてやってられん。

doSelectRSをHashで受ける

| | コメント(0) | トラックバック(1)
$result = array();
$columns = $c->getSelectColumns();
$rs = TableNamePeer::doSelectRS($c);
while ($rs->next()) {
    $line = array();
    for ( $i = 0; $i < count($columns); $i++ ) {
        $column = preg_replace('/^\w+\./', '', $columns[$i]);
        $line[$column] = $rs->get($i+1);
    }
    $result[] = $line;
}
var_dump($result);

これは標準methodでやってくれないかなぁ。。。
あるけど知らないだけ?

Invalid resultset column

| | コメント(0) | トラックバック(0)
最近Symfonyさわり中。

$c->setDistinct();
$c->clearSelectColumns();
$c->addSelectColumn(TableNamePeer::ID);
$result = TableNamePeer::doSelect($c);

こういうコード書いたら下みたいなエラー出た。

Error populating TableName object [wrapped: Invalid resultset column: 1]

doSelectじゃなくて、doSelectRSで受けないとだめらしい。
ぐへー

ってか、propelとcriteriaの役割が分からん。DBIとDBDに置き換えて説明してくれ。

ThinkPad T61

| | コメント(0) | トラックバック(0)
買った。
ThinkPad T61 7662NRJ

20万くらい。
Let's Note Y7と悩んだけど、
「軽いと筋トレにならない」との画期的意見で決定。

保守マニュアルPDF

このアーカイブについて

このページには、2008年4月以降に書かれたブログ記事のうちプログラムカテゴリに属しているものが含まれています。

前のアーカイブはプログラム: 2008年3月です。

次のアーカイブはプログラム: 2008年5月です。

最近のコンテンツはインデックスページで見られます。過去に書かれたものはアーカイブのページで見られます。

ウェブページ

Powered by Movable Type 4.1