2009年6月30日

探索 SqlCommand.Parameters.Add 定義資料值長度

其實這個問題也是老早之前就遇到 (大概一年半前吧...)
所以這兩天坎尼又重新測了一下問題發生的原因

先講一下這次的問題所在
SqlCommand.Parameters.Add 有個多載是可以傳入參數值的 size
但在 varchar 的狀態下,傳入中文並不會把值鎖定在 10,以至於系統拋出了例外

先來看範例,首先是資料表定義,有個 varchar(10) 的欄位

接著是可正常運作的範例

相信大家都知道,中文字在 varchar 中會佔 2 單位
所以6個中文字以上的字串,是無法新增至上面所定義的欄位表


當時坎尼就是遇到要把中文字存到 varchar 的欄位中
但很明顯的,size參數完全起不了作用
而且同事還說要不要用 String.SubString 的方法把資料截斷啊?

年幼的坎尼還真的照做了,但問題依舊存在
正確的做法應該是要先轉成 byte[] ,再將資料截斷送入

原本的 "無敵鐵金鋼2" 就被截斷後再送入資料庫中

但這個解法只限於傳入的值皆為 2bytes 的字
一但需截斷的資料中有1byte的字,就可能發生中文字被腰斬的情況



上面談了這麼多
是不是要證明 SqlCommand.Parameters.Add 的第3個 size 參數沒有用呢?
當然不是,它當然有用,只是在上面範例中不適合
其實只要把字串改成全為英文,Parameter就會自動把超過的字串切掉



上述例子中沒有作用的原因為:
中文字才6個,還未達到Length=10的瓶頸
但又因為中文字每個字代表2bytes,所以早就超過資料表裡的限制
中華文化博大精深,一般人尚無法精通,何況電腦

字串切割會以字的數目,而非字所佔的容量
「一二3四五」和「12345」同樣是算 5 個字
用 String.Substring(0,6) 即會拋出 index 不符的例外

但其實上述的範例真正的解決方式為...
應將有可能出現中文字的欄位設為 nvarchar,且前端要針對輸入的字作控管

最後補充一下小小的發現
上面 Table 裡的 ID 值是用遞增方式,但卻少了 2,難道是坎尼自己偷刪嗎?
其實是上述的測試中,坎尼故意傳了大於欄位長度的值進去,因此在 Sql 方面出現例外
不過遞增值的 flag 似乎自動加一了? 所以才會跳過該數字

創新,啟動新未來(Google the Future)研討會心得

上週(6/23)去參加數位時代主辦的 MIT 論壇 (Meet The Innovator) – Google the Future,適逢數位時代成立十週年,於是他們請了也成立剛滿十周年不久的 Google 搜尋產品與使用者體驗副總裁 – Marissa Mayer 來演講。在演講開始前是記者會,iThome 有相關報導(介紹 Google 的新產品,以及未來發展),另外在地圖日記也有一篇報導(如何選擇新創公司、對於工作的態度等),裡面的內容我就不再贅述了。

大體上演講內容頗平淡的,主要在介紹 Google 推出了哪些新的服務,跟 User Experience/UI Design 一點關係都沒有(=.=|||),適合沒空 follow Google 產品趨勢的人很快的了解一下 Google 最近在做什麼新東西。

以下是我比較有印象的新產品/服務:
  • Google Fusion Tables (Pre-Alpha)
    找不到繁體中文的報導,就看一下官網的 TourFAQ 吧,這個 service 的目標是 import and visualize table data online, share and collaborate in real time, and visualize it instantly。初期會與政府機關合作(當然是先從美國開始),將一些公開的統計資料(人口分布、經濟數據等)匯入這個服務,以促進知識的流通、加速科學研究、協助制定決策等等(visualize public datasets to stimulate academic research)。以這個2006年全球淡水供應量的資料為例,只要點選 Visualize Menu 下的 Intensity map, 就能看出全球淡水的分布圖,如此可以很快的掌握這些資料的涵義,以用來產生更深入的 insight。

    感覺這個產品像是 Google Spreadsheets + Google Visualization API 做出來的,也可以很方便的把產生出來的網頁 embed 到其他網頁(blog、news)中。
  • Google Squared
    功能請參考 iThome 報導- Google Squared可自動幫忙整理搜尋結果,原理是 Google 會對你的搜尋結果再進行一次重整(Google will google your google search result to produce a comparison table),要產出這個對照表,Google 必須了解網路上各種非結構性資料的 structure,並從中萃取出相同的事實(fact)加以比較(extract fact from data)。這個 service 對於網路購物,或者科學研究應該都會有很大的幫助。
