Fold All / Expand All

2008年1月31日 星期四

pyLyricRetriever: add threading

還在寫(汗),Thread Programming真的是很不熟啊。

目前是把呼叫lyric_engine的部分拉出來成為一個class,繼承threading.Thread,在run()裡面呼叫get_lyric(),再抓IOError和TypeError,抓到的話,呼叫GUI端的函式來顯示錯誤發生。

為什麼會有TypeError呢?如果網址輸入了不支援的站台,或是關鍵字漏掉,就會發生……可是這應該在if key in dict就抓到了才對啊(大汗)。

另一個問題是,用thread之後,雖然程式是不會卡住,但是在那裡發呆也蠻慘的,有可能到5秒之久耶,莫非要學Lyrics Master弄一個``Ajax loading icon''?

Lantis Live, Event on Google Calendar

http://www.lantis.jp/special/

Live
Event

有使用Google Calendar的話,可以加入,不過舉辦地點幾乎都是在日本啦~~

コードギアス 反逆のルルーシュ DVDマガジン

C.C.被醜化了XD



会長:「ルルーシュ、やけるでしょう」
ルル:「いや、べつに」
シャーリー:「どっちにやいてるんだろうね」
会長:「シャーリー、あんた変な本読みすぎなんじゃない」
╮(﹀_﹀")╭

2008年1月30日 星期三

美郷あき新官網

原來是舊聞(汗)

自2008年1月1日起,官網網址更改為http://misatoaki.jp

終於有自己的domain name啦

SConstruct for XeLaTeX

This is only a test.
# coding: utf8
#
# SConstruct for xelatex
import os
bld = Builder(action='xelatex $SOURCES',
suffix='.pdf',
src_suffix='.tex')
env = Environment(BUILDERS={'PDFBuilder': bld},
ENV={'PATH': os.environ['PATH']},)
env.PDFBuilder(target='test', source='test')

waf一時找不到自訂方案,先跳到SCons來看看。

小清水亜美・福山潤のオオカミックラジオ 第4回

小清水亜美・福山潤のオオカミックラジオ

小清水:「キモい」
(謎:おいおい。先輩に対する態度か)

要不是小清水已經當過這麼多主役的話,沒可能這麼大膽吧@@。比相聲吵的還兇,然後兩個人從第一集開始就狂抓對方吃螺絲

アンニュイ/退屈。倦怠(ケンタイ)感。

福山:「駄洒落を言う女声優」
小清水:「あ、いますよ」
福山:「だれ」
小清水:「清水香里ちゃん」
福山:「あ、じゃそれでいいよ」

上面這段是怎樣 ̄▽ ̄||

「狼と琥珀色の憂鬱」將於第5回出現

遠藤正明唱「アンインストール」

沒錯!就是動畫ぼくらの主題曲,由石川智晶所演唱的「アンインストール」。

在網路廣播節目「スパロボOGラジオ うますぎWAVE」中的單元「遠藤正明の歌魂(うただま)」,遠藤會演唱一首與超級機器人大戰相關的曲目,因為ぼくらの也算是機器人動畫,所以在第56回時就唱了這首啊。

該單元大約在27:15左右開始,當遠藤一說出要唱「アンインストール」,在一旁的杉田智和也不敢相信地喊了一聲「うそ」。

原來「アンインストール」的key這麼高啊,連遠藤都有差點唱不上去的部分@@。

然後這集一直在講「台湾行きたい」是怎樣…|||,話說遠藤和杉田都來過台灣啊。

ATH A900

明明就沒收入了還敗家@@。





自從上次試聽了A700之後,對A系列的3D Wing Support設計覺得很棒,戴起來沒有壓迫感,又不需要調整,所以還是衝了~~。


目前run耳機中。

話說價錢啊,和音悅用宅配貨到付款,竟然還比網路上眾家拍賣還便宜。喔,當然是比十全公司貨的價格,平行輸入的話還是比較便宜。

2008年1月29日 星期二

pyLyricRetriever 4 ready to go

終於把現有支援站台的song info都寫好了,新增一個雞肋的Save功能,把psyco功能加進來(雖然bottleneck是在網路…),menubar有站台Link和測試連結,socket error的話會顯示,但是不會修好它(廢話)。

known issues:
如果網路因素導致要抓很久的話,會像程式當掉一樣,也就是Not Responding,雖然最後會有IOError message,不過user experience很差。目前懶得解,反正不是non-block就是開thread。

binary與source tar ball稍後上傳。
#!/usr/bin/python
# coding: utf-8
import os
import wx
from PythonCard import model, dialog
import lyric_engine

class Main(model.Background):
def on_initialize(self, event):
self.components.urlTextField.setFocus()

def on_menuFileSave_select(self, event):
"""Save content in urlTextField using UTF-8 encoding"""
# default save directory in home dir
save_dir = os.path.expanduser('~')
if os.name == 'nt':
# windows default in Desktop
save_dir = os.path.join(save_dir, u'Desktop')

result = dialog.fileDialog(self,
'Save',
save_dir,
'lyric.txt',
'Text Files (*.txt)|*.txt|All Files (*.*)|*.*',
wx.SAVE | wx.OVERWRITE_PROMPT,
)

if result.accepted:
f = open(result.paths[0], 'wb')
string = self.components.lyricTextArea.text
f.write(string.encode('utf8'))
f.close()

def on_activate(self, event):
self.components.urlTextField.setFocus()

def on_queryButton_mouseClick(self, event):
# get lyric page url
url = self.components.urlTextField.text

# clear lyric textarea
self.components.lyricTextArea.text = ''

# disable query button (avoid multiple queries) and url text field
self.components.queryButton.enabled = False
self.components.urlTextField.enabled = False

# processing
self.process_url(url)

# enable query button and url text field
self.components.queryButton.enabled = True
self.components.urlTextField.enabled = True

def on_testUrl_command(self, event):
"""based on the name of menu item, do lyric site test"""
raw_name = event.target.name
site_name = raw_name[raw_name.find('_') + 1:]
self.components.urlTextField.text = lyric_engine.get_test_url(site_name)

# do query
self.on_queryButton_mouseClick(event)

def on_launchBrowser_command(self, event):
""" based on the name of menu item, launch browser to the site"""
raw_name = event.target.name
site_name = raw_name[raw_name.find('_') + 1:]
self.open_web_link(lyric_engine.get_site_url(site_name))

def open_web_link(self, url):
import webbrowser
webbrowser.open_new(url)

def process_url(self, url):
# verify url, if invalid, popu a warning dialog
self.statusBar.text = 'verifying url...'
url = self.verify_url(url)
if url == False:
self.show_invalid()
return False

# call lyric engine to get lyric
try:
lyric = self.get_lyric(url)
if lyric == None:
self.show_invalid()
return False
except IOError:
# site not available, or bad network connection
comp = self.components
strs = self.resource.strings
comp.lyricTextArea.text = strs.str_error_IOError
return False

# show lyric
self.show_lyric(url, lyric)

self.statusBar.text = 'lyric retrieved!'

def show_lyric(self, url, lyric):
# set the first line as the url of lyric
# then the following is the lyric
self.statusBar.text = 'showing lyric'
# string = unicode('lyric from '+url) + u'\n\n' + lyric
string = lyric
self.components.lyricTextArea.text = string

def get_lyric(self, url):
""" choose different processing function to handle """
self.statusBar.text = 'processing url...'
engine = lyric_engine.Lyric(url)

try:
lyric = engine.get_lyric()
except IOError:
raise

return lyric

def verify_url(self, url):
""" check if 'http://' is in the input string """
if url.find('http://') == -1:
return False
else:
return url

def show_invalid(self):
self.statusBar.text = 'invalid url'
result = dialog.alertDialog(self, 'Invalid URL', 'Error')

if __name__ == '__main__':
try:
import psyco
psyco.full()
except ImportError:
pass
app = model.Application(Main)
app.MainLoop()

編碼還是要自己先處理掉比較穩

話說目前pyLyricRetriever開始要利用BeautifulSoup來擷取歌曲相關資訊,包括:歌手、曲名、作詞、作曲,而目前已經實做好的是kasi-time

測試的時候,卻出現kasi-time的歌曲資訊的編碼爛掉了,怪了,明明就是euc_jp沒錯啊。

BeautifulSoup不論有沒有指定fromEncoding,都會爛掉,難道是BeautifulSoup有bug!?

好吧,那urllib抓下來的東西,先自己decode轉成Unicode type吧。

因為kasi-time現在常常會timeout,貌似伺服器流量過大,快撐不住了,所以抓bug速度緩慢…。

終於,成功下載之後,error出來啦!
cannot decode position 11084-11085

呃…這三小

MadEdit用Hex Mode去查,原來是kasi-time提供的動畫連結功能,其comment因為長度太長,被攔腰截斷,殘留了一個無法decode的byte,用decode('euc_jp', 'ignore')把這個問題解決掉。

而BeautifulSoup可能是因為用euc_jp沒辦法成功decode,就自做主張找了一個encoding去解了,然後當然是爆炸。

怎麼不是在找document,就是在解奇怪的bug…song info parsing一點進度都沒有(汗)。

PythonCard: How to access strings defined in String Editor

找好久才挖到…在ASPN Mail Archive裡某篇

官網文件沒有寫到,用法是self.resource.strings.stringName

PythonCard的文件量明顯還很不足啊…

Mercurial: Ignoring unwanted files and directories

XXX.
(謎:おいおい)

在查Mercurial要如何忽略檔案時,查Distributed Revision Control with Mercurial所得到的結果@@。

不過Mercurial是有ignore的功能啦,請見.hgignore

使用方法,在working directory,即.hg資料夾所在位置(不是放在.hg裡面喔,是和.hg在同一資料夾),新增一個檔案名為.hgignore,裡面寫著要ignore的檔案的pattern,pattern有兩種表示法。

Man page的範例# use glob syntax.
syntax: glob
*.elc
*.pyc
*~
.*.swp
# switch to regexp syntax.
syntax: regexp
^\.pc/

目前pyLyricRetriever設的# switch to regexp syntax.
syntax: regexp
\.svn
\.pyc$
^\.hgignore$

這樣就可以和svn共存,也不用每次都要把pyc砍掉再看hg st。

pyLyricRetriever轉換成以PythonCard為GUI framework

雖是這麼說,不過Google Code那邊連svn都還沒放上去,更別說是src tar ball和win32 binary了。明天來研究svn的branch要怎麼弄再放上去@@。

今天的進度是在menubar加上了Link,會列出目前已支援的站台,按下去就會呼叫瀏覽器開啟該站台。

開啟瀏覽器是利用Python standard module ``webbrowser''。

程式碼目前尚未突破100行。
(謎:因為都寫在rsrc.py裡啦…)

#!/usr/bin/python
# coding: utf-8
from PythonCard import model, dialog
import lyric_engine

class Main(model.Background):
def on_initialize(self, event):
pass

def on_queryButton_mouseClick(self, event):
# get lyric page url
url = self.components.urlTextField.text

# clear lyric textarea
self.components.lyricTextArea.text = ''

# verify url, if invalid, popu a warning dialog
self.statusBar.text = 'verifying url...'
url = self.verify_url(url)
if url == False:
self.show_invalid()
return False

# processing url
self.statusBar.text = 'processing url...'
lyric = self.process_url(url)
if lyric == None:
self.show_invalid()
return False

# show lyric
self.statusBar.text = 'showing lyric'
self.show_lyric(url, lyric)

self.statusBar.text = 'lyric retrieved!'

def on_launchBrowser_command(self, event):
""" based on the name of menu item, launch browser to the site"""
raw_name = event.target._name
site_name = raw_name[raw_name.find('_') + 1:]
self.open_web_link(lyric_engine.get_site_url(site_name))

def open_web_link(self, url):
import webbrowser
webbrowser.open_new(url)

def show_lyric(self, url, lyric):
# set the first line as the url of lyric
# then the following is the lyric
string = unicode('lyric from '+url) + u'\n\n' + lyric
self.components.lyricTextArea.text = string

def process_url(self, url):
""" choose different processing function to handle """
engine = lyric_engine.Lyric(url)
lyric = engine.get_lyric()

return lyric

def verify_url(self, url):
""" check if 'http://' is in the input string """
if url.find('http://') == -1:
return False
else:
return url

def show_invalid(self):
self.statusBar.text = 'invalid url'
result = dialog.alertDialog(self, 'Invalid URL', 'Error')

if __name__ == '__main__':
app = model.Application(Main)
app.MainLoop()

error handling還是無進度…|||

2008年1月27日 星期日

賀Novak Djokovic拿下2008年澳洲公開賽男單冠軍

Australian Open

Novak Djokovic以4-6, 6-4, 6-3, 7-6 (7-2)擊敗Jo-Wilfried Tsonga,拿下生涯第一座大滿貫賽事冠軍。不過Djokovic的積分仍然維持在第三名,前兩名實在太強大啦~~。

女單方面,則是由Maria Sharapova拿下冠軍,生涯第三座大滿貫。

少年組男雙,台灣選手謝政鵬(Cheng Peng Hsieh)、楊宗樺(Tsung-Hua Yang)拿下冠軍!楊宗樺在少年組男單也打進決賽。

還是很好用的SQL Injection

每次看到.asp的登入,就會試一下,5次會成功3次吧…

不過當這個站有自己的帳號的時候就很抖。

2008年1月26日 星期六

PythonCard與py2exe

拿原本跑wxPython的setup.py去跑,dist是會產生出來,但是一跑就error啦。Traceback (most recent call last):
File "main.py", line 59, in <module>
File "PythonCard\model.pyo", line 366, in __init__
File "PythonCard\resource.pyo", line 45, in __init__
File "PythonCard\util.pyo", line 39, in readAndEvalFile
TypeError: coercing to Unicode: need string or buffer, NoneType found

說明請見py2exe的wiki:PythonCardSetup
簡單講,就是沒有把resource檔(resc.py)與components複製到,所以把setup.py稍微修改一下即可。

以下是目前pyLyricRetriever的setup.py (not refined)
from distutils.core import setup
import py2exe

manifest = """
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<assembly xmlns="urn:schemas-microsoft-com:asm.v1"
manifestVersion="1.0">
<assemblyIdentity
version="0.64.1.0"
processorArchitecture="x86"
name="Controls"
type="win32"
/>
<description>myProgram</description>
<dependency>
<dependentAssembly>
<assemblyIdentity
type="win32"
name="Microsoft.Windows.Common-Controls"
version="6.0.0.0"
processorArchitecture="X86"
publicKeyToken="6595b64144ccf1df"
language="*"
/>
</dependentAssembly>
</dependency>
</assembly>
"""

"""
installs manifest and icon into the .exe
but icon is still needed as we open it
for the window icon (not just the .exe)
changelog and logo are included in dist
"""

import os
# find pythoncard resources, to add ad 'data_files'
pycard_resources = []
for filename in os.listdir('.'):
if filename.find('.rsrc.') > -1:
pycard_resources += [filename]

# includes for py2exe
includes = []
for comp in ['button', 'image', 'staticbox', 'statictext',
'textarea', 'textfield', 'passwordfield']:
includes += ['PythonCard.components.' + comp]
print 'includes', includes

setup(
windows = [
{
"script": "main.py",
"icon_resources": [(1, "lyric_ico.ico")],
"other_resources": [(24,1,manifest)],
}
],
options = {
"py2exe": {
"optimize": 2,
"compressed": 1,
"includes": includes,
}
},
data_files = [('', ['lyric_ico.ico'] + pycard_resources)]
)

PythonCard初嘗試

PythonCard
把wxPython再包一層,並提供Resource Editor…等工具。

剛才試了一下,拿來寫pyLyricRetriever的GUI,code量銳減!

不過之前wxPython是把layout直接用code寫,PythonCard則是透過resource的方式,因此理所當然code量不同。

兩者的GUI畫起來,還蠻不同的感覺,之前的wxPython是利用wxGlade,layout都是用sizer去排,所以multiline textfield可以跟著視窗改變大小。而PythonCard目前似乎還沒支援sizer,所以是position, size固定值,是否可以resize那邊就disable掉啦~~。

Binding也是不同,在PythonCard直接寫成on_componentName_eventName即可,原本需要下binding
self.Bind(wx.EVT_BUTTON, self.OnClick, self.button_query)
就直接把OnClick()取名為
def on_queryButton_mouseClick(self, event):
即可

原本透過getter, setter也變成直接存取該value,例如
self.components.lyricTextArea.text = ''

不過PythonCard的document還不是很詳盡,為了簡化wxPython,很多功能就找了老半天才發現。例如一開要將focus設在輸入網址的textfield,在wxPython的時候,就在__init__()裡面放一個SetFocus(),而PythonCard沒有寫__init__()的習慣,要達到這個效果的方法是讓該textfield為resource的第一個(即components順位會影響focus)。

要控制statusbar的話,請用self.statusBar.text,在官方document也沒看到,後來在別的地方才咕到。
#!/usr/bin/python
# coding: utf-8
from PythonCard import model, dialog
import lyric_engine

class Main(model.Background):
def on_queryButton_mouseClick(self, event):
# get lyric page url
url = self.components.urlTextField.text

# clear lyric textarea
self.components.lyricTextArea.text = ''

# verify url, if invalid, popu a warning dialog
self.statusBar.text = 'verifying url...'
url = self.verify_url(url)
if url == False:
self.show_invalid()
return False

# processing url
self.statusBar.text = 'processing url...'
lyric = self.process_url(url)
if lyric == None:
self.show_invalid()
return False

# show lyric
self.statusBar.text = 'showing lyric'
self.show_lyric(url, lyric)

self.statusBar.text = 'lyric retrieved!'

def show_lyric(self, url, lyric):
# set the first line as the url of lyric
# then the following is the lyric
string = unicode('lyric from '+url) + u'\n\n' + lyric
self.components.lyricTextArea.text = string

def process_url(self, url):
""" choose different processing function to handle """
engine = lyric_engine.Lyric(url)
lyric = engine.get_lyric()

return lyric

def verify_url(self, url):
""" check if 'http://' is in the input string """
if url.find('http://') == -1:
return False
else:
return url

def show_invalid(self):
self.statusBar.text = 'invalid url'
result = dialog.alertDialog(self, 'Invalid URL', 'Error')

if __name__ == '__main__':
app = model.Application(Main)
app.MainLoop()


{'application':{'type':'Application',
'name':'Template',
'backgrounds': [
{'type':'Background',
'name':'bgTemplate',
'title':u'Standard Template with File->Exit menu',
'size':(626, 630),
'statusBar':1,
'icon':'lyric_ico.ico',

'menubar': {'type':'MenuBar',
'menus': [
{'type':'Menu',
'name':'menuFile',
'label':'&File',
'items': [
{'type':'MenuItem',
'name':'menuFileExit',
'label':'E&xit',
'command':'exit',
},
]
},
]
},
'components': [

{'type':'TextField',
'name':'urlTextField',
'position':(50, 10),
'size':(305, 25),
'font':{'faceName': u'Tahoma', 'family': 'sansSerif', 'size': 12},
'text':u'please input the url of lyric',
},

{'type':'Button',
'name':'queryButton',
'position':(370, 10),
'size':(80, 25),
'default':True,
'font':{'faceName': u'Tahoma', 'family': 'sansSerif', 'size': 12},
'label':u'Download',
},

{'type':'TextArea',
'name':'lyricTextArea',
'position':(10, 40),
'size':(600, 500),
'editable':False,
'font':{'faceName': u'Meiryo', 'family': 'sansSerif', 'size': 12},
},

{'type':'StaticText',
'name':'urlText',
'position':(10, 10),
'font':{'faceName': u'Tahoma', 'family': 'sansSerif', 'size': 12},
'text':u'URL:',
},

] # end components
} # end background
] # end backgrounds
} }

2008年1月24日 星期四

JAM Project成員的年齡

影山ヒロノブ (1961年2月18日)
松本梨香 (1968年11月30日)
遠藤正明 (1967年8月28日)
きただにひろし (1968年8月24日)
奥井雅美 (1968年3月13日)
福山芳樹 (1963年9月14日)

水木一郎 (1948年1月7日)
坂本英三 (1964年2月23日)

結果最年輕的是松本梨香!

沒想到ダニ也快40歲了~~

2008年1月23日 星期三

最擔心的事情發生了…

冏…這就是手續太早辦好的下場,到這個階段就中獎了,一過12點,就失效了。

還好這回叔叔有練過,用別的方法來達成上網。

好孩子不要學喔。

2008年1月22日 星期二

為什麼需要買一支好的耳機

這樣聽1812才不會聽到笑場

定音鼓聽起來和背景噪音差不多XD

再戰沙羅曼達

在打過幻之軍團後,沙羅曼達真的…不怎麼樣。本來是可以在一回合就結束掉的,不過為了拿寶箱,三回合才結束。

放一張和沙羅曼達沒有關係的圖…

2008年1月21日 星期一

アニソン歌手台湾ライブ記録

2006年 2月15日
  • http://forums.odysseyweb.idv.tw/index.php?showtopic=808
  • 從這一篇討論開始
2006年 4月 9日
  • 開始進行連署
  • 以奇摩家族 http://tw.club.yahoo.com/clubs/fukuyama/ 為連署討論區
  • 於5月3日寄出200多份連署單
2006年 6月15日
  • 日方回應有舉辦意願
  • 於7月初來台考察,得到「時間未定,但是一定會辦」的答案
2006年 9月16日
  • 在THE WALL於16:00開始預售的門票,在不到30分鐘內賣完
  • 門票:$1000 (預售價)
  • (公定600張門票,雖然事前有被黑箱掉一定數量,但是30分鐘還是很驚人)
2006年11月 4日
  • http://live.fukuyama.tw/
  • YOSHIKI FUKUYAMA LIVE TOUR 2006 IN TAIWAN
  • 長達2小時30分鐘,共計19首加3首安可曲
  • 自此寵壞了台灣歌迷,認為演唱會只唱一個小時半是太少的XD
2006年12月13日
  • http://kotokotw.blogspot.com/ (Page Not Found)
  • KOTOKO連署活動開始
2007年 3月24日
  • http://kotokotw.info/
  • KOTOKO台灣演唱會決定舉辦
  • 連署書於3月初寄出300份
2007年 3月28日
  • 影山ヒロノブ&遠藤正明台灣演唱會消息公佈
2007年 5月 5日
  • KOTOKO門票在LUXY於14:00預售
  • 前晚就有不少人開始排隊
  • 門票:$1500
  • 約1000張
2007年 5月12日
  • 影山ヒロノブ&遠藤正明台灣演唱會在台大小巨蛋1樓舉行
  • 門票:分區不同價,$2000, $1600, $1200, $800, $500
2007年 6月24日
  • KOTOKO ASIA TOUR 2007 IN TAIWAN
  • 電台節目「KOTOKOノコト」之後有播出部分當晚實況
2007年 9月18日
  • 「榊原ゆい Formosa Live in Taipei 2007」消息傳出
  • 預定舉辦日期為10月28日
2007年10月21日
  • 榊原ゆい演唱會活動取消公告
2007年10月23日
  • 「聖夜歌姬」演唱會 栗林みな実&美郷あき 消息公佈
  • 地點為台北市政府親子劇場
2007年11月16日
  • 「聖夜歌姬」演唱會 年代售票開始
  • 門票:分區不同價,$2000, $1500, $1200, $800
  • 約900張
  • =====
  • 同日,THE WALL公佈下川みくに台灣Live消息
  • 舉辦日期於聖夜歌姬同一天(12月23日)
  • 自此內幕與風雲不斷XD
  • =====
  • 同日,http://ive.mu/ 放出「川田まみ一月台灣Live」消息
2007年12月 1日
  • 下川みくに台灣Live門票於THE WALL開始預售
  • 門票:$1200 (預售價) (500張)
2007年12月15日
  • http://www.sre-music.com/
  • 川田真美2008台灣演唱會門票預售開始
  • 門票:搖滾區$1500、坐位:$1200
  • 地點:蘆洲功學社音樂廳
2007年12月23日
  • 「聖夜歌姬」演唱會 栗林みな実&美郷あき
  • =====
  • 下川みくに First Taiwan Live "Reprise"
2008年 1月19日
  • MAMI KAWADA 2008 January LIVE in TAIWAN
2008年 1月20日
  • 川田真美座談會&簽名會
  • 特別來賓:島みやえい子
  • 島みやえい子宣佈於9月在台舉辦演唱會
2008年 9月
  • 島みやえい子演唱會,詳情未定

2008年1月16日 星期三

Google Analytics keyword problem fixed?

Back to Google Analytics Legacy Tracking Code

上次提到在Google Groups也有人有這個問題,在向Google反應之後,很快地有回信,說已經通知工程師了,修復的時間不定。

而今天看起來好像正常了(!?),在另一個用ga.js的站,今天(16號)的Keyword開始出現非escape的!
o うたたね 茶太
o ずーっとふみふみするのかな
o だんご大家族

再放個幾天看看吧,如果修好的話,這裡也可以換成ga.js。

2008年1月15日 星期二

声優アワード 第二回投票

一般投票

第二回候選人

主演男優請投「中村悠一」一票!
(謎:竟然開始在拉票了)

新人男優請投「宮野真守」
(謎:因為男主角投給ゆうきゃん了)

歌唱賞,直覺是投給maaya,不過第二回是否有人能打下nana呢?

女優沒特別想到誰,主角、配角都投給斎賀さん。男配角投給了まだお(立木文彦)。新人女優投給了ささきのぞみ。パーソナリティ投給小野坂昌也。

預測!?
新人男優:宮野應該沒問題吧,這麼多主役,比知名度的話,也只有白石稔可以相較(!?),不過這單純是站在某方面來看。
新人女優:名單一看怎麼不太熟XD,伊藤静的角色貌似比較多,白石涼子主役好像也不少。
歌唱賞:我期待水樹奈々以外的名字。
主演男優:ゆうきゃん真的很有機會啊,杉田和宮野呢?

其他連猜都沒有頭緒XD。


第一回声優アワード受賞者
主演男優賞:
福山潤(ルルーシュ「コードギアス 反逆のルルーシュ」)

主演女優賞:
朴璐美(大崎ナナ「NANA」)

サブキャラクター男優賞:
石田彰(アスラン・ザラ「機動戦士ガンダムSEED DESTINY」)
宮田幸季(吉永和己「吉永さん家のガーゴイル」)

サブキャラクター女優賞:
小清水亜美(カレン・シュタットフェルト「コードギアス 反逆のルルーシュ」)
後藤邑子(朝比奈みくる「涼宮ハルヒの憂鬱」)

新人男優賞:
柿原徹也(豊実琴「プリンセス・プリンセス」)
森田成一(黒崎一護「BLEACH」)

新人女優賞:
鹿野優以(九頭竜もも子「すもももももも 地上最強のヨメ」)
平野綾(涼宮ハルヒ「涼宮ハルヒの憂鬱」)

歌唱賞:
水樹奈々(Justice to Believe)

ベストパーソナリティ賞:
浅野真澄(A&G 超RADIO SHOW~アニスパ!~)

2008年1月10日 星期四

ktxp comic downloader

# -*- coding: utf-8 -*-
# tested in Python 2.5
import re, binascii, urllib, sys

class KtxpComic:
def __init__(self):
self.server = self.get_server()

if self.server == None:
print 'error: cannot get server list'
sys.exit(1)

def go(self, url):
self.main_page_url = url

# download main page
array = self.get_pic_array(url)

# generate full url list
url_list = self.get_full_url_list(array)

# output full url list
self.output_url_list(url_list)

def output_url_list(self, url_list):
# parse chapter id
url = self.main_page_url
chapter_id = url[url.rfind('/')+1 : url.rfind('.')]

# output data
string = '\r\n'.join(url_list)

# output text file name
comic_name = self.get_comic_name()

if comic_name:
output = u'url_list_%s_%s.txt' % (chapter_id, comic_name)
else:
output = 'url_list_%s.txt' % (chapter_id)

out = file(output, 'wb')
out.write(string)
out.close()

def get_comic_name(self):
data = self.main_page_data

pattern = '<title>([^<]+)</title>'
bool = re.compile(pattern).search(data)
if bool:
comic_name = bool.group(1)

comic_name = comic_name.replace('|', ' ')

return comic_name

return None

def get_full_url_list(self, array):
array = [self.server+x for x in array]

return array

def get_pic_array(self, url):
reply = urllib.urlopen(url)
data = reply.read()
data = unicode(data, 'utf8')

self.main_page_data = data

pattern = "pic\[[0-9]+\] = '([a-z0-9]+)'"
regex = re.compile(pattern)
array = regex.findall(data)

array = [self.decode_pic_string(x) for x in array]

return array

def get_server(self):
# http://comic.ktxp.com/common/server.js
# get pic_server[0], pic_server[1], pic_server[2]
# pattern = "url:'(http://[^']+)'"
#
# the following code only get the first server

server_js = 'http://comic.ktxp.com/common/server.js'

reply = urllib.urlopen(server_js)
data = reply.read()

pattern = "url:'(http://[^']+)'"

bool = re.compile(pattern).search(data)
if bool:
server = bool.group(1)
return server

return None

def combine_server_and_url(self, url):
return self.server + url

def decode_pic_string(self, string):
array = []
for i in range(0, len(string), 2):
char = binascii.unhexlify(string[i:i+2])
array.append(char)

output = ''.join(array)

return output

if __name__ == '__main__':
input = 'input.txt'
f = open(input, 'rb')

# processing object
obj = KtxpComic()

for line in f:
line = line.strip()

if line == '':
# skip empty line
continue

if line[0] == '#':
# skip comment
continue

if line.find('http://') != -1:
# url as right input
obj.go(line)

# others won't process

2008年1月7日 星期一

Python 3.0初嘗試

What's New in Python 3.0

一整個冏

不是說東西不好,而是code要改得很高興XD。雖然說有2to3工具,不過實際用起來的效果如何呢…

由於wx還沒有for Python 3.0的版本,所以只能先試沒用wx的程式,在試lyric_engine就狂error,因為str, unicode改成bytes, str了,其實換這個命名是合理的,本來Python 2在處理str就是和處理bytes一樣,一個個byte分開來看,decode之後才是unicode string,用unicode point來表示。而Python 3.0改成bytes, str之後,原本宣告時用''包起來的是str,而bytes則是要在前面加一個b ,變成b''。而兩個型態不能餵到對方的function裡,也就是說原本寫data.find(prefix),data是從urlopen傳回來的,py2是str,在py3變成bytes,而prefix是用''宣告的,一樣都是str型態,但是現在就不能餵啦。

1/2變成0.5,要用1//2才會是0,這個…不知道會不會遇到問題。

暫時還是先移除了~~,過一陣子再說吧。

[耳コピー] ウサギキノコ『さびしんぼう。』track 03「-       -」

(耳コピー)

ウサギキノコ『さびしんぼう。』track 03
「-       -」
作詞:茶太
曲:ぺーじゅん


冬が近づく ある晴れた朝
日向でまどろむ小さい君は
少し冷たい風におくられ
遠くへ遠くへ行ったんだ

まぶた閉じて 浮かんだのは
君と初めて出会ったあの日で
外は寒くて 君は震えて
小さく丸まってたね

たくさんの幸せがあの日から生まれたよ
かけがえないものを小さな体で分けてくれた

風になびいたカーテンに
そっと駆け寄る軽い足跡
振り向くソファーの??
くつろぐ君はもういない

一つ一つ 積み重なった
どうでもいいような小さいことが
海の奥で 丸くなって
涙と一緒に落ちた

名前を呼んだけど尻尾はもう動かない
出来あげた体は昨日と同じで柔らかいのに

1人と1匹寄り添って
君といたのは温かい日々
今までずっとありがとう
もっと一緒にいたかった

涙が止まらない 止まらないよ

風になびいたカーテンに
そっと駆け寄る軽い足跡
聞こえる気がして 目を閉じた
君は今頃あの空に
ラララララ