加密入门(四):Gpg4win

Gpg4win 是一款基于 GPG 的非对称加密软件。非对称加密方式,简单理解就是用公钥加密文件,用私钥解密文件。如果你需要发送加密信息,首先获取接收者的公钥,然后利用该公钥加密后传递,对方利用对应的私钥就可解密。也就是说,公钥是锁,私钥是钥匙。非对称加密方式很好地解决了传递机密信息的问题。

GPG,又称为 GnuPG,全称是 Gnu Private Guard,即 GNU 隐私卫士。GPG 是以 PGP 算法为核心的强大的加密软件。但 GPG 项目是一套命令行程序,而且是为 Linux 等开源操作系统设计的。好在开发者为 GPG 开发了许多图形前端并将其迁移到 Windows 平台,Gpg4win 就是 Windows 平台 GPG 及图形前端的集合安装包,本文将介绍 Gpg4win 中图形前端的使用方法,不会涉及 GPG 的命令行使用方法。

##1. 下载安装 Gpg4win

首先到官方网站下载 Gpg4win,进入下载页面之后点击下载按钮即可下载。

在开始安装 Gpg4win 之前,我们先来了解一下 Gpg4win 是由哪些组件组成的。Gpg4win 的核心是 GPG,并包括 Kleopatra、GPA、GpgOL、GpgEX 和 Claws Mail 五个相关工具,其中 Kleopatra 和 GPA 是 GPG 的密钥管理器,用于生成、导入和导出 GPG 密钥(包括公钥和私钥),GpgOL 是 Outlook 2003 和 2007 的 GPG 支持插件,GpgEX 是资源管理器的 GPG 支持插件(不支持 Windows 64 位),Claws Mail 则是一个内置 GPG 支持的邮件客户端。本文将介绍 Kleopatra 和 GpgEX 的使用方法。

运行 Gpg4win 安装程序,选择安装组件时建议修改默认设置,默认 Gpg4win 将安装 GnuPG 核心、Kleopatra、GpgOL、GpgEX 以及支持文档(英文和德文)。我推荐只选择 Kleopatra 和 GpgEX。

其余的安装过程保持默认设置即可。安装完成之后安装程序会要求设置信任的根证书,勾选下方的“Root certificate defined or skip configuration”(根证书已定义或跳过设置),该设置只对 S/MIME 加密造成影响,而通常我们使用的是 OpenPGP 标准,即 PGP 算法。最后结束整个安装过程即可。

##2. 创建密钥对

GPG 作为非对称加密软件,进行加密解密之前必须生成密钥对,也就是生成对应公钥和私钥。请按以下步骤使用 Kleopatra 生成密钥对:

  1. 运行 Kleopatra,点击 File(文件)菜单中的 New Certificate(创建新证书)一项,运行 Certificate Creation Wizard(证书创建向导)。
  2. 进入证书类型页面,有两个选项可供选择:第一项是 OpenPGP 密钥对,第二项是 X.509 密钥对及证书。此处我们选择第一项。
  3. 进入详细信息页面,需要填入密钥对的详细信息,包括 Name(姓名)、Email(电子邮箱地址)和 Comment(附加信息)三项。点击 Advanced Settings(高级设置)按钮,可以对密钥算法和强度以及密钥用途进行设置,为了增强安全性可以在上方的密钥强度中选择最高的 3072 bits(3072 位),下方的密钥用途设置主要有三个设置:Signing(签名)、Encryption(加密)和 Authentication(认证),维持默认设置即可,最后的 Valid until 选项可以设置密钥到期时间。设置完成点击下一步。
  4. 最后确认密钥对的相关设置。点击 Create Key(创建密钥)按钮,程序将要求输入 Passphrase(密码短语),Passphrase 是使用私钥之前需要输入的密码短语,不过与普通密码相比,Passphrase 长度更长,而且可以包含空格。输入 Passphrase 之后还可以在下图所示的文本框中输入帮助计算机创建更为安全的密钥,输入内容无关紧要,计算机只是利用击键的间歇时间生成随机数,或者也可以移动这一窗口来帮助计算机生成随机数。
  5. 最后 Kleopatra 将提示创建密钥对完成,下方三个选项是备份密钥对、通过 Email 发送公钥和将公钥上传到服务器,如果不需要执行上述操作点击 Finish(完成)即可。

##3. 导入导出公钥

生成密钥对之后,我们必须导出公钥,请按以下步骤导出公钥:

  1. 在 Kleopatra 主界面中右键点击要导出公钥的密钥对,在右键菜单中选择 Export Certificates(导出证书)。
  2. 指定公钥的保存路径和文件名称。

除此之外,菜单中其他两项导出选项含义如下:

  • Export Secret Keys(导出私钥):用以导出密钥对。
  • Export Certificates to Server(导出证书到服务器):用以将公钥导出到服务器上。其他用户可以在存放公钥的公有服务器上搜索公钥并导入,默认的公钥服务器是 keys.gnupg.net。

导入公钥可以通过 File(文件)菜单中的 Import Certificates(导入证书)选项进行,也可以直接利用拖拽操作将公钥文件拖到 Kleopatra 的密钥列表,然后在弹出的菜单中选择 Import Certificates(导入证书)即可。

对于导出到服务器的公钥,选择 File(文件)菜单中的 Lookup Certificates on Server(在服务器上搜索公钥)选项,输入 Email 地址点击 Search(搜索)按钮就可以找到对应的公钥,点击 Import(导入)按钮就可以导入公钥。

##4. 加密解密文件

导入公钥之后,我们就可以加密文件了。启动加密操作向导有三种途径,一种是在 Kleopatra 主界面中选择 File(文件)菜单中选择 Sign/Encrypt Files(签名 / 加密文件),一种是将要加密的文件或文件夹拖拽到 Kleopatra 主界面中,然后在弹出的右键菜单中选择 Sign/Encrypt(签名 / 加密),一种则是在想要加密的文件或文件夹的右键菜单中选择 Sign and encrypt(签名与加密)。这三种途径没有本质区别,除了第一种途径无法选择文件夹因此只能加密文件。下面对加密向导进行介绍:

  1. 首先是选择操作类型,分别是签名并加密、加密和签名,默认选择的是中间一项加密,最下方的复选框 Remove unencrypted original file when done 是指加密完毕删除源文件,为了保证安全建议选上该项。设置完毕点击 Next。
  2. 现在向导会列出计算机上的所有公钥,请选择正确的公钥并点击中间的 Add(添加)将其添加到下方的列表中,如下图所示:
  3. 选择完毕点击 Encrypt(加密)按钮开始加密,假如你选择的是他人的公钥,那么 Kleopratra 会弹出对话框提示你加密之后你将不能够解密,点击 Continue 确认,保密完成之后点击 Finish 确认即可。
  4. 加密完成之后会在源文件所在文件夹生成 .gpg 为扩展名的加密文件,现在你可以把这个文件发给公钥所有者。