演講之後的 panel discussion 有趣多了,從 Google 的未來展望聊到公司如何鼓勵並管理創新、男女員工比例等等,以下是我印象比較深刻的討論:
  • Google 的未來展望
    Google 會持續專注在「搜尋」這個核心能力上,由於搜尋這個問題距離完全被解決還有很長的路要走,所以 Google 未來還有很多可以改進的地方。經過分析以後 Google 發現,網路上約有 5% 的流量是 search,就過去的經驗來看這個 5% 可說是一個不變的常數(這也是 Google 最穩定的 money maker),因此要持續增加營收就必須把餅做大(讓更多的人上網瀏覽網頁),因此對於郭家齊提問的「Google API 未來是否會收費」,答案是不會,因為收費對於「把餅做大」不但沒有幫助,反而有害,這也是為何越來越多 Google 產品都朝向 open source 的方向來走的原因之一。
  • Social Network 的 Business Model(如何變現)
    從上面的分析中可以看出,Google 相信只要有流量就可以找到變現的方法,就目前的趨勢來說,透過朋友間的購物推薦(recommendation)和合購(可以折扣、殺價)會是個很不錯的應用,平台業者可以從中獲利。
  • 如何鼓勵並管理員工創新
    Google 最有名的是員工每週有 20% 的時間可自由決定要做什麼 project,而且也可自由決定是哪 20% 的時間要拿來做自己的 project。這跟之前聽過的 TrendMicro(趨勢科技)安排工作的哲學類似,資方不會千方百計的設法壓榨員工,而是給予員工適當程度的自由,和一些彈性,這樣創意才有成長的空間。至於這種經營哲學是否對公司的成長有(顯著的)幫助?看看 Google 的營收就知道啦。

    至於如何管理員工的創新,Marissa 有特別強調 Google 內部的資訊是非常的透明公開,隨便一個人都可以看的到即時的銷售數字,把 information sharing 的機制建立起來之後,讓所有員工看到這些資料,才有可能一起思考如何解決客戶的問題、提高營收、公司未來走向等等。

    在開發產品的部份,不外乎就是新產品要在內部廣泛試用,並且 release early, release fast, fix fast(就是走 agile 那套啦),這樣就能做出優秀的產品。(突然想到,Google 都是強調公司內如何創新,而 Microsoft 則是會不斷強調要找出新方法來滿足客戶的需求,這點不太一樣。)
  • 如何判斷新創公司能否成功
    相信大家都希望畢業後進到一個賺錢的公司上班,對 Marissa 來講, 當初她怎麼有信心 Google 會成功呢?她認為,不管公司經營的結果是好是壞,在工作的過程中一定會學到很多寶貴的經驗,一定要熱愛你的工作,並且能夠從工作中獲得很大的成就感,這才是最重要的。

    至於如何找到一間未來具有很大成長潛力的公司,她認為這間公司的核心願景必須要是為了解決一個大家都會面臨到的大問題,例如 Google 的 mission 是「to organize the world’s information and make it universally accessible and useful」,這是個到目前為止還沒有被解決的大問題,由於這個大問題太難解決,表示「完全」解決此問題的價值非常非常高,因此只要突破一小部分的瓶頸(部分、初步解決)就可以帶來很大的成功,讓公司可以繼續往最終目標邁進。
  • 如何維持健康的男女員工比例
    就 Google 內部的資料來看,若男女性員工比例接近 1:1 是最好的,而在 engineering department 中,女性工程師的人數若能維持在 25% 左右是很理想的。一開始 Google 都把這比例維持的很好,但是在 Google 快速擴張的時候,曾經 engineering department 中的女性工程師比例一路下滑到 20% 以下,一直下滑到了 16% 的時候 Sergey 就做了一個「停止招募新的男性員工」的決定,並且調了幾位女性員工來擔任招募的工作,一直到男女比例回復到 20% 以上,才再度開始招募男性員工。從這件事情中他們也發現,要請男性招募女性是比較困難的,要招募女性員工最簡單的方法就是請女性來負責招募。

