人体解剖与生理学填空题(二)

  • 凝血过程的三个基本步骤凝血酶原激活物的形成凝血酶原转变为凝血酶纤维蛋白原转化为纤维蛋白,都需要钙离子的参与。
  • 纤溶系统包括四种成分:纤溶酶纤溶酶原激活物抑制物
  • 盐析法可将血浆蛋白分成白蛋白球蛋白纤维蛋白原,其中含量最多的是白蛋白,它是构成血浆胶体渗透压的主要部分;球蛋白是防御功能的重要组成部分;纤维蛋白原参与凝血。
  • 血液循环的主要功能是物质运输完成体液调节维持稳态与血液防御功能
  • 在心动周期中,心室中血液的充盈主要是由心室舒张完成,心房收缩只起辅助作用。
  • Starling机制表明,在一定范围内的每搏输出量随心室舒张末容积增多而增大
  • 左心室前负荷是左心室舒张末期压力;后负荷是主动脉压
  • 心脏自律细胞主要包括P细胞浦肯野细胞
  • 心室肌细胞动作电位复极1期,其一过性外流离子流的主要成分是钾离子
  • 心室肌细胞动作电位平台期外向电流是由钾离子携带的,内向电流主要是由钙离子负载的。
  • 自律细胞4期自动除极化的两方面原因是外流电流逐渐减弱内流电流逐渐增强
  • 浦肯野纤维4期内向电流,通常称为起搏电流,其主要成分是钠离子
  • 心肌组织的生理特性有兴奋性自律性传导性收缩性
  • 决定和影响心肌兴奋性的因素有静息电位水平阈电位水平钠离子通道状态
  • 从电生理角度分析,影响心肌细胞自律性高低的因素有最大复极电位阈电位水平4期自动除极化速度
  • 在心脏的特殊传导系统中,有自律性的部分包括窦房结房室交界房室束浦肯野纤维
  • 不同部位心肌对细胞外钾离子的敏感性不同,心房肌最敏感,窦房结敏感性较低。
  • 迷走(心交感)神经兴奋时,节后纤维释放乙酰胆碱(去甲肾上腺素),与心肌细胞膜上M受体(β1受体)结合,产生负(正)性变力负(正)性变时负(正)性变传导
  • 影响动脉血压的因素有心脏搏出量心率外周阻力和主动脉大动脉弹性贮器以及循环血量与血管容量的比值。
  • 右心衰竭、体循环回心血量减少,中心静脉压升高
  • 微循环的血液可通过迂回通路直捷通路动静脉短路由微动脉流向微静脉。
  • 影响组织液生成的因素由毛细血管压血浆胶体渗透压淋巴回流毛细血管壁通透性
  • 心交感神经节前神经元是胆碱能神经元,其末梢释放乙酰胆碱与节后神经元细胞膜上的N1受体结合,引起节后神经元兴奋。
  • 心交感神经节后神经元释放去甲肾上腺素,与血管平滑肌上的α受体和β受体结合,前者引起血管平滑肌收缩,后者引起血管平滑肌舒张
  • 刺激右侧心交感神经以引起正性变时作用为主,刺激左侧心交感神经以引起正性变力作用为主。

人体解剖与生理学填空题(一)

  • 人体解剖生理学是研究人体生命活动规律的学科,可从整体器官分子细胞多个水平研究生命过程。
  • 动物实验的方法可分为急性实验和慢性实验。
  • 神经末梢释放神经递质是通过胞吐作用进行的。
  • 动作电位传到神经肌肉接头处,使突触前膜释放乙酰胆碱使终板膜主要对钠离子的通透性增加。
  • 骨骼肌收缩时,胞浆内钙离子升高,其主要来源于终末池
  • 横桥具有ATP酶活性,当它与肌动蛋白结合后,才能被激活。
  • 细胞膜对物质转运的基本形式主要有单纯扩散易化扩散主动转运胞吞作用胞吐作用
  • 骨骼肌收缩和舒张过程中,胞浆内的钙离子浓度升高主要是由于钙离子由肌浆网终末池释放,而钙离子浓度的降低,主要是肌浆网结构中钙泵活动的结果。
  • 肌肉收缩是肌丝向肌丝滑行的结果。
  • 载体转运的特点是结构特异性饱和现象竞争性抑制
  • 反应的两种基本表现形式兴奋抑制
  • 新城代谢包括物质代谢能量代谢两个方面。
  • 机体的内环境是指位于细胞间的细胞外液,维持内环境理化性质相对稳定的状态即为稳态。
  • 神经调节的特点是迅速短暂精确;体液调节的特点是缓慢持久广泛;自身调节的特点是调节范围小不灵敏
  • 根据刺激产生的动作电位关系,可将刺激分为阈下刺激阈刺激阈上刺激
  • 神经纤维在单位时间内最多发生的兴奋次数,只取决于神经细胞的绝对不应期,而与刺激的频率无关。
  • 降低神经细胞外液钠离子浓度可使细胞动作电位幅度降低,而静息电位的水平不变。
  • 血液的比重主要取决于红细胞比容,其次是血浆蛋白含量
  • 血浆蛋白分为白蛋白球蛋白纤维蛋白原
  • 红细胞中的主要成分是血红蛋白,其主要作用是携带氧和二氧化碳缓冲酸碱性
  • 白细胞可分为中性粒细胞嗜酸性粒细胞嗜碱性粒细胞单核细胞淋巴细胞
  • 白细胞中吞噬能力最强的是单核巨噬细胞,能释放组胺和肝素的是嗜碱性粒细胞,与机体免疫功能密切相关的是淋巴细胞
  • 调节红细胞生成的激素有促红细胞生成素雄激素
  • 骨髓受损引起的贫血是再生性障碍贫血,VB12、叶酸缺乏可导致巨幼红细胞贫血,出血引起的贫血是缺铁性贫血
  • 血小板的基本功能有参与生理性止血促进凝血维持血管内皮细胞完整性

