2011年7月9日 星期六

Windows 7 之 KMS 啟用失敗 0xC004C003 (設定為大量授權版)

幫學弟安裝校園版軟體,校園版採用 KMS 大量授權,只是學弟一開始安裝錯作業系統,安裝成非大量授權版本(安裝過程可以看到詢問序號的畫面),雖然可以不輸入序號繼續安裝,但產品內的設定已不適用 KMS 認證了。


再重新準備大量授權版本途中,查了一些網路文章,發現 Windows 7 KMS Client Setup Keys 清單:


Windows 7 Professional		FJ82H-XT6CR-J8D7P-XQJJ2-GPDD4
Windows 7 Professional N MRPKT-YTG23-K7D7T-X2JMM-QY7MG
Windows 7 Professional E W82YF-2Q76Y-63HXB-FGJG9-GF7QX
Windows 7 Enterprise 33PXH-7Y6KF-2VJC9-XBBR8-HVTHH
Windows 7 Enterprise N YDRBP-3D83W-TY26F-D46B2-XCKRJ
Windows 7 Enterprise E C29WB-22CC8-VJ326-GHFJW-H9DH4

並且發現 slmgr 指令可以設定 Product key ,所以就可以更新產品金鑰轉成大量授權版,進而完成大量授權之 KMS 認證機制囉!


此例恰好學弟想從 Windows 7 32-bit 升成 64-bit ,所以有前者的資料可以查閱,在 Windows 7 32-bit 之大量授權版本,其 sources/product.ini 中可以瞧見最後一行的設定:


[BuildInfo]
staged=PROFESSIONAL


而非大量授權的:


[BuildInfo]
staged=HOMEBASIC,HOMEPREMIUM,PROFESSIONAL,ULTIMATE


透過這一丁點資訊,就採用 Client Windows 7 Professional Key 了:


slmgr -ipk FJ82H-XT6CR-J8D7P-XQJJ2-GPDD4


隨即進行 slmgr -ato 驗證,果真就成功啦!


2011年7月7日 星期四

Android 開發筆記 - 使用 Android NDK (Native Development Kit)

之把某個 android app 產品進行反組譯的動作,只是單純地想要驗證該 app 的實作流程,但在 Java 層只看到一些 UI 介面的操作,算是驗證了半個想法,但總覺得缺少什麼,所幸在原本的 apk 檔案內發現了 xxx.so 檔案,透過很基本的 strings 指令可以查看一些敏感字眼,就這樣我找到了鐵證。心中有股莫名踏實感,雖然 xxx.so 檔只能瞧見一些關鍵字,但因為撰寫程式的把 function name 取得很容易猜測功能,所以加加減減就成了一種驗證。


前陣子上過幾個小時的 android 課程,恰好稍微提到 NDK 的部份,此部份主要是設計給遊戲類的使用,例如之前寫 OpenGL ES 時,必須透過 Android Java API 來呼叫,現在則可以直接用 NDK 寫 C 語言達成,除了解決繁瑣的 C to Java 語法,更可以避開 JVM 來提昇效能。除此之外,我覺得 NDK 也是可以用拿來保護關鍵程式碼囉。此筆記就當作簡單的測試 NDK 的用法,在此不提及安裝 Android 開發環境,有興趣可以查看Android & Eclipse 開發環境- 第一次安裝筆記。在此使用 Ubuntu 10.04 64-bit 環境。


首先,從 Android NDK | Android Developers 下載 Android NDK (我在 Ubuntu 所以下載 android-ndk-r5c-linux-x86.tar.bz2) 並挑選一個地方解壓縮(此例為 ~/android-ndk-r5c),除此之外要把 Android SDK 更新至最新版,如果已經安裝好 Android 開發環境,更新方式透過 Eclipse -> [Window]-> [Android SDK and AVD Manager] -> [Installed packages] -> [Update All...]


接著要進行 NDK 環境設置,可查看 android-ndk-r5c/docs/INSTALL.html,可以得知 Android NDK 至少需使用 Android 1.5 系統,而編譯環境至少是 GNU Make 3.8.1,除此之外還需要 Nawk 或 GNU Awk 工具,而常見的 awk 則不適用。


在 Ubuntu 10.04 64-bit desktop 環境上:


$ awk -W version
GNU Awk 3.1.6
Copyright (C) 1989, 1991-2007 Free Software Foundation.
~$ make -version
GNU Make 3.81
Copyright (C) 2006  Free Software Foundation, Inc


透過 Eclipse 建立一個 android 2.3.3 project,例如 MyNDK:


Project name: MyNDK
Build Target: Android 2.3.3/Android Open Source Project/2.3.3/10
Application name: MyNDK
Package name: com.example.ndk
Create Activity: MyNDK
Min SDK Version: 3


接著,在 Eclipse 左邊 Project Explorer 建立 jni 和 libs 兩個目錄,位置擺在剛剛的 Project 裡(點一下 MyNDK,接著按右鍵選 New -> Folder 輸入 jni,之後在建立 libs 目錄):


