<?xml version="1.0" encoding="utf-8" ?><rss version="2.0"><channel><title><![CDATA[zsiming的博客]]></title><description><![CDATA[]]></description><link>https://blog.youkuaiyun.com/zsiming</link><language>zh-cn</language><generator>https://blog.youkuaiyun.com/</generator><copyright><![CDATA[Copyright &copy; zsiming]]></copyright><item><title><![CDATA[解决Xcode中文代码乱码的问题]]></title><link>https://blog.youkuaiyun.com/zsiming/article/details/128853948</link><guid>https://blog.youkuaiyun.com/zsiming/article/details/128853948</guid><author>zsiming</author><pubDate>Thu, 02 Feb 2023 17:19:28 +0800</pubDate><description><![CDATA[在网上搜索的资料基本都是批量打开后再进行保存，在代码文件量比较多的情况下这种方式的效率不高。因此还是需要选择编辑器自带的方式来统一修改打开文件时候的编码方式。最后选择根据实际情况选择convert或者reinterpret即可。]]></description><category></category></item><item><title><![CDATA[Git学习：工作流学习实践]]></title><link>https://blog.youkuaiyun.com/zsiming/article/details/128590979</link><guid>https://blog.youkuaiyun.com/zsiming/article/details/128590979</guid><author>zsiming</author><pubDate>Sat, 07 Jan 2023 15:45:52 +0800</pubDate><description><![CDATA[在实践的项目开发过程中，会使用Git或者类似的版本控制工具来管理代码。下面介绍基于Git工具在实际项目开发过程中的使用流程。如上图所示显示了项目开发的一个简化流程。在开发一个新需求/版本的时候，一般会从主分支main中拉出一个新的dev分支来进行开发。等开发全部完成之后再进行合并进main中。在实际工作中我们个人会在dev的基础上再创建一个新的分支进行开发。如果代码经过评审（code review， CR）没有问题的话就可以由项目负责人合并进入dev分支。基于此，下面模拟一下实际的开发流程。]]></description><category></category></item><item><title><![CDATA[Git学习：各阶段回退方法]]></title><link>https://blog.youkuaiyun.com/zsiming/article/details/128468726</link><guid>https://blog.youkuaiyun.com/zsiming/article/details/128468726</guid><author>zsiming</author><pubDate>Wed, 28 Dec 2022 15:47:33 +0800</pubDate><description><![CDATA[在把一份代码完成之后发送到 “远程仓库”，可能中间还经历了不同的 “提交阶段”。回退本地版本，然后把旧的版本重新push上去。然而，此时的问题就是此时本地的版本落后于远程的版本。这里指的是文件没有经过任何提交，仅仅只是保存。一种补救的方法就是修改错误的版本，push一个新的上去就行。查看本次提交之前的版本，并记住想要回退的版本的id。指令将暂存区的文件回退到修改之前的状态。在Git中，一份代码可能处于不同的提交阶段。指令将暂存区的文件回退到修改之前的状态。一份新修改（或者创建的）文件处于 –]]></description><category></category></item><item><title><![CDATA[论文写作：word连续交叉引用]]></title><link>https://blog.youkuaiyun.com/zsiming/article/details/127924013</link><guid>https://blog.youkuaiyun.com/zsiming/article/details/127924013</guid><author>zsiming</author><pubDate>Fri, 18 Nov 2022 16:02:12 +0800</pubDate><description><![CDATA[在写作得时候，使用word的 “交叉引用”功能可以形成超链接格式的标号。但是交叉引用每次只能选择一篇论文，在连续选择多篇论文的时候，就是 “[1][2][3]” 而不是 “[1-3]” 这样的格式。]]></description><category></category></item><item><title><![CDATA[虚拟机的三种可选模式：桥接模式、NAT模式、主机模式浅析]]></title><link>https://blog.youkuaiyun.com/zsiming/article/details/127872349</link><guid>https://blog.youkuaiyun.com/zsiming/article/details/127872349</guid><author>zsiming</author><pubDate>Tue, 15 Nov 2022 20:39:19 +0800</pubDate><description><![CDATA[在配置虚拟机的时候，往往有三种可供选择的网络模式：桥接模式、NAT模式、主机模式浅析。查阅了有关的资料，在下面对这三种模式做一下区分。]]></description><category></category></item><item><title><![CDATA[Matlab 统计不同元素个数]]></title><link>https://blog.youkuaiyun.com/zsiming/article/details/127137461</link><guid>https://blog.youkuaiyun.com/zsiming/article/details/127137461</guid><author>zsiming</author><pubDate>Sat, 01 Oct 2022 21:20:20 +0800</pubDate><description><![CDATA[假设我手里有个数据集，每个类别的个数是不一样的。现在我想把数据整理成每个类别的个数都是相等的，应该怎么处理？]]></description><category></category></item><item><title><![CDATA[TCP和UDP在socket编程上的差异（总结）]]></title><link>https://blog.youkuaiyun.com/zsiming/article/details/127082046</link><guid>https://blog.youkuaiyun.com/zsiming/article/details/127082046</guid><author>zsiming</author><pubDate>Wed, 28 Sep 2022 08:56:44 +0800</pubDate><description><![CDATA[UDP不需要监听（listen函数）UDP不需要创建连接（accept函数）UDP获取接收方的信息（IP、端口）是在recvfrom函数，而TCP是在accept函数。UDP不需要创建连接（connect函数）收发消息使用的函数不同。]]></description><category></category></item><item><title><![CDATA[variable ‘XXX cannot be implicitly captured in a lambda with no capture-default specified]]></title><link>https://blog.youkuaiyun.com/zsiming/article/details/127037087</link><guid>https://blog.youkuaiyun.com/zsiming/article/details/127037087</guid><author>zsiming</author><pubDate>Sun, 25 Sep 2022 13:48:14 +0800</pubDate><description><![CDATA[原因是函数也是一个对象，需要进行捕获。上面的匿名函数isValid没有捕获另一个匿名函数isAlpha，因此报错，只需要在isValid的捕获列表中该为[=] 或者 [&]即可。今天在日常刷题的时候，使用了lambda函数。]]></description><category></category></item><item><title><![CDATA[C++ STL迭代器失效问题]]></title><link>https://blog.youkuaiyun.com/zsiming/article/details/126879980</link><guid>https://blog.youkuaiyun.com/zsiming/article/details/126879980</guid><author>zsiming</author><pubDate>Thu, 15 Sep 2022 22:06:15 +0800</pubDate><description><![CDATA[在STL里面的容器往往封装了迭代器。迭代器能让人很方便的拿到容器里面的元素进行操作。然而，在不同结构的容器中，删除一个迭代器可能会引发迭代器失效的问题。下面针对不同的容器类型做一下总结。]]></description><category></category></item><item><title><![CDATA[未确定数组个数、大小的ACM模式输入输出（C++）]]></title><link>https://blog.youkuaiyun.com/zsiming/article/details/126824768</link><guid>https://blog.youkuaiyun.com/zsiming/article/details/126824768</guid><author>zsiming</author><pubDate>Mon, 12 Sep 2022 23:48:33 +0800</pubDate><description><![CDATA[最近在面试笔试的时候，极大多数笔试都是输入输出的模式。对于确定了数组或者字符串个数的输入，读取比较简单，在这里不再赘述。]]></description><category></category></item><item><title><![CDATA[设计模式：观察者模式（C++实现）]]></title><link>https://blog.youkuaiyun.com/zsiming/article/details/126823792</link><guid>https://blog.youkuaiyun.com/zsiming/article/details/126823792</guid><author>zsiming</author><pubDate>Mon, 12 Sep 2022 22:16:31 +0800</pubDate><description><![CDATA[观察者模式模式又称为发布-订阅模式。订阅消息的一方称为观察者，而发布消息的一般称为主题类。观察者在一开始的时候会向主题类注册自己感兴趣的事件，当主题类发布了一个特定事件的时候，观察者就会收到主题类的通知，从而完成状态变化。]]></description><category></category></item><item><title><![CDATA[动态开点线段树（C++实现）]]></title><link>https://blog.youkuaiyun.com/zsiming/article/details/126799018</link><guid>https://blog.youkuaiyun.com/zsiming/article/details/126799018</guid><author>zsiming</author><pubDate>Sat, 10 Sep 2022 21:02:50 +0800</pubDate><description><![CDATA[所谓懒标记，就是把本区间一些增加的量给保留下来，等到需要用到左右结点的时候，才把这些增加的量分给左右孩子，让它们去更新自己区间的值。首先，当需改修改的区间包含了当前的区间，那么我们更新了当前结点的值，然后马上返回了。很明显，这道题就是在制定某个形成区间前，查一下这个区间是不是有安排了（有的话这个区间的和大于1，没有的话等于0，每次制定一个行程区间都是为这个区间的所有元素+1）。每个结点都是维护了一个区间的性质（在上图里面表示一个区间的和），区间的最小长度为1，也就是这个区间有且仅有一个元素。]]></description><category></category></item><item><title><![CDATA[shared_ptr的线程安全性探讨]]></title><link>https://blog.youkuaiyun.com/zsiming/article/details/126786603</link><guid>https://blog.youkuaiyun.com/zsiming/article/details/126786603</guid><author>zsiming</author><pubDate>Fri, 09 Sep 2022 18:46:35 +0800</pubDate><description><![CDATA[在 一文详解C++11的三种智能指针中，我们详细探讨了C++11中提供的三种智能指针的应用场景以及shared_ptr的实现。今天需要探讨的是：shared_ptr的安全性。先上结论：不安全，需要加锁。
]]></description><category></category></item><item><title><![CDATA[设计模式：饿汉式和懒汉式单例模式（C++实现）以及日志系统的实现]]></title><link>https://blog.youkuaiyun.com/zsiming/article/details/126782954</link><guid>https://blog.youkuaiyun.com/zsiming/article/details/126782954</guid><author>zsiming</author><pubDate>Fri, 09 Sep 2022 16:03:30 +0800</pubDate><description><![CDATA[在一个项目的日志系统里面，我们常常会发现日志模块的实现是使用单例模式。单例模式的特点和它的名字一样，就是一个类能且只能实例化出一个唯一的对象。那么这样做有什么好处呢？]]></description><category></category></item><item><title><![CDATA[epoll比select和poll究竟高效在哪儿（剖析及实现）]]></title><link>https://blog.youkuaiyun.com/zsiming/article/details/126764918</link><guid>https://blog.youkuaiyun.com/zsiming/article/details/126764918</guid><author>zsiming</author><pubDate>Thu, 08 Sep 2022 15:31:03 +0800</pubDate><description><![CDATA[来说，它在文件描述符使用epoll_ctl加入事件表的时候，就设置了改文件描述符在发生就绪事件时的回调函数。所以，在用户使用的时候，可以直接拿到就绪的文件描述符和对应发生的事件，而不需要轮询，因此效率比较高。这个事件表是使用红黑树这个数据结构进行管理的，因此，有了这个红黑树，就可以不用像select或者poll一样，把一个数组从用户态拷贝到内核态，而是使用epoll_ctl进行管理就行了。的时候，不需要重复传入用户监听的文件描述符，省去了大量的文件描述符的复制开销。然后在事件实际发生的时候，只会修改。]]></description><category></category></item><item><title><![CDATA[LRU算法学习笔记：实现以及应用]]></title><link>https://blog.youkuaiyun.com/zsiming/article/details/126749276</link><guid>https://blog.youkuaiyun.com/zsiming/article/details/126749276</guid><author>zsiming</author><pubDate>Wed, 07 Sep 2022 22:24:40 +0800</pubDate><description><![CDATA[所谓LRU（Least Recently Used）就是最近最少使用算法。其核心的思想就是根据每个节点的最后一次访问事件来对每个结点进行排序。最近一次使用的排在队头，依次类推。]]></description><category></category></item><item><title><![CDATA[解决：Linux下C++段错误不产生core文件]]></title><link>https://blog.youkuaiyun.com/zsiming/article/details/126734822</link><guid>https://blog.youkuaiyun.com/zsiming/article/details/126734822</guid><author>zsiming</author><pubDate>Wed, 07 Sep 2022 14:09:27 +0800</pubDate><description><![CDATA[在已经使用打开了core文件的基础上，运行程序产生了段错误。使用ls命令查看当前目录下的文件，还是没看见任何和.core相关的文件。如下：ulimit -cunlimited发现结果被|]]></description><category></category></item><item><title><![CDATA[Linux下排除死锁详细教程（基于C++11、GDB）]]></title><link>https://blog.youkuaiyun.com/zsiming/article/details/126695393</link><guid>https://blog.youkuaiyun.com/zsiming/article/details/126695393</guid><author>zsiming</author><pubDate>Mon, 05 Sep 2022 14:15:26 +0800</pubDate><description><![CDATA[在实际编写项目的过程中，经常涉及到多线程。多线程的程序编程很大概率会涉及到线程安全的问题，因此往往使用互斥锁来保证线程安全。然而，互斥锁的使用却经常会导致另外一个问题：死锁。所谓死锁，通俗的讲就是有两个共享资源，一个在你手上，一个在我手上。我等着你用完把另一个给我，你等我用完给你，这样相互等待就形成了死锁。所以，在这里，基于Linux的环境，使用C++11提供的多线程编程来模拟死锁，并尝试从“不知情”的角度，使用进行死锁的排查。]]></description><category></category></item><item><title><![CDATA[设计模式：装饰器模式（C++实现）]]></title><link>https://blog.youkuaiyun.com/zsiming/article/details/126691843</link><guid>https://blog.youkuaiyun.com/zsiming/article/details/126691843</guid><author>zsiming</author><pubDate>Sun, 04 Sep 2022 19:44:09 +0800</pubDate><description><![CDATA[首先先上结论：装饰器模式的设计场景是为已有的类增加新的功能。有人可能会觉得有些奇怪：增加新的功能可以通过继承的方式进行实现。例如，我通过public继承把父类的东西全部继承过来，接口也全部继承过来，然后在子类的基础上增加新的接口不就行了？其实理论上确实是可以的，但是这种方式通过继承+增加功能（接口）的方式在某些情况下可能会存在冗余，而装饰器的设计模式可以减少这种冗余。例如，假设现在有两个个汽车的厂家：BWM、Benz。]]></description><category></category></item><item><title><![CDATA[设计模式：适配器模式（C++实现）]]></title><link>https://blog.youkuaiyun.com/zsiming/article/details/126690360</link><guid>https://blog.youkuaiyun.com/zsiming/article/details/126690360</guid><author>zsiming</author><pubDate>Sun, 04 Sep 2022 16:12:08 +0800</pubDate><description><![CDATA[那么这时候就需要一个转换器（适配器）来作为中间的桥梁，来将HDMI的信号转换为老的信号，从而被显示器接收工作。比如我们电脑连接投影仪（或者显示屏）的时候，老一点的电脑接口经常是VGA的，而新一点的可以是HDMI的或者TypeC的。这里的 Computer01 是第一代的电脑，比较老，只能输出VGA的信号，而投影仪只能接受一个VGA的老对象，这样工作是没问题的。这个老的一般指的是“接口传入的对象是老的”。VGAToHDMIAdaptor虽然是一个“旧对象”，但是它的构造函数可以接受一个新的对象。]]></description><category></category></item></channel></rss>