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
Forwarded from 永久封存 | Yuuta 台 | 😷 #Pray4Wuhan (Yuuta ● #wontfix)
blog.yuuta.moe
2018 年度总结
这是一篇从前博客迁移来的文章。
#tech 我想我 2018 年最大的成就就是知道了自己有多菜,然后就是了解了一下现在的 x86 物理机,和一些基础的函数式理论(
(
如果是 EPROM,可能就必须拿紫外线照射清除电荷来擦除存储器了
有些 EEPROM 还可以以块为单位进行擦除?
(
如果一个范畴(比如字符串们)符合『封闭律(closure)』和『结合律(associative)』,就可以被称为半群
如果一个半群符合『同一律(identity)』,就可以被称为含幺半群
封闭律是说对于某个范畴,如果有态射(函数式名词『态射』)
至于为什么参数是以箭头分割的,是 Currying (柯里化)的结果,不过这个方法其实是 Moses Schönfinkel 发明的,因为开始的时候 Lambda Calculus (lambda 演算)的匿名函数都是一元的,只有一个函数不能多参数
于是就弄出了柯里化,比如说
其实就是说
Haskell Brooks Curry 最大的贡献可能是搞出了个 Y Combinator,相当出名的不动点组合子,但其实你们一学就会发现这些东西其实没有那么高大上,我觉得这类还是比较 trivial 的,不如数学证明多烧脑
理论上的东西开始理解的肯定是烧脑,但后来其实感觉真的不如数学,不过我不是说计算机科学怎么怎么地,显然我还没有那个资本。
这个
数学上加法运算符也有结合律,
一般被定义为
duangsuse | ¯\_(ツ)_/¯ |学渣 ∈ [E²PROM, 含幺半群)大概就是说这个( #yearPassed #recommended
(
E^2 PROM 是说 EEPROM,嵌入式领域名词,『电可擦除』可编程只读存储器如果是 EPROM,可能就必须拿紫外线照射清除电荷来擦除存储器了
有些 EEPROM 还可以以块为单位进行擦除?
(
含幺半群是说 Monoid(半群 Semigroup 的扩充),函数式编程名词,含有『单元(也叫“单子”)/幺元(不动点)』的半群
如果一个范畴(比如字符串们)符合『封闭律(closure)』和『结合律(associative)』,就可以被称为半群
如果一个半群符合『同一律(identity)』,就可以被称为含幺半群
封闭律是说对于某个范畴,如果有态射(函数式名词『态射』)
f: B -> C 和 g: A -> B ,就一定有态射 h = f · g
h :: A -> C它允许我们『组合(compose)』函数来构成我们的逻辑。所以是必须的
compose :: (b -> c) -> (a -> b) -> (a -> c)里
compose f g = \x -> f g x
compose
f 是一个态射,类型签名为 (b -> c),g 也是函数,类型为 (a -> b),最后它返回一个函数 (a -> c)
f 输入一个 b 类型可以拿到一个 c 类型,g 输入 a 类型拿到 b 类型,最后我们要由 a 类型拿到 c 类型,这个函数的实现((f (g x)))是有意义的至于为什么参数是以箭头分割的,是 Currying (柯里化)的结果,不过这个方法其实是 Moses Schönfinkel 发明的,因为开始的时候 Lambda Calculus (lambda 演算)的匿名函数都是一元的,只有一个函数不能多参数
于是就弄出了柯里化,比如说
(+) 这个 Operator 操作符(+) :: Int -> Int -> Int (Kotlin 里就是 (Int) -> (Int) -> Int)其实就是说
λa b. (prim-add a b) 也即 λa. λb. (prim-add a b)
不过这样就有一个好,因为我们可以 add2 = (+) 2 了Haskell Brooks Curry 最大的贡献可能是搞出了个 Y Combinator,相当出名的不动点组合子,但其实你们一学就会发现这些东西其实没有那么高大上,我觉得这类还是比较 trivial 的,不如数学证明多烧脑
理论上的东西开始理解的肯定是烧脑,但后来其实感觉真的不如数学,不过我不是说计算机科学怎么怎么地,显然我还没有那个资本。
这个
compose 用来组合两个单参数函数(也叫一“元”函数) lambda 们,用 scheme 写就是(define compose结合律就是说对于某个范畴,
(lambda (f g)
(lambda (x) (f (g x)))))
((compose display (lambda (x) (+ x 1))) 1)
(f · g) · h 和 f · (g · h) 是等价的,就可以随便组合不会出现线性结合不等价问题数学上加法运算符也有结合律,
1 + 2 + 3 ≡ 1 + (2 + 3)
不动点(fixed point)就是说对于范畴的所有对象,都存在着一个态射 i: A -> A 使 i(a) ≡ a (不发生变化即为不动点)一般被定义为
id = \x -> x
上面的 \ 都是 Haskell 代码里的表示,用途是表述 Lambda λx. x 等价 \x -> x
喜欢数学的肯定了解这些东西,因为这函数基本都是数学上会有的概念,比如定义域、分段函数(Haskell 的 Guard Pattern)什么的,可以很容易看到定义的不动点Forwarded from 羽毛的小白板
想了想,我 2018 年的最大成就就是弄了个 ES5 的 parser 还有一部分 TS 反编译
duangsuse::Echo
#tech 我想我 2018 年最大的成就就是知道了自己有多菜,然后就是了解了一下现在的 x86 物理机,和一些基础的函数式理论( duangsuse | ¯\_(ツ)_/¯ |学渣 ∈ [E²PROM, 含幺半群) 大概就是说这个( #yearPassed #recommended (E^2 PROM 是说 EEPROM,嵌入式领域名词,『电可擦除』可编程只读存储器 如果是 EPROM,可能就必须拿紫外线照射清除电荷来擦除存储器了 有些 EEPROM 还可以以块为单位进行擦除? ( 含幺半群 是说…
想当年 17 年初的时候我在 @ice1000 面前吹自己『说不定比你们系统管理能力强』的时候,可没这种自知之明(
duangsuse::Echo
想当年 17 年初的时候我在 @ice1000 面前吹自己『说不定比你们系统管理能力强』的时候,可没这种自知之明(
This media is not supported in your browser
VIEW IN TELEGRAM