Fold All / Expand All

2009年6月25日 星期四

涼煙樂團 6/27周末吉他手入場須知

6/27周末吉他手入場須知

6月27日(六)終於要到啦~~

14:30 入場
15:00 開始

入場需知:
請認明帶著透明試別證的工作人員
付給他新台幣150元 拿著獨一無二專屬於你的周末吉他手EP

交通資訊: 河岸留言- 台北市羅斯福路三段244巷2號B1
搭乘捷運:捷運公館站(4號出口)往左走或台電大樓站(1號出口)往右走 台電大樓旁巷口

另外,傳說中的專輯「UNDERGRADUATE大學生」,現在有官方下載囉!
[官方下載]UNDERGRADUATE大學生

2009年6月20日 星期六

QuickTime plugin and JavaScript

QuickTime and JavaScript@developer.apple.com

其中的AC_QuickTime.js使用方法:
QT_WriteOBJECT()會直接呼叫document.writeln()寫出來,
QT_GenerateOBJECTText()則是回傳字串。

參數:
0: src
1: width
2: height
3: activexVers
前四個參數是必要,之後的optional參數則是一次要加兩個,以attrName, attrValue的型式。
例如:QT_GenerateOBJECTText(
'Remedy.mp3' // src
, '320' // width
, '60' // height
, '' // activexVers
, 'id' // attrName: id
, 'qt_player' // attrValue: attrs['id'] = 'qt_player'
, 'enablejavascript'
, 'true'
, 'autoplay'
, 'false'
, 'postdomevents'
, 'true'
)

會吐出下列的字串<object classid="clsid:02BF25D5-8C17-4B23-BC80-D3488ABDDC6B" width="320" height="60" codebase="http://www.apple.com/qtactivex/qtplugin.cab#version=7,3,0,0" id="qt_player">
<param name="src" value="Remedy.mp3">
<param name="enablejavascript" value="true">
<param name="autoplay" value="false">
<param name="postdomevents" value="true">
<embed src="Remedy.mp3" width="320" height="60" pluginspage="http://www.apple.com/quicktime/download/" id="qt_player" enablejavascript="true" autoplay="false" postdomevents="true">
</embed>
</object>

參考demo site:
QuickTime plug-in DOM event demo - simple
QuickTime plug-in DOM event demo

在demo site有幾個有趣的現象,首先,demo site沒有設enablejavascript這個參數,有設postdomevents,而一般JS操作是成功的!所以postdomevents=true就imply enablejavascript囉!?
又,之前試Safari 4(win32), Chrome 2都會吃不到dom events,而這個demo site可以,看了code才發現,dom event裡用來attach的竟然都是用object的element!
用來嵌plugin的html有兩種tag,一個是embed、另一個是object,在Firefox, Opera, Safari, Chrome都是看embed,只有IE是看object,對QuickTime plugin的操作,例如SetURL(), Play()是分別的id才會成功。而event attch所使用的element,如果也是照上面這樣分開,Safari和Chrome會收不到dom events!改成都attch到object element,就都收到了!!

2009年6月14日 星期日

ID3v2 Attached picture

ID3 tag version 2.3.0 Informal standard

4.15. Attached picture

This frame contains a picture directly related to the audio file.
Image format is the MIME type and subtype [MIME] for the image. In
the event that the MIME media type name is omitted, "image/" will be
implied. The "image/png" [PNG] or "image/jpeg" [JFIF] picture format
should be used when interoperability is wanted. Description is a
short description of the picture, represented as a terminated
textstring. The description has a maximum length of 64 characters,
but may be empty. There may be several pictures attached to one file,
each in their individual "APIC" frame, but only one with the same
content descriptor. There may only be one picture with the picture
type declared as picture type $01 and $02 respectively. There is the
possibility to put only a link to the image file by using the 'MIME
type' "-->" and having a complete URL [URL] instead of picture data.
The use of linked files should however be used sparingly since there
is the risk of separation of files.

