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

技术相干订阅~
另外有 throws 闲杂频道 @dsuset
转载频道 @dsusep
极小可能会有批评zf的消息 如有不适可退出
suse小站(面向运气编程): a19a0b
Download Telegram
duangsuse::Echo
所以这个人呐,就是要不断的学习,不断的努力提升自己 (当然我不是说 Java 比 Kotlin 简单很多,简单很多是真的,但是很多人连 Java 有 @ label 语法、vararg 语法糖什么的都不会用,标准库的一些语言内部的接口比如 Iterable 都不知道,Annotation 处理机制也不了解,这样的话还是推荐先了解一下 Java 8,推荐自然还是看本本的。 Java 比起 Ruby、Python 这种重视语法灵活性的语言语法规则少一些(不是说语法层面的东西就不值得考虑,我相信在座的各位都没有一个人敢说自己了解…
The Java maintainers chose to generate the implementation class in runtime. This is done by calling java.lang.invoke.LambdaMetafactory.metafactory. Since the arguments for that call (return type, interface, and captured parameters) can change, this requires invokedynamic.

== 为什么 Java 8 里 Lambda 表达式和 new OnClickListener() {} 这种(匿名子类)的方法覆盖/实现可以引用外部局部变量,但被引用变量必须为 final 呢?

看这里


首先我简单的说一下,invokedynamic 的逻辑是完全可以使用 Java 的反射 java.lang.reflect 特性实现的,不过反射性能可能比较低(至少比 invokedynamic 低,除非做了严重优化),基本上 JVM 程序员都知道(哪怕是 Android 程序员也都清楚吧... 至少他们会去考虑)。

有些概念 Dalvik 上是没有的,你们理解就好。Dalvik

不过 btw, Google 的 Android SDK 使用了很多 Apache Harmony (Apache 的 Java 开发环境,类似 GNU ClassPath?)项目的代码,看 AOSP Java 代码的人应该看到过

其实对于拿 C 程式设计语言开发 native ABI 应用的程序员来说应该都不难理解,但现在已经不是所有人都知道这些层面的事情了,软件工程师的门槛正越来越矮。

溜了溜了... 随手中文写一篇技术生活相关的广播就溜( 🐕
duangsuse::Echo
其实我说的可能是和 Java 一些比较... 不是语法层面的东西吧(我好歹看书找了一下) #Java #Android #PL 呃... 比如 Java 方法(类们的)区、堆、虚拟机栈大小、动态扩容什么的,JDK 命令行工具、JDWP、OQL、Object 类一些基础的东西 #clone() #equals() 什么的,String#intern()、本地表(locals)、并发垃圾收集、JIT 解释混合模式、字节码校验、原生类型装拆箱、动态方法分派(java.lang.mh,invokedynamic,我想后面一个『名词』很多…
对不起啊,因为 Telegram Desktop Linux/Qt 编辑框的一个小问题,太长的消息渲染可能会莫名爆炸,所以这个 #learn 我没写完就爆炸了... 加上我发现已经写了很长时间而且天寒地冻的决定还是先庆祝新年吧,有时间再说这个(rt.

其实怎么说呢,Java 它看似是『简单』的语言(相对 Kotlin)但是,其内涵也是可以说是有的,比 C89、Lua、Python、Perl、JavaScript 那些低级语言高到不知哪里去了(跑)(当然 Haskell、FSharp 之类的也很高,但是不是一个方向的高,Java 是 OO 语言,各有各的好)

OO 编程其实是个容易使用但不容易完全理解的玩意,彻底做到如 GoF 那种一份文件一个类图的理解层次是比较难的,需要长年 nontrivial 的积累,现在很多 Java 平台的开发者学的都比较 trivial,不懂的东西也懒得深究,看不透辅助类型开发者们对底层复杂性所做的封装,重视实践轻视理论,但这其实是不利的(如果前端们没有做到人尽其用的话,不能空下应该拿来读书学习的时间就是),理论和实践应该兼而有之,不理解这些『无用』的东西不会妨碍你成为称职的程序员,但会阻止你成为的程序员。

@JvmName
@JvmStatic
@JvmField
@file:JvmName
@PureReified
@Contract

这些注解可能我觉得对,如果想多了解这些八卦知识最好还是去关注一些高理解层次的 Kotlin 工程师,这里当然我就只知道冰封哥(ice1000)和 R 大(rednaxelafx@iteye)了(

reified 这个 type parameter modifier 也可以了解一些
至于 Kotlin 里 super 关键字调用祖父类(父类的父类)里的方法也可以学习一下

https://kotlinlang.org/docs/reference/classes.html#overriding-rules

open class A {
open fun f() { print("A") }
fun a() { print("a") }
}

interface B {
fun f() { print("B") } // interface members are 'open' by default
fun b() { print("b") }
}

class C() : A(), B {
// The compiler requires f() to be overridden:
override fun f() {
super<A>.f() // call to A.f()
super<B>.f() // call to B.f()
}
}

Kotlin 语法的确非常的灵活非常有表现力,但是,我觉得现在学 Kotlin 的程序员最好还是看看诸如《Kotlin 极简教程》之类的东西,不要连 mapOf(1 to 2, 2 to 3) 这个东西的 AST 是什么都看不透(注意 infix notation 中缀方法调用表示和 vararg

祝大家新年新气象,技术无论在深度和广度上都得到提升。画画布局的越做越好看,灵感各种报(爆)表(_),身体健♂康万事如意

说完了。It's over.
Forwarded from LWL 的基地台
#LWL的自由天空 新鲜出炉:《2018 年度简报》,小伙伴们快来围观吧!(/・ω・\)
Forwarded from dnaugsuz
LWL 果然写跨年笔记了,好耶!
Forwarded from duangsuse Throws
Forwarded from Deleted Account
今日笑死
#Low #China #recommended hhhh 『洋』程序设计语言 禁止过洋节 NB.
Forwarded from Genteure's Window
Forwarded from Genteure's Window
我本来想法是吃瓜看戏,不过这个越看越觉得不对劲,越看越火大。
这伙人是脑子进屎了吧?智商不达标?
比如 这个
afc163: 早就做好了被骂的准备。
dnaugsuz
LWL 果然写跨年笔记了,好耶!
果然没写。上面那个是 https://example.org/咕咕咕
#PLT #Learn To #Proof 我也是刚刚注意到 (p -> q) 是一个单独的命题... 描述的是『由命题 p 成立可以推导出命题 q 成立』(p 『蕴含』 q
命题 (p -> a) -> (q -> a) -> (p ∨ q -> a) 不一定要 pv 都成立才成立... 可惜我现在才看得懂

写成 Agda 代码就是(基本是抄的,这里说了,所以不要喷我拿别人的代码『装饰』我自己的技能栈,至于前端和 PHP、JavaEE 系后端那一套我后来自会学不消吐槽)

data _∨_ (P Q : Set) : Set where
∨-intro₀ : P -> P ∨ Q
∨-intro₁ : Q -> P ∨ Q

∨-elim : ∀ {P Q} {R : Set} -> (P -> R) -> (Q -> R) -> (P ∨ Q -> R)

∨-elim pr _ (∨-intro₀ p) = pr p
∨-elim _ qr (∨-intro₁ q) = qr q

看不懂的话好好复习一下函数式基本理论,什么映射、定义域、递归函数、集合论、lambda 演算什么的,当然我马上就以小学老师的耐心讲解:

当然上面的那个
data _∨_
是一个代数类型(Algebraic DataType),
_∨_
那两条<del>斜杠</del>下划线表明这是一个 mixfix 类型操作符(类似 Kotlin 和 Haskell 里的 infix notation),或许类似 Haskell 里的 -XTypeOperators

(P Q : Set) : Set

P Q 都是集合,然后结果也是一个集合,这完全是我根据 Haskell 等简单语言态射(函数映射)理论造出的臆想,当然其实我还不够了解函数式


下面 where 之后的缩进块『二维文法』是定义的
_∨_
类型架构器们,有两个,分别叫
∨-intro₀

∨-intro₁

∨-intro₀ 由 P 构造出一个 P <or> Q 类型实例
∨-intro₁ 则由 Q 构造出一个 P <or> Q 类型实例

∨-elim : ∀ {P Q} {R : Set} -> (P -> R) -> (Q -> R) -> (P ∨ Q -> R)

: 是类型定义
val n : Int 这种

∀ 是 forall
[全称量化]

在谓词逻辑中,全称量化是尝试形式化某个事物(逻辑谓词)对于所有事物或所有有关的事物都为真的概念。结果的陈述是全称量化后的陈述,我们在谓词上有了全称量化。在符号逻辑中,全称量词(典型的"∀")是用来指示全称量化的符号。

比如定义 2 为一个参数的乘法(Haskell 里用 (*) 2 表示)

2·0 = 0 + 0 以及
2·1 = 1 + 1 以及
2·2 = 2 + 2
...

对任意自然数 n,都存在 2·n = n + n
∀n∈ℕ -> 2·n = n + n (伪代码)

当然这是一个比较简单的例子。

对于此例,就是说命题对于所有 {P Q} 的可能情况都成立
<del>这就可见数理逻辑对于 chatbot 开发者来说是多么重要的知识范畴了</del>

P Q 你们都知道(但是我不知道是不是指在 data _<or>_ 里定义的那个,R 也是 Set
后面的 -> 的后面就是我们逻辑上的定义了
(P -> R) -> (Q -> R) -> (P ∨ Q -> R)

∨-elim pr _ (∨-intro₀ p) = pr p
∨-elim _ qr (∨-intro₁ q) = qr q

然后两种情况模式匹配(Haskell 爱好者们肯定知道,ES6 和 Kotlin 说不定也知道),第一种是匹配 P 成立的情况

(P -> R) -> (Q -> R) -> (P ∨ Q -> R)
pr -> _ -> (∨-intro₀ p) -> R

我们最后的命题大概是
(P ∨ Q -> R)
,然后 pr(P -> R)p(P ∨ Q) 里的一个架构器参数,类型为 P,直接 (pr p) 就拿到了 R,结束证明

第二种自明。仿照上例显然,请自己理解(喷,没有那么骚的念诗么

(理论上其实是会 Haskell 的基本都看得懂,因为逻辑方面也有这种比较 trivial 的内容非常容易理解,小学数学。还不是奥数。)
(是的,Agda 的函数签名语法我现在还看不太懂更难独立写出来,因为我不理解它后面的那些 theory,不过目前我还不太在乎这些)
(不过,反正你们也不会,那我不会就是有理有据的了,逃)
(这和过程式那一套理论不一样,更 naive 一些,🐸
(好吧,扯远了,不是一个层面的东西)

说实话,那篇『简单的 Agda 定理证明教程』我也是看了两个星期以后才有能力做到那个『仿照上例显然』的证明的... 好菜啊

然而现在 ∀v -> rev (rev v) ≡ v 我还是不会证明... rewrite 语法糖要替换的逻辑关系也暂时无法理解,呵呵
where rev [] = []
rev (x :: xs) = (rev xs) ::ʳ x

rev : ∀ {n m} {A : Set n} -> Vec A m -> Vec A m

(都还是抄的... Haskell 我还会写,至于形式化证明那一套映射关系还不怎么了解)

如果对这一套 Mathematics 上的东西感兴趣的话不妨随便看看某些定律的证明,不管是数论范畴的还是逻辑学上的 🐸 比方说:五点共圆 hhhhh
其实偶尔弄一下这类无聊的东西也怪好玩的,不过不能实用。所以一直都是诸如我这种无聊的人干诸如理论学习这种无聊的事情,真的是相当无聊啊。

这篇博文的配套阅读,当然里面内嵌的是 MathJax/TeX,当然我比较菜所以就讲不好。算了,总觉得可能... 即使不一定完全正确,也是有价值的。你们有心情学了就好。
结束。
Forwarded from GitHub
🔨 1 new commit to MiPushTester:canary:

54fdfd3: refactor(app): use Kotlin

Signed-off-by: Trumeet <[email protected]> by Yuuta
Forwarded from Yuuta 🎀
一晚上 + 一上午,搞定 Kotlin 基础语法,用到哪学到哪(
Forwarded from Deleted Account
#!/usr/bin/env python3
# -*- encoding: utf-8 -*-

import time
import tgcrypto

FIRST_NAME = '[%H:%M CST] /dev/lwl12'
LAST_NAME = '$' # Follow the rules of Python's strftime

START_TIME = time.time()

from pyrogram import Client, api

def update_name(client):
client.send(
api.functions.account.UpdateProfile(
first_name=time.strftime(FIRST_NAME, time.localtime()),
last_name=time.strftime(LAST_NAME, time.localtime()) # Change this if you want to use any other timezones
)
)
print('>>> Name updated.')

if __name__ == '__main__':
app = Client("/home/pi/timeNick/real-time-nick", api_id=114514, api_hash="1919810")
with app:
update_name(app)
quit()
duangsuse::Echo
#Low #China #recommended hhhh 『洋』程序设计语言 禁止过洋节 NB.
不是这样的,大概就是 Ant Design 这个前端开发平台的人弄了个圣诞节”彩蛋“,让圣诞节来临时所有默认的 button 风格都会改变为有圣诞积雪 overlay 的版本。遭致程序员们所认为的『未定义布局』

还有被吐槽的 Merry Chris[t]mas 写错的问题和 [title="Ho Ho Ho!"] 的问题。总的来说我觉得这是 Ant Design 自己的锅,因为圣诞彩蛋不应该这么具有入侵性,弄得人家升级以后完全不知道会出现这种情况就很蒙蔽。

当然因为软件许可证的原因 Ant Design 无需为此负责,但这的确是不良实践,实在是不推荐的做法,作为一个模板库设计者主要还是确保辅助软件的功能,功能性的东西上面彩蛋是有点过分。

如果 Ant Design 这种前端平台要加彩蛋的话,推荐还是在诸如开发工具方面,不涉及最终用户的地方加,这样大家都是工程师有话好说。不要强行捆绑给所有使用自己的项目圣诞节彩蛋。