Moposx的部落阁

A blog site powered by WordPress

Moposx的部落阁

CSS font-family generic names 迷惑行爲

情況描述
Font Finder 信息說明

我們可以看到,原本整段文字都應該以襯線字體呈現,然而實際情況是僅有英文數字是按 serif 呈現,漢字依然是以無襯線體(自動回退到了微軟雅黑)呈現。(火狐瀏覽器限定)

這時候我就想到,能否用改動 CSS 的方式來解決這個問題呢?

很可惜,不行。即使我全部將其指定爲 font-family: serif;,一切依然如改動前一模一樣。那麼,是不是瀏覽器對於 CSS 的解析有甚末毛病?看起來也不是。新開一頁 web 頁面並測試,一切正常。難道說真是前端代碼寫得有些問題末?

那末,Chromium 系瀏覽器是不是就不會出現這個問題?當然不是。經過一點測試,Chromium 系瀏覽器正好呈現相反的情況,即無法調整中文到非襯線體。你說希罕不希罕?

目前這一問題只是見於 Medium 的中文文章,以及另一個藉助 GitBook 的 GitHub 在線電子書頁面。

小站满血复活|未來的一點打算

简述

21 日晚间关掉了位于新加坡的阿里云 ECS,转向使用 Cloudcone。花了一些时间恢复数据库跟网站目录,现在小站 moposx.me 已经满血复活啦!

网站现在由 Nginx 托管,操作系统选用了 Arch Linux。此前一直没有用过 Arch Linux 作为服务器的操作系统,趁着 Cloudcone 自带 Arch Linux 镜像的机会体验一下,不知日后滚系统会不会把网站滚炸呢?

为啥要换 VPS

这其中的缘由倒也简单。一是在阿里云买的新手包即将到期,而 Cloudcone 正好发了邮件回来,一样的配置还要便宜半美刀。二是阿里云的官网我从 4 月份就开始无法登录,换浏览器、换网络竟然都不起作用,等到了六月中下旬可以登录了,但只维持了几天,此后继续无法登录,一直到昨天我才又得以登录控制台关闭实例。这样搞得我心里很烦,所以准备换一个 VPS 提供商。

關於未來的一點打算

未來打算多用傳統字來寫一些博文。(當然我也在嘗試手寫傳統漢字!)

前段時間搜尋“倉頡輸入法”相關的資料時,見着朱邦復先生的回覆給網友的一則留言:

「倉頡」主要之精神不在「追求輸入快速」,而係「保存漢字之根本」。根據漢字基因原理,未來系統中「碼、序、形、辨、音、義」渾為一體,雖機器亦能運用自如。中華文化之真正價值,全繫於此,若取巧一時,則失道於千秋

http://www.cbflabs.com/gstbook/allmsg.php?keyword=3364

我個人的觀點是,簡化漢字有效提升了國民識字水平書寫效率,但在數字化的今天,我們不妨將傳統漢字拾起來加以學習和欣賞。平時多見網絡上流傳着“中國人自帶簡繁轉換能力”的說法,我不敢苟同。傳統漢字同樣是一門學問,若不付出心力,便很容易鬧出笑話。部分傳統漢字的確要比簡化漢字更加合理,我們應該逐步認識到簡化漢字的不足。

C++ 中的指针常量、常量指针与指向常量的指针常量

在学习 C++ 的指针部分时,被 const 用于指针的情形给难住了。指针作为一种特殊类型的变量,它既存储着内存地址,又可以用来修改内存中的数据。

指针的定义:存储内存地址的一种变量。

声明指针:

PointedType* pointer_var_name = NULL; // safely initialized

const关键字的含义:所修饰的对象或者变量不能被修改

const和指针搭配可以有三种情形:

  1. 指针常量
    例: int* const p_var = &var;
    const关键字修饰变量p_var,此变量就不能被更改了。这时指针对变量的地址引用不可变,但是可以改变变量的值。
  2. 常量指针
    例: const int* p_var = &var;
    这时,int* 直接修饰了变量 p_var,并非不可变,因此指针对变量的地址引用是可变的,但是引用变量的值不可变。(即指向常量的指针。)
  3. 指向常量的指针常量
    例:const int* const p_var = &var;
    这种最好理解,内存引用地址和引用变量的值都不能变。

其实主要是判断const关键字的位置,它在变量名旁边说明引用地址不能变,如果是在类型前面说明引用变量的值不能变。

设置终端代理之后 yay 无法查找 AUR 软件包的解决方案

如题,在.zshrc中设置如下代理:

export http_proxy="socks://127.0.0.1:10808"
export https_proxy="socks://127.0.0.1:10808"

然后执行一下 yay 搜索:

$ yay zip
...
3 core/minizip 1:1.2.11-4 (26.2 KiB 85.6 KiB) (Installed)
Mini zip and unzip based on zlib
2 core/gzip 1.10-3 (77.8 KiB 156.9 KiB) base-devel
GNU compression utility
1 core/bzip2 1.0.8-3 (53.4 KiB 144.0 KiB) (Installed)
A high-quality data compression program
Error during AUR search: Get "https://aur.archlinux.org/rpc.php?arg=zip&by=name-desc&type=search&v=5": proxyconnect tcp: dial tcp: lookup socks: no such host
Showing repo packages only
==> Packages to install (eg: 1 2 3, 1-3 or ^4)
==>

可以看到没办法查询到 AUR 里面的软件包信息。Google 了一下发现有关的issue,找到了解决方案:

The proxy string may be prefixed with [scheme]:// to specify which kind of proxy is used. Use socks4://, socks4a://, socks5:// or socks5h:// (the last one to enable socks5 and asking the proxy to do the resolving, also known as CURLPROXY_SOCKS5_HOSTNAME type) to request the specific SOCKS version to be used. Otherwise SOCKS4 is used as default.

我使用的是 QV2Ray,支持设置 SOCKS5 和 HTTP 代理,按照这段话来看应该制定 proxy scheme 为 socks5,所以代理配置应该是:

export http_proxy="socks5://127.0.0.1:10808"
export https_proxy="socks5://127.0.0.1:10808"

之后刷新环境变量即可解决问题。

使用英雄联盟国服客户端 OB 外服对局

前言

此前一直以为只有外服客户端才能进行OB,但是想来想去都觉得这肯定不合理,难道国服客户端就不算客户端?诚然,国服客户端加入了很多腾讯自己的组件,直接去 op.gg 下载到的文件是无法直接启动国服客户端进行 OB 的,那个文件只支持韩服和欧美服务器。

问题分析

那么首先来看看这些个启动 OB 的脚本是个什么结构:

可以看到比较关键的就是 LoL 客户端的路径。脚本设置了一个缺省的 RADS 路径(原来的客户端会有一个这样的文件夹),即“C:\Riot Games\League of Legends”,如果该路径不存在就会使用用户在网站上设置的客户端路径。

那为什么国服的 LoL 客户端连启动都启动不起来呢?我们看一看文件夹结构便知道,国服客户端相比美服,文件夹被拆开了,Game 目录直接被移到了父目录里面。这里放一张美服的文件结构,大家可以用国服进行对比:

目录结构
目录结构
客户端文件
客户端文件

目录都不一样找不到文件也就不足为奇了。

接着看看脚本里是如何进行 OB 的:

原来如此。最终要启动的就是 “League of Legends.exe”,然后加上了 OB 相关的参数:

cmd> @start "" "League of Lengends.exe" "spectator SPECTATOR_URL SECRET SPECTATOR_ID SERVER_REGION" "-UseRads" "-Locale=LOCALE_NAME" "-GameBaseDir=.."
# 这是放在 cmd 中运行的代码格式。
#如果是 Powershell 里面,则是:
pwsh> '.\League of Legends.exe' 'spectator SPECTATOR_URL SECRET SPECTATOR_ID SERVER_REGION' '-UseRads' '-Locale=LOCALE_NAME' '-GameBaseDir=..'

