Dash 视频串流技术

这里的 Dash 可不是一加手机的快充技术,在使用 Youtube DL 的时候频繁的接触到 DASH 这个关键词,查了一下 DASH 是流媒体技术,全称是 Dynamic Adaptive Streaming over HTTP,自适应流媒体技术,通过 HTTP 服务传送流媒体,在 YouTube,Netflix,Hulu 等流媒体网站中被频繁应用,国内 Bilibili 也引入了该技术 1

该技术的大致实现原理是在服务端将视频分片,每个分片都有自身的编码方式,甚至不同的分辨率,码率等等,而在客户端根据当前网速或者设备自行选择需要播放的分片,可以实现不同画质内容无缝切换。所以在 YouTube 切换画质时完全不会黑屏,更不会影响观看。更加具体的原理解释可以参考这里

另外几个值得一说的功能是

  • 音频视频分离,在后台播放时可以只拉取音频
  • 支持多音轨,多视频轨,多字幕任意切换

DASH 技术与编码器无关,可以使用 H.265, H.264, VP9 等等任何编码器进行编码。

DASH 结构

DASH 音视频流标识文件被称为 Media Presentation Description,包含了一组结构化音频视频内容。

MP4Box 命令

MP4Box 命令 可以对 MP4 文件进行合并,切割,提取等操作。更多可以参考官网

总而言之, MP4Box 命令可以实现如下:

  • 操作 MP4,3GP 等 ISO 文件,从不同来源和不同格式添加,删除,复用音频,视频和字幕
  • 将 MPEG-4 XMT 或者 W3C SVG 等编解码为二进制格式 MPEG-4 BIFS 或者 LASeR
  • 将元数据附加到单个流或整个 ISO 文件以生成符合 MPEG-21 或混合的 MPEG-4 / MPEG-21 文件
  • 用于准备 HTTP Adaptive Streaming 内容
  • 包装和标记结果,用于在不同设备(例如电话,平板电脑)或不同软件(例如 iTunes)上进行流式传输,下载和回放。

用于内容打包

MP4Box 可以用于将现成内容打包到 ISO 媒体文件,比如 MP4,3GP 等文件中。需要注意的是 MP4Box 命令并不会重新编码音频,视频,图片文件。将 DivX 文件转变为 MP4 文件:

MP4Box -add file.avi new_file.mp4

或者添加第二条音轨到上一条命令输出的文件

MP4Box -add audio2.mp3 new_file.mp4

MP4Box 可以从现存的容器中获取资源,可以使用 -info 来查看媒体资源

MP4Box -info file.avi

然后使用如下类似方法导入文件的音轨

MP4Box -add file.avi#audio new_file.mp4

分发

MP4Box 可以用于准备各种协议的传输分发协议,主要是 HTTP 下载或者 RTP streaming。

To prepare a file for simple progressive HTTP download, the following instruction will interleave file data by chunks of 500 milliseconds in order to enable playback while downloading the file (HTTP FastStart):

MP4Box -inter 500 file.mp4

To prepare for RTP, the following instruction will create RTP hint tracks for the file. This enables classic streaming servers like DarwinStreamingServer or QuickTime Streaming Server to deliver the file through RTSP/RTP:

MP4Box -hint file.mp4

To prepare for adaptive streaming (MPEG-DASH), the following instruction will create the DASH manifest and associated files. For more information on DASH see this post:

MP4Box -dash 1000 file.mp4

Dash

查看 MP4Box dash 相关的帮助:

MP4Box -h dash
DASH Options:
 -mpd m3u8            converts HLS manifest (local or remote http) to MPD
                       Note: not compatible with other DASH options (except -out and -tmp) and does not convert associated segments
 -dash dur            enables DASH-ing of the file(s) with a segment duration of DUR ms
                       Note: the duration of a fragment (subsegment) is set
                                using the -frag switch.
                       Note: for onDemand profile, sets duration of a subsegment
 -dash-strict dur     [DEPRECATED, will behave like -dash]
 -dash-live[=F] dur   generates a live DASH session using dur segment duration, optionally writing live context to F
                       MP4Box will run the live session until 'q' is pressed or a fatal error occurs.
 -ddbg-live[=F] dur   same as -dash-live without time regulation for debug purposes.
 -frag time_in_ms     Specifies a fragment duration of time_in_ms.
                       * Note: By default, this is the DASH duration
 -out filename        specifies output MPD file name.
 -tmp dirname         specifies directory for temporary file creation
                       * Note: Default temp dir is OS-dependent
 -profile NAME        specifies the target DASH profile: "onDemand",
                       "live", "main", "simple", "full",
                       "hbbtv1.5:live", "dashavc264:live", "dashavc264:onDemand"
                       * This will set default option values to ensure conformance to the desired profile
                       * Default profile is "full" in static mode, "live" in dynamic mode
 -profile-ext STRING  specifies a list of profile extensions, as used by DASH-IF and DVB.
                       The string will be colon-concatenated with the profile used

