2013年12月5日 星期四

Node.js建立web service時如何動態指定port

如果我們的web service有可能要占用不同的port而又不希望每次都要改動程式,
我們可以透過外部環境變數來動態改變要占用的port!
如果要可以動態指定,不指定時又有一個預設的port呢?
下面就是這樣的範例(重點在最後一行):

var http = require('http');
http.createServer(function(req,res)
{
res.writeHead(200,{'Content-Type':'text/html'});
res.write('<h1>Node.js</h1>');
res.end('<p>Hello world</p>');
}).listen(process.env.PORT || 80);

所以當你希望他佔住8080 port時:
PORT=8080 node myweb.js
當你希望它使用預設的80 port時(不是管理員身份請記得sudo):
node myweb.js

Node.js建立web service時如何聽80 port?

以下是一個小小的Node.js web service範例:

var http = require('http');
http.createServer(function(req,res)
{
res.writeHead(200,{'Content-Type':'text/html'});
res.write('<h1>Node.js</h1>');
res.end('<p>Hello world</p>');
}).listen(80);

如果我們將他存檔成myweb.js然後執行時,會發生錯誤,但是如果我們將最後一行的
listen(80) 改成 listen(8080) 那就可以正確執行無誤了!

當然以我們的水準絕對不用考慮到是不是犯了80已經被其他web service佔住的錯!

其實只要實驗過就知道,並不是只有80 port 不行,聰明的你看到這邊是不是已經猜到只要是小於1024的port都不行呢?Exactly!只要是小於1024的系統保留port都會出問題~所以這根本就不是Node.js的問題,是我們應該要以系統管理員的身份來執行它:

sudo node myweb.js


2013年12月4日 星期三

innerHtml問題面面觀

innerHtml 是一個非常好用的DOM屬性
但是有一些情況它產生出來的問題超級可怕!!因為根本沒辦法Debug!
現在就兩個狀況敘述一下:
1.Ajax回來的資料顯示不出來:檢查是否有DIV包在外面,或是看看DIV跟Table,TR,TD之間的關係,調整一下應該就可以了。
2.Form裡面的資料innerHtml改過後變數無法submit過去目標網頁,這個超離奇的,沒改過時就可以,一改過就不行了!而且只有被改的欄位有影響,沒被改的欄位仍然正常!目前發現的是在一個table中包了超過一個form就不行!後來改成form包在table外面就解決了,不確定是不能table包在form外面還是不能一個table中包了超過一個form。反正form包在table外面確定是可以的了!

2013年7月25日 星期四

Ajax中文亂碼的解決

因為Ajax的傳輸域設使用了UTF-8編碼,所以如果被呼叫的網頁不是使用UTF-8就會發生中文錯亂的問題,解決的方法就是在被呼叫的網頁中設定送給header的編碼資訊,方法如下:

PHP: header("Content-Type:text/html;charset=BIG5");
ASP: Response.Charset("BIG5")
JSP: response.setHeader("Charset","BIG5");

2013年6月5日 星期三

2013年5月30日 星期四

淺談windows的以系統管理員身分執行

一般來說,在要執行的程式上按右鍵選擇以系統管理員身分執行!
這就像是Linux裡面的sudo ~
如果我不想每次執行都要按右鍵在選擇呢?還是比較喜歡直接點兩下執行呢?
那可以按右鍵選內容,在相容性設定下方會有一個以系統管理員身分執行的核選方塊,打勾即可,講來每次點兩下執行都會以系統管理員身分執行!
如果你興高采烈的開始對一個批次檔(bat)要進行如上所述的設定,你就會失望的發現以系統管理員身分執行的核選方塊居然變成灰色不能選了!這時候怎麼辦呢@@
一、替這個批次檔建立一個捷徑,在捷徑上按右鍵會發現下方有一個進階,點進去就可以看見一道曙光,就是我們需要的以系統管理員身分執行的核選方塊啦!
二、再建一個批次檔,裡面寫入下面指令:
runas /user:Administrator /savecred "[要執行的批次檔的完整徑名]"
值得注意的是:
1.第一次執行必須手動輸入Administrator的密碼,/savecred就是將來使用上次紀錄的認證資訊來執行的意思!不加就必須每次輸入密碼~
2.Administrator不可停用,因為這是以Administrator執行,不僅僅是以系統管理員身分執行!
3.完整徑名會寫紅色的就是強調,不要以為在相同路徑下就可以不完整ㄚ!

2013年5月9日 星期四

PHP中php_mbstring.dll遺失問題解決!!

[前提]你的php/ext底下明明就有php_mbstring.dll,如果沒有的請先去想辦法生出來!!

編輯php.ini,將:
extension=php_mbstring.dll
放在:
extension=php_exif.dll
之前即可~

如果是透過Apache的當然要重新啟動Apache囉!

為什麼?想也知道是因為php_exif.dll裡面有調用到php_mbstring.dll啊~

Appserv安裝pear簡介

我是用2.5.10測試成功,其他版本應該也大同小異吧!

1.執行C:\Appserv\php5\go-pear.bat,所有選項都用預設即可,就是一直按[Enter]

2.執行C:\Appserv\php5\PEAR_ENV.reg 註冊機碼

完成了!這麼簡單還寫幹嘛 !@#$~! 哈哈~~~

2013年5月2日 星期四

PHP連接Mysql的一個小小發現

