今日(きょう)(さわ)がしく(たわむ)れ生きる人々の漫画映画(まんがえいが)

Linux Backup Notes

起因:五毛一吉的固态出问题啦:

ATA Error Count: 32 (Note: The number of entries may be limited to the newest ones)

其中 31 个是今天出的错,都是 Uncorrectable error。 虽然现在系统还是可以正常食用, 只是 时不时会掉盘,出错:

find: ‘/home/...’: Input/output error

但总之还是把各种东西都备份一下。

阅读更多…

Maven Central Publishing

准确来说,这篇文章简要介绍一下使用 Gradle 以及 GitHub Actions 来把 相对简单的 [1] Java 项目打包发布到 Maven Central 上的流程。

域名认证

请跟随 这里的教程 认证自己 Java package 所用到的域名。基本上:

  1. 在 Sonatype 的 JIRA 系统上注册一个账号。

  2. OSSRH [2] 中创建一个 Issue (登录后,用教程里的 这个链接 )。

    1. 之后跟随 Bot 即可。如果你拥有此域名,那么你需要设置一个 TXT 记录; 如果你用的是 io.github.* 之类的,那你需要新建一个 Repo。

      Add a DNS TXT record to your domain with the text: OSSRH-<你的 Issue 编号>.

      Please read https://central.sonatype.org/faq/how-to-set-txt-record/ Edit this ticket and set Status to Open.

      里面的 OSSRH-<你的 Issue 编号> 例如是 OSSRH-78049 ,Bot 都会给出来。

  3. 教程上说需要 less than 2 business days ,我的经历是:

    Created: 02/09/22 04:31 PM

    Resolved: 02/09/22 04:47 PM

    (大概都是 Bot 自动化了。)

    总之等待一封把 Issue 标为 Resolved 的邮件,随后就可以进行下一步了。

Gradle Setup

样例放在这里 Reactor Locks ,是个很小的库,比较适合用作演示。使用的 Gradle 版本为 6.8 。 未说明的话,下面的文件都放在项目根目录下。

添加 Gradle 插件

build.gradle 开头的 plugins 里添加 maven-publishsigning

plugins {
    // ...

    id 'maven-publish'
    id 'signing'

    // ...
}

没有 sourceCompatibilitytargetCompatibility 的请添加上。

Javadoc 配置

Maven Central 强制要求项目提供 Javadoc。

我们将 Gradle 配置分成几个文件,在 build.gradle 最后添加:

apply from: 'javadoc.gradle'

接下来编辑 javadoc.gradle ,我直接抄了 Reactor Core 的写法,这里就不复制粘贴上来了( 抄的内容如链接所示 )。 改完了用 ./gradlew javadoc 或者 ./gradlew javadoc 测试一下。有报错先改过来。

Publishing 配置

配置文件

同样, build.gradle 最后添加 publish.gradle ,然后可以参考 这里的写法 把项目相关信息全部填上。

GPG 密钥

不介绍太多,可参考 Working with PGP Signatures 。

你需要:

  1. 安装 GPG

  2. 使用 gpg --gen-key 命令生成一个密钥对。

  3. 找到生成的密钥对的 keyid 。可用 gpg --list-keys <密钥对应的邮箱> 命令查看,例如:

    $ gpg --list-keys 'central@example.com'
    pub   rsa3072 2021-06-23 [SC] [expires: 2023-06-23]
    CA925CD6C9E8D064FF05B4728190C4130ABA0F98
    uid           [ultimate] Central Repo Test <central@example.com>
    sub   rsa3072 2021-06-23 [E] [expires: 2023-06-23]
    

    里面的例如 CA925CD6C9E8D064FF05B4728190C4130ABA0F98 这一串就是 keyid

  4. 将公钥上传到 key server:

    $ gpg --keyserver keyserver.ubuntu.com --send-keys CA925CD6C9E8D064FF05B4728190C4130ABA0F98
    
  5. 在使用 GitHub Actions 时我们需要导出私钥,这里先不介绍。

GitHub Actions 配置

可参考 这里的 build.yml ,需要更改的地方是 JDK 的版本( java-version: 一行)。

注意我们这里用到了 environment: 'Maven Publishing' ,环境名需要严格对应之后创建的 Environment。 另外,此实例配置将 Actions 限制到了 release 分支上,并且只能手动到 Actions 里 Run workflow。

创建 Environment

到 GitHub 项目的 Settings -> Environments -> New environment 输入上面的环境名。

创建后,在 Deployment branches 里让环境可以并仅可应用于 release 分支。

随后我们要向环境里添加 MAVEN_USERNAME MAVEN_PASSWORD SIGNING_KEY_ID SIGNING_PASSPHRASE SIGNING_SECRET_KEY 这五个环境变量。

前两个的话,请在 https://s01.oss.sonatype.org (或是其它网址,如果仓库又迁移了的话)登录。 右上角用户名点开,从 Profile 里进到 User Token 界面。点击 Access User Token 创建新的 Token, 把用户名(短的一串?)作为 MAVEN_USERNAME 添加到环境中,长的一串 MAVEN_PASSWORD

