2015年3月20日 星期五

PHP 取得request檔頭資訊

剛好有用到就記錄下來了

<?php
$indicesServer = array('PHP_SELF',
'argv',
'argc',
'GATEWAY_INTERFACE',
'SERVER_ADDR',
'SERVER_NAME',
'SERVER_SOFTWARE',
'SERVER_PROTOCOL',
'REQUEST_METHOD',
'REQUEST_TIME',
'REQUEST_TIME_FLOAT',
'QUERY_STRING',
'DOCUMENT_ROOT',
'HTTP_ACCEPT',
'HTTP_ACCEPT_CHARSET',
'HTTP_ACCEPT_ENCODING',
'HTTP_ACCEPT_LANGUAGE',
'HTTP_CONNECTION',
'HTTP_HOST',
'HTTP_REFERER',
'HTTP_USER_AGENT',
'HTTP_CONTENT_TYPE',
'CONTENT_LENGTH',
'CONTENT_TYPE',
'HTTPS',
'REMOTE_ADDR',
'REMOTE_HOST',
'REMOTE_PORT',
'REMOTE_USER',
'REDIRECT_REMOTE_USER',
'SCRIPT_FILENAME',
'SERVER_ADMIN',
'SERVER_PORT',
'SERVER_SIGNATURE',
'PATH_TRANSLATED',
'SCRIPT_NAME',
'REQUEST_URI',
'PHP_AUTH_DIGEST',
'PHP_AUTH_USER',
'PHP_AUTH_PW',
'AUTH_TYPE',
'PATH_INFO',
'ORIG_PATH_INFO') ;

echo '<table cellpadding="10">' ;
foreach ($indicesServer as $arg) {
    if (isset($_SERVER[$arg])) {
        echo '<tr><td>'.$arg.'</td><td>' . $_SERVER[$arg] . '</td></tr>' ;
    }
    else {
        echo '<tr><td>'.$arg.'</td><td>-</td></tr>' ;
    }
}
echo '</table>' ;
?>

2015年1月12日 星期一

DNS - ISC BIND 設定檔範例備份

"BIND path"\etc\named.conf:

options {
directory "C:\Windows\System32\dns\zone";
};

key "rndc-key" {
  algorithm hmac-md5;
  secret "H42yg4KaMNqHcPSFuBRuWg==";
};

controls {

        inet 127.0.0.1 port 953 allow { localhost; } keys { "rndc-key"; };

};


zone "dstestdns.com" IN {
type master;
file "mydomain.txt";
allow-transfer { none; };
};

zone "dstestgods.com" IN {
type master;
file "gotods.txt";
allow-transfer { none; };
};

logging
{
     channel default-log {
         file "C:\Windows\System32\dns\log\BIND_default.log" versions 10 size 200m;
         severity info;
         print-time yes;
     };
     channel lamer-log {
         file"C:\Windows\System32\dns\log\BIND_lamer.log" versions 3 size 100m;
         severity info;
         print-severity yes;
         print-time yes;
         print-category yes;
     };
     channel query-log {
         file "C:\Windows\System32\dns\log\BIND_query.log" versions 10 size 1000m;
         severity info;
         print-time yes;
     };
     channel security-log {
         file"C:\Windows\System32\dns\log\BIND_security.log" versions 3 size 100m;
         severity info;
         print-severity yes;
         print-time yes;
         print-category yes;
     };
     category lame-servers { lamer-log; };
     category security { security-log;};
     category queries { query-log;};
     category default { default-log;};
};

//=======================================================

"BIND path"\zone\mydomain.txt:

$TTL    600
@    IN   SOA  dstestdns.com.   root.dstestdns.com.  (
2006102001  ; Serial  僅作為序號而已
28800       ; Refresh slave 伺服器的更新時間
14400       ; Retry   當 slave 主機更新失敗,多久再重新更新一次
720000      ; Expire  重複 retry 多久後就宣告不治....不再更新
86400 )     ; Minimum 可視為 TTL ,尤其是你沒有設定 $TTL 時

@    IN    NS    dstestdns.com.
www    IN    A    192.168.11.227   //將www.dstestdsn.com轉到192.168.11.227
dns    IN    A    192.168.11.166
@    IN    A    192.168.11.166
IN MX     10   dns
IN MX     20   dns
IN MX     30   dns
blog IN CNAME www
ftp IN CNAME www
photo IN CNAME www
mail    IN CNAME www

//=======================================================

"BIND path"\zone\gotods.txt:

$TTL    600
@    IN   SOA  dstestdns.com.   root.dstestdns.com.  (
2006102001  ; Serial  僅作為序號而已
28800       ; Refresh slave 伺服器的更新時間
14400       ; Retry   當 slave 主機更新失敗,多久再重新更新一次
720000      ; Expire  重複 retry 多久後就宣告不治....不再更新
86400 )     ; Minimum 可視為 TTL ,尤其是你沒有設定 $TTL 時

@    IN    NS    dstestdns.com.
www    IN    A    61.31.237.201   //將www.dstestdsn.com轉到61.31.237.201
dns    IN    A    192.168.11.166
@    IN    A    192.168.11.166
IN MX     10   dns
IN MX     20   dns
IN MX     30   dns
blog IN CNAME www
ftp IN CNAME www
photo IN CNAME www
mail    IN CNAME www

2014年12月1日 星期一

C 取得當前時間

#include < time.h >

char g_szDateTime[64];  //當前時間

int main()
{
    GetCurrentDateTime();
    printf(g_szDateTime);
}

//取得當前時間,最後存入char array g_szDateTime
void GetCurrentDateTime()
{
    time_t timer;
    struct tm * timeinfo;
    time(&timer);  /* get current time; same as: timer = time(NULL)  */
    timeinfo = localtime(&timer);
    sprintf(g_szDateTime, "%d-%.2d-%.2d %.2d:%.2d:%.2d", 1900 + timeinfo->tm_year, timeinfo->tm_mon + 1, timeinfo->tm_mday, timeinfo->tm_hour, timeinfo->tm_min, timeinfo->tm_sec);
}

2014年11月12日 星期三

C 標準函數庫 - time.h mktime() 時間轉秒數

轉自 http://pydoing.blogspot.tw/2010/07/c-mktime.html

time.h 的函數 mktime() 以指向結構 tm 的指標當作參數,回傳此 tm 所表示的日曆時間。

以下程式示範使用 mktime() 的結果

#include < stdio .h >
#include < time .h >
 
int main(void)
{
    time_t n;
    struct tm t1;
    t1.tm_sec = 8;
    t1.tm_min = 12;
    t1.tm_hour = 3;
    t1.tm_mday = 22;
    t1.tm_mon = 3;
    t1.tm_year = 1999-1900;
    t1.tm_wday = 1;  //可省略
    t1.tm_yday = 81;  //可省略
    t1.tm_isdst = -1;  //可省略
     
    n = mktime(&t1);
    printf("西元 1999 年 3 月 22 日 3 點 12 分 8 秒共累計了 %u 秒....\n", n);
     
    return 0;
}
 
/* 《程式語言教學誌》的範例程式
    http://pydoing.blogspot.com/
    檔名:cmktime.c
    功能:示範 time.h 中函數 mktime() 的使用
    作者:張凱慶
    時間:西元2010年6月 */

2014年10月28日 星期二

術語「參數」(Parameter) 與「引數」(Argument) 的區別


一個「參數」(Parameter) 代表一個值,您必須在呼叫程序時傳遞該參數。 程序的宣告會定義其參數。
當您定義 Function 或 Sub 程序時,會在緊接著程序名稱之後的括號中指定「參數清單」(Parameter List)。 您會針對每個參數,指定名稱、資料型別和傳遞機制 (ByVal (Visual Basic) 或 ByRef (Visual Basic))。 您也可以指定某個參數為選擇性參數, 這表示呼叫程式碼不必將值傳給該參數。
每一個參數的名稱都可做為程序內部的「區域變數」(Local Variable)。 您可以使用任何其他變數的相同方式來使用參數名稱。

引數」(Argument) 代表您在呼叫程序時會傳給程序參數的值。 呼叫程式碼會在呼叫程序時提供引數。
呼叫 Function 或 Sub 程序時,會在緊接著程序名稱之後的括號中包含「引數清單」(Argument List)。 每一個引數會對應至清單中相同位置的參數。
與參數定義不同的是,引數沒有名稱。 每個引數都是一個運算式,可包含零或多個變數、常數和常值 (Literal)。 評估運算式的資料型別,通常應該會符合為對應參數所定義的資料型別,且不論在任何情況下,都必須能將它轉換成參數型別。

簡單的說
定義時稱為「參數」(Parameter) 
ex:
void myFunction(int i){   // i 為參數
//ToDo...
}

呼叫時稱為「引數」(Argument)
ex:
int i = 10;
myFunction(i);   // i 為引數

