2012年2月27日 星期一

目標提醒法

今天偶然看電視,看到一個節目正在討論存蓄和退休金的規劃,

提到了"目標提醒法",

這個方法就是把你預計準備的退休金數目,寫在你每天會看到的牆上,

天天提醒自己慢慢去達成這個目標。

要達成這個目標,有以下幾個方法:

1. 記帳

2. 作一些投資

3. 提撥每個月固定薪資為退休金


受益良多 ~~ :-)

2012年2月24日 星期五

[ASPNET] 圖片路徑問題

今天遇到一個很囧的問題,
剛上線的網站,因為有套用MasterPage,裡面的ContentPage又分散在各資料夾內,
所以原本用相對路徑語法放上去的圖片,一堆變成肉包。

後來找了網路上這個解法,大部分的圖片都可以正確顯示了,
但是有一些還是必須用 "~/images/xxxx.jpg" 的寫法才可以看到,
浪費了好多時間在顯示這些圖片,天阿 =.=

參考文章

http://www.dotblogs.com.tw/shadow/archive/2011/07/07/31286.aspx

2012年2月17日 星期五

婚禮、家庭、親子、情侶、活動等個人化短片、紀錄片製做(Make ur unique Footage!)


婚禮、家庭、親子、情侶、寵物、旅行、活動等個人化短片、紀錄片製做

Make Your unique Footage!



拍完了很多與家人出遊或生活中的影片,懶的整理嗎? 我們替您馬上剪出一個獨具風格、收藏紀念的短片。 讓您上傳Youtube或聚會觀賞,保留您和家人每一段的相處回憶。


您要結婚了嗎? 婚宴上的成長影片,或是新人愛情紀錄,都是雙方和您的家庭最珍貴、最美好的回憶,我們將您和另一半的成長、相識和互相扶持的美麗過程,完整保留在短片裡。
 

您熱愛跳街舞、武術、或是極限運動? 該讓全世界看看您精彩的表演了!透過快速和慢速剪輯,您的每一個動作,將輕易抓住FacebookYoutube每一個好友的目光!


馬上提供相片、影片檔及背景音樂,描述您想要的風格和想法,我們給您獨一無二的個人化短片、MV

備註:

       1. 您提供的相片建議畫素至少為1280*768 以上,影片畫素至少為HD1280*768)或以上。

       2. 請勿提供劇烈晃動的影片。



完成影片交付方式:

1.      光碟交付:用郵局掛號(或選擇限時掛號)的方式,寄送到您府上。  此方式需額外收取一筆郵寄費用,不另外收取光碟費用。

2.      網路下載:我們會將您的影片加密後放在非公開的網路空間上,提供您一組密碼和網址供您下載。
確認您取得影片後,將立即刪除網路空間的檔案。