接收到已经加密的文件之后应该怎么解密呢?方法和加密非常类似,也是通过向导完成的。启动解密向导的途径同样有三种,一是在 Kleopatra 主界面中选择 File(文件)菜单中选择 Decrypt/Verify Files(解密 / 验证文件),一是将要解密的文件或文件夹拖拽到 Kleopatra 主界面中,然后在弹出的右键菜单中选择 Decrypt/Verify(解密 / 验证),一种则是在想要解密的文件或文件夹的右键菜单中选择 Decrypt and verify(解密和验证)。

以上述任意一种方式启动加密向导,点击解密向导对话框的 Decrypt/Verify(解密 / 验证)按钮,假如弹出对话框,请输入你的私钥的 Passphrase,输入之后点击 OK 就可以使用你的私钥进行解密了,注意在本用户对话期间你再次使用私钥是不需要输入 Passphrase 的,也就是说,使用私钥之后最好注销一下以保证安全。

GnuPG 和其他加密工具相比,其非对称性加密的特点使其更适合于机密信息的传递。除了加密解密之外,GPG 还可以对文件进行签名和验证,功能非常强大。而且由于 GPG 图形化前端功能的日益完善,GPG 的使用已经不再困难,Gpg4win 已经可以成为大众的加密工具。

##本文历史:

2011 年 4 月 4 日:初稿完成 2011 年 8 月 13 日:精简文字

原文地址:加密入门(四):Gpg4win http://terrychen.info/encryption-gpg4win


2015-05-27 encryption , efs , windows

加密入门(一):EFS

EFS 是 Encrypting File System 的缩写,意为加密文件系统,是 NTFS 文件系统的内建安全功能,Windows XP 之后的版本都完全支持这一特性(注意:Windows 入门版、家庭版和家庭高级版并不支持这一功能)。

EFS 的最大特点是简单易用,因为 EFS 是基于用户帐户的加密方案,也就是说只有用对文件进行加密的用户帐户登录才能使用,尽管这种加密方案存在着诸多缺点与限制,但是无疑是最简单的加密方案,用户只要能进入自己的账户即可访问,无需记忆多余的密码。

##1. 文件系统转换

EFS 必须在 NTFS 分区才能使用,如果硬盘分区是 FAT32 分区格式,请按照以下步骤转换为 NTFS 分区格式:

  1. 按下 Win + R 快捷键,在弹出的运行对话框中输入 cmd 并回车,启动命令提示符。
  2. 在弹出的命令提示符窗口中输入以下命令: convert X: /fs:ntfs 其中 X: 为你所要转换的分区盘符,输入完毕后按下回车键,等待完成后关闭窗口即可。

注意不要在转换过程中关闭命令提示符窗口,以免造成数据丢失。

##2. EFS 加密解密

使用 EFS 加密非常简单,仅需三步即可完成:

  1. 运行资源管理器,右键点击所要加密的文件或文件夹,选择“属性”。
  2. 在属性对话框中点击“高级”按钮,在高级属性对话框中勾选“加密内容以便保护数据”。
  3. 点击两次确定关闭“高级属性”和“属性”对话框,Windows 会要求选择加密范围,做出选择之后 Windows 就会开始加密过程。

如果将未加密的文件复制到 EFS 加密的文件夹中,这些文件将会被自动加密。如果将加密数据移动或复制到其他 NTFS 分区时,数据依旧保持加密属性,如果将其移动或复制到 FAT32 分区时,Windows 会询问是否解密,确认之后 Windows 会将其解密后复制或移动。

加密之后的文件或文件夹在资源管理器中将以绿色文字显示,如果你使用加密时所用的用户身份登录,那么 Windows 会在你访问这些加密数据时自动解密。但是对于攻击者来说,加密数据是无法读取修改的,因为这些数据已被 Windows 加密。

如果需要将 EFS 加密的数据解密,只要按照上述步骤取消“加密内容以便保护数据”选项即可。

##3. EFS 数据恢复密钥

由于 EFS 与用户帐户绑定,所以强烈推荐大家导出 EFS 数据恢复密钥,以免 Windows 出现问题导致加密数据无法访问。请按以下步骤导出数据恢复密钥。

  1. 按下 Win + R 快捷键,在运行对话框中输入 certmgr.msc,启动证书管理器。
  2. 在证书管理器左栏中,双击“个人”,单击“证书”。
  3. 在右栏中,右击“预期目的”为“加密文件系统”的证书,选择“所有任务”子菜单,然后点击“导出”。
  4. 在证书导出向导中点击“下一步”,点击“是,导出私钥”,点击“下一步”继续。
  5. 选择“个人信息交换”,点击“下一步”继续。
  6. 键入要使用的密码,确认该密码,点击“下一步”继续。
  7. 选择文件的名称和位置,点击“下一步”继续。
  8. 确认设置之后点击“完成”按钮,Windows 在导出完成之后会弹出对话框提示“导出完成”。

请按照以下步骤导入数据密钥:

  1. 双击导出的数据恢复密钥文件,启动证书导入向导,点击“下一步”继续。
  2. 确认将要导入的文件及其路径,点击“下一步”继续。
  3. 输入保护私钥的密码,请选择“标明该密钥为可导出”复选框,点击“下一步”继续。
  4. 选择“把所有证书保存到以下存储器中”,然后单击“浏览”并选择“个人”存储器,点击“下一步”继续。
  5. 确认设置之后点击“完成”按钮,Windows 在导入完成之后会弹出对话框提示“导入完成”。

EFS 作为一种简单的加密手段,适合对于数据安全要求不高的用户使用,对于数据安全要求较高的用户来说,BitLocker 或者更为专业的加密软件无疑是更好的选择。

##本文历史:

2011 年 3 月 11 日:初稿完成 2011 年 8 月 13 日:将 EFS 与 Bitlocker 拆分为两篇文章,并进行改写。