后三个的话,还记得 GPGkeyid 吗? SIGNING_KEY_IDkeyid后八位 , 例如 CA925CD6C9E8D064FF05B4728190C4130ABA0F980ABA0F98SIGNING_PASSPHRASE 如果在生成密钥时指定了 pass phrase 的话请填进去。

SIGNING_SECRET_KEY 需要导出。使用命令:

$ gpg --export-secret-keys --armor CA925CD6C9E8D064FF05B4728190C4130ABA0F98
-----BEGIN PGP PRIVATE KEY BLOCK-----

1234567890Abc...
...
-----END PGP PRIVATE KEY BLOCK-----

请把 CA925CD6C9E8D064FF05B4728190C4130ABA0F98 换为对应的 keyid ,将输出的从 -----BEGIN PGP PRIVATE KEY BLOCK----------END PGP PRIVATE KEY BLOCK----- (包括) 复制,作为 SIGNING_SECRET_KEY

测试

把项目 build.gradle 里的 version 设为 SNAPSHOT(即 0.1.0-SNAPSHOT 诸如此类,只需以 -SNAPSHOT 结尾均可)。 Push 到 release 分支上,到 GitHub 项目上的 Actions 页面。 All workflows -> Build and Publish 然后 Run workflow 选择 Branch: release ,点 Run workflow

正式发布

同上。 Push 到 release 分支上,到 GitHub 项目上的 Actions 页面。 All workflows -> Build and Publish 然后 Run workflow 选择 Branch: release ,点 Run workflow

但是,在 Workflow 跑完之后,我们还需要到 https://s01.oss.sonatype.org (或是其它网址,如果仓库又迁移了的话) 里面去 Close 然后 Release。

Unicode Favourites

一些有时会用到的 Unicode,总之记一下。

  • ℃ Degree Calcius(但可能 °C 更多字体适用。)

  • ɸφΦϕ Phi(前面两个大概是小写?我一般看第二个顺眼一点。)

  • μ Mu

CP2K

CP2K Notes.

Basics

Input file format

Sections: .. code:

&BEGIN section_name [params]
  ... (keywords or more sections)
&END

Keywords: .. code:

keyword_name value
keyword_name [ON|OFF] [YES|NO] [TRUE|FALSE]
keyword_name

Pre-processing: .. code:

@INCLUDE 'filename'
@SET var_name value
$VAR_NAME
${VAR_NAME}
${VAR_NAME-default_value}
@IF / @ENDIF
@IF ( $varname == TRUE )
  ...
@ENDIF

GLOBAL section

For example:

&GLOBAL
  PROJECT     Si_Bulk8
  RUN_TYPE    ENERGY_FORCE
  PRINT_LEVEL LOW
&END GLOBAL

ENERGY_FORCE for static energy and force evaluation.

Make an IRC bot with irccd

略。

安装

去官网上寻找最新版本下载链接 http://projects.malikania.fr/irccd/downloads.html 。在解压后的目录里 INSTALL.md 有着安装方法,但是我主要想以普通用户权限来安装,所以改了一改目录设置,总体如下:

$ wget http://releases.malikania.fr/irccd/3.1.1/irccd-3.1.1.tar.xz
$ tar -Jxf irccd-3.1.1.tar.xz
$ rm irccd-3.1.1.tar.xz
$ cd irccd-3.1.1
$ sed --in-place -e 's#/usr/lib/systemd/system#$ENV{HOME}/.config/systemd/user#' systemd/CMakeLists.txt
$ mkdir build
$ cd build
$ cmake .. -DCMAKE_BUILD_TYPE=Release -DCMAKE_INSTALL_PREFIX:PATH=/home/$USER/.local/
$ make -j4
$ make install

IRC Time

/join #studygroup
/msg ChanServ register #studygroup
/msg ChanServ access #studygroup add studybot OP

Octave

注释在 comment 里了。

% one-lined comment
clc % clear screen
clear all % empties the variables
var1 = 10 % variable definition & assignment

x = 0:pi/10:pi
f = sin(x)
subplot(2, 2, 1); % semi-colon!
plot(x, f);
title("Sin?")

% dot product
z = x .* f

figure;
plot3(x, f, z);
xlabel("X"); ylabel("Y"); zlabel("Z");

p = -pi:pi/40:pi;
t = 0:pi/40:pi;
[P, T] = meshgrid(p, t);
theta = pi/2 - P;
phi = T;
figure;
R = sqrt(5/16/pi) * abs(3 * cos(theta) .* cos(theta) - 1);
[X, Y, Z] = sph2cart(theta, phi, R);
color = [0.5 0.5 0.5];
colormap(color);
plot3(X, Y, Z);

meshc

isosurface

什?

LibGDX?

安装

一些兼容配置

(写作时的 LibGDX 版本为 1.9.10.1)

Android

IntelliJ

我使用的是 IntelliJ ,针对 Android 平台有一个选项可能需要更改:

-> 左上角 File -> Langauges & Frameworks -> Android (experimental) -> Gradle -> Only sync the active variant

Only sync the active variant 这个选项取消勾选。

Android SDK 31

https://stackoverflow.com/questions/68387270/android-studio-error-installed-build-tools-revision-31-0-0-is-corrupted

我用的是 ArchLinux-CN 源的 SDK,安装在 /opt/android-sdk 目录下,可以这样解决 dx 程序缺失的问题:

$ sudo ln -s /opt/android-sdk/build-tools/31/d8 /opt/android-sdk/build-tools/31/dx
$ sudo ln -s /opt/android-sdk/build-tools/31/lib/d8.jar /opt/android-sdk/build-tools/31/lib/dx.jar
兼容 Java 8

Java 8 太好用了,而且很多库也放弃了对更老的 JDK 的兼容,但是 Android 应用还是要兼容一下老设备。可以在 android/build.gradle 里加上兼容选项:

compileOptions {
    sourceCompatibility JavaVersion.VERSION_1_8
    targetCompatibility JavaVersion.VERSION_1_8
}

(和 defaultConfig 这类的并列。)

HTML

FreeType

https://github.com/intrigus/gdx-freetype-gwt

使用上面的库来兼容 HTML。现在的 LibGDX 版本已经是 1.10.0 了,上面这个库还没有相应的版本。我暂时用的是 1.9.10.1 版本,有问题再来记录。

JDK 8

https://stackoverflow.com/questions/55847497/how-do-i-troubleshoot-inconsistency-detected-dl-lookup-c-111-java-result-12

LibGDX 似乎只兼容 JDK 8 (JDK 16 不行,JDK 11 没法编译)。安装 OpenJDK-8 再到 File -> Project Structure -> Project -> Project SDK 里把 JDK 版本改过来。

Pleroma 使用 Postfix 提供邮件服务

Pleroma 的邮件的配置有很多方案。 [1] 其中最通用的是 SMTP 以及 Sendmail 。就我们用到的功能而言,其实这两个没有什么区别:

SMTP

Sendmail

Pleroma
↓ (SMTP)
邮件提供商
↓
收件者
Pleroma
↓
Postfix/Sendmail
↓ (SMTP)
邮件提供商
↓
收件者

但总之,毕竟 postfix 在其它服务(如 mastodon, php 相关的 flarum 或者 wordpress)里都可以用,所以还是介绍一下 postfix 的配置。

阅读更多…

尝试 Ink - 用来写剧情脚本的语言

了解了一下 Inkle 出品的 ink ,但是初步试起来有一点问题,主要是文本本身的结构太多变,然后就没法本地化。(这也许也能解释为什么 Inkle 的游戏大多都没有本地化……)

本来有点想法是自己再设计一种简单的语法的,但明显自己水平不够嘛。这里尝试汇总一下一些常用的语法,把一些没必要的语法过滤掉,顺便看看能不能弄出一套 gettext 比较好处理的规范来。

(参考的是 这里 ,不知道哪里还有更详细的语法标准……)

(说实话有一点点在写汇编的感觉。非常不满的就是它虽然是“脚本”语言但是基本的程序语言的功能都好像要用汇编的方式来手动实现。看它用户手册你会发现一大半内容都是放在 “advanced” 的范畴里的,其中就包括一些非常基础的东西(比如一种会返回到调用位置的函数,真是太高级了;看我们函数还可以递归呢)。)

阅读更多…

activitypubed-nikola

结合 Vercel 给 nikola 加上了 ActivityPub 的一点点功能?顺便可以介绍一下 ActivityPub 的一些原理。

Nikola 的插件先放在这里了。

前提条件

您大概需要能够修改您的静态网页生成器,如写个插件什么的。如果您在学与您静态网页生成器相同的编程语言,那么不妨可以尝试一下。

另外一个前提是您放置静态博客的地方需要可以定制 HTTP 头。因为我不了解其它的提供商,我这里暂且先推荐一个 Vercel。

ActivityPub 是什么?

(略)

总而言之,它的一部分规定了服务器与服务器之间通信的方法。这些方法有一部分并不需要一个功能完全的服务器才能实现,所以这也给了我们将自己静态博客与此联通的机会。

ActivityPub 里的一篇发文

ActivityPub 里的每一篇文章都是类似这样的内容:

{
  "@context": "https://www.w3.org/ns/activitystreams",
  "attributedTo": "https://my.personal.website/me",
  "summary": "我的心情",
  "content": "我真高兴!",
  "id": "https://my.personal.website/posts/mood.jsonld",
  "published": "2020-01-09T16:00:00Z",
  "to": ["https://www.w3.org/ns/activitystreams#Public"],
  "cc": ["https://www.w3.org/ns/activitystreams#Public"],
  "type": "Note",
  "url": "https://my.personal.website/posts/mood/"
}

所以我们要想分享我们的文章,首先要做的对是给每一篇文章都弄上这么一个“名片”。