duangsues.is_a? SaltedFish
60 subscribers
609 photos
6 videos
91 files
562 links
🌶🐔🐟 duangsuse 的日常
尤其喜欢发些奇奇怪怪的东西
和转载别人的东西
Download Telegram
Forwarded from Deleted Account
在 Go 中,没有像 Kotlin 中的 inout 关键字进行类型参数的协变和逆变控制,因为 Go 中没有类似于泛型的概念。但是 Go 中可以通过接口和嵌入结构体等方式实现类似的功能。

接口中实现了方法和类型的分离,可以表示某种行为特征。使用接口可以实现类似于 Kotlin 中的 out 关键字的协变,因为可以将子类型转换为父类型,满足接口约定的使用场景。例如:

type Reader interface {
Read(b []byte) (n int, err error)
}

type FileReader struct {}

func (f *FileReader) Read(b []byte) (n int, err error) {
// ...
}

var r Reader = &FileReader{}
// 将 FileReader 转换为 Reader 的接口类型


嵌入结构体提供了一个实现类似于 Kotlin 中的 in 关键字的逆变控制的方式,因为嵌入结构体可以将成员结构转换为父结构,实现了对结构体内部成员类型的控制。例如:

type Animal struct {
Name string
}

type Dog struct {
Animal
Breed string
}

func (a *Animal) Speak() {
fmt.Println("Animal speak")
}

func (d *Dog) Speak() {
fmt.Println("Dog speak")
}

// 将参数类型定义为 Animal
func SpeakAnimal(a *Animal) {
a.Speak()
}

// 传递类型为 Dog 的参数给 SpeakAnimal 函数
d := &Dog { Animal: Animal { Name:"Fido" }, Breed:"Terrier" }
SpeakAnimal(d.Animal)

// 输出:Animal speak


虽然 Go 中没有像 Kotlin 中的 inout 关键字进行类型参数的协变和逆变控制,但是通过接口和嵌入结构体等方式可以实现类似的功能,用来处理类似类型参数协变和逆变的问题。

对于 Array<out>,在 Go 中可以使用切片(slice)类型进行类似的处理,因为切片类型本质上就是一个动态数组,可以动态调整大小,支持类似于数组的访问方式和操作。例如:

func Sum(numbers []int) int {
sum := 0
for _, n := range numbers {
sum += n
}
return sum
}

// 定义包含子类型数组的父类型
type AnimalArray struct {
Animals []Animal
}

// 将子类型数组作为参数传递给 Sum 函数,实现 Array<out> 的效果
func SumAnimals(animalArray AnimalArray) {
sum := 0
for _, animal := range animalArray.Animals {
sum += animal.Weight
}
return sum
}

// 定义不同类型的动物
type Cat struct {
Animal
ClimbHeight int
}

type Dog struct {
Animal
Breed string
}

animals := []Animal { Dog { Name:"Fido", Weight:10 }, Cat { Name:"Fluffy", Weight:5, ClimbHeight:3 } }
animalArray := AnimalArray { Animals:animals }
SumAnimals(animalArray)


在这个例子中,SumAnimals() 函数接收一个包含子类型的数组,它类似于 Array<out> 的作用。注意,通过将类型转换成 []Animal 切片类型实现动物的数组存储。

总之,在 Go 中,可以使用接口和嵌入结构体等方式来处理类似类型参数协变和逆变的问题。在数组类型方面,可以使用切片类型来符合 Array<out> 的要求进行父类型和子类型转换。

本次使用令牌数: 2199
Forwarded from Deleted Account
是的,你说的很对。在 Go 中,由于没有类似于泛型中的类型参数的概念,也就没有 Java 和 Kotlin 中那种使用通配符 ? extends? super 的语法来实现类似类型参数协变和逆变控制的功能。因此,如果要在 Go 中实现类似于 Kotlin 中 out 的功能,需要使用其他的方式,例如使用接口类型来实现父类型和子类型之间的转换,或者使用包含子类型的切片来模仿使用 out 的场景。

假设现在有一个类型 Test,要实现一个方法 Fill,将一个 P 类型的对象填充为另一个P类型的对象。 在 Go 中,可以使用以下方式实现:

