0. 环境 iOS 10 + MacOS 10.12 + Python 2.7 1. 思路 APP界面中弹出的题的位置和答案的位置都是固定的,因此我们可以将手机屏幕想办法投到电脑屏幕上,通过OCR识别指定区域,实时打开搜索引擎界面搜索问题,甚至匹配答案。 2. 关键步骤 2.1 投屏 我是iPhone 5s + Mac电脑,可以用Mac的Quicktime Player播放器的屏幕录制功能(安卓据说可以用ADB)。 具体的,打开Quicktime Player后,点击“文件–新建屏幕录制–(红色录制按钮旁的下拉菜单)选择从手机录制”,这时,手机屏幕就实时投到屏幕上了。 2.2 截屏和OCR 截屏 截屏要将你的手机投屏窗口固定在一个位置,找准屏幕上的左上角和右下角两个坐标,利用PIL中的ImageGrab进行抓屏,以截取题干为例,代码如下: from PIL import ImageGrab image = ImageGrab.grab((50, 170, 540, 330)) OCR 利用tesseract库和对应的pytesseract接口进行OCR,具体配置可以参考[1]。 import pytesseract ocr_str = pytesseract.image_to_string(image, lang=’chi_sim’) 2.3 搜索 分两种思路,我们可以直接打开一个浏览器页面用百度搜索,把答案筛选工作交给人: import webbrowser url = “http://www.baidu.com/s?rn=50&wd=” + […]

0. GCC的attribute关键字 这是GCC的一个特性,gcc可以使用attribute关键字,格式如下: __attribute__((attribute_name)) 其中attribute_name中有两类constructor和destructor类似C++中类的构造和析构的概念,只不过是相对main()函数来说的。简单说,__attribute__((constructor))定义的函数在main前执行,__attribute__((destructor))定义的函数在main后执行。 1. 以qcow2为例 QEMU中有很多”module”的初始化使用了__attribute__((constructor))这个特性,来在main前完成init函数的注册过程。使用方法举例具体如下: // QEMU_2.10_SRC/include/qemu/module.h中: #define module_init(function, type) \ static void __attribute__((constructor)) do_qemu_init_ ## function(void) \ { \ register_module_init(function, type); \ } #endif typedef enum { MODULE_INIT_BLOCK, MODULE_INIT_OPTS, MODULE_INIT_QOM, MODULE_INIT_TRACE, MODULE_INIT_MAX } module_init_type; // 比如这里block_init函数被用在QEMU_SRC/block/*的qcow2等Format Driver中广泛应用, // 其实就是间接调用了被__attribute__((constructor))调用的register_module_init() #define block_init(function) module_init(function, MODULE_INIT_BLOCK) #define opts_init(function) module_init(function, MODULE_INIT_OPTS) #define type_init(function) module_init(function, MODULE_INIT_QOM) […]

