2018年11月

嵌入式、物联网技术交流分享

svnadmin 使用笔记

热拷贝备份 将整个库都热拷贝一份出来,包括库的钩子脚本、配置文件等,不包括事务文件(所以可能出现热拷贝后库占用空间变小的情况,是不影响正常使用的);任何时候运行这个脚本都得到一个版本库的安全拷贝,不管是否有其他进程正在使用版本库。热拷贝出来的库可以直接被 SVN 服务器使用,不需要转换。 可以全量备份也可以增量备份。 svnadmin hotcopy REPOS_PATH NEW_REPOS_PATH # --incremental 增量备份选项,只能用于 FSFS 格式的库 svnadmin hotcopy --incremental C:\Repositories\test C:\Backup\test dump 备份 可以全量备份也可以增量备份,可以指定备份的起止版本。 缺点是版本数过大时备份和恢复的时间比较长。 svnadmin dump REPOS_PATH [-r LOWER[:UPPER] [--incremental]] svnadmin dump C:\Repositories\test > backup.dump svnadmin dump C:\Repositories\test -r 100:200 --incremental > backup_100_200.dump svnadmin create new_repository svnadmin load new_repository < backup.dump 事务(txns [transactions]) SVN 客户端进程异常中止、网络异常等,可能导致文件提交的事务失败,生成的事务文件会继续占用磁盘,可以删除这些意外中止的事务以节省磁盘空间。 列出所有的事务: svnadmin lstxns REPOS_PATH 删除指定的事务: svnadmin rmtxns REPOS_PATH TXN_NAME1 TXN_NAME2 .....

cwRsync 客户端使用笔记

rsync 原本只能用在 Unix/Linux 系统,cwRsync 使用可以模拟 Linux API 的 Cygwin,以实现可以在 Windows 上运行的目的,网址为 https://www.itefix.net/cwrsync 。据说 cwRsync 4.1.0 是最后一个免费版本,不过网上可以下载到更高版本的客户端免费程序,可能收费的只是服务端吧。 服务端建在 Linux 服务器上,直接用 rsync 就可以,所以 Windows 上我只是用 cwRsync 客户端。 下载 cwRsync 5.4.1 https://www.cr173.com/soft/109506.html 解压缩后无需安装即可使用。 cwrsync.cmd 提供了批处理文件参考文件,可以不管它,我们要用的是 rsync 实例,从客户端同步到服务端: rsync -avz --no-owner --no-group --progress --delete --password-file=/cygdrive/C/rsync.pwd /cygdrive/C/Repositories rsync_usr@192.168.1.100::rd.svn 由于 Windows 中文件没有 uid 和 gid 的属性,传输时可能出现: uid 4294967295 (-1) is impossible to set on "/Repositories/Repositories/test2" (in rd.svn) 系统中没有值为 -1 的 uid。所以加上 --no-owner --no-group 从 -a 中排出 uid 和 gid 的属性。 --delete:删除服务器上源中已经不存在文件 --password-file:密码文件 password-file 的格式为一行明文的密码。 注意,路径格式为 unix 格式, /cygdrive/C/ 代表 C:\ 当源是一个目录时,带斜线(/)与不带斜线的处理是不同的。不带斜线时目录自身也会同步到目的(DEST)下。 即 rsync -a src_folder dest_folder,结果会有 dest_folder/src_folder。带斜线时目录自身不同...

字母解释法

