退租记

下定决心接了杭州公司的offer,上海的房子还有两月才到期,自己一开始也没想特别清楚,怎么才能让自己的损失最小,没有特别好的解决 方案,房东就开始催收下一期的房租了。 对于退租,以往每次都是必会吃亏,所以这次也是在想有没有什么好的方法。按照以往的经验,房东会让我自己找到接手的租客,才能退押金。 而我本身也不是个谈判能手,因此在挣扎许久之后,还是没能想到两全其美的办法,惟一的希望竟寄托在房东身上,指望望房东能够善良。 房东是一个近70左右的老人,据上一代租客说,房东在上海拥有几套房子,人很好,不缺钱,不计较。基于这些,我甚至抱了一丁点希望,希望 这个本土拥有几套房子的房东能够宽容些。 但正是这一丁点希望,也让我彻底认清,人的欲望是无止境的,不是你现在70了就无欲无求, 不是你现在有几套房就可以躺平。 具体的谈判,我个人是给出了折衷的方案,告诉房东,我没时间去找租客接手,我自愿放弃押金。还有我这期我只能租半个月,我只付半个月的 房费,对于我来说,其实我已经给出了让步了,因为我根本租不到半个月,最多10天。第二,我放弃押金,相当于我违约,我也认。 但房东似乎很抗拒,抗拒到什么程度呢?认为我应该早点说(我怎么早点说呢?我也只能拿到offer后才能说吧),还有就是我应该自己挂转租出去, 帮他转租,尽管我耐心的解释我违约了,押金不要了,但老人家似乎觉得我在坑他,觉得我押金既不要,还得花时间去帮他转租,甚至还要我支付一个月的 房费,我都这个月只住10天而已,就想让我预付一个月,让我去承担他可能用的空窗期风险。我一整个人呆住了,两人僵持了一会,他让我 室友想法子,室友让我预支水电网费,简直了,你们两真是祸害下一个租客去吧,我也懒得折腾,水电网费我预支了800(两个月没付 + 现在住的10来天的),真是 一点亏他们都不想吃,也是绝了。 所以,租房真得很难,没有几个房东真得会为租客考虑,他们只会考虑他们是否有空窗期,如果你押一付三,第一个月因为有事要离开这个城市, 嗯,他们就恨不得付二押一的钱全不想给你,就想让你承担房子空窗的风险,他们啥时候找到接手了才会给你,但理论上最多押金扣下而已。 我不知道国家对这样的房东会这样处置,我已经对现在的租房市场心如死灰。无论是二房东还是一房东,都是看房东人品的,并没有所谓的一房东 就可以好说话,实际上甚至比二房东还难说话。下次租房还是要谨慎点,特别别人转租的那种,还是和人合租的,千万不要轻信转租的人的话。

四月 22, 2023 · nobject

跑之伤,伤之痛

