星期四, 2月 11, 2010

常用註冊值

更改windows授權的使用者名稱及組織名稱
利用ghostxp重灌後 開發的產品都是ghost的名字...
這東西釋出去好不太好看...
找了一下 還挺簡單的...
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\下的
RegisteredOwner //更改使用者名稱
RegisteredOrganization //更改組織名稱

第一隻ROR

照Agile Web Development with Rails寫的第一個範例
在這此抓出重要用到的指令









1.Build Project
rails demo //建立demo專案
cd demo


2.啟動server
ruby script/server //啟動server
//到http://localhost:3000下,檢查是否有啟動
//沒問題就可先關掉,準備coding


3.建立controller
ruby script/generate Controller Say
瞭解一下MVC架構 p29

4.建templete


...待續

星期三, 2月 10, 2010

利用scaffold做資料庫應用

天啊.遇到太多問題了
因為rails升到2.0有些語法不一樣
看書寫不出來,上網查才知道語法有不同了
而rails db:migrate又需與database溝通
所以事前也得先設定好...
練習第一個saffold做資料庫 還沒感受到 就先覺得好辛苦
不寫下來將來換個環境一定又忘了...
不過設定完... 還真的挺開心的 沒寫到任何sql所有欄位的新增、修改都做好了...
人說「頭過身就過」 希望接下來的路順一點...

建立專案
rails demo -d mysql //指定db可順便改好database.yml
1.設定資料庫
問題:解決rails的sqlite3.dll錯誤
沒有sqlite的dll是做呼叫sqlite的function...

問題:缺mysql
看範示的console畫面還想說~
哇~~跟mysql都整合在一起來
原來還是得自己先建立mysql環境
下載安裝mysql吧




2.scaffold
設定好資料庫就是來用scaffold
因為升級到rails 2的關係 所以下的參數會不一樣
1.0:ruby script/generate scaffold Movie Admin //直接指向Admin
2.0:ruby script/generate scaffold Movie title:string description:text one_sheet_url:string

Rails 2.0 scaffolding step by step.

3.rake db:migrate
這一步會遇到以下的問題
問題:syntax error on line xxx
一般來說是database.yml的設定出錯
冒號後面一定要有一個空白,否則會出錯!!
adapter: mysql
...
username:root <= 冒號後要空隔,不然會說argument錯誤

MySql問題
1.權限問題
解法:當然就要開放權限啦,另外注意不能用root

