Twitter Backup Script 3
05/18/2010, 14:35 - Open Source
這個版本,可以自動判斷新的 Twittes 而不會全部再 download 一次了。將這次的推數資料和ID放在HTML 的 META tag 中,以方便下次使用。要用的話,要將 USER= 換成自已的 Twitter Screen Name
這個 Script 就可以放到 Cron 中每個月自已備份一次了。


#!/bin/sh
#
USER=Tasuka
DATE=`date +%m%d%y-%H%M`
#FILENAME=/tmp/twitter_backup.$DATE.html
FILENAME=twitter_backup
SUFFIX=html
#
FILE=$FILENAME.$SUFFIX
BACKUP_FILE=$FILENAME.1.$SUFFIX
#
if [ -f $FILE ];then
LAST=`cat $FILE | \
grep "TWITTES" | \
awk -F" " '{print $3}' | \
awk -F"=" '{print $2}' | \
awk -F"\"" '{print $2}' \
`

LASTID=`cat $FILE | \
grep "ID" | \
awk -F" " '{print $3}' | \
awk -F"=" '{print $2}' | \
awk -F"\"" '{print $2}' \
`

mv $FILE $BACKUP_FILE
else
LAST=0
LASTID=0
fi

MAX=`curl "http://api.twitter.com/1/statuses/user_timeline/$USER.xml?page=1&count=20" | \
grep "<statuses_count>" | \
awk -F">" '{print $2}' | \
awk -F"<" '{print $1}' | \
sort -u| \
awk 'BEGIN{ \
i=0; \
j=0 \
} \
{ \
j=$1; \
if (j>i) \
i=j \
}
END { \
print i \
} \
' \
`

MAX_ID=`curl "http://api.twitter.com/1/statuses/user_timeline/$USER.xml?page=1&count=20" | \
grep "<id>" | \
awk -F">" '{print $2}' | \
awk -F"<" '{print $1}' | \
sort -u | \
awk 'BEGIN { \
i=0; \
j=0 \
} \
{ \
j=$1; \
if (j>i) \
i=j \
} \
END { \
print i \
} \
' \
`

if [ $LAST == 0 ];then
if [ $MAX -ge 3200 ];then
COUNTER=3200
else
COUNTER=$MAX
fi

PAGE=$((COUNTER%200))
if [ $PAGE != 0 ];then
PAGE=$((COUNTER/200))
PAGE=$((PAGE+1))
else
PAGE=$((COUNTER/200))
fi

echo "<HTML LANG=UTF8>" > $FILE
echo "<META NAME=\"TWITTES\" CONTENT=\"$MAX\">" >> $FILE
echo "<META NAME=\"ID\" CONTENT=\"$MAX_ID\">" >> $FILE
echo "<HEAD><TITLE>$USER@Twitter Backup Since $DATE</TITLE></HEAD><BODY><H3>" >> $FILE

i=1
while [ $i -le $PAGE ]; do
curl "http://api.twitter.com/1/statuses/user_timeline/$USER.xml?page=$i&count=200" | \
sed -e "/<text>/N;/<\/text>$/s/\n/ /g" -e "/>/s/>/</g" | \
awk -F"<" 'BEGIN{ flag=0 } \
{ \
if($2=="status" && flag==1){ \
flag=0 \
} \
if($2=="created_at" && flag==0){ \
printf "<BR>%s<BR>",$3 \
} \
if($2=="text"){ \
printf "%s<BR>",$3 \
} \
if($2=="user"){ \
flag=1 \
} \
}' | \
sed -e "/+0000/s/+0000//g" >> $FILE
i=$((i+1))
done
echo "</BODY></HTML>" >> $FILE

else
COUNTER=$((MAX-LAST))

if [ $COUNTER != 0 ]; then
PAGE=$((COUNTER%200))

if [ $PAGE != 0 ];then
PAGE=$((COUNTER/200))
PAGE=$((PAGE+1))
else
PAGE=$((COUNTER/200))
fi

