星期一, 4月 30, 2012
[IIS7] IIS7 執行 php專案以及phpMyAdmin
本篇記綠在IIS7上面執行php與phpMyAdmin的安裝心得。
最後可以正確在IIS7上架php的專案(可正常連接mysql),
但目前IIS7執行phpMyAdmin專案在載入mysql.dll模組會錯誤,尚無解Orz~
安裝環境:
Win7
前置工作:
Appserv安裝apache, php, phpmyadmin
如何在IIS7上執行php設定步驟
接著打開IIS管理工具
Step1:選擇 處理常式對應
Step2:接著點擊 新增模組對應
Step3:
在 要求路徑中 輸入 *.php
類型下拉 選擇 FastCgiModule
執行檔選擇 php5安裝目錄下的 php-cgi.exe
接著名稱取個 PHP for FCGI 即可
點確定,接著將剩餘的步驟都點確定即可完成設定。
Step4:
接著,請到php5安裝目錄下,把php.ini-recommended 改為 php.ini
Step5:
重新啟動www服務,即可運作PHP
最後可以正確在IIS7上架php的專案(可正常連接mysql),
但目前IIS7執行phpMyAdmin專案在載入mysql.dll模組會錯誤,尚無解Orz~
安裝環境:
Win7
前置工作:
Appserv安裝apache, php, phpmyadmin
如何在IIS7上執行php設定步驟
接著打開IIS管理工具
Step1:選擇 處理常式對應
Step2:接著點擊 新增模組對應
Step3:
在 要求路徑中 輸入 *.php
類型下拉 選擇 FastCgiModule
執行檔選擇 php5安裝目錄下的 php-cgi.exe
接著名稱取個 PHP for FCGI 即可
點確定,接著將剩餘的步驟都點確定即可完成設定。
Step4:
接著,請到php5安裝目錄下,把php.ini-recommended 改為 php.ini
Step5:
重新啟動www服務,即可運作PHP
星期日, 4月 29, 2012
[jQuery API] Html encode decode
利用jQuery簡單的完成html的編碼跟解碼
Reference:
JavaScript/jQuery HTML Encoding
function htmlEncode(value){ return $('<div/>').text(value).html(); } function htmlDecode(value){ return $('<div/>').html(value).text(); }
Reference:
JavaScript/jQuery HTML Encoding
星期三, 4月 25, 2012
[Javascript] 偵測上傳檔案的MIME Type
在前端偵測上傳檔案的MIME Type,不過不實用,因為使用者可以改副檔名來欺騙你。
var mimeType = document.getElementById("filedata").files[0].type; // e.g. image/png
星期二, 4月 24, 2012
[jQuery Plugin] 處理過長文字外掛(Truncate long string in web)
常常遇到在web上要處理文字過長的問題!!
參考了jquery text truncate寫的範例程式:
參考了jquery text truncate寫的範例程式:
/** * Visual string trimming Trimming with pixel of container * * change log: * 2012/12/06 use text function to avoid special characters let system crash * @author ken tsai 2012/04/06 */ ; (function($) { function htmlEncode(value) { try{ return $('<div/>').text(value).html(); }catch(err){ $.console("htmlEncode:" + err); return valeu; } } function htmlDecode(value) { try{ return $('<div/>').html(value).text(); }catch(err){ $.console("htmlDecode:" + err); return valeu; } } $.tirmWithPixel = {}; $.tirmWithPixelHTML = function(options){ var opts = $.extend($.fn.trimWithPixel.defaults, options); var text = opts.text; var pixelLimitWidth = opts.limitPixelLength; var tailPattern = opts.tail; var $container = $("<div/>"); var content = $container.append( $.tirmWithPixel({ text:text, limitPixelLength:pixelLimitWidth, tail:tailPattern} ).clone()).html(); return content; }; $.tirmWithPixel = function(options) { var opts = $.extend($.fn.trimWithPixel.defaults, options); var text = opts.text; var pixelLimitWidth = opts.limitPixelLength; var tailPattern = opts.tail; var $container = $("<span></span>"); //if element don't add to body //you can't get width from current element $container.text(text).appendTo("body"); // $.console("original:" + $container.text()); $container.trimWithPixel({ limitPixelLength:pixelLimitWidth, tail:tailPattern}); var $copyContainer = $container.clone(); //remove from body $container.remove(); // $.console("trim:" + $container.text()); return $container; }; $.fn.trimWithPixel = function(options) { // combine options var opts = $.extend($.fn.trimWithPixel.defaults, options); var pixelLimitWidth = opts.limitPixelLength; var tailPattern = opts.tail; var callback = opts.callback; this.each(function(i, obj) { var $strContainer = $(this);// current element var cText = $strContainer.text();// original text of container(without html encode) var oText = cText;// record original text(with html encode) //$.console("oText:" + oText); var $vistualSpan = $("<span style='white-space:nowrap;'></span>"); $vistualSpan.text(cText); //$.console("span context:" + $vistualSpan.html()); $strContainer.html($vistualSpan); //$.console("$strContainer html:" + $strContainer.html()); var spanWidth = $vistualSpan.width(); //$.console("spanWidth:" + spanWidth); // elem width is more than limit pixel length if (spanWidth > pixelLimitWidth) { var max = 0; while ((spanWidth = $vistualSpan.width()) > pixelLimitWidth) { cText = cText.substring(0, cText.length - 1); $vistualSpan.text(cText); cText = $vistualSpan.text(); //debug /* max++; if(max > 100){ $.console("[trimWithPixel] Exceed max limitation.."); return; }*/ } cText = cText + tailPattern; if (callback && typeof(callback) === "function") { callback({oText:oText,cText:cText}); }else{ $strContainer.attr("title", oText); $strContainer.text(cText);// using text fun to unescape html } } else { // not trimming //$.console("not trimming"); if (callback && typeof(callback) === "function") { callback({oText:oText,cText:cText}); }else{ $strContainer.attr("title",oText); $strContainer.text(oText);// using text fun to unescape html tag } } }); }; // default options $.fn.trimWithPixel.defaults = { limitPixelLength : 125, tail : "..." }; })(jQuery);
[SEO] Google Sitemap
Sitemap 範例
<urlset xmlns:image="http://www.sitemaps.org/schemas/sitemap-image/1.1" xmlns:video="http://www.sitemaps.org/schemas/sitemap-video/1.1" xmlns="http://www.sitemaps.org/schemas/sitemap/0.9"> <url> <loc>http://www.example.com/foo.html</loc> <image:image> <image:loc>http://example.com/image.jpg</image:loc> </image:image> <video:video> <video:content_loc>http://www.example.com/video123.flv</video:content_loc> <video:player_loc allow_embed="yes" autoplay="ap=1">http://www.example.com/videoplayer.swf?video=123</video:player_loc> <video:thumbnail_loc>http://www.example.com/thumbs/123.jpg</video:thumbnail_loc> <video:title>適合夏季的燒烤排餐</video:title> <video:description>完美排餐烹調秘訣</video:description> </video:video> </url> </urlset>Sitemap 標記定義
標記 | 是否必要 | 說明 |
| 必要 | 包含與 Sitemap 所含網址相關的所有資訊。 |
| 必要 | 包含與特定網址相關的所有資料。 |
| 必要 | 指定網址。如果是圖片與影片,請指定到達網頁 (亦稱為播放網頁或參照網頁)。此網址必須是獨一無二的。 |
| 選擇性 | 網址的最後更新日期,格式為 YYYY-MM-DDThh:mmTZD (時間值為選擇性)。 |
| 選擇性 | 用於提示網頁大概多久更新一次。有效值如下:
|
| 選擇性 | 描述網站上某個網址相對於其他網址的優先順序。優先順序範圍介於 1.0 (非常重要) 到 0.1 (完全不重要) 之間。這項設定不會影響您的網站在 Google 搜尋結果的排名,因為這個值是相對性的,只能和您網站中的其他網頁比較,因此即使將某個網頁指定為高優先順序 (或將所有網址指定為相同的優先順序),也不會提升您的網站在搜尋結果中的排名。此外,如果您將所有網頁的優先順序設定為相同的值,則設定不會產生任何作用。 |
星期一, 4月 23, 2012
[jQuery API] $.data()
很多時候我們會將物件的屬性值繫結在元素的屬性上面(我從以前就習慣這樣lol)。
然後再透過$('selector').attr('key') 拿取,
如果你已經確定要綁定在某個元素上的話請用$.data()效能會比較好。
另外這方$.data(),也可以用在非元素上的資料存儲
要取得資料的話也蠻方便的
Reference:
$.fn.data 與 $.data效率比較
jQuery.data()
利用 jQuery 的 data 方法取數值時的陷阱
然後再透過$('selector').attr('key') 拿取,
不過這個方法會造成dom過長(
也會降低seo的內容代碼比。 ),
不過常常遇到需求變更時又要多一個屬性,感覺很不方便。
建議使用jQuery提供的$.data()方法來儲存你的資料。
jQuery.data( element, key, value )
建議使用jQuery提供的$.data()方法來儲存你的資料。
jQuery.data( element, key, value )
- element - 必要的參數,這個屬性就是我們要塞入資料的節點。
- key - 欲塞入資料的鍵值,往後取得資料使用。
- value - 欲塞入的資料,可為任何的資料型態。
jQuery.data(div, "test", { first: 16, last: "pizza!" }); $("span:first").text(jQuery.data(div, "test").first); $("span:last").text(jQuery.data(div, "test").last);
如果你已經確定要綁定在某個元素上的話請用$.data()效能會比較好。
另外這方$.data(),也可以用在非元素上的資料存儲
var usersList = {};//store user list with key/value $.data(usersList,user.userName,user);//user is json object
要取得資料的話也蠻方便的
var userData = $.data(usersList,userName);//userName is key var userRowindex = userData.rowIndex;//某一個屬性值
Reference:
$.fn.data 與 $.data效率比較
jQuery.data()
利用 jQuery 的 data 方法取數值時的陷阱
星期日, 4月 22, 2012
[Window7] Create symboic link in Window7
如何在Window7建立Symbolic link,參考至How to create symbolic link in windows 7
C:\Windows\system32>mklink Creates a symbolic link. MKLINK [[/D] | [/H] | [/J]] Link Target /D Creates a directory symbolic link. Default is a file symbolic link. /H Creates a hard link instead of a symbolic link. /J Creates a Directory Junction. Link specifies the new symbolic link name. Target specifies the path (relative or absolute) that the new link refers to.
Example:
To create a symbolic link named MyDocs from the root directory to the \Users\User1\Documents directory, type:
mklink /D \MyDocs \Users\User1\Documents
[RoR] RoR 初探
最近開發接觸的語言,擷錄Ruby on Rails 實戰聖經心得 XD
Ruby on rails(ROR)
Rails的哲學包括以下指導原則:
- 不要重複自己(DRY: Don’t Repeat Yourself) – 撰寫出重複的程式碼是件壞事
- 慣例勝於設計(Convention Over Configuration) – Rails會預設各種好的設定跟慣例,而不是要求你設定每一個細節到設定檔中。
- REST是網站應用程式的最佳模式 – 使用Resources和標準的HTTP verbs(動詞)來組織你的應用程式是最快的方式(我們會在路徑一章詳細介紹這個強大的設計)
Rails是採用Ruby開發的網頁框架,David Heinemeier Hanson(DHH)在2004年發明,具有以下功能:
- MVC(Model-View-Control)模式
- 支援單元測試和整合測試
- 支援Ajax和RESTful介面
- ORM機制
- 支援各種最新的業界標準像是HTML5、JQuery
星期六, 4月 21, 2012
[Java] TOMCAT 啟動執行 Serverlet
- Initialize your class in servlet's
init()
method. You may add
attribute to make sure your servlet is created at application startup and not on first access. - Add
ServletContextListener
and usecontextInitialized()
callback method. UseServletContext#setAttribute
to store created object for future use.
星期五, 4月 20, 2012
星期四, 4月 19, 2012
[jQuery API] ScrollTop 回傳值為0
遇到一個需求需要將body一開始先設style為display:none;
之後再適當時機的時候再將此屬性移除~
結果會導致IE8再擷取ScorllTop時回傳的值都為0,
原以為是ScorllTop api不支援IE8的問題,但結果是因為加了display:none;
在這篇討論中有人提到:http://api.jquery.com/scrollTop/
Warning: .scrollTop() will return 0 (and setting it to anything won't work) if the element, or a parent element, is set to "display:none;". I had to apply my .scrollTop() logic after the element was shown.
[jQuery plugin] element center
控制元素置中的center plugin,常用在跳出式的視窗,
如果遇到parent元素,設定style="display:none;"。
可能會造成置中不正常,可參考這篇:[jQuery API] ScrollTop 回傳值為0
如果遇到parent元素,設定style="display:none;"。
可能會造成置中不正常,可參考這篇:[jQuery API] ScrollTop 回傳值為0
星期二, 4月 17, 2012
IIS 主機標頭
要在IIS上分別不同的網站其實很簡單
有分3種
1. 用IP區分
2. 用PORT區分
3. 用主機標頭區分
這次介紹的是第三種, 用主機標頭區分
用主機標頭區分的方式需要跟DNS做配合
方法如下:
1. 進IIS主機, 在IIS上的"網站"按右鍵-->新增網站(EX.Web01)
2. 在此網站按右鍵-->內容-->網站-->進階-->編輯, 在主機標頭值那邊, 填上客戶要的網站名稱(EX.testa.com)
3. 重複1, 2步驟, 建另一個新的網站(Web02), 主機標頭值填上testb.com
4. 進DNS, 增加 testa.com, testb.com 兩個正項對應區域
5. 在testa.com上按右鍵-->新增主機-->增加一筆IP為IIS主機IP的資料, 名稱不用打(不用打代表使用父系網域名稱, 也就是testa.com)
6. 在testb.com上按右鍵-->新增主機-->增加一筆IP為IIS主機IP的資料, 名稱不用打(不用打代表使用父系網域名稱, 也就是testb.com)
設好之後, 進IIS按下"瀏覽", 就可以正常瀏覽之
(在本機也可以直接打網站名(ex.www.testa.com)去找到站台資料)
補充:
1. 用此法設定的網站, 要將client的dns指向同一台的dns, 閘道也要相同才能連到.
2. 網站使用SSL安全連線時, 就不能使用主機標頭值
有分3種
1. 用IP區分
2. 用PORT區分
3. 用主機標頭區分
這次介紹的是第三種, 用主機標頭區分
用主機標頭區分的方式需要跟DNS做配合
方法如下:
1. 進IIS主機, 在IIS上的"網站"按右鍵-->新增網站(EX.Web01)
2. 在此網站按右鍵-->內容-->網站-->進階-->編輯, 在主機標頭值那邊, 填上客戶要的網站名稱(EX.testa.com)
3. 重複1, 2步驟, 建另一個新的網站(Web02), 主機標頭值填上testb.com
4. 進DNS, 增加 testa.com, testb.com 兩個正項對應區域
5. 在testa.com上按右鍵-->新增主機-->增加一筆IP為IIS主機IP的資料, 名稱不用打(不用打代表使用父系網域名稱, 也就是testa.com)
6. 在testb.com上按右鍵-->新增主機-->增加一筆IP為IIS主機IP的資料, 名稱不用打(不用打代表使用父系網域名稱, 也就是testb.com)
設好之後, 進IIS按下"瀏覽", 就可以正常瀏覽之
(在本機也可以直接打網站名(ex.www.testa.com)去找到站台資料)
補充:
1. 用此法設定的網站, 要將client的dns指向同一台的dns, 閘道也要相同才能連到.
2. 網站使用SSL安全連線時, 就不能使用主機標頭值
星期三, 4月 11, 2012
[IIS 7] 500.21-無法辨識的模組
今天發生如主題所示的 500.21-無法辨識的模組的錯誤,
第一時間一定就請教G大神了,原來只是單純SERVER上未安裝.NETFramework 4.0。
另外這篇: 500.21-無法辨識的模組 的作者也發生同樣的問題。
主要是用命令提示字元來重新註冊就可以解決了。
路徑如下:
%windir%\Microsoft.NET\Framework\v4.0.21006\aspnet_regiis.exe -i
如果你想要自已寫批次檔來修正錯誤的話可以參考這篇
[Asp.Net] 重新註冊IIS .NET Framework
提供給同樣問題的朋友參考!!
第一時間一定就請教G大神了,原來只是單純SERVER上未安裝.NETFramework 4.0。
另外這篇: 500.21-無法辨識的模組 的作者也發生同樣的問題。
主要是用命令提示字元來重新註冊就可以解決了。
路徑如下:
%windir%\Microsoft.NET\Framework\v4.0.21006\aspnet_regiis.exe -i
如果你想要自已寫批次檔來修正錯誤的話可以參考這篇
[Asp.Net] 重新註冊IIS .NET Framework
提供給同樣問題的朋友參考!!
[IIS 7] 解決 HTTP 404.2-Not found ISAPI和CGI限制方法
在將網站從IIS6移到IIS7後,
雖然已經重新安裝新的IIRF的模組
[IIS 7] IIS7 安裝 IIRF(Ionic's ISAPI Rewrite Filter),
不過還是造成了HTTP 404.2-Not found的錯誤訊息(本機看的時候)。
主要是ISAPI和CGI的限制內的.net 4.0模組未設置允許!!
重新設定為允許就可以正常Rewrite了。
Reference:
http://www.qiandabao.com/wdgz/938.html
雖然已經重新安裝新的IIRF的模組
[IIS 7] IIS7 安裝 IIRF(Ionic's ISAPI Rewrite Filter),
不過還是造成了HTTP 404.2-Not found的錯誤訊息(本機看的時候)。
主要是ISAPI和CGI的限制內的.net 4.0模組未設置允許!!
重新設定為允許就可以正常Rewrite了。
Reference:
http://www.qiandabao.com/wdgz/938.html
[Javascript] 偵測是否為iphone/ipod/ipad瀏覽器
簡單的用Regex來判斷是否為iphone/ipad/ipod的瀏覽器!!
//偵測是否為ipad if(/iPad/i.test(navigator.userAgent) { // dosomething } //如果所有的裝置要一起改變可以這樣用 if (/(iPhone|iPad|iPod)/i.test(navigator.userAgent)) { // dosomething };
星期二, 4月 10, 2012
[IIS 7] IIS7 安裝 IIRF(Ionic's ISAPI Rewrite Filter)
如果你的asp.net的舊網站從IIS6升級至IIS7時,
如果你有用到IIRF模組,可參考這篇文章。
Installing IIRF on IIS7
不過現在已經提供方便的.msi檔了,可以無痛設定XD
下載IIRF 這裡
如果你有用到IIRF模組,可參考這篇文章。
Installing IIRF on IIS7
不過現在已經提供方便的.msi檔了,可以無痛設定XD
下載IIRF 這裡
[IIS 7] 總該面對IIS 7了吧!!
一直都懶得來摸IIS 7,都出來這麼久了,也是該面對的時候了lol
今天在試的過程中找到的一些學習資源。記綠在此方便以後參考。
IIS 7 基礎觀念:網站、應用程式、與虛擬目錄
【潛盾機】列出IIS上所有ASP.NET網站應用程式
M$ IIS7 邊做邊學系列
如何部署 Asp.Net 4.0 應用程式於 IIS 7 x64 WSS 3.0 下
今天在試的過程中找到的一些學習資源。記綠在此方便以後參考。
IIS 7 基礎觀念:網站、應用程式、與虛擬目錄
【潛盾機】列出IIS上所有ASP.NET網站應用程式
M$ IIS7 邊做邊學系列
如何部署 Asp.Net 4.0 應用程式於 IIS 7 x64 WSS 3.0 下
星期四, 4月 05, 2012
[Javascript 茶包筆記] 變更JSON物件的屬性
//add a new property to JSON object
object["property"] = value;or
object.property = value;
星期一, 4月 02, 2012
[Javascript] 取得完整路徑的檔名
今天在測試input box的檔案路徑時,
發現不同瀏覽器的取出的值不太一致,Chrome的是完整路徑,FF跟IE都是檔名。
要取得檔案的話可以使用以下的javascript範例,
取自 "Javascript - How to extract filename from a file input control"
發現不同瀏覽器的取出的值不太一致,Chrome的是完整路徑,FF跟IE都是檔名。
要取得檔案的話可以使用以下的javascript範例,
取自 "Javascript - How to extract filename from a file input control"
To split the string ({filepath}/{filename}) and get the file name you could use something like this:
str.split(/(\\|\/)/g).pop()
"The pop method removes the last element from an array and returns that value to the caller." MOZILLA DEVELOPER NETWORK
Example:
from:
"/home/user/file.txt".split(/(\\|\/)/g).pop()
you get:
"file.txt"
[AJAX] 解決AJAX呼叫後的上下頁按鈕問題
使用AJAX來存取資料後,常常會遇到上下頁沒有辦法記錄歷程。
以下是建議解決這個議題的各種套件。
以下是建議解決這個議題的各種套件。
- Asual: http://www.asual.com/jquery/address/
- AJAX SEO Demo http://lab.laukstein.com/ajax-seo/
- Events http://www.asual.com/jquery/address/samples/events/#contact
- API http://www.asual.com/jquery/address/samples/api/#
- jQuery BBQ: http://benalman.com/projects/jquery-bbq-plugin/
- History: http://plugins.jquery.com/project/history
- jQuery hashchange: http://benalman.com/projects/jquery-hashchange-plugin/
- ReallySimpleHistory: http://code.google.com/p/reallysimplehistory/
最後選擇Asual address套件:
範例如下:
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> <title>jQuery Address - Deep linking for the masses</title> <script src="js/jquery-1.7.js"></script> <script src="js/jquery.address-1.4.js"></script> <script> $(function(){ $.address.change(function(event) { // do something depending on the event.value property, e.g. // $('#content').load(event.value + '.xml'); console.log("address.change" + event.value); }); $('a').click(function() { //record address var link = $(this).attr('href').replace(/^#/,'');; $.address.autoUpdate(false).value(link); }); }); </script> </head> <body> <a href="#a" >a</a> <a href="#b">b</a> <a href="#c" >c</a> </body> </html>
此元件提供三種Callback Event,分別為change,externalChange,internalChange。
觀看你的使用情況,主要是externalChange可能你區別出是改變瀏覽器網址觸發的事件,非常好用,不過目前測試情況要多偵測出externalChange事件需要綁定每個link元素的click事件後加入