2010年12月26日 星期日

Mac mini 拆殼 + 更換記憶體

關於更換 Mac mini 裝備的事宜,可以參考很多網路上的資料,最好也看一些影片!這整個過程不是痛苦兩字可道盡 XDD 畢竟一台 Mac mini ,可是花了 19990 購買的 :P 心臟真的要大顆一點...


這個由來是因為最近 DDR3 1066 2GB 的記憶體一條才 650 元,所以心一橫就買了兩條,幫自己的 Mac mini 更新啦!在官方的 spec 中,敘述是最大支援到 4GB (兩條RAM),但有一些影片跟文章說明只需更新 EFI 可達到支援 8GB (一條插 4GB),思考了良久,覺得用不到 8GB 這麼多,再加上買兩條 4GB 的記憶體增加花費,故最後只敗了兩條 2GB 的金士頓囉!至於更換硬體設備,有錢的話可以去找蘋果店家,花錢請他們更換囉。這篇純粹個人記錄用,不見得適用於其他人 :P 請留意!


列一下參考資料:



回到主題,在此僅記錄個人的拆機過程,請先多看看其他人的拆機過程,少說看個三篇吧!我是 2010/04 買的 Mac mini ,現在已經算是舊版的,版本應該是 2009 年初版,比 2010 年中的版本還要厚喔。


基本工具


準備工具,我使用一隻水果刀 + 鐵尺,做為開路先鋒!用水果刀從細縫插入(記得刀鋒朝外),硬撐出可以讓鐵尺插入的空間,此後就把水果刀拔掉了。開殼方式類是上述影片 "How to open mac mini..." 裡頭的過程,但不一樣的是我使用寬度短小的鐵尺!所以十分不方便。請小心使用水果刀跟鐵尺,不要以為鐵尺不會傷人,在擠壓過程中,我被鐵尺割到了 :P 所幸只是很小的皮肉傷,也讓我之後移動鐵尺時都會包一張衛生紙。至於插入到真的把整個底盤弄出來,大概花了 15 分鐘吧 XD 一直不斷地"輕輕弄" ,最後被傷到後獸性大發,就比較敢用力!只是我用得是寬度小的鐵尺,必須在一旁移動和扳開,導致 Mac mini 的底部有明顯被磨擦的痕跡。


插入鐵尺+拔掉水果刀
先透過水果刀撐出較大的縫隙,再用鐵尺插入


右邊
終於把右邊都先敲開了,已經可以看到磨損的樣貌!原先想要把一根根"輕輕地"扳開,但搞到最後啥都不管,直接在中間移動嘗試,硬把鐵尺彎大力一點直到整個底盤被弄出來,這真的是經驗論!心臟要大顆啊。只要一邊被撬開後,其他兩邊都會很自然地弄好 XD


底部

左邊

快拆完
等到右、底、左都被撬開後,接著可以把他反過來,從面板那邊慢慢地扳開囉 !


拆完殼
直到最後殼與機子分開了,接著要把機子上方的板子移開,但移開前要先把左邊兩處跟右上方的土金色移開,好像是天線的樣子。左邊兩處就只要慢慢往上移就行了,右上方那個要先去把底部的卡榫輕壓,就會彈跳出來。


天線跟彈簧
左下位置的天線與彈簧,都要保存好


注意有條線被膠帶貼住
左下的天線有被膠帶黏起來,我是有把它輕輕撕開,把天線移開,這樣才方便把機殼上方移掉


底部的樣貌
機殼上方有一顆硬碟,除了剛剛提到的 3 個天線外,此殼還有 4 處的小螺絲要拆,以及與機殼連線的排線喔!等到這些都清光後,再慢慢地把殼子往上移開來,由於底部還有像 PCI 卡的連接方式,所以需要慢慢地往上,這些細節請多看一下影片。


更換完記憶體
終於移開機子上方的部分,可以看到記憶體的擺置位置,我也順手換掉兩條原裝的 SAMSUNG 記憶體啦!


最後再慢慢把東西還原,收工!而成果嘛,如下圖:
兩條記憶體 + 白色屑屑 底部嚴重損傷
兩條被替換的記憶體、Mac mini 的損傷以及一台被更新成 4GB 的 Mac mini 啦!線都接好後,可以先開機檢查(左上角的[蘋果]->[關於這台Mac]->[更多資訊]->查看記憶體是不是顯是 4GB 囉),再把機殼蓋上,畢竟機殼對我這個新手來說真的太難拆了。


買了新螢幕

工作之後,錢花在 3C 上頭越來越不手軟!記得大學時期,第一次打工的錢,就花了 1500 買一張 AGP 8X 的顯示卡,彌補了一下前一年組的主機,當時為了省錢只用了一張 PCI 顯卡撐著,所以賺到錢就買上想到顯卡的升級。


去年底,主機掛了後,我也花了快兩萬元在主機身上, 今年四月,花了快兩萬五買了 Mac mini 跟周邊對應產品(這台可不是年中轟動的標錯價的 Server 啊),幾天前又花了五千多,買了一台 22" LCD 和 2 條 1066 的筆電記憶體。看來,今年稱得上花大錢的年代!3C 這種產品,沒事還是不要去留意,不然就會像我一樣不停敗下去 :p


