转:Spyder 快捷键大全

主要介绍了Spyder常见的快捷键,从spyder的配置表中导出,中文名称为直译。 常用快捷键 快捷键 中文名称 Ctrl+R 替换文本 Ctrl+1 单行注释,单次注释,双次取消注释 Ctrl+4 块注释,单次注释,双次取消注释 F5 运行程序 Ctrl+P 文件切换 Ctrl+L 清除shell Ctrl+I 查看某个函数的帮助文档 Ctrl+Shift+V 调出变量窗口 Ctrl+up 回到文档开头 Ctrl+down 回到文档末尾 Ctrl ++ 放大1 Ctrl += 放大2 Ctrl ± 缩小 F11:全屏 Shift+Tab:撤销代码缩进 Tab:空行前是代码缩进;在输入一个字母后,按Tab健会自动补全或者代码提示。 C快捷键查看方法:Tools–>Preferences–>Keyboard Shortcut 可以查看所有快捷键 可以在Ipython Console输入变量进行快速验证,类似matlab ============================================================================= 全部快捷键 context name shortcut 中文名称 close page Ctrl+Shift +F4 关闭页面configure Ctrl+F6 配置debug continue Ctrl+F12 继续调试debug exit Ctrl+Shift+F12 调试退出debug step into Ctrl+F11 调试进入函数debug step over Ctrl+F10 调试跳出函数debug step return Ctrl+Shift+F11 调试返回debug Ctrl+F5 调试file switche Ctrl+P 文件切换find next F3 查找下一个文件find previous Shift+F3 找到以前的文件find text Ctrl+F 找到文本fullscreen mode F11 全屏模式hide find and replace EShiftCtrl 隐藏查找和替换layout preferences Alt+Shift+P 布局的设置lock unlock panes Ctrl+Shift+F5 锁解锁窗格maximize pane Ctrl+Alt+Shift+M 最大化窗格preferneces Ctrl +Alt +Shift+P 偏好quit Ctrl +Q 退出re-run last script F6 最后重新运行脚本repalce text Ctrl +R 替换文本restart Alt +Shift+R 重新启动run F5 运行save current layout Alt +Shift+ S 保存当前的布局show toolbars Alt +Shift+T 显示工具栏spyder documentation F11 spyder的文档switch to breakpoints Ctrl +Shift+B 切换到断点switch to console Ctrl +Shift+C 切换到控制台switch to editor Ctrl +Shift+E 切换到编辑器switch to explorer Ctrl +Shift+X 切换到浏览器switch t find_in_files Ctrl +Shift+F 切换到 find_in_filesswitch to help Ctrl +Shift+H 切换到帮助switch to historylog Ctrl +Shift+L 切换到historylogswitch to ipython_console Ctrl +Shift+I 切换到ipython_consoleswitch to onlinehelp Ctrl +Shift+D 切换到onlinehelpswitch to outline_explorer Ctrl +Shift+O 切换到outline_explorerswitch to project_explorer Ctrl +Shift+P 切换到project_explorerswitch to variable_explorer Ctrl +Shift+v 切换到variable_explorersymbol finder Ctrl +Alt +P 符号查找器use next layout Alt +Shift+PageDoen 使用下一个布局use previous layout Alt +Shift+PageUp 使用上一个布局

2022年十三届蓝桥杯国赛(C/C++大学B组)个人题解

2022年十三届蓝桥杯国赛(C/C++大学B组)个人题解 更新:成绩出来了,估分50分左右,最后拿了个国二,还差点到国一,有点出乎意料,挺满意了挺满意了。 去年国赛基本都是暴力,最后国三都没拿到(我是废物 ),今年感觉比去年难了不少,而且时间没有安排好,第一题就被卡了好久,然后G题概率论也分析了好久,导致最后三题都没时间做了,总之就是一点暴力分都没骗到,希望做的题能多对几道吧,希望能拿个国三。 试题 A: 2022 【问题描述】 将 2022 拆分成 10 个互不相同的正整数之和,总共有多少种拆分方法? 注意交换顺序视为同一种方法,例如 2022 = 1000 + 1022 和 2022 =1022 + 1000 就视为同一种方法。 【答案提交】 这是一道结果填空的题,你只需要算出结果后提交即可。本题的结果为一个整数,在提交答案时只填写这个整数,填写多余的内容将无法得分。 10个循环暴力明显超时,有一点思路大概是最小数的范围在0-197之间,可能需要根据数的范围来做?然后就不会了。 试题 B: 钟表 【问题描述】 在 12 小时制的钟表中,有分针、时针、秒针来表示时间。记分针和时针之间的夹角度数为 A(0 ≤ A ≤ 180)、分针和秒针之间的夹角度数为 B (0 ≤ B ≤ 180)。而恰好在 s 时 f 分 m 秒时,满足条件 A = 2B 且 0 ≤ s ≤ 6; 0 ≤ f < 60;0 ≤ m < 60,请问 s, f, m 分别是多少。

