rust

Rust 内存管理

Rust 与其他编程语言相比,最大的亮点就是引入了一套在编译期间,通过静态分析的方式,确定所有对象的作用域与生命周期,从而可以精确的在某个对象不再被使用时,将其销毁,并且不引入任何运行时复杂度。 现代编程语言,对于堆上分配的内存(可以理解为 malloc 出来的内存)进行管理,不外乎两种方式:使用者在代码中显示调用函数,回收这部分内存;或者引入自动的垃圾回收机制,在运行时由程序自动管理。 前者的问题是给代码编写者引入了额外的工作,并且很难避免出 bug。后者的问题是会降低程序性能,尤其是对实时性要求比较高的程序。 值类型与引用类型 现代编程语言,大部分都会把类型分成两种:值类型与引用类型。 值类型一般类似 Java 中的 int / byte

R6300V2 路由器无痛改装风扇

一直在用淘宝上买来的洋垃圾 Netgear R6300V2 做路由器,刷了梅林固件,一直用着好好的,除了有点烫。千兆网线接口配合群晖 NAS,播放 1080P 的流媒体非常流畅。 后来在路由器上装了爱国软件,方便家里所有无线设备进行爱国主义教育。配置很顺利,不过发现路由器越来越烫了,在设置页面看到 CPU 温度飙升到 80C,并且不再上升,似乎已经达到了 CPU 的温度上限,这个时候 CPU 很有可能已经主动降频了。比较担心爱国软件会不会受影响,导致速度变慢,刚好翻到之前给树梅派准备的一个小风扇,准备尝试安装上去。 R6300 拆解很简单,

HiDPI

网易云音乐 Linux 版 HiDPI 支持

网易云音乐之前和深度合作发布过一个 Linux 版本,可惜疏于维护,比如 Qt5 最近升级之后,迷你播放器和系统托盘菜单界面字体全部不能正确显示(显示为“口口”)。 这点可以通过不使用迷你播放器、系统托盘来绕过。但是除此之外,不支持高分屏这点实在是难以接受。 后来摸索了一下,发现网易云音乐 Linux 版是通过 Qt5 来实现的,而其中大部分的界面元素都是通过 Qt 的 WebKit 来渲染的,而 Qt5 目前的 WebKit 实际上是通过 fork 了一个 Chromium

vim

vim 8 内置包管理

作为一个四年的 neovim “老”用户,前段时间尝试从 neovim 迁移到了 vim 8 上。 迁移的原因是,neovim 的主要特性——异步 API ——已经在 vim 8 上实现了。其他的,比如作为一个组建内嵌到其他应用中,目前看来因为种种原因,很难达到理想的目标。将 VimScript 编译到 lua,然后通过内置的 lua 解释器来执行,来达到性能提升,这个目标也遥遥无期,似乎不会被实现了。

OSX 上初步尝试 asp.net 5

去年微软最令开源狗界振奋的消息就是 ASP.NET 的开放与开源这一消息了。 根据微软的介绍,与我之前的一些总结,可以看到 ASP.NET 以及 .NET 平台会有下面几个变化: 代码使用 Apache 协议开源,并且托管于 Github 上。 新的 C# 编译器 Roslyn。 一个新的跨平台的 CLR(对应 Java 平台的 JVM)。 新的项目组织与构建工具KVM。 基础库 corefx。 这些概念都有点让人觉得云深雾绕,仔细研究就会发现,

JavaScript ES7 中使用 async/await 解决回调函数嵌套问题

JavaScript 中最蛋疼的事情莫过于回调函数嵌套问题。以往在浏览器中,因为与服务器通讯是一种比较昂贵的操作,因此比较复杂的业务逻辑往往都放在服务器端,前端 JavaScript 只需要少数几次 AJAX 请求就可拿到全部数据。 但是到了 webapp 风行的时代,前端业务逻辑越来越复杂,往往几个 AJAX 请求之间互有依赖,有些请求依赖前面请求的数据,有些请求需要并行进行。还有在类似 node.js 的后端 JavaScript 环境中,因为需要进行大量 IO 操作,问题更加明显。这个时候使用回调函数来组织代码往往会导致代码难以阅读。 现在比较流行的解决这个问题的方法是使用 Promise,可以将嵌套的回调函数展平。

