2010年12月29日 星期三

[閒聊]delicious 可能會不見?

這不是一個好消息 delicious 可能會不見。

http://uniquehazards.tumblr.com/post/2377362882/we-can-save-delicious-but-probably-not-in-the-way-you

我在 delicious 上面有 1043 個書籤。是念研究所開始累積的。

除了有很多是研究學術用的連結,也有很多是寫程式研究的連結,有更多,完全是宅男要用的…

delicious 是一個管理網路書籤的網站。
除了自己管理之外,也可以看別人是如何管理書籤的。
這是屬於一個集體智慧的社群網站,或許你平常不會去注意。
你可以看到在這個網站上的集體智慧顯露在標籤上(也就是關鍵字)。

我管好自己的書籤,提供了我的智慧結果,別人也是。
從系統方或是有志之人就可以從人與標籤與網址之間的關聯看出一些東西來。

說了這麼多,真的是希望他不要被廢掉。如果真的被廢掉了,
那…也許我自己來做一個好了…。

2010年12月17日 星期五

[sqlite] index 加快了查詢速度

原本我的表格裡,只有單純的幾個欄位,沒有任何欄位有設定 key 屬性,
也都沒有設定流水號的欄位。

要檢查資料是否有重覆的時候,我就得自己準備了一個 sql 字串來檢查,
到了資料有 22 萬筆的時候,大約查一次要 0.2 秒。
insert 或 update 一次只要 0.001 ~ 0.0017,看硬碟忙不忙。
如果有 14 萬筆資料,就要花 7 個小時在檢查資料重覆性。
塞一年的股票資料就很花工夫了。

後來查到網路上說,資料庫的 index 若有建立,可以省下很多時間,
當下試試看。

語法是:

create unique index if not exist <indexname> on <tablename> ( <keycolumn>, )

做完之後,馬上查詢的時間一次只要 0.001 秒,甚至有時少於 1 毫秒。

真省時間!

玩 database 還真麻煩。
這種事感覺是很基本資料庫優化的工作,應該要預設開啟的?
或是因為我沒有設 key column 引擎也不知道要怎麼幫吧。

這次以後就要對於 table schema 及 index 特別注意了。

ref:
http://www.sqlite.org/lang_createindex.html

2010年11月19日 星期五

[閒聊]為什麼會這樣,Google Chrome 不正常

放在 blogspot.com 的東西,為什麼 google chrome 會不正常,跟別人不一樣?!

image

image

image

