0%

前言

在4.15日加州全面放开打疫苗前,花时间整理了一下各个疫苗的相关数据跟结论。虽然我没有任何医学或者生物学背景,但是我毕竟也有博士学位,一点基础的科研思维还是有的,看这些东西,对我本人是有益的,可以让我知道what to expect以及what not to expect。我把我自己读paper的笔记写成文章,除了自己日后查阅方便以外,一方面是希望省去有同样需求的人从头找文献的一丁点麻烦;另一方面则是如果有医学专业的人士看到我的笔记,可以帮我指出其中的不足或者疏忽,这样子也能加深我本人的理解。

本人并非医学专业,所以请带着批判性思维来阅读本文章。如发现错误或者遗漏,欢迎指正。

简介

(TLDR可以直接跳过文章看总结。)

本文主要总结的Moderna、辉瑞、强生三种疫苗的三期临床数据,以及一些跟副作用以及有效性相关的后续研究。这些研究里面,最常用的有两种研究手段:

一种是通过临床实验,得出统计规律。这种研究一般来讲,就是让大量的人注射疫苗。然后统计一下这些人里面,都有谁得了新冠。然后就可以记录下来,得了新冠的人里面,有多少是接种了疫苗的,多少是没有接种疫苗的,以及多少人会接种部位疼痛,多少人会发烧,等等数据。最后根据数据就能算出来比例。

另一种则是病毒中和实验。这种实验就有点类似中学化学里面学的滴定实验。这种实验的做法,是取接种者的血浆,然后拿着这些血浆来中和病毒。如果疫苗非常有效的话,血浆中会含有大量的抗体。这种情况下,血浆是可以直接中和掉所有的病毒的。这个时候,要定量研究血浆的有效性,就需要对血浆进行稀释,一直稀释到血浆只能中和一半病毒为止。这个时候稀释的倍数,就叫做滴度(titer)。显然,血浆中的抗体浓度越高/抗体越有效,需要稀释的倍数就更高,滴度就更大。对于变种病毒来讲,变种导致抗体的有效性降低了,对应到这个实验上,就是滴度降低了。

Read more »

This is my note for reading PyTorch’s JIT source. We begin by looking at torch.jit.script to find the frontend that compiles the Python code into PyTorch’s tree views, and the backend that compiles tree views to graph. We also read the structure of the internal representation of PyTorch’s graph. Finally we go to graph executor to look at how the computation graph is further compiled into instructions and how the action of these instructions are defined and executed.

Read more »

讲一下我自己给自己搭建的网络环境吧,好友很久之前就劝我写了,但那时候工作生活乐趣无穷,没心思写博客,反倒最近烦心事多了,想找点东西换换脑子转移注意力,就跑来写博客了。其实我最早开始玩网络,是因为被学校无端指责我用P2P软件,我去跟他们理论无果,他们拒绝向我提供任何的报告,而我也拒绝向他们认错,于是他们把我家里网“封锁”了,而我在寻求一种穿透他们的方法。经过不断的尝试与探索,我自己的网络结构也演化了好几代,反倒变得比被学校断网之前方便了好多,也引入了IPv6的支持,这样我就可以随时用手机访问自己家里任何设备的任何端口了。

我之所以搭建自己的网络环境,主要是为了提供如下的功能:

  • 把我在世界各地的局域网连接到一起去,让他们互相之间能够访问到,并且为这些网络提供可路由的公网IPv6地址。
  • 突破一些封锁,比如学校的DHNet给我的断网,以及天朝的GFW。
  • 在外面的便携设备,可以随时连接进来,获得可路由的公网IPv6地址。
Read more »

This is my note for reading PyTorch’s JIT source. We begin by looking at torch.jit.script and torch.jit.script_method to find the frontend that compiles the Python code into PyTorch’s tree views, and the backend that compiles tree views to graph. We also read the structure of the internal representation of PyTorch’s graph. Finally we go to graph executor to look at how the computation graph is further compiled into instructions and how the action of these instructions are defined and executed.

Read more »

In recent years, docker has created a containerization boom around the world by providing a way to easily create and run application containers. Containers save people from dependency hell by packaging the software with the operating environment it needs. Although docker was designed to be neither an operating system container nor an operating system running directly on the bare metal, docker’s powerful suite of tools will also give us tremendous convenience in managing our desktop system running on bare metal.

Why using docker image as a desktop system is a good idea? Let’s begin with talking about the inconvenience of the normal way how people are managing their desktop systems. Nowadays, most of us has more than one computer, and we want these computers to be “consistent”. Here when I say “consistent”, I mean, for example, I begin writing a document on one computer (say, at home) and am unable to finish it before having to switch to another computer (say, at work). I don’t want to worry about copying it manually to another computer, instead, I want it to be able to magically appear there so I can access it at any time. This is exactly what cloud sync disks like Dropbox do for us. However, for geeks, what cloud sync disks do is far from enough. For example, you are busy with a project, which uses a number of programming languages, libraries, and a bunch of GUI and non-GUI tools. As you keep trying new things, you install new tools and change configurations continually on your system. It would be nice if these changes can be synced across different devices automatically so that when you install something you won’t need to install it one by one on each of your computers.

Read more »

博主一直都很喜欢思考怎样管理装在自己电脑上的桌面系统,这篇算是前作能当主力,能入虚拟机,还能随时打包带走,Linux就是这么强大的后续探索吧。

近些年来,Docker由于提供了一套非常方便地创建并运行应用容器的方法,而在全球掀起了一股容器化的热潮。容器通过将软件及其所需要的运行环境一同打包带走,从而将人们从依赖的苦海中拯救出来。虽然Docker设计的初衷并不是操作系统容器,更不是一个直接运行在裸机上的操作系统,但是docker这套强大的工具也会给我们管理操作系统带来巨大的便利。

