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 出版社出版,这个系列会侧重于该语言,该工具的使用技巧和方法,会涵盖周边的工具库,算法等等,包含大量的编程技巧和示例代码。该系列的书比较实用,目录编排会通过实例来展示工具或者语言的实用,是一种实用主义的书。

该系列的书能够让读者认识到是什么,怎么用,最后能够做什么。

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

常见的比如:

  • 《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 Android Development》

Thinking in XXX

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

该系列常见的:

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

Dive into XXX

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

常见;

  • 《Dive into Python》

总结

对于新的一项技术,如果处于是什么都不太清楚的状态,推荐先找 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

威联通折腾篇九:使用 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

每天学习一个命令:使用 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

epub 格式解析

epub 是一个电子书标准,最近在研究电子书解析,所以有了此文。

一个标准的未加密的 epub 电子书大致由以下三部分组成:

  • META-INF 文件夹,其中包含 container.xml 文件
  • OEBPS 文件夹,包含 images,xhtml 文件,css 样式和 content.opf 文件
  • mimetype 文件,内容为 application/epub+zip

META-INF 文件夹

META-INF 用于存放电子书信息,默认情况包含一个 container.xml 文件:

<?xml version="1.0" encoding="UTF-8"?>
<container version="1.0" xmlns="urn:oasis:names:tc:opendocument:xmlns:container">
    <rootfiles>
        <rootfile full-path="OEBPS/content.opf" media-type="application/oebps-package+xml"/>
   </rootfiles>
</container>

该文件告诉电子书阅读器,文件的根文件路径和格式。除去 container.xml 文件外,标准还规定了其他可选文件:

  • manifest.xml 文件列表
  • metadata.xml 元数据
  • sigatures.xml 数字签名
  • encryption.xml 加密
  • rights.xml 权限管理

这些文件是可选的。

OEBPS 文件夹

OEBPS 文件夹用于存放真正的图书内容,包括 content.opf 文件,toc.ncx 目录文件,正文内容,css 样式文件,字体文件,封面,图片等等资源。

OPF 文件

opf 文件是 epub 最为重要的文件,是标准的 xml 文件,文件的根元素是 <package>

<package version="2.0" unique-identifier="BookId" xmlns="http://www.idpf.org/2007/opf">

此文件的主要内容由下面组成:

第一部分,<metadata> 元数据,包含书籍的出版信息,主要由两个子元素组成

  • dc:metadata 元素,使用 Dublin Core, 包含 15 项核心元素:

    • dc:title
    • dc:creator 责任者
    • dc:subject 主题关键词
    • dc:description
    • dc:publisher
    • dc:contributor
    • dc:date
    • dc:type
    • dc:format
    • dc:identifier
    • dc:source 来源
    • dc:language
    • dc:relation
    • dc:coverage 覆盖范围
    • dc:rights 权限描述
  • meta 标签,扩展元素,如果有信息在上面标签中无法描述,则扩展到该 meta 中

举例

<metadata xmlns:opf="http://www.idpf.org/2007/opf" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <dc:language>zh-CN</dc:language>
  <dc:title>圣殿春秋</dc:title>
  <dc:creator opf:role="aut" opf:file-as="雨浪飘零">『英』肯·福莱特</dc:creator>
  <dc:publisher>上海译文出版社</dc:publisher>
  <meta content="0.9.6" name="Sigil version" />
  <dc:date xmlns:opf="http://www.idpf.org/2007/opf" opf:event="modification">2016-07-16</dc:date>
  <dc:identifier opf:scheme="UUID" id="BookId">urn:uuid:97cabb7a-2ab9-4fe2-a56b-c075114f2187</dc:identifier>
  <meta name="cover" content="cover.jpg" />
</metadata>

第二部分为 <manifest> 文件列表,该列表中包含出版物的所有文件,每一行由一个 item 构成

<item id="ncx" href="toc.ncx" media-type="application/x-dtbncx+xml"/>