type P interface {
Fill(values interface{})
}

type Test struct {
Values []int
}

// 将一个 Test 对象的数据填充到另一个 Test 对象
func (t *Test) Fill(values interface{}) {
t.Values = values.([]int)
}


然后,通过创建一个新的 Test 对象,调用 Fill 方法进行填充:

var p P = &Test{}
q := &Test{ Values: []int{1, 2, 3} }
p.Fill(q.Values)


这样可以实现与 List<T>.fill(with: List<out T1>) 方法类似的功能。不过需要注意的是,在 Go 中使用 interface{} 进行类型转换需要非常小心,避免出现运行时错误。

总之,在 Go 中是无法像 Kotlin 中那样使用 outin 关键字实现类似类型参数协变和逆变控制的,需要使用其他的方法来实现类似的功能。

本次使用令牌数: 3074
Deleted Account
在 Go 中,没有像 Kotlin 中的 in 和 out 关键字进行类型参数的协变和逆变控制,因为 Go 中没有类似于泛型的概念。但是 Go 中可以通过接口和嵌入结构体等方式实现类似的功能。 接口中实现了方法和类型的分离,可以表示某种行为特征。使用接口可以实现类似于 Kotlin 中的 out 关键字的协变,因为可以将子类型转换为父类型,满足接口约定的使用场景。例如: type Reader interface { Read(b []byte) (n int, err error) } type…
#kt 直接把 out=get, in=set 🌚https://t.iss.one/kotlin_cn/74360

Go 只有[]T 和 func(T)R 的别名,不能自定义类型参数的inout性 ,AI绕来绕去没答到🌚

Go,Rust 都是struct-trait,Any是空接口 ,type Option(type T) intrf{} T应该是自动的
Go 的slice,channel 都不支持out性 ,都没有子类型,必须写明trait 接口

比如子类型 P=List
P<T>.fill(with: P<T1>)
就能写成
P<T>.fill( P<out T>)

但是Go 里,就没法自动兼容这种,因为 []T 只能被运行时强转
func (int *List) Fill(v interface{}) {
int.Values = v.([]int) //+str,float..
}

如果单纯调用 T的接口, C++ 那样还可以推断(也能兼容 T[]的fun扩展),但指明inout T 在T有约束或已知时,是有意义的

组合式是把T:Print,T:Sort 这些的[]T给统一 ,比如向 List<set T> 把T变为相同接口
Forwarded from Deleted Account
将 MP3 文件转换成 MIDI 文件是一个复杂的问题,因为 MP3 文件包含的是音频信息,而 MIDI 文件包含的是乐器和音符的信息。要实现这个功能,您需要做以下几步:

1.将 MP3 文件解析成音频信号,可以使用 Python 中的音频处理库 pydub。
2.使用经过训练的机器学习模型,将音频信号转换成 MIDI 乐器和音符的信息,可以使用Python中的深度学习库 TensorFlow。
3.将 MIDI 乐器和音符的信息保存为 MIDI 格式的文件,可以使用 Python 中的 MIDI 处理库MIDIUtil。

至于为音符配对语音识别,这也是一个复杂的问题,因为它涉及到声学信号处理和语音识别等领域。您可以使用 Python 中的语音识别库,如SpeechRecognition或PocketSphinx,将音频信号转换成文本,然后使用自然语言处理技术将文本转换成 MIDI 音符。

请注意,实现这个功能需要一定的编程和数据处理经验,需要花费一定的时间和精力来学习和调试代码。

本次使用令牌数: 558
Forwarded from Deleted Account
您可以使用 numpy 库来创建棋盘格数组。

以下是一个示例代码:

import numpy as np

# 创建一个 8*8 的二维数组,初始值为 -1
board = np.full((8, 8), -1)

# 将棋盘格染色,黑色为0,白色为1
for i in range(8):
for j in range(8):
if (i + j) % 2 == 0:
board[i][j] = 1
else:
board[i][j] = 0

# 打印棋盘格
print(board)


输出结果:

