分类 软件技术 下的文章

使用Adobe Acrobat修改带签名的PDF文(fa)档(piao)

前言:

PDF文档,即Portable Document Format,看名字就知道,这是一种便携式文档格式。它是Adobe公司设计的,主要目的是为了能提供高度一致的效果,而与打开文档的设备软硬件环境无关。我们平时查看PDF文档用的工具一般是Adobe Acrobat Reader DC,它是免费的;但它只是阅读器,不能修改PDF文档,我们一般使用付费的Adobe Acrobat或一些其他软件修改或打包PDF文档。某些特殊情况,我们可能需要修改的PDF文档存在签名(最常见的比如电子发票),而存在签名的PDF文档是无法修改的,而Adobe Acrobat没有去除签名的功能,此时该怎么办呢?

准备:

  • 要处理的文档
  • 一台安装了Adobe Acrobat软件的电脑一台

操作:

方法一:

  1. 准备好要修改的文档,准备好文档保存的文件夹并在资源管理器中打开,资源管理器中空白处鼠标右击 ,点击 新建 -> 文本文档 新建一个空白的TXT文件,名称随意,建议可使用最终PDF要保存的文件名。
  2. 打开Adobe Acrobat,依次点击 文件 -> 创建 -> 从文件创建PDF(或直接按 Ctrl+N ),在弹出的打开对话框中双击选择上一步新建的TXT文件打开。
  3. 点击:工具 -> 组织页面 ,在弹出的选项中点击 插入 -> 从文件(或直接按 Shift+Ctrl+I ),在弹出的对话框中双击选择原始PDF文档以完成选定。在弹出的 插入页面 对话框中,位置下拉列表选择 之前 ,设置好需要的页码范围,点击 确定 完成插入。
  4. 组织页面 功能下,使用鼠标单击选中创建PDF文档时产生的空白页面,点击 删除 按钮(或直接按 Del),在弹出的对话框中点击确定删除多余页面。
  5. 点击:工具 -> 编辑PDF ,这时便会发现,文档已经是可以编辑的状态了。使用键盘鼠标改动一番,然后点击 保存文件 图标或按 Ctrl+S ,在弹出的保存页面中选择保存的路径,输入要保存的文件名,点击 保存 图标或按 Alt+S 完成保存。最初创建的空白TXT文档也可以删除了。

方法二:

  1. 准备好要修改的文档,准备好文档保存的地方,使用Adobe Acrobat打开文档。
  2. 点击:工具 -> 组织页面 ,页面范围选择 所有页面 ,点击 提取 选项,保持 “在提取后删除页面” 和 “将页面提取为单独文件” 未勾选,点击 提取 按钮完成提取。
  3. 点击:工具 -> 编辑PDF ,这时便会发现,文档已经是可以编辑的状态了。使用键盘鼠标改动一番,然后点击 保存文件 图标或按 Ctrl+S ,在弹出的保存页面中选择保存的路径,输入要保存的文件名,点击 保存 图标或按 Alt+S 完成保存。

明显,方法二步骤更简单一些。

注:本文只针对未加密的已签名PDF文档有效,且修改保存后文件的签名也不复存在。不同版本操作可能会有变化,请自行观察软件功能,灵活操作。本方法可能随着软件版本更迭而失效,本文使用的软件版本是:2019.008.20080。

PGP加密电子邮件通信——使用Thunderbird搭配内置OpenPGP收发加密邮件

前言

The natural flow of technology tends to move in the direction of making surveillance easier,

the ability of computers to track us doubles every eighteen months.

----Phil Zimmermann

众所周知,通过互联网传输的的数据很容易被第三方监听和篡改。而我们发送电子邮件时,其数据会通过运营商线路发送到发件人邮件服务提供商的服务器,由服务商的服务器将电子邮件投递到收件人邮箱对应服务商的服务器,最终收件人从服务器上接收邮件。虽然目前绝大多数服务商支持传输过程的TLS加密,这基本杜绝传输中的泄密。但是,邮件原文仍会在双方邮件服务提供商的服务器上留存,这里留下了泄密的风险。如果有一种方案,在发件方发送前本地加密,收件方收到后本地解密,这样就避免了传输过程泄密和篡改。那么如何实现呢?

PGP(Pretty Good Privacy)中文可以翻译成:很不错的隐私。它是一种加密程序,可以为数据通信提供加密和身份验证。PGP可以用于对文本、邮件或文件进行签名、加密和解密。菲尔·齐默尔曼(Phil Zimmermann) 于1991年开发了PGP的最初版本,其最初用户为集权国家持不同政见者、民权主义者和密码朋克的“自由交流”活动家。PGP发布不久,便在美国以外的地方被使用。1993年齐默尔曼被美国政府以“无证出售军火”调查,因为当时美国法律规定大于40位密钥的密码系统被视为"军火",而PGP从未使用低于128位的密钥。菲尔·齐默尔曼以富有想象力的方式挑战了这些规定,他将PGP的源代码通过写成一本书出版了。因为枪支弹药、飞机和软件的出口被限制,但书籍的出口受第一修正案保护。几年后,调查以没有提起任何诉讼而结束。

联邦刑事调查结束后,菲尔·齐默尔曼和他的团队成立了一家公司开发PGP。PGP在随后的几年辗转倒手几家公司,作为一个商业软件,它遇到了一些专利问题,这导致它的使用遇到很多问题。而菲尔·齐默尔曼深信,PGP加密的开放标准对他们和整个加密社区都至关重要。后来IETF应其要求便成立了OpenPGP工作组。后来自由软件基金会开发了一个兼容OpenPGP标准的程序,称为GNU Privacy Guard,简称GnuPG或GPG。

