20121118

MASM - 如何使用Visual Studio 2012開發組合語言

說明

最近因為想寫一套自己的作業系統,所以又開始使用組合語言(Assembly Language)。

 

小時候爸爸媽媽有買一套MASM 6.0給我,不過那已經是十幾年前的事了,想當然耳目前的作業系統應該是不能用了。

 

上網研究一下才發現,原來,Visual Studio中還是有內建MASM,而且新版還可以組譯x64的程式碼。下面介紹一下我Google到的結果。

 

 

解決方法

1. 開啟VS2012,並建立空白的VC++專案。

201201117-1-MASM-如何使用Visual Studio 2012開發組合語言-W

 

2. 右點專案,並選擇「Build Customizations」。

201201117-2-MASM-如何使用Visual Studio 2012開發組合語言-W

 

3. 勾選「masm」。

201201117-3-MASM-如何使用Visual Studio 2012開發組合語言-W

 

4. 加入一個新的文字檔案,取名為「test.asm」 (或其他您想要的名稱)。

201201117-4-MASM-如何使用Visual Studio 2012開發組合語言-W

 

5. 右點專案,選「Property」,如果您都成功按照之前的步驟的話,這邊會出現「Microsoft Macro Assembler」的標籤頁 。

201201117-5-MASM-如何使用Visual Studio 2012開發組合語言-W

 

6. 接下來須設定Linker,以便正確進行連結。在前一個畫面中選取「Linker / System / SubSystem」,並設定「Windows」之設定值 (直接下拉選單選取即可)。

201201117-6-MASM-如何使用Visual Studio 2012開發組合語言-W

 

7. 同一個畫面,選取「Linker / Advanced / EntryPoint」以設定程式進入點。

201201117-7-MASM-如何使用Visual Studio 2012開發組合語言-W

 

8. 同一個畫面,選取「Linker / Advanced / Image Has Safe Exception Handlers」,設定為「No」。

201201117-8-MASM-如何使用Visual Studio 2012開發組合語言-W

 

9. 安裝asmHighlighter,請點選連結進入網站下載並安裝,這樣.asm的檔案,才會根據語法顯示不同顏色。

 

(安裝後,在編輯畫面中,若是你的程式碼後面有註解之時,按下「[Ctrl + K] + [Ctrl + D]」,則asmHighlighter會幫你計算程式碼指令大小,非常有用)。

 

10. 在VS2012(或VS2010)中,若asmHighlighter沒作用時,請刪除以下機碼:

「HKEY_CURRENT_USER\Software\Microsoft\VisualStudio\11.0\FontAndColors\Cache」 (清除字型及顏色快取)。

 

參考

MASM-Wikipedia

MASM Assembly in Visual Studio 2010

Assembly Programming with Visual Studio 2010/2012

asmHighlighter

The MASM32 SDK Version 11

开始进行 64 位 Windows 系统编程之前需要了解的所有信息

Introduction to 64-bit programming

20121005

Microsoft - TechDays 2012 - 微軟技術資源哪裡找 - 重點整理

說明

本文利用微軟所提供之Youtube影片,整理出微軟技術資源的參考位置。

影片URL: TechDays 2012 焦點對談 (Focus Grou) 微軟技術資源哪裡找

 

 

重點

資源

說明

Technet台灣 Facebook粉絲團

提供抽獎活動與新知。

MSDN台灣 Facebook粉絲團

提供抽獎活動與新知。

Windows Phone台灣 Facebook粉絲團

提供抽獎活動與新知。

Windows Style台灣 Facebook粉絲團

提供抽獎活動與新知。

Windows Embedded台灣 Facebook粉絲團

提供抽獎活動與新知。

Windows 台灣Facebook粉絲團

提供抽獎活動與新知。

Windows Phone Facebook粉絲團

提供抽獎活動與新知。

Windows Facebook粉絲團

提供抽獎活動與新知。

Technet 電子報

技術訊息、安全性訊息。

微軟研討會與活動

研討會與活動簡報、影片。

Technet

How-To教學短片

