Project Euler – 問題1

10より小さい自然数で3または5の倍数である ものを全て列挙すると3,5,6,9である。またその和は23になる。

1000より小さい全ての3または5の倍数の和を求めよ。

まずは小手調べ的な問題。FizzBuzzと言われているものの派生といった感じか。 こういう問題をHaskellなら直感的にそのままプログラムにできる。まずリスト の内包表記という便利なものがあって、以下のように、|の後ろの条件を満たす 要素n全てという風にリストが定義できる。これで問題文の1000より小さい3ま たは5の倍数というのをそのまま書くと、nは1から999までの数で、n を3で割っ たあまりが0もしくは5で割ったあまりが0の数でできたリストが生成される。

sumという関数はリストのすべての要素の和を求めるのでこれで問題の解答が得 られるというわけだ。modは余りを求める関数であるが`mod`のようにバックク オートでくくることで演算子のように用いることができる。

euler001 = sum [n | n <- [1..999], n `mod` 3 == 0 || n `mod` 5 == 0]

Haskellを使ってProject Eulerに挑戦する

Project Eulerというサイトがある。 数学的な(とはいっても専門知識を必要とするようなものではない)問題を解 いて答えを入力すると正解かどうか判定してくれるというものだ。問題はどれ も人間が手で計算するにはちょっと面倒な設定になっていて、問題を解くプロ グラムを書いて答えを求めるように意図されている。アカウントを作成して参 加し、正解した問題にはチェックがつくというゲーム的な演出もあり、プログ ラムの演習的な題材としてよくできている。

最近(最近でもないが)Haskellに興味があるのだが、ただ興味があるだけでは なかなか身に着かないものなので、Haskellの練習もかねてこのProject Euler の問題に挑戦してみようと思う。Haskellのような関数型言語はこういう演習的 な問題を解くのに適しているので、練習の題材としてはちょうどいいと思う。

Haskellの環境を準備するのはこのページの本題ではないので割愛するというか Googleで調べてもらえばいろいろあると思う。とりあえず使用する処理系は ghc。Fedoraマシンで実行しているのでyum install ghcでインストールできた。 エディタはemacs。 haskell-mode というのを使えば色もつくし自動でインデントしてくれるので便利だ。という かHaskellの場合レイアウトを使うのが普通なのでインデントしてくれないとか なり大変。他に はhrefというツー ルもオススメ。これはコマンドラインから使えるHaskellのリファレンスマニュ アルで、日本語で説明してあって例もあるので非常に便利だ。

マジックペット

4からデータ引き継いだけど、
ペットは幸運にも卵からやりなおしだったので、
前とは違う名前付けました。

で、名前付けてすぐに予習の並び替え問題で
しゃっくりが出てきて一人笑ったw

5になって4より問題が難しい気がする。
現在フェニックス組だが、余裕で1回戦敗退とかする。

しかも、まだ始まったばかりなのに
すでに大賢者とか青銅賢者とかいるのがなんとも・・・

携帯からのアクセスの固体識別

最近DoCoMoの携帯電話からWebアクセスで固体識別のためのIDが出力されるよう になった。i-modeの公式サイトでは以前から固体識別ができていたらしい。一 般のサイトでもフォームのボタンにutnというオプションをつければ取得できた が、アクセスのたびにユーザがYESを押す必要があった。

今回取得できるIDはこれらのIDとは別物であるらしいが、単に自動ログインな どのためのユーザ識別にはなんら問題がない。特にDoCoMoの携帯はクッキーが 使えないのでわりと重要かと思われる。

その使用方法はというと、URLにguid=onという引数をつけることでIDが出力さ れるらしい。例えば、このサイトにアクセスする場合、 http://www.euphe.net/のかわりにhttp://www.euphe.net/?guid=onというURLで アクセスしてもらえばいい。するとヘッダの中にX-DCMGUIDという項目でIDが送 られて来るそうだ。認証用のURLをそういうアドレスにすればいいといってしま えばそれまでだが、トップページで自動ログインしたい場合にあまり美しくな いような気がしないでもない。

