2011年7月26日 星期二

壓縮你的js和css

為了增快網頁的讀取速度,可考慮一些最佳化的手段,
其中一項就是讓js和css檔案的大小縮到最小.
有一些工具可以達到這個手套.但是要用command line可操作有點不方便.
有好心人把YUI的壓縮工具弄成了線上版.

線上版YUI壓縮JS及CSS工具:http://refresh-sf.com/yui/

Facebook 分享功能清楚快取的方法

Facebook的分享功能
http://www.facebook.com/sharer/sharer.php

如果再次分享同樣的網頁但內容有修改過的話,share.php會有快取.
如果要清掉快取可以使用Facebook提供的工具:
http://developers.facebook.com/tools/lint

參考連結:
http://achtung.webhop.net/allenj/?p=1218
http://milkmidi.blogspot.com/2009/12/facebook-share.html

2011年7月21日 星期四

放在 File Server 上的 Excel 檔開啟時會整個卡住的解決方法

資料來源:http://phorum.study-area.org/index.php?topic=65939.0

最近微軟的更新真的是搞死人了.之前是Powerpoint現在是Excel......

放在 File Server 上的 Excel 檔開啟時會整個卡住

發現是微軟在 6/28 發佈的安全性更新 Microsoft Office File Validation Add-in 的問題

移除方式是用開始→執行→MsiExec.exe /uninstall {90140000-2005-0000-0000-0000000FF1CE}

把這個安全性更新移除掉就可正常開啟Excel檔

2011年7月19日 星期二

網路投票活動防灌票的幾種參考作法

資料來源:http://www.sudu.cn/info/html/edu/20080325/275171.html

網上調查是快速收集信息的有效方法,但是目前部分網站的網上調查存在一個不足之處,即任何用戶根據自己的愛好可以連續反覆投票。因為所有的調查結果都是為 決策作參考,不管對一個單位還是一個部門,決策失誤都會帶來意想不到的損失,所以防止重複投票具有重要意義。本文所給出的基於 ASP(Active Server Page)的幾種方法在一定程度上可以防止連續反覆投票。

ASP對象
在ASP中 有5個對象:Request、Response、Session、 Application、Server。下面只針對本文能用到的對象屬性進行說明,其 他方面的屬性請參考相關資料。本文提供的方法的原理是:設置一個邏輯變量IsVoted,在投票之前驗證IsVoted 的值,只有值為False時,才 能投票,否則就認為已投過票。
Application對象是處理某一特定ASP應用中所有用戶共享信息的對象,也就是說 Application對象是所有聯網機器上所有網頁所共享的對象。由 Application對象所定義和設置的變量,所有用戶的所有網頁均可訪問。利 用Application對象可以定義變量以及改變變量的值,其語法格式如下: Application(「變量名」)=表達式。在.asp 文件中可通 過Application(「變量名」)加以引用。Application把變量的值保存在Web Server 端。

Session 對象用於單個用戶管理信息,Session變量只在頁面間調用(即在一個Session內)。Session變量是私有的,一個Session中某個變量 值的改變不影響另一個Session中同名變量的值。Session對象也把變量值保存在服務器端,但是各個Session保存的位置不同。因為 Session是私有的,所以有多少個Session對象就存在多少個IsVoted變量,這些變量之間沒有關係。

Cookies 對象是不能單獨存在的,它依附於Request和 Response對象,在使用時必須在Cookies前加上Request或Response。同 Application和Session 一樣,Cookies也能保存變量的值,但是Cookies只在瀏覽器客戶端保存變量的值。用 Cookies 所定義的變量有一個屬性:可以設置Cookies變量的使用期限,而且一旦設置了使用期限, Cookies變量可以被從同一台機器上登 錄的所有用戶所共享,我們可以利用Cookies的這個屬性設置間隔一定時間才能再次投票。

Server對象主要完成一些需要WWW服務器處理的工作,本文中我們主要利用Request.ServerVariables讀取Server的環境變量中客戶端的IP地址,並根據IP地址來設定相隔多長時間同一IP地址才能再次投票。

