2014年2月27日 星期四

C - Data type

sizeof
    printf("sizeof(char) = %d\n", sizeof(char));        // 1
    printf("sizeof(short) = %d\n", sizeof(short));      // 2
    printf("sizeof(int) = %d\n", sizeof(int));          // 4
    printf("sizeof(long) = %d\n", sizeof(long));        // 4
    printf("sizeof(float) = %d\n", sizeof(float));      // 4
    printf("sizeof(double) = %d\n", sizeof(double));    // 8

    printf("sizeof(char) = %d\n", sizeof(char*));       // 4
    printf("sizeof(short) = %d\n", sizeof(short*));     // 4
    printf("sizeof(int) = %d\n", sizeof(int*));         // 4
    printf("sizeof(long) = %d\n", sizeof(long*));       // 4
    printf("sizeof(float) = %d\n", sizeof(float*));     // 4
    printf("sizeof(double) = %d\n", sizeof(double*));   // 4
Reason:
    char
        -128 ~ 127 -> 8 bits needed = 1 byte
    unsigned char
        0 ~255
    short
        -32768 ~ 32767 -> 16 bits needed = 2 bytes
    unsigned short
        0 ~ 65535
    int 
        -2147483648 ~ 2147483647
    float 
        32 bit (s + exp + fraction = 1 + 8 + 23)

    double
        64 bit (1 + 11 +52)

    pointer
        4 bytes = 1 word

Precision Problem
    1. estimate the precision you want.
    2. use big number.



2014年2月25日 星期二

C# - Console in Windows Form

Open Console in Windows Form

In Microsoft Wndows Form Application, console is closed, but you can open it by following snippet.

public partial class Form1 : Form
{

    [DllImport("kernel32.dll", SetLastError = true)]
    [return: MarshalAs(UnmanagedType.Bool)]

    static extern bool AllocConsole();

    public Form1(string[] args)
    {
        AllocConsole();

        InitializeComponent();
    }
}


Parameter usage
  In "main"
[STAThread]
static void Main(string[] args)
{
    Application.EnableVisualStyles();
    Application.SetCompatibleTextRenderingDefault(false);
    Application.Run(new Form1(args)); // send args to Form1.cs
}
In Form1.cs
public partial class Form1 : Form
{
    public Form1(string[] args)
    {
        foreach (string parameter in args)
            System.Console.WriteLine(parameter);
    }
}

Android - NetworkOnMainThreadException


Situation:

private void connect() {

    String device_URL = "http://tw.yahoo.com/";

    HttpURLConnection urlc;

    try {

        urlc = (HttpURLConnection) new URL(device_URL).openConnection();

        urlc.connect();

        Log.e("POST", urlc.getResponseMessage());

    } catch (Exception e) {
        e.printStackTrace();
    }

}


It will cause "NetworkOnMainThreadException" when you try to connect the Internet.


Reason of this situation:

In case of the connection is too long, the screen is gonna block in the main thread.
Solution 1:

Ignore the policy, just add few code in below.
(Not recommend and it's only provide android SDK version 9 or highter)

private void ignoreNetworkPolicy() {

    if (android.os.Build.VERSION.SDK_INT > 9) {
        StrictMode.ThreadPolicy policy = new StrictMode.ThreadPolicy.Builder().permitAll().build();

        StrictMode.setThreadPolicy(policy);
    }
}


Solution 2:

Use thread.

public void createConnectThread() {

    Thread thread = new Thread(new Runnable() {

        @Override

	public void run() {
		request();
        }

    });

    thread.start();
}


Note:
If you want to update UI in thread, it will not permit because Android only allow main thread can update UI. The solution of this is "Handler".

private void updateUI() {

    Handler handler = new Handler();

    handler.post(new Runnable() {

        @Override

	public void run() {
		mTextView.setText("123");
	}
    });
}

Reference:
解决android.os.NetworkOnMainThreadException

2014年2月24日 星期一

C# - StreamWriter and StreamReader

0. Show text in Console

System.Console.Write("Showing\n"); 

System.Console.WriteLine("Showing");


1. Create a directory

System.IO.Directory.CreateDirectory("Test");


2. Create a file in "Test" folder.

string fileName = "Test\\data.txt";

if(File.Exists(fileName))

    File.Create(fileName).Close();


3. Write Text into "data.txt"

string fileName = "Test\\data.txt";

StreamWriter sw= new StreamWriter(fileName);



sw.Write("First");

sw.WriteLine("Second");



sw.Close();

4. Read Text from "data.txt"

string fileName = "Test\\data.txt";

StreamReader sr = new StreamReader(fileName);



System.Console.WriteLine("" + sr.Read());






2012年5月19日 星期六

adb devices 顯示no permissions


以普通使用者登錄linux,解出android-sdk後,設置環境變數,然後運行adb devices會提示許可權不夠:


List of devices attached
???????????? no permissions


這是因為訪問adb設備需要root許可權。




我們可以利用檔的set-user-id屬性來解決這個問題:


sudo chown root:root adb
sudo chmod a+x adb
sudo chmod a+s adb
adb kill-server


先將adb的owner改為root、對所有使用者加入可執行屬性,然後設置set-user-id屬性。這樣,任何使用者運行adb後,adb就會以owner身份運行(即root),而不是登錄的使用者。之後還需要adb kill-server,重新開機adb server。

refer from:

2011年12月12日 星期一

andengine source

andengine library

andengine example

Getting start

教學文

apk


我當時事先把apk抓下來或是把andengine的example範例給架好(import到eclipse上再編譯到實體手機上,
but 我前幾個月再import他的source時,不確定是要多加那些套件,參考(http://eportfolio.lib.ksu.edu.tw/~4970E089/blog?node=000100019) 我認為參考網站上的步驟很麻煩,應該不需要這樣做,
在手機上玩玩他的範例在比對他的source code. 這樣應該會很快.

andengine上的gameActivity (onLoadScence,onLoadResource,etc)
我想主要跟activity不一樣的是有他自己的生命周期吧 (onCreate, OnStart,etc)

2011年12月4日 星期日

Thread-Safe的理解與分析

⓪著作: 蕭沖

 

何謂thread-safe? 這個問題我看過許多論壇都有討論過,都總讓人覺得不很滿意。在此,筆者想要用更logical的方式來把議題說清楚。首先,我們要了解它的定義! 定義若都不明白就難以判別安不安全了!

thread是什麼呢? 可能也有人不太了解。就從這裡開始… 當cpu處理一段(區塊)的程式碼時,從開始的第一行程式碼來跑就算是thead的開始,直到區塊的最後一行程式結束,就算是thread的結束。所謂的「主thread」,在dos (或dos like)程式裡,就是指main( )這個函式的開始到結束的一個thread。而主thread以外的一個子thread則是指程式人員自行在主thread裡再定義一個「程式區塊」,並請cpu同步的去執行那個區塊。

由上面的thread的定義來看,我們可以進而推論所謂的multithread這個字其實是有三種情形的,哪三種呢?
1/ 相同的一個程式區塊,請cpu"分出多身"來執行它! (一段code被new或說create成數個thread)
2/ 不同的程式區塊,請cpu各別分時的去執行每個區塊 (幾段code個別被new或說create成個別的thread)
3/ 混合以上二種情形

所以,當我們在討論多緒/多線程(multithread)的問題時,我們要先去了解問題是上面三類的哪一類。若是第一類,那就要注意若有使用全域變數,那就極有可能是不安全的。若是第二類,那也要考慮是否不同的thread code是否有共用某同一個全域變數。

我們再把「程式區塊」給解析一下。它可以是一個function,或是一個class(裡面有成員函式),或是上述二者的混合體。因為function或是class都會使用到變數,於是多緒時變數的共享就成了一個很大的問題。這就是為什麼會有thread-safe的這個議題了!

到此為止,我們可以想像若一個程序(process / 主thread)裡,有大於等於一個子thread在跑,就會產生thread-safe的問題。以最簡單的情形來說,mainthread+user自定的一個thread。假設Button元件按下後會刪除memo元件裡某個String,而同時間的一個thread則會取用memo裡的String。假想當thread在取用memo中某String做分析的時候,user不知情的按下button,那麼thread是否有可能會取到不正確的String?  若不經過特別的安全設定,肯定「取用」時時而會出問題!

因此,到底安全或不安全的根源就在那執行的區塊程式碼上了(以上例就是取用的過程)。我要補充一個重要的事,其實每一個thread都有自己的一個專屬stack,所以auto級(local)的變數是不會有共享的問題,因為它們都是存放在thread各自的記憶體空間內,彼此不甘擾。也就是說,若你的程式區塊中,所有使用到的變數都是local(auto)變數,那你這個區塊,或說這個thread,就算是thread-safe !! 相反的,若你的區塊中有用到全域的變數,那麼你的這個thread就有可能是不安全。請注意看,是有可能,並非一定是。

如何把含有全域變數的thread分析出安全或不安全? 其實這是很直覺的。比如說某全域變數int g被數個thread使用到,但每個thread裡只引用到一次,那算安全嗎?  答案是…還算安全(註:極度的嚴僅來說不100%,但98%不為過)。因為單一基本變數的一次存取cpu處理極快,不太會有衝突。又,若是某全域結構體變數 struct tag 被引用存取到一次,那算安全嗎?  答案是…不太安全,因為一個結構體的存取可能涉及到多個微指令。進一步的用上面的例子來說,若int g被「程式區塊」(thread code)引用到2次(含)以上,那就肯定不安全了。比如說第一次是把g設成k,第二次把g再設給某變數i,若thread1正在處理第二次引用,而thread2在處理第一次引用。那thread1可能會得到意外的答案!(g值非它第一次設成的k值,而是變成thread2裡的k值)

如何讓不安全的thread變成安全的?? 其實主要的方法有二類。


1/ 存取共用全域變數時加上lock的機制,而這lock的機制在windows上可以使用mutex、criticalsection、event、semaphore等物件配合WaitForSingleObject或WaitForMultipleObject二個api來控制。其原理就是當某thread在取用資料時,其他的通通都停止並等待,直到該thread取用完。


2/ 把存取全域變數的動作通通交給某一個thread全全處理。比如說你有thread1,thread2,thread3。當要存取全域的struct變數時,thread2就把工作交給thread1做,然後自己停住等thread1完成,thread3也把工作交給thread1做,並等待…  。這原理應該容易理解,因為不安全的工作全都交給"單一"的thread來處理時,那份工作就安全了呀! 當然,這也不禁讓我們覺得,這樣效能非常的差!通通都在等thread1。  不過還好的是,若少少的用還ok,若許多的工作都交給某一thread順序來處理,那就真的沒意義了! 而這種方式其實就是bcb或delphi裡的synchronize這個方法的處理方式! (請看最下面2011年我的補充說明)

 

後註: class 其實也像是一種function,所以class本身也是存在著安全與否的問題。倘若該class裡的menthod有用到全域的變數時,該class也算是不安全的! 而許多的VCL就是這類的class!

註2: 若什麼是auto變數、stack都還不清楚,請先自行google或查程式語言的書,這是很基本且重要但易被忽略的章節。

refer from: