2012年4月26日 星期四

One Code Project

微軟技術社群暨最有價值專家美國總部跟中國上海研發團隊合作, 推出了一項非常好的東西,就是OneCode專案, 您可以下載Sample Browser,提供開發者更方便搜尋、下載近3500種code範例, 其中包含了近800以上的OneCode samples、超過480項 Windows 8官方範例、 近150種Windows Azure官方實例,另外還提供了可以申請sample code的功能。 還等甚麼,快點去試試看吧

2012年2月9日 星期四

App Idea:中文習字帖

性質雷同軟體:
1. Chinese Flash - Study & Learn Mandarin Vocabulary
http://itunes.apple.com/us/app/id486531735?mt=8

2. Pleco Chinese Dictionary
http://itunes.apple.com/us/app/pleco-chinese-dictionary/id341922306?mt=8

3. Learning to Write Chinese Characters on the iPad
http://www.sinosplice.com/life/archives/2011/06/30/learning-to-write-chinese-characters-on-the-ipad

4. eStroke
http://fast.eon.com.hk:1818/estroke/

iOS 開發資源
1. Tesseract OCR
http://iphone.olipion.com/cross-compilation/tesseract-ocr

2. Compiling tesseract v3 for iPhone
http://robertcarlsen.net/tag/tesseract

3. 中文筆順學習軟體製作
http://w2.hwc.edu.tw/ifg/dgn/98-7-3index.htm

4. 怎么样将汉字画出来
http://www.qqgb.com/Program/VC/VCJC/Program_237704.html

5. 筆順學習網
http://stroke-order.learningweb.moe.edu.tw/home.do

6. 中文字的筆順
http://chinesedigger.blogspot.com/2008/06/writing-sequences.html

2012年2月8日 星期三

iOS App 上架需知

Required iPhone & iPod touch Screenshot Upgrade for Retina Display
When you create or update your apps in iTunes Connect, you must upload screenshots that are high-resolution. We require your screenshots as high-resolution images so that your app is optimized for the Retina display.
The requirements for high-resolution images are 960 x 640, 960 x 600, 640 x 960, or 640 x 920 pixels. Images must be at least 72 dpi, in the RGB color space, and the file must be .jpeg, .jpg, .tif, .tiff, or .png. You can update your screenshot files at any time in iTunes Connect.

New Notification for Binaries Exceeding Cellular Network Download Size Limit
Admin and Technical users will now be notified if your resulting binary size for the App Store exceeds the cellular network download size limit of 20MB. Exceeding the limit requires your app to be downloaded over Wi-Fi. This information can help you determine if you want to resubmit your binary in order to reduce the size of your app.

2012年2月1日 星期三

Exchange Webservice (EWS):The request failed with HTTP status 405: Method Not Allowed

通常來說出錯的是這一行(The request failed with HTTP status 405: Method Not Allowed )

FindItemResponseType findItemResponse = esb.FindItem(findItemRequest);


修正的地方為
ExchangeServiceBinding esb = new ExchangeServiceBinding();
esb.Credentials = new NetworkCredential(@"id", "pw", "domain");
esb.Url = @"https://test.com.tw/EWS/Services.wsdl";

改成
esb.Url = @"https://test.com.tw/EWS/Exchange.asmx";

2012年1月9日 星期一

[super dealloc]; 使用注意事項

在 ObjC 的類別中,物件消滅時會呼叫

- (void)dealloc {

[super dealloc];

}

通常我們會將需要釋放的資源也寫在裡面,進行資源的釋放,
特別要注意的是 [super dealloc]; 要最後才呼叫。


錯誤(會造成釋放失敗系統當掉)
- (void)dealloc {

[super dealloc];

[myobj release];
[myobj2 release];

}



正確寫法應該為
- (void)dealloc {

[myobj release];
[myobj2 release];

[super dealloc];
}

2011年11月28日 星期一

NSDate Top usage

Here is NSDate top usage:

// Your dates:
NSDate * today = [NSDate date];
NSDate * yesterday = [NSDate dateWithTimeIntervalSinceNow:-86400]; //86400 is the seconds in a day
NSDate * refDate; // your reference date

// 10 first characters of description is the calendar date:
NSString * todayString = [[today description] substringToIndex:10];
NSString * yesterdayString = [[yesterday description] substringToIndex:10];
NSString * refDateString = [[refDate description] substringToIndex:10];

if ([refDateString isEqualToString:todayString]) 
{
    cell.title.text =  @"Today";
} else if ([refDateString isEqualToString:yesterdayString]) 
{
    cell.title.text =  @"Yesterday";
} else 
{
    cell.title.text =  refDateString;
}

