Clay's Blog
  • 🔍 搜索
  • 🏡 主页
  • 📒 记录
  • 📛 标签
  • 📁 归档
  • 📖 关于
主页 » 📒 记录

📚 学习

Git仓库迁移

git clone --bare old/repo.git cd repo.git # if 有lfs的话 git lfs fetch --all git lfs push --all new/repo.git # endif git push --mirror new/repo.git 上边这种方式比较简单和快捷,首先使用--bare的方式直接克隆旧服务器上的仓库到本地,这种方式的克隆没有本地工作区的参与。然后使用--mirror的方式推送到新的服务器上就行,推送前,服务器上要先建立出空的仓库。 还有一种就是常规的方式: ...

2024-09-19    200字    Clay    Git

Anaconda的平替 - Miniforge

Anaconda在2020年的一次公告中宣布,对于团队用户,他们将开始收费。 团队人数少于200人,可以继续免费使用。 收费的范围是Anaconda团队提供的default通道中的软件包。 如果我继续使用Anaconda发行版软件,但是不用Anaconda的下载通道,要不要付费呢? 没有实践,直接卸载吧还是。 ...

2024-08-21    697字    Clay   

任务管线框架 - Luigi

简述 Luigi基于Python,可以快速搭建数据处理的任务管线。 在一定程度上支持分布式处理。 开始一个任务 使用luigi启动一个任务,有两种方法: 通过luigi命令行执行 类似 luigi --module main MyTaskAll --id 1 --local-scheduler,这里main是我的.py文件名(为了可以找到整个main.py,执行前需要把main.py所在路径加到PythonPath里边),MyTaskAll是main.py中我定义的Task类名,--id 1是传给MyTaskAll任务的具体参数。--local-scheduler是配置调度器,这个后边会说。 ...

2024-08-17    1895字    Clay   

C++选手如何快速入门Python?

1. 实际是静态语言vs动态语言 之前,一直使用C/C++做开发,最近开始尝试使用Python做一些小的工具,顺便学习一下。 包括在学生阶段,我也喜欢C/C++,有更强的控制感,程序的每一步,我都要尽可能的掌握,清楚它到底在做什么。也偶尔用过几次Java做些事情。总而言之,这都属于“静态语言”。与之相对的是“动态语言”,典型代表就是Python。 ...

2024-07-11    1989字    Clay    C++  Python

Git恢复已删除的分支

最近在开发中,需要恢复git中已经删除的分支。 情况是这样,有两个开发分支,dev_1和dev_2,之所以维护两个,是因为需求存在分叉。 最近在dev_1上出现了bug,所以,我开了一个fix分支出来进行修复,修复完毕后,merge回dev_1上了,接着就把这个fix分支删除了。但是,这些改动仍然需要fix到dev_2上,此时,办法不唯一。 ...

2024-07-10    606字    Clay    Git

使用Google Indexing API快速收录

Google indexing api是谷歌提供的针对搜索引擎索引功能的接口,相比于在Google search console上提交sitemap,API收录速度要快得多。刚开始的时候,我在GSC上提交了sitemap,后来一段时间,就不抓取了,也不收录,不清楚什么原因。后来使用api直接提交,第二天就可以索引到了。 操作步骤参考官方文档: https://developers.google.com/search/apis/indexing-api/v3/quickstart ...

2024-07-05    529字    Clay   

H264、H265码流中的SEI NALU

H264码流 H264协议中将编码器分成两个逻辑层,就是经常见到的VCL(视频数据编码层)和NAL(网络抽象层)。VCL负责具体图像数据的编码,NAL负责组织这些编码后的数据。 既然称之为码流,那么,这些数据肯定像流一样,一位接着一位的排成一队。组织这些编码数据的方式,常见的是Annex B格式和AVCC格式,感觉Annex B格式最为常见,它长这样: ...

2024-05-23    2324字    Clay    音视频

C++学习记录(15) 条件变量与互斥锁

0. C++ 中的锁 两种最常用的:互斥锁、条件锁,此外还有自旋锁 1. C++ 中的条件变量 2. 生产者消费者模型 引出虚假唤醒的问题 3. 虚假唤醒 有多个线程在wait同一个条件变量时,当条件变量发出notify_one的时候,各个线程去竞争锁,此时,只能有一个线程得到锁,但是,其他线程在收到notify_one信号时,线程已经从wait队列换到锁竞争的队列了(不再等待notify的通知了,而是等待其他线程解除对锁的占用),一旦某个线程拿到锁了,就会立刻向下执行代码,但此时,条件可能已经变了,不是预期的条件了。 ...

2022-11-18    433字    Clay    C++

QT中线程启动方式和操作的注意问题

