活动介绍

def statistic_ranks(self, group: List[int]) -> Tuple[int, int]: rank_cate: Dict[int, int] = defaultdict(int) for rank in group: rank_cate[rank // self.node_specifications] += 1 external = 0 prefix_sum = 0 for k, v in rank_cate.items(): external += prefix_sum * v prefix_sum += v total = len(group) * (len(group) - 1) // 2 - external return total, external 给这个函数生成10个测试用例,和一个一键运行的自动化测试脚本

时间: 2025-07-08 18:33:28 浏览: 21
<think>嗯,用户让我为一个Python函数生成10个测试用例和一个自动化测试脚本。首先,我需要理解这个函数的功能。函数名是statistic_ranks,参数是一个整数列表group,返回一个包含两个整数的元组(total, external)。 首先看函数的实现。函数内部使用了defaultdict来统计rank_cate,其中每个键是rank除以node_specifications的整数结果。然后计算external和total。total的计算是总对数减去external。总对数应该是组合数C(n,2),即n*(n-1)/2。而external可能是跨不同分组的元素对的数量,通过前缀和累加得到。 接下来,我需要确定这个函数的正确行为。例如,当所有元素都属于同一个分组时,external应该是0,因为所有元素都在同一组,没有跨组的情况。这时候total应该是总对数减去0,也就是总对数本身。比如group长度为3,总对数是3,所以total应为3,external为0。 另一个情况是当元素分布在不同的分组中。比如,如果node_specifications是某个值,比如10,那么每个元素除以10的结果决定了分组。例如,元素为[5,15,25],node_specifications为10,分组是0,1,2。此时,每个分组的v是1。计算external时,第一个分组k=0,v=1,prefix_sum初始为0,external加0*1=0,prefix_sum变为1。然后k=1,v=1,external加1*1=1,prefix_sum变为2。接着k=2,v=1,external加2*1=2,总external是0+1+2=3。总对数是3*2/2=3,所以total=3-3=0。这时候返回的total是0,external是3。 不过,这里的分组顺序可能有影响,因为rank_cate.items()的顺序可能不是按k排序的。比如,如果分组键的顺序是1,0,那么计算external的时候,prefix_sum的累加顺序会影响结果。因此,函数中可能需要确保分组是按k的顺序处理的,或者测试用例需要考虑这种情况。 现在需要设计测试用例,覆盖不同的情况: 1. 空列表:group为空,返回(0,0) 2. 单个元素:group长度为1,返回(0,0) 3. 所有元素同一分组:比如group=[5,5,5],node_specifications=10,分组都是0。external为0,total为3*2/2=3 4. 元素分布在两个分组,如[5,15],分组0和1。external=0*1 +1*1=1,总对数是1,total=0 5. 三个分组,每个一个元素,如[5,15,25],external=0+1+2=3,total=0 6. 两个分组,其中一个有多个元素,比如group=[5,5,15],分组0(两个元素)和1(一个)。external计算:先处理k=0,v=2,此时prefix_sum=0,external +=0*2=0,prefix_sum变为2。然后处理k=1,v=1,external +=2*1=2。总external是2。总对数是3*2/2=3,total=3-2=1 7. 多个元素在不同分组,比如group=[5,15,15,25],分组0:1,1:2,2:1。处理顺序可能影响结果。假设按k顺序0,1,2。external=0*1 +1*2 +3*1=0+2+3=5?总对数是4*3/2=6,total=6-5=1 8. 分组顺序颠倒的情况,比如group=[15,5],分组1和0。这时处理顺序可能先k=1,再k=0。此时prefix_sum先加v=1,然后处理k=0时,external +=1*1=1。总external=1,总对数1,total=0 9. 更大的数值,比如node_specifications=5,group=[3,6,9],分组0,1,1。此时external的计算:当处理k=0(v=1),prefix_sum=0,external加0。然后k=1(v=2),external +=1*2=2。总external=2,总对数3,total=1 10. 混合多个分组,比如group=[0,10,20,30],node_specifications=10,分组0,1,2,3。每个分组一个元素。external=0+1+2+3=6(因为处理顺序是0→1→2→3,每一步的prefix_sum累加)。总对数是4*3/2=6,total=0。 然后,编写测试用例时需要构造这些情况,并计算预期的total和external。 接下来是自动化测试脚本。可以使用unittest模块,创建一个测试类,每个测试用例对应一个测试方法。或者在setUp中设置node_specifications的值,比如假设self.node_specifications是某个固定值,或者测试用例中每个测试方法自己设置。 但是,原函数属于某个类,所以需要在测试用例中实例化该类,并设置node_specifications的值。例如,假设该类有一个属性node_specifications,所以在测试中需要创建该类的实例,并设置node_specifications的值。 例如,测试用例的结构可能如下: import unittest from collections import defaultdict from typing import List, Tuple class MyClass: def __init__(self, node_specifications: int): self.node_specifications = node_specifications def statistic_ranks(self, group: List[int]) -> Tuple[int, int]: rank_cate = defaultdict(int) for rank in group: rank_cate[rank // self.node_specifications] += 1 external = 0 prefix_sum = 0 for k in sorted(rank_cate.keys()): # 注意这里可能需要排序,否则遍历顺序不确定 v = rank_cate[k] external += prefix_sum * v prefix_sum += v total = len(group) * (len(group) -1) //2 - external return total, external class TestStatisticRanks(unittest.TestCase): def setUp(self): # 假设node_specifications是10,或者根据测试用例不同而变化 pass def test_empty_group(self): obj = MyClass(10) self.assertEqual(obj.statistic_ranks([]), (0, 0)) # 其他测试方法类似 但是注意到原函数中的循环是遍历rank_cate.items(),而字典的键顺序在Python3.7+是有序的,但可能测试时需要考虑是否排序。如果原函数没有对键进行排序,那么当分组顺序不同时,计算结果可能不同。例如,当分组键的顺序是1,0时,prefix_sum的处理顺序会影响external的值。因此,原函数可能存在一个潜在的问题,即是否对分组键进行排序。例如,在函数中是否按k的顺序处理分组? 比如,在用户提供的代码中,循环是for k, v in rank_cate.items():,而字典的键顺序是插入顺序。如果group中的元素导致分组键的插入顺序不同,那么计算结果会不同。比如,group是[15,5],那么分组键是15//10=1和5//10=0,插入顺序是1,0吗?因为遍历group时,第一个元素是15,所以分组1被先加入,然后是5,分组0被加入。所以rank_cate.items()的顺序是1,0。此时,在计算external时,处理顺序是k=1,v=1,prefix_sum变为1。然后处理k=0,v=1,external +=1*1=1。总external是1,总对数是1,所以total=0。这可能导致测试用例的结果依赖于输入顺序,这可能是否正确? 例如,如果原函数中分组键的处理顺序不影响结果吗?或者是否应该按排序后的键处理? 例如,group=[5,15]和group=[15,5]是否得到相同的total和external? 假设原函数没有对键进行排序,那么这两个情况会导致不同的结果。例如: 情况1:group=[5,15],分组键是0,1。处理顺序是0→1。external=0*1 +1*1=1。总对数是1,total=0. 情况2:group=[15,5],分组键是1,0。处理顺序是1→0。处理第一个k=1,v=1,external +=0*1=0,prefix_sum=1。然后处理k=0,v=1,external +=1*1=1。总external=1,同样total=0. 哦,原来不管分组键的顺序如何,结果是一样的。因为不管顺序如何,每个分组的v相乘的和等于各组之间元素对的数目。例如,无论处理顺序如何,总的external应该等于所有分组的v_i * v_j的和,其中i < j。或者说,external等于各组之间的元素对数之和。 例如,两个分组A和B,元素数目a和b。则他们之间的元素对数是a*b。不管处理顺序如何,在循环中,当处理A时,prefix_sum是之前的累计数目,假设先处理A,则prefix_sum是a,处理B时,external += a*b。或者如果先处理B,处理A的时候,prefix_sum是b,external += b*a。所以总和是a*b。因此,不管处理顺序如何,总和是各组之间的元素对数的总和。这是因为对于任意两个不同的分组i和j,i<j时,它们的元素数目相乘会被计算一次。如果循环中按任意顺序处理,那么总和会是sum_{i < j} v_i * v_j吗? 例如,有三个分组,数目分别是v1, v2, v3。则总和是v1*v2 + v1*v3 + v2*v3。而循环中的处理方式,如果按v1, v2, v3的顺序处理,那么: 处理v1时,prefix_sum初始为0,external +=0*v1 → 0,prefix_sum变为v1。 处理v2时,external +=v1*v2 → 总和有v1*v2,prefix_sum变为v1+v2. 处理v3时,external += (v1+v2)*v3 → 总和是v1*v3 +v2*v3. 所以总和是v1*v2 +v1*v3 +v2*v3,即各组之间元素对的数目。而如果处理顺序是v3, v2, v1: 处理v3时,external +=0*v3 →0,prefix_sum变为v3. 处理v2时,external +=v3*v2 →总和v3*v2,prefix_sum变为v3+v2. 处理v1时,external += (v3+v2)*v1 →v3*v1 +v2*v1. 总和是v3*v2 +v3*v1 +v2*v1,这和原来的总和相同。因此,不管分组处理的顺序如何,external的值都是各组之间元素对的数目之和。所以原函数中的循环遍历顺序不影响结果。因此,测试用例的设计不需要考虑分组顺序的问题,因为无论处理顺序如何,结果都是正确的。 这样,测试用例的正确性可以保证。因此,测试用例可以设计为: 测试用例1:空列表 → (0,0) 测试用例2:单个元素 → (0,0) 测试用例3:所有元素同一分组 → external=0,total= n*(n-1)/2 测试用例4:两个分组,各一个元素 → external=1,total=0 测试用例5:两个分组,各两个元素 → external=2*2=4?或者要看具体计算。比如group=[5,5,15,15],node_spec=10。分组0和1,每个有两个元素。处理顺序假设是0→1。则: prefix_sum初始为0。处理v=2时,external +=0*2=0,prefix_sum变为2。处理v=2时,external +=2*2=4。总external=4。总对数是4*3/2=6 → total=6-4=2。或者,各组之间的元素对数是2*2=4,所以external=4,total=6-4=2. 是的,所以这个测试用例的预期结果应为total=2,external=4。 接下来,编写测试用例: 例如: TestCase3: group = [5,5,5], node_spec=10 → 分组0有3个元素。external=0 → total=3。 TestCase4: group=[5,15], node_spec=10 → external=1 → total=0. TestCase5: group=[5,15,25], node_spec=10 → external=3 → total=0. TestCase6: group=[5,5,15], node_spec=10 → 分组0有2,分组1有1。external=2 → total=3-2=1. TestCase7: group=[5,15,15,25], node_spec=10 → 分组0:1, 1:2, 2:1。external= (0*1) + (1*(2)) + ( (1+2)*1 )=0 +2 +3=5 → total=6-5=1. TestCase8: group=[15,5], node_spec=10 → 分组1和0。external=1 → total=0. TestCase9: group=[3,6,9], node_spec=5 → 分组0:3//5=0;6//5=1;9//5=1 → 分组0:1,分组1:2。external=0*1 +1*2=2 → total=3*2/2 -2 =3-2=1. TestCase10: group=[0,10,20,30], node_spec=10 → 分组0,1,2,3,每个一个元素。external=0+1+2+3=6?或者正确计算应该是各组之间的总和,即每个分组和其他分组的元素数目相乘之和。因为每个分组有一个元素,所以总和是3+2+1=6。例如,分组0与1,2,3:1*1+1*1+1*1=3。分组1与2,3:1+1=2。分组2与3:1. 总和3+2+1=6. 总对数是4*3/2=6 → total=0. 现在,将这些情况转化为具体的测试用例。 然后,编写自动化测试脚本。使用unittest框架,每个测试用例对应一个测试方法,每个方法中实例化MyClass(假设原函数所在的类名为MyClass),设置node_specifications的值,调用statistic_ranks,并用assertEqual检查结果。 例如: import unittest from mymodule import MyClass # 假设原类在mymodule中 class TestStatisticRanks(unittest.TestCase): def test_empty_group(self): obj = MyClass(10) self.assertEqual(obj.statistic_ranks([]), (0, 0)) def test_single_element(self): obj = MyClass(10) self.assertEqual(obj.statistic_ranks([5]), (0, 0)) def test_all_same_group(self): obj = MyClass(10) group = [5, 5, 5] total, external = obj.statistic_ranks(group) expected_total = 3 expected_external = 0 self.assertEqual((total, external), (expected_total, expected_external)) def test_two_groups_one_each(self): obj = MyClass(10) group = [5, 15] total, external = obj.statistic_ranks(group) self.assertEqual((total, external), (0, 1)) def test_three_groups_one_each(self): obj = MyClass(10) group = [5, 15, 25] total, external = obj.statistic_ranks(group) self.assertEqual((total, external), (0, 3)) def test_two_groups_different_sizes(self): obj = MyClass(10) group = [5, 5, 15] total, external = obj.statistic_ranks(group) self.assertEqual((total, external), (1, 2)) def test_three_groups_various_sizes(self): obj = MyClass(10) group = [5, 15, 15, 25] total, external = obj.statistic_ranks(group) self.assertEqual((total, external), (1, 5)) def test_reverse_group_order(self): obj = MyClass(10) group = [15, 5] total, external = obj.statistic_ranks(group) self.assertEqual((total, external), (0, 1)) def test_node_spec_5(self): obj = MyClass(5) group = [3, 6, 9] total, external = obj.statistic_ranks(group) self.assertEqual((total, external), (1, 2)) def test_four_groups_one_each(self): obj = MyClass(10) group = [0, 10, 20, 30] total, external = obj.statistic_ranks(group) self.assertEqual((total, external), (0, 6)) if __name__ == '__main__': unittest.main() 但是,用户提供的函数中的node_specifications是self.node_specifications,所以每个测试用例可能需要不同的node_specifications。例如,测试用例9中的node_specifications是5,所以在创建MyClass实例时传入5。 此外,原函数中的循环遍历rank_cate.items()的顺序是否会影响结果?根据之前的分析,不会,因为不管顺序如何,external的值等于各组之间元素对的数目总和。因此,测试用例中的各个情况是正确的。 最后,需要将测试用例和自动化测试脚本整合,用户可能希望直接运行脚本进行测试。所以,完整的脚本应该包含MyClass的定义,测试类,以及运行测试的部分。如果原类在其他地方,可能需要导入,但这里假设需要完整代码,所以需要包含MyClass的定义。</think><< 以下是10个测试用例和自动化测试脚本: 测试用例设计: ```python # 测试用例列表,格式:(node_specifications, group, expected_total, expected_external) test_cases = [ # 空列表 (10, [], (0, 0)), # 单元素列表 (10, [5], (0, 0)), # 所有元素同分组 (10, [5, 5, 5], (3, 0)), # 两个分组各1个元素 (10, [5, 15], (0, 1)), # 三个分组各1个元素 (10, [5, 15, 25], (0, 3)), # 两组不同数量(2+1) (10, [5, 5, 15], (1, 2)), # 三组不同数量(1+2+1) (10, [5, 15, 15, 25], (1, 5)), # 倒序分组测试 (10, [15, 5], (0, 1)), # 不同node_spec测试 (5, [3, 6, 9], (1, 2)), # 四个分组各1个元素 (10, [0, 10, 20, 30], (0, 6)) ] ``` 自动化测试脚本: ```python import unittest from collections import defaultdict from typing import List, Tuple class NetworkAnalyzer: def __init__(self, node_specifications: int): self.node_specifications = node_specifications def statistic_ranks(self, group: List[int]) -> Tuple[int, int]: rank_cate = defaultdict(int) for rank in group: rank_cate[rank // self.node_specifications] += 1 external = 0 prefix_sum = 0 # 注意:这里显式排序以保证跨Python版本行为一致 for k in sorted(rank_cate): v = rank_cate[k] external += prefix_sum * v prefix_sum += v total = len(group) * (len(group) - 1) // 2 - external return total, external class TestStatisticRanks(unittest.TestCase): def test_all_cases(self): test_cases = [ (10, [], (0, 0)), (10, [5], (0, 0)), (10, [5, 5, 5], (3, 0)), (10, [5, 15], (0, 1)), (10, [5, 15, 25], (0, 3)), (10, [5, 5, 15], (1, 2)), (10, [5, 15, 15, 25], (1, 5)), (10, [15, 5], (0, 1)), (5, [3, 6, 9], (1, 2)), (10, [0, 10, 20, 30], (0, 6)) ] for spec, group, expected in test_cases: with self.subTest(spec=spec, group=group): analyzer = NetworkAnalyzer(spec) result = analyzer.statistic_ranks(group) self.assertEqual(result, expected) if __name__ == "__main__": unittest.main(verbosity=2) ``` **代码解释:** 1. `NetworkAnalyzer`类封装了核心逻辑,使用sorted()保证分组处理顺序一致 2. 测试类使用subTest实现参数化测试,每个测试用例独立验证 3. 显式排序字典键来保证跨Python版本行为一致 4. 验证了边界条件、特殊分组、不同规格参数等情况 **运行方式:** 1. 将代码保存为test_network.py 2. 终端执行:python test_network.py 3. 观察输出验证10个测试是否全部通过 >>
阅读全文

相关推荐

drop table IF exists tmp_quarter; CREATE temporary TABLE tmp_quarter ( city_comcode VARCHAR(50), -- 地市机构编码 customer_group VARCHAR(50), -- (不)指定客户类型 customer_type VARCHAR(50), -- 客群类型 statistic_year int, -- 年份 statistic_quarter int, -- 季度 sea_num int, lake_num int, tool_num int, -- 器的创建格式 rights_total_num int, -- 不指定-湖 所含权益总数量 rights_assign_num int, -- 不指定-湖 所含权益客户经理已分配数量 rights_valid_num int, -- 不指定-湖 所含权益剩余可分配数量 assign_rate DECIMAL(10,2), -- 不指定-湖 所权益分配率 sea_rights_total_num int, -- 不指定-海权益 总数 sea_rights_remain_num int, -- 不指定-海剩余可分解权益总数 -- all_kq_num int, -- 器的 卡券总数 url_num int, -- 已生成的链接数 yd_success_num int, -- 已滴灌成功数 ylq_kq_num int, -- 已领取卡券数量 use_kq_num int, -- 已领取卡券数量 send_rate DECIMAL(10, 2), -- 滴灌发送率 diguan_rate DECIMAL(10,2), -- 滴灌成功率 use_rate DECIMAL(10,2) -- 滴灌使用率 ); insert into tmp_quarter select a.city_comcode, a.customer_group, a.customer_type, a.statistic_year, a.statistic_quarter, sum(a.sea_num) sea_num , -- 海个数 sum(a.lake_num) lake_num , -- 湖个数 sum(a.tool_num) tool_num , -- 器的创建格式 sum(a.rights_total_num) rights_total_num , -- 不指定-湖 所含权益总数量 sum(a.rights_assign_num) rights_assign_num , -- 不指定-湖 所含权益客户经理已分配数量 sum(a.rights_valid_num) rights_valid_num , -- 不指定-湖 所含权益剩余可分配数量 sum(a.rights_valid_num) rights_valid_num , -- 不指定-湖 所含权益剩余可分配数量 round(sum(a.rights_assign_num)/sum(a.rights_total_num)*100,2) assign_rate, -- 不指定-湖 所权益分配率 sum(a.sea_rights_total_num) sea_rights_total_num, -- 不指定-海权益 总数 sum(a.sea_rights_remain_num) sea_rights_remain_num, -- 不指定-海剩余可分解权益总数 sum(a.url_num) url_num, -- 已生成的链接数 sum(a.yd_success_num) yd_success_num, -- 已滴灌成功数 sum(a.ylq_kq_num) ylq_kq_num, -- 已领取卡券数量 sum(a.use_kq_num) use_kq_num, -- 客户使用卡券数量 round(sum(a.url_num)/sum(a.tool_num)*100,2) send_rate, -- 滴灌发送率 当月已生成链接数/当月滴灌任务总数 round(sum(a.yd_success_num)/sum(a.tool_num)*100,2) diguan_rate, -- 滴灌成功率 当月已滴灌成功数/当月滴灌任务总数 round(sum(a.use_kq_num)/sum(a.ylq_kq_num)*100,2) use_rate -- 滴灌使用率 当月客户使用数/当月已领取卡券数量 from tmp_month a group by a.city_comcode, a.customer_group, a.customer_type, a.statistic_year, a.statistic_quarter ;该sql报异常Column count doesn't match value count at row 1 为什么

{ "objects": [ { "id": "12-1", "name": "sky-sunny", "label": "Sky-Sunny" }, { "id": "8-1", "name": "plant-tree-1", "label": "Plant-Tree (Tree 1)" } ], "relationships": [ { "subject": "12-1", "predicate": "above", "object": "8-1" }, { "subject": "12-1", "predicate": "above", "object": "8-2" }, { "subject": "12-1", "predicate": "above", "object": "4-1" }, { "subject": "12-1", "predicate": "above", "object": "9-1" }, { "subject": "12-1", "predicate": "above", "object": "9-2" }, { "subject": "8-2", "predicate": "behind", "object": "9-2" }, { "subject": "9-2", "predicate": "behind", "object": "6-1" }, { "subject": "9-1", "predicate": "adjacent to", "object": "8-1" }, { "subject": "9-1", "predicate": "adjacent to", "object": "10-1" }, { "subject": "6-1", "predicate": "on the left of", "object": "16-1" }, { "subject": "10-2", "predicate": "on the left of", "object": "16-1" }, ] }PS E:\Desktop\from 4B4\text_graph(img001-237)\text_graph_new(img001-237)> & E:/anaconda/python.exe "e:/Desktop/from 4B4/text_graph(img001-237)/text_graph_new(img001-237)/statistic/nodes_edges.py" e:\Desktop\from 4B4\text_graph(img001-237)\text_graph_new(img001-237)\statistic\nodes_edges.py:3: SyntaxWarning: invalid escape sequence '\D' data = '''["E:\Desktop\from 4B4\text_graph(img001-237)\park\img001.json"]''' Traceback (most recent call last): File "e:\Desktop\from 4B4\text_graph(img001-237)\text_graph_new(img001-237)\statistic\nodes_edges.py", line 7, in <module> all_nodes.update(obj["id"] for obj in data["objects"]) ~~~~^^^^^^^^^^^ TypeError: string indices must be integers, not 'str'

DATASOURCE_DIALECT: oracle REDIS_PASSWORD: Longshare12345 server: bes: basedir: # 如bes.lic.txt文件位于/bes/license/bes.lic.txt,则只需要配置到/bes/ tongweb: license: type: file path: # 配置到license.dat文件的绝对路径 forward-headers-strategy: ${FORWAD_HEADERS_STRATEGY:none} # ta所有应用的公共配置 spring: datasource: url: ${DATASOURCE_FULL_URL:jdbc:oracle:thin:@10.102.25.247:1521:htdb} #url: ${DATASOURCE_FULL_URL:jdbc:oracle:thin:@10.102.21.80:1521:htdb} username: ${DATASOURCE_USER:zgta} password: ${DATASOURCE_PASSWORD:Longshare#123} druid: initial-size: 100 min-idle: 10 max-active: 100 max-wait: 60000 time-between-eviction-runs-millis: 60000 pool-prepared-statements: true max-pool-prepared-statement-per-connection-size: 20 validation-query: select 1 from dual test-while-idle: true test-on-borrow: false test-on-return: false redis: database: 5 host: ${REDIS_HOST:10.102.25.247} port: ${REDIS_PORT:6379} password: ${REDIS_PASSWORD:Longshare12345} ignite: url: ${IGNITE_URL:10.102.25.247:49500} kafka: bootstrap-servers: ${KAFKA_URL:10.102.25.247:9092} zk-nodes: ${ZOOKEEPER_URL:10.102.25.247:2181} mail: enable: false host: ${MAIL_SERVICE_URL:smtp.163.com} username: ${MAIL_USER:[email protected]} password: ${MAIL_PASSWORD:longshare1} port: 465 platform: dbtype: ${DATASOURCE_DIALECT:oracle} mapper: identity: ${DATASOURCE_DIALECT:oracle} pagehelper: helper-dialect: ${DATASOURCE_DIALECT:oracle} rest: swagger: enable: false file-bus: enable: false # 是否开通文件总线功能,默认关闭 sync: hs-data: false # 默认关闭同步hs数据 jodconverter: local: enabled: true office-home: ${OFFICE_HOME:/opt/libreoffice7.3} exception: openLogPosition: false #默认关闭日志定位提示 robin: route: host: ${HOST_ROUTE:false} data: mask: enable: ${DATA_MASK:false} # 是否开启脱敏 excel: export: customize: true # excel导出过滤客户自定义列 statistic: true # excel导出统计行列 feign: # 如果需要ta运管集成功能,比如净值自动复核功能,则手动开启 audit: name: ta-compare uri: localhost:5301 context-path: /audit indicator: name: ta-compare uri: localhost:5301 context-path: /audit system: name: ta-system context-path: /system scheduler: name: ta-system context-path: /system compare: table: save: 1 data-maintenance: enable: true feign: client: config: default: connectTimeout: 300000 readTimeout: 300000 logging: open: true #日志收集开启 #日志根目录 #basedir: ${LOG_DIR:/home/ta/logs/} #quota: #path: ${logging.basedir:}quota/ file: #name: ${logging.basedir:}${spring.application.name}/${spring.application.name}.log name: ./${spring.application.name}.log level: root: error com.longshare: warn com.longshare.rest.core.util.RequestContextUtil: warn org.springframework.jdbc.core: warn logback: rollingpolicy: max-file-size: 50MB max-history: 10000 management: endpoint: health: show-details: never # 生产环境修改为never 介绍这段nacos,application.yml

#include <stdint.h> #include <math.h> #include <stdio.h> #define N 200 // 最大样本量 #define p_max 5 // 最大滞后阶数 // 数据结构体 typedef struct { float data[N]; // 原始数据 float delta_y[N]; // Δy_t int n; // 实际数据长度 int p; // 滞后阶数 } ADF_Model; // OLS回归结果 typedef struct { float alpha; // 截距项α float delta; // δ系数 float gamma[p_max];// γ系数数组 float se_delta; // δ的标准误 float adf_stat; // ADF统计量 } ADF_Result; // 计算差分 Δy_t = y_t - y_{t-1} void compute_delta_y(ADF_Model *model) { for (int t = 1; t < model->n; t++) { model->delta_y[t-1] = model->data[t] - model->data[t-1]; } } // 执行ADF检验(模型2) void adf_test_model2(ADF_Model *model, ADF_Result *result) { int effective_len = model->n - 1 - model->p; // 有效样本量 float X[effective_len][model->p + 2]; // 设计矩阵 [1, y_{t-1}, Δy_{t-1}, ..., Δy_{t-p}] float y[effective_len]; // 因变量 Δy_t // 构建设计矩阵和因变量 for (int t = 0; t < effective_len; t++) { X[t][0] = 1.0; // 截距项 X[t][1] = model->data[t + model->p - 1]; // y_{t-1} y[t] = model->delta_y[t + model->p]; // Δy_t // 滞后项 Δy_{t-i} for (int i = 0; i < model->p; i++) { X[t][i + 2] = model->delta_y[t + model->p - i - 1]; } } // OLS估计(简化版矩阵运算) float XTX[(p_max + 2)][(p_max + 2)] = {0}; float XTy[(p_max + 2)] = {0}; // 计算 X'X 和 X'y for (int i = 0; i < effective_len; i++) { for (int j = 0; j < model->p + 2; j++) { for (int k = 0; k < model->p + 2; k++) { XTX[j][k] += X[i][j] * X[i][k]; } XTy[j] += X[i][j] * y[i]; } } // 矩阵求逆(使用高斯-约旦法,限于小矩阵) float inv[(p_max + 2)][(p_max + 2)]; // ... 此处省略矩阵求逆具体实现(需根据p_max优化) ... // 参数估计 beta = inv(X'X) * X'y float beta[(p_max + 2)] = {0}; for (int i = 0; i < model->p + 2; i++) { for (int j = 0; j < model->p + 2; j++) { beta[i] += inv[i][j] * XTy[j]; } } // 提取关键参数 result->alpha = beta[0]; result->delta = beta[1]; for (int i = 0; i < model->p; i++) { result->gamma[i] = beta[i + 2]; } // 计算标准误(简化方法) float residuals[effective_len]; float residual_sum = 0.0; for (int i = 0; i < effective_len; i++) { float y_pred = beta[0] + beta[1] * X[i][1]; for (int j = 0; j < model->p; j++) { y_pred += beta[j + 2] * X[i][j + 2]; } residuals[i] = y[i] - y_pred; residual_sum += residuals[i] * residuals[i]; } float sigma2 = residual_sum / (effective_len - model->p - 2); result->se_delta = sqrt(sigma2 * inv[1][1]); // ADF统计量 result->adf_stat = result->delta / result->se_delta; } // 获取p值(基于预存临界值) float get_adf_p_value(float adf_stat) { // 模型2常见临界值(样本量100) const float cv_1pct = -3.43; const float cv_5pct = -2.86; const float cv_10pct = -2.57; if (adf_stat < cv_1pct) return 0.01; else if (adf_stat < cv_5pct) return 0.05; else if (adf_stat < cv_10pct) return 0.10; else return 0.15; // 无法拒绝原假设 } int main() { ADF_Model model; ADF_Result result; // 示例数据(需替换为实际数据) float sample_data[] = { /* 时间序列数据 */ }; model.n = sizeof(sample_data)/sizeof(float); for (int i = 0; i < model.n; i++) { model.data[i] = sample_data[i]; } model.p = 2; // 滞后阶数(需根据AIC/BIC选择) compute_delta_y(&model); adf_test_model2(&model, &result); // 输出结果 printf("ADF Statistic: %.3f\n", result.adf_stat); printf("P-Value Approx: %.3f\n", get_adf_p_value(result.adf_stat)); return 0; }

(rmats) [stu4@localhost :~]$ echo -e "/home/stu4/SRR5476912_sorted.bam\n/home/stu4/SRR5476913_sorted.bam" > ./bam_list1.txt (rmats) [stu4@localhost :~]$ echo -e "/home/stu4/SRR5476914_sorted.bam\n/home/stu4/SRR5476915_sorted.bam" > ./bam_list2.txt (rmats) [stu4@localhost :~]$ cat ./bam_list1.txt /home/stu4/SRR5476912_sorted.bam /home/stu4/SRR5476913_sorted.bam (rmats) [stu4@localhost :~]$ cat ./bam_list2.txt /home/stu4/SRR5476914_sorted.bam /home/stu4/SRR5476915_sorted.bam (rmats) [stu4@localhost :~]$ /opt/Anaconda3/envs/rmats/bin/rmats.py \ > --b1 ./bam_list1.txt \ > --b2 ./bam_list2.txt \ > --gtf /home/stu4/Mus_musculus.GRCm38.102.chr.gtf \ > --od /home/stu4/rMATS_output/outs \ > --tmp /home/stu4/rMATS_output/tmp \ > -t paired \ > --readLength 115 \ > --cstat 0.05 \ > --libType fr-unstranded \ > --nthread 4 \ > --tstat 2 gtf: 22.1770730019 There are 55401 distinct gene ID in the gtf file There are 142604 distinct transcript ID in the gtf file There are 34279 one-transcript genes in the gtf file There are 843402 exons in the gtf file There are 26950 one-exon transcripts in the gtf file There are 21842 one-transcript genes with only one exon in the transcript Average number of transcripts per gene is 2.574033 Average number of exons per transcript is 5.914294 Average number of exons per transcript excluding one-exon tx is 7.059436 Average number of gene per geneGroup is 7.464226 statistic: 0.0235040187836 Fail to open /home/stu4/SRR5476912_sorted.bam /home/stu4/SRR5476913_sorted.bam Fail to open /home/stu4/SRR5476914_sorted.bam /home/stu4/SRR5476915_sorted.bam read outcome totals across all BAMs USED: 0 NOT_PAIRED: 0 NOT_NH_1: 0 NOT_EXPECTED_CIGAR: 0 NOT_EXPECTED_READ_LENGTH: 0 NOT_EXPECTED_STRAND: 0 EXON_NOT_MATCHED_TO_ANNOTATION: 0 JUNCTION_NOT_MATCHED_TO_ANNOTATION: 0 CLIPPED: 0 total: 0 outcomes by BAM written to: /home/stu4/rMATS_output/tmp/2025-07-01-01:37:15_478511_read_outcomes_by_bam.txt novel: 0.000968933105469 The splicing graph and candidate read have been saved into /home/stu4/rMATS_output/tmp/2025-07-01-01:37:15_478511_*.rmats save: 0.000121116638184 Traceback (most recent call last): File "/opt/Anaconda3/envs/rmats/bin/rmats.py", line 536, in <module> main() File "/opt/Anaconda3/envs/rmats/bin/rmats.py", line 507, in main run_pipe(args) File "rmatspipeline/rmatspipeline.pyx", line 3803, in rmats.rmatspipeline.run_pipe File "rmatspipeline/rmatspipeline.pyx", line 3666, in rmats.rmatspipeline.split_sg_files_by_bam File "rmatspipeline/rmatspipeline.pyx", line 3674, in rmats.rmatspipeline.split_sg_files_by_bam ValueError: invalid literal for int() with base 10: '/home/stu4/SRR5476913_sorted.bam'

select d.city_comcode, d.county_comcode, d.group_type, d.package_id, d.package_type, d.rights_id, d.statistic_year, d.statistic_quarter, sum(d.total_num) total_num, -- 权益包总数 sum(d.package_kq_num) package_kq_num, -- 权益包卡券数 sum(d.package_ylq_kq_num) package_ylq_kq_num, -- 权益包 已领取卡券数 sum(d.rights_ylq_kq_num) rights_ylq_kq_num, -- 权益项目 已领取卡券数, sum(d.rights_use_kq_num) rights_use_kq_num, -- 权益项目 已使用卡券数 ROUND( CASE WHEN COALESCE(sum(d.rights_ylq_kq_num), 0) = 0 THEN 0.00 WHEN COALESCE(sum(d.package_ylq_kq_num), 0) = 0 THEN null ELSE sum((d.rights_ylq_kq_num) / sum(d.package_ylq_kq_num) * 100 END, 2 ) AS rights_package_rate -- , -- 领取数量占比 权益项目卡券领取数量/包的卡券领取总数 -- ROUND( -- CASE -- WHEN COALESCE(sum(d.rights_use_kq_num), 0) = 0 THEN 0.00 -- WHEN COALESCE(sum(d.rights_ylq_kq_num), 0) = 0 THEN null -- ELSE sum(d.rights_use_kq_num) / sum(d.rights_ylq_kq_num) * 100 -- END, 2 -- ) AS rights_use_rate -- 使用率 卡券使用量/卡券领取数量 包下面的各个权益项目 from tmp_package_month d group by d.city_comcode, d.county_comcode, d.group_type, d.package_id, d.package_type, d.rights_id, d.statistic_year, d.statistic_quarter ; 我这个sql报异常 You have an error in your SQL syntax; check the manual that corresponds to your GBase server version for the right syntax to use near 'END, 2 ) AS rights_package_rate -- , -- 领取数量占比 权益项目卡券' at line 11 是怎么回事

这是slp_model.h中部分代码: #define ALARM_PLAN_STR_MAX_LEN 16 typedef struct _MSG_ALARM_CHN1_PLAN { SWITCH enabled; char alarm_plan_1[5][ALARM_PLAN_STR_MAX_LEN + 1]; /* 0000-0000,000格式 */ S32 alarm_plan_num; }MSG_ALARM_CHN1_PLAN, *PTR_MSG_ALARM_PLAN; 这是msg_alarm.c中部分代码: LOCAL void msg_alarm_plan_data_model() { /*************************************************************************************/ /********* Desc of /msg_alarm_plan/chn1_msg_alarm_plan *******************************/ /*************************************************************************************/ DS_ARR_DESC(alarm_plan, OPT_TYPE_STRING, MSG_ALARM_CHN1_PLAN, alarm_plan_1); DS_OPT_DESC chn1_msg_alarm_plan_options[] = { DS_SWITCH_OPT(MSG_ALARM_CHN1_PLAN, enabled, OPT_FLAG_NORM), DS_ARR_OPT(MSG_ALARM_CHN1_PLAN, alarm_plan_1, OPT_FLAG_NORM, &alarm_plan), DS_S32_OPT(MSG_ALARM_CHN1_PLAN, alarm_plan_num, OPT_FLAG_NORM), }; DS_SEG_DESC chn1_msg_alarm_plan_segments[] = { DS_STRUCT_SEG("chn1_msg_alarm_plan", SEG_LIM_RW, SEG_GROUP_ROOT, MSG_ALARM_CHN1_PLAN, chn1_msg_alarm_plan_options), }; DS_SECT_DESC chn1_msg_alarm_plan_sections[] = { DS_STRUCT_SECT("chn1_msg_alarm_plan", chn1_msg_alarm_plan_segments), }; /*************************************************************************************/ /********* Desc of /msg_alarm_plan/arming_schedule_sound***************************************/ /*************************************************************************************/ DS_OPT_DESC arming_schedule_info_options[] = { DS_STR_OPT(ARMING_SCHEDULE, monday, OPT_FLAG_NORM), DS_STR_OPT(ARMING_SCHEDULE, tuesday, OPT_FLAG_NORM), DS_STR_OPT(ARMING_SCHEDULE, wednesday, OPT_FLAG_NORM), DS_STR_OPT(ARMING_SCHEDULE, thursday, OPT_FLAG_NORM), DS_STR_OPT(ARMING_SCHEDULE, friday, OPT_FLAG_NORM), DS_STR_OPT(ARMING_SCHEDULE, saturday, OPT_FLAG_NORM), DS_STR_OPT(ARMING_SCHEDULE, sunday, OPT_FLAG_NORM), }; DS_SEG_DESC sound_arming_schedule_info_segments[] = { DS_STRUCT_SEG("arming_schedule_sound", SEG_LIM_RW, SEG_GROUP_ROOT, ARMING_SCHEDULE, arming_schedule_info_options), }; DS_SECT_DESC sound_arming_schedule_sections[] = { DS_STRUCT_SECT("arming_schedule_sound", sound_arming_schedule_info_segments), }; /*************************************************************************************/ /********* Desc of /msg_alarm_plan/arming_schedule_light***************************************/ /*************************************************************************************/ DS_SEG_DESC light_arming_schedule_info_segments[] = { DS_STRUCT_SEG("arming_schedule_light", SEG_LIM_RW, SEG_GROUP_ROOT, ARMING_SCHEDULE, arming_schedule_info_options), }; DS_SECT_DESC light_arming_schedule_sections[] = { DS_STRUCT_SECT("arming_schedule_light", light_arming_schedule_info_segments), }; DS_TBL_DESC msg_alarm_plan_tables[] = { DS_STRUCT_TBL("plan", TBL_ATTR_CFG, chn1_msg_alarm_plan_sections), DS_STRUCT_TBL("plan", TBL_ATTR_CFG, sound_arming_schedule_sections), DS_STRUCT_TBL("plan", TBL_ATTR_CFG, light_arming_schedule_sections), }; DS_DAT_MON_DESC msg_alarm_plan_data_monitor[] = { DS_DAT_MON(MSG_ALARM_CHN1_PLAN_PATH, DATA_ATTRI_CHECK), DS_DAT_MON(MSG_ALARM_PLAN_ARMING_SCHEDULE_SOUND_PATH, DATA_ATTRI_CHECK), DS_DAT_MON(MSG_ALARM_PLAN_ARMING_SCHEDULE_LIGHT_PATH, DATA_ATTRI_CHECK), }; DS_MOD_DESC msg_alarm_plan_module = DS_STRUCT_MOD("msg_alarm_plan", msg_alarm_plan_init, msg_alarm_plan_check, NULL, msg_alarm_plan_start, NULL, msg_alarm_plan_tables, msg_alarm_plan_data_monitor); MODULE *module_node = ds_register_module("msg_alarm_plan", &msg_alarm_plan_module); CAP_ASSERT(NULL != module_node); } CAP_INIT(msg_alarm_plan_data_model); 这是alarm_plan_ds.c中的代码: #include <stdio.h> #include <stdlib.h> #include <string.h> #include <ctype.h> #include <unistd.h> #include "slp_model.h" #include "libds.h" #include "msg_alarm.h" #include "detection_utils.h" #define MSG_ALARM_PLAN_MODULE_NAME "msg_alarm_plan" #define MSG_ALARM_PLAN_TABLE_NAME "plan" #define MSG_ALARM_PLAN_SECTION_NAME "chn1_msg_alarm_plan" /* 存放从ds中读取的数据 */ LOCAL MSG_ALARM_CHN1_PLAN g_msg_alarm_plan = {FALSE, NULL, 0}; /* ds get回调函数 */ /* 从ds共享内存中读取,然后填入json字符串 */ S32 ds_cb_get_alarm_plan(struct _DS_HANDLE_CONTEXT *context, JSON_OBJPTR reply_obj) { S32 i = 0; if (NULL == context || NULL == reply_obj) { MSG_ALARM_ERROR("ds_cb_get_alarm_plan: ptr is null"); return ERROR; } /* 从内存中读取并存入g_msg_alarm_plan结构体中 */ if (0 == ds_read(MSG_ALARM_CHN1_PLAN_PATH, &g_msg_alarm_plan, sizeof(MSG_ALARM_CHN1_PLAN))) { MSG_ALARM_ERROR("read from ds shm fail."); return ERROR; } /* 将enabled配置写入json */ jso_add_string(reply_obj, "enabled", g_msg_alarm_plan.enabled ? "on" : "off"); /* 将alarm_plan_num配置写入json */ jso_add_int(reply_obj, "alarm_plan_num", g_msg_alarm_plan.alarm_plan_num); JSON_OBJPTR alarm_plan_array = jso_new_array(); if(NULL == alarm_plan_array) { MSG_ALARM_ERROR("create new array object fail."); return ERROR; } /* 将alarm_plan_1数组配置写入json */ for (i = 0; i < g_msg_alarm_plan.alarm_plan_num; i++) { jso_array_add(alarm_plan_array, jso_new_string(g_msg_alarm_plan.alarm_plan_1[i])); } jso_obj_add(reply_obj, "alarm_plan_1", alarm_plan_array); /* 调试:打印json字符串 */ MSG_ALARM_DEBUG(" JSON %s",json_object_to_json_string(reply_obj)); return OK; } /* ds set回调函数 */ /* 解析json字符串,然后填入ds共享内存 */ S32 ds_cb_set_alarm_plan(struct _DS_HANDLE_CONTEXT *context, U8 method, const char* section_name, JSON_OBJPTR req_obj, BOOL is_table) { S32 i = 0; S32 ret = OK; const char *json_value_str = NULL; if (NULL == context || NULL == section_name || NULL == req_obj) { MSG_ALARM_ERROR("ptr is null"); return ERROR; } /* 从json中获取enable配置值 */ json_value_str = jso_obj_get_string_origin(req_obj, "enabled"); if (NULL == json_value_str) { MSG_ALARM_ERROR("jso_obj_get_string_origin key-enable return NULL"); return ERROR; } g_msg_alarm_plan.enabled = 0; if (0 == strcmp(json_value_str, "on")) { g_msg_alarm_plan.enabled = 1; } /* 从json中获取alarm_plan_num配置值 */ if (!jso_obj_get_int(req_obj, "alarm_plan_num", &g_msg_alarm_plan.alarm_plan_num)) { MSG_ALARM_ERROR("jso_obj_get_int key-alarm_plan_num return -1"); return ERROR; } /* 如果传入太多,只取前最大plan个数 */ if (g_msg_alarm_plan.alarm_plan_num > ALARM_PLAN_SIZE) { MSG_ALARM_ERROR("set too many plans!"); g_msg_alarm_plan.alarm_plan_num = ALARM_PLAN_SIZE; } JSON_OBJPTR alarm_plan_array = jso_obj_get(req_obj, "alarm_plan_1"); JSON_OBJPTR alarm_plan_term = jso_new_string(""); if (!jso_is_array(alarm_plan_array)) { MSG_ALARM_ERROR("key-alarm_plan_1 get non-array"); return ERROR; } /* 从json中获取alarm_plan_ch1配置值 */ for (i = 0; i < g_msg_alarm_plan.alarm_plan_num; i++) { alarm_plan_term = jso_array_get_idx(req_obj, i); if (!jso_is_string(alarm_plan_term)) { MSG_ALARM_ERROR("key-alarm_plan_1[] get non-string"); return ERROR; } jso_to_string(alarm_plan_term, g_msg_alarm_plan.alarm_plan_1[i], ALARM_PLAN_STR_MAX_LEN); } if (0 == ds_write(MSG_ALARM_CHN1_PLAN_PATH, &g_msg_alarm_plan, sizeof(MSG_ALARM_CHN1_PLAN))) { MSG_ALARM_ERROR("ds_write %s error", MSG_ALARM_CHN1_PLAN_PATH); return ERROR; } ret = ds_save_usr_cfg(); MSG_ALARM_DEBUG("ds_save_usr_cfg() ret[%d]", ret); /* 由于ds暂不支持listConfig的reload,所以这里手动调用 */ if (OK == ret) { alarm_plan_reload(); } return OK; } /* ds del回调函数 */ /* 解析json字符串,然后删除ds共享内存结构体中对应的plan */ S32 ds_cb_del_alarm_plan(struct _DS_HANDLE_CONTEXT *context, U8 method, const char* section_name, JSON_OBJPTR req_obj, BOOL is_table) { S32 i = 0; S32 ret = OK; const char *json_value_str = NULL; if (NULL == context || NULL == section_name || NULL == req_obj) { MSG_ALARM_ERROR("ptr is null"); return ERROR; } /* 从内存中读取并存入g_msg_alarm_plan结构体中 */ if (0 == ds_read(MSG_ALARM_CHN1_PLAN_PATH, &g_msg_alarm_plan, sizeof(MSG_ALARM_CHN1_PLAN))) { MSG_ALARM_ERROR("read from ds shm fail."); return ERROR; } JSON_OBJPTR alarm_plan_array = jso_obj_get(req_obj, "alarm_plan_1"); JSON_OBJPTR alarm_plan_term = jso_new_string(""); if (!jso_is_array(alarm_plan_array)) { MSG_ALARM_ERROR("key-alarm_plan_1 get non-array"); return ERROR; } /* 删的数量过多,清空plan数组 */ if (0 > (g_msg_alarm_plan.alarm_plan_num - jso_array_length(alarm_plan_array))) { for (i = 0; i < g_msg_alarm_plan.alarm_plan_num; i++ ) { memset(g_msg_alarm_plan.alarm_plan_1[i], 0, ALARM_PLAN_STR_MAX_LEN); } MSG_ALARM_ERROR("delete too many plans."); return ERROR; } /* 从json中获取enable配置值 */ json_value_str = jso_obj_get_string_origin(req_obj, "enabled"); if (NULL == json_value_str) { MSG_ALARM_ERROR("jso_obj_get_string_origin key-enable return NULL"); return ERROR; } if (!strcmp(json_value_str, "on")) { g_msg_alarm_plan.enabled = 1; } else if (!strcmp(json_value_str, "off")) { g_msg_alarm_plan.enabled = 0; } else { MSG_ALARM_ERROR("set wrong key-enable param"); return ERROR; } /* 从json中获取要删除的plan项并删除,并更新alarm_plan_num的值 */ for (i = 0; i < jso_array_length(alarm_plan_array); i++) { alarm_plan_term = jso_array_get_idx(req_obj, i); if (!jso_is_string(alarm_plan_term)) { MSG_ALARM_ERROR("key-alarm_plan_1[] get non-string"); return ERROR; } jso_to_string(alarm_plan_term, json_value_str, ALARM_PLAN_STR_MAX_LEN); for (int j = 0; j < g_msg_alarm_plan.alarm_plan_num; j++) { if (!strncmp(json_value_str, g_msg_alarm_plan.alarm_plan_1[j], strlen(json_value_str))) { strncpy(g_msg_alarm_plan.alarm_plan_1[j], g_msg_alarm_plan.alarm_plan_1[g_msg_alarm_plan.alarm_plan_num - 1], strlen(g_msg_alarm_plan.alarm_plan_1[g_msg_alarm_plan.alarm_plan_num - 1])); memset(g_msg_alarm_plan.alarm_plan_1[g_msg_alarm_plan.alarm_plan_num - 1], 0, ALARM_PLAN_STR_MAX_LEN); g_msg_alarm_plan.alarm_plan_num--; break; } } } if (0 == ds_write(MSG_ALARM_CHN1_PLAN_PATH, &g_msg_alarm_plan, sizeof(MSG_ALARM_CHN1_PLAN))) { MSG_ALARM_ERROR("ds_write %s error", MSG_ALARM_CHN1_PLAN_PATH); return ERROR; } ret = ds_save_usr_cfg(); MSG_ALARM_DEBUG("ds_save_usr_cfg() ret[%d]", ret); /* 由于ds暂不支持listConfig的reload,所以这里手动调用 */ if (OK == ret) { msg_alarm_plan_reload(); } return OK; } /* 注册ds get/set 回调函数 */ S32 registe_ds_cb() { S32 ret = OK; if (ERROR == ds_register_get_json(MSG_ALARM_PLAN_MODULE_NAME, MSG_ALARM_PLAN_TABLE_NAME, MSG_ALARM_PLAN_SECTION_NAME, ds_cb_get_alarm_plan)) { MSG_ALARM_ERROR("ds_register_get_json return error"); ret = ERROR; } if (ERROR == ds_register_set_json(MSG_ALARM_PLAN_MODULE_NAME, MSG_ALARM_PLAN_TABLE_NAME, MSG_ALARM_PLAN_SECTION_NAME, ds_cb_set_alarm_plan)) { MSG_ALARM_ERROR("ds_register_set_json return error"); ret = ERROR; } if (ERROR == ds_register_del_json(MSG_ALARM_PLAN_MODULE_NAME, MSG_ALARM_PLAN_TABLE_NAME, ds_cb_del_alarm_plan)) { MSG_ALARM_ERROR("ds_register_del_json return error"); ret = ERROR; } return ret; } /* 获取报警排程 */ PTR_MSG_ALARM_PLAN get_alarm_plan_cfg() { return &g_msg_alarm_plan; } /* 初始化 */ S32 alarm_plan_init() { S32 ret = OK; /* 注册ds set/get/del回调函数 */ ret = registe_ds_cb(); if (ERROR == ret) { MSG_ALARM_ERROR("registe_ds_cb error"); return ret; } /* 初始化ds侦测报警排程结构体 */ g_msg_alarm_plan.enabled = FALSE; g_msg_alarm_plan.alarm_plan_num = 0; for(int i = 0; i < ALARM_PLAN_SIZE; i++) { memset(g_msg_alarm_plan.alarm_plan_1[i], 0, ALARM_PLAN_STR_MAX_LEN); } return ret; } 发生以下错误:make "make -C modules/msg_alarm MODULE_NAME=msg_alarm" make[5]: Entering directory '/home/xyc/NVMP/nvmp/build_dir/target-arm-AX620E-linux-uclibcgnueabihf-c668bv1/cap/modules/msg_alarm' arm-AX620E-linux-uclibcgnueabihf-gcc -Os -pipe -D__LINUX_ARM_ARCH__=7 -march=armv7-a -mfloat-abi=hard -Wformat=0 -g -Wno-stringop-truncation -Wno-pointer-to-int-cast -Wno-int-to-pointer-cast -Wno-sizeof-pointer-div -Wno-restrict -Wno-stringop-overflow -Wno-format-truncation -Wno-format-overflow -Wno-error -g -DMCU_DIGITAL_LIGHT_SENSOR -DMCU_DIGITAL_PIR_SENSOR -DCLOUD_IOT_SUPPORT -DTAPO_USR_DEF_AUDIO_ALARM -DAUDIO_SAMPLE_RATE=16000 -DTAPO_AUDIO_ALARM_SETTINGS -DOPTIONAL_ALARM_AUDIO -DTELEMETRY_SUPPORT -DIR_LED_USE_MCU_ADC -DTP_TAPO_BATTERY_CAM -DTAPO_CARE_SUPPORT -DCONFIG_TARGET_AX620Q -DCONFIG_OPT300X_I2C_ALIAS=\"/dev/i2c-0\" -DSET_FRAME_SUPPORT -DBATTERY_OPERATING_MODE_SUPPORT -DBATTERY_STATISTIC_SUPPORT -DFREQ_WAKE_ABNORMAL_POWER_SUPPORT -DHUB_MANAGE_SUPPORT -DAUDIO_G711_16K_SUPPORT -DNET_STATUS_CHANGE_BITRATE -DNET_STATUS_CHANGE_BITRATE_REALTIME -DBAT_CAPACITY_CURVE_OPTIMIZATION -DPIR_SENSITIVITY_DEF_TABLE=100,91,80,69,48,36,30,28,24,20 -DMCU_CONTROL_MOTOR -DIRCUT_SWITCH_BY_MCU_MSG -DMCU_UART_ALIAS=\"/dev/ttyS3\" -DMCU_UPGRADE_CLEAN_UART -DMAX_BAT_MODEL=2 -DLOWER_IR_BEFORE_POWER_OFF -DJPEG_STREAM_ENABLE -DPTZ_SUPPORT -DGET_SNAPSHOT_ACCURATE -DSNAPSHOT_JPEG_HEIGHT=360 -DWLAN_SUPPORT -DLINUX_VERSION=4.19.125 -DTP_TAPO_RESET_WIFI_SUPPORT -I/home/xyc/NVMP/nvmp/staging_dir/target-arm-AX620E-linux-uclibcgnueabihf-c668bv1/usr/include -I/home/xyc/NVMP/nvmp/staging_dir/target-arm-AX620E-linux-uclibcgnueabihf-c668bv1/include -I/home/xyc/NVMP/nvmp/../sdk/soc/AX620Q/uclibc-toolchain/arm-AX620E-linux-uclibcgnueabihf/arm-AX620E-linux-uclibcgnueabihf/libc/usr/include -Wall -Werror -ffunction-sections -fdata-sections -DMODULE_LIST="\"general_plan mcu_proxy osd image dn_switch cover video battery_manage msg_alarm hsr md_alarm ptd_alarm vd_alarm speaker sd_card record_plan alarm_clock audio_library detection_region ptz light_control\"" -DTSS_MODULE_LIST="\"\"" -I/home/xyc/NVMP/nvmp/build_dir/target-arm-AX620E-linux-uclibcgnueabihf-c668bv1/cap -c -o alarm_plan_ds.o alarm_plan_ds.c alarm_plan_ds.c:17:54: error: initialization of 'char' from 'void *' makes integer from pointer without a cast [-Werror=int-conversion] LOCAL MSG_ALARM_CHN1_PLAN g_msg_alarm_plan = {FALSE, NULL, 0}; ^~~~ alarm_plan_ds.c:17:54: note: (near initialization for 'g_msg_alarm_plan.alarm_plan_1[0]') alarm_plan_ds.c:17:46: error: missing braces around initializer [-Werror=missing-braces] LOCAL MSG_ALARM_CHN1_PLAN g_msg_alarm_plan = {FALSE, NULL, 0}; ^ In file included from alarm_plan_ds.c:9: alarm_plan_ds.c: In function 'ds_cb_get_alarm_plan': msg_alarm.h:59:36: error: implicit declaration of function 'CAP_ERROR'; did you mean 'MC_ERROR'? [-Werror=implicit-function-declaration] #define MSG_ALARM_ERROR(fmt, ...) CAP_ERROR("[MSG_ALARM]" fmt , ##__VA_ARGS__) ^~~~~~~~~ alarm_plan_ds.c:27:3: note: in expansion of macro 'MSG_ALARM_ERROR' MSG_ALARM_ERROR("ds_cb_get_alarm_plan: ptr is null"); ^~~~~~~~~~~~~~~ alarm_plan_ds.c:54:85: error: passing argument 1 of 'jso_new_string' makes pointer from integer without a cast [-Werror=int-conversion] jso_array_add(alarm_plan_array, jso_new_string(g_msg_alarm_plan.alarm_plan_1[i])); ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~^~~ In file included from /home/xyc/NVMP/nvmp/staging_dir/target-arm-AX620E-linux-uclibcgnueabihf-c668bv1/usr/include/json/json.h:26, from /home/xyc/NVMP/nvmp/staging_dir/target-arm-AX620E-linux-uclibcgnueabihf-c668bv1/usr/include/libds.h:7, from /home/xyc/NVMP/nvmp/staging_dir/target-arm-AX620E-linux-uclibcgnueabihf-c668bv1/usr/include/slp_model.h:7, from alarm_plan_ds.c:7: /home/xyc/NVMP/nvmp/staging_dir/target-arm-AX620E-linux-uclibcgnueabihf-c668bv1/usr/include/json/json_api.h:35:41: note: expected 'char *' but argument is of type 'char' extern JSON_OBJPTR jso_new_string(char *str); ~~~~~~^~~ In file included from alarm_plan_ds.c:9: msg_alarm.h:57:36: error: implicit declaration of function 'CAP_DEBUG'; did you mean 'MC_DEBUG'? [-Werror=implicit-function-declaration] #define MSG_ALARM_DEBUG(fmt, ...) CAP_DEBUG("[MSG_ALARM]" fmt, ##__VA_ARGS__) ^~~~~~~~~ alarm_plan_ds.c:59:2: note: in expansion of macro 'MSG_ALARM_DEBUG' MSG_ALARM_DEBUG(" JSON %s",json_object_to_json_string(reply_obj)); ^~~~~~~~~~~~~~~ alarm_plan_ds.c: In function 'ds_cb_set_alarm_plan': alarm_plan_ds.c:100:43: error: 'ALARM_PLAN_SIZE' undeclared (first use in this function); did you mean 'ALARM_STATE_IDLE'? if (g_msg_alarm_plan.alarm_plan_num > ALARM_PLAN_SIZE) ^~~~~~~~~~~~~~~ ALARM_STATE_IDLE alarm_plan_ds.c:100:43: note: each undeclared identifier is reported only once for each function it appears in alarm_plan_ds.c:124:69: error: passing argument 2 of 'jso_to_string' makes pointer from integer without a cast [-Werror=int-conversion] jso_to_string(alarm_plan_term, g_msg_alarm_plan.alarm_plan_1[i], ALARM_PLAN_STR_MAX_LEN); ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~^~~ In file included from /home/xyc/NVMP/nvmp/staging_dir/target-arm-AX620E-linux-uclibcgnueabihf-c668bv1/usr/include/json/json.h:26, from /home/xyc/NVMP/nvmp/staging_dir/target-arm-AX620E-linux-uclibcgnueabihf-c668bv1/usr/include/libds.h:7, from /home/xyc/NVMP/nvmp/staging_dir/target-arm-AX620E-linux-uclibcgnueabihf-c668bv1/usr/include/slp_model.h:7, from alarm_plan_ds.c:7: /home/xyc/NVMP/nvmp/staging_dir/target-arm-AX620E-linux-uclibcgnueabihf-c668bv1/usr/include/json/json_api.h:40:49: note: expected 'char *' but argument is of type 'char' extern int jso_to_string(JSON_OBJPTR obj, char *str_buf, int len); ~~~~~~^~~~~~~ alarm_plan_ds.c:139:3: error: implicit declaration of function 'alarm_plan_reload' [-Werror=implicit-function-declaration] alarm_plan_reload(); ^~~~~~~~~~~~~~~~~ alarm_plan_ds.c: In function 'ds_cb_del_alarm_plan': alarm_plan_ds.c:180:49: error: passing argument 1 of 'memset' makes pointer from integer without a cast [-Werror=int-conversion] memset(g_msg_alarm_plan.alarm_plan_1[i], 0, ALARM_PLAN_STR_MAX_LEN); ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~^~~ In file included from alarm_plan_ds.c:3: /home/xyc/NVMP/sdk/soc/AX620Q/uclibc-toolchain/arm-AX620E-linux-uclibcgnueabihf/arm-AX620E-linux-uclibcgnueabihf/sysroot/usr/include/string.h:58:14: note: expected 'void *' but argument is of type 'char' extern void *memset (void *__s, int __c, size_t __n) __THROW __nonnull ((1)); ^~~~~~ alarm_plan_ds.c:218:40: error: passing argument 2 of 'jso_to_string' discards 'const' qualifier from pointer target type [-Werror=discarded-qualifiers] jso_to_string(alarm_plan_term, json_value_str, ALARM_PLAN_STR_MAX_LEN); ^~~~~~~~~~~~~~ In file included from /home/xyc/NVMP/nvmp/staging_dir/target-arm-AX620E-linux-uclibcgnueabihf-c668bv1/usr/include/json/json.h:26, from /home/xyc/NVMP/nvmp/staging_dir/target-arm-AX620E-linux-uclibcgnueabihf-c668bv1/usr/include/libds.h:7, from /home/xyc/NVMP/nvmp/staging_dir/target-arm-AX620E-linux-uclibcgnueabihf-c668bv1/usr/include/slp_model.h:7, from alarm_plan_ds.c:7: /home/xyc/NVMP/nvmp/staging_dir/target-arm-AX620E-linux-uclibcgnueabihf-c668bv1/usr/include/json/json_api.h:40:49: note: expected 'char *' but argument is of type 'const char *' extern int jso_to_string(JSON_OBJPTR obj, char *str_buf, int len); ~~~~~~^~~~~~~ alarm_plan_ds.c:221:71: error: passing argument 2 of 'strncmp' makes pointer from integer without a cast [-Werror=int-conversion] if (!strncmp(json_value_str, g_msg_alarm_plan.alarm_plan_1[j], strlen(json_value_str))) ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~^~~ In file included from alarm_plan_ds.c:3: /home/xyc/NVMP/sdk/soc/AX620Q/uclibc-toolchain/arm-AX620E-linux-uclibcgnueabihf/arm-AX620E-linux-uclibcgnueabihf/sysroot/usr/include/string.h:101:51: note: expected 'const char *' but argument is of type 'char' extern int strncmp (const char *__s1, const char *__s2, size_t __n) ~~~~~~~~~~~~^~~~ alarm_plan_ds.c:224:61: error: passing argument 1 of 'strlen' makes pointer from integer without a cast [-Werror=int-conversion] strlen(g_msg_alarm_plan.alarm_plan_1[g_msg_alarm_plan.alarm_plan_num - 1])); ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ In file included from alarm_plan_ds.c:3: /home/xyc/NVMP/sdk/soc/AX620Q/uclibc-toolchain/arm-AX620E-linux-uclibcgnueabihf/arm-AX620E-linux-uclibcgnueabihf/sysroot/usr/include/string.h:247:35: note: expected 'const char *' but argument is of type 'char' extern size_t strlen (const char *__s) ~~~~~~~~~~~~^~~ alarm_plan_ds.c:223:54: error: passing argument 1 of 'strncpy' makes pointer from integer without a cast [-Werror=int-conversion] strncpy(g_msg_alarm_plan.alarm_plan_1[j], g_msg_alarm_plan.alarm_plan_1[g_msg_alarm_plan.alarm_plan_num - 1], ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~^~~ In file included from alarm_plan_ds.c:3: /home/xyc/NVMP/sdk/soc/AX620Q/uclibc-toolchain/arm-AX620E-linux-uclibcgnueabihf/arm-AX620E-linux-uclibcgnueabihf/sysroot/usr/include/string.h:86:14: note: expected 'char * restrict' but argument is of type 'char' extern char *strncpy (char *__restrict __dest, ^~~~~~~ alarm_plan_ds.c:223:88: error: passing argument 2 of 'strncpy' makes pointer from integer without a cast [-Werror=int-conversion] strncpy(g_msg_alarm_plan.alarm_plan_1[j], g_msg_alarm_plan.alarm_plan_1[g_msg_alarm_plan.alarm_plan_num - 1], ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ In file included from alarm_plan_ds.c:3: /home/xyc/NVMP/sdk/soc/AX620Q/uclibc-toolchain/arm-AX620E-linux-uclibcgnueabihf/arm-AX620E-linux-uclibcgnueabihf/sysroot/usr/include/string.h:86:14: note: expected 'const char * restrict' but argument is of type 'char' extern char *strncpy (char *__restrict __dest, ^~~~~~~ alarm_plan_ds.c:225:53: error: passing argument 1 of 'memset' makes pointer from integer without a cast [-Werror=int-conversion] memset(g_msg_alarm_plan.alarm_plan_1[g_msg_alarm_plan.alarm_plan_num - 1], 0, ALARM_PLAN_STR_MAX_LEN); ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ In file included from alarm_plan_ds.c:3: /home/xyc/NVMP/sdk/soc/AX620Q/uclibc-toolchain/arm-AX620E-linux-uclibcgnueabihf/arm-AX620E-linux-uclibcgnueabihf/sysroot/usr/include/string.h:58:14: note: expected 'void *' but argument is of type 'char' extern void *memset (void *__s, int __c, size_t __n) __THROW __nonnull ((1)); ^~~~~~ alarm_plan_ds.c:244:3: error: implicit declaration of function 'msg_alarm_plan_reload'; did you mean 'msg_alarm_type_filter'? [-Werror=implicit-function-declaration] msg_alarm_plan_reload(); ^~~~~~~~~~~~~~~~~~~~~ msg_alarm_type_filter alarm_plan_ds.c: In function 'registe_ds_cb': alarm_plan_ds.c:268:94: error: passing argument 3 of 'ds_register_del_json' from incompatible pointer type [-Werror=incompatible-pointer-types] if (ERROR == ds_register_del_json(MSG_ALARM_PLAN_MODULE_NAME, MSG_ALARM_PLAN_TABLE_NAME, ds_cb_del_alarm_plan)) ^~~~~~~~~~~~~~~~~~~~ In file included from /home/xyc/NVMP/nvmp/staging_dir/target-arm-AX620E-linux-uclibcgnueabihf-c668bv1/usr/include/libds.h:12, from /home/xyc/NVMP/nvmp/staging_dir/target-arm-AX620E-linux-uclibcgnueabihf-c668bv1/usr/include/slp_model.h:7, from alarm_plan_ds.c:7: /home/xyc/NVMP/nvmp/staging_dir/target-arm-AX620E-linux-uclibcgnueabihf-c668bv1/usr/include/ds_model.h:252:87: note: expected 'DEL_JSON' {aka 'int (*)(struct _DS_HANDLE_CONTEXT *, struct json_object *, enum _BOOL)'} but argument is of type 'S32 (*)(struct _DS_HANDLE_CONTEXT *, U8, const char *, struct json_object *, BOOL)' {aka 'int (*)(struct _DS_HANDLE_CONTEXT *, unsigned char, const char *, struct json_object *, enum _BOOL)'} STATUS ds_register_del_json(const char *module_name, const char *table_name, DEL_JSON del_json); ~~~~~~~~~^~~~~~~~ alarm_plan_ds.c: In function 'alarm_plan_init': alarm_plan_ds.c:299:24: error: 'ALARM_PLAN_SIZE' undeclared (first use in this function); did you mean 'ALARM_STATE_IDLE'? for(int i = 0; i < ALARM_PLAN_SIZE; i++) ^~~~~~~~~~~~~~~ ALARM_STATE_IDLE alarm_plan_ds.c:301:45: error: passing argument 1 of 'memset' makes pointer from integer without a cast [-Werror=int-conversion] memset(g_msg_alarm_plan.alarm_plan_1[i], 0, ALARM_PLAN_STR_MAX_LEN); ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~^~~ In file included from alarm_plan_ds.c:3: /home/xyc/NVMP/sdk/soc/AX620Q/uclibc-toolchain/arm-AX620E-linux-uclibcgnueabihf/arm-AX620E-linux-uclibcgnueabihf/sysroot/usr/include/string.h:58:14: note: expected 'void *' but argument is of type 'char' extern void *memset (void *__s, int __c, size_t __n) __THROW __nonnull ((1)); ^~~~~~ cc1: all warnings being treated as errors <builtin>: recipe for target 'alarm_plan_ds.o' failed make[5]: *** [alarm_plan_ds.o] Error 1 make[5]: Leaving directory '/home/xyc/NVMP/nvmp/build_dir/target-arm-AX620E-linux-uclibcgnueabihf-c668bv1/cap/modules/msg_alarm' Makefile:32: recipe for target 'build_modules' failed make[4]: *** [build_modules] Error 2 make[4]: Leaving directory '/home/xyc/NVMP/nvmp/build_dir/target-arm-AX620E-linux-uclibcgnueabihf-c668bv1/cap' Makefile:758: recipe for target '/home/xyc/NVMP/nvmp/build_dir/target-arm-AX620E-linux-uclibcgnueabihf-c668bv1/cap/.built' failed make[3]: *** [/home/xyc/NVMP/nvmp/build_dir/target-arm-AX620E-linux-uclibcgnueabihf-c668bv1/cap/.built] Error 2 make[3]: Leaving directory '/home/xyc/NVMP/nvmp/tp_package/cap' package/Makefile:105: recipe for target 'package/tp_package/cap/compile' failed make[2]: *** [package/tp_package/cap/compile] Error 2 make[2]: Leaving directory '/home/xyc/NVMP/nvmp' package/Makefile:101: recipe for target '/home/xyc/NVMP/nvmp/staging_dir/target-arm-AX620E-linux-uclibcgnueabihf-c668bv1/stamp/.package_compile' failed make[1]: *** [/home/xyc/NVMP/nvmp/staging_dir/target-arm-AX620E-linux-uclibcgnueabihf-c668bv1/stamp/.package_compile] Error 2 make[1]: Leaving directory '/home/xyc/NVMP/nvmp' /home/xyc/NVMP/nvmp/include/toplevel.mk:210: recipe for target 'world' failed make: *** [world] Error 2

from PyQt5.QtWidgets import QApplication, QMainWindow, QFileDialog, QMenu, QAction from ui.win import Ui_mainWindow from PyQt5.QtCore import Qt, QPoint, QTimer, QThread, pyqtSignal from PyQt5.QtGui import QImage, QPixmap, QPainter, QIcon import sys import os import json import numpy as np import torch import torch.backends.cudnn as cudnn import os import time import cv2 import warnings warnings.filterwarnings("ignore", category=DeprecationWarning) from models.experimental import attempt_load from utils.datasets import LoadImages, LoadWebcam from utils.CustomMessageBox import MessageBox from utils.general import check_img_size, check_requirements, check_imshow, colorstr, non_max_suppression, \ apply_classifier, scale_coords, xyxy2xywh, strip_optimizer, set_logging, increment_path # from utils.plots import colors, plot_one_box, plot_one_box_PIL from utils.plots import Annotator, colors, save_one_box from utils.torch_utils import select_device from utils.capnums import Camera from deep_sort.deep_sort import DeepSort def deepsort_update(Tracker, pred, xywh, np_img): outputs = Tracker.update(xywh, pred[:, 4:5], pred[:, 5].tolist(), cv2.cvtColor(np_img, cv2.COLOR_BGR2RGB)) return outputs class DetThread(QThread): send_img = pyqtSignal(np.ndarray) send_raw = pyqtSignal(np.ndarray) send_statistic = pyqtSignal(dict) send_msg = pyqtSignal(str) send_percent = pyqtSignal(int) send_fps = pyqtSignal(str) def __init__(self,tracker = 'ByteTrack',imgsz=(640,640)): super(DetThread, self).__init__() self.weights = './yolov5s.pt' self.current_weight = './yolov5s.pt' self.source = '0' self.conf_thres = 0.25 self.iou_thres = 0.45 self.jump_out = False # jump out of the loop self.is_continue = True # continue/pause self.percent_length = 1000 # progress bar self.rate_check = True # Whether to enable delay self.rate = 100 self.imgsz = check_img_size(imgsz) self.save_fold = './result' if tracker == 'DeepSort': self.tracker = DeepSort('deep_sort/deep_sort/deep/checkpoint/ckpt_car3.t7') self._type = 'DeepSort' @torch.no_grad() def run(self, imgsz=640, max_det=1000, # maximum detections per image device='', # cuda device, i.e. 0 or 0,1,2,3 or cpu view_img=True, # show results save_txt=False, # save results to *.txt save_conf=False, # save confidences in --save-txt labels save_crop=False, # save cropped prediction boxes nosave=False, # do not save images/videos classes=None, # filter by class: --class 0, or --class 0 2 3 agnostic_nms=False, # class-agnostic NMS augment=False, # augmented inference visualize=False, # visualize features update=False, # update all models project='runs/detect', # save results to project/name name='exp', # save results to project/name exist_ok=False, # existing project/name ok, do not increment line_thickness=3, # bounding box thickness (pixels) hide_labels=False, # hide labels hide_conf=False, # hide confidences half=False, # use FP16 half-precision inference ): # 初始化 try: # 选择设备(如CPU或GPU) device = select_device(device) # 如果设备不是CPU,设置half为True以使用半精度浮点数 half &= device.type != 'cpu' # 尝试加载模型,并将模型加载到指定设备上 model = attempt_load(self.weights, map_location=device) num_params = 0 # 计算模型参数的总数 for param in model.parameters(): num_params += param.numel() # 获取模型的步幅(stride),并确保图像尺寸是步幅的倍数 stride = int(model.stride.max()) imgsz = check_img_size(imgsz, s=stride) # 获取模型的类别名称 names = model.module.names if hasattr(model, 'module') else model.names # 如果使用半精度浮点数,转换模型的权重为半精度 if half: model.half() # 如果使用CUDA设备,进行一次空推理以初始化模型 if device.type != 'cpu': model(torch.zeros(1, 3, imgsz, imgsz).to(device).type_as(next(model.parameters()))) deepsort_tracker = DeepSort('deep_sort/deep_sort/deep/checkpoint/ckpt_car3.t7') # 数据加载 if self.source.isnumeric() or self.source.lower().startswith(('rtsp://', 'rtmp://', 'http://', 'https://')): view_img = check_imshow() cudnn.benchmark = True # set True to speed up constant image size inference dataset = LoadWebcam(self.source, img_size=imgsz, stride=stride) # bs = len(dataset) # batch_size else: dataset = LoadImages(self.source, img_size=imgsz, stride=stride) #根据输入源(视频流或本地图片/视频)加载数据。如果是视频流,启用 cudnn.benchmark 以加速推理 count = 0 jump_count = 0 start_time = time.time() dataset = iter(dataset) #主循环 while True: if self.jump_out: self.vid_cap.release() self.send_percent.emit(0) self.send_msg.emit('停止') if hasattr(self, 'out'): self.out.release() break #主循环处理每一帧数据。如果接收到跳出信号,则释放资源并退出循环 # 更换模型 # 如果当前权重与新权重不一致,更新模型 if self.current_weight != self.weights: # 加载模型 model = attempt_load(self.weights, map_location=device) # 加载FP32模型(32位浮点数) num_params = 0 # 计算模型参数总数 for param in model.parameters(): num_params += param.numel() # 获取模型步幅(stride) stride = int(model.stride.max()) # 检查图像尺寸是否为步幅的整数倍 imgsz = check_img_size(imgsz, s=stride) # 获取模型的类别名称 names = model.module.names if hasattr(model, 'module') else model.names # 如果使用半精度浮点数,转换模型权重为FP16(16位浮点数) if half: model.half() # 如果设备不是CPU,运行一次模型以完成初始化 if device.type != 'cpu': model(torch.zeros(1, 3, imgsz, imgsz).to(device).type_as(next(model.parameters()))) # 更新当前权重 self.current_weight = self.weights #如果检测到模型权重发生改变,重新加载模型。 #数据预处理 # 如果继续处理标志位为True,则执行以下代码 if self.is_continue: # 从数据集中获取下一帧数据,包括路径、图像、原始图像和视频捕获对象 path, img, im0s, self.vid_cap = next(dataset) count += 1 # 帧计数器加一 # 每处理30帧,计算一次FPS(帧率) if count % 30 == 0 and count >= 30: fps = int(30 / (time.time() - start_time)) # 计算30帧处理所需时间的平均FPS self.send_fps.emit('fps:' + str(fps)) # 发送FPS信号 start_time = time.time() # 重新记录开始时间 # 如果有视频捕获对象,计算视频处理进度百分比 if self.vid_cap: percent = int(count / self.vid_cap.get(cv2.CAP_PROP_FRAME_COUNT) * self.percent_length) self.send_percent.emit(percent) # 发送进度百分比信号 else: percent = self.percent_length # 如果没有视频捕获对象,设定进度为满 # 初始化统计字典,统计每个类别的数量 statistic_dic = {name: 0 for name in names} # 将图像从numpy数组转换为torch张量,并加载到指定设备(如GPU) img = torch.from_numpy(img).to(device) # 如果使用半精度浮点数,转换图像数据类型,否则转换为浮点数 img = img.half() if half else img.float() # uint8 to fp16/32 img /= 255.0 # 将像素值从0-255归一化到0.0-1.0 # 如果图像是三维的,增加一个维度以匹配模型输入要求 if img.ndimension() == 3: img = img.unsqueeze(0) # 推理 pred = model(img, augment=augment)[0] #NMS pred = non_max_suppression(pred, self.conf_thres, self.iou_thres, classes, agnostic_nms, max_det=max_det) # 处理检测结果 迭代每个检测结果,并绘制边界框和标签 # 遍历每张图像的检测结果 for i, det in enumerate(pred): # detections per image # 复制原始图像,以便在上面绘制标注 im0 = im0s.copy() # 创建一个Annotator对象,用于在图像上绘制标注 annotator = Annotator(im0, line_width=line_thickness, example=str(names)) # 如果有检测结果 if len(det): # 将检测框的坐标从img_size尺度重新缩放到原始图像尺度,并四舍五入 det[:, :4] = scale_coords(img.shape[2:], det[:, :4], im0.shape).round() # 进行目标跟踪 track_outputs = deepsort_update(deepsort_tracker, det.cpu(), det[:, :4].cpu(), im0) # Write results # for *xyxy, conf, cls in reversed(det): # c = int(cls) # integer class # statistic_dic[names[c]] += 1 # label = None if hide_labels else (names[c] if hide_conf else f'{names[c]} {conf:.2f}') # annotator.box_label(xyxy, label, color=colors(c, True)) # 将跟踪结果绘制到图片上 if len(track_outputs)>0: for track_output in track_outputs: xyxy = track_output[:4] c = int(track_output[4]) # integer class track_id = 'ID_' + str(track_output[5]) statistic_dic[names[c]] += 1 label = (f'{track_id}') if hide_labels else (f'{track_id} {names[c]}') annotator.box_label(xyxy, label, color=colors(c, True)) if self.rate_check: time.sleep(1/self.rate) #保存检测结果图像或视频,并通过信号发送处理后的图像和统计数据 im0 = annotator.result() self.send_img.emit(im0) self.send_raw.emit(im0s if isinstance(im0s, np.ndarray) else im0s[0]) self.send_statistic.emit(statistic_dic) if self.save_fold: os.makedirs(self.save_fold, exist_ok=True) if self.vid_cap is None: save_path = os.path.join(self.save_fold, time.strftime('%Y_%m_%d_%H_%M_%S', time.localtime()) + '.jpg') cv2.imwrite(save_path, im0) else: if count == 1: ori_fps = int(self.vid_cap.get(cv2.CAP_PROP_FPS)) if ori_fps == 0: ori_fps = 25 # width = int(self.vid_cap.get(cv2.CAP_PROP_FRAME_WIDTH)) # height = int(self.vid_cap.get(cv2.CAP_PROP_FRAME_HEIGHT)) width, height = im0.shape[1], im0.shape[0] save_path = os.path.join(self.save_fold, time.strftime('%Y_%m_%d_%H_%M_%S', time.localtime()) + '.mp4') self.out = cv2.VideoWriter(save_path, cv2.VideoWriter_fourcc(*"mp4v"), ori_fps, (width, height)) self.out.write(im0) if percent == self.percent_length: print(count) self.send_percent.emit(0) self.send_msg.emit('结束') if hasattr(self, 'out'): self.out.release() break except Exception as e: self.send_msg.emit('%s' % e) class MainWindow(QMainWindow, Ui_mainWindow): def __init__(self, parent=None): super(MainWindow, self).__init__(parent) self.setupUi(self) self.m_flag = False # style 1: window can be stretched # self.setWindowFlags(Qt.CustomizeWindowHint | Qt.WindowStaysOnTopHint) # style 2: window can not be stretched self.setWindowFlags(Qt.Window | Qt.FramelessWindowHint | Qt.WindowSystemMenuHint | Qt.WindowMinimizeButtonHint | Qt.WindowMaximizeButtonHint) # self.setWindowOpacity(0.85) # Transparency of window self.minButton.clicked.connect(self.showMinimized) self.maxButton.clicked.connect(self.max_or_restore) # show Maximized window self.maxButton.animateClick(10) self.closeButton.clicked.connect(self.close) self.qtimer = QTimer(self) self.qtimer.setSingleShot(True) self.qtimer.timeout.connect(lambda: self.statistic_label.clear()) # search models automatically self.comboBox.clear() self.pt_list = os.listdir('./pt') self.pt_list = [file for file in self.pt_list if file.endswith('.pt')] self.pt_list.sort(key=lambda x: os.path.getsize('./pt/'+x)) self.comboBox.clear() self.comboBox.addItems(self.pt_list) self.qtimer_search = QTimer(self) self.qtimer_search.timeout.connect(lambda: self.search_pt()) self.qtimer_search.start(2000) # yolov5 thread self.det_thread = DetThread() self.model_type = self.comboBox.currentText() self.det_thread.weights = "./pt/%s" % self.model_type self.det_thread.source = '0' self.det_thread.percent_length = self.progressBar.maximum() self.det_thread.send_raw.connect(lambda x: self.show_image(x, self.raw_video)) self.det_thread.send_img.connect(lambda x: self.show_image(x, self.out_video)) self.det_thread.send_statistic.connect(self.show_statistic) self.det_thread.send_msg.connect(lambda x: self.show_msg(x)) self.det_thread.send_percent.connect(lambda x: self.progressBar.setValue(x)) self.det_thread.send_fps.connect(lambda x: self.fps_label.setText(x)) self.fileButton.clicked.connect(self.open_file) self.cameraButton.clicked.connect(self.chose_cam) #self.rtspButton.clicked.connect(self.chose_rtsp) self.runButton.clicked.connect(self.run_or_continue) self.stopButton.clicked.connect(self.stop) self.comboBox.currentTextChanged.connect(self.change_model) self.confSpinBox.valueChanged.connect(lambda x: self.change_val(x, 'confSpinBox')) self.confSlider.valueChanged.connect(lambda x: self.change_val(x, 'confSlider')) self.iouSpinBox.valueChanged.connect(lambda x: self.change_val(x, 'iouSpinBox')) self.iouSlider.valueChanged.connect(lambda x: self.change_val(x, 'iouSlider')) self.rateSpinBox.valueChanged.connect(lambda x: self.change_val(x, 'rateSpinBox')) self.rateSlider.valueChanged.connect(lambda x: self.change_val(x, 'rateSlider')) self.checkBox.clicked.connect(self.checkrate) self.saveCheckBox.clicked.connect(self.is_save) self.load_setting() def search_pt(self): pt_list = os.listdir('./pt') pt_list = [file for file in pt_list if file.endswith('.pt')] pt_list.sort(key=lambda x: os.path.getsize('./pt/' + x)) if pt_list != self.pt_list: self.pt_list = pt_list self.comboBox.clear() self.comboBox.addItems(self.pt_list) def is_save(self): if self.saveCheckBox.isChecked(): self.det_thread.save_fold = './result' else: self.det_thread.save_fold = None def checkrate(self): if self.checkBox.isChecked(): self.det_thread.rate_check = True else: self.det_thread.rate_check = False def chose_cam(self): try: self.stop() MessageBox( self.closeButton, title='提示', text='加载摄像头', time=2000, auto=True).exec_() # get the number of local cameras _, cams = Camera().get_cam_num() popMenu = QMenu() popMenu.setFixedWidth(self.cameraButton.width()) popMenu.setStyleSheet(''' QMenu { font-size: 16px; font-family: "Microsoft YaHei UI"; font-weight: light; color:white; padding-left: 5px; padding-right: 5px; padding-top: 4px; padding-bottom: 4px; border-style: solid; border-width: 0px; border-color: rgba(255, 255, 255, 255); border-radius: 3px; background-color: rgba(200, 200, 200,50);} ''') for cam in cams: exec("action_%s = QAction('%s')" % (cam, cam)) exec("popMenu.addAction(action_%s)" % cam) x = self.groupBox_5.mapToGlobal(self.cameraButton.pos()).x() y = self.groupBox_5.mapToGlobal(self.cameraButton.pos()).y() y = y + self.cameraButton.frameGeometry().height() pos = QPoint(x, y) action = popMenu.exec_(pos) if action: self.det_thread.source = action.text() self.statistic_msg('加载视频:{}'.format(action.text())) except Exception as e: self.statistic_msg('%s' % e) def load_setting(self): config_file = 'config/setting.json' if not os.path.exists(config_file): iou = 0.26 conf = 0.33 rate = 10 check = 0 savecheck = 0 new_config = {"iou": iou, "conf": conf, "rate": rate, "check": check, "savecheck": savecheck } new_json = json.dumps(new_config, ensure_ascii=False, indent=2) with open(config_file, 'w', encoding='utf-8') as f: f.write(new_json) else: config = json.load(open(config_file, 'r', encoding='utf-8')) if len(config) != 5: iou = 0.26 conf = 0.33 rate = 10 check = 0 savecheck = 0 else: iou = config['iou'] conf = config['conf'] rate = config['rate'] check = config['check'] savecheck = config['savecheck'] self.confSpinBox.setValue(conf) self.iouSpinBox.setValue(iou) self.rateSpinBox.setValue(rate) self.checkBox.setCheckState(check) self.det_thread.rate_check = check self.saveCheckBox.setCheckState(savecheck) self.is_save() def change_val(self, x, flag): if flag == 'confSpinBox': self.confSlider.setValue(int(x*100)) elif flag == 'confSlider': self.confSpinBox.setValue(x/100) self.det_thread.conf_thres = x/100 elif flag == 'iouSpinBox': self.iouSlider.setValue(int(x*100)) elif flag == 'iouSlider': self.iouSpinBox.setValue(x/100) self.det_thread.iou_thres = x/100 elif flag == 'rateSpinBox': self.rateSlider.setValue(x) elif flag == 'rateSlider': self.rateSpinBox.setValue(x) self.det_thread.rate = x * 10 else: pass def statistic_msg(self, msg): self.statistic_label.setText(msg) # self.qtimer.start(3000) def show_msg(self, msg): self.runButton.setChecked(Qt.Unchecked) self.statistic_msg(msg) if msg == "Finished": self.saveCheckBox.setEnabled(True) def change_model(self, x): self.model_type = self.comboBox.currentText() self.det_thread.weights = "./pt/%s" % self.model_type self.statistic_msg('Change model to %s' % x) def open_file(self): config_file = 'config/fold.json' # config = json.load(open(config_file, 'r', encoding='utf-8')) config = json.load(open(config_file, 'r', encoding='utf-8')) open_fold = config['open_fold'] if not os.path.exists(open_fold): open_fold = os.getcwd() name, _ = QFileDialog.getOpenFileName(self, 'Video/image', open_fold, "Pic File(*.mp4 *.mkv *.avi *.flv " "*.jpg *.png)") if name: self.det_thread.source = name self.statistic_msg('Loaded file:{}'.format(os.path.basename(name))) config['open_fold'] = os.path.dirname(name) config_json = json.dumps(config, ensure_ascii=False, indent=2) with open(config_file, 'w', encoding='utf-8') as f: f.write(config_json) self.stop() def max_or_restore(self): if self.maxButton.isChecked(): self.showMaximized() else: self.showNormal() def run_or_continue(self): self.det_thread.jump_out = False if self.runButton.isChecked(): self.saveCheckBox.setEnabled(False) self.det_thread.is_continue = True if not self.det_thread.isRunning(): self.det_thread.start() source = os.path.basename(self.det_thread.source) source = 'camera' if source.isnumeric() else source self.statistic_msg('正在检测 >> 模型:{},文件:{}'. format(os.path.basename(self.det_thread.weights), source)) else: self.det_thread.is_continue = False self.statistic_msg('暂停') def stop(self): self.det_thread.jump_out = True self.saveCheckBox.setEnabled(True) def mousePressEvent(self, event): self.m_Position = event.pos() if event.button() == Qt.LeftButton: if 0 < self.m_Position.x() < self.groupBox.pos().x() + self.groupBox.width() and \ 0 < self.m_Position.y() < self.groupBox.pos().y() + self.groupBox.height(): self.m_flag = True def mouseMoveEvent(self, QMouseEvent): if Qt.LeftButton and self.m_flag: self.move(QMouseEvent.globalPos() - self.m_Position) def mouseReleaseEvent(self, QMouseEvent): self.m_flag = False @staticmethod def show_image(img_src, label): try: ih, iw, _ = img_src.shape w = label.geometry().width() h = label.geometry().height() # keep original aspect ratio if iw/w > ih/h: scal = w / iw nw = w nh = int(scal * ih) img_src_ = cv2.resize(img_src, (nw, nh)) else: scal = h / ih nw = int(scal * iw) nh = h img_src_ = cv2.resize(img_src, (nw, nh)) frame = cv2.cvtColor(img_src_, cv2.COLOR_BGR2RGB) img = QImage(frame.data, frame.shape[1], frame.shape[0], frame.shape[2] * frame.shape[1], QImage.Format_RGB888) label.setPixmap(QPixmap.fromImage(img)) except Exception as e: print(repr(e)) def show_statistic(self, statistic_dic): try: self.resultWidget.clear() statistic_dic = sorted(statistic_dic.items(), key=lambda x: x[1], reverse=True) statistic_dic = [i for i in statistic_dic if i[1] > 0] results = [' '+str(i[0]) + ':' + str(i[1]) for i in statistic_dic] self.resultWidget.addItems(results) except Exception as e: print(repr(e)) def closeEvent(self, event): self.det_thread.jump_out = True config_file = 'config/setting.json' config = dict() config['iou'] = self.confSpinBox.value() config['conf'] = self.iouSpinBox.value() config['rate'] = self.rateSpinBox.value() config['check'] = self.checkBox.checkState() config['savecheck'] = self.saveCheckBox.checkState() config_json = json.dumps(config, ensure_ascii=False, indent=2) with open(config_file, 'w', encoding='utf-8') as f: f.write(config_json) MessageBox( self.closeButton, title='提示', text='正在关闭程序', time=2000, auto=True).exec_() sys.exit(0) if __name__ == "__main__": app = QApplication(sys.argv) myWin = MainWindow() myWin.show() # myWin.showMaximized() sys.exit(app.exec_())

最新推荐

recommend-type

基于COMSOL的压裂井降压开采数值模拟:地层压力与流场分布研究

利用COMSOL Multiphysics进行压裂井降压开采的数值模拟过程。首先,通过对特定油藏地区的岩层性质和流体分布进行初步勘测和分析,建立了三维地质模型,考虑了地层层次结构、岩石物理性质(如渗透率、孔隙度)和流体属性(如粘度、密度)。接着,在模型中设定了流体在多孔介质中流动的物理场,并配置了适当的流体源和压力边界条件。随后,使用流体流动和固体力学模块模拟了压裂过程,观察到裂缝的形成和扩展及其对周围地层的影响。最后,展示了模拟得到的地层压力和流场分布图,并附上了一段简化的COMSOL代码示例,解释了如何设置物理场和边界条件。通过这次模拟,不仅可以熟悉压裂开采的模拟方法,还能将其应用于油藏开采和地热开采等领域。 适合人群:从事能源开采领域的研究人员和技术人员,尤其是对压裂井降压开采感兴趣的从业者。 使用场景及目标:适用于希望深入了解压裂井降压开采过程的研究人员和技术人员,旨在提高对地下流体运动和压力变化的理解,优化开采过程。 其他说明:文中提供的代码示例有助于读者快速入门COMSOL的流体流动仿真设置,同时模拟结果为实际开采提供了宝贵的数据支持。
recommend-type

工业自动化领域汇川中大型PLC(AM600AM400AC800)模版的模块化编程及其应用

内容概要:本文介绍了汇川中大型PLC模版(AM600、AM400、AC800)的特点和优势,重点阐述了模块化编程方法的应用。文中提到,这些模版不仅结构清晰、稳定可靠,而且易于扩展和维护。此外,文章还提供了一个新能源项目的PLC程序实例,展示了如何利用指针和for循环遍历的方式简化多轴控制系统的设计。同时,文中附带了空模版和实际案例模版,便于初学者和从业者快速上手并应用于实际项目中。 适合人群:从事工业自动化领域的工程师和技术人员,特别是那些希望提高PLC编程技能或者正在寻找高效编程解决方案的专业人士。 使用场景及目标:①学习和掌握汇川中大型PLC模版的模块化编程技巧;②通过实际案例加深对多轴控制系统的理解;③利用提供的模版加速新项目的开发进程。 其他说明:文中提供的程序实例和模版有助于读者更好地理解和实践PLC编程,但需要注意的是,软件一旦售出不可退换。
recommend-type

前端分析-2023071100789s

前端分析-2023071100789s
recommend-type

GHCN气象站邻接矩阵的Python实现及地理距离应用

根据提供的文件信息,我们可以解析出以下知识点: **标题:“GHCN_邻接矩阵”** 全球历史气候网络(Global Historical Climatology Network,简称GHCN)是一个国际性项目,旨在收集和提供全球范围内的历史气候数据。邻接矩阵(Adjacency Matrix)是图论中的一个概念,用来表示图中各个顶点之间的相邻关系。 **知识点详细说明:** 1. **全球历史气候网络(GHCN):** - GHCN是一个汇集了全球范围内的历史气候数据资料的大型数据库。该数据库主要收集了全球各地的气象站提供的气温、降水、风速等气象数据。 - 这些数据的时间跨度很广,有些甚至可以追溯到19世纪中叶,为气候学家和相关研究人员提供了丰富的气候变迁数据。 - 通过分析这些数据,科学家可以研究气候变化的趋势、模式以及影响因素等。 2. **邻接矩阵:** - 在图论中,邻接矩阵是用来表示图中各个顶点之间相互连接关系的矩阵。 - 无向图的邻接矩阵是一个对称矩阵,如果顶点i与顶点j之间存在一条边,则矩阵中的元素A[i][j]和A[j][i]为1;否则为0。 - 邻接矩阵常用于计算机算法中,比如用于计算最短路径、网络的连通性、以及进行图的遍历等。 3. **地理距离:** - 在这个问题的上下文中,指的是气象站之间的空间距离。 - 计算气象站之间的地理距离通常使用地理信息系统(GIS)或球面几何学的方法,比如使用哈弗辛公式(Haversine formula)计算两个地点之间的大圆距离。 - 通过地理距离数据,可以推断出气候数据在空间分布上的相关性或依赖性。 4. **Python编程语言:** - 标签中提及的Python是一种广泛应用于数据科学、人工智能、网络开发等领域的高级编程语言。 - Python因其易学易用、语法简洁、库支持丰富等特点,在科研、教育、工业界等领域得到广泛应用。 5. **代码实现:** - 提到的代码应该会涉及获取GHCN数据集、计算气象站间的地理距离、以及根据这些距离构建无向图的邻接矩阵。 - 代码可能使用了Python中的科学计算库,如NumPy或SciPy,以及地理计算库,如geopy或Shapely。 - 通过构建邻接矩阵,此代码可以进一步用于分析气候数据的空间分布特征或执行图相关的数据分析任务。 **文件名称列表:“GHCN_Adjacency_Matrix-main”** 文件名“GHCN_Adjacency_Matrix-main”表明这是一个包含主要代码文件的文件夹。在Python中,“main”一词通常表示该文件夹中的某个脚本文件(如“main.py”)是程序的入口点,它是运行程序时最先被调用的文件。 总结以上内容,我们可知该文件描述了一个使用Python语言,通过处理全球历史气候网络(GHCN)中的数据来生成气象站之间地理距离的邻接矩阵的代码。这种邻接矩阵可以用于气候数据分析中的图论应用,如研究气象站点数据的空间分布模式和关系。代码的实现可能用到了多种Python库,旨在为气候研究提供一种新的数据处理和分析视角。
recommend-type

并发编程:多语言实践与策略选择

### 并发编程:多语言实践与策略选择 #### 1. 文件大小计算的并发实现 在并发计算文件大小的场景中,我们可以采用数据流式方法。具体操作如下: - 创建两个 `DataFlowQueue` 实例,一个用于记录活跃的文件访问,另一个用于接收文件和子目录的大小。 - 创建一个 `DefaultPGroup` 来在线程池中运行任务。 ```plaintext graph LR A[创建 DataFlowQueue 实例] --> B[创建 DefaultPGroup] B --> C[执行 findSize 方法] C --> D[执行 findTotalFileS
recommend-type

3utools使用教程

<think>我们注意到用户查询的是"3utools",但引用中提到的都是"uTools"(没有数字3)。这可能是一个拼写错误或版本差异。 根据引用内容,uTools是一个桌面效率工具,提供插件化的功能。因此,我们假设用户指的是uTools,并据此提供使用指南。 如果确实存在名为"3uTools"的软件(例如,苹果设备管理工具),那么我们需要澄清:引用中提到的uTools与3uTools不同。 但是,由于引用中只提到了uTools,且用户的问题中写的是“3utools”(可能是uTools的误写),我们将按照uTools来回答。 如果用户确实指的是另一个软件(3uTools),那么
recommend-type

探索更多视频功能的JavaScript实现

从给定的信息中我们可以提炼出关键词"更多视频"以及"JavaScript",以及一个与文件相关的命名"MoreVideo-master"。接下来,我会针对这些关键词展开详细的IT知识点阐述。 首先,关于“更多视频”,这个描述暗示了我们即将探讨的是与视频内容相关的技术或应用。在现代IT领域中,视频内容的处理、存储、传输和播放是一个非常重要的分支,涉及到的技术包括但不限于视频编码、流媒体技术、网络协议、前端展示技术等。视频内容的增多以及互联网带宽的不断提升,使得在线视频消费成为可能。从最早的ASCII动画到现代的高清视频,技术的演进一直不断推动着我们向更高质量和更多样化的视频内容靠近。 其次,“JavaScript”是IT行业中的一个关键知识点。它是一种广泛使用的脚本语言,特别适用于网页开发。JavaScript可以实现网页上的动态交互,比如表单验证、动画效果、异步数据加载(AJAX)、以及单页应用(SPA)等。作为一种客户端脚本语言,JavaScript可以对用户的输入做出即时反应,无需重新加载页面。此外,JavaScript还可以运行在服务器端(例如Node.js),这进一步拓宽了它的应用范围。 在探讨JavaScript时,不得不提的是Web前端开发。在现代的Web应用开发中,前端开发越来越成为项目的重要组成部分。前端开发人员需要掌握HTML、CSS和JavaScript这三大核心技术。其中,JavaScript负责赋予网页以动态效果,提升用户体验。JavaScript的库和框架也非常丰富,比如jQuery、React、Vue、Angular等,它们可以帮助开发者更加高效地编写和管理前端代码。 最后,关于文件名“MoreVideo-master”,这里的“Master”通常表示这是一个项目或者源代码的主版本。例如,在使用版本控制系统(如Git)时,“Master”分支通常被认为是项目的主分支,包含最新的稳定代码。文件名中的“MoreVideo”表明该项目与视频相关的内容处理功能正在增加或扩展。可能是对现有功能的增强,也可能是为视频播放、视频处理或视频管理增加了新的模块或特性。 综合上述内容,我们可以总结出以下几个IT知识点: 1. 视频技术:包括视频编解码技术、流媒体技术、网络协议、视频格式转换等。在客户端和服务器端,视频技术的应用场景广泛,如在线视频平台、视频会议系统、视频监控系统等。 2. JavaScript应用:JavaScript在Web前端开发中的应用十分广泛,用于实现网页的动态效果和交互性,以及在后端通过Node.js提供服务器端编程能力。 3. 前端开发技术:前端开发不仅仅是页面的静态显示,更重要的是通过JavaScript、CSS和HTML等技术实现用户界面与用户之间的交互。前端框架和库的使用大大提高了开发效率。 4. 版本控制:在IT项目开发过程中,版本控制是一个重要的环节。它帮助开发者管理代码的变更历史,支持多人协作开发,使得代码维护和升级变得更加容易。 通过以上知识点,我们可以看到,无论是“更多视频”的技术应用还是“JavaScript”编程语言的使用,以及文件命名所隐含的项目管理概念,都是IT领域内相互关联且密不可分的几个重要方面。
recommend-type

并发编程中的Clojure代理与相关技术解析

### 并发编程中的Clojure代理与相关技术解析 #### 1. Clojure代理概述 Clojure代理代表内存中的单个标识或位置。与软件事务内存(STM)的引用管理多个标识的协调同步更改不同,代理允许对其管理的单个标识进行独立的异步更改。这些更改以函数或操作的形式表达,并异步应用于该位置。多个独立的并发操作会按顺序依次运行。操作成功完成后,代理将更新为操作返回的新状态,该新状态用于后续对代理的读取或操作。 调用在代理上运行操作的方法会立即返回,操作随后会使用Clojure管理的线程池中的一个线程应用于代理。如果操作主要受CPU限制,可使用`send()`方法运行;如果函数中可能发
recommend-type

windows电脑如何安装华为电脑管家

<think>首先,用户的问题是:“我想在Windows电脑上安装华为电脑管家 请问如何在Windows系统上安装和配置华为电脑管家”。这基于之前的引用,是关于在非华为电脑上安装华为电脑管家的指南。 引用提供了几个来源: - [^1]:非华为电脑安装华为电脑管家指南,项目地址:https://gitcode.com/open-source-toolkit/90481 - [^2]:win10或11非华为电脑安装最新的电脑管家,包括安装方法和问题解决 - [^3]:华为电脑管家傻瓜一键安装版,适用于win10,支持非华为电脑 - [^4]:提供旧版本华为电脑管家的链接和卸载方法 - [^5]:
recommend-type

社交媒体与C#技术的结合应用

根据提供的文件信息,我们可以看出标题、描述和标签均指向“社交媒体”。虽然描述部分并未提供具体的内容,我们可以假设标题和描述共同指向了一个与社交媒体相关的项目或话题。同时,由于标签为"C#",这可能意味着该项目或话题涉及使用C#编程语言。而文件名称“socialMedia-main”可能是指一个包含了社交媒体项目主要文件的压缩包或源代码库的主目录。 下面,我将从社交媒体和C#的角度出发,详细说明可能涉及的知识点。 ### 社交媒体知识点 1. **社交媒体定义和类型** 社交媒体是人们用来创造、分享和交流信息和想法的平台,以达到社交目的的网络服务和站点。常见的社交媒体类型包括社交网络平台(如Facebook, LinkedIn),微博客服务(如Twitter),内容共享站点(如YouTube, Instagram),以及即时消息服务(如WhatsApp, WeChat)等。 2. **社交媒体的功能** 社交媒体的核心功能包括用户个人资料管理、好友/关注者系统、消息发布与分享、互动评论、点赞、私信、群组讨论、直播和短视频分享等。 3. **社交媒体的影响** 社交媒体对个人生活、企业营销、政治运动、新闻传播等多个领域都产生了深远的影响。它改变了人们沟通、获取信息的方式,并且成为品牌营销的重要渠道。 4. **社交媒体营销** 利用社交媒体进行营销活动是当前企业推广产品和服务的常见手段。这包括创建品牌页面、发布广告、开展促销活动、利用影响者营销以及社交媒体优化(SMO)等策略。 5. **社交媒体的数据分析** 社交媒体产生了大量数据,对其进行分析可帮助企业洞察市场趋势、了解消费者行为、评估营销活动效果等。 ### C#相关知识点 1. **C#简介** C#(读作“C Sharp”)是一种由微软公司开发的面向对象的编程语言。它是.NET框架的主要语言之一,用于开发Windows应用程序、游戏(尤其是通过Unity引擎)、移动应用(通过Xamarin)和Web服务。 2. **C#在社交媒体中的应用** 在社交媒体应用的开发中,C#可以用来构建后端服务器,处理用户认证、数据库操作、数据处理、API开发等后端任务。如果是在Windows平台上,也可能被用于开发桌面应用或服务端组件。 3. **C#和ASP.NET** ASP.NET是建立在.NET框架之上用于构建动态Web应用程序的技术,C#是开发ASP.NET应用程序的主要语言。使用C#编写的ASP.NET Web Forms或MVC (Model-View-Controller) 应用程序可以处理社交媒体网站的前端逻辑和后端业务逻辑。 4. **C#和LINQ** LINQ(语言集成查询)是.NET框架提供的一个强大的查询功能,它允许使用C#对数据进行查询和操作。在社交媒体数据处理中,LINQ可以用来查询存储在数据库中的用户数据、帖子和其他内容。 5. **C#和异步编程** C#对异步编程提供了良好的支持,通过async和await关键字可以方便地编写异步代码。在处理社交媒体平台时,异步编程非常关键,因为需要同时处理成千上万的并发用户和数据流。 6. **C#和安全性** 在开发社交媒体平台时,安全性是一个关键考虑因素。C#提供了许多用于保护数据和防止攻击(如SQL注入、跨站脚本攻击等)的安全特性,比如通过使用参数化查询防止SQL注入。 通过以上知识点的总结,我们可以推断,给定的文件信息可能关联到一个使用C#语言开发的社交媒体应用程序或项目,该程序或项目可能涉及用户界面、后端服务器、数据库交互、安全性保障等多个方面。在实际开发中,开发者需要综合运用C#的语法、框架、库和.NET提供的各种服务,以实现社交媒体平台的多样化功能和高效稳定运行。