GithubHelp home page GithubHelp logo

blog's Introduction

blog

blog's People

Stargazers

 avatar

Watchers

 avatar

blog's Issues

What does a PHP framework do?

框架,首先定好框,其次做好架

它提供了良好的代码基础。你可以基于此,轻松写代码。

它拥有许多的组件,拆箱即用。

它一定还有一套设计理念,蕴含其中。

它必须接口定义良好,易于他人做扩展。

框架可能:

  • 提供入口文件 index.php,启动你的 app。

    使用现代化的 composer 工具,引入自动加载的入口。

    定义环境。比如:dev,test,prod。

    定义常量。

    加载配置。

    启动 app。

  • 将请求地址路由到某个方法,执行以后返回结果给浏览器。

    在执行业务逻辑之前可能会作些前置处理。比如:用户检测,权限检查,参数预判断等。

    在执行业务之后可能会作些后置处理。比如:输出格式化,补充输出头信息等。

  • 自带多个常用数据库驱动

linux setup

Debian GNU/Linux 工作环境安装配置

  • GNOME

    现代化,工具包丰富。

  • i3

    极轻,极简,Tiling window。

tar usage

tar

解压缩

$ tar xf you_file.tar.gz

$ tar xf you_file.tar.xz

指定目录解压缩

$ tar xf you_file.tar.gz -C /path/to/dir

JetBrains IDE 持续试用方法

for macOS

# step 1 remove eval key
rm ~/Library/Application Support/JetBrains/PhpStorm2021.2/eval/PhpStorm212.evaluation.key

# Step 2 Remove all `evl*` properties
nvim ~/Library/Application Support/JetBrains/PhpStorm2021.2/options/other.xml

# step 3 clear eval cache plist
rm ~/Library/Preferences/jetbrains.phpstorm.*.plist

# Step 4 Remove device id and user id for jetbrains ide
open ~/Library/Preferences/com.apple.java.util.prefs.plist

# Step 5 Kill Preferences Daemon to cache new preferences
ps ax | grep cfprefsd

Linux

# 1 remove eval/*.key
rm ~/.config/JetBrains/PhpStorm2021.2/eval/PhpStorm212.evaluation.key

# 2 remove all properties named `evl*` in options/other.xml
nvim ~/.config/JetBrains/PhpStorm2021.2/options/other.xml

# 3 clear cache
rm -rf ~/.java/.userPrefs/jetbrains/phpstorm

# 4 clear all device_id related with jetbrains
nvim ~/.java/.userPrefs/prefs.xml
nvim ~/.java/.userPrefs/jetbrians/prefs.xml

Microsoft Windows

# 1. Detele eval key
del %USERPROFILE%\AppData\Roaming\JetBrains\PhpStorm2021.2\eval

# 2. delete all `evl*` properties
edit %USERPROFILE%\AppData\Roaming\JetBrains\PhpStorm2021.2\options\other.xml

# 3. Delete device id and user id
del %USERPROFILE%\AppData\Roaming\JetBrains\PermanentDeviceId
del %USERPROFILE%\AppData\Roaming\JetBrains\PermanentUserId

# 4. Delete reg entry jetbrains
reg delete HKEY_CURRENT_USER\Software\JavaSoft\Prefs\jetbrains /f

rabbitmq 常用操作

安装 RabbitMQ

默认用户及密码 guest/guest

常用管理命令

使用 rabbitmqctl 管理 rabbitmq 服务。

# 获取命令帮助
$ rabbitmqctl --help

# 查看运行状态
$ rabbitmqctl status

# 列出当前所有 rabbitmq 用户
$ rabbitmqctl list_users

# 列出指定用户的权限
$ rabbitmqctl list_user_permissions USER

# 删除指定用户
$ rabbitmqctl delete_user USER

# 添加新用户
$ rabbitmqctl add_user USER PASS

# 设置用户标签
$ rabbitmqctl set_user_tags USER TAG1

# 设置权限
$ rabbitmqctl set_permissions -p / USER ".*" ".*" ".*"

ref https://www.cnblogs.com/justuntil/p/11270401.html

linux man 手册的章节序号的含义

man 是手册工具

man 手册的章节序号的含义:

  • 1 可执行程序或shell命令
  • 2 系统调用,内核提供的函数
  • 3 库调用,程序库提供的函数
  • 4 特殊文件,通常位于 /dev
  • 5 文件格式和公约,如 /etc/passwd
  • 6 游戏
  • 7 杂集,包括宏定义和公约,如 mangroff
  • 8 系统管理命令,通常针对于root用户
  • 9 内核事务

key concepts of E-commerce application

购物车 cart

订单管理系统 order manage system

商品 product/goods

多语言 multiple languages

多货币 multiple currencies

税费 tax

多商家 multi-vendor

多仓库

多物流

多支付方式 multiple payment methods

推荐购买 aff

商品的导入/导出

数据库的备份与恢复

C basics

C basics

C 语言基本知识要点

万丈高楼平地起。

基础不打牢,这座楼必然不稳当。

C 语言有所有语言的共性,有数据类型,有运算符,有控制结构,还有更加灵活的指针。

C 的灵魂所在 -- 指针。

C 语言是面向过程语言,但依然可以有效的组织代码,实现大的系统。

C 语言标准还在发展。从没有标准到 ANSI C,再到 C89, C99,C11,C17 等。

hello world

C 语言程序的基本结构。

主函数 main() {}

可选的头文件的引入 #include <stdio.h>#include "other.h"

可选的函数返回值。

程序示例:

#include <stdio.h>

int main(void)
{
    printf("Hello World\n"); // printf 函数在 stdio.h 标准库中的定义,因为需要引入头文件 stdio.h
    return 0;
}

要点:函数必须先声明才能调用。函数库提供了许多函数,所有需要引入头文件,从而得到函数和其他的常量定义,必要的时候还需要在编译的时候指定函数库的名称,如:数学函数库。

程序如何编译和调试:

# 默认输出  a.out
$ cc helloworld.c

# -o 指定输出的文件名,而不是 a.out
$ cc helloworld.c -o helloworld

# -S 编译输出汇编代码,默认是 at&t 语法的汇编
$ cc -S helloworld.c -o helloworld.s

# -masm=intel 输出 intel 语法的汇编
$ cc -S -o helloworld.s helloworld.c -masm=intel -fverbose-asm

# 带调试信息的编译,可用于 gdb 调试
$ cc -g -o helloworld helloworld.c

# 编译数学函数库的头文件时, -lxx xx 是具体的库名称,如数学函数库名是 m
$ cc -o helloworld helloworld.c -lm

# 查看一个二进制程序链接使用的库 ldd 工具
$ ldd /usr/bin/cc
        linux-vdso.so.1 (0x00007ffc349fd000)
        libm.so.6 => /lib/x86_64-linux-gnu/libm.so.6 (0x00007fa4a6a49000)
        libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007fa4a6888000)
        /lib64/ld-linux-x86-64.so.2 (0x00007fa4a6bf0000)
        