在失业的焦虑与愈来愈肥的双重夹击下,本想让自己动起来,来缓解这些负面因子,未曾想到,最终的结果却是让自己躺了一个月,真是可悲可气。 有时候,在你准备奋起的时候的打击,是致命的,这打击,直接让我颓了。 计划 我原本的计划是一周跑三次,每次跑3公里-5公里,状态不好跑3公里结束,身体状态不错就多跑点。 计划是否很完美?就这样履行计划才两周,也就是只跑了6次,不幸的事情就发生了。 逞能的代价 天气一般,有点冷风。我很纠结要不要出去跑,毕竟如果坚持不下去,那一切都毫无意义。但内心却是极度不愿意,不是出于身体的累,仅仅是觉得 这天气不太适合出去,毕竟跑步穿得很少,很薄,多多少少会有点冷。但本着坚持的理念,还是去了。 跑逆风时,风阻力是真大,所以跑得并不快。大概配速也就7公里/小时的速度。但两圈跑下来,却觉得下腿很难受,在想要不要继续坚持跑一圈, 就是这次坚持,让自己损失大发,咬着牙跑完了,都没力气做拉伸,因为腿部当时就不舒服了,个人想着要不要多拉伸会,觉得这样会好点, 结果就是,回去时腿很不舒服,但想想应该歇两天就好了,也没多想。 作死乱跑 第二天,虽然小腿有点反应,但并不影响出去走走,失业时,我向来不喜欢白天呆在家里,我怕那种郁郁寡欢的感觉。因此还是找了个公司出去逛逛, 这一逛就是一下午,走的步数着实有点多了。但腿还成,也没反应激烈。第三天,还想着出去跑,又找了个公园逛逛,公司实在太大,最后, 自己一瘸一拐的回来,腿反应严重,这就是作死啊,简直后悔都来不及。 就医 作死乱跑后的几天,腿越来越伤,直到几乎走不了路,想着太严重了,必须得去医院瞧瞧。 第一次,去了华山医院,医生并没看腿,在膝盖处给我按了几处,认为我就是膝盖右侧下支撑位骨头支撑不住,才会这么疼,建议我不要 运动了,以防径骨处骨裂,我很赞同。医生给开了钙片和贴膏,一个星期如果没好转再去医院检查。 我对医生的建议是赞同的,并也在执行医嘱。无奈,很快一星期就过去了,腿更伤了,伤到啥程度呢?走个200米都走不下来,我再次去看 医生时,我是走到小区门口打车过去的,真得那时候觉得自己腿废了。在车上,我竟然哭了,觉得上天不公,本就焦虑抑郁的我,还要承担 腿伤带来的痛苦,真得苦不堪言。 我预约的专家号,期望他能给出更好的建议,很遗憾,专家给我的建议只有休息,然后给我开了检查,一次好像要700多的核磁共振,而且预约只能 两周后,我很犹豫要不要预约,毕竟两周的时间,还有没有必要呢? 想了两方法,一个是朋友告诉我的,走急诊通道。然后我就去急诊了,问了医生,我说走不了路了,医生很淡定的问,啥时候的事?我很天真的告诉他, 两周了,医生瞥了我一眼告诉我,你不符合规定,他们只接收24小时内出问题的。所以,现实是我很无奈,只能慢悠悠的瘸着去想办法。 另一个办法就是去另一家医院看看,能不能当天检查,在百度的排行榜上,六院的骨科才是全国有名的,上海最好的,我突然觉得当初自己就是做了错误的 决定,早应该去六院的。吃完中饭,就拖着我的老残腿过去,医生说的很简单直白,让我照个X光就行,X光排队就要1小时,那位置也是排得满满当当, 没地方坐,站着腿又受不了,蹲下的话,腿也受不了,那酸爽,大概等了10分多钟,才找到一个位置,简直艰难。 X光的结果又得半小时,所幸结果并未有异常。所以医生这边开的药也是药贴与药膏,还让我穿护膝,多保护保护膝盖。就这样,我拖着残腿安心的回去躺平了。 躺平 没有别的任何办法,只能贴药贴,涂药膏来慢慢缓解疼痛。 第一周,疼痛感没有明显消失,有点心急,第二周,慢慢开始缓解,终于看到希望。 果然伤筋动骨的事只能慢慢恢复的,欲速则不达。 忠告 跑完腿有反应千万要让自己多休息,别在外面瞎跑了,那是加速你腿伤的催化剂。 坚持的意义?拥有良好的身体状态才是坚持的最终目标,如果身体状态不佳,就不要有执念一定要坚持下去,那样可能得不偿失 就医最好找行业内最好的医院,能够更精准,设备更完善

四月 7, 2023 · nobject

无奈的摆烂

大概我的心里早就摆烂了吧,投了几十份简历后的心灰意冷,失业5个月后的心态失衡。 这些天,我一直在心底里给自己发问,我努力了么? 似乎,我早已忘记了努力两个字,它代表的是什么意义。 我还在恐惧么?一直以来我都是社恐内向的,我很害怕被问的哑口无言,我很害怕突如其来的失败,可是,当失败来临的时候,我又该怎么与自己和解。 对于失败或者无人问津,我却也给自己找好了借口,一切都推给大环境,推给市场寒冬,却无法正视着自己的无能,我常常掩饰着内心的失落,笑着怪市场环境。但内心深处, 可能也只有我自己知道,我以后还能做些啥,我在被淘汰的边缘,挣扎过,无可适从过,却不知道如何爬起来。 夜深了,该死的焦虑感又来了,为我这几天的摆烂而烦恼。那死去的灵魂在呐喊,快为自己活着而努力吧。

