--/--/--

スポンサーサイト

上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。

2007/11/29

C#

C# 3.0 の新機能

Java 屋の俺からすれば羨ましい機能ばかり。なんでも大文字開始っていう慣習に馴染めないことと、ほぼ Windows 専用っていう理由から使う気にはならないけど。lambda とかなんだよ。羨ましすぎる。

2007/11/26

情報整理

最近思いついたことをメモにとるよう心がけている。と、いつかも書いた気がするけど、やり方を少し変えてみた。

以前はホームディレクトリ配下にメモ用ファイルを作り、それにひたすら書き込んでいた。書きつつもなんとなく不満に思っていたこともある。

  1. いつのものか分からない
  2. でかくなる
  3. 会社と自宅で一元管理できない
  4. 単純なテキストファイル故、表や図などが挿入できない

4. はしょうがないとして、他はどうにかしたい。ということで以下のようにしてみた。これといって真新しいことではないけども。

  1. HDDのホームディレクトリではなく、USBメモリなどポータブルなデバイスにメモ用のディレクトリを用意する
  2. メモ用ディレクトリ配下に yyyyMMdd フォーマットのファイルを作り、日毎に分ける。

それから注意したいのは後々検索しやすいように、自分なりの簡単なフォーマットを作っておくこと。例えば見出しは

- 見出し1
-- 見出し2
--- 見出し3

としておくとか。

あとメモファイルを開くのを簡略化するスクリプトを用意しておくのもいい。

#!/bin/sh

prefix=path/to/your/memo/dir
file_name=`date +"%Y%m%d"`
path_to_memo="$prefix""$file_name"

if [ ! -f "$path_to_memo" ]; then
    touch "$path_to_memo"
fi

editor=path/to/your/favorite/editor

if [ -z "$editor" ]; then
    editor=`which vi`
fi

"$editor" "$path_to_memo"

こういう習慣的なことを導入するのに一番心がけたいことは、面倒臭くない仕組みを考えることに尽きると思う。それが楽しくてそこで飽きてしまったりすることもあったりなかったり。

2007/11/25

掃除機

先週から米粒一粒を吸い込めないほど吸引力が落ちてて、やっぱダイソンほしいなーと思いつつ、これはさすがにおかしいだろと思っていた。吸い込み口のところを取り外して中を見たところ、予想通りミッチリとごみが詰まっていた。

これを除去してやったところ、買った当時のような吸引力に戻った。

2007/11/24

オブジェクト指向入門

オブジェクト指向入門 第2版 原則・コンセプト (IT Architect’Archive クラシックモダン・コンピューティング) (単行本(ソフトカバー))

一ヶ月前から読み始めてようやく残り一章。時間かけすぎて内容忘れてきてるから再読の必要ありだな。時間かけるならかけるなりに、読んだ後に簡単でもいいから自分でまとめとかないと忘れる。教訓。

2007/11/24

emacs

ふとまた使ってみようかなぁ、と思ったり。Vim は捨てられないのでもちろん併用で。手始めにはてブ - emacsタグを購読し始めてみた。

2007/11/23

友愛数

wikipedia - 友愛数

Haskell で練習がてら書いてみた。かなり遅い。原因も分かってはいるが、腕不足で直せない。

divisors n = [x | x <- [1..n `div` (if odd n then 3 else 2)], n `mod` x == 0]

sumDivisors = sum . divisors

