プログラミング

Haskellでwhichコマンド

基本機能だけです。 import qualified Control.Monad as CM import qualified Data.Maybe as DM import System.Directory (doesFileExist) import System.Environment (getArgs) import System.FilePath (getSearchPath, ()) findExe :: String -> IO (Maybe…

Haskellでwc -lを作った

String,ByteString,Textの速度比較を行うために、wc -lを作ってみました。 用意したコードは下記の通りです。 mywc_text.hs {-# LANGUAGE OverloadedStrings #-} import Control.Applicative ((<$>)) import qualified Data.Text.Lazy as LazyT import quali…

Haskellでtailコマンド - その2

前回作ったtailがあまりにも遅過ぎて酷かったので、全面的に書き直しました。 mmapは使ってません。conduitは使ってます。 {- - 方針 - Sourceでは、seekして後ろから4096バイトずつ(又はファイルサイズの1/10バイトずつ)取得する。 - Conduitで、後ろからn…

Haskellでtailコマンド

conduitを試しに使ってみようという事でtailコマンド書いてみました。 やれることはファイルの後ろから数行を表示するという基本だけ。 引数の処理はテキトーなので行数指定必須です。クソです。 {-# LANGUAGE OverloadedStrings #-} import Control.Applica…

Vimからhlintを少し便利に使えるvim compiler plugin

http://blog.michaelrueegg.name/?p=209 こちらで紹介されているコンパイラプラグインを使うと、ページ下部の画像に表示されているような感じでhlintの出力する情報がvim上に表示されます。

wxHaskellでXRCファイルを読み込む。

import Graphics.UI.WX import Graphics.UI.WXCore main :: IO () main = start $ do r <- xmlResourceCreateFromFile "hoge.xrc" wxXRC_USE_LOCALE f <- xmlResourceLoadFrame r objectNull "hogeFrame" b <- xmlResourceGetButton f "hogeButton" set b [ …

冪乗計算のバイナリ法と冪剰余

GCJJ決勝のB問題を解いてたら解けなくて気づいたらここに辿り着いてたのでメモ。 冪剰余計算 import Data.List bits :: Integer -> [Integer] bits e = reverse $ bits' e where bits' 0 = [] bits' x = (x `mod` 2) : bits' (x `div` 2) binaryMod :: Integ…

PeggyでHTMLパーサー(手抜き)を書いてみた

PEGとか知らないけどPeggy - The Parser Generator for Haskellを見ながら書いてみた。 思うところは色々あるけどもう今日は終わりたいから書いておく。 {-# LANGUAGE TemplateHaskell, QuasiQuotes, FlexibleContexts #-} import Text.Peggy main = print .…

wxHaskellでMediaCtrlを使用する

※gdgdやりながら何とか動いた時の手順をまとめた自分用のメモなので、正規のやり方では無い可能性があります。 なお、ubuntu11.04での話です。 wxWidgets ./configure --enable-mediactrl --enable-unicode make make installでインストール。ここまで問題な…

マルバツゲーム

RWHでモナド変換子とか色々覚えたので、それらを使ってマルバツゲーム作ってみた。 {-# LANGUAGE GeneralizedNewtypeDeriving #-} import Control.Applicative import Control.Monad.Error import Control.Monad.Instances import Control.Monad.State impor…

PerlでのDNS逆引き

IPv4の場合の逆引き use Socket; gethostbyaddr(pack('C4',split('\.', $ip)), AF_INET); IPv6の場合の逆引き use Socket6; gethostbyaddr(inet_pton(AF_INET6, $ip), AF_INET6); とりあえず、やり方だけ記録。

C++0x VS2010/g++4.5共通で使用可能な機能

auto lambda Rvalue references (without for *this) decltype Right angle brackets Local and unnamed types as template arguments Extern templates Static assertions

Qtでアイコン取得

// システムアイコンの取得 QIcon icon = QCommonStyle().standardIcon(QStyle::SP_HOGEHOGE); // ファイルに設定されたアイコンの取得。 QIcon icon = QFileIconProvider().icon(QFileInfo(FILENAME)); ディレクトリのアイコンはシステムアイコンに含まれて…

Monad Laws

日本語訳何て言うの。 何やらMonadを扱う関数は下記の3つのルールを守れという事だそうな。 return a >>= f が f a と同義。 f >>= return が f と同義。 f >>= (\x -> g x >>= h) が (f >>= g) >>= h と同義。合成の優先順位が変わっても問題ないように、と…

do notation

基本的には、(>>)::(Monad m) => m a -> m b -> m bの連鎖のシンタックスシュガー。 ※以下に現れるfsは処理の集まりを表す。 do{f}→f do{f; fs}→f>>do{fs} ただし以下の特殊な動作になる場合が存在する。 do{let decls; fs}→let decls in do{fs} do{x >= g

HaskellでXorShift

整数型の無限リストという形で疑似乱数が欲しかったのでXorShiftで作ってみました。 これを作る過程でData.WordとBitsを使いましたが、使いやすくてすごく気に入った。 ちなみにC/C++の^記号がXORを意味するのを忘れていて無駄に時間を食ったのは内緒。 impo…

あるリストの各要素をある処理を経て他のリストへ入れたい時。

例えば『空白区切りで並んだ数値文字列の合計を算出して、それをリストに格納したい』時。 以下のような処理を行う。 -- 仮に結果を単精度浮動小数点数としておく。 plus :: String -> [Float] plus = foldl f [] . words -- (1) where f (x:xs) d = (x + (r…

ガードで分岐

ガードで分岐させてもそれぞれが別々の関数になるわけではない。 あくまでcase式のシンタックスシュガーである事を忘れない。 --追記 パターンマッチも同じ扱いだった。

たぶん慣れるしかないんだろうけども

「Yet Another Haskell Tutorial」がMonadの章まで来たので、ここで一旦Haskellでコードを書く訓練をしている。 細かい機能は便利だと思うんだが、アルゴル系言語みたいに思いついたまま書くことが出来ないことが痛い。 これを何かクリアする方法は無いもん…

Haskellの型推論

当てはめる型をプログラマが指定しなくて良いC++のテンプレートな感じ。 静的型付けだから、似たようなもんになるのは当たり前か・・・。

LLの強みを改めて知った

C++で細かいこと気にしながら時間掛けて作るくらいなら、LLでさっさと作るべき。 LLで性能上の問題が出てからC++でも遅くない。 ただしWindows、オメーはダメだ。

SpeedyCGI使ってみた

さっそくハマった。 ハマったとは言ってもmod_perlにもあったような問題で、単にそんなことを忘れていた自分がアホだったという話。 SpeedyCGIを使って自作スクリプトを動かしていたのですが、何か調子が良くない。 よくよく調べてみると、POSTやGETで送るパ…

C++の仮想メンバ関数。主に仮想デストラクタ。

先日、継承の階層が3層(親・子・孫)となっている場合、子のクラスのデストラクタにvirtualは必要なのか気になったので実験してみました。 ついでにデストラクタ以外の普通のメンバ関数についても検証。 まず以下のようなクラスとmain関数を用意。 #include <iostream></iostream>…

ウィンドウ枠を消し飛ばす

QWidgetの第二引数にQt::FramelessWindowHintを渡すだけ。 サンプルはQtのexamples/widgets/shapedclock。

SQLiteを今更知った。

名前だけは3・4年前から知ってたんですよ。 今回地味なアプリを作るに当たって、CSVを直に読み書きするのも何だか面倒だなーと思い、似たようなもんでもっと楽に扱えるもの無いかなと探して辿り着いたのがSQLiteでした。 Qtにも入ってるので自分的には特に面…

FizzBuzz by perl

for(my $i=1;$i<101;++$i){ print $i%3 && $i%5 ? $i : ($i%3 ? "" : "Fizz", $i%5 ? "" : "Buzz"), "\n"; } foreach((1...100)){ print $_%3 && $_%5 ? $_ : ($_%3 ? "" : "Fizz", $_%5 ? "" : "Buzz"), "\n"; } print map{ $_%3 && $_%5 ? $_ : ($_%3 ? ""…

シェルでパスワードとかの入力を非表示にする。

パスワードに限らないけど、ユーザーが入力した文字列を非表示にする方法。 参考:sh でパスワードなどを入力させる時に非表示にする - Enjoi Blog sttyというコンソールのテキスト表示に関する設定をするコマンドを使います。 stty -echo で、以降ずっと入…

PerlでEmail::Send::Gmailを使ってメール送信

Email::Send::Gmail - Send Messages using Gmail - metacpan.org 超簡単。 ただしマルチバイト文字をEmail::Simple::Creatorのオブジェクトに設定する時は適切な文字コード(日本語ならiso-2022-jp)へ変換し、utf-8フラグを落としておくこと。

名前被り

どんな名称が使われているか想定出来ないような状況の場合、略語は高確率で被る。 制約が無い場合は自身の所有しているドメイン名を用いると被る確率は大幅に減る。 そうも言っていられない場合はなるべくその場においてユニークなキーを用いる。 万が一被っ…

QtScriptがすごく面白そう

だいぶQtにも慣れてきたのでQtScriptをいじり始めてみました。 QScriptEngine engine; QString script("1+2"), result; result = engine.evaluate( script ).toString(); これでresultに文字列の3がセットされます。 QtScriptはECMA Scriptをベースにしてい…