2013年1月16日 星期三

時間修正


因為系統時間與實際時間不一樣,程式目的為將系統時間校正至真實時間:

已知系統時間的起始點stime0 與對應的真實時間stime1,給定某個系統時間dtime0,程式,將之轉換為真實時間dtime1

應該有更好的方法,但目前就是直接算stime0與dtime0的差距,再加到stime1;即dtime1=stime1+(dtime0-stime0)

原本以為半天可以做完,最後花了整整兩天... 就為了考慮所有狀況..,測試過是沒問題,還是有小部份可以精簡的地方,但是懶的改了.

#include
#include

typedef struct OBSTIME{  
 int yr;
 int mon;
 int day;
 int hr;
 int min;
 int sec;        
}obstime;

void add_time();
void cmptime(obstime *t1,obstime *t2);
int julian_cnt(int yr,int mon,int day);


//Global variable 
obstime stime0={1,1,1,3,0,0};//system start time : dummy
obstime stime1={2012,12,15,14,53,40}; //system start time : true
obstime dtime0; //data time : dummy
obstime dtime1; //data time : ture
int day_lyr[12]={31,29,31,30,31,30,31,31,30,31,30,31}; //leap year day array
int day_cyr[12]={31,28,31,30,31,30,31,31,30,31,30,31}; //common year day array
int del_sec;//delta seconds 
int del_day;//delta days



void add_time(){

 int *day_yr; //ptr to day arry of the year

 cmptime(&stime0,&dtime0); //compute delta time in second & day

 dtime1.sec=stime1.sec+del_sec;  //add seconds
 dtime1.min=stime1.min+(dtime1.sec/60);
 dtime1.sec=dtime1.sec%60; //sec. ok  
 dtime1.hr=stime1.hr+(dtime1.min/60);
 dtime1.min=dtime1.min%60;//min. ok
 dtime1.day=stime1.day+(dtime1.hr/24);
 dtime1.hr=dtime1.hr%24;//hr. ok
 dtime1.day+=del_day; //add days
 dtime1.mon=stime1.mon;
 dtime1.yr=stime1.yr;

 if((stime1.yr%4==0 && stime1.yr%100!=0) || stime1.yr%400==0){ //leap year
   day_yr=day_lyr;
 } 
 else{ //common year
   day_yr=day_cyr;
 } 
 while((dtime1.day-day_yr[dtime1.mon-1])>0){
  dtime1.day=dtime1.day-day_yr[dtime1.mon-1];
  dtime1.mon=dtime1.mon+1;
  if(dtime1.mon==13){
   dtime1.mon=1;                 
   dtime1.yr++;
   if((dtime1.yr%4==0 && dtime1.yr%100!=0) || dtime1.yr%400==0){ //leap year
    day_yr=day_lyr;
   } 
   else{ //common year
    day_yr=day_cyr;
   }
  }
 }

}



