okcaros移植到红米note8及体验

最近okcaros开放第三方移植了,我就简单试了一下,有点惊喜

okcaros官网 https://www.okcaros.com/zh ,实现原理是通过更改usb协议,欺骗carplay来映射安卓手机的内容,思路还是挺好的

适配过程比较简单,给kernel“打个补丁”,引入一下okcar代码,编译就完事了(实际是在AMD r7-5800上面,16G内存的虚拟机上,要跑12+小时😂

上两张图

关于香橙派5运行flowpilot

香橙派5是一款使用瑞芯微rk3588的开发板,有3个usb接口(1个type-c和type-a公用,虽然4个其实3个),一个hdmi接口,一个千兆网口,等等

废话不多说,下面是如何安装flowpilot

前置条件

  • 起码一个usb摄像头
  • 一块屏幕,HDMI的或者mipi dsi的都行
  • 其他的就是能让Ubuntu系统启动所必须的硬件了,如硬盘或emmc或sd卡,散热装置等

安装系统

这里我使用的是 https://github.com/Joshua-Riek/ubuntu-rockchip

如果你是用sd卡,那么只需要把系统dd进去即可
其他的参考官方的烧录方法,此处不赘述

安装flowpilot

这里基本是按照 https://github.com/flowdriveai/flowpilot/wiki/Installation 方法进行的,除此之外还要安装一些额外的包

1
2
3
sudo apt install ffmpeg libavformat-dev libavcodec-dev libswscale-dev \
libssl-dev libcurl4-openssl-dev ocl-icd-opencl-dev libgflags-dev \
libstdc++-12-dev libprotobuf-dev protobuf-compiler

源码可以参考我更改的fork https://github.com/0312birdzhang/flowpilot ,主要修改了一些兼容性,以及替换了opencl为系统自带的,还有就是编译了aarch64上面的几个libraries

配置摄像头和车型,更改 launch_flowpilot_new.sh,进入flowpilot的目录下,运行pipenv shell,然后执行launch_flowpilot_new.sh即可

体验

总体来说只能说跑起来了,离日常使用还比较遥远,例如设备发热严重(没有用到rknpu,使用tnn跑性能差点,需要写JNI来调用rknpu跑,暂时没精力研究这部分了)、还没有驾驶员监控、上游进度缓慢等等,所以我也转向原生openpilot上了。

记录一次Signal使用代理的过程

在网上找了很多方法,按照传统的思路,在cmd里面设置如下命令然后启动

1
2
set HTTP_PROXY=http://127.0.0.1:1081
set HTTPS_PROXY=http://127.0.0.1:1081

结果并不行,然后我发现了这个 https://github.com/signalapp/Signal-Desktop/pull/1855

1
2
3
set HTTPS_PROXY=http://127.0.0.1:1081
set WSS_PROXY=http://127.0.0.1:1081
set ALL_PROXY=http://127.0.0.1:1081

然后将Signal.exe拖进cmd,enter后就可以正常了。

Tomcat多实例session共享方案

Tomcat实现多实例session共享的方案还挺多的,up主使用了三种,最终选择了tomcat自带的Cluster集群方案。下面来说一下这三种方案的优缺点。

up主用的tomcat7,至于为什么还是7这么老的版本,因为高版本的对get请求有一些字符校验
另外,这些都是不用改java代码的,其他的没做研究

tomcat-redis-session-manager

这个应该是最常见的方案了,我们随便一搜就是这个,但是代码有些坑。。。

如: 这个 还有这个 等等,还有两个致命的bug,一是session保留时间过长,里面有一段代码 session.setMaxInactiveInterval(getMaxInactiveInterval() * 1000); ,这里多保留了1000倍的时间。二是每次访问都会有一条session记录保留,非常的耗费redis内存。

虽然上述俩bug本up主已经修复了,但是发现还会丢session,估计是redis的驱逐问题,也懒得去调试了。

redisson

本up主发现这个的时候以为终于得救了,看一下人家的官网 https://redisson.pro/ ,还有商业版,就觉得很靠谱。事实证明还是too young too naive啊

因为突然有一天,同事说你这个接口好慢,然后我发现整个机器负载都很高了,访问网站直接卡成狗,看了一下日志,jvm崩溃了 java.lang.OutOfMemoryError: GC overhead limit exceeded

上面那个不管是丢session还是保留时间太长,但是不至于把tomcat搞死。好家伙,这个直接把jvm干崩溃了,OOM可还行

Tomcat Cluster

这里有一个很详细的教程 http://xstarcd.github.io/wiki/Java/tomcat_cluster.html ,我就不赘述了。

注意,我直接贴他的tomcat配置发现有看不见的空行还是啥的,可以去tomcat网站复制。

注意2,一定要在web.xml中添加<distributable />

使用两天了,暂时没发现问题,有待后续观察。

最近的一些感想

最近这一年过的挺快的,对我来说真的是一眨眼的工夫。作为一个住在郊区的打工人,每天固定时间起床、坐地铁、上班、下班、坐地铁、回家、睡觉,一天就这么结束了。日复一日的没有什么差别,所以感觉每天都一个样。要说没差别嘛,其实也有,后面会讲到。好了,也不废话了,下面分解一下,按5部分进行总结一下。

工作

这个其实是最好“处理”的了,特别是对于我这只老社畜来说,不能说如鱼得水吧,只能是游刃有余。(夸张了😂

其实在一家公司待了几年,而且是我这个岗位的来说,事情不多,大多数都是小的需求,基本上都是一周码2-3天就能码完的。剩下的时间就自己安排了,摸鱼、学习新技术等。时间长了也是挺无聊的,也没有太多的挑战(除非突然几个bug一起来😰)

还好薪水能勉强说的过去,不然早就跑路了,感觉待的时间越久越费,现在年龄在这里摆着,也不知道下一份工作如何是好。你们年轻人应该没这些烦恼吧~

生活

人除了睡觉、工作,剩下的时间寥寥无几,也就是我们的生活了。
作为一个有娃的社畜,生活基本上是围绕着娃的,父母、妻子、娃和我自己,这几种元素组成了每天的生活。
生活需要磨合,需要心平气和,需要耐心,需要理解。还是那句话,懂得都懂
这部分就不继续展开讲了,其实就一个字:忍。

学习

这里的学习是宏观上的,不是像学校里那种拿着书本和笔,在教室中的那种,这也是我一直想给身边人普及的一个认知,我们随时都可以学习,活到老学到老。

对于我来说,移植sailfish几乎占据了我在工作、娱乐外的时间,转眼一看我都已经做了4年了,目前也在移植第四台设备,希望能早日有进展。
工作时间的学习,很多是在Java的深度上和Linux的一些盲区,这是一条无止境的路。

娱乐

不得不说,dota2和电影填充了我的娱乐时间,其他的几乎为0。

感情

为什么有了生活部分还有感情部分呢? 我也不知道怎么形容才好,怎么说才会有人懂,但是懂得都懂吧😓

人生就是一座围城,里面的人想出来,外面的人想进去。

结了婚的羡慕谈恋爱的,有娃的羡慕单身没有束缚的,单身的羡慕有男女朋友的,谈恋爱的羡慕…没有,恋爱应该是最美好的。

人一旦到达一个新的阶段,总会想保持现有的,还会努力去够一下新的目标,同时也会有些怀念当初拥有的更“纯粹”的阶段。

如果有那么一个机会、一个时刻,你可以去回到当初那个“纯粹”的阶段,可以出去围城看一看,但是要冒一些风险,理性的我们一般不会去越过这条线,保持自己在围城里面。

但是,这颗种子种下后,它会在你的内心生根发芽。总有一天,这颗种子长大到可以伸出到城墙外面,那时你可以选择砍掉这根树枝,或者狠下心把这颗树彻底根除。

选择,是一个非常有趣的话题。有些人会凭感觉去选,有的人靠计算收益去选择,有的人不做选择,有的人想选择两者。黑客帝国中,尼奥第一次见先知,就探讨过选择的问题。

对错,也是一个非常有趣的话题。何为对,何为错,真的有人能说这件事永远都是对的吗?古人有塞翁失马焉知非福,几千年前的思想家就已经在讨论这个哲学的问题了,自然这个话题是没有答案的。

好了,扯了太多了,夜也深了,该睡觉了。毕竟,明天还要做打工人呢,哪里会有时间思考呢。

水了几天终于水完了,懒得不香写了,就这样吧。

从日志中查询链接文件中的链接是否最近有访问

链接文件a.txt内容如下

1
2
http://example.com/123.txt
http://example.com/456.txt

日志文件为从cdn下载的或者nginx的压缩日志,gz格式

思路:循环zcat压缩文件,然后两个文件都做一个处理,去掉重复的部分,然后对这俩文件进行重复统计,有的话说明链接有访问

简单的示例

1
2
3
4
5
6
7
8
#!/bin/bash
gzs=$(ls |grep gz)
for gz in $gzs;
do
echo "start $gz"
zcat $gz|awk '{print $7}'|sort -n|uniq -c|sort -n > tmp.txt
cat tmp.txt a.txt| sort -n| uniq -c|sort -n |awk '{if($1>1) print $2}' >> exist.txt
done

Gitlab CE使用drbd实现主备方案

痛点

由于Gitlab社区版是不提供高可用等方案的,只能定时备份出来然后出问题了再导入,有时候会丢失数据,而且耗时随着备份文件大小增加,后期维护成本高。

解决思路

在搜索了大量的方案之后,只有使用drbd的才是靠谱的,而且比较容易跟现有的结合,值得尝试。

安装drbd

这里都是参考了 csdn博主的 https://blog.csdn.net/allway2/article/details/102478719


DRBD使用LVM逻辑卷作为后端设备创建XFS文件系统在线添加磁盘扩容操作过程


#### 0.服务器环境信息

drbd1 192.168.111.132 CentOS 7
drbd2 192.168.111.190 CentOS 7


#### 1、禁用SELinux
在两个节点执行: # setenforce 0

##### 永久关闭
可以修改配置文件/etc/selinux/config,将其中SELINUX设置为disabled。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
[root@localhost ~]# cat /etc/selinux/config   

# This file controls the state of SELinux on the system.
# SELINUX= can take one of these three values:
# enforcing - SELinux security policy is enforced.
# permissive - SELinux prints warnings instead of enforcing.
# disabled - No SELinux policy is loaded.
#SELINUX=enforcing
SELINUX=disabled
# SELINUXTYPE= can take one of three two values:
# targeted - Targeted processes are protected,
# minimum - Modification of targeted policy. Only selected processes are protected.
# mls - Multi Level Security protection.
SELINUXTYPE=targeted

# sestatus
SELinux status: disabled


关闭firewall:
1
2
systemctl stop firewalld.service #停止firewall
systemctl disable firewalld.service #禁止firewall开机启动


设置主机名:

1
2
hostnamectl set-hostname drbd1
hostnamectl set-hostname drbd2


#### 2、安装DRBD

在两个节点执行:
1
2
3
4
5
6
# rpm --import https://www.elrepo.org/RPM-GPG-KEY-elrepo.org
# rpm -Uvh http://www.elrepo.org/elrepo-release-7.0-3.el7.elrepo.noarch.rpm
# yum install drbd90-utils kmod-drbd90
# lsmod | grep -i drbd
# modprobe drbd
# echo drbd > /etc/modules-load.d/drbd.conf


#### 3、配置DRBD

在两个节点执行:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
# mv /etc/drbd.d/global_common.conf /etc/drbd.d/global_common.conf.orig
# vi /etc/drbd.d/global_common.conf

global {
usage-count no;
}
common {
net {
protocol C;
}
}


# vi /etc/drbd.d/drbd0.res

resource drbd0 {
disk /dev/drbdvg/drbdlv;
device /dev/drbd0;
meta-disk internal;
on hostname1 {
address 192.168.111.132:7789;
}
on hostname2 {
address 192.168.111.190:7789;
}
}


1
2
3
4
5
6
7
8
9
# pvcreate /dev/sdb
# vgcreate drbdvg /dev/sdb
# lvcreate -l 100%VG -n drbdlv drbdvg
# lvscan
# drbdadm create-md drbd0

# systemctl start drbd
# drbdadm status
# cat /proc/drbd


在主节点执行:
1
2
3
4
5
6
7
8
9
10
# drbdadm primary drbd0 --force

# mkfs.xfs /dev/drbd0
# mount /dev/drbd0 /mnt
# touch /mnt/file{1..5}
# ls -l /mnt/
# df -hT
# vgdisplay
# pvdisplay
# lvdisplay

#### 4、在线扩容
在两个节点执行:
1
2
3
4
5
6
7
8
9
# lsblk
# pvcreate /dev/sdc
# pvdisplay
# vgdisplay
# vgextend drbdvg /dev/sdc
# lvs
# lvdisplay
# lvextend -l+100%FREE /dev/drbdvg/drbdlv
# lvs

等待数据同步完成
1
# watch drbdadm status

在主节点执行:
1
2
3
4
# drbdadm resize drbd0

# xfs_growfs /mnt
# df -hT

扩容完成,等待扩容数据同步完成
# watch drbdadm status

同步完成后可以进行切换测试

在主节点执行:
# umount /mnt/

在从节点执行:
1
2
3
4
5
6
# mount /dev/drbd0 /mnt
# ls -l /mnt/
# df -hT
# touch /mnt/file{11..15}
# ls -l /mnt/
# umount /mnt


在主节点执行:
1
2
# mount /dev/drbd0 /mnt
# ls -l /mnt

应用到Gitlab

如果已经在运行了,那可以在运行的机器上挂载另外一块硬盘,新开一台机器,这俩作为drbd的主备,将运行的gitlab data数据rsync到drbd管理的那块盘上即可

然后改一下gitlab的data位置,重启一下或者reconfigure一下即可。

python使用subprocess查看进程并过滤

来源: https://stackoverflow.com/questions/6780035/how-to-run-ps-cax-grep-something-in-python

将proc1的输出当作proc2的输入来实现

1
2
3
4
5
6
7
8
import subprocess

proc1 = subprocess.Popen(["ps","-ef"],stdout=subprocess.PIPE)
proc2 = subprocess.Popen(['grep', 'mysql'], stdin=proc1.stdout,
stdout=subprocess.PIPE, stderr=subprocess.PIPE)
proc1.stdout.close() # Allow proc1 to receive a SIGPIPE if proc2 exits.
out, err = proc2.communicate()
outline = '{0}'.format(out)

使用yavijava创建兼容低版本的虚拟机

痛点

在使用 https://github.com/yavijava/yavijava 创建虚拟机的过程中,默认会将虚拟机的兼容性自动设置为ESXI的版本,如在ESXI 6.5上创建的虚拟机,其兼容性则为 ESXi 6.5 及更高版本 (虚拟机版本 13), 这样导致迁移的时候不能将这个虚拟机迁移到小于ESXI 6.5版本的主机上。

解决

在查询很多资料之后,确认可以通过 https://www.altaro.com/vmware/4-ways-to-downgrade-the-vm-hardware-version/ 文中的方法,将虚拟机先从清单中删掉,更改虚拟机的vmx文件,将virtualHW.version改为需要的版本,重新注册虚拟机即可。

在已知了这些方法之后,进行尝试, 发现在初始化虚拟机之后是无法再进行更改的,只有创建的时候设置好才行,如下即可。

1
2
3
4
5
6
7
8
9
10
11
vmSpec.setVersion("vmx-10"); # 10 表示 esxi 5.5
// call the createVM_Task method on the vm folder
Task task = vmFolder.createVM_Task(vmSpec, rp, null);
String result = task.waitForTask();

if(result == Task.SUCCESS){
System.out.println("VM Created Sucessfully");
}else{
System.out.println("VM could not be created. ");
return;
}

debian,ubuntu无法使用apt下载源数据的解决方法

现象:

不管是默认的源还是ustc的都直接提示 Connection failed,但可以ping通。

1
2
3
4
5
6
7
8
9
10
11
12
13
root@77ec78c7b3b7:/# printf "deb http://mirrors.ustc.edu.cn/debian/ buster main contrib non-free\n#deb-src http://mirrors.ustc.edu.cn/debian/ buster main contrib non-free\ndeb http://mirrors.ustc.edu.cn/debian/ buster-updates main contrib non-free\n#deb-src http://mirrors.ustc.edu.cn/debian/ buster-updates main contrib non-free\n#deb http://mirrors.ustc.edu.cn/debian-security/ buster/updates main contrib non-free\n#deb-src http://mirrors.ustc.edu.cn/debian-security/ buster/updates main contrib non-free" > /etc/apt/sources.list
root@77ec78c7b3b7:/# apt update
Err:1 http://mirrors.ustc.edu.cn/debian buster InRelease
Connection failed [IP: 202.141.176.110 80]
Err:2 http://mirrors.ustc.edu.cn/debian buster-updates InRelease
Connection failed [IP: 202.141.176.110 80]
Reading package lists... Done
Building dependency tree
Reading state information... Done
All packages are up to date.
W: Failed to fetch http://mirrors.ustc.edu.cn/debian/dists/buster/InRelease Connection failed [IP: 202.141.176.110 80]
W: Failed to fetch http://mirrors.ustc.edu.cn/debian/dists/buster-updates/InRelease Connection failed [IP: 202.141.176.110 80]
W: Some index files failed to download. They have been ignored, or old ones used instead.

解决方法:

更改apt的默认UA

printf 'Acquire\n{\n http::User-Agent "Mozilla/5.0 (Windows NT 5.1; rv:25.0) \nGecko/20100101 Firefox/25.0";\n};' > /etc/apt/apt.conf

参考:

原因:

未知。。。,在另一个网络环境下就可以,也是神奇。

P.S. 感谢公司大数据部门的同学,让我又可以水一篇了 xD (划掉划掉)