echo "<HTML LANG=UTF8>" > $FILE
echo "<META NAME=\"TWITTES\" CONTENT=\"$MAX\">" >> $FILE
echo "<META NAME=\"ID\" CONTENT=\"$MAX_ID\">" >> $FILE
echo "<HEAD><TITLE>$USER@Twitter Backup Since $DATE</TITLE></HEAD><BODY><H3>" >> $FILE

i=1
while [ $i -le $PAGE ]; do
curl "http://api.twitter.com/1/statuses/user_timeline/$USER.xml?
since_id=$LASTID&page=$i&count=200" | \
sed -e "/<text>/N;/<\/text>$/s/\n/ /g" -e "/>/s/>/</g" | \
awk -F"<" 'BEGIN{ flag=0 } \
{ \
if($2=="status" && flag==1){ \
flag=0 \
} \
if($2=="created_at" && flag==0){ \
printf "<BR>%s<BR>",$3 \
} \
if($2=="text"){ \
printf "%s<BR>",$3 \
} \
if($2=="user"){ \
flag=1 \
} \
}' | \
sed -e "/+0000/s/+0000//g" >> $FILE
i=$((i+1))
done

cat $BACKUP_FILE | \
sed -e "/<HTML/d" -e "/META/d" -e "/<HEAD>/d" >> $FILE

fi
fi

if [ $COUNTER == 0 ];then
mv $BACKUP_FILE $FILE
fi


發表回應 發表回應 ( 588預覽 )   |  [ 0 引用 ]   |  permalink   |   ( 3 / 375 )

Twitter Backup Script 2
05/15/2010, 14:45 - Open Source
修改加上日期及在 META 中放上 Twitts 數量,以備後用。

我的 Twitter 備份


#!/bin/sh
#
USER=Tasuka
DATE=`date +%m%d%y`
FILENAME=/tmp/twitter_backup.$DATE.html
#
MAX=`curl "http://api.twitter.com/1/statuses/user_timeline/$USER.xml?page=1&count=20" | \
grep "<statuses_count>" | \
awk -F">" '{print $2}' | \
awk -F"<" '{print $1}' | \
sort | \
awk '{if ($1>NF) NF=$1} END {print NF}'`

if [ $MAX -ge 3200 ];then
MAX=3200
fi

PAGE=$((MAX%200))

if [ $PAGE != 0 ];then
PAGE=$((MAX/200))
PAGE=$((PAGE+1))
else
PAGE=$((MAX/200))
fi

echo "<HTML LANG=UTF8><META NAME=\"TWITTES\" CONTENT=\"$MAX\"> \
<HEAD><TITLE>$USER@Twitter Backup</TITLE></HEAD><BODY><H3>" > \
$FILENAME

i=1
while [ $i -le $PAGE ]; do
curl "http://api.twitter.com/1/statuses/user_timeline/$USER.xml?page=$i&count=200" | \
sed -e "/>/s/>/</g" | \
awk -F"<" 'BEGIN{ flag=0 } \
{ \
if($2=="status" && flag==1){ \
flag=0 \
} \
if($2=="created_at" && flag==0){ \
printf "<BR>%s<BR>",$3 \
} \
if($2=="text"){ \
printf "%s<BR>",$3 \
} \
if($2=="user"){ \
flag=1 \
} \
}' | \
sed -e "/+0000/s/+0000//g" >> $FILENAME
i=$((i+1))
MAX=$((MAX-1))
done

echo "</BODY></HTML>" >> $FILENAME


發表回應 發表回應 ( 818預覽 )   |  [ 0 引用 ]   |  permalink   |   ( 2.8 / 396 )

Twitter Backup Script
05/13/2010, 22:48 - Open Source
上次看了 hao520 在 Twitter 和他的 blog 中談到 Twitter 有可視最後3200推的數量問題,連帶而來的備份的問題。看了還真的有人在作 backup,hao520自已也做了一個 script,不過他是直接從 twitter 的網頁拿資料。一時技癢就也自已作了一個 bash script,是經由 twitter API 而來的。目前顯示出來的資料,沒有編號、也沒有日期,所以還有改善的空間。

以下是備份下來的HTML內容:




再來是程式碼

