2013年4月2日 星期二

XSD 簡介, a XML Schema (一)

###  This article is reference to : w3schools.com  ###


XML schema 是用來描述XML的內容

目前有兩種方式來描述XML的內容結構:
     1. DTDs
     2. XML schema (xsd)

XML schema 比 DTD 好,因為schema的擴充性高且支援 Data type

以下是一 XML schema (以下簡稱 xsd ) 範例:

a simple XML name: "note.xml"
<?xml version="1.0"?>
<note>
  <to>Tove</to>
  <from>Jani</from>
  <heading>Reminder</heading>
  <body>Don't forget me this weekend!</body>
</note>

這個是上面 note.xml 的 xsd 描述
<?xml version="1.0"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">

<xs:element name="note">
  <xs:complexType>
    <xs:sequence>
      <xs:element name="to" type="xs:string"/>
      <xs:element name="from" type="xs:string"/>
      <xs:element name="heading" type="xs:string"/>
      <xs:element name="body" type="xs:string"/>
    </xs:sequence>
  </xs:complexType>
</xs:element>

</xs:schema>

1. 由上可知 xsd 本身也是一個 XML, (用一個XML來描述另一個XML的結構)
2. 可以定義XML中有那些 elements
3. 定義 有哪些 attributes
4. 定義 那些 elements 是 child elements
5. 定義 child element 之間的順序關係
6. 定義 element 的內容是否 empty 或有文字(Text)內容
7. 定義 資料型態(data type)
8. 定義 element 或 attributes 的 default value 或 fixed value


下面這個 XML 內容可以 reference "note.xsd" (加入藍色的部分)
<?xml version="1.0"?>

<note
xmlns="http://www.w3schools.com"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.w3schools.com note.xsd">
  <to>Tove</to>
  <from>Jani</from>
  <heading>Reminder</heading>
  <body>Don't forget me this weekend!</body>
</note>


基本 xsd 框架如下:
<?xml version="1.0"?>

<xs:schema>
...
...
</xs:schema>


<名詞解釋>  simple element / complex element

XSD simple element: 表示這個element 的內容頂多只能是文字,不能有其他element ,不能有其他attribute。

不滿足以上條件的都是 complex element

下面這個範例就是 simple element,  其element 的內容頂多是文字
<lastname>Refsnes</lastname>
<age>36</age>
<dateborn>1970-03-27</dateborn>

下面這個範例,element 有 attribute, 所以他就是 complex type
<lastname lang="EN">Smith</lastname>

如何使用xsd 描述 simple type:
xsd 如下範例:
<xs:element name="lastname" type="xs:string"/>
<xs:element name="age" type="xs:integer"/>
<xs:element name="dateborn" type="xs:date"/>


<xs:element name="xxx" type="yyy"/>

xxx is name of element
yyy is data type of the element


xsd 有許多內建的 data type, 下面是依些常見的
  • xs:string
  • xs:decimal
  • xs:integer
  • xs:boolean
  • xs:date
  • xs:time

前面有提到 xsd 還可以定義 element 的 default value 或 fixed value
範例如下:
<xs:element name="color" type="xs:string" default="red"/>

<xs:element name="color" type="xs:string" fixed="red"/>


xsd 如何描述 attribute: 範例如下: (和描述 simple type element 很像)
<xs:attribute name="xxx" type="yyy"/>

<xs:attribute name="lang" type="xs:string" default="EN"/>

<xs:attribute name="lang" type="xs:string" fixed="EN"/>

Attribute對於element 來說,有時候是 optional,有時候是 Must
像上面的範例沒特別說明,表示 optional
若是 must
<xs:attribute name="lang" type="xs:string" use="required"/>


************************************************************

我們也可以對 element 或 attribute 的內容做規範限制 (Restrictions)

