Forwarded from duangsuse Throws
dnaugsuz
LWL 果然写跨年笔记了,好耶!
果然没写。上面那个是 https://example.org/咕咕咕
#PLT #Learn To #Proof 我也是刚刚注意到
命题
写成 Agda 代码就是(基本是抄的,这里说了,所以不要喷我拿别人的代码『装饰』我自己的技能栈,至于前端和 PHP、JavaEE 系后端那一套我后来自会学不消吐槽)
当然上面的那个
下面
∨-intro₁ 则由 Q 构造出一个 P <or> Q 类型实例
在谓词逻辑中,全称量化是尝试形式化
比如定义 2 为一个参数的乘法(Haskell 里用
对任意自然数
当然这是一个比较简单的例子。
对于此例,就是说命题对于所有
<del>这就可见数理逻辑对于 chatbot 开发者来说是多么重要的知识范畴了</del>
后面的
第二种自明。仿照上例显然,请自己理解(喷,没有那么骚的念诗么
(理论上其实是会 Haskell 的基本都看得懂,因为逻辑方面也有这种比较 trivial 的内容非常容易理解,小学数学。还不是奥数。)
(是的,Agda 的函数签名语法我现在还看不太懂更难独立写出来,因为我不理解它后面的那些 theory,不过目前我还不太在乎这些)
(不过,反正你们也不会,那我不会就是有理有据的了,逃)
(这和过程式那一套理论不一样,更 naive 一些,🐸)
(好吧,扯远了,不是一个层面的东西)
说实话,那篇『简单的 Agda 定理证明教程』我也是看了两个星期以后才有能力做到那个『仿照上例显然』的证明的... 好菜啊
然而现在
如果对这一套 Mathematics 上的东西感兴趣的话不妨随便看看某些定律的证明,不管是数论范畴的还是逻辑学上的 🐸 比方说:五点共圆 hhhhh
其实偶尔弄一下这类无聊的东西也怪好玩的,不过不能实用。所以一直都是诸如我这种无聊的人干诸如理论学习这种无聊的事情,真的是相当无聊啊。
是这篇博文的配套阅读,当然里面内嵌的是 MathJax/TeX,当然我比较菜所以就讲不好。算了,总觉得可能... 即使不一定完全正确,也是有价值的。你们有心情学了就好。
结束。
(p -> q) 是一个单独的命题... 描述的是『由命题 p 成立可以推导出命题 q 成立』(p 『蕴含』 q)命题
(p -> a) -> (q -> a) -> (p ∨ q -> a) 不一定要 p 和 v 都成立才成立... 可惜我现在才看得懂写成 Agda 代码就是(基本是抄的,这里说了,所以不要喷我拿别人的代码『装饰』我自己的技能栈,至于前端和 PHP、JavaEE 系后端那一套我后来自会学不消吐槽)
data _∨_ (P Q : Set) : Set where看不懂的话好好复习一下函数式基本理论,什么映射、定义域、递归函数、集合论、lambda 演算什么的,当然我马上就以小学老师的耐心讲解:
∨-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
当然上面的那个
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)然后两种情况模式匹配(Haskell 爱好者们肯定知道,ES6 和 Kotlin 说不定也知道),第一种是匹配
∨-elim pr _ (∨-intro₀ p) = pr p
∨-elim _ qr (∨-intro₁ q) = qr q
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,当然我比较菜所以就讲不好。算了,总觉得可能... 即使不一定完全正确,也是有价值的。你们有心情学了就好。
结束。
Wikipedia
全称量化
在谓词逻辑中,全称命题是对论域内所有成员的性质或关系的论断结果的陈述。在符号逻辑中,全称量词∀是用来指示全称量化的符号。
duangsuse::Echo
#PLT #Learn To #Proof 我也是刚刚注意到 (p -> q) 是一个单独的命题... 描述的是『由命题 p 成立可以推导出命题 q 成立』(p 『蕴含』 q) 命题 (p -> a) -> (q -> a) -> (p ∨ q -> a) 不一定要 p 和 v 都成立才成立... 可惜我现在才看得懂 写成 Agda 代码就是(基本是抄的,这里说了,所以不要喷我拿别人的代码『装饰』我自己的技能栈,至于前端和 PHP、JavaEE 系后端那一套我后来自会学不消吐槽) data _∨_ (P…
This media is not supported in your browser
VIEW IN TELEGRAM
Forwarded from GitHub
🔨 1 new commit to MiPushTester:canary:
54fdfd3: refactor(app): use Kotlin
Signed-off-by: Trumeet <17158086+Trumeet@users.noreply.github.com> by Yuuta
54fdfd3: refactor(app): use Kotlin
Signed-off-by: Trumeet <17158086+Trumeet@users.noreply.github.com> by Yuuta
Forwarded from Yuuta 🎀 | clrd enroute
一晚上 + 一上午,搞定 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 写错的问题和
当然因为软件许可证的原因 Ant Design 无需为此负责,但这的确是不良实践,实在是不推荐的做法,作为一个模板库设计者主要还是确保辅助软件的功能,功能性的东西上面彩蛋是有点过分。
如果 Ant Design 这种前端平台要加彩蛋的话,推荐还是在诸如开发工具方面,不涉及最终用户的地方加,这样大家都是工程师有话好说。不要强行捆绑给所有使用自己的项目圣诞节彩蛋。
还有被吐槽的 Merry Chris[t]mas 写错的问题和
[title="Ho Ho Ho!"] 的问题。总的来说我觉得这是 Ant Design 自己的锅,因为圣诞彩蛋不应该这么具有入侵性,弄得人家升级以后完全不知道会出现这种情况就很蒙蔽。当然因为软件许可证的原因 Ant Design 无需为此负责,但这的确是不良实践,实在是不推荐的做法,作为一个模板库设计者主要还是确保辅助软件的功能,功能性的东西上面彩蛋是有点过分。
如果 Ant Design 这种前端平台要加彩蛋的话,推荐还是在诸如开发工具方面,不涉及最终用户的地方加,这样大家都是工程师有话好说。不要强行捆绑给所有使用自己的项目圣诞节彩蛋。
Forwarded from 羽毛的小白板
对「彩蛋」两字还是加引号为好
duangsuse::Echo
不是这样的,大概就是 Ant Design 这个前端开发平台的人弄了个圣诞节”彩蛋“,让圣诞节来临时所有默认的 button 风格都会改变为有圣诞积雪 overlay 的版本。遭致程序员们所认为的『未定义布局』 还有被吐槽的 Merry Chris[t]mas 写错的问题和 [title="Ho Ho Ho!"] 的问题。总的来说我觉得这是 Ant Design 自己的锅,因为圣诞彩蛋不应该这么具有入侵性,弄得人家升级以后完全不知道会出现这种情况就很蒙蔽。 当然因为软件许可证的原因 Ant Design…
不过我作为 #Backend 看这些 #frontend 的东西也的确有点狗拿耗子的意思了,我平时都是做后端的,后端总的来说素质要求比较高,这类喜感的事件、讨论和笔伐出现的一般比较少。当年末大戏看对我来说也无所谓,因为我目前不主要是做这类事情的。
总的来说... 我就是觉得 Ant Design 的设计者『们!』必须认识到自己的东西的确有很多人在用啊?设身处地的为用户使用情景着想,才不会捅出这种篓子... Xmas 拼错也就算了,AntDesign 在国外也有应用... 现在还真有点自毁招牌的意思了,比较可惜...
后来我又去了解了一下,开始加彩蛋的人提交相关带码时说已经做好了被骂的准备,大概就是刻意的鄙视一下对非蚂蚁金服产品使用 AntDesign 的人了?可为什么要做成这种形式(开源并作为开发框架包装发布)呢?和 OpenJDK 一样作为『技术研究』之用?
总的来说... 我就是觉得 Ant Design 的设计者『们!』必须认识到自己的东西的确有很多人在用啊?设身处地的为用户使用情景着想,才不会捅出这种篓子... Xmas 拼错也就算了,AntDesign 在国外也有应用... 现在还真有点自毁招牌的意思了,比较可惜...
后来我又去了解了一下,开始加彩蛋的人提交相关带码时说已经做好了被骂的准备,大概就是刻意的鄙视一下对非蚂蚁金服产品使用 AntDesign 的人了?可为什么要做成这种形式(开源并作为开发框架包装发布)呢?和 OpenJDK 一样作为『技术研究』之用?
GitHub
🔨 1 new commit to MiPushTester:canary: 54fdfd3: refactor(app): use Kotlin Signed-off-by: Trumeet <17158086+Trumeet@users.noreply.github.com> by Yuuta
Yuuta 重写的代码我看了,都还好。略微使用了一些 Kotlin 额外的特性,但主要还是语法糖之类的
这里真的是服了国中生的精力,这么长的代码也写得。怀念初中的时候哈?(
推荐使用 辅助函数 来使诸如
duangsuse 自己不是很清楚这种计算的话有什么好的途径可以优化,不过的确可以让逻辑直接一点:
关键字参数
使用
然后如果觉得用
如果
Kotlin 这方面(静态分析)比 Java 8 好多了
如果不能这么做的话(比如没有这个
(哦好像不是 Java API,或许现在这样 Proguard shrink 掉不需要的方法后 Dex 体积会小一些
Kotlin 推荐的就是 less-boilerplate,所以大家编程实践的时候也最好放开思维,尽可能少点余赘重复、平铺直叙的代码(但也不要让自己的代码充满魔法,也不要滥用特性,刚刚好,这个尺度需要掌控),利用 Kotlin 的丰富特性把业务代码写得更自然一些,多定义几个辅助函数又有何不可。
Kotlin 方面推荐冰冰的博文们,因为我目前好像只认识他一个主要写 Kotlin 的,他的 Kotlin 开源项目也推荐看一下,如果喜欢算法的话也可以看看他的 ice1000/algor4j
btw. 这里 有篇 C++ 实现
The Rustonomicon 书上也有讲如何实现
C++ 那些东西啊... 高大上,C 系语言的指针操作我还是略懂。C++ 平时的 Iterator 模式也基本了解所以这代码还是看得懂的,但是没有时间看。
对于嵌入式单片计算机来说,一般都是用直接汇编或者比较老的 C (比如 K&R 时期的 C,或者 C89 之类的),编译优化几乎没有,还不如直接上 ProgrammableLogicalArray(PLA) 和 Verilog HDL 呢...
不过 RISC 机器指令都比较小,MCU 系的机器寄存器集合也很小,所以说有大佬可以二进制编辑器手写机器代码也不是不可能 hhh 死记硬背指令寄存器标号可以
最后就是 Kotlin 的重写可以再开一个分支,决定好后来再不再合并到 master
最后就是重写的话可以分到几个 commit 里,一个文件一个文件的重写,毕竟 Java 和 Kotlin 是 100% Interop 的
当然最后(是对那些想喷我的人来说,因为我最近有点神经质... 或者说是有点点被害妄想之类的不安,总是觉得像是要被喷,而且还是被 Android 开发者什么的喷成天讲一些歪门邪道的东西,其实自己什么都不懂,学不会什么 Fragment、Navigation 什么的东西,然后以后就没人要...)
我想说不要拿什么没有作品之类的来喷我,我还高二呢... 一周半天的假期,哪里有时间来弄这么大的工程...
那那些所谓的经验之谈自然也无从谈起了。平时只好看书。 #review #code #Android #Kotlin
这里真的是服了国中生的精力,这么长的代码也写得。怀念初中的时候哈?(
推荐使用 辅助函数 来使诸如
if (startHour == 0 &&这样的逻辑更清晰一些,不了解布尔代数的 duangsuse 如是说
startMinute == 0 &&
endHour == 0 &&
endMinute == 0) {
alwaysStatus = getString(R.string.accept_time_card_current_never)
}
duangsuse 自己不是很清楚这种计算的话有什么好的途径可以优化,不过的确可以让逻辑直接一点:
fun IntArray.allZeros() = this.all { x -> x == 0 }
if (intArrayOf(startHour, startMinute, endHour, endMinute).allZeros())
alwaysStatus = getString(R.string.accept_time_card_current_never)
Kotlin 自己也有内部的 delegation 模式支持,Observable 不知道有没有专门的 Kotlin 适配关键字参数
reformat(from = 0, to = 5, flags = "rr+") 这种也可以用一下 if (fileUri == null || !zipFile.exists()) {
throw NullPointerException()
}
这种 Kotlin 里面是有专门的语法支持的,并且不推荐,顺便推荐让 Kotlin 注册这个异常 @Throws(...)
这个逻辑实现是『无论 fileUri 为空还是 zipFile 文件不存在都抛出 NPE』,在这里等价的代码,当然这看起来就有点魔法了,适合声明式编程风格而非表述式一些 fileUri?.run { if (!zipFile.exists()) return } null!!
holder.checkBox.setOnClickListener(object : View.OnClickListener {
这种 好像 SAM Lambda 语法糖里就已经廊括了,不需要匿名内部类表示了,直接 Lambda Expression 就可以了 private val lock = Any()
这种,Kotlin 推荐使用并发工具而不是 Java 内部的 synchronized 来实现线程同步,所以最好还是再考虑一下怎么安排同步问题,要不然推荐把 Any() 换成 Object(),Kotlin 的 Any 类根本没有涉及到对锁的考虑使用
Object 类更容易明确用来同步的意图一些 if (mGetTopicListCall != null) {
(mGetTopicListCall as Call<MutableList<Topic>>).cancel()
mGetTopicListCall = null
}
这种,首先尽可能使用 lateinit val 或者自己弄的 Option(Either) 类型,就可空值来说我觉得其实也算是要尽可能避免的,必要的话然后如果觉得用
null 来指示程序分支走向更好的话,可以不用特别的加 as Call<MutableList<Topic>>,Kotlin 的程序流程分析会进行智能转型的(smart casting)如果
mGetTopicListCall为空,
mGetTopicListCall.cancel()就压根不会被执行,所以手动
as 转型可以认为是不需要的,因为执行到这里(if 里的基本块)mGetTopicListCall就肯定不为空
Kotlin 这方面(静态分析)比 Java 8 好多了
如果不能这么做的话(比如没有这个
if)那就可以用『null safe call』mGetTopicListCall
?.cancel() 或者 『non-null asserted call』mGetTopicListCall
!!.cancel()
val list = Stream.of(originalList)这种,Kotlin 自己有
.peek(object : Consumer<Topic> {
override fun accept(topic: Topic?) {
topic!!.subscribed = (localSubscribedTopics.contains(topic.id))
}
})
.collect(Collectors.toList())
Collection API 的,可以直接替换了,Android 上不知道有没有这个 Java API(哦好像不是 Java API,或许现在这样 Proguard shrink 掉不需要的方法后 Dex 体积会小一些
Kotlin 推荐的就是 less-boilerplate,所以大家编程实践的时候也最好放开思维,尽可能少点余赘重复、平铺直叙的代码(但也不要让自己的代码充满魔法,也不要滥用特性,刚刚好,这个尺度需要掌控),利用 Kotlin 的丰富特性把业务代码写得更自然一些,多定义几个辅助函数又有何不可。
Kotlin 方面推荐冰冰的博文们,因为我目前好像只认识他一个主要写 Kotlin 的,他的 Kotlin 开源项目也推荐看一下,如果喜欢算法的话也可以看看他的 ice1000/algor4j
btw. 这里 有篇 C++ 实现
Vector(变长索引列表容器)的代码The Rustonomicon 书上也有讲如何实现
Vector 容器,看来最近是得好好学习一下这类基础的后端知识了。我现在还太菜。C++ 那些东西啊... 高大上,C 系语言的指针操作我还是略懂。C++ 平时的 Iterator 模式也基本了解所以这代码还是看得懂的,但是没有时间看。
对于嵌入式单片计算机来说,一般都是用直接汇编或者比较老的 C (比如 K&R 时期的 C,或者 C89 之类的),编译优化几乎没有,还不如直接上 ProgrammableLogicalArray(PLA) 和 Verilog HDL 呢...
不过 RISC 机器指令都比较小,MCU 系的机器寄存器集合也很小,所以说有大佬可以二进制编辑器手写机器代码也不是不可能 hhh 死记硬背指令寄存器标号可以
最后就是 Kotlin 的重写可以再开一个分支,决定好后来再不再合并到 master
最后就是重写的话可以分到几个 commit 里,一个文件一个文件的重写,毕竟 Java 和 Kotlin 是 100% Interop 的
当然最后(是对那些想喷我的人来说,因为我最近有点神经质... 或者说是有点点被害妄想之类的不安,总是觉得像是要被喷,而且还是被 Android 开发者什么的喷成天讲一些歪门邪道的东西,其实自己什么都不懂,学不会什么 Fragment、Navigation 什么的东西,然后以后就没人要...)
我想说不要拿什么没有作品之类的来喷我,我还高二呢... 一周半天的假期,哪里有时间来弄这么大的工程...
那那些所谓的经验之谈自然也无从谈起了。平时只好看书。 #review #code #Android #Kotlin
GitHub
refactor(app): use Kotlin · Trumeet/MiPushTester@54fdfd3
Signed-off-by: Trumeet