不知为何,原博客已经无法访问,我根据Google Cached将文章做备份。感谢InoReader帮我缓存了这么好的博客。

原文地址:加密入门(一):EFS http://terrychen.info/encryption-efs/


2015-05-27 encryption , efs , windows

加密入门(二):BitLocker

BitLocker 是 Windows 7 提供的基于分区的加密方式。BitLocker 不仅仅可以加密本机硬盘分区,还可以加密移动硬盘、U盘、SD 卡等移动存储设备。不过为了保证加密后的移动存储设备在 Windows XP 下面可以正常访问,请将其格式化为 FAT32 文件系统。

BitLocker 定位于商务用户,微软只在 Windows 7 企业版和旗舰版提供这一功能,使用之前请检查 Windows 版本。

##1. BitLocker 加密

本文操作只涉及本地硬盘非系统分区及移动存储设备。加密系统分区需要 TPM 支持,或者通过 U 盘启动,在此不作详细介绍,具体设置请参阅 http://blogs.technet.com/b/xiwang/archive/2009/05/19/windows-7-bitlocker.aspx。

请按照以下步骤对驱动器进行加密:

  1. 启动 Windows 资源管理器,右击要使用 Bitlocker 加密的驱动器,选择“启用 BitLocker”。
  2. 选择解锁驱动器方式,对于移动存储设备而言,解锁方式包括密码和智能卡解锁,对于本地非系统分区而言,解锁方式包括密码、智能卡和登录到 Windows 时自动对驱动器解锁(必须先使用 BitLocker 加密系统分区)。选择之后输入密码或者插入智能卡,点击“下一步”继续。
  3. 选择存储恢复密钥方式,以便在密码遗忘或智能卡丢失的情况下解锁驱动器,对于移动存储设备而言,存储方式包括“将恢复密钥保存到文件”和“打印恢复密钥”,对于本地非系统分区而言,存储方式包括“将恢复密钥保存到 USB 闪存驱动器”“将恢复密钥保存到文件”和“打印恢复密钥”。设置完毕点击“下一步”继续
  4. 确认使用 BitLocker 加密,点击“启动加密”按钮开始加密过程。

BitLocker 加密过程较为缓慢,请耐心等待,假如需要暂时移除移动存储设备,请暂停加密,以免造成数据丢失。

在 Windows 7 中插入 BitLocker 加密的驱动器,Windows 会自动弹出对话框让你输入密码,正确输入密码后就可以正常使用,而且使用时对性能的影响很小。

经过BitLocker加密之后的驱动器的图标与普通驱动器不同,Windows 7会以不同颜色的锁和钥匙图标来反映目前的存储器状态,其中灰色代表加密的磁盘已经解锁,黄色则是未解锁。

##2. BitLocker 管理

对于已经使用 BitLocker 加密的驱动器,我们可以修改 BitLocker 密码和解密驱动器。

在 Windows 资源管理器中右击已经使用 BitLocker 加密的驱动器,选择“管理 BitLocker”,在此处我们可以修改 BitLocker 密码。

在开始菜单搜索框中输入“BitLocker”,选择“BitLocker 驱动器加密”选项,然后在相应驱动器处选择“关闭 BitLcoker”即可对驱动器解密。

##3. 在 Windows XP 中读取加密数据

只有 FAT32 格式的移动存储设备在使用 BitLocker 加密之后能在 Windows XP 中读取,在 Windows XP 中双击加密分区,Windows 会要求输入密码,输入密码之后会弹出 BitLocker To Go 阅读器允许你读取加密分区中的文件,不过只能读不能写。

BitLocker 是一种比较简易的加密方式,推荐安装了 Windows 7 旗舰版或企业版的朋友一试。

##本文历史:

2011 年 3 月 11 日:初稿完成 2011 年 8 月 13 日:将 EFS 与 Bitlocker 拆分为两篇文章,并进行改写。

原文地址:加密入门(二):BitLocker http://terrychen.info/encryption-bitlocker/


2015-05-27 encryption , BitLocker , windows

KeePass 教程

如今,我们的生活充斥着各色各样的密码。所谓密码管理器,就是用一个主密码来保护所有其他密码。使用密码管理器,可以减轻记忆负担,而且只要在主密码不泄漏或者遗忘的情况下,我们的账户安全就能够得到保障。

本文所要介绍的 KeePass 就是一款出色的密码管理器,KeePass 具有以下优点:

  • 简单易用,易于上手。
  • 功能全面,既能保存密码,还能生成健壮的密码
  • 开源软件,安全性更高
  • 跨平台软件,支持 Windows、Linux 和 Mac 三大平台,甚至还有移动操作系统版本。
  • 移动版软件,便携绿色。

下面,我们一起来学习如何使用 KeePass。

##1. 下载安装 KeePass

KeePass 有经典版本 1.x 和专业版本 2.x 两种版本,主要有如下两点区别:

  1. KeePass 2.x 需要 .NET 2.0 以上版本(Windows Vista 以上版本已经预装)才能运行,而 1.x 不需要任何依赖。
  2. KeePass 2.x 功能更全面,例如增加了双通道自动输入混淆功能。

由于 KeePass 2.x 功能更为全面,我推荐大家选用这一版本。下文将以 KeePass 2.x 版本为例进行讲解。

访问 KeePass 官网下载页面 http://keepass.info/download.html ,左栏的 Classical Edition 为 KeePass 1.x 版本,右栏的 Professional Edition 为 KeePass 2.x 版本,每一栏中都有两个下载链接,分别是 Installer EXE for Windows 和 ZIP Package,即安装程序和移动版本,请按照自己的需要选择下载。

KeePass 的安装过程非常简单,按照提示安装即可。

安装 KeePass 完成之后,请访问 http://keepass.info/translations.html 下载中文语言包,页面中 Chinese, Simp. 即是简体中文语言包(五星红旗处),注意选择对应版本语言包。下载解压之后将 KeePass 的语言文件(*.lngx)复制到 KeePass 的安装目录。复制完成之后启动 KeePass,选择 View 菜单,点击 Change Language,在弹出的对话框中选择 Simplified Chinese,KeePass 将要求重新启动,点击 Yes 重新启动 KeePass 即可。

对于 Ubuntu 用户,请参阅如何在 Ubuntu 中安装 KeePass 2 进行安装设置。

2. KeePass 教程

2.1 创建密码数据库