2014年9月25日 星期四

C++ 字串切割

Arguments AnalyticArguments(int argc, _TCHAR* argv[])
{
    //初始化
    Arguments args;
    args.strAction = "";
    args.strVMName = "";
    args.strSnapshotName = "";

    if(argc >= 3)
    {
        //歷遍所有參數
        for(int i=0 ; i -1)
        {
            //取得一個參數 ex:/Action=start
            string strArgument = argv[i];
            //初始化
            int iTok = -1;
            //=========================判斷參數keyword=========================
            if((iTok = strArgument.find("/Action")) > -1)
            {
                iTok = strArgument.find("=");
                int strLength = strArgument.length();
                //判斷等號右邊是否有文字
                if(iTok > -1)
                    args.strAction = strArgument.substr(iTok+1, strLength);
            }
            else if((iTok = strArgument.find("/VMName")) > -1)
            {
                iTok = strArgument.find("=");
                int strLength = strArgument.length();
                //判斷等號右邊是否有文字
                if(iTok > -1)
                    args.strVMName = strArgument.substr(iTok+1, strLength);
            }
            else if((iTok = strArgument.find("/SnapshotName")) > -1)
            {
                iTok = strArgument.find("=");
                int strLength = strArgument.length();
                //判斷等號右邊是否有文字
                if(iTok > -1)
                    args.strSnapshotName = strArgument.substr(iTok+1, strLength);
            }
            //=================================================================
        }
    }
    return args;
}

C++ 讀文字檔

list lisVMNames;
char line[100];
fstream fin;
//讀檔
fin.open("D:\\Joyce\\TXTs\\BigFarmer.txt",ios::in);
while(fin.getline(line,sizeof(line),'\n'))
{
    //將一行文字存入list
    lisVMNames.push_back(line);
}

2014年9月22日 星期一

C# 字串切割

string[] strParameter = args[i].Split(new string[] { "=" }, StringSplitOptions.RemoveEmptyEntries);

以範例來說,以等號切割字串後,由字串陣列接收

關鍵字可用string,而不僅限於char

2014年9月9日 星期二

C# 列出目錄及子目錄之所有檔案或特定檔案

轉貼自:http://note.tc.edu.tw/446.html
C# 列出目錄及子目錄之所有檔案

用遞迴的方法,列出目錄及子目錄之所有檔案。以下的方法如果目錄或檔名太長會出錯。
using System.IO;
using System.Collections;

private void GetFiles(DirectoryInfo di, string searchPattern, ref ArrayList MyFiles)
{
     //取得檔案
    foreach (FileInfo fi in di.GetFiles(searchPattern))
    {
        MyFiles.Add(fi.FullName);
    }

    // Search in subdirctories
    foreach (DirectoryInfo d in di.GetDirectories())
    {
        GetFiles(d, searchPattern, ref MyFiles); //遞迴方法
    }
}

VisualStudio 2012 CrystalReport 無法載入crdb_adoplus.dll

轉貼來自:
http://fms-dot-net-notes.blogspot.tw/2011/09/crystalreport2010-crdbadoplusdll.html

在VS2012中使用CrystalReport 會出現一個錯誤
發生"無法載入檔案或組件’file:///C:\Program Files\SAP BusinessObject\Crystal Report for .Net Framework 4.0\Common\SAP BusinessObject Enterprise XI 4.0\win32_x86\donet1\crdb_adoplus.dll’或其相依性的其中之一系統找不到指定的檔案"
奇怪的是,裝好CrystalReport後卻沒有 donet1 這個資料匣!!
crdb_adoplus.dll 這個檔案卻是在 win32_x86 這個資料匣下...... XD

解決方式就是在 C:\Program Files\SAP BusinessObjects\Crystal Reports for .NET Framework 4.0\Common\SAP BusinessObjects Enterprise XI 4.0\win32_x86 目錄下新增一個資料匣 dotnet1
再把 crdb_adoplus.dll 複製過去

好........
執行後就會發現又出現了另一個錯誤~~
混合模式組件是針對版本 ‘v2.0.50727′ 的執行階段建置的,無法在沒有其他組態資訊的情況下載入 4.0 執行階段中。

解決方式~
如果是 Web 就開啟 web.config 如果是 WinForm 就開啟 app.conifg
找到
< startup >
    < supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.0" / >
< /startup >

並在 startup 加上 useLegacyV2RuntimeActivationPolicy="true"

< startup useLegacyV2RuntimeActivationPolicy="true" >
    < supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.0" / >