#!/bin/sh
#
USER=Tasuka
#
MAX=`curl "http://api.twitter.com/1/statuses/user_timeline/$USER.xml?page=1&count=20" \
|grep "<statuses_count>"|awk -F">" '{print $2}' \
|awk -F"<" '{print $1}'|sort| \
awk '{if ($1>NF) NF=$1} END {print NF}'`

if [ $MAX -ge 3200 ];then
MAX=3200
fi

PAGE=$((MAX%200))

if [ $PAGE != 0 ];then
PAGE=$((MAX/200))
PAGE=$((PAGE+1))
else
PAGE=$((MAX/200))
fi

i=1
DATE=`date +%m%d%y-%H%M`

echo "<HTML LANG=UTF8><HEAD><TITLE>$USER Twitter Backup</TITLE> \
</HEAD><BODY><H3>" > /tmp/twitter_backup.$DATE.html
while [ $i -le $PAGE ]; do
curl "http://api.twitter.com/1/statuses/user_timeline/$USER.xml?page=$i&count=200" \
|grep '<text>' | awk -F"<text>" '{print $2}' | \
awk -F"</text>" '{printf "%s<BR>",$1}' >>/tmp/twitter_backup.$DATE.html
i=$((i+1))
MAX=$((MAX-1))
done
echo "</BODY></HTML>" >>/tmp/twitter_backup.$DATE.html

發表回應 發表回應 ( 473預覽 )   |  [ 0 引用 ]   |  permalink   |   ( 3 / 291 )

數字會說話,但你懂了數字要告訴你什麼?
05/10/2010, 16:53 - 生活
很多人都經常會說:數字會說話。但是經常流於只看表象,而看不到數字真正代表的意義。數字就是數字,數字本身簡單說來只有數字。要看出不同,至少要有兩個或兩個以上的數字作比較,才看得出不同。比較方法不外乎加、減、乘、除等運算方式。比如說:考試60分,這件事,一般人直覺會認為考得不好,因為他是拿常用的標準100來和60相比,只得到3/5的分數。但若是再說明有100人參加考試,而得最高分的就是60,這時好像60又是非常棒的數字了,因為是最高分數啊。但如果說100人中有99個都是60的話呢?那60馬上又變得沒什麼了不起了,有99/100的人都一樣拿到這個分數。由上例可知,單單一個數字,沒什麼意義,數字的意義需要附屬的數字,放在一起之後,數字才變得有意思。

不過大多數的人看數字,只是很簡單的和自已心中的數字相比,而得到好、或不好的結論。但這個好或不好經常和事實有一定的距離。比如說警方的效率指標中,有一項破案率。數字高代表比較好,一般人就會根據這個數字的高低而自已得到破案率高,代表治安比較好這個印象。但事實上並不盡然喔!假設台北市某區的單月破案率是99%,而蘭嶼島的單月破案率是0%。光從數字看是台北市優於蘭嶼,而得到蘭嶼治安不好,因為破案率是零。不過大家一定忘了,破案率高,代表犯罪件數可能也高,所以破案率高不代表治安好吧。如台北市一天的犯罪件數是1000件,而破案率99%,就是990件,還有10件沒破;而蘭嶼可能100天發生不到一件案件,而且沒有偵破,所以破案率是0%。若是真的要比起來的話,台北市一百天應會有(1000*100)*(100-99)%=1000件沒破案,比上蘭嶼一百天發生一件案件,同樣沒有破案,哪𥚃的治安好呢?當然人口數不同,若台北市某區的人口數是蘭嶼的十倍、每日進出人數是百倍的話,也還是遠遠高過蘭嶼,這樣的數字相比還是失真,只是利用來說明,不可以單只看數字本身,要連同數字背後的意義一起分析才有意思。

現在很流行民調,經常會看到發表民調如何、如何,所以得到的是某一類的答案。單只因數字而簡單得到答案,又是一種失真。因為調查的樣本數遠低於實際的人口數、調查的範圍是否合理、調查的方式是否合理、調查時的問卷題目是否有暗中誤導、調查的時間,調查當時的態度,都會影響結果。經常發生的是有多方,同時對某問題,作出來的民調,兩方得到的結論,根本南轅北轍,而互相質疑。事實上兩方的數字,可能根本因上面的理由,而有非常大的誤差,和事實相比,都是嚴重失真下得到的結論。