下面這個範例 我們對 "age" element 的內容作一些 restrictions
<xs:element name="age">
  <xs:simpleType>
    <xs:restriction base="xs:integer">
      <xs:minInclusive value="0"/>
      <xs:maxInclusive value="120"/>
    </xs:restriction>
  </xs:simpleType>
</xs:element>

age 的base = integer, 最小值 0, 最大值 120


待續...

2013年3月3日 星期日

HTML表單傳送中文字到 PHP + MySQL 問題

最近在學習PHP + MySQL 資料庫碰到以下問題:

用表單傳送中文字到 PHP 網頁中,再將中文字存入MySQL中。

使用phpMyAdmin去看MySQL資料表單,發現文字都無法正確的傳入

中文字的內容都是空的。若改用英文字都沒有這些問題。

初學這些東西,HTML的表單不熟,PHP也不熟,MySQL也不熟,所以這問題還真麻煩。

只好一步一步Debug.

英文字可以傳送,表示整個傳送的機制是對的,但就中文字不行,表示傳中文字時的編碼

可能有問題。這個時候就會想問幾個問題。

   1. 表單是怎麼傳送文字? 機制是如何?編碼方式?
   2. Php在Server端怎麼收到這些文字? 是否有正確收到
   3. Php怎麼把文字寫入資料庫? database 的編碼方式?

把問題列出來後,就開始Google 找答案了:

1. 表單是怎麼傳送文字?

    表單傳送有分 Post 和 Get, 可以用Get method來實驗,因為
Get 方式會將傳送資料顯示網址上,如此我們可知道表單傳了時麼東西出去。
由實驗得知,若表單文字是英文就直接送出,若是中文字會經過編碼再送出。

寫個簡單的表單如下:
<form action="test.php" method="get" >
      請輸入: 
      <input type="text" name="foodName" >
      <input type="text" name="cost" >
      <input type="submit" value ="送出" >
      
</form>

分別送出 "English" 和 "中文" ,送出後得到網址分別如下:

http://127.0.0.1/test2.php?foodName=English&cost=222

http://127.0.0.1/test2.php?foodName=%A4%A4%A4%E5&cost=222

發現上面 "中文" 被編碼成 %A4%A4%A4%E5

修改送出編碼方式如下: (改成utf-8)
<form action="test.php" method="get" accept-charset="utf-8">
      請輸入: 
      <input type="text" name="foodName" >
      <input type="text" name="cost" >
      <input type="submit" value ="送出" > 
</form>

http://127.0.0.1/test.php?foodName=%E4%B8%AD%E6%96%87&cost=222
發現上面 "中文" 被編碼成 %E4%B8%AD%E6%96%87
有明確指定編碼方式,永遠都是比較好的做法。


2. PHP 收到甚麼?

PHP 的資料型態是不需要很嚴謹的定義的,不像C語言有很嚴謹的資料型別定義。
當然這樣各種作法有好有壞拉(本人比較喜歡定義)。上面表單傳過來的東西 PHP
到底會收到甚麼?

$food = $_REQUEST['foodName'];
$cost = $_REQUEST['cost'];     
echo gettype($food) . "<br>";   // $food 讀取其資料型態
echo gettype($cost) . "<br>";   // $cost 讀取其資料型態

使用 gettype() 讀取$food 和 $cost資料型態,可知不管你傳文字還是數字,資料型態都會自動變成string.
由此可知,假設我只單純的把自echo出來,那echo出來的這個網頁所使用的編碼方式
就很重要了,那依舊是必須要能夠匹配的編碼方式才行囉!

<head>
<meta content="text/html; charset=utf-8" http-equiv="content-type">
<title></title>
</head>

所以如果送過來的是採用 UTF-8的編碼方式,這邊網頁就必須採用UTF-8的方式(如上例)
依此類推,big5...都一樣

3. Php怎麼把文字寫入資料庫? database 的編碼方式?

$food = $_REQUEST['foodName'];
$cost = $_REQUEST['cost'];  

$sqlCmd = "insert into menu 
 ( `index`, `foodName`, `cost` ) 
