顯示具有 hack 標籤的文章。 顯示所有文章
顯示具有 hack 標籤的文章。 顯示所有文章

2007年11月24日 星期六

Flickr API undocumented limitation

我目前在學校有個 project 需要從 flickr 抓取大量資料,包括照片的 tag、owner 等 meta data。但是我發現我拿到的 data 怪怪的,一些常用的 tag 竟然只有幾百筆。我用的 API 是 flickr.photos.search,它可以接受很多條件,然後傳回符合的照片,其中有兩個條件是最早跟最晚的上傳時間。於是我只好把時間間隔縮小很多。

直到昨天,我收到一封恐嚇^H^H警告信,說明 query return 回來的 offset 不能超過 4000,換句話說頂多拿到 4000 筆左右的結果。API 的文件沒提到這件事,query 傳回來的 status 也都是正常 ...

還好我抓得夠暴力(?),不然如果沒收到這封信,之後學校的實驗就可能是錯的了 :(


Greetings!
We have noticed that the api key 72157602728288126
registered to you is sending very large offset queries to
us.
example (offset=16893165)
Can you please check your usage and reconsider using these
high offsets? They are heavy/costly queries that tax our
backends.

Also to note: the search backend currently will not return
any results greater than offset 4000.

If you could limit the max offset to below 4000, we would
greatly appreciate it (and not have to disable the key -
not because we want to, but because our backends can't take
very much of it).

Thanks!
- Flickr Team

2007年4月16日 星期一

Our-Conf

maintain 多台 debian 機器的設定檔很麻煩,所以我寫了一個 package 來做這件事。

下載之後,目錄裡面會有個 ROOT 目錄,直接對應到你系統上的 /。直接把設定檔放進去,就像裡面的 ROOT/etc/hosts 那樣。然後 make,就會生出 our-conf.deb 了 :D

Our-Conf

2007年3月15日 星期四

ip over ptt over wifly

最近 ptt 推出「用 WiFly 免費連上 ptt/ptt2」的服務,詳細內容請見活動網頁

不過如果只能連 ptt 好像很不方便。於是我就想到可以 ip over ptt XD (當然,我用不到所以也不會寫 :p)

首先,除了用 wifly 的電腦,外面也事先要跑隻 daemon 來轉送封包。它們要做的事是連上 ptt,進 chatroom (水球會 lag,又會掉),把對方送來的 packet 往下(e.g. tcp)送。這樣就可以用 wifly 隨意上網了 XD

不只是這樣,因為 daemon 裡面外面(wifly 的裡面外面)透過 chatroom 連在一起,是對等的,所以裡面還可以跑 server 喔。當然前提是外面必須能把 packet 丟到 wifly 發的 ip。

如果上面的 idea 能成真,就可以做出一台 router 來做這些事 XD 真是邪惡...

2007年2月9日 星期五

中信局設備選擇器

[lang_zh]
實驗室最近要買 computational farm,於是我第一次要 survey 中信局的機器。不看還好,看了才發現表格大的那麼可怕,要用人眼從裡面找東西…不但費時,又容易出錯。於是就寫了一支程式來幫我過濾我不需要的訊息。

目前 online 的版本在 http://victor.csie.org/ctoc/。雖然寫得不是很漂亮,但是我自己用起來還滿 ok 的。歡迎有需要的人來當白老鼠^H^H^H試用,應該可以減少大家不少時間。
[/lang_zh]

2006年12月5日 星期二

InvSqrt()

看到開根號倒數 (InvSqrt(), 1 / sqrt(x)) 速算法,這真是太棒了。寫了一段 code 測試,跑 1..1000000000 出來的時間,1 / sqrtf(i) 出來平均大約是 9 秒多一點,而 InvSqrt() 是接近 3 秒。至於數值的精確度,我對 1 .. MAX 每個值丟給兩個方法看他們的差,發現數字越大越準,而 InvSqrt() 出來的值「略小於」1 / sqrtf(x)。

Let f1 = 1 / sqrtf(x), f2 = InvSqrt(x)
這個表第一欄是 MAX,第二欄是 \sigma_{1..MAX}(f1 - f2),第三欄是把第二欄 sigma 裡面的值取絕對值,第四欄是平均誤差。

1000000000: 8.0000000000 8.0000000000 0.0000000800
10000000: 5.7150559425 5.7150559425 0.0000005715
1000000: 1.8854961395 1.8854961395 0.0000018855
100000: 0.5647696257 0.5647696257 0.0000056478
10000: 0.1864424646 0.1864424646 0.0000186461


另外,這是多次 (f1 - f2) / f1 跟平均值:

1000000: 944.7488403320 0.0009447498
100000: 85.7057800293 0.0008570664
10000: 9.4323215485 0.0009433264
1000: 0.9615601301 0.0009625227


1/1000 以下的相對誤差,看起還不賴呀。以後應該會用得著 XD

2006年3月13日 星期一

惡搞 DISPLAY (for screen)

我工作時通常會 ssh 連回宿舍的電腦的 screen。有時候,例如收信(我用 mutt)收到有附圖檔時,我都得先另存下來再 scp/firefox 去開來看 。因為有 screen 的關係,所以就算用 ssh -X 也沒辦法開。不過當然也可以再開個 terminal 連一個新的 ssh -X。

於是想來惡搞一下,這樣就可以輕鬆地按 enter 開 mutt 的圖檔了 :p

(screen 裡面舊的窗當然還是不能用)

--

在下列檔案加入..

.xinitrc:

echo $DISPLAY > /tmp/display
chmod 600 /tmp/display

.bash_profile:

if [ "$DISPLAY" ]; then
echo $DISPLAY > /tmp/display
chmod 600 /tmp/display
else
rm -f /tmp/display
fi

.bashrc:

if [ "$PS1" ]; then
if [ -e /tmp/display ] && [ "$TERM" = "screen" ]; then
export DISPLAY=`cat /tmp/display`
fi
fi

2005年8月8日 星期一

Gallery bug 又一枚

[lang_zh]
我的 Gallery(我目前是用 1.5)在 ML_mode = 2(偵測 browser 的 Accept-Language 做 i18n),跑他的 locale = zh_TW.utf8、並 alias zh_TW 成 zh_TW.utf8 時,會發現網頁是 UTF-8,但是 HTTP header 的 charset 卻是 Big5。修了一下這個問題,patch 在這兒,不過我不確定這是不是正解。這是完整的 bug report。
[/lang_zh]

[lang_en]
My gallery (version 1.5) is running in ML_mode = 2 (which is to detect browser's Accept-Language for i18n), with it's locale = zh_TW.utf8 and zh_TW aliased to zh_TW.utf8. But when visit the page, the content will correctly be UTF-8, whereas the ``charset'' of the HTTP header is Big5. This is my patch, but I'm not sure it's the correct solution. This is the full bug report.
[/lang_en]

2005年6月9日 星期四

[lang_zh]感覺很差[/lang_zh][lang_en]Hates...[/lang_en]

[lang_zh]昨天發現有個簡單的 case 能讓 g++ 3.3 link error,但 3.4 之後會正常。[/lang_zh]
[lang_en]I found that an easy/small program can make g++ 3.3 unhappy, but 3.4 (and after) feels good.[/lang_en]


#include

int main(void)
{
std::basic_string ustr;
ustr.append(ustr);
return 0;
}


[lang_zh]
不過 report 上去之後,才知道原來 GCC 這麼快就把 3.3 close 掉了。

不過讓我感覺很差的是,當我試圖把 gcc-3.3, g++-3.3 remove 時,發現還不少東西 depends on 他們。系統上得存在這種 bug 感覺很差 orz
[/lang_zh]

[lang_en]
But after the bug report, they tell me 3.3 branch has been closed.

But why I feel really bad is when I tried to remove gcc-3.3 and g++3.3 from my box, I found the many things depend on them. It's really sad that I have to let this bug living in my box :(
[/lang_en]

2005年5月18日 星期三

FTP to SMTP

嘗試在自己的機器上 telnet port 21 (proftpd),然後 PORT xxx,xxx,xxx,xxx,0,25,GET mail_with_smtp.txt。結果 PORT 失敗,看 source 發現他說 PORT 六個參數都不能為零 Q_Q 惡搞失敗 orz

2005年4月24日 星期日

FreeBSD ports in Debian

我一直滿喜歡 FreeBSD 的 ports 的,但是比較習慣 Linux 的 kernel。至於 Gentoo 嘛,python-base 玩起來實在很慢,雖然有一些可以加速的 solution,但是我覺得還是滿慢的。所以我試著在 Debian 上玩 FreeBSD 的 ports。

首先,當然是先裝一下 cvsup (Debian 的 pool 就有了)。因為有些工具 FreeBSD 跟 Linux 不相容的關係,還得裝一下 freebsd5-buildutils。

然後找台 FreeBSD 把他的 /usr/share/examples/cvsup/standard-supfile 偷過來。裡面有些設定得改一下,例如像這樣:

*default host=freebsd.csie.ntu.edu.tw
*default base=/home/victor/usr/var/db
*default prefix=/home/victor/usr


檔名如果取成 ports-supfile 的話,就執行

cvsup -g -Z -L 2 ports-supfile


把 ports 拉回來。

另外,freebsd5-buildutils 的 /usr/share/freebsd5-buildutils/ports/bsd.port.mk 是沒辦法直接用的(version 5.3+2-2)。剛才把這個 bug report 上去了(URL),不知道他會不會理我 XD 如果不行的話,可以拿這個 patch 去用。裡面應該還有其他東西要改啦,不過這樣子已經夠 make 不少東西了。

由於 FreeBSD ports 本來就是設計給 FreeBSD 用的(?),所以有些參數得從 /etc/make.conf override 掉。例如:

ARCH=i686
OSVERSION=502123
PKGINSTALLVER=0

GNU_CONFIGURE=1
CONFIGURE_MAX_CMD_LEN!=/usr/bin/getconf ARG_MAX

FETCH_CMD=/usr/bin/wget

# override default SH=sh , 避免 configure 產生錯的 libtool
SH=/bin/sh

PREFIX=/home/victor/usr
PORTSDIR=/home/victor
PORT_DBDIR=$(PREFIX)/var/db/ports
PKG_DBDIR=$(PREFEX)/var/db/pkg

NO_DEPENDS=1
WITH_GLIB=2


最後就是真的 make install 啦。由於 make 版本不同的關係,必須用 freebsd5-buildutils 裡提供的 freebsd-make 來裝(pmake 是 NetBSD make)。如果沒意外的話,就可以 make 啦:

freebsd-make WITH_OPENSSL_BASE=1


至於 make install 的話,因為我懶得去追 sed(1) regular expression 格式有些不一樣的問題,所以沒去修。我在 bug report 裡面建議他生個 freebsd-sed 出來。

結論是,為什麼我要做這種事呢 XD 還是用之前寫的 debpatch 比較實在 XD 缺點就是 patch 們得自己 maintain 了。

2005年4月9日 星期六

makecontext(3)

竟然有這種東西 orz

#include

void makecontext(ucontext_t *ucp, void *func(), int argc, ...);
int swapcontext (ucontext_t *oucp, ucontext_t *ucp);

2005年4月3日 星期日

TIME_WAIT state

[lang_zh]
在寫計網作業時,發現只要有 client 連進來,在 httpd 砍掉之後,沒辦法馬上再 bind 同一個 port。netstat 看到了 TIME_WAIT。

Active close 一個 connection 時,必須在 TIME_WAIT state 等待 2 x MSL (/maximum segment lifetime/) 的時間。RFC 1122 的建議值是 120 秒。但是 Linux 的實作上 follow BSD,把 MSL 設為 30 秒,net/ipv4/tcp_minisocks.c 裡面有這段註解:
[/lang_zh]

[lang_en]
When I wrote my Computer Network's homework, I found that binding to the same port will be failed after a client comes in and stop the httpd. I see TIME_WAIT state when execute netstat.

One should wait in TIME_WAIT state for 2 x MSL (/maximum segment lifetime/) after close one connection. The suggestion time interval in RFC 1122 is 120 seconds. But the implementation of Linux follows BSD, which set MSL to 30 seconds. There's a comment in net/ipv4/tcp_minisocks.c:
[/lang_en]


* [ BTW Linux. following BSD, violates this requirement waiting
* only for 60sec, we should wait at least for 240 secs.
* Well, 240 consumes too much of resources 8)
* ]



[lang_zh]
試了一下時間,真的是一分鐘 Q_Q 本來是在做測試,懶得把 port 寫在參數裡面。看來得辛苦一點點啦 XD

BTW, Unix Network Programming 真是好書呀!!

Update:
用 setsockopt 打開 SO_REUSEADDR 可以解決這個問題
[/lang_zh]

[lang_en]
I observed the time, and it really about 1 minute Q_Q So I should add a port to the argument :/

BTW, Unix Network Programming is really a great book!

Update:
Use setsockopt to enable SO_REUSEADDR will solve this problem.
[/lang_en]

Live Bookmark based on RSS

今天下午想到一個 idea,實作了出來。

很多人有要同時 maintain 多份 Bookmark/Favoriate 的問題,所以我在想是不是能將 RSS feed 餵給 Firefox 的 Live Bookmark,來解決這個問題。因為 Firefox 的 Live Bookmark 跟一般的 bookmark 放在一起,所以能用這種方式產生 bookmark 的效果。當然其他瀏覽器就不一定能用啦,privacy 的問題也先不理他 :P

screenshot


source code (bookmark-*.tar.gz)

2005年3月11日 星期五

Spork::TKSlide


Spork::TKSlide 好像壞一陣子,我這兩天把他修好了,只為了下禮拜要報告 paper orz。
剩下的問題是 Spork 本身的 bug Q_Q





寫了封信直接找 Ingy,希望能得到正面的回應 :)

