2011年10月13日 星期四

Dennis Ritchie, Father of C and Co-Developer of Unix, Dies

POST: http://www.wired.com/wiredenterprise/2011/10/dennis-ritchie/

My first learned programming language is C language.

My first C language program:

//"@begin_of_source_code"
/*   @JUDGE_ID:   7382YR   100   C++  */

#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <stdio.h>

/**** <<<<<<<<<<<<<< The 3n+1 problem >>>>>>>>>>>>>> ****
 * Purpose: see follows sub-function description        *
 ********************************************************/

unsigned long _max(unsigned long p, unsigned long q);
unsigned long lenght(unsigned long n, unsigned long cycle_lenght);
void swap(unsigned long *a, unsigned long *b);

int main(void)
{

        unsigned long i, j; // input - the maximum cycle lenght of i to j

#ifndef ONLINE_JUDGE
        close (0); open ("myprog.in", O_RDONLY);
        close (1); open ("myprog.out", O_WRONLY | O_CREAT, 0600);
#endif

        scanf("%d%d", &i, &j);

        if (i > j) { swap(i, j); } // check if i <= j

        printf("%d %d %d\n", i, j, _max(i, j));

        return (0);
}

/*******************************************************
 * _max -- to get maximum cycle lenght between p and q *
 *    p -- lower bound                                 *
 *    q -- upper bound                                 *
 *                                                     *
 * Return                                              *
 *  max -- asked                                       *
 *******************************************************/
unsigned long _max(unsigned long p, unsigned long q)
{
        unsigned long max = 1; // maximum cycle lenght. start with 1.

        for (unsigned long ctr = p; ctr < q+1; ctr++) // ctr - counter.
        {
                if(lenght(ctr,0) > max)
                {
                        max = lenght(ctr,0);
                }
        }
        return max;
}

/*******************************************************
 * lenght -- to get the cycle lenght of a number n     *
 *                                                     *
 *      n -- that number                               *
 *   temp -- to store current lenght (for recusion)    *
 *                                                     *
 * Return                                              *
 *   temp. if n == 1, or continue                      *
 *******************************************************/
unsigned long lenght(unsigned long n, unsigned long temp)
{
        temp++;
        if (n == 1)
                return temp;
        else
        {
                if (n % 2 == 0)
                        n = n / 2;
                else
                        n = 3 * n + 1;

                return lenght(n, temp);
        }
}

void swap(unsigned long *a, unsigned long *b)
{
        *a = *a + *b;
        *b = *a - *b;
        *a = *a - *b;
}
//"@end_of_source_code"
Really ugly.

The Biggest Thing Amazon Got Right: Platforms

[Quote from Steve Yegge]

Jeff Bezos's Big Mandate went something along these lines:
  1. All teams will henceforth expose their data and functionality through service interfaces.
  2. Teams must communicate with each other through these interfaces.
  3. There will be no other form of interprocess communication allowed: no direct linking, no direct reads of another team's data store, no shared-memory model, no back-doors whatsoever. The only communication allowed is via service interface calls over the network.
  4. It doesn't matter what technology they use. HTTP, Corba, Pubsub, custom protocols -- doesn't matter. Bezos doesn't care.
  5. All service interfaces, without exception, must be designed from the ground up to be externalizable. That is to say, the team must plan and design to be able to expose the interface to developers in the outside world. No exceptions.
  6. Anyone who doesn't do this will be fired.
It's the right thing because SOA-driven design enables Platforms.

2011年10月12日 星期三

「經濟殺手的告白3」讀後感

John Perkins 的成名作是「經濟殺手的告白」,裡面詳述經濟殺手的手法:讓受害者接下永遠還不了的貸款,將國家資產民營化,將破壞脆弱環境合法化,最後將美國的企業覬覦的資源低價賣給這些企業。

「經濟殺手的告白3」談的是現今處境,我們是如何陷入這個絕望之境,接下來何去何從。達賴喇嘛說:
禱告,一如冥想是件好事,但那還不夠。我們得採取行動。真的,我們得實際行動。

