2010年2月2日 星期二

令人沮喪的事實?!Firefox的CPU 使用率問題

因為今天在公司用MacBook Pro,原本之前電池都可以撐很久的,但是今天卻只撐了3小時左右。讓我覺得有點納悶...所以剛剛查了一下...發現...Firefox會一直有CPU usage,即使只有一兩個很簡單且沒有flash的page而已...

當然,到Google上去搜尋,也是得到類似的結論...元兇的話,plugins是一大因素,但是我也用safe-mode的方式去啟動Firefox,但是還是會有持續的CPU usage,只是比有啟用plugins來的少一點。

感覺很「冏」啊...Firefox的一大優點就是有豐富的plugins來幫助瀏覽,但是...現在卻也變成CPU使用率的大怪獸...也許會有人覺得:反正只是多耗一點點的CPU usage,現在CPU都那麼powerful,沒差啦...
但是如果是在筆電尚且使用電池的環境,這可就有很大差別了...因為持續不斷的CPU usage會讓系統處於busy的狀態...CPU就無法進入比較省電的模式了,自然電池就會很快用完....

嗯...真是兩難啊....看來如果用電池模式的話,可能不適合使用Firefox吧...使用Safari跟Google Chrome倒是都沒這種問題。

P.S: 除了發現Firefox有這問題,M$的Messenger for Mac也會在沒動作的情況有CPU usage,但是沒有像Firefox那麼嚴重

Update: 後來發現原本以為應該不會有動作的Google搜尋結果頁面,其實似乎也是有javascript在背後慢慢跑?!為何這麼說呢...因為在Safari、Chrome跟Firefox都發現同樣的情況...但是,結論還是沒有變,Firefox在CPU使用上還是偏高。在改用Safari跟Chrome之後,MacBook Pro的溫度明顯降低。

Snow Leopard的Kernel mode的真相

Snow Leopard這次的賣點之一,就是64bit,強調64bit帶來的效率與好處。而Snow Leopard這次的確把大部分的內建軟體都改版為64bit了。

但是,有趣的是kernel的部份居然還是使用32bit,而更有趣的是在32bit的kernel之下,透過「活動監視器」去看,卻是會看到有軟體是以64bit來運作的。相當神奇吧?至少我是這麼認為...當然也許是我認知錯了也說不定啦

如何讓Snow Leopard真正的以64bit運作呢?也很簡單,只要開機過程時,按著6跟4就好。但是這種方式只有在該次開機有效,重開機之後,就會回到32bit了。想要永久的切換的話,可以安裝一個SixtyFourSwitcher,透過它就可以做永久性的切換了,不管是從32->64還是64->32。

切換到64bit有何好處呢?理論上是會效能更好一點啦...但是其實在Snow Leopard上面的話,感覺到不是很明顯(不過我在Ubuntu上倒是有比較明顯的感覺)。也許是目前為了兼具32與64bit共存的情況,所以還沒辦法完全發揮64bit的能力吧。不過可以在不用重新安裝的情況,就切換kernel mode,這也算是一項特點。至少在Windows跟Linux上,都必須重新安裝64bit的版本才行。

MacBook Pro + iPhone 3GS的行動上網

前天因為使用的SEEDNET數位光纖突然大斷線,導致沒辦法上網。後來想到,iPhone有「internet 分享」的功能,剛好又是3G費率吃到飽的方案,所以試了一下...

設定很簡單,只要到iPhone的「設定」->「一般」->「網路」->「internet共享」打開就好。然後它會要你選擇只用USB共享還是USB跟Bluetooth都啟用。如果有USB連接線的話,建議只開USB就好,可以一邊充電一邊上網。開啟之後,將iPhone連接到MacBook Pro,就會在Mac OSX上看到找到新的網路裝置,叫做「iPhone USB」,選擇它作為連線的網路裝置即可。

不過,實際試的時候,卻發現不能work...怎麼設定跟連結就是不能透過USB來連線...但是如果有啟用Bluetooth,則是可以透過Bluetooth來連線,但是速度就會變比較慢。後來詢問Google大神之後,發現...原來如果啟用Snow Leopard的64bits Kernel模式,就沒辦法透過USB的方式連結。所以只好先把kernel模式改回32 bit再重新啟動。果然,就可以順利連線了。

使用心得的話,3G上網其實還是蠻不錯的,雖然速度不及於數位光纖,但是也在可以接受的範圍了。不過訊號穩定性是個問題,因為有時候會有突然變慢的情況。不確定在使用「internet共享」的時候,能不能收發電話,有試過但是發現,有時候會造成網路斷線,但是有時候又不會。

不能在64bit kernel mode下使用USB的internet分享,是唯一美中不足的地方...畢竟Snow Leopard的賣點之一就是64bit~

