Skip to content

Instantly share code, notes, and snippets.

View CrazyBoyFeng's full-sized avatar
💭
Recovering...

狂男风 CrazyBoyFeng

💭
Recovering...
View GitHub Profile
@CrazyBoyFeng
CrazyBoyFeng / CrossPlatformDesktopUILibrary.md
Last active September 3, 2021 10:04
跨平台桌面 UI 库对比
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
@CrazyBoyFeng
CrazyBoyFeng / IHateGradle.md
Last active August 14, 2021 17:49
我讨厌 Gradle!!!I HATE Gradle!!!

我讨厌 Gradle!!!

我只是需要比 Maven 更快的工具而已。

资源占用

Gradle 在我的电脑上占用的内存甚至超过了 IDE。而且经常在编辑代码时占满 CPU。
同时打开多个 Gradle 项目时,它占用的资源成倍增长。

在开发小型项目时,尤其能感受到 Gradle 的庞大和笨重。

过于灵活

@CrazyBoyFeng
CrazyBoyFeng / IdleVps.Md
Last active August 14, 2021 17:40
闲置 VPS 用途

挖工作量证明(PoW)币会因为 CPU 负荷满载而被封。
刷广告是灰色产业。收入低,易被坑,IP 还容易进黑名单。

合法赚钱的有:

  • 挖权益证明(PoS)币。运行记账节点。
    各项资源消耗都不多,但是需要先持币。
  • 挖容量证明(PoC)币。适合流量不多但硬盘很大的。
  • 挖时空证明(PoSt)币。适合流量和硬盘都很富裕的。
  • 运行 DApp 节点。不同的 DApp 有不同的配置需求。有的要求高内存,有的要求大硬盘,有的要求高流量。
@CrazyBoyFeng
CrazyBoyFeng / EchoRequest.JS
Last active June 8, 2021 17:29
Cloudflare Workers: Echo Request
/**
* @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
@CrazyBoyFeng
CrazyBoyFeng / WhySsplNotFree.md
Last active August 14, 2021 17:41
为什么 SSPL 不是自由许可证

太多文章从商业化的角度讨论了这个问题,而我想从别的角度谈谈。

SSPL 不自由的原因其实很简单,这是一个完全没法用的协议。

使用 SSPL 授权的软件,用户除了要将该软件开源,还要将服务器上所有的配套设施开源。如果服务器上全是开源软件还好说,但如果服务器上运行的是 Windows,那么就完全无法满足 SSPL 的要求。因为该名用户同时也是专有软件 Windows 的用户。依据微软商业授权协议,用户无权获得 Windows 的代码,甚至连分享 Windows 的二进制安装包都是违法的。除此以外,还存在拥有源代码,但授权协议不赋予重新发布的权利。比如采用苹果的 APSL 协议发布的软件,它们的代码就是只能看不能用。
因此,SSPL 在实际使用时,极有可能与服务器上的其它软件产生许可证冲突。要么弃用 SSPL,要么弃用与之冲突的软件。

SSPL 这类许可证,其实和高通专利互惠协议一样,本身就有垄断的色彩。获得市场支配地位本身不是问题,这个世界上具有市场支配地位的东西很多,比如 Linux 就在服务器领域具有市场支配地位。但是利用这种地位推广不对等的权利关系,就涉嫌垄断了。

@CrazyBoyFeng
CrazyBoyFeng / AboutXtlsLicense.md
Last active August 14, 2021 17:40
关于 XTLS 的授权许可协议

XTLS 的授权协议问题引发了争议,最终导致 XTLS 从 V2Ray 项目分家。

作者 @rprx 感觉受到了很大委屈,并认为这是道德绑架。他认为:我给你们看代码就足够仁至义尽了,难道我还不能要求不得修改和二次开发?并认为 Debian 要将其从仓库删除是一种威胁。
这其实是因为他不了解 Debian 乃至自由软件的目的。

自由软件并不仅仅是代码可以看就足够了,还要能够任意修改、打包、分发。这基本上相当于让作者放弃对作品的(垄断)控制。
XTLS 要求不得修改和二次开发,实际上使得该软件仍旧处于作者的(垄断)控制之下,仍旧为专有软件。
如果这是个美国籍的作者写的软件,那么它就会受到特朗普出口禁令的影响。任何把该软件传输给中国人的行为都会违反出口禁令。
如果 @rprx 不幸被捕,那么没有第三方能在合法的情况下接手 XTLS 的开发、因为它禁止了修改和二次开发。
甚至在 GitHub 上提交 PR 也是违法的,因为这伴随着修改。

@CrazyBoyFeng
CrazyBoyFeng / NotRecommendLambdaInOop.md
Last active March 15, 2021 07:55
不推荐在面向对象编程中使用 Lambda 表达式

Lambda 表达式属于函数式编程思想的概念。

函数式编程思想的核心是:没有对象时序状态的变化,一切都是数据,通过函数加工后得到数据的处理结果。
所以函数式编程的概念是与“对象”概念不兼容的。这造成了很多人在 OOP 项目中看到 lambda 表达式时的理解障碍。

举个例子:排序。

  • OOP 的排序是集合类方法(函数),其实质是对象之间相互比较,然后得到此集合类的一个对象,这是非常容易理解的。
  • FP 的排序,是一系列函数的嵌套。最外层当然是排序函数,但是它的参数不是集合对象,而是对集合数据的迭代函数,这个迭代函数的内部往往还有个比较函数。这是一系列对数据的处理。这些函数不从属于任何人类可理解的对象。当然你可以把它们理解成多层循环和迭代,每层对象分别是集合、元素、比较结果。且不说这种理解需要多少脑补,实质上它的原理也不是这样,它的每层函数,都是一个新的函数类的对象:“排序函数对象”、“迭代函数对象”、“比较函数对象”。这对人类来说很难理解吧?
@CrazyBoyFeng
CrazyBoyFeng / CritiqueOfKotlinException.md
Created March 4, 2021 17:14
Kotlin 异常机制批判

虽然有 @Throws(Exception::class) 这种方法,但是并不强制。懒惰的程序员才不会写没用的注释。
所以没有人用的异常机制就是没用的异常机制。

当我需要调用别人的方法或库的时候,不知道对方都抛了哪些异常,这个时候该怎么捕捉?看源码还是看文档?

不过不得不承认,Java 虽然有完善且严格的异常机制设计,但是大家的实践并不好。

有人认为异常不应该处理,有问题就应该退出。
我认为这是没理解 Java 的异常概念。
Java 对应“异常退出”的设计叫做 Error,它是指无法预见且你的代码无法处理的错误。

@CrazyBoyFeng
CrazyBoyFeng / enable-ipv6.sh
Created February 9, 2021 08:57
Android Enable IPv6
#!/system/bin/sh
for file in /proc/sys/net/ipv6/conf/*
do
echo 1 > $file/accept_ra_defrtr
done
@CrazyBoyFeng
CrazyBoyFeng / ShadowsocksPAC.md
Last active December 8, 2020 17:41
Shadowsocks 从 GFWList 换为 GeoSite 是退步

GFWList 该代理的不代理,GeoSite 不该代理的瞎代理。

GFWList 的缺陷可以让用户通过添加自定义项的方式解决。

GeoSite 宁枉毋纵,凡是境外网站统统代理。 而对于境外网站的境内分站,还搞出了子项排除这种复杂的规则。 不过,这也许在计算层面上的效率比 GFWList 更高。

但是,更加耗费流量也就意味着更加烧钱。