2024年9月30日星期一

睡不着、睡不着啊,怎么办(二)

这个月的治疗

马来酸伏氟沙明从半片加到了三片(150mg)。这药副作用不小,天天吃不下饭,早上起来还很困,但感觉没什么明显的效果。

挂了回龙观医院的号,说伏氟沙明还没起效,没有达到足疗程、足剂量,没法评估。又给加了劳拉西泮,抗焦虑,每天三次服用。

安定医院


我又去了安定医院,总觉着回龙观的诊断是不是太严重了。结果,诊断一致,处方也一样,量表测出来都是重度抑郁、焦虑,真是吓人。

2024年9月7日星期六

睡不着啊,睡不着,怎么办?

睡不着啊,睡不着,怎么办?

药物

去了医院,诊断:焦虑、抑郁状态,给开了一大堆药,全是国产仿制药,很好,包括:
  • 扎来普隆分散片(安云):非苯二氮卓类的安眠药,短效,一个小时达到血药浓度高峰,三个小时基本就代谢完了。医嘱:1-2片,睡前服用。
  • 劳拉西泮(劳拉):正儿八经的苯二氮卓类药物,抗焦虑,镇静,算中效的吧,药效能维持一个晚上。长期吃应该会有依赖性。大夫说,影响记忆力,但相对于睡不着,这个代价还是值得的。
  • 艾司唑仑(舒乐安定):也是个苯二氮卓类的药物,抗焦虑、抑郁、镇静,药效也不错,用来替换劳拉西泮。我用了几天的劳拉西泮,感觉已经有点耐药了(不应该啊,为什么?)。还没吃,不知道什么效果。
以上都是精二的药,药盒上硕大的“精神药品”。没想到,我也有一天吃上了这些东西。当年在学校里学《药物化学》,背了一大堆分子式、药理毒理什么的,没想到今天居然用上了。

还给开了个不是精二的药,本来是抗抑郁、焦虑、强迫的,但是睡前服用也可以有镇静的作用。不知道是因为抗焦虑有效果还是镇静的功能起了主要作用。
  • 马来酸氟伏沙明:选择性5-羟色胺再吸收抑制剂。啊,这个名字我好熟,死去的记忆在攻击我。睡前服用半片至三片,半个小时起效,增加睡眠深度和时间。

运动

我买了个自行车,本想上下班骑,奈何这一阵子总下雨(不知道为什么,一下雨我就睡得不好),不敢骑。再者,睡不着总是精神恍惚,不敢骑,怕摔在路上。

2024年9月1日星期日

Notre-Dame de Paris in Beijing

 2024年8月31日去看了在北京天桥艺术中心上演的音乐剧《Notre-Dame de Paris》。


拍的不好,请见谅。观演气氛很好,大家都守规矩,演出过程中不拍照。

不得不承认,法国的文化输出真不是盖的,不是暴发户能比得了的。

这个剧我是大一的时候从《音乐艺术鉴赏》这种公共选修课上知道的,原声带不知道听了多少遍,这次终于有机会看到了现场,非常满意。


在Ubuntu 22.04下编译运行OMNet++ 6.0

OMNet++是一个网络模拟器,官方网站上给出了Linux/Windows/其他平台的安装包,但是没有强调Linux平台是哪个发行版的。

考虑到不同发行版下编译安装这种大型工程的体验差别极大,选错了发行版需要解决一大堆乱七八糟的编译问题(我已经烦透了,不知道为什么,以前还以解决这种问题为乐趣),为了避免浪费时间,查了一下Ubuntu 22.04用的比较多,开发者用的也是这个发行版。

编译时需要注意的事项:
  • 使用gcc编译,不要使用clang,否则会报找不到math(-lm)的错误。
我的Ubuntu 22.04上安装了clang,报了一堆找不到数学库(m)的错误。使用apt remove删除clang就可以继续编译了。
  • 使用pip仓库中的matplotlib,不要用apt源带的matplotlib。
先移除apt源带的matploatlib,再pip3 install matplotlib安装最新的版本,否则会在scipy版本上引入冲突。
  • 还要安装一堆python库,根据提示安装就可以了。

2021年10月5日星期二

C/C++中如何判断空字符串(c-style)?

根据stackoverflow的回答(https://stackoverflow.com/questions/15485179/how-to-check-if-c-string-is-empty),有若干种方法,我比较喜欢的是以下两种方式:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

int is_this_str_empty(char * str) {
if (strlen(str) == 0)
{
printf("\n Empty");
}

if (strcmp(str, ""))
{
printf("\n Empty");
}
}

第一种方式是判断字符串的长度,第二种方式判断字符串是否与空字符串相等。考虑执行效率,应该选用
strcmp()的方式,因为strlen()计算字符串长度时需要遍历字符串。

确实是这样的吗?我们看一下编译器编译出的汇编代码。

.LC0:
.string "\n Empty"
is_this_str_empty(char*):
push rbx
cmp BYTE PTR [rdi], 0
mov rbx, rdi
je .L7
.L2:
cmp BYTE PTR [rbx], 0
jne .L8
pop rbx
ret
.L8:
pop rbx
mov edi, OFFSET FLAT:.LC0
xor eax, eax
jmp printf
.L7:
mov edi, OFFSET FLAT:.LC0
xor eax, eax
call printf
jmp .L2

这里使用的是gcc 4.8.2(x86-64),启用-O3编译选项。可以看到编译器理解了strlen(str)==0就是判断
字符串是空的意图,直接比较了第一个字符是否为空。我们再来看一下O0时的编译结果:

.LC0:
.string "\n Empty"
is_this_str_empty(char*):
push rbp
mov rbp, rsp
sub rsp, 16
mov QWORD PTR [rbp-8], rdi
mov rax, QWORD PTR [rbp-8]
movzx eax, BYTE PTR [rax]
test al, al
jne .L2
mov edi, OFFSET FLAT:.LC0
mov eax, 0
call printf
.L2:
mov rax, QWORD PTR [rbp-8]
movzx eax, BYTE PTR [rax]
test al, al
je .L4
mov edi, OFFSET FLAT:.LC0
mov eax, 0
call printf
.L4:
leave
ret

与O3时差不多,直接比较了第一个字符是否为NULL.

为什么编译器可以对strlen()和strcmp()进行优化而不是调用库函数呢?这是因为strlen()和strcmp()
都有编译器实现的builtin版本,编译器理解这些函数的意图,可以直接优化。

我们关闭编译器的builtin选项,可以看到:

.LC0:
.string "\n Empty"
.LC1:
.string ""
is_this_str_empty(char*):
push rbx
mov rbx, rdi
call strlen
test rax, rax
je .L7
.L2:
mov esi, OFFSET FLAT:.LC1
mov rdi, rbx
call strcmp
test eax, eax
jne .L8
pop rbx
ret
.L8:
pop rbx
mov edi, OFFSET FLAT:.LC0
xor eax, eax
jmp printf
.L7:
mov edi, OFFSET FLAT:.LC0
call printf
jmp .L2

编译器直接调用了库函数,这时执行效率就不同了。