0%

很多东西如果不是怕别人捡去,我们一定会扔掉。

Laravel Query Builder is a package by Alex Vanderbist and the folks at Spatie, to quickly build Eloquent queries from API requests. This package makes creating complex API queries with Laravel incredibly simple. While you may have already heard of this package (or used it), I wanted to make sure everyone is aware of this one!

I highly recommend you take Query Builder for a spin and read through the README to learn what it’s capable of doing. It makes creating API filters and other query-related tasks so easy, you might feel like you’re cheating.

A few basic examples of what you can do include filtering an API request, including related models, incorporating it with existing queries, sorting an API request.

Basic usage

  • Filtering an API request: /users?filter[name]=John:

    1
    2
    3
    4
    5
    6
    7
    8
    use Spatie\QueryBuilder\QueryBuilder;

    // ...

    $users = QueryBuilder::for(User::class)
    ->allowedFilters('name')
    ->get();
    // all `User`s that contain the string "John" in their name
  • Requesting relations from an API request: /users?include=posts:

    1
    2
    3
    4
    $users = QueryBuilder::for(User::class)
    ->allowedIncludes('posts')
    ->get();
    // all `User`s with their `posts` loaded
  • Works together nicely with existing queries:

    1
    2
    3
    4
    5
    6
    $query = User::where('active', true);

    $user = QueryBuilder::for($query)
    ->allowedIncludes('posts', 'permissions')
    ->where('score', '>', 42) // chain on any of Laravel's query builder methods
    ->first();
  • Sorting an API request: /users?sort=name:

    1
    2
    $users = QueryBuilder::for(User::class)->get();
    // all `User`s sorted by name

Installation

You can install the package via composer:

1
composer require spatie/laravel-query-builder

You can optionally publish the config file with:

1
php artisan vendor:publish --provider="Spatie\QueryBuilder\QueryBuilderServiceProvider" --tag="config"

This is the contents of the published config file:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
return [

/*
* By default the package will use the `include`, `filter`, `sort` and `fields` query parameters.
*
* Here you can customize those names.
*/
'parameters' => [
'include' => 'include',

'filter' => 'filter',

'sort' => 'sort',

'fields' => 'fields',
],

];

https://laravel-news.com/laravel-query-builder
https://packagist.org/packages/spatie/laravel-query-builder
https://github.com/spatie/laravel-query-builder
https://spatie.be/en/opensource/laravel

黄梅时节家家雨,青草池塘处处蛙

使用场景

什么情况下需要这种操作?
比如,后台多台服务器做反向代理;
比如,微信小程序,建立微信小程序的websocket连接,必须要使用wss,但是目前不支持自定义端口,在调用的时候会使用默认端口,这个时候就需要做个代理。

实现

