<?xml version="1.0" encoding="utf-8" ?><rss version="2.0"><channel><title><![CDATA[飞奔在原野]]></title><description><![CDATA[希望有一天，代码如风一般，飞奔在原野……]]></description><link>https://blog.youkuaiyun.com/tankery</link><language>zh-cn</language><generator>https://blog.youkuaiyun.com/</generator><copyright><![CDATA[Copyright &copy; tankery]]></copyright><item><title><![CDATA[《深度探索C++对象模型》阅读笔记（一）——对象的内存布局1]]></title><link>https://blog.youkuaiyun.com/tankery/article/details/8009335</link><guid>https://blog.youkuaiyun.com/tankery/article/details/8009335</guid><author>tankery</author><pubDate>Sun, 23 Sep 2012 15:41:29 +0800</pubDate><description><![CDATA[本章是从整个对象的全局观来审视C++，并对比C++和C，讨论出一个较为高效和简明的C++对象模型，最后详细介绍了继承如何对程序造成影响。
主要分为以下几个内容：


引入。C++如何基于C构建对象C++简单对象的内存布局模型讨论Class 和 Struct 间的关系和影响详细讨论对象的继承
关于C++的强大以及C的简洁之间的讨论已经很多，因而我不打算介绍C++是如何基于C构建对象的。而是]]></description><category></category></item><item><title><![CDATA[《深度探索C++对象模型》阅读笔记（零）——引子]]></title><link>https://blog.youkuaiyun.com/tankery/article/details/7983360</link><guid>https://blog.youkuaiyun.com/tankery/article/details/7983360</guid><author>tankery</author><pubDate>Sun, 16 Sep 2012 00:02:29 +0800</pubDate><description><![CDATA[C++本不是门易学的语言，入门如此，进阶更甚，而当我从一个写C++程序之人，转变成调试大型C++工程之人的时候，我深切的感受到了C++的晦涩难懂。
当我面对一个个bug的时候，我是那么迷茫：
明明已经是个空指针了，为何程序会崩溃在指针指向的函数之中，而不是调用之时？
明明是已经被删除的指针，怎么还能对内存访问得那样自如？
明明也是个空指针，但这次为何在函数调用之时就崩溃了？
再加上找不到]]></description><category></category></item><item><title><![CDATA[Go！漂亮的语言！]]></title><link>https://blog.youkuaiyun.com/tankery/article/details/7959326</link><guid>https://blog.youkuaiyun.com/tankery/article/details/7959326</guid><author>tankery</author><pubDate>Sun, 09 Sep 2012 03:09:30 +0800</pubDate><description><![CDATA[这一周，利用每天晚上下班回来后的一小时，学习了Google开发的Go语言，算是对其有了个基本的了解。确实是门漂亮的语言。
首先，从它的设计目标是设计一种高效的、静态编译的、易于编写的语言。它涉足的是系统级的编程，试图与C/C++抗衡。
详细来说，它的设计目标有如下几点（来自wikipedia和golang FAQ）：


安全：类型安全与内存安全。没有继承，无需处理类型的依赖关系，弱化类]]></description><category></category></item><item><title><![CDATA[自定义 HID 设备的实现――下位机]]></title><link>https://blog.youkuaiyun.com/tankery/article/details/6327760</link><guid>https://blog.youkuaiyun.com/tankery/article/details/6327760</guid><author>tankery</author><pubDate>Sat, 16 Apr 2011 15:18:00 +0800</pubDate><description><![CDATA[<br />最近在做一个投票系统的上位机。虽然是上位机，但还是要弄清楚下位机与自己的接口――HID。<br />因为windows下已经有一个usb监听程序――USB HOUND。所以，我选择先写好下位机的程序，成功发送数据后，再进行上位机程序的编写。<br />下位机程序，重点在于HID设备的描述符配置。什么是描述符？<br />HID 设备，<br />