# learn more: nm, ar

类型,操作符,表达式

  • 变量名

    问:为什么需要变量及变量名?
    答:变量是编程语言不可缺少的元素。当一个变量在稍后要使用,或需要重复使用,因此需要一个名称来标记变量,谓之变量名。

    问:变量名的命名规则是什么?
    答:数字不可以做变量名,数字 5 就是我们认识的数字 5,不可能将它再当做变量名来用;数字也不能做变量的开头,5d 这是不可以做变量名的,但是 d5 这样是可以做变量名的;下划线开头也是可以的,如 _d5,下划线当然也可以出现在中间,如 member_age

  • 数据类型和大小

    说到数据类型,先说一下数据是如何存储的。计算机是一堆电子元器件的组合,它只能存 0 和 1 ,也就是两个状态,我们称为位。一个位只有一个状态,要么是 0 要么是 1 ,就像一个 Switch 开关一样,要么是打开状态要么是关闭状态。为了存储和表示更多数据,我们发明了字节,一个字节等于 8 位。随着计算机的发展,又发明了 Word,谓之为 “字” 。字的大小通常代表了我们所说的计算机系统的位数。如 32 位操作系统,说明是 32 个位是一个字,即 4 个字节;64 位系统,说明是 64 位是一个字,即 8 个字节。字,展现的是计算机可以一次性处理数据的宽度,是寄存器的位数,是一次内存寻址的地址宽度,是指令的操作数的位数如加载数据和存入数据。Intel 4004 芯片是 4 位的字,Intel 8086 是 16 位的字,到目前 Intel 有 32 位和 64 位的字。并且 64 位已经成为主流。

    讲到了字,再说数据类型就简单了。常见的是数据类型是整型 Integer 。整型到底有多长,跟系统的位数有关系,请看下表:

    Type 32 bit 64 bit
    short int 16 bit 16 bit
    int 32 bit 32 bit
    long int 32 bit 64 bit
    long long int 64 bit 64 bit
    size_t 32 bit 64 bit
    void* 32 bit 64 bit

    整型的长度,完全是跟硬件架构有关,更跟编译器的实现有关。C 标准并没有严格规定。简单可以看到,在 32 位和 64 位的系统中,int 型一般 32 位,long long int 一般为 64 位,short int 一般为 16 位。但是在 16 位的系统上,short intint 可能均为 16 位了。

    以程序员的角度来思考,我们可以通过 C 运算符 sizeof 来检测类型的长度。用法如下:

    sizeof(Type)
    sizeof Type

    See intlength.c.

    Learn more about int: stdint.h

    说完整型,再说最接近的 char 型,实际是 1 字节的整型,用于存储 ASCII

    See charlength.c.

    再说说浮点型。浮点型分为单精度和双精度,分别是 floatdouble,同时还有 long double 。同样,我们可以使用 sizeof 来检测这些类型的长度。

    See floatlength.c.

    在生活中,在科学计算中,既有正数也会有负数。在 C 语言中称有符号号和无符号数,分别是用 signedunsigned 表示。有符号的数意思是将最高位置 1 表示负责,0 表示正数;无符号的数则最高位也计作数字。以上所有类型,都可以加上符号前辍,若不加,默认是有符号数。

    See signed.c.

    请看下表:

    Type 32 bit 64 bit
    float --- 32 bit
    double --- 64 bit
    long double --- 128 bit

    Learn more about float point number: IEEE-754.

  • 常量

    有变量,就可能会有不变的量,谓之常量。

    假如需要定义一个常量 PI

    #define PI 3.14

    所有用到 PI 的地方都会被替换成 3.14。这种方式,我叫它符号常量,它只是被拿过来替换一下。

    还有另一种方式,使用 const

    const double PI = 3.14;

    const 的方式,我叫它只读变量,生活中可称之为常量,是不变的变量。两者还是有区别的

    浮点运算,有专门的指令和寄存器,如 movsdxxm0~7addsd

  • 声明

    C 语言要求变量和函数,都要先声明再使用。

    int age;
    char captital = 'G';
    double price = 2.3;

    变量声明时,可以同时进行赋初值。

  • 数学运算符

    在耳濡目染下,我们常见的加、减、乘、除四则运算。
    另外还有取余运算,又叫取模。

    运算符 C 语言表示
    +
    -
    *
    /
    取余 %
  • 关系和逻辑运算符

    关系运算符,常见的有:大于、小于、等于、小于或等于、大于或等于。在汇编层面,利用 CMP 比较指令 和 Jcc 条件转移指令实现关系运算。条件转移指令如:JNEJLE等。比较指令 CMP 做了两件事,其一让两个操作数相减,其二根据相减的结果设置 EFLAGS 状态寄存器的各个状态位。而其后使用的条件转移指令则是读取 EFLAGS 中的各状态位来工作的。

    See more x86-jumps.

    逻辑运算符,常见的有:与、或、非。
    请看下表:

    逻辑运算符 表示
    &&
    ||
    !

    C 语言中的逻辑运算符到了汇编层面以后,则完全是基本的 CMPJcc 指令的组合。

    CPU 电路当中集成了大量的门电路,如:与门、非门、或门。变换交错使用这些基本的门电路可以实现复杂的电路。

  • 类型转换

    在必要的情况下,我们会进行类型转换。有些是 C 语言编译器的自动转换,还有就是程序员可以进行强制类型转换。
    强制转换的语法就是在要进行类型转换的操作数之前加上类型定义,如:

    int a = 100;
    (long int) a;
    (double) a;

    无论是哪一种转换,说到底层,自然是有汇编指令支持的。比如单精度和双精度浮点数之间的转换指令:CVTSD2SSCVTSS2SD。再如整型和双精度浮点型之间的转换指令:CVTSI2SDCVTSD2SI

    CVT: convert
    SS: Scalar Single-precision
    SD: Scalar Double-precision
    SI: Signed Integer

    类型转换,自然会有副作用。比如精度丢失 double => float,比如数据丢失 int => char

  • 自增与自减运算符

    在循环处理中,一般会进行自增或自减处理。汇编指令中有 INCDEC。在 C 语言中提供了运算符 ++--。它相比于加法和减法效率更多。

  • 位运算符

    位运算就是说每一个二进制的位都参与运算。

    位运算分为:

    位运算 C 语言表示
    按位与 &
    按位或 |
    按位取反 ~
    按位异或 ^
    按位左移 <<
    按位右移 >>
  • 赋值运算符与表达式

    变量赋值,使用 =。还有些运算符可以和它一起用。如下:

    int a = 0;
    a += 2;
    a -= 3;
    a *= 4;
    a /= 5;
    a %= 6;
    
    a >>= 1;
    a <<= 2;

    表达式,有:赋值表达式,数学运算表达式。

  • 条件表达式

    普通赋值表达式,涉及一个变量,和一个操作数。
    普通数学运算表达式,涉及一个运算符和两个操作数,并且运算符会出现在两个操作数的中间位置。
    那么,还有一种是三目运算符。形如:a ? b : c。意思是当 a 为真,结果取 b,否则结果取 c。涉及三个操作数,所以称为三目运算。

  • 运算符优先和计算顺序

    生活中都知道,先算乘除再算加减法。
    C 语言中也定义了许多的优先级,规则当然是高优先级的先运算,有括号情况下先运算括号里的表达式。