MyNDK/jni
MyNDK/libs


在 MyNDK/jni 裡頭新增兩個檔案,分別是 JNI 程式碼和 Android.mk,結構如下:


MyNDK/jni
MyNDK/jni/Android.mk
MyNDK/jni/my-jni.c


其中 Android.mk 和 *.c 可以從 android-ndk-r5c/samples/hello-jni/jni 裡頭尋得範例,簡單筆記:


MyNDK/jni/Android.mk (參考 android-ndk-r5c/samples/hello-jni/jni/Android.mk)


LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)
LOCAL_MODULE    := my-jni
LOCAL_SRC_FILES := my-jni.c
include $(BUILD_SHARED_LIBRARY)


MyNDK/jni/my-jni.c (參考 android-ndk-r5c/samples/hello-jni/jni/hello-jni.c)


#include <string.h>
#include <jni.h>
jstring Java_com_example_ndk_MyNDK_stringFromJNI( JNIEnv* env, jobject thiz )
{
    return (*env)->NewStringUTF(env, "Hello from My JNI !");
}


其中要留意 function name,裡頭包括 packages name 和 Activity name 等資訊,此例是 com_example_ndk 和 MyNDK。


接著要透過 android ndk 去編譯 my-jni.c,除了在 Command line 可以切換到 MyNDK 目錄,用 android-ndk-r5c/ndk-build 進行編譯外,還可以透過 Eclipse 設定好,讓你每次自動編譯好:


Properties for MyNDK


在 Eclipse 左邊 Project Explorer 點選 MyNDK,選右鍵 -> Properties -> Builders -> New -> Program


在 Main 分頁:


Name: NDK_Builder
Location(ndb-build位置): /home/user/android-ndk-r5c/ndk-build
Working Directory:(project位置): ${workspace_loc:${project_path}}


Builders


在 Refresh 分頁:


將 Refresh resources upon completion 打勾,並且在 Specific resources 選擇 MyNDK/libs 目錄


在 Build Options 分頁:


勾選 Allocate Console(necessary for input)、Launch in backgroud、After a "Clean"、During manual builds、During auto builds 和 Specify working set of relevant resources


在 Specific resources 選擇 MyNDK/jni


如此一來,只要編譯或清除時,自動會編譯 jni 的部份,可以使用 Build all(快速鍵Ctrl+B) 試試,可以看到 Console 的輸出:


Compile thumb  : my-jni <= my-jni.c
SharedLibrary  : libmy-jni.so
Install        : libmy-jni.so => libs/armeabi/libmy-jni.so


接著,才正式要寫 Java 程式部份,切換到 MyNDK.java:


package com.example.ndk;

import android.app.Activity;
import android.os.Bundle;
import android.widget.TextView;

public class MyNDK extends Activity {
    /** Called when the activity is first created. */
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        //setContentView(R.layout.main);
        TextView  tv = new TextView(this);
        tv.setText( stringFromJNI() );
        setContentView(tv);

    }
    public native String  stringFromJNI();
    static {
        System.loadLibrary("my-jni");
    }

}


其中特別的是要宣告 jni 使用到的函數,這跟 my-jni.c 裡頭的宣告有關,以及 System.loadLibrary 的部份,跟 jni/Android.mk 設定的編譯結果也有關係,如果都不相符,執行時會出現 exception。


最後跑起來的成果:


MyJNI


整個 Project 結構:


Project Explorer


相關文章:



2011年7月6日 星期三

iPhone 開發教學 - 測試 Xcode 4 和 iPhone 3G iOS 4.2.1 取得網路資料

好久沒碰 Xcode 了,上一次寫這種筆記應該是一年前了吧?昨天把公司的環境打理了一下,下載最新的 Xcode 4.0.2 and iOS SDK 4.3,接著把 iPhone 3G iOS 4.2.1 的機器測一下網路連線,結果會噴訊息:


warning: Unable to read symbols for /Developer/Platforms/iPhoneOS.platform/DeviceSupport/4.2.1 (8C148)/Symbols/usr/lib/info/dns.so (file not found).


因為 Xcode 沒有支援 iOS 4.2.1 的環境,接上手機後會從手機上下載相關環境資訊,但偏偏就是沒有 info/dns.so 這個檔案,查了一些文章,解法也只是從 4.2 裡頭複製一份,如此一來就不會出現訊息。


xcode 4.0.2


實際測試時,在 iOS 4.3 模擬器可以正常,但在 iPhone 3G iOS 4.2.1 出錯,一直以為是 DNS 反查失敗,其程式大概如下:


- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
    NSData *d = [NSData dataWithContentsOfURL:[NSURL URLWithString:@"TheWebURL"]];
    NSLog(@"%@", d );


    // Override point for customization after application launch.
    // Add the navigation controller's view to the window and display.
    self.window.rootViewController = self.navigationController;
    [self.window makeKeyAndVisible];
    return YES;
}


