常看计算机相关图书的话对,Mastering XXX,XXX in Action 肯定不会陌生,不同系列的图书定位是有差别的,刚开始学习一种技术时,选择一本合适的书非常重要。所以这里就我个人的感受来说一下这几个系列的区别。
大部分 Mastering 系列图书都是 Packt Publishing 出版社出版的。Mastering 系列的图书是大而全的书籍,从介绍开始,到使用,再到具体的技术细节都有涉及。翻译为中文一般叫做“精通 XXX”,“深入理解 XXX”。
适合有一定基础的初学者阅读。
常见的有:
Cookbook 系列由 O’REILLY 出版社出版,这个系列会侧重于该语言,该工具的使用技巧和方法,会涵盖周边的工具库,算法等等,包含大量的编程技巧和示例代码。该系列的书比较实用,目录编排会通过实例来展示工具或者语言的实用,是一种实用主义的书。Cookbook 直译是食谱的意思,联想来就能够知道这个系列的书目的是为了让读者能做出一道菜来,通过组织不同的原材料(组织代码),最后获得一道美味的食物(达成的目标)。
该系列的书能够让读者认识到是什么,怎么用,最后能够做什么。其实从 cookbook 原本的意思中也能够感知到
a book that gives instructions on cooking and how to cook individual dishes
适合有一定编程能力的学习者参考。
常见的比如:
in Action
系列的图书也是比较著名的一个系列,一般翻译为 “XXX 实战”,该系列图书由 MANNING 出版社出版,国内一般由人民邮电出版社翻译。听这个名字就知道这是偏实战的一本书,通常情况下会在书中有一个贯穿全书的例子,比如用 Redis 的特性实现某个系统功能等等。
但总得来说也是一本入门级别的书籍,适合初学者和有一定经验的从业者。
常见:
适合初学者,我看过 《Learning Python》 这本,是我看过的所有的 Python 相关书籍中最详细的一本,每一个语言的细节,每一个用法的区别都是非常详细的。
Learning 系列的图书也是 O’Reilly 出版社的系列,这系列的图书比较初级,但是细节部分很详细,推荐初学者快速入门。
常见:
Head First 系列的图书看的不多,最出名的可能是那本《Head First 设计模式》了吧,但是 Head First 系列书我查了一下都比较老,这个系列可能是这里面最没有存在感的一个系列了。至于特色部分等我看一些之后回来补上。
补充 Head First 系列,之所以叫做 Head First 是这个系列的图书开创了一种学习模式,通过大量的配图,对话,营造一种比较好的理解方式,通过联想记忆,让读者能够长时间集中注意力然后达到学习的目的。
常见:
Thinking in 系列,一般翻译为 XXX 编程思想。该系列的图书主要是讲述一种编程思维,用该语言的思维来抽象现实问题。
该系列常见的:
Dive into 系列一般翻译为“深入 XXX”,也是比较全面的介绍性书籍,书籍的组织方式一般也是由浅入深。
常见;
既然已经写了这么多了,也不在乎多这一类的书籍,Primer 最熟悉的一本应该就是 C++ Primer 了,最开始还以为是一本 C++ 中高级的书,但其实是一本初级入门读本,从 Primer 单词的释义就能看出
a book that contains basic instructions
所以见到此类的书大可直接阅读。
对于新的一项技术,如果处于是什么都不太清楚的状态,推荐先找 Learning 系列的图书,如果没有可以找 Mastering 或者 Cookbook 系列的图书,先从直观上对该技术有一个总体的了解,是什么,有什么功能,能够做什么。然后具体对其中的细节进行学习。
在之前介绍 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)
https://www.seleniumhq.org/download/ ↩
KIE 的使用和踩坑记录。
决策表默认使用的是 None 的 hit policy,这里涉及到一个问题也就是规则执行的顺序,默认的 None 其实是并发所有规则一同执行的,那么也就隐藏了一问题,如果传入的参数满足多条规则,那么极有可能造成结果不符预期的情况。
更多关于决策表 Hit Policy 的内容可以参考这篇 —- 决策表规则执行顺序
比如对于这条规则
rule "Row 1 testTable"
activation-group "first-hit-policy-group testTable"
dialect "mvel"
when
data : testData( eval( s == 5 ), eval( 0<=random && random<100 ))
then
data.setResult( "168" );
end
在创建决策表 Asset 的时候,如果选择了 FIRST_HIT
的决策表在每条规则会有条这样的规则:
activation-group "first-hit-policy-group testTable"
表示的是顺序从上到下一条一条执行。
今天无意间看到 Python 的 round() 方法,它支持第二个可选参数 round(number[, ndigits])
,看其文档可以知道
所以可以简单的将该函数记忆成四舍五入的方法,然而该方法在执行过程中有些情况需要特别注意,尤其是在输入数字为浮点数时。
>>> round(0.5)
1.0
>>> round(-0.5)
-1.0
Python 2 中
Python 2.7.13 (default, Aug 27 2018, 10:30:14)
[GCC 5.4.0 20160609] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> round(6.5)
7.0
Python 3 中
Python 3.6.1 (default, Jul 11 2017, 16:32:55)
[GCC 5.4.0 20160609] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> round(6.5)
6
当不提供 ndigits 时返回的是 integer 而提供 ndigits 时提供的是输入参数的类型
>>> type(round(1.4))
<class 'int'>
>>> type(round(1.454,2))
<class 'float'>
另外需要注意的是,因为 Float 在不同机器上表示方式不是精确的,所以在计算四舍五入时会发现有些数字会有很奇怪的输出,比如官方文档上给出的 2.675,保留 2 位,那么结果是:
>>> round(2.675,2)
2.67
另外 round 的第二个参数可以传入负数
>>> round(1234, -3)
1000.0
我手上的这款威联通机身前部有一个 USB 端口,平时用处也不多,但是今天看文档看到了威联通的 USB 一键备份,于是就找到了 Hybird Backup Sync 这样一个内置的应用。以前没仔细研究,发现这个应用能够做的事情还挺多,包括云端备份,或者是 Rsync 备份到 NAS,或者外部硬盘备份,总之这也可以单独拿出来写一篇文章了。
回到 USB 一键备份的主题上来,我原本的习惯并不把 U 盘当做便携的数据存储,大部分情况下 U 盘都是启动盘,装机盘,少部分没有网络环境需要便携的数据备份的时候才会用 U 盘来拷贝一些数据。那么这个时候 USB 一键备份的功能就体现了价值,在我使用 U 盘的绝大多数情况下我都不会将资料存放在 U 盘中超过一天,基本上随用随拷贝,用完即删除。所以往往有些时候从外部拷贝了一些材料,那么就可以往 NAS 上一插,自动进行备份即可。
USB 一键备份的设置在 Hybird Backup Sync 应用中,最下方外部备份,其中有一个 Tab 就是 USB 一键备份设置,如果前端的备份按钮无效,到这边设置下看看是否设置正确。在该设置下可以选择存储设备连接到前端 USB 的运行模式:
设置为一键备份之后,可以设置备份方向,一般都是从 USB 到 NAS 吧。
将 U 盘连接前端 USB
无奈现在还是很多人使用百度云,以前用一个 bcloud 在 linux 上还能解决 80% 的需求,但是后来封了,也就一直没有理。不过后来发现 aria2 也能够现在百度云的资源,所以想着 qnap 威联通上也应该是能够安装的,使用 docker 会更加容易些。
在 Container Station 中搜索 xujinkai/aria2-with-webui
安装即可。镜像是开源的地址在:https://github.com/XUJINKAI/aria2-with-webui
在设置中,网络选项下需要注意
其中容器的 8080 端口可以选择性映射,这个端口用来浏览下载的目录列表,对于暴露外网的服务千万小心。
所以映射完之后,威联通的 6800 端口是 webui 界面,6080 端口是 aria2 服务的端口。
在共享文件夹选项中,可以设置需要挂载的本机共享文件夹,镜像中有两个挂载路径
/data
这个挂载点用来存放下载的文件目录/conf
这个挂载点是 aria2 的配置目录分别在威联通上新建共享目录来挂载这两个目录即可。
docker run -d \
--name aria2-with-webui \
-p 6800:6800 \
-p 6080:80 \
-v /share/aria2-data:/data \
-v /share/aria2-conf:/conf \
-e PUID=1000 \
-e PGID=1000 \
-e SECRET=NOBODYKNOWSME \
xujinkai/aria2-with-webui
在完成容器创建之后,可以访问 http://[qnap-ip]:6080 来浏览 aria2 webui,在界面中找到“设置”,“连接设置”
在 aria2 RPC 主机和端口设置中,设置主机地址为威联通的 IP 地址,或者远程域名,端口为 6800
,如果设置了密码,需要在这里配置密码。
设置密码的过程,在 /conf
挂载点,找到 aria2.conf
文件,在文件中添加配置
rpc-secret=123456
如果在外网访问,一定要设置这个密码,如果在内网,可以不用设置。
在保存配置文件之后,需要重启容器。
在完成 aria2 的安装之后,就是如何将百度云的内容导出到 aria2 下载,答案就是 BaiduExport
手动安装插件之后,重新刷新百度云网页,在选中文件之后就会看见多出来一个 “导出下载”的按钮,在 aria2 rpc 的设置中,填写 rpc 服务地址
http://[qnap-ip]:6800/jsonrpc
如果设置了密码令牌,则需要
http://token:123456@[qnap-ip]:6800/jsonrpc
此时,选中想要下载的文件,然后使用 ARIA2 RPC
导出下载,然后去 WEBUI 查看下载状态即可。
在看 html meta 信息的时候看到了 <meta name="viewport" content="width=device-width">
这样的内容,所以学习下 Viewport 概念。
viewport 是用户浏览网页时视觉区域的大小,浏览器的可见区域就大,而手机屏幕明显就小。在平板和手机还未流星之前,网页一般都是为计算机浏览器设计,这就通常让网页有一个固定的设计,和固定的宽高。
然后,当我们使用平板或者手机浏览网页时,固定大小的页面内容通常都无法适应 viewport,为了解决这个问题,这些小屏幕设备上的浏览器通常将整个页面缩放来适应屏幕大小。所以才有了 html 标签中 viewport 的概念。
HTML5 在 <meta>
标签中引入了方法让网页设计师可以通过设置该 meta 来控制 viewport 。
<meta name="viewport" content="width=device-width, initial-scale=1">
<meta>
标签让浏览器遵循该原则来控制页面的尺寸和缩放。
width=device-width
表示让页面的宽度来适应设备的宽度initial-scale=1.0
设置了浏览器加载页面时的初始缩放大小其他控制选项,maximum-scale
,minimum-scale
,user-scalable
用来控制用户能够缩放的大小。
shrink-to-fit=no
选项时 Safari 特有的,这个选项在 Safari 9.0 引入,防止 Safari 通过缩放来适应宽度。1
bootstrap 是 Twitter 开源出来的 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;
}
KindleGen 是亚马逊提供的一个电子书格式转换工具,在提供格式转换的同时,也可以把 HTML,XHTML,或者特定 opf 格式的源文件内容打包成 Kindle 的电子书格式。关于电子书转换的部分可以参考之前的文章
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
使其直接返回导入失败,就可以屏蔽其模块,以及所有依赖的模块。