免責聲明:

       1. 您提供的任何檔案,必須為您本人所擁有。請勿使用別人原創作品或非法來源,以免違反著作權 法。

       2. 工作室不製做含暴力或色情的題材。

       3. 工作室完成的作品請勿任意修改或使用於商業用途。

       4. 未經您的允許,我們不會散播您提供的任何檔案或完成的作品。

       5. 所有作品會於片尾放上工作室名稱及相關資訊,我們一定會保持畫面的美觀,請您見諒。

       6. 製作影片過程中,遇有爭議或是違背以上聲明的案件,工作室有權力停止製做,保證金將不退還,  請您見諒。



       參考作品:(請開啟高畫質觀賞)

       ※活動:文化大學耶誕節社團發糖果活動(2011/12/25製作)

            http://youtu.be/pzSz8oddFD0

       ※運動:極限運動慢速播放(2012/01/29製作

            http://youtu.be/w35uhARvrfQ

        ※特效:藍色火焰(2012/01/19製作

            http://youtu.be/PV30O40crsQ

        ※寵物:兔子哈奇的一天2012/02/15製作)

            http://youtu.be/lOjZmgqBFrU

        ※旅行:世界遺產合掌村(2011/07/17製作)

            http://youtu.be/tUTXqJ5X1CA
       
       ※旅行:台北陽明山(2012/02/12製作)      
          http://youtu.be/pGkLo9EJaIc




       聯絡方式
       The FORCE studio 工作室 (林先生 或叫我JB即可
      MSN (Email) :  ppippenkimo@hotmail.com 
      部落格 http://karatejb.blogspot.com/
      Facebook 建立中

2012年2月16日 星期四

[.NET] XML 說明檔建立


範例
/// <summary>呼叫此方法做資料庫連線</summary>
/// <param name="sDataSource">資料庫主機名稱或位址</param>
/// <param name="sCatalog">預設資料庫目錄</param>
/// <param name="sUserId">登入帳號</param>
/// <param name="sPwd">登入密碼</param>
public static bool DBModule_Init(String sDataSource, String sCatalog, String sUserId, String sPwd)
{
   //….
}


然後到專案屬性的[建置],把輸出的「XML文件檔案」勾選起來,再建置一次就可以了。


2012年2月13日 星期一

轉換ASP.net程式到4.0...出現的錯誤訊息~

今天測試從framework 2.0升到 4.0的ASP.net網站,
在reload 樹狀結構的時後,跳出一個錯誤訊息:



型別 'System.Web.UI.ScriptManager' (來自組件 'System.Web.Extensions, Version=3.5.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35') 中的方法 'get_EnableCdn' 沒有實作。


查了Google之後,解決的方式是將
web.config中所有的System.Web.Extensions, Version=3.5.0.0全部都改成System.Web.Extensions, Version=4.0.0.0就可以了。

參考文章:

2012年2月4日 星期六

寫ADO.NET程式的小建議

這幾天小弟被要求要去對報表的數字是否正確,其實我心裡是千百個不願意~
一來對數字,我認為是USER的職責,
二來是報表的程式,註解少到用手指頭都算得出來,
小弟最討厭看這種不寫註解的程式。

果不其然,當報表數字有問題時,回去看程式的SQL追問題時,因為程式不易閱讀,讓小弟看的很痛苦。 以下是幾點建議。

1. 一個Sql可以完成的事,不必用兩個Sql

比如,我們要去更新表格A的總消費金額欄位(CONSUME_AMT),你會選擇 :
 (a) 先下 Select A.CONSUME_AMT from A , 取出總金額到變數X
       然後 X = X+新消費金額, 再 UPDATE A set CONSUME_AMT=X
 (b) 直接下 UPDATE A set CONSUME_AMT= (CONSUME_AMT+ 新消費金額)

 這樣一看很明顯~~當然是選 (b)!!
 這支程式很多InsertUpdate都是用(a) ... 這樣也算了,但是它還犯了下面這個錯誤...



2. 避免直接拿DataTable.Rows[0][X]來組Sql

假設我們有多個來源表格: A, B , 要把A, B的某些欄位放到C

第一個Sql  : SELECT X, Y, Z ... FROM A

把結果放到 DataTable_A ~

第二個Sql : SELECT S, T, U ... FROM B

把結果放到 DataTable_B ~

然後InsertSql寫成這樣 :

String iSql = "INSERT INTO C (col02, col05, col01, ... )" +
                     "VALUES ( '"+ DataTable_A.Rows[0][15].ToString() +"','" +
                                               DataTable_B.Rows[0][11].ToString() +"','" +
                                               DataTable_B.Rows[0][0].ToString() +"','" +
                                               DataTable_A.Rows[0][10].ToString() +"','" +
                                               ... );


好的,我們現在發現表格C的某個欄位有問題,我們要回去找來源的資料,
問題來了,我們會先去找iSql,找出對應的欄位值是 DataTable_A.Rows[0][10].ToString() 
然後我們再回到 第一個Sql,開始去找這第十個欄位是哪一個A的欄位!!! 
如果沒有整理好的DB schema,會超級浪費時間!!

如果多寫幾行程式碼:
DataRow dr_A = DataTable_A.Rows[0];
String sC_COL_01 = dr_A["X"].ToString();
String sC_COL_02 = dr_A["Y"].ToString();
 ....

String iSql = "INSERT INTO C (col02, col05, col01, ... )" +
                     "VALUES ( '"+ sC_COL_02 +"','" +
                                              sC_COL_05  +"','" +
                                               sC_COL_01 +"','" +
                                               ... );