values 
 ( NULL, '{$food} ', {$cost} )";

上面這個PHP code 是把資料寫入資料庫中的語法,基本上沒有甚麼編碼方式的問題
只要網頁的編碼方式正確(第二點)就沒問題了。

但是資料庫的編碼方式就必須注意了。下圖採用phpMyAdmin連線進去我的編碼方式
也是採用utf8


以上這樣應該就都OK了。

我一開始會出現問題是因為
1. 我的表單傳送時並沒有指定編碼方式 (變成default)
2. 我的接收php網頁的編碼方式適用big5

所以中文字就一直有問題。但經過以上的方西調整後,目前都沒問題了。



2013年3月2日 星期六

Windows 7 遠端桌面關機 - 關閉遠端電腦

Windows 7 使用遠端桌面登入到遠端電腦,
使用完畢想要順手把遠端電腦也給關機怎麼做呢?

Solution:

Ctrl + ALT + END ( = 對遠端電腦下達 Ctrl+alt+del  )
此時螢幕右下角有個電源鈕,按下後遠端電腦就會進行關機動作,
此時遠端連線也會中斷 (廢話,都關機了...)

Solution 2:  (這個方法比較簡單)
Alt + F4
此時跳出選單,選擇關機


2013年2月28日 星期四

MySQL 基礎

MySQL 是一種資料庫伺服器(Database server),
由於Open source,所以目前相當多人在使用。

本篇將學習做個紀錄。
MySQL 的官網:  http://www.mysql.com/

主要操作的方式可以用如操作DOS的方式。
做為網站的資料庫,可以使用phpMyAdmin管理來操作MySQL
phpMyAdmin 是需要另外安裝的,也是free的軟體

phpMyAdmin 的官網:  http://www.phpmyadmin.net/home_page/index.php

以下使用phpMyAdmin 操作MySQL:

1. 登入MySQL:

    輸入下列網址,即登入本機的MySQL
    http://127.0.0.1/phpMyAdmin/
    一開始用root帳號燈入 => root / password


2. 修改登入位置限制:  打開 config.inc.php 尋找下列設定:
    $cfg['PmaAbsoluteUri'] = ' ';
    改成如下:

   $cfg['PmaAbsoluteUri'] = 'http://127.0.0.1/phpMyAdmin/';

   意思是說只有本機能夠使用phpMyAdmin。
   如此可以防止外面有人試圖登入以增加安全性。

3. 如何修改 root 密碼?
   首頁\ Privileges\Change password.
   點選最右邊的編輯,進入==>Change password.
   Host 要選Localhost的那個選項,若選127.0.0.1似乎無法變更密碼。




4. 開設新資料庫

    首頁: Create new database
 
    下圖建立了一個叫MyTest的database. 然後click Create button.



5.開設新帳號
  由於Root的權限太大,一般會開設一個帳號來管理某個資料庫。
  以免用root把資料庫給毀了

  首頁\ Privileges\Add a new User

  進入後畫面如下,填寫相關資料後建立(Go), 此例建立了一個 "John" 的 user.


6. 在資料庫中新增 Table


2013年2月27日 星期三

Windows 7 遠端桌面全螢幕退出切換

最近使用Windows 7 的遠端桌面,當遠端桌面全螢幕時,不知道該怎麼退出全螢幕。

記得以前使用Windows XP時,只要滑鼠靠近螢幕上緣就會有Tab跑出來讓你操作,

甚至可以將Tab釘住。 現在使用 Windows 7 竟然沒有這個功能了,哀!  

Solution:

所以如果要切換全螢幕設定,網路上找到的答案是,使用快速鍵( Ctrl + Alt + Break )來切換



2013年2月24日 星期日

甚麼是CSS ? (Cascading Style Sheets)

1. CSS 是甚麼?
    CSS 是一種語法規則(syntax),用來定義網頁內容呈現的樣式,效果。 
    比如說,可以定義字形的字體,位置,大小,顏色。圖片的位置,大小等等。

