Other

C# 读取文件编译生成的时间 (采用读取PE32时间)

C# 读取文件编译生成的时间  (采用读取PE32时间)   1 /// <summary> 2 /// 读取文件编译生成的时间 (采用读取PE32时间) 3 /// </summary> 4 /// <param name=fileName>文件路径</param> 5 /// <returns></returns> 6 public static DateTime GetPE32Time(string fileName) 7 { 8 int seconds=0; 9 DateTime dt = new DateTime(1970, 1, 1);//非法的PE32文件 返回这个时间,PE32文件编译的基准时间 10 using (var br = new BinaryReader(new FileStream(fileName, FileMode.Open, FileAccess.Read))) 11 { 12 var bs = br.ReadBytes(2); 13 if (bs.Length != 2) return dt; 14 if (bs[0] !

SICP 2.2: 层次性数据和闭包性质(Python实现)

绪论 序对可以为我们提供用于构造复合数据的基本“粘接剂”,鉴于Python中tuple中元素不可变的性质,我们通过list来实现序对,如[1, 2]。Python的PyListObject对象中实际是存放的是PyObject*指针, 所以可以将PyListObject视为vecter<PyObject*>。这是一种盒子与指针表示方式(list内的元素表示为一个指向对象盒子的指针)。对于[1, 2],可将其视为以下结构: 我们不仅可以用[]去组合起各种数值,也可以用它取组合起其它序对。这样,序对就是一种通用的建筑砌块,通过它可以构造所有不同种类的数据结构来。比如想组合数值1, 2, 3, 4,我们可以用[[1, 2], [3, 4]]的方式(下图左),也可以用[[1, [2, 3]], 4](下图右): 可以构建元素本身也是序对的序对,这种能力称为[]的闭包性质。注意,这里的闭包是来自抽象代数的术语(不是Python语法中那个闭包)。抽象代数中,如果将某个运算(操作)作用于某个集合的特定元素 ,产出的仍然是该集合的元素,则称该集合元素在该运算之下封闭。我们这里说组合数据对象的操作满足闭包性质,指通过它组合起数据对象得到的结果本身还可以通过同样的操作再进行组合。 闭包性质可以使我们构建层次性的结构,这种结构由一些部分构成,而其中的各个部分又是由它们的部分构成,并且可以继续下去。下面我们介绍用序对来表示序列和树。 2.2.1 序列的表示 利用序对可以够造出的一类有用结构是序列——一批数据对象的有序汇集。利用序对表示序列的方式很多,一种最直接的表示方式为[1, [2, [3, [4, None]]]]如下图所示: 我们不妨将这种通过嵌套序对形成的序列称为链表。因为Python本身不内置链表结构,我们不妨用序对来实现链表: class LinkedList(): def __init__(self, *items) -> None: 提供两种初始化方式:序对或多个元素 if isinstance(items[0], list): self.pair = items[0] else: self.pair = self._construct(*items) def _construct(self, *items): 递归地构造链表 if items == (): return None else: item, *rest = items return [item, self._construct(*rest)] def __repr__(self): 重写打印函数 return -->.join(map(str, self._flatten(self.pair))) def _flatten(self, pair): 遍历链表,返回其一维展开 if pair is None: return [] else: return [pair[0]] + self.

java基础之break 和continue

