2008年12月28日 星期日

HTML DOM 裡的window物件

在web page裡的DOM是這樣排列的 window->document->html 接下來就是 head跟body
而且window.open()這個mothod 不只會新開出一個視窗(或是頁面) 更會回傳被開出來的視窗的DOM tree的window物件
也就是如果用 var s=window.open("http://www.example.com/a.html"); 接下就可以用s.document."some object or some method"
去存取那個新開視窗下面的DOM物件
但是 雖說是可以存取 但還是有某些限制 例如same origin policy的問題
若是被開出來的視窗已經換到不同的origin(port domain protocol)去了 那就不能對這個視窗做存取的動作了

還有就是時間的問題 例如想要讀取新開出來的window的url 如果直接這樣寫
var s=window.open("http://www.example.com/a.html");
alert(s.location.href);
這樣會得出 about:blank
我猜想是因為 執行到 alert(s.location.href); 這一行時 http://www.example.com/a.html的DOM tree的資料結構還沒構建好
若是這樣用 setTimeout("alert(s.location.href)", 1*1000); 澤就可以正確顯示出 http://www.example.com/a.html 了

然而 被新開出來的視窗 也可以利用window.opener來取得開出此視窗的視窗的window物件(姑且稱為父視窗)
同樣得 有了window物件 也可以存取自己的父視窗下的DOM物件
當然 上述的情況都要符合same origin policy才行

2008年12月10日 星期三

fedora6下換目錄顏色&vim 註解顏色的方法

用pietty連進fedora core 6的時候 目錄跟vim 註解的顏色是深藍色的
而pietty的背景顏色又是黑色 所以很傷眼睛

不過只要在家目錄下加個設定檔 就可以換顏色了

要換vim的註解顏色 只要在家目錄下加個 .vimrc檔
裡面寫 highlight Comment ctermfg=darkcyan
這樣就可以把註解換成淺藍色

目錄顏色的話 有點複雜
可以參考這裡 http://andrew.sayya.org/blog/?p=65
如上網址所述 虛擬終端機的顏色設定檔是在 /etc/DIR_COLORS.xterm
虛擬主控台的顏色設定檔是在 /etc/DIR_COLORS
如果想要讓不同的使用者調整自己想要的顏色
在家目錄裡加個 .dir_colors檔
然後把/etc/DIR_COLORS裡的內容 copy過來

再把DIR 後面的顏色換成你想要的顏色就可以了

pdf限制列印

下載了一個限制列印的pdf檔案 想了各種方法要把它印出來
包括先轉成word後再印 或是用pdf破解軟體先破解密碼再印

在網路上有找到一個blog介紹pdf破解軟體 Free PDF Tools
http://blog.soft.idv.tw/?p=414
結果我GhostScript不能裝
就在一籌莫展之際 無意之中在檔案上按下右鍵
疑 有個列印的選項 按下去看看

一秒後 身後的印表機動了起來 = =
天阿 這樣就印出來了
冏 無言......

2008年10月2日 星期四

有關PHP的session

之前用PHP寫會員系統的網頁 有用到session
大家都知道會員系統常常會用到session跟cookie這兩種東西
但是對網頁沒什麼概念的我 一開始對這兩種東西有點搞混了
查找資料後 在這邊把一些經驗跟觀念寫下來(在這邊就不講cookie了 單講session)

首先 當一個PHP程式要使用session時 必須在使用前先呼叫session_start()這個函數
當一個瀏覽器一瀏覽到有呼叫session_start()的網頁時 一個session檔案就會在伺服器中產生了
這個檔案是存在server的硬碟之中 存放的位置依據php.ini中的session.save_path而定
這個部分跟cookie類似 只是cookie是存放在client端的檔案 session是存放在server端
session檔案產生之後 server端的頁面需要使用到的session變數全都會存到這個檔案之中

好了 現在有個問題 一個頁面可能同時被很多人瀏覽 在這種情況下 session檔案也應該要有很多個才對
並且server還必須要知道哪個session檔案是屬於哪個正在瀏覽頁面的使用者擁有的
沒錯 當session檔案產生時 一個可以用來辨別使用者的token也會跟著產生 也就是所謂的session_id
並且session_id會直接寫在session檔的檔名上 例如像這樣:

sess_gge0ci41lnm57npqhp9m7riqn2

這是一個session檔的檔名 sess_後面的就是session_id

==========接下來是我自己的理解 可能有錯誤的地方============
上面說這個session_id可以讓server用來辨認使用者 其實精確一點來說
是用來辨認client端"正在瀏覽網頁的process"
例如同一個使用者 開了兩個ie視窗來瀏覽網頁 這兩個ie是不同process
則server端其實會產生兩個session檔

好 現在來一個瀏覽網頁的流程舉例
1.client端一個瀏覽器瀏覽了呼叫session_start()的網頁 server對這個瀏覽器給出一個session_id
2.根據這個session_id session檔案產生了
3.每當這個瀏覽器要瀏覽server端其他頁面時 都會把session_id也傳給server
server以此去找尋屬於這個瀏覽器的session檔
4.client端把這個瀏覽器關掉了 新開一個瀏覽器繼續瀏覽頁面 但是這個瀏覽器不會把session_id傳給server
5.server沒發現session_id 於是server給出一個新的session_id 然後產生一個新的session檔
回到了1.的流程

=============================================================

接著應該可以知道 session_id是很重要的 而且看完上面 應該可以發現
既然client端的瀏覽器常常要把session_id傳給server 那client端應該要儲存session_id才對
沒錯 若是照php.ini的預設 當server給出一個session_id時 client端瀏覽器就會有一個cookie來儲存session_id
但是也可以不要這樣做 例如修改php.ini中的session.use_trans_sid為1
這個設定是告訴server 若是某個瀏覽器不使用cookie
PHP會自動將這個瀏覽器看到的網頁中的連結後面都加上PHPSESSID=xxxxxxx
這樣一樣可以達到瀏覽器瀏覽頁面時將session_id傳遞給server的功能
不過這個方法並不安全 最好不要使用

2008年9月16日 星期二

寫了一點php&javascript

用vim寫php跟javascript需要高明的debug功力 這是最近的一點心得

最近寫了需要註冊的網頁 用到一點點php跟javascript 剛開始寫這些scripting language還蠻好玩的
因為入門的門檻其實不高 但是後來debug的時候就難過了 這種不需要事先編譯的語言 只要任何一個地方有點小錯誤
那debug可能就要de到非常難過 像是用javascript寫一個function一個變數寫錯然後整個function就沒有作用了
php也是一些奇怪的小錯誤整隻php程式就不會跑了 也可能是我剛接觸這些所以debug功力不高強
不過有編譯器幫忙find error真的方便多了

雖然有人跟我說用dreamweaver這類的編輯器很方便可以設break point 不過我就是不想用
vim就很好用了阿 簡單乾淨 而且我不想再去學一種軟體 也不喜歡軟體自動加的code
跟本身龜毛也有一點關係 總之還是會繼續用vim寫下去