0. QT中线程启动的方式 0.1 继承QThread 继承QThread时,子类必须重写run方法,保证线程在手动结束之前持续运行。 当子类使用start方法启动后,run方法会在生命周期内循环执行。 .h文件 #ifndef CLASS1_H #define CLASS1_H #include <QObject> #include <QThread> // 继承QTQThread class Class1 : public QThread { Q_OBJECT public: explicit Class1(QThread *parent = 0); ~Class1(); void run() override; public slots: void testFunc(); }; #endif // CLASS1_H .cpp文件 #include "class1.h" #include <QDebug> Class1::Class1(QThread *parent) : QThread(parent) { } Class1::~Class1() { } void Class1::run() { qDebug() << "class 1 run threadID : " << currentThreadId(); while(1){ // 测试代码,写成了死循环,实际中应该避免这样写 msleep(5); } } void Class1::testFunc() { qDebug() << "class1 testFunc threadID : " << currentThreadId(); } 0.2 使用moveToThread启动 这种方式较为简单,正常写自己的类即可,为了保证其方法可以在线程上执行,需要继承QObject类。 在使用时首先生成子类对象,同时new一个QThread出来,然后使用子类的moveToThread方法,将子类放到刚刚new出来的QThread上,再启动该线程即可。 ...

2022-11-15    2117字    Clay   

Python3.6环境使用ERS超像素分割算法

0. ERS算法 xxx 1. 问题 原本ERS算法的作者提供了python接口,但是是基于Python2的,在python3.6中调用的话,会出现缺失DLL的错误,如下图: 2. 解决方案 作者提供了ERS算法的C语言源代码,所以基于Python3.6重新编译一下即可。 2.1 安装vs 我安装的是VS2017社区版。 ...

2022-05-04    479字    Clay   

算术表达式计算方法

0. 表达式树 在一颗树中,叶子节点都是操作数,所有的非叶子节点都是运算符,这样的树叫做表达式树。 如图: 1. 后缀表达式计算 后缀表达式:也叫逆波兰表达式,是表达式树的后序遍历。 在计算时,不用还原出整棵树,可用一个栈来辅助计算。 leetcode 150. 逆波兰表达式求值 class Solution { public: int evalRPN(vector<string>& tokens) { int st[10005]; int tt = 0; for( auto &x : tokens){ if(x == "+" || x == "-" || x == "*" || x == "/") { int b = st[tt--]; int a = st[tt--]; if(x == "+") st[++tt] = a + b; else if(x == "-") st[++tt] = a - b; else if(x == "*") st[++tt] = a * b; else st[++tt] = a / b; } else st[++tt] = stoi(x); } return st[tt]; } }; 2. 中缀表达式计算 法1: 转成后缀表达式计算。 法2: 直接利用表达式树计算结果 需要两个栈:数字栈 和 符号栈 ...

2022-05-02    572字    Clay   

Cityscapes DataSet 数据集

0. 数据集概述 Cityscapes 数据集专注于对城市街景的语义理解。 1. 特点 多边形的标签 实例分割车辆和人 30个类别 5000张精细标注的图 20000张粗略标注的图 leftImg8bit_trainvaltest.zip (11GB) left 8-bit images - train, val, and test sets (5000 images) https://www.cityscapes-dataset.com/file-handling/?packageID=3 rightImg8bit_trainvaltest.zip (11GB) right 8-bit images - train, val, and test sets (5000 images) https://www.cityscapes-dataset.com/file-handling/?packageID=5 disparity_trainvaltest.zip (3.5GB) precomputed depth maps using SGM for train, val, and test sets (5000 images) https://www.cityscapes-dataset.com/file-handling/?packageID=7 camera_trainvaltest.zip (2MB) [md5] intrinsic and extrinsic camera parameters for train, val, and test sets https://www.cityscapes-dataset.com/file-handling/?packageID=8 脚本安装 1. 使用github安装 https://github.com/mcordts/cityscapesScripts 从github上下载官方提供的脚本代码。 然后把下载的数据集数据也放进来,和setup.py放在同级目录下。例如下图(图中的only_person文件夹是本人自建的,官方提供的没有) ...

2022-04-28    430字    Clay   

C++学习记录(14) 构造函数与析构函数

1. 编译器默认添加的函数 自写类的时候,如果没有显式的写出来构造函数、析构函数、拷贝构造函数、拷贝赋值函数。如果程序中这些函数被需要(被调用),编译器就会默认的创建这些函数。 默认的构造函数和析构函数都是空实现的。 默认的拷贝构造函数和拷贝赋值函数都是浅拷贝。 如果有自己写的一个或者多个构造函数(不管有无参数),那么编译器都不会再添加默认的构造函数。 ...

2022-04-26    843字    Clay    C++

