Articles
Articles copied to clipboard
经验文章
递归 `(recursion)` 是很多算法都使用的一种编程方法。 ## 理解递归 假设我们要实现数学里面计算阶乘的例子, 如: ``` 1 2x1 3x2x1 4x3x2x1 5x4x3x2x1 6x5x4x3x2x1 ``` 第一种方法我们采用是 while 循环,累乘代码下去: ``` function factorial (number) { let result = 1 while (number >...
Mac 使用 bash 做为默认的 shell,MAC OS 环境配置文件如下: ```bash # 系统级别 /etc/profile /etc/paths /etc/bashrc # 用户级别 ~/.bash_profile ~/.bash_login ~/.profile ~/.bashrc ``` 前三个是系统级别的环境变量针对所有用户,后面四个带有 `~/` 用户级别的环境变量。 - 前三个系统级别环境配置会在系统启动时加载。 - `~/.bash_profile`,`~/.bash_login`,`~/.profile ` 依次加载,若 `~/.bash_profile`...
图形变换与线性代数息息相关(坐标系空间转换), 坐标变换与矩阵变换。在笛卡尔坐标系中,每个 `欧氏空间` 里的点都由横坐标和纵坐标这两个值来确定。在 `CSS`(和大部分的计算机图形学)中,原点 ` (0, 0)` 在元素的左上角。每个点都使用数学上的向量符号 `(x, y)` 来描述。 每个线性函数使用 2 × 2 矩阵描述,如: ``` [a c] [b d] ``` 将矩阵乘法用于上述坐标系中的每个点,一个变换就形成了: 可以在一行中进行多次矩阵乘法进行变换:  有了这种方法,就可以描述大部分常见的变换,并因此可以将他们组合起来,如:旋转、缩放或拉伸。事实上,所有线性函数的变换都可以被描述,组合的变换是从右到左生效的。然而,有一种常见的变换并不是线性的,所以当这种变换要用这种方法来表示时,应该被单独列出来:位移。位移的向量` (tx, ty)` 必须单独表示,作为两个附加参数,...
Vagrant 是基于Ruby的工具,依赖 VirtualBox,VMware,AWS 或其他虚拟机管理软件 (provider) 的接口来创建虚拟机, 用于创建和部署虚拟化开发环境。标准的 配置管理工具(provisioning tools (例如 shell 脚本, Chef, 或 Puppet)都可以在 Vagrant 创建的虚拟机上使用,用来进行自动安装及配置管理。我们可以使用它来干如下这些事: - 建立和删除虚拟机 - 配置虚拟机运行参数 - 管理虚拟机运行状态 - 自动配置和安装开发环境 - 打包和分发虚拟机运行环境 > 注意版本兼容问题目前 2.0...
`SVG` 指可伸缩矢量图形 `(Scalable Vector Graphics)`,是使用 `XML` 来描述二维图形和绘图程序的语言。在深入了解 `SVG ` 过程中 , 若能很好的理解 `SVG ` 坐标系统和坐标变换,有助于我们更好的使用 `SVG ` 做相关项目。 ## 坐标系统 #### 网格 `SVG` 使用的坐标系统或者说网格系统,和[Canvas](https://developer.mozilla.org/zh-CN/HTML/Canvas)用的差不多(所有计算机绘图都差不多)。这种坐标系统是:以页面的左上角为(0,0)坐标点,坐标以像素为单位,x轴正方向是向右,y轴正方向是向下。  ```xml ``` > 定义一个矩形,即从左上角开始,向右延展100px,向下延展100px,形成一个100*100大的矩形。 ####...
在我们写node addon时,需要使用node-gyp命令行工具,大部分同学会用`configue`生成配置文件,然后使用`build`进行构建。但是node-gyp到底是什么?底层有什么呢?下面我们来刨根问底。 本文的线索是自底向上的讲解node-gyp的各层次依赖,主要有以下几个部分: ``` 1. make 2. make install 3. cmake 4. gyp 5. node-gyp ``` 层次结构如下图所示: [](https://camo.githubusercontent.com/0f38123bdccc34a131c00e8350b3d71a5235bf22/687474703a2f2f7366312d687363646e2d746f732e7073746174702e636f6d2f6f626a2f6965732e66652e6d69732f63316465336162323363393636636631303133663032663034623937656333372e706e67) ## make 从源文件到可执行文件叫做编译(包括预编译、编译、链接),而make作为构建工具掌握着编译的过程,也就是如何去编译、文件编译的顺序等。 make是最常用的构建工具,针对用户制定的构建规则(makefile)去执行响应的任务。make会根据构建规则去查找依赖,决定编译顺序等。大致了解可参考[Make 命令教程](http://www.ruanyifeng.com/blog/2015/02/make.html) Makefile(makefile)中定义了make的构建规则,当然也可以自己指定规则文件。例如: ``` $ make -f rules.txt #...
Serverless 架构即“无服务器”架构,它是一种全新的架构方式,是云计算时代一种革命性的架构模式。与云计算、容器和人工智能一样,Serverless 是这两年IT行业的一个热门词汇,它在各种技术文章和论坛上都有很高的曝光度。 > 目前行业可能更多处在容器 Docker+Kubernetes, 利用 IaaS、PaaS和SaaS 来快速搭建部署应用 ## 什么是Serverless Serverless 圈内俗称为“无服务器架构”,Serverless 不是具体的一个编程框架、类库或者工具。简单来说,Serverless 是一种软件系统架构思想和方法,它的核心思想是用户无须关注支撑应用服务运行的底层主机。这种架构的思想和方法将对未来软件应用的设计、开发和运营产生深远的影响。 所谓“无服务器”,并不是说基于 Serverless 架构的软件应用不需要服务器就可以运行,其指的是用户无须关心软件应用运行涉及的底层服务器的状态、资源(比如 CPU、内存、磁盘及网络)及数量。软件应用正常运行所需要的计算资源由底层的云计算平台动态提供。 ## Serverless的技术实现 Serverless 的核心思想是让作为计算资源的服务器不再成为用户所关注的一种资源。其目的是提高应用交付的效率,降低应用运营的工作量和成本。以 Serverless 的思想作为基础实现的各种框架、工具及平台,是各种 Serverless 的实现(Implementation)。Serverless不是一个简单的工具或框架。用户不可能简单地通过实施某个产品或工具就能实现 Serverless 的落地。但是,要实现 Serverless...
# 学习 Restful HTTP API 设计 近几年提供 `HTTP API` 服务的公司越来越多,许多公司都把 API 作为产品重要的一部分,作为服务提供出去。而微服务的兴起,也让企业内部开始重视和频繁使用 HTTP API 。好的 `HTTP API`设计容易理解、符合 RFC 标准、提供使用者便利的功能,其中经常被拿来作为教科书典范的当属 [Github API](https://developer.github.com/v4/)。这篇文章就通过 `Github API` 总结了一些非常好的设计原则,可以作为以后要编写 HTTP API 的参考。 注意:这篇文章只讨论设计原则,不是强制要求(API 设计者可以根据实际情况实现部分内容,甚至实现出和某些原则相反的内容),也不会给出实现的思路和细节。 ##...
# JavaScript 内存机制 # 简介 每种编程语言都有它的内存管理机制,比如简单的C有低级的内存管理基元,像`malloc()`,`free()`。同样我们在学习JavaScript的时候,很有必要了解JavaScript的内存管理机制。 JavaScript的内存管理机制是:内存基元在变量(对象,字符串等等)创建时分配,然后在他们不再被使用时“自动”释放。后者被称为垃圾回收。这个“自动”是混淆并给JavaScript(和其他高级语言)开发者一个错觉:他们可以不用考虑内存管理。 对于前端开发来说,内存空间并不是一个经常被提及的概念,很容易被大家忽视。当然也包括我自己。在很长一段时间里认为内存空间的概念在JS的学习中并不是那么重要。可是后我当我回过头来重新整理JS基础时,发现由于对它们的模糊认知,导致了很多东西我都理解得并不明白。比如最基本的引用数据类型和引用传递到底是怎么回事儿?比如浅复制与深复制有什么不同?还有闭包,原型等等。 但其实在使用JavaScript进行开发的过程中,了解JavaScript内存机制有助于开发人员能够清晰的认识到自己写的代码在执行的过程中发生过什么,也能够提高项目的代码质量。 # 内存模型 JS内存空间分为**栈(stack)**、**堆(heap)**、**池(一般也会归类为栈中)**。 其中**栈**存放变量,**堆**存放复杂对象,**池**存放常量。 ## 基础数据类型与栈内存 JS中的基础数据类型,这些值都有固定的大小,往往都保存在栈内存中(闭包除外),由系统自动分配存储空间。我们可以直接操作保存在栈内存空间的值,因此基础数据类型都是按值访问 数据在栈内存中的存储与使用方式类似于数据结构中的堆栈数据结构,遵循后进先出的原则。 基础数据类型: `Number` `String` `Null` `Undefined` `Boolean` 复习一下,此问题常常在面试中问到,然而答不出来的人大有人在 ~ ~ 要简单理解栈内存空间的存储方式,我们可以通过类比乒乓球盒子来分析。 | 乒乓球盒子 |...
### 二维矢量图形 计算机图形可分为两类,矢量图形与光栅图形。光栅图形是将图像表示为像素点集。矢量图形则是使用一些几何图元(点、直线、曲线、多边形等)表示图像,这些图元是使用数学公式生成的。 ### Cairo Cairo 是用于绘制二维矢量图形的库,采用 C 语言实现,又被许多其它计算机语言所绑定,譬如 Python、PERL、C++、C#、Java。Cairo 是跨平台库,可运行于 Linux、BSD、OSX 等操作系统。 Cairo 力求在各种后端上产生相同的输出,但是每种后端各有优势。例如,PDF 后端会尽可能使用矢量计算(只在必要时生成图像),而 PostScript 后端实际上会为每个页面生成一个大图像。 Cairo 的呈现模型受到许多原有技术的影响。Cairo 采用了 PostScript 中的路径、笔画(stroke)和填充(fill)概念,还实现了 PDF 和现代 X 服务器实现的呈现扩展中的 Porter-Duff 图像组合技术。另外,cairo 还实现了剪切、蒙板和渐变等补充特性。...