控制结构

  • statements and blocks

    表达式已经提到过,表达式后面加上 就是完整的语句。例如:

    int a;
    int b = 3;
    a = b + 3;

    多条语句往往可以表达一串完整的逻辑运算过程,可以使用 {} 包括起来构成语句块。例如:

    {
        int i, j;
        i = 1;
        j = 2;
    }

    语句块通常用于控制结构体和循环体。见下。

  • if-else

    如果要判断一个人是否是成年人,我们可以这样写程序:

    int age;
    age = 17;
    
    if (age >= 18) {
        printf("age = %d, is a adult\n", age);
    } else {
        printf("age = %d, is not a adult\n", age);
    }
  • else-if

    如果给定一个数,如果大于 0 ,输出 1 ;如果小于 0 ,输出 -1 ;否则,输出 0 。

    我们可以这样写程序:

    int number;
    number = 22;
    
    if (number > 0) {
        printf("%d\n", 1);
    } else if (number < 0) {
        printf("%d\n", -1);
    } else {
        printf("%d\n", 0);
    }
  • switch

    如果要做一个简易的四则运算的计算器,使用 if-else-if 我们当然可以做,但是我们还有一个选择。

    int a, b;
    char op;
    
    a = 3;
    b = 5;
    op = '+';
    
    switch (op) {
        case '+':
        printf("%d + %d = %d\n", a, b, a+b);
        case '-':
        printf("%d - %d = %d\n", a, b, a-b);
        case '*':
        printf("%d * %d = %d\n", a, b, a*b);
        case '/':
        printf("%d / %d = %d\n", a, b, a/b);
        default:
        printf("Not supported!\n");
    }
  • loops -- while and for

    计算机之所以强大,其一是可以按部就搬的执行程序员录入的程序;其二是可以做枯燥的重复性的计算任务,比如循环。

    循环的要领是,其一是有初值,初值可不设;其二要有结束条件;其三是要有步进器,用于修改循环体中的某个变量。对于已知循环次数的条件,可以使用 whilefor 循环。

    注意:如果初值已满足结束条件,那么便不会进入循环体。

    如果要计算一个数字的阶乘,可以这样做:

    int number;
    int result = 1;
    
    number = 7;
    for (; number > 1; number--) {
        result *= number;
    }

    或这样做:

    int number;
    int result = 1;
    
    number = 7;
    while (number > 1) {
        result *= number;
        number--;
    }

    这两种形式的循环,生成的汇编代码,完全一致。

  • loops -- do-while

    do-while 循环,跟 while 不同。不同在于,首先会进行循环体执行一次,最后再进行循环条件的判断。

    形如:

    do {
        ; // loop body
    } while (loop condition);
  • break and continue

    讲到循环,往往少不了的要跳出循环,使用 break。与之相对的就是 continue

    switch 语法里也需要借助 break 跳出分支。像上面写的简单的四则运算的计算器是有问题的。

  • goto and labels

    另外,可以在一段代码前加上 LABEL:,然后结合 goto LABEL 即可无条件跳转至由 LABEL 标记的代码处。

    goto 尽量少用。

函数与程序结构

普通 C 语言应用程序,必须有一个 main 函数,它是入口函数,那么总不能把所有的功能代码都写进 main 函数吧。并且一块功能单一可被重复使用的代码如何复用呢?答案是函数。

函数让代码分块,函数可以让问题由大化小。函数让程序变得不再平凡,就像超链接让网页伟大一样。

函数可以让一部分人专注写函数,称之为库函数,让我们站在抽象层去编程。

函数像一个黑盒子,提供输入,我们调用函数,以得到执行结果,怎么执行的,我们不用管。

  • 函数基础

    函数三要素:函数名称、函数参数、函数返回值。
    函数名称与变量名称的规则并无两样。
    函数参数,代表了函数的输入。包括有参数名称和参数的数据类型。
    函数的返回值,代表了函数的输出。主是要讲它的返回值类型。可以是任一数据类型,再加上 void 类型表示无返回值。

    ASM on X64
    整型传参利用寄存器:rdi, rsi, rdx, rcx, r8, r9,返回值 rax
    浮点传参利用寄存器:xmm0 ~ xmm7,返回值 xmm0
    更多的输入参数,则是通过堆栈。

  • 外部变量

    到目前为止,所有的变量都是在函数内定义的。包括 main 函数中的变量也是如此。这样的好处是什么:函数内的变量,别的函数是访问不到的,且一旦函数执行结束变量就会被销毁。
    问题来了,如果函数执行结束后,仍然需要保留变量,怎么办?在函数外定义变量。

  • 作用域规则

  • 头文件

  • 静态变量

    静态变量,使用 static 修饰。
    函数外,使用 static 表示本文件内可用,私有变量。
    函数内,使用 static 表示本函数内,永久变量。函数退出后,变量不会消失。

  • 寄存器变量

  • 块结构

  • 初始化

  • 递归

  • C 预处理器

    所谓预处理,是在正式编译 C 语言之前,先处理宏定义,进行宏查找和宏替换。

    很多宏指令,条件宏。

指针与数组

C 的灵活强大在于指针。

printf: %p 用于输出内存地址。

  • 指针与地址

    指针,也是一个变量。
    每一个变量,在程序运行时,系统会为其分配地址,而指针保存的就是变量的地址。如:

    int a = 100;
    int *p;
    p = &a;
    *p = 200;
  • 指针与函数参数

    函数传参是值传递,即传递的是变量的值。

  • 指针与数组

    指针,储存的是地址,是变量,可以保存其他地址。
    数组名称,标记了数组的起始元素的地址,是不变的,不可以修改。

    假如有以下代码:

    int a[] = {1, 1, 2, 3, 5, 7, 13};
    int *p;
    p = &a[0]; // or p = a;
    int i = 0;
    
    a[i];
    *(a+i);
    *(p+i);
    p[i];

    在访问数组的元素时,可以把数组名称当成指针运算,如可以取值,方法有两种:a[i]*(a+i);也可以使用指针来访问,方式也有两种:*(p+i)p[i],并且指针还可以移动,如 p++ 指向下一个数组元素的地址。

    myFunc(char a[]);
    myFunc(char *a);

    这样的用法是完全一致。

  • 字符指针与函数

    char a[] = "hello world";
    char *b = "hello world";

    这两者是不同的。a 里每一个字符或许会变,可修改;b 的里面的字符不可修改,只能重新指向另一个字符串,即只能修改 b 的地址。

    Learn more: string.h.
    strcpy(char *, char *)
    strcmp(char *, char *)

  • 指针的数组,指针的指针

    指针是变量,因此可以将一批指针组合在一起形成数组。即数组的每一个元素都是指针变量。

    举例:

    char *charlines[100];

    定义了一个数组,有 100 个元素,每个元素是指向字符的指针。

  • 多维数组

  • 指针与多维数组

    int a[10][20];
    int *a[10];

    体会两者区别。

  • 命令行参数

    int main(int argc, char *argv[])
    {
        ;
    }
  • 函数指针

    可以将函数作为参数传给另一个参数。传递的是函数的地址。是指向函数的指针。
    如何调用这个函数呢?(* funcPonter)(arg1, arg2)

  • 复杂声明

