2009/2/28

用 javascript 來取代 marquee 《by 童顏未老人》

 最近網站上的部份功能被老板要求要改變了,他希望公司的訊息能跑馬登的方式來呈現,呵,這不太難:


 不過這會有一個問題,那就是在 "星期五,同劉真去跳舞" 和 下一次出現的 "星期一,幫林志玲穿新衣" 間會有一大塊的空白,會形成冷場,所以這不是我所要的。但是我在網路上找半天後發現,用現成的 marquee 來製作的話,好像就一定會有這一大塊的空白。恩,看來要用 javascript 了。


 先用 google 大神找一下,果然網路上有現成的,但是很多都是有點小問題,不是只能在 ie 跑,要不然在 firefox 下會毫無動靜,不過還是讓我找到一個最簡單又貼近我的需求的作品,雖然它有一個小問題,就是當滑鼠移入後不會讓跑馬燈停下來,不過這還好,修改一下就可以了 :


而結果也還算是如人意,若想要調整捲動速度時, 僅要去改一下 setInterval(NewsMarquee,100); 裏面的數字即可 !

2009/2/24

oracle 主機毀損歷險記《by 童顏未老人》

 昨天是我碰過最精采刺激的一天,咱公司的 Oracle DB Machine 竟然無預警的就掛點了。所有的公司運作當場停擺。雖然最後是有經無險的渡過,但是我相信這是冥冥中給我的提醒,要我對可能發生的問題及早準備。

 昨天下午 Oracle 一罷工之時,我二話不說立刻飛車衝到機房去。本來僅僅以為在 console 前去操作一下就可以救回來了,那知問題可真是大了。它在 filesystem check 時便過不了了,直接要我輸入 root 密碼切入到 Repair filesystem 的 mode 下去,因為看到他寫著 /dev/sda3 發生問題,所以我只好下 fsck /dev/sda3 那知它回吐給我 fsck.ext3 for device /dev/sda3 exited with signal 11 這樣的訊息。

 接著下 e2fsck /dev/sda3 ,回給我另一個錯誤訊息 : Segmentation fault。這時我已有點擔心了,我擔心會是 Hard disk 毀損,這最慘的情形。且當我硬要用 mount 測試一下時, 他回給我 wrong fs type, bad option ,bad superblock on /dev/sda3 ! 看到這裏,我心中其實有點明瞭了,硬體應該是掛了,只是不知是硬碟還是 其他周邊設備出問題。

 於是我先回到公司去把安裝光蝶帶到機房去,改用第一片胱碟開機,再去 fsck 一下,狀況依舊,不過他就會問我要不要去修復,我再狀況未明下不敢冒然回答要。但是我仔細看一下他 mount 在 /mnt/sysimage 下的原 filesystem ,檢查半天後,發現絕大多數的東西都還在,壞掉的 filesystem 是 /var 這重要的目錄,難怪 linux 會起不來。

 既然所有東西都還在,我臨時起了一個大膽的想法。我有另一台機器是之前學著安裝 oracle 所裝的,上面跑 另外的 ap,不過並不吃重。所以我想嘗試將原 oracle db 的所有檔案 copy 下來,在另一台機器上復原。反正若不成的話,大不了在回公司拿備份的資料來倒進去。

 不過擺在眼前第一個問題是,這台在 linux rescue 下的機器網路功能一直起不來,資料要傳過去是個大問題。所有的 datafile、control file 、redolog file‧‧‧等經過 tar -czvf 後也還有 1G 左右,嘿嘿,剛好我身邊的 usb 隨身碟還有 1.5G 的空間,於是用 fdisk -l 看一下隨身碟是在 /dev/sdd1 這怪設備路徑下。

 先mkdir /aaa 這臨時的目錄,然後 mount /dev/sdd1 /aaa ,再把所有壓起來的檔案通通 cp 到 /aaa 下去。不過這 1G 多的檔案足足 copy 了近四十分鐘,看來我要去買個好一點的 usb 隨身碟了。

 準備好以後,再到另一台機器上,同樣的把 隨身碟 mount 上去,在解壓縮後,再一一的去 chown oracle:oinstall *,然猴啟動 oracle , 哇,居然就成功了!真是太美妙了!

 不過我得在作好更多的萬全準備,不是美次都能如此的幸運的!

2009/2/6

