R Field - 2020年12月
type: channel
link: http://ramlife.org/2020/12/
description: 通玄小论
items: 编译 浮点 选项
items: shell 脚本 学习笔记
items: lxde 分辨率太大，桌面显示不全
items: alsaaudio period size 理解
items: messagequeue
items: git 换行符
items: 100ask 韦东山 驱动大全 子系统 v4l2 学习笔记
items: python 从多声道 pcm 文件中 转换成单通道 pcm 文件
items: ubuntu emacs 切换中文输入法
items: samba 文件修改后被增加了执行位

编译 浮点 选项
type: item
date: 2020-12-31T17:37:00+08:00
description: 参考： https://blog.csdn.net/hunanchenxingyu/article/details/47003279

shell 脚本 学习笔记
type: item
date: 2020-12-31T17:21:00+08:00
description: 1. shell 单行注释使用 “#” 就可以了，多行注释： :<<EOF EOF 这个 EOF 可以换成其他，都可以，只要上下能够对应就可以。 参考：https://blog.csdn.net/lansesl2008/article/details/20558369 https://blog.csdn.net/tenfyguo/article/details/5753548 2. 检查文件是否存在： if [ -f trials ]; then rm trials fi 参考： https://www.jb51.net/article/186273.htm 3. 退出脚本 exit 1 参考: https://blog.csdn.net/qq_35769944/article/details/81943543 4. 变量养成使用 {} 包起来的习惯 参考: https://www.runoob.com/linux/linux-shell-variable.html 5. 需要 python 脚本的时候，直接使用即可。 python3 test.py 参考： https://blog.csdn.net/zwt0909/article/details/52368559 6. -eq 更多用于数值的比较，字符串比较使用 == 参考： https://www.jb51.net/article/56559.htm 7. 与逻辑： && 或者 -a，或逻辑: || 或者 -o 参考: https://blog.csdn.net/iamlihongwei/article/details/59114828 https://www.cnblogs.com/aaronLinux/p/8340281.html 8. 判断命令行参数缺失 if [ -z $1 ];then echo "You should input one parameter" fi 参考： https://blog.csdn.net/geoffreychan/article/details/77823505 9. ssh 远程执行命令 ssh需要直接用密码执行命令需要在本地安装 sshpass sudo apt install sshpass ip="192.168.1.2" user="xyz" pswd="123456" sshpass -p ${pswd} ssh ${user}@${ip} "cd /home ; ls" 在远程执行的命令需要用双引号包含起来，不同命令需要用分号隔开。 或者类似下面也可以 #!/bin/bash ssh user@remoteNode > /dev/null 2>&1 << remotessh cd /home touch abcdefg.txt exit remotessh echo done! << remotessh 和 remotessh 之间的内容在远程执行，别忘了用 exit 退出 ssh。重定向在于不显示远程输出。 参考： https://blog.csdn.net/jinking01/article/details/84386769 https://www.cnblogs.com/kaishirenshi/p/7921308.html 10. 自动输入密码 需要先安装 expect，然后使用 expect 命令 expect <<EXPECT_EOF spawn sudo smbpasswd -a xyz expect "New SMB password:" send "123456\r" expect "Retype new SMB password:" send "123456\r" expect eof EXPECT_EOF 或者： expect -c " spawn sudo smbpasswd -a xyz expect { \"New SMB password:\" {set timeout 300; send \"123456\r\";} \"Retype new SMB password:\" {send \"123456\r\"} } #expect eof" expect eof 是和 spawn 配对使用的。 在 bash 中直接用 expect，有两种用法，1. expect <<EXPECT_EOF EXPECT_EOF 这样配对使用； 2. expect -c " " 这样双引号之间使用。 {send "yes\r"; exp_continue;} 这样的用法，exp_continue 表示这个 expect 的 内容和 send 内容可以重复多次使用。 参考: https://www.cnbl…

lxde 分辨率太大，桌面显示不全
type: item
date: 2020-12-22T16:31:00+08:00
description: 今天碰到一个情况，分辨率太大，导致左下角的菜单显示不出来，无法调整分辨率。 cd /usr/share/applications sudo lxrandr 就可以运行分辨率设置的程序了。