欢迎评论。。以后还可能写个版本2。。。 冗余的人类语言 研表究明,汉字序顺并不定一影阅响读!事证实明了当你看这完句话之后才发字现都乱是的。 以上这句话很多人都看到过,知乎上也有很多人讨论问题的原因[2],对于这段中文,有人从贝叶斯决策的角度分析,指出这是由于人借助了上下文的相关信息+日常的经验。对于英文,如果把一段话的每个单词的字母顺序打乱,也会出现不影响阅读的情况,有人指出这可能是人在阅读一个单词时只看第一个字母和最后一个字母的原因。我感觉都是有道理的。 但现在我们要从另一个角度考虑这个问题: 假设在另一个平行宇宙中,汉语“研表究明”和“研究表明”存在截然不同表示的是两种截然不同的意思,那么就算那个宇宙中的人们可能就觉得这两个词是有区别的。 再假设一个更极端的平行宇宙,他们每个单词都长为6个字母,且只能由ABCDEF 6种字母组成(我算了下有4万多种组合,够多了),那么,他们对词序的判别应该就特别严格吧。 可见,我们所在的平行宇宙中,语言中是存在“冗余”的。这样,不管依据什么经验,语言的冗余,让我们辨识出调换词序的句子的原本意思成为可能。 其实不光调换词序体现了这种冗余。类似的,当我们在一个噪音大的环境中讲话的时候,或者在FM收音机中调出一个信号不好的电台时,我们一般情况下照样可以听明白对方所讲,靠着也是这种“冗余”,我们可以根据已知的信息,猜出完整的信息。 0和1:抗干扰的冗余 接着说收音机。如前边所说,我们的语言中存在”冗余”,所以接收的电台中音调偶尔的变化或者一些字的不清晰依然不影响我们接受信息。那么为什么现在的网络电台没有这些失真、底噪呢,人们靠什么高科技来消除这些噪声干扰? 我们常见的收音机,不管是调幅的还是调频的,都是以模拟信号进行传输的,这种信号直接将要传输的信息以幅度或者频率的形式均匀地映射(调制)到负责传输信号的电磁波(载波)上,由于传输的过程(信道)中信号必然是被各种干扰(噪声)的,于是我们的收音机接收到的电磁波转换到声音的形式(解调)时,干扰信号(噪声)也就被一一映射到了声音(噪音)传到我们耳朵中。 但是现在的网络传输,多数基于数字信号。信号都不再是一一映射到频率值或幅度值了,而是仅映射为一个由0或1(两种频率或幅度)组成的编码。我们假定一个最简单的串行通信,在一个时刻,只能有0或1两种可能,假设信道中存在干扰(比如0被干扰到0.2还会被认为是0信号,1被干扰为0.9还会被认为是1信号),接收后的结果也大概率没有出错。其实这也是一种冗余,一种防止出错的冗余。 0, 1, 2, 3:高效的冗余? 我们为了信息的稳定传输,将无限种状态映射到两种状态(0和1)的编码。但是,我们为什么一定要2种状态呢?为什么不能是0, 1, 2三种状态呢?如果这种可能容易实现(电路上),而且人们最开始没有走上普及二进制计算机这条不归路,那么可能我们现在用的都是基于三机制的电脑了[4]。 技术上的难度或者转换的巨大成本,让人类点了”二进制”这条科技树。不过人们虽然没有用3种状态,但是用4种状态或者8种状态的情况倒是有很多,因为这能保证了和系统其他部分的二进制组件兼容。 比如在信息存储中,固态硬盘(SSD)的MLC/TLC技术,就是在每个存储单元中把以前SLC的两种状态(电压)记录信息,转为用4种/8种电压来记录信息,这样做便增加了SSD的存储密度。 (0, 1, 2, 3) + X: 不可避免的冗余 但是,这种4种或8种状态的SSD,虽然提高了存储密度,但它们的存储单元的寿命会缩短,所以制作这种SSD的时候,就一定要在设备内部预留更多的备用存储单元,这也是一种冗余。看来冗余从抗干扰的冗余被迫转为空间的冗余。 当然,我们也可以采用校验/纠错码技术,用更小的空间冗余来保证信息的可靠。但是编码或数据恢复都需要话费额外的计算时间。如果我们比起冗余空间的开销,更不看重数据恢复的时间,那么看起来空间的冗余又转为了时间的冗余。 看来,冗余无法避免,0/1到(0, 1, 2, 3),虽然它们减少了信号抗干扰的冗余,但是最终也无法避免的使用了其他的冗余。X可能是空间,可能是时间,但到今天这个世界中,都会是money,无法预测的money。 扩展阅读 [1] 熵:宇宙的终极规则, http://www.ruanyifeng.com/blog/2017/04/entropy.html [2] 知乎:为什么汉字顺序有时候不影响阅读? https://www.zhihu.com/question/20428571 [3] 知乎:如何从心理学上解释『打乱英语单词首尾字母之外的字母顺序仍然不影响阅读』的现象?https://www.zhihu.com/question/20804531/answer/16237704 [4] 知乎:苏联三进制计算机Сетунь到底是怎样一个计算机?https://www.zhihu.com/question/35937929

