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

技术相干订阅~
另外有 throws 闲杂频道 @dsuset
转载频道 @dsusep
极小可能会有批评zf的消息 如有不适可退出
suse小站(面向运气编程): https://WOJS.org/#/
Download 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
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 写错的问题和 [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 一样作为『技术研究』之用?
Forwarded from Richard Yu
Telegram 这里也开始下雪了。
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 额外的特性,但主要还是语法糖之类的
这里真的是服了国中生的精力,这么长的代码也写得。怀念初中的时候哈?(

推荐使用 辅助函数 来使诸如

            if (startHour == 0 &&
startMinute == 0 &&
endHour == 0 &&
endMinute == 0) {
alwaysStatus = getString(R.string.accept_time_card_current_never)
}

这样的逻辑更清晰一些,不了解布尔代数的 duangsuse 如是说
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 或者自己弄的 OptionEither) 类型,就可空值来说我觉得其实也算是要尽可能避免的,必要的话
然后如果觉得用 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)
.peek(object : Consumer<Topic> {
override fun accept(topic: Topic?) {
topic!!.subscribed = (localSubscribedTopics.contains(topic.id))
}
})
.collect(Collectors.toList())

这种,Kotlin 自己有 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
Forwarded from 永久封存 | Yuuta 台 | 😷 #Pray4Wuhan (Yuuta ● #wontfix)
Forwarded from Oh CN ZZ
李先生使用的高级加密被神必人使用李宗阳变形字典一瞬干烂,,,
#tech 我想我 2018 年最大的成就就是知道了自己有多菜,然后就是了解了一下现在的 x86 物理机,和一些基础的函数式理论(

duangsuse | ¯\_(ツ)_/¯ |学渣 ∈ [E²PROM, 含幺半群)

大概就是说这个( #yearPassed #recommended

E^2 PROM 是说 EEPROM,嵌入式领域名词,『电可擦除』可编程只读存储器
如果是 EPROM,可能就必须拿紫外线照射清除电荷来擦除存储器了
有些 EEPROM 还可以以块为单位进行擦除?


含幺半群
是说 Monoid(半群 Semigroup 的扩充),函数式编程名词,含有『单元(也叫“单子”)/幺元(不动点)』的半群
如果一个范畴(比如字符串们)符合『封闭律(closure)』和『结合律(associative)』,就可以被称为半群
如果一个半群符合『同一律(identity)』,就可以被称为含幺半群

封闭律是说对于某个范畴,如果有态射(函数式名词『态射』)
f: B -> Cg: 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) · hf · (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 反编译
黑历史黑历史了