2011年10月31日 星期一

AD網域認證發生錯誤:未知的錯誤 (0x80005000)

卡了我好久的 AD 網域讀取問題終於解決了,提供給有相同困擾的人。


AD讀取的程式碼(C#)
DirectoryEntry entry = new DirectoryEntry("LDAP://GOOGLE.COM.TW:389", "userName", "password");
entry.RefreshCache();

一直出現錯誤畫面:

解決的方法如下:
  1. 在 Windows Server 2003 中,userName不需要加 domain
  2. ladp路徑要大寫  <=== 卡了我一個多禮拜的兇手。

如果你是這樣而排除錯誤的話,留個言讓我知道一下吧!

2011年9月30日 星期五

手機程式開發與兼顧硬體能力

作者: iincho (世界的盡頭) 看板: Soft_Job
標題: Re: [請益] 手機程式開發與兼顧硬體能力
時間: Thu Sep 29 01:25:57 2011


 既然有人希望在下介紹怎麼看Android code,這裡就稍微分享一下心得,
 不敢說每個模組都精通,但是大方向抓是抓得出來的,
 不過我不喜歡吊書袋,所以想看到什麼design pattern之流的不要太期待。

 首先講書,Android目前關於系統面寫得最好的是底下這本:

 Android技術內幕:系統卷, 作者楊豐盛,簡體書。

 網路上找得到部分試閱,不過後面的章節沒前面寫得好,但光看第三章就划算,
 對binder的講解應該是目前市面上最好的。

 應該很多人看過韓超那本"深入淺出 Android 系統原理及開發要點",
 不過就我來看這兩本根本不是同一個檔次的東西。

 台灣出的基本上只能買高煥堂寫的,其他的不要碰。高先生對系統的理解算非常強,
 就是欠了點文彩有些可惜,不過寫的東西比那些搞技術傳教的好多了,至少觀念都是
 正確的。

2011年9月1日 星期四

Objective-C 的記憶體回收機制(下)

終於比較有空補完下集了!這一集主要想要分享Objective-C的直接存取與間接存取的差異,以及function return value 的 retain、release 時機。

首先先看下面一個很簡單的 student class:


student.h
@interface Student: NSObject {
    NSString *iName;
    NSString *iStudentID;
    int age;
}

@property(nonatomic,copy) NSString *iName;
@property(nonatomic,copy) NSString *iStudentID;
@property(nonatomic,assign)  int age;

@end

student.m
#import "student.h"
@implementation student
@synthesize iName,iStudentID,age;

- (void) dealloc {
    [iName release];
    [iStudentID release];

    [super dealloc];
}

@end

2011年8月28日 星期日

Objective-C 的記憶體回收機制(中)

在上一篇文章裡面談到了自己對物件記憶體的操作,難道就只有開發者會對物件做計數器(retainCount)的操作嗎?答案是否定!有一些 api 會自動對物件的 retainCount +1或是 -1,最常見的例子就是陣列的操作。例如:

NSMutableArray *arr = [[NSMutableArray alloc] initWithCapacity : 0];//array.retainCount = 1

NSString *str1 = [[NSString alloc] initWithString : @"A"];//str1.retainCount = 1
NSString *str2 = [[NSString alloc] initWithString : @"A"];//str2.retainCount = 1

[arr addObject : str1];//str1.retainCount = 2
[arr addObject : str2];//str2.retainCount = 2

[arr removeObject : str1];//str1.retainCount = 1
[arr release];//array.retainCount = 0;str2.retainCount = 1

//系統回收 array

[str1 release];//str1.retainCount = 0
[str2 release];//str2.retainCount = 0

//系統回收str1&str2

Objective-C 的記憶體回收機制(上)

這陣子為了 iPhone 學了 Objectiv-C ,一直對他的記憶體管理機制頗有微詞(笑),什麼時候該釋放,什麼時候該保留,真的是一點頭緒都沒有!建議初學者先把 Apple 官方的關於記憶體回收的說明文件先讀過一遍。(網頁版PDF版),內容有空的話我再翻譯!

首先先解釋為什麼變數有時候要加星號(*),有時候又不加。這是因為在 C 與 C++,以及基於這兩種語言加以改良的 Objective-C ,星號(*)代表的意思是指向某個記憶體的指標(pointer), 而不加星號(*)表示是取值,例如:

int number = 0;//取值

char[] name = ['n','a','m','e'];
char *str = name;//取址

2011年8月23日 星期二

html 檔案上傳控制項 onChange事件只會觸發一次

困擾了好久的問題,終於解決了!

原本的事件繫結

$("#file_upload").bind('change',function(){});

改成

$("#file_upload").live('change',function(){});

----以上是 JQuery 的用法-------

一般的做法是替換掉file_upload

$('#file_upload').replaceWith('<input id="file_upload" name="file_upload" type="file">');

2011年7月28日 星期四

Android - MapView上面的圖片跟著縮放

昨天在ptt的AndroidDev板看到有鄉民在問怎麼讓MapView上面的圖片跟著縮放,想起之前也有做過類似的測試,就寫了這篇和大家分享。

首先先看到layout檔的排版:

<?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">
 <com.google.android.maps.MapView
  android:id="@+id/mView_Main"
  android:layout_width="fill_parent"
  android:layout_height="fill_parent"
  android:apiKey="你自己的key">
 </com.google.android.maps.MapView>
</LinearLayout>

很簡單的一個地圖畫面。

Objective-C 的 self

今天查被Apple reject的原因,剛好看到有關self的一些解釋,趕緊記下來免得忘記。

假設現在有個類別Test,裡面有一個NSData的成員。

@interface Test : NSObject {
    NSData *iData;
}

@property(nonatomic,retain) NSData *iData;

@end

當我們使用 self.NSData 的時候,就等同於呼叫編譯器幫我們自動產生的getter方法,retain + 1。
當我們使用 self.NSData = [[NSData alloc] init],就等同於呼叫setter的方法。

而編譯器產生的getter/setter就等同於自己寫的:

-(void) setIData : (NSData *) newData {
  if(iData != newData){
    [iData release];
    iData = [newData retain];
  }
}

-(NSData *) getIData {
  return iData;
}

另外,在dealloc時,就不要再用self了!

2011年7月18日 星期一

Android上的好用鬧鐘 - Alarm Clock Xtreme

Android上面有很多套鬧鐘軟體,今天介紹的這一套是我覺得還不錯用的鬧鐘軟體,除了會盡責的叫你起床之外,還有專為懶人設計的貪睡功能,每天最美好的時光之一就是鬧鐘響起到下一次貪睡期間的小小賴床,好像不賴一下床,今天就沒有辦法開始一樣XD

另外一個推薦原因就是...正(繁)體中文是我翻的啦!老王賣瓜,自賣自誇一下!

Market 連結:Alarm Clock Xtreme
免費版本:有廣告
付費版本:0.99 美金,去除廣告
QR Code

2011年7月16日 星期六

Android 模擬器打不開

今天為了測試一支半成品,不敢貿然安裝在實機上,打算安裝在那慢的可以的模擬器來做測試,沒想到一按啟動就跳出了怪訊息:

invalid command-line parameter: Files\android-sdk-windows\tools/emulator-arm.exe.
Hint: use '@foo' to launch a virtual device named 'foo'.
please use -help for more information

幹什麼!造反了!

2011年7月15日 星期五

StringBuilder append null in Java and C# test

今天檢查了一下StringBuilder對於附加null的處理做了個小實驗。

Java:
import java.util.Calendar;

public class main {
 public static void main(String[] args) {
  testStringBuilder();
 }

 public static void testStringBuilder() {
  StringBuilder sBuilder = new StringBuilder();
  
  System.out.println("1. string of new StringBuilder()");
  if(sBuilder == null){
   System.out.println("string:[is null]");
  }else{
   System.out.println("result:string:[" + sBuilder + "],length:[" + sBuilder.length() + "]");
  }
  
  StringBuilder sBuilder2 = new StringBuilder("");
  
  System.out.println("2. string of new StringBuilder(\"\")");
  if(sBuilder2 == null){
   System.out.println("string:[is null]");
  }else{
   System.out.println("result:string:[" + sBuilder2 + "],length:[" + sBuilder2.length() + "]");
  }
  
  StringBuilder sBuilder3 = new StringBuilder();
  String nullString = null;
  sBuilder3.append(nullString);
  
  System.out.println("3. string of new StringBuilder() append null");
  if(sBuilder3 == null){
   System.out.println("string:[is null]");
  }else{
   System.out.println("result:string:[" + sBuilder3 + "],length:[" + sBuilder3.length() + "]");
  }
  
  StringBuilder sBuilder4 = new StringBuilder("");
  sBuilder4.append(nullString);
  
  System.out.println("4. string of new StringBuilder(\"\") append null");
  if(sBuilder4 == null){
   System.out.println("string:[is null]");
  }else{
   System.out.println("result:string:[" + sBuilder4 + "],length:[" + sBuilder4.length() + "]");
  }
 }

2011年7月13日 星期三

中華電信 50M 實測

好不容易辦好了50個妹,當然要來測試一下50個妹的威力!下面會分成3個部分,分別有電腦的速度測試、Wifi的速度測試以及苦命的3G速度測試。

先說明一下,有關於速度換算:
下行:50Mbps = 6400 KB
上行:5Mbps = 640 KB

首先是電腦的部分,先來張種花的速度測試:
種花自己的測速網站
 我的老天爺啊!上行跑出了破表的速度,還敢說沒有作弊!這麼完美的速度要哪裡找?

2011年7月11日 星期一

I touchs: Finding memory leaks for apps in Xcode 4

I touchs: Finding memory leaks for apps in Xcode 4: "更新日期: 2011/03/ 17 參考資料: How To Debug Memory Leaks with XCode and Instruments Tutorial | Ray Wenderlich http://www.raywenderlich.com/2696..."

2011年6月3日 星期五

Objective-C @property

interface中宣告
@property int age <= 編譯器自動產生 get 與 set 方法。
可以用的屬性有:
屬性說明
getter=method指定物件的get method
setter=method指定物件的set method
readonly指定物件為唯獨狀態
readwrite指定物件為可讀寫狀態(預設)
assign物件的值根據帶入的值決定,不改變索引計數(預設)
copy複製物件的設定,索引計數為1,釋放舊的物件
retain保持物件的設定,提高物件的索引計數,並釋放舊的物件
nonatomic不鎖定物件(多執行緒的時候,資源會競爭)

assign:適用於基本型態變數,例如int,char,NSInteger,CGFloat...等等。
copy:適用於NSString。
retain:以NSObject為基底的class。

2011年5月27日 星期五

Objective-C Method Type

"-" 代表實體方法,實體方法用在當類別被實體化後才可取用
"+" 代表類別方法,類別方法不須實體化就可使用

2011年3月10日 星期四

Android - AndEngine的基礎事件

ANndEngine中的事件並不複雜,再繼承了BaseGameActivity之後,因為BaseGameActivity有實作了IGameInterface,所以可以用的事件如下:

public Engine onLoadEngine();
public void onLoadResources();
public void onUnloadResources();
public Scene onLoadScene();
public void onLoadComplete();
public void onGamePaused();
public void onGameResumed();

這些事件的用意也可以很容易的從method的命名看出來。
但是切記,只能Override這些事件,Android的基礎事件,例如:onCreate(),onStop()...等等,完全禁止使用,否則輕則logcat會出現提示說明不能使用,然後當掉,重則只有exception的訊息,然後直接當掉。

2011年3月9日 星期三

Android - logcat不會顯示

有時候常常會遇到模擬器重開,但是Eclipse沒有重開的情況下,logcat的訊息不會顯示,要重開Eclipse又有點麻煩。後來我發現了一個解決方式,見下圖,對著圖中紅色框框的地方按滑鼠右鍵,訊息一下子就噴出來啦~

2011年3月8日 星期二

Android - 記憶卡相關

取得記憶卡狀態
Environment.getExternalStorageState()
狀態有以下幾種:
MEDIA_BAD_REMOVAL:不當移除。未經卸載就拔除記憶卡。
MEDIA_CHECKING:檢查中。
MEDIA_MOUNTED:已掛載,並且可讀寫。
MEDIA_MOUNTED_READ_ONLY:已掛載,但是只能讀取。
MEDIA_NOFS:未格式化或是格式無法讀取。
MEDIA_REMOVED:已移除。記憶卡槽偵測不到有記憶卡。
MEDIA_SHARED:記憶卡未掛載,使用的是usb分享的外部儲存裝置。
MEDIA_UNMOUNTABLE:有偵測到記憶卡,但是無法掛載。可能是記憶卡壞掉或是記憶卡分割區壞掉了。
MEDIA_UNMOUNTED:有偵測到記憶卡,但是尚未掛載。

取得記憶卡根路徑
Environment.getExternalStorageDirectory().getPath()

取得記憶卡容量
StatFs stat = new StatFs(Environment.getExternalStorageDirectory().getPath());

// 未使用(單位:bytes)
long sdFreeSize = stat.getAvailableBlocks() * stat.getBlockSize();

// 總容量(包含保留空間,單位:bytes)
long sdTotalSize = stat.getFreeBlocks() * stat.getBlockSize();

// 已使用(單位:bytes)
long sdUsedSize = sdTotalSize - sdFreeSize ;

ps.1 gigabytes = 1024 megabytes = 1024*1024 kilobytes = 1024 * 1024 * 1024 bytes

Rainmeter 0.14 中文化

首先先對莫名其妙轉址進來的人說聲抱歉,最近在整理檔案的時候,想起幾年前有做過這東西,就把他翻出來看看,發現每天都有固定一些流量,這讓我留也不是,不留也不是。如果我一刪檔案,就會讓所有連結的網站跟網誌連結掛掉,為了不造成他人的困擾,所以我就保留原本的轉址 - http://tericky.idv.st,但是連結改到這裡。這就是為什麼各位會莫名其妙的轉到這邊的原因了。

程式下載點(XuiteDropBox)

一開始先放上截至 2011/03/08的流量統計。
感謝這20872的訪客使用我這不才的中文化。

下面是當初寫的使用教學。

2011年2月23日 星期三

AndEngine - Android的遊戲引擎

Android發展也有一段時間了,隨著性能越來越好的硬體被推出之後,遊戲也越來越多,但是對於一個遊戲開發的初學者來說,到底哪一套遊戲引擎比較適合呢?比較過幾套Android上的引擎之後,決定以AndEngine作為我的第一步。

這套引擎有什麼特點呢?
  1. 完全公開原始碼:作者將所有的程式碼都公開,想要了解程式的實作方式,可以自己trace程式碼。
  2. 完全免費:是的!這是一套免費的package,你不需要額外花錢買授權或是支援。
  3. 豐富的範例程式:作者針對每個可能用到的功能寫了範例,極具參考價值。
  4. 強大的功能:使用少量的程式碼,就可以做到許多複雜的動作。
  5. 無須公開自己的程式碼:雖然這套引擎的授權是採用LGPL(稍稍鬆綁的堅持 - LGPL),但是你不需要公開你的遊戲原始碼。唯一要注意的地方是,當你修改了引擎的原始碼,就必須要公開你所修改的程式碼
但是也有一些缺點:
  1. 沒有文件可以看:嗯....對於習慣有各種white book啦,developer cookbook閱讀的人來說,這套引擎完全沒有相關文件可以看,就連安裝教學都是在他的論壇中才找到的。想要了解有什麼功能,就要自己爬原始碼(編按:所以才會完全公開程式碼.....)。
  2. 2D only:這是2D的引擎,不要以為是哪裡搞錯了,怎麼都是平面的...。
  3. 需要有java或是物件導向的基礎:沒有的話,光是看他繼承來實作去的,就會搞死你的腦細胞了。
  4. 中文討論與教學較少:中文以簡體中文的討論占大多數,但是還是不足以撐起一片天,所以要有硬啃英文跟用英文在作者的論壇苦戰的心理準備。
AndEngine 首頁:http://www.andengine.org/
AndEngine 論壇:http://www.andengine.org/forums/
AndEngine 原始碼:http://code.google.com/p/andengine/
AndEngine 範例:http://code.google.com/p/andengineexamples/

這邊有一些教學的文章可以參考:

Beginner
Getting Started with AndEngine, Eclipse and a Hello World Application
Using Timer's - Sprite Spawn Example
Update Handlers - Using their power!

Medium
Updating Sprites/Objects - Using Listeners
Scrolling with Touch Events
Live Wallpaper Settings - Example by Nasc (until I have done a tutorial)

Advanced
XML Parsing within AndEngine

Other
Live Wallpaper Template
Particle Effect Sprites
2D Polygon Class for AndEngine - Perfect for Debugging without Textures!

2011年1月26日 星期三

不同資料庫的亂數

MySQL:
SELECT column FROM table
ORDER BY RAND()

PostgreSQL:
SELECT column FROM table
ORDER BY RANDOM()
LIMIT 1

Microsoft SQL Server:
SELECT TOP 1 column FROM table
ORDER BY NEWID()

IBM DB2:
SELECT column, RAND() as IDX 
FROM table 
ORDER BY IDX FETCH FIRST 1 ROWS ONLY

Oracle:
SELECT column FROM
( SELECT column FROM table
ORDER BY dbms_random.value )
WHERE rownum = 1

參考:http://www.petefreitag.com/item/466.cfm

2011年1月21日 星期五

Android的介面設計

最近看到一個不錯的網站 - Android Patterns,介紹Android的介面互動設計方式,由於網站才成立沒多久,案例不夠豐富,設計小組也允諾會持續更新:
We are a group of interaction designers based in Amsterdam. We are UNITiD and we will keep this site as fresh and crispy as possible.

2011年1月18日 星期二

Android的第三步 - Hellow World

終於要踏入Android的開發領域了,這一次要講的是每個程式設計師必經的第一課 - Hellow World!

從本篇開始,往後所有的開發環境以及編輯器使用的是Windows 7 & Eclipse 3.6。

打開Eclipse編輯器,並且開啟模擬器stand by,不然會跑很久....

2011年1月17日 星期一

Android的第二步 - 建立模擬器

想要開發Android的應用程式,但是又沒有Android的手機或設備要怎麼辦?別擔心!Google幫你想到了這一點,提供了一套模擬器工具,讓你在PC或Mac上測試你的程式,但是要注意以下幾點:
  1.  模擬器只是"模擬"用,最好還是要有實際裝置做最後release的測試。
  2.  電腦的配備不能太差,不然模擬器執行的速度會很慢。

以下的建立方式是以PC Windows為建立環境,Linux及Mac的方式大致上一樣,只是部分路徑可能會有差別。

2011年1月13日 星期四

Android的第一步 - 安裝開發環境及SDK

需要安裝的軟體清單:
  1. Eclipse
  2. Google Android SDK


首先,從第一點開始,可以到Eclipse官網下載頁,視個人需要下載所需的版本,因為我只用來開發Android,所以下載了Eclipse IDE for Java Developers,版本是Helios (3.6.1)。