“新司机”虽然上路了,但并不知道走了多少弯路,因为还知道有没有走上正路。但上路也快一年了,当然有一些体会,就算是错的,也该想过些什么。如果我什么体会都不写出来,那么这些想法总会在我的脑子中绕啊绕啊的。所以我希望写些出来,也许这样就可以不用刻意提醒自己不要忘记它们,也好专心”开车”。而且我想,车技总是不断积累联系和回看总结的过程,也许我将来看现在自己的体会,不是嘲笑自己的车技太差就是羡慕自己的没有迷路运气。当然还有一种情况,就是我能因这些感想能将其他”新司机”带上(歪)路,我也是很欣慰的。。。 这系列文章,不去反省自己的缺陷,不去叙述自己的经历,只写下当前所总结的体会。本篇博客,我将写一下对存储栈的理解。后边,我还可能从存储组织(文件系统/存储结构)、存储缓存和虚拟化存储等几方面写下体会。 1. 层次化封装 就像OSI网络参考模型一样,存储也是有层次的,如果在网络中我们将这些层次称为网络协议栈(TCP/IP协议栈),那么在存储中我们经常用存储栈(storage stack)或I/O栈(I/O stack)与之对应。 顾名思义,栈这一种直上直下一层叠一层的结构。在网络的层次中,数据链路层关心的是MAC地址,网络层关心的是IP地址,栈中的所有层次分工协作,大家像流水线一样将数据层层传递如下图。 在存储层次中,也有类似的分工。比如以Linux存储栈为例,文件系统主要关心的是文件的组织结构,向上将接口暴露给用户;而文件系统下一层的块存储设备层则关心实际数据的去向,主要和存储设备打交道。下图是一个单机上比较复杂的情况,以一个运行在KVM虚拟机中的MySQL为例。当然如果考虑远程网络分布式存储,应该更复杂。 2. 为什么层次是必要的 除了网络和存储,其实编程语言中封装的这种概念,在我看来就类似这种层次化的形式。比如在很多编程语言中常用的SHA256、MD5等安全Hash算法或者链表、各种常用数据结构的库等。这节的问题就以编程中的封装和层次开发为例进行说明。 对编程语言的库来说,问题在于,既然哈希算法的计算方法都是开源的,数据结构都是固定的形式,为什么不自己写呢?首先想到的可能是自己写费时费力,其次一个被很多人使用的库一般都是由各路大神优化而来,应该比自己实现的效果要好,但最重要的,库是可以复用的。 比如那么当我们在这些其他人实现的库的基础上构建自己的应用的时候,就是在库的封装之上进行的开发,这就形成了库–>我的应用的这样的层次结构。进一步说,如果我们是在其他人的库的基础上开发了更高层的库,比如我在其他人写的二叉树库的基础上开发了用于排序的库,那么我们的封装层次就又涨了一层:二叉树库–>排序库–>其他人的应用。再展开说,我们甚至可以冲破一种编程语言的界限,表示出更完整的封装层次:数字逻辑–>指令集–>汇编语言–>系统调用–>编程语言标准库–>二叉树库–>排序库–>其他应用。 如果只是从左到右或者从上到下画出这种层次图,我们还是无法理解层次的必要性,但是如果我们想横向扩充,这种层次就是很必要的。极端的情况:如果我们所有的层次都重叠在一起,那么也许我想开发一个gui小应用,就要从汇编开始,一直沿着操作系统改到库和应用逻辑,简直不现实,这也是软件工程中耦合和内聚的概念。换句话说,不论我们是靠近硬件还是靠近应用的程序员,我们都可以从自己出发,只要向上层和下层提供不变的接口,那么不论我们在自己的范围怎么折腾,都不会破坏其他层次的工作。 回到存储,我们只有将管理文件的file system和下层的设备驱动通过块设备层和虚拟文件系统(VFS)层解耦,才能在单独编写多中设备驱动不用再去修改文件系统代码,也才能在添加新的文件系统功能的同时不用担心对老的设备是否可以工作。 3. 为什么层次可能影响性能 还是以编程语言为例,很多都认可C语言相对其他语言是高效的,但学汇编的人可能觉得汇编才是最高效的,这都没有错,汇编比C高效,但并不属于高级程序语言,C比Python高效,但是指针这种东西没有谁可以一时半会搞定。实际上,汇编–>C–>Python就可以认为是这样封装起来的。某种程度上来说,我们开发C语言应用可以看成是和开发Python是在一个层次上的。。。对于存储也是一样的,层次总是一层一层网上堆的。堆到越上层,越具有其简单易用的特性,而这种层次化页必然会带来性能上的降低。 现在在我看来,存储层次升高带来的性能损失的根本原因是因为在层次间信息的不对称的同时还有些层次要越层”搞事情”。具体来说,层次之间的沟通通过接口,由于层次间较松的耦合,某一层中无法获知其他层中的具体细节。比如,应用程序可能要告诉文件系统具体要读的文件名,但并不知道文件具体存在什么地址;文件系统可能告诉块设备驱动它具体要读内容的地址,但是块设备层就不知道这内容属于什么文件了。 但是,存储的管理不光“你告诉我你要什么数据,我把数据传给你”那么简单:首先,由于数据的重要性,各个层次都要用自己的机制保证数据的完整性和一致性;其次,也要利用数据的局部性,用dram作为cache来弥合内存和二级存储设备间的性能差异。那么大家都要保证数据可靠,大家也都在加把劲降低IO读写延迟,真的是齐心协力力量大吗? 当然大家都想整个系统变得更好,但是既然层级之间信息不对称,一定会因为缺少合作,而导致自己所做的工作不如预期,甚至起到副作用。我们是需要加强各层间的耦合交互?还是提升各层的“智能”让其揣测其它层的想法?还是应该聘请一个“存储栈独裁程序”来统一发出号令?这块儿学问就大了,还是新司机的我理解并不够深入,车技提升后还要展开多写写。。。 4. 在适当的层次做适当的事 Python认为程序员要指针没啥用,于是没有设计出指针的概念。而可能在一些C语言程序员眼中,Python因此就是一种有缺陷的语言。但是我们可能忽略了一点,就是没有谁禁止过Python程序员学习C语言,也没有人禁止过C程序员学Python。对于一个项目来说,没有最好的语言,只有最合适的。 对于存储层次同样如此,比如同样是数据加密,我们可以在应用程序中加密数据,可以在文件系统中加密数据,可以在数据网络传输之前进行,极端的情况,甚至也可以在硬盘硬件中进行加密。对于cache,我们可以在应用层开辟内存作为cache、或者利用文件系统缓存,或者磁盘的硬件缓存等。选择很多,不同的功能,适合的位置也是不同的,同样和上节一样,这块儿学问就大了,还是新司机的我理解并不够深入,车技提升后还要展开多写写。。。

