SPS2をNetBSDで動かしてみる。前哨戦その1

背景:SDLオフに無謀に出てみたら.Netで動くzinniaさんのプレゼンツールSPS2があった。をぉ。クール! そこで感動した際に「おうちサーバで動くか確認してみますよ」と適当に言ってからのお話です。

とりあえずおうちサーバにはmono/SDL_*が入っているNetBSDがあります。
で、SPS2をダウンロードしたら以下のライブラリが必要とのこと。

とりあえず数日はインストール猿っすね。明日taoframeworkからスタートでつ。

haskell勉強用プログラムその…2?

5/10に酔った勢いで書いた一発ネタプログラムです。おそらくhaskell初めて2つめとか3つめのプログラム。
基本以下の2つしか計算しないという単純なモノです。

  • 日付と日付の間の日数計算
  • ある日付から日数経過後の日付

使用方法は限定しないので、どんどん好きなように。

公開はしたけれど、後悔はしてない。

module LAdjust where 
import Prelude
import Text.ParserCombinators.Parsec 
import Data.Char
import Control.Exception as Exp hiding (try, catch)
    
data Date = K{ year :: Int, month:: Int,  day :: Int }

instance Show Date where
    show (K y m d) = show y ++ "/" ++ show m ++ "/" ++ show d

dateParse :: Parser (Date)
dateParse = do y <- many1 digit
               string "/"
               m <- many1 digit
               string "/"
               d <- many1 digit
               return (K (atoi y) (atoi m) (atoi d))
    where atoi l = foldl (\a b -> (a*10)+digitToInt b) 0 l

isLeapY year = if (year `mod` 4 == 0 && year `mod` 100 /= 0 ||
                        year `mod` 400 == 0) then True else False

getMDay year = [0, 31, if isLeapY year then 29 else 28, 31, 30, 31, 30, 31, 31, 
                     30, 31, 30, 31] 
getYDay year = foldl (\x y -> x + y) 0 (getMDay year)

getMD year (m1, d1) (m2, d2) = if m1 == m2 then d2 - d1 else d3
    where m' m1 m2 k = if m1 == m2 then k
                       else m' (m1+1) m2 (((getMDay year) !! m1) + k)
          d3 = ((getMDay year) !! m1) - d1 + d2 + m' m1 (m2-1) 0

calcDate (K y1 m1 d1) (K y2 m2 d2) = 
    if y1 == y2 then getMD y1 (m1, d1) (m2, d2)
    else getMD y1 (m1, d1) (12, 31) + calcY (y1+1) y2 0 + 
         getMD y2 (1,1) (m2, d2)
    where calcY y1 y2 k = if y1 == y2 then k 
                          else calcY (y1+1) y2 (k + getYDay y1)

getDay str1 str2 = calcDate d1 d2 
    where d1 = case parse dateParse  "" str1 of
                 Left err -> throw (ErrorCall "parse error")
                 Right xs -> xs
          d2 = case parse dateParse  "" str2 of
                 Left err -> throw (ErrorCall "parse error")
                 Right xs -> xs

plusDay k 0 = k
plusDay (K y1 m1 d1) days = 
    if (days > yend) then  plusDay (K (y1+1) 1 1) (days - yend)
    else if (days > mend) then
             plusDay (K y1 (m1+1) 1) (days - mend - 1)
         else (K y1 m1 (d1+days))
    where yend = getMD y1 (m1, d1) (12,31)
          mend = getMD y1 (m1, d1) (m1, (getMDay y1) !! m1)

plus str1 d = plusDay d1 d
    where d1 = case parse dateParse  "" str1 of
                 Left err -> throw (ErrorCall "parse error")
                 Right xs -> xs

-- usage: ans "1949/5/3" "1978/9/9" "1979/9/14"
ans str1 str2 str3 = plus str3 (getDay str1 str2)

「分からない」と心理的なアレ。

#酔っているので無駄な勇気を出してこんなエントリを書いてみるテスト。

わからない』と言う人間は、2種類しかいないんだ。

わかれない人間と、
わかりたくない人間。 どちらかなんだよ。 − はまちや2 (2008)

経験則からの話ですが「わかりたくない」ケースってのは今までに2つ経験したことがありますです。

  • 未経験で自己でカテゴリーがついてないから「わかりたくない」。

(ポジティブに言う場合はまたは自己内での理解がまだ終わってない人です。ですが、それが永遠に続く場合もある訳で。)

  • それは僕の価値観の中にないから「わかりたくない」。

(あれですよね。「UFO見たことあるけれど、それは僕の妄想だ。UFOなんてない!」みたいな。経験を否定するケースです。)

それはそれは凄くざっくばらんに、乱暴に言うならば、一つ目に対して「心を大きくもとうぜ!」とか、二つ目に対して「許容しようぜ!ヲトナなんだし!」とか言える訳ですが。なかなか人ってのは複雑なのでそうも言えない訳ですね。
例えばそれが趣味だったら問題ないわけです。

「俺Perfume好きなんだよ! あのystkのサウンド!! グッっとこね?」
「あ〜。俺そういうの"わからない"から。」

これはどうでもいい訳です。この際。人の価値観は自由だし。

仕事で発生する場合。これは問題。

「****がいいんですよ!」
「あ〜。よく聞くけれどさ。"わからないし"。ほら***の会社とかだとそういったソリューション*1の提案じゃないよ」

