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

技术相干订阅~
另外有 throws 闲杂频道 @dsuset
转载频道 @dsusep
极小可能会有批评zf的消息 如有不适可退出
suse小站(面向运气编程): https://WOJS.org/#/
Download Telegram
duangsuse::Echo
#ML #Python 接下来安装一点用于数据分析的东西 pip3 install --user --compile -U pandas matplotlib sklearn 如果有权限你也可以去掉 --user flag,-U 的意思是如果有的话安装更新 我们使用 Python 3,当然,要是有 IPython 和 Spyder 这种为数据分析 REPL 优化的东西就更好了,不过下面直接用 IPython3 现代机器学习算法主要包含概念学习、规则学习、基于解释学习、基于实例学习、遗传学习、强化学习…
还是 sin wave 之类的数据,matplotlib 可以这么用


from math import sin, cos, tan
from numpy import arange, array

from matplotlib import pyplot
from pandas import DataFrame, Series

xs = arange(0, 100, 0.1)
sinys = [sin(x) for x in xs]
cosys = [cos(x) for x in xs]
tanys = [tan(x) for x in xs]

plot.style.use('Solarize_Light2')

DataFrame(array([[xs], [sinys], [cosys], [tanys]]), columns = 'x sin(x) cos(x) tan(x)'.split())
... 不行

def kv(name): return (name, globals()[name])
func_tab = DataFrame.from_items(dict(kv(xs), kv(sinys), kv(cosys), kv(tanys)))
... 不行

waves = DataFrame()
waves['x'] = xs
waves['sin(x)'] = sinys; waves['cos(x)'] = cosys; waves['tan(x)'] = tanys

waves.index.name = 'x'
waves.plot(title='Triangle waves')

就可以得到好看的折线图了,并且非常容易使用

Pandas 的 DataFrame 就是字面意义上的数据框:一打可能有名字(index)的数据序列(pandas.Series)
只需要使用 EDSL(内部领域专属语言)操作它的实例就可以快速获得好看的数据图了,不需要不断去 plot 啊 add seris 再设置 xlabel ylabel 啊,都被良好封装(styles, chart type)了

上面本频道也有过 Ruby + GNUPlot 的版本
#Ruby #daily 写了一个程序用来利用 CSS Selector 从 Telegram 导出的 HTML 里提取文本
extract.rb
2 KB
#Ruby Dir.glob('.*').let { |fs| fs.zip(fs.map { |name| name.gsub(//){$1} }).each { |c| o,n=c; File.rename(o, n) } }
for ln in $<.each_line do
next unless ln.start_with?('mv')
_mv, src, dst = ln.split
puts("mv #{dst} #{src}")
end
def bulkRename(re_src, pat_dst, fmt_dst)
re_dst = Regexp.new(pat_dst)
selected = Dir.glob(re_src)
for name in selected
newnam = name.gsub(re_dst, fmt_dst)
puts("mv #{name} #{newnam}")
File.rename(name, newnam)
end
end

case ARGV.size # Just br size is OK
when 0 then warn("Usage: #{$0} [select] re_dst fmt_dst")
when 1 then puts(Dir.glob($*[0]))
when 2 then bulkRename('*', $*[0], $*[1])
when 3 then bulkRename($*[0], $*[1], $*[2])
end
好久以前的 #Ruby
#Ruby 实在是太过分了……
说实话,看到 #Ruby 关系式求解器 里作者实现了个 Iterable.interleave_with 我觉得挺奇怪的,真的是要 interleave? 总觉得可以 zipWith 什么的,但作者的水平又不可能不知道 zipWith
作者的实现方式也很奇怪, interleaveWith 就是 (xs=[a, b], ys=[c, d]) res=[a, c, b, d] 而已,但他用的方式是一个 Array 不断 push pop 这么 cycle 下去的
duangsuse::Echo
https://github.com/corsis/XParsec/blob/master/XParsec.fs#L99 看不懂。 看到 Sigma 我还以为是表达 Sum type (safe union) 的呢,真是无语╯﹏╰ 不过多向输入的解析 ParserKt 就收下作 NonlinearFeed 了,虽然我不知道有什么用,但反正 state 和 BaseJoinBy 这种极端情况的 API 都有了,多加一个也正好能让 alsoDo 有用点(不过 Feed 为避免用 Character 泛型引用造成不必要的开销,看来只能把…
嗯…… 谈到 XML 解析突然想到 #Java 的 SAX(Simple API for XML) 和 XMLPull