同樣的,一家公司中,經常會對員工個人、或是整個單位作效能評比,甚至於對客戶的反應,也是一樣經常流於失真。例如對員工個人的評比,經常簡化到以工作時間長短,作為基準,時間長的就是比較好。但事實上一個一天工作八小時,但可以準時交出需求的工程師,應該要比一天工作十四小時,一樣準時交出所需求的工程師要好太多了。8:14,當然低的好不是嗎?但是因為只工作八小時的工程師,沒有配合加班,所以直接而簡單的印象就是不好。而在作單位評比時也是一樣,一個單位經常可以準時交付客戶需求的東西,而且沒有發生重大問題,硬是比同樣交付客戶需求的東西,但是到處充滿了問題的要不好,理由很簡單,因為作好是正常的,沒有發生問題,所以單位的能見度低,而經常發生問題而且解決的單位,因為經常出現問題、並快速反應,所以直覺的得到“很努力、並且很有效率,但這些人都忽略了"No news is good news"的真正意思。又例如代工單位因為幫客戶解決問題,而使得客戶可以將付出減少支出。但在高層看來,直覺的看到的數字是,客戶的需求變少,而認為該單位不努力,使得客戶減少支付代工費,這也是只看表面而直接得到的結論。事實上以代工業而言,客戶之所以要用代工,就是要減低支出,而幫客戶達到這個要求,應該是高效率才對。而且經常因為簡單的看數字作決策,而作出錯誤而且不利於客戶的決策,接到客戶的抱怨時,直覺認定是該負責單位有問題,事實上客戶在報怨的,可能是因高層的特意忽視客戶需求而作出的決策,而非關實際工作的單位。不過通常這種高層都不會認為是自已不會看數字、不了解客戶反應、以及自已決策時的故意錯判的錯。而在面對客戶時說的都不是人話而是鬼話了。這樣子生意還做得下去,還真的是見鬼了。

現代人是生活在充滿數字的時代,各種數字除了表面的意義,經常還有其背面潛在的意義,要經過嚴格的分析才有可能得到比較接近真象的結論,若只是經由數字的表象,就得到結論,那何必花錢請這些人位居高層、握有決策?要這麼簡單的看數字的高低或打印象分數,請個小學二年級的已經學過四則運算的小學生來,就可以簡單無誤的指出那個數字高、那個數字低了,不然也可以直接用Excel就可以作出決策了不是嗎?所以說:“數字會說話,但說出來的是人話還是鬼話,是和看的人會不會分析,並看到數字背後的意義有關“。不是簡單到用一句鬼話就可以帶過的。
3 回應 3 回應 ( 1436預覽 )   |  [ 0 引用 ]   |  permalink   |   ( 3 / 455 )

使用BGP連接兩個不直接相連的網路
04/28/2010, 11:53 - Network
使用BGP連接兩個不直接相連的網路
發表回應 發表回應 ( 2120預覽 )   |  [ 0 引用 ]   |  permalink   |   ( 3 / 432 )

換光世代10M/2M
04/23/2010, 22:33 - 今天
今天施工完成,使用的是ZyXel的VDSL2的Modem,有四個Ethernet Port。不過電話線要先經過Modem再至電話機,可以能是為了減少干擾吧。
換了之後由原來的ADSL 2M/256Kbps bridge mode固定一個IP換成PPPoE 8個浮動IP,但這個工作站是在家裡,需再用固定IP,所以再至So-net網頁換成PPPoE 1個固定IP加7個浮動IP。申請都可以在網頁上簡單完成,不過在要作IP反解Domain Name設定時,發現還是被鎖定在原來的ADSL的IP,造成無法自已作IP反解,這時只有求助服務人員了。撥過電話之後,因為是星期五晚上,所以需要到下星期才會解除原先IP的設定。所以現在是DNS正解是由自已的DNS Server和Seednet的Domain Name Server已經設定完成。而反解就只有等到下週一或二了。

