Java JDK UnSafe 类
JDK 里面有个类你可能没有直接用过, 但是阅读 JDK 源代码的时候, 到某些关键点上, 却经常会遇到, 就是 sun.misc.Unsafe. 这个类为什么不是一个名词呢? 为什么它就像一个警告一样, 告诉你: 不要用, 不要用.
JDK 里面有个类你可能没有直接用过, 但是阅读 JDK 源代码的时候, 到某些关键点上, 却经常会遇到, 就是 sun.misc.Unsafe. 这个类为什么不是一个名词呢? 为什么它就像一个警告一样, 告诉你: 不要用, 不要用.
有一个闲置的 server, 把常用的工具都安装到上面, 方便平时去试验一些东西:
sudo docker run --restart always --name nginx -v /home/supra/work/data/nginx_html:/usr/share/nginx/html:ro -v /home/supra/work/data/nginx_config/mime.types:/etc/nginx/mime.types:ro -p 80:80 -d nginxsudo docker network create mongo-network
sudo docker run --network mongo-network --restart always -p 27017:27017 --volume /home/supra/work/data/mongo/grafana:/data/db --name mongodb -d mongo
sudo docker run --network mongo-network --restart always -e ME_CONFIG_MONGODB_SERVER=mongodb -p 8081:8081 --name mongoui mongo-express参考: https://www.elastic.co/guide/en/kibana/current/docker.html
sudo docker network create elastic
sudo docker run --restart always --name es01 --network elastic -p 9200:9200 -p 9300:9300 -e "discovery.type=single-node" -d docker.elastic.co/elasticsearch/elasticsearch:7.16.1
sudo docker run --restart always --name kib01 --network elastic -p 5601:5601 -e "ELASTICSEARCH_HOSTS=http://es01:9200" -d docker.elastic.co/kibana/kibana:7.16.1sudo docker run --restart always -p 8000:8000 -e "SPLUNK_START_ARGS=--accept-license" -e "SPLUNK_PASSWORD=Sre@2021" --name splunk -d splunk/splunkdocker run -d --name clickhouse-server --ulimit nofile=5120:5120 --volume=/home/supra/work/data/clickhouse:/var/lib/clickhouse -p 8123:8123 -p 9000:9000 yandex/clickhouse-server参考: https://hub.docker.com/_/redis
$ docker network create redis-network
$ sudo docker run --network redis-network --restart always --volume /home/supra/work/data/redis/data:/data --name redis -p 6379:6379 -d redis redis-server --save 60 1 --loglevel warning
$ docker run -it --network redis-network --rm redis redis-cli -h redis参考: https://prometheus.io/docs/prometheus/latest/installation/
sudo docker run -d --restart always --name prometheus -p 9090:9090 -v /home/supra/work/data/prometheus:/etc/prometheus prom/prometheus参考: https://hub.docker.com/_/mysql
mkdir /home/supra/work/data/mysql/data
docker run --restart always --name mysqld -v /home/supra/work/data/mysql/data:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=Sre@2022 -d -p 3306:3306 -e "MYSQL_USER=sre" -e "MYSQL_PASSWORD=Sre@2022" mysql//create phpmyadmin UI
docker run --restart always --name phpmyadmin -d --link mysqld:db -p 8082:80 phpmyadmindocker run --restart always -d --name anaconda3 -p 8888:8888 continuumio/anaconda3 /bin/bash -c "\
conda install jupyter -y --quiet && \
mkdir -p /opt/notebooks && \
jupyter notebook --NotebookApp.token='' --NotebookApp.password='' \
--notebook-dir=/opt/notebooks --ip='*' --port=8888 \
--no-browser --allow-root"另外在 nginx 的 html 目录放一个 index.html
<li><a target="_blank" href=":5601/">elastic</a></li>
<li><a target="_blank" href=":8000/">Splunk(admin/Sre@2021)if expired, reinstall</a></li>
<li><a target="_blank" href=":8081/">MongoUI</a></li>
<li><a target="_blank" href=":8123/">ClickHouseUI</a></li>
<li><a target="_blank" href="/">RedisUI</a></li>
<li><a target="_blank" href=":9090/">Prometheus</a></li>
<li><a target="_blank" href="https://www.tianxiaohui.com/display/~xiatian/supra">wiki</a></li>
<script>
(function() {
const links = document.querySelectorAll("a");
links.forEach(function(ele){
ele.href = ele.href.replace("/:", ":");
});
})();
</script> 
效果:

Profiles -> Keys -> Key Mappings -> Natural Text Editing. 这样做的好处是 FN + 左右箭头. Option + 箭头