呼,最近也有一些態度要改變,像是 3C 產品就是用來享受用的,但我總會有那種壞念頭,好比如花錢買了主機,就勢必要給它賺回來,例如大學那張顯卡,正是從事網頁相關的工作內容等。雖然成果也算是多少有賺回來,但這樣的心態反而給自己更多無所謂的壓力感。我想,我該試著多享受一下購物,而不是逼著自己賺錢啦!


忘了一提,這次購物的理由是...因為 Mac mini 轉 D-Sub 時的輸出,在我之前那台 19" LCD 1440x900 上,最多只能選擇 1280x768 的解析度,對於我這種愛看 code 的人,這種高度有點吃力。而 2GB DDR3 1066 的筆電記憶體,其實也是要拿來擴充 Mac mini 啦,思考了很久,最後還是看在最近的低價敗了。


2010年12月24日 星期五

驗證 GTalk 使用明文/加密文傳遞聊天內容

我一直以為 GTalk 是加密傳送聊天訊息的,直到今早一位在火燙公司的學弟,請我跟他用 GTalk 聊天時,意外發現 GTalk 原來不是完全的加密聊天的。


情境敘述:


目前共有三台電腦



  1. 第一台是 Ubuntu 10.04 安裝 Pidgin 2.6.6 版本,上頭標示支援 GTalk SSL/TLS 加密傳輸,使用 A 帳號

  2. 第二台是 Windows XP,安裝 GTalk 官方繁體中文版 1.0.0.105,此版本不提供加密服務,使用 B 帳號

  3. 第三台是 Windows 7,安裝 GTalk 官方英文版 1.0.0.104,此版本提供加密服務,使用 C 帳號


測試結果:



  • 當 A 跟 B 進行聊天時,發現兩者傳遞的內容都是明文的 XML 資料,其中 <body> 內記錄的就是聊天內容,除此之外,當然連帳號資訊都是未加密的

  • 當 A 跟 C 進行聊天時,此時兩端會使用加密傳遞

  • 當 B 跟 C 進行聊天時,此時兩端皆會使用不加密傳遞,結果跟 A 與 B 一樣


因此驗證了一件事,不要以為自己的 IM client 標榜加密,就等於跟人溝通都會加密的!還是會看對方情況來處理,例如 B 跟 C 都已是官方的軟體,只是一個是繁體版,另一個是英文版,但繁體版不加密,導致英文版最後也配合繁體版進行不加密的通訊。


查了一些文章,這篇說的跟我測的差不多:正面全裸的Gtalk 1.0.0.105,慎用!


所謂的加密部分,只能確保 gtalk client 端連到 google server 端的過程,但從 google server 連到對方那端時,不見得會加密(例如對方透過 http 在 GMail 上用)。除此之外,這次測到的一個大問題是:


就算你自己的 gtalk client 可以提供加密連線,但對方不提供時,結果自己連到 google server 這端也就不走加密


呼,還是萬試謹言慎行啊!還有,快去用英文版就好!


最後附上一些圖示:


gtalk 加密
GTalk 使用加密時的封包訊息


gtalk未加密
GTalk不使用加密時的封包,其中 <body> 儲存的就是聊天訊息,此例為 "Hello" 訊息,除此之外連同通訊雙方的帳密資訊也是曝光的,並使用可讀性佳的 XML 描述


2010年12月18日 星期六

Windows 7 常用免費軟體

回老家,順便重灌一下電腦,神清氣爽啦,順便記一下最近常用的免費軟體:



工作類:



Firefox Plugin:



Google Chrome Plugin:



筆記:


XMarks 可以把書籤資料紀錄在 Server 上,該 Server 可以是自己架的,也可以直接用 XMarks 上面的。而多個瀏覽器的好處,我可以把工作上的同步在 Google Chrome 上頭,然後把家裡用的同步在 Firefox 上頭,如此一來也可以分得很乾淨,另一種用法也可以用目錄分辨工作或家用。另外,我在 Firefox 上僅使用書籤工具列,好處是看到不錯的網頁就直接拖拉分頁進去記錄,而書籤工作列上只要目錄分的好,就不會有顯示上的問題,只會有操作上的便利。


2010年12月16日 星期四

Android 開發筆記 - 簡易的 Widget 實作

MyWidgetShow


除了要從選單點選來執行的應用程式外,還有另一種呈現的方式,那就 Widget 模式,也就是在廣告單上常常看到簡介某大廠 Android 手機時,其手機畫面正顯示的天氣資訊,有點像似待機時顯示在背景的資訊。這種程式實作上並沒有特別困難,但是我看了一些文章教學,反而很著重在介面設計,畢竟 Widget 的特色就是要美美的,結果對我這種介面沒經驗的人來說,往往第一步就卡住了,像是要用內建的 draw9patch 去弄圖片等,故在此就先完全不理會,連什麼背景框框都不要,純粹用來筆記實作 Widget 的流程。