其中:

  • id 为文件 id
  • href 为文件相对路径
  • media-type 为文件的媒体类型

举例,文件内容有删减

<manifest>
  <item id="ncx" href="toc.ncx" media-type="application/x-dtbncx+xml"/>
  <item id="Preface03.xhtml" href="Text/Preface03.xhtml" media-type="application/xhtml+xml"/>
  <item id="Part00.xhtml" href="Text/Part00.xhtml" media-type="application/xhtml+xml"/>
  <item id="Part01.xhtml" href="Text/Part01.xhtml" media-type="application/xhtml+xml"/>
  <item id="Part02.xhtml" href="Text/Part02.xhtml" media-type="application/xhtml+xml"/>
  <item id="appendix.xhtml" href="Text/appendix.xhtml" media-type="application/xhtml+xml"/>
  <item id="main.css" href="Styles/main.css" media-type="text/css"/>
  <item id="Title.xhtml" href="Text/Title.xhtml" media-type="application/xhtml+xml"/>
  <item id="Intro1.xhtml" href="Text/Intro1.xhtml" media-type="application/xhtml+xml"/>
  <item id="Author.html" href="Text/Author.html" media-type="application/xhtml+xml"/>
  <item id="Preface01.xhtml" href="Text/Preface01.xhtml" media-type="application/xhtml+xml"/>
  <item id="cover.xhtml" href="Text/cover.xhtml" media-type="application/xhtml+xml"/>
  <item id="part01.jpg" href="Images/part01.jpg" media-type="image/jpeg"/>
  <item id="Part06_17.xhtml" href="Text/Part06_17.xhtml" media-type="application/xhtml+xml"/>
  <item id="chapter.png" href="Images/chapter.png" media-type="image/png"/>
  <item id="logo.png" href="Images/logo.png" media-type="image/png"/>
  <item id="cover.jpg" href="Images/cover.jpg" media-type="image/jpeg"/>
  <item id="cover_slim.jpg" href="Images/cover~slim.jpg" media-type="image/jpeg"/>
  <item id="Monarch.ttf" href="Fonts/Monarch.ttf" media-type="application/x-font-ttf"/>
  <item id="backcover.xhtml" href="Text/backcover.xhtml" media-type="application/xhtml+xml"/>
  <item id="backcover.jpg" href="Images/backcover.jpg" media-type="image/jpeg"/>
  <item id="backcover_slim.jpg" href="Images/backcover~slim.jpg" media-type="image/jpeg"/>
  <item id="Info.xhtml" href="Text/Info.xhtml" media-type="application/xhtml+xml"/>
</manifest>

第三部分为 <spine toc="ncx"> 提供图书线性阅读的次序,由子元素 itemref 组成

<itemref idref="cover.xhtml">

其中 idref 为 manifest 中列出的 id

<spine toc="ncx">
    <itemref idref="cover" />
    <itemref idref="copyright" />
</spine>

第四部分为 <guide> ,列出了电子书的特定页面,比如封面,目录,序言等等,属性值指向文件地址。该部分可选。

<guide>
  <reference type="cover" title="封面" href="Text/cover.xhtml"/>
</guide>

第五部分,<tour> 导读,根据读者的不同水平,按照一定次序选择电子书部分页面组成导读,可选。

NCX 文件

ncx 文件也是 epub 中非常重要的文件,该文件用于电子书的目录,文件命名通常为 toc.ncx,ncx 文件也是一个 xml 文件。ncx 全称为 Navigation Center eXtended。

ncx 文件中最主要的节点是 navMap,navMap 节点又由很多 navPoint 节点组成,navPoint 节点由 navLabel 和 content 节点组成。

<navMap>
  <navPoint id="navPoint-1" playOrder="1">
    <navLabel>
      <text>圣殿春秋</text>
    </navLabel>
    <content src="Text/cover.xhtml"/>
    <navPoint id="navPoint-2" playOrder="2">
      <navLabel>
        <text>作品简介</text>
      </navLabel>
      <content src="Text/Intro1.xhtml"/>
    </navPoint>
  ...
    <navPoint id="navPoint-7" playOrder="7">
      <navLabel>
        <text>前言</text>
      </navLabel>
      <content src="Text/Preface03.xhtml"/>
    </navPoint>
  </navPoint>