$link = mysql_pconnect($host,$user,$password);
mysql_select_db($db_name,$link);
在PHP裡面一般我們都會利用上面兩行程式來連接資料庫,這時候如果$db_name設錯了,比方說打錯字或使用了一個完全不對的名稱,這時候後面的SQL還能正確執行嗎?

如果你認為答案是否定的,那你就跟我原來的想法是一樣的......

事實上是要看情形,因為在這一行程式執行時:

$link = mysql_pconnect($host,$user,$password);
其實已經有連到了預設資料庫,也就是$user,$password有權限存取得第一個資料庫
所以這一行程式:
mysql_select_db($db_name,$link);
的作用是改變$link對應到的資料庫,就算你指定一個錯誤的名稱,他還是有連在原來連到的預設資料庫!
所以看情形就是如果你要使用的資料庫正好是連到的預設資料庫,那你根本不會發現有錯誤!

這個問題乎不大,但是有時後果也是可以很嚴重的!!因為如果你在相同的權限下,有一個正式資料庫跟測試資料庫,他們的schema完全一樣,那麼你的測試程式要是陰錯陽差地連上的正式資料庫......

所以應該要加個防呆:
if(mysql_select_db($db_name,$link) == null)
   mysql_colse($link);
這邊順便提醒各位ㄚ,如果你不做斷開,而是只有在非null時回傳$link還是有風險存在,因為萬一你的程式裡有不指定$link的mysql_query存在時,依據PHP"貼心"的設計:預設連接中還是存在這個連接的!那麼不指定$link的mysql_query一樣會執行(無誤)~

補充一下:PHP連接MSSQL時我沒測試!但我認為應該是一樣的~

2013年3月22日 星期五

CodeIgniter 移除網址的index.php


1.打開Apache  的httpd.conf
   搜尋 LoadModule找到下面這行
   #LoadModule rewrite_module modules/mod_rewrite.so
   將前面的#字號去除後存檔
2.restart Apache

3.將CodeIgniter資料夾下的.htaccess檔用筆記本打開修改內容
RewriteEngine on
RewriteCond $1 !^(index\.php)
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)$ index.php/$1 [L,QSA]
4. 修改 \application\config\cofig.php
   搜尋 $config['index_page'] = 'index';
   去除預設值得index變成下面這樣
   $config['index_page'] = '';

原文出處:
http://rex030515495.blogspot.tw/2011/03/codeigniter-indexphp.html

2013年3月19日 星期二

Appserv開啟ldap問題解決

一、到windows資料夾中修改php.ini,將ldap的ext前面的注解拿掉即可!
二、在c:\appserv\php5資料夾中的libeay32.dll跟ssleay32.dll複蓋到c:\windows\system32中
三、重新啓動Apache....

2013年2月23日 星期六

HTML5離線功能中如何判定現在是否處於online




這邊使用的是利用離線功能中在上線狀態下applicationCache有可能發生的兩種Event:
一、有更新資料並更新完成:cached
二、無更新資料:noupdate

使用標準javascript的做法:

function online()
{
        //online狀態要做的動作寫在這裡......
}



window.applicationCache.addEventListener("cached", function(e)
{
        online();
}, false);




window.applicationCache.addEventListener("noupdate", function(e)
{
        online();
}, false);




使用jQuery的做法:

var appCache = window.applicationCache;

function online()
{
        //online狀態要做的動作寫在這裡......
}

$(appCache).bind("cached",function( event )
{
online();
});

$(appCache).bind("noupdate",function( event )
{
online();
});




HTML5離線實做

一、在網頁所在資料夾下新增一檔名為.htaccess的檔案,內容如下:

AddType text/cache-manifest .manifest

二、在網頁所在資料夾下新增一檔名為offline.manifest的檔案,內容如下:


CACHE MANIFEST
#This is a comment

CACHE:
index.html
tasklist.js
jquery-1.8.0.min.js
jquery.mobile-1.1.1.min.css
jquery.mobile-1.1.1.min.js

PS.紅色部分為要在離線時使用的檔案列表......

三、在一定會存取的HTML檔案中(例如:index.html)修改內容如下:

將:
<html>
改成:
<html manifest="offline.manifest">

如此一來就大功告成了,值得注意的是當有修改到上面紅色列表中的檔案時,要記得將瀏覽器執行“清除瀏覽資料”的動作,否則很容易會因為修改尚未即時update而誤以為是BUG!

2013年1月3日 星期四

Apache Virtual Host 設定範本


httpd.confˊ中增加如下一般的設定(第一行一定要有!!)

NameVirtualHost 61.30.232.195

<VirtualHost host.sygreen.com.tw>
    DocumentRoot "C:/AppServ/www/escan-expert"
    ServerName host.sygreen.com.tw
</VirtualHost>

<VirtualHost www.sygreen.com.tw>
    DocumentRoot "C:/AppServ/www/escan-expert/lohas"
    ServerName www.sygreen.com.tw
</VirtualHost>

<VirtualHost sales.sygreen.com.tw>
    DocumentRoot "C:/AppServ/www/escan-expert/sales"
    ServerName sales.sygreen.com.tw
</VirtualHost>

DNS中如下一般的設定

host  IN A      61.30.232.195   這個IP的名稱是host,是本尊
www    IN CNAME  host          這是第一個別名(CNAME)--分身
sales IN CNAME  host          這是第二個別名(CNAME)--分身