<?xml version="1.0" encoding="utf-8"?>
<feed xmlns="http://www.w3.org/2005/Atom">
  <title><![CDATA[chenall's Blog]]></title>
  <subtitle><![CDATA[走自己的路,让别人说去吧]]></subtitle>
  <link href="/atom.xml" rel="self"/>
  <link href="http://chenall.net/"/>
  <updated>2016-01-18T07:04:41.207Z</updated>
  <id>http://chenall.net/</id>
  
  <author>
    <name><![CDATA[chenall]]></name>
    
  </author>
  
  <generator uri="http://zespia.tw/hexo/">Hexo</generator>
  
  <entry>
    <title><![CDATA[[GRUB4DOS] Universal Master Boot Record]]></title>
    <link href="http://chenall.net/post/grub4dos_umbr/"/>
    <id>http://chenall.net/post/grub4dos_umbr/</id>
    <published>2016-01-18T02:25:28.000Z</published>
    <updated>2016-01-18T07:04:32.000Z</updated>
    <content type="html"><![CDATA[<h3 id="[功能说明]">[功能说明]</h3>
<p>  UMBR(Universal Master Boot Record),是一个简单的通用型的MBR引导程序,只支持LBA模式(BIOS不支持LBA的无法使用,目前除了很老的机子大部份都有支持).</p>
<p>使用创新的方案,和磁盘分区格式无关所以可以安装到MBR或GPT分区格式下,目前GPT磁盘一般都是配合EFI来启动,有了它就可以在BIOS模式下直接启动GPT磁盘上的系统(需要系统有支持)了.</p>
<a id="more"></a>

<h2 id="[使用方法]">[使用方法]</h2>
<p>  目前该程序只能在<a href="http://grub4dos.chenall.net" target="_blank" rel="external">GRUB4DOS</a>环境下运行,请在最新版本GRUB4DOS环境下使用.</p>
<p>参数介绍:</p>
<pre><code>umbr [-d=D] [-p=P] [--test] [file1] [file2] [file3]
    -d=D            指定要安装的磁盘默认是当前ROOT的磁盘
    -p=D            启动失败后要启动的分区默认是第一个分区.
    --test            测试模式,不写入磁盘,加这个参数会进入安装效果测试.
    file1-3            可以指定三个启动文件位置以防止启动失败.

注: 这个filex    可以是任意GRUB4DOS可以识别的文件格式(必须连续存放).比如(hdx,y)/path/file或(hdx)xxxx+yyyy/(hdx,y)xxx+yyy之类的.
    file1-file3 必须在同一磁盘上并且和-d指定的磁盘一致.
    file1-2    也可以是一是一个PBR比如(hd0,3)+1
file1是主启动文件,如果检验失败了会再尝试file2...
</code></pre><p>说明:</p>
<ol>
<li>由于是直接使用绝对扇区位置来启动的,所以和文件系统无关.</li>
<li>使用指定文件也会被转换为绝对扇区位置,正常情况下改名不影响启动,删除了如果文件内容没有被覆盖之前也是可以启动的.</li>
<li>启动失败时会暂停并等待按键,这时按任意键可以尝试下一个.</li>
</ol>
<p>一个实用的例子:</p>
<p>磁盘使用的是GPT格式,GRLDR有两个备份分别是ESP分区(hd0,0)/grldr和普通分区(hd0,3)/boot/grub/grldr,并且在分区间隙(hd0)6554433+63处有一个WEE63</p>
<p>装有系统的分区是(hd0,1)</p>
<p>这时就可以通过UMBR默认加载ESP分区的GRLDR或普通分区上的GRLDR,失败了再尝试WEE63,还是失败就直接启动(hd0,1)分区.</p>
<p>进入GRUB4DOS执行以下命令就可以了</p>
<pre><code>umbr -d=0 -p=1 (hd0,3)/boot/grub/grldr (hd0,0)/grldr (hd0)6554433+63
</code></pre><p>也可以默认wee63,通过wee63来控制启动过程,因为本例wee63是写到分区间隙的,出问题的几率比较小</p>
<pre><code>umbr -d=0 -p=1 (hd0)6554433+63 (hd0,3)/boot/grub/grldr (hd0,0)/grldr
</code></pre><p>当然了也可以直接启动指定分区而不通过其它引导程序,如下默认直接启动(hd0,1)上的系统,如果该分区被分区软件调整过启动失败了,会尝试启动wee,最后尝试启动grldr</p>
<pre><code>umbr -d=0 -p=1 (hd0,1)+1 (hd0)6554433+63 (hd0,0)/grldr
</code></pre><h2 id="[其它参考]">[其它参考]</h2>
<p>UMBR 相关说明</p>
<pre><code>0x8            4个字节        UMBR标志
0xC            1个字节        UMBR版本号
0x10-0X3F    48个字节    用户定义的启动区
0x40-0X4F    16个字节    保留的启动区(当用户定义的启动都失败时启动的分区)
0x40-0x1B7                启动代码.
</code></pre><p>启动区说明,目前0x10-0x4F,每一个启动项占用16个字节,为了编程方便使用的是和DiskAddressPacket一样的格式.</p>
<pre><code>    WORD CRC;            //启动项校验
　　WORD BlockCount;　　// 启动代码块数(以扇区为单位)
　　DWORD BufferAddr;　　// 传输缓冲地址(segment:offset),也就是启动地址
　　QWORD BlockNum;　　　// 启动代码在磁盘上的位置(LBA)
</code></pre><p>BufferAddr    的值为0x07c00000(07c0:0000)时固定为PBR引导,启动时会自动修改0x7c1c处的值.其它值直接从该位置启动.</p>
<p>校验方法: 使用的是简单的XOR校验,最多校验127个扇区,按4个字节依次XOR得到的最后结果,再把低16位和高16位进行一次XOR得到最后的结果作为检验值.</p>
<p>具体的校验代码可以参考源码有ASM/C语言两个版本.</p>
<h2 id="[源码下载]">[源码下载]</h2>
<p>源代码: <a href="https://github.com/chenall/grubutils" target="_blank" rel="external">https://github.com/chenall/grubutils</a></p>
<p>应用下载: <a href="http://b.chenall.net/boot/grub/umbr" target="_blank" rel="external">http://b.chenall.net/boot/grub/umbr</a> </p>
]]></content>
    <summary type="html"><![CDATA[<h3 id="[功能说明]">[功能说明]</h3>
<p>  UMBR(Universal Master Boot Record),是一个简单的通用型的MBR引导程序,只支持LBA模式(BIOS不支持LBA的无法使用,目前除了很老的机子大部份都有支持).</p>
<p>使用创新的方案,和磁盘分区格式无关所以可以安装到MBR或GPT分区格式下,目前GPT磁盘一般都是配合EFI来启动,有了它就可以在BIOS模式下直接启动GPT磁盘上的系统(需要系统有支持)了.</p>
]]></summary>
    
      <category term="umbr" scheme="http://chenall.net/tags/umbr/"/>
    
      <category term="GRUB4DOS" scheme="http://chenall.net/tags/GRUB4DOS/"/>
    
      <category term="原创" scheme="http://chenall.net/tags/%E5%8E%9F%E5%88%9B/"/>
    
      <category term="GRUB4DOS" scheme="http://chenall.net/categories/GRUB4DOS/"/>
    
      <category term="扩展" scheme="http://chenall.net/categories/GRUB4DOS/%E6%89%A9%E5%B1%95/"/>
    
  </entry>
  
  <entry>
    <title><![CDATA[【分享】WIMBoot辅助工具 For Windows 7/8]]></title>
    <link href="http://chenall.net/post/windows7_wimboot/"/>
    <id>http://chenall.net/post/windows7_wimboot/</id>
    <published>2015-04-21T09:28:00.000Z</published>
    <updated>2015-09-07T04:02:36.000Z</updated>
    <content type="html"><![CDATA[<p>把WINDOWS 8的WIMBOOT功能应用到WINDOWS 7上,目前使用一切正常.</p>
<p>使用WIMBOOT可以节省大量的磁盘空间,特别是多系统的情况下更是明显.另外还具有<code>WIM</code>文件的特性,比如<strong>增量备份</strong>,如果每隔一段时间就使用增量更新一下WIM那以后就可以随时恢复到<strong>每个更新点</strong>的状态.</p>
<p>正常安装的话一个64位的系统就差不多需要40GB了,我现在两个系统最多也才40GB,是不是很心动呢!</p>
<a id="more"></a>

<p>首先来秀一下最终的文件列表,很简洁.两个系统最多才占用40GB的空间.我使用用一个60G的固态硬盘.启动速度飞快.7秒左右进桌面</p>
<p>另外这两个系统还是打完了所有补丁再安装了所有需要的常用软件的,还包括了好几个G的VS2012,因为WIM文件相同的文件只会占用一个空间,所以我两个系统的所有的软件都装C盘.</p>
<p>注: 这个<code>40G</code>是指<strong>最多</strong>会占用空间,实际上只使用了<code>15G</code>左右,考虑到以后要安装软件还有更新什么的,64位保留15G,32位保留10G.</p>
<pre><code>注：1. 以下只是我的系统情况演示，只供参考
    2. 2015-05-01 感觉差分VHD是不必要的，以后更新的话只要更新主VHD就行了。并且由于我的内存有8G所以重新制作了一下，增加了一个5G的内存系统(win7.ram)。

有三个系统，并且以后可以随时增加

1. win7 x86 wimboot              ==&gt;x86\win7.vhd
2. win7 x86 wimboot(内存模式)    ==&gt;x86\win7.ram
3. win7 x64 wimboot                ==&gt;x64\win7.vhd

 BOOTMGR ==&gt;启动文件
 wimboot.wim ==&gt;和wimboot目录下的一样,只是为了方便更新系统
├─boot  ==&gt;启动文件目录
│  │  memtest.exe
│  │  
│  ├─Fonts ==&gt;启动界面字体
│  │      chs_boot.ttf
│  │      cht_boot.ttf
│  │      jpn_boot.ttf
│  │      kor_boot.ttf
│  │      wgl4_boot.ttf
│  │      
│  │      
│  └─zh-CN
│        bootmgr.exe.mui
│        memtest.exe.mui
│          
└─wimboot ==&gt;系统文件夹
    │  wimboot.wim  ==&gt;系统WIM WINDOWS 7 x86/x64二合一镜像 占用14G空间
    │  
    ├─x64  ==&gt;64位系统
    │      win7.vhd  ==&gt;64位系统主15G VHD文件  ==&gt;使用非固实模式只占用400MB左右
    │      
    └─x86    ==&gt;32位系统
            Win7.vhd ==&gt;32位系统主10G VHD文件  ==&gt;使用非固实模式只占用400MB左右
            Win7.ram ==&gt;32位系统RAM模式镜像40MB(使用grub4dos map --mem --top来启动)
</code></pre><p>再来一张截图对比(整个系统有16G实际只占用了703MB的空间)</p>
<p><img src="http://qiniu.chenall.net/post/2015042_01.png/w400.png" alt=""></p>
<p>看了上面的简单介绍是不是很心动,也想自己改造一个呢?别急慢慢来.</p>
<h2 id="先来介绍一下WIMBOOT">先来介绍一下<code>WIMBOOT</code></h2>
<p>  <a href="https://msdn.microsoft.com/zh-cn/library/dn594399.aspx" target="_blank" rel="external">WIMBoot</a>是Windows image file boot的简称，是Windows 8.1 的一项新型启动方式。这种启动方式让电脑从一个高度压缩的文件启动，大大减少了磁盘空间的占有，还具有快速升级、快速恢复出厂设置等优点.</p>
<ul>
<li>Windows 映像文件启动 (WIMBoot) 使你可以设置电脑以便它从压缩的 Windows 映像文件 (WIM file) 直接运行。</li>
<li>WIMBoot 可以大幅减少 Windows 文件使用的空间量。这有助于你为用户提供更多可用空间，并且帮助你在带有较小驱动器的电脑上部署 Windows。  </li>
</ul>
<h2 id="让Windows_7支持WIMBOOT方式启动">让Windows 7支持<code>WIMBOOT</code>方式启动</h2>
<p>WINDOWS 7 使用WIMBOOT的方法在网上论坛上有很多介绍,不过太部份操作起来都比较复杂,经过我的改造,现在简化了一些步骤，现在不需要任何输入，一键就可以实现了。</p>
<p>功能：  </p>
<ol>
<li>可以备份或恢复系统。 </li>
<li>支持直接增量更新. </li>
<li>支持WINDOWS 7及以上系统包括win10(未完全测试)  </li>
<li>可以作为系统备份工具来使用。  </li>
<li>自动识别WIMBoot系统WIM文件。 </li>
<li>自己去发现.</li>
</ol>
<p>提示：  </p>
<ul>
<li>增量更新功能需要格式化目标系统磁盘，所以如果WIM文件和系统同盘无法使用该功能。  </li>
<li>增量更新功能需要使用SYSTEM权限否则应用的时候可能会出现错误.（最新版应该解决了这个问题，不需要SYSTEM权限了）  </li>
<li>更新或捕获镜像名字格式为 <code>Win_系统版本_日期时间</code>，例子: Win_6.1_201505101200  </li>
<li>本程序只在WIN7系统测试通过，如果你有WIN8的系统也可以测试一下估计应该也是可以使用的。</li>
</ul>
<h2 id="更新记录">更新记录</h2>
<pre><code>2015-09-07 v2.5版
  1. BUG修正.
  2. 支持自定义实体化文件列表(同目录下的WimbootExtract.ini)

2015-07-27 v2.4版
  1. BUG修正.

2015-07-17 v2.3版
  1. 驱动更新到10240版,服务改为wofadk.
  2. 修正局域网打印机安装问题和浏览器DLL错误问题(感谢无论[2012liujingxion](http://bbs.wuyou.net/forum.php?mod=viewthread&amp;tid=367490))
  3. BUG修正.

2015-06-29 v2.2版
  1. 修正增量更新的一个BUG。
  2. 自适合DPI

2015-06-28 v2.1版
  1. BUG修正.
  2. Add English Language

2015-06-18 v2.0版
  1. BUG修正(长路径名恢复失败).
  2. 界面调整,改成了使用进度条(之前是直接显示WIMLIB执行的所有信息)
  3. 添加压缩率选项.

2015-06-17 v1.9版
  1. BUG修正.
  2. 盘符重置功能修改,增加自动判断.

2015-06-16 v1.8版
  1. 修正一个BUG.
  2. 驱动更新,解决NTFS软硬链接的问题.(已经有装过的,可以删除原系统drivers目录下的wof.sys文件,然后再使用增量更新或原地转换功能即可更新为最新版驱动)

2015-05-29 v1.7版
  1. 支持修改WIM信息(wim info)(新版的E按钮)
  2. 增加更多可选项,具体看后面的最新版截图
  3. 修正上个版本在PE下多次执行出错的问题.

2015-05-22 v1.6版
  1. 支持Windows 10
  2. 增量备份支持单独存放（不合并）
  3. 捕获或恢复时可以选择不使用WIMBoot.
  4. 界面调整程序优化并增加一些操作提示信息。
  5. 新的wimlib-imagex程序，支持显示中文镜像名称。

2015-05-18 v1.5版
  1. 新增仅捕获选项
  2. 新版本对于部份操作不再强制要求格式化。
  3. 对于已经是WIMBOOT的系统，现在可以正确识别该系统所使用的WIM文件，并自动选择该WIM文件
  4. BUG修正，界面调整。

2015-05-14 v1.4版
  1. 再次修改NTFS分区识别错误的问题
  2. 其它BUG修正
  3. 支持拖放操作，基本参数框内可以拖放WIM文件或WimBootCompress.ini文件
  4. 支持使用命令行修改默认的WIM文件存放目录, 格式如下:  
     WIMBoot.exe -WIMPATH:目录名  
     例子:使用WIMBOOT目录
     WIMBoot.exe -WIMPATH:\WIMBOOT

2015-05-12 v1.3版
    1. 修正部份PE检测Wof驱动失败的问题。
    2. WIMBoot.exe同目录下有存在WimBootCompress.ini捕获时会自动使用该配置。
    3. 几个小BUG修正，继续完善.

2015-05-11 v1.2版
    1. 禁用精简捕获模式，只使用完整捕获模式。
    2. 选择目标系统会自动判断是否已经是WIMBoot的，是的话会自动查找对应的WIM文件（目前不是很准确，先将就着）.

2015-05-10 更新： v1.1 使用我自己修改编译的WIMLIB程序，现在终于实现一步到位的更新操作，不再需要SYSTEM权限，修复了上个版本的两个小BUG。
2015-05-09 更新： 现在可以直接在PE下一步到位进行转换或更新操作（更新操作需要SYSTEM权限或WIN8PE），并且支持WES7 64位
2015-04-21 第一版，使用了两个批处理脚本来实现，需要两步来实现。
</code></pre><h3 id="操作方法">操作方法</h3>
<ol>
<li>从以下地址下载我修改优化的WIMBOOT辅助工具 WIMBOOT.7Z<br>链接: <a href="http://pan.baidu.com/s/1mgIbMyc" target="_blank" rel="external">http://pan.baidu.com/s/1mgIbMyc</a> 密码: 83qe</li>
<li>启动进入PE，如果原系统是VHD的，需先挂载VHD。</li>
<li>启动wimboot.exe选择系统盘和WIM文件存放磁盘。根据提示操作。</li>
</ol>
<h2 id="部份错误参考和问题解答">部份错误参考和问题解答</h2>
<ul>
<li><h3 id="使用WIMBoot之后启动动画变成了滚动条,这个可以使用最新版本,选中启动动画参数即可恢复原来的启动动画-">使用WIMBoot之后启动动画变成了滚动条,这个可以使用最新版本,选中<strong>启动动画</strong>参数即可恢复原来的启动动画.</h3>
</li>
<li><h3 id="使用WIMBoot之后系统盘将会不支持hardlink特性,也就是所有系统盘的软硬链接目录都不能正常使用-这个目前还没有办法解决-">使用WIMBoot之后系统盘将会不支持hardlink特性,也就是所有系统盘的软硬链接目录都不能正常使用.这个目前还没有办法解决.</h3>
<p> 注:最新版本已经更新了驱动,应该解决了该问题</p>
</li>
<li><h3 id="Error_reading_data_(status=c000046e):_%2_0x%1">Error reading data (status=c000046e): %2 0x%1</h3>
<pre><code>[ERROR] &quot;E:\MSOCache\All Users\{90150000-0011-0000-1000-0000000FF1CE}-C\OWOW32WW.cab&quot;: Error reading data (status=c000046e): %2 0x%1 
ERROR: Exiting with error code 50:
Could not read data from a file.
</code></pre><p>出现上面错误的原因是由于在已经是WIMBOOT启动的目标系统上用了原地转换功能，这是不受支持的。<br>解决方法：  </p>
<ol>
<li><p>在PE中安装WOF驱动，或使用WIN8PE(一般会有带WOF驱动)，再使用原地转换功能。  </p>
</li>
<li><p>找到你之前的WIMBOOT.WIM复制一份到System Volume Information目录（你想存放WIM文件的磁盘分区下）.再启动WIMBoot.exe，程序会自动检测到这个新的WIMBOOT.WIM并且可以使用增量更新功能，如果没有自动检测到，可以手工选择一下你的WIM文件存放磁盘。</p>
</li>
</ol>
<p><em>最新V1.2会已经实现自动识别目标分区并且自动查找对应的WIM文件</em></p>
</li>
<li><h3 id="Couldn’t_set_WIMBoot_pointer_data">Couldn’t set WIMBoot pointer data</h3>
<pre><code>  [WARNING] Retrying after 100ms...
  [WARNING] FSCTL_SET_EXTERNAL_BACKING failed (err=1314); data was 48 bytes:
  0100000001000000010000000000000001000000000000008ccd4ce7b554c8f11c8a5fd5231de42e
  d4085f6b00000000
  [WARNING] Too many retries; returning failure
  [ERROR] &quot;f:\test\WIMBOOT\Readme.TXT&quot;: Couldn&#39;t set WIMBoot pointer data (err=131
  4):
  ERROR: Exiting with error code 75:
         Failed to set WIMBoot pointer data.
</code></pre><p>  注： v1.1以上版本出现以上问题，请选中格式化功能，在应用的时候格式化目标系统分区就可以解决该问题。</p>
<p>  出现类似以上的错误提示说明需要SYSTEM权限，目前可以使用以下两种方法解决。</p>
<p>  使用<a href="https://github.com/MouriNaruto/NSudo/" target="_blank" rel="external">NSudo</a>或<a href="https://technet.microsoft.com/en-us/sysinternals/bb897553.aspx" target="_blank" rel="external">psexec</a>软件来获取SYSTEM权限，用SYSTEM权限运行WIMBOOT.EXE  </p>
<p>  或  </p>
<p>  直接重启系统进入PE运行WIMBOOT.EXE使用系统恢复功能进行恢复最新的镜像就行了。</p>
<p>  <strong>以上是旧版本才会出现的问题，如果使用V1.1版本也有这些问题请留言回复</strong></p>
</li>
<li><h3 id="为什么使用该工具应用之后很多文件无法读取？">为什么使用该工具应用之后很多文件无法读取？</h3>
<p>这是正常的，因为使用WIMBoot大部份的系统文件其实只是一个指向WIM文件的指针，需要安装WOF驱动才可以正常访问，另外程序在应用之前也会禁用该分区的Wof所以即使是已经安装了wof驱动应用之后也是不能直接访问的，重启系统只要有WOF驱动就可以正常访问。</p>
</li>
<li><h3 id="程序是如何获取到WIMBoot系统对应的WIM文件的?">程序是如何获取到WIMBoot系统对应的WIM文件的?</h3>
<p>如果在WIMBoot启动的，那在系统盘的<em>System Volume Information</em>目录下有一个文件<strong>WimOverlay.dat</strong>,这个文件记录了对应WIM文件的位置信息,如果目标WIM文件在MBR磁盘上，则记录了分区偏移和磁盘签名信息,若是GPT磁盘记则记录分区GUID和磁盘GUID</p>
<p>我编写了一个小程序(自己提取资源 EXEDATA#1023)，你可以通过它来快速读取这些信息，例子：</p>
<pre><code>  fwim c:\System Volume Information\WimOverlay.dat
  168 32768 661951F1
</code></pre><p>  第一个数字168是WIM文件路径在文件中的位置，可以通过PECMD的GETF来读取完整路径信息</p>
<pre><code>  GETF# x:\System Volume Information\WimOverlay.dat,168#*,SYSWIM
</code></pre><p>然后再通过分区偏移和磁盘签名等信息就可以获取到对应的盘符，以下是相关代码</p>
<pre><code>  _SUB GetALLPartInfo
      PART list disk,&amp;&amp;全部磁盘
      forx * %全部磁盘%,&amp;磁盘,
      {
          PART list disk %磁盘%,&amp;&amp;磁盘信息
          MSTR * &amp;磁盘签名=&lt;8&gt;&amp;&amp;磁盘信息
          PART list part %磁盘%,&amp;&amp;全部分区
          forx * %全部分区%,&amp;分区,
          {
              IFEX #%&amp;分区%&lt;0,EXIT CONTINUE
              PART  -hextp -phy# -fill list part %磁盘%#%分区%,&amp;&amp;分区信息
              SED &amp;&amp;GPT=?,GPT,,%&amp;&amp;分区信息%
              IFEX #%GPT%&gt;0,MSTR * &amp;&amp;偏移,&amp;&amp;盘符,&amp;&amp;DN=&lt;-3&gt;&lt;-1&gt;&lt;-2&gt;&amp;&amp;分区信息 ! MSTR * &amp;&amp;偏移,&amp;&amp;盘符,&amp;&amp;DN=&lt;4&gt;&lt;-1&gt;&lt;-2&gt;&amp;&amp;分区信息
              SET. 所有分区=%所有分区%%盘符% %偏移% %&amp;磁盘签名% \Device\Harddisk%磁盘%\Partition%&amp;&amp;DN%\n
          }
      }
  _END

  SET-def 所有分区=
  CALL GetALLPartInfo

  EXEC* &amp;&amp;N=!fwim &quot;c:\System Volume Information\WimOverlay.dat&quot;
  CALL GetWoCf c: %&amp;&amp;N%

  _SUB GetWoCf
      IFEX #%2&lt;0,EXIT _SUB
      ENVI &amp;P=
      FORX *NL &amp;所有分区,&amp;T,
      {
          SED &amp;&amp;a=?,%3 %4,,%T%
          IFEX #%&amp;&amp;a%&gt;0,
          {
              LSTR &amp;P=2,%T%
              FIND $%&amp;P%=*,
              {
          //对应的分区未分配盘符，临时分配一个@:
                  SUBJ &amp;- @:
                  MSTR$ * &amp;p=&lt;-1&gt;T
                  SUBJ &amp; @:,%&amp;P%
                  ENVI &amp;P=@:
              }
              EXIT FORX
          }
      }
      GETF# %1\System Volume Information\WimOverlay.dat,%2#*,SYSWIM
      ENVI SYSWIM=%&amp;p%%SYSWIM%
  _END
</code></pre></li>
</ul>
<h2 id="相关截图">相关截图</h2>
<ol>
<li><p>增量更新功能</p>
<p><img src="http://qiniu.chenall.net/post/2015042_02.png/w400.png" alt=""></p>
</li>
<li><p>系统恢复功能</p>
<p><img src="http://qiniu.chenall.net/post/2015042_03.png/w400.png" alt=""></p>
</li>
<li><p>首次使用的情况</p>
<p><img src="http://qiniu.chenall.net/post/2015042_04.png/w400.png" alt=""></p>
</li>
<li><p>界面和相关介绍.</p>
<p><img src="http://qiniu.chenall.net/post/2015042_06.png/w400.png" alt=""></p>
</li>
<li><p>最新版本界面截图</p>
<p><img src="http://qiniu.chenall.net/post/2015042_08.png/w400.png" alt=""></p>
</li>
</ol>
<h2 id="附我上面演示系统的制作方法（仅供参考）">附我上面演示系统的制作方法（仅供参考）</h2>
<ol>
<li><p>需要准备的文件 下载: <a href="http://pan.baidu.com/s/1mgIbMyc" target="_blank" rel="external">http://pan.baidu.com/s/1mgIbMyc</a> 密码: 83qe</p>
<ul>
<li>WIMBOOT.WIM  (上面有提供)<br>这个从<a href="http://twm000.blog.163.com/blog/static/179786475201502792756980/" target="_blank" rel="external">三蛋win7</a>提取修改的,包含了32位和64位两个版本.</li>
<li>WinNTSetup   (上面有提供)</li>
<li>一个顺手的PE  (自备)</li>
</ul>
</li>
<li><p>先创建wimboot目录列表,并复制wimboot.wim到wimboot目录下和根目录下(备用).</p>
</li>
<li>进入PE用WinNTSetup分别安装两个系统到VHD中  <ul>
<li>在WinNTSetup的标题栏上右键先修改WIM API为wimlib. </li>
<li>注意要勾选 <strong>Windows 映像文件启动(WIMBoot)</strong>.</li>
<li>使用WinNTSetup的安装到VHD功能分别安装两个系统到<code>x64\win7.vhd</code>和<code>x86\win7.vhd</code>并安装.</li>
</ul>
</li>
<li>分别安装x86和x64的系统要安装的驱动和软件.</li>
<li>现在可以重新更新一下WIMBOOT文件.<ul>
<li>进入x86系统挂载x64的VHD文件.使用以下命令捕获x64的新系统(y:是x64系统的分区号,#是wimboot系统分区号).<br>wimlib-imagex append y:\ #:\wimboot.wim x64new —wimboot</li>
<li>进入x64系统挂载x86的VHD文件,捕获x86的新系统同上<br>wimlib-imagex append y:\ #:\wimboot.wim x86new —wimboot</li>
</ul>
</li>
<li>进入PE把根目录下的wimboot.wim覆盖到wimboot目录下,用WinNTSetup把系统用wimboot方式安装到x86\win7.vhd和x64\win7.vhd中.</li>
<li>搞定收工.</li>
</ol>
<p>一些需要注意的事项:  </p>
<ol>
<li>必须使用NTFS文件系统.  </li>
<li>为了方便更新系统WIMBOOT.WIM需要有两个,像我就是根目录一个(备用),WIMBOOT目录一个(主要).  </li>
<li>更新系统就是使用一个系统挂载另一个系统的VHD文件用wimlib-imagex append进行更新,这个注意要更新到备用的WIMBOOT.WIM中.  </li>
<li>重新安装必须进入PE先把备用的WIMBOOT.WIM复制到WIMBOOT目录下覆盖,然后重新用新的镜像进行安装.  </li>
<li>个人比较懒,就不上图了,有兴趣看得懂的可以自己搞.有不明白的地方可以留言,我会抽时间回复.  </li>
</ol>
<blockquote>
<p>﻿文件名称: wimboot.wim<br>文件大小: 3.71 GB (3,979,257,171 字节)<br>修改时间: 2015年04月30日，23:47:38<br>MD5: 1A98B453AB3F516FAC5C084D85028F42<br>SHA1: DD3701475BF7F4C478A9A0A7AF485157EFB48BE7  </p>
</blockquote>
]]></content>
    <summary type="html"><![CDATA[<p>把WINDOWS 8的WIMBOOT功能应用到WINDOWS 7上,目前使用一切正常.</p>
<p>使用WIMBOOT可以节省大量的磁盘空间,特别是多系统的情况下更是明显.另外还具有<code>WIM</code>文件的特性,比如<strong>增量备份</strong>,如果每隔一段时间就使用增量更新一下WIM那以后就可以随时恢复到<strong>每个更新点</strong>的状态.</p>
<p>正常安装的话一个64位的系统就差不多需要40GB了,我现在两个系统最多也才40GB,是不是很心动呢!</p>
]]></summary>
    
      <category term="windows7" scheme="http://chenall.net/tags/windows7/"/>
    
      <category term="WIMBOOT" scheme="http://chenall.net/tags/WIMBOOT/"/>
    
      <category term="vhd" scheme="http://chenall.net/tags/vhd/"/>
    
      <category term="系统相关" scheme="http://chenall.net/categories/%E7%B3%BB%E7%BB%9F%E7%9B%B8%E5%85%B3/"/>
    
  </entry>
  
  <entry>
    <title><![CDATA[[grub4dos] grub4dos 0.4.6a ipxegrldr 功能介绍]]></title>
    <link href="http://chenall.net/post/grub4dos_ipxe/"/>
    <id>http://chenall.net/post/grub4dos_ipxe/</id>
    <published>2014-12-27T16:00:00.000Z</published>
    <updated>2015-01-25T03:03:19.000Z</updated>
    <content type="html"><![CDATA[<p>  <a href="http://grub4dos.chenall.net/downloads/grub4dos-0.4.6a-2014-12-27/" target="_blank" rel="external">最新版本grub4dos</a>的发行包里面有一个<code>ipxegrldr</code>文件,这个文件其实是整合了<code>undionly.kpxe</code>和<code>grldr</code>的文件,可以作为PXE的启动文件.</p>
<h2 id="新的功能">新的功能</h2>
<ul>
<li>使用该文件启动可以完整支持<code>ipxe</code>的所有功能调用,通过它允许直接在<code>grub4dos</code>下访问<code>WEB</code>或<code>SAN</code>上面的文件.</li>
<li><p>另外相对应的增加了一个命令<code>ipxe</code>,使用它可以调用各种<a href="http://ipxe.org/cmd" target="_blank" rel="external">ipxe命令</a></p>
<p><strong>ipxe 命令语法:  ipxe [cmd] [params]</strong></p>
<a id="more"></a>

</li>
</ul>
<h2 id="相关用法介绍">相关用法介绍</h2>
<ol>
<li><p>可以直接访问网络上的文件.</p>
<pre><code>cat http://b.chenall.net/menu.ipxe
map --mem http://b.chenall.net/ntboot.iso (0xff)
map --hook
ls (0xff)
</code></pre><p><img src="http://qiniu.chenall.net/post/20141228_01.png/w400.png" alt=""></p>
</li>
<li><p>利用<code>ipxe</code>命令来实现更多功能</p>
<p>使用ipxe命令时需要注意一点,最好在文本模式下运行(terminal console)运行ipxe,特别是像<code>ipxe chain</code>或<code>ipxe boot</code>之类的,否则会看不到ipxe的回显.看起来就像是假死状态.</p>
<ul>
<li><p>可以直接调用ipxe的各种命令,例子<br><img src="http://qiniu.chenall.net/post/20141228_02.png/w400.png" alt=""></p>
</li>
<li><p>直接调用ipxe菜单(注:在ipxe菜单中可以用exit命令返回)  </p>
<pre><code>ipxe chain http://b.chenall.net/menu.ipxe
</code></pre></li>
<li><p>直接使用ipxe启动网络上的文件  </p>
<pre><code>ipxe chain http://b.chenall.net/grldr
</code></pre></li>
<li><p>直接使用ipxe启动网络上的镜像文件例子  </p>
<pre><code>ipxe sanboot http://b.chenall.net/ntboot.img
ipxe sanboot iscsi:10.0.4.1:::1:iqn.2010-04.org.ipxe.dolphin:storage
</code></pre></li>
<li><p>高级用法,通过sanhook来直接把网络上的镜像映射为一个本地设备.<br>sanhook 可以把映射一个网络镜像相当于grub4dos的map,只是这个是直接映射,读写都是通过网络完成的.<br>sanunhook 删除一个映射.</p>
<pre><code>ipxe sanhook -d 0xff http://b.chenall.net/ntboot.iso
ipxe sanunhook -d 0xff
</code></pre><p><img src="http://qiniu.chenall.net/post/20141228_03.png/w400.png" alt=""><br><img src="http://qiniu.chenall.net/post/20141228_04.png/w400.png" alt=""></p>
</li>
</ul>
</li>
</ol>
<h2 id="iSCSI_SAN_URI">iSCSI SAN URI</h2>
<blockquote>
<p>The format of an iSCSI SAN URI is defined by <a href="http://tools.ietf.org/html/rfc4173" target="_blank" rel="external">RFC 4173</a>. The general syntax is:</p>
<pre><code>  iscsi:&lt;servername&gt;:&lt;protocol&gt;:&lt;port&gt;:&lt;LUN&gt;:&lt;targetname&gt;
</code></pre><p>For example:</p>
<pre><code>  iscsi:10.0.4.1:::1:iqn.2010-04.org.ipxe.dolphin:storage
  iscsi:boot.ipxe.org::::iqn.2010-04.org.ipxe.boot:public
  iscsi:192.168.0.1::::iqn.1991-05.com.microsoft:msdos622-target
  iscsi:opensolaris.home::::iqn.1986-03.com.sun:02:e9abf4cd-714b-c6ec-d017-eea5a56252ed
</code></pre><ul>
<li><code>&lt;servername&gt;</code> is the DNS name or IP address of the iSCSI target.</li>
<li><code>&lt;protocol&gt;</code> is ignored and can be left empty.1)</li>
<li><code>&lt;port&gt;</code> is the TCP port of the iSCSI target. It can be left empty, in which case the default port (3260) will be used.</li>
<li><code>&lt;LUN&gt;</code> is the SCSI LUN of the boot disk, in hexadecimal. It can be left empty, in which case the default LUN (0) will be used.</li>
<li><code>&lt;targetname&gt;</code> is the iSCSI target IQN.</li>
</ul>
<p>If you are using iSCSI authentication, then you will need to configure the username and password settings (and possibly also the reverse-username and reverse-password settings) before attempting to connect to the SAN target. There is no way to specify usernames and passwords directly within the iSCSI SAN URI.</p>
</blockquote>
<h2 id="wimboot">wimboot</h2>
<p>grub4dos下也可能直接通过ipxe来加载<a href="http://ipxe.org/wimboot" target="_blank" rel="external">wimboot</a>,但是有一些需要注意,否则会启动失败.</p>
<p>例子: 有一个boot.ipxe文件在服务器上</p>
<pre><code>#!ipxe
  imgfree
  imgfree
  imgfree
  kernel wimboot
  initrd boot/bcd         BCD
  initrd boot/boot.sdi    boot.sdi
  initrd boot/bootmgr     bootmgr
  initrd boot/boot.wim boot.wim
  boot
</code></pre><p>注: 几个imgfree的命令是保证当前ipxe加载的镜像内容为空,也就是让使用imgstat命令显示的内容为空.</p>
<p>然后直接使用GRUB4DOS的ipxe命令加载</p>
<pre><code>## terminal console 是必须的,切换到文本模式,否则启动可能会不显示(假死状态).
terminal console
## -a 参数也是必须的,自动释放boot.ipxe镜像,否则有可能会失败.
ipxe chain -a http://192.168.0.1/boot.ipxe
</code></pre><p>以上是ipxe的原生方法来启动wimboot,也可以使用grub4dos内置的用法(目前不稳定有时会导致重启).</p>
<pre><code>title Wimboot
kernel /wimboot
initrd @bcd=/boot/bcd @bootmgr=/boot/bootmgr @boot.sdi=/boot/boot.sdi @boot.wim=/boot/boot.wim
boot
</code></pre><p>后记: 使用<code>ipxegrldr</code>作为PXE启动文件还有另一个好处,就是如果网络正常的话,使用<code>ipxegrldr</code>总是会优先使用 <a href="http://b.chenall.net/grldr" target="_blank" rel="external">http://b.chenall.net/grldr</a> 来启动,也就是说总是使用最新的版本.当然了如果网络不通的话就使用内置的版本.如果你不需要这个功能的话可以直接使用undionly.kpxe自己写菜单来启动grldr</p>
]]></content>
    <summary type="html"><![CDATA[<p>  <a href="http://grub4dos.chenall.net/downloads/grub4dos-0.4.6a-2014-12-27/" target="_blank" rel="external">最新版本grub4dos</a>的发行包里面有一个<code>ipxegrldr</code>文件,这个文件其实是整合了<code>undionly.kpxe</code>和<code>grldr</code>的文件,可以作为PXE的启动文件.</p>
<h2 id="新的功能">新的功能</h2>
<ul>
<li>使用该文件启动可以完整支持<code>ipxe</code>的所有功能调用,通过它允许直接在<code>grub4dos</code>下访问<code>WEB</code>或<code>SAN</code>上面的文件.</li>
<li><p>另外相对应的增加了一个命令<code>ipxe</code>,使用它可以调用各种<a href="http://ipxe.org/cmd" target="_blank" rel="external">ipxe命令</a></p>
<p><strong>ipxe 命令语法:  ipxe [cmd] [params]</strong></p>
]]></summary>
    
      <category term="GRUB4DOS" scheme="http://chenall.net/tags/GRUB4DOS/"/>
    
      <category term="ipxe" scheme="http://chenall.net/tags/ipxe/"/>
    
      <category term="GRUB4DOS" scheme="http://chenall.net/categories/GRUB4DOS/"/>
    
  </entry>
  
  <entry>
    <title><![CDATA[[grub4dos] grub4dos 最新版本initrdfs功能介绍]]></title>
    <link href="http://chenall.net/post/grub4dos_initrdfs/"/>
    <id>http://chenall.net/post/grub4dos_initrdfs/</id>
    <published>2014-11-27T00:14:58.000Z</published>
    <updated>2015-02-18T02:39:50.000Z</updated>
    <content type="html"><![CDATA[<p>在<a href="http://grub4dos.chenall.net/downloads/grub4dos-0.4.6a-2014-11-26.cc7664c0/" target="_blank" rel="external">最新版本grub4dos</a>中,支持读写<code>linux initramfs</code>,另外为了方便使用还支持了自定义的批处理续尾格式.这些在grub4dos被识别为<code>initrdfs</code>,都是在内存中使用的.</p>
<p>目前grub4dos initrdfs文件系统仅支持<code>cpio new</code>格式和grub4dos自定义格式,</p>
<p>批处理续尾格式支持整合多个批处理和一块非批处理的数据块.</p>
<p> 主批处理<em>[+批处理1][+批处理2][+批处理N][+数据块1]</em></p>
<p>除了主批处理程序之后其它附加的内容都可以在主批处理中直接访问.访问方法 <code>%~m0/N</code> N是顺序号(注:当有附加了多个批处理时才可以这样子访问),详见后面更多介绍.</p>
<a id="more"></a>

<p>以下摘抄一些资料</p>
<blockquote>
<h2 id="initrd与initramfs">initrd与initramfs</h2>
<p>Linux 的 <code>initrd</code> 技术是一个非常普遍使用的机制，linux2.6 内核的 initrd 的文件格式由原来的文件系统镜像文件转变成了 cpio 格式，变化不仅反映在文件格式上， linux 内核对这两种格式的 initrd 的处理有着截然的不同。</p>
<h3 id="initrd:">initrd:</h3>
<p>ram disk是一个基于ram的块设备，因此它占据了一块固定的内存，而且事先要使用特定的工具比如mke2fs格式化，还需要一个文件系统驱动来读写其上的文件。<br>如果这个disk上的空间没有用完，这些未用的内存就浪费掉了，并且这个disk的空间固定导致容量有限，要想装入更多的文件就需要重新格式化。<br>由于Linux的块设备缓冲特性, ram disk上的数据被拷贝到page cache(对于文件数据)和dentry cache(对于目录项), 这个也导致内存浪费.</p>
<h3 id="initramfs:">initramfs:</h3>
<p>最初的想法是Linus提出的: 把cache当作文件系统装载。</p>
<p>他在一个叫ramfs的cache实现上加了一层很薄的封装，其他内核开发人员编写了一个改进版tmpfs，这个文件系统上的数据可以写出到交换分区，而且可以设定一个tmpfs装载点的最大尺寸以免耗尽内存。initramfs就是tmpfs的一个应用。</p>
<p>优点：  </p>
<ul>
<li>tmpfs随着其中数据的增减自动增减容量.  </li>
<li>在tmpfs和<em>page cache/dentry cache</em>之间没有重复数据.  </li>
<li>tmpfs重复利用了Linux caching的代码, 因此几乎没有增加内核尺寸, 而caching的代码已经经过良好测试, 所以tmpfs的代码质量也有保证.  </li>
<li>不需要额外的文件系统驱动.  </li>
</ul>
<p>另外, <code>initrd</code>机制被设计为旧的”root=”机制的前端，而非其替代物，它假设真正的根设备是一个块设备， 而且也假设了自己不是真正的根设备，这样不便将NFS等作为根文件系统。最后<code>/linuxrc</code>不是以<code>PID=1</code>执行的, 因为<code>1</code>这个进程<code>ID</code>是给<code>/sbin/init</code>保留的。 <code>initrd</code>机制找到真正的根设备后将其设备号写入<em>/proc/sys/kernel/real-root-dev</em>， 然后控制转移到内核由其装载根文件系统并启动<em>/sbin/init</em>。<br><code>initramfs</code>则去掉了上述假设， 而且<code>/init</code>以<code>PID=1</code>执行， 由<code>init</code>装载根文件系统并用<code>exec</code>转到真正的<em>/sbin/init</em>， 这样也导致一个更为干净漂亮的设计。</p>
<h3 id="生成initramfs镜像命令">生成initramfs镜像命令</h3>
<p>若镜像根目录为/initrd，执行下面命令在当前用户主文件夹中生成myinitramfs.gz镜像。</p>
<pre><code class="bat">cd /initrd 
find .|cpio -o -H newc|gzip&gt;~/myinitramfs.gz
</code></pre>
<p>注1: 以上生成的镜像文件是gzip压缩过的。如果不加<code>|gzip</code>则就是原始的cpio档.<br>注2: windows下可以使用以下命令行成<br>   dir /b | cpio -o -H newc &gt; myinitramfs.cpio</p>
</blockquote>
<h2 id="GRUB4DOS_initrdfs介绍">GRUB4DOS initrdfs介绍</h2>
<h3 id="格式限制">格式限制</h3>
<ol>
<li>多个批处理附加时,使用<code>NULL</code>字符分隔每个批处理(必须的,而且只能有一个<code>NULL</code>字符),并且附加的批处理文件不能压缩(暂不支持压缩).  </li>
<li>如果是只附加一个数据文件,建议不要压缩,这样才可以直接访问.  </li>
</ol>
<h2 id="其它说明">其它说明</h2>
<h3 id="只附加一个数据文件">只附加一个数据文件</h3>
<p>如果这个数据文件没有压缩,而且是GRUB4DOS可以识别的格式那可以直接用设备<code>%~m0</code>来访问里面的文件.</p>
<p>建议只附加一个CPIO/ISO格式,这样子使用起来最方便,也最节省空间(附加的文件同样不要压缩). </p>
<p>批处理加附一个CPIO文件(CPIO里面的文件可以压缩)<br>则在批处理中可以直接使用<code>%~m0/FILE</code>访问<code>File</code>就是CPIO包里面对应的文件.</p>
<p>ISO/IMG等格式也是一样的.</p>
<h3 id="如果单纯附加了批处理文件">如果单纯附加了批处理文件</h3>
<p> 访问方式: <code>%~m0/0</code>是第一个文件,<code>%~m0/1</code>是第二个文件,以此类推.并且可以直接运行</p>
<h3 id="如果附加了批处理和数据文件">如果附加了批处理和数据文件</h3>
<p>注: 只允许最多一个数据文件并且只能附加在最后面,中间只能附加批处理文件</p>
<p> 根据附加顺序<code>%~m0/0</code> <code>%~m0/1</code>来访问</p>
<p> 若附加的数据文件是CPIO等GRUB4DOS可识别的格式,而且没有压缩的话,那可以通过以下方法访问里面的文件</p>
<pre><code class="bat"> ::本例子附加了一个批处理和一个数据文件(可以是cpio/iso/img等grub4dos可访问的文件系统格式)
 set rdev=
 ::使用%~m0/1访问第二个文件(数据文件),通过blocklist命令获取该文件的扇区序列(或在内存中的位置)
 ::以下这一个命令获取指定文件在内存中的位置(md,X,Y)的格式保存在变量rdev中.
 blocklist %~m0/1 | call :get_dev=
 ::现在可以直接访问这个rdev的内容.例子*ls (md,0x1600000,0x12000)/*这样的格式
 ls %rdev%/
 ::查看内存设备`%rdev%`里面的文件`file`的内容.
 cat %rdev%/file
 goto :eof
 :get_dev
 set rdev=%~d1
 goto :eof
</code></pre>
]]></content>
    <summary type="html"><![CDATA[<p>在<a href="http://grub4dos.chenall.net/downloads/grub4dos-0.4.6a-2014-11-26.cc7664c0/" target="_blank" rel="external">最新版本grub4dos</a>中,支持读写<code>linux initramfs</code>,另外为了方便使用还支持了自定义的批处理续尾格式.这些在grub4dos被识别为<code>initrdfs</code>,都是在内存中使用的.</p>
<p>目前grub4dos initrdfs文件系统仅支持<code>cpio new</code>格式和grub4dos自定义格式,</p>
<p>批处理续尾格式支持整合多个批处理和一块非批处理的数据块.</p>
<p> 主批处理<em>[+批处理1][+批处理2][+批处理N][+数据块1]</em></p>
<p>除了主批处理程序之后其它附加的内容都可以在主批处理中直接访问.访问方法 <code>%~m0/N</code> N是顺序号(注:当有附加了多个批处理时才可以这样子访问),详见后面更多介绍.</p>
]]></summary>
    
      <category term="GRUB4DOS" scheme="http://chenall.net/tags/GRUB4DOS/"/>
    
      <category term="initrdfs" scheme="http://chenall.net/tags/initrdfs/"/>
    
      <category term="GRUB4DOS" scheme="http://chenall.net/categories/GRUB4DOS/"/>
    
  </entry>
  
  <entry>
    <title><![CDATA[DriveDroid 让安卓手机变成系统启动盘]]></title>
    <link href="http://chenall.net/post/android_DriveDroid/"/>
    <id>http://chenall.net/post/android_DriveDroid/</id>
    <published>2014-10-18T13:06:00.000Z</published>
    <updated>2015-02-26T06:38:12.000Z</updated>
    <content type="html"><![CDATA[<h2 id="说明">说明</h2>
<p>  <strong>This application requires root</strong>(需要手机有Root权限)</p>
<p>  DriveDroid allows you to boot your PC from ISO/IMG files stored on your phone. This is ideal for trying Linux distributions or always having a rescue-system on the go… without the need to burn different CDs or USB pendrives.</p>
<p>  DriveDroid also includes a convenient download menu where you can download USB-images of a number of operating systems from your phone (like Mint, Ubuntu, Fedora, OpenSUSE and Arch Linux). Around 35 different systems are available at this moment.</p>
<p>  You can also create blank USB-images which allows you to have a blank USB-drive. From your PC you can store files onto the USB-drive, but also use tools on your PC to write images to the drive.<br><a id="more"></a></p>
<h3 id="Notes">Notes</h3>
<ul>
<li>This application uses features of the kernel that may or may not be available/stable on your phone. Tests have shown most phones work without problems, but please keep in mind yours might not (yet) work out-of-the-box.</li>
<li>Most kernels support emulating USB drives, some support emulating CD-rom drives and kernels with the right patches support both.</li>
<li>Most Linux-related ISOs can be booted from USB drives, but some ISOs can only be booted from CD-rom drives or require some kind of conversion.</li>
</ul>
<h3 id="Paid_version">Paid version</h3>
<ul>
<li>No ads.</li>
<li>Resizing of images.</li>
<li>Add your own download repositories. Nice for companies or groups that want to share custom or licensed images.</li>
</ul>
<p>More info: <a href="http://softwarebakery.com/projects/drivedroid" target="_blank" rel="external">http://softwarebakery.com/projects/drivedroid</a></p>
<p>以上是原文介绍,看不懂没有关系,简单来说,就是可以让Root的Android设备可以直接加载ISO/IMG等文件直接变身为一个启动盘(可以变成U盘/光盘/软盘),系统安装盘,等,也就是说一个手机加上一条数据线就可作为随身或应急维护U盘了.</p>
<h2 id="使用简介">使用简介</h2>
<h3 id="主界面截图">主界面截图</h3>
<p><img src="http://qiniu.chenall.net/post/2014101821_01.png/w400.png" alt=""></p>
<h3 id="首次使用">首次使用</h3>
<p>  请先使用向导,根据界面提示获取ROOT权限,插入USB数据线</p>
<table><tr><td><img src="http://qiniu.chenall.net/post/2014101821_001.png/w400.png" alt=""></td><td><img src="http://qiniu.chenall.net/post/2014101821_002.png/w400.png" alt=""></td></tr></table>

<h3 id="其它截图介绍">其它截图介绍</h3>
<p>  可以直接创建一个空白的IMG文件(虚拟U盘),挂载这个镜像文件之后,连上电脑之后就可以看到一个”空白的U盘”,你想怎么折腾就怎么折腾吧..</p>
<p><img src="http://qiniu.chenall.net/post/2014101821_02.png/w400.png" alt=""></p>
<p>点击<code>+</code>号出现如上菜单,第一个是创建空白镜像,第二个,从镜像库下载,第三个,从系统中加载已经做好的镜像.</p>
<p>软件还内置了一个镜像库,提供一些可以启动的镜像(比如Linux系统发行版)等,直接下载就可以使用了.</p>
<p><img src="http://qiniu.chenall.net/post/2014101821_03.png/w400.png" alt=""></p>
<p>除了可以挂载IMG/ISO文件之后,还可以挂载整个SD卡/某个SD卡分区,系统分区的哦..看截图(要挂载这些需要对ANDROID/linux系统有一定的了解)</p>
<p><img src="http://qiniu.chenall.net/post/2014101821_04.png/w400.png" alt=""></p>
<p>本人的手机对这个支持的效果挺不错的，可以有三个LUN，可以同时支持软盘、光盘、U盘。效果图，lun0虚拟出一个软盘，lun1是光盘，lun2是可移动磁盘</p>
<p><img src="http://qiniu.chenall.net/post/2014101821_05.png/w400.png" alt=""></p>
<p>注意看上图,左边有三个点,代表该设备支持三个LUN,你可以在每个LUN上都测试挂载一下 光盘,软盘等镜像,看看电脑上能不能正确显示出挂载内容,这样就可以知道是否有支持虚拟光盘,软盘了.</p>
<p><img src="http://qiniu.chenall.net/post/2014101821_06.png/w400.png" alt=""></p>
<p>挂载之后卸载的方法见图示,通过状态栏可以方便卸载某个虚拟设备</p>
<p><img src="http://qiniu.chenall.net/post/2014101821_07.png/w400.png" alt=""></p>
<h3 id="挂载系统设备方法">挂载系统设备方法</h3>
<p>  也可以直接使用该软件挂载系统设备比如系统的DATA分区/SYSTEM分区等.如上面的截图里面的设备,对Linux系统比较了解的朋友应该就懂得.在Android中每个设备在<code>/dev</code>目录中都有一个对应的设备文件名,比如SD卡(在很多ANDROID设备中使用<code>/dev/block/vold/179:27</code>),那我们是否可以在<code>DriveDroid</code>中直接加载该文件来实现挂载直接SD卡设备呢?答案是可行的,不过因为系统的限制你并不能直接在软件中的直接选择添加,需要手工填写文件名称才行.</p>
<p>  首先是要找到你想要添加的设备的文件名,一般情况下通过<code>mount</code>命令就可以看到对应设备的挂载点.<em>可以在<code>adb shell</code>或android终端软件中输入</em>如下图</p>
<p>  <img src="http://qiniu.chenall.net/post/2014101821_08.png/w400.png" alt=""></p>
<p>  注意看上面红色框的内容,本手机<code>179:27</code>是<code>sdcard0</code>(内置sd卡),<code>179:65</code>是<code>sdcard1</code>(外置SD卡)</p>
<p>  好了找到了对应的设备文件名,现在就可以开始添加了.点软件右下角的<code>+</code>号,选择<strong>Add image from file…</strong>开始添加,出现如下图界面,输入对应的信息然后点右上角的<strong>SAVE</strong>保存就行了.</p>
<p>  <img src="http://qiniu.chenall.net/post/2014101821_09.png/w400.png" alt=""></p>
<p>  具体效果可以看前面的介绍截图,另外挂载这设设备时,为了避免出现问题,最好使用只读挂载(Read Only),比如你可以只读挂载一下<code>SYSTEM</code>分区,然后在<code>Windows</code>下就可以备份这个分区的内容.</p>
<p>  附: 更多可挂载的设备.</p>
<p>  <img src="http://qiniu.chenall.net/post/2014101821_10.png/w400.png" alt=""></p>
<p>  注: 除了使用<code>/dev/block/vold/179:27</code>之外也可以使用<code>/dev/block/mmcblk0p27</code>两个是一样的,具体可以看上面的图片</p>
<ol>
<li><code>mmcblk0</code>   是系统内置的储存设备使用时需要小心,<code>mmcblk1</code>一般是外置的tf卡设备.</li>
<li><code>mmcblkXpY</code> 对应<strong>X</strong>储存的<strong>Y</strong>分区,比如<code>mmcblk1p1</code>就是外置tf卡的第一个分区</li>
</ol>
<h3 id="后记">后记</h3>
<p>   发现很多朋友认为使用软件会影响读写速度,如果你了解这个软件的原理就明白了,无非就是修改了android的默认宿主usb挂载点.</p>
<p>   比如系统自带的U盘模式其实效果和用这个软件挂载整个SD卡是一样的.</p>
<p>   用ISO之类的文件的话因为需要多一层读写,效率会低一点,但影响不是很大,关建是用ISO/IMG文件使用起来更方便.我觉得使用一点点的效率去换取这些更方便功能是值得的.</p>
<p>   在没有发现这个软件之前,我通过手工修改Android的默认的usb挂载点来实现这些功能,使用软件需要使用工具就加载什么,还可以使用只读模式,防病毒最有效的就是只读模式了,很方便不是吗?</p>
<p>从Google Play 下载安装:(<a href="https://play.google.com/store/apps/details?id=com.softwarebakery.drivedroid&amp;feature=nav_result" target="_blank" rel="external">https://play.google.com/store/apps/details?id=com.softwarebakery.drivedroid&amp;feature=nav_result</a>)</p>
<p>百度网盘下载： <a href="http://pan.baidu.com/s/1qWluroS" target="_blank" rel="external">com.softwarebakery.drivedroid.ver.0.9.15.build.46.apk</a></p>
]]></content>
    <summary type="html"><![CDATA[<h2 id="说明">说明</h2>
<p>  <strong>This application requires root</strong>(需要手机有Root权限)</p>
<p>  DriveDroid allows you to boot your PC from ISO/IMG files stored on your phone. This is ideal for trying Linux distributions or always having a rescue-system on the go… without the need to burn different CDs or USB pendrives.</p>
<p>  DriveDroid also includes a convenient download menu where you can download USB-images of a number of operating systems from your phone (like Mint, Ubuntu, Fedora, OpenSUSE and Arch Linux). Around 35 different systems are available at this moment.</p>
<p>  You can also create blank USB-images which allows you to have a blank USB-drive. From your PC you can store files onto the USB-drive, but also use tools on your PC to write images to the drive.<br>]]></summary>
    
      <category term="android" scheme="http://chenall.net/tags/android/"/>
    
      <category term="软件" scheme="http://chenall.net/tags/%E8%BD%AF%E4%BB%B6/"/>
    
      <category term="实用文集" scheme="http://chenall.net/categories/%E5%AE%9E%E7%94%A8%E6%96%87%E9%9B%86/"/>
    
  </entry>
  
  <entry>
    <title><![CDATA[Cameyo PackageEditor 基本使用介绍]]></title>
    <link href="http://chenall.net/post/cameyo_packageeditor_01/"/>
    <id>http://chenall.net/post/cameyo_packageeditor_01/</id>
    <published>2014-04-06T07:00:54.000Z</published>
    <updated>2014-04-06T13:06:52.000Z</updated>
    <content type="html"><![CDATA[<p>  <a href="http://www.cameyo.com/" target="_blank" rel="external">Cameyo</a> 是一款可以媲美 thinstall 的虚拟化软件,可以把整个应用程序虚拟化为单文件版,虚拟化后的软件不需要安装可以在任意电脑上运行,这里简单介绍一下通过 Cameyo PackageEditor 把一个绿色软件制作成单文件版的方法.</p>
<a id="more"></a>

<h3 id="简易转换过程">简易转换过程</h3>
<p>这里以 <a href="http://www.zdfans.com/674.html" target="_blank" rel="external">百度云管家绿色版</a> 转换为Cameyo虚拟化包为例,因为这个相对比较简单,不需要更多设置,可以直接运行:</p>
<ul>
<li><p>首先打开 <a href="http://chenall.net/post/cameyo-packageeditor/" target="_blank" rel="external">PackageEditor</a> 启动编辑器,创建新的虚拟程序包(本例用的是2.X的版本).到了如下界面,在这里可以进行一些基本的设置,像运行模式之类的,还有扩展属性(本例最终的设置效果在后面).</p>
<p><img src="http://qiniu.chenall.net/post/cameyo_packageeditor_use_01.png" alt=""></p>
</li>
<li><p>现在开始添加所有需要的文件进去.</p>
<p><img src="http://qiniu.chenall.net/post/cameyo_packageeditor_use_filesystem.png" alt=""><br><img src="http://qiniu.chenall.net/post/cameyo_packageeditor_use_filesystem01.png" alt=""><br><img src="http://qiniu.chenall.net/post/cameyo_packageeditor_use_filesystem02.png" alt=""></p>
</li>
<li><p>添加完文件之后再设置一下主程序,如里有多个可以使用菜单.</p>
<p><img src="http://qiniu.chenall.net/post/cameyo_packageeditor_use_02.png" alt=""></p>
</li>
<li><p>使用更改图标功能设置应用的图标(会同时设置应用属性),直接在弹出的窗口中选择百度云管家的主程序就行了,,最终的设置效果图</p>
<p><img src="http://qiniu.chenall.net/post/cameyo_packageeditor_use_03.png" alt=""></p>
</li>
<li><p>现在把它保存起来.比如保存为 <strong>BaiduYunGuanjia</strong> 最终的文件名是 <strong>BaiduYunGuanjia.cameyo.exe</strong>,双击就可以直接启动百度云管家了.</p>
</li>
</ul>
<p>看起来很简单,不是吗?</p>
<p>当然了以上是最基本也是比较简单的,为了方便直接使用了完全访问的模式,如果使用数据模式或其它模式,则还需要设置一下下载路径允许比如 <strong>D:\BaiduYunDownload</strong> 的文件系统访问模式为完全访问,请继续往下看.</p>
<h3 id="安全设置">安全设置</h3>
<p>上面的是<strong>完全访问</strong>模式,也就是说这个虚拟化包可以对系统文件进行修改之类的,不太安全,一般除非特殊情况,不建议使用该模式,比较常用的是<strong>数据模式</strong>.</p>
<p>下面简单介绍一下各种模式的区别:</p>
<p>首先关于虚拟文件/注册表系统的一些基本概念(以下都是相对真实系统而言): </p>
<ul>
<li>完全访问: 可以直接读写</li>
<li>只读访问: <strong>CopyOnWrite</strong>,可以读但不能写入(写入的是副本),也同样是安全的,但是由于可以访问系统文件,</li>
<li>禁止访问: 这个模式下就无法访问到真实系统上的对应文件或注册表,最安全的模式.</li>
</ul>
<p>Cameyo基本数据访问模式:</p>
<ul>
<li>数据模式: 可以修改我的文档/桌面/网络硬盘上的文件内容.这个模式比较经常用到.</li>
<li>隔离模式: 安全模式,不能修改任何非虚拟化程序之外的内容.</li>
<li>完全访问: 完全直接访问模式,虚拟化程序可以直接改写系统内容.对于一些优化之类的软件使用.</li>
</ul>
<p>百度云管家只是用来管理百度网盘上的文件的,所以我这里设置为<strong>数据模式</strong>,由于下载的文件一般是存放在D盘的,所以同时允许对D盘完全访问.</p>
<p>这些设置在上面的第二张图片的界面上设置,选中目录,然后点击右上角系统文件旁边的选项进行修改.也可以下载本文附件用PackageEditor打开查看.</p>
<h3 id="成品下载">成品下载</h3>
<p>我制作好的百度云管家Cameyo单文件版下载: <a href="http://d.chenall.net/1/虚拟化绿软/BaiduYunGuanjia.exe" target="_blank" rel="external">百度云管家单文件绿色版</a></p>
]]></content>
    <summary type="html"><![CDATA[<p>  <a href="http://www.cameyo.com/" target="_blank" rel="external">Cameyo</a> 是一款可以媲美 thinstall 的虚拟化软件,可以把整个应用程序虚拟化为单文件版,虚拟化后的软件不需要安装可以在任意电脑上运行,这里简单介绍一下通过 Cameyo PackageEditor 把一个绿色软件制作成单文件版的方法.</p>
]]></summary>
    
      <category term="cameyo" scheme="http://chenall.net/tags/cameyo/"/>
    
      <category term="PackageEditor" scheme="http://chenall.net/tags/PackageEditor/"/>
    
      <category term="虚拟化" scheme="http://chenall.net/tags/%E8%99%9A%E6%8B%9F%E5%8C%96/"/>
    
      <category term="绿色" scheme="http://chenall.net/tags/%E7%BB%BF%E8%89%B2/"/>
    
      <category term="软件推荐" scheme="http://chenall.net/categories/%E8%BD%AF%E4%BB%B6%E6%8E%A8%E8%8D%90/"/>
    
      <category term="实用文集" scheme="http://chenall.net/categories/%E5%AE%9E%E7%94%A8%E6%96%87%E9%9B%86/"/>
    
  </entry>
  
  <entry>
    <title><![CDATA[Cameyo PackageEditor 简体中文版(增强版)]]></title>
    <link href="http://chenall.net/post/cameyo-packageeditor/"/>
    <id>http://chenall.net/post/cameyo-packageeditor/</id>
    <published>2014-03-08T08:41:55.000Z</published>
    <updated>2014-05-12T08:18:06.000Z</updated>
    <content type="html"><![CDATA[<h3 id="Cameyo_简介：">Cameyo 简介：</h3>
<p>Cameyo 是一款完全免费的应用程序虚拟化 (Application Virtualization) 工具或者说单文件软件制作工具，支持 XP、Vista 、 Windows7、Windows8，支持32位和64位系统。应用程序虚拟化技术就是将完整的程序资源打包为一个单一的可执行文件，从而无需安装即可运行。以前，要制作绿色软件需要学习很多技术，一般用户难以入门，而 Cameyo 则将此绿化过程变得简单且傻瓜。</p>
<p>Cameyo 的原理是利用沙盒（Sandbox）的虚拟化技术，先把所有相关资源打包成单个绿色文件，当执行这个“绿色软件”时，它会产生一个虚拟环境来执行，类似影子系统一样，一切涉及的操作都是在这个虚拟环境中完成，并不会去动原本的系统。所以使用 Cameyo 制作的绿色软件还有一个好处就是几乎不会对系统有害。</p>
<h3 id="PackageEditor">PackageEditor</h3>
<p>由于官方原版的翻译一直有问题,为了方便就自己修改编译一个,这个 PackageEditor 是基于<a href="https://code.google.com/p/cameyo/" target="_blank" rel="external">官方源码</a>，修改中文资源之后重新编译的，使用2.1版的源码主是要因为这个版本是个过渡版本，同时支持旧版和新的版本的编辑（<strong>只需要把不同版本的dll文件放进去就行了</strong>）。</p>
<a id="more"></a> 

<h4 id="2014-05-12_更新，源码更新到SVN_R290,导出XML功能改进，导出的信息更全面，并且支持旧版导出。">2014-05-12 更新，源码更新到SVN R290,导出XML功能改进，导出的信息更全面，并且支持旧版导出。</h4>
<h4 id="2014-04-19_更新,源码和官方版本同步-2-6-1209版-">2014-04-19 更新,源码和官方版本同步.2.6.1209版.</h4>
<h4 id="2014-04-03_更新">2014-04-03 更新</h4>
<ol>
<li>支持使用快照的方式创建新的虚拟化程序包.</li>
<li>支持自动更新(以后有上传新的版本时会有提示).</li>
<li>汉化部份英文字符串.</li>
</ol>
<p>使用新的版本可以很方便的创建新的虚拟化程序,默认使用的是快照的方式(获取快照-&gt;安装软件-&gt;获取快照-&gt;对比生成虚拟化包).</p>
<p>使用快照生成虚拟化包的方法:</p>
<ol>
<li>启动后选择 <strong>创建新的虚拟化程序</strong> 菜单,这时会出现如下界面,不要操作,等待抓取快照完成<br><img src="http://qiniu.chenall.net/post/Cameyo_PackageEditor_1.png" alt=""></li>
<li>抓取快照完成,等待用户安装程序<br><img src="http://qiniu.chenall.net/post/Cameyo_PackageEditor_2.png" alt=""></li>
<li>安装完成之后,再点击上图的 <strong>Install done</strong> 按钮,再次抓取快照.<br><img src="http://qiniu.chenall.net/post/Cameyo_PackageEditor_3.png" alt=""></li>
<li>等上面的快照完成.</li>
</ol>
<p>上面的方法生成的应用程序会较完整通用,还有另一个方法,速度比较快,但是很多程序不支持..</p>
<p>进入命令行,执行以下命令,然后正常安装就行了.</p>
<pre><code>PackageEditor.exe -exec #2 -GhostCapture 安装程序
</code></pre><p>比如某个应用程序的安装文件Setup.exe在d:下</p>
<pre><code>PackageEditor.exe -exec #2 -GhostCapture d:\Setup.exe
</code></pre><h4 id="2014-04-02_更新_2-6增强版BUG修正,创新新程序包时允许选择新版或旧版-">2014-04-02 更新 2.6增强版BUG修正,创新新程序包时允许选择新版或旧版.</h4>
<h4 id="2014-03-30_更新_最新2-6增强版">2014-03-30 更新 <strong>最新2.6增强版</strong></h4>
<p>  修改SDK API实现二合一,新的编辑器同时支持编辑新旧两种虚拟化包格式,会自动判断,若是打开的是旧版格式,会提示是否升级,不升级就保留旧版格式.另外使用这个编辑器创建新的虚拟化包时只能创建为旧版格式.需要用新格式的可以保存之后重新打开在提示转换是选择是就行了.</p>
<p>顺便说一下新旧格式的区别: 新版主要是支持<strong>内存运行模式</strong>,还有支持用户数据分离等特性,因为使用了新的压缩格式,速度会快一些,缺点就是产生的虚拟化程序会比较大.另外旧版可以直接用7Z打开看到里面的文件,新版的不行.</p>
<p>2.1版修改内容:</p>
<ul>
<li>把修改图标功能移到扩展属性中,和最新版一样.</li>
<li>修改部份中文资源文件,若有发现翻译错误,还请指出.</li>
<li>修正原版 启动命令 显示的BUG,这个版本可以正常显示.</li>
<li>添加应用版本信息(这个功能其实用处不大,原版把这个功能隐藏了),我只是它显示出来,并且添加部份代码.</li>
</ul>
<p><img src="http://qiniu.chenall.net/post/Cameyo_PackageEditor_menu.png" alt="最新版本启动界面"></p>
<p><img src="http://qiniu.chenall.net/post/Cameyo_PackageEditor2.1_base.png" alt="2.1版设置界面"></p>
<p><img src="http://qiniu.chenall.net/post/Cameyo_PackageEditor2.1_adv.png" alt="2.1版高级设置界面"></p>
<p>2.6版只是修改了简体中文资源文件.</p>
<p><img src="http://qiniu.chenall.net/post/Cameyo_PackageEditor2.6_base.png" alt="2.6版设置界面"></p>
<p><img src="http://qiniu.chenall.net/post/Cameyo_PackageEditor2.6_adv.png" alt="2.6版高级设置界面"></p>
<p>普通用户的设置界面和前面的一样的,下图有多一些设置界面,这些是需要授权的</p>
<p>授权申请网址: <a href="http://www.cameyo.com/upgrade" target="_blank" rel="external">http://www.cameyo.com/upgrade</a></p>
<p>里面有版本对比和升级申请,有需要的可以自己去申请,不一定能通过.</p>
<p><img src="http://qiniu.chenall.net/post/Cameyo_PackageEditor_Plus_adv.png" alt="高级版本设置界面"></p>
<h3 id="相关下载">相关下载</h3>
<p>不再更新 == 2.1编辑器+2.0版核心: <a href="http://d.chenall.net/1/虚拟化绿软/PackageEditor2.1.rar" target="_blank" rel="external">PackageEditor2.1简体中文版(内置2.0版组件)</a></p>
<p>不再更新 == 2.6编辑器(内存模式运行): <a href="http://d.chenall.net/1/虚拟化绿软/PackageEditor2.6.rar" target="_blank" rel="external">PackageEditor2.6简体中文版</a></p>
<p>最新2.6增强版(推荐使用): <a href="http://d.chenall.net/1/虚拟化绿软/PackageEditor.exe" target="_blank" rel="external">PackageEditor 2.6增强版</a></p>
<p>原版: <a href="http://d.chenall.net/1/虚拟化绿软/Cameyo-2.6.1191.rar" target="_blank" rel="external">Cameyo 2.6.1191 官方原版</a></p>
<h3 id="相关资料">相关资料</h3>
<p>Cameyo 官方文档（英文）: <a href="http://www.cameyo.com/doc/index.html" target="_blank" rel="external">http://www.cameyo.com/doc/index.html</a>  </p>
<p>Cameyo User Guide (七牛镜像): <a href="http://cameyo.qiniudn.com/doc/index.html" target="_blank" rel="external">http://cameyo.qiniudn.com/doc/index.html</a></p>
<p>本站 Cameyo相关文章: <!--[iLink[tag:cameyo]iLink]--></p>
<p>Cameyo 官方资源库: <a href="http://online.cameyo.com/public" target="_blank" rel="external">http://online.cameyo.com/public</a></p>
]]></content>
    <summary type="html"><![CDATA[<h3 id="Cameyo_简介：">Cameyo 简介：</h3>
<p>Cameyo 是一款完全免费的应用程序虚拟化 (Application Virtualization) 工具或者说单文件软件制作工具，支持 XP、Vista 、 Windows7、Windows8，支持32位和64位系统。应用程序虚拟化技术就是将完整的程序资源打包为一个单一的可执行文件，从而无需安装即可运行。以前，要制作绿色软件需要学习很多技术，一般用户难以入门，而 Cameyo 则将此绿化过程变得简单且傻瓜。</p>
<p>Cameyo 的原理是利用沙盒（Sandbox）的虚拟化技术，先把所有相关资源打包成单个绿色文件，当执行这个“绿色软件”时，它会产生一个虚拟环境来执行，类似影子系统一样，一切涉及的操作都是在这个虚拟环境中完成，并不会去动原本的系统。所以使用 Cameyo 制作的绿色软件还有一个好处就是几乎不会对系统有害。</p>
<h3 id="PackageEditor">PackageEditor</h3>
<p>由于官方原版的翻译一直有问题,为了方便就自己修改编译一个,这个 PackageEditor 是基于<a href="https://code.google.com/p/cameyo/" target="_blank" rel="external">官方源码</a>，修改中文资源之后重新编译的，使用2.1版的源码主是要因为这个版本是个过渡版本，同时支持旧版和新的版本的编辑（<strong>只需要把不同版本的dll文件放进去就行了</strong>）。</p>
]]></summary>
    
      <category term="cameyo" scheme="http://chenall.net/tags/cameyo/"/>
    
      <category term="虚拟化" scheme="http://chenall.net/tags/%E8%99%9A%E6%8B%9F%E5%8C%96/"/>
    
      <category term="程序设计" scheme="http://chenall.net/categories/%E7%A8%8B%E5%BA%8F%E8%AE%BE%E8%AE%A1/"/>
    
      <category term="C#" scheme="http://chenall.net/categories/%E7%A8%8B%E5%BA%8F%E8%AE%BE%E8%AE%A1/C/"/>
    
      <category term="软件推荐" scheme="http://chenall.net/categories/%E8%BD%AF%E4%BB%B6%E6%8E%A8%E8%8D%90/"/>
    
      <category term="系统相关" scheme="http://chenall.net/categories/%E8%BD%AF%E4%BB%B6%E6%8E%A8%E8%8D%90/%E7%B3%BB%E7%BB%9F%E7%9B%B8%E5%85%B3/"/>
    
  </entry>
  
  <entry>
    <title><![CDATA[linux sudo 命令和配置文件/etc/sudoers介绍]]></title>
    <link href="http://chenall.net/post/linux-sudo-config/"/>
    <id>http://chenall.net/post/linux-sudo-config/</id>
    <published>2014-02-26T09:40:34.000Z</published>
    <updated>2014-02-26T13:50:11.000Z</updated>
    <content type="html"><![CDATA[<p><code>sudo</code> 是<strong>linux</strong>下常用的允许普通用户使用超级用户权限的工具。 它的配置文件 <strong>sudoers</strong> 一般在 <strong>/etc</strong> 目录下。</p>
<p>不过不管 <strong>sudoers</strong> 文件在哪儿，<code>sudo</code> 都提供了一个编辑该文件的命令：<strong>visudo</strong> 来对该文件进行修改。强烈推荐使用该命令修改 <strong>sudoers</strong>，因为它会帮你校验文件配置是否正确，如果不正确，在保存退出时就会提示你哪段配置出错的。 </p>
<p>以下是 <strong>sudoers</strong> 的默认配置文件内容。</p>
<a id="more"></a>

<pre><code>#
# This file MUST be edited with the &#39;visudo&#39; command as root.
#
# Please consider adding local content in /etc/sudoers.d/ instead of
# directly modifying this file.
#
# See the man page for details on how to write a sudoers file.
#
Defaults        env_reset
Defaults        secure_path=&quot;/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin&quot;

# Host alias specification

# User alias specification

# Cmnd alias specification

# User privilege specification
root    ALL=(ALL:ALL) ALL

# Members of the admin group may gain root privileges
%admin ALL=(ALL) ALL

# Allow members of group sudo to execute any command
%sudo   ALL=(ALL:ALL) ALL
</code></pre><h3 id="基本配置格式">基本配置格式</h3>
<pre><code>&lt;user list&gt; &lt;host list&gt; = &lt;operator list&gt; &lt;tag list&gt; &lt;command list&gt;
</code></pre><ul>
<li><em>user list</em>       用户/组，或者已经设置的用户的别名列表, 用户名直接 <code>username</code>，用户组加上<code>%</code>，比如<code>%admin</code>,</li>
<li><em>host list</em>       主机名或别名列表</li>
<li><em>operator list</em>   runas用户，即可以以哪个用户、组的权限来执行</li>
<li><em>command list</em>    可以执行的命令或列表</li>
<li><em>tag list</em>        这个经常用到的是 <strong>NOPASSWD:</strong> ，添加这个参数之后可以不用输入密码。</li>
</ul>
<p>再来看看默认配置里面的对应配置的说明</p>
<pre><code>## root 用户可以在任意主机上以任意用户、组的权限执行任意命令，说明root用户具有最高级的权限。
root    ALL=(ALL:ALL) ALL

## admin组的用户都拥有最高级权限。
%admin ALL=(ALL) ALL

## sudo 组用户和root用户权限一样
%sudo   ALL=(ALL:ALL) ALL
</code></pre><p><strong>tag list</strong> 如果是 <strong>NOPASSWD:</strong> 则运行时不需要输入密码例子:</p>
<pre><code>## test 用户可以不用输入密码运行 **/sbin/reboot** 命令
test ALL=(ALL) NOPASSWD: /sbin/reboot
</code></pre><p> <strong>operator list</strong> 和 <strong>tag list</strong> 都是可选的，比如下面的：</p>
<pre><code>test ALL=/sbin/reboot
</code></pre><p>实用例子， 在<code>PHP</code>上使用<code>system</code> 调用系统命令时，由于是<code>php</code>一般都是使用<code>www</code>用户运行的，如果要特别的需要，需要处理某个用户的文件时就可以指定某个目录或命令，使用某个用户权限免密码运行。</p>
<p>例子： 目录 <strong>/mnt/sudodir</strong> 里面的程序可以使用root权限来执行。</p>
<pre><code>www ALL=(root) NOPASSWD: /mnt/sudodir
</code></pre><p>使用时，直接<code>sudo -u root /mnt/sudodir/cmd</code>，不需要输入密码。</p>
<p>为了安全起见，这个 <strong>/mnt/sudodir</strong> 除了<code>root</code>用户之外其它人应该只有运行的权限。</p>
<p>查看当前用户的<code>sudo</code>权限可以使用命令 <code>sudo -l</code></p>
<p>PS： 我整理这些资料，主要是为了通过<a href="https://github.com/" target="_blank" rel="external">github</a>的webhook功能, 配和我的VPS上的PHP脚本来实现 <code>hexo</code> 站点的自动更新，这样我只需要更新源文件到github上，它就自动生成站点内容，并且自动同步到多个不同的地方，有空我会再整一篇文章来介绍这个。</p>
<p>参考资料： <a href="https://help.ubuntu.com/community/Sudoers" target="_blank" rel="external">https://help.ubuntu.com/community/Sudoers</a></p>
]]></content>
    <summary type="html"><![CDATA[<p><code>sudo</code> 是<strong>linux</strong>下常用的允许普通用户使用超级用户权限的工具。 它的配置文件 <strong>sudoers</strong> 一般在 <strong>/etc</strong> 目录下。</p>
<p>不过不管 <strong>sudoers</strong> 文件在哪儿，<code>sudo</code> 都提供了一个编辑该文件的命令：<strong>visudo</strong> 来对该文件进行修改。强烈推荐使用该命令修改 <strong>sudoers</strong>，因为它会帮你校验文件配置是否正确，如果不正确，在保存退出时就会提示你哪段配置出错的。 </p>
<p>以下是 <strong>sudoers</strong> 的默认配置文件内容。</p>
]]></summary>
    
      <category term="linux" scheme="http://chenall.net/tags/linux/"/>
    
      <category term="sudo" scheme="http://chenall.net/tags/sudo/"/>
    
      <category term="系统相关" scheme="http://chenall.net/categories/%E7%B3%BB%E7%BB%9F%E7%9B%B8%E5%85%B3/"/>
    
      <category term="linux" scheme="http://chenall.net/categories/%E7%B3%BB%E7%BB%9F%E7%9B%B8%E5%85%B3/linux/"/>
    
  </entry>
  
  <entry>
    <title><![CDATA[[分享] HG320路由器盲刷64K CFE NVRAM固件]]></title>
    <link href="http://chenall.net/post/hg320_64k/"/>
    <id>http://chenall.net/post/hg320_64k/</id>
    <published>2014-02-24T12:00:00.000Z</published>
    <updated>2014-02-26T11:52:59.000Z</updated>
    <content type="html"><![CDATA[<p><a href="http://item.taobao.com/item.htm?spm=a1z09.5.0.0.qCXaZs&amp;id=16255606413" target="_blank" rel="external">HG320</a>是一款神器级的高性价比无线路由器，由于其厂家为“烽火通信科技股份有限公司”，这款产品更多的被叫做了“烽火HG320”。中国电信采购了这款设备，并作为安装业务时的标配产品，但这次中国电信难得厚道了一把。</p>
<p>参数方面，这款与磊科的NR235W/NR236W以及热议的贝尔RG200E-CA非常接近，BCM5358 500MHz处理器，64MB RAM+16MB ROM的组合在其他品牌中算是高端配置了，接口包括1WAN+4LAN+1USB，算是齐全。</p>
<p>这款机器可以刷包括TOMATO、DD-WRT、磊科双WAN等多种固件，而且由于内置了JTAG接口，因此即使刷出问题也有挽救方案。很多玩家基于这款机器进行了各种DIY，包括升级RAM，增加天线等，价格不高，折腾余地很大。</p>
<p>这不我又开始折腾上了，由于默认情况下NVRAM只有32KB，平常的话使用起来倒是没有什么问题，不过若是你的配置的内容太多的超过32KB（像OpenVPN证书，一下就是10KB以上，很容易超），这时就会出现配置丢失的问题。</p>
<a id="more"></a>

<p>之前很早就发现了 <a href="http://hi.baidu.com/zengchen228" target="_blank" rel="external">~╰独①儛②</a> 提供的 <a href="http://hi.baidu.com/zengchen228/item/1d0f673a03523af2e7bb7a17" target="_blank" rel="external">HG320 64K CFE</a> 刷了这个之后配合64K的固件就可以使用64K的NVRAM了，一直没有去尝试，最近又买了几个路由器，就拿来试试。</p>
<p>需要准备的软件ROM: <a href="http://pan.baidu.com/s/1CJPEm" target="_blank" rel="external">点这里下载</a></p>
<p>里面包括了 <a href="http://hi.baidu.com/zengchen228" target="_blank" rel="external">~╰独①儛②</a> 提供的CFE，还有 <a href="http://pan.baidu.com/s/1cMsgd" target="_blank" rel="external">bwq518 提供的支持64K NVRAM的固件</a>，还有TFTP、PUTTY等软件。</p>
<p>为了方便使用，先把连接路由器的网卡IP改成固定192.168.1.2，准备好TTL数据线，然后就是拆机了，按照下面方法接好TTL数据线，然后接上网线，电源。</p>
<p><img src="http://qiniu.chenall.net/post/hg320_ttl.jpg" alt=""></p>
<p>首先要刷64K 的CFE，可以先刷DD的MINI版，然后在DD里面刷，或者在MINIWEB下刷，</p>
<p>相关资料：</p>
<p><a href="http://www.right.com.cn/forum/thread-79340-1-1.html" target="_blank" rel="external">http://www.right.com.cn/forum/thread-79340-1-1.html</a></p>
<p><a href="http://www.right.com.cn/forum/forum.php?mod=viewthread&amp;tid=117002" target="_blank" rel="external">不拆机刷CFE，不用TTL</a></p>
<p>我这里已经有TTL数据线了了，还是直接用TTL线刷比较快。</p>
<p>但不知什么原因我的TTL接上去之后什么都不显示，但经过测试输入命令有反应，最简单的就是输入<code>reboot</code>之后路由器就会重启。所以本文介绍的是盲刷，只提供一个参考。</p>
<p>首先要启动到CFE模式，最保险的方法</p>
<p>打开TFTP程序</p>
<p><img src="http://qiniu.chenall.net/post/hg320_tftp.jpg" alt=""></p>
<p>打开路由器，直到变绿.</p>
<p><img src="http://qiniu.chenall.net/post/hg320_tftp_ok.png" alt=""></p>
<p>这时<code>ping 192.168.1.1</code>测试正常。并且TTL=100</p>
<p><img src="http://qiniu.chenall.net/post/hg320_ttl_100.png" alt=""></p>
<p>说明这时已经停在了CFE界面。（如果一直没有办法进入，可以进入路由器管理界面，直接刷ddwrt固件重启之后一般就能行了）</p>
<p>可以开工了，直接运行tftpd32，不用管它，放着。</p>
<p>运行putty,选择对应的COM端口，和速度一般是（115200)，然后连接。</p>
<p>可以试着输入’reboot’回车测试一下，如果路由器重启了，说明正常，重新使用上面的方法进入CFE界面。</p>
<ol>
<li><p>首先清理NVRAM，在putty中直接输入以下命令回车（我这里是看不到回显的，只能盲打盲刷），下同。  </p>
<pre><code> nvram erase
</code></pre></li>
<li><p>然后开始刷64k的cfe。一切正常的话就会看到tftpd32的窗口会闪一下，并且会显示下载了cfe64k.bin文件。  </p>
<pre><code> flash -noheader 192.168.1.2:cfe64.bin flash0.boot
</code></pre></li>
<li>重启路由器  <pre><code> reboot
</code></pre></li>
<li><p>继续使用前面的方法进入CFE开始刷固件(也可以在上面输入reboot重启时，在putty窗口，按住Ctrl+C)。</p>
<ol>
<li>退出MINIWEB和清理nvram  <pre><code> quit
 nvram erase
</code></pre></li>
<li>刷e1500固件（因为这个CFE是基于E1500的CFE修改的，有校验）  <pre><code> flash -ctheader 192.168.1.2:e1500.bin flash1.trx
</code></pre> 注： 注意看一下TFTPD32的窗口，成功的话会有传e1500.bin文件的信息。<br> 等待刷写完成，一分钟左右，如果右数第三个指示灯有在闪就进入下一步，否则重启路由器，重新进入CFE，重复4.1，然后再下一步。</li>
<li>刷tomato固件 <pre><code> flash -noerase -noheader 192.168.1.2:64k.trx flash1.trx
</code></pre> 注： 注意看一下TFTPD32的窗口，成功的话会有传64k.trx文件的信息。并且网络指示灯会一直在闪，表示正在上传固件。</li>
<li>重启路由器<pre><code> reboot
</code></pre></li>
</ol>
</li>
<li><p>一切正常的话，等待路由器重启完成之后就可以看到支持64K NVRAM的固件已经刷好了。 </p>
<p><img src="http://qiniu.chenall.net/post/hg320_64k_nvram.png" alt=""></p>
</li>
<li><p>以后可以直接在路由器的固件升级功能中直接升级或刷其它固件。</p>
</li>
</ol>
]]></content>
    <summary type="html"><![CDATA[<p><a href="http://item.taobao.com/item.htm?spm=a1z09.5.0.0.qCXaZs&amp;id=16255606413" target="_blank" rel="external">HG320</a>是一款神器级的高性价比无线路由器，由于其厂家为“烽火通信科技股份有限公司”，这款产品更多的被叫做了“烽火HG320”。中国电信采购了这款设备，并作为安装业务时的标配产品，但这次中国电信难得厚道了一把。</p>
<p>参数方面，这款与磊科的NR235W/NR236W以及热议的贝尔RG200E-CA非常接近，BCM5358 500MHz处理器，64MB RAM+16MB ROM的组合在其他品牌中算是高端配置了，接口包括1WAN+4LAN+1USB，算是齐全。</p>
<p>这款机器可以刷包括TOMATO、DD-WRT、磊科双WAN等多种固件，而且由于内置了JTAG接口，因此即使刷出问题也有挽救方案。很多玩家基于这款机器进行了各种DIY，包括升级RAM，增加天线等，价格不高，折腾余地很大。</p>
<p>这不我又开始折腾上了，由于默认情况下NVRAM只有32KB，平常的话使用起来倒是没有什么问题，不过若是你的配置的内容太多的超过32KB（像OpenVPN证书，一下就是10KB以上，很容易超），这时就会出现配置丢失的问题。</p>
]]></summary>
    
      <category term="hg320" scheme="http://chenall.net/tags/hg320/"/>
    
      <category term="tomato" scheme="http://chenall.net/tags/tomato/"/>
    
      <category term="路由器" scheme="http://chenall.net/tags/%E8%B7%AF%E7%94%B1%E5%99%A8/"/>
    
      <category term="刷机" scheme="http://chenall.net/tags/%E5%88%B7%E6%9C%BA/"/>
    
      <category term="实用文集" scheme="http://chenall.net/categories/%E5%AE%9E%E7%94%A8%E6%96%87%E9%9B%86/"/>
    
  </entry>
  
  <entry>
    <title><![CDATA[Hexo 模块化主题]]></title>
    <link href="http://chenall.net/post/hexo_theme_chenall/"/>
    <id>http://chenall.net/post/hexo_theme_chenall/</id>
    <published>2014-02-13T14:25:00.000Z</published>
    <updated>2014-03-29T01:07:09.000Z</updated>
    <content type="html"><![CDATA[<h3 id="主题简介">主题简介</h3>
<p>基于<a href="http://zespia.tw/hexo/" target="_blank" rel="external">Hexo</a>默认主题 <a href="https://github.com/hexojs/hexo-theme-light" target="_blank" rel="external">light</a> 修改而成,采用 <a href="http://getbootstrap.com/" target="_blank" rel="external">bootstrap</a> 框架  </p>
<p>在尽量保留原有主题功能的同时采用模块化设计支持实现组件模块化.完全自定义,通过widgets你可以添加许多实用功能.可以自定义组合各种组件,像评论系统,统计系统等.</p>
<p>大部份的JS/CSS等静态文件都使用CDN加载,使用了 <a href="http://open.bootcss.com/" target="_blank" rel="external">bootcss</a> 和 <a href="http://www.staticfile.org/" target="_blank" rel="external">qiniu</a> 的CDN服务.</p>
<p>以下是本主题的特色:</p>
<p>基于<a href="http://zespia.tw/hexo/" target="_blank" rel="external">Hexo</a>默认主题light修改而成,采用bootstrap css框架,主要考虑多站点支持.<br>在尽量保留原有主题功能的同时采用模块化设计支持多个widgets.实现高度自定义,通过widgets你可以添加许多实用功能.<br>可以自定义组合各种组件,像评论系统,统计系统等.</p>
<ul>
<li>支持多站点共用同一主题,免切换</li>
<li>支持单独启用或禁用小工具(像侧边栏之类的)</li>
<li>支持单独启用或禁用评论</li>
<li>支持自动设置目录(source_dir,public_dir,scaffolds)</li>
<li>可以单独指定加载小工具</li>
<li>支持多个分类，支持子分类</li>
<li>独特的用户配置文件(自动加载<code>$SOURCE\_$THEME.yml</code>[默认就是<strong>source\_chenall.yml</strong>]作为主题的配置文件,这样可以避免升级主题或其它原因导致的配置文件丢失).</li>
<li><code>iLink</code> 文章内链功能</li>
<li><code>ijs</code> 文章内嵌脚本或能</li>
<li>允许在head或body的前面或尾部附加自定义内容.(相对1.0版改变,新版只使用<code>source/_modules</code>目录).</li>
<li>独立脚本插件扩展(source_dir/_scripts目录里面的js文件会自动加载,效果和scripts目录里面一样)</li>
</ul>
<a id="more"></a>

<p>注: 上面的$SOURCE是hexo配置文件中在<code>source_dir</code>,$THEME是hexo配置文件中的<code>theme</code>,即 <strong>hexo.source<em>dir + ‘</em>‘+ hexo.config.theme+ ‘.yml’</strong>;</p>
<p>其它: 本主题可以轻松支持多站点，每个站点的配置各自独立，互不影响（包括站点特定插件等）。</p>
<p>效果见本站源码：<a href="https://github.com/chenall/chenall" target="_blank" rel="external">https://github.com/chenall/chenall</a><br>还有demo源码: <a href="https://github.com/chenall/hexo-theme-chenall" target="_blank" rel="external">https://github.com/chenall/hexo-theme-chenall</a>  </p>
<p>site分支里面的文件就是文章源码，源码里面包括了对应的配置文件_config.yml和插件等。</p>
<p>安装hexo之后，再安装本主题。<br>然后下载本站源码，就可以使用新版的hexo测试了</p>
<p>例子:</p>
<pre><code>svn co -r HEAD https://github.com/chenall/hexo-theme-chenall/trunk themes/chenall
svn co -r HEAD https://github.com/chenall/chenall/branches/site chenall.net
hexo server --config chenall.net/_config.yml
</code></pre><p>注2: V2.0版适用的hexo版本为 2.5.3 以上(2.5.2版本有Bug会显示不正常).2.4.X版请下载V1.0版主题.</p>
<h2 id="具体效果:_demo_或本站_chenall-net"><strong>具体效果:</strong> <a href="http://hexo.chenall.net" target="_blank" rel="external">demo</a> 或本站 <a href="http://chenall.net" target="_blank" rel="external">chenall.net</a></h2>
<h3 id="安装方法">安装方法</h3>
<p>通过以下命令下载主题到您的theme目录，然后修改blog的<code>_config.yml</code>中<em>theme</em>为<code>chenall</code>。</p>
<pre><code>git clone git://github.com/chenall/hexo-theme-chenall.git themes/chenall
</code></pre><p>或</p>
<pre><code>svn co -r HEAD https://github.com/chenall/hexo-theme-chenall/trunk themes/chenall
## 若要下载1.0版用以下命令
svn co https://github.com/chenall/hexo-theme-chenall/tags/V1.0 themes/chenall
</code></pre><p>另外: 主题内置的<code>list_posts</code>插件还需要额外安装一个<code>lodash</code>组件,使用以下命令安装即可.(V1.0版需要)</p>
<pre><code>npm install lodash --save
</code></pre><h3 id="更新">更新</h3>
<p>通过以下命令来保持更新:</p>
<pre><code>cd themes/light
git pull 或 svn up
</code></pre><ul>
<li>2014-03-28 升级到V2.0版,支持hexo 2.5.X版本,一些功能改进.</li>
<li>2014-03-29 random_posts 实现真正的随机文章功能(使用js脚本加载).</li>
</ul>
<h2 id="自动设置目录_(V2-0)">自动设置目录 (V2.0)</h2>
<p><code>hexo</code>默认的<code>source</code>目录等虽然可以通过配置文件来指定,但由于必须使用固定的目录,使用起来不太灵活</p>
<p>本主题对此进行了扩展,允许这些目录跟随配置文件自动变化,比如下面的配置,最终的source_dir是<code>$config/_config.yml</code></p>
<pre><code>CustomDir:
  source_dir: source
  public_dir: public
</code></pre><p>说明:</p>
<ol>
<li>目前只支持’public_dir’,’source_dir’,’scaffold_dir’的配置.</li>
<li>可以使用变量<strong>:config</strong>代表配置文件目录.比如 source_dir: <strong>:config</strong></li>
<li>具体实例可以参考[demo.site</li>
</ol>
<h3 id="分类说明">分类说明</h3>
<p>本主题分类方式是额外实现的,一行一个分类,每一行都是一个独立分类.</p>
<p>同时支持多级分类,像下面的.就设置了两个分类,<code>编程开发</code>和<code>VBScript</code>,<code>VBScript</code>是一个子分类.具体效果请参考<a href="http://hexo.chenall.net" target="_blank" rel="external">demo</a></p>
<pre><code class="yaml">categories: 
- 程序设计/VB/VBScript
- 编程开发
</code></pre>
<h3 id="ijs_内嵌脚本">ijs 内嵌脚本</h3>
<p><code>ijs</code> 是本主题的内置的<code>tag</code>插件,可以在文章中内嵌脚本,这样可以实现一些特殊功能.(因为是在主题中执行的,所以可以使用那些helper插件);</p>
<p>一个简单的例子,在文章中插入以下内容.</p>
<pre><code>{% ijs %}
return link_to(&#39;http://chenall.net&#39;,&#39;我的搏客&#39;);
{% endijs %}
</code></pre><p>以上通过hexo内置的<em>helper</em>插件<strong>link_to</strong>实现在文章中插入一个链接指向<code>http://chenall.net</code>.</p>
<h2 id="效果:_0">效果: <!--[ijs[(function(){return link_to('http://chenall.net','我的搏客');})();]ijs]--></h2>
<p>复杂一些的例子,在文章中插入最新的5篇文章列表.</p>
<pre><code>{% ijs %}
var str = &#39;&#39;;
if (site.posts.length){
  str = &#39;&lt;ul class=&quot;list-group&quot;&gt;&#39;;
  site.posts.sort(&#39;date&#39;, -1).limit(5).each(function(post){
    str += &#39;&lt;li class=&quot;list-group-item&quot;&gt;&lt;a href=&quot;&#39; + config.root + post.path + &#39;&quot;&gt;&#39; + post.title + &#39;&lt;/a&gt;&lt;/li&gt;&#39;;
  });
  str += &#39;&lt;/ul&gt;&#39;;
}
return str;
{% endijs %}
</code></pre><h2 id="效果如下:">效果如下:</h2>
<!--[ijs[(function(){var str = '';
if (site.posts.length){
  str = '<ul class="list-group">';
  site.posts.sort('date', -1).limit(5).each(function(post){
    str += '<li class="list-group-item"><a href="' + config.root + post.path + '">' + post.title + '</a></li>';
  });
  str += '</ul>';
}
return str;})();]ijs]-->

<h3 id="iLink_文章内链">iLink 文章内链</h3>
<p><code>iLink</code> 是本主题内置的的<code>tag</code>插件,通过<strong>iLink</strong>可以很方便的在文章中插入文章链接.</p>
<p>iLink 使用格式</p>
<pre><code>{% iLink TYPE:VALUE%}
TYPE: 类型
VALUE: 值
</code></pre><p>其中TYPE可使用的值如下:</p>
<ul>
<li><p><code>tag</code>  链接到标签  </p>
<pre><code> {% iLink tag:GRUB4DOS %}
</code></pre><p> 例: <!--[iLink[tag:GRUB4DOS]iLink]--></p>
</li>
<li><p><code>cat</code> 或 <code>category</code> 链接到分类<br> 例子: </p>
<pre><code> {% iLink cat:程序设计 %}
</code></pre><p> 例: <!--[iLink[cat:程序设计]iLink]--></p>
</li>
<li><p>其它值会根据提供的信息自动链接到指定文章<br>例子:</p>
<ol>
<li><p>链接到源文件名 </p>
<pre><code>{% iLink source:_posts/grub4dos_dev.md %}
</code></pre><p>例: <!--[iLink[source:_posts/grub4dos_dev.md]iLink]-->  </p>
</li>
<li><p>链接到文章标题 </p>
<pre><code>{% iLink title:[推荐] 免费的云计算Koding %}
</code></pre><p>例: <!--[iLink[title:[推荐] 免费的云计算Koding]iLink]-->  </p>
</li>
<li><p>若某个文章页有额外添加了一些信息比如<code>id: 596</code>  </p>
<pre><code>{% iLink id:597 %}
</code></pre><p>例: <!--[iLink[id:597]iLink]--></p>
</li>
<li><p>通过文章的slug  </p>
<pre><code>{% iLink slug:jekyll_or_hexo %}
</code></pre><p>例: <!--[iLink[slug:jekyll_or_hexo]iLink]--></p>
</li>
</ol>
</li>
</ul>
<h3 id="附加自定义内容">附加自定义内容</h3>
<p>如果你需要一些添加一些额外和主题无关的内容.这时就可以使用这个功能.<br>在<code>_modules</code>目录中(主题或source都可以)新建一个文件夹<code>partial</code>.</p>
<p>然后就可以通过<code>partial</code>里面的特定文件添加额外内容.</p>
<p>具体文件列表:</p>
<ul>
<li><code>body_start.ejs</code>   标签<code>&lt;body&gt;</code>后.</li>
<li><code>body_end.ejs</code>     标签<code>&lt;/body&gt;</code>前.</li>
<li><code>head_start.ejs</code>   标签<code>&lt;head&gt;</code>后</li>
<li><code>head_end.ejs</code>     标签<code>&lt;/head&gt;</code>前</li>
</ul>
<p>例子: 想要在head中添加一行<code>meta</code>信息就可以在<code>head_start.ejs</code>中添加.</p>
<h2 id="主题配置说明">主题配置说明</h2>
<p>注: 配置中如果需要访问到本地路径,除非特别指定否则应该用<code>css/theme.css</code>不要写成<code>/css/theme.css</code>,前者是相对路径会自动添加<strong>config.root</strong>路径.后者是绝对路径.</p>
<p>本主题特色: <strong>把这个配置文件复制到<code>source</code>目录下并改名为<code>_chenall.yml</code>则会优先使用该配置,这样可以避免由于升级主题或其它原因导致的配置丢失.更方便使用.</strong></p>
<h3 id="默认的配置">默认的配置</h3>
<pre><code class="yaml"># Site default meta keywords
#keywords: site, wide, default, keywords

#已加载的模块,按顺序加载,所以需要自己调整加载的顺序,比如jquery一般要加载在最前面
loaded_modules:
- jquery
- bootstrap
- fontawesome
- prettify
- fancybox
- mathjax

# 注: 模块是由css或js文件来实现的,部份需要附加js代码的模块在_modules目录下.
# 如: prettify 如果加载了prettify则会同时加载_modules\_modules.ejs
# 部份模块是自动按需加载的,在模板中添加如下代码加载多说的JS模块
# &lt;% theme.add_module(&#39;duoshuo&#39;); %&gt;
#
#
modules:
  # respond 不要放到loaded_modules中,这个会自动加载
  # proxy 指定respond的proxy地址
  # 注: bootstrap的css文件和这个proxy需要在同一个域上
  respond: ## A fast &amp; lightweight polyfill for min/max-width CSS3 Media Queries (for IE 6-8, and more).
    js: http://cdn.staticfile.org/respond.js/1.4.2/respond.min.js
    proxy: http://cdn.staticfile.org/respond.js/1.4.2/respond-proxy.html
  jquery:
    js: http://cdn.bootcss.com/jquery/1.10.2/jquery.min.js
  bootstrap: #强大的CSS框架，由Twitter的开发工程师推出
    css: http://cdn.staticfile.org/twitter-bootstrap/3.1.0/css/bootstrap.min.css
    js: http://cdn.staticfile.org/twitter-bootstrap/3.1.0/js/bootstrap.min.js
  prettify: # Google Code Prettify 代码的高亮显示
    css: http://cdn.bootcss.com/prettify/r298/prettify.min.css
    js: http://cdn.bootcss.com/prettify/r298/prettify.min.js
  highlightjs: # highlight.js 代码高亮显示插件
    css: http://cdn.bootcss.com/highlight.js/7.4/styles/github.min.css
    js:  http://cdn.bootcss.com/highlight.js/7.4/highlight.min.js
  fancybox: # 一款基于jQuery开发的类Lightbox插件
    css: http://cdn.bootcss.com/fancybox/2.1.5/jquery.fancybox.min.css
    js:  http://cdn.bootcss.com/fancybox/2.1.5/jquery.fancybox.min.js
  imagesloaded: #监测图片是否加载完毕的JavaScript库
    #js: js/jquery.imagesloaded.min.js
     js: http://cdn.bootcss.com/jquery.imagesloaded/3.0.4/jquery.imagesloaded.min.js
  Gallery:
    css: http://cdn.bootcss.com/blueimp-gallery/2.11.2/css/blueimp-gallery.min.css
    js: http://cdn.bootcss.com/blueimp-gallery/2.11.2/js/jquery.blueimp-gallery.min.js
  fontawesome:
    css: http://cdn.bootcss.com/font-awesome/4.0.3/css/font-awesome.min.css
  # MathJax is an open source JavaScript display engine for mathematics that works in all browsers.
  mathjax: # 生成数学公式插件
    css:
    js: http://cdn.bootcss.com/mathjax/2.3/MathJax.js?config=TeX-AMS-MML_HTMLorMML
    #js: http://cdn.mathjax.org/mathjax/latest/MathJax.js?config=TeX-AMS-MML_HTMLorMML
  uyan: #有言评论系统
    uid: 1880458
  ujian: #友荐：为网站添加&#39;猜你喜欢&#39;功能
    uid: 1880458

##评论功能设置,目前支持disqus和duoshuo/uyan,需要在上面的modules中进行要应的设置
# show_count 是否显示文章的评论数量
# short_name 对应的short_name
# 需要的其它参数也可以加在下面,然后自己修改模板来使用.theme.comments.xxxxxx来调用
#
# 
comments:
    provider: duoshuo
    show_count: true
    short_name: hexochenall

## 站点分析统计代码功能组件
# 加载在站点的footer位置
analytics:
  # provider 要加载的统计代码类型,可同时加载多少,使用&quot;,&quot;分隔. 如下就加载了51la和google的统计代码
  # provider: 51la,google 
  provider: 51la,google,cnzz
  # google-analytics UA
  google:
  # 我要啦」免费统计 ID
  51la:
  # cnzz 免费统计
  cnzz:
    siteid: 5774006  #站点ID,在获取统计代码的页面的地址栏上可以看到siteid=xxxx或从代码中提取(一般是一串数字)
    show: #显示样式  留空: 图片形式1; 1: 图片形式2; 2: 图片形式1; 其它值: 文字形式

# 站点顶部菜单,支持子菜单
menu:
  Home: &#39;&#39;
  About: about/
  Archives: archives/
  其它链接:
    chenall: //chenall.net
    gihtub: https://github.com/chenall/hexo-theme-chenall

# ajax_widgets是否使用jquery.load动态加载widget的内容,
# 注: 部份小工具,像标签,分类,最近文章等,这些工具的内容在所有页面都是一样的,这时它就支持动态加载
# 所谓的动态加载,就是把这些内容从文章中分离出来独立存在,并采用ajax技术动态加载到指定位置.
# 使用动态加载,更新文章时,就不会因为分类或标签等内容的更改,导致所有页面都需要更新.
#
ajax_widgets: true

# 要加载的工具在这里添加
widgets:
  header: #顶部
  footer: #底部
  sidebar: #侧边栏
    - search
    - category
    - recent_posts
    - tagcloud
    - latest_update_posts
    - random_posts
    - sina_weiboshow
    - recent_comments
  before_content: # 文章内容前
  after_content:  # 文章内容后
    - wumiiRelatedItems
    - post_footer_info
    - ujian

  after_post:     # 文章框架之后
    - post_pageNav
    - related_posts

# For use with tagcloud or tag widgets
# - only tags &gt;= to tag_minium are shown
tag_minium: 3

## Google 跟踪代码管理器 设置
## https://www.google.com/tagmanager/
## ID 就是对应容器的ID
## GoogleTagManagerID: GTM-ABCDEF
GTM_ID:

## 在文章中使用&#39;[ CDN_URL]:&#39;（注：CDN_URL两边无任格空格，这里是为了防止被替换）字符串自动替换为下面的地址,主要是为了方便使用.
CDN_URL: http://your.cdn.url

twitter_id: chenall
facebook_id:
linkedin_id:
github_id: chenall/almrun

rss: atom.xml
</code></pre>
<h3 id="其它语言支持">其它语言支持</h3>
<p>  本主题只设置了简体中文语言文件,要使用其它语言,可以自己翻译下.以下是简体中文的语言文件例子:</p>
<pre><code class="yaml">categories: 分类
search: 搜索
tags: 标签
tagcloud: 标签云
tweets: 推文
prev: 上一页
next: 下一页
comment: 留言
archive_a: 归档
archive_b: 归档：%s
page: 第 %d 页

post:
  updated: 最近更新
  Tagged: 标签
  Posted on: 发表于
  Posted in: 归类
  read more: 阅读全文

menu:
  Home: 主页
  About: 关于
  Archives: 归档
  GuestBook: 留言板

widgets:
  category: 分类
  recent_posts: 最近文章
  latest_update_posts: 最近更新
  recent_comments: 最近评论
  sina_weiboshow: 新浪微搏秀
  google_sidebar: 赞助商
  tags: 标签
  tagcloud: 标签云
</code></pre>
]]></content>
    <summary type="html"><![CDATA[<h3 id="主题简介">主题简介</h3>
<p>基于<a href="http://zespia.tw/hexo/" target="_blank" rel="external">Hexo</a>默认主题 <a href="https://github.com/hexojs/hexo-theme-light" target="_blank" rel="external">light</a> 修改而成,采用 <a href="http://getbootstrap.com/" target="_blank" rel="external">bootstrap</a> 框架  </p>
<p>在尽量保留原有主题功能的同时采用模块化设计支持实现组件模块化.完全自定义,通过widgets你可以添加许多实用功能.可以自定义组合各种组件,像评论系统,统计系统等.</p>
<p>大部份的JS/CSS等静态文件都使用CDN加载,使用了 <a href="http://open.bootcss.com/" target="_blank" rel="external">bootcss</a> 和 <a href="http://www.staticfile.org/" target="_blank" rel="external">qiniu</a> 的CDN服务.</p>
<p>以下是本主题的特色:</p>
<p>基于<a href="http://zespia.tw/hexo/" target="_blank" rel="external">Hexo</a>默认主题light修改而成,采用bootstrap css框架,主要考虑多站点支持.<br>在尽量保留原有主题功能的同时采用模块化设计支持多个widgets.实现高度自定义,通过widgets你可以添加许多实用功能.<br>可以自定义组合各种组件,像评论系统,统计系统等.</p>
<ul>
<li>支持多站点共用同一主题,免切换</li>
<li>支持单独启用或禁用小工具(像侧边栏之类的)</li>
<li>支持单独启用或禁用评论</li>
<li>支持自动设置目录(source_dir,public_dir,scaffolds)</li>
<li>可以单独指定加载小工具</li>
<li>支持多个分类，支持子分类</li>
<li>独特的用户配置文件(自动加载<code>$SOURCE\_$THEME.yml</code>[默认就是<strong>source\_chenall.yml</strong>]作为主题的配置文件,这样可以避免升级主题或其它原因导致的配置文件丢失).</li>
<li><code>iLink</code> 文章内链功能</li>
<li><code>ijs</code> 文章内嵌脚本或能</li>
<li>允许在head或body的前面或尾部附加自定义内容.(相对1.0版改变,新版只使用<code>source/_modules</code>目录).</li>
<li>独立脚本插件扩展(source_dir/_scripts目录里面的js文件会自动加载,效果和scripts目录里面一样)</li>
</ul>
]]></summary>
    
      <category term="hexo" scheme="http://chenall.net/tags/hexo/"/>
    
      <category term="主题" scheme="http://chenall.net/tags/%E4%B8%BB%E9%A2%98/"/>
    
      <category term="模块化" scheme="http://chenall.net/tags/%E6%A8%A1%E5%9D%97%E5%8C%96/"/>
    
      <category term="内链" scheme="http://chenall.net/tags/%E5%86%85%E9%93%BE/"/>
    
      <category term="个人日记" scheme="http://chenall.net/categories/%E4%B8%AA%E4%BA%BA%E6%97%A5%E8%AE%B0/"/>
    
      <category term="程序设计" scheme="http://chenall.net/categories/%E7%A8%8B%E5%BA%8F%E8%AE%BE%E8%AE%A1/"/>
    
      <category term="Node.js" scheme="http://chenall.net/categories/%E7%A8%8B%E5%BA%8F%E8%AE%BE%E8%AE%A1/Node-js/"/>
    
      <category term="程序设计" scheme="http://chenall.net/categories/%E7%A8%8B%E5%BA%8F%E8%AE%BE%E8%AE%A1/"/>
    
      <category term="html" scheme="http://chenall.net/categories/%E7%A8%8B%E5%BA%8F%E8%AE%BE%E8%AE%A1/html/"/>
    
  </entry>
  
  <entry>
    <title><![CDATA[博客转移到hexo]]></title>
    <link href="http://chenall.net/post/blog_to_hexo/"/>
    <id>http://chenall.net/post/blog_to_hexo/</id>
    <published>2014-01-26T15:50:48.000Z</published>
    <updated>2014-03-30T10:05:06.000Z</updated>
    <content type="html"><![CDATA[<p>经过一段时间的处理转换,大量的手工活,总体来说搬家还是挺顺利,整个转换过程使用了差不多1个月的时间.终算把博客搬到<a href="http://zespia.tw/hexo" title="A fast, simple &amp; powerful blog framework, powered by Node.js." target="_blank" rel="external">hexo</a>上了.</p>
<p>前段时间在尝试静态博客<!--[iLink[slug:jekyll_or_hexo]iLink]-->,之后决定使用<a href="http://zespia.tw/hexo" title="A fast, simple &amp; powerful blog framework, powered by Node.js." target="_blank" rel="external">hexo</a>,然后就是一系列的折腾再折腾.设计完善本主题,对hexo进行改进(大部份改进已经并入到官方主源码分支).</p>
<p>在这期间,学习到了很多新的知识.</p>
<ul>
<li>首次接触CSS/HTML</li>
<li>首次接触<a href="http://nodejs.org/" target="_blank" rel="external">Node.js</a></li>
<li>首次使用用<a href="https://github.com/" target="_blank" rel="external">github</a>的Pull Request功能.</li>
<li>首次自己设计主页界面.</li>
<li>还有很多很多.</li>
</ul>
<p><a href="https://github.com/chenall/hexo-theme-chenall" target="_blank" rel="external">本主题</a>是自己设计的高度模块化hexo主题.加入了很多独特的功能,也是我学习过程中的经验累积.</p>
<p>目前暂时没有发现什么太大的问题.以后还会慢慢完善<br>有兴趣你也可以试试,^_^,有什么疑问可以在本站留言</p>
<p>对于本主题有问题如果你有 <a href="https://github.com/" target="_blank" rel="external">github</a> 帐号的话还是使用 <a href="https://github.com/chenall/hexo-theme-chenall/issues" target="_blank" rel="external"><strong>issue</strong></a>会比较好.</p>
]]></content>
    
    
      <category term="hexo" scheme="http://chenall.net/tags/hexo/"/>
    
      <category term="博客" scheme="http://chenall.net/tags/%E5%8D%9A%E5%AE%A2/"/>
    
      <category term="转移" scheme="http://chenall.net/tags/%E8%BD%AC%E7%A7%BB/"/>
    
      <category term="个人日记" scheme="http://chenall.net/categories/%E4%B8%AA%E4%BA%BA%E6%97%A5%E8%AE%B0/"/>
    
  </entry>
  
  <entry>
    <title><![CDATA[[原创] pretty自动加载语言代码]]></title>
    <link href="http://chenall.net/post/pretty_auto/"/>
    <id>http://chenall.net/post/pretty_auto/</id>
    <published>2014-01-20T09:00:00.000Z</published>
    <updated>2014-02-26T11:52:59.000Z</updated>
    <content type="html"><![CDATA[<p>pretty是一个Javascript模块和CSS文件，可以实现文章中代码的高亮显示.<br>在网上找到的使用方法都是差不多的,</p>
<p>首先就是加载css和js文件<br><a id="more"></a></p>
<pre><code class="html">&lt;script src=&quot;https://google-code-prettify.googlecode.com/svn/loader/prettify.js&quot;&gt;&lt;/script&gt;
&lt;script src=&quot;https://google-code-prettify.googlecode.com/svn/loader/prettify.css&quot;&gt;&lt;/script&gt;
</code></pre>
<p>然后在文章尾部添加代码实现自动高亮显示</p>
<pre><code class="html">&lt;script type=&quot;text/javascript&quot;&gt;
$(window).load(function(){
     $(&quot;pre&quot;).addClass(&quot;prettyprint&quot;);
     prettyPrint();
})
&lt;script type=&quot;text/javascript&quot;&gt;
</code></pre>
<p>或使用run_prettify来自动加载</p>
<pre><code class="html">&lt;script src=&quot;https://google-code-prettify.googlecode.com/svn/loader/run_prettify.js?lang=css&amp;skin=sunburst&quot;&gt;&lt;/script&gt;
</code></pre>
<p>但是上面都是有缺点的:</p>
<ul>
<li>第一种方法,虽然也可以高亮显示,但看起来并不美观,因为还需要额外加载对应语言的js文件(像lang-html.js).</li>
<li>第二种方法,是自动加载了,不过它依赖google-code-prettify.googlecode.com上的代码文件,由于众所周知的原因,这个是经常不能正常访问的.并且由于run_prettify把加载代码的路径写死了,只能加载google-code上的代码.如果使用CDN的话它还是要加载google-code上的.不方便.</li>
</ul>
<p>所以这里就给一个变通的方法,实现了根据需要自动加载对应语言的通用JS代码.不受路径限制,自动获取prettify文件的路径,自动加载需要的代码高亮文件.<br>需要jquery的支持.</p>
<pre><code class="html">&lt;script type=&quot;text/javascript&quot;&gt;
   var lang=[];
   var pretty_base=&#39;&#39;;
   $(&#39;script&#39;).each(function(){
    var c = $(this).attr(&#39;src&#39;);
    if (!c)
        return;
    if (c.match(/(\/)?prettify(\.min)?\.js/i))
    {
        var index = c.lastIndexOf(&#39;/&#39;);
        if (index != -1)
        pretty_base = c.substr(0,index + 1);
        return false;
    }
   })
   $(&#39;pre code&#39;).each(function(){
    var c = $(this).attr(&#39;class&#39;)
    if (!c)
        return;
    c = c.match(/\s?(lang\-\w+)/i);
    if (c &amp;&amp; lang.indexOf(c[1]) == -1)
    {
        lang.push(c[1]);
        $.getScript(pretty_base + c[1] + &#39;.min.js&#39;);
    }
   })

    $(window).load(function(){
       $(&quot;pre&quot;).addClass(&quot;prettyprint&quot;);
       prettyPrint();
    })
&lt;/script&gt;
</code></pre>
]]></content>
    <summary type="html"><![CDATA[<p>pretty是一个Javascript模块和CSS文件，可以实现文章中代码的高亮显示.<br>在网上找到的使用方法都是差不多的,</p>
<p>首先就是加载css和js文件<br>]]></summary>
    
      <category term="pretty" scheme="http://chenall.net/tags/pretty/"/>
    
      <category term="原创" scheme="http://chenall.net/tags/%E5%8E%9F%E5%88%9B/"/>
    
      <category term="代码" scheme="http://chenall.net/tags/%E4%BB%A3%E7%A0%81/"/>
    
      <category term="程序设计" scheme="http://chenall.net/categories/%E7%A8%8B%E5%BA%8F%E8%AE%BE%E8%AE%A1/"/>
    
      <category term="html" scheme="http://chenall.net/categories/%E7%A8%8B%E5%BA%8F%E8%AE%BE%E8%AE%A1/html/"/>
    
  </entry>
  
  <entry>
    <title><![CDATA[[推荐] 免费的云计算Koding]]></title>
    <link href="http://chenall.net/post/koging/"/>
    <id>http://chenall.net/post/koging/</id>
    <published>2014-01-18T02:10:19.000Z</published>
    <updated>2014-02-26T11:52:59.000Z</updated>
    <content type="html"><![CDATA[<p>Koding其实是就一个免费的VPS(只是没有独立IP),使用了LINUX UBUNTU操作系统.</p>
<p>支持一键安装各种程序,像WORDPRESS之类的,很简单.</p>
<p>支持在线编写代码,编译等..支持主流环境PHP,PYTHON,PERL,RUBY</p>
<p>例子: <a href="http://chenall.kd.io/" target="_blank" rel="external">http://chenall.kd.io/</a></p>
<p>以上是建站的功能，上说说过了它是一个linux虚拟机，可以进入linux命令行，使用一些linux的功能．</p>
<p>你完全可以用这个熟悉下linux的操作，还有更多功能等着你自己去发现．</p>
<p>全英文的，自己翻译下，不懂可以上Google搜一下．</p>
<p>其它的不多说了(因为国情原因，不能说太多)，懂行的赶紧注册收藏一个吧．</p>
<p>附上注册地址：<a href="https://koding.com/R/chenall" target="_blank" rel="external">Koding注册地址</a></p>
]]></content>
    
    
      <category term="koding" scheme="http://chenall.net/tags/koding/"/>
    
      <category term="云计算" scheme="http://chenall.net/tags/%E4%BA%91%E8%AE%A1%E7%AE%97/"/>
    
      <category term="杂七杂八" scheme="http://chenall.net/categories/%E6%9D%82%E4%B8%83%E6%9D%82%E5%85%AB/"/>
    
  </entry>
  
  <entry>
    <title><![CDATA[[分享] LuaJIT的FFI调用WINDOWS API功能示例]]></title>
    <link href="http://chenall.net/post/luajit_ffi/"/>
    <id>http://chenall.net/post/luajit_ffi/</id>
    <published>2013-12-15T10:12:05.000Z</published>
    <updated>2014-02-26T11:52:59.000Z</updated>
    <content type="html"><![CDATA[<h1 id="关于LuaJIT,以下是官网的介绍-">关于LuaJIT,以下是官网的介绍.</h1>
<p><span style="font-family: Verdana, Arial, Helvetica, sans-serif; font-size: 13px; line-height: 20px;">LuaJIT is a </span><strong>Just-In-Time Compiler</strong><span style="font-family: Verdana, Arial, Helvetica, sans-serif; font-size: 13px; line-height: 20px;"> (JIT) for the </span><a href="http://www.lua.org/" target="_blank" rel="external">Lua</a><span style="font-family: Verdana, Arial, Helvetica, sans-serif; font-size: 13px; line-height: 20px;"> programming language. Lua is a powerful, dynamic and light-weight programming language. It may be embedded or used as a general-purpose, stand-alone language.</span></p>
<p>LuaJIT is Copyright © 2005-2013 Mike Pall, released under the <a href="http://www.opensource.org/licenses/mit-license.php" target="_blank" rel="external">MIT open source license</a>.</p>
<p><span style="font-family: Verdana, Arial, Helvetica, sans-serif; font-size: 13px; line-height: 20px;">LuaJIT对原版LUA进行了一些扩展,功能更强大,实用,速度也更快.本文主要介绍一下</span><span style="font-family: Verdana, Arial, Helvetica, sans-serif; font-size: small;"><span style="line-height: 20px;">FFI扩展功能.</span></span></p>
<p><a id="more"></a><br><span style="font-family: Verdana, Arial, Helvetica, sans-serif; font-size: small;"><span style="line-height: 20px;">FFI库允许调用外部C函数以及使用C数据结构.这意味着我们可以通过它来调用一些系统API或DLL的函数,像调用LIBCURL来实现网络功能.等…</span></span></p>
<p><span style="font-family: Verdana, Arial, Helvetica, sans-serif; font-size: small;"><span style="line-height: 20px;">比如以下来自官网最简单的应用代码</span></span></p>
<pre><code class="lua">--Load the FFI library.
local ffi = require(&quot;ffi&quot;)

--Add a C declaration for the function. The part inside the double-brackets (in green) is just standard C syntax.
ffi.cdef[[
    int printf(const char *fmt, ...);
]]

--Call the named C function — Yes, it&#39;s that simple!
ffi.C.printf(&quot;Hello %s!&quot;, &quot;world&quot;)
</code></pre>
<pre><code class="lua">local ffi = require(&quot;ffi&quot;)
ffi.cdef[[
    int MessageBoxA(void *w, const char *txt, const char *cap, int type);
]]
ffi.C.MessageBoxA(nil, &quot;Hello world!&quot;, &quot;Test&quot;, 0)
</code></pre>
<p>看起来很简单不是吗?</p>
<p>这里给一个稍微复杂一些的例子,这是我在是学习过程中碰到的一些问题的总结,里面包括了一些常用的操作,像ffi.new 创建一个C的类型,ffi.cast数据类型转换,等.有兴趣的可以通过这个例子来学习一下如何应用.少走一些弯路.希望对大家有用.</p>
<p>本代码要保存为ANSI格式才可以正常运行</p>
<pre><code class="lua">local ffi = require(&quot;ffi&quot;)
ffi.cdef[[
    typedef char TCHAR;
    typedef unsigned int UINT;
    typedef TCHAR _LPTSTR;
    typedef const TCHAR *LPCTSTR;
    typedef LPCTSTR LPCSTR;
    typedef UINT WPARAM;
    typedef unsigned long LPARAM;
    typedef UINT HWND;
    typedef struct {
        long x;
        long y;
    } POINT,_PPOINT;
    void* malloc(size_t size);
    void* free(void* memblock);
    bool GetCursorPos(PPOINT lpPoint);
    HWND WindowFromPoint(POINT Point);
    int GetWindowTextA(HWND hWnd, LPTSTR lpString, int nMaxCount);
    bool SetWindowTextA(HWND hWnd, LPCTSTR lpString);
    int SendMessageA(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam);
    int MessageBoxA(HWND hWnd,LPCSTR lpText,LPCSTR lpCaption,UINT uType);
]]
local user32 = ffi.load(&quot;User32.dll&quot;)--WINDOWS API函数所在DLL文件
local win32 = ffi.load(&#39;msvcrt.dll&#39;)--malloc和free函数
local pos=ffi.new(&quot;POINT&quot;);
local oks = user32.GetCursorPos(pos)--获取当前鼠标位置
local IDYES = 6
local IDNO = 7
local WM_SETTEXT = 0x000C
local WM_GETTEXT = 0x000D
if oks then
local hwnd = user32.WindowFromPoint(pos)--获取指定位置下窗体的句柄
local lpString = ffi.new(&quot;char*&quot;,win32.malloc(1024))--分配内存
local test = user32.GetWindowTextA(hwnd,lpString,1023)--获取文本
local str1 = ffi.string(lpString);
local strtest =&quot;FFI 调用SetWindowText功能测试&quot;
local t = user32.MessageBoxA(0,&quot;是否把以下窗体\n&amp;lt;&quot;..str1..&quot;&amp;gt;\n的标题修改为以下内容:\n&quot;..strtest,&quot;LUAJIT FFI 调用WINAPI测试&quot;,0x44)--MB_ICONINFORMATION || 0x00000004L
if t == IDYES then
    if user32.SetWindowTextA(hwnd,strtest) == true then
        user32.MessageBoxA(0,&quot;修改成功&quot;,&quot;测试&quot;,0x40)
    end
end
--[[注: Windows API 的SendMessage就是SendMessageA或SendMessageW
    像MessageBox也是类型的MessageBoxA和MessageBoxW
    本文例子使用了ffi.cast进行了数据类型的转换,如果不想转换可以修改一下SendMessageA的定义改为如下(我最早就是不知道有ffi.cast所以用的修改定义的方法)
    int SendMessageA(HWND hwnd, UINT msg, WPARAM wParam, LPCTSTR lParam);
    就可以直接使用了,例:
    user32.SendMessageA(hwnd,WM_SETTEXT,1024,&quot;用SendMessage和WM_SETTEXT功能改写目标字符串&quot;)
    这个SendMessage是WINDOWS一个很重要的API,后面的两个参数很灵活,根据不同的功能需求,可以是这符串/数字或指针,数组之类的.--]]
user32.MessageBoxA(0,&quot;测试使用SendMessage来实现同样的功能&quot;,&quot;测试2&quot;,0x40)
user32.SendMessageA(hwnd,WM_GETTEXT,1024,ffi.cast(&quot;LPARAM&quot;,lpString))--通过ffi.cast功能进行类型转换
user32.MessageBoxA(0,&quot;用SendMessage和WM_GETTEXT功能获取到的窗体标题为\n&quot;..ffi.string(lpString),&quot;测试2&quot;,0x40);
user32.SendMessageA(hwnd,WM_SETTEXT,1024,ffi.cast(&quot;LPARAM&quot;,&quot;用SendMessage和WM_SETTEXT功能改写目标字符串&quot;))
user32.MessageBoxA(0,&quot;目标标题已改变&quot;,&quot;测式2&quot;,0x40)
win32.free(lpString)--释放内存
end
</code></pre>
]]></content>
    <summary type="html"><![CDATA[<h1 id="关于LuaJIT,以下是官网的介绍-">关于LuaJIT,以下是官网的介绍.</h1>
<p><span style="font-family: Verdana, Arial, Helvetica, sans-serif; font-size: 13px; line-height: 20px;">LuaJIT is a </span><strong>Just-In-Time Compiler</strong><span style="font-family: Verdana, Arial, Helvetica, sans-serif; font-size: 13px; line-height: 20px;"> (JIT) for the </span><a href="http://www.lua.org/" target="_blank" rel="external">Lua</a><span style="font-family: Verdana, Arial, Helvetica, sans-serif; font-size: 13px; line-height: 20px;"> programming language. Lua is a powerful, dynamic and light-weight programming language. It may be embedded or used as a general-purpose, stand-alone language.</span></p>
<p>LuaJIT is Copyright © 2005-2013 Mike Pall, released under the <a href="http://www.opensource.org/licenses/mit-license.php" target="_blank" rel="external">MIT open source license</a>.</p>
<p><span style="font-family: Verdana, Arial, Helvetica, sans-serif; font-size: 13px; line-height: 20px;">LuaJIT对原版LUA进行了一些扩展,功能更强大,实用,速度也更快.本文主要介绍一下</span><span style="font-family: Verdana, Arial, Helvetica, sans-serif; font-size: small;"><span style="line-height: 20px;">FFI扩展功能.</span></span></p>
<p>]]></summary>
    
      <category term="FFI" scheme="http://chenall.net/tags/FFI/"/>
    
      <category term="LUA" scheme="http://chenall.net/tags/LUA/"/>
    
      <category term="WINDOWS" scheme="http://chenall.net/tags/WINDOWS/"/>
    
      <category term="API" scheme="http://chenall.net/tags/API/"/>
    
      <category term="程序设计" scheme="http://chenall.net/categories/%E7%A8%8B%E5%BA%8F%E8%AE%BE%E8%AE%A1/"/>
    
      <category term="LUA" scheme="http://chenall.net/categories/%E7%A8%8B%E5%BA%8F%E8%AE%BE%E8%AE%A1/LUA/"/>
    
  </entry>
  
  <entry>
    <title><![CDATA[[转] Lua简明教程]]></title>
    <link href="http://chenall.net/post/lua_easy/"/>
    <id>http://chenall.net/post/lua_easy/</id>
    <published>2013-12-13T07:07:18.000Z</published>
    <updated>2014-02-26T11:52:59.000Z</updated>
    <content type="html"><![CDATA[<p><strong>本文章作者和出处:  <a href="http://coolshell.cn/" target="_blank" rel="external">酷壳 – CoolShell.cn</a> ，请勿用于任何商业用途</strong></p>
<p>这几天系统地学习了一下<a href="http://www.lua.org/" target="_blank" rel="external">Lua这个脚本语言</a>，Lua脚本是一个很轻量级的脚本，也是号称性能最高的脚本，用在很多需要性能的地方，比如：游戏脚本，nginx，wireshark的脚本，当你把他的源码下下来编译后，你会发现解释器居然不到200k，这是多么地变态啊（/bin/sh都要1M，MacOS平台），而且能和C语言非常好的互动。我很好奇得浏览了一下Lua解释器的源码，这可能是我看过最干净的C的源码了。</p>
<p>我不想写一篇大而全的语言手册，一方面是因为已经有了（见本文后面的链接），重要的原因是，因为大篇幅的文章会挫败人的学习热情，我始终觉得好的文章读起来就像拉大便一样，能一口气很流畅地搞完，才会让人爽（这也是我为什么不想写书的原因）。所以，这必然又是一篇”入厕文章”，还是那句话，我希望本文能够让大家利用上下班，上厕所大便的时间学习一个技术。呵呵。</p>
<p>相信你现在已经在厕所里脱掉裤子露出屁股已经准备好大便了，那就让我们畅快地排泄吧……</p>
<a id="more"></a>

<h3 id="运行">运行</h3>
<p>首先，我们需要知道，Lua是类C的，所以，他是大小写字符敏感的。</p>
<p>下面是Lua的Hello World。注意：Lua脚本的语句的分号是可选的，这个和<a href="http://coolshell.cn/articles/8460.html" title="Go 语言简介（上）— 语法" target="_blank" rel="external">GO语言很类似</a>。</p>
<pre><code>print(&quot;Hello World&quot;)
</code></pre><p>你可以像python一样，在命令行上运行lua命令后进入lua的shell中执行语句。</p>
<pre><code>chenhao-air:lua chenhao$ lua
Lua 5.2.2  Copyright (C) 1994-2013 Lua.org, PUC-Rio
&gt; print(&quot;Hello, World&quot;)
Hello, World
&gt;
</code></pre><p>也可以把脚本存成一个文件，用如下命令行来运行。</p>
<pre><code>&gt;lua file.lua
</code></pre><p>或是像shell一样运行：</p>
<pre><code>chenhao-air:lua chenhao$ cat hello.lua
#!/usr/local/bin/lua
print(&quot;Hello, World&quot;)
chenhao-air:lua chenhao$ chmod +x hello.lua
chenhao-air:test chenhao$ ./hello.lua
Hello, World
</code></pre><h3 id="语法">语法</h3>
<h4 id="注释">注释</h4>
<pre><code class="lua">-- 两个减号是行注释
</code></pre>
<pre><code class="lua">--[[
 这是块注释
 这是块注释
 --]]
</code></pre>
<h4 id="变量">变量</h4>
<p>Lua的数字只有double型，64bits，你不必担心Lua处理浮点数会慢（除非大于100,000,000,000,000），或是会有精度问题。</p>
<p>你可以以如下的方式表示数字，0x开头的16进制和C是很像的。</p>
<pre><code class="lua">num = 1024
num = 3.0
num = 3.1416
num = 314.16e-2
num = 0.31416E1
num = 0xff
num = 0x56
</code></pre>
<p>字符串你可以用单引号，也可以用双引号，还支持C类型的转义，比如： ‘\a’ （响铃）， ‘\b’ （退格）， ‘\f’ （表单）， ‘\n’ （换行）， ‘\r’ （回车）， ‘\t’ （横向制表）， ‘\v’ （纵向制表）， ‘\\‘ （反斜杠）， ‘\“‘ （双引号）， 以及 ‘\“ （单引号)</p>
<p>下面的四种方式定义了完全相同的字符串（其中的两个中括号可以用于定义有换行的字符串）</p>
<pre><code class="lua">a = &#39;alo\n123&quot;&#39;
a = &quot;alo\n123\&quot;&quot;
a = &#39;\97lo\10\04923&quot;&#39;
a = [[alo
123&quot;]]
</code></pre>
<p>C语言中的NULL在Lua中是nil，比如你访问一个没有声明过的变量，就是nil，比如下面的v的值就是nil</p>
<pre><code class="lua">v = UndefinedVariable
</code></pre>
<p>布尔类型只有nil和false是 false，数字0啊，’’空字符串（’\0’）都是true！</p>
<p>另外，需要注意的是：lua中的变量如果没有特殊说明，全是全局变量，那怕是语句块或是函数里。变量前加local关键字的是局部变量。</p>
<pre><code class="lua">theGlobalVar = 50
local theLocalVar = &quot;local variable&quot;
</code></pre>
<h3 id="控制语句">控制语句</h3>
<p>不多说了，直接看代码吧（注意：Lua没有++或是+=这样的操作）</p>
<h4 id="while循环">while循环</h4>
<pre><code class="lua">sum = 0
num = 1
while num &lt;= 100 do
    sum = sum + num
    num = num + 1
end
print(&quot;sum =&quot;,sum)
</code></pre>
<h4 id="if-else分支">if-else分支</h4>
<pre><code class="lua">if age == 40 and sex ==&quot;Male&quot; then
    print(&quot;男人四十一枝花&quot;)
elseif age &gt; 60 and sex ~=&quot;Female&quot; then
    print(&quot;old man without country!&quot;)
elseif age &lt; 20 then
    io.write(&quot;too young, too naive!\n&quot;)
else
    local age = io.read()
    print(&quot;Your age is &quot;..age)
end
</code></pre>
<p>上面的语句不但展示了if-else语句，也展示了<br>1）<strong>“～=”</strong>是不等于，而不是<strong>!=</strong><br>2）io库的分别从<strong>stdin</strong>和<strong>stdout</strong>读写的<strong>read</strong>和<strong>write</strong>函数<br>3）字符串的拼接操作符<strong>“..”</strong></p>
<p>另外，条件表达式中的与或非为分是：and, or, not关键字。</p>
<h4 id="for_循环">for 循环</h4>
<p>从1加到100</p>
<pre><code class="lua">sum = 0
for i = 1, 100 do
    sum = sum + i
end
</code></pre>
<p>从1到100的奇数和</p>
<pre><code class="lua">sum = 0
for i = 1, 100, 2 do
    sum = sum + i
end
</code></pre>
<p>从100到1的偶数和</p>
<pre><code class="lua">sum = 0
for i = 100, 1, -2 do
    sum = sum + i
end
</code></pre>
<h4 id="until循环">until循环</h4>
<pre><code class="lua">sum = 2
repeat
   sum = sum ^ 2 --幂操作
   print(sum)
until sum &gt;1000
</code></pre>
<h3 id="函数">函数</h3>
<p>Lua的函数和<strong>Javascript</strong>的很像</p>
<h4 id="递归">递归</h4>
<pre><code class="lua">function fib(n)
  if n &lt; 2 then return 1 end
  return fib(n - 2) + fib(n - 1)
end
</code></pre>
<h4 id="闭包">闭包</h4>
<p>同样，Javascript附体！</p>
<pre><code class="lua">function newCounter()
    local i = 0
    return function()     -- anonymous function
       i = i + 1
        return i
    end
end

c1 = newCounter()
print(c1())  --&gt; 1
print(c1())  --&gt; 2
</code></pre>
<p>示例二</p>
<pre><code class="lua">function myPower(x)
    return function(y) return y^x end
end

power2 = myPower(2)
power3 = myPower(3)

print(power2(4)) --4的2次方
print(power3(5)) --5的3次方
</code></pre>
<h4 id="函数的返回值">函数的返回值</h4>
<p>和<a href="http://coolshell.cn/articles/8460.html" title="Go 语言简介（上）— 语法" target="_blank" rel="external">Go语言一样</a>，可以一条语句上赋多个值，如：</p>
<pre><code class="lua">name, age, bGay = &quot;haoel&quot;, 37, false, &quot;haoel@hotmail.com&quot;
</code></pre>
<p>上面的代码中，因为只有3个变量，所以第四个值被丢弃。</p>
<p>函数也可以返回多个值：</p>
<pre><code class="lua">function getUserInfo(id)
    print(id)
    return &quot;haoel&quot;, 37, &quot;haoel@hotmail.com&quot;, &quot;http://coolshell.cn&quot;
end

name, age, email, website, bGay = getUserInfo()
</code></pre>
<p>注意：上面的示例中，因为没有传id，所以函数中的id输出为nil，因为没有返回bGay，所以bGay也是nil。</p>
<h4 id="局部函数">局部函数</h4>
<p>函数前面加上local就是局部函数，其实，Lua中的函数和<strong>Javascript</strong>中的一个德行。</p>
<p>比如：下面的两个函数是一样的：</p>
<pre><code class="lua">function foo(x) return x^2 end
foo = function(x) return x^2 end
</code></pre>
<h3 id="Table">Table</h3>
<p>所谓Table其实就是一个Key Value的数据结构，它很像Javascript中的Object，或是PHP中的数组，在别的语言里叫Dict或Map，Table长成这个样子：</p>
<pre><code class="lua">haoel = {name=&quot;ChenHao&quot;, age=37, handsome=True}
</code></pre>
<p>下面是table的CRUD操作：</p>
<pre><code class="lua">haoel.website=&quot;http://coolshell.cn/&quot;
local age = haoel.age
haoel.handsome = false
haoel.name=nil
</code></pre>
<p>上面看上去像C/C++中的结构体，但是name,age, handsome, website都是key。你还可以像下面这样写义Table：</p>
<pre><code class="lua">t = {[20]=100, [&#39;name&#39;]=&quot;ChenHao&quot;, [3.14]=&quot;PI&quot;}
</code></pre>
<p>这样就更像Key Value了。于是你可以这样访问：t[20]，t[“name”], t[3.14]。</p>
<p>我们再来看看数组：</p>
<pre><code class="lua">arr = {10,20,30,40,50}
</code></pre>
<p>这样看上去就像数组了。但其实其等价于：</p>
<pre><code class="lua">arr = {[1]=10, [2]=20, [3]=30, [4]=40, [5]=50}
</code></pre>
<p>所以，你也可以定义成不同的类型的数组，比如：</p>
<pre><code class="lua">arr = {&quot;string&quot;, 100, &quot;haoel&quot;, function() print(&quot;coolshell.cn&quot;) end}
</code></pre>
<p>注：其中的函数可以这样调用：arr<a href="">4</a>。</p>
<p>我们可以看到Lua的下标不是从0开始的，是从1开始的。</p>
<pre><code class="lua">for i=1, #arr do
    print(arr[i])
end
</code></pre>
<p>注：上面的程序中：#arr的意思就是arr的长度。</p>
<p>注：前面说过，Lua中的变量，如果没有local关键字，全都是全局变量，Lua也是用Table来管理全局变量的，Lua把这些全局变量放在了一个叫”_G”的Table里。</p>
<p>我们可以用如下的方式来访问一个全局变量（假设我们这个全局变量名叫globalVar）：</p>
<pre><code class="lua">_G.globalVar
_G[&quot;globalVar&quot;]
</code></pre>
<p>我们可以通过下面的方式来遍历一个Table。</p>
<pre><code class="lua">for k, v in pairs(t) do
    print(k, v)
end
</code></pre>
<h3 id="MetaTable_和_MetaMethod">MetaTable 和 MetaMethod</h3>
<p>MetaTable和MetaMethod是Lua中的重要的语法，MetaTable主要是用来做一些类似于C++重载操作符式的功能。</p>
<p>比如，我们有两个分数：</p>
<pre><code class="lua">fraction_a = {numerator=2, denominator=3}
fraction_b = {numerator=4, denominator=7}
</code></pre>
<p>我们想实现分数间的相加：2/3 + 4/7，我们如果要执行： fraction_a + fraction_b，会报错的。</p>
<p>所以，我们可以动用MetaTable，如下所示：</p>
<pre><code class="lua">fraction_op={}
function fraction_op.__add(f1, f2)
    ret = {}
    ret.numerator = f1.numerator * f2.denominator + f2.numerator * f1.denominator
    ret.denominator = f1.denominator * f2.denominator
    return ret
end
</code></pre>
<p>为之前定义的两个table设置MetaTable：（其中的setmetatble是库函数）</p>
<pre><code class="lua">setmetatable(fraction_a, fraction_op)
setmetatable(fraction_b, fraction_op)
</code></pre>
<p>于是你就可以这样干了：（调用的是fraction_op.__add()函数）</p>
<pre><code class="lua">fraction_s = fraction_a + fraction_b
</code></pre>
<p>至于__add这是MetaMethod，这是Lua内建约定的，其它的还有如下的MetaMethod：</p>
<pre><code>__add(a, b)                     对应表达式 a + b
__sub(a, b)                     对应表达式 a - b
__mul(a, b)                     对应表达式 a * b
__div(a, b)                     对应表达式 a / b
__mod(a, b)                     对应表达式 a % b
__pow(a, b)                     对应表达式 a ^ b
__unm(a)                        对应表达式 -a
__concat(a, b)                  对应表达式 a .. b
__len(a)                        对应表达式 #a
__eq(a, b)                      对应表达式 a == b
__lt(a, b)                      对应表达式 a &lt; b
__le(a, b)                      对应表达式 a &lt;= b
__index(a, b)                   对应表达式 a.b
__newindex(a, b, c)             对应表达式 a.b = c
__call(a, ...)                  对应表达式 a(...)
</code></pre><h3 id="“面向对象”">“面向对象”</h3>
<p>上面我们看到有__index这个重载，这个东西主要是重载了find key的操作。这操作可以让Lua变得有点面向对象的感觉，让其有点像Javascript的prototype。（关于Javascrip的面向对象，你可以参看我之前写的<a href="http://coolshell.cn/articles/6441.html" title="Javascript 面向对象编程" target="_blank" rel="external">Javascript的面向对象</a>）</p>
<p>所谓__index，说得明确一点，如果我们有两个对象a和b，我们想让b作为a的prototype只需要：</p>
<pre><code class="lua">setmetatable(a, {__index = b})
</code></pre>
<p>例如下面的示例：你可以用一个Window_Prototype的模板加上__index的MetaMethod来创建另一个实例：</p>
<pre><code class="lua">Window_Prototype = {x=0, y=0, width=100, height=100}
MyWin = {title=&quot;Hello&quot;}
setmetatable(MyWin, {__index = Window_Prototype})
</code></pre>
<p>于是：MyWin中就可以访问x, y, width, height的东东了。（注：当表要索引一个值时如table[key], Lua会首先在table本身中查找key的值, 如果没有并且这个table存在一个带有<strong>index属性的Metatable, 则Lua会按照</strong>index所定义的函数逻辑查找）</p>
<p>有了以上的基础，我们可以来说说所谓的Lua的面向对象。</p>
<pre><code class="lua">Person={}

function Person:new(p)
    local obj = p
    if (obj == nil) then
        obj = {name=&quot;ChenHao&quot;, age=37, handsome=true}
    end
    self.__index = self
    return setmetatable(obj, self)
end

function Person:toString()
    return self.name ..&quot; : &quot;.. self.age ..&quot; : &quot;.. (self.handsome and &quot;handsome&quot; or &quot;ugly&quot;)
end
</code></pre>
<p>上面我们可以看到有一个new方法和一个toString的方法。其中：</p>
<p>1）self 就是 Person，Person:new(p)，相当于Person.new(self, p)<br>2）new方法的self.__index = self 的意图是怕self被扩展后改写，所以，让其保持原样<br>3）setmetatable这个函数返回的是第一个参数的值。</p>
<p>于是：我们可以这样调用：</p>
<pre><code class="lua">me = Person:new()
print(me:toString())

kf = Person:new{name=&quot;King&#39;s fucking&quot;, age=70, handsome=false}
print(kf:toString())
</code></pre>
<p>继承如下，我就不多说了，Lua和Javascript很相似，都是在Prototype的实例上改过来改过去的。</p>
<pre><code class="lua">Student = Person:new()

function Student:new()
    newObj = {year = 2013}
    self.__index = self
    return setmetatable(newObj, self)
end

function Student:toString()
    return &quot;Student : &quot;.. self.year..&quot; : &quot; .. self.name
end
</code></pre>
<h3 id="模块">模块</h3>
<p>我们可以直接使用require(“model_name”)来载入别的lua文件，文件的后缀是.lua。载入的时候就直接执行那个文件了。比如：</p>
<p>我们有一个hello.lua的文件：</p>
<pre><code class="lua">print(&quot;Hello, World!&quot;)
</code></pre>
<p>如果我们：require(“hello”)，那么就直接输出Hello, World！了。</p>
<p>注意：<br>1）require函数，载入同样的lua文件时，只有第一次的时候会去执行，后面的相同的都不执行了。<br>2）如果你要让每一次文件都会执行的话，你可以使用dofile(“hello”)函数<br>3）如果你要玩载入后不执行，等你需要的时候执行时，你可以使用 loadfile()函数，如下所示：</p>
<pre><code class="lua">local hello = loadfile(&quot;hello&quot;)
... ...
... ...
hello()
</code></pre>
<p>loadfile(“hello”)后，文件并不执行，我们把文件赋给一个变量hello，当hello()时，才真的执行。（我们多希望JavaScript也有这样的功能（参看《<a href="http://coolshell.cn/articles/9749.html" title="Javascript 装载和执行" target="_blank" rel="external">Javascript 装载和执行</a>》））</p>
<p>当然，更为标准的玩法如下所示。</p>
<p>假设我们有一个文件叫mymod.lua，内容如下：</p>
<pre><code class="lua">local HaosModel = {}

local function getname()
    return &quot;Hao Chen&quot;
end

function HaosModel.Greeting()
    print(&quot;Hello, My name is &quot;..getname())
end

return HaosModel
</code></pre>
<p>于是我们可以这样使用：</p>
<pre><code class="lua">local hao_model = require(&quot;mymod&quot;)
hao_model.Greeting()
</code></pre>
<p>其实，require干的事就如下：（所以你知道为什么我们的模块文件要写成那样了）</p>
<pre><code class="lua">local hao_model = (function ()
  --mymod.lua文件的内容--
end)()
</code></pre>
<h3 id="参考">参考</h3>
<p>我估计你差不多到擦屁股的时间了，所以，如果你还比较喜欢Lua的话，下面是几个在线文章你可以继续学习之：</p>
<ul>
<li><a href="http://manual.luaer.cn/" target="_blank" rel="external">manual.luaer.cn</a> lua在线手册</li>
<li><a href="http://book.luaer.cn/" target="_blank" rel="external">book.luaer.cn</a> lua在线lua学习教程</li>
<li><a href="http://www.codingnow.com/2000/download/lua_manual.html" target="_blank" rel="external">lua参考手册</a>Lua参考手册的中文翻译（云风翻译版本）</li>
</ul>
<p>关于Lua的标库，你可以看看官方文档：<a href="http://lua-users.org/wiki/StringLibraryTutorial" target="_blank" rel="external">string</a>，  <a href="http://lua-users.org/wiki/TableLibraryTutorial" target="_blank" rel="external">table</a>， <a href="http://lua-users.org/wiki/MathLibraryTutorial" target="_blank" rel="external">math</a>， <a href="http://lua-users.org/wiki/IoLibraryTutorial" target="_blank" rel="external">io</a>， <a href="http://lua-users.org/wiki/OsLibraryTutorial" target="_blank" rel="external">os</a>。</p>
<p><strong>本文章作者和出处:  <a href="http://coolshell.cn/" target="_blank" rel="external">酷壳 – CoolShell.cn</a> ，请勿用于任何商业用途</strong></p>
]]></content>
    <summary type="html"><![CDATA[<p><strong>本文章作者和出处:  <a href="http://coolshell.cn/" target="_blank" rel="external">酷壳 – CoolShell.cn</a> ，请勿用于任何商业用途</strong></p>
<p>这几天系统地学习了一下<a href="http://www.lua.org/" target="_blank" rel="external">Lua这个脚本语言</a>，Lua脚本是一个很轻量级的脚本，也是号称性能最高的脚本，用在很多需要性能的地方，比如：游戏脚本，nginx，wireshark的脚本，当你把他的源码下下来编译后，你会发现解释器居然不到200k，这是多么地变态啊（/bin/sh都要1M，MacOS平台），而且能和C语言非常好的互动。我很好奇得浏览了一下Lua解释器的源码，这可能是我看过最干净的C的源码了。</p>
<p>我不想写一篇大而全的语言手册，一方面是因为已经有了（见本文后面的链接），重要的原因是，因为大篇幅的文章会挫败人的学习热情，我始终觉得好的文章读起来就像拉大便一样，能一口气很流畅地搞完，才会让人爽（这也是我为什么不想写书的原因）。所以，这必然又是一篇”入厕文章”，还是那句话，我希望本文能够让大家利用上下班，上厕所大便的时间学习一个技术。呵呵。</p>
<p>相信你现在已经在厕所里脱掉裤子露出屁股已经准备好大便了，那就让我们畅快地排泄吧……</p>
]]></summary>
    
      <category term="LUA" scheme="http://chenall.net/tags/LUA/"/>
    
      <category term="转载" scheme="http://chenall.net/tags/%E8%BD%AC%E8%BD%BD/"/>
    
      <category term="程序设计" scheme="http://chenall.net/categories/%E7%A8%8B%E5%BA%8F%E8%AE%BE%E8%AE%A1/"/>
    
      <category term="LUA" scheme="http://chenall.net/categories/%E7%A8%8B%E5%BA%8F%E8%AE%BE%E8%AE%A1/LUA/"/>
    
      <category term="转载文章" scheme="http://chenall.net/categories/%E8%BD%AC%E8%BD%BD%E6%96%87%E7%AB%A0/"/>
    
  </entry>
  
  <entry>
    <title><![CDATA[静态搏客 jekyll & Hexo]]></title>
    <link href="http://chenall.net/post/jekyll_or_hexo/"/>
    <id>http://chenall.net/post/jekyll_or_hexo/</id>
    <published>2013-10-30T13:41:00.000Z</published>
    <updated>2014-02-26T11:52:59.000Z</updated>
    <content type="html"><![CDATA[<p>Hexo 和 <em>jekyll</em> 都是简单的免费的Blog生成工具，只生成静态网页，不需要数据库支持，评论可以使用第三方服务像Disqus还有国内的多说。特别是由于github直接支持<em>jekyll</em>很多人已经使用<em>jekyll</em>写搏客了。</p>
<p>我看了一下觉得真的很不错，真是太适合像我这样的懒人了，直接使用MarkDown语法写博客，使用一些简单的标记就可以实现一些排版等。</p>
<p>比如 <a href="http://www.yonsm.net" target="_blank" rel="external">Yonsm</a> 这个就是使用<em>jekyll</em>的，我也打算使用<em>jekyll</em>来写搏客，不过由于对这个还不太熟悉所以就先了解下情况，后来又发现了Hexo，它使用node.js 速度更快，不知用哪个好，所以就两个都试了。</p>
<p>首先就是测试平台的搭建，想要在Windows上搭建还是有些麻烦的，虽然网上有很多教程，但是你一步一步下来还是会发现许多问题，我就碰到了好几个问题（主要还是程序版本问题嘿）。</p>
<p>像Python要用2.x的，pygments插件要用0.5.0的。</p>
<p>还有中文编码问题 </p>
<p><code>... invalid byte sequence in GBK ..</code></p>
<p>在网上找了一下，大多是说要修改<em>jekyll</em>程序的文件，本来我也想改，不过看了一下发现原来新版的已经不需要这样修改了</p>
<p>直接在配置文件_config.yam中添加一行’encoding: UTF-8’就行了。</p>
<p>经过各种折腾总算把测试平台建好了，我比较喜欢绿色化，所以顺便绿色化了一下，有需要的可以留言，我再上传（7z压缩后100MB左右，解压后400MB左右python27+ruyb193+nodejs+svn+git+XXX需要的基本都有了）</p>
<p>再来说下经过我试用后的比较，个人比较喜欢Hexo，因为它的功能还有扩展性都比较强，速度也快。</p>
<p><em>jekyll</em> 更新比较快，调试信息比较清楚，而且Github原生支持，只是产生的速度慢一些。</p>
<p>另外<em>jekyll</em> 受限于<em>Liquid</em>语法对于修改模板来说真的很不方便，如果可以用其它语法就好了，当然如果你不需要修改模板就没有什么问题了。</p>
<p>分别用<em>jekyll</em>和<em>Hexo</em>生成了两个网站，有兴趣可以去观赏下。</p>
<p><em>jekyll</em> 托管在<em>github</em>上(作为ALMRUN程序的主页)  <a href="http://almrun.chenall.net" target="_blank" rel="external">http://almrun.chenall.net</a></p>
<p>hexo 托管在BAE上  <a href="http://hexo.chenall.net" target="_blank" rel="external">http://hexo.chenall.net</a></p>
<p>2014-01-10 经过测试比较后,最后我决定采用<a href="https://github.com/tommy351/hexo" target="_blank" rel="external">Hexo</a></p>
]]></content>
    
    
      <category term="github" scheme="http://chenall.net/tags/github/"/>
    
      <category term="hexo" scheme="http://chenall.net/tags/hexo/"/>
    
      <category term="jekyll" scheme="http://chenall.net/tags/jekyll/"/>
    
      <category term="静态搏客" scheme="http://chenall.net/tags/%E9%9D%99%E6%80%81%E6%90%8F%E5%AE%A2/"/>
    
      <category term="个人日记" scheme="http://chenall.net/categories/%E4%B8%AA%E4%BA%BA%E6%97%A5%E8%AE%B0/"/>
    
  </entry>
  
  <entry>
    <title><![CDATA[[分享] 手贱再次入手一个便宜的VPS $9.99/年]]></title>
    <link href="http://chenall.net/post/bandwagonhost/"/>
    <id>http://chenall.net/post/bandwagonhost/</id>
    <published>2013-08-16T00:50:30.000Z</published>
    <updated>2014-02-26T11:52:59.000Z</updated>
    <content type="html"><![CDATA[<p>主机商采用的是自己的KiwiVM管理面板,Bandwagonhost好像只能PayPal付款，并有一个30天的退款保证.</p>
<p>目前该主机商给LEB读者发布了一个优惠码，只要在付款时在<code>Promotional Code</code>用中输入”LEB”优惠码价格就会变成原价的%50.01.</p>
<p>我入手的这一款配置信息,很实惠有木有啊..月付$1.99,年付$9.99,当然是选择年付了.</p>
<blockquote>
<p>CPU：2 cores<br>内存：512MB<br>vSWAP：512MB<br>硬盘：5 GB<br>月流量：500GB<br>1 IP/KiwiVM  </p>
</blockquote>
<p><a href="http://bandwagonhost.com/aff.php?aff=228&amp;cart.php?a=add&amp;pid=5" target="_blank" rel="external">VPS 5G订购链接</a> 晚了可能就没有了,</p>
<p><a href="http://bandwagonhost.com/aff.php?aff=228" target="_blank" rel="external">前往主机商网站选购</a></p>
<p>由于是在国外的在国内的访问速度肯定没有那么如意,偶尔还会抽风,拿来练手倒是不错,才几十块钱,..</p>
<p>有需要的话可以自己去选购,需要使用PayPal或支持美元的信用卡支付,也可以联系我代购.</p>
<p>其它配置信息,当然了也可以选择季度付款,或半年付款.年付价格都会比较便宜,</p>
<p><a href="http://bandwagonhost.com/aff.php?aff=228&amp;cart.php?a=add&amp;pid=6" target="_blank" rel="external">VPS3G</a>  1CPU/256MB/3G/50G流量 $2.99/月</p>
<p><a href="http://bandwagonhost.com/aff.php?aff=228&amp;cart.php?a=add&amp;pid=7" target="_blank" rel="external">VPS10G</a> 1CPU/512MB/10G/200G $4.99/月或$39.99/年 折后只需要$19.99/年</p>
<p><a href="http://bandwagonhost.com/aff.php?aff=228&amp;cart.php?a=add&amp;pid=8" target="_blank" rel="external">VPS50G</a> 1CPU/1024MB/50G/500G $9.99/月</p>
]]></content>
    
    
      <category term="Bandwagonhost" scheme="http://chenall.net/tags/Bandwagonhost/"/>
    
      <category term="KiwiVM" scheme="http://chenall.net/tags/KiwiVM/"/>
    
      <category term="OpenVZ" scheme="http://chenall.net/tags/OpenVZ/"/>
    
      <category term="vps" scheme="http://chenall.net/tags/vps/"/>
    
      <category term="个人日记" scheme="http://chenall.net/categories/%E4%B8%AA%E4%BA%BA%E6%97%A5%E8%AE%B0/"/>
    
  </entry>
  
  <entry>
    <title><![CDATA[[PHP] 中文转拼音首字母简易实现方案]]></title>
    <link href="http://chenall.net/post/php_gb2312_2_pinyin/"/>
    <id>http://chenall.net/post/php_gb2312_2_pinyin/</id>
    <published>2013-04-20T07:21:35.000Z</published>
    <updated>2014-02-26T11:52:59.000Z</updated>
    <content type="html"><![CDATA[<p>在某些情况下,为了简化查询,我们需要提取中文的拼音首字母,</p>
<p>比如”中华人民共和国” 是ZHRMGHG</p>
<p>最近在<a href="http://chenall.net/post/alrun-merry/" title="[分享] ALMRun–小巧的快速启动工具 " target="_blank" rel="external">ALMRun</a>程序就用到了这个方法,,顺便写了一下PHP版的.感觉PHP的更简单哈,</p>
<p>适用于要求不是很高的场合,因为这个没有处理多音字,只支持GB2312字符,不过优点就是足够简单,几行代码的问题.有需要的可以拿去用,欢迎报错.</p>
<a id="more"></a>

<p>源码: <a href="https://github.com/chenall/chenall/blob/master/php/tools/ZH-cn_TO_pinyin.php" target="_blank" rel="external">https://github.com/chenall/chenall/blob/master/php/tools/ZH-cn_TO_pinyin.php</a></p>
<pre><code>&lt;?php
/*
    中文汉字转拼音首字母的PHP简易实现方法.
    要求: 只能是GB2312码表里面中文字符
    转换得到字符串对应的拼音首字母大写.
    来源: http://chenall.net/
    用法:
    echo zh2py::conv(&#39;Chinese 中华人民共和国&#39;);//Chinese ZHRMGHG
    或
    $py = new zh2py;
    echo $py-&gt;conv(&#39;Chinese 中华人民共和国&#39;);//Chinese ZHRMGHG
*/
class zh2py
{
    //根据汉字区位表,(http://www.mytju.com/classcode/tools/QuWeiMa_FullList.asp)
    //我们可以看到从16-55区之间是按拼音字母排序的,所以我们只需要判断某个汉字的区位码就可以得知它的拼音首字母.
    //区位表第一部份,按拼音字母排序的.
    //16区-55区
    /*
        &#39;A&#39;=&gt;0xB0A1, &#39;B&#39;=&gt;0xB0C5, &#39;C&#39;=&gt;0xB2C1, &#39;D&#39;=&gt;0xB4EE, &#39;E&#39;=&gt;0xB6EA, &#39;F&#39;=&gt;0xB7A2, &#39;G&#39;=&gt;0xB8C1,&#39;H&#39;=&gt;0xB9FE,
    &#39;J&#39;=&gt;0xBBF7, &#39;K&#39;=&gt;0xBFA6, &#39;L&#39;=&gt;0xC0AC, &#39;M&#39;=&gt;0xC2E8, &#39;N&#39;=&gt;0xC4C3, &#39;O&#39;=&gt;0xC5B6, &#39;P&#39;=&gt;0xC5BE,&#39;Q&#39;=&gt;0xC6DA,
    &#39;R&#39;=&gt;0xC8BB, &#39;S&#39;=&gt;0xC8F6, &#39;T&#39;=&gt;0xCBFA, &#39;W&#39;=&gt;0xCDDA, &#39;X&#39;=&gt;0xCEF4, &#39;Y&#39;=&gt;0xD1B9, &#39;Z&#39;=&gt;0xD4D1
    */
    private static $FirstTable = array(
    0xB0C5, 0xB2C1, 0xB4EE, 0xB6EA, 0xB7A2, 0xB8C1, 0xB9FE, 0xBBF7, 0xBFA6, 0xC0AC, 0xC2E8,
    0xC4C3, 0xC5B6, 0xC5BE, 0xC6DA, 0xC8BB, 0xC8F6, 0xCBFA, 0xCDDA, 0xCEF4, 0xD1B9, 0xD4D1,0xD7FA
    );
    private static $FirstLetter = &quot;ABCDEFGHJKLMNOPQRSTWXYZ&quot;;
    //区位表第二部份,不规则的,下面的字母是每个区里面对应字的拼音首字母.从网上查询整理出来的,可能会有部份错误.
    //56区-87区
    private static $SecondTable = array(
        &quot;CJWGNSPGCGNEGYPBTYYZDXYKYGTZJNMJQMBSGZSCYJSYYFPGKBZGYDYWJKGKLJSWKPJQHYJWRDZLSYMRYPYWWCCKZNKYYG&quot;,
        &quot;TTNGJEYKKZYTCJNMCYLQLYPYSFQRPZSLWBTGKJFYXJWZLTBNCXJJJJTXDTTSQZYCDXXHGCKBPHFFSSTYBGMXLPBYLLBHLX&quot;,
        &quot;SMZMYJHSOJNGHDZQYKLGJHSGQZHXQGKXZZWYSCSCJXYEYXADZPMDSSMZJZQJYZCJJFWQJBDZBXGZNZCPWHWXHQKMWFBPBY&quot;,
        &quot;DTJZZKXHYLYGXFPTYJYYZPSZLFCHMQSHGMXXSXJYQDCSBBQBEFSJYHWWGZKPYLQBGLDLCDTNMAYDDKSSNGYCSGXLYZAYPN&quot;,
        &quot;PTSDKDYLHGYMYLCXPYCJNDQJWXQXFYYFJLEJPZRXCCQWQQSBZKYMGPLBMJRQCFLNYMYQMSQYRBCJTHZTQFRXQHXMQJCJLY&quot;,
        &quot;QGJMSHZKBSWYEMYLTXFSYDXWLYCJQXSJNQBSCTYHBFTDCYZDJWYGHQFRXWCKQKXEBPTLPXJZSRMEBWHJLBJSLYYSMDXLCL&quot;,
        &quot;QKXLHXJRZJMFQHXHWYWSBHTRXXGLHQHFNMGYKLDYXZPYLGGSMTCFBAJJZYLJTYANJGBJPLQGSZYQYAXBKYSECJSZNSLYZH&quot;,
        &quot;ZXLZCGHPXZHZNYTDSBCJKDLZAYFFYDLEBBGQYZKXGLDNDNYSKJSHDLYXBCGHXYPKDJMMZNGMMCLGWZSZXZJFZNMLZZTHCS&quot;,
        &quot;YDBDLLSCDDNLKJYKJSYCJLKWHQASDKNHCSGAGHDAASHTCPLCPQYBSZMPJLPCJOQLCDHJJYSPRCHNWJNLHLYYQYYWZPTCZG&quot;,
        &quot;WWMZFFJQQQQYXACLBHKDJXDGMMYDJXZLLSYGXGKJRYWZWYCLZMSSJZLDBYDCFCXYHLXCHYZJQSQQAGMNYXPFRKSSBJLYXY&quot;,
        &quot;SYGLNSCMHCWWMNZJJLXXHCHSYZSTTXRYCYXBYHCSMXJSZNPWGPXXTAYBGAJCXLYXDCCWZOCWKCCSBNHCPDYZNFCYYTYCKX&quot;,
        &quot;KYBSQKKYTQQXFCMCHCYKELZQBSQYJQCCLMTHSYWHMKTLKJLYCXWHEQQHTQKZPQSQSCFYMMDMGBWHWLGSLLYSDLMLXPTHMJ&quot;,
        &quot;HWLJZYHZJXKTXJLHXRSWLWZJCBXMHZQXSDZPSGFCSGLSXYMJSHXPJXWMYQKSMYPLRTHBXFTPMHYXLCHLHLZYLXGSSSSTCL&quot;,
        &quot;SLDCLRPBHZHXYYFHBMGDMYCNQQWLQHJJCYWJZYEJJDHPBLQXTQKWHLCHQXAGTLXLJXMSLJHTZKZJECXJCJNMFBYCSFYWYB&quot;,
        &quot;JZGNYSDZSQYRSLJPCLPWXSDWEJBJCBCNAYTWGMPAPCLYQPCLZXSBNMSGGFNZJJBZSFZYNTXHPLQKZCZWALSBCZJXSYZGWK&quot;,
        &quot;YPSGXFZFCDKHJGXTLQFSGDSLQWZKXTMHSBGZMJZRGLYJBPMLMSXLZJQQHZYJCZYDJWFMJKLDDPMJEGXYHYLXHLQYQHKYCW&quot;,
        &quot;CJMYYXNATJHYCCXZPCQLBZWWYTWBQCMLPMYRJCCCXFPZNZZLJPLXXYZTZLGDLTCKLYRZZGQTTJHHHJLJAXFGFJZSLCFDQZ&quot;,
        &quot;LCLGJDJZSNZLLJPJQDCCLCJXMYZFTSXGCGSBRZXJQQCTZHGYQTJQQLZXJYLYLBCYAMCSTYLPDJBYREGKLZYZHLYSZQLZNW&quot;,
        &quot;CZCLLWJQJJJKDGJZOLBBZPPGLGHTGZXYGHZMYCNQSYCYHBHGXKAMTXYXNBSKYZZGJZLQJTFCJXDYGJQJJPMGWGJJJPKQSB&quot;,
        &quot;GBMMCJSSCLPQPDXCDYYKYPCJDDYYGYWRHJRTGZNYQLDKLJSZZGZQZJGDYKSHPZMTLCPWNJYFYZDJCNMWESCYGLBTZZGMSS&quot;,
        &quot;LLYXYSXXBSJSBBSGGHFJLYPMZJNLYYWDQSHZXTYYWHMCYHYWDBXBTLMSYYYFSXJCBDXXLHJHFSSXZQHFZMZCZTQCXZXRTT&quot;,
        &quot;DJHNRYZQQMTQDMMGNYDXMJGDXCDYZBFFALLZTDLTFXMXQZDNGWQDBDCZJDXBZGSQQDDJCMBKZFFXMKDMDSYYSZCMLJDSYN&quot;,
        &quot;SPRSKMKMPCKLGTBQTFZSWTFGGLYPLLJZHGJJGYPZLTCSMCNBTJBQFKDHBYZGKPBBYMTDSSXTBNPDKLEYCJNYCDYKZTDHQH&quot;,
        &quot;SYZSCTARLLTKZLGECLLKJLQJAQNBDKKGHPJTZQKSECSHALQFMMGJNLYJBBTMLYZXDXJPLDLPCQDHZYCBZSCZBZMSLJFLKR&quot;,
        &quot;ZJSNFRGJHXPDHYJYBZGDLQCSEZGXLBLGYXTWMABCHECMWYJYZLLJJYHLGNDJLSLYGKDZPZXJYYZLWCXSZFGWYYDLYHCLJS&quot;,
        &quot;CMBJHBLYZLYCBLYDPDQYSXQZBYTDKYXJYYCNRJMPDJGKLCLJBCTBJDDBBLBLCZQRPYXJCJLZCSHLTOLJNMDDDLNGKATHQH&quot;,
        &quot;JHYKHEZNMSHRPHQQJCHGMFPRXHJGDYCHGHLYRZQLCYQJNZSQTKQJYMSZSWLCFQQQXYFGGYPTQWLMCRNFKKFSYYLQBMQAMM&quot;,
        &quot;MYXCTPSHCPTXXZZSMPHPSHMCLMLDQFYQXSZYJDJJZZHQPDSZGLSTJBCKBXYQZJSGPSXQZQZRQTBDKYXZKHHGFLBCSMDLDG&quot;,
        &quot;DZDBLZYYCXNNCSYBZBFGLZZXSWMSCCMQNJQSBDQSJTXXMBLTXZCLZSHZCXRQJGJYLXZFJPHYMZQQYDFQJJLZZNZJCDGZYG&quot;,
        &quot;CTXMZYSCTLKPHTXHTLBJXJLXSCDQXCBBTJFQZFSLTJBTKQBXXJJLJCHCZDBZJDCZJDCPRNPQCJPFCZLCLZXZDMXMPHJSGZ&quot;,
        &quot;GSZZQLYLWTJPFSYASMCJBTZYYCWMYTZSJJLJCQLWZMALBXYFBPNLSFHTGJWEJJXXGLLJSTGSHJQLZFKCGNNNSZFDEQFHBS&quot;,
        &quot;AQTGYLBXMMYGSZLDYDQMJJRGBJTKGDHGKBLQKBDMBYLXWCXYTTYBKMRTJZXQJBHLMHMJJZMQASLDCYXYQDLQCAFYWYXQHZ&quot;,
        );
    function utf8_to_gbk($string)//编码转换,必须转换成GB2312字符,这里只是简单的判断并不是很准确,可以自己写一个.
    {
    if (mb_check_encoding($string,&#39;gb2312&#39;))
        return $string;
    if (function_exists(&#39;iconv&#39;))
        return iconv(&quot;utf-8&quot;,&quot;gb2312//IGNORE&quot;,$string);
    return mb_convert_encoding($string,&#39;gb2312&#39;,&#39;utf-8&#39;); 
    }

    function conv($str)
    {
    $str = self::utf8_to_gbk($str);
    $len = strlen($str);
    $newStr = &#39;&#39;;
    for($i=0; $i&lt;$len ; ++$i)
    {
        $H = ord($str[$i]);
        $L = ord($str[$i+1]);
        //字符集非法
        if ($H &lt; 0xB0 ||  $L &lt; 0xA1 || $H &gt; 0xF7 || $L == 0xFF)
        {
        $newStr .= $str[$i];
        continue;
        }
        if ($H &lt; 0xD8)//($H &gt;= 0xB0 &amp;&amp; $H &lt;=0xD7)//查询文字在一级汉字区(16-55)
        {
        $W = ($H &lt;&lt; 8) | $L;
        foreach(self::$FirstTable as $key=&gt;$value)
        {
            if ($W &lt; $value)
            {
            $newStr .= self::$FirstLetter[$key];
            break;
            }
        }
        }
        else// if (H &gt;= 0xD8 &amp;&amp; H &lt;= 0xF7)//查询中文在二级汉字区(56-87)
        $newStr .=self::$SecondTable[$H - 0xD8][$L-0xA1];
        ++$i;
    }
    return $newStr;
    }
}

echo zh2py::conv(&#39;Chinese 中华人民共和国&#39;);//Chinese ZHRMGHG
</code></pre>]]></content>
    <summary type="html"><![CDATA[<p>在某些情况下,为了简化查询,我们需要提取中文的拼音首字母,</p>
<p>比如”中华人民共和国” 是ZHRMGHG</p>
<p>最近在<a href="http://chenall.net/post/alrun-merry/" title="[分享] ALMRun–小巧的快速启动工具 " target="_blank" rel="external">ALMRun</a>程序就用到了这个方法,,顺便写了一下PHP版的.感觉PHP的更简单哈,</p>
<p>适用于要求不是很高的场合,因为这个没有处理多音字,只支持GB2312字符,不过优点就是足够简单,几行代码的问题.有需要的可以拿去用,欢迎报错.</p>
]]></summary>
    
      <category term="php" scheme="http://chenall.net/tags/php/"/>
    
      <category term="拼音" scheme="http://chenall.net/tags/%E6%8B%BC%E9%9F%B3/"/>
    
      <category term="转换" scheme="http://chenall.net/tags/%E8%BD%AC%E6%8D%A2/"/>
    
      <category term="程序设计" scheme="http://chenall.net/categories/%E7%A8%8B%E5%BA%8F%E8%AE%BE%E8%AE%A1/"/>
    
      <category term="PHP" scheme="http://chenall.net/categories/%E7%A8%8B%E5%BA%8F%E8%AE%BE%E8%AE%A1/PHP/"/>
    
  </entry>
  
  <entry>
    <title><![CDATA[[分享] ALMRun–小巧的快速启动工具]]></title>
    <link href="http://chenall.net/post/alrun-merry/"/>
    <id>http://chenall.net/post/alrun-merry/</id>
    <published>2013-03-31T02:32:00.000Z</published>
    <updated>2014-03-31T00:44:38.000Z</updated>
    <content type="html"><![CDATA[<p>ALMRun 修改自<a href="http://code.google.com/p/name5566-merry/" target="_blank" rel="external">Merry</a> 是一个软件便捷启动工具,类似于<a href="https://code.google.com/p/altrun/" target="_blank" rel="external">ALTRUN</a>等软件,功能更强,也是我所经手的第一个VC程序,同样是开源的.感谢原作者<a href="http://name5566.com/" title="ALMRun 的前身Merry作者" target="_blank" rel="external">Name5566</a></p>
<p>之前一直在使用<a href="https://code.google.com/p/altrun/" target="_blank" rel="external">ALTRun</a>,只是这个好久没有更新了,有一些问题无法实现,所以我就在找同类的软件,  </p>
<p>使用过像Launchy,Executor,FindAndRunRobot等软件,但各有各的缺点都不太顺手,直到有一天在GoogleCode上无意中发现了这个软件Merry,看了软件介绍,基本上就是我理想中的样子,很感兴趣就下载来测试了.</p>
<a id="more"></a>

<h1 id="以下文字来源于原版介绍-">以下文字来源于原版介绍.</h1>
<blockquote>
<p>Merry 是一个 Merry 命令执行工具。部分功能相似的软件有 Linux 下的<a href="http://directory.fsf.org/wiki/Gmrun" target="_blank" rel="external">gmrun</a>，Windows 下的<a href="http://www.autohotkey.com/" target="_blank" rel="external">AutoHotkey</a>或<a href="https://code.google.com/p/altrun/" target="_blank" rel="external">ALTRun</a>等，跨平台软件<a href="http://www.launchy.net/" target="_blank" rel="external">Launchy</a>（不过 Merry 和它们在定位上有差别）。</p>
<h3 id="为什么开发_Merry">为什么开发 Merry</h3>
<p>最初使用 Linux 系统非常喜欢 gmrun + openbox 的组合，gmrun 能够弹出一个命令输入窗口，输入程序的名称就可以执行对应的程序，而 openbox 则可以非常方便的进行快捷键的绑定。后来使用 Windows 系统时，一直没有找到类似的替代软件，从而萌发了自己开发一个的想法。简单的制作之后，我开始使用 Merry，经过长时间的使用发现确实带来了很多的便利，致使之后使用没有安装 Merry 的机器时感觉很不习惯，这时候我发现它应该是一个有用的软件，于是有了今天的开源软件 Merry。随着时间的流逝 Merry 已经越来越丰富，而不仅仅只有上述这么简单的功能而已，只要你有想法，Merry 能尽量帮助你实现。</p>
<h3 id="Merry_的目标">Merry 的目标</h3>
<p>在基于窗口的操作系统中，简化一切重复、繁琐的操作并提供一些实用的功能。</p>
<h3 id="Merry_的特点和功能">Merry 的特点和功能</h3>
<ul>
<li>跨平台的支持，让你在所有平台下保持一致的操作方式（目前仅仅实现了 Windows 版本，相信不久之后 Linux 和 MacOS 版就会完成）</li>
<li>可以定义 Merry 命令（快捷键）来完成一些常用的操作，例如：打开目录、启动程序、打开网页等</li>
<li>通过 Merry 命令可以模拟用户的输入，例如：模拟键盘和鼠标输入</li>
<li>通过 Merry 可以轻松的管理窗口，例如：关闭窗口、最大化和还原窗口、移动窗口、隐藏窗口等</li>
<li>通过 Merry 命令可以来进行自动化的操作，例如：打开某应用程序，自动输入用户密码进行登录等</li>
<li>Merry 采用完全开放的体系，可以使用 <a href="http://www.lua.org/" target="_blank" rel="external">Lua</a> 的扩展库或者外部程序来扩展 Merry 的功能</li>
</ul>
</blockquote>
<p>其它介绍请移步下面的网址,我就偷懒不写了.</p>
<p><a href="https://code.google.com/p/name5566-merry/" target="_blank" rel="external">https://code.google.com/p/name5566-merry/</a></p>
<p>由于原版的功能还不是很完善,而我之前也是习惯使用ALTRun的,所以就尝试修改了一下,之前使用ALTRUN的也可以快速转过来.</p>
<p>修改增强版最主要特点(其它的请看软件目录下的<a href="https://github.com/chenall/Merry" target="_blank" rel="external">README.MD</a>)</p>
<ul>
<li>支持调用ALTRUN的命令列表.</li>
<li>支持自动扫描指定目录下指定扩展名的文件,并添加到列表中,并且可以指定子目录级别</li>
<li>简化添加命令方法.</li>
<li>像ALTRUN一样允许按ALT+N直接启动.</li>
<li>选中命令之后可以按Ctrl+D定位程序位置(打开程序文件夹).</li>
<li>支持命令排序功能.</li>
<li>支持拼音首字母识别(当下比较流行的)</li>
<li>新增易于维护的NI格式配置文件.</li>
<li>支持右键发送到或拖放快速添加命令(支持批量添加)</li>
<li>图形化命令管理器.</li>
<li>许多实用性功能改进</li>
</ul>
<p>另外这个也是可以作为WIN+R来使用的,比如你并没有添加services.msc命令,这时输入services.msc列表当然是不会有任何显示的,不过按回车之后还是会执行到services.msc的,并且会自动添加到列表中,以后再输入就可以看到了.同样支持按TAB输入参数</p>
<p>因为我是初次接触VC,对VC不熟,修改过程中遇到问题都是从Google找的答案,程序可能会有一些BUG.</p>
<p>我目前已经使用这个替换了ALTRUN,因为ALTRUN能实现的,这个基本上实现了,没实现了我也会根据需求,尽量去实现.</p>
<p>其它的不多说了,不管我觉得如何,<span style="color: #800000;">适合自己的</span>,<span style="color: #800000;">用得顺手的</span>才是最好的,各有所好.</p>
<p>有兴趣的可以下载测试,有问题或建议同样欢迎反馈…</p>
<p>截图</p>
<p><img src="http://qiniu.chenall.net/img/ALMRunMain.png" alt="软件界面截图" title="软件界面截图"></p>
<p>选定命令之后按TAB键可以添加参数</p>
<p><img src="http://qiniu.chenall.net/img/merry_args.png" alt="直接输入参数" title="可以直接输入参数"></p>
<p>在命令列表按Insert键添加新命令</p>
<p><img src="http://qiniu.chenall.net/img/ALMRun_AddCmd.png" alt="按Insert键添加新命令" title="按Insert键添加新命令"></p>
<p>支持拼音首字母识别,比如:列表中有”宽带连接”,可以输入 “<code>kdlj</code>“<br>这是根据区位表匹配的,比较节省代码,只支持GB2312字符,也没有处理多音字,碰到多音字,一个不行可以换另一个.如果有兴趣帮助我一起开发的可以联系我,或者直接提交补丁文件给我.</p>
<p>主页地址： <a href="http://almrun.chenall.net" target="_blank" rel="external">http://almrun.chenall.net</a><br>更新记录: <a href="http://almrun.chenall.net/update_log.html" target="_blank" rel="external">http://almrun.chenall.net/update_log.html</a><br>修改版源码: <a href="https://github.com/chenall/ALMRun" target="_blank" rel="external">https://github.com/chenall/ALMRun</a><br>更多功能介绍: <a href="http://almrun.chenall.net/" target="_blank" rel="external">http://almrun.chenall.net/</a><br>扩展功能介绍: <a href="https://github.com/chenall/ALMRun/blob/master/doc/config_api.md" target="_blank" rel="external">https://github.com/chenall/ALMRun/blob/master/doc/config_api.md</a>  </p>
<p><strong>注：ALMRun独立主页已经上线，以后请关注<a href="http://almrun.chenall.net" target="_blank" rel="external">ALMRUN主页</a>获取更新。</strong></p>
<p>软件下载:</p>
<ul>
<li><a href="https://github.com/chenall/ALMRun/archive/v1.2.0.57_BIN.zip" target="_blank" rel="external">稳定版下载</a>  </li>
<li><a href="https://github.com/chenall/ALMRun/archive/Build.zip" target="_blank" rel="external">最新编译版本下载</a>  </li>
<li><a href="http://almrun.chenall.net/update_log.html" target="_blank" rel="external">历史版本下载</a>  </li>
</ul>
<p>七牛镜像下载:</p>
<ul>
<li><a href="//githubcdn.qiniudn.com/chenall/ALMRun/archive/v1.2.0.57_BIN.zip">稳定版下载</a></li>
<li><a href="//githubcdn.qiniudn.com/chenall/ALMRun/archive/Build.zip">最新编译版本下载</a></li>
</ul>
]]></content>
    <summary type="html"><![CDATA[<p>ALMRun 修改自<a href="http://code.google.com/p/name5566-merry/" target="_blank" rel="external">Merry</a> 是一个软件便捷启动工具,类似于<a href="https://code.google.com/p/altrun/" target="_blank" rel="external">ALTRUN</a>等软件,功能更强,也是我所经手的第一个VC程序,同样是开源的.感谢原作者<a href="http://name5566.com/" title="ALMRun 的前身Merry作者" target="_blank" rel="external">Name5566</a></p>
<p>之前一直在使用<a href="https://code.google.com/p/altrun/" target="_blank" rel="external">ALTRun</a>,只是这个好久没有更新了,有一些问题无法实现,所以我就在找同类的软件,  </p>
<p>使用过像Launchy,Executor,FindAndRunRobot等软件,但各有各的缺点都不太顺手,直到有一天在GoogleCode上无意中发现了这个软件Merry,看了软件介绍,基本上就是我理想中的样子,很感兴趣就下载来测试了.</p>
]]></summary>
    
      <category term="altrun" scheme="http://chenall.net/tags/altrun/"/>
    
      <category term="merry" scheme="http://chenall.net/tags/merry/"/>
    
      <category term="快速启动" scheme="http://chenall.net/tags/%E5%BF%AB%E9%80%9F%E5%90%AF%E5%8A%A8/"/>
    
      <category term="编程" scheme="http://chenall.net/tags/%E7%BC%96%E7%A8%8B/"/>
    
      <category term="C++" scheme="http://chenall.net/tags/C/"/>
    
      <category term="wxWidgets" scheme="http://chenall.net/tags/wxWidgets/"/>
    
      <category term="程序设计" scheme="http://chenall.net/categories/%E7%A8%8B%E5%BA%8F%E8%AE%BE%E8%AE%A1/"/>
    
      <category term="C++" scheme="http://chenall.net/categories/%E7%A8%8B%E5%BA%8F%E8%AE%BE%E8%AE%A1/C/"/>
    
  </entry>
  
  <entry>
    <title><![CDATA[[学习] LUA脚本学习1]]></title>
    <link href="http://chenall.net/post/lua_base_1/"/>
    <id>http://chenall.net/post/lua_base_1/</id>
    <published>2013-03-27T09:58:18.000Z</published>
    <updated>2014-02-26T11:52:59.000Z</updated>
    <content type="html"><![CDATA[<ol>
<li><p>获取WINDOWS文件的文件名/路径/扩展名<br>例子:</p>
<pre><code class="lua"> file=&quot;c:\\Windows\\notepad.txt&quot;
 FileName = file:match(&quot;([^\\]+)$&quot;) -- notepad.txt
 FilePath = file:sub(1,-FileName:len()-1) -- c:\Windows\
 FileExt = FileName:match(&quot;%.[^%.]*$&quot;) -- .txt
</code></pre>
</li>
<li><p>WINDOWS下环境变量扩展</p>
<p>例子:</p>
<pre><code class="lua">path = &quot;%WinDir%\\Notepad.exe&quot;
path = path:gsub(&quot;%%(%S+)%%&quot;,os.getenv) -- C:\Windows\notepad.exe
</code></pre>
</li>
<li><p>获取CMD命令输出结果</p>
<p>例子:</p>
<pre><code class="lua">local f = io.popen(&#39;dir /b /s&#39;)
print(f:read(&quot;*a&quot;) -- 读取所有内容
</code></pre>
<p>其中read参数可以如下</p>
<ul>
<li>*a 读取所有内容</li>
<li>*n 读取为数据(当输出为数字时用,否则会得到空值)</li>
<li>*l  读取一行 和 f:line() 一样(read不加参数时默认)</li>
<li>数字 读取指定数量的字符. 比如输出 “123456” f:read(3) — “123”</li>
</ul>
<p>使用以下命令可以循环读取每一行.</p>
<pre><code class="lua"> for line in f:lines() do
 print(line)
 end
</code></pre>
<p>f:lines()也可以用f:read(“*l”)<br>或用下面语句读取每4个字节</p>
<pre><code class="lua">for line in f:read(4) do
print(line)
end
</code></pre>
</li>
<li><p>字符串相关操作</p>
<ul>
<li>连接使用”..”<pre><code class="lua">a=&quot;abcd&quot;
b=3456
print(a..b..&quot;test&quot;)  ---- abcd3456test
</code></pre>
</li>
<li>string.len   计算字符串长度<pre><code>a = &quot;test&quot;
a:len()   -- 4 或
string.len(a) -- 4
--也可以直接用 `#`
print(#a) --- 4
</code></pre></li>
<li>string.sub  字符串提取<pre><code>a=&quot;123456&quot;
a:sub(1,3)  或 string.sub(a,1,3)  下同 --- 123
a:sub(-1) -- 6
a:sub(1,-3) -- 1234
</code></pre></li>
<li>相关资料参考: <a href="http://www.lua.org/manual/5.1/manual.html" target="_blank" rel="external">http://www.lua.org/manual/5.1/manual.html</a></li>
</ul>
</li>
</ol>
<p>代码在线调试器: <a href="http://www.lua.org/cgi-bin/demo" target="_blank" rel="external">http://www.lua.org/cgi-bin/demo</a></p>
]]></content>
    
    
      <category term="LUA" scheme="http://chenall.net/tags/LUA/"/>
    
      <category term="学习" scheme="http://chenall.net/tags/%E5%AD%A6%E4%B9%A0/"/>
    
      <category term="程序设计" scheme="http://chenall.net/categories/%E7%A8%8B%E5%BA%8F%E8%AE%BE%E8%AE%A1/"/>
    
      <category term="LUA" scheme="http://chenall.net/categories/%E7%A8%8B%E5%BA%8F%E8%AE%BE%E8%AE%A1/LUA/"/>
    
  </entry>
  
</feed>