手动搜集资料,不敢保证无误,如有错误,恳请指正。 1. 设备 最新的3D XPoint存储器比DRAM慢10倍,便宜2倍;比NAND FLASH快1000倍,贵5倍左右,性能比其他PCIe和NVMe的SSD快10倍左右。并且它是一种NVM。 下表摘自[2] Type Volatile? Writeable? Erase Size Max Erase Cycles Cost (per Byte) Speed SRAM Yes Yes Byte Unlimited Expensive Fast DRAM Yes Yes Byte Unlimited Moderate Moderate Masked ROM No No n/a n/a Inexpensive Fast PROM No Once, with a device programmer n/a n/a Moderate Fast EPROM No Yes, […]

时隔近3个月,我本科毕业后第一次回到了西安,见到了在本校读研的舍友们,不过主要还是来参加信息存储年会的。 会议有特邀报告、青年学者报告和优秀论文交流报告,分别是大神级的学者、大神级的青年学者和大神级的博士生进行报告,听了这些报告真的感觉到自己的差距有多么大,同时感觉不虚此行。 这是一篇我所听报告的部分内容的总结,语言从我个人理解的角度出发,信息可能不全或不准确,如有问题,欢迎讨论和指正。 阻变存储器性能优化方法的研究 冯丹教授讲的题目是“ 阻变存储器性能优化方法的研究 ”。首先RRAM(阻变式存储,Resistive Random Access Memory,ReRAM)是一种非易失性存储器(NVM),尺寸单元小,有发展潜力。冯丹教授这次的报告是比较偏硬件,但还是有很多启发。 背景: DRAM在技术上要降低能耗、提升容量越来越难,而且DRAM技术提高的速度比CPU慢,另外技术工艺达到40nm之后很难再提高。所以ReRAM代替DRAM是一种选择。 RRAM的存在的问题: 1. reset延迟和能耗代价均高于set;2. TLC的延迟大于SLC;3. 存在IR-drop的问题,离驱动电源越近,延迟越低。 几项工作: 1. 针对上述第一点问题,提出了可以将对角线上的set和reset并行,这样降低了总延迟时间。 2. 针对上述第二点问题,使用了一种“压缩率感知”的方法,利用MLC/TLC中中间几种状态慢于两边状态的特点,将中间的几个状态合并,根据压缩的工作负载的压缩率,来进行决策,重新编码存储(比如把原来MLC的4中状态中的第2、3两种合为一个状态,这样就变成了3中状态,减小了延迟和能耗)。3. 针对上边的第三点问题,用双端驱动代替单端驱动,这样处于接近电源驱动的区域就增多了,并且可以根据快慢在驱动层中区分硬件上的快慢区域,来合理使用。 半层次化的语义存储体系结构 华中科大华宇教授的报告,讲了一种” 半层次化的语义存储体系结构 “,希望将原来的存储结构(比如文件系统的目录结构)转为一种多标签的索引结构。 背景: 存储有5个趋势,分别是更大规模、智能化、一体化(计算和存储更近)、长期化和边缘化(雾计算,临近计算等)。 问题: 存储的层次化越来越明显,同时新兴的存储期间很多(PCM、SSD、DRAM、3D Xpoint……);NVM能缓解存储的压力,但是由于寿命等问题无法从根本上解决问题;对于文件系统来说,查找树不是太高就是太胖;locality的设计思想是用稀缺资源存储最热的数据,但目前的大趋势是locality正在减小;cache的适应能力弱,比如需要较强时间的预热,代价很高。 解决思路: 用语义存储带起当前的存储模式,例如:文件系统中使用扁平化的树结构,一个文件同时贴上(识别出)多种标签;有了这种模式,非精确dedulication中可以在关联数据间进行,提升效率;近似图像语义间的dedupe;data cube是对于高维查找提前做出计算的一种方法,如果基于语义,可以缩小计算范围。 数据中心驱动下KV系统的设计和实现 德州大学阿灵顿分校的Song Jiang教授主要讲了KV系统的缓存问题。 问题: 由于在分布式存储中,所有的访问都要经过metadata server(MDS),所以MDS是一个瓶颈,应用Key-Value(KV)系统就是取消了MDS的一种解决方案。KV系统是需要缓存的,怎么更高效的利用有限的缓存空间是一个问题。 思路: 可以使用更好的缓存数据替换算法,但是并没有效果太好的;可以提升内存容量,但是这会直接导致成本上升;可以利用压缩提升缓存利用率,但是解压和压缩也会导致很大的性能下降。 方法: 对实际访问trace数据分析发现,随着缓存空间的增长,缓存命中率上升到80%是很快的,但从80%上升到90%则需要更多的内存,基于这点,将cache分级,最热的数据不进行压缩,对并非太热的数据进行压缩,这就很好的平衡了压缩解压缩的延迟和缓存的利用率问题。 对于这种方法,还有一个解释,就是对cache命中,即使要进行解压缩操作,时间也远远小于访问存储服务器进行磁盘访问,这样,即使缓存利用率提升了5%,也可能带来很大的性能提升效果。Song教授解释的意思是,由于磁盘访问的速度特别慢,在命中率从90%提升到95%的情况下,更应该看到的是未命中率降低了一半(10%–>5%),而不是命中率提升了很少(90%->95%) 其他 清华的陆游游博士介绍了NVM+RDMA的分布式存储方案,有了RDMA,CPU传送所有数据的等待时间减小到传送存储地址的时间。 华科博士生左鹏飞提出了一种基于位置分享的解决哈希冲突的策略,用于NVM系统。 上海交大的博士生董明凯介绍了他发表在ATC 17上的文章Soft Updates Made Simple and […]

