2011年5月31日 星期二

[記事] 2011.05.30

IMAG0135

總算有一個家該有的(零亂的)樣子...

2011年5月26日 星期四

[記事] 2011.05.25

73500003

實在不該對一個有23雙鞋的蜈蚣精慫恿 : 「你穿起來好好看,都買吧」,然後兩雙鞋就吃掉我整季的治裝費,只是看著回家你一路嘴笑眉笑的,算了,誰叫你今天最大,治裝...就晚點吧....

Dear 蜈蚣精, Happy Birthday.

2011年5月24日 星期二

[記遊] 尼泊爾 - Never End Peace And Love (1)

1299570416817


[記事] UMT (TWD97TM2) 轉 WGS84

public double[] TWD97TM2toWGS84(double x, double y) {
 // Ref1 : http://www.uwgb.edu/dutchs/UsefulData/UTMFormulas.htm
 // Ref2 : http://blog.ez2learn.com/2009/08/15/lat-lon-to-twd97/
 // 修正 Ref2 中lng回傳值 toDegree 設錯地方的Bug

 double dx = 250000;
 double dy = 0;
 double lon0 = 121;
 double k0 = 0.9999;
 double a =  6378137.0;
 double b = 6356752.314245;
 double e = Math.sqrt((1-(b*b)/(a*a)));

 x -= dx;
 y -= dy;

 // Calculate the Meridional Arc
 double M = y/k0;

 // Calculate Footprint Latitude
 double mu = M/(a*(1.0 - Math.pow(e, 2)/4.0 - 3*Math.pow(e, 4)/64.0 - 5*Math.pow(e, 6)/256.0));
 double e1 = (1.0 - Math.pow((1.0 - Math.pow(e, 2)), 0.5)) / (1.0 + Math.pow((1.0 - Math.pow(e, 2)), 0.5));

 double J1 = (3*e1/2 - 27*Math.pow(e1, 3)/32.0);
 double J2 = (21*Math.pow(e1, 2)/16 - 55*Math.pow(e1, 4)/32.0);
 double J3 = (151*Math.pow(e1, 3)/96.0);
 double J4 = (1097*Math.pow(e1, 4)/512.0);

 double fp = mu + J1*Math.sin(2*mu) + J2*Math.sin(4*mu) + J3*Math.sin(6*mu) + J4*Math.sin(8*mu);

 // Calculate Latitude and Longitude

 double e2 = Math.pow((e*a/b), 2);
 double C1 = Math.pow(e2*Math.cos(fp), 2);
 double T1 = Math.pow(Math.tan(fp), 2);
 double R1 = a*(1-Math.pow(e, 2))/Math.pow((1-Math.pow(e, 2)*Math.pow(Math.sin(fp), 2)), (3.0/2.0));
 double N1 = a/Math.pow((1-Math.pow(e, 2)*Math.pow(Math.sin(fp), 2)), 0.5);

 double D = x/(N1*k0);
 //double drad = Math.PI/180.0;

 // lat
 double Q1 = N1*Math.tan(fp)/R1;
 double Q2 = (Math.pow(D, 2)/2.0);
 double Q3 = (5 + 3*T1 + 10*C1 - 4*Math.pow(C1, 2) - 9*e2)*Math.pow(D, 4)/24.0;
 double Q4 = (61 + 90*T1 + 298*C1 + 45*Math.pow(T1, 2) - 3*Math.pow(C1, 2) - 252*e2)*Math.pow(D, 6)/720.0;
 double lat = Math.toDegrees(fp - Q1*(Q2 - Q3 + Q4));

 // long
 double Q5 = D;
 double Q6 = (1 + 2*T1 + C1)*Math.pow(D, 3)/6.0;
 double Q7 = (5 - 2*C1 + 28*T1 - 3*Math.pow(C1, 2) + 8*Math.pow(e2,2) + 24*Math.pow(T1, 2))*Math.pow(D, 5)/120.0;

 double lon = lon0 + Math.toDegrees((Q5 - Q6 + Q7)/Math.cos(fp));

 return new double[] {lat, lon};
 }

p.s example

double[] x = TWD97TM2toWGS84(300795.859, 2781073.746);
double[] x2 = WGS84toTWD97TM2( x[0], x[1]);
System.out.println(x[0] + ", " + x[1]);
System.out.println(x2[0] + ", " + x2[1]);

output
25.1372420521456, 121.5037851750446
300795.8619411328, 2781073.7458224166


p.s2 UNIT
UMT: meter
WGS84: degree