2. CSS 寫在哪?
    A. CSS當然是寫在HTML中的,因為他要用來描述HTML內容呈現嘛!
    B. 也可以另外單獨寫在CSS file中,HTML在引入CSS file到HTML中。
        其好處可以多個HTML共用,容易維護。

3. CSS 的由來?
    主要是W3C組織定的,要讓樣式設計獨立出來,以免HTML, XML越來越複雜
    瀏覽器 IE 5.0以後的版本大概都已經完整支援CSS語法


很不錯的CSS 教學網站:
Reference:

2013年2月22日 星期五

如何解除VC的 C4996 warning

Visual studio 6 版以後的Compler 對於一些C 函式庫做安全改良(security enhancements),

如:
strcpy()  改良成 strcpy_s()

當你使用 strcyp(), 會產生下列 warning... (很煩...)

warning C4996: 'strcpy': This function or variable may be unsafe. Consider using strcpy_s instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details.

消除的方法是:
  1.  加入define 
 
#define _CRT_SECURE_NO_WARNINGS

  若放在程式碼中,要注意放的位置,要放在所有include header之前。
 
  最簡單的方式是放置在preprocessor中( solution exploer右鍵/properies/ C/C++ / preprocessor )
  或是放在 stdafx.h中(if you have)。

2. 加入 編譯指令
 
#pragma warning( disable:4996 )
 
把上述指令放在 .C/.CPP 檔中,呼叫函示之前即可


Apendix:
微軟對於 eliminate deprecation warnings for the older, less secure functions 說明:
http://msdn.microsoft.com/zh-tw/library/8ef0s5kh.aspx

相關secure enhance function 說明:
http://msdn.microsoft.com/en-us/library/wd3wzwts(VS.80).aspx

2013年2月17日 星期日

在windows上架設php網站(php+Apache+MySQL)

本篇文章告訴你如何從無到有架設一個Windows based 的PHP網站
內容大概分兩部分

   1. 安裝PHP 網站相關軟體
   2. 寫一個簡單的PHP互動網頁

*****************************************************************************
Part 1. Install software

當然你可以分別下載php, Apache, MySQL 然後分別安裝
不過最快的做法是使用快速架站包==>AppServ (已經幫你整理好)

   官網: http://www.appservnetwork.com/
   
    AppServ 2.5.10 download: 
    http://prdownloads.sourceforge.net/appserv/appserv-win32-2.5.10.exe?download


下載後直接執行安裝檔,按照其安裝步驟安裝即可(採用其default安裝即可)。

如果你依照步驟安裝,Apache server 應該已經啟動了,
你可以打開瀏覽器測試一下: 測試下面三個網頁。

1. 網址輸入: http://127.0.0.1/
看到如下網頁: 表示 Appache 啟動成功


預設的網頁


輸入 http://127.0.0.1/phpMyAdmin

   帳號: root
   密碼: ****** (剛剛安裝時你key的密碼)

看到如下網頁:

phpMyAdmin 資料庫default page


輸入:
http://127.0.0.1/phpinfo.php
看到如下網頁:


PHP 版本資訊


看到以上三個網頁,表示基本的安裝都已經完成~


*****************************************************************************
part 2 Create your own interactive web page.


安裝後,首頁被放在 AppSeve\www\index.php
你可以隨便寫一個HTML,名子替換成 index.html (首頁)
首頁就被換成新的了




將下列語法另存到 "index.php",置換到www資料夾中


<html>
<head>
<title>Hello world</title>
</head>
<body>
<br>
<?php
echo "hello world <br>";
$a = $_REQUEST['aa'];
$b = $_REQUEST['bb'];
$a = $a + $b;
echo "The result is:{$a}<br>";
?>
<br>
<br>
</body>
</html>

上面PHP程式宣告了兩個變數 "aa" 和 "bb"
 計算 aa + bb 並將結果顯示在網頁上



