查看gcc版本
1 | gcc -v |
查看glibc版本
1 | ldd --version |
1 | gcc -v |
前提:
配置以下两台服务器互为主从。
配置:vim /usr/local/mysql/my.cnf
主1服务器配置:
1 | auto_increment_increment=2 #步进值 auto_imcrement。一般有n台主MySQL就填n |
主2服务器配置:
1 | auto_increment_increment=2 #步进值auto_imcrement。一般有n台主MySQL就填n |
主1完整配置:
1 | [mysql] |
互相配置主从服务器。
主1服务器:192.123.75.68;
主2服务器:192.123.3.87;
登陆到主1服务器,执行一下命令:
1 | # 查看 主 复制状态 |
登陆到主2服务器,执行一下命令:
1 | # 查看 主 复制状态 |
Appium 是一个开源的自动化测试工具,支持 Android、iOS 平台上的原生应用,支持 Java、Python、PHP 等多种语言。
Appium 封装了 Selenium,能够为用户提供所有常见的 JSON 格式的 Selenium 命令以及额外的移动设备相关的控制命令,比如:多点触控手势、屏幕朝向等。
右键 This PC(此电脑) -> Properties(属性) -> Advanced system settings(高级系统设置) -> Environment Variables(环境变量)
新建/修改 CLASSPATH 变量
Path 变量末尾添加 ;%JAVA_HOME%\bin;%JAVA_HOME%\jre\bin;
新建环境变量 ANDROID_HOME
,变量值为 android-sdk
位置,
如:E:\BaiduNetdiskDownload\appium\android-sdk\android-sdk-windows
在 Path 变量值的末尾添加:;%ANDROID_HOME%\tools;%ANDROID_HOME%\build-tools\30.0.0-preview;%ANDROID_HOME%\platform-tools
通过安卓的 adb 连接虚拟机,需要在控制台执行 adb connect 127.0.0.1:7555 命令,让 adb 连接上虚拟机,在 cmd 控制台输入 adb devices 查看当前连接的虚拟机。
开启开发者模式
荣耀V9手机,荣耀V10、荣耀V20、华为P20、华为P30等型号:
1,进入手机的设置项 设置 - 关于手机
。
2,点击 版本号
7次进入开发者模式的,选择 返回
就可以看到 开发者选项
的菜单。
进入开发者选项 -> 开启开发者选项,并分别开启:USB调试、USB安装、USB调试(安全设置)选项,USB连接时,选择 文件传输
。
如果手机是第一次链接电脑可能还需要安装一下驱动: Android手机驱动。
1,启动 Appium 和 mumu(如果使用Android真机,可以忽略开启mumu)
2,
参考:
Readlink 是 Linux 系统中一个常用工具,主要用来找出符号链接所指向的位置。
语法格式:Readlink [参数] [文件]
常用参数:
-f 递归跟随给出文件名的所有符号链接以标准化,除最后一个外所有组件必须存在
-e 递归跟随给出文件名的所有符号链接以标准化,所有组件都必须存在
-n 不输出尾随的新行
-s 缩减大多数的错误消息
-v 报告所有错误消息
参考实例
查看软链文件真实文件:
1 | [root@sj0002 local]# readlink mysql |
参考:
1 | dotnet tool install --global dotnet-svcutil |
1 | dotnet-svcutil --outputFile Test1Information.cs -n "http://tempuri.org/,API.ServiceReference.Services1" --outputDir Services1 http://172.2.22.12/FRXXServices/Services1.asmx |
参考:
注:tomcat 8不生效
vim /usr/local/apache-tomcat-8.5.40/conf/context.xml
1 | <Context caseSensitive="false"> |
1 | systemctl status tomcat8 |
1 | # 查看监听的端口 |
先看一个 proto3 的查找请求参数的消息格式的例子,这个请求参数例子模仿分页查找请求,他有一个请求参数字符串,有一个当前页的参数还有一个每页返回数据大小的参数,proto 文件内容如下:
1 | syntax = "proto3"; |
在上面的例子中,所有的属性都是标量,两个整型 ( page_number 、 result_per_page )和一个字符串( query ),你还可以在指定复合类型,包括 枚举类型 或者 其他的消息类型。
每一个被定义在消息中的字段都会被分配给一个唯一的标量,这些标量用于标识你定义在二进制消息格式中的属性,标量一旦被定义就不允许在使用过程中再次被改变。标量的值在1~15的这个范围里占一个字节编码
消息属性规则如下:
在 proto3 中,标量数字类型的重复字段默认使用压缩编码。
在一个 proto 文件中可以定义多个消息类型,你可以在一个文件中定义一些相关的消息类型,上面的例子 proto 文件中只有一个请求查找的消息类型,现在可以为他多添加一个响应的消息类型,具体如下:
1 | syntax = "proto3"; |
proto 文件中的注释使用的是 /c++ 中的单行注释 // 语法风格。
如下:
1 | message SearchRequest { |
为了避免在加载相同的 .proto 的旧版本,包括数据损坏,隐含的错误等,这可能会导致严重的问题的方法是指定删除的字段的字段标签(和/或名称,也可能导致 JSON 序列化的问题)被保留。 如果将来的用户尝试使用这些字段标识符,协议缓冲区编译器将会报错。
保留字段的使用例子:
1 | message Foo { |
上述例子定义保留属性为 “foo”, “bar” ,定义保留属性位置为2,即在2这个位置上不可以定义属性,如: string name=2; 是不允许的,编译器在编译 proto 文件的时候如果发现,2这个位置上有属性被定义则会报错。
.proto文件的值类型和 java 的值类型的对照表:
1 | .proto Type Java Type |
当 proto 消息被解析成具体的语言的时候,如果消息编码没包含特定的元素,则消息对象中的属性会被设置默认值,这些默认值具体如下:
proto 允许你在定义的消息类型的时候定义枚举类型,如下例,在消息类型中定义并使用枚举类型:
1 | message SearchRequest { |
如上例中所示, Corpus 枚举类型的第一个枚举值是0,每一个枚举值定义都会与一个常量映射,而这些常量的第一个常量值必须为0,原因如下:
必须有一个0作为值,以至于我们可是使用0作为默认值
第一个元素的值取0,用于与第一个元素枚举值作为默认值的proto2语义兼容
枚举类型允许你定义别名,别名的作用是分配不中的标量,使用相同的常量值,使用别名只需要在定义枚举类型的第一行中添加 allow_alias 选项,并将值设置为 true 即可,如果没有设置该值就是用别名,在编译的时候会报错。
官网例子如下:
1 | enum EnumAllowingAlias { |
proto 支持的枚举值的范围是 32 位的整形,即 Java 中的 int 类型,其他请参看官网。
你可以在定义消息类型的时候饮用其他已经定义好的消息类型作为新消息类型的属性,官网例子如下:
1 | message SearchResponse { |
在上面的消息例子中,SearchResponse 这个响应消息类型的属性 results,返回的是一个 Result 类型的消息列表。
在上面的例子中,Result 和 SearchResponse 消息类型被定义在同一个 .proto 文件中,如果把他们分成两个文件定义,应该如何引用呢?
proto 中为我们提供了 import 关键字用于引入不同 .proto 文件中的消息类型,你可以在你的 .proto 文件的顶部加入如下语句因为其他 .proto 文件的消息类型:import "myproject/other_protos.proto"
;
例子:
1 | syntax = "proto3"; |
1 | syntax = "proto3"; |
如果两个 .proto 文件在同一个目录下直接这样 import “result.proto”; 倒入即可。
我们还可以在消息类型中定义消息,例子如下:
1 | message SearchResponse { |
在上面的例子中在 SearchResponse 消息体中定义了一个 Result 消息并使用。
如果想在其他的消息体引用 Result 这个消息,可以 Parent.Type 这样引用,例子:
1 | message SomeOtherMessage { |
消息还可以深层的嵌套定义,如下例子:
1 | message Outer { // Level 0 |
proto 支持 map 属性类型的定义,语法如下:
1 | map<key_type,value_type> map_field = N; |
key_type 可以是任何整数或字符串类型(除浮点类型和字节之外的任何标量类型,枚举类型也是不合法的key类型),value_type可以是任何类型的数据。
可以为 proto 文件指定包名,防止消息命名冲突。
例子如下:
1 | package foo.bar; |
当你在为消息类型定义属性的时候,你可以通过 命名.类型 的形式来使用已经定义好的消息类型,如下:
1 | Message Foo { |
如果你想在 RPC 中使用已经定义好的消息类型,你可以在 .proto 文件中定一个消息服务接口, protocol buffer 编译器会生成对应语言的接口代码。
接口定义例子:
1 | service SearchService { |
参考:
https://developers.google.com/protocol-buffers/docs/reference/csharp-generated#compiler_options
由于在 openssl1.1.0 版本中,废弃了 EVP_CIPHER_CTX_cleanup 函数,要用这个函数 EVP_CIPHER_CTX_reset() 代替。
使用 vim 编辑 /usr/local/lib/python2.7/dist-packages/shadowsocks/crypto/openssl.py
1 | vim /usr/local/lib/python2.7/dist-packages/shadowsocks/crypto/openssl.py |
搜索 EVP_CIPHER_CTX_cleanup ,总共两处:52行,111行,将 cleanup 改为 reset 。
1 | libcrypto.EVP_CIPHER_CTX_cleanup |
参考:
AWS-AttributeError: /usr/lib/x86_64-linux-gnu/libcrypto.so.1.1: undefined symbol: EVP_CIPHER_CTX_
lsof 命令用于查看你进程开打的文件,打开文件的进程,进程打开的端口(TCP、UDP)。找回/恢复删除的文件。是十分方便的系统监视工具,因为lsof命令需要访问核心内存和各种文件,所以需要 root 用户执行。
在 linux 环境下,任何事物都以文件的形式存在,通过文件不仅仅可以访问常规数据,还可以访问网络连接和硬件。所以如传输控制协议 (TCP) 和用户数据报协议 (UDP) 套接字等,系统在后台都为该应用程序分配了一个文件描述符,无论这个文件的本质如何,该文件描述符为应用程序与基础操作系统之间的交互提供了通用接口。因为应用程序打开文件的描述符列表提供了大量关于这个应用程序本身的信息,因此通过lsof工具能够查看这个列表对系统监测以及排错将是很有帮助的。
1 | # 安装 |
参考:
如果虚机没有联网,需要挂载系统镜像安装。
1 | yum install gcc kernel-devel kernel-headers dkms make bzip2 |
在安装目录下:C:\Program Files\Oracle\VirtualBox,找到 VBoxGuestAdditons.iso 镜像,并挂载。
启动虚机,执行 lsscsi 查看 IDE , /dev/sr0 就是 VBoxGuestAdditons 镜像挂载之后的路径。
1 | # 创建文件夹 |
进入 /media 目录出现 sf_share,前面出现的 sf 代表成功。
还可以通过 mount 命令把 Centos7 的目录下文件夹变成共享文件夹。
1 | mount -t vboxsf share /home/share |
参考: