發表文章

目前顯示的是有「程式」標籤的文章

[電影心得] 社群網戰 (The Social Network)

看了這部片,真的覺得科技人都應該看一看 電影的腳本是來自小說,雖然有作一些修改 但在主要劇情上,大多符合事實, 至於主角各人性格、私生活部份,看看就好了 ※抓住人們的需求 主角身在哈佛大學,平日和同學們的互動,也是觀察人們需求的機會,學校的生活在某種程度上,也算是一個小型的社會,由此出發點,主角在學校裡擬了一套社群生活會有的行為,也弄清楚了,人們的需求是什麼 ※網路服務最大的障礙還是在於錢 創業當然需要錢,很多人說程式設計是無本生意,不需要進貨,幾乎無庫存成本,但是提到網路,情形就不同了,舉凡維護主機、租用頻寬、管理域名,甚至要蓋機房,讓機器吹冷氣,這些都需要錢,雖然現在有很多免費的網路空間、服務,但想做大事業的話,其實還是不太夠的 ※先在特定族群試水溫 主角一開始先讓他的網站只能在哈佛使用,再逐步擴張,這對於財力及人力都有限的他,能夠先將焦點著重在需求上,而不是為了頻寬、維護疲於奔命,這也和現今許多網路服務先採用推薦制一樣,可以先掌控使用族群,也可以避免負面評價成長的太快 ※成功的定義 主角很清楚他的一開始目的不是賺錢,甚至有人收購也不賣,這和許多個人創業的軟體工程師不同,另外,他也不知道他的網站可以長多大,如果在小有成就時,就開始急著賺錢,就像他說的,很可能會毀了它,以主角的例子,在一個個人創業的情況下,其實每個階段都可以算是成功的,但他太早放手的話,可能就提早結束了 ※合夥人難求 知己難求,真的沒錯,劇中的 Napster 創辦人或許是為了商機接近主角的,但至少他們的某些理念是契合的,對於科技人而言,能找到一個和自己想法接近的人,有時候是不容易的,也難怪他會這樣對他的金主同學。 這部片真的很不錯,對我而言,它不單單只是電影,甚至可以當做教材

[筆記] 一些常用的 Shell Script 指令分類

找檔案: ls (這不用說吧) ls -1 (是 1,2,3,4 的 '1',僅列出檔名) ls -l (列出詳細資料) ls 配合 grep (這也沒什麼好說的) find (強大的找檔案工具,在不知道的情況,至少記得 -type -name -iname) find  -delete (找到的檔案刪除,簡易的刪檔方式) 批次執行: find  -exec  (可以逐個執行) for i in xxx; do 指令; done (方便實用,客制化高) xxxxxx | xargs   (xargs 可以把前面的結果串接起來成參數,適合執行的程式可一次接多個參數使用,不過要注意 xargs 能吃的參數個數有限,不要太誇張) 尋找字串: grep (這一樣沒什麼好說的, 加上 -i  可忽略大小寫) grep -r (遞迴搜尋,注意如果 grep 的參數已經是指定特定檔名時,則遞迴會失敗,這種情況建議使用 find 搭配 -exec grep 使用) grep -v (過濾掉找到的結果) grep -l (僅顯示找到結果的檔名) grep -E (使用正規表示式搜尋) sed (可將搜尋的文字做特殊處理,支援正規表示式) 欄位處理: cut (簡易的分欄) awk (awk 功能強大,拿來做欄位處理很好用,當然還有更多用途) 擅用這些指令,能夠完成相當多的事情

[經驗] 開發時應該考慮的大量資料問題