2.Commands out of sync; you can't run this command now: SHOW TABLES
-Mysql::Error: Commands out of sync; you can't run this command now: SHOW TABLES解决方案
-Rails2.1.0出现的问题undefined method `each' for
解法:從mysql/bin/目錄下找出libmySQL.dll,再copy到ruby/bin
*有時一樣會失敗,請注意抓的libmySQL.dll是跟MySQL server版本相同
我就抓了5.1.43的dll,連5.0.45... 問題一樣...硬是從5.0.45找出dll才pass


其他參考
第一個資料庫應用(with scaffold)--Ruby on Rails 完全新手手冊

星期日, 2月 07, 2010

來吧... Ruby

躲不掉的...
快讀吧...
先來名詞解釋

  • Ruby
    • 一種程式語言,如同C,Java
    • 所以不是只能寫網頁
    • 物件導向,類似Perl, Smalltalk, Python, Lisp
  • Rails-Web application framework
    • 用Ruby寫的
    • MVC架構
    • 利用convention替代掉大部份的設定
  • Active Record
    • Rails的ORM名稱
    • 與一般ORM不同的是Active Record利用convention替代掉大部份的設定
Ruby新手入門
Rails新手入門
第一隻ROR
不多說
直接看別人教學
實際做一次就會了
1.Ruby on Rails(Windows),從安裝到 Helloworld 2009/02 update
先簡單的做出Helooworld,不過重點在下一篇的scaffold
2.第一個資料庫應用(with scaffold)--Ruby on Rails 完全新手手冊
用scaffold才會感覺到ROR的方便,直接看Agile Web Development with Rails做範例感受更深,不過版本要看對...不然開發會很想打人

實際開發
遇到太多問題了...
自己也寫了一篇 第一隻ROR

討論
從 Django 看 Ruby on Rails 成功的原因

--------------------------------------
Reference
教學資源
安裝、應用
1.Ruby on Rails (ROR)入門第一站,InstantRails安裝圖文教學
2.在 Ubuntu 下部屬 RoR 環境


教學
1.ROR 的新手建議書單 from xdite
2.Ruby & Rails on Rails 進階書單
3.幾本不錯的Ruby和Ruby On Rails電子書下載
4.Top 13 Ruby on Rails Presentations
有書.... 就有電子書....
有電子書就...不用花錢買了... XD ...

Aptana IDE
官網:radrails
1.Get Rolling with Ruby on Rails in RadRails //標題還挺有趣的
2.5分鐘RadRails錄影教學

社群討論區,Blog
Ruby Taiwan 台灣的 Ruby 社群。
RailsFun!! Rails 討論區

Blog
Lighty RoR 介紹 Ruby,Ruby on Rails,JRuby
xdite

星期六, 2月 06, 2010

編輯Windows右鍵選單

常要開「裝置管理員」看USB有沒有連結
用regedit在「我的電腦」右鍵選單增加「裝置管理員」
出現「MMC無法開啟」...
"銀"了很久 一直沒處理
今天總算狠下心google找到解決方法了

@="裝置管理員"
[HKEY_LOCAL_MACHINE\SOFTWARE\Classes\CLSID\{20D04FE0-3AEA-1069-A2D8-08002B30309D}\shell\DevMgr\command]
"mmc.exe %%systemroot%%\\SYSTEM32\\devmgmt.msc"
改成"mmc.exe devmgmt.msc"



Reference:
用Reg在「我的電腦」右鍵增加「裝置管理員」、「服務」會出現MMC無法開啟的看這裡

星期五, 2月 05, 2010

InstallShield中 變更資料夾路徑的方法

OS:XP
InstallShield版本:2010

建立專案時
在Installation Design/Application Data/Files And Folders
將要封裝的Source資料夾"拉進"Destination資料夾
=>Sourece的路徑為D:\test (將test資料夾全部安裝到使用者的電腦)

後來想移動test資料夾至D:\Project\test,
因此Soure的路徑就需要更動,但找不到任何設定可以更動
惟一想到的方法就是刪掉舊的資料夾 再重新拉進
只是在Installation Design/Organization/Components 裡
已經為每個不同的資料夾取命了...
如此一來便得再重新命名...

後來跟原廠詢問
原來所有的變數路徑都儲放在Media / Path 下
也就是說在這裡就可以設定路徑了...

Sql字串有特殊符號

當字串裡有單引號如"It's good",或其他特殊符號時
Sql命令都會掛掉...
解決方法
1.在特殊符號前加入 \
"It's good"=>"It\'s good"
*透過mysqlconnector會發生錯誤...改用法2就沒問題了

2.遇單引號可再一個單引號
"It's good"=>"It''s good"

php可用直接呼叫
1.mysql_escape_string
2.mysql_real_escape_string
3.addslashes
至於差別...有看沒有懂...

星期日, 1月 31, 2010

日文學習

五十音還真不好背
背了一個忘一個
上網查五十音表時 看五十音平假名五十音片假名的由來
日文本來就是漢字去改的
利用一些字型和國、台發音 還挺好記..
現在都已經把五十音給背起來的 真是不錯的東西

看了五十音表 都是寫好的字
不知道筆劃,不會寫,寫了都怪怪的
五十音平假名書筆劃

背起來後還有小遊戲可以挑戰
類似以前學輸入法玩的小遊戲...叫什麼都忘了 哈

星期四, 1月 21, 2010

到底啥係native,strictfp,transient,volatile

雖然考過SCJP都不知道幾年了
不過要我解釋native,strictfp,transient,volatile
還是支支吾吾說不出來
下定決心要看懂這四大天"字"是什麼意思

1. native
簡單講,呼叫其他語言(c,c++之類)做出來的dll
做法
1.利用java做個介面供其他語言實作(也就是宣告成native)
2.用javah產出.h;
3.用其他語言實現native方法
4.編譯成dll
5.在Java中,再用System.loadLibrary()方法讀dll,就成功啦

還是看原作的範例比較快
認識理解Java中native方法

2. strictfp
意思是FP-strict,精確浮點,符合IEEE-754規範的,那為什麼不一開始就符合規範咧?
看wiki是這麼說地
In older JVMs, floating-point calculations were always strict floating-point, meaning all values used during floating-point calculations are made in the IEEE-standard float or double sizes. This could sometimes result in a numeric overflow or underflow in the middle of a calculation, even if the end result would be a valid number.

3.transient
為了避免把password等之類機密的資料序列化儲在永久媒體(如硬碟)
因此只要將該變數宣告為transient,就會禁止此變數被序列化
用過hibernate後,就更能瞭解是什麼了


4. volatile
每次被thread執行時,都強迫重讀宣告為volatile的變數。
什麼意思咧?如同synchronized鎖定function的意思一樣,而volatile可直接對特定變數
看volatile的例子

嗯 要尊重原作 我就不再copy-paste了
其實是懶得貼 哈

不過~~總算都懂了...ya~~

Reference
認識理解Java中native方法
Java關鍵字之native,strictfp,transient,volatile

星期二, 1月 19, 2010

jQuery 1.4出來囉

1月14是jQuery的四歲生日...所以出了1.4版
除了新方法外 還重寫了一些增強即有的功能

新功能
.delay()
太酷了...
/*二個div同時向上縮,first div先等個800毫秒
*這時second先淡入,再400ms後first div才淡入
*/
$("div.first").slideUp(300).delay(800).fadeIn(400);
$("div.second").slideUp(300).fadeIn(400);


舊function增加
.addClass()
function(index, class)A function returning one or more space-separated class names to be added. Receives the index position of the element in the set and the old class value as arguments.
//可以一次加多個class,或移除
$('p').addClass('myClass yourClass');
$('p').removeClass('myClass noClass').addClass('yourClass');

//還有更酷的 呼叫addClass時,動態加入class name
//就是Function Settter厲害的地方,其他.css(),.attr(), .val(), .html(), .text(), .append(), .prepend() ...也都有支援
$('ul li:last').addClass(function() {
return 'item-' + $(this).index();
});


jQuery.param()
直接將array轉成url參數格式

/*jQuery.param( obj ) 1.2
*jQuery.param( obj, traditional ) 1.4
*objAn array or object to serialize.
*traditionalA Boolean indicating whether to perform a traditional "shallow" *serialization.
*/
var myObject = {
a: {
one: 1,
two: 2,
three: 3
},
b: [1,2,3]
};
var shallowEncoded = $.param(myObject, true);
var shallowDecoded = decodeURIComponent(shallowEncoded);
--
a=%5Bobject+Object%5D&b=1&b=2&b=3
a=[object+Object]&b=1&b=2&b=3


寫到一半....
還是看別人整理好的比較快....
懶得寫了...

reference
New or Changed in 1.4
jQuery 1.4官方文檔中文版發佈
jQuery 1.4 小閱兵

星期一, 1月 04, 2010

書 - 完美程式設計指南

Ch2 自我維護
程式釋出前都要做unit test,即使是只改一點點

測試人員存在的目的是找尋程式員沒找到的錯誤,寫程式的人應該自己找尋自己製造的臭蟲。

coding時
1.用防禦性程式寫作,但別隱藏錯誤(bug)
2.加上除錯檢查(ex:assert) - 印出錯誤方便debug

*維護程式的發行版跟除錯版。發行版用來打包發行,除錯版用來盡可能快速抓蟲。
*除錯檢查巨集是寫出除錯檢查的快速方式。用它們來捕捉不應該發生的非法狀況。不要把這些狀況跟錯誤狀況混在一起;錯誤狀況在最後的產品中一定得被處理掉。
*用除錯檢查巨集來核對函式參數,並警告程式原有東西是未定義的。你愈嚴格定義你的函式,核對它的參數就愈簡單。
*一旦你寫好了一個函式,把它重新檢查一遍,並問問你自己,"我假設了什麼條件一定成立的嗎?"如果你找到一個假設條件,用除錯檢查巨集檢查這條件是否永遠成立,或者重寫程式以去除這樣的假設。也問問自己,"程式中哪裡最可能出錯,我怎樣才能自動找到錯誤?"盡可能將捕捉錯誤的測試放在愈早執行到的地方愈好。
*教科書鼓勵程式員防禦性的寫程式,可是記住這種寫作方式會隱藏錯誤。當你寫出防禦性的程式時,用除錯檢查巨集來提醒你自己是否有"不可能"發生的狀況發生了。

Ch3 增強子系統
檢查你的子系統,問問你自己,程式員們可能會怎麼誤用它。加上除錯維護敘述跟核對檢查來捕捉不好找跟常見的錯誤。

如果你不重複找尋,就修不好錯誤。找尋任何可能造成隨機行為的東西,把它們從除錯版程式中拿掉。將未初始化的記憶體以某個垃圾值填滿只是一種去除隨機行為的辦法,那樣子如果有參考到未初始化記憶體的情形發生,你就可以在每次執行到出錯的程式時都能重複同樣的現象。

如果你的子系統釋放記憶體(或其他資源)然後製造垃圾,請清理被釋放的記憶體中的內容,讓裡頭的東西看起來像垃圾;不然別處的程式可能會繼續使用這些已釋放記憶體中的東西而不被察覺。

類似的,如果你的子系統有些可能會發生卻不一定發生的行為,加上除錯碼來確定這些行為一定會發生。讓每件事都發生過可以增進你捕捉到較少執行到的程式中出現的怪異現象。

確定你的測試工作在程式員沒注意到時都在進行著。最佳的測試方式就是那些完全不用在乎它們的存在的測試。

如果可能,將測試碼建立在子系統裡頭,而不要寫在它們上頭。不要等到子系統已經寫好了,才來想辦法查對它們的動作正不正確。對每個你考慮的設計方式,問問你自己,"我該怎樣徹底查對這個實作?"如果你發現幾乎不可能或難於測試這個實作方式,好好考慮一下是不是該換個設計方式,即使那表示拿程式大小跟執行速度為代價來讓系統可被測試。26

在拿掉一個讓程式跑得很慢或吃很多記憶體的查核測試前,多想一遍。記住,查核程式碼不會出現在發行版的程式裡。如果你發現自己想著,"這些測試太慢了(或太大了)",停下來,問問自己,"我該怎樣讓這些測試繼續留著,而讓程式跑快一點(或變小一點)?"

星期日, 1月 03, 2010

Python開發

什麼是Python? Why Python?
* Python基礎教學
* Python入門教學
* Python進階教學
* Python程式範例
* Twisted教學
* TurboGears教學
* Eclipse 的 Pydev IDE教學

這裡有教學
從基礎到進階都有 真不錯
版主真有心
連Eclipse的安裝都有了
而且是圖文教學 「足感心ㄟ」

星期三, 12月 30, 2009

餐廳列表

每次想吃什麼都想不到
事後想起才覺得可惜 忘了這間
先寫好 以便日後查詢...改名叫"魚乾的美食筆記本"好了

台北
墨西哥料理

佬墨日出-Tequila Sunrise
墨西哥餐飲美味道地,經典的仙格麗亞,順口的瑪格麗特,香脆玉米片搭配勁辣爽口瀟灑醬


義大利麵

La Pasta

中式熱炒
新東南活海鮮料理
鮮納肚~100元快炒店(東區)

星期三, 12月 16, 2009

Facebook 二三事

FBML
json_encode問題~ php有些版本不支援
但只要引用facebook.php 就會有了
require_once 'facebook.php';

FBJS
當只有script時,一定要有個內文,script才會執行
echo "test
<script> function go(){
//xxx
}
go();
</script>";


showPermissionDialog說有ondone,但加了會掛...拿掉反而可以執行..怪
Facebook.showPermissionDialog('publish_stream');

星期一, 12月 07, 2009

Refactoring: Impoving The Design of Existing Code

中譯:重構-改善既有程式的設計

前言

古老的工程諺語:「如果它還能執行,就不要動它」
 但專案功能不斷修改程碼,使原先系統結構逐漸衺弱,程式碼也更加複雜,無法除錯,也無法獲得可被接受的性能/效率
最後重新編寫整個系統,作者指出堅持以持續不斷的重構行為是成功專案的重要角色

重構:「在不改變程式碼外在行為的前提下,對程式碼做出修改,以改進程式的內部結構」

軟體會慢慢腐爛
 重構的步驟只要把某欄位(field)從一個class移到另一個class,把某段程式碼從method拉出成另一個method,或是在class hierarchy中把某些程式碼推上推下就行了,聚沙成塔,小小的修改累積就可以改善設計品質,這和「軟體會慢慢腐爛」的觀點恰恰相反

Ch1 Refactoring, a First Example

分解並重組method
案例中的錄影帶出租statement()做太多事,程式碼太長,可以其目的拆成至不同的class
每個method的程式碼越少越容易維護,且拆成 更多的method更容易reuse(copy-paste相同的程式碼,常發生改了a method忘了改相同容內的b method)
重構技術係以微小的步伐修改程式。改錯時,很容易發現它

更改變數是值得的行為嗎?(p.15)
好的程式碼應清楚表達自己的功能,變數名稱是程式碼清晰的關鍵
任何一個傻瓜都能寫出計算機可以理解的程式碼。唯有寫出人類容易理解的程式碼,才是優秀的程式員


Replace Temp with Query(p.21)
int thisAmount => each.getCharge()
儘量除去暫時變數,暫時變數會導致大量參數被傳來傳去。也很容易失去蹤跡=>相對要付出效率上的代價,但可由最佳化來調整(細節p.69)

運用多型取代與價格相關的條件邏輯(p.34)
=>引用State pattern
在父類別宣告abstract int getPriceCode(),讓子類別實作其條件,使其有自己的計費法
*另外邏輯判斷也該在物件本身的class(指switch(getMovie().getPriceCode())=>應在class movie裡寫switch (getPriceCode())
當有傳入值有可能有變化時,選擇可能變化小的,折起的side effect也較小
=>引用State pattern的重點在「修改與價格有關的行為」,或「新增定價標準」會較容易

Ch2 Principles in Refactoring

為何重構
-改進軟體設計=>消除duplicate code
-使軟體更易被理解
-助找到bugs=>程式碼易於理解,而不是從一個500行的method找

何時重構 The Rule of Three (p.58)
1.反感,第三次又做類似的事就該重構
2.添加功能時
3.修補錯誤時
4.code review時

Ch3 Bad smells in Code

何時重構、何時停止及重構的機制
1.Duplicated Code p.76
2.Long Method p.76
3.Large Class p.78
class太大,instance變數就會多,Duplicated Code也接腫而至
4.Long Parameter List p.78
5.Divergent Change(發散式變化) p.79
隨外界變化而有所修改,找出原因運幅Extract Clss提煉到另一個class
6.Shotgun Surgery(霰彈式修改) p.80
每遇修改就得在不同的classes內做小修改
7.Feature Envy(依戀情結)
某method內呼叫該class幾乎半打的getting method
8.Data Clumps
每次都會同時出現的幾個field
9.Primitive Obsession
日期年月日,3個int不如定義成object
原則
應放在一起的fields =>Extract Class
參數列中有基本型資料=>Introduce Parameter Object
從array挑資料 =>Replace Array with Object
10.Switch Statements

星期五, 11月 27, 2009

軟體工程

物件導向

物件導向程式的九個體操練習
by ihower
遵守九條規則,改善OO實作能力

測試
為什麼要寫 unit test?為什麼要先寫測試?
TDD 推廣:背景知識和簡介

看來還有很多東西要學習...加油...

星期四, 11月 26, 2009

INF檔結構

INF是Device INFormation File的英文縮寫

編寫規則

*規則一:INF文件是分節的,每一個INF文件有許多的節組成,節名用方括號括起來。
*規則二:在節與節之間的內容叫條目,每一個節又是由許多的條目組成的,每一個條目都是由形如「signature="$CHICAGO$"」的形式組成的。如果每一個條目的等號後有多個值,則每一個值之間用「,」號分隔開。
  
*規則三:INF文件對大小寫不敏感。  
*規則四:「;」號後面的內容為註釋。
*規則五:如果一個條目的內容過多,在一行無法書寫完全,則用「\」將一行內容書寫為多行。

百度Inf

星期日, 11月 22, 2009

資料庫索引

設計準則(減少IO存取次數)
 1.經常被用來搜尋資料記錄的欄位
 2.Primary key(sqlserver自動建立)
 3.套用unique限制條件的欄位(sqlserver自動建立)
 4.Foreign key定義作為外部索引鍵欄位?
 5.於查詢中被用來連結資料表的欄位
 6.用來作排序基準的欄位
  -不要替超過20bytes的欄位作索引(索引體佔太多空間 ex.地址)
  -很少變動,經幣被查詢
 7.索引需維設,減少使用頻率低的索引,以免耗維護成本
 8.內容重複率高的欄位效益低
 9.資料記錄多,存取效率才會明顯,反過來說少反而慢(path)
  -利用query analyzer執行,檢視execution plan與執行時間來測
  -不斷嚐試、不停修正

索引的類型
 1.Clustered Index(簇集索引) -範圍(日期,編號)
 改變資料表記錄存放次序,並與簇集索引中錄值次序相同
  -ex. between 100 and 200=>以昇冪來排就直接抓出其間的100筆
  每個table只能有一個clustered index

 2.NonClustered index(非簇集索引) -特定值(姓名,電話)

星期五, 10月 30, 2009

要先引用幾個COM元件
查了一下還真麻煩
後來發現直接引進Microsoft Excel 11 Object就會自動帶入其他的COM

[C# .Net] Microsoft.Office.Interop.Excel 讀 / 寫 Excel 語法概全

Reading and Writing Excel Spreadsheets Using ADO.NET C# DbProviderFactory

星期一, 10月 19, 2009

jQuery bind與live

要加event listener時,可用bind或live來綁event 究竟兩者差在哪邊 bind如下以綁drag事件
$(function(){
   $('.floatBox').bind('drag',function( event ){
       $( this ).css({
                       top: event.offsetY,
                       left: event.offsetX
       });
       //var pageCoords = "( " + e.pageX + ", " + e.pageY + " )";
       //var clientCoords = "( " + e.clientX + ", " + e.clientY + " )";
   }); 
});
將event在onload時,加入listener 可是當之後要動態加入時,後續加入的floatBox就不會有反應 因此得再bind的新的floatBox 這時就可以改用live,程式碼如下(只是把bind改用live) jQuery就會聰明的自己bind事件,真的是太神奇了
$(function(){
   $('.floatBox').live('drag',function( event ){
       $( this ).css({
                       top: event.offsetY,
                       left: event.offsetX
       });      
   }); 
});