三月 9, 2023 · nobject

golang 面试题集

Go 中的 rune 和 byte 有什么区别? Go 中的 string 和 []byte 有什么区别? 什么是深拷贝和浅拷贝? Go 中的 slice 和 array 有什么区别?slice的扩容机制与扩容时机,使用slice该注意什么 说说 Go 中闭包的底层原理? 说一下 GMP 模型的原理 Go 的默认栈大小是多少?最大值多少? Go 中的分段栈和连续栈的区别? 简述一下 Go 栈空间的扩容/缩容过程? GMP 为什么要有 P ? Go 中的 GC 演变是怎样的? 哪些情况会导致协程泄露? 内存分配原理 gin框架的路由实现原理 go中http库的实现原理 代码题:使用n个并发,输出[]string{“a”, “b”, “c”, “d”, “e”, “f”, “g”} 代码题:实现一个简单的协程池 代码题:使用并发编排,使abc三个各输出100次 map的底层实现原理,如果一个协程在delete, 一个协程在读,会出现什么问题,原因是什么 uinptr和unsafe.Pointer的区别 singleFlight存在的坑

二月 22, 2023 · nobject

算法笔记

滑动窗口 双指针 贪心 动态规划 排序 二叉树

二月 22, 2023 · nobject

算法笔记 - 二叉树