今天,老师给实验室发的邮件中有一条建议说,我们应该将工作数据任何时候都保存多于一份,来避免丢失: 在该页面还有一个同步软件,请一并下载,使用该软件每天将工作文件夹分别同步到U盘(或移动硬盘)和电脑硬盘中,保证任何时候都有至少两份,因为目前的设备特别是硬盘容易损坏,避免关键数据丢失 其实说到这个问题,我也有一很多相关的想法,找不到人去说,干脆写个博客吧,反正微博那么短,也不适合我叨叨。。。 多份好于一份 对于重要信息,放到电脑里就安全了吗?当然不是,设想最极端的情况,你的电脑被人偷走了。。。 好吧,那我放一份到移动硬盘里怎么样?再设想一种情况:你去某个地方需要带电脑和移动硬盘,你把移动硬盘和笔记本电脑放在了一个书包里,你的书包被人偷走了。。。 我的做法:把重要信息存到电脑一份、存到移动硬盘一份,再存到某个网盘一份(上传前最好加密,对于代码工程还可以开源到github)。 数据的历史 有些数据是慢慢变化的,比如毕业论文、代码文件等,它们都在不断改进、增删。有时候,我们想找回几分钟前删除的一段文字/代码,但是发现删除之后已经点了保存键,岂不是追悔莫及? 我的做法:为了留有余地,对于论文等文字创作,每隔完成一次重要的创作,都存一次副本;对于代码文件,没做一次可行的修改,就用git系统进行一次commit。甚至如果对于论文,也可以使用git进行版本控制,我还曾经想过用git保存我的minecraft游戏存档,一边我可以随时在“我的世界”里进行“时光穿梭”。。。 控制权应该在我手中 这点是还不能令我完全睡好觉的一个点。 社交网络 例如,我从10年左右,就注册了微博,然后现在微博两千多条了,可是新浪微博却无法导出我的所有微博(除非用手去复制粘贴或用爬虫强行去扒),类似的当然还有朋友圈或者qq空间,这些可都是没有导出功能的。 然而,和新浪微博相比,twitter就可以下载自己所发过的所有推文,仅此一点,微博在我心中就无法和twitter相比。 我的做法:对于只能在墙中生活的我,不找到一个好点的爬虫爬下我发过的大部分微博,我是完全无法睡个好觉的,谁知道微博哪天会倒闭(或是微博的数据库管理员哪天会突然删数据库跑路?) 聊天记录 最容易想到的,手机QQ是无法导出聊天记录的,电脑qq和微信虽然能,但是一定要再导进软件才能看,所以如果哪天腾讯倒闭了,可能聊天记录就再也回不来了,而这些记录里面可能有重要的信息。 我的想法:虽然暂时摆脱不了腾讯qq和微信的“魔爪”,但是我还是认为邮件是比较可靠的,它有开方的协议,而且方便随时下载保存本地。 引申 数据越来越重要,我们不希望重要数据的丢失,就像不希望丢钱一样。对于金钱来说,它是无法像数据一样进行复制的,放在手里可能被偷,放在股市可能赔死,放在银行还可能倒闭;但是数据可以有副本。也就是说数据的安全相对于财产的安全,更容易让我们睡好觉。想到这里,我不禁又想到了比特币。。。

