duangsuse::Echo
718 subscribers
4.26K photos
130 videos
583 files
6.48K links
import this:
美而不丑、明而不暗、短而不凡、长而不乱,扁平不宽,读而后码,行之天下,勿托地上天国。
异常勿吞,难过勿过,叹一真理。效率是很重要,盲目最是低效。
简明是可靠的先验,不是可靠的祭品。
知其变,守其恒,为天下式;穷其变,知不穷,得地上势。知变守恒却穷变知新,我认真理,我不认真。

技术相干订阅~
另外有 throws 闲杂频道 @dsuset
转载频道 @dsusep
极小可能会有批评zf的消息 如有不适可退出
suse小站(面向运气编程): https://WOJS.org/#/
Download Telegram
安逸得很。
#Telegram #sysadmin 为了保证 plasma desktop 能够正常升级(额外 repository 的 Telegram package 用的 Qt 旧版本不兼容) 不得不牺牲了基于 rpm 的 Telegram 安装……
duangsuse::Echo
https://gist.github.com/Himself65/45b82f824f6185b29555a6da516b7337 #GitHub #zhihu 👍
const ZHIHU_URL = "https
function main() {
Http.GET(ZHIHU_URL).then(res => sendCheckStatusGist(res.time, res.statusCode == 200));
}
const ACCESS_TOKEN = process.environ["GITHUB_ACCESS"];
function sendCheckStatusGist(time, is_alive) {
GitHub.auth(ACCESS_TOKEN);
GitHub.Gist.send("Is Zhihu Died?", "知乎今天死了吗?", format(time, is_alive)).done();
}
function format(time, is_alive) {
let exim = is_alive? "还没死啊!" : "终于死了!";
return exim + time.format("yyyy-MM-dd hh:mm:ss");
}


其实最好是用 await/sync 协程写,更甜一些,好像 Haskell 的 do notation 啊。
Forwarded from duangsuse Throws
#life #linux #sysadmin GNOME Pomodoro 的 execute command "systemctl suspend" 加上 wake-on keyboard 看起来非常棒,我无法再强行无视休息计划继续玩电脑了 🤪
之前的顾虑完全不存在,没什么工作是 suspend 保存不了的,如果有,下机记下来,记忆力和洞察力会更好。
This media is not supported in your browser
VIEW IN TELEGRAM
休息完了,虽然我还是那么菜,接下来的时间里,我会完成 LiterateKt 剩下的任务,以及编写 AXML 文件读写器、Kotlin 的 relational 库。
然后可以继续我的 ParserKt 『博客』编写,以及最后对绝句程序设计语言翻译器的实现。
关于 Literate Kotlin project 结构的设计。

Literate Kotlin 之前基于 literateBegin..literateEnd 且允许单层嵌套的设计,已经在 TypeScript 语言里作为小脚本完成实现,单独的命令行工具也会采用这样的单 markdown 结构。

LiterateKotlin 目前为了实用,先是按向 Gradle project 生成设计的,我们认为,Gradle 的 dependencies 是这样:

project(1) : sourceSet(N)
sourceSet(1): scope(1)-dependency(1)

比如下面这样:

sourceSets {
commonMain {
dependencies { implementation kotlin('stdlib-common') } }
/**/


而 GitHub 以及一般的规范是用 README.md,所以,项目的 entry file 算是 README 文件。

## Literate Kotlin

`g:v:n`

+ [...](r1)
+ [...](r2)
+ ...

### Build Dependencies

```kotlin
package apples // (main, java)
package somepkg // (scope, sourceSet)
//...
```

+ `depkind something` (main, java)
+ ...

### Build Script 

> [settings.gradle](settings.gradle)

```xxx
//code here
```

每个单独的引用项目也应该有一个

## Literate Kotlin

+ [...](file_reference)
+ [...](file_reference)
+ ...

而单独的 markdown 文件开头(第一个 <h1> 后,任何非 <h1> heading 前)则应该有

```xxx
package ...
```

来指定这个文件归属的位置,可以像上文 README 里那样带 // (scope, sourceSet),如没默认按之前 README 的 map 起始部分来认。

然后命令行很简单

kotlinlit -Tgradle -t gradleVersion=4.1 -d build -s .
duangsuse::Echo
关于 Literate Kotlin project 结构的设计。 Literate Kotlin 之前基于 literateBegin..literateEnd 且允许单层嵌套的设计,已经在 TypeScript 语言里作为小脚本完成实现,单独的命令行工具也会采用这样的单 markdown 结构。 LiterateKotlin 目前为了实用,先是按向 Gradle project 生成设计的,我们认为,Gradle 的 dependencies 是这样: project(1) : sourceSet(N)…
关于 a.b.c:1, a.b:0a.b.c.somechild 这样的前缀 map 可以抽象成 PrefixMap<K, V> 然后在查找时线性地 Descending set + target.startsWith(this),当然好一点的方法是用 trie 字典树,可能是没有最好。

关于从 (scope, sourceSet) 到文件路径的分配,统一是 /src/$scope/$sourceSet/$pkgPath/mdName.$language,语言先只能是一种,默认是 Kotlin。
简而言之,Lkt 的命令行工具就是在支持文章结构的前提下允许自动组织项目结构,利用诸如 package 这样的信息自动组织。
duangsuse::Echo
关于 Literate Kotlin project 结构的设计。 Literate Kotlin 之前基于 literateBegin..literateEnd 且允许单层嵌套的设计,已经在 TypeScript 语言里作为小脚本完成实现,单独的命令行工具也会采用这样的单 markdown 结构。 LiterateKotlin 目前为了实用,先是按向 Gradle project 生成设计的,我们认为,Gradle 的 dependencies 是这样: project(1) : sourceSet(N)…
从序列模式提取的角度看,

-Tgradle 指的 "gradle" 实际上是一种生成插件,我们可以用 interface 来规定一个插件要实现的东西。

interface GenerateIntrinsic {
fun solvePath(src: CompileUnit): Path
fun generateProject(base: File)
}
data class CompileUnit(val scope: String, val sourceSet: String, val name: String)


interface LiterateKtPlugin<CFG> {
val name: String
fun readConfig(entry: Feed<Line>): CFG
fun create(cfg: CFG, properties: Map<String, String>): GenerateIntrinsic
}
从序列模式提取的角度看,

[...](file_reference) 的正则是复用的

```xxx
package ...
``` 的解析器是复用的

-Tgradle 指的 "gradle" 实际上是一种生成插件,我们可以用 interface 来规定一个插件要实现的东西。

interface GeneratePlugin<CFG> {
fun readConfig(entry: Feed<Line>): CFG
fun solvePath(src: CompileUnit): Path
fun generateProject(base: File)
}
data class CompileUnit(val scope: String, val sourceSet: String, val name: String)
有点累……
烦死了,到底该不该有
看起来用这种方式实现 -T, abc-Tabc 一起解析是个错误的决定
强烈建议使用传统方式解析
……简直就是噩梦…… 如果用户输入重了,怎么办?毫无提示? 难道就这样就没有更好的方法了?