</navMap>
  • navPoint 节点中,playOrder 属性定义当前项在目录中的次序,text 子节点则定义了目录的名字
  • content 子节点 src 属性定义了章节文件的具体位置

navPoint 节点可以嵌套,形成了整本书的层级结构。

opf 文件定义了读者在顺序阅读时用到的章节和顺序,而 ncx 文件则定义了目录中用到的章节和顺序。如果存在附录形式的内容,希望在目录中出现,而不希望在正文中出现时,而已通过设置两个不同来达到目的。

在了解了这些标准内容之后,解析 epub 格式就比较简单了,python 可以使用 ebooklib 这个库。他的使用相对比较简单,也就一个 epub 类,具体使用可以参考 GitHub,不过需要注意的是很多 epub 格式的书并没有完全按照标准生成,所以有些地方还得自己 hack。

reference


2018-09-19 epub , ebook , python-lib , parse

电子书常见格式及格式转换

最近因为写 kindle 推书的服务,所以不得不接触到了不同的电子书格式,mobi,epub, azw3,都比较常见,kindle 只支持 mobi 格式,所以亚马逊提供 了 KendleGen 这个工具来将 epub 转换为 mobi 格式。

也正是因为这个结果,所以现在基本上也只有 python 读写 epub 的库,mobi 的读写目前做的也不是很好。如果单纯的只是想要转格式 Calibre 已经做的很好了,UI 也有。这里只是谈论编程方式读写 epub 格式。

格式

最近几年因为 Kindle 的介入,图书电子化的趋势越来越明显,虽然各大厂都在推自己的协议,但通常流行的也无非就那几个,epub, mobi,azw3 等等

epub

epub 的全称是 Electronic Publication 是一个开放的标准化电子书格式,这个标注的格式针对阅读设备优化了字体显示,epub 文件能够被不同的设备打开。

需要注意的是,虽然 ePub 格式是一个开放的格式,但是不是所有的图书都按照标准的 epub 格式来生成。1

一个典型的 epub 格式资源包含如下:

.
├── chapter001.html
├── chapter002.html
├── chapter003.html
├── chapter004.html
├── content.opf
├── cover.jpeg
├── index.html
├── META-INF
│   ├── calibre_bookmarks.txt
│   └── container.xml
├── mimetype
├── postscript.html
├── preface.html
├── stylesheet.css
├── titlepage.xhtml
└── toc.ncx

解释:

  • content.opf 该文件包含书籍的 meta 信息,包括书名,介绍,作者,ISBN 等等,dc 是 Dublin Core metadata 的缩写,最小的 epub 要求 DC:identifierDC:titleDC:language 这三项

      <dc:title>失控:机器、社会与经济的新生物学</dc:title>
      <dc:publisher>新星出版社</dc:publisher>
      <dc:rights>2010, 新星出版社</dc:rights>
      <dc:identifier id="uuid_id" opf:scheme="uuid">6ae9aa9a-8077-4a21-9658-d3656c96810d</dc:identifier>
    
  • toc.ncx 就不说了 toc 很熟悉,目录
  • mimetype mimetype 文件
  • *.html 文件就是书的文本内容,不同的书可能命名不一样,但是总体都是 html 文件
  • *.css 样式文件
  • cover.jpg 封面图片

详细的 epub 结构可以参考这里

mobi 格式

mobi 格式最早是由法国 Mobipocket 公司为个人掌上设备推出的电子书格式,后来该公司被 Amazon 收购,所以 mobi 格式也成为了 Kindle 的默认支持格式。2

azw, azw3

看名字就知道这是 Amazon kindle 的私有格式了。

格式转换

使用 Calibre