Text encoding $xx
MIME type $00
Picture type $xx
Description $00 (00)
Picture data

Picture type:
  • $00 Other
  • $01 32x32 pixels 'file icon' (PNG only)
  • $02 Other file icon
  • $03 Cover (front)
  • $04 Cover (back)
  • $05 Leaflet page
  • $06 Media (e.g. lable side of CD)
  • $07 Lead artist/lead performer/soloist
  • $08 Artist/performer
  • $09 Conductor
  • $0A Band/Orchestra
  • $0B Composer
  • $0C Lyricist/text writer
  • $0D Recording Location
  • $0E During recording
  • $0F During performance
  • $10 Movie/video screen capture
  • $11 A bright coloured fish
  • $12 Illustration
  • $13 Band/artist logotype
  • $14 Publisher/Studio logotype
理論上,mime type應該只有image/jpeg和image/png兩種,但是似乎有些軟體誤植了image/jpg進去,所以大部分都會採容錯,把image/jpg當做image/jpeg來處理。


有空再研究的APEv2
APEv2 specification

2009年6月13日 星期六

[what rTorrent did] Chap.1 what goes to tracker

第一章、rTorrent送了什麼給tracker

版本:rTorrent 0.8.2, libTorrent 0.12.2

在libtorrent-0.12.2/src/tracker/tracker_http.cc裡,我們可以看到

以下有機會送出
info_hash
peer_id
key
trackerid
ip
compact
numwant
port
uploaded
downloaded
left
event

一個個介紹
[info_hash]
info_hash是將meta data(也就是.torrent)的dictionary中,value of 'info'做了bencode後,用SHA1做出來的一個20-byte的字串。這個字串要做urlencode才可以丟給tracker喔。因為info_hash的值是拿'info'的值去做SHA1,所以修改'info'裡的值(e.g. file name, piece hash, piece length),就會造成SHA1的值不同,而被tracker視為不同的torrent;反之,修改不在'info'裡面的值,info_hash會是一樣的,e.g. 'creation date', 'created by', 'announce'。

[peer_id]
用來識別peer的字串,也是一個urlencoded的20-byte字串,目前如何產生peer_id並沒有一個標準的方法,很多client採用的是所謂的Azureus-style,前八個字元是-XXnnnn-,XX是兩個英文字,代表client,Azureus是用AZ、uTorrent是用UT,nnnn則是代表版本號,例如uTorrent 1.8.2會送出-UT1820-,後面12個字元則是亂數。

這裡介紹的rtorrent則是送出-lt0C20-,這裡lt代表libTorrent,0C20則是0.12.2。

在網路上會見到的libtorrent有兩個,一個是rtorrent使用的libTorrent,採用小寫的lt做為peer_id;另一個則是使用了boost library,被許多client拿來使用,包括:deluge, halite, Free download manager, arctic…,採用大寫的LT。

[key]
Optional,先跳過XD。

[trackerid]
Optional,當tracker回應有這個值的時候,下一次送announce出去要送這個值。

[ip]
Optional,一般這個值是不用看,除非和tracker接到request的來源ip不同,才有用。會發生這種情況,有可能是:client躲在NAT後面、http announce是透過proxy、tracker和client位於同一個NAT裡,要送internal address才會連得到。

rTorrent會在binding address不是any(即0.0.0.0)的時候,送出這個值。

[compact]
當compact的值為1,tracker回應peer_list會變成一個peer用6個byte,前4個byte是ip、後2個是port,都是以network byte order(即Network Endian)。

有些tracker為了節省頻寬,只會送compact回應,當client沒有送compact=1,會拒絕這個announce request。

[numwant]
Optional,代表client希望收到多少個peer。

[port]
client listening port,非常重要的值,BitTorrent protocol default range is 6881-6889,但是modern client都不採用了,如Azureus, uTorrent都是採用random port,最初目的是避免ISP擋掉6881-6889而無法連線成功,近期許多Private tracker也禁止使用6881-6889,tracker會回應failure: port is blacklisted。