开始使用 KeePass 之前,首先需要创建密码数据库以保存密码,步骤如下:

  1. 启动 KeePass,选择文件菜单,选择新建选项。
  2. 选择数据库文件保存路径,请将其存放在安全之处并注意备份。
  3. 选择数据库保护方式,包括以下三种类型:
    • 主密码:最为传统的保护方式,输入足够健壮而又易记的密码即可。
    • 密钥文件:保存一个密钥文件作为访问密码数据库的凭据,选择这种方式必须注意密钥文件的安全。
    • Windows 用户帐户:将密码数据库和 Windows 账户关联,只要使用当前 Windows 账户登录即可使用,但是如果重装系统的话请先导出当前账户,否则密码数据库将无法使用。

三种方式可以叠加使用,但是推荐大家使用主密码的方式进行保护。

  1. 最后对密码数据库进行设置,包括数据库名称、加密选项等等,请按照自己的需要进行设置即可。

2.2 保存密码及自动输入

此处将以 Gmail 为例讲解如何保存密码和自动输入,步骤如下:

  1. 运行 KeePass,点击添加记录(或者按下 Insert 键),弹出添加记录对话框。

  2. 在记录标签页中需要填写的项目主要有以下几项:

    • 标题:需要输入密码的窗口标题,该信息是 KeePass 在全局自动填写时用于选择帐户密码的根据。在本例中为打开 Gmail 网址后,浏览器标题栏的部分内容,比如 Gmail。
    • 用户名:在本例中为 Gmail 账号。
    • 密码:在本例中为 Gmail 的登录密码。
    • 网址:用于按下 Ctrl + U 快捷键 快速启动相关网址或程序,在本例中为 http://gmail.com 。如果需要设置程序时则输入 cmd:// 程序文件路径,或者点击工具按钮,选择其中的网址:选择程序选项。

在自动输入标签页,还可以勾选双通道自动输入混淆选项,以阻止木马通过键盘记录窃取你的密码,但是只有支持 Ctrl + V 快捷键粘贴的窗口才能使用。 设置完成之后启动浏览器(如果设置网址的话可在选中相关条目后按下 Ctrl + U 启动),按下快捷键左 Ctrl + Alt + A(注意关闭中文输入法),KeePass 将自动输入密码并登录 Gmail。除此之外还可以先选择浏览器窗口,然后调出 KeePass(快捷键左 Ctrl+Alt+K),在相应密码条目右击,选择执行自动输入,KeePass 就会自动输入账户密码,注意 KeePass 是按照前一焦点窗口的原则选择输入窗口的,所以请保证前一焦点窗口是正确的。

2.3 自定义自动输入方式

由于 KeePass 按照 {USERNAME}{TAB}{PASSWORD}{ENTER} 的序列输入密码的,一些网站或者软件不能正常登录。例如 TM 启动之后默认焦点是在密码输入框处,使用默认序列会出错。这时我们可以通过自定义自动输入序列来解决这一问题。

首先参照上述方法建立新密码条目,标题填入 TM,网址填入 CMD://”C:\Program Files\Tencent\TM2009\Bin\TM.exe”(由于目录中含有空格,因此必须包括英文双引号)。然后切换到自动输入标签页,勾选替代默认规则后,在输入框中输入以下内容:

+{TAB}{USERNAME}{TAB}{PASSWORD}{ENTER}

现在切换到 TM,按下左 Ctrl + Alt + A 即可自动登录。QQ 的设置与之类似,只要注意标题改为 QQ 即可。

下面我来介绍一下自动输入序列,默认输入序列是{USERNAME}{TAB}{PASSWORD}{ENTER},其中{USERNAME}是用户名,{PASSWORD}是密码,{TAB}是 Tab 键(用于切换焦点),{ENTER}是 Enter 键。一些特殊键的对应表可见官网文档 http://keepass.info/help/base/autotype.html#autoseq ,上面所用的 + 所对应的就是 Shift,和 Tab 组合之后可以跳到前一个输入框从而输入用户名。知道特殊键对应和写作规律之后我们也可以按照自己的情况写作特殊的自动输入序列。

2.4 生成安全密码

在新建密码条目时,点击确认密码文本框右侧的生成密码,选择打开密码生成器,就可以打开如下图所示的密码生成器。

在密码生成器中可以对密码生成方案进行配置,如密码长度、密码组成等等,设置完成后点击确定回到添加记录对话框,点击密码文本框右侧的用星号 显示 / 隐藏密码按钮,将密码复制出来用于注册,最后按照通常步骤添加密码记录即可。

上面就是使用 KeePass 的一些基本方法,除此之外,KeePass 还具有插件机制,请大家自行探索。

##本文历史:

2011 年 4 月 26 日:初稿完成 2011 年 5 月 1 日:第一次修改 2011 年 8 月 11 日:将标题由“KeePass 使用全攻略”修改为“KeePass 教程”,删除“KeePass 插件使用”一节,并精简文字。

原文地址:KeePass 教程 http://terrychen.info/keepass-tutorial/


2015-05-26 encryption , KeePass , windows

使用 javadoc 自动生成 Java 文档

Java 的注释,单行,多行的语法就不在赘述了。

javadoc tags

给 Java 源码文件书写注释,使用常见的 Java 注释可以实现一些,也可以通过如下的 Javadoc 的 Tags 来实现一些特殊的比如跳转,参数返回值等特殊标记。

javadoc 标记有如下一些:

  • @author 作者名,一般不推荐使用,git blame 基本上能够找到每一行代码的作者
  • @version 版本号
  • @see 跳转到相关类或者主题
  • @param 对方法中某参数的说明
  • @return 对方法返回值的说明
  • @exception 对方法可能抛出的异常进行说明

不过已经不建议在 Java 源文件中使用 @author 标记,现代的 git 完全能够满足模块作者的追溯,甚至可以精确到每一行的作者。

Package doc

上面的方法可以给类,方法,参数等等编写注释,如果要给一个包添加注释,就需要额外添加 package-info.java 的文件。

从 Java 1.5 版本开始可以在包下新建一个名为 package-info.java 的文件,在这个文件中可以使用标准 Java 注释来给 package 书写文档:

com/foo/package-info.java:

/**
 * com.foo is a group of bar utils for operating on foo things.
 */
package com.foo;

//rest of the file is empty

注释中的代码