前陣子接手的一個 android 程式 它出現幾個我無法接受的問題 資料量大時 Crash 捲動速度慢 在程式的開發初期,因為時程趕,一切以功能優先 在這種情況下,忽略了幾個問題: 效率:因為初期沒有實體機器,都是用模擬器開發,勿以為在實機上就一定會夠快 記憶體:有些老師可能會跟人員說,Java 不用像 C 一樣管理記憶體,它會管理的很好,但是它還是不能讓開發人員亂寫的,在這裡,記憶體使用的問題也是被忽略了 大量資料:在開發功能階段,往往都只用個位數的資料在操作,但是如果沒考慮到資料量大的情況,到時就很難處理了 合理的行為:制定規格的人本身沒有足夠的使用 android 經驗,天馬行空的設計自己想要的 UI 行為,造成許多開發上的困難,甚至做出一些對架構不利的改動 在此只針對大量資料帶來的效能及記憶體問題,提出解決的「想法」 想法實際上比做法更為重要,我強調在處理這些問題時,應該有清楚的想法, 而不是只是抄別人的做法 方向: 對於重覆的資源,做有效的管理,避免浪費過多的重覆成本在處理這些物件上,例如使用 static 物件,或是放在一個存活時間較長的物件上 找出花費成本最高的運算,如讀檔、網路、資料庫操作 使用一些延遲動作的技巧,來讓使用者感覺反應時間加快,如有互動的提示行為,在載入大量資料時顯示進度,雖然時間可能變長,但卻會讓使用者誤以為等的時間比較短 有需要的話,降低物件的階層數,很多層的物件,由其是 UI 元件,太多層級,可能造成較大的負擔

[程式設計] 從折紙看逆向工程

圖片
前陣子在家裡做家庭代工 - 折紙 (為什麼要折紙就不要問了) 其中在折下面這個衣服時 因為沒有人教,就直接拆了來研究 然後照著折線,折線有很多是輔助線 又要折輔助線,花了很多步驟才完成 而且折起來還卡卡的 後來在網路上找到了這個折法 折起來不僅快,而且簡單很多 我的感想是 許多逆向工程,只能得到相同的結果,無法和原作相同 在看別人的原始碼時,也不一定能了解原作的真正意思 設計是一門融入想法到作法中的學問

LunaTermTest 0.5

圖片
已經更新為 KeyboardTerm 項目 在 Market 上可以找到 詳細見: http://kenshinnn.blogspot.com/search/label/KeyboardTerm 下載: http://dl.dropbox.com/u/16505663/LunaTerm/0.5/LunaTermTest_0.5.apk 1. 將虛擬方向鍵相關設定整合為新頁面 2. 增加設定邊緣保留空間,在全平面的機器比較不易誤觸系統鍵 3. 增加畫面比例調整,可設定非全螢幕的比例 4. 修正底線消失問題 PS: 關於虛擬按鍵的設定,近期會有新做法,供使用者自己定義那些按鍵 請期待(我比你們更期待做好的時候...XD)

LunaTermTest 0.4.4

圖片
已經更新為 KeyboardTerm 項目 在 Market 上可以找到 詳細見: http://kenshinnn.blogspot.com/search/label/KeyboardTerm 下載: http://dl.dropbox.com/u/16505663/LunaTerm/LunaTermTest_0.4.4.apk 修改項目: 1. 增加可以將方向鍵移到左邊的設計 2. 虛擬方向鍵可以捲動,拉出更多按鍵 3. 調整 Density ,在大螢幕下變清淅 4. 增加可以調整寬度 5. 可以移到 sd 卡了 PS: 我的設計原則是給單手方便使用的,太大的裝置可能也不適合 另外,之後考慮控制長寬比,找到一個比較適合的比例,讓文字更清楚 有關虛擬鍵盤方面,希望能夠做成讓使用者自己調整按鍵的排列 (已有想法,不好做就是了) 已知 2.1 以下會有 Layout 的問題

加了方向鍵的 LunaTerm

