分类 独立文稿 下的文章

视频点此

可以说unity桌面是我正经使用Linux后最早接触的桌面环境,也可以算是我最习惯使用的桌面环境之一。而关注unity或者ubuntu的朋友可能知道,ubuntu从18.04开始,其默认的桌面环境切换回了gnome。但在2020年出现了由一个印度小兄弟领导发布的ubuntu unity,旨在提供回原生的unity桌面体验。所以在我发现这个发行版之后,我便在unity的吸引下重新装回了放弃多年的ubuntu。但最终,我还是把ubuntu给换掉了,今天就来简单聊聊其中的原因。

一、优势

无论如何,ubuntu可能也是用户数量相当高的一个发行版,因此很多网上Debian系发行版的教程、可以搜索到的疑难解答实际上都是参照乌班图的软件仓库进行编写的,这样一来在日常使用过程中就可以有相当方便、快捷的网络支持体验。同样的,由于使用人数众多,如果一个软件想兼容Linux,那么一般来说最先得到官方适配的基本就是ubuntu无疑了。

此外,ubuntu背后有公司存在,且基于Debian衍生,所以在寿命、稳定性方面可以信任。除了LTS版本提供更长时间的支持之外,还可以加入ubuntu pro计划以获得更长的维护支持。且如果个人使用的话,这个还是免费的。

更多优势我就不说了,老生常谈。最主要的是我为什么最终换掉了它。

二、劣势

原因只有一个:snap。
Snap是ubuntu自己推出的一种软件包形式,且已经融合在ubuntu中。随着snap的逐渐完善,Ubuntu也在逐步降低对deb软件包的支持力度。而官方更是给出了将在23.10版本中加入snap商城,可能后续加入的应用程序会优先提供snap形式,再适时加入到apt仓库之中。
Snap的优势算是比较明显的,简单来讲就是类macOS组织形式,应用之间相互隔离,依赖版本冲突可以得到很好的解决。
但一个比较致命的问题:snap的服务器在国内没有镜像站点。
是的,即使不使用Linux的朋友都可以猜到个大概了:虽然可以建立连接,但速度太慢了。更不用说时不常的还需要检查并更新snap应用。这很难让人很难坚持下去。

此外,由于snap在程序启动时候相当于建立了一个虚拟的系统环境,这使得程序的启动速度相对传统的方式会减慢不少——当然,可能是因为我的Linux分区还是使用机械硬盘的缘故,如今固态硬盘这个影响可能已经不明显了。

但建立虚拟的程序环境意味着一个问题:系统所有的配置应该都可以映射过去,这样才能保证使用的过程中不会出现什么奇异的问题。但目前的snap分明没能完全顾全这一点。比如我的chrome下载文件默认的保存位置是一个轻易找不到的路径,我当时为了这个路径研究了半天文件夹之间的映射关系。如果是一个没有发现相关规律的用户使用的话,那对snap版本的chrome可能只有一个评价:这个chrome下载会把文件下丢。
另一个比较影响使用的情况:输入法。在我使用的这段时间中有两种经典情况:输入法候选列表不展示、根本无法唤醒中文输入法。这个不多解释,想想就能知道对于中文用户来说,这种程序在使用的时候会有多麻烦。

可能会有朋友说ubuntu还有其他的一些问题,比如版本号更新经常性的更坏掉、经常性的报告系统错误弹窗之类的。但这些是ubuntu在使用snap格式软件包之前就存在的一些问题。既然选择了ubuntu那么说明这些经典问题已经考虑过了,相较于unity,还是unity更香一些。但真的使用起来,发现snap异味完全覆盖过了unity的清新。

当然,snap这些问题可能也是因为unity没有完全适配好,官方版本不会出现。诚然,可能官方对snap的支持会更全面一些,但国内镜像站点不存在就是不存在,而且官方使用gnome桌面,我能有什么特殊的理由一定要选择ubuntu呢?

视频点此

一说到Linux,就一定会想到终端——无论把它看作优势还是劣势。那么这个终端相对于另外两大操作系统,有没有什么特别之处呢?

说到Linux终端的用处可以说很多,比如安装软件、更新系统、调整配置之类的。但一定程度上,另外两个操作系统的终端程序也可以拥有类似的功能。所以我一直认为Linux终端的优势在于可以快速查看程序出错的原因,这在另外两大操作系统中是比较难做到的。举一个Gnome设置崩溃的例子来看。

表现

点击gnome设置,图形界面会呈现程序启动的相关动画,但并不能展示出设置的窗口。这可以说是非常典型的启动即崩溃问题。通常在macOS和Windows中,对于这种点击后有运行迹象,但就是没有窗口的程序我们可能完全不清楚发生了什么。而对于Linux,我们可以通过终端来运行,快速查看程序到底发生了什么事。

查看原因