药理学名词解释(一)

摘抄自:中国医药科技出版社《药理学(第四版)》

Pharmacology(药理学):研究药物的学科之一,主要研究药物与机体的相互作用规律。

Pharmacodynamics(药效学):研究在药物的作用下,机体发生生理功能及细胞代谢活动变化规律。

Pharmacokinetics(药物代谢动力学) :药物在体内的吸收、分布、代谢、排泄及其动态变化规律。

Preclinical pharmacology(临床前药理学):以动物为实验对象,严格控制实验条件,从整体、器官、组织、细胞、分子水平上观察和讨论药物的作用和作用机制,进行药效和安全性评价。

Clinical pharmacology(临床药理学):以临床患者为对象,研究药物对机体的药动学、药效学和不良反应,以确保患者用药安全。

First pass effect(首过效应):口服给药时,药物在进入体循环前经肠、肠壁、肝脏代谢分解,使进入体内的药量降低。

Redistribution(再分布):药物先向血流丰富的组织分布,然后向血流少的组织转移。

Enterohepatic cycle(肝肠循环):某些药物经胆汁排泄至十二指肠后被重新吸收,或代谢物经胆汁排泄到肠道后,在肠道菌作用下分解放出原型药物再次吸收。

Latent period(潜伏期):从给药开始到出现疗效的时间。

Persistent period(持续期):维持在有效浓度以上的时间。

Residual period(残留期):有效浓度以下至完全消除的时间。

Half life(半衰期):血药浓度下降一半的时间。

Clearance(消除率):单位时间内多少分布容积中的药物被消除。

Apparent volume of distribution(表观分布容积):药物分布平衡后,体内药量和血药浓度的比。

Bioavailability(生物利用度):血管外给药后,药物吸收进入血液循环的一种量度。

Absolute bioavailability(绝对生物利用度):进入体循环的量 / 给药量

Relative bioavailability(相对生物利用度):受试制剂与已知参比制剂吸收程度的比较。

Loading dose(负荷剂量):为缩短达到稳态血药浓度的时间,首先给一次大剂量再给维持剂量,可以使血药浓度达到稳态水平的首次剂量即负荷剂量。

Drug action(药物作用):药物与机体生物大分子相互作用产生的初始反应。

Pharmacological effect(药理效应):药物引起的机体生理生化功能继发性改变。

Selectivity(药物作用选择性):机体组织对药物的敏感性不同。

Therapeutic effect(治疗作用):药物引起的符合预期用药目的的作用。

Etiological treatment(对因治疗):用药后消除致病因子,彻底治愈疾病的治疗。

Symptomatic treatment(对症治疗):用于改善临床症状的治疗,不能消除病因,但可改变病人的生理生化功能,防止病情恶化。

Adverse effect(药物不良反应):与用药目的无关的且给病人带来不适和病痛的反应。

Side effect(副作用):治疗量下,出现与治疗作用无关的不适反应。

Toxic effect(毒性反应):剂量过大或给药时间过长引起的危害性反应。

Allergic effect(变态反应):机体受到药物刺激后产生的异常免疫反应。

Residual effect(后遗效应):血药浓度降到有效浓度下残留的效应。

Secondary effect(继发效应):继发于治疗作用,由治疗作用引发的不良后果。

Withdrawal effect(停药反应):长时间用药后突然停药导致的原有病情加重。

Idiosyncratic effect(特异质反应):某些药物引起某些特定人群出现特异质不良反应。

Dose-effect relationship(量效关系):在一定剂量范围内,药物效应随剂量改变而改变。

Minimal effect dose(最小有效剂量) | Threshold dose(阈剂量):引起药物效应的最小剂量。

Maximal effect(最大效应) | Efficacy(效能):药效随剂量增加而增强,效应增加到一定程度后不随浓度改变,此时的效应为最大效应,可以反应药物的内在活性。

Potency(效价强度):作用相同的药物间引起等效反应时浓度或剂量之比,通常用产生50%效应量时的剂量。

ED50(半数有效量):50%实验动物出现阳性反应或达到最大效应50%时的剂量。

Margin of safety(安全范围):最小有效量(ED95)与最小中毒量(LD5)的间距。

Therapeutic index(治疗指数):LD50 / ED50

Safety index(安全指数):LD5 / ED95

Aria2c的文件操作(SMB/Nextcloud途径)

之前介绍了如何部署(详见这篇)和图形化管理界面的部署(详见这篇),但是对于远程获取aria2c所下载的文件仍然是个难点。如果完成了这一点,那就基本完成了某云、某雷离线下载的基本内容。

Aria2c文件操作的特点

首先,aria2c有且只有JSON-RPC/XML-RPC操纵接口。倒也不是说它实现的接口太少,正常的下载工具,例如Transmission、Vuze等,都只实现了这样的RPC操纵接口。

另外一点通过RPC接口调用的remove方法(也就是所谓删除任务),并没有删除已下载文件的可选参数。简单来说就是,你无法通过图形化管理界面删除任务及其文件。

最后,通过PRC接口调用tellStatus方法(即返回任务状态),得到的目标下载地址是相对于配置文件,或新建任务时指定的下载目录的相对路径。

SMB/Nextcloud 途径

