0%

在 StackOverflow 上流传着这样一份用 Python 获取网卡 IPv4 地址的神秘代码。

1
2
3
4
5
6
7
8
9
10
11
12
import socket
import fcntl
import struct

def get_ip_address(ifname):
s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
return socket.inet_ntoa(fcntl.ioctl(
s.fileno(),
0x8915,
struct.pack('256s', ifname[:15]))[20:24])

get_ip_address('eth0')

但是,很少有人知道这段代码是如何工作的。本文将为你揭开这段代码的神秘面纱。

Read more »

在 HTTP 协议支持的方法中,PUT 和 POST 是比较容易混淆的一对。我们来看看在 RESTful API 中应该如何正确使用这两种方法。

Read more »

2005 年,科普作家 John Gribbin 出版了 Deep Simplicity (《深奥的简洁》) 一书,通过阐述混沌系统理论,为读者提供了认知复杂世界的新工具。作者在序言中说到,一个混沌系统需要满足两个条件:其一,系统状态对初始条件敏感;其二,系统具有反馈机制。总体来说,《深奥的简洁》是一本不错的读物,向读者揭示了一些复杂现象背后共有的简单逻辑。不过我认为,作者的部分论述仅仅停留在了表面现象,甚至有意避开讨论混沌系统的本质。

Read more »

要说关系型数据库的特性,我相信很多人都会想到 ACID 这个词。在 ACID (原子性、一致性、隔离性、持久性) 这四个特性中,最为复杂的是隔离性。在本文中,我们将讨论几种常见的数据库隔离等级,以及它们对数据库应用正确性的影响。


数据库隔离等级概述

所谓数据库的隔离,是指多个事务(transaction)同时发生时,事务之间的相互影响。在理想的情况下,一个事务不应对另一个事务产生副作用。但实践表明,这种数据库的处理速度较慢,若能适当放宽对隔离性的要求,则可以显著增强数据库处理并发事务的能力。

现今通用的数据库隔离等级共分为五级,按隔离性从低到高,分别为:

  1. 未提交读取(read uncommitted)
  2. 已提交读取(read committed)
  3. 可重复读取(repeatable read)
  4. 快照隔离(snapshot isolation)
  5. 可序列化(serializable)

Read more »

2017 年,伴随着比特币和以太币等虚拟货币的暴涨,区块链技术逐渐被越来越多的人知晓。此时,著名即时通讯软件 telegram 高调推出数额巨大的 ICO 计划——telegram open network (TON)。与传统区块链网络相比,TON 在吞吐量、实时性、可扩展性上都引入了突破性的技术,代表了当前区块链技术的巅峰水平。本文将纵览 TON 的整体设计,并探究它实现高性能区块链网络的方法。

Read more »

二月三日,我搭乘飞机回到了离别两年的故土。

三藩机场的候机厅里,有两排座椅格外显眼,那里聚集着一个国内初中生观光团。这些小孩穿着紫色运动衫校服,外面披着鲜亮的橘黄色冲锋衣,观感丝毫没有动画中修学旅行的场景那样和谐。尽管初中生的爸妈通常不会给孩子买游戏机,但这并不影响每个人捧着手机消磨时间。小说和 FIFA 是普遍的,至于屏幕上二次元画风浓烈的那位玩的是不是⎡碧蓝航线⎦,就不得而知了。

Read more »

尽管你可能没有用过,但手机和电脑,都有一个恢复出厂设置的选项。如果不幸把一切搞得一团糟,还有机会可以重新来过。那么,如果把 git 仓库搞成了一团糟,能不能也恢复出厂设置,变成和远程仓库一模一样的内容呢?

你的心中可能已经有了一个答案:

1
2
3
cd ..
rm -rf <git_repo>
git clone <git_repo>

与这种费时费力的做法相比,其实还有一个更加优雅的方案。

Read more »

紧是很重要的

做过这样一个梦。我坐在如中学时代一样的教室里。不知是怎么了,我好像倒了霉运,一再被老师点名回答问题。问题的形式很简单:把日文读出来,再翻译成中文。倘若这日文是写在黑板上的,就算是我这种不怎么背单词的家伙,也能估摸着读个差不多。然而这些日文,不,这绝对是一种装置艺术,是一大堆仪器在几个化学实验铁架台上拼接出来的。我尚不清楚它们是何时矗立在那里的,或许只是全息投影下的幻觉,但现在更重要的是弄懂应该怎么读。老师不耐烦地瞅了瞅我,又叫起了另一名学生——他毫不费力地念了出来,就如同是事先录制好的答案一样。我恨不得找个理由离开教室,却只能一动不动地站在那里……

Read more »

你可能用过 Dropbox 和百度网盘之类的云存储服务,不过 AWS S3 才是当今世界上最大的云存储。虽然 S3 服务的对象多为企业用户,你同样可以使用它搭建个人云存储平台。在这篇文章中,我们来看看 S3 API 的配置,以及如何使用 s3cmd 工具与 S3 存储服务交互。

Read more »

Java 8 提供了一组称为 stream 的 API,用于处理可遍历的流式数据。stream API 的设计,充分融合了函数式编程的理念,极大简化了代码量。