如果client躲在NAT後面,listening port可能會沒有用。

[uploaded, downloaded]
自從client向tracker送出event=started開始,client上傳、下載了多少,官方並沒有指出單位是多少,一般都是以byte為單位。

由於數值是從送出event=started開始算,所以不管上傳、下載了多少,暫停再開始後,要從零開始算才是正確的。

在rTorrent送出的值分別是
info->uploaded_adjusted()。m_upRate.total() - uploaded_baseline(),baseline是在start的時候,設為nfo()->up_rate()->total()。
info->completed_adjusted()

[left]
代表client還剩下多少byte需要下載。理論上當這個值是0的時候,就是下載完了,但是tracker幾乎都是以event=completed做為下載完成的指示。

rTorrent送出info->slot_left()()

[event]
有三種
event=started
event=stopped
event=completed
其中completed只會在剛完成那次送,之後都不會送,tracker會利用收到幾個event=completed來更新該torrent已多少人完成。

相關連結:
http://wiki.theory.org/BitTorrentSpecification

2009年6月9日 星期二

賀!Roger Federer拿下法國公開賽冠軍

這下Roger除了打平了Pete Sampras的14座大滿貫冠軍,還達成了Pete沒有達到的成就:GRAND SLAM,也就是四項大滿貫都拿過冠軍,最近一次達成GRAND SLAM的人是Andre Agassi,再往前,就要跑到Rod Laver那個年代啦。

Roger在網壇的地位無庸置疑,加上拿下法網,2008年低潮被認為走下坡的說法一掃而空。不過…即使這些拿下法網,大家還是有話說XD,當然,就是Roger和Rafael Nadal之爭。

2008 US Open,英國新希望Andy Murray在四強擊敗Nadal,決賽卻直落三敗給了Roger,雖然US Open不一定Nadal就可以擊敗Roger,但是2008 Wimbledon實在給人太大震驚,原本人們認為擅長紅土和擅長草地的球員是"正反対",但是連兩年打進Wimbledon Final,最後在2008年打下Roger,Nadal究竟可以到什麼境界呢!?是否從此Roger的時代就要結束,換成Nadal呢。

Roger稱霸這麼久,Andy Roddick算是最哀怨的,如果不是Roger,Andy應該不會只有一座US Open。看著Roger領先其他球員高達數千分,其實大家一直都在期待有敵手,之前最被看好的就是Novak Djokovic了,也希望Nole可以更上一層,不要只有一座Australian Open啊。

嗯…如果從看球的角度來說上述四位,Andy是看爽的,大砲發球和正手,但是網前實在弱到爆炸,不知道最近有沒有練好一點,Nole算是都還不錯……嗯…也就是比較沒有那麼特色啦XD;雖然Roger看多了也是會有點膩,但是相較於Nadal的抓屁屁和超長發球動作…還是看Roger好了(逃)。

2009年6月1日 星期一

Cannot Send Referer at Google App Engine

雖然這是老問題了,因為GAE對http request禁止部分header
URL Fetch API::Request Headers

而最近嘗試弄某漫畫網站
(謎:喔…那個不知道多久沒更新的Comic Link Retriever,都爛光了)
不用Referer拿不到html啊……

最神奇的就是後來用白爛的'referer:'送出去,在localhost的sdk竟然可以騙過iis,可是送到gae上面去跑的時候,就failed了,iis return invalid header。

本來又改了個版本,透過不需要送referer的頁面去取得第一頁,結果今天那一頁也不見了!

結論是,複習PHP,棄守GAE啦。

該不會有一天Lyric Get也會因為這個原因而被迫棄守吧

話說,現在直接連gae doc都會跳到中文的去,然後資訊是舊的……
所以要直接連英文版的:http://code.google.com/intl/en/appengine/docs/