可能有人注意到,在当下,某些对于信息安全比较注意的博主,或是独立调查记者、社会活动家。他们的个人网站电子邮箱附近会留有一个PGP KEY,其后跟着一个40位16进制数。这个数字实际是PGP公钥的指纹,通过它可以在公共PGP公钥分发服务器上找到其对应的完整公钥。有了PGP公钥,我们便可以向其发送加密后的电子邮件了,电子邮件在到达对方的邮件客户端前的整个传送过程,一直都是密文。而除非窃听者获取了对方的私钥,否则无法获取到原文。

Thunderbird是一款开源免费的电子邮件客户端,用于发送,接收和存储电子邮件,分别支持Windows、MacOS、Linux等平台。它目前由开源社区负责维护,它被PRISM BREAK项目所推荐。之前它需要搭配Enigmail插件使用OpenPGP加密,目前Thunderbird 78 原生支持两种加密标准,OpenPGP 和 S/MIME,所以不再需要插件。官方文档描述,Thunderbird 78 OpenPGP标准支持是通过RNP实现的。

实践本文内容前,您可能需要知晓以下内容:

  • 准备一个电子邮件账户,需要服务提供商支持IMAP或POP3协议

  • 如果对安全要求较高,需确认当前系统无恶意软件

  • 如果对数据安全要求极高,建议全盘加密

本文描述的方法用于避免传输过程中邮件内容被窥探,用于证明发件人身份。对于发送前的内容泄密、私钥泄露等皆无力应对;且随着技术发展,此方法并非能够永远安全,请谨慎。

1. 安装Thunderbird并配置邮件账户

  1. Thunderbird的安装非常简单。大多Linux发行版都默认安装了它。而在Windows下的安装也非常简单,只需要从官方网站下载适合您语言和系统的安装程序,然后运行安装程序跟随提示安装即可。如果需要修改安装位置可以选择自定义,然后修改安装位置,其他不再赘述。

  2. 安装完成后运行Thunderbird,会提示您配置邮件账户。如果您关闭了这个窗口,可以点击菜单键(其在主窗口关闭下方,图标是三根横线,下文简称三横菜单键),在菜单中点击新建 > 已有电子邮件账户... ,打开邮件账户配置窗口。
    1-0.png

  3. 按提示填写发件时显示的名字,电子邮件账户地址,密码,然后点击 继续

    1-1.png

  4. Thunderbird会自带尝试检索邮件服务器配置信息,如果找到,会自动在下方列出。如果检查到的信息与您实际情况相同,可以直接点击 完成 按钮,完成电子邮件账户的添加。

    1-2.png

  5. 如果找不到,或找到的配置信息不正确,您可以点击 手动配置(M)... 按钮,手动填写从邮件服务商处获得的服务器信息。填写无误后点击 完成 按钮,完成电子邮件账户的添加。

    1-3.png

警告:请确保以上配置中“接收”和“发出”均配置了SSL(安全套接字层)或STARTTLS(启动传输层安全性),这保证您与电子邮件服务商的网络连接是加密的。

注意:如果您电脑系统登录的是公用账户,请不要勾选记住密码。为了数据安全,不建议在公用账户做加密邮件通信。详细参考该官方文档

注意:某些邮箱,例如网易邮箱、Gmail,可能不再支持使用网页登录的密码连接POP和IMAP服务,需要在网页端按提示生成专用的连接密码。

2. 生成并配置密钥

配置好电子邮件账户后,接下来便是通过内置的OpenPGP密钥管理器生成密钥对。

  1. 在主界面点击三横菜单键 > 账户设置 ,在左侧您的邮箱下的选项中选择 端到端加密 ,在右侧界面的OpenPGP栏目中点击 OpenPGP密钥管理器(K) 按钮以打开OpenPGP密钥管理器。(密钥管理器 也可以从 三横菜单键 > 工具中访问)

    2-1.png

  2. 点击上方菜单栏中的 生成(G) > 生成新密钥对(K) ,弹出的新建OpenPGP个人密钥窗口。在身份标识处选择您使用的邮箱。密钥到期日建议选择到期时间2年或3年,不建议设置永不过期。密钥类型选择RSA,密钥大小选择4096,点击 生成密钥 按钮,在接下来的页面中会询问您是否确定生成,核对无误点击确定等待片刻即可生成密钥对。

    2-2.png

  3. 关闭密钥管理器,此时应该能够在OpenPGP栏目中看到新添加的密钥。点击选中新添加的密钥,即可将该密钥对应用于此电子邮件账户。

    2-3.png

可选安全配置:为了更高的安全性,有以下可选项设置,但以下设置会导致易用性下降。

  • 禁用远程内容。这个设置在选项 > 隐私与安全 中 ,允许消息中的远程内容,此选项默认设置就是不启用的。关闭此选项可在一定程度上降低邮件远程内容加载项带来的攻击风险。
  • 禁用HTML电邮呈现。打开 三横菜单 ,点击 查看 > 消息体为(这个翻译太草了) ,此处默认是原始HTML,将其设置为 纯文本 可以更大程度上避免HTML加载项导致的黑客攻击,但会导致大量HTML格式的邮件呈现为几乎不可读的状态。建议只在安全要求极高的情况下使用。
  • 禁用HTML电邮撰写。此设置在账户设置 > 通讯录选项 下 。编写以HTML格式编写消息 默认为勾选状态。如果要使用纯文本方式撰写邮件,需要把此勾选去掉。
  • 启用默认签名与加密。此设置在 账户设置 > 端到端加密 下。将 发送消息时的默认设置 改为 默认要求加密 ,勾选默认添加我的数字签名。这个设置可以避免忘记加密将邮件发出。但会给平时不发送加密邮件的场景带来麻烦,按需启用。
  • 将草稿和模板保存在本地。此设置在 账户设置 > 副本和文件夹 下,将草稿和模板的保存文件夹设置在本地,而不是邮箱的远程文件夹中,这可避免未完成的、未加密的草稿被自动上传至邮件服务商处,此设置按需配置。