實做 Widget 跟一般 project 的設定沒有差太多,但還是要多留意:



  1. 建立專案時,不見得要使用 Activity

  2. 編寫 AndroidManifest.xml 檔案

  3. 新增描述 Widget 的檔案

  4. 設定 Widget 排版

  5. 實作更新 Widget 的物件


建立一個 project


[Eclipse]->[File]->[New]->[Android Project]

Project name: MyWidget
Build Target: Android 2.2
Application name: MyWidget
Package name: com.test.widget
Min SDK Version: 8


留意的是在此不啟用 Create Activity,這並不是必須的選項。啟用 Activity 的好處,可以規劃使用者在新增 Widget 時,可以在過程中可以多加設定動作。在此僅學習建立 Widget 的流程,就不多提了。


MyWidgetStru


設定 AndroidManifest.xml 檔案


新增 <receiver> 等敘述標籤,別於以前的 <activity>。

<receiver android:name=".MyWidget" >
    <intent-filter>
        <action android:name="android.appwidget.action.APPWIDGET_UPDATE" />
    </intent-filter>
    <meta-data android:name="android.appwidget.provider"
        android:resource="@xml/widget" />
</receiver>


在此 reciever 的 name 代表之後會建立的 Class 名稱,也就用更新 Widget 資訊的。而 meta-data 中所描述的 resource 則是下一步要新增 Widget 的描述檔


完整描述:

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.test.widget"
    android:versionCode="1"
    android:versionName="1.0">
    <application android:icon="@drawable/icon" android:label="@string/app_name">
        <receiver android:name=".MyWidget" >
            <intent-filter>
                <action android:name="android.appwidget.action.APPWIDGET_UPDATE" />
            </intent-filter>
            <meta-data android:name="android.appwidget.provider"
                android:resource="@xml/widget" />
        </receiver>

    </application>
    <uses-sdk android:minSdkVersion="8" />
</manifest>


建立 xml/widget.xml 檔案,用以描述 Widget 的資訊


在 res 目錄裡建立新的目錄,名為 xml,接著在 res/xml 目錄裡建立一個檔案,可從 xml 按右鍵->[News]->[Other]->[Android]->[Android XML File],並填寫 File 為 widget.xml 並勾選 AppWidget Provider 的型態,最後就可以按 Finish 結束,接著開啟 xml/widget.xml 檔案進行編輯


<?xml version="1.0" encoding="utf-8"?>
<appwidget-provider xmlns:android="http://schemas.android.com/apk/res/android"
    android:minWidth="294dp"
    android:minHeight="72dp"
    android:updatePeriodMillis="1800000"
    android:initialLayout="@layout/main"

>
</appwidget-provider>


在此 minWidth 和 minHeight 是設定 Widget 顯示的範圍,而 dp 的數值計算可參考官網的教學,在此不多談,而 updatePeriodMillis 代表此 Widget 更新的頻率,1000 代表 1 秒,所以 1800000 代表 30 分鐘更新一次,更新頻率不宜過高,容易使得手機沒電。然而,經測試發現,目前內定的情境,無論把更新頻率弄到多快,最少要等 30 分鐘才會更新一次,解決的方式也不是沒有,在此先不多談。


設定排版部份


在此使用預設的 main.xml 檔案,開啟 main.xml 檔案後,替已存在的 TextView 加上 android:id="@+id/now"、android:gravity="center"、android:textColor="@android:color/black" 和 android:textSize="18sp" ,另外,再把 layout_height 更新為 fill_parent 即可。


<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    >
<TextView  
    android:id="@+id/now"
    android:gravity="center"
    android:textColor="@android:color/black"
    android:textSize="18sp"
    android:layout_width="fill_parent"

    android:layout_height="fill_parent"
    android:text="@string/hello"
    />
</LinearLayout>


實做 Widget 的資訊更新


在 src/com.test.widget 裡,新增一個 Class 名為 MyWidget.java


package com.test.widget;

import java.text.SimpleDateFormat;
import java.util.Date;

import android.appwidget.AppWidgetManager;
import android.appwidget.AppWidgetProvider;
import android.content.Context;
import android.widget.RemoteViews;

public class MyWidget extends AppWidgetProvider {
    @Override
    public void onUpdate(Context context,AppWidgetManager appWidgetManager, int[] appWidgetIds) {
        RemoteViews updateViews = new RemoteViews( context.getPackageName(), R.layout.main);
        updateViews.setTextViewText(R.id.now,  new SimpleDateFormat( "yyyy/MM/dd HH:mm:ss" ).format( new Date() ) );
        appWidgetManager.updateAppWidget(appWidgetIds, updateViews);
    }
}


最後,把程式 Run 起來,起初模擬器上不會顯示任何效果,因為 Widget 是要讓使用者自行設置的,需要透過模擬器鍵盤上的 [Menu]->[Add]->[Widgets] 就可以找到 MyWidget,點選下去才是真的安裝此 Widget 啦,成果就是螢幕上面多了一個時間囉!這也是 MyWidget.java 裡頭寫得東作,僅把 TextView 上的內容更新為時間。另外,若想要把已安裝的 Widget 刪除,僅需用滑鼠按住它,接著 Home 就會變成垃圾桶,拖進去就可以囉。