Scarlet 发布的文章

在设计界中,经常能够接触到两种字体类型:衬线 (serif) 和无衬线 (sans-serif) 字体。(sans 在英语中是 lack of, without 的意思) 那么,这两种字体有何区别,又在设计中如何发挥各自的作用呢?

serif and sans-serif

什么是衬线 (serif) 和衬线字体

衬线是 附着在字母上的装饰性棱角。古时候,印刷抄写母版时,会先使用毛笔进行抄写,这时就有可能出现不一致的笔画粗细和笔锋。这样的风格逐渐演变为以更有规律和艺术性的方式刻意增加笔锋和装饰,就形成了衬线。

衬线字体看起来很权威、专业,并且有一种历史纵横的美感。像 Times New Roman 这样的衬线字体可以让人联想到打字机的复古风格。

另外,衬线字体作为正文也有相应的功能。衬线字体通常用于长文字,比如书籍、报纸、杂志等印刷品。衬线字体在长文字中能够创造一种流动性的美,使文字更清晰可读,看起来不易感到疲劳,所以它也是最常用的 印刷 字体样式。

什么是无衬线字体

早在1805年,当时的印刷品就出现了无衬线字体。它们在广告中的清晰度和可读性很好,同时无论在多大或多小的字体下都可以保持一定的可读性。

但是,无衬线字体刚问世时引发了很大的争议,还曾被称为 "grotesque typefaces" 怪诞字体。在以 Bauhaus movement (包豪斯运动) 为代表的“简约美”设计思潮下,无衬线字体开始与科技、现代这些形容词联系起来。这样的联系现在依旧存在:大多数硅谷科技公司都会使用无衬线字体进行设计,以突出科技感。

无衬线字体在生活中也扮演着不可或缺的角色。一般来说,交通路牌、app 中的文本、地图上的地名往往是无衬线字体,因为它们在小空间下的显示效果更好。比如说,交通路牌通常使用无衬线字体,因为司机需要在很远的地方清晰看到指示牌上的文字,而无衬线字体的可读性很好,可以满足要求。

另外,无衬线字体也是电脑显示器显示用文本的最普遍的字体,一定程度上是因为屏幕的分辨率不足显示小字体下的衬线细节。比如说,作为衬线字体的宋体,在小字号情况下可读性会变得非常差,也很考验电脑系统字体渲染的能力。

引用:
[1] https://www.adobe.com/creativecloud/design/discover/serif-vs-sans-serif.html
[2] https://about.easil.com/serif-vs-sans-serif/

在使用 Bukkit.dispatchCommand(CommandSender sender, String commandLine) 时,可能会遇到需要获取命令返回值的需求。

可是,如果要想获取命令的“返回值”,首先需要明白的一点是,这个返回值实际上只是另一个插件接收到指令输入后,自发向 CommandSender 发送消息的行为。

所以,关键点在于如何捕捉插件向 CommandSender 发消息这一行为。

现在好多教程多推荐使用操作数据包的形式来获取玩家收到的消息,但是这样写有些复杂。

我们注意到在 dispatch command 时需要指定一个 CommandSender 命令发送者,而所有插件在发送消息时,都是发送到这个 CommandSender 里面的。

实际上,可以自己实现一个 CommandSender,我们可以理解成设计一个“打入敌方”的穿山甲。我们要想实现“窃听”,就需要在它耳朵上安装上“窃听器”,即复写它的耳朵: sendMessage() 方法,再把其它插件发送给我们穿山甲的消息,发送给我们自己。

ICommandSender

import org.bukkit.Server;
import org.bukkit.command.CommandSender;
import org.bukkit.permissions.Permission;
import org.bukkit.permissions.PermissionAttachment;
import org.bukkit.permissions.PermissionAttachmentInfo;
import org.bukkit.plugin.Plugin;

import java.util.Set;

public class ICommandSender implements CommandSender {
    private String sender_id;
    ICommandSender(String sender_id) {
        // 给我们的穿山甲一个“代号”
        this.sender_id = sender_id;
    }
    @Override
    public void sendMessage(String s) {
        // 将其他插件发送给这个 ICommandSender 的消息转发给我们自己
        ICommandReceiver.receiveMessage(this.sender_id, s);
    }

    @Override
    public void sendMessage(String[] strings) {
        // 将其他插件发送给这个 ICommandSender 的消息转发给我们自己
        ICommandReceiver.receiveMessage(this.sender_id, strings);
    }

    @Override
    .....
}

我们的 ICommandReceiver.receiveMessage(String id, String msg) 就可以窃听到别的插件发送的消息,也就是“命令的返回值”啦。

最终效果(也可以获得完整的颜色字符):

Snipaste_2022-07-27_22-43-54.png

有一些想要达到的目标和完成的愿望,就在这里一项一项来完成吧。


短期目标…

在几天或者四周之内完成的目标:

  1. [ ] 学会学习编程语言的时候,自己写一些笔记避免忘记
  2. [ ] 学会怎么用 Java 的包管理工具,像 maven 和 gradle
  3. [ ] 很想试试制作一个 Forge mod
  4. [x] 让自己的声音变得更好听!练声

中期目标…

在几个月内可能完成的目标:

  1. [ ] 学习Photoshop和Premiere
  2. [ ] 厨艺UPUP!希望懂得如何做菜
  3. [ ] 学习基本的心理学
  4. [x] 在多邻国学习法语

长期目标…

可能需要很久才能完成的目标:

  1. [ ] 学习基本乐理,或者最好能有几件趁手的乐器