Virtual Labs台灣

虛擬實驗室。

課程資料下載

Technet技術資料庫

Script Center

指令碼中心。

Script Center 檔案與資料夾

MSDN Blogs

Technet Blogs

MSDN邊做邊學系列

學習如何撰寫指令碼

軟體開發工程實務分享

Youtube影片

Technet Virtual Labs

MSDN Virtual Labs

MSDN文件庫

Visual Studio Sample Codes

MSDN論壇

Answers

現已改為Microsoft Community

Fixit

 
 
參考

焦點對談

TechDays 2012 焦點對談 (Focus Grou) 微軟技術資源哪裡找

20120925

C++ – IOStream

說明

很久沒寫C++的程式了,剛好最近在復習以前小時候看過的書,想說用VS2010來試試看。

 

沒想到以前在Turbo C可以編譯的程式,到了VS2010裡面卻都不能編譯了。

 

重點在以前用的

   1: #include "iostream.h"

其中的cout, cin都不能用。


 

上網找一下解決方法。

 

 

解決方法

不廢話,重點二行程式先秀出來。



   1: #include <iostream>
   2: using namespace std;

 

因為cout其實原名為「std::cout」,所以若不加上最後一行的話,就要用「std::cout」的方式來使用它。

 

 

參考

Where is iostream.h ?

請問一下iostream和iostream.h

20120802

ASP.NET - 防止按鈕重覆點擊,並出現確認視窗


說明
在ASP.NET中,常要防止使用者惡意使用我們精心撰寫的程式。

 

例如,在購物網站上,使用者在信用卡交易頁面上點擊「確定交易」,但因伺服器尚在和金流商進行交易中,網頁上的按鈕卻可連續點擊,造成重複交易,那之後就有得吵了。

 

所以,我們要用一些方法,來防止使用者重覆點擊已經點擊過的按鈕。

 

為了達成這個目的,我們首先要把Button的UseSubmitBehavior這個屬性設為「false」。

 

為什麼呢?

 

因為在ASP.NET中,Button控制項預設的HTML Type為「Submit」,而不是「Button」。藉由將UseSubmitBehavior此屬性設為「false」,我們可以在Submit之前,透過Javascript來將按鈕的狀態設為不可點擊,或是作一些其他的處理 (如利用DIV蓋過Button…等等)。

 

而我們在伺服器端也應加入檢查,檢查是否為重複交易(如利用MD5, SHA256來確認交易是否重複,或是檢查二次交易之時間)。

 

另外,我們也希望在使用者確定交易前,再透過Javascript來和他確認是否交易。

 

解決方法,請參考下面。

 

 

解決方法
1. 在Visual Studio的Design View中,將Button的UseSubmitBehavior此屬性設為「false」。

201200802-1-ASP.NET-防止按鈕重覆點擊,並出現確認視窗-W
 

2. 在OnClientClick中加入如下程式碼

   1: javascript: if (confirm('請問您確定此筆交易嗎?') == true) {this.disabled=true;} else {return;};


 


3. 在按鈕的Button_Click事件中,加入檢查設定 (如檢查此筆交易之交易碼等),並記得視情況將「Button.Enabled」設為false。



4. 完成。


 


 


結論
網頁程式需要注意的東西很多,不亞於Window Form程式,再加上各瀏覽器對語法之支援程度不同,更造成了撰寫上的困難度。尤其是電子商務,因牽涉範圍廣,又會扯到金流、物流,所以防呆、防惡意破壞的技術,我們一定要好好地掌握,才不會日後改不完。


 


 


參考
按鈕加上詢問訊息
[ASP.NET] 設定 UseSubmitBehaviot 來防止按鈕重複送出&重複點擊方法

20120706

C# - 利用WebBrowser類別存取AJAX網頁

說明

以前我常常用WebBrowser來抓取網頁中的資料,或是利用IHTMLDocument2等方式,來控制網頁的動作。

 

後來我更利用HtmlAgilityPack來搭配WebBrowser,抓取資料可謂易如反掌。

 

