2010年3月16日 星期二

[C#] 字串的編碼改變

這個問題一直是很大的問題,但是以前都是裝做不知道,一律用 ASCII 來混過去。
反正以前 VB 或 VC 在中文的環境下,也是用 ASCII 當做預設值,所以只要是打英文就沒事了。
現在開發環境換成 .Net 之後,預設值是 unicode,
也就是在程式中,你看到的就是 unicode 編碼的 string,其實正常也不會有問題。
但是,要跟 com port 傳資料,就會出問題了,怎辦?

好,.Net 也想到了解決方法,
就是用 System.Text.Encoding.ASCII.GetBytes, Encoding.ASCII.GetString 這兩個方法來處理。

當你要把程式中的字串,變成 ASCII 的編碼送出去,
就先用 Encoding.ASCII.GetBytes 把字串變成 byte[],然後把轉好的 byte[] 直接送出去。

當你要把接收到的 byte[],變成 Unicode 的編碼的字串,
就用 Encoding.ASCII.GetString 變成字串。

同理,其他的編碼就照樣造句囉…

當你要把文字中的字串,變成 Unicode 的編碼送出去,
就先用 System.Text.Encoding.Unicode.GetBytes 把字串變成 byte[],然後把轉好的 byte[] 直接送出去。

當你要把接收到的 byte[],變成 Unicode 的編碼的字串,
就用 Encoding.Unicode.GetString 變成字串。

想要知道有什麼編碼可以用,就用 Encoding.GetEncodings 列舉出來看看。

完畢

2010年2月9日 星期二

[www]iframe自動調整高度

漂亮的網頁,真的好難做。
就連iframe要自動調整高度,網路上就一堆解法。
用 google 查詢 iframe auto height 就有一堆網頁教你如何做。
多數有用的,就是用 javascript 來解決的。

而我用了 jquery,也有人包好了一個懶人包,
http://www.lost-in-code.com/programming/jquery-auto-iframe-height/

下載他的 plug-in,裝好,把 iframe 加入 class="autoHeight" 就好。
http://lib.mobius.tw/jquery/myplugin/iframe_autoHeight/autoHeight.js

還可以,不過對我來說,有時候會跑出右邊的 scroll bar,我自己手動加了一些些高度。還不是非常完美。

如果你想跟我一下,用 jQuery 加 class 的話,要在 $(document).ready 加入,
在$(window).load 加的話,在測試的時候是正常的,但正式上線後卻是不會自動調整。

<!—失敗-->
<script type="text/javascript">
    $(window).load(function(){
        $('iframe').attr("class","autoHeight");
        $('iframe').attr("width","100%");
    });
</script>

<!—成功-->
<script type="text/javascript">
    $(document).ready(function(){
        $('iframe').attr("class","autoHeight");
        $('iframe').attr("width","100%");
    });
</script>   

2010年2月8日 星期一

[C#]日期處理

常常忘記這些事,寫下來幫助記憶

static DateTime parseDateTime(string datetimestring)
        {
            System.Globalization.CultureInfo ci = new System.Globalization.CultureInfo("zh-TW", true);
            return DateTime.ParseExact(datetimestring, "yyyyMMdd", ci);
        }

 

DateTime d1 = parseDateTime(fromdate);
DateTime d2 = parseDateTime(todate);
TimeSpan delta_day = d1.Subtract(d2);

Android 相關程式碼由Linux核心中被移除

我是從 http://freesf.tw/modules/news/article.php?storyid=3800 看到這個新聞

Android 相關程式碼由Linux核心中被移除

Linux Kernel的維護者Greg Kroah-Hartman宣佈,將Android 代碼從
Linux kernel 代碼庫中刪除。這意味著,Linux Kernel的開發小組不認可
Android的貢獻,兩者產生了衝突。
由於Google在kernel和應用程序之間,自己做了一個中間層,這樣就既不違反GPL
許可,又能不讓外界看到廠商的硬件驅動和應用程序的源碼。
因此導致所有為Android寫的硬件驅動,都不能合併入kernel。因為它們只在Google
的代碼裡有效,在kernel裡根本沒法用。

=========================================================

對我來說,證實我以前的認知。我之前跟工研院的朋友討論過,使用 GPL 的程式是不是會導致自己的程式也要公開?
關於這個部份,google 給了我們一個示範。
我們用反面來想,「若是任何使用GPL程式的程式都要開放」這條件成立,linux平台就不會有 close source 的程式出現,現實上,的確有 close source 的程式,因此,必定有方法可以達成;連同 google 做的事來看,「為了避開 driver 要公開,google 寫了中間層來分開。」明白的表示,寫中間層,是一個合理、合法的方法,使得 kernel team 拿出最強手段,把 Android 全拿掉。

對,如果真的有疑慮,又懶得找怎麼避開GPL,就寫個中間層吧。

2010年1月21日 星期四

[SQL]SQL Server 遠端連線

除了大家都會知道的把遠端連線開啟之外,我卡在別的地方。
就是帳號密碼的設定。
SQL Server 可以採用純 windows 認證及 SQL Server 混合式認證。
而我,自己搞不清楚之間的不同,卡住一個星期。
在我的組態如下:
WEB Server 在電腦A,SQL Server 在電腦B,兩台都沒有加入網域。
SQL Serser 的管理只設定了 電腦B\administrator。
使用混合式認證。
當我在電腦A要連線 SQL Server 時,以下指令都失敗
(1)sqlcmd –S 電腦B
(2)sqlcmd –S 電腦B –U administrator
(3)sqlcmd –S 電腦B –U 電腦B\administrator
原因是
(1)的方式,是採用 windows 認證,user是電腦A當時的登入的帳號。電腦B裡沒有這個帳號,所以失敗。
(2)的方式,當有加入 –U 時,就是使用 SQL Server 認證,而 administrator 不在 SQL Server 使用者內。所以失敗。
(3)的方式,使用 SQL Server 認證,帳號是 windows 的帳號,這個樣子也是失敗。
遇到事情卡很久,果然休息是有用的,晚上睡覺的時候,突然靈感一來,
隔天先在電腦B的SQL Server新增一個 user,並增加他的權限到可以登入。然後再試一次
(4)sqlcmd –S 電腦B –U user
就解決了 connect string 的問題了。這是採用 SQL Server 認證的問題。

但是!
如果要使用 windows 認證呢?
現在還不知道,但是我想應該就要加入網域,使得 SQL Server 可以加入 電腦A\user 到 SQL Server 使用者裡。
這一段還需要時間來實作了。
有人知道的話,可以教我嗎?

2010年1月20日 星期三

[SQL]找出table的schema

找到的這個資料實在太棒了,一舉數得。
http://www.dotblogs.com.tw/lolota/archive/2009/09/05/10441.aspx

真的是順便學了很多 connection.GetSchema 的用法。

string[] restrictions = new string[4];
        restrictions[0] = "Northwind";
        restrictions[2] = "Employees";

        System.Data.SqlClient.SqlConnection conn = new System.Data.SqlClient.SqlConnection(connStr);
        conn.Open();
        DataTable dt = conn.GetSchema("Columns", restrictions);
        conn.Close();
        GridView1.DataSource = dt;
        GridView1.DataBind();

[SQL]利用ADO找出現有的table

網路上找到且我試用過的方法有兩個

sqlconn = new System.Data.SqlClient.SqlConnection();
sqlconn.ConnectionString = connectstring;
sqlconn.Open();

// method 1
DataTable dt = sqlconn.GetSchema();
DataTable dt2 = sqlconn.GetSchema("Tables");
Literal1.Text= printTable(dt2);

// skill for write xml to string
//System.IO.StringWriter a=new System.IO.StringWriter();
//dt2.WriteXmlSchema(a);
//Response.Write(a.ToString());

// method 2
DataTable dt3 = new DataTable("Tables");
string commandstring = "select TABLE_NAME from INFORMATION_SCHEMA.Tables where TABLE_TYPE ='BASE TABLE'";
System.Data.SqlClient.SqlCommand sqlcmd = sqlconn.CreateCommand();
sqlcmd.CommandText = commandstring;
dt3.Load(sqlcmd.ExecuteReader());
Literal2.Text= printTable(dt3);

sqlconn.Close();