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

技术相干订阅~
另外有 throws 闲杂频道 @dsuset
转载频道 @dsusep
极小可能会有批评zf的消息 如有不适可退出
suse小站(面向运气编程): https://WOJS.org/#/
Download Telegram
#html #learn #dontknow 谈谈 IE 时代开始的 XHTML, HTML4 相关的格式之争吧。

<!DOCTYPE html> 为什么和 <!-- 那么像?其实这个标签是 HTML5 才引入的,类似 ES5 的 "use strict"; 它只是「使用新版格式」的标记

早先的时代,web就好像 (Linux 用户所见的) man pages ,HTML 就像今天看到的 markdown,并不严谨,并没有被广泛采用的规范(对 UI 而言,人杂是 web 的缺陷;心乱是 mobile 的缺陷;框架多是 desktop 的缺陷)

HTML 2,3,4 都是 retro-spec ,即先被广泛实现再有标准,而规范的制订主要是帮助兼容「含错误的网页」(真的搞不懂一些人成天爱 -webkit -moz -egde 前缀 CSS1,3 标准属性的是干什么)

比如说, <br> 和 <br/> 及相同模式的 hr,dt,p 标签,对一些浏览器可能显示,另一些无法兼容,这就导致了客户端(用户代理)差异,而规范统一了错误兼容法,即 HTML 的格式。

W3C 尝试以 XML 规范 HTML ,它指定了 application/xhtml+xml 的强制错误检查格式,但被写惯非 XML 兼容扩展的开发者拒绝了,无奈只能允许用旧 application/html 分发文档,不进行错误检查,只是做了 xml schema 规范。
所以说一些上个时代的网站(比如 gnu.org)声称自己支持 XHTML 1.0,只是说兼容了此规范,并不代表没有使用 undefined behavior 的错误兼容。当然随后 1.0 的附录 C 被取消, xhtml+xml 也不能用了(不向后兼容)

Apple WebKit 和 Gecko, Chrome与Opera 合作的 Blink 等新渲染器取代了 MS IE 的时候, W3C XHTML 2.0 尝试复辟检查的老路,并且完全向 XML 靠拢(众所周知很多应用协议基于 XML 数据建模),竟不向后(前进者的背后!)兼容了!于是 Mozilla&Apple 发起了 WHATWG 规范组,它设计了现在被广泛使用的 HTML5 ,现有引擎支持 H5 不会 break 现有的网页。
Forwarded from duangsuse Throws
#Rust 编程语言 风评被害🌝👍
#info #service #linux 后知后觉 数据变成云了欸
《欧洲最大云服务公司 OVH 法国机房着火:1个数据中心被完全烧毁、部分客户数据完全丢失且无法恢复》
https://www.oschina.net/news/132638/france-ovh-fire

字面意义上的 数据上云
Forwarded from 今日份的豆酱 (TigerBeanst | 想去碎空星)
Forwarded from 神奇的笔记 (立音喵)
Forwarded from 神奇的笔记 (立音喵)
x86 模拟都出来了?!
#Kotlin #design 提问!怎么写 matcher 库呢?

你需要了解如何写可组合的操作,这里是 predicate: (T) -> Boolean ,当然实际上必须维护可阅读的结果报告(String path, Map mismatchs)

接着,考虑是 val 还是 fun,用不用 receiver 参数或带 receiver 参数的 Scope 闭包即可。

组合很简单,用函数的闭包(即 #OOP 对象)拼凑实际表达式
1.match { all(eq(1), lt(5)) } 其中 lt 是 lessThan 的意思。
const eq=a=>b=>(a==b), //lt也是一样模式,除了(b,a)=>(a<b)倒个语序
all=(...ps)=>x=>{ for(let p of ps) if(!p(x))return false; return true; }


咱可以看到,这个「高复用」办法本质只是在隐式化、拼凑参数罢了,其实 ==,!=,<>,in 等二元逻辑算符的引入都是预提供一个参数,等另一个参数 ,而 all, any, none (&|, !|) 则是在组合 Predicate 类型,用 for 循环解释 && 等算符短路(即惰性)求值的语义(any,all 等列表处理操作本是如此性质)。

当然,它们本身也是可被组合的,就像程序结构本身一样;但,原来十行代码的东西就只用写一行了,多快好省。

如果只是这样根本没必要单独开项目,反正计算开销小,可以取消 all 等组合器的部分求值,即便已知 mismatch 也只是存到一个结果报告(Map+path 足矣)里继续测试,这只需要让 all matcher 能知道自己的「路径」并且给子项们接上「新路径」。

只需把只能 apply() 的 function value 变成带构造器和 .var 的 interface ,在构造器里给子项进行 .path= 的「注入」隐式提供其路径,它之后的生命里全复用即可。
不过,这么一来就变成 interface Matcher { var name:String, fun test(x:T, m:Map<String,ErrMsg>) } 了,不需要给父组合器提示返回值了呢。
不过,这也照应了程序本身树穷尽遍历的性质,不再是逻辑表达式的「解释器」了。
Forwarded from Sauro 🍏 邮包在哪里
Forwarded from dnaugsuz
https://t.me/dsuse/16941 早上没起床就写了点相关知识……

嘛其实我觉得 mvc.perform(httpOp).andExpect(matcher) 挺冗余的, mvc.expect(arrayOf(httpOp to matcher)) 合适点

status=>ResultMatcher { AssertionErrors.assertNotEqual("status", status.value(), it.response.status) }

mockMvc.perform(post(path)).andExpect(status().isNotFound) 不能 Matcher.not() 是肯定的,如果要的话需要更改最下层的(==)命题,直接否决(不对…… ParserKt 的问题是 Repeat.not 的肯定要 rewrap ,但是这个的数据类型没有不同(不对,这个靠 ErrList 依然会有变换后否决错误信息缺失的问题……

如果让动苏来设计就不会有这种问题
Forwarded from dnaugsuz
有时候虽然他们只是在吐槽过于简单,我都觉得有点太爱秀了的意思,大概是老「反向偏见」了
可能是我对数学的一些人的某些作风有一些成见吧,不过本苏也不会算法和 DP 动态规划,当然递归和缓存是会的。

不过这道题 JavaScript 里也可这样答:
const
int2float=(n)=>applyKeepSign(n, i=>digitCat(0.0, [...digitPop(i)].reverse())),
digitPop=function*(n){ let acc=n; while(acc>0) { yield acc%10; acc=Math.floor(acc/10); } },
digitCat=(init,ds)=>{ let acc=init; for(let d of ds)acc=acc*10+d; return acc },
applyKeepSign=(n,op)=>Math.sign(n)*op(Math.abs(n));

然后 [-10, 251, 0].map(int2float) == [-10,251,0]

其实我最大的成见就是,算法在实际应用中不是最重要的;学会设计和编程调试在大部分应用/服务里对性能及健壮性、易用性的影响更显著,很多时候看似简单的算法反而有更低时间复杂度;人的能力不是通过「不明觉历」能评价的。 🤔💭