大二寒假学习记录

现在是2020年2月1日17:32:50 寒假过半? 目前还不知道寒假什么时候开学. 为了自己能够前往心目中的公司, 学习是必不可少的.
学习的同时 应该要注意总结, 防止一天或者一周下来白忙活
我们寒假开始是一月九号 到我开始寒假学习的一月二十三号 这些天没有学习用来玩了, 好在后面拾了回来
从二十三号到现在二月一号, 每天学习的长度和质量总算是在慢慢上升
距离下一个寒假只剩下一年的时间了, 需要更加的努力, 为了大三暑假能够进入心中的公司 大三寒假的实习必不可少了. 加倍努力吧

这篇博客的标题起初是大二寒假学习记录后来改成了大二寒假及下学期学习记录寒假的学习必不可少, 下学期更要抓紧时间了.

二月

一日2020年2月1日17:39:59

前几天把博客从我自己的服务器迁移到了coding上, 方便以后我乱搞服务器, 现在服务器上没有重要的内容了
至于实际的学习方面, 我开始整理我的博客主要是这篇这篇现在算告一段落了, 主要是把自己以前学过的用一用. 空洞的写下api
理解不是很深刻.这两天修改的这一篇. 第二篇自己缺少的东西很多, 由于当时学习到了后面实在是学不下去了.
所以现在把后面的部分重新写了一下. 高级部分的线程和进程的部分 实在是太走马观花. 等我顺序学到了 再多写一些例子

今天的话, 练习了下poll系统调用, 写了一个poll的demo, 然后是整理了下信号的部分, 信号这里整理的依然很少 平时用到的不多, 需要多加使用
主要是定时器这里了 定时器把原来的内容删掉了 从新写目前只写完了socket定时

接下来打算还是多写一些项目 多思考一些 等我整理完了高级部分 就准备去看开源项目?每次看开源项目都感觉自己差的太多, 不知道从哪里看起
所以搭配着别人的笔记学习下看源码. 当然看源码之前还是要会大概的使用. 高级部分自然包括了libevent的使用部分

跑去写项目了

二日2020年2月2日18:03:23

罪过罪过, 昨天晚上十一点半 玩了一把军团TD 结果玩到了十二点半 ….. 最后一点半才睡觉
今天早上小十一点才起床.
我依稀记得我八点被闹钟叫起来emm 然后想着定八点半的闹钟 再睡一会, 结果闹钟没定我就睡着了.

起来后整理了整理吃了午饭, 就下午小一点了, 打开高级部分 学习信号SIGALRM定时

代码量就400行 一直到我写今天的博客 才算完工

先写一下遇到的一个问题吧
首先表现出来的是超时后 服务器没有断开连接
然后我去打断点, 发现不是定时器链表部分的问题. 是定时信号没有触发epoll_wait.
这里我看了下代码, 发现定时器没有启动加上了alarm(5), 我本意是理解了书上的代码 再去自己写, 结果还是理解的不深刻, 竟然丢了启动定时器的函数.
然后我又运行了下发现还是没有运行到
然后发现epoll_wait 返回-1 设置EINTR, 后来查阅了下说是被信号处理器中断, 思考可能是与IDE下断点有关??????
最后发现自己没有把信号的管道添加到epollfd中再一细看发现丢了关于信号管道的四行代码…

这个问题应该是很容易排查. 事后感觉应该这样思考

以后尽量总结正确的思考模式, 虽然不知道有没有用 但要试一试.

项目收获方面
虽然这个项目只有400多行代码, 但我自己是绝对写不出来的. 只能尽量总结书上代码的好处

  1. 首先肯定是使用alarm超时产生信号SIGALRM来触发回调函数 实现定时
  2. 信号回调函数, 没有直接去触发定时器tick函数, 而是通过一个管道传到了epollfd中, 然后从epollfd的函数中触发相关的if 再去调用tick函数
    void timer_handler() //真正的生效部分
    {
    timer_lst.tick();
    alarm(TIMESLOT);
    }
    void sig_handler(int sig)
    {
    int save_errno = errno;
    int msg = sig;
    send(pipefd[1], (char*)&msg, 1, 0); // pipefd[0]注册进了epoll中 接受到来的信号
    errno = save_errno;
    }

    void addsig(int sig)// 信号添加
    {
    struct sigaction sa{};
    sa.sa_flags |= SA_RESTART;
    sa.sa_handler = sig_handler;
    sigfillset(&sa.sa_mask);
    exit_if(sigaction(sig, &sa, nullptr) == -1, "add sig error");
    }

    char signals[1024]; // 信号接收, 可能存在多个信号 所以用返回的字节数来逐个取出信号
    ret = recv(sockfd, signals, sizeof(signals), 0); 取出后使用switch来分离信号
  3. 将大部分常量 #define
    大概只能总结出这一些来了, 完整的代码我贴在github上吧

