Project EulerをHaskellで解いている。Project Eulerはプログラミングで解ける数学の問題が掲載されているサイト。毎週新しい問題が一つずつ追加されていて、現時点で283問ある。月初から始めて、ちょうど30問解いた。
愚直にロジックを組むだけで解ける問題もあれば、愚直なだけでは計算がなかなか終わらない問題もある。Project Eulerには、一分間ルールというのがあるそうで、まともなロジックで組めば、必ず一分以内に計算が終了するはずとのこと。だから何十分もかかるような場合は、明らかに改善の余地がある。
Haskellでシンプルに書ける問題もあれば、リスト内包表記やモナドを上手く活用しないと書けなそうな問題もある。このあたりはまだちょっと分かってないところもあるので、いろいろ試行錯誤しながら実装することになる(モナドはまだ使ってないけど)。これがなかなか勉強になるので、もし今からProject Eulerを始めるなら、ぜひ新しい言語で書くのがよいと思う。
コードはgithubで管理することにした。
gami / project-euler-in-haskell GitHub
|
もう少しスマートに書けるような気がする。
main = putStr $ loop 1 100
loop s e
| s > e = ""
| otherwise = (fizzbuzz s) ++ "\n" ++ (loop (s+1) e)
fizzbuzz x
| x `isMultiple` 3 && x `isMultiple` 5 = "fizzbuzz"
| x `isMultiple` 3 = "fizz"
| x `isMultiple` 5 = "buzz"
| otherwise = show (x)
isMultiple x y = (x `mod` y) == 0
Sequelで、モデルの更新時に自動で更新日時を挿入するには、Timestampsプラグインを使う。あらかじめ、created_at, updated_atカラムを作成しておいて、モデルのなかでプラグインを呼び出す。型はdatetimeで作成する。
使い方はこんなかんじ。
class Item < Sequel::Model(:items) plugin :timestamps, :update_on_create => true end
:updated_on_createは、モデルの作成時にもupdated_atを更新するオプション。
エラーメッセージでググったらバグレポートを見つけた。
レポートに書いてあるパッチをあてて、手動でmake installまでやってから、再度gem installしたら入った。
Twitterで英語投稿用アカウントを追加で作ったので、Facebookの更新はそっちに変えようとしたのだけど、設定のどこを見ても、変更できなかった。
一度設定すると変更不可能だと思われる。
仕方ないので一度削除して、インストールしなおした。
iPhoneOS3.0にアップデートしたら、作成していたjavascriptのアプリケーションで、touchendイベントの効きがおかしくなった。
原因はコピーアンドペースト用の選択イベントが優先されるため。
これを回避するには、任意のエレメントのスタイル情報に、
-webkit-user-select : none;
と、指定する。選択されなくなる。コピーアンドペーストを禁止したい場合もこの指定でよいはず。
これは、WebkitのCSS拡張で、他にもいろいろある。
いつの間にか1.2がでているけど、まだ1.1を使っていたりする。
CakePHP1.1でMySQLのレプリケーションを使っていたが、なぜかjoinを使うクエリーが上手くfindできないという現象が出ていて、はまった。
ソースを読んだところ、原因は内部でModelのdbConfigをチェックしていて、異なるdbConfigのものは結合しない処理をしていたため。元のModelしかdbConfigを変更していなかったため、上手く動かなかった。
全てのModelのdbConfigをスレーブを参照するように修正して、動くようになった。
|
はじめて、2日フルで参加した記念に、聴いたセッションをよかった順にならべてみる。
どれもすごくためになって、非常に満足した。
1位:難易度の高い超短期開発におけるPM
マネジメントでいかに短期開発を可能にするか。
QCDのDeliveryが最優先であることを客と共有する。
クリティカルパスをつぶす。
できることは全部やる。
2位:Webセキュリティ攻守攻防パネルディスカッション「Webアプリケーション/Ajaxセキュリティ徹底バトル」
竹迫先生の名仕切りが光る。
先生の的確な解説とか質問のおかげですごくわかりやすかった。
WAFは知らなかったので、勉強になった。
3位:iPhone 開発者座談会
Hello Worldで中断していたが、iPhoneアプリの勉強を再開することにした。
サンプルを上手く活かすこと、機能を重要なものだけに絞ることが重要。
4位:クラウドプラットフォームの実際
SalesForceのクラウドプラットフォームであるforce.comについて。
SDK不要で、Javaっぽい仕様の言語でかけて、Eclipseで開発もできる。
GoogleAppEngineほどスケールしない(100万Userくらいまで)が、現実主義でDBとかが使える。
force.comは全然知らなかったけど、結構よさそうだった。
でもまださわってない。
5位:アート・オブ・アジャイル デベロップメント 〜テストが駆動するビジネス価値〜
アート・オブ・アジャイル デベロップメントのプラクティスをほぼ全てやるとQAテストが不要になる。
本を買ってしまった。
6位:株式会社はてなの開発戦略
git!
テストは常にGreenにしないとやる気がなくなる。同感。
7位:時を超えたプログラミングの道への道
エンターテナー。
8位:Programming the Cloud
MapReduceって使えるんだろうか?
当たり前だが、ボトルネックがどこかによる気がする。
9位:「レガシーコード」とはいったい!? 〜あなたも書いてるかもしれないレガシーコード〜
テストが無いコードは全てレガシーコード。
やばいな。
10位:モダン Perl テスト 〜 テストで業務効率改善〜
11位:品質で失敗しない大規模システムの開発
12位:ひよこクラブ ver.Engineer
13位:Hudson によるインクリメンタルな開発
14位:飛行船萌え障害キタ━━━━ (;´Д`) ━━━━ !!!! 〜テスト嫌いエンジニアに贈るテストのすすめ〜
全般にテスト中心に参加した。1年後には僕もちゃんとまともなテストを行っていたい。
主催したKudan.mobiで発表しました。
内容はこんなかんじ。
・ケータイサイト用のsitemapを作ろう
・つくると検索エンジンに全サイトの構成を通知できる
・各URLに優先度を作ることができる
・さらにgoogleのsietmap_gen.pyを使うと・・・
・ディレクトリやアクセスログからURLを収集することができる
・自動で毎日検索エンジンにおくることができる
・でもケータイに上手く対応できてないので修正した
・
・クエリーストリングの削除(セッションIDなどを削除するため)
・sitemap_gen_mobile
自分も含め11名の方に参加していただけました(ありがとうございます!)。
こういった会を主催するのは初めてで、当初はなかなか人を集められなくて不安でしたが、最後にはとても盛り上がることができてよかったです。
何より、多くの方が次回も参加したいといってくださってとても嬉しく感じました。
始める前は少し迷いましたが、思い切って行動してみて本当によかった。
これはきっと新しいメソッドになると思います。
ただ、終始ばたばたしたり、Wikiに書いた時間を間違えたり、フロアが分かりにくかったりで申し訳ありませんでした。
その辺もきちんと改善して、次回(10/31)はもっとよい会にしたいと思います。
モバイルに興味のあるかたはぜひご参加ください。