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

技术相干订阅~
另外有 throws 闲杂频道 @dsuset
转载频道 @dsusep
极小可能会有批评zf的消息 如有不适可退出
suse小站(面向运气编程): https://WOJS.org/#/
Download Telegram
Forwarded from AlPlank (Al Pt)
Telegram 所占的空间的确比QQ小很多,但是乘以三之后,就差不多了。

(Android 端三大主流客户端之坑)
新功能出现时,只有 offical 能抢先用。
管理员希望查看匿名版聊中某条信息时,只能使用 X。
希望便捷的分类,无限量星标/收藏 sticker 时,plus又更胜一筹了。

你们能不能整合一下?至少…共用一个 tdlib?

#胡思乱想
#public
dnaugsuz
开始的时候我是误会了 ^ 和 | 的含义,以为 ^ (输入流起始模式, [pattern])一定会匹配的(其实还真不一定... 我真的是糊涂了),所以说 \. 这个单独的 "." 有没有匹配都一样 其实这个正则表达式就是匹配这种模式: 1. <字符串起始> "sspai.com" <字符串结束> 2. ".sspai.com" <字符串结束> 但是我脑子一热就直接说等价 1. <字符串起始> [ "." ] "sspai.com" <字符串结束> 其中,尖括号 <> 包裹的文本是必须出现的文本(…
duangsuse 想着再复习一下使用 #Haskell 编写递归算法

递归算法是相当有用的算法,真的

比如说,你想遍历一个二维矩阵:

for (i in 0..m)
for (j in 0..n)
print(Matrix[i][j])

可是要遍历一个 n 维矩阵,打印出所有项就不行了,虽然不一定是循环做不到的(也可以利用类似 LIFO 栈的结构,是吧,对深度优先搜索、广度优先搜索也是一个道理)

fun List.printMatrix(int depth)
if (this.size = 0) return
if (depth = 0) this.forEach(::print).also { println() }
for (i0 in 0..this.size)
i0.printMatrix(depth - 1)

这样,有一二维矩阵:

[[0,1],[2,3],[4,5]]
首先 this = $0; depth = 1; size = 3

for (i0 in 0..3)
[0,1].printMatrix(0)
[2,3].printMatrix(0)
[4,5].printMatrix(0)

再有一三维矩阵

[
[[0, 1], [2, 3], [4, 5]],
[[2, 3], [4, 5], [6, 7]]
]

for (i0 in 0..2) // depth = 2
for (i0' in 0..3) // d = 1
// print tip matrix
for (i0'' in 0..2)
for (i0'' in 0..2)
for (i0'' in 0..2)
for (i0' in 0..3) // d = 1
// print tip matrix
for (i0'' in 0..2)
for (i0'' in 0..2)
for (i0'' in 0..2)

递归下去,这就完了。 🤔

考虑到新手友好性不写 Haskell,我不会 Scala 也不熟悉 Clojure

我打算顺便练习一下使用 Text.ParserCombinators.ReadP 来解析文本结构,得出 datatype

就这样,输出所有组合:

(a|b)c

输出列表: ["ac", "bc"]

c(d|e)

输出列表:["cd", "ce"]

a(b|c)de(f|g)h

输出列表
[
"abdefh",
"abdegh",
"acdefh",
"acdegh"
]

Haskell 真的是一门不错的语言,如果可以的话,它真的最好诠释了 JetBrains MPS 的『面向语言编程』 — 最直白的表示形式给你最好的直觉

比如说 foldr 操作符

foldr :: (a -> b -> b) -> b -> ([a] -> [b])
foldr f v [] = v
foldr f v (x : xs) = f x (foldr f v xs)

::
意味着『has type』 #Learn
() 就是普通的『数学上的括号』,它改变操作符结合性,使得 (1 + 1) * 2 可以等于 4 (而不是 1+(1*2) = 3
-> 是 Haskell 的函数类型中缀构造器,它创造一个一元函数(单输入单输出,可以进行柯里化方便函数式箭头操作)

比如,Java 里的 Integer.parseInt,用上面的表达方法可以是:

Integer.parseInt :: java.lang.String -> java.lang.Integer

那么 (a -> b -> b) 就是说一个函数,接受一个 a 类型的参数,返回一个函数,它接受一个 b 类型的参数,返回一个 b 类型的实例(左结合)
a b 是 HM 的类型变量,类似 Jawa 这种幼儿园语言的泛型

foldr :: (a -> b -> b) -> b -> ([a] -> [b])

就是说 foldr 是一个:
接受 ((a -> b) -> b) 这一函数类型,返回
接受 b 类型,返回
接受 List a 类型,返回 List b 类型实例的函数
的函数
的函数

用 Kotlin 就是

fun <A, B> foldr(f: (A) -> (B) -> B, v: B): (List<A>) -> List<B>

可见 Type variable 和泛化类型还是很相似的(

当然,GHC 自带类型推导算法,可以推导出 foldr 的类型(Haskell 使用的是 Hindley-Milner 类型系统,可以使用一种 unification 『一致化』算法进行类型推导,我看到了一篇被人抄下来的论文,如果我以后有机会就会实现并讲一下...),后面的定义也很直觉

foldr f v [] = v
foldr f v (x : xs) = f x (foldr f v xs)

想象一下,这就是一个『插入』操作符,

foldr (+) 0 [1, 2, 3]
= foldr (\x y -> x + y) 0 (1 : 2 : 3 : [])
{- 如果处理列表是空(Nil 构造器),则结果是 v(而 f 的第一个参数就是 x,列表不为空则肯定有一个 x) -}
{- 每次递归都插入一个 f x,f 的第二个参数则要等下一个 xs tail list 的递归完成,最后则够造出类似这样的表达式 -}
= f 1 (f 2 (f 3 (f v)))

\ 是 Haskell 里的 lambda,一个 Lexical Scoping 的匿名函数

List 可以这么理解

data List' a = Cons a (List' a) | Nil

或者说

data List a where
Cons :: a -> List a -> List a
Nil :: List a

infixl 3 :->
(:) = Cons
[] = Nil

多看看就理解了... 虽然还有很多不说🤔
#ce #huawei #China 我支持,因为我之前听说过华为开发过 x86 机子的 ARM -> x86 翻译器(据说),用以支持 x86 机器上的 ARM + AndroidABI JNI 代码运行,总的来说,我还是相信华为作为中国大通讯企业的技术水平的,也衷心希望华为后面的技术人员能不断突破极限,早日造出真正 PC/智能手机能用的微处理器

至于前面的(比如,EMUI 的工程人员),我觉得,EMUI 的 bootanimation 二进制文件真的是无法优化了吗?我觉得还不如 flyme 的流畅

动画做得还不错,内定应用和服务感觉勉强(虽然有些功能也有点简陋、有些属于得之无味弃之可惜,比如蛤为音乐 vs 网易云音乐)

而且那个机子配置(v8 青春版)真的不算低...
Forwarded from LetITFly 让技术飞
(消费者/最终用户角度)你看好华为的编译器(编译 Android 软件的工具)吗
Anonymous Poll
10%
看好
50%
不看好
40%
观望
#Go #Qt #Cplusplus 🤔 让我想到了 int main(int argc, char **argv) { QApplication app(argc, argv); return app.exec(); }
Forwarded from Genteure's Window
./app/tool/creator/templete.go
有时候想到一些莫名崇拜水果 #apple 的人,再想到 Steve Jobs 创造 #GUI 这个被人津津乐道的故事,我觉得虽然乔布斯很伟大,但不应该说发明了 GUI 的灵感很不得了,因为早些时候还没有麦金塔就有了各种有『GUI』的 Video game,或者至少,有 M$ 的 edit 程序(TUI 程序,除了没有窗口概念,其他都很类似了,这很容易理解,因为文本编辑器看起来就该这样交互(不过 vi 却不是这样的,大概是风格不同吧... 但是,文本编辑器这种东西对字符终端的空间利用方式已经可以启发类似 Markdown、GUI、HTML 这些东西了),再稍微改造一点 GUI 就出现了,当时监视器、键盘都有了,这不是多么不容易的灵感),我觉得 GUI 的创立即使没有乔布斯的打算也只是迟早的事情,不如设计出魔方更有难度
Forwarded from Genteure's Window
https://t.me/haneko_daily/1368
我一阵子之前做过测试,设计挺美好,实际效果挺一般。
在 Ubuntu Bash XShell 下效果如图
印象中我本地 Windows 10 PowerShell 也有问题,但是记不清具体是什么问题了。
.... #Docker 本身就不是多么不得了的,比起之前那些 Linux LiveCD 打包工具,只是补了个缺口而已... 也有人用几百行 Bash "Bocker" 实现了它的主要功能... 它的 DSL 几乎也可以说就是个象征性的 DSL 而已,没啥实际功能,也很久没有引入能被广泛使用的新概念... 算是『容器化』理念的,,,, 呃,,,
Forwarded from METO 的涂鸦板
🐳 Docker Hub 数据库被入侵

根据 Docker 官方邮件,4 月 25 日发现 Docker Hub 数据库被短暂非法访问,大约泄露了 190,000 (5%) 个帐户的敏感数据,其中包括用户名、散列密码、GitHub 仓库 Token 等。
Docker Hub 建议与其它网站共用密码的用户尽早更改密码;对于 autobuild 用户,平台已经撤销所有相关 Token,需要用户重新进行授权关联。
#security #bilibili emmm... #China 🌚 吃瓜。
Forwarded from 小娜晚报 (XnzKKi RGB)
bilibili后台工程源码被开源,各种吃瓜🤔
emmm
Forwarded from Android Repository (『 ⴼITⵠLØ 』)
bootanimation_androidQ.zip
2.3 MB
Pixel Bootanimation Android Q

⚡️Bootanimation of the Android Q from Beta 2

Follow: @AndroidRepo
另外你也可以使用 Java 8 的 Lambda 语法糖,看起来这是个 SAM(Single Abstract Method) 开放类,可以这么写

private static final Migration MIGRATION = new Migration(12, 13);

.... 好吧是我看错了,好像不能.... (刚才准备发 Yuuta 的,可是发现是自己错的)
Forwarded from YuutaW 鱼塔
哪个大佬帮忙写下 SQLite 升级鸭,可以给 Scheme
#Java 我好绝望啊,Java 又得重新学了,我容易吗我... 😭

https://github.com/antlr/grammars-v4/blob/master/java8/Java8.g4#L1042

Jawa 8 啥时候多了这种语法,我怎么就不知道呢?

public ResourceTable.Package parsePackage(final ResourceTable table) throws IOException {
return table.new Package() {...};


methodBody : block| ';'
block : '{' blockStatements? '}';
blockStatements : blockStatement+;
blockStatement : ... | statement;
statement : ... | returnStatement;
returnStatement : 'return' expression? ';';
statementExpression : ... | classInstanceCreationExpression;
classInstanceCreationExpression : ... | expressionName '.' 'new' typeArguments? annotation* Identifier typeArgumentsOrDiamond? '(' argumentList? ')' classBody?

matches
table.new Package() {...}
expressionName="table"
'.' 'new'
typeArguments=null annotation=[]
Identifier="Package"
typeArgumentsOrDiamond=null
'('
argumentList?=Some([])
')'
classBody?
=Some(...)

Qualified class instance creation expressions begin with a Primary expression or an ExpressionName.
A
qualified class instance creation expression enables the creation of instances of inner member classes and their anonymous subclasses.

看来我不够了解 Java,垃圾 duangsuse... 🌶🐔

为什么...

1.3: Plain Old Java (2000)
1.4: assert keyword (2002)

5: Autoboxing, enum, generics (2004)
6: @Override in interfaces (2006)
7: ARM, Diamond, multi-catch (2011)

8: Lambda and Type annotations (2013)
9: Modules, private fields in interfaces (2017)

10: Local variable inference (2018)
11: Local variable syntax for lambda parameters (2018)


啥时候 Java 8 我认不得
原来世界上最合格的 #Java 程序员是 James 老爹,我都不知道 Java 8 啥时候支持 new List(oldid = id) 这种了... 我只知 Lambda