分類
程式技術

詭異的dtd (flash滿版問題)

今天在處理一個妙妙妙的問題. 在 IE 下看很正常, 但在 Firefox 下看就很怪.

是一個 flash 的網頁, 內容其實只是要佈滿版瀏覽器而已, 在 IE6, IE7 下沒問題, 但在 Firefox 下, 卻是寬滿版, 高則維持原 flash 的高度(sample 內的 swf 為320*240). 我們先來看看發生的狀況, 以下 sample 連結, 請查看:

http://sample.diary.tw/16/f1.html

原始檔內容如下:

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html>
<body>
<embed height="100%" width="100%" src="f1.swf" type="application/x-flash" />
</body>
</html>

用 IE 看和用 Firefox 看結果不同:

真是奇怪咧, 後來經檢查發現, 是和原始碼的第一行有關, 若使用了 xhtml 的 dtd 後, 就會發生這個狀況, 當把 dtd 移除後, 無論是 IE 或是 Firefox 就都可以滿版了, 可以參考這個範例連結:

http://sample.diary.tw/16/f2.html

但遵守 xhtml 是未來必經之路, 不能說拿掉就拿掉吧, 再來找看看有沒有好用的 solution, 於找到了這篇: TIPS-Get 100% Height in XHTML

裡面建議了一個蠻不錯的好方法, 就是將 html 及 body 的高度都利用 css 指定 100% 設起來後, 就可以有全高的 flash 了, 如下:

html, body
{ margin: 0; padding: 0; height: 100%; border:none; }

就能有效解決 dtd 存在的 xhtml 時, 無法滿版的問題, 重點在於 html 及 body 的 height: 100% 這件事上, 請參考範例連結:

http://sample.diary.tw/16/f3.html

而其中的 margin:0; padding:0; 是將 box model 中的邊界及位移都設為0 , 更接近滿版的狀況囉, 到此終於解決了一個詭異的 html 滿版問題了.(當然 flash 只是其中做為應用的一種啦, 其他的 html tag 也都是一樣的意思, 滿版都有這些狀況, 只是 flash 較常碰到了)

PS. 補充一下, 剛好手邊也有 IE8 , 他的狀況和之前的 IE6, IE7 不同, 由於更支援正式的規範, 反而它的行為是和 Firefox 一致哦, 不過若是切到 IE8 的 compatible view 時, 就會和 IE7, IE6 一樣囉!!

分類
Database

SQL Injection問題-偵測滲透成功的方法

SQL Injection 也存在很久了, 通常要發生大規模爆發, 一定是有新的弱點或新的工具產出. 最近在找相關資料時, 發現還蠻有趣(應該說蠻恐怖的)一個資料: http://huaidan.org/archives/2287.html

其中的第2點: Time-Based Blind SQL Injection using heavy queries: A practical approach for MS SQL Server, MS Access, Oracle and MySQL databases and Marathon Tool

這個讓我想起來, 在我還在唸書的時候, 有修過一門課, 叫做實驗設計, 其實和這個有一些關係, 在分析變因時, 會用許多測試的手法來反覆驗證該變因或是該因素是否對該實驗結果有效這件事. 也和 QC 品質測試有關係, QC 在做黑箱測試時, 也是所謂的 blind test 的方式, 來找出是否有什麼系統上的缺陷和瑕疵, 其實這些方法, 應用在 SQL Injection 上的測試, 也是一樣的.

我們可以看到該文章後面提到的許多有趣的方法來做這件事. 尤其是一個有趣的技術, 就是直接餵入”費時”查詢來偵測 http response 的時間, 來看看是否成滲透成功, 一般說來, 判定滲透是否成功, 往往要由 http response 的結果來看, 其實是不太容易自動化的, 但若是使用 http resopnse 時間來做這件事, 我們來想想背後的目的, 就是 “自動化” 的這件事.

