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

技术相干订阅~
另外有 throws 闲杂频道 @dsuset
转载频道 @dsusep
极小可能会有批评zf的消息 如有不适可退出
suse小站(面向运气编程): https://WOJS.org/#/
Download Telegram
duangsuse::Echo
算法实现, 和《算法图解》版本不一样的地方在于,不是 costs.filter { !it.second.walked }.minBy { it.second.cost }, 只有队列自动忽略走过的节点,没有『最便宜』,只是全部队列处理完(虽然在无环的情况下未必得记住哪些已经处理过)
...头疼,现在还有如下问题:

1. 为什么《图解》上的版本,自动寻找当前离 GraphRoot 最近的一个节点作为扫描起始位置
这和使用队列的版本有区别吗?如果随便选择一个还没算 succ 路径的节点而不是『最近节点』会不会有问题?

2. 看起来对于所有节点来说,走过一遍意味着已经确定它余下边链接节点的开销?
还是说它的最廉价路径确定了?这样相对 DFS 枚举路径的版本优化了多少?

3. 这个版本的封装很差劲... 真是...
duangsuse::Echo
算法实现, 和《算法图解》版本不一样的地方在于,不是 costs.filter { !it.second.walked }.minBy { it.second.cost }, 只有队列自动忽略走过的节点,没有『最便宜』,只是全部队列处理完(虽然在无环的情况下未必得记住哪些已经处理过)
『假装以后会去学习算法的样子』

但即使以后会一点这种幼稚园算法,也不能达到我想要的高度呢。 看来还需要理解...

沉思(迫真)了半个小时后稍微有了点理解,学到了
duangsuse::Echo
『假装以后会去学习算法的样子』 但即使以后会一点这种幼稚园算法,也不能达到我想要的高度呢。 看来还需要理解... — 沉思(迫真)了半个小时后稍微有了点理解,学到了
今天试着去理解了一下,回答之前的几个问题

1. Dijkstra 算法到底是怎么做到的、为什么每次要取没访问过的『最近』节点?如果不取最近的可以吗?

Dijkstra 算法的确就是『简单地遍历一次(不算取最小的遍历)』然后就可以得到任意端 A 到端 B 的最短距离
为什么每次要取最近的节点?因为 Dijkstra 算法从『最终开销和』的侧面看(何况每个最终到达算相邻端点距离后,就不能再次访问了),它必须得取和访问过程最相符的『最近』端点开始

比如,这里有一张图

A >1> B
B >2> C
A >4> C
C >1> D


假设 Dij 算过 A 的目标开销后,每次不是取最近,而是取随便一个端点开始
比如,它取到了 C,然后更新目标们的开销。C 此时的开销是 4(这是个危险信号,注意这不是最小开销!)
Dijkstra 算法遍历过程中有一个很重要的性质:每个被『走过』(也即计算邻端点开销)的点,计算邻边的时候都是自己的『最低开销』
然后取 B,此时 C 的开销被更新了(为 3, 可是 C 已经被走过了,这个值无法再传递给 C 的邻居)

这样 C 通过一个非最新的开销 4 达到了 D(5),算法终止

如果『随便』取到了一个当时没有算出路径到达的节点就更 NB 了 — 它所有邻端的距离都被『锁定』为 Infinity,并且如果这个节点是邻端们唯一的前驱,它们就永远“不可达”了 🌚

2. 之前的算法有啥问题?

其实 Dijkstra 算法利用副作用(也可以不用,主要是给每个端点维护『最低开销』)不是不可以使用递归来写
Dijkstra 算法是从『距离』的角度看路径计算,有时候你也可以感觉到它应用了类似快速排序里的『传递』

算法里每次只算一个『最近』端点,更新可达目标的开销,但是通过回溯的思路想,这是在所有『可用前驱』里选择一个(本身开销+链接开销)开销最小的,最终得到的就是整个问题的最优解
这也是算法每次取『最近』(『开销最小的前驱』)端点更新它所有目标开销的原因,如果随便取就炸了

算法『传递』的是路径的开销大小,它使用的『开销』数据得提供一个『加法』操作一个『比较』操作,依此来指导路径开销的选择 — 取最小的
只有所有最近的可达路径被尝试完了,端点才被『访问』,锁定了它邻边的开销(因为端点的『距离』,肯定是比它的前驱们要远的,即便已经有了一个可用路径也是一样)

之前的算法针对 (1) 里的问题也无法得到正确的解,因为它没有使用『最低开销』传递的操作 — 选择所有邻端点访问,并且走过也不能再走
顺序很重要 — 如果第一次走过的时候(确认了以当前端点为前驱的所有节点当前最小开销)该节点本身的开销不是最小的呢?

因为它只是 BFS 而已,所以遇到节点本身被更新的情况,也无法传递下去,也炸了... #Algorithm
https://github.com/lensh/vue-qq #China #dev

ECMAScript + Vue 的 QQ-like IM 实现

技术栈有标明