结构

  • basic sturcture

    结构体,可以将多个数据放在一起,有类型有名称,是一块地址连续的空间。
    如果要定义一个数轴上的点:

    struct point {
        double x;
        double y;
    };
    
    struct point A = { 3.0, 4.0 };
    struct point *p;
    p = &A;
    p->x;
    p->y;
  • other

how to evaluate test in shell script

$ which test
test: shell built-in command

$ man test

System info:
$ uname -a
Linux debian 4.19.0-4-amd64 #1 SMP Debian 4.19.28-2 (2019-03-15) x86_64 GNU/Linux

用途分类:

  • 字符长度测试
    -z String 字符串长度为0
    -n String 字符串长度不为0
  • 字符串相等性测试
    String1 = String2 两个字符串相等
    String1 != String2 两个字符串不相等
  • 数字比较测试
    Int1 -eq Int2 等于
    Int1 -ne Int2 不等于
    Int1 -gt Int2 大于
    Int1 -ge Int2 大于或等于
    Int1 -lt Int2 小于
    Int1 -ge Int2 小于或等于
  • 两个文件之间测试
    File1 -ef File2 两个文件有相同的 device 和 inode 编号
    File1 -ot File2 以文件最后的修改日期比较,老于
    File1 -nt File2 以文件最后的修改日期比较,新于
  • 文件存在性测试
    -e File 文件存在
  • 文件类型测试
    -f File 文件存在,且是普通文件
    -d File 文件存在,且是目录
    -b File 文件存在,且是块设备文件
    -c File 文件存在,且是字符设备文件
    -h File-L File 文件存在,且是软链接
    -p File 文件存在,且是命名管道
    -s File 文件存在,且文件大小大于0
    -S File 文件存在,且是套接字
  • 文件权限测试
    -r File 文件存在,且有可读权限
    -w File 文件存在,且有可写权限
    -x File 文件存在,且有可执行执行
  • 复合性测试 and or
    -a
    -o
  • 其他
    -O
    -u
    -g
    -G
    -t
    -k

命令格式:

  • test -f File
  • [ -f File ]

[ ] 此格式,必须前后各有一个空格。

elasticsearch 开启 xpack

生成证书

$ elasticsearch-certutil ca
$ elasticsearch-certutil cert --ca elastic-stack-ca.p12

将生成的2份证书文件移入 config 目录

修改配置文件 $ESHOME/config/elasticsearch.yml

xpack.security.enabled: true
xpack.security.transport.ssl.enabled: true
xpack.security.transport.ssl.verification_mode: certificate
xpack.security.transport.ssl.keystore.path: elastic-certificates.p12
xpack.security.transport.ssl.truststore.path: elastic-certificates.p12

$ESHOME 指代 elasticsearch 安装目录

设置 es 用户密码

$ $ESHOME/bin/elasticsearch-setup-passwords interactive

cors

Same Origin Policy, or SOP.

read PHP source, aka RPS

Read PHP Source

阅读 PHP 源码。

  • 准备工作和背景知识

    • 环境搭建
    • 源码结构,阅读源码方法
    • 常用代码
  • 用户代码的执行

  • 变量及数据类型

  • 函数的实现

  • 类和面向对象

  • 内存管理

  • Zend 虚拟机

  • 线程安全

proxy

prerequisites

socks5 proxy setting up using shadowsocks-libev with gcm encrypt method.

a tool like tinyproxy to transform socks5 proxy to http proxy.

For software that respect PROXY ENV settings

$ export http_proxy='http://server:port'
$ export https_proxy='http://server:port'
# and go
$ docker search xxx
# or
$ composer update -vvv
# or
$ sudo apt install docker-ce

ssh over http proxy using corkscrew

example config of ~/.ssh/config

Host github.com
    Hostname ssh.github.com
    User git
    Port 443
    ServerAliveInterval 55
    ForwardAgent yes
    ProxyCommand corkscrew 127.0.0.1 8888 %h %p

git

git through http protocol can use http_proxy and https_proxy.

but through git+ssh need corkscrew to enable ssh over http proxy.

google-chrome

For one time run:

$ google-chrome --proxy-server="socks5://socks_server:port"

For persistent configuration: use SwitchyOmega

cli tools shell script http_proxy wrappers

let's take git for example:

#!/bin/zsh

# setting http proxy
export {http_proxy,https_proxy}=http://127.0.0.1:8888
# or
export {HTTP_PROXY,HTTPS_PROXY}=http://127.0.0.1:8888

# pass all params to our cli tools, let's take git for example
git $@

浅谈软件系统的日志等级

error

参数错误,系统内部错误,系统外部错误,等等导致正常业务流程中断的错误。

warning

业务流程未中断,导致服务降级,需要引起开发者注意。

info

业务流程的重要划分,以此展示业务细节。

trace

为了展现程序代码的详细执行流程及其上下文参数。

logstash 简单配置

主配置文件

配置文件位置 $LOGSTASH_HOME/config/logstash.yml

http.host: "0.0.0.0"
http.port: 9600
path.config: /usr/share/logstash/pipeline
config.reload.automatic: true
xpack.monitoring.enabled: true
xpack.monitoring.elasticsearch.username: logstash_system
xpack.monitoring.elasticsearch.password: qwer1234
xpack.monitoring.elasticsearch.hosts: ["http://elasticsearch:9200"]
xpack.monitoring.collection.interval: 10s

pipeline example

input {
  rabbitmq {
    durable => true
    exclusive => false
    passive => false
    codec => "json"
    host => "localhost"
    port => 5672
    user => "USER"
    password => "PASS"
    prefetch_count => 5
    ssl => false
    vhost => "/"
    threads => 5
    exchange => "EXCHANGE"
    key => "KEY"
    queue => "QUEUE"
    type => "TYPE"
  }
}

