破解本博客不能部署的问题
试着生成公钥,然后一定要记得把 pubkey 粘贴到 github 的 setting 里然后用ssh ping github ssh -T git@github.com,即使返回错误也不要紧。 改用这个github 的部署地址: repo: git@github.com:magicliang/magicliang.github.io。
Linux hypervisor
hypervisor 可以被认为等于 virtual hardware。他们的出现,可以有效减少硬件服务器数量。 常见的 hypervisor 分成两类: 直接运行在硬件上的,基于内核的虚拟机。 OS as hypervisor。典型例子是 KVM。KVM 是被集成到 Linux 内核之中的完整虚拟化解决方案。 运行于另一个操作系统之上。典型的例子是 QEMU 和 WINE。 hypervisor的实现,总是要映射一些磁盘设备和网络设备的。
MariaDB 调优相关
本文主要摘译自这里。 MySQL 曾经有独立的公司。但那间公司后来被 Sun 微系统公司获取了。 Sun 微系统公司又被 Oracle 获取了。原 MySQL 开发者担心 MySQL 成为闭源软件,因此成立了一家SkySQL 公司维护开源的 MySQL 分支–MariaDB。 MariaDB 支持的存储引擎包括: InnoDB/XtraDB 后者是前者的加强版,属于事务性存储引擎,也叫 ACID-compliant(ACID 遵从的)。XtraDB 是 Percona 开发的存储引擎,整体向下兼容。使用普通的 mysqldump 会耗尽 cpu(因为要把数据库转化成正经的 SQL 语句)。而 xtrabackup 在大库上的备份、还原、冗余都表现得更好(因为像 Oracle 一样是二进制备份吗?)。 TokuDB。另一个事务性存储引擎。以高压缩率著称(最高25倍压缩)。适合小空间存储大数据。 MyISAM。MySQL 上最古老的存储引擎。非事务性存储引擎,只支持表级锁,不支持 MVCC。 SphinxSE。非事务性存储引擎。这名字和古希腊猜谜语的怪兽,斯芬克斯一样。本以上是用...
KOA 初探
KOA 是 express 的进化版。都是被作者玩腻了扔掉的东西。 它简化了各个中间件层面的工作,提供了高级的“糖”,把各个中间件转化为了函数。 123456789101112131415161718192021222324252627282930313233const Koa = require('koa');const app = new Koa();// x-response-timeapp.use(async (ctx, next) => { const start = Date.now(); // 到这里就停住了运行,让下一个中间件函数运行。 await next(); // 从下一个中间件函数那里返回 const ms = Date.now() - start; ctx.set('X-Response-Time', `${ms}ms`);});// loggerapp.use(async (ctx, next) => { ...
把 Unix 的 Domain Socket 转成可本地访问的 TCP 端口
使用管道命令的做法: 1socat -d TCP-LISTEN:2376,range=127.0.0.1/32,reuseaddr,fork UNIX:/var/run/docker.sock 简洁的做法(使用守护进程而不是使用管道命令) 1docker run -d -v /var/run/docker.sock:/var/run/docker.sock -p 127.0.0.1:2375:2375 bobrik/socat TCP-LISTEN:2375,fork UNIX-CONNECT:/var/run/docker.sock 从容器内往外看的主机,对应外部主机就是 127.0.0.1的端口 ping docker.for.mac.localhost 通常结果是192.168.65.1。 值得参考的文: http://brieflyx.me/2015/linux-tools/socat-introduction/
银翼杀手
2049没好人。
JVM 与编译优化
Java 的编译分期,至少可以分为两个阶段(有些情况下还有额外的第三种编译过程): 编译前端(前端编译):把 *.java 变成 *.class 文件的过程。也就是把源语言文件变成中间语言文件的过程。典型的例子有:javac、Eclipse 的 ECJ 的工作过程。 编译后端(后端编译):由 JIT(Just In Time Compiler)把中间语言(字节码)转换成二进制目标体系结构机器码的过程。典型的例子有 HotSpot 的 C1、C2 编译器的工作过程。 AOT(Ahead Of Time)编译器直接把源代码编译成二进制目标体系结构机器码的过程。 早期(编译)优化 javac 自从 1.3 版本已经不再支持 -O 的优化了。所有的优化策略集中到后端编译里。这样没有经过 javac 编译的 JRuby、Jython 程序,也可以享受到 JVM 的优化福利。 javac的编译过程,大致上是: 解析和填充符号表(Parse and Enter)。 注解处理(Annotation Processing,Java 5以后加入的过程)。 分析与字节码生成(Analyze an...
基于栈的虚拟机
基于栈的虚拟机 全景导图 模式总览 # 模式名称 一句话口诀 覆盖场景 1 栈式计算 数据流与控制流分离,操作数隐式传递 JVM字节码执行、表达式求值、递归调用 2 栈帧隔离 每个方法调用独立的执行上下文 方法调用、异常处理、线程隔离 3 指令紧凑 操作数位置编码在指令中,减少指令长度 字节码压缩、跨平台分发 问题定义 为什么选择基于栈的虚拟机架构,而非基于寄存器的架构?这种设计如何影响字节码的生成、执行效率以及跨平台可移植性? 核心概念 虚拟机架构分类 虚拟机按照指令集架构主要分为两类: 基于栈的虚拟机:指令不指定操作数的位置,操作数从栈顶弹出,计算结果压入栈顶 基于寄存器的虚拟机:指令显式指定寄存器编号,操作数从寄存器读取,结果写入寄存器 JVM 采用基于栈的架构,这是其跨平台可移植性的关键设计决策之一。 操作数栈 操作数栈是基于栈虚拟机的核心数据结构。每个线程拥有独立的虚拟机栈,每个方法调用创建一个栈帧,栈帧中包含操作数栈。 操作数栈的特点: 后进先出(LIFO)的数据结构 32位数据占用1个栈单位,64位数据(long、double)占...
思考区块链
区块链是比特币的基础设施。由区块组成链,是为区块链。各个区块链的持有者之间,总是在玩不确定选主的游戏,所以这和所有传统的分布式数据库不同,是一个去中心的数据存储模式。 比特币的区块链是1.0的玩法,以太坊是2.0的玩法。有些人认为 Hyperledger 是3.0的玩法,还有待怀疑。 区块链上的资产,可以是自带的(比特币网络里的比特币,以太坊网络里的以太币),也可以是智能合约定义和约束的。 智能合约是个看起来很美好,实际上只能执行在沙盒里面的东西。曾经在某个IBM程序员的分享里看到过,Hyperledger 的智能合约本质上也是 GO 程序,所以理论上可以做一切事情。但目前没有看到除了调用各种 Shim API 以外的任何用处。比如,如果我们想要用智能合约发出另外一个调用请求,让真实的系统发生转账,如何做到? 很多人都有热思考,人类再也回不到没有比特币的时代了。也有冷思考,区块链的时代还未到来。就目前而言,现在的计算性能真的不足以支撑真实的行业流量,只能养养鸡,运运肉。 也有观点认为,公有链是真命题,而私有链是伪命题。就目前的观察看来,不管是 Hyperledger 还是 Co...
昂贵的异常
抛出问题 Joshua Bloch 在《Effective Java》的 Item 57 里明确地提到过,不要试图用 Exception 的跳转来代替正常的程序控制流。他列举了很多原因,但特别提到了抛出异常会使得整个程序运行变慢。抛出异常远比普通的 return、break 等操作对控制流、数据流的性能影响要大,它就只适合拿来作异常分支的控制语句,而不能拿来编写正常的逻辑。 Throwing exception is expensive. 这句话在 Java 的程序员世界里面已经成为老生常谈,却很少有人谈及到底抛出异常比正常的程序跳转返回慢在哪里,有多慢。"不要滥用异常"好像一个猴子定律,人们知道不能这么做,却不明白为什么不能这么做。 此前读了一位同事写的好文《Java虚拟机是如何处理异常的》,深入地分析了 JVM 对异常跳转的处理过程:JVM 会通过异常表的机制,优化异常抛出和正常返回之间的性能差异。仅从程序计数器的移动上来讲,抛出一个异常对栈帧的弹栈并不比直接返回更昂贵。写在前头的结论是:"try-catch 语句块几乎不会影响程序运行性能!...
