Archive for October, 2007

TopCoder::SRM::373

October 25th, 2007  |  Published in Uncategorized

晴れた朝に始まったSRM::373でした。

Easy

TheEquation (コード)

高校数学っぽい問題。ちょっと頭をひねりながら解いて7分でsubmit。236.05ptsでした。 終了条件が甘そう…

Medium

StringFragmentation (コード)

キャンバスに文字列を書いていくときに、許容される最大のフォントのサイズはどれくらいか、という問題。 与し易しと見てあれこれやってるうちにローカルでテストをpassしたのでsubmit。55分で204.14ptsでした。

Hard

RectangleCrossings

手つけず。幾何の問題ですね。

結果

Easy/Mediumともに、System Testでfailしてしまいました。うわっちゃー。 Ratingは982→866と120ptsもダウンです。あいたたたた….. なかなかうまくいかないものです。

基礎力をつけねあ !

Tags:

TwitterTimeTrack

October 23rd, 2007  |  Published in Uncategorized

これは何か

Twitterにダイレクトメッセージで書き込んだメッセージをiCalendar形式で提供するWebサービスです。 時間家計簿をつけるのにどうぞ。

使いかた

  1. という専用アカウントをfollowします。(followするとすぐに、2cはあなたをfollowします。これでダイレクトメッセージを2cに送れるようになります。)
  2. 2c にダイレクトメッセージを投げます (例 : d 2c なんとかかんとか)。 2件以上のダイレクトメッセージがないと、iCalendarは生成されません。
  3. あなた用のiCalendar URLを、subscribeします。URLは、https://deadbeaf.org/twitter2ical/ical/あなたのスクリーン名 になります。

スクリーンショット

制限

データがすべてオンメモリにあるため、そんなに大量に保持することができません。 具体的には、ユーザは100人まで、各ユーザ毎に蓄えているメッセージは最近の128件まで、としています。 ユーザが100人を越えたら、いちばん昔に更新してた人から順に消されてゆきますのでご了承ください。

プロジェクト

redMineで管理してます。

ソース

一式がダウンロードできます。 たいへん見苦しいコードですがとりあえず。

背景

を読んでて、時間家計簿をつけようと思いました。 ちょうど最近Twitterを始めてて、これは時間をトラッキングしとくのにちょうどいいのでは、と思いついた次第。

Tags:

TwitterTimeTrack 0.1.5

October 22nd, 2007  |  Published in hack

Twitterにダイレクトメッセージで書き込んだメッセージをiCalendar形式で提供する、TwitterTimeTrack というWebサービスをつくりました。 時間家計簿をつけるのにどうぞ。

使いかた

  1. という専用アカウントをfollowします。(followするとすぐに、2cはあなたをfollowします。これでダイレクトメッセージを2cに送れるようになります。)
  2. 2c にダイレクトメッセージを投げます (例 : d 2c なんとかかんとか)。 2件以上のダイレクトメッセージがないと、iCalendarは生成されません。
  3. あなた用のiCalendar URLを、subscribeします。URLは、https://deadbeaf.org/twitter2ical/ical/あなたのスクリーン名 になります。

スクリーンショット

制限

データがすべてオンメモリにあるため、そんなに大量に保持することができません。 具体的には、ユーザは100人まで、各ユーザ毎に蓄えているメッセージは最近の128件まで、としています。 ユーザが100人を越えたら、いちばん昔に更新してた人から順に消されてゆきますのでご了承ください。

プロジェクト

redMineで管理してます。

ソース

一式がダウンロードできます。 たいへん見苦しいコードですがとりあえず。


眠いので解説とかは明日以降に書きます。

Tags: ,

TopCoder::SRM::372

October 18th, 2007  |  Published in Uncategorized

ひどいことになってしまった前回のリベンジを果たすべく臨んだSRM372でした。

Easy

DietPlan (コード)

文字列処理の問題。特定の文字が文字列に存在するかとかそういうの。 なんてことない問題だったんだけど、不必要に時間をかけてしまい、14分ほどでsubmit。203.08ptsでした。

Medium

RoadConstruction (コード)