alsaaudio period size 理解
type: item
date: 2020-12-15T14:19:00+08:00
description: 1. pcm 是 ADC 直接采集到的数据。 2. frame，帧，指的是对所有声道进行一次 ADC 转换得到数据。 3. frame size，指的是一帧 包含的字节数。 如果是单声道，8bit adc，那么就是 1 8 / 8 = 1. 如果是8声道，16bit adc，那么就是 8 16 / 8 = 16. 4. rate 采样率，一秒对所有通道进行多少轮的采样，也就是一秒多少帧 5. data rate，这个就是 采样率 * 每帧字节数 6. period，每次处理 AD，DA 转换的间隔是周期。 内核可以缓冲很多周期的数据，每个周期都会生成一个中断和一个副本，用户层可以间隔很长时间再处理一次，一次可以处理多个周期的数据。 7. period size 这个数值指的是一个周期包含多少帧。 如果设置为 32，那么用户每次读写都是 32帧数据，或者0帧数据。 参考： https://larsimmisch.github.io/pyalsaaudio/terminology.html

messagequeue
type: item
date: 2020-12-14T11:34:00+08:00
description: python 中 需要使用 messagequeue 需要 import posix_ipc，然后才能用。 python 版本的 messagequeue 是对 C 版本的封装。 具体参考： http://semanchuk.com/philip/posix_ipc/#message_queue

git 换行符
type: item
date: 2020-12-14T11:24:00+08:00
description: linux 系统上配置 .gitconfig [core] autocrlf = input safecrlf = warn 配置为提交时转为 lf，下拉时不转换。如果文件时混合换行符时，进行警告。 参考：https://www.jianshu.com/p/6ef90ce18ba2 https://blog.csdn.net/whsdu929/article/details/52490188 http://kuanghy.github.io/2017/03/19/git-lf-or-crlf http://kuanghy.github.io/2017/03/19/git-lf-or-crlf

