下载 Release
在 Project-V 的 Github Releases 页面下载最新的二进制包。
本文以通用于 x86_64 机器的 v2ray-linux-64.zip
为例。下载完成后传入 Linux 主机即可。
安装 Project-V
执行 unzip
命令:
1 | unzip v2ray-linux-64.zip |
'))
在 Project-V 的 Github Releases 页面下载最新的二进制包。
本文以通用于 x86_64 机器的 v2ray-linux-64.zip
为例。下载完成后传入 Linux 主机即可。
执行 unzip
命令:
1 | unzip v2ray-linux-64.zip |
以 Euler 系统为例,在终端上输入命令查看,可以通过 rpm -qa | grep euleros-release
命令找到 rpm 包,再通过 rpm -qi ${包名}
查看系统 OS 及架构信息:
1 | [root@lolipop ~]# rpm -qa | grep euleros-release |
当然,也可以使用通用的 uname -a
命令。
当前系统为 Euler 2.0 (SP5),处理器架构为 x86_64。
类(Class)是用于创建对象的模板,他们用代码封装数据以处理该数据,是面向对象编程方法的重要特性之一。JavaScript 中的 class
语法在 ES6 中引入,其底层实现基于原型(Prototype),系原型继承的语法糖(Syntactic Sugar)。
本博文将探讨 JavaScript 中如何使用类的相关知识,文章组织架构和内容基于 MDN 上关于类的章节。
类可以被看作一种“特殊的函数”,和函数的定义方法一样,类的定义方法有两种:类声明和类表达式。
第一种方法是,直接使用 class
关键字声明类,即类声明的方法。
1 | class User { |
JavaScript 中有一个叫作闭包(Closure)的概念,非常有趣且适用,值得学习并整理为一篇博客。
为了更好理解闭包的作用,不妨看看我的这一篇博客关于 JS 变量提升(Hoisting)和函数提升现象的阐述。
在 JavaScript 中,作用域(Scope)是当前代码执行的上下文,也即是值和表达式在其中可访问到的上下文。
目前,作用域有三种:全局作用域和函数作用域,以及 ES6 新增的块级作用域。
在 ES6 规范出现之前,使用 JavaScript 声明变量只有 var
, function
以及隐式声明三种方式。
按照一般编程的思维,我们会通过“先声明,后调用”的方式去使用变量,例如:
1 | var a = 3; |
但假如反过来,我们“先调用,后声明”,会发生什么呢?
1 | console.log(a); // undefined |
如上所示,在声明变量 a
之前尝试将它的值打印出来,控制台输出的结果是 undefined
,而不是预期中的报错 Uncaught ReferenceError: a is not defined
。这就是变量提升。
在前端性能优化中存在一个老生常谈的问题:如何优化高频率执行的 JS 代码?例如:
针对上述列举的问题,我们应该怎么做,才能在优化前端性能的同时不至于影响到用户的体验,便是本文探讨的内容。
函数节流(Throttle),指在触发事件后的一定时间内绑定的函数只能执行一次。
函数节流的实现思路比较简单,例如使用 setTimeout
方法实现:由于 setTimeout
方法的返回值是一个正整数,表示定时器的编号,所以可以利用闭包的方法维护一个定时器编号。每次触发事件时都通过定时器编号判断当前是否有尚未到期的定时器,如果有则结束,如果没有则启用一个定时器。定时器到期后调用绑定的需要节流的函数,并设置定时器编号为空,表示可以启用一个新的定时器。代码如下:
本文适用于 C++ 版本 gRPC 的离线编译安装,但对于下载 gRPC 步骤强烈建议使用 git 进行。
如果在能直接连接外网的机器上编译,可直接按照 gRPC 官网文档的指引快速执行编译操作。
确保机器上包括这些基本依赖:autoconf
, libtool
, pkg-config
与 C++ 编译环境。
1 | # 检查是否有 autoconf |
gRPC 的编译需要 gcc
版本在 4.9
及以上。假如版本低于此,应当在 Docker 容器中安装较新版本的 GCC 再执行编译操作。
如果软件源可用,可以使用 CentOS 的 yum 包管理器或 Ubuntu 的 apt 包管理器等一键安装 GCC,例如:
1 | yum -y install gcc |
本文适用于系统中包含有其它版本的 GCC 编译器情况下,手动更新或降级 GCC 编译器。编译 GCC 的过程十分耗时,如果能使用包管理器尽量还是使用包管理器吧。
NOTE: 如果仅使用 GCC 进行编译操作或不确定当前系统能否兼容新版本的 GCC,建议在 Docker 容器环境中执行编译和安装操作,并在容器中使用 GCC 编译器进行编译源码。
1 | # 查看当前系统中 GCC 的版本 |
实习中学习一下 Protobuf 的功能和语法等,整理为此笔记。主要为翻译官方文档而来。
Protobuf 是 Google 公司研发的一种用于序列化结构数据的机制,全称为 Protocol Buffers,具有语言无关、平台无关以及可拓展的特性。
我们常常把 Protobuf 与 XML (Extensible Markup Language) 相比较,它们二者都被设计来传输和存储结构化数据。相比于 XML,Protobuf 有如下优势与缺点:
.proto
文件来描述需要传输和存储的结构数据,随后编译器会为之创建一个类,实现结构数据的自动编码和解码。With protocol buffers, you write a .proto description of the data structure you wish to store. From that, the protocol buffer compiler creates a class that implements automatic encoding and parsing of the protocol buffer data with an efficient binary format. The generated class provides getters and setters for the fields that make up a protocol buffer and takes care of the details of reading and writing the protocol buffer as a unit.