这条途径将SMB作为局域网共享,而Nextcloud作公网共享。以SMB作局域网共享的优势在于良好的Windows兼容性,任何局域网内的Windows主机只需要简单地【添加一个网络位置】就可以像操作本地文件夹一般操作aria2c的下载目录。而以Nextcloud作为公网共享的优势,则在于协议上相对安全,因为一般而言并不建议将SMB共享开放到公网上。同时如果已经有Nextcloud作为自制网盘的话,集成进Nextcloud会更加便利。

间章一 · 关于三种网络位置的讨论

查看Windows主机上添加网络位置的三个示例,可以看到有三种:共享文件夹(即SMB)、Web共享(即WebDAV)和FTP站点(即FTP)。在目前只需要简单地操作下载目录中文件的实例中,三者从性能上差不多。或者说,IOPS大小对我们影响不大,我们并不在意;协议开销(有一些同志指出SMB的协议开销特别大),但在目前的千兆局域网条件下(部分石油佬可能都搭起了10Gbps局域网),似乎也没有什么值得担忧的,即使是4k蓝光电影,比特率不过130Mbps,只要设备链路达到千兆级别,协议开销87%都能撑住4k Blue-ray(笑)。

因此接下来考虑的重点,可能只是服务端与客户端配置,孰难孰易。

对于SMB而言,在服务端,Windows下几乎零配置,Liunx系的可能要加一个smb包和nmb包;在客户端,Windows下零配置,Linux系同样要加一个smbclient。

而对于WebDAV而言,服务端的配置就要麻烦一点,Windows下可以考虑IIS的WebDAV功能,Linux系的可能需要一些Nextcloud之类的CMS,以提供WebDAV服务;在客户端,Windows下可能是零配置的(视WebDAV是否使用SSL,不使用SSL需要调整Windows的一些参数),Linux系curl和wget都能很好地工作。

最后对于FTP来说,在服务端,Windows可以选择IIS的FTP功能,也可以选择FileZilla等FTP服务器程序,Linux系的话,一般选择vsftpd;在客户端,Windows下零配置,同样Linux系的curl和wget也完全没有问题。

1. 将Aira2下载目录建立共享

这里以Windows为例,因为如果是Linux系,更建议直接把Nextcloud也部署在同一主机中,然后使用Nextcloud挂载本地文件夹。

新建一个专用的本地账户,然后右键文件夹→属性→共享→网络文件和文件夹共享,设置刚刚新建的账户具有读写权限,然后,就完成了。这就是所谓,几乎零配置。

2. Nextcloud挂载SMB共享

首先需要安装php的smbclient扩展,包名一般叫php-smbclient。

然后在Nextcloud的外部储存中新建一个【SMB/CIFS】类型的外部储存,认证方式为【用户名和密码】,配置选项一看就知道该怎么填,特别需要说明一点的是【域名】需要填写为共享文件夹那个Windows主机的主机名

至此就可以从Nextcloud操作Aria2c的下载目录。
甚至你能将下载的文件再复制到Nextcloud的主储存目录,当然需要注意复制文件会有一个最长执行时间的问题,如果超出最长执行时间(通常是因为局域网是百兆链路),那么其结果是难以估计的,这一点需要注意。
抑或是设置共享,通过URL链接分享下载的文件。

3. (可选)配置Nextcloud外部站点插件

如果根据之前的AriaNg部署,那应该会有一个公网可访问的AriaNg页面,接下来要做的就是把这个页面嵌入NextCloud。好在NextCloud有一个External Website(“外部站点”)插件,配置一个新站点,站点URL就设置为之前那个公网可访问的AriaNg的地址。然后就大功告成啦🎉

当然AriaNg目前还不能设置主题颜色之类的东西,或者说不能很方便的调整色彩(一定要改的话,CSS文件就在你手里),因此可以考虑专门跑一个NextCloud实例用于管理下载(当然如果这样子的话,容器化会比较好。只不过容器化对于NextCloud这种更新得很频繁的软件来讲,并不是很有吸引力)。

间章二 · 关于ocDownloader插件的讨论

如果很早接触ownCloud/NextCloud,那应该听说过这个神奇的插件。它与本机的aria2c的RPC接口交互,可以在NextCloud内完成文件的下载。但是他并不是在NextCloud用户根目录新建一个虚拟文件夹来表示下载目录;仍然需要用户手动挂载外部储存。尽管如此,在当时可以说是一种神器般的存在。但时至今日,ocDownloader可以说,只能是没有办法的办法。

ocDownloader的典型界面
ocDownloader的典型界面
ariang的典型界面
ariang的典型界面

(摊手.jpg)

ocDownloader唯一值得称道的地方,可能只在于他可以选择curl作为下载后端,而安装curl又是极其简单的——只要装上php-curl就行了,事实上只要能正确安装nextcloud,基本都装上了php-curl,毕竟人家要更新的呀。
那我们来细数一下ocDownloader的不足之处:

  1. 只能与本机的aria2c交互。
    • 因为只能与本机的交互,因此暂不支持rpc-secret,而且我想这个功能的开发优先度也是很低。
  2. 作为插件,还需要手动挂载下载目录。

Aria2c的图形化界面部署(以AriaNg为例)

之前提到过(详见之前这篇文章)Aria2具有JSON-RPC/XML-RPC操控接口,因此大多数图形化界面都是以此接口开发的。在这里以AriaNg为例,介绍图形化界面的部署。

AriaNg是什么

AriaNg 是一个让 aria2 更容易使用的现代 Web 前端. AriaNg 使用纯 html & javascript 开发, 所以其不需要任何编译器或运行环境. 您只要将 AriaNg 放在您的 Web 服务器里并在浏览器中打开即可使用. AriaNg 使用响应式布局, 支持各种计算机或移动设备.

引自其官方仓库 https://github.com/mayswind/AriaNg

官方并没解释Ng是什么意思,个人猜测可能是Next Generation?