导出私钥:

导出私钥备份到安全的地方可以降低意外导致私钥丢失的情况。私钥丢失将导致您无法解密他人发送给您的加密邮件,这也是一件令人尴尬的事情。同时,Thunderbird中自带的OpenPGP密钥管理器功能有限,后续的发布操作也需要导出到GnuPG完成。

运行Thunderbird,三横菜单键 > 工具 > OpenPGP密钥管理器。在密钥管理器中选定要导出的项目,然后点击 文件 > 备份私钥为文件 。在弹出的窗口设置保存的位置与文件名称后点击保存,然后在弹出的设置密码窗口中设置密码,最后点击确定完成导出。

2-4.png

注意:此处生成的密钥对包含私钥和公钥。私钥需要安全保存,绝对不共享给其他人。公钥您可以公开分享给信任你的人。具体的使用会在后面的内容中讲述。

3. 加密邮件的发送和接收

要实现加密邮件双向收发,需要双方分别拥有自己的密钥对,并且互相持有对方公钥。这需要一个交换的过程,通常可以将公钥导出,作为附件发送给对方。然后通过电话、线下见面等方式核对公钥的指纹,确保对方收到的公钥没有问题。以下假设Alice和Bob两人要交换公钥。

  1. Alice打开OpenPGP密钥管理器,在自己的密钥对上右击,选择 将密钥导出为文件 ,选择合适的地方保存,这就是导出的PGP公钥。Alice给Bob发送一个未经PGP加密的邮件,将刚才导出的PGP公钥作为附件发送。此步骤可简化为:Alice打开OpenPGP密钥管理器,在自己的密钥对上右击,选择 通过电子邮件发送公钥

    3-1.png

    在弹出的邮件撰写窗口中填写Bob的邮件地址并完善标题与正文内容,确定安全选项下为不加密,点击发送即可。

    3-1-1.png

  2. Bob收到邮件后,下载附件中Alice的公钥。打开OpenPGP密钥管理器,点击 文件> 从文件导入公钥 ,选择Alice的公钥。在弹出的要导入下列密钥吗?的窗口中会显示当前导入公钥的指纹,通过其他可信途径与Alice核实指纹是否正确,核对无误后选择 接受 ,然后点击确定。在新弹出的成功信息页上点击 查看详细信息并管理密钥接受度 ,在 您是否接受 选项下选择 接受,我已验证这的确是正确的指纹 ,点击确定键完成设置,然后关闭密钥管理器。

    3-2.png

    3-2-1.png

  3. Bob完成Alice公钥的导入后,打开OpenPGP密钥管理器,在自己的密钥对上右击,选择 通过电子邮件发送公钥 ,在弹出的邮件撰写窗口中填写Alice的邮件地址并完善标题与正文内容,点击 安全 右边的下拉按钮,选择 要求加密 选项,点击发送即可将公钥和邮件以加密的方式完成发送。而加密后的内容只有Alice的私钥能够解密。

  4. Alice收到邮件后,Thunderbird会自动使用Alice的私钥解密邮件内容。Alice下载附件中Bob的公钥,参考步骤2的过程将Bob的公钥导入自己的OpenPGP密钥管理器。到此双方便可以互相发送加密邮件了。结果如下图所示。

    3-4.png

还有一种方法是将公钥发布到公钥服务器上,然后双方通过可信的途径交换公钥的指纹。让对方通过指纹或密钥ID来搜索并获取公钥。然后添加时核对指纹,如果没有差异即表示正确的交换了公钥。如何将公钥发布到公钥服务器会在后面内容中讲述。

4. 延长过期密钥

若要延长过期的密钥,在密钥管理器窗口中选择过期的密钥对,右键菜单选择 密钥属性 ,然后在打开的窗口中点击更改到期时间,重新设置到期时间(建议2~3年),密钥对会被更新。之后需要重新与通信伙伴们分享公钥。如果有在公钥服务器上发布,则需要重新发布以更新。

4-1.png

注:该部分笔者没有实际尝试操作,仅供参考。

5. 公钥发布与吊销

上文内容已经实现了PGP加密邮件通信。此处研究一下通过公共密钥服务器发布自己的公钥。这个活单纯靠Thunderbird搞不定,因为它没有这样的功能。为此,我们需要安装一个GnuPGP软件包,因为本文环境为Windows系统,所以需要下载安装Gpg4win。然后使用它将公钥发布到公钥服务器上。

安装Gpgwin:

  1. 从官网下载Gpg4win安装程序,双击运行安装程序,点击 下一步

    5-1.png

  2. 按需要从可选组件中选择要安装的组件,Kleopatra是一个窗口化的密钥管理器,GPA是GNU隐私助理,GpgOL是Outlook插件,GpgEX是资源管理器插件。本文只用到了Kleopatra的部分功能,还有部分操作用命令行淦。选择需要的功能后点击下一步。

    5-2.png

  3. 设置安装位置,建议默认位置即可。然后点击安装,等待其完成安装后退出安装程序。

    5-3.png

