<?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>小顾de杂记</title>
	<atom:link href="http://ihipop.info/feed" rel="self" type="application/rss+xml" />
	<link>http://ihipop.info</link>
	<description>O(∩_∩)O~&#124;Across the great wall we can reach the every corner in the world.</description>
	<lastBuildDate>Wed, 22 Feb 2012 01:46:22 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.3.1</generator>
		<item>
		<title>ip2long在32位系统下“溢出”问题</title>
		<link>http://ihipop.info/2012/02/2998.html</link>
		<comments>http://ihipop.info/2012/02/2998.html#comments</comments>
		<pubDate>Fri, 17 Feb 2012 03:03:56 +0000</pubDate>
		<dc:creator>ihipop</dc:creator>
				<category><![CDATA[MyOriginal]]></category>
		<category><![CDATA[PHP Note]]></category>
		<category><![CDATA[ip2long]]></category>
		<category><![CDATA[溢出]]></category>
		<category><![CDATA[负数]]></category>

		<guid isPermaLink="false">http://ihipop.info/?p=2998</guid>
		<description><![CDATA[PHP ip2long的算法是 A*256*256*256+B*256*256+C*256+D 这个和mysql的INET_ATON算法是一样的。如果你把10.0.0.1使用ip2long计算，得到的结果是167772161，如果你把这个整数存到数据库里面(mysql存储这个值是字段需要用int UNSIGNED。否则，128以上的IP段就存储不了了。)，你可以这样取得这个结果集SELECT INET_ATON('10.0.0.1')。 ip2long计算的结果可以使用long2ip来进行逆运算。唯一的一个小问题是，在32位系统上，高位IP计算出来的long会超长“溢出”, 输出一个负数。不过不影响long2ip进行逆运算。不过在判断IP区间的话，可能引起麻烦。解决办法 就是看是否是负数，如果是负数，使用sprintf格式化输出或者bindec再decbin]]></description>
			<content:encoded><![CDATA[<p>PHP ip2long的算法是<br />
A*256*256*256+B*256*256+C*256+D<br />
这个和mysql的INET_ATON算法是一样的。如果你把10.0.0.1使用ip2long计算，得到的结果是167772161，如果你把这个整数存到数据库里面(mysql存储这个值是字段需要用int UNSIGNED。否则，128以上的IP段就存储不了了。)，你可以这样取得这个结果集SELECT INET_ATON('10.0.0.1')。<br />
ip2long计算的结果可以使用long2ip来进行逆运算。唯一的一个小问题是，在32位系统上，高位IP计算出来的long会超长“溢出”, 输出一个负数。不过不影响long2ip进行逆运算。不过在判断IP区间的话，可能引起麻烦。解决办法 就是看是否是负数，如果是负数，使用sprintf格式化输出或者bindec再decbin</p>
<pre class="brush: php; title: ; notranslate"># phpsh
Starting php
type 'h' or 'help' to see instructions &amp; features
php&gt; echo ip2long('192.168.1.38')
-1062731482
php&gt; echo long2ip(ip2long('192.168.1.38')-1)
192.168.1.37
php&gt; echo long2ip(ip2long('192.168.1.38')-39)
192.168.0.255
php&gt; echo ip2long('10.0.0.1')
167772161
php&gt; 

php&gt; echo sprintf(&quot;%u&quot;,ip2long('192.168.1.38'))
3232235814
php&gt; echo long2ip(sprintf(&quot;%u&quot;,ip2long('192.168.1.38')))
192.168.1.38
php&gt; echo long2ip('3232235814')
192.168.1.38
php&gt; echo long2ip('-1062731482')
192.168.1.38
php&gt; echo decbin(ip2long('192.168.1.38'))
11000000101010000000000100100110
php&gt; echo bindec(decbin(ip2long('192.168.1.38')))
3232235814
php&gt; echo bindec(decbin(ip2long('10.0.0.1')))
167772161
php&gt; echo sprintf(&quot;%u&quot;,ip2long('10.0.0.1'))
167772161
php&gt;
</pre>
]]></content:encoded>
			<wfw:commentRss>http://ihipop.info/2012/02/2998.html/feed</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>Discuz！X 初始化过程中会自动初始化的一些系统缓存</title>
		<link>http://ihipop.info/2012/02/2990.html</link>
		<comments>http://ihipop.info/2012/02/2990.html#comments</comments>
		<pubDate>Tue, 07 Feb 2012 05:57:29 +0000</pubDate>
		<dc:creator>ihipop</dc:creator>
				<category><![CDATA[Discuz Tech]]></category>
		<category><![CDATA[MyOriginal]]></category>
		<category><![CDATA[DiscuzX]]></category>
		<category><![CDATA[变量]]></category>
		<category><![CDATA[缓存]]></category>

		<guid isPermaLink="false">http://ihipop.info/?p=2990</guid>
		<description><![CDATA["\ultrax\source\class\class_core.php" 约536行 usergroup_【当前用户的groupid】 admingroup_【当前用户的adminid】 setting style_default cronnextrun usergroup_【newusergroupid】 style_【主题ID】 此外，如果你进入一些特定页面，还会调用更深层次的一些缓存。比如编辑器表情标签初始化的时候会载入similes缓存，使用plugin.php调用插件的时候会自动载入plugin缓存等等，如果需要在别处调用某一处缓存，比如plugin，similes，可以直接传给loadcache($cachenames, $force = false)一个缓存名称后就可以获取到缓存数据。当然传入一个数组也是可以的。 以下是缓存的工作原理 via: discuz dev wiki 如何注册系统缓存呢？可以使用dX基带的缓存扩展机制。 很简单 在\source\function\cache增加一个文件，比如以dz 自己带到smiles为例。 建立这个cache_【cachename】.php和build_cache_【cachename】函数，按照指定的流程取出数据，使用save_syscache保存就可以了。按照标准方法建立的缓存，自动会加入缓存机制，后台更新缓存时，都会自动执行。 手动更新缓存的话，可以直接使用updatecache()，传名字和数组进去都可以。如果提示没有这个函数，需要 require_once libfile('function/cache');一下。更新缓存后就可以load来得到最新的缓存数据。使用$_G['cache']['【cachename】']来进行访问。 附带经常要使用到的dz的一些变量。 $adminid 1为管理员 2为总版主 3为版主 0表示否，即非管理组 -1表示 特殊组及除了1，2，3以外的系统组（即4，5，6，7，8组） $displayorder 0 正常帖 1 板块置顶 1级置顶 2 分类置顶 2级置顶 3 全局置顶 3级置顶 -1 被删除的帖 回收站 -2 待审核的帖 -3 审核忽略 -4 草稿]]></description>
			<content:encoded><![CDATA[<p>"\ultrax\source\class\class_core.php" 约536行</p>
<blockquote><p>usergroup_【当前用户的groupid】<br />
admingroup_【当前用户的adminid】<br />
setting<br />
style_default<br />
cronnextrun<br />
usergroup_【newusergroupid】<br />
style_【主题ID】
</p></blockquote>
<p>此外，如果你进入一些特定页面，还会调用更深层次的一些缓存。比如编辑器表情标签初始化的时候会载入similes缓存，使用plugin.php调用插件的时候会自动载入plugin缓存等等，如果需要在别处调用某一处缓存，比如plugin，similes，可以直接传给loadcache($cachenames, $force = false)一个缓存名称后就可以获取到缓存数据。当然传入一个数组也是可以的。<br />
以下是缓存的工作原理 via: <a href="http://dev.discuz.org/wiki/index.php?title=%E7%BC%93%E5%AD%98%E6%9C%BA%E5%88%B6#.E6.95.B0.E6.8D.AE.E7.BC.93.E5.AD.98" target="_blank">discuz dev wiki</a><br />
<img src="http://dev.discuz.org/wiki/images/1/18/Loadcache.jpg" alt="" /><br />
如何注册系统缓存呢？可以使用dX基带的缓存扩展机制。<br />
很简单 在\source\function\cache增加一个文件，比如以dz 自己带到smiles为例。</p>
<pre class="brush: php; title: ; notranslate">&lt;?php

/**
 *      [Discuz!] (C)2001-2099 Comsenz Inc.
 *      This is NOT a freeware, use is subject to license terms
 *
 *      $Id: cache_smilies.php 22550 2011-05-12 05:21:39Z monkey $
 */

if(!defined('IN_DISCUZ')) {
	exit('Access Denied');
}

function build_cache_smilies() {
	$data = array();
	$query = DB::query(&quot;SELECT s.id, s.code, s.url, t.typeid FROM &quot;.DB::table('common_smiley').&quot; s
		LEFT JOIN &quot;.DB::table('forum_imagetype').&quot; t ON t.typeid=s.typeid WHERE s.type='smiley' AND s.code&lt;&gt;'' AND t.available='1' ORDER BY LENGTH(s.code) DESC&quot;);

	$data = array('searcharray' =&gt; array(), 'replacearray' =&gt; array(), 'typearray' =&gt; array());
	while($smiley = DB::fetch($query)) {
		$data['searcharray'][$smiley['id']] = '/'.preg_quote(dhtmlspecialchars($smiley['code']), '/').'/';
		$data['replacearray'][$smiley['id']] = $smiley['url'];
		$data['typearray'][$smiley['id']] = $smiley['typeid'];
	}

	save_syscache('smilies', $data);
}

?&gt;</pre>
<p>建立这个cache_【cachename】.php和build_cache_【cachename】函数，按照指定的流程取出数据，使用save_syscache保存就可以了。按照标准方法建立的缓存，自动会加入缓存机制，后台更新缓存时，都会自动执行。<br />
手动更新缓存的话，可以直接使用updatecache()，传名字和数组进去都可以。如果提示没有这个函数，需要<br />
require_once libfile('function/cache');一下。更新缓存后就可以load来得到最新的缓存数据。使用$_G['cache']['【cachename】']来进行访问。</p>
<hr />
附带经常要使用到的dz的一些变量。</p>
<blockquote><p>$adminid<br />
1为管理员<br />
2为总版主<br />
3为版主<br />
0表示否，即非管理组<br />
-1表示 特殊组及除了1，2，3以外的系统组（即4，5，6，7，8组）</p></blockquote>
<blockquote><p>$displayorder<br />
0 正常帖<br />
1 板块置顶 1级置顶<br />
2 分类置顶 2级置顶<br />
3 全局置顶 3级置顶<br />
-1 被删除的帖 回收站<br />
-2 待审核的帖<br />
-3 审核忽略<br />
-4 草稿</p></blockquote>
]]></content:encoded>
			<wfw:commentRss>http://ihipop.info/2012/02/2990.html/feed</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Linux下获取进程正确的启动时间的几种方法</title>
		<link>http://ihipop.info/2012/01/2981.html</link>
		<comments>http://ihipop.info/2012/01/2981.html#comments</comments>
		<pubDate>Tue, 31 Jan 2012 06:25:05 +0000</pubDate>
		<dc:creator>ihipop</dc:creator>
				<category><![CDATA[Linux Manger]]></category>
		<category><![CDATA[MyOriginal]]></category>
		<category><![CDATA[jiffies]]></category>
		<category><![CDATA[Linux]]></category>
		<category><![CDATA[时间]]></category>
		<category><![CDATA[进程]]></category>

		<guid isPermaLink="false">http://ihipop.info/?p=2981</guid>
		<description><![CDATA[1.使用ps显示的进程运行后到现在经过的时间进行计算(Via) Script by ihipop 2.通过procfs里面的jiffies时间计算(Via) 在Linux系统中，时间管理有两个基本概念：xtime和jiffies。 xtime主要给time系函数使用，结构比较简单(include\linux\time.h)： struct timespec { time_t tv_sec; /* seconds */ long tv_nsec; /* nanoseconds， 纳秒，以前的版本是微秒*/ }; tv_sec就是大家平常所说的unix时间戳，在CMOS中维护，关机时由电池维持正常运行。 系统启动时，通过get_cmos_time()取cmos时间赋值。运行时，通过设置系统定时器，每隔一段时间触发一个节拍，他们管这个节拍叫tick。每触发一次tick，就会通过update_wall_time_one_tick()来更新xtime。 而jiffies是内核中的一个全局变量，它的功能看起来很简单：记录从系统启动以来的tick数。 在/proc/ /stat中( 源码请参考proc_pid_stat()，文件是fs/proc/array.c ），维护了进程的很多状态信息，其中第22项是进程启动时的jiffies值，通过它可以计算出进程启动时，系统已经开机的时间。把这个时间加上系统启动时间（/proc/stat)，就可以得到进程启动时间。 脚本中100是“用户可见”的tick频率(tick_rate)，它的值等于我们熟悉的常量CLOCKS_PER_SEC。为什么要说“用户可见”呢？实际上，新版本的内核tick_rate，已经远高于100了(i386的是1000），但以前很多程序，都依赖于这个数。为了兼容，于是内核又做了一层封装。 参考]]></description>
			<content:encoded><![CDATA[<p>1.使用ps显示的进程运行后到现在经过的时间进行计算(<a href="http://linuxcommando.blogspot.com/2008/09/how-to-get-process-start-date-and-time.html" target="blank">Via</a>)<br />
Script by ihipop</p>
<pre class="brush: bash; title: ; notranslate">#!/bin/bash
pid=$1
elt=$(ps w -p $pid o pid=,cmd=,etime= |awk '{print $NF}')
case $(echo $elt | sed -e 's/:/:\n/g' |grep &quot;:&quot; -c) in
&quot;1&quot;)
elt=$(echo $elt |sed -e 's/:/ minutes ago /')
;;
*)
elt=$(echo $elt |sed -e 's/-/ days ago /' -e 's/:/ hours ago /' -e 's/:/ minutes ago /')
;;
esac
date -d &quot;$elt seconds ago&quot;</pre>
<p><img src="https://p.twimg.com/AkZLlj7CIAANfa2.png" alt="" /><br />
2.通过procfs里面的jiffies时间计算(<a href="http://xiaoy.info/2010/05/29/135/get_process_start_time/" target="blank">Via</a>)</p>
<blockquote><p>在Linux系统中，时间管理有两个基本概念：xtime和jiffies。</p>
<p>xtime主要给time系函数使用，结构比较简单(include\linux\time.h)：</p>
<pre>struct timespec {
	time_t	tv_sec;		/* seconds */
	long	tv_nsec;	/* nanoseconds， 纳秒，以前的版本是微秒*/
};</pre>
<p>tv_sec就是大家平常所说的unix时间戳，在CMOS中维护，关机时由电池维持正常运行。</p>
<p>系统启动时，通过get_cmos_time()取cmos时间赋值。运行时，通过设置系统定时器，每隔一段时间触发一个节拍，他们管这个节拍叫tick。每触发一次tick，就会通过update_wall_time_one_tick()来更新xtime。</p>
<p>而jiffies是内核中的一个全局变量，它的功能看起来很简单：记录从系统启动以来的tick数。<br />
在/proc/
<pid>/stat中( 源码请参考proc_pid_stat()，文件是fs/proc/array.c ），维护了进程的很多状态信息，其中第22项是进程启动时的jiffies值，通过它可以计算出进程启动时，系统已经开机的时间。把这个时间加上系统启动时间（/proc/stat)，就可以得到进程启动时间。</p></blockquote>
<pre class="brush: bash; title: ; notranslate">#!/bin/sh
function show_start_time( )
{
  pid=$1
  JIFFIES=`cat /proc/$pid/stat | cut -d&quot; &quot; -f22`
  UPTIME=`grep btime /proc/stat | cut -d&quot; &quot; -f2`
  START_SEC=$(( $UPTIME + $JIFFIES / $(getconf CLK_TCK)))
  date -d &quot;1970-01-01 UTC $START_SEC seconds&quot;
}
</pre>
<blockquote><p>脚本中100是“用户可见”的tick频率(tick_rate)，它的值等于我们熟悉的常量CLOCKS_PER_SEC。为什么要说“用户可见”呢？实际上，新版本的内核tick_rate，已经远高于100了(i386的是1000），但以前很多程序，都依赖于这个数。为了兼容，于是内核又做了一层封装。</p></blockquote>
<p><a href="http://xiaoy.info/2010/05/29/135/get_process_start_time/#comment-58" target="blank">参考</a></p>
]]></content:encoded>
			<wfw:commentRss>http://ihipop.info/2012/01/2981.html/feed</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Teredo/TB隧道下Win7系统的IPV6 DNS解析优先级问题。</title>
		<link>http://ihipop.info/2012/01/2953.html</link>
		<comments>http://ihipop.info/2012/01/2953.html#comments</comments>
		<pubDate>Fri, 27 Jan 2012 14:57:17 +0000</pubDate>
		<dc:creator>ihipop</dc:creator>
				<category><![CDATA[Fix Problems]]></category>
		<category><![CDATA[MyOriginal]]></category>
		<category><![CDATA[Network Manger]]></category>
		<category><![CDATA[AddrConfigControl]]></category>
		<category><![CDATA[dns]]></category>
		<category><![CDATA[Teredo]]></category>
		<category><![CDATA[Tunnel Broker]]></category>
		<category><![CDATA[Win7]]></category>
		<category><![CDATA[解析]]></category>
		<category><![CDATA[隧道]]></category>

		<guid isPermaLink="false">http://ihipop.info/?p=2953</guid>
		<description><![CDATA[回家后，用上了那个WRT54G，上了ddwrt+chnroutes+DNSMASQ不能用交大的isatap隧道了，不过Teredo隧道又可以正常稳定的使用，但是发现一些奇怪的问题，比如，使用nslookup可以解析到ipv6.google.com，但是ping，一直提示“Ping request could not find host ipv6.google.com. Please check the name and try again.” 无法解析域名。但是直接ping google的IPV6地址确实是通的。证明IPV6链路正常。 一开始以为是其他隧道的干扰，关闭了其他隧道，还是老样子.而且使用gogo6的Tunnel broker也这样。放Google搜索了半天，找到了这个解释 微软脑残: http://ipv6-or-no-ipv6.blogspot.com/2009/02/teredo-ipv6-on-vista-no-aaaa-resolving.html Vista doesn't look up AAAA at all when it's on Teredo. It's intended behavior -- stupid, perhaps, but it's intended. See http://technet.microsoft.com/en-us/library/bb727035.aspx for all the details. 解决方法就是控制注册表设置如下，保存问reg文件，导入即可 Windows Registry Editor Version 5.00 [HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\services\Dnscache\Parameters] "AddrConfigControl"=dword:00000000 好像导入是立刻生效的。我导入后，立刻可以解析ipv6.google.com了。 [...]]]></description>
			<content:encoded><![CDATA[<p>回家后，用上了那个WRT54G，上了<a href="http://ihipop.info/2011/12/2887.html" target="_blank">ddwrt+chnroutes+DNSMASQ</a>不能用交大的isatap隧道了，不过Teredo隧道又可以正常稳定的使用，但是发现一些奇怪的问题，比如，使用nslookup可以解析到ipv6.google.com，但是ping，一直提示“Ping request could not find host ipv6.google.com. Please check the name and try again.” 无法解析域名。但是直接ping google的IPV6地址确实是通的。证明IPV6链路正常。<br />
一开始以为是其他隧道的干扰，关闭了其他隧道，还是老样子.而且使用gogo6的Tunnel broker也这样。放Google搜索了半天，找到了这个解释 微软脑残:<br />
<a href="<br />
http://ipv6-or-no-ipv6.blogspot.com/2009/02/teredo-ipv6-on-vista-no-aaaa-resolving.html" target="_balnk"></p>
<p>http://ipv6-or-no-ipv6.blogspot.com/2009/02/teredo-ipv6-on-vista-no-aaaa-resolving.html</a></p>
<blockquote><p>Vista doesn't look up AAAA at all when it's on Teredo. It's intended behavior -- stupid, perhaps, but it's intended. See <a href="http://technet.microsoft.com/en-us/library/bb727035.aspx" target="_balnk">http://technet.microsoft.com/en-us/library/bb727035.aspx</a> for all the details.</p></blockquote>
<p>解决方法就是控制注册表设置如下，保存问reg文件，导入即可</p>
<pre>Windows Registry Editor Version 5.00

[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\services\Dnscache\Parameters]
"AddrConfigControl"=dword:00000000</pre>
<p>好像导入是立刻生效的。我导入后，立刻可以解析ipv6.google.com了。<br />
使用Tunnel Broker也恢复正常。<br />
但是，发现国内的IPV6 PT一个都打不开，比如cgbt.cn 使用nslookup看，都正常，但是ping，就提示不能解析。当时想半天，本机dns一换成8.8.8.8，全部正常了，猜想到我在网关上放了DNSMASQ区分国内外DNS解析线路。而cgbt.cn和其他众多IPV6 PT都是cn结尾的，被DNSMASQ转向了电信DNS进行解析。这倒也没啥，关键是我针对电信的DNS劫持做了设置，就是启用了DNSMASQ的bogus-nxdomain=202.102.110.205屏蔽了包含202.102.110.205这个IP的A记录返回的解析结果。<br />
使用电信DNS解析的返回结果解析CGBT.CN是这样的。</p>
<blockquote><p>nslookup cgbt.cn 221.228.255.1<br />
Server:  b.center-dns.jsinfo.net<br />
Address:  221.228.255.1</p>
<p>Non-authoritative answer:<br />
Name:    cgbt.cn<br />
Addresses:  2001:da8:205::100<br />
          202.102.110.205</p></blockquote>
<p>CGBT.CN在校外没有这样的IPV4  A记录，这个IP是电信针对没有A记录的域名投毒，污染为自己的广告IP。DNSMASQ发现这个广告IP在bogus-nxdomain里面。于是直接回答：域名不存在。导致ping不能解析。也没啥好办法Patch DNSMASQ吧,这个DNSMASQ泡在路由器上，没ARM的交叉编译环境。只能暂时在DNSMASQ里面手动设置CGBT.CN和其他EDU.CN使用Google DNS解析了。<br />
哈哈哈，在家和公司又可以爽了。</p>
]]></content:encoded>
			<wfw:commentRss>http://ihipop.info/2012/01/2953.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Chakra 硬盘/U盘 安装小记</title>
		<link>http://ihipop.info/2012/01/2921.html</link>
		<comments>http://ihipop.info/2012/01/2921.html#comments</comments>
		<pubDate>Wed, 11 Jan 2012 03:09:19 +0000</pubDate>
		<dc:creator>ihipop</dc:creator>
				<category><![CDATA[Fix Problems]]></category>
		<category><![CDATA[MyOriginal]]></category>
		<category><![CDATA[Chakra]]></category>
		<category><![CDATA[grldr]]></category>
		<category><![CDATA[GRUB4DOS]]></category>
		<category><![CDATA[U盘]]></category>
		<category><![CDATA[安装]]></category>
		<category><![CDATA[硬盘]]></category>

		<guid isPermaLink="false">http://ihipop.info/?p=2921</guid>
		<description><![CDATA[真是折腾死人啊。 先说说过程，我再写写问题吧。 第一步当然是引导啦。不过在这之前，需要先下载安装镜像。我这里下载的是这个chakra-2011.12-Edn-CD-x86_64.iso 挂载这个镜像后，把引导内核提取出来chakraiso和chakraiso.img。放在某个分区的根目录。如果你会对U盘安装GRUB，那最好啦。如果你不想覆写U盘的引导记录，想利用系统自己的引导记录，也行。 Linux下就不说啦，讲讲在windows下面怎么办。 如果你使用win7 可以使用boot.ini 虽然nt6.0开始使用bootmgr了，不过还是认这个boot.ini的。XP自然就不必说了。唯一需要注意的是，有限软刷BIOS激活的Win7,不能使用官方grldr覆盖根目录下那个隐藏的grldr，否则可能导致软激活失败。这个grldr使用随机的hash和干扰码干扰生成，为的也是骗过微软的反盗版检测。如果你没有上面这些问题，你就先下载官方的GRUB4DOS，提取出grldr.mbr,grldr。grldr.mbr的作用就是在被ntldr/bootmgr引导后寻找grldr并加载并加他。如果你有上面有上面那种情况，和软刷的win7冲突的,请下载我修改的irldr.mbr和irldr。作用是一样的，不过irldr.mbr寻找和加载的是被重命名为irldr的grldr（貌似有点拗口 ） boot.ini这样写 然后写个menu.lst 简单说明一下，这个的kernel后面的引导参数都是从光盘的isolinux引导参数上面提取的(我提取自"/cdrom/isolinux/zhcn.cfg")，我只修改了一个地方，nonefree被我修改成了yes，因为我是nvidia显卡。你懂的。 chakraiso和chakraiso.img放在任何一个盘的根目录下面均可。同时把那个ISO也放到因盘或者你的U盘的根目录下面。 接着就是重启，win7的引导菜单里面选择Grub4Irldr。接着出现一个GRUB4DOS的界面，选择install chakra。如果你的ISO在U盘，记得天前插入。 接着chakra内核就开始引导了。大概过了三十秒，会报错，同时进入一个busybox的ram shell。 下面就开始技术活了。假设你的U盘在Udev里面被映射成为sdb，文件系统为fat 这里说明一下，如果你的iso放在ntfs格式的硬盘，vfat换成ntfs格式即可。记得加上-r进行只读挂载，如你不想出现文件系统错误，windows提示自检的话。 iso文件名字其实输入的时候可以按tab补全，这个大家都懂的。loop7什么的不是固定的 只要是不被占用的loop设备就可以了 完毕后按下快捷键ctrl+D，内核开始寻找和挂载安装设备，接着就无障碍的进入图形安装界面了。 到安装界面的话基本顺利了，如果要说，不得不说的是那个地球仪选时区的创意很棒啊。 还有要说的就是一个这个chakra的一个bug。其实是mkswap的一个bug。由于2011.12这个build使用的是linux 3.0分支的内核，而内置的util-linux版本是2.19.1-2 。这个版本内置的mkswap不能正确检测linux kernel version string, mkswap检测kernel version string,低版本内核（2.2.x），那么就只支持创建小于2GB的swap分区。3.x这个数字让mkswap咯屁了。mkswap以为是2.2.x或者更旧的内核分支。于是出现了这样的提示 这个问题已经在目前的testing分支修复了升级到util-linux 2.20 +就可以。 如果你需要创建大于2GB的swap分区，你可以先行升级。编辑live环境的/etc/pacman.conf 取消testing分支的注释，然后启用163镜像。 升级这两个包到最新版本即可。 另外，不建议在安装程序里面分区。我在安装程序里面的分区到PM或者DiskGenius下面看 全是错误且无法修复。只能重建。所以你还是实现规划好几个分区，哪怕是fat32的（swap分区例外），然后在安装的时候进行重新格式化就可哟i了。 其他，没什么了。默认的引导器是BURG（基于GRUB2），漂亮是漂亮的，不过安装程序没有提供安装到分区上的选项。只能写MBR，是有点不太人性化。不过不建议在这里取消后使用chroot进去装在分区上，你就先让他写MBR，完事了用BootICE再写回去，然后用我们刚才说道的irldr的menu.lst引导就可以了。 然后进去后再重新使用burg-install安装到分区引导记录上就可以了。 安装完毕后我装了一下nvdia的控制面板。GTK的。很丑。所以装了个oxygen-gtk ，又装了一个 chakra-gtk-config ，便于在控制面板内设置GTK主题外观。其他么应该没什么了。一些必要的bundle可以使用bundle manager管理。这个已经不是重点。不说了。你们自己折腾去吧。]]></description>
			<content:encoded><![CDATA[<p>真是折腾死人啊。<br />
先说说过程，我再写写问题吧。<br />
第一步当然是引导啦。不过在这之前，需要先下载安装镜像。我这里<a href="http://sourceforge.net/projects/chakra/files/2011.12/chakra-2011.12-Edn-CD-x86_64.iso" target="_blank">下载的是这个chakra-2011.12-Edn-CD-x86_64.iso</a><br />
挂载这个镜像后，把引导内核提取出来chakraiso和chakraiso.img。放在某个分区的根目录。如果你会对U盘安装GRUB，那最好啦。如果你不想覆写U盘的引导记录，想利用系统自己的引导记录，也行。<br />
Linux下就不说啦，讲讲在windows下面怎么办。<br />
如果你使用win7 可以使用boot.ini 虽然nt6.0开始使用bootmgr了，不过还是认这个boot.ini的。XP自然就不必说了。唯一需要注意的是，有限软刷BIOS激活的Win7,不能使用官方grldr覆盖根目录下那个隐藏的grldr，否则可能导致软激活失败。这个grldr使用随机的hash和干扰码干扰生成，为的也是骗过微软的反盗版检测。如果你没有上面这些问题，你就先下载官方的<a href="http://download.gna.org/grub4dos/" target="_blank">GRUB4DOS</a>，提取出grldr.mbr,grldr。grldr.mbr的作用就是在被ntldr/bootmgr引导后寻找grldr并加载并加他。如果你有上面有上面那种情况，和软刷的win7冲突的,请下载我修改的<a href="https://dl-web.dropbox.com/u/3241202/apps/GRUB/irldr.zip" target="_blank">irldr.mbr和irldr</a>。作用是一样的，不过irldr.mbr寻找和加载的是被重命名为irldr的grldr（貌似有点拗口 <img src='http://ihipop.info/wp-includes/images/smilies/icon_twisted.gif' alt=':twisted:' class='wp-smiley' />  ）</p>
<p>boot.ini这样写</p>
<pre class="brush: plain; title: ; notranslate">[boot loader]
timeout=0
default=c:\irldr.mbr
[operating systems]
C:\irldr.mbr=&quot;Grub4Irldr&quot;</pre>
<p>然后写个menu.lst</p>
<pre class="brush: plain; title: ; notranslate">title Install Chakra
find --set-root --ignore-floppies --ignore-cd /chakraiso.img
kernel /chakraiso chakraisolabel=CL_20111217 quiet lang=zhcn nonfree=yes xdriver=no
initrd /chakraiso.img </pre>
<p>简单说明一下，这个的kernel后面的引导参数都是从光盘的isolinux引导参数上面提取的(我提取自"/cdrom/isolinux/zhcn.cfg")，我只修改了一个地方，nonefree被我修改成了yes，因为我是nvidia显卡。你懂的。<br />
chakraiso和chakraiso.img放在任何一个盘的根目录下面均可。同时把那个ISO也放到因盘或者你的U盘的根目录下面。<br />
接着就是重启，win7的引导菜单里面选择Grub4Irldr。接着出现一个GRUB4DOS的界面，选择install chakra。如果你的ISO在U盘，记得天前插入。<br />
接着chakra内核就开始引导了。大概过了三十秒，会报错，同时进入一个busybox的ram shell。<br />
下面就开始技术活了。假设你的U盘在Udev里面被映射成为sdb，文件系统为fat</p>
<pre class="brush: bash; title: ; notranslate">mkdir udisk
mount -t vfat -r /dev/sdb /udisk
losetup /dev/loop7 /udisk/chakra-2011.12-Edn-CD-x86_64.iso</pre>
<p>这里说明一下，如果你的iso放在ntfs格式的硬盘，vfat换成ntfs格式即可。记得加上-r进行只读挂载，如你不想出现文件系统错误，windows提示自检的话。<br />
iso文件名字其实输入的时候可以按tab补全，这个大家都懂的。loop7什么的不是固定的 只要是不被占用的loop设备就可以了<br />
完毕后按下快捷键ctrl+D，内核开始寻找和挂载安装设备，接着就无障碍的进入图形安装界面了。<br />
到安装界面的话基本顺利了，如果要说，不得不说的是那个地球仪选时区的创意很棒啊。<br />
还有要说的就是一个这个chakra的一个bug。其实是mkswap的一个bug。由于2011.12这个build使用的是linux 3.0分支的内核，而内置的util-linux版本是2.19.1-2 。这个版本内置的mkswap不能正确检测linux kernel version string,<br />
mkswap检测kernel version string,低版本内核（2.2.x），那么就只支持创建小于2GB的swap分区。3.x这个数字让mkswap咯屁了。mkswap以为是2.2.x或者更旧的内核分支。于是出现了这样的提示</p>
<pre class="brush: plain; title: ; notranslate">mkswap /dev/sda8
mkswap: warning: truncating swap area to 2097144 KiB
Setting up swapspace version 1, size = 2097140 KiB
no label, UUID=e7745552-5c78-4a80-8228-fac5ad501ef8</pre>
<p><a href="http://chakra-project.org/bbs/viewtopic.php?id=6009" target="_blank">这个问题已经在目前的testing分支修复了</a>升级到util-linux 2.20 +就可以。<br />
如果你需要创建大于2GB的swap分区，你可以先行升级。编辑live环境的/etc/pacman.conf 取消testing分支的注释，然后启用163镜像。</p>
<pre class="brush: bash; title: ; notranslate">cat &lt;&lt;EOF &gt;&gt;/etc/pacman.conf
[testing]
Include = /etc/pacman.d/mirrorlist
EOF
echo 'Server = http://mirrors.163.com/kdemod/$repo/x86_64' &gt;/etc/pacman.d/mirrorlist

pacman -Syy
pacman -S testing/sysvinit testing/util-linux</pre>
<p>升级这两个包到最新版本即可。<br />
另外，不建议在安装程序里面分区。我在安装程序里面的分区到PM或者DiskGenius下面看 全是错误且无法修复。只能重建。所以你还是实现规划好几个分区，哪怕是fat32的（swap分区例外），然后在安装的时候进行重新格式化就可哟i了。<br />
其他，没什么了。默认的引导器是BURG（基于GRUB2），漂亮是漂亮的，不过安装程序没有提供安装到分区上的选项。只能写MBR，是有点不太人性化。不过不建议在这里取消后使用chroot进去装在分区上，你就先让他写MBR，完事了用BootICE再写回去，然后用我们刚才说道的irldr的menu.lst引导就可以了。</p>
<pre class="brush: plain; title: ; notranslate">title Boot Chakra
find --set-root /boot/burg/core.img
kernel /boot/burg/core.img</pre>
<p>然后进去后再重新使用burg-install安装到分区引导记录上就可以了。</p>
<p>安装完毕后我装了一下nvdia的控制面板。GTK的。很丑。所以装了个oxygen-gtk ，又装了一个 chakra-gtk-config<br />
，便于在控制面板内设置GTK主题外观。其他么应该没什么了。一些必要的bundle可以使用bundle manager管理。这个已经不是重点。不说了。你们自己折腾去吧。</p>
]]></content:encoded>
			<wfw:commentRss>http://ihipop.info/2012/01/2921.html/feed</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Nginx rewrite中 Query String的处理</title>
		<link>http://ihipop.info/2012/01/2935.html</link>
		<comments>http://ihipop.info/2012/01/2935.html#comments</comments>
		<pubDate>Tue, 10 Jan 2012 13:57:50 +0000</pubDate>
		<dc:creator>ihipop</dc:creator>
				<category><![CDATA[LA/NMP Tech]]></category>
		<category><![CDATA[Linux Manger]]></category>
		<category><![CDATA[MyOriginal]]></category>
		<category><![CDATA[nginx]]></category>
		<category><![CDATA[Query String]]></category>
		<category><![CDATA[rewrite]]></category>
		<category><![CDATA[内置变量]]></category>

		<guid isPermaLink="false">http://ihipop.info/?p=2935</guid>
		<description><![CDATA[Nginx除了能对UA进行处理，乃能对特殊的Query String进行处理。 最典型的应用就是，location进行路径匹配的时候，是没办法是用正则表达一起捕获这个路径和querstring的。那么我想真的URL里面的Query String进行不同的rewrite，应该如何处理呢？答案就是$arg变量。 Nginx里面$query_string 与$args相同，存储了所提交的所有$query_string 比如&#38;p=2887&#38;q=test 如果想要在nginx里面单独访问这些变量。可以这样 比如$p变量可以这样访问 $arg_p 下面是用这样一个实例讲述一下。 我准备停用WAP-T-WAP插件，但是发现Google对我站点的wap收录比较多，为了保留SEO，对wap目录进行301重定向。 要求是 如果请求中的$query_string包含"q=数字"，301重新定向到首页交由index.php处理。 否则只是301重新定向到首页。 location ~* ^/wap/ { # if ( $http_user_agent ~* "(MSIE&#124;bot&#124;Spider&#124;Slurp)" ) { # } if ($args ~* "p=\d+$") { rewrite ^ $scheme://$host/?p=$arg_p? permanent; } #Rewrite 后面带一个?表示在重定向中使用query_tring rewrite ^/(.*)$ $scheme://$host/? permanent; } 效果: curl --head https://ihipop.info/wap/index-wap2.php?p=2 -k HTTP/1.1 301 Moved Permanently [...]]]></description>
			<content:encoded><![CDATA[<p>Nginx除了能对UA进行处理，乃能对特殊的Query String进行处理。<br />
最典型的应用就是，location进行路径匹配的时候，是没办法是用正则表达一起捕获这个路径和querstring的。那么我想真的URL里面的Query String进行不同的rewrite，应该如何处理呢？答案就是$arg变量。<br />
Nginx里面$query_string 与<a href="http://wiki.nginx.org/HttpCoreModule#.24args" target="_blank">$args</a>相同，存储了所提交的所有$query_string<br />
比如&amp;p=2887&amp;q=test<br />
如果想要在nginx里面单独访问这些变量。可以这样<br />
比如$p变量可以这样访问 $arg_p<br />
下面是用这样一个实例讲述一下。<br />
我准备停用WAP-T-WAP插件，但是发现Google对我站点的wap收录比较多，为了保留SEO，对wap目录进行301重定向。<br />
要求是 如果请求中的$query_string包含"q=数字"，301重新定向到首页交由index.php处理。<br />
否则只是301重新定向到首页。</p>
<pre>        location ~* ^/wap/ {
#               if ( $http_user_agent ~* "(MSIE|bot|Spider|Slurp)" ) {
#               }
                if ($args ~* "p=\d+$") {
                        rewrite ^ $scheme://$host/?p=$arg_p? permanent;
                }
                #Rewrite 后面带一个?表示在重定向中使用query_tring
                rewrite ^/(.*)$ $scheme://$host/<del datetime="2012-01-24T14:18:20+00:00">?</del> permanent;
                }</pre>
<p>效果:</p>
<pre>curl --head https://ihipop.info/wap/index-wap2.php?p=2 -k
HTTP/1.1 301 Moved Permanently
Server: nginx/0.8.54
Date: Tue, 10 Jan 2012 08:31:40 GMT
Content-Type: text/html
Content-Length: 185
Connection: keep-alive
Location: https://ihipop.info/?p=2
curl --head https://ihipop.info/wap/index-wap2.php?p=test -k
HTTP/1.1 301 Moved Permanently
Server: nginx/0.8.54
Date: Tue, 10 Jan 2012 08:31:36 GMT
Content-Type: text/html
Content-Length: 185
Connection: keep-alive
Location: https://ihipop.info/</pre>
<hr />
<p>关于rewrite后面的问号，其作用是去除后面的qrerystring，不加?的话，就是这样的<br />
比如原来的query_string是p=2887，不加问号的话 是重新定向到</p>
<p>http://ihipop.info/?2887&#038;p=2887</p>
<p>多了一个&amp;p=2887这样产生的 URI 不是很美观。<br />
<a href="http://forum.nginx.org/read.php?2,118933,118933" target="_blank">详见Remove query string on rewrite ：http://forum.nginx.org/read.php?2,118933,118933</a></p>
<hr />
<table style="width: 512px; height: 1553px;" border="0" cellspacing="0" cellpadding="0">
<thead>
<tr>
<td style="text-align: center;" colspan="3" width="226" height="33">Nginx 内置变量表（ ngx_http_variables）</td>
</tr>
</thead>
<colgroup>
<col width="226" />
<col width="58" />
<col width="833" /> </colgroup>
<tbody>
<tr>
<td width="226" height="33">变量名</td>
<td width="58">版本</td>
<td style="width: 100%;">简要说明</td>
</tr>
<tr>
<td width="226" height="33">$args</td>
<td width="58">1.0.8</td>
<td style="width: 100%;">请求中的参数;</td>
</tr>
<tr>
<td height="33">$binary_remote_addr</td>
<td>1.0.8</td>
<td style="width: 100%;">远程地址的二进制表示</td>
</tr>
<tr>
<td height="33">$body_bytes_sent</td>
<td>1.0.8</td>
<td style="width: 100%;">已发送的消息体字节数</td>
</tr>
<tr>
<td height="33">$content_length</td>
<td>1.0.8</td>
<td style="width: 100%;">HTTP请求信息里的"Content-Length";</td>
</tr>
<tr>
<td height="33">$content_type</td>
<td>1.0.8</td>
<td style="width: 100%;">请求信息里的"Content-Type";</td>
</tr>
<tr>
<td height="33">$document_root</td>
<td>1.0.8</td>
<td style="width: 100%;">针对当前请求的根路径设置值;</td>
</tr>
<tr>
<td height="33">$document_uri</td>
<td>1.0.8</td>
<td style="width: 100%;">与$uri相同;</td>
</tr>
<tr>
<td height="33">$host</td>
<td>1.0.8</td>
<td style="width: 100%;">请求信息中的"Host"，如果请求中没有Host行，则等于设置的服务器名;</td>
</tr>
<tr>
<td height="33">$hostname</td>
<td>1.0.8</td>
<td style="width: 100%;"></td>
</tr>
<tr>
<td height="33">$http_cookie</td>
<td>1.0.8</td>
<td style="width: 100%;">cookie 信息</td>
</tr>
<tr>
<td height="33">$http_post</td>
<td>1.0.8</td>
<td style="width: 100%;"></td>
</tr>
<tr>
<td height="33">$http_referer</td>
<td>1.0.8</td>
<td style="width: 100%;">引用地址</td>
</tr>
<tr>
<td height="33">$http_user_agent</td>
<td>1.0.8</td>
<td style="width: 100%;">客户端代理信息</td>
</tr>
<tr>
<td height="33">$http_via</td>
<td>1.0.8</td>
<td style="width: 100%;">最后一个访问服务器的Ip地址。</td>
</tr>
<tr>
<td height="33">$http_x_forwarded_for</td>
<td>1.0.8</td>
<td style="width: 100%;">相当于网络访问路径。</td>
</tr>
<tr>
<td height="33">$is_args</td>
<td>1.0.8</td>
<td style="width: 100%;"></td>
</tr>
<tr>
<td height="33">$limit_rate</td>
<td>1.0.8</td>
<td style="width: 100%;">对连接速率的限制;</td>
</tr>
<tr>
<td height="33">$nginx_version</td>
<td>1.0.8</td>
<td style="width: 100%;"></td>
</tr>
<tr>
<td height="33">$pid</td>
<td>1.0.8</td>
<td style="width: 100%;"></td>
</tr>
<tr>
<td height="33">$query_string</td>
<td>1.0.8</td>
<td style="width: 100%;">与$args相同;</td>
</tr>
<tr>
<td height="33">$realpath_root</td>
<td>1.0.8</td>
<td style="width: 100%;"></td>
</tr>
<tr>
<td height="33">$remote_addr</td>
<td>1.0.8</td>
<td style="width: 100%;">客户端地址;</td>
</tr>
<tr>
<td height="33">$remote_port</td>
<td>1.0.8</td>
<td style="width: 100%;">客户端端口号;</td>
</tr>
<tr>
<td height="33">$remote_user</td>
<td>1.0.8</td>
<td style="width: 100%;">客户端用户名，认证用;</td>
</tr>
<tr>
<td height="33">$request</td>
<td>1.0.8</td>
<td style="width: 100%;">用户请求</td>
</tr>
<tr>
<td height="33">$request_body</td>
<td>1.0.8</td>
<td style="width: 100%;"></td>
</tr>
<tr>
<td height="33">$request_body_file</td>
<td>1.0.8</td>
<td style="width: 100%;">发往后端的本地文件名称</td>
</tr>
<tr>
<td height="33">$request_completion</td>
<td>1.0.8</td>
<td style="width: 100%;"></td>
</tr>
<tr>
<td height="33">$request_filename</td>
<td>1.0.8</td>
<td style="width: 100%;">当前请求的文件路径名</td>
</tr>
<tr>
<td height="33">$request_method</td>
<td>1.0.8</td>
<td style="width: 100%;">请求的方法，比如"GET"、"POST"等;</td>
</tr>
<tr>
<td height="33">$request_uri</td>
<td>1.0.8</td>
<td style="width: 100%;">请求的URI，带参数;</td>
</tr>
<tr>
<td height="33">$scheme</td>
<td>1.0.8</td>
<td style="width: 100%;">所用的协议，比如http或者是https，比如rewrite^(.+)$$scheme://example.com$1redirect;</td>
</tr>
<tr>
<td height="33">$sent_http_cache_control</td>
<td>1.0.8</td>
<td style="width: 100%;"></td>
</tr>
<tr>
<td height="33">$sent_http_connection</td>
<td>1.0.8</td>
<td style="width: 100%;"></td>
</tr>
<tr>
<td height="33">$sent_http_content_length</td>
<td>1.0.8</td>
<td style="width: 100%;"></td>
</tr>
<tr>
<td height="33">$sent_http_content_type</td>
<td>1.0.8</td>
<td style="width: 100%;"></td>
</tr>
<tr>
<td height="33">$sent_http_keep_alive</td>
<td>1.0.8</td>
<td style="width: 100%;"></td>
</tr>
<tr>
<td height="33">$sent_http_last_modified</td>
<td>1.0.8</td>
<td style="width: 100%;"></td>
</tr>
<tr>
<td height="33">$sent_http_location</td>
<td>1.0.8</td>
<td style="width: 100%;"></td>
</tr>
<tr>
<td height="33">$sent_http_transfer_encoding</td>
<td>1.0.8</td>
<td style="width: 100%;"></td>
</tr>
<tr>
<td height="33">$server_addr</td>
<td>1.0.8</td>
<td style="width: 100%;">服务器地址，如果没有用listen指明服务器地址，使用这个变量将发起一次系统调用以取得地址(造成资源浪费);</td>
</tr>
<tr>
<td height="33">$server_name</td>
<td>1.0.8</td>
<td style="width: 100%;">请求到达的服务器名;</td>
</tr>
<tr>
<td height="33">$server_port</td>
<td>1.0.8</td>
<td style="width: 100%;">请求到达的服务器端口号;</td>
</tr>
<tr>
<td height="33">$server_protocol</td>
<td>1.0.8</td>
<td style="width: 100%;">请求的协议版本，"HTTP/1.0"或"HTTP/1.1";</td>
</tr>
<tr>
<td height="33">$uri</td>
<td>1.0.8</td>
<td style="width: 100%;">请求的URI，可能和最初的值有不同，比如经过重定向之类的。</td>
</tr>
</tbody>
</table>
<a href="http://ihipop.info/wp-content/plugins/download-monitor/download.php?id=33" title="Downloaded 16 times"><img src="/wp-content/plugins/download-monitor/img/downloads-icon.gif">nginx内置变量列表</a>|
]]></content:encoded>
			<wfw:commentRss>http://ihipop.info/2012/01/2935.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>适用于DD-WRT V24 SP1 的Auto DD VPN（PPTP+jffs）方案</title>
		<link>http://ihipop.info/2011/12/2887.html</link>
		<comments>http://ihipop.info/2011/12/2887.html#comments</comments>
		<pubDate>Sat, 03 Dec 2011 14:44:02 +0000</pubDate>
		<dc:creator>ihipop</dc:creator>
				<category><![CDATA[MyOriginal]]></category>
		<category><![CDATA[Network Manger]]></category>
		<category><![CDATA[Auto DD VPN]]></category>
		<category><![CDATA[DD-WRT V24 SP1]]></category>
		<category><![CDATA[DNSMASQ]]></category>

		<guid isPermaLink="false">http://ihipop.info/?p=2887</guid>
		<description><![CDATA[基本设置过程是一样的 可能原来的那些脚本在V24上有点问题的 自己修正了下脚本 在pptp+jffs（如何初始化?）方案中 run.sh废弃 使用下面的方案设置代替run.sh launch.sh 然后设置开机启动即可 关于DD WRT的开机rc脚本和命名规则 在这里看 个人不建议使用rc_startup 变量 vpnup.sh和vpndown.sh基本不要改动，除了在vpnup.sh末尾调用下/sbin/restart_dns清除可能中毒的dns缓存， 此外哦 为了解决DNSMASQ自动填充上层DNS值为wan_get_dns的值,比如电信pppoe获取到的的DNS的问题，在/jffs/etc/config建立这样一个可执行脚本 比如wan_dns.ipup 内容如下 然后会在建立pppoe连接后自动设定dns 基本这样就搞定了 DNSMASQ的设置参考我之前的文章吧 这里 DNSMASQ和vpnup.sh的思路是国外线路走VPN，国内走wan。之所以不想像某些人一样费力维护一张外国被污染的网站的路由版本的，因为这样是在是没有维护国内网站方便。国内IP段就那么多，而每天被污染的DNS和IP你又知道多少呢？Autproxy工作在应用层，切换什么的，自定义什么的都很方便，维护这样一张路由和域名表，就没有必要了 国内网站用的起CDN和双线的就那么几家，把他们的图片，js和css，主站的域名白名单整理整理清楚到时实在的举动。 为啥不用Gracemode(IP黑名单走VPN) @xream 你一开始就走错路了 应该准备国内域名和国内IP的白名单 而不是收集被墙的ip和域名黑名单。企业维护行为瞬息万变，可能这一秒解析的cdn节点是这个 下一秒就变了 autoproxy可行是因为他工作在应用层，随时可以便捷的自定义且只影响一个浏览器，而维护路由表就不划算了 @xream 你与其这样 还不如像我一样 收集收集好国内那些大企业的域名白名单和放置js和css的域名，指定ISP的dns解析，这才是正道 国内网站用的起双线和CDN且常上的就那么几个。而被墙的地址却在时刻增加或者动态减少，维护这样一套路由表和dns黑名单实在是不划算 @xream 嗯啊 向你那样Google的SA那天情趣来潮维护下CDN，就歇菜了。又要重新维护。 况且这样还有一个好处，就是出国全加密后，可以避免关键词检测。有些正常网站虽然没被墙，可是依然受到出国关键词检测的监控，搜索个江什么的都可能被重置，和吃苍蝇一样难受。 @xream gracemode一开始也就被我否决的 原因之前已经说过了 autoproxy工作在应用层，可以随时自定义和调节模式，相对灵活。维护这样一张国外IP黑名单，你总归是感觉不到爽的，维护的成本比autoproxy大，反映也不够灵活。chnroutes才给人大便般的顺畅感 CDN IP什么的变化太复杂了 尤其是一些大型网站 三天两头变的 这也是我为啥反感改Host的原因。使用使用正确的DNS获取正确的最合适结果才是我努力的方向。]]></description>
			<content:encoded><![CDATA[<p>基本设置过程是一样的 可能原来的那些脚本在V24上有点问题的 自己修正了下脚本<br />
在pptp+jffs（<a href="http://code.google.com/p/autoddvpn/wiki/jffs" target="_blank">如何初始化?</a>）方案中 run.sh废弃 使用下面的方案设置代替run.sh<br />
launch.sh</p>
<pre class="brush: bash; title: ; notranslate">#!/bin/sh
#Update by ihipop @ 2011/12/1 21:29
#http://ihipop.info
#This Version is tested and Passed @ dd-wrt.v24-13064_VINT_mega.bin (SP1 Build10020) on Linksys WRT54GS v2.1
VPNUP='vpnup.sh'
VPNDOWN='vpndown.sh'
VPNLOG='/tmp/autoddvpn.log'
#PPTPSRVSUB=$(nvram get pptpd_client_srvsub)
DLDIR='http://autoddvpn.googlecode.com/svn/trunk/'
#CRONJOBS=&quot;* * * * * root /bin/sh /tmp/check.sh &gt;&gt; /tmp/last_check.log&quot;
PID=$$
INFO=&quot;[INFO#${PID}]&quot;
DEBUG=&quot;[DEBUG#${PID}]&quot;
IPUP=&quot;/etc/config/pptpd_client.ip-up&quot;
IPDOWN=&quot;/etc/config/pptpd_client.ip-down&quot;
WORKING=&quot;/jffs/pptp&quot;

echo &quot;$INFO $(date &quot;+%d/%b/%Y:%H:%M:%S&quot;) log starts&quot; &gt;&gt; $VPNLOG
echo &quot;$INFO $(date &quot;+%d/%b/%Y:%H:%M:%S&quot;) pptp+jffs mode&quot; &gt;&gt; $VPNLOG

cd $WORKING
cp -f $IPUP ./
cp -f $IPDOWN ./

OLD_IPUP=$IPUP
OLD_IPDOWN=$IPDOWN
IPUP=$WORKING&quot;/pptpd_client.ip-up&quot;
IPDOWN=$WORKING&quot;/pptpd_client.ip-down&quot;

sed -ie &quot;s#exit 0#${WORKING}/${VPNUP} pptp\nexit 0#g&quot; $IPUP
echo &quot;$INFO $(date &quot;+%d/%b/%Y:%H:%M:%S&quot;) $IPUP modified&quot; &gt;&gt; $VPNLOG
sed -ie &quot;s#exit 0#${WORKING}/${VPNDOWN} pptp\nexit 0#g&quot; $IPDOWN
echo &quot;$INFO $(date &quot;+%d/%b/%Y:%H:%M:%S&quot;) $IPDOWN modified&quot; &gt;&gt; $VPNLOG

echo &quot;$INFO $(date &quot;+%d/%b/%Y:%H:%M:%S&quot;) Mounting Files&quot; &gt;&gt; $VPNLOG
mount --bind $IPUP $OLD_IPUP
mount --bind $IPDOWN $OLD_IPDOWN
echo &quot;$INFO $(date &quot;+%d/%b/%Y:%H:%M:%S&quot;) ALL DONE. Let's wait for VPN being connected&quot; &gt;&gt; $VPNLOG

#FOR TESTING Purpose,Do not Ucomment This Below
#umount $OLD_IPUP
#umount $OLD_IPDOWN
</pre>
<p>然后设置开机启动即可</p>
<pre class="brush: bash; title: ; notranslate">mkdir -p /jffs/etc/config
echo /jffs/pptp/launch.sh &gt;/jffs/etc/config/pptp.startup
chmod +x /jffs/etc/config/pptp.startup </pre>
<p><a href="http://www.dd-wrt.com/wiki/index.php/Script_Execution" target="_blank">关于DD WRT的开机rc脚本和命名规则 在这里看</a> 个人不建议使用<a href="http://www.dd-wrt.com/wiki/index.php/Startup_Scripts#Instructions" target="_blank">rc_startup</a> 变量<br />
<a href="http://autoddvpn.googlecode.com/svn/trunk/vpnup.sh">vpnup.sh</a>和<a href="http://autoddvpn.googlecode.com/svn/trunk/vpndown.sh" target="_blank">vpndown.sh</a>基本不要改动，<span style="color: #800000;">除了在vpnup.sh末尾调用下/sbin/restart_dns清除可能中毒的dns缓存</span>，</p>
<pre class="brush: bash; title: ; notranslate">[ -x /sbin/restart_dns ] &amp;&amp; /sbin/restart_dns</pre>
<p>此外哦 为了解决DNSMASQ自动填充上层DNS值为wan_get_dns的值,比如电信pppoe获取到的的DNS的问题，在/jffs/etc/config建立这样一个可执行脚本 比如wan_dns.ipup 内容如下</p>
<pre class="brush: bash; title: ; notranslate">nvram set wan_get_dns=&quot;8.8.8.8 8.8.4.4&quot;
nvram commit
[ -x /sbin/restart_dns ] &amp;&amp; /sbin/restart_dns</pre>
<p>然后会在建立pppoe连接后自动设定dns 基本这样就搞定了 DNSMASQ的设置参考我之前的文章吧</p>
<hr />
<p><span style="color: #800000;">这里 DNSMASQ和vpnup.sh的思路是国外线路走VPN，国内走wan。之所以不想像某些人一样费力维护一张外国被污染的网站的路由版本的，因为这样是在是没有维护国内网站方便。国内IP段就那么多，而每天被污染的DNS和IP你又知道多少呢？Autproxy工作在应用层，切换什么的，自定义什么的都很方便，维护这样一张路由和域名表，就没有必要了</span><br />
<span style="color: #800000;"> 国内网站用的起CDN和双线的就那么几家<a title="新浪视频的Access Control真有意思" href="http://ihipop.info/2010/12/1977.html" target="_blank">，把他们的图片，js和css，主站的域名白名单整理整理清楚到时实在的举动。</a></span></p>
<p>为啥不用Gracemode(IP黑名单走VPN)</p>
<blockquote><p>@xream 你一开始就走错路了 应该准备国内域名和国内IP的白名单 而不是收集被墙的ip和域名黑名单。企业维护行为瞬息万变，可能这一秒解析的cdn节点是这个 下一秒就变了 autoproxy可行是因为他工作在应用层，随时可以便捷的自定义且只影响一个浏览器，而维护路由表就不划算了<br />
@xream 你与其这样 还不如像我一样 收集收集好国内那些大企业的域名白名单和放置js和css的域名，指定ISP的dns解析，这才是正道 国内网站用的起双线和CDN且常上的就那么几个。而被墙的地址却在时刻增加或者动态减少，维护这样一套路由表和dns黑名单实在是不划算<br />
@xream 嗯啊 向你那样Google的SA那天情趣来潮维护下CDN，就歇菜了。又要重新维护。 况且这样还有一个好处，就是出国全加密后，可以避免关键词检测。有些正常网站虽然没被墙，可是依然受到出国关键词检测的监控，搜索个江什么的都可能被重置，和吃苍蝇一样难受。<br />
@xream gracemode一开始也就被我否决的 原因之前已经说过了<br />
autoproxy工作在应用层，可以随时自定义和调节模式，相对灵活。维护这样一张国外IP黑名单，你总归是感觉不到爽的，维护的成本比autoproxy大，反映也不够灵活。chnroutes才给人大便般的顺畅感</p></blockquote>
<blockquote><p>CDN IP什么的变化太复杂了 尤其是一些大型网站 三天两头变的 这也是我为啥反感改Host的原因。使用使用正确的DNS获取正确的最合适结果才是我努力的方向。</p></blockquote>
]]></content:encoded>
			<wfw:commentRss>http://ihipop.info/2011/12/2887.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Buffalo的LS-WXL/E NAS改机小记</title>
		<link>http://ihipop.info/2011/11/2871.html</link>
		<comments>http://ihipop.info/2011/11/2871.html#comments</comments>
		<pubDate>Wed, 16 Nov 2011 06:14:28 +0000</pubDate>
		<dc:creator>ihipop</dc:creator>
				<category><![CDATA[MyOriginal]]></category>
		<category><![CDATA[Buffalo]]></category>
		<category><![CDATA[LS-WXL/E]]></category>
		<category><![CDATA[raid]]></category>
		<category><![CDATA[改机]]></category>

		<guid isPermaLink="false">http://ihipop.info/?p=2871</guid>
		<description><![CDATA[这款NAS很有性价比 买回来不带硬盘 虽然CPU有些孱弱大概600MHZ左右，是Marvell Feroceon 88FR131 [56251311] revision 1 (ARMv5TE)，但是作为600元的一款NAS来说，集成了一大堆功能，真的是物有所值。 默认固件阉割了Telnet/SSH ,使用acp_commander.jar也无法取得root和telnet权限，干脆不折腾了 直接刷开了SSH/Telnet的第三方MOD 推荐这款 http://forum.buffalo.nas-central.org/viewtopic.php?f=68&#038;t=23603 下载下来后 运行LSUpdater.exe即可 整个过程是傻瓜化的 大约需要10几min，期间保证不要断电就可以了 另外，电源模式千万不要切换成auto auto模式是很省电，只要你安装了NAS Navigator2 这玩意就会随着安装NAS Navigator2 的电脑一起开机关机自动唤醒等。 我刷的就是ls_series-154-mod1，刷固件一般不会造成硬盘数据丢失。不过你要是不放心的话 可以再备份下。 刷好后进入webadmin重置默认设置，这样webadmin的用户名和密码会被重置为admin/password 而root用户的密码也会被清空，直接ssh登录即可 上去后记得修改密码 网上说开启了raid的NAS无法改机成功，实际上我发现是因为他们装错optware了，基本上都是装的lspro-bootstrap 按照Buffalo的wiki的要求来就可以，没任何问题。这里使用的是teraprov2-bootstrap.真正的opt目录会被隐藏在/mnt/array1/.optware/ 由/etc/init.d/rc.optware控制 这里的ipkg就是一个包管理器，类似于yum或者apt-get 下面就可以自己发挥了 什么screen，transmission，rtorrent，dnsmasq，甚至pptp freeradius，Python2.4-Python2.6都有。Linux下面的灵活性 想干嘛就干嘛啦。不过可能受到内核限制，一些底层应用 比如iptables，不能正常工作。 如果你愿意 可以按照wiki上说的 在/opt/etc/ipkg.conf源里面添加cs08q1armel分支（默认是cs05q3armel） 当然 如果你愿意 上个debian6也未尝不可 可以参考这里 http://buffalo.nas-central.org/wiki/Debian_Squeeze_on_LS-WXL]]></description>
			<content:encoded><![CDATA[<p><img src="http://www.buffalo-china.com/images/upload/ls-wxl_r1_x.jpg" alt="" /><br />
这款NAS很有性价比 买回来不带硬盘 虽然CPU有些孱弱大概600MHZ左右，是Marvell Feroceon 88FR131 [56251311] revision 1 (ARMv5TE)，但是作为600元的一款NAS来说，集成了一大堆功能，真的是物有所值。<br />
默认固件阉割了Telnet/SSH ,使用acp_commander.jar也无法取得root和telnet权限，干脆不折腾了 直接刷开了SSH/Telnet的第三方MOD<br />
推荐这款<br />
<a href="http://forum.buffalo.nas-central.org/viewtopic.php?f=68&#038;t=23603" target="_blank">http://forum.buffalo.nas-central.org/viewtopic.php?f=68&#038;t=23603</a><br />
下载下来后 运行LSUpdater.exe即可 整个过程是傻瓜化的 大约需要10几min，期间保证不要断电就可以了<br />
另外，电源模式千万不要切换成auto<br />
auto模式是很省电，只要你安装了NAS Navigator2  这玩意就会随着安装NAS Navigator2 的电脑一起开机关机自动唤醒等。<br />
我刷的就是ls_series-154-mod1，刷固件一般不会造成硬盘数据丢失。不过你要是不放心的话 可以再备份下。<br />
刷好后进入webadmin重置默认设置，这样webadmin的用户名和密码会被重置为admin/password 而root用户的密码也会被清空，直接ssh登录即可 上去后记得修改密码<br />
网上说开启了raid的NAS无法改机成功，实际上我发现是因为他们装错optware了，基本上都是装的lspro-bootstrap<br />
按照<a href="http://buffalo.nas-central.org/wiki/Category:LS-WXL#IPKG" target="_blank">Buffalo的wiki</a>的要求来就可以，没任何问题。这里使用的是teraprov2-bootstrap.真正的opt目录会被隐藏在/mnt/array1/.optware/<br />
由/etc/init.d/rc.optware控制</p>
<pre class="brush: bash; title: ; notranslate">cd /tmp
wget http://ipkg.nslu2-linux.org/feeds/optware/cs05q3armel/cross/stable/teraprov2-bootstrap_1.2-7_arm.xsh
sh ./teraprov2-bootstrap_1.2-7_arm.xsh
ipkg update
ipkg upgrade</pre>
<p>这里的ipkg就是一个包管理器，类似于yum或者apt-get<br />
下面就可以自己发挥了 什么screen，transmission，rtorrent，dnsmasq，甚至pptp freeradius，Python2.4-Python2.6都有。Linux下面的灵活性 想干嘛就干嘛啦。不过可能受到内核限制，一些底层应用 比如iptables，不能正常工作。<br />
如果你愿意 可以按照wiki上说的<br />
在/opt/etc/ipkg.conf源里面添加cs08q1armel分支（默认是cs05q3armel）</p>
<pre class="brush: plain; title: ; notranslate">src cs08q1 http://ipkg.nslu2-linux.org/feeds/optware/cs08q1armel/cross/stable/</pre>
<p>当然 如果你愿意 上个debian6也未尝不可<br />
可以参考这里 <a href="http://buffalo.nas-central.org/wiki/Debian_Squeeze_on_LS-WXL" target="_blank">http://buffalo.nas-central.org/wiki/Debian_Squeeze_on_LS-WXL</a></p>
]]></content:encoded>
			<wfw:commentRss>http://ihipop.info/2011/11/2871.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Windows Server 2003 Resource Kit Tools &amp;&amp; Sleep Command</title>
		<link>http://ihipop.info/2011/11/2869.html</link>
		<comments>http://ihipop.info/2011/11/2869.html#comments</comments>
		<pubDate>Fri, 11 Nov 2011 05:34:15 +0000</pubDate>
		<dc:creator>ihipop</dc:creator>
				<category><![CDATA[Windows Server]]></category>
		<category><![CDATA[bat]]></category>
		<category><![CDATA[cmd]]></category>
		<category><![CDATA[sleep]]></category>
		<category><![CDATA[批处理]]></category>

		<guid isPermaLink="false">http://ihipop.info/?p=2869</guid>
		<description><![CDATA[Windows下没有sleep命令 可以试试Windows Server 2003 Resource Kit Tools 就是Windows Server 2003 资源工具包。 这个包内包含了sleep命令(支持精确到ms级别的延迟) 甚至提供了一个tail命令 下载地址 http://www.microsoft.com/download/en/details.aspx?DisplayLang=en&#038;id=17657 安装后提取出sleep.exe 再次运行安装程序即可卸载 Usage: sleep time-to-sleep-in-seconds sleep [-m] time-to-sleep-in-milliseconds sleep [-c] commited-memory ratio (1%-100%)]]></description>
			<content:encoded><![CDATA[<p>Windows下没有sleep命令 可以试试Windows Server 2003 Resource Kit Tools  就是Windows Server 2003 资源工具包。<br />
这个包内包含了sleep命令(支持精确到ms级别的延迟) 甚至提供了一个tail命令<br />
下载地址 <a href="http://www.microsoft.com/download/en/details.aspx?DisplayLang=en&#038;id=17657" target="_blank">http://www.microsoft.com/download/en/details.aspx?DisplayLang=en&#038;id=17657</a><br />
安装后提取出sleep.exe 再次运行安装程序即可卸载</p>
<blockquote><p>Usage:  sleep      time-to-sleep-in-seconds<br />
        sleep [-m] time-to-sleep-in-milliseconds<br />
        sleep [-c] commited-memory ratio (1%-100%)</p></blockquote>
]]></content:encoded>
			<wfw:commentRss>http://ihipop.info/2011/11/2869.html/feed</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>导出别人DiscuzX的插件语言包</title>
		<link>http://ihipop.info/2011/11/2865.html</link>
		<comments>http://ihipop.info/2011/11/2865.html#comments</comments>
		<pubDate>Thu, 10 Nov 2011 08:01:12 +0000</pubDate>
		<dc:creator>ihipop</dc:creator>
				<category><![CDATA[Discuz Tech]]></category>
		<category><![CDATA[discuz]]></category>
		<category><![CDATA[pluginlanguage_script]]></category>
		<category><![CDATA[var_export]]></category>
		<category><![CDATA[导出]]></category>
		<category><![CDATA[插件]]></category>
		<category><![CDATA[语言包]]></category>

		<guid isPermaLink="false">http://ihipop.info/?p=2865</guid>
		<description><![CDATA[DZ得开发模式语言包言包临时目录（开发模式）在 data/plugindata/插件id.lang.php 这个不是每个插件都会用到这个目录。 对于需要修改语言包的时候 没有这个开发目录里面的文件确实不方便，好像以前有人出过一个工具，记不得了，我修改了DZ的语言函数来实现 function_core.php lang函数 找到 $returnvalue = &#038; $_G['cache']['pluginlanguage_script']; 下面加上一句话 file_put_contents('abcdefgh.txt',var_export($_G['cache']['pluginlanguage_script'],true)); 如果需要精细一点 $_G['cache']['pluginlanguage_script']可以换成$_G['cache']['pluginlanguage_script']['插件id'] 打开生成的abcdefgh.txt 提取出这个数组 放到data/plugindata/插件id.lang.php 赋值给 $scriptlang['插件id'] 即可。 var_export导出的数组符合语法规范 可以直接赋值。 在开发模式下修改插件后 再次用设计模式导出为XML即可]]></description>
			<content:encoded><![CDATA[<p>DZ得开发模式语言包言包临时目录（开发模式）在 data/plugindata/插件id.lang.php<br />
这个不是每个插件都会用到这个目录。<br />
对于需要修改语言包的时候 没有这个开发目录里面的文件确实不方便，好像以前有人出过一个工具，记不得了，我修改了DZ的语言函数来实现<br />
function_core.php lang函数 找到<br />
$returnvalue = &#038; $_G['cache']['pluginlanguage_script'];<br />
下面加上一句话<br />
file_put_contents('abcdefgh.txt',var_export($_G['cache']['pluginlanguage_script'],true));<br />
如果需要精细一点 $_G['cache']['pluginlanguage_script']可以换成$_G['cache']['pluginlanguage_script']['插件id']<br />
打开生成的abcdefgh.txt 提取出这个数组 放到data/plugindata/插件id.lang.php 赋值给 $scriptlang['插件id'] 即可。<br />
var_export导出的数组符合语法规范 可以直接赋值。<br />
在开发模式下修改插件后 再次用设计模式导出为XML即可</p>
]]></content:encoded>
			<wfw:commentRss>http://ihipop.info/2011/11/2865.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>