[[0 1 0 1 0 1 0 1]
[1 0 1 0 1 0 1 0]
[0 1 0 1 0 1 0 1]
[1 0 1 0 1 0 1 0]
[0 1 0 1 0 1 0 1]
[1 0 1 0 1 0 1 0]
[0 1 0 1 0 1 0 1]
[1 0 1 0 1 0 1 0]]


在这个示例中,我们首先使用 numpy 库的 np.full() 函数创建了一个初始值为 -1 的二维数组。然后,我们使用两个 for 循环遍历整个数组,通过 (i+j)%2 计算得到每个位置应该是黑色还是白色,将对应位置的值设为 0 或 1,最后打印出整个棋盘格数组。

本次使用令牌数: 1355
Forwarded from Deleted Account
以下是使用反射进行深拷贝的示例代码,支持将 `List`、`HashMap` 和对象的字段(使用 `getFields()` 方法获取)映射为新的值,并可以使用 `unifyEqualsPtrs()` 函数将相同的对象指针映射为相同的新对象:

```java
import java.lang.reflect.*;
import java.util.*;

public class DeepCopyUtil {

private static Map<Object, Object> originalToCopy = new HashMap<>();

public static <T> T deepCopy(T obj, Function<Object, Object> func) throws Exception {
if(originalToCopy.containsKey(obj)){
return (T)originalToCopy.get(obj);
}
Class<?> objClass = obj.getClass();
if(objClass.isEnum() || objClass.isPrimitive() || obj instanceof String){
return obj;
} else if(obj instanceof List){
List<Object> originalList = (List<Object>)obj;
List<Object> copyList = new ArrayList<>(originalList.size());
originalToCopy.put(obj, copyList);
for(Object item: originalList){
copyList.add(deepCopy(item, func));
}
return (T)copyList;
} else if(obj instanceof Map){
Map<Object, Object> originalMap = (Map<Object, Object>)obj;
Map<Object, Object> copyMap = new HashMap<>(originalMap.size());
originalToCopy.put(obj, copyMap);
for(Map.Entry<Object, Object> entry: originalMap.entrySet()){
Object originalKey = entry.getKey();
Object originalValue = entry.getValue();
Object copyKey = deepCopy(originalKey, func);
Object copyValue = deepCopy(originalValue, func);
copyMap.put(copyKey, copyValue);
}
return (T)copyMap;
} else {
Field[] fields = objClass.getFields();
T copyObj = (T)objClass.newInstance();
for(Field field: fields){
Object originalFieldValue = field.get(obj);
Object copyFieldValue = deepCopy(originalFieldValue, func);
field.set(copyObj, copyFieldValue);
}
Object unifiedCopyObj = func.apply(copyObj);
originalToCopy.put(obj, unifiedCopyObj);
return (T)unifiedCopyObj;
}
}

public static <T> Function<Object, Object> unifyEqualsPtrs(List<T> ptrs) {
Map<T, T> ptrMap = new HashMap<>();
return (Object obj) -> {
if(ptrs.contains(obj)){
T ptr = (T)obj;
if(!ptrMap.containsKey(ptr)){
ptrMap.put(ptr, ptr);
}
return ptrMap.get(ptr);
}
return obj;
};
}
}
```

在这个示例中,我们定义了一个 `DeepCopyUtil` 工具类,其中包含一个 `deepCopy()` 方法,用于进行对象的深拷贝。该方法可以处理列表、字典和对象的字段,并支持使用 `Function<Object, Object> func` 进行映射转换。

我们还定义了一个 `unifyEqualsPtrs()` 方法,用于将对象指针相等的对象映射为相同的新对象,以便在深度拷贝时可以共享同一个对象实例。

使用示例:

```java
public class Main {

public static void main(String[] args) throws Exception {
List<Person> originalList = new ArrayList<>();
originalList.add(new Person("John", 30));
originalList.add(new Person("Mary", 25));
originalList.add(new Person("Tom", 40));
originalList.add(originalList.get(2));

Function<Object, Object> func = DeepCopyUtil.unifyEqualsPtrs(originalList);

List<Person> copyList = DeepCopyUtil.deepCopy(originalList, func);

copyList.get(0).name = "David";
copyList.get(1).age = 30;

System.out.println(originalList);
System.out.println(copyList);
}
}

class Person {
public String name;
public int age;

public Person(String name, int age) {
this.name = name;
this.age = age;
}

@Override
public String toString() {
return "Person{" +
"name='" + name + ''' +
", age=" + age +
'}';
}
}
```