就 panel discussion 中英文口說的部份,朱學恆的英文不錯(而且中氣十足),Alvin 講話是含滷蛋的,郭家齊的英文有個口音,楊致偉的英文還不賴,主持人王致仁整場負責即時口譯,雖然在翻譯 SearchWiki 的時候出了個難以想像的大包,但除此之外都還不賴啦~

最後做個簡單的總結,我覺得 Google 是一間很棒的公司,希望他們能夠持續創造更好的產品(例如 Google Wave),同時也不要違背他們 You can make money without doing evil. 的信念。

2009年6月20日

在 .net 2.0 專案裡使用 Chart Control

雖然 Chart Control 要用 vs 2008 sp1開發
若是以前用 vs2005 開發的專案,在部署到 Server 上時
也能把 Chart Control 放上去喔 :")

首先,要釐清一下,開發仍是要用 vs 2008
只是開發完的頁面可以加入至 vs 2005 的專案中再發佈出去
(當然不能用新語法,且專案類別要設定成 .net framework 2.0)

所以這邊坎尼建議,若是沒什麼顧慮
就用 vs2008 把原本用 vs2005 開發的專案打開吧
再建立有關 Chart Control 的頁面

首先將開發好的專案放到要部署的機器上

到 MS Chart Control 的安裝資料夾裡找到 System.Web.DataVisualization.dll
複製一份到專案的 bin 資料夾下

在 web.config 裡加入以下的設定 (請點圖放大)

加入下圖的 appSettings,兩者擇一即可
url=~\imgs\ 將圖片暫存設為目前專案下的 imgs 資料夾
dir=c:\TempImageFiles\ 則是把圖片暫存放在 Server 的 c 槽下



完成上述的設定後,打開專案看一下目前的成果吧 :p
利用 Chart Control 設計的頁面應該可以順利呈現囉!!!!

若是出現 ChartImg.axd 的錯誤訊息,請確認上述的設定是否正確

最後補充一下坎尼剛剛在抓圖的發現
原來 Chart Control 在 Windows Form 裡也可使用,有機會再來研究看看 :D

2009年6月19日

解決 Cannot convert type 'ASP.login_aspx' to 'System.Web.UI.WebControls.Login'

由於最近有些系統在搬遷
原本在舊 Server 上運作很順利的系統,一搬到新 Server 瞬間掛掉
出現的訊息還是沒看過的 source code,這到底是怎麼一回事呢?


坎尼開了系統上的 Login.aspx.cs 想找上圖裡錯誤訊息
卻發現根本沒這段 code,七月還沒到,怎麼阿飄自己先來啦?

把錯誤訊息丟上網才發現,原來是 partial class 惹的禍
.net 2.0 新增的 Login 控制項剛好 class name 也是叫 Login
所以兩個名字一樣的就要有一個去鄉公所改名啦

把 class name 及 aspx 的 inherits 改掉即可成功在 Server 上運作



但坎尼覺得還是很奇怪,怎麼舊的Server都沒這個問題呢?
明明兩台的環境都是 windows server 2003 sp2

後來發現原來是新機器的 .net framework 2.0 還沒裝 sp
裝上 .net framework 2.0 sp1
連程式都不用改!!! 問題解決!!!!


同樣的問題也會發生在命名為 Menu 的頁面
記得至少要把部署機器上的 .net framework 2.0 升級到 sp1

2009年6月8日

乘法矩陣第2發 - 用 javascript 做運算

上一篇用 excel vba 做矩陣運算
坎尼這兩天又用 javascript 的方式再修改了一下

先給個 demo 連結

從連結進入後,可以看到頁面上已經亂數產生了兩個矩陣
上面有一些矩陣的設定值及功能按鈕

數字範圍為程式要產生的亂數值範圍
若要自訂矩陣大小,可先填入左上角的矩陣大小
再點選建立自訂矩陣功能即可產生使用者設定的矩陣

若是產生的數字不喜歡
可直接點選 table 的格子做修改

點下計算答案即可算出前兩個矩陣的結果


整個程式結構和 vba 版本很像所以就不講了
唯一有變的就是計算結果的演算法,有興趣的人就自行查看原始碼囉