比如随便拿一个 mp4 文件:

MP4Box -dash 2000 -rap -profile dashavc264:onDemand input.mp4

解释:

  • -dash 2000 按照 1s 来切
  • -rap 强制让分段从随机点开始
  • -profile dashavc264:onDemand 可以查看 dash specifications 来查看更多 profile 相关的信息

这个操作不会对视频文件进行重新编码,只是将视频进行切片,所以非常快。执行命令结束后会得到 .mpd 文件和 *_dashinit.mp4 两个额外的文件。生成的这两个文件放到 HTTP 服务器中就可以在支持 mdp 播放的播放器中播放。

一些支持 DASH 的播放器

reference

  1. https://www.bilibili.com/read/cv867888/ 


2018-10-01 wiki , dash , youtube , bilibili , mpeg , stream

mastering xxx vs xxx cookbook vs xxx in action 系列图书的区别

常看计算机相关图书的话对,Mastering XXX,XXX in Action 肯定不会陌生,不同系列的图书定位是有差别的,刚开始学习一种技术时,选择一本合适的书非常重要。所以这里就我个人的感受来说一下这几个系列的区别。

Mastering XXX

大部分 Mastering 系列图书都是 Packt Publishing 出版社出版的。Mastering 系列的图书是大而全的书籍,从介绍开始,到使用,再到具体的技术细节都有涉及。翻译为中文一般叫做“精通 XXX”,“深入理解 XXX”。

适合有一定基础的初学者阅读。

常见的有:

  • 《Mastering Kubernetes》
  • 《Mastering Python》
  • 《Mastering Nginx》

XXX Cookbook

Cookbook 系列由 O’REILLY 出版社出版,这个系列会侧重于该语言,该工具的使用技巧和方法,会涵盖周边的工具库,算法等等,包含大量的编程技巧和示例代码。该系列的书比较实用,目录编排会通过实例来展示工具或者语言的实用,是一种实用主义的书。Cookbook 直译是食谱的意思,联想来就能够知道这个系列的书目的是为了让读者能做出一道菜来,通过组织不同的原材料(组织代码),最后获得一道美味的食物(达成的目标)。

该系列的书能够让读者认识到是什么,怎么用,最后能够做什么。其实从 cookbook 原本的意思中也能够感知到

a book that gives instructions on cooking and how to cook individual dishes

适合有一定编程能力的学习者参考。

常见的比如:

  • 《Python Cookbook》该书已经第三版

XXX in Action

in Action 系列的图书也是比较著名的一个系列,一般翻译为 “XXX 实战”,该系列图书由 MANNING 出版社出版,国内一般由人民邮电出版社翻译。听这个名字就知道这是偏实战的一本书,通常情况下会在书中有一个贯穿全书的例子,比如用 Redis 的特性实现某个系统功能等等。

但总得来说也是一本入门级别的书籍,适合初学者和有一定经验的从业者。

常见:

  • 《Machine Learning in Action》
  • 《Spring in Action》
  • 《Spring Boot in Action》
  • 《Redis in Action》
  • 《Maven in Action》

Learning XXX

适合初学者,我看过 《Learning Python》 这本,是我看过的所有的 Python 相关书籍中最详细的一本,每一个语言的细节,每一个用法的区别都是非常详细的。

Learning 系列的图书也是 O’Reilly 出版社的系列,这系列的图书比较初级,但是细节部分很详细,推荐初学者快速入门。

常见:

  • 《Learning Perl》
  • 《Learning Python》

Head First

Head First 系列的图书看的不多,最出名的可能是那本《Head First 设计模式》了吧,但是 Head First 系列书我查了一下都比较老,这个系列可能是这里面最没有存在感的一个系列了。至于特色部分等我看一些之后回来补上。

补充 Head First 系列,之所以叫做 Head First 是这个系列的图书开创了一种学习模式,通过大量的配图,对话,营造一种比较好的理解方式,通过联想记忆,让读者能够长时间集中注意力然后达到学习的目的。