用你的瀏覽器輸入下列網址:
http://127.0.0.1/index.php?aa=2&bb=3
參數放在網址後面
aa = 2
bb = 3



網頁顯示計算結果 aa + bb = 5


以上就是一個最簡單的PHP程式範例

*******************************************************
幾個好用工具:

1. Free PHP editor: PSPad
http://www.pspad.com/

2. HTML editor: kompozer
http://kompozer.net/download.php


什麼是PHP?

PHP 是:
  A. 一種 script language
  B. 放在網頁上的程式語言
  C. 嵌入在HTML中
  D. 程式放在Server端,非Client端
  E. Personal Home Page Tools (由Rasmus Lerdorf 先生提出)
  F. Open source.
  G. 通常搭配 Apache (server) + MySQL(database)
  H. 跟ASP是同一類的東西,ASP應該算是PHP的競爭對手。
       (甚麼!!不知道ASP...請自去股溝吧~)

PHP 官方網址: http://php.net/

PHP 可以做甚麼:
  A. 網路留言板,
  B. 網路聊天室
  C. 訂票系統
  D. 訂位系統
  E. 其他...(電子商務)

PHP 的工作原理:
  簡單的說,PHP是run在server端的一支程式(php解譯器),
  當Client端(上網瀏覽網頁的你)來訪問時,網站伺服器(Apache)
  會將php網頁丟給php解譯執行,php解譯器會根據進來的命令
  做出回應,通常是output一個HTML網頁出去,回丟給server(Apache)
 ,server再回應給client端,因此可產生互動網頁。
  php解譯器可以在server上做很多事,比如說到SOL資料庫中撈資料等..
  就看你程式怎麼寫。因此要做到電子商務系統都是沒問題的。

2013年2月2日 星期六

如何開始 Keil C 專案, 使用YQ518-8051實驗板

如提,紀錄如何用Keil C起始一個8051專案。

 Keil C 官網: http://www.keil.com/c51/

使用的開發版是 YQ518, 淘寶網可購買。

內容: 請按我

2013年1月31日 星期四

MFC List Control 的使用

Using  MS. VS2010
This artical will show you step by step who to make a 2x2 list view on you MFC application.
The result like following fig:

Step1. From toolbox. select "List control" icon.
 

Step2.  Modify the property of List control
  in "Properties" page, Set "view" = Report
you will see below:
Step3. Add list control variable: Right click on control.
 
Step4. Write you own code for application


// Column Name index
#define COLUMN_NAME      (0)
#define COLUMN_VALUE     (1)

// Row index
#define ITEM_NetxFlag    (0)
#define ITEM_HostFlag    (1)
#define ITEM_HostCOSFlag (2)
#define ITEM_DevCOSFlag  (3)
#define MAX_ROW_INDEX    (4)

// Row Name array
const char ROW_NAME[MAX_ROW_INDEX][16] =
{
  "NetxFlag",
  "HostFlag",
  "HostCOSFlag",
  "DevCOSFlag"
};

// Initial list table.
this->m_infoList.InsertColumn( COLUMN_NAME,  "Name",  0, 80, 50 );
this->m_infoList.InsertColumn( COLUMN_VALUE, "Value", 0, 80, 50 );

for( int i = 0; i < MAX_ROW_INDEX; i++ )
{
  this->m_infoList.InsertItem(  i, ROW_NAME[i]   );     // Set List name.
  this->m_infoList.SetItemText( i, COLUMN_VALUE, "0" );  // Set List value.
}

如何將程式碼貼在Blogger上

如何將程式碼貼在Blogger上:

範例如下:  可惜沒有Keyword顏色區別。 
void main()
{
  printf( "hello world \n" ); 
}



Step1:  前往下列網址,貼上程式碼。

http://formatmysourcecode.blogspot.tw/


Fig. 1



















Step2:  Copy 上述網址中產生的HTML語法, 回貼部落格文章中即可

Fig2