KIE 一些隐藏需要注意的问题

KIE 的使用和踩坑记录。

Guided Decision Table 的顺序

决策表默认使用的是 None 的 hit policy,这里涉及到一个问题也就是规则执行的顺序,默认的 None 其实是并发所有规则一同执行的,那么也就隐藏了一问题,如果传入的参数满足多条规则,那么极有可能造成结果不符预期的情况。

更多关于决策表 Hit Policy 的内容可以参考这篇 —- 决策表规则执行顺序

  • None 默认,多行可以同时被执行,verification 会将冲突 warning 出来
  • Resolved Hit,根据优先级,每一次只有一行可以被执行,不管在列表中的顺序。可以维持界面中的顺序,转而定义每一行的优先级
  • Unique Hit, 一次只能执行一行,每一行必须 Unique,条件不能有重叠,如果多于一行被执行,会有 warning
  • First Hit,依据表中的顺序,从上到下,每一次执行一行
  • Rule Order,多行可以同时执行,verification 不会将冲突警告

比如对于这条规则

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"

表示的是顺序从上到下一条一条执行。


2018-09-29 kie , jboss , rule-engine

需要注意的 Python round() 方法

今天无意间看到 Python 的 round() 方法,它支持第二个可选参数 round(number[, ndigits]) ,看其文档可以知道

  • 当 ndigits 为 None 时,返回返回距离最近的整数
  • 当 ndigits 不为空时,则返回小数点后面 n 精度的 float 数字

所以可以简单的将该函数记忆成四舍五入的方法,然而该方法在执行过程中有些情况需要特别注意,尤其是在输入数字为浮点数时。

正负数

>>> round(0.5)
1.0
>>> round(-0.5)
-1.0

Python 不同版本之间差异

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'>

Attention

另外需要注意的是,因为 Float 在不同机器上表示方式不是精确的,所以在计算四舍五入时会发现有些数字会有很奇怪的输出,比如官方文档上给出的 2.675,保留 2 位,那么结果是:

>>> round(2.675,2)
2.67

Tips

另外 round 的第二个参数可以传入负数

>>> round(1234, -3)
1000.0

2018-09-28 python , round , programming , tips

威联通折腾篇十一: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 的配置目录

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

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

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

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

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.

默认开启 Fn 功能键

Linux 下默认 F1-F12 功能键都是不启用的,按下 Fn+ESC(LOCK) 键,开启默认 Fn 功能。

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。

  • [[epubcheck]]

reference


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

电子书

本站提供服务

最近文章

  • 2024 年台北之行 去年的时候就得知了海外的大陆人可以通过官方网站申请入台证,从而可以在海外直接入境台湾,所以 4 月份女朋友过来日本之后就通过线上系统申请了入台证,入台证申请通过并付费之后是只有 3 个月有效期的,因为我们申请的比较晚,所以有效期的三个月正好落在了最热的 7,8,9 月份,但考虑到暑假有假期,我们还是决定硬着头皮买了机票。
  • macOS 上的多栏文件管理器 QSpace QSpace 是一个 macOS 上的多窗口平铺的文件管理器,可以作为 Finder 的代替,在 Windows 上曾经用过很长时间的 [[Total Commander]],后来更换到 Linux Mint 之后默认的文件管理器自带多面板,反而是用了很多年 macOS ,才意识到原来我缺一个多窗口,多面板的文件管理器。
  • Dinox 又一款 AI 语音转录笔记 前两天介绍过 [[Voicenotes]],也是一款 AI 转录文字的笔记软件,之前在调查 Voicenotes 的时候就留意到了 Dinox,因为是在小红书留意到的,所以猜测应该是国内的某位独立开发者的作品,整个应用使用起来也比较舒服,但相较于 Voicenotes,Dinox 更偏向于一个手机端的笔记软件,因为他整体的设计中没有将语音作为首选,用户也可以添加文字的笔记,反而在 Voicenotes 中,语音作为了所有笔记的首选,当然 Voicenotes 也可以自己编辑笔记,但是语音是它的核心。
  • Emote 又一款 AI 语音笔记应用 继发现了 Voicenotes 以及 Dinox 之后,又发现一款语音笔记 Emote,相较于前两款应用,Emote 吸引我的就是其实时转录的功能,在用 Voicenotes 的时候时长担心如果应用出现故障,没有把我要录下来的话录制进去,后期怎么办,而 Emote 就解决了这个问题,实时转录的功能恰好作为了一个声音录制的监听。
  • 音流:一款支持 Navidrome 兼容 Subsonic 的跨平台音乐播放器 之前一篇文章介绍了Navidrome,搭建了一个自己在线音乐流媒体库,把我本地通过 [[Syncthing]] 同步的 80 G 音乐导入了。自己也尝试了 Navidrome 官网列出的 Subsonic 兼容客户端 [[substreamer]],以及 macOS 上面的 [[Sonixd]],体验都还不错。但是在了解的过程中又发现了一款中文名叫做「音流」(英文 Stream Music)的应用,初步体验了一下感觉还不错,所以分享出来。