AriaNg的安装

AriaNg作为一个纯HTML与Javascript语言的静态网页型应用,自然部署不是什么特别大的问题。预编译包提供标准版本(分为index.html与一系列css、js文件)和单文件版本(所有css,js,图片文件全部写进index.html)。单文件版本适合本地使用,而标准版本适合服务器部署。难点可能要数如何控制AriaNg与Aria2c的交互。

1. 配置网页服务器

此处提供一个Nginx的范例,可供局域网内使用。

server {
        listen 80;
        listen [::]:80;
        server_name _;

        location / {
                root /var/www/aria2;
                index index.html;
                try_files $uri $uri/ =404;
        }
}

此外也可以选择使用OSS+CDN托管,作为公共服务。

2. 代理Aria2c的RPC端口

如果只是在局域网里使用,只要放开aria2c默认的6800端口上的防火墙就可以了。但是如果只是在局域网里使用,那aria2c相对其他软件的优势也就体现不出来了(特指某迅雷)。因此肯定要将aria2c的RPC端口开放到公网,然后用aria2c的token保护这个端口,或者用些其他的方法。

不过好在XML-RPC也好,JSON-RPC也好,都是建立在HTTP应用层之上的。也就是说可以把它当成普通的Web服务端口,用各类网页服务器做反向代理。下面提供一个反向代理的例子:

server {
        listen 80;
        listen [::]:80;
        server_name _;

        location =/jsonrpc {
                # 这里填写正确的反向代理位置
                # 假设你内网穿透到公网服务器的6800端口上
                proxy_pass              http://localhost:6800/jsonrpc;
                proxy_redirect          off;
                proxy_set_header        X-Real-IP       $remote_addr;
                proxy_set_header        X-Forwarded-For $proxy_add_x_forwarded_for;
                proxy_set_header        Host            $host;
                # 使Nginx支持WebSocket反向代理
                proxy_http_version 1.1;
                proxy_set_header        Upgrade         $http_upgrade;
                proxy_set_header        Connection      "upgrade";
        }

        location / {
                return 404;
        }
}

那么到这里有些同志会问,直接防火墙开放公网服务器的6800端口不就好了吗?需要注意的是,默认情况下aria2c的RPC端口是HTTP协议的,即明文传输。如果需要aria2c方面开启SSL,需要在aria2c.conf中配置SSL证书。这么配置证书,难倒是不难;就是通常免费的SSL证书有效期有限,你总是要去换证书,而换证书这个操作,要自动化得要费点力气。

使用Nginx等网页服务器配置的好处在于,当你写完HTTP反向代理的配置文件之后,并且做完域名解析,使用certbot一键就能开启SSL并将所有非SSL流量重定向到SSL上(当然视情况可能需要按三次回车键吧),证书的更新将由后台的服务自动更新。如此一来,已经没有什么好怕的了。

3. 正确设置AriaNg连接参数

当使用 certbot 将所有流量都引导至SSL之后,Aria2 RPC 的地址中协议要设置为 https 或者 wss ,端口要设置为443。通常还要设置 Aria2 RPC 密钥为aria2c.conf中的 rpc-secret 项所对应的值 。

需要注意的是HTTP下的AriaNg可以用SSL上的RPC;而HTTPS下的AriaNg,如果不使用SSL上的RPC则会被视为混合内容,通常会被浏览器阻止。

至此Aria2c的图形化界面就算完成了
■QED

Aria2c的部署

什么是Aria2c

aria2 是一个轻量级的多协议多源的命令行下载工具。它支持 HTTP/HTTPS、FTP、SFTP、BitTorrent和 Metalink。aria2可以介由内置的JSON-RPC和XML-RPC接口来操控

官网自述 https://aria2.github.io/

最大的亮点应该是可以通过JSON-RPC/XML-RPC进行交互,其XML-RPC接口可以通过Python的xml.client标准库进行交互。

安装Aria2c

对于Linux来讲,可以简单地通过apt包管理器进行安装,包名为“aria2”。版本比较新的操作系统,软件仓库里的版本会比较高,例如Ubuntu,GitHub仓库里的版本号已经达到1.34.0的时候,16.04 LTS仓库里的是1.19.0;18.04 LTS仓库里的是1.33.1。
而对于Windows而言,首先当然可以下载源码,编译出aria2c.exe,但aria2的GitHub仓库里已经有了预编译好的发行版本,怎么方便怎么弄就行。

有了aria2c可执行文件之后,Linux相对比较好配置,可以写一个systemctl服务文件,或者其他的传统艺能,比如supervisor之类的。难点在于Windows的配置,接下来主要解释Windows下的配置。

1. 启动脚本

说是脚本,其实就是一行命令:

aria2c.exe --conf=./aria2c.conf

2. 完善目录结构

可以看到启动脚本里有一个 aria2c.conf 的文件,同样可以发现GitHub上下载下来的预编译包里没有这个文件,只有一个孤零零的aria2c.exe(除去一些readme和版权声明之类的东西)。
因此首先需要新建一个名为 aria2c.conf 的配置文件,一个网上随处可见的典型的配置文件如下所示,需要注意一下高亮的部分,那些行一定要记得写:

#################
## 文件保存相关 ##
#################

# 文件的保存路径(可使用绝对路径或相对路径), 默认: 当前启动位置
dir=d:/aria2/

# 启用磁盘缓存, 0为禁用缓存, 需1.16以上版本, 默认:16M
disk-cache=32M

# 文件预分配方式, 能有效降低磁盘碎片, 默认:prealloc
# 预分配所需时间: none < falloc ? trunc < prealloc
# falloc和trunc则需要文件系统和内核支持
# NTFS建议使用falloc, EXT3/4建议trunc, MAC 下需要注释此项
file-allocation=falloc

