Mac OS XでGHCのコンパイルエラー

あるプログラムをMac OS X(10.6)上のGHC7.0.4(Haskell Platform 2011.04でインストールした)でコンパイルしようとしたら、

Linking main ...
Undefined symbols:
  "_locale_charset", referenced from:
      _localeEncoding in libHSbase-4.3.1.0.a(PrelIOUtils.o)
  "_iconv_close", referenced from:
      _hs_iconv_close in libHSbase-4.3.1.0.a(iconv.o)
     (maybe you meant: _hs_iconv_close)
  "_iconv", referenced from:
      _hs_iconv in ...

more…

JINS PC購入

パソコンなどから出るブルーライトから目を守るという触れ込みのJINS PCを購入した。以前購入したMacBook Proの画面を長時間見ていると、どうも目が疲れるように感じていたので。

意外だったのは、これを掛けると画面が少しよく(くっきりと)見えるようになること。このレンズは度なしだが、青い波長の光がカットされることで、目の焦点が合わせやすくなったからだと想像する。光は波長が異なると屈折率が異なるので、色によって焦点が合う位置が微妙に違う。だから一色でも波長が抜けると、ぼけた感じが軽減されるのだと思う。

また、当然目に進入する光量が減るので、眠くなる。よく言えば落ち着く。

効果は「まぁあるのかな」という感じだけれども、少なくともサングラスとしても機能するので、しばらく使い続けてみようと思う。

more…

H2クエリを少し最適化

H2データベース(バージョンは1.3.161)で、selectクエリを実行するときに、予想より時間がかかっていると思われた。それで、explainを使って、どのようにクエリが実行されているのか調べてみたら、案の定インデックスが使われないで全レコードサーチになっていた。

問題となったのは、select * from tbl where YEAR(date)=2012のように、日付型を持つフィールドにYEAR演算を施し、その結果が定数になるレコードを取得するクエリ。それで、このクエリを、select * from tbl where date>='2012-1-1' and date<='2012/12/31'と書き換えた。そうしたらちゃんとdateフィールドに設定してあるインデックスを使用するようになり、速度も改善された。

これくらいの最適化は自動的にやってくれると思っていたが、そうでもないらしい。確かに、YEARではなくて、select * from tbl where MONTH(date)=1のように、MONTH演算であれば、単純にdateフィールドでインデックスを持っていても検索は簡単ではない ...

more…

継続ベースWebアプリについて少し考えた

Webアプリにおいてセッション管理を行うときに、昔からJSPなどで行われている、セッションIDを何らかのデータに結びつける手法がある。一方、例えばSeasideのように、継続を使用してセッション管理を行うという方法もある。継続ベースというのは技術的にもおもしろいし、上のURLでも指摘しているように、二度押しなどの対策もしやすい、というメリットがある。

しかし、単純に実装してしまうと、URLがユーザにとって意味不明の文字列になってしまう。セッションと強く結びついているので、ブックマークをすることができない。もちろん、「ログインが必要な画面など、セッション内のページについてはブックマークができなくても良い」という考え方もあるが、「どうせ継続で制御できるのだから、リクエストURLはいつも固定でいい」などという安直な考えを推し進め、ログインが不要なページまで継続で実装してしまうと、意味不明なURLが大量生産されることになってしまう。

そう考えると、JSPスタイルで実装するのも悪くない。ユーザ(主語)が、ある「対象」にある「操作」を行う、というのを実装するのであれば、リクエストURLは「動作」と「対象」を表し、認証情報(「主語」)のためにセッションを用いる、というのが良い解ではないかと考えた。

more…

fleet (clojureによるテンプレートシステム)

また久しぶりにclojureをいじり始めた。またWebシステムの実装に用いる予定。どうやってJSPやASPのように動的にWebページを生成するのが良いのか、最近の流行を少し調べてみた。

結果として、自分にはfleetが現状良さそうという結論に達した。若干悩んだ点と調べて分かったことのメモ。

  • fleet-nsでテンプレートを生成するときに、引数で指定したディレクトリにあるファイルを 走査して、それぞれのテンプレートファイルに対応するテンプレート関数が作られる。例えば、post.html.fleetというファイルが存在すれば、postという関数が、(同じく引数で指定した名前空間に)作られる。
  • post関数の内部(つまり、テンプレートファイルの中)では、dataという名前でテンプレート関数への実引数を参照できる。すなわち、<(:hoge data)>とpost.html.fleetに記述すれば、このテンプレート関数が実行されるときに、実引数として渡されたmapにあるhogeキーの値を出力する。

