在 C 里面,可以用 typedef 来为一个已有的数据类型增加一个新的别名。比如:
typedef int Length;
这种简单的形式,大家都能理解。可是遇到下面这种形式,不少人就傻眼了。比如:
typedef int (*PFI)(int, const char *);
难道是把 int
数据类型定义成了 (*PFI)(int, const char *)
的数据类型,可是哪有这样的数据类型啊。即使被别人告知这是定义了一种函数指针类型,但却怎么也无法和 typedef int Length
这种形式关联起来,不是应该有一种已有的数据类型,一种新的数据类型吗?可是它们在哪呢?
我们把上面的表达式稍做改变,疑惑就解开了,如下:
typedef int (int, const char *) * PFI;
~~~~~~~~~~~~~~~~~~~~~~~~~~ ~~~
原来的数据类型 别名
或者:
typedef int (int, const char *) *PFI;
~~~~~~~~~~~~~~~~~~~~~~~ ~~~~
原来的数据类型 别名
所以,这个表达式是定义了类型为 PFI 的函数指针类型,指向的函数,返回值是 int
型,形参是 int
和 const char *
。所以,它的使用就很好理解了,指向一种函数类型(返回值和参数列表形式相匹配)的指针,比如:
//测试代码,所以没有写得很严谨
int str_chr(int index, const char *s)
{
return s[index];
}
PFI funp = str_chr;
//对于函数指针,这里也直接写成 PFI funp = &str_chr; 这种写法很少用
int ret = funp(5, "baurine");
//对于函数指针,也可以直接写成 int ret = (*funp)(5, "test");
也可以不将 PFI 定义成函数指针类型,而是直接定义成函数类型,如下:
使用 Pandoc 将 Markdown
转化成 PDF 常见的流程是利用 xelatex
直接生成 PDF。这要求安装 Latex 的大部分功能以及各种宏包,也不能像 Latex 那样自由的控制格式,生成的速度也很慢。更关键的是容易出现各种莫名奇妙的问题。
于是就想了个另外生成 PDF 的办法,即利用 Pandoc 先将 Markdown
转成 Html
,再利用浏览器的打印功能打印出 PDF,虽然多了一个步骤,但会少很多问题,不用那么折腾,正所谓遥程路反近,捷径常误人。
如果使用 Pandoc 直接生成 PDF,则需要安装 latex
,如果文档中含有中文,则需要 latex
套件中的 xelatex
外加改模板,如果需要代码块高亮,需要改模板,如果代码块需要添加行号,需要改模板,如果需要行内代码也有背景色,还是需要改模板,想给引用部分也加上背景色,还是需要改模板。
行内加背景色的这个功能,按照网上的操作改了模板也没有效果,这就是前面说的莫名其妙的问题,但在别人那里应该是有效的。
在 Pandoc 自带模板 eisvogel
的基础上改了一版,添加了上述的各种功能(如代码块高亮、行号等),这是下载地址,开箱即用。
将模板文件放到和 Markdonw 文件
同一文件夹下或者 ~/.pandoc/templates
下,将模板中的字体改成你希望使用的字体:
% 在 434 行附近
\setCJKmainfont{SimSun} % 设置中文字型
\setmainfont{Times New Roman} % 设置英文字型
然后执行以下命令,就可生成 PDF:
pandoc --latex-engine=xelatex --template=eisvogel --listings input.md -o output.pdf
使用以下命令将 Markdown 文档转成 Html 文件:
pandoc -s input.md -o output.html
然后编辑 html
文档的 <head>
标签,添加需要的 js
和 css
,就可以随意地控
分散加载文件是 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. 程序正确编译生成目标文件后,就会连接成可执行的文件,在这个过程中,要用到分散加载文件,它决定可执行代码在存储器中存放的位置。
LR_IROM1 0x00000000 0x00002000 { ; 定义载入区域LR_IROM1的起始地址为0x00000000, 大小为0x2000
ER_IROM1 +0 0x00020000 { ;执行域ER_IROM1的起始地址紧接载于区域LR_IROM1的起始地址,即为0x00000000, 大小为0x
cd /var/lib/zerotier-one
zerotier-idtool initmoon identity.public >>moon.json
经过此步,生成moon.json文件。vi编辑moon.json,修改 “stableEndpoints” 为机器 A 的公网的ip,以ipv4为例:
"stableEndpoints": [ "1.2.3.4/9993","2408::1/9993"]
另外,记录下json中的id值。
zerotier-idtool genmoon moon.json
执行之后生成000000xxxx.moon文件,备用。
在安装目录下(/var/lib/zerotier-one
)建立文件夹 moons.d
,将上一步生成的 .moon
文件拷贝进去。
重启zerotier,重启电脑。至此,moon服务器配置完成。
前面步骤里记录了moon.json中的id值:deadbeef00
。
在客户端机器执行:
zerotier-cli orbit deadbeef00 deadbeef00
zerotier-cli listpeers
如果有moon服务器ip地址的那一行后面有moon字样,证明 moon 已被本机标识。
IAR 中的分散加载为 .icf
文件,在工程目录的 config
文件夹下。
/*###ICF### Section handled by ICF editor, don't touch! ****/
/*-Editor annotation file-*/
/* IcfEditorFile="$TOOLKIT_DIR$\config\ide\IcfEditor\cortex_v1_0.xml" */
/*-Specials-*/
define symbol __ICFEDIT_intvec_start__ = 0x08000000;
/*-Memory Regions-*/
define symbol __ICFEDIT_region_ROM_start__ = 0x08000000;
define symbol __ICFEDIT_region_ROM_end__ = 0x080FFFFF;
define symbol __ICFEDIT_region_RAM_start__ = 0x20000000;
define symbol __ICFEDIT_region_RAM_end__ = 0x20020000;
/*-Sizes-*/
define symbol __ICFEDIT_size_cstack__ = 0x400;
define symbol __ICFEDIT_size_heap__ = 0x200;
/**** End of ICF editor section. ###ICF###*/
define memory mem with size = 4G; /* 定义一个内存 */
/* 定义两个域 */
define region ROM_region = mem:[from __ICFEDIT_region_ROM_start__ to __ICFEDIT_region_ROM_end__];
define region RAM_region = mem:[from __ICFEDIT_region_RAM_start__ to __ICFEDIT_region_RAM_end__];
/* 添加额外的域 */
define r
一、开启SSH端口。
在控制面板里面——>终端机和SNMP ,启动SSH功能打勾,并设置端口(建议别用22,改用其他的,比如220或者其他都行)。
二、挂载 synoboot1
分区。
第一步:用 ssh
工具如 xshell
连接到群晖的地址,用创建群晖的管理用户登陆。
第二步:获取root权限。(如果这一步失败,请按照教程开启root权限,6.17及以下版本看这里,6.2及以上版本看这里。)
sudo -i
回车后会提示输入密码,即再次输入当前管理账号的密码。
成功后会变成 root@Sxxx:~#
。
第三步:将 /dev/synoboot1
分区挂载到 /mnt
mount -t vfat /dev/synoboot1 /mnt
第四步:切换到 /mnt
目录:cd /mnt
可以看到挂载后有 bzImage EFI grub info.txt
等文件夹或文件(主机或版本不同时,文件夹、文件名有所差别,但肯定有grub
文件夹),至此挂载成功。
第五步:切换到 grub
目录,修改 grub.cfg
文件
cd grub
vi grub.cfg
修改新的SN
,MAC1
的新值,如果多网卡,还有 mac2
, mac3
等。
保存并退出。
此时可以再 vi grub.cfg
进去看看是否修改成功。
最后重启主机。
和用U盘引导类似,不过是 mount /dev/sda[1..5] /mnt
([1..5] 表示 1--5 中的一个)。
Dnsmasq 首先会查找 /etc/hosts 文件,如果没有查找到,会查询本地 DNS 缓存记录,如果还是未找到对应的记录,则会将请求装发到 /etc/resolv.conf 文件中定义的上游 DNS 服务器中,从而实现对域名的解析。
默认情况下,Dnsmasq 会从 /etc/dnsmasq.conf 读取配置项,我们也可以使用 -C 的启动参数来指定配置文件。下面介绍一下常用的 DNS 和 DHCP 服务的配置参数。
# 服务运行的网卡,如果有多个话,可在再次添加一条记录
interface=eth1
interface=wlan0
# 指定服务不在以下网卡上运行
except-interface=eth0
# 指定监听的 IP 地址,多个 IP 地址可用 `,` 分割(默认是监听所有网卡)
listen-address=192.168.8.132
# 开启日志选项,记录在 /var/log/debug 中
log-queries
# 指定日志文件的路径,路径必须存在,否则会导致服务启动失败
log-facility=/var/log/dnsmasq.log
# 异步log,缓解阻塞。
log-async=20
# 指定 DNS 服务的端口(默认53),设置为 0 表示关闭 DNS 服务,只使用 DHCP 服务
port=53
# 指定一个 hosts 文件,默认是从 /etc/hosts 中获取
addn-hosts=/etc/banner_add_hosts
# 表示不使用 /etc/hosts 配置文件来解析域名
no-hosts
# 指定上游 DNS 服务列表的配置文件,默认是从 /etc/resolv.conf 中获取
resolv-file=/etc/dnsmasq.d/upstream_dns.conf
# 表示严格按照上游 DNS 服务列表一个一个查询,否则将请求发送到所有 DNS 服务器,使用响应最快的服务器的结果
strict-order
# 不使用上游 DNS 服务器的配置文件 /etc/resolv.conf 或者 resolv-file 选项
no-resolv
# 不允许 Dnsmasq 通过轮询 /e
TeX 中的每个字符都放在一个 box 里。每个 box 有 base (参考点)、width(宽度)、height(高度)、depth(深度),其中 height + depth = totalheigth (总高)。
若干字符的 box 组成一个词的 box ,同样这个 box 也有这样几个参数。TeX 断行之后,会把这一行的所有盒子的 base 连接起来,以保证改行的内容在一个基准线上,连接成的线段就是 baseline.
如图所示:
每一行都有一条 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
日本有五大电视台:日本放送协会(NHK),富士电视台(CX),东京放送电视台(TBS),日本电视台(NTV),朝日电视台(EX)。
先来说说NHK,它的性质相当于我们的央视。NHK,只有两种剧值得追
大河剧是以历史人物或一个时代为主题,来反映出其所处时代的变迁的电视剧。
大河剧一般都带着浓重的战争色彩。
大河剧考证比较严谨,如果你不想看枯燥的史书,又想了解一下日本历史,可以看这种剧。
CX,月九和木十最牛逼
富士台播出的月九剧,有很多美妙的纯爱故事;富士台播出的木十剧,有很多根植于现实的复杂故事。
TBS,收视不稳定,剧本有新意
NTV,擅长女人戏和改编剧
EX,擅长医疗剧和刑警剧
比如《Doctor-x~外科医·大门未知子》