2010-01-01から1年間の記事一覧

Haskell から wxWidgets(C++) を呼ぶ

wxWidgetsには wxHaskell に使用されているGUI以外にも wxString、wxVariant など有用なライブラリがあります。 Haskell から wxWidgets の wxAutomationObject で COM を操作してみます。 (以下は wxWidgets がインストールされた環境を前提としています。…

Windows 環境にて Haskell から PostgreSQL を扱う

Real World Haskell:21 データベース操作を参考に PostgreSQL をテストしてみました。 PostgreSQL の最新バージョンは 9.0.1 ですが、そのままでは connectPostgreSQL を実行した時点で krb5_32.dll がないと言われます。ファイルの中味を確認すると9.0.1-1…

CSVファイルをダンプする

【Microsoft SQL Server】 BCPユーティリティの使用法を参考に SQL server のテーブルをCSVファイルにダンプしました。 まず、テーブルのフォーマットを取得します。 >bcp DBNAME.dbo.tablename out c:\c\db\tablename.txt -S HOSTNAME -U username -P…

CSV のファイルを読み込んでリストに変換する

Data.List.Splitを使うと簡単にCSVをリストに変換出来ます。 split パッケージをインストールします。 > cabal update Downloading the latest package list from hackage.haskell.org > cabal install split Resolving dependencies... Downloading split-0…

文字列の md5 ハッシュ値を計算する

pureMD5を使って文字列のMD5を算出します。 > :m + Data.Digest.Pure.MD5 > :t md5 md5 :: Data.ByteString.Lazy.Internal.ByteString -> MD5Digest md5 関数は Data.ByteString.Lazy.Internal.ByteString から MD5Digest を作るので、 Haskellの文字列(Lis…

MS-WIndows 環境での Haskell の文字コード

日本語を含んだHaskellのソースコードは UTF8 で記述しますがコンパイルされた文字列はHaskellの内部コード UCS4 に変換されます。 Windows システムとの文字列のやり取りは UCS4 から SJIS に変換して書き込み、受信した文字列はSJISからUCS4に変換します。…

練習に分数を循環小数で表現してみる。

分数を循環小数で表現しているページを見かけたので Haskell の練習に私もやってみました。 {- > fractionToDecimal 1 2 --=> "0.5" > fractionToDecimal 2 3 --=> "0.(6)" > fractionToDecimal 2 7 --=> "0.(285714)" > fractionToDecimal 1 66 --=> "0.0(1…

negate (-) - の違いは・・・?

nagate は Num 型の引数をひとつとり符号を反転させて返す関数。 > :t negate negate :: (Num a) => a -> a > :i negate class (Eq a, Show a) => Num a where ... negate :: a -> a ... -- Defined in GHC.Num > negate 1 --=> -1 > negate $ negate 1 --=>…

Data.HashTable を使ってみる

Data.HashTable を使ってみます。 > :m + Data.HashTable -- (==) : 比較する関数 -- hashString : Hash 値を計算する関数 > h <- new (==) hashString :: IO (HashTable String [(Int,String)]) -- 適当なキーで適当な値を入れてみる。 > insert h "abc" [(…

System.Time で今日の日付を取得

Data.DateTime の toGregorian' :: DateTime -> (Integer, Int, Int) での日付管理は便利なのですが、UTC の日付です。System.Time で取得した時間でも DateTime に変換した時点で UTC になってしまいます。 -- DateTime > getCurrentTime --=> 2010-11-27 0…

西暦から和暦に変換

type Year = Integer type Month = Int type Day = Int data Nengo = Nengo { start::(Year, Month, Day), end::(Year, Month, Day), name::String} deriving (Eq,Show) nengoTable :: [Nengo] nengoTable = [ Nengo { start = (1868, 1,25), end = (1912, 7…

存在する日付かどうかチェックする(Haskell)。

fromGregorian 関数は Day 型を作る。存在しない日付が指定されると一番近い存在する日付の Day を返す。 Day 型に変換してから、Gregorian に戻して比較して同じ日付ならば存在する日付。 import Data.Time.Calendar import Test.HUnit isExistingDate :: I…

Parsecにちょっと触ってみる(5):字句解析

Parsec, 高速なコンビネータパーサ の写経の続きです。 サンプルはバージョンが古いのでインポートするモジュール名が違います。 Parsec には 2 系バージョンと 3 系バージョンがあり、最新のバージョンは3.1.0。私のPCには 2.1.0.1 がインストールされてい…

フォームを閉じるとき終了確認をする(wxHaskell)

フォームを閉じるときにダイアログで終了の確認をします。 -- ghc --make Main.hs -o confirm.exe module Main where -- ライブラリを学習するためになるべく丁寧に依存先を書きました。 import Graphics.UI.WX (start) import Graphics.UI.WX.Events (on, c…

wxHaskell での「応答なし」を回避する。

重い処理をしながら textCtrl に記入しようとすると、Windows のイベントループが回らなくなって(応答なし)になってしまい、処理が終了すると一括して表示されてしまうという不具合が起きました。 重い処理をしながら結果をtextCtrl に記入したいのですが…

Parsecにちょっと触ってみる(4):式

Parsec, 高速なコンビネータパーサ の写経の続きです。 import Text.ParserCombinators.Parsec hiding (spaces) import Text.ParserCombinators.Parsec.Expr run :: Show a => Parser a -> String -> IO () run p input = case (parse p "" input) of Left e…

Parsecにちょっと触ってみる(3):エラーコンビネータ ()

Parsec, 高速なコンビネータパーサ の写経の続きです。 エラーコンビネータ () はエラーの記述をパーサに追加します。 パーサが失敗したとき、入力を消費することなくエラーメッセージを返します。 import Text.ParserCombinators.Parsec run :: Show a => P…

Parsecにちょっと触ってみる(2)

Parsec, 高速なコンビネータパーサ の写経の続きです。 sepBy と sepBy1 「パーサによって区切られるパーサの列をパースします」って分かりにくい説明が書かれていますが、動かしてみます。 import Text.ParserCombinators.Parsec tstSepBy :: String -> [St…

「Write Yourself a Scheme in 48 Hours」 を写経してみる。

「Write Yourself a Scheme in 48 Hours」と言うHaskellでSchemeを書くチュートリアルを見つけたので、理解出来るとこまで写経してみます。1.First Steps: Compiling and running 2.Parsing parsec によるパース -- spaces を自分で定義しているので Parsec …

チャーチ数とラムダ計算

検索していたら、きしだのはてな・おとうさん、ぼくにもYコンビネータがわかりましたよ! という記事にめぐり逢って面白かったので Scheme 写経してみました。 ラムダ関数の表記 ラムダ関数は λx.x のように表記します。 λx.x λx.x*2(λx.x*2)y という関数は …

Haskell で .NET(Shift_JIS)

hs-dotnet-0.4.0 を入れてみました。 $ runghc Setup.hs configure Configuring hs-dotnet-0.4.0... $ runghc Setup.hs build Preprocessing library hs-dotnet-0.4.0... Building hs-dotnet-0.4.0... [ 1 of 167] Compiling NET.System.TypeCodeTy ( NET\Sy…

Parsecにちょっと触ってみる。

Parsecちょっと触ってみます。 パーサーコンビネータは、小さなパーサを組み合わせて大きなパーサを作っていきますが、まずは小さなパーサがどういうものか。 Parsec, 高速なコンビネータパーサ run :: Show a => Parser a -> String -> IO () run p input =…

COM を学ぶ(7) : HaskellでExcel

HaskellでExcelを読み書きしてみました。 Haskell のソースコードは UTF8。UTF8 のソースはコンパイルすると内部コードUCS4に変換されます。Windows は表面はSJISですが、COM を呼ぶときにはBSTRに変換しています。 ソースに書かれた文字列を直接Excelに書き…

COM を学ぶ(6) : C言語でExcel を操作する(Mingw)

C++ を Haskell から呼ぶのが大変だというのが分ったので、Ruby の win32ole.c を参考にC言語で Excel を操作する関数を書いてみました。 これらの関数を Haskell から呼べば HaskellでExcel を操作出来ます(^^)/ C++ ではシートから行・列を指定してCellsオ…

wxWidgets の wxAutomationObject で Excel を操作する。

MinGWはGNU ツールチェーンのWindows移植版でWindows APIのためのヘッダファイルがありGCC で Windowsアプリケーションの開発することができます。 wxWidgetsはWindowsを初めMac OS X、Linuxなど多くのOSで動かすことが出来るウィジェット・ツールキットです…

カレントディレクトリのファイル名からフルパス名を求める(Windows)

Haskell で Excel を操作するためにまずはファイル名からフルパス名を求めます。 import System.Win32.Com import System.Win32.Com.Automation import Debug.Trace getFullPathName :: String -> IO String getFullPathName fname = do createObject "Scrip…

Ruby の invoke メソッドだけで Excel にアクセスする。

C で Excel にアクセスするのには COM の invoke を使ってアクセスします。C で書く前に Ruby の invoke メソッドだけを使ってアクセスしてみます。 参考:Win32OLE 活用法 【第 2 回】 Excel COM を学ぶ(5) : Mingw で MS-Access,SQL server に接続 requir…

 C++ で書かれた wxTutorial を wxHaskell に置き換える(statusBar)

C++ で書かれた wxTutorial by Franky Braem の例を wxHaskell に置き換えながら wxWidgets と wxHaskell の学習をしようと思います。 まず、C++のソースです。 HelloWorldApp.h // http://wiki.wxwidgets.org/Hello_World #ifndef INCLUDED_HELLOWORLDAPP_H…

Linux でも wxHaskell

Ubuntu Linux でも wxHaskell が動作したのでメモしておきます。 wxWidgets ライブラリを apt-get コマンドでインストールしての cabal install wx はコンパイルに失敗。 WxHaskell/Building を参考にソースからインストールしました。 wxWidgets のインスト…

Frame をスクリーン中央に位置させる(frameCenter)

module Main where import Graphics.UI.WX import Graphics.UI.WXCore.Frame (frameCenter) main :: IO () -- start :: IO a -> IO () -- Defined in Graphics.UI.WX main = start hello {- frameCenter :: Frame a -> IO () Center the frame on the screen…