Change My World by Program

0%

建议安装Mybatis-plus

Mybatis官方文档

目录结构

  • Mapper.xml文件是真实的SQL语句对应关系

MyBatis生成的DAO层文件目录如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
.
├── entity
│   ├── Table1.java # 这是数据Model,即使数据记录对应的Java类,里面包含对应表的字段、注释及get和set方法
│   ├── Table1Example.java # MySQL查询相关的一些简单的语句拼接,针对每个字段都有几个常用的SQL语句拼接方法。比如等于、大于、小于等方法
│   ├── Table2.java
│   └── Table2Example.java
└── mapper
├── Table1Mapper.java
├── Table1Mapper.xml
├── Table2Mapper.java
├── Table2Mapper.xml
└── ext # MyBatis并不会默认生成,可以在这里编写自定义的查询方法
├── MyExtMapper.java
└── MyExtMapper.xml
阅读全文 »

每年的认知小结

人生

  • 当你老了,回顾一生,就会发觉:什么时候出国读书,什么时候决定做第一份职业,何时选定了对象而恋爱,什么时候结婚,其实都是命运的巨变。只是当时站在三岔路口,眼见风云千樯,你作出选择的那一日,在日记上,相当沉闷和平凡,当时还以为是生命中普通的一天。——陶杰《杀鹌鹑的少女》
  • 就算你觉得自己是一坨臭狗屎,也会遇到一个心地善良的屎壳郎,不远万里找到你,然后当成宝贝,再不远万里把你滚回家,一路上悉心呵护着你,怕你被抢了,被踩扁了,或者撞到石头,一心想着,把你变成家里的镇宅之宝,别怀疑,世界有时候就是这么好。
  • 曾经以为“老去”是很遥远的事情,突然发现“年轻”是很久以前的事了……时光,好不经用,抬眼,已然半生
  • 我尊重同性恋,我理解抑郁症,我会喂楼底下的流浪狗,会给老奶奶让座位,会对店员说谢谢……纵然,我平庸,长相普通,脾气不好,曾经悲伤难过望而不得,生活的苦也在吃,但我依然,想努力地成为一个温柔善良的人。——网易评论《借我》
  • 会做饭的男人又一个共同特点,那就是穷。
  • 废掉一个人最狠的方式,是让他忙到没时间成长——铭哥笔记
  • 人生短短急个球啊
  • 人者一辈子,走走瞧瞧,吃吃喝喝,不生病,就是夫妻,如果能遇到自己爱的也爱自己的人再发点小财,就是天大的福气。——摘自《不是因为寂寞才想你》王小帅
  • 少儿编程这玩意儿毫无意义,编程是工具,不是知识,送小孩去学编程等于送小孩去学说明书,急功近利也不是这么个急法。15岁之前只需要学数学和英语,前者是定义与解决,后者是表达与传播。其他学科本质上和冯唐诗集没什么区别。 ——微博 马茉莉
  • 我发现不能一下子挣个几百万的话,工资再高也没用,只有财务自由才可以安心
  • 最幸福的事,还有女孩子夜晚开着车,拉着那个为了未来奋斗而疲惫入睡的男孩子呀——抖音
  • 所有人都在要求内向的人多说话多社交走出舒适圈,这样说的话外向的人每天都活在舒适圈里,那让外向的人也走出舒适圈,少说电话少拉别人去聚会多独处多沉默ok吗——微博,高大威溜了溜了
  • 最幸福的事就是,你开着车,我坐在副驾驶,听着歌,吃着零食,跟你聊着未来,一起去找我们最想去的地方。
  • 最幸福的事莫过于两个男人一个开着车,另一个坐在副驾驶,一起抽着烟,讨论这去哪找最美技师。
  • 《小王子》说:仪式感就是使某一天与其他日子不同,使某一时刻与其他时刻不同。
  • 春有百花秋有月,夏有凉风冬有雪。若无闲事挂心头,便是人间好时节。
  • 其实我们很多人都无解了三观不合的意思,你喜欢吃西餐,我喜欢吃路边摊,这不是三观不合,但如果你喜欢吃喜欢我说你装,我喜欢吃路边摊你说我low,这才是三观不合——抖音