output {
  elasticsearch { 
    hosts => ["localhost:9200"]
    index => "%{type}-%{+YYYYMMdd}"
    document_id => "%{id}"
    user => "USER"
    password => "PASS"
  }
}

RPS-1: 环境搭建

环境搭建

PHP 是使用 C 语言写,编译 PHP 跟编译其他的 C 语言项目类似,那就是三部曲:

  • ./configure
  • make
  • make install

Get PHP source code

PHP 源码项目用 github.com 托管。项目地址是:https://github.com/php/php-src

PHP 官网地址:https://php.net

configure

configure 脚本用于配置编译参数。

它有哪些参数? 通过命令 ./configure --help 获取。

$ ./configure --disable-all

本节为了加快编译速度,使用 --disable-all 禁止了所有的扩展。
稍后有需要,再重新指定参数,再编译。

使用 git 迁出的代码库没有生成 configure 脚本,我们需要执行命令 ./buildconf 生成。
而从 php.net 官网下载的 PHP 代码则有 ./configure 脚本。

make

$ make -j$(nproc)

nproc 用于获取 cpu 的核心数。

make -j 用于指定同时进行的任务个数,一般不要超过 cpu 的核心数。

*make install

make install 是安装命令,将编译好的文件复制到相应的目录。在本次学习中,这是可选的操作。

结果

本次编译好的 php 位于 sapi/cli/php

$ ./sapi/cli/php -v

FAQs

Add later.

关于 dvorak 键盘布局

dvorak 据说可以比 qwerty 打字更快,更省力。

我也花了一个小时的时间熟悉了键位,打英文挺好,打五笔略吃力。

composer install 如何在**加速

$ composer config -g repo.packagist composer https://php.cnpkg.org

$ composer config -g repo.packagist composer https://mirrors.aliyun.com/composer/

golang 文档本地化访问

$ go get -u golang.org/x/tools/cmd/godoc

$ godoc -http=:9999

# open your favorite brwoser to access http://localhost:9999

fecshop 安装与配置速记

事情太多,没法儿一下子全印记在脑子里,所以随手一记。

fecshop 安装篇

安装配置基础环境

  • web(nginx/apache)
  • mysql
  • mongodb
  • redis
  • xunsearch

无论是使用传统的 LNMP,还是使用现代化的 docker 技术,以上是必须具备的服务。

创建 fecshop 项目

创建项目的方法:

composer -vvv create-project fancyecommerce/fecshop-app-advanced fecshop "1.6.2.0"

注意:1.6.2.0 是版本号,请一直保持安装最新稳定版本。

配置 mysql, mongodb, redis, cache, session

配置文件位于:common/config/main-local.php

准备线上域名解析或本地域名解析

fecshop 是多入口,所以需要多域名支持。

fecshop 考虑到图片加载的优化,所以需要多个图片域名针对多个入口做优化。

做好 web 目录的配置

各个入口,配置到每个入口的 web 目录

各个图片域名,配置到 appimg 下面的各个入口的图片存放目录

配置语言

fecshop 支持多语言,因此可以配置各个入口的默认语言和可选择的语言。

语言配置文件位于:common/config/fecshop_local_services/FecshopLang.php

配置货币

fecshop 支持多货币,因此可以配置。

货币配置文件位于:common/config/fecshop_local_services/Page.php

配置 store 域名

前端多入口均需要配置 store 域名。

配置文件位于:@app/config/fecshop_local_services/Store.php

@app 意味着每一个入口的代称,它可以是 appfront,appserver,apphtml5

图片域名配置

配置文件位于:common/config/fecshop_local_services/Image.php

导入数据库表结构和基础数据

# mysql
$ php yii migrate --interactive=0 --migrationPath=@fecshop/migrations/mysqldb

# mongodb
$ php yii mongodb-migrate  --interactive=0 --migrationPath=@fecshop/migrations/mongodb

测试数据导入(选)

mysql 数据

mongodb 数据

图片资源

迅搜同步脚本

为了使 迅搜 工作,需要将产品数据从数据库同步到搜索工具中。

迅搜同步脚本文件位于:@fecshop/shell/fullSearchSync.sh

@fecshop 意思是 fecshop 安装到 vendor 目录中的根目录

参见:http://www.fecshop.com/doc/fecshop-guide/develop/cn-1.0/guide-fecshop-about-config.html

tools

markdown editor

  • ghostwriter (Linux)
  • Macdown (Max OS X)

git gui

  • fork (Mac OS X)
  • sourcetree (Mac OX X)
  • gitk

editor

  • vim or neovim

database management

  • PHPMyAdmin (written in PHP)
  • Sequel Pro (Mac OS X)

Wubi Input Method

  • Scim wubi (Linux)
  • Baidu Wubi (iOS)
  • 清歌五笔 (Mac OS X)

Terminal

  • urxvt (Linux)
  • alacritty (Mac OS X)

HTTP Cookie

Cookie: the old and the future

From Wikipedia:
https://en.wikipedia.org/wiki/HTTP_cookie

RFC 2109:
https://tools.ietf.org/html/rfc2109

RFC 2965:
https://tools.ietf.org/html/rfc2965

RFC 6265:
https://tools.ietf.org/html/rfc2965

Terminology

Session Cookie

session id stores in cookie.

session cookie is deleted after user closing browser.

Persistent Cookie

cookie with expiration.

Secure Cookie

Secure flag.

send from https.

Http-only Cookie

HttpOnly flag.

scripting language like js cannot modify this kind of cookie.

Same-site Cookie

made from Chrome version 51.

Third-party Cookie

Cookie Structure

  1. Name

  2. Value

  3. Zero/More attributes. Attributes store information such as Cookie's expiration, domain and flags (such as Secure, HttpOnly).

Cookie Implementation

Browser require to surport:

  • as large as 4096 bytes in size
  • 50 cookies per domain(i.e. per website)
  • 3000 cookies in total

Set a cookie

Cookies are set using Set-Cookie Http header, sent in an HTTP response from the web server.

Cookie value has its own limitation: it may consist any printable ASCII character(! through ~, Unicode \u0021 through \u007e) excluding , and ; and whitespace character.

Cookie name also has its onw limitation: it excludes the same characters, as well as =.

Cookie attributes

Browsers only send cookie's name and value. Cookie attributes are used by browsers to determine when to delete a cookie, block a cookie or whether to send a cookie to the server.

Domain and Path

The Domain and Path attributes define the scope of the cookie.

Expires and Max-Age

The Expires attribute defines a specific date and time for when the browser should delete the cookie.

Alternatively, the Max-Age attribute can be used to set the cookie's expiration as an interval of seconds in the future, relative to the time the browser received the cookie.

Secure and HttpOnly

The Secure and HttpOnly attributes do not have associated values.

linux change hostname

If you want to check first

# check current hostname
$ hostname

# or get the long format
$ hostname --long

# or get the short format
$ hostname --short

