0%

1. os.getcwd()

os.getcwd()返回工作目录,工作目录(Working Directory)是指当前用户或程序正在其中执行命令或访问文件的目录。在操作系统中,当你打开一个命令行界面(如终端、命令提示符)或运行一个程序时,都有一个与之关联的工作目录。这个目录是相对于该环境而言的当前位置,用于解析相对路径。
os.getcwd() 函数是 Python 标准库 os 模块中的一个函数,用于获取当前工作目录的绝对路径。这个函数通过查询操作系统来确定当前进程的工作目录,并将其作为一个字符串返回。
具体来说,os.getcwd() 如何确定工作目录,取决于操作系统提供的机制。在 Unix-like 系统(如 Linux 和 macOS)中,这通常涉及到查询当前进程的环境信息,该信息中包含了工作目录的路径。在 Windows 系统中,机制可能有所不同,但同样依赖于操作系统提供的API来查询当前进程的工作目录。

当 Python 程序(或 Python 交互式解释器)启动时,它的工作目录通常是启动该程序或解释器的那个目录。但是,在程序执行过程中,可以使用 os.chdir(path) 函数来改变工作目录,这时 os.getcwd() 返回的将是新的工作目录路径。
需要注意的是,os.getcwd() 返回的是绝对路径,这意味着它是一个从根目录开始的完整路径,不受当前工作目录的相对位置影响。这对于需要精确处理文件路径的程序来说是非常有用的。

所以python返回的工作目录是执行python命令的那个目录,所以这个目录很重要,不能随便用来删除目录,我不小心就把自己的源码目录给删除了,还好有GitHub。

2. timezone

python有第三方库pytz,python 3.9版本以上有一个自带的库zoneinfo。我必须吐槽一下,这个timezone库就这么不重视吗,这么晚才有。

2.1 不带timezone的创建方法

1
2
3
date1= datetime.now()
date2 = datetime.strptime(str, '%Y-%m-%d')
date3 = datetime(2023, 4, 1, 10, 0, 0)

这3种都是不带timezone,但是有个地方要注意,date1虽然没带,但是如果打印它,是当前的系统timezone下的时间,而非UTC时间,所以就是它没有这个tzinfo的属性,但是就是用了。

2.2 带有timezone的创建方法

1
2
3
4
5
6
tz = pytz.timezone('Asia/Shanghai')
date1= datetime.now(pytz.utc) # 或者 datetime.now(tz)

date2 = datetime.strptime(str, '%Y-%m-%d')
local_date = tz.localize(date2)
utc_date = pytz.utc.localize(date2)

这里就是给datetime.now一个tzinfo,无论给它什么样的tzinfo,最近它们的本质还是一样的,都是同一个时间,不同点只是tzinfo不同。注意localize只能对没有tzinfo的值设置,而replace没有这个限制。
尽管实参一样,但是local_date和utc_date的表示时间却是不一样的,因为date2原来没有tzinfo,调用了不同的tzinfo.localize方法后,产生的时间就是不一样的,所以这需要知道你的实参的timezone是什么,才能正确的给它设置timezone。

2.3 timezone转换

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
# 将UTC时间转换为上海时间
# 第一种方法
local_date = utc_date.astimezone(tz) # 结果正确

# 第二种方法
from zoneinfo import ZoneInfo
zone_info = ZoneInfo('Asia/Shanghai')
local_date2 = utc_date.astimezone(zone_info) # 结果正确

# 第三种方法
local_date3 = datetime.now(tz=pytz.utc).replace(tzinfo=zone_info).astimezone(shanghai_tz) #结果正确
local_date4 = datetime.now(tz=pytz.utc).replace(tzinfo=pytz.utc).astimezone(shanghai_tz) #结果正确
local_date5 = datetime.now().replace(tz=shanghai_tz) #结果错误,虽然按照2.1的创建方法date.now其实使用了tzinfo的信息,但是结果是不对。
local_date6 = datetime.now(tz=shanghai_tz).replace(tzinfo=shanghai_tz).astimezone(shanghai_tz) #结果错误
print(local_date5) # local_date4 2024-09-04 19:02:43.948018+08:06 这个后面带有06分钟,是个什么意思?

当我们有一个带有timezone的时间,想转为另一个timezone的时间,从时间本身来讲,它们是一样的,只不过是影响了表现形式。这里的作用就是给用户看的时候,他能理解这个是他的时区的时间,所以这种转换就是为了输出可视化字符串。
由于replace过于粗暴,所以还是最好别用了, replace中传入pytz.tzinfo就有bug。实在要用就用zoneinfo,不要用pytz。

2.4 时间比较

时间比较需要注意的是,要么两个时间都不带timezone,要么都带,不能一个带一个不带。所以推荐都带,两个时间相减时,得到timedelta。因为有些服务的API返回的date是带有timezone的,所以最好我们自己的时间也带上。

判断字符串相等

需要考虑到空值的情况

1
2
3
4
5
6
7
8
# 当$a是空值的时候,会有问题,因为这个语句变为了 if [ == "abc" ]; then
if [ $a == "abc" ]; then
echo $a
fi
# 解决方法是加上另外一个大括号
if [[ $a == "abc" ]]; then
echo $a
fi

字符串要双引号

1
2
3
4
5
A="abc"
B="$A 123"
C=$A + "123" # 错误,结果是:abc+123
D='${A}123' # 错误,单引号不能引用变量,结果:${A}123
E="${A}123" # 结果:abc123
Read more »