さすがにそれについて
「ヲレが知るかぁ!ボケがぁ!」
とか言って卓袱台返しとかはできない訳ですね。僕は明日の飯が欲しいので。
そうすると如何に既存のメタファー(つまりその人が知っているナニカ)に載せて説明する必要があって、その為には如何にその新しいナニカってのを「新しくないナニカ」にしないといけない訳で…あ〜。俺そういうの苦手なんでつよ。誰かこのあたりのコツ知っていたら教えて頂けると僕は涙を流して御礼します。
#数日間そちらの方向に向かって最敬礼を致す所存です。

*1:で、ソリューションってなんでつか?舶来語きらい。提案と何が違うんだろ。

Browser's local storage changes from cookie to db(SQLite)!

Google Gears の機能のおさらいと HTML5「Client-side DB」の相互運用を考える。Client-side DB に未来はあるか? (http://d.hatena.ne.jp/amachang/20080327/1206631712)

id:amachangの記事を読んで思い出したのですが、確かgoogle謹製の携帯仕様(…お、おれはプラットフォームなんていわないどっ!)であるAndroidSQLiteが入っていたのを思い出しました。仕様にはまだ書いていませんが、googleだったらきっとやってくれるに違いないと勝手に妄想は広がリングなのです。

ということで、近い将来携帯も含めてこういったbrowserからのlocal DBアクセスができるのではないのかなぁ。と
妄想してみるテスト。ただ、やっぱりそうするとcookie以上にセキュリティの問題があるのではないかなぁ。とも思ったり。

ただ、やっぱりこういった新しいネタが来る訳ですから対応して頭使ってどういう使い方できるか考えたいですね。

Haskell Hackathon行ってきました。

ということで、先週の土曜日に開かれたHaskell Hackathonに行ってきました。

  • Blogで見つけたときに一瞬思ったこと「えー?Haskell 12時間で実装? (規模と時間的に)ありえね〜w」
  • RHGの勉強会で主催者のid:yukobaさんに誘われる。ほいほいとミイラとりがミイラに。

そして当日。

  • 駅に自転車で行った歳にしょっぱなからこける。膝すりむいて、ひりひりしながら赤坂のサイボウズ・ラボに到着。
  • ちょっと遅れたのでスクリーンのとなりにお邪魔。
  • うひょー。関数(型)系プログラミングのBlog界の有名な人がいっぱい。話題はもちろん言語ネタ中心。っていうか、befungeとか会話で出てきてもみんな普通に会話しちゃうのが普通の世界じゃなくてイイ! 仕事場とか普通の場所ではありえない。
  • 到着してすぐにSML/njで実装開始(使うの数年ぶり…)。少しだけlexer,parserは作っていたのでそれなりに進む。
  • 隣とかはOcamlとかPython(id:nishiohirokazuさん)で実装してるみたいだなぁ…
  • 3時くらいに適当に足し算と関数実行ができる…あれ?遅延評価忘れてたよw
  • あわてて変更してデバッグ中に電話で呼びだし→帰る

という感じでした。数時間(3,4時間)何も考えずにひたすらプログラミングしたのが久々だったので、凄くよかった!
ソースはもう少し機能を増したら載せる…と思います。

ちなみに僕が感じたことだと、

  • 途中参加で誰が誰だか分からずだったのが残念でした。名刺持ってこいよ! 俺!
  • テストスイートがあった方が御互いの進行速度が判った気がします。あ。fooさんは遅延評価ができるけれど、パターンマッチングがまだなんだな。とかbarさんはその逆っすか。みたいなことがリアルタイムで分かると楽しい気が。(ICFPチックなのかもしれないけれど)

いや、しかし初めてこういったのに参加したので凄く面白かったでつよ! 企画のid:yukobaさん/id:amachangさん/id:nishiohirokazuさんお疲れさまでした!

ディスプレイ。

ナナオのカラーユニバーサルデザイン対応ワイドモニターが欲しい!
って書いておかないと・・・

ついでで思ったことなんですが。最近デジカメを買おうとか買わないとか考えたんですね。
その際に店で見た写真ってのを例で見るわけですが、実際の風景の本当の色が分かっていない
ので、判断がつきづらいってのがある気がします。

しかし、実際僕らの脳みその中で見ている色ってのが実際の色と同じって保障も無いわけで。
そう考えてみると、ユニバーサルというアプローチってのは奥が深いと思います。凄く。

どんな人の脳みそを介しても同じ色でしょ。こいつはチャレンジだぜ。

OpenVPN on NetBSD

Google様で検索してみるとこんな感じ。

検索キーワード Googleヒット件数
OpenVPN 2,600,000
OpenVPN + linux 1,470,000
OpenVPN + Windows 1,430,000
OpenVPN + FreeBSD 821,000
OpenVPN + NetBSD 336,000

・・・の、マイナー極まりない読者の皆さん!(そもそも読者がいないという突っ込みはさておき)
NetBSDOpenVPNをするという謎のそれをやってみました。Linuxはドキュメント豊富だけれど、
NetBSDはドキュメント化されていないのが多いのです。ここではブリッジ接続を前提に。

  • pkgsrc/net/openvpnでインストールは問題なし。
  • server.confでは、サーバに設定するaddressにはtapで設定しようとするアドレスを。
  • 起動時にはサーバ起動→tap0にアドレス付与→ブリッジ(bridge0)作成→bridgeにインターフェースを追加の順番になります。

 (サーバ起動時にtap0のアドレスが消えてしまうので)

openvpn_start()
{
    .....何かいろいろ
        ifconfig tap0 
        ifconfig bridge0 create
        brconfig bridge0 add <サーバのインターフェース>
        brconfig bridge0 add tap0
}
  • openvpn_stop()にも適当に書くのはお約束。