more…

SolrをJSONで使うときにはまったことのメモ

Apache Solrの検索機能を試してみた。自作Lispアプリからdrakmaを使用してJSONによりデータを追加しようとした。

結論からすると、Solrは、JSONの文字列は、シングルクオートではなく、ダブルクオートでないとエラーになる。


自分の調べた範囲では、JSONとしてはシングルクオートでもダブルクオートでも文字列としてvalidである(らしい)ので、これはSolr側の問題であると思う。


Parenscriptを使用して文字列を作ると、シングルクオートで囲われてしまう。代わりに、CL-JSONを使用することにした。こちらはなかなか使い方が難しかったが、


(defun get-insert-answer-json (id uid qid ans)
  (with-output-to-string (stream)
     (json:with-object (stream)
       (json:as-object-member (:add stream)
(json:with-object (stream)
  (json:encode-object-member "doc"
     `((id . ,id) (uid_i . ,uid) (tp_i . 2 ...

more…

OpenSolaris -> Ubuntu Linux

これまでメインのデータストレージはVM上のOpenSolaris 2009.6のZFSファイルシステムであったが、Solarisの今後を考えると少し不安なので(FreeBSD+ZFSという手もあるが)、Ubuntu Linux 10.04LTS上のLVM2+ext4に移行した。ZFSの先進性からすると、ファイルストレージとしては後退した感はあるが、いろいろなオープンソースソフトウェアは、なんだかんだいってLinuxが主なターゲットになっているのが現実であるので、メリットもある。

btrfsは安定性を考慮して、今のところ見送り。FreeBSD+ZFSもメモリを食うという情報が多かったので見送り。

なかなか現状オープンソースで満足のゆく解はなさそうだ。

more…

MacBook Pro

Permalink: 2011-06-10 14:02:00+09:00 by tu1978 in tags: Mac PC

Mac OS Xになって、これまでも2回Macを購入したことがあったのだが、結局使いこなすには至らなかった。確か、初めてのMacはiBook G4(白いやつ)で、次がMacBook(2ではないCore Duo)だった。特に2代目は使い始めて1週間くらいで調子が悪くなり、ロジックボードの交換をした。迅速に無料で修理をしてもらったものの、普段使いには耐えないかと思い、下取りに出してしまった。

それ以降Macとも離れていたのだが、Sandy Bridge搭載パソコンを物色しているうちに、また懲りずにMacを購入してしまった。買ったのはMacBook Pro (MC700J/A)。メモリを増設し8GBにした。

良い点

  • 格好良い。
    • フラットデザイン。最近は国内メーカもまねをしているようだ。
  • トラックパッドの操作感がとても良い。2本指でスクロールする感覚が非常に良い。ぴったりと意図通りにスクロールする感じ。この感覚に慣れてしまうとWindowsのスクロールは野暮ったく感じる。
良くない点
  • パームレストの角が手に当たって痛い。これは机の高さがちょっと高すぎるのが問題なのだけれど、もう少し丸みがあった方が良いと思う。
    • 2011/9/3 追記:やはりそれなりの時間使用するときには、これは結構気になる。こればかりはデザインを改善した方が良いと思うのだが...
  • 重い。国内メーカだったら同じサイズで500gくらいは軽くなりそう ...

more…

MySQL + cl-mysql によるPrepared Statement

あまり詳しく調査はしていないが、clsqlでもMySQLでのPrepared Statementはそれほどうまく動作しないらしい。それで、cl-mysqlでもできないか調べてみた。

Prepared Statementには2種類の実装方法がある。動的、静的とそれぞれ呼ばれている。最近のMySQLは静的Prepared Statementを実装している。ここを参照。それでPrepared StatementでSQLを実行し、結果を返す関数は次のように実装できた。


(defun with-prepared-statement (st &rest arg)
  (cl-mysql:query (format nil "PREPARE stmt1 FROM '~a';" st))
  (let ((syms (loop for x from 1 to (length arg)
for sym = (gensym)
collect sym)))
    (loop for param in syms ...

more…

Android アプリ開発メモ