2004年12月28日 星期二

好用的 ar

[lang_zh]
原來 ar(1) 這麼好用!
剛才抓了 ATI radeon for linux 的 driver,
先用 alien 轉成 deb 之後,
要裝時才發現 dependency 出了一點問題。
有某一個檔案在 xlibmesa-gl 裡面已經有了 @_@
於是想到之前 kane 說過的 ar。


ar x XXX.deb 可以解開這個 archive,
並得到幾個檔案 (以我這邊的例子是 control.tar.gz data.tar.gz debian-binary)。
然後把 control.tar.gz 裡面的 control 加一下 Replaces、
包回去 control.tar.gz。
再來,
ar r XXX.deb control.tar.gz !!
可以把 XXX.deb 裡面的 control.tar.gz replace 掉!
再來就可以很高興地 dpkg -i XXX.deb 了 :D

當然還可以做其他像是..
delete, append 之類的、
還有 move, print 等等的,
不錯用 :p
[/lang_zh]

[lang_en]
Hey, ar(1) is such a useful stuff! I downloaded ATI radeon's driver for Linux, and use alien to convert it to deb. But something wrong about dependency happened when I try to install it. Some file had already been there in xlibmesa-gl @_@ Then I think of ar, what kane has mentioned before.

ar x XXX.deb will help you extract this archive, and you'll get several files (control.tar.gz, data.tar.gz, debian-binary in my case). What I did next is to add a /Replaces/ to the /control/ inside control.tar.gz and put it back.

The last step is ar r XXX.deb control.tar.gz !! It'll replace control.tar.gz inside XXX.deb with the given one! Finally, I can dpkg -i XXX.deb happily :)

Of course there are something useful such as delete, append, move, and print. They're helpful :)
[/lang_en]