depot_tools原理和实现

depot_tools原理和实现 depot_tools是Google的构建工具,所有Google系的项目构建都离不开depot_tools。 但是中文网络相关的文章基本都是简单的提一下用法,几乎没有讲解depot_tools原理实现的文章,所以这篇文章将讲解depot_tools的原理和实现。 此文章基于2022年6月的depot_tools代码。 此文章的基于Windows实现讲解,不过depot_tools是跨平台工具,基本大同小异。 部署 depot_tools本身是一个git仓库(https://chromium.googlesource.com/chromium/tools/depot_tools),其部署就是将仓库本身clone并将目录加入PATH环境变量即可。 其本身默认在每次运行时也会自动从仓库中拉取最新的代码来完成更新。 组件 depot_tools是一个工具集,其由几个主要组件组成,来完成构建过程中的代码拉取和构建。 工具主要由shell脚本和python脚本实现,在运行过程中会不断下载可执行组件。 depot_tools会使用git、python等可执行文件。但是第一次部署之后,depot_tools会使用bootstrap下载自己的git、python可执行文件,除非强制指定,否则不再使用系统安装的可执行文件。 bootstrap 拉取depot_tools的基础工具,如下载python、git。fetch 初始化项目。gclient 拉取所有项目依赖代码并执行项目hook。cipd 用来下载大的二进制文件的工具。vpython python虚拟环境,隔离不同版本的python环境,方便使用不同版本的python。git 拉取代码的工具,depot_tools扩展了一系列git的脚本,以更加方便的使用git。 上文只列出了几个主要组件,还有很多辅助脚本由于篇幅原因不做讲解。 代理脚本 depot_tools的所有组件一般都会创建一个代理脚本,代理脚本一般是和组件同名的shell脚本,一般对组件的调用都会先调用代理脚本。然后代理脚本会对真正的组件进行更新或者初始化之类检查工作,最后默认会启动对应的组件并转发参数。 如果启动时不想更新,可以使用python update_depot_tools_toggle.py --disable关闭自动更新。python update_depot_tools_toggle.py --enable可以打开自动更新。 但是切记第一次使用的时候必须打开自动更新,因为要下载一些组件。 下文只介绍实际的组件,不再描述代理脚本的逻辑。 CIPD CIPD全称Chrome Infrastructure Package Deployment(https://chromium.googlesource.com/infra/luci/luci-go/+/main/cipd/README.md),主要用于管理Google项目构建中用到的二进制文件(例如编译器之类的),你可以简单的认为是针对大文件的git系统。 CIPD管理的所有文件可以在(https://chrome-infra-packages.appspot.com)上查看。 bootstrap 每次运行depot_tools中的组件时,主要用于自动进行更新并拉取基础工具 首先会尝试下载或者更新cipd_client的可执行文件 然后启动bootstrap,bootstrap会读取bootstrap/manifest.txt,下载文件中指定的工具。 并创建对应的代理脚本。 vpython vpython是Google的python虚拟化环境,主要的用于隔离不同版本的python环境,因为Google项目中使用了大量的python脚本,但是有些python脚本只能运行于特定版本的python中,所以需要同时运行不同版本的python。 git depot_tools使用python脚本扩展了一系列git操作,来更方便的使用git。 fetch fetch是用来初始化项目配置的工具。一般会在第一次拉取项目时用到。 fetch根据传入的参数拉取初始化项目配置。fetch所支持的项目在fetch_configs目录下,也是一系列python脚本,其中描述了项目的代码仓库和拉取方式以及默认目录。 当然你也可以自己扩展其他使用Google代码管理工具的项目配置。 目前所有的项目配置中拉取方式都是使用gclient_git,fetch初始化后会调用gclient在运行目录下生成一个.gclient文件,里面描述了项目的仓库地址等信息,之后gclient就依据此配置文件工作。 然后fetch使用默认参数调用gclient sync进行代码的拉取,当然fetch的也会把其他的命令行参数中透传给gclient。 在一些Google项目的文档、博客中你有时会看到不使用fetch,只使用gclient的方法。这就是在理解了fetch的原理后,自己完成第一步的生成gclient_git初始化过程,然后用gclient拉取代码。 gclient gclient是进行代码拉取、工具部署、代码管理的关键组件。一旦拥有了.gclient配置文件,那么之后的工作就都可以通过gclient完成,不再需要fetch了。 因为gclient包含了很多大部分人不使用的功能,所以本文只重点讲解通常拉取代码、构建项目用到的sync命令。其他指令只简单介绍功能。 config 在运行目录里生成.gclient配置文件。 root 输出项目的根目录。 runhooks 执行项目配置里的hooks。当你执行sync时使用了–nohooks参数时,就可以使用该命令来手动执行hooks。 recurse 在项目中的每个依赖中都执行一条命令。 fetch 拉取所有模块中的更新。 diff 显示项目中每个依赖的本地修改。 status 显示项目中每个依赖的修改状态。

C中结构体释放问题

C中的结构体释放分为两种情况 第一种情况:结构体指针成员申请了堆内存,此时需要释放指针成员指向的内存后再释放结构体节点指针 // test_C_C++.cpp : 此文件包含 "main" 函数。程序执行将在此处开始并结束。 // #include <iostream> typedef struct _private_data_ { int iIonCtlFd; int a; int b; // Point to the system memory address void* pvBuffer; } t_private_data; int main() { t_private_data* private_data = NULL; private_data = (t_private_data*)calloc(1, sizeof(t_private_data)); private_data->pvBuffer = malloc(100); std::cout << "Hello World! " << sizeof(private_data) << " " << sizeof(t_private_data) << std::endl; free(private_data->pvBuffer); free(private_data); } 第二种情况:结构体指针成员没有申请堆内存,只需要释放结构体节点指针指向的内存就可以了 // test_C_C++.cpp : 此文件包含 "main" 函数。程序执行将在此处开始并结束。 // #include <iostream> typedef struct _private_data_ { int iIonCtlFd; int a; int b; } t_private_data; int main() { t_private_data* private_data = NULL; private_data = (t_private_data*)calloc(1, sizeof(t_private_data)); std::cout << "

实验3 黑盒测试:决策表法及测试用例设计

实验3 黑盒测试:决策表法及测试用例设计 一、实验目的 1、掌握决策表的概念。 2、掌握决策表测试用例设计法。 二、实验任务 以下三个任务、至少完成一个 1、对NextDate问题运用决策表法设计测试用例,并执行测试,撰写实验报告。 NextDate (int month, int day, int year)函数规定:输入三个整数:month、day和year,函数的输出为输入日期后一天的日期。例如,输入为2006年3月7日,则函数的输出为2006年3月8日,year满足1920≤year≤2050。 实验步骤: 构造决策表 序号 1 2 3 4 5 6 7 8 9 10 C1日 D1 Y Y D2 Y Y D3 Y Y D4 Y Y D5 Y Y C2月 M1 Y Y Y Y Y M2 Y Y Y Y Y M3 M4 C3年 Y1 Y2 A1:没有该日期 √ A2:日期加一 √ √ √ √

多次跳槽后,月薪等于老同事的年薪

最近有一位工作了8年的程序员,他将自己的一个月工资晒到了网上以后,令很多网友非常的羡慕。现在是一个网络的时代,程序员在这个网络的时代里面是非常重要的一个职业,他们的收入和付出有着很正比的关系。 作为程序员,他在2016年的时候刚刚大学毕业,进入到一家公司里面工作,成为一名程序员,当时他的月工资为9500元一个月,这个工资水平对很多应届大学毕业生来说已经是非常的高了,很多大学应届毕业生他们的工资仅有两三千块钱一个月。 经历了4年时间的蜕变以后,公司进行了一次薪资的调整,然而仅仅涨到了13000,这次的涨幅在他看来也太低了,于是毅然选择了跳槽。 2020年的时候,他迎来了自己人生中的第1次跳槽,他的工资水平从此以后直接涨到了3万9000块钱一个月。但是他对这个薪资待遇,显然还没有太过满意。 在2021年的时候,他的薪资待遇又有了一个提升,长到了41500块钱一个月。在同年的时间里面,他又迎来了自己的又一次跳槽的机会,他的工资水平又达到了48,000块钱一个月。 2022年的时候,他对于自己目前的薪资待遇还没有一个满意的程度,他又进行了一次跳槽,这一次他的工资水平达到了6万块钱一个月。他的月工资水平相对于普通者来说是他们一年的收入。 很多网友看到作为员工发出自己的月工资待遇以后,表示非常的羡慕。光羡慕没用,得自己行动起来。 这里我免费分享一份GitHub 上标星 120k的《Java核心进阶知识全面解析》给大家看看,不论是用于巩固基础,还是用于技术提升都可以收藏一份,看完学透,面试大厂so easy。 下面展示部分截图,文末附免费下载方式。 (一). 基础 1、Java 基本功 Java 入门(基础概念与常识)Java 语法基本数据类型方法(函数) 2、Java 面向对象 类和对象面向对象三大特征修饰符接口和抽象类其它重要知识点 3、Java 核心技术 集合异常多线程文件与 I\O 流 (二). 并发 1、并发容器 JDK 提供的并发容器总结ConcurrentHashMapCopyOnWriteArrayListConcurrentLinkedQueueBlockingQueueConcurrentSkipListMap 2、线程池 使用线程池的好处Executor 框架(重要)ThreadPoolExecutor 类简单介绍(重要)ThreadPoolExecutor 使用示例几种常见的线程池详解ScheduledThreadPoolExecutor 详解线程池大小确定 3、乐观锁与悲观锁 何谓悲观锁与乐观锁乐观锁常见的两种实现方式乐观锁的缺点CAS与synchronized的使用情景 (三). JVM 1、Java内存区域 概述运行时数据区域HotSpot 虚拟机对象探秘重点补充内容 2、JVM垃圾回收 揭开 JVM 内存分配与回收的神秘面纱对象已经死亡?垃圾收集算法垃圾收集器 3、JDK 监控和故障处理工具 JDK 命令行工具JDK 可视化分析工具 (四)网络、linux、数据结构与算法、数据库、系统设计、必会工具、面试指南 因为篇幅有限,其他内容就不一一展示了,这本进阶笔记总共有512页。对于想要进阶的小伙伴来说应该会很有帮助,希望也能帮助到你。 需要的小伙伴可以点击下面的名片免费领取。

springboot仓库管理系统

作者主页:夜未央5788 简介:Java领域优质创作者、Java项目、学习资料、技术互助 文末获取源码 项目介绍 仓库管理系统总共分为三个大的模块,分别是基础管理、仓库管理和系统管理。其中各个模块底下又有其子模块。 功能模块 一、基础管理 1、客户管理 客户列表 客户分页和模糊查询 客户添加、修改、删除、批量删除 2、供应商管理 供应商列表 供应商分页和模糊查询 供应商添加、修改、删除、批量删除 3、商品管理 商品列表 商品分页和模糊查询 商品添加、修改、删除、商品图片的上传 二、仓库管理 1.入库 订单查询、创建订单、删除订单 2.出库 订单查询、创建订单、删除订单 3.仓库基础设置 查询仓库、添加仓库、编辑仓库、删除仓库 三、系统管理 1、角色管理 全查询角色和模糊查询 角色的添加、修改、删除以及给角色分配权限 2、用户管理 全查询用户和模糊查询 用户的添加、修改、删除、重置密码以及给用户分配角色 环境需要 1.运行环境:最好是java jdk 1.8,我们在这个平台上运行的。其他版本理论上也可以。 2.IDE环境:IDEA,Eclipse,Myeclipse都可以。推荐IDEA; 3.tomcat环境:Tomcat 7.x,8.x,9.x版本均可 4.硬件环境:windows 7/8/10 1G内存以上;或者 Mac OS; 5.是否Maven项目: 是;查看源码目录中是否包含pom.xml;若包含,则为maven项目,否则为非maven项目 6.数据库:MySql 8.0版本; 技术栈 1. 后端:SpringBoot+Shiro+MybatisPlus 2. 前端:HTML+CSS+Javascript+LayUI+DTree+Thymeleaf 使用说明 1. 使用Navicat或者其它工具,在mysql中创建对应名称的数据库,并导入项目的sql文件; 2. 将项目中application.yml配置文件中的数据库配置改为自己的配置; 3. 使用IDEA/Eclipse/MyEclipse导入项目,Eclipse/MyEclipse导入时,若为maven项目请选择maven; 若为maven项目,导入成功后请执行maven clean;maven install命令,配置tomcat,然后运行; 4. 运行项目,输入localhost:8080/ 登录 5. 管理员用户名:钱多多 密码:123456

自定义mvc增删改查

目录 一、搭建自定义mvc框架环境 二、通用的增删改查 三、查询删除及重复表单提交问题 四、新增修改的前端实现 一、搭建自定义mvc框架环境 自定义jar包 1.将框架打成jar包,然后导入新工程,并且把框架的依赖jar包导入进去。 然后点finish就出现在你定义的那个位置那里了 book: package ps.entity; public class Book { private int bid; private String bname; private float price; public int getBid() { return bid; } public void setBid(int bid) { this.bid = bid; } public String getBname() { return bname; } public void setBname(String bname) { this.bname = bname; } public float getPrice() { return price; } public void setPrice(float price) { this.

在Android studio上开发APP之后,找不到应用图标,但是手机管家显示已经安装

⼀、问题: 在写项⽬的时候运⾏的时候突然Android桌⾯上没有了应⽤图标,但是手机管家显示已经安装 二、分析: 上午运行的时候还能 找到图标,下午在对接友盟的SDK时,无意间退出发现找不到应用图标,应该是对接出现的问题,百度之后查找原因就是activity中的intent-filter⽤了不同的data和action属性。intent-filter必须满⾜所有的属性才通过这种⽅式启动。当我们设置了不同的data和action。就会通过两种⽅式启动,所以不能放在⼀起。,恢复之前的解决桌⾯上没有了应⽤图标问题 二、解决: 这个是运行没有找不到应用图标,但是手机管家显示已经安装 <activity android:name=".activity.WelActivity"> <intent-filter> <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" /> <!-- 友盟的--> <action android:name="android.intent.action.VIEW" /> <category android:name="android.intent.category.DEFAULT" /> <category android:name="android.intent.category.BROWSABLE" /> <data android:scheme="um.62aaefbb88ccdf4b7e9b26ee" /> </intent-filter> </activity> 这个是修改完成正常的 <activity android:name=".activity.WelActivity"> <intent-filter> <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" /> </intent-filter> <intent-filter> <!-- 友盟的--> <action android:name="android.intent.action.VIEW" /> <category android:name="android.intent.category.DEFAULT" /> <category android:name="android.intent.category.BROWSABLE" /> <data android:scheme="um.我的友盟的appkey" /> </intent-filter> </activity>

Aximmetry虚拟演播-视频学习笔记

官网:https://aximmetry.com Aximmerty移动UE里物体 https://www.bilibili.com/video/BV1f341137ZN?spm_id_from=333.337.search-card.all.click 下载DE版 : Aximmerty官网下载DE版,并下载Unreal Editor for Aximmetry,可以实现UE场景导入Aximmerty暴露UE里物体位置 :通过GetAximmertyTransformation节点,暴露物体位置,通过Ax操作平台,来修改UE里的物体位置简单修改位置:通过Ax里的Scene Node,来设置UE里某物体的位置动画修改位置:Sequencer来制作一个动画,连接Sequence Node节点,以动画来改变UE里物体位置设置播放快捷键:可设置视频Looping和设置Restart / Stop / Pause / Play的键盘快捷键;同样可以给Sequencer设置一个快捷键,来同时启动 Aximmerty制作画中画 https://www.bilibili.com/video/BV1kF411T7WS?spm_id_from=333.337.search-card.all.click&vd_source=707ec8983cc32e6e065d5496a7f79ee6 为Ax建立材质:建立一个Param2D材质,并给到一个UE模型用于绑定Ax视频的蓝图:通过GetAximmetryVideo节点,绑定UE模型里的动态材质,并暴露材质Ax简单绑定画中画视频:把视频直接连接暴露的材质即可 Aximmerty通过Overlays切换画中画 https://www.bilibili.com/video/BV1Pa411779F?spm_id_from=333.337.search-card.all.click&vd_source=707ec8983cc32e6e065d5496a7f79ee6 可切换的画中画:增加Overlays_Vid节点,出现一个面板,可以添加全屏视频与虚拟视频(画中画)添加Logo:通过LOGOS面板添加Logo添加插入动画:通过INSERTS面板添加插入动画添加绿幕视频:通过Green面板添加可控制的绿幕视频保存视频:添加Record节点来保存视频 Aximmerty触发UE动画 https://www.bilibili.com/video/BV1294y1m7jV?spm_id_from=333.337.search-card.all.click 暴露触发开关给Ax:通过GetAximmerty Trigger节点,来制作触发UE动画 Aximmerty灯光与人物渲染 https://www.bilibili.com/video/BV1sr4y1t7wd?spm_id_from=333.337.search-card.all.click 人物可以设置灯光影响程度 Aximmetry的安装与上手教程 https://www.bilibili.com/video/BV1eY4y1t7o9/?vd_source=707ec8983cc32e6e065d5496a7f79ee6 ue4 配置参考

Centos 7/8 root密码重置

一、使用背景: 由于生产环境的服务器有很多台,在使用的过程中难免会忘记root账号的密码,这时候就必须要会使用Linux系统自带的重置root密码功能。 二、重置root密码的操作步骤 1、启动系统,默认选中第一行 2、按“e”键,进入下图界面,移动向下方向键至“Linux16”开头的行(如下面第二张图),在后面追加 rd.break 参数,按ctrl+x进入救援模式 3、进入救援模式,开始更新密码 通过mount加grep命令,可以看出/sysroot的挂载方式是只读 使用mount -o remount,rw /sysroot 修改/sysroot的挂载方式为rw 使用chroot /sysroot改变系统的root信息 使用passwd命令修改root的密码 通过使用 touch /.autorelabel 来更新SELinux信息(前提是SELinux是开启状态,如果禁用SELinux了,这一步即可省略) 4、输入两次exit退出并自动重启,重启以后用新密码登录系统即可。

python:No module named ‘tqdm’

背景:labelme的json文件转成voc的xml文件时 报错 总结:这个问题本质是(pycharm安装第三方库失败),查错误的时候发现是无法连接上源,所以无法下载。自己下好包再安装应该也是可以行的通的,赶项目要紧先留个坑。 尝试一(下载失败 未解决): conda install tqdmpip install tpdmconda install -c conda-forge tpdm 尝试二(未解决): 到fqdm官网下载 【看到别人下新版踩坑,我也跟着他下老版本的】tqdm · PyPI然后在cmd中运行5555依旧报错 尝试三:(成功): 打开anaconda 点击cannal>add 添加任意国内源 (无法连接) 查看报错:xxxx .condarc xxxxxxx大概意思是检查conda在.condarc的配置,于是去看了一下 ,用txt格式打开发现里面是源的list,于是在网上复制粘贴一堆国内源地址。再返回上图步骤,源的地址添加成功!再返回anaconda prompt 进入环境:activate xxxpip install tqdm成功!

Go pprof 使用记录

Golang自带的一款开箱即用的性能监控和分析工具。真正分析时常用4种 CPU Profiling:CPU 分析,按照一定的频率采集所监听的应用程序 CPU(含寄存器)的使用情况,可确定应用程序在主动消耗 CPU 周期时花费时间的位置Memory Profiling:内存分析,在应用程序进行堆分配时记录堆栈跟踪,用于监视当前和历史内存使用情况,以及检查内存泄漏Block Profiling:阻塞分析,记录 goroutine 阻塞等待同步(包括定时器通道)的位置Mutex Profiling:互斥锁分析,报告互斥锁的竞争情况 做性能分析,第一步需要先获取数据,然后对数据进行分析。所以下面展示一下如何进行数据获取。 一、数据采集 1.1 runtime/pprof 手动调用 runtime.StartCPUProfile / runtime.StopCPUProfile 等API来进行数据的采集。 优点:灵活性高、按需采集。 使用场景:工具型应用(比如说定制化的分析小工具、集成到公司监控系统) package main import ( "fmt" "os" "runtime/pprof" ) func sayHelloWorld() { var list []string for i := 0; i < 100; i++ { list = append(list, "Hello World") } fmt.Println(list) } func main() { //CPU Profile fc, err := os.Create("./cpu.prof") if err != nil { fmt.Println(err) return } defer fc.

一文搞定Http缓存-强制缓存与协商缓存

本文从关注前端页面性能优化从而进一步理解HTTP缓存的核心过程,更详细的页面加载渲染和网络请求你可以参考血案文章:从输入 URL 到页面展现中间发生了这些!(最全面拓展讲解) 掘金原文一文搞定Http缓存-强制缓存与协商缓存, 点击关注csdn 和掘金 查看更多好文分享 HTTP缓存 当浏览器访问网站的时候, 第一访问的时候需要加载资源 html css js 图片,向服务器请求资源 第一次之后访问可以利用缓存的功能从缓存中获取可以提高页面加载的速度,输入网址到页面加载减少网络请求的体积和数量可以加快页面性能 强制缓存 强制缓存的过程 浏览器向服务器发送请求服务器返回资源浏览器再次请求先判断max-age有没有过期,没有过期直接从缓存里拿资源 cache-control 通过cache-control 设置一个最大的有效时间 max-age=300 需要缓存就设置cache-control,不需要缓存就不设置cache-control ,cache-control的设置都是有服务器通过响应头设置过来的 协商缓存 是一种服务端的缓存策略 协商缓存的过程 浏览器向服务器发送请求服务器返回资源和资源标识浏览器再次请求发送亲鼓起和资源标识如果不是最新资源服务器返回200状态码、最新资源和新的资源标识,如果是最新资源服务器返回304状态码直接从缓存中拿资源 协商缓存的资源标识 Last-Modified :资源上一次修改的时间 后续访问的时候发送请求和资源标识的字段名为If-Modified-Since放在请求头里面 ETag: 资源对应的唯一字符串 后续访问的时候发送请求和资源标识的字段名为If-None-Match放在请求头里面 优先使用Etag Last-Modified的值只精确到秒级文件如果每隔一段时间都重复生成, 但内容相同, Last-Modified会每次返回资源文件, 即便是内容相同。但是ETag可以判断出文件内容相同就返回304, 使用缓存 总结 补充:DNS缓存 DNS缓存 了增加访问效率,计算机有域名缓存机制,当访问过某个网站并得到其IP后,会将其域名和IP缓存下来,下一次访问的时候,就不需要再请求域名服务器获取IP,直接使用缓存中的IP,提高了响应的速度。当然缓存是有有效时间的,当过了有效时间后,再次请求网站,还是需要先请求域名解析。 但是域名缓存机制也可能会带来麻烦。例如IP已变化了,仍然使用缓存中的IP来访问,将会访问失败。再如 同一个域名在内网和外网访问时所对应的IP是不同的,如在外网访问时通过外网IP映射到内网的IP。同一台电脑在外网环境下访问了此域名,再换到内网来访问此域名,在DNS缓存的作用下,也会去访问外网的IP,导致访问失败。根据情况,可以手动清除DNS缓存或者禁止DNS缓存机制。 在你的chrome浏览器中输入:chrome://dns/,你可以看到chrome浏览器的DNS缓存。系统缓存主要存在/etc/hosts(Linux系统)中

C++11之正则表达式(regex_match、regex_search、regex_replace)

在C++11中引入了正则表达式。 字符规则 先来了解一下这个字符的含义吧。 字符描述\转义字符$匹配字符行尾*匹配前面的子表达式任意多次+匹配前面的子表达式一次或多次?匹配前面的子表达式零次或一次{m}匹配确定的m次{m,}匹配至少m次{m,n}最少匹配m次,最大匹配n次 字符描述.匹配任意字符x|y匹配x或y[xyz]字符集合,匹配包含的任意一个字符[^xyz]匹配未包含的任意字符[a-z]字符范围,匹配指定范围内的任意字符[^a-z]匹配任何不在指定范围内的任意字符 头文件:#include regex_match 全文匹配,即要求整个字符串符合匹配规则,返回true或false 匹配“四个数字-一个或俩个数字” #include <iostream> #include <regex> using namespace std; int main() { string str; cin >> str; //\d 表示匹配数字 {4} 长度4个 \d{1,2}表示匹配数字长度为1-2 cout << regex_match(str, regex("\\d{4}-\\d{1,2}")); return 0; } 匹配邮箱 “大小写字母或数字@126/163.com” int main() { string str; cout << "请输入邮箱:" << endl; while (cin >> str)//匹配邮箱 { if (true == regex_match(str, regex("[a-zA-Z0-9]+@1(26|63)\\.com"))) { break; } cout << "输入错误,请重新输入:" << endl; } cout << "

int 整数相乘溢出的问题

一、问题描述 最近,开发团队的小伙伴儿,在做一个 int 整数相乘的逻辑的时候,出现了一个意想不到的结果,如下: long result = 25 * 24 * 60 * 60 * 1000; // 期望正确的结果是:2160000000 System.out.println("result : " + result); // 实际得出的结果是:-2134967296 我们期望的正确结果应该是 2160000000,怎么变成 -2134967296 了呢?! 二、出现的原因 其实问题出现的原因并不复杂,就是因为 int 整数在相乘的过程当中溢出了。 新的问题出现了,咋就溢出了呢? 我们知道 int 的取值范围是 -2147483648 ~ 2147483647,而期望的正确结果 2160000000 恰恰超出了 int 的最大值 2147483647,所以就溢出了。 三、错误姿势 那如何解决这个问题呢? 我第一个想法就是在最后一位添加 L(或小写 l),如下: long result = 25 * 24 * 60 * 60 * 1000L; // 期望正确的结果是:2160000000 System.out.println("result : " + result); // 实际得出的结果是:2160000000 如此说来,那是不是无论任何情况只要在最后一位添加 L(或小写 l),就能解决溢出问题了呢?

meson和pkg-config

最近再看simple-cam,它是用meson构建的。 有这样一句: deps = [ dependency('libevent-pthreads'), ] 执行编译时报错: meson.build:16:0: ERROR: Dependency "libevent_pthreads" not found, tried pkgconfig and cmake 但实际上libevent_pthreads我已经用apt安装过了,但是为什么还找不到? 原因是meson使用pkg-config来查找依赖项: Pkg-config is a way for shared libraries to declare the compiler flags needed to use them. 那么原因就是pkg-config没有找到libevent-pthread。 pkg-config是如何查找到各种library的?它通过一些.pc文件来查找。 首先,我们可以用pkg-config查看所有的安装包: pkg-config --list-all 然后,用下面代码查看pkg-config执行时搜索的文件: $ pkg-config --variable pc_path pkg-config /usr/local/lib/x86_64-linux-gnu/pkgconfig:/usr/local/lib/pkgconfig:/usr/local/share/pkgconfig:/usr/lib/x86_64-linux-gnu/pkgconfig:/usr/lib/pkgconfig:/usr/share/pkgconfig 在这些目录下添加自己编写的pc文件即可。 比如: prefix=/usr/local includedir=${prefix}/include libdir=${prefix}/lib/x86_64-linux-gnu Name: libcamera Description: Complex Camera Support Library Version: 0.0.0 Requires: libcamera-base Libs: -L${libdir} -lcamera Cflags: -I${includedir}/libcamera 其中,libdir是通过`dpkg -L`来看到的。我们看一下libevent_pthreads的情况:

SpringMVC的SseEmitter实时推送

SseEmitter简介:SpringMVC提供的一种技术,可以实现服务端向客户端实时推送数据的功能 用法:在Contorller中提供一个接口,返回SseEmitter对象,发送数据可以在另一个接口调用其send方法发送数据,SpringBoot已经集成这个功能 用法示例: @RestController public class SseEmitterTestController { private SseEmitter sseEmitter; /** * 步骤一:请求后浏览器会阻塞,直到close后结束阻塞 */ @RequestMapping("start") public SseEmitter start() { //默认是30s超时,设置为0L永不超时 sseEmitter=new SseEmitter(0L); //将这个对象返回 return sseEmitter; } /** * 步骤二:请求后会像浏览器发送数据,可以多次请求 */ @RequestMapping("send") public String send() { if (sseEmitter!=null){ try { sseEmitter.send(new Date()); return "send seccuss"; } catch (IOException e) { e.printStackTrace(); } } return "send fail"; } /** * 步骤三:请求后会结束对浏览器的阻塞,结束数据发送 */ @RequestMapping("close") public String close() { if (sseEmitter!=null){ sseEmitter.complete(); return "

哈希表的常用方法和示例:用于判断某元素是否存在于集合中

目录 哈希表/数组 (选择): 常用解法: Collection接口/list/set常用方法: Map常用方法: 元素遍历方式:3种 LeetCode示例: 哈希表/数组 (选择): 哈希表适用于快速判断某个、些元素是否存在在集合中,以空间换时间,记录各数据的出现次数 哈希表用于特别分散、跨度非常大的数据数组用于有数量限制,有数值范围的数据,eg:字母 常用解法: 剪枝法:寻找继续进行操作的界值,判断,当不满足该条件时,后续操作无意义,return滑动窗口法:当寻找满足某条件的固定长度(a)序列时,快指针先行a步,判断是否符合条件;然后快慢指针同行,形成滑动窗口,判断是否符合条件快慢双指针法:当存在循环或重复等状态时,快指针2步,慢指针1步,同时移动,如何二者相遇(即当前数据是都已存在),则存在重复/循环,否则两者相距越来越远,快指针会最先到达结束条件。相对双指针法:适用于有序数据,或者对数据进行排序后处理,避免重复操作和便于确定指针移动方向。(双指针法 的作用: 减低时间复杂度,降低一个量级 eg:O(n^2)-> O(n) ) Collection接口/list/set常用方法: 增:add(Object obj),addAll(Collection coll) 删:remove(Object obj), removeAll(Collection coll),clear()清空集合元素; 查:contains(Object obj),containsAll(Collection coll),retainsAll(Collection coll)求交集删: List 改:Object set(int index, Object ele) LIst 查:get(int index) List 插:add(int index, Object ele) equals(Object obj)元素是否相同,size()集合内元素数,hasCode()返回对象哈希值, 集合转化成数组: toArray() 数组转化集合: Arrays.asList(数组) Map常用方法: 添加:Object put(Object key,Object value) / void putAll(Map m) 添加所有 删除:Object remove(Object key) / clear():清空map数据,将map.size=0 != map=Null 修改:put(Object key,Object value)

x86电脑上下载debian的arm64的包

因为现场的网关使用了定向卡,公司的网关又忘记了IP地址,所以需要strace包的话,只剩下两条路了: 1. 下载源码,自己进行编译。到git上下载了源码,说是执行./bootstrap,然后调用configigure进行配置,再make。但是我电脑上bootstrap就失败了。折腾了一会儿,也没有明白。时间来不及,先搁置。 2. 到debian的网页上去下载现成的deb包进行安装。这一步倒是ok。好记性不如烂笔头,这里记录一下操作步骤,免得时间长了忘记: 1. 进入debian10的软件包下载页面, Debian -- Package Search Results -- buster 在右侧,输入想下载的软件包,然后架构选择,比如arm64,如下所示: 点击完后,点击完后,会显现debian哪些版本,有提供strace的包下载,比如有debian9(stretch),debian10(buster),我这里实际需要的是debian9的,因此点击strech,进入下一个页面 新的页面如下所示,还是会提供各个硬件架构的下载地址和文件清单,如下所示。 我需要arm64,因此点击arm64,进入下一个页面: 我们选择亚洲的下载地址,在亚洲的地址,优先选择中国的地址。也就是上面红框的地址。 另外,我的电脑直接点击ftp.cn.debian.org/debian,不会发生跳转,所以将链接拷贝到,到新的窗口,复制打开,就这样了: 接下来,进入pool/main/,然后根据strace的首字母s,找到strace的下载页面,如下: 接下来选择最新的版本,下载后进行安装即可 更新于2022/6/24号: 其实下载有更简单的办法,可以在虚拟机中进行。 比如我在x86,debian系统的虚拟中,需要下载arm版本的libwebsockets-dev。那么做如下事情就可以了: dpkg --add-architecture armhf ##指明软件安装目标机器的硬件架构 apt-get update ##更新 apt-cache search libwebsockets ##根据关键字查找安装包的完整名字 apt download -d libwebsockets-dev:armhf ##下载软件包