https://altair-viz.github.io/gallery/multiline_tooltip.html #Python 当然 Qt 也有 data visualization
C++ 虽然不如『数据处理语言』Python,但扩展可以很厉害(Python 也不过就是把一些 lib 实现的东西加了语法糖而已,C++ 照样很容易写),C++ 也同时支持了宏处理和模板、constexpr 编译期计算,不算是垃圾语言了。
C++ 虽然不如『数据处理语言』Python,但扩展可以很厉害(Python 也不过就是把一些 lib 实现的东西加了语法糖而已,C++ 照样很容易写),C++ 也同时支持了宏处理和模板、constexpr 编译期计算,不算是垃圾语言了。
LetITFly News
https://t.me/drakeets/1605 我认为 Drakeet 的频道没增长多少粉丝的原因有一条是:国内来 Telegram 的 Android 开发者(相对于爱好者(用户)而言)还是太少了。 虽然频道主不喜欢基于微信的公众号/小程序等平台,但频道主能理解并尊重 Drakeet 将后续的技术文章放到知识星球的决定。 经过和 Drakeet 短暂私聊,我了解到: Drakeet 是喜欢 Telegram 这款软件的,他也会继续上 Telegram 接受纯纯写作的反馈等。 频道主在此建议在…
知识星球... 我不知道向不向平台外开放(真正符合 WWW 的概念)
不过我在百度找到了 drakeet 之前的个人博客,现在没被删,当然你们不用通知他去删掉了,如果删了比较可惜,我可懒得再搞事,而且有些东西删了,以后我要重写记起来困难
OutOfMemeory 博客 http://ju.outofmemory.cn/feed/2166/ 这个内容比较多,都是 Android 开发的内容
CSDN 博客 https://blog.csdn.net/drakeet 这个没内容,基本是转载,drakeet 只写了几篇,我居然发现他还学过 C 语言会二进制换算,感动,真想改天我也写一篇分析...
简书 https://www.jianshu.com/users/5c4e75544fc3/timeline (主要是点赞)
https://www.v2ex.com/member/drakeet 基本不上了
🤔 感情不是不会,是学了没用上啊!唉... 怎么都学些不用的东西
不过我在百度找到了 drakeet 之前的个人博客,现在没被删,当然你们不用通知他去删掉了,如果删了比较可惜,我可懒得再搞事,而且有些东西删了,以后我要重写记起来困难
OutOfMemeory 博客 http://ju.outofmemory.cn/feed/2166/ 这个内容比较多,都是 Android 开发的内容
CSDN 博客 https://blog.csdn.net/drakeet 这个没内容,基本是转载,drakeet 只写了几篇,我居然发现他还学过 C 语言会二进制换算,感动,真想改天我也写一篇分析...
简书 https://www.jianshu.com/users/5c4e75544fc3/timeline (主要是点赞)
https://www.v2ex.com/member/drakeet 基本不上了
🤔 感情不是不会,是学了没用上啊!唉... 怎么都学些不用的东西
duangsuse::Echo
知识星球... 我不知道向不向平台外开放(真正符合 WWW 的概念) 不过我在百度找到了 drakeet 之前的个人博客,现在没被删,当然你们不用通知他去删掉了,如果删了比较可惜,我可懒得再搞事,而且有些东西删了,以后我要重写记起来困难 OutOfMemeory 博客 http://ju.outofmemory.cn/feed/2166/ 这个内容比较多,都是 Android 开发的内容 CSDN 博客 https://blog.csdn.net/drakeet 这个没内容,基本是转载,drakeet…
#bin 然后为了证明我不比 drakeet 差,只是缺少拿来实践的时间, 我分析一下这篇文章《5分钟学会十进制转换成二进制的快速口算方法 & Java输出二进制的代码》,然后就睡觉。
当然,至于 Android 那一套,比如异步、Timer、MessageDriven、Android XML、Android Widgets、Resources、Android Gradle Build 集成、库打包、封装、Android Layouts、Views、Paint、Android Layout Animations、组件化、接口、持久化、SQLite、HTTP、Reactive、Activities 和之间的信息传递、Android IPC、MVP、Databinding、List model view、多线程等套路,还有平常的编程技巧,诸如 Annotation 什么的,都是次要,反正你们记得我被 drakeet 喷了而且看他那个反应很不爽就是了。我就是这性子。而我就自负地觉得我能比他会得多。 😝
虽然我不能在 5 分钟内看完这篇文章也不能在一分钟内为 CPython 和红姐加持的 Python 加上多行 lambda,但我有的是时间学。
首先作者举例
toHex(35) =
0x10 * 35 / 16 +
35 % 16 * 0x1
= 0x23 (这个是我靠着对 Nat 的理解强行猜的,当然我用别人教的方法也不差)
toHex(100)
= 16 * 6 + 4
= 0x64
toHex(1024)
= 16 * 64
= (需要进位64 = 16*4) 0x400
哦,我知道了,原来他是先算出 base=16 进位的数目,然后手动进位...
下面说的有点复杂
0b0001 = 2^0 = 1
0b0010 = 2^1 = 2
0b0100 = 2^2 = 4
0b1000 = 2^3 = 8
为啥要
0x5 = 0x4 + 1 = table[4] (0b0100) + table[1] (0b0001)
0bXXXX pat
0b0 <+8> <+4> <+2> <+1>
按这个 pattern 算,最大和为 15,就是 0xF
至于上面的 0x 0b 什么的,就是 C 风格的 16, 2 rhs literate 支持,我也不知是.... 前面第一位 0 是为了要有一个占位的
307(10)
= 0x1 * 307 %16 +
let _10_0 0x10 * 307 / 16 +
然后我们发现 _10_0 大于 16,可以进位... 该死,我应该递归的,为啥要循环呢?(滑稽)
那么递归用 Haskell 很好写,我们来看看流程,反正我们是在编程:
+ 输入一个数 n,我们要一个 String,和当前进位的数值,它的字符串表示
+ 字符串表示 0x0 - 0xf,分别对应 0-15
+ 那么就有了一个递归程序,可是,算法是:
所谓自然数计数法,就是 0xFFF = (16^2 * 1) + (16 * 1) + 15
好吧,还不直觉,是 11 = 10 +1, 100 = 10^2*1 + 10^1*0 + 10^0*0
言而总之,就是把一个数化为数位相加的形式,这个过程中,如果我们用类似 C 的结构化方法,就是:
那么我们来验证算法的正确性(一定程度上,你们都知道我在熬夜并且是算法垃圾)
307
= (算个位) 递归 (307-16^1) + 3 (16 余数,要进位的数)
= (16^1) 递归 (259-16^2) + 3*0x10 |(16^0) +3
= (16^2) |+3*0x10 |+3*0x1
🤔 ... 看来没写出来呢。我还是手算算了
307
先算 307 mod 16 = 3 (个位)
算进位 (307 - 307 mod 16) / 16 = 19
19 大于 16,再次进位到 0x100 "1",16^1 位为 19 - 16 "3"
综合,得到 0x100*1+0x10*3+0x1*3 = 133(16) = 307(10)
然后再算 toBinary(0x133)
考虑一下 4 位最大达到 8 + 4 + 2 + 1 = 15,完全不够,所以 drakeet 之前教的速算... 不得不说对这个没用
那么就继续往下推,下一个 "8 4 2 1" 是
那好喽,就这么算呗,我自己曾经也造过这表...
0x133
= 128 + 5
= 1000 0000
| 0101
= 1000 0101
完成了!
然后再去做就可以了,『并行化』乘除法计算
那么就是这样,不过我觉得就是个口算优化...
最后 drakeet 写了个 Java 的输出 int32 binary digit,每 4 位一个空格的程序,其实也可以用 C 写一个(其实嘛位运算很入门的,还不如他上面教的算法有趣...),我写
[DuangSUSE@duangsuse]~% ./digit 256
Got 256
0000 0000 1000 0000 0000 0000 0000 0000
[DuangSUSE@duangsuse]~% ./digit 1
Got 1
1000 0000 0000 0000 0000 0000 0000 0000
当然,至于 Android 那一套,比如异步、Timer、MessageDriven、Android XML、Android Widgets、Resources、Android Gradle Build 集成、库打包、封装、Android Layouts、Views、Paint、Android Layout Animations、组件化、接口、持久化、SQLite、HTTP、Reactive、Activities 和之间的信息传递、Android IPC、MVP、Databinding、List model view、多线程等套路,还有平常的编程技巧,诸如 Annotation 什么的,都是次要,反正你们记得我被 drakeet 喷了而且看他那个反应很不爽就是了。我就是这性子。而我就自负地觉得我能比他会得多。 😝
虽然我不能在 5 分钟内看完这篇文章也不能在一分钟内为 CPython 和红姐加持的 Python 加上多行 lambda,但我有的是时间学。
大一寒假的时候我在学校里学C语言的补码时候学会了一种十进制换成二进制的方法,不知道学计算机的是不是也是这么算的,感觉比高中数学课教的那除2取余的方法快多了,而且容易掌握和不需要笔算。。。
首先我要吐槽一下,要知道计算机怎么算,为啥不看 libc source?不过一般都是取余的... 取余我不知道机器层面怎么实现的,据说是靠逻辑位移动?首先作者举例
toHex(35) =
0x10 * 35 / 16 +
35 % 16 * 0x1
= 0x23 (这个是我靠着对 Nat 的理解强行猜的,当然我用别人教的方法也不差)
toHex(100)
= 16 * 6 + 4
= 0x64
toHex(1024)
= 16 * 64
= (需要进位64 = 16*4) 0x400
哦,我知道了,原来他是先算出 base=16 进位的数目,然后手动进位...
看出规律了吗?因为16进制的每一位可以对应4位的二进制数,... 我这么说可能十分不清楚,但也懒得去想更好的表达方法了,如果有人看不懂再说嗯,这个本频道之前也提到过,至少我教过你们手动编码 base64,想来也不可能不告诉过你们 0x 是 0b 的简记法,因为 2^8 = 4*4 = 16, 或者说 log2(16) = 4
下面说的有点复杂
四位二进制数分别是8 4 2 1,比如说,16进制的3,就是2+1,就是0011,16进制的5,就是4+1,就是0101,意思就是说每一位16进制数都可以表示为8,4,2,1这四个数字的加和,若使用到,则该位为1不使用为0。我这么说可能十分不清楚,但也懒得去想更好的表达方法了,如果有人看不懂再说我给个 table,就是说单纯四位二进制(之中一位为 1,其他都 0)
0b0001 = 2^0 = 1
0b0010 = 2^1 = 2
0b0100 = 2^2 = 4
0b1000 = 2^3 = 8
为啥要
(-1) 是因为我们算的是进位,看不懂算了(其实不是的,是我弄错 factorial 的定义了,后来改正了)(我也不清楚,爱因斯坦说过,如果你不能把道理给小孩子解释明白,那你自己也不懂,这是说我自己)。比如说,16进制的3,就是2+1,就是0011,16进制的5,就是4+1,就是0101,意思就是说每一位16进制数都可以表示为8,4,2,1这四个数字的加和,若使用到,则该位为1不使用为00x3 = 0x2 + 1 = table[2] (0b0010) + table[1] (0b0001) (这是 16 到 2 快速换算法,类似乘法口诀,你尝试把数 n 与表中最近的整位相减,然后把余数这么做...)
0x5 = 0x4 + 1 = table[4] (0b0100) + table[1] (0b0001)
0bXXXX pat
0b0 <+8> <+4> <+2> <+1>
按这个 pattern 算,最大和为 15,就是 0xF
至于上面的 0x 0b 什么的,就是 C 风格的 16, 2 rhs literate 支持,我也不知是.... 前面第一位 0 是为了要有一个占位的
那么按照这个规律,你现在可以来尝试算一下十进制的307等于多少就是
toBin(toHex(307)),我算算307(10)
= 0x1 * 307 %16 +
let _10_0 0x10 * 307 / 16 +
然后我们发现 _10_0 大于 16,可以进位... 该死,我应该递归的,为啥要循环呢?(滑稽)
那么递归用 Haskell 很好写,我们来看看流程,反正我们是在编程:
+ 输入一个数 n,我们要一个 String,和当前进位的数值,它的字符串表示
+ 字符串表示 0x0 - 0xf,分别对应 0-15
+ 那么就有了一个递归程序,可是,算法是:
所谓自然数计数法,就是 0xFFF = (16^2 * 1) + (16 * 1) + 15
好吧,还不直觉,是 11 = 10 +1, 100 = 10^2*1 + 10^1*0 + 10^0*0
言而总之,就是把一个数化为数位相加的形式,这个过程中,如果我们用类似 C 的结构化方法,就是:
arg n
base = 16
var outs
ret n
for d = map (factorial base) (1..)
var r = n % d — rest
n = tailrec(n / (n-r)
)
outs « toHexDigit(n) « toHexDigit(r) — 一个是进位的,就需要递归,一个是剩下本位的那么我们来验证算法的正确性(一定程度上,你们都知道我在熬夜并且是算法垃圾)
n = 100
for, d = 16^1 = 16
r = 4
n = 6
outs = "0x64" 🤔 那就暂时认这个,虽然我知道它不对... 管他呢307
= (算个位) 递归 (307-16^1) + 3 (16 余数,要进位的数)
= (16^1) 递归 (259-16^2) + 3*0x10 |(16^0) +3
= (16^2) |+3*0x10 |+3*0x1
🤔 ... 看来没写出来呢。我还是手算算了
307
先算 307 mod 16 = 3 (个位)
算进位 (307 - 307 mod 16) / 16 = 19
19 大于 16,再次进位到 0x100 "1",16^1 位为 19 - 16 "3"
综合,得到 0x100*1+0x10*3+0x1*3 = 133(16) = 307(10)
然后再算 toBinary(0x133)
考虑一下 4 位最大达到 8 + 4 + 2 + 1 = 15,完全不够,所以 drakeet 之前教的速算... 不得不说对这个没用
那么就继续往下推,下一个 "8 4 2 1" 是
reverse . take 10 $ (2^) <$> [0..]
128,64,32,16那好喽,就这么算呗,我自己曾经也造过这表...
0x133
= 128 + 5
= 1000 0000
| 0101
= 1000 0101
完成了!
最后,再检验一下,我们可以反过来算一遍,比如随便拿一个二进制数,0101 1111 1110 这个数换成十进制是多少呢?你肯定不会再拿笔来算各位成于2的n次方的加和吧
0101 1111 1110 = 0x500 + 0xF0 + 0xE = 0x5FE然后再去做就可以了,『并行化』乘除法计算
那么就是这样,不过我觉得就是个口算优化...
最后 drakeet 写了个 Java 的输出 int32 binary digit,每 4 位一个空格的程序,其实也可以用 C 写一个(其实嘛位运算很入门的,还不如他上面教的算法有趣...),我写
#include <stdio.h>#C
#include <stdint.h>
#include <stdlib.h>
int main(int argc, char *argv[]) {
if (argc != 2) return -1;
int32_t n = atoi(argv[1]);
fprintf(stderr, "Got %i\n", n);
char digit;
// output binary
for (short int processing_bit = 0; processing_bit < 32; processing_bit++) {
digit = 0b1 & (n >> processing_bit); // little endian reverse
if (processing_bit %4 == 0 && processing_bit != 0) printf(" ");
printf("%d", digit);
}
printf("\n");
}
[DuangSUSE@duangsuse]~% ./digit 256
Got 256
0000 0000 1000 0000 0000 0000 0000 0000
[DuangSUSE@duangsuse]~% ./digit 1
Got 1
1000 0000 0000 0000 0000 0000 0000 0000
duangsuse::Echo
#bin 然后为了证明我不比 drakeet 差,只是缺少拿来实践的时间, 我分析一下这篇文章《5分钟学会十进制转换成二进制的快速口算方法 & Java输出二进制的代码》,然后就睡觉。 当然,至于 Android 那一套,比如异步、Timer、MessageDriven、Android XML、Android Widgets、Resources、Android Gradle Build 集成、库打包、封装、Android Layouts、Views、Paint、Android Layout Animat…
啊今天早上想了一会,发现我还是错了,首先我要改一下输出二进制位的,虽然我知道真的是输出弄反了...(昨天就知道,因为我完全有能力在脑中把循环过程和位移动『可视化』要不然我也没法编程了)
我准备用 Haskell 定义一下
fromBaseN(16)(0xFF)
= digit('F') * 16^0 + digit('F') * 16^1
= 15*16 +15
= 255
第一种方法是取余判定,一次输出两位的数字(本位的,进位的,判断是否还要再进位,然后剩下的 (* base) 递归)
第二种方法比较慢,就是判定是否大于等于 base(可以进位),算出本位的(如果可以进位,本位自然是 0xF),然后减法递归
简而言之,就是(为了方便暂时只支持 16 进制)
如果不用进位,则输出当前位然后加一个
toHex(1024)
= 16 * 64
= (16^2) * 64
= 16*16 * 64
= (需要进位 64 = 16*4) 0x400
我都懒得实现了...
最后就是十六进制转换速算的问题,drakeet 教了大家 10->16 和快速 16->2, 2->16 什么的,当然其实原因就是『16 进制是 2 进制的简单形式』了(我从某本书看的,本频道之前也说过)
大概就是 2^4 = 16... 但是 log2(10) 不是整数不能直接对应,如果这么换算了可以节省手算时间了,至于电子机器怎么算和笔算无关
==
做完了我会开始写(GeekSpec 暂时放一下,我想写点代码)DJson (支持各种流哦,JSE 封装的,包括 Http 的)和 NaiveCat,当然我还是想先写个 Binary Stream Editor 的,,, 支持 byteorder 就可以了,因为 BinaryStreamIO 的状态的确有点多...
大概我会尝试把假期拖到明天中午,这样我就有一天半的时间(足足比别人多放一天半!别人周日早就去上学了,我可以拖到周一中午)
... 计划一直来都是『入不敷出』一样... 宿命吧,啥时候大学(迫真,专科,但是我不虚,因为我可以自学 self-teaching) #China #School #life 🤔🏫
// for atoi啊真垃圾居然改了我半天,虽然开始第一个程序也可以接受... 简单的位运算而已,还没用 lowbit 呢,我开始怀疑人生了
#include <stdlib.h>
// for std io
// 就不用 C++ iostream 了
#include <stdio.h>
#include <stdint.h>
#include <stdbool.h>
/*inline*/ bool get_i32_bitflag(int32_t x, int8_t bitoffset) {
const int32_t bitselector = 0x01000000; // little endian
return x << bitoffset & bitselector;
}
void print_bits(int32_t x, int8_t count) {
for (int i = 0; i < count; i++) {
if (i %4 ==0 && i !=0) printf(" ");
if (get_i32_bitflag(x, i)) printf("1");
else printf("0");
}
printf("\n");
}
int main(int argc, const char *argv[]) {
if (argc < 2) return -1;
int32_t n = (int32_t) atoi(argv[1]);
print_bits(n, 32);
return 0;
}
我准备用 Haskell 定义一下
fromBaseN, toBaseN 两个函数,使用两种方法fromBaseN 没啥好说的,就是一位一位加而已fromBaseN(16)(0xFF)
= digit('F') * 16^0 + digit('F') * 16^1
= 15*16 +15
= 255
toBaseN 有两种方法,我彻底想通了怎么递归第一种方法是取余判定,一次输出两位的数字(本位的,进位的,判断是否还要再进位,然后剩下的 (* base) 递归)
第二种方法比较慢,就是判定是否大于等于 base(可以进位),算出本位的(如果可以进位,本位自然是 0xF),然后减法递归
简而言之,就是(为了方便暂时只支持 16 进制)
toBaseN' n x d
| x >= (n^d) = "F" : toBaseN' n (x - n^d) (succ d) — carry
| digitChar(x) : "h"
: []
如果要进位,则输出一个当前的最高位(F)然后递归下去如果不用进位,则输出当前位然后加一个
"h"
当然还有一种方法,就是 drakeet 这篇文章教的,就是先算不能进位的余数,然后再去算进多少位,然后再去算进多少位... 好吧,这是笔算法toHex(1024)
= 16 * 64
= (16^2) * 64
= 16*16 * 64
= (需要进位 64 = 16*4) 0x400
我都懒得实现了...
最后就是十六进制转换速算的问题,drakeet 教了大家 10->16 和快速 16->2, 2->16 什么的,当然其实原因就是『16 进制是 2 进制的简单形式』了(我从某本书看的,本频道之前也说过)
大概就是 2^4 = 16... 但是 log2(10) 不是整数不能直接对应,如果这么换算了可以节省手算时间了,至于电子机器怎么算和笔算无关
==
做完了我会开始写(GeekSpec 暂时放一下,我想写点代码)DJson (支持各种流哦,JSE 封装的,包括 Http 的)和 NaiveCat,当然我还是想先写个 Binary Stream Editor 的,,, 支持 byteorder 就可以了,因为 BinaryStreamIO 的状态的确有点多...
大概我会尝试把假期拖到明天中午,这样我就有一天半的时间(足足比别人多放一天半!别人周日早就去上学了,我可以拖到周一中午)
... 计划一直来都是『入不敷出』一样... 宿命吧,啥时候大学(迫真,专科,但是我不虚,因为我可以自学 self-teaching) #China #School #life 🤔🏫
duangsuse::Echo
#bin 然后为了证明我不比 drakeet 差,只是缺少拿来实践的时间, 我分析一下这篇文章《5分钟学会十进制转换成二进制的快速口算方法 & Java输出二进制的代码》,然后就睡觉。 当然,至于 Android 那一套,比如异步、Timer、MessageDriven、Android XML、Android Widgets、Resources、Android Gradle Build 集成、库打包、封装、Android Layouts、Views、Paint、Android Layout Animat…
duangsuse::Echo
#bin 然后为了证明我不比 drakeet 差,只是缺少拿来实践的时间, 我分析一下这篇文章《5分钟学会十进制转换成二进制的快速口算方法 & Java输出二进制的代码》,然后就睡觉。 当然,至于 Android 那一套,比如异步、Timer、MessageDriven、Android XML、Android Widgets、Resources、Android Gradle Build 集成、库打包、封装、Android Layouts、Views、Paint、Android Layout Animat…
其中有一部分弄错了,我还以为 base16 只能表示 base2,base2 不能表示 base16,所以 16 -> 2 不能快速笔算,其实不是这样的(当然是可以这么算的,因为 16 = 4 * 2 * 2 呢,要不然不该是等号)
0x133
= toBinary(0x1) * 0b1000_0000
+ toBinary(0x3) * 0b1000
+ toBinary(0x3) * 0b1
= 0b0001_0000_0000
| 0b0000_0011_0000
| 0b0000_0000_0001
= 0b0001_0011_0001
如果还有错误的,请赐教 #fix 🐱
0x133
= toBinary(0x1) * 0b1000_0000
+ toBinary(0x3) * 0b1000
+ toBinary(0x3) * 0b1
= 0b0001_0000_0000
| 0b0000_0011_0000
| 0b0000_0000_0001
= 0b0001_0011_0001
如果还有错误的,请赐教 #fix 🐱
duangsuse::Echo
#bin 然后为了证明我不比 drakeet 差,只是缺少拿来实践的时间, 我分析一下这篇文章《5分钟学会十进制转换成二进制的快速口算方法 & Java输出二进制的代码》,然后就睡觉。 当然,至于 Android 那一套,比如异步、Timer、MessageDriven、Android XML、Android Widgets、Resources、Android Gradle Build 集成、库打包、封装、Android Layouts、Views、Paint、Android Layout Animat…
最后一句(我懒得再看 drakeet 的博客和文章什么的了,怕又引起撕逼,虽然我对技术还是很客气的... 而且现在我不虚,除了要和我谈 Monad 和范畴论图论线性代数什么的):
我才知道 drakeet 使用的排序算法是从大学的时候改的... 而且他还学过 Objc 和 iOS 开发...
https://blog.csdn.net/drakeet/article/details/12948029 👈 here, 《还是用csdn吧》
那么我这周最后谈一下这个博文最后提的问题,太久流于一个话题对我来说也不好。
我发现,其实酷安开发者们大学生也不少。by_syk 应该也是大学生吧
作者:drakeet
我们用伪代码描述一下,反正我们不再乎是 Objc、Swift 还是 C++ 是吧?因为交换排序本来就应该是任何正常编程语言都能写的,Haskell 靠
那么不对在哪里?假设我们有一个列表
那么这个算法(我写的,不是原算法...)其实就是简单交换排序... 是没问题的(迫真,其实有问题... 比如
那么问题来了,到底为啥一半有序一半无序?因为我开始看错了...
count = 4
i = 0
j = 1 — j 不可能 greaterThan count,因为所有 i 循环中的 j (aka. succ i) 在 range bound
swap([4,3,2,1], 0, 1)
i = 1
j = 2
swap([3,4,2,1], 1, 2)
i = 3
j = 4
swap([3,2,4,1], 3, 4)
(endfor)
然后你们看到了,后来 drakeet 也在 LayoutFormatter 里觉悟了原来交换步长只有 1 啊!逆序对只是个 pair,更大的逆序是无法靠交换相邻项消除的,所以用了一个
我才知道 drakeet 使用的排序算法是从大学的时候改的... 而且他还学过 Objc 和 iOS 开发...
https://blog.csdn.net/drakeet/article/details/12948029 👈 here, 《还是用csdn吧》
那么我这周最后谈一下这个博文最后提的问题,太久流于一个话题对我来说也不好。
我发现,其实酷安开发者们大学生也不少。by_syk 应该也是大学生吧
NSNumber *temp = [[NSNumber alloc] init];---------------------
//「从小到大」排序
for (NSInteger i = 0; i < aHundredArray.count - 1; i++) {
for (NSInteger j = i+1; j > aHundredArray.count; j++) {
if (aHundredArray[j] < aHundredArray[j-1]) {
temp = aHundredArray[j-1];
aHundredArray[j-1] = aHundredArray[j];
aHundredArray[j] = temp;
}
}
}
作者:drakeet
我们用伪代码描述一下,反正我们不再乎是 Objc、Swift 还是 C++ 是吧?因为交换排序本来就应该是任何正常编程语言都能写的,Haskell 靠
forM_, (!!) 都能写(或许吧)var ary[n]怎么样,好看吧?这是个『不能使用』的交换排序算法,交换比较谓词函数为
predicate x y = not $ x `lessThan` y
for i in ary.indicesWithoutLast |>
local suc_i = i +1 — next item index
if (ary[i] `predicate` ary[suc_i]) swap(ary, i, suc_i)
(not · lessThan),换句话说,我们认为列表应该是 [a(<b), b (<c), c] 才对,否则就交换索引致使它成那样。那么不对在哪里?假设我们有一个列表
[1, 3, 4] 排序结果显然是正确的,因为它不需要消除任何逆序对[4, 1, 3] 在 i = 0 的时候,我们消除了一个逆序对 [4, 1] 成 [1, 4],然后 i = 1 结束循环时 [4, 3] 也被消除,得到有序列表那么这个算法(我写的,不是原算法...)其实就是简单交换排序... 是没问题的(迫真,其实有问题... 比如
[4, 1, 3, 2] 就不能排序,因为它不足以把 2 交换到顶部,至于数据模式,就是 [d, a, b, c], a > b, a > c, d > a, 算法输出只能是 [a, b, c, d]... 好吧我输了,我这么抽象的时候找不出不能排序的... 但我觉得不对,肯定有无法交换到『前面』的模式的)那么问题来了,到底为啥一半有序一半无序?因为我开始看错了...
for (NSInteger i = 0; i < aHundredArray.count - 1; i++)什么魔性循环... 比如对于输入 [4, 3, 2, 1], for
for (NSInteger j = i+1; j > aHundredArray.count; j++)
count = 4
i = 0
j = 1 — j 不可能 greaterThan count,因为所有 i 循环中的 j (aka. succ i) 在 range bound
(0:(count-1)-1+1) 内,(count - 1) 不可能 greaterThan count,j++ 为死代码, 第二个循环不存在,, 看来我上面的是对的swap([4,3,2,1], 0, 1)
i = 1
j = 2
swap([3,4,2,1], 1, 2)
i = 3
j = 4
swap([3,2,4,1], 3, 4)
(endfor)
result = [3, 2, 1, 4]这就是所谓的『排了一半』,我们注意到 3 和 2 是逆序的,因为我们在交换 &2 和 &1 的时候没有考虑到前面有个 3 打破了期望的偏序关系(只知 3 > 2 不知 3 > 1,何况知道手也短无事可做)。
然后你们看到了,后来 drakeet 也在 LayoutFormatter 里觉悟了原来交换步长只有 1 啊!逆序对只是个 pair,更大的逆序是无法靠交换相邻项消除的,所以用了一个
for (i = 0; i < j - 1; i++), 完美duangsuse::Echo via @vote
🎉 那么看完了以上两条消息,不会觉得我智商不如 drakeet 了吧?
anonymous poll
🐱 – 4
👍👍👍👍👍👍👍 100%
👥 4 people voted so far.
anonymous poll
🐱 – 4
👍👍👍👍👍👍👍 100%
👥 4 people voted so far.
LetITFly News
https://t.me/drakeets/1605 我认为 Drakeet 的频道没增长多少粉丝的原因有一条是:国内来 Telegram 的 Android 开发者(相对于爱好者(用户)而言)还是太少了。 虽然频道主不喜欢基于微信的公众号/小程序等平台,但频道主能理解并尊重 Drakeet 将后续的技术文章放到知识星球的决定。 经过和 Drakeet 短暂私聊,我了解到: Drakeet 是喜欢 Telegram 这款软件的,他也会继续上 Telegram 接受纯纯写作的反馈等。 频道主在此建议在…
drakeet 真的是喜欢 Telegram, 我注意到他之前(大学那段时间)的博客有一篇是安利别人 Telegram 的和夸 Telegram 的
至于放文章到微信(其实不是,后来我注意到是一个支持知识付费和互动的知识社群, 半独立平台)... 大可不喷,因为现在的确有不少国内『开发』圈里的人用微信,可惜的就是得用手机号才能看
至于放文章到微信(其实不是,后来我注意到是一个支持知识付费和互动的知识社群, 半独立平台)... 大可不喷,因为现在的确有不少国内『开发』圈里的人用微信,可惜的就是得用手机号才能看
ju.outofmemory.cn
安利和细数 telegram 的优点 - 为程序员服务
好用, 快, 开源, 安全. 有着很规整甚至可以说精致的 Material Design (Android 版). 作为一个 IM, 该有的功能样样都有,
但却让人感觉轻量流畅. 支持滑动返回 . 支持 Android 5.0 以上的
但却让人感觉轻量流畅. 支持滑动返回 . 支持 Android 5.0 以上的
槽,WebAudio API MediaWrap 播放都有问题,XYVODPlayer 用的 WebAudio 当然也有问题... 看来 Fx 得更新了?
duangsuse::Echo
哦,没问题的是 video API... 🙈
duangsuse 知道的还是太少了啊(说起来这种 streaming player cache 不知道怎么写呢?而且集群计算和网络流就不会
https://www.mdui.org/docs/collapse #gui 一些 animation,比如说 ripple, duangsuse 也没有实现过...
如果动画过程中 touch release, 就立刻展开么... 要不然曲线就会越来越慢?会不会要记录按下的时间,因为按的时长越短涟漪展开速度越快?
如果动画过程中 touch release, 就立刻展开么... 要不然曲线就会越来越慢?会不会要记录按下的时间,因为按的时长越短涟漪展开速度越快?
This media is not supported in your browser
VIEW IN TELEGRAM
#GeekApk 最后我吐槽一下,然后去写 DJson 吧(浪费了太多时间,DJson 还要写一 TextInputStream 代理呢... 虽然不需要 parser combinator
欸话说刚才看的时候又见到了汉语机器学习 + 歌声合成的实例... 即使在 B 站...
这年头啥都逃不过浮点计算... 😕
NVIDA 的高性能计算库 OpenSeq2Seq: toolkit for distributed and mixed precision training of sequence-to-sequence models
可以用于语音识别和合成、自然语言建模处理等流行操作...
这年头不想当码农难啊,要不然就得学习『使用』一些自己看不懂的东西,做『用户』... 😐
—
> 我主要想看看谁会继续领导
> 否则就是瞎写嘛
< 没有生产力,活不下去,哪里有闲心政治,就像一群没有自理能力的人无法组成社会一样
—
这是前几个星期我在凉了的 GeekApk user 讨论组看到的一小段消息
🤔 duangsuse 想关于这些『创业』系信息技术『从业者』发表一些自己的看法。
🗒 此广播不应在任何程度、任何侧面上被理解为对『创业』的不敬、对群不对人,请勿对号入座。
——
GeekApk 嘛... 一些人可能以为是我自己开始想搞出这个坑来叫一群仇酷安(当然,也可以说,是“恨铁不成钢”,可惜我们并不拥有酷安,呵呵)的人一起填或者要组队破坏酷服务的(GeekApk 组曾经是有一次被拿来组织了一次 DoS,目标是酷安的静态页面,并且导致了主要酷服务(这里分为 coolapk.com, dl.coolapk.com, api.coolapk.com, 主服务是说 coolapk.com 主站)宕机半小时,当然,也有可能是酷安本身土豆服务器过于辣鸡导致的,我不是此活动的策划者,甚至不是 GeekApk 的『管理者』,也不能算是『创建者』,对酷安的『失去初心』亦无仇视心态)
其实真的不是,我开始比较 naive(正如当初我以为,why Rust? It's fast!),就是想自己弄一个,本来的『项目』是 Dropage,虽然只有一个『蓝皮书』(现在可以说是『烂』了,呵呵)
后来呢,就不得不提到 @iVanilla (现在 Deleted 了... 或许是主动删号的吧,或许... 😶) 弄出了 GeekApk 项目(我自己不想咸得没事去组织一群人弄这种事情,虽然他说是自己早有想法,但是我在某小群里提到自己的打算后再找我私聊讨论并且建立 GeekApk 的,虽然我开始天真无邪 Too young too simple, 但是也不至于捅出这个篓子,因为我打算自己弄,弄完了... 呃... 我觉得照那个样子啥都弄不完),不得不承认他是很好的进行了一些『商业』上的帮助,并且讨论了一些『商业』上的东西... 可惜后来 GeekApk 是这样,那么我这条广播,是想告诉你们为啥它『咕咕』了,为啥会是这样而不是我们都认为的皆大欢喜 good ending — 大家齐心协力弄出了类似酷安的东西,然后欢天喜地地入驻进去,开始的人全成了 GeekApk 里最 dalao 的权限,然后本来『屈居』在酷安的人也都过来了,本来只知酷安的人后来也注册了 GeekApk 帐号,GeekApk 一周年,大家都高喊 GeekApk 万岁万岁万万岁... 还要成立什么米国美国公司,拉赞助... 😶
嗯,drakeet 曾经直白地批判过 GeekApk,除了他无视本组都是一群运维菜鸡而且我仍在学习之外(恕我直言,而且也未必有人维护着多大的集群,体验过什么分布式架构和高性能计算技术)『空壳』我还是很认同的,当然不要以为我也顺带着『仇视』他,我对技术比对人更感兴趣,看问题一向对事不对人。
https://github.com/GeekApk 到现在真正的错误,上面『幼稚和空壳』已经能很好地概括出来了
有些人说 GeekApk 错在用爱发电,在我看来真正致命的却是另一个缺口:用爱发电,其实也未必不可,在自己的业余时间(可能足够长)里做想做的事情,在自己的经济能力范围内要求必要的服务,本来就是人生的一大乐事,可是那个 GeekApk 却是要你用不断咕咕叫🐦的空头支票去给『酷安变质』的信仰充值,这就不行了。
信仰自然还是要有的,可是有一天没有依附的希望终将消散,光靠信仰光环,画饼充饥,能扛过一天,扛得过一年么?
所谓的项目,没有拥有基本技术能力的参与者,没有能做实事的人,就好比一台没有电源的机器,连动力都没有,你说它该怎么工作?靠推吗?你说没有人有能力写代码的『网络技术公司』靠什么去做项目、做产品、做平台、占领『市场』?靠『xxxx 天内出 OO』的承诺吗?
崇才科技。大家都认为是吹的,可是,没有那些抄来、改来的『产品』,想来媒体要炒作,光靠某泽的学历怎么这么高,故事怎么这么大佬,也无物可炒啊?00 后开公司,前浪死在沙滩上啊,哇好厉害,可是有啥东西做出来呢?
没有?那有啥好说的?
可是他们这群脚本小子,『自己动手』(“丰衣足食”)『做』出来了『崇才』课表、『崇才』萌狼输入法,加上『无薪资』『QQ 群』等『企业』 flag,就像是真正的 SOHO(Small Office Home Office) 公司了,何况还有名分的,不是么?
而 GeekApk 还要降一档次,因为名分上的东西都没有,我们也没人『自己动手』去把酷安复制一下(这种程度能力的人都没有,好吧,的确有一个高性能计算的大佬被我『赶跑』了... 其实那时候 GeekApk 连个设计本本都没有,不像 R 还有个第一版明确定义),没有一个拿来骗人的『酷极安』『产品』,也没一个 50w 资本的注册公司和大手子转发评论,最后当然是烟消云散啥都没留下。(呵呵
GeekApk 需要的是什么?是白皮书、贷款、基金、股票、融资、股票期权、资金链、生态圈?是项目?是员工、运维、CTO、CIO、CEO、COO?是 “用 Trello”、“用 Rails”、“用 Laravel”、”用 Go“、“用 Vue”、“用 OO”?是 “不能『抄』酷安”“即使身死绝不自我审查”?它们都出现过,都消失了,说到底,『产品』的核心还是靠着软件工程实战的程序逻辑,其他的,『一步到位』、测试、文档、打包、可读性、可扩展性、可维护性、健壮性,编程技巧,都是次要,『库』的核心还是抽象、架构和算法,『应用程序』的核心还是业务逻辑,产品的核心还是你要提供的东西本身,其他的,在没有一个存在的展开基础的时候,都是一纸空谈。
著名计算机科学家沃思(NiklausWirth)提出一个公式:
是灵魂啊!你到底想干什么?你知道吗?
在你还没学会走好路之前,不要被眼前斑驳陆离的世界迷惑,拒绝政治、拒绝形式主义,就是给自己一个更广阔的天空。
— duangsuse, Sun Apr 21, 2019
欸话说刚才看的时候又见到了汉语机器学习 + 歌声合成的实例... 即使在 B 站...
这年头啥都逃不过浮点计算... 😕
NVIDA 的高性能计算库 OpenSeq2Seq: toolkit for distributed and mixed precision training of sequence-to-sequence models
可以用于语音识别和合成、自然语言建模处理等流行操作...
这年头不想当码农难啊,要不然就得学习『使用』一些自己看不懂的东西,做『用户』... 😐
—
> 我主要想看看谁会继续领导
> 否则就是瞎写嘛
< 没有生产力,活不下去,哪里有闲心政治,就像一群没有自理能力的人无法组成社会一样
—
这是前几个星期我在凉了的 GeekApk user 讨论组看到的一小段消息
🤔 duangsuse 想关于这些『创业』系信息技术『从业者』发表一些自己的看法。
🗒 此广播不应在任何程度、任何侧面上被理解为对『创业』的不敬、对群不对人,请勿对号入座。
——
GeekApk 嘛... 一些人可能以为是我自己开始想搞出这个坑来叫一群仇酷安(当然,也可以说,是“恨铁不成钢”,可惜我们并不拥有酷安,呵呵)的人一起填或者要组队破坏酷服务的(GeekApk 组曾经是有一次被拿来组织了一次 DoS,目标是酷安的静态页面,并且导致了主要酷服务(这里分为 coolapk.com, dl.coolapk.com, api.coolapk.com, 主服务是说 coolapk.com 主站)宕机半小时,当然,也有可能是酷安本身土豆服务器过于辣鸡导致的,我不是此活动的策划者,甚至不是 GeekApk 的『管理者』,也不能算是『创建者』,对酷安的『失去初心』亦无仇视心态)
其实真的不是,我开始比较 naive(正如当初我以为,why Rust? It's fast!),就是想自己弄一个,本来的『项目』是 Dropage,虽然只有一个『蓝皮书』(现在可以说是『烂』了,呵呵)
后来呢,就不得不提到 @iVanilla (现在 Deleted 了... 或许是主动删号的吧,或许... 😶) 弄出了 GeekApk 项目(我自己不想咸得没事去组织一群人弄这种事情,虽然他说是自己早有想法,但是我在某小群里提到自己的打算后再找我私聊讨论并且建立 GeekApk 的,虽然我开始天真无邪 Too young too simple, 但是也不至于捅出这个篓子,因为我打算自己弄,弄完了... 呃... 我觉得照那个样子啥都弄不完),不得不承认他是很好的进行了一些『商业』上的帮助,并且讨论了一些『商业』上的东西... 可惜后来 GeekApk 是这样,那么我这条广播,是想告诉你们为啥它『咕咕』了,为啥会是这样而不是我们都认为的皆大欢喜 good ending — 大家齐心协力弄出了类似酷安的东西,然后欢天喜地地入驻进去,开始的人全成了 GeekApk 里最 dalao 的权限,然后本来『屈居』在酷安的人也都过来了,本来只知酷安的人后来也注册了 GeekApk 帐号,GeekApk 一周年,大家都高喊 GeekApk 万岁万岁万万岁... 还要成立什么米国美国公司,拉赞助... 😶
嗯,drakeet 曾经直白地批判过 GeekApk,除了他无视本组都是一群运维菜鸡而且我仍在学习之外(恕我直言,而且也未必有人维护着多大的集群,体验过什么分布式架构和高性能计算技术)『空壳』我还是很认同的,当然不要以为我也顺带着『仇视』他,我对技术比对人更感兴趣,看问题一向对事不对人。
https://github.com/GeekApk 到现在真正的错误,上面『幼稚和空壳』已经能很好地概括出来了
有些人说 GeekApk 错在用爱发电,在我看来真正致命的却是另一个缺口:用爱发电,其实也未必不可,在自己的业余时间(可能足够长)里做想做的事情,在自己的经济能力范围内要求必要的服务,本来就是人生的一大乐事,可是那个 GeekApk 却是要你用不断咕咕叫🐦的空头支票去给『酷安变质』的信仰充值,这就不行了。
信仰自然还是要有的,可是有一天没有依附的希望终将消散,光靠信仰光环,画饼充饥,能扛过一天,扛得过一年么?
所谓的项目,没有拥有基本技术能力的参与者,没有能做实事的人,就好比一台没有电源的机器,连动力都没有,你说它该怎么工作?靠推吗?你说没有人有能力写代码的『网络技术公司』靠什么去做项目、做产品、做平台、占领『市场』?靠『xxxx 天内出 OO』的承诺吗?
崇才科技。大家都认为是吹的,可是,没有那些抄来、改来的『产品』,想来媒体要炒作,光靠某泽的学历怎么这么高,故事怎么这么大佬,也无物可炒啊?00 后开公司,前浪死在沙滩上啊,哇好厉害,可是有啥东西做出来呢?
没有?那有啥好说的?
可是他们这群脚本小子,『自己动手』(“丰衣足食”)『做』出来了『崇才』课表、『崇才』萌狼输入法,加上『无薪资』『QQ 群』等『企业』 flag,就像是真正的 SOHO(Small Office Home Office) 公司了,何况还有名分的,不是么?
而 GeekApk 还要降一档次,因为名分上的东西都没有,我们也没人『自己动手』去把酷安复制一下(这种程度能力的人都没有,好吧,的确有一个高性能计算的大佬被我『赶跑』了... 其实那时候 GeekApk 连个设计本本都没有,不像 R 还有个第一版明确定义),没有一个拿来骗人的『酷极安』『产品』,也没一个 50w 资本的注册公司和大手子转发评论,最后当然是烟消云散啥都没留下。(呵呵
GeekApk 需要的是什么?是白皮书、贷款、基金、股票、融资、股票期权、资金链、生态圈?是项目?是员工、运维、CTO、CIO、CEO、COO?是 “用 Trello”、“用 Rails”、“用 Laravel”、”用 Go“、“用 Vue”、“用 OO”?是 “不能『抄』酷安”“即使身死绝不自我审查”?它们都出现过,都消失了,说到底,『产品』的核心还是靠着软件工程实战的程序逻辑,其他的,『一步到位』、测试、文档、打包、可读性、可扩展性、可维护性、健壮性,编程技巧,都是次要,『库』的核心还是抽象、架构和算法,『应用程序』的核心还是业务逻辑,产品的核心还是你要提供的东西本身,其他的,在没有一个存在的展开基础的时候,都是一纸空谈。
著名计算机科学家沃思(NiklausWirth)提出一个公式:
算法 + 数据结构 = 程序其中算法是程序的灵魂。
是灵魂啊!你到底想干什么?你知道吗?
在你还没学会走好路之前,不要被眼前斑驳陆离的世界迷惑,拒绝政治、拒绝形式主义,就是给自己一个更广阔的天空。
— duangsuse, Sun Apr 21, 2019
Bilibili
最可爱的AI小美女【微软小冰】单曲《我是小冰》_哔哩哔哩 (゜-゜)つロ 干杯~-bilibili
猜 谜时 间:18岁 少女, 处 女座,喜 欢唱歌, 喜欢 写诗,还 喜欢跟你 们聊 天, 天~~问题来 了,今天 发 行单 曲的这位菇凉 是 Sei?