|–	通过设备描述符来标识自己的设备信息，如设备ID、厂商名称、版本、配置数量等；<br />

|–	通过配置描述符集合来标识自己的配置信]]></description><category></category></item><item><title><![CDATA[你做错了。。。]]></title><link>https://blog.youkuaiyun.com/tankery/article/details/6235247</link><guid>https://blog.youkuaiyun.com/tankery/article/details/6235247</guid><author>tankery</author><pubDate>Wed, 09 Mar 2011 21:31:00 +0800</pubDate><description><![CDATA[<br />英文原文：http://labs.qt.nokia.com/2010/06/17/youre-doing-it-wrong/<br /> <br />我们之间经常使用IRC（网络聊天工具？）进行交流，社区也同样是这样。我在上 Freenode 网络的 QT 频道时会帮那些有问题的人解答。一个普遍的问题（也是我厌烦的问题）是如何理解QT多线程，还有如何使他们的代码工作。他们将他们的代码，或者基于他们代码的实例展示给我看，而我经常会回复他们一句：
<br /> 你做错了。。。<br />我知道这个]]></description><category></category></item><item><title><![CDATA[操作系统笔记（二）---进程、线程]]></title><link>https://blog.youkuaiyun.com/tankery/article/details/6234989</link><guid>https://blog.youkuaiyun.com/tankery/article/details/6234989</guid><author>tankery</author><pubDate>Wed, 09 Mar 2011 19:14:00 +0800</pubDate><description><![CDATA[<br />进程：是一个具有一定独立功能的程序关于某个数据集合的一次运行活动
线程：是进程内的一个相对独立、可调度的执行单元。
进程可以直接在任务管理器中看到其程序名称，线程则没有具体的程序名，只是进程中的一个执行单元。一个进程中至少包含一个线程。线程间的资源共享更容易，但也更容易相互干扰。<br />
关于程序、进程和线程的一个比喻(by Crazyman)：
你的QQ不运行的时候就是一个程序，不占用CPU你登陆以后，你的QQ.exe就是一个进程这个QQ不光可以聊天，上面还有广告、QQ秀等东西，这]]></description><category></category></item><item><title><![CDATA[操作系统笔记（一）]]></title><link>https://blog.youkuaiyun.com/tankery/article/details/6228459</link><guid>https://blog.youkuaiyun.com/tankery/article/details/6228459</guid><author>tankery</author><pubDate>Mon, 07 Mar 2011 11:15:00 +0800</pubDate><description><![CDATA[<br />一个程序在加载过程中会发生分页缺失中断，为什么？<br />答： 一个进程在启动后会分配一块特定的区域。程序语句的调用会有两种方式：在程序开始，或发生跳转等语句的时候，先加载硬盘中需要的语句到内存，再执行。在发生这些跳转的时候，先不加载，之间跳转，执行失败后，再加载硬盘中的语句到此内存。<br />在运行过程中可能发生多出跳转，或需要多次访问一个内存地址。此时，第二种方式的优势体现出来。因为程序的运行过程中并不需要多次进行硬盘数据的读取。大大提高了程序运行的效率。<br /> <br />分时系]]></description><category></category></item><item><title><![CDATA[Linux初步（二）——Linux 简单编程]]></title><link>https://blog.youkuaiyun.com/tankery/article/details/6199275</link><guid>https://blog.youkuaiyun.com/tankery/article/details/6199275</guid><author>tankery</author><pubDate>Tue, 22 Feb 2011 10:12:00 +0800</pubDate><description><![CDATA[编程，我们都会，但是具体经历哪些步骤，我们都清楚嘛？打开VC，新建一个文件，编写完后，F5运行，这就是所有的步骤？VC把太多的底层实现封装了，使你几乎不用关心底层的操作。而Linux中，一览无余。总的来说，简单流程如下：编辑 -> 编译 -> 链接 -> 运行。首先，当然是要编辑源文件，用什么编辑器？VI，对，就是它，Windows下也不乏它的身影，跨平台的优秀编辑软件，扯远一点，“这个世界上有三种程序员，一种用VIM (VI升级版)，一种用xxx的，还有一种用其他”。足见VIM在编辑器领域的地位。关于VI]]></description><category></category></item><item><title><![CDATA[Linux初步（一）——关于操作系统的启动]]></title><link>https://blog.youkuaiyun.com/tankery/article/details/6199055</link><guid>https://blog.youkuaiyun.com/tankery/article/details/6199055</guid><author>tankery</author><pubDate>Tue, 22 Feb 2011 07:56:00 +0800</pubDate><description><![CDATA[今天，收获非常非常多，熟悉了Linux的操作，并了解了整个操作系统的启动过程。Linux的操作网上资料很多很全，我就不细数了。。我就来回顾和总结一下操作系统 (Ubuntu 10.10 为例) 的全部启动过程。首先，操作系统的启动过程如下：BIOS -> MBR -> OS Loader -> OS Kernel -> Application Manager -> Applications.附上图片一张以更清楚的说明：下面，我分各个部分回顾操作系统启动过程： 1. BIOS我们都知道，就如单片机程序一样，写]]></description><category></category></item><item><title><![CDATA[《Head First 设计模式》阅读笔记（八）——模板方法模式]]></title><link>https://blog.youkuaiyun.com/tankery/article/details/6194898</link><guid>https://blog.youkuaiyun.com/tankery/article/details/6194898</guid><author>tankery</author><pubDate>Sat, 19 Feb 2011 13:26:00 +0800</pubDate><description><![CDATA[Oh yeah， 看到这个模式的时候，我很happy～因为我发现我居然在之前的编程中用过，而且是自己想出来的设计方式，很有成就感，哈哈。模板方法模式：在一个方法中定义一个算法的骨架，而将一些步骤延迟到子类中，模板方法使得子类可以在不改变算法结构的情况下，重新定义算法的中的某些步骤。从模板方法模式的定义中，我们就可以明确这个模式的实现方式了，即构造一个有算法骨架的基类，当你需要使用这个骨架的时候，继承该基类，并实现一些算法的细节。换句话说，基类定义了整个算法的框架。并实现某些通用的算法，使得需要这个框架的一些]]></description><category></category></item><item><title><![CDATA[如何使用 Google spreadsheet 创建一个账本？]]></title><link>https://blog.youkuaiyun.com/tankery/article/details/6192513</link><guid>https://blog.youkuaiyun.com/tankery/article/details/6192513</guid><author>tankery</author><pubDate>Fri, 18 Feb 2011 01:40:00 +0800</pubDate><description><![CDATA[早就想弄一个这样的应用。因为经常不记得钱是花在什么上面了，总想记账，但是总觉得记录到一个专门的账本上太麻烦，用软件也麻烦，用excel也很麻烦，什么样子的不麻烦呢？在线填写不麻烦～～Google Doc，非常可爱，可惜现在被墙了。。。要生活，还得会翻墙啊～在网上找了找，发现用Google Doc 确实能很方便的创建一个账本，而且使用起来非常方便。如果大家找到什么不用翻墙的好方法，请告诉我，谢谢～首先是创建一个表格 (spreadsheet 喜欢装B，用的英文，见谅。。)，保存，并输入一些你需要的项目，如下图]]></description><category></category></item><item><title><![CDATA[《Head First 设计模式》阅读笔记（七）——适配器和外观模式]]></title><link>https://blog.youkuaiyun.com/tankery/article/details/6191213</link><guid>https://blog.youkuaiyun.com/tankery/article/details/6191213</guid><author>tankery</author><pubDate>Thu, 17 Feb 2011 12:18:00 +0800</pubDate><description><![CDATA[详细介绍了适配器模式的两种实现方式：类适配器和对象适配器。并附上了经过测试的c++示例代码。
简略介绍了外观模式。
最后，对适配器模式、外观模式、命令模式做了些分析比较。]]></description><category></category></item><item><title><![CDATA[《Head First 设计模式》阅读笔记（六）——命令模式]]></title><link>https://blog.youkuaiyun.com/tankery/article/details/6186522</link><guid>https://blog.youkuaiyun.com/tankery/article/details/6186522</guid><author>tankery</author><pubDate>Tue, 15 Feb 2011 17:46:00 +0800</pubDate><description><![CDATA[命令模式其实比较简单，就是封装了请求，使得请求有统一的接口。其定义如下：将请求封装成对象，这可以让你使用不同的请求、队列，或者日志请求来参数化其他对象。命令模式也可以支持撤销操作。也就是说，命令模式可以通过一个抽象的命令类来扩展各种命令，接着，你可以使用诸如队列、链表之类的结构来很好的管理这些命令，使得命令对象包含的操作被有序的执行，以实现日志等功能。并且，由于命令对象能很清楚的知道它负责的请求需要的执行流程，它就能很轻易的实现撤销操作。命令模式具有上述的这些特性，使得它被广泛的使用于日志、撤销、菜单操作等]]></description><category></category></item><item><title><![CDATA[《Head First 设计模式》阅读笔记（五）——单件模式]]></title><link>https://blog.youkuaiyun.com/tankery/article/details/6184749</link><guid>https://blog.youkuaiyun.com/tankery/article/details/6184749</guid><author>tankery</author><pubDate>Mon, 14 Feb 2011 20:37:00 +0800</pubDate><description><![CDATA[c++中的单件模式实现，列举各种方案，并分析其优劣。
注：未考虑多线程情况。]]></description><category></category></item><item><title><![CDATA[《Head First 设计模式》阅读笔记（四）——工厂模式]]></title><link>https://blog.youkuaiyun.com/tankery/article/details/6142876</link><guid>https://blog.youkuaiyun.com/tankery/article/details/6142876</guid><author>tankery</author><pubDate>Sat, 15 Jan 2011 21:01:00 +0800</pubDate><description><![CDATA[这一章，看得比较纠结，以前以为自己看懂了，回顾一下，组织语言想写博客的时候，发现还是没弄清楚。遂又上网查资料，发现一个比较好的网站： http://www.jdon.com/designpatterns/，就是广告多了点，说的还是很明白的。但我发现该网站上所说的工厂模式，似乎与Head First上讲述的模式有些出入，或者是侧重点不同？于是又在wiki上查找，再通过研究Head First的Java代码，终于发现，JDon上的说法确实是对的，即“这两个模式区别在于需要创建对象的复杂程度上”。不过简单工厂，似]]></description><category></category></item><item><title><![CDATA[《Head First 设计模式》阅读笔记（三）——装饰者模式]]></title><link>https://blog.youkuaiyun.com/tankery/article/details/6138084</link><guid>https://blog.youkuaiyun.com/tankery/article/details/6138084</guid><author>tankery</author><pubDate>Fri, 14 Jan 2011 11:45:00 +0800</pubDate><description><![CDATA[装饰者模式 (Decorator Pattern) 非常有趣，如果不是看过设计模式，看到这个模式的代码时一定大吃一惊：“这是什么东西？怎么这么多类！”是的，这就是这个模式的特别之处了，无数类摆在你面前，你无所适从。但这个模式是用来干什么的呢？用来管理大量同样类型但有细小属性差别的事物（我自己想的定义）。这也就注定了这个模式中，类的多样性。为什么会出现这么个模式？如果是我自己编程，我第一个想到的，肯定是继承。一个抽象类，其他各种功能的子类。这样设计是多么丑陋你应该一眼就看出来了，因为只要一个小小的改变，你就需]]></description><category></category></item><item><title><![CDATA[《Head First 设计模式》阅读笔记（二）——观察者模式]]></title><link>https://blog.youkuaiyun.com/tankery/article/details/6133866</link><guid>https://blog.youkuaiyun.com/tankery/article/details/6133866</guid><author>tankery</author><pubDate>Thu, 13 Jan 2011 10:36:00 +0800</pubDate><description><![CDATA[观察者 (Observer) 模式应该是使用得非常广泛的一个模式，在JDK中就有内建的观察者模式。首先我来说说什么是观察者模式。观察者模式：定义了对象之间一对多的依赖，这样，当一个对象改变时，它的所有依赖者都会收到通知并自动更新。很多场合下，我们都需要这样的一对多关系。设想一个GUI的计算器程序，当你按下一个按钮时，你需要按钮改变形状，更重要的，你需要将按键的信息传递给数据处理者。我们如果这样编程（伪码）：class Button {
    void pushed() {
        change]]></description><category></category></item><item><title><![CDATA[《Head First 设计模式》阅读笔记（一）——策略模式]]></title><link>https://blog.youkuaiyun.com/tankery/article/details/6130250</link><guid>https://blog.youkuaiyun.com/tankery/article/details/6130250</guid><author>tankery</author><pubDate>Wed, 12 Jan 2011 08:24:00 +0800</pubDate><description><![CDATA[上回将之前看过的章节都大致梳理了一遍，回过头去看的时候，发现看不懂了。。太泛。从这篇文章起，我想一个个详细的说明，当是复习了。今天，先来讲述策略模式的故事。为什么要用策略模式？这一章从一开始便告诉我们，用继承来解决扩展问题并不是最好的办法，因为一旦你需要一个新的行为时，你就必须继承出一个新类，如此，代码便会在多个子类中重复，而由于我们不清楚到底有多少行为需要定义，设计之初的父类很可能要改变，而这种改变会导致其所有的继承者都受到牵连，这是很可怕！接下来，就是讨论该如何解决这个问题了。首先一个原则是，封装变化，]]></description><category></category></item><item><title><![CDATA[使用QT做跨平台编程]]></title><link>https://blog.youkuaiyun.com/tankery/article/details/6127849</link><guid>https://blog.youkuaiyun.com/tankery/article/details/6127849</guid><author>tankery</author><pubDate>Mon, 10 Jan 2011 21:28:00 +0800</pubDate><description><![CDATA[<br />前两周，各种课程设计和实验，各种团队活动占据了我几乎所有的时间，睡觉都没啥时间，更不用说写博客了。<br /> <br />今天下午刚刚投出高频课设的PCB，暂时得以清闲，赶紧来写写博客，待我整理完微机原理的课设，后面的课设和实验也该总结了～～<br /> <br />QT，是我最近一直在使用的编程框架，非常便捷和强大～不但封装了各种复杂的系统操作，而且非常容易实现跨平台的C++编程。<br /> <br />QT的程序，一般来说，只要不是跟系统直接相关的程序，都能极为顺利的实现跨平台，但是事情]]></description><category></category></item><item><title><![CDATA[《Head First 设计模式》阅读笔记 （零）]]></title><link>https://blog.youkuaiyun.com/tankery/article/details/6127814</link><guid>https://blog.youkuaiyun.com/tankery/article/details/6127814</guid><author>tankery</author><pubDate>Mon, 10 Jan 2011 21:01:00 +0800</pubDate><description><![CDATA[很长一段时间前，看了一部分书，写了些笔记，由于某些原因中断了，今天重新拾起这本书，要继续看下去～～以下是上次的笔记，重新开始～    1. OO原则：        1.1.封装变化            指的是设计过程中，设计者应当充分考虑将来可能会发生变化的代码部分，将它们提取并封装起来。        1.2.多用组合，少用继承            即多使用has-a的关系，少用is-a的关系。若过分依赖继承，当父类的功能发生变化以后，将会影响到所有的子类。不利于代码的修改。而组合则是将各个功能独立]]></description><category></category></item></channel></rss>