虽然 vi/vim 编辑器有很多快捷键, 但是常用的并不多. 把我认为需要常用的记录在这:
i – 光标处插入(进入插入模式)
a – 光标后插入(进入插入模式)
A – 行尾插入(进入插入模式)
o – 新建一行(进入插入模式)
u – 撤销前面的改动
U – 撤销当前行的所有改动
D – 删除当前行光标后所有字符
x – 删除当前光标处字符
R – 当前行从光标处开始替换
r – 仅替换当前光标处字符, 之后还是命令模式
s – 替换当前光标处字符并且进入插入模式
S – 删除当前行所有字符, 回到当前行行首, 进入插入模式
~ – 当前字符大小写替换
dd – 删除当前行(还是命令模式)
3dd – 删除3行
dw – 删除一个字符
4dw – 删除4个字符
Shift+zz 保存并关闭ESC – 退出插入模式l - 向右
h - 向左
j - 向下
k - 向上
0 - (零字符)行首
^ - (正则表达式行开始字符) 行首第一个非空字符
$ - (正则表达式行结束字符) 行尾H – 屏幕第一行
M – 屏幕中间行
L – 屏幕最后一行WORD – 非空字符隔开的.
word – 字母,数字,下划线组成的串.
例如:
192.168.1.1 – single WORD
192.168.1.1 – seven words.
e – go to the end of the current word.
E – go to the end of the current WORD.
b – go to the previous (before) word.
B – go to the previous (before) WORD.
w – go to the next word.
W – go to the next WORD.{ - 段落开始处
} - 段落结尾处 按理讲, 装个 bcc 有啥可记录的? 官方都有详细的安装说明, 直接一步步来不就好了. 其实我一开始也是这么想的. 然而现实很残酷, 花了我至少30分钟.
supra@suprabox:~$ cat /etc/issue
Ubuntu 20.04.4 LTS \n \l
supra@suprabox:~$ uname -a
Linux suprabox 5.4.0-117-generic #132-Ubuntu SMP Thu Jun 2 00:39:06 UTC 2022 x86_64 x86_64 x86_64 GNU/Linux链接: https://github.com/iovisor/bcc/blob/master/INSTALL.md
关于 kernel 的配置, 由于 Ubuntu 20.04.4 的 kernel 已经是5.4.0, 所以默认已经全配置了.
由于官方说使用 package binary 的2种方式的 package 已经 outdated. 所以选用 source 编译安装.
自己编译需要 LLVM, Clang, cmake, gcc 根据不同的 Ubuntu 版本有不同的安装包, 复制命令执行就好
git clone https://github.com/iovisor/bcc.git
mkdir bcc/build; cd bcc/build
cmake ..
make
sudo make install
cmake -DPYTHON_CMD=python3 .. # build python3 binding
pushd src/python/
make
sudo make install
popdgit config --global http.proxy http://proxy.mycompany:80
//如果代理需要用户名密码:
git config --global http.proxy http://mydomain\\myusername:mypassword@myproxyserver:8080//tmp/bcc/src/cc/bpf_module.cc:108:46: error: no matching function for call to ‘llvm::object::SectionRef::getName() const’
auto sec_name = section.get()->getName();这个帖子一样的问题, 还给出了解决方案. 我采用的是使用 v0.24.0 版本. 所以只要切换到这个 tag 就好了:
git checkout v0.24.0supra@suprabox:/usr/lib/python3/dist-packages/bcc$ sudo ~/bpf/bcc/examples/hello_world.py
Traceback (most recent call last):
File "/home/supra/bpf/bcc/examples/hello_world.py", line 9, in <module>
from bcc import BPF
ImportError: No module named bccsupra@suprabox:~$ $(which python) --version
Python 2.7.18于是改用 python3, 就好了:
sudo python3 ~/bpf/bcc/examples/hello_world.py
[sudo] password for supra:
b' splunkd-5799 [005] .... 47245.389935: 0: Hello, World!'
b' splunkd-5799 [005] .... 47245.393749: 0: Hello, World!'
supra@suprabox:~$ sudo python3 ~/bpf/bcc/examples/tracing/tcpv4connect.py
PID COMM SADDR DADDR DPORT
158736 python3.7 127.0.0.1 127.0.0.1 8089
838 qualys-cloud 10.249.64.103 64.39.104.103 443
159247 curl 127.0.0.1 127.0.0.1 8089
158736 python3.7 127.0.0.1 127.0.0.1 8089
159329 curl 127.0.0.1 127.0.0.1 8089至此, 安装成功.