在 php5 程式中使用 include 會多空一行的解決《by 童顏未老人》

 最近在使用 php 開發程式時碰到一個問題, 找了許久終於被我找到解法。當在 php 中使用 include 時,常常就會多空下一行來,使得版面常常是破壞的很慘, 例如 : 原先需要的效果


程式是直接寫在主體程式內這樣沒有問題!


但是因為這一塊是很多頁都要用到的,所以想把它改成是獨立一隻程式,然後讓每隻要用的程式再去 include 就好,所已改寫如下:


但是結果卻發生如下圖中,兩個圖片竟不會對齊了!


真是怪了,我到 google 上找了幾下,終於了解是因為 UTF-8 的 檔首有 BOM 字元,會造成 include 進來後就發生多空一行的情形 !

因我使用的 edit 是 Notepad++,只要將格式改存成 UTF-8 格式,檔首無 BOM 存檔檔後就恢復未用 include 前的排版效果了 !

2009/2/5

對 高血壓有就醫但沒療效的一些看法《by 童顏未老人》

 在 2/5 的自由時報上有一篇 3成8高血壓患者 有就醫 但沒達到治療效果,這對台灣目前逐漸走向高齡化社會的大多數人來說,無疑是一項警訊!

 當然了,除了醫師所開的處方籤外,我們日常生活中亦可透過健康的飲食來逐漸改善高血壓的情況,請參考高血壓 - 常見病食療驗方,透過我們日常生活中的膳食來減緩高血壓,這應該是最自然與健康的方法了!大家可以多參考看看。不過,若人在感到不適時,請務必要上醫院去看醫生!

2009/1/24

透過 javascript 來新增與刪除上傳檔案《by 童顏未老人》

 最近又碰到一個比較困難的東西,就是要在使用者上傳檔案時,需要可以任意的新增檔案,也要能隨意刪出任一個已選的檔案。

 如下圖是最先的狀況,


 使用者可以任意的點選「新增檔案」來增加上傳的檔案數。


 若覺得不妥想再刪除,只要點選該檔案後面的「刪除」,即可。


 新增的部份比較簡單,刪除的部份我花了不少時間才弄出來。

 在程式本體中,請如下的程式碼 :


主要是設了一個容器 fieldset 用來包含著每一個讓人去上傳檔案之用。在這裏先放上一個,方便使用者來用。當使用者想增加其它的檔案時,就點選上面的「新增檔案」按鈕,透過 onclick 去發動 addupload()。

var fieldcount = 1;

function addupload() {
fieldcount++;
var newfield = document.createElement('input');
newfield.type = 'file';
newfield.name = 'file' + fieldcount;
newfield.id = 'file' + fieldcount;
newfield.size = '60';
document.getElementById('fs').appendChild(newfield);

var newbutton = document.createElement('input');
newbutton.type = 'button';
newbutton.name = 'b' + fieldcount;
newbutton.id = 'b' + fieldcount;
newbutton.value = '刪除';
newbutton.onclick=function(){delfile(this.getAttribute('id'));};
document.getElementById('fs').appendChild(newbutton);

}

(以上 程式碼要包函在 script 和/script 中 )

因為我們在程式中已預先擺了一組可供使用者上傳用的檔案按鈕,所以作為 counter 用的 fieldcount 起始值為 1。然後每次被 call 一次 addupload 時,便立刻加一。然後利用 createElement 來創建兩個結點,一個是讓人上傳檔案用的欄位,另一個是用刪除該上傳欄位用的按鈕。各自將其 attribute 上進去後,在利用 appendChild 來將兩個節點上到 fs ( fieldset )這個父容器之下。

要想刪除認一指定的欄位時,同時也得把後面的刪除鈕一併刪除。當點選了「刪除」鈕時,會觸發 onclick 去執行 delfile(this.getAttribute('id')), 其中要把那一顆刪除鈕的 id 一併傳到delfile 這 function 去。

function delfile(idname) {
var filename = 'file' + idname.substr(1,1);

var filex = document.getElementById(filename);
var bx = document.getElementById(idname);
filex.parentNode.removeChild(filex);
bx.parentNode.removeChild(bx);
}

因為每一組的 上傳欄位的 id 都是 file1、file2、file3、....,其相對應的「刪除」鈕之 id 為 b1、b2、b3...,所以只要透過 substr(1,1) 將「刪除」鈕 id 的第二碼取出,便可組合出相對應上傳欄位的 id 名。最後透過 父容器的 removeChild 便可將兩者一一移去!