特定のルールに従う交通整理を書きます。 なにより慎重さが求められる系。

込み入ったルールをうまくコードにするのに手間取り、残り5分というところでやっとsubmitでき、201.67ptsでした。

Hard

RainyDay

完全にスルー

結果

Challenge phaseをなんとか防御し、うまいことEasy/MediumともにSystem Testをpassできました。 テストが2つとも通るのは前々回以来の2度目です。この調子でやっていきたい。

Ratingは、がくんと落ちた前回に対してばばっと上昇し、前々回レベルに戻りました。917→982で緑coderのままです。

Tags:

user_timeline_to_ical

October 17th, 2007  |  Published in Uncategorized

What is this ?

A simple Ruby script that generates iCalendar format from Twitter user_timeline.

Download

user_timeline_to_ical.rb

Requirements

following gems installed:

  • json
  • icalendar

How to use

simply type

ruby user_timeline_to_ical.rb [your_screen_name]

to print out recent 20 events in iCalendar format to stdout.

Redirect its output to a file, then import it with iCal or Google Calendar.

Screenshot

from iCal:

from Google Calendar:

Future …

I’m developing a web service that serves iCalendar feed (by sending direct message to tracking bot). You will subscribe its URL to see your past behaviors at some time.

Code

Try it !

#

create iCalendar from recent 20 user_timeline.



#

usage


ruby user_timeline_to_ical.rb [username] > some.ics



# require 'rubygems' require 'json' require 'icalendar' require 'uri' require 'open-uri' require 'kconv' require 'nkf' require 'logger'
KCODE = 'u'

XXX:


quick fix to avoid charset crash



module Icalendar class Component < Icalendar::Base def print_properties s = ""
   do |key,val|
    # Take out underscore for property names that conflicted
    # with built-in words.
    if key =~ /ip_.*/
      key = key[3..-1]
    end

    # Property name
    unless multiline_property?(key)
       prelude = "#{key.gsub(/_/, '-').upcase}" +

       # Possible parameters
       print_parameters(val)

       # Property value
       value = ":#{val.to_ical}"
       escaped = prelude + value.gsub("\\", "\\\\").gsub("\n", "\\n").gsub(",", "\\,").gsub(";", "\\;")
       #escaped = value
       #s << escaped.slice!(0, MAX_LINE_LENGTH) << "\r\n " while escaped.size > MAX_LINE_LENGTH # XXX : quick fix to avoid charset crash
       s << escaped << "\r\n"
       s.gsub!(/ *$/, '')
     else
       prelude = "#{key.gsub(/_/, '-').upcase}"
        val.each do |v|
           params = print_parameters(v)
           value = ":#{v.to_ical}"
           escaped = prelude + params + value.gsub("\\", "\\\\").gsub("\n", "\\n").gsub(",", "\\,").gsub(";", "\\;")
           s << escaped.slice!(0, MAX_LINE_LENGTH) << "\r\n " while escaped.size > MAX_LINE_LENGTH
           s << escaped << "\r\n"
           s.gsub!(/ *$/, '')
        end
     end
  end
  s
end


end end
class UserTimeLine attr_accessor :id, :since URL = ''
def initialize(id) = id # = Logger.new('debug.log') end
def get(url) JSON.parse(open(url).readlines.join).sort { |a, b| a['id'] <=> b['id'] } end
def url(*arg) url = URL + + '.json' return url if arg.empty?
hash = arg[0]
args = {}

args['page'] = hash[:page] if hash[:page]
if hash[:since]
  if String == hash[:since].class
    args['since'] = URI.escape(hash[:since].split.join('+'))
  else # should be Number
    args['since_id'] = hash[:since]
  end
end
arg = args.collect { |k, v| [k, v].join('=') }.join('&')

url + '?' + arg


end
def to_ical msgs = get(url).collect {|x| [x['text'], x['created_at']]} cal = Icalendar::Calendar.new
(msgs.size-1).times do |i|
  cal.event do
    dtstart  DateTime.parse(msgs[i][1]).to_ical(true)
    dtend    DateTime.parse(msgs[i+1][1]).to_ical(true)
    summary  msgs[i][0]
  end