我们来讲解如何将常用的 stream API 与相应的 functional interface (函数式接口)配合使用,达成数据处理的目的。

Read more »

UNIX/Linux 系统有不少好用的工具,用于文本搜索的 grep 或许是其中最常用的工具之一。尽管平时称心如意,在面对数百万行的代码库时,grep 的用户体验实在堪忧。还好,我们有 the silver searcher (即 ag)这样迅捷的替代品,从此再也不必经历漫长的等待了。我建议,在日常操作中,可以用 ag 完全取代 grep

下面来介绍 the silver searcher 的安装和使用方法。

Read more »

故事背景

NSX 是 VMware 的支柱产品之一,旨在为企业提供一体化网络虚拟化方案。NSX vSphere 已在市场站稳了脚跟,公司正逐步把开发力量转移至它的后继者:NSX Transformers。去年发布的 Transformers 1.1 版本 [Crosshairs] 正在某家合作伙伴服役,今年推出的 2.0 版本 [Dropkick] 预计会在十余家企业推广试用。

NSX Transformers 曾经使用了 Pivotal 出品的 NoSQL 数据存储套件 GemFire。由于商业调整,GemFire 的核心组件被捐给了 Apache 基金会,产品开发陷入停顿。为了避免使用停止维护的产品,我司把目光投向了 VMware Research 编写的开源数据库 CorfuDB,并打算在 Dropkick 完成实装。这半年多的故事,都是围绕更换数据库展开的。

Read more »

HHKB (happy hacking keyboard) 是世界顶级键盘品牌,自 1996 年推出以来畅销至今。与其他键盘不同,HHKB 机身小巧,省略了 F1 - F12 功能键、光标键和 Page Up / Page Down 等功能键,使其整体得以集成在仅仅 60 个按键上。麻雀虽小,五脏俱全,通过调整开关配置键盘布局,我们能使用不同键位组合复现 101 全尺寸键盘的所有功能。

本文提及的键盘配置方案,适用于包括 HHKB Pro 2 在内的大部分现役产品。对 HHKB 机身后方的六个开关,我推荐使用如下的配置:

  • Windows: 开启 1 3 4 号开关
  • MacOS: 开启 2 3 4 号开关

后文将详述采用此配置的理由。

Read more »

Jupyter notebook(原 ipython notebook)是统计、数据分析和机器学习的利器。一般情况下,jupyter notebook 网页应用运行在 http://localhost:8888,用户可以在本地计算机通过浏览器访问和使用。但在某些时候,我们想把 jupyter notebook 应用架设在公开的服务器中,以便获取更强的计算能力和更多的内存,同时省去在每台电脑上安装和配置 jupyter notebook 的过程。

本文以 debian/ubuntu 系统为例,讲解如何安全地搭建 jupyter notebook 服务器,以允许授权用户使用任意浏览器在任意设备上访问这款应用。

Read more »

谈到时间管理,最先映入脑海的恐怕是番茄工作法了。我不是番茄工作法的粉丝,我有一套自己的时间管理工具和方法。简单来说,所有的任务被分成两类:有明确时间期限且耗时较短的,和时间期限模糊或耗时较长的。对于第一类任务,便签/日历/定时提醒就可以胜任;而至于第二类,时间本身变得不那么重要,对任务追踪的要求凸显出来。在各类任务管理工具中,GitHub 的 issue 和 project 给我留下了深刻的印象。即便不是程序员也没关系,我们不需要写一行代码,不需要有提交记录,就能享受那些工具带来的便利。

Read more »

为了防范潜在的 DDOS 攻击,避免经济损失,我在近期升级了本博客的服务器。更新后,服务器实装了 Nginx 自建的 HTTP 限流模块,配合 fail2ban 封杀恶意 IP,可以有效抵御大量并发请求对服务器的干扰。

Read more »

如果你下载了一个 C/C++ 工程的代码,想在 Linux 平台上编译生成可执行文件,应该怎么做呢?理想的情况是这样的:

第一步当然是解压缩了。用 unzip 指令解压 .zip 文件,其它所有奇奇怪怪看不懂的压缩包一般都可以用 tar zxvf 解决掉。

进入工程根目录,输入 ./configure 执行 shell 脚本。这个脚本会检测你的编译环境,并生成合适的 Makefile 文件。

执行 make 开始编译过程。如果想把编译的成果安装到计算机上,有时还可以再加一步 sudo make install

但是,出于种种原因,99%的工程都不会像刚才描述的那样一帆风顺。本文以 ONScripter 为例,还原了编译过程可能会遇到的诸多困难,希望能为你带来些许启发。

Read more »

Windows Thin PC 是微软基于 Windows 7 开发的面向低端电脑的操作系统。Thin PC 的更新支持周期和 Windows 7 一样长,并具有多项优点。Thin PC 的体量小巧,完全安装仅占用 4 GB 磁盘空间;它集成了 BitLocker 等多项 Windows 7 旗舰版才具备的功能;它的破解方式也相当简单。尽管 Thin PC 对内存使用数量做出了限制(最多可以引用约 3 GB 的内存),但这不能阻止它成为 Windows 虚拟机的理想选择。

Read more »