五日 2020年2月6日09:16:23

三和四号 基本都在玩FF14, 发现自己并不是玩游戏了, 感觉被FF14玩了, 就是那种感觉累了不想玩了, 但却离自己定的小目标远 然后坚持
emm 其实感觉这个时候应该下游戏.
想想自己这大学一年半玩过的游戏 血族我算是玩的时间最长的大概前前后后我玩了五年, 应该是上半年把 我弃坑了. 游戏后面太氪了, 不得不退游了.
后面崩三啥的也玩过, 发现自己并不适合肝的游戏. 最近一个月入坑了fgo, 开始的几个星期还是玩的累了, 自己太肝了, 最近这几天感觉休闲了不少,
心态也正常了, 所以暂且会玩一玩.

主要还是后面这些吧, 我发现自己逐渐有了一个念头: 累了就去玩会游戏, 就去看会直播, 刷刷B站. 后来我感觉这些浪费时间就去搜索了一下
玩游戏算浪费时间吗, 刚才去找了下. 没找到我之前看过的那篇. 结论就是为什么自己不是累了就去小睡一下, 或者看看书,再或者刷刷新的科技圈
长长见识? 自己尝试了看书, 发现自己并不是太抗拒. 以后试试把.

最后自己作为一个想开发游戏的人, 总感觉不玩游戏是不合适的, 但要玩的适度, 毕竟自己还有一年的时间就要找寒假实习, 为了自己的大三暑假进入大厂打下基础.
平衡好才是上策.

接下文, 我发现自己有点?(自信点把点去掉)好高骛远了, 好高骛远会消磨一个人的兴趣和信心. 最终决定不做什么大游戏, 不研究什么框架, 先用自己所会的写一个小游戏,
一是为了试着重新拾起兴趣, 二是如果只学而不去写项目, 没有太大收获的

昨天一天都是策划和编写一个游戏, 游戏逻辑十分的简单. 猜数字 初期的流程图我大概画了下, 姑且算作第一版吧 下面放出来, 我后面可以逐渐丰富这个东西 加上日志登录
断线重连等等功能.感觉还是可以的~~ 尽管逻辑很简单.

听说在写代码前规划好, 可以更好地组织代码, 昨天尝试了下感觉还不错. 我在写代码前把游戏的流程图画了一下, 然后标上了哪里会有什么数据交互,
之后我去写了数据包头格式
头部

偏移量 长度 含义
0 4 封包总大小
4 2 头部长度
6 2 操作码

操作码

代码 含义 数据格式
00 登录
01 桌位信息(服务器发送桌位列表) [1000-0-4][1001-0-4]
02 桌位操作信息(客户端加入 退出桌位) 1000
03 服务器桌位操作信息反馈(加入退出成功1 加入退出失败0) 1
04 准备
05 取消准备
06 服务器广播桌位信息 4[11][10][00][00] (桌位总数, 有人1 准备1)
A1 服务器广播游戏开始
A2 服务器下发轮到的客户端
A3 客户端发送猜测的数字 50
A4 服务器发送猜测数字反馈 (数据合理1, 数据非法0) 1
A5 服务器广播游戏状态 50-0-75[A][B] (A玩家猜出50 当前范围 0到75 B玩家准备)

然后草拟了一下 用到的类 用到的数据结构 分几个类 怎么联系起来, 最终我才去写代码, 感觉比一边写
一边想要好不少. 写的过程中也发现了一些问题

  1. EPOLLRDHUP这个绑定在listenfd还是newfd?? 如果是newfd还能理解下原理, listenfd就有点理解不了.(试了下, 是newfd)
  2. Foo *a;
    Foos b[3];
    b[1] = *a;
    // 修改a不会影响b[1], 这个问题听到过, 自己真正试了试才发现如此

姑且昨天的就补上这些吧. 今天打算把游戏的服务器跑起来

六日 2020年2月6日22:12:36

忙忙碌碌的一天就又要结束了. 今天一天把剩下的一部分逻辑代码写了一部分. 主要是写自定义协议的序列化和反序列化. 起初打算
用char* body 来存储, 按照上面定义的格式传输. 后来一想, 这样我就不就是在原地打转吗. 就去网上找了找相关的代码, 看看别人怎么写的

主要是看的这一篇博客手把手教你实现自定义的应用层协议
看了之后收获不少. 收获总结在下面吧

  1. 两个头文件互相include
    这个是今天了解的最奇葩的一个问题, 如果两个头文件互相include 会出问题. 这个明天开一篇 采坑博客
    与此连带的还有class 前置声明, 再者可以到编译相关的问题
  2. 今天了解了一下CMAKE和MAKE的区别和联系, 总算知道了为啥好多安装的时候先cmake 再 make
  3. 还是关于CMAKE 稍微整理了点CMAKE的使用. 随用随整理, 目前不打算一次性整理太多
  4. Git操作不熟练. 我本地写好了代码文件, commit 然后从服务器pull了一个仅包含readme的仓库, 然后reset
    自己写的代码文件全没了, 只剩下README.md 还好之前整理过reflog, 明天也需要在整理下
  5. 安装了jsoncpp, 亿图图示等一些软件. 写了下关于字节对齐的问题. 亿图图示目前感觉挺不错