而国服的 “League of Legends.exe” 则位于 “英雄联盟\Game\”里。这就意味着我们需要去这个目录下面执行这一行命令。然后我们看看别的参数:

# SPECTATOR_URL example:
spectator.na2.lol.riotgames.com:80

# SECRET
Gt/4p574BORnnPVZHHipaNJT0FMAgfej

# id
3384695424

# SERVER_REGION
NA1 #反复查看了脚本,这里的服务器区域跟上面的网址真不一定能够对上号

# LOCALNAME example:
zh_CN; en_US; en_GB; ja_JP

其中,locale是可以选的,国服其实就直接用"-Locale=zh_CN"就可以了。而 "-UseRads"看起来是个必需的参数。(Google一大堆 RADS error 的文章,这个错误一发生就启动不了游戏)。至于"-GameBaseDir=..",在美服中它指向的是LoL客户端的根目录,所以这里我们直接指定”..” 为实际的游戏根目录(也就是包含了“英雄联盟”, “英雄联盟卸载”, “访问官网”几个快捷方式的那个目录)即可。但实际上省略这个参数也可以正常启动 OB

实际测试和效果

用 powershell 启动:

当然也可以用 cmd ,复制粘贴那行代码就行:

可选设置 locale 为 zh_CN。

看看效果

注意事项

  • 推荐使用国服以免遇到难看的 tofu 字。 国服版本不支持韩文字符显示。
  • 由于国服的更新较其他服务器更慢,因此在国服的版本没赶上外服之前 OB 会失败。这其实是用外服客户端OB更合适的最主要的原因。

RIME 拉丁字母混合输入方案去掉上屏字符后的空格

项目作者是 polyhedron, GitHub 地址为:https://github.com/biopolyhedron/rime-latin-international

这个方案的好处是可以用现有的 QWERTY 布局键盘方便地输入拉丁、希腊字母,变音字母、重音符号、以及国际音标符号等等,甚是方便。唯一有点不舒服的地方在于,每次输入完毕上屏符号时后面总是会附带一个空格,每次都手动删除也怪麻烦的,那不如来设置一下,一劳永逸地解决问题。

在 RIME 输入法的用户文件夹内,新建 latin_international.custom.yaml,添加如下内容,并重新部署即可:

# Rime configuration
patch:
  "punctuator/use_space": false

目前我不知道这个操作会带来什么负面影响,因为看起来这个是有意设置的。如果确实会带来新的问题,我以后会更新对应的解决方案。

解决 Firefox Android 版无法正常识别替换字体的问题

提示:本问题以及解决方案同时适用于 Firefox Preview 和 Firefox 68 ESR for Android。

全面切换到 Firefox 平台后,Android 平台上的 Firefox Preview 自然成为了我的首选。现代的 UI 设计和不俗的性能,体验上与 Chrome不相上下,而且能够正常渲染 CJK 衬线字体,这可是 Chrome 做不到的。(本站的博文和标题也都是衬线体字)

  • Chrome 下在 Kotobank 查询一个单词

看完我只想说,我想起高兴的事情…

当然我不是说 Chrome 就一定做不到。Chrome 通过硬替换 Noto Serif 为 Noto Serif CJK / Source Han Serif CJK的字体就可以正常渲染。不过,这未免有些蛋疼吧。

当然不要以为用火狐就没有麻烦。(如果不折腾就不会有什么麻烦。)如果你用 Magisk 一类的工具替换了一些字体,却没有在火狐中进行设定的话,你一样会遇到一些蛋疼的问题。举个例子,我用 Magisk 将 Android 默认的 Droid Sans Mono 替换成了 Source Code Pro,结果始终不能渲染,总是会回退到 Roboto 或者是 Noto Sans CJK里面。我以为是 Firefox Preview 的问题,就换上了 Firefox 68 for Android,结果问题依旧。最终只好去 Firefox Preview 的 Repo 提了个issue,第二天得到了回复:

Gecko 寻找字体以来的是字体的元数据(包含有字体名称),也就是不同于 Chrome 和别的 Android 应用,Firefox 是通过字体名称判断字体的。因此,单纯地替换了字体还不算完,还必须得在 about:config 里面设定特定语言的等宽字体,从 “Droid Sans Mono” 改成 “Source Code Pro” 才能真正让字体生效。

在 about:config 中进行设置
在 about:config 中进行设置

同样的,如果你是个火狐用户,还替换了 Roboto/Noto Serif/NotoSerifCJK/DroidSansMono/NotoColorEmoji等字体的时候,请务必先了解到该字体的名称信息,并将其设置写进 about:config 才算最终完成。

ssh-add 遇到 “invalid format”的解决方案

出现这一问题的原因主要有两个,一是密钥文件本身有问题,二是 ssh 程序有问题。

首先检查一下密钥文件,注意观察文件末尾:

# I'm on Zsh.
$ cat ./id_rsa
-----BEGIN OPENSSH PRIVATE KEY-----
...
...
-----END OPENSSH PRIVATE KEY-----%

如果你也在用 Zsh,想必对这个多余的百分号有所了解。出现百分号意味着该文件缺少一个换行符号。那么问题就很简单了,打开文本编辑器,在”—–END OPENSSH PRIVATE KEY—–“后面加上一个空行,记得检查换行符类型(CRLF / LF)。问题就能轻松解决。

在 Windows 下也很可能遇到这个问题,这时请下载 PuTTYGen,用 PuTTYGen打开私钥文件,点击菜单栏的”Conversion”,然后点选 Export OpenSSH key (force new format),然后就可以正常导入了。稍后再补上图片说明。

重装系统后导入SSH和GPG密钥

以 macOS 为例。

导入 SSH 密钥

macOS 已经内置了 SSH 了,因此我们不必另行安装。准备好先前导出过的 SSH 密钥,在终端下执行命令:

$ ssh-add ./id_rsa

此时可能收到错误:

$ ssh-add id_rsa
Error loading key "id_rsa": invalid format

如果你遇到了这个错误,请参考:

导入 GPG 密钥对

# 建议把文件权限设置为 600
$ gpg --import ./pgp-pubkey-export.txt
gpg: directory '~/.gnupg' created
gpg: keybox '~/.gnupg/pubring.kbx' created
gpg: ~/.gnupg/trustdb.gpg: trustdb created
gpg: KEY INFO imported
gpg: Total number processed: 1
gpg:               imported: 1
$ gpg --allow-secret-key-import --import ./pgp-seckey-export.txt
# Then enter your passphrase
gpg: key INFO not changed
gpg: key INFO: secret key imported
gpg: Total number processed: 1
gpg:              unchanged: 1
gpg:       secret keys read: 1
gpg:   secret keys imported: 1
 

macOS Catalina 使用旧式字体渲染命令后的补救措施

其实标题写的不是很准确。简单来讲,macOS Catalina 中似乎完全移除了 subpixel 字体平滑模式,然而免不了有用户尝试 macOS Mojave 里面的指令,结果发现适得其反(举例,mac QQ,字体炸了又炸)。

一般来说,用户输入了如下代码:

$ defaults write -g CGFontRenderingFontSmoothingDisabled -bool NO
$ defaults -currentHost write -globalDomain AppleFontSmoothing -int 1 (0/1/2/3)

之后重新登录,就发现其实渲染效果并不是很好。这时为了还原效果,还需要重新打开设置里的“使用LCD平滑字体”,但是这还没完。如果做完这一步就重启,开机之后字体仍然是炸的,你会发现字体和像素对得惨不忍睹。正确操作是追加这条命令:

$ defaults delete -g CGFontRenderingFontSmoothingDisabled

再次重启即可。

Powered by WordPress & Theme by Anders Norén