2009-10-31

MySQL: 涙が出そう・・・

最近、MySQLを使っている。自分用ではない。自分用なら間違いなくPostgreSQLを選ぶと思う・・

MySQLは他のRDBMSと違って、SQLにくせがある。拡張SQLというか制限SQLというかとにかく不便。Update関係で自己相関クエリが使えないのは以前書いたけど、Viewの中でselect句を使って結合ができないとは思わなかった・・・

こんなのはNG:
CREATE OR REPLACE VIEW adult_member AS
SELECT m.name, m.age
FROM (SELECT * FROM member WHERE age >= 20) AS m;
そんな・・・さすがに困るなぁこれ・・・
将来的にはOKになるらしい。ソースはここ

個人的Q&A
Q:将来まで待てない状態の人はどうしたらいいのでしょう?
A:from句の中を別viewにすればOKです。

もうね、涙がでるよ、マジで・・・

2009-10-27

IE6: フリーズする

玩具販売サイトの話。
経緯はこの辺
(といっても、2行しか書いてないが・・・)

通常はFirefoxで開発して、確認でIE6とかを使っている。
(Firebugいいよ~)
っで、持たせてたデータをファイルからMySQLに移行したら、IEがフリーズするようになった・・・orz
理由はいまいち分からない。
考えられそうな理由
  1. Javascriptで変なことがおきている
  2. CSSの解釈で起こしなことがおきている
  3. DB接続が遅すぎてTimeout
よく考えると、3はありえなかったりする。
単にAjaxでhtml取ってきてるだけだし・・・

なぜだ?
IE6だからか?

2009/10/28 追記

原因が分かった。
prototype.jsのAjax.Updater(たぶんRequestでも)で、asynchronous(非同期通信)をfalseにすると起きてた。
まぁ、Ajaxのいいとこを殺していたので(理由もあったのだが)オプションを除去。
そのページはAjax通信だけで4~5ほどあったので、なんとなく納得。っが、FirefoxはOKだったのはなぜだ?
同時通信数増やしてたっけ?

2009-10-26

SQL: MySQLで更新、削除時に起きた問題

こんな感じのクエリーが動かない。
delete from 
   child
where id in
    (select p.id as id
    from parent p
    left join child c
    on p.id = c.id
    where c.id is null);
SQLの内容自体はよくありそうな、親テーブルと子テーブルを左側外部結合して、親テーブルにはあるけど子テーブルにはない行の削除といった感じ。
Oracle、DB2、PostgreSQLでは動いた記憶があったので、当然MySQLでもいけるだろうと思ったら動かない。
こんなエラーが出た。
ERROR 1093 (HY000): You can't specify target table 'child' for update in FROM clause
(適当な)訳:更新にはFROM区で指定した特定のテーブル「child」を使えないよ~ん。

調べてみた。
どうやら、このタイプのクエリは自己相関サブクエリというらしい。
ソースはここ
鬼かと・・・

解決方法を考えてみた。
1.所詮はプログラムで行っているのだから、クエリーを2回投げればいいじゃん。
2.Viewを一個こしらえれば回避できるらしい。
3.そもそもこんなクエリ投げるってことはデータの持ち方がおかしいのでは?
4.気合で解決方法探してみる・・・
4は方法じゃないね。

誰かいい方法知りませんか?

2009-10-24

C++: MingwでWindowsDLLを使う

Mingw GCCでVCとかでコンパイルされたDLLを使う方法。
この辺参考。

pexportsを使ってDLLの中で定義されている関数を抜き出す。
その後、そいつを使ってDEFファイルを作る。
んで、Mingw付属のdlltoolを使って「.a」ファイルを作って完了。

字面は簡単、実際は面倒だった。
リンカ実行時に表示される、「undefined reference "hogehoge@4"」みたいなのを全部洗い出して、上記のDEFファイルに書き込む必要がある。しんどい。
この辺の互換性って何とかならんのかなぁ・・・

2009-10-17

ぼくらの

漫画の話。アニメではない。
実際のところ、この作品との出会いはアニメのオープニングテーマなのだが。
っで、全10巻読んでみた。