使用ctypes探索Python Object内部结构

在Python中我们可以直接使用dir函数获取一个对象的内部数据(推荐使用inspect.getmembers,输出内容更为详细),但是想知道这个对象在内存级别上的结构时此方法就无能为力了。 常用的一个Python实现Cpython中,一个对象的实现(PyObject)其实是一个结构体。那要探索结构体的方法就很多了,比如重新编译解释器,在其中输出log,或者直接使用gdb。 还有另外一个方案,就是使用内置的ctypes。ctypes可以将任意一段数据转换为C的结构体,处理PyObject当然也没问题啦。 PyObject的定义在object.h当中,在2.7版本,并且没有定义Py_TRACE_REFS的情况下,将宏展开后是这个样子: typedef struct _object { Py_ssize_t ob_refcnt;

使用libevent实现wsgi server

这年头wsgi server满天飞,主流都是多进程+异步的形式,纯C实现的也不少。 libevent是C语言的一个异步网络框架,有内置对http的支持,刚好拿来练手,于是就造了个轮子,C语言实现的wsgi server。源码在这里。 依赖libevent2和python2.7,在Ubuntu下只要 > sudo apt-get install python2.7-dev > sudo apt-get install libevent-dev 即可满足依赖,目前只支持Python2.7。 将wsgi application的函数名命名为application,放在ngru路径下,命名为app.

Lizpop介绍

简介 实现一个Lisp方言实在是太简单了,尤其是作为方言之一的Scheme,所以各个语言版本的Lisp实现层出不穷,Python平台上也是如此。最著名的当属Peter Norvig的lis.py。 其中最靠谱的当属clojurepy,直接将源代码编译为Python字节码执行,无论是速度还是与Python库的互通性都是无与伦比。不过Scheme就没这么靠谱的实现了,大部分都是个简单的Demo,或者没办法调用Python代码,或者很多特性没实现。 Lizpop相对不错一些,不过没有官网和文档,只有个简单的README,并且到目前位置代码已经一年没有更新了。看名字作者是个日本人,不知道以后会不会维护下去。 安装与运行 用pip的同学就简单了,直接pip install lizpop即可。 不过lizpop并没有提供可执行文件,需要用python -m lizpop.run来运行。不带参数直接进入REPL,带上文件名的话会执行指定文件。

Pickle——基于栈的编程语言

Python的pickle模块是个相当方便的序列化数据的方法。但它究竟是如何运行的,对于很多人来说非常神秘。实际上它很简单。pickle的输出结果其实是一段可以生成Python数据结构的程序代码。一门功能有限的基于栈的语言可以拿来写这些代码。这里说的功能有限,但仍然可以写类似for循环和if判断等语句。并且学起来还蛮带感的。 这篇文章里会用下面这个简单的解释器来从pickle对象中读取数据。把下面的代码拷到本地文件中: #!/usr/bin/python import code import pickle import sys sys.ps1 = "pik> " sys.ps2 = "...> " banner = "

跳过Python源代码生成PythonVM字节码

Python虽然被冠以脚本语言之名,但是事实上在运行的时候也是需要编译步骤的,与python源代码同名的.pyc文件既是编译后的结果,类似Java的字节码。 同时与Java相比,Python的字节码要更加“高级”,因此编译速度是非常之快的,几乎很少感觉到编译消耗的时间,所以往往将编译与执行的步骤合并,不需要手动进行编译。在输入python xxx.py的时候,解释器在内存中将源代码解析生成字节码,并直接执行。但编译的过程毕竟还是有开销的,因此直接将字节码保存在文件中作为缓存,方便下次使用,保存的文件就是pyc文件。 因为有.pyc文件的存在,就有可能绕开Python前端编译器来自己生成字节码交给解释器执行,甚至将自己的语言编译为字节码,就像JVM上的Scala、Clojure一样。 .pyc文件结构 首先要搞明白.pyc文件的内容,其实内容相当简单,文件前四个字节是Python Magic