この値を例えば、apacheのログに出力したい場合、httpd.confのLogFormatに \”%{X-DCMGUID}i\”という項目を追加すればよい。またCGIから利用する場合に はHTTP_X_DCMGUIDという環境変数に入る。perlだと$ENV{‘HTTP_X_DCMGUID’}で アクセスできることになる。

ちなみにAUでは以前からX-UP-SUBNOというヘッダでIDが出ている。とくにURLの 制限はない。しかもIDの上4桁でどこの地域で契約した携帯かがわかってしまう。

ソフトバンクの場合はユーザエージェントにIDが埋め込まれている。

HTTPのrefererとiframe

HTTPにはrefererというのがあるのはみなさんご存知だとして、 例えばiframeとかあったときにいったいrefererはどっちになるのかみたいなテスト。

このhtmlがreferer01で上の枠の中がiframeで入れ子になったreferer02で、 そこにある画像eu.pngのrefererがどうなっているかをログで調べます。

だいたい予想通りですが結果はreferer02でした。 なんかこれを利用するとrefererでhogeからしか利用できないように アクセス制限していてもhugaによく見えないiframeでhogeを貼ればいいじゃん とかいうことになる気がします。気のせいかな。

RSSリーダの巡回頻度をチェックする

全く持って自己満足以外の何者でもない企画だが、 RSSリーダの巡回をapacheのログでチェックして悦に入るのはどうだろうという 試み。 全く更新しないサイト、1日に1回更新するサイト、 1時間に1回更新するサイトを作ってそれぞれ調べてみよう。 対象とするRSSリーダはとりあえずgoogle readerとlivedoor readerでいいかな。 念のためサイトはそれぞれ別アドレスとしよう。

まずはサイトの設定。 apacheのバーチャルドメインで rss1.euphe.net, rss2.euphe.net, rss3.euphe.net を作る。1から順に更新しないサイト、1日1回更新するサイト、 1時間に1回更新するサイトにしよう。 それぞれアクセスログは別にした方が後で楽かな。 エラーログは1個でいいや。設定はこんな感じ。 あとnamedも設定しないとアクセスできないな。

<VirtualHost *:80>
    DocumentRoot "/var/www/html-rss1"
    ServerName rss1.euphe.net
    ErrorLog logs/rss-error_log
    CustomLog logs/rss1-access_log combined
</VirtualHost>

さすがに手動で更新するわけにもいかないので、 自動でサイトとRSSを更新するスクリプトを作ってcronで動かすことにしよう。 内容は更新時刻のみ。われながらすげーw。

そしてgoogle readerとrss readerに登録。無事登録できた。 あとはログ解析だな。とりあえず解析するのは面倒なので貼り付けよう。

全く更新しないサイト

一日一回更新するサイト

一時間に一回更新するサイト
これでまあ実際どうなるか知らないが何か結果が出るかも。

とりあえず数時間に一度巡回に来てるのはわかった。 だがしかし、どうやら単一エントリを書き換えてるだけではRSSリーダで 新着と認識されないようだ。悩ましい。

RSSを手書きする

こちらの サイト を参考にして手書きで最小限のRSSを作ってみる。内容はこのページそのもの。 更新を知るためとかそういうことは考えない。

<?xml version="1.0"?>
<rss version="2.0">
  <channel>
    <title>ゆーふぇみずむ</title>
    <link>http://www.euphe.net/</link>
    <description>いろいろメモ的なことを書くサイトです。</description>
    <language>ja</language>
    <pubDate>Thu, 28 Feb 2008 18:36:58 +0900</pubDate>
    <item>
      <title>RSSを手書きする</title>
      <link>http://www.euphe.net/memo/rss02.html</link>
      <description> ここは実際は本文 </description>
      <pubDate>Thu, 28 Feb 2008 18:36:58 +0900</pubDate>
    </item>
  </channel>
</rss>

そしてこのページをgoogle readerに登録したら表示できた。わーい。

RSSのバージョンについて