圖片
已經更新為 KeyboardTerm 項目 在 Market 上可以找到 詳細見: http://kenshinnn.blogspot.com/search/label/KeyboardTerm Updated: LunaTermTest 0.5  (1/17) LunaTermTest 0.4.4   (1/11) 小弟使用 Desire HD,因為沒有方向鍵,在使用 LunaTerm 感到很不便 於是修改了這個版本 http://dl.dropbox.com/u/16505663/LunaTermTest_0.3.apk 如下圖,增加了虛擬方向鍵的設定 並提供了多種設定方式 在操作時,可快速點擊旁邊的按鍵 這只是很陽春的版本,按鍵的按列方式也是自己的設計加上朋友的意見 原始碼使用了原來 LunaTerm 的專案,在穩定後,希望能回饋給原專案負責人 因為時間不多,所以先挑簡單的做 不過其實還是有一些希望之後能夠繼續做上去的功能 1. 可翻頁或拉動出更多鍵 2. 透明虛擬浮動鍵 3. 讓使用者可以自己拉按鍵位置 如果有什麼簡單,馬上可以增加效益的,就可以先做 PS: 暫時用了一個不同的 package ,所以不會蓋到原來的 LunaTerm ,可放心安裝

plurk 掛點

圖片
雖然大家都知道最近 plurk 晚上就會不穩 但大多是等很久沒反應,很難得看到如下的畫面 也發現它是用 python 寫的

android 在為進軍太空做準備(誤)

在看 android code 時,看到這樣的東西: /** Standard gravity (g) on Earth. This value is equivalent to 1G */ public static final float STANDARD_GRAVITY = 9.80665f; /** values returned by the accelerometer in various locations in the universe. * all values are in SI units (m/s^2) */ public static final float GRAVITY_SUN = 275.0f; public static final float GRAVITY_MERCURY = 3.70f; public static final float GRAVITY_VENUS = 8.87f; public static final float GRAVITY_EARTH = 9.80665f; public static final float GRAVITY_MOON = 1.6f; public static final float GRAVITY_MARS = 3.71f; public static final float GRAVITY_JUPITER = 23.12f; public static final float GRAVITY_SATURN = 8.96f; public static final float GRAVITY_URANUS = 8.69f; public static final float GRAVITY_NEPTUNE = 11.0f; public static final float GRAVITY_PLUTO = 0.6f; public static final float GRAVITY_DEATH_STAR_I = 0.000000353036145f; publ...

編譯與 link (以 iconv.h 為例)

大家應該都知道編譯時通常會透過 pkg-config 來產生 -I 及 -l 的參數 之所以要透過 pkg-config 來產生就是為了解決不同平台其環境可能不同的問題 在最小的衝擊之下的解決之道 編譯流程: source code(.c) -> object code(.o) -> binary(.exe, +x) 在從 source code -> object code 的過程中,就是轉譯過程,將 source 轉成符號(symbol) 在這個過程中,只要用到 -I 參數,了解其用到的 .h 中的規範 在 object code -> binary 中,才會用到 -l 參數,建立 symbol 的 link 一個有趣的例子: iconv 是一個編碼轉換的函式,在後來多數的 linux 版本中都已經被系統直接使用 它可能存在 libc6 或 glibc6 的套件中 iconv.h 所提供的方法 iconv_xxx,實際上 libc.so.6 都有提供 因此,大多數的平台在使用到 iconv.h 時,不需要額外加 -l 參數 為何有 libiconv.so? 1. 在 libiconv.so 中提供了更強大的 function,支援比 libc.so.6 更多的編碼 2. 提供自訂化的編碼表 3. 在後期的 libiconv.so 中,為了避免工程師誤用, libiconv.so 中的方法都改為 libiconv_xxx 所以有用到 libiconv_xxx 的才需要 libiconv.so 如果是 iconv_xxx 的,就不需要了

關於密碼的安全隱私