2010年1月5日 星期二

I love Mac~

09/12/31我拿到了人生中第一台的MacBook Pro,雖然只是13吋中的最低階款,但是還是很令人興奮。

之前我就偶爾會去台中誠品B1的Apple專賣店看看,但是畢竟沒有真的很深入的用過,所以剛拿到的時候,其實有點心慌慌,不知道怎麼用。但是試了一下,慢慢就開始有漸入佳境的感覺了。讓我感到最棒的是multi-touch的觸控板,一開始我也只覺得這觸控板大概只是噱頭,要有外接滑鼠的打算。不過看了設定裡的示範,跟實際操作之後,我反而覺得Windows 7的觸控螢幕的功能是多餘的。真正的好的觸控操作不見得要在觸控螢幕上啊~這讓我對Apple更加佩服了。
在Mac OSX上面安裝程式十分簡單,用safari下載的dmg檔案會自動地掛載為安裝媒體,然後只要把程式的圖示拖曳到Applicaions圖示或是資料夾中就ok;移除的話,也只是把程式拖曳到垃圾桶就好,都十分直覺。Dock的操作也十分簡便,不過點選Dock上的圖示只能把以開啟的程式從最小化還原,而不能最小化,這點有點可惜。而沒有『剪下貼上』功能也是讓人覺得美中不足。Global menu讓一開始接觸的我很混淆,常常會找不到menu。

因為買的是新款的MAcBook Pro,是全鋁合金的,用的是新款強效電池,官方號稱可以撐7小時,實測結果的確是很久。系統在idle的時候的省電機制做的很不錯,今天在辦公室從早開機到下班,將近7~8小時,雖然中間也有不少時間是在idle,但是對於一般筆電來說,也是沒辦法撐這麼久的。而且使用電池的時候,其實幾乎感覺不到有效能下降的感覺。OS是Snow Leopard,有64bit跟32bit的kerenl模式,預設是以32bit kernel啟動,據說是為了相容性問題。但是在開機的時候可以按著6跟4就可以以64bit模式啟動。64bit模式似乎有快那麼一點點,但是其實我感覺沒有很明顯。有工具程式可以幫忙切換,而不用每次開機都要按6跟4,有興趣的人可以google 『SityFourSwitcher』。

整個系統運作的感覺只有一個字可以形容,那就是「順」;它不是讓你覺得好像飛快一樣,但是也絕對不會有卡卡的感覺,就是很平順快速的完成各種工作。它也沒有用啥獨立顯卡,跟7200RPM的HDD或是SDD,但是就是不會覺得卡住的感覺,換做是Windows Vista,可能就已經卡到罵髒話了....XD。只能說,整個硬體與軟體的搭配到了一個絕妙的地步,不是都是頂級的配備,但是最後呈現的就是高水準的表現~NB的外觀也蠻有質感的,果然不愧是NB中的跑車等級。我已經決定了下一台NB也是MacBook Pro了~
P.S:目前用的其實是公司買來要開發iphone應用的

2009年4月29日 星期三

Ubuntu 9.04 問題與處理(1)

2009/4/23, Ubuntu 9.04如期出現...原本想觀望幾天...但是還是忍不住好奇心的裝了...
開裝好的時候,真的對它的改進跟速度很驚豔...但是過了幾天,發現還是有些小問題...在此列出部份目前已經遇到的:
  1. 不正常重開機
    這是目前我碰到過最嚴重的問題,主要發生的原因在於安裝上我自己編譯的kernel之後,一旦reboot,就會發生不能載入nvidia kernel module的問題,必須關機之後在開才行。後來在Ubuntu 正體中文站上看到這篇Ubuntu 9.04 重開機問題,然後經過google查證之後發現果然是因為kexec-tools的問題。
    解決方法:將/etc/default/kexec中的LOAD_KEXEC=true改成false即可
  2. 用GDebi安裝DEB檔時出現錯誤
    一開始其實並沒有這問題,怎麼發生的其實真的也不清楚,目前只知道用GDebi來安裝DEB檔都會出現錯誤訊息而失敗...目前只能透過dpkg來安裝
  3. Cairo-dock顯示不正常
    目前Cairo-dock並沒有真正for 9.04的版本,所以必須使用8.10的repository來安裝,但是安裝完啟動之後,原本的3Dplane的顯示會消失,相關選項也會不見...即使重新執行也一樣
    解決方法:重新載入cairo-dock的theme,然後存檔重啟即可