# or using hostnamectl
$ hostnamectl status

set hostname

# this command will change /etc/hostname, and also change current hostname in memory
$ hostnamectl set-hostname YOUR_HOSTNAME

# remember to edit /etc/hosts with your new hostname
$ vi /etc/hosts

CentOS 7 服务器配置简明指引

epel and ius repo

$ yum install \
https://repo.ius.io/ius-release-el7.rpm \
https://dl.fedoraproject.org/pub/epel/epel-release-latest-7.noarch.rpm

ref https://ius.io/

安装常用基础工具

防火墙 Firewalld

  • 临时关闭防火墙
  • 适当配置,放行必须的端口及服务

安全防护 SELinux

  • 临时关闭 SELinux

网络故障检查思路

  • DNS 返回空结果或假结果,如 127.0.0.1 或 0.0.0.0
  • 改用官方公共 DNS Server,如谷歌、阿里云等厂商提供

xdebug 在 PhpStorm 中进行断点调试的风花雪月

潜心作研究的同学请进入 xdebug 官网查找资料。

see https://xdebug.org/

以下内容仅作为本人使用速记指令,考虑不周请谅解。

安装 xdebug 扩展

安装命令参考

# CentOS 7, https://ius.io
$ yum install php73-pecl-xdebug

# or Debian
$ apt install php-xdebug

修改 xdebug 配置参数

编辑 php.ini 文件,或编辑 /etc/php/conf.d/xdebug.ini 文件,或类似文件,请通过 php --ini 获取 php 加载的配置文件线索。

关键配置项请参考

extension=xdebug.so

xdebug.remote_enable=1
xdebug.remote_port=19000
xdebug.idekey=PHPSTORM

别忘了重启 php-fpm 服务。

设置 PhpStorm

通过菜单栏,找到 “文件” - “设置” 并进入设置窗口,找到“语言与框架” - “PHP” - “Debug”,设置 xdebug 端口号 19000 并勾上“接受外部连接”。

Screenshot from 2020-11-29 16-55-27

通过菜单栏,找到 “运行” - “编辑配置” 并进入编辑配置窗口,点击左侧 “+” 选择 “PHP 远程调试”,配置 server 和路径映射。

Screenshot from 2020-11-29 16-56-46

Screenshot from 2020-11-29 16-57-40

以上配置得七七八八了,想要进行断点调试,还需要:

  • 在 PhpStorm 中合适的位置设置断点
  • 点击 Run - Debug 按纽,开启 xdebug 会话
  • 发送请求时带上标识,可通过 Query 参数,Form 表单参数,或 Cookie 参数
  • 最后,请掌握如何操作断点

XDebug helper 浏览器插件

安装插件,启用插件后,可以方便的发送相应的 Cookie 信息。

以下是谷歌浏览器中 xdebug helper 插件设置界面

Screenshot from 2020-11-29 16-53-59

以下是通过谷歌浏览器 F12 查看网络请求,在启用 xdebug helper 插件后,cookie 中会有 xdebug 会话标识

Screenshot from 2020-11-29 16-59-35

整点儿实在的

Screenshot from 2020-11-29 16-49-15

php oop

