<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>色胚子部落 &#187; c++</title>
	<atom:link href="http://blog.colorbase.tw/tag/c/feed" rel="self" type="application/rss+xml" />
	<link>http://blog.colorbase.tw</link>
	<description>訊息多變的時代裡，需要多學習多思考</description>
	<lastBuildDate>Mon, 15 Aug 2011 03:29:59 +0000</lastBuildDate>
	<generator>http://wordpress.org/?v=2.9.2</generator>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<item>
		<title>透過Mono讓.Net Framework開發的軟體，搖身一變成為綠色軟體</title>
		<link>http://blog.colorbase.tw/programming/525</link>
		<comments>http://blog.colorbase.tw/programming/525#comments</comments>
		<pubDate>Wed, 17 Dec 2008 02:23:29 +0000</pubDate>
		<dc:creator>阿育</dc:creator>
				<category><![CDATA[程式設計]]></category>
		<category><![CDATA[.net framework]]></category>
		<category><![CDATA[c++]]></category>
		<category><![CDATA[mono]]></category>
		<category><![CDATA[免安裝軟體]]></category>
		<category><![CDATA[綠色軟體]]></category>

		<guid isPermaLink="false">http://blog.colorbase.tw/?p=525</guid>
		<description><![CDATA[雖然.Net Framework 的設計理念非常好，只要使用者的電腦安裝了.Net Framework，那麼在.Net Framework架構下所開發的軟體只需要下載該軟體的執行檔及相關檔案即可直接執行，而不需要經過額外安裝步驟，也因為程式庫早已存在於使用者的電腦中，因此軟體的主執行檔將會明顯小很多，有利於網路下載，所以也有人說這是一種變相的可攜式軟體(Portable Software)、綠色軟體或俗稱免安裝軟體，但如同Java一樣，必須要使用者的電腦已經安裝了執行的平台才能實現，萬一使用者的電腦沒有支援的平台就掛了，對於某些應用而言這樣的東西是完全不列入考慮的，最常見的例子就是應用於安裝光碟及多媒體光碟，隨著光碟片放入光碟機中就會自動執行的Autorun軟體。

我看到了一篇文章 使C#程序脫離.net框架運行(非飛信方式) ，該文作者透過Mono Framework，實現了.Net軟體免安裝即可執行，依照該篇文章的指引，我實做了以下內容。
.Net Framework透過Mono變成綠色軟體測試
1. 首先下載並安裝 Mono for Windows, Gtk#, and XSP ，Mono for Windows預設安裝在C:\Program Files\Mono-2.0.1。
2. 撰寫並編譯一個.Net程式。
3. 新建一個資料夾，從Mono安裝目錄中複製其bin、lib資料夾，並把已經編譯好的程式放入其中，這裡我又找來了之前寫的小工具重複文字產生器來當實驗品，因此目錄內容會有這些東西。

4. 由於免安裝的.Net程式必須透過Mono來執行，所以原作者介紹使用批次檔來達成，將以下指令存成.bat放在目錄下即可。
bin\mono.exe StrTemplate.exe
但這樣的方式執行後除了原本該執行的StrTemplate.exe之外還會有一個因為批次檔呼叫Mono Console所開啟的命令列視窗，軟體執行中還不可以將該視窗關閉，實在有礙觀瞻。
所以採用原作者的建議，另外寫一個前導的小程式會是比較好的作法，因此我透過Dev C++寫一個Console Application小程式來解決這個問題，程式碼如下，編譯後將該執行檔一同放入新建立的資料夾中。


#include 
#include 
using namespace std;

int main(int argc, char *argv[])
{
    WinExec("bin\\mono.exe StrTemplate.exe",SW_SHOWNORMAL);
    return EXIT_SUCCESS;
}


5. 至此，綠色版的.Net軟體已經算完成了，執行編譯好的前導程式即可呼叫Mono來執行StrTemplate.exe，執行畫面如下，雖然無法顯示Windows XP的樣式，但功能執行上卻沒有任何問題。

6. 最後，由於複製過來的是整個Mono Framework的內容，因此現在整個體積共309 MB，實在是很嚇人，所以必須刪除不必要的部份，經測試在bin目錄中的以下東西是必須的。

mono.exe (Mono的Console執行檔)
mono.dll
iconv.dll
intl.dll
libglib-2.0-0.dll
libgthread-2.0-0.dll

而\lib\mono\2.0中的mscorlib.dll也是必須的
再來就只剩下\lib\mono\gac\裡面的東西了，這裡必須留下來的.dll程式庫，將依照.Net程式中所使用到的內容而定，我在StrTemplate.exe中使用了以下套件

System
System.Collections.Generic
System.Drawing
System.Windows.Forms
System.Collections

因此逐一刪除不必要的東西後，留下了4.96 MB的程式庫，Mono總共的體積為9.69 MB。
最後再將全部的內容以7-Zip的格式壓縮，就可以得到一個3.34 MB的壓縮檔，方便於網路下載。
大功告成
下載綠色版的重複文字產生器，解壓縮後執行RunOnMono.exe或RunOnMono.bat即可

免安裝版 ...]]></description>
			<content:encoded><![CDATA[<p>雖然.Net Framework 的設計理念非常好，只要使用者的電腦安裝了.Net Framework，那麼在.Net Framework架構下所開發的軟體只需要下載該軟體的執行檔及相關檔案即可直接執行，而不需要經過額外安裝步驟，也因為程式庫早已存在於使用者的電腦中，因此軟體的主執行檔將會明顯小很多，有利於網路下載，所以也有人說這是一種變相的可攜式軟體(Portable Software)、綠色軟體或俗稱免安裝軟體，但如同Java一樣，必須要使用者的電腦已經安裝了執行的平台才能實現，萬一使用者的電腦沒有支援的平台就掛了，對於某些應用而言這樣的東西是完全不列入考慮的，最常見的例子就是應用於安裝光碟及多媒體光碟，隨著光碟片放入光碟機中就會自動執行的Autorun軟體。</p>
<p><span id="more-525"></span></p>
<p>我看到了一篇文章 <a href="http://www.cnblogs.com/daylight/archive/2008/10/02/1303037.html" target="_blank">使C#程序脫離.net框架運行(非飛信方式) </a>，該文作者透過Mono Framework，實現了.Net軟體免安裝即可執行，依照該篇文章的指引，我實做了以下內容。</p>
<p><strong><span style="color: #008080;">.Net Framework透過Mono變成綠色軟體測試</span></strong></p>
<p>1. 首先下載並安裝 <a href="http://www.go-mono.com/mono-downloads/download.html" target="_blank">Mono for Windows, Gtk#, and XSP</a> ，Mono for Windows預設安裝在C:\Program Files\Mono-2.0.1。</p>
<p>2. 撰寫並編譯一個.Net程式。</p>
<p>3. 新建一個資料夾，從Mono安裝目錄中複製其bin、lib資料夾，並把已經編譯好的程式放入其中，這裡我又找來了之前寫的小工具<a href="../portfolio/287" target="_blank">重複文字產生器</a>來當實驗品，因此目錄內容會有這些東西。</p>
<p><a class="thickbox" href="http://blog.colorbase.tw/wp-content/uploads/2008/12/001.png"><img class="alignnone size-medium wp-image-526" title="001" src="http://blog.colorbase.tw/wp-content/uploads/2008/12/001.png" alt="" width="349" height="130" /></a></p>
<p>4. 由於免安裝的.Net程式必須透過Mono來執行，所以原作者介紹使用批次檔來達成，將以下指令存成.bat放在目錄下即可。</p>
<blockquote><p>bin\mono.exe StrTemplate.exe</p></blockquote>
<p>但這樣的方式執行後除了原本該執行的StrTemplate.exe之外還會有一個因為批次檔呼叫Mono Console所開啟的命令列視窗，軟體執行中還不可以將該視窗關閉，實在有礙觀瞻。</p>
<p>所以採用原作者的建議，另外寫一個前導的小程式會是比較好的作法，因此我透過<a href="http://www.bloodshed.net/devcpp.html" target="_blank">Dev C++</a>寫一個Console Application小程式來解決這個問題，程式碼如下，編譯後將該執行檔一同放入新建立的資料夾中。</p>
<div style="padding-bottom: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; display: inline; float: none; padding-top: 0px" id="scid:812469c5-0cb0-4c63-8c15-c81123a09de7:e7260e77-5e65-4ebc-af8d-01c0054aa9ca" class="wlWriterEditableSmartContent">
<pre name="code" class="c:nogutter">
#include <cstdlib>
#include <windows.h>
using namespace std;

int main(int argc, char *argv[])
{
    WinExec("bin\\mono.exe StrTemplate.exe",SW_SHOWNORMAL);
    return EXIT_SUCCESS;
}
</pre>
</div>
<p>5. 至此，綠色版的.Net軟體已經算完成了，執行編譯好的前導程式即可呼叫Mono來執行StrTemplate.exe，執行畫面如下，雖然無法顯示Windows XP的樣式，但功能執行上卻沒有任何問題。</p>
<p><a class="thickbox" href="http://blog.colorbase.tw/wp-content/uploads/2008/12/002.png"><img class="alignnone size-medium wp-image-527" title="透過Mono執行的.Net程式" src="http://blog.colorbase.tw/wp-content/uploads/2008/12/002-350x330.png" alt="" width="350" height="330" /></a></p>
<p>6. 最後，由於複製過來的是整個Mono Framework的內容，因此現在整個體積共309 MB，實在是很嚇人，所以必須刪除不必要的部份，經測試在bin目錄中的以下東西是必須的。</p>
<ul>
<li>mono.exe (Mono的Console執行檔)</li>
<li>mono.dll</li>
<li>iconv.dll</li>
<li>intl.dll</li>
<li>libglib-2.0-0.dll</li>
<li>libgthread-2.0-0.dll</li>
</ul>
<p>而\lib\mono\2.0中的mscorlib.dll也是必須的</p>
<p>再來就只剩下\lib\mono\gac\裡面的東西了，這裡必須留下來的.dll程式庫，將依照.Net程式中所使用到的內容而定，我在StrTemplate.exe中使用了以下套件</p>
<ul>
<li>System</li>
<li>System.Collections.Generic</li>
<li>System.Drawing</li>
<li>System.Windows.Forms</li>
<li>System.Collections</li>
</ul>
<p>因此逐一刪除不必要的東西後，留下了4.96 MB的程式庫，Mono總共的體積為9.69 MB。</p>
<p>最後再將全部的內容以7-Zip的格式壓縮，就可以得到一個3.34 MB的壓縮檔，方便於網路下載。</p>
<p><strong><span style="color: #008080;">大功告成</span></strong></p>
<p>下載綠色版的重複文字產生器，解壓縮後執行RunOnMono.exe或RunOnMono.bat即可</p>
<ol>
<li><a href="http://tinoroy.myweb.hinet.net/download/StrTemplate.7z" target="_blank">免安裝版 (3.34MB)</a></li>
<li><a href="http://tinoroy.myweb.hinet.net/download/StrTemplate.exe" target="_blank">自解壓縮版 (3.42MB)</a></li>
</ol>
<p><strong><span style="color: #008080;">延伸思考</span></strong></p>
<p>既然透過Mono可以達成.Net軟體免安裝，加上Mono又是Open Source的專案，那麼只要有人以Mono為基礎開發一套工具，直接將所需的程式庫及.Net軟體包裝起來，就好像Delphi跟C++Builder，能將packages、dynamic RTL包裝成單一執行檔一樣，相信.Net以後也有機會能以單一執行檔的方式或者不用透過呼叫mono.exe的方式執行，讓.Net程式成為更真實的綠色軟體！或許這樣的東西早已經存在了，只是我還沒有發現罷了。</p>
<p>又或者再動點手腳，透過Mono甚至可以達成免安裝且跨平台哦！</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.colorbase.tw/programming/525/feed</wfw:commentRss>
		<slash:comments>13</slash:comments>
		</item>
		<item>
		<title>在Ubuntu上執行.Net開發的程式</title>
		<link>http://blog.colorbase.tw/programming/516</link>
		<comments>http://blog.colorbase.tw/programming/516#comments</comments>
		<pubDate>Fri, 12 Dec 2008 06:15:41 +0000</pubDate>
		<dc:creator>阿育</dc:creator>
				<category><![CDATA[程式設計]]></category>
		<category><![CDATA[.net framework]]></category>
		<category><![CDATA[c++]]></category>
		<category><![CDATA[linux]]></category>
		<category><![CDATA[mono]]></category>
		<category><![CDATA[ubuntu]]></category>
		<category><![CDATA[跨平台]]></category>

		<guid isPermaLink="false">http://blog.colorbase.tw/?p=516</guid>
		<description><![CDATA[今天看了 Installing and using mono on Ubuntu 這篇文章之後，測試了一下在Ubuntu中執行.Net的程式
該篇文章對Mono on Ubuntu 講的非常詳細，其中包括如何在Ubuntu中透過mono附帶的編譯器，編譯.Net程式
讓Ubuntu支援.Net WindowForms程式
該文作者是在Ubuntu底下，利用Mono的編譯器進行編譯，因此裝了許多的套件，但如果開發環境是在WIndows底下，而且覺得用命令列編譯太麻煩，其實只要安裝mono、libmono-winforms1.0-cil、libmono-winforms2.0-cil三個套件，就可以直接執行已經在Windows底下編譯好的.Net程式，因為在Windows有更好用的 MS Visual Studio跟SharpDevelop等RAD工具，確實可以省下很多麻煩。
Ubuntu中Mono的安裝指令為：
sudo apt-get install mono
sudo apt-get install libmono-winforms1.0-cil libmono-winforms2.0-cil
又或者使用Ubuntu的Synaptic套件管理程式來安裝更方便(用慣GUI介面的人 XD)
小小測試
我在SharpDevelop中使用C#寫了一些簡單的小東西來做測試，GUI的部份只使用最基本的WindowForms元件，編譯完成後，直接拿到Ubuntu底下，輸入：
mono 執行檔名.exe
該測試程式中使用了以下的.Net套件

System
System.Collections.Generic
System.Drawing
System.Windows.Forms
System.Net
System.Threading
System.Collections
System.Xml
System.IO
System.Text

執行結果，各個功能執行無誤，執行畫面如下：

如同該篇文章所說，Mono並無支援所有的WindowForms元件，後來又測試了使用ToolTip元件，發現無法執行，原因似乎是不支援氣泡提示。
結論
雖然很遺憾Mono仍尚未完全支援.Net所提供的套件，但是以目前支援的程度所能達到的應用，應該可以說數不完了。
相關連結

Installing and using mono on Ubuntu

]]></description>
			<content:encoded><![CDATA[<p>今天看了 <a href="http://www.builderau.com.au/program/dotnet/soa/Gallery-Installing-and-using-mono-on-Ubuntu/0,339028399,339279567,00.htm" target="_blank">Installing and using mono on Ubuntu</a> 這篇文章之後，測試了一下在Ubuntu中執行.Net的程式</p>
<p>該篇文章對Mono on Ubuntu 講的非常詳細，其中包括如何在Ubuntu中透過mono附帶的編譯器，編譯.Net程式<span id="more-516"></span></p>
<p><span style="color: #008080;"><strong>讓Ubuntu支援.Net WindowForms程式</strong></span></p>
<p>該文作者是在Ubuntu底下，利用Mono的編譯器進行編譯，因此裝了許多的套件，但如果開發環境是在WIndows底下，而且覺得用命令列編譯太麻煩，其實只要安裝mono、libmono-winforms1.0-cil、libmono-winforms2.0-cil三個套件，就可以直接執行已經在Windows底下編譯好的.Net程式，因為在Windows有更好用的 MS Visual Studio跟SharpDevelop等RAD工具，確實可以省下很多麻煩。</p>
<p>Ubuntu中Mono的安裝指令為：</p>
<blockquote><p>sudo apt-get install mono<br />
sudo apt-get install libmono-winforms1.0-cil libmono-winforms2.0-cil</p></blockquote>
<p>又或者使用Ubuntu的Synaptic套件管理程式來安裝更方便(用慣GUI介面的人 XD)</p>
<p><span style="color: #008080;"><strong>小小測試</strong></span></p>
<p>我在SharpDevelop中使用C#寫了一些簡單的小東西來做測試，GUI的部份只使用最基本的WindowForms元件，編譯完成後，直接拿到Ubuntu底下，輸入：</p>
<p>mono 執行檔名.exe</p>
<p>該測試程式中使用了以下的.Net套件</p>
<ul>
<li>System</li>
<li>System.Collections.Generic</li>
<li>System.Drawing</li>
<li>System.Windows.Forms</li>
<li>System.Net</li>
<li>System.Threading</li>
<li>System.Collections</li>
<li>System.Xml</li>
<li>System.IO</li>
<li>System.Text</li>
</ul>
<p>執行結果，各個功能執行無誤，執行畫面如下：</p>
<p><a class="thickbox" href="http://blog.colorbase.tw/wp-content/uploads/2008/12/csharponubuntu.png"><img class="alignnone size-medium wp-image-517" title="csharponubuntu" src="http://blog.colorbase.tw/wp-content/uploads/2008/12/csharponubuntu-330x350.png" alt="" width="330" height="350" /></a></p>
<p>如同該篇文章所說，Mono並無支援所有的WindowForms元件，後來又測試了使用ToolTip元件，發現無法執行，原因似乎是不支援氣泡提示。</p>
<p><span style="color: #008080;"><strong>結論</strong></span></p>
<p>雖然很遺憾Mono仍尚未完全支援.Net所提供的套件，但是以目前支援的程度所能達到的應用，應該可以說數不完了。</p>
<p><strong><span style="color: #008080;">相關連結</span></strong></p>
<ul>
<li><a href="http://www.builderau.com.au/program/dotnet/soa/Gallery-Installing-and-using-mono-on-Ubuntu/0,339028399,339279567,00.htm" target="_blank">Installing and using mono on Ubuntu</a></li>
</ul>
]]></content:encoded>
			<wfw:commentRss>http://blog.colorbase.tw/programming/516/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>C++ 三角函數 function</title>
		<link>http://blog.colorbase.tw/programming/39</link>
		<comments>http://blog.colorbase.tw/programming/39#comments</comments>
		<pubDate>Wed, 16 Jul 2008 12:02:44 +0000</pubDate>
		<dc:creator>阿育</dc:creator>
				<category><![CDATA[程式設計]]></category>
		<category><![CDATA[c++]]></category>
		<category><![CDATA[三角函數]]></category>

		<guid isPermaLink="false">http://blog.colorbase.tw/?p=39</guid>
		<description><![CDATA[這是好幾年前曾經寫過部落格留下的資料，現在重新po上來跟有需要的人分享

還記得三角函數嗎？如果忘了看一下說明圖溫習一下吧！


 
得到兩點之間的角度


/*得到兩點之間的距離*/
float getDistance(float x1,float y1,float x2,float y2)
{
    float fAdj;//鄰邊長度
    float fOpp;//對邊長度
    float fHyp;//斜邊長度
    fAdj = x2 - x1;
    fOpp = y2 - y1;
    fHyp = sqrt(pow(fAdj,2) + pow(fOpp,2));
}

得到兩點之間的角度

/*得到兩點之間的角度*/
float getAngle(float x1,float y1,float x2,float y2)
{
    float ...]]></description>
			<content:encoded><![CDATA[<p>這是<a href="http://blog.colorbase.tw/prate/1">好幾年前曾經寫過部落格</a>留下的資料，現在重新po上來跟有需要的人分享</p>
<p><span id="more-39"></span></p>
<p>還記得三角函數嗎？如果忘了看一下說明圖溫習一下吧！</p>
<p><a href="http://blog.colorbase.tw/wp-content/uploads/2008/07/e4b889e8a792e587bde695b82.png"><img class="alignnone size-medium wp-image-38" title="三角函數" alt="" src="http://blog.colorbase.tw/wp-content/uploads/2008/07/e4b889e8a792e587bde695b82-300x231.png" width="300" height="231" /></a></p>
<p><a href="http://blog.colorbase.tw/wp-content/uploads/2008/07/e4b889e8a792e587bde695b81.png"></a></p>
<p> <!--more-->
<p>得到兩點之間的角度</p>
<p>
<div style="padding-bottom: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; display: inline; float: none; padding-top: 0px" id="scid:812469c5-0cb0-4c63-8c15-c81123a09de7:0d1b0b52-8860-44fb-b56d-4392e8a7605d" class="wlWriterEditableSmartContent">
<pre name="code" class="c:nogutter">/*得到兩點之間的距離*/
float getDistance(float x1,float y1,float x2,float y2)
{
    float fAdj;//鄰邊長度
    float fOpp;//對邊長度
    float fHyp;//斜邊長度
    fAdj = x2 - x1;
    fOpp = y2 - y1;
    fHyp = sqrt(pow(fAdj,2) + pow(fOpp,2));
}</pre>
</div>
<p>得到兩點之間的角度</p>
<div style="padding-bottom: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; display: inline; float: none; padding-top: 0px" id="scid:812469c5-0cb0-4c63-8c15-c81123a09de7:73f008b5-92ad-49b6-ad91-25523881f91d" class="wlWriterEditableSmartContent">
<pre name="code" class="c:nogutter">/*得到兩點之間的角度*/
float getAngle(float x1,float y1,float x2,float y2)
{
    float x,y,fHyp,cos,rad,deg;
    x = x2 - x1;
    y = y2 - y1;

    fHyp = sqrt(pow(x,2) + pow(y,2));

    cos = x / fHyp;
    rad = acos(cos);

    deg = 180/(M_PI / rad);

    if(y &lt;0)
    {
        deg = -deg;
    }
    else if((y == 0) &amp;&amp; (x &lt;0))
    {
        deg = 180;
    }

    return deg;
}</pre>
</div>
<p>已知A點、半徑(斜邊)、角度，求C點 &#8212; 沿著圓的弧邊的點</p>
<div style="padding-bottom: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; display: inline; float: none; padding-top: 0px" id="scid:812469c5-0cb0-4c63-8c15-c81123a09de7:c4ef78d4-42f1-4068-9a04-605645bd2201" class="wlWriterEditableSmartContent">
<pre name="code" class="c:nogutter">/*已知A點、半徑(斜邊)、角度，求C點 -- 沿著圓的弧邊的點*/
//varDegrees = 度 or Angle 角度
//varRadius = 半徑
//varCenter = A點 or圓心
POINT GetCoordinate(float varDegrees,float varRadius,POINT varCenter)
{
    POINT pointCoordinate;
    float varRadians;//varRadians弧度
    varRadians = varDegrees * (M_PI / 180);  //M_PI = 3.14159265358979
    pointCoordinate.x = varRadius * cos(varRadians) + varCenter.x;//靠著圓邊的X
    pointCoordinate.y = varRadius * sin(varRadians) + varCenter.y;//靠著圓邊的Y
    return pointCoordinate;
}</pre>
</div>
]]></content:encoded>
			<wfw:commentRss>http://blog.colorbase.tw/programming/39/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>

