LENDIEN聯電 冷暖 清淨 除溼 移動式空調 9000BTU任天堂-Switch-NS-公司貨主機-豪華全配組LG樂金 WIFI遠控雙眼小精靈掃地清潔機器人變頻版
顯示具有 KM 標籤的文章。 顯示所有文章
顯示具有 KM 標籤的文章。 顯示所有文章

2012年9月19日 星期三

javascript xml parser

終於比較有時間可以更新這個地方

上一篇是去年11月,那真是一種另類的紀念—上個工作的黑暗期起始日
黑暗期為期將近八個月,然後一個機會、一個爆發點、一個最適當的環境條件,我離開了

然後在新的地方忙錄了兩個多月,現在大部份的工作都到一段落,新階段還沒開始,撥空整理手邊累積將近一年的照片,再回到這個地方看看,赫然發現原本支援asp的空間似忽不能跑我的程式了。。。。。。原本寫好的懶人相簿及blog更新程式都沒用,於是花了一些時間修改,把原來的asp版的xml parser改成javascript版的xml parser

內行人就知道接著我要寫km了,看我上面舖了好長一段梗,不囉嗦,開始講所謂的javascriptxml parser

程式大略分兩部份,第一部份是大家使用很長一段時間的xmlhttprequest: ==========================================
if (window.XMLHttpRequest)
{// code for IE7+, Firefox, Chrome, Opera, Safari
    xmlhttp=new XMLHttpRequest();
}
else
{// code for IE6, IE5
    xmlhttp=new ActiveXObject("Microsoft.XMLHTTP");
}
xmlhttp.open("GET","XML URL",false);
xmlhttp.send();
xmlDoc=xmlhttp.responseXML;
==========================================
這邊要注意的是xmlhttprequest這個元件一如以往大家所認識的,不能跨domain存取,所以xml url必需是在相同的domain下(這個意謂著我以後要把xml copy回自己的空間才算完成更新這樣)

第二個部份即是進入xml parse跟頁面顯示,其實相當簡單:
==========================================
x=xmlDoc.getElementsByTagName("entry");
var txt="";

for (i=0;i<10;i++)

{
    atitle=(x[i].getElementsByTagName("title")[0].childNodes[0].nodeValue);
    pdate=(x[i].getElementsByTagName("published")[0].childNodes[0].nodeValue).substr(0,10);
    txt += pdate+" <a href='http://yrbrlono.blogspot.tw/'>"+atitle+"</a><br />";
}

document.getElementById("blogarea").innerHTML = txt;
==========================================
這裡唯一要注意的是x的長度,我的需求是顯示10則就好,而且我確定我的xml裡至少有10則,所以迴圈設定上直接固定跑10次,如果是要讓x有多少就顯示多少,把i<10改成i<x.length就行
這裡多使用了substr函數,因為我只要取日期的前10碼(YYYY-MM-DD)就好

搭配這段程式的xml大致是像這樣:
==========================================
<entry>
    <title>文章標題1</title>
    <published>YYYY-MM-DDT00000000</published>
</entry>
<entry>
    <title>文章標題2</title>
    <published>YYYY-MM-DDT11111111</published>
</entry>
==========================================
相當容易,隨便一台電腦備有瀏覽器及記事本自己就可以寫程式、執行,讓你一分鐘javascript xml parser就上手

好的,下課!!

2011年11月10日 星期四

flash中文字亂碼、掉字

KM很久沒寫了,因為前一段時間工作內容沒有挑戰性(被歐飛),這兩天終於有東西可以寫了好開心。

今天要講的其實分成兩部份,一個是亂碼的問題,一個是掉字的問題,這2種狀況在flash裡很容易遇到,必竟flash不是台灣人設計的,不過說實在的,中文字的問題在很多軟體都會遇到,這裡就不一一列出來,反正列不完。

首先呢,亂碼問題。這個很簡單,只要在整個flash影片的第一個影格加入一行action script