那該怎麼行動?最簡單的出發點就是接下消費責任
身為消費者,我們已經習於告訴企業:「給我們最便宜又最好的網球鞋,我們就會對生活悲慘、年輕早逝、留下嗷嗷待哺小孩的血汗工廠工人,睜隻眼閉隻眼。賣給我們便宜的石油,如此一來我們看到河流受汙染、山林與沙漠被破壞的照片時,就會當作沒看到。」
我們可以抵制血汗產品,雖然我的力量有限,但改變得從自己做起,把改變當成習慣,便能擺脫血汗產品的制約。



此外,有人批評 John Perkins 轉型成為作家是為了淡化種種的過往,為自己的過錯贖罪。這種批評十分膚淺。如果 John Perkins 不贖罪,一般人很難識破全球經濟大謊言。其他書籍雖然也有談及類似題材,但寫的不夠深刻,讀者便無法體會經濟崩解的威力,無法對美國嫉惡如仇(笑)。

只要讓讀者有收穫,那怕只是一句話,我根本不管 John Perkins 之前做了哪些齷齪事,如果不做齷齪事,又怎能寫出齷齪的真相?凡事都有一體兩面,不可執著於表象(道德面),最好的方式是兩面一起看。好啦,我承認我很偏激。



補充一下「讓受害者接下永遠還不了的貸款」的例子。根據我的理論,房屋價值約等於250個月租金。此外,台北市公寓房租報酬率約在 1.47% 到 2.46% 之間 (Global Property Guide),也就是說,最近房屋市價約等於600個月租金,真實價值被高估,貸越多,風險也越大,將來有可能還不了的貸款,房子被法拍,什麼都沒了。

我不會接下永遠還不了的貸款。

[Java] Creating a Web Service Client in Eclipse

Step-by-step:
  1. New a Java Project, say WebServiceClientDemo, in Eclipse.
  2. Select WebServiceClientDemo project, right click > New > Other... > Web Services > Web Service Client. Click next. 
  3. Type http://localhost:5566/WebServiceDemo/services/HelloWorld?wsdl in service definition. Click finish. Eclipse will generate several Java classes for us. For example, the code of HelloWorld.java is
    /**
     * HelloWorld.java
     *
     * This file was auto-generated from WSDL
     * by the Apache Axis 1.4 Apr 22, 2006 (06:55:48 PDT) WSDL2Java emitter.
     */
    
    package demo;
    
    public interface HelloWorld extends java.rmi.Remote {
        public java.lang.String greeting(java.lang.String in0) throws java.rmi.RemoteException;
    }
    
  4. New a Java class to call greeting() method - Main.java:
    package demo;
    
    public class Main {
        public static void main(String[] args) {
            try {
                HelloWorldService service = new HelloWorldServiceLocator();
                HelloWorld helloWorld = service.getHelloWorld();
                System.out.println(helloWorld.greeting("Plover"));
            }
            catch (Exception e) {
                e.printStackTrace();
            }
        }
    }
    
  5. Run as Java Application. We should see the following message in Console:
    Hello World! Plover!
    
Enjoy!

紅柴山O形 (哈盆越嶺古道起登) 路線研究

林教授:
首先經由哈盆古道走到哈盆遺址的『登山小屋舊址』,然後循稜探勘紅柴山北轉西北稜。之後接上紅柴山的傳統稜線路,並且循傳統路登頂紅柴山。而後按照週三隊的紀錄循南稜走到1085峰,在轉走1085峰的西稜接上中嶺古道最高點的越嶺鞍部,之後循著中嶺古道走到南勢溪的兩溪匯流口。在匯流口過兩次南勢溪,抵達紅柴山北轉西北稜山腳的廢棄林道 (座標約為 30735 x 273790, TWD67)。

地圖產生器:

路線研究:


參考資料:
  1. http://www.keepon.com.tw/ActiveSite/Article/One.asp?ArticleID=6569 (紅柴山藍天圖集)
  2. http://www.keepon.com.tw/ActiveSite/Article/One.asp?ArticleID=15275 (紅柴山西南稜1085峰和975峰接中嶺古道越嶺鞍部)
  3. http://tw.myblog.yahoo.com/uank1212/article?mid=8061 (崙埤中嶺古道連走哈盆古道出福山)