Global.asa 文件完成共享變量和文件的定義及初始化任務。Global.asa文件必須位於ASP應用的根目錄下,一個ASP應用只能有一個Global.asa文 件。Global.asa中含有Application_OnStart、Application_OnEnd、 Session_OnStart、 Session_OnEnd四個事件,我們在Application_OnStart、 Session_OnStart事件中定義 Application變量和Session變量以及進行初始化,這樣在以後的網頁中就可以讀取這些變 量。 ASP在下列情況下讀取Global.asa內容:

1.在Web Server啟動之後,第一次請求調用ASP應用中的任何.asp文件時;

2.不在Session狀態的用戶請求調用ASP應用的.asp文件。

方法一:利用Session對象
在 Global.asa的Session_OnStart事件中設置邏輯變量 IsVoted,初始值為FALSE(表示還沒有投票),投票之後在.asp 程序中把IsVoted的值改為TRUE(表示已投過票)。每次投票之前都要判斷IsVoted的值。如果IsVoted的值為TRUE,就不能再投票; 如果值為FALSE,則可以投票。
因為Session對象的使用必須與瀏覽器的Cookies功能相配合,所以在判斷IsVoted值之前, 必須先判斷瀏覽器的Cookies功能是否打開。如處於關閉狀態,則此種方法失效,所以在這種情況下必須給出提示信息並用Response.End命令中 斷.asp程序的執行,防止連續反覆投票。其流程如圖1:

其中判斷Cookies是否打開的函數比較複雜,現給出函數實現代碼(VBScript)。

< %
Function IsCookiesOpen()
Dim ClientIP, URL, QueryString, IsNew