2011年10月26日 星期三

SAP: Destination configuration already initialized - Part II

這個範例主要用來解決兩件事情:

1. 避免 Destination configuration already initialized 錯誤
2. 展示如何把 IRfcTable 當作呼叫 RFC 的輸入參數

歷經浪費非常多天的 try and error,有需要的請服用。

public IRfcTable TEST_B0001(string VBELN, string POSNR, string CHARG, string LFIMG)
{
        IRfcTable IRetTable = null;
        HLBackendConfig hlConfig = new HLBackendConfig();
        
        bool bRegistered = false;
        
        try
        {
            RfcDestinationManager.RegisterDestinationConfiguration(hlConfig);
            RfcDestination rfcDest = RfcDestinationManager.GetDestination("INIT_SAP");
            RfcRepository rfcRepo = rfcDest.Repository;
            IRfcFunction IReader = rfcRepo.CreateFunction("TEST_B0001");
        
            bRegistered = true;
        
            IRfcTable Itab = IReader.GetTable("IT_INPUT");

            Itab.Append();
        
            Itab[0].SetValue("VBELN", VBELN);
            Itab[0].SetValue("POSNR", POSNR);
            Itab[0].SetValue("CHARG", CHARG);
            Itab[0].SetValue("LFIMG", LFIMG);
        
            IReader.SetValue("IT_INPUT", Itab);
        
            IReader.Invoke(rfcDest);
            
            IRetTable = IReader.GetTable("ET_RETURN");
        }
        catch (Exception ex)
            {
            throw ex;
        }
        finally
        {
            if (bRegistered)
                RfcDestinationManager.UnregisterDestinationConfiguration(hlConfig);
        }
        
        return IRetTable;
}

2011年10月18日 星期二

SAP 與 .NET 整合心得

經過了數個月專案的奮鬥,總結出一些心得列出如下:

1. .NET 與 SAP 函數溝通透過 DataTable <--> IRfcTable 兩者間的互相轉換最方便
2. .NET Web Service 與 SAP 函數溝通 DataTable <--> DataSet <--> IRfcTable 三者間的互轉最方便
3. 設計溝通介面函數時使用以上兩個原則,實作系統的速度很快而且具有快速擴充的彈性
4. SAP Connector 本身的問題很多,每次呼叫 RFC 時,Init / Uninit 要寫在同一段處理函數中
5. SAP Connector 也是透過 .NET 撰寫而成,第一次實機部署安裝之後,要記得重新啟動作業系統
7. 由於第六點原因,RFC 呼叫非常耗資源及時間,可以的話盡量將資料另外儲存在自己系統的資料庫中,資料庫沒資料才考慮從 RFC 呼叫取得
8. 多多利用 SAP Logon 等 GUI 工具,文件上寫的往往都不是真的,看 code 才是王道
9. 一有功能要馬上讓使用者試用,並且立即強迫畫押簽收,以免日後發生糾紛時沒有防禦的系統

2011年10月11日 星期二

.NET CF ListView 不支援 OnClick

.NET CF 中的 ListView 不支援 ItemOnClick, OnClick 等事件,
所以若要取得使用者點選的 ListViewItem 得用 SelectedIndexChanged 來替代,
範例如下:

private void lv_SelectedIndexChanged(object sender, EventArgs e)
{
    if (lv.SelectedIndices.Count > 0)
    {
        ListViewItem lvi = lv.Items[lv.SelectedIndices[0]];
        MessageBox.Show(lvi.SubItems[0].Text);
    }
}

2011年9月30日 星期五

SQL Server 2008 R2 Setup has encountered an error.

花費多天安裝一直會出現此錯誤訊息,
只有安裝 MUI 之後,SQL Server 就可以順利安裝完成了。

基本上最重要的原則就是作業系統使用的語系,
要和SQL Server 使用的語系相同。

2011年9月25日 星期日

Web Service:無法序列化 DataTable。DataTable 名稱未設定。

使用 .NET Framework 2.0 的 Web Service 傳遞 DataTable 參數,
Runtime 會報錯:無法序列化 DataTable。DataTable 名稱未設定。


只要設定以下屬性即可解決:

dtMyTable.TableName = "MyTableName";

2011年9月24日 星期六

VS2008 Package Load Failure: Visual Web Developer HTML Source Editor Package

在 Visual Studio 2008 啟動的時候,出現了錯誤訊息(只會出現一次):

Package Load Failure:
Package 'Visual Web Developer HTML Source Editor Package' has failed to load XXXXXXXXXXX