常见:

  • 《Head First Android Development》

Thinking in XXX

Thinking in 系列,一般翻译为 XXX 编程思想。该系列的图书主要是讲述一种编程思维,用该语言的思维来抽象现实问题。

该系列常见的:

  • 《Thinking in Java》
  • 《Thinking in C++》

Dive into XXX

Dive into 系列一般翻译为“深入 XXX”,也是比较全面的介绍性书籍,书籍的组织方式一般也是由浅入深。

常见;

  • 《Dive into Python》

Primer

既然已经写了这么多了,也不在乎多这一类的书籍,Primer 最熟悉的一本应该就是 C++ Primer 了,最开始还以为是一本 C++ 中高级的书,但其实是一本初级入门读本,从 Primer 单词的释义就能看出

a book that contains basic instructions

所以见到此类的书大可直接阅读。

总结

对于新的一项技术,如果处于是什么都不太清楚的状态,推荐先找 Learning 系列的图书,如果没有可以找 Mastering 或者 Cookbook 系列的图书,先从直观上对该技术有一个总体的了解,是什么,有什么功能,能够做什么。然后具体对其中的细节进行学习。

reference

  • 豆瓣
  • Google

2018-09-30 programming , 图书系列 , cookbook

Selenium 使用介绍

在之前介绍 Appium 的时候就提到了一些 Selenium ,如果说 Appium 是移动端测试框架,那么 Selenium 就是 Web 端测试框架。简单的理解就可以认为我们可以编程控制浏览器的行为。Selenium 支持 Chrome,Firefox,Safari 等主流浏览器,也支持 PhantomJS, Headless Chrome 等等无头 (headless) 浏览器(无界面)。Selenium 支持的语言也非常多 Java, C#,Python, Ruby,JavaScript 1 等等

官网

安装使用

安装 Python 客户端

pip install selenium

Python client Driver 的文档在这里

安装第三方驱动,所有支持的驱动可以在这里 找到。几个重要的 Driver

举例

import unittest
from selenium import webdriver

class GoogleTestCase(unittest.TestCase):

    def setUp(self):
        self.browser = webdriver.Firefox()
        self.addCleanup(self.browser.quit)

    def testPageTitle(self):
        self.browser.get('http://www.google.com')
        self.assertIn('Google', self.browser.title)

if __name__ == '__main__':
    unittest.main(verbosity=2)

reference

  1. https://www.seleniumhq.org/download/ 


2018-09-29 selenium , crawler , python , auto-test , testing , web , browser

威联通折腾篇十一:USB 一键备份

我手上的这款威联通机身前部有一个 USB 端口,平时用处也不多,但是今天看文档看到了威联通的 USB 一键备份,于是就找到了 Hybird Backup Sync 这样一个内置的应用。以前没仔细研究,发现这个应用能够做的事情还挺多,包括云端备份,或者是 Rsync 备份到 NAS,或者外部硬盘备份,总之这也可以单独拿出来写一篇文章了。

回到 USB 一键备份的主题上来,我原本的习惯并不把 U 盘当做便携的数据存储,大部分情况下 U 盘都是启动盘,装机盘,少部分没有网络环境需要便携的数据备份的时候才会用 U 盘来拷贝一些数据。那么这个时候 USB 一键备份的功能就体现了价值,在我使用 U 盘的绝大多数情况下我都不会将资料存放在 U 盘中超过一天,基本上随用随拷贝,用完即删除。所以往往有些时候从外部拷贝了一些材料,那么就可以往 NAS 上一插,自动进行备份即可。

设置

USB 一键备份的设置在 Hybird Backup Sync 应用中,最下方外部备份,其中有一个 Tab 就是 USB 一键备份设置,如果前端的备份按钮无效,到这边设置下看看是否设置正确。在该设置下可以选择存储设备连接到前端 USB 的运行模式:

  • 智能导入
  • USB 一键备份
  • 视为外部存储

设置为一键备份之后,可以设置备份方向,一般都是从 USB 到 NAS 吧。

备份工作

将 U 盘连接前端 USB

  1. 备份:按住 Copy 按键两秒松开(蜂鸣器启用下,短哔声,开始备份)备份期间 USB LED 灯持续闪烁,备份完成指示灯变为常亮
  2. 如果需要卸载 USB 设备,按住 Copy 按钮 6-10 秒 直到 USB LED 灯熄灭(蜂鸣器启用时会发出短哔两声)
  3. 备份完成或者失败后,Copy 按钮会失效,如果要使用一键复制功能,请先卸载前端 USB,再次连接。