[記事] WGS84 轉 UMT (TWD97TM2)

 public double[] WGS84toTWD97TM2(double lat, double lon){
 // Ref1 : http://www.uwgb.edu/dutchs/UsefulData/UTMFormulas.htm
 // Ref2 : http://blog.ez2learn.com/2009/08/15/lat-lon-to-twd97/

 // convert from degrees to radians
 lat = Math.toRadians(lat);
 lon = Math.toRadians(lon);

 double a =  6378137.0;
 double b = 6356752.314245;
 double long0 = Math.toRadians(121);
 double k0 = 0.9999;
 double dx = 250000;

 double e = Math.sqrt(1- Math.pow(b, 2)/Math.pow(a,2));

 double e2 = Math.pow(e,2)/(1- Math.pow(e,2));

 double n = (a-b) / (a+b);

 double n2 = n*n;
 double n3 = n*n*n;
 double n4 = n*n*n*n;
 double n5 = n*n*n*n*n;

 double nu = a / Math.sqrt(1- Math.pow(e,2) * Math.pow(Math.sin(lat),2));

 double p = lon - long0;

 double A = a * (1 - n + (5/4.0)*(n2-n3) + (81/64.0)*(n4 - n5));
 double B = (3*a*n/2.0)*(1 - n + (7/8.0)*(n2 -n3) + (55/64.0)*(n4 - n5));
 double C = (15*a*n2/16.0)*(1 - n + (3/4.0)*(n2 - n3));
 double D = (35*a*n3/48.0)*(1 - n + (11/16.0)*(n2 - n3));
 double E = (315*a*n4/51.0)*(1-n);
 
 double S = A*lat - B*Math.sin(2*lat) + C*Math.sin(4*lat) - D*Math.sin(6*lat) + E*Math.sin(8*lat);

 double K1 = S*k0;
 double K2 = k0*nu*Math.sin(2*lat)/4.0;
 double K3 = (k0*nu*Math.sin(lat)*(Math.pow(Math.cos(lat),3)/24.0)) * (5 - Math.pow(Math.tan(lat), 2) + 9*e2*Math.pow(Math.cos(lat),2)) + 4*Math.pow(e2,2)*Math.pow(Math.cos(lat), 4);
 double y = K1+K2*Math.pow(p,2) + K3*Math.pow(p, 4);

 double K4 = k0*nu*Math.cos(lat);
 double K5 = (k0*nu*Math.pow(Math.cos(lat), 3)/6.0) * (1-Math.pow(Math.tan(lat),2) + e2*Math.pow(Math.cos(lat), 2));

 double x = K4*p + K5*Math.pow(p, 3) + dx;

 return new double[] {x,y};
 }

2011年5月14日 星期六

[記事[ 2011.05.12

阿彌陀佛
Ref: http://mrjamie.cc/2011/05/02/programming-top-10/

Top 10 Things Ten Years of Professional Software Development Has Taught Me

  1. 物件導向比你想像中的還難,很多
    每個剛畢業的都滿口 OO,喵的 !

  2. 程式設計師最重要的技能:溝通
    這難度大概跟期望我家的喵會說話一樣高

  3. 你必須要學會說「不」
    如果不怕被討厭的話

  4. 如果所有的事項都一樣重要,那意思是它們都不重要 — 無論如何必須把先後順序排出來,千萬別把事情複雜化
    不但要把事情複雜化,太無聊的話還要製造人家沒辦法解決的問題

  5. 深入問題的核心,但是不要被困住了
    永遠從問題的表面漂到另一個問題的表面

  6. 非常清楚的了解其他人在做的事情,無論是行銷、設計、客服
    太了解了,了解到都能放著程式不寫來行銷、設計、客服!

  7. 你的同事就是你最好的老師  (你該試試 Pair Programming)
    謝謝Garlic (無誤)!

  8. 無論如何最後的產品必須是好用的
    對老闆昇遷沒幫助 ? 零分 !!

  9. 這世界上總會有一些混蛋
    True! 但 ! 自古文人相輕,對,所以你永遠是別人眼中的混蛋 !
Top 10 Signs Your Software Project is Doomed

  1. 第一個版本就想做太多功能
    不包個山包個海怎麼把專案Deadline拉到千秋萬歲 ?

  2. 採用太新的技術平台
    虛擬化、雲端、分散式計算、還有什麼少了...hmm..

  3. 「複雜的問題,需要複雜的解法…」
    不搞個狗兒生病不能自己檢查的演算法怎麼對得起抬青椒這塊招牌

  4. 團隊人手不足
    人很多,都在做不同的事或..用嘴在做事

  5. 成員開始隱藏進度落後的事實和原因 (Schedule Chicken)
    大家捏造人頭投報名表,大家領獎金,報名數不足 ? 都拿了錢大家都別追究了  !?

  6. 不斷更改、增加的需求 (Scope Creep)
    誰不知道Requirement 的世界裡唯一不變的就是變 !

  7. 不知道客戶在哪裡
    至少有一個呀,不是負責的人,就是老闆  !

  8. 2.0 症候群 — 後繼版本非要更大、更強、更美 (Second System Syndrome)
    No comment!

  9. 與公司裡面另一個很有份量的產品競爭 (這在創業團隊應該不可能發生)
    誰有份量  ? 是我才好唄,你不要來跟我競爭  = = !

  10. 根本從一開始就選了一個你無法解決的大問題
    嘴砲就好了,誰在跟你解決問題 ? 製造下一個”需要人"來解決的問題才卡位才是王道!!

2011年5月4日 星期三

[記事] PostgreSQL/PostGIS fast installation

2011年5月3日 星期二

[記食] 羊肚蕈燉飯

DSC_5849

2011年5月2日 星期一

[記遊] 2011 東勢林場

DSC_5884_3