其實要真的試看看漏洞, 若是需要人來看, 往往能找的量就少, 不過若是能利用 http response time 來偵測判定, 能夠變成自動化的話, 效率就高很多, 再利用多方工具配合下, 其實….

能做的就相當多了….

真的是一個很不錯的偵測滲透方式, 給大家參考.

[2008/12/29 18:11]
繼續閱讀:
http://www.wretch.cc/blog/Domynews/9731368

分類
Database

SQL Server的遺失索引統計

先說好, 這篇必須是 SQL Server 2005 以上的用戶才能用到的, 因為用到的資料是 DMV 的系統 view, 也就是 Dynamic Management Views.

這裡會用到的 DMVs 是用來查詢所謂遺失的索引, 白話一點, 就是應該要建立的索引, 而沒有建立的索引, 稱之為所謂的”遺失的索引”. 資料庫在查詢時, 若是發現有這樣的狀況, 會記錄下來, 在 DMVs 內的這幾個表:

sys.dm_db_missing_index_groups
sys.dm_db_missing_index_group_stats
sys.dm_db_missing_index_details

在這些表內可以利用這篇文章 (揭露隱藏的資料以最佳化應用程式效能)的一個計算方式(當然也可以再調整), 來將影響較為嚴重而又沒有加上索引的 table 找出來, 查詢如下:

SELECT  TOP 10
        [Total Cost]  = ROUND(avg_total_user_cost * avg_user_impact * (user_seeks + user_scans),0)
        , avg_user_impact
        , TableName = statement
        , [EqualityUsage] = equality_columns
        , [InequalityUsage] = inequality_columns
        , [Include Columns] = included_columns
FROM        sys.dm_db_missing_index_groups g
INNER JOIN    sys.dm_db_missing_index_group_stats s
       ON s.group_handle = g.index_group_handle
INNER JOIN    sys.dm_db_missing_index_details d
       ON d.index_handle = g.index_handle
ORDER BY [Total Cost] DESC;

這樣表列出來的資料簡單說明一下:
第一個Total Cost為總成本, 該作者是使用了一個計算的方式, 並以此為排序條件, 找出總成本最高的資料, 第二個 avg_user_impact 為對使用者的影響, 後面三個最重要了, [EqualityUsage]是指等於的條件, 例如 newsid=235 這種條件, 而 [InequalityUsage] 就是指不等的使用, 例如: newsid < 235, 而 [Include Columns]是指查詢時的涵蓋欄位, 也就是指 select newsid, newstitle, newsdesc …. from 前面的欄位.

再來談談有關索引欄位的建立, 上述的後三個欄位就都是要件, 基本上, Equality, Inequality 是指 where 使用的比較欄位, 而 Include Columns 是查詢出來的覆蓋欄位, 至於要如何下這個索引, 成本最粗的下法是將 Equality + Include Columns 加入或 Inequality + Include Columns 加入, 這樣就會有查詢較佳的效能, 但會不會是最好的, 也還是得看異動的頻繁度來考量, 而該索引有沒有價值, 也是必須要評估的, 這裡介紹的方法是將沒有建上的索引資料整理出來列表給管理員來參考用的, 可以節省許多追蹤上的時間. 希望對於效能管理上對各位能有所幫助!!

參考資料:
http://msdn.microsoft.com/zh-tw/magazine/cc135978.aspx

分類
Javascript 懶得分類

好棒的jQuery介紹網站

jQuery, 因為最近一些狀況(就是被 m$ 整合進入 visual studio ), 瞬間變成當紅炸子雞. 讓想學的人更想學, 而不知道或原本沒想學的人也想學.

這兩天在看一些資料的時候, 無意間找到這個網站: www.visualjquery.com , 還真不是蓋的, 是 “visual” 的 jQuery 哦, 所有的介紹都直接用視覺化的方式呈現, 方便學習 jQuery 的人, 無論是新手, 老手都很適用的一個了解 jQuery 技術的網站. 一定要來看看哦!

