前提
我们一般为代码添加远程仓库一般是:
git remote add <name> <url>
比如以我的一个代码库为例:
git remote add origin git@github.com:yushuailiu/go-algorithm.git
这样我们就可以向github提交代码了。但是有时候我们可能想要把代码同时提交到gitee上,那么我们可以像上面一样添加一个新的仓库
git remote add gitee git@gitee.com:liuyushuai/go-algorithm.git
然后如果我们有代码更新我们需要同时更新origin和gitee
我们首先编写一个简单的Golang服务
package main
import "net/http"
func main() {
http.HandleFunc("/", hello)
http.ListenAndServe(":8001", nil)
}
func hello(w http.ResponseWriter, r *http.Request) {
w.Write([]byte("Hello world!"))
}
运行服务
$ go run main.go
访问 http://127.0.0.1:8001 页面返回
Hello world!
构建运
模式
含义
location = /uri
= 表示精确匹配只有完全相等才会匹配成功
location ^~ /uri
^~ 表示对路由进行前缀匹配
location ~ /uri
~ 表示对路由进行正则匹配
location ~* /uri
~* 表示对路由进行不区分大小写的正则匹配
location /uri
不带任何修饰符也表示前缀匹配
location /
默认匹配,任何没有匹配到的uri
多个 location 配置的情况下匹配顺序为(匹配到某一等级就结束,同一规则时匹配长度长的优先):
首先精确匹配 =
其次前缀匹配 ^~
其次是按文件中顺
Go语言的条件编译是由go/build包支持的,通过条件编译我们可以实现根据不同的参数编译包里不同的文件。
Go是怎么支持条件编译的
Go通过在源代码里添加编译标签(build tag)实现条件编译的。编译标签是以// +build开始,并且出现在代码文件的最开始。构建选项规则如下:
以逗号分割的选项是并的关系
以空格分割的选项是或的关系
条件项的名字用字母+数字表示,!表示否定的意思
构建标签后必须留一行空行
例如如下的例子:
// +build linux,386 darwin,!cgo
对应的布尔表达式就是
(linux AND 386) OR (darwin AND (NOT cg
网络模型历史
在网络刚开始发展的时候,网络协议是由各个互联网公司自己定义的,各家协议不能互通。这大大限制了网络的发展,为了解决这个问题,国际标准化组织1984年提出了标准模型OSI(Open Systems Interconnection Model)标准。这只是一个标准,TCP/IP协议是基于此设计的。
OSI模型
OSI模型是从上而下的,越底层越接近硬件,越往上越接近软件。七层模型依次是物理层、数据链路层、网络层、传输层、会话层、表示层、应用层。这种分层是思想是计算机科学中常用的方法,分层的好处就是各层只需要按照规定的接口和其他层交互,不需要管各层的具体实现,这样当需要某一层需要做调整时也
file介绍
file命令用来探测文件的类型
用法
-b:列出辨识结果时,不显示文件名称;
-c:详细显示指令执行过程,便于排错或分析程序执行的情形;
-f<名称文件>:指定名称文件,其内容有一个或多个文件名称时,让file依序辨识这些文件,格式为每列一个文件名称;
-L:直接显示符号连接所指向的文件类别;
-m<魔法数字文件>:指定魔法数字文件;
-v:显示版本信息;
-z:尝试去解读压缩文件的内容。
file源码编译安装
github库
以安装5.25为例
wget https://github.com/file/file/archive/FILE5_25
内存对齐的作用
平台原因(移植):不是所有的硬件平台都可以访问任意位置上的任意数据的,有些硬件只能在特定位置取特定数据。
性能问题:经过内存对齐,CPU的内存访问速度会提升。因为对齐的元素只需要一次内存访问,未对齐的需要两次。
性能问题
一般程序员会认为内存如下图所示,是有一个个的字节组成,而CPU却不是这样看待的。
CPU把内存当作一块一块的,块的大小可以是2、4、8、16字节大小,因此CPU读取内存是一块一块读取的。(块的大小称为内存读取粒度)
假设CPU要读取一个int型4字节大小的数据,分两种情况讨论:
数据从0字节开始
数据从1字节开始
假设内存读取粒度为4
PHP 可变属性的官方中文版Exampl1例子是错误的
官方地址
Example 1
<?php
class foo {
var $bar = 'I am bar.';
var $arr = array('I am A.', 'I am B.', 'I am C.');
var $r = 'I am r.';
}
$foo = new foo();
$bar = 'bar';
$baz = array('foo', 'bar', 'baz', 'quux');
echo $foo->$bar . "\n";
echo $foo->$baz[1]
array的key可以是Integer、string类型。其他类型的key会进行转化
包含有合法整型值的字符串会被转换为整型。例如键名 "8" 实际会被储存为 8。但是 "08" 则不会强制转换,因为其不是一个合法的十进制数值。
浮点数也会被转换为整型,意味着其小数部分会被舍去。例如键名 8.7 实际会被储存为 8。
布尔值也会被转换成整型。即键名 true 实际会被储存为 1 而键名 false 会被储存为 0。
Null 会被转换为空字符串,即键名 null 实际会被储存为 ""。
数组和对象不能被用为键名。坚持这么做会导致警告
phpQuery
phpQuery是 PHP 服务端实现的处理Dom的一个开源库,让开发人员可以像使用jquery一样处理Dom。
坑
占用内存过大
phpQuery在每处理一个网页就会产生一个DOMDocumentWrapper对象,每个DOMDocumentWrapper 对象会被保存在静态成员$documents中(phpQuery::createDocumentWrapper中),这个变量是一个数组,每解析一个 网页数组元素就增加一个。
所以如果是在写cli运行的爬虫类的脚本,内存很快就会占用过大,严重的导致机器死机。
phpQuery::$documents[$wrapper-&g