100ask 韦东山 驱动大全 子系统 v4l2 学习笔记
type: item
date: 2020-12-13T13:45:00+08:00
description: 总结 数据采集流程 设置好长宽之后，摄像头可能不支持，需要检查长宽参数是否被修改。 app 根据自身处理能力的快慢，指定申请的 buffer 数量。 一般使用链表的形式来组织 buffer，app 从 out 链表中拿数据，拿完之后，放入 in 链表；驱动从 in 链表中拿到 buffer，然后填充数据，再放到 out 链表中去。 app 开发 关键结构体: v4l2_fmtdesc format enumeration v4l2_format stream data format ioctl 中常用的 id 是: VIDIOC_QUERYCTRL 查找参数 VIDIOC_G_CTRL 获取当前参数 VIDIOC_S_CTRL 设置当前参数 对于 VideoControl interface 内部，有多个 unit。 unit 自身只能多个输入，单个输出。 unit之间，只能单个 unit 输出给多个 unit. VideoControl interface 内部有 CT(camera terminal), IT(input terminal), OT(out terminal), SU(selector unit), PU(processing unit), EU(encoding unit), XU(extension unit) VideoStreaming interface 是 USB 相关 如果自己做摄像头，想要增加额外功能，那就需要用到 XU，并且还需要添加 mapping，指定具体哪些位是哪些功能。 app 帧细节 格式枚举(yuv 还是其他)，用 VIDIOC_ENUM_FMT; 帧枚举(分辨率之类)用 VIDIOC_ENUM_FRAMESIZES, 都需要让相应的 index 增加来通过 ioctl 枚举。 app 获取数据 检查设备能力 struct v4l2_capability cap; memset(&cap, 0, sizeof(struct v4l2_capability)); if (0 == ioctl(fd, VIDIOC_QUERYCAP, &cap)) { if((cap.capabilities & V4L2_CAP_VIDEO_CAPTURE) == 0) { 枚举格式和帧VIDIOC_ENUM_FMT VIDIOC_ENUM_FRAMESIZES 设置格式 struct v4l2_format fmt; memset(&fmt, 0, sizeof(struct v4l2_format)); fmt.type = V4L2_BUF_TYPE_VIDEO_CAPTURE; fmt.fmt.pix.width = 1024; fmt.fmt.pix.height = 768; fmt.fmt.pix.pixelformat = V4L2_PIX_FMT_MJPEG; fmt.fmt.pix.field = V4L2_FIELD_ANY; if (0 == ioctl(fd, VIDIOC_S_FMT, &fmt)) 申请buffer 并 mmap struct v4l2_requestbuffers rb; memset(&rb, 0, sizeof(struct v4l2_requestbuffers)); rb.count = 32; rb.type = V4L2_BUF_TYPE_VIDEO_CAPTURE; rb.memory = V4L2_MEMORY_MMAP; if (0 == ioctl(fd, VIDIOC_REQBUFS, &rb)) { /* 申请成功后, mmap这些buffer */ buf_cnt = rb.count; for(i = 0; i < rb.count; i++) { struct v4l2_buffer buf; memset(&buf, 0, sizeof(struct v4l2_buffer)); buf.index = i; buf.type = V4L2_BUF_TYPE_VIDEO_CAPTURE; buf.memory = V4L2_MEMORY_MMAP; if (0 == ioctl(fd, VIDIOC_QUERYBUF, &buf)) { /* mmap */ bufs[i] = mmap(0 /* start anywhere */ , buf.length, PROT_READ | PROT_WRITE, MAP_SHARED, fd, buf.m.offset); if(bufs[i] == MAP_FAILED) { perror("Unable to map buffer"); return -1; } } …

python 从多声道 pcm 文件中 转换成单通道 pcm 文件
type: item
date: 2020-12-11T18:24:00+08:00
description: 1. 从 二进制 pcm 文件中读取数据，并转化位想要的矩阵数组 with open(audioPath, 'rb') as f: audioData = np.fromfile(f, dtype = np.uint16) audioData.shape = -1, 8 转换的音频数据是 不确定行，8列数组。 2. 把矩阵转置，以单声道数据为行。 audioData = audioData.T 转换为 8行的二维数组，每一行就是一个声道的数据。 3. 抽取一个通道的数据。 ch1 = audioData[4] 4. 把这个通道的数据写入二进制文件 ch1.tofile("./audio/ch1.pcm") 参考： https://blog.51cto.com/feature09/2316652 https://blog.csdn.net/Tourior/article/details/110791039 https://blog.csdn.net/kebu12345678/article/details/54837245 https://numpy.org/doc/stable/reference/generated/numpy.fromfile.html#:~:text=numpy.fromfile.%20%C2%B6.%20numpy.fromfile%28file%2C%20dtype%3Dfloat%2C%20count%3D-1%2C%20sep%3D%27%27%2C%20offset%3D0%29%20%C2%B6.,tofile%20method%20can%20be%20read%20using%20this%20function. https://www.cnblogs.com/peixu/p/7991715.html https://blog.csdn.net/botao_li/article/details/104378469 https://www.cnblogs.com/noluye/p/11224137.html

ubuntu emacs 切换中文输入法
type: item
date: 2020-12-11T13:43:00+08:00
description: 两种方法： 1. 启动的时候，使用命令启动 LC_CTYPE=zh_CN.UTF-8 emacs $@ 2. 设置 bashrc LC_CTYPE = zh_CN.utf8 或者 UTF-8 参考： https://www.douban.com/group/topic/29718313/

samba 文件修改后被增加了执行位
type: item
date: 2020-12-08T16:06:00+08:00
description: samba 共享的文件，被修改后，会被增加执行位。 要保留原来的属性，只需要修改 /etc/samba/smb.conf [global] ...... map archive = no 参考： https://stackoverflow.com/questions/20958888/preserving-file-permissions-for-samba-shares-when-file-is-edited https://en.wikipedia.org/wiki/Archive_bit https://www.linuxquestions.org/questions/linux-server-73/samba-adds-execute-flag-to-all-new-files-783263/ https://www.samba.org/samba/docs/using_samba/ch08.html