C++ C    2020-05-18 19:35:13    11    0    0

在 C 里面,可以用 typedef 来为一个已有的数据类型增加一个新的别名。比如:

  1. typedef int Length;

这种简单的形式,大家都能理解。可是遇到下面这种形式,不少人就傻眼了。比如:

  1. typedef int (*PFI)(int, const char *);

难道是把 int 数据类型定义成了 (*PFI)(int, const char *) 的数据类型,可是哪有这样的数据类型啊。即使被别人告知这是定义了一种函数指针类型,但却怎么也无法和 typedef int Length 这种形式关联起来,不是应该有一种已有的数据类型,一种新的数据类型吗?可是它们在哪呢?

我们把上面的表达式稍做改变,疑惑就解开了,如下:

  1. typedef int (int, const char *) * PFI;
  2. ~~~~~~~~~~~~~~~~~~~~~~~~~~ ~~~
  3. 原来的数据类型 别名

或者:

  1. typedef int (int, const char *) *PFI;
  2. ~~~~~~~~~~~~~~~~~~~~~~~ ~~~~
  3. 原来的数据类型 别名

所以,这个表达式是定义了类型为 PFI 的函数指针类型,指向的函数,返回值是 int 型,形参是 intconst char *。所以,它的使用就很好理解了,指向一种函数类型(返回值和参数列表形式相匹配)的指针,比如:

  1. //测试代码,所以没有写得很严谨
  2. int str_chr(int index, const char *s)
  3. {
  4. return s[index];
  5. }
  6. PFI funp = str_chr;
  7. //对于函数指针,这里也直接写成 PFI funp = &str_chr; 这种写法很少用
  8. int ret = funp(5, "baurine");
  9. //对于函数指针,也可以直接写成 int ret = (*funp)(5, "test");

也可以不将 PFI 定义成函数指针类型,而是直接定义成函数类型,如下:

Router ROS    2020-04-22 20:43:54    364    0    0
家里有一台做路由的虚拟服务器,拉的是联通的100M光纤,有时候玩游戏的时候突然掉线,经过查看路由(MikroTik RouterOS 6.38.5)日志发现每天差不多15:25分左右都有如下日志: ```log 15:26:16 pppoe,ppp,info pppoe-out1: terminating... 15:26:16 pppoe,ppp,info pppoe-out1: discon
pandoc    2019-11-19 13:55:53    53    0    0

使用 Pandoc 将 Markdown 转化成 PDF 常见的流程是利用 xelatex 直接生成 PDF。这要求安装 Latex 的大部分功能以及各种宏包,也不能像 Latex 那样自由的控制格式,生成的速度也很慢。更关键的是容易出现各种莫名奇妙的问题。

于是就想了个另外生成 PDF 的办法,即利用 Pandoc 先将 Markdown 转成 Html,再利用浏览器的打印功能打印出 PDF,虽然多了一个步骤,但会少很多问题,不用那么折腾,正所谓遥程路反近,捷径常误人。

利用 xelatex 直接生成 PDF

如果使用 Pandoc 直接生成 PDF,则需要安装 latex,如果文档中含有中文,则需要 latex 套件中的 xelatex 外加改模板,如果需要代码块高亮,需要改模板,如果代码块需要添加行号,需要改模板,如果需要行内代码也有背景色,还是需要改模板,想给引用部分也加上背景色,还是需要改模板。

行内加背景色的这个功能,按照网上的操作改了模板也没有效果,这就是前面说的莫名其妙的问题,但在别人那里应该是有效的。

在 Pandoc 自带模板 eisvogel 的基础上改了一版,添加了上述的各种功能(如代码块高亮、行号等),这是下载地址,开箱即用。

将模板文件放到和 Markdonw 文件同一文件夹下或者 ~/.pandoc/templates 下,将模板中的字体改成你希望使用的字体:

  1. % 434 行附近
  2. \setCJKmainfont{SimSun} % 设置中文字型
  3. \setmainfont{Times New Roman} % 设置英文字型

然后执行以下命令,就可生成 PDF:

  1. pandoc --latex-engine=xelatex --template=eisvogel --listings input.md -o output.pdf

先转成 Html

使用以下命令将 Markdown 文档转成 Html 文件:

  1. pandoc -s input.md -o output.html

然后编辑 html 文档的 <head> 标签,添加需要的 jscss,就可以随意地控

分散加载 ARM    2019-09-10 13:46:10    46    0    0

官网资料

分散加载文件是 sct 格式文件。

格式
1. 每个加载域的加载地址和最大尺寸
2. 每个加载域的属性
3. 从每个加载域派生的执行域
4. 每个执行域的执行地址和最大尺寸
5. 每个执行域的输入节

特点
1. 编译后输出的映像文件中各断是首位相连,中间没有空闲的区域。
2. scatter file 用于将编译后的映像文件中的特定段加载到多个分散的指定内存区域
3. 有两类域:执行域加载域,从哪里取址,哪里就是执行域
4. 加载域:就是编译之后得到的二进制文件烧写到rom中的这一段区域,所有的代码r0,预定义变量rw,堆栈之类和清不清空无关紧要的大片内存区域Zi,都在这其中
5. 执行域:把加载域进行解压缩后的样子。例如:RO没有变动还是在ROM中,RW被移动到了SRAM中,而ZI被放置在SDRAM中。
6. scatter file 本身并不能对映像实现“解压缩”,编译器读入 scatter 文件后会根据其中的各种地址生成启动代码了,实现对映像的加载,而这一段代码是 *(inRoot&&Sections) 它是 __main() 的一部分。这就是在汇编启动代码最后跳转到__main()而不是 main() 的原因。
7. 起始地址与加载域重合的执行域称为 root region , *(inRoot&&Sections) 必须放在这个执行域中,否则连接的时候会报错。*(+RO) 包含了 *(inRoot&&Sections),所以如果在 root region 中用到了 *(+RO) 可以不再指定 *(InRoot&&Sections)
8. 程序正确编译生成目标文件后,就会连接成可执行的文件,在这个过程中,要用到分散加载文件,它决定可执行代码在存储器中存放的位置。

  1. LR_IROM1 0x00000000 0x00002000  {   ; 定义载入区域LR_IROM1的起始地址为0x00000000, 大小为0x2000
  2. ER_IROM1  +0 0x00020000 { ;执行域ER_IROM1的起始地址紧接载于区域LR_IROM1的起始地址,即为0x00000000, 大小为0x
zerotier    2019-09-05 15:37:05    42    0    0

Moon 服务器

生成及修改json

  1. cd /var/lib/zerotier-one
  2. zerotier-idtool initmoon identity.public >>moon.json

经过此步,生成moon.json文件。vi编辑moon.json,修改 “stableEndpoints” 为机器 A 的公网的ip,以ipv4为例:

  1. "stableEndpoints": [ "1.2.3.4/9993","2408::1/9993"]

另外,记录下json中的id值。

生成签名文件

  1. zerotier-idtool genmoon moon.json

执行之后生成000000xxxx.moon文件,备用。

在安装目录下(/var/lib/zerotier-one)建立文件夹 moons.d,将上一步生成的 .moon 文件拷贝进去。

重启zerotier,重启电脑。至此,moon服务器配置完成。

Moon 客户端

连接moon节点

前面步骤里记录了moon.json中的id值:deadbeef00
在客户端机器执行:

  1. zerotier-cli orbit deadbeef00 deadbeef00

测试

  1. zerotier-cli listpeers

如果有moon服务器ip地址的那一行后面有moon字样,证明 moon 已被本机标识。

嵌入式    2019-09-04 20:19:44    30    0    0

IAR 中的分散加载为 .icf 文件,在工程目录的 config 文件夹下。

  1. /*###ICF### Section handled by ICF editor, don't touch! ****/
  2. /*-Editor annotation file-*/
  3. /* IcfEditorFile="$TOOLKIT_DIR$\config\ide\IcfEditor\cortex_v1_0.xml" */
  4. /*-Specials-*/
  5. define symbol __ICFEDIT_intvec_start__ = 0x08000000;
  6. /*-Memory Regions-*/
  7. define symbol __ICFEDIT_region_ROM_start__ = 0x08000000;
  8. define symbol __ICFEDIT_region_ROM_end__ = 0x080FFFFF;
  9. define symbol __ICFEDIT_region_RAM_start__ = 0x20000000;
  10. define symbol __ICFEDIT_region_RAM_end__ = 0x20020000;
  11. /*-Sizes-*/
  12. define symbol __ICFEDIT_size_cstack__ = 0x400;
  13. define symbol __ICFEDIT_size_heap__ = 0x200;
  14. /**** End of ICF editor section. ###ICF###*/
  15. define memory mem with size = 4G; /* 定义一个内存 */
  16. /* 定义两个域 */
  17. define region ROM_region = mem:[from __ICFEDIT_region_ROM_start__ to __ICFEDIT_region_ROM_end__];
  18. define region RAM_region = mem:[from __ICFEDIT_region_RAM_start__ to __ICFEDIT_region_RAM_end__];
  19. /* 添加额外的域 */
  20. define r
Nas    2019-09-04 13:51:34    41    0    0

U盘引导修改方法

一、开启SSH端口。

在控制面板里面——>终端机和SNMP ,启动SSH功能打勾,并设置端口(建议别用22,改用其他的,比如220或者其他都行)。

二、挂载 synoboot1 分区。

第一步:用 ssh 工具如 xshell 连接到群晖的地址,用创建群晖的管理用户登陆。

第二步:获取root权限。(如果这一步失败,请按照教程开启root权限,6.17及以下版本看这里,6.2及以上版本看这里。)

  1. sudo -i

回车后会提示输入密码,即再次输入当前管理账号的密码。

成功后会变成 root@Sxxx:~#

第三步:将 /dev/synoboot1 分区挂载到 /mnt

  1. mount -t vfat /dev/synoboot1 /mnt

第四步:切换到 /mnt 目录:cd /mnt

可以看到挂载后有 bzImage EFI grub info.txt 等文件夹或文件(主机或版本不同时,文件夹、文件名有所差别,但肯定有grub文件夹),至此挂载成功。

第五步:切换到 grub 目录,修改 grub.cfg 文件

  1. cd grub
  2. vi grub.cfg

修改新的SNMAC1的新值,如果多网卡,还有 mac2, mac3 等。

保存并退出。

此时可以再 vi grub.cfg 进去看看是否修改成功。

最后重启主机。

二合一修改方法

和用U盘引导类似,不过是 mount /dev/sda[1..5] /mnt ([1..5] 表示 1--5 中的一个)。

Linux DNS    2019-08-29 15:14:58    50    0    0

Dnsmasq 首先会查找 /etc/hosts 文件,如果没有查找到,会查询本地 DNS 缓存记录,如果还是未找到对应的记录,则会将请求装发到 /etc/resolv.conf 文件中定义的上游 DNS 服务器中,从而实现对域名的解析。

默认情况下,Dnsmasq 会从 /etc/dnsmasq.conf 读取配置项,我们也可以使用 -C 的启动参数来指定配置文件。下面介绍一下常用的 DNS 和 DHCP 服务的配置参数。

通用配置项

  1. # 服务运行的网卡,如果有多个话,可在再次添加一条记录
  2. interface=eth1
  3. interface=wlan0
  4. # 指定服务不在以下网卡上运行
  5. except-interface=eth0
  6. # 指定监听的 IP 地址,多个 IP 地址可用 `,` 分割(默认是监听所有网卡)
  7. listen-address=192.168.8.132
  8. # 开启日志选项,记录在 /var/log/debug 中
  9. log-queries
  10. # 指定日志文件的路径,路径必须存在,否则会导致服务启动失败
  11. log-facility=/var/log/dnsmasq.log
  12. # 异步log,缓解阻塞。
  13. log-async=20

DNS 服务配置参数

  1. # 指定 DNS 服务的端口(默认53),设置为 0 表示关闭 DNS 服务,只使用 DHCP 服务
  2. port=53
  3. # 指定一个 hosts 文件,默认是从 /etc/hosts 中获取
  4. addn-hosts=/etc/banner_add_hosts
  5. # 表示不使用 /etc/hosts 配置文件来解析域名
  6. no-hosts
  7. # 指定上游 DNS 服务列表的配置文件,默认是从 /etc/resolv.conf 中获取
  8. resolv-file=/etc/dnsmasq.d/upstream_dns.conf
  9. # 表示严格按照上游 DNS 服务列表一个一个查询,否则将请求发送到所有 DNS 服务器,使用响应最快的服务器的结果
  10. strict-order
  11. # 不使用上游 DNS 服务器的配置文件 /etc/resolv.conf 或者 resolv-file 选项
  12. no-resolv
  13. # 不允许 Dnsmasq 通过轮询 /e
Latex    2018-01-11 17:45:23    29    0    0

baseline 是什么

TeX 中的每个字符都放在一个 box 里。每个 box 有 base (参考点)、width(宽度)、height(高度)、depth(深度),其中 height + depth = totalheigth (总高)。

若干字符的 box 组成一个词的 box ,同样这个 box 也有这样几个参数。TeX 断行之后,会把这一行的所有盒子的 base 连接起来,以保证改行的内容在一个基准线上,连接成的线段就是 baseline.

如图所示:
baseline 示意图

LaTeX 的行距机制

每一行都有一条 baseline, 同一段落中相邻两行之间的 baseline 的间距称为行距 (linespace). 一般来说,最终决定两条 baseline 之间的 linespace 距离的,是 LaTeX 的宏 \baselineskip 之中。也就是说,这个长度值,将会是一般情况下的两条 baseline 之间的距离,也就是我们最终的行距。

显然行距应当随着字号的大小变化;若不然,则对于给定的行距数值,较大字号的内容部分显得拥挤不堪。LaTeX 中的字号存储在内部宏 \f@size 之中,而内部宏 \f@baselineskip 则记录了行距中和字号相关的部分。这个宏当中,它的单位和字号的单位一样,都是 pt ( 1pt = 1/72.27 inch ). LaTeX 的默认情况下,\f@baselineskip 的值是当前 \f@size 的 1.2 倍——例如,当 \f@size 为 10pt 时,\f@baselineskip 的值为 12pt.

为了统一对不同字号的内容进行行距的调整,引入了因子的概念,这是一个数值(而不是长度),储存在 \f@linespread 这个宏里面。这是一个与字号无关的值,在 article 文档类中它默认是 1, 在 ctexart 中默认是 1.3. 通常我们修改行距,都是修改这个因子,而不动前段叙述的基础行距。因此就有必要将因子存储在一个外部宏(没有 @ 的宏)之中,它是 \baselinestretch. 于是我们可以大致地认为,\f@linespread 和 \baselinestr

生活    2018-01-11 17:42:36    24    0    0

怎样快速有效地分辨出值得追和果断弃的日剧?

日本有五大电视台:日本放送协会(NHK),富士电视台(CX),东京放送电视台(TBS),日本电视台(NTV),朝日电视台(EX)。

日本放送协会(NHK)

先来说说NHK,它的性质相当于我们的央视。NHK,只有两种剧值得追

  • 晨间剧,周一到周六早上8:15播出,比如《海女》
  • 是大河剧,周日晚间19:00播出,比如《真田丸》

大河剧是以历史人物或一个时代为主题,来反映出其所处时代的变迁的电视剧。
大河剧一般都带着浓重的战争色彩。
大河剧考证比较严谨,如果你不想看枯燥的史书,又想了解一下日本历史,可以看这种剧。

富士电视台(CX)

CX,月九和木十最牛逼

  • 月九剧,简单地说,就是周一晚上21:00播的剧,相当于天朝的黄金强档,演员阵容强大,剧集制作精良。以爱情题材为主打,追求纯纯的爱
  • 火九剧也曾如日中天,无奈遭废除
  • 木十剧,直面惨淡的人生,正视淋漓的鲜血。在题材上喜欢反映社会现实,比如讲女性出轨的《昼颜》,长泽雅美主演的《Last Friends》

富士台播出的月九剧,有很多美妙的纯爱故事;富士台播出的木十剧,有很多根植于现实的复杂故事。

东京放送电视台(TBS)

TBS,收视不稳定,剧本有新意

  • 金十剧,周五晚22:00播出:这是一个神奇的档期,有时候收视率奇高无比,有时候收视率低到谷底,跟股市一样惊心动魄,金十剧的题材新颖,不落俗套,很受年轻观众喜爱。比如《无间双龙》、《spec》
  • 日九剧,周日晚21:00播出:题材有政治、家族、职场、爱情等,质量普遍较高。比如《半泽直树》

日本电视台(NTV)

NTV,擅长女人戏和改编剧

  • 水十剧,周三晚22:00播出:水十剧多为女人戏,你可以看到各种各样的女性,在不同的故事里大放异彩。比如绫濑遥主演的《萤之光》
  • 土九剧,周六晚21:00播出:土九剧多为漫画、小说改编剧,因为观众的年龄较小,校园剧占比也很大。比如天海佑希主演的《女王的教室》、《掟上今日子的备忘录》

朝日电视台(EX)

EX,擅长医疗剧和刑警剧
比如《Doctor-x~外科医·大门未知子》