Forwarded from 羽毛的小白板
Forwarded from 羽毛的小白板
看了下 Android 的 SparseArray 的实现,似乎和 .Net 的 SortedList<K, V> 没什么区别
🤔 这个星期本来有很多事情需要讲的(主要是技术,而且我想说我要用 imperative 的 Kotlin 写个 BCE 程序,顺便学学写我的第一个矩阵等式求解算法)
可是呢,duangsuse 的身体目前比较糟糕,所以为了健康还是必须 11 点下机的。
但愿一切都好吧。 #life #tech #dev #backend #algorithm
可是呢,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 的项目持续集成构建和测试都有做(
(当然冰封现在早就不搞这种事情『计算机图形上的封装』了...)
GitHub
代码问题 · Issue #83 · icela/FriceEngine
org.frice.anim.scale.SimpleScale 类中的 obj.scale(deltaTime * x, deltaTime * x) 这句后面应该是y吧?
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. 这种测试是这样的,你们看看(主要是因为很多人对功能性测试和洋文的直觉不好,我翻译一下):
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.*;
mvn archetype:generate 记好了,这些参数
1. archtype 的 Group、ArtifactId、Version
2. 你项目的 Group、AId、Version
3.
以上参数全都是 camelCased 的,风格为 Java 的单 dash(-) 前缀。
(相关知识: Maven Coordinate:
记住,G:A:V 就可以吊打很多连 Maven 是啥,用的啥模型都不知道的 Android Dev 了(跑,但这的确是事实,因为实际上 Android 主要还是和 Android API 和 XML / 组件/View 模型什么的杠,有些入门萌新连 Gradle/Groovy/Maven 到底是做什么的都不知道,也不知道 Dependency Scope、Artifact、Tasks 之类的东西,2333333)。
然后在项目目录里
上面的 Feature/Scenario/Given/When/Then 语法结构,可以在项目的 Test Resource 下的指定 Java 包里创建,一般放在
而 Tests 的代码,就放在同一个 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,我又看了一会才知道,这整个就是一代码生成器程序...
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,我又看了一会才知道,这整个就是一代码生成器程序...
cucumber.io
Cucumber is a tool for running automated acceptance tests, written in plain language. Because they're written in plain language, they can be read by anyone on your team, improving communication, collaboration and trust.
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
不过啦,小点的应用和我这种没啥时间的高二学生来说,根本没有办法花时间嘛...
至于 Kotlin 的
2. Kotlin Android UI DSL
🤔 因为 duangsuse 不想用 AppCompat 什么的一大坨咕狗娘的吐血推荐。想用自己在网上找的组件(Widget, View)库,和 Android 自己的 view 们。
Kotlin AnkoLayouts 是个好东西,可是我觉得它还是太大了(其实是伪命题,但也未必真的是,因为 Anko 考虑的的确比我多,而且不是完全 Inline 的),不如弄个小点别的结构的慢慢来... 这样也许会合适一些?
(其实就是强迫症,不想引入太多别人的依赖,逃跑)
有时候觉得可以这样描述(求别吐槽我这个,两年前的东西了):
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)但是我不知道它做什么,我要画图。
比如: RankNTypes、稍微进一步的 Haskell、Agda 基础支持、归纳证明的直觉、依赖类型没入门
7. 我要用 Kotlin + Kotlin JVM 实现 Fractional (分数)数据和 Matrix2D(二维矩阵,当然也可以理解为 Tensor,张量,虽然我不知道啥是张量,二者有何关系,Wiki 桑有提到)
我要写个 recursive descent method 的 scannerless parser 和 Gauss-Jordan 消元算法... 我要机器解上次我提到的那种(线性)方程组,然后拿到解集...
然后还要写 BCE... 利用原子个数守恒法配平化学方程式
虽然这可能是我最讨厌的线性代数内容。 🤔 👨🏫 😵
... 算了,我不用 java.math.BigDecimal 了,我要用 Kotlin Multiplatform!
#Learn #CS #dev #PL #Math 下面是我这周想讲/做的,虽然我知道肯定做不完。
1. #Java #Kotlin #dev #Android 开发一个 AOP
SharePreference 类帮助库,(虽然现在开始有人用 Sqlite 了,但是对于 Preferences 这种很多时候不需要 Sqlite 的)我希望对于 SharedPreferences 的编辑能更简单一些,只需要一个接口:@AppProperties(Mode.SHARED_XML)然后当然啦,为什么要依赖注入什么的... 直接这样多好,虽然 OO 一大堆设计模式... 技巧... 还有所谓的架构师... 🤔
interface ApplicationStorage {
var name: String = ""
var age: Int = 1
var male: Boolean = true
}
不过啦,小点的应用和我这种没啥时间的高二学生来说,根本没有办法花时间嘛...
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!
GitHub
Anko Layouts
Pleasant Android application development. Contribute to Kotlin/anko development by creating an account on GitHub.
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(差不多,可能不叫这名,反正意思就是构造器不需要用
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
== 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
历史的倒退(从函数式/面向对象滚回了过程式)。
我希望它能类似 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
历史的倒退(从函数式/面向对象滚回了过程式)。
Forwarded from 羽毛的小白板
太肤浅了,居然认为 property 是没意义的。我弄 Unity3D 时就觉得,只用 field 不用 property 各种不便……
https://zhuanlan.zhihu.com/p/51395461
https://zhuanlan.zhihu.com/p/51395461
知乎专栏
相对于 C# 我为什么更喜欢 Java (一)
乔布斯在接受采访时说过,微软最大的问题就是没有品味,我认为 C# 是典型案例。很难相信,一个 2002 年才诞生的语言,居然可以从前辈身上吸取那么多糟粕。很多 C++ 犯过,但 Java 没犯的错误,C# 居然又犯了。微软…