< /startup >

2014年9月4日 星期四

C++ Command Line 傳入參數方法

#include < iostream >

using namespace std;  
  
int main(int argc,char **argv){  
  
    for(int i=0;i < argc ; i++)  
        cout << "Argument " << i << " is " << argv[i] << endl;  
    return EXIT_SUCCESS;  
}  

當透過Dos模式呼叫test.exe時,如果需要傳入參數,可傳入以下指令

test.exe hello! this is a test!

結果如下:

2014年8月28日 星期四

2014年8月24日 星期日

MFC 字串切割

//========================================
//mapKey、*liAtkIP為一組IP+Port
//將port移除只保留IP
char szBuf[100];
char mapKeyIP[100];
const char *del = ":";
    
strcpy(szBuf, (LPCTSTR)*liAtkIP);
*liAtkIP = strtok( szBuf, del);
    
strcpy(mapKeyIP, (LPCTSTR)mapKey);
mapKey = strtok( szBuf, del);
//=========================================

2014年8月20日 星期三

JavaScript 兩個select透過js互相對應改變選取項目

function changeSelectIndex(selectID, changeID){
    //取得被改變的select元件
    var selectDOC = document.getElementById(selectID);

    //取得另一個要被改變的select元件
    var changeDOC = document.getElementById(changeID);

    //取得被改變的select的value (必須給index)
    var selectValue = selectDOC.value;

    //改變另一個select的選取index
    changeDOC.selectedIndex = selectValue;
}

JavaScript 使用<input>呈現與切換圖片

在html的部分宣告方式如下,將input宣告為image的型態,注意input預設滑鼠移入會變成可以點擊的手型
<input type="image" id="status1" src="images/ONbutton.jpg" value='1' onClick="ChangeImage(this.id);" />
在 onClick="ChangeImage(this.id);" 傳入的參數為自身元件的ID,然後我們可以在function中透過ID操作該元件
//透過ID找到元件,就可以變更src、value等屬性,也可以利用value判斷要執行什麼動作
function ChangeImage(id){
    var str = document.getElementById(id);
    if(str.value == 1){
        str.src = "../../images/OFFbutton.jpg";
        str.value = 2;
    }else if(str.value == 2){
        str.src = "../../images/ONbutton.jpg";
        str.value = 1;
    }
}

jQuery 基本範例

JavaScript 修改、移除td

有空再整理
HTML:
<tr>
    <td><input style="display:none" id="1_fields1" type="text" value="" size="12" /><span id="1_mySapns1">RulesName1</span></td>
    <td><input style="display:none" id="1_fields2" type="text" value="" size="10" /><span id="1_mySapns2">59.118.67.104</span></td>
    <td><input style="display:none" id="1_fields3" type="text" value="" size="10" /><span id="1_mySapns3">120.58.164.22</span></td>
    <td><input style="display:none" id="1_fields4" type="text" value="" size="10" /><span id="1_mySapns4">XP_REG, UNION SELECT, ‘;DROR</span></td>
    <td><input style="display:none" id="1_fields5" type="text" value="" size="10" /><span id="1_mySapns5">SYSTEM21, CMD.EXE</span></td>
    <td><input style="display:none" id="1_fields6" type="text" value="" size="10" /><span id="1_mySapns6">GET, POST, HEAD, COPY, POLL</span></td>
    <td><input style="display:none" id="1_fields7" type="text" value="" size="10" /><span id="1_mySapns7">Directory Traversal Exploits in URL, Directory Traversal Exploits in Query</span></td>
    <td><input style="display:none" id="1_fields8" type="text" value="" size="10" /><span id="1_mySapns8">Encoding Abuse Exploits in URL, Encoding Abuse Exploits in Query String, Encoding Abuse Exploits in Post Data</span></td>
    <td><input style="display:none" id="1_fields9" type="text" value="" size="10" /><span id="1_mySapns9">Maximum URL Length Allowed</span></td>
    <td><input style="display:none" id="1_fields10" type="text" value="" size="10" /><span id="1_mySapns10">High Bit Shellcode Protection in Post Data, High Bit Shellcode Protection in Header</span></td>
    <td style="text-align:center">
        <span id="1_ModifySpan1" style="display:block"><input type="button" value="修改" onClick="modify('1_ModifySpan', '1_fields', '1_mySapns');"></span>
        <span id="1_ModifySpan2" style="display:none"><input type="button" value="確認" onClick="modify('1_ModifySpan', '1_fields', '1_mySapns');"></span>
    </td>
    <td style="text-align:center"><input type="button" value="刪除" onClick="deleteRow(1);"></td>
