Library | License | Environment | Language | Mobile | Web | Memory | Storage |
---|---|---|---|---|---|---|---|
GTK | LGPL | Native | GladeXML and binding languages | None | None | Low | |
Qt | LGPL and Commercial | Native | QML, JavaScript and binding languages | Support | Support | Low | |
wxWidgets | LGPL-like | Native | C++ and binding languages | Support | None | Low | |
Flutter | BSD | Native | Dart | Support | Support | Low | |
JavaFX | GPL and linking exception | JVM | Java | Support | Support | High | |
Electron | MIT | Chromium | JavaScript | None | Support | High |
挖工作量证明(PoW)币会因为 CPU 负荷满载而被封。
刷广告是灰色产业。收入低,易被坑,IP 还容易进黑名单。
合法赚钱的有:
- 挖权益证明(PoS)币。运行记账节点。
各项资源消耗都不多,但是需要先持币。 - 挖容量证明(PoC)币。适合流量不多但硬盘很大的。
- 挖时空证明(PoSt)币。适合流量和硬盘都很富裕的。
- 运行 DApp 节点。不同的 DApp 有不同的配置需求。有的要求高内存,有的要求大硬盘,有的要求高流量。
/** | |
* @file Serverless echo request | |
* Can also be used for geopositioning | |
* @copyright Public domain | |
*/ | |
function toJson(iterable) { | |
let json = {} | |
for (const [key, value] of iterable.entries()) { | |
json[key] = value |
太多文章从商业化的角度讨论了这个问题,而我想从别的角度谈谈。
SSPL 不自由的原因其实很简单,这是一个完全没法用的协议。
使用 SSPL 授权的软件,用户除了要将该软件开源,还要将服务器上所有的配套设施开源。如果服务器上全是开源软件还好说,但如果服务器上运行的是 Windows,那么就完全无法满足 SSPL 的要求。因为该名用户同时也是专有软件 Windows 的用户。依据微软商业授权协议,用户无权获得 Windows 的代码,甚至连分享 Windows 的二进制安装包都是违法的。除此以外,还存在拥有源代码,但授权协议不赋予重新发布的权利。比如采用苹果的 APSL 协议发布的软件,它们的代码就是只能看不能用。
因此,SSPL 在实际使用时,极有可能与服务器上的其它软件产生许可证冲突。要么弃用 SSPL,要么弃用与之冲突的软件。
SSPL 这类许可证,其实和高通专利互惠协议一样,本身就有垄断的色彩。获得市场支配地位本身不是问题,这个世界上具有市场支配地位的东西很多,比如 Linux 就在服务器领域具有市场支配地位。但是利用这种地位推广不对等的权利关系,就涉嫌垄断了。
XTLS 的授权协议问题引发了争议,最终导致 XTLS 从 V2Ray 项目分家。
作者 @rprx 感觉受到了很大委屈,并认为这是道德绑架。他认为:我给你们看代码就足够仁至义尽了,难道我还不能要求不得修改和二次开发?并认为 Debian 要将其从仓库删除是一种威胁。
这其实是因为他不了解 Debian 乃至自由软件的目的。
自由软件并不仅仅是代码可以看就足够了,还要能够任意修改、打包、分发。这基本上相当于让作者放弃对作品的(垄断)控制。
XTLS 要求不得修改和二次开发,实际上使得该软件仍旧处于作者的(垄断)控制之下,仍旧为专有软件。
如果这是个美国籍的作者写的软件,那么它就会受到特朗普出口禁令的影响。任何把该软件传输给中国人的行为都会违反出口禁令。
如果 @rprx 不幸被捕,那么没有第三方能在合法的情况下接手 XTLS 的开发、因为它禁止了修改和二次开发。
甚至在 GitHub 上提交 PR 也是违法的,因为这伴随着修改。
Lambda 表达式属于函数式编程思想的概念。
函数式编程思想的核心是:没有对象时序状态的变化,一切都是数据,通过函数加工后得到数据的处理结果。
所以函数式编程的概念是与“对象”概念不兼容的。这造成了很多人在 OOP 项目中看到 lambda
表达式时的理解障碍。
举个例子:排序。
- OOP 的排序是集合类方法(函数),其实质是对象之间相互比较,然后得到此集合类的一个对象,这是非常容易理解的。
- FP 的排序,是一系列函数的嵌套。最外层当然是排序函数,但是它的参数不是集合对象,而是对集合数据的迭代函数,这个迭代函数的内部往往还有个比较函数。这是一系列对数据的处理。这些函数不从属于任何人类可理解的对象。当然你可以把它们理解成多层循环和迭代,每层对象分别是集合、元素、比较结果。且不说这种理解需要多少脑补,实质上它的原理也不是这样,它的每层函数,都是一个新的函数类的对象:“排序函数对象”、“迭代函数对象”、“比较函数对象”。这对人类来说很难理解吧?
虽然有 @Throws(Exception::class)
这种方法,但是并不强制。懒惰的程序员才不会写没用的注释。
所以没有人用的异常机制就是没用的异常机制。
当我需要调用别人的方法或库的时候,不知道对方都抛了哪些异常,这个时候该怎么捕捉?看源码还是看文档?
不过不得不承认,Java 虽然有完善且严格的异常机制设计,但是大家的实践并不好。
有人认为异常不应该处理,有问题就应该退出。
我认为这是没理解 Java 的异常概念。
Java 对应“异常退出”的设计叫做 Error
,它是指无法预见且你的代码无法处理的错误。
#!/system/bin/sh | |
for file in /proc/sys/net/ipv6/conf/* | |
do | |
echo 1 > $file/accept_ra_defrtr | |
done |
GFWList 该代理的不代理,GeoSite 不该代理的瞎代理。
GFWList 的缺陷可以让用户通过添加自定义项的方式解决。
GeoSite 宁枉毋纵,凡是境外网站统统代理。 而对于境外网站的境内分站,还搞出了子项排除这种复杂的规则。 不过,这也许在计算层面上的效率比 GFWList 更高。
但是,更加耗费流量也就意味着更加烧钱。