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

技术相干订阅~
另外有 throws 闲杂频道 @dsuset
转载频道 @dsusep
极小可能会有批评zf的消息 如有不适可退出
suse小站(面向运气编程): https://WOJS.org/#/
Download Telegram
Forwarded from 131的小本本
状压DP见祖宗,直接爆零。
auxfun0.py
2.6 KB
#Python #code 大家保存好,绝版了。
头疼,看起来一些简单的控制流逻辑也不会看了,不过至少是能够看……
新的解析器框架,虽然还是很简单而且不支持容错什么的,但又支持了 PEG 文法…… 打算用 Java 重写个
duangsuse::Echo
新的解析器框架,虽然还是很简单而且不支持容错什么的,但又支持了 PEG 文法…… 打算用 Java 重写个
为什么不用 #Kotlin 呢?因为 Kotlin 本身对我这类辣鸡程序员就已经很极限了
何况还是要写可复用性要求这么大的东西
如果用 Kotlin,我感觉我会驾驭不住甚至不知道怎么抽象好……

但我觉得上 Python 用动态类型不好…… 而且类型检查好像的确没有…… 我去找过有静态类型检查器,但是 Python3 是渐进类型的啊…… 不能多态淡疼
写成 #Java 会优雅一万倍。
parser.py
12 KB
再加上之前的 auxfun 模块,就完美了!虽然没有经过完整的属性测试
#Python 不配写太好的测试……
🤔 我觉得大家不能白吃我的代码,要不然被妮妮萌萌那样的人抄了,岂不没命? 上 GPL 吧
https://github.com/duangsuse-valid-projects/MontagePY/blob/master/helper/parser.py

可用的解析组合子模块,340 行,提供了 seq, br, repeat 等必要的 PEG 结构

和 FP.js 解析组合子的区别是,这个原则上不仅专门为非字符输入流兼容(这样你就可以手写 argparse 之类的)
而且还支持 mark/reset

inp = ParserStream("def deepDarkFun(): return 'Oh, *****'") #内容过于不忍直视
with inp.positional():
print(inp.consume())
inp.skip(5)
print(inp.view())

所以它就可以处理这种结构

from helper.parser import *
from helper.auxfun import concat, op_postfix
wdict = lambda s: s.strip().split(' ')
wdp = lambda wds: elem( list(concat(map(op_postfix('.capitalize()'), wds), wds) ))

wordict = '''
shoulder jam door
f**king s*it hard hot
we you us van billy
can f**k comming
oh ah ahh eh
ass deepDark
my next
'''
n, a, r, v, e, nr, r_uj = map(wdict, wordict.strip().split('\n'))

# Ass(nr) we(r) can(v)
# Oh(e) my(r_uj) f**king(a) shoulder(n)
deepDark = br(seq(wdp(nr), wdp(r), wdp(v)),
seq(wdp(e), wdp(r_uj), wdp(n)))
#darkParse = curry(Parser.run)(deepDark)
dark = lambda s: Parser.run(deepDark, s.split(' '))[1][1]

写了一天也只有 889 行代码……

In [2]: dark('oh my shoulder')
Out[2]: ['oh', 'my', 'shoulder']

In [3]: dark('ass we can')
Out[3]: ['ass', 'we', 'can']

In [4]: deepDark
Out[4]: (([Ass:Deepdark:ass:deepDark] . [We:You:Us:Van:Billy:we:you:us:van:billy] . [Can:F**k:Comming:can:f**k:comming])|([Oh:Ah:Ahh:Eh:oh:ah:ahh:eh] . [My:Next:my:next] . [Shoulder:Jam:Door:shoulder:jam:door]))


In [2]: dark('oh my door')
Out[2]: ['oh', 'my', 'door']

In [3]: dark('Ah my door')
Out[3]: ['Ah', 'my', 'door']

In [4]: dark('Ah my shoulder')
Out[4]: ['Ah', 'my', 'shoulder']

In [5]: Try(lambda: dark('Fucking comming'), err=Func.idp)
Out[5]:
<string>:0:1: All 2 branch failed
[] (Fucking)

这里你可以看到,MontagePY 里的 parser 是 PEG 文法的,不必拘泥于一个两个字符,如果超过一个项目的组合失败了,自然会 reset 到原位负责地重试到完成

def accept(self, ins):
for parser in self.subs:
with ins.positional():
res0 = Parser.run(parser, ins)
if PsP.matchedq(res0): return PsP.Matched(res0)
ins.eissue(self.errfmt, self.subs, None)
return PsP.Unmatched

唉,不知道什么时候 auxfun 不是 module 了,真是莫名其妙,Python 的 class 啊
所谓的『灵活』,有时候也不过尔尔,还不如自动多态呢
好讨厌的感觉…… 不得不重写了
Java 的 InputStreamDataInput 都没有记录 Position,或许是为了性能吧(笑),但我觉得必须有……
其实这个封装是管得太宽了,我还刻意弄来 Ring.kt (环形缓冲区)的代码来写…… 现在看来即使是写好了也感觉很差劲
只好重写这个模块了

我的本意只是写一些可以组合的解析器(Struct),额外去弄这些有点不合适……
dokuss.zip
4.5 KB
绝版了,绝对不会再写 RecovableStream,我会直接让使用者 Fully buffered (BufferedInputStream)
哟~ (此时动苏在昨天晚上已经熬夜…… 到了一点钟,只为多写几行代码(我相信以后不会的!)(我相信高考完肯定就不会出现了!) 现准备继续体验部分
我他妈的做了什么!花了大量时间在没有任何意义的事情上面…… 以后不这么瞎 🐔 乱写了
不过看见测试 all passes 的时候还是稍微松了一口气
Forwarded from dnaugsuz
 @Autowired与Kotlin在@Service中始终为null - 程序园

这语言安排得还真是漂亮…… 我还以为 Kotlin 这个『右值』能是 null 呢,或者 Kotlin 和 @Autowired 一门语言一个 annotation class@Service 这个 annotation class 里皆为空,Java 与您
不是有 kotlin 的 all-open compiler plugin 吗

apply plugin: 'application'
apply plugin: 'kotlin-spring'
apply plugin: 'kotlin-jpa'
apply plugin: 'org.springframework.boot'
apply plugin: 'io.spring.dependency-management'

classpath "org.jetbrains.kotlin:kotlin-${it}:${kotlinVersion}".toString()
for it in ['gradle-plugin', 'allopen', 'noarg']
where kotlinVersion = '1.3.+'
Forwarded from dnaugsuz
难道不应该吗,它还不需要你 try (db.transactional()) {...}...
比如哪一天有一个用户清奇遭到了 Exception safety 问题,本来是你扣他的工资、给他虚拟物品

在操作皆无原子性(一定会一起失败,不存在中间情况)的时候 (p0: 扣钱; p1: 发货)
+ 要么是你白扣他的钱,然后什么也没说(强盗!),这是 p1 => p0; 反过来就不行
+ 要么是你亏大了(白送),这是 p1 =/> p0,发货肯定扣钱,但是可能被投诉的情况

而有原子性的话处理方便很多,在单机面向用户的时候这肯定很方便啊,不过我觉得可以直接写成函数包起来复用最好,然后就可以用 annotation+kapt 什么的,就不会一定要 transactional {...} 包裹了
Forwarded from dnaugsuz
try (...: Closeable) { taskRepo.deleteTask(id) } 怎么样呢,虽然不是表达式…… 噢不对 Kotlin 里 try... 是表达式
byCaptureTaskId 的 capture 是什么意思... SQL 语句的 parameter bind?
Forwarded from dnaugsuz
日卡卡好像写过 sh 脚本来允许利用 app_processandroid.os.Looper.prepareMainLooper 的 Java service 以 root 执行,不需要很多指令,就是先 kill by name 杀旧服务,然后 su exec 替换掉 shell 就可以了,具体代码可在 GitHub 找 Shizuku manager,貌似有(应该是 Yuuta 个人博客文章看到的)
Forwarded from dnaugsuz
严正怀疑是 Kotlin 语言定义有 bug,为什么我不加括号你说没有 companion object 加上你说找不到这个类 (欸第一张图好像发错了…… 😂