代码方面的收获 主要就是看的那篇博客学到的.

  1. 首先就是学会了自定了协议 序列化和反序列化怎么写 代码更美. 虽然可能我看的博客可能不是最好的,
    但对我目前来说足够美了, 不过写一遍远远不够.
  2. 学到了巧妙地对 uint8_t*类型的指针(指向流数据缓冲区)转换成uint16_t*等指针类型, 进行解引用 得到原本的数据, 然后对
    uint8_t*类型的指针+2就可以跳过一个uint16_t, 虽然这些能够理解, 但实际应用这是第一次
  3. 对于如何更好的组织一个数据结构 有了更深的体会.
  4. 使用vector来存储剩余的包字节, 相比使用一个定长数组进行strcpy 方便了不少
  5. 使用erase擦除也是第一次实际应用
  6. 更好的使用指针

定一下明天的任务吧, 试运行

  1. 定义游戏的json格式, 把所有的json都定义出来 √
  2. 游戏完成度达到能够正确解析包并分发到合理的部分即可 √
  3. 写一遍采坑博客-头文件互相引用 √
  4. 针对今天Git遇到的文件 在做研究下√
  5. 简单学习下jsoncpp的使用√

七日 2020年2月7日10:14:53

2020年2月7日10:14:53
今天博客写的格外早, 主要是又遇到一个奇葩问题(其实是我自己使用有误)
我昨天最后发现代码跑不起来, 就没有管, 今天看了下跑不起来是因为未定义引用
好吧, 未定义引用, 我检查了一下发现不对啊, 我加上了
target_link_libraries(Guess -ljsoncpp network game)
我当时是这样写的, 结果就是报错未定义引用, 然后我把报错的部分另开一个项目放进去
运行起来没问题?????.
然后我把报错的代码放在我项目的main文件中, 结果原来的报错也消失了 main中的也没报错?????
最后阴差阳错发现这个博客初入职常见问题:gcc编译时对’xxxx’未定义的引用. 我发现其中的一段话

这个主要的原因是gcc编译的时候,各个文件依赖顺序的问题。
在gcc编译的时候,如果文件a依赖于文件b,那么编译的时候必须把a放前面,b放后面。
例如:在main.c中使用了pthread库相关函数,那么编译的时候必须是main.c在前,-lpthread在后。 gcc main.c -lpthread -o a.out 。

虽然使用的是cmake然后make 不确定编译器, 但我感觉应该试一试. 因为我的软件是编译network.a的时候报错,
结果我改成了如下
target_link_libraries(Guess network game -ljsoncpp)
发现报错消失了……

以前一直没有在意这里的顺序问题. 现在知道了问题所在 去搜索target_link_libraries顺序问题
找到了一堆解释 哎….

2020年2月7日18:10:20
终于把头文件互相引用给搞明白了, 感觉这篇博客写的还可以吧, 就发到了csdn上面,自己的博客上也会发的. 就先这样吧
今天的第三项任务完成了, 概第四项任务了Git

2020年2月7日22:17:41
今天的任务完成了 还发现一个联系git的网站… 真的是纯偶然发现的这个
大创那里今天看了下文档 找了找模板 还可以吧 明天的话

  1. 游戏把服务器端写完 一半
  2. 把找到的大创模板改到springboot上面去 后续再套
  3. 练习并搞懂两道中等算法题目
  4. 在有时间的话把牛客整理了

八日九日 2020年2月9日18:04:35

简单写下吧, 昨天 不小心挂彩了, 还好运气还好, 没有太大的伤, 不然特别时期真的难搞.
不幸中的万幸

今天一天都没写代码 或许明天会好一些把

十日

2020年2月10日10:02:22
今天问题不大了, 继续写游戏的服务器
写完服务器后, 做算法题吧

十四日

昨天基本问题就不大了, 眼睛周围青了一圈成了大熊猫, 经过四天的休息 看东西倒是不流眼泪了.
今天的话, 实际的学习方面有

终于自己还是要找开源项目看看了, 不过今天2020年2月14日17:08:40头脑不是很清醒, 中午没有睡好. 看了个大概就没看了
nginx剖析

偶尔发现了一本书, 这不就是我想要看的吗!!!!!!, 准备看这本书 这本书从输入网址到网页返回都很详细的写了写

十五日

理论上大二寒假就要过完了. 昨天晚上想了很多