System.useCodepage=true;
照字面上意思解讀,就是使用網頁的編碼啦,沒有疑問。中文字要在flash裡外傳來傳去,當然是要用相同語言才不會雞同鴨講,很容易理解。

再來呢,就是掉字的問題。
這問題說真的,我還是第一次遇到,應該是flash版本的問題,之前用flash X的版本都沒發生,現在用flash CS5才遇到。
這個問題的處理方式也很簡單,點選有問題的文字框,然後點開屬性模板→字元,裡面有個叫消除鋸齒的項目,選擇使用裝置字體,就好了。

說真的這次遇到掉字問題還滿傻眼,印象中明明以前遇到的都是flash很俏皮的把中文字裡四周被圍起來的區域填滿,看起來就像以前國小上課無聊時,把課本上的字一框一框塗黑一樣,當時看到這個問題的感覺,應該就像老師看到那本被塗過的課文一樣……
這個俏皮的問題,最後解決方式,就是把中文字打散變圖就好了,由此可證,flash是個不愛讀書的孩子

2011年6月15日 星期三

swfupload

吃驚的發現這裡竟然整個5月都沒有新東西,快快上來補個KM。。。。。。

今天要介紹的是一個在網頁上好用的檔案上傳工具,叫做swfupload,看名字就知道他跟flash有關係,沒錯!!他就是一個用flash做的上傳工具,先來講他的功能跟特色。

簡單的說有幾點:
1.可以自己設定一次傳一個檔案,還是一次傳多個檔案
2.可以限定一個或多個可上傳的檔案型態,當然要不限定也是可以,比較常見的應用可能是限定上傳jpg,jpeg檔。當然,檔案型態的判別是用windows預設的識別方式-副檔名,這點有點可惜,不過沒辦法,M$就是不用mimetype辨識也打不到他
3.可以限定上傳的檔案大小、數量。這個應該也常用到,除了因為大部份ICP不會給你無止盡的使用空間外,台灣的寬頻水準也不容許你暢快的愛傳多大就傳多大
4.上傳檔案不換頁,可以一邊上傳一邊看上傳進度。所以這樣就不會發生使用者上傳時盯著白白的畫面發呆,或是看一個上傳中的gif檔也不知道到底傳完沒(誰中槍?)
5.一次傳一堆時可以知道哪個檔案傳成功,哪個檔案傳失敗,不會發生一個失敗,等於全部失敗的慘劇

使用上也相當簡單,在download的頁面下載最新版本的sample檔,解壓縮後,在demos的目錄裡面,依應用模式分了好幾個資料夾,找一個中意的,把他放到網頁上就對了!

拿我用的simpledemo版本來說,這個資料夾裡有index.php跟upload.php兩個檔。index.php是上傳介面,把這頁裡上傳的那塊完完整整的摳到我的頁面裡要用的位置,然後把upload.php、images資料夾、js資料夾放到同一個目錄裡,再摳一下他的css檔,最後在upload.php裡加上儲存檔案的php程式碼,這樣基本上上傳功能就做完了,啊哈哈哈好簡單!

好的,到這裡是基本功能,現在開始講一點進階的。
首先,這個範例的按鈕有點醜,所以我去摳了他的XPButtonNoText_61x22.png來當我的按鈕樣式放到images資料夾裡,然後在設定的地方,button_image_url改成XPButtonNoText_61x22.png,button_width、button_height也跟著改成適當的size。
file_types設定成限制網頁能直接顯示的圖片*.png;*.jpg;*.gif;*.swf,多個檔案類型指定時,用分號隔開。
file_post_name改成我自己的名稱,這個會影嚮到upload.php裡要用什麼名稱接收,如果file_post_name設abcde,upload.php裡就用$_FILES["abcde"]來接收
file_upload_limit改成20,表示一次最多只能上傳20個檔案,必竟我不是用在相簿管理……
然後我改成選完檔案不要直接上傳,而是等按了我自己的確定按鈕才能傳。在handlers.js裡的fileDialogComplete,把this.startUpload()拿掉,然後在我的確定按鈕下swfu.startUpload()
最後呢,我還把他的顯示訊息中文化了。。。在handlers.js裡面,所有progress.setStatus開頭的部份