end

cal.to_ical


end end
utl = UserTimeLine.new(ARGV.shift) print NKF.nkf('-w -Lw', utl.to_ical)

Tags: calendar, ,

user_timeline_to_ical

October 17th, 2007  |  Published in Uncategorized

What is this ?

A simple Ruby script that generates iCalendar format from Twitter user_timeline.

Download

user_timeline_to_ical.rb

Requirements

following gems installed:

  • json
  • icalendar

How to use

simply type

ruby user_timeline_to_ical.rb [your_screen_name]

to print out recent 20 events in iCalendar format to stdout.

Redirect its output to a file, then import it with iCal or Google Calendar.

Screenshot

from iCal:

from Google Calendar:

Future …

I’m developing a web service that serves iCalendar feed (by sending direct message to tracking bot). You will subscribe its URL to see your past behaviors at some time.

Code

Try it !

#

create iCalendar from recent 20 user_timeline.



#

usage


ruby user_timeline_to_ical.rb [username] > some.ics



# require 'rubygems' require 'json' require 'icalendar' require 'uri' require 'open-uri' require 'kconv' require 'nkf' require 'logger'
KCODE = 'u'

XXX:


quick fix to avoid charset crash



module Icalendar class Component < Icalendar::Base def print_properties s = ""
   do |key,val|
    # Take out underscore for property names that conflicted
    # with built-in words.
    if key =~ /ip_.*/
      key = key[3..-1]
    end

    # Property name
    unless multiline_property?(key)
       prelude = "#{key.gsub(/_/, '-').upcase}" +

       # Possible parameters
       print_parameters(val)

       # Property value
       value = ":#{val.to_ical}"
       escaped = prelude + value.gsub("\\", "\\\\").gsub("\n", "\\n").gsub(",", "\\,").gsub(";", "\\;")
       #escaped = value
       #s << escaped.slice!(0, MAX_LINE_LENGTH) << "\r\n " while escaped.size > MAX_LINE_LENGTH # XXX : quick fix to avoid charset crash
       s << escaped << "\r\n"
       s.gsub!(/ *$/, '')
     else
       prelude = "#{key.gsub(/_/, '-').upcase}"
        val.each do |v|
           params = print_parameters(v)
           value = ":#{v.to_ical}"
           escaped = prelude + params + value.gsub("\\", "\\\\").gsub("\n", "\\n").gsub(",", "\\,").gsub(";", "\\;")
           s << escaped.slice!(0, MAX_LINE_LENGTH) << "\r\n " while escaped.size > MAX_LINE_LENGTH
           s << escaped << "\r\n"
           s.gsub!(/ *$/, '')
        end
     end
  end
  s
end


end end
class UserTimeLine attr_accessor :id, :since URL = ''
def initialize(id) = id # = Logger.new('debug.log') end
def get(url) JSON.parse(open(url).readlines.join).sort { |a, b| a['id'] <=> b['id'] } end
def url(*arg) url = URL + + '.json' return url if arg.empty?
hash = arg[0]
args = {}

args['page'] = hash[:page] if hash[:page]
if hash[:since]
  if String == hash[:since].class
    args['since'] = URI.escape(hash[:since].split.join('+'))
  else # should be Number
    args['since_id'] = hash[:since]
  end
end
arg = args.collect { |k, v| [k, v].join('=') }.join('&')

url + '?' + arg


end
def to_ical msgs = get(url).collect {|x| [x['text'], x['created_at']]} cal = Icalendar::Calendar.new
(msgs.size-1).times do |i|
  cal.event do
    dtstart  DateTime.parse(msgs[i][1]).to_ical(true)
    dtend    DateTime.parse(msgs[i+1][1]).to_ical(true)
    summary  msgs[i][0]
  end
end

cal.to_ical


end end
utl = UserTimeLine.new(ARGV.shift) print NKF.nkf('-w -Lw', utl.to_ical)

Tags: ,

TopCoder::SRM::371

October 15th, 2007  |  Published in Uncategorized