“时间”和“空间”,在小的时候对我来说只是两个词语,没有什么实质的领悟;后来知道了霍金曾写《时间简史》来讨论时间,到现在也没读完过,估计读完也懂不了;貌似爱因斯坦还说过时间是现实世界的第四个维度?但时间对于人来说总是有别于空间的,但时间总是感觉很特别,感觉不应该和空间统一起来,我想两者应该是个对等的关系;再后来,相见别离,让我明白了时间的意义,房价飙涨,也让我了解了空间的残酷(2333…)。 倒是从大学后的一些课程开始,我对这两个概念有了更加现实的理解。比如,数据结构这门课貌似从第一节就让我们求一段程序的空间复杂度和时间复杂度,有些算法是用时间换空间(牺牲更多计算时间,减少存储空间),有些是用空间换时间。加上后来的各种经历和获得的知识,让我觉得,信息的存在需要空间和时间,而随着人类的发展,各种信息所需要的时间和空间之间可以互相转换替代。 生活中的信息和时间/空间 如果对算法复杂度一窍不通,我们也能在生活中找到一些例子。比如街上的小店铺门前挂的LED电子屏幕,上面可能滚动着各种最新的促销信息,如果你碰巧感兴趣,就需要驻足等所有字幕滚动一遍。看完你可能觉得很烦:“为什么字幕滚动这么慢,促销又这么没有诚意,完全是在浪费时间…”,这说明你的阅读速度很快,老板也许还想让更多心不在焉的人感受到他跳楼甩卖之决心呢。我们考虑这样一个问题,如果放到没有LED屏的30年前,也许把整个店铺的店面用横幅盖住也写不下这么多的字吧。这里,LED电子屏减小了店铺广告的空间,却增加了展示同样多信息的时间(不考虑人的阅读速度,时间由零秒变为字幕滚动所需的数秒)。 类似还有很多例子。我还可以想到电子书和纸质书,一个iPad可能可以存下原来一个图书馆的书籍,空间大大减小。但是要展示所有的书籍的信息,iPad却必须花时间:设想我们有足够的空间的话,可以把图书馆所有的书的每一页都撕下来摊开放在地上,所有信息展示的时间为零,而iPad只有一个屏幕,我们无法在一个时刻翻完所有的信息(假设屏幕帧率为100Hz,我们一秒最多翻100页)。再例如,如果你喜欢电子读物,只需要一个MP3和一个耳机,甚至连ipad的大屏幕都不需要,空间又减小了,但由于说话速度小于阅读速度,展示完所有信息需要的时间却又增加了。这里当然是把人接收书中信息的速度忽略不计了,因为有人会把音频书加快3倍听,而另一些人可能看文字书一目十行。 更接近信息本质的思考 在通信和计算机系统中,信息的传递和存储都是需要编码的,这些编码的过程就是对信息进行表示和压缩的过程。 莫尔斯码也许是为人熟知的系统,这种电码和现代计算机系统类似,最小的通信单元也是两种状态:长、短。长短电报音的各种组合就能表示各种各样不同的信息。最早的电报是需要电报员的,他只能戴上耳机,处于紧张的接收状态。设想如果我们是21世纪的操纵古老电报机的电报员,我们可能会想出各种办法把这种音频记录通过模式识别之类的手段存储起来,然后用Python写一个解码器就直接将翻译过来了。我们不考虑翻译过程的话,我们的“现代做法”便是用存储空间换取了持续在线接收的时间,或者说这是一种带不带“缓冲区”的区别。 数据压缩的概念也很常见,我们从网上下载的很多文件,格式都是rar或zip的,这时如果你想使用它,就必须用压缩软件解压。而这个解压速度,主要取决于你CPU的计算性能。很简单的道理:解压和压缩虽然都需要消耗时间,但可以节省更多的空间。这就是信息在时间和空间的一种转换。 信息的成本和价值 “时间就是金钱”。我认为,之所以人们经常那这句话提醒自己,肯定是因为通常金钱并不经常和时间有一个公认的“汇率”。也许空间就不一样了,在北京的房子可能需要10万一平米,其他有些地方的房子可能只要1千元一平米,大家都觉得很合理;一块普通硬盘可能需要5毛钱1GB的成本,可能固态硬盘就要5块钱1GB,大家也认为很合理,空间总有个价格。 …… 如果我假设,信息的产生、获取或者存储可以用存储空间和计算时间来度量,同时计算时间和存储空间之间又存在某种公认的价格(比如云计算–明码标价的计算能力和存储能力),那么也许时间就是真的可以用金钱来衡量了。而信息这种依赖时间和空间的产物,也便产生了其必然的价值。那么到了那个时候,时间就是金钱,金钱就是信息。 …… 最后要说明: 这篇博客并没有投入很多时间深入思考,只是最近偶然冒出的一些想法。在我看来,人生的意义很大程度上在于了解自己和自己之外的东西,这些想法也许有用也许没用,也许深奥也许通俗,但以我的角度,都是自己所学所见的一些积累所导致,所以对我来说都是值得记录的。谢谢大家的关注。