感想:よくこんなの思いついたな作者・・・
基本設定は、別次元の地球と存在をかけての戦い。方法はどっかから与えられたロボット。
操縦者はロボットを操る力を得る代わりに戦闘終了後に必ず死亡。
「勝って地球を守って死ぬか」「負けて地球と一緒に死ぬか」の2択。
選ばれた時点で(最終的には自分で契約する必要があるが)、「死」確定。

内容は面白い。というか考えさせられる。
しかし、パラレルワールドと戦うってどっかで見た設定だな。
ポンコツのヘルメット被って、木刀で戦う高校生だった気がするが、なんだっけ?
思い出せん・・・

2009-10-14

StyleSheet: 高さの異なるカラムを揃える

まさにタイトルどおりの話。
この辺を参考にした。

なるほど、:afterを隠しておいて、必要になったら勝手に表示といた感じかな?
かなり面白い。多分高さ32768pxまで対応してるんだろう。なぜこの数値なのかはよく分からんが?
ブラウザが認識する最大値かな?

ソースが載ってなかったので載せておこう。
#content {
    text-align: center;
    margin:0 auto;
    overflow:hidden;
    /* width: 700px; *//*これ僕は必要なかったので削除*/
}
#content:after {
    content:".";
    display:block;
    height:0;
    clear:both;
    visibility:hidden;
}

#column1, #column2, #column3{
    float:left;
    padding-bottom:32768px;
    margin-bottom:-32768px;
}

#column1 {
    float: left;
    width: 20%;
}

#column2 {
    float: left;
    width: 40%;
}

#column3 {
    float: left;
    width: 35%;
}
幅は適当に変えた。
後は、それぞれのIDを持つHTML要素を作るだけ。
ずっと探していたがようやっと見つかったわぁ。
(前にも見つけた気はするが・・・)

タグがprogramになってるけど、あまりそれ以外に選択肢がなかったから・・・
(増やしたくないという理由で・・・)

2009-10-12

C++: expatを使ってみた

激しく今更感があるがexpatを使ってみた。
ちなみに、expatはSAXでXMLを扱うためのライブラリ。C言語で実装されてるけど、問題なくC++で使える。

RSSを読み込んでデータ型に落とし込もうということをしてみたんだけど、意外と難しい。
SAXってイベント駆動型のAPIなので、全部自前で管理するのだが、結構どうしたもんかなと言うときがある。
基本の動きとしては、
開始エレメント -> 中身 -> 終端エレメント
という感じで動くんだけど、
こんな感じのXMLだとえらいことになる
<hoge>
  <fuga>中身</fuga>
</hoge>
XMLは性質上、空白文字とかもテキストノードとして扱うので、イベントがこんな感じになる。
hoge開始
 ↓
改行文字及び、空白文字
 ↓
fuga開始
 ↓
中身の文字
 ↓
fuga終了
 ↓
改行文字
 ↓
hoge終了

正直、無駄イベントが多すぎな印象。こんな場合個人的には、改行文字と空白文字を除いてほしいのだが、そうもいかんらしい。自前で無視するか、イベントハンドラを追加するか・・・悩ましい。

2009-10-10

Javascript: 苦労した話

JavascriptでIFrameを扱う話。
「tmpl.js」という誰かが作っているライブラリを見つけ、便利そうだったので使おうかと考えた。
この辺
incl.jsで外部HTMLを読み込んで、tmpl.jsで文字列の置換を行うつもりだった。
こんな感じ。

本体
<include id="navi.html"></include>

外側
{ヘッダー部分(tmpl.jsとかとか)}
<a href="hoge.html">{something}</a>

上手くいかなかった。
正確にはFirefoxでは動くがIEではだめといった感じ。
あきらめて、prototype.jsとAjaxにした。
読み込んだ後にごりごり文字列の置換を行っただけ。

同じようにIFrameで別ページを読み込んで、中身だけ取り出そうと試みた。
外側のHTMLではAjaxを使ってデータを取得し、中身だけ取り出す、そうすることでサイトの外観の定義を一箇所にできるかなぁなんて思ったり。
無理だった。
理由:遅延処理のせい。
IEのIFrameにはonreadystatechangeなんてのがあるし、Firefoxは単にonloadに入れればいいだけじゃん、外側はonloadで読み込んでるし。
こんな感じで。
if (/*@cc_on ! @*/ false) {
  iframe.onreadystatechange = function() {
    if (this.readyState == "complete") {
      doSomething(this);
    }
  }
} else {
  iframe.onclick = function() { doSomething(iframe);}
}
安易でした・・・orz
問題はdoSomethingの中の処理なんだけど、IFrameから中身の文書を取り出すときに、contentWindowをが必要になるんだけど、IEではnullになってる。
やり方が悪いんだと思うんだけど、あきらめて力技でやることにした。