# 断点续传
continue=true

#################
## 下载连接相关 ##
#################

# 最大同时下载任务数, 运行时可修改, 默认:5
#max-concurrent-downloads=5

# 同一服务器连接数, 添加时可指定, 默认:1
max-connection-per-server=5

# 最小文件分片大小, 添加时可指定, 取值范围1M -1024M, 默认:20M
# 假定size=10M, 文件为20MiB 则使用两个来源下载; 文件为15MiB 则使用一个来源下载
min-split-size=10M

# 单个任务最大线程数, 添加时可指定, 默认:5
#split=5

# 整体下载速度限制, 运行时可修改, 默认:0
#max-overall-download-limit=0

# 单个任务下载速度限制, 默认:0
#max-download-limit=0

# 整体上传速度限制, 运行时可修改, 默认:0
#max-overall-upload-limit=0

# 单个任务上传速度限制, 默认:0
#max-upload-limit=0

# 禁用IPv6, 默认:false
#disable-ipv6=true

# 连接超时时间, 默认:60
#timeout=60

# 最大重试次数, 设置为0表示不限制重试次数, 默认:5
#max-tries=5

# 设置重试等待的秒数, 默认:0
#retry-wait=0


#################
## 进度保存相关 ##
#################


# 从会话文件中读取下载任务
input-file=./aria2.session

# 在Aria2退出时保存`错误/未完成`的下载任务到会话文件
save-session=./aria2.session

# 定时保存会话, 0为退出时才保存, 需1.16.1以上版本, 默认:0
save-session-interval=60

################
## RPC相关设置 ##
################

# 启用RPC, 默认:false
enable-rpc=true

# 允许所有来源, 默认:false
rpc-allow-origin-all=true

# 允许非外部访问, 默认:false
rpc-listen-all=true

# 事件轮询方式, 取值:[epoll, kqueue, port, poll, select], 不同系统默认值不同
event-poll=select

# RPC监听端口, 端口被占用时可以修改, 默认:6800
#rpc-listen-port=6800

# 设置的RPC授权令牌, v1.18.4新增功能, 取代 --rpc-user 和 --rpc-passwd 选项
rpc-secret=hello

# 设置的RPC访问用户名, 此选项新版已废弃, 建议改用 --rpc-secret 选项
#rpc-user=<USER>

# 设置的RPC访问密码, 此选项新版已废弃, 建议改用 --rpc-secret 选项
#rpc-passwd=<PASSWD>

# 是否启用 RPC 服务的 SSL/TLS 加密,
# 启用加密后 RPC 服务需要使用 https 或者 wss 协议连接
#rpc-secure=true

# 在 RPC 服务中启用 SSL/TLS 加密时的证书文件,
# 使用 PEM 格式时,您必须通过 --rpc-private-key 指定私钥
#rpc-certificate=/path/to/certificate.pem

# 在 RPC 服务中启用 SSL/TLS 加密时的私钥文件
#rpc-private-key=/path/to/certificate.key

###################
## BT/PT下载相关 ##
###################

# 当下载的是一个种子(以.torrent结尾)时, 自动开始BT任务, 默认:true
#follow-torrent=true

# BT监听端口, 当端口被屏蔽时使用, 默认:6881-6999
listen-port=51413

# 单个种子最大连接数, 默认:55
#bt-max-peers=55

# 打开DHT功能, PT需要禁用, 默认:true
enable-dht=true

# 打开IPv6 DHT功能, PT需要禁用
#enable-dht6=false

# DHT网络监听端口, 默认:6881-6999
#dht-listen-port=6881-6999

# 本地节点查找, PT需要禁用, 默认:false
#bt-enable-lpd=false

# 种子交换, PT需要禁用, 默认:true
enable-peer-exchange=true

# 每个种子限速, 对少种的PT很有用, 默认:50K
#bt-request-peer-speed-limit=50K

# 客户端伪装, PT需要
#peer-id-prefix=-TR2770-
#user-agent=Transmission/2.77

# 当种子的分享率达到这个数时, 自动停止做种, 0为一直做种, 默认:1.0
seed-ratio=1

# 强制保存会话, 即使任务已经完成, 默认:false
# 较新的版本开启后会在任务完成后依然保留.aria2文件
#force-save=false

# BT校验相关, 默认:true
#bt-hash-check-seed=true

# 继续之前的BT任务时, 无需再次校验, 默认:false
bt-seed-unverified=false

# 保存磁力链接元数据为种子文件(.torrent文件), 默认:false
bt-save-metadata=true

daemon=true

可以看到配置文件里面有一个名叫aria2.session的文件,如果不先创建一个空文件,它会提示找不到而拒绝启动,因此,需要稍微帮它一下。

3. 自启动

可以说这是最麻烦的地方,有些同志把启动脚本写成批处理文件,然后在开机自启动的文件夹(具体而言在%appdata%\Roaming\Microsoft\Windows\Start Menu\Programs\Startup)做一个启动脚本的快捷方式;当然又有些同志觉得一个黑框框挺丑的,所以给写了一个隐藏启动vbs脚本套子,比如说:

CreateObject("WScript.Shell").Run "aria2c.exe --conf-path=aria2.conf",0

也不是说这些同志的方案不好,但对于Windows服务器而言,这要求每次服务器开机时要登陆一下账户,然后才会执行自启动文件夹里的文件。因此创建一个Windows服务的显然是更好的选择,比如说:

> sc create Aria2 binpath= "path/to/aria2c.exe --conf=path/to/aria2c.conf" type= share start= auto displayname= "Aria2 下载服务" 

