星期二, 9月 22, 2009

jqgrid 3.5 需配合jquery ui

website:http://www.trirand.com/blog/
document: wiki jqgrid 趕流行,3.5後也利用wiki編文件了
download: jqgrid lastest

正要寫個新專案要用到jqGrid
看到jqGrid 3.5釋出了 就開心的拿來用
下載時發現 還「金熬」跟jquery ui一樣可自定要的功能再下載


青菜勾勾就按了下載...
解開壓縮檔 看到有install.txt
看都不看 照著過去的方法 就去設定了

結果搞了半天還沒出來
記得兩、三下就該用好的東西呀
還上網查了一下... 結果查到自己寫的設定 = ="
怪了... 最後認命的再打開install.txt看
才知道設定有改了,但是demo的內文還是用舊的
所以不能開心的全複製貼上...要小調一下

1.不用自定的theme,改用jquery-ui
download: jquery-ui
問:什麼..鏈結只是網站...
答:自己勾要載什麼啦 啥... 不知要勾什麼...這...問goolge大神吧
所以囉,要再html裡加入這句
<link rel="stylesheet" type="text/css" media="screen" href="path_to_ui_css_file/jquery-ui-1.7.2.custom.css" />

2.指定jqgrid.css
雖然改用了jquery-ui,但本身還是有其css設定
<link rel="stylesheet" type="text/css" media="screen" href="path_to_jqgrid_css_file/ui.jqgrid.css" />

3.指定grid.locale-XX.js及jquery.jqGrid.min.js
grid.locale-XX.js是語系包,在js/i18n的資料夾裡
jquery.jqGrid.min.js當然就是jgGrid本身的js啦
<script src="path_to_js_files/grid.locale-en.js" type="text/javascript"/></script/>
<script src="path_to_js_files/jquery.jqGrid.min.js" type="text/javascript"/></script/>


而原本設定的"imgpath"就用不到了
jQuery("#list4").jqGrid(
...
imgpath: gridimgpath //這行就不用了,拿掉
});


完整的範例如下 (利用array完成)
<html>
<head>
    <meta http-equiv="Content-Type" content="text/html; charset=utf-8">
    <script src="js/jquery-1.3.2.min.js" type="text/javascript"></script>
    <script src="js/i18n/grid.locale-en.js" type="text/javascript"></script>
    <script src="js/jquery.jqGrid.min.js" type="text/javascript"></script>
    <link rel="stylesheet" type="text/css" media="screen" href="css/ui-lightness/jquery-ui-1.7.2.custom.css" />
    <link rel="stylesheet" type="text/css" media="screen" href="css/ui.jqgrid.css" />

<script type="text/javascript">
$(function(){ 
    jQuery("#list4").jqGrid({
        datatype: "local",
        height: 250,
        colNames: ['Inv No', 'Date', 'Client', 'Amount', 'Tax', 'Total', 'Notes'],
        colModel: [
            {
                name: 'id',
                index: 'id',
                width: 60,
                sorttype: "int"
            }, {
                name: 'invdate',
                index: 'invdate',
                width: 90,
                sorttype: "date"
            }, {
                name: 'name',
                index: 'name',
                width: 100
            }, {
                name: 'amount',
                index: 'amount',
                width: 80,
                align: "right",
                sorttype: "float"
            }, {
                name: 'tax',
                index: 'tax',
                width: 80,
                align: "right",
                sorttype: "float"
            }, {
                name: 'total',
                index: 'total',
                width: 80,
                align: "right",
                sorttype: "float"
            }, {
                name: 'note',
                index: 'note',
                width: 150,
                sortable: false
            }],
                multiselect: true,
                caption: "Manipulating Array Data"
        });
    var mydata = [{
        id: "1",
        invdate: "2007-10-01",
        name: "test",
        note: "note",
        amount: "200.00",
        tax: "10.00",
        total: "210.00"
    }, {
        id: "2",
        invdate: "2007-10-03",
        name: "test2",
        note: "note2",
        amount: "300.00",
        tax: "20.00",
        total: "320.00"
    }, {
        id: "3",
        invdate: "2007-09-01",
        name: "test3",
        note: "note3",
        amount: "400.00",
        tax: "30.00",
        total: "430.00"
    }];
    for (var i = 0; i <= mydata.length; i++) 
        jQuery("#list4").addRowData(i + 1, mydata[i]);
    });
</script>
</head>
<body>
    <table id="list4" class="scroll" cellpadding="0" cellspacing="0">
</table>
</body>
</html>

星期四, 9月 17, 2009

jquery autocomplete ie 無效

新的網頁需要autocomplete的效果
用了半天卻用不出來
看看過去用的 程式碼一模一樣也沒用

不過在firefox就很開心的出現
ie就掛在那邊

一個個測試下才發現是
美工為了去除連結虛線框
在css裡加了以下這段
a,input {
outline: none; /* for Firefox */
hlbr:expression(this.onFocus=this.blur()); /* for IE */
}


這就難怪了
autocomplete就是在input被focus時才會出現
而這css在focus時 馬上就blur... 難怪沒出現

星期二, 9月 15, 2009

帳號、密碼的管理

存放帳、密
利用windows的註冊表來儲放帳、密

//在註冊表的HKEY_CURRENT_USER下建立AccountInfo資料夾及kevyu的鍵值
using Microsoft.Win32;
...
RegistryKey key = Registry.CurrentUser; //放在CurrentUser下
RegistryKey newkey = key.CreateSubKey(@"AccountInfo"); //在CurrentUser下建立AccountInfo資料夾
newkey.SetValue("kevyu", "ok1234"); //建立kevyu的密碼值 ok1234

//讀取值
RegistryKey mykey = key.OpenSubKey(@"AccountInfo", true);
Console.WriteLine("kevyu's password is " + mykey.GetValue("kevyu"));

當然 這樣存明碼實在太high了...
看下一步來加密

加密
存儲密碼——要做對

星期一, 9月 14, 2009

jQuery 套件 - 廣告輪播跑馬燈

網址:jQuery Cycle Plugin
效果不錯,而且範例的圖片及jquery core都是用網路鏈結
載回去就可以直接跑了 都不用更改路徑
就感心ㄟ
See More Demos and Examples

* Super Basic Demo (view source for details)
* Beginner Demos
* Intermediate Demos (Part 1)
* Intermediate Demos (Part 2)
* Advanced Demos (Part 1)
* Advanced Demos (Part 2)
* Even More Demos (lots of additinal demos can be found here)

