<?xml version="1.0" encoding="utf-8"?>
<feed xmlns="http://www.w3.org/2005/Atom">

  <title><![CDATA[Wang's Blog]]></title>
  <link href="https://existed.github.io/atom.xml" rel="self"/>
  <link href="https://existed.github.io/"/>
  <updated>2017-03-11T21:58:06+08:00</updated>
  <id>https://existed.github.io/</id>
  <author>
    <name><![CDATA[Leon Wang]]></name>
    
  </author>
  <generator uri="http://octopress.org/">Octopress</generator>

  
  <entry>
    <title type="html"><![CDATA[Octopress Tips]]></title>
    <link href="https://existed.github.io/blog/2017/03/11/octopress-tips/"/>
    <updated>2017-03-11T21:18:28+08:00</updated>
    <id>https://existed.github.io/blog/2017/03/11/octopress-tips</id>
    <content type="html"><![CDATA[<a name="L........"></a>
<h3>[参考]</h3>

<ul>
<li> Octopress Documentation: <a href="http://octopress.org/docs/blogging/">Blogging Basics</a></li>
<li> 生命之氢: <a href="http://shengmingzhiqing.com/blog/setup-octopress-with-github-pages.html">Octopress 搭建流程 – Github Pages</a></li>
<li> 程序猎人的博客: <a href="http://programus.github.io/blog/2012/03/07/add-table-data-css-for-octopress/">为Octopress追加数据表格的CSS</a></li>
</ul>

]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[Linux Kernel Source Tree]]></title>
    <link href="https://existed.github.io/blog/2017/03/11/linux-kernel-source-tree/"/>
    <updated>2017-03-11T11:30:02+08:00</updated>
    <id>https://existed.github.io/blog/2017/03/11/linux-kernel-source-tree</id>
    <content type="html"><![CDATA[<p>  内核源码树由很多目录组成，而大多数目录又包含很多子目录。
  源码树根目录极其子目录如下表:</p>

<!-- more -->


<hr />

<table>
<thead>
<tr>
<th style="text-align:right;">目录 </th>
<th style="text-align:center;"> 描述</th>
</tr>
</thead>
<tbody>
<tr>
<td style="text-align:right;">arch/ </td>
<td style="text-align:center;"> 特定体系结构的源码</td>
</tr>
<tr>
<td style="text-align:right;">block/ </td>
<td style="text-align:center;"> 快设备I/O层</td>
</tr>
<tr>
<td style="text-align:right;">crypto/ </td>
<td style="text-align:center;"> 加密API</td>
</tr>
<tr>
<td style="text-align:right;">Documentation/ </td>
<td style="text-align:center;"> 内核源码文档</td>
</tr>
<tr>
<td style="text-align:right;">drivers/ </td>
<td style="text-align:center;"> 设备驱动程序</td>
</tr>
<tr>
<td style="text-align:right;">firmaware/ </td>
<td style="text-align:center;"> 某些驱动程序需要的设备固件</td>
</tr>
<tr>
<td style="text-align:right;">fs/ </td>
<td style="text-align:center;"> VFS和各种文件系统</td>
</tr>
<tr>
<td style="text-align:right;">include/ </td>
<td style="text-align:center;"> 内核头文件</td>
</tr>
<tr>
<td style="text-align:right;">init/ </td>
<td style="text-align:center;"> 内核引导和初始化</td>
</tr>
<tr>
<td style="text-align:right;">ipc/ </td>
<td style="text-align:center;"> 进程间通信代码</td>
</tr>
<tr>
<td style="text-align:right;">kernel/ </td>
<td style="text-align:center;"> 核心子系统，例如调度程序</td>
</tr>
<tr>
<td style="text-align:right;">lib/ </td>
<td style="text-align:center;"> 通用内核函数</td>
</tr>
<tr>
<td style="text-align:right;">mm/ </td>
<td style="text-align:center;"> 内存管理子系统和VM</td>
</tr>
<tr>
<td style="text-align:right;">net/ </td>
<td style="text-align:center;"> 网络子系统</td>
</tr>
<tr>
<td style="text-align:right;">samples/ </td>
<td style="text-align:center;"> 示例，示范代码</td>
</tr>
<tr>
<td style="text-align:right;">scripts/ </td>
<td style="text-align:center;"> 编译内核所用的脚本</td>
</tr>
<tr>
<td style="text-align:right;">security/ </td>
<td style="text-align:center;"> Linux安全模块</td>
</tr>
<tr>
<td style="text-align:right;">sound/ </td>
<td style="text-align:center;"> 语音子系统</td>
</tr>
<tr>
<td style="text-align:right;">usr/ </td>
<td style="text-align:center;"> 早期用户空间代码(所谓的initramfs)</td>
</tr>
<tr>
<td style="text-align:right;">tools/ </td>
<td style="text-align:center;"> 在Linux开发中有用的工具</td>
</tr>
<tr>
<td style="text-align:right;">virt/ </td>
<td style="text-align:center;"> 虚拟化基础基础结构</td>
</tr>
</tbody>
</table>


<hr />

<pre><code>在源码树根目录由很多文件值得提及：
- COPYING文件，是内核许可证(GNU GPL v2)；
- CREDITS，是开发了很多内核代码的开发者列表；
- MAINTAINERS，维护者列表，他们负责维护内核子系统和驱动程序；
- Makefile，基本内核的Makefile。
</code></pre>

<a name="L........"></a>
<h3>[参考]</h3>

<ul>
<li>《Linux内核设计与实现》（第三版）</li>
</ul>

]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[[笔记]UITableView &amp; UITableViewController]]></title>
    <link href="https://existed.github.io/blog/2016/12/22/uitableview-and-uitableviewcontroller/"/>
    <updated>2016-12-22T17:41:38+08:00</updated>
    <id>https://existed.github.io/blog/2016/12/22/uitableview-and-uitableviewcontroller</id>
    <content type="html"><![CDATA[<p>  基本的tableView: numberOfRowsInSection:、tableView: cellForRowAtIndexPath:等等就不多说了，主要记录一下UITableView的编辑模式。</p>

<p>假设有一个“Edit”按键用来打开编辑模式，在编辑模式时此案件显示“Done”，为按键添加操作：</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
</pre></td><td class='code'><pre><code class='objective-c'><span class='line'>  <span class="o">-</span> <span class="p">(</span><span class="kt">IBAction</span><span class="p">)</span><span class="nl">toggleEditingMode</span><span class="p">:(</span><span class="kt">id</span><span class="p">)</span><span class="n">sender</span> <span class="p">{</span>
</span><span class='line'>      <span class="k">if</span> <span class="p">(</span><span class="n">_list</span><span class="p">.</span><span class="n">count</span> <span class="o">&gt;</span> <span class="mi">0</span><span class="p">)</span> <span class="p">{</span>
</span><span class='line'>          <span class="k">if</span> <span class="p">([</span><span class="nb">self</span><span class="p">.</span><span class="n">tableView</span> <span class="n">isEditing</span><span class="p">])</span> <span class="p">{</span>
</span><span class='line'>              <span class="p">[</span><span class="n">sender</span> <span class="nl">setTitle</span><span class="p">:</span><span class="s">@&quot;Edit&quot;</span> <span class="nl">forState</span><span class="p">:</span><span class="n">UIControlStateNormal</span><span class="p">];</span>
</span><span class='line'>              <span class="p">[</span><span class="nb">self</span><span class="p">.</span><span class="n">tableView</span> <span class="nl">setEditing</span><span class="p">:</span><span class="nb">NO</span><span class="p">];</span>
</span><span class='line'>          <span class="p">}</span> <span class="k">else</span> <span class="p">{</span>
</span><span class='line'>              <span class="p">[</span><span class="n">sender</span> <span class="nl">setTitle</span><span class="p">:</span><span class="s">@&quot;Done&quot;</span> <span class="nl">forState</span><span class="p">:</span><span class="n">UIControlStateNormal</span><span class="p">];</span>
</span><span class='line'>              <span class="p">[</span><span class="nb">self</span><span class="p">.</span><span class="n">tableView</span> <span class="nl">setEditing</span><span class="p">:</span><span class="nb">YES</span><span class="p">];</span>
</span><span class='line'>          <span class="p">}</span>
</span><span class='line'>      <span class="p">}</span>
</span><span class='line'>  <span class="p">}</span>
</span></code></pre></td></tr></table></div></figure>




<!-- more -->


<p>添加row：</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
</pre></td><td class='code'><pre><code class='objective-c'><span class='line'> <span class="o">-</span> <span class="p">(</span><span class="kt">IBAction</span><span class="p">)</span><span class="nl">addNewItem</span><span class="p">:(</span><span class="kt">id</span><span class="p">)</span><span class="n">sender</span> <span class="p">{</span>
</span><span class='line'>
</span><span class='line'>        <span class="cm">/* Get a new item */</span>
</span><span class='line'>
</span><span class='line'>        <span class="p">[</span><span class="n">_list</span> <span class="nl">insertObject</span><span class="p">:</span><span class="n">item</span> <span class="nl">atIndex</span><span class="p">:</span><span class="mi">0</span><span class="p">];</span>
</span><span class='line'>
</span><span class='line'>        <span class="bp">NSInteger</span> <span class="n">lastRow</span> <span class="o">=</span> <span class="p">[</span><span class="n">_list</span> <span class="nl">indexOfObject</span><span class="p">:</span><span class="n">item</span><span class="p">];</span>
</span><span class='line'>        <span class="bp">NSIndexPath</span> <span class="o">*</span><span class="n">indexPath</span> <span class="o">=</span> <span class="p">[</span><span class="bp">NSIndexPath</span> <span class="nl">indexPathForRow</span><span class="p">:</span><span class="n">lastRow</span> <span class="nl">inSection</span><span class="p">:</span><span class="mi">0</span><span class="p">];</span>
</span><span class='line'>
</span><span class='line'>        <span class="p">[</span><span class="nb">self</span><span class="p">.</span><span class="n">tableView</span> <span class="nl">insertRowsAtIndexPaths</span><span class="p">:</span><span class="l">@[</span><span class="n">indexPath</span><span class="l">]</span> <span class="nl">withRowAnimation</span><span class="p">:</span><span class="n">UITableViewRowAnimationRight</span><span class="p">];</span>
</span><span class='line'><span class="p">}</span>
</span></code></pre></td></tr></table></div></figure>


<p><img src="https://existed.github.io/images/UITableView_edit_new.jpeg"></p>
]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[iOS中的UINavigationController]]></title>
    <link href="https://existed.github.io/blog/2016/12/12/ioszhong-de-uinavigationcontroller/"/>
    <updated>2016-12-12T18:14:42+08:00</updated>
    <id>https://existed.github.io/blog/2016/12/12/ioszhong-de-uinavigationcontroller</id>
    <content type="html"><![CDATA[<a name="L..............."></a>
<h3>参考文章：</h3>

<p><a href="http://www.cnblogs.com/496668219long/p/4472195.html">http://www.cnblogs.com/496668219long/p/4472195.html</a></p>
]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[[瞎折腾] UEFI启动Fedora22+Windows8.1双系统]]></title>
    <link href="https://existed.github.io/blog/2016/12/03/xia-zhe-teng-uefiqi-dong-fedora22-plus-windows8-dot-1shuang-xi-tong/"/>
    <updated>2016-12-03T18:35:39+08:00</updated>
    <id>https://existed.github.io/blog/2016/12/03/xia-zhe-teng-uefiqi-dong-fedora22-plus-windows8-dot-1shuang-xi-tong</id>
    <content type="html"><![CDATA[<p>本人比较懒，所以直接贴出参考文章，思路差不多，但是最后使用Fedora来引导，而不是参考文章中所说的rEFInd。怎样使用Fedora引导写在最后。</p>

<!-- more -->


<a name="L........"></a>
<h2>[参考]</h2>

<p>UEFI+GPT安装Windows8和CentOS双系统</p>

<p>[日期：2014-05-11] 来源：Linux社区 作者：smstong</p>

<p>随着虚拟机管理软件的广泛使用，双系统安装场合越来越少了，但还存在这样的地方，尤其是学习一些硬件的场合。本文针对UEFI时代的双系统安装进行了实验和说明。</p>

<p>前一篇文章已经对UEFI,GPT和安装CentOS进行了详细说明，见： <a href="http://www.linuxidc.com/Linux/2014-05/101574.htm">http://www.linuxidc.com/Linux/2014-05/101574.htm</a> 。本文专门说明双系统的安装方式。</p>

<p>U盘安装64位CentOS 6.5方法 <a href="http://www.linuxidc.com/Linux/2014-04/100035.htm">http://www.linuxidc.com/Linux/2014-04/100035.htm</a></p>

<p>Win7安装64位CentOS 6.4双系统详细图文教程 <a href="http://www.linuxidc.com/Linux/2014-04/100032.htm">http://www.linuxidc.com/Linux/2014-04/100032.htm</a></p>

<p>CentOS与Windows双系统安装注意事项记录 <a href="http://www.linuxidc.com/Linux/2014-05/101571.htm">http://www.linuxidc.com/Linux/2014-05/101571.htm</a></p>

<a name="L1............."></a>
<h4>1 安装步骤</h4>

<p>（1）使用diskgen工具把硬盘修改为GPT格式。（可以通过带有这个工具的光盘、U盘等完成）。</p>

<p>（2）光盘安装Window8，在建立分区时，安装程序自动建立额外的两个分区MSR和ESP。</p>

<p>（3）一步步点击完成。</p>

<p>此时，ESP分区有/EFI/Microsoft/Boot/文件夹，里面是Windows8的启动器，bootmgr.efi，bootmgfw.efi等。</p>

<p>（4）放入CentOS-EFI的光盘，重新启动机器</p>

<p>（5）安装程序能够识别ESP分区，我们需要做的只是把这个ESP分区挂载到/boot/efi。（注:ESP分区类型的GUID是固定的，据此识别之）</p>

<p>（6）在安装GRUB时，安装程序自动设置为安装到ESP分区，我们看清即可</p>

<p>（7）正常安装完成。</p>

<p>此时，ESP分区增加了/EFI/RedHat/文件夹，里面是grub.efi和grub.conf。</p>

<a name="L2........................."></a>
<h4>2 双系统启动的方式</h4>

<p>目前为止，只是安装了两个系统，UEFI的nvram启动菜单有了这两个菜单项，但是这款主板启动时，只显示一个微软的选项。这就导致了只能启动Windows8，不能启动CentOS。解决思路有如下几种</p>

<ul>
<li>使用windows8的bootmgr.efi来链式启动grub.efi。在BIOS时代，ntldr是可以加载grub所在扇区的，现在我还没找到可行方式;（不可行）</li>
<li>把grub.efi修改路径及名称为bootmgfw.efi，然后通过grub.efi链式启动bootmgfw.efi。这在BIOS时代是相当常见的，但现在我实验证明Centos所带的grub.efi不能链式加载bootmgfw.efi，提示错误。（不可行）</li>
<li>升级主板固件，使得能按下F12时，同时显示CentOS和Windows两个启动选项。还没找到可行的途径。（不可行）</li>
<li>通过第三方启动管理器来代替bootmgfw.efi的位置，让后由这个管理器提供链式加载bootmgfw.efi和grub.efi。我选用的是rEFInd，实验证明完全可行。（可行！）</li>
</ul>


<p>目前位置我还没找到可以修该这款主板UEFI的启动菜单的可行方式，所以采用把refind.efi改名为微软的bootmgfw.efi的方式。而微软的bootmgfw.efi则修改到其他位置。具体步骤：</p>

<p>（1）通过CentOS光盘recue模式，把/EFI/Microsft/Boot文件夹改名为 /EFI/weiruan；<br/>
（2）把refind文件夹拷贝到/EFI/Microsoft/，并改名为Boot；<br/>
（3）把refind_x64.efi改名为bootmgfw.efi；修改refind.conf.smaple文件名为refind.conf，并根据需要修改其中的内容，我修改后的内容如下：</p>

<blockquote><p>timeout 20  <br/>
showtools shell, mok_tool, about, reboot, exit, firmware <br/>
scanfor internal,external,optical,manual <br/>
dont_scan_files shim.efi,MokManager.efi,memtest.efi,bootmgr.efi  <br/>
scan_all_linux_kernels <br/>
default_selection weiruan</p></blockquote>

<p>至此，文件夹布局为：</p>

<blockquote><p>EFI/weiruan （里面是Windows8的启动器） <br/>
EFI/Microsoft/Boot（里面是refind的文件） <br/>
EFI/redhat （里面是grub启动器）</p></blockquote>

<p>完成后，重新启动机器，喜人的rEFInd界面出现，上图显摆一下：</p>

<blockquote><p>UEFI+GPT安装Windows8和CentOS双系统</p></blockquote>

<a name="L3.UEFI........................"></a>
<h4>3 UEFI时代的双启动思考</h4>

<p>微软依旧很霸道，所以多系统安装时，Windows要首先安装，省的它在安装是破坏别的已安装系统；
这个时代的启动加载器尚未完全成熟稳定，grub就是个例子，它的链式加载有问题存在；
UEFI主板功能还不完善，设置修改不方便，不好用；
理论上多启动更加简单；
目前作为启动管理器的rEFInd确实非常好用。
更多CentOS相关信息见CentOS 专题页面 <a href="http://www.linuxidc.com/topicnews.aspx?tid=14">http://www.linuxidc.com/topicnews.aspx?tid=14</a></p>

<p>本文永久更新链接地址：<a href="http://www.linuxidc.com/Linux/2014-05/101575.htm">http://www.linuxidc.com/Linux/2014-05/101575.htm</a></p>

<a name="L..........Fedora......."></a>
<h2>[默认由Fedora引导]</h2>

<p>根据上面的思路，将EFI分区的Microsoft命名为weiruan，并创建Microsoft文件夹，拷贝fedora到Microsoft目录，并重命名为Boot，修改Microsoft/Boot/grubx64.efi为bootmgfw.efi，修改同目录下的grub.cfg，将Microsoft改为weiruan。关闭UEFI的secure boot模式，OK啦～</p>

<p>有一点不爽的是win8启动后，桌面右下角会显示“SecureBoot未正确配置” :-(</p>

<ul>
<li>Fedora安装介质是用<a href="https://fedorahosted.org/liveusb-creator/">liveusb-creator</a>制作的,支持UEFI启动。</li>
</ul>


<a name="L........"></a>
<h2>[问题]</h2>

<p>这种方式有几个问：    <br/>
1. 当有新版本的内核被安装时，新内核的启动信息会自动配置在中/boot/efi/EFI/fedora/grub.cfg，需要手动更新/boot/efi/EFI/Microsoft/Boot/grub.cfg；      <br/>
2. grub配置文件中建议不要手动修改grub.cfg，推荐通过修改/etc/grub.d/中的文件，执行grub-mkconfig来达到配置启动项的目的，显然上面的方法没遵循这条建议；  <br/>
3. 针对上面的问题，可能可以用“grub-mkconfig -o /boot/efi/EFI/Microsoft/Boot/grub.cfg”，没有亲自尝试过，如果可行，不过没次内核更新后，还需手动执行一次该命令；     <br/>
4. windows8在启动过程中，“Windows”标识可能不能正常显示，不过不影响使用。</p>
]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[First Article]]></title>
    <link href="https://existed.github.io/blog/2016/11/30/first-article/"/>
    <updated>2016-11-30T18:39:13+08:00</updated>
    <id>https://existed.github.io/blog/2016/11/30/first-article</id>
    <content type="html"><![CDATA[<p><code>Hello
</code></p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
</pre></td><td class='code'><pre><code class='objective-c'><span class='line'>  <span class="bp">CGRect</span> <span class="n">screen</span> <span class="o">=</span> <span class="p">[[</span><span class="bp">UIScreen</span> <span class="n">mainScreen</span><span class="p">]</span> <span class="n">bounds</span><span class="p">];</span>
</span><span class='line'>  <span class="n">_window</span> <span class="o">=</span> <span class="p">[[</span><span class="bp">UIWindow</span> <span class="n">alloc</span><span class="p">]</span> <span class="nl">initWithFrame</span><span class="p">:</span><span class="n">screen</span><span class="p">];</span>
</span><span class='line'>  <span class="p">[</span><span class="n">_window</span> <span class="nl">setRootViewController</span><span class="p">:[[</span><span class="n">ViewController</span> <span class="n">alloc</span><span class="p">]</span> <span class="n">init</span><span class="p">]];</span>
</span><span class='line'>  <span class="p">[</span><span class="n">_window</span> <span class="n">makeKeyAndVisible</span><span class="p">];</span>
</span></code></pre></td></tr></table></div></figure>

]]></content>
  </entry>
  
</feed>