2011年10月10日 星期一

初級探勘(三)暨地圖複習:東模故山O形「個人心得」

注意:本篇為「個人心得」,非正式紀錄。正式紀錄於登山補給站

時間:2011年10月8-9日 (六、日)

人員:台灣山岳中級山初階訓練營學員六名。教官:龍頭、祺盛、友聖。

預計路線:
  • D1:哈盆越嶺古道入口 → 哈盆越嶺古道 → 避難小屋 → 東模故山東北稜 → 東模故山 C1
  • D2:C1 東模故山 → 循稜經963峰下稜 → 南勢溪 → 哈盆越嶺古道 → 哈盆越嶺古道入口
實際路線:
  • D1:哈盆越嶺古道入口 → 哈盆越嶺古道 → 避難小屋 → 東模故山東北稜 → H940M迫降 C1
  • D2:C1 H940M迫降 → 東模故山 → 循稜經963峰下稜 → 南勢溪 → 哈盆越嶺古道 → 哈盆越嶺古道入口

紀錄:
  • D1 (陰微雨,晚上雨勢稍強)
    • 5:00 台北車站東三門集合。經福山派出所辦理入山手續
    • 6:40 哈盆越嶺古道入口處停車,整裝。路條為選舉旗幟,顏色約有兩種:紅色及淺藍色。
    • 7:04 GO。告示牌被散彈槍打的面目全非,告示牌一定很痛。
    • 7:43 過小溪,小心通過即可。
    • 8:06 小空地休息,此處為波露山登山口。
    • 8:15 GO。
    • 8:37 過波露溪。長筒雨鞋勉強可過。
    • 9:20 東模故山傳統登山口,下切至兩溪 (南勢溪及露門溪) 匯流口左側,渡溪後接963峰北稜尾至963峰,再至東模故山。樹上有藍天隊指示牌 (2011.4.14),D2回程應該不難渡溪?!
    • 9:22 過露門溪。水深及跨下。脫掉雨鞋及褲子,腳穿毛襪充當溯溪鞋,一個接一個慢慢通過露門溪。
    • 9:44 全員通過。整裝。
    • 10:00 GO
    • 10:23 福山植物園、志良久山、哈盆露營地叉,續行哈盆露營地。
    • 10:46 哈盆露營地。取水用午餐。天空開始降微雨。
    • 11:46 GO,準備過溪上東模故山東北稜。
    • 11:54 過淺溪,雨鞋可過。繼行遇大溪,走溪岸尋找合適過溪點,未果。
    • 12:06 退回哈盆露營地。退回哈盆越嶺古道,研究下方溪流有無合適過溪點。
    • 12:13 找到兩條釣徑,祺盛及友聖教官各自下探,龍頭教官繼續退回哈盆越嶺古道,探勘更好的過溪點。
    • 12:26 祺盛教官探得合適過溪點,植披稀疏較易開路到溪邊。溪兩岸水份充足,植物自然長的茂密,若要開路至溪邊,好的選擇是:第一,離岸越近越好。第二,避開茂密的植披。
    • 13:00 過南勢溪。水深及跨下,必須脫去鞋褲過溪。過溪後是廣闊平坦地形。開路往東北稜尾方向前進。
    • 13:33 大樹底下空地。至東北稜尾。探勘上稜路線。硬上一小段路後,龍頭教官找到獵徑,獵徑入口較偏左側,旁有小溪流經過。循獵徑上稜。
    • 14:33 休息。獵徑上發現許多獵踏、獵吊,不久前獵人一定有來過。H645M。
    • 14:38 GO,繼續尋找獵徑上稜。
    • 15:50 開始尋找今日迫降營地。
    • 16:00 H940M 平坦營地 C1。植披為矮小蕨類,稍微清理一下即可容納 4Tx3。開始下小雨。龍頭教官教導學員使用大D扣環拉出Y字型主繩,幫助學員搭外帳避雨。收集溼木頭準備升營火。
    • 17:00 開始雨中生營火。
    • 19:00 幾度嘗試後,終於生出熊熊營火,薪材十分粗重,雨再大也能燒到半夜。生完營火後學員開始用餐,準備睡覺。半夜雨下的不停,環境非常潮溼,不愧有臺灣亞馬遜之稱。
  • D2 (早上微雨轉無雨,下午微雨)
    • 5:00 C1。收拾營地。用早餐。
    • 6:32 GO。繼續上東北稜。出現小箭竹植披。
    • 7:22 ▲東模故山 (H1144M)。山頂只有三條老舊路條,可見東模故山相當冷門。休息拍照。尋找963峰這條稜線的下山路。路跡不清,偶爾發現老舊路條。沿途補上許多路條,並且砍除雜木清理路跡。
    • 9:29 963峰。休息。沿途出現各式各樣舊路條,路跡時有時無,此時路條早已耗盡,只好拼命製造砍痕。
    • 11:34 小空地。休息。南勢溪湍急聲十分清脆,溪的對岸就是志良久山。
    • 12:28 南勢溪。溪流十分湍急。
      教官思考如何過溪。龍頭教官往兩溪匯流口找,祺盛及友聖教官往上游找。上游溪面較寬,約30公尺,較有機會渡溪。

      每位隊員利用雙稱人結做確保,接著利用雙漁人結讓20M繩變長,此為確保繩。把確保繩一端綁在彼岸樹上。另一端交給攻擊手。第一棒攻擊手龍頭教官,入溪後拼命游過對岸,無奈水勢湍急,過不了溪面中線。龍頭教官緊急下達收繩指令,順利將龍頭教官拉回岸上。此時有兩個選擇:繼續往上游找過溪點,或再試一次。

      這時候學員宗智大哥跳出來當攻擊手,據說小時候諳水性,特別是暴漲溪水。準備妥當後,宗智往上游大石頭移動,縱身一跳,強勁水勢將他拖到下游,但高手就是高手,拖到下游之前他早已翻越溪面中線,有驚無險緩緩走到對岸,大家不禁振臂一呼,同時也敬畏大自然的力量。宗智喘口氣後,將確保繩另一端綁在樹上。

      雖已架好確保繩,但激流將確保繩拉成V字形,若人員背包一起渡河,很可能會卡在V字尖點,無法憑自己力量走上岸。教官思考有無更安全的渡河方式。曾思考用另一條繩子綁在渡溪者身上,幫助渡溪者渡溪,但全隊繩子所剩無幾,必須思考替代方案。此時龍頭教官早有錦囊妙計。將彼岸確保繩解開,利用雙漁人結讓確保繩變更長,在確保繩上固定一個大D扣環,接著調整兩岸確保繩固定位置,測試系統。對岸收繩彼岸放繩,大D扣環能從彼岸游到對岸就算成功。確保系統架設成功。

      這套系統可以讓人包分別過溪,若人員卡在溪流快滅頂時,可強力拖拉人員上岸,安全無虞。人包一個接一個渡溪,龍頭教官押隊。龍頭教官將確保繩解開繫在身上,對岸人員解開確保繩,收短繩子,走到上游固定住確保繩,龍頭教官緩緩渡溪,腳步穩健通過中線走到對岸,過程十分順利。
    • 15:00 全員平安通過,心情輕鬆。整裝。
    • 15:15 GO。尋找上岸點。發現舊路條。
    • 15:22 回哈盆越嶺古道,心情又更輕鬆。
    • 15:24 東模故山傳統登山口。
    • 15:35 過露門溪。
    • 16:30 過波露溪。休息30分補充熱量。不用午餐直接下山,大家歸心似箭。
    • 17:00 GO。天色漸漸昏暗,開頭燈準備摸黑。最後一段水泥階上坡有點辛苦。
    • 18:25 哈盆越嶺古道入口。探勘行程圓滿結束。
    • 21:00 霸味薑母鴨。點了薑母鴨一鍋、高麗菜一碟、麻油麵線一盤、蘋果西打一罐,吃的好撐,老闆稱讚我很能吃,大滿足。