目前我自己真正遇到的問題大概是這些,比起之前在8.10所遇到的,是少了很多...當然有部份原因是透過使用跟8.10相同的設定就可以解決,所以也就不算是問題了。就整體來看,9.04算是相當不錯的版本,而且又有個大賣點:ext4。ext4的效率真的還不錯,而9.04的開機速度也跟宣稱的差不多。但是比較讓人擔心的是,ext4目前還是有些問題尚未解決...例如data loss跟soft lock,雖然不是常態性的問題,好像也不是那麼容易發生,但是如果發生了,那就真的很「冏」了

P.S:9.04 + 2.6.29 kernel速度似乎更上一層樓~而且即使沒有restricted-modules,對於intel的無線網卡還是可以正確的驅動(之前在8.04的時候好像還不行)

2009年4月14日 星期二

JAX-WS & Apache CXF 二三事(3) - 額外設定與功能

Apache CXF也支援fast infoset,而且只需要少少的設定即可,在service side的spring設定檔中加上:
<cxf:bus>
<cxf:features>
<bean class="org.apache.cxf.feature.FastInfosetFeature"></bean>
</cxf:features>
</cxf:bus>

其他詳細有關CXF bus的設定可以參考:Bus Configuration

若是有需要傳輸大量資料,可以考慮使用MTOM
可以參考:Using MTOM 、Upload big attachment (document) using CXF ( MTOM ) Spring and Tomcat
基本上,就是在service-side與client-side上都設定mtom-enabled=true的property。而service-side上,可以考慮用DataHandler作為傳輸的媒介

JAX-WS & Apache CXF 二三事(2) - Authentication

Apache CXF也有支援WS-Security來為Web service做傳輸加解密與身份認證的工作。設定與程式部份並不難。可以參考WS-Security 與 Apache CXF Tutorial - WS-Security with Spring

首先,必須先確定classpath中有wss4j的jar。然後在原本的spring設定檔中的<jaxws:endpoint>加上以下內容:
<jaxws:inInterceptors>
<bean class="org.apache.cxf.binding.soap.saaj.SAAJInInterceptor" />
<bean class="org.apache.cxf.ws.security.wss4j.WSS4JInInterceptor">
<constructor-arg>
<map>
<entry key="action" value="UsernameToken" />

<entry key="passwordType" value="PasswordText" />
<entry key="passwordCallbackClass" value="com.company.auth.service.ServerPasswordCallback" />
</map>
</constructor-arg>
</bean>
</jaxws:inInterceptors>

其中必須注意的是WSS4JInInterceptor的設定。action是設定認證的方式,使用UsernameToken是表示使用username與password的認證方式,這是最簡單也是常用的方式;passwordType是設定密碼型態,使用PasswordText是指明碼password;passwordCallbackClass是指實作密碼驗證的classname,此處亦可以用passwordCallbackRef來代替,而設定值也將變為已經設定好的bean。以上就是在service端必須要的設定。而除此之外,也必須撰寫對應的PasswordCallback class。例如:
import java.io.IOException;
import javax.security.auth.callback.Callback;
import javax.security.auth.callback.CallbackHandler;
import javax.security.auth.callback.UnsupportedCallbackException;
import org.apache.ws.security.WSPasswordCallback;

public class ServerPasswordCallback implements CallbackHandler {

public void handle(Callback[] callbacks) throws IOException, UnsupportedCallbackException {

WSPasswordCallback pc = (WSPasswordCallback) callbacks[0];

if (pc.getIdentifer().equals("joe") {
// set the password on the callback. This will be compared to the
// password which was sent from the client.
pc.setPassword("password");
}
}

}
而client的部份也是使用類似的設定但是是for WSS4JOutInterceptor;而password callback class是必須for client的,因為是要設定傳送給service的username跟password。
在client的部份,如果不是透過spring的方式去取得service,則必須自己手動加入有關WSS4JOutInterceptor的設定。

心得:
  1. 透過WSS4JOutInterceptor跟WSS4JInInterceptor,可以讓CXF支援身份認證的功能。但是這類的身份認證是在每次連線時都會進行,所以如果是需要查詢DB的話,可能會導致執行效率低落
  2. service端使用WSS4JInInterceptor; client使用WSS4JOutInterceptor.
  3. 若是透過JaxWsServerFactoryBean來取得service,則手動設定WSS4JOutInterceptor時,雖然會有設定username的行為,但是client password callback class還是必須做設定identifier的動作,否則會有連線問題
  4. 當passwordType是PasswordText時,service side 必須自己取出密碼並且驗證,若是驗證失敗則必須丟出適當的exception;而若是passwordType為PasswordDigest,則密碼是處理過的,無法透過getPassword取出密碼,此時service side也必須將service端的密碼透過setPassword設定給callback class,然後交由framework去驗證;若是驗證失敗,framework會自動丟出exception