最新发布 Toggle Comment Threads | 键盘快捷键

  • jinzihao pm10:23 on 2017年7月4日 链接地址 | 回复
    Tags:   

    (待填充)
    fifo文件的使用与mkfifo命令
    C语言的getopt函数
    getenv函数
    stringification macro
    -fno-function-cse
    -finstrument-functions

     
    • njlyf2011 下午12:53 on 2017年7月10日 链接地址 | 回复

      站长好,话说您可以提供一下20世纪下载站的资源么,我想做一个 mirror。

      • jinzihao 上午2:40 on 2017年7月15日 链接地址 | 回复

        抱歉…服务器上的apache挂了,服务器没问题,文件没丢…这两天有点忙暂时没恢复起来…您准备做mirror的服务器是个什么情况?可否简单介绍一下?我考虑怎么把文件传送过去…

        • njlyf2011 下午12:31 on 2017年7月15日 链接地址 | 回复

          我有两个方案:
          1. 自己有一台 20G 空间的 VPS,环境是 Ubuntu 16.04 + Apache 。
          2. 第二种方案是我准备把整站都 get 下来然后打包到百度云。。。

          • jinzihao 上午9:25 on 2017年7月19日 链接地址 | 回复

            20GB有点勉强…现在所有文件得15GB多…你的系统还得占用空间…(顺便问下…这是DigitalOcean的VPS吗)

  • jinzihao pm11:55 on 2017年6月11日 链接地址 | 回复
    Tags: AI, , 人工智能, 围棋   

    围棋AI 

    (这个坑出分后填上…)

     
  • jinzihao pm3:37 on 2017年3月1日 链接地址 | 回复
    Tags:   

    这行代码看起来有点奇怪…
    其实struct也可以用{value1, value2, …}的方式初始化,与数组的初始化类似,例如:

    表示idt1的第一个元素用7初始化,其余元素用0初始化。
    因此开始这行代码表示新建一个大小为256的gatedesc数组,数组的每一项的每个元素(或说“成员变量”)都是0。

     
  • jinzihao pm2:46 on 2017年3月1日 链接地址 | 回复
    Tags: , x86   

    C语言struct定义中的冒号(“:”) 

    在C语言的struct定义中,可以使用冒号(“:”)来指定struct中的元素所占的bit数,注意是bit不是byte,因此可以出现诸如3bit、11bit的元素,如下面这段代码所示:

    这个数据结构对应于如下两种x86架构下的中断描述符(IDT):

    这种语法在表示一些带有非整字节元素的数据结构时非常方便,例如x86架构定义的一些数据结构,或是类似IPv4的网络协议头,可以免于用C++的成员函数的方式来封装。

     
  • jinzihao am12:51 on 2016年12月31日 链接地址 | 回复  

    FTP实验报告 

    注:本文为计算机网络原理课程实验的实验报告,实验内容为实现一个简单的FTP服务器,程序已开源:https://github.com/jzh14/ftpd

    1. 概述

      本程序实现了一个符合RFC 959的FTP服务器和配套的客户端,其中FTP服务器支持主动和被动模式,支持多用户同时上传/下载,可以和主流FTP客户端(如Filezilla)正常交互(上传、下载、重命名、删除、创建目录、删除目录、切换目录等),支持使用配置文件对用户名、密码、路径、欢迎信息进行设置,并在安全性上进行了比较充分的测试和针对性的加固。

      FTP客户端仿照Windows内置的ftp命令实现,提供了和FTP服务器正常交互所需的功能(上传、下载、重命名、删除、创建目录、删除目录、切换目录等)。

      FTP服务器支持的FTP命令:APPE CWD DELE HELP LIST MKD NLST NOOP OPTS PASS PASV PORT PWD QUIT RNTR RMD RNFR RNTO STOR SYST TYPE USER XPWD。

      FTP客户端支持的FTP命令:USER PASS HELP QUIT CWD PWD PUT PORT STOR RETR LIST MKD RMD DELE,并可使用LITERAL命令发送任意FTP命令到FTP服务器。

      以下主要针对服务器部分加以说明,因为服务器技术上的难度明显高于客户端,结构复杂得多,而且也有更多需要注意的细节。客户端功能仿照Windows内置ftp命令,实现细节可参看源码。

      本程序的全部源码可在此处下载:

      https://jinzihao.me/wp-content/uploads/2016/12/ftpd.tar.gz

    1. 技术架构

      FTP服务器主体为一个循环,使用fd_set维护当前活跃的socket集合,使用select()函数查找需要处理的socket。对于需要处理的socket分三种情况:客户端建立命令连接、客户端建立数据连接、客户端发来命令,以下分别讨论:

      1. 客户端建立命令连接

        只需接受连接并将socket加入命令socket对应的集合。

      2. 客户端建立数据连接

        又分为主动模式等待发送、主动模式等待接收、被动模式等待发送、被动模式等待接收四种情况:

        对于两种等待接收的情况,根据之前接收STOR命令时记录下的上传文件名,打开对应的文件,开始从网络上读取并写入到文件。

        主动模式等待发送不需要特殊的处理,因为服务器在和一个主动模式的客户端交互时一旦收到了RETR命令,就会立即和客户端建立连接,并开始传输。

        被动模式等待发送需要一些特殊处理,因为服务器端收到RETR命令后,不能立即发送数据,而是要等到客户端建立了数据连接之后才能发送,因此需要将待发送的文件缓存下来,等到进入了被动模式等待发送这个状态,再将缓存的数据发送给客户端。

      3. 客户端发来命令

        由于TCP是流不是包,不能保证每次收到的恰好是一条命令(有可能是半条、两条、三条或是更多条)。将用户发来的命令在换行符处切开,将已经完整接收到的命令加入队列。接下来处理队列中待处理的命令,共23种情况,以下分别介绍:

        1. OPTS

          不起实际作用,仅为应对部分FTP客户端建立连接后发送的OPTS UTF8命令。

        2. USER

          如果收到了用户名,则将该客户端对应的状态设为等待密码状态。

        3. PASS

          如果收到了密码,则和启动时读入到内存中的用户名密码对应表进行比对,如果匹配则将该客户端对应的状态设为已连接状态。特别地,anonymous用户的密码可以为任意值,是否允许anonymous用户登录在配置文件中指定。

        4. QUIT

          向客户端发送goodbye信息,断开连接。

        5. PORT

          如果客户端发来的IP地址和端口有效,则和客户端发来的IP地址和端口建立连接,并将该连接加入对应的fd_set。

        6. PASV

          创建一个新的监听socket,等待客户端连接,并向客户端发送服务器IP地址和新建的监听socket的端口号。

        7. XPWD

          发送该客户端的当前路径。

        8. PWD

          发送该客户端的当前路径。

        9. NLST

          如果客户端指定了路径,则列出以该用户的根目录为基准的,该路径下的文件。如果客户端没有指定参数,则发送该客户端当前路径下的文件列表,以换行符分隔(类似ls)。

        10. LIST

          类似NLST,但发送的内容还包括文件大小、修改时间、权限等信息(类似ls –l)。

        11. CWD

          如果客户端指定了路径,则切换到以用户的根目录为基准的该路径。

        12. HELP

          列出服务器支持的所有FTP命令。

        13. NOOP

          空指令,仅发送200 NOOP ok.

        14. SYST

          发送 215 UNIX Type: L8

        15. TYPE

          对TYPE I和TYPE A做出相应,但不起实际作用,实际使用的永远是二进制模式(即TYPE I)。

        16. RETR

          如果客户端已经进入了PORT或PASV模式,而且客户端指定了要下载的文件名,而且文件存在,则分主动模式和被动模式两种情况分别处理:

          如果是主动模式,则建立一个新进程,在新进程中立刻开始发送数据。

          如果是被动模式,需要分客户端是否已经建立了数据连接两种情况分别处理:如果客户端已经建立了数据连接,则直接建立新进程并开始发送;如果客户端尚未建立数据连接,则将待发送的文件缓存起来,等待客户端建立连接时再发送,其后的过程在前文”客户端建立数据连接”小节中有所介绍。

        17. STOR

          如果客户端已经进入了PORT或PASV模式,而且客户端指定了要上传的文件名,则将客户端请求上传的文件打开,并将对应的ofstream保存起来,等待客户端实际建立了数据连接之后再开始写入。

        18. APPE

          类似STOR,只不过打开文件时需要加入ios::app参数指定append模式。

        19. DELE

          如果客户端指定了要删除的文件名,且该文件存在,则调用remove函数删除文件并发回删除成功消息;如果客户端未指明要删除的文件名,或该文件不存在,则发挥删除失败消息。

        20. MKD

          如果客户端指定了要建立的文件夹名,则调用mkdir函数建立文件夹,如果建立成功则发回成功消息;如果未指明文件夹名或建立文件夹失败,则发回失败消息。

        21. RMD

          如果客户端指定了要删除的文件夹名,则调用rmdir函数删除文件夹,如果删除成功则发回成功消息;如果未指明文件夹名或删除文件夹失败,则发回失败消息。

        22. RNFR

          如果客户端指定了重命名的源文件,且源文件存在,则记录在该客户端对应的状态信息里,否则发送失败消息。

        23. RNTO

          如果客户端指定了重命名的目标文件,且之前已经成功执行过RNFR命令,则调用rename函数执行重命名,如果成功则发送成功消息,否则发送失败消息;如果之前未执行过RNFR命令则发送对应的失败消息。

    2. 一些细节
      1. 在utils.h中实现了一组通用的操作文件路径的函数,核心功能是给定根路径、当前路径和新路径的情况下进行路径切换的函数,可以对越界访问(超出用户的根路径)的情况进行比较好的限制。
      2. lib_ini.cpp为一个开源的INI Parser,利用它实现了配置文件的读取,从而避免了对配置信息硬编码。
      3. 在对用户命令的处理中,每一条命令(除去USER、PASS、OPTS、SYST等少数几条)都先判断了用户是否登录,从而避免了用户认证绕过。
    1. 思考题
      1. 在FTP中,为什么要建立两个TCP连接来分别传送命令和数据。

        如果只使用一个连接,发送的数据里可能混有命令(例如PWD、CWD),使得区分命令和数据变得困难。尽管可以使用转义序列的方式对数据中出现的命令加以转义,但也会造成效率降低和额外的带宽开销。而且FTP实现多种多样,对于什么需要转义这个问题,不同的服务器和客户端理解会有不一致的地方,一旦出现理解不一致就会导致传输过程中发生意外,从而大大降低了FTP协议的兼容性和实现的简便性。将命令和数据分为两个连接,大大简化了实现,避免了很多特殊判断,可以说是简洁优雅的设计。

      2. 主动方式和被动方式的主要区别是什么,为何要设计这两种方式。

        主动方式是服务器向客户端发起数据连接,而被动模式是客户端向服务器发起数据连接。这两种方式主要是应对服务器或客户端(实际上主要是客户端)可能在防火墙内,可以连接外网但无法接受外网连接这种情况。对于客户端处在内网的情况(例如通过使用NAT的路由器联网),被动方式是使用FTP唯一可行的选项。

      3. 当使用FTP下载大量小文件的时候,速度会很慢,这是什么缘故,可以怎样改进。

        通过FTP下载一个文件的开销比较大,需要先发送一个PORT或PASV命令,再发送一个RETR命令,再建立一个连接,然后才能开始下载。对于大量小文件的情况,开始下载时需要的这些操作耗时相当可观,实际传输耗时反倒占比较小。如果改进的话,可以新增一个批量传输命令,服务器端将大量小文件打包发送,客户端收到后再解包。(实际使用FTP时,对于大量小文件,确实往往是先手动压缩成zip或tar.gz再上传或下载,然后再手动解压缩。)

    1. 一点感想

      首先要说这个实验设计的相当好,能比较完整地体验一个真实的服务器是如何开发的,难易适中,而且还有很多可以拓展的地方。而且最后实现了一个实用的软件,可以和现有的FTP客户端兼容,而且这套框架也很容易套用到其他C/S架构的应用程序,这一点也是相当实用的。参照RFC实现一个协议,也是很值得体验的过程,在以后的工作中也是非常实用的技能。总之,这是一个相当实用的作业,在这个实验上花些时间非常值得。

      另外要感谢帮忙测试的肖元安、王瑞康两位学弟和黄昱恺学长,通过黑盒测试一共发现了FTP服务器2处安全漏洞和2处性能上的瓶颈,也提出了相当有帮助的建议,可以说在网络安全方面给我上了一课,非常感谢~也要感谢助教们在最后一周加班加点检查同学们的大实验,还能保持相当的耐心,还能给我足够的时间演示实现效果,为助教们点个赞~

     
  • jinzihao pm6:08 on 2016年12月12日 链接地址 | 回复  

    摩尔定律与计算机科学的过去、现在和未来 

    注:这是一门文化素质课的课程作业

    写在前面:

    摩尔定律是一个在计算机系不止一门的课程中,会从不同的角度被提及,每一个计算机专业的学生都有所了解,且多少都会有所思考的话题。但往往,即便是计算机专业的学生,也未必会意识到摩尔定律对计算机科学的巨大影响。本人作为计算机系的学生,借科学技术史系列讲座这门课的机会,也来思考一下摩尔定律与计算机科学发展史的密切关系。

    摩尔定律是什么

    摩尔定律最早由Intel公司创始人戈登·摩尔于1965年提出,简单的叙述如下:集成电路上晶体管数目大约每隔两年翻一番[1]。摩尔定律可以近似理解为:同等成本的集成电路,每两年性能便可以翻一番;同等性能的集成电路,每两年成本便可以减一半。

    摩尔定律不是物理定律,也不是计算机科学中的理论,而是行业规律,是一个经验性的结论。尽管它没有严格的理论依据,却是每一个计算机工作者无法忽视的规律。尽管集成电路更多属于电子学的研究范畴,但和这个”定律”(准确地说是规律)关系最为密切的,却是计算机科学。

    摩尔定律反映的是半导体行业技术进步的速度。什么速度?指数级的速度。有人会问,很多行业的增长都是每年增长若干个百分点,这也是指数级的增长,摩尔定律又有什么不同呢?摩尔定律反映的不是行业规模的增长,而是一项技术指标的增长,而且是超高速的增长,又有哪个行业背后的技术可以持续地、以可预见的高速度不断进步呢?而技术的进步,往往会加倍地推动行业规模的增长[2]。所谓第四次工业革命,又称信息革命[3],就概括了过去几十年中爆发式增长的行业。而爆发式增长的背后,不仅需要新思想,更需要有新技术的推动。信息时代几乎所有新技术的幕后推手,便是摩尔定律。

    突飞猛进的50年

    虽说摩尔定律是幕后推手,但普罗大众也并不难感受到摩尔定律的效果:电脑越来越快,越来越便宜,手机也类似。但摩尔定律只是这么简单吗?只是让电脑和智能手机走入了寻常百姓家吗?不止如此。

    如果没有摩尔定律,计算机科学的很多分支都不可能出现:

    当下正火的虚拟现实(VR)和它背后的计算机图形学,如果计算机的性能不是指数级的增长,而只是线性增长,如果今天计算机的性能只是五十年前摩尔定律刚刚提出时的几倍,或是哪怕是几十倍,虚拟现实就是不切实际的空想,甚至应该说,就根本不会有人有这样的设想。要么是画面刷新一次需要几分钟,要么就是满眼马赛克,何谈虚拟现实?实际上,今天一台普通的个人电脑,性能已经千倍于40年前的超级计算机了[4],就更不必提40年前最早的个人计算机了。2010年最快的个人电脑处理器——Intel Core i7 980 XE,其性能百万倍于1980年最快的个人电脑处理器——Intel 8087[5][6]。今天的虚拟现实技术对计算机性能提出了极高的要求,今天性能最强的个人电脑尚且是”勉强够用”[7],如果没有这百万倍的性能提升,如果现在的虚拟现实体验可以做到每秒24帧,这是一个让人感受不到卡顿的下限,那么放在30年前的电脑上,恰好是每天2帧。

    事实上,知名的计算机视觉软件包OpenCV,便是在1999年由Intel公司启动开发的。[8] Intel公司的初衷,是为其当时已经过剩的处理器性能找到合适的应用场景。计算机视觉成功了,光学字符识别(OCR)、人脸识别、基于视觉的定位[9]相继出现。Intel也成功了,开发人员对处理器的性能不断提出更高的要求,这让Intel公司性能强劲的处理器有了用武之地。

    近来同样很火的还有人工智能。最近AlphaGo在围棋上战胜了李世石,19年前深蓝在国际象棋上战胜了卡斯帕罗夫,都引发了公众对人工智能的极大关注。尽管实现和改进人工智能最重要的还是计算机科学家对算法的创新突破,但如果算法没有一个足够快的运行环境,也只能是没有实用价值的纸上谈兵。AlphaGo的核心技术有:(1) 深度学习:学习了人类选手3000万步的下法[10] (2) 强化学习:每天自我对局100万局 (3) 蒙特卡洛树搜索:在比赛现场通过大量模拟对战判断局势。倘若是用50年前的电脑,哪怕是在这50年间电脑的性能提高了50倍(也就是一个稳定的线性增长),AlphaGo也只能(1) 学习人类顶尖高手的一盘棋,(2) 每天自我对局1局,(3) 临场判断时,要避免超时认输,便只能昏招迭出。这样的AlphaGo,算法的精妙程度不减,但却不可能挑战人类职业选手,更不必提战胜人类顶尖选手了。

    另外还有互联网,以及互联网上承载的各种服务。试想一下,如果找出一台30年前的电脑上网试试看,最多只能显示些文字内容;如果找一台20年前的电脑上网试试看,看视频如同看幻灯片。更不要提50年前的电脑,哪怕是性能提高了50倍。如果摩尔定律不成立,无论是上爱奇艺追剧,还是出门查百度地图,或是让Siri安排些日常事项,我们今天习以为常的互联网,都会变成天方夜谭。电脑游戏会不会出现?俄罗斯方块或是贪吃蛇,这些是可以实现的。但”少年网吧打游戏三天三夜不幸猝死”?这就杞人忧天了。

    我们今天的生活很大程度上要归功于摩尔定律。而笔者作为一个IT行业未来的从业者,就更是对摩尔定律心存感激。因为摩尔定律让计算机的应用越来越丰富,也让这个行业有了越来越多的工作机会。可以说,一切广泛应用了计算机的行业,都要感谢摩尔定律,因为是摩尔定律让计算机变得如此强大。

    危机渐现的今天

    在摩尔定律的带领下,计算机的性能在50年间提高了不止百万倍。这指数级的技术进步背后,绝不是上帝的旨意,而是科学家的辛勤工作。过去几十年间,让摩尔定律一路走到今天的,有如下这些新技术[11]:

    • 集成电路的发明 (1958)
    • CMOS工艺 (1963)
    • 动态随机访问存储(DRAM) (1967)
    • 化学增幅型抗蚀剂 (1980)
    • 深紫外准分子激光蚀刻 (1980)
    • 化学机械平坦化 (1980)
    • 高介电常数闸极介电层 (2007) [12]
    • 多闸极晶体管 (2011) [13]
    • ……

    摩尔定律一路走来,依靠的还是先后出现的一项项新技术。但摩尔定律终究不是物理定律,并不能证明摩尔定律将永远成立。实际上,如今摩尔定律已经显出了颓势。Intel过去几十年坚持的两年的处理器更新周期,如今不得不放缓至两年半[14]。有人怪Intel的主要竞争对手AMD不争气,让Intel缺乏了改进产品的动力。但实际上,人终究战胜不了物理定律,摩尔定律在物理定律面前也显得无力。物质不能无限细分,宏观世界的物理性质,到了一个个原子的尺度就不再适用。如果要摩尔定律仍然成立,就需要不断提高晶体管集成度,也就是半导体行业的所谓制程。从65nm,到45nm,到32nm,到22nm,到14nm,再到如今的10nm,制程可以无限制地缩小下去吗?不能,因为原子有大小,物质不能无限细分,摩尔定律注定要碰到天花板。

    未来路在何方

    看到摩尔定律如今的艰难处境,IT行业最应该感到恐慌。如果摩尔定律崩塌了,IT行业还能维持今天(以及过去50年间)的飞速发展吗?正在进行中的第四次工业革命,是否也将在不远的未来由进行时变成了完成时?这对于IT行业的从业者,也包括计算机专业的学生,都是不愿意看到的局面。

    摩尔定律在过去50年间之所以能保持生命力,完全可以归功于电子学、材料学、物理学的新进展。没错,计算机科学家只是坐享其成,真正支撑着摩尔定律的一群人,并不从事计算机科学的研究。既然如此,如果这一群人充分发挥聪明才智,有没有可能让摩尔定律的生命延续下去?近些年的新进展让我们充满希望[15]:

    • 无接面晶体管 (2010)
    • 单电子晶体管 (2011)
    • 单原子晶体管 (2012)
    • 类脑芯片 (2014)
    • 硅锗晶体管 (2015)
    • 3D记忆体 (2015)
    • ……

    如果说期待电子学、材料学、物理学的新进展,对于计算机科学家而言算是求助于人,那么有没有求助于己的做法呢?还是回到前段时间引起广泛关注的AlphaGo,它让人们联想起19年前战胜卡斯帕罗夫的深蓝。从深蓝到AlphaGo,如果按照摩尔定律对计算机的性能每两年翻一番的预测,计算机的性能在19年间提高了千倍。但从深蓝采用的相对暴力的alpha-beta剪枝算法,到AlphaGo采用的更为精巧的深度学习,解决问题的复杂度提高了一个天文数字[16](按照一个粗略的估计,约为10126)。计算机科学家与其苦苦等待电子学、材料学、物理学的新进展,也许不如发挥聪明才智自救。摩尔定律的进步是指数级的,而新算法带来的性能的提升,甚至能远远超过指数级。

    计算机科学的过去要感谢摩尔定律,计算机科学的现在因为摩尔定律的步履维艰而感到紧张。至于计算机科学的未来,是尽可能为摩尔定律续命,还是彻底放弃摩尔定律?无论哪一条路,都有难关需要突破。为摩尔定律续命是求助于人,而放弃摩尔定律,争取算法突破则是求助于己。但无论通过哪一条途径,如果能延续过去50年由摩尔定律带来的,信息技术的飞速发展,不只是对于IT行业,对于整个人类社会都有着积极的意义。

    参考文献

    [1] Moore’s law – Wikipedia, the free encyclopedia

    https://en.wikipedia.org/wiki/Moore%27s_law

    [2] 技术进步 – MBA智库百科

    http://wiki.mbalib.com/wiki/%E6%8A%80%E6%9C%AF%E8%BF%9B%E6%AD%A5#.E6.8A.80.E6.9C.AF.E8.BF.9B.E6.AD.A5.E5.AF.B9.E7.BB.8F.E6.B5.8E.E5.A2.9E.E9.95.BF.E7.9A.84.E4.BD.9C.E7.94.A8.E7.9A.84.E7.90.86.E8.AE.BA.E5.88.86.E6.9E.90

    [3] Information Revolution – Wikipedia, the free encyclopedia

    https://en.wikipedia.org/wiki/Information_revolution

    [4] 每秒浮点运算次数 – 维基百科,自由的百科全书

    https://zh.wikipedia.org/wiki/%E6%AF%8F%E7%A7%92%E6%B5%AE%E9%BB%9E%E9%81%8B%E7%AE%97%E6%AC%A1%E6%95%B8

    [5] Intel 8087 – Wikipedia, the free encyclopedia

    https://en.wikipedia.org/wiki/Intel_8087

    [6] FLOPS – Wikipedia, the free encyclopedia

    https://en.wikipedia.org/wiki/FLOPS

    [7] 索尼:Oculus Rift 确实 VR 效果更好,但 PS VR 更适合大众

    http://cn.engadget.com/2016/03/10/sony-playstation-vr-oculus-rift/

    [8] OpenCV – Wikipedia, the free encyclopedia

    https://en.wikipedia.org/wiki/OpenCV

    [9] 大疆发布精灵Phantom 4,引入”计算机视觉”_36氪

    http://36kr.com/p/5043959.html

    [10] Official Google Blog: AlphaGo: using machine learning to master the ancient game of Go

    https://googleblog.blogspot.com/2016/01/alphago-machine-learning-game-go.html

    [11] Moore’s law – Wikipedia, the free encyclopedia

    https://en.wikipedia.org/wiki/Moore%27s_law#Enabling_factors_in_the_past

    [12] 45nm High-k + Metal Gate Strain-Enhanced Transistors

    ftp://download.intel.com/pressroom/kits/advancedtech/pdfs/VLSI_45nm_HiKMG-paper.pdf

    [13] Intel® 22 nm Technology

    http://www.intel.com/content/www/us/en/silicon-innovations/intel-22nm-technology.html

    [14] 摩尔定律开始失效?英特尔下代芯片延后半年推出

    http://cn.engadget.com/2015/07/16/intel-skylake-chips-delayed/

    [15] Moore’s law – Wikipedia, the free encyclopedia

    https://en.wikipedia.org/wiki/Moore%27s_law#Future_trends

    [16] 计算机战胜人类再等100年 围棋变化多过宇宙原子

    http://www.weiqiok.com/news/SINA/2016/01/doc-ifxnzanh0299936.asp

     
  • jinzihao pm12:18 on 2016年10月28日 链接地址 | 回复
    Tags: PHP,   

    晚上七点多钟,准备下楼吃饭,又不想放下正在读的代码…
    没法把电脑带到食堂,用微信把代码发到手机上可读性又太差…
    于是吃完饭就做了这么个东西…用法:
    (1) 在电脑上打开code.jinzihao.me
    (2) 复制代码,粘贴进来,再按PASTE
    (3) 手机扫描二维码
    code_4

     
  • jinzihao pm10:56 on 2016年9月22日 链接地址 | 回复  

    【转】The Design Philosophy of the DARPA Internet Protocols 

    这篇论文从互联网设计之初的几个目标出发,把互联网如此设计的种种考虑都解释清楚了,读完有恍然大悟之感。

    View Fullscreen
     
    • 陈文 下午5:49 on 2016年10月2日 链接地址 | 回复

      你家网站又挂了

    • 陈文 下午6:13 on 2016年11月1日 链接地址 | 回复

      另外这个网站我造了个皮毛,文件全放在谷盘上了,应该比较靠谱https://mini536.lima-city.de/index.php.htm

  • jinzihao pm6:46 on 2016年9月14日 链接地址 | 回复  

    Java大作业兼容服务端 

    1. 安装WordPress
    2. 安装修改版的get-image-from-pos WordPress插件
    3. 安装修改版的json-api WordPress插件
    4. 在json-api设置中启用NewsApp controller
    5. 在Android app源码中以http://<your domain>/api/newsapp/category代替http://assignment.crazz.cn/news/en/category;以http://<your domain>/api/newsapp/query代替http://assignment.crazz.cn/news/query(<your domain>为你的WordPress站点所在域名)
     
  • jinzihao pm6:33 on 2016年8月29日 链接地址 | 回复
    Tags: ,   

    C语言判断奇偶性:i&1和i%2 

    三个月前的一篇文章中,曾经好奇为什么C语言中同样是判断整数奇偶性,在不开编译优化(gcc -O0)的情况下,

    (1) bool isOdd = i & 1;

    (2) bool isOdd = i % 2;

    略快(但并没有快很多)。

    看过反汇编得到的汇编代码,发现即便没有开编译优化选项,编译器对于(2)也没有使用除法指令idiv,从而避免了(2)比(1)慢得多的情况。编译器由(2)编译出的汇编代码的作用,是保存一个临时变量t,如果需要判断奇偶性的数i是正数,则t取0,否则t取1;“i是否为奇数”则可以表示为((i + t) & 1) – t,这样就会比i & 1稍慢(但不会慢很多)。

    实际上(1)对于i为负数的情况会得到错误的结果,因此(2)的一点点额外的时间开销是完全有必要的;如果将上一篇文章main函数里面的int全部改为unsigned int,即使在指定gcc -O0的情况下,编译器也会对(1)和(2)编译出完全相同的汇编代码,即(2)也会被优化为i & 1。

     

     
    • 陈文 下午3:25 on 2016年9月9日 链接地址 | 回复

      你的网站用teleport下载文件只有60k/s,很多文件下载半天也下载不下来

    • 陈文 下午3:26 on 2016年9月9日 链接地址 | 回复

      另外问一下,这个网页http://netmite.com/android/srv/2.0/getapk.php的小玩意怎么放在我的网站上运行

  • jinzihao pm2:28 on 2016年8月20日 链接地址 | 回复
    Tags:   

    缓冲区溢出漏洞的利用 

    注:这篇文章本来是一门课程的(大)作业,由于课程报告题目自选,本文其实就是对CTF中几个很基础的二进制的题写了比较详细的write-up,也算记录了一下自己从零基础开始学习的过程吧。

    0. 写在前面

    操作系统这门课程对系统如何管理内存做了详细的介绍,这是计算机安全的一个重要分支——内存安全的背景知识。我对计算机安全比较感兴趣,而内存安全也是其中绕不开的一个领域。在计算机安全中,内存安全相比起Web安全等领域门槛较高,需要站在操作系统的视角看内存,才能发现潜在的内存漏洞。这学期选了操作系统这门课,也希望能起到“扫盲”的作用,借此机会入门一下内存安全。这篇课程报告主要关注内存安全问题中最常规的缓冲区溢出漏洞,总结了缓冲区溢出漏洞的一些入门知识,也算是一个初学者的一点学习笔记。

    1. 什么是缓冲区溢出漏洞

    这是一个很难一言以蔽之的概念,维基百科的描述如下:

    缓冲区溢出(buffer overflow),是针对程序设计缺陷,向程序输入缓冲区写入使之溢出的内容(通常是超过缓冲区能保存的最大数据量的数据),从而破坏程序运行、并获取程序乃至系统的控制权。[1]

    而缓冲区溢出漏洞的利用,则是通过精心构造的输入数据,向内存的特定位置写入特定信息,进而使程序运行发生异常。注意,这里的异常是对于程序开发者而言的,对于攻击者而言则是预期结果。

    利用缓冲区溢出漏洞的一般流程如下:

    (1) 使用反编译工具(如IDA)对程序进行反编译

    (2) 分析反编译得到的C语言代码和汇编代码,设计攻击方法

    (3) 按照设计好的攻击方法设计输入数据

    (4) 把设计好的输入数据传入到程序中,获得系统权限

    下面结合几个实例,对缓冲区溢出漏洞做些简要介绍。

    2. 实例1——基本思路

    (本题出自Bluelotus-Exercise题集中的shellcode题目[2])

    使用IDA反编译得到:

    全局变量:

    main函数:

    这段程序的功能是,从stdin(控制台输入)读入1023个字节,存入shellcode变量,然后通过强制类型转换把shellcode变量作为一个无参数、返回int的函数,调用shellcode变量。由于程序指令本质上也是数据,因此只要将合适的数据写入到shellcode变量,便可以使这段程序执行这段数据对应的程序指令。

    shellcode本质上是一段机器码,直接编写难度很大。可以先按照需求编写C语言程序,然后编译,将编译得到的二进制文件用十六进制编辑器打开,便可以得到这段C语言程序对应的机器码。另外,网络上也有很多现成的shellcode,例如本题中可使用这样一段来自EggRun主页的shellcode [3]:

    6a 0b 58 99 52 68 6e 2f 73 68 68 2f 2f 62 69 89 e3 52 53 89 e1 cd 80

    这段用16进制数表示的机器码对应的C语言程序为execve(/bin/sh),在包括Linux在内的类Unix系统中可以启动一个shell,从而可以执行任意命令。

    另外,shell-storm也提供了大量shellcode,可以根据不同的运行环境和预期效果选择不同的shellcode。[4]

    (阅读全文 …)

     
    • 陈文 上午11:04 on 2016年8月21日 链接地址 | 回复

      网站挂了

      • jinzihao 下午5:59 on 2016年8月21日 链接地址 | 回复

        嗯,我也发现了,服务器现在没法访问,明天中午应该可以恢复~

        • 陈文 上午10:16 on 2016年8月23日 链接地址 | 回复

          额,貌似还没我的预览页靠谱(这还是免费服务器)http://mini536.3vkj.net/

        • 陈文 下午2:46 on 2016年8月23日 链接地址 | 回复

          你最近能不能把你的站点文件打包发到我邮箱里,我申请了个更大的空间(10G),带宽也大些,这是我临时做的主页,你可以体会到的https://mini536.lima-city.de/

          • jinzihao 下午11:39 on 2016年8月23日 链接地址 | 回复

            文件过大,没法发邮件,请提高一下你的镜像工具的最大下载文件大小,直接用镜像工具下载更方便一些

            • 陈文 下午10:23 on 2016年9月1日 链接地址

              你的网站用teleport下载文件只有60k/s,很多文件下载半天也下载不下来

          • jinzihao 下午11:54 on 2016年8月23日 链接地址 | 回复

            另外也得说一句,当初刚开始建这个站的时候也是辗转于各种免费空间,但很遗憾没有一个靠得住的。因为这种站特别消耗带宽,也很占硬盘空间,对于主机商绝对是赔本生意,每次过不了多久主机商就会找点麻烦。

    • 陈文 下午3:24 on 2016年9月9日 链接地址 | 回复

      你的网站用teleport下载文件只有60k/s,很多文件下载半天也下载不下来

  • jinzihao pm10:34 on 2016年8月15日 链接地址 | 回复
    Tags:   

    Ubuntu on Windows (Bash on Windows) 初体验 

    如何安装?

    1. 在开始菜单搜索“针对开发人员”:
    bash6

    (阅读全文 …)

     
  • jinzihao pm6:45 on 2016年7月22日 链接地址 | 回复
    Tags: awk, , ,   

    awk的split函数得到的数组下标从1开始,而不是从0开始,和绝大多数编程语言不同(但和BASIC系的语言一致)。
    被这个坑死了…

     
  • jinzihao pm1:56 on 2016年7月22日 链接地址 | 回复
    Tags: bash, , ,   

    这段shell脚本从第一个命令行参数$1指示的文件中每次读取一行,并显示在屏幕上,其中echo也可以换为其他命令。如果直接用$line,最后会多一个换行符,会导致有些程序运行出现异常(这里echo不会出现异常),可以改写为${line:0:${#line}-1}以去掉$line的最后一个字符(即换行符)。

     
  • jinzihao pm12:49 on 2016年7月12日 链接地址 | 回复  

    [转] 道德经新译 

    道可道,非常道。名可名,非常名。无名天地之始;有名万物之母。故常无欲,以观其妙;常有欲,以观其徼。此两者,同出而异名,同谓之玄。玄之又玄,衆妙之门。

    The tao that can be tar(1)ed
    is not the entire Tao.
    The path that can be specified
    is not the Full Path.

    We declare the names
    of all variables and functions.
    Yet the Tao has no type specifier.

    Dynamically binding, you realize the magic.
    Statically binding, you see only the hierarchy.

    Yet magic and hierarchy
    arise from the same source,
    and this source has a null pointer.

    Reference the NULL within NULL,
    it is the gateway to all wizardry.

    天下皆知美之为美,斯恶已。皆知善之为善,斯不善已。故有无相生,难易相成,长短相较,高下相倾,音声相和,前后相随。是以圣人处无为之事,行不言之教;万物作焉而不辞,生而不有。为而不恃,功成而弗居。夫唯弗居,是以不去。

    When users see one GUI as beautiful,
    other user interfaces become ugly.
    When users see some programs as winners,
    other programs become lossage.

    Pointers and NULLs reference each other.
    High level and assembler depend on each other.
    Double and float cast to each other.
    High-endian and low-endian define each other.
    While and until follow each other.

    Therefore the Guru
    programs without doing anything
    and teaches without saying anything.
    Warnings arise and he lets them come;
    processes are swapped and he lets them go.
    He has but doesn’t possess,
    acts but doesn’t expect.
    When his work is done, he deletes it.
    That is why it lasts forever.

    (阅读全文 …)

     
c
写新的
j
下一篇文章/下一个回复
k
前一篇文章/以前的回复
r
回复
e
编辑
o
显示/隐藏 回复
t
回到顶部
l
go to login
h
show/hide help
shift + esc
取消