關於密碼的處理,我的想法是: 1.密碼一定要加密儲存 2.尊重客戶的隱私權 3.讓客戶知道我們一樣重視安全 昨天在客戶那邊處理問題,因為工具稀少,我現場就用記事本寫了這樣的一個程式來測試環境 不過由於需要客戶的密碼,所以我請客戶將密碼打入一個文字檔中 並向他強調,我不能看到他的密碼,所以請不要讓我看到 我從頭到尾都在他旁邊操作,也証明我沒有機會看到密碼 using System; using System.Net; using System.IO; public class test { static void Main() { string userName = "lance" ; string password = new StreamReader ( @"d:\1.txt" ).ReadToEnd().Trim(); string proxystr = "www2.psc.com.tw" ; IWebProxy proxy = new WebProxy (proxystr, 80); proxy.Credentials = new NetworkCredential (userName, password); WebRequest req = WebRequest .Create( "http://www.google.com" ); req.Proxy = proxy; WebResponse res = req.GetResponse(); Stream stream = res.GetResponseStream(); string content = new StreamReader (stream).ReadToEnd(); Console .Write(content); } }

MSSQL 查所有 Table 使用的空間

筆記一下,下面的指 令可以查所有 Table 使用的空間(單位是k) declare @PageSize float select @PageSize=1024 from master.dbo.spt_values v where v. number =1 and v. type = 'E' select object_id, object_name(object_id) as name , ( select @PageSize * SUM ( CASE WHEN a. type 1 THEN a.used_pages WHEN p.index_id THEN a.data_pages ELSE 0 END ) FROM sys.indexes as i JOIN sys.partitions as p ON p.object_id = i.object_id and p.index_id = i.index_id JOIN sys.allocation_units as a ON a.container_id = p.partition_id where i.object_id = o.object_id) data , ( select @PageSize * SUM (a.used_pages - CASE WHEN a. type 1 THEN a.used_pages WHEN p.index_id THEN a.data_pages ELSE 0 END ) FROM sys.indexes as i JOIN sys.partitions as p ON p.object_id = i.object_id and p.index_id = i.index_id JOIN sys.allocation_units as a ON a.container_id = p.partition_id where i.object_id = o.object_id) [ index ] from sys.objects o order by 3 desc

[程式][藝術] 用 xor 來做逆運算

其實程式真的很像藝術,看看下面的程式碼: bool check; // 第一種 if (check) { check = false ; } else { check = true ; } // 第二種 check = (check) ? false : true ; // 第三種 check = !check; // 第四種 check ^= true ; 一樣的句子,透過 xor ( ^= ) 變的多麼簡單,也許上面的式子感覺不太出來,那看看下面的,因為取屬性的寫法變的比較長了,自然 code 也變長了,當然還可能會更長 但一樣透過 xor 就變的很簡潔,像藝術作品一般 // 第一種 if ( this .checkBox1.Checked) { this .checkBox1.Checked = false ; } else { this .checkBox1.Checked = true ; } // 第二種 this .checkBox1.Checked = ( this .checkBox1.Checked) ? false : true ; // 第三種 this .checkBox1.Checked = ! this .checkBox1.Checked; // 第四種 this .checkBox1.Checked ^= true ;

[筆記]AJAX .Net 中 UpdatePanel 的限制

其實不是第一次被問了,每次都要查一下資料 還是特別筆記一下好了 參考資料:http://msdn.microsoft.com/en-us/library/bb386454.aspx Controls that Are Not Compatible with UpdatePanel Controls The following ASP.NET controls are not compatible with partial-page updates, and are therefore not designed to work inside an UpdatePanel control: TreeView control under several conditions. One is when callbacks are enabled that are not part of an asynchronous postback. Another is when you set styles directly as control properties instead of implicitly styling the control by using a reference to CSS styles. Another is when the EnableClientScript property is false (the default is true ). Another is if you change the value of the EnableClientScript property between asynchronous postbacks. For more information, see TreeView Web Server Control Overview . Menu control when you set styles directly as control properties instead of implicitly styling the control by using a reference to CSS styles. For more information, see Menu Contr...

