分类
业界标准 基础知识 神奇的互联网

互联网中的跨域资源共享(CORS)策略

本文参考了来自 MDN Web Docs 的诸多内容。

网站开发者在开发调试过程中常会遇到有关浏览器阻止对跨域资源(Cross-Origin Resource,COR)进行任意访问的问题:当位于某个域(如 example.com)的网站想要去访问位于另一个域(比如 user.example.com)的资源时,同源访问(跨域资源共享)的相关策略便会生效。在上例中,开发者或许只是想动态拉取位于 user.example.com/user.json 的用户列表文件,用于在网页中向用户展示,而现代浏览器的跨域资源共享(Cross-Origin Resource Sharing,CORS)策略却禁止了这种访问方式。发生了什么?

分类
生活与世界 观点与视角

探索发现之旅——我的二零二零年

本来这个月要写的博文已经有好几篇排好期,奈何最近工作上的事情实在是太忙,而我又不希望在自己的博客里出现任何一篇仅仅算是“凑合”的文章。想来想去,干脆总结一下自己的二零二零年,顺便向大家分享我最近的思考、体验和感悟。

折叠北京

郝景芳老师曾经有一部获得雨果奖的中篇小说《北京折叠》,构造了一个不同空间、不同阶层的北京。而对于我,一名生活在这个城市逾二十载的“北京土著”来说,北京——更像是一个将多个时空重叠在一起的城市。每个人都常出没于其中一、两个空间里。而这座超大型城市利用它的纵深把不同时空的人隔阂来开,将他们割裂成了几个不同的世界。

京港地铁 14 号线将台站,等待出站上班的人群,摄于 2019 年春
分类
Linux 业界构件

基于 Ubuntu 20.04 系统使用 KVM+CloudInit 创建虚拟机

看,是大盘鸡!

基于内核的虚拟机(Kernel-based Virtual Machine,KVM)是一项用于在受支持的硬件设备上执行硬件辅助完全虚拟化任务的解决方案。如果有一天你像我一样为如何充分利用一台支持虚拟化技术的独立服务器而烦恼,请考虑使用 KVM 技术拆分你的服务器。

本文以具有多 IPv4 地址的主机为例,使用基于 Cloud-init 配置文件的方法配置基于 KVM 虚拟化技术的 VMs。

虚拟化技术

在特别针对 KVM 技术进行讨论以前,回顾我们使用过的各种虚拟化技术对后续内容的理解是有意义的。计算机中的虚拟化技术是指将宿主计算机以多台或者一台完全不同的计算机的形式呈现出来。

分类
有趣的投资学

做一颗合格的鲜嫩韭菜

……这么多年以来,无论国际形势如何变化,中国的股民总是不忘初心,为祖国提供流动性……

@李永乐老师,《看懂了这个,你再去炒股……

当你决定暂时不要花掉自己钱包中正在日益增加的货币财产时,你也许更感兴趣将它们放到“更有价值的领域”来产生额外收益:通过牺牲现在享用这些资产换取物品或者服务的能力,你希望将来能够于此获得更多额外的收益,这样的行为被称为投资。金融市场可以使个人的现实消费与现实收入相分离。

2020年7月中旬我们又经历了国内股票市场的一次剧烈波动。有钱没处花的我自寻渠道投入了国内 A 股市场的怀抱,正式成为了一颗新鲜的韭菜。

分类
Go 程序设计语言

Go 语言中的错误处理

学习 Go 语言之前,我认为为程序员提供错误与异常处理的最方便的语言是 Python;学习 Go 语言之后,我的看法没有任何改变……

@DGideas

本文参考了 @ethancai 的这篇文章@davecheney 在 Gocon Spring 2016 上的这篇演讲稿,以及若干位于 golang.org 上的博客文章和文档。

Go 语言有着异于其他程序设计语言的错误处理体验。要说 Go 程序设计语言的一大特色,恐怕就是它频繁出现的 if err != nil 语句块了。得益于 Go 语言函数的多返回值(multiple results)特性,一个不一定总能成功执行的函数可以依靠一个类型为 error 的返回值表示其执行过程是否处于异常状态,例如:

f, err := os.Open("filename.ext")
if err != nil {
	log.Fatal(err)
}

