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
但总之还是把各种东西都备份一下。
起因:五毛一吉的固态出问题啦:
ATA Error Count: 32 (Note: The number of entries may be limited to the newest ones)
其中 31 个是今天出的错,都是 Uncorrectable error。 虽然现在系统还是可以正常食用, 只是 时不时会掉盘,出错:
find: ‘/home/...’: Input/output error
但总之还是把各种东西都备份一下。
准确来说,这篇文章简要介绍一下使用 Gradle 以及 GitHub Actions 来把 相对简单的 [1] Java 项目打包发布到 Maven Central 上的流程。
请跟随 这里的教程 认证自己 Java package 所用到的域名。基本上:
在 Sonatype 的 JIRA 系统上注册一个账号。
在 OSSRH [2] 中创建一个 Issue (登录后,用教程里的 这个链接 )。
之后跟随 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 都会给出来。
教程上说需要 less than 2 business days ,我的经历是:
Created: 02/09/22 04:31 PM
Resolved: 02/09/22 04:47 PM
(大概都是 Bot 自动化了。)
总之等待一封把 Issue 标为 Resolved 的邮件,随后就可以进行下一步了。
样例放在这里 Reactor Locks ,是个很小的库,比较适合用作演示。使用的 Gradle 版本为 6.8 。 未说明的话,下面的文件都放在项目根目录下。
在 build.gradle 开头的 plugins 里添加 maven-publish
和 signing
:
没有 sourceCompatibility
或 targetCompatibility
的请添加上。
Maven Central 强制要求项目提供 Javadoc。
我们将 Gradle 配置分成几个文件,在 build.gradle
最后添加:
接下来编辑 javadoc.gradle
,我直接抄了 Reactor Core 的写法,这里就不复制粘贴上来了( 抄的内容如链接所示 )。 改完了用 ./gradlew javadoc
或者 ./gradlew javadoc
测试一下。有报错先改过来。
同样, build.gradle
最后添加 publish.gradle
,然后可以参考 这里的写法 把项目相关信息全部填上。
不介绍太多,可参考 Working with PGP Signatures 。
你需要:
安装 GPG。
使用 gpg --gen-key
命令生成一个密钥对。
找到生成的密钥对的 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 。
将公钥上传到 key server:
在使用 GitHub Actions 时我们需要导出私钥,这里先不介绍。
可参考 这里的 build.yml ,需要更改的地方是 JDK 的版本( java-version:
一行)。
注意我们这里用到了 environment: 'Maven Publishing'
,环境名需要严格对应之后创建的 Environment。
另外,此实例配置将 Actions 限制到了 release
分支上,并且只能手动到 Actions 里 Run workflow。
到 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
。
后三个的话,还记得 GPG 的 keyid 吗? SIGNING_KEY_ID
是 keyid 的 后八位 , 例如 CA925CD6C9E8D064FF05B4728190C4130ABA0F98
是 0ABA0F98
。
SIGNING_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,总之记一下。
℃ Degree Calcius(但可能 °C 更多字体适用。)
ɸφΦϕ Phi(前面两个大概是小写?我一般看第二个顺眼一点。)
μ Mu
CP2K Notes.
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
sectionFor example:
ENERGY_FORCE
for static energy and force evaluation.
略。
去官网上寻找最新版本下载链接 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
注释在 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 版本为 1.9.10.1)
我使用的是 IntelliJ ,针对 Android 平台有一个选项可能需要更改:
-> 左上角 File -> Langauges & Frameworks -> Android (experimental) -> Gradle -> Only sync the active variant
把 Only sync the active variant 这个选项取消勾选。
我用的是 ArchLinux-CN 源的 SDK,安装在 /opt/android-sdk
目录下,可以这样解决 dx
程序缺失的问题:
Java 8 太好用了,而且很多库也放弃了对更老的 JDK 的兼容,但是 Android 应用还是要兼容一下老设备。可以在 android/build.gradle
里加上兼容选项:
compileOptions { sourceCompatibility JavaVersion.VERSION_1_8 targetCompatibility JavaVersion.VERSION_1_8 }
(和 defaultConfig
这类的并列。)
https://github.com/intrigus/gdx-freetype-gwt
使用上面的库来兼容 HTML。现在的 LibGDX 版本已经是 1.10.0 了,上面这个库还没有相应的版本。我暂时用的是 1.9.10.1 版本,有问题再来记录。
LibGDX 似乎只兼容 JDK 8 (JDK 16 不行,JDK 11 没法编译)。安装 OpenJDK-8 再到 File -> Project Structure -> Project -> Project SDK 里把 JDK 版本改过来。
了解了一下 Inkle 出品的 ink ,但是初步试起来有一点问题,主要是文本本身的结构太多变,然后就没法本地化。(这也许也能解释为什么 Inkle 的游戏大多都没有本地化……)
本来有点想法是自己再设计一种简单的语法的,但明显自己水平不够嘛。这里尝试汇总一下一些常用的语法,把一些没必要的语法过滤掉,顺便看看能不能弄出一套 gettext 比较好处理的规范来。
(参考的是 这里 ,不知道哪里还有更详细的语法标准……)
(说实话有一点点在写汇编的感觉。非常不满的就是它虽然是“脚本”语言但是基本的程序语言的功能都好像要用汇编的方式来手动实现。看它用户手册你会发现一大半内容都是放在 “advanced” 的范畴里的,其中就包括一些非常基础的东西(比如一种会返回到调用位置的函数,真是太高级了;看我们函数还可以递归呢)。)
结合 Vercel 给 nikola 加上了 ActivityPub 的一点点功能?顺便可以介绍一下 ActivityPub 的一些原理。
您大概需要能够修改您的静态网页生成器,如写个插件什么的。如果您在学与您静态网页生成器相同的编程语言,那么不妨可以尝试一下。
另外一个前提是您放置静态博客的地方需要可以定制 HTTP 头。因为我不了解其它的提供商,我这里暂且先推荐一个 Vercel。
(略)
总而言之,它的一部分规定了服务器与服务器之间通信的方法。这些方法有一部分并不需要一个功能完全的服务器才能实现,所以这也给了我们将自己静态博客与此联通的机会。
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/" }
所以我们要想分享我们的文章,首先要做的对是给每一篇文章都弄上这么一个“名片”。