Deprecated: The each() function is deprecated. This message will be suppressed on further calls in /home/zhenxiangba/zhenxiangba.com/public_html/phproxy-improved-master/index.php on line 456
Programming Must Go On
[go: Go Back, main page]

Programming Must Go On

2007/07/12(Thu) 

[]はてなスター雑記

ニコニコ動画とピアキャストがおもすろすぎてそればっか見てる今日この頃最近だらけきってます。うーんいかんなぁ。。。

そんな中、はてな新サービスであるところのはてなスターとはてなメッセージリリースされたので、ちょこっと使ってみた雑感をだらだら書いてみる。

はてなスターは、自分が☆を付けたユーザーからしかコメントを貰えないシステム、、、ってことらしい。この緩い認証システムを用いて、ブログによくある炎上&コメントスパムを阻止しよう、ってわけですな、なるへそ。しかし、そのはてなスター開発日記自体が炎上しているというのが皮肉で笑えます。

ネットを情報収集用ツールとして使っている自分としては、はてなブックマークがあって、多少のアウトプット(と、人様からの突っ込み期待)の為のダイアリーがあれば事足りてしまうため、はてなスターにはいまいち魅力を感じませんでしたよ。はてなスターは、人に優しいサービスだとは思うけど、自分にとって便利だと思えないし。というか、このサービスって、SNS向けなんじゃないかなあ。マイミクになってない&マイミク申請が躊躇われる誰某さんからコメント欲しいとか、レスするまでもないけど友人のこの記事に☆あげたいとかの緩いコミュニケーションが欲しい人向けって感じで。

SNSが合わないからはてなとかの一般的なブログを利用してる人も多いだろうから、そういう人はこのSNSちっくなサービスを強制されると嫌だろうな。そりゃ、はてなとしては、一人でも多くのユーザーにはてなスターを使ってほしいんだろうけどさ。

という感じの永井長い独り言でした。オチはありません。

はげしく遅レスで申し訳ない

http://d.hatena.ne.jp/ha-tan/20070614

下のエントリーid:ha-tanさんに添削?して頂きました。コードがすごいすっきりしてて参考になります。

こういう現実世界のドロドロとは無縁な問題を解いていると、あー、Haskellは何て素晴らしいんだと思います。Haskellの機能全てがラブいです。

まったく同感です。癒されますよねほんと。

2007/06/13(Wed) 

[]ふつうの haskellプログラミング読了&はじめてのhaskell

1週間ほど前に買ったふつけるを読み終えました。haskell 難しいと聞いてましたけど、かなりわかり易かったです。いや嘘つきましたすいません。後半、型クラスの説明のあたりからもうなにがなにやら、、、ややこしかった。けど、遅延評価がどんなもんかはわかりました。カリー化(部分適用)もわかったような気がします。モナドはよくわかりません。maybeモナドってたぶんモナドってこと?って感じ。

さてそんな状態のわたくしですが、金槌を持つ人にはなんでも釘に見える、という例え通り、さっそくhaskellでなんか書いてみたくなりました。で、ネットをさまよっていたところ、面白そうなネタを発見

高校生以下を対象にしたプログラミングコンテストらしいです。問題をみてみたところ手頃な感じなのでやってみることに。問題は↓これ。

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) 

[]現実逃避中。。。

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) 

[][]長年日記の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) 

[] 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秒ちょいくらいでしょうか。そんなわけで、上の動画をもうちょっと頑張ったものに置き換えました。