可能你在打电话的时候怕对方没听清楚而讲过“123 的 1,ABC 的 C”。同样的道理,模拟无线电信号的接听相比于数字电话的接听要困难得多了。业余电台的电波传播因素复杂,接收到的语言信号失真或衰落现象严重,影响了解析和辨识。特别是 DX(Distant eXchange)通信时,有些非英语区口音不同,通话时容易发生许多误听差错,尤其是像 B 和 P、D 和 T、G 和 J、M、N、R 和 I 等字最容易听错。 为了避免这个问题的发生,全世界的电台在话音通信中均采用字母解释法,一般电台在谈到呼号、姓名或 QTH(设台地)时采用这种解释方法,以避免发生误会。国际民航组织(ICAO)的英语解释法,是美国 ARRL 推荐的读法,也是目前业余通信中采用的方法。 字母解释法正式称为国际无线电通话拼写字母,也叫做北约音标字母等。 助记图 发音与释义 字母 代码 音标 代码原意 A Alpha 美[ˈælfə] 首个希腊字母(α) B Bravo 美[ˌbrɑːˈvoʊ] 喝采声 C Charlie 美[ˈtʃɑːrli] 查理(男子名) D Delta 美[ˈdeltə] 第四个希腊字母(δ);三角洲 E Echo 美[ˈekoʊ] 回音 F Foxtrot 美[ˈfɑːkstrɑːt] 狐步舞 G Golf 美[ɡɑːlf] 高尔夫球 H Hotel 美[hoʊˈtel] 旅馆 I India 美[ˈɪndiə] 印度 J Juliet 美[ˈdʒuliˌɛt] 茱莉叶(女子名) K Kilo 美[ˈkiːloʊ] 千(公制单位的前缀) L Lima 美[ˈlaɪmə] 利马(秘鲁的首都) M Mike 美[maɪk] 麦克风 N November 美[noʊˈvembər] 11 月 O Oscar 美['ɑskər] 奥斯卡(奖) P Papa 美[ˈpɑːpə] 爸爸 Q Quebec 美[kwəˈbɛk] 魁北克(加拿大的一个省份) R Romeo 美[ˈroʊmioʊ] 罗密欧(男子名) S Sierra 美[siˈerə] 山脉 T Tango 美[ˈtæŋɡoʊ] 探戈舞 U Uniform 美[ˈjuːnɪfɔːrm] 制服 V Victor 美[ˈvɪktər] 胜利者 W Whiskey 美[ˈwɪski] 威士忌酒 X X-ray 美[ˈeks reɪ] X 光 Y Yankee 美[ˈjæŋki] 美国佬 Z Zulu 美[ˈzuːluː] 祖鲁(一个分布于非洲南部的民族) ...

摩尔斯电码

简介 摩尔斯电码(Morse Code)是一种时通时断的信号代码,通过不同的排列顺序来表达不同的英文字母、数字和标点符号。是由美国人艾尔菲德·维尔与萨缪尔·摩尔斯在 1836 年发明。 摩尔斯电码是一种早期的数字化通信形式,但是它不同于现代只使用 0 和 1 两种状态的二进制代码,它的代码包括五种: 点(·):1 划(-):111 字符内部停顿(在字符内的那些点和划之间):0 短停顿(在字符之间):000 中等停顿(在单词之间):0000000 这种代码可以用一种音调平稳时断时续的无线电信号来传送,通常被称做“连续波”(Continuous Wave),缩写为 CW 字母与数字的编码 用二叉树表示的国际摩尔斯电码 图中每一分叉的左支为点(·),右支为划(-),直到到达所需要表示的字符为止: 特殊符号 这是一些有特殊意义的点划组合。它们由二个或多个字母的摩尔斯电码连成一个使用,这样可以省去正常时把它们做为两个字母发送所必须的中间间隔时间...

Ubuntu 下载内核源码

方法 1 uname -r apt-cache search linux-source //搜索内核版本 sudo apt-get install linux-source-4.15.0 会将内核源码包下载到 /usr/src 方法 2 apt-get source linux-image-$(uname -r) 可以下载到当前目录 我的测试结果是获取不到内核源码(源的配置没有问题)。 方法 3 git clone git://kernel.ubuntu.com/ubuntu/ubuntu-<release>.git git clone git://kernel.ubuntu.com/ubuntu/ubuntu-xenial.git (16.04) git tag -l Ubuntu-* 下载的源码很大,速度很慢(git 浅克隆可以解决太大的问题)。 安装编译内核可能依赖的库或工具 sudo apt-get install libncurses5-dev libssl-dev sudo apt-get install build-essential openssl sudo apt-get install zlibc minizip sudo apt-get install libidn11-dev libidn11 编译 #sudo make mrproper sudo make menuconfig sudo make -j4 安装内核 sudo make modules_install #安装内核模块 sudo make install #安装内核 内核用户手册 man sudo apt-get install xmlto  make mandocs -j4 #编译用户手册 sudo make installmandocs man print...

Makefile 简介

make 命令 作用是读入一个名为 Makefile 的文件,然后执行这个文件中指定的指令。 Makefile Makefile 告诉 make 怎样执行一系列的指令去依靠源文件生成一个目标文件。Makefile 中声明了一个依赖关系的列表,这个列表应当包含所有文件(无论是源文件或者目标)作为输入 。 Makefile 文件一般命名为 Makefile 或 makefile ,如果 m 小写有时候可能会出现错误。 $@ 表示当前目标文件的名字 $^ 表示用空格隔开的所有依赖文件 $< 表示第一个依赖文件 驱动的 Makefile 与一般应用程序的 Makefile 有所不同,驱动的 Makefile 要指定内核源代码的位置。 KDIR := /home/matt/linux-3.2.0-psp04.06.00.11 $(MAKE) -C $(KDIR) M=$(PWD) modules $(MAKE) 为自带的变量 -C $(KDIR) 指明跳转到内核源码目录下读取那里的 Makefile M=$(PWD) 表明然后返回到当前目录继续读入、执行当前的 Makefile 方便起见一般都会先定义编译器链接器: CC = gcc LD = gcc 正则表达式表示目录下所有 .c 文件,相当于:SRCS = main.c a.c b.c SRCS = $(wildcard *.c) OBJS 表示 SRCS 中把列表中的 .c 全部替换为 .o,相当于:OBJS = main.o a.o b.o OBJS = $(patsubst %c, %o, $(SRCS)) 可执行文件的名字: TARGET = Hello .PHONE 伪目标,具体含义百度一下一大堆介绍 .PHONY:all clean 要生成的目标文件: all: $(TARGET) 第一行依赖关系:冒号后面为依赖的文件,相当于 Hello: main.o a.o b.o 第二行规则:$@ 表示目标文件,$^ 表示所有依赖文件,$< 表示第一个依赖文件 $(TARGET): $(OBJS) $(LD) -o $@ $^ 上一句目标文件依赖一大堆 .o 文件,这句表示所有 .o 都由相应名字的 .c 文件自动生成 %o:%c $(CC) -c $^ make clean 删除所有 .o 和目标文件: clean: rm -f $(OBJS) $(TARGET) 注意:命令前必须以 tab 键开头,不能是...

Ubuntu 驱动开发简介

在 Ubuntu 上开发驱动通常并不需要下载内核的源码(不需要改内核源码的情况下),下载内核头文件就可以了。下载的头文件中自带内核的 Makefile 文件。 查询系统对应的内核头文件包: dpkg-query -s linux-headers-$(uname -r) 安装: sudo apt-get install linux-headers-$(uname -r) 内核头文件会被安装在 /usr/src 驱动的 Makefile 简例: obj-m := helloworld.o KDIR := /usr/src/linux-headers-4.15.0-36-generic PWD := $(shell pwd) all: modules modules: $(MAKE) -C $(KDIR) M=$(PWD) modules clean: rm -rf *.o *~ core .depend *.symvers .*.cmd *.ko *.mod.c .tmp_versions $(TARGET)...

64 位 Ubuntu 兼容 32 位程序

在 ubuntu 12.04 及之前的版本,如果需要在 64 位机上运行 32 位程序,可以直接安装 ia32-libs。 sudo apt-get install ia32-libs ubuntu 12.04 之后的版本不能直接安装 ia32-libs,已经没有该软件包。可以直接安装 gcc-multilib 解决问题。 sudo apt install gcc-multilib g++-multili...

Linux 内核打印 printk

内核中没有 C 库,所以不能使用 printf 打印。但它提供了类似的 printk 函数,printk 函数输出的字符串前加一个带尖括号的整数来控制打印级别,如 printk("<6>Hello, world!\n")。级别数值越小,优先级越高,其紧急和严重程度就越高。然而,需要注意的是,并不是所有级别的消息都会进行输出,而是根据 printk 的打印级别进行过滤。 printk 打印级别宏定义: #define KERN_EMERG KERN_SOH "0" /* system is unusable */ #define KERN_ALERT KERN_SOH "1" /* action must be taken immediately */ #define KERN_CRIT KERN_SOH "2" /* critical conditions */ #define KERN_ERR KERN_SOH "3" /* error conditions */ #define KERN_WARNING KERN_SOH "4" /* warning conditions */ #define KERN_NOTICE KERN_SOH "5" /* normal but significant condition */ #define KERN_INFO KERN_SOH "6" /* informational */ #define KERN_DEBUG KERN_SOH "7" /* debug-level messages */ #define KERN_DEFAULT KERN_SOH "d" /* the default kernel loglevel */ 内核日志打印级别查看: cat /proc/sys/kernel/printk 4 4 1 7 该文件包含四个数字值,分别表示: 控制台日志级别(Console log level):只有级别高于设定值的日志消息才会被显示在控制台上(值要小于该值)。 默认的消息日志级别(Default message log level):用于打印没有优先级的消息,即当 printk 没有指定消息级别时,将使用该默认级别。 最低的控制台日志级别(Minimum console log level):控制台日志级别可被设置的最小值,也就是最高的优先级。 默认的控制台日志级别(Default console log level):控制台日志级别的缺省值。 修改内核日志打印级别: echo "6 4 1 7" | sudo tee /proc/sys/kernel/printk 修改后的值重启后会恢复,如果要保持,可以将它添加到启动脚本中,以便在系统启动时重新设置。 printk 打印的是控制台,也就是 /dev/console。而图形界面中的终端,其实是把 stdin,stdout,stderr 三个文件重定向了一下。所以 printk 是不能在图形界面中的终端中显示的,当然可以在 /var/log/syslog 或者用 dmesg 查看。 不够打印级别的信息会被写到日志中可通过 dmesg 命令来查看。 dmesg 命令: 实时监控 dmesg 的日志输出: watch "dmesg | tail -20"...

Windows 安装 Python 3.7.1

安装的时候默认已经包含了 pip,另外还要选中将 Python 路径加到 PATH 变量中去。 安装完后自动在用户的Path变量中加入了两个路径: C:\Users\Matt\AppData\Local\Programs\Python\Python37-32\Scripts\ C:\Users\Matt\AppData\Local\Programs\Python\Python37-32\ 所以不必再手动添加环境变量了。 pip 被安装在了 Scripts 文件夹。 测试...