getAmicable n | and [(n == m'), (n /= m)] = (n,m) -- 完全数ではない
             | otherwise                 = (-1,-1)
             where
                m  = sumDivisors n
                m' = sumDivisors m

isAmicable (n,m) | and [(n == -1),(m == -1)]   = False
                | otherwise                   = True

swapNub [] = []
swapNub (x:xs) = x : swapNub (filter (((/=) (fst x)) . snd) xs)

main = putStrLn $ show $ swapNub $ filter isAmicable [getAmicable n |
n <- [1..10000]]
-- [(220,284),(1184,1210),(2620,2924),(5020,5564),(6232,6368)]

できなかったこと

  • 一度求めた値のキャッシュ
  • 重複する値を求めない

もっと別のアプローチがあるんでしょう。関数の合成についてはかなり理解が深まった。

2007/11/23

seasar2 セットアップ

Seasar - DI Container with AOP

セットアップでこけて涙目になってた。URL 先の手順と違うようにやったことは、

  • eclipse 3.3 を入れた
  • tomcat 5.5 は apt-get 経由

ぐらいなもの。

原因

org.seasar.framework.exception.ParserConfigurationRuntimeException: [ESSR0053]パーサの設定に問題があります。理由はjavax.xml.parsers.ParserConfigurationException: Feature 'http://apache.org/xml/features/xinclude' is not recognized.

っていう例外が出ていた。

対策

FAQ/Teeda - SeasarWiki
$TOMCAT/common/endorsedにある、xercesImpl.jarとxml-apis.jarを削除してください。 (Tomcat 5.5.20で確認)

これを施したところ、とりあえず Hello World までこぎつけた。辛かった。

2007/11/19

WayToHaskeller

Programming:WayToHaskeller

こっちのがくだけた感じでとっつきやすそう。

2007/11/18

anthy と vim の共存と悲しい結末

ubuntu にデフォルトでインストールされている IM の scim-anthy では、vim との共存ができない。というのも、以下のようなことが Windows の IM(MS-IMEだっけ?) ではできるが、scim-anthy ではできない。

  1. 挿入モードに移行
  2. 日本語入力
  3. 日本語入力モードのままコマンドモードへ移行
  4. 自動的に直接入力モードに戻る
  5. もう一度挿入モード
  6. 直前の挿入モードから抜けた時の入力モードに自動的に切り替わる

scim-anthy ではこれを実現することはできないっぽいけど、uim-anthy とやらではこれができるということで早速試してみたところ、確かにうまくいってる。軽く感動し、これをブログに書こうといざ firefox を開いた。

「タイトルは”anthy t”・・・・・。」

”と”が打とうとしたところで firefox が固まった。というわけで scim-anthy に戻った。

2007/11/18

モナドって要するに

>>= とか >> とかできる型のことなんだな。とりあえずはこれぐらいの意味にかるーく捉えといたほうがよさそう。理論的なことは後回し。

2007/11/18

気になってた言葉

副作用

OCaml プログラミング入門
関数型言語においては全ての式はある値を表現しています。 副作用とは、その値を計算するため以外に、プログラムの状態の 変化を起こすものです。
On Lisp --- 関数的プログラミング
副作用とはオブジェクトの破壊的な変更(rplacaの使用等)や 変数への代入(setqの使用等)を含む. 副作用を使う数が少なく,その影響範囲もローカルなものであれば, プログラムの読み取り,テスト,デバッグは簡単になる.

要するに目的とは違うところで起こる変化のことと思っとけばいいのかな。

2007/11/17

Haskell その後

どうかく.org の Haskell の投稿眺めては写したりしてだいぶ読めるようになった。とはいってもモナドが絡むとほとんど読めないし、何より全くと言っていいほど書けない。書こうと思っても、いわゆる命令型言語的なコードしか思いつかない。しかもそれを Haskell で表現する方法を知らない。肝心の関数型言語的なコードなんて全く思い浮かばない。まぁそれでもコツコツやらんことにはいつまで経ってもこのままなわけで。

コード眺めてて思ってたのは標準関数をほとんど知らないということ。unlines? even? odd? flip? まずはここからだろうということで、コード中に出てくる Prelude 関数をここで調べてはコメントでそのコードを写したりしてる。Prelude のコードは眺めるだけで面白い。なるほどの連続。

ちなみに俺が初めて自分の手だけで書いた Haskell コード。

data Rectangle = Rect Int Int Int Int
isCross :: Rectangle -> Rectangle -> Bool
isCross (Rect leftx rightx topx bottomx) (Rect lefty righty topy bottomy) = (leftx < righty && lefty < rightx) && (topx < bottomy && topy < bottomx)
main = putStrLn $ show $ isCross (Rect 50 150 50 150) (Rect 0 100 0 100)

2007/11/16

モニタの明るさはちょい暗めに

俺のモニタには ECO ボタンってのがついてて、これを押すとその名の通り、エコモード、すなわち省電力、ぶっちゃければ暗くなる。明るさ MAX ~ 90 は俺の目には辛い。しょぼしょぼする。

追記

明るさは「バックライト輝度」というらしい。それから元は 80 だった。60 くらいでちょうどいいらしい。

2007/11/16

やさしい Haskell 入門読了

やさしい Haskell 入門

クソ難しかった。自分の頭の悪さを痛感した気分。ほとんどコード書かずに読み進めたせいもあるか。モナドって結局なんだったの。値の引渡しくらいなもんかと思って読み進めたら Resource がどうのってところあたりからわけわかめ。

  • data
  • データ構築子
  • type
  • newtype
  • 型クラス
  • 構築子
  • インスタンス

この辺は基礎的なわりにかなりごっちゃになってるから今度整理しよう。

2007/11/11

compiz-fusion 使いながら katapult 使うときの注意点

compiz-fusion には katapult デフォルトの起動ショートカット alt-space が割り振られているため、compiz-fusion 使いながらだとデフォルトのショートカットを利用できない。katapult 側を変えるか compiz-fusion 側を変えるかどちらかがこれを解決する手段になる。

katapult の起動ショートカットを変更する

  1. メニューから katapult を起動する
  2. 通知スペースに出てきたアイコンを右クリックして Configure Global Shortcuts を開く
  3. Show Launcher のショートカットを変える

compiz-fusion のショートカットを変更する

compiz-fusion で alt-space に割り振られているのはウィンドウメニューの表示。簡単に言えばウィンドウのタイトルバーを右クリックしたときに出るやつを開く。個人的にこれはいらなかったので disenable 化した。

  1. Compiz Config Setting Manager を開く
  2. General を開く
  3. Key bindings を開く
  4. ウィンドウメニュー という項目を探す
  5. ショートカットが表示されているボタンをクリックして一番上のチェックを外す。

以上で compiz-fusion の alt-space が無効化され、katapult の alt-space が有効化される。

しかしもう1つ罠があったりする。compiz-fusion とはまた別のキーボードショートカット設定にも alt-space が割り振られている。これも同様に無効化する。

  1. システム -> 設定 -> キーボードショートカットを開く
  2. ウィンドウメニューをアクティブにする を無効化する

以上。

2007/11/11

firefox で Google Reader 使ってるとポップアップブロッカーがいかれてうざい

firefox で Google Reader の v ショートカットキー使ってジャンプしてると、急にポップアップブロッカーがいかれてポップアップできなくなる。firefox を再起動すれば元に戻るんだけど、面倒臭いし負けた気分になる。

mofiganの日記 - Firefox 2.0のポップアップブロッカーがうざい件

元記事が消えてるっぽいからブックマークページをリンク。

記事は見れないけどキャッシュから自分が求めることに対することが書かれていることと、ブックマークコメントからその結論を推測。(というか書いてある。)

で、about:config の dom.popup_maximum の値を大きくすればいいと。

dom.popup_maximum っていうのは何かっていうと、

Firefox2.0からポップアップブロックの動作がおかしいような?(3)

「同時に開くことのできるポップアップウィンドウの最大値」が設定できるということなんですな。

ということらしい。それなら 1000 にしときゃまず困ることはないだろうなぁ。

2007/11/11

タバコの購入はさっさと免許制にしろよ

根っから嫌煙な俺。1年間、タバコを吸う彼女と一緒に生活を過ごしたが、これが原因で何度かぶつかりあった。今年に入ってやめてもらった。

購入者の年齢を顔で判断するタバコ自販機 - スラッシュドットジャパン

実現したらすごいけどさ。バカなことやるよね。まさに技術の無駄遣い。

自販機だけじゃなく、スーパー・コンビニにいくと「当店では、未成年のお客様にタバコ・お酒の販売は~」なんて言ってるけど、普通に売ってるでしょ。どうすれば確実にこれを実現できるか。

簡単なこと。タバコの購入に免許の提示を義務化するような制度を作ればいい。免許を提示できない人間にはタバコを売ることができない、ただそれだけの話。ついでに自販機もこれに対応すればいい。新500円も最初は2000円札のようになるのではないかと思っていたけどもうすっかり当たり前のように使われているのだから、これも浸透するのにそんなに時間はかからないはず。免許の発行は役所で。年齢制限に引っかかってる人(今だと20才未満)には発行しない。

上の記事には

判別が微妙な20歳前後の人は運転免許証を差し込む必要がある。2008年からは専用のカード(成人を証明する)でしか買えない自販機が登場することになっているが、

なんて書いてあるけど、運転免許証持ってない人はどうすんの。そういうまわりくどいことやるから普及しないんじゃないの。

制度の導入に関しても、大した労力ではないはず。店での購入時はただ免許の提示を促すようにすればいいだけ。自販機は多少時間はかかるかもしれないけど、5,6年すれば普通になるでしょう。免許を受け取った側も、車の免許のように更新する必要も特にないし、年さえ取れば受け取れるのだから免許をとるために何かをする必要もない。100%未成年のタバコ購入を抑制できるかと言えば NO なんだろうけど、かなり効果あるでしょ。

素人でも簡単に思いつく制度なのに対応しないのは、税収が減るからという理由だけなんだろうな。見ているものは目先の利益ばかり。

2007/11/10

弐寺

またちょくちょくやり始めた。家庭用オンリー。

で、また NEBULA GRASPER(H) の乱でリハビリ。もはやリハビリゲームか。

2007/11/10

リスト内包表記ってスバラシイ

久しぶりの python でクイックソート。

#!/usr/bin/env python
#coding:utf-8

def quicksort(xs):
    if len(xs) <= 1:
        return xs
    #x未満の要素をxsから抽出
    lt = lambda x, xs: [y for y in xs if y < x]
    #x以上の要素をxsから抽出
    gteq = lambda x, xs: [y for y in xs if y >= x]
    head = xs[0]
    tail = xs[1:]
    return quicksort(lt(head, tail)) + [head] + quicksort(gteq(head, tail))

if __name__ == '__main__':
    print quicksort([3, 2, 1, 47, 7, 8, 2, 0])

よくある Haskell のクイックソートのサンプル眺めててこれ python でも似たようなことできるじゃんって気づいた。逆に今まで気づかなかった。

  • lt と gteq がひどかったからシグネチャを修正。

2007/11/04

幸運数

幸運数 - wikipedia

LuckyNumber.java

import java.util.Arrays;
import java.util.ArrayList;
import java.util.List;

public class LuckyNumber {

    /**
     * 幸運数を求める.
     *
     * @param data 幸運数を求める自然数の数列
     * @return 幸運数の数列
     */
    public int[] sieve(int[] data) {
        //偶数を除く
        for (int i = 0; i < data.length; ++i) {
            if (data[i] % 2 == 0) {
                data[i] = -1;
            }
        }
        int[] target = new int[data.length + 1];
        data = pickupPositive(data);
        System.arraycopy(data, 0, target, 1, data.length);
        target[0] = -1; // 0番目は使わない
        target = sieve(target, 2);
        return pickupPositive(target);
    }

    /**
     * 幸運数を求める.
     *
     * @param data 幸運数を求める自然数の数列
     * @param index 除く位置の基数
     * @return 幸運数の数列
     */
    private int[] sieve(int[] data, int index) {
        if (data.length - 1 <= index) { // 0番目が余計なので-1
            return data;
        }
        int lucky = data[index];
        for (int n = 1; lucky * n < data.length; ++n) {
            data[lucky * n] = -1; // 削除マーキング
        }
        int[] tmp = pickupPositive(data);
        int[] next = new int[tmp.length + 1];
        System.arraycopy(tmp, 0, next, 1, tmp.length);
        next[0] = -1;
        return sieve(next, index + 1);
    }

    /**
     * 数列から自然数のみを取りだして返す.
     *
     * @param data 数列
     * @return data から取り出した自然数の数列
     */
    private int[] pickupPositive(int[] data) {
        List<Integer> list = new ArrayList<Integer>();
        for (int i = 0; i < data.length; ++i) {
            if (data[i] > 0) {
                list.add(data[i]);
            }
        }
        Integer[] array = list.toArray(new Integer[list.size()]);
        int[] ret = new int[array.length];
        for (int i = 0; i < array.length; ++i) {
            //boxing
            ret[i] = array[i];
        }
        return ret;
    }

    public static void main(String[] args) {
        int[] data = new int[100];
        for (int i = 1; i <= data.length; ++i) {
            data[i - 1] = i;
        }
        LuckyNumber calculater = new LuckyNumber();
        System.out.println(Arrays.toString(data));
        System.out.println(Arrays.toString(calculater.sieve(data)));
    }

}

巨大すぎワロタ。index から取り出すあたりをシンプルにしたくて 0 番目に -1 入れたりしてみたけどかえって複雑になったような。配列から自然数を取り出すところとかもっと簡単にできないのかなぁ。最初から配列に詰めるとしても配列の長さが適切に決められないし、list.toArray(new Integer[list.size()]);だと型が違うと怒られるし。あとで ArrayList 使ってやり直そう。

via: 幸運数 - みずぴー日記

2007/11/04

vimperator のビープを消す

再インストールしてからというもの、vimperator のビープ音を消せなくて苛ついていた。ヘルプ見たら乗ってた。ほとんど vim と同じ。

まず、set vb とすれば音によるビープはなくなり画面が一瞬黒くなるビジュアルベル(ビープ)になる。しかしこれはこれで目によろしくないので、 set visualbellstyle= でビジュアルベル(ビープ)スタイルを空にする。これで完全にビープがなくなる。

2007/11/03

基礎体力

プログラマの基礎体力と言えばやはりアルゴリズム力だろう。アルゴリズムを考える力、それを実現する力。この力は言語に依存しないため応用が効くし、問題を解く力として大いに役立つ。

で、自分にはこれが著しく足りないと痛感している。恥ずかしながらいまだにクイックソートを自前で書いたことがない。なんとなくアルゴリズムは覚えているんだけど、書いたことはない。

運動の基礎力強化が基礎運動の繰り返しで量をこなすことと同じで、プログラミングの基礎力強化も量を解くことがもっとも効果的。というわけで今月はこれの強化を目標に頑張ってみよう。

いつかやっていた [今日のスクリプト] 的なことをもう一度やり直そう。最近はどう書く.orgもやってないし。

2007/11/02

core 2 duo 欲しいなぁ

憧れる理由はその処理能力よりも省電力性と静音性。

我が家のPCに積んである Pentium4 の 3.4GHz モデル。正式な名前は知らない。こいつがまた非常にうるさく、さらに電気を食いつぶす。CPU変えるだけで結構電気代浮きそうな気がする。

2007/11/01

きれい

LispCast

カッコーカッコー。こういう雰囲気にしようかな。

上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。