深夜に始まるSRMでした。ねむいよ。

Easy

CondorcetVoting (コード)

選挙で一番人気があるのは誰かという問題。 簡単じゃーんと書き始めるものの、いまひとつ眠気のせいか調子があがらず、15分ほどかかってsubmit。196.73ptsでした。

しかし、単純に投票者すべてについて足し算するだけで満足してしまっていて、後にChallengeで落とされてしまいました。0pts。otz。

Medium

SpiralRoute (コード)

四角形の端かららせんを描いていって、最後の座標を求める問題。 愚直に端から一歩ずつ進む実装を書いてsubmit。331.91ptsでした。

しかし、System testで落とされてしまいました。なぜかはまだ確認しておらず。0ptsになってしまいました。

Hard

FloodRelief

与えられた地図から、窪みの数を求める問題。 2問解けて (るつもりになって) いたので、面白いなあと思いながらいろいろ考えてみるも、できそうでできず状態に。

結果

アグレッシブなchallenge phaseとげんなりするsystem test phaseが終わり、結局0ptsでした。やれやれ。 Ratingは984→918と64ptsダウンです。それでもなんとかGreen Coderのまま。眠いのに無理してやると逆効果、ということですねー。

Tags:

姉の子が産まれた

October 12th, 2007  |  Published in Uncategorized

2702gで産まれてきたそうです。やったね!

これで名実ともに、おじさんにクラスチェンジです。それもまたオーケーか。

TopCoder::SRM::370

October 10th, 2007  |  Published in Uncategorized

3連休明けの夜に始まったSRM::370でした。

Easy

Problem Statementに書いてある手順をそのままコードに書き下すstraightforwardまくりな問題。 さっさとsubmitして235.73ptsでした。

Medium

高校で習う確率の問題。ちと簡単すぎるんじゃない? と思いつつも、Exampleのテストケースはpassしたので思いきってsubmit。463.10ptsでした。

Hard

これはちぃとむずかった… いろいろ考えあぐねてみるも、ばしっと考えをコードにうつせず。 解くのは諦めて、Mediumで何が問題なのか考え直してみることに。

結果が出るまで

といいつつ、何もしないままCoding phaseおわり。Challenge phaseはいつもどおりスルー。 今日は誰からもchallengeされず、ほっと胸をなでおろしていました。

System testがなかなか終わらず (2時間かかってた)、その間 Roomに居るひとたちと、「500はなんかあるよな」「Div1のやつらはDPで解いてるぜ」「50!はintで収まらないよな」とかそういう話をしてました。 こうやってchatしている相手は世界中にいるんだけど、同じコンテキストを共有していると、すごい自然にしゃべれるのは不思議な気がします。

結果

首をながーくして待っていたSystem testがようやく終わり。結果は、Easy, Mediumともにpassで、698.83pts/Roomで3位でした。2つSystem testをpassしたのは初めてで、だいぶうれしい。

Ratingは851→985と134ptsのjump upでした。久々にGreen coderに返り咲きです。 この勢いを大事にするためにも、復習しとかなきゃです。


思うに、Mediumはいくらなんでも簡単すぎる。ほんとはなにかtrapをしかけていたんだけれど、そのtrapがうまく機能しなかったからみんな解けちゃった、みたいなことになってるんじゃないかと想像しています。

Tags:

TwitterのTimelineからiCalendarをつくる

October 9th, 2007  |  Published in hack

Twitterのuser_timelineからiCalendarを生成するスクリプトを書きました。 ものすごいシンプルなもの。

ダウンロード

user_timeline_to_ical.rb

つかいかた

ruby user_timeline_to_ical.rb Twitterのユーザ名

とすると、標準出力にiCalendar形式で最近20件のイベントが出てきます。 出力をリダイレクトして、iCalやGoogle CalendarといったiCalendar形式をimportできるソフトウェアに食わせてみましょう。

スクリーンショット

iCalから:

Google Calendarから:

制限事項

  • 10/09現在、Twitter APIでuser_timelineにpageパラメータを渡すことができなくなっているため、20件以上のメッセージを取り出すことができません。
  • iCalendarの性質上、イベントが同じ時間帯に密集していると非常にみづらいです。たまにしかTwitterにpostしない人にはちょうどいいかも。

今後

トラッキング専用のアカウントにdirect messageをなげれば、あとから自分が何やっていたかをiCalendarで取得できるWebサービスをつくるつもりです。redmineのプロジェクトでつくってます。 これができれば、すべてのpostを表示せずにすむようになるし、iCalからsubscribeしたりできて、だいぶ時間家計簿として見易くなると期待しています。

2007.10.23 追記 : つくりました。

背景

を読んでて、時間家計簿をつけようと思いました。 ちょうど最近Twitterを始めてて、これは時間をトラッキングしとくのにちょうどいいのでは、と思いついた次第。

ソース

いちおう貼りつけときます。

#

create iCalendar from recent 20 user_timeline.



#

usage


ruby user_timeline_to_ical.rb [username] > some.ics



# require 'rubygems' require 'json' require 'icalendar' require 'uri' require 'open-uri' require 'kconv' require 'nkf' require 'logger'
KCODE = 'u'

XXX:


quick fix to avoid charset crash



module Icalendar class Component < Icalendar::Base def print_properties s = ""
   do |key,val|
    # Take out underscore for property names that conflicted
    # with built-in words.
    if key =~ /ip_.*/
      key = key[3..-1]
    end

    # Property name
    unless multiline_property?(key)
       prelude = "#{key.gsub(/_/, '-').upcase}" +

       # Possible parameters
       print_parameters(val)

       # Property value
       value = ":#{val.to_ical}"
       escaped = prelude + value.gsub("\", "\\").gsub("n", "\n").gsub(",", "\,").gsub(";", "\;")
       #escaped = value
       #s << escaped.slice!(0, MAX_LINE_LENGTH) << "rn " while escaped.size > MAX_LINE_LENGTH # XXX : quick fix to avoid charset crash
       s << escaped << "rn"
       s.gsub!(/ *$/, '')
     else
       prelude = "#{key.gsub(/_/, '-').upcase}"
        val.each do |v|
           params = print_parameters(v)
           value = ":#{v.to_ical}"
           escaped = prelude + params + value.gsub("\", "\\").gsub("n", "\n").gsub(",", "\,").gsub(";", "\;")
           s << escaped.slice!(0, MAX_LINE_LENGTH) << "rn " while escaped.size > MAX_LINE_LENGTH
           s << escaped << "rn"
           s.gsub!(/ *$/, '')
        end
     end
  end
  s
end


end end
class UserTimeLine attr_accessor :id, :since URL = ''
def initialize(id) = id # = Logger.new('debug.log') end
def get(url) JSON.parse(open(url).readlines.join).sort { |a, b| a['id'] <=> b['id'] } end
def url(*arg) url = URL + + '.json' return url if arg.empty?
hash = arg[0]
args = {}

args['page'] = hash[:page] if hash[:page]
if hash[:since]
  if String == hash[:since].class
    args['since'] = URI.escape(hash[:since].split.join('+'))
  else # should be Number
    args['since_id'] = hash[:since]
  end
end
arg = args.collect { |k, v| [k, v].join('=') }.join('&')

url + '?' + arg


end
def to_ical msgs = get(url).collect {|x| [x['text'], x['created_at']]} cal = Icalendar::Calendar.new
(msgs.size-1).times do |i|
  cal.event do
    dtstart  DateTime.parse(msgs[i][1]).to_ical(true)
    dtend    DateTime.parse(msgs[i+1][1]).to_ical(true)
    summary  msgs[i][0]
  end
end

cal.to_ical


end end
utl = UserTimeLine.new(ARGV.shift) print NKF.nkf('-w -Lw', utl.to_ical)


posted with amazlet on 07.10.09
本田 直之
幻冬舎 (2007/05)
売り上げランキング: 359
おすすめ度の平均: 4.5
5 効率アップのシステム化
4 時間管理ができるとカッコいい!
4 マンガ本からの脱却を目指す方への最初の一冊
Tags: calendar, ,