#android duangsuse:
为什么binder服务端死亡可以通知到客户端,而服务端却无法感知客户端的死亡?或者说有什么方法可以让服务端知道app被kill的事件?
Android Binder 框架,accept 到客户端后如何检测其中断连接
为什么binder服务端死亡可以通知到客户端,而服务端却无法感知客户端的死亡?或者说有什么方法可以让服务端知道app被kill的事件?
Android Binder 框架,accept 到客户端后如何检测其中断连接
Forwarded from Deleted Account
在 Android Binder 框架中,服务端对象可以通过为自身设置死亡代理(DeathRecipient)来检测客户端是否已将连接断开。当客户端进程意外终止时,Binder 内核驱动程序会向服务端对象发送一个通知,告知与其连接的客户端对象已经死亡,服务端对象在收到这个通知后就可以根据自身的业务逻辑处理相应的异常情况。
为了设置死亡代理,服务端对象可以在处理客户端的连接请求实现的相应方法中(如 onTransact())调用连续两次 IBinder.linkToDeath() 方法,将一个死亡代理对象 DeathRecipient 与客户端连接的 Binder 对象建立联系。当客户端对象意外终止或者断开与 Binder 对象的连接时,服务端对象会在 Binder 内核驱动程序发送的通知中得知,并在适当的时候处理相应的结果。
具体实现可以参考以下示例代码:
在上述代码中,MyService 是服务端 Binder 对象的示例类,setDeathRecipient() 方法用于为该服务端对象设置死亡代理对象,并调用 linkToDeath() 方法将其与客户端连接的 Binder 对象建立联系。在 onTransact() 方法中,如果在服务端对象未设置死亡代理对象之前检测到客户端连接请求,则需要先为该服务端对象设置死亡代理对象。这样,在应用程序的整个生命周期中,对于客户端的连接请求处理中设置的代理对象都会被保留,并可在 Binder 内核驱动程序发送的通知中进行利用,检测相应的连接变化。
本次使用令牌数: 3339
为了设置死亡代理,服务端对象可以在处理客户端的连接请求实现的相应方法中(如 onTransact())调用连续两次 IBinder.linkToDeath() 方法,将一个死亡代理对象 DeathRecipient 与客户端连接的 Binder 对象建立联系。当客户端对象意外终止或者断开与 Binder 对象的连接时,服务端对象会在 Binder 内核驱动程序发送的通知中得知,并在适当的时候处理相应的结果。
具体实现可以参考以下示例代码:
class MyService extends Binder {
private DeathRecipient mDeathRecipient;
public void setDeathRecipient(DeathRecipient deathRecipient) {
this.mDeathRecipient = deathRecipient;
linkToDeath(mDeathRecipient, 0);
}
@Override
protected boolean onTransact(int code, Parcel data, Parcel reply, int flags) {
// 处理客户端的连接请求
...
// 为客户端连接的 Binder 对象设置死亡代理
if (mDeathRecipient == null) {
mDeathRecipient = new DeathRecipient() {
@Override
public void binderDied() {
// 客户端对象已经死亡,处理相应的异常情况
...
}
};
linkToDeath(mDeathRecipient, 0);
}
// 正常处理客户端请求的逻辑
...
// 正常返回执行的结果
return super.onTransact(code, data, reply, flags);
}
}
在上述代码中,MyService 是服务端 Binder 对象的示例类,setDeathRecipient() 方法用于为该服务端对象设置死亡代理对象,并调用 linkToDeath() 方法将其与客户端连接的 Binder 对象建立联系。在 onTransact() 方法中,如果在服务端对象未设置死亡代理对象之前检测到客户端连接请求,则需要先为该服务端对象设置死亡代理对象。这样,在应用程序的整个生命周期中,对于客户端的连接请求处理中设置的代理对象都会被保留,并可在 Binder 内核驱动程序发送的通知中进行利用,检测相应的连接变化。
本次使用令牌数: 3339
Forwarded from Deleted Account
在 Linux 上使用 PyGTK 兼容
1.导入
2. 使用
3. 将 PIL 对象转换成
4. 在
完整的代码示例:
这样,就可以使用 PyGTK 兼容 Linux 上的 PIL grabclipboard() 了。注意,为了使用 gtk.Clipboard,需要安装 PyGTK 模块。
本次使用令牌数: 997
PIL 的 grabclipboard(),可以使用 gtk.Clipboard 模块提供的 wait_for_text() 方法。具体的步骤如下:1.导入
gtk 和 PIL 模块:import gtk
from PIL import ImageGrab
2. 使用
ImageGrab.grabclipboard() 获取剪贴板中的图像,如果存在则保存为 PIL 对象。image = ImageGrab.grabclipboard()
if image is not None:
image.save('clipboard.png')
3. 将 PIL 对象转换成
gtk.gdk.Pixbuf 对象:(width, height) = image.size
pixbuf = gtk.gdk.pixbuf_new_from_data(image.tostring(),
gtk.gdk.COLORSPACE_RGB,
False,
8,
width,
height,
width*3)
4. 在
gtk.Clipboard 中设置图像数据:clipboard = gtk.Clipboard()
clipboard.set_image(pixbuf)
完整的代码示例:
import gtk
from PIL import ImageGrab
# 获取剪贴板中的图像对象
image = ImageGrab.grabclipboard()
if image is not None:
# 将图像保存为 PNG
image.save('clipboard.png')
# 将图像对象转换成 gtk.gdk.Pixbuf
(width, height) = image.size
pixbuf = gtk.gdk.pixbuf_new_from_data(image.tostring(),
gtk.gdk.COLORSPACE_RGB,
False,
8,
width,
height,
width * 3)
# 在剪贴板中设置图像数据
clipboard = gtk.Clipboard()
clipboard.set_image(pixbuf)
这样,就可以使用 PyGTK 兼容 Linux 上的 PIL grabclipboard() 了。注意,为了使用 gtk.Clipboard,需要安装 PyGTK 模块。
本次使用令牌数: 997
duangsuse: #statement
洗脑是把人非黑即白极端化 ,比如80分等于0分 的这种酸民
yfzhe:
不极端化就不是洗脑了?
duangsuse:
你看,这就符合“80分等于0分” 的逻辑错误
政治课都是和现实相悖的,比如一些人喜欢讽刺民主和资本, 但中国台面上标榜民主、对民企家时软时硬
其实俄国的体制就比中国平权,啥都更自由。 普京爹也是满足了苏联粉的“全球化”心理 才引火战争的(虽然马上战败了)
没关系,中国已经没法“去经济化” 回到朝鲜了, 未来冲突是不可避免的
Laoself :
是這樣(
duangsuse:
气死, 穷人连名字也要被夺走 ,哪有这样的
为什么要搞阶级对立,没有下议院、平权这些……
你问bing ,它会说人民民主专政 “民主“ ”专政” 就是冲突的
你可能需要看《走向共和》与三民主义 ,家天下、姓天下、阶级天下 都是变相的皇权
所谓阶级不可调和的正义,那就是 屠龙变恶龙的阶级洗牌
不存在什么善统治恶,只有“人”拥有恶 。共产舶来之前,那些寒门翻身的皇帝是怎么倒的?
不存在弱人统治强人,只有强弱统治人 ,你顺着马克思的逻辑。
嫉妒和空想,是孕育共产主义的温床,其实一旦欧盟式团结出不同国家、阶级间能争论底线的程序正义,马克思内斗论不攻自破。
人家法美好歹有200年的真共产经验,列宁扫六合时,美国农民早有宪法和议院了
鲁迅有句中国人逻辑: 爱国的人,要骂逆贼,是不错的;既然我骂你,我爱国,你就是工贼实锤了
在自由派理解下,只是两个公民群体;马克思下这就是敌我阶级。
其实这是很符合中国传统的。 打下来的天下要坐稳, 一定不能开放党禁 法禁
所以说鲁迅 孙中山 在国共两边都很讨好 ,真伪君子 在真小人眼里还是有区别的
duangsuse:
类似于红军,也是兼有宣传机构
人民斗得热火朝天,他这个将军倒是爽了
反正威胁不到它呗 ,不过是饥荒时期一些狗官 ,被反过来报复夺权
就是忠于个人崇拜,反刘少奇,才搞文革的 ;像金三胖
严格来说只有腊肉是狗 ,县委基层都是狗腿子 ,其他人无论以为自己手举谁的旗,都是矿
腊肉可是很牛的,沁园春:秦皇汉武都不若今朝英雄
这个人完全视为生命和承诺为草芥,一将功成万骨枯,是比希特勒更恐怖,毕竟枪口对内
nazi和毛共都是共产主义,极左和极右(侵略vs内乱), 最终都把阶级斗争玩脱了
焚书坑儒确实比不上岳飞庙都被捣毁的文革
duangsuse:
保皇和造反派,太子党和皇后党…… 五千年的难题啊 ,毛大佐也是有关系网的
那是幸运,有些人自己亲妈都举报。毙了
这些脑残文人皇帝成天霍霍屁民
中共的利益重分配(切蛋糕),以老百姓不造反为基准 ,这砖家说的
就很马克思,没有死活斗争外的价值
所以说关键在公平 ,总统不能权力通吃
duangsuse:
GFW 蛤蛤当时是以迫害法轮功的名义立的
其实法轮功也多是因为计划经济崩盘 、国企裁员 的受害者
但他们组织起来了, 是不好惹的,给蛤整怕了
崩溃就是改革开放之后的国有制公司转手
怎么可能是被迫呢?自己印钞自己赢 ,包括现在什么河南储户也是
美国美金是有信用、自由兑换的,不然赵家拿那个干什么,为啥不存人民币
就说同时期的硅谷银行暴雷吧, 本来中国可以借此叼盘转移矛盾, 结果联邦政府(美国联邦存款保险公司 FDIC)接盘了
它的基础是有竞争力的高新产业,这个世界第一…… 乌克兰也很有余粮啊
农业只能满足温饱,经济价值太高就不符合人类需求金字塔
『米国』 就很有意思,在中文应该是米字旗英国
据说台语俄国是饿国
duangsuse:
这些军事实力,只是科学经济实力的具象化,根源是公正和自由多元化
互相毁灭的威慑不能带来财富,只能导致躺平,朝鲜就很穷。
美在经济上是比较右派 ,治安取决于区域纳税的数量
它就是什么事都盖不住、哪家流浪汉/非法移民都赶不跑,体感上美国很乱很落后,但和玩内部殖民的中国比 反而好点
是的,川宝和败灯个人气质都很垃圾
虽然比那头200斤好
当然国会、同党的权重是比个人要高
最近还被追诉性骚扰要赔钱😂
duangsuse, [2023/5/27 13:10]
中国是最大工厂和市场,是和米国平起平坐的资本主义大国啊
这个论断是美国智库给的,关键词: 中美G2
印度民族种姓宗教问题太严重了,当然种姓问题中国也有,但相对稳定
房地产和高考移民,单就设计上是天才的
钞票还在,但是变成房贷和GDP了 ,一劳永逸地避免了自由投资和挤兑
属于是利用储蓄心态的特色计划经济
中国没有很通胀,储蓄还没有失效, 现在发展信心丧失是导致通缩和失业率的
这种房价普遍有一半的税,收税和市场关系不大
房价是地方政府的肥羊,现在处于密不发丧的状态。向未来借钱的大基建,已经有烂尾的趋势了
主要是圣上好大喜功,巧取豪夺盗窃民脂民膏,弄得房价好像让人民币和劳动贬值,其实也只是在楼市
洗脑是把人非黑即白极端化 ,比如80分等于0分 的这种酸民
yfzhe:
不极端化就不是洗脑了?
duangsuse:
你看,这就符合“80分等于0分” 的逻辑错误
政治课都是和现实相悖的,比如一些人喜欢讽刺民主和资本, 但中国台面上标榜民主、对民企家时软时硬
其实俄国的体制就比中国平权,啥都更自由。 普京爹也是满足了苏联粉的“全球化”心理 才引火战争的(虽然马上战败了)
没关系,中国已经没法“去经济化” 回到朝鲜了, 未来冲突是不可避免的
Laoself :
是這樣(
duangsuse:
气死, 穷人连名字也要被夺走 ,哪有这样的
为什么要搞阶级对立,没有下议院、平权这些……
你问bing ,它会说人民民主专政 “民主“ ”专政” 就是冲突的
你可能需要看《走向共和》与三民主义 ,家天下、姓天下、阶级天下 都是变相的皇权
所谓阶级不可调和的正义,那就是 屠龙变恶龙的阶级洗牌
不存在什么善统治恶,只有“人”拥有恶 。共产舶来之前,那些寒门翻身的皇帝是怎么倒的?
不存在弱人统治强人,只有强弱统治人 ,你顺着马克思的逻辑。
嫉妒和空想,是孕育共产主义的温床,其实一旦欧盟式团结出不同国家、阶级间能争论底线的程序正义,马克思内斗论不攻自破。
人家法美好歹有200年的真共产经验,列宁扫六合时,美国农民早有宪法和议院了
鲁迅有句中国人逻辑: 爱国的人,要骂逆贼,是不错的;既然我骂你,我爱国,你就是工贼实锤了
在自由派理解下,只是两个公民群体;马克思下这就是敌我阶级。
其实这是很符合中国传统的。 打下来的天下要坐稳, 一定不能开放党禁 法禁
所以说鲁迅 孙中山 在国共两边都很讨好 ,真伪君子 在真小人眼里还是有区别的
duangsuse:
类似于红军,也是兼有宣传机构
人民斗得热火朝天,他这个将军倒是爽了
反正威胁不到它呗 ,不过是饥荒时期一些狗官 ,被反过来报复夺权
就是忠于个人崇拜,反刘少奇,才搞文革的 ;像金三胖
严格来说只有腊肉是狗 ,县委基层都是狗腿子 ,其他人无论以为自己手举谁的旗,都是矿
腊肉可是很牛的,沁园春:秦皇汉武都不若今朝英雄
这个人完全视为生命和承诺为草芥,一将功成万骨枯,是比希特勒更恐怖,毕竟枪口对内
nazi和毛共都是共产主义,极左和极右(侵略vs内乱), 最终都把阶级斗争玩脱了
焚书坑儒确实比不上岳飞庙都被捣毁的文革
duangsuse:
保皇和造反派,太子党和皇后党…… 五千年的难题啊 ,毛大佐也是有关系网的
那是幸运,有些人自己亲妈都举报。毙了
这些脑残文人皇帝成天霍霍屁民
中共的利益重分配(切蛋糕),以老百姓不造反为基准 ,这砖家说的
就很马克思,没有死活斗争外的价值
所以说关键在公平 ,总统不能权力通吃
duangsuse:
GFW 蛤蛤当时是以迫害法轮功的名义立的
其实法轮功也多是因为计划经济崩盘 、国企裁员 的受害者
但他们组织起来了, 是不好惹的,给蛤整怕了
崩溃就是改革开放之后的国有制公司转手
怎么可能是被迫呢?自己印钞自己赢 ,包括现在什么河南储户也是
美国美金是有信用、自由兑换的,不然赵家拿那个干什么,为啥不存人民币
就说同时期的硅谷银行暴雷吧, 本来中国可以借此叼盘转移矛盾, 结果联邦政府(美国联邦存款保险公司 FDIC)接盘了
它的基础是有竞争力的高新产业,这个世界第一…… 乌克兰也很有余粮啊
农业只能满足温饱,经济价值太高就不符合人类需求金字塔
『米国』 就很有意思,在中文应该是米字旗英国
据说台语俄国是饿国
duangsuse:
这些军事实力,只是科学经济实力的具象化,根源是公正和自由多元化
互相毁灭的威慑不能带来财富,只能导致躺平,朝鲜就很穷。
美在经济上是比较右派 ,治安取决于区域纳税的数量
它就是什么事都盖不住、哪家流浪汉/非法移民都赶不跑,体感上美国很乱很落后,但和玩内部殖民的中国比 反而好点
是的,川宝和败灯个人气质都很垃圾
虽然比那头200斤好
当然国会、同党的权重是比个人要高
最近还被追诉性骚扰要赔钱😂
duangsuse, [2023/5/27 13:10]
中国是最大工厂和市场,是和米国平起平坐的资本主义大国啊
这个论断是美国智库给的,关键词: 中美G2
印度民族种姓宗教问题太严重了,当然种姓问题中国也有,但相对稳定
房地产和高考移民,单就设计上是天才的
钞票还在,但是变成房贷和GDP了 ,一劳永逸地避免了自由投资和挤兑
属于是利用储蓄心态的特色计划经济
中国没有很通胀,储蓄还没有失效, 现在发展信心丧失是导致通缩和失业率的
这种房价普遍有一半的税,收税和市场关系不大
房价是地方政府的肥羊,现在处于密不发丧的状态。向未来借钱的大基建,已经有烂尾的趋势了
主要是圣上好大喜功,巧取豪夺盗窃民脂民膏,弄得房价好像让人民币和劳动贬值,其实也只是在楼市
Forwarded from Deleted Account
在 Go 中,没有像 Kotlin 中的
接口中实现了方法和类型的分离,可以表示某种行为特征。使用接口可以实现类似于 Kotlin 中的
嵌入结构体提供了一个实现类似于 Kotlin 中的
虽然 Go 中没有像 Kotlin 中的
对于
在这个例子中,
总之,在 Go 中,可以使用接口和嵌入结构体等方式来处理类似类型参数协变和逆变的问题。在数组类型方面,可以使用切片类型来符合
本次使用令牌数: 2199
in 和 out 关键字进行类型参数的协变和逆变控制,因为 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 中的
in 和 out 关键字进行类型参数的协变和逆变控制,但是通过接口和嵌入结构体等方式可以实现类似的功能,用来处理类似类型参数协变和逆变的问题。对于
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 中那种使用通配符
假设现在有一个类型
然后,通过创建一个新的
这样可以实现与
总之,在 Go 中是无法像 Kotlin 中那样使用
本次使用令牌数: 3074
? 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 中那样使用
out 和 in 关键字实现类似类型参数协变和逆变控制的,需要使用其他的方法来实现类似的功能。本次使用令牌数: 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变为相同接口
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变为相同接口
Telegram
duangsuse in Kotlin CN
之前科普
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
1.将 MP3 文件解析成音频信号,可以使用 Python 中的音频处理库 pydub。
2.使用经过训练的机器学习模型,将音频信号转换成 MIDI 乐器和音符的信息,可以使用Python中的深度学习库 TensorFlow。
3.将 MIDI 乐器和音符的信息保存为 MIDI 格式的文件,可以使用 Python 中的 MIDI 处理库MIDIUtil。
至于为音符配对语音识别,这也是一个复杂的问题,因为它涉及到声学信号处理和语音识别等领域。您可以使用 Python 中的语音识别库,如SpeechRecognition或PocketSphinx,将音频信号转换成文本,然后使用自然语言处理技术将文本转换成 MIDI 音符。
请注意,实现这个功能需要一定的编程和数据处理经验,需要花费一定的时间和精力来学习和调试代码。
本次使用令牌数: 558
Forwarded from Deleted Account
您可以使用
以下是一个示例代码:
输出结果:
在这个示例中,我们首先使用
本次使用令牌数: 1355
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{```
```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
以下是使用反射进行深度遍历,并修改对象图的示例代码,支持将
在这个示例中,我们定义了一个
我们还定义了一个
使用示例:
输出结果:
在这个示例中,我们创建了一个包含四个元素的
最后,我们输出了修改后的列表,其中两个元素引用的是同一个新对象,表明遍历并修改的实现是正确的。
本次使用令牌数: 2596
List、Map 和对象的字段(使用 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
解答了 https://t.iss.one/Javaer/922625
以此定义 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
Telegram
duangsuse::Echo
#java #performance 值类型vs引用类型
🤔在内存管理/GC良好的语言里,只读数据的引用 就是值
java Byte[]和byte[] 在复用上都互不兼容,当然没有值类型了☺️
>我有一个含极多重复str 的JSON,想减少其内存占用
这就是常量池嘛, javac和aapt都会做
JVM的str不可变,一般都是全局缓存的,strBuild 在完成时是会查询这个吧。
文件上编解码时中间加个Deflate流
也可能是结构有毛病, 比如把str而非int当成tag
说起来str.intern…
🤔在内存管理/GC良好的语言里,只读数据的引用 就是值
java Byte[]和byte[] 在复用上都互不兼容,当然没有值类型了☺️
>我有一个含极多重复str 的JSON,想减少其内存占用
这就是常量池嘛, javac和aapt都会做
JVM的str不可变,一般都是全局缓存的,strBuild 在完成时是会查询这个吧。
文件上编解码时中间加个Deflate流
也可能是结构有毛病, 比如把str而非int当成tag
说起来str.intern…
農管:本來就應該種水稻,誰叫農民種小麥?高速ETC的打點証 我不認
只允許種下去 沒有允許收割 一切要聽黨的指揮
小麥都是惡意發霉發芽,老天爺惡意下雨,這一定是境外勢力
割韭菜卻不割稻米小麥,還有人礦可以採,真不愧是發達國
翠的 扛200斤麥子,十里山路不換肩
原來是 農民們自己 不夠給力
誰叫這些農民沒辦法跟某種粉色物種一樣用手刻芯片只會机種田
大国寡民:你就是见不得中国好
没错,这种中国好,是牺牲国民利益为燃料的。 靠它称霸世界,王朝复兴呢?
只允許種下去 沒有允許收割 一切要聽黨的指揮
小麥都是惡意發霉發芽,老天爺惡意下雨,這一定是境外勢力
割韭菜卻不割稻米小麥,還有人礦可以採,真不愧是發達國
翠的 扛200斤麥子,十里山路不換肩
原來是 農民們自己 不夠給力
誰叫這些農民沒辦法跟某種粉色物種一樣用手刻芯片只會机種田
大国寡民:你就是见不得中国好
没错,这种中国好,是牺牲国民利益为燃料的。 靠它称霸世界,王朝复兴呢?
翻开历史课文,看到对奴隶社会的解释:
1.奴隶没有土地
2.奴隶的报酬听候奴隶主的分配
3.奴隶没有政治权利,欠薪时莫谈国事
4.奴隶有忠卫奴隶主的光荣义务
官本位下 🧐官员群众老百姓的利益冲突,是不以善人的意志为转移的
以为举着红旗打砸抢,自己家就能连年太平 ,这种封建分裂的思想迟早被改良
- 国人并不具有“独特性”,中国人不因软弱而不容于民主制度,也不存在“劣根性”而不适于民主制度。
- 当权力变成天降商品,腐败就会成为常态。
- 策的反复威胁法律的权威性,地方失去法律的束缚,将产生洪水般的混乱。
1.奴隶没有土地
2.奴隶的报酬听候奴隶主的分配
3.奴隶没有政治权利,欠薪时莫谈国事
4.奴隶有忠卫奴隶主的光荣义务
官本位下 🧐官员群众老百姓的利益冲突,是不以善人的意志为转移的
以为举着红旗打砸抢,自己家就能连年太平 ,这种封建分裂的思想迟早被改良
- 国人并不具有“独特性”,中国人不因软弱而不容于民主制度,也不存在“劣根性”而不适于民主制度。
- 当权力变成天降商品,腐败就会成为常态。
- 策的反复威胁法律的权威性,地方失去法律的束缚,将产生洪水般的混乱。
YouTube
方脸说:中国暴力事件四起,暴力事件频发将成为中国的新常态!为什么我说中国必然会走向混乱?聊聊中国现在到底什么政体
八炯 挺中国
为何在当代岁静与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: 越来越读不懂了