JSX
简介 JSX 是点缀着 XML 元素的 JavaScript。它是由 React 这个库最初构思出来的,但又不是专门为了某个库或者框架设计的。它是一种 DSL。 JSX 是 html in JavaScript 的一种很好体现。这里的 XML,实际上还是 html 元素。粗略看下来,和当初 backbone 写 rendertemplate 的函数差不多。要引入 JSX 的语法,在很多场景下都要引入 Babel 这个 transpiler,也就是要搞到工具链满天飞。照抄官网的例子的话,可以看到: 12345678910111213141516171819<!DOCTYPE html> <html> <head> <meta charset="UTF-8" /> <title>Hello React!</title> <script...
Docker 小笔记
记录一些特别容易遗忘的 Docker 知识细节 镜像实际上是文件夹,每个镜像命令会产生出单独的一层。我们删除文件不一定能够删得掉,可删除的文件也只是在联合文件系统里面增加一个“被删除层”。 容器像是集装箱。这通常是启动内部代理的一个方法。docker 寻求的解决方案不是虚拟化,而是进程间的软隔离。123456# 启动 docker 容器docker run -d -p 2222:22 --name 容器名 镜像名# -d 守护容器,就是后台运行,退出命令窗口容器也不会停止# -it 交互式容器 退出命令窗口容器就停止运行了# -p 宿主机端口和容器端口映射# 8081:80 宿主机端口: 容器公开的端口 Docker 同hypervisor的区别是,hypervisor总是起了多个内核。实际上阿里开源的容器技术 pouch,也是基于多 hypervisor 的。 docker inspect 既可以查看容器,也可以查看镜像。用以下的命令单独查看一个属性: 1docker inspect -f...
虚拟机
虚拟机意味着单独的指令集体系结构(ISA Instruction Set Architecture)。
为什么要自建实时计算平台
为什么要自建一个离线平台 可以优化资源利用率。 业务平台应该把精力放在业务上。 什么是实时计算 强调响应时间短(相对于离线计算):毫秒级、亚秒级、秒级。T+1 的报表都是离线计算。 数据的价值随着时间的流逝而迅速降低。 常见技术方案: 流计算 + 实时存储 or 消息队列 流计算 + 实现 OLAP 什么是流式计算 实时且无界。 数据驱动计算,事件触发。 有状态及持续集成。 流计算引擎:Spark Streaming、Flink Streaming、Storm/JStorm、Samza 等。 Spark Streaming 模型 Micro-Batch 模式。看起来是流式处理的,实际上还是一小批一小批处理的。从批处理走到流处理。 最小延时:batch 的处理时间 最大延时:batch interval(通常2s-10s) + batch 处理时间。 使用场景:数据清洗(实时数据通道)、数据 ETL 等。 对于熟悉 Spark 批处理的 RD 非常容易上手。 Flink Streaming Native...
Golang 并发的一些我自己才看得懂的总结
Goroutine 是绿色线程,下面自带调度器。可以在 syscall 进入阻塞状态的时候自动出让 CPU(类似 Java 在进入锁以前自动引入自旋,这实际上是一种抢占式调度—preemptive scheduling),也可以通过runtime.Gosched()主动出让 CPU,调度器还可能无缘由地主动抢占 Goroutine 的时间片(比如已经运行了10ms)。因为是绿色线程,所以可以很便宜地创造百万Goroutine。在 Go 1.5 以后,可以通过 GOMAXPROCS 来使用更多的逻辑 CPU(而不也是系统进程)来利用多核。主线程不是主线程,主线程也是一个 main goroutine。 Go 关键字基本就等同于 Java 中提交一个 Runnable 到 CompletableFuture 的 CommonPool。在没有 Channel 的帮助时,goroutine 几乎可以等同于一个绿色的守护线程。 Go 也是有 mutex 的,但是不提倡使用,用 channel 最好。 share memory by communicating。 channel...
Vim cheatsheet
比较好用的两个 vim 寄存器代码: 1234567#删除全部内容:%d# 在 vim 下,拷贝全部的代码:%y+# 在 mac 的 vim 下,拷贝全部的代码:%w !pbcopy
保险电销与互联网保险
...
系统调用为什么昂贵
系统调用的过程 系统有些高特权的操作,比如访问 IO 设备,修改内核状态,修改其他程序,在rings模型下,只有rings 0才能做得到。用户程序(通常是ring3)在自己的地址空间里面,是没有办法看到这些资源,也就无法修改它们。这时候用户程序就需要request service,发出软(件)中断,让程序trapped 进内核态(通过int 0x80 指令,实际上这不仅仅是进程的状态转换,也是进程的状态转换)。实际上此时的控制权已经交给内核了,内核可以在自己的内核地址空间里面,使用高特权操作,特权操作做完了以后,控制权才交回给用户程序。这个过程就成为syscall。x86 虽然有四层 ring,但通常只使用了0和3层ring。 系统通常提供API或者lib来提供syscall的能力。比如在 Unix-Like系统里,就是glibc。lib提供的函数,通常被称为Wrapper Function。 ...
单核上的多线程-Python中的 GIL
GIL (Global Interpreter Lock)的存在虽然无法利用多核,但是可以勉强让系统在在单核上,任何一个线程使用过多时间片/主动放弃 CPU 的时候,让其他线程上下文切入进来。算是尽量跑满CPU吧。Python中的对象很多都是默认线程安全的,GIL的这种不可见的特性,让很多旧的程序依赖起 GIL,以至于无法从Python中移除掉它。GIL 的存在,让 Python 特别适合跑 Nodejs 爬虫一样的 IO 密集型(IO-bound)任务,反而不适合跑CPU 密集型任务(CPU-bound)。但实际上这种混蛋多线程的形式,恐怕还不如 EventLoop 的 Nodejs,因为多了很多 Context Switch 的代价。
面向对象范式的历史
面向对象,聚讼纷纷。