duangsuse::Echo
412 subscribers
3.85K photos
105 videos
574 files
5.15K links
duangsuse技术相干订阅
这是 @duangsuse 与技术有关的发布频道
duangsuse 的另外有 throws 闲杂频道
@dsuset
转载频道 @dsusep
duangsuse 有coding,github,gitlab帐号和bilibili帐号

极小可能会有批评zf的消息 如有不适可以退出

suse的小站:https://piped.stream
ps 另有别名 popf.rip
ʕ•̀ω•́ʔ✧ 🐶🍎🏠生死🐜
(>ω<)岂因祸福避趋之 一鿕
Download Telegram
#java #performance 值类型vs引用类型
🤔在内存管理/GC良好的语言里,只读数据的引用 就是值
java Byte[]和byte[] 在复用上都互不兼容,当然没有值类型了☺️

>我有一个含极多重复str 的JSON,想减少其内存占用

这就是常量池嘛, javac和aapt都会做
JVM的str不可变,一般都是全局缓存的,strBuild 在完成时是会查询这个吧。

文件上编解码时中间加个Deflate流
也可能是结构有毛病, 比如把str而非int当成tag

说起来str.intern 早废弃了 ,因为new Str() 都是常量池化由GC管理的
(注:不是,jdk7修正了intern内存泄露的bug -XX:StringTableSize )
你不会不相信HotSpot 研究了20年的GC性能吧?🌚指针去重 不是javaer该想的问题 ,str和strBuffer 区别开了 哪有重复分配的问题

要我说不如直接全py,js 算了,既然有这么一个合并步骤

你不能把str常量池说成 static ,这样叫内存泄露的。既然使用了GC语言不要管指针
String是final class ,我不觉得它算用户对象。 jvm是可以做优化的

它没有提供delete obj 的方法,对用户化指针管理 已经有个态度。C#里就是能,还可以调用unsafe

问题在于jdk做不到py 那样包装C++,众人拾柴火焰高 ,无法真的在内存性能上服众

那你就只能自己搞个基于HashMap 的String() 了呗,可惜json读写器们不支持😅
或许靠AOP硬把jackson. new String 替换为缓存的函数?

>你说的这个全局池子不高效,是负优化,这大概也是Java不去实现的理由之一

可是它只在创建str时有开销啊..
所以有strBuild
总之gson们不支持用户的“数据类型”,只能手写JSON读写器了 ,要不然没法实现解析时就去重

如果你想做,只有二次遍历对象图
https://t.me/Javaer/922773
Forwarded from duangsuse
#learn #java 我还想写一个用于js-java RPC的序列化器 ,但认知遭到了强类型Object 的颠覆..

不知道想new 任意T 除了用{k:v}初始化还有什么细节,疯狂问 #bing 但是它什么(资料)也没搜集到 ,它啥都没帮到

说一些我的发现:
1. JSON.parse("") 构造的数据完全是根据str来的,比如 0~9=num, ""=str, [] {}=Arrayobj, true/false/null
;但 Json.from<T> 对str的读取会根据T是 Map,List,Long 。只有构造Object的情况才等于parse,否则能自定义T的语法, 按Schema及早报错

从这个角度serde器和NFA都高级了,因为 “它的语法是动态的”.. 即优化的数据校验😅

2.对于 List<Object> 等子类不定的,需要保存type: typeID 或者说全称类名来区分
这一点ktx是要求用 @Serializable sealed classser Module 来添加(Any的子类)

3. Java的泛型擦除导致 List<Str,Num,.> 看起来是一样的,这样不仅有List<T>.ser 需要T.ser 的注入问题,还有局部变量没泛型反射,只能手动构造 List<Int> 等泛型Type
Kt却可以用 reified fn= gson.fromJson(json, object:TypeToken<T>(){})

比如说, Set<Pair<Str, User>> 读取是 Ary { next==str, KV(新建User) { set prop } } , 这个Pair.ser 的格式是据AB.类型.ser 而定,简直是把json的[]{}符号附着在类型上
duangsuse::Echo
https://zhuanlan.zhihu.com/p/604608272 #plt #js #py 最近在写一个h5和js插件的扒谱工具.. 因为想自动化,接入一些pip上乃至阿里云讯飞云的AI多媒体工具,相当耗时间,恐怕得个把月了 此插件使用h5文件写入、webext、web/原生互通讯等接口。各种接口、多进程缓解ai模型加载慢不是问题, 阿里讯飞等识别结果的不一致倒挺浪费精力的😂 也是无语,难的反而比简单的容易..
以上任务栈应该是1月1日 ,我花1k RMB买到 SynthV+煊宇 开始的,“恍如隔世”。
期间好像也就写了5个能用的脚本