然後在 IDE 中的 Web Application 中就原本存在的 Design/Split/Source 頁籤就消失了:



開始網路有提及的的方法幾乎都嘗試:
1. 全部移除掉 VS 2008,再重新安裝 VS 2008 + SP1
2. 在 cmd 下進行 C:\Program Files\Microsoft Visual Studio 9.0\VC>devenv /resetskippkgs
3. 重新修復 VS2008安裝光碟\WCU\WebDesignerCore.exe
4. 控制台中重新安裝 & 修復 Microsoft Visual Studio Web Authoring Component

結果全部失敗

最後發現筆者的 VS2008 是英文語系,但是 MS 卻又很雞婆加入了一些參數,
應該是語系不同導致載入時找不到對應的語系資料夾資源所造成。

解法方法如下:

1. 啟動 VS2008
2. 選單 -> Tools -> Options -> 頁籤 Environment -> International Settings -> Language 改為 English
3. 重新啟動 VS2008,問題解決(若不行的話 開一個新的 Web Application 試試看)!

這問題兩年前就遇過一直卡著,今天終於發狠浪費一天時間來解決。

Visual Studio 2008 SP1 - After installation: "Package Load Failure

2011年9月2日 星期五

Hints for publish IPA (iOS app)

由於團隊中申請的帳號可能會有多組,
在建立 IPA 檔案準備要發佈至 App Store 或透過 In-House 方式時,
有時候會因位憑證簽署太多組導致混淆,
我們可以透過檢查以下兩個部份來作最後的檢查:

In build detail view

1. 尋找字串 embedded.mobileprovision,檢查是否存在於 builded package中。
2. 尋找字串 CodeSign,檢查 "iPhone Distribution: Your CodeSign Name." 是否正確。

如此,就能確保 IPA 檔案是正確的。

2011年9月1日 星期四

Compile error CS0006, CS0009 in VS 2008

使用Visual Studio 2008 出現莫名的編譯錯誤訊息:

error CS0006: C:\WINDOWS\assembly\GAC_32\System.EnterpriseServices\2.0.0.0__b03f5f7f11d50a3a\System.EnterpriseServices.dll

連 [2.0.0.0__b03f5f7f11d50a3a] 資料夾都消失了,透過以下方法排除,

1. 進入 console window
2. mkdir C:\WINDOWS\assembly\GAC_32\System.EnterpriseServices\2.0.0.0__b03f5f7f11d50a3a
3. cd C:\Windows\Microsoft.NET\Framework\v2.0.50727
4. copy *.dll C:\WINDOWS\assembly\GAC_32\System.EnterpriseServices\2.0.0.0__b03f5f7f11d50a3
5. 重新啟動 VS 2008 後就正常


參考資料來源

2011年8月26日 星期五

Remove UIViewController from UINavigationController


NSMutableArray *allControllers = [[NSMutableArray alloc] initWithArray:navPick.viewControllers];
for (id object in allControllers) {
// if ([object isKindOfClass:[LoginController class]]) // 此行註解掉,會將容器內所有VC移除
[allControllers removeObject:object];
}
navPick.viewControllers = allControllers;

2011年8月24日 星期三

Loaded the "NibFileName" nib but didn't get a UITableView

-[UITableViewController loadView] loaded the "NibFileName" nib but didn't get a UITableView

動態載入時 xcode 會報錯,原因是繼承的形態跟 nib 使用的類別不同造成,
原始的宣告如下:


@interface ObjIDPickViewController : UITableViewController
{
}


要把它改成


@interface ObjIDPickViewController : UIViewController
{
}

2011年8月19日 星期五

C# get a string from C++ DLL

C++ DLL :



TCHAR g_awcMessage[] = L"Hello中文";
char g_aszMessage[] = "Hello中文";

extern "C" __declspec(dllexport) TCHAR* __stdcall GetHelloL()
{
return g_awcMessage;
}

extern "C" __declspec(dllexport) CHAR* __stdcall GetHello()
{
return g_aszMessage;
}

extern "C" __declspec(dllexport) int __stdcall GetInt()
{
return 100;
}



C# P/Invoke:

[DllImport("gpDll.dll")]
public static extern IntPtr GetHello();

[DllImport("gpDll.dll")]
public static extern IntPtr GetHelloL();

[DllImport("gpDll.dll")]
public static extern int GetInt();


private void button1_Click(object sender, EventArgs e)
{
// Not support in CF
//Marshal.PtrToStringAnsi
//Marshal.PtrToStringAuto

// Multibytes 會變成亂碼
string str = Marshal.PtrToStringUni(GetHello());

// Wide Character 顯示正常
string strL = Marshal.PtrToStringUni(GetHelloL());

int n = GetInt();
}