类的声明需要 `class' 关键字。

类的名称要求不能是 PHP 保留关键字。以字符或下划线开头,跟上任意多的字符,数字或下划线。
类的名称若以正则表达式表示是:^[a-zA-Z_\x7f-\xff][a-zA-Z0-9_\x7f-\xff]*$。

类可以包含常量,变量(称之为属性),函数(称之为方法)。

在对象上下文中,$this 伪变量可以使用。它是一个当前调用对象的引用。
当静态调用方法时,$this 是未定义的。

使用关键字 new 创建类的实例。当没有参数需要传递给类的构造器时,括号可以省略。
创建对象时,类名可以是变量指代的字符串。如若类处于命名空间下,须指明全部命名空间。
在类的上下文中,可以使用 new self 和 new parent 创建对象。

对象的赋值,只是对象的引用,而不是对象的复制。如果需要复制,使用 clone。

instanceof 关键字,判断一个对象是否是一个类的实例。

PHP 5.4.0 引进了使用一条语句可以访问一个新创建的对象的成员的可能性。

赋值给属性一个匿名函数,直接调用是不可行的。PHP 5.3.0 时可以先赋值给变量,再调用;
到了 PHP 7.0.0 通过用圆括号包围调用是可行的。

PHP 继承使用关键字 extends。且只能继承自一个基类。
继承的方法和属性可以被重新声明以覆写。带有 final 修饰符的不可以再次在子类里声明。
访问父类成员可使用 parent::prop 或 parent::method()。

PHP 5.5.0 起,::class 常量,用于获取类的完整类名称。如 SimpleClass::class。

类的属性的值,只能是常量表达式。属性的访问分为静态属性和非静态属性,如:$this->prop,
或 self::$prop。
PHP 5.3.0 起,类的属性可以使用 nowdoc 和 heredoc。

类的常量不可变,值必须是常量表达式。接口也可以有常量。

类的常量,只会针对每个类分配一次,而不是针对类的实例。

类的常量的访问方式,在类内部可用 self::CONSTANT,类的外部可用类名 FQCN::CONSTANT 或类的实例。

PHP 7.1.0 添加类的常量的访问修饰符的支持。

spl_autoload_register 使用它注册一个类的自动加载函数。
类的自动加载发生在,创建对象时,继承类时,实现接口时,它需要查找类在哪里。

类的成员的可见性修饰符: private, protected, public。

类的继承,如果没有使用自动加载,继承的类必须先声明。

类的抽象,关键字 abstract。
继承的方法的重写,可以添加额外的可选参数,必填参数保持一致。

实现接口,使用关键字 implements。

接口也可以继承。

接口可以仍有常量,该常量不可以被实现的类重写。

实现接口要满足李氏替换原则。入参更宽松,返回值更严格。且不修改方法的本意。

PHP 5.4.0 增加了 trait。单继承语言的代码利用机制。

重写方法的重写顺序:当前类方法 > Trait 方法 > 父类方法。

多 trait 同名方法会冲突报错,解决办法使用 insteadof,还可以使用 as 语法起别名,改可见性。

PHP Overloading 方法重载:属性和方法。属性有:__get, __set, __isset, __unset。方法有 __call, __callStatic。

PHP 对象迭代。可以可见的属性进行 foreach 循环迭代。

PHP 迭代接口:Iterator 和 IteratorAggregate。

PHP 魔术方法,双下划线开头的方法,一般为魔术方法,且必须声明为公开可见。

__sleep & __wakeup, 调用时机参见 serialize 和 unserialize。

__toString。此方法内不可抛异常,否则 fatal error。
__toString 在 PHP 5.2.0 之前只有 echo 和 print 才会调用。
在 PHP 5.2.0 之后在任何字符串上下文都会调用。

__invoke 当试图将一个对象以函数的方式调用时调用。

__debugInfo 当调用 var_dump 时会调用它。若未定义,则会打印对象的所有可见度下的属性。

__clone 当使用 clone 克隆一个对象时,会调用它。但不可直接调用 __clone 方法。

final 关键字仅可用于方法和类,不可用于属性和常量。

Late Static Binding 使用 static 关键字,比如:static::method

使用 openssl 创建本地 HTTPS 证书并添加本机受信设置的操作手册

使用 openssl 创建本地证书并添加本机受信设置的操作手册

本地设置 HTTPS 证书的用途?

  • 一方面可以创建本地 https 站点,保持开发环境跟生产环境 https 一致。

  • 另一方面像配置 https 代理,app 应用签名等诸多用途。

使用本手册的前提条件:

  • 拥有一台现代型电脑,并安装有现代型操作系统,如: macOS, Linux, Windows 10 (其他低版本的或许也会工作)
  • 懂得浏览器设置操作,电脑基本操作(包括命令行操作)
  • 本地电脑安装 openssl 工具

检查 openssl 安装是否正常,打开命令行输入指令 openssl version,根据输出自行判断是否正常。

1 创建本地 CA 根证书

CA 全称 Certificate Authority。CA 负责签名下发证书。

浏览器或其他客户端拥有全球所有 CA 根证书信息,或能访问操作系统内所有 CA 根证书信息。

# 第一步生成根证书的私钥,并设置安全密码保护私钥
$ openssl genrsa -des3 -out rootCA.key 2048

# 第二步根据私钥生成证书
$ openssl req -x509 -new -nodes -key rootCA.key -sha256 -days 1825 -out rootCA.pem

2 导入 CA 根证书到操作系统

不同操作系统,会有不同的操作流程。

甚至不同的浏览器添加 CA 根证书操作要求也不同,如: Firefox, Safari.

3 使用 CA 根证书签名下发证书

# 第一步生成私钥
$ openssl genrsa -out test.key 2048

# 第二步根据私钥生成 CSR - Certificate Signing Request
$ openssl req -new -key test.key -out test.csr

# 第三步创建 test.txt 并填充配置,请根据需要修改配置中的 alt_names
$ cat test.txt

authorityKeyIdentifier=keyid,issuer
basicConstraints=CA:FALSE
keyUsage = digitalSignature, nonRepudiation, keyEncipherment, dataEncipherment
subjectAltName = @alt_names

[alt_names]
DNS.1 = example.com
DNS.1 = www.example.com
DNS.1 = a.example.com
DNS.1 = b.example.com

# 第四步使用 CA 签名下发证书
$ openssl x509 -req -in test.csr -CA rootCA.pem -CAkey rootCA.key \
-CAcreateserial -out test.crt -days 825 -sha256 -extfile test.txt

通过以上 4 个指令,我们得到私钥 test.key 和证书 test.crt

至于拿到证书后做什么操作,不在本手册范围内,特此声明。

thanks: https://deliciousbrains.com/ssl-certificate-authority-for-local-https-development/

使用 wkhtmltox 生成 PDF 和图片

第一步, 下载安装二进制工具

地址 https://wkhtmltopdf.org/downloads.html

第二步, 下载php扩展源码进行编译安装

地址 https://github.com/krakjoe/wkhtmltox

$ git clone https://github.com/krakjoe/wkhtmltox

$ cd wkhtmltox

$ phpize

$ which wkhtmltopdf
$ which php-config
# 这里因为每个人安装环境不一样 /path/to/wkhtmltox/installation 请将这个地址替为wkhtmltox真实的安装路径
# PATH 替换为真实的php配置路径
$ ./configure --with-wkhtmltox=/path/to/wkhtmltox/installation --with-php-config=PATH

$ make

$ sudo make install

# 手动启用此php扩展
# extension=wkhtmltox.so

# 重启 php-fpm 服务
$ sudo systemctl restart php-fpm.service

第三步,安装中文字体

一般得,都需要安装字体,才能正常使用此扩展。比如:宋体。

写在最后

检测是否安装成功

$ php --ri wkhtmltox

原文作者:xihanshui
转自链接:https://learnku.com/articles/13472/teach-you-how-to-use-php-to-generate-pdf-and-image-gracefully
版权声明:著作权归作者所有。商业转载请联系作者获得授权,非商业转载请保留以上作者信息和原文链接。

yii2 项目中的前端依赖 bower-asset 改为使用 npm 管理的方法

思路简介:原本由 composer 管理的前端依赖,它会在 composer.json 中定义依赖,并通过 composer 命令从 https://asset-packagist.org 下载;改为由 npm 管理,它将在 package.json 中定义依赖;原本的前端组件依赖通过在 composer.json 定义 replace 项避免 composer 报错。下面将一一道来。

初始化 package.json 并定义依赖

初始化

$ npm init

定义前端依赖

{
  "dependencies": {
    "bootstrap": "^3.4.1",
    "inputmask": "^3.3.11",
    "jquery": "^3.5.1",
    "punycode": "^1.4.1",
    "yii2-pjax": "^2.0.7"
  }
}

Note: 具体依赖的版本号,请根据自身项目实际做出适合修改。

安装前端依赖

$ npm install

修改 composer.json

删除 asset 仓库设置

{
  "repositories": [
    {
      "type": "composer",
      "url": "https://asset-packagist.org"
    }
  ]
}

针对前端组件依赖设置 replace 项

{
  "provide": {
    "bower-asset/jquery": "*",
    "bower-asset/inputmask": "*",
    "bower-asset/punycode": "*",
    "bower-asset/yii2-pjax": "*",
    "bower-asset/bootstrap": "*"
  }
}

更新设置 yii 别名

定义新的别名

# Source common/config/bootstrap.php
Yii::setAlias('@node_modules', dirname(dirname(__DIR__)) . '/node_modules');

更新别名配置

# Source common/config/main.php
    'aliases' => [
        '@bower' => '@node_modules',
        '@npm'   => '@node_modules',
    ],

设置 .gitignore

前端所有依赖均默认下载到 node_modules 目录下,因此可以考虑将其添加至 .gitignore 中。

# Source .gitignore
/node_modules

删除无用的 .bowerrc 配置文件

$ rm .bowerrc

C programmers need to know

C programmers need to know

C 语言值得学习。它值得深入。它值得掌握。

C 之秀

C 语言是众多语言的根本。如:PHP、Java、Lua、V8 等。
C 语言可写系统。如:UNIX、Linux、路由器系统等。
C 语言可写驱动。如:网卡驱动、显卡驱动、USB 驱动等。
C 语言可写服务端软件。如:Nginx、Memcached、Mongodb 等。

C 语言基础

了解数据类型,函数,指针,结构体 struct 及联合 union

掌握编译程序,调试程序的方法。

了解多文件的使用,及 make 工具使用。

Book: The C Programming Language
Compiler: gcc or llvm
Debugger: gdb
Editor: vim or emacs, and many others
C Library: glibc, musl c, and many more

See c-basics

C 语言数据结构

Linux/UNIX 系统中的 C 语言

C 语言进程间通信

C 语言网络编程

C 语言项目研究

既然说 C 语言可以做大到系统,小到驱动。那么长久以来诞生了许多的优秀开源的 C 项目。我们可以由小到大选择一部分来研究。一来是研究软件实现的原理,二来是学习大项目是如何组织代码,三来是内里使用的算法与数据结构,四来还可以参与开源中贡献自己。

Tinyproxy

简单的无缓存的 HTTP 代理软件。

Lua

脚本语言,经常用来写游戏,经常作为 Nginx 的模块使用。

sqlite

轻量级的数据库。

Memcached

仅仅是缓存服务器软件。

Swoole

作为 PHP 的底层扩展,提供协程能力,可进行常驻进程开发。

Redis

Key-Value 型内存数据库,不仅可作为缓存服务器软件,它还支持更多的数据类型。

Nginx

俄国人开发的 Web 服务器软件,Web 市场份额增长强劲,且最近被收购。

NetBSD

BSD 系列系统。

cli clipboard

Mac OS X

$ echo "hello world" | pbcopy

Linux

$ echo "hello world" | xclip -selection clip

JetBrains IDE 常用配置

安装与激活

RMB玩家,请购买正版,登录 jetbrains id 即可。

极客玩家,新安装后开启评估试用,试用1个月到期后,删除试用信息,重新评估试用。

必备插件

  • editorconfig
  • ideavim

常用配置及操作

界面字体设置

设置路径:Appearance & Behavior => Appearance

  • For Linux: Noto Sans 14
  • For macOS: .AppleSystemUIFont 14

编程窗口字体

设置路径:Editor => Font

Font Menlo
Size 14
Line height 1.1

打开 Toolbar 工具栏

设置路径1:View => Toolbar
设置路径2:View => Appearance => Toolbar

双 shift 快捷操作

操作教程:快速敲击键盘 SHIFT 键2次,弹出交互窗口。

可以做什么:搜索 class,执行 jetbrains ide 的命令,比如 Run

ideavim 插件设置

设置所有与系统冲突的快捷键为采用 ide 操作。

我们使用 ideavim 插件的最主要目的是进行跳转。比如:行首,行尾,往前几行,往后几行等等。

macOS 不需要 ideavim,因为 macOS 拥有全系统范围内的 emacs 快捷操作,期待一天 linux 上也能拥有。

jetbrains IDE config

UI

font family: noto sans
font size: 15

editor font

font: Menlo
font size: 14
line spacing: 1.1

PHP

PHP language level: 7.3
CLI Interpreter: php 7.3 (find yours)
Xdebug port: 19001 (default: 9000)
Composer: ~/.bin/composer (find yours)

plugins

  • editorconfig

如何修改鼠标滚轮的方向

Linux 系统

Gnome 3.x

Screenshot from 2019-04-27 16-17-58

在设置中心,找到鼠标设置,勾上 “Natural Scrolling” 即可。

X.org

使用 xinput 命令,查询并设置。

  1. 首先,如果系统没有安装此命令,请安装一下。

  2. 其次,查询一下鼠标设备,获得设备编号。如:

$ xinput list

⎡ Virtual core pointer                          id=2    [master pointer  (3)]
⎜   ↳ Virtual core XTEST pointer                id=4    [slave  pointer  (2)]
⎜   ↳ Logitech G102 Prodigy Gaming Mouse Consumer Control       id=12   [slave  pointer  (2)]
⎜   ↳ Logitech G102 Prodigy Gaming Mouse        id=14   [slave  pointer  (2)]
⎣ Virtual core keyboard                         id=3    [master keyboard (2)]
    ↳ Virtual core XTEST keyboard               id=5    [slave  keyboard (3)]
    ↳ Power Button                              id=6    [slave  keyboard (3)]
    ↳ Video Bus                                 id=7    [slave  keyboard (3)]
    ↳ Power Button                              id=8    [slave  keyboard (3)]
    ↳ Topre Corporation HHKB Professional       id=9    [slave  keyboard (3)]
    ↳ Logitech G102 Prodigy Gaming Mouse System Control id=10   [slave  keyboard (3)]
    ↳ Logitech G102 Prodigy Gaming Mouse Keyboard       id=11   [slave  keyboard (3)]
    ↳ Logitech G102 Prodigy Gaming Mouse Consumer Control       id=13   [slave  keyboard (3)]

我的罗技鼠标编号是 12 和 14。

  1. 再查询一下设置鼠标滚轮的属性,如:
$ xinput list-props 12

Device 'Logitech G102 Prodigy Gaming Mouse Consumer Control':
        Device Enabled (151):   1
        Coordinate Transformation Matrix (153): 1.000000, 0.000000, 0.000000, 0.000000, 1.000000, 0.000000, 0.000000, 0.000000, 1.000000
        libinput Natural Scrolling Enabled (355):       1
        libinput Natural Scrolling Enabled Default (356):       0
        libinput Send Events Modes Available (277):     1, 0
        libinput Send Events Mode Enabled (278):        0, 0
        libinput Send Events Mode Enabled Default (279):        0, 0
        Device Node (280):      "/dev/input/event17"
        Device Product ID (281):        1133, 49284
        libinput Drag Lock Buttons (371):       <no items>
        libinput Horizontal Scroll Enabled (372):       1

找到 libinput Natural Scrolling,我的是 355

  1. 最后,设置滚轮方向为 Natural Scrolling :
$ xinput set-prop 12 355 1

至此完成。此方法只是临时,如果想要永久,则须使用 xorg.conf 配置文件。如下:

$ cat /etc/X11/xorg.conf.d/40-mouse.conf

Section "InputClass"
    Identifier "Logitech G102 Prodigy Gaming Mouse"
    MatchUSBID "046d:c084"
    Driver "libinput"
    Option "NaturalScrolling" "true"
EndSection

USBID 的值,替换成你的鼠标对应的 USBID,可通过以下命令查看:

$ lsusb

Bus 003 Device 002: ID 8087:8000 Intel Corp. 
Bus 003 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub
Bus 001 Device 002: ID 8087:8008 Intel Corp. 
Bus 001 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub
Bus 004 Device 002: ID 0bc2:ab20 Seagate RSS LLC Backup Plus Portable Drive
Bus 004 Device 001: ID 1d6b:0003 Linux Foundation 3.0 root hub
Bus 002 Device 005: ID 0853:0100 Topre Corporation HHKB Professional
Bus 002 Device 003: ID 0409:005a NEC Corp. HighSpeed Hub
Bus 002 Device 006: ID 046d:c084 Logitech, Inc. G203 Gaming Mouse
Bus 002 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.