Search on the blog

2013年8月31日土曜日

To Mock a Mockingbird(3)

 Chapter 3読んだ。一気にレベルがあがった感じがする。自力で解けたのは半分くらいな気がする。

ちなみに問題2のWhat  About This Oneは解答が間違ってるので注意。
下のサイトに詳しい解説がある。

http://math.stackexchange.com/questions/189537/to-mock-a-mockingbird-two-barbers-logic-puzzle

2013年8月28日水曜日

To Mock a Mockingbird(2)

 Chapter 2復習しました。
嘘つきと正直者の問題でよくある「あなたは主張Pが正しいと言っちゃうかんじの人ですか?」という例のあれは『the Nelson Goodman Principle』という名前がついてるそうです。

 Chapter 2の問題は、いわゆる嘘つきと正直者の問題が中心ですが「Yes/Noで答えられる問題、かつ、3語以内」という制約が付くので、単純にthe Nelson Goodman Principleを適用して終わり。とはなりません。そこがこの本のおもしろいところ。
特に奥さんの名前を忘れたおっちょこちょいの論理学者の問題がおもしろかった(問題の設定、問題自体ともに)。
 

2013年8月26日月曜日

To Mock a Mockingbird(1)

気分転換に『To Mock a Mockingbird』のchapter 1を読み直しました。
やっぱり面白いですね。


 
 本の中で紹介されていた「Sancho Panza paradox」について少し調べてみました。
Sancho Panzaっていうのは、人の名前らしいです。スペイン人の小説家が書いた「Don Quixote」という物語の中の登場人物です。

Sancho Panzaが橋を渡ろうとしたとき、役人が彼を止めます。そしてこう言います。
「もし本当のことを言えばこの橋を通してやろう。嘘を言えばお前は絞首刑だ。」

まあ普通の人なら「1 + 1 = 2です。」とか言って橋を通るのですが、Sancho Panzaはこう言いました。
「僕は絞首刑になるだろうね。」

Sancho Panzaかっこよすぎるぜ!


2013年8月18日日曜日

Codeforces Round #188 Strings of Power

問題
文字列tが与えられる。tの中に含れる部分文字列のうちheavy*metalにマッチするものの数を求めよ。

解法
heavyにマッチする部分文字列の位置pと、metalにマッチする部分文字列の位置qをあらかじめ求めておく。
その後、(p, q)の組み合わせを求めればよい。

ソースコード
自分で書いたコード。これは無駄がある。heavyにマッチする位置に来たら今いるところより後にあるmetalの個数を足している。これをやるにはある位置より後にあるmetalの個数を前処理で計算しておかないといけない(sumg[]のところ)。
const int L = 1e6;
char t[L+1];
bool f[L], g[L];
int sumg[L+1];

int main() {
    scanf(" %s", t);
    int len = strlen(t);

    for (int i = 0; i < len; i++) {
        if (strncmp("heavy", t+i, 5) == 0)
            f[i] = true;
    }

    for (int i = 0; i < len; i++) {
        if (strncmp("metal", t+i, 5) == 0)
            g[i] = true;
    }

    for (int i = len-1; i >= 0; i--) {
        sumg[i] = sumg[i+1];
        if (g[i])
            sumg[i]++;
    }

    long long ret = 0;
    for (int i = 0; i < len; i++) {
        if (f[i])
            ret += sumg[i];
    }

    cout << ret << endl;
    
    return 0;
}
逆の発想で、metalにマッチする場所に来たら今より前にあるheavyの個数を足す。という風にプログラミングするとシンプルに書ける。
const int L = 1e6;
char t[L+1];
int flg[L];

int main() {
    scanf(" %s", t);
    int len = strlen(t);

    for (int i = 0; i < len; i++) {
        if (strncmp("heavy", t+i, 5) == 0)
            flg[i] = 1;
    }

    for (int i = 0; i < len; i++) {
        if (strncmp("metal", t+i, 5) == 0)
            flg[i] = -1;
    }

    long long ret = 0;
    int cnt = 0;
    for (int i = 0; i < len; i++) {
        if (flg[i] == 1)
            ++cnt;
        else if (flg[i] == -1)
            ret += cnt;
    }

    cout << ret << endl;
    
    return 0;
}

2013年8月14日水曜日

「プロになるためのWeb技術入門」 ――なぜ、あなたはWebシステムを開発できないのか

 『「プロになるためのWeb技術入門」 ――なぜ、あなたはWebシステムを開発できないのか』を読みました。昨年新入社員研修の講師をしていたときに、マネジャーの方が新人たちに勧めていたのでどんなものかなと思って読んでみました。

 インターネットの歴史、インターネットの発展とともにどのような要求が生まれたか、その要求を満たすためにどのような技術が作られたかということがわかりやすく書かれていました。

 だいたい知ってることが多かったですが、よくまとめられていて、これまで学んだことを効率的に復習することができました。

 扱っているトピックは、
  • クライアントとサーバー
  • URLとURI
  • GETとPOST
  • CGIとサーブレット
  • HTTPプロトコルについて
  • Cookieとセッション
  • 三層構成(Webサーバー、アプリケーションサーバー、DBサーバー)
  • MVCモデルを実現するフレームワーク(Struts 1を例に)
  • O/Rマッピング(iBATISを例に)
  • セキュリティ(SQLインジェクション、XSS、セッションハイジャック、CSRFなど)

と多岐に渡り、最低限知っておくべきことはほぼ網羅されているのかなと思います。

そしてこの本の一番いいところは、「今の業界ではこうするのが常識だ!」、「この技術を使いなさい!」と押し付けるのではなく、

  • なぜその技術を使用する必要があるのか?
  • その技術が生まれる前はどのような問題があったのか?
  • その技術のおかげでどのようなメリットがえられるのか?

をきちんと説明してくれるところです。この価格で、扱ってるテーマも広いのに、ここまで丁寧に説明してくれる本はなかなかないのではと思います。エンジニア一年生に勧めるべき最高の本です。

2013年8月13日火曜日

サーバー奮闘記(25) AJPを使ってTomcatとApacheの連携

ひさびさにサーバー奮闘記を書きます。
今日はAJPモジュールを用いたTomcatとApacheの連携をやってみました。
と言っても設定するだけなので簡単です。

参考にしたサイト:

Ubuntuの場合は下の方のサイトが参考になると思います。

ふー、これでJavaで作ったウェブアプリケーションをサーバー上で動かせるようになった。

strutsを使ってhello world的なものを書いてみました。以下の手順でサーバーにデプロイしました。
  1. ローカルマシンのEclipseでコーディング
  2. 作成したプロジェクトをwarファイル形式でエクスポート
  3. warファイルをサーバーの$CATALINA_BASE/webapps/配下に置く
  4. Tomcatを再起動

出来たもの(というほどのものじゃないが。。):
http://kenjih.com/tmc/SayHello.do