設再來就是測速了,若是用So-net提供的測試,就不太準了,而且So-net才用10/20/30/40MB的檔安經由HTTP download,檔案太小了。正好Apple昨天開放了支援iPad的新XCode 3.2.2,所以就由 http://developer.apple.com 拿新的 XCode 3.2.2 for Mac OS with iPad 2.31GB的檔案來試,檔案夠大,應該會準一點吧!

測試如下
開始

中間

看來一直在1.1MB,所以傳輸速度就大約是 1.1MBx8bit=8.8Mbps的下載速度。上傳的話,目前沒有相近速度的Server可以測試,所以不知道,應該也不會太差吧。
每秒8.8Mbps已經和10BaseT的速度一樣了,不過當然和Firewire 400Mbps相比還是差很多啦!
最後將檔案經由Fireware copy至備份硬碟上。

2.31GB的檔案用Firewire傳2分鐘
2.31GBx8x1000)/120=154Mbps
USB2.0的話,我沒有這種設備,反正也不可能快到哪裡去,就算了吧!因為USB的兩個device一定要經由Host才可以交換資料,所以要視Host的處理速度而定。而Firewire Device是可以自已溝通的,不需要Host幫助,速度當然大大的不同了。

PS:在外面,收家中的電子郵件,Server傳輸可達700KB=5.6Mbps,有沒有這麼好啊!
發表回應 發表回應 ( 543預覽 )   |  [ 0 引用 ]   |  permalink   |   ( 3 / 484 )

還我複決權
04/22/2010, 22:55 - 想到的
聽說憲法中有規定,人民有選舉、罷免、創制、複決四項權利,但是好像到目前唯一還要經由民意代表行使的只有複決權。這幾天,立法院又開始大打出手,各說各話,難道我們就只能交給那一百多個立法委員決定一切事情?聽憑政黨協商,內線交易?只可以看著政府將手介到大家的口袋、衣袋、外褲、內褲的掏錢,但卻因為是立法院通過的法案,或政府不交給民意機關監督,而完全沒有辦法,只可以在下一次選舉到來之前,懊悔選錯人?

我要說的是請政府“還我複決權“,政府機關及民意機關通過的法案,需經過公民投票複決之後才可以算是正式通過,反正台灣現在每年選舉場子也不少,不差多一點。如此正好可以完全解決假民意、真黨意,假民主、真金主。 參考一下2008加州公投 http://tinyurl.com/2dv8vlm
發表回應 發表回應 ( 500預覽 )   |  [ 0 引用 ]   |  permalink   |   ( 2.9 / 431 )

QR Code 印章
04/22/2010, 22:46 - Misc
最近都在研究 QR Code 的演算法,想想就去刻印行製作了一個小印,當作藏書印。事實上也很簡單,將圖檔傳給刻印行,說明尺寸及材質,一天就可以拿到了,我作的這顆收我40元啦。要產生圖檔網路上找一下就有了,要解碼的話,可以拿到的就更多了,可以裝在手機、電腦、iPhone、Notebook...。印在紙上,可以解碼沒有問題,只要印泥不要太多,不要用力,就可以了。用什麼顏色的印泥都可以,不過對比色高一點比較好辦認。

原始圖檔


印章掃描



2 回應 2 回應 ( 893預覽 )   |  [ 0 引用 ]   |  permalink   |   ( 3 / 463 )

BCH(15,5) Error Correction for Objective-C
04/13/2010, 22:02 - Open Source
BCH(15,5) class for Objective-C。參考 http://en.wikipedia.org/wiki/BCH_code
這個 class 說起也不算是我寫的,是修改 Masayuki Miyazaki 寫的 QRCode Java 程式中的 BCH_15_5.java 片斷,只是簡單的改成 Objective-C 而已。


//
// BCH_15_5.h
// BCHTest
//
// Created by Tasuka Hsu on 04/13/2010.
// Copyleft 2010 http://Tasuka.IDV.TW.
//

#import <Foundation/Foundation.h>

@interface BCH_15_5 : NSObject {
}
-(unsigned int)encode:(unsigned int)data;
-(unsigned int)decode:(unsigned int)data;
@end