直接打开终端,启动gnome设置命令gnome-control-center——当然,如何找到这种启动命令可能也是一个小知识点,以后有机会的话会简单介绍一下。

此时,终端执行的优势就出来了,直接给出了错误信息:(gnome-control-center:15840): GLib-GIO-ERROR **: 13:41:26.403: Settings schema 'org.gnome.shell.app-switcher' is not installed

那么对症下药,补充这个模式就可以了。

但很不幸,这玩意儿貌似没有一个软件包或任何可以搜索到的来源包含这个玩意儿……此时终端的另一个有共识性的优势就体现出来了:直接修改配置。

gnome家族的软件多数都是用gsettings来调整配置的,图形化的软件可以参考dconf。

此时在终端中运行gsettings list-keys org.gnome.ControlCenter,可以看到其拥有的设置项,其中的last-panel,可能是记录了退出设置程序时打开的界面。联想到前一次正常打开时,是点击了多任务标签后直接崩溃的,因此推测由于last-panel记录了最后点击的标签页,再次打开设置时由于直接根据记录定位到了多任务,所以会再次漰溃进而无法启动。

为了验证,获取last-panel的值gsettings get org.gnome.ControlCenter last-panel
看到值为multitasking,确认了上述推测。因此将这个值复位应该即可解决:gsettings reset org.gnome.ControlCenter last-panel

再次打开设置,成功启动。

我一直很喜欢一种网页风格:没有排版,也没有华丽的装饰,各种文字信息以较高密度呈现在观看者眼前的风格。后来我逐渐意识到,这种风格十分偏向于千禧年前后,匠人手制网页的模样。

在我把Typecho更新之后,曾经的主题便不兼容了。也是在这时候,我发现Typecho自己的主题挺有我说的那种味道的,于是打算直接用默认主题就得了。但渐渐的,我发现默认主题还是多多少少有些缺失的,比如首页直接把文章全文按顺序排列,浏览文章十分不便。所以,我最终决定把官方这个主题打磨一下,让它成为我心目中最理想的,最千禧年风格主题。现在,它来了。

Übermorgen/Typecho Millennium Style主题


特性及优势

  1. 基于官方主题,原汁原味的简约,完全区分文章与独立页面这两个Typecho的文章形式
  2. 紧凑的自适应布局,高信息密度、清晰的观感
  3. 亮暗模式,轻点按钮即可实现
  4. 可选置顶文章,公开事项不必担心被新发表内容淹没了
  5. 可选在首页展开最新发布的文章,主次区分更明显。不必担心文章点击量降低,若开启,首页即是文章页
  6. 可选使用分类文章列表,调理更清晰,博客主题更凸显
  7. 可选展示随机文章,引流更全面,搜索引擎更友好
  8. 可选展示联系方式,全面宣传不再困难
  9. 所有可以看到的图形元素均已font-awesome字符化,包括搜索栏右边的放大镜按钮,加载快人一步
  10. 搜索、归档、分类文章界面半隐效果,增加点击概率
  11. 分类、标签同级展示,连接更方便

安装、设置

2.1版本后,插件TePostViews作为主题推荐插件会在后台弹窗提示。推荐安装激活以获得更完全的体验。

直接前往gitee下载最新发行版,解压到你的Typecho文件夹/usr/theme/中将文件夹重命名为Millennium-style,然后在Typecho后台启用即可。

每次推出新版本时,typecho后台—控制台—外观—设置外观会弹出提示。此时再次前往前面的网页下载最近发行版,解压覆盖即可。

当前,如果你熟悉git操作的话,也可以直接克隆这个工程的master分支。这样每次发出新版本的时候,只需同步一次即可。

现在,可以切换到主题的设置界面,你首先会看到这些勾选项。它们各自控制着首页不同板块,具体如下图所示。

在选项下面,是四个自定义项目。相关说明如下。

置顶文章ID

如果前面开启了置顶文章功能,那么可以在这里输入文章的cid使其在首页置顶显示。多篇置顶可以连续输入,通过英文逗号分隔。置顶的文章可以在首页显示标题及一部分文章内容。

获取cid是简单的,只需查看文章链接中的数字即可。

注意:推荐输入不超过3篇置顶文章,以获得最佳展示效果;仅当置顶文章被勾选且此处写入了文章ID,置顶模块才会被启用。

分类缩略名

如果前面开启了显示分类功能,那么可以在这里输入分类的slug,使首页直接展示这些分类下的文章列表。这些列表将只显示标题而不再显示正文预览。

获取slug也是简单的,直接进入博客设置界面-管理-分类中查看缩略名一列即可。

注意:推荐输入3的倍数个分类,分类名间用英文逗号分隔;仅当显示分类被勾选且此处写入了slug,分类文章列表模块才会被启用。

社交信息