2018-09-27 qnap , usb , backup , hybrid-backup-sync , qnap-tutorial , linux

威联通折腾篇十:使用 aria2 下载百度云

无奈现在还是很多人使用百度云,以前用一个 bcloud 在 linux 上还能解决 80% 的需求,但是后来封了,也就一直没有理。不过后来发现 aria2 也能够现在百度云的资源,所以想着 qnap 威联通上也应该是能够安装的,使用 docker 会更加容易些。

新建容器

在 Container Station 中搜索 xujinkai/aria2-with-webui 安装即可。镜像是开源的地址在:https://github.com/XUJINKAI/aria2-with-webui

在设置中,网络选项下需要注意

  • 6080 端口映射容器 80 端口,这是 aria web 服务端口
  • 6800 端口映射容器 6800 端口,该端口为 aria2 端口

其中容器的 8080 端口可以选择性映射,这个端口用来浏览下载的目录列表,对于暴露外网的服务千万小心。

所以映射完之后,威联通的 6800 端口是 webui 界面,6080 端口是 aria2 服务的端口。

在共享文件夹选项中,可以设置需要挂载的本机共享文件夹,镜像中有两个挂载路径

  • /data 这个挂载点用来存放下载的文件目录
  • /conf 这个挂载点是 aria2 的配置目录

分别在威联通上新建共享目录来挂载这两个目录即可。

配置

在完成容器创建之后,可以访问 http://[qnap-ip]:6080 来浏览 aria2 webui,在界面中找到“设置”,“连接设置”

在 aria2 RPC 主机和端口设置中,设置主机地址为威联通的 IP 地址,或者远程域名,端口为 6800,如果设置了密码,需要在这里配置密码。

设置密码的过程,在 /conf 挂载点,找到 aria2.conf 文件,在文件中添加配置

rpc-secret=123456

如果在外网访问,一定要设置这个密码,如果在内网,可以不用设置。

在保存配置文件之后,需要重启容器。

baiduexporter

在完成 aria2 的安装之后,就是如何将百度云的内容导出到 aria2 下载,答案就是 BaiduExport

手动安装插件之后,重新刷新百度云网页,在选中文件之后就会看见多出来一个 “导出下载”的按钮,在 aria2 rpc 的设置中,填写 rpc 服务地址

http://[qnap-ip]:6800/jsonrpc

如果设置了密码令牌,则需要

http://token:123456@[qnap-ip]:6800/jsonrpc

此时,选中想要下载的文件,然后使用 ARIA2 RPC 导出下载,然后去 WEBUI 查看下载状态即可。

reference

  • http://www.nasyun.com/forum.php?mod=viewthread&tid=60274

2018-09-26 qnap , qnap-tutorial , aria2 , container-station , docker

响应式网页编程中 HTML 标签 meta viewport

在看 html meta 信息的时候看到了 <meta name="viewport" content="width=device-width"> 这样的内容,所以学习下 Viewport 概念。

viewport 是用户浏览网页时视觉区域的大小,浏览器的可见区域就大,而手机屏幕明显就小。在平板和手机还未流星之前,网页一般都是为计算机浏览器设计,这就通常让网页有一个固定的设计,和固定的宽高。

然后,当我们使用平板或者手机浏览网页时,固定大小的页面内容通常都无法适应 viewport,为了解决这个问题,这些小屏幕设备上的浏览器通常将整个页面缩放来适应屏幕大小。所以才有了 html 标签中 viewport 的概念。

设置 viewport

HTML5 在 <meta> 标签中引入了方法让网页设计师可以通过设置该 meta 来控制 viewport 。

<meta name="viewport" content="width=device-width, initial-scale=1">

<meta> 标签让浏览器遵循该原则来控制页面的尺寸和缩放。

  • width=device-width 表示让页面的宽度来适应设备的宽度
  • initial-scale=1.0 设置了浏览器加载页面时的初始缩放大小

其他控制选项,maximum-scaleminimum-scaleuser-scalable 用来控制用户能够缩放的大小。

shrink-to-fit=no 选项时 Safari 特有的,这个选项在 Safari 9.0 引入,防止 Safari 通过缩放来适应宽度。1

reference


2018-09-24 html , viewport , html5 , css

《深入理解 Bootstrap》读书笔记