心得:最遠的距離是那遼闊的溪面。樂山。敬山。惜山。

2011年10月7日 星期五

[Java] JmsTemplate Quick Start

Preparation
  • Spring Framework 3 (3.0.5.RELEASE)
  • Apache ActiveMQ 5.5.0
  • SLF4J 1.6.2

Prepare ActiveMQ Lib's Logger
To use SLF4J 1.6.2, we copy slf4j-api-1.6.2.jar and jcl-over-slf4j-1.6.2.jar to the directory [activemq_install_dir]/lib/, then delete old slf4j-api-1.5.11.jar and jcl-over-slf4j-1.5.11.jar.


Prepare ActiveMQ
Run [activemq_install_dir]/bin/activemq.bat. To check if ActiveMQ is running, open the URL http://localhost:8161/admin/ in the browser. You can see the welcome page of ActiveMQ.


Quick Start
  1. In Eclipse, new a Java Project.
  2. Add Main.java in demo package:
    package demo;
    
    public class Main {
        public static void main(String[] args) {
            Demo.run();
        }
    }
    
  3. Add Demo.java in demo package:
    package demo;
    
    import javax.jms.JMSException;
    import javax.jms.TextMessage;
    
    import org.springframework.context.ApplicationContext;
    import org.springframework.context.support.ClassPathXmlApplicationContext;
    import org.springframework.jms.core.JmsTemplate;
    
    import org.apache.activemq.command.ActiveMQDestination;
    
    public class Demo {
        public static void run() {
            ApplicationContext context = new ClassPathXmlApplicationContext("demo/beans.xml");
    
            JmsTemplate template = (JmsTemplate) context.getBean("jmsTemplate");
            ActiveMQDestination destination = (ActiveMQDestination) context.getBean("destination");
    
            template.convertAndSend(destination, "Hi!");
    
            Object message = template.receive(destination);
            if (message instanceof TextMessage) {
                try {
                    System.out.println(((TextMessage) message).getText());
                } catch (JMSException e) {
                    System.out.println(e);
                }
            }
        }
    }
    
  4. Add beans.xml in demo package:
    <?xml version="1.0" encoding="UTF-8"?>
    <beans xmlns="http://www.springframework.org/schema/beans"
           xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
           xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">
        <bean id="connectionFactory" class="org.apache.activemq.ActiveMQConnectionFactory">
            <property name="brokerURL">
                <value>tcp://localhost:61616</value>
            </property>
        </bean>
        <bean id="destination" class="org.apache.activemq.command.ActiveMQQueue">
            <constructor-arg value="jmsExample" />
        </bean>
        <bean id="jmsTemplate" class="org.springframework.jms.core.JmsTemplate">
            <property name="connectionFactory" ref="connectionFactory" />
        </bean>
    </beans>
    
  5. Add external JARs:
    • Spring Framework - all JARs (or asm, beans, context, context.support, core, expression, jms, transaction only)
    • ActiveMQ - all JARs in [activemq_install_dir]/lib/ (or activemq-core, geronimo-j2ee-management_1.1_spec-1.0.1, geronimo-jms_1.1_spec-1.1.1, slf4j-api-1.6.2, jcl-over-slf4j-1.6.2 only)
    • SLF4J - slf4j-simple-1.6.2 only
  6. Run: Right click Java Project > Run As > 2 Java Application > Select type: Main - demo.
    120 [main] INFO org.springframework.context.support.ClassPathXmlApplicationContext - Refreshing org.springframework.context.support.ClassPathXmlApplicationContext@14d3343: startup date [Fri Oct 07 16:43:48 CST 2011]; root of context hierarchy
    258 [main] INFO org.springframework.beans.factory.xml.XmlBeanDefinitionReader - Loading XML bean definitions from class path resource [demo/beans.xml]
    879 [main] INFO org.springframework.beans.factory.support.DefaultListableBeanFactory - Pre-instantiating singletons in org.springframework.beans.factory.support.DefaultListableBeanFactory@b61fd1: defining beans [connectionFactory,destination,jmsTemplate]; root of factory hierarchy
    Hi!
    
    We should see the greeting!
Enjoy!