导入密钥对到GnuPG:

从Thunderbird中导出的私钥文件,在Gnu PG的图形化前端Kleopatra中进行导入。导入后加解密一段任意文本,以触发并完成私钥本身的解密流程。这是一个方法,如果安装了Kleopatra。否则我们也可以在命令提示符中完成。

  1. 使用以下命令进入备份目录(本例为E:\Sec\TEST\),并执行导入。会弹出一个输入密码的对话框,输入之前从Thunderbird中导出时设置的密码,然后点击OK完成导入。

    C:\Users\Lexsion>E:
    E:\>cd Sec\TEST
    E:\Sec\TEST>gpg --import Alice-secret.asc

    如图:

    5-B-1.png

    成功后有类似以下提示:

    gpg: key FFFFFFFFFFFFFFFF: "Alice <Alice@Alice.com>" imported
    gpg: key FFFFFFFFFFFFFFFF: secret key imported
    gpg: Total number processed: 1
    gpg:               imported: 1
    gpg:       secret keys read: 1
    gpg:   secret keys imported: 1
  2. 使用以下命令查看有哪些密钥,记下我们刚导入的密钥对的8位密钥ID,即指纹的后8位(本例为:67A7B3D5)。

    E:\Sec\TEST>gpg --list-keys

    部分缩写介绍:

    sec => 'SECret key'
    ssb => 'Secret SuBkey'
    pub => 'PUBlic key'
    sub => 'public SUBkey'
  3. 使用以下命令结合刚才获取到的指纹ID编辑密钥对,将信任等级改为完全信任。完成后退出。

    E:\Sec\TEST>gpg --edit-key 67A7B3D5
    gpg> trust
    
    Your decision? 5
    Do you really want to set this key to ultimate trust? (y/N) y
    
    gpg> quit

    如图:

    5-B-2.png

    5-B-3.png

编辑状态时,usage标记的解释:

Constant           Character      Explanation
─────────────────────────────────────────────────────
PUBKEY_USAGE_SIG      S       key is good for signing
PUBKEY_USAGE_CERT     C       key is good for certifying other signatures
PUBKEY_USAGE_ENC      E       key is good for encryption
PUBKEY_USAGE_AUTH     A       key is good for authentication

发布公钥到公共服务器:

我们仍假设8位公钥ID是“67A7B3D5”,使用以下命令将公钥发布到公共服务器“keys.gnupg.net”。您也可用发布到其他的服务器,主要的公共密钥服务器之间会定期互相同步的。

 gpg --keyserver keys.gnugp.net --send-keys "8D253E8A"

稍等片刻,我们可以尝试用以下命令查询服务器中是否已经有我们的密钥。

gpg --keyserver keys.gnugp.net --search-keys "user-name/e-mail/fingerprint"

撤销公钥:

公钥一旦发布到了公共的公钥服务器上,那便谁都可以获得了。如果哪天我们私钥丢失,无法解密;或是私钥泄露,不再安全怎么办?我们便需要一种机制,可以用来声明公钥已经失效,让大家不要再使用。于是便有撤销公钥的操作,原理便是用私钥签一个公钥回收证书,加入到原有的密钥链中。注意:为了更大程度保证此操作可用,公钥回收证书建议在发布公钥前导出,妥善保管,若需要撤销公钥时直接导入,避免丢失公钥,无法生成撤销证书。

使用以下命令生成回收证书,revoke.asc为文件名,文件会放在当前操作目录。

gpg --output revoke.asc --gen-revoke "8D253E8A" 

使用以下命令将公钥回收证书导入到公钥中。这个操作将在本地撤销公钥,使本地的公钥状态变成已失效(revoked) 。但不会影响已上传到公钥服务器中的数据。

gpg --import revoke.asc

使用以下命令搜索公钥服务器,以确定是否有这个公钥。

gpg --keyserver keys.gnugp.net --search-keys "8D253E8A"

确定服务端有这个公钥的记录之后,使用以下命令上传导入了回收证书的公钥,这样便更新了服务器上的记录。

gpg --keyserver keys.gnugp.net --send "8D253E8A"

稍后我们再使用前面的命令从公共公钥服务器上搜索,便会看到公钥的状态变成了(revoked)。以上即完成了公钥的撤销。

Q&A:

Q:PGP、OpenPGP、GnuPG、GPG、Gpg4win分别是什么,它们有什么关系?

A:相关的问题在前言中有部分提到,PGP是这项技术最早的开发者针对加密程序的命名,目前它是个商业软件,属于赛门铁克(Symantec)。OpenPGP是这项技术的标准,它是商业运作PGP过程中发现专利问题后为了更好发展提出的开放标准。GnuPG全称GNU Privacy Guard,它是自由软件基金会开发的一个兼容OpenPGP标准的程序,其又简称GPG,它是PGP的开源替代品。Gpg4win是一个Microsoft Windows下的软件包,其包含GnuPG核心程序、证书管理器和加密插件。除了OpenPGP作为技术标准名称,其他都是软件名称,他们几乎通用,但支持的加密算法会有不同。

Q:公钥、私钥、指纹、密钥ID分别是什么?

A:公钥用来加密和验证签名,私钥用来解密和签名。指纹是从公钥产生,长度为40位16进制数。密钥ID是公钥的ID,分为长ID和短ID两种,长ID是指纹的后16位,短ID是指纹的后8位。长短ID仅作为方便搜索使用,交换、使用公钥时务必完整核对指纹,避免碰撞攻击。