如果要在 javadoc 中书写代码,尤其是想要展示一些例子的时候,不可避免的会用到 <, > 以及 @ 等等特殊的符号。Javadoc 默认是 html 的 tag 来渲染格式,所以这种情况下有 <pre><code> 选择,然后 javadoc 还提供了 {@code} 语法。这三个方式都可以用来注释代码,但各自又不相同。

使用 pre 标签

<pre> 标记是 html 默认的格式化标签,如果使用 <pre> 标签,那么所有的 html 的标记都需要转义。

/**
 * <pre>
 * public class JavadocTest {
 *   // indentation and line breaks are kept
 *
 *   &#64;SuppressWarnings
 *   public List&#60;String&#62; generics(){
 *     // '@', '<' and '>'  have to be escaped with HTML codes
 *     // when used in annotations or generics
 *   }
 * }
 * </pre>
 */
public class PreTest {}

命令行的使用

Java 安装完成之后在 Java Path 的目录中自带了 javadoc 这个命令行,如果不想使用 maven-javadoc-plugin 可以使用这个命令来生成 javadoc.

用法:

  javadoc [options] [packagenames] [sourcefiles]

选项:

  • -public 仅显示 public 类和成员
  • -protected 显示 protected/public 类和成员 (缺省)
  • -package 显示 package/protected/public 类和成员
  • -private 显示所有类和成员
  • -d 输出文件的目标目录
  • -version 包含 @version 段
  • -author 包含 @author 段
  • -splitindex 将索引分为每个字母对应一个文件
  • -windowtitle 文档的浏览器窗口标题

在 Intellij 中调整文件头

Intellij 默认会在创建文件的时候给文件添加一些注释,这些注释可以在如下的设置中修改:

File -> Setting -> Editor-> File and Code Template-> File Header

2015-05-26 javadoc , java , document

Java 内存模型

本文为《深入理解 Java 虚拟机》的笔记。

Java 虚拟机规范中定义了一种 Java 内存模型,来规避掉各种硬件和操作系统的内存访问差异,让 Java 在各种平台下都能达到一致的并发效果。Java 内存模型的主要目标是定义程序中各个变量的访问规则,在 JVM 中将变量存储到内存和从内存中取出变量这样的底层细节。

Java 内存模型的目标是定义程序中各个变量的访问规则,这里的变量 Variable 包含了实例字段、静态字段和构成数组对象的元素,但是不包括局部变量和方法参数,因为后者是线程私有的,不会被共享。

Java 内存模型规定所有变量存储在主存 Main Memory 中,每个线程都有自己的工作内存 Working Memory。线程的工作内存中保存了被该线程使用到的主存副本拷贝,线程对变量的所有操作都必须在工作内存中进行,而不能直接读写内存中变量。不同线程无法访问对方工作内存的变量,线程间变量传递需要通过主存来完成。

内存间交互操作

主存和工作内存之间定义了如下的操作。

  • lock : 作用于主存变量,把变量标识为一条线程独占状态
  • unlock : 作用于主存变量,把处于锁定状态的变量释放
  • read : 作用于主存,把变量值从主存传输到线程的工作内存,以便 load 使用
  • load : 作用于工作内存的变量,把 read 操作从主存中得到的变量值放到工作内存的变量副本中
  • use : 作用于工作内存变量,把工作内存的变量传递给执行引擎,当虚拟机遇到一个需要使用到变量的值的字节码指令时将会执行这个操作
  • assign : 作用于工作内存的变量,把从执行引擎收到的值赋值给工作内存的变量,当虚拟机遇到一个给变量赋值的字节码指令时执行这个操作
  • store : 作用于工作内存的变量,把工作内存中的一个变量的值传送到主内存中,以便随后 write 操作使用
  • write : 作用于主内存的变量,把 store 操作从工作内存中得到的变量的值放到主内存变量

定义了这些操作之后,就有一些规则,必须满足。

  • 不允许 read, load, store, write 操作单独出现,必须组合出现
  • 不允许线程丢弃它最近的 assign 操作
  • 不允许线程无原因(无 assign 操作)将数据从线程的工作内存同步到主存中
  • 新变量只能在主存中诞生,不允许在工作内存中直接使用未被初始化 (load or assign) 的变量,对一个变量实施 use 和 store 操作之前,必须先执行过 assign 和 load 操作
  • 一个变量同一时刻只允许一条线程对其 lock 操作,但 lock 操作可以被同一条线程重复执行多次,多次执行 lock 后,只有执行相同次数的 unlock 操作变量才会解锁
  • 对一个变量执行 lock 操作,将会清空工作内存中此变量的值,在执行引擎使用这个变量前,需要重新执行 load 和 assign 操作初始化变量的值
  • 如果变量没有 lock 操作,不允许 unlock 操作,也不允许 unlock 被其他线程锁定的变量
  • 对一个变量执行 unlock 操作前,必须把变量同步回主存中(执行 store 和 write 操作)

volatile 变量的规则

volatile 是 Java 虚拟机提供的最轻量的同步机制。但变量定义成 volatile 后,具备两种特性:

  • 此变量对所有线程可见,当一条线程对变量做出修改,新值对于其他线程来说是立即得知的
  • volatile 变量第二个语义是禁止指令重排序

2015-05-26 java , memory-model , jvm

我的RSS阅读器

在很久之前就曾经写过文章来推荐InoReader,而我自己也已经用了很长时间 InoReader 了。最近InoReader有了一些变化,Web端增加了广告,而Android手机端也增加了广告,虽然可能有些人会自此新生痛恨,但我感觉还好。那些广告并没有影响到我的阅读,位置也并没有那么有侵入性。而我作为使用了很长时间而又没有收入不能从金钱上支持他们的用户来说,我会推荐你关闭你的广告屏蔽插件,而手机山也可以继续使用它官方的App。而如果你真的不喜欢广告,而你也能支付,你可以购买他们的付费服务,当然如果你一定要去掉广告,用Adblock,或者手机上使用Amber也能一样的使用InoReader。

今天写这篇文章并不是要推荐InoReader,而是想寻求一种方式来管理我的订阅源。经过几年的积累,陆陆续续订阅了很多博客,网站,很多源已经失效,很多个人博客也不复存在。而我的订阅源我也只是看熟悉的那些。很多内容因为更新太快,或者我对更新的内容失去了兴趣,渐渐的就忘记了他们的存在。这是问题一,而第二个问题是在长时间查看固定的订阅源时,渐渐接触的范围,了解的圈子就狭窄了。所以为了解决这些问题,我就逐渐的整理我的订阅源,整理出那些值得订阅,值得收藏的源。