Application.Lock
If Session(「SessionID")=Session.SessionID Then
IsCookiesOpen = True
ClearApp
Exit Function
End If

IsNew = False
If Session(「SessionID") = Empty Then
CurrentIP =Request.ServerVariables
(「REMOTE_ADDR")
If CurrentIP <> Application(「IP") Then
ClearApp
IsNew = True
End If
End If
If Not IsNew And Application(「Visit") >= 1 Then
IsCookiesOpen = False
ClearApp
Exit Function
End If
Application(「Visit") = Application(「Visit") + 1
Application(「IP") =Request.ServerVariables
(「REMOTE_ADDR")
Session(「SessionID") = Session.SessionID

URL =「_page_=」&Request.ServerVariables
(「PATH_INFO")
QueryString=Request.ServerVariables
(「QUERY_STRING")
If Len(QueryString) > 0 Then URL = URL & 「&" & QueryString
If Not Response.IsClientConnected Then ClearApp
End Function

Sub ClearApp()
Application(「Visit") = 0
Application(「IP") = 「"
End Sub
% >

在.asp文件中直接用IsCookiesOpen()函數來判定 Cookies是否打開。

此種方法的漏洞:如果再打開一個新瀏覽器窗口,會發現在新打開的瀏覽器窗口中仍然可以投票。這是因為Session是私有的,一個Session中變量的改變並不影響另一個Session的同名變量的值。為瞭解決這個問題,下面給出方法二。
方法二:利用Cookies對象
因 為Cookies對象把變量的值保存在瀏覽器客戶端,所以可以根據Cookies保存的IsVoted的值來判斷用戶是否投過票。Cookies變量和 Session變量一樣是私有的,但是如果我們定義了Cookies變量的生存期限,則Cookies變量是公有的,凡是從同一台機器上登錄的用戶在規定 的時間期限沒有達到時,都無法投票,這在一定程度上也能防止反覆投票。實現程序流程如圖2:

根據實際情況合理地設置Cookies變量的生存期限的長短,例如設定為10分鐘,這樣一台機器即使連續投票最多一天也只能投144張票。

此種方法的漏洞:在Windows Arrayx環境下,只要把 WindowsCookies目錄下所有*.txt文件刪除,又可重複投票。為了再進一步防止反覆投票,下面給出方法三。

方法三:驗證IP地址與登錄時間
此 方法首先利用 Request.ServerVariables(REMOTE_ADDR)取得用戶的IP地址。在Web Server端建立一個標準的 MDB類型的數據庫,此數據庫有一個表,該表只有兩個字段:IP地址和登錄時間。之所以設置登錄時間這個字段,是考慮到撥號上網用戶可能共用同一個IP地 址,如果一個IP 地址只能投一次票,那麼顯然不合理。同時,我們還採用方法二同樣的思想,必須每隔一個設定的時間段,同一個IP地址才能再次投票。所以 這種方法比方法一、方法二在防止反覆投票方面要嚴格得多。其實現的程序流程如圖3:

方法四:小範圍調查
這種方法只適用於小範圍調查,思想與方法三相 同,只是把方法三中的 IP地址換成可以唯一代表用戶的字段,如學生證號、工作證號等。這時建立的MDB數據庫只包括兩個字段:證件號碼與 IsVoted(其中IsVoted是邏輯型字段, TRUE表示已投過票,FALSE表示還未投票,在建庫時所有記錄的IsVoted的值都設 為 FALSE)。在投票之前,要求先輸入正確的證件號碼,然後再判斷IsVoted的值。實現這種方法的程序流程如圖4:

從方法一到方法四,安全性越來越高,防止重複連續投票功能越來越強,但是各種方法都有各自的侷限性。在應用中,用戶應 根據實際情況選擇合適的方法。如果小範圍投票,方法四無疑是最好的;如果在Internet上投票,方法三是最好的。另外一點必須提及的是:雖然 Application有保存變量的功能,但是我們沒有用到。因為 Application變量是一個全局性變量,如果用Application把 IsVoted設為TRUE,則任何用戶都無法投票;如果用Application把IsVoted設為FALSE,則任何用戶都可以投票,就沒有任何防 範功能了.

Request.ServerVariables("HTTP_REFERER")有的沒的

資料來源:http://www.itlearner.com/article/2837


下列情況是從瀏覽器的地址欄正常取得Request.ServerVariables("HTTP_REFERER")的:
1.直接用<a href>
2.用Submit或<input type=image>提交的表單(POST or GET)
3.使用Jscript提交的表單(POST or GET)

Request.ServerVariables("HTTP_REFERER")不能正常取值的情況:
1.從收藏夾鏈接
2.單擊'主頁'或者自定義的地址
3.利用Jscript的location.href or location.replace()
4.在瀏覽器直接輸入地址
5.<%Response.Redirect%>
6.<%Response.AddHeader%>或<meta http-equiv=refresh>轉向
7.用XML加載地址

顯然,Request.ServerVariables("HTTP_REFERER")在多數情況下是不能正常工作的,下面我們看一個例子:
ref.asp
<%
response.write "You came from: " & request.servervariables("http_referer")
%>
ref.htm
<%
Response.AddHeader "Refresh", "10;URL=ref.asp"
%> 
<meta http-equiv='refresh' content='10;URL=ref.asp'> 
<form method=GET action=ref.asp name=getform> 
<input type=submit value=' Go there (GET) >> '> 
<input type=image style='cursor:hand'> 
</form><p> 
看看上面的代碼會得到什麼的結果.
<form method=POST action=ref.asp name=postform> 
<input type=submit value=' Go there (POST) >> '> 
<input type=image style='cursor:hand'> 
</form><p> 
<a href='ref.asp'>直接鏈接<p> 
<a href='#' onclick='window.location.href="ref.asp";return false;'>javascript location</a> 
<a href='#'onclick='window.location.replace("ref.asp");return false;'>javascript replace</a> 
<a href='#' onclick='document.getform.submit();return false;'>javascript GET</a> 
<a href='#' onclick='document.postform.submit();return false;'>javascript POST </a>

2011年7月15日 星期五

利用 SQL 找出欄位值重覆的記錄

資料來源:http://killworm737.pixnet.net/blog/post/21934570

2011年7月12日 星期二

利用 Google Analytics API 抓取資料

資料來源:
1.http://tech.ed65.com/2010/12/02/%E5%88%A9%E7%94%A8-google-analytics-api-%E6%8A%93%E5%8F%96%E8%B3%87%E6%96%99-php/
2.http://www.askaboutphp.com/63/google-analytics-api-class-for-php.html

利用 Google Analytics API 抓取資料-PHP


<?php
// include the Google Analytics PHP class
include "googleanalytics.class.php";
try {
// create an instance of the GoogleAnalytics class using your own Google {email} and {password}
$ga = new GoogleAnalytics('email','密碼');

// set Google Analytics ID - 格式為 'ga:123456';
$ga->setProfile('google analytics ID');

// set the date range we want for the report - format is YYYY-MM-DD
$ga->setDateRange('2010-11-29','2010-12-01');

// get the report for date and country filtered by Australia, showing pageviews and visits
$report = $ga->getReport(
array('dimensions'=>urlencode('ga:date,ga:country'),
'metrics'=>urlencode('ga:pageviews,ga:visits'),
'filters'=>urlencode('ga:country=@Taiwan'),
'sort'=>'-ga:pageviews'
)
);

//print out the $report array
print_r($report);

} catch (Exception $e) {
print '錯誤: ' . $e->getMessage();
}
?>
其中 Google Analytics ID 為網址中xxxxx的部份 >>
https://www.google.com/analytics/reporting/?reset=1&id=xxxxx&pdr=20101101-20101201
請於此下載需要呼叫的檔案: googleanalytics.class

SQL隨機查詢的方法

資料來源:http://www.flatws.cn/article/program/mysql/2010-08-23/8791.html


SQL Server:
Select TOP N * From TABLE Order By NewID()  
view plaincopy to clipboardprint?
Select TOP N * From TABLE Order By NewID()
Select TOP N * From TABLE Order By NewID()
NewID()函数将创建一个 uniqueidentifier 类型的唯一值。上面的语句实现效果是从Table中随机读取N条记录。
Access:
Select TOP N * From TABLE Order By Rnd(ID)   
view plaincopy to clipboardprint?
Select TOP N * From TABLE Order By Rnd(ID) 
Select TOP N * From TABLE Order By Rnd(ID)
Rnd(ID) 其中的ID是自动编号字段,可以利用其他任何数值来完成,比如用姓名字段(UserName)
Select TOP N * From TABLE Order BY Rnd(Len(UserName))  
view plaincopy to clipboardprint?
Select TOP N * From TABLE Order BY Rnd(Len(UserName))
Select TOP N * From TABLE Order BY Rnd(Len(UserName))
MySql:
Select * From TABLE Order By Rand() Limit 10  
view plaincopy to clipboardprint?
Select * From TABLE Order By Rand() Limit 10
Select * From TABLE Order By Rand() Limit 10

postgreSQL:
select * from glxt022 order by random() limit 5  
view plaincopy to clipboardprint?
select * from glxt022 order by random() limit 5

Javascript開新視窗的函數

function wshow(a_Url){
  var sUrl = a_Url;
  var sTitle = "Cupon"; // 視窗標題
  var sToolbar = "no"; //
  var sLocation = "no"; //位置列
  var sDirectories = "no"; //目錄
  var sStatus = "no"; // 狀態列
  var sMenubar = "no";
  var sScrollbars = "no";
  var sResizable = "no";
  var sWidth = "410";
  var sHeight = "240";
  var sParams = "toolbar=" + sToolbar + ",directories=" + sDirectories + ",status=" + sStatus + ",menubar=" + sMenubar + ",scrollbars=" + sScrollbars + ",resizable=" + sResizable + ",width=" + sWidth + ",height=" + sHeight;
  //alert(sParams);
  //
  window.open(sUrl,sTitle,sParams);
 }