//
// BCH_15_5.m
// BCHTest
//
// Created by Tasuka Hsu on 04/13/2010.
// Copyleft 2010 http://Tasuka.IDV.TW.
//
// Based on Masayuki Miyazaki
// http://sourceforge.jp/projects/reedsolomon/


#import "BCH_15_5.h"
#define TABLE_SIZE 32

@interface BCH_15_5 (Private)
const unsigned int GX=0x137; /* 0000000100110111 */
unsigned int *trueCodes=NULL;

-(void)makeTrueCodes;
-(unsigned int)slowEncode:(unsigned int)data;
-(int)calcDistance:(unsigned int)c1:(unsigned int)c2;
@end

@implementation BCH_15_5

-(id)init
{
if(![super init]){
return nil;
}

if((trueCodes=(unsigned int *)malloc(TABLE_SIZE*sizeof(unsigned int)))==NULL){
return nil;
}

[self makeTrueCodes];
return self;
}

-(void)dealloc
{
if(trueCodes!=NULL){
free(trueCodes);
}

[super dealloc];
}

-(void)makeTrueCodes
{
for(int i=0;i<TABLE_SIZE;i++){
trueCodes=[self slowEncode:i];
}
}

-(unsigned int)slowEncode:(unsigned int)data
{
unsigned int wk=0;
data<<=5;

for(int i=0;i<5;i++){
wk<<=1;
data<<=1;

if(((wk^data)&0x400)!=0){
wk^=GX;
}
}
return(data&0x7c00)|(wk&0x3ff);
}

-(unsigned int)encode:(unsigned int)data
{
return trueCodes[data&0x1f];
}

-(unsigned int)decode:(unsigned int)data
{
data&=0x7fff;

for(int i=0;i<TABLE_SIZE;i++){
unsigned int code=trueCodes;
if([self calcDistance:data:code]<=3){
return code;
}
}
return -1;
}

-(int)calcDistance:(unsigned int)c1:(unsigned int)c2
{
int n=0;
unsigned int wk=c1^c2;

while(wk!=0) {
if((wk&1)!=0){
n++;
}
wk>>=1;
}
return n;
}

@end



#import <Foundation/Foundation.h>
#import "BCH_15_5.h"

int main (int argc, const char * argv[]) {
NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init];

unsigned int i,j,k,c=19;

BCH_15_5 *bche=[[BCH_15_5 alloc] init];
i=[bche encode:c];
k=i;

printf("BCH_15_5 encode %d",c);

printf(" 0b");
for(int j=0;j<15;j++){
printf("%1d",((i<<=1)&0x8000)?1:0);
}
printf("\n");

[bche release];

// Add random noise
srandom(time(NULL));
unsigned int n=random();

switch(n%3){
case 0:
n&=0x000f;
break;
case 1:
n&=0x00f0;
break;
case 2:
n&=0x0f00;
break;
case 3:
n&=0xf000;
break;
default:
break;
}

printf("add noise=0x%x\n",n);
k^=n;

BCH_15_5 *bchd=[[BCH_15_5 alloc] init];
i=[bchd decode:k];

printf("BCH_15_5 decode 0x%x correct 0x%x\n",k,i);
k=i;

printf("0b");
for(j=0;j<15;j++){
printf("%1d",((i<<=1)&0x8000)?1:0);
}
printf("\n");
k&=0xfd00;

i=k;

printf("Code is 0b");
for(j=0;j<5;j++){
printf("%1d",((i<<=1)&0x8000)?1:0);
}

k>>=10;
printf(" %d\n",k);

[bchd release];

[pool drain];
return 0;
}

發表回應 發表回應 ( 659預覽 )   |  [ 0 引用 ]   |  permalink   |   ( 3.1 / 454 )

OS X 10.6.3 update
03/30/2010, 11:02 - Apple
先用 yasu 整理系統,清出了約 3GB 的空間.再作更新!


發表回應 發表回應 ( 697預覽 )   |  [ 0 引用 ]   |  permalink   |   ( 3 / 397 )


<<開始 <前一頁 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 下一頁> 最後>>