break在任何循环语句的主体部分,均可用break控制循环的流程。break用于强行退出循环,不执行循环中剩余的语句。(break语句也在switch语句中使用) continue语句用在循环语句体中,用于终止某次循环过程,即跳过循环体中尚未执行的语句,接着进行下一次是否执行循环的判定。 关于goto关键字(了解) goto关键字很早就在程序设计语言中出现。尽管goto仍是Java的一个保留字,但并未在语言中得到正式使用;Java没有goto。然而,在break和continue这两个关键字的身上,我们仍然能看出一些goto的影子---带标签的break和continue。 “标签”是指后面跟一个冒号的标识符,例如: label: 对Java来说唯一用到标签的地方是在循环语句之前。而在循环之前设置标签的唯一理由是:我们希望在其中嵌套另一个循环,由于break和continue关键字通常只中断当前循环,但若随同标签使用,它们就会中断到存在标签的地方。 public static void main(String[] args) { int i = 0; int b = 0; while (i<=100){ i++; System.out.println(i); if(i==30){ break; } } System.out.println(======); while (b<=100){ b++; if (b%10==0){ System.out.println(); continue; } System.out.println(======+++); } } 练习:打印101-150之间的质数 //质数是指大于1的自然数中,除了1和它本身以外不再有其他因数的自然数 public static void main(String[] args) { int a = 0; //带标签的 不建议使用,了解即可 outer:for (int i = 101; i < 150; i++) { for (int j = 2; j < i/2; j++) { if (i % j==0){ continue outer; } } System.

什么是JavaScript函数,基础知识大全(全)

如果您已经开始学习JavaScript了,那是时候了解下基本函数了,本章节为大家分享JavaScript基本函数! 什么是函数? 一般来说,函数是经过精心挑选和设计以执行特定任务的子程序。 它是一个对象。要执行一个函数,您将调用它,也称为调用函数。您还可以将值传递给函数以在函数中使用。事实上,函数总是会返回一个值。因此,如果您不指定返回值, JavaScript 函数将返回 undefined。 什么是 JavaScript 函数?  您可以通过多种方式在代码中定义 JavaScript函数。首先,您将使用函数声明。您可以使用关键字“function”创建函数声明,然后添加函数的名称。当您使用函数声明时,您将提升函数定义,这将允许您在定义函数之前使用它。 接下来,您有一个任务 JavaScript 函数表达式。这定义了一个匿名或命名的名字 JavaScript 函数。匿名函数是尚未命名的函数。因为函数表达式不能被提升,所以在定义它们之前不能使用它们。 创建函数表达式的较短语法是箭头函数。这种类型的 JavaScript 函数不会创建自己的值。它仅用于编写不同的功能。 参数(arguments)和参数(parameters) 您可能听说过“arguments”和“parameters”这两个术语可以互换使用,这可能会导致您认为它们是同一个东西。虽然这两个术语在涉及 JavaScript 函数时非常相似,但您应该了解一些非常重要的区别。 参数用于定义JavaScript 函数。这意味着参数是在定义 JavaScript 函数是最初创建的名称。在进行函数定义时,您可能会传递多达 255 个 JavaScript 参数。使用逗号将参数与下一个参数隔开。  如何调用函数 当您调用JavaScript 函数时,您正在执行该函数,也称为调用它。要调用函数,首先添加JavaScript 函数的名称,后跟两个括号。为了帮助您更好地理解 JavaScript的这个组件。 如果您当前使用的是Google Chrome,请打开开发者控制台。这将允许您练习 JavaScript 函数。要打开此开发人员控制台,请按 Ctrl + Shift + J(对于 Windows)或Cmd + Opt + J(对于 Mac)。 首先,让我们定义一个名为 logIt的 JavaScript 函数。这个 JavaScript 函数将有一个参数:“city”。执行完此函数后,我们将名称记录到控制台中。它看起来像这样: 如果你想调用这个函数,你可以调用它并将它传递给一个参数。在此示例中,JavaScript 函数名为 Dallas。它看起来像这样: 如果您的函数没有任何参数,则可以使用一组空括号来调用它。它看起来像这样; 什么是 JavaScript 函数返回? 在 JavaScript 中,除非您另行指定,否则每个函数都将返回undefined。让我们通过调用一个空的JavaScript 函数。

java锁 AQS 线程池 ThreadLocal

