<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" media="screen" href="/~d/styles/rss2full.xsl"?><?xml-stylesheet type="text/css" media="screen" href="http://feeds.feedburner.com/~d/styles/itemcontent.css"?><rss 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/" version="2.0">

<channel>
	<title>Spehio</title>
	
	<link>http://blog.spehio.info</link>
	<description>我叫杜晓三 | Ecology | Urban | Landscape | GIS | IT</description>
	<lastBuildDate>Wed, 01 Sep 2010 09:29:23 +0000</lastBuildDate>
	<generator>http://wordpress.org/?v=abc</generator>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="self" type="application/rss+xml" href="http://feeds.feedburner.com/Spehio" /><feedburner:info xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0" uri="spehio" /><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="hub" href="http://pubsubhubbub.appspot.com/" /><item>
		<title>SQL Server和PostgreSQL数据表的同步</title>
		<link>http://blog.spehio.info/archives/36222</link>
		<comments>http://blog.spehio.info/archives/36222#comments</comments>
		<pubDate>Sun, 29 Aug 2010 15:36:26 +0000</pubDate>
		<dc:creator>Spehio</dc:creator>
				<category><![CDATA[挨踢岁月]]></category>
		<category><![CDATA[PostgreSQL]]></category>
		<category><![CDATA[SQLServer]]></category>
		<category><![CDATA[同步]]></category>
		<category><![CDATA[触发器]]></category>
		<category><![CDATA[链接服务器]]></category>

		<guid isPermaLink="false">http://blog.spehio.info/?p=36222</guid>
		<description><![CDATA[最近帮另外一个课题组的项目实现了如题的一个小功能。
情况是这样，某垃圾场有一套相关数据的采集装置，两台工控机接着传感器，数据表汇总在现场的一台SQL Server服务器上，机器只有局域网没接入公网，采集程序由别的软件公司完成，但是我能拿到数据库的全部控制权。这边项目是一个WebGIS，数据库是PostgreSQL，他们想把现场数据库中一张表的部分数据实时更新到自己的这个数据库中。
因为之前手里有台气象站是利用RS232串口和DTU设备完成的远程数据实时传输，他们项目的老师想让我们也按照类似的方法实现他们想要的功能。考虑到原来的程序本来就不走串口通信传输数据以及其他的一些原因，重新设计了下面的方案。
1、 买了一个EDGE的Modem用于现场那台服务器的互联网接入，设备找的厦门本地一家企业叫四信通信的，产品、包装、销售和服务都很靠谱，拨号试了一下，速度凑合了。
2、为了能在SQL Server端把PostgreSQL的服务器添加成链接服务器，在装SQL Server的服务器上装了PostgreSQL的官方ODBC驱动叫psqlodbc，对应我这边PostgreSQL的版本是8.3。其他还有一些类似的驱动，比如呼声很高、对链接服务器支持更好的OLEDB驱动PGNP (PostgreSQL Native OLEDB Provider)，但是用的商业付费许可，虽然我没找到许可上哪儿有说付费对时间和功能上有什么限制，想想还是没有用，并且后面发现psqlodbc完成我要的一些基本功能也没啥问题。
3、添加链接服务器。不同的驱动有不用的接口，具体添加的参数以及对链接服务器数据库表的访问语句也有差异。使用psqlodbc的时候参考的是这篇，http://eddiecjc.blogspot.com/2009/05/set-up-postgresql-as-linked-server-in.html。自己写了一个更加完善的sql脚本。
DECLARE @LINKED_SERVER_NAME VARCHAR(MAX)
DECLARE @DATA_SOURCE VARCHAR(MAX)
DECLARE @PORT VARCHAR(MAX)
DECLARE @DATABASE VARCHAR(MAX)
DECLARE @USER VARCHAR(MAX)
DECLARE @PASSWD VARCHAR(MAX)
DECLARE @CNN_STR VARCHAR(MAX)
&#8211; Info
SET @LINKED_SERVER_NAME = N&#8216;postgresql_dump&#8217;
SET @DATA_SOURCE = N&#8216;***.***.***.***&#8217;
SET @PORT = N&#8216;5432&#8242;
SET @DATABASE = N&#8216;dump&#8217;
SET @USER = N&#8216;******&#8217;
SET @PASSWD = N&#8216;******&#8217;
SET @CNN_STR = N&#8216;Driver=PostgreSQL ANSI;uid=postgres;Server=&#8217; + @DATA_SOURCE + &#8216;;Port=&#8217; + @PORT + &#8216;;database=&#8217; + [...]]]></description>
			<content:encoded><![CDATA[<p>最近帮另外一个课题组的项目实现了如题的一个小功能。</p>
<p>情况是这样，某垃圾场有一套相关数据的采集装置，两台工控机接着传感器，数据表汇总在现场的一台SQL Server服务器上，机器只有局域网没接入公网，采集程序由别的软件公司完成，但是我能拿到数据库的全部控制权。这边项目是一个WebGIS，数据库是PostgreSQL，他们想把现场数据库中一张表的部分数据实时更新到自己的这个数据库中。</p>
<p>因为之前手里有台气象站是利用RS232串口和DTU设备完成的远程数据实时传输，他们项目的老师想让我们也按照类似的方法实现他们想要的功能。考虑到原来的程序本来就不走串口通信传输数据以及其他的一些原因，重新设计了下面的方案。</p>
<p>1、 买了一个EDGE的Modem用于现场那台服务器的互联网接入，设备找的厦门本地一家企业叫<a href="http://www.four-faith.com/" target="_blank">四信通信</a>的，产品、包装、销售和服务都很靠谱，拨号试了一下，速度凑合了。</p>
<p>2、为了能在SQL Server端把PostgreSQL的服务器添加成链接服务器，在装SQL Server的服务器上装了PostgreSQL的官方ODBC驱动叫<a href="http://www.postgresql.org/ftp/odbc/versions/msi/" target="_blank">psqlodbc</a>，对应我这边PostgreSQL的版本是8.3。其他还有一些类似的驱动，比如呼声很高、对链接服务器支持更好的OLEDB驱动<a href="http://www.pgoledb.com/" target="_blank">PGNP</a> (PostgreSQL Native OLEDB Provider)，但是用的商业付费许可，虽然我没找到许可上哪儿有说付费对时间和功能上有什么限制，想想还是没有用，并且后面发现<a href="http://www.postgresql.org/ftp/odbc/versions/msi/" target="_blank">psqlodbc</a>完成我要的一些基本功能也没啥问题。</p>
<p>3、添加链接服务器。不同的驱动有不用的接口，具体添加的参数以及对链接服务器数据库表的访问语句也有差异。使用psqlodbc的时候参考的是这篇，<a href="http://eddiecjc.blogspot.com/2009/05/set-up-postgresql-as-linked-server-in.html" target="_blank">http://eddiecjc.blogspot.com/2009/05/set-up-postgresql-as-linked-server-in.html</a>。自己写了一个更加完善的sql脚本。</p>
<blockquote><p><span style="color: #000080; font-weight: bold;">DECLARE</span> <span style="color: #000000;">@</span><span style="color: #000000;">LINKED_SERVER_NAME</span> <span style="color: #000000;">VARCHAR</span>(<span style="color: #000080; font-weight: bold;">MAX</span>)<br />
<span style="color: #000080; font-weight: bold;">DECLARE</span> <span style="color: #000000;">@</span><span style="color: #000000;">DATA_SOURCE</span> <span style="color: #000000;">VARCHAR</span>(<span style="color: #000080; font-weight: bold;">MAX</span>)<br />
<span style="color: #000080; font-weight: bold;">DECLARE</span> <span style="color: #000000;">@</span><span style="color: #000000;">PORT</span> <span style="color: #000000;">VARCHAR</span>(<span style="color: #000080; font-weight: bold;">MAX</span>)<br />
<span style="color: #000080; font-weight: bold;">DECLARE</span> <span style="color: #000000;">@</span><span style="color: #000080; font-weight: bold;">DATABASE</span> <span style="color: #000000;">VARCHAR</span>(<span style="color: #000080; font-weight: bold;">MAX</span>)<br />
<span style="color: #000080; font-weight: bold;">DECLARE</span> <span style="color: #000000;">@</span><span style="color: #000080; font-weight: bold;">USER</span> <span style="color: #000000;">VARCHAR</span>(<span style="color: #000080; font-weight: bold;">MAX</span>)<br />
<span style="color: #000080; font-weight: bold;">DECLARE</span> <span style="color: #000000;">@</span><span style="color: #000000;">PASSWD</span> <span style="color: #000000;">VARCHAR</span>(<span style="color: #000080; font-weight: bold;">MAX</span>)<br />
<span style="color: #000080; font-weight: bold;">DECLARE</span> <span style="color: #000000;">@</span><span style="color: #000000;">CNN_STR</span> <span style="color: #000000;">VARCHAR</span>(<span style="color: #000080; font-weight: bold;">MAX</span>)</p>
<p><span style="color: #008800; font-style: italic;">&#8211; Info</span></p>
<p><span style="color: #000080; font-weight: bold;">SET</span> <span style="color: #000000;">@</span><span style="color: #000000;">LINKED_SERVER_NAME</span> <span style="color: #000000;">=</span> N<span style="color: #0000ff;">&#8216;postgresql_dump&#8217;</span><br />
<span style="color: #000080; font-weight: bold;">SET</span> <span style="color: #000000;">@</span><span style="color: #000000;">DATA_SOURCE</span> <span style="color: #000000;">=</span> N<span style="color: #0000ff;">&#8216;***.***.***.***&#8217;</span><br />
<span style="color: #000080; font-weight: bold;">SET</span> <span style="color: #000000;">@</span><span style="color: #000000;">PORT</span> <span style="color: #000000;">=</span> N<span style="color: #0000ff;">&#8216;5432&#8242;</span><br />
<span style="color: #000080; font-weight: bold;">SET</span> <span style="color: #000000;">@</span><span style="color: #000080; font-weight: bold;">DATABASE</span> <span style="color: #000000;">=</span> N<span style="color: #0000ff;">&#8216;dump&#8217;</span><br />
<span style="color: #000080; font-weight: bold;">SET</span> <span style="color: #000000;">@</span><span style="color: #000080; font-weight: bold;">USER</span> <span style="color: #000000;">=</span> N<span style="color: #0000ff;">&#8216;******&#8217;</span><br />
<span style="color: #000080; font-weight: bold;">SET</span> <span style="color: #000000;">@</span><span style="color: #000000;">PASSWD</span> <span style="color: #000000;">=</span> N<span style="color: #0000ff;">&#8216;******&#8217;</span><br />
<span style="color: #000080; font-weight: bold;">SET</span> <span style="color: #000000;">@</span><span style="color: #000000;">CNN_STR</span> <span style="color: #000000;">=</span> N<span style="color: #0000ff;">&#8216;Driver=PostgreSQL ANSI;uid=postgres;Server=&#8217;</span> <span style="color: #000000;">+</span> <span style="color: #000000;">@</span><span style="color: #000000;">DATA_SOURCE</span> <span style="color: #000000;">+</span> <span style="color: #0000ff;">&#8216;;Port=&#8217;</span> <span style="color: #000000;">+</span> <span style="color: #000000;">@</span><span style="color: #000000;">PORT</span> <span style="color: #000000;">+</span> <span style="color: #0000ff;">&#8216;;database=&#8217;</span> <span style="color: #000000;">+</span> <span style="color: #000000;">@</span><span style="color: #000080; font-weight: bold;">DATABASE</span></p>
<p><span style="color: #008800; font-style: italic;">&#8211; Drop Linked Server</span></p>
<p><span style="color: #000000;">IF</span> <span style="color: #000080; font-weight: bold;">EXISTS</span> (<span style="color: #000080; font-weight: bold;">SELECT</span> <span style="color: #000000;">srv</span><span style="color: #000000;">.</span><span style="color: #000000;">name</span> <span style="color: #000080; font-weight: bold;">FROM</span> <span style="color: #000000;">sys</span><span style="color: #000000;">.</span><span style="color: #000000;">servers</span> <span style="color: #000000;">srv</span><br />
<span style="color: #000080; font-weight: bold;">WHERE</span> <span style="color: #000000;">srv</span><span style="color: #000000;">.</span><span style="color: #000000;">server_id</span> <span style="color: #000000;">!=</span> <span style="color: #0000ff;">0</span> <span style="color: #000080; font-weight: bold;">AND</span> <span style="color: #000000;">srv</span><span style="color: #000000;">.</span><span style="color: #000000;">name</span> <span style="color: #000000;">=</span> <span style="color: #000000;">@</span><span style="color: #000000;">LINKED_SERVER_NAME</span>)<br />
<span style="color: #000080; font-weight: bold;">EXEC</span> <span style="color: #000000;">master</span><span style="color: #000000;">.</span><span style="color: #000000;">dbo</span><span style="color: #000000;">.</span><span style="color: #000000;">sp_dropserver</span> <span style="color: #000000;">@</span><span style="color: #000000;">server</span><span style="color: #000000;">=@</span><span style="color: #000000;">LINKED_SERVER_NAME</span><span style="color: #000000;">,</span> <span style="color: #000000;">@</span><span style="color: #000000;">droplogins</span><span style="color: #000000;">=</span><span style="color: #0000ff;">&#8216;droplogins&#8217;</span></p>
<p><span style="color: #008800; font-style: italic;">&#8211; Create Linked Server</span></p>
<p><span style="color: #000080; font-weight: bold;">EXEC</span> <span style="color: #000000;">sp_addlinkedserver</span><br />
<span style="color: #000000;">@</span><span style="color: #000000;">server</span> <span style="color: #000000;">=</span> <span style="color: #000000;">@</span><span style="color: #000000;">LINKED_SERVER_NAME</span><span style="color: #000000;">,</span><br />
<span style="color: #000000;">@</span><span style="color: #000000;">srvproduct</span> <span style="color: #000000;">=</span> N<span style="color: #0000ff;">&#8216;PostgreSQL&#8217;</span><span style="color: #000000;">,</span><br />
<span style="color: #000000;">@</span><span style="color: #000000;">provider</span> <span style="color: #000000;">=</span> N<span style="color: #0000ff;">&#8216;MSDASQL&#8217;</span><span style="color: #000000;">,</span><br />
<span style="color: #000000;">@</span><span style="color: #000000;">provstr</span> <span style="color: #000000;">=</span> <span style="color: #000000;">@</span><span style="color: #000000;">CNN_STR</span>;</p>
<p><span style="color: #000080; font-weight: bold;">EXEC</span> <span style="color: #000000;">sp_addlinkedsrvlogin</span><br />
<span style="color: #000000;">@</span><span style="color: #000000;">rmtsrvname</span> <span style="color: #000000;">=</span> <span style="color: #000000;">@</span><span style="color: #000000;">LINKED_SERVER_NAME</span><span style="color: #000000;">,</span><br />
<span style="color: #000000;">@</span><span style="color: #000000;">useself</span> <span style="color: #000000;">=</span> <span style="color: #0000ff;">&#8216;false&#8217;</span><span style="color: #000000;">,</span><br />
<span style="color: #000000;">@</span><span style="color: #000000;">rmtuser</span> <span style="color: #000000;">=</span> <span style="color: #000000;">@</span><span style="color: #000080; font-weight: bold;">USER</span><span style="color: #000000;">,</span><br />
<span style="color: #000000;">@</span><span style="color: #000000;">rmtpassword</span> <span style="color: #000000;">=</span> <span style="color: #000000;">@</span><span style="color: #000000;">PASSWD</span>;</p></blockquote>
<p>psqlodbc只能用OpenQuery的方式打开链接数据库的表，修改数据的SQL语句也不是常规的写法，而OpenQuery又不支持动态参数，所以后面触发器部分的代码就就有点冗长。PGNP 对链接数据库的支持就好多了，这篇帖子 <a href="http://www.pgoledb.com/forum/viewtopic.php?f=4&amp;t=6&amp;sid=5b828145828112a154a0ed88508a9913" target="_blank">http://www.pgoledb.com/forum/viewtopic.php?f=4&amp;t=6&amp;sid=5b828145828112a154a0ed88508a9913</a> 非常合理，示例基本都全了，可以不用OpenQuery语句了。</p>
<p>然后是要打开分布式服务，开始-&gt;所有程序-&gt;管理工具-&gt;组件服务，在目录树组件服务-&gt;计算机-&gt;我的电脑上右击点属性，MSDTC-&gt;安全配置-&gt;勾选启动XA事务。这样就能对链接数据库进行UPDATE和DELETE操作了。</p>
<p>4、写触发器。本来是可以INSERT、UPDATE和DELETE写在一起，但是可能只需要用到INSERT，后面两个未必需要，暂时都分开写了。触发器本身比较简单，关键是对链接数据库进行SELECT、INSERT、UPDATE和DELETE操作的方法有些特别，顺着这篇 <a href="http://support.microsoft.com/kb/270119/en-us/" target="_blank">http://support.microsoft.com/kb/270119/en-us/</a> 看就能理顺了。其中INSERT是最简单的，把inserted表里面的数据直接插入，一句话搞定。DELETE麻烦点，要用游标遍历deleted表里面的记录，然后把字段值取出来再拼OpenQuery语句的字符串，最后用EXEC命令执行，就像下面这样。</p>
<blockquote><p>DECLARE @ID INT<br />
DECLARE @CMD VARCHAR(2000)</p>
<p>DECLARE cur CURSOR FOR SELECT id FROM deleted<br />
Open cur<br />
FETCH next FROM cur INTO @ID<br />
WHILE @@fetch_status = 0<br />
BEGIN<br />
SET @CMD = &#8216;DELETE OPENQUERY(postgresql_dump, &#8221;SELECT * FROM weight_simple WHERE id = &#8216; + convert(VARCHAR(20),@ID) + &#8221;&#8217;)&#8217;<br />
EXEC (@CMD)<br />
FETCH next FROM cur INTO @ID<br />
END<br />
Close Cur<br />
Deallocate Cur</p></blockquote>
<p>当然还有更麻烦的是UPDATE的写法，他不支持从SELECT子表更新多项，所以我每一项值都得用SELECT赋值给变量然后拼SET的字符串，最讨厌的是我有两项是datetime类型，于是我就来回把datetime转成varchar再转成datetime再转成varchar，这段不贴了，太乱。</p>
<p>5、到这里基本就完成了，因为SQL Server装在Sever 2003上，跑上去设置一下本机的IP安全策略，弄成只允许访问原先的内网网段和PostgreSQL服务器IP和端口，具体的一些安全策略不懂，我就是不想突然冒出来个系统更新，然后刷刷地用我扔在MODEM里的手机卡流量。</p>
<p><span style="color: #000000;">恩，完了，下周去现场安装一下看会不会出现什么没想到的问题。</span></p>
]]></content:encoded>
			<wfw:commentRss>http://blog.spehio.info/archives/36222/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>胸无大志</title>
		<link>http://blog.spehio.info/archives/36219</link>
		<comments>http://blog.spehio.info/archives/36219#comments</comments>
		<pubDate>Tue, 27 Jul 2010 11:05:19 +0000</pubDate>
		<dc:creator>Spehio</dc:creator>
				<category><![CDATA[碎语而已]]></category>

		<guid isPermaLink="false">http://blog.spehio.info/?p=36219</guid>
		<description><![CDATA[也许是应了生于忧患死于安乐吧，从上个周末回所到现在，一点斗志都没有。
去黎川住了一晚，给小鸭和她爸上坟，相当简易的两块墓碑，连照片都没有，周围杂草丛生，两捧鲜花跟周围格格不入，点上三炷香，看着小鸭的名字完全不知道在想什么，我觉得我还是不太能接受她去世的消息，默然一会儿之后跟她弟弟妹妹一起就回去了。之前有听说南昌人待客很热情，标准就是把客人灌翻，不过还好她家亲戚都远离黎川县城，小弟也比较内向，她妈妈买了两瓶啤酒都我自己一个人喝了。晚上没有住她家，在一挺不错的宾馆睡了一觉，居然只花了八十块钱。
黎川回来在南昌住了两个晚上等飞机，其实从黎川直奔厦门的汽车也挺方便，只是开始不知道，提前定好了机票。
周日的晚上到所，各种我预计的安排都没有落实，还差点没宿舍住。
总而言之，从安顿好到现在，一直没有任何斗志。我晚上不加班干活儿，各种逛街，工作日翘班出去逛商场，周末出去逛小店，这就是一个胸无大志的人发现好久没更新博客而写的一篇。
]]></description>
			<content:encoded><![CDATA[<p>也许是应了生于忧患死于安乐吧，从上个周末回所到现在，一点斗志都没有。</p>
<p>去黎川住了一晚，给小鸭和她爸上坟，相当简易的两块墓碑，连照片都没有，周围杂草丛生，两捧鲜花跟周围格格不入，点上三炷香，看着小鸭的名字完全不知道在想什么，我觉得我还是不太能接受她去世的消息，默然一会儿之后跟她弟弟妹妹一起就回去了。之前有听说南昌人待客很热情，标准就是把客人灌翻，不过还好她家亲戚都远离黎川县城，小弟也比较内向，她妈妈买了两瓶啤酒都我自己一个人喝了。晚上没有住她家，在一挺不错的宾馆睡了一觉，居然只花了八十块钱。</p>
<p>黎川回来在南昌住了两个晚上等飞机，其实从黎川直奔厦门的汽车也挺方便，只是开始不知道，提前定好了机票。</p>
<p>周日的晚上到所，各种我预计的安排都没有落实，还差点没宿舍住。</p>
<p>总而言之，从安顿好到现在，一直没有任何斗志。我晚上不加班干活儿，各种逛街，工作日翘班出去逛商场，周末出去逛小店，这就是一个胸无大志的人发现好久没更新博客而写的一篇。</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.spehio.info/archives/36219/feed</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
		<item>
		<title>一隅偏居</title>
		<link>http://blog.spehio.info/archives/36214</link>
		<comments>http://blog.spehio.info/archives/36214#comments</comments>
		<pubDate>Thu, 01 Jul 2010 09:38:32 +0000</pubDate>
		<dc:creator>Spehio</dc:creator>
				<category><![CDATA[碎语而已]]></category>

		<guid isPermaLink="false">http://blog.spehio.info/?p=36214</guid>
		<description><![CDATA[玉泉是个有意思的地方，荒凉得符合四环外的城乡结合部，同时又沾上长安街延长线起点的那一点喧闹，北京的第一年就在这里过了。
习惯计划，早就认定要过一年深居简出的日子，宿舍分配也是那样的给面子，直接住在校外一个的深宅大院，虽说洗个澡都要跋山涉水从海淀区跨越到石景山，但这是一个除了走廊歌手的嗓音以外听不到任何噪音的院子，窗外是原住民的自留地，有丝瓜有葫芦还有柿子，着实符合我的生活理想。
在深居简出的日子里，主要的行程就是过条双向马路去研究生院上课了，我本是好学之人，奈何却不是一个好听课之人，只是所选之课比大学课堂多了很多可以台下发言的机会，算是一个坚持听课的理由吧，因为实际上说，选的课里面除了名字极富感召力之外，内容方面平均给个七十好了。课程是不能深入讨论的，也许真的是良莠不齐，而我偏偏是圣手点睛，所以就只怀念一下本科数学系那帮敬业的爷爷们了。
丰富多彩的日子可以如白驹过隙，大隐于市的生活也同样是弹指一挥间，一下子便是来年四月，一号是愚人节，五号是清明节，十四号，是我提前回所暂住的那天。
我呆过静谧的小县城，乱哄哄的城郊，繁华的市中心，我知道住在号称中国最繁华都市的市中心是怎样，也知道挤号称中国最发达的公共交通上下班是怎样，于是我就更喜欢偏居一隅，尤其在那个被师兄师姐称作杏林湾的地方呆过十八天之后。
《桃花源记》有说武陵捕鱼人，过入口，“复行数十步，豁然开朗。土地平旷，屋舍俨然，有良田美池桑竹之属。阡陌交通，鸡犬相闻。”当晚乘车进入园区便恍惚有此同感，楼宇错落，景观灯弱光粼粼，小桥流水，蛙声一片。去的日子也好，白天的风景和温度绝配引壶觞而眄庭柯，欣欣向荣之木，涓涓始流之河，我第一个念头就是不想回去了。
经师兄点拨，所里过两天都会发生的一点变化就是一夜之间会多两棵小树或是新竹，如果说刻在石头上忠诚尽责的所训是一种硬朗的文化，那么这里树若大材，竹为君子，钟灵毓秀，种树者有心，赏竹者留意的便是另一种春雨润物了。想起来以前学校校园里面熙熙攘攘一些半道移植的树，再对比隔壁同样是百年校园里成排的二人合抱大树，越发觉得没亏。
如果每天都只是闲庭散步，仰望星空，那么就该有人轰我走了。实际的日子过得其实都差不多，看文献写代码爬格子的场所从宿舍变成了七楼办公室，从每天对着十二寸的显示器到二十二的，按点儿的起床，刷牙洗脸，啃骨头嚼青菜，更衣睡觉。不闹不乱，有条不紊，我大爱偏居。
正如前面说的，单一的生活过着就像一块钱的硬币那样用得快，选择在临走前的一天去岛内小逛，当然没有小姑娘的陪同，我只有选择一路吃过去，本着跑得了和尚跑不了庙的想法，反正不用一次都吃遍，一路看啥顺眼吃啥，能记起来的有黄则和、土笋冻、沙茶面、章鱼烧等，八十四公斤体重的好处就是肚子容量也比较大。
数摸着在北京呆的日子快到头了，想着又要回去了，心中就充满欣喜，新所是第四年，我的新生活是第一年，一块儿往好里奔吧，跟园区里的小树小竹子们。
//所里出第二期电子刊物，学姐让写篇文章，就是上面这篇了。好久没心思动笔了，再过两周彻底离京回所去了。
]]></description>
			<content:encoded><![CDATA[<p>玉泉是个有意思的地方，荒凉得符合四环外的城乡结合部，同时又沾上长安街延长线起点的那一点喧闹，北京的第一年就在这里过了。</p>
<p>习惯计划，早就认定要过一年深居简出的日子，宿舍分配也是那样的给面子，直接住在校外一个的深宅大院，虽说洗个澡都要跋山涉水从海淀区跨越到石景山，但这是一个除了走廊歌手的嗓音以外听不到任何噪音的院子，窗外是原住民的自留地，有丝瓜有葫芦还有柿子，着实符合我的生活理想。</p>
<p>在深居简出的日子里，主要的行程就是过条双向马路去研究生院上课了，我本是好学之人，奈何却不是一个好听课之人，只是所选之课比大学课堂多了很多可以台下发言的机会，算是一个坚持听课的理由吧，因为实际上说，选的课里面除了名字极富感召力之外，内容方面平均给个七十好了。课程是不能深入讨论的，也许真的是良莠不齐，而我偏偏是圣手点睛，所以就只怀念一下本科数学系那帮敬业的爷爷们了。</p>
<p>丰富多彩的日子可以如白驹过隙，大隐于市的生活也同样是弹指一挥间，一下子便是来年四月，一号是愚人节，五号是清明节，十四号，是我提前回所暂住的那天。</p>
<p>我呆过静谧的小县城，乱哄哄的城郊，繁华的市中心，我知道住在号称中国最繁华都市的市中心是怎样，也知道挤号称中国最发达的公共交通上下班是怎样，于是我就更喜欢偏居一隅，尤其在那个被师兄师姐称作杏林湾的地方呆过十八天之后。</p>
<p>《桃花源记》有说武陵捕鱼人，过入口，“复行数十步，豁然开朗。土地平旷，屋舍俨然，有良田美池桑竹之属。阡陌交通，鸡犬相闻。”当晚乘车进入园区便恍惚有此同感，楼宇错落，景观灯弱光粼粼，小桥流水，蛙声一片。去的日子也好，白天的风景和温度绝配引壶觞而眄庭柯，欣欣向荣之木，涓涓始流之河，我第一个念头就是不想回去了。</p>
<p>经师兄点拨，所里过两天都会发生的一点变化就是一夜之间会多两棵小树或是新竹，如果说刻在石头上忠诚尽责的所训是一种硬朗的文化，那么这里树若大材，竹为君子，钟灵毓秀，种树者有心，赏竹者留意的便是另一种春雨润物了。想起来以前学校校园里面熙熙攘攘一些半道移植的树，再对比隔壁同样是百年校园里成排的二人合抱大树，越发觉得没亏。</p>
<p>如果每天都只是闲庭散步，仰望星空，那么就该有人轰我走了。实际的日子过得其实都差不多，看文献写代码爬格子的场所从宿舍变成了七楼办公室，从每天对着十二寸的显示器到二十二的，按点儿的起床，刷牙洗脸，啃骨头嚼青菜，更衣睡觉。不闹不乱，有条不紊，我大爱偏居。</p>
<p>正如前面说的，单一的生活过着就像一块钱的硬币那样用得快，选择在临走前的一天去岛内小逛，当然没有小姑娘的陪同，我只有选择一路吃过去，本着跑得了和尚跑不了庙的想法，反正不用一次都吃遍，一路看啥顺眼吃啥，能记起来的有黄则和、土笋冻、沙茶面、章鱼烧等，八十四公斤体重的好处就是肚子容量也比较大。</p>
<p>数摸着在北京呆的日子快到头了，想着又要回去了，心中就充满欣喜，新所是第四年，我的新生活是第一年，一块儿往好里奔吧，跟园区里的小树小竹子们。</p>
<p>//所里出第二期电子刊物，学姐让写篇文章，就是上面这篇了。好久没心思动笔了，再过两周彻底离京回所去了。</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.spehio.info/archives/36214/feed</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>比较完美地解决了linux下ssh tunnel的连接保持问题</title>
		<link>http://blog.spehio.info/archives/36195</link>
		<comments>http://blog.spehio.info/archives/36195#comments</comments>
		<pubDate>Sat, 20 Mar 2010 13:37:27 +0000</pubDate>
		<dc:creator>Spehio</dc:creator>
				<category><![CDATA[挨踢岁月]]></category>
		<category><![CDATA[linux]]></category>
		<category><![CDATA[ssh]]></category>

		<guid isPermaLink="false">http://blog.spehio.info/?p=36195</guid>
		<description><![CDATA[对我来说，ssh tunnel就是用来那啥的。ssh连接有个最大问题就是没有断线重连机制，在win下面有以myentunnel为代表的软件来看着它所调用plink.exe来建立的ssh连接是否正常，断线就重新调用一下。
Linux也有类似的东西，Gnome下面有个Gnome SHH Tunnel Manager，简称gstm的能实现，缺点是密码不能保存，每次都要自己输入，且依赖图形界面。KDE下面也有一个，名字很有喜感，叫kstm，就是KDE SSH Tunnel Manager，另外还有一个，忘名字了，暂时找不到，但是遗憾的是没有Xfce SSH Tunnel Manager这个神物。
上网一搜，有类似的方案，主要都是来源于这篇文章，对我来说这个方案并不能完全满足我的需求，第一我不想在桌面上专门开个终端（因为expect是需要与屏幕显示交互的，因此不能后台运行），第二他只是发送字符防止超时断开连接，强壮性不够，下面是改进过的脚本。
Bash语言: 感谢代码发芽网
01 #!/usr/bin/expect
02
03 set timeout 60
04
05 while (1) {
06  spawn /usr/bin/ssh -D 7070 -g ****@*****.****
07  expect {
08 &#8220;*(yes/no)?&#8221; {
09  send &#8220;yes\r\n&#8221;
10  expect &#8220;*password:&#8221; send &#8220;****\r\n&#8221;
11 }
12 &#8220;*password:&#8221; {
13  send &#8220;****\r\n&#8221;
14 }
15 }
16  interact { timeout send &#8220;\r\n&#8221; }
17 wait
18 [...]]]></description>
			<content:encoded><![CDATA[<p>对我来说，ssh tunnel就是用来那啥的。ssh连接有个最大问题就是没有断线重连机制，在win下面有以myentunnel为代表的软件来看着它所调用plink.exe来建立的ssh连接是否正常，断线就重新调用一下。</p>
<p>Linux也有类似的东西，Gnome下面有个Gnome SHH Tunnel Manager，简称gstm的能实现，缺点是密码不能保存，每次都要自己输入，且依赖图形界面。KDE下面也有一个，名字很有喜感，叫kstm，就是KDE SSH Tunnel Manager，另外还有一个，忘名字了，暂时找不到，但是遗憾的是没有Xfce SSH Tunnel Manager这个神物。</p>
<p>上网一搜，有类似的方案，主要都是来源于<a href="http://pengyulong.com/yy/309.times" target="_blank">这篇</a>文章，对我来说这个方案并不能完全满足我的需求，第一我不想在桌面上专门开个终端（因为expect是需要与屏幕显示交互的，因此不能后台运行），第二他只是发送字符防止超时断开连接，强壮性不够，下面是改进过的脚本。</p>
<div style="background: #fdfdfd none repeat scroll 0% 0%; -moz-background-clip: border; -moz-background-origin: padding; -moz-background-inline-policy: continuous; color: black;"><span style="text-decoration: underline;">Bash语言</span>: <a href="http://fayaa.com/code/view//">感谢代码发芽网</a></div>
<div class="source" style="font-family: &quot;Courier New&quot;,&quot;Bitstream Vera Sans Mono&quot;,&quot;monospace&quot;; color: #000000; background-color: #f9f7ed;"><span style="color: #aaaaaa; font-style: italic;">01</span> <span style="color: #aaaaaa; font-style: italic;">#!/usr/bin/expect</span><br />
<span style="color: #aaaaaa; font-style: italic;">02</span><br />
<span style="color: #aaaaaa; font-style: italic;">03</span> <span style="color: #00aaaa;">set </span><span style="color: #000000;">timeout 60</span><br />
<span style="color: #aaaaaa; font-style: italic;">04</span><br />
<span style="color: #f810b0;">05</span> <span style="color: #0000aa;">while</span> (<span style="color: #000000;">1</span>) <span style="color: #000000;">{</span><br />
<span style="color: #aaaaaa; font-style: italic;">06</span> <span style="color: #000000;"> spawn /usr/bin/ssh -D 7070 -g ****@*****.****</span><br />
<span style="color: #aaaaaa; font-style: italic;">07</span> <span style="color: #000000;"> expect </span><span style="color: #000000;">{</span><br />
<span style="color: #aaaaaa; font-style: italic;">08</span> <span style="color: #aa5500;">&#8220;*(yes/no)?&#8221;</span> <span style="color: #000000;">{</span><br />
<span style="color: #aaaaaa; font-style: italic;">09</span> <span style="color: #000000;"> send </span><span style="color: #aa5500;">&#8220;yes\r\n&#8221;</span><br />
<span style="color: #f810b0;">10</span> <span style="color: #000000;"> expect </span><span style="color: #aa5500;">&#8220;*password:&#8221;</span><span style="color: #000000;"> send </span><span style="color: #aa5500;">&#8220;****\r\n&#8221;</span><br />
<span style="color: #aaaaaa; font-style: italic;">11</span> <span style="color: #000000;">}</span><br />
<span style="color: #aaaaaa; font-style: italic;">12</span> <span style="color: #aa5500;">&#8220;*password:&#8221;</span> <span style="color: #000000;">{</span><br />
<span style="color: #aaaaaa; font-style: italic;">13</span> <span style="color: #000000;"> send </span><span style="color: #aa5500;">&#8220;****\r\n&#8221;</span><br />
<span style="color: #aaaaaa; font-style: italic;">14</span> <span style="color: #000000;">}</span><br />
<span style="color: #f810b0;">15</span> <span style="color: #000000;">}</span><br />
<span style="color: #aaaaaa; font-style: italic;">16</span> <span style="color: #000000;"> interact </span><span style="color: #000000;">{</span><span style="color: #000000;"> timeout send </span><span style="color: #aa5500;">&#8220;\r\n&#8221;</span> <span style="color: #000000;">}</span><br />
<span style="color: #aaaaaa; font-style: italic;">17</span> <span style="color: #00aaaa;">wait</span><br />
<span style="color: #aaaaaa; font-style: italic;">18</span> <span style="color: #000000;">}</span></div>
<p>一是加了第一次登录时确认密钥的步骤，二是用while和wait来实现这条ssh连接结束后，能重新再连接一次，除非脚本进程被干掉，不然不管是在终端里面输入了exit还是kill掉该进程都是能原地满血满状态复活的。</p>
<p>chmod +x这个脚本文件，然后Ctrl+Alt+F1切换到字符界面，Alt+F2打开个新终端，执行这个脚本，再Alt+F7切回来，然后就ok了，灰常的好。</p>
<p>最后，这个做法对于被设置了不允许运行shell的帐号应该是不行。</p>
<p>＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝</p>
<h1><span style="color: #ff0000;">最近更新，以上都是废话，用autossh就好了，完毕。</span></h1>
]]></content:encoded>
			<wfw:commentRss>http://blog.spehio.info/archives/36195/feed</wfw:commentRss>
		<slash:comments>6</slash:comments>
		</item>
		<item>
		<title>ArcEngine下面做了一个多MapControl联动的效果</title>
		<link>http://blog.spehio.info/archives/36183</link>
		<comments>http://blog.spehio.info/archives/36183#comments</comments>
		<pubDate>Wed, 10 Mar 2010 02:21:15 +0000</pubDate>
		<dc:creator>Spehio</dc:creator>
				<category><![CDATA[挨踢岁月]]></category>
		<category><![CDATA[ArcEngine]]></category>
		<category><![CDATA[C#]]></category>

		<guid isPermaLink="false">http://blog.spehio.info/?p=36183</guid>
		<description><![CDATA[昨天下午下了课，老板给打电话来说帮师兄研究一下如何实现这样如题的功能，具体情境是拿C#用ArcEngine做二次开发的时候，他要开四个MapControl控件，分别显示大气、土壤等等的信息，在每个地图容器里面拖拽放大的时候，其他容器里面的地图联动，鼠标也要在四个窗口里面同步显示。
好的，分成三步来做。以两个MapControl联动为例，做窗口上放了两个ArcGIS Engine MapControl控件，分别命名Map1和Map2。
先实现地图联动，每当地图位置、比例尺发生变化的时候，会触发MapControl的OnExtentUpdated事件，在Map1的响应函数里面写：

Map2.Extent = (IEnvelope)e.newEnvelope;

Map2同理，这样就好了。之前有试过Map2.Extent = Map1.Extent.Envelope的用法，但是联动的时候慢半拍。
接着实现同步操作状态，即鼠标进入MapControl控件的时候，保持一致的漫游、放大、缩小等功能。再放两个ArcGIS Engine ToolBarControl控件，分别命名Bar1和Bar2，添加好漫游、放大、缩小、全图四个按钮，并绑定对应的MapControl控件。
实现的原理是当按下一个ToolBar上按钮的时候，让别的ToolBar的该按钮也处于按下状态。在ToolBar的OnItemClick事件里面写，这里有一点要注意的是ToolBar里面的全图按钮算Command不算Tool（AO里面的强行不合理分类，Command是按下就弹起的按钮，Tool是按下后保持状态的。），在代码里面利用e.index把他排除在同步操作的状态以外。关键代码如下

Bar2.CurrentTool = Bar2.GetItem(e.index).Command as ITool;

Bar1同理，这样效果就出来了。前面几次操作在显示上略有点小问题，我归结到AE的Bug里面，多点几次基本就是无缝同步了，最后出成品的时候，隐藏到其他的ToolBar就好了。
鼠标这个功能比较麻烦，我试过用PicureBox装在个鼠标图片然后用位置控制的方法，但是PictrueBox本身不透明，效果不好，况且暂时也不需要也没必要实现同时弹出右键菜单，跟师兄沟通了一下决定改用在其他地图容器里面画一个大的十字丝来作为鼠标的定位显示，这个功能用NewLineFeedbackClass来实现。
首先做定义两个接口。

private IDisplayFeedback pDisplayFeedback1 = null;
private IScreenDisplay pScreenDisplay1 = null;
在窗体的构造函数里面添加初始化的代码。

pDisplayFeedback1 = new NewLineFeedbackClass();
pScreenDisplay1 = Map1.ActiveView.ScreenDisplay;
pDisplayFeedback1.Display = pScreenDisplay1;
在Map2的OnMouseMove事件里面写响应代码。

((INewLineFeedback)pDisplayFeedback1).Stop(); //结束之前的绘制，DisplayFeedback在执行Start()方法之后开始画，Stop()之后就清掉了。
//下面是画十字丝的，因为没有NewMultiLineFeedbackClass，这个十字丝只能一笔画成，所以就只能在显示区域外面多画了一点。
((INewLineFeedback)pDisplayFeedback1).Start(Map1.ActiveView.ScreenDisplay.
DisplayTransformation.ToMapPoint(0, e.y));
((INewLineFeedback)pDisplayFeedback1).AddPoint(Map1.ActiveView.ScreenDisplay.
DisplayTransformation.ToMapPoint(Map1.Width + 1, e.y));
((INewLineFeedback)pDisplayFeedback1).AddPoint(Map1.ActiveView.ScreenDisplay.
DisplayTransformation.ToMapPoint(Map1.Width + 1, -1));
((INewLineFeedback)pDisplayFeedback1).AddPoint(Map1.ActiveView.ScreenDisplay.
DisplayTransformation.ToMapPoint(e.x, -1));
((INewLineFeedback)pDisplayFeedback1).AddPoint(Map1.ActiveView.ScreenDisplay.
DisplayTransformation.ToMapPoint(e.x, Map1.Height));
这样就在当鼠标在Map2上时，Map1上会同步打一个十字丝。画出来的是默认宽度为1的黑色线，正好符合我的要求。也可以自定义线形，关键代码如下，加在初始化代码里面。

IRgbColor fcolor = new RgbColorClass();
fcolor.RGB = 0;
ISimpleLineSymbol pSymbol = (ISimpleLineSymbol)pDisplayFeedback1.Symbol;
pSymbol.Color = fcolor;
pSymbol.Width = 1;
pSymbol.Style = esriSimpleLineStyle.esriSLSSolid;
//放在这句之前 pDisplayFeedback1.Display = [...]]]></description>
			<content:encoded><![CDATA[<p>昨天下午下了课，老板给打电话来说帮师兄研究一下如何实现这样如题的功能，具体情境是拿C#用ArcEngine做二次开发的时候，他要开四个MapControl控件，分别显示大气、土壤等等的信息，在每个地图容器里面拖拽放大的时候，其他容器里面的地图联动，鼠标也要在四个窗口里面同步显示。</p>
<p>好的，分成三步来做。以两个MapControl联动为例，做窗口上放了两个ArcGIS Engine MapControl控件，分别命名Map1和Map2。</p>
<p>先实现地图联动，每当地图位置、比例尺发生变化的时候，会触发MapControl的OnExtentUpdated事件，在Map1的响应函数里面写：</p>
<blockquote>
<p style="padding-left: 30px;">Map2.Extent = (IEnvelope)e.newEnvelope;</p>
</blockquote>
<p>Map2同理，这样就好了。之前有试过Map2.Extent = Map1.Extent.Envelope的用法，但是联动的时候慢半拍。</p>
<p>接着实现同步操作状态，即鼠标进入MapControl控件的时候，保持一致的漫游、放大、缩小等功能。再放两个ArcGIS Engine ToolBarControl控件，分别命名Bar1和Bar2，添加好漫游、放大、缩小、全图四个按钮，并绑定对应的MapControl控件。</p>
<p>实现的原理是当按下一个ToolBar上按钮的时候，让别的ToolBar的该按钮也处于按下状态。在ToolBar的OnItemClick事件里面写，这里有一点要注意的是ToolBar里面的全图按钮算Command不算Tool（AO里面的强行不合理分类，Command是按下就弹起的按钮，Tool是按下后保持状态的。），在代码里面利用e.index把他排除在同步操作的状态以外。关键代码如下</p>
<blockquote>
<p style="padding-left: 30px;">Bar2.CurrentTool = Bar2.GetItem(e.index).Command as ITool;</p>
</blockquote>
<p>Bar1同理，这样效果就出来了。前面几次操作在显示上略有点小问题，我归结到AE的Bug里面，多点几次基本就是无缝同步了，最后出成品的时候，隐藏到其他的ToolBar就好了。</p>
<p>鼠标这个功能比较麻烦，我试过用PicureBox装在个鼠标图片然后用位置控制的方法，但是PictrueBox本身不透明，效果不好，况且暂时也不需要也没必要实现同时弹出右键菜单，跟师兄沟通了一下决定改用在其他地图容器里面画一个大的十字丝来作为鼠标的定位显示，这个功能用NewLineFeedbackClass来实现。</p>
<p>首先做定义两个接口。</p>
<blockquote>
<p style="padding-left: 30px;">private IDisplayFeedback pDisplayFeedback1 = null;<br />
private IScreenDisplay pScreenDisplay1 = null;</p></blockquote>
<p>在窗体的构造函数里面添加初始化的代码。</p>
<blockquote>
<p style="padding-left: 30px;">pDisplayFeedback1 = new NewLineFeedbackClass();<br />
pScreenDisplay1 = Map1.ActiveView.ScreenDisplay;<br />
pDisplayFeedback1.Display = pScreenDisplay1;</p></blockquote>
<p>在Map2的OnMouseMove事件里面写响应代码。</p>
<blockquote>
<p style="padding-left: 30px;">((INewLineFeedback)pDisplayFeedback1).Stop(); <span style="color: #339966;">//结束之前的绘制，DisplayFeedback在执行Start()方法之后开始画，Stop()之后就清掉了。<br />
//下面是画十字丝的，因为没有NewMultiLineFeedbackClass，这个十字丝只能一笔画成，所以就只能在显示区域外面多画了一点。</span><br />
((INewLineFeedback)pDisplayFeedback1).Start(Map1.ActiveView.ScreenDisplay.<br />
DisplayTransformation.ToMapPoint(0, e.y));<br />
((INewLineFeedback)pDisplayFeedback1).AddPoint(Map1.ActiveView.ScreenDisplay.<br />
DisplayTransformation.ToMapPoint(Map1.Width + 1, e.y));<br />
((INewLineFeedback)pDisplayFeedback1).AddPoint(Map1.ActiveView.ScreenDisplay.<br />
DisplayTransformation.ToMapPoint(Map1.Width + 1, -1));<br />
((INewLineFeedback)pDisplayFeedback1).AddPoint(Map1.ActiveView.ScreenDisplay.<br />
DisplayTransformation.ToMapPoint(e.x, -1));<br />
((INewLineFeedback)pDisplayFeedback1).AddPoint(Map1.ActiveView.ScreenDisplay.<br />
DisplayTransformation.ToMapPoint(e.x, Map1.Height));</p></blockquote>
<p>这样就在当鼠标在Map2上时，Map1上会同步打一个十字丝。画出来的是默认宽度为1的黑色线，正好符合我的要求。也可以自定义线形，关键代码如下，加在初始化代码里面。</p>
<blockquote>
<p style="padding-left: 30px;">IRgbColor fcolor = new RgbColorClass();<br />
fcolor.RGB = 0;<br />
ISimpleLineSymbol pSymbol = (ISimpleLineSymbol)pDisplayFeedback1.Symbol;<br />
pSymbol.Color = fcolor;<br />
pSymbol.Width = 1;<br />
pSymbol.Style = esriSimpleLineStyle.esriSLSSolid;<br />
<span style="color: #339966;">//放在这句之前 pDisplayFeedback1.Display = pScreenDisplay1;</span></p></blockquote>
<p>这种做法比直接用MapControl的DrawShape或者用GraphicsContainer的AddElement方法好的地方在于，后两者重绘的时候需要刷新地图，这样整张地图都要重绘，效果巨差。</p>
<p>好的，完成了，说两句题外话，ArcGIS的ArcObject的库确实难用，正如上面看的NewFeedbackClass，另外还有一个FeedbackClass，而MapControlClass的接口则有IMapControl1、IMapControl2和IMapControl3，这哥仨大同小异，另外关于Symbol的用法也是各个不同，着实混乱。这还算好的了，我这里是ArcEngine9.3的产品，之前的8系列连命名空间都没有，Orz&#8230;本来下个版本是发布9.4的，现在据说改进很多，直接迈进10了，期待一下看看二次开发库有没有便民改进。</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.spehio.info/archives/36183/feed</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>偶染小恙</title>
		<link>http://blog.spehio.info/archives/36176</link>
		<comments>http://blog.spehio.info/archives/36176#comments</comments>
		<pubDate>Wed, 03 Mar 2010 02:14:32 +0000</pubDate>
		<dc:creator>Spehio</dc:creator>
				<category><![CDATA[碎语而已]]></category>

		<guid isPermaLink="false">http://blog.spehio.info/?p=36176</guid>
		<description><![CDATA[几天前发现脖子上冒出几个红痘痘，略痛不痒，观察几天之后发现越来越严重，进而肩膀上也冒出来几个，不敢怠慢，决定去医院看一下。因为有前车之鉴，我在学校医务室得到一个不靠谱的解答之后，还是决定放弃公费医疗直奔清华大学玉泉医院。
整个看病过程相当简单，给医生看了一下就结了，开药付钱，花掉350个人民的币。
这病叫带状疱疹，第一次发作时的症状就是水痘。仔细研究了一下，这病还挺不简单的，因为发炎的部位是神经，不好好治还会有神经痛的后遗症，于是乖乖吃药。

一顿要吃这么多，并且开的还是两周的剂量。
1号药丸叫比拜克胶囊，功效为清热解毒，一日三次，每次三颗。
2号药丸叫泛昔洛韦片，带状疱疹专杀工具，八小时一次，一次两片。//这个玩意，一盒45，开了我四盒。
3号药丸叫维生素B1，虽然每天有吃善存，不过看样子补充的量还不够。
4号药丸叫甲钴胺胶囊，治周围神经病变，一日一次，一次一粒。//这个玩意儿看着最吓人，也最贵，一盒52，开了我两盒。
另外还有外涂药剂，是中成药，味道闻着不错，只是涂完比较痛。
这两天就全在宿舍静养了，也没什么具体安排，选的课程都听了一遍，比较索然，上学真的是上厌倦了，唯一可惜的是没遇着几个好的上课老师，着实浪费了不少时光。
不写了，脖子这儿越来越疼，我干点别的事情去。
]]></description>
			<content:encoded><![CDATA[<p>几天前发现脖子上冒出几个红痘痘，略痛不痒，观察几天之后发现越来越严重，进而肩膀上也冒出来几个，不敢怠慢，决定去医院看一下。因为有前车之鉴，我在学校医务室得到一个不靠谱的解答之后，还是决定放弃公费医疗直奔清华大学玉泉医院。</p>
<p>整个看病过程相当简单，给医生看了一下就结了，开药付钱，花掉350个人民的币。</p>
<p>这病叫<a href="http://zh.wikipedia.org/wiki/带状疱疹">带状疱疹</a>，第一次发作时的症状就是水痘。仔细研究了一下，这病还挺不简单的，因为发炎的部位是神经，不好好治还会有神经痛的后遗症，于是乖乖吃药。</p>
<p><img class="aligncenter size-medium wp-image-36177" title="药片示意图" src="http://blog.spehio.info/wp-content/uploads/2010/03/20100303001-300x225.jpg" alt="药片示意图" width="389" height="291" /></p>
<p>一顿要吃这么多，并且开的还是两周的剂量。</p>
<p>1号药丸叫比拜克胶囊，功效为清热解毒，一日三次，每次三颗。<br />
2号药丸叫泛昔洛韦片，带状疱疹专杀工具，八小时一次，一次两片。//这个玩意，一盒45，开了我四盒。<br />
3号药丸叫维生素B1，虽然每天有吃善存，不过看样子补充的量还不够。<br />
4号药丸叫甲钴胺胶囊，治周围神经病变，一日一次，一次一粒。//这个玩意儿看着最吓人，也最贵，一盒52，开了我两盒。</p>
<p>另外还有外涂药剂，是中成药，味道闻着不错，只是涂完比较痛。</p>
<p>这两天就全在宿舍静养了，也没什么具体安排，选的课程都听了一遍，比较索然，上学真的是上厌倦了，唯一可惜的是没遇着几个好的上课老师，着实浪费了不少时光。</p>
<p>不写了，脖子这儿越来越疼，我干点别的事情去。</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.spehio.info/archives/36176/feed</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>新上线维基小说和媒体库两个子站点</title>
		<link>http://blog.spehio.info/archives/36173</link>
		<comments>http://blog.spehio.info/archives/36173#comments</comments>
		<pubDate>Sun, 28 Feb 2010 13:26:35 +0000</pubDate>
		<dc:creator>Spehio</dc:creator>
				<category><![CDATA[挨踢岁月]]></category>

		<guid isPermaLink="false">http://blog.spehio.info/?p=36173</guid>
		<description><![CDATA[先说维基小说站，看这里，叫做讲故事，源于本科学校的一位学长，原型在这里有个小记录。
这个站采用的是DokuWiki，这套系统是php的程序，不需要数据库的支持，基于纯文本来存储数据，插件和皮肤资源都比较齐全，非常适合做个人知识整理系统，这里拿来做维基小说的程序也还是挺不错的。关于其他的维基程序，这里的WikiMatrix列出了多，总能挑到一款的。
维基站比较简单，媒体库的程序就大费了一番周折了。最早的想法就是做一个相册，考察了一系列程序如下。
pixelpost，主题和插件资源最丰富，但是后台界面用户管理弱一点，不支持从url上传图片。
4images，后台功能相当强大，就是主题资源平平，多数很难看。
coppermine，航母级的，功能相当全面，适合做个社区图片分享站点，只是个人用太浪费了。
mg2，非常简洁，不需要数据库支持，不支持多用户，主题资源缺乏。
plogger，很简洁，插件和主题资源来源于社区，比较零散，不过原装的几个主题挺不错了，功能也只能算强强够用，没有多用户支持。
zenphoto，这家似乎跟wordpress有些渊源，主题和插件资源不算特别少也不算特别多，后台的用户体验不错，支持用户权限管理，不过对中文支持不太好。
gallery，DreamHost提供了这家的一键安装，使用体验跟上面4images差不多，还支持网页链接批量上传，就是主题太少太难看了。
yapig等等，特点忘了。。。
考察到最后用的是zenphoto，然后发现它支持上传mp3、flv等等，以及播放列表、密码保护、防盗链等等，所以打算拿它来做个媒体库好了，传送门在这里。
]]></description>
			<content:encoded><![CDATA[<p>先说维基小说站，看<a href="http://story.spehio.info" target="_blank">这里</a>，叫做讲故事，源于本科学校的一位学长，原型在这里有个<a href="http://haiyangren.blogbus.com/logs/57389086.html" target="_blank">小记录</a>。</p>
<p>这个站采用的是<a href="http://www.dokuwiki.org/">DokuWiki</a>，这套系统是php的程序，不需要数据库的支持，基于纯文本来存储数据，插件和皮肤资源都比较齐全，非常适合做个人知识整理系统，这里拿来做维基小说的程序也还是挺不错的。关于其他的维基程序，这里的<a href="http://www.wikimatrix.org/" target="_blank">WikiMatrix</a>列出了多，总能挑到一款的。</p>
<p>维基站比较简单，媒体库的程序就大费了一番周折了。最早的想法就是做一个相册，考察了一系列程序如下。</p>
<p><a href="http://www.pixelpost.org/" target="_blank">pixelpost</a>，主题和插件资源最丰富，但是后台界面用户管理弱一点，不支持从url上传图片。<br />
<a href="http://www.4homepages.de/" target="_blank">4images</a>，后台功能相当强大，就是主题资源平平，多数很难看。<br />
<a href="http://coppermine-gallery.net/">coppermine</a>，航母级的，功能相当全面，适合做个社区图片分享站点，只是个人用太浪费了。<br />
<a href="http://www.minigal.dk/" target="_blank">mg2</a>，非常简洁，不需要数据库支持，不支持多用户，主题资源缺乏。<br />
<a href="http://www.plogger.org/" target="_blank">plogger</a>，很简洁，插件和主题资源来源于社区，比较零散，不过原装的几个主题挺不错了，功能也只能算强强够用，没有多用户支持。<br />
<a href="http://www.zenphoto.org/" target="_blank">zenphoto</a>，这家似乎跟wordpress有些渊源，主题和插件资源不算特别少也不算特别多，后台的用户体验不错，支持用户权限管理，不过对中文支持不太好。<br />
<a href="http://gallery.menalto.com/">gallery</a>，DreamHost提供了这家的一键安装，使用体验跟上面4images差不多，还支持网页链接批量上传，就是主题太少太难看了。<br />
<a href="http://yapig.sourceforge.net/">yapig</a>等等，特点忘了。。。</p>
<p>考察到最后用的是zenphoto，然后发现它支持上传mp3、flv等等，以及播放列表、密码保护、防盗链等等，所以打算拿它来做个媒体库好了，传送门在<a href="http://image.spehio.info" target="_blank">这里</a>。</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.spehio.info/archives/36173/feed</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
		<item>
		<title>DD-WRT折腾小记</title>
		<link>http://blog.spehio.info/archives/36166</link>
		<comments>http://blog.spehio.info/archives/36166#comments</comments>
		<pubDate>Sun, 21 Feb 2010 11:49:06 +0000</pubDate>
		<dc:creator>Spehio</dc:creator>
				<category><![CDATA[挨踢岁月]]></category>
		<category><![CDATA[dd-wrt]]></category>

		<guid isPermaLink="false">http://blog.spehio.info/?p=36166</guid>
		<description><![CDATA[明天就要回学校了，这两天闲来无聊，趁着刚买了个带电源的usb hub，就又折腾了一点DD-WRT。
DD-WRT是一个基于Linux的路由器固件，历史大概是这样的，说很久很久以前，一家叫思科公司在自己的一款叫做WRT54G的无线路由上使用了基于Linux的固件，然后就因为GPL授权的问题被迫公开了这套固件的源代码，此后就有一干大牛根据这些源代码搞出来DD-WRT这个第三方固件，后来又有了直接从内核开始单干的OpenWRT（没去了解Tomato是啥情况）。现在的DD-WRT（v23以后的版本）其实已经是基于OpenWRT全部重写的了。//以上很混乱，详细历史八卦参见各种wiki和blog。
DD-WRT的特点是能让你在廉价的无线路由设备上面实现很多高端路由才有的功能，比如多种无线模式、信号功率调整、QoS、VPN甚至把路由当做Samba、FTP、HTTP服务器，BT电驴脱机下载机等等。
也不是所有的路由都能刷DD-WRT的固件，这里有个设备列表。经典的设备有上面提到的WRT54G，不过这个东西已经相当古老了，现在买到的大多是些洋垃圾电路板拿回来翻新的，新型号全新的也有，略贵。我是大半年前从恩山wifi论坛的淘宝店入手这样的一台洋垃圾，贝尔金7231-4p。为了能够更好的跑DD-WRT，恩山老大改造了一下，ROM升级到4M（原配是2M，只能刷个最精简版的固件，什么都玩不了。），内存升级到64M，加装两根天线，又多焊了个USB的接口（只是usb1.1，我的目的就是玩一玩，当文件服务器的话这个速度有点寒碜）。
之所以选这款，一来是经过改造，4M的ROM和usb接口使得这款路由的可扩展性大大增强，二来这款路由够强壮，如果刷固件砖掉的话，恢复起来比一般机器要方便很多（对于我这种有这方面心理阴影的人来说，这个功能太棒了）。
拿到手第一步先是重新刷固件，关于版本的选择这里有，然后根据提示去官方站点下载版本。因为一直在开发，会不断有各种新版本的rls编译出来供下载，也有很多种分支，我没去尝鲜，就选了Eko编译出来的固件&#8221;dd-wrt.v24-9517_VINT_mini_usb.bin&#8221;。其中VINT是支持47xx系列的博通芯片的，对应还有针对5352芯片的NEWD和NEWD-2，刷得不对就变砖，详情这里有。
mini版的固件关于无线路由方面的功能设置在web管理页面上都是有的，当时琢磨了小半个下午基本摸熟了，只有ipv6的功能一直没机会试（本来以为去科技学院宿舍能有v6给我折腾的，结果人品不好被住到国防大学，只能作罢。）。
有意思的就是那个usb接口了，首先这个usb口供电不是很足，u盘和移动硬盘不能保证稳定运行，我用了个带外接电源的usb hub搞定。挂载u盘比较简单，这里有方法。//顺便提一下，关于DD-WRT没有找到什么特别合适的教程，看wiki多琢磨才是王道。
然后就是第三方软件了，dd-wrt使用的一个东西叫做optware，因为一般他们是安装在/opt下面的，这点真幽默。optware相当于一个linux的运行环境，挂载完毕之后/opt下面有自己的/bin、/lib等等，安装软件使用/opt/bin/ipkg install ***的方式，当然只有optware软件源里面软件，其他软件就要自己编译了。optware也有好几种，dd-wrt自己维护了一个版本，openwrt也有一个，华硕也有一个，叫oleg optware，他们都是可以使用的，就是性能和各自源内的软件略有不同而已，可以同时装若干个，不用都放在/opt下面的。或者用基于BCM47xx平台的Debian，看这里，挂载进去之后chroot，就是个Debian了，想怎么整就怎么整了，Debian环境下支持的软件相较于optware更为完整和全面（前者300M后者也就10M左右）。
其他具体怎么整，恩山wifi论坛里面基本都能挖掘到了。//恩，不要认为我这是广告。
完了，就剩最后一句了，24小时之后我就从保暖内衣+羊毛衫+大棉袄的组合变成内衣+睡衣的组合了。
]]></description>
			<content:encoded><![CDATA[<p>明天就要回学校了，这两天闲来无聊，趁着刚买了个带电源的usb hub，就又折腾了一点DD-WRT。</p>
<p>DD-WRT是一个基于Linux的路由器固件，历史大概是这样的，说很久很久以前，一家叫思科公司在自己的一款叫做WRT54G的无线路由上使用了基于Linux的固件，然后就因为GPL授权的问题被迫公开了这套固件的源代码，此后就有一干大牛根据这些源代码搞出来DD-WRT这个第三方固件，后来又有了直接从内核开始单干的OpenWRT（没去了解Tomato是啥情况）。现在的DD-WRT（v23以后的版本）其实已经是基于OpenWRT全部重写的了。//以上很混乱，详细历史八卦参见各种wiki和blog。</p>
<p>DD-WRT的特点是能让你在廉价的无线路由设备上面实现很多高端路由才有的功能，比如多种无线模式、信号功率调整、QoS、VPN甚至把路由当做Samba、FTP、HTTP服务器，BT电驴脱机下载机等等。</p>
<p>也不是所有的路由都能刷DD-WRT的固件，<a href="http://www.dd-wrt.com/wiki/index.php/Supported_Devices" target="_blank">这里</a>有个设备列表。经典的设备有上面提到的WRT54G，不过这个东西已经相当古老了，现在买到的大多是些洋垃圾电路板拿回来翻新的，新型号全新的也有，略贵。我是大半年前从<a href="http://www.right.com.cn/forum/" target="_blank">恩山wifi论坛</a>的淘宝店入手这样的一台洋垃圾，贝尔金7231-4p。为了能够更好的跑DD-WRT，恩山老大改造了一下，ROM升级到4M（原配是2M，只能刷个最精简版的固件，什么都玩不了。），内存升级到64M，加装两根天线，又多焊了个USB的接口（只是usb1.1，我的目的就是玩一玩，当文件服务器的话这个速度有点寒碜）。</p>
<p>之所以选这款，一来是经过改造，4M的ROM和usb接口使得这款路由的可扩展性大大增强，二来这款路由够强壮，如果刷固件砖掉的话，恢复起来比一般机器要方便很多（对于我这种有这方面心理阴影的人来说，这个功能太棒了）。</p>
<p>拿到手第一步先是重新刷固件，关于版本的选择<a href="http://www.dd-wrt.com/wiki/index.php/What_is_DD-WRT%3F#File_Versions" target="_blank">这里</a>有，然后根据提示去官方站点<a href="http://www.dd-wrt.com/site/support/other-downloads">下载</a>版本。因为一直在开发，会不断有各种新版本的rls编译出来供下载，也有很多种分支，我没去尝鲜，就选了Eko编译出来的固件&#8221;dd-wrt.v24-9517_VINT_mini_usb.bin&#8221;。其中VINT是支持47xx系列的博通芯片的，对应还有针对5352芯片的NEWD和NEWD-2，刷得不对就变砖，详情<a href="http://blog.sina.com.cn/s/blog_594bc0d80100g1py.html" target="_blank">这里</a>有。</p>
<p>mini版的固件关于无线路由方面的功能设置在web管理页面上都是有的，当时琢磨了小半个下午基本摸熟了，只有ipv6的功能一直没机会试（本来以为去科技学院宿舍能有v6给我折腾的，结果人品不好被住到国防大学，只能作罢。）。</p>
<p>有意思的就是那个usb接口了，首先这个usb口供电不是很足，u盘和移动硬盘不能保证稳定运行，我用了个带外接电源的usb hub搞定。挂载u盘比较简单，<a href="http://www.right.com.cn/forum/viewthread.php?tid=11637&amp;extra=page%3D1%26amp%3Bfilter%3Ddigest" target="_blank">这里</a>有方法。//顺便提一下，关于DD-WRT没有找到什么特别合适的教程，看wiki多琢磨才是王道。</p>
<p>然后就是第三方软件了，dd-wrt使用的一个东西叫做optware，因为一般他们是安装在/opt下面的，这点真幽默。optware相当于一个linux的运行环境，挂载完毕之后/opt下面有自己的/bin、/lib等等，安装软件使用/opt/bin/ipkg install ***的方式，当然只有optware软件源里面软件，其他软件就要自己编译了。optware也有好几种，dd-wrt自己维护了一个版本，openwrt也有一个，华硕也有一个，叫oleg optware，他们都是可以使用的，就是性能和各自源内的软件略有不同而已，可以同时装若干个，不用都放在/opt下面的。或者用基于BCM47xx平台的Debian，看<a href="http://code.google.com/p/debian-bcm47xx/" target="_blank">这里</a>，挂载进去之后chroot，就是个Debian了，想怎么整就怎么整了，Debian环境下支持的软件相较于optware更为完整和全面（前者300M后者也就10M左右）。</p>
<p>其他具体怎么整，<a href="http://www.right.com.cn/forum/" target="_blank">恩山wifi论坛</a>里面基本都能挖掘到了。//恩，不要认为我这是广告。</p>
<p>完了，就剩最后一句了，24小时之后我就从保暖内衣+羊毛衫+大棉袄的组合变成内衣+睡衣的组合了。</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.spehio.info/archives/36166/feed</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
		<item>
		<title>最近</title>
		<link>http://blog.spehio.info/archives/36163</link>
		<comments>http://blog.spehio.info/archives/36163#comments</comments>
		<pubDate>Mon, 08 Feb 2010 08:07:54 +0000</pubDate>
		<dc:creator>Spehio</dc:creator>
				<category><![CDATA[碎语而已]]></category>

		<guid isPermaLink="false">http://blog.spehio.info/?p=36163</guid>
		<description><![CDATA[猛抬头发现又是很久没写了，前两天想写点关于智能机的文章，写了一半写不下去了，以后再补。
放假回来一直忙于之前的一个小项目，摸着石头过河，阻碍重重。前两天有了一点阶段性成果，也就是证明了我的想法可行，并且做了一个小Demo，其间现学了一点Javascript和ActionScript。
搞定之后就有点萎靡了，成天想睡觉，没有太多斗志，我想我还是等着过年吧。
如上，生活总是要记录一点的，流水账而已。
]]></description>
			<content:encoded><![CDATA[<p>猛抬头发现又是很久没写了，前两天想写点关于智能机的文章，写了一半写不下去了，以后再补。</p>
<p>放假回来一直忙于之前的一个小项目，摸着石头过河，阻碍重重。前两天有了一点阶段性成果，也就是证明了我的想法可行，并且做了一个小Demo，其间现学了一点Javascript和ActionScript。</p>
<p>搞定之后就有点萎靡了，成天想睡觉，没有太多斗志，我想我还是等着过年吧。</p>
<p>如上，生活总是要记录一点的，流水账而已。</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.spehio.info/archives/36163/feed</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Ubuntu下不依靠NetworkManager的Wi-Fi接入</title>
		<link>http://blog.spehio.info/archives/36153</link>
		<comments>http://blog.spehio.info/archives/36153#comments</comments>
		<pubDate>Tue, 26 Jan 2010 11:48:01 +0000</pubDate>
		<dc:creator>Spehio</dc:creator>
				<category><![CDATA[挨踢岁月]]></category>
		<category><![CDATA[network]]></category>
		<category><![CDATA[ubuntu]]></category>
		<category><![CDATA[wifi]]></category>
		<category><![CDATA[wpa2]]></category>

		<guid isPermaLink="false">http://blog.spehio.info/?p=36153</guid>
		<description><![CDATA[Ubuntu的那个NetworkManager其实挺好的，只是前段时间常驻办公室，在那边只能用有线上网，还要修改MAC，手工指定IP，本来在/etc/network/interfaces里面加上规则是很轻松的事情，可是NetworkManager让这件事情比在windows下还要麻烦，于是一怒之下我就把他干掉了，而且还加了可爱的参数purge。
但是无线我就不会配了，回宿舍上网的两个解决方案是进windows和用有线。回家之后路由器扔在客厅，没法用有线了，咬咬牙，折腾了小半个下午，解决了无线的配置问题。
我的Wi-Fi信号是这样，802.11g，SSID广播，WPA2 Personal加密模式，WPA加密算法用TKIP，30位数字特殊符号大小写的密钥，客户端由DHCP分配IP。笔记本无线网卡是Inter 5100 AGN，操作系统是Ubuntu 9.10。
原理大概是这样，/etc/network/interfaces里面无线网卡配置的写法跟有线差不多，只是多需要了一个叫wpa_supplicant的程序，它的作用是对数据流进行加密，因此要在网卡up的时候启动它，在网卡down的时候关掉他。
具体的做法如下，首先iwconifg看一下无线网卡叫啥，我这块卡是能被系统认出来并驱动的，名字叫wlan0。
然后给wpa_supplicant写个配置文件，放在/etc/wpa_supplicant下面好了，管他叫wpa_supplicant.conf好了，如下。
ctrl_interface=/var/run/wpa_supplicant
ctrl_interface_group=root
network={
ssid=&#8221;&#8230;&#8230;&#8221; #ssid的名字，如果ssid不是广播的话，在下面加一条scan_ssid=1。
key_mgmt=WPA-PSK
psk=&#8221;&#8230;&#8230;&#8221; #引号里面明文写密钥
proto=RSN #据说WPA1是写WPA的，WPA2是写这个的。
pairwise=TKIP
}
明文写密钥比较变态，用wpa_passphrase ssid &#8216;psk&#8217;来生成一个加密的psk，效果如下。
# wpa_passphrase tplink &#8216;qwer!@#123&#8242;
network={
ssid=&#8221;tplink&#8221;
#psk=&#8221;qwer!@#123&#8243;
psk=8f7ccd4d208572d85eefadf6d80b66f27515a9de8f79743148cefb2c6785e0f5
}
根据输出重新替换回去就好。
接着在/etc/network/interfaces里面写
auto wlan0
iface wlan0 inet dhcp
wireless-ssid &#8220;&#8230;&#8230;&#8221;
pre-up wpa_supplicant -B -Dwext -iwlan0 -c/etc/wpa_supplicant/wpa_supplicant.conf
post-down killall -q wpa_supplicant
pre-up就是在网卡up之执行一下wpa_supplicant -B -Dwext -iwlan0 -c/etc/wpa_supplicant/wpa_supplicant.conf，在后台启动一个wpa_supplicant的进程，这样post-down的意思也就明了了。
然后就是/etc/init.d/networking restart了，如果启动不成功的话，在确认没有低级错误的情况下，基本就是网卡的驱动问题了，man wpa_supplicant了解更多，然后就是wpa_supplicant.conf里面的参数了，找找还有别的调整调整，调到满意为止。
主力参考了这篇 http://www.linuxhomenetworking.com/wiki/index.php/Quick_HOWTO_:_Ch13_:_Linux_Wireless_Networking，其他也google了一些，没有太多参考价值，参悟了wpa_supplicant的作用就明白了。
]]></description>
			<content:encoded><![CDATA[<p>Ubuntu的那个NetworkManager其实挺好的，只是前段时间常驻办公室，在那边只能用有线上网，还要修改MAC，手工指定IP，本来在/etc/network/interfaces里面加上规则是很轻松的事情，可是NetworkManager让这件事情比在windows下还要麻烦，于是一怒之下我就把他干掉了，而且还加了可爱的参数purge。</p>
<p>但是无线我就不会配了，回宿舍上网的两个解决方案是进windows和用有线。回家之后路由器扔在客厅，没法用有线了，咬咬牙，折腾了小半个下午，解决了无线的配置问题。</p>
<p>我的Wi-Fi信号是这样，802.11g，SSID广播，WPA2 Personal加密模式，WPA加密算法用TKIP，30位数字特殊符号大小写的密钥，客户端由DHCP分配IP。笔记本无线网卡是Inter 5100 AGN，操作系统是Ubuntu 9.10。</p>
<p>原理大概是这样，/etc/network/interfaces里面无线网卡配置的写法跟有线差不多，只是多需要了一个叫wpa_supplicant的程序，它的作用是对数据流进行加密，因此要在网卡up的时候启动它，在网卡down的时候关掉他。</p>
<p>具体的做法如下，首先iwconifg看一下无线网卡叫啥，我这块卡是能被系统认出来并驱动的，名字叫wlan0。</p>
<p>然后给wpa_supplicant写个配置文件，放在/etc/wpa_supplicant下面好了，管他叫wpa_supplicant.conf好了，如下。</p>
<p>ctrl_interface=/var/run/wpa_supplicant<br />
ctrl_interface_group=root<br />
network={<br />
ssid=&#8221;&#8230;&#8230;&#8221; <span style="color: #008000;">#ssid的名字，如果ssid不是广播的话，在下面加一条scan_ssid=1。</span><br />
key_mgmt=WPA-PSK<br />
psk=&#8221;&#8230;&#8230;&#8221; <span style="color: #008000;">#引号里面明文写密钥</span><br />
proto=RSN <span style="color: #008000;">#据说WPA1是写WPA的，WPA2是写这个的。</span><br />
pairwise=TKIP<br />
}</p>
<p>明文写密钥比较变态，用wpa_passphrase ssid &#8216;psk&#8217;来生成一个加密的psk，效果如下。</p>
<p># wpa_passphrase tplink &#8216;qwer!@#123&#8242;<br />
network={<br />
ssid=&#8221;tplink&#8221;<br />
#psk=&#8221;qwer!@#123&#8243;<br />
psk=8f7ccd4d208572d85eefadf6d80b66f27515a9de8f79743148cefb2c6785e0f5<br />
}</p>
<p>根据输出重新替换回去就好。</p>
<p>接着在/etc/network/interfaces里面写</p>
<p>auto wlan0<br />
iface wlan0 inet dhcp<br />
wireless-ssid &#8220;&#8230;&#8230;&#8221;<br />
pre-up wpa_supplicant -B -Dwext -iwlan0 -c/etc/wpa_supplicant/wpa_supplicant.conf<br />
post-down killall -q wpa_supplicant</p>
<p>pre-up就是在网卡up之执行一下wpa_supplicant -B -Dwext -iwlan0 -c/etc/wpa_supplicant/wpa_supplicant.conf，在后台启动一个wpa_supplicant的进程，这样post-down的意思也就明了了。</p>
<p>然后就是/etc/init.d/networking restart了，如果启动不成功的话，在确认没有低级错误的情况下，基本就是网卡的驱动问题了，man wpa_supplicant了解更多，然后就是wpa_supplicant.conf里面的参数了，找找还有别的调整调整，调到满意为止。</p>
<p>主力参考了这篇 <a href="http://www.linuxhomenetworking.com/wiki/index.php/Quick_HOWTO_:_Ch13_:_Linux_Wireless_Networking" target="_blank">http://www.linuxhomenetworking.com/wiki/index.php/Quick_HOWTO_:_Ch13_:_Linux_Wireless_Networking</a>，其他也google了一些，没有太多参考价值，参悟了wpa_supplicant的作用就明白了。</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.spehio.info/archives/36153/feed</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
	</channel>
</rss>