如果不熟悉命令行,可以使用 Calibre 这个强大的电子书管理软件,epub 到 mobi,mobi 到 epub,pdf 到 mobi 多种格式任意切换,还能一键发送到 kindle

Calibre ebook-convert

如果熟悉 ebook-convert 可以直接使用命令行来转换

ebook-convert book_name.epub book_name.mobi

关于命令使用详情,可以参考 Calibre 官网

ebook-convert 支持非常多的格式转换,具体的格式可以参考官网

Python 代码

def epub2mobi(book_path):
    import subprocess
    filename = os.path.basename(book_path)
    dirname = os.path.dirname(book_path)
    name, ext = os.path.splitext(filename)
    if ext != '.epub':
        return
    try:
        subprocess.call(['ebook-convert', book_path, os.path.join(dirname, name + '.mobi')])
    except Exception as e:
        logger.exception('convert error')

KindleGen

使用 Amazon 提供的二进制命令将 epub 转化为 mobi

*************************************************************
 Amazon kindlegen(Linux) V2.9 build 1028-0897292
 A command line e-book compiler
 Copyright Amazon.com and its Affiliates 2014
*************************************************************

Usage : kindlegen [filename.opf/.htm/.html/.epub/.zip or directory] [-c0 or -c1 or c2] [-verbose] [-western] [-o <file name>]
Note:
   zip formats are supported for XMDF and FB2 sources
   directory formats are supported for XMDF sources
Options:
   -c0: no compression
   -c1: standard DOC compression
   -c2: Kindle huffdic compression
   -o <file name>: Specifies the output file name. Output file will be created in the same directory as that of input file. <file name> should not contain directory path.
   -verbose: provides more information during ebook conversion
   -western: force build of Windows-1252 book
   -releasenotes: display release notes
   -gif: images are converted to GIF format (no JPEG in the book)
   -locale <locale option> : To display messages in selected language
      en: English
      de: German
      fr: French
      it: Italian
      es: Spanish
      zh: Chinese
      ja: Japanese
      pt: Portuguese
      ru: Russian
      nl: Dutch

工具库

Unpack mobi 库

下面的工具可以将 mobi 文件拆包,提取 azw3、mobi 的 epub。

https://github.com/kevinhendricks/KindleUnpack

Kindle 相关工具集

https://github.com/ywzhaiqi/MyKindleTools

Calibre 的 ebook-meta 工具

https://manual.calibre-ebook.com/generated/en/ebook-meta.html

利用该工具能够快速的获取各种格式电子书的 mata 信息,包括封面信息。3

reference

  1. http://sourcefabric.booktype.pro/booktype-23-for-authors-and-publishers/importing-a-book/ 

  2. https://en.wikipedia.org/wiki/Mobipocket 

  3. https://stackoverflow.com/a/35501566/1820217 


2018-09-18 ebook , epub , mobi , pdf , convert , kindlegen , calibre , python , python-lib

配一副眼镜

在中国无论是购买什么东西,都需要对这一个行业进行深度的了解,不然就会被坑,眼镜同理。回想一下我自己的戴的眼镜已经八年多,现在感觉是佩戴眼镜已经不舒服,所以就想要做个简单的了解。

从定下需求(寻找一副合适、舒服、能够长时间佩戴眼镜),到最后真正验光,下单购买也过去不下两个星期了。所以总结了这篇文章,如果能够帮助到其他人当然更好。

配眼镜相关的步骤无非就是验光,选镜架,选镜片,这主要的三个步骤,其中验光、镜片这两个步骤对我来说是最繁杂的部分,我上一次验光可能还是八、九年前,关于眼睛的度数散光也没怎么注意,但是验光的准确性对于配眼镜是非常重要的一步。另外就是镜片的选择,市场上的镜片种类太多,而普通消费者其实完全无从比较,对于眼镜这类必需的非消耗品来说,换镜的周期可能就是以年计,所以镜片与镜片之间的显微差异普通人是很难找准区别的。在加上眼镜店里面展示的镜片的各种系数,各种“功能”可能对于普通消费者来说就非常难以选择了。