React 用的也好像 E4X(ECMAScript for XML) 啊

我常区分函数的『主动』与『被动』,比如说计算就是主动,事件和入口就是被动;其实工程界把 push 称为主动, pull 称为被动(当然和 git pull 不同😂),这也是一个比较 English 化的词

XMLPull 被称为最快的 XML 解析器,其实准确来讲它只是一种数据封装思路——不直接新分配并提供数据对象,而是把尽可能裸值化的它提供给 onXXX 函数(比如你只是找 <a href> 就没必要构造整个 Document 对象),这样就能大幅减轻 GC 压力(C++ 也就没必要用 shared_ptr 了,因为根本不存在对象引用,只有虚表的覆写函数)

这个思路其实也怪好的,而且它也能兼容(利用数据栈)构造如 XMLNode 的递归结构,从而作为可扩展的底层来提供。

之前用过 #Ruby 的 XML 解析器 Nokogiri ,那叫一个烂…… 它不是 XMLPull 模式却有“高性能”的觉悟, Node.attributes 都是 Array 非 Hash... 貌似连 CSS selector 也没有只支持 XPath,实在是太草了

说起来, ParserKt 也包含这种思路。
虽然 Pattern<T> = (Feed,ShowReq?) -> T 是明确要『主动』构造 T (这样看起来它的性能不如 ANTLR, GLL, LALR 这类状态栈算法的『被动』 action)

一方面, ParserKt 的可组合性允许创建不依赖 Pair/Triple/Tuple 的 Seq 而可以复用余下所有定义,是能够通过切换少数调用来支持 pull 模式的 event listener 的

另一方面,pull 一定比 push 快因为使用了“高级算法” 其实是常见的误区,而且对DSL解析器而言构造AST数据是主要目的,实际上有 JS 解析器框架里,JSON 跑分结果最好的反而是手写递归下降法,且 Lua 初版是利用 YaCC 生成解析器,后来反以手工重写。

虽然这种方法有 push 的一些固有限制——阻塞、不能统一处理错误消息/部分结果,但它的高代码质量却能带来意想不到的优化,而这种方法支持的文法并不比 pull 少。

有时候选择代码质量、高抽象度、简化的底层接口并不意味着牺牲性能,因为在其上下建立的实现技巧完全可能追回那点小小的开销

比如,Fold 模式能支持 asInt(16) 这类已经是最低开销的数值读取,而无需“action”将其“rewrite”成 String.toInt ,从不需要用左递归蹩脚的语法来“优化”,而对于参数列表之类也无出其二, asList() 甚至还能 asMap() ,避免创建多余的结构去保留临时 String/List<Pair> ,直接从提出值到构造大结果,何尝不是一种 XMLPull 式思路

尽管用“万能的”左递归优化可以实现 Fold 和 OpChain 所解决的问题,但没人用它——实际上有 DSL 设计需求的人还不少,但有多少人会把 digits 定义成 (digits digit)|digit 的形式?大家看到左递归链的优先级解析就糊涂,甚至不知道为什么加减在前乘除在后

想像一下,如果一个人为了优化 ES5 的解析器而把所有能 Fold 的循环重写其 action,变成左递归定义,看起来会如何?
所以唯一的解决方案就是简化表示法本身,分清主次,用适度特例化的 API 取代“万能” “广义”的“好好先生”们。
duangsuse::Echo
😃 那么,简而言之,我觉得有价值的信息: def get_link(h); "https://tttttt.me/dsuse/#{h['debug']['no'] + 9511 + 20}"; end + 一共统计了 187 条消息。 2019-03-24 11:22 - 2019-04-05 20:06,一共两个星期的时间里,本频道 @dsuse + 有 #Telegram Hashtag 的消息,一共有 42 条,约有 20% 的消息被打上了标签 + 含链接的消息,一共有 37 条,约有 19% 的消息被打上了标签…
现在看起来这个真的😂 #Telegram
想到那时候写的 #Java RegExp TelegramScanner ,为什么不能直接用爬虫扫 HTML 导出所需 XML 呢,用 JSON 再与 #Ruby/#JS 组合多好啊