[c#]設定檔 config 的使用(3)

前次提到使用 System.Configuration.ConfigurationManager 這個神奇工具,
是非常方便,
但是我想要指定設定檔名字,怎麼辦?

那就來抄 App.config 吧,希望這個沒有專利啊,呵呵。

public class readConfig{
        string _configFileName = "";
        public readConfig(string configFileName)
        {
            _configFileName = configFileName;
        }
        public string ConfigValue(string section, string key)
        {
            string r = "";
            System.Xml.XmlDocument xd = new System.Xml.XmlDocument();
            try
            {
                xd.Load(_configFileName);
                System.Xml.XmlNode xn = xd.SelectSingleNode("/configuration/" + section + "/add[@key='" + key+ "']/@value");
                if (xn == null)
                {
                    r = "";
                }
                else
                {
                    r = xn.InnerText;
                }
            }
            finally
            {
            }
            return r;
        }
    }

使用方法如下

readConfig x = new readConfig(pathToConfig);
string y = x.ConfigValue("appSettings", "source1");

就這樣。

如果 key 不存在的話,會傳回長度為零的字串。這是我自己比較喜歡的結果。

[c#]設定檔 config 的使用(2)

前一篇說到使用 dataset 當做工具來讀取設定。
另外一個是開發的時候,在專案中加入 App.config 這個檔案。

我先用 winform 專案來解釋。

要記得將 System.configuration 加入專案參考中。
如此就會有神奇工具可以用,就是

System.Configuration.ConfigurationManager

只要將 App.config 裡面內容填入

<?xml version="1.0" encoding="utf-8" ?>
<configuration>
  <appSettings>
  <add key="source1" value="appsetting.release.config" />
  <add key="source2" value="appsetting.dev.config" />
  <add key="target" value="appsetting.config" />
</appSettings>
</configuration>

以下神奇工具的使用就會得到上面紅色的字!

string f1 = System.Configuration.ConfigurationManager.AppSettings["source1"];

也就是 /configuration/appSettings/add 元素的 key / value 在操作。
如果 key 不存在的話,會回傳 null 。

當你建置這個專案,執行檔執行的時候,並不是把 App.config 這個檔案當做設定檔來讀,而是「執行檔名稱.exe.config」。例如某個執行檔名字是「MyFirstExe.exe」,設定檔名字就是「MyFirstExe.exe.config」。

所以你的執行檔在發佈的時候,記得要帶著「執行檔名稱.exe.config」一起發佈。

還有類似的神奇工具在其他種類的專案中,下次再研究。

2010年11月14日 星期日

[c#]設定檔 config 的使用 (1)

從 vb6 時代,用慣了 ini,就算換到了點網時代,也還是用 ini。
不想換的原因也很簡單,就是懶得再去搞定那些已經寫好的設定檔讀取的舊程式碼。

其實,現在的點網好心的給我們一些功能,所以可以輕鬆使用 xml 當做設定檔。現在有兩招,第一招是同事發現的:

(1)用 dataset 當做操作者:
首先把設定檔寫好如下

<Setting>
  <SetPath>
    <Test1>C:\Test</Test1>
    <Test2>D:\Test</Test2>
    <Test3>E:\Test</Test3>
    <Test4>F:\Test</Test4>
  </SetPath>
</Setting>

取值的 function 如下,可以拿到 Test3 的值 E:\Test

DataSet ds = new DataSet();
ds.ReadXml(pathToXmlSetting);
if (ds.Tables["SetPath"].Rows.Count > 0)
  return ds.Tables["SetPath"].Rows[0]["Test3"].ToString().Trim();
else
  return "";

會這樣寫是要避開設定檔沒寫好的防呆措施。

2010年11月5日 星期五

[google]google I/O

以前只看名字,以為這是 google 對於 I/O 的一些軟體。
我大錯特錯。
原來這是 google 舉辦的 conference 的名字。
在這個 conference 裡,介紹 google 的成果,推廣他們開發工具,推廣他們的應用產品,推廣他們對於網路的理念。
我仍然很佩服他們能把商業做得這麼不露痕跡。
尤其我經歷過搜尋網站把網站排名秤斤論兩的販賣的年代,我因為它總是給我大家所認為對的資料,而不是花錢買曝光率的網站而一直用到現在。
他們維持著給與使用者想要的資料的原則,並且努力著提供好用的平台,降低門檻讓每個人都能成為內容的提供者,而不惜花大錢投資研究或買下其他公司。
是的,當然有可能這樣的公司會做壞事。希望他們能堅持下去。
離題了。
這個 conference 的影片我正在消化中,最讓我印象深刻的是 2009 送與會者手機,2010 也送與會者手機。好想參加啊,不曉得要不要錢?

2010年11月4日 星期四

[aspnet]按下按鈕後,出現下載視窗

這是常常看到的功能,但是我就是花了一、兩個小時在試它。

protected void Button1_Click(object sender, EventArgs e)
{
    Response.ContentType = "text/xml";
    Response.AppendHeader("Content-Disposition", "attachment; filename=newfile.xml");
    Response.TransmitFile(Server.MapPath(@"App_Data\" + "newfile.xml"));
    Response.End();
}

以上的程式是把網站中,存在的檔案送出去。

protected void Button1_Click(object sender, EventArgs e)
{
    Response.ContentType = "text/xml";
    Response.AppendHeader("Content-Disposition", "attachment; filename=newfile.xml");
    Response.BinaryWrite(System.Text.Encoding.UTF8.GetBytes("text test"));
    Response.End();
}

而以上的程式是把網站中,已知的字串用UTF-8編碼當做XML檔案送出去。

兩個程式裡,只要走到Response.End();就離開了。在後面寫什麼程式都執行不到。

2010年10月27日 星期三

[excel][access]excel抓access資料

工作上難免收到 access 的資料庫,要把部份資料抓進來。不要說用人工處理成千上萬筆的資料很痛苦,就連一兩百筆資料要核對就夠累人了。

打開 excel 然後,進到俗稱 VBA 編輯器去,在
工具>>設定引用項目

Microsoft ActiveX Data Objects 6.0 Library
勾起來。是的,我要用 ADO。

首先建立 connection
Dim cn As ADODB.Connection
Set cn = New ADODB.Connection
cn.Open ("Provider=Microsoft.Jet.OLEDB.4.0; Data Source=" & AccessFileFullPath & ";")

再來開啟 Recordset
Dim rs As ADODB.Recordset
Set rs = New ADODB.Recordset
rs.Open "select * from mytable", cn, adOpenStatic, adLockReadOnly

接下來把資料帶出來,最簡單循序的方法如下,每一個 recordset 可以用 index 取該 column 的值,或用 column name 來取值。
Do While rs.EOF = False
iid = rs(0).Value
sname = rs("CityName").Value
rs.MoveNext
Loop

至於 recordset 開啟時的參數有何不同功效,有待改日或高人指點。

2010年10月21日 星期四

[webdav]可惜有限制

原本打算,有了webdav,就可以把網路芳鄰給丟到一邊了。因為這兩個看起來功能真的都一樣,而且好像webdav還可以支援到外部ip,不是很讚嗎?

不過,我遇到一個限制,就是單一檔案傳送,不能超過2G,現在很多好看的檔案都超過2G,叫我怎麼辦呢?

不曉得這個限制是我設定的問題還是apache webdav在compile設參數的問題,亦或是spec天生的限制。

之前看設定檔上面寫LimitXMLRequestBody最大值是2G,我也試過0,也是失敗。

[xml]xml formatter

常常遇到別人寄來的xml沒有縮排,因為都是用機器產生的。
如果要看,雖然可以用瀏覽器來看,但是要手動改幾個內容,還是會找不到位置。
隨手用dot net寫一個,自己用一用,記錄下來以免忘了。

xdoc = new XmlDocument();
xdoc.Load(inputname);
XmlWriterSettings xws = new XmlWriterSettings();
xws.Indent = true;
xws.Encoding = System.Text.Encoding.UTF8;
XmlWriter xw = XmlWriter.Create(outputname, xws);
xdoc.WriteTo(xw);
xw.Flush();
xw.Close();

就這幾行,把inputname及outputname指定了,就搞定了。

2010年9月30日 星期四

[aspnet]自行用程式讀取 excel 2007 的內容,需要的元件

又發現,在開發環境沒問題的東西,到了測試環境出問題的問題。
讀取 excel 2007 的確還是使用 oledb 來抓資料,用到的 driver,是

Microsoft.ACE.OLEDB.12.0

可是裝上 Visual Studio 2008 的開發環境可以,沒裝的測試環境就不行,那不是要我們把 VS2008 裝上去嗎?真是裝笑維嗎?

還好只要去找微軟把 AccessDatabaseEngine.exe 裝好就可以了。
謝天謝地

2010年9月15日 星期三

[aspnet]使用access 2007 x86, x64有不同

發生在跟同事整合web service遇到的問題。

嚴格說起來,就是在 OLEDB 底下,使用 Microsoft.ACE.OLEDB.12.0 這個 driver 存取 access file。

在他的電腦上都好好的,到了整合的時候卻出來

"The 'Microsoft.ACE.OLEDB.12.0' provider is not registered on the local machine"

當下決定,把 mdb 改成舊格式,driver 改成 Jet。

從此不想碰這種問題了。

可是,後來到了客戶那裡安裝程式,他的環境是 windows 2008 R2。居然會出現:

"The 'Microsoft.Jet.OLEDB.4.0' provider is not registered on the local machine"

這簡直是要我的命嘛!

就算裝了AccessDatabaseEngine.exe 也沒用,事情沒有這麼單純。

要感謝 google 幫忙,一下子就找到原因。那就是AccessDatabaseEngine.exe 現在只有 32bit 的版本。我們的OS都是32bit的,所以到了整合的時候才發生這個問題。

http://ybbest.wordpress.com/2009/07/22/the-microsoft-ace-oledb-12-0-provider-is-not-registered-on-the-local-machine/

改編譯方法之外變成x86,還是沒有用。還要更改 iis 的進階設定,讓 iis 能夠執行 32bit 程式才行,否則還是白談。

謝謝大家

2010/11/3 更新

2010年9月14日 星期二

[aspx]utf8完全征服

我們知道現實,utf8現在是網頁上處理多國語言及與 ajax 互動的文字編碼。我們非得處理它不可。

當你在 aspx 上面寫好 charset=”UTF-8”,並不代表你把工作都做完了。還有一些工作要做。

(1) 在 head 裡加上 <meta http-equiv='Content-type' content='text/html; charset=UTF-8' />
這只是告訴 browser 會是UTF-8。但是不代表我們傳送出去的真的是UTF-8,得要另外想辦法。特別是 ashx,也沒地方加這個東西。

(2) 如果使用 Response.Write 方式輸出,就要改變 Response 的編碼。
Response.ContentEncoding = System.Text.Encoding.UTF8;
Response.Write(something);
something 是 .Net 的字串(string)。因此,你得確定 something 是 unicode 編碼而不是UTF-8或其他系統編碼。如此 Response.Write 輸出才會是對的 UTF-8。

(3) 在網頁中的連結或 Query String,例如 <a href=”http://localhost.com/中文連結”>你的連結</a>。
這種你可以賭,browser不會幫你做urlencode,且原來編碼跟你伺服器預設編碼一樣。但是請不要這樣做。直接在位置列打的連結會被urlencode,而在頁面上的則視不同瀏覽器有不一樣的結果,再加上每個使用者的預設編碼不一樣,你會被搞死。因此,幫自己一個忙,在連結上的中文字串,記得用 System.Web.HttpUtility.UrlEncode(dotnetstring, System.Text.Encoding.UTF8) 做編碼的動作。如此的連結所產生的 Request,IIS會正確地翻譯回正確的 .Net string。Query String 也是一樣的道理,產生正確的 urlencode 給瀏覽器,當 Request 送回來的時候,直接取用 Request.QueryString 就會是正確的值了。

(4) 如果你有需要從別的網頁拿資料回來,而使用 WebClient 要求資料。如果確定對方回來的字串是UTF-8,直接使用
WebClient wc = new WebClient();
string response = wc.DownloadString(theURL);
response裡面會出現亂碼。要改成
string response = System.Text.Encoding.UTF8.GetString( wc.DownloadData(theURL));

你以為已經轉好UTF-8了,要怎麼測試呢?有一個字「菓」不在big5編碼裡,可以拿這個字來測試你的系統。

2010年9月13日 星期一

[xml]escape

為了要在 xml 裡傳遞另一個 xml。要把被傳的那一個先變成一般的字串。那麼,<, >, 這類的被 xml 拿來當做分隔符號的符號,就要被轉換成其他樣子啦。到底,有哪些符號需要被轉換呢?

原來 轉換
> &gt;
< &lt;
& &amp;
" &quot;
' &apos;

好像就這麼 5 個就行了。

2010年8月18日 星期三

[webdav]從windows7連上mac的webdav

mac的webdav設定,好像沒有GUI可以設定,所以,要先用指令的方式設定好。(http://manas.tungare.name/blog/howto-setup-webdav-on-mac-os-x-leopard-for-syncing-omnifocus-to-iphone/)

但是要注意的是,認證的問題。因為據說 windows 7 不允許使用所謂的 basic 的認證。不論是win7當server還是client(http://www.slickit.ca/2009/07/webdav-on-windows-7.html)。所以 AuthType Basic 這種設定是不行的。

請使用原來 conf 裡的設定,也就是

AuthType Digest
AuthName "webdav access"


然後使用 htdigest 來產生密碼檔,例如


sudo htdigest -c /etc/httpd/passwords/webdav.digest "webdav access" greg


如此就能從 windows 7 連上了。

2010年7月21日 星期三

[linux]ubuntu 裝好之後

在 ubuntu 裝好之後,第一個也是最重要的是加上無線網卡。
沒有網路的電腦,就是翅膀折斷的天使
現在的電腦怎麼沒有網路呢?
因為公司的環境已經是無線化了,所以買了個無線網卡。
本想說,特地買一個無線網卡上有寫支援 linux 的,一定就沒有問題。
我錯了,就是剛好 ubuntu 有問題。http://blog.tenyi.com/2010/06/rt2870rt3070linuxdriver.html

好,下一個就是要裝vmware player。這個裝好之後,
就可以把 windows 的裝進去,畢竟伺服器的維護不是我一個人。
也沒辦法執意說換 linux 就換 linux。若是我人不在,出現問題沒人能處理怎辦?
所以主要的伺服器還是得用 vmware 裡裝 windows。
那為何不直接裝 windows 當伺服器就好呢?
原因也很簡單。我買不起硬體 raid,我要用軟體 raid,windows 沒有。

另外,當 windows 每年推出新的產品,就把舊的產品線關閉。
每次功能上的改進,就代表原來的系統有轉移的必要。
windows 裡的功能要轉移若是沒跟上,之後就找不到工具可以轉移了,就變成所謂的遺產軟體。
在沒有原始碼的狀況下,很難用程式去轉移。
我已經累了不想每三年就換個電腦,就必須換 os,就必須把資料轉移。
雖然這是強迫整理資料的手段之一,資料久了就打不開,這是一定的,因為程式不能跑了。
每次換電腦都很痛苦…

[linux]ubuntu 與 EDIMAX EW-7711UMn USB無線網卡

以為解決了連線問題,從此就過著幸福快樂的生活了。
(參閱http://betabetaparticle.spaces.live.com/blog/cns!BBBC80E91904D8D!1365.entry
http://blog.tenyi.com/2010/06/rt2870rt3070linuxdriver.html)
錯!
看來這兩個星期的狂操(其實就是一直開著,不關機的 server 而已)
三不五時就斷線,後來查看 dmesg 就發現一連串的「裝置錯誤或移除」。
只要拔下來,再插回去,就會回復正常,但是不到一分鐘,就又出現斷線的情況。
反正我覺得它就是壞掉了。
希望黃色小屋可以讓我退,7/8買的,現在7/19,已經快過了兩個星期了。

[www]webdav是什麼?

最近為了公事,需要一些簡單的檔案分享。
生活在舊世界的我,當然會想到的就是ftp跟網路芳鄰。
當然我們也知道ftp現在很少人會想用,而網路芳鄰只能在區域網路內。
接下來就是往www常看到的功能去想。
為了要在www分享,我當然想說自己寫asp .net來做,卻感覺好像多此一舉。
不然就要找一個架站軟體,把它架起來,又覺得殺雞用牛刀,設定就搞死我了。
而且,將來維護要是沒人會,那我一個人怎辦?我又不是MIS每天只顧伺服器。

不小心看到一個名詞對我來說很新鮮,叫做 webdav,好像可以滿足我的需要。
查了半天,資料從1999到2003就沒了,難道後來都沒人用了嗎?
或者是,大部份軟體都內含進來了,所以就不再大聲討論了嗎?
這個答案我不知道,也許接下來幾天我會看到正確解答。

是的,就在幾天後,我看到了 IIS 裡,已經內建了這個功能。
http://technet.microsoft.com/zh-tw/library/cc781730%28WS.10%29.aspx
http://blog.l-penguin.idv.tw/archives/589

當然,Apache 也有 webdav 的模組
http://andres.jaimes.net/setting-up-a-webdav-server/
http://smallken.no-ip.org/blog/2009/03/22/linux/ubuntu/1232.html

Mac 的用戶,也不用擔心。同樣也能當 webdav 的 server
http://manas.tungare.name/blog/howto-setup-webdav-on-mac-os-x-leopard-for-syncing-omnifocus-to-iphone/

改天再來試。

ref:
http://en.wikipedia.org/wiki/WebDAV

2010年7月19日 星期一

[trac]幫trac加上svn功能

前文所講的最簡單安裝,不含svn功能。而這個功能,大家都是很想要的。該如何做?

(1)安裝svn server,網路上就有很多不同的方法。最偷懶的就是裝 VisualSVN Server。http://www.visualsvn.com/server/download/  下載VisualSVN-Server-2.1.2.msi。別跟 VisualSVN 搞錯喔,請認明 Server。

(2)安裝 svn-python 的 binding。http://subversion.tigris.org/servlets/ProjectDocumentList?folderID=11129&expandFolder=11129&folderID=91  下載svn-python-1.6.6.win32-py2.6.exe。別跟 PySVN 搞錯喔,請認明svn-python

(3)接下來就是設定了。

2010年7月10日 星期六

[www]什麼是 REST ?

這一篇算是一個研究心得,寫來自己備忘用的。

REST 不是 take a rest 的意思。他來自於 Representational State Transfer 的縮寫。然而,這又是什麼意思呢?

大多數的說明,都說 REST 是一種風格,一種軟體架構的風格,一種適合分散超媒體系統的軟體架構風格。分散超媒體的原文是(distributed hypermedia),最常舉例的標準範例系統就是 World Wide Web。

REST 風格的架構,由許多 client,及許多 server 組合而成的。講到 client/server 架構的話,就是由 client 主動送出 request,而 server 送回 response。這個是目前大家認同的模式,若要求 server 送 request 而 client 送回 response,就不屬於這個定義了。Requests 及 Responses 來回傳送的目的,環繞在傳送「資源」的「外在表現」。原文是 Requests and responses are built around the transfer of "representations" of "resources".[參考2] 。資源(resource)基本上是任何有相關有意義需要被注意的概念。而「資源」的「外在表現」(A representation of a resource),基本上是一個代表資源的現在狀態或即將狀態的文件。這一段儘量照翻參考2的文章,對我這個中國人來說很痛苦。不了解的人還是不了解啦。

 

參考:
http://www.infoq.com/articles/rest-introduction
http://en.wikipedia.org/wiki/Representational_State_Transfer
http://tomayko.com/writings/rest-to-my-wife
http://lightyror.thegiive.net/2007/04/rest.html
http://ihower.tw/blog/archives/1542
http://207.22.26.166/bytecols/2001-08-15.html
http://www.xml.com/pub/a/2004/03/17/udell.html
http://zh.wikipedia.org/zh-tw/REST

2010年7月5日 星期一

[python]class method

python 也有 class method

用法:
class A:
  classVariable1
  @classmethod
  def thisisclassmethodsetter(cls,para1):
    cls.classVariable1 = para1
  @classmethod
  def thisisclassmethodgetter(cls):
    return cls.classVariable1

我接下來想要 c# 的 partial class 及 extension method 了,怎辦?

2010年6月28日 星期一

[trac]幫trac加上使用者

根據前文所示,剛裝好的 trac 是沒有使用者的,也就是說,都是匿名使用。要加上使用者,且對其認證。就參考 trac 的手冊的 http://trac.edgewall.org/wiki/TracStandalone#GeneratingPasswordsWithoutApache

(1)把該頁中的示範 py 的內容 copy 下來,存成 trac-digest.py,然後照樣造句,把想要的使用者加到密碼檔中。username,password 要自己改成想要的 username,password 喔
> trac-digest.py -u username -p password >> c:\digest.txt
(2) tracd 啟動的時候,要加入新的參數,也就是
> tracd --port 8000 --auth tracproject,c:\digest.txt,trac c:\tracproject

(3) 接下來用瀏覽器進到專案位置,按下登入,應該會出現登入的 form,做的很像 windows 的登入。要是不成功,那就試著重開機一次。如果還不成功,我也不知道該怎麼辦了。

[trac]安裝trac

trac是一個 wiki 及 issue 追蹤系統。
很早之前就耳聞,也很想裝一個。但是都沒有空去弄它。
現在,必須要管一個專案,我想要弄一個這個東西來試試。
沒想到,安裝不如預期的簡單,被搞暈了。
這裡是最簡單的安裝。

trac 的首頁是 http://trac.edgewall.org/
(1)下載python,我選擇 python2.6 http://www.python.org/download/releases/2.6.3/,python-2.6.3.msi
(2)首先到下載區 http://trac.edgewall.org/wiki/TracDownload 下載 windows 安裝包Trac-0.12.win32.exe
(3)再來需要python的setuptools,在http://pypi.python.org/pypi/setuptools,選 setuptools-0.6c11.win32-py2.6.exe
(4)最後需要Genshi。在http://genshi.edgewall.org/wiki/Download,選Genshi-0.6.win32.exe

先安裝 python,之後就可把其他三個安裝上去。
再把C:\python26, C:\python26\scripts 加到系統路徑裡
就可以用> trac-admin c:\tracproject initenv 來試試建立一個專案。
其中會問你 Project Name,及 database connection string。
最後就可以用> tracd –port 8000 c:\tracproject 來啟動服務。
接下來用瀏覽器輸入網址 http://localhost:8000/tracproject
就可以看到第一個頁面了。

當然安裝還有其他選擇,我就是被很多選擇搞到頭暈了,所以其他安裝選擇,下次再說。

2010年6月24日 星期四

[軟體開發]什麼是B/S, C/S

現在越來越多的軟體書,來自於大陸。有些翻譯名詞還真的看不懂。不過,這次 B/S, C/S 這種縮寫,我之前還很少看到,一下子反應不過來。這種習慣縮寫,真的只是「經驗」而已。

經過偉大的孤狗,它告訴我,B/S 是 Browser/Server 的縮寫、C/S 是 Client/Server 的縮寫。這兩個縮寫主要用在軟體開發這裡。

B/S (Browser/Server) 這字面上指出,軟體開發架構為一個瀏覽器加上一個伺服器。不言而喻,就是符合現行www規格的瀏覽器,及一個符合現行 http 1.1 的伺服器。再更詳細的規格就不寫下去了。

C/S (Client/Server) 這個相對於上面的來說,就更廣義了。

先到這樣。

參考:http://englishvod.anyp.com/ujiachang/33680-355826.aspx

[aspx]想要顯示xml在網頁上

我以為這個不會是問題,就很簡單的把xml字串放進textbox裡,不就得了嗎?我錯了。
當textbox的內容是空的,可以。但是,textbox已經有上次的資料時,就會出現…
image 
asp.net很聰明地告訴你,這樣不行,有人曾經這樣就中標了。
好,那我把xml字串用server.htmlencode之後,總沒問題了吧!
image
見鬼啦,encode過的東西,瀏覽器怎麼沒有把它轉回來?
image
難道在textarea裡的,就照樣列出,那,xml字串為什麼又出問題?
我真的搞不懂啊!
我現在用我可以想到的方法,就是用Literal來顯示,只是不好看。

2010年6月13日 星期日

[webcam]用winapi使用webcam

為了要使用webcam,網路上講了很多方法。由於我的目標平台是windows。所以首先選用winapi應該是最穩的。可是我覺得我錯了。

我在window2003底上開發的c#程式,開關程式都沒有什麼問題。但是拿到win7執行之後,程式打開再關掉,再打開,程式就會抱怨webcam被佔用了。就再也無法連上了。

接下來還可以試的就是

(1)善心人士打包好的 DirectShowLib,這個是給點網架構的 directshow 函式庫。
(2)善心人士處理好的 opencv 及 EmguCV。opencv 是圖形影音處理的函式庫,EmguCV 是將 OpenCV image processing library 打包成點網可以用的函式庫。

感謝善心人士的分享,這裡有初級範例可以抄:
http://www.dotblogs.com.tw/chou/archive/2009/06/13/8812.aspx

完畢

2010年4月13日 星期二

[www]頁頭 DOCTYPE 有無宣告差很多

今天又搞了一天。
就只是這一行:
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
來看一下,有跟沒有的差別:

沒有加的如下圖
image

加了之後如下圖
image

還好現在還可以不加宣告,只是以後就過不了 xhtml 的驗證了…。以後再想辦法吧。

俗話說的好,把舊的系統改成新的,就是要注意別把原來的東西弄壞了。做舊系統的成就感真的很低…,因為別人不在乎你花了多少時間把東西改好,因為從外面看起來都一樣。其實改的人在裡面踩地雷踩大便很辛苦的。

[www]頁頭 DOCTYPE 有無宣告差很多

今天又搞了一天。
就只是這一行:
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
來看一下,有跟沒有的差別:

沒有加的如下圖
image

加了之後如下圖
image

還好現在還可以不加宣告,只是以後就過不了 xhtml 的驗證了…。以後再想辦法吧。

俗話說的好,把舊的系統改成新的,就是要注意別把原來的東西弄壞了。做舊系統的成就感真的很低…,因為別人不在乎你花了多少時間把東西改好,因為從外面看起來都一樣。其實改的人在裡面踩地雷踩大便很辛苦的。

2010年4月2日 星期五

[asp.net]ajax toolkit

不曉得是我胃口太糟還是心情不好,當我終於下定決心要把 ajax control toolkit 下載回來的時候,一整個不爽。

當我從 http://www.codeplex.com/Wiki/View.aspx?ProjectName=AtlasControlToolkit 把檔案下載完,依照頁面上說,要到 http://www.asp.net/ajax/ajaxcontroltoolkit/samples/ 看一下有 demo 可以看怎麼做。我跳到那一頁之後,又看見 「To get started, and to install the Ajax Control Toolkit, visit the AJAX Control Toolkit Project Page on CodePlex.」。是裝笑維喔,又跳回來是怎樣!

好,這裡不只是要抱怨,這個世界只怕有心人。我就每一個連結都按!
原來就是在 samples 這一頁裡面,就是這句「To learn more, read the Getting Started Tutorial, or the other walkthroughs, tutorials and videos shown on the left.」,按下去之後就是了。

雖然,我知道我以後一定是只用 jQuery,但是為了怕以後去踩到 asp.net 的安全陷阱,所以先要看一下如何正確註冊用戶端的東西、如何寫伺服端的ajax控制項。畢竟包成控制項給同事,他們會開心一點。
完畢

2010年4月1日 星期四

[asp.net]web user control 網頁使用者控制項 與 GridView 的 PagerTemplate

asp.net 很甘心的給了我們 ascx 來包裝現在控制項,它可以放到工具箱內。在使用的時候,會遇到一些問題,而解法不是這麼直覺。

(1) 在 ascx 裡面,使用 gridview,想要改變 pager style 我們會把想要的格式寫在 <PagerTemplate> 裡面。
(1.1)如果,只是寫個固定的字,就直接寫吧
<PagerTemplate> 日期: </PagerTemplate>

(1.2)如果,要加個變數值,就用 <%= .. %> 加進去
<PagerTemplate> 日期: <%=DateTime.Now.ToString("yyyy/M/d") %> </PagerTemplate>

(1.3)如果,在裡面,想用 asp.net 的元件,像是 TextBox,要顯示文定,就照以前那樣寫
<PagerTemplate><asp:TextBox ID="txt1" runat="server" Text="txtvalue1" Columns="4" /></PagerTemplate>

(1.4)如果,想要顯示變數的文字,<%= .. %>這招就不能用了,要用<%# .. %>
<PagerTemplate><asp:TextBox ID="txt1" runat="server" Text="<%# GridView1.PageCount +1 %>" Columns="4" /></PagerTemplate>

(1.5)如果,想要拿到 txt1 的 Text 的內容,頭很大。在 visual studio 2008 的編輯環境,你看不到 txt1 這個 ID。在Request.Form 裡面,txt1 的 ID 是一個變動的值。我的作法是用 GridView1.BottomPagerRow.FindControl("txt1")) 把它挖出來,再轉型、再取值。

(1.6)如果,想要產生按鈕效果,用<asp:Button /> 的話,當你按下去的時候,就會出現錯誤 (註),目前我是用 <asp:LinkButton /> 來躲開這個問題。
asp:LinkButton ID="Button_Move" Text="Move" runat="server" CommandName="Page" CommandArgument="<%#pageIndex %>" />
這個按鈕按下去,會拿到 GridView1_RowCommand 事件。有 GridViewCommandEventArgs 可以拿到 CommandArgument,就做想做的事。CommandName 如果不是 "Page" 我也不確定會不會動。

(註)
出現的錯誤如下

無效的回傳或回呼引數。已在組態中使用 <pages enableEventValidation="true"/> 或在網頁中使用 <%@ Page EnableEventValidation="true" %> 啟用事件驗證。基於安全性理由,這項功能驗證回傳或回呼引數是來自原本呈現它們的伺服器控制項。如果資料為有效並且是必需的,請使用 ClientScriptManager.RegisterForEventValidation 方法註冊回傳或回呼資料,以進行驗證。

這個錯誤我看了很多討論,一般人就是把 enableEventValidation 設成 false 就過去了。然而事實上我們不能在正式環境中就這麼隨便。
當然也有人抱怨這錯誤訊息有看沒有懂,也有人說寫的很清楚。我的看法當然是「我看不懂」。
當我遇到這個錯誤的時候,它說明了,我要用ClientScriptManager.RegisterForEventValidation 方法來註冊。請問怎麼用?我在環境中沒有看到 ClientScriptManager 在 aspx 的哪裡?還是在 ascx 的哪裡?註冊參數怎麼給?我找到有人寫是用「Page.ClientScript.RegisterForEventValidation」,我就拿這個東西開始試。我試了我想過的在 ascx 的 page_load 區塊給 gridview 的 unique id,在 aspx 的 page_load區塊給 gridview 的 unique id,我看到有人說在 aspx 的 render區塊給 gridview 的 unique id 或是給 button 的 unique id,通通不行。找過 msdn 也沒有看到該怎麼辦。花了兩個工作天搞這麼久之後,我無聊換成 LinkButton 就沒事,我的結論就是「爛」,然後就用 LinkButton 當沒事。當然我相信一定有正規的、微軟設計好的步驟來處理這種事情,只是我還沒找到。我也期待哪天,我會看到解法,然後我就會很開心地用微軟的東西。

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();

[SQL]SQL Server Express 連線字串

有個好網站可以參考
http://www.connectionstrings.com/sql-server-2005

目前我的組態是 IIS, ASP.NET, SQL Server Express 2005 都在本機。
ASP.NET 固定所使用的 username 據說是 NT AUTHORITY\NETWORK SERVICE
所以要把這個帳號加到 SQL Server 去。可參考
http://social.msdn.microsoft.com/forums/zh-TW/240/thread/011579f2-d3a6-4c2b-a7dc-b689d1e08acc

現在測試過成功的字串是
server=facetdev\sqlexpress;database=facetdb;integrated security=SSPI;

不成功的字串是
server=facetdev\sqlexpress;database=facetdb;uid=administrator;pwd=;
出現 error 為
使用者 'administrator' 的登入失敗。

若出現 error 為
當發生使用者 ' username ' 登入失敗。 使用者將無法與受信任的 SQL Server 連接相關聯。
則是要把 SQL Server Express 的認證模式改為「 混合模式 (Windows 的帳戶驗證 」 及 SQL Server 帳戶驗證) 」
可參考
http://www.dotblogs.com.tw/dotjum/archive/2009/03/31/7769.aspx

2010年1月12日 星期二

[www]html table column寬度不受控制

當table總寬度比整個畫面寬的時候,光是設定 th 或 td 的 width 還是不對勁。
還要設定 table 的 width 的總寬度,這樣才會是自己想要的樣子。

可以看 w3 對於 column width 的定義:
http://www.w3.org/TR/CSS21/tables.html#auto-table-layout

搞了整整兩天

2010年1月8日 星期五

[javascript]指定frame的location

parent 是指目前frame的上一層
top 是指最高的一層