记录一些 Java 反射基础知识
准备测试 Bean
1 | package reflectiontest.bean; |
getFields VS getDeclaredFields
getFields 只会返回 public 类型的 fields, getDeclaredFields 会返回所有类型的 fieds
1 |
|
记录一些 Java 反射基础知识
1 | package reflectiontest.bean; |
getFields 只会返回 public 类型的 fields, getDeclaredFields 会返回所有类型的 fieds
1 | @Test |
poetry 推荐使用 pyenv 进行本地 python 的多版本管理,以前用过,但是也没什么特别的印象了,特此记录一下使用情况
Win 平台不支持这个工具,残念。。。
通过 brew 安装, brew 加速的教程在另一篇教程里有提到
1 | brew update |
在 profile 中添加配置使能,我本地用的 zsh, 各版本的 shell 稍有区别,指定的文件不一样
1 | echo -e 'if command -v pyenv 1>/dev/null 2>&1; then\n eval "$(pyenv init -)"\nfi' >> ~/.zshrc |
安装推荐的工具机,各种系统不一样
For MacOS, install Xcode Command Line Tools (xcode-select –install) and HomeBrew, then optional but best install
1 | brew install openssl readline sqlite3 xz zlib |
在系统中可以通过输入 echo $(pyenv root)
拿到目录地址
直接输入 pyenv
查看所有的 cmd 信息
1 | pyenv install 3.7.8 |
如果没打全,他会给提示可用的版本,很人性化。安装的 python 版本会被放到 ~/.pyenv/versions/
管理
pyenv uninstall 3.7.8
或直接去 versions 文件夹下删除
pyenv versions
1 | pyenv versions |
多用 pyenv version
查看当前的环境版本信息
使用前的情况:系统自带 python 版本 2.7.16, pyenv 可用版本 3.6.5 和 3.7.8。此时 cmd 输入 python -V
给出版本 2.7.16
全局切换版本 pyenv gloabl 3.7.8
,他会将这个版本存放到 .pyenv/version
文件中,再打开终端查看版本,变为 3.7.8
。
pyenv local 3.6.5
可以指定 folder 下的 python 版本,他会将版本信息写入当前目录下的 .python-version
文件中
如果想要指定终端的 python 版本,可以用 pyenv shell xxx
, 这个我没有需求,未亲测
作用范围和其编程语言一样,范围最精确的那个生效 shell > local > gloabl
pyenv which python
每次新安装版本,记得跑一下 pyenv rehash
更新信息
pyenv install 下载失败, 报错
1 | Jack > ~ > pyenv install 3.7.3 |
可以自行下载对应的 tar.xz 文件然后放到 pyenv 的 cache 文件夹下,pyenv install 的时候会取对应的安装包进行安装
1 | wget -P $(pyenv root)/cache https://www.python.org/ftp/python/3.7.3/Python-3.7.3.tar.xz |
公司日常维护过程中,同事自己写的一个 Chrome 小插件很精巧,符合我小而美的审美,很适合处理某些需求,特此记录一下 Chrome 插件的小知识和一个阅读源码的收获
1 | Root |
1 | <!-- click 中设置 confirm 内容 --> |
1 | $.ajax({ |
由于这次只是查看代码,而且验证一些函数的功能,调试还是挺顺利的,直接通过 Chrome console 就完成了,各种变量自动装载完成,美滋滋儿。
Poetry 类 pipenv 工具,据说 lock 什么的速度更快,而且有集成发布功能,刚好 rich 这个项目有用这个,刚好在看源码的时候体验一把
1 | # powershell 输入 |
PS: 国内安装各种软件有助于增长火气!!!
初始化项目, 创建必要文件。你可以在 git 上先建一个空的仓库然后,本地做完 poetry init 和 git init 之后 match 一下
初始化后目录为
1 | job-spider |
通过配置 toml 文件指定国内源加速
1 | [[tool.poetry.source]] |
查看配置,比如 virtualenv 会创建在哪里之类的。这个 cmd 还是很有帮助的,可以通过它知道你的虚拟环境创建在哪里,是不是要在 project 创建 venv 等
1 | $ poetry config --list |
通过指定 poetry config virtualenvs.in-project true
可以指定将虚拟环境创建到 project 目录下面,方便管理
激活环境, 如果还没有创建过虚拟环境,他还会根据 toml 文件新建一个
并不是安装依赖,而是根据 toml 文件安装项目依赖,对标 pipenv sync
对标 pipenv 中的 pipenv install
, 使用 add --dev/-D flask
安装 dev 相关的包
poetry env info
: 显示运行环境信息,包括本地 OS 和虚拟环境
1 | Virtualenv |
poetry env list
: 显示可用的 env 列表
官方推荐 poetry 结合 pyenv 管理各种版本的虚拟环境
显示已安装的依赖
1 | poetry show |
在安装更新的时候 resolving dependency 挺慢的,等了好一会儿,一度认为进程死了。但是第二次就快多了,可能是有 cache
1 | C:\Users\jack\gitStore\job-spider\job_spider>poetry install --verbose |
观察 VSCode 的左下角,python 编译器经常选择有问题,会找不到自己创建的虚拟环境路径。可以点击它,然后根据 poetry shell 的提示手动设置,路径如 C:\Users\jack\AppData\Local\pypoetry\Cache\virtualenvs\job-spider-UlnXzhyt-py3.7
做完后他会自动保存到 .vscode
的工程文件夹下。但是我默认这个文件是不 check in 的,所以然并卵 ┑( ̄Д  ̄)┍
新建了一个 flask demo,启动的时候报错
1 | PS C:\Users\jack\gitStore\job-spider> poetry run .\job_spider\main.py |
据说是 windows 上安装了 64 位的 python, 调用了 32 位的 dll 会报这个错,换个 32 位的 python 就能解决。将原有的 64 位卸载,删除各种环境变量,重新安装 32 位 python,然并卵,要自闭了 ( ̄ε(# ̄)
暂时没有什么其他更好的解决方案,打算用虚拟机或者在 MacOS 上完成开发以节省时间
今天在 Mac 上用 3.7.8 的版本也会抛同样的错误!!!难道是版本有问题?果断用 3.6.6
, 3.7.3
试试,可行。。。。回去再到 Windows 的机子上试试这个版本。
在 Win 上换 3.7.3 之后一切正常 ╰(艹皿艹 )
切换到 3.6.5 之后 poetry install 报错
1 | [EnvCommandError] |
是 OpenSSL 包缺失导致的
1 | # 修复,第一行可以不运行,下载包经常卡住 |
这之后还重新将 pyenv 管理的 python 重新卸载安装了一下,问题解决
1 | poetry run splunk_collector/main.py |
运行 flask demo, permission 报错。完全搞错了。。。。flask 并不是那样运行的。保存完文件之后, 通过如下方式运行,而不是直接用 poetry 或者 python 运行,我 凸^-^凸
1 | $ export FLASK_APP=hello.py |
常用 Linux command 备忘录
sh
是一种协议 shell command language. 而 /bin/sh
和 /bin/bash
是对他的两种不同的实现, 早起他们基本是一致的,但是随着 bash 的发展,他们变得不兼容起来。/bin/sh
还是标准,/bin/bash
则效率更高
ctr + w
光标处开始删除一个 wordctr + /
, ctr + _
撤销删除,具体细节有所不同,但是都能达到目的两种方式,一种是通过 ls --full-time
显示
1 | ls --full-time |
另一种是 stat file_name
1 | stat test |
查看信息的同时做写入操作
1 | ps | tee info.log # ps 输出进程信息的同时,将结果导入 info.log 中 |
1 | <: 输入重定向 |
示例:
1 | # 只能在一条命令中完成,文本过长会很累赘 |
终端获取资源,Sample: curl -sSL https://raw.githubusercontent.com/python-poetry/poetry/master/get-poetry.py | python
-s: 静默模式,去掉显示进度等信息
-S: 显示错误信息
-L: 自动站点跳转
将 query 结果存到本地文件
1 | curl url >> ret.json |
ping
命令不需要带 protocal,如果要指定端口可以加 -p
1 | ping -p 8089 cloudsearch-dc8.cld.ondemand.com |
1 | # 显示系统容量 |
1 | # 这个命令不是很好,比较繁琐,效率也不高。 |
1 | # du: disk usage |
建立联接
1 | $ sfpt username@1.1.1.1 # 回车输入密码 |
获取文件下载到指定路径
1 | sftp> get /export/sftp/test.csv /Users/my/Downloads |
上传本地文件到服务器指定路径
1 | sftp> put /Users/my/Downloads/re-produce.gif /export/sftp |
ls -l | grep '^-' | wc -l
ls -lR | grep '^-' | wc -l
ls -l | grep '^d' | wc -l
解释:
ls -l
: 显示当前目录下所有文件,文件+文件夹grep '^-'
: 删选文件,grep '^-'
筛选文件夹。 示例 -rw-r--r-- 1 jack staff 1061 Aug 3 16:53 LICENSE
wc -l
: 统计行数记录一下查了无数遍的换行方法备用,总结一下就是使用 ‘’ + \ + ‘’ 类似的语法做链接,只可使用 ‘xxxx\xxx’ 的话会出现空格
1 | a = '1111111'\ |
1 | a = '''11111111 |
记录一下工作中常用到的 TestNG, Jmockit 使用案例
1 | @DataProvider(name = "singleParam") |
idea 中通过设置 live template 简化操作
1 | @org.testng.annotations.DataProvider(name = "$DATA_PROVIDER_NAME$") |
1 | @DataProvider(name = "multiParam") |
测试类结构如下
1 | public class ClientIPUtils { |
这种类型的测试中,可以通过以下方式绕过 静态代码块 中的逻辑。
1 | @BeforeClass |
如果你的测试逻辑需要不同的 token,你不应该在 case level mock 他,因为它是类级别的代码,jvm 启动的时候只执行一次,之前我像下面这样写测试,导致第二个测试一直失败
1 | @Test |
解决办法是,通过 MockUp 绕过静态代码块的初始化,当需要改变值的时候,通过 Deencapsulation.setField(Class, field_name, field_value);
实现
如果是 global 参数,那么所有 class 内的 case 都会有影响,如果是 method level 的那只有对应的 case 有影响
1 | class Teacher{ |
如果做 method level 的 mock, 只作用 case 本身
1 | @Test |
TestNG 6.9.11+ 和 Jmockit 有兼容性问题,将 @Mocked 通过参数方式传入会抛 Exception
1 | public class CompatibleTest { |
修复方法:将 @Mocked 部分提取改为 global 的变量即可
1 | public class CompatibleTest { |
如果我还想保留这种 case level 的使用,需要做点什么?这种 case level 的使用在作用域控制上更好
TODO
构建一个测试对象时,如果他没有默认构造函数的话需要为参数声明 @Injectable
1 | // 测试对象 |
1 | /** |
1 | /** |
1 | /** |
1 | @Tested Person person; |
partial 对非修饰类型有效吗?有效
new Expectations(ClassA.class)
会对这个 class 的所有实例生效,new Expectations(instance)
则只会对当前这个 instance 起作用,范围更精确
如果你在 UT 中想要验证某条 log 有没有打印出来,你可以使用 @Capturing
annotation。
相比于 @Mocked 而言,@Capturing 最大的特点是,他用于修饰 父类或者接口,那么他的所有实现类都会被 mocked 掉。对 log 的案例来说,我们为 Logger 这个 interface 加上这个注释之后,后续所有的实现都被 mock 掉,然后我们再做验证
1 | // Tested Class |
1 | // 如果是单个参数 |
今天写 UT 的时候遇到一个问题,当我使用 @Mocked 修饰一个类时,这个类的所有引用都会被 mock 掉,虽然知道有这种特性,但是以前都没有碰到问题,忽视了,debug 花了好久。
示例如下:
准别两个简单的 MyBean 和 MyField, MyField 是 MyBean 的一个属性,并在声明时就做了初始化。
对应的 UT 可以 work,但当我对 MyField 添加 @Mocked 注解时,对应的 equals 方法会被抹去,UT 就挂了。
解决方案有两种:1. 不用 @Mocked; 2. 只做方法层面的 mock
对于第二种方法,testng 升级到 6.1 之后需要配合 @DataProvider 使用,变得麻烦了,也不知道后面的版本会不会修复这个问题
1 | public class MyBean { |
想要解决的问题:
名词解释:
Apache
这里说的 Apache 指的是 Apache Http Server。静态服务器的一种,老牌(始于1995),曾经的王者,近年来市场占有率下降。
模块多,性能稳定,rewrite 性能搞,配置相对复杂
Nginx
毛子出品,2004年首发,声势迅猛。如今是三巨头之一(另两个是Microsoft, Apache),和 Apache 是同类产品。
支持反向代理,轻量级,非阻塞,高并发,社区活跃,bug 多
Tomcat
全名是 Apache Tomcat,Application Server 的一种,用来提供动态支持,和前面的不是一种类型。
1 | +-----------+ |
记录 Pandas 常用方法作为快速入门导航
1 | path = '/Users/i306454/Downloads/dump.json' |
1 | pd.set_option('display.float_format', lambda x: '{:.2f}KB'.format(x/1000)) |
使用 python 解析 PDF 文件,提取文件中表格的数据。随便在网上找了一个 PDF 文件做样本。使用 filetype:pdf 价格表格
的到样本文件。
稍微检索了一下,当下貌似名为 camelot 的 python lib 很火,就用这个做实验吧
这一步还挺复杂,需要安装挺多依赖,具体参考官方文档,这里只记录我本地环境的安装步骤
MacOS:
brew install tcl-tk ghostscript
, 然后终端输入 gs -version
, 在 python 命令行中输入 import tkinter
验证依赖是否安装成功pip3 install camelot-py[cv] --user
安装报错,是 zsh 的锅,切换回 bash 安装即可运行了一下官方给的例子,成功。但是我自己下载的中文 pdf 有问题,查了下,是说 camelot 基于 PyPDF2,然后这个 lib 是不支持处理中文字符的,不过可以通过修改对应 lib 的源码实现支持,网上有教程。不过我暂时只处理英文文档,就不纠结了。
1 | import camelot |