[程式]Linq 未實作的功能

圖片
今天追一個問題,追了半天,原本程式碼如下: MyContext context = new MyContext (); int count = context.Logs.Count(m => m.CreateDate.Value.ToShortDateString() == DateTime .Today.ToShortDateString()); 上面的式子在使用了 linq to Sql, 其中 Logs 資料表中有一個欄位 CreateDate 是 Sql 的 DateTime 型別,在 lamba Expression 中,把它當做 DateTime 型別使用,於是使用了 ToShortDateString 這個方法,編譯一切正常,但執行時,卻發生了例外。 不死心的,將上述的式子改為: MyContext context = new MyContext (); int count = context.Logs.Count(m => m.CreateDate.Value.ToString(" yyyyMMdd ") == DateTime .Today.ToString(" yyyyMMdd ")); 依然出錯,最後只好將式子改為 MyContext context = new MyContext (); int count = context.Logs.Count(m => m.CreateDate.Value.Date == DateTime .Today.Date); 才終於過關,但這一切過程都是 runTime 時才發生問題,原本強調 var 型別的動態性,與強型別編譯的好處,以減少錯誤的發生,但眼前卻顯得一切都不可靠。 最後終於在 msdn 中找到了答案: http://msdn.microsoft.com/en-us/library/bb425822.aspx 節錄最後面一段: System.DateTime Implemented Constructors: Copy Code DateTime(year, month, day) DateTime(year, month, day, hour, minutes, seconds) DateTime(year,...

[程式]快速開發與效率

從國中開始寫程式時,程式對我而言,就是達成目的的指令,在當時並沒有所謂時程和效率的考慮,沒有受過正統程式設計訓練的我,只有零星的上過一些相關課程,和絕大多數的自修,但一些專有名詞,像復雜度、NP HARD之類的,我也還蓋得出來。 在軟體討論區甚至是open source 討論區,出現了 IDE 工程師這樣一個名詞,原本這個詞並不是什麼不好的意思,但在那些討論區裡指的卻是一群只會使用圖形化開發工具(泛指微軟系列為主)的工程師,講求易上手,快速開發,但結果卻是常常忽略了一些細節,造成漏洞、效率等的問題。 經常遇到的是開發時使用的小型案例一切正常,但真正上線時,完全攤換,這不全是工程師的錯,如果規劃時周全一點,如果讓比較有經驗的來領導專案進行,如果肯針對不良的程式碼痛下決心大改寫,都可能讓這些問題不要發生。 第一場戰役:jQuery,從開始引入jQuery開始,本來這應該是個美好的開始,但新人進來就開始學jQuery,基本Dom操作的也jQuery,諸如 jQuery("#id") 這樣的式子完全被濫用,基本的 document.getElementById 反而都不會用,有些效能卻是在這些地方消失掉的。 第二場戰役:linq,雖然 linq 讓很多的程式開發更有彈性,特別是 linq to sql 讓工程師幾乎可以不了解 sql 句也能完成資料庫的存取,但如果沒有優良的 DBA 在幫忙輔助管理資料庫,就算 linq 用的再熟再好,也解決不了因為資料庫設計不良造成的效能低落問題。 打了越多場硬戰後,我也了解了更多,快速開發與效率其實也是有辦法兼顧的,快速開發靠的是工具,但效率就必須靠著工程師的素養、經驗、細心。

[linux]用shell script將簡體檔名改成繁體檔名