void cmptime(obstime *t1,obstime *t2){
 int jday1,jday2;
 int sec1,sec2;
 int yr=t2->yr;
 int lday=366,cday=365;


 jday1=julian_cnt(t1->yr,t1->mon,t1->day);
 jday2=julian_cnt(t2->yr,t2->mon,t2->day);

 while(yr>t1->yr){//over the year or futher..
  yr--;
  if((yr%4==0 && yr%100!=0) || yr%400==0){ //leap year
    jday2=jday2+366;
  } 
  else{ //common year
    jday2=jday2+365;
  }
 }
 sec1=t1->hr*3600+t1->min*60+t1->sec;
 sec2=t2->hr*3600+t2->min*60+t2->sec;
 if(sec2>=sec1){
  del_sec=sec2-sec1;
  del_day=jday2-jday1;
 }
 else{
  del_sec=sec2-sec1+86400; 
  del_day=jday2-jday1-1; 
 }
 //printf("del_day=%d",del_day);
 //system("PAUSE");
 //printf("del_sec=%d",del_sec);
 //system("PAUSE");




int julian_cnt(int yr,int mon,int day){
 int jday=0;
 int *day_yr;
 int i=0;
  
 if((yr%4==0 && yr%100!=0) || yr%400==0){ //leap year
   day_yr=day_lyr;
 } 
 else{ //common year
   day_yr=day_cyr;
 }

 while(i+1 != mon){
  jday=jday+day_yr[i];
  i++;
 }
 jday=jday+day;

 return jday;


2012年11月1日 星期四

比較兩個任意日期的時間差


int cmptime(char *s_time,char *e_time){
 int delta_sec;
 int s_time_array[6],e_time_array[6];//[Y][M][D][h][m][s]
 long long delta_s;
 int delta_m,delta_h,delta_D;
 char str_buf1[5],str_buf2[5];
 int i=0,j=0;

 //retreive data
 while(1){
  str_buf1[i]=*s_time;          
  str_buf2[i]=*e_time;
  s_time++;
  e_time++;
  i++;
  if(((*s_time == '/')&&(*e_time == '/'))||((*s_time == ':')&&(*e_time == ':'))){
   str_buf1[i]='\0'; //string end
   str_buf2[i]='\0';
   s_time_array[j]=atof(str_buf1);
   e_time_array[j]=atof(str_buf2);  
   memset(str_buf1,0,5);//clean buf.
   memset(str_buf2,0,5);
   i=0;
   s_time++;//next char
   j++;
  }
  else if(*s_time !== '\0'){
   str_buf1[i]='\0'; //string end
   str_buf2[i]='\0';
   s_time_array[j]=atof(str_buf1);
   e_time_array[j]=atof(str_buf2);
   memset(str_buf1,0,5);//clean buf.
   memset(str_buf2,0,5);
   break;
  }
 }
 //compare time

  s_time_array[2]=julian_cnt(s_time_array[0],s_time_array[1],s_time_array[2]);//caculate julian days
  e_time_array[2]=julian_cnt(e_time_array[0],e_time_array[1],e_time_array[2]);
 
  while(s_time_array[0] < e_time_array[0]){ //** plus days if over the year**
   if((s_time_array[0]%4==0 && s_time_array[0]%100!=0) || s_time_array[0]%400==0){ //leap year
    e_time_array[2]=e_time_array[2]+366;
   }
   else{
    e_time_array[2]=e_time_array[2]+365;
   }                    
   s_time_array[0]++;
  }
 
  if((e_time_array[5]-s_time_array[5])<0 delta_sec="delta_sec" nbsp="nbsp" p="p">   delta_s=e_time_array[5]-s_time_array[5]+60;
   e_time_array[4]--;
  }
  else{
   delta_s=e_time_array[5]-s_time_array[5];    
  }
  if((e_time_array[4]-s_time_array[4])<0 delta_min="delta_min" nbsp="nbsp" p="p">   delta_m=e_time_array[4]-s_time_array[4]+60;
   e_time_array[3]--;
  }
  else{
   delta_m=e_time_array[4]-s_time_array[4];    
  }
  if((e_time_array[3]-s_time_array[3)<0 delta_hour="delta_hour" nbsp="nbsp" p="p">   delta_h=e_time_array[3]-s_time_array[3]+24;
   e_time_array[2]--;
  }
  else{
   delta_h=e_time_array[3]-s_time_array[3];    
  }
  if((e_time_array[2]-s_time_array[2)<0 error="error" nbsp="nbsp" p="p">    printf("input error");
    exit(0);
  }
  else{
   delta_D=e_time_array[2]-s_time_array[2]; //delta_day
  }
  delta_s=delta_s+60*delta_m+3600*delta_h+86400*delta_D; //finally convert to numbers in sec


 

 return delta_s;
}

int julian_cnt(int *yr,int *mon,int *day){
 int jday=0;
 int year_day[12];
 int i=0;

 if((*yr%4==0 && *yr%100!=0) || *yr%400==0){ //leap year
   day_yr[12]={31 29 31 30 31 30 31 31 30 31 30 31};
 }
 else{ //common year
   day_yr[12]={31 28 31 30 31 30 31 31 30 31 30 31};
 }
 while(i+1 != *mon){
  jday=jday+day_yr[i];
 }
 jday=jday+*day;

 return jday;
}

2012年5月14日 星期一

確信確幸

天熱了 小塊頭 睡睡醒醒 總要人幫他擦擦汗 吹吹風才會再入睡
Q媽也睡了 真的累了 要上班 要擠奶 要哄他 手一直抬不起來 很酸 她說
Q爸醒著 看著他身旁 最愛的兩個人 現在都睡的很熟
這一刻世界變的很小 小的這樣就夠了
也變的好大 大的像一望無際的夜空  無懼四季不停更疊
Q爸 不覺得累 只是感謝   明天是晴天吧  他說

2012年4月30日 星期一

關於獎勵也關於方法


A :對於有明確目標與步驟的工作- 有形的獎勵效果很好 因為將它專注窄化 因此適用於制式化的工作
B: 對於沒有正確答案或是需要用心感受與創造答案的工作 外在獎勵的效果可能是負面的 需要的反而是 自由 與 發自內心的驅動  


學校教育 與 工作文化 將我們轉化成A -我們習慣的思考方式
但生活上 人與人互動  情感表達上  A使我們顯的笨拙


未來的世界 A是必備 而 B是優勢

 



2012年4月16日 星期一

抽離現實反而真實

從海上回來常常心態會開朗許多
所以發覺 每天社會上的事 想法 觀點 或與別人的互動都會一點一滴影響自己
可怕的不是被影響 而是自己並沒有察覺 往往想法就越來越狹隘

在海上 半夜 你面對的是一望無際的黑暗 風平浪靜或怒濤險浪都由不得自己
滿天星斗時 你會感謝這份禮物 面對惡浪時 只有先戰勝自己
你會覺得自已很渺小 孤獨  你會想到你做過的事 你的家人 朋友
最後 會看到更誠實的自己

2012年1月5日 星期四

給小寶

抱著你 看著你 每天  每個凌晨 每次你餓了 生氣了 玩累了 想睡了 
有你加入這個家 把拔很高興  馬麻也是  我們知道你也是很努力的  
生活多了一點辛苦 也多一點甜蜜  未來的日子 有陽光 有時可能會下雨  難免  
但是我們的家  拔麻  會一直陪著你     
你會慢慢長大  我們會漸漸老    你會去追求你的夢想  開啟你自己的故事
現實也許不一定美好 生活也不像童話故事  
記得 你要愛你的家人  對自己有所認知    誠實的做你自己  
有時慢下腳步 體會別人的感受  體會這個世界  ...  
我們愛你

2011年10月30日 星期日

Q寶的感謝名單

採買嬰幼兒用品 實在是不容易的工作
品項越來越多 功能越來越多 開銷也就越來越多
好在有各位媽媽們的贊助與經驗分享  讓兩個菜鳥爸媽受益良多
先代替Q寶來謝謝各位媽咪!!


1.出生到一歲的衣服::立吟媽媽
2.床圍、4件組、經濟實惠嬰兒床的賣家:小秋與建宏
3.吸乳器、衣服、奶瓶:鈺婷媽媽
4.7件組:佩如媽媽
5.背巾、玩具、衣服:晏禎媽媽

2011年8月21日 星期日

Stay Right When You’re Wronged – Just One Thing

Stay Right When You’re Wronged – Just One Thing

2011年8月17日 星期三

Tilt meter

1.tilt meter 所測得的值只有兩個 : x 方向的傾角 , y 方向的傾角 ; x、y方向是相對於儀器本身; 若y是固定於正北,所得的值自然是向東與向北的傾角。


2.結合compass可以知道儀器本身旋轉角度


3. 對使用者而言,要的是實際座標系上儀器向哪傾?傾多少? ;所以我們必須將測量值轉為較直觀的值。


4.定義L( tilt_x(rot), tilt_y (rot)) 代表儀器在空間中的位態,是x 方向傾角tilt_x、y 方向傾角tilt_y的函數 ; 而tilt_x,tilt_y的是z軸順時針旋轉角度rot的函數。 --這點稍微抽象,是以下推導的核心

============================================================


設所儀器顯示的位態為L1(A1(R1),B1(R1))

(i)a,b分別為x,y軸在此平面投影的單位向量,F1(x1,y1,z1) 為平面法向量:

a(cosA1,0,-sinA1 )

b(0,cosB1,-sinB1 )


可得F1(tanA1,tanB1,1)


(ii) 此法向量可以決定儀器的傾角TILT
TILT=tan^-1((tan^2(A1)+tan^2(B1))^1/2)



(iii)真實方位角AZIMUTH
真實法向量F((tanA1*cosR1+tanB1*sinR1),(tanB1*cosR1-tanA1*sinR1))
x=tanA1*cosR1+tanB1*sinR1

y=tanB1*cosR1-tanA1*sinR1

AZIMUTH=tan^-1(x/y)


2011年7月28日 星期四

counting sort

void countingsort(int *array1,int *array2,int maxkey,int num){

int keystart[maxkey+1]; //start position of each key
int start=0;
int i;
int temp;

for(i=0;i<=maxkey;i++){
keystart[i]=0;
}
for(i=0;i<num;i++){ //counting #key
keystart[array1[i]]++;
}
for(i=0;i<=maxkey;i++){ //counting the start position for each key
temp=keystart[i];
keystart[i]=start;
start=start+temp;
}
for(i=0;i<num;i++){ //move each element to the new position according to keystart[]
array2[keystart[array1[i]]++]=array1[i];
}
}

2011年7月25日 星期一

生氣了!!

要在當下接受不好的情緒實在不容易
但可能也只有在接受以後 才有辦法看的比較清楚
尤其是每天必須面對很多的人與資訊 互相影響著彼此
接受 像是一種同理心 同理別人同理自己
看的清楚了 就比較容易放下 然後回到原本 或 更好的自己






2011年7月21日 星期四

賈柏斯的演講

人都有自己內在的最愛
生活中的點點滴滴似乎都是最好的安排

Remembering that you are going to die is the best way I know to avoid the trap of thinking you have something to lose. You are already naked. There is no reason not to follow your heart. - Steve Jobs



2011年6月24日 星期五

給我雙翅膀

活著 每天都會接受到各式各樣的資訊
被影響 感染 衝擊

覺得驚訝 驕傲 失望
資訊越多 改變越快

像是海浪不斷撲來 有時難以承受
需要的不是堅強

稍微放下 只拿需要的 才飛的更遠



2011年5月18日 星期三

當sizeof 運算元為 pointer 時結果的小不同

int main()
{
 int kids[ ]={1,2,3,4,5};
 int *ptr=kids;
 printf("*ptr=%d\n",*ptr);
 printf("sizeof kids=%d\n",sizeof(kids));
 printf("sizeof ptr=%d\n",sizeof(ptr));
 return 0;
}

//though kids->1, sizeof(kids)=sizeof(int)*5
//let ptr=kids

2011年4月29日 星期五

給老婆

每天晚晚下班
你上上網
我看棒球
我澆澆花 你洗洗衣
聊聊今天 說說 笑笑 嘻嘻 罵罵
祈禱 安撫甜蜜的他
睡了

星期六 晚晚起 早餐慢慢吃
黃昏與市場
飯菜香與飽足感

每天 每天 每天
沒有特別 沒有華麗 也不優雅 也有壓力 也有煩惱
但此刻 一切還好 微風吹過剛洗完的衣服 微笑小月 蟲子多了 蛙鳴也多

and you're wonderful tonight ...

2011年3月28日 星期一

新的階段

每個階段都有不同的體驗
最近 對工作 家庭 生活 都有一些體會
累的開心也累的滿足
對於新的階段來臨 充滿期待
期待有點重 但背在身上 才更專注腳下的每一步

2011年1月21日 星期五

關於application framework

http://www.bluewatermedia.com/blog/development/why-use-an-application-framework-for-your-development-project.html

2010年12月14日 星期二

MICobs

同事做的影片, 後面看起來像電影的預告片 ...

2010年12月2日 星期四

還是用cygwin吧~

在windows下開發linux程式 使用cygwin 的移植性會好的多 擷取自官網 "A DLL (cygwin1.dll) which acts as a Linux API emulation layer providing substantial Linux API functionality."
mingw 應是使用gcc來開發 "windows程式" 目的不太一樣
http://zhouxiaofan.wordpress.com/2008/03/24/cygwingcc%E4%B8%8Emingw/ (滿詳細的說明)

試著使用低階io 來複製檔案: open() 使用了 O_CREAT旗標, 分別以 dev c++ 跟 cygwin編譯
產生的檔案雖然內容一樣 但卻權限不同 -- 一個是唯讀檔 r--r--r-- 另一個在windows下是不能讀取的 ;
而加入S_IRUSR ! S_IWUSR 指定權限 用dev c++編譯的結果 則是開放所有權限 rwxrwxrwx
**程式中的( ) 與 ! 要改一下

#include (unistd.h)
#include (fcntl.h)
#include (sys/stat.h)
#include (sys/types.h)
#include (stdlib.h)
#include (stdio.h)

int main(){
int nread;

int fd1;
int fd2;
char *ptrbuf;
unsigned long buflen=500;

fd1=open("file_in",O_RDONLY);
fd2=open("file_out",O_RDWRO_CREAT); //O_EXCL,S_IRUSR!S_IWUSR);
ptrbuf=(char*)malloc(sizeof(char)*buflen);
if(ptrbuf==NULL){
printf("Memory error");
}

while((nread=read(fd1,ptrbuf,buflen))>0)
write(fd2,ptrbuf,nread);

close(fd1);
close(fd2);
free(ptrbuf);
return 0;

}

2010年11月18日 星期四

Qt 4.7.1 open source for windows(mingw)

記錄一下 這幾天安裝Qt遇到的問題
通常是在建立debug linrary 出現錯誤

在安裝Qt 4.7.1時 installer會需要指定一 mingw位置
原本使用 Dec-C++\bin --->編譯過程出現錯誤

使用 最新板的 mingw ---> 還是錯誤
以上也許是版本不合 所以沒多加追朔....
只好的參考http://doc.qt.nokia.com/4.7/compiler-notes.html
"If you don't already have MinGW 4.4 installed, you can download a .zip archive from our ftp site. This archive provides fixes to MinGW and support for missing API, See the _patches directory in the archive for details."
使用它提供的版本 -->但依然出現錯誤

google一下 還是不清楚問題在哪 但應該是跟 存在多個 compiler 有關
因此移除VS 再試----> 還是錯誤 ... (幾乎快放棄了 用IDE好了)
*對於一定要使用VS開發的人 上述網站也有說明

仔細看了一下 建立的過程 發現它的路徑是用 C:\MSDV (原來是"fortran" 也許是報復我太久沒用了....)

移除後再試 ----> 完成

加 入path : C:\ mingw\bin; C:\Qt \4.7.1\bin 到此算完成了

但對 Dev-Cpp 有不好的預感 --->build 果然出現錯誤 [Linker error] undefined reference to `__cpu_features_init' ld returned 1 exit status (應該是跟mingw 衝突) 重新安裝也沒用
還好這問題還算常見 : 將C:\ mingw\bin 新增至其函數庫 再將其至於首位 便可解決