1. linux bash 顺序执行

1. && 串行执行, 要求前一个成功
2. || 串行执行,要求前一个失败
3. ;  串行执行, 不关心前一个结果
4. &  并行执行

1. "A ; B" Run A and then B, regardless of success of A
2. "A && B" Run B if A succeeded
3. "A || B" Run B if A failed
4. "A &" Run A in background.

2. http 100-continue

http 上传很大的数据body前, 可以先询问server一下能否接受; 如果server因为各种原因不能接收,就不继续上传了,避免浪费网络传输资源。

  1. 客户端策略
    • 如果客户端有 post 数据要上传,可以考虑使用 100-continue 协议。在请求头中加入 {“Expect”:”100-continue”}
    • 如果没有 post 数据,不能使用 100-continue 协议,因为这会让服务端造成误解。
    • 并不是所有的 Server 都会正确实现 100-continue 协议,如果 Client 发送 Expect:100-continue 消息后,在 timeout 时间内无响应,Client 需要立马上传 post 数据。
    • 有些 Server 会错误实现 100-continue 协议,在不需要此协议时返回 100,此时客户端应该忽略。
  2. 服务端策略
    • 正确情况下,收到请求后,返回 100 或错误码。
    • 如果在发送 100-continue 前收到了 post 数据(客户端提前发送 post 数据),则不发送 100 响应码(略去)。

3. 证书验证

证书验证,除了用内置的根证书通过算法验证之外,还可以通过查询CA的吊销证书列表, 或者OCSP实时查询证书的有效性。

  1. 证书吊销列表(Certificate Revocation List,简称:CRL)

  2. 证书状态在线查询协议(OCSP, Online Certificate Status Protocol)

是IETF颁布的用于实时查询数字证书在某一时间是否有效的标准。

一般CA都只是每隔一定时间(几天或几个月)才发布新的吊销列表, 因此CRL是不能及时反映证书的实际状态的。而OCSP就能满足实时在线查询证书状态的要求。 它为电子商务网站提供了一种实时检验数字证书有效性的途径, 比下载和处理CRL的传统方式更快、更方便和更具独立性。 请求者发送查询请求,OCSP服务器会放回证书可能的三个状态:正常、吊销和未知。

4. windows x64 and x86 的系统dll目录

windows系统目录重定向

// 64-bit dll重定向 system32 vs sysWOW64

c:\\program files       // 64-bit app
c:\\program files(x86)  // 32-bit app
c:\\windows\system32    // 64-bit dll
c:\\windows\sysWOW64    // 32-bit dll

5. windbg 入门

  1. !t // thread
  2. !address -summary //内存使用统计
  3. !dh // display header
  4. lm // list loaded modules

  5. 基本命令, 40个, ? //列出所有
  6. 元命令, 100, .help //列出所有
  7. 扩展命令。.chain //列出扩展的dll文件, !模块名.help //列出模块内的扩展命令

所谓扩展命令,顾名思义是可以“扩展”的。扩展命令从动态连接库中暴露出来,一般以DLL文件名来代表一类扩展命令集。

User-mode options:
~ - list threads status
~#s - set default thread
| - list processes status
|#s - set default process


.time - displays session time information
.timezone - display timezone information
.ttime - displays thread time information
.tlist - list running processes

6. 十分钟python

  1. list aa = [1,2,3]
  2. tuple aa = (1,2,3) //基本等价于不可修改的list
  3. dict aa = {1:11, 2:22} // 只有number,string,tuple 可以为key
  4. set aa = {1,2,3} //不可重复

十分钟python


class Human:
    
    def __init__(self, name):
        self._age = 0

    # property 有点类似 getter
    # 它把方法 age() 转换为同名并且只读的属性
    # 通常情况下,可以不需要编写复杂的 getter 和 setter。
    @property
    def age(self):
        return self._age

    # 允许属性被修改
    @age.setter
    def age(self, age):
        self._age = age

    # 允许属性被删除
    @age.deleter
    def age(self):
        del self._age

7. mysql 字段设置非null

  1. = or != 失效, 必须 is null or is not null
  2. 聚合函数失效, count(name) 不准
  3. concat(name, ‘hello’) 为 null, 函数失效
  4. null 会导致优化器做索引选择时更加复杂,不好判定是否一定能走索引

8. c# method to deleage short way

delegate是通用的方法引用,action是给方法加上了签名限制。通过new action 或 强制转换的方式都行。

X(new Action<int>(Y)); // new action
X((Action<int>)Y); // action 强制转换

9. java blockingQueue 继承 AQS 实现

  1. 默认是非公平锁
  2. 通过不同构造函数可以支持公平锁

10. git

  1. 公共分支上用 git merge,保留完整历史。
  2. 私有分支上用 git rebase,commit是线性的,看起来更清晰。

11. 最简单的git server

https://www.ruanyifeng.com/blog/2022/10/git-server.html

server> git init --bare aaa.git

client> git remote add myServer sh:aaa.git, sh is .ssh/config key, sh => user@192.168.1.1

client> git push myServer master

git数据目录本质就是个普通的目录, 直接复制就可以, scp -r example/.git git@192.168.1.25:/home/git/example.git

12. linux execute permission

execve(path, argv,env) 系统调用会识别文件的第一行#!interpreter, 然后调用相应的解释器,执行脚本。

所以执行 aa.sh 有两种方式。

  1. ./aa.sh aa.sh 必须要有执行权限
  2. bash aa.sh aa.sh 不必有执行权限, 因为bash已经有执行权限

https://man7.org/linux/man-pages/man2/execve.2.html

13. java.net.SocketException: Socket closed

https://www.jianshu.com/p/716fcabd79d5

简单直白的意思就是, 在socket 已经调用了 close()方法, 但是又重新调用这个socket发送数据包。

比如 common-pools 包,当borrow出去的对象, 长时间未return回去。

比如配置的借出去最长60s,60s没有还回去, common-pools包会执行清理逻辑, 比如关闭 socket

当这种情况下, 读写这个socket就会抛异常, socket closed.

GenericObjectPool(factory, config, AbandonedConfig)
AbandonedConfig ac = this.abandonedConfig;
if (ac != null && ac.getRemoveAbandonedOnMaintenance()) {
    removeAbandoned(ac);
}

GenericObjectPool 是 Apache Commons Pool 提供的对象池,使用的时候需要调用 borrowObject 获取一个对象,使用完以后需要调用 returnObject 归还对象,或者调用 invalidateObject 将这个对象标记为不可再用

实际应用中由于程序实现的问题,可能造成在一些极端的情况下出现 reutrnObject/invalidateObject 没有被调用导致的泄漏问题。

对象泄漏会导致对象池中的对象数量一直上升,达到设置的上限以后再调用 borrowObject 就会永远等待或者抛出java.util.NoSuchElementException: Timeout waiting for idle object 异常

对于这种问题,一方面是从应用实现上进行排查,另一方面可以通过 GenericObjectPool 自带的机制进行清理。

AbandonedConfig 就是用来配置清理泄露对象的。

14. java getField vs getDeclaredField

getField 获取一个类的 public成员变量,包括基类。

getDeclaredField 获取一个类的 所有成员变量(包括private),不包括基类。

Field.setAccessible 成员变量为private,必须进行此操作。

15. mysql index_merge

前提, 必须多个查询条件都命中索引。 有一个查询条件未命中,则可能全表扫描。

mysql explain doc mysql explain #index_merge

```sql explain select * from tbl_order where order_number = 100 or id = 100; // type -> index_merge // extra -> Using union(idx_order_id,PRIMARY); Using where