编程

  • 在同一个公司同一个职位上一旦错过了3-5年的跳槽黄金期,员工对安逸的需求大于上进求胜的欲望,随着年龄的增大、家庭琐事的负担,人的惰性将越来越束缚内心,最终沦为朝九晚五混日子的上班族。
  • 做得快不仅可以让你在单位时间内完成更多的工作,而且因为你工作得很快,所以你会觉得成本低,从而倾向于做更多。
  • 1万属性,100亿数据,每秒10万吞吐,架构如何设计?——Json格式存储不同的属性
  • 有些网站禁止未登录用户访问,但会对搜索引擎开绿灯。开绿灯的方式有可能只是简单地判断User-Agent。所以,只要把浏览器的User Agent改为搜索引擎的爬虫即可访问其内容。——微博tombkeeper
  • (微服务的)分布式事务没有最好的解决方案,甚至说没有比较简单的解决方案,所以,最好的方法是尽量避免分布式事务,具有强一致性要求的服务并不建议拆分到不同的服务中。这也是DDD(领域驱动设计)的思想

生活

  • 省一分钱真的比赚一分钱容易多了
  • 一个人可以捱穷,两个人就不行,因为会忍不住把自己的穷怪罪给他。——亦舒
  • 如果不能变得有钱,那就变得有趣吧
  • 在赚钱这件事上,谁转不到钱, 你就不要听他们的,包括你的父母兄弟姐妹,你身边这些最亲近的人,本质上他们说这些话,都是为你好,但他们的思维,会影响你去做一些超出他们认知的事,而这种影响会导致你跟他们过上一样的生活

经历了这辈子到目前为止最魔幻也最累的一个开年,各个自媒体账号全部没有更新,这次不是迷茫,是真的太忙,导致这篇年终总结迟到这么久。

工作快四年,今年才过不到六分之一,加的班已经超过我之前所有的量了,实在是吃不消,而且加班是真的真的影响和家庭生活,一是陪伴家人的时间大量减少,二是在家里的时候十分厌恶接到公司电话,每次一接到工作电话,就免不了情绪不稳定,给家人带来困扰。以前我不换工作是因为这家公司虽然钱少,但至少干得开心,但是现在连干活都这么累了,可能真没有待下去的必要了吧。

另外一个事情就是筹备了很久的婚礼,年前各种买买买,各种联系亲朋好友,结果到最后因为疫情不得不取消了。家里人包括老婆都不想再补办了,足以看出我们的心力交瘁。

接下来再用我每年的总结及计划模版

2019总结

这是2019年初列的计划

haofly

  • 博客: 日均60+,做到了90+
  • 微信: 继续朝100+迈进。断断续续,没啥进展
  • 小程序: 累计用户100+,我就说嘛,只要创意和名字好,总会有用户的
  • 微博: 365+条,今年关注微博少了,发得也少了,因为有很多心里话不想表达
  • 阅读: 12+本,大概三本,不行
  • 专栏: 1个,GraphQL教程
  • 智能家居: 至少一次,让家里更智能,小爱音响还算不错,但是小爱同学是真的人工智障
  • 涨工资,呵呵
  • 尝试新技术: Spring,Ruby语言。成功变成一个有多年开发经验的Java程序员
  • 补动漫,还是补了很多的
  • 每月检查这份计划。OKOK,又没做到,即使前面几个月我还设置了闹钟的

理财

  • 定投基金。由于结婚要花太多钱,所以今年只顾着存钱了,加上年终奖,年底存了1万多,感动
  • 坚持每天记账。坚持每天每笔记账已经超过1000天了。使用口袋记账已经超过3年了,这个软件已经很久没更新了,如果说哪天软件出现bug了,就只能
  • 再次用10个月时间完成去年一年的收入。今年居然没完成,郁闷了

健康

  • 平均每天1w+步,自从媳妇每天住在家里后,运动量就很少了
  • 每月出门健身旅游一次,上半年坚持了一下,下半年就荒废了
  • 每周至少一次大扫除,老婆在家,不得不做呀

情感

  • 结婚。终于在2019920这天完成又一件人生大事
  • 教会女朋友独立开车。其实她会,她只是不喜欢我坐在旁边
  • 和女朋友省外旅游至少一次。居然一年没出过市。
  • 带家人旅游至少一次。迫于贫穷。
  • 招待新老朋友聚会至少两次。怕是不下十次了
  • 平均每月回一趟家。有车后回家次数已经数不清了

2019年博客访问统计(相比去年大概翻一番)

2019年消费支出趋势(今年主要话费是10月份为全家配置保险)2018年支出趋势

阅读全文 »