サイトの内容を機械的に処理しやすいような形式で配布する 規格であるところのRSSには現在おもに使われているバージョンが二つある。 それぞれ1.0と2.0であるが、単に2.0が1.0の新しいバージョンというわけでは ないらしい。RSSの詳しい説明やその辺の経緯については Wikipediaの説明(ここ) を見て欲しい。

普段見るブログの状況をぱっと調べてたみたのが以下の表。 結構1.0が多いな。 個人的には個人が自分でRSSを使う分には2.0を使っていればいいように 思ってたのがさてさて。

yaplog 1.0
ameblo 2.0
fc2 1.0
livedoor 1.0 (+Atom)
goo 1.0
yahoo 2.0
rakuten 1.0
jugem 1.0 (+Atom)
hatena 1.0 + 2.0
petitmall 1.0

文字コードはutf-8にしよう

特に理由はない。最近はutf-8が標準かなと。 今さらshift-jisとかあれだし。 既存のファイルはnkf -wで変換できる。 emacsだと左から4文字目がuだったらutf-8みたい。

XHTMLでサイトを作る

 

ウェブサイトいうのは基本的にはHTMLという言語で書かれたテキストで構成さ れているのだが、そのテキストの作成方法には大きく分けて自動生成ツールを 使うという方法と手書きで入力するという方法がある。

大昔にはツールというの存在しなくて、人が手でソースを書くというのが当然 だったわけだが、その後ホームページビルダーのようなWYSIWYG(死語?)的な ツールも使われるようになって、最近だとCMS的なものを使ってサイトを構築す ることも多いと思う。

だが自分用のちょっとしたサイトを作るのにそんな大それたものを使いたくな いし、たいした量のない自分のサイトくらい自分で把握していたいと思う人も 少なくないと思う。そういうちょっとしたツールのプログラムを書くのにRADは 使わないというような考えの人なら、HTMLも手書きで書こうかなと思うのでは というお話。

前置きが長くなったが、そういう背景でHTMLを書こうと思ったときに、どうせ なら新しいバージョンの規格に従って書くのがモチベーションもあがっていい と思う。HTML4.0は無難かもしれないが、今ならXHTML、それもバージョン1.0じゃ なくて1.1と思って少し調べてみた。

まず思うのは、HTMLとXHTMLって違いはいったい何なんだということ。仕様を全 部読むのも不可能ではないが、@IT に 簡単な比較があったのでそれを参考にする。ただしこれは多少昔の記事で ある。細かくは色々と違いがあると思うが、基本的には大きな違いはないと思 う。特にわざわざ手書きでHTMLを書こうという人にとっては、最初のおまじな いが必須であるとか、タグは小文字で書くとか、要素は引用符でくくるとか、 開いたタグは閉じるとかは言われなくても実行しているくらいではないだろう か。要素が空のタグの閉じ方が目新しいかもしれない。「<br>」は 「<br />」と書くことで閉じることができる。

バージョンの違いについてもいろいろ検索してみると、1.1は厳格なので問題に なる場合もあるようだ。例えばContent-TypeがHTML4.0で推奨されていた text/htmlが非推奨になり、application/xhtml+xmlが推奨になっているが、実 際には多くのウェブサーバはHTTPレスポンスでtext/htmlを返していたり、IEが 対応していなかったりなかなか難しいようである。しかし、ここは自分用の ちょっとしたサイトということで、あまり細かいところは気にせず、新しい XHTML1.1を使っていくことにする。

実際に書いたHTMLが正しいかどうかをチェックしてくれるサイトとしては、 Another HTML-lintというのが有名らしい。仕様とにらめっこしながら書くよりは、 ここでチェックして文句を言われたところを修正する方がお手軽だろう。ただ し、ここのチェックはかなり厳しい。オプションで軽度なチェックや宗教的な チェックはオフにするのがいいと思う。それでも十分厳しいかもしれないが減 点の少ないエラーは無視してもいいかもしれない。

ここのチェックを使ってて気がついたのは、厳密にはbodyタグの中にはinline 要素は書いてはいけないということである。これはなかなか盲点だと思う。例 えば、bodyタグの中に直接文章が書いてあったりしたらだめなのだ。