Forwarded from Phonograph (Ralph 萌新喵)
https://github.com/LeadroyaL/pdd_3years/blob/master/pdd_3year.md
我昨天在CC98看到了一篇相同的文章,就是这位校友写的。看起来今天他push到了GitHub上。
在这篇文章中,他具体讲述了在拼多多的经历,写得还是比较细的。供大家参考。
我昨天在CC98看到了一篇相同的文章,就是这位校友写的。看起来今天他push到了GitHub上。
在这篇文章中,他具体讲述了在拼多多的经历,写得还是比较细的。供大家参考。
GitHub
pdd_3years/pdd_3year.md at master · LeadroyaL/pdd_3years
Contribute to LeadroyaL/pdd_3years development by creating an account on GitHub.
#js #dom #parsing 提问: DOM 里如何拿到 <h1>~<h6> 标题树?
假设所有 heading 都在
和解析 #Python, yaml 的缩进实质相同,我给两种方法(递归层宽、Int栈循环)
输出类似
算法对输入数据的抽象有点问题,关键点两个:
1. 何时解析一个子节点(上面 "## b")
2. 获取头部深度及建设每层
和 Python 解析的主要区别在于:
1. 在解析非 <hN> 项时不需要取其深度
2. 没有 : 后无换行的“单行简写”(可选 : layout) 的说法
但是我们仍然会写兼容 Python 缩进解析的代码,用抽象层掩盖 DOM 的对非 <hN> 元素深度(因无此概念)的不处理。
畸形的基础抽象:
0. 实现最大的要点是:仅需过一遍,但内部元素皆可能“跌破”两层嵌套,需要级联化处理层结束的逻辑、终末项的实际属从层;
此外第一层是特殊的——它无需 heading 开头,但内部模式和前者一致。
1. 建设每层子树结构不需要提供函数值,统一存储形式允许完后重赋值即可
2. 可以提供
递归层宽: #js #code
(补充:算法我都写出来了,调试了很久,待会贴链接)
Int栈算法:
其实就是比较骚的循环显式栈化重写
本身也不是什么复杂的算法(真正“复杂”的在于如何设计高性能、易组合的复用架构),分词器层面处理就只能用栈,然后业界主流实现是转化成 internal 的 END 词条然后交给 yacc 一样的状态机,把嵌套结构解析第二遍。
老ParserKt 的实现是 LayoutPattern (不如 fastparse 的
以上
假设所有 heading 都在
document.body.children 里和解析 #Python, yaml 的缩进实质相同,我给两种方法(递归层宽、Int栈循环)
输出类似
["# a", e2, e3, ["## b", ee2], e5] 这种算法对输入数据的抽象有点问题,关键点两个:
1. 何时解析一个子节点(上面 "## b")
2. 获取头部深度及建设每层
[head, *items] 的函数和 Python 解析的主要区别在于:
1. 在解析非 <hN> 项时不需要取其深度
2. 没有 : 后无换行的“单行简写”(可选 : layout) 的说法
但是我们仍然会写兼容 Python 缩进解析的代码,用抽象层掩盖 DOM 的对非 <hN> 元素深度(因无此概念)的不处理。
畸形的基础抽象:
var lastHDepth = 0/*当前文段层深度*/;实现的一些细节:
const RE_HTAG = /H(\d+)/g
, isHeading=(e) => RE_HTAG.test(e.tagName)
, getHeadingDepth=(e) => { var n=parseInt(RE_HTAG.exec(e.tagName)[1]); lastHDepth=n+1; return n; }
, getElementDepth=(e) => lastHDepth;
0. 实现最大的要点是:仅需过一遍,但内部元素皆可能“跌破”两层嵌套,需要级联化处理层结束的逻辑、终末项的实际属从层;
此外第一层是特殊的——它无需 heading 开头,但内部模式和前者一致。
1. 建设每层子树结构不需要提供函数值,统一存储形式允许完后重赋值即可
2. 可以提供
onXXX() 函数值检查缩进深度步进是否合法递归层宽: #js #code
(补充:算法我都写出来了,调试了很久,待会贴链接)
Int栈算法:
其实就是比较骚的循环显式栈化重写
本身也不是什么复杂的算法(真正“复杂”的在于如何设计高性能、易组合的复用架构),分词器层面处理就只能用栈,然后业界主流实现是转化成 internal 的 END 词条然后交给 yacc 一样的状态机,把嵌套结构解析第二遍。
老ParserKt 的实现是 LayoutPattern (不如 fastparse 的
" ".rep(indent+1).map(_.len).flatMapX(new Layout(i).factor.rep(1, sep = ("\n"+" "*i))
) 方便),写第一遍看起来易用性还不好;当然,这是个泛用 #algorithm ,功能根本不止解析人类易读嵌套结构。以上
GitHub
ParserKt/ParserKt
Naive one-pass recursive descent, scannerless parser framework for Kotlin - ParserKt/ParserKt
deep.html
2.1 KB
#HTML #code #parsing #algorithm 本以为很快就行的,结果想了半天调试了半天😂,最后一个不是因为十进制移位和数据视口费时,反而是 tailcall 循环忘了加 return,真是眼高手低啊
#PHP
#code:
while ($x = each($xs)) ,然后 destruct 是 list ($a,$b)=pair? 感觉有点混乱…… 为什么 ArrayIterator 和 Array 是绑在一起的,虽然可能是为了降低分配开销吧#code:
function para_filter($para) {
$filtered = array()
while (list($k, $v) = each($para)/*deprecated*/) {
if (!($k=="sign"||$k=="sign_type"||$v=="")) $filtered[$k]=$v
}
return $filtered;
}
duangsuse::Echo
#js #dom #parsing 提问: DOM 里如何拿到 <h1>~<h6> 标题树? 假设所有 heading 都在 document.body.children 里 和解析 #Python, yaml 的缩进实质相同,我给两种方法(递归层宽、Int栈循环) 输出类似 ["# a", e2, e3, ["## b", ee2], e5] 这种 算法对输入数据的抽象有点问题,关键点两个: 1. 何时解析一个子节点(上面 "## b") 2. 获取头部深度及建设每层 [head, *items] 的函数…
ParserKt 的新简单版(因为之前说的又懒得写了...正好做个实用的子集 特性未必少) 估计会支持很甜但低开销的缩进 Block 支持,此外 operator parsing 也改进了贼多,从未深化制度的二叉树转为亲自管理逆波兰 List 惰性结构了(因为这次重设,leftRec 左递归最终还没出现就退役了…… 我们怀念它)
(另:冰封哥在上面引用的文章里说 Python 不支持多行 lambda 是因为 Pyteam 的人不了解如何解析可选 layout block,我不太赞同他,多行 lambda 在表达式,和 if: while: 等语句有点区别 会有碍排版整齐性,这点不少圈内人也认同) #plt #ce #parsing
待会这个 html 和昨天要重写的弄完了,就说说新版如何完整支持各种工业语言的解析,以及如何与编辑器建桥代码高亮。
(另:冰封哥在上面引用的文章里说 Python 不支持多行 lambda 是因为 Pyteam 的人不了解如何解析可选 layout block,我不太赞同他,多行 lambda 在表达式,和 if: while: 等语句有点区别 会有碍排版整齐性,这点不少圈内人也认同) #plt #ce #parsing
待会这个 html 和昨天要重写的弄完了,就说说新版如何完整支持各种工业语言的解析,以及如何与编辑器建桥代码高亮。
duangsuse::Echo
怎么感染越多我心越荡 幻如一只乒毒随风自由的在传染 我要握紧手中岿然却又不动的权杖 我会变成巨人十里山路不换肩 怎么感染越多我心越荡 犹如一担小麦一天能游泳一千米 我要深埋心头上秉持等待枪毙的清单 一直往大风吹的方向倒车去 传啊传啊我的骄傲放纵传呀传不毁我萨格尔王 任毒传任它乱毁不灭是我头上的王冠 传啊传啊我无产不害怕传啊传啊无所谓批判我你看我在亲自的指挥 你看我在勇敢的去开脱啊 怎么感染越多我心越荡 犹如一件纱衣随风轻飘的在狂舞 疫情可以掀翻美国爸却不影响大中国 不惜了一切的代价莫缅怀他 传啊传啊…
开个小差( #Python #code https://paste.ubuntu.com/p/5kNyQYJXCK/ #linux #tools #cli
还记得之前的曲子吗?弄个简单的 lrc 歌词制作,不需要 async getchar() 。
亲自按键,亲自制作的演示可用
还记得之前的曲子吗?弄个简单的 lrc 歌词制作,不需要 async getchar() 。
from subprocess import Popen
from time import time
class LrcRepr:
def show(lines): return "".join([f"[%02d:%02d.%02d]%s" %(t/60, t%60, int(t%1*100), s) for (t, s) in lines])
from sys import argv
from os import getenv
def main(args = argv[1:], srep=LrcRepr):
(fpM, fpT) = sorted(args, key=lambda s:s[s.rfind('.')+1:])
sp = Popen([getenv("PLAYER", "ffplay"), fpM])
t0 = time(); ts = []
with open(fpT, "r") as f:
try:
for ln in f: input(); ts.append(time()); print(ln)
except KeyboardInterrupt: pass
sp.terminate()
f.seek(0); lines = [(t-t0, ln) for (t, ln) in zip(ts, f)]
print(srep.show(lines))
main() 亲自按键,亲自制作的演示可用
mpv 野子.ogg --sub-file=野习.lrc 命令播放(话说 Linux 上竟然没一个 music player 支持滚动歌词?!)#HTML #js #css #docs 如何创建分屏
[html - Split in half vertically and horizontally second flex item - Stack Overflow](https://stackoverflow.com/questions/49550792/split-in-half-vertically-and-horizontally-second-flex-item)
[How To Create a Two Column Layout](https://www.w3schools.com/howto/howto_css_two_columns.asp)
[How To Create A Split Screen](https://www.w3schools.com/howto/howto_css_split_screen.asp)
[Split.js](https://split.js.org/)
🤔今天才知道 CSS flexbox 不是用来创建 responsive 的,只是可以创建随意缩放而良好排版的嵌套盒
responsive 要靠
https://stackoverflow.com/questions/6014702/how-do-i-detect-shiftenter-and-generate-a-new-line-in-textarea 这个用 Selection/Keyboard API
[html - Split in half vertically and horizontally second flex item - Stack Overflow](https://stackoverflow.com/questions/49550792/split-in-half-vertically-and-horizontally-second-flex-item)
[How To Create a Two Column Layout](https://www.w3schools.com/howto/howto_css_two_columns.asp)
[How To Create A Split Screen](https://www.w3schools.com/howto/howto_css_split_screen.asp)
[Split.js](https://split.js.org/)
🤔今天才知道 CSS flexbox 不是用来创建 responsive 的,只是可以创建随意缩放而良好排版的嵌套盒
responsive 要靠
@media 指定覆盖条件,浏览器支持好https://stackoverflow.com/questions/6014702/how-do-i-detect-shiftenter-and-generate-a-new-line-in-textarea 这个用 Selection/Keyboard API
<hr> <label> 这些标签和 resize, outline 的CSS熟悉 都是新学的啊,看来还是得做了才知道。Stack Overflow
Split in half vertically and horizontally second flex item
Can please someone point me out how can I split out second flex item vertically and horizontally like I have in image below ?
I managed to split in half one big box but I failed making it the same...
I managed to split in half one big box but I failed making it the same...
duangsuse::Echo
#js #dom #parsing 提问: DOM 里如何拿到 <h1>~<h6> 标题树? 假设所有 heading 都在 document.body.children 里 和解析 #Python, yaml 的缩进实质相同,我给两种方法(递归层宽、Int栈循环) 输出类似 ["# a", e2, e3, ["## b", ee2], e5] 这种 算法对输入数据的抽象有点问题,关键点两个: 1. 何时解析一个子节点(上面 "## b") 2. 获取头部深度及建设每层 [head, *items] 的函数…
image_2021-01-15_01-12-25.png
57.3 KB
Screenshot_20210115_010615.png
184.8 KB
估计jekyll还没好,睡了,好无奈(草怎么有错别字……
Forwarded from &'a ::rynco::UntitledChannel (Rynco Maekawa)
dnspy 怎么被 archive 了