新しい記事があります。
リンク: 090720-別スレッドが終了するまで待つには: Non-programmer's Ruby in Pocket.
別スレッドが終了するまで待つようにしてみた。
先日作ったGoogleカレンダーを表示するプログラムが問い合わせに時間がかかるので、ネット上の問い合わせ部分とローカルの時計を参照する部分を分けて、別スレッドにしてみた。まだタイミングを合わせるなどはまったくしていない荒削りなスクリプトだが、とりあえず動く。 ====
$KCODE="UTF-8" # 外部とのやり取りはUTF-8で
require "kconv" # Windowsで表示するには、SJISに変換しなければならない
##### 目次 #####
##### 初期設定 #####
##### 時刻表示 #####
##### 天気 #####
##### Googleカレンダー #####
##### 初期設定 #####
def putsjis(string = "")
puts(string.tosjis)
# puts(string)
end
# 現在からの残り時間を整形する
class TimeLength
def initialize(time)
@seconds = time - Time.now
end
def format
flag = "あと "
if @seconds < 0
@seconds = -@seconds
flag = "《超過》 "
end
minutes = (@seconds / 60).round
hours = (minutes / 60).round
minutes = minutes % 60
flag + hours.to_s + " 時間 " + minutes.to_s + " 分"
end
end
class Event
def initialize(label, notify_hour, notify_minute, hour, minute, day_option = :today)
@label = label
@now = Time.now
if day_option == :tomorrow
@day = @now.day + 1
else
@day = @now.day
end
@notify_starttime = Time.local(@now.year, @now.month, @now.day, notify_hour, notify_minute)
@event_starttime = Time.local(@now.year, @now.month, @day, hour, minute)
end
def println
if @notify_starttime <= @now && @now <= @event_starttime + 60*30 # 30分後まで
tl = TimeLength.new(@event_starttime)
putsjis @label + "まで:"
putsjis tl.format
putsjis
sleep 1
end
end
end
##### 時刻表示 #####
Thread.new do
# 現在時刻を表示して1秒待つ
putsjis "現在時刻:"
putsjis Time.now.strftime("%H 時 %M 分")
putsjis
sleep 1
# 起床時刻は翌日の6時30分
getup_event = Event.new("起床時刻", 17, 15, 6, 30, :tomorrow)
getup_event.println
# 準備開始時刻は当日の7時20分
prepare_event = Event.new("準備開始時刻", 6, 30, 7, 20)
prepare_event.println
# 出発時刻は当日の7時30分
going_event = Event.new("出発時刻", 6, 30, 7, 30)
going_event.println
# 昼食は当日の12時30分
cooldown_event = Event.new("昼食", 10, 30, 12, 30)
cooldown_event.println
# 退勤時刻は当日の17時15分
cooldown_event = Event.new("退勤時刻", 15, 15, 17, 15)
cooldown_event.println
end
##### 天気 #####
require "weatherhacks"
forecast = WeatherHacks.lwws("東京", :tomorrow)
putsjis "明日の天気:"
putsjis forecast.telop
putsjis
##### Googleカレンダー #####
# 今日と明日の予定をGoogleカレンダーから取得し、表示します
# はじめにメールアドレス、パスワード、カレンダーの非公開URLを設定して下さい
require 'gcalapi'
# アカウントメールアドレス
mail = "xxxx@gmail.com"
# パスワード
pass = "xxxx"
# Googleカレンダーの「カレンダー設定」画面から取得した非公開URL
feed = "http://www.google.com/calendar/feeds/xxxx%40gmail.com/private-xxxxxxxx/basic"
# Googleカレンダーから予定を取得し、eventsに格納する
srv = GoogleCalendar::Service.new(mail, pass)
cal = GoogleCalendar::Calendar::new(srv, feed)
events = cal.events
# 今日の日付の文字列を作っておく
TODAY = Time.now.strftime("%Y/%m/%d")
putsjis "今日の予定:"
putsjis
sleep 1
# 各予定について・・・
events.each do |event|
title = event.title
# 時刻指定されている場合
if /^(\w*): (\d{4}\/\d{2}\/\d{2}) (\d{2}):(\d{2})~(\d{2}:\d{2}).*/ =~ event.desc
event_type = :time_ok
type = Regexp.last_match(1).to_s
date = Regexp.last_match(2).to_s
hour = Regexp.last_match(3).to_s
minute = Regexp.last_match(4).to_s
endtime = Regexp.last_match(4).to_s
if date == TODAY
event_tmp = Event.new(title, 0, 0, hour, minute)
event_tmp.println
end
# 時刻指定されていない場合
elsif /^(\w*): (\d{4}\/\d{2}\/\d{2})~(\d{4}\/\d{2}\/\d{2}).*/ =~ event.desc
event_type = :time_ng
type = Regexp.last_match(1).to_s
starttime = Regexp.last_match(2).to_s
endtime = Regexp.last_match(3).to_s
# 開始日のみの場合
elsif /^(\w*): (\d{4}\/\d{2}\/\d{2}).*/ =~ event.desc
event_type = :only_startdate
type = Regexp.last_match(1).to_s
starttime = Regexp.last_match(2).to_s
else
raise "unexpected format: " + event.desc
end
end
putsjis "以上"
sleep 2