JUC java锁 关键信息 LockSupport LockSupport中的park() 和 unpark() 的作用分别是阻塞线程和解除阻塞线程 Condition 需要和Lock联合使用,它的作用是代替Object监视器方法,可以通过await(),signal()来休眠/唤醒线程 ReentrantLock 可重入的互斥锁 公平锁 FIFO等待队列 非公平锁 不管在不在队列开头都能获取锁 有一个成员变量sync,sync是Sync类型;Sync是一个抽象类,而且它继承于AQS 函数列表 // 创建一个 ReentrantLock ,默认是“非公平锁”。 ReentrantLock() // 创建策略是fair的 ReentrantLock。fair为true表示是公平锁,fair为false表示是非公平锁。 ReentrantLock(boolean fair) // 查询当前线程保持此锁的次数。 int getHoldCount() // 返回目前拥有此锁的线程,如果此锁不被任何线程拥有,则返回 null。 protected Thread getOwner() // 返回一个 collection,它包含可能正等待获取此锁的线程。 protected Collection<Thread> getQueuedThreads() // 返回正等待获取此锁的线程估计数。 int getQueueLength() // 返回一个 collection,它包含可能正在等待与此锁相关给定条件的那些线程。 protected Collection<Thread> getWaitingThreads(Condition condition) // 返回等待与此锁相关的给定条件的线程估计数。 int getWaitQueueLength(Condition condition) // 查询给定线程是否正在等待获取此锁。 boolean hasQueuedThread(Thread thread) // 查询是否有些线程正在等待获取此锁。 boolean hasQueuedThreads() // 查询是否有些线程正在等待与此锁有关的给定条件。 boolean hasWaiters(Condition condition) // 如果是“公平锁”返回true,否则返回false。 boolean isFair() // 查询当前线程是否保持此锁。 boolean isHeldByCurrentThread() // 查询此锁是否由任意线程保持。 boolean isLocked() // 获取锁。 void lock() // 如果当前线程未被中断,则获取锁。 void lockInterruptibly() // 返回用来与此 Lock 实例一起使用的 Condition 实例。 Condition newCondition() // 仅在调用时锁未被另一个线程保持的情况下,才获取该锁。 boolean tryLock() // 如果锁在给定等待时间内没有被另一个线程保持,且当前线程未被中断,则获取该锁。 boolean tryLock(long timeout, TimeUnit unit) // 试图释放此锁。 void unlock() ReadWriteLock 唯一实现类ReentrantReadWriteLock CountDownLatch 包含sync对象 CyclicBarrier 包含ReentrantLock对象lock和Condition对象trip,它是通过独占锁实现的

python所有的内置异常类型汇总

