996.ICU
一位保守党政客讲得再清楚不过,穷人全都“必须要不断地吃,不断地喝,不断地工作,不断地死去”。
run npm i theme-next/next-util
.
COMPREHENSIVE “YNGWIE-TONE” & EQUIPMENT SET-UP OVERVIEW INFORMATION:
不用说,我是 Yngwie 的粉丝,从 20 世纪 90 年代开始,我的一位朋友递给我一盘 Yngwie 歌曲的拷贝磁带。
我很惊讶地发现有很多不同的 YJM Strats
这篇文章的目的是试图帮助那些遇到与我在 Yngwie 型号方面相同的困惑问题的人。
发现 git 仓库的存储空间有问题,原来是一不小心提交了二进制文件。作为强迫症患者学习了一下如何给仓库瘦身。
清理前 repository 为 93.1 MiB | 清理后 repository 为 1.6 MiB |
---|
使用 Grafana - loki - promtail 提取 glog 的时间戳、文件名等信息。
本文不提供 Multiecuscan。如需使用请官网购买;或赞赏我(赞赏码在首页左侧、文章末尾),并留下微信号获取破解版。
Multiecuscan 是意大利车辆的诊断软件。 它允许您对支持的车辆/模块执行各种诊断任务。
Alfa Romeo Stelvio headlight switch disassembly, allowing headlights to stay off.
The headlight switch of the Alfa Romeo Stelvio cannot be kept off. The specific performance is that the switch is turned to the far left to turn off the headlight, and the switch automatically resets to the on mode after letting go.
Alfa Romeo Stelvio 的大灯开关无法保持关闭,具体表现为开关拧到最左边大灯关闭,松手后开关自动复位到开启模式。搜了一下国内外都没有改装教程,就自己写了一个发出来。
1 | cp /sbin/ifconfig . |
可能会有 log [RTPS_READER_HISTORY Error] Change payload size of 'xxx' bytes is larger than the history payload size of '271' bytes and cannot be resized. -> Function can_change_be_added_nts
在 subscriber 加 rqos.endpoints().history_memory_policy = eprosima::fastrtps::rtps::DYNAMIC_RESERVE_MEMORY_MODE;
翻译自 https://www.geeksforgeeks.org/python-different-ways-to-kill-a-thread/
通常,突然终止线程被认为是一种糟糕的编程习惯。突然终止线程可能会使必须正确关闭的关键资源处于打开状态。但是您可能希望在某个特定时间段过去或产生某个中断后终止线程。
下面有6种方式杀死线程,其中前两种较常用,我在原文的基础上进行了一些修改,以覆盖更多的情况。
Big Muff Pi 是由 Bob Myer 和 Mike Matthews 在 1969 年设计的失真/延音吉他踏板,并在1970年大规模生产。由于其独特的声音、价格和可靠性,该效果器是 Electro-Harmonix 的第一个压倒性的成功。多年来,有几个版本和重制版被发布。
全文译自: https://www.electrosmash.com/klon-centaur-analysis
1990 年至 1994 年间,Bill Finnegan 在两位麻省理工学院电子工程师的帮助下,设计了过载效果器 Klon Centaur。最初的想法是改善 TubeScreamer 的瞬态响应和中低音频率,以产生带有电子管效果器的过载音色。
全文译自: https://www.electrosmash.com/fuzz-face
Fuzz Face 是一种失真吉他踏板,由 Arbitrer Electronics Ltd 于 1966 年秋天在伦敦设计。它产生一种称为fuzz的特有的高失真声音。
Ivor Arbiter 从麦克风支架中汲取了圆形外壳的想法。另外,它是第一个使用 DPDT 单块开关的 TrueBypass 踏板。由于 Jimi Hendrix 演奏了这种效果器,因此该效果器变得非常流行,而且当时还没有很多失真效果器。
Pro Co Rat 是 Pro Co Sound 公司生产的失真踏板,由 Scott Burnham 和 Steve Kiraly 于 1978 年在密歇根州的卡拉马祖设计。电路和外观在不同版本中发生了一些变化,但音色保持不变。
由于踏板的成功,Pro Co 设计了多个版本,比如 Juggernaut (1979)
, R2DU (1984)
, RAT2 (1988)
, Turbo RAT (1989)
, Vintage RAT (1991)
, BRAT (1997)
, Deucetone RAT (2002)
, Juggernaut Bass RAT (2003)
, You Dirty RAT (2004)
, '85 Whiteface RAT Reissue (2010)
。
持续更新中,欢迎在主页左边扫码给我买杯咖啡 ^_^
那天他看外面阳光很好,于是穿上自己最喜欢的衣服,带上自己觉得最好看的遮阳帽,独自一人悄悄走向了远方,然后再也没回来。
本文总结了常见抗抑郁药的对应靶点,以及相应耙点会产生的精神效果。阅读本文需要了解抗抑郁药的基本原理,可以在b站 药学生Justin
底层原理
中快速了解有关知识。内容皆为网络收集,无原创部分。
FastDDS 有两套 API,接近传输层的 RTPS API
和规范的 DDS API
。
有的项目要求一个 commit 必须包含完整的功能,但在开发时通常会提交很多细粒度的 commit,比如 add test
clean code
等。这种情况下可以使用 git squash
将多个 commit 压缩,得到干净的主分支。
1 | git merge --squash tmp |
squash 的优点是可以得到简洁的 commit 记录,但缺失详细的 commit 记录会对后面 debug 造成一些影响。
比如,使用FastDDS后,我一直在调试一个无法重连的bug,通过 log 可以定位到这个 bug 是在一次 2000 行的 commit 引入的。如果现在开始读这两千行代码肯定会浪费很多时间。
现在要借助 github,在 pull request 页面可以找到详细的 23 个 commit 记录,并定位到引入 bug 的 commit:
为了防止这个 commit 不完整,我们需要手动下载引入 bug 的代码,和引入 bug 之前的代码,分别做一次回归测试。(手动下载代码的原因是,这些 commit ID 不在 git repo 里,无法 checkout)
在 master 里改完 bug 以后,为了防止引入新 bug,别忘了跑回归测试。
刚开始用 FastDDS 的时候就发现这个问题,原以为是共享内存 deadlock 了,于是就有了前面关于 boost 鲁棒锁的那篇帖子。但问题并没有这么简单 >_<
这个问题在 Github/eProsima/Fast-DDS#2811 有详细记录。
对 FastDDS 程序进行 debug 时,将 subscriber 暂停,等一会再重启,subscriber将无法再次接收数据。Publisher / Subscriber 的日志如下
1 | Publisher |
1 | Subscriber |
查看 log 对应的代码,最后定位到可能出现问题的 commit 在 eProsima/Fast-DDS@e58dcb1。
这个 commit 是 Pull Request 时将几十个 commit squash 在一起的[链接]。squash 前的 commit 在 github 可以查看,但用 git 命令是无法 checkout 的,所以手动下载了一堆源码编译,二分查找了一下,最后定位在下面这个 commit:
Refs #8250. Do not reuse zombie ports structures.
@adolfomarver authored and @MiguelCompany committed on May 12, 2020
问题看起来像是 Subscriber 拒绝复用 zombie ports,但又没申请新的 port.
注释了几行代码,可以暂时避免这个问题,参考 duchengyao@Fast-DDS/commit/63ad668
Boost
是一个开源 C++ 算法库,是官方认证的对标准 C++ 的扩充(有点类似 python 的 anaconda)。C++ 15 / 17 等新版本有很多特性也会参考 boost 库;boost:Interprocess
实现了进程间通信功能,包括共享内存、内存映射文件、信号量、文件锁、消息队列等;共享内存
指可被多个进程存取的内存,被用作进程间的通信。boost::interprocess 在 1.78 版本之前如果进程崩溃可能导致死锁。从18年就有人提出这个issue,21年才修复。
最简单的复现方法是执行三遍下面的代码:
1 | #include "boost/interprocess/managed_shared_memory.hpp" |
terminate called after throwing an instance of 'boost::interprocess::interprocess_exception'
what(): boost::interprocess_exception::library_error
terminate called after throwing an instance of 'boost::interprocess::lock_exception'
what(): boost::interprocess::lock_exception
原因在这几行,如果不想更新boost,改那几行也可以。
如果编译器支持 _POSIX_C_SOURCE >= 200809L
,在构造锁的时候判断 pthread_mutexattr_setrobust(&m_attr, PTHREAD_MUTEX_ROBUST) != 0
。
pthread_mutexattr_setrobust 的说明在这里
FastDDS 新推出的零拷贝 (Zero Copy) 模式有很多难以理解的地方,在这里会持续做些整理。
目录
subscriber
和 publisher
会使用同一个内存地址,为什么打印出来的地址不同?qos.history().depth
与 qos.resource_limits().max_samples/extra_samples
什么关系?目前使用 apt-mirror 会缺少文件,比如:
1 | Err:18 http://mymirror.blah:80/ubuntu bionic/main DEP-11 64x64@2 Icons 404 Not Found [IP: *.*.*.* 80] |
需要使用下面的脚本修复。
上一篇文章吐槽了
创想三维 Sermoon V1
的缺点,其中包括不开源的主板。我花了几天时间逆向,得到了主板的配置文件。
使用此配置文件可以自行编译固件:开启 Lineradvance、加入 BLTouch 自动调平、降低待机时风扇的噪声。
新的配置文件在 Klipper3d/klipper#5621
官方已经开源了 CrealityOfficial/Sermoon-V1另外,文章最后提供一个散热套件的模型。
本文不提供 Multiecuscan。如需使用请官网购买;或赞赏我(赞赏码在首页左侧、文章末尾),并留下微信号获取破解版。
阿尔法罗密欧的四叶草(Quadrifoglio)版本具有 Race 模式,在此模式下打开双模式排气,停用 ESC 稳定控制系统,同时提高油门、变速箱、制动和转向响应。
在普通版本的阿尔法罗密欧中,可以通过修改 Body Control Module(BCM) 的配置文件来启动隐藏的 Race 模式。
通常,改装 Race 模式的方法是去闲鱼购买一个四叶草版本的 DNA 开关(¥1100),远程开启隐藏功能(¥500)。这篇文章教你零成本开启此功能。
ROS 和前期的 Apollo 定义了一个 API,它向用户公开如
发布
/订阅
等通信概念。
这些通信概念的实现基于自定义协议,并使用共享内存去降低基于Socket通信的开销。
这些传统方法存在一些问题,如每个节点以单独进程的形式存在,由底层操作系统调度,而Linux是个通用系统,每个节点的运行顺序并无任何逻辑。ROS是专用系统,任务应按照一定的业务逻辑执行。
ROS 2
和 Apollo 3
的计算框架 Cyber RT
构建在现有中间件解决方案 DDS
之上 [1] [2]
Cyber RT
在此基础上构建了自己的调度器 [3],由一个多队列的任务编排策略
调度协程(Coroutine)在 Native Thread 上有序运行。其中,Cyber RT 会动态的根据不同调度顺序的执行时间来动态的选择一个时间最短的调度策略。
调整吉他之前请换一套新琴弦,并在每一步调整完毕后给吉他重新调音。