Q:导出的PGP私钥文件是否包含公钥?

A:导出的PGP私钥文件是包含公钥的,如果你尝试将导出的私钥在其他设备上导入,导入后便能看到其包含公钥。另外,可以使用pgpdump分析私钥文件来研究这个问题。

Q:私钥导出时要求我设置了密码,但是导入时没有提示输入密码就成功导入了?

A:导出私钥时设置的密码是有用的,私钥确实使用您设置的密码加密了。部分GnuPG公钥管理器是这么设计的,导入操作本身是不需要密码的,但是导入后的私钥仍在加密状态,这个状态的私钥是不能使用的。可以使用这个私钥解密一个文件,其会自动提示让您输入之前设置的密码以解锁私钥。本文使用的命令界面操作,没有遇到此问题。

Q:据说其他新的加密算法更加优秀,为什么还要用RSA?

A:为了保证更好的兼容性,所以还是建议选RSA。

Q:POP3和IMAP有什么区别,怎么选择?

A:POP3和IMAP是两种不同的协议,相比IMAP,POP3是一种简单协议。POP3协议将邮件移动到本地,尽管服务商处可以设置将消息保留在服务器上。而IMAP协议是访问、操作远程服务器上的文件夹,下载到本地的被称为副本。IMAP客户端可以对远程服务端的邮件执行各种复杂的操作,它支持通过读写远程服务端的标志以跟踪同步邮件的状态。POP3要求连接到邮件服务器的客户端是唯一 的,IMAP支持多个客户端同时访问。如果需要在多个客户端访问邮件,选择IMAP协议;如果需要邮件接收到本地,不想邮件保存在不受自己控制的服务商那里,选择POP3协议(前提是服务商处的设置确实会在邮件接收后删除邮件,据了解,主流服务商不是这样的,所以推荐IMAP)。

Q:在Android系统下该选择什么邮件客户端?

A:PRISM BREAK项目推荐K-9 Mail,这个应用在GitHub上有开源项目,可以看到完整的源代码。它可以在F-Droid应用市场下载,这个也是闻名的开源Android应用市场。相信开源的项目更让人放心,本人没有尝试过此应用,具体使用方法本文不研究。

参考:

Typecho设置表格样式

前言:

正如大家看到的,本博客使用R-Blog主题。这个主题风格简洁,但有些地方可能不完善,如下所示,表格的样式也太过简洁了,不仔细看都不知道这有个表格,以至于影响到阅读。作者已经好多年没有更新了,于是需要我自己想办法解决这个问题。本人在HTML与CSS方面没有任何系统的学习经验,更不懂PHP语言。本文只是对问题解决的记录,若有错漏请各位指正。

原始表格样式

开搞:

首先,我大致看了一下Typecho文件结构,文章看样子是由./var/HyperDown.php从Markdown生成的,那表格也是由它产生。而主题以文件夹形式放在./usr/themes/下面。这个结构,想来表格生成的那边不能随意改动,只能动主题文件夹里的内容。看了下主题文件夹中的内容,是一些PHP文件和一个CSS文件。

搜索引擎简单搜了一下,了解到PHP文件在服务端运行,产生HTML文档给用户的浏览器。HTML(HyperText Markup Language)是超文本标记语言,由多种通过标签定义的元素组成,表格元素由<table>标签定义。CSS(Cascading Style Sheets)中文叫层叠样式表,用所谓的样式规则来定义HTML元素如何显示,而且它是层叠的。一条CSS规则由前部的选择器和跟在后面大括号中的一条或多条声明构成,每条声明则由一个属性名和对应的组成。

如此看来,我想要修改表格显示的样式,就要改表格相关的CSS规则。我先去网上找了几位大佬们的博客快速的浏览了一番。为自己积累一些经验,顺便F12学习一下他们表格元素的某些样式对应CSS规则中什么属性。经过一番粗略的学习,我拥有了低级的审美观念,也了解了极为有限的一部分CSS属性名的作用,接下来就是学以致用了。

R-Blog主题CSS文件只有一个,结构极为简单,打开改就完了。读书破万卷,下笔也不定有神。我先将前面学到的、我认为有用的规则写出来,然后浏览器浏览实际效果,通过F12调试功能,增删改这些规则,最终再据此修改CSS文件中的规则。经过一段时间的尝试,最终我将table相关规则替换成了以下内容:

table{width:50%;border-spacing:1px;background-color: #22aaef;border: 1.5px solid #22aaef;}
table thead tr{font-size: 17px;color: #22aaef;background-color: #DDD;}
table thead tr th{padding: 4px;}
table tbody tr{background-color: #FFF;}
table tbody tr td{padding: 4px;}
table tbody tr:nth-child(2n){background-color: #e5fcfd;}

浏览器中按Ctrl+F5刷新后,表格出现了神奇的变化。最终效果如下,我感觉还是挺满意的,大家可以评论区告诉我好不好看。

修改后的表格效果

参考:

在Windows下使用C语言开始Raspberry Pi Pico开发

什么是Raspberry Pi Pico:

最近,树莓派基金会推出了一款开发板,名为Raspberry Pi Pico。这是一块小巧快速用途广泛的最小系统开发板,它使用的是树莓派基金会自研的RP2040微控制器。树莓派官网标价为4$,国内购买价格大约30元人民币(不含邮费)。

RP2040微控制器有以下特性:两个ARM Cortex-M0+内核最高频率133MHz、 264KB的内部RAM、DMA控制器,支持挂最高达16MB的片外Flash。它有30个GPIO,4个可以作为模拟输入。外设包含2个UART、2个SPI、2个I2C、16个PWM通道以及一个USB1.1控制器。

Raspberry Pi Pico开发板支持通过C/C++或MicroPython语言进行开发,树莓派基金会官方提供了大量、详细的资料。它有一枚2MByte的SPI Flash用于存储固件,一枚RT6150B作为电源管理,一个Micro-USB接口用于供电和传输数据(包含下载固件)。板子采用40 pin 21x51 'DIP'设计,焊接排针后可以方便的使用在面包板上,同时邮票孔设计可以方便将 Pico 作为核心板贴装到其他电路板上。方便DIY爱好者实验用途的同时也兼顾了商业批量用途时的贴片安装。板子上共有26个3.3V GPIO,其中23个是纯数字IO,3个可以作为ADC使用。另外板子上有一个3Pin的ARM SWD接口用于调试,一个BOOTSEL按钮用于进入固件下载模式。它还有一个板载的LED指示灯连接在GPIO25上。

准备工作:

学习本文内容需要做如下准备:

  • Raspberry Pi Pico开发板和MicroUSB数据线,方便下载程序验证。
  • 运行Windows10的电脑,其他Win系统笔者无力测试,本文不适用Linux系统。
  • 足够的存储空间,建议至少8GB,因为C的工具链中某些工具或库会很大。

警告:以下的某些操作可能对您电脑中现有的某些工具链产生影响,如果您的电脑中有其他重要生产环境,谨慎考虑是否实践本文内容。如果您对此了解,相信您也能够解决遇到的问题。本人不会也没有技术对任何结果负责。

下载固件和体验MicroPython:

新接触到一款MCU或开发板,首先需要研究的就是如何搭建编译环境以及如何下载固件。大多我们需要先搭环境写出点灯程序,然后再进行固件下载。考虑此开发板支持MicroPython,且官方提供了已经编译好的MicroPython固件,在搭建开发环境前,我们可以先体验一番固件下载方式,顺便试一下MicroPython是如何点灯的。我们可以直接在官方如何开始页面,点击Getting Started with MicroPython。然后在网页上点击Download UF2 File下载文件。

文件下载完成后,按住BOOTSEL键,插入连接电脑的USB后松开BOOTSEL键,电脑上会显示一个名为RPI-RP2的大容量存储设备。将MicroPython UF2文件拖放到RPI-RP2卷上。Pico将重新启动,然后就可以使用串口工具连接MicroPython了。

我们可以在设备管理器里看到开发板串口的端口号,然后我们使用串口工具连接端口,波特率为9600。连接后可以按Ctrl+D软重启,此时应该可以看到相关提示信息。如下:

MPY: soft reboot
MicroPython v1.14 on 2021-02-05; Raspberry Pi Pico with RP2040
Type "help()" for more information.
>>>

官方推荐了Thonny,可以点击其官网右上角超链接下载最新版本。安装后点击工具设置,在解释器选项卡下设置解释器为Pico,并正确设置端口号。即可在下面的Shell窗口中看到提示信息。

逐行输入以下代码(>>>忽略)可以点亮板上LED:

>>> from machine import Pin
>>> led = Pin(25, Pin.OUT)
>>> led.value(1)

如果硬件正常,操作没有问题,此时板载LED已经点亮。我们便学会了如何下载固件和使用MicroPython点亮LED灯。如果想继续学习MicroPython,可参阅官方文档。

搭建C/C++编译环境:

安装工具链:

搭建编译环境的环节是必不可少的。我们首先按照文档说明安装工具链(Toolchain)。

我们需要安装的工具有:

  1. ARM GCC compiler(Windows 系统下载gcc-arm-none-eabi-XX-20XX-XX-major-win32.exe)
  2. CMake
  3. Build Tools for Visual Studio 2019(从下方的所有下载处展开VS2019工具,选择下载生成工具)
  4. Python 3(需要下载Python3,而不是Python2)
  5. Git

注意:

  1. ARM GCC compiler安装过程的最后一步,需要勾选Add path to environment variable,然后再点Finish完成安装;CMake安装过程中,InstallOptions页面要选择Add Cmake to the system PATH for all users。如果以上两个环境变量相关设置不正确,则会导致编译过程相关命令无法调用而失败。
  2. 通过VS2019生成工具下载器安装生成工具的时候,只需要在工作负载中勾选安装C++ 生成工具即可,其他不需要选择。右侧的可选功能会自动帮你选好,不要取消勾选 。也不要对存储空间占用有怀疑,这套工具确实非常大。
  3. 安装Python时需要选择Customize installation,然后在Advance Options页勾选Install for all users、Add Python to environment variables,并设置安装路径,最后点击Install开始安装,安装完成后还需要点击Disable path length limit以允许忽略MAX_PATH限制。
  4. 安装Git时,树莓派基金会官方文档做了如下要求(建议):需要换掉默认的vim编辑器,比如我换成了notepad++(因为使用vim需要极强的专业性,Git本身也建议换掉,但感觉是非必须项);后面的设置需要勾选third-party tools,勾选Checkout as is, commit as-is,还需要勾选Enable experimental support for pseudo consoles。

获取SDK和样例:

参考以下代码使用Git获取SDK和样例,具体使用的文件目录按情况自行配置:

C:\Users\pico\Downloads> git clone -b master https://github.com/raspberrypi/pico-sdk.git
C:\Users\pico\Downloads> cd pico-sdk
C:\Users\pico\Downloads\pico-sdk> git submodule update --init
C:\Users\pico\Downloads\pico-sdk> cd ..
C:\Users\pico\Downloads> git clone -b master https://github.com/raspberrypi/pico-examples.git

开始菜单搜索我习惯搜索Dev),找到Developer Command Prompt for VS 2019并启动它,然后在里面运行以下命令设置SDK路径(引号中的具体路径按实际情况填写):

C:\Users\pico\Downloads> setx PICO_SDK_PATH "..\..\pico-sdk"

关闭当前的窗口,重新打开Developer Command Prompt for VS 2019,这样环境变量应该就生效了。

导航到pico-examples目录下,通过以下命令尝试编译样例项目,以验证编译工具链是否正确配置:

C:\Users\pico\Downloads> cd pico-examples
C:\Users\pico\Downloads\pico-examples> mkdir build
C:\Users\pico\Downloads\pico-examples> cd build
C:\Users\pico\Downloads\pico-examples\build> cmake -G "NMake Makefiles" ..
C:\Users\pico\Downloads\pico-examples\build> nmake

如果没有错误,能够正常完成编译,能够在pico-examples\build下看到uf2文件,并且按照前文的方式将固件下载到Pico中后LED按照1s周期闪烁。即表示编译工具链可正常工作。

注意:以上必须使用Developer Command Prompt for VS 2019而不是系统自带的命令提示符,因为使用此工具会自带相关环境变量,而系统的命令提示符没有,使用系统的命令提示符执行操作无法成功编译。

自建工程:

确认编译工具链正常后,我们便可以开始尝试写一个自己的工程了,这在SDK的RADEME.md文件中有介绍。文档中的介绍是基于Linux系统的,但没关系,工程的目录结构是通用的,我们可以参考。以下我们参考文档建一个闪灯程序。

  1. 在合适的地方新建一个文件夹,以工程名字命名,名字建议避免使用中文和特殊符号。此处我命名为:Blinks。在文件夹内再建一个名为build的文件夹,用于存储编译后的文件。

  2. pico-sdkexternal文件夹下的pico_sdk_import.cmake复制到工程文件夹下(即Blinks下)。

  3. Blinks文件夹下建立名为blinks.c的源代码文件,在此文件中编写程序源代码。比如闪灯程序源代码如下:

     #include "pico/stdlib.h"
    
     const uint LED_PIN = 25;
    
     int main() {
         gpio_init(LED_PIN);
         gpio_set_dir(LED_PIN, GPIO_OUT);
         while (true) {
             gpio_put(LED_PIN, 1);
             sleep_ms(100);
             gpio_put(LED_PIN, 0);
             sleep_ms(100);
         }
     }
  4. 在工程文件夹下创建CMakeLists.txt文件,内容参考如下。以#开始的行是注释,用于解释,编写代码时请勿直接抄写,建议使用英文注释。

    cmake_minimum_required(VERSION 3.12)
    
    # 引入SDK (必须写在下面的project行前)
    include(pico_sdk_import.cmake)
    
    # 工程名,比如Blinks
    project(Blinks)
    
    # 初始化SDK
    pico_sdk_init()
    
    #添加项目的源文件,比如此处我们添加的blinks.c源文件
    add_executable(blinks
            blinks.c
            )
    
    # 引入pico_stdlib库
    target_link_libraries(blinks pico_stdlib)
    
    # 创建map/bin/hex 等文件.
    pico_add_extra_outputs(blinks)
  5. 打开Developer Command Prompt for VS 2019,通过以下命令编译项目。

    C:\Users\pico\Downloads> cd Blinks
    C:\Users\pico\Downloads\Blinks> cd build
    C:\Users\pico\Downloads\Blinks\build> cmake -G "NMake Makefiles" ..
    C:\Users\pico\Downloads\Blinks\build> nmake
  6. 如果一切正常,我们便可以在build文件夹下得到项目编译产生的文件,其中的uf2文件可以按前文方法下载到Pico开发板中验证,看运行结果是否与代码设计一致。

结语:

至此,我们便学会了Raspberry Pi Pico开发板点灯,后面具体可参考树莓派基金会官方提供的相关文档学习。祝大家学习顺利。

参考:

  1. 官方产品页:https://www.raspberrypi.org/products/raspberry-pi-pico/
  2. Getting-started:https://www.raspberrypi.org/documentation/pico/getting-started/
  3. Pico-SDK代码:https://github.com/raspberrypi/pico-sdk
  4. Pico-example代码:https://github.com/raspberrypi/pico-examples

Flash停止服务导致Fliqlo失效无法显示的处理方案

Flash停止服务导致Fliqlo失效无法显示的处理方案

前言:

Fliqlo是一款时钟屏保程序,很多人都在使用它。如果你对此没有印象,想一想,是否有见到很多科技视频作者电脑的屏保,是一个黑底白字的翻页时钟?十有八九是这个屏幕保护程序。2021年一月份的某一天,我秃然发现自己Windows10电脑的Fliqlo时钟屏保不能正常显示了。取而代之显示的是一个右下角带有 i 圆标的Flash标志。众所周知, i 表示information,这个图标是想要告诉我们一个关于Flash的信息,但是它并没有办法显示具体信息。联想到Flash是一项已经淘汰的技术,当即想到前几天某车站因Flash停止服务导致调度瘫痪、无法运行的新闻。网上查询,了解到Adobe官方有表示:无论是否卸载Flash,2021年一月份Flash将停止运行。我们可以得出结论,Flash停止服务导致了Windows下Fliqlo失效。题外话:一切的一切提醒我们,Flash这项技术真的到了该淘汰的时候了。Flash淘汰,2G网络淘汰,某项技术无论先前应用多么广泛,终有被更先进的技术淘汰的一天。我们自然也需要不断学习先进技术,避免自己被淘汰。
Flash_Info.jpg

解决方案

方案一:升级Fliqlo至最新版本

应用程序失效,排除自己操作问题后,首要想到的当然是尝试联系软件开发商。我在Fliqlo的官网看到了新版本的Change Log,目前的最新版本为1.4版,发布于2021年01月12日,最首要的改变就是 “不需要Flash Player” 。既然如此,我们更新到最新版应该就可以了。按照官方的指导,不能直接安装升级,我们需要先在应用和功能(程序和功能)里面卸载旧版本的Fliqlo,卸载后重启电脑。在个性化设置中的屏幕保护程序设置中检查,确认Fliqlo已经消失,否则可以手动在 C:/Windows 目录下搜索Fliqlo,将相关文件手动删除。然后运行Fliqlo 1.4 的安装程序进行安装。

Fliqlo的官网在中国大陆貌似难以直接打开,我们可能需要通过代理访问。此处提供一个下载链接,失效不补。

新版本的Fliqlo除了不需要Flash,还有一些其他改变。比如,设置移动到了屏保程序内部,可以在预览屏幕保护程序是点击鼠标,在下方修改相关设置。正因如此,新版的Fliqlo目前无法通过移动鼠标或点击鼠标退出屏保,而是只能通过按键盘退出屏保。这可能会让某些人不习惯。另一个改变是,添加了通过网络自动更新的功能,不知是否与此有关,我的在使用时经常会出现一个问题,在进入屏幕保护程序前有网络加载提示。且若关闭电脑网络,这个新版本根本不能正常显示时钟效果。新版本的不适应让我们考虑寻找其他方案。

方案二:安装使用中国企业版Flash或修改版Flash

既然Flash不能正常运行,我们想办法让Flash运行就可以了。网上了解到,因为Adobe Flash在中国是有单独公司运营的,为了中国政府网站等使用Flash的情况,有提供企业版本可以使用的Flash供大家使用。或也可使用网友们魔改的Flash来解决此问题。考虑Flash作为一项淘汰技术,本着考虑使用淘汰技术存在不稳定,不安全性,本着不断学习新技术而不是守旧的原则,本文不研究此方案具体方法,需要的可自行从网上搜索如何让自己的计算机可以继续使用Flash。

方案三:寻找其他替代应用

在GitHub上,有一个叫做FlipIt的开源项目,作者叫:phaselden。这个项目是用C#写的,要求电脑使用Windows系统,有安装 .NET Framework 4.8。最近因为Fliqlo出现的问题,导致很多人去寻找替代方案,好多人关注到了GitHub上的这个项目。有网友对标Fliqlo提了几个Issues,估计作者看到很多人关注他的项目也很有成就感,于是在积极完善项目。最近已经连续更新了好几次版本。仅仅几天,作者将没有12/24小时制、大小调整、需要手动在系统中安装字体这些问题全部解决了,它还为双显示器提供了副屏和主屏不同内容显示的模式,这点非常赞。经过短期体验,个人感觉最新版本的使用体验不错,可以平滑替代Fliqlo,所以在此推荐大家使用。

OpenIPC系统博云摄像头替换minihttp

OpenIPC系统博云摄像头替换minihttp

前言

大佬Sean.Y发布了新编译的minihttp,功能方面添加了暗环境开红外切换黑白画面。我们只需要把摄像头中原来的文件替换一下即可用上新功能。本文就拿此事来水一下。

准备

1,已经刷好OpenIPC固件的摄像头
2,SSH工具软件
3,格式化为fat32的存储卡

正文

1,准备一张格式化为fat32的存储卡,使用之前刷固件的存储卡需注意删除相关固件文件,以免误操作再次刷机,给搞机带来不便。
2,获取minihttp 2020.04.24.zip文件,解压到存储卡,将存储卡插入摄像头。
3,运行以下命令检查能否看到存储卡中的minihttpminihttp.ini文件,能看到进行下一步:

ls /mnt/mmc

4,逐行运行以下命令杀掉minihttp进程,并将原来的文件重命名为[filename].old,以备后期万一想恢复到原来版本。

killall minihttp
mv /usr/bin/minihttp /usr/bin/minihttp.old
mv /etc/minihttp.ini /etc/minihttp.ini.old

5,逐行运行以下命令复制存储卡中相关文件到指定位置,并修改文件权限。

cp /mnt/mmc/minihttp /usr/bin/
chmod 755 /usr/bin/minihttp
cp /mnt/mmc/minihttp.ini /etc/
chmod 644 /etc/minihttp.ini

6,执行以下命令重启。

reboot

注:如果需要修改分辨率、运行的服务开关等配置,请使用vi编辑器编辑/etc/minihttp.ini文件。
注:若想恢复之前备份的版本请使用以下命令(删除当前版本文件并将备份的文件名字改回原始文件名,然后重启)

killall minihttp
rm -f /usr/bin/minihttp /etc/minihttp.ini
mv /usr/bin/minihttp.old /usr/bin/minihttp
mv /etc/minihttp.ini.old /etc/minihttp.ini
reboot