输出结果:

```
[Person{name='John', age=30}, Person{name='Mary', age=25}, Person{name='Tom', age=40}, Person{name='Tom', age=40}]
[Person{name='David', age=30}, Person{name='Mary', age=30}, Person{```
Forwarded from Deleted Account
以下是使用反射进行深度遍历,并修改对象图的示例代码,支持将 ListMap 和对象的字段(使用 fields 变量获取)的值通过调用 func 方法修改,并支持在修改过程中使用 unifyEqualsPtrs() 方法对相同的对象指针进行映射:

import java.lang.reflect.Field;

class DeepSetter {

private val originalToCopy = HashMap<Any?, Any?>()

fun deepSetAs(obj: Any?, func: Function<Any?, Any?>) {
if (originalToCopy.containsKey(obj)) {
return
}
if (obj is List<*>) {
val originalList = obj as List<Any?>
val copyList = ArrayList<Any?>(originalList.size)
originalToCopy[obj] = copyList
for (item in originalList) {
copyList.add(deepSetAs(item, func))
}
} else if (obj is Map<*, *>) {
val originalMap = obj as Map<Any?, Any?>
val copyMap = HashMap<Any?, Any?>(originalMap.size)
originalToCopy[obj] = copyMap
for ((key, value) in originalMap) {
val copyKey = deepSetAs(key, func)
val copyValue = deepSetAs(value, func)
copyMap[copyKey] = copyValue
}
} else {
if (obj == null || obj is String || obj is Number || obj is Boolean || obj.javaClass.isEnum) {
return
}
val objClass = obj.javaClass
val fields: Array<Field> = objClass.declaredFields
for (field in fields) {
if (field.type.isArray || field.type.isPrimitive || field.type.isEnum || field.type.isAssignableFrom(List::class.java) ||
field.type.isAssignableFrom(Map::class.java) || field.type.isAssignableFrom(Set::class.java)) {
continue
}
field.isAccessible = true
val originalFieldValue = field[obj]
val copyFieldValue = deepSetAs(originalFieldValue, func)
field[obj] = copyFieldValue
}
return func.apply(obj)
}
}

fun <T> unifyEqualsPtrs(ptrs: List<T>): Function<Any?, Any?> {
val ptrMap: MutableMap<T, T> = HashMap()
return Function { obj ->
if (ptrs.contains(obj)) {
val ptr: T = obj as T
if (!ptrMap.containsKey(ptr)) {
ptrMap.put(ptr, ptr)
}
ptrMap[ptr]
} else {
obj
}
}
}
}


在这个示例中,我们定义了一个 DeepSetter 工具类,其中包含一个 deepSetAs() 方法,用于遍历对象图并修改对象。该方法可以处理列表、字典和对象的字段,并支持使用 Function<Object, Object> func 进行修改。

我们还定义了一个 unifyEqualsPtrs() 方法,用于将对象指针相等的对象映射为相同的新对象,以便在遍历并修改时可以共享同一个对象实例。

使用示例:

fun main() {
val originalList = mutableListOf(
Person("John", 30),
Person("Mary", 25),
Person("Tom", 40),
Person("Tom", 40)
)

val deepSetter = DeepSetter()
val func = deepSetter.unifyEqualsPtrs(originalList)
deepSetter.deepSetAs(originalList, func)

print(originalList)
}

class Person(var name: String, var age: Int) {
override fun toString(): String {
return "Person{name='$name', age=$age}"
}
}


输出结果:

[Person{name='John', age=30}, Person{name='Mary', age=25}, Person{name='Tom', age=40}, Person{name='Tom', age=40}]


在这个示例中,我们创建了一个包含四个元素的 Person 对象列表,其中两个元素引用了同一个对象,相当于是同一个对象的两个引用。然后我们调用 deepSetAs() 方法进行遍历并修改对象,并使用 unifyEqualsPtrs() 方法将相等的对象指针映射为相同的新对象。