分類
程式技術

網頁為什麼會發兩次request到自己

這個是相當困難的一個題目…..

話說在 debug 一個 asp.net project 時, 因為會用到 session 內的 counter 做一些事情, 結果在測試的時候發生了一個很奇妙的狀況, counter 會無故多 +1

仔細檢查 asp.net 的程式碼, session 內的 counter 一次只有加一, 是寫在 Page_Init 這個 event 裡. 理論上沒有理由會多 +1, 雖然是用 master page 的方式處理, 也沒有理由在這個狀況下發生問題. 於是進行獨立測試, 發現即使沒有使用 master page 也是一樣. 所以初步排除和 master page 有關.

接下來 check iis log來對照, 果然有發出兩次 request 的狀況, 而不是 asp.net code 內的問題, 這樣問題說明應該是在 client side 端, 所以乾脆用 client 端來查, (利用 firefox 的 firebug 發現還真的會對該頁面發出兩次 request. 真的太神奇了, 於是再將該頁面存成 html 來查, 再做一次測試, 整個還是一樣的結果, 於是只好拿出區塊區塊刪除的方式來查… 花了超久時間… 發現結論問題在一行:

<img src="" width="242" height="182" alt="" />

有沒有看到什麼狀況? 就是 src=”” 這件事, 他讓 client 去多訪問了沒有設定的 img src 也就是本頁, 又或是 src=# 也是一樣的結果啦!!

所以這個到底要怎麼說呢, 唉, 反正就是很悶的一個無敵怪 bug…. 還好有找到咧, 給大家做參考!!

繼續閱讀:
http://www.johnbatdorf.net/blog/CommentView,guid,5aebd6b0-9be3-462c-a920-e19998bc173e.aspx
http://blog.csdn.net/vividboy/archive/2007/09/13/1783162.aspx

為了增加一些 page view, 多上一個英文的描述, why page load twice in ASP.NET or why page fire twice page_init event (雖然和 asp.net 一點關係都沒有, 哈哈)

分類
程式技術

如何利用CSS不要出現SCROLLBAR

今天在弄一個小網頁, 有個比較特殊的需求是不要出現在 browser 右邊的 scrollbar, 而且是 disabled 狀態的 scrollbar 都不要出現.

查了一下, 其實很單純, 直接使用 overflow: hidden 屬性放在 body 上就可以很容易做到這個需求. 參考這個範例: http://sample.diary.tw/15/1.htm

<html>
  <head>
    <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
    <style>
    body {
      overflow: hidden;
    }
    </style>
  </head>
  <body>
  這是內文..
  </body>
</html>

不過, 其實也有另一種需求是反過來的, 就是使用 overflow: auto 的 div 區塊, 一般我們若是在要畫面上出現一個含有 scrollbar 的區域用來顯示一些內容時, 就很方便, 我們可以參考這樣的一個範例: http://sample.diary.tw/15/2.htm

<div style="width: 190px; height: 190px; overflow: auto; background: pink;">
內容.....
</div>

範例內藍色底的部分區塊是未下 overflow: auto; 的屬性, 所以內容若是超出的話, 就會超出, 而下方紅色底的部分區塊則是使用了 overflow: auto; 的屬性, 所以超出的內容自動會出現scrollbar, 而方便排版及呈現, 這是在處理 body 不要出現右側 scrollbar 時也一併查到的資料:
http://apptools.com/examples/scroller.php

分類
PHP 懶得分類

好用php線上教學資料

今天朋友問到一個架站的問題, 發現他的網站留言不會寫入, 他大概檢查完後, 把錯誤訊息給我看了一下, 發現可能原因是寫入檔案的問題造成的錯誤. 於是朋友就說要是會寫程式就好了, 我便幫忙找一下看有沒有教學的資料.

php我最常用的就是官網了 (www.php.net), 便把這個資料給朋友看, 他說英文閱讀吃力, 我記得官網上有多國語的功能, 於是一邊找, 也發現了好資料, 就是 php 的入門資料, 而且還是中文版本的哦, 記錄下來給大家學習參考用囉: http://docs.php.net/manual/tw/getting-started.php

由於 php + mysql 真的有很多好用的架站軟體, 免費套件, 基於這些理由, 若有心想學好程式的人, 真的可以好好學學呢, 這篇資料給大家參考!

分類
程式技術

silverlight大放送-hosting 10GB大空間

真的太棒的消息了. 微軟 live.com 線上服務提供免費的 Silverlight Streaming Hosting 服務.

這項服務不只有 hosting Silverlight 的 Application, 更進一步 hosting WMV 檔案(其實是 for silverlight 的媒體檔). 這個服務這樣免費的方式居然還提供了 10GB 的空間, 真的還蠻驚人的. (去年是 5GB)

我們來分析看看微軟的這項免費服務. 其實 Silverlight 已經出來了一年半了, 不過實際上使用的還真的不是很多, 案例能找到的相當有限, 微軟當時是有一個集結 Silverlight 應用的網站, 在其內的 showcases 收集了相當多的應用實例, 不過到目前為止, 也只有 326 個網站. 其實說少不少, 不過對微軟來說, 我覺得真的沒有達到預期的使用量及效果.

不過 Silverlight 真的是外行看熱鬧, 內行看門道, 大家的重心是放在和 Adobe Flash (或 Flex, AIR)的一個競爭產品, 但微軟才不將這個放在眼裡呢! 微軟的下一代重要 GUI 的基礎 WPF是非常重要的一個里程碑, 而在 WEB 上應用的 silverlight 是一個精簡的 WPF, 或是說 WPF 的子集, 而且到了 silverlight 2.0的版本, 更是強大, 已經是俱備了 .NET 的精簡 runtime, 地位不說也知道相當的重要. 對微軟來說, 是一個一定要攻下的山頭. 所以在推廣上, 一定是要用盡所有力氣來推廣. 無奈目前大多數的 web server 或 hosting 公司, 大多不支接支援 silverlight 1 的 xaml 或是 silverlight 2 的 xap, 導致在推廣上有蠻大的困難. 再加上 silverlight 的 “重影音” 特性, 也導致頻寬使用量極高, 在這些多重原因下, 微軟 silverlight streaming hosting 這項免費的服務就有他的必要性了.

有了這項免費的 silverlight streaming hosting 服務後, 相信對於推廣 silverlight 應該是更有利, 因為有了免費的空間, 免費的 server, 免費的流量, 看起來, asp.net 的 developer 不用這麼利多的服務還真是對不起自己咧.

接下來應該要上傳自己的 application 或是 video 來大顯身手一番囉. 若找不到品質好的影片, 可以到這裡下載: WMV HD Content Showcase

傳上了 Vista 內的範例影片的效果 (480p), 請參考範例: link

相關閱讀:
http://blog.anchi.tw/2008/06/windows-live-silverlight-stream-host.html
有感于微软SilverLight的推广

一個很不錯的 silverlight 案例:
SingTel Race 2008 : SingTel Grid Girls Heart Race

[2008/8/31 21:19]
Silverlight的狂潮已來… 該是著手好好學習及研究的時候了. 另外, Flash 還沒上手的 Developer, M$ 提供了另一個立足點平等的時間, 快點來學習這個很讚的好物囉….
微軟MSDN Silverlight開發工具及技術文件
Silverlight 中文維基
Microsoft Silverlight – Wikipedia
狂想成真時,談Silverlight 2.0
WPF, Silverlight 與 Silverlight Streaming

分類
.net

撰寫big5的asp.net程式

由於預設的 asp.net 程式開發是使用 utf-8 的編碼, 所以若是要開發 big5 的 asp.net 程式, 需要做一些調整.

可以參考這篇有關 globalization 項目設定的網頁: http://msdn.microsoft.com/zh-tw/library/hy4kkhe0(VS.80).aspx

其實很單純的將 web.config 中的 system.web 內的 globalization 的屬性: requestEncoding 及 responseEncoding 做些調整即可. 由於預設的是:

<globalization requestEncoding="utf-8" 
               responseEncoding="utf-8" 
               fileEncoding="" 
               culture="" 
               uiCulture="" 
               enableClientBasedCulture="false" 
               responseHeaderEncoding="utf-8" 
               resourceProviderFactoryType="" 
               enableBestFitResponseEncoding="false" />

所以會是 utf-8 的編碼, 若是要開發 big5 的 asp.net 程式, 僅需要做這裡的調整即可. 程式碼本身並不需要更動, 就可以依照這個 web.config 做指定輸出了. 若是字元是 utf-8 的, 但指定用 big5 輸出時, 仍然會有 ?? 這種狀況發生, 也是要注意的地方, 不過一般的狀況下(字元相容的字)是沒有問題的.

但是頁面上的 meta tag 則必須 user 自行手動修改, 或利用小程式輔助來進行調整,

<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />

因為 web.config 是在 http header 就已經輸出指定的 encoding 囉, 而不是透過 meta tag 的 charset 指示的! 以下是 firefox 配合 Live HTTP headers 的 extension 抓出來的內容:

http://localhost:50201/WebSite2/Default.aspx

 

GET /WebSite2/Default.aspx HTTP/1.1
Host: localhost:50201
User-Agent: Mozilla/5.0 (Windows; U; Windows NT 6.0; zh-TW; rv:1.8.1.16) Gecko/20080702 Firefox/2.0.0.16
Accept: text/xml,application/xml,application/xhtml+xml,text/html;q=0.9,text/plain;q=0.8,image/png,*/*;q=0.5
Accept-Language: zh-tw,en-us;q=0.7,en;q=0.3
Accept-Encoding: gzip,deflate
Accept-Charset: Big5,utf-8;q=0.7,*;q=0.7
Keep-Alive: 300
Connection: keep-alive

HTTP/1.x 200 OK
Server: ASP.NET Development Server/8.0.0.0
Date: Tue, 22 Jul 2008 09:42:40 GMT
X-AspNet-Version: 2.0.50727
Cache-Control: private
Content-Type: text/html; charset=utf-8
Content-Length: 537
Connection: Close
———————————————————-

給大家參考看看囉!

分類
Database

當identity到達該欄位上限時…

今天在整理資料庫時, 發現有個 table 的 identity 欄位, 即將到達上限囉. 於是便來著手研究一下會發生什麼問題.

LAB 狀況 Microsoft SQL Server 2005, 某 table 的 identity 欄位為 tinyint, 並進行 insert 測試.

狀況 1, tinyint 為 (0~255), 若於資料已屆 255 時, 再 insert 資料會發生下面錯誤 (exception):

“轉換 IDENTITY 到資料類型 tinyint 時發生算術溢位錯誤。
發生算術溢位。”

狀況 2, 先將前面 < 100 的資料刪除, 再利用 dbcc checkident(‘table_name’, RESEED, 20) 指令執行後, 重置 identity 值 (下一筆會由 21 開始), 再進行 insert, 則可以正常 insert (dbcc checkindent 資料可以看這篇文章: SQL Server的Identity欄位使用/複製/重設 )

狀況 3, 繼續再進行 insert, 直到 99 時, 再繼續 insert 會發生 primary key violation 的錯誤.

由以上狀況可知, 一旦發生 identity 到該欄位上限時, 將會發生無法寫入資料的狀況, 而且是以算術溢位錯誤的方式發生, 一旦造成, 會有極嚴重的問題, 一定得在發生之前規劃好, 以免造成問題!