这是上述所有设置项目中最繁琐的。但格式很简单:一行一个社交平台信息,按照社交平台名,链接,图标,用户名的形式输入即可(中间通过英文逗号分隔)。

  • 社交平台名:鼠标放到社交按钮上会浮现出来的名字
  • 链接:如微博、其他平台的主页等,会有对应的超链接地址。有则复制,没有则输#
  • 图标:关联font-awesome。直接输入font-awesome的图标样式即可;若没有则留空(不过font-awesome那么多图标,总会有一个是比较沾边的)
  • 用户名:展示在图标旁的名字。当然也可以使用社交平台的名字而不用用户名

注意:仅当显示社交平台信息被勾选且此处写入了字段才会被启用。

下面举几个例子。

1、微信(有用户名、有图标、无链接)

微信,#,fab fa-weixin,stsiao

2、Tg(有用户名、有图标、有链接)

telegram,https://t.me/stsiao,fab fa-telegram,@stsiao

3、灵感创造者(我的另一个站点,无用户名,无图标,有链接)

灵感创造者,https://kanban.bwsl.wang,,灵感创造者

对于站内链接,也可以放在这里。比如增加一个本站RSS订阅按钮:

RSS,/feed,fa fa-rss,RSS

随机文章显示数量(2.1版本新增)

这部分非常容易理解。如果打开了随机文章功能,那么可以在这里自定义这个模块显示的文章数量。留空则应用默认值8篇。

友链(2.6版本新增)

如果此处填写有信息,对于PC端,此部分会展示在页脚文章归档模块下方;对于手机端,此部分会展示在页脚社交平台信息与搜索栏之间。填写方法很简单,一行一个,按照名称,地址格式书写。其中:

  • 地址应该以http或https开头
  • 中间为英文逗号

那么就说到这儿吧,祝使用愉快。

视频点此

如果你关注过一些国内的for Linux应用的话就会发现,它们之中很多都是通过网页版套壳实现的。对于一些有着非常完善的网页版应用来说,如此方法确实可以在很短时间内打造一款全平台兼容的本地化应用。对于这类操作,Linux下拥有一个小工具来实现——nativefier

这是一个纯粹的终端程序,一行指令即可将一个网页打包成一个全平台兼容的electron套壳应用。可以前往GitHub查看具体内容。这里只介绍基本用法。

一、安装

在很多发行版中都可以直接通过源来安装。对于openSUSE,直接通过opi nativefier即可搜索到对应的OBS源,添加安装即可。

对于源中没有这个软件的,或者Windows、macOS来说,由于此工具由nodejs编辑,直接使用npm install -g nativefier安装即可。

二、基本使用

在安装完成后,便可以直接使用了。

基础命令为:nativefier -n <打包后的应用名称> -p <程序兼容的平台> —-arch <架构> —- weight <窗口宽度> —-height <窗口高度> <网页URL>

如打包微信网页版:nativefier -n WeChat -p Linux ——arch x64 ——width 1024 ——height 768 https://wx.qq.com/

  • 如果想让程序可以后台运行,可以增加参数——tray
  • 如果不想在使用时可以调出chrome的开发者工具,可以增加参数——disable-dev-tools
  • 如果想控制程序在同一时间只能运行一个实例,则增加参数——single-instance

设置好参数后回车,第一次运行会自动获取一个electron的依赖,然后自动开始打包。打包完成的程序会放置在~/<应用名称>-<兼容平台>-<架构>/文件夹下。你可以直接在这个文件夹下执行二进制文件以启动程序,或自己编辑一个desktop文件,将这个打包好的程序“安装”到系统中运行了。

视频点此

深度更新了Deepin15.5版本之后,增加了面容识别功能。对于其他发行版,有没有可能拥有呢?这就是今天要介绍的开源程序:howdy。

如果你在深度论坛中大概浏览过的话就会发现,有些人认为深度的人脸识别功能就是将howdy内置到系统中实现的。具体怎么做的我在这里就不深究了,不过我们可以通过howdy在其他发行版中增加人脸识别这一功能。

安装在大多数发行版中都是十分简单的,我们可以参照howdy的GitHub介绍来完成:

  • 对于Ubuntu系:添加ppa源,然后通过apt安装即可
  • 对于Debian系:从GitHub的release界面下载deb包安装即可
  • 对于Arch系:通过aur安装即可
  • 对于Fedora:启用CPOR源,然后通过dnf安装即可
  • 对于openSUSE:通过opi,自动添加OBS源并安装即可

但是在实际安装过程中,我的openSUSE15.3出现了一些依赖问题,所以对于这个系统,需要进行一些额外的补充。

缺少的依赖是python3-opencv3,我们选择忽略依赖继续,将howdy包先装好。此时,howdy的部分功能是可以使用的,但最核心的识别功能不可用,所以还是需要对依赖进行补全,直接通过opi来安装即可。推荐在查询结果中选择science这个官方性质的OBS源使用,避免后期不必要的问题。