改好上傳測試,一次OK,簡單到不能再簡單的了
忽然覺得這年代寫程式的人越來越不值錢了,因為大家都好愛供獻好用工具
正所謂google搜尋學得好,做好網頁沒煩惱XD

2011年4月21日 星期四

mysql取前後各n筆資料

這問題常常會遇到,因為大家都喜歡在網頁上加上「上一筆」、「下一筆」的按鈕
簡單的做法是把連結加個標記,告訴下一個網頁現在是哪一筆,你要抓上一筆還是下一筆,這樣單頁就可以只執行一次query,可是在大家注重SEO的時代,這個做法可以說不太聰明。
於是乎,程式人員只好在一頁裡多下幾次query把上一筆跟下一筆都先抓出來,不過程式人員的特性就是懶!想到要一直下query就不開心,所以呢,網路上就出現了很多類似的討論主題,不過最快速的方式也就是下。兩。次。。。是的,還是不能一次搞定。

簡單的說明下兩次的做法:
假設要找編號228的前後一筆資料,而且編號欄位的值在資料庫裡可能會有跳號狀況,因此絕對不能用+1,-1的做法處理,所以要分別下
SELECT * FROM 資料表 WHERE 編號>=228 ORDER BY 編號 LIMIT 2
SELECT * FROM 資料表 WHERE 編號<228 ORDER BY 編號 DESC LIMIT 1

可是呢,這個是單純的狀況
如果要從a,b兩個資料表抓資料出來編號228前後一筆資料,而且裡面一個類別的欄位值要跟編號228的一樣,但是下sql語法之前還不知道編號228的類別是什麼,如果一樣下
SELECT 編號,a.類別,b.類別名稱 FROM a,b WHERE 編號>=228 AND a.類別=b.類別ORDER BY 編號 LIMIT 2
SELECT 編號,a.類別,b.類別名稱 FROM a,b WHERE 編號<228 AND a.類別=b.類別 ORDER BY 編號 DESC LIMIT 1
就會發現抓出來的資料會擁有不同的類別值……

為了要先得到編號228的類別,就要先下一次
SELECT 編號,類別  FROM a WHERE 編號=228

當然,其實不一定要把這句獨立,可以把他併到上面那個例子裡當一個subquery,就也是2次搞定,不過有可能會得到一句落落長的sql語法,光看就頭昏眼花……
知道228的類別後,再來抓他同類的前後一筆,可是這個時候再下2次就很笨了,因為如果一開始就決定要下3次 ,還上網找答案做什麼呢?
於是我用了UNION
(SELECT '前' as tmp,編號 FROM a WHERE 編號>228 AND 類別=x ORDER BY 編號 LIMIT 1)

UNION
(SELECT '後' as tmp,編號 FROM a WHERE 編號<228 AND 類別=x ORDER BY 編號 DESC LIMIT 1)
tmp欄位只是標一下前後各是哪一筆,萬一228的前後剛好有一邊沒資料,就會比較好判斷

說穿了還是subquery的概念,只是因為前後一筆我們只需要知道部份資料,如果跟228一起搜出來,mysql回傳回來的一大堆資料其實都用不到,這樣就浪費了server資源
而用UNION把兩邊的資料一起抓出來,也會比分2次進資料庫抓資料來的省時間

目前看來好像就只有這幾種方式比較省力了,為什麼他們不出一個nearby的函數,專門用來處理這種狀況呢...............................

2011年4月19日 星期二

姓名電話身分證號跟email產生器

因為嗶--(自動消音),找了幾個好用的產生器
雖然已經退出江湖好多……天,這種西還是常備在身邊的好
俗話說小心駛得萬年船,就分享給大家用用(啥鬼?)
各有優缺,不過都算好用,是嗶--(又消音)必備好物

Email產生器
10minutemail
fakeinbox
Mailinator
Guerrillamail