那时候对列表处理 #listproc 也不重视,写 sort_by {}.reversed 这种代码,但是更新得非常有序,不过频道一直保持着良好的 hashtag 习惯

要是这个统计再做一遍,肯定就会用 GUI,至少是图表的形式,总结语必须是自动生成,不然嫌对查询式有用性挖掘得不够。 #dev 🤔 #statement (什么时候开始有这种程序泛用化的思想了)
#Ruby gem sources --add https://gems.ruby-china.com/ --remove https://rubygems.org/
草 好怀念啊; Ruby 的 OOP 是怎么玩的都忘掉一大半,还好基础语法、控制流和 mixin 什么的都没忘... 🤪
不过 gem 工具下载也没个提示,还不如 pip 。这些脚本语言的开发者很多人都喜欢搞 term color ,但是竟连搞好交互和灵活性都不会
什么时候能写 bash_completions 才能算好的 cli 开发者吧

Python 的各种新 pm 不用 pip 和 setuptools 都不会弄了, Ruby 还是自带 bundler, install 。
真的搞不懂 isolation 是在干什么,为什么要 isolate dependencies 啊,为什么要 venv 啊,直接用系统版本,向前兼容不好吗

sudo gem pristine commonmarker
妈耶, MRI 2.6 的 libruby.so 更新,还要这么操作才能修复老库,试了半天 #GitHub 发现还是只能按官方用 bundler 来... 不然识别不了插件
echo 'gem "github-pages", "~> 211", group: :jekyll_plugins'>Gemfile
bundler exec jekyll s

这个东西把 Others/CommentBot/vertxBusGen/build/js/node_modules/balanced-match/README.md 的 node_modules 也 include 进去了,结果 Liquid 模板语法错误 😂
还好渲染是正常的,所有 md 文件不管带不带 header 都支持
#HTML #JS #DontKnow 你知道吗? 🤔
HTMLElement 的 remove()replaceWith(e1) 都不需要手动拿 e.parentElement ,只有 insertBefore(e1, e) 需要在 parent 上
如果不用 JQ ,可选注册 document "DOMContentLoaded"window "load" 事件

element 和 node 的区别在于,前者只能是 <a> <b> <div> 这样的元素,后者可以是 #text 文本标签。

HTML 里基于 XML 的部分有三种情况: <meta charset="UTF-8"> 的单独标签、 <div></div> 的配对标签(with childNodes)、 <link rel="stylesheet"/> 的折叠(collapsed)标签,有些配对标签也有折叠形式,但折叠和 no children 是不同情况。

有许多方法可以缩写 HTML ,最常见的是基于 CSS 选择器的 emmet.io 和基于缩进的 模板语言 #Ruby slim-lang.com ,而 DOMParser 本身也支持兼容解析修正一些不完整的文档。
想在社交平台分享自己的网站, OpenGraph 了解下?

- !!""!!0!![] 都是 true ,第一点往往造成隐患 必须详细检查
- undefined == null ,所以有时用 === 区别严格相等性
- JS 最不常用的两个关键字: delete o[k];v=with(o,o1) { attr }

许多时候:
如果用 e.onclick = 的简写,在任何地方的(其他)脚本重复注册时会导致覆盖,所以尽可能用 addEventListener
JS 里较短参数的函数兼容较长处的类型限制(允许无视参数),但在调用时省略默认参数可能造成性能问题,在绘图/大批/频繁处理时,需要多用图形界面的 profiler
#js #DontKnow 原型链:(感谢 @JackWorks 提供相关信息)

访问语法都是动态解析的,比如 x.prop
x["prop"]
就是
x.[[Get]]("prop", x)