但难点在于直到本文撰写时,版本1.34.0,仍然会遇到无法后台运行,导致服务启动失败,而且配置文件中session文件的路径也要写绝对路径。
因此就有了一个曲线救国的方案:【任务计划程序】(一个大家总是无视其存在的东西)
配置要点如下:

  • 常规
    • 安全选项【不管用户是否登录都要运行】
  • 触发器
    • 启动时 – 在系统启动时
  • 操作
    • 启动程序
      • 程序【aria2c.exe】
      • 添加参数【–conf=aria2c.conf】
      • 起始于【aria2c.exe所在路径】
  • 设置
    • 如果任务失败,按一下频率重新启动【按需勾选】
    • 如果任务运行时间超过以下时间,停止任务【不勾选】

到此为止Aria2在Windows上的部署就已完成
■QED

Ubuntu 配置自动更新

主要编译自Ubuntu官方参考手册

https://help.ubuntu.com/lts/serverguide/automatic-updates.html.en

软件包 unattended-upgrades 可以用来自动安装软件包的更新,并且其能配置为自动更新所有软件包,或者仅安装软件包的安全性升级。首先在终端输入下列命令以安装该软件包。

sudo apt install unattended-upgrades

译注:通常而言unattended-upgrades软件包是默认安装的。

通过编辑 /etc/apt/apt.conf.d/50unattended-upgrades 文件,可以配置unattended-upgrades软件包以达到你的需求。

Unattended-Upgrade::Allowed-Origins {
        "${distro_id}:${distro_codename}";
        "${distro_id}:${distro_codename}-security";
//      "${distro_id}:${distro_codename}-updates";
//      "${distro_id}:${distro_codename}-proposed";
//      "${distro_id}:${distro_codename}-backports";
};

特定的软件包也可以通过加入黑名单来避免其自动更新。将软件包的名字加入下方列表以阻止其自动更新。

Unattended-Upgrade::Package-Blacklist {
//      "vim";
//      "libc6";
//      "libc6-dev";
//      "libc6-i686";
};

注意:双斜线“//”会被当做注释,因此任何在双斜线后的语句都将不会被计算。

译注:上两个配置文件片段都是默认情况下的配置,即自动更新主线(即“”)安全升级(即“security”)频道中需要更新的软件包,同时不阻止任何软件包的自动更新。根据实际需要可以放开对更新(即“updates”)频道的更新;而建议(即“proposed”)频道,则不建议放开。

要启用自动更新,可以编辑 /etc/apt/apt.conf.d/20auto-upgrades 文件,并设置正确的 apt 配置参数。

APT::Periodic::Update-Package-Lists "1";
APT::Periodic::Download-Upgradeable-Packages "1";
APT::Periodic::AutocleanInterval "7";
APT::Periodic::Unattended-Upgrade "1";

上述的配置将会每天更新软件包列表,下载并安装可用的更新。本地下载的压缩包将会每周清理一次。 根据于你的选择,在一些升级到更新一些版本的Ubuntu服务器上,上述文件也许不存在。如果不存在,创建一个这个名字的新文件也应当可行。

注意:你可以通过阅读  /etc/cron.daily/apt 脚本的头部内容来了解更多关于 apt 周期性配置的选项。

译注:虽然手册上标了个“注意”,说要去 /etc/cron.daily/apt 的头部查阅,实际上对于Ubuntu≥18.04,你得去 /usr/lib/apt/apt.systemd.daily 的头部查阅更多的配置选项。

unattended-upgrades 的运行结果将会记录到 /var/log/unattended-upgrades 目录中。

通过配置 /etc/apt/apt.conf.d/50unattended-upgrades 文件中的 Unattended-Upgrade::Mail 项将会使 unattended-upgrades 向管理员发送邮件,报告任何需要升级的,或者存在问题的软件包。

另一个有用的的软件包是 apticronapticron 会配置一个 cron 任务通过邮件来通知管理员在系统中任何有可用升级的软件包,并包含每个软件包升级变更的总结。

要安装 apticron 软件包,在终端输入:

sudo apt install apticron

当软件包安装完成后,编辑 /etc/apticron/apticron.conf 文件,设置邮箱地址以及其他选项:

EMAIL="root@example.com"

一种基于OSS的静态网站工作流

标题有点微妙对吧,涉及的东西太多了我也不太确定怎么拟标题。

架构

接下来围绕几个问题做一点讨论:

1.为什么要海外VPS

因为drone ci需要拉取docker镜像,而国内访问Docker Hub存在一些小小但却令人抓狂的问题。当然如果本地访问Docker Hub一点问题都没有,那gogs和drone ci部署在本地就行了。此外需要注意一个海外VPS是否能正确连通国内的对象储存Endpoint,否则需要配置海外对象储存Endpoint,此举可能导致费用上升(虽然5GB以内倒是费用下降了)。

2.为什么要Gogs

现在Github的私有仓库不设数量限制,当然用GitHub是非常好的,数据将会更安全(从数据可用性意义上)。但因为历史遗留问题,以及个人偏好(我比较喜欢把自己的数据放在自己枕边),选了gogs

3.为什么要对象储存

对象储存是按量计费的,通常每GB每月费用不超过1¥,相比搞一个轻量型云服务器,或者虚拟主机之类,其成本几乎可以忽略不计。另一方面对象储存允许配置为静态网站模式,为这个工作流提供了可能性。

4.为什么要内容分发网络(CDN)