为什么要用Docker镜像当作桌面系统?这就要从普通桌面系统的不方便之处说起。通常我们都拥有不止一台电脑,我们希望这些电脑能够保持一致。这里所说的“一致”,用一个例子来讲,就是我在一台电脑上编辑了一半的文件,不需要认为拷贝到另一台电脑上,而是直接打开电脑就能编辑。如果这个文件只是一个纯文本文件,或者一个Microsoft Word文档,那么实现这个一致性非常简单:把文件扔到Dropbox之类的云同步盘就好。然而对于专业用户来讲,这种一致性的保持并非单纯的扔到Dropbox里面那么简单:比如说你最近忙于一个项目,这个项目要用到若干编程语言,然后在电脑里装了一堆库,一堆工具软件,有图形界面的,也有命令行的。在工作的过程中,你有可能不断安装新的工具,或者决定弃用某个之前计划使用的库或者工具。要让你的工作在你的若干台电脑上都能工作,就要一直维护不同机器的环境的一致性:在一台机器上安装的工具,要在所有机器上重新安装一遍。在一台机器上升级了的库,要在所有机器上都升级,稍微有所差池,就有可能出现某个脚本/程序在一台机器上跑的好好的,在另一台机器上却无法运行的问题。

Read more »

Introduction

I’m recently writing something that uses Linux’s firewall framework to do some non-standard operations packets. Extending the kernel is required for my task but unfortunately documentations about this topic I find online are quite dated. These old documents are mainly for kernel version 2.4 and earlier 2.6.x, in which new matches or targets are registered by calling ipt_register_match and ipt_register_target. The related subsystem of kernel has changed a lot since then, and iptables has been replaced by nftables. Although we can use xt_register_match and xt_register_target instead, I prefer to move to the new nftables framework. Due to the lack of documentation, I have to dig into the source code of Linux kernel to figure out how things works, and this post is the note for that. As Linus Torvalds says in 2008, “Linux is evolution, not intelligent design”, the design and API of nftables might be changing very fast. So I’m not only trying to make a brief review on the design or API of nftables. But also, this post will serve as a guide on how to find the correct way of doing things by reading the kernel source code. The eager reader can go directly to the summary section. This post is based on kernel version 4.13, the most recent version when this post is started writing.

Here in this post, we will solve a toy problem: monitor all outgoing TCP traffic from port 80, if it contains the string given by the user, log it. I don’t assume any knowledge in the design or kernel API of nftables, but I do assume the reader has read and understand well the official documents on how to use nftables.

Read more »

计算学习理论中的一类很重要的问题是研究训练集训练出来的模型在训练集以外的表现,即泛化误差(generalization error)。我们来考虑这样一个问题,我们想要拟合目标函数$f:\mathcal{X}\to\mathbb{R}$,为此,我们选取假设空间(hypothesis space) $\mathcal{H}$,然后通过某种方法获得一个训练集$S=\left\{(x_1,f(x_1)),(x_2,f(x_2)),\ldots(x_m,f(x_m))\right\}$。这个训练集被认为是从$\mathcal{X}$上的概率分布$\mathcal{P}$进行独立同分布的抽样而来。获得训练集以后,我们把训练集作为输入输送给某个优化算法$\mathscr{A}$。这个算法本身可能是带有随机性的,比如SGD,但是如果把算法使用的随机数发生器生成的随机数也看成算法的输入的话,那么这个优化算法就没有任何随机可言,给定一个训练集$S$以及随机数$\theta$,算法输出唯一的$h=\mathscr{A}(S,\theta)\in\mathcal{H}$。如果我们使用$\mathfrak{l}:\mathbb{R}\times\mathbb{R}\to\mathbb{R}_{\ge0}$作为损失函数来衡量$f$与$g$的差异的话,我们关心的是,当我们的训练误差为$\hat{\mathrm{E}}_{x\in S}[\mathfrak{l}(h(x),f(x))]:=\frac{1}{m}\sum_{i=1}^m\mathfrak{l}(h(x_i),f(x_i))$时,我们有多大的置信度来保证这个算法的输出的$h$的泛化误差$\mathrm{E}_{x\sim\mathcal{P}}[\mathfrak{l}(h(x),f(x))]$比训练误差不会高出超过$\epsilon$,即
$$\mathrm{E}_{x\sim\mathcal{P}}[\mathfrak{l}(h(x),f(x))]-\hat{\mathrm{E}}_{x\in S}[\mathfrak{l}(h(x),f(x))]\leq\epsilon$$

Read more »

版权信息:博主就是本文原创作者,但是本文最早发布于FreeBuf,并属FreeBuf原创奖励计划,如需转载请联系FreeBuf。

故事是这样的,本文作者读书的学校,IT部门要求我们如果使用Windows或者Mac OS要连接学校网络的话,必须安装SafeConnect客户端。这个客户端干的事情就是监视你的系统,确保你安装、启用并及时更新杀毒软件,确保你及时更新电脑上的Flash跟Java,确保你不使用P2P软件。然而我一直很不喜欢这种被监视的感觉,感觉这是侵犯了我的人权,况且我很少用P2P来下载盗版内容,偶尔用P2P一直都是用来下载Linux的安装镜像的,这种宁可错杀一千也不放过一个的做法实在是让人难以忍受。再加上学校的IT部门的人非常官僚,自己还没啥技术,曾经有同学找他们备份数据结果数据没备份成他们反而把分区表给搞坏了,这就让我坚定了跟他们斗争到底的想法,刚好也可以打发业余时光。由于SafeConnect客户端不支持Linux系统,同时学校中Linux用户的数量相当多,所以Linux系统不需要安装任何客户端,直接就能访问网络,这是一个关键性的切入点。

Read more »