在 Python 中,所有异常必须为一个派生自 BaseException 的类的实例。 通过子类化创建的两个不相关异常类永远是不等效的,既使它们具有相同的名称。 下列异常主要被用作其他异常的基类。 BaseException: 所有异常的基类 Exception(重点掌握) 所有内置的非系统退出类异常都派生自此类。 所有用户自定义异常也应当没打算自此类。 ArithmeticError 此基类用于派生针对各种算术类错误而引发的内置异常: OverflowError, ZeroDivisionError, FloatingPointError。 BufferError 当与 缓冲区 相关的操作无法执行时将被引发。 LookupError 此基类用于派生当映射或序列所使用的键或索引无效时引发的异常: IndexError, KeyError 内置异常的层次结构 BaseException 所有异常的基类 +-- SystemExit 解释器请求退出 +-- KeyboardInterrupt 用户中断执行(通常是输入^C) +-- GeneratorExit 生成器(generator)发生异常来通知退出 +-- Exception 常规错误的基类 +-- StopIteration 迭代器没有更多值 +-- StopAsyncIteration 必须通过异步迭代器对象的__anext__()方法引发以停止迭代 +-- ArithmeticError 所有数值计算错误的基类 | +-- FloatingPointError 浮点计算错误 | +-- OverflowError 数值运算超出最大限制 | +-- ZeroDivisionError 除(或取模)零 (所有数据类型 +-- AssertionError 断言语句失败 +-- AttributeError 对象没有这个属性 +-- BufferError 与缓冲区相关的操作时引发 +-- EOFError 没有内建输入,到达EOF 标记 +-- ImportError 导入失败 | +-- ModuleNotFoundError 找不到模块 +-- LookupError 无效数据查询的基类 | +-- IndexError 序列中没有此索引(index) | +-- KeyError 映射中没有这个键 +-- MemoryError 内存溢出错误 +-- NameError 未声明、初始化对象 | +-- UnboundLocalError 访问未初始化的本地变量 +-- OSError 操作系统错误, | +-- BlockingIOError 操作将阻塞对象设置为非阻塞操作 | +-- ChildProcessError 子进程上的操作失败 | +-- ConnectionError 与连接相关的异常的基类 | | +-- BrokenPipeError 在已关闭写入的套接字上写入 | | +-- ConnectionAbortedError 连接尝试被对等方中止 | | +-- ConnectionRefusedError 连接尝试被对等方拒绝 | | +-- ConnectionResetError 连接由对等方重置 | +-- FileExistsError 创建已存在的文件或目录 | +-- FileNotFoundError 请求不存在的文件或目录 | +-- InterruptedError 系统调用被输入信号中断 | +-- IsADirectoryError 在目录上请求文件操作 | +-- NotADirectoryError 在不是目录的事物上请求目录操作 | +-- PermissionError 在没有访问权限的情况下运行操作 | +-- ProcessLookupError 进程不存在 | +-- TimeoutError 系统函数在系统级别超时 +-- ReferenceError 弱引用试图访问已经垃圾回收了的对象 +-- RuntimeError 一般的运行时错误 | +-- NotImplementedError 尚未实现的方法 | +-- RecursionError 解释器检测到超出最大递归深度 +-- SyntaxError Python 语法错误 | +-- IndentationError 缩进错误 | +-- TabError Tab 和空格混用 +-- SystemError 一般的解释器系统错误 +-- TypeError 对类型无效的操作 +-- ValueError 传入无效的参数 | +-- UnicodeError Unicode 相关的错误 | +-- UnicodeDecodeError Unicode 解码时的错误 | +-- UnicodeEncodeError Unicode 编码时错误 | +-- UnicodeTranslateError Unicode 转换时错误 +-- Warning 警告的基类 +-- DeprecationWarning 关于被弃用的特征的警告 +-- PendingDeprecationWarning 关于构造将来语义会有改变的警告 +-- RuntimeWarning 可疑的运行行为的警告 +-- SyntaxWarning 可疑的语法的警告 +-- UserWarning 用户代码生成的警告 +-- FutureWarning 有关已弃用功能的警告的基类 +-- ImportWarning 模块导入时可能出错的警告的基类 +-- UnicodeWarning 与Unicode相关的警告的基类 +-- BytesWarning bytes和bytearray相关的警告的基类 +-- ResourceWarning 与资源使用相关的警告的基类。。

linux用户管理和用户权限

chmod : 修改用户权限,chmod u+rwx 1.txt u : 表示所属用户 g : 表示所属用户组 o : 表示其他用户 a : 表示所有用户 : 增加权限 : 撤销权限 = : 设置权限 useradd : 增加用户 who : 查看当前登录的用户 userdel -r 用户名 : 删除用户 su : 切换用户 passwd : 修改当前用户的密码,需要输入原密码 passwd 用户名 : 修改指定用户名的密码

从开源模型、框架到自研,声网 Web 端虚拟背景算法正式发布

根据研究发现,在平均 38 分钟的视频会议里面,大概会有 13 分钟左右的时间用于处理和干扰相关的事情。同时研究也表明在参加在线会议的时候,人们更加倾向于语音会议,其中一个关键原因就是大家不希望个人隐私暴露于公众的视野。 如何在视频会议中突出演讲者,减少背景当中的干扰信息,并提升人们对视频会议的参与热情成为了实时音视频技术所要解决的问题,而实时虚拟背景正是一项这样的技术。不同于绿幕等传统技术手段,虚拟背景通过机器学习推理对实时视频内容当中的人像进行分割,实现对人像外内容的替换。因此用户无需对现实环境中的背景进行布置即可使用,具有便捷高效的优点。  2021 年 8 月,声网落地了基于 Web SDK 的第一个虚拟背景插件版本,实现了背景替换与背景虚化功能。在近期发布的虚拟背景插件更新中,该功能得到进一步提升,目前已可支持图片虚拟背景、基于 CSS 色值的纯色背景、3 档不同程度的虚化背景。机器学习推理引擎也从通用机器学习框架升级为 Agora AI 实现,不仅整体包增量从 3M 降低至 1M,运算性能实现了 30% 以上的提高,新的 API 也更为易用。 回顾声网 Web SDK 虚拟背景功能的研发过程,主要经历了三个阶段: 第一阶段 开源模型 + 开源机器学习框架 在这一阶段,我们基于 MediaPipe selife 人像分割模型和TFlite机器学习框架完成了虚拟背景在 Web 平台的工程化实践。实现了从图像采集、实时处理到编码发送的完整管线。在这一个过程中,我们对影响处理性能的关键因素进行了大量分析,并对这些性能瓶颈进行了针对性的优化。同时我们也对不同机器学习框架在 Web 人像分割的应用场景进行了定制和优化,这其中包括对 MediaPipe 和 TFlite 框架的定制。 MediaPipe 使用 TFlite 作为机器学习推理引擎,MediaPipe 的 TFlite 人像分割模型所使用的算子除了包含 TFlite 支持的通用算子,还包含 MediaPipe 提供的特殊算子。在实践中,我们将 MediaPipe 人像分割模型所依赖的 MediaPipe 特殊算子直接移植到 TFlite,实现了 selife segmentation 模型脱离 MediaPipe 框架直接在 TFlite 上的运行。同时使用自研 WebGL 算法替代 Mediapipe 提供的图形处理功能。这样就消除工程对 MediaPipe 的依赖,不仅降低了 MediaPipe 带来的整体包增量,同时使机器学习运算和图像处理解耦,整体方案更具灵活性。

【Python小随笔】词频统计

def word_counts_action(text, top_number): :param text: 统计的文本 :param top_number: 输出词频前几 :return: [('非常', 36), ('很', 31), ('手机', 23), ('也', 18)] object_list = [] # 文本预处理 remove_words = [u'的', u',', u'和', u'是', u'随着', u'对于', u'对', u'等', u'能', u'都', u'。', u' ', u'、', u'中', u'在', u'了', u'通常', u'如果', u'我们', u'需要'] # 自定义去除词库 seg_list_exact = SnowNLP(text).words # 每一个数组评论分词 for word in seg_list_exact: # 循环读出每个分词 if word not in remove_words: # 如果不在去除词库中 object_list.append(word) # 分词追加到列表 word_counts = collections.

linux安装tomcat

首先进入官网下载tomcat-------JDK要首先在linux安装好java运行环境 https://tomcat.apache.org/ 选择linux版本tar.gz 上传到linux 进入 / 根目录 cd / 移动上传好的文件到/var下面 mv apache-tomcat-9.0.62.tar.gz /var/ 解压文件 tar -zxv -f apache-tomcat-9.0.62.tar.gz 回车 文件夹改名 mv -i apache-tomcat-9.0.62 tomcat9 可以进入tomcat9的bin目录下直接启动tomcat,也可以先配置环境变量再启动 cd /var/tomcat9/bin 启动tomcat ./startup.sh 在JDK环境变量基础上添加tomcat环境变量 vim /etc/profile 使改变后的环境变量生效 source /etc/profile 在linux防火墙里添加开启8080端口访问 firewall-cmd --permanent --zone=public --add-port=8080/tcp 重启防火墙 systemctl restart firewalld.service 在云服务器安全防火墙上开启8080端口  从地址栏打开看到tomcat主页就成功了 44.125.66.64:8080