注意,首先假设使用的是国内的对象储存Endpoint。
不使用CDN的话,首先需要配置SSL证书托管,否则直接用Bucket.Endpoint访问首页倒是可以用HTTPS,但浏览器行为会变成下载网页,同时流量费用是属于外网流出(一般而言应该用忙时的价格)0.5¥/GB,请求费用是0.01¥/万次
而使用CDN,首先SSL证书可以配置为自动免费证书,同时流量费用分两个部分:CDN回源流量0.15¥/GB+CDN按流量付费0.24¥/GB≤0.39¥/GB,请求费用是0.05¥/万次(自动SSL证书的代价吗😭)

假设每次请求是 x GB/req,CDN部分流量费按上界计,不难根据不等式0.5+0.01/x ≤ 0.39+0.05/x得到 x≤0.36 GB/req。亦即只要每次请求流量不大于0.36GB的话,用CDN+OSS总是比单用OSS便宜。同理用CDN流量费用下界计算,可以得到只要每次请求流量不大于0.15GB。

结论就是,静态内容变动得不勤快,只要每次请求静态内容大小不大于0.15GB,或者很勤快,那么只要不大于0.36GB,使用CDN+OSS总是优于单用OSS。

实例

The best way to learn something is to build it yourself.

沃·梓季·硕德

在此以我自己的有机化学cookbook为例。

1.Drone CI的部署

目前drone 1.0还处在RC阶段,最好还是根据文档部署,详见https://docs.drone.io/

2.Drone CI 配置文件(*配置点1)

默认drone会从代码仓库的根目录读取一个名叫 .drone.yml 文件作为持续集成的配置文件,当然这也是可以自定义的。以下是一个范例配置文件

workspace:
  base: /data
  path: .

pipeline:
  build:
    image: kitakami/mkdocs-materials-pipeline
    commands:
      - mkdocs build -s

  upload:
    image: plugins/s3
    endpoint: yourendpoint
    bucket: yourbucketname
    access_key:
      from_secret: access_key_id
    secret_key:
      from_secret: secret_access_key
    strip_prefix: site/
    source: site/**/*
    target: .
    acl: public-read

  notify:
    image: drillster/drone-email
    host: smtp.mxhichina.com
    port: 465
    username: 
      from_secret: username
    password: 
      from_secret: password
    from: some@example.com
    recipients: [ admin@example.com ]
    when:
      branch: master

几点说明:

  1. 由于我用的是Mkdocs,所以用了一个预装Mkdocs环境的docker容器,至于怎么做一个这样的容器,其实是非常简单的。可以参见https://github.com/jsjyhzy/mkdocs-materials-pipelinehttps://cloud.docker.com/u/kitakami/repository/docker/kitakami/mkdocs-materials-pipeline,看看什么叫做蓐资本主义的羊毛。
  2. upload阶段的acl: public-read务必不要漏掉,否则即使bucket设置为公共读,文件也是私有属性的(因为默认行为不是继承Bucket ACL,而是直接Private)。
  3. notify阶段的端口号记得设置,感觉他们歪果仁的邮件服务器默认端口跟我国的不一样。

3.OSS与CDN的配置(*配置点2)

网页UI它老改来改去,就不上截图了,几点说明:

  1. Bucket配置静态首页与404页后就开启了静态网站模式。在此模式下任何以斜杠结尾的请求将返回配置的静态首页。
    1. 也因为此Mkdocs用户需要注意配置文件中设置
      use_directory_urls: false 以启用经典URL模式。
  2. Bucket的权限设置为公共读,这是因为当CDN配置为私有Bucket回源时访问以斜杠结尾的URL会被当作签名访问根目录,而不返回静态首页
  3. 由于Bucket的权限为公共读,为了防止直接对Bucket的访问可以考虑设置Referer,并禁止无Referer访问,同时在CDN回源的HTTP头上追加Referer。Referer可以是任何值,比如说一段随机的16进制数。

-1.使用

将灵感注入本地的Markdown文件后,git push,不到一分钟就能收到通知邮件,静态网站就更新完成了。

Python 图片字符化

以前写过一篇关于字符化的文章,当然用的算法比较老,虽然性能很好(就纯Python实现而言),但确实效果不算特别好,简单说一下思路,就翻篇吧。

老方法

当我们考虑一个图片,用字符将每个像素块替换为一个字符,那么首先会想到的,是根据每个字符产生的平均的亮度效应,与待替换像素块的平均亮度作映射。通过生成缩略图,比如我们需要一个50×50字符数量的图,那我们就将原图缩略成50×50像素,然后将每个字符缩略成1个像素,接着我们根据亮度,映射一下就好。因为只是一个常量的映射,因此性能相对来说挺不错的。

问题

性能好当然是有代价的。最大的问题在于细节的缺失,不管原来的像素块是有一个什么样的模式在里面,缩略之后什么都没有了。

新思路

那既然只考虑平均的亮度效应不行,那我们就逐个像素比较,找出最相近的字符,那不就好了嘛。

方法论

首先,字符化之后,字符显然是黑色的,或者准确地说,是前景色。因此就有个前景色选择的预处理问题,图片中哪种颜色是前景色,这就必须要人工介入选择。当然通常情况下把黑色作为前景色处理,是不会有错的。
那么接着需要考虑的是,逐个像素比较出最相近的字符要怎么比较,或者规范的说,如何定义像素块之间的距离。相对来说,比较直观的想法就是把整个包含N个像素点的像素块拉成一个N维向量,然后比较向量间的距离,比如余弦距离等等。
最后,从方法论上讲比较简单,不过就是渲染出单个字符,然后逐个比较嘛,但工程上的实现,确实有些十分讨厌的地方,下面会接着谈。

实现

我个人的一个实现已经放在Github上了。
链接在此👉https://github.com/jsjyhzy/charalize👈
代码是有一点乱,但是因为比较短,所以也就不多做解释,应该能无文档看懂代码吧。(希望)

距离函数