常见排序算法及稳定性

1. 代码 /* * @Brief: 常见排序算法汇总 * @Author: * @Date: 2021-07-01 */ #include <iostream> #include <algorithm> #include <vector> #include <queue> using namespace std; void printArray(int *a, int len){ for(int i = 0; i < len; i++) cout << a[i] << " "; cout << endl << endl; } void bubbleSort(int *a, int len){ for(int i = 0; i < len - 1; i++){ for(int j = 0; j < len - i; j++){ if(a[j] > a[j+1]) swap(a[j], a[j+1]); } } } void selectSort(int *a, int len){ for(int i = 0; i < len; i++){ int mi = i; for(int j = i; j < len; j++){ if(a[j] < a[mi]) mi = j; } if(i != mi) swap(a[i], a[mi]); } } void insertionSort(int *a, int len){ for(int i = 0; i < len; i++){ int key = a[i]; int j = i; while(j >= 1 && a[j - 1] > key) a[j] = a[j-1], j--; a[j] = key; } } void shellSort(int *a, int len){ // cout << "原始数组" << endl; // printArray(a, len); for(int d = len / 2; d >= 1; d /= 2){ // 插入排序 for(int i = 0; i < len; i += d){ int key = a[i]; int j = i; while(j >= d && a[j-d] > key) a[j] = a[j-d], j -= d; a[j] = key; } // cout << "d = " << d << " 排序结果" << endl; // printArray(a, len); } } void quickSort(int *a, int len, int l, int r){ if(l >= r) return ; int x = a[l + (r - l) / 2]; int i = l - 1, j = r + 1; while(i < j){ while(a[++i] < x); while(a[--j] > x); if(i < j) swap(a[i], a[j]); } quickSort(a, len, l, j); quickSort(a, len, j + 1, r); } void mergeSort(int *a, int len, int l, int r){ if(l >= r) return ; int mid = l + (r - l) / 2; mergeSort(a, len, l, mid); mergeSort(a, len, mid + 1, r); int i = l, j = mid + 1, k = 0; int *tmp = new int[r - l + 1]; while(i <= mid && j <= r){ if(a[i] < a[j]) tmp[k++] = a[i++]; else tmp[k++] = a[j++]; } // 处理尾巴 while(i <= mid) tmp[k++] = a[i++]; while(j <= r) tmp[k++] = a[j++]; // 复制回原数组中 for(i = l, k = 0; i <= r; i++, k++) a[i] = tmp[k]; delete tmp; // 回收内存 } // 堆排序 namespace heapSort{ int *heap = nullptr; int ss = 0; // 堆的现有节点数 从下标是1的节点开始存 int n = 0; // 数组长度 void down(int u){ // 小顶堆 int t = u; if(u * 2 <= ss && heap[u * 2] < heap[t]) t = u * 2; if(u * 2 + 1 <= ss && heap[u * 2 + 1] < heap[t]) t = u * 2 + 1; if(t != u){ swap(heap[t], heap[u]); down(t); } } void heapSort(int *a, int len){ heap = new int[len + 5]; n = len; for(int i = 0; i < len; i++) heap[++ss] = a[i]; for(int i = n / 2; i ; i--) down(i); for(int i = 0; i < len; i++){ a[i] = heap[1]; heap[1] = heap[ss--]; down(1); } delete heap; } }; int main(){ int a[10] = {8, 4, 2, 5, 7, 3, 1, 9, 0, 6}; int len = 10; //bubbleSort(a, len); //selectSort(a, len); //insertionSort(a, len); //quickSort(a, len, 0, len - 1); //mergeSort(a, len, 0, len - 1); //shellSort(a, len); //heapSort::heapSort(a, len); printArray(a, len); return 0; } 2. 稳定性 稳定排序算法:如果两数相等的话,排序以后先后位置是否会改变,如果不改变,就是稳定的。 ...

2021-12-20    1023字    Clay    数据结构与算法

2C4T与4C4T在计算密集型任务下的效率对比

1. 环境 机器1:Intel(R) Core(TM) i5-4200H CPU @ 2.80GHz,双核四线程,win10 x64,16G内存 机器2:Intel(R) Core(TM) i3-9100T CPU @ 3.10GHz,四核四线程。wn10 x64,8G内存 目的:大概测试一下2C4T与4C4T在计算密集型任务下的效率提升对比,内存大小、频率暂且忽略。 方法:使用openMP控制计算任务中的线程使用数量,测试12层for循环所消耗的时间(12是1、2、3、4的公倍数,防止openMP分配任务不均)。实际是测120层的耗时,再除以10。 ...

2021-10-03    624字    Clay   
下一篇  »
© 2024 Clay's Blog Powered by Hugo & PaperMod