#statement
但其实,我对编程的习惯,并没有发生根本上的变质
硬要说,从minbase64(我的第一个java AIDE应用) 开始,我的编程理念就是“不折腾 只探索”
只要有“偷懒”的可能性,就不会认真持续单个项目。究极目标是以0作1
用0门槛,实现高门槛的技术

https://t.me/dsuse/18091
就像我说的,
复杂只代表不成熟和懒于反省代码
编程语言不是技术, 它是细化「软件说明书」的母语
优雅的代码一定是好用、直观的
#java #PLT #code Expr/visitor problem
type Exp
- eval Any

data N(lit:N) Exp
^-eval=lit
data Add(e:PairOf<Exp>, k="+") Exp“
树结构

^-eval=e.lets: A.eval+B.eval

''Value=Either<Int Bool>
“没必要用 VInt VBool 来实现sealed class”

type Exp
-'R' accept(: .Vis) R
  'R'type Vis
- N(:N)R
- Add(:PairOf<R>)R

“Exp 本身就可二次遍历,省略建立树结构的Vis”

named IntOps Exp.Vis<Int>
^- N(n)=n.Int
^- Add(e,k)=e.lets: A+B

Add(N(3),N(5)).accept(IntOps)==8
...

🤦🏻好吧,我服了, 10页纸也没讲到重点
要学习这种大佬的文章, 开销还蛮大的 。果然自己从根源问题来解,是最好的选择

直接说 把eval 改成 visit(:为各子类重载)R 就能解偶,
把R改成Eval接口就能用新类型添加操作,例如 Op(EvalX,EvalX)=>可toStr的树
正如把 eval:Int 改为 eval:Any 就能做更多事
哪来那么多破事
#py #java #meme 这个 meme 更适合 langchain😅 .ref

比如什么 aspectJ.HasThisTypePatternTriedToSneakInSomeGenericOrParameterizedTypePatternMatchingStuffAnywhereVisitor
https://www.zhihu.com/question/550314430/answer/3098679716


超长 类型名

*: chain.run() 的参数会填写对话上文, 按推导自由度temper 回复
翻译器的上文是:

>!你是翻译{input_language}为{output_language} 的好帮手
>{text}


👇 #kt T? 有"多少种" Nullable 注解
#dev #java 又做了意义不大的重写: Observer 实现 Trello 任务-状态 看板
use! py time json datetime

data TaskSubject @impl??
- attach(:Observer)
- detach(:Observer)
- notify(:Tasker)
^now
''(named ts) Tasker=Pair<Task User>

type Observer
- update(:Tasker)
^now
''Author=Pair<User datetime>
- User as=Author(this,datetime.now())

named BoardUpdate Observer
^- update(ts) = ts.A let:
at prev=st_history.first{it.id==id}?.history[_-1].status
prev? :
boards[prev].may{it has id}: it pop id //什么逻辑
boards[status] add id

//显示 “小明刚更新了 吃饭->已完成”
named StatusTrack Observer
^- update(ts) = ts let:[(task uid)]
st_history.first{it.id==task.id}?.history?
.lets:
add (uid by task.status)
.or:
st_history add task.id 这TM不就是defaultdict吗

made:
tasks rw.Ln<Task.Raw>
st_history rw.Ln<Pair<Str Author>>
boards [:"To-Do" [].as<Ln<Task>>, "In-Progress" [] ]

data Task(:rw.Ln<Observer>) TaskSubject
^- notify(ts)
observers: update(ts)
^- attach==observers{add}
^- detach==observers{pop}
when- as
Raw'id created updated'(_ed Author, updated=created,status="")

- create(:Tasker)
tasks add Raw(tasks.size+1, ts.B)
notify(ts)
- update(:Tasker, st1:Str)
tasks.letsIf{id==task}:
status=st1; updated=uid
break


什么烂代码,尤其是原文, 我才不想写这种

我不讨厌各种UI和"Java版CMS" ,也不觉得有技术很厉害,但好代码一定要恰如其分
duangsuse::Echo
#statement #PLT 编程造成问题 vs 解答造成编程 现况带来问题 vs 审美带来现况 软件的价值很有限,思想的复杂很空虚;不以自己的价值观拉黑人,是最大的尊重 我们有时难相理解🧐 “那你的 IDE 做的怎么样了,带类型的补全有么,还是笔记本没高亮?” (“IDE支持? parser写完了当然会自带高亮和变量寻址/空缺提示啊? 什么叫能解析,但没高亮?”) 这是因为我草稿的PRR 里,输入流就是用高亮-区间嵌套来实现增量解析;没有高亮你连 unparse(ast) 都做不到 —诶,就…
#statement #Java 本来就已经和 C 一样了, sendMessage(Message message) 这种该重载为 send(Message msg)
UserInfo PicInfo (class Info .User .Pic ) 的,一大堆

更不要说 x.a=1; x.b=2 (x.apply{a=1;b=2} ) 和 Builder 了,尤其是 build(): Builder.Immutable ,那种玩意是人手写的吗? (运行期不可变 往往会降低性能)

再比如 Adapter(it:T1): TDelegate(it:T) T by it,如果支持as隐转 fun T.as=object: T1 {} 和subclasshook (继承时生成代码) 就不是“class”和 “by语法”了, ktx.serialization 那些魔法也大可丢掉

tcp 填“文件收发”消息不写文件长度, 却想着 1024byte 一块,全\0或isEnd属性结尾, 黏包 拆包 ……

就像 #androidbody.animate({color:'red'}) transition:color 1s; @animation { to { color: red; .. } } 写成 ValueAnimator 😅


设计模式往往是解决语法的缺失,但我相信许多class就是程序员硬加上去的

这不定义式。但就连 Haskell, React 的设计者他也不是为了「软件功能」服务,都有自己的“宏大叙事” ,100个框架有100个术语和写法,功能却完全一样,唯独没有100%好用的

我想要的代码,是“只用写一遍”,也 ”只能写一遍” 的;无论在任何年代,对接上任何app的需求, 都想不出更普遍的用词和接口即便需求复杂到“不普遍”的程度。
问题和解法,都只有唯一一种,描述问题就是解法,这才叫程序设计🙏

py或许够规范,但性能和OOP 上的(生态?)缺陷让它受限于脚本和计算,不方便做前后端的模块 ;所以我现在很少操心android这些框架

static 成员是非常落后、非常不OOP的设计, ruby,py,js 里 class 都是“类对象”;虽然 kt 没有用元类实现反射,认识到 companion 和 fun 处于不同的执行周期是很必要的
Rust就把struct成员和静态 ::new 隔离的很好
#py 周刊

#ts Mypy: 1.5
Mypy 是 Python 的静态类型检查工具,1.5 版本主要功能有: @overrride 、更灵活的 TypedDict(字面创建的 dataclass) 创建和更新、可显示错误代码的文档、改进了泛型函数的类型推断、__slots__ 的优化、步进 Python 3.12

#ai 整理和预处理pdf文件,让GPT访问
from bot import Retriever, llm_reply

#backend 用 numpy, 线程池 优化数学区间求和函数

- 杀死 ProcessPoolExecutor
Python 自身不适合处理 CPU 密集型任务,文章中项目原本使用进程池来规避 GIL 问题,后使用线程、C++ 扩展,内存使用量减少 50%,CPU 使用量减少约 20%

- 观点: Py 不适合编写100行以上的软件,因为弱类型、重构难和性能


from contextlib import suppress
with suppress(FileNotFoundError):
的妙用

- 上下文管理器
from tenacity import Retrying, stop_after_attempt #AbortSignal
for attempt in Retrying(3):
with attempt
:

骗你的。Java式接口让人难以评价:
for i in Retrying(stop=stop_after_attempt(3)):
with i:
print(f"🧨炸弹{'真的'*i.retry_state.attempt_number} 要炸了!")
try: time.sleep(2) # 按Ctrl+C !
except:pass
else: raise Exception("💥!")

#visualize #plt LibCST: 遍历Python3代码树
btw. 你可以用 %%showast 和 astor 查看算式的树状图和代码形式
- viztracer 提供了 DevTools profile 页

#datas 绘制多个直方图、折线图表
- #tex 对比"星星旗帜"的海龟画图 Python 来学习 PostScript
PostScript 广泛用于打印机、出版和图形设备。文章将可被 convert -page 720x480 flag.ps flag.png 的程序,直译成对接到 matplotlib 的 Python 代码


#java 如何编写简单的C模块,篡改 CPython 解释器的数字
导入一个模块后,如何让 print(8) 会打印出 9?只需要拿到整数对象池,交换两个大整数引用的值
swap( (PyLongObject*)PyLong_FromLong(8)->ob_digit[0] , (9)  )

#os #linux 在 execvp(["python3", “Hello World.py”]) 时,会发生什么?
在 py 文件中写上一句,执行这个文件,幕后都发生了什么呢?文章使用了 readelf 、strace 、ldd 、debugfs 、/proc 、ltrace 、dd 和 stat 等工具,详细解释了脚本被执行的过程。
主要涉及操作系统,GNU libc 相关的内容
推荐阅读


#js htmx: 强化的 form table dialog,交互式界面扩展
<form hx-put="/contact/1" hx-target="this" hx-swap="outerHTML">


#php 🤯 Slack: 我们认真觉得PHP好用