先说一下游戏把: 感觉自己不喜欢玩手机游戏了, 手机游戏非肝即氪 自己没有时间去肝游戏, 肝游戏不会给你工作, 自己没有钱去氪金, 自己又非.抱着这种念头时间长了, 自己对游戏更加提不起兴趣了. 而我又想去做游戏, 一个不想玩游戏的人能做游戏吗? 虽说我的不想玩是在各种因素长时间影响下形成的.

再说下我对编程吧: 怎么说呢, 我在大二上学期的上半学期之前, 都很喜欢写代码的, 我能在电脑前面坐上一整天. 后来我对代码提不起兴趣了. 原因的话昨天晚上整理了下.

  1. 目的不同了: 我在大二上学期的上半学期之前(包括大一整个学期)都是抱着解决某个问题去写软件的, 说起来是为自己写代码?首先就是我学的Javaweb为了解决校园网登录难的问题, 我用Java写一个客户端, 同时配上了后台和下载站(用的阿里云的OSS). 我记得的那段时间真的快乐. 后面我又为解决手动签到的问题, 做了个签到软件, 也是如此.——后来我学习的目的就是为了增进自己的知识(目的只有一个–进入大公司), 变成了为了学而学(之所以为了学而学是感觉时间真的有限, 我想在大三暑假能够实习, 我只有一年半的时间), 而不是之前, 通过做自己喜欢的东西不会了就去补一补. 长时间这样学习我大二上整个学期一个正经的项目都没有, 长时间为了学而学消磨了我的兴趣??
  2. 我发现我现在好像失去了对编程的乐趣, 现在写项目总想写出更优的结构, 总想写出大项目, 然而我的能力不足. 想实现和无法实现的思想一直持续着, 也是消磨的原因之一? 我现在在想我是不是期初就对linux服务器不感兴趣? 可我感觉当初自己确实想去的, 我想着游戏行业的人员兴趣基本相同, 能够一起做游戏,一边骂着策划脑洞一边做2333, 而不是做自己不喜欢的网站后端, 我发现目前自己都是一个人学习, 一个人做着, 何谈团队的乐趣?

症状就如上了, 自己也得想想办法了.

  1. 首要任务找个人(找个团队)一起做游戏吧, 自己一个人的话, 说不上我向往的一起写代码的氛围
  2. 找到团队之后, 就能通过一边做游戏一边学习自己的不足了
  3. 我长时间的学习, 做不出自己满意的项目也是原因之一吧.
  4. 手机游戏的话, 暂时不去玩网游了. 我自己更适合单机? 找人做独立游戏?? emm不错

十六日

爆肝学习了一天3dmax , 现在是会基本的操作 能够完成一些简单的建模了.

从B站找个那个课程也是很不错
3Dmax2018零基础入门教程(第一,二,三,四,五阶段)

一天的事件我就从 P0看到了 P51 过得很快, 但感觉掌握的还能接受


按键 功能
shift 绘制直线
删除键 可以回退一次
W 移动
E 旋转
R 缩放
F3 线框显示模式
F4 实体+线框限时模式
Shift 按住可以复制
Alt+T+A 阵列
Alt+T+M 镜像
Alt+A+对齐
Shitf+I 间隔工具
Ctrl+X 专家模式, 隐藏所有多余的东西 获得最大的空间
Alt+X 半透明显示
Ctrl+Shift+X 变换虚拟体显示切换 可以看到变换虚拟体的明显变化
O 自适应降级

编辑样条线->顶点
优化 在线上添加点
焊接 连接两点
自动焊接 两点在距离之内自动焊接

车削修改器
将二维图形 指定一个轴然后旋转 得到立体图形

可编辑多边形
细分曲面
迭代次数2-3
无需子层级修改后 可以勾选 等值线显示(勾选后 显示真实的渲染线? 不勾选显得线条少 利于编辑子层面)
细分置换-经常使用置换网格WSM修改器
需要给立体图形 设置好材质球 材质球需要置换这个属性的贴图
绘制变形-未学-用于雕刻地形
倒角剖面和扫描的区别

  1. 结合点不同
  2. 倒角剖面不能用三维轮廓, 扫描可以使用三维轮廓
  3. 倒角剖面不能将 图形包含图形(一个圆中再画一个圆) 的图形作为剖面,扫描可以.

好了寒假也算是结束了

哦对了 我还在做一个游戏 从YouTube上看到一个打砖块游戏.
这只是开始, 因为我是做服务器的所以我要把游戏改成双人联机哒!!!!目前进展还不错

我打算模仿一个知乎大佬在知乎更新下专栏? 貌似可以诶

网上讲解服务器的不少 讲解客户端的不少 讲解一套的就少了

好了博客整理下 寒假结束了


转载请注明来源,欢迎对文章中的引用来源进行考证,欢迎指出任何有错误或不够清晰的表达。