原文出处:QEMU当前的文档 qemu/docs/devel/tracing.txt 一、介绍 这篇文档描述了QEMU追踪的整体架构和如何使用追踪功能来进行debug、性能分析或者监测运行状况。 二、快速开始 步骤1. 编译QEMU时带上’simple’trace追踪后端: ./configure –enable-trace-backends=simple make 步骤2. 创建一个写有你想追踪的事件(events)的文件 echo memory_region_ops_read >/tmp/events 步骤3. 运行虚拟机来产生一个追踪文件 qemu -trace events=/tmp/events … #加上其他你需要的qemu选项参数 步骤4. 以美观的形式打印出二进制的追踪文件Pretty-print the binary trace file: ./scripts/simpletrace.py trace-events-all trace-* #用QEMU的进程号(pid)来代替”*” 三、Trace events 1. 设置子文件夹 Sub-directory setup 在源码目录的每个文件夹中都可以在trace-events文件中声明一组静态的trace events。所有包含有trace-events文件的子文件夹必须被列在源码根目录Makefile.objs的trace-events-subdirs项中。这样在编译时,被列出的子文件夹的trace-events文件就会被tracetool脚本处理来生成相关的追踪代码。 单独的trace-events文件会被merged到一个trace-events-all文件中,trace-events-all文件也将会被安装到/usr/share/qemu目录中,并改名为trace-events,这个文件最终会被simpletrace.py脚本用作simpletrace数据格式的追踪分析。 在子文件夹中,以下的文件会被自动生成 trace.c – the trace event state declarations trace.h – the trace event enums […]