每日必读

选择原则

  1. 每天适量更新的网站或者博客,每天更新数目超过20条的网站或者博客不予考虑
  2. 全文输出,或者使用其他方式将网站全文内容输出
  3. 文章质量较高,有观点,有见解

所以我在订阅这个分类时就依赖我的兴趣点、我关心的IT,时事新闻,或者偶尔更新的个人博客。保证这个分类每天更新适量,而不是一天下来1000+,并且通过观看这个分类就能基本了解行情新闻。

科技新闻

TechCrunch, Android Police, cnBeta, Solidot, Google Operating System, The Next Web…等等更新非常快的媒体博客

软件及应用

曾经一段时间疯狂的寻找软件和应用,后来渐渐地就稳定了,基本需要用的那些软件也渐渐的熟悉起来,而这过程中也收藏了一些好的网站。在整理的过程中发现有些网站逐渐不更新,而有些网站更是域名都不存在了。剩下的都还是一些不错的站点。

这个分类下的网站都有以下特点:

  1. 网站主要是对软件和应用推荐
  2. 网站的每篇文章都会对推荐的软件进行详细的说明,有些网站会对同类型的软件进行横向的比较

博客

乱七八糟各种博客,但是在我整理的过程中很大部分都已经停止更新,而有些甚至域名都已经不存在了。不过好在InoReader缓存了部分博客,而Google也缓存了部分。这一部分比较杂乱继续整理中。

购物

该分类下主要是惠惠网和什么值得买这两个购物导购网站的Feed,这个分类下更新太快,我基本看不完。通过关键词过滤,找到合适的内容。


2015-05-20 inoreader

Linux notes

ssh keys

An SSH key allows you to establish a secure connection between your computer and server

ssh-keygen -t rsa -C "example@gmail.com"

show the public key

cat ~/.ssh/id_rsa.pub

Copy the key

Windows:

clip < ~/.ssh/id_rsa.pub

Mac:

pbcopy < ~/.ssh/id_rsa.pub

GNU/Linux(requires xclip)

xclip -sel clip < ~/.ssh/id_rsa.pub

参考:https://gitlab.com/help/ssh/README

screen

常用命令

screen -S name    启动
screen -ls        查看screen列表
screen -r name    恢复
  • GNU’s Screen 官方站点:http://www.gnu.org/software/screen/
  • 更多内容参考:http://www.cnblogs.com/mchina/archive/2013/01/30/2880680.html

命令参数

screen [-AmRvx -ls -wipe][-d <作业名称>][-h <行数>][-r <作业名称>][-s ][-S <作业名称>]
参数说明
-A  将所有的视窗都调整为目前终端机的大小。
-d <作业名称>  将指定的screen作业离线。
-h <行数>  指定视窗的缓冲区行数。
-m  即使目前已在作业中的screen作业,仍强制建立新的screen作业。
-r <作业名称>  恢复离线的screen作业。
-R  先试图恢复离线的作业。若找不到离线的作业,即建立新的screen作业。
-s  指定建立新视窗时,所要执行的shell。
-S <作业名称>  指定screen作业的名称。
-v  显示版本信息。
-x  恢复之前离线的screen作业。
-ls或--list  显示目前所有的screen作业。
-wipe  检查目前所有的screen作业,并删除已经无法使用的screen作业。

一些网站

开源世界旅行手册


2015-05-17 linux , notes

ASCII Unicode GBK UTF-8 字符编码的区别与联系

很久很久以前,有一群人,他们决定用 8 个可以开合的晶体管来组合成不同的状态,以表示世界上的万物。他们看到 8 个开关状态是好的,于是他们把这称为”字节“。再后来,他们又做了一些可以处理这些字节的机器,机器开动了,可以用字节来组合出很多状态,状态开始变来变去。他们看到这样是好的,于是它们就这机器称为”计算机“。

开始计算机只在美国用。八位的字节一共可以组合出 256(2 的 8 次方)种不同的状态。 他们把其中的编号从 0 开始的 32 种状态分别规定了特殊的用途,一但终端、打印机遇上约定好的这些字节被传过来时,就要做一些约定的动作。遇上 0x10, 终端就换行,遇上 0x07, 终端就向人们嘟嘟叫,例好遇上 0x1b, 打印机就打印反白的字,或者终端就用彩色显示字母。他们看到这样很好,于是就把这些 0×20 以下的字节状态称为”控制码”。他们又把所有的空 格、标点符号、数字、大小写字母分别用连续的字节状态表示,一直编到了第 127 号,这样计算机就可以用不同字节来存储英语的文字了。大家看到这样,都感觉 很好,于是大家都把这个方案叫做 ANSI 的”Ascii”编码(American Standard Code for Information Interchange,美国信息互换标准代码)。当时世界上所有的计算机都用同样的 ASCII 方案来保存英文文字。

后来,就像建造巴比伦塔一样,世界各地的都开始使用计算机,但是很多国家用的不是英文,他们的字母里有许多是 ASCII 里没有的,为了可以在计算机保存他们的文字,他们决定采用 127 号之后的空位来表示这些新的字母、符号,还加入了很多画表格时需要用下到的横线、竖线、交叉等形状,一直把序号编到了最后一个状态 255。从 128 到 255 这一页的字符集被称”扩展字符集“。从此之后,贪婪的人类再没有新的状态可以用了,美帝国主义可能没有想到还有第三世界国家的人们也希望可以用到计算机吧!

等中国人们得到计算机时,已经没有可以利用的字节状态来表示汉字,况且有 6000 多个常用汉字需要保存呢。但是这难不倒智慧的中国人民,我们不客气地把那些 127 号之后的奇异符号们直接取消掉,规定:一个小于 127 的字符的意义与原来相同,但两个大于 127 的字符连在一起时,就表示一个汉字,前面的一个字节(他称之为高字节)从 0xA1 用到 0xF7,后面一个字节(低字节)从 0xA1 到 0xFE,这样我们就可以组合出大约 7000 多个简体汉字了。在这些编码里,我们还把数学符号、罗马希腊的字母、日文的假名们都编进去了,连在 ASCII 里本来就有的数字、标点、字母都统统重新编了两个字节长的编码,这就是常说的”全角”字符,而原来在 127 号以下的那些就叫”半角”字符了。 中国人民看到这样很不错,于是就把这种汉字方案叫做 “GB2312“。GB2312 是对 ASCII 的中文扩展。

