<?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; 技术</title>
	<atom:link href="http://blog.waterlin.org/articles/tag/%e6%8a%80%e6%9c%af/feed" rel="self" type="application/rss+xml" />
	<link>http://blog.waterlin.org</link>
	<description>源于理工科男的烂笔头情结</description>
	<lastBuildDate>Sat, 04 Sep 2010 09:48:08 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.0.1</generator>
		<item>
		<title>测试机器某个 IP 的某个端口是否能用</title>
		<link>http://blog.waterlin.org/articles/how-to-check-ip-port-status.html</link>
		<comments>http://blog.waterlin.org/articles/how-to-check-ip-port-status.html#comments</comments>
		<pubDate>Thu, 29 Apr 2010 11:05:54 +0000</pubDate>
		<dc:creator>waterlin</dc:creator>
				<category><![CDATA[技术]]></category>

		<guid isPermaLink="false">http://blog.waterlin.org/articles/how-to-check-ip-port-status.html</guid>
		<description><![CDATA[需要测试某台机器的某个端口是否能用，从而可以使用相关的服务，可以用 telnet ip port 这种形式的命令来测试。 清屏后光标一闪一闪说明服务器该端口可连接。]]></description>
			<content:encoded><![CDATA[<p>需要测试某台机器的某个端口是否能用，从而可以使用相关的服务，可以用</p>
<pre>
telnet ip port
</pre>
<p>这种形式的命令来测试。</p>
<p>清屏后光标一闪一闪说明服务器该端口可连接。</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.waterlin.org/articles/how-to-check-ip-port-status.html/feed</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>试用 Dabr，墙不住的 Twitter 心</title>
		<link>http://blog.waterlin.org/articles/how-to-build-a-web-twitter-client.html</link>
		<comments>http://blog.waterlin.org/articles/how-to-build-a-web-twitter-client.html#comments</comments>
		<pubDate>Sun, 07 Feb 2010 05:08:42 +0000</pubDate>
		<dc:creator>waterlin</dc:creator>
				<category><![CDATA[技术]]></category>

		<guid isPermaLink="false">http://blog.waterlin.org/articles/how-to-build-a-web-twitter-client.html</guid>
		<description><![CDATA[上新浪玩了一把微博，突然依然觉得应该试一下 Twitter，没办法，虽然上面全是老外，但是我依然对如何在中国访问 Twitter 产生了深厚的技术兴趣。 原来可以用 Dabr 来访问 Twitter，当然，最好是能搭一个 Dabr 在自己国外的服务器上： 把文件解压到你的域名下，比较说 http://t.WaterLin.org 之类的； 重命令 config.sample.php 为 config.php 文件； 修改 config.php 文件里的 ENCRYPTION_KEY 为一个随机字符串，最大为 52 个字符。 这样输入你的 Twitter 帐户和密码就可以访问 Twitter 信息了。可是，我发现我对着 Dabr 依然不知道应该玩些什么。 原创文章，如转载请注明：转载自细节之锤 [ http://blog.WaterLin.org/ ] Copyright © WaterLin.org. All rights reserved.]]></description>
			<content:encoded><![CDATA[<p>上新浪玩了一把微博，突然依然觉得应该试一下 Twitter，没办法，虽然上面全是老外，但是我依然对如何在中国访问 Twitter 产生了深厚的技术兴趣。</p>
<p>原来可以用 <a href="http://code.google.com/p/dabr/">Dabr</a> 来访问 Twitter，当然，最好是能<a href="http://code.google.com/p/dabr/wiki/SetupGuide">搭一个 Dabr 在自己国外的服务器上</a>：</p>
<ol>
<li>把文件解压到你的域名下，比较说 <a href="http://t.WaterLin.org">http://t.WaterLin.org</a> 之类的；</li>
<li>重命令 config.sample.php 为 config.php 文件；</li>
<li>修改 config.php 文件里的 ENCRYPTION_KEY 为一个随机字符串，最大为 52 个字符。</li>
</ol>
<p>这样输入你的 Twitter 帐户和密码就可以访问 Twitter 信息了。可是，我发现我对着 Dabr 依然不知道应该玩些什么。</p>
<p>原创文章，如转载请注明：转载自细节之锤 [ <a href="http://blog.WaterLin.org/">http://blog.WaterLin.org/</a> ]</p>
<p>Copyright © WaterLin.org. All rights reserved.</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.waterlin.org/articles/how-to-build-a-web-twitter-client.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Linux 下建立本地的 SVN 版本控制</title>
		<link>http://blog.waterlin.org/articles/create-local-svn-under-linux.html</link>
		<comments>http://blog.waterlin.org/articles/create-local-svn-under-linux.html#comments</comments>
		<pubDate>Sun, 20 Dec 2009 02:26:06 +0000</pubDate>
		<dc:creator>waterlin</dc:creator>
				<category><![CDATA[技术]]></category>

		<guid isPermaLink="false">http://blog.waterlin.org/articles/create-local-svn-under-linux.html</guid>
		<description><![CDATA[Linux 下本地写代码的话，有一个 SVN 版本控制还是会好很多的。安装好 SubVersion 后，就可以直接用 svnadmin 命令来 import 一个本地的文件（以下内容摘自《Subversion 权威指南》中文版），比如说： $ svnadmin create /var/svn/newrepos $ svn import mytree file:///var/svn/newrepos/some/project \ -m "Initial import" Adding mytree/foo.c Adding mytree/bar.c Adding mytree/subdir Adding mytree/subdir/quux.h 路径 file:///F&#124;/Zoundry%20Raven/var/svn/newrepos/some/project 就是你想让 svn 保存有关 svn 版本信息的目录，这样，你的目录 mytree 里的内容就提交到了代码仓库里。 然后你可以查一下是否已经提交了一份代码到所指定的路径里： $ svn list file:///var/svn/newrepos/some/project bar.c foo.c subdir/ 注意，在导入之后，原来的目录树并没有转化成工作拷贝，为了开始工作，你还是需要运行 svn checkout 导出一个工作拷贝。 原创文章，如转载请注明：转载自细节之锤 [ [...]]]></description>
			<content:encoded><![CDATA[<p>Linux 下本地写代码的话，有一个 SVN 版本控制还是会好很多的。安装好 SubVersion 后，就可以直接用 svnadmin 命令来 import 一个本地的文件（以下内容摘自《Subversion 权威指南》中文版），比如说：</p>
<pre>
$ svnadmin create /var/svn/newrepos
$ svn import mytree file:///var/svn/newrepos/some/project \
             -m <span>"Initial import"</span>
Adding         mytree/foo.c
Adding         mytree/bar.c
Adding         mytree/subdir
Adding         mytree/subdir/quux.h
</pre>
<p>路径 <a href="\Zoundry Raven\var\svn\newrepos\some\project">file:///F|/Zoundry%20Raven/var/svn/newrepos/some/project</a> 就是你想让 svn 保存有关 svn 版本信息的目录，这样，你的目录 mytree 里的内容就提交到了代码仓库里。</p>
<p>然后你可以查一下是否已经提交了一份代码到所指定的路径里：</p>
<pre>
$ svn list file:///var/svn/newrepos/some/project
bar.c
foo.c
subdir/
</pre>
<p>注意，在导入之后，原来的目录树并没有转化成工作拷贝，为了开始工作，你还是需要运行 svn checkout 导出一个工作拷贝。</p>
<p>原创文章，如转载请注明：转载自细节之锤 [ <a href="http://blog.WaterLin.org/">http://blog.WaterLin.org/</a> ]</p>
<p>Copyright © WaterLin.org. All rights reserved.</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.waterlin.org/articles/create-local-svn-under-linux.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Code::Blocks 的前后跳转功能</title>
		<link>http://blog.waterlin.org/articles/codeblocks-browse-tracker-plugins.html</link>
		<comments>http://blog.waterlin.org/articles/codeblocks-browse-tracker-plugins.html#comments</comments>
		<pubDate>Sun, 20 Dec 2009 02:20:43 +0000</pubDate>
		<dc:creator>waterlin</dc:creator>
				<category><![CDATA[技术]]></category>

		<guid isPermaLink="false">http://blog.waterlin.org/articles/codeblocks-browse-tracker-plugins.html</guid>
		<description><![CDATA[如果用了 Visual Studio 2005 之类的 IDE 后，对于该类 IDE 提供的前后位置跳转功能，一定会印象很深。 Code::Blocks 也可以装上类似的插件，有一个名叫 Browse Tracker plugins 的插件集合，提供了类似的功能。 Debian/Ubuntu 下可以装上 codeblocks-contrib 这个包，然后就有了 Browse Tracker 的功能。 安装好了以后，可以先通过 Code::Blocks 的菜单 View ==&#62; Browse Tracker ==&#62; Setting，把 Enable BrowseMarks 选上。 默认情况下的使用： 用 Alt-Left 和 Alt-Right 快捷键在编辑器堆栈 ( editor stack ) 里前后跳转； 用 Alt-Up 和 Alt-Down 快捷键来在最近标记 ( marked editor positions ) [...]]]></description>
			<content:encoded><![CDATA[<p>如果用了 Visual Studio 2005 之类的 IDE 后，对于该类 IDE 提供的前后位置跳转功能，一定会印象很深。</p>
<p><a href="http://blog.waterlin.org/articles/setting-codeblocks.html">Code::Blocks</a> 也可以装上类似的插件，有一个名叫 <a href="http://wiki.codeblocks.org/index.php?title=Browse_Tracker_plugins">Browse Tracker plugins</a> 的插件集合，提供了类似的功能。</p>
<p>Debian/Ubuntu 下可以装上 codeblocks-contrib 这个包，然后就有了 Browse Tracker 的功能。</p>
<p>安装好了以后，可以先通过 <a href="http://blog.waterlin.org/articles/setting-codeblocks.html">Code::Blocks</a> 的菜单 View ==&gt; Browse Tracker ==&gt; Setting，把 Enable BrowseMarks 选上。</p>
<p>默认情况下的使用：</p>
<ul>
<li>用 Alt-Left 和 Alt-Right 快捷键在编辑器堆栈 ( editor stack ) 里前后跳转；</li>
<li>用 Alt-Up 和 Alt-Down 快捷键来在最近标记 ( marked editor positions ) 的地方跳转；</li>
<li>需要标记一个阅读标记 ( Browse mark )，可以在需要标记的地方，按住鼠标左键一小会（默认配置是 0.2 秒），即可以在当前位置创建一个阅读标记。以后可以用 Alt + up 或 Alt + down 键来回到这里。标记后，在左边的序号里会显示为省略号 &#8220;…&#8221; 。
<p>原创文章，如转载请注明：转载自细节之锤 [ <a href="http://blog.WaterLin.org/">http://blog.WaterLin.org/</a> ]</p>
<p>Copyright © WaterLin.org. All rights reserved.</p>
</li>
</ul>
]]></content:encoded>
			<wfw:commentRss>http://blog.waterlin.org/articles/codeblocks-browse-tracker-plugins.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Subversion 的 patch 功能</title>
		<link>http://blog.waterlin.org/articles/the-patch-function-of-tortoisesvn.html</link>
		<comments>http://blog.waterlin.org/articles/the-patch-function-of-tortoisesvn.html#comments</comments>
		<pubDate>Tue, 27 Oct 2009 06:08:32 +0000</pubDate>
		<dc:creator>waterlin</dc:creator>
				<category><![CDATA[技术]]></category>

		<guid isPermaLink="false">http://blog.waterlin.org/articles/the-patch-function-of-tortoisesvn.html</guid>
		<description><![CDATA[项目组如果用 SVN 来管理代码，人一多，谁都可以提交 ( check in) 代码的话，代码很快就会变得混乱不堪，永远也稳定不下来。 这个时候，可以用 SVN 的 patch 功能。我们可以根据自己修改的代码，生成一份和原来代码 diff 后的记录文件，保存下来就成了一个 patch 文件了。代码管理者通过这个 patch 文件，可以很好地观看到修改建议，从而决定是否进行提交。 如果是 TortoiseSVN 的话，要生成 patch 文件很简单，从 TortoiseSVN -&#62; Create patch… 即可生成 patch 文件，保存为以 .patch 或 .diff 结尾的文件即可，如下图所示： 代码提交要使用这个 patch，只需要 TortoiseSVN -&#62; Apply Patch… 即可。 详细的信息可以参考 TortoiseSVN 官方文档。 原创文章，如转载请注明：转载自细节之锤 [ http://blog.WaterLin.org/ ] Copyright © WaterLin.org. All rights reserved.]]></description>
			<content:encoded><![CDATA[<p>项目组如果用 SVN 来管理代码，人一多，谁都可以提交 ( check in) 代码的话，代码很快就会变得混乱不堪，永远也稳定不下来。</p>
<p>这个时候，可以用 SVN 的 patch 功能。我们可以根据自己修改的代码，生成一份和原来代码 diff 后的记录文件，保存下来就成了一个 patch 文件了。代码管理者通过这个 patch 文件，可以很好地观看到修改建议，从而决定是否进行提交。</p>
<p>如果是 TortoiseSVN 的话，要生成 patch 文件很简单，从 TortoiseSVN -&gt; Create patch… 即可生成 patch 文件，保存为以 .patch 或 .diff 结尾的文件即可，如下图所示：</p>
<p><img src="http://blog.waterlin.org/wp-content/uploads/250/25015/2009/10/svnpatchcopyright.jpg" alt="svnpatchCopyright.jpg" height="590"></p>
<p>代码提交要使用这个 patch，只需要 TortoiseSVN -&gt; Apply Patch… 即可。</p>
<p>详细的信息可以参考 <a href="http://tortoisesvn.net/docs/release/TortoiseSVN_en/tsvn-dug-patch.html">TortoiseSVN 官方文档</a>。</p>
<p>原创文章，如转载请注明：转载自细节之锤 [ <a href="http://blog.WaterLin.org/">http://blog.WaterLin.org/</a> ]</p>
<p>Copyright © WaterLin.org. All rights reserved.</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.waterlin.org/articles/the-patch-function-of-tortoisesvn.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>MySQL的Connector C++</title>
		<link>http://blog.waterlin.org/articles/using-mysql-connector-cplusplus-in-visual-studio-2005.html</link>
		<comments>http://blog.waterlin.org/articles/using-mysql-connector-cplusplus-in-visual-studio-2005.html#comments</comments>
		<pubDate>Wed, 08 Jul 2009 04:40:36 +0000</pubDate>
		<dc:creator>waterlin</dc:creator>
				<category><![CDATA[技术]]></category>
		<category><![CDATA[C++]]></category>

		<guid isPermaLink="false">http://blog.waterlin.org/articles/using-mysql-connector-cplusplus-in-visual-studio-2005.html</guid>
		<description><![CDATA[MySQL提供了C++语言的操作接口，用这个接口可以针对自己的数据库写一个C++的客户端出来，安装的方法请参看官方文档。 这个文章已经把在Visual Studio 2008里如何编写MySQL Connector C++的应用程序进行了详细的说明，此方法是针对MySQL Connector C++的安装包来介绍的。而另一篇文章则介绍了如何从MySQL Connector C++的源码包编译。 这里介绍一下Visual Studio 2005下面，用安装二进制包的方法来使用MySQL Connector C++的方法： 1) 先安装MySQL 记得要把Developer Components &#8211; C Include Files / Lib Files选上。当然，你不安装MySQL而只装这个单独的包也行，不过我还是建议在本地装一个MySQL，否则怎么测试呢？远程测试太麻烦了～～ 2) 下载与Visual Studio 2005相对应的MySQL Connector C++版本 3) 在Visual Studio 2005里创建一个Win32 Console工程 File-&#62;New Project-&#62;Visual C++-&#62;Win32-&#62;Win32 Console Application 注意：&#8221;Application Settings&#8221;里的&#8221;Additional options: Precompiled header&#8221;默认是会被选上的，而我们这里，基本上可以不用这个。 4) 正确地配置工程属性 不管是Debug还是Release，都是用下面的方法设置就可以了，主要是把相关的头文件include到工程，再指定相关的动态链接库所在路径。 (1) 打开&#8221;project&#8221;-&#62;&#8221;properties&#8221;对话框，选择&#8221;configuration properties&#8221; 把MySQL Connector/C++的安装目录添加到Additional [...]]]></description>
			<content:encoded><![CDATA[<p>MySQL提供了<a href="http://dev.mysql.com/doc/refman/5.1/en/connector-cpp.html" target="_blank" title="MySQL Connector C++">C++语言的操作接口</a>，用这个接口可以针对自己的数据库写一个C++的客户端出来，安装的方法请参看<a href="http://dev.mysql.com/doc/refman/5.1/en/connector-cpp-installation-binary.html" target="_blank" title="MySQL Connector C++ Installation">官方文档</a>。</p>
<p><a href="http://blog.ulf-wendel.de/?p=215" target="_blank">这个文章</a>已经把在Visual Studio 2008里如何编写MySQL Connector C++的应用程序进行了详细的说明，此方法是针对MySQL Connector C++的安装包来介绍的。而<a href="http://blog.ulf-wendel.de/?p=204" target="_blank">另一篇文章</a>则介绍了如何从MySQL Connector C++的源码包编译。</p>
<p>这里介绍一下Visual Studio 2005下面，用安装二进制包的方法来使用MySQL Connector C++的方法：</p>
<p>1) 先安装MySQL</p>
<p>记得要把Developer Components &#8211; C Include Files / Lib Files选上。当然，你不安装MySQL而只装这个单独的包也行，不过我还是建议在本地装一个MySQL，否则怎么测试呢？远程测试太麻烦了～～</p>
<p>2) 下载与Visual Studio 2005相对应的<a href="http://dev.mysql.com/downloads/connector/cpp/1.0.html" target="_blank">MySQL Connector C++版本</a> </p>
<p>3) 在Visual Studio 2005里创建一个Win32 Console工程</p>
<blockquote><p>File-&gt;New Project-&gt;Visual C++-&gt;Win32-&gt;Win32 Console Application</p>
</blockquote>
<p>注意：&#8221;Application Settings&#8221;里的&#8221;Additional options: Precompiled header&#8221;默认是会被选上的，而我们这里，基本上可以不用这个。</p>
<p>4) 正确地配置工程属性</p>
<p>不管是Debug还是Release，都是用下面的方法设置就可以了，主要是把相关的头文件include到工程，再指定相关的动态链接库所在路径。</p>
<p>(1) 打开&#8221;project&#8221;-&gt;&#8221;properties&#8221;对话框，选择&#8221;configuration properties&#8221;</p>
<p>把MySQL Connector/C++的安装目录添加到Additional Include Directory里：</p>
<blockquote><p>Project-&gt;Properties <br />Configuration Properties -&gt; open tree view <br />C/C++ -&gt; General -&gt; Additional Include Directory</p>
</blockquote>
<p><a href="http://blog.waterlin.org/files/2009/07/1.png"><img src="http://blog.waterlin.org/wp-content/uploads/250/25015/2009/07/zrtn-004n2cd1d68f-tn.jpg" height="348"></a></p>
<p>(2) 让编译器能找到MySQL Connector/C++的libraries，只要把MySQL Connector/C++安装目录里的lib/opt目录添加到搜索路径即可：</p>
<blockquote><p>Linker -&gt; General -&gt; Additional Library Directories</p>
</blockquote>
<p><a href="http://blog.waterlin.org/files/2009/07/2.png"><img src="http://blog.waterlin.org/files/2009/07/zrtn-005n7bf6179c-tn.jpg" height="346"></a></p>
<p>(3) 编译器在编译的时候，让linker去链接MySQL Connector/C++的mysqlcppconn.lib库</p>
<p>把mysqlcppconn.lib添加到这里：</p>
<blockquote><p>Linker -&gt; Input -&gt; Additional Dependencies</p>
</blockquote>
<p><a href="http://blog.waterlin.org/wp-content/uploads/250/25015/2009/07/3.png"><img src="http://blog.waterlin.org/wp-content/uploads/250/25015/2009/07/zrtn-006n3ff0b82d-tn.jpg" height="347"></a></p>
<p>5) 可以试着编译下面的这段最基本的代码：</p>
<pre>
/*
examples/standalone_example_docs1.cpp
*/

/* Standard C++ includes */
#include

#include

/*
Include directly the different
headers from cppconn/ and mysql_driver.h + mysql_util.h
(and mysql_connection.h). This will reduce your build time!
*/
#include "mysql_connection.h"

#include "cppconn/driver.h"
#include "cppconn/exception.h"
#include "cppconn/resultset.h"
#include "cppconn/statement.h"

using namespace std;

int main(void)
{
    cout &lt;&lt; endl;
    cout &lt;&lt; "Running 'SELECT 'Hello World!' AS _message'..." &lt;&lt; endl;

    try {
        sql::Driver *driver;
        sql::Connection *con;
        sql::Statement *stmt;
        sql::ResultSet *res;

        /* Create a connection */
        driver = get_driver_instance();
        con = driver-&gt;connect("tcp://127.0.0.1:3306", "root", "password");
        /* Connect to the MySQL test database */
        con-&gt;setSchema("test");

        stmt = con-&gt;createStatement();
        res = stmt-&gt;executeQuery("SELECT 'Hello World!' AS _message");
        while (res-&gt;next()) {
            cout &lt;&lt; "\t... MySQL replies: ";
            /* Access column data by alias or column name */
            cout &lt;&lt; res-&gt;getString("_message") &lt;&lt; endl;
            cout &lt;&lt; "\t... MySQL says it again: ";
            /* Access column fata by numeric offset, 1 is the first column */
            cout &lt;&lt; res-&gt;getString(1) &lt;&lt; endl;
        }
        delete res;
        delete stmt;
        delete con;

    } catch (sql::SQLException &amp;e) {
        cout &lt;&lt; "# ERR: SQLException in " &lt;&lt; __FILE__;
        cout &lt;&lt; "(" &lt;&lt; __FUNCTION__ &lt;&lt; ") on line " &lt;&lt; __LINE__ &lt;&lt; endl;
        cout &lt;&lt; "# ERR: " &lt;&lt; e.what();
        cout &lt;&lt; " (MySQL error code: " &lt;&lt; e.getErrorCode();
        cout &lt;&lt; ", SQLState: " &lt;&lt; e.getSQLState() &lt;&lt; " )" &lt;&lt; endl;
    }

    cout &lt;&lt; endl;

    return EXIT_SUCCESS;
}
</pre>
<p>如果一切顺序，应该就能连上本地的MySQL进行操作了。</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.waterlin.org/articles/using-mysql-connector-cplusplus-in-visual-studio-2005.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>位图的结构及位图的操作</title>
		<link>http://blog.waterlin.org/articles/the-bitmap-detail-structure.html</link>
		<comments>http://blog.waterlin.org/articles/the-bitmap-detail-structure.html#comments</comments>
		<pubDate>Mon, 06 Jul 2009 07:00:07 +0000</pubDate>
		<dc:creator>waterlin</dc:creator>
				<category><![CDATA[技术]]></category>

		<guid isPermaLink="false">http://blog.waterlin.org/articles/the-bitmap-detail-structure.html</guid>
		<description><![CDATA[最近写了一个神经网络的数字图像识别的程序，刚一开始，被位图的读写搞得晕头转向的。想当年还蛮熟悉的，太久没弄了，知识总是会忘记的！现在写下来，算是记一记笔记，以后再回忆就不会那么痛苦了！ 位图文件由三部分组成：文件头 + 位图信息 + 位图像素数据，具体的结构如下图所示： 1、位图文件头。位图文件头主要用于识别位图文件。以下是位图文件头结构的定义： typedef struct tagBITMAPFILEHEADER { // bmfh WORD bfType; DWORD bfSize; WORD bfReserved1; WORD bfReserved2; DWORD bfOffBits; } BITMAPFILEHEADER; 其中的bfType值应该是&#8221;BM&#8221;(0x4d42)，标志该文件是位图文件。bfSize的值是位图文件的大小；bfOffBits是指从BITMAPFILEHEADER开始，直到位图像素数据存储点的内存大小（距离），即用bfOffBits &#8211; sizeof(BITMAPFILEHEADER)就能得到BITMAPINFO在位图中实际所占有的空间大小。 2、位图信息中所记录的值用于分配内存，设置调色板信息，读取像素值等。 以下是位图信息结构的定义： typedef struct tagBITMAPINFO { BITMAPINFOHEADER bmiHeader; RGBQUAD bmiColors[1]; } BITMAPINFO; 可见位图信息也是由两部分组成的：位图信息头 + 颜色表。 2.1 位图信息头 位图信息头包含了单个像素所用字节数以及描述颜色的格式，此外还包括位图的宽度、高度、目标设备的位平面数、图像的压缩格式。以下是位图信息头结构的定义： typedef struct tagBITMAPINFOHEADER{ // bmih DWORD biSize; LONG biWidth; [...]]]></description>
			<content:encoded><![CDATA[<p>最近写了一个神经网络的数字图像识别的程序，刚一开始，被位图的读写搞得晕头转向的。想当年还蛮熟悉的，太久没弄了，知识总是会忘记的！现在写下来，算是记一记笔记，以后再回忆就不会那么痛苦了！</p>
<p>位图文件由三部分组成：文件头 + 位图信息 + 位图像素数据，具体的结构如下图所示：</p>
<p><a href="http://blog.waterlin.org/files/2009/07/bitmapstructure.png"><img src="http://blog.waterlin.org/files/2009/07/zrtn-001n434c8e13-tn.jpg" height="350"></a></p>
<p>1、位图文件头。位图文件头主要用于识别位图文件。以下是位图文件头结构的定义：</p>
<blockquote><p>typedef struct tagBITMAPFILEHEADER { // bmfh <br />WORD bfType; <br />DWORD bfSize; <br />WORD bfReserved1; <br />WORD bfReserved2; <br />DWORD bfOffBits; <br />} BITMAPFILEHEADER;</p>
</blockquote>
<p>其中的bfType值应该是&#8221;BM&#8221;(0x4d42)，标志该文件是位图文件。bfSize的值是位图文件的大小；<span><strong>bfOffBits是指从BITMAPFILEHEADER开始，直到位图像素数据存储点的内存大小（距离），即用bfOffBits &#8211; sizeof(BITMAPFILEHEADER)就能得到BITMAPINFO在位图中实际所占有的空间大小</strong></span>。</p>
<p>2、位图信息中所记录的值用于分配内存，设置调色板信息，读取像素值等。</p>
<p>以下是位图信息结构的定义：</p>
<blockquote><p>typedef struct tagBITMAPINFO { <br />BITMAPINFOHEADER bmiHeader; <br />RGBQUAD bmiColors[1]; <br />} BITMAPINFO;</p>
</blockquote>
<p>可见位图信息也是由两部分组成的：位图信息头 + 颜色表。</p>
<p>2.1 位图信息头</p>
<p>位图信息头包含了单个像素所用字节数以及描述颜色的格式，此外还包括位图的宽度、高度、目标设备的位平面数、图像的压缩格式。以下是位图信息头结构的定义：</p>
<blockquote><p>typedef struct tagBITMAPINFOHEADER{ // bmih <br />DWORD biSize; <br />LONG biWidth; <br />LONG biHeight; <br />WORD biPlanes; <br />WORD biBitCount <br />DWORD biCompression; <br />DWORD biSizeImage; <br />LONG biXPelsPerMeter; <br />LONG biYPelsPerMeter; <br />DWORD biClrUsed; <br />DWORD biClrImportant; <br />} BITMAPINFOHEADER;</p>
</blockquote>
<p>2.2 颜色表</p>
<p>颜色表一般是针对16位以下的图像而设置的，对于16位和16位以上的图像，由于其位图像素数据中直接对对应像素的RGB(A)颜色进行描述，因而省却了调色板。而对于16位以下的图像，由于其位图像素数据中记录的只是调色板索引值，因而需要根据这个索引到调色板去取得相应的RGB(A)颜色。颜色表的作用就是创建调色板。</p>
<p>颜色表是由颜色表项组成的，颜色表项结构的定义如下：</p>
<blockquote><p>typedef struct tagRGBQUAD { // rgbq <br />BYTE rgbBlue; <br />BYTE rgbGreen; <br />BYTE rgbRed; <br />BYTE rgbReserved; <br />} RGBQUAD;</p>
</blockquote>
<p>其中需要注意的问题是，RGBQUAD结构中的颜色顺序是BGR，而不是平常的RGB。</p>
<p>3、位图数据</p>
<p>最后，在位图文件头、位图信息头、位图颜色表之后，便是位图的主体部分：位图数据。根据不同的位图，位图数据所占据的字节数也是不同的：对于8位位图，每个字节代表了一个像素；对于16位位图，每两个字节代表了一个像素；对于24位位图，每三个字节代表了一个像素；对于32位位图，每四个字节代表了一个像素；而对于单色位图来说，每一位代表一个像素。</p>
<p><span><strong>这里有两点特别需要强调的：</strong></span></p>
<p>1) <strong>位图数据的字节数组是从图像的最下面一行开始逐行向上存储的，所以在选取源位图的实际范围的时候需要特别注意！</strong></p>
<p>我习惯先用一个函数，把位图数据读成一个和位图结构、方向相似的矩阵，即最先读出的位图数据，是矩阵的最后一行。</p>
<p>2) 存取位图数据的字节数组有个问题需要引起开发人员的注意：<strong>字节数组中每个扫描行的字节数必需是4的倍数(即是32位的倍数)，如果不足要用0补齐。</strong></p>
<p>举例说，我有一个20 * 20个点的单色位图。在保存位图的时候，第一行有20个点，虽然只需要用20位的数据来保存就可以了；但是，这个时候，不足32位，则需要用12位0来补足。</p>
<p>这样，总共需要 20 * (20 + 12) = 640 位来保存这一行，即需要用640/8 = 80个字节来保存整幅图像。</p>
<p><a href="http://www.vckbase.com/document/viewdoc/?id=674" target="_blank">VC知识库里的这篇文章</a>提供了一个位图操作的类，可以借鉴一下！</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.waterlin.org/articles/the-bitmap-detail-structure.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>在Visual Studio 2005里使用OpenCV库</title>
		<link>http://blog.waterlin.org/articles/using-opencv-in-visual-studio-2005.html</link>
		<comments>http://blog.waterlin.org/articles/using-opencv-in-visual-studio-2005.html#comments</comments>
		<pubDate>Mon, 29 Jun 2009 06:18:08 +0000</pubDate>
		<dc:creator>waterlin</dc:creator>
				<category><![CDATA[技术]]></category>
		<category><![CDATA[C++]]></category>

		<guid isPermaLink="false">http://blog.waterlin.org/articles/using-opencv-in-visual-studio-2005.html</guid>
		<description><![CDATA[据说绿坝里的图像识别用的是OpenCV这个库，作为图像处理专业出身的我，免不了对这个东西产生了一些兴趣。下载OpenCV下来用一用，看看这个东西效果如何。 更多的信息，请访问OpenCV的Wiki站点，例如如何在VC里编译OpenCV的官方文档等等。 下面就是我在Windows XP下，用Visual Studio 2005来使用OpenCV库的设置步骤： 第一步，下载和安装OpenCV库，根据操作系统下载相应的版本。 第二步，把OpenCV库的可执行文件路径加到系统的环境变量PATH里，在我这里是C:\Program Files\OpenCV\bin。 第三步，在Visual Studio 2005里进行必要的全局设置： 1) 在Visual Studio里，选择&#8221;Tools -&#62; Options&#8221;； 2) 在弹出的对话框里，再选择&#8221;Projects -&#62; VC++ Directories&#8221;； 3) 在上面的对话框里，从&#8221;Show Directories for&#8221;下拉框里选择&#8221;Library files&#8221;； 4) 在Library files列表里, 添加这样一个路径&#8221;C:\Program Files\OpenCV\lib&#8221;； 5) 从2)的对话框里选择&#8221;Include Files&#8221;下拉框，然后再添加以下目录： &#8220;C:\Program Files\OpenCV\cv\include&#8221; &#8220;C:\Program Files\OpenCV\cxcore\include&#8221; &#8220;C:\Program Files\OpenCV\otherlibs\highgui&#8221; &#8220;C:\Program Files\OpenCV\cvaux\include&#8221; &#8220;C:\Program Files\OpenCV\otherlibs\_graphics\include&#8221; 6) 选择下拉框里的&#8221;source files&#8221;，然后把下面的路径加进去： &#8220;C:\Program Files\OpenCV\cv\src&#8221; &#8220;C:\Program Files\OpenCV\cxcore\src&#8221; &#8220;C:\Program Files\OpenCV\cvaux\src&#8221; &#8220;C:\Program [...]]]></description>
			<content:encoded><![CDATA[<p>据说绿坝里的图像识别用的是OpenCV这个库，作为图像处理专业出身的我，免不了对这个东西产生了一些兴趣。下载OpenCV下来用一用，看看这个东西效果如何。</p>
<p>更多的信息，请访问<a title="OpenCV Wiki" href="http://opencv.willowgarage.com/wiki/" target="_blank">OpenCV的Wiki站点</a>，例如如何<a href="http://opencv.willowgarage.com/wiki/VisualC++" target="_blank">在VC里编译OpenCV</a>的官方文档等等。</p>
<p>下面就是我在Windows XP下，用Visual Studio 2005来使用OpenCV库的设置步骤：</p>
<p>第一步，<a href="http://sourceforge.net/projects/opencvlibrary/" target="_blank">下载和安装OpenCV库</a>，根据操作系统下载相应的版本。</p>
<p>第二步，把OpenCV库的可执行文件路径加到系统的环境变量PATH里，在我这里是C:\Program Files\OpenCV\bin。</p>
<p>第三步，在Visual Studio 2005里进行必要的全局设置：</p>
<p>1) 在Visual Studio里，选择&#8221;Tools -&gt; Options&#8221;；</p>
<p>2) 在弹出的对话框里，再选择&#8221;Projects -&gt; VC++ Directories&#8221;；</p>
<p>3) 在上面的对话框里，从&#8221;Show Directories for&#8221;下拉框里选择&#8221;Library files&#8221;；</p>
<p>4) 在Library files列表里, 添加这样一个路径&#8221;C:\Program Files\OpenCV\lib&#8221;；</p>
<p><img src="http://blog.waterlin.org/files/2009/06/4.png" alt="4.png" width="500" /></p>
<p>5) 从2)的对话框里选择&#8221;Include Files&#8221;下拉框，然后再添加以下目录：</p>
<blockquote><p>&#8220;C:\Program Files\OpenCV\cv\include&#8221;<br />
&#8220;C:\Program Files\OpenCV\cxcore\include&#8221;<br />
&#8220;C:\Program Files\OpenCV\otherlibs\highgui&#8221;<br />
&#8220;C:\Program Files\OpenCV\cvaux\include&#8221;<br />
&#8220;C:\Program Files\OpenCV\otherlibs\_graphics\include&#8221;</p></blockquote>
<p><img src="http://blog.waterlin.org/files/2009/06/5.png" alt="5.png"></p>
<p>6) 选择下拉框里的&#8221;source files&#8221;，然后把下面的路径加进去：</p>
<blockquote><p>&#8220;C:\Program Files\OpenCV\cv\src&#8221;<br />
&#8220;C:\Program Files\OpenCV\cxcore\src&#8221;<br />
&#8220;C:\Program Files\OpenCV\cvaux\src&#8221;<br />
&#8220;C:\Program Files\OpenCV\otherlibs\highgui&#8221;<br />
&#8220;C:\Program Files\OpenCV\otherlibs\_graphics\src&#8221;</p></blockquote>
<p><img src="http://blog.waterlin.org/files/2009/06/6.png" alt="6.png"></p>
<p>当然，你应该把上述路径替换成你自己的路径。就这样，Visual Studio 2005里的全局变量就配置好了。</p>
<p>第四步，完成了上述配置，就创建一个OpenCV工程来试一把。</p>
<p>创建一个名叫OpenCVHello的&#8221;Win32 Application&#8221;或是&#8221;Win32 console application&#8221;工程，如果想节省编译时间，建议把Precompiled header这个选项给选上。</p>
<p>把以下几个文件include进去，并且要放在stdafx.h文件后面，否则很可能会编译出错。</p>
<blockquote><p>#include &lt;cv.h&gt;<br />
#include &lt;cxcore.h&gt;<br />
#include &lt;highgui.h&gt;</p></blockquote>
<p>编译一下，应该可以成功。然后我们在主函数_tmain()输入一些OpenCV代码来试试：</p>
<blockquote><p>IplImage *img = cvLoadImage(&#8220;Image.bmp&#8221;);<br />
cvNamedWindow(&#8220;Image:&#8221;,1);<br />
cvShowImage(&#8220;Image:&#8221;, img);<br />
cvWaitKey();<br />
cvDestroyWindow(&#8220;Image:&#8221;);<br />
cvReleaseImage(&amp;img);</p></blockquote>
<p>编译一下，应该会提示一些链接错误的信息。这个时候，从&#8221;Project&#8221; -&gt; &#8220;Properties&#8221;打开项目工程的属性，在&#8221;Linker&#8221; -&gt; &#8220;Input&#8221; -&gt; &#8220;Additional Dependencies&#8221;里添加下面这些lib库：</p>
<blockquote><p>cxcore.lib cv.lib highgui.lib cvaux.lib cvcam.lib</p></blockquote>
<p><img src="http://blog.waterlin.org/files/2009/06/7.png" alt="7.png"></p>
<p>这样应该就可以编译了。整个代码看起来就像这样：</p>
<p><img src="http://blog.waterlin.org/files/2009/06/8.png" alt="8.png"></p>
<p>以后有空再深入研究一下OpenCV库的更多用法。</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.waterlin.org/articles/using-opencv-in-visual-studio-2005.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>在Cygwin里安装Turbo Vision库</title>
		<link>http://blog.waterlin.org/articles/install-turbo-vision-in-cygwin.html</link>
		<comments>http://blog.waterlin.org/articles/install-turbo-vision-in-cygwin.html#comments</comments>
		<pubDate>Fri, 19 Jun 2009 06:31:02 +0000</pubDate>
		<dc:creator>waterlin</dc:creator>
				<category><![CDATA[技术]]></category>

		<guid isPermaLink="false">http://blog.waterlin.org/articles/install-turbo-vision-in-cygwin.html</guid>
		<description><![CDATA[Turbo Vision库是一个tui库，在Windows下有很多种安装方法。你可以用Cygwin, MinGW+MSYS来编译。详细可以看看doc/install里的安装文档。 注意下载相应平台下的版本，Windows下，下载相应的BC++和MinGW版本；而Linux下或是Cygwin下，也有相应的版本。 在Windows下，可以在Cygwin里很简单地进行安装： $ ./configure $ make $ make install 安装完了后，进到目录example里，再把这些例子编译一把： $ make 如果编译成功了，就可以直接跑一跑这些例子了： $./demo/demo.exe]]></description>
			<content:encoded><![CDATA[<p><a href="http://tvision.sourceforge.net/" target="_blank">Turbo Vision</a>库是一个<a href="http://blog.waterlin.org/articles/tui-library-for-cplusplus.html" target="_blank">tui库</a>，在Windows下有很多种安装方法。你可以用Cygwin, MinGW+MSYS来编译。详细可以看看doc/install里的安装文档。</p>
<p>注意下载相应平台下的版本，Windows下，下载相应的BC++和MinGW版本；而Linux下或是Cygwin下，也有相应的版本。</p>
<p>在Windows下，可以在Cygwin里很简单地进行安装：</p>
<blockquote><p>$ ./configure <br />$ make <br />$ make install</p>
</blockquote>
<p>安装完了后，进到目录example里，再把这些例子编译一把：</p>
<blockquote><p>$ make</p>
</blockquote>
<p>如果编译成功了，就可以直接跑一跑这些例子了：</p>
<blockquote><p>$./demo/demo.exe</p>
</blockquote>
]]></content:encoded>
			<wfw:commentRss>http://blog.waterlin.org/articles/install-turbo-vision-in-cygwin.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>搭建本地SVN版本管理工具</title>
		<link>http://blog.waterlin.org/articles/create-local-svn-server.html</link>
		<comments>http://blog.waterlin.org/articles/create-local-svn-server.html#comments</comments>
		<pubDate>Mon, 25 May 2009 04:18:40 +0000</pubDate>
		<dc:creator>waterlin</dc:creator>
				<category><![CDATA[技术]]></category>

		<guid isPermaLink="false">http://blog.waterlin.org/articles/create-local-svn-server.html</guid>
		<description><![CDATA[整天在自己的电脑上写代码，然后再用ftp上传到服务器（没办法，服务器没有SVN这种高级玩意）。每次上传都不知道哪个文件修改了，导致我得停下来检查一下哪些文件上传了，十分痛苦。 另外，自己在本地写的一些小程序，还是需要经常备份一下，以防止哪天脑残修改出了一大堆的错误回溯不了就麻烦了。 因此，很有必要在本地也搭建一个代码版本管理工具，来帮助我们进行代码、文档的管理工作。 推荐使用SVN作为代码管理工具，搭个svn server，客户端用Tortoise svn，可以整合在资源管理器上面，还可以试试搭一个trac，在线比较差异和查看更改很方便。 下面我们来看看如何在Windows下搭建一个subversion服务器来方便自己的工作。 1) 搭建一个subversion服务器 在Windows下，推荐使用VisualSVN。这个发行版本的安装最简单了，包含了所有我们需要的模块，如subversion，Apache以及一个控制终端。安装很简单，一步一步安装完成即可。 2) 安装一个svbversion的客户端 在Windows下推荐用TortoiseSVN，我不觉得在命令行下一行一行地敲svn命令是一件很开心的事~~ 3) 管理你的内容 现在我们只要在VisualSVN里，创建一个代码Repositories，比如说，我现在要写一个Python的工程，创建一个名叫PythonCode的Repositories，设置好相关的属性后，我就用TortoiseSVN来check out这个Repositories。Check Out的地址就是TortoiseSVN在Repositories属性里提供给你的URL地址，类似于： https://WWW-81ECC445A0F:8443/svn/PythonCode/ 当然，你可以把计算机名换成localhost，即修改成如下地址： https://localhost:8443/svn/PythonCode/ 如果你喜欢用eclipse的话，用Subclipse作为svbversion的客户端也不错： 就这样，你在本地能清楚地看到你这次修改了哪些文件，只要把这些文件上传到服务器即可。这下就不用每次抓狂地回忆究竟修改了哪个文件！]]></description>
			<content:encoded><![CDATA[<p>整天在自己的电脑上写代码，然后再用ftp上传到服务器（没办法，服务器没有SVN这种高级玩意）。每次上传都不知道哪个文件修改了，导致我得停下来检查一下哪些文件上传了，十分痛苦。</p>
<p>另外，自己在本地写的一些小程序，还是需要经常备份一下，以防止哪天脑残修改出了一大堆的错误回溯不了就麻烦了。</p>
<p>因此，很有必要在本地也搭建一个代码版本管理工具，来帮助我们进行代码、文档的管理工作。</p>
<p>推荐使用SVN作为代码管理工具，搭个svn server，客户端用Tortoise svn，可以整合在资源管理器上面，还可以试试搭一个trac，在线比较差异和查看更改很方便。</p>
<p>下面我们来看看如何在Windows下搭建一个subversion服务器来方便自己的工作。</p>
<p>1) 搭建一个subversion服务器</p>
<p>在Windows下，推荐使用<a href="http://www.visualsvn.com/server/" target="_blank" title="VisualSVN Server">VisualSVN</a>。这个发行版本的安装最简单了，包含了所有我们需要的模块，如subversion，Apache以及一个控制终端。安装很简单，一步一步安装完成即可。</p>
<p>2) 安装一个svbversion的客户端</p>
<p>在Windows下推荐用<a href="http://tortoisesvn.tigris.org/" target="_blank" title="TortoiseSVN">TortoiseSVN</a>，我不觉得在命令行下一行一行地敲svn命令是一件很开心的事~~</p>
<p>3) 管理你的内容</p>
<p>现在我们只要在VisualSVN里，创建一个代码Repositories，比如说，我现在要写一个Python的工程，创建一个名叫PythonCode的Repositories，设置好相关的属性后，我就用TortoiseSVN来check out这个Repositories。Check Out的地址就是TortoiseSVN在Repositories属性里提供给你的URL地址，类似于：</p>
<blockquote><p><a href="https://www-81ecc445a0f:8443/svn/PythonCode/">https://WWW-81ECC445A0F:8443/svn/PythonCode/</a></p>
</blockquote>
<p>当然，你可以把计算机名换成localhost，即修改成如下地址：</p>
<blockquote><p><a href="https://localhost:8443/svn/PythonCode/">https://localhost:8443/svn/PythonCode/</a></p>
</blockquote>
<p>如果你喜欢用eclipse的话，用<a href="http://subclipse.tigris.org/" target="_blank" title="subclipse">Subclipse</a>作为svbversion的客户端也不错：</p>
<p>就这样，你在本地能清楚地看到你这次修改了哪些文件，只要把这些文件上传到服务器即可。这下就不用每次抓狂地回忆究竟修改了哪个文件！</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.waterlin.org/articles/create-local-svn-server.html/feed</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
	</channel>
</rss>