bootstrap 是 Twitter 开源出来的 CSS 框架,因为用到了就简单的了解一下。

CSS 选择器

每一条 CSS 样式的定义都由两部分组成,形式如下:选择器{样式}。在{}之前的部分就是“选择器”。“选择器”指明了应用这些“样式”的网页元素。

属性选择器

[data-toggle^=button],属性选择器有很多种用法,[attr=value] 表示该属性有确定的值。

子选择器

CSS 子元素用 > 表示,.table > thead > tr > th 表示的是 table 样式,thead 元素内 tr 元素下 th 的样式。

兄弟选择器

兄弟元素分为两种,一种是临近兄弟,一种是普通兄弟。临近兄弟的选择符用“+”表示。比如导航条里要设置两个 li 之间的外边距,则需要如下定义:

.nav-pills > li + li {
  margin-left: 2px;      /* 加大左外边距 */
}

如果只想查找某一个指定元素后面的兄弟节点(而不限制于临近节点),可以使用普通兄弟节点的符号“~”。比如:

.article h1 ~ p {       font-size: 13px;
}

2018-09-23 bootstrap , css , twitter , web-design , html5

使用 kindlegen 命令打包资源到 mobi

KindleGen 是亚马逊提供的一个电子书格式转换工具,在提供格式转换的同时,也可以把 HTML,XHTML,或者特定 opf 格式的源文件内容打包成 Kindle 的电子书格式。关于电子书转换的部分可以参考之前的文章


2018-09-22 kindle , kindlegen , commmand , amazon , mobi , epub , format

每天学习一个命令:使用 modprobe 加载禁用内核模块

Linux 的 modprobe 命令用于从 Linux kernel 中装载和卸载模块。modprobe 可载入指定的个别模块,或是载入一组相依的模块。modprobe 会根据 depmod 所产生的相依关系,决定要载入哪些模块。若在载入过程中发生错误,在 modprobe 会卸载整组的模块。需要注意的是为了方便,模块名中的 -_ 是没有区别的。

modprobe 命令会查找 /lib/modules/'uname -r' 目录中的模块和文件 (uname -r 是内核版本),但是不会查找 /etc/modprobe.conf/etc/modprobe.d/ 目录下配置所排除的内容。

modprobe 命令不会修改模块内容,解析模块内容和使用模块参数是在内核中进行的,所以如果模块装载失败,内核会将失败的日志通过 dmesg 打印出来。

使用

modprobe [-acdlrtvV][--help][ 模块文件 ][ 符号名称 = 符号值 ]

-a 或 --all  载入全部的模块。
-c 或 --show-conf  显示所有模块的设置信息。
-d 或 --debug  使用排错模式。
-r 或 --remove  模块闲置不用时,即自动卸载模块。
-t 或 --type  指定模块类型。
-v 或 --verbose  执行时显示详细的信息。
-V 或 --version  显示版本信息。
-help  显示帮助。

使用 lsmod 显示当前装载的模块

lsmod

显示模块具体信息

modinfo nvidia

禁用内核模块

对内核模块来说,黑名单是指禁止某个模块装入的机制。当对应的硬件不存在或者装入某个模块会导致问题时很有用。

在 /etc/modprobe.d/ 中创建 .conf 文件,然后在文件中使用 blacklist 关键字屏蔽不需要的模块。比如

blacklist nvidia

使用 blacklist 命令会屏蔽一个模块使其不会自动装入,但是如果其他非屏蔽模块需要该模块,系统依然会装入。如果要避免这个行为,可以让 modprobe 使用 install 命令,在 /etc/modprobe.d/blacklist.conf 文件中:

install MODULE /bin/false

使其直接返回导入失败,就可以屏蔽其模块,以及所有依赖的模块。

reference


2018-09-21 linux , modprobe , kernel

小米笔记本 Air 13.3 在 Linux Mint 下安装 nvidia 驱动

先来说说前因后果,因为使用之前 msi 上的系统恢复到小米笔记本 所以也不存在 wifi 驱动的问题,恢复完成之后一切都非常顺利,所有的一切设置都和之前的笔记本一致,唯一让我不满意的就是说好的续航非常给力呢,实际使用也只有短短三个小时,比我之前的 GE60 好不到哪里去。所以我就在想问题出在哪里,显卡肯定是首要原因。

另外其他的耗电可以使用

sudo apt install powertop

然后使用 sudo powertop 来查看,基本上也就是显示屏,wifi 模块耗电之外,如果看到其他不正常的耗电就需要仔细查看一下了。