镜架材质

对于镜架材质,其实个人的需求并不是很高,所以只做了简单的了解。市面上主流的眼镜架材质:

  • TR 又称记忆塑料,类似于金属的钛合金,算是比较高档的塑胶制品
  • 板材
  • 金属,不易发生变形

对于更加专业的镜架选择,可以参考 https://zhuanlan.zhihu.com/p/23626916 关于材质可以参考这篇

眼镜折射率

很多人,比如我,可能到眼镜店或者网上查找相关材料的时候就被这个镜片后面带着的 1.56,1.67 这个系数唬到了,其实这个系数就是光学玻璃的两个重要参数之一的折射率,另外一个系数阿贝数在下面提到。

折射率越高,透光率越低,色散越厉害,从成像质量讲低折射率的镜片更好。但是折射率高,镜片越薄,也相对来说越轻。

蔡司的阿贝数,用来衡量介质的光线色散程度,阿贝数越大,色散就越小,反之,阿贝数越小,则色散就越大,其成像的清晰度就越差。镜片的阿贝数与折射率有一定关系,材料的折射率越大,色散越厉害,即阿贝数越低。

https://zh.wikipedia.org/wiki/%E9%98%BF%E8%B4%9D%E6%95%B0

镜片并非很多销售人员说的折射率越高越好,要根据自身的情况进行选择。

折射率选择参考:(仅作为参考,不要机械对照)

折射率 度数
1.56 0 — 400°(-4.00D)
1.60 300°(-3.00D)—600°(-6.00D)
1.67 400°(-4.00D)—800°(-8.00D)
1.74 800°(-8.00D)以上

球面和非球面镜片的区别

球面镜片是指从球体上切下一部分带有凸面或凹面形状的镜片。由于球面镜片难以避免的会出现像差(特别是像散像差,像弯像差)等等现象,所以出现了补正球面镜片缺点的镜片——非球面(单面非球)。

非球面的设计,将镜片边缘像差减底修正了影像,解决视界歪曲等问题,使成像更自然,视野更宽阔,可以满足顾客的需求,同时,使镜片更轻、更薄、更平。

非球面镜片就是指在所有子午线上的具有相同的非圆截面的旋转面 (如抛物线)。其最大优点就是边缘视野无物象扭曲现象,镜片边缘比普通球面镜片薄 1/3 左右。

就目前而言,非球面镜片的确更接近裸眼的视觉,镜片边沿的变形也小一些,视野更大一点,已经是主流的配制了。而且非球面镜片已经非常成熟,价格上的差异很小。但并非每个人都能适应,不排除有些人的眼睛就只能适应球面镜片。

渐进片

在和眼镜店职员聊天的时候,有推荐过抗疲劳镜片,多焦点渐进片,这部分内容我并没有关心,对于我来说大部分时间是近距离看电脑,多焦点渐进,其实对我而言并不是那么有用,所以这部分也就略过了。

镜片品牌

依视路,蔡司,豪雅,精工,凯米,罗敦司得,性价比高的,明月、柯达、康耐特、凯米 等等,镜片的选择就依据个人经济承受能力而定吧,各种各样,便宜昂贵的镜片都有,在自己的经济能力范围内选择一个合适的镜片即可。

好的镜片主要是有三个要素组成:镀膜、材料、设计。

耐划伤(硬度高)、防水防油污(光滑)、贴合性好(不脱膜)

蔡司

德国品牌,1846 年创立

蔡司是国际上公认的最好的眼镜镜片,无可挑剔的第一,而价格,还算是比较贵的,但是有一些眼镜店,蔡司的镜片价格可以卖的比较低,如果找到了,还算是比较好的,能打到 5-6 折就笑吧。但是蔡司入门的 A 系列莲花膜镜片,耐脏性挺好,耐磨性不好,要耐磨,选钻立方膜,价格马上上几个台阶。

依视路