WinCE/Mobile Control Panel Item List

VC++
BOOL ShowControlPanelApplet(int id)
{
TCHAR szParams[32];
SHELLEXECUTEINFO execinfo = {0};
memset(&execinfo, 0, sizeof(execinfo));
execinfo.cbSize=sizeof(execinfo);
execinfo.lpFile=TEXT(“\\windows\\ctlpnl.exe”);
execinfo.lpVerb=TEXT(“open”);


// Id value determines which control applet will be launched
// For e.g. 23 for bluetooth applet
wsprintf(szParams, L”cplmain.cpl,%d”, id);
execinfo.lpParameters = szParams;
BOOL bRet=ShellExecuteEx(&execinfo);
return bRet;
}

VC#
Process.Start(@"\windows\ctlpnl.exe", "cplmain.cpl,19");

Windows Mobile

1 Password
2 Owner Information
3 Power
4 Memory
5 About
6 Brightness
7 Screen
8 Input
9 Sounds & Notifications
10 Remove Programs
11 Menus
12 Buttons
13 Today
14
15 Beam
16 Clocks & Alarms
17 Configure Network Adapters
18 Regional Settings
19 Connections
20
21
22 Manage Certificates
23 Bluetooth
24 Error Reporting
25 GPS Settings
26
27 USB to PC

Windows CE

1 PC Connection - 35#”ctlpnl.exe” \Windows\cplmain.cpl,0
2 Dialing - 35#”ctlpnl.exe” \Windows\cplmain.cpl,1
3 Keyboard - 35#”ctlpnl.exe” \Windows\cplmain.cpl,2
4 Password - 35#”ctlpnl.exe” \Windows\cplmain.cpl,3
5 Owner - 35#”ctlpnl.exe” \Windows\cplmain.cpl,4
6 Power - 35#”ctlpnl.exe” \Windows\cplmain.cpl,5
7 System - 35#”ctlpnl.exe” \Windows\cplmain.cpl,6
8 Display - 35#”ctlpnl.exe” \Windows\cplmain.cpl,7
9 Mouse - 35#”ctlpnl.exe” \Windows\cplmain.cpl,8
10 Stylus - 35#”ctlpnl.exe” \Windows\cplmain.cpl,9
11 Volume & sounds - 35#”ctlpnl.exe” \Windows\cplmain.cpl,10
12 Input Panel - 35#”ctlpnl.exe” \Windows\cplmain.cpl,11
13 Remove Programs - 35#”ctlpnl.exe” \Windows\cplmain.cpl,12
14 Date/Time - 35#”ctlpnl.exe” \Windows\cplmain.cpl,13
15 Certificates - 35#”ctlpnl.exe” \Windows\cplmain.cpl,14
16 Accessibility - 35#”ctlpnl.exe” \Windows\cplmain.cpl,15

SendKeys for .NETCF

Because System.Windows.Forms SendKeys does not support in .NETCF,
So I have to implement it thru APIs,

here is the solutions: SendInput, keybd_event, PostKeybdMessage and SendMessage



[DllImport("coredll.dll", SetLastError = true)]
//[DllImport("user32.dll", SetLastError = true)]
static extern void keybd_event(byte bVk, byte bScan, int dwFlags, int dwExtraInfo);

[DllImport("coredll", SetLastError = true)]
//[DllImport("user32.dll", SetLastError = true)]
public static extern IntPtr FindWindow(string _ClassName, string _WindowName);

[DllImport("coredll", SetLastError = true)]
//[DllImport("user32.dll")]
private static extern bool SetForegroundWindow(IntPtr hWnd);

public static void SendIt()
{
IntPtr ip = FindWindow("notepad", null);


SetForegroundWindow(ip);

const int KEYEVENTF_KEYUP = 0x2;

const int KEYEVENTF_KEYDOWN = 0x0;

byte VK_TAB = 0x0D;

keybd_event(VK_TAB, 0, KEYEVENTF_KEYDOWN, 0);
keybd_event(VK_TAB, 0, KEYEVENTF_KEYUP, 0);
}