接下来就是对howdy进行配置,让howdy知道这台电脑的人脸识别设备——也就是摄像头——是哪一个。

  1. 使用文本编辑器打开/etc/lib64/security/howdy/config.ini
  2. 查找device_path一行,将等号后面的none更改为摄像头设备的路径
    a. 安装v4l-utils,这个包可以直接安装
    b. 使用命令v4l2-ctl --list-devices查看设备
    c. 记录摄像头名称对应的路径,填入配置文件即可
  3. 保存

现在,就可以尝试添加一个面容数据了。

  1. 使用命令sudo howdy add
  2. 根据提示随便输入一个模型名称(不能超过24个字符)
  3. 面向摄像头,让它认识你
  4. 你会看到“Added a new model to 你的用户名”,这就代表完成了

这时,通过sudo howdy list就可以看到刚刚录入的脸部模型了。当然,howdy也提供一些管理模型的参数,具体可以查询GitHub的介绍。

最后,就是将人脸识别加入到密码认证的步骤当中了。对于openSUSE来说,虽然不是howdy要求的依赖,但必须安装一个叫pam-python的包才能将howdy与认证联系起来。但在openSUSE15.3中,又不存在这个包,所以需要手工安装一下。

  1. 进入openSUSE官方的包搜索工具
  2. 搜索pam-python,选择ALL Distributions
  3. 进入搜索结果中,找到openSUSE Leap 15.2,点击official release中的Expert Download
  4. 打开的页面中,点击Grab binary packages directly,下载不带.src的一项
  5. 双击下载的文件安装

到此,这个负责认证的包就安装好了。接下来,就是将人脸认证接入。

相关文件全部在/etc/pam.d中,根据需要增加语句即可。这里以使用sudo命令时进行人脸认证为例。其他命令使用人脸的方法一样,只是调整一下编辑的文件即可

  1. root权限打开sudu文件
  2. 在文件最开始增加人脸认证语句
    auth sufficient pam_python.so /usr/lib64/security/howdy/pam.py
  3. 保存

此时,当使用sudo命令时,摄像头便会启动,尝试识别人脸。如认证通过,则正常执行命令,否则弹出密码输入要求,我们可以通过密码来进行认证。

不过对于openSUSE来说,使用sudo时候默认请求的是root账户密码,因此人脸也是请求的root账户的人脸。但刚刚howdy录入的人脸是我们这个账户的人脸,所以我们可以通过howdy指定用户录入功能录入root人脸信息,也可以通过修改sudoer文件,将请求的密码改成当前账户即可。

视频点此

如果你使用iOS系统的话,应该会注意到快捷指令app中“我的快捷指令”与“自动化”两个标签。今天,简单来介绍一下我认为比较新颖的使用思路。

首先来说如何使用快捷指令呢?在快捷指令界面下,一个标签就是一个快捷指令执行的功能,使用的时候直接点击对应的标签即可。

或者在可以直接在桌面增加快捷指令的小部件,点击运行;又或者可以直接将快捷指令发送到桌面图标(只需要在快捷指令app中,点击需要发送到桌面的快捷指令模块右上角的三个点,再点击右上角设置—添加到主屏幕,设置好图标和名称之后确认添加即可。

对于快捷指令的自动化界面也很容易理解。就是在特定的条件下自动去触发某一系列操作。

仔细查看一下两个界面可以添加的动作就会发现,快捷指令模块和自动化模块可以添加的动作几乎是一样的,那么为什么会出现这两个界面呢?

我个人认为,之所以把自动化放在了快捷指令的后面,是因为我们可以把快捷指令界面的每一个按键理解为一个函数,自动化可以去引用这些函数。

你可能不是很能理解为什么要通过引用来实现本可以在自动化中直接编写出来的操作,这里我直接举一个例子,也许就能体会到引用的优势了。

就像前面截图,我有一个更换表盘的快捷指令。这个快捷指令中只有一个动作:将Apple Watch表盘调整为团结之光。那么在自动化中,我设定了每天晚上八点半和打开工作专注模式的时候,将表盘设置到团结之光。诚然,我可以直接起两个自动化,每个自动化里边都直接使用更换Apple Watch表盘的功能来实现这个操作,但这里我选择了在两个自动化中调用更换表盘的快捷指令来实现。因为如果出现了新表盘,我想在这两个节点更换到新表盘时,我可以通过修改快捷指令里边的表盘来直接调整两个自动化所做的动作,而不再需要前往每个自动化分别设定了。

通过快捷指令来实现一个“函数”,在多个自动化中直接调用,来简化之后维护的复杂性,这也许就是为什么快捷指令与自动化放在同一个软件中,自动化还排在快捷指令后面的原因之一吧。