要對照答案是否正確,可以上 WIMS Online Matrix Multiplier

另外自訂矩陣經坎尼測試,大概 50 x 50 的計算都還沒問題
但如果設定太大把瀏覽器資源吃光光坎尼可不負責
(坎尼試過 450 x 450 畫面跑了好久才出來)

2009年6月3日

Excel VBA 作矩陣相乘運算

雖然到最後你還是沒留下你的名字...


今天就來介紹一下,如何用程式撰寫多維矩陣乘法運算

首先要了解一下矩陣乘法的計算方式
  • (m1 x n1) * (m2 x n2) 結果會是 (m1 x n2)的矩陣
  • 上例中的 n1 = m2
  • 矩陣乘法位置互換結果就會不同
(大家可以直接點上方的 wiki 連結,裡面有更詳盡的介紹)

接著就是回到 Excel 啦
首先在 Sheet 上佈置一個 CommandButton
(沒看到的話,請到工具列→點右鍵→把設計工具箱打開)
然後在 Sheet 的儲存格上隨意填入一些值,等等要來當作矩陣的輸入值

接著在 Button 上點兩下進入 VBA 編輯畫面 (記得要在設計模式)
然後就是進入 VBA 的程式撰寫啦 >w<
  • 首先用 Application.InputBox 方法讓使用者選取畫面上的儲存格,Type=8表示回傳值為 Range 物件
  • 取得兩個 Range 物件的 Row Count 及 Column Count (切丁備用)
  • 依前面的規則判斷是否可運算 (範例裡的 M1C 要等於 M2R)
  • 建立兩個陣列物件,並將長度指定為第一個矩陣的 Column Count (或是第二個矩陣的 Row Count,它們兩個應該要相同)
到目前為止應該還算ok吧???
接著就是如何去計算結果矩陣裡的值
坎尼是用 wiki 裡提到的 這個方法

AB (結果矩陣) 中的 (1,2) 這格就是用 A 的第1列乘上 B 的第2欄

用下面這個動畫圖應該可以了解 (圖片來源:Scalar and Matrix Multiplication


所以再回到程式裡
坎尼用了兩個 For 迴圈將目標裡的值一格一格算出來
先是取得第一個矩陣的第一列(一維陣列),再去乘上第二個矩陣裡的一行(一維陣列)
可以得到結果矩陣第一列所有的值 (傳入 CellValue 裡計算)

接著再抓第一個矩陣的第二列去乘上第二個矩陣裡的每一行....以此類推

CellValue 是坎尼用來計算結果值的 Function
傳入兩個陣列即會把對應的 index 值相乘,最後再加總回傳 (回顧一下公式)


再來就是執行結果,先把模式改為執行模式 (點一下設計工具箱的三角板)
點「選取陣列」的按鈕,就會跳出選擇矩陣的方塊,此時可以在 Excel 儲存格上選取

矩陣1選完會再要求選擇矩陣2
記得,(m1 x n1) * (m2 x n2) 裡的 n1 = m2

選完之後,若是可以計算的兩個矩陣,會出現提示

Sheet2 裡果然有值

但是答案是否正確呢?
大家可以上 WIMS Online Matrix Multiplier 把相同的矩陣丟進去算算看
或是拿起筆來自己算吧 XDDD

由於中間省略了很多步驟,可能沒寫過 VBA 的人不知道坎尼在幹嘛吧 XD
坎尼今天上網有看到一個不錯的 Excel VBA 教學站 威廉博客
有興趣想學 Excel VBA 的人就過去看看吧 :D

矩陣這東西離坎尼好久遠了,好在有前人種好的大樹 - wiki
K了兩個晚上總算是有點成果
但是否還有更好的程式邏輯就請路過的大師們指教啦 哈哈哈
範例程式下載 要使用範例請先允許巨集執行

另外就是歡迎讀者發問
不過請留下可以連絡的方式,有時坎尼看不懂問題會睡不著覺啊啊啊~
另外要交作業的請不要問坎尼,這可是要收錢的,很貴的

Google Spreadsheet 裡用規則運算式

最近因為工作關係,遇到要用 Google Form 及 Google Sheet 所以研究了 Google Sheet 裡的一些 function 怎麼用 首先,分享一下如何在 Google Sheet 裡用規則運算 :D