递归模板 1 2 3 4 5 6 7 8 9 10 func traverse(root *TreeNode) { if root == nil { return } // 前序位置 traverse(root.Left) // 中序位置 traverse(root.Right) // 后序位置 } 层序遍历 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 // 输入一棵二叉树的根节点,层序遍历这棵二叉树 func levelTraverse(root *TreeNode) { if root == nil { return } q := make([]*TreeNode, 0) q = append(q, root) // 从上到下遍历二叉树的每一层 for len(q) > 0 { sz := len(q) // 从左到右遍历每一层的每个节点 for i := 0; i < sz; i++ { cur := q[0] q = q[1:] // 将下一层节点放入队列 if cur....

二月 22, 2023 · nobject

黄山行

期待 黄山,从大学时期至今,心中一直念念不忘,屡次在心中的萌发出的小火苗,都被一些小小借口浇灭的干干净净。 我曾想过,等我游历五岳后再登黄山,毕竟“黄山归来不看岳”的诗句,让我觉得黄山很神秘很美也怕归来后对五岳行的想法产生影响。 我曾想过,等我和至爱一起在光明顶上看日出日落,也是一件浪漫的事,当然也只是想想而已,因为哪有至爱。 我曾想过,离我家乡这么近的景点,如果哪天我想去甚至可以分分钟的达成心愿,这种可以唾手可得的感觉,总让人不免做出这样的优先级。 正是种种的思想,让我在一年年的岁月中,充满期待却不曾走进。 计划 契机,失业了,失业后的焦虑,常常让我夜不能寐。旅行,一种能消除焦虑的清洁剂,多多少少总能缓解这种负面的情绪的。 此时,黄山行,也该提上日程了,终于,按捺不住心中的那团火,开始规划行程与攻略,选择了雪后黄山。南方天气,向来见雪较少,见雪山的机会也是小的可怜。 也该了了心愿去体验一回南方的雪山。 对于自己曾经想过的那些借口,计划与他们相背驰,没有去征服五岳,也许一辈子都没机会。没有与至爱一起,也只是孤独前行。对,也许残缺也是一种美。 从上海到黄山的车票已就位,黄山的山底下是雨天,而山顶却在酝酿着一场大雪。第一天的行程就是坐车然后在山脚下住个旅店,然后买好装备(钉鞋,自热饭,手套等),疫情才解封的黄山,甚是凄凉,寥寥数人,在风雨交迫的天气下,多少能感受到那种深入骨髓的冰冷,这种冷,却无法浇灭心中的热情。 第二天,7点钟到了酒店大堂,吃了早餐,7点30,酒店的车送到南大门,此时,还是可以看到不少游客慕雪而来,都想目睹雪后黄山的风采。 排着长队,跟着摆渡车进入黄山山脚,然后从山脚上坐缆车上山。我的计划是后山上前山下,前山陡峭险峻,后山平缓,对于我这种下山可以飞,上山像蜗牛的人来说,这种选择是极好的。 在缆车上,我们不禁惊叹,就像没见过世面的土狗一样,拍拍拍。然而,下了缆车的那一瞬间,你就会觉得这一趟值了。 洁白厚厚的雪,覆盖了青松与群山,世界已然变成了黑白灰,对,远处的景,就是水墨,那不是画中才有的景,那一刻在脑海里的,都想永远的记住。而拿起手机准备好好记录时,冷风让手冻的麻木,匆匆几分钟,就已经禁受不住了。也许雪山,更多的只能印在心里。 说说几个值得去的点,如信峰,看群山绝佳位置,有点险,特别是雪天。梦笔生花,简直就是水墨画里出来的。猴子观海,要走比较多的路,不太好拍。飞来石,很不错。光明顶,看日落日出绝佳位置,人很多,没有好机位,可能就是看个寂寞。 光明顶的日落,很美,只是拍摄技术一般,没拍出那种感觉。 晚上的黄山是绝冷的,但有兴趣的可以在黄山上拍到银河。住的是200左右一晚的白鹅宾馆,看日出也可以他们这边看,也许比光明顶人少,更容易观看。但200一晚的10人间,体验只能说,想睡着很难,打呼的至少有3个以上,此起彼伏,这辈子我都没见过这么大的阵仗。当然也可以听听老摄影师讲他的摄影心得以及他的摄影作品。 第二天一早就光明顶看日出了,但果然已经人满为患了,扑腾半天,只能看看,拍是不可能的了。这也许是个错误的决定,还不如在白鹅那边观赏。 日出结束,就匆忙下山了,前山确实要险峻与陡峭很多,下山如果有雪最好穿钉鞋。迎客松在前山索道位置,下来还是有一段距离的。但迎客松怎么都得打卡一下的吧 感想

二月 7, 2023 · nobject

面试 - 网络

网络面试要点整理 标签(空格分隔): tcp udp socket 网络 tcp为什么是三次握手 1 2 3 4 TCP 建立连接时通过三次握手可以有效地避免历史错误连接的建立,减少通信双方不必要的资源消耗,三次握手能够帮助通信双方获取初始化序列号,它们能够保证数据包传输的不重不丢,还能保证它们的传输顺序,不会因为网络传输的问题发生混乱,到这里不使用『两次握手』和『四次握手』的原因已经非常清楚了: 『两次握手』:无法避免历史错误连接的初始化,浪费接收方的资源; 『四次握手』:TCP 协议的设计可以让我们同时传递 ACK 和 SYN 两个控制信息,减少了通信次数,所以不需要使用更多的通信次数传输相同的信息; 三次握手流程 1 2 刚开始客户端处于 Closed 的状态,服务端处于 Listen 状态。 客户端发送一个 SYN (Synchronize) 标志设为1 的包,指明客户端要连接服务器端的接口,发送完毕后,客户端进入 SYN_SENT 状态 服务器发回确认包 (ACK) 应答,即 SYN标志位和ACK标志位均为1。服务器端选择自己ISN序列号(为防止固定值可能被攻击,而使用相关的算法得到的一个随机序列号),放到 Seq 域里,同时将确认序号(Acknowledgement Number)设置为客户的 ISN 加1,即X+1。 发送 完毕后,服务器端进入 SYN_RCVD 状态。 客户端再次发送确认包(ACK),SYN 标志位为0,ACK 标志位为1,并且把服务器发来 ACK 的 序号字段+1,放在确定字段中发送给对方,并且在数据段放写ISN的+1, 最后双方都会进入established状态 四次挥手流程 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 刚开始双方都处于 ESTABLISHED 状态,假如是客户端先发起关闭请求。四次挥手的过程如下: 第一次挥手:客户端发送一个 FIN 报文,报文中会指定一个序列号。此时客户端处于 FIN_WAIT1 状态。 即发出连接释放报文段(FIN=1,序号seq=u),并停止再发送数据,主动关闭TCP连接,进入FIN_WAIT1(终止等待1)状态,等待服务端的确认。 第二次挥手:服务端收到 FIN 之后,会发送 ACK 报文,且把客户端的序列号值 +1 作为 ACK 报文的序列号值,表明已经收到客户端的报文了,此时服务端处于 CLOSE_WAIT 状态。 即服务端收到连接释放报文段后即发出确认报文段(ACK=1,确认号ack=u+1,序号seq=v),服务端进入CLOSE_WAIT(关闭等待)状态,此时的TCP处于半关闭状态,客户端到服务端的连接释放。客户端收到服务端的确认后,进入FIN_WAIT2(终止等待2)状态,等待服务端发出的连接释放报文段。 第三次挥手:如果服务端也想断开连接了,和客户端的第一次挥手一样,发给 FIN 报文,且指定一个序列号。此时服务端处于 LAST_ACK 的状态。 即服务端没有要向客户端发出的数据,服务端发出连接释放报文段(FIN=1,ACK=1,序号seq=w,确认号ack=u+1),服务端进入LAST_ACK(最后确认)状态,等待客户端的确认。 第四次挥手:客户端收到 FIN 之后,一样发送一个 ACK 报文作为应答,且把服务端的序列号值 +1 作为自己 ACK 报文的序列号值,此时客户端处于 TIME_WAIT 状态。需要过一阵子以确保服务端收到自己的 ACK 报文之后才会进入 CLOSED 状态,服务端收到 ACK 报文之后,就处于关闭连接了,处于 CLOSED 状态。 即客户端收到服务端的连接释放报文段后,对此发出确认报文段(ACK=1,seq=u+1,ack=w+1),客户端进入TIME_WAIT(时间等待)状态。此时TCP未释放掉,需要经过时间等待计时器设置的时间2MSL后,客户端才进入CLOSED状态。 收到一个FIN只意味着在这一方向上没有数据流动。客户端执行主动关闭并进入TIME_WAIT是正常的,服务端通常执行被动关闭,不会进入TIME_WAIT状态。 为什么需要四次挥手 1 2 3 因为当服务端收到客户端的SYN连接请求报文后,可以直接发送SYN+ACK报文。其中ACK报文是用来应答的,SYN报文是用来同步的。 但是关闭连接时,当服务端收到FIN报文时,很可能并不会立即关闭SOCKET,所以只能先回复一个ACK报文,告诉客户端,“你发的FIN报文我收到了”。只有等到我服务端所有的报文都发送完了,我才能发送FIN报文,因此不能一起发送。故需要四次挥手。 time_wait状态为什么需要等待2MSL 1 2 1....

十一月 6, 2022 · nobject

golang面试 - map

golang map底层实现 1 2 3 4 5 6 7 golang使用数组的方式实现map,hmap里包含buckets,buckets的长度为2^B次方的数组,每个bucket的元素为bMap,当有hash(计算出来的hash的后B位)冲突时,会将其塞到bMap的keys与vaLues,bMap的topbits存储的是topHash(计算出来完整的hash的前8位) 如果冲突的数量太多,会有指针指向溢出桶的位置。 相比最常规的hashmap,有什么优点: 使用掩码方式获取偏移,减少判断。 bucket 存储方式的优化。 通过tophash 先进行一次比较,减少key 比较的成本。 map的底层实现原理 一般map的实现,有一个数组,用于指向真正的值的指针,使用拉链法来解决key值冲突 整个流程大致如下: 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 key | v +------------------------------------+ | key通过hash函数得到key的hash | +------------------+-----------------+ | v +------------------------------------+ | key的hash通过取模或者位操作 | | 得到key在数组上的索引 | +------------------------------------+ | v +------------------------------------+ | 通过索引找到对应的链表 | +------------------+-----------------+ | v +------------------------------------+ | 遍历链表对比key和目标key | +------------------+-----------------+ | v +------------------------------------+ | 相等则返回value | +------------------+-----------------+ | v value go中的map...

十一月 4, 2022 · nobject

golang面试 - 内存结构

参考文章 https://zhuanlan.zhihu.com/p/59125443 https://draveness.me/golang/docs/part3-runtime/ch07-memory/golang-memory-allocator/ https://mp.weixin.qq.com/s/3gGbJaeuvx4klqcv34hmmw https://www.cnblogs.com/zkweb/p/7880099.html https://www.infoq.cn/article/IEhRLwmmIM7-11RYaLHR 逃逸分析 通过检查变量的作用域是否超出了它所在的栈来决定是否将它分配在堆上的技术, 其中变量的作用域超出了它所在的栈,这种行为称为逃逸。 好处: 函数返回直接释放,不会引起垃圾回收,对性能没有影响 减少内存碎片的产生 减轻分配堆内存的开销,提高程序的运行速度 可能产生逃逸的情况 指针作为返回值(方法得非内联,如果被内联优化,有可能并未逃逸) 什么时候从Heap分配对象 很多讲解go的文章和书籍中都提到过, go会自动确定哪些对象应该放在栈上, 哪些对象应该放在堆上. 简单的来说, 当一个对象的内容可能在生成该对象的函数结束后被访问, 那么这个对象就会分配在堆上. 在堆上分配对象的情况包括: 可能逃逸的场景: 返回对象的指针 传递了对象的指针到其他函数 在闭包中使用了对象并且需要修改对象 使用new 1 2 3 4 5 6 7 8 9 10 11 12 type People struct { Name string Age int } //go:noinline func NewPeople(name string, age int) *People{ p := new(People) p.Name = name p.Age = age return p } 栈空间不足逃逸,比如大array或者slice 1 2 3 4 5 6 func BigArr() { arr := make([]int,8193) for i :=0;i <=1000;i++ { arr[i] = i } } 动态类型逃逸 1 2 3 4 5 func DynamicType() { var a interface{} a = 5 fmt....

十一月 4, 2022 · nobject

golang面试 - 接口

golang 实现多态的方法 1 2 3 4 5 6 7 8 9 10 11 继承与多态的特点 在golang中对多态的特点体现从语法上并不是很明显。 我们知道发生多态的几个要素: 1、有interface接口,并且有接口定义的方法。 2、有子类去重写interface的接口。 3、有父类指针指向子类的具体对象 空接口与非空接口与nil的判断 空接口eface结构 1 2 3 4 type eface struct { //空接口 _type *_type //类型信息 data unsafe.Pointer //指向数据的指针(go语言中特殊的指针类型unsafe.Pointer类似于c语言中的void*) } _type属性:是GO语言中所有类型的公共描述,Go语言几乎所有的数据结构都可以抽象成 _type,是所有类型的公共描述,**type负责决定data应该如何解释和操作,**type的结构代码如下: 1 2 3 4 5 6 7 8 9 10 11 12 13 type _type struct { size uintptr //类型大小 ptrdata uintptr //前缀持有所有指针的内存大小 hash uint32 //数据hash值 tflag tflag align uint8 //对齐 fieldalign uint8 //嵌入结构体时的对齐 kind uint8 //kind 有些枚举值kind等于0是无效的 alg *typeAlg //函数指针数组,类型实现的所有方法 gcdata *byte str nameOff ptrToThis typeOff } data属性: 表示指向具体的实例数据的指针,他是一个unsafe....

十一月 4, 2022 · nobject

[转]golang面试 - Rune与Byte的区别

以下文章转自 https://iswbm.com/517.html 一个字符串是由若干个字符组合而成的,比如 hello,就由 5 个字符组成。 在 Go 中字符类型有两种,分别是: byte 类型:字节,是 uint8 的别名类型 rune 类型:字符,是 int32 的别名类型 byte 和 rune ,虽然都能表示一个字符,但 byte 只能表示 ASCII 码表中的一个字符(ASCII 码表总共有 256 个字符),数量远远不如 rune 多。 rune 表示的是 Unicode字符中的任一字符,而我们都知道,Unicode 是一个可以表示世界范围内的绝大部分字符的编码, 这张表里几乎包含了全世界的所有的字符,当然中文也不在话下。 能表示的字符更多,意味着它占用的空间,也要更大,所占空间是 4个 byte 的大小。 下面以一段代码来验证一下他们的占用空间的差异 1 2 3 4 5 6 7 8 var a byte = 'A' var b rune = 'B' fmt.Printf("a 占用 %d 个字节数\n", unsafe.Sizeof(a)) fmt.Printf("b 占用 %d 个字节数\n",unsafe.Sizeof(b)) // output a 占用 1 个字节数 b 占用 4 个字节数 参考文档: https://iswbm....

十一月 4, 2022 · nobject