生成token

  • 无论是主持人还是用户还是录制UID进入频道前都需要先生成一个token
  • token的生成方式点击标题即可,里面有各种语言生成token的方式
  • 生成token必须提供一个UID,得自己找办法和数据库中原有的用户关联
  • token相关错误码

服务端

  • 服务端的Restful API都有频率限制且阈值并不高,这是官方提供的超出频率限制解决方法,可以参考一下,之前我以为hook能够帮助我减少很多请求,但发现并不如我的预期,主要是实效和顺序性的问题

Channel相关的服务端Restful API

项目管理

踢人规则

查询在线频道信息

获取用户列表
  • 可以同时获取主持人和观众的用户列表,但是只有创建token时候的UID
1
# 接口地址: /dev/v1/channel/user/{appid}/{channelName}

云端录制Restful API

  • 如果一个频道超过15秒内没有主持人以及观众,那么频道会关闭,下面的接口都会提示找不到该频道
  • 云端录制的原理就是添加了一个观众去听
  • 目前云端录制无论是自建服务器还是使用官方接口都只支持生成m3u8格式的音视频文件,如果需要其他格式需要自己去转换
  • 云端录制常见错误码

获取云端录制资源resource ID

  • 后续对云端录制的几个接口都需要该resource ID,并且每次调用都能生成一个新的
  • ``resource ID的时效是5分钟,必须5分钟内用它去开始云端录制,但是后续仍然可以用它来query/stop`
1
2
3
4
5
6
7
8
9
# 接口地址: /v1/apps/{appid}/cloud_recording/acquire
# 接口参数:
{
"cname": "频道名称",
"uid": "1234567890", # 可以固定一个与数据库中其他用户uid不会重复的id
"clientRequest": {
"resourceExpiredHour": 24
}
}

开始云端录制

  • 一般紧接着获取resource ID后进行
    • 需要注意的是,多次对同一个频道调用start接口,会开启多个录制,会生成多份录制文件
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
# 接口地址: /v1/apps/{appid}/cloud_recording/resourceid/{resourceid}/mode/{mode}/start
# 其中mode=mix的是默认模式,表示将频道哪所有UID的音视频混合录制为一个音视频文件,可选individual/web
# 接口参数:
{
"cname": "频道名",
"uid": "录制的用户ID", # 需要和获取resource ID的一致
"clientRequest": {
"token": `${this.buildTokenWithUid(uid)}`, # 调用buildTokenWithUid方法生成的token
"recordingConfig": {
"channelType": 1,
"streamTypes": 0,
"maxIdleTime": 30,
"videoStreamType": 0,
"unSubscribeAudioUids": [
"1234567890" # 不录制指定uid的音视频,可以直接设置为录制用的那个UID
]
},
"recordingFileConfig": {
"avFileType": [
"hls"
]
},
"storageConfig": {
"vendor": 1,
"accessKey": config.aws3.accessKeyId,
"region": config.aws3.regionNum,
"bucket": config.aws3.bucket,
"secretKey": config.aws3.secretAccessKey,
"fileNamePrefix": [ # 需要注意的是文件夹名称在agora这边不允许下划线
'directoryPrefix',
audioPost.id
]
}
}
}

查询云端录制状态

  • 可以通过该方法获取云端录制生成的m3u8文件名称(如果不使用agora提供的回调服务,就只能自己找个时机去获取了,否则频道销毁后就获取不到该文件了,并且频道在刚调用完start的时候也是获取不到该文件的)
1
# 接口地址:/v1/apps/{appid}/cloud_recording/resourceid/{resourceid}/sid/{sid}/mode/{mode}/query

停止云端录制

  • 当所有用户都离开频道后,云端录制也会自动暂停的
  • 云端录制停止不代表频道被销毁
1
2
3
4
5
6
7
# 接口地址: /v1/apps/{appid}/cloud_recording/resourceid/{resourceid}/sid/{sid}/mode/{mode}/stop
# 接口参数:
{
"cname": "频道名称",
"uid": "录制用的用户ID",
"clientRequest": {}
}

回调服务/消息通知服务

  • 要开通回调服务国内必须提交工单,国外必须通过email联系
  • 回调服务需要提供接口给他们,否则他们总说你的接口有问题,我都还没接入我怎么提供接口呢,关键改接口地址又得发邮件,所以这里最好先写好一个返回200的接口,并且把body都打印到日志里面去
  • 回调服务需要问你是否需要retry,之前我觉得加上会比较好,后来看觉得还是取消好一点,他们的回调没发现漏发的,只有不及时的,反正时间顺序完全没有

实时通信回调服务

云端录制 RESTful API 回调服务

EventType Description comment
4 The M3U8 playlist file is generated. M3U8文件生成 可以在这时候获取到m3u8文件的文件名
11 The cloud recording service has ended its tasks and exited. 云端录制退出 退出的时候可以尝试从m3u8文件中解析出云端录制的总时长
33 录制文件上传到第三方云存储的进度 个人感觉没多大用,每个分片都会进行上传并回调,再加上retry,这个事件相当多

es的引入及配置

要想使用Java版的es客户端,首先需要在pom.xml引入如下依赖

1
2
3
4
5
<dependency>
<groupId>org.elasticsearch.client</groupId>
<artifactId>elasticsearch-rest-high-level-client</artifactId>
<version>7.4.0</version>
</dependency>
阅读全文 »

Logstash是一个开源的数据转化工具,可以将不同的数据源的数据进行收集、分析、处理,并存储到指定的介质,常用于搜集服务器上的日志到elasticsearch,或者快速地将数据从一种介质转移到另一种介质。

官方提供了多种安装方式,也可以直接下载源码,源码解压即可用。

常用命令

1
2
./bin/logstash -f getdata.conf	# 执行指定的配置文件
./bin/logstash -e input { } filter { } output { } # 直接执行指定的输入、过滤、输出管道,格式就是配置文件的格式,但要注意大括号前后都要加上空格,以免命令解析失败

常用插件

阅读全文 »

今天早上七点过,突然接到家里来的电话,每次在这种时间段接到家里的电话都十分紧张。因为他们知道我起得晚,下班后也只想休息,不会无缘无故来打扰我,所以,这种时候的电话肯定是家里出了点事情。果不其然,如下图,据说一个新手司机踩错刹车,径直撞到我家柱子上面了,还伤了一个路人,公路离我家有十几米远,不知道他怎么做到的。庆幸的是,家里人并没有受伤,只是非常后怕。

阅读全文 »

距离上一次发文已经快半年了,趁这个特殊的日子,我想记录一下这几个月的流水帐,算是我恢复更新的一个开始。感谢对我不离不弃的各位。

这个夏天主要做的事情就是去区县买了一套小两室,作为老婆明年开始在老家县城工作的新家。大家都知道,区县的房子是最没有投资的,并且今年重庆的房价横盘已久,那我们为什么要在这个时间点买呢,还要买最贵的楼盘之一。老婆买房子有自己的原因,而我不阻止她买是考虑到她未来几年都得在这里工作,并且这期间大概率会经历怀孕生娃的过程,如果没有一个便利的购物条件,没有一个良好的小区环境,没有一个稳定温馨的住所,没有一个好闺蜜在同一小区,我是不忍心她一个人在那边的。看房和交易的过程可以说是相当艰辛的,连续两三个月基本上都是每一两周都得回老家一趟,花费了大量的时间,还好,最后在我们领证前几天,收到了放款通知。所以,截止到目前,我们俩的贷款本息已经超过一百万了。

阅读全文 »

基本概念

  • React是一个用于构建用户界面的Javascript库,是DOM的一个抽象层
  • React主要用于构建UI

状态管理

State

Props

阅读全文 »

这是我读的刘慈欣的第三部作品,但是是她早期的作品了,所以感觉有些表达功底没有《三体》的深厚。可以把它当作看作《三体》的前传来看,里面有一些重复的人物,但是真实年代和身份可能又有一些没有重复。

我认为这部作品可以作为一个量子物理科普入门的作品,特别适合对物理或者科幻感兴趣的初学者。这部作品中讲述的大量物理知识其实是有理有据的,甚至用科幻的方式解释了很多我们人类目前还没能解释的事情。看完可能给人一种恐怖的气氛,特别是最后照片里面的人,但我特别喜欢那量子玫瑰。

另外,这部作品是我第一次在微信读书上听完的一部作品,不过各个听书应用目前除了专人录入的作品外,其他的作品的朗读都是机器翻译,体验还是有待加强。

  • 美妙人生的关键在于你能迷上什么东西。
  • 夜晚的灯塔一直都在,只是灯亮的时候,你才看见它。
  • 有时候,人最不能容忍在别人身上看到自己的影子。
  • 我发现,当你渴望某样东西时,道德的约束是多么无力。