mysql 在 windows 下安装

需求 需要在 windows10 64bit 平台按照 mysql,记录安装过程。 解决 当前环境是企业版 windows, administrator 账户安装 mysql 8.0.34.0. 安装基本都是下一步,只有几个地方需要注意一下。 安装 setup type 选择 full type and networking 根据需要来选择。如果当前是开发机器,那就 development, 如果还需要跑其他软件的服务器,那就 server, 如果不跑其他,单纯是 mysql 服务器, 那就 dedicated. authentication 建议选择 legacy,便于和旧的客户端软件兼容。 accounts and roles 设置密码 apply configuration 这边可能在 starting the server 的时候会出错。具体解决方法见下一节。 connect to server 输入密码,进行验证。 installation complete 可以把安装后就启动的两个钩去掉。 问题 Failed to start service MySQL80: A task may only be disposed if it is in a completion state 右键 my computer -> manage -> services -> 右键 mysql80 -> properties -> log on 标签, 查看 this account 到底是哪个账户,我这里是 Network Service....

2023-10-01 · 1 min · 147 words · RamLife

二叉树介绍

需求 了解二叉树 解决 是什么 从根节点开始,小的向左边放,大的向右边放,一层一层放下去。满足左小右大原则。 没有子节点的是叶子 子节点的个数是度 从根到当前节点的为一路径上节点总数是深度 从当前节点到最远叶子路径上的节点总数是高度 用处 用于大数据量时的反复的搜索和插入。 有序链表: 查找成本大 O(N), 插入成本小 O(1) 有序数组: 查找成本小 O(1), 插入成本大 O(N) 排序二叉树: 比较折中,查找时类似于二分查找 O(logN), 插入成本也小 O(logN). 打印 层序遍历 public int[] levelOrder(TreeNode root) { int arr[]=new int[10000]; int index=0; Queue<TreeNode>queue=new ArrayDeque<>(); if(root!=null) queue.add(root); while (!queue.isEmpty()){ TreeNode node=queue.poll(); arr[index++]= node.val; if(node.left!=null) queue.add(node.left); if(node.right!=null) queue.add(node.right); } return Arrays.copyOf(arr,index); } 分层存储 public List<List<Integer>> levelOrder(TreeNode root) { List<List<Integer>>list=new ArrayList<List<Integer>>(); if(root==null)return list; Queue<TreeNode>q1=new ArrayDeque<TreeNode>(); q1.add(root); while (!...

2023-08-16 · 3 min · 565 words · RamLife

c/c++ 解决打印缓冲

需求 c/cpp 解决打印缓冲 解决 c++ 直接使用 endl 即可立即输出。 c 以下几种都可以。 增加 \n setbuf(stdout, NULL) fflush(stdout) 参考 QT QProcess 使用及实时输出回显

2023-08-09 · 1 min · 19 words · RamLife

QT qprocess 调用进程,输出到文件,实时输出

需求 使用 QProcess 调用 ping, 并输出结果到文件,或者实时输出显示。 解决 调用进程 std::shared_ptr<QProcess> process_ = nullptr; process_ = std::make_shared<QProcess>(this); process_->start("ping www.baidu.com"); if (process_ != nullptr) { //process_->close(); process_->kill(); process_->waitForFinished(); process_ = nullptr; } close() 可以直接关闭子进程 kill() 用于向子进程发送 SIGKILL, 然后通过 waitForFinished() 来等待子进程退出。 输出到文件 在 start() 之前: process_->setStandardOutputFile("out.txt"); 实时输出显示 在 start() 之前: process_->setReadChannel(QProcess::StandardOutput); connect(process_.get(), &QProcess::readyRead, [=](){ qDebug() << process_->readAllStandardOutput(); }); 记得使用 closeReadChannel() 来关闭读取通道。 参考 QT QProcess 重定向问题 QProcess开启外部程序,实时获取该程序的标准输出 QProcess快速实现外部程序调用 Qt开发之路34—QProcess重定向子进程的日志输出 QT: 使用QProcess启动进程并实时获取标准输出 Qt 之启动外部程序

2023-08-09 · 1 min · 68 words · RamLife

QT 信号槽和回调函数的区别

需求 信号槽和回调函数区别 解决 方便 信号和槽相对更加方便。 回调函数和接口在每次使用的时候,都需要额外判断函数指针是否为空。 当需要回调多个函数的时候,还需要管理多个函数指针。 当调用和被调用中间隔了几个类,回调就会很麻烦,需要把指针一路传递过去。 速度 回调函数和接口这样直接使用的明显会更加快速,信号和槽会慢一些。曾经出现一个问题,使用信号和槽在断开连接时只打印一次,使用回调函数会打印两次,经过调试发现,使用信号和槽在调试模式也会打印两次。初步判断是信号虽然触发了两次,但是因为时间过短,所以导致只执行了一次槽函数。 参考

2023-07-28 · 1 min · 11 words · RamLife

c++ 实现类似 java 的 interface

需求 cpp 实现类似 java 的 interface 解决 interface 关键字 因为 interface 所有声明默认都是 public=,所以选择 =struct. #define interface struct; #define implements public 使用 #include "Interface.h" Interface IBar { public: virtual ~IBar(){} virtual int getBarData() const = 0; virtual void setBarData(int nData) = 0; }; class Bar :public BasicBar,implements IBar { public: Bar(int x=0) : BasicBar(x) { } ~Bar(){} virtual int getBarData() const { std::cout <<"Get Bar!"; return 0; } virtual void setBarData(int nData) { } }; class DataAccess { // Construction & Destruction public: DataAccess() { } ~DataAccess() { } static IBar* createBar() { //返回对象给IBar接口 return(new Bar()); } }; int main(int argc, char *argv[]) { QCoreApplication a(argc, argv); //IBar *bar = new Bar(); IBar *bar = DataAccess::createBar(); bar->getBarData(); delete bar; return a....

2023-07-28 · 1 min · 143 words · RamLife

c++ 工厂设计模式

需求 cpp 工厂模式 解决 https://zhuanlan.zhihu.com/p/83535678 https://zhuanlan.zhihu.com/p/83537599 参考

2023-07-28 · 1 min · 7 words · RamLife

c++ impl 使用接口类

需求 cpp impl ? 解决 impl 使用接口类有两种方式: 接口类只是作为一个壳,需要什么都是直接调用原来的类来实现 接口类是使用虚函数,实现类通过继承来实现 代理类 代理类非常简单,下面这个 WeightProxy 就是壳,具体的实现都在 Weight 里面。 #ifndef WEIGHTPROXY_H #define WEIGHTPROXY_H #include <string> #include <memory> class Weight; class WeightProxy { public: WeightProxy(); ~WeightProxy(); std::string GetInfo(); std::unique_ptr<Weight> m_proxy; }; #endif // WEIGHTPROXY_H #include "Weightproxy.h" #include "Weight.h" WeightProxy::WeightProxy() : m_proxy(new Weight()) { } WeightProxy::~WeightProxy() = default; std::string WeightProxy::GetInfo() { return m_proxy->GetInfo(); } #include <iostream> // std::streambuf, std::cout #include "Weightproxy.h" int main () { WeightProxy w; std::cout << w....

2023-07-27 · 1 min · 207 words · RamLife

c++ impl 使用指针实现即 pimpl

需求 cpp impl 是什么? 解决 impl 解决的问题 依赖太多,包含头文件过多,一个头文件修改,一堆源文件都需要重新编译,导致的编译时间过长。 库文件,不喜欢在头文件中暴露太多的内部成员变量等信息给使用着。 简单 pimpl // 使用Pimpl // 在头文件person.hpp中 #include <memory> class Person { public: Person(); private: // Person类的实现细节放置在该前向声明的实现类中。 struct Impl; // 指向实现类Impl的私有指针 std::unique_ptr<Impl> pimpl_; }; // 在源文件person.cpp中 #include "person.hpp" #include "basic_info.hpp" #include <string> #include <memory> struct Person::Impl { std::string name; std::string id; BasicInfo basic_info; }; Person::Person() : pimpl_(std::make_unique<Impl>()) {} 具体的成员变量放到 cpp 文件中,编译为库后,有以下好处: 就算需要修改包含的成员变量,也不需要修改头文件,那么编译的时候,只会编译这个 cpp 文件,其他依赖这个头文件的都不需要重新编译。 使用者并不能从头文件中发现成员变量的细节。 pimpl 更多细节 pimpl 在使用的时候,还会碰到很多需要注意的地方: 析构函数的实现需要完整的类型 移动赋值需要完整类型 移动构造需要完整类型 拷贝构造和拷贝赋值都需要完整类型 所以上面这些都需要放在 cpp 中实现。...

2023-07-27 · 1 min · 158 words · RamLife

gitea release 时上传的附件大小限制

需求 gitea release 时,上传的二进制文件大小提示受限. gitea exceeds the maximum size of (4 MB). 解决 修改 gitea 配置文件,在 gitea/conf/app.ini 里面。在 [attachment] 这一项下面增加 MAX_SIZE 和 MAX_FILES. [attachment] PATH = /data/gitea/attachments MAX_SIZE = 128 MAX_FILES = 16 注意, [repository.upload] 下面也有 FILE_MAX_SIZE 和 MAX_FILES, 但是这两个设置之后,并不能解决问题。只有 [attachment] 下面的才是有效的。 参考 Configuration Cheat Sheet 1.19.4 Configuration Cheat Sheet 1.21-dev Increase repository release upload max files limit gitea上传大小限制

2023-07-24 · 1 min · 59 words · RamLife