duangsuse::Echo
719 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 羽毛的小白板
Forwarded from 羽毛的小白板
看了下 Android 的 SparseArray 的实现,似乎和 .Net 的 SortedList<K, V> 没什么区别
🤔 这个星期本来有很多事情需要讲的(主要是技术,而且我想说我要用 imperative 的 Kotlin 写个 BCE 程序,顺便学学写我的第一个矩阵等式求解算法)
可是呢,duangsuse 的身体目前比较糟糕,所以为了健康还是必须 11 点下机的。

但愿一切都好吧。 #life #tech #dev #backend #algorithm
#GitHUb #Kotlin #issue https://github.com/icela/FriceEngine/issues/83

org.frice.anim.scale.SimpleScale 类中的 obj.scale(deltaTime * x, deltaTime * x) 这句后面应该是y吧?

写错了。虽然 Frice 的项目持续集成构建和测试都有做(
(当然冰封现在早就不搞这种事情『计算机图形上的封装』了...)
This media is not supported in your browser
VIEW IN TELEGRAM
#Java #Ruby #Kotlin #Test #Dev
https://docs.cucumber.io/guides/10-minute-tutorial/

一个『类似自然语言』的 Specification Tests 框架:

快速学习一下如何来使用它!(本频道一直引以为豪的是,在其他频道只『给个链接、点个 Star』的时候,本频道会给予大家快速上手讲解)
以下示例基于 Java 8(实际上 Java 1.1 都可以用)

首先,你的直觉要并入这些,以便快速地理解使用方式:

1. 所谓『功能性』软件测试(Behavior-Driven Tests),是因为要确定软件的『某一项功能』是否能正常如预期地工作

此外,还流行以下测试侧面方案:完整验收测试 / (就测试层面而言)黑盒白盒测试 / 兼容性和性能(弹性... 负载... 压力)测试 / 回归测试(验证修复方案是否能用) / Smoke (快速的简单完整功能测试)

2. 这种测试是这样的,你们看看(主要是因为很多人对功能性测试和洋文的直觉不好,我翻译一下):

特性: 更改头像
“我们的用户可以上传自定义头像以取代默认头像”

场景: 普通用户可以更改自己的头像
情况: 这个用户是普通用户
当: 他想更新自己的头像时
那么: 他应该能够成功更新自己的头像

场景: 被我们 Block 的用户不能更改自己的头像
情况: 这个用户是封禁用户
当: 他想更新自己的头像时
那么: 他应该无法成功更新自己的头像

或者说:

Feature: Users can change their avatar
We expect that normal users CAN change their avatar

Scenario: The user is normal user
Given a normal user
When he wants to update his avatar
Then he will able to update his avatar

Scenario: The user is blocked
Given a banned user
When he wants to update his avatar
Then he will not able to update his avatar

类似的测试可能还有很多,比如,被封禁的用户不能更改自己的用户名、不能发布评论...

设想一下,如果我们有这样的软件需要测试,那么,有一种 DSL 来帮助我们把测试写得更好,更具备可读性和可维护性,减少余赘代码,岂不美栽? 🤔

这门 DSL 叫做 Cucumber. (准确的说,叫 Gherkin,它只是 Cucumber 测试框架的一部分)

至于包管理什么的杂七杂八的内容,你们知道那是码农的工作,我们不用管(待会『三声,上声』会『四声,去声』讲)
我们来看看上面的例子该怎么写(伪代码,不准喷不是函数式,函数式什么的我会独立讲,再说工程第一是吧)

import cucumber.api.java.en.Given;
import cucumber.api.java.en.When;
import cucumber.api.java.en.Then;
import static org.junit.Assert.*;

public class Stepdefs:
boolean blocked = false;
Exception gotException;

@Given("a normal user")
fun givenNormalUser() = Unit
@Given("a banned user")
fun givenBannedUser() = { blocked = true }

@When("he wants to update his avatar")
fun askedUpdateAvatar() {
try { UserResource.updateAvatar(UserResource.findUser { it.banned == blocked }.first, Avatar.fromURL("https://example.org/a.png")) }
catch (SecurityException e) { gotException = e }
}

@Then("^he will (.*) to update his avatar$")
fun itChecksUserPermission(String desc) {
when (desc) {
"able" -> assertNull(gotException)
"not able" -> assertNotNull(gotException)
}
}


下面是无聊的码农内容,就是包管理的,虽然这种东西比较 trivial 本身也是码农内容(跑)
mvn archetype:generate 记好了,这些参数
1. archtype 的 Group、ArtifactId、Version
2. 你项目的 Group、AId、Version
3. -DinteractiveMode=false 全自动生成
以上参数全都是 camelCased 的,风格为 Java 的单 dash(-) 前缀。

(相关知识: Maven Coordinate:Group:ArtifactId:[packaging[:classifier]]:Version
记住,G:A:V 就可以吊打很多连 Maven 是啥,用的啥模型都不知道的 Android Dev 了(跑,但这的确是事实,因为实际上 Android 主要还是和 Android API 和 XML / 组件/View 模型什么的杠,有些入门萌新连 Gradle/Groovy/Maven 到底是做什么的都不知道,也不知道 Dependency Scope、Artifact、Tasks 之类的东西,2333333)。

然后在项目目录里 mvn test 就可以运行测试。

上面的 Feature/Scenario/Given/When/Then 语法结构,可以在项目的 Test Resource 下的指定 Java 包里创建,一般放在 src/test/resource/<package>/ 里,必须以 .feature 为后缀名,前缀名随便
而 Tests 的代码,就放在同一个 Java 包的 Stepdefs.java 类里,然后代码上面那样写。

== 搞基一点: 使用 DSL 指定输入数据

别用 Scenario 了。用 Scenario Outline

Scenario Outline
:
Given Arithmetic expression "<expr>"
When I asked the result
Then It should be "<answer>"

Examples:
| 1+1 | 2
| 0*9 | 0
| 0+3 | 3

其他的 matching 上面讲过了,不说了。
我觉得还不错。 +1

剩下的更高端一点的内容呢,我没时间看,算了,给个语法结构目录就跑。

至于中文支持呢,有,这里可以看到,不过具体是怎么实现的呢(我不说最无聊的句构解析器部分,因为的确很无聊)?其实 Runtime 会根据对应平台的 Code Snippet 自己生成相应的实际 API 类编译加载,不过 IDE 用的包我不清楚是哪里生成的,找了很久,没时间管这些。

== FIX: 找了很久我没看到他们用 sun 的 javac API,我又看了一会才知道,这整个就是一代码生成器程序...
This media is not supported in your browser
VIEW IN TELEGRAM
duangsuse::Echo
🤔 Sticker
Telegram 比较不稳定(MTProto Proxy,只有一两个能用的,现在只有一个可以使而且不时爆破...),如果 Telegram 炸了的话我就去 GitHub Issue 上更贴,反正就是更贴到死。

#Learn #CS #dev #PL #Math 下面是我这周想讲/做的,虽然我知道肯定做不完。

1. #Java #Kotlin #dev #Android 开发一个 AOP SharePreference 类帮助库,(虽然现在开始有人用 Sqlite 了,但是对于 Preferences 这种很多时候不需要 Sqlite 的)我希望对于 SharedPreferences 的编辑能更简单一些,只需要一个接口:

@AppProperties(Mode.SHARED_XML)
interface ApplicationStorage {
var name: String = ""
var age: Int = 1
var male: Boolean = true
}

然后当然啦,为什么要依赖注入什么的... 直接这样多好,虽然 OO 一大堆设计模式... 技巧... 还有所谓的架构师... 🤔
不过啦,小点的应用和我这种没啥时间的高二学生来说,根本没有办法花时间嘛...

class App: Activity() {
val storage: ApplicationStorage = StorageProxy.makeInstance<ApplicationStorage>()
}

至于 OOP 编程什么的,高端一点的 OO 技巧比如 Mixin、Proxy、Parametric Polymorphism 什么的... JVM 的 Annotation 们,都不知道啦,以后学嘛。用一个子类型多态。
至于 Kotlin 的 by Proxy 模式,不能用,因为这个是 java.lang.reflect.Proxy 动态生成的 Proxy(它的工作就是拿到你的 interface,然后根据上面的注解生成解释数据,最后 JVM Reflect Proxy 生成一个动态子类实例化给你,然后你可以用返回的对象给 Proxy 发信息,进行程序持久化属性的读写操作)

2. Kotlin Android UI DSL

🤔 因为 duangsuse 不想用 AppCompat 什么的一大坨咕狗娘的吐血推荐。想用自己在网上找的组件(Widget, View)库,和 Android 自己的 view 们。

Kotlin AnkoLayouts 是个好东西,可是我觉得它还是太大了(其实是伪命题,但也未必真的是,因为 Anko 考虑的的确比我多,而且不是完全 Inline 的),不如弄个小点别的结构的慢慢来... 这样也许会合适一些?
(其实就是强迫症,不想引入太多别人的依赖,逃跑)

有时候觉得可以这样描述(求别吐槽我这个,两年前的东西了):

fun mainLayout(): View = makeView {
verticalLayout(INHERIT, INHERIT, BOTTOM) {
text = editText(INHERIT, INHERIT, "textMultiLine") {
textEms = em(10)
textSize = sp(9)
hint = resource<String>(R.string.hint)
gravity = TOP | LEFT
weight = 2
}

horizontalLayout(height = dp(43)) {
style = androidAttribute(Styles.buttonBarStyle)
weight = 0.1

btnOp = button(width = WRAP, text = resource<String>(R.string.ot))
btnAdvanced = button(text = resource<String>(R.string.at))
}
}
}

不准喷(求不喷) QAQ (特别是,请坚决不要吐槽我做不出来什么的,高二半天假的人啊...)

3. 讲一下 Visitor Pattern 和 Object Algebra、Finally Tagless 解决表达式双向扩展问题(Expression Problem)
当然只是使用,Finally Tagless 就和 Hindley-Milner 类型系统 AlgorithmW 类型推导算法、Gaussian-Jordan 消元算法、RankNTypes、Monad、Combinators、Lambda calculus(可能是里面最简单的一个,好吧,如果你算上 Church Encoding 还有一大堆 beta-reductoin, alpha-conversation 外的计算规则和箭头变换,我投降)、Parametric Polymorphism Variance、SumType/Product Type、Dependent Type 归纳法定理证明、范畴论、信号处理一样令人难受

没有那么简单... 即使是工程、工程,也要记忆一大堆,,, 🤔 唉现在活得都不容易啊。

4. 我看了 @YuutaW 酱的 Android Vibrator Service 分析博文,感觉非常 Excited,我决定还是画点图,再写篇更能快速阅读和记忆的文章看看(当然因为我比较强迫症,所以为了背下来 SystemVibrator、Vibrator、IVibratorService、VibratorService、ServiceManager、ActivityThread、PackageManager Permissions、SystemServiceRegistry 和那一大堆静态方法、类/接口定义什么的花了我总共至少三节课的时间)

5. iptables: 如果可以的话,Yuuta 最近发表的一篇博文里『大佬们』教的 iptables... 虽然我最后是使用某种非常过分(瞎 🐔 解释参数的含义,因为我不了解 ipatbles filter,我不是网管)的方法背下来了(cmdline)但是我不知道它做什么,我要画图。

iptables -t NAT -j <?> -A PREROUTING -p tcp -m tcp -d 0.0.0.0 --dport 233 --to-destination 233.233.233.233:233

6. 讲一下我最近看过的一些知识,这样有相关背景的人就可以一起聊聊(好吧,不指望,因为我还没看 MVC、MVP、MVVM 什么的流行架构吧)
比如: RankNTypes、稍微进一步的 Haskell、Agda 基础支持、归纳证明的直觉、依赖类型没入门

7. 我要用 Kotlin + Kotlin JVM 实现 Fractional (分数)数据和 Matrix2D(二维矩阵,当然也可以理解为 Tensor,张量,虽然我不知道啥是张量,二者有何关系,Wiki 桑有提到)
我要写个 recursive descent method 的 scannerless parser 和 Gauss-Jordan 消元算法... 我要机器解上次我提到的那种(线性)方程组,然后拿到解集...
然后还要写 BCE... 利用原子个数守恒法配平化学方程式

虽然这可能是我最讨厌的线性代数内容。 🤔 👨‍🏫 😵

... 算了,我不用 java.math.BigDecimal 了,我要用 Kotlin Multiplatform!
duangsuse::Echo
Telegram 比较不稳定(MTProto Proxy,只有一两个能用的,现在只有一个可以使而且不时爆破...),如果 Telegram 炸了的话我就去 GitHub Issue 上更贴,反正就是更贴到死。 #Learn #CS #dev #PL #Math 下面是我这周想讲/做的,虽然我知道肯定做不完。 1. #Java #Kotlin #dev #Android 开发一个 AOP SharePreference 类帮助库,(虽然现在开始有人用 Sqlite 了,但是对于 Preferences 这种很多时候不需要…
8. 简单地说一下,我在 ES6 标准入门这本书里大概看到了什么:

== ES5 的 primitive types(差不多,可能不叫这名,反正意思就是构造器不需要用 new 指令的,其他的板凳条凳问题而已)

String Number Boolean Date RegExp Array
Function Error Object

完全默写出来了! 🐱❤️

== 其他的杂七杂八,证明我看到了,以后可以用而已

let/const/import/class, pattern matching destruct, String, Object, Array, Set/WeakSet, Map/WeakMap, Promise(Future), Generator(Fiber, Coroutine, Sequence...), Iterator, Thunk, co, await/async, ArrayBuffer, TypedArray, DataView, Atomics
let block scoping, do block, class # private variable, decorator, RegExp/Number/Function/Object extensions, ES6 Module, ...operator, Classes,
Reflect, Proxy

最后没有想起来的内容就是 Symbol... Ruby 里也有的... 🤔 ♦️

反正,解构和 let 的语义、ES6 Scoping 我是基本清楚了,以后要用直接翻就可以

9. 重置 Android 应用 Unicode
🤔 因为简单啊,这次就用 AppCompat 了

这个应用。

10. DropScript

它是为了一个后来计划的 Android 应用 — DeepTransform 设计的

我把它视作一门动态可检查可不检查类型的语言(除了执行时它应该有一个独立的静态类型检查器和推导器),支持类型推导技术和可选的 2D 文法、支持 Lexical Scoping 和 Functions as first-class citizen、Pattern matcing,可惜我的设计手稿丢学校里了emmm 🤔

因为手稿忘学校了,而且一时也写不出来(没时间,不可能有时间),我会写一个相对『我记得住的特性』的版本,不会考虑性能问题,也不会加一大堆相同功能,可替换的实现(比如解释器后端是使用编译器+虚拟机还是 AST 解释器,AST 解释器是 Visitor Pattern 还是 Object Algebra Visitor)

11. DeepTransform
我觉得它是 MinBase64 的升级版,但是它非常逆天,以至于可以用插件化去做一个支持代码高亮的 Markdown 编辑器(跑)
当然它势必得花大量时间,所以一时半会写不了,但是界面交互设计我会画图发,伪代码高抽象算法、数据流等设计我也会发

12. 编写 Java 8 的 BinaryReader 解析 AXML, ARSC
看了某 Conmajia 的翻译博文有感而发,我觉得是时候血洗前耻了,就是这周!第一个!

想当年(其实也就是大概快一年之前...)我居然菜到连那么 trivial 的列表/流处理东西都写不出来(虽然比较模式化 procedural 的东西我还是写了,比如 TinyAXML 的插件特性... 和现在一些工程有点像吧,不过我那个连 OOP 架构都几乎没有)

13. 默写,我最喜欢的任务了:

+ sm.ms js,我看了一会的,当然因为有些 Commander 的 API 还没背会看一点。
+ Conmajia 博客上的 Parallel.ForEach DIP 反色对比 Form
+ BshServer/(RFCOMM,Android, 某 ANdroidDevCn 看的) BluetoothServer, Zygote init 的 service rc(run command)
+ Yuuta 最近发的 Vertx randomPicture,我居然还背了总共两三节课...
+ openGL GLUT 测试
+ 顺手再拿 Kotlin 写一个简单的 AND/NAND/OR/XOR 人工神经网络
至于人工神经网络用于机器学习什么的,更甚于深度神经网络,都不会。
因为?Cost Function、Gradient Descent (梯度下降算法)什么的都不那么 trivial(虽然是基础了)

用于计算机视觉的卷积神经网络... 信号处理... 矩阵互相关... 递归循环神经网络... 无监管学习什么的...
反正 ANN 就是大坑啊 🤔 想到死。
机器学习... 学习... 学什么... 反向传播设置权重才是入门里最难理解的?

想啊想。
想到神经网络是什么呢,神经网络是拥有未知参数的程序
正向传播,是运行这个程序的过程、反向传播,是调整参数的过程

想到神经元,一个神经元有很多输入,每个输入都配有权重,配完了加上一个偏差值(bias)送到激活函数里,就成了这个神经元的输出
神经元的『轴突』可能会与下一个神经元的『树突』也即输入相联接... 就是一大堆 Sigma 和 Activation Function 嘛。

手工设置权重和偏差值,很累,神经网络太小。
能不能不使用激活函数呢?(使用 idenity function)不能,因为激活函数使得神经网络可以学习非线性特征,解决类似 XOR 这样线性不可分的问题。
如果不使用激活函数,多层网络完全可以 inline 和 const folding 成单层网络

XOR 只需要使用 2 层网络,3 个操作(xor l r = nand l r ∧ l ∨ r)即可完成

什么是前馈全连接网络?就是每一层的神经元都与上一层的相联,第一层与输入相联...
输出层是虚构的

激活函数,一般使用 开关(阀值)函数、SoftMax 整流器函数、Sigmoid、Tanh 阶跃函数、Relu...
Cost Function,有 Mean Square Error,均方误差
学习算法,有梯度下降法,梯度下降法要求激活函数在定义域内完全可导的,并且导数不为零
优化算法,都忘了...
神经网络架构,有递归

祈祷吧。不幸的 13 🤔

14. 我会写一个简单的,能够处理运算符优先级的递归下降法计算器

第一个是加减乘除四则运算的,练习是添加两种双目逻辑运算符和一种一元逻辑运算符
进阶练习是支持 lambda calculus 和 = 操作符

它将可以写出这样的计算:

1+1
1+2*3
(9-3)*2+1
10/1
1.1*100
0xabcdef
10e1
-4
(-4)+1

扩展后,它可以写出这样的运算:

nand = λa b. ¬(a ∧ b)
xor = λa. λb. a∨b ∧ nand(a)(b)

第二个是更好看的计算器,这里将支持更多的 terminal token 和操作(包含右结合的操作和自定义运算符优先级),并且支持 dynamic Scoping 和 let... in... 等二维文法,这是一个基本完整的表述式语言,长得和 Haskell 有点像,但是远远不如 Haskell,这门语言的解析器我们使用 Haskell/Text.ParserCombinators 来开发(作为练习 Haskell 的门路)。

它比 PL/0 NB 多了(Oberon-0 也是),也算是一种形式的 PL/0
duangsuse::Echo
8. 简单地说一下,我在 ES6 标准入门这本书里大概看到了什么: == ES5 的 primitive types(差不多,可能不叫这名,反正意思就是构造器不需要用 new 指令的,其他的板凳条凳问题而已) String Number Boolean Date RegExp Array Function Error Object 完全默写出来了! 🐱❤️ == 其他的杂七杂八,证明我看到了,以后可以用而已 let/const/import/class, pattern matching destruct…
一个『迷你』编程语言,我们称它为 面包(Bread) 🍞 (跑)
我希望它能类似 DropScript 一样作为面向对象的 JVM 语言,不过同时我觉得必须把它和优秀(划掉,没有单独编译期的语言不是好语言)的 DropScript 划清界限(删除)其实所谓界限不过是 pattern matcing 和 OOP、infixl/infixr、module 等等 而已...

它支持这些数据类型,一门强类型自动推导语言:
Str (字符串)
Num (双精度浮点)
Rat (大有理数)
Bool (布耳值)
I8 U8 I16 U16 I32 U32 I64 U64(整型数)
Fn (一元 Lexical Scoping 函数)
Ary (数组)
Tuple (元组,匿名结构体)
Record (具名结构体)

它支持这样的字面量:
字符串,支持 "" '' 和 Heredoc,字符串还支持 String interpolation "$x + $y"
数值,支持十进制、十六进制(0x)和二进制(0b),小数点表示(.5、1.0)、类型字面(i8u8-i64u64、rat、dec),exponent 表示(1e1=10)
Boolean,支持 true 和 false
Fn,|> x → |> y → x + y
Ary,[1 2 3 4 5]
二维 Array 有独特的语法特技
[[
1 2 3 4 5
5 4 3 2 1
]]

三维和以上的我没办法,或许可以用 2D+每一项为 Ary 解决.... 其实 3D 以上此语法糖就没有意义了,但我还是觉得比 C 的 {} 要好。

[[
[1 2 3 4] [23 3 3 33]
[1 2 3 4] [23 3 3 33]
]]

Tuple,(1, 2, 3),(I32, I32)
Record,{ a=1 },{ a: i32 }


支持这些操作符:
+-*/%(mod)
lhs 存储单元的 ++/--
单目 ~(neg)
**
<<(shl) >>(shr) >>>(ushr)
& | ~(not)
<- (store)
!! (index)
= (eq) ~=(ne)
< (lt)
<= (le)
> >= (gt ge)
is
+= -= *= /= %= &= |= >>= <<= >>>= (assignments)
(range)..

作用域:
fun
fun 的所有参数都是不可变的
type
type 可以创建类型别名,用于给 tuple、Record 命名
let … in …
约等于 val
let mut … in …
约等于 var
let const … in …
约等于 const val

它支持这些控制结构:

do ...

if …
else …

case … of

while … do
until … do

loop

while …

loop

until …

for … in …
for … until … [loop …]

break / next
return

它内置这些函数/变量:
pi,e
sin, cos, tan
asin, acos, atan
log, ln, sqrt, root
deg, rad
factorial
puts
gets

历史的倒退(从函数式/面向对象滚回了过程式)。
#PL #Apple 垃圾观点,真应该回 PL 爱好圈重修如何正确吐槽秀优越。 👎