Nginx配置

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
server {
listen 443; #https和wss协议默认端口

# ssl的相关配置
ssl on;
ssl_certificate /usr/local/nginx/conf/ssl/***.pem; // ssl pem文件
ssl_certificate_key /usr/local/nginx/conf/ssl/***.key; // ssl key文件
ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
ssl_ciphers EECDH+CHACHA20:EECDH+AES128:RSA+AES128:EECDH+AES256:RSA+AES256:EECDH+3DES:RSA+3DES:!MD5;
ssl_prefer_server_ciphers on;
ssl_buffer_size 1400;
add_header Strict-Transport-Security max-age=15768000;
add_header Cache-Control no-store;
ssl_stapling on;
ssl_stapling_verify on;

server_name www.goozp.com;

# 转发wss协议
location /wss {
proxy_pass http://127.0.0.1:9502;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "Upgrade";
proxy_set_header X-Real-IP $remote_addr;
}

# 转发https协议
location /{
proxy_pass http://127.0.0.1:2345;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
# add_header Access-Control-Allow-Origin *;
}
}

这样,当我们访问 https://swoole.app 的时候实际上就转发到了内部的2345端口的http服务,而不需要 https://swoole.app:9502 。建立websocket连接时直接与 wss://swoole.app/wss 建立连接,会转发到内部2346端口的服务。

问题

在配置的过程中我们发现每过一段时间服务端会自动断开连接, 我们需要增加如下配置, 具体时间情况因业务具体而定

1
2
3
4
5
6
7
8
9
10
11
12
 # 转发wss协议
location /wss {
proxy_pass http://127.0.0.1:9502;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "Upgrade";
proxy_set_header X-Real-IP $remote_addr;

proxy_connect_timeout 1d;
proxy_send_timeout 1d;
proxy_read_timeout 1d;
}

https://www.goozp.com/article/69.html
http://www.ruanyifeng.com/blog/2017/05/websocket.html

青青子衿,悠悠我心。但为君故,沉吟至今。
  • create a middleware

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    use Closure;
    use Illuminate\Foundation\Application;

    /**
    * Class Localization
    *
    * @author Mahmoud Zalt <mahmoud@zalt.me>
    */
    class Localization
    {

    /**
    * Localization constructor.
    *
    * @param \Illuminate\Foundation\Application $app
    */
    public function __construct(Application $app)
    {
    $this->app = $app;
    }

    /**
    * Handle an incoming request.
    *
    * @param \Illuminate\Http\Request $request
    * @param \Closure $next
    *
    * @return mixed
    */
    public function handle($request, Closure $next)
    {
    // read the language from the request header
    $locale = $request->header('Content-Language');

    // if the header is missed
    if(!$locale){
    // take the default local language
    $locale = $this->app->config->get('app.locale');
    }

    // check the languages defined is supported
    if (!array_key_exists($locale, $this->app->config->get('app.supported_languages'))) {
    // respond with error
    return abort(403, 'Language not supported.');
    }

    // set the local language
    $this->app->setLocale($locale);

    // get the response after the request is done
    $response = $next($request);

    // set Content Languages header in the response
    $response->headers->set('Content-Language', $locale);

    // return the response
    return $response;
    }
    }

  • Register the middleware in the Middlewares

  • add this to the app.php config file

    1
    'supported_languages' => ['en' => 'English', 'ru' => 'Russian'],
  • create language folder in the lang folder “resources/lang” for your language (in this case it is [ru] next to [en]) and of course set your files there.

  • create sample route to test this: {you need to use the trans function}

    1
    2
    3
    4
    5
    Route::get('welcome', function () {

    echo trans('messages.welcome');

    });
  • call the endpoint “http://api.xxxxx.dev/welcome/“ and set the header “Content-Language” in your request to ([en] or [ru]).

https://laravel-tricks.com/tricks/create-api-that-supports-localization

你们一直抱怨这个地方,但是你们却没有勇气走出这里

使用系统的 $RANDOM 变量

$RANDOM 的范围是 [0, 32767]

1
echo $RANDOM

自建函数

1
2
3
4
5
6
7
8
9
10
11
#!/bin/bash
function rand(){
min=$1
max=$(($2-$min+1))
num=$(($RANDOM+1000000000)) #增加一个10位的数再求余
echo $(($num%$max+$min))
}

rnd=$(rand 400000 500000)
echo $rnd

使用date +%s%N

生成1-50的随机数

1
2
3
4
5
6
7
8
9
10
11
#!/bin/bash
function rand(){
min=$1
max=$(($2-$min+1))
num=$(date +%s%N)
echo $(($num%$max+$min))
}

rnd=$(rand 1 50)
echo $rnd

使用/dev/random 和 /dev/urandom

假设你在一个linux,以下应该工作:

1
cat /dev/urandom | tr -cd 'a-f0-9' | head -c 32

这只是伪随机的,如果你的系统运行低熵,但(在linux)保证终止。如果你需要真正随机的数据,cat / dev / random代替/ dev / urandom。这个更改将使你的代码块,直到足够的熵可用来产生真正的随机输出,所以它可能会减慢你的代码。对于大多数用途,/ dev / urandom的输出是充分随机的。

如果在OS X或其他BSD上,您需要将其修改为以下内容:

1
cat /dev/urandom | env LC_CTYPE=C tr -cd 'a-f0-9' | head -c 32

使用linux uuid

uuid 全称是通用唯一识别码,格式包含32个16进制数字,以’-‘连接号分为5段。形式为8-4-4-4-12 的32个字符。

1
cat /proc/sys/kernel/random/uuid

https://codeday.me/bug/20170816/53801.html
https://blog.csdn.net/fdipzone/article/details/24329523

平平淡淡是懒惰,是害怕,是贪图安逸,是一条不敢见世面的土狗

在Shell下有时候需要定制输出,比如给输出加上颜色,或者显示高亮,或者添加闪烁等。然后这些颜色代码或者控制码等相对不好记住。这个时候我们可以考虑把最终想要的结果制定成对应的函数,在使用的时候直接调用函数会方便很多

格式

1
echo -e "\033[字背景颜色;字体颜色m字符串\033[控制码"

定制颜色函数

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
## blue to echo 
function blue(){
echo -e "\033[34m[ $1 ]\033[0m"
}


## green to echo
function green(){
echo -e "\033[32m[ $1 ]\033[0m"
}

## Error to warning with blink
function bred(){
echo -e "\033[31m\033[01m\033[05m[ $1 ]\033[0m"
}

## Error to warning with blink
function byellow(){
echo -e "\033[33m\033[01m\033[05m[ $1 ]\033[0m"
}


## Error
function bred(){
echo -e "\033[31m\033[01m[ $1 ]\033[0m"
}

## warning
function byellow(){
echo -e "\033[33m\033[01m[ $1 ]\033[0m"
}

可以把这些函数写入到一个公共的SHELL脚本中,每次在编写其他脚本的时候用如下方式调用,即可

1
source /root/bin/common

或者可以把上述代码直接粘贴到当前编写的脚本中去。
当然可以推荐第一种方式。不用每次都复制粘贴。 直接 source 调用 即可

举例

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
#!/usr/bin/env bash

## blue to echo
function blue(){
echo -e "\033[35m[ $1 ]\033[0m"
}


## green to echo
function green(){
echo -e "\033[32m[ $1 ]\033[0m"
}

## Error to warning with blink
function bred(){
echo -e "\033[31m\033[01m\033[05m[ $1 ]\033[0m"
}

## Error to warning with blink
function byellow(){
echo -e "\033[33m\033[01m\033[05m[ $1 ]\033[0m"
}


## Error
function red(){
echo -e "\033[31m\033[01m[ $1 ]\033[0m"
}

## warning
function yellow(){
echo -e "\033[33m\033[01m[ $1 ]\033[0m"
}
Dev-web-solr [/opt/hexo2] 2016-11-28 17:52:03
root@pts/4 $ cat /root/bin/test.sh
#!/usr/bin/env bash

source /root/bin/common

green "hello world with green color"
blue "hello world with blue color"

bred "error info with blink"
byellow "warning info with blink"

字体背景颜色

1
2
3
4
5
6
7
8
40:黑 
41:深红
42:绿
43:黄色
44:蓝色
45:紫色
46:深绿
47:白色

字体颜色

1
2
3
4
5
6
7
8
30:黑 
31:红
32:绿
33:黄
34:蓝色
35:紫色
36:深绿
37:白色

控制码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
\33[0m 关闭所有属性 
\33[01m 设置高亮度
\33[04m 下划线
\33[05m 闪烁
\33[07m 反显
\33[08m 消隐
\33[30m -- \33[37m 设置前景色
\33[40m -- \33[47m 设置背景色
\33[nA 光标上移n行
\33[nB 光标下移n行
\33[nC 光标右移n行
\33[nD 光标左移n行
\33[y;xH设置光标位置
\33[2J 清屏
\33[K 清除从光标到行尾的内容
\33[s 保存光标位置
\33[u 恢复光标位置
\33[?25l 隐藏光标
\33[?25h 显示光标

https://www.jianshu.com/p/ba1b8aded634

生活本来就不容易, 如果有一天你觉得容易了, 那一定是有人分担了你的不容易

概念

持续集成指的是,频繁地(一天多次)将代码集成到主干。

它的好处主要有两个:

  • 快速发现错误。每完成一点更新,就集成到主干,可以快速发现错误,定位错误也比较容易。
  • 防止分支大幅偏离主干。如果不是经常集成,主干又在不断更新,会导致以后集成的难度变大,甚至难以集成。

持续集成的目的,就是让产品可以快速迭代,同时还能保持高质量。它的核心措施是,代码集成到主干之前,必须通过自动化测试。只要有一个测试用例失败,就不能集成。
Martin Fowler说过,”持续集成并不能消除Bug,而是让它们非常容易发现和改正。”
与持续集成相关的,还有两个概念,分别是持续交付和持续部署。

持续交付

持续交付(Continuous delivery)指的是,频繁地将软件的新版本,交付给质量团队或者用户,以供评审。如果评审通过,代码就进入生产阶段。
持续交付可以看作持续集成的下一步。它强调的是,不管怎么更新,软件是随时随地可以交付的。

持续部署

持续部署(continuous deployment)是持续交付的下一步,指的是代码通过评审以后,自动部署到生产环境。
持续部署的目标是,代码在任何时刻都是可部署的,可以进入生产阶段。
持续部署的前提是能自动化完成测试、构建、部署等步骤。

流程

根据持续集成的设计,代码从提交到生产,整个过程有以下几步

提交

流程的第一步,是开发者向代码仓库提交代码。所有后面的步骤都始于本地代码的一次提交(commit)。

测试(第一轮)

代码仓库对commit操作配置了钩子(hook),只要提交代码或者合并进主干,就会跑自动化测试。
测试有好几种

  • 单元测试:针对函数或模块的测试
  • 集成测试:针对整体产品的某个功能的测试,又称功能测试
  • 端对端测试:从用户界面直达数据库的全链路测试

第一轮至少要跑单元测试。

构建

通过第一轮测试,代码就可以合并进主干,就算可以交付了。
交付后,就先进行构建(build),再进入第二轮测试。所谓构建,指的是将源码转换为可以运行的实际代码,比如安装依赖,配置各种资源(样式表、JS脚本、图片)等等。
常用的构建工具如下

  • Jenkins
  • Travis
  • Codeship
  • Strider

测试(第二轮)

建完成,就要进行第二轮测试。如果第一轮已经涵盖了所有测试内容,第二轮可以省略,当然,这时构建步骤也要移到第一轮测试前面。
第二轮是全面测试,单元测试和集成测试都会跑,有条件的话,也要做端对端测试。所有测试以自动化为主,少数无法自动化的测试用例,就要人工跑。
需要强调的是,新版本的每一个更新点都必须测试到。如果测试的覆盖率不高,进入后面的部署阶段后,很可能会出现严重的问题。

部署

通过了第二轮测试,当前代码就是一个可以直接部署的版本(artifact)。将这个版本的所有文件打包( tar filename.tar * )存档,发到生产服务器。
生产服务器将打包文件,解包成本地的一个目录,再将运行路径的符号链接(symlink)指向这个目录,然后重新启动应用。这方面的部署工具有Ansible,Chef,Puppet等。

回滚

一旦当前版本发生问题,就要回滚到上一个版本的构建结果。最简单的做法就是修改一下符号链接,指向上一个版本的目录。

http://www.ruanyifeng.com/blog/2015/09/continuous-integration.html

同窗同读岂能位居人后,同班同学怎可甘拜下风

Systemd 并不是一个命令,而是一组命令,涉及到系统管理的方方面面。

查看版本

1
systemctl --version

systemctl

systemctl是 Systemd 的主命令,用于管理系统。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
# 重启系统
$ sudo systemctl reboot

# 关闭系统,切断电源
$ sudo systemctl poweroff

# CPU停止工作
$ sudo systemctl halt

# 暂停系统
$ sudo systemctl suspend

# 让系统进入冬眠状态
$ sudo systemctl hibernate

# 让系统进入交互式休眠状态
$ sudo systemctl hybrid-sleep

# 启动进入救援状态(单用户状态)
$ sudo systemctl rescue

systemd-analyze

systemd-analyze命令用于查看启动耗时。

1
2
3
4
5
6
7
8
9
10
11
# 查看启动耗时
$ systemd-analyze

# 查看每个服务的启动耗时
$ systemd-analyze blame

# 显示瀑布状的启动过程流
$ systemd-analyze critical-chain

# 显示指定服务的启动流
$ systemd-analyze critical-chain atd.service

hostnamectl

hostnamectl命令用于查看当前主机的信息。

1
2
3
4
5
# 显示当前主机的信息
$ hostnamectl

# 设置主机名。
$ sudo hostnamectl set-hostname rhel7

timedatectl

timedatectl命令用于查看当前时区设置。

1
2
3
4
5
6
7
8
9
10
# 查看当前时区设置
$ timedatectl

# 显示所有可用的时区
$ timedatectl list-timezones

# 设置当前时区
$ sudo timedatectl set-timezone America/New_York
$ sudo timedatectl set-time YYYY-MM-DD
$ sudo timedatectl set-time HH:MM:SS

loginctl

loginctl命令用于查看当前登录的用户。

1
2
3
4
5
6
7
8
# 列出当前session
$ loginctl list-sessions

# 列出当前登录用户
$ loginctl list-users

# 列出显示指定用户的信息
$ loginctl show-user ruanyf

Unit 管理

对于用户来说,最常用的是下面这些命令,用于启动和停止 Unit(主要是 service)。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
# 立即启动一个服务
$ sudo systemctl start apache.service

# 立即停止一个服务
$ sudo systemctl stop apache.service

# 重启一个服务
$ sudo systemctl restart apache.service

# 杀死一个服务的所有子进程
$ sudo systemctl kill apache.service

# 重新加载一个服务的配置文件
$ sudo systemctl reload apache.service

# 重载所有修改过的配置文件
$ sudo systemctl daemon-reload

# 显示某个 Unit 的所有底层参数
$ systemctl show httpd.service

# 显示某个 Unit 的指定属性的值
$ systemctl show -p CPUShares httpd.service

# 设置某个 Unit 的指定属性
$ sudo systemctl set-property httpd.service CPUShares=500

Unit 的配置文件

每一个 Unit 都有一个配置文件,告诉 Systemd 怎么启动这个 Unit 。

1
2
3
4
5
# 列出所有配置文件
$ systemctl list-unit-files

# 列出指定类型的配置文件
$ systemctl list-unit-files --type=service

http://www.ruanyifeng.com/blog/2016/03/systemd-tutorial-commands.html

兄弟,这世上就一种病,你永远也治不了,那就是穷病
1
2
# 当前进程ID
echo $$
1
2
# 当前脚本文件名
echo $0
1
2
# 传递给脚本或函数的参数,n 是一个数字,表示第几个参数。例如,第一个参数是$1,第二个参数是$2。
echo $1
1
2
# 传递给脚本或函数的参数个数
echo $#
1
2
# 传递给脚本或函数的所有参数
echo $*
1
2
# 传递给脚本或函数的所有参数。被双引号(" ")包含时,与 $* 稍有不同
echo $@
1
2
3
4
5
6
7
8
9
10
11
12
13
# $*和S@的差别

#!/bin/sh

echo "\$*=$*"
echo --------------------------
for n in "$*";do echo $n;done

echo ""
echo "\$@=$@"
echo --------------------------
for n in "$@";do echo $n;done

结果

1
2
3
4
5
6
7
8
9
10
11
$*=1 2 3 asdf $asdfasdf
--------------------------
1 2 3 asdf $asdfasdf

$@=1 2 3 asdf $asdfasdf
--------------------------
1
2
3
asdf $asdfasdf

从上面结果可以看到:
$*将所有位置参数当做一个字符串输出;
$@将每个位置参数当做独立的元素处理,带空格的参数也当做一个整体。

http://xstarcd.github.io/wiki/shell/shell_special_variables.html

他才二十岁,他就是想活命,他有什么罪!

curl 是一种命令行工具,作用是发出网络请求,然后获取数据,显示在”标准输出”(stdout)上面。它支持多种协议,下面列举其常用功能。

查看网页源码

1
curl yangguoqi.me

这个网页我做了301跳转,所以我们看到的源码是这样

1
2
3
4
5
6
7
<html>
<head><title>301 Moved Permanently</title></head>
<body bgcolor="white">
<center><h1>301 Moved Permanently</h1></center>
<hr><center>nginx</center>
</body>
</html>

保存网页源码

1
curl -o yang.txt yangguoqi.me

自动跳转

1
curl -L yangguoqi.me

这样的操作会跟随发生301跳转,获得跳转后的最终源码

显示头信息

1
2
curl -i yangguoqi.me # 连同网页内容一起显示
curl -I yangguoqi.me # 仅仅显示头信息

显示真个通信过程

1
2
curl -v yangguoqi.me #比较简略
curl --trace output.txt yangguoqi.me

允许连接到 SSL 站点,而不使用证书

1
curl -k https://swoole.app

静音模式,不输出任务内容

1
curl -s https://swoole.app # 通常和-S 一起使用

其他参数

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
在以下选项中,(H) 表示仅适用 HTTP/HTTPS ,(F) 表示仅适用于 FTP
--anyauth 选择 "any" 认证方法 (H)
-a, --append 添加要上传的文件 (F/SFTP)
--basic 使用HTTP基础认证(Basic Authentication)(H)
--cacert FILE CA 证书,用于每次请求认证 (SSL)
--capath DIR CA 证书目录 (SSL)
-E, --cert CERT[:PASSWD] 客户端证书文件及密码 (SSL)
--cert-type TYPE 证书文件类型 (DER/PEM/ENG) (SSL)
--ciphers LIST SSL 秘钥 (SSL)
--compressed 请求压缩 (使用 deflate 或 gzip)
-K, --config FILE 指定配置文件
--connect-timeout SECONDS 连接超时设置
-C, --continue-at OFFSET 断点续转
-b, --cookie STRING/FILE Cookies字符串或读取Cookies的文件位置 (H)
-c, --cookie-jar FILE 操作结束后,要写入 Cookies 的文件位置 (H)
--create-dirs 创建必要的本地目录层次结构
--crlf 在上传时将 LF 转写为 CRLF
--crlfile FILE 从指定的文件获得PEM格式CRL列表
-d, --data DATA HTTP POST 数据 (H)
--data-ascii DATA ASCII 编码 HTTP POST 数据 (H)
--data-binary DATA binary 编码 HTTP POST 数据 (H)
--data-urlencode DATA url 编码 HTTP POST 数据 (H)
--delegation STRING GSS-API 委托权限
--digest 使用数字身份验证 (H)
--disable-eprt 禁止使用 EPRT 或 LPRT (F)
--disable-epsv 禁止使用 EPSV (F)
-D, --dump-header FILE 将头信息写入指定的文件
--egd-file FILE 为随机数据设置EGD socket路径(SSL)
--engine ENGINGE 加密引擎 (SSL). "--engine list" 指定列表
-f, --fail 连接失败时不显示HTTP错误信息 (H)
-F, --form CONTENT 模拟 HTTP 表单数据提交(multipart POST) (H)
--form-string STRING 模拟 HTTP 表单数据提交 (H)
--ftp-account DATA 帐户数据提交 (F)
--ftp-alternative-to-user COMMAND 指定替换 "USER [name]" 的字符串 (F)
--ftp-create-dirs 如果不存在则创建远程目录 (F)
--ftp-method [MULTICWD/NOCWD/SINGLECWD] 控制 CWD (F)
--ftp-pasv 使用 PASV/EPSV 替换 PORT (F)
-P, --ftp-port ADR 使用指定 PORT 及地址替换 PASV (F)
--ftp-skip-pasv-ip 跳过 PASV 的IP地址 (F)
--ftp-pret 在 PASV 之前发送 PRET (drftpd) (F)
--ftp-ssl-ccc 在认证之后发送 CCC (F)
--ftp-ssl-ccc-mode ACTIVE/PASSIVE 设置 CCC 模式 (F)
--ftp-ssl-control ftp 登录时需要 SSL/TLS (F)
-G, --get 使用 HTTP GET 方法发送 -d 数据 (H)
-g, --globoff 禁用的 URL 队列 及范围使用 {} 和 []
-H, --header LINE 要发送到服务端的自定义请求头 (H)
-I, --head 仅显示响应文档头
-h, --help 显示帮助
-0, --http1.0 使用 HTTP 1.0 (H)
--ignore-content-length 忽略 HTTP Content-Length 头
-i, --include 在输出中包含协议头 (H/F)
-k, --insecure 允许连接到 SSL 站点,而不使用证书 (H)
--interface INTERFACE 指定网络接口/地址
-4, --ipv4 将域名解析为 IPv4 地址
-6, --ipv6 将域名解析为 IPv6 地址
-j, --junk-session-cookies 读取文件中但忽略会话cookie (H)
--keepalive-time SECONDS keepalive 包间隔
--key KEY 私钥文件名 (SSL/SSH)
--key-type TYPE 私钥文件类型 (DER/PEM/ENG) (SSL)
--krb LEVEL 启用指定安全级别的 Kerberos (F)
--libcurl FILE 命令的libcurl等价代码
--limit-rate RATE 限制传输速度
-l, --list-only 只列出FTP目录的名称 (F)
--local-port RANGE 强制使用的本地端口号
-L, --location 跟踪重定向 (H)
--location-trusted 类似 --location 并发送验证信息到其它主机 (H)
-M, --manual 显示全手动
--mail-from FROM 从这个地址发送邮件
--mail-rcpt TO 发送邮件到这个接收人(s)
--mail-auth AUTH 原始电子邮件的起始地址
--max-filesize BYTES 下载的最大文件大小 (H/F)
--max-redirs NUM 最大重定向数 (H)
-m, --max-time SECONDS 允许的最多传输时间
--metalink 处理指定的URL上的XML文件
--negotiate 使用 HTTP Negotiate 认证 (H)
-n, --netrc 必须从 .netrc 文件读取用户名和密码
--netrc-optional 使用 .netrc 或 URL; 将重写 -n 参数
--netrc-file FILE 设置要使用的 netrc 文件名
-N, --no-buffer 禁用输出流的缓存
--no-keepalive 禁用 connection 的 keepalive
--no-sessionid 禁止重复使用 SSL session-ID (SSL)
--noproxy 不使用代理的主机列表
--ntlm 使用 HTTP NTLM 认证 (H)
-o, --output FILE 将输出写入文件,而非 stdout
--pass PASS 传递给私钥的短语 (SSL/SSH)
--post301 在 301 重定向后不要切换为 GET 请求 (H)
--post302 在 302 重定向后不要切换为 GET 请求 (H)
--post303 在 303 重定向后不要切换为 GET 请求 (H)
-#, --progress-bar 以进度条显示传输进度
--proto PROTOCOLS 启用/禁用 指定的协议
--proto-redir PROTOCOLS 在重定向上 启用/禁用 指定的协议
-x, --proxy [PROTOCOL://]HOST[:PORT] 在指定的端口上使用代理
--proxy-anyauth 在代理上使用 "any" 认证方法 (H)
--proxy-basic 在代理上使用 Basic 认证 (H)
--proxy-digest 在代理上使用 Digest 认证 (H)
--proxy-negotiate 在代理上使用 Negotiate 认证 (H)
--proxy-ntlm 在代理上使用 NTLM 认证 (H)
-U, --proxy-user USER[:PASSWORD] 代理用户名及密码
--proxy1.0 HOST[:PORT] 在指定的端口上使用 HTTP/1.0 代理
-p, --proxytunnel 使用HTTP代理 (用于 CONNECT)
--pubkey KEY 公钥文件名 (SSH)
-Q, --quote CMD 在传输开始前向服务器发送命令 (F/SFTP)
--random-file FILE 读取随机数据的文件 (SSL)
-r, --range RANGE 仅检索范围内的字节
--raw 使用原始HTTP传输,而不使用编码 (H)
-e, --referer Referer URL (H)
-J, --remote-header-name 从远程文件读取头信息 (H)
-O, --remote-name 将输出写入远程文件
--remote-name-all 使用所有URL的远程文件名
-R, --remote-time 将远程文件的时间设置在本地输出上
-X, --request COMMAND 使用指定的请求命令
--resolve HOST:PORT:ADDRESS 将 HOST:PORT 强制解析到 ADDRESS
--retry NUM 出现问题时的重试次数
--retry-delay SECONDS 重试时的延时时长
--retry-max-time SECONDS 仅在指定时间段内重试
-S, --show-error 显示错误. 在选项 -s 中,当 curl 出现错误时将显示
-s, --silent Silent模式。不输出任务内容
--socks4 HOST[:PORT] 在指定的 host + port 上使用 SOCKS4 代理
--socks4a HOST[:PORT] 在指定的 host + port 上使用 SOCKSa 代理
--socks5 HOST[:PORT] 在指定的 host + port 上使用 SOCKS5 代理
--socks5-hostname HOST[:PORT] SOCKS5 代理,指定用户名、密码
--socks5-gssapi-service NAME 为gssapi使用SOCKS5代理服务名称
--socks5-gssapi-nec 与NEC Socks5服务器兼容
-Y, --speed-limit RATE 在指定限速时间之后停止传输
-y, --speed-time SECONDS 指定时间之后触发限速. 默认 30
--ssl 尝试 SSL/TLS (FTP, IMAP, POP3, SMTP)
--ssl-reqd 需要 SSL/TLS (FTP, IMAP, POP3, SMTP)
-2, --sslv2 使用 SSLv2 (SSL)
-3, --sslv3 使用 SSLv3 (SSL)
--ssl-allow-beast 允许的安全漏洞,提高互操作性(SSL)
--stderr FILE 重定向 stderr 的文件位置. - means stdout
--tcp-nodelay 使用 TCP_NODELAY 选项
-t, --telnet-option OPT=VAL 设置 telnet 选项
--tftp-blksize VALUE 设备 TFTP BLKSIZE 选项 (必须 >512)
-z, --time-cond TIME 基于时间条件的传输
-1, --tlsv1 使用 => TLSv1 (SSL)
--tlsv1.0 使用 TLSv1.0 (SSL)
--tlsv1.1 使用 TLSv1.1 (SSL)
--tlsv1.2 使用 TLSv1.2 (SSL)
--trace FILE 将 debug 信息写入指定的文件
--trace-ascii FILE 类似 --trace 但使用16进度输出
--trace-time 向 trace/verbose 输出添加时间戳
--tr-encoding 请求压缩传输编码 (H)
-T, --upload-file FILE 将文件传输(上传)到指定位置
--url URL 指定所使用的 URL
-B, --use-ascii 使用 ASCII/text 传输
-u, --user USER[:PASSWORD] 指定服务器认证用户名、密码
--tlsuser USER TLS 用户名
--tlspassword STRING TLS 密码
--tlsauthtype STRING TLS 认证类型 (默认 SRP)
--unix-socket FILE 通过这个 UNIX socket 域连接
-A, --user-agent STRING 要发送到服务器的 User-Agent (H)
-v, --verbose 显示详细操作信息
-V, --version 显示版本号并退出
-w, --write-out FORMAT 完成后输出什么
--xattr 将元数据存储在扩展文件属性中
-q .curlrc 如果作为第一个参数无效

我想有一间书房,不负光阴,静享慢乐

用在import

1
2
3
4
5
import (
"database/sql"
_"github.com/go-sql-driver/mysql"
"log"
)

引入包,会先调用包中的初始化函数,这种使用方式仅让导入的包做初始化,而不使用包中其他功能

用在返回值

1
2
3
for _,v := range Slice{}

_,err := func()

表示忽略某个值。单函数有多个返回值,用来获取某个特定的值

用在变量

1
2
3
4
type T struct{}
var _ I = T{}

其中 I为interface

上面用来判断 type T是否实现了I,用作类型断言,如果T没有实现借口I,则编译错误.

https://www.jianshu.com/p/309f55a152db