由于Mac的磁盘空间不足,需要时常清理一下。

1. XCode

Derived Data是一个文件夹,它默认情况下位于:~/Library/Developer/Xcode/DerivedData。它是Xcode存储各种中间构建结果、生成索引等的位置,这个文件夹通常会很大,清理后会回收不少空间。你可以在Xcode的preferences中设置Derived Data的位置。清理之后构建首次构建项目的时候可能会增加构建时间。但是这不影响正常使用。而且还可以回收更多自由的空间内存。

1
2
3
rm -rf ~/Library/Developer/Xcode/DerivedData/*
# 可以定期执行清楚缓存
alias xcode-clean-derived="rm -rf ~/Library/Developer/Xcode/DerivedData/*"
Read more »

1. 概述

Jaeger有几个组件:

  • Jaeger-agent:一个无状态的进程,负责接收并转发数据到Jaeger-collector。
  • Jaeger-collector:一个有状态的进程,负责接收并聚合数据,以及提供查询服务。
  • Jaeger-query:一个有状态的进程,负责接收查询请求,并返回结果。
Read more »

Jenkins 安装

官方说 java -jar jenkins.war是推荐的方式,意外的是tomcat不推荐。原因是jenkins内置了web服务器Jetty, 而Jetty使用了Servlet, 所以高版本的tomcata不兼容,会报一个诡异的错误: “The requested resource [/jenkins] is not available”。

排查原因:

  • 缺少$JRE_HOME,最后发现不是这个原因。Tomcat只需要设置$JAVA_HOME
  • 修改JVM版本,在bin/catalina.sh中, export $JAVA_HOME和$JRE_HOME, 最后发现不是这个问题,JDK11,17都可以
  • 修改Tomcat版本,把Tomcat从10降级到9版本就可以了。
    最后兼容的tomcat是tomcat9.

Tomcat修改账号,conf/tomcat-users.xml, 增加一个用户名和密码,并且赋权限manager-ui。是的,这个tomcata的管理权限还是不要在pro环境开,不然有风险。

把下载后的jenkins.war放到tomcata的安装目录下的webapp目录下面,不需要解压,tomcat会自己解压。

启动Tomcat: catalina.sh start,这个是后台运行,关闭shell/session也不印象Tomcata运行。
关闭Tomcat: catalina.sh stop,每次修改配置文件后,都需要重启。

1. iOS结构

iOS

iOS操作系统从上到下依次是:

交互层 Cocoa Touch
媒体层 Media
核心服务层 Core Services
操作系统层 Core OS
内核和设备服务层 Kernel

Read more »

1. macOS结构

macOS

Mac OS X 包含两个主要部分:以 FreeBSD 源代码 和 Mach 微核心为基础的 XUN 混合内核,并在 XNU 上构建的 Darwin 核心系统;及一个由苹果开发,称为 Aqua 的闭源、独占版权的图形用户界面。细分的看,Mac OS X 系统可以分成五层结构,每一层有其代表性技术。

Read more »

1. 大纲

1.1 线程优化

JS是单线程,不能block它,也不适合做CPU密集型工作。如果有可能尽量使用native模块或多线程技术负担JS线程工作。

1.2 渲染优化

1.2.1 React渲染
  • 减少渲染次数, 比如shoudComponentUpdate, PureComponent
  • 避免不可见内容的渲染,比如控制render的返回内容
  • 长列表的优化
1.2.2 Native渲染
  • Android上RecycleView2的使用

1.3 框架优化

1.3.1 通讯方法

  • JS Bridge的通讯的payload是JSON字符串,而且所有通讯都是占用JS Bridge,所以一方面会出现阻塞,比如滑动事件,另一方面JSON字符串的解析也会消耗计算。所以尽量不要在JS Bridge上发太多消息。随着JSI的发布,可以使用JSI代替JS Bridge, 它不需要再通过JSON字符串通讯,而是使用了共享内存通讯,而且是同步方式,效率更高。跟之前相比,需要写C++代码,但是有自动化工具可以帮助完成,比如CodeGen。
  • Bundel拆包,按需加载,和提前加载,提升页面首次渲染的性能。
  • 体积优化,使用混淆工具减少包体积。

1. Limits

资源限制内部机制使用的是cgroup类型
目录: /sys/fs/cgroup/systemd

k8s采用request和limit两种限制类型来对资源进行分配

request(资源需求):即运行pod的节点必须满足运行pod的最基本需求才能运行pod。
limit(资源限制):即运行pod期间,可能内存使用量会增加,那最多能使用多少内存,这就是资源限额。
资源类型:

CPU的单位是核心数,内存的单位是字节。
一个容器申请0.5各CPU,就相当于申请1个CPU的一半,可以加个后缀m表示千分之一的概念。比如说100m的CPU,100豪的CPU和0.1个CPU都是一样的。
内存单位:

K,M,G,T,P,E #通常是以1000为换算标准的。
Ki,Mi,Gi,Ti,Pi,Ei #通常是以1024为换算标准的。

Read more »

1. TLS

TLS现在的版本是1.2,下一个版本1.3也快普及。
Android开始支持TLS v1.2从Android 4.1开始
iOS开始支持TLS v1.2从iOS 5开始
Browser开始支持TLS v1.2: Chrome version 29(2013), Safari version 7(2013)

通常TLS是应用协议,HTTP on SSL,所以一般情况下不需要应用程序去指定TLS版本,交给系统或浏览器就行。

ref:
Android
iOS
Browser

Read more »