ES 里一共有五种不同的 [[Get]] 实现,分别是
- 普通对象 [规范]
- Argument 对象(你们今天应该不会用到了)
- 类数组对象(数组的特殊行为就在这里)
- 模块对象(import * as Mod 里的 Mod
- Proxy 对象(reflect proxy 全 delegate)

此外, Object.getOwnPropertyDescriptor(o, k) 可以获取可配置 enumerable, writeable 等属性的配置对象
Object.[get/set]PrototypeOf(o)
o.__proto__ 是它的「超类虚表」

[[Get]] 过程的 Receiver (第二参数)很重要,如果没有这个 Receiver,基于原型链的 OOP 其实是做不起来的

原来是往 proto 上找属性!
这就解释了 Array.prototype.map 之类的东西

parent = { method() { return this; } }
child = {}; child.__proto__ = parent;
child.a = 1; child.method(); // 返回自身
最简单的解释是, Receiver 就是属性访问的时候最上层的那个对象,会被当成 this 用。
因为在这个算法里你可以看到,Receiver 是跟着递归一路传递下去的

原来是 o["RESOLVE"](o.prototype, "attr", receiver=o) !(当然,肯定是先查本地,然后才查 prototype
本地如果有就不会查 prototype 了

明白了,和之前写的 LuaOOP 很像,都是层叠属性查找

“ 大佬能交换下原型链相关知识吗
之前看加 Mixin 好像是说把 prototype 除了哪两个属性的什么全部复制一下
#Python#Ruby 的情况我都了解, Py 是 mro() 链查询, A.wtfa.wtf 都是往 class A 找成员,后者实质是 type(a).wtf(a) 所以得到 bound method ,而直接 A.wtf 就是 bind 操作
@staticmethod 直接不收 self ,不需要 bound 所以可以在类和实例上用

https://paste.ubuntu.com/p/tJv7QpSjGt/ liuil-util 的 #TypeScript mixin.ts 重写
#PLT #Scala #Java #Ruby #Rust #learn https://ray-eldath.me/programming/thoughts-on-rust-1
总结几句:
Java 是主流的托管(managed) 语言,重量级的 GraalVM JS 甚至比 v8 更快,尽管有 valgrind, cppcheck 等工具, 90% 的 CVE 都是 #clang #cplusplus 内存不严谨导致的安全问题,所以托管更适合实际应用。

Scala 是重视语言特性可组合性的函数式语言,它连 enum class 都没有,而用 enum 的本质 newtype (受检的 typealise) 和直接的 extends 解决枚举类型;它的类型都是 higher kind 上的星号实现的,而构造函数类型的箭头是接收任意(包括函数)类型的二参操作符 #functional

Ruby 是一个灵活优雅的脚本语言,你可以 mokey patch Int.+ 运算符让 REPL 都爆炸,它也支持 case when guards
Ruby 的 {|x| x} closure 即闭包语法也被 Rust 使用,连 for 语法本质都是用 .each do 闭包,运行时很少阻止程序员执行能解释的代码(但没有 JS 的疯狂隐式转换)并且支持内省(introspect)

Rust 是 be explicit 的语言,它重视内存片的所有权等比 C 方便而失严谨的概念,但同时也加入了 format!() 等编译期 macro 的支持,也是一门重视严谨性、定义一致性的语言
Rust 的 Copy 和 Clone (深浅复制) 都是作为 trait 显式的,而浮点数判等 Math.EPSILON 也是应显式的

嘛,比起『子语言』我可能更倾向『语法集』『语言功能点语法集』这种更精确的描述
#recommend #PLT 各种语言里 print ArchIsTheBest 的写法
草,还有 #Ruby Shoes GUI 的…… Shakesphere 的代码行数最多
duangsuse::Echo
#日常精神分裂 #旧事重提 #Java #JS #PLT #cplusplus #project A: 啊真的很头疼呢, JPlayer 的 fix 和 depth.html 附赠的 Myson 数据描述语言…… B: 像往常一样,我们一起想想吧。 A: 首先说 JPlayer ,这个原先是作为重写 Yuuta 大佬项目的东西,变的蛮多的,后来也有完全的 C++ 重写。 这个东西最后也是长期熬夜 timedout ,失败点是为优化性能加的 Ringbuffer 队列缓冲区利用有瑕疵,导致最后一次缓冲的内容没放完退出…
#Ruby https://haml.info/ 按现在的计划那个 HTML 预处理应该是这样
对比:
%section.container
%h1= post.title
%h2= post.subtitle
.content
= post.content


section class=container
h1: =post.title
h2: =post.title
div class=content: =post.content

增加了个带 : 无换行、缩进。
如果允许省略 tagName 等于 div 的话(RegExp 匹配..),最后一行是 class=content: =post.content
我觉得十分有必要增加 define, include 和 for, if 语句 🤔 可以用作简化版宏调用 进一步避免模板化
duangsuse::Echo
#windows #sysadmin bcdedit /set {default} recoveryenabled No Win10 在 ntfsresize 缩放了 C: mbr 分区后,正常缓慢开启一次,爆炸了,貌似和空间不够有关(第一次给太少了)🌝 现在正无法正常重启中, WinRE 可以说没有用,只会说什么 srt.log ,我看了是空的一个字没有,最后还是 chkdsk/f C: , sfc/scannow, bootrec,bcdboot, dism,diskpart 这些有点用,可惜没法修复问题,开…
发现是 sys32/drivers 的一些 .sys 文件坏了🌚 估计要找人复制

话说 SUSE 安装 DVD 的 linuxrc 也真是方便,只需要指定 linux initrd 然后连使用 iso: 安装 source 都不支持,手动挂载点也不行(非得选 hard drive 还是 cdrom 还是 net 然后自己挂载检查)
害得我不得不把 iso 里的 repodata media.1 x86_64 noarch *.asc 甚至 boot 给复制了一份到硬盘才行……

不过 SUSE 也真是可以啊, YaST 和 Kiwi , OBS 和 OpenQA 都是很知名的 Linux 生态工具
#Ruby YaST 支持很多 GUI 前端也包含分区编辑器这些麻烦的功能,非常有新意🌚

systemd 的套装也开始代替各种 pid0 软件了, wicked 也被 NetworkManager 取代了,真的那么厉害吗
php:敏杰语言(确信🌚👍 我整个人都敏捷起来了,使用Jawa和Go
都是些JP玩家讨论 asyncio和netty,orm啥哪个好,还有 C#, Go+ DDD.. 魔怔概念

#Ruby 这里有个2D数组编序的..
def spiral_print m
return '' if m.size == 0
m.map(&:shift).join + spiral_print(m.reverse.transpose)
end
妈耶,这mT真的是2D数组..
spiral_print([
['a','b','c','d'],
['e','f','g','h'],
['i','j','k','l']
])
# -> 'aeijklhdcbfg'

噢螺旋向内啊..能看出先是左侧消1,然后末,然后右、始。所以 while m; puts a.map{shift};a.reverse.transpose! ,果然必须转置90度
#ruby #plt Quine 编译接龙 https://www.fxzhihu.com/question/30262900/answer/47877068
https://www.ioccc.org/2012/tromp/hint.html #fp lambda 元循环 解释器(https://www.zhihu.com/question/30262900/answer/49589781
Quine(蒯恩)一般是指能打印出自身源码的程序 _='_=%r;print (_%%_) ';print (_%_)

IOCCC,全称The International Obfuscated C Code Contest (国际难懂C代码大赛),顾名思义,是一场比谁能写出最“让人无语”的C代码的比赛。

btw. 同问题下有个 Shadertoy.com 类的C++答案,太丑了,把 vec3 拆成了RGB三个函数,代码重复率爆炸

还有两个中国特有的:
curl --connect-timeout 1 https://google.com 2>&1 >/dev/null &&你在中国
body.contains("的")? "UTF-8":"GBK"。 \u{E79A84} 在GBK是鐨殑,很罕见
#security #ruby tcpdump https://ruby-china.org/topics/43886
https_instrument 还只是一个玩具,我只测试了一个最简单的例子。对我来说,写这样的工具是一件很有趣的事情。 许多公司的开发机,没有 root 权限,它毕竟也不是科技公司。。。

相比 eBPF ecapture,这种方法除了不用 root 权限外,开发起来也更容易,不需要额外的支持,但 eBPF 是单独的内存空间,操作复杂的 Go 数据结构就极其困难,比如 hash map。

可以用 LD_PRELOAD 替换动态连结库的方法,相应代码。我之前的文章也有相关的介绍。
Ruby 构造请求,并用 stack profiling tool 查看请求了哪些方法,从而缩小范围。我用的是 https://github.com/yfractal/sdb
static int Real__SSL_read (void *ssl, void *buf, int num) { return SSL_read (ssl, buf, num); }
extern int __interpose_SSL_read (void *ssl, void *buf, int num);


LD_PRELOAD,虽然可以 instrument openssl,但没法改程序本身的代码。理论上,通过改 binary,比如在相应的地址插入 int3,生成新的 bianry,应该可以达到类似的效果,或者直接在编译的时候做相应操作,再或者改 ELF。
相比 eBPF ,个人更喜欢 function Interposing 这种方法