羽毛的小白板
https://www.v2ex.com/t/747735#reply28
“TCP 本来是一个流传输协议(数据不分块,保证有序,也就是只保证多次 recv 的数据依顺序拼起来保持原样),偏要把它当成一个消息传输协议(数据分块,保证有序,保证一次 send 对应一次 recv )来用。
不巧的是在环回网络以及短途网络里调试时,这种误用并不会出问题。”
这个回答挺好的,我目前的理解就是,他们要做 WebSocket 这样的 event listen 式协议,但却手动维护了一个 buffer ,要“粘起来”发 TCP ,然后收方再拆了去 dispatch 。
嗯... 说到 socket ,数据的确没 chunked 而只是 bytestream ,这点我对 C API 引入的 buffers 理解错了,我之前隐隐觉得对方肯定收完 buffer 的内容…… 今后就有经验了
不巧的是在环回网络以及短途网络里调试时,这种误用并不会出问题。”
这个回答挺好的,我目前的理解就是,他们要做 WebSocket 这样的 event listen 式协议,但却手动维护了一个 buffer ,要“粘起来”发 TCP ,然后收方再拆了去 dispatch 。
嗯... 说到 socket ,数据的确没 chunked 而只是 bytestream ,这点我对 C API 引入的 buffers 理解错了,我之前隐隐觉得对方肯定收完 buffer 的内容…… 今后就有经验了
看完感觉懵懵的,动苏是 Kotlin 原住民,写过二进制字节流、字符流的框架,习惯 yield generator 和
表示很困惑什么叫「粘包」「拆包」,难道这两个词可以越过 Protobuf, BSON 这样的 data model 来谈吗?数据和其 representation, serialization 本身关系就不大的,为什么要专门写程序去拼包啊
java.util.Stream 的封装模式及利用,我明白,但根本就不看 static size 的那些东西和 buffers表示很困惑什么叫「粘包」「拆包」,难道这两个词可以越过 Protobuf, BSON 这样的 data model 来谈吗?数据和其 representation, serialization 本身关系就不大的,为什么要专门写程序去拼包啊
Forwarded from dnaugsuz
型变是
协变,
逆变,
(其中
子类型即若有
型变性的意义主要是,定义出符合子类型限制的类型约束,比如 PECS(producer-extends; consumer-super) 原则。
假设你的函数需要接受上一为参数
参数列表多几项、少几项都是一样的,只是要满足必须的类型约束而已。
实践上,就是每个 Producer/Consumer/Function<T, R> 的是用处都必须以
Kotlin 有 in/out 的声明处型变,也就是不用 Java 的 "Type wildcard" 了,是符合理论优雅性和实践便利性的:
在类型约束(如函参)处,
类型(限)上/下界即是指
🖕这个玩意非常易混,涉及一些中英文的文化差异和数学抽象概念的移植,建议不要使用
另外,泛型(generics, aka. parameterized polymorphism 参数化多态) 不是范型、上下界(U/Low bound) 不是上下届 ,千万别拼错。
<T> 参数上面的一种性质,其定义为:协变,
P<T1>: P<T> 逆变,
P<T>: P<T1>
不变, P<T>, P<T1> 无子类型关系。(其中
T1: T 、 class P<T> )子类型即若有
T1: T ,或言 (T)(T1)obj 有效(checks),则 op((T)x) 对 op((T1)x) 照样可用。型变性的意义主要是,定义出符合子类型限制的类型约束,比如 PECS(producer-extends; consumer-super) 原则。
interface Producer<R> { R get(); }
interface Consumer<T> { void accept(T value); } 假设你的函数需要接受上一为参数
er,它必须这样定义才能尽可能兼容「真正能兼容的所有」 er:void <R> R recv(Producer<? extends R> er);
void <T> void send(Consumer<? super T> er, T value); 参数列表多几项、少几项都是一样的,只是要满足必须的类型约束而已。
实践上,就是每个 Producer/Consumer/Function<T, R> 的是用处都必须以
Function<?super T, ?extends R> 这样的方法去定义参数的类型约束,不然它会破坏子类型的类型安全、或使本该有效的程序报类型检查错误,但让程序员去写这些 extends/super 的,实际上这是在暴露与业务逻辑不相干的细节。Kotlin 有 in/out 的声明处型变,也就是不用 Java 的 "Type wildcard" 了,是符合理论优雅性和实践便利性的:
interface Function<in T, out R> { fun apply(value: T): R } 在类型约束(如函参)处,
Function<Int, Any> 自动兼容其 Function<Number, Unit/*或 Nothing? = java.lang.Void, 仅 null*/> 类型(限)上/下界即是指
Void...Object (子类型的)extends/super 的约束,Void 是底,没有实例的类型;Object 是顶,所有类型的父类型,这个东西没有区间只能加限制条件。🖕这个玩意非常易混,涉及一些中英文的文化差异和数学抽象概念的移植,建议不要使用
另外,泛型(generics, aka. parameterized polymorphism 参数化多态) 不是范型、上下界(U/Low bound) 不是上下届 ,千万别拼错。
Oracle
Upper Bounded Wildcards (The Java™ Tutorials >
Learning the Java Language > Generics (Updated))
Learning the Java Language > Generics (Updated))
This beginner Java tutorial describes fundamentals of programming in the Java programming language
Forwarded from dnaugsuz
我字多是因为我明白,想的多一点可以让代码简洁好看点
拿一小篇文字换所有项目里几十文件的质量,值。
拿一小篇文字换所有项目里几十文件的质量,值。
Forwarded from dnaugsuz
有的代码写一行省十行,有的代码所遵循的模式,写了第一行后维护和重读重理解的麻烦不断;即便功能相同,不同的人写出来质量是完全不一样的。
所以我一贯很乐意学习编程之道,可能你觉得我字多些,对真的要学这些内容的人来说,这是我第五次讲相同话题,已经很省字数了。
便宜的就是最贵的,不想付出但想多得回报,很难不为这种心态再付出更大的代价。浪费与节省,大概是这个道理。
所以我一贯很乐意学习编程之道,可能你觉得我字多些,对真的要学这些内容的人来说,这是我第五次讲相同话题,已经很省字数了。
便宜的就是最贵的,不想付出但想多得回报,很难不为这种心态再付出更大的代价。浪费与节省,大概是这个道理。
Forwarded from dnaugsuz
一般对解释(interpret)、编译(compile) 这些的理解是
解析(String到语法树 数据结构)->预处理(脱糖什么的)->类型检查(type check)-> 执行(execute)-解释/代码生成(codegen)-编译
这样吧,没有解释器去编译一说, Java 虚拟机的确不认 T 这些参数,只是 Object 化了而已,字节码只存反射用元数据。
解析(String到语法树 数据结构)->预处理(脱糖什么的)->类型检查(type check)-> 执行(execute)-解释/代码生成(codegen)-编译
这样吧,没有解释器去编译一说, Java 虚拟机的确不认 T 这些参数,只是 Object 化了而已,字节码只存反射用元数据。
#algorithm (感觉自己转发的可能有点奇怪了 🤔)
#cplusplus
不过代码质量真的可以🍎(注: name shadowing 有点不好,我习惯的是同层次相关可以同名...),反观引的等价算法1千行就……
尾调用版亦可写
#cplusplus
std::vector<bitset<N>> rec;
int gcd(int x, int y); void dfs(int o=0, int lst=0); 不过代码质量真的可以🍎(注: name shadowing 有点不好,我习惯的是同层次相关可以同名...),反观引的等价算法1千行就……
gcd(x,y) { while (x %= y/*x取商 若有余数*/) std::swap(x, y); return y; } 这个求公约写法够简洁了 🌝尾调用版亦可写
gcd(x,y) = if (x%y==0) y else gcd(y, x/y)Forwarded from mivik::channels::tech
#gist #string #combinatorics_of_strings #project
计算所有长度为 n 的字符串的自相关位向量(Autocorrelation)
https://gist.github.com/Mivik/6e0459afe6691bce2659e1eaa5141390
没有注释的话只有短短 60 行,并且没有刻意压行,比 某些人 写的 1000 多行版本好多了(写那个的貌似是个学院派,代码里充斥着完全没法编译的怪异头文件以及鬼畜的码风...)
灵感来自于 这篇论文
计算所有长度为 n 的字符串的自相关位向量(Autocorrelation)
https://gist.github.com/Mivik/6e0459afe6691bce2659e1eaa5141390
没有注释的话只有短短 60 行,并且没有刻意压行,比 某些人 写的 1000 多行版本好多了(写那个的貌似是个学院派,代码里充斥着完全没法编译的怪异头文件以及鬼畜的码风...)
灵感来自于 这篇论文
Gist
Enumeration of autocorrelations of length n
Enumeration of autocorrelations of length n. GitHub Gist: instantly share code, notes, and snippets.
duangsuse::Echo
作为开发者,你对「学院派」持什么态度?
#zhihu #plt #china 🤔别看了
[王垠,请别再欺负我们读书少 - 开发者头条](https://toutiao.io/posts/33acp5/preview)
[PLT零基础的人,要看懂王垠和彭飞在《王垠,请别再欺负我们读书少》里讨论的内容,需要掌握哪些知识? - 知乎](https://www.zhihu.com/question/42315543)
[如何评价王垠的新文章《回应CFA传人对我的攻击》? - 知乎](https://www.zhihu.com/question/42333233)
[王垠,请别再欺负我们读书少 - 开发者头条](https://toutiao.io/posts/33acp5/preview)
[PLT零基础的人,要看懂王垠和彭飞在《王垠,请别再欺负我们读书少》里讨论的内容,需要掌握哪些知识? - 知乎](https://www.zhihu.com/question/42315543)
[如何评价王垠的新文章《回应CFA传人对我的攻击》? - 知乎](https://www.zhihu.com/question/42333233)
toutiao.io
王垠,请别再欺负我们读书少 - 开发者头条
开发者头条,程序员分享平台。toutiao.io
duangsuse::Echo
#Python #code 妈耶,看来还是 lambda op_append: 的方法好,虽然带副作用。 总结:新写法省了 gavSplit 和 from itertools import chain ,多了 3*lambda ,优雅性持平。
新写法加了仨 trivial(可省) def ,总觉得不该以行数为全部的... 总行数18 -3 -1(proj 的 for in) = 14 ,最小了吗 🤪
可这个程序以
可这个程序以
a:b:c org.h:a,-w,--w1:1.0 示例输入生成了 35 行输出, 14/35==0.4
duangsuse::Echo
https://github.com/CASC-Lang/CASC 我会一如往常在频道里进行项目结构分析,然后用与 C# 相对的 Java (竟然不是 Kotlin... )进行一些并行的重写工作。 之所以用 #Java 写这样富于技巧的 #CE 编译器 程序,是因为我想常常新口味了…… 一些原来 Kotlin 里有的我也用 TypeScript 重写过 原项目是一个“能编译繁简体中文、甚至英语”的编译器,目标是对简体程序员可用。 ChAoS_UnItY (Chaos Unity) 开发,由 C# minisk…
md.py
594 B
#Python #code 😭 暂时没有找到 Markdown export 的 bot ,就只好基于 @ShowUpdateJsonBot 这个全文 BotUpdate Event JSON dump 机器人,转换下 span
参见依云大佬的 snippet (不对... 这个还带 line_number 的)
参见依云大佬的 snippet (不对... 这个还带 line_number 的)
def applySpans(d, op, coding="utf-8"):这个 range 可以表示成 (pos+length) (iBeg,iEnd) (iBeg,iStop) 很多种方法,其实还是第一种最常见
bs = d["text"]; i0 = 0
addSpan = lambda e: (e["offset"], e["length"], e)
for (i, n, e) in map(addSpan, d["entities"]):
iStop = i+n
yield bs[i0:i]
yield op(e["type"], e.get("url"), bs[i:iStop])
i0 = iStop
def mdify(type, data, text, fmts={"text_link": "[{0}]({1})","hashtag":"{0}"}):
return fmts[type].format(text, data)
#Python #tools #Telegram 这下就有经验了,不会倒大霉!
def join(op): return lambda *args: "".join(op(*args))结果:
@join
def applySpans(d, op, kP="offset", kN="length"):
s = d["text"]; i0 = 0
span = lambda e: (e[kP], e[kP]+e[kN], e)
for (iBeg, iStop, e) in map(span, d["entities"]):
yield s[i0:iBeg]; yield op(e["type"], e.get("url"), s[iBeg:iStop])
i0 = iStop
def transTable(deft="{0}", **d): return lambda tag, data, text: (d.get(tag) or deft).format(text, data)
from json import loads; from sys import stdin
def readJson(): s=stdin.read(); return loads(s[s.index('{'):])
print(applySpans(readJson(), transTable(text_link="[{0}]({1})", code="```{0}```")) )
这个没啥,相关知识: 算符链 [InfixPattern](https://github.com/ParserKt/ParserKt/blob/master/src/commonMain/kotlin/org/parserkt/pat/complex/InfixPattern.kt)/«Lua设计与实现» 相关章节; 中文数值 [NumUnit](https://github.com/ParserKt/ParserKt/blob/37599098dc9aafef7b509536e6d17ceca370d6cf/parserkt-ext/src/commonMain/kotlin/org/parserkt/pat/ext/NumUnitPattern.kt)/[han()](https://github.com/duangsuse-valid-projects/Share/blob/master/Others/CN_constitution.md) #learnGist
Reformat Telegram @ShowUpdateJsonBot Message update json to markdown
Reformat Telegram @ShowUpdateJsonBot Message update json to markdown - tg_md.py
不 excited ,非常不 excited 。
本来是不打算弄这个的,现在弄了,发现效率不知为什么变得很低,大概就是想择机写点小工具而已
可是这个重构真的会很麻烦吧,说好了要休息的
本来是不打算弄这个的,现在弄了,发现效率不知为什么变得很低,大概就是想择机写点小工具而已
可是这个重构真的会很麻烦吧,说好了要休息的
#Python 草生了.... 什么时候能不要挂羊头卖狗肉了,搞得我很怀疑自己能力啊,连个重写都做不到?那么简单的分词器都不会?!
python mvng.py a:b:c org.h:a,-w,--w1:1.0 -dependencyManagement org.junit:--bom,:5.7.0 -plug :wtf -parent org.my:base -module hello -fat -xi 0 -x 'parent=text:a:v' -x '.=eval:listE("contributor",opOnEach(opSetsChild("name"),["a"]) )'GitHub
duangsuse/CASC-Java
A handwritten compiler which can transform English or Manderin, even mixed codes! - duangsuse/CASC-Java