地球の反対側で

> Both Van Rossum (Python) and Yukihiro Matsumoto (Python) got beards.

Yup, they both invented Python at the exact same time on nearly opposite sides of the earth.

http://blogs.microsoft.co.il/blogs/tamir/archive/2008/04/28/computer-languages-and-facial-hair-take-two.aspx#83570

これはひどいwお茶吹いたw

誤植でまつもとさんがPythonを作ったことになっているのを茶化した文章なんだろうけど「地球のほぼ反対側で同時にPythonを作ったんだ」ってw

apacheをインストールしたけど動かなかった件

1: FreeBSDportsapacheを入れる。
2: /etc/rc.confに「apache2_enable="YES"」と書く
3: なぜかapacheを起動できない
4: twitterに泣きつく
5:

/usr/local/etc/rc.d/apache22 rcvar とか見てみるとよいかも? by taraijpn

6:

# /usr/local/etc/rc.d/apache22 rcvar
# apache22
apache22_enable=NO

7: 「apache22_enable="YES"」に書き換える。

# /usr/local/etc/rc.d/apache22 rcvar
# apache22
apache22_enable=YES

8: 「/usr/local/etc/rc.d/apache22 start」してみる。→ ps -x したけどhttpdapacheもいない。
9: http://www.mail-archive.com/freebsd-users-jp@jp.freebsd.org/msg01982.html
10: httpd.confも書き換えてみる。

# /usr/local/etc/rc.d/apache22 start
Performing sanity check on apache22 configuration:
Syntax OK
Starting apache22.
# ps -awx | grep "httpd"
86314  p2  T      0:02.00 emacs /usr/local/etc/apache22/httpd.conf
# ps -awx | grep "apache"
86314  p2  T      0:02.00 emacs /usr/local/etc/apache22/httpd.conf
# ps -awx | grep "www"

なんのエラーメッセージも出さないのにプロセスもいない。

11: wwwユーザがいないと思ったけどいた

# ls /home/www
ls: /home/www: No such file or directory
(/home/wwwは存在しない)

# su www
This account is currently not available.
# su wwwwww
su: unknown login: wwwwww
(wwwというユーザ自体は存在するみたい)

追記:「cat /etc/passwd」でいい。cf. http://twitter.com/cent/statuses/800984873

12: どうにもわからないのでmake deinstallしてmake reinstallしてみる。

13: とりあえずリブートしてみるwindows脳。

14:

/var/log/apache22/ 以下で error log を読むべし by wtanabe

> cd /var/log/
> tail httpd-error.log
[Thu May 01 15:41:17 2008] [warn] Init: Session Cache is not configured [hint: SSLSessionCache]
[Thu May 01 15:41:17 2008] [alert] (EAI 8)hostname nor servname provided, or not known: mod_unique_id: unable to find IPv4 address of "*******"
Configuration Failed

検索してみる。

エラーログを確認すると、
(EAI 8)host/servname not known: mod_unique_id: unable to find IPv4 address of "hostname"
って感じだったので、
/etc/hostsに追加

http://www.manami.st/clog/2006-11-17-2.html

おお!It works!って出た!みんなありがとう!!!

        • -

http://d.hatena.ne.jp/nishiohirokazu/20080421/1208764084 に書き足した。

日本人いっぱい


定員1500人を超えたとかで参加できない人もいるみたい。


500点問題をなんども間違っていないかテストしたりテストケース追加したりしたんだけど、これ与えられているテストケースがコーナーケースじゃないの。さっさとサブミットしてしまった方がよかったのかなぁ。そして残り10分でC++幅優先探索のコードを書く力量は僕にはない。今後の課題にする。


このあと一人だけ1000点を解いた。僕4位だからダメ元で迎撃する。

ダメ元で迎撃しようと用意しておいたテストケースを貼ろうとしたらそうだったコピペできないんだった。なれないGUIでテストケース作ってたら誰かに先に撃墜されてた。

なんか2位。練習に1位の人を攻撃してみよう。

。。。なんか間違いを犯した気がする。チャレンジ失敗のペナルティで3位と逆転したっぽい。


システムテストの結果:

先生、うちのクラスは500点問題全滅なんですけど><


まぁ、理由はだいたい想像がつくが。うーむ。どういう戦略が正解だったのかなぁ。

        • -

500点問題の解説。ある数が与えられたときに、その数が「素数のn乗」であるかどうかを判定せよ、という問題。nは2以上。返す値は、素数のn乗ではないとき空のvector、pのn乗であるとき{p, n}。これで与えられる数の範囲が狭ければまだいいが、恐ろしいことに「与えられる数は2以上10^18以下とする」とな。引数が文字列で与えられるからてっきりlong longに収まらないと思い込んでしまったが、収まるよね。

>>> 2 ** 63
9223372036854775808L
>>> 10 ** 18
1000000000000000000L

探すべき空間が広いので、順番に探したりしたら全然間に合わない。というわけでpow(x, 1.0/3.0)とかしてみた。xがなんらかの整数のn乗であるかどうかは、pow(x, 1.0 / n)の値を切り捨ててプラスマイナス1くらいの範囲でn乗してみてxと一致するかどうかをチェック。

  vector <int> baseAndExponent(string n) {
    LL v = lexical_cast<LL>(n);
    for(size_t i=2; i<10000; i++){
      double d = pow(v, 1.0/i);
      if(d < 2.0) break;
      cout << d << endl;
      LL start(d - 1);
      LL end(d + 2);
      for(size_t j=start; j<end; j++){
	LL power = 1;
        for(size_t k=0; k<i; k++){
	  power *= j;
	}
	if(power == v){
	  // is prime?
	  bool isPrime = true;
	  LL ubound(sqrt(j)+1);
	  for(size_t x=2; x<ubound; x++){
	    if(j % x == 0){
	      isPrime = false;
	      break;
	    }
	  }
	  if(j < 4) isPrime = true;
	  if(isPrime){
	    vector<int> result;
	    result.push_back(j);
	    result.push_back(i);
	    return result;
	  }
	}
      }
    }
    vector<int> result;
    return result;
  }

浮動小数点数の切り捨ての仕方がわからないのでwarningを無視してむりやり整数に。システムテストに落ちた原因はここ

	LL power = 1;
        for(size_t k=0; k<i; k++){
	  power *= j;
	}
	if(power == v){

「jをk乗して、vに一致するなら」のつもりだったけども、これが入力が639558602475808609の時に2.07952の56乗になって、プラス1の3の56乗がオーバーフローを繰り返した結果なんと入力に一致するという罠。

3
9
27
81
243
729
2187
(snip)
6048575297968530377
-301018179803960485
-903054539411881455
-2709163618235644365
-8127490854706933095
-5935728490411247669
639558602475808609

うあー。オーバーフローの可能性にもっと敏感にならなきゃ行けないんだなぁ。
気づいていれば「if(power < 0) break;」の一言で一位になれたんだけどな。まだまだ道のりは長い。

        • -

次回の目標
□ 500点問題を取る
□ 掛け算、足し算を見たらオーバーフローを疑え