世界五大镜片中排名前三,法国品牌,由创建于 1849 年的依视(Essel)和 1931 年的视路(Silor)两大视光学巨头合并而成。

镜片突出特点:

膜层硬度高,耐磨性能卓著,不易刮伤,防水防油污效果优越。

主打产品推荐:

爱赞数码生活系列,钻晶 A4 防蓝光系列,万里路渐进多焦点系列。

尼康

日本品牌的镜片,品质没得说,只是价格贵,一般门店也很少提供。

豪雅

日本品牌,始创于 1941 年,世界五大镜片排名第二,第三的位置,日本对于工业做工,细节的把控是真的好。

镜片突出特点:

品质稳定,耐磨性能强,防反光性能优越。

主打产品推荐:

兰御膜防蓝光系列,锐美抗疲劳系列。

罗敦司得

德国品牌,始创于 1877 年。这个品牌有点贵,就略过了。

凯米

凯米属于韩国品牌,是韩国一家专业生产树脂镜片厂商品牌,相较于蔡司,依视路等要便宜很多,性价比高

镜片突出特点: 性价比高,品类齐全。

主打产品推荐:

U6 紫外线蓝光双防护系列,Magic Form 渐进多焦点系列。

总结

所以在了解这些知识之后,也就不会在配镜的时候被那么多的名词唬到了。针对自己的情况选择一款合适的眼镜也就没有那么的困难了,这里要感谢互联网上那么多无私分享的人,以上大部分内容都是在 Google 和知乎上搜索出来的内容,当然也有部分是我在路过眼镜店,和在配眼镜的时候和店员聊天所得。

有的时候买卖就是这么一个你情我愿的事情,原本就不是那么麻烦,但是总有些怀着鬼胎的人,让本来一个很普通的事情变得那么曲折。镜片好坏差异程度太大,所以也总有不良商家会以次充好,我之所以会总结这么多的内容,完全就是因为我对市场失去信心所致,我愿意花钱,但是我想要我花的钱值得,这也就是我说的买卖最平等的部分,配镜的店员根据经验给出一个在价格合理的范围内最合理的搭配,而配镜的人依据自己的能力支付并获得一个最值得的眼镜,这就完成了一笔交易。

最后,验光,镜片,加工都是一副好眼镜必不可少的环节,如果可能就找一些品质比较好的医院,或者眼科检查店进行检查。

reference


2018-09-15 眼镜 , 经验

电子书

最近文章

  • MySQL 中的日志配置和管理 MySQL 中默认是没有开启日志记录的,所以需要手动修改配置文件开启日志。而在 MySQL 中我们需要关心的有三类日志:
  • Java 查漏补缺之:ThreadLocal 使用 ThreadLocal 线程本地变量,每个线程保存变量的副本,对副本的改动,对其他的线程而言是透明的。
  • 为知笔记导出和备份 WizNote 已经用了好几年,虽然也一直在续费,但总感觉将死不死,基于整理这几年近 4000 条的笔记的目的,也一方面为迁移出 WizNote 的目的,研究一下 WizNote 笔记导出和备份的方法。
  • Nginx location 匹配规则 之前的关于 Nginx Config 的文章是当时看 Nginx 书记录下来的笔记,很大略,没有实际操作,等终究用到 location 的时候发现还是有很多需要注意的问题,比如匹配的优先顺序,比如 root 和 alias 的区别等等,所以单独拿一篇文章来记录一下目前遇到的问题,并来解决一下。
  • koajs 简单使用 Koa 是一个背靠 Express 的团队设计的全新的 Web 框架,旨在使之成为一个更轻量,更丰富,更加 robust 的基础框架。通过促进异步方法的使用,Koa 允许使用者抛弃 callback 调用,并且大大简化了错误处理。Koa 并没有将中间件绑定到核心代码,而是提供了一组优雅的方法让编写服务更加快速,通过很多第三方的扩展给 Koa 提供服务,从而实现更加丰富完整的 HTTP server。