但是等到AJAX大量流行之後,直接用WebBrowser抓取資料變得難上加難。因為WebBrowser.ReadyState即便成為了「Complete」,也不代表後面的Javascript已經把資料抓完了,所以往往是看得到、抓不到。

 

剛好最近比較閒,研究了一下解決方法。

 

 

解決方法

簡單來說,就是在WebBrowser讀取網頁之後,利用一個迴圈一直等候要抓取的資料出現,這有一個風險,要是對方的Javascript不是針對特定ID或是以亂數決定ID的時候,就要用很多種不同的方式,來迂迴檢查是否已讀入資料。

 

這一篇沒有範例,沒有程式碼,解決方式就是上面二句話,看得懂的人就看得懂囉。

 

因為全部寫出來太花時間,先記在這邊,免得自己以後忘記。

20120610

Weka - 連接MS SQL SERVER 2008 R2

說明

Weka是學習Data Mining人們的好伙伴。而我們常常對它有一些特別的要求。

 

例如。

 

能不能從MS SQL SERVER撈資料呢?

 

答案當然是「可以」,只是撈了之後,會不會分析是另外一回事。

 

今天,我就來介紹如何讓Weka利用ODBC從MS SQL SERVER 2008撈資料。

 

 

設定方式

1. 首先請參考這一篇「Java - 安裝Microsoft JDBC Driver for SQL Server」,將JDBC安裝至Windows上。

2. 在Weka的安裝目錄中,找到名為「Runweka.ini」的檔案,並用記事本軟體開啟。

可看到如下內容 (請注意到最後一行,就是我們要修改的部份,也就是「cp」,代表ClassPath)

   1: # Contains the commands for running Weka either with a command prompt
   2:  
   3: # ("cmd_console") or without the command prompt ("cmd_default").
   4:  
   5: # One can also define custom commands, which can be used with the Weka
   6:  
   7: # launcher "RunWeka.class". E.g., to run the launcher with a setup called
   8:  
   9: # "custom1", you only need to specify a key "cmd_custom1" which contains the
  10:  
  11: # command specification.
  12:  
  13: #
  14:  
  15: # Notes: 
  16:  
  17: # - This file is not a DOS ini file, but a Java properties file.
  18:  
  19: # - The settings listed here are key-value pairs, separated by a "=". Every
  20:  
  21: # key can only be listed ONCE.
  22:  
  23: #
  24:  
  25: # Author FracPete (fracpete at waikato dot ac dot nz)
  26:  
  27: # Version $Revision: 1.3 $
  28:  
  29: # setups (prefixed with "cmd_")
  30:  
  31: cmd_default=javaw -Dfile.encoding=#fileEncoding# -Xmx#maxheap# -classpath "#wekajar#;#cp#" #mainclass#
  32:  
  33: cmd_console=cmd.exe /K start cmd.exe /K "java -Dfile.encoding=#fileEncoding# -Xmx#maxheap# -classpath \"#wekajar#;#cp#\" #mainclass#"
  34:  
  35: cmd_explorer=javaw -Dfile.encoding=#fileEncoding# -Xmx#maxheap# -classpath "#wekajar#;#cp#" weka.gui.explorer.Explorer
  36:  
  37: cmd_knowledgeFlow=java -Dfile.encoding=#fileEncoding# -Xmx#maxheap# -classpath "#wekajar#;#cp#" weka.gui.beans.KnowledgeFlow
  38:  
  39: # placeholders ("#bla#" in command gets replaced with content of key "bla")
  40:  
  41: # Note: "#wekajar#" gets replaced by the launcher class, since that jar gets
  42:  
  43: # provided as parameter
  44:  
  45: maxheap=1024m
  46:  
  47: # The MDI GUI
  48:  
  49: #mainclass=weka.gui.Main
  50:  
  51: # The GUIChooser
  52:  
  53: mainclass=weka.gui.GUIChooser
  54:  
  55: # The file encoding; use "utf-8" instead of "Cp1252" to display UTF-8 characters in the 
  56:  
  57: # GUI, e.g., the Explorer
  58:  
  59: fileEncoding=Cp1252
  60:  
  61: # The classpath placeholder. Add any environment variables or jars to it that
  62:  
  63: # you need for your Weka environment.
  64:  
  65: # Example with an enviroment variable (e.g., THIRD_PARTY_LIBS):
  66:  
  67: # cp=%CLASSPATH%;%THIRD_PARTY_LIBS%
  68:  
  69: # Example with an extra jar (located at D:\libraries\libsvm.jar):
  70:  
  71: # cp=%CLASSPATH%;D:\\\\libraries\\\\libsvm.jar
  72:  
  73: # Or in order to avoid quadrupled backslashes, you can also use slashes "/":
  74:  
  75: # cp=%CLASSPATH%;D:/libraries/libsvm.jar
  76:  
  77: cp=%CLASSPATH

 