这种传递机制可以帮助 Go 语言程序员(尤其是函数的设计者)在不重载函数返回结果本身意义的情况下,额外向函数的调用者传达“函数调用是否符合预期”的信息。事实上,Go 语言的设计者认为使用类似 try-catch-finally 语句块进行错误与异常处理会导致代码层次繁琐。从语言层面要求程序员显式处理错误有助于提升程序的健壮性。

为了在 Go 语言中处理错误,我们需要了解有关 error 类型的更多信息。

分类
Linux 业界构件

在 Ubuntu 20.04 LTS 上搭建 Hadoop 环境

在古时候,人们用牛来拉重物。当一头牛拉不动一根原木时,人们从来没有考虑过要想方设法培育出一种更强壮的牛……

Grace Murray Hopper,美国计算机科学家

在 Apache 基金会的项目中,除了历史悠久、广泛使用的 httpd 网页服务器以外,在业界使用最广泛的技术可能就非 Hadoop 莫属了。Hadoop 提供了针对海量数据可靠的、可拓展的分布式计算解决方案。这些年来我们总能听到一些关于“Hadoop 已死?”的论调。但是来自各个云服务提供商的产品表明,Hadoop 及周边生态仍然在不断良性发展,并且持续触及至更多领域之中。时至今日,Hadoop 仍然是分布式处理海量数据的最佳解决方案。

分类
C++ 基础知识 程序设计语言

为什么要有指针和引用类型?

……显然,我们能通过名字使用对象。然而在 C++ 中,大多数对象都“有身份”;也就是说对象位于内存的某个地址中,如果我们知道对象的地址和类型,就能访问它……

翻译自 Bjarne Stroustrup 《The C++ Programming Language》(Fourth Edition),Chapter 7.

@Lollipop9z 同学在上次与我讨论时提出了这个很有趣的问题。由于 lollipop 之前有学习 Python 程序设计语言的背景,所以对于 C++ 等语言中为何提供这些特性感到困惑。事实上,很多学习过包含指针和/或引用概念程序设计语言的同学也仍然对于为什么会存在这些语言元素的原因缺乏思考。下述代码以 C++ 为例。

感谢 @szouc 对于数组声明与数组类型隐式转换方面的指正。

为什么要有指针?

现代通用电子计算机在程序运行时将所需数据存储于内部存储器(内存)中。通过机器可理解的语言,我们能令电子计算机存取内存中某一指定位置数据,就比如编写一个统计字符串字面量中含有多少个英文小写字母 a 的程序一样,这个程序将用于计数的数据存储于内存空间中的某个位置中。像这样的操作使用是如此频繁,以至于高级程序设计语言专门为程序员提供一种被称为“变量”的语言概念。

分类
元博客

你好,世界!

我最早开设个人博客的经历要追溯到 2009 年,记得当时第九驿站提供了免费的个人空间服务。对于刚上初中的我来说,虽然网站空间位于美国,并且走的是(现在看起来)速度极其慢的线路。但当时在本地写好网页文件,然后再用 FTP 客户端将网页文件拖放到服务器上的有趣体验仍然让我难忘。

时光飞逝,如今对于已经从大学科班毕业的我来说,经历了多年的计算机科学与技术方面的学习,以及在行业中(实习)混迹的经历,总算开始有一种从“接收知识”到“向别人输出知识”的冲动。就读大学期间产生的些许零碎想法,也终于在这几年的反思总结中形成体系,能够以高质量且系统化的方式向大家分享。

2020年秋季,于北京市门头沟区

一直有很多同学通过各种渠道(面基、邮件、Telegram 等)跟我进行互相交流。在和这么多同学进行高质量的交流后,我发现个人力量毕竟有限,面对面的沟通终究只能帮助到少数人。得益于互联网,我愿意把自己对于知识的思考、想法、创造以及生活的点滴通过个人独立博客的形式分享给更多人。

个人力量终究有限,就像没有系统能够 100% 正确工作一样,尤其对于技术类的文章,我的行文中肯定会出现不准确甚至错误的情况。如遇问题,希望大家通过博客展开菜单中提供的各种联系渠道和我讨论,感激不尽。

王万霖(@DGideas),2020年5月4日

2020年9月更新