aristolochic 最近的时间轴更新
aristolochic

aristolochic

V2EX 第 503859 号会员,加入于 2020-08-14 21:24:10 +08:00
今日活跃度排名 5110
aristolochic 最近回复了
Ruby on Rails 生态里有一个东西叫做 PaperTrail ,是一个可以为任意资源提供更改审计的库,每当对配置好的某资源进行增删改的时候都会留下记录,供以后审计和回滚。思路很简单就是挂上钩子然后把原版序列化成 JSON (也可以选增量更新的插件),存到一个多态表里面。尤其是这个多态表,什么资源都有可能,就只能用 JSON 了。如果你用的是 PostgreSQL 的话它会鼓励你使用 JSON 的字段,但是其实只是用到了 PostgreSQL 对 JSON 的校验而已。

所以,简单来说,就是快照。
如果你会产生这样的疑问,说明选什么都不会产生什么影响

那就掷硬币吧:

- 落在桌面内,正面 Postgres ,反面 MariaDB

- 掉出桌面外,正面 SQLite ,反面文件系统

- 掉出房间外,正面 MongoDB ,反面 CouchDB

- 掉到楼道里,正面 Neo4J ,反面 Redis

- 竖起来,在内存里存成 Trie

(前提是 Typecho 支持

(逃
12 天前
回复了 nbweb 创建的主题 Linux 如何在 debian 终端上显示中文?
另外再提一句,如果你的系统有奇怪的 pam 的话,pam_environment 是有可能覆盖 locale.conf 设置的本地化相关环境变量的。如果有 X 相关的东西的话,那更加有可能被 DE/DM 覆盖,这个就得自己找了,先看看 xinitrc,再看看 DM,再看看 DE 。
12 天前
回复了 nbweb 创建的主题 Linux 如何在 debian 终端上显示中文?
不考虑 ssh 的话(因为你没说你用的是什么),服务端设置 locale 的正确做法是在 locale.conf 写入

```
LANG=zh_CN.UTF-8
```

locale.conf 可以是 /etc/locale.conf 、~/.config/locale.conf 、$XDG_CONFIG_HOME/locale.conf 或 $HOME/.config/locale.conf,依据你希望应用的范围和是否修改了默认 HOME 和 XDG_CONFIG_HOME 而定。

locale.conf 的变更会在下次登录时生效,要立刻应用新的设置的话,可以运行:

``` sh
$ unset LANG
$ source /etc/profile.d/locale.sh
```

注意到只设置了 LANG 这一个环境变量,这是因为这个变量的值会覆盖掉所有未设置的 LC_* 变量的值。

如果你希望做更加细粒度的控制,去看 manpage 。

你也可以额外设置一个 LANGUAGE,如果上述的 LANG 没有将其设置的话,因为使用 gettext 翻译的软件会按照 LANGUAGE 选择使用的语言。当然现在也不一定,在我常用的 Arch 和 Ubuntu 20.04 中,只设置 LANG 是可以给 LANGUAGE 提供默认值的。

不建议使用 LC_ALL,这个是为了测试和排错使用的临时值,尤其是它不能出现在 locale.conf 文件中。这个变量的值会覆盖掉 LANG 和所有 LC_* 变量的值,无论它们是否设置。

---

或者运行

``` sh
# localectl set-locale LANG=zh_CN.UTF-8
```

如果有 locale.alias 文件的话,理论上你也可以用别名,但考虑到不是所有系统都有,在此不作展开。
poppler-utils 倒是能把 pdf 转成 svg,改完以后再转回来。就是不太清楚文本能不能保留。

我还以为你要生成那种自带表单的 pdf 然后让用户自己编辑下载呢
不要试图理解[[Prototype]]属性,这个不是学习 JavaScript 本身需要知道的,你看它写着是个原型,但很容易断章取义贻笑大方:

下面摘抄 [MDN 原文]( https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Global_Objects/Object/proto) :

> __proto__的读取器(getter)暴露了一个对象的内部 [[Prototype]] 。对于使用对象字面量创建的对象,这个值是 Object.prototype (en-US)。对于使用数组字面量创建的对象,这个值是 Array.prototype 。对于 functions,这个值是 Function.prototype (en-US)。对于使用 new fun 创建的对象,其中 fun 是由 js 提供的内建构造器函数之一(Array, Boolean, Date, Number, Object, String 等等),这个值总是 fun.prototype 。对于用 js 定义的其他 js 构造器函数创建的对象,这个值就是该构造器函数的 prototype 属性。

> __proto__ 的设置器(setter)允许对象的 [[Prototype]] 被变更。前提是这个对象必须通过 Object.isExtensible() 判断为是可扩展的,如果不可扩展,则会抛出一个 TypeError 错误。要变更的值必须是一个 object 或 null,提供其它值将不起任何作用。

那么很明显,无论你的 Student 类还是 PrimaryStudent 类,很显然都不是 JavaScript 的内建构造器函数,new 出来的 [[Prototype]]只会是其对应的函数的 prototype 。PrimaryStudent 的 prototype 是 Student,Student 的 prototype 是 Object,显示十分正确。
grpc 主要是 protobuf 它就不是一个透明的序列化协议,为了性能和紧凑必须要定义 proto 文件,这不是顺便就解决了约束吗?另外也就有底气支持更加复杂的类型。而且这个约束还必须要遵守,如果不知道 proto 文件就是一坨二进制数据根本没法解析。而透明的序列化协议就压根不需要事先协商,不管谁传过来的都能直接用。这类序列化协议不一定非得是文本格式,msgpack 就是二进制版的 JSON 也可以直接用。也不是没有约束的方法,这个约束我们一般称为 Schema

要是说 Schema 的话,最先想到的估计就是 SGML/HTML/XML 那家子,从一开始就设计了 DocType 还有 Schema 。这些都是官方实现,用了好多年了相当成熟

但是也不是说 JSON 就没有了。JSON Schema 咋说也够用,还能提供更多的约束,要求更高还能自定义原语。比如上面提到的 Swagger 设计的 OpenAPI 3 spec 就是 JSON Schema 改的,不过定义了自己的原语实现更多约束,还重新诠释了 JSON Schema 规范中的一些字段(我是不太喜欢这么搞的,一下子就不兼容了

要是嫌 JSON Schema 不是官方 RFC 出的,那就次一点用 JSON Type Definition 。这个就没有更多的约束了,不过对于类型本身应该是比 JSON Schema 更细化,你想要指定 int 位数、有没有符号都行,而且还有一个 JSON Schema 里实现起来比较别扭的,就算不别扭也不一致,就是它能用 Discriminator 实现 Tagged Union / Sum Type

要说类型生成器,JSON Schema 和 JSON Type Definition 都有不少。如果是 JavaScript 这种动态类型的也可以用流式 API 定义 JSON Schema 。XML 的 Schema 就更别说了,理应是更加成熟

(话说 ML/类 ML 语言社区搞的类型系统应用都挺魔怔的,印象里 Haskell 的 Yesod 有 CSS 、HTML 和 URL 等等等等的强类型。现在看来也不是只有 Haskell 这么狠
@zhangdeplives 哪怕是给未上市保密机器调试 BIOS 都没这个悬丝号脉,至少人家给个小笔记本连着呢( x
(再说未上市 PC 上市了能挣钱,Python 打包的 App 就不一定了
43 天前
回复了 mmdsun 创建的主题 程序员 有什么小众的语言或框架,是值得学习 ?
@popil1987 我倒是不太认为 Laziness 就能成为性能的保障。Haskell 自己也说了 Purity 是为了 Laziness,Laziness 是为了 Non-Strict,Non-Strict 学术上是为了区分于 Strict 的 ML 语言提供统一的实验阵地、实践上是为了写出 More composable code,不为了手动确保求值的流式而耗费太多脑力。

表现上就是可以写一个无尽的递归斐波那契数列,存储历史值使递归栈扁平化,且 GC 能够保证立刻清除不需要的历史数据,就像有一个超厉害的缓存一样。这点在 ghci 和 ghc 编译出来的运行行为不同能够体现,ghci 里运行递归的斐波那契到 1000 位,以后算 1-1000 位都是秒出,即使再要求算 1000+,也是从 999 和 1000 开始的。而 ghc 编译的话由于知道那些值需要,所以不需要的值会立即被 GC 掉。这在 Strict 的语言根本不可能,它们没办法用图来表达值的关系,最终还是面向栈的。

(怎么感觉变成安利 Haskell 了)

不过怎么说正常写的 Strict 程序再加上图灵机要求的可变性,是不会比 Non-Strict 加上 Lambda 演算和 Laziness 要求的 Purity 慢的,而且应该说是 Strict 程序往往更快(只要脑子不抽)。所以单从模型上看,使用了 Stream 的 Elixir 程序和 Haskell 写出来是一致的,要说性能有差别也是 BEAM 的开销和类型检查的开销。只不过 Haskell 好说歹说也是静态的、直接编译到机器码的系统语言,还是要和 C/C++啊 Java 啊 Go 啊打一打,这下 List 就到了极限了,才不得已要出“数组”,导致一个学术语言为了解决实践问题搞出了复杂程度堪比 Rust 的“字符串类型矩阵”,还需要常备 cheat sheet,引来了不少老学究的嫌弃。
43 天前
回复了 aizya 创建的主题 JavaScript js 怎么判断用户关闭了浏览器
瞧这问题问的,要是用户用一个软件的 WebView 打开你的网站,你难道还想去监听这个用户是关了你的页面还是关了整个软件? Web 怎么可能让你知道那么多,岂不是反了天了。现在浏览器标准都是安全越收越紧,是绝对不可能再出一个 API 告诉你浏览器关了的。

说白了对于 Web 而言,网站是不应该也不可能 Native aware 的,且不说 Tab 这些概念不是所有浏览器都有,比如有那种就一个页面的浏览器( surf 就是,在平铺窗口管理器生态有一定市场),还有那么多 WebView 也是没有标签的,更不可能让你了解到原生的情况。

浏览器插件 /扩展倒是可以知道标签的状态,具体能不能知道浏览器关没关就没了解过了。

要想完全控制,老老实实套 Electron 。
关于   ·   帮助文档   ·   FAQ   ·   API   ·   我们的愿景   ·   广告投放   ·   感谢   ·   实用小工具   ·   3903 人在线   最高记录 5497   ·     Select Language
创意工作者们的社区
World is powered by solitude
VERSION: 3.9.8.5 · 9ms · UTC 07:03 · PVG 15:03 · LAX 00:03 · JFK 03:03
♥ Do have faith in what you're doing.