<!-- 設定輪播框架外觀 -->
<style type="text/css">
.slideshow { height: 232px; width: 232px; }
.slideshow img { padding: 15px; border: 1px solid #ccc; background-color: #eee; }
</style>
<!-- include jQuery library -->
<script type="text/javascript" src="http://ajax.googleapis.com/ajax/libs/jquery/1.3.2/jquery.min.js"></script>
<!-- include Cycle plugin -->
<script type="text/javascript" src="http://jquery.malsup.com/cycle/jquery.cycle.all.js"></script>
<script type="text/javascript">
$(document).ready(function() {
$('.slideshow').cycle({
fx: 'fade' // choose your transition type, ex: fade, scrollUp, shuffle, etc...
});
});
</script>
</head>
<body>
<!-- 將要播放的物件(img,span,... 啥都可以)放容器裡 -->
<div class="slideshow">
<img src="http://jquery.malsup.com/cycle/images/beach1.jpg" width="200" height="200" />
<img src="http://jquery.malsup.com/cycle/images/beach2.jpg" width="200" height="200" />
<img src="http://jquery.malsup.com/cycle/images/beach3.jpg" width="200" height="200" />
<img src="http://jquery.malsup.com/cycle/images/beach4.jpg" width="200" height="200" />
<img src="http://jquery.malsup.com/cycle/images/beach5.jpg" width="200" height="200" />
</div>
</body>

星期三, 8月 05, 2009

SQL讀出DataTime欄位為0時 會失敗

即datatime的欄位值為0000-00-00 00:00:00時
讀出至datatable會失敗
這時在connection string裡加上這行
allow zero datetime=yes

星期四, 7月 23, 2009

div等其他tag做hover效果

透過<a 可以輕易的做到hover的效果
可是其他tag就不一定會有反應,不同的browser也可能有的會有hover效果,有的沒有
看破還是用onmouseover及onmouseout來做
比較麻煩的是要用this.style.*來做
動一下的感覺
onmouseover="this.style.padding='1px';"
onmouseout="this.style.padding='0px';"

//讓圖變透明
style="opacity:0.4;filter:alpha(opacity=80)"
onmouseover="this.style.opacity=1;this.filters.alpha.opacity=100;"
onmouseout="this.style.opacity=0.8;this.filters.alpha.opacity=80;"

星期二, 6月 23, 2009

特殊符號編碼

今天系統突然沒反應
看了才發現原來xml裡有特殊符號 造成xml判斷錯誤







< 小於&lt;
> 大於&gt;
& 和&amp;
' 單引號&apos;
" 雙引號 &quot;
斷行符號 &#13


特殊字符編碼大全 ... 自已google

透過C#寄發mail

1.直接寄發
透過System.Net.Mail,舊的System.Web.Mail不用了
reference
MailMessage 類別


2.呼叫outlook
需加入參考「 Microsoft Outlook 11.0 Object Library」
Outlook.ApplicationClass app = new Outlook.ApplicationClass();
Outlook.MailItemClass mi = (Outlook.MailItemClass)app.CreateItem(Outlook.OlItemType.olMailItem);
mi.BodyFormat = Outlook.OlBodyFormat.olFormatHTML;
mi.To = "yurenju@gmail.com";
mi.Display(new object());


references
C# 呼叫 Outlook

3.呼叫預設email程式
private void StartDefaultClient()
{
string filename = "mailto:jismenon@yahoo.com?subject=Hello&body=Hello&cc=meera@yahoo.com&bcc=jany@yahoo.com&Attach=@C:\\test.txt";
Process myProcess = new Process();
myProcess.StartInfo.FileName = filename;
myProcess.StartInfo.UseShellExecute = true;
myProcess.StartInfo.RedirectStandardOutput = false;
myProcess.Start();
}

references
Opening default Email client from a C# Application


p.s 斷行問題
body裡有斷行時,要改用escape("\n") 或 %0A
否則會沒效果

星期三, 6月 03, 2009

將DataTable裡的Byte column存入access

string[] myPicArrayTitle = new string[] { "Pic1", "Pic2"};
foreach(string title in myPicArrayTitle )
{
string strSQL = string.Format("Update PicInfo Set {0}=@{0} Where PicSN={1}", title, PicSN);
accessAdapter.MdbAccessOLE(strSQL , title,(byte[])dt.Rows[0][title]);
}
public bool MdbAccessOLE(string strSQL,string ColName ,byte[] FileByteArray)
{
this.my_StrConnection = "Provider=Microsoft.JET.OLEDB.4.0;data source=" + this.my_TablePath;
OleDbConnection my_conn = new OleDbConnection(this.my_StrConnection);
OleDbCommand cmd = new OleDbCommand();
cmd.Connection = my_conn;
cmd.CommandText = strSQL;
cmd.Parameters.Add("@"+ColName, System.Data.OleDb.OleDbType.Binary, FileByteArray.Length).Value = FileByteArray;

bool result = true;
try
{
cmd.Connection.Open();
cmd.ExecuteNonQuery();

}
catch (Exception ex)
{
result = false;
SharedAPI.Log_Error("MDB操作失敗, 錯誤訊息:" + ex.Message + " SQL:" + strSQL);
}
finally
{
cmd.Connection.Close();
}
return result;
}

星期一, 5月 04, 2009

開啟預設Browser

利用Process就可了

//直接執行,就是預設的browser
System.Diagnostics.Process.Start("http://www.google.com/");


要指定browser
//指定ie
System.Diagnostics.Process.Start("IExplore.exe", "http://www.google.com");

星期四, 4月 16, 2009

Word合併列印

Word 合併列印
太久沒用 有點忘了
跟Word 97好像不太一樣了
乙級軟應也是過去式啦...
Word 合併列印

同一頁套印兩筆不同的紀錄
初步的合併列印,在每新的一筆都是在新的一頁
如何在同一頁印兩筆不同的記錄咧
這時就插入<>變數即可完成
見以下範例

p.s 在<>變數之後 就會的變數 就會產生下一筆
因為要印第三筆,就貼2個<>變數
Word合併列印教學之二(同一頁套印兩筆不同的紀錄)

C# 列印 Word

列印文件
HOW TO:列印文件
若要列印整份文件
若要列印文件的目前頁面

這寫法還真特別
using Word = Microsoft.Office.Interop.Word;

合併列印

HOWTO:讓 Microsoft Word 由 Visual C# .NET 自動執行合併列印

jqGrid getRowData(id) 發生錯誤

不知為何就是錯了
後來查了一下
是因為利用$(x).load(xx);
把b網頁load進來,而該網頁已經有include jqury.js
把b網頁include jqury.js部份拿掉就ok了

星期二, 4月 14, 2009

Sql Database 加減日期時間

  1. Query裡下日期條件
    SELECT * FROM `Record`
    WHERE YEAR(`RecordDate`) = '2009'
    AND MONTH(`RecordDate`) = '9'
  2. 加減日期時間
    問:取出RecordDate欄位,並加上480分鐘(UTC TimeZone)
    MySQL
    //add 480 mins
    Select DATE_ADD(RecordDate ,INTERVAL 480 MINUTE) as RecordDate From ...
    //substract 30 days
    `UpdateTime` Between DATE_SUB(NOW() ,INTERVAL 30 DAY) And NOW()


    Access
    Select dateadd("n",480,RecordDate) as RecordDate From ...
Value Explanation
yyyy Year
q Quarter
m Month
y Day of the year
d Day
w Weekday
ww Week
h Hour
n Minute
s Second
Access: DateAdd Function

星期日, 4月 12, 2009

改變DataGridView的值或cell顏色

在設定DataSource後,改
dataGridView1.DataSource = DataTable;
foreach (DataGridViewRow dgv in dataGridView1.Rows)
{
row.DefaultCellStyle.BackColor = Color.Red; //改row的顏色
row.Cells["Col_AddUpdate"].Value = "新增"; //改內容值
}


但這樣改是無用的
因為必需在Bind Data的event後
private void dataGridView1_DataBindingComplete(object sender, DataGridViewBindingCompleteEventArgs e)
{
//在這裡改才有用
foreach (DataGridViewRow dgv in dataGridView1.Rows)
{
row.DefaultCellStyle.BackColor = Color.Red; //改row的顏色
row.Cells["Col_AddUpdate"].Value = "新增"; //改內容值
}
}

星期一, 3月 30, 2009

jQuery 1.2.x 升級 1.3.x 需注意

1.Selector
取input標籤name為go的值
$("input[@name=go]").val(); //原本在 jQuery 1.2.x 上是可行的'
$("input[name=tag]").val(); //但1.3.x後要把@拿掉,不然會出錯

其他原本有加@都要去掉,像[@selected][@checked]等

p.s
[attribute]: 有指定的屬性
[attribute=value] :屬性值為value
[attribute!=value] :屬性值不含value
[attribute^=value] :屬性開頭字串為value
[attribute$=value] :屬性結尾字串為value
[attribute*=value] :屬性值包含value

remark: [attribute=value]與[attribute*=value]看起來很像,但還是有不同
一個是完全符合,一個是有包含,有看到有人寫後者是取多個,應該是不正確的

remark:
不知為何 用[name='test']時,如果全是span是ok的
但如果有個<a name=test>或input 就會只找到這一個

另外
$("XmlParentNode XmlChildNode[name='xx']").xx <==這樣用 好像會找錯
$("XmlParentNode").find("XmlChildNode[name='xx']").xx 才會找對


References:
3 Quick Steps for a Painless Upgrade to jQuery 1.3

星期六, 3月 28, 2009

jQuery取browser值

$(document).height();
$(window).height();

字面上看來window應是視窗的高,document是body的高
但測試後,window的高會比document小
太奇怪了
而且最大化視窗,兩個值還是一樣的...
要再研究


ps.如果是IFrame,值都會比較小

搞清楚clientHeight, offsetHeight and scrollHeight

透過jQuery取高(寬),有三個
1.height()
2.innerHeight() //不含border,padding
3.outerHeight() //包含border,padding及hidden elements

另外javascript本身取document.body有
  • clientHeight
  • offsetHeight
    offsetHeight是自身元素的高度
    *ie7不支援
  • scrollHeight
    scrollHeight是 自身元素的高度+隐藏元素的高度。

其實還是不太懂...

*DIV設Height:100% 沒反應
當在網頁裡多了以下的宣告
就會造成height的100%無效
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4>/strict.dtd">

查了一下
重點是因為body沒有height屬性,所以加入下面這行就可以啦

References
clientHeight、offsetHeight 和 scrollHeight
花点时间搞清top、postop、scrolltop、scrollHeight、offsetHeight

星期五, 3月 27, 2009

常用的正規表達示-統計

  • 統計字串中內某字元或字串出現次數
    /*
    * JavaScript 
    * 找出cloudchen有幾個c
    */
    var str =  "cloudchen"
    var find = "c";
    var reg = new RegExp(find,"g")
    var result = str.match(reg);
    var count = (result)?result.length:0;
    console.log('共:%d次',count);
    reference: JavaScript 統計字串中內某字元或字串出現次數
  • 統計字串中內某字元或字串出現次數
    去-,:,空白,由於"-"是保留字,所以在前面要加\
    //C#.Net
    System.Text.RegularExpressions.Regex reg = new System.Text.RegularExpressions.Regex(@"[:|\-| ]");
    string datetime = "2009-01-02 03:04:05";
    datetime = reg.Replace(datetime, "");
    Console.WriteLine(datetime); //輸出20090102030405
    .Net的Regex位於System.Text.RegularExpressions之下

References:
Regular Expression (RegExp) in JavaScript 還可以直接測試
regular language 說明表格

星期四, 3月 26, 2009

如何做行銷計劃

1.動機:告訴別人 為何要做
  • 因為有新產品 (New Product)
  • 因為有新市場 (New Market)
  • 取代舊的Plan

2.分析
分析易有主、客觀認知,如非洲人不穿鞋
分析工具
  • SWOT分析
  • BGC,界定定位

3.製訂行銷策略
4P,6P(People,Procedure)

4.日程表/Budget
甘特圖

星期三, 3月 18, 2009

jQuery的BlockUI

可拖曳 - draggable
自己裝厲害,還自己載了jquery-ui
將blockui的div加上draggable
想想blockui怎麼可能沒有draggable功能
某天看blockui.js 發現了draggable:true;
才知道自己沒看注意demo就有教了
不過blockui的draggable也是依附在jquery-ui,自己載
$.blockUI({
 message: $("#mydiv"),
 draggable: true //加上這行囉
}


設定長寬高
$.blockUI({
 message: $("#mydiv"),
 css: {
 padding: 0,
 margin: 0,
 width: '30%',
 top: '30%',
 left: '25%',
 color: '#000',
 border: 'none',
 cursor: 'auto'
}

當blockUI裡的div或table有限定固定的width時
blockUI套件裡的外框已設定為30%
所以當畫面變大時,就有可能兩旁會有空白

這時就去blockui.js裡把這個拿掉就ok了
就有前幾行而已 很好找的
width: '30%',


錯誤
某些情況下 jQuery會發生錯誤

通常是在這一頁被轉頁後,又下了blockui的操作
錯誤發生在blockui.js裡的
function focus(back){
...
e.focus(); <===這裡...
}

看用catch抓住,再log起來吧...免得跳出錯誤訊息又要被老板唸了
function focus(back){
...
try {
e.focus();
}catch (ex) {
$.unblockUI(); //抓解開block...至少畫面還可以操作
}
}

星期一, 3月 16, 2009

jQuery的accordion 會亂閃亂跳動

利用accordion 完成選單後
click每個選項卻發現選項會跳動
看demo卻好好的
研究了一下 原來demo的html有這一句

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html>
...
</html>

星期五, 3月 13, 2009

JavaScript開檔 window.open 會跳ie視窗

一般用window.open("xxx.exe")即可
但都會先跳出個ie視窗 再問要不要下載、儲存
可利用ActiveXObject('WScript.Shell')就可以直接執行了
new ActiveXObject('WScript.Shell')).Run('test\\start.exe'); //執行位於test資料夾下的start.exe

完整的範例
< A href="javascript:(new ActiveXObject('WScript.Shell')).Run('test\\start.exe');void(0);"> click me < /a>


利用JavaScript轉址
之前有用過
window.href="http://xxx";
window.location.href="http://xxx";
不過有時都會沒反應
後來用
window.location = "http://xxx";
至少... 還沒問題..

星期四, 3月 12, 2009

如何讓光碟Autorun

autorun.ini
[autorun]
OPEN=xxxx.exe
ICON=yyyy.ico //光碟畫面的icon



如果是跑xxx.hta等,非win32應用程式
功能就像寫在.bat裡
[autorun]
shellexecute=Setup.hta

星期一, 3月 09, 2009

jqgrid 特殊技

設定
1.設定標題欄位高度
不知從那調,硬是拆html找出地方調
var tbTitle = $("#tbRecordList").parent().prev();
$(tbTitle).find("tr:first").find("div").css("height","18"); //12pt字型適用

2.硬將tbody的滑鼠改成"手指"
$("#tbRecordList tbody").css("cursor","pointer");

方法
1.排序

有兩種方法
1.$("#tablename").sortGrid('myname',true); //reload
//If the reload is set to true, the grid reloads with the current page and sortorder settings.
2.$("#tablename").setGridParam({sortname:'myname'}).trigger('reloadGrid');

2.隱藏欄位
使用者選擇
http://www.trirand.com/jqgridwiki/doku.php?id=wiki:show_hide_columns

程式事先隱藏
jQuery("#tbRecordList").hideCol(["recordDate"]);



3.讓某欄位被選到
//setSelection(id,onsetselection) if true the event onSetRow is launched
jQuery("#tbRecordList").setSelection('1',true);


讓header text出現hint
目前還沒看到有什麼method可用
就先手動設定吧
jqgrid會利用建立時,所取的欄位名(name,不是index哦)
加上jqgh_來命名該header的span,如下
jQuery("#jqgh_test").attr("title", "This is title");

星期六, 3月 07, 2009

玩遊戲會重開機

就只有玩遊戲時才會發生
太神奇了
還以為是不是有什麼力量叫我該努力了 不要再玩了
上網查了一下

有人提到是是音效卡的問題
利用DirectX診斷工具
把音效的加速層級從"完全加速"改為"基本加速"
就沒有發生過當機了...

不過自己倒是...又發生了
又研究了一下
發現在同頁面有個「測試DirectSound」
就按了來試試
發現寫說不支援硬體加速
所以改成「沒有加速」
再試試囉

p.s如何啟動「DirectX診斷工具」
1. 按一下 [開始],然後按一下 [執行]。
2. 輸入 dxdiag,然後按一下 [確定]。
3. 在 [系統] 索引標籤上,記下 [DirectX 版本] 列所顯示的 DirectX 版本。
4. 在 [DirectX 檔案] 索引標籤上,檢查每個 DirectX 檔案的版本資訊。
5. 檢查完檔案版本之後,按一下 [結束]。

Reference
玩遊戲重開機~~
如何使用 DirectX 診斷工具

星期四, 3月 05, 2009

批評建議

  • 2011.1.12
    我覺得你們家不是個正常溫暖的家庭 回去面對的不是責罵就是碎念 或是面對一群根本沒有血緣關係的人 到處串門子 我覺得沒有意義

    重要的婚喪喜慶 節日 生日 我該配合回去的我都回去了
    你明明知道我不愛回去 每次我配合回去 你會說謝謝我回去 但之後 卻又會忘記這些 額外要求我要幹嘛幹嘛
    那個家庭是你的責任不是我的 我只需做到我該做的
    或許你會覺得我不孝順 但是你也知道以前我不是那麼不愛回去的人
    其實結婚前後 你爸 你妹 阿公阿嬤 對我都沒有改變 我很感激
    但是你媽變太多了 我很怕
    我真的很怕
    還有一堆婆媽阿姨 我很不喜歡
    但是你媽變太多了 我很怕
    我真的很怕
    還有一堆婆媽阿姨 我很不喜歡
    為什麼別人的媳婦面對的 是一個正常的家庭 就是家人 我卻還要面對 我永遠記不起來的外人
    再來 你回去 跟著你媽東奔西跑 有意義嗎 你要陪的是你爸 你阿公阿嬤
    但你有時候沒有說話的拳利 要跟著你媽辦一堆在我看來沒有意義的大事
    然後回來再跟我說 你沒有陪家人
    這樣對嗎
    最後我要說的是
    我不知道你到比幫我擋了多少
    但我覺得你"號稱長子 長孫" 但說話好像沒有分量
    你在幫我說話的時候 永遠一附站不住腳的感覺
    永遠像個小孩再跟爸媽說謊
    為什麼都沒有辦法理直氣壯
    我媽在我們結婚當天 就告訴你 要當個有肩膀的人
    你要扛起來啊
    為什麼不能說 我回來就好了 幹嘛每次都有帶她 的那種氣魄
    不是藉口
    我需要的不是藉口
    根本不用藉口
    就是"他回來幹嗎?" 我回來就好的那種態度
    我只能說 你每次都擋了7成 最後3成還是掃到我
    如果你講話有份量 還有三成會掃到我嗎
    有責任的時候 就說你是長子長孫大哥
    但說話一點分量都沒有
    像個孩子被擺布
    你都自以為長大了 處理得很好 擋了很多
    但在我看來還是不及格
    所以我很累
    我求你不要自以為長大了 趕快真正長大好嗎
  • 2009.3.5
    • R:Error Handling要加強
    • M:仔細檢查,再把結果給別人
    • A:遇到問題多討論,避免做白工
    • D:
      • PDCA要做好,規劃有做好,就不會有問題
      • 管理:溝通文件要做好
      • 態度要改進,不再是學生,錯了有人handle;商業軟體,要以滿足客戶為出發點,不是功能達到即可
  • 2008年工作回顧
    • 工作上的態度,有時表現失常,造成其他人心裡不舒服
    • 需加強底層的觀念,溝通技巧、態度可以再柔軟一些
    • 工作結果需多檢查再丟出來

    工作都1年了,還是這樣
    下個星期要壓光碟了,程式還會當

軟體專案管理

《人月神話》
《最後期限》
《與熊共舞》
《你想通了嗎?》

《溫伯格的軟體管理學》
如果《人月神話》是一種反思與沉澱,那麼《溫伯格的軟體管理學》就是軟體專案管理的最佳實務!

星期三, 3月 04, 2009

ClickOnce 和 Windows Installer 的比較

用了一陣子的ClickOnce
雖然已知ClickOnce有先天的限制
不過覺得相當簡單好用
所以下定決定要克服這些限制
卻也花了不少時間查別人如何做
雖然克服了一些 但距正規安裝落差還是一大段
最後還是放棄了
乖乖的去學InstallShield

鏈結有比較表
先天無法克服的...就不要硬拚了...
有做出來就還可偷笑一下...
做不出來不僅累了自己 還要被人定
ClickOnce 和 Windows Installer 的比較表

星期二, 3月 03, 2009

自定螢幕解析度

最近看LCD大降價 想台大螢幕的來取代17吋的LCD
聽信網路謠言說LCD螢幕16:10比較適合看網頁
於是乎 買了Philips 220CW 22吋大LCD

開始一看 最佳解析度 1680*1050 60Mhz
卻發現顯卡沒有此選項只有1600*1024 ...
那就1600*1024先開來看看吧
oh no~~~ 除了被壓成扁身外 居然連字都變糊的

把解析度調低至1280*800 才變清析
原想那就這樣吧 一向來逆來順受
可是實在不甘心 雖然LCD已經跟前陣子比較來便宜了許多
但是花了錢 卻只能用較低的解析度
明明畫面這麼大 桌面的圖示、字型都可以再小一點 不甘呀~~~
好吧 試著亂調不行、重灌LCD,顯示卡Driver都失敗

原廠軟體出動
實在是「有步想到無步」
拿出LCD廠都會附的沒用光碟
灌了原廠附的軟體

看到了一個Resolution 字眼應該滿像的
又看到說明有寫clear text... 就是這個啦
就給他按下去
果然....字變清析了...
ya 又讓我回抱這22吋的感動

再拚1680*1050
事隔1年多
雖然字已是清析 但依然不是 1680*1050
畫面還是被壓成1600*1024 圖都扁扁的 看了就覺得很"礙優"
想一想 沒有這個1680*1050 那是不是有軟體可以自定這個解析度
後來看到NVIDIA的軟體可以自定 不過我的顯卡是Ati的 慘念
最後找到PowerStrip這個軟體
我的22吋總算出現了最佳解析度.... 而且連字也是清析的..
嗚 好感動

Reference:
【教學】為繪圖卡及螢幕設定自訂解析度

星期四, 2月 26, 2009

InstallShield 將'必要條件' 來源設為與source相同位置

版本:InstallShield 2009,2010 - Premier or Professional
設為跟source相同位置後,就是要下載相關的檔案

1. 設定必要條
在Project Assistant裡勾選完「必要條件」(Prerequirist)

2. 啟動Release Wizard
Premier及Professional都可以到「Installation Designer」界面
再點選底下的 「Meda/Releases」
右側會出現「Releases」的樹狀圖,再其右鍵「Release Wizard」

 









 3.設定"必要條件"資料來源
勾選Extract from Setup.exe

這時便會要求要下載"必要條件"












4.勾選要下載的"必要條件"
一步步往下做,就會發現Wizard會詢問了
過程中選擇.net framework時,勾選符合語系的檔, 另外原文版的也要勾選

p.s. 原文的.net framework為「.Net Framework Version X.X Redistributable Package」
找 了好久...



 選好後,下一步 便會自動下載啦












p.s 直接在Releases右鍵Release Wizard是會產生一個新的Build Installation程序
如果要 利用Project Assistant的Build Installation產生安裝檔
要在該樹狀結構選擇 「PROJECT_ASSISTANT」底下的檔右鍵Project Assistant

如果沒看到「PROJECT_ASSISTANT」,就先利用Project Assistant產生一次安裝檔後,就會出現了


p.s. Express版本沒試過

星期二, 2月 17, 2009

當系統程式掛時 給於使用者提示

就在系統掛時 還可以給個提示...
說是windows有問題....不是我寫的程式掛了 哈

1.先catch exception
系統會掛 通常發生在exception發生了,但沒有catch到
所以可以用ThreadException來抓到沒有handle到的excpetion
Application.ThreadException += new ThreadExceptionEventHandler(HandleException);

而Application.ThreadException只能handle到主執行緒上的Exception
當有thread或某些情況下,這event就不會被觸發
所以得另外用AppDomain.CurrentDomain.UnhandledException
AppDomain.CurrentDomain.UnhandledException +=
new UnhandledExceptionEventHandler(UnhandledException);

細節查關鍵字就可以找到了

2.Report Error


*註
UnhandledExceptionEvent在執行編譯過release下的exe才會抓到
UnhandledExceptionEventdebug的抓不到,而ThreadExceptionEvent好像debug模式下可以

Reference
C# Tutorial - Dealing With Unhandled Exceptions
如何在程序中友好提示錯誤

演講

事前準備
1.聽眾背景
決定topic及內容深淺
2.可用媒介
先探聽場合可用的媒介,以免準備了投影片,現在卻沒投影機可用
3.內容
不要讓聽眾讀,特別是投影片,遵守6*6原則
英文每行不超過6個字,每頁不超過6行
中文每行不超過6個詞, ...
投影片速度 1頁/1分 ,太多聽眾不會有印像

演講時
1.站姿:自然即可
2.視線接觸:與聽眾有眼神接觸,抓住他的注意
3.距離:看到想睡的人,可以走近他,讓他不敢睡
4.速度:
10~20人,120~150字/分
30人以上,90~120字/分
5.加深印像
可重覆的帶重要的topic,讓聽眾重覆複習加深印像

星期日, 2月 15, 2009

js顯示loading gif 動畫不會動

利用一個click事件
要顯示loading動畫的gif
可是圖片卻會卡住不會動
就像沒開thread一樣的卡住畫面

想了半天還是不知為了
後來看了程式碼
&lt a href="javascript:void(0);"&gt &lt img src="xx"&gt
當初利用anchor tag來當做click事件的元件
其中javascript:void(0) 是當初為了取代# 而用
就在亂試之下,改回#字後 重新click居然可以了
真是感動...
先寫下了 免得以後又發生

星期六, 2月 14, 2009

.Net Process相關應用

.net的Process
除了可以自己new起來外
還加參數
myProc.StartInfo.Arguments = "xx";

偵測Process結束事件
myProc.Exited += new EventHandler(myProcExit);

星期五, 2月 13, 2009

讓程式在Vista下 以「系統管理者」身份執行

在Vista下
當程式需要有系統管理者權限時
Vista是通過manifest來判斷所需的權限
也就是 YourProgram.exe 就會看同位置下的 YourProgram.exe.manifest (xml檔)
主要有2個步驟
1.先編這個xml檔
(1)複製「專案/Properties」下的app.manifest
(2)再把裡的name修改成YourProgram.exe
(3)把的level改成requuirAdministrator
*如果沒app.manifest這個檔案,右鍵「專案/屬性」下的分頁「安全性」,把啟用ClickOnce安全性設定取消就會出現了


2.編完後,利用mt.exe 來下
mt -manifest YourProgram.exe.manifest -outputresource:YourProgram.exe

*編完得到失敗結果:
Code:9009 => 找不到mt.exe , 找出mt.exe 再加入
通常會在C:\Program Files\Microsoft SDKs\Windows\v6.0A\bin 底下找到mt.exe
到環境變數裡Path設定吧
C:\Program Files\Microsoft SDKs\Windows\v6.0A\bin;
Code:31 => 還不是很確定,就多按幾下 或切個畫面就可以了

Reference中有詳細的圖文說明
就照著步驟做吧
「就感心」的是 筆者有教在「建置後事件命令列」中,放進步驟2
也就是當你的程式compile後,就會自動來執行這段指令。
不然多個步驟 忘了編就麻煩了
*將manifest檔放到bin/Release下

Reference

如何讓你的C#程式在Vista上以「系統管理者身分」執行

星期四, 2月 12, 2009

利用WM_DEVICECHANGE抓Port Name

除了用監聽Usb event外
還可利用WM_DEVICECHANGE來攔截相關訊息
由於網路上多是C/C++的實作
真不容易找到C#的 但又沒有完整的用C#查Port Name
在Reference[2]有相關的教學,但沒有查Port Name
就看了MSDN的說明,依樣畫葫蘆做出來了
Reference[2]裡有做了 Win32的class
[StructLayout(LayoutKind.Sequential)] public class DEV_BROADCAST_PORT {
public int dbcp_size;
public int dbcp_devicetype;
public int dbcp_reserved;
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 128)]
public char[] dbcp_name;
}

然後在DBT_DEVICEARRIVAL裡,再改成用剛寫的StructLayout DEV_BROADCAST_PORT
if (m.WParam.ToInt32() == DBT_DEVICEARRIVAL)
{
Marshal.PtrToStructure(m.LParam, typeof(Win32.DEV_BROADCAST_HDR));
int dbccSize = Marshal.ReadInt32(m.LParam, 0);
int devType = Marshal.ReadInt32(m.LParam, 4);

if (devType == Win32.DBT_DEVTYP_PORT)
{
Win32.DEV_BROADCAST_PORT dip = (Win32.DEV_BROADCAST_PORT)
Marshal.PtrToStructure(m.LParam, typeof(Win32.DEV_BROADCAST_PORT));
string csTemp = "COM" + dip.dbcp_name[6].ToString(); //dbcp_name是一串字,在第6個是COM的Number
//MessageBox.Show(csTemp + " arrived/removed");
listBox1.Items.Add(csTemp + " arrived/removed");
}
}


Reference
1.MSDN WM_DEVICECHANGE Message MSDN的說明
2.Retrieving dbcc_name string from a DEV_BROADCAST_DEVICEINTERFACE structure 有VB及C#的實作

星期二, 2月 10, 2009

開啟網芳超慢

不知為何每次要開啟網芳就很慢
但利用ip位置 直接開啟 倒是挺快
上網survey了一下
利用下面的方法 果然有變快

把 W2K、WinXP 登錄檔中
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\RemoteComputer\NameSpace
下面的 {D6277990-4C6A-11CF-8D87-00AA0060F5BF} 刪除,
不需要重開機馬上就見效,Win2k 及 WinXP 均有效。

Reference
winxp 網路芳鄰開啟超慢
Windows XP 系統調校秘技

星期五, 2月 06, 2009

USB轉Comport時 查DeviceID及佔用的Comport name

利用WQL查詢
位置:「root\\WMI」下的「MSSerial_PortName」
ManagementObjectSearcher searcher =
new ManagementObjectSearcher("root\\WMI",
"SELECT * FROM MSSerial_PortName");


MSSerial_PortName下有三個屬性
1.Active
2.InstanceName //即DeviceID
3.PortName //佔用的Port name

找USB插入的佔用的Port name
ManagementObjectSearcher searcher =
new ManagementObjectSearcher("root\\WMI",
"SELECT * FROM MSSerial_PortName Where InstanceName like '%VID_067B&PID_2303%'"); //這裡是利用Prolific做的驅動程式

foreach (ManagementObject queryObj in searcher.Get())
{
Console.WriteLine("-----------------------------------");
Console.WriteLine("MSSerial_PortName instance");
Console.WriteLine("Find Beacon at Port:{0}", queryObj["PortName"]);
Console.WriteLine("-----------------------------------");
}

p.s 在vista下 會因為UAC (User Account Control) 而會遇到Access Denied
解決方法
1.以 run as administrator 的方式執行就能動
2.到「控制台/使用者帳戶」 把UAC(使用者帳戶控制)關閉,就可以了
3.想要程式自動設好... 讓程式在Vista下 以「系統管理者」身份執行

Reference
1.A Useful WMI Tool & How To Find USB to Serial Adaptors
2.Vista 底下如何加入WMI provider dll?

星期三, 2月 04, 2009

C#查詢Windows已安裝的軟體

找某軟體是否已安裝

  1. 先取得軟體安裝路徑
    可利用regedit.exe,到LocalMachine下的Software查軟體安裝註冊表
    比如說要查Prolific Technology INC 公司的 PL-2303 USB-to-Serial
    得知路徑為
    string path = "Prolific Technology INC\PL-2303 USB-to-Serial";
  2. 程式寫法
    程式的話,就可以透過Microsoft.Win32.Registry 達成
    比如說要查Prolific Technology INC 公司的 PL-2303 USB-to-Serial
    在程式註冊表中會在SOFTWARE資料夾中Prolific Technology下找到PL-2303 USB-to-Serial
    如果可以找到代表有安裝,所以程式可寫成
    regkey = Registry.LocalMachine.OpenSubKey("SOFTWARE", true).OpenSubKey(@"SOFTWARE下的路徑", true); 

以下為完整範例
//先引用Microsoft.Win32
using Microsoft.Win32;

public bool findSoftwareInstalled()
{
  try
  {                   
    //找PL-2303 USB-to-Serial 是否安裝
    string path = "Prolific Technology INC\PL-2303 USB-to-Serial";
    RegistryKey regkey = Registry.LocalMachine.OpenSubKey("SOFTWARE", true).OpenSubKey(@path , true);
    if (regkey == null)
    {
       //"註冊表內無儲存安裝訊息";
       return false;
    }
    else
    {
      //已安裝,可利用regkey.GetValue("xxx").ToString(); 取得相關資訊
      return true;
    }
  }
  catch (Exception ex)
  {                
    Console.WriteLine(ex.Message.ToString());
    return false;
   }
}

*Clickonce安裝位置
利用clickonce安裝的軟體不會在LocalMachine下的Software
而會是在CurrentUser的Microsoft\Windows\CurrentVersion\Uninstall下

利用WQL 找Windows裡相關資訊

先引用WQL所在的namespace
using System.Management; //要先在專案的參考加入System.Management


找Driver
public bool getDrivers()
{
ManagementScope scope = new ManagementScope(@"root\CIMV2");
ObjectQuery query = new ObjectQuery("WQL", "SELECT * FROM Win32_SystemDriver");
ManagementObjectSearcher search = new ManagementObjectSearcher(scope, query);
ManagementObjectCollection col = search.Get();

if (col.Count == 0)
{
return false;
}

Console.WriteLine("Win32_SystemDriver instance (Total Found:{0})", col.Count.ToString());
Console.WriteLine("-----------------------------------");
foreach (ManagementObject obj in col)
{
string driverlist = obj.ToString().ToUpper();
if (driverlist.Contains("SER2PL")) //此例是找SER2PL,更換你要的Driver Name
{
Console.WriteLine("找到Driver已安裝,Name: {0}", obj.ToString()); //name 是 Unique identifier for the service
return true;
}
/*
//印出所有屬性
foreach (PropertyData propertyData in obj.Properties)
{
ManagementBaseObject mbo = null;
if ((mbo = propertyData.Value as ManagementBaseObject) != null)
{
foreach (PropertyData prop in mbo.Properties)
Console.WriteLine("{0} - {1}", prop.Name, prop.Value);
}
}
* */
}
search.Dispose();
col.Dispose();

return false;
}


References:
可直接下拉查詢相關的資訊
WMI Code Creator v1.0

星期三, 1月 21, 2009

ClickOnce 必要條件 - 從相同位置下載必要條件

搞死人了
怎麼樣都無法設定好
在老板的淫威逼迫下 總算把這搞定了

狀況
為了讓使用者不必透過網路下載「必要條件」
所以在ClickOnce「必要條件」設定「從應用程式的相同位置下載必要條件」
但都會發生類似以下令人抓狂的錯誤:
1.錯誤 無法發行,因為無法建置專案錯誤。
2.錯誤 必要條件的安裝位置沒有設定為「元件廠商的網站」,且磁碟上找不到項目 '.NET Framework 2.0' 中的檔案 'DotNetFX\instmsia.exe'。如需詳細資訊,請參閱 [說明]。
3. 錯誤 必要條件的安裝位置沒有設定為「元件廠商的網站」,且磁碟上找不到項目 '.NET Framework 2.0' 中的檔案 'DotNetFX\WindowsInstaller-KB893803-v2-x86.exe'。如需詳細資訊,請參閱 [說明]。
4.錯誤 必要條件的安裝位置沒有設定為「元件廠商的網站」,且磁碟上找不到項目 '.NET Framework 2.0' 中的檔案 'DotNetFX\dotnetfx.exe'。如需詳細資訊,請參閱 [說明]。
5.錯誤 必要條件的安裝位置沒有設定為「元件廠商的網站」,且磁碟上找不到項目 '.NET Framework 2.0' 中的檔案 'DotNetFX\langpack.exe'。如需詳細資訊,請參閱 [說明]。


問題點:需下載相關的檔案,並放到對的位置,問題就在這位置不知要放哪,且依SDK不同放的位置也不同,而且3.5還需設定xml檔


針對不同版本的Framework會有不同的解決方法
A.必要條件.Net Framework 2.0版
Step1 環境確認
IDE:C# 2008 Express

Step2 下載必要檔案
需要4個檔案,click鏈結可以直接下載檔案,如果鍵結斷了,可以直接search關鍵字
1.instmsia.exe
2.WindowsInstaller-KB893803-v2-x86.exe
3.dotnetfx.exe
4.langpack.exe

Step 3 放至指定資料夾
將全部的檔案丟到
C:\Program Files\Microsoft SDKs\Windows\v6.0A\Bootstrapper\Packages\DotNetFX
在錯誤訊息中指出,這個資料夾缺了這四個,但即使將這四個檔放進這資料夾,還是會出現潮少langpack.exe,也就是說錯誤訊息剩下2個
1.錯誤 無法發行,因為無法建置專案錯誤。
2.錯誤 必要條件的安裝位置沒有設定為「元件廠商的網站」,且磁碟上找不到項目 '.NET Framework 2.0' 中的檔案 'DotNetFX\langpack.exe'。如需詳細資訊,請參閱 [說明]。

明明都寫這位置了,卻還是不行,看了一下該資料夾下還有個「zh-CHT」
就順手把 langpack.exe 丟進去,結果就成功了
大家試試吧

References:
VB2005 Express 部署問題
VS bootstrapper packages for .NET Framework 2.0 SP2 and 3.0 SP2 available for download

B.必要條件.Net Framework 3.5 SP2
照著網誌的做法就可以成功了
ClickOnce 發佈時,一起發佈 Framework 套件
ClickOnce 暨 Framework 3.5 發佈失敗的問題

星期日, 1月 18, 2009

如何維持.net程式單一執行個體應用程式

VB專案可以很開心的依以下路徑設定 就完成這限制
「專案=>屬性=>應用程式=>建立單一執行個體應用程式 」

不過其他的如C#等語言 就得自己寫程式
C#裡
/*
Code Snippet
Just add that piece of code (here in C#) in your main method (you need to
include the System.Diagnostic namespace) :
*/
Process currentProcess = Process.GetCurrentProcess();

Process [] allProcesses =
Process.GetProcessesByName(currentProcess.ProcessN ame);

if (allProcesses.Length > 1)
{
MessageBox.Show(currentProcess.ProcessName + " is already running !",
currentProcess.ProcessName, MessageBoxButtons.OK, MessageBoxIcon.Error);
}
else
{
//do your stuff here
}

VB
/*
Code Snippet
In the VB.NET application:
*/
Dim m As Mutex = _
New Mutex(False, "{11C92606-65D9-4df2-9AEA-B6A4DA91BCE2}")
If m.WaitOne(10, False) Then
Application.Run(New Form1())
m.ReleaseMutex()
Else
MessageBox.Show("Application already running!")
End If


Reference:
[VB 2005]如何避免程式(.exe)連開兩個以上

後記
除了維持單一執行應用程式外
應該不只是關閉新開的程式,而且要喚起即有的程式視窗
據說一般是利用hook達成... 等研究出來再補上

ClickOnce加入桌面Shortcut

ClickOnce本身沒支援
不過還是有人硬寫出來了

/// <summary>
/// This will create a Application Reference file on the users desktop
/// if they do not already have one when the program is loaded.
// If not debugging in visual studio check for Application Reference
// #if (!debug)
// CheckForShortcut();
// #endif
/// </summary>
void CheckForShortcut()
{
ApplicationDeployment ad = ApplicationDeployment.CurrentDeployment;
if (ad.IsFirstRun)
{
Assembly code = Assembly.GetExecutingAssembly();
string company = string.Empty;
string description = string.Empty;
if (Attribute.IsDefined(code, typeof(AssemblyCompanyAttribute)))
{
AssemblyCompanyAttribute ascompany = (AssemblyCompanyAttribute)Attribute.GetCustomAttribute(code,typeof(AssemblyCompanyAttribute));
company = ascompany.Company;

}
if (Attribute.IsDefined(code, typeof(AssemblyDescriptionAttribute)))
{
AssemblyDescriptionAttribute asdescription = (AssemblyDescriptionAttribute)Attribute.GetCustomAttribute(code, typeof(AssemblyDescriptionAttribute));
description = asdescription.Description;
}
if (company != string.Empty && description != string.Empty)
{
string desktopPath = string.Empty;
desktopPath = string.Concat(Environment.GetFolderPath(Environment.SpecialFolder.Desktop), "\\", description, ".appref-ms");
string shortcutName = string.Empty;
shortcutName = string.Concat(Environment.GetFolderPath(Environment.SpecialFolder.Programs), "\\", company, "\\", description, ".appref-ms");
System.IO.File.Copy(shortcutName, desktopPath, true);
}
}
}


remark
1.clickonce利用company name在「開始/程式集」中建立路徑,而description為「捷徑檔的名稱」
所以記得在clicknoce中設置company及description,否則上面的程式會找不到
2.另外clickonce的「發行/選項」的「產品名稱」及「應用程式/組件資訊」的「描述」,兩者要一致,不然會找不到
說明:
「發行/選項」的「產品名稱」是clickonce部署後,在程式集命名捷徑的命稱
「應用程式/組件資訊」的「描述」是上述程式asdescription.Description所取得的,所以這一項要跟產品名稱相同,才找的到clickonce設的捷徑

References:
How to add Desktop Shortcut to ClickOnce Deployment Application

星期四, 1月 15, 2009

強迫退出程序

不知何時手賤加了什麼東西
利用Application.Exit()要將程式碼退出
就會發生「無法使用已經從其基礎 RCW 分離的 COM 物件」
不知是不是加了NotifyIcon的關係
總之... 給他強迫退出 Environment.Exit(0);
就開心的解決了

p.s 強迫退出後,NotifyIcon的圖示還會留著,所以要exit前,先將NotifyIcon.dispose();

Reference:
强制退出WinForm程序之Application.Exit和Environment.Eixt

星期三, 1月 14, 2009

JavaScript Regular Expression - 驗證

如何使用Regular Expression
//驗證email格式
var pattern = new RegExp();  
pattern = /^\w+([\.-]?\w+)*@\w+([\.-]?\w+)*(\.\w{2,3})+$/;
if (!pattern .test(email)) {
return false; //"email格式不對"
}
其實也不用特別再new RegExp,直接給pattern就可以了
javascript是這樣啦,其他的語言應該不行

  • 驗證email格式 *一定要有@
    pattern = /^\w+([\.-]?\w+)*@\w+([\.-]?\w+)*(\.\w{2,3})+$/;
  • 驗證密碼
    *至少有一個數字
    *至少有一個小寫英文字母
    *至少有一個大寫英文字母
    *字串長度在 6 ~ 16 個字母之間
    var pattern = /^(?=.*\d)(?=.*[a-z])(?=.*[A-Z]).{6,16}$/;
    
    //簡單點,不考慮英文大小寫
    var pattern = /^(?=.*[a-zA-Z]+)(?=.*\d+).{6,16}$/;
Reference:
使用 Regular Expression 驗證密碼  

星期一, 1月 12, 2009

browser間的支援度

iframe問題
iframe doesn't work in IE7
原本利用屬性width及height設為100%,在ie7就會掛了
查了一下,利用style來設定就搞定
< IFRAME SRC='gnagna.htm' STYLE='width:100%;'>< /IFRAME>

星期四, 1月 08, 2009

利用PrintDocument列印

.net提供PrintDocument 的列印功能
以下是主要提供的功能
  • PrintDialog 顯示標準列印對話方塊,供使用者選擇印表機與變更印表機選項
  • PrintPreviewDialog 在預覽視窗中顯示報告內容
  • PrintPreviewControl 將第一頁報告內容顯示於可納入表單中的控制項
  • PageSetupDialog 顯示標準頁面設定對話方塊,讓使用者可選擇直向或橫向列印,以及變更邊界設定


new PrintDocument的物件
要自己handle PrintPageEvent
再用Print()來觸發PrintPageEvent
remark: 當利用PrintPreviewDialog時,ShowDialog即等同於Print()
也就是說會觸發PrintPageEvent

詳細內容可見reference

Reference:
列印的極限能力 有詳細的說明

星期一, 12月 29, 2008

log4net導致SerialPort無法catch Exception

不知道為什麼
當用SerialPort,又在專案裡有用到log4net時
在發生UnauthorizedAccessException例外時
會直接跳出視窗告之錯誤訊息,無法catch住
將LogManager.GetLogger註解掉 就可以catch到...
即使是在另一個class宣告logger,似乎也會造成該exception無法被catch

後來發現
有時候還是無法catch
據說是.net的bug
這該怎麼辦咧
網路上有提到的鏈結
都是說在專案的app.config加上
< configuration>
< runtime>
< legacyUnhandledExceptionPolicy enabled="1"/>
</runtime>
</configuration>


Reference:
1.CLR 中未處理之例外狀況的處理機制
2.SerialPort Crashes after disconnect of USB COM port
3.UnauthorizedAccessException - SerialPort - USB

星期一, 12月 15, 2008

.net 隱藏form

怪了
記得以前就直接hide() 就ok啦...
怎麼最近又要用到藏form
結果失敗了...
用了半天才發現要
this.WindowState = System.Windows.Forms.FormWindowState.Minimized;
this.Hide();

星期五, 10月 31, 2008

安裝Meadroid的ScriptX

Step1.下載smsx.cab
載點:smsx.cab
進入後的畫面如下
有兩個載點,一個是可測試完整的功能
另一個就是直接載smsx.cab,後面有說明,記得改version到6,4,xxx


下載smsx.cab後
將檔案放到你自己指定的Server位置

Step2.在網頁的body放入Object
<!-- MeadCo Security Manager -->
<object style="display: none;" classid="clsid:5445be81-b796-11d2-b931-002018654e2e" codebase="http://[your path here]/smsx.cab#Version=6,4,438,06">
<param name="GUID" value="{19CF4AF5-CCD8-4840-BA3C-85EB66D69A6E}">
<param name="Path" value="http://[your path here]/sxlic.mlf">
<param name="Revision" value="0">
</object>
<!-- MeadCo ScriptX -->
<object id="factory" style="display: none;" classid="clsid:1663ed61-23eb-11d2-b92f-008048fdd814">
</object>


Step3.設定參數
這裡有兩個地方需設定
codebase及param的Path
其中codebase指定到剛你設定的[Server Url/smsx.cab]位置

而Path要放的是MeadCo的unique publishing license(即sxlic.mlf的位置)
只是用免費的功能話 就可以把拿掉Path及Revision這兩行拿掉
<!-- MeadCo Security Manager -->
<object style="display: none;" classid="clsid:5445be81-b796-11d2-b931-002018654e2e" codebase="http://[your path here]/smsx.cab#Version=6,4,438,06">
<param name="GUID" value="{19CF4AF5-CCD8-4840-BA3C-85EB66D69A6E}">
<param name="Path" value="http://[your path here]/sxlic.mlf">
</object>


Step4.自定列印畫面配置
用完就可以開心的用免費版的功能
<script defer>
window.onload=function(){
factory.printing.portrait = true; //直印,false:橫印
factory.printing.header = ""; //頁首,空白為不印頁首,也就不會佔空間
factory.printing.footer = ""; //註腳,空白為不印註腳,也就不會佔空間
factory.printing.leftMargin = 0; //左邊界
factory.printing.topMargin = 0; //上邊界
factory.printing.rightMargin = 0; //右邊界
factory.printing.bottomMargin = 0; //下邊界
}
</Script>

css 23事

CSS 語法教學

1.匯入CSS方法
外部連接套用
< link rel="stylesheet" href="style.css" type="text/css" media="【媒體類別】">

嵌入套用
< style type="text/css" media="【媒體類別】">

匯入套用
@import url("style.css") 【媒體類別】;

2.優先權
從最高優先權到最低優先權的排名如下:
* 內行套用的樣式表 (Inline stylesheet)
* 嵌入套用的樣式表 (Embedded stylesheet)
* 匯入套用的樣式表 (Imported stylesheet)
* 外部連接套用的樣式表 (Linked stylesheet)
* 瀏覽器本身的樣式表 (Browser's own stylesheet)

References:
1.CSS串接

3.CSS選擇器 (selector)
同一個選擇器可以有不同的 instance
tag a和tag b有相同class,但可以利用下面的方法設定
【型類選擇器】.【選擇器名稱】{
}
ex. < h1 class='Class_A'/> < h2 class='Class_A' />
.Class_A.h1{
}
.Class_A.h2{
}


References:
CSS選擇器

星期四, 10月 30, 2008

CSS設定

.contents {
/* 一次解決版面撐開、英文斷字、避頭尾、段落左右邊界不齊問題 */
/* by:meiji 200701 */

/* 防止撐開 */
table-layout: fixed;
/* 英文單字自動換行 */
word-wrap: break-word;
/* 正常避頭尾 */
word-break: normal;
/* 文字左右對齊 */
text-align:justify;
text-justify:inter-ideograph;
}

利用Html網頁列印

1.去頁首頁尾問題
官網:http://www.meadroid.com/
檔案:透過email,會給下載網址

目前看比較好的方法還是透過meadroid這家公司的ActiveX
有免費版本,當然有些限制,不過至少可解大部份的問題了
1.直印、橫印
2.印不印頁首(頁尾)
3.上下左右邊界
安裝Meadroid的ScriptX

References:
HTML實現列印(三)頁首、註腳、邊界與列印方向設定

2.CSS排版問題
有時預覽列印時,會發現調用的CSS都無效了
那是因為
<link rel="stylesheet" type="text/css" href="CSS位置" media="screen" />
的media設為screen而沒設為列印時的參考,加入print就ok了,即
<link rel="stylesheet" type="text/css" href="CSS位置" media="screen,print" />
只加入print沒有screen還不行咧,怪哉

3.利用CSS分列印頁
<div STYLE="page-break-after: always;"> </div>

Media Types說明
值 適用於
all 所有媒體類別
aural 言語合成器
braille 布拉耶點字法 (盲人用) 媒體
handheld 掌上型媒體
print 列印
projection 投射媒體
screen 電腦螢幕
tty 固定字寬 (fixed-pitch) 的媒體
tv 電視類的媒體

Reference:
列印 HTML 網頁強制換頁的方式
7個Media Types

4.列印背景圖\
*調browser的設定或利用list-item
*利用@media print{ }

星期五, 10月 10, 2008

嘗試到string相加的威力了

跑個字串相加迴圈直覺沒什麼
for (i=0;i<10;i++)
a += b;

不跑了5萬次才知覺得慢跑了30多秒
本以為是正常的 跑個5萬次很多啦
不過搞硬體的同事說其實這點小迴圈只是這小咖
電腦1秒內就可以算完

想了半天才想到
一定是相加時 是new了新的字串來接
所以多耗了需多時間及記憶體
馬上就改用.net裡的StringBuilder
StringBuilder aa = new StringBuilder();
for (i=0;i<50000;i++)
aa.apend(b);

才一按執行 就已經結束迴圈了
這速度也差太多了...
還以為自己沒按到執行
這下真嘗試到string相加的威力了

星期四, 10月 09, 2008

.net部署

手動增加「立即更新」
使用ClickOnce部署VS2005中的WinForm应用程序
private void UpdateApplication()
{
if (ApplicationDeployment.IsNetworkDeployed == true)
{
ApplicationDeployment ad = ApplicationDeployment.CurrentDeployment;
Text = "目前版本:" + ad.CurrentVersion;
UpdateCheckInfo checkInfo = ad.CheckForDetailedUpdate();
if (checkInfo.UpdateAvailable == true)
{
if (MessageBox.Show("檢測到新的版本:" + checkInfo.AvailableVersion + ",現在需要更新嗎?\n您也可以稍後手工更新到最新版本!", "", MessageBoxButtons.YesNo, MessageBoxIcon.Question) == DialogResult.Yes)
{
ad.Update();
MessageBox.Show("更新完畢,將要重新啟動程序!");
Application.Restart();
}
}
}
}


References
說明
ClickOnce技術與Windows Installer關鍵特徵對比一覽表
ClickOnce 部署概觀
選擇 ClickOnce 部署策略
新增信任發行者至 ClickOnce 應用程式的用戶端電腦

office小撇步

免算號!3秒破解Word/Excel的保護密碼

星期日, 10月 05, 2008

html的table裡放圖片總會有空白

利用table來組圖片常會發生兩種情況
1.沒合起,分成三段
利用table來動態增長中段文字時,常會發生這種情況


2.td尾端總有留空去不掉(藍色部份)


解決方法
1.沒合起,分成三段
當要用table來動態拉圖時,要對table tag加入
cellpadding="0" cellspacing="0"
再試一次就ok啦


2.td尾端總有留空去不掉(藍色部份)
這個問題真是氣死人
花了我一個週末,什麼碗糕屬性全設了
還是失敗,最後在網路上看到.....
「因為td tag裡有空白」 ...

看了一下html,雖然是沒有,但有IDE切的斷行
<td>
  <img src="xxx">
</td>
於是就抱著期待又想譙人的心情設為
<td><mg src="xxx"></td>
一試果然成功了...嗚 感動


想想這感覺是個好明顯的問題「空白」,可是卻看不出來
真想搥人...

星期三, 10月 01, 2008

浮動div

1.jQuery本身draggable
jQuery UI/Draggable
include三個檔案即可使用
< script src="http://code.jquery.com/jquery-latest.js">< /script>
< script src="http://ui.jquery.com/latest/ui/ui.core.js">< /script>
< script src="http://ui.jquery.com/latest/ui/ui.draggable.js">< /script>


只要對某tag下draggable()就ok啦
$(".block").draggable();


2.jquery插件:任意位置浮动固定层
demo DEMO下載

可以任意定住div的在網頁的位置,在滾動頁面時也會保持在同一個位置
下載檔案後,解開將"jquery.floatDiv.js"檔include即可使用

/*调用:
1 无参数调用:默认浮动在右下角
$("#id").floatdiv();

2 内置固定位置浮动
//右下角
$("#id").floatdiv("rightbottom");
//左下角
$("#id").floatdiv("leftbottom");
//右下角
$("#id").floatdiv("rightbottom");
//左上角
$("#id").floatdiv("lefttop");
//右上角
$("#id").floatdiv("righttop");
//居中
$("#id").floatdiv("middle");

3 自定义位置浮动
$("#id").floatdiv({left:"10px",top:"10px"});
以上参数,设置浮动层在left 10个像素,top 10个像素的位置
*/

跨iframe呼叫js function

iframe name = aaa
js function = bbb

呼叫iframe裡的js function
window.aaa.bbb();

呼叫iframe外的js function
parent.bbb();

呼叫iframe外的另一個iframe裡的js function (自己都快看不懂了)
parent.aaa.bbb();

星期日, 9月 28, 2008

WebBrowser.Document.InvokeScript 發生指定的轉換無效

利用WebBrowser要invoke Javascript時
發生了「指定的轉換無效」
查了半天找不到原因,也沒有看到有人有相同的狀況
後來想到一定是用了thread要動到.net的元件(WebBrowser)
就利用先前的 跨執行緒作業無效
果然解決了

利用array建立jqGrid

官方的example裡有寫
http://trirand.com/jqgrid/jqgrid.html
進入「Loading Data」就會看見Array Data
API說明:Array Data章節

1.plugin參數設定
datatype要設為"clientSide" //或是local
jQuery("#list4").jqGrid({ 
    datatype: "local", 
    colNames:['Inv No','Date', 'Client', 'Amount','Tax','Total','Notes'], 
    colModel:[ 
        {name:'id',index:'id', width:60, sorttype:"int"},  
        {name:'invdate',index:'invdate', width:90, sorttype:"date"},   
        ...
        {name:'note',index:'note', width:150, sortable:false} 
    ], 
    ...

2.陣列宣告
配合colModel的欄位名稱設定
var mydata = [ 
    {id:"1",invdate:"2007-10-01",name:"test",note:"note",amount:"200.00",tax:"10.00",total:"210.00"},     \
    {id:"2",invdate:"2007-10-02",name:"test2",note:"note2",amount:"300.00",tax:"20.00",total:"320.00"}, 
    {id:"3",invdate:"2007-09-01",name:"test3",note:"note3",amount:"400.00",tax:"30.00",total:"430.00"}
]; 

3.再一個個加入jgGrid
for(var i=0;i<=mydata.length;i++) 
    jQuery("#list4").addRowData(i+1,mydata[i]); 

4.其他資料
Related options in options array: datatype
Related options in colModel: sorttype, datefmt
Related methods : getRowData, delRowData, setRowData, addRowData

要清除Grid所有資料可下 clearGridData()

星期四, 9月 25, 2008

php要改檔頭時,出現錯誤

當php要改檔頭時,
如:
header("Content-Transfer-Encoding: 8bit");
header("Content-Type: application/octet-stream");
header("Content-Disposition: attachment; filename=test.jpg");
header("Content-Length: $size");

有時會出現
Cannot modify header information - headers already sent by ...

解決方法:
除了網路上說明的,要將php tag

之前及之後的空格刪乾淨外
php檔案編碼也會有問題,用utf-8就掛了,但一律用ansi編號不會出問題

星期二, 9月 16, 2008

firefox套件


  • 第三屆 Top 15 套件
  • gTranslate可翻譯網頁上的文字,不過還是裝google toolbar比較方便點,因為還得反白單字,再右鍵看翻譯
  • DownloadHelper



    快速下載YouTube影片...
    除了flv,還可直接下載mp4...真是好東西....

好用的 Firefox 附加元件 - 11月號

  • blog編輯
覺得blogspot的編輯器太陽春了
沒想到firefox就超強的套件 ScribeFire
整合blog帳號後 就可以直接發文或編輯
還有其他強大功能 看別人介紹比較快
download:https://addons.mozilla.org/en-US/firefox/addon/1730
介紹:
1.ScribeFire 1.4.2:Firefox上的部落格文章編輯器

使用方法:

Getting Started With ScribeFire

1.Press F8
2.建立Blog帳號連結,click "新增"
3.輸入自己的blog網址
4.輸入帳密
連結成功後,就會把在blog的文章list拉進來,就可以新增文章或編輯文章

SQL語法

將select出來的欄位插入成新的資料

Insert into tableA (columeX,columeY)
SELECTcolumeX,columeY
FROM tableB


取得所有資料,相同的A欄位不重覆,但當A欄位裡的B欄位不同,需再顯示,但不重覆
hint:Group By兩個欄位

SELECT columeA,columeB
FROM tableA
Group By columeX,columeY


group by欄位A相同的群值,但組內的欄位B不同時,挑較大的顯示

SELECT columeA,max( columeB ) columeB
FROM tableA
GROUP BY columeA

星期三, 9月 03, 2008

PHP Server路徑

$_SERVER[HTTP_HOST]
說明:取得此server的url
Demo:www.google.com/a/b/c.html
=>www.google.com

$_SERVER['HTTP_REFERER'] 但HTTP request可以造假

$_SERVER["REQUEST_URI"]
說明:取得完整的參數路徑URI(不含localhost的位置)
Demo:www.google.com/a.html?b=c;
=>a.html?b=c;
$_SERVER['PHP_SELF']
說明:相對路徑
Demo: www.google.com/a/b/c/d.html
=>a/b/c/d.html

1.取得完整的uri
$_SERVER[HTTP_HOST].$_SERVER["REQUEST_URI"]

2.取得到目前的資料夾(含檔名)
$_SERVER[HTTP_HOST] . $_SERVER['PHP_SELF']

3.取得https or http

if(isset($HTTP_SERVER_VARS[HTTPS])){
$_FULL_URL = 'https://'.$SERVER_NAME;
}else{
$_FULL_URL = 'http://'.$SERVER_NAME;
}

星期二, 9月 02, 2008

透過jQuery取得tag name

沒看到API上有提供取得的方法
google上看到惟一的方法是直接.tagName取得
但要透過.each(),否則會有一堆錯誤
範例:
$("#text").each(function(){
this.tagName;
});

星期五, 8月 22, 2008

jQuery Plugin: Tablesorter

jQuery Plugin: Tablesorter官方網址

相當方便的套件
只需啟動就提供全欄位的排序

1.安裝
載好jquery.tablesorter.js檔案
2.啟動

$("#table1").tablesorter(); //對指定的table
$("table").tablesorter(); //對所有table做啟動tablesorter,即可有排序的能力

當然也可設定某些欄位不提供排序功能

$(document).ready(function() {
$("table").tablesorter({
// pass the headers argument and assing a object
headers: {
// assign the secound column (we start counting zero)
1: {
// disable it by setting the property sorter to false
sorter: false
},
// assign the third column (we start counting zero)
2: {
// disable it by setting the property sorter to false
sorter: false
}
}
});
});

另外完整的範例包也有設定css
效果也滿不錯的,例如被點選要排序的欄位會反白的效果
要直接套用,只需在該table再加上class="tablesorter" //css中的class名

動態加入新資料
當已完成.tablesorter() 後
如增加了新的資料列,需要改用update
$("table").trigger("update");
// set sorting column and direction, this will sort on the first and third column
var sorting = [[2,1],[0,0]];
// sort on the first column
$("table").trigger("sorton",[sorting]);


官方說明
*Sort table using a link outside the table
可由外部trigger sorting

星期二, 8月 19, 2008

組織管理

PDCA循環
上班族的工作管理–PDCA的運用

PDCA重點
 (1)計畫(P):應採目標管理,注意要領包括: 5W2H
   a.訂定目標
   b.決定目標達成的方法
   c.決定目標達成否的評估基準
=> 訂里程碑,每個階段要看到的成果

 (2)執行(D):依據計畫實施且為了能夠確實落成計畫,此階段應進行一個小型的PDCA循環。
=> 掌控資源

 (3)查核(C):依據先前擬定的評估基準查核實際績效,也就是將目標值與實績相對照。
=>檢查每個時間點的成果、計劃,如果不合,要診斷原因
1.系統性Error
2.隨機Error
 (4)處置(A):在查核後如果發現未能達成目標,首先採取緊急對策,消除該現象,然後再進一步進行PDCA循環設法防止相同的問題重複發生。利用不斷的應用PDCA循環完成「循環」的真義。若是達成目標,甚而超越目標,則應將此新對策標準化,儲存成為公司的技術規範,提昇公司的能力與市場競爭力。

組織中最重要的因素:「執行力」
團隊中的執行力
1.對的人,對的位置
2.好的習慣(文化)
-確實
-小事做好,大事就好
-標準(共同接受的標準) 慢慢提升

企業日常運作
報表產生確定,檢核確實,下情上達,組織運作透明

單一事件、一次性事件
=>不易評估,故只用時間、目標

Dos的Shell操作

利用bat執行exe時,如何關閉dos視窗等操作
@echo off //不列出執行過程
cd test\ //移到該執行檔的資料夾
START test //執行test.exe, exe不用寫了,Start指啟動新程序,所以此視窗就可關了
exit //關閉此dos視窗

星期一, 8月 11, 2008

Windows Form 的事件(Event)

Windows Form 中事件(Event)的順序

啟動事件:

* Control.HandleCreated
* Control.BindingContextChanged
* Form.Load
* Control.VisibleChanged
* Form.Activated
* Form.Shown

應用程式關閉時,會以下列順序引發主要表單的關閉事件:
*Form.Closing
*Form.FormClosing
*Form.Closed
*Form.FormClosed
*Form.Deactivate

MSDN備註:Closing 事件在 .NET Framework 2.0 中已過時,請改用 FormClosing 事件。

Form.Closed 和 Form.Closing 事件不是在呼叫 Application.Exit 方法來結束您的應用程式時引發。如果您在這些必須執行的任一事件中有驗證程式碼,您應該在呼叫 Exit 方法前個別地為每個開啟的表單呼叫 Form.Close 方法。

星期四, 8月 07, 2008

Literal Strings

就字面來看...就是文字字串...
有些key word是被保留的
如path c:\等,無法直接存到string變數
因此加上"@" => 例:string path = @"c:\1.txt";
即可存,含有key word的文字字串


Ref:Manipulating Strings in C#

星期二, 8月 05, 2008

透過JavaScript列印

1.JavaScript列印
轉:完美的WEB友善列印- 史考特部落格園地

由於javascript都會列印一整個網頁
但通常需要的都只是某個div
導致直接印也不是,另外再做一個網頁也不是

這裡的做法便是將要列印的div內容取代目前的網頁
待列印完後,再window.history.go(0) //回上頁
效果滿不錯的

2.列印設定
轉:ActiveX 控制列印設定
由於javascript無法控制這些設定
安裝此ActiveX便可以設定列印格式
不想要安裝呀...想要其他方法?
目前沒有哩... 你寫一個吧
有寫出來記得給我一份

星期一, 8月 04, 2008

MS Office 標點符號表

問題:MS Office沒有「符號表」?
進入「工具/自訂」後
在「工具列」清單中,最後一項是「符號表」
勾選後,就會在下面的工具列出現「符號表」

問題:如果沒有「符號表」選項?
就必需安裝符號表程式
1.Office XP 標點符號安裝程式 SymSetup.exe
不過此檔似乎已不提供了,也找不到

2.手動加入符號表套件 - Symbar.wll
(1)下載 Symbar.wll
(2)c:/program files/Microsoft office/office/Startup/
重開Office後,再到「工具/自訂」,手動勾選,就會出現了

星期四, 7月 31, 2008

常見錯誤

GDI+ 有泛型的錯誤
1.資料夾權限未開
2.無此路徑

列印Double 數值
由於會自動做四捨五入等惱人的動作
String.Format("{0:r}",
先format過後,就可完整印出

常見問題

*Access denied for user 'kevyu'@'' (using password: YES)
ans: mysql 未設定此帳號kevyu具有remote,從遠端登入的權限

取得last insert id

MySQL新增完後
會將資料留在DB Connection

PHP--
PHP有提供相關函數
執行mysql_insert_id(),即最後新增的id


.Net-- (http://forums.mysql.com/read.php?38,98672,98868#msg-98868)
string strSQLSelect = "SELECT @@IDENTITY AS 'LastID'";
MySqlCommand dbcSelect = new MySqlCommand(strSQLSelect, conDBConnection);
MySqlDataReader dbrSelect = dbcSelect.ExecuteReader();

dbrSelect.Read();
int intCounter = Int32.Parse(dbrSelect.GetValue(0).ToString());

dbrSelect.Dispose();
conDBConnection.Close();
MessageBox.Show("Test: " + intCounter.ToString());

星期三, 7月 30, 2008

2008 聚餐

12月份聚餐
訂位時間: 12/26 (星期五) 中午12點
餐廳: 謝阿姨美食坊
網址: http://blog.yam.com/elsachen/article/15342243
地址: 台北市博愛路122號B1(世運麵包店斜對面)
電話: 2388-1012


11月份聚餐
餐廳: 福臨門- 港式飲茶吃到飽
地址: 台北市北投區大業路700號(新北投捷運站)
網址: http://flm.wahot.com/ind/modules/news/article.php?storyid=135

10月份聚餐
羅斯福路上的....忘了

9月份聚餐
餐廳: 小春 (日式料理, 請大家吃飽飽!)
網址: http://www.kuharu.com.tw/inner1.php

地點: 您可以搭乘捷運板南線,到忠孝敦化下車,走安和路一段出口,也就是誠品敦南店的出口,右轉進安和路102巷走到底就看到小春。小春位於敦化南路與信義路交叉口,玉山銀行旁第二條巷子進去到底。


8月份聚餐
時間: 8/22 (五) 中午12:00
餐廳: 韓首爾
地址: 台北市敦化南路一段160巷23號 (請閱: 地圖在附件中)
電話: 2752-2653
相關介紹網址:
http://tw.myblog.yahoo.com/h02-27522653
http://tw.myblog.yahoo.com/jw!gY4ig0SfGQTuNBVaNTLyUacWJFI-/article?mid=2673

由於月底部份同事要到美國出差
所以就提早吃
牛、雞、豬、羊都有 還不錯
有提供明治冰淇琳也挺好吃的

7月份聚餐
KiKi restaurant
中式料理
藍心湄開的餐廳
唔...後來臨時改去另一家餐廳

「府岸海產城」....也是中式料理
地點: 台北市大安區永康街8巷7號1樓
http://tw.lifestyle.yahoo.com/biz.html?bizid=86a64a5f58132e35&sid=152959622&city=%E5%8F%B0%E5%8C%97%E5%B8%82&b=6&sort=-rating

6月份聚餐
神州客棧(神州時尚精緻料理)
地址: 忠孝東路五段508-8號
中式料理

5月份聚餐
小護士餐廳
地址:新生北路3段7號

4月份聚餐
泰式料理

3月份聚餐
忘了叫什麼 >"<

2月份聚餐
1月份聚餐+尾牙
陽明山的...一時想不起來

2007---

9月份聚餐
Mo-Mo-Paradise
忠孝店
9月份

星期三, 7月 23, 2008

jQuery語法

找未加入html裡的tag
利用jQuery找tag時,如 $("#test")
id為test的tag需已存在html

但當要找的tag還未加入html裡時,就會找不到test
可以利用此法
var panel=jQuery("<div id='test'>");
$('#test',panel)
});


一次設定多個屬性及事件
滿方便的...不錯
$('#test')
.text("this is div") //屬性
.click(function(){ //方法
alert($(this).text());
});
//一行來設定屬性就是
$('#test').text("this is div").html("").css("");
//看起來怪怪的,不過還挺簡潔的

星期一, 7月 21, 2008

利用JavaScript做print preview

source:http://www.programmer-club.com/pc2020v5/forum/showSameTitleN.asp?board_pc2020=javascript&id=4823&keyword=

var OLECMDID = 7;
/* OLECMDID values:
* 6 - print
* 7 - print preview
* 1 - open window
* 4 - Save As
*/
var PROMPT = 1; // 2 DONTPROMPTUSER
var WebBrowser = '';
document.body.insertAdjacentHTML('beforeEnd', WebBrowser);
WebBrowser1.ExecWB(OLECMDID, PROMPT);
WebBrowser1.outerHTML = "";
}

其他的用法,列举如下:
WebBrowser.ExecWB(1,1) 打开
Web.ExecWB(2,1) 关闭现在所有的IE窗口,并打开一个新窗口
Web.ExecWB(4,1) 保存网页
Web.ExecWB(6,1) 打印
Web.ExecWB(7,1) 打印预览
Web.ExecWB(8,1) 打印页面设置
Web.ExecWB(10,1) 查看页面属性
Web.ExecWB(15,1) 好像是撤销,有待确认
Web.ExecWB(17,1) 全选
Web.ExecWB(22,1) 刷新
Web.ExecWB(45,1) 关闭窗体无提示

星期四, 7月 17, 2008

讀文字 JSON

直接宣告
//陣列物件
var json1 = {[
{"id":1,"name":"台灣"}
{"id":2,"name":"美國"}
]};

//物件(含陣列)
var json2 = {"bindings": [
{"ircEvent": "PRIVMSG", "method": "newURI", "regex": "^http://.*"},
{"ircEvent": "PRIVMSG", "method": "deleteURI", "regex": "^delete.*"},
{"ircEvent": "PRIVMSG", "method": "randomURI", "regex": "^random.*"}
]};


讀文字
var myJSONtext = "文字型態的 json 的格式... "; //同上例的格式,注意不用加分號
var myObject = eval('(' + myJSONtext + ')'); //再前後加上小刮號,利用eval即可得


JSON 的安全性

references:
JSON官網

jqGrid

jqGrid官方網址

install
1.download package
jQuery Grid Plugin 3.2 with docs
解壓後,放到自建的jqGrid資料夾

2.建立html page
放在jqGrid下,並include jqGrid的js及css
//1.jquery core
<script type="text/javascript" src="jquery.js"></script>
//2.jqGrid的js
<script type="text/javascript" src="jquery.jqGrid.js"></script>
//3.jqGrid的css
<link rel="stylesheet" type="text/css" media="screen" href="themes/basic/grid.css" /> </code>

3.environment配置
有3個地方需要調整

(1)js的路徑
在jquery.jqGrid.js裡,有個pathtojsfiles變數
var pathtojsfiles = "js/"; // need to be ajusted
此為設定要載入的js檔路徑

(2)CSS路徑

href就指到預設的位置
>link rel="stylesheet" type="text/css" media="screen" href="lib/jqGrid/themes/basic/grid.css" /<

(3)圖檔路徑
在實作時,要給圖片的位置

var gridimgpath = 'themes/basic/images'; //預設的圖片
jQuery("#tbRecordList").jqGrid({
colNames: ['日期', '分數',
...
imgpath: gridimgpath, //設定gridimgpath
});


**有的沒的
//清空grid內容
$("#_TableName").clearGridData();

**備註
1.每個欄位長度至少要60以上,不然排序的icon(遞增,遞減)會看不見 (新版的不會了)
2.當遇到p.mutliselect是null時,代表設定table id不一致或未啟動jqGrid()的設定
3.利用jquery.load進來的頁面,如果也有include jquery.js會導致無法使用jqgrid的method,

星期二, 7月 08, 2008

jQuery套件

A.選單

1.仿apple的滑動選單


2.Google jtab


B.Masked Input
1.Masked Input Plugin 輸入遮照

C.自動完成
http://www.pengoworks.com/workshop/jquery/autocomplete.htm
滿不錯的套件,搭配php讀資料庫
還利用cache,節省重覆的讀取字完

D.Validation
Validation

E.Table
jqGrid demo
滿不錯的table套件,Demo也很豐富


F.Sorting
jQuery plugin: tablesorter
可輕易的對table欄位做sorting的工作

G.loading block
jQuery BlockUI Plugin


H.提示

ToolTip_MooTools Demo
畫面風挺不錯的,滑動出現tooltip
jQuery plugin: Tooltip Demo
這個也挺酷的,效果多,可選擇

I.圖表類
1.JavaScript Diagram Builder
2.Google Flotchart Demo
3.Google Chart API

I.Treeview
jQuery Treeview Plugin




其他套件
1.45個新鮮出爐的jQuery插件
2.37個更加出色的jQuery插件
3.jQueryのプラグイン33+1選 -2007年9月 日本人寫的
4.Ajax Rain

5. 10 beautiful Sliding Panel with jQuery Tutorials

JavaScript的圖表工具 Diagram Builder

JavaScript Diagram Builder
下圖為pie chart的圖示
滿不錯的...選到右方的單位 還會有小動畫分離pie


畫面雖然沒有google的flot chart漂亮
不過圖可以自己換
主要有我想要的信賴區間圖 感謝同事的協助
ㄟ...你說沒有信賴區間的選項...傻孩子 是自己一個圖一個圖貼上的



**教學
1.背景
D.SetGridColor("#EBECE4"); //嗯...就格線的顏色囉
D.Draw("#FCF6CF","#0000FF",false,"點我呀","DiagramClick()");
D.Draw(底色,框色,false,說明文字,click後呼叫的function名稱);

2.line
new Line(D.ScreenX(10), D.ScreenY(5), D.ScreenX(10), D.ScreenY(45), "#cc9966", 4, "tip");

3.dot
new Dot(D.ScreenX(10), D.ScreenY(45), 8, 5, "#000000");
//也可自行套圖
new Dot(x, D.ScreenY(0), Size, 'smile.gif', "", "Type: smile.gif, Size:"+Size);
4.box
範例:new Box(j-12, y, j+12, y0, "#0000FF", "v_blue.gif", "#FFFFFF", 1, "#000000");
說明:new Box(x1座標, y1座標,x2座標, y2座標, 研究中, "檔名", 研究中, 框粗, 框線色);

備註:當此chart是包在一個iframe時,除了此頁的js去畫面,如果用到parent的js來畫chart,也就是有兩個不同的網頁(1個自己,1個是parent網頁)可以來畫chart,這個時候,圖片的路徑就會跟著改變

還是直接看官方的說明比較快

星期三, 6月 25, 2008

CSS Hover在ie下無法顯示

在css裡設定hover在ie下總是無法正常顯示

  • 外掛做法
    這裡提供了csshover.htc可以解決
    主要的做法是在css裡,遇到hover改成用mouseover等改寫
    1. 下載csshover.htc
      Version 1.42.060206 (:hover and :active) download
    2. 設定path
      path: 就先放在同一資料夾吧
    3. 程式碼
      (1)在CSS裡
      已產生的dom可直接在css裡下
      body{
        behavior:url(csshover.htc)
      }

      (2)在JS裡
      動態產生的dom,因為放在css裡的已執行過,所以之後才產生的html tag似乎不會被改變,因此要javascript再跑一次
      if (document.all && /MSIE (5\.5|6)/.test(navigator.userAgent) 
        &&  document.styleSheets 
        && document.styleSheets[0] 
        && document.styleSheets[0].addRule)
      {
        document.styleSheets[0].addRule('*', 'behavior:url(csshover.htc)');  //csshover.htc的路徑
      }

    備註:
    動態再呼叫javascript跑csshover.htc似乎會造成程式花了很多時間改寫hover
    有建議將hover指定詳細 減少搜尋改寫hover的時間
    #menu li:hover ul { //指定li hover 再指出ul下
    ...
    }
  • 指定html版本
    其他方法
    據說設為W3C 4.01, ie就會乖乖聽話了
    在html檔裡,最前面加上以下字串
    <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd">
    
Reference

html table常見問題

jQuery無法改table caption
當dom裡的caption是空白時,browser似乎會省略
導致後制的jQuery找不到caption
$('table caption').text('test'); <=無法出現test
因此得避免caption為空


table裡每列加form導致該td多一空白列
查半天都看不出為什麼那一列多出一個行空白
本以為是css設定問題
後來才發現在每個td利用form包一個input
就會造成該td多一個空白 可能是擠不下的關係 所以多出一列
氣死...平麼padding, margin全設了 還是不行
把form刪了就ok了

仿apple的滑動選單

很漂亮的滑動選單
http://jqueryfordesigners.com/slide-out-and-drawer-effect/



*在ie下無法正常顯示
由於此選單透過png做透明
但ie5,6下對png支援不好 所會出搥
不過已經有解決方案了
檔案:http://www.twinhelix.com/
說明:只改动CSS让IE6支持透明PNG

主要讀圖時透過twinhelix上提供的iepngfix.htc讀取就可以完成了

星期三, 6月 11, 2008

jquery radiobox取值,checkbox取值,radio選中,checkbox選中,select選中,及其相關

  • textbox
    $("#text").val();     //get
    $("#text").val("hi"); //set
  • radiobox
    • 取得被選中的值
      var item = $('input[name=items][@checked]').val();
      //or
      $('input[name=items]:checked').val();
    • 使第二個radiobox被選中 (無法用在checkbox上)
      $('input[name=items]').eq(1).checked = true; //法1
      $("input[type=radio]").eq(1).attr("checked",true); //法2
    • 觸發click事件
      $("input[type=radio]").eq(1).trigger('click');  
      
      //由於利用程式選中,並不會觸發click,所以結合兩者
      $("input[type=radio]").eq(1).attr("checked",true).trigger('click'); 
      
    • 取得多組 (:enabled, :disabled,:selected都同方法)
      $('input:checked').each(funciton(){
          ...
      });
      
      //:select 方法差不多,不過多個option
      $("select option:selected").each(function () {
           ...
      });
  • checkbox
    checkbox取值,給值
    alert($("#checkbox").attr("checked")); //是否勾選 true or false
    $("#checkbox").attr("checked",false);  //不打勾
    $("#checkbox").attr("checked",true);  //打勾

  • select
    $("#sel").attr("value",'-sel3');  //設置value=-sel3的項目為當前選中項
    $("11112222").appendTo("#sel");  //添加下拉框的option

事件
用click 觸發改變事件(用change 還得再點旁邊才會觸發)
//html
<input name="RadioName" value="hi">
//js
$("input[name='RadioName']").click(function(){
   $(this).val(); //即hi
});

References:

星期二, 6月 10, 2008

jQuery each迴圈中的continue及break

continue :return true;
break :return false;
也可以利用return即可跳出jQuery

星期五, 6月 06, 2008

td裡文字無法置中前面的圖片

明明對td設定了style="vertical-align:middle"
但就是沒辦法置中


氣到...又請出源大師出馬
果然幫我解決了
不過也不知原因...總之在img tag裡也加入style="vertical-align:middle"
就ok啦,原td的style甚至不用設定了

星期四, 6月 05, 2008

jQuery 套件

1.jQuery Treeview Plugin

jQuery有個project提供了Treeview plugin,看起來還不錯的樣子
Demo網址


用法
1.先下載pack,目前v3
2.方便測試,在demo檔案夾裡,新增一個html當自己的測試檔
3.打開demo檔案夾裡的index.html,看html碼直接把下列這幾行貼到自己的html裡
< link rel="stylesheet" href="../jquery.treeview.css">
< script src="../lib/jquery.js" type="text/javascript">
< script src="../lib/jquery.cookie.js" type="text/javascript">
< script src="../jquery.treeview.js" type="text/javascript">


4.demo.js是原本的javascript檔,可直接改這裡來測試,如果自己寫新的js的話,記得加上$("#browser").treeview();才會完整啟動treeview,不然會像下圖一樣

星期四, 5月 29, 2008

用PHP和MySQL保存和輸出圖片

//存blob格式
用PHP和MySQL保存和輸出圖片


//存文字格式
$data = fread(fopen($up_file, "r"), filesize($up_file));

1 fopen($up_file, "rb") 二進位讀檔。

2.放進資料庫前先編一下碼再放進去。
  $data =base64_encode($data);
輸出的時候請先用base64_decode()恢復二進位編碼再輪出。


//讀出二進位
print $bytes["RawData"];


remark============
1.存文字格式會使圖檔變大2,3倍
2.php會將轉傳的stream的最前頭加上3個byte (dom) //說明用UTF-8格式 ,尚不知如何去掉
就自己濾掉前3碼吧
if (responseBytes[0] == 0xEF) && (responseBytes[1] == 0xBB) && (responseBytes[2] == 0xBF)
3.有時候stream前面還會多0x20,一般來說是php tag的最前面有空白...所以一併傳進去了,導至多了一個空白

星期五, 5月 23, 2008

複製xml node至另一個xml document

同文件可用 (XmlNode)xmlnode.Clone()
不同文件得用 ImportNode
格式:ImportNode(XmlNode node,bool deep) //deep 要不要複製該node的子node
範例:
XmlNode newNode = xmldocument.ImportNode(xmlNode,true)
xmldocument.SelectSingleNode("//xxx").appendchild(newNode );


***注意***
在importNode時,常會先把本身的child node刪掉
再將加入新的
//1.先清除舊的
XmlNodeList oldNodes = xmlNode.SelectNodes("//AA").ChildNodes;
foreach (XmlNode oldNode in oldNodes )
xmlNode["AA"].RemoveChild(oldNode );

直覺沒問題,執行也沒問題
但不過AA的child有幾個,迴圈也只會執行一次
因為刪了一個node,該list就會少了一個
所以當迴圈再跑下一個時,其實已重讀該list
而第一個又為null,所以就執行一次就跳出迴圈了
以上純屬虛構...如有巧合....

不過真的只會執行一次,程式又沒錯
所以都不會發現
總之改用while,每次刪第一個就好了
while (xmlNode["AA"].ChildNodes.Count > 0) xmlNode["AA"].RemoveChild(xmlNode["AA"].ChildNodes[0]);

*後記
不知在耍什麼白痴
要清掉childenodes 為什麼要用這麼麻煩的方法
直接node.innerxml=""; 不就好了................

星期一, 4月 28, 2008

JavaScript觸發 select 的option

直接設定都會說「無法設定selected的內容」
氣到....請出智源大師解決了
原本下面這樣就可以了...但卻發現要先加個alert才會成功
document.getElementById("cmbCountry").selectedIndex=1;
document.getElementById("cmbCountry").fireEvent("onchange");

完整版...
也不知真正原因為何,原正就先設0..再設1就ok了
document.getElementById("cmbCountry").selectedIndex=0;
document.getElementById("cmbCountry").fireEvent("onchange");
document.getElementById("cmbCountry").selectedIndex=1;
document.getElementById("cmbCountry").fireEvent("onchange");

星期五, 4月 25, 2008

MySQL中的DATETIME, DATE和TIMESTAMP類型

DATE跟DATETIME就如字意上 只差TIME
而DATETIME跟TIMESTAMP是存相同的內容
網路上看的差別在
一個UPDATE設置一個列為它已經有的值,這將不引起TIMESTAMP列被更新

reference
DATETIME, DATE和TIMESTAMP類型

星期日, 4月 20, 2008

jQuery與XML

//刪除node
不知jQuery怎麼刪,就先用javascript原本的做法吧
var deleteMe = xmlDoc.getElementsByTagName("AAA")[0]; //刪第一個AAA
xmlDoc.documentElement.removeChild(deleteMe);

//複製AAA加入BBB
var AAA = $(xmlDoc).find("AAA").clone();
$(xmlDoc).find("BBB").append(AAA);

星期五, 4月 04, 2008

Ajax筆記


1.Ajax開發精要
詳細說明ajax各項技術(含html,css等),提供常用的屬性,也可當工具書查詢。
coding會遇到的問題也會提出來,像亂碼等 還會提供solution。
對於ajax也有簡單的基礎程式教學,比較容易上手,不錯的入門書籍。
各章節都討論的滿詳細的...光看每頁的字數都超多的,應該就會有同感了

2.Ajax in action
嗯...應該是適合有一段經驗的ajax人員...對初學者有難度哩...看好久都看不懂,最簡單的範例是雙動態combobox的應用,寫了一多......看嘸...幾個月後再回來看有沒有感覺

星期四, 4月 03, 2008

java, C# 與serial port通訊

需下載java commapi
由於會讀取javax.comm.properties
而此檔因OS不同所以commapi有不同OS版本
不要載錯

主要有三個配置檔
存放路徑
此是安裝JRE的軟體
1.C:\Program Files\Java\j2re1.4.2\bin\win32com.dll
2.C:\Program Files\Java\j2re1.4.2\lib\javax.comm.properties
3.C:\Program Files\Java\j2re1.4.2\lib\ext\comm.jar

Or
此是安裝J2sdk的軟體
1. C:\j2sdk1.4.1_01\jre\bin\win32com.dll
2. C:\j2sdk1.4.1_01\jre\lib\javax.comm.properties
3. C:\j2sdk1.4.1_01\jre\lib\ext\comm.jar

關於javax.comm.properties 的位置
ㄟ..好像是跟程式碼放一起哩...

If you instead got the message “no ports found”, there are a couple of possibilities:

* There actually aren't any serial ports available on your system—either the low-level comm port drivers are not installed right, or other programs have them open.
* The javax.comm drivers are not installed properly.


reference

JAVA Communication API(RS232/485)
JAVA RS232實作
java comm安裝
Installing & Configuring Java for HC11 Code Download

===============================================
c#讀rs232
SerialPort (RS-232 Serial COM Port) in C# .NET

星期二, 4月 01, 2008

jQuery Tabs出version 3了

http://www.stilbuero.de/jquery/tabs_3/

後記:Tabs套件已經跟jQuery UI整併了,直接看jQuery UI - Tabs

利用jQuery完成的tab
比上一版多了
1.Tabs Extensions
2.Rotating tabs 會輪播
3.Nested tabs 就多層tab

除了多新功能外
原本的使用上也更加方便
也解決了一些問題
原來只能固定用#container-n
這些原先設定的div現在都可以自訂了
加上更操作上都以jQuery的存取方式設計
coding上更加便利...只要copy...paste.....

  • 取得目前選取的tab
    var $tabs = $('#example').tabs().data('selected.tabs');
    原本只能在ie跑,firefox會印出undefine 後來套件有更新, firefox就可以用相同的方式取得
  • 取得目前tab名
    var selected =$('#container-tab').tabs().data('selected.tabs');
    var tabName=$("#container-tab" > ul > li").eq(selected).text();
    上述方法可以取到值,但會導致tab無法切換了
    所以就照著官網寫的方法
    var selected =$('#container-tab > ul').data('selected.tabs');
  • 自訂jTab
    jTab裡也可以加圖示進去

    把編輯、刪除放在同一格里還滿實用的
    不過似乎jtab多了一層,使得點擊圖示會trigger,但cursor不會改變 ... 慘念
    前面也可加個「新增」鈕,當然要自己加囉