自己写下的愿望要好好地完成哦!


Update 12/6/22:
添加了一个完成的标识,来鞭策自己(因为自己一个也没有完成!!!)

在「控制台」-「个人设置」里

8EB404DF-194F-4803-9B5E-D4226AA25942.jpeg

在默认权限控制选项里,取消勾选「允许被评论」。
然后接下来发送的所有文章都默认不会开启评论了。

在评论提交选项中,把「评论时间间隔」、「必须经过审核」等选项勾选掉,就可以解决过往文章没有关闭评论的问题了。

B17CA5A2-0CAF-4D1D-9745-CD965C380345.jpeg

迫于节约成本,咱把博客迁移到了雨云。

选择雨云的主要理由是价格很美丽(uwu):

虚拟主机价格表

我选择的是LA的EP面板虚拟主机(其实EP面板还真的挺难用的,尽量绕路吧...),实际上每月费用可以控制在10块以内,而且咱还是雨云的老用户攒了一些积分,续费起来就更便宜了。

雨云在最近更换了新的销售系统,界面很清新,上手用起来非常不错。俺也是写前端出身的,对写出一套舒服的交互的难度深有感触喵。

新的销售系统

很美丽的价格和稳定性不能兼顾,雨云的香港(这个炸得最频繁)和我正在使用的LA(大概是最稳定性价比最高的节点了),都经常会出现访问很慢或者无法访问的情况,另外EP面板真的很难用,很多配置项都不支持。所以我自己使用下来是不推荐EP面板的虚拟主机的。

但是奈何价格太低了 禁受不住诱惑捏,而且使用下来如果不是特别在意体验的话,单就LA节点来说,没有什么太大的问题,至少对得起这份价格,甚至有些超值(

目前雨云还新出了游戏云,价格还算挺具有竞争力的(虽然咱很讨厌那个绑定在月付项目上的必选pay-as-you-go计费项, CPU积分)。而且就MC多人游戏来说,很多号称支持MC开服的厂商,稳定性和技术水平都堪忧;使用国内大厂的云服务价格又太高而且不适合游戏,雨云算是非常不错的选择了(虽然没钱买喵?)

就是这样啦,作为雨云多年的云老用户,还是希望雨云朝着更加稳定和可靠的路去走的。加油啦雨云。

本文翻译/改编自 Please Don't Just Say Hello In Chat,根据国内的聊天习惯做了一些删改。

如果你只跟别人发一句 "在吗",不要指望会有答案。

相反,如果你能够直接把你的问题或者信息发出来,其它人就可以在他们有时间的时候,迅速对你的问题做出有价值的回应。

2010-07-19 12:32:12 你: 在吗
2010-07-19 12:32:16 好友: 在
[你的好友正在等待你发问题... 2分钟后]
2010-07-19 12:34:01 你: 我在开启后端服务的时候遇到了 xxx 报错,这种情况下要怎么做呢?
2010-07-19 12:35:21 好友: 哦哦,这样啊,你应该...

这就像某个人给你打电话,说 “喂”,然后晾着你2分钟,再开始说话!这种情况下换做是你,你会急吗?

当别人看到你发一句 “在吗”,然后半天或者根本不进一步描述你遇到的问题的时候,他也会是这个想法。

那这样呢:

2010-07-19 12:32:12 你: 你好,**我在开后端服务的时候遇到了 xxx 报错**,这种情况下要怎么做呢?
[ 1分钟后 ]
2010-07-19 12:33:07 好友: [问题的答案]

看到了吗?整整节约了三分钟!

与先说 在吗? 相反,如果你直接把你的问题描述出来,你的好友在他看到消息之后就可以马上开始考虑你的问题,这可以加快获得答案的进度。

你说 在吗?,可能是不知道别人是否能够立刻回答你。但在聊天软件上,你不能指望有人就是碰巧在线,并且在不知道你要干嘛的情况下乐意听你说下去。

这种情况下,与其说是询问,说 “在吗” 更像是在无意义地晾着别人,让别人等着你来表达你的问题,这样就导致了底下的效率。

同样,“你好,在吗?” - “hello,问大家一个问题” - “有时间吗?” 也都不要说。只要问问题就可以了!

此外,如果你觉得直接问太粗鲁无礼,那你可以把问候语放到问题的前面:

2010-07-19 12:32:12 你:你好大佬!有空的话能不能帮我看看一个问题呢?我正在做 [某事] 但是遇到了 [...问题]

换句话说,在别人给你回应之前先表达你的问题,能够使整个交流过程“异步化”。如果对方不在,而你要在他们回来之前离开,那么对方仍然可以在回来之后立刻回答你的问题,而不是盯着一句 “在吗” 然后对你要干啥一无所知。

首先是你要在插件的 src/ 文件夹里面添加一个配置文件, 比如 qaq.yml,里面填写上默认配置的内容。

然后呢,在第一次启动的时候,让 bukkit 把你 jar 包里的这个配置文件保存到 plugins/ 里面

// 这里面的 false 意思是, 如果这个文件已经存在的话就不要替换它
saveResource("<文件名>", false);

下一步,你得把文件的内容读出来:

// 读文件
File file = new File(this.getDataFolder(), "<文件名>");

最后一步是转为 YamlConfiguration

// 这个 yamlConfiguration 就是YAML配置对象了
YamlConfiguration yamlConfiguration = YamlConfiguration.loadConfiguration(file);
P.S. 原标题 Creating multiple config files & using them