这里记录一周中关于Go语言,关于编程,关于生活资讯,关于各种工具、网站的搜集汇总。另外我和我的小伙伴会隔段时间进行讨论,我也会把其中值得分享的内容分享出来。
每周一发布。
本杂志开源(GitHub: Tjuvenile/weekly),欢迎提交 issue,投稿或推荐科技和资讯内容。
详细的说明了并发方面的知识
pprof是golang自带的可以用来做cpu、内存、锁分析的工具,非常类似java的async-profiler。
pprof的使用非常简单,只需要在代码中引入net/http/pprof包,然后监听一个端口即可。
一个简单的例子如下:
package main
import (
"fmt"
"log"
"net/http"
"time"
_ "net/http/pprof"
)
func main() {
go func() {
//example: visit http://127.0.0.1:6060/debug/pprof in browser.
err := http.ListenAndServe("0.0.0.0:6060", nil)
if err != nil {
fmt.Println("failed to start pprof goroutine:", err)
}
}()
http.HandleFunc("/", handler)
log.Fatal(http.ListenAndServe("localhost:8000", nil))
}
func handler(w http.ResponseWriter, r *http.Request) {
time.Sleep(1 * time.Second)
eat()
time := time.Now().Unix() * 2 + 1000000
fmt.Fprintf(w, "URL.Path = %q; time = %d\n", r.URL.Path, time)
}
func eat() {
loop := 10000000000
for i := 0; i < loop; i++ {
// do nothing
}
}
在命令行中输入
go tool pprof http://127.0.0.1:6060/debug/pprof/profile
同时不停的请求,让pprof能采集到数据,这里我的请求是
curl http://127.0.0.1:8000/hello
等待30秒后,采集结束会显示采集文件的地址
Saved profile in /Users/roshi/pprof/pprof.samples.cpu.003.pb.gz
此时可以使用top等命令直接查看cpu消耗过高的函数,更多命令可以使用help查看。
无状态的意思就是这一次请求和上一次请求是没有任何关系的,互不认识的,没有关联的。
这样的好处是快,缺点就是需要cookie
、session
、token
等机制将客户端的各个请求关联起来。
在说cookie
、session
、token
之前,还需要了解认证
、授权
。
验证当前的身份,也就是证明你是你自己
最常见的认证方式是通过用户名
和密码
,除此之外还有:
- 通过用户手机:手机短信、手机二维码扫描、手势密码
- 用户的电子邮箱
- 身份证号码
- 基于时间序列和用户相关的一次性口令
- 用户的生物学特征:指纹、语音、眼睛虹膜等
为了确认用户的身份,防止请求伪造,在安全要求高的场合,经常会使用组合认证(也叫多因素认证),也就是同时使用多个认证方式对用户的身份进行校验。
简单讲就是授予第三方访问用户资源的权限
。
在互联网应用开发中,主要通过下面几种方式实现授权:
- 通过 session 机制,一个访问会话保持着用户的授权信息
- 通过 cookie 机制,一个网站的 cookie 保持着用户的授权信息
- 颁发授权令牌(token),一个合法有效的令牌中保持着用户的授权信息
特点:
cookie
最开始被设计出来是为了弥补HTTP在状态管理上的不足。cookie 存储在客户端
:cookie 是服务器发送到用户浏览器并保存在本地的一小块数据,它会在浏览器下次向同一服务器再发起请求时被携带并发送到服务器上。cookie 是不可跨域的
:每个 cookie 都会绑定单一的域名(包括子域),无法在别的域名下获取使用。
设置:
服务器向客户端发送 Cookie 是通过 HTTP 响应报文实现的,在 Set-Cookie 中设置需要向客户端发送的cookie,cookie格式如下:
Set-Cookie: value[; expires=date][; domain=domain][; path=path][; secure]
工作流程:
(1)浏览器向服务器发送请求;
(2)服务器响应请求,向浏览器设置 cookie;
(3)浏览器将 cookie 存在本地,下一次请求带上该 cookie;
(4)服务器响应请求。
常见属性:
(1)name=value
键值对,设置 Cookie 的名称及相对应的值。
(2)domain
指定 cookie 所属域名,默认是当前域名。如果 cookie 的 domain 设置为 taobao.com,那么 item.taobao.com, order.taobao.com 都是可以共享 cookie 的, 但是访问 tmall.com 就不能共享 cookie 了,这就涉及跨域访问的问题,跨域问题如何解决,这里不展开,有兴趣可以自行搜索。
(3)path
指定 cookie 在哪个路径(路由)下生效,默认是 '/'。如果设置为 /abc,则只有 /abc 下的路由可以访问到该 cookie,如:/abc/read。
(4)expires
指定 cookie 的过期时间(GMT时间格式),到达该时间点后该 cookie 就会自动失效。
(5)max-age
HTTP 1.1中定义的,优先级高于 expires 字段。
max-age 表示 cookie 有效期,单位秒。如果为正数,则该 cookie 在 max-age 秒后失效;如果为负数,该 cookie 为临时 cookie ,关闭浏览器即失效,浏览器也不会以任何形式保存该 cookie ;如果为 0,表示删除该 cookie 。默认为 -1。
(6)HttpOnly
如果给某个 cookie 设置了 httpOnly 属性,则无法通过 JS 脚本读写该 cookie 的信息。
(7)secure
该 cookie 是否仅被使用安全协议传输,默认为false。当 secure 值为 true 时,cookie 在 HTTP 中是无效的。
session就是会话,用户打开一个浏览器,点击多个超链接,访问服务器多个web资源,然后关闭浏览器,整个过程称之为一个会话。
特点:
- session是另一种记录服务器和客户端会话状态的机制
- session存储在服务器端,一般是文件中,也可以存在数据库或缓存里
- session一般基于cookie实现
工作流程:
- 存储方式:cookie 数据存放在客户的浏览器上,session 数据放在服务器上;
- 安全性:cookie 是本地存储,不是很安全,别人可以分析存放在本地的 cookie 并进行欺骗;
- 存储大小:很多浏览器限制单个 cookie 保存的数据不能超过4K,一个站点最多保存20个cookie,session 没有类似的限制;
- 生存周期:cookie 可设置为长时间保持,Session 一般失效时间较短,一般客户端关闭 session 就会失效。
token是验证用户身份的凭证,我们一般叫它令牌
最简单的token组成: uid(用户唯一的身份标识)、time(当前时间的时间戳)、sign(签名,以哈希算法压缩成一定长的十六进制字符串)
特点:
- 无状态、可扩展
- 支持移动端设备
- 支持跨程序调用
- 安全
工作流程:
JWT是标准化的token:
从本质上讲 JWT 也是一种 token,只不过 JWT 是被大家广泛接受的标准。
JWT 即:Json web token (JWT)
组成:
当我们解析一个已知的JWT时:
- header
jwt的头部承载两部分信息:声明类型
,这里是jwt;声明加密的算法
,通常直接使用 HMAC SHA256;
- playload
载荷就是存放有效信息的地方。主要包含三个部分:标准中注册的声明
;公共的声明
;私有的声明
。
- signature
jwt 的第三部分是一个签名信息,这个签证信息由三部分组成:header (base64后的);payload (base64后的);secret。
(3)JWT 的特点
- 不在 jwt 的 payload 部分存放敏感信息,因为该部分是客户端可解密的部分。
- 保护好 secret 私钥,该私钥非常重要。
- 如果可以,请使用 https 协议。
1、避免使用select
在查询的时候,只查需要用到的列。
2、用union all 代替union
我们都知道sql语句使用union
关键字后,可以获取排重后的数据,排重的过程需要遍历、排序和比较,它更耗时,更消耗cpu资源。
而如果使用union all
关键字,可以获取所有数据,包含重复的数据。不过如果你有union的需求除外。
3、小表驱动大表
用小表的数据集来驱动大表的数据集
假如有order和user两张表,其中order表有10000条数据,而user表有100条数据。
这时如果想查一下,所有有效的用户下过的订单列表。
可以使用in
关键字实现:
select * from order
where user_id in (select id from user where status=1)
也可以使用exists
关键字实现:
select * from order
where exists (select 1 from user where order.user_id = user.id and status=1)
因为如果sql语句中包含了in关键字,则它会优先执行in里面的子查询语句
,然后再执行in外面的语句。如果in里面的数据量很少,作为条件查询速度更快。
而如果sql语句中包含了exists关键字,它优先执行exists左边的语句(即主查询语句)。然后把它作为条件,去跟右边的语句匹配。如果匹配上,则可以查询出数据。如果匹配不上,数据就被过滤掉了。
这个需求中,order表有10000条数据,而user表有100条数据。order表是大表,user表是小表。如果order表在左边,则用in关键字性能更好。
总结一下:
in
适用于左边大表,右边小表。exists
适用于左边小表,右边大表。
不管是用in,还是exists关键字,其核心思想都是用小表驱动大表。
4、批量操作
有一批数据,需要批量插入到数据库中。
如果我们通过循环插入的方式,就需要每次远程请求数据库,这会消耗一定的性能。
优化的方式就是提高一个批量插入数据的方法,这样只需要远程请求一次数据库。
但是一次也不能批量插入太多数据,建议控制在500以内,如果数据多于500,分批进行。
5、多用limit
有时候,我们需要查询某些数据中的第一条,比如:查询某个用户下的第一个订单,想看看他第一次的首单时间。
就可以使用limit来限制。
此外,在删除或者修改数据时,为了防止误操作,导致删除或修改了不相干的数据,也可以在sql语句最后加上limit。
例如:
update order set status=0,edit_time=now(3)
where id>=100 and id<200 limit 100;
这样即使误操作,比如把id搞错了,也不会对太多的数据造成影响。
6、in中值太多
select id,name from category
where id in (1,2,3...100000000);
如果我们不做任何限制,该查询语句一次性可能会查询出非常多的数据,很容易导致接口超时。
可以用limit做一下限制,不管in里面有多少,我只返回这么多。
9、用连接查询代替子查询
mysql如果需要从两张以上的表中查询出数据的话,一般有子查询
和连接查询
两种方式
子查询语句的优点是简单,结构化,如果涉及的表数量不多的话。
但缺点是mysql执行子查询时,需要创建临时表,查询完毕后,需要再删除这些临时表,有一些额外的性能消耗。
10、join的表不宜太多
阿里巴巴开发手册规定join表的数量应该不超过3个
如果join太多,mysql在选择索引的时候会非常复杂,很容易选错索引。
并且如果没有命中中,nested loop join 就是分别从两个表读一行数据进行两两对比,复杂度是 n^2。
所以我们应该尽量控制join表的数量。
如果实现业务场景中需要查询出另外几张表中的数据,可以在a、b、c表中冗余专门的字段
,比如:在表a中冗余d_name字段,保存需要查询出的数据。
不过我之前也见过有些ERP系统,并发量不大,但业务比较复杂,需要join十几张表才能查询出数据。
所以join表的数量要根据系统的实际情况决定,不能一概而论,尽量越少越好。
11、join时要注意
innor join中,mysql会自动选择两张表中的小表去驱动大表。
left join会默认使用left join关键字左边的表去驱动右边的表。
13、选择合理的字段类型
char
表示固定字符串类型,该类型的字段存储空间的固定的,会浪费存储空间。
varchar
表示变长字符串类型,该类型的字段存储空间会根据实际数据的长度调整,不会浪费存储空间。
如果是长度固定的,比如用户手机号,一般是11位,可以是char类型。
我们在选择字段类型时,应该遵循这样的原则:
- 能用数字类型,就不用字符串,因为字符的处理往往比数字要慢。
- 尽可能使用小的类型,比如:用bit存布尔值,用tinyint存枚举值等。
- 长度固定的字符串字段,用char类型。
- 长度可变的字符串字段,用varchar类型。
- 金额字段用decimal,避免精度丢失问题。
14、提升group by的效率
分组是一个相对耗时的操作,如果要对分组之后的数据进行限制。
可以想想能否先对数据进行限制,再分组?
理论可以搭建系统的框架,如果不去学习理论,会导致你对对应领域的归因能力很成问题。
正确的归因就是找到一个问题最根本,最真实的问题。
有一个方法是5WHY
法:
简单的说,就是追问5个为什么。
比如有一个问题:“为什么一面墙斑驳陈旧?”
原因是清洁工经常使用清洗剂进行清洗,那清洗的原因呢?原因是因为有很多的鸟在这面墙上拉屎,那为什么有很多鸟呢?因为这里很适宜虫子繁殖。那为什么虫子喜欢在这里呢?因为那有一排窗户,太阳把房间照的很温暖。于是,挂上窗帘,问题就解决了。
你看,这就是归因的能力。
判断一个人是内向还是外向,关键是看他的能量的来源。
有的人从社交中获得能量。稍微独处一段时间就要发疯。
他们需要和人打交道,越沟通越觉得能量满满。
而我呢,需要从独处中获得能量。
参加一个酒会,我只愿意拿一瓶82年的可乐,找个地方,然后安安静静地躲起来,一个人喝。
有人跑过来和我打招呼,我也能够职业的、热情的沟通。
但职业是专业训练的结果,热情是能量消耗的结果。
想要扎实,至少要做好四件事:星辰、山头、道路、护栏
。
星辰:
愿景可以很小,但是一定要有。
你可能听过三个石匠的故事。有三个石匠,正在工作。你过去问,你们在做什么啊?
第一个石匠说:你没看见吗,我在干活。为了混口饭吃。
第二个石匠说:我要修一间房子,我想成为一名最好的石匠。
第三个石匠说:我在建一座教堂,我要为上帝造个家。
他们有什么区别?
这是0和1的区别,是1到100的区别。
最好成为第三个石匠,至少是第二个,但千万别做第一个石匠。
很多人说,怎么找到那个愿景?怎么让愿景激励自己?
1,想想10年后,20年后,你想让世界变成的样子。
2,然后,把那个画面,具体地写下来。
要清晰、具体、有画面地写下来。
想象人们会对你表示的感谢,想象媒体会对你进行的报道,想象商场的货架上摆满了你的产品,想象品牌的名字出现在大街小巷,想象这一切就像已经发生了一样。
写下来,最好写满整张A4纸。
人们对抽象的东西,总是不敏感的。把这些具体地写下来,你会真切感受到那个画面对自己的鼓舞和激励。
当你发自心底相信愿景的时候,也才会感染到其他的人。
山头:
星辰是10年、20年后最终要达到的地方,但是最近的3年、5年,就是我们要越过的一座座山峰。
为了实现愿景,哪件事没做,5年后一定会特别后悔?一个大的方向,就有了。
要做到什么地步,3年后的战略目标可以实现?想到这里,心里更有数了。
为了能实现目标,1年时间里我要认真做什么?具体的行动,知道是什么了。
我们经常说“倒推”,这就是倒推。从结果,往过程看。从远处,往近处看。从未来看,往当下看。
然后,去攻下一个个具体的山头。
不用太多,一个就够。找到必须拿下的一件事情。
道路:
具体执行的战略
护栏:
什么是对的,什么是错的,什么是要提倡的。
错误一:不要写成周报的放大版
对于领导来说,只罗列你在这一年中都做了哪些事,并不能代表你的工作能力。
正确做法:你需要总结自己的目标是什么?为了实现目标,你做了哪些事情?最终的效果如何?
如果你是一个HR,可以这样写:
结合公司发展要求,及往期招聘存在的问题,公司急需建立招聘制度。这一年,我深入招聘的各个环节进行调研,收集了20多个具体问题,最终建立了《公司人才招聘制度》,解决了公司招聘流程冗杂,招聘标准不一的问题。
关键性成果:制度实施后,入职率提高了30%,公司整体招聘留存率提高至65%,大大提高了公司招聘效率。
错误二:不要按照自身的优势和不足来写,按照岗位对能力的要求来写
大多数人在总结自己工作时的惯性思路是:描述自身的优势与不足。比如:今年我哪里做的不够好,明年我将在这部分重点提升。这样写会让你的个人优势与成绩特别抽象,而且不具有说服力。
正确做法:从公司的角度来看,这个岗位应该具备什么能力?我在这些能力维度上是什么水平?尽量用真实的事例和可视化的数据来辅助证明,更清晰且具有说服力。
错误三:只写自身规划,不关联组织目标
很多人在写明年计划的时候,只写自身的工作计划而忽略了与整体组织的联动,这样一来,则无法体现你的工作和公司、领导之间的关系。
正确做法:工作计划重要的是要汇入组织的大目标,写工作计划时,先和组织对齐目标,再去关联个人目标。这样写的好处就是能够证明自己的工作计划,是在为实现公司目标在努力。这个做法的重点在于:组织的新目标,与“我”如何承接。
天下每个领导都一样,他们先是发现某个人不错,再发现这个人可用,最后觉得这个人可靠,也就是特别可信。
如果你能够证明自己可用加可靠,那么祝贺你,你就要进入被提拔、被重用、被激励的个人发展“快车道”了。
在领导给你交代事情的时候,拿一个小本子,记录下来,会给领导一个你尊重他的信号,在领导的印象里是加分的。
另外,在领导生气的时候,不要说“你别生气”,因为这句话可能给领导又添了一把火。
这个时候拿起小本子,埋头做记录就好。
第一,不用直视领导,免得越看越生气,越看越委屈,低下头记笔记,藏起面部表情,能有一个缓冲时间。
第二,这个动作,可以帮领导缓和一下他的情绪。
有些痘痘几天就好了,有些痘痘需要一两年才能好,为什么?
这是因为痘痘的类型不同,好得快慢就不一样。
粉刺:
乳白色,黑色的,针尖大的小疙瘩。
如果内分泌失调,皮脂腺分泌过多油脂,堆积的油脂,混着老废角质和灰尘堵在毛孔里,就成了粉刺。
不管是白黑头粉刺,大多都是非炎症的,这就意味着只要水油平衡,每天清洁好皮肤,痘痘很快就会代谢脱落。
丘疹:
小山包一样的小红点,是因为形成粉刺之后,又不幸碰上了“痤疮杆菌”这种细菌。
免疫细胞就会冲上来干架,就会出现红肿发炎。
这就是一种炎症性痘痘了,就不会好那么快,如果配合药物使用,短则一周,长则好几个月。
脓疱:
红色小疙瘩,顶端有白色脓头,如果战斗的太厉害,皮脂腺还会破裂,炎症会更加严重,形成脓液。
这个得先消除脓液,再降低炎症,然后慢慢修复皮肤,一套流程下来往往需要3-4个月,就更难好了。
结节:
坚硬的大硬块,摸起来疼
这种痘痘属于重度痤疮,大约需要一年时间才能消退,有人几年都不消退,甚至形成永久性瘢痕。
不吃辣是减轻痘痘的原因,但是吃糖也是一直让痘痘不消的真凶,糖会让身体分泌大量胰岛素,激素波动又会引起皮脂大量分泌,更容易冒痘。
脸上痘痘太多可能就是甜食吃太多了。
长痘本来就皮肤受损,脏手碰脸就更容易让细菌进入。
1、痘痘变少
2、 皱纹减少
3、容易瘦
4、修复味觉(因为吃糖的人,会越吃越甜,口味重)
1、五险一金中包含生育保险,能拿到三笔钱,但是可能因为政策的不同,需要缴纳五险一金的时间也不同。可以打社保局12333确认本地政策。
2、怀孕期间被辞退是可以维权的
还有一些其它的事情,想看的话,点击原文。
有一种说法,你的预估乘π,就会得到真实的估计。这种说法有一定的道理。
一切顺利的情况下,从 A 点到 B 点的路线是一条直线。没有遇到困难时,就是两点之间直线最短。
但是现实中,很多事情都是不顺利的。你会遇到各种各样的困难,你会迷失方向,路线不可能是直线,而是曲线。
平均来说,实际的路线长度往往是理想路线的 π 倍。
这意味着,你预估一件事的难度是1,实际难度可能是3;你预估需要一个月完成的项目,实际需要的时间可能是三个月。
内卷的原义是“向内发展”,因为向外发展受到了阻碍,就开始向内部要效益。结果往往是恶性竞争,因为 蛋糕做不大了,大家只能争夺对方的份额。
内卷的共同点是市场没有扩张,利润没有增长,但是从业人员却越来越忙、越来越累,业务越来越难。
下一个内卷的行业很可能是游戏业。
原因是2021年中国游戏产业报告公布了中国游戏市场的两个增长率:
- 销售收入增长 6.40%,达到2965亿。
- 游戏用户增长 0.22%,达到6.66亿。
这两个增长率都非常的低,意味着国内游戏用户已经到天花板了,玩游戏的人口大概就是这个数量了,国内的游戏市场以后就没有增量用户了。
这会让游戏业的竞争进一步加强,公司的利润下降,从业人员的工资也不容易增长。
如何摆脱?
全力向外发展,开拓新市场。 比如为国外市场开发游戏,赚外国人的钱;二是开发VR/AR/元宇宙这些新类型的游戏,吸引之前不玩游戏的用户。
1、
我投失过至少9000次投篮,输了近300场比赛,26次没有命中最后的关键球。在生活中,我一次又一次地失败,这就是我成功的原因。
-- 迈克尔·乔丹
2、
过去几十年,中国农民从农村迁移到城市的工厂。我一直不明白,城市工厂的条件并不好,有些相当差,为什么有这么多农民去?
后来,我看了一部美国纪录片,想明白了。很多美国年轻人搬到洛杉矶去当演员,其中99%年轻人的生活会变得更糟,但是有机会逃离他们原来的处境,对很多人来说依然是一个强大的吸引力。
3、
重要的书都应该连着读两遍,因为第二遍读的时候,你已经知道结局了,这样才能真正理解开头。另一个原因是第二遍阅读时,你有不一样的心情,可能会从另一种角度看待问题。
-- 《叔本华论阅读和书籍》
4、
一只蝎子请求青蛙带他过河,青蛙害怕被蜇伤。蝎子说,如果他蜇青蛙,两者都会淹死在河里。青蛙就同意背他。但是,一到河中间,蝎子就蜇了青蛙。青蛙临死之前问:“为什么啊?” 蝎子回答说:“这是我的本性。”
这个故事告诉我们,不要跟本质有毒的人交易。
-- 《五堂永恒的课》
滑坡谬误(Slippery slope)指的是使用一连串的因果推论,夸大了每个环节的因果强度,而得到不合理的结论。
例二:孩子如果不上好的小学,就考不上好的中学,之后就考不进好的大学,接着会找不到好的工作,然后会穷困潦倒,一生就毁了!
看完这一篇,我有点感动。
故事是一位60岁的老爹,面对90岁的母亲,压力大的单位,女儿遭遇婚姻的不幸而抑郁,以及孙女这么多的问题而不知所措。
连岳的回答:
你没做错任何事情。一个男人负责任的样子,就是你的样子。从你身上,我们也可以看到一个负责任的人,到底有多厉害。
面对同样的任务,工作的压力叠加家中照顾三代人的压力(加上自己就是四代人),很多人即使不崩溃,也是乏力的、压抑的,难免抱怨和想逃避。而你的反应是:我有什么地方做得不好吗?我还有什么潜力可以挖吗?从你身上,也可以知道人为什么要负责任。负责任的人将会得到自信、力量、韧性及意义。负责任是给予,更是得到。
女儿的抑郁症,是由一个不负责任的男人诱发,也能由你这个负责任的男人治愈。这并非说她不需要医生,必要时,需要医生,但更重要的是,当她终于看到父亲是如何迎接挑战时,她也会得到自信、力量、韧性及意义。其实,在她婚姻失败中,父亲受到的伤害一样大,但父亲的眼界更开阔,看到老母亲,看到女儿,看到小孙女,看到家庭,也看到工作,没太多时间伤感,想到的是顶住,是行动,是安慰,是拯救。迟早,女儿也会变得像你一样,看到女儿,看到父亲,看到事业,看到更多,不再过多关注那个不负责任的人,不再只舔自己的伤口。人的成长,需要一次眼界打开的飞跃。再过几年,她甚至会感谢前夫表现得那么渣,不好不渣,拉拉扯扯,还不容易一刀两断,一了百了。
你怎么帮女儿?很简单,就是按你现在的样子生活,不多不少,不急不缓,你本身就是良药,可拔一切苦。
这一番话,很有力量,也很厚重。
美国纽约唐人街,林则徐像。
类似于一个vr虚拟社区,可以和朋友一块玩,但是有一些限制。
第一个日志并没有说明太多,你不知道REST调用是否成功。第二个日志就表明之前的操作是成功的。
// don't do that
log.info("Making request to REST API")
restClient.makeRequest()
// do that
restClient.makeRequest()
log.info("Made request to REST API")
典型的日志包含消息和参数列表两个部分。
第一条日志消息的缺陷在于,如果我们想在我们的日志工具中自动提取ID或参数,变得很困难。
而第二种方式以一种类似键值对的方式来提供参数,可以让我们提取更容易,也更容易扩展。
// don't do that
restClient.makeRequest()
log.info("Made request to {} on REST API.", url)
// do that
restClient.makeRequest()
log.info("Made request to REST API. [url={}]", url)
WARNING和ERROR之间的区别:
如果你做了一些实际有效的操作,但是出现了问题——这是警告。如果你做了一些操作,它根本没有任何作用——这是错误。
try {
restClient.makeRequest()
// 它可以想正常一样工作,这是一个INFO
log.info("Made request to REST API. [url={}]", url)
} catch(e: UnauthorizedException) {
// 这个错误代表访问某个url被拒绝,是我们预期内的异常,是一个警告。
log.warn("Request to REST API was rejected because user is unauthorized. [url={}, result={}]", url, result)
} catch(e: Exception) {
// 可能会因为意外异常而失败,这是一个错误
log.error("Request to REST API failed. [url={}, exception={}]", url, exception)
}
如果在警告的情况下,是你做了一些事情,但是你没有做的很完美,如果出现错误,是你压根没有进展。
请外,warning和error都是需要有人做出反应,并做某些事情才会用到,如果没有人关心错误和警告,您不需要进行记录。
INFO日志应该看起来像一本书,它告诉你发生了什么,而不一定是如何发生的。
INFO更适合类似业务的日志消息,与技术相关的消息应该是DEBUG。
例如下面的语言,如果单把INFO拿出来,就是一个完成的事情,但是不具备具体的细节信息,具体内部代码逻辑运作,通过DEBUG代码表示出来。
这样两个配合,就可以有很舒服的日志调试。
DEBUG | Saved user to newsletter list. [user="Thomas", email="thomas@tuhrig.de"]
DEBUG | Send welcome mail. [user="Thomas", email="thomas@tuhrig.de"]
INFO | User registered for newsletter. [user="Thomas", email="thomas@tuhrig.de"]
DEBUG | Started cron job to send newsletter of the day. [subscribers=24332]
INFO | Newsletter send to user. [user="Thomas"]
INFO | User unsubscribed from newsletter. [user="Thomas", email="thomas@tuhrig.de"]
微软最新的机器语音库,虽然在感情上还是不如人类,但是这个逼真的程度已经让我震惊。
发生在12月4日国际标准时7点44分的南极洲,可以看到南极洲是黑的,这表明越来此时就在南极的正上方,这个过程持续了2分钟。
2021年VR设备大爆发,Oculus公司的VR头盔Quest2售出了810万台,太过了Xbox游戏主机。
另外,Oculus的app占据了苹果商店免费应用的第一名,这说明大家在假期首选玩VR游戏。
VR技术可能来到了爆发的临界点,已经相当成熟了。 比如可以在游戏里健身,爬山。
南非穷人负担不起手机流量上网,只能在围墙栏杆外面,蹭学校的 Wifi 上网。Wifi 的密码是学生卖给他们的,用来换取一点午餐费。
讲述了富兰克林的生活思维和处世方式。
我们这个时代面对的最重要的问题,不再是匮乏,而是过于充裕。
现在的企业,往往都不是饿死的,而是撑死的。
讲的是放屁这件事的前因后果。这是一个3-6岁看的绘本。
但是太有意思了,我也很喜欢。
这本书在得到上架,这本书介绍未来工作的风格。
据说写的C和C++语言很好,正好我想学习一下C语言,就暂时先存一下。
这本在线刊物收集了世界众多黑客在逆向分析、渗透测试、生活感悟等方面的文章,再由编辑润色排版,图文并茂。国内网友特别制作了电子书,提供下载。
这本书里讲述了火箭科学家的思维。
这个是极客时间上的一个专栏,讲述了代码重构相关的内容
中国古籍的在线图书馆,提供古籍的高清彩色影像版本 PDF 文件下载。
目标是作为ES的替代者
在我们学校中会有一些课外兴趣小组,而我所处的组织,我们都称它为三月,因为它是三月诞生的。
这个组织里,每年寒暑假只放一周或两周的假期,在这个阶段,三月的管理上发生了什么事情?如何做得更好?想和你讨论一下。
每年新生都是9/10月份入学,加入到三月这个组织中。
往往第一次寒假是退组的高峰期,因为有一个艰难的抉择刺痛着内心——是留下学习?只有十天的假期。还是回家?享受一个半月的寒假。
不过,真正留下来的,享受寒假的奋斗的人,第二次反而会期待寒假的来临——那种密集的成长让人上瘾。
学校里往往会因为各种原因,分散大家的注意力,而寒暑假中,大家会进入一种高度的专注状态,对我而言,寒暑假非常珍贵,往往一个月假期,可以获得班级里的同学一学期,甚至一年要学习的东西,想要实现弯道超车,主要是靠这一段时间。
通常情况下,寒假的组织结构会相对比较简单,也不经常会有很大的活动,每天学学习,运动运动算是常规,然后该有的部室开展一下。
暑假会有一些不一样的地方,因为暑假的时间比较长,也比较热,常规会有健身活动,大家集体在健身房里办健身卡,集体游泳,运动。
我学会游泳,第一次下水就是在三月的暑假中,体验非常奇妙。
另外每天会有一些玩儿的时间,比如下午4:30~7:30可以去玩儿一些活动,比如扑克牌,狼人杀等,非常的欢乐。
另外偶尔会有大活动,整个三月的人在一起做游戏。
很可惜,我在三月的时间中,疫情占了大多数,所以我也就只有那一个暑假去了健身房而已。 后来的寒暑假,都伴随着疫情。
疫情中的寒暑假更简单了。
每天三签,线上会议打卡,早上10点起来做个操,下午运动运动,其它时间就是学学学,一天就这么过去了。
简单,充实,又惬意。