</tr>
JavaScript:
<script>
var rowsTotal = 0;
function modify(id, inputsID, spansID){
    //取得btn ID
    var btn1 = document.getElementById(id + '1');
    var btn2 = document.getElementById(id + '2');


    if(btn1.style.display == 'block'){
        btn1.style.display = 'none';
        btn2.style.display = 'block';

        for(var i=1 ; i<11 ; i++){
            var spans = document.getElementById(spansID + i);
            var fields = document.getElementById(inputsID + i);
            var strInner = document.getElementById(spansID + i).innerHTML;
            spans.innerHTML = '';
            fields.value = strInner;
            fields.style.display = 'block';
        } 
    }else{
        btn1.style.display = 'block';
        btn2.style.display = 'none'; 

        for(var i=1 ; i<11 ; i++){
            var spans = document.getElementById(spansID + i);
            var fields = document.getElementById(inputsID + i);
            var strInner = fields.value;
            spans.innerHTML = strInner;
            fields.value = '';
            fields.style.display = 'none'; 
        }
    }
} //function end

function deleteRow(RowNum){
    //取得目前td數量
    var num = document.getElementById("myTable").rows.length;
    if(rowsTotal == 0)
     rowsTotal = num;
        var num2 = rowsTotal - num;
    if(RowNum - num2 == 0){
        document.getElementById("myTable").deleteRow((RowNum));
    }else{
        document.getElementById("myTable").deleteRow((RowNum - num2)); 
    }
}
</script>

CSS 位置 position: absolute 、relative、fixed

在 CSS 中的 position 屬性預設為 static 其結果如下圖:
從顯示流程中去除_1

以絕對位置 (position: absolute) 而言,故名思義,它是以父元素的邊界為絕對起點。
例如如果我們設定 top: 50px ,那麼這個元素就會在距離父元素內容區上邊界 50px 的地方呈現,如下圖:
position: absolute
補充:如果父元素的 position 不是 absolute 或 relative 時,那麼元素的位置就會再對應到父元素的上層元素;
如果其親代元素的 position 都沒有設定 absolute 或 relative 時,就以螢幕視窗最大可視範圍邊界為基準。


而以相關位置 (position: relative) 而言,其意義就是相對於原本的位置。例如我們指定 top: 50px 時,
那麼這個元素就會從原本應該呈現的位置往下移動 50px 。如下圖,紅色虛線部份就是未設定 position: relative 前,元素原該應該在的位置:
而固定位置 (position: fixed) 指的就是固定在螢幕視窗最大可視範圍上,如果不指定位置 (top, left, right, bottom) 時,那元素就會固定在原本的位置;
而指定位置後,就會以螢幕視窗最大可視範圍的邊界為絕對基準點。如果頁面內容超過螢幕視窗最大可視範圍大小時,
那麼不論我們如何捲動頁面,元素都會固定在螢幕視窗最大可視範圍上我們所指定的位置。
===========================================================================================
以下為position:fixed(不受捲軸影響的絕對位置)範例html程式碼,雖然很醜不過看得懂就好0.0
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>無標題文件</title>
<style type="text/css">
body{
    pdding: 0; 
    margin: 0;
}
#container {
    background-color: #000;
    width: 100%;
    float: left;
    height: 1600px;
    position: relative;
}
#test2 {
    background-color: #0F0;
    position:fixed;
    top: 0;
    left: 0;
    height: 750px;
    width: 25%;
}
#test1 {
    float: left;
    width: 30%;
    height: 800px;
    background-color: #CCC;
}
</style>
</head>

<body>
<div id="container">
    <div id="test1"> id "test1" 的內容放在這裡</div>
    <div id="test2"> id "test2" 的內容放在這裡</div>
</div>
</body>
</html>

CSS 子元素選擇器[>]

以下示範子元素選擇器[>]使用方法,子元素選擇器不會影響孫元素
<style type="text/css">
    //css one
    .div1 > p {
        color: #F00;
    }

    //css two
    .div2 p {
        color: #F00;
    }
</style>

<!-- css one 只會影響div1內的p(子元素),但不會影響span內的p(孫元素) -->
<div class="div1">
    <p>test</p>
    <span>
        <p>test</p>
    </span>
</div>

<!-- css two 會影響所有div2內的p -->
<div class="div2">
    <p>test</p>
    <span>
        <p>test</p>
    </span>
</div>