Symbolic
constant name
Value
(hexadecimal)
Keyboard (or mouse) equivalent
VK_LBUTTON01Left mouse button
VK_RBUTTON02Right mouse button
VK_CANCEL03Control-break processing
VK_MBUTTON04Middle mouse button (three-button mouse)
VK_BACK08BACKSPACE key
VK_TAB09TAB key
VK_CLEAR0CCLEAR key
VK_RETURN0DENTER key
VK_SHIFT10SHIFT key
VK_CONTROL11CTRL key
VK_MENU12ALT key
VK_PAUSE13PAUSE key
VK_CAPITAL14CAPS LOCK key
VK_ESCAPE1BESC key
VK_SPACE20SPACEBAR
VK_PRIOR21PAGE UP key
VK_NEXT22PAGE DOWN key
VK_END23END key
VK_HOME24HOME key
VK_LEFT25LEFT ARROW key
VK_UP26UP ARROW key
VK_RIGHT27RIGHT ARROW key
VK_DOWN28DOWN ARROW key
VK_SELECT29SELECT key
VK_PRINT2APRINT key
VK_EXECUTE2BEXECUTE key
VK_SNAPSHOT2CPRINT SCREEN key
VK_INSERT2DINS key
VK_DELETE2EDEL key
VK_HELP2FHELP key
300 key
311 key
322 key
333 key
344 key
355 key
366 key
377 key
388 key
399 key
41A key
42B key
43C key
44D key
45E key
46F key
47G key
48H key
49I key
4AJ key
4BK key
4CL key
4DM key
4EN key
4FO key
50P key
51Q key
52R key
53S key
54T key
55U key
56V key
57W key
58X key
59Y key
5AZ key
VK_NUMPAD060Numeric keypad 0 key
VK_NUMPAD161Numeric keypad 1 key
VK_NUMPAD262Numeric keypad 2 key
VK_NUMPAD363Numeric keypad 3 key
VK_NUMPAD464Numeric keypad 4 key
VK_NUMPAD565Numeric keypad 5 key
VK_NUMPAD666Numeric keypad 6 key
VK_NUMPAD767Numeric keypad 7 key
VK_NUMPAD868Numeric keypad 8 key
VK_NUMPAD969Numeric keypad 9 key
VK_SEPARATOR6CSeparator key
VK_SUBTRACT6DSubtract key
VK_DECIMAL6EDecimal key
VK_DIVIDE6FDivide key
VK_F170F1 key
VK_F271F2 key
VK_F372F3 key
VK_F473F4 key
VK_F574F5 key
VK_F675F6 key
VK_F776F7 key
VK_F877F8 key
VK_F978F9 key
VK_F1079F10 key
VK_F117AF11 key
VK_F127BF12 key
VK_F137CF13 key
VK_F147DF14 key
VK_F157EF15 key
VK_F167FF16 key
VK_F1780HF17 key
VK_F1881HF18 key
VK_F1982HF19 key
VK_F2083HF20 key
VK_F2184HF21 key
VK_F2285HF22 key
VK_F2386HF23 key
VK_F2487HF24 key
VK_NUMLOCK90NUM LOCK key
VK_SCROLL91SCROLL LOCK key
VK_LSHIFTA0Left SHIFT key
VK_RSHIFTA1Right SHIFT key
VK_LCONTROLA2Left CONTROL key
VK_RCONTROLA3Right CONTROL key
VK_LMENUA4Left MENU key
VK_RMENUA5Right MENU key
VK_PLAYFAPlay key
VK_ZOOMFBZoom key

Emulate mouse action in .NETCF

There are some ways to do it,



SendMessage API:
//Find topmost window of another application
IntPtr parentWnd = WIN32.Window.FindWindow(null, "Form2");

//Find the button
IntPtr hButton = WIN32.Window.FindWindowEx(parentWnd, IntPtr.Zero, null, "Target");

//Click the target button
WIN32.Window.SendMessage(hButton, Window.WM.WM_LBUTTONDOWN, IntPtr.Zero, IntPtr.Zero);
WIN32.Window.SendMessage(hButton, Window.WM.WM_LBUTTONUP, IntPtr.Zero, IntPtr.Zero);


mouse_event API:

[DllImport("coredll.dll", SetLastError = true)]
static extern void keybd_event(byte bVk, byte bScan, int dwFlags, int dwExtraInfo);

[DllImport("user32.dll")]
static extern bool SetCursorPos(int X, int Y);

public enum MouseEventFlags
{
LEFTDOWN = 0x00000002,
LEFTUP = 0x00000004,
MIDDLEDOWN = 0x00000020,
MIDDLEUP = 0x00000040,
MOVE = 0x00000001,
ABSOLUTE = 0x00008000,
RIGHTDOWN = 0x00000008,
RIGHTUP = 0x00000010
}
void ClickIt()
{
SetCursorPos(400, 10);
mouse_event((int)(MouseEventFlags.LEFTDOWN), 0, 0, 0, 0);
mouse_event((int)(MouseEventFlags.LEFTUP), 0, 0, 0, 0);
}