2007/07/12(Thu)
■[hatena]はてなスター雑記
ニコニコ動画とピアキャストがおもすろすぎてそればっか見てる今日この頃。最近だらけきってます。うーんいかんなぁ。。。
そんな中、はてなの新サービスであるところのはてなスターとはてなメッセージがリリースされたので、ちょこっと使ってみた雑感をだらだら書いてみる。
はてなスターは、自分が☆を付けたユーザーからしかコメントを貰えないシステム、、、ってことらしい。この緩い認証システムを用いて、ブログによくある炎上&コメントスパムを阻止しよう、ってわけですな、なるへそ。しかし、そのはてなスター開発日記自体が炎上しているというのが皮肉で笑えます。
ネットを情報収集用ツールとして使っている自分としては、はてなブックマークがあって、多少のアウトプット(と、人様からの突っ込み期待)の為のダイアリーがあれば事足りてしまうため、はてなスターにはいまいち魅力を感じませんでしたよ。はてなスターは、人に優しいサービスだとは思うけど、自分にとって便利だと思えないし。というか、このサービスって、SNS向けなんじゃないかなあ。マイミクになってない&マイミク申請が躊躇われる誰某さんからコメント欲しいとか、レスするまでもないけど友人のこの記事に☆あげたいとかの緩いコミュニケーションが欲しい人向けって感じで。
SNSが合わないからはてなとかの一般的なブログを利用してる人も多いだろうから、そういう人はこのSNSちっくなサービスを強制されると嫌だろうな。そりゃ、はてなとしては、一人でも多くのユーザーにはてなスターを使ってほしいんだろうけどさ。
という感じの永井長い独り言でした。オチはありません。
2007/06/13(Wed)
■[haskell]ふつうの haskellプログラミング読了&はじめてのhaskell
1週間ほど前に買ったふつけるを読み終えました。haskell 難しいと聞いてましたけど、かなりわかり易かったです。いや嘘つきましたすいません。後半、型クラスの説明のあたりからもうなにがなにやら、、、ややこしかった。けど、遅延評価がどんなもんかはわかりました。カリー化(部分適用)もわかったような気がします。モナドはよくわかりません。maybeモナドってたぶんモナドってこと?って感じ。
さてそんな状態のわたくしですが、金槌を持つ人にはなんでも釘に見える、という例え通り、さっそくhaskellでなんか書いてみたくなりました。で、ネットをさまよっていたところ、面白そうなネタを発見。
- 日本情報オリンピック http://www.ioi-jp.org/
高校生以下を対象にしたプログラミングコンテストらしいです。問題をみてみたところ手頃な感じなのでやってみることに。問題は↓これ。
n 個の整数からなる数列 a1, a2, ..., anと正整数 k (1 ≦ k ≦ n) が与えられる.
このとき,連続して並ぶ k 個の整数の和 Si = ai+ai+1+...+ai+k−1 (1 ≦ i ≦ n−k+1) の最大値を出力するプログラムを作りなさい
http://www.ioi-jp.org/joi/2006/2007-ho-prob_and_sol/2007-ho.pdf
あとで haskell に書き換える事を意識しつつ、 とりあえず python で書いてみる。
def head(xs): return xs[0] def last(xs): return xs[-1:] def tail(xs): return xs[1:] def drop(n, xs): return xs[n:] def take(n, xs): return xs[:n] lines = open("input.txt").read().strip().split("\n") header = head(lines).split(" ") length = int(head(header)) k = int(last(header)) ns = map(int, tail(lines)) f = lambda x: sum(take(k, drop(x, ns))) print max(map(f, range(length - k + 1)))
さてこれを haskell で置き換えるわけですが、、、、。
なんかよくわからん意味不明なエラーと、型が違います、と言われまくって2時間かけてようやく動くものができました。かなり酷いコードな予感がしますが、初めて書いたhaskellのコードということでさらしておきます。
import Data.Char main = do cs <- readFile "input.txt" let (length, k) = header cs ns = map strToInt (tail $ lines cs) print $ maximum $ map (f ns k) [0..(length-k)] f :: [Int] -> Int -> Int -> Int f ns k x = sum $ take k $ drop x ns header :: String -> (Int, Int) header xs = let (ys, zs) = break (isSpace) $ head $ lines xs in (strToInt ys, strToInt $ tail zs) strToInt :: String -> Int strToInt s = read s :: Int
こういうことすると、あとで見直したとき恥ずかしさのあまり自殺したくなるんだよね、、、しないけど。
2007/06/01(Fri)
■[ruby]現実逃避中。。。
bloglinesの未読数をハテナグラフにポストするスクリプト。
#!/usr/bin/env ruby require 'rubygems' require 'hatena/api/graph' require 'webservice/bloglines' bloglines = WebService::Bloglines.new('your-email', 'your-password') count = bloglines.update["unread"] graph = Hatena::API::Graph.new('your-hatena-id', 'your-hatena-password') graph.post('bloglines', Time.now, count) puts count
インストールめも
をダウンロードして、ruby setup.rb install
- gem install xml-simple
- gem install hatenaapigraph
2007/05/26(Sat)
■[hatena][ruby]長年日記のRSSを出力するスクリプト
はてな日記に長年日記の機能がつきましたね。コレ。わたくしは長年日記がつかいたくて一時は tdiary に乗り換えようかと思ったほどです。ちなみに長年日記ってのは、紙の日記帳でよくある、連用日記のような見た目にする機能のことね。
しかし、、、URLを直に指定しないと使えないというのはかなり微妙な感じ。そこで、長年日記のHTMLを適当にパースしてRSSに出力するスクリプトを書いてみました。
hatena id を入力して、get!ボタンを押すと、今日の日付の長年日記のRSSを取得します。ココ↓から試せます。
http://tadashi.kicks-ass.net:7777/
はてなのデザイン設定にこんな感じ↓で書くと、ここのサイトの右サイドバーのように、長年日記のタイトルが表示されます。
<hatena name="rss" url="http://tadashi.kicks-ass.net:7777/rss.cgi?id=(あなたのid)" moduletitle="長年日記" template="hatena-module">
自分は毎日日記かいてないので、長年日記のありがたみが薄いんですが、、、。まぁ、そんな感じで、上のアドレスは自分の気まぐれで止まる可能性大なので、とりあえずスクリプトの中身を晒しておきます。
#!/usr/bin/env ruby # -*- coding: utf-8 -*- require 'open-uri' require 'date' require 'rss/maker' require 'cgi' require 'kconv' id = CGI.new['id'] uri = "http://d.hatena.ne.jp/#{id}/#{Date.today.strftime("____%m%d")}" begin dat = open(uri).read rescue => OpenURI::HTTPError puts "Content-type: text/html\n\n" puts "指定した id が見つかりません。id を確認してください。" exit end dat.gsub!(/\n|\r/,"") title = dat.scan(/<title>(.+?)<\/title>/) dat = dat.scan(/<!--(<rdf:RDF.+?rdf:RDF>)-->/)[1].to_s items_title = dat.scan(/dc:title="(.+?)"/) items_link = dat.scan(/dc:identifier="(.+?)"/) items_date = items_link.map do |item| item.to_s.scan(/\/#{id}\/([0-9]{4})([0-9]{2})([0-9]{2})\//).join("/") + " 00:00:00" end rss = RSS::Maker.make("2.0") do |maker| maker.channel.title = title.to_s.toutf8 maker.channel.link = "http://d.hatena.ne.jp/#{id}/" maker.channel.description = "hatena diary for years" maker.items.do_sort = true items_title.zip(items_link, items_date).each do |t,l,d| item = maker.items.new_item item.title = t.to_s.toutf8 item.link = l.to_s item.dc_subject = t.to_s.toutf8 item.date = Time.parse(d) end end puts "Content-type: application/xml\n\n" puts rss.to_s
2007/05/10(Thu)
■[emacs] 4530秒でかけた FizzBuzz 問題
そっか、三項演算子使うと短くかけるのか、なるほど。
n3 = lambda x: (x % 3 == 0) and 'Fizz' or '' n5 = lambda x: (x % 5 == 0) and 'Buzz' or '' for x in range(1, 101): print (n3(x) + n5(x) == '') and x or n3(x) + n5(x),
うーん、、、けどなんかむりやりっぽい。
やっぱなー、2分とかからずに紙にかけるはずだ、っていわれてもなー、問題読むのに30秒考えるのに30秒かかったとして、そんなんで、短いコード思いつかないしなー。でそうすると残り1分しかないし。。
というわけで、頑張って昨日のコードを1分以内で書いてみた。
いちおう4530秒くらいでかけたので一安心。ちょっと、、、いやかなり、インチキしてますが。ていうか緊張した。
ちなみに上のスクリーンキャスト取るのに使ったsnippetは、こんな↓感じです。試してみたい人は、ロードパスの通ったところに、snippet.elをおいておいてね。
(require 'snippet) (add-hook 'python-mode-hook (function (lambda () (setq-default abbrev-mode t) (snippet-with-abbrev-table 'local-abbrev-table ("for" . "for $${element} in $${sequence}:\n$>") ("if" . "if $${True}:\n") ("elif" . "elif $${True}:\n") ("p" . "print \"$${text}\",\n$>") ))))
---
追記
このエントリーを受けて、vim&ruby使いの某友人から動画が送られてきました。
見たらめっちゃ早い。EmacsからVimに乗り換えようかと真剣に思ったほどです。聞いてみたところ、録ったらなんだか倍速になってしまったとのこと。けどそれでも早い。ワンライナーとかじゃない、普通のコードで20秒ちょいくらいでしょうか。そんなわけで、上の動画をもうちょっと頑張ったものに置き換えました。