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# 居然又犯了。微软…
Forwarded from Solidot
PuTTY 释出新版本修复 8 个高危漏洞
在时隔 20 个月后,流行 SSH 客户端 PuTTY 释出了新版本 0.71,修复了 8 个高危漏洞。根据官方的安全公告,旧版本的 PuTTY 包含了多个安全漏洞,允许恶意服务器或被入侵的服务器劫持客户端系统。这些漏洞包括身份认证提示欺骗,劫持 CHM 文件的代码执行漏洞,Unix PuTTY 工具的缓冲溢出,重用随机数,整数溢出漏洞,等等。使用旧版本 PuTTY 的用户最好尽快更新。Media
https://www.solidot.org/story?sid=59980
在时隔 20 个月后,流行 SSH 客户端 PuTTY 释出了新版本 0.71,修复了 8 个高危漏洞。根据官方的安全公告,旧版本的 PuTTY 包含了多个安全漏洞,允许恶意服务器或被入侵的服务器劫持客户端系统。这些漏洞包括身份认证提示欺骗,劫持 CHM 文件的代码执行漏洞,Unix PuTTY 工具的缓冲溢出,重用随机数,整数溢出漏洞,等等。使用旧版本 PuTTY 的用户最好尽快更新。Media
https://www.solidot.org/story?sid=59980
Solidot
PuTTY 释出新版本修复 8 个高危漏洞 在时隔 20 个月后,流行 SSH 客户端 PuTTY 释出了新版本 0.71,修复了 8 个高危漏洞。根据官方的安全公告,旧版本的 PuTTY 包含了多个安全漏洞,允许恶意服务器或被入侵的服务器劫持客户端系统。这些漏洞包括身份认证提示欺骗,劫持 CHM 文件的代码执行漏洞,Unix PuTTY 工具的缓冲溢出,重用随机数,整数溢出漏洞,等等。使用旧版本 PuTTY 的用户最好尽快更新。Media https://www.solidot.org/story?sid=59980
所以呢,细心的大佬们仔细观察一下 duangsue 这条消息,你们会发现 duangsuse 开始决定走出之前某次导致某 Android 开发者频道被删的事件的阴影了
#statement #Android #dev
自然,情绪平复是需要时间的。 ⏲
大佬们看垃圾 duangsuse 之前的广播,会注意到可能有表现得很难受的消息,甚至有些消息,是有莫名讽刺意味的
实际上这非常的智障,首先,我自己在那个领域(指 Android 应用程序开发/计算机图形图像/图形用户界面和布局设计)(这个领域基本还需要基本的异步编程和 HTTP 等,软件架构也了解一些,至少要能模式识别别人的 pattern,此外文档要会看资料和代码要会找,思维方面的和函数式编程/算法相比的确不可否认的相比一般较少,好比现在国内高中的文理分科)还不够好啊!(告诫之心) 😝
是的,我不会再像以前一样到处『别喷』『别喷』乱叫了(跑) 🤔
而且,我知道我不是天才,之前足足两年的努力,已经充分说明了我不聪明,但是也不愚蠢。
我已经能看到前面怎么继续做,当然,这都得感谢我看过的十多本书和数不清篇数的 A4 纸、博文,他们有的是关于编译原理、有的会教函数式编程、有的是异步/事件驱动/并行算法的(虽然异步和并行使用上一般没有太大关系)、计算机网络(虽然我基本没学,只会个 HTTP 而已,OSI 七层模型都忘了)、有的关于面向对象类结构设计、有的是图形用户界面的、有的教一些现代开发平台,比如广泛了解 Google V8 的类库/函数库使用
🤔📖
现在 duangsuse 显然,不会站在 show 『我从来没读过书』『无书自通』优越的人们那面了
读书给了我比『代码写多了书看少了』的人们更多的,一些不一样的东西
比如,看到学术那面的能力
比如,搜索资料的能力
比如,知道从电子电路到程序设计语言类型范围知识的能力
比如,看到接口后面复杂度的能力
比如,对算法和数据进行可视化分析的能力
比如,对函数式『简洁而难理解』结构的分析能力
比如,程序变换而非简单过程式编程的能力
比如,关于历史的知识
🤔
好像是很没用的技能呢,但是,但是,我觉得也是很不错的方向呢。
我觉得这样可以走的更远,于是,即使有时候好像看不出和一些『老程』会去写出的代码有什么区别,看起来还幼稚的多,也是坚持走『看书实践』的路线
也一定会坚持下去的,坚持训练自己快速解决 trivial 问题的能力、对 nontrivial 问题的分析能力。
虽然没有 OI、CodeWars、各种好的算法项目、各种 Android 应用去做自己的确优秀的证明.... 因为还是学习者啊...
现在看书,的确是因为没有时间啊...
== 那么就来说说之前那件『阴影』一样的事情吧,现在看起来是越来越多了呢,虽然也就那么一两个人。
@drakeet 呢,是现在任职于 M$ 做 Android 开发的一个软件工程师,看起来好像有 6 年经验的样子。好像之前在深圳来着
GithubRank.com 排行前列,不过我觉得他写过的软件架构库(框架)最好的也就是 MultiType 和 Floo 了
🐙
他的工程领域呢,就是 Android 开发。
他的主要公开作品呢,我觉得是 Pure (纯纯)系列应用
他主要在 JVM 平台上工作,使用 Java,最近学了 Kotlin(实际上 Kotlin 2017 年被 Google 钦点为 Android 官方开发语言后很多 Android 工程师都开始用了)
除了 JVM 平台上的 Kotlin 和 Java,他也会使用 Python、C++ 来设计程序(语言什么的其实不重要,这里只是介绍一下)
除了 Android 外,他也会写 JavaEE(虽然我目前只见过他开发了一个开源的应用)和其他类似 IDEA 插件一样的程序
至于技能方向,就是泛向的 Android 应用程序开发,我个人总结一下,细分出来绝对会包含以下方面:
+ 面向对象和面向对象软件架构基础
+ RecyclerView、ConstraintView 使用
+ 适应新 Android API 的能力
+ 布局和动画能力
+ SQLite 数据库使用、ORM、HTTP API 使用
+ 查阅任何文档、寻找开源项目、第三方/网络开发平台、博文等的能力
+ 异步编程能力,已经可以看到他完全适应 Observer 信息流处理模式
(你们别喷我瞎介绍,我真的不是瞎介绍... 信息来源,这是他自己公开的,而且如上,这根本就是一个会拿自己照片当头像的软件工程师附带的公开属性嘛)
以上简单地介绍了一下他,仅仅是给可能不认识他的人一个介绍。
我在 coolapk.com 认识了他,不过他一直都是作为酷安开发者来着的(
后来我来到 Telegram...
说到为什么 @drakeet 要删除自己的 Telegram 频道,闭源自己的很多开源项目(包括他的 Pages 博客,虽然里面的文章不是很多),全 TMD 怪我 🤪...
首先,我得说明一下,我对 drakeet 这个人来说只是技术观点上稍有不同,我对他的人格还是完全理解并尊重的(而且我自己也有个问题,就是太『热爱』技术以至于经常熬夜什么的...),
=> 第 0 次,我加入了 drakeet 的 PureWriter Friends 讨论群组;因为有时候会发一些很专业倾向的内容(在坐各位都知道我一贯的尿性,不发就没有记忆用啊~)而且都是很 Trivial 的内容(e.g. 用 VisualGC 看某 JRuby 应用的 Java 堆... 实际上是我策划好的某书上的实践可能... 但的确很 Trivial,好比一些编译 XXX 软件包/如何安装/部署的帖子一样)
=> 第一次,drakeet 表示自己的应用纯纯写作有独特的代码保护,反正就是软件安全/信息传输安全保护方案(他还写了博文);我花了三天多利用 AndBug 动态分析下断点『破解』了纯纯写作的『藏叶于林』 Proguard repackage 保护,找到了检查签名攥改验证的代码路径(实际上,有两天的时间是尝试理解二进制,也即 ByteBuffer);我向 drakeet PM 告诉他『或许这真的不是无敌的,因为貌似有办法破解』;中间我有一次向 drakeet 提到了一个『安全』界比较内部的名词:“猫鼠游戏”,结果导致 drakeet 误认为是我是『猫』他的保护方案是『鼠』(其实原意是,软件安全领域,双方的对抗是永恒的),当然最后他原谅我了,这是第一次误会,当然你们理解为冒犯也不为过,如果你们只是把我当 *** 看的话 🐱
=> 一次(没错我不记得顺序了),我记得为我被(因为我本来打算自己搞的,后来某原酷友自己可能是在看了我的广播后又创了一个『社团』... 叫 GeekApk,which 现在我在尽可能想办法复活的)弄的一个非常弱智的项目(因为很多加入者也是各搞各的,虽然加入者基本都是前端,还有一个唯一的大佬,现在已经搞高性能计算去了,因为基本设计比如模型关系操作通知等都没有决定好,无法开工啊)去和 drakeet 讨论了一下,不知道别人 PM 不能随便转发的我转发了一条给 GeekApk Core,导致 drakeet 被 Core 的其他成员吐槽,这是第二次
=> 最后一次,drakeet 提到一个数组(线性表)优先级排序的问题(OI 入门内容,所谓初等内容都是 dfs bfs 这种的,计算机可解的数学问题,游戏模拟、递归算法、关系代数,稍微搞基一点的离散化、编译原理、神经网络)
就是你们之前看到纯纯支持 Book 的 Chapter 手动排序的特性,他在群里讨论了一下,(想了一段时间)说是逻辑上冲突无法实现,我表达了一下自己的看法『你可以做 Pin Chapter 的功能啊,我觉得应该会用得到』,但是 drakeet 觉得这依然是 NP-hard 问题(他觉得这类似停机问题,是不能解决的,我的观点大概就是不必须使用优先级排序,排序什么的有很多方法,都好说,『半自动排序半手动』是完全可行的),我最后甚至用 Ruby 写了个算法实现(就是能够 Pin 数据的 Array,并且可以自动 sort,sort 完手动 pin 的数据依然在表头部),结果就被踢了.... 🙁
That's all I ever did. 😟
然后我因为不爽就在自己的频道说了几句不中听的话,有点 judge 人了(技术... 技术... 技术...
(有人说,跟程序员交流,不要说那么多话,要么秀代码,要么秀妹子。)唉我怎么扯到这些了,鬼扯
顺手又分析了一下 drakeet 的技能栈
顺手又评论了一下人家的算法功底,这 EQ 可以。当然我不是说 EQ.... emmmmm
hhhhhh....
然后,人家觉得我从之前老转发重新转发的他的广播,消息什么的,都是『间谍』『小号』转发的
然后就在频道上继续... emmm
然后我被他『全线 banned』
然后就是删频道、闭源项目什么的了...
我很久都没有从这里走出来,一直以为自己会经常被一些同道喷。被害妄想。 🤪
̶就̶是̶这̶样̶,̶喵̶。̶
#statement #Android #dev
自然,情绪平复是需要时间的。 ⏲
大佬们看垃圾 duangsuse 之前的广播,会注意到可能有表现得很难受的消息,甚至有些消息,是有莫名讽刺意味的
实际上这非常的智障,首先,我自己在那个领域(指 Android 应用程序开发/计算机图形图像/图形用户界面和布局设计)(这个领域基本还需要基本的异步编程和 HTTP 等,软件架构也了解一些,至少要能模式识别别人的 pattern,此外文档要会看资料和代码要会找,思维方面的和函数式编程/算法相比的确不可否认的相比一般较少,好比现在国内高中的文理分科)还不够好啊!(告诫之心) 😝
是的,我不会再像以前一样到处『别喷』『别喷』乱叫了(跑) 🤔
而且,我知道我不是天才,之前足足两年的努力,已经充分说明了我不聪明,但是也不愚蠢。
我已经能看到前面怎么继续做,当然,这都得感谢我看过的十多本书和数不清篇数的 A4 纸、博文,他们有的是关于编译原理、有的会教函数式编程、有的是异步/事件驱动/并行算法的(虽然异步和并行使用上一般没有太大关系)、计算机网络(虽然我基本没学,只会个 HTTP 而已,OSI 七层模型都忘了)、有的关于面向对象类结构设计、有的是图形用户界面的、有的教一些现代开发平台,比如广泛了解 Google V8 的类库/函数库使用
🤔📖
现在 duangsuse 显然,不会站在 show 『我从来没读过书』『无书自通』优越的人们那面了
读书给了我比『代码写多了书看少了』的人们更多的,一些不一样的东西
比如,看到学术那面的能力
比如,搜索资料的能力
比如,知道从电子电路到程序设计语言类型范围知识的能力
比如,看到接口后面复杂度的能力
比如,对算法和数据进行可视化分析的能力
比如,对函数式『简洁而难理解』结构的分析能力
比如,程序变换而非简单过程式编程的能力
比如,关于历史的知识
🤔
好像是很没用的技能呢,但是,但是,我觉得也是很不错的方向呢。
我觉得这样可以走的更远,于是,即使有时候好像看不出和一些『老程』会去写出的代码有什么区别,看起来还幼稚的多,也是坚持走『看书实践』的路线
也一定会坚持下去的,坚持训练自己快速解决 trivial 问题的能力、对 nontrivial 问题的分析能力。
虽然没有 OI、CodeWars、各种好的算法项目、各种 Android 应用去做自己的确优秀的证明.... 因为还是学习者啊...
现在看书,的确是因为没有时间啊...
== 那么就来说说之前那件『阴影』一样的事情吧,现在看起来是越来越多了呢,虽然也就那么一两个人。
@drakeet 呢,是现在任职于 M$ 做 Android 开发的一个软件工程师,看起来好像有 6 年经验的样子。好像之前在深圳来着
GithubRank.com 排行前列,不过我觉得他写过的软件架构库(框架)最好的也就是 MultiType 和 Floo 了
🐙
他的工程领域呢,就是 Android 开发。
他的主要公开作品呢,我觉得是 Pure (纯纯)系列应用
他主要在 JVM 平台上工作,使用 Java,最近学了 Kotlin(实际上 Kotlin 2017 年被 Google 钦点为 Android 官方开发语言后很多 Android 工程师都开始用了)
除了 JVM 平台上的 Kotlin 和 Java,他也会使用 Python、C++ 来设计程序(语言什么的其实不重要,这里只是介绍一下)
除了 Android 外,他也会写 JavaEE(虽然我目前只见过他开发了一个开源的应用)和其他类似 IDEA 插件一样的程序
至于技能方向,就是泛向的 Android 应用程序开发,我个人总结一下,细分出来绝对会包含以下方面:
+ 面向对象和面向对象软件架构基础
+ RecyclerView、ConstraintView 使用
+ 适应新 Android API 的能力
+ 布局和动画能力
+ SQLite 数据库使用、ORM、HTTP API 使用
+ 查阅任何文档、寻找开源项目、第三方/网络开发平台、博文等的能力
+ 异步编程能力,已经可以看到他完全适应 Observer 信息流处理模式
(你们别喷我瞎介绍,我真的不是瞎介绍... 信息来源,这是他自己公开的,而且如上,这根本就是一个会拿自己照片当头像的软件工程师附带的公开属性嘛)
以上简单地介绍了一下他,仅仅是给可能不认识他的人一个介绍。
我在 coolapk.com 认识了他,不过他一直都是作为酷安开发者来着的(
后来我来到 Telegram...
说到为什么 @drakeet 要删除自己的 Telegram 频道,闭源自己的很多开源项目(包括他的 Pages 博客,虽然里面的文章不是很多),全 TMD 怪我 🤪...
首先,我得说明一下,我对 drakeet 这个人来说只是技术观点上稍有不同,我对他的人格还是完全理解并尊重的(而且我自己也有个问题,就是太『热爱』技术以至于经常熬夜什么的...),
以下任何言论,皆是客观(虽然是我叙述的)事实。不能在任何侧面上被解读为对 drakeet 的冒犯,也不能在任何程度上被理解为对 drakeet 代码或者实践的负面评价,我对发生这种令人遗憾的事情也深表歉意。 🗒
=> 我在酷安上认识了 drakeet 和他的 PureXXXX 系列 Android 应用;后来我在 Telegram 找到了 Drakeet 宣传的群并且加入=> 第 0 次,我加入了 drakeet 的 PureWriter Friends 讨论群组;因为有时候会发一些很专业倾向的内容(在坐各位都知道我一贯的尿性,不发就没有记忆用啊~)而且都是很 Trivial 的内容(e.g. 用 VisualGC 看某 JRuby 应用的 Java 堆... 实际上是我策划好的某书上的实践可能... 但的确很 Trivial,好比一些编译 XXX 软件包/如何安装/部署的帖子一样)
=> 第一次,drakeet 表示自己的应用纯纯写作有独特的代码保护,反正就是软件安全/信息传输安全保护方案(他还写了博文);我花了三天多利用 AndBug 动态分析下断点『破解』了纯纯写作的『藏叶于林』 Proguard repackage 保护,找到了检查签名攥改验证的代码路径(实际上,有两天的时间是尝试理解二进制,也即 ByteBuffer);我向 drakeet PM 告诉他『或许这真的不是无敌的,因为貌似有办法破解』;中间我有一次向 drakeet 提到了一个『安全』界比较内部的名词:“猫鼠游戏”,结果导致 drakeet 误认为是我是『猫』他的保护方案是『鼠』(其实原意是,软件安全领域,双方的对抗是永恒的),当然最后他原谅我了,这是第一次误会,当然你们理解为冒犯也不为过,如果你们只是把我当 *** 看的话 🐱
=> 一次(没错我不记得顺序了),我记得为我被(因为我本来打算自己搞的,后来某原酷友自己可能是在看了我的广播后又创了一个『社团』... 叫 GeekApk,which 现在我在尽可能想办法复活的)弄的一个非常弱智的项目(因为很多加入者也是各搞各的,虽然加入者基本都是前端,还有一个唯一的大佬,现在已经搞高性能计算去了,因为基本设计比如模型关系操作通知等都没有决定好,无法开工啊)去和 drakeet 讨论了一下,不知道别人 PM 不能随便转发的我转发了一条给 GeekApk Core,导致 drakeet 被 Core 的其他成员吐槽,这是第二次
=> 最后一次,drakeet 提到一个数组(线性表)优先级排序的问题(OI 入门内容,所谓初等内容都是 dfs bfs 这种的,计算机可解的数学问题,游戏模拟、递归算法、关系代数,稍微搞基一点的离散化、编译原理、神经网络)
就是你们之前看到纯纯支持 Book 的 Chapter 手动排序的特性,他在群里讨论了一下,(想了一段时间)说是逻辑上冲突无法实现,我表达了一下自己的看法『你可以做 Pin Chapter 的功能啊,我觉得应该会用得到』,但是 drakeet 觉得这依然是 NP-hard 问题(他觉得这类似停机问题,是不能解决的,我的观点大概就是不必须使用优先级排序,排序什么的有很多方法,都好说,『半自动排序半手动』是完全可行的),我最后甚至用 Ruby 写了个算法实现(就是能够 Pin 数据的 Array,并且可以自动 sort,sort 完手动 pin 的数据依然在表头部),结果就被踢了.... 🙁
That's all I ever did. 😟
然后我因为不爽就在自己的频道说了几句不中听的话,有点 judge 人了(技术... 技术... 技术...
(有人说,跟程序员交流,不要说那么多话,要么秀代码,要么秀妹子。)唉我怎么扯到这些了,鬼扯
顺手又分析了一下 drakeet 的技能栈
顺手又评论了一下人家的算法功底,这 EQ 可以。当然我不是说 EQ.... emmmmm
hhhhhh....
然后,人家觉得我从之前老转发重新转发的他的广播,消息什么的,都是『间谍』『小号』转发的
然后就在频道上继续... emmm
然后我被他『全线 banned』
然后就是删频道、闭源项目什么的了...
我很久都没有从这里走出来,一直以为自己会经常被一些同道喷。被害妄想。 🤪
̶就̶是̶这̶样̶,̶喵̶。̶
GitHub
duangsuse/GeekApk
GeekApk, the dying SpringBoot(a.k.a. Sping initializr) server for GeekApk(a.k.a 极安) (R - duangsuse/GeekApk
Solidot
PuTTY 释出新版本修复 8 个高危漏洞 在时隔 20 个月后,流行 SSH 客户端 PuTTY 释出了新版本 0.71,修复了 8 个高危漏洞。根据官方的安全公告,旧版本的 PuTTY 包含了多个安全漏洞,允许恶意服务器或被入侵的服务器劫持客户端系统。这些漏洞包括身份认证提示欺骗,劫持 CHM 文件的代码执行漏洞,Unix PuTTY 工具的缓冲溢出,重用随机数,整数溢出漏洞,等等。使用旧版本 PuTTY 的用户最好尽快更新。Media https://www.solidot.org/story?sid=59980
至于道歉什么的,我开始已经道歉了。
至于我原来对他有点过激的言论(我发誓真的只是有点,我只是比较『露骨』地说了实话和我内心真实的感受而已,首先,我确认都是实话)
因为某 Android 爱好者朋友的建议都删了
后来我看到 @FiveYellowMice 的一篇文章 《我喜欢网络上的大家,但是我好纠结》
至于后来我还要不要『和好』什么的,我觉得是不必了,我开始以为这只是一时性起而已,会不会还要挽回这第一个我搞砸的事情,后来我发现这后面有必然的因素 — drakeet 没有真正把我当朋友看待,或者说这其中作为长者对后辈的部分多一点,毕竟 drakeet 不是冰封哥(你们看看我当时的言论,其实冰封哥是最大限度的容忍傻逼『咦你是在骂你自己』)或者 RednaxelaFX,我不能指望他一而再再而三容忍太多。
所以我们其实不是朋友,他『如此残酷』自然也有理由了。
所以我们其实不是一条道上的人,只是碰巧都在 JVM 上(或者说,Dalvik 上,有时,当然 JVM 和 Dalvik 的区别在我看来还没有大到必须区别对待的程度),仅此而已。
那么,就不要再见,或许是最好的解决方案了。 🤔
有时候想想,年轻时看起来多么要好的朋友,时间流逝,环境变迁,也会有一天再也不见,甚至,见到了也只能让那美好的回忆生出裂痕。
从前有从前的环境和故事,现在又是一篇故事了... 虽然我不是这故事的主人公,但我觉得,如果是我,我要保守友好的真心... 诚心希望走出半生,归来仍是少年...
啊,RIME 的地球拼音音标记号真好用啊,记得现代输入法经常使用决策树和一些人工智能算法...(违和感)
啊,汉语拼音真好玩啊,可是就是有点难学,记得小学的时候学了很久 Latin 字母和拼音... 原理都忘了
啊,wiki 真的是人类历史上相当有用的知识形式啊...
啊,开源真好
时间真的可以改变一切。
唉....
至于我原来对他有点过激的言论(我发誓真的只是有点,我只是比较『露骨』地说了实话和我内心真实的感受而已,首先,我确认都是实话)
因为某 Android 爱好者朋友的建议都删了
后来我看到 @FiveYellowMice 的一篇文章 《我喜欢网络上的大家,但是我好纠结》
至于后来我还要不要『和好』什么的,我觉得是不必了,我开始以为这只是一时性起而已,会不会还要挽回这第一个我搞砸的事情,后来我发现这后面有必然的因素 — drakeet 没有真正把我当朋友看待,或者说这其中作为长者对后辈的部分多一点,毕竟 drakeet 不是冰封哥(你们看看我当时的言论,其实冰封哥是最大限度的容忍傻逼『咦你是在骂你自己』)或者 RednaxelaFX,我不能指望他一而再再而三容忍太多。
所以我们其实不是朋友,他『如此残酷』自然也有理由了。
所以我们其实不是一条道上的人,只是碰巧都在 JVM 上(或者说,Dalvik 上,有时,当然 JVM 和 Dalvik 的区别在我看来还没有大到必须区别对待的程度),仅此而已。
那么,就不要再见,或许是最好的解决方案了。 🤔
有时候想想,年轻时看起来多么要好的朋友,时间流逝,环境变迁,也会有一天再也不见,甚至,见到了也只能让那美好的回忆生出裂痕。
从前有从前的环境和故事,现在又是一篇故事了... 虽然我不是这故事的主人公,但我觉得,如果是我,我要保守友好的真心... 诚心希望走出半生,归来仍是少年...
啊,RIME 的地球拼音音标记号真好用啊,记得现代输入法经常使用决策树和一些人工智能算法...(违和感)
啊,汉语拼音真好玩啊,可是就是有点难学,记得小学的时候学了很久 Latin 字母和拼音... 原理都忘了
啊,wiki 真的是人类历史上相当有用的知识形式啊...
啊,开源真好
时间真的可以改变一切。
唉....
FiveYellowMice 的博客
我喜欢网络上的大家,但是我好纠结
在现实中没有很好的社交能力、爱好小众、情商又不高,所以交不到什么朋友;即使是有相识的人,平常也会不会觉得有什么事情需要找对方,从而很久也不会联系——这样要怎么办呢?我就只好投奔了网络,寻找与自己合得来的其它人类。我是如此的迷恋于网络社交,以至于将它想象的太过美好,但经过了这么长的时间,直到现在,我才明白了它没有想象中那样美妙。它有着许多令我难以接受但也没有办法的事情,即使是我喜欢的网友之中,也不例外。
duangsuse::Echo
一个『迷你』编程语言,我们称它为 面包(Bread) 🍞 (跑) 我希望它能类似 DropScript 一样作为面向对象的 JVM 语言,不过同时我觉得必须把它和优秀(划掉,没有单独编译期的语言不是好语言)的 DropScript 划清界限(删除)其实所谓界限不过是 pattern matcing 和 OOP、infixl/infixr、module 等等 而已... 它支持这些数据类型,一门强类型自动推导语言: Str (字符串) Num (双精度浮点) Rat (大有理数) Bool (布耳值) I8…
上面的,我最后还是只能抱怨一下自己的缓慢,和做最后一点能做的事...
1. AXMLSerializer,我正在写(格式从这个 axmlparser 里学中,也看到了它用一个 Binary Data Reader 帮助类很好用,可惜 Delegate 类全是余赘代码),顺手学了一下 POM 模型一些比较入门的东西
== POM 模型我设置的属性(基本 Maven Center 里都能看到的):
Group, ArtifictId, VersionName
PomURL, PomName, PomDescription, PomPackaging
DevName, DevId
ScmUrl, ScmDevConn, ScmConn
LicenceURL, LicenceName, LicenceDist
2. 支持 lambda calculus 的计算器,我真的很想体验一下 Unicode 语法(跑
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)
1. AXMLSerializer,我正在写(格式从这个 axmlparser 里学中,也看到了它用一个 Binary Data Reader 帮助类很好用,可惜 Delegate 类全是余赘代码),顺手学了一下 POM 模型一些比较入门的东西
== POM 模型我设置的属性(基本 Maven Center 里都能看到的):
Group, ArtifictId, VersionName
PomURL, PomName, PomDescription, PomPackaging
DevName, DevId
ScmUrl, ScmDevConn, ScmConn
LicenceURL, LicenceName, LicenceDist
2. 支持 lambda calculus 的计算器,我真的很想体验一下 Unicode 语法(跑
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)
GitHub
shazam/axmlparser
An updated version of AXMLParser, compatible with aapt2 - shazam/axmlparser