一般来讲向量间的距离用闵科夫斯基距离就可以了,所谓闵科夫斯基距离就是两个向量各维上的标量差的绝对值的p次方之和的p次方根,当p取1时退化为曼哈顿距离,p取2时退化为欧几里得距离,在我的实现中取了p=2,也就是欧几里得距离。关于欧几里得距离与曼哈顿距离的效果如下图所示:

另外值得注意的是,向量间的距离,通常还去考虑余弦距离度量,但在这个向量化方法中(彩色图先转化为灰度图,然后flatten二维数组为N维向量)这么做会有一个feature(绝对不是bug噢😎)。就是通过余弦距离度量生成的字符,会非常有效地捕捉到原画的线条,或者叫像素变化剧烈的部分,而色块则会非常星际地忽视。如下图所示:

这个区别就比较大(余弦距离 左 欧几里得距离 右)

究其原因,在于色块的像素块在我这个向量化方法中,会变成全是x的N维向量。对于余弦距离而言,全是x的N维向量和全是y的N维向量,其实是一回事。但对于线条而言,哪怕只有几个像素的变化,其距离变化相较闵科夫斯基之流会更加敏感,比如对辫子处的处理上:

左 余弦距离 中 原画 右 欧几里得距离

当然可以考虑综合余弦距离和闵科夫斯基距离做成一个集成学习,但就两个和而不同的算法可能还是有点….稀薄🤣。等以后能想到其他算法了,应该就可以搞一搞集成学习。

字符与字体

目前这个新思路,虽说新,但和原来的算法一样,也只支持等宽字体,也就是说一定是横纵分割的块。因此,首先要用等宽字体。但是就算用了等宽字体,也要视所使用的字符。哪怕字体告诉你“我是等宽字体哟😃”,实际上也有可能不等宽。这就涉及到字符的半角与全角之分。如果只看ASCII字符的话,那毫无疑问没有什么半角全角,但如果纳入,比如说日文平假名,那通常可以看到2个ASCII字符才跟一个平假名等宽的景象。
因此我们需要将ASCII字符变成全角的,全角Latin字符在U+FF00到U+FF65,所以只要把半角Latin字符序号加上65248就可以了,全角空格可以直接用U+3000,或者Python3里用char(12288)来表示

根据CUE切分音频文件

首先,为什么要切成小文件:如果你像我一样将音乐储存在文件服务器上,通过映射驱动器然后在本地播放。那么切分对于文件服务器具有极大的优势,文件服务器可以有效地缓存小文件。例如使用ZFS作为储存后端,启用ARC+L2ARC后可以最大限度地利用缓存,从而获得更短的响应时间,同时也减少机械磁盘的读写。

也许大家知道ARC和L2ARC都是块级的缓存机制,切不切开来好像也没太大所谓。但大家也应该知道并不是所有协议都支持随机读取的,比如基于WebDAV的网络共享在处理大型文件上就比较尴尬了。

快速上手

首先,介绍一下我写的一个Python小工具cuecut,用pip安装后直接就可以在命令行中使用cuecut命令根据cue文件切分对应的音频文件了。
PyPI链接–>https://pypi.org/project/cuecut/
Github链接–>https://github.com/jsjyhzy/cuecut

要是对原理不是很感兴趣的话,那么把FFmpeg的可执行文件复制到PATH中的任一目录,假设cue文件的位置是/a/b.cue,希望切分出来的音频文件是flac格式,那么打开命令行,输入如下命令

cuecut /a/b.cue -c flac

就可以了。音频文件将会自动根据cue文件中的演奏者,单曲名称命名为`演奏者 – 单曲名`。当然目前还不支持配置自动命名的样式,也许以后会有吧。

原理与方法论

技术上还是在使用ffmpeg的命令行,因此难点还是主要集中在ffmpeg的命令行参数的选取上。首先一些无关痛痒的参数,诸如是否显示banner(--hide_banner)、输入文件是什么(-i FILE)、输出编码是什么(-c:a codec)、日志级别(-loglevel levelname)、元数据(-metadata xxx=yyy)就不再展开讨论了。接下来主要讨论一些比较重要的参数:

移除原有的元数据

对于有一些音频镜像文件,原作者会将cue文件作为元数据写入音频文件中,如果不移除这些元数据,可能会导致播放音频文件时出现分章。因此需要用参数 -map_metadata -1 来移除这些元数据。

切取位置

既然是切分出音轨,那么就要确定切分位置,音轨的开始位置(或者说偏移量)用 -ss where 参数描述,其中where是一个浮点数(建议只取小数点后两位),结束位置则用 -to where 参数描述。

元数据写入

既然要写入一些诸如演奏者、音轨名或者专辑名称的元数据,那么就要让FFmpeg写入ID3数据块,这一点可以用 -write_id3v1 1 参数来指定。

移除视频流

部分音频镜像会把专辑封面作为一个视频流插入文件中,在切分这样的文件时,往往第一个音轨是能够正常获得这个视频流的。然而后续的音轨都将无法获得,同时由于这个问题,还进一步导致后续音轨丢失长度信息(duration),会使部分播放器无法seek到某一具体位置。目前没有什么特别好的方法让所有音轨都正确地获取视频流,因此较为实际的方案就是扔掉所有视频流,用参数 -vn 来完成。

平台依赖的非法文件名

这个问题是可以通过修改输出文件名的模式来规避的,主要是我的cuecut中的文件名模式中存在演奏者和单曲名,因此对于一些奇怪的名字还是要加以处理的,例如名字中不能出现 \/:*?<>| 这些字符。此外在Windows平台上AUX,CON,COM[1-9],NUL,LPT[1-9],PRN都是保留名称,即使带扩展名也不能创建这类文件。