== 客户端
Vue2
Vuex — 组件状态共享
Vue-Router — 单页路由库
localStorage — 本地持久化存储
== 界面
Vueg — 转场特效
IScroll — 仿『原生』滚动效果
=== 开发工具
Webpack — Web 打包
CSS3(Flex)/SCSS — CSS Preprocessor
ES2015 & Babel — ES6 特性支持(如 async、Promise)

== 传输层
Axios — requests
Socket.io — WebSocket::IO 平等即时传输
jsonp — 跨域请求数据
== 服务端
Express/Koa — HTTP 服务框架
MySQL — 现代关系型数据库 给的附注是比 Mongo 好,因为关系复杂文档型数据库不能胜任
== 部署层
pm2 — process service manager/monitor
nginx — 转发什么的
我数学很菜,而且不懂物理,写不出公式
虽然可以做一点编程,但是写在一个文件里,还那么多动画什么的 一个框架也不用 做不到
duangsuse::Echo
#Android https://github.com/LineageOS/android_frameworks_base/tree/cm-14.1/packages/SystemUI/src/com/android/systemui/egg 膜
赏析(使用了后来的 M Land,因为这个版本的逻辑不如后来的清晰) #CG

private static float 
luma
(int bgcolor) {
return 0.2126f * (float) (bgcolor & 0xFF0000) / 0xFF0000
+ 0.7152f * (float) (bgcolor & 0xFF00) / 0xFF00
+ 0.0722f * (float) (bgcolor & 0xFF) / 0xFF;
}

灰度函数
private void 
realignPlayers
() {
final int N = mPlayers.size();
float x = (mWidth - (N-1) * PARAMS.PLAYER_SIZE) / 2;
for (int i=0; i<N; i++) {
final Player p = mPlayers.get(i);
p.setX(x);
x += PARAMS.PLAYER_SIZE;
}
}
放置 play

public static final float lerp(float x, float a, float b) {
return (b - a) * x + a;
}

public static final float rlerp(float v, float a, float b) {
return (v - a) / (b - a);
}

public static final float clamp(float f) {
return f < 0f ? 0f : f > 1f ? 1f : f;
}


好像是算加速角度的数学函数

public void 
step
(long t_ms, long dt_ms, float t, float dt) {

单步
19_8安排.txt
2.6 KB
#dev 2019 八月新安排
GAPP项目.txt
2.2 KB
#GeekApk Prototype Project 组成,其中很大一部分(比方说,Literate Kotlin)我都已经打过不少实现稿了(就拿上面那个来说,我都考虑过怎么解析 .kt 文件跨模块引用和拿到其他模块的 html 地址了,也考虑过如何使用 TokenizerRangeMap 进行高亮和加引用/id、多个<code> 如何『视作一起』解析如何『分开来』高亮引用处理操作,staging-intro 主要的内容和布局也想好了)
#Android 最终可行答案

val gesturedet = GestureDetector(object : GestureDetector.OnGestureListener {
override fun onDown(m: MotionEvent) = true
override fun onSingleTapUp(m: MotionEvent) = false
override fun onShowPress(m: MotionEvent) = Unit
override fun onLongPress(m: MotionEvent) = Unit
override fun onScroll(m0: MotionEvent, m1: MotionEvent, dx: Float, dy: Float) = false
override fun onFling(m0: MotionEvent, m1: MotionEvent, vx: Float, vy: Float) = false
})
backcontainer.setOnTouchListener { v, mot ->
v.performClick()
return gesturedet.onTouchEvent(mot)
};
Forwarded from 虚拟歌姬鸢大头🥛
Forwarded from 虚拟歌姬鸢大头🥛
请问我想把绿色的textview的点击、长按、触摸都交给它后面那个linearlayout处理,应该怎么做
shape type="oval":
stroke:
width: 9px
color: white
size: {width: 20px, height: 20px}
Forwarded from 🌞🌞🌞 small2Sun
我这个双向绑定问题在哪?为什么我的布局应用多个ItemView后,一个ItemView的text值修改,其他的值虽然界面没变动,但是获取值的时候,其他ItemView的text值就变成了我修改的值。
#Android Studio IDE 3.5 更新给 XML 自动格式化的时候,因为 XML 过于可配置,不同的 schema 标签顺序语义还不一致,
并且 XML 格式化默认配置导入捉鸡,自动给许多 XML 加上了 Tag arrangement... 导致一些开发者写的文档被迫真『有序』(乱序)
Forwarded from hoshi
自己改配置吧 把xml arrangement 的 tag arrange 去掉
Forwarded from Kanter
使用navigation需要注意的坑:
1、生命周期问题,看源码,navigation是用replace而不是hide+add,且由于加入了回退栈,所以不会执行onDestroy生命周期,但会销毁视图执行onDestroyView。一些和UI相关的解绑操作(比如Rxjava)需要移动到onDestroyView,否则会内存泄露。
2、动画执行问题,setCustomAnimations可以设置四个动画,但动画的执行还是很难受,这应该算是fragment库的问题。像fragment A —>fragment B,A 不动,B从A上面横向进入的效果无法实现,因为A的动画和B的是叠在一起的。
才记得 a / b = c; c * b = a...