但是中国的汉字太多了,我们很快就就发现有许多人的人名没有办法在这里打出来,特别是某些很会麻烦别人的国家领导人。于是我们不得不继续把 GB2312 没有用到的码位找出来老实不客气地用上。 后来还是不够用,于是干脆不再要求低字节一定是 127 号之后的内码,只要第一个字节是大于 127 就固定表示这是一个汉字的开始,不管后面跟的是不是扩展字符集里的内容。结果扩展之后的编码方案被称为 GBK 标准,GBK 包括了 GB2312 的所有内容,同时又增加了近 20000 个新的汉字(包括繁体字)和符号。 后来少数民族也要用电脑了,于是我们再扩展,又加了几千个新的少数民族的字,GBK 扩成了 GB18030。从此之后,中华民族的文化就可以在计算机时代中传承了。 中国的程序员们看到这一系列汉字编码的标准是好的,于是通称他们叫做 “DBCS“(Double Byte Charecter Set 双字节字符集)。在 DBCS 系列标准里,最大的特点是两字节长的汉字字符和一字节长的英文字符并存于同一套编码方案里,因此他们写的程序为了支持中文处理,必须要注意字串里的每一个字节的值,如果这个值是大于 127 的,那么就认为一个双字节字符集里的字符出现了。那时候凡是受过加持,会编程的计算机僧侣 们都要每天念下面这个咒语数百遍: “一个汉字算两个英文字符!一个汉字算两个英文字符……”

因为当时各个国家都像中国这样搞出一套自己的编码标准,结果互相之间谁也不懂谁的编码,谁也不支持别人的编码,连大陆和台湾这样只相隔了 150 海里,使用着同一种语言的兄弟地区,也分别采用了不同的 DBCS 编码方案——当时的中国人想让电脑显示汉字,就必须装上一个”汉字系统”,专门用来处理汉字的显示、输入的问题,但是那个台湾的愚昧封建人士写的算命程序就必须加装另一套支持 BIG5 编码的什么”倚天汉字系统”才可以用,装错了字符系统,显示就会乱了套!这怎么办?而且世界民族之林中还有那些一时用不上电脑的穷苦人民,他们的文字又怎么办? 真是计算机的巴比伦塔命题啊!

正在这时,大天使加百列及时出现了——一个叫 ISO (国际标谁化组织)的国际组织决定着手解决这个问题。他们采用的方法很简单:废了所有的地区性编码方案,重新搞一个包括了地球上所有文化、所有字母和符号 的编码!他们打算叫它”Universal Multiple-Octet Coded Character Set”,简称 UCS, 俗称 “unicode“。 unicode 开始制订时,计算机的存储器容量极大地发展了,空间再也不成为问题了。于是 ISO 就直接规定必须用两个字节,也就是 16 位来统一表示所有的字符,对于 ASCII 里的那些“半角”字符,unicode 包持其原编码不变,只是将其长度由原来的 8 位扩展为 16 位,而其他文化和语言的字符则全部重新统一编码。由于”半角”英文符号只需要用到低 8 位,所以其高 8 位永远是 0,因此这种大气的方案在保存英文文本时会多浪费一倍的空间。

这时候,从旧社会里走过来的程序员开始发现一个奇怪的现象:他们的 strlen 函数靠不住了,一个汉字不再是相当于两个字符了,而是一个!是的,从 unicode 开始,无论是半角的英文字母,还是全角的汉字,它们都是统一的”一个字符“!同时,也都是统一的”两个字节“,请注意”字符”和”字节”两个术语的不同,“字节”是一个 8 位的物理存贮单元,而“字符”则是一个文化相关的符号。在 unicode 中,一个字符就是两个字节。一个汉字算两个英文字符的时代已经快过去了。

unicode 同样也不完美,这里就有两个的问题,一个是,如何才能区别 unicode 和 ascii?计算机怎么知道三个字节表示一个符号,而不是分别表示三个符号呢?第二个问题是,我们已经知道,英文字母只用一个字节表示就够了,如果 unicode 统一规定,每个符号用三个或四个字节表示,那么每个英文字母前都必然有二到三个字节是 0,这对于存储空间来说是极大的浪费,文本文件的大小会因此大出二三倍,这是难以接受的。

unicode 在很长一段时间内无法推广,直到互联网的出现,为解决 unicode 如何在网络上传输的问题,于是面向传输的众多 UTF(UCS Transfer Format)标准出现了,顾名思义,UTF-8 就是每次 8 个位传输数据,而 UTF-16 就是每次 16 个位。UTF-8 就是在互联网上使用最广的一种 unicode 的实现方式,这是为传输而设计的编码,并使编码无国界,这样就可以显示全世界上所有文化的字符了。

UTF-8 最大的一个特点,就是它是一种变长的编码方式。它可以使用 1~4 个字节表示一个符号,根据不同的符号而变化字节长度,当字符在 ASCII 码的范围时,就用一个字节表示,保留了 ASCII 字符一个字节的编码做为它的一部分,注意的是 unicode 一个中文字符占 2 个字节,而 UTF-8 一个中文字符占 3 个字节)。从 unicode 到 uft-8 并不是直接的对应,而是要过一些算法和规则来转换。

Unicode 符号范围 (十六进制) UTF-8 编码方式(二进制)
0000 0000-0000 007F 0xxxxxxx
0000 0080-0000 07FF 110xxxxx 10xxxxxx
0000 0800-0000 FFFF 1110xxxx 10xxxxxx 10xxxxxx
0001 0000-0010 FFFF 11110xxx 10xxxxxx 10xxxxxx 10xxxxxx

之前一直对字符编码很模糊,网查资料被忽悠地晕头转向,看完这篇风趣的文章,把之前模糊的知识点串联起来,并稍加总结,我和我的小伙伴们都明白了!

转载自:http://dengo.org/archives/901

更多中文编码知识请看:中文编码


2015-05-17 encoding , 编码 , unicode , utf8 , ascii

字库格式介绍

Bitmap 字库

点阵字库 (Bitmap) 是最早被采用的一种数字化字库的格式,每个字形以黑白像素点阵矩阵组成。但是随着字号变大,数据量会呈几何级数增长,所以不适于复杂的大字号中文字形显示。但它在描述小字号时有明显的优势,可以加入人工的笔画取舍、合并和变形,使得字形尽可能地清楚展示。