要找C的某欄位,可以馬上找到對應的欄位值為 sC_COL_XX
sC_COL_XX是不是很快可以知道是從哪一個表格的哪一個欄位帶過來的嗎?
是不是節省了很多時間呢?

而且sC_COL_XX這些變數,都可以重複再使用~~ 


(待續...)

2012年2月1日 星期三

[Oracle] Select SQL Tuning 查詢效能調整(轉錄)

轉錄自:http://tomkuo139.blogspot.com/2009/08/oracle-select-sql-tuning.html

1. 建立 Index Key
2. Where 條件中, 是否用函數
3. Where 條件中, 是否使用 In / Not In / Exists

... 更多請參考原文

[Sql Server] MERGE語法教學

MERGE語句是Oracle9i新增的語法,用來合併UPDATEINSERT語句。
通過MERGE語句,根據一張表或子查詢的連接條件對另外一張表進行查詢,
連接條件匹配上的進行UPDATE,無法匹配的執行INSERT
這個語法僅需要一次全表掃描就完成了全部工作,執行效率要高於INSERTUPDATE

PS. 也適用於Microsoft Sql Server 2008以上版本

範例:
兩個表格JB_BUYLIST_T(購物清單), JB_LSTBUY_D(紀錄最後一次買的東西)
我們現在要做的事情是
抓出每個人購物清單中最後一次買的東西,然後把它更新或新增到JB_LSTBUY_D這邊。

Step1.建立表格
/*購物清單*/
CREATE TABLE JB_BUYLIST_T
(
ID       VARCHAR(10),
ITEM     VARCHAR(20),
BUY_TIME VARCHAR(8)
);

/*紀錄最後一次買的東西*/
CREATE TABLE JB_LSTBUY_D
(
ID           VARCHAR(10),
LST_BUY_ITEM VARCHAR(20)
);

Step2.先新增三筆購物清單
INSERT INTO JB_BUYLIST_T VALUES('JB','雜誌','20110701');
INSERT INTO JB_BUYLIST_T VALUES('JB','飯糰','20110703');
INSERT INTO JB_BUYLIST_T VALUES('D12','便當','20110702');


Step3. 執行MERGE語法

MERGE INTO JB_LSTBUY_D a USING
(
           SELECT ID,ITEM
           FROM
           (
                     SELECT
                     RANK() OVER (PARTITION BY ID ORDER BY BUY_TIME DESC) as RNK,
                     ID,
                     ITEM
                     FROM JB_BUYLIST_T
           ) X 

WHERE RNK=1

) b
ON
(
a.ID = b.ID -- AND ... 如果還有其它條件
)
WHEN MATCHED THEN UPDATE SET a.LST_BUY_ITEM = b.ITEM
WHEN NOT MATCHED THEN INSERT VALUES (b.ID, b.ITEM);


PS. b裡面是利用RANK()挑出每人最後一筆購物品。

   藍色→目標表格

   綠色→來源表格
   紅色→固定寫法



結果成功新增兩筆資料到 JB_LSTBUY_D :



Step4. 我們接下來試看看能不能同時做更新和新增

INSERT INTO JB_BUYLIST_T VALUES('JB','飲料','20110705');
INSERT INTO JB_BUYLIST_T VALUES('D12','飲料','20110705');
INSERT INTO JB_BUYLIST_T VALUES('YOYO','飲料','20110705');
目前清單如下圖




Step5. 再執行步驟3Merge語法,結果如下 (成功更新原本的兩筆資料 和 新增一筆資料):