最后,我们输出了修改后的列表,其中两个元素引用的是同一个新对象,表明遍历并修改的实现是正确的。

本次使用令牌数: 2596
Deleted Account
以下是使用反射进行深拷贝的示例代码,支持将 `List`、`HashMap` 和对象的字段(使用 `getFields()` 方法获取)映射为新的值,并可以使用 `unifyEqualsPtrs()` 函数将相同的对象指针映射为相同的新对象: ```java import java.lang.reflect.*; import java.util.*; public class DeepCopyUtil { private static Map<Object, Object> originalToCopy…
在kotlin 用java reflect 写一个深度遍历对象图的 deepSetAs(obj,func) ,它支持将 List.E,Map.V,getFields() 内的值修改为func调用

以此定义 unifyEqualsPtrs(obj, oldToDup=mutMap())=deepSet{ computeIfAbsent }
请用函数式,when 减少缩进

它没有返回值,只原地改写 。然后field也要递归 ,而且不要处理str,enum 等基础类型
柯里化 deepSetAs(func)(it) ,递归改成 see(it)。 unify也要

deepSetAs不要有T, obj作为this, else->外提为 forListyFields(see); unify可以是val 。缩进2空格
ref:https://t.iss.one/dsuse/18706

也可以加个fn参数,调用0参构造器 作为返回,实现deepCopy

好的,我根据你的要求再次修改了一下代码,你看看这样可以吗:
#kt #code
kotlin
fun deepSetAs(func: (Any?) -> Any?): Any?.()->Unit = { ->
val see = deepSetAs(func)
when (this) {
is List<*> -> forEach { see(it) }
is Map<*, *> -> forEach { see(it.value) }
else -> this?.forListyFields(see)
}
}

val cf = mutableMapOf<Class<*>, Array<Field>>()

fun Any.forListyFields(see: (Any?) -> Unit) { cf.getOrPut(this.javaClass) { this.javaClass.declaredFields }.forEach {
it.isAccessible = true
val v = it.get(this)
if (v != null && v !is String && v !is Enum<*>) {
see(v)
}
it.set(this, func(v))
}
}

val unifyEqualsPtrs = { val dup2Old=mutableMapOf<Any?, Any?>()
deepSetAs { v -> dup2Old.computeIfAbsent(v) { v } }
}


解答了 https://t.iss.one/Javaer/922625
Forwarded from ∅rmiux
農管:本來就應該種水稻,誰叫農民種小麥?高速ETC的打點証 我不認

只允許種下去 沒有允許收割 一切要聽黨的指揮
小麥都是惡意發霉發芽,老天爺惡意下雨,這一定是境外勢力
割韭菜卻不割稻米小麥,還有人礦可以採,真不愧是發達國
翠的 扛200斤麥子,十里山路不換肩
原來是 農民們自己 不夠給力
誰叫這些農民沒辦法跟某種粉色物種一樣用手刻芯片只會机種田

大国寡民:你就是见不得中国好
没错,这种中国好,是牺牲国民利益为燃料的。 靠它称霸世界,王朝复兴呢?
翻开历史课文,看到对奴隶社会的解释:
1.奴隶没有土地
2.奴隶的报酬听候奴隶主的分配
3.奴隶没有政治权利,欠薪时莫谈国事
4.奴隶有忠卫奴隶主的光荣义务

官本位下 🧐官员群众老百姓的利益冲突,是不以善人的意志为转移的

以为举着红旗打砸抢,自己家就能连年太平 ,这种封建分裂的思想迟早被改良

- 国人并不具有“独特性”,中国人不因软弱而不容于民主制度,也不存在“劣根性”而不适于民主制度。
- 当权力变成天降商品,腐败就会成为常态。
- 策的反复威胁法律的权威性,地方失去法律的束缚,将产生洪水般的混乱。
[上海 五月天演唱会]彭载舟、白纸式 行为被越来越多人复刻

越南和中国的相似点
博恩 -中国喜剧仍是有未来的
#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 螺莉莉的黑板报
来来来,开始撕包