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

技术相干订阅~
另外有 throws 闲杂频道 @dsuset
转载频道 @dsusep
极小可能会有批评zf的消息 如有不适可退出
suse小站(面向运气编程): https://WOJS.org/#/
Download Telegram
https://github.com/Trumeet/WorkMode/blob/master/app/build.gradle#L39

Android 的 Gradle 插件我基本会用的,可是 Signing Config 我却不是很清楚...

一个签名 config 是这样的

signingConfigs {
name {
storeFile file
storePassword pass
keyAlias alias
keyPassword pk
v2SigningEnabled enabled
}
}

想想也就是这样... 之前一直记不住的说,v2 Signing 的意思是之前 Android 的 v1 包 signature 有漏洞,后来更新了
Java 的 Keystore 就是这样的 (jks)
一个 keyStore 里有很多 Key,store 本身要 pass 才能打开,每个 Key 又有自己的 password 才能用来签名什么的
duangsuse::Echo
不会用 AIDL 和 Paracelabel,不是很了解 Service、Provider、Intents、Permission 的说,不会 Android 的新 API 也没有用 Android 的 AsyncTask 抽象... 我得先重写了 moe.yuuta.workmode.async 压压惊... https://github.com/Trumeet/WorkMode/blob/master/app/proguard-rules.pro#L6 这里让 Proguard 删掉了所有 checkXXXXIsNotNull…
之前已经知道了 Android config 里面的 packageId (其实是 applicationId...), versionCode, versionName, minSdkVersion, targetSdkVersion, androidTestInstrumentationRunner, compileSdkVersion 什么的了,现在见到了 buildConfigField 也会用了,所以好多了...

之前不是很清楚 Java 的 Properties,然后看过了用法后清楚了(无论是 Loader 还是 ResourceBundle)...

然后 IO Stream 本来就是我之前学过的东西

Android lint 和 Gradle sourceSets 我之前都知道,compileOptions 是 Java 项目也会有的,有时候我显式指定

proguard 显然不是什么使用起来很困难的东西... 记住所谓的 pro 文件是 Proguard resp 自动响应命令行文件就好啦,然后 -ccasedoption C Cased options 指定一些 DSL 规则

关于混淆的就是 (methodId) -obfuscationdictionary (package) -packageobfuscationdictionary (class) -classobfuscationdictionary
「今后也一定要努力地把所有 API 的用法背下来哦!」
直到有一天,无论是所谓的简单还是复杂对我来说都再也不能花费我的大量精力来学习...

无论是所谓的后端还是前端工作都无法难住我了就好了呢。
异步、IPC、服务、数据库、用户界面、用户界面动画、计算机图形学、应用程序资源算什么....

好的程序员要有能力既做皇帝又做农民呢。

既要有能力彻底理解别人的抽象,又要能下到实地实现自己的算法,看起来才像是正常人呢。
duangsuse::Echo
#Haskell duangsuse 日常 Haskell.... 🤔...
只要 duangsuse 开始写应用们,应用层的东西就不应该可以阻挡 duangsuse 学习,成为『技术难关』

越复杂越容易堆砌,即便是使用了大量的 API 也一样,我要记住他们... 总有一天我要以非堆砌的方法,深刻明白自己在写什么的状态以快的速度完成更多应用程序

对于 duangsuse 来说,我要记住所有操作... 看到数据流们通过后发生了什么,有着怎样的变化,通过小段程序看到抽象和直觉... 这样才最好...
duangsuse::Echo
之前已经知道了 Android config 里面的 packageId (其实是 applicationId...), versionCode, versionName, minSdkVersion, targetSdkVersion, androidTestInstrumentationRunner, compileSdkVersion 什么的了,现在见到了 buildConfigField 也会用了,所以好多了... 之前不是很清楚 Java 的 Properties,然后看过了用法后清楚了(无论是…
刚才看了一下 Paracel 的操作,目前对 Paracel 的直觉就是 Shared memory stream,或者说 SharedArrayBuffer?

Paracel android.os.Paracel.obtain()

然后有

void setDataPosition(Int)
void writeT(T)
T readT()
unmarshall(T, position: Int, size: Int)
marshall()
void recycle()
https://github.com/Trumeet/WorkMode/tree/master/app/src/main/java/moe/yuuta/workmode

最后总结一下我要开始默写那个包了...

UI 和相关操作逻辑:

suspend: 状态栏 suspend Tile
root package: 应用程序活动
widget: 辅助 UI 控件
update: 自动更新提示

抽象:

access: Android 系统包启用禁用 API 的访问封装,Service
async: AsyncTask 封装

辅助:

utils
duangsuse::Echo
https://github.com/Trumeet/WorkMode/tree/master/app/src/main/java/moe/yuuta/workmode 最后总结一下我要开始默写那个包了... UI 和相关操作逻辑: suspend: 状态栏 suspend Tile root package: 应用程序活动 widget: 辅助 UI 控件 update: 自动更新提示 抽象: access: Android 系统包启用禁用 API 的访问封装,Service async: AsyncTask…
这个包包含:

object Async {
fun <T> beginTask(runnable: Runnable<T>, callback: Callback<T>): Stoppable
}

interface Runnable<T> {
fun run(): T?
}

data class TaskResult<T>(
val successful: Boolean,
val result: T?,
val e: Throwable?
)

interface Callback<T> {
fun onStart() {}
fun onStop(success: Boolean, result: T?, e: Throwable?) {}
}

interface Stoppable {
fun stop()
fun isStopped(): Boolean
}

class StoppableGroup : Stoppable {
override fun stop()
override fun isStopped(): Boolean

fun add(Stoppable)
fun remove(Stoppable)
}

其实 C# FCL 里也有类似的东西,就是一个 Cancelable and Thenable Task
可以随时 cancel 也可以类似 Promise 地在完成后添加逻辑处理异步结果

当然也可以理解为一个只有 Callback (TaskResult) 的 Promise,没有 resolve 和 reject,只有 then 没有 catch,反正就是类似 Promise 的东西
下载太慢了...
写完了,这就花了一个小时... 但是有收获 #Android #Kotlin
Async.zip
92.5 KB
Async.kt
1.6 KB
#gist #Kotlin 就这样... 感觉可以写一些 Android 平台的东西了,IDEA 的 library view 很好用,可惜我还不知道 Class hierarchy 怎么看
duangsuse::Echo
Photo
其实我不懂 Kotlin... 即便是 Kotlin 极简教程上也没讲 Kotlin 元编程
我不知道 by operator 是怎么工作的...
刚才看了一些 Android API28 平台包,了解到了:

+ android.os.Paracel 其实就是 Android 的 Protobuf,被称为 Message 的...
+ Praacelabel 就是可以写到 Paracel 上的东西...
+ android.os.Bundle 就是有类型检查的 Map
+ android.content.Intent 有 Category, Action 和 ClassName
+ android.util.ArrayMap 的容器(bin)是 Array 而不是 LinkedList、扫描算法是二分查找,故此称为 ArrayMap
+ 有一个 android.util.SparseArray 但我不知道是哪种东西

+ Android 有内建的 JSON 和 Base64 支持
+ 如果你要在 Gradle 里用 plugin: 'com.android.library'plugin: 'kotlin'
不能这么做,要不然你就会和我一样浪费至少半个小时的时间调整 Gradle 和 Gradle Android 的版本...
然后搜索 Android Plugin 的源代码并最终发现其实 Andriod 插件所谓的“不兼容”不是指 Java 插件版本不兼容,而是 android 根本不能和 java 一起 apply...

必须用 plugin: 'kotlin-android' 替换默认 kotlin

+ Kotlin JVM 的默认 Maven coordinates: "org.jetbrains.kotlin:kotlin-stdlib-jdk8:+"
+ Android AndroidManifest XML 的 Schema URI: "http://schemas.android.com/apk/res/android"
duangsuse::Echo
Photo
AsyncTask 其实就是基于消息队列事件的异步,是解决 Android 的 "UI 线程" "Worker Thread" 不对称问题的
#Telegram 太好了!
Forwarded from Telegram Beta
Now you can share the public channel's link and view the content in a browser.

Copy and open it in a browser:
t.me/s/durov
t.me/s/telegram
t.me/s/tgbeta
t.me/s/username

Note:
The contents aren't updated real time, currently for preview.

Credit: KeralaGram
https://t.me/s/dsuse 这样看起来会方便很多,也给了我用 Telegram 而不是写 Markdown/HTML 的动力