其實這是舊東西了,之前發在我的天空,不過現在又修改了一下 繁體中文改用 BIG5HKSCS,可支援較多的繁體字 #!/bin/sh r=0 function myhelp() { echo Usage: gbtobig5 [-r] FILE echo rename the gbcode filename to big5code filename echo echo -r, --recursive rename the contents of directories recursively echo -h, --help show this help page echo echo echo auther: kenshinn, taiwan echo webpage: http://kenshinnn.blogspot.com echo E-mail: kenshinnn@gmail.com echo Msn: kenshinnkimo@msn.com echo echo updated on 2008/06/21 exit } function ren() { i=$1 j=`echo $i|iconv -c -f utf8 -t gbk | iconv -c -f gbk -t big5hkscs | iconv -c -f big5hkscs -t utf8` if [ $i = $j ] ; then return ; fi echo `pwd`\/$i rename to `pwd`\/$j mv $i $j } function dr() { for i in $@ ; do if [ -d $i ] && [ $r = 1 ] ; then cd $i ; dr * ; i=`basename \`pwd\`` ; cd .. ; fi if [ -e $i ] ; then ren $i ; fi done } IFS="" if [ $# == 0 ] ; then myhelp ; return ; fi for c in $@ ; do if [ $c = -h ] || [ $c = --help ] ; then myhe...

[SQL2005]自創SQL篩選不組字串查詢方式

在寫SQL句時,一個Stored Procedure,傳入一個參數是一群資料的集合作為篩選條件 這時常常會用組字串的方式,使用 IN 的子句當作 WHERE條件,例如下面這個例子: CREATE PROC GetProjects ( @ProjectList nvarchar ( max ) ) AS BEGIN DECLARE @sql nvarchar ( max ) SET @sql = 'SELECT * FROM Project WHERE projectSn IN (' + @ProjectList + ')' EXEC sp_executesql @sql END 上面的例子,呼叫時傳入 " 1,2,3 " 這樣的字串當作 @ProjectList, 就可以找出Project資料表中,ProjectSn為1,2,3的資料 但這方法就是透過組字串來執行 在SQL2005增加了xml的xQuery方法,可以將xml變成關聯式資料,於是我修改上面的句子,變成: CREATE PROC GetProjects ( @ProjectList nvarchar ( max ) ) AS BEGIN DECLARE @xml xml SET @xml = @ProjectList ; WITH LIST AS ( SELECT N. value ( './text()[1]' , 'int' ) ProjectSn FROM @xml. nodes ( '/r/n' ) V(N) ) SELECT * FROM Project WHERE ( @ProjectList = '' OR EXISTS ( SELECT TOP 1 * FROM Project.ProjectSn = List.ProjectSn) ) END 在上面的例子,同樣的用法, 將@ProjectList的傳入值改成 " <r><n>1</n><n>2</n><n>3</n>...

博克來安全出包 - 消費者的安全絕對比什麼都重要?

看了幾篇消息,知道 博克來 又出包了: 可能是世界首例:登入博客來要輸入驗證碼 金馬影展套票個人資料事件,博客來誠摯道歉 博X來資料似乎外洩了,請大家小心。 該出包的果然會出包 幾千人的迴響和收藏,不值錢 有一些想法: 雖然大家都知道安全有多重要,甚至軟體開發者可能比消費者更有感覺(很多的漏洞的消費者根本不會發現),但相信還是有工程師為了交差,隨便測測了事,不能全說是工程師的錯,專案控管單位如果不關心,工程師也只能早點了事就算了,甚至為了趕時程,連測的動作都省了,畢竟工程師大多數都相信自己不會錯,總之,使用者的安全才是比什麼都重要的(對公司而言,賺錢比較重要)。

誰說基礎不重要

身為電腦程式設計師,理當從各種基礎理論都應熟悉 但其實我也不是本科系出身,但對於基礎也是蠻重視的 在網路上聽過有人提過IDE 工程師這個名詞,好像是個不錯的工作 但在一些討論區卻是被戲稱只會依靠強大的開發工具及開發平台 基礎不夠好,開發時缺少深思熟慮,品質容易下降 不論開發平台有多強大,工程師還是應保有最基本的概念 要有自己的想法,要有好還要更好的理念 覺得有疑問就應該找出問題 說了這麼多,真的很理想 但有時礙於專案時程,不小心和自己的理念衝突了 實在是哭笑不得