3. 在最後一行的後方加入如下JDBC的路徑「D:/SW/jdbc/sqljdbc_4.0/cht/sqljdbc4.jar」。

請注意,要記得在加入路徑之前,加入一個「;」,作為分隔之用。

這邊我指定的是sqljdbc4.jar,這是JDBC 4.0版,可支援到SQL SERVER 2012



   1: cp=%CLASSPATH%;D:/SW/jdbc/sqljdbc_4.0/cht/sqljdbc4.jar

 

4. 進入Weka的安裝目錄,將weka.jar (為一ZIP壓縮檔)中的「weka.jar\weka\experiment\DatabaseUtils.props.mssqlserver2005」解壓縮,並放至到Weka的安裝目錄,更名為「DatabaseUtils.props」。

201200610-13-Weka-連接MS SQL SERVER 2008 R2-W

 

5. 更改「DatabsaeUtils.props」中的設定如下:

(其中的「SQLSERVERNAME」為SQL SERVER的實體名稱;「DBNAME」為資料庫名稱;「TEST」為使用者ID;「***」為密碼,請依實際情況輸入)



   1: jdbcDriver= com.microsoft.sqlserver.jdbc.SQLServerDriver 
   2:  
   3: jdbcURL=jdbc:sqlserver://localhost;instanceName=SQLSERVERNAME;databaseName=DBNAME;Persist Security Info=True;User ID=TEST;Password=***

 


7. 另外還要在DatabaseUtils.prop中設定MS SQL Server與Weka間型別的對應,請在DatabaseUtils.prop中找到如下程式區塊



   1: # specific data types 
   2:  
   3: # string, getString() = 0; --> nominal 
   4:  
   5: # boolean, getBoolean() = 1; --> nominal 
   6:  
   7: # double, getDouble() = 2; --> numeric 
   8:  
   9: # byte, getByte() = 3; --> numeric 
  10:  
  11: # short, getByte()= 4; --> numeric 
  12:  
  13: # int, getInteger() = 5; --> numeric 
  14:  
  15: # long, getLong() = 6; --> numeric 
  16:  
  17: # float, getFloat() = 7; --> numeric 
  18:  
  19: # date, getDate() = 8; --> date 
  20:  
  21: # text, getString() = 9; --> string 
  22:  
  23: # time, getTime() = 10; --> date 
  24:  
  25: varchar=0 
  26:  
  27: float=2 
  28:  
  29: tinyint=3 
  30:  
  31: int=5

 


這邊定義了SQL Server的資料欄位型別與Weka的型別對應,不過還是有不足的地方,所以我們繼續加入以下資料



   1: nvarchar=0 
   2:  
   3: bit=1 
   4:  
   5: datetime=8 
   6:  
   7: nchar=0

這樣就可以對應大部份的型別了。

 

8. 啟動Weka,進入Explorer。選擇「Open DB...」

201200610-9-Weka-連接MS SQL SERVER 2008 R2-W

 

9. 連結字串的部份,應該會顯示第5步驟輸入的「jdbc:sqlserver://localhost;instanceName=SQLSERVERNAME;databaseName=DBNAME;Persist Security Info=True;User ID=TEST;Password=***」。

201200610-10-Weka-連接MS SQL SERVER 2008 R2-W

 


10. 再按下「User...」,輸入認證用的帳號及密碼。


201200610-11-Weka-連接MS SQL SERVER 2008 R2-W


 

11. 按下[Connect]之後,就可以在Query中輸入T-SQL來擷取資料了。

 

12. 大功告成。

 

 

參考

Java - 安裝Microsoft JDBC Driver for SQL Server

建立連接 URL

[Wekalist] Sybase: java.sql.SQLException: No suitable driver

Opening Windows Databases in Weka (Outdated)

Windows Databases

weka_experiment_DatabaseUtils.props

Weka - 使用ODBC連接MS SQL SERVER 2008 R2

說明

Weka是學習Data Mining人們的好伙伴。而我們常常對它有一些特別的要求。

 

例如。

 

能不能從MS SQL SERVER撈資料呢?

 

答案當然是「可以」,只是撈了之後,會不會分析是另外一回事。

 

今天,我就來介紹如何讓Weka利用ODBC從MS SQL SERVER 2008撈資料。

 

 

設定方式

1. 首先請參考這一篇「Java - 安裝Microsoft JDBC Driver for SQL Server」,將JDBC安裝至Windows上。

 

2. 在Weka的安裝目錄中,找到名為「Runweka.ini」的檔案,並用記事本軟體開啟。

可看到如下內容 (請注意到最後一行,就是我們要修改的部份,也就是「cp」,代表ClassPath)

   1: # Contains the commands for running Weka either with a command prompt
   2:  
   3: # ("cmd_console") or without the command prompt ("cmd_default").
   4:  
   5: # One can also define custom commands, which can be used with the Weka
   6:  
   7: # launcher "RunWeka.class". E.g., to run the launcher with a setup called
   8:  
   9: # "custom1", you only need to specify a key "cmd_custom1" which contains the
  10:  
  11: # command specification.
  12:  
  13: #
  14:  
  15: # Notes: 
  16:  
  17: # - This file is not a DOS ini file, but a Java properties file.
  18:  
  19: # - The settings listed here are key-value pairs, separated by a "=". Every
  20:  
  21: # key can only be listed ONCE.
  22:  
  23: #
  24:  
  25: # Author FracPete (fracpete at waikato dot ac dot nz)
  26:  
  27: # Version $Revision: 1.3 $
  28:  
  29: # setups (prefixed with "cmd_")
  30:  
  31: cmd_default=javaw -Dfile.encoding=#fileEncoding# -Xmx#maxheap# -classpath "#wekajar#;#cp#" #mainclass#
  32:  
  33: cmd_console=cmd.exe /K start cmd.exe /K "java -Dfile.encoding=#fileEncoding# -Xmx#maxheap# -classpath \"#wekajar#;#cp#\" #mainclass#"
  34:  
  35: cmd_explorer=javaw -Dfile.encoding=#fileEncoding# -Xmx#maxheap# -classpath "#wekajar#;#cp#" weka.gui.explorer.Explorer
  36:  
  37: cmd_knowledgeFlow=java -Dfile.encoding=#fileEncoding# -Xmx#maxheap# -classpath "#wekajar#;#cp#" weka.gui.beans.KnowledgeFlow
  38:  
  39: # placeholders ("#bla#" in command gets replaced with content of key "bla")
  40:  
  41: # Note: "#wekajar#" gets replaced by the launcher class, since that jar gets
  42:  
  43: # provided as parameter
  44:  
  45: maxheap=1024m
  46:  
  47: # The MDI GUI
  48:  
  49: #mainclass=weka.gui.Main
  50:  
  51: # The GUIChooser
  52:  
  53: mainclass=weka.gui.GUIChooser
  54:  
  55: # The file encoding; use "utf-8" instead of "Cp1252" to display UTF-8 characters in the 
  56:  
  57: # GUI, e.g., the Explorer
  58:  
  59: fileEncoding=Cp1252
  60:  
  61: # The classpath placeholder. Add any environment variables or jars to it that
  62:  
  63: # you need for your Weka environment.
  64:  
  65: # Example with an enviroment variable (e.g., THIRD_PARTY_LIBS):
  66:  
  67: # cp=%CLASSPATH%;%THIRD_PARTY_LIBS%
  68:  
  69: # Example with an extra jar (located at D:\libraries\libsvm.jar):
  70:  
  71: # cp=%CLASSPATH%;D:\\\\libraries\\\\libsvm.jar
  72:  
  73: # Or in order to avoid quadrupled backslashes, you can also use slashes "/":
  74:  
  75: # cp=%CLASSPATH%;D:/libraries/libsvm.jar
  76:  
  77: cp=%CLASSPATH

 

