普通视图
儿童节快乐
终于,房贷的第二次提前还款成功了。第一次扣钱的时候,有五万莫名其妙转成了定期,导致扣款失败,从另外一张卡重新转了十万进去才凑够提前还款的金额。
昨天下午看的时候,已经把钱扣走了。小的时候,那种平均的贫穷状态,看不出太大的区别,哪怕是有小微富裕的邻居,也并没有有那么悬殊的差距,小的时候也不知道钱有用。等长大了才发现,钱真的是太重要了,想要挣钱也真的太难了。
上午收到少年儿童基金会的邮件:
看了下那些小小的心愿,有学习用品还有体育用品,选了一个学习用品进行了捐助:
去年开始的月捐,到这个越也已经进行到第七个月了:
之前还收到过线下访问邀请,不过要访问的地区太远了,终难如愿。
只是希望,孩子们都能有学上,没有经济负担,可以安心上学。
短视频看多了,总是容易让人产生一种天下大同的感觉,然而,现实从来不是如此。
希望每个孩子都有一个美好的童年。
孩子气
周五的时候,忽然接到一个项目的验收通知。甲方通知周六下午两点半组织专家进行验收,这个小项目的成员不多,一共才几个人。几个比较熟悉情况的周末刚好有点事情,只能自己让宝子的姥爷带包子去上课,自己准备去奔赴这几百公里之外的验收。
网上刷段视频的时候,接到同事电话,说领导对于创建的代码仓库有意见,说我们在糊弄,后端代码都编译不过去。
听到这消息,不禁让我对于这领导的能力以及吹嘘的所谓的ai无所不能的论调产生了怀疑。既然你说ai无所不能,那连一个简单的编译报错都解决不了?更何况我下午还刚编译发版了,虽然是屎山代码,该修复的bug还是要修复的,毕竟修复一个少一个。
拉了个线上会议,上来就问,你们这个前后端一起的项目就两个文件夹?两个gitignore都没有?
说实话就是,这个破玩意儿本来就不是前后端放到一起搞的,你要放到一起搞,才给你扔到了一起,现在又开始说缺少ai约束文件等等。至于那个ignore文件,根目录以及前后端项目,每个项目都有独自的gitignore文件,也不知道是眼瞎还是神马的。扯了一通,最后说,等周一再说吧。
下线之后,我直接远程公司的电脑,编译通过之后发了个截图扔到了群里。
这种事情倒是也在意料之内,太多的人拿着所谓的一知半解,就觉得自己无所不知无所不晓,开始导出指挥。我依然记得多年前一家公司招来的研发总监,那种表面文章做到极致的做法自己真的是佩服,连邮件都写得高深,最牛逼的莫过于里程碑不写里程碑,非得拽英文,mile stone还拼错了,写了个mail stone,当时我对着发的通知看了半天实在没想明白这邮石是什么高级货?数秒之后才反应过来他想写的是mile stone。
对于这种事情,自己也有清醒的认知,主要是自己的脸皮跟这些人比起来还是太薄了。对于自己做不到的事情,或者实现不了的东西,总是无法心安理得承诺别人,内心的那种孩子气残留至今,注定没做渣女的潜质。
从12306订好翌日的 车票,开始在网上瞎溜达,看到了一篇很有意思的文章,叫做星链:《换友链还在发邮件?——独立博客缺的不是工具,是一张网 – 蛋蛋之家|一枚蛋蛋的自留地》。来一张蛋蛋的配图,大概就知道是什么东西了。
以我浅薄的理解力,我觉得就是制造了一个可见的网络,这个网络让关系变得更加直观了。搂了一眼没有wp,随便聊了聊,不过这个东西的确给自己一些灵感,忽然也想做个类似的玩具。之所以说是个玩具,初期规划就是如此。一款产品从开始要落地有太长的路需要走。
翌日,带着笔记本,踏上去临沂的高铁。去趣域找好玩的域名,现在虽然是想法有了,但是名称与域名都没有。既然要做个玩具,那就要做得专业。哪怕这个东西,后来死掉了,也要看起来像那么回事。思来想去,辗转反侧最后注册了一个nilai.la.中文名字也很简单,就叫做:你来啦!
至于展现身形,最开始也想过这种太空样式的,不过这种做法有个问题,我想要在太空定位每个站点的位置,三维定位固然不错,不过当时没想好怎么去实现这个定位(虽然现在有一些想法了)。退而求其次,转为平面地图,这个地图的设计也简单,直接基于网站的ip地址进行映射,映射到一个平面区域内,在映射之后ip地址越相近的会离得越近。当然,除此之外,我还加了一张地图,可以根据服务器的ip地址进行地里位置显示。这就是我现在实现的这个小玩意儿。
虽然是周六,似乎出城的人不多,高铁站空空荡荡:
在到临沂之前,在高铁上完成了虚拟地图的显示:
到站之后,委托方安排了个接站的,开了一辆非常小的小车。一点多,去羊汤馆简单的吃了点东西,去厕所的时候,看到了这么一个标语:
he,大临沂果然还是厉害。
下午的验收汇报,我们的委托方对于验收流程一无所知,甚至连验收材料都没打印。等开始验收之后,我这本来以为去打酱油的,结果成了汇报主力,就尼码离谱。从两点半扯到四点半,口干舌燥,好在最后还是验收通过了。我现在对于吃也没什么兴趣,婉拒了委托方晚饭的邀请,直接买了回城的高铁票,五点的依然是赶不上了,只能买到六点四十多的。
临沂北站里面真的干净,啥东西都没有,百无聊赖只能继续折腾那点破代码。
一天的暴力使用,笔记本的电量等到了高铁上已经只剩下10%了,找了半天没找到插座,无奈拿出充电宝给笔记本充电。手机开热点,手机的电量也耗的差不多了,结果再插上手机之后,笔记本不充电了。
回头才发现,原来充电插座在座椅中间,另外一排的一个姐妹手机正插在插座上充电。仿佛一瞬间抓到了救命稻草。
经过一天的旅程,在路上把整个系统的架子也就搭的差不多了,一些基础的功能也已经具备。
周日,陆陆续续,又开发了一些其他的模块,包括插件等等。当然,目前跟一个成熟产品还差距很远。不过看起来,像是那么回事了。
插件目前有wp和tp,其他的暂未开发,wp测试过了,tp尚未测试:
插件以及接口文档下载:plugins
由于产品尚未完备,目前开放邀请注册,邀请码:
INV-4Q4N-2KQB-6J91 已使用 INV-2JOY-X1NF-PA1Z 已使用 INV-BE9C-7P1W-XYT2 已使用 INV-PP5V-QVSG-WW8Z 已使用 INV-CH5C-LU7B-JVM1 已使用 INV-S970-RIRN-LDUE 已使用 INV-0H12-BQAY-Q5JY 已使用 INV-DREQ-V0C7-F6FL 已使用 INV-XIH4-EM3W-1GSR 已使用 INV-IN7A-YX10-VY0A 可用 INV-EDKY-M9U3-24GJ 可用 INV-PD8N-1RGT-MUKP 可用 INV-UY5Q-7ALX-G8P0 可用 INV-T90M-W48Y-MN1Q 可用 INV-LRSS-BZGW-KZUM 可用 INV-9Q6H-ADH7-ZDYG 可用
就这样,一个周末的时间就没了,就这么恍恍惚惚的做了这么一个东西。至于有啥用其实也没啥用,今天是个好日子,儿童节,发布这个一个孩子气的小玩意儿也蛮好的。
毕竟,除此之外,我也不知道还能有啥可玩的。
祝大家永远都能保持童真,远离世俗纷扰。
Python的协程
未完待续
1.协程
协程(coroutine),又叫微线程或虚拟线程,是一种用户态的上下文切换技术,python中的协程,是通过一种可以被挂起,并且挂起后还能恢复执行的函数来实现的
某些操作会造成当前线程CPU发生阻塞,比如I/O操作,I/O操作不需要当前线程执行,但是当前线程提交了操作后也要白白等待一段时间拿到数据,才能继续执行,之前可以使用多线程来同时进行多路I/O操作,让子线程阻塞,主线程干些别的,而协程可以实现的就是让单个线程进行多路I/O操作时,也可以不需等待。
python中,协程可将多路I/O操作拆为多个方法,每个方法执行一路,事件循环实时监测各个方法状态,哪个方法阻塞了,事件循环迅速切换其他不阻塞的方法继续执行,而且这一切都发生在一个线程内。
![]()
2.async和协程函数
在python中,将一个普通函数加上async关键字,就会变成一个协程函数,执行协程函数,函数本身不会被调用,而是直接返回一个协程(coroutine )对象
async def a(): print('a') return 1async def b(): print('b') return 2task1 = a()task2 = b()if __name__ == "__main__": print(task1) print(task2)<coroutine object a at 0x000001D4A91E5A80><coroutine object b at 0x000001D4A91E59C0><sys>:0: RuntimeWarning: coroutine 'a' was never awaited<sys>:0: RuntimeWarning: coroutine 'b' was never awaited3.asyncio和await
要使得协程函数执行,需要asyncio.run()来调用协程函数,asyncio的原理,是将协程函数包装成任务,交给事件循环,事件循环就是一个死循环,不断轮询检查管理的协程函数的状态,发现谁阻塞了,立即将执行权拿走,交给其他未阻塞的协程函数继续执行当前线程
协程函数的返回值,也是从asyncio.run()的调用拿到
import asyncioasync def a(): print('a') return 1task1 = a()if __name__ == "__main__": r = asyncio.run(task1) print(r)a1<sys>:0: RuntimeWarning: coroutine 'b' was never awaitedawait对于python协程非常重要,关系着协程是否真正实现
事件循环基于await判断程序是否阻塞,遇到await后接的是需要等待的操作,CPU控制权便交给了事件循环,await后面的代码执行的同时,事件循环也会将执行权拿走,交给其他未阻塞的协程函数继续执行当前线程(如果有的话)
如果协程函数中没有await一个需要等待的操作,事件循环永远不会得到CPU控制权,当前函数一直执行下去,其他未阻塞的协程函数也不会得到执行权
await后面只能接可等待的对象:Future,其他协程函数,Task。
await只能出现在async修饰的函数中,这是python语法的规定。
例:协程函数中没有await一个需要等待的b(),b()执行完才会跳出继续执行a()
import asyncioasync def a(): print('a before') await b() print('a after') return 1async def b(): print('b') return 2task1 = a()if __name__ == "__main__": r = asyncio.run(task1) print(r)a beforeba after1例:协程函数中await了一个需要等待的b(),b()执行asyncio.sleep(5)模拟阻塞,但是因为事件循环中只是asyncio.run(task1)了一个task1任务,因此仍然是继续等待b()执行完成
import asyncioasync def a(): print('a before') await b() print('a after') return 1async def b(): print('b') await asyncio.sleep(5) return 2task1 = a()if __name__ == "__main__": r = asyncio.run(task1) print(r)a beforeba after1例:多任务同步执行:协程方法main()中,启动其他三个协程方法,但是事件循环中只管理一个main(),因此三个协程方法a,b,c之一出现阻塞时,事件循环不会转移执行权到另两个。
import asyncioasync def a(): print('a') await asyncio.sleep(5) return 1async def b(): print('b') await asyncio.sleep(5) return 2async def c(): print('c') await asyncio.sleep(5) return 2async def main(): task1 = a() task2 = b() task3 = c() await task1 await task2 await task3if __name__ == "__main__": print('start') asyncio.run( main() ) print('end')startabcend上述,都是不涉及事件循环切换任务的同步执行,实际场景使用更多的是涉及事件循环切换的异步执行
例:通过asyncio.create_task()方法,可以将协程函数包装为可以被事件循环调度的任务,并注册到事件循环中,main()和a(),b(),c()先后加入到事件循环
main()本身也是这个协程中的一环,其中三个函数执行或挂起,会导致它作为一个“容器”也被挂起,只有三个函数都执行完,main()才会继续
import asyncioasync def a(): print('a before') await asyncio.sleep(5) print('a after') return 1async def b(): print('b before') await asyncio.sleep(5) print('b after') return 2async def c(): print('c before') await asyncio.sleep(5) print('c after') return 2async def main(): task1 = asyncio.create_task( a() ) task2 = asyncio.create_task( b() ) task3 = asyncio.create_task( c() ) # 加入事件循环后,启动 v1 = await task1 v2 = await task2 v3 = await task3 print(v1) print(v2) print(v3)if __name__ == "__main__": print('start') asyncio.run( main() ) print('end')starta beforeb beforec beforea afterb afterc after122end写一堆await总是很繁琐的,还可以通过asyncio.gather()将多个协程对象同时注入事件循环,并在全部执行完成后,一次性拿到所有结果
import asyncioasync def a(): print('a before') await asyncio.sleep(5) print('a after') return 1async def b(): print('b before') await asyncio.sleep(5) print('b after') return 2async def c(): print('c before') await asyncio.sleep(5) print('c after') return 2async def main(): res = await asyncio.gather(a(), b(), c()) print(res)if __name__ == "__main__": print('start') asyncio.run( main() ) print('end')starta beforeb beforec beforea afterb afterc after[1, 2, 2]endPython多进程
未完待续
1.进程
进程是操作系统进行资源分配的基本单位,每个进程拥有一块独立的内存空间,可以通过python os模块的方法来获取当前运行python程序的所属进程号和父进程号,在任务管理器中,通过进程号能查找到对应进程
import osprint(os.getpid())print(os.getppid())2751613228在Pycharm IDE中启动python解释器时,父进程往往就是Pycharm IDE
![]()
![]()
2.创建进程
python使用multiprocessing.Process类来管理进程,创建进程时就要通过target制定好进程将要执行的任务,创建后,调用start()方法,向操作系统申请进程,将该进程交给操作系统进行调度,子进程才会真的启动。可以使用multiprocessing.current_process()方法获取当前进程
创建进程的Process(target=study)必须出现在 if __name__ == '__main__':内,因为当新进程创建时,python底层会启动一个新的解释器,再次运行study函数所在py文件,只获得study函数的定义交给子进程,如果没有 if __name__ == '__main__':判断,Process(target=study)也会被新的解释器进程执行到,最终出现死循环创建进程
当子进程的解释器运行py文件时,
__name__也是有值的,它的值是:__mp_main__
执行时,主/子进程执行是异步的,子进程执行不影响主进程
子进程之间也不一定是先start()的先执行,一切以操作系统调度为准
import osimport timefrom multiprocessing import Process, current_processprint('hello world ', __name__)def study(): for i in range(100): print('%s %s 父进程 %s 进程 %s Study' % (current_process(), i, os.getppid(), os.getpid()) , end='\n') time.sleep(1)def speak(): for i in range(100): print('%s %s 父进程 %s 进程 %s speak' % (current_process(), i, os.getppid(), os.getpid()) , end='\n') time.sleep(1)if __name__ == '__main__': print('主进程开始执行') task1 = Process(target=study) task2 = Process(target=speak) print('主进程 ', os.getpid()) p1 = Process(target=study) p2 = Process(target=speak) p1.start() p2.start() print('主进程结束执行')hello world __main__主进程开始执行主进程 12080主进程结束执行hello world __mp_main__<Process name='Process-3' parent=12080 started> 0 父进程 12080 进程 45936 Studyhello world __mp_main__<Process name='Process-4' parent=12080 started> 0 父进程 12080 进程 44440 speak<Process name='Process-3' parent=12080 started> 1 父进程 12080 进程 45936 Study<Process name='Process-4' parent=12080 started> 1 父进程 12080 进程 44440 speak<Process name='Process-3' parent=12080 started> 2 父进程 12080 进程 45936 Study<Process name='Process-4' parent=12080 started> 2 父进程 12080 进程 44440 speak<Process name='Process-3' parent=12080 started> 3 父进程 12080 进程 45936 Study<Process name='Process-4' parent=12080 started> 3 父进程 12080 进程 44440 speak<Process name='Process-3' parent=12080 started> 4 父进程 12080 进程 45936 Study<Process name='Process-4' parent=12080 started> 4 父进程 12080 进程 44440 speak<Process name='Process-3' parent=12080 started> 5 父进程 12080 进程 45936 Study<Process name='Process-4' parent=12080 started> 5 父进程 12080 进程 44440 speak.............Process类有以下参数,有的是继承来的:
group默认为Nonename进程名,不写会默认args为目标方法传递位置可变(元组)参数kwargs为目标方法传递关键字可变(字典)参数daemon布尔值,是否为守护进程
EdgeOne 实时日志接收器
意义
意义,这两个字总是太沉重。太多的时候,想做点什么事情,首先要考虑的是:做这件事有意义嘛?而不是,自己想不想或者愿不愿意做这件事事情。
人生,谈论起来总是个沉重的话题。不是所有的人都能生活的那么潇洒,不管做什么,总是有人觉得自己干的事情犹如把*捅进了他的肺管子一样,让他难受无比,总是要评判一番。余华可以靠《活着》活着,然而我没有《活着》,我却依然要好好的活着。
我喜欢在互联网上到处瞎溜达,就跟街溜子一样,不但喜欢瞎溜达,还喜欢到处评论,就跟那种低等动物喜欢到处撒尿标记自己的领地一样。(各位博主不要瞎想,我就是纯粹喜欢你们才去溜达的,不是)当然,这种行为,我隐约记得也有人评论过,至于怎么说的,评论的是啥,我也忘了,反正也有很多不好的声音。尽管如此,也无所谓,反正你看我不顺眼,我也看你不顺眼,如果还盯着看,就尿你鼻孔里。
AI快速迭代的好处,就是让普通人也能快速开发一些产品,并且很多产品做的还蛮不错的。有时候我瞎溜达半天,看到别人发布的产品,不由得心生敬意。而我开发产品,基本就这两种原因:
1.被制裁了,付费成本太高,用爱发电的情况下真的不值,例如 Akismet 它总是说我是商业站,让我购买授权,于是,我自己训练模型建立了垃圾评论检测系统:https://anti-spam.zhongxiaojie.cn
2.现有的工具或者组件实在是不满足自己膨胀的欲望和需求。为了显示评论归属地,最开始魔改了wp useragent插件,再后来,自己搭建baby press 前后端分离的博客系统之后,插件系统独立出来,成了 归属地查询服务:https://ip.zhongxiaojie.cn 。
之前静态化的wp系统,自己某天心血来潮,转成了前后端分离的系统。在大家都在静态化的时候,我返祖了,嗯,就是这么特立独行,跟王小波《特立独行的一只猪》中,那只猪一样,我也会早晨爬起来爬到屋顶上去吹小号。
在自己迭代了数个版本之后,现在的版本就是大家看到的样子https://zhongxiaojie.cn ,虽然最开始定位是个玩具,不过后来发现自己复刻的wp主题在前后端分离的状态下更好改了,一些想法的实现比修改wp主题要简单的太多,执行效率比wp也要更快,当然,我开源了代码:https://gitee.com/obaby/baby-press-public
当然,还有一个不成理由的理由,就是喜欢造轮子。当自己看到别人的轮子滚的飞快的时候,我总是想自己也弄个轮子试试,尽管这个轮子自己可能会最后直接扔掉。例如上面生成多网站截图的工具,至于起源很简单,就是在dalao论坛看到有人发了个小工具:
说的更直白一点就是喜欢抄作业,这作业抄定然是抄了,不过我的想法是,抄个想法就行,至于怎么实现,还是根据自己的喜好。如果说作业抄的不如原作好,这种作业不抄也罢,抄这么个东西也挺丢人的。
最终,就是这个作业还抄的蛮成功的,最起码,我觉得还是能达到自己的预期的:https://shot.zhongxiaojie.cn
有的时候,我也是个犟种,总是想把东西做好,有时候又会觉得做好了有啥用呢。
所以,不要问,姐姐,你做的这些有什么意义呢?
意义?为什么要意义?
如果真的要意义,那就是我纯粹是闲的蛋疼!
如果真的要追求意义,那就是我要尽快再减掉6斤,去约拍下一套写真!
如果真的要意义,我的目标是百万存款,而不是简单的达成这100万个跳绳!
所以,要意义干嘛呢?多沮丧啊。
EdgeOne 日志分析软件 v2.0
夜来风雨声
雨季,似乎已经开始了。隔三差五的绵绵雨天,浇湿了大地,也浇灭了孤傲的心。
周日早上,带着宝子来到学校的网球场,三个场地已经完成清理,还剩下最后一块,球场上散布着三三两两的水湾。
场地清理完,打球应该是没有太大的问题,只要球不要全部都掉到水里就好。这阴雨连绵的天气,就这么持续着,时不时的来一场雨。或许雨天不利于思考,或许雨天也容易打湿人的斗志。雨天,带来的并不总是惬意,距离上一次人员优化结束不到一个月的时间,转眼间下一波又依然到来。上次提到这件事情,也有博友说该换个地方了。
就在前段时间,也尝试投递过简历,这个自己心仪的单位,没有任何的答复,犹如泥牛入海。这时候也不得不承认年龄是个大问题了,超过一定的岁数真的是变成狗不理了。这眼下的苟且,也不知道能苟多久。牛逼的领导总是觉得那么多系统一个人完全就能搞定,一向的观点就是9个信息化相关的系统,一个人足矣,甚至还绰绰有余。这种想法也眼看就要落地了,已经统计所有系统的代码和账号信息上交到这牛逼的领导手中,就等这牛逼的领导搞定这些系统,把剩余的几个研发一起干掉了。
周日,重整了一下竞岗汇报的ppt,周一上午的竞岗,该参与还是要参与,毕竟这流程式的东西还是必要的。这一轮下来,又有几个人要被裁掉了。
周一上午,雨虽然没落下来,但是天已经阴沉的犹如锅底一般,黑压压的乌云,低沉而又压抑,黑云压城城欲摧。公司的组织架构来回调整,内部不满分拆分合并,今日合,明日分,嫣然三国争霸的状态,合并后出现一个新的霸主,一统各大诸侯国。时隔数月分崩离析,再到诸侯自治,就这样来回折腾。自己虽不曾当过诸侯霸主,却早已跌入谷底。在这个谷底,看着霸主起高楼,宴宾客,楼塌了,无数的诸侯迎来罢往,就这么换汤不换药的折腾着,只是那所谓的群雄依然是数年前早已在公司根深蒂固的旧主,哪怕被兼并了,这些根基牢固的旧主依然安然无恙。
吐槽,这件事情我觉得并不是光彩的事情,最起码彰显不了自己的高度,能显示的不过是自己的无能和懦弱。至于成就,那更是毫无建树。偶尔自己兴趣盎然的时候,做得那些微不足道的小玩意儿,现在看来,也难成气候。那些微不足道的成就,甚至都无法拿来当成一块敲门砖用。
处在这个变革的时代,抱怨解决不了任何的问题。
半夜被窗户上的雨声吵醒,豆大的雨点打在阳台的落地窗上发出噼里啪啦的声音。
雨夜,雨声来的刚刚好。
那些曾被珍藏的,终究论斤卖掉
数天前的一个晚上,步行路过一处流动废品回收点。本来路过也就路过了,通常不会引起我的注意,不过这次例外。
这里是一处流动回收点,两辆货车停在路边,磅秤就摆在人行道边上,秤旁摆一个小桌,卖废品的人会把东西搬到这里来过秤,两个中年男人负责装车。
当时,天色已经黑了,路灯被硕大的行道树遮挡,人行道上非常昏暗。在磅秤旁边的小桌子上,支了一个小夜灯,收废品的两个中年男人,头凑在一块,就着灯光,共同翻着一本书。我路过他们身边,看得更清楚了,他们在翻看着的,是一本精致的集邮册,朱红色的页底,每页贴着十来张邮票,邮票的细节看不清。
这本集邮册,也让我想起很多年前的集邮风气。
那时候我刚上高中,会跟初中同学写信联系,才开始知道邮票是什么。班上有几个同学很执迷于集邮,总讨论哪些邮票值钱、哪些稀有。我始终不太理解这种爱好,在我眼里,它们不过是寄信用的小纸片。我不知道集邮的同学们后来有没有通过集邮赚到钱,和他们的交集止于我下一个学期就搬出去了。
我虽然不懂集邮,但那时也第一次意识到,有些人在意邮票,甚至在意到近乎荒唐。学校住宿期间发生了一件让我无语的事情,同学寄给我的信件,我装在一个行李包里,行李包就放在宿舍床上,一次放假回来发现,我所有信件都被人偷偷撕掉了贴邮票的一角,残缺的信封露出里面的信纸。
当年有人连几毛钱旧邮票都偷,而如今整本集邮册被当废纸。
我走远时,那两个男人还低头翻着那本册子。
那些曾经被郑重珍藏的,最终被送到了废品站,论斤卖掉。不过,被回收毁灭前,最后一次被认真观赏,也算画上了生命的完美句号。
关于我自己写了一套论坛系统 — 倦意论坛内测上线
楼下坐轮椅的小老头
楼下有个小老头,时而坐着轮椅,时而推着轮椅,时而拄着拐,一直在楼下附近出没。
我们住的这里楼下出了门口正对着有六七个垃圾桶摆一排,出门左走是小区出口的位置,出门走走是停放电动车的位置,就在一排排电动车的中间空闲位置,最近出现了个小老头,就坐着轮椅在那边,一直望向门口垃圾桶的方向。
一般大家都是下楼的时候顺手带着垃圾下来扔了,但凡有人丢了一包垃圾,这时候,那小老头就站起来,推着轮椅,踉踉跄跄的慢慢走到垃圾桶旁,开始对刚才那一包垃圾来个亲密接触,一点点扒出来,看里面有没有他需要的纸壳、塑料等等对于他来说有价值的东西,我一般下楼都会右转去骑电动车,一般都会在那老头附近,反正能一眼看到他,在去骑车的过程中也看到过几次他去翻别人顺手丢的垃圾,要说人家前脚扔点隐私的东西,你后脚就去翻,而且都是同一栋住的,时间长了都脸熟了,该看见的不该看见的都被你看见了,说起来这挺令人反感的,
之前经常傍晚左右有老头老婆过来集中翻找垃圾桶,我觉得那种都可以理解,这个老头的这种蹲点行为真是让人讨厌,这就导致我每次下来都习惯性的往右边那个角落里看一眼,看看他在不在,甚至我丢垃圾都不太想白天下去丢,都是攒一大袋,哪天晚上加班的时候顺手带下去。
刚才下去给电动车拔充电器,瞅了一眼人没在,但是轮椅和捡的一些纸壳在,然后上来的时候上电梯刚好碰见他拄着拐下来,哦,估计可能中场休息,上楼上厕所了吧,走路颤颤巍巍的,咱也不敢说什么,只好离得远远的。
用豆包生成了个图片,大概就是这种场景。![]()
然后中间还有个智障豆包,这整个转头给我笑死了,哈哈。![]()
![]()
VSCode OAI使用Deepseek v4时报错reasoning_content 的解决办法
失而复得的云电脑
月初记录了下我用了快一年的天翼云电脑莫名其妙用不了了,找天翼云客服投诉了两次最后结果都是找不到订购记录,人家后台压根看不到我开的这台云电脑,估计这也是那些人卡BUG开通的点吧,当时突然连不上之后,就显示已过期,但是又和正经到期的显示不一样,因为之前领取过试用版的,到期之后就直接显示过期,重启重装之类的也都操作不了,也不会显示弹窗说桌面已冻结,而我的那个当时有弹窗显示冻结,我才找的客服,而且通过旁边的那个配置按钮还可以恢复或者重装系统,只不过重装之后还是连不上,闲鱼订单那边也是投诉无果,本来想着只能认栽了。
但是毕竟和正常的到期显示不一样,偶尔还是会打开客户端看一下,正常过期的过期几天后就在云电脑列表里面看不到了,我这还一直能看到,结果前两天又可以连接了。。。只不过数据全都没了,回头想想实在想不明白为啥会被冻结半个月,或许是因为我挂了个不休眠的工具,然后我通过配置按钮又重装系统了,又莫名其妙好了,行吧,失而复得的感觉,希望能再用一段时间。![]()
520,521
有时候不得不佩服谐音的造物能力,这原本平平无奇的两天在某一天就忽然变成了节日。最近几天在忙着发布闺蜜圈新版本,虽然更新的功能不多,还是提交了一个新版本提交审核了。审核这件事情,想着一次过审,真的是太难了,期间免不了来回的修改,提交。
当然,有时候也会出现一些乌龙事件,oppo的审核在app被驳回之后提供的审核视频竟然是另外一个app的。
当然,这次oppo的更新,主要是加了他们家的推送sdk。这样,总算是有完整接入一个平台了。
自从上个周末过完之后,还发生了一件事情,自己的蓝牙耳机不见了。家里找了、公司找了、车上也找了,从此再也没找到那副耳机。就那么凭空消失了。对象说自己的耳机给我用,不过最终还是没接受。在找了几天无果之后,直接从二手东闪送重新买了一个,区别在于这次买了一个主动降噪的。之前没用过这种带主动降噪的耳机,体验了一下感觉还是可以的。
至于买的这个东西算什么,其实也没什么想法。邻座的小姐姐还说,你这耳机找不到了,这是马上就买到了新的吗?
作为一个行动派,自然忍不了这种磨磨唧唧的漫长等待。
有时候总说是需要点仪式感,这种仪式感有时候也感觉没什么太多的意思,但是没了却又感觉像少了点东西,有时候或许就是这么纠结吧。
车外还在淅淅沥沥的下着小雨,花束的外层塑料带上有的地方能摸到湿漉漉的雨水。
这雨已经下了好几天了,也有很多地方已经泛滥成灾。
今年的520,感觉多少是有点不正常。晚上刷短视频的时候,看到了两个神奇的生物:沙沙哥,哈哈姐。这精神病发病率15%的水准还是值得关注的,这世界上走的东西,看着是个人,实际上不一定。
早上送宝子上学,一个中老年妇女骑着电动车直接闯红灯从过马路的学生中间疾驰穿过。护学岗的大哥喊了一嗓子,小心学生。那老女人练速度都没降低一点,如出入无人之境直接走了。真想把这个贱人从电驴上拽下来揍一顿!
在线去水印助手 — 自动填充地址到在线去水印中的浏览器扩展
用IP自签发一个HTTPS证书
用IP自签发一个证书
自签发的Nginx证书,用IP地址而非域名进行签发,并安装到浏览器的过程如下:
1. 生成自签发证书
生成私钥:
openssl genrsa -out server.key 2048生成证书签名请求(CSR):
openssl req -new -key server.key -out server.csr在提示中填写信息时,可以在
Common Name (CN)字段输入要使用的 IP 地址:[root@QNXGXUUAOAW006 opt]# openssl req -new -key server.key -out server.csrYou are about to be asked to enter information that will be incorporatedinto your certificate request.What you are about to enter is what is called a Distinguished Name or a DN.There are quite a few fields but you can leave some blankFor some fields there will be a default value,If you enter '.', the field will be left blank.-----Country Name (2 letter code) [XX]:CNState or Province Name (full name) []:BJLocality Name (eg, city) [Default City]:BJOrganization Name (eg, company) [Default Company Ltd]:ORGOrganizational Unit Name (eg, section) []:ORGCommon Name (eg, your name or your server's hostname) []:10.53.234.106Email Address []:Please enter the following 'extra' attributesto be sent with your certificate requestA challenge password []:An optional company name []:生成自签名证书:
openssl x509 -req -days 365 -in server.csr -signkey server.key -out server.crt
2. 安装证书到浏览器
为了防止浏览器报错,你需要将证书导入信任列表
闺蜜圈 [v 5.1.88]
更简单更好用的大姨妈记录app:https://guimiquan.cn
更新记录: 5.1.88 数字版本号:528 华为版本号:5.2.01 550 Apple 5.1.88 528 1. AI助理添加快捷指令开关,可以自行控制是否开启快捷指令处理 2. 修复了部分已知bug
距离上个版本发布已经过去数个月了,这几个月并不是什么都没干,而是想着不断的把她弄的更完美。想继续扩大上架的范围和区域,期间成功了一些,也失败了一些。
成功的几个(三星、oppo[更新])来之不易,失败的几个更是各种不同的原因,应用商店本身的、各种所谓的政策的。至于如何解读这个东西,这么久了其实自己依然解读不了,只能收到什么整改通知就去做什么类型的整改。
至于整改有没有效果,那就是另外一个故事了。在某些时候迫不得已上了个阉割版本,作为一个注重用户体验的开发者,这的确不是我想看到的。
使用Certbot自动续签HTTPS证书
1.关于ACME
使用https加密是网站安全的必要条件,也是当前网站的标配,很多浏览器都已经默认发起https的请求,如网站不支持还会提示访问不安全。
但是https证书签发需要收费,对于一些小型组织和个人站长来讲也是一笔不小的费用,不过某些CA机构推出了公益性的免费证书计划,让小网站也实现免费的https加密,比如Let’s Encrypt(https://letsencrypt.org/zh-cn/getting-started/)就是目前全球规模最大、最具影响力的公益属性CA之一。但是因为小站更容易被攻击或管理不善导致发生私钥泄露进而使网站存在风险,各个公益性组织免费签发的证书寿命越来越短,从1年到半年再到3个月,2025年有的组织又压缩到一个半月,用频繁强制换新的方法来避免私钥一旦泄露网站会长期存在风险的问题,但这也对一些小网站的运维产生了不便,因为频繁手动更换证书非常麻烦。
现在可以通过ACME协议解决这个问题,实现自动续期证书,ACME是一套通信协议,规定了你的服务器(ACME客户端)和证书颁发机构(CA)之间,如何自动化地申请、验证、签发和续期证书。ACME流程大致是这样:ACME客户端先向CA机构申请证书,CA机构返回一个测试记录,要求ACME客户端将记录写入域名对应DNS记录或网站某个路径下证明其是域名的主人,ACME客户端完成后告诉CA机构已经完成验证,CA机构的服务器会去访问DNS记录或网站路径验证是否有测试记录,如有,则签发证书返回给ACME客户端。
事实上一些公益组织也不支持站长在其官网下单提交请求再下载证书,而是必须通过ACME客户端签发,Let’s Encrypt就是这样的。
2.使用Certbot申请证书
2.1 流程
Certbot(https://certbot.eff.org/pages/about),就是一个遵循了ACME协议的工具,而且默认对接的就是Let’s Encrypt,可以用它实现自动签发和续期免费证书,这里使用Certbot配合Cloudflare DNS演示基于DNS记录的域名持有者验证,大致流程是:
Certbot先向Let’s Encrypt申请证书,Let’s Encrypt返回一个测试令牌,要求将测试令牌写入域名对应TXT DNS记录证明其是域名的主人。
Certbot将Let’s Encrypt返回的令牌通过调用Cloudflare API,写入到对应域名的TXT DNS记录,完成后告诉Let’s Encrypt已经添加了测试记录。
Let’s Encrypt会去访问该域名的DNS记录验证是否有对应的测试令牌,如有,则签发证书返回给Certbot。
除了Cloudflare外,Certbot也支持很多其他知名DNS服务商,详见:https://eff-certbot.readthedocs.io/en/stable/using.html#dns-plugins
Certbot设置好后,整个过程可以全流程自动完成。
![]()
2.2 具体操作
以Certbot配合Cloudflare为例
1.安装certbot和certbot的cloudflare插件,以rocky linux为例
yum install -y certbot python3-certbot-dns-cloudflare2.要申请一个Cloudflare API KEY,在https://dash.cloudflare.com/profile/api-tokens,使用“编辑区域DNS”模板,并设置对应域名的DNS编辑权限,然后签发一个API KEY
![]()
mkdir -p /etc/letsencrypt/secrets/,sudo vim /etc/letsencrypt/secrets/cloudflare.ini,将API KEY配置在对应配置文件中,然后设置配置文件权限
dns_cloudflare_api_token = **************chmod 600 /etc/letsencrypt/secrets/cloudflare.ini然后执行certbot certonly命令首次签发证书
--email直接指定邮箱,不会弹出询问--agree-tos自动同意服务条款--no-eff-email不分享邮箱给 EFF--non-interactive全程不询问任何问题-d liuzijian.com -d *.liuzijian.com为liuzijian.com/*.liuzijian.com签发
certbot certonly \ --dns-cloudflare \ --dns-cloudflare-credentials /etc/letsencrypt/secrets/cloudflare.ini \ -d liuzijian.com \ -d *.liuzijian.com \ --email me@liuzijian.com \ --agree-tos \ --no-eff-email \ --non-interactive成功后会返回日志以及证书私钥位置等信息
Saving debug log to /var/log/letsencrypt/letsencrypt.logRequesting a certificate for liuzijian.com and *.liuzijian.comWaiting 10 seconds for DNS changes to propagateSuccessfully received certificate.Certificate is saved at: /etc/letsencrypt/live/liuzijian.com/fullchain.pemKey is saved at: /etc/letsencrypt/live/liuzijian.com/privkey.pemThis certificate expires on 2026-08-15.These files will be updated when the certificate renews.Certbot has set up a scheduled task to automatically renew this certificate in the background.- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -If you like Certbot, please consider supporting our work by: * Donating to ISRG / Let's Encrypt: https://letsencrypt.org/donate * Donating to EFF: https://eff.org/donate-le- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -证书由certonly申请后,以后都可以使用certbot renew命令续签证书,执行后会先检查,有效期不足30天才会真的续签
certbot renew--dry-run参数可以演练签发,CA机构验证DNS通过,只会告诉certbot通过验证,不会真的签发证书
certbot renew --dry-run还可以:
--cert-name liuzijian.com只续签某个域名的--force-renewal参数可实现不到30天也要强制续签,续签数量有限制,短时间内不能超过一定数额
可通过定时任务不断调用certbot renew实现每天或每周检查,快过期了则续签并刷新nginx,最终实现我们想要的效果
--quiet只输出错误信息--post-hook "systemctl reload nginx"成功后触发
certbot renew --quiet --post-hook "systemctl reload nginx"当然,生成的证书和私钥需要你自己指定到nginx 😜