姓名身分證字號產生器

電話號碼產生器



((((((((((((((((這也算一則KM?!

2011年4月15日 星期五

用php mail函數寄有附件的email

簡單的講起來,就是寄送一個信件內容很長的mail,長的原因不奇怪,就是把要夾的檔讀出來塞在mailbody裡,分解動作開始。

1.subject設法照舊,跳過。

2.取一個獨一無二的boundary(其實我也不懂為什麼要多獨一無二):
$boundary = "==".md5(time())
其中前面的兩個等於「==」是因為信件中固定要用到的,所以先組上去。

3.設定header,告訴大家我有附件:
$header="Content-Type: multipart/mixed; boundary=\"{$boundary}\"\r\nFrom: =?utf-8?B?".base64_encode("寄件人姓名")."?= ";

4.開始組mailbody:
$message = "This is a multi-part message in MIME format.\n\n" ."--{$boundary}\n" . "Content-Type: text/html; charset=\"utf-8\"\n" . "Content-Transfer-Encoding: 8bit\n\n" . $html_mail_body . "\n\n";
$message .= "--{$boundary}\n";

5.先幫每個附件設定好檔名、mime type、收到時看到的附件檔名
$files[]=array("12345.xls","application/vnd.ms-excel","商品們.xls");
$files[]=array("67890.xls","application/vnd.ms-excel","訂購單.xls");

6.開始把附件組進mailbody裡:
for($x=0;$x < count($files);$x++){
    $file = fopen($files[$x][0],"r");
    //把要夾的檔案讀出來
    $data = fread($file,filesize($files[$x][0]));
    fclose($file);
    //編碼後以固定長度斷行
    $data = chunk_split(base64_encode($data));
    $message .= "Content-Type: \"".$files[$x][1]."\";\r\n" . " name=\"=?utf-8?B?".base64_encode($files[$x][2])."?=\"\r\n" .
    "Content-Disposition: attachment;". " filename=\"=?utf-8?B?".base64_encode($files[$x][2])."?=\"\r\n" .
    "Content-Transfer-Encoding: base64\r\n\r\n" . $data . "\r\n\r\n";
     //↑告知檔案資訊後把檔案加進去
     //一個附件夾完塞一個boundary當尾巴切斷
    $message .= "--{$boundary}\n";   
}
加粗的base64_encode是要說,如果要在信件中顯示中文檔名,最好就是用這種方式,不然會發現你設的檔名跟在outlook裡看的檔名總是不一樣,這問題讓我困擾了好一會,後來是抓outlook裡的原始檔出來看才發現=..=

7.然後就可以開心的寄出去了:
mail("reciver@you.net.tw",$subject,$message,$header)

2011年4月13日 星期三

apache轉址:RedirectMatch跟RewriteRule

前幾天找了一下apache轉址的方法,一開始找到RedirectMatch
使用方式很簡單,改httpd.conf,把要改的那個VirtualHost tag裡加上RedirectMatch 規則 目的就好了
像是固定要把/12345/abcde轉到/my.php?i=12345&n=abcde
設定裡就要下RedirectMatch ^/(\d{5})/([a-z]{5,10}) /my.php?i=$1&n=$2
規則可以用標準表示式設定,小括是重點,影嚮到後面$1,$2的使用,前面有括後面才能用$n的方式叫回來

改好後重新啟動apache服務就行了,很順利的一次搞定。

可是後來發現用這種方式導過去後,頁面上方的網址會是my.php?i=xxooxxoo這樣,不美麗
後來又找到RewriteRule,使用上跟RedirectMatch很相似,但是用法更靈活,只要把上面的RedirectMatch改成RewriteRule,然後在這一行的上面加一條Rewriteengine on,一樣重啟apache後基本上就可以了
用這種方式導到正確頁面後,網址不會被改掉,相當完美相當滿意

但是!!Rewrite要注意的是,因為網址不會被改掉,所以有時候會發生頁面上有些圖片、css、javascript、超連結等呼喚其他檔案的地方都中邪貌失效了,原因就是本來程式裡用相對路徑的寫法這時候會找不到啊!所以如果一開始沒用絕對路徑,這時候改起來就會很痛苦

雖然很開心的找到我要的rewriterule,不過我終究因為上面說的「改起來很痛苦」而改回redirectmatch……對於rewriterule的語法就沒有再深入去研究了,有興趣的人可以看看rewriterule的介紹

2011年1月20日 星期四

linux maillog停止更新

這兩天同事在弄postfix弄不好,問我一些問題,可是……我跟postfix也不熟啊XDDDD
不過呢,凡事有問題查log就對了,結果一查,耶??log最後更新日是去年9月3日,而且size長到一個相當嚇人的程度,於是著手先處理log的問題,一開始以為是logrotate有問題,但是看他的設定檔跟別的server上的設定檔一樣,所以又去看了一下syslog的設定
結果,竟然真的是被改成不記錄了,是哪個傢伙,幹麻惡整別人啊!!!
處理方式是這樣的:
開啟/etc/syslog.conf,裡面會有一堆什麼的log記在哪個檔的對應表,像這樣
*.info;mail.none;authpriv.none;cron.none                /var/log/messages
authpriv.*                                              /var/log/secure

mail.*                                                  /var/log/maillog

我一進這個設定檔的時候,mail.*那行後面變成「- /var/log/maillog」
把「-」刪掉存檔,然後種啟syslog,一切正常

有log好辦事,後來從log上的資訊得到postfix那邊遇到的問題,其實是在DNS端設定有誤造成的,DNS改好沒兩三下,問題就解決了。至於DNS是誰設的……就是部門主管。

2010年11月30日 星期二

flash文字框選取反白設定

flash裡如果選取文字框裡的字,預設的反白後顏色搭配就是黑底白字,偏偏現在很多網站都開始走黑色系,遇到同樣黑底白字的設定時,反白有反像沒反一樣。

要解決這個問題,就先選取要設定的那個文字框,然後點選「屬性」面板裡的「濾鏡」頁籤
按「+」符號,選「調整顏色」,然後會出現亮度對比飽合度色相的調整面版,只要把亮度往右拉,反白時的底色就會變比較亮(變灰色),這樣就可以跟頁面上的黑底區分開了。
 其他三個要拉不拉都可以,只要原本就黑底白字的時候,對比跟亮度不要同時拉到100就行了。

2010年11月3日 星期三

flash裡loadMovie後等比縮圖

其實正確的來說,要在loadMovie後縮圖,應該用loadClip函數。
如果原來用的指令是loadMovie(圖片路徑,目標MovieClip,方法)
要改下面這樣落落長:

var mvLoader:MovieClipLoader = new MovieClipLoader();
mvLoader.addListener(this);
mvLoader.loadClip(圖片路徑, 目標MovieClip);

function onLoadInit(_mc:MovieClip) {
_mc._xscale=_mc._yscale=20; //縮成原來大小的20%
}

詳細的MovieClipLoader使用方法參閱adobe-MovieClipLoader

在windows下執行linux的convert縮圖指令

因為測試環境是本機的win xp+xampp,但是正式環境是linux,所以在測試縮圖功能時,常常卡在windows沒有linux的convert指令,弄的每張圖都很大......結果找了一下,原來是那麼簡單XD

首先呢,要先下載ImageMagick的安裝檔,我是下載ImageMagick-6.6.5-5-Q16-windows-dll.exe
下載回來後執行檔案進行安裝,一切都是下一步下一步就結束了
接著因為windows有個功能不一樣的convert.exe,所以要進入ImageMagick的安裝目錄,把他的convert.exe另外取一個名字
執行regedit修改設定檔,找convert.exe,會找到一個「ImageMagick安裝目錄\convert.exe」的登錄值,把convert.exe改成上一步給的新名字
改好關閉,然後開MS-DOS視窗,打新名字,看能不能順利找到這個指令
回到php程式,為convert那行指令新增一條windows版的就行了

2010年10月27日 星期三

attachMovie+動態文字欄位+遮罩

這兩天在弄一個要flash列表,要捲軸,而且因為版面美觀,沒有套用flash裡的組件,所以呢,就要自己寫scrollbar程式,資料是圖+文,要動態產生,還要能點選後跳到別的影格……
講起來很簡單,看起來這功能也很普遍,可是之前從來沒寫過……捲軸搭配遮罩就做掉了,並沒有想像中難,兩三下解決
動態產生圖文本來要用duplicateMovieClip,後來發現他不能把A movieclip裡的東西copy到B movieclip,爬了一下找到attachMovie,用法跟duplicateMovieClip類似:

.A_MovieClip是要被複製多次的對象,裡面包了影片片段pic跟動態文字title。這個影片在元件庫裡要設定連結屬性,識別名稱就用A_MovieClip,連結選「匯出給ActionScript使用」
.B_MovieClip是要放A_MovieClip眾分身的影片
.C_MovieClip裡放了一組遮罩設定,遮色片叫myMask,顯示遮色片是一個背景圖跟B_MovieClip
.先是attachMovie
C_MovieClip.B_MovieClip.attachMovie("A_MovieClip","A_MovieClip_copy"+num,C_MovieClip.B_MovieClip.getNextHighestDepth())
"A_MovieClip_copy"+num是分身的新實體名稱
.設定好分身的放置坐標後,要設定圖文內容:
loadMovie("xxxx.jpg",C_MovieClip.B_MovieClip["A_MovieClip_copy"+num].pic,"POS");
C_MovieClip.B_MovieClip["A_MovieClip_copy"+num].title.text="ABCDE";

好了,到這裡圖片正常顯示了,可是字怎麼樣都看不到,trace一下title.text,發現值都設定正確,只是畫面上怎麼也看不到他,爬文爬了2天,後來終於發現要用setMask……於是在分身生完之後加了一行
C_MovieClip.B_MovieClip.setMask(C_MovieClip.myMask);

這樣就什麼都看的到了

至於點了要跳影格,就在A_MovieClip的第一個影格裡加:
this.onRease=function(){
//要做的事
}

這樣就搞定啦~
可是還是要講一下,flash裡對attachMovie的解說也真的夠精簡的了,attachMovie明明可以放4個參數,可是他的範例通通是3個參數的……雖然說第4個參數是設定物件屬性,在attchMovie後再設也可以,可是基於程式人員精簡的習慣,能1行執行完的就不拆2行,所以特別提一下第4個參數的設定方式:
attachMovie("A_MovieClip","A_MovieClip_copy"+num,C_MovieClip.B_MovieClip.getNextHighestDepth(),{屬性名稱1:屬性值1,屬性名稱2:屬性值2,.....})

我真是太認真了,來賓請掌聲鼓勵鼓勵。

2010年9月23日 星期四

用xmlconnector讀xml

flash組件功能滿強,這個xmlconnector也很酷,一行程式都不用寫就能把xml資料顯示出來,簡單幾個動作解決。

1.先把xmlconnector拉到flash場景裡,位置隨便丟,反正他在執行階段沒有實體
2.設定要讀的xml路徑:在xmlconnector的參數裡,有個URL的項目,填入路徑;這裡要注意的是,如果要使用網路上的動態xml資料,發佈的flash也要放在同一網域下,不然會有安全性問題,如果是要讀本機的某個檔案就沒差。
3.設定direction:因為現在要做的單純只是抓xml資料,所以direction參數值選擇receive就行。
4.開出組件檢測器模板(CS3版本在視窗→組件檢測器)
5.點一下場景上的xmlconnector,然後在組件檢測器裡切換到「結構」頁籤,點一下result那一條,然後按右上有個「從xml範本檔案匯入結構描述」的小圖示,選擇你的範例xml。
6.上一步做完就會發現flash很厲害的把整個xml檔的結構都讀進來了,連資料型態跟每個tag的屬性都沒漏掉。
7.選一個UI組件拉進場景裡,這裡就先用List。
8.點一下場景裡的List,然後一樣看組件檢測器,點一下「繫結」頁籤,按一下左上的「+」圖示,選「DataProvider」那一項,按確定。
9.點一下剛剛新增的那條DataProvider項目,在下面的bound to裡,設定組件路徑是xmlconnector,結構位置是要顯示的資料的tag。假設xml資料內容像這樣:

gogo
2010-09-23



這樣在「結構位置」的地方就要選BlogArts。
10.結束,測試影片應該就會看到flash抓到資料了。



這個以前就做過,最近又測的時候忽然搞了很久,後來才發現原來是在替xmlconnector匯入結構的時候選到params了,一直測都測不出來……

2010年7月14日 星期三

幾個常用的系統變數

HTTP_USER_AGENT:user的瀏覽器資訊,包含種類、版本及裝了哪些toolbar
QUERY_STRING:網址列帶的變數資料,通常用來pass到下一頁或要再回這頁時用
REQUEST_URI:當前頁的路徑
HTTP_REFERER:上一頁的路徑。有些瀏覽器不會記這個資訊,所以越來越少用了XD
REMOTE_ADDR:user的IP

2010年7月6日 星期二

新增/刪除select物件option

html:


1.移除team裡的所有option
javascript:
while (document.getElementById("team").length>0) document.getElementById("team").remove(0);
一行搞定XD

2.增加新的option到team裡
javascript:
newObj=document.createElement('option');
newObj.text="組別1";
newObj.value=i;
try {
document.getElementById("team").add(newObj, null); //ie看不懂
}
catch(ex) {
document.getElementById("team").add(newObj); //只有ie看的懂
}

然後如果要用陣列的方式動態更動option,javascrip裡的陣列用法是這樣:
var teamList = new Array(3);
teamList(0)="組一";
teamList(1)="組二";
teamList(2)="組三";
teamList(3)="組四";

javascrip的陣列是我覺得最神奇的啊!
首先宣告的時候不能用Array()的方式,他一定要你塞值進去,所以在宣告一個新陣列的時候,就要決定好這個陣列要多長;第二是他實際給你的陣列長度是你宣告時給他的數字+1,因為還有0,所以,當有一個陣列只有一個值的時候,宣告時是用new Array(0)

2010年6月24日 星期四

移除apache預設語系

最近遇到放在同一server上的多個網中,要把其中一個網站改成utf-8編碼,其他繼續用big5編碼時,utf-8的網頁全部改好編碼,也改好head資訊了,結果開啟網頁的時候,瀏覽器一樣是選big5編碼,就算用自動選取也是不跳utf-8。
後來發現原來是那台server的apache版本較舊,有設定預設語系,現在新版apache大多預設不設定預設語系了。
把預設語系移掉方法:
1.修改httpd.con設定檔,路徑一般是在/etc/httpd/conf裡
2.找到"AddDefaultCharset",在這行前面加# mark起來
3.重新啟動httpd服務:執行/etc/rc.d/init.d/httpd restart,成功重啟後再確認一下各網站運作正常就ok了

2009年8月5日 星期三

MySQL複製一筆資料

這個說起來很簡單,真的做起來其實也很簡單,但因為不常用,應該有不少人用起來很生疏吧!

語法其實很簡單
INSERT INTO tablename [VALUES (fields...)]
SELECT fields FROM tablename [WHERE ...]

我想這個在使用上最容易遇到的問題,就是主索引跟唯一值不能重複的問題了。
在最單純的狀況下,要把tableA的一筆資料複製,只要下

INSERT INTO
tableA
SELECT * FROM tableA WHERE id=3

就行了。不過呢,如果遇到鍵值不能重複的話,就要在設定VALUES裡設定欄位,當然相對的在後面的SELECT裡,也要指定一樣的欄位。

這樣如果某個表欄位很多,又要避掉索引值的話,其實光用想的我就累了……應該有方法可以處理掉欄位的問題,但那是個懶方法,卻不一定是個好方法,在目前還沒遇到那麼棘手的問題前,還是勤勞的慢慢key欄位名稱好了~

這個方式也是可以用在Oracle跟MSSQL裡的,其他的資料庫因為手邊沒得測,就不知曉了。

2009年6月29日 星期一

用excel巨集刪除重複資料

這是今天做的,感覺挺實用。

=================================================
Sub DelDups_TwoLists()
Dim iListCount As Integer
Dim iCtr As Integer
Dim sheetA_Name As String
Dim sheetB_Name As String
Dim sheetA_Range As String
Dim sheetB_Range As String

' Turn off screen updating to speed up macro.
Application.ScreenUpdating = False

sheetA_Name = Sheets("rule").Cells(1, 1)
sheetA_Range = Sheets("rule").Cells(1, 2)
sheetB_Name = Sheets("rule").Cells(2, 1)
sheetB_Range = Sheets("rule").Cells(2, 2)

' Get count of records to search through (list that will be deleted).
iListCount = Sheets(sheetA_Name).Range(sheetA_Range).Rows.Count

' Loop through the "master" list.
For Each x In Sheets(sheetB_Name).Range(sheetB_Range)
' Loop through all records in the second list.
For iCtr = 1 To iListCount
' Do comparison of next record.
' To specify a different column, change 1 to the column number.
If x.Value = Sheets(sheetA_Name).Cells(iCtr, 1).Value Then
' If match is true then delete row.
Sheets(sheetA_Name).Cells(iCtr, 1).Delete xlShiftUp
' Increment counter to account for deleted row.
iCtr = iCtr + 1
End If
Next iCtr
Next
Application.ScreenUpdating = True
MsgBox "Done!"
End Sub
=================================================

程式其實是從M$網站上co下來的,只改了資料來源設定方式
sheetA_Name,sheetA_Range分別是母資料的sheet名稱跟資料範圍
sheetB_Name,sheetB_Range分別是子資料的sheet名稱跟資料範圍
這四個值透過rule這個sheet的A1,B1,A2,B2來設定,然後巨集執行後,就會把母資料的欄位中跟子資料重複的資料刪掉。

不過執行時間比原先預期的要久,才少少三千多筆的母資料跟八百多筆的子資料,跑這個巨集就要一分多鐘的時間,真的相當出乎意料啊!

如果資料再多個兩三倍,不知道要不要搞來一台超級電腦?

2009年6月26日 星期五

設定與mysql連線所使用的語系

其實是之前就有遇過的問題,但是因為以前有前人寫好語法就直接copy沒有記,直到昨天有需要又找不到哪裡有用過,才認真的找了一下資料。

簡單的說,會遇到這個問題是因為資料庫使用的語系與程式預設與mysql連線時要使用的語系不一樣,這會造成中文字在mysql裡是正常的,但透過php抓出來的卻是問號。解決這樣的問題依php版本不同有不同的方式。

php5:mysql_set_charset(charset,resource)
php4:mysql_query('SET NAMES charset', resource)

範例:假設連線時要設定語系為utf8


//建立與mysql db的連線
$dbConnection=mysql_connect("localhost","acc","password");
//選擇要操作哪一個資料庫
mysql_select_db("dbname",$dbConnection);

//如果是php5
mysql_set_charset('utf8',$dbConnection);
//如果是php4
mysql_query('SET NAMES utf8', $dbConnection);


這樣子把資料庫裡的中文字抓出來時,就會正常顯示了。


中文還真是麻煩的東西啊!

2009年6月5日 星期五

幾個常用的mime type

gif:image/gif
htm:text/html
jpg:image/jpeg
swf:application/x-shockwave-flash
txt:text/plain
xls:application/vnd.ms-excel
doc:application/msword
ppt:application/vnd.ms-powerpoint
wav:audio/x-wav
avi:video/x-msvideo
exe:application/octet-stream
mpg:video/mpeg
mvb:application/x-msmediaview
pdf:application/pdf
zip:application/zip