3. 在最後一行的後方加入如下JDBC的路徑「D:/SW/jdbc/sqljdbc_4.0/cht/sqljdbc4.jar」。

請注意,要記得在加入路徑之前,加入一個「;」,作為分隔之用。

這邊我指定的是sqljdbc4.jar,這是JDBC 4.0版,可支援到SQL SERVER 2012





cp=%CLASSPATH%;D:/SW/jdbc/sqljdbc_4.0/cht/sqljdbc4.jar


 

4. 開啟「控制台」,在搜尋框中輸入「ODBC」。會出現「設定資料來源 (ODBC)」,開啟它。

201200610-12-Weka-連接MS SQL SERVER 2008 R2-W

 

5. 點選[新增],以便增加使用者資料來源。

201200610-14-Weka-連接MS SQL SERVER 2008 R2-W

 

6. 選擇「SQL Server Native Client 10.0」 (SQL 2008 R2)。

201200610-15-Weka-連接MS SQL SERVER 2008 R2-W

 

7. 輸入DSN名稱,以及SQL Server名稱。

201200610-16-Weka-連接MS SQL SERVER 2008 R2-W

 

8. 輸入登入SQL Server所需的帳號資訊。

201200610-17-Weka-連接MS SQL SERVER 2008 R2-W

 

9. 選擇登入後使用的資料庫。

201200610-18-Weka-連接MS SQL SERVER 2008 R2-W

 

10. 點選「完成」。

201200610-19-Weka-連接MS SQL SERVER 2008 R2-W

 

11. 點選「Test Data Source...」,若成功即為設定完成。

201200610-20-Weka-連接MS SQL SERVER 2008 R2-W

 

12. 進入Weka的安裝目錄,將weka.jar (為一ZIP壓縮檔)中的「weka.jar\weka\experiment\DatabaseUtils.props.odbc」解壓縮,並放至到Weka的安裝目錄,更名為「DatabaseUtils.props」。

201200610-21-Weka-連接MS SQL SERVER 2008 R2-W

 

13. 更改「DatabsaeUtils.props」中的設定如下: (第二行中的dbname,則要改成剛剛設定的使用者資料來源名稱,也就是DSN)





jdbcDriver=sun.jdbc.odbc.JdbcOdbcDriver

jdbcURL=jdbc:odbc:dbname


 

14. 啟動Weka,進入Explorer。選擇「Open DB...」

201200610-9-Weka-連接MS SQL SERVER 2008 R2-W

 

15. 連結字串的部份,應該會顯示第13步驟輸入的「jdbc:odbc:dbname」。

這邊我輸入的是自己的資料庫連結「jdbc:sqlserve://localhost;instanceName=db1;databaseName=MLB;Persist Security Info=True;」 (不適用ODBC)

201200610-10-Weka-連接MS SQL SERVER 2008 R2-W

 

16. 再按下「User...」,輸入認證用的帳號及密碼。

201200610-11-Weka-連接MS SQL SERVER 2008 R2-W

 

17. 按下[Connect]之後,就可以在Query中輸入T-SQL來擷取資料了。

 

18. 大功告成。

 

 

參考

Java - 安裝Microsoft JDBC Driver for SQL Server

建立連接 URL

[Wekalist] Sybase: java.sql.SQLException: No suitable driver

Opening Windows Databases in Weka (Outdated)

Windows Databases

weka_experiment_DatabaseUtils.props