Nvidia

所以第一件事情就是安装 NVIDIA 驱动,并且在设置中禁用独立显卡,而是 intel 的集成显卡。在官网找到小米笔记本使用的 MX150 显卡驱动:

当前时间最新的驱动版本是 NVIDIA-Linux-x86_64-390.87.run 这个,随着时间推进可能会有最新的版本。

下载完成之后更改文件的权限,如果给予可执行权限,之后也可以使用 sudo bash NVIDIA-Linux-x86_64-390.87.run 来执行。

sudo chmod a+x NVIDIA-Linux-x86_64-390.87.run

删除原有 NVIDIA 驱动

sudo apt-get --purge remove nvidia-*
sudo apt-get --purge remove xserver-xorg-video-nouveau

重启电脑,使用 Ctrl + Alt +F1 到控制台(Ctrl+Alt+F7 是回到桌面),首先登录 root 账号,然后结束图形化界面

sudo service lightdm stop

然后执行安装操作

sudo bash ~/Downloads/NVIDIA-Linux-x86_64-390.87.run --no-x-check --no-nouveau-check --no-opengl-files

这边三个参数表示:

  • --no-x-check 安装驱动时关闭 X 服务
  • --no-nouveau-check 安装驱动时禁用 nouveau
  • --no-opengl-files 只安装驱动文件,不安装 OpenGL 文件

更多的参数可以参考官网的说明

安装过程中可能会出现提示

  • The distribution-provided pre-install script failed are you sure you want to continue,没关系,继续进行
  • Would you like to register the kernel module sources with DKMS? This will allow DKMS to auomatically build a new module,if you install a different kernel later,选择 No
  • Nvidia’s 32-bit compatibility libraries,选择 no 即可

安装完成之后

sudo service lightdm start

重启图形化界面,sudo reboot 或者登录再重启

重启后,输入以下命令

nvidia-smi

会显示当前驱动的版本和基本信息

nvidia-smi
Thu Sep 20 22:33:25 2018
+-----------------------------------------------------------------------------+
| NVIDIA-SMI 390.87                 Driver Version: 390.87                    |
|-------------------------------+----------------------+----------------------+
| GPU  Name        Persistence-M| Bus-Id        Disp.A | Volatile Uncorr. ECC |
| Fan  Temp  Perf  Pwr:Usage/Cap|         Memory-Usage | GPU-Util  Compute M. |
|===============================+======================+======================|
|   0  GeForce MX150       Off  | 00000000:01:00.0 Off |                  N/A |
| N/A   44C    P0    N/A /  N/A |    101MiB /  2002MiB |      2%      Default |
+-------------------------------+----------------------+----------------------+

+-----------------------------------------------------------------------------+
| Processes:                                                       GPU Memory |
|  GPU       PID   Type   Process name                             Usage      |
|=============================================================================|
|    0      2986      G   /usr/lib/xorg/Xorg                           101MiB |
+-----------------------------------------------------------------------------+

Cinnamon 耗电

重启电脑 Cinnamon 报错

cinnamon running without video hardware acceleration

Running in software rendering mode Cinnamon is currently running without video hardware acceleration and, as a result, you may observe much higher than normal CPU usage. There could be a problem with your drivers or some other issue. For the best experience, it is recommended that you only use this mode for troubleshooting purposes.

reference


2018-09-20 linux-mint , nvidia

电子书

最近文章

  • Git worktree 作用及使用 在偶然逛 Stackoverflow 的时候看到一个提问,能不能在同一个 repo 中同时有两份代码,并且可以保持两份相似但不是完全相同的代码并行开发?虽然对其需求有些好奇和疑惑 ,但也关注了一下下方的回答。
  • CPU 负载 之前在 Openwrt 负载 中也曾经谈到过 CPU 的负载,通过 top, uptime 等等命令都可以非常快速的查询当前 CPU 的负载。
  • Jenkins 使用 流水线任务
  • jks pem cer pfx 不同种类的证书 通常在安全级别较高的场景经常需要对通信信息进行加密传输,有一种情况就是非对称加密,将信息使用对方提供的公钥加密传输,然后对方接收到之后使用私钥解密。今天在对接时对方发送了一个压缩包,其中包含了 SSL 不同类型的证书,包括了 jks, pem, cer, pfx 等等文件,现在就来了解一下。
  • Spring 中的 @Transactional 注解 Spring 中有两种不同方式实现事务 —- annotations 和 AOP。