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

技术相干订阅~
另外有 throws 闲杂频道 @dsuset
转载频道 @dsusep
极小可能会有批评zf的消息 如有不适可退出
suse小站(面向运气编程): https://WOJS.org/#/
Download Telegram
duangsuse::Echo
#bin 然后为了证明我不比 drakeet 差,只是缺少拿来实践的时间, 我分析一下这篇文章《5分钟学会十进制转换成二进制的快速口算方法 & Java输出二进制的代码》,然后就睡觉。 当然,至于 Android 那一套,比如异步、Timer、MessageDriven、Android XML、Android Widgets、Resources、Android Gradle Build 集成、库打包、封装、Android Layouts、Views、Paint、Android Layout Animat…
这里还有一个 "bitselector" 的问题,我待会更新... #fix #bin

irb(main):001:0> 0x01000000.to_s(2).size
=> 25

irb(main):002:0> 0x80_00_00_00.to_s(2).size
=> 32

记得上面的表吗?

0b0001 = 2^0 = 0x1
0b0010 = 2^1 = 0x2
0b0100 = 2^2 = 0x4
0b1000 = 2^3 = 0x8

然后可以直接对应到 16 进制的,每 4 位 2 进制都可以对应到一位 16 进制

Math.log2(16) #=> 4.0

没有影响到程序的正确性(因为 C 的 if (...) 真值就是 0 false 其他都是 true,这里按位和 (&) 运算就算是使用 0xffffffff 也没问题,只要不是 0x0)
但其实是不对的,我之前以为 16 进制不真正能做 2 进制的简记法,现在知道了...
#fix #Java 上次本频道和频道主 @duangsuse 大幅误人子弟,实在是令人... 呃,我以后多编程、多写文档和设计草稿、多做算法设计,少直接 Telegram 上说话,少误人子弟了... 🤐
Forwarded from dnaugsuz
对不起,误人子弟了(
Forwarded from dnaugsuz
我到学校的路上就思量着我写的一些东西,发现不对,好丢脸(
Forwarded from dnaugsuz
开始的时候我是误会了 ^| 的含义,以为 ^ (输入流起始模式, [pattern])一定会匹配的(其实还真不一定... 我真的是糊涂了),所以说 \. 这个单独的 "." 有没有匹配都一样

其实这个正则表达式就是匹配这种模式:

1. <字符串起始> "sspai.com" <字符串结束>
2. ".sspai.com" <字符串结束>

但是我脑子一热就直接说等价

1. <字符串起始> [ "." ] "sspai.com" <字符串结束>

其中,尖括号 <> 包裹的文本是必须出现的文本(按其内容字面含义理解),空格无语义、 "" 包裹的是字符串,若输入内容匹配则匹配, [] 包裹的是可选内容。

我知道这很智障,但是... 当时要上学了没时间就出错了... 类似的还有我把 Java 7 的泛型写错了... 都会待会改过来

当然匹配过程也可以理解如下(如果你想知道的话,虽然用于从序列提取结构的解析器也未必真的是非常简单的内容,虽然也没有刻意专门保存流位置允许重新匹配分支的)

static final boolean _match(final String input) {
// (^|\.)sspai.com$

// case ^sspai.com$
if (input == "sspai.com")
return true;

final StringStream s = new StringStream(input);

// case \.sspai.com$ otherwise
retry:
switch (s.next()) {
case '.':
if (s.startsWith("sspai.com")) // "." "sspai.com"
if (s.isEos()) return true; // $
default: goto retry;
}
return false;
}

static final boolean match(final String input) {
try { return _match(input); }
catch (EOFException ignored) { return false; }
}
#Android 说到这里, duangsuse 这周啥都没学(暂时有一段时间我可能『停止学习』),给 GeekApk 设计了很棒的东西,有一些概念了,但是具体算法和面向对象分析设计依然在准备中,其中就包括一个 GeekApk 3 时打算加入的 ApkPool 服务,它就可以利用 MultiMap、CountedHashSet、LineDiff/ByteDiff、Class Program Logic Idenity 等数据结构和算法实现对不同应用使用的 Dex 代码(能够利用 PLI 和自然语言分词算法进行自动反混淆和自动类名选择处理)、大型 native library file(如果 BuildID 没问题的话,指不是应用项目本身根据源代码编译来的库文件)、raw file、resource file、resources 以及修订号版本之间的完全记录和差分压缩(增加、删除、修改、重命名),这意味着如果我能设计出类似的算法,再后来 GeekApk 将拥有又一个不错的新技术(虽然已经有相当多了),并且能够将用户能直接引用查看的信息量提到最高(完全解析应用清单和资源包,不仅仅是一个权限列表一个包名、应用名、版本号、修订、hash checksum、size、minSdkVersion、signature、语言支持什么的了,还有更多!还支持使用 PPQL 查询软件包、统计数据!),把下载的数据流量降到最低(因为如果 ApkPool 有某些软件包,就可以使用策略下载功能自动复用一组下载任务里所有能够复用的数据文件了)
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