IE7とか8ならいけるのだろうか・・・
未だにIE6が必要なのかも怪しいが・・・
(とはいっても、僕の環境はIE6。メインがFirefoxだからという理由)

台風18号

人に言われて思い出した。そういえば最大級の台風が日本に上陸したとか・・・
っで、ちょっと地元のニュースを読んでみたが、結構ひどい。
割とピンポイントで知っている地名とか出てるし・・・僕の地元は大丈夫か?

K氏とかS氏とかの地元の写真が出てたなぁ・・・大丈夫かね?

2009-10-02

ギター

更に連投。。。
(いや、ちまちま上げるの好きじゃないから、ネタがまとまったときにドカンとアップなんて考えてないですよ)

こっちに来てからギターを始めた。バンド仲間などいないので、アコギでソロギター・・・
仕事が見つかるまでものすごく暇なのでというだけではなく、音楽にかかわっていたいという思いもあったからである。
足掛け7ヶ月か・・・
最近になって、ようやく少し弾けるようになったかなぁって程度なので、あまり才能はないのだろう・・・(TДT)

っで、なんとなく気づいたこと。
  • 以外にも左手は器用だったということ
  • 器用だと思っていた右手はそうでもなく、不器用だったんだということ
狙った2弦(or 3弦)だけを人差し指もしくは中指だけで弾くなんてムリポ・・・
右手よ、器用になってくれ~・・・

Javascript: DOM操作でテキストだけ抜き取る

連投。

以前かいたWebサイトで、「ページ内にあるサムネイル画像の検索を行いたい」なんて要望がでて、テキストの検索だからできるだろうと思って作ってみた。
ちなみに、各サムネイルはこんな感じ。
<span class="product">
<img id="hoge" src="hogehoge" />
<div>Produce Name</div>
<div>€ 50</div>
</span>
先頭要素が「span」なのはIE6対策。
っで、prototype.jsを使ってるので、document.getElementsByClassNameでサムネイルの各要素を取り出して、以下のスクリプトでテキストノードだけ抜き取る。
var tags = $A(element.getElementsByTagName("*"));
var text = "";
tags.each(function(tag, index) {
    var children = $A(tag.childNodes);
    children.each(function(node, index) {
        if (node.nodeType == 3) {
            text += node.nodeValue + " ";
        }
    });
});
elementは取得した要素配列の一つ。
元々はここにあったソースだけど、これはFirefox限定だったので、prototype.js使ってクロスブラウザにした。
ただ、それだけ。

どうでもいい話だが、上記のスクリプトの「var text="";」の部分、初期化せずに「var text;」って書くと、for文の中の宣言にもかかわらず、あたかもC/C++のstatic宣言みたいな動作してた。Firefoxでしか確認してないけど。バグか?

免許ゲット

日本の運転免許をオランダのに書き換えた。

オリジナル(日本の)はRDWという免許関連のことをしている機関に納められる。要は取り上げ。
が、確認したところによると日本の免許はちょっと特別で、1ヶ月後くらいに日本大使館に送付されて、取りに行けば返してくれるらしい。便利。
今のところ必要ないのが、気が向いたら取りに行こう。ちなみに日本大使館はハーグにある。

こっちの免許はなのか、書き換えたからなのかは知らないが、10年有効で、日本の免許の最長より5年長いことになる。
10年ここにいるかどうかは分からないが、面倒な手続きは10年に一回でいいのはいいことだ。
ちなみに、ぜんぜん関係ないが、パスポートは最長5年らしい。日本のだと5年のと10年のが選べる。なんかひっくり返った感じだ。
当然僕のは日本のパスポートなので、期間だけ見ればいいとこ取りな感じで得した気分。

っま、免許だけあっても車はないので、あんまり意味はないんだけどね。