随着显示设备分辨率和处理器性能的提高,点阵字已被曲线字所取代,或部分嵌入在曲线字中以提高小字的清晰度。它更多的应用是在低分辨率的设备上,例如老旧的手机、掌上电脑、仪器仪表、数码相机、收款机、银行或者邮局的票据打印机等。

PostScript 字库

PostScript 是美国 Adobe 公司发展的一种页面描述语言。所谓页面描述语言,实际上是一种专门的计算机语言用来描述和记录版面上的内容和结构。它以精确的坐标数据,精密的数学公式和规定的格式来定义页面上的各种元素,如文字、色彩、图形图像的位置、形状等等。

PostScript 字形描述技术是用美国 Adobe 公司的 PostScript 页面描述语言来描述字形的一种技术。 CID 字库是美国 Adobe 公司发表的最新字库格式,所有字形描述都采用 PostScript Type 1 格式,他具有易扩充、速度快、兼容性好、简便、灵活等特点,这种标准格式保证了跨平台的高质量输出。

CID 字库

CID (character identifier) 字符识别码,总字符集包括了一种特定语言中所有常用的字符,把这些字符排序,他们在总字符集中排列的次序号就是各个字符的 CID 标识码。CMap(character Map)字符映射文件,将字符的编码映射到字符的 CID 标识码,再用 CID 标识码从 CIDFont 文件中取到字形信息。 CIDFont 文件中不仅存储了字库中所有字符的描述,还包含了字体的提示(HINT)信息,它既能控制笔画的粗细,还能控制笔画之间空白,使解释器在字体比较小,设备分辨率低的情况下,得到细小清晰的笔画复杂的中日韩文字形。

TrueType

常见的 ttf 文件,就是 TrueType 字库文件。

TrueType 是由美国苹果公司和微软公司联合提出的一种用数学函数描述电脑字体轮廓的技术。TrueType 采用几何学中二次 B 样条曲线及直线来描述字体的外形轮廓,含有字形构造、颜色填充、数学描述函数、流程条件控制、栅格处理控制、附加提示控制等指令。

TrueType 字体的主要特点在于它所见即所得。由于 TrueType 字体是由指令对字形进行描述,因此它与分辨率无关,均以设备的分辨率输出,既可以屏幕显示,又可以打印输出,无论放大缩小,字符总是光滑的,不会有锯齿出现。但是相对 PostScript 字体来说,特别是在文字太小时,其表现质量要差一些。

OpenType 字库

常见的 otf 字体文件,就是 OpenType Font 字库文件。

OpenType 字库是美国微软公司与 Adobe 公司联合开发的用来替换 TrueType 字型的数字化曲线轮廓字库格式。OpenType 字库采用 Unicode 编码,是 TrueType 格式的扩展延伸,扩展了 Adobe CID-Keyed font 技术。它在继承了 TrueType 格式的基础上增加了对 PostScript 字型数据的支持,所以 OpenType 字体中的字型轮廓数据既可以选择在‘glyf’表中 TrueType 格式轮廓,也可以选择在‘CFF’表中的 CFF(压缩字体格式,Compact Font Format)格式轮廓。

OpenType 字库信息小,字形可以所以缩放、变形(旋转、倾斜、弯曲)而不失真,具有很强的兼容性及独特丰富的排版特性。

总结

经过几十年时间的演变,目前市场已经被 OTF, TTF 统治。基本上桌面平台,移动平台,大部分的系统都能兼容这两个字体。


2015-05-16 font , code , information , opentype , truetype

电子书

最近文章

  • So you Start 独服 Proxmox VE 配置 RAID 10 之前购买的 So you Start(OVH 旗下品牌) 的独服,配置有 4 块 2T 的硬盘,但是 So you Start 后台默认的 RAID 级别是 RAID1,这样使得可用的空间只有 8T 中的 2T,25% 的使用率,虽然硬盘安全性级别比较高(允许多块硬盘损坏的情况下依然不丢数据),但是空间可用率太低了,所以折中一下可以使用 RAID-10(允许一块硬盘损坏而不丢失数据),这里就记录一下如何把 So you Start 的独服从 RAID-1 级别在线调整成 RAID-10。正常情况下 OVH 旗下的主机品牌,包括 OHV,So you Start, Kimsufi 都可以适用本教程,其他独服的操作也类似。
  • Ubuntu 20.04 使用 MergerFS [[so-you-start]] 的独服有4块 2T 的硬盘,本来想配置一个 Soft RAID-10,但折腾了一个礼拜,重装了无数遍系统,配置了很多次,从 Ubuntu,Proxmox VE,Debian 都尝试了一遍,最终放弃了,想着充分利用其空间,使用 Proxmox VE,备份好数据,不用 RAID 了,毕竟如果使用默认的 RAID-1,我只能利用8T空间中的 2T 不到,而使用 RAID-10 也只能利用不到 4T 左右空间。至于使用单盘,所有的数据备份,和数据安全性的工作就完全依靠自己的备份去完成了。但是好处是可利用的空间大了。
  • 独服 Proxmox VE 配置 NAT 使虚拟机共用一个公网 IP [[so-you-start]] 的独立服务器本来安装了 Ubuntu 20.04,后来想想为了充分利用 CPU 和内存,不如安装一个 [[Proxmox VE]] 然后在其基础之上再安装 Ubuntu 或者其他的系统测试。So you Start 通过后台安装 Proxmox 的过程比较简单,我直接使用了后台的 Proxmox VE 6 模板安装了 Proxmox。
  • So you Start 独服 Proxmox VE 虚拟机配置 Failover IP 最近买了一台 [[so-you-start]] 的独立服务器,开始的时候安装了 Ubuntu 没有充分利用独立服务器的优势,所以这两天把系统重新安装成了 Proxmox VE,然后在上面又安装了 Ubuntu 20.04,So you Start 提供了额外可以购买的 16 个 [[Failover IPs]],Failover IP 本来是为了可以将服务器迁移到另外的服务器而提供的机制,但在 Proxmox VE 虚拟化技术系统下,可以给虚拟机也分配不同的 IP,这样就实现了从一台服务器虚拟化多个 VPS 的操作。
  • 使用 Remark42 替换博客的 Disqus 评论系统 前两天用隐身窗口打开自己的博客的时候突然发现 Disqus 评论框上一大片广告,没想到现在 Disqus 已经这样了,并且之前还暴露出过隐私问题。所以就想着什么时候替换掉它。