第一篇和第二篇文章中,我们分别从差异化定价和虚拟交易两个方面揭露了一下Steam的坑钱大法。今天要讲一下游戏内容了,毕竟人们来Steam主要是想玩游戏的。 任何一款游戏发售之前,开发商都应该是设定好了游戏道具、游戏方式、各种参数等一切正常游戏进行需要的游戏内容。但是随着游戏时间加长,总有一天,游戏内容被玩家慢慢“消费”完,如果能减慢游戏内容的消耗时间,就能延长一款游戏的寿命,使游戏获得更多人认可。 从红警2说起 红色警戒2并没有在Steam上,但我感觉其很有代表性。可能大家首先想到的是,红警2是一款即时战略类游戏,想到玩家需要扮演”commander”来建造和指挥部署各种兵种、建筑。但其实这款红警2,就涵盖了大多数游戏所具有的两种游戏模式的:剧情模式和回合模式(遭遇战)。 在红警2剧情模式中,敌我的兵力及其分布都是事先设定的,不可以自由建造,又设定了一些游戏剧情和目标(比如摧毁敌军基地,拯救xxx。杀死xxx等),玩家达成目标后就能进入下一关。当玩家通关的那一刻,剧情游戏的游戏内容便被消耗完了。热衷这款游戏的玩家可能会去选择开始二周目,或者选择厂商提供的更高难度再次进行挑战,但最后几乎没有人会一直玩下去。 而在回合制的遭遇战模式中,玩家需要选定自己和敌方的国家,双方都从零开始建造军队,最后将敌方所有单位摧毁的一方取胜。这种模式就更像“电子竞技”了,因为双方起点相同,真人玩家也可以网络对战,相对也就更耐玩一些。但是总共也就几十种兵种,随着更新一代的游戏的退出,老游戏的剩下的可能只有死忠粉了。 DLC 在以前,若一款游戏的取得很大成功,很多游戏厂商会发布游戏资料片(Expansion Pack)。游戏资料片一般并不改变游戏模式或者画面,更多的来扩充原来游戏的剧情,加入一些新的游戏内容。来用较小的投资成本,获得更多的利润。 《尤里的复仇》就是红警2推出的一款资料片,资料片的画面或者音效可以说没有变化。但是增加了很多新的游戏内容,游戏厂商Westwood为红警2加入了全新的剧情,并在遭遇战中加入了一种拥有全新兵种的阵营。 我们无法判断发布资料片是既定战略,还是顺势而为。也许厂商对一个游戏本身充满自信,认为只先放出50%的内容,就可以占领90%的潜在市场,那么剩下的50%分几个资料片放出来,显然是可以延长游戏在市场上的寿命,卖更多的钱的。也可能是因为原来游戏出乎意料的火,开发商想在原来的游戏框架下加点剧情再卖一波。 但无疑,资料片增加了游戏内容,提升了一款游戏带来的利润。Steam也觉得这是一个好的概念,于是想将这种发行形式发扬光大,于是给了资料片取一个新名字:DLC(Downloadable Content)。 Workshop 另一个很好玩的现象,红警2在十几年前的中国是相当火的。但是流行于中国的红警2并不是原版,而是称为《共和国之辉》的修改版本(游戏Mod)。这个Mod并没有加入太多新的兵种,也没有新的剧情,最大的特点是将原版没有的中国添加了进去,而且中国的兵种都是其他几国的兵种随机凑在一起的,并且无耻的将中国兵种的属性调强数倍。。。几乎毁掉了这个游戏的平衡性。但就是这款被很多人鄙视的Mod,在中国无法被否定地火过了原版红警2。一切都是因为这款Mod加入了符合特定玩家喜好的元素(虽然并没有实质改变),其实就是抓住了广大中国玩家的“爱国”心理。可见,玩家自制的内容可能不够严谨,但可能广受追捧,因为制作者就是玩家们自己。 和红警2一样,由于很多游戏都留有二次开发的接口或者方便替换、增加的游戏文件格式,它们都是有很多Mod的。但在由于Mod是非官方的游戏改版,玩家开发者只能在非官方的渠道传播,并且玩家一般要去必须主动寻找,十分不便;更重要的,游戏厂商并不能利用Mod这些玩家开发游戏内容进行宣传和销售。Steam看到了商机,开发了Workshop平台改变了这一局面,这是一个游戏Mod平台,玩家创建的Mod、游戏地图等内容也可以在每款游戏对应的Workshop中上架和被购买游戏的玩家下载,Workshop方便了Mod开发者和爱好者之间的Mod共享,也以廉价的方式为游戏带来了可以说是无限的游戏内容扩展。 三篇短文写完,我只能说,对于Steam这些“手段”,我是不得不佩服:Steam不成功,谁成功? 参考 [1] 红色警戒2-维基百科, https://zh.wikipedia.org/wiki/%E5%91%BD%E4%BB%A4%E4%B8%8E%E5%BE%81%E6%9C%8D%EF%BC%9A%E7%BA%A2%E8%89%B2%E8%AD%A6%E6%88%922 [2] DLC-维基百科, https://zh.wikipedia.org/wiki/%E8%BF%BD%E5%8A%A0%E4%B8%8B%E8%BD%BD%E5%86%85%E5%AE%B9 [3] Is there a difference between expansion pack and downloadable contenthttps://gaming.stackexchange.com/questions/95370/is-there-a-difference-between-expansion-pack-and-downloadable-content [4] 《虚拟经济学》, https://book.douban.com/subject/26418114/