八炯 挺中国
为何在当代岁静与10年前不一样
六·四, 反送中 应该吸纳更多阶层并学会妥协
1989/6/4这才是真正的国耻,文革一直不是过去式,而是现在进行时
文史片:各留活路海阔天空是空话,阶级矛盾是敌我的
为何在当代岁静与10年前不一样
六·四, 反送中 应该吸纳更多阶层并学会妥协
1989/6/4这才是真正的国耻,文革一直不是过去式,而是现在进行时
文史片:各留活路海阔天空是空话,阶级矛盾是敌我的
YouTube
台灣人挺中國人!六四有大驚喜!小粉紅玩不了中國手遊,不准與外國主播拍片!抖音不準有8964數字!李佳琦太慘了
攝徒最新官方LINE貼圖:https://line.me/S/sticker/23334855
00:00-00:42 長榮回應舔共台灣人
00:42-01:31 中國不存在64,只有邁向65
01:31-01:52 香港人也被抓
01:52-03:16 中國人被旅遊又開始
03:16-04:28 中國開始拆路牌
04:28-06:52 中國各類遊戲六四規定
06:52-08:00 抖音禁止出現任何8964數字
08:00-08:45 李佳琦太慘了
08:45-09:47 小粉紅快去微博支持黨…
00:00-00:42 長榮回應舔共台灣人
00:42-01:31 中國不存在64,只有邁向65
01:31-01:52 香港人也被抓
01:52-03:16 中國人被旅遊又開始
03:16-04:28 中國開始拆路牌
04:28-06:52 中國各類遊戲六四規定
06:52-08:00 抖音禁止出現任何8964數字
08:00-08:45 李佳琦太慘了
08:45-09:47 小粉紅快去微博支持黨…
#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 的几何就是
用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 的图形是
在 bios.c 里基于 typedef unsigned int N; N x,y; 定义 text(s); rect(w,h)
^bing: 越来越读不懂了
用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 螺莉莉的黑板报
CAF Container -> OGG Container 的 Mapping 基本摸清楚了,剩下的就是把包拆掉重新组一个咯 ˊ_>ˋ
现在还没搞清楚的是 channel mapping 是怎么个对应关系,明天需要再好好读读文档。
剩下没摸准的是 OGG Page 下面的 Packet 拆出来扔 CAF 里面能不能用,需不需要再做一些 tweak(这块没文档)。
希望不要出太大幺蛾子……
现在还没搞清楚的是 channel mapping 是怎么个对应关系,明天需要再好好读读文档。
剩下没摸准的是 OGG Page 下面的 Packet 拆出来扔 CAF 里面能不能用,需不需要再做一些 tweak(这块没文档)。
希望不要出太大幺蛾子……
Forwarded from 螺莉莉的黑板报
奇怪,ffmpeg 转出来了一个错误的 opus package,这个 package 本身是不符合这条 spec 的:
https://datatracker.ietf.org/doc/html/rfc6716#ref-R5
这我得怎么 fallback……
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 螺莉莉的黑板报
今天下午做完的事情是:
1. 清理掉 legacy 的数据加载机制,他那玩意是基于事件的(跟 IDB 一个尿性),这种写法会把数据流的控制搞得很乱,给重构成 Async Generator 了,这部分测试下来都没问题;
2. 清理掉他自己写的 EventTarget,他自己写了个 EventTarget 的 Polyfill,而且还是残的,甚至还复制粘贴了两次,换成了 Web Media 下面标准的 Event Target 了;
3. 重写数据分片加载的机制,之前已经把 MP3 的加载给抽出来了,这次进一步把它整理了一下,没整理完,删东西删的太狠了,编码解码出 bug 了(
1. 清理掉 legacy 的数据加载机制,他那玩意是基于事件的(跟 IDB 一个尿性),这种写法会把数据流的控制搞得很乱,给重构成 Async Generator 了,这部分测试下来都没问题;
2. 清理掉他自己写的 EventTarget,他自己写了个 EventTarget 的 Polyfill,而且还是残的,甚至还复制粘贴了两次,换成了 Web Media 下面标准的 Event Target 了;
3. 重写数据分片加载的机制,之前已经把 MP3 的加载给抽出来了,这次进一步把它整理了一下,没整理完,删东西删的太狠了,编码解码出 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 补一遍……
1. ffmpeg 不认 spotify 裁过的 ogg 容器,用 VLC 转;
2. VLC 转完的文件没有 metadata,用 kid3 克隆元信息;
3. VLC 把媒体文件长度整没了,用 ffmpeg 补一遍……
#py
#learn
基于栈的算法不全都可以转化为基于递归。有些问题本身就不具有分治和回溯的特性,只会空间复杂度。
后缀表达式求值,不适合用递归来实现,因为它没有主动的终止条件和子问题划分
汉诺塔问题,不适合用栈来实现,因为它需要记录A->B,而栈只能记录最后一个盘子的位置。
DP算法都能转化为递归,反之亦然。
动态规划通常采用自底向上(bottom-up)的方式,从最简单的子问题开始逐步向上组合;如归并排序、DFA,AC树
递归通常采用自顶向下(top-down)的方式,从原问题开始逐步向下分解出更简单的子问题;如快速排序、递归下降流读写
迭代法、递推循环(尾递归)不是自底向上,因为问题范围不会扩大
贪心、模拟法只是解题思想,是因为不熟练而采取的省事做法
DFS 和暴力都能使用逻辑式来实现,即将问题抽象为等式组,然后使用 DFS 来搜索满足'='等调用的变量
Prolog
%九九
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,https://leetcode.cn/problems/two-sum/
[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] )) )] )) )
]))
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).
*/
力扣 LeetCode
1. 两数之和 - 力扣(LeetCode)
1. 两数之和 - 给定一个整数数组 nums 和一个整数目标值 target,请你在该数组中找出 和为目标值 target 的那 两个 整数,并返回它们的数组下标。
你可以假设每种输入只会对应一个答案,并且你不能使用两次相同的元素。
你可以按任意顺序返回答案。
示例 1:
输入:nums = [2,7,11,15], target = 9
输出:[0,1]
解释:因为 nums[0] + nums[1] == 9 ,返回 [0, 1] 。
示例 2:
输入:nums = [3…
你可以假设每种输入只会对应一个答案,并且你不能使用两次相同的元素。
你可以按任意顺序返回答案。
示例 1:
输入:nums = [2,7,11,15], target = 9
输出:[0,1]
解释:因为 nums[0] + nums[1] == 9 ,返回 [0, 1] 。
示例 2:
输入:nums = [3…