Week46
- 1. linux bash 顺序执行
- 2. http 100-continue
- 3. 证书验证
- 4. windows x64 and x86 的系统dll目录
- 5. windbg 入门
- 6. 十分钟python
- 7. mysql 字段设置非null
- 8. c# method to deleage short way
- 9. java blockingQueue 继承 AQS 实现
- 10. git
- 11. 最简单的git server
- 12. linux execute permission
- 13. java.net.SocketException: Socket closed
- 14. java getField vs getDeclaredField
- 15. mysql index_merge
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因为各种原因不能接收,就不继续上传了,避免浪费网络传输资源。
- 客户端策略
- 如果客户端有 post 数据要上传,可以考虑使用 100-continue 协议。在请求头中加入 {“Expect”:”100-continue”}
- 如果没有 post 数据,不能使用 100-continue 协议,因为这会让服务端造成误解。
- 并不是所有的 Server 都会正确实现 100-continue 协议,如果 Client 发送 Expect:100-continue 消息后,在 timeout 时间内无响应,Client 需要立马上传 post 数据。
- 有些 Server 会错误实现 100-continue 协议,在不需要此协议时返回 100,此时客户端应该忽略。
- 服务端策略
- 正确情况下,收到请求后,返回 100 或错误码。
- 如果在发送 100-continue 前收到了 post 数据(客户端提前发送 post 数据),则不发送 100 响应码(略去)。
3. 证书验证
证书验证,除了用内置的根证书通过算法验证之外,还可以通过查询CA的吊销证书列表, 或者OCSP实时查询证书的有效性。
-
证书吊销列表(Certificate Revocation List,简称:CRL)
-
证书状态在线查询协议(OCSP, Online Certificate Status Protocol)
是IETF颁布的用于实时查询数字证书在某一时间是否有效的标准。
一般CA都只是每隔一定时间(几天或几个月)才发布新的吊销列表, 因此CRL是不能及时反映证书的实际状态的。而OCSP就能满足实时在线查询证书状态的要求。 它为电子商务网站提供了一种实时检验数字证书有效性的途径, 比下载和处理CRL的传统方式更快、更方便和更具独立性。 请求者发送查询请求,OCSP服务器会放回证书可能的三个状态:正常、吊销和未知。
4. windows x64 and x86 的系统dll目录
// 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 入门
- !t // thread
- !address -summary //内存使用统计
- !dh // display header
-
lm // list loaded modules
- 基本命令, 40个,
? //列出所有
- 元命令, 100,
.help //列出所有
- 扩展命令。
.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
- list aa = [1,2,3]
- tuple aa = (1,2,3) //基本等价于不可修改的list
- dict aa = {1:11, 2:22} // 只有number,string,tuple 可以为key
- set aa = {1,2,3} //不可重复
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
- = or != 失效, 必须 is null or is not null
- 聚合函数失效, count(name) 不准
- concat(name, ‘hello’) 为 null, 函数失效
- 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 实现
- 默认是非公平锁
- 通过不同构造函数可以支持公平锁
10. git
- 公共分支上用 git merge,保留完整历史。
- 私有分支上用 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 有两种方式。
./aa.sh
aa.sh 必须要有执行权限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