其中 "TheWebURL" 是比較複雜的網址,如果只是 "http://www.google.com" 這種不會有問題,但如果是 "http://www.google.com.tw/q=?ooxx" 帶有複雜參數且非常長的,看到的是 (null) 的現象,就陷入跑去找到正確的 dns.so 的深淵了。


後來,不知何時跑去印出 NSLog( "NSURL:%@" , [NSURL URLWithString:@"TheWebURL"] ),才發現在機器上也是噴 (null) ,這下可好,就跟 dns.so 沒啥關係了吧?!


急轉而下,改成找 NSURL 回傳是 null 的解法,不一會兒就解掉了:


NSString *url = [[NSString stringWithFormat:@"TheWebURL"] stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding];
NSLog( "NSURL:%@" , [NSURL URLWithString:url ] );


可以解釋的理由是網址內有特殊符號,在使用上如果丟進較新的瀏覽器時,瀏覽器有的會自動幫你處理,因此,在 iOS 4.3 環境中,NSURL 會自動處理,但是舊版 4.2.1 就沒有了。


至於 dns.so 的問題?看來只有真的碰到時,才能來解了 Orz 又藏了一顆未爆彈。


2011年6月28日 星期二

否極泰來

上週生了場重病,應該是有生以來最嚴重的一次吧?一連五天,每天晚上的活動就是睡覺跟流汗。這大概要追究到上上週二的活動吧?那時候連續兩天參加排球比賽,第一天打一場還好,但第二天連打三場,在比賽過程中果然受傷了,過於疲憊的狀態下,週末接連感冒生重病。


至於衰事部分,那就是上上週三,一天比完三場排球後,腳趾受傷,指甲黑掉了,上網查了一下資訊並且詢問一下練系籃的大學室友,大概要完全恢復也要數個月甚至快一年的事。那幾天打完球想回宿舍洗澡,發現宿舍浴室維修,從週三起至週五都不能使用,只好拖著傷跑去公共廁所洗澡,感覺真像成功嶺當兵,汗流滿身地排隊洗澡。接著週末身體就開始微微生病。就這樣週二看了醫生,醫生建議我請假回家睡覺,痛苦真正開始,一直睡覺、喝水、流汗。直到下一個週末才好轉。


看來,人逢低潮怪事多。除了自己本身外,還有同事離職等事,甚至激起蝴蝶效應,人可是一批批地要走,可真是內憂外患,就連在職進修的同事都選擇進入休學狀態。


我想,越是低潮越是轉機吧?既然身體健康恢復,接下來就沒啥好擔心,好好把事情做好吧!


給自己的一些提醒:


不要只想要做大事,那肯定只是個清高的空轉模式,因為沒那麼多的大事要做或是大事為何要留給你做?就算創業也不是每個案子都如心所願的進行,只能持續保持好自身狀態,這樣碰到真正有價值的案子才能有本錢!就像 BBS 的某則廣告:「人人都想做英雄,卻沒人幫媽媽洗碗」,我想小事也有他的意義,過於排斥不見得是好事。


另外,也要提醒自己不要過於迷戀某個技術,因為技術是搭配案子才有了靈魂的,沒有施展的場合,那只是淪落到紙上談兵。


最後,抱怨少一點,正向看待生活吧,並且機會到處都有的。


2011年6月12日 星期日

工欲善其事,必先利其器

Logitech MK100


正所謂工欲善其事,必先利其器,身為一位程式設計師,怎能沒有一副好鍵盤呢 XD 不過啥青軸、茶軸還是黑軸的,我搞不清處,查了一下才了解,但也不太需要啦,那種上千的鍵盤經濟上還不太能承擔 XDD 便買了便宜中偏貴的 Logitech 牌,但這款應該是 Logitech 中最便宜的鍵盤組吧(鍵盤是 PS/2 接頭,滑鼠是 USB 並附轉 PS/2 接頭)?在新竹 NOVA 逛了會,價格約比 PCHOME 便宜 50 元而已,平均起來,一個鍵盤約 260 元。


2003-keyboard


前幾天滑鼠有點怪怪的,例如出現連點的怪現象,以前可能是中毒現象,但也有可能是滑鼠快壞了!這隻舊滑鼠忘記是在哪邊買的,但我記得價格是 99 元而已,而鍵盤更舊,是 2003 年第一次組電腦時用 100 元買的 XD 用了 11 年超髒的!順便買一把新的吧。用了新鍵盤之後,覺得便宜跟貴的還真的有差,雖然只差了兩百不到,真不知青軸、茶軸和黑軸那種上千的又會是怎樣的差距?選用 Logitech 是以前有一次花了 350 元買他的滑鼠,覺得真的有比較好用啦,就選擇這個牌子囉。


無論怎樣,換了鍵盤程式功力並不會像小說中的武俠,換了刀就變猛的啦。啊啊,文章還是少打點,多寫點程式把握青春熱血吧!!