duangsues.is_a? SaltedFish
60 subscribers
609 photos
6 videos
91 files
562 links
🌶🐔🐟 duangsuse 的日常
尤其喜欢发些奇奇怪怪的东西
和转载别人的东西
Download Telegram
[上海 五月天演唱会]彭载舟、白纸式 行为被越来越多人复刻

越南和中国的相似点
博恩 -中国喜剧仍是有未来的
#bing #asm 不会的东西: 一直在扯32位色深、字体贴图、边距 这些有的没的, 无法认真完成「大作业」

用x86 和 VESA 绘制, 实现 总人数100= .2, .4, .3 构成 的柱状图
在住顶显示"n%" ,底端显示 A,B,C

要求2空格缩进 ,提升函数复用


用C内联x86 和 VESA 绘制, 实现 总人数100= .2, .4, .3 构成 的柱状图
汇编结果在 qemu 执行

在柱顶显示"n%" ,底端显示 "A,B,C"
不需要边距,8bit色深, 白色柱体。例如A 的几何就是 go(0,1*ch)rect(3, .2*scrH) ,B紧随其右

用BIOS中断绘制字体 ,对 go(x,y) text(s); rect(w,h) 以C函数内 asm("") 定义。先写 bars.S 实现柱图业务

要求2空格缩进 ,变量用 const int a=1,b=0x2; 连写; 我有 typedef unsigned int N; 和 gcc -masm intel


用C内联x86 和 VESA,在 bars.S 实现白色柱图业务:
bar("A","60%", 6); bar("B","40%", 4)

即,A 的图形是 x=0,y=1*ch; rect(3, .2*scrH) ,B紧随其右

在 bios.c 里基于 typedef unsigned int N; N x,y; 定义 text(s); rect(w,h)

^bing: 越来越读不懂了
#asm #code just clear the (x<50%) part of VBE framebuffer
// Clear the left half of the screen buffer
// BIOS interrupt 10h, function 0h: Set video mode
// AL = video mode (13h = 320x200x256)
__asm__("mov $0x13, %al\n\t"
"int $0x10");

// BIOS interrupt 10h, function 0Fh: Get current video mode
// AL = video mode, AH = number of columns, BH = active page
__asm__("int $0x10");

// Calculate the size of the screen buffer in bytes
// Size = number of columns * number of rows * bytes per pixel
// Bytes per pixel = 1 for 256 colors
unsigned int size;
__asm__("mov %%ax, %%cx\n\t" // CX = AL * AH
"mov $200, %%ax\n\t" // AX = number of rows
"mul %%cx\n\t" // DX:AX = AX * CX
"shr $1, %%dx\n\t" // DX = DX / 2
"rcr $1, %%ax\n\t" // AX = AX / 2 + carry
"mov %%ax, %0" // Store AX to size
: "=m" (size));

// BIOS interrupt 10h, function 0Fh: Get current video mode
// ES:DI = pointer to video memory
unsigned char far *video;
__asm__("mov %%ax, %%es\n\t" // ES = segment of video memory
"xor %%di, %%di\n\t" // DI = offset of video memory
"mov %%es:%%di, %0" // Store ES:DI to video
: "=m" (video));

// Clear the left half of the screen buffer with black color (0)
unsigned char color = 0;
for (unsigned int i = 0; i < size; i++) {
video[i] = color;
}

// Return to text mode
// BIOS interrupt 10h, function 0h: Set video mode
// AL = video mode (03h = 80x25 text)
__asm__("mov $0x03, %al\n\t"
"int $0x10");
Forwarded from 螺莉莉的黑板报
等一下!苹果!你 pakt chunk 在 data chunk 后面!这还怎么流媒体啊!
Forwarded from 螺莉莉的黑板报
CAF Container -> OGG Container 的 Mapping 基本摸清楚了,剩下的就是把包拆掉重新组一个咯 ˊ_>ˋ

现在还没搞清楚的是 channel mapping 是怎么个对应关系,明天需要再好好读读文档。

剩下没摸准的是 OGG Page 下面的 Packet 拆出来扔 CAF 里面能不能用,需不需要再做一些 tweak(这块没文档)。

希望不要出太大幺蛾子……
Forwarded from 螺莉莉的黑板报
浏览器内部流式 parse ogg 文件的 code 已经准备好了!
比如像 ogg 一直到 boe 都是媒体数据,元数据在前两个 page 就已经全都写完了
Forwarded from 螺莉莉的黑板报
来来来,开始撕包
Forwarded from 螺莉莉的黑板报
奇怪,ffmpeg 转出来了一个错误的 opus package,这个 package 本身是不符合这条 spec 的:
https://datatracker.ietf.org/doc/html/rfc6716#ref-R5

这我得怎么 fallback……
Forwarded from dnaugsuz
#js #code
let
bsCaf=(oggOpus.toCaf(oggOpu.fetch(target)),
caf=toBlobBuf(await allItems(bsCaf))


// [].let{ xz.each{push(it)} }
allItems=xz=>{let a=[], x
for await(x of xz)a.push(x)
return a
}
// new Blob(bs).arrayBuffer()
toBlobBuf=bs=>{let
size=bs.reduce((A,B)=>A+B.byteLength, 0),
buf=new Uint8Array(size), i=0
bs.forEach(b=>{buf.set(b, i); i+= b.byteLength})
return buf
}
Forwarded from 螺莉莉的黑板报
OK,只有这三处是不一样的,胜利在望了 QwQ|||
Forwarded from 螺莉莉的黑板报
今天下午做完的事情是:
1. 清理掉 legacy 的数据加载机制,他那玩意是基于事件的(跟 IDB 一个尿性),这种写法会把数据流的控制搞得很乱,给重构成 Async Generator 了,这部分测试下来都没问题;
2. 清理掉他自己写的 EventTarget,他自己写了个 EventTarget 的 Polyfill,而且还是残的,甚至还复制粘贴了两次,换成了 Web Media 下面标准的 Event Target 了;
3. 重写数据分片加载的机制,之前已经把 MP3 的加载给抽出来了,这次进一步把它整理了一下,没整理完,删东西删的太狠了,编码解码出 bug 了(
Forwarded from 螺莉莉的黑板报
啊,丢了一步,我说怎么不对,消到正常范围内了,还剩一个 bug,明天把它修掉!
Forwarded from 螺莉莉的黑板报
这东西的做法其实真的非常简单,librespot 已经把所有 Code 都写完了,只需要在播放那块加一个函数,把 Key Dump 出来,然后用 deno 写一个小脚本从缓存池里面把加密的 ogg 捞出来用 AES 解开就行了,元信息可以用 spotifly 那个库直接从它的官方数据库提取。碎掉的 Container 用 VLC 修一下,元信息用 tageditor-cli 填进去就好了 ˊ_>ˋ
Forwarded from 螺莉莉的黑板报
ˊ_>ˋ 水多了加面面多了加水:
1. ffmpeg 不认 spotify 裁过的 ogg 容器,用 VLC 转;
2. VLC 转完的文件没有 metadata,用 kid3 克隆元信息;
3. VLC 把媒体文件长度整没了,用 ffmpeg 补一遍……
#py
def match_parentheses(s):
# 创建一个栈来存储左括号
stack = []
# 创建一个字典来存储左右括号的对应关系
pairs = {"(": ")", "[": "]", "{": "}"}
# 遍历字符串中的每个字符
for c in s:
# 如果是左括号,就把它压入栈中
if c in pairs:
stack.append(c)
# 如果是右括号,就检查栈是否为空,以及栈顶的左括号是否与它匹配
elif c in pairs.values():
if not stack or pairs[stack.pop()] != c:
# 如果不匹配,就返回False
return False
# 最后检查栈是否为空,如果为空,说明所有的括号都匹配了
return not stack



# 匹配左右括号
pairs = {'(':')', '[':']', '{':'}'}
def eat(s,c0):
for c in s:
# 如果是左括号,就把它压入栈中
if c in pairs: eat(s,pairs[c])
elif c==c0:return # 如果是右括号,左括号便与之匹配
else: assert'','多余项而栈空'
assert c0=='eof','栈尚不为空'

def catchy(f,*a):
try:return f(*a)
except Exception as e:return e

[catchy(eat,iter(s),'eof')\
for s in "([]) ()[]{} ({[()]}) ( []]".split() ]


#learn
基于栈的算法不全都可以转化为基于递归。有些问题本身就不具有分治和回溯的特性,只会空间复杂度。
后缀表达式求值,不适合用递归来实现,因为它没有主动的终止条件和子问题划分
汉诺塔问题,不适合用栈来实现,因为它需要记录A->B,而栈只能记录最后一个盘子的位置。

DP算法都能转化为递归,反之亦然
动态规划通常采用自底向上(bottom-up)的方式,从最简单的子问题开始逐步向上组合;如归并排序、DFA,AC树
递归通常采用自顶向下(top-down)的方式,从原问题开始逐步向下分解出更简单的子问题;如快速排序、递归下降流读写

迭代法、递推循环(尾递归)不是自底向上,因为问题范围不会扩大
贪心、模拟法只是解题思想,是因为不熟练而采取的省事做法

DFS 和暴力都能使用逻辑式来实现,即将问题抽象为等式组,然后使用 DFS 来搜索满足'='等调用的变量
Prolog
:- use_module(library(clpfd)).

% 定义搜索:鸡和兔子的总数为 N,总腿数为 M
solve(N, M, A, B) :-
A + B #= N, 2*A+4*B#=M,
[A, B] ins 0..sup. % 区间,如 A+B#=3 , [A,B] ins 0..sup, label([A,B]).

main :- solve(14,38,A,B), format("~w鸡~w兔~n", [A, B]).


%九九
A * B #= C,
[A,B]ins 1..9, label([A,B]),
format('~w*~w=~w ',[A,B,C]), (A=1 -> write('\n');true).

html(table([class([table, 'table-striped'])], [\foreach(between(1,9,A),
html(tr([\foreach((between(1,9,B),C is A*B ,A>=B), html(td([B,*,A,=,C] )) )] )) )
]))

https://leetcode.cn/problems/two-sum/
two_sum(Nums,X, I, J) :-
nth0(I, Nums, A), nth0(J, Nums, B), I \= J,
% A+B=X
A is X - B.

/** <examples>
?- two_sum([2, 7, 11, 15], 9, I, J).
?- two_sum([3,2,4], 6, I, J).
*/