但今天的主题不是这个。
是抉择。
我最怕面临的就是抉择,自以为大多数时候都是命运拖着我走,除了高考的失利让我懊悔不已,别的情况下自己都是在命运的交叉点选择被命运被自己的兴趣拖着选择一条道路,后面的道路走的稍微有些难,好像都在还高考的债。如果相信命运的话,当时的抉择导致了此刻的我打这行字。也就没什么必要谈当时的自己多傻逼,后面的路走的顺利与否。
如今又面临抉择,工作上的,城市上的,人生上的。我不知道选择对与错,也许成年人的世界里一步走错也就步步走错,但是普通如我,怎么能知道哪条路是对的啊。
最近脑海里总时不时浮现爷爷要离开这个世界躺在床上的场景,他活了 90 岁,90 岁大概会经历无数的人生抉择,闯关东到东北,生儿育女,经历了几个大时代,等等等等,他弥留之际会回忆这些么?会后悔自己的人生么,会感概这一辈子不到百年的沧海桑田么?我不知道,我也不敢去想我有那一天的话会怎么做。
说说需要的抉择,要不要选择一个新的机会。
工作上我们被收购影响很大,总之大部分是负面的变化,这个新的工作机会,对方非常有诚意,薪水也会高上许多,但需要离开大连,不知道是短暂的还是长时间的。但现在的工作也许不久也必须要离开大连,不久之后可能面临下一波裁员,但我很喜欢现在的团队和领导,对现状也很满意。
我最怕的是主动去改变。我挺享受现在的状态的,我要去改变么?
最近被帮一个用 running_page 认识的朋友搭建他的个人主页,他也在面临抉择,北大的博士,将来的高校老师也在面临抉择,从北京到美国,从美国再到香港,强如他,面临抉择的时候会纠结么?我也不知道。
突然就觉得人生还真跟浮萍没太多区别,自己能掌控的部分太少了,前面说我大多数时候都是被命运推着走,但在时代的浪潮面前谁又不是呢?弄潮的人永远是那么几个,但他们后悔自己的抉择么?他们会面临抉择时候的困境么?我也不知道。
就好像刘震云小说中的小人物一样。
敲下这篇,敲到这行字的时候对我接下来的抉择没有任何帮助,但心情平复了不少,这就是写作的好处吧。
写到这儿。
]]>这个月打了《只狼》准确说我好久没这么认真的去打一款非 rogue like 游戏了,游戏非常对胃口,在一遍一遍死的时候学习系统,感受自己变强,弹刀打铁也越来越刺激,尤其是战胜壮年义夫的时候,我打了两天,杀掉他的一刹那,高兴的从椅子上站了起来,真的爽也真的开心。
为什么说到村上春树了呢?玩这个游戏的时候不断在想《挪威的森林》里那句:死并非生的对立面,而作为生的一部分永存(林少华翻译版),日本的制作人,作家,非常喜欢讨论生死的问题,宫崎英高也是,几乎每一部游戏都在探讨生死,而《只狼》的核心也是要斩断不死,死亡还是永生,似乎永远是值得探讨的问题。可惜我们无法永生,只能在游戏中,在书里去体验这种感觉。
突然就想开通个爱发电试试了,没想到真的不少人表示感谢,还有个哥们用爱发电提了个付费的需求,我马上给做了。还挺有趣的。爱发电起的名字还挺有意思的,用爱发电,不只是用爱发电。
媳妇送了我 iPhone 15 plus 终于手机不卡了。 到了程序员该死的年纪,不过我还想再干几年,如果真干不下去了,那就再说,至少现在还能开心的写着代码。
更感动的是在推特收到了几百条生日快乐,我看见的都一一回复了,感觉真好,这个世界是充满这些陌生人的祝福的。
受朋友邀请去他们公司去讲了 AIGC 的东西,讲了一个多小时,效果也不错,还有一定的补贴,拿到钱我直接转给媳妇了哈哈。不过讲完的时候我想到了我当时在西山居做的第一次 share 2016 年初,做的 VR 也是新兴的东西,讲的时候全程在发抖,到现在我已经能谈笑风生的讲技术的东西了,台底下不少人,我甚至还能讲几个段子,真的是成长了啊。开心。
这个月看的几本书都非常推荐(有的还没看完)
效果
https://github.com/yihong0618/gitblog/assets/15976103/bb8ec3ab-5229-4e3b-a305-b20b1b8a69f7
我还给 miservice 加了循环播放和列表播放,下面是一些技术细节。
效果:
https://github.com/yihong0618/gitblog/assets/15976103/3ceb34fc-6a02-404b-b0da-63caf1f340c3
]]>开源和分享值得么?在我看来至少目前是值得的,虽然很多时候会遇到不是一个物种的来要求你做这做那,但大多数的时候还算好的。 冒着自己安全的风险做开源值得么?我不知道,但至少应该对这样的人保持敬仰是我这样没这种勇气的人应该做的。 今天在一个群里看到一个 title 是技术负责人的说,能赚钱么?不赚钱我不做,傻逼才做。冷笑一声,就当我们是傻逼吧。当然,他是没错的,只是不是一路人而已。 我不知道未来怎样,能活到现在好像已经超过了古代战乱时期的平均年龄了,虽然有太多的遗憾,也没怎么为自己当时比较傻逼的抉择后悔。 回到正题,我好像没怎么为过利,名倒是机缘巧合认识了大家有几个关注,开源值得么? 认识了这些虽然未曾谋面但在代码里交流了很久的人当然值得了,frostming, saka, kc(jay), cyanide, friendA, Ben_29, xuanwo, fallen, zu1k, laike9m, TJ, machiel, xintao, Epliar, higuoxing, 盐粒等等等 当然值得的,否则我一辈子也不可能认识这么多牛逼的人。 哦对,忘了说,还有那些真心的谢谢。 所以,还会做下去的,虽然环境已经如此差了,做到做不下去那天吧。
The best is yet to come.
这篇 post 缘起是 clash 事件,过去挺久了,但我在路由上的突然不好用,源码也没了,找到了开源认识的朋友帮忙才回复,又想起了这个 post. 现在回想当然是值得的,今天坐在星巴克,喝着同事朋友请我喝的咖啡,其实在成为同事前我们在 GitHub 上已经交流过了,开源的世界真的不大,这么想当然是值得的。
如果想赚钱,当然有 1w 种比开源分享更值得的东西,但很多事情不全是为了赚钱,对吧。
感谢看到这的你,是你们让它变得更值得了。
]]>读书究竟为了什么?这些年虽然不上墙内的社交网站了,也很少有人跳出来告诉我要多读书,并顺手推荐了一本《毛泽东选集》,但推上也越来越多的人谈起读书,虽然晒出来的书外面的玻璃纸还没撕开,也要去聊聊读书,当然这里包括我自己,书架上也有很多书封还没打开过躺在那儿看着我的书。 也许有一天会打开,也许不会。
没有实际统计过,但是那些年精力旺盛的时候每年大约读 80 本书左右,应该加起来读的书超过 500 本了,当然,大部分都是小说。倒是没觉得自己有多了不起,但做过一段时间的数据分析的岗位,自己在人群中的阅读量处在什么位置心里还是有数的。
困了,改天接着写
]]>这是一篇 2017 年 9 月给机核的投稿,当时老白的评价是写的比较简单,希望我再补充一些,就没通过。我也懒得补充就一直放那了,当然后面有了《杀戮尖塔》,《怪物火车》,《月圆之夜》等一系列被这个游戏影响或者借鉴的游戏,但《Dream Quest》依然是我最喜欢的,也是其中数值做的最好的。
如果你是个 rogue like游戏的爱好者 如果你是个炉石传说或是地下城的爱好者 如果你在找移动端不错的 rogue like 游戏 当然,如果你不是一个画面党 我向你推荐这款游戏 ->《Dream Quest》 相信我,这是你在移动端能玩到的最棒的 rogue like 游戏,没有之一
熟悉炉石的朋友可能多少听过这个人——《炉石传说》卡拉赞之夜的主设计师之一。而作者加入这个团队也完全是因为这款《Dream Quest》。故事的发展很简单,整个炉石团队沉迷了这款游戏,惊叹其中的卡牌数值设计,本来低调的作者顺理成章的加入了炉石这个“小”团队。
从领英上能查到的信息 Peter Whalen 是毕业于乔治亚理工学院的博士,又在亚马逊当了一年算法工程师(游戏的数值设计如此精妙也不奇怪了)。在这期间他用 Unity 引擎加上 Windows 画图版做出了这款“特别”的游戏,之后加入了炉石团队。(2023 年补充,他现在创业去了)
在本来就不多的《Dream Quest》玩家中有因为他加入炉石而惋惜的,也有感觉他会给炉石带来一些不一样东西的(如下图),现在看来确实他给炉石带了很多有趣的东西。
2023 年的补充,这是一款《杀戮尖塔》的始祖
记得某个人说过,永远不要因为一本书的封面而判断一本书的价值。而这个游戏每从icon,到主界面,到选人画面,再到进入地图都在考验你这个认知。
游戏的icon是这样的:
游戏的主界面是这样的:
选人画面中四个初始职业是这样的:
地图是这样的:
甚至游戏的战斗画面是这样的:
如果说机核《安利之王》中介绍的《末日拾荒者》画面被称为“屎”的话,那这款游戏的画面只能用“圣屎”来形容了。 当然如果你成功接受了这种设定之后:
怪物图鉴:
最终 Boss, 相信最终 Boss 的美术会是你再一次视觉享受:
PostgreSQL Extension 是一个可插拔的功能扩展,用于在 PostgreSQL 数据库系统中添加额外的功能和能力。这些扩展可以由第三方开发者开发并加入到 PostgreSQL 中,以满足特定的需求。扩展可以增强数据库功能。 有些非常不错的 Extensions 甚至成了一些公司选型 Postgres 的理由比如:TimescaleDB, PostGIS 等等。
今年开始异常火爆的向量数据库,因为有 pgvector 也让 pg 有了向量计算和存储的能力。
本文会介绍如何编写 extensions 和推荐一些编写 Extensions 的资源。
传统的 Extensions 开发一般情况下我们会 c 语言,引入 Postgers.h
写好 Makefile 和 SQL 开发,现在也有了用 Rust 编写 Extensions 的能力 -> pgrx 借助 pgrx 我们能更好的专注 extensions 中算法本身,也可以借助 Rust 强大的生态更容易的编写 extensions 需要的逻辑,进行更快速,更安全的开发。
以下分别介绍 C 和 Rust 两种开发方式。
以 hello_world 为例,需要在 hello_world 文件夹中建下面 4 个文件
hello.control # 插件名.control
hello.c # 插件名.c
hello--1.0.sql # 插件名--1.0.sql
Makefile # 用于编译
cat hello.control
comment = 'hello:'
default_version = '1.0'
module_pathname = '$libdir/hello'
relocatable = false
superuser = true
剩下的可以参考这个 pg 的 hello_world 项目 https://github.com/magnusp/pg_hello
cat pg_hello.c
#include "postgres.h"
#include "fmgr.h"
#ifdef PG_MODULE_MAGIC
PG_MODULE_MAGIC;
#endif
Datum hello( PG_FUNCTION_ARGS );
PG_FUNCTION_INFO_V1( hello );
Datum
hello( PG_FUNCTION_ARGS )
{
// variable declarations
char greet[] = "Hello, ";
text *towhom;
int greetlen;
int towhomlen;
text *greeting;
// Get arguments. If we declare our function as STRICT, then
// this check is superfluous.
if( PG_ARGISNULL(0) ) {
PG_RETURN_NULL();
}
towhom = PG_GETARG_TEXT_P(0);
// Calculate string sizes.
greetlen = strlen(greet);
towhomlen = VARSIZE(towhom) - VARHDRSZ;
// Allocate memory and set data structure size.
greeting = (text *)palloc( greetlen + towhomlen );
SET_VARSIZE(greeting, greetlen + towhomlen + VARHDRSZ);
// Construct greeting string.
strncpy( VARDATA(greeting), greet, greetlen );
strncpy( VARDATA(greeting) + greetlen,
VARDATA(towhom),
towhomlen );
PG_RETURN_TEXT_P( greeting );
}
代码的一些解释:
#include "postgres.h"
包含了大部分编写 postgres 相关程序需要的东西,每个 extensions 必须包含这个#include "fmgr.h"
则包含了PG_GETARG_XXX、PG_RETURN_XXX和PG_ARGISNULL 等编写 extensions 必要的宏在这之后就可以编写好 Makefile 把 pg 的 PATH 加入到环境变量中之后 make && make install
在这之后进入到 psql, create extension hello; select hello('hello'); 就可以了
当然后续可以写一些测试,需要建一个文件夹名为 sql 把相关的测试写在里面,再建一个文件夹名为 expected 把测试跑出的结果写在里面,在 Makefile 加上这句 REGRESS = hello
, 就可以利用 pg 的 installcheck 了
cat sql/hello.sql
CREATE EXTENSION hello;
select hello_hello();
**如果不知道如何写插件可以参考 pg 核心开发者这个项目,里面有各种各样的 extensions **
当然现在是 2023 年我们完全可以借助 Rust 来开发 Extensions, 这特别得益于 pgrx 这个项目它的前身也是一个非常棒的 pg 插件 zombodb
来看看借助 pgrx 开发的优秀的 pg 插件
编写起来就比 C 简单多了,只需要
一个简单的 hello 程序就做好了,其中 cargo pgrx new hello
帮助我们生成了所有需要的文件,其中 pgrx-examples 文件夹中包含了很多如何使用 pgrx 编写的例子。
当然大家可以参考这个项目 pg_slugify,利用了 Rust 的生态,几行代码做了一个非常有用 extension, 大家的很多简单的脚本完全可以利用 Rust 编写成插件方便自己开发。
五一假期去北京玩了,故宫,颐和园,天安门,长城都去了,以前去了好多次北京也没去这些地方,这次去倒是没有更多的兴奋,就很平淡的去看这过了几百年的一切。总感觉这皇宫,这皇城,一切都没怎么改变。
被查了 3 次身份证,无数次安检,这也许就是北京吧。儿子去天安门时候安检被没收了彩笔,儿子不理解嗷嗷大哭半小时,五岁的他不明白为什么彩笔会被人夺走,其实我们也不明白,嗯,这是规矩。
当然最开心的是,和老婆一起吃了顿很贵的火锅,见了友人A 还和 hi@guoxing, 陈总喝了酒(还有其他同事),两顿。这些天还总能回想起陈总骑着他的小摩托驮我回酒店,他讲述的每周会骑着这个摩托,买本《三联周刊》来这家酒吧喝两杯酒,正好看完,回去。真美好。
还他妈吃了全宇宙最难吃的炸酱面。
又经历了一个认识的前辈死亡,我不太知道有没有死后的世界,也不知道未来因为 AI 他们会不会永远存在,又想起那些死去的朋友,他们看不到现在这一切了,不知道是不是一种幸运。
也许吧。
一切如旧。
最近时常想起,时常梦见,清醒时有些自责,喝醉后怅然若失。那时我们相约等上映去看《灌篮高手》,如今只好多买一张票,酒边多放一个杯子,有时候想想有另一个世界就好了,如果有也不知道你过的怎么样。希望,它,真的作为生的对立面永存吧。也不知道当时你为什么这么选择,我们几个如果多给你打些电话情况会不会不一样,往往想到这里就感觉人生和世界的虚幻,究竟哪一个才是真实的?
我很喜欢,无论其它人的评价怎样,在我看来不同年龄段对这个电影的看法是完全不同的,青春的遗憾也好,怀念曾经的自己也罢,仿佛一个跳投,空中划过一道弧线,球进了,是空心的。 而喜悦过去回过头看,一切如闪回一般,转过头,球场变成了屏幕前敲击着键盘的我。操他妈的,一个球花了二十年。
这段时间围绕着 OpenAI 的API 做了几个项目,也和朋友有不少的交流,其中 stars 最多的那个双语书翻译项目也是我唯一失控的项目,不但失控,也失去了给它添加新功能的热情,一个是市面上大量同类的项目比我做的好的多的多,而我既没有精力也没有那么大的能力超过他们,而且合了很多代码不是我风格或者是质量没那么高的 PR, 导致项目彻底的失控。 其实更多的是我自己的原因。当然其它运行良好,xiaogpt @frostming 帮了我非常多,我也更愿意去把它变得更好。 给自己做个总结就是,项目的维护其实没想象的那么简单,也要懂得放弃。
又遇到了别人说,我写的项目毫无技术含量,为什么有这么多人 star 关注。心里还是有些沮丧的。 虽然我知道和那些厉害的人项目我写的东西确实没什么特别的,想辩论几句,我做的都是曾经没人做过的,或者做的方式不是这样的,但这种辩论毫无价值,沮丧过了也就过去了。That's it. 也不知道自己能做什么更多的评价。
后天早上就出发了,本来想着是避免出行高峰,没想到的是每天都是出行高峰。抢票,抢票,弄了好几天,依然是我媳妇负责计划,出行当天我负责拎包和当个听从一切指挥的傻逼,上次去北京还是 19 年去跑马拉松,没想到这感觉像是没过去多久的事情,但因为新冠竟然过去了 3 年了。
新冠三年最大的庆幸和遗憾是失去了一些朋友,也告诉自己别去轻易交新的朋友。
]]>但在实际情况下,进程请求的内存可能比实际需要的内存少很多,而且很多进程请求的内存并不会全部使用。在这种情况下,如果系统采用严格的内存申请机制,将会导致系统的内存利用率低下,一些能够使用的内存被浪费。 因此,为了提高系统的内存利用率和灵活性,Linux 提供了 vm.overcommit_memory 机制。当这个参数的值为 0 或 1 时,内核允许进程请求超过系统实际可用内存的内存量。这种行为被称为 "overcommit"。
#define OVERCOMMIT_GUESS 0 // default
#define OVERCOMMIT_ALWAYS 1 // redis
#define OVERCOMMIT_NEVER 2 // postgres
The Linux kernel supports the following overcommit handling modes
0 - Heuristic overcommit handling. Obvious overcommits of
address space are refused. Used for a typical system. It
ensures a seriously wild allocation fails while allowing
overcommit to reduce swap usage. root is allowed to
allocate slightly more memory in this mode. This is the
default.
1 - Always overcommit. Appropriate for some scientific
applications. Classic example is code using sparse arrays
and just relying on the virtual memory consisting almost
entirely of zero pages.
2 - Don't overcommit. The total address space commit
for the system is not permitted to exceed swap + a
configurable amount (default is 50%) of physical RAM.
Depending on the amount you use, in most situations
this means a process will not be killed while accessing
pages but will receive errors on memory allocation as
appropriate.
Useful for applications that want to guarantee their
memory allocations will be available in the future
without having to initialize every page.
https://github.com/torvalds/linux/blob/v4.6/mm/util.c#L481
grep -i commit /proc/meminfo
/proc/meminfo 中的 Committed_AS 表示所有进程已经申请的内存总大小,(注意是已经申请的,不是已经分配的),如果 Committed_AS 超过 CommitLimit 就表示发生了 overcommit,超出越多表示 overcommit 越严重 -> 触发 OOM
那么这个 CommitLimit 是怎么算出来的呢?
int __vm_enough_memory(struct mm_struct *mm, long pages, int cap_sys_admin)
{
long free, allowed, reserve;
VM_WARN_ONCE(percpu_counter_read(&vm_committed_as) <
-(s64)vm_committed_as_batch * num_online_cpus(),
"memory commitment underflow");
vm_acct_memory(pages);
/*
* Sometimes we want to use more memory than we have
*/
if (sysctl_overcommit_memory == OVERCOMMIT_ALWAYS)
return 0;
if (sysctl_overcommit_memory == OVERCOMMIT_GUESS) {
free = global_page_state(NR_FREE_PAGES);
free += global_page_state(NR_FILE_PAGES);
/*
* shmem pages shouldn't be counted as free in this
* case, they can't be purged, only swapped out, and
* that won't affect the overall amount of available
* memory in the system.
*/
free -= global_page_state(NR_SHMEM);
free += get_nr_swap_pages();
/*
* Any slabs which are created with the
* SLAB_RECLAIM_ACCOUNT flag claim to have contents
* which are reclaimable, under pressure. The dentry
* cache and most inode caches should fall into this
*/
free += global_page_state(NR_SLAB_RECLAIMABLE);
/*
* Leave reserved pages. The pages are not for anonymous pages.
*/
if (free <= totalreserve_pages)
goto error;
else
free -= totalreserve_pages;
/*
* Reserve some for root
*/
if (!cap_sys_admin)
free -= sysctl_admin_reserve_kbytes >> (PAGE_SHIFT - 10);
if (free > pages)
return 0;
goto error;
}
allowed = vm_commit_limit();
/*
* Reserve some for root
*/
if (!cap_sys_admin)
allowed -= sysctl_admin_reserve_kbytes >> (PAGE_SHIFT - 10);
/*
* Don't let a single process grow so big a user can't recover
*/
if (mm) {
reserve = sysctl_user_reserve_kbytes >> (PAGE_SHIFT - 10);
allowed -= min_t(long, mm->total_vm / 32, reserve);
}
if (percpu_counter_read_positive(&vm_committed_as) < allowed)
return 0;
error:
vm_unacct_memory(pages);
return -ENOMEM;
}
红帽犯过这个错误 :https://access.redhat.com/solutions/665023
OMM killer 机制:linux 会为每个进程算一个 score,当内存不足时候它会根据 score kill score 越大表示越容易杀死
#!/bin/bash
while read -r pid comm
do
printf '%d\t%d\t%s\n' "$pid" "$(cat /proc/$pid/oom_score)" "$comm"
done < <(ps -e -o pid= -o comm=) | sort -k2 -n
/proc/${pid}/oom_score_adj, 取值范围为-1000到1000, 如果将该值设置为-1000,则进程永远不会被杀死 --> pg /proc/${pid}/oom_adj, 取值是-17到+15,取值越高,越容易被干掉。如果是-17,则表示不能被kill /proc/${pid}/oom_score, 是系统综合进程的内存消耗量、CPU 时间(utime + stime)、存活时间(uptime - start time)和 oom_adj 计算出的,消耗内存越多分越高。
https://elixir.bootlin.com/linux/v5.4.58/source/mm/oom_kill.c
why
redis:
The Redis background saving schema relies on the copy-on-write semantic of the fork system call in modern operating systems: Redis forks (creates a child process) that is an exact copy of the parent. The child process dumps the DB on disk and finally exits. In theory the child should use as much memory as the parent being a copy, but actually thanks to the copy-on-write semantic implemented by most modern operating systems the parent and child process will share the common memory pages. A page will be duplicated only when it changes in the child or in the parent. Since in theory all the pages may change while the child process is saving, Linux can't tell in advance how much memory the child will take, so if the overcommit_memory setting is set to zero the fork will fail unless there is as much free RAM as required to really duplicate all the parent memory pages. If you have a Redis dataset of 3 GB and just 2 GB of free memory it will fail.
Setting overcommit_memory to 1 tells Linux to relax and perform the fork in a more optimistic allocation fashion, and this is indeed what you want for Redis.
PostgresSQL or Greenplum:
Why Use Strategy 2? The issue with the default overcommits strategy, or using strategy 1 is the unpredictable nature of the failure. In either case we are not guaranteed that the memory is available at time of allocation and that results in unpredictable termination of processes. In particular, the nature of the failure with strategy 1 can result in corruption of either datafiles or transaction logs as a memory failure can occur mid-transaction resulting in the immediate shutdown of the database process without any cleanup.
那如果 redis 和 pg 跑在一台机器上有什么好的建议么?
下面是我在这 4 年里写的开源项目的数据(截止 2023.3.21)而这个表格是用我的一个项目 -> github-readme-stats 自动生成的。这 4 年从第一个项目 gaycore 开始,我一共用 5 种语言写了 35 个开源项目得到了 14000 多个 stars. 还挺值得自豪一下的。最值得自豪的是,它们大部分还在更新。我还给一共 55 个项目提了 160 个 PR.
ID | REPO | START | UPDATE | LAUGUAGE | STARS |
---|---|---|---|---|---|
1 | bilingual_book_maker | 2023-03-02 | 2023-03-20 | Python | 4413 |
2 | running_page | 2020-09-17 | 2023-03-20 | Python | 2336 |
3 | xiaogpt | 2023-02-16 | 2023-03-20 | Python | 1943 |
4 | Kindle_download_helper | 2022-06-06 | 2023-03-20 | Python | 1498 |
5 | GitHubPoster | 2021-04-21 | 2023-03-20 | Python | 1364 |
6 | gitblog | 2019-07-18 | 2023-03-20 | Python | 878 |
7 | 2022 | 2022-01-01 | 2023-03-11 | Python | 274 |
8 | 2021 | 2020-12-21 | 2023-03-05 | Python | 273 |
9 | blue | 2022-10-20 | 2023-03-20 | Python | 260 |
10 | iBeats | 2021-06-11 | 2023-03-19 | Python | 200 |
11 | iWhat | 2023-03-08 | 2023-03-19 | Python | 172 |
12 | 2020 | 2020-01-10 | 2023-03-05 | C | 139 |
13 | vscode-gcores | 2020-01-04 | 2023-03-06 | TypeScript | 110 |
14 | github-readme-stats | 2020-12-24 | 2023-03-19 | Go | 101 |
15 | gaycore | 2019-02-18 | 2023-03-06 | Python | 99 |
16 | dalian-IT | 2021-04-07 | 2023-03-19 | md | 99 |
17 | 2023 | 2023-01-01 | 2023-03-19 | Python | 51 |
18 | duolingo_remember | 2021-01-18 | 2023-01-30 | Python | 50 |
19 | shanbay_remember | 2020-12-02 | 2023-03-13 | JavaScript | 47 |
20 | nbnhhsh-cli | 2021-07-09 | 2022-07-16 | Python | 32 |
21 | gcores_calendar | 2020-08-24 | 2023-03-04 | JavaScript | 27 |
22 | pengdu_helper | 2021-09-09 | 2023-01-27 | Go | 27 |
23 | yihong0618 | 2020-07-16 | 2023-03-15 | md | 26 |
24 | my_kindle_stats | 2021-11-18 | 2023-03-17 | Python | 25 |
25 | running_skyline | 2021-03-02 | 2022-05-10 | Python | 20 |
26 | kai_xin_ci_chang | 2022-06-15 | 2023-03-11 | Python | 17 |
27 | blog | 2020-06-22 | 2023-01-28 | JavaScript | 14 |
28 | Runtastic | 2020-07-24 | 2023-02-03 | Python | 14 |
29 | github-readme-stats-server | 2021-12-08 | 2023-01-19 | HTML | 9 |
30 | Python365 | 2019-09-05 | 2022-10-30 | Python | 7 |
31 | run | 2021-08-16 | 2023-03-17 | Python | 7 |
32 | github_upstream_script | 2021-05-08 | 2022-03-08 | Python | 2 |
33 | edocteel001 | 2019-11-12 | 2022-06-24 | JavaScript | 1 |
34 | gaycore-server | 2019-02-18 | 2020-11-02 | Go | 0 |
35 | test_svg | 2021-03-18 | 2022-06-16 | md | 0 |
sum | 14535 |
项目链接 -> https://github.com/yihong0618/xiaogpt 大多数事儿很简单的一个结论是:这么做有什么用? 但是,没用就不做了么?好玩也是有用之一呀。
下文中 revChatGPT 方案废弃了,全部改用 API, 请参考 repo.
GPT
就用破解的小爱发送请求到 ChatGPT, 再把 ChatGPT 的回复截包,读出来。micli list
拿到你音响的 DID 成功 别忘了设置 export MI_DID=xxx 这个 MI_DID 用 python xiaogpt.py --hardware ${your_hardware}
hardware 你看小爱屁股上有型号,输入进来用 eBPF 来观测用户空间应用程序这几年越来越火了,诞生了不少开源的应用,但在数据库这个领域相关的应用还不算太多,特别是 PostgreSQL. 在这个领域之前没那么多人研究可能的原因:
bcc 是自带 mysql 和 postgres 的例子的, 可以观测慢查询和 latency 但针对 pg 必须开启 dtrace 才能使用
能不能不用 dtrace 而只使用 eBPF 的 uprobe 来观测 pg 的查询呢?答案是能的:
就像 mysql 的查询入口是 dispatch_command 一样,要使用 uprobe 来 trace 的函数入口是 exec_simple_query 之前在 GitHub 上查询一下,最早把 trace postgres 写成应用的是 postgres-bcc 作者应用 bcc 且不用开启 pg 自带的 dtrace 写了一系列 trace pg 的小工具,工具包括:
这个项目相比 bcc examples 可以说是非常成熟,作者把 kprobe 和 uprobe 结合起来,来从用户态和内核态来一起观测 pg, 更厉害的是,作者还写了一篇的文章:
PGTracer 是 2022 年诞生的第一个 eBPF 来观测 pg 的企业项目,来自 aiven 这个公司,这个项目的定位也很有意思从最开始的 perf 工具到现在的工具集,它会把一个查询的整体信息打印出来,帮助大家观察查询,更有意思的是,它还包括了查询计划,如图:
pg-lock-tracer 是 2023 年诞生的新项目,作者是这个项目专注于 trace pg 中的各种锁,作者还把 lock 和 lwlock 区分开来 trace, 还可以直接生成 dot 图,方便学习,观测以及 debug.
如果想学习 pg 中的 lock 这个项目也是很好的切入点
Lock statistics:
dot 图:
作者 @jnidzwetzki 还写了两篇介绍文章
如果大家也想写一个类似的工具如何入手呢?
我在去年给 ecapture 提了一个支持 pg 的 PR 大家可以参考:
新冠
中说的,微信删了几百个好友,其实删完了没那么开心《新冠》
头痛
捂嘴
脚痛
捂嘴
四月张开了口
四月断了喉咙
我们低下头
看见了枷锁
还好
有京城的人在嘶喊
有山城的人在唱歌
他们再也没机会说
无一人是男儿
]]>完全不用登陆,不用申请开发者,备份任意非锁推推特用户的所有推特
Twitter Back Up
例 Action workflow
https://github.com/yihong0618/GitHubPoster/actions/runs/3503844462/jobs/5869157102
又在喝一瓶一升的啤酒,一大罐,拿起来有些重,自己一边对着电脑看代码一边喝,从重量看这瓶要喝完了。 成年人的世界,说起来可笑,是一个不断抛弃爱好的过程,终于这个过程在肉眼可见的 35 岁迎来了抛弃朋友这一步。
一杯敬月光
我有很多朋友,很多都很要好,现在举起酒杯却不知道联系谁,甚至想的更多的是跟一些推特上, GitHub 上素未谋面的人喝上几杯,而不是曾经的朋友。
这种抛弃来的突然,某天被朋友教育,教育我不要总看不好的一面,嘴上答应的好依然欢声笑语。 可这次之后,半年过去了,一次也没联系过这十几年的朋友,微信默默的对其不可见,也不会说其它的,几次不回答之后,朋友也就不再理我了。挺好的。
一杯敬过往
我有一个爹了,我也是一个五岁孩子的爹,越发的不想再要一个朋友当爹了,当然,我会反思自己,但无趣了就是无趣了,年龄增长以后的世界抛弃了就是抛弃了。有精力多珍惜自己该珍惜的。
离开这欢乐场
看到很敬仰的推友的一句话:
这世界配不上这么善良的人儿
确实。忽然又想起自己那些死去的朋友,某种程度上他们永远活在那里,定格在那里,他们不会改变了,永远是我的朋友,我也会在某一天去找他们吧。
祈祷
大多数时候我是乐观的,毕竟,没有人能万岁的。
希望
接下来活的更洒脱一点,该抛弃就抛弃,同时担起应该有的责任。
干了这杯
写完这句把最后剩的这些一饮而尽,读到这的朋友,有机会,我们喝一杯。 没机会也无所谓。
写到这儿
]]>做的最绝的是多邻国
如果多邻国判断你是中国大陆用户
目前最简单的是 LeetCode
如果 LeetCode 判断你是中国大陆用户,并且你决定使用 LeetCode-cn
微信会用绑定的手机判断你是否来自中国大陆
如果你是微信的大陆用户
NRC 会用地点判断你是否为中国大陆用户
如果你现在是 NRC 的大陆用户
也挺绝的是 TikTok
如果你是中国大陆用户
欢迎补充
2023.05.12 补充
推友的补充以及我不对的地方
]]>从 2020 年开始,我用今天的跑步电台
这个 tag 记录自己一边跑步一边听电台也算是快两年了。也不断在下面评论中收到一些相同的问题和想让我推荐一些不错的电台,这篇文章就用 Q&A 的形式来写,也算是给自己做个记录,同时还能方便大家找喜欢的播客听。btw, 如果大家有不错的电台也可以推荐在这个 issue 的评论区。
Q: 为什么一边跑步一边听电台? A: 我跑步有些年头了,也喜欢一边跑步时候一边听些东西。最开始的时候还买了苹果的 shuffle 夹在衣服上听很方便。后来慢慢接触到了不错的播客,也是跑步时候听。最重要的是,我为数不多几个可以一心二用的时候,跑步听电台便是其中之一。他让有时候显得枯燥的跑步变得有意思多了。另外一个可以一心二用的时刻是:刷 Rogue Like 游戏时候听电台。
Q: 一边跑步一边听电台不会影响速度么? A: 会的,我想锻炼速度时候会改成音乐。
Q: 你用的是什么软件?
A: 我一般直接用 iOS 自带的 podcast, 中文叫播客
,偶尔自带的订阅的一些电台都听完了或者没感兴趣的会去小宇宙
翻一翻每天的推荐,看到感兴趣的就拿来听,如果真的特别不错就会订阅。哦对,有些墙内听不到的我用 google podcase
Q: 用的什么耳机? A: AirPods
Q: 平时都听的什么电台? A: 我几乎每期都听的参考下图的订阅列表。请自行搜索
还有重轻的《不在场》
Q: 还有其它的么? A: 我偶尔听的电台:
Q: 推荐哪些单期节目?
A: 放到了附件中,参考 recommand.txt
选出推荐的 10 期如下:
ID | 节目名 | 来自电台 |
---|---|---|
1 | 《那些被喜悦暴击的时刻 2.0》 | 故事FM |
2 | 《Full-Time Open Source》 | CORECURSIVE |
3 | 《有一种马赛克人人都喜欢》 | Anyway.FM 设计杂谈 |
4 | 《跨性别者的医疗照护》 | 一席 |
5 | 《与飞书小伙伴聊聊程序员那些事》 | ByteTalk |
6 | 《在流水线上画梵高》 | 故事FM |
7 | 《路人 2021 还可以,没问题》 | 路人抓马 |
8 | 《冷战中的宣传战》 | 忽左忽右 |
9 | 《美国》 | 不在场 |
10 | 《和 Gray 聊聊那些年遇到的神奇 Bug》 | 捕蛇者说 |
Q: 一边跑步一边听电台得到了什么? A: 啥也没得到。
Q: 有啥要注意的么? A: 冬天注意防滑,在路上跑的时候尽量不用降噪耳机,需要听周围的声音
Q: 推荐电台会持续更新么? A: 会的,特别推荐的我会继续放到表格里。
导出的所有今天的跑步电台
的推。
有段日子没写博客了。 一般情况,四张图加上 140 字能表达的内容我就直接发推了,想到这个可能会超过这个长度,就写在这里吧。 当然有个前情提要,感恩 GitHub Issues 的双向链接,
最近心血来潮决定去刷几道题,上一次也是第一次刷题还是 3 年前了。
刷题的过程中感觉到了自己的不足。写完代码就直接提交了,结果很多时候是错的。也发现了 LeetCode 有先测试功能,需要自己写测试用例。 编了几个之后突然想,为什么我不能用官方的测试用例呢?那样不是更方便。搜了一下发现是没有的,并且这个需求还是有人提过的
那么我能不能用我之前那篇文章的方法拿到 test case 呢?
data.in
最奇怪了,那么我们能不能打开呢?
print
根本是打不下的,LeetCode 也只会截取前面的,后面用 ...
代替zlib compress + base64
给字符串压缩,同样失败,有一点点效果urllib.request.urlopen
能不能把 data.in
发出去?不行,这个 docker 内部网是不通的第三年了,四月要过去了,声音一浪接过一浪,清零派,共存派。不知道何时收场,不知道怎么收场,突然想了一个可能性,会不会他们,就没打算收场。
战争即和平 自由即奴役 无知即力量 清零即共存
身处这片漩涡中,巨大的双手压在空中,那种无力感,挣扎,呐喊,404. 每个人都在其中,有时候会突然惊讶,身边的朋友怎么变成这样了?
最近的心情不太好,翻看自己的周记似乎一直在骂,骂战争,骂动态清零,当然只是在自己的地盘,在其他地方,家里,很少去表达自己真正的观点。
很多日常都搁置了,总是告诉自己等儿子幼儿园恢复了,家庭生活也正常了再去恢复自己,但 2 个月了,甚至没一个确切的日期。当然我比深处漩涡最深处的上海朋友好多了,也没太多值得抱怨的,他们太苦了。
我有一个 todo list, 列出了新冠过去了我想干什么,带儿子去日本玩等等,这个 list 越来越长,但慢慢的意识到了,我们可能再也回不去之前的生活了。
很多悲哀的事情来自于本可以,本可以不这样的,本可以不封城的,甚至,我们本可以没这 3 年的操蛋事儿的。
也许,我该接受这一切,平复自己的心情
实在不行,就去爱上老大哥,接受这一切,变成个傻逼
写到这儿。
]]>在数据库中运行需要的各种参数 --> GUC: Grand Unified Configuration. 当我们需要写 postgres 中相关的插件时,离不开 GUC 的处理,这篇文章对 GUC 做一些简单的记录。
而这些参数的可以有各种各样的来源,postgres 对每种来源的处理也不完全相同, 这些来源中有 pg 默认的,系统环境的,来自 user 的,来自 session 的等等等。。。一些基于 pg 的分布式数据库还会额外的增加 GUC 来源。
postgres 9.4 guc file src/backend/utils/misc/guc.c
const char *const GucSource_Names[] =
{
/* PGC_S_DEFAULT */ "default",
/* PGC_S_DYNAMIC_DEFAULT */ "default",
/* PGC_S_ENV_VAR */ "environment variable",
/* PGC_S_FILE */ "configuration file",
/* PGC_S_ARGV */ "command line",
/* PGC_S_GLOBAL */ "global",
/* PGC_S_DATABASE */ "database",
/* PGC_S_USER */ "user",
/* PGC_S_DATABASE_USER */ "database user",
/* PGC_S_CLIENT */ "client",
/* PGC_S_OVERRIDE */ "override",
/* PGC_S_INTERACTIVE */ "interactive",
/* PGC_S_TEST */ "test",
/* PGC_S_SESSION */ "session"
};
我们可以用命令查这些相关的 GUC 和来源
select name, setting, source from pg_settings;
不同的 GUC 也会有不同的权限。
/*
* Displayable names for context types (enum GucContext)
*
* Note: these strings are deliberately not localized.
*/
const char *const GucContext_Names[] =
{
/* PGC_INTERNAL */ "internal",
/* PGC_POSTMASTER */ "postmaster",
/* PGC_SIGHUP */ "sighup",
/* PGC_BACKEND */ "backend",
/* PGC_SUSET */ "superuser",
/* PGC_USERSET */ "user"
};
const char *const config_type_names[] =
{
/* PGC_BOOL */ "bool",
/* PGC_INT */ "integer",
/* PGC_REAL */ "real",
/* PGC_STRING */ "string",
/* PGC_ENUM */ "enum"
};
不同类型的 GUC 有对应相对的 GUC 函数,都用 DefineCustomXXXVariable 命名 srting 类型为例:
void
DefineCustomStringVariable(const char *name,
const char *short_desc,
const char *long_desc,
char **valueAddr,
const char *bootValue,
GucContext context,
int flags,
GucStringCheckHook check_hook,
GucStringAssignHook assign_hook,
GucShowHook show_hook)
{
struct config_string *var;
var = (struct config_string *)
init_custom_variable(name, short_desc, long_desc, context, flags,
PGC_STRING, sizeof(struct config_string));
var->variable = valueAddr;
var->boot_val = bootValue;
var->check_hook = check_hook;
var->assign_hook = assign_hook;
var->show_hook = show_hook;
define_custom_variable(&var->gen);
}
如上 DefineCustomStringVariable 可以容易看出,每种类型的 GUC 可以添加 3 个不同的 hook, 这 3 个 hook 在 set 时候触发,分别是
_PG_init
中岁尾,上班的最后一天,办公室非常冷清,我呢,在这敲下这行话。
似乎很久没有随意记录一下心情了,项目关注的人多了,乱写一通难免畏首畏尾,所以正式的内容多了些,而我这个博客的初衷本身就是记录自己的流水账啊,所以想写就写吧。
这两年心态发生了很多变化,好的方面坏的方面,尤其是去年最好的朋友之一选择自己结束生命,总觉得有些不真实,像是有些东西从我的生命中抽走了,再也回不来,想回沈阳看看的时候,少了件事儿,而我们共同的朋友也仿佛约好了一样,不去提起这件事,不去提起他。
新冠两年,科比也走了两年,仿佛这两年很多东西都被抽走,在儿子出生前,和媳妇约好带他出国到日本去玩,结果现在儿子连辽宁都没出过,更可怕的是,我们不知道新冠会持续多久,但大家内心可能都知道,我们再也回不去曾经的生活了吧?
去年做了不少事儿,但总觉得还不够,飞逝的时光,新年到了,这种新年的感觉体现在,超市一排一排的大礼包,酒,坚果。新年到了,虎年来了。
去享受最好的,也准备着随时承受最坏的
写到这儿吧
]]>翻看自己去年年初的 #202 (2021 的 3 个小目标) 发现很多都没完成,去年的目标不知不觉又变成了今年的目标,但我还是相信这一点,无论怎样,烂计划都是强于无计划的。
前些时候看到了一篇文章,触动到谈不上,但真的从中获益了很多,这种获益体现在,此刻我在打这篇文章 -- 我的个人 OKR 实践 01, 是的,一直随心所欲的我今年也开始定 OKR 了,对于 OKR 我更多的是关注自身,希望自己不会因为年龄的增长变得油腻,变得世故,变成了曾经眼里的傻逼
自己想学好日语太久了,也放弃太多次了,最多的一次学到初级下第 3 课,从小时候玩游戏,读村上春树开始就一直想学好,不用受汉化的束缚,回忆起来,大一时候第一次背 50 音图,10 多年过去了,还是没学成,不想说什么最好的时候就是 10 年前和今天 ,但真的想学学,嗯。现在水平是初级上,希望今年能多进步些,作为 OKR1 也代表自己的决心吧。
虽然天天跑步,天天做俯卧撑,但自己也天天喝酒,搞的自己成了个健壮的胖子,体检报告也开始不理想,虽然一年也没生病,但看到好的身材快的速度还是羡慕,哎,又减肥了
不多解释,吃饭和兴趣
如果有兴趣真的值得大家试一试:
是这家公司:https://twitter.com/adam8157/status/1407994800708587529
@adam8157 的回复
]]>FYI,那条推是我,但文中的面试官是我旁边组的同事。向他学习,我所在组的面试风格相比之下可能稍显老派,但我们整个产品部门都是看重技术思维、工程思维和解决技术问题的能力。
链接:
更新于 2022.08.22 《枫言枫语》的一些回忆
时效
没有那么强的相关,很多老节目也能被大家看到喜欢Day One 上的照片,记录着我两年前跑的马拉松,那时候真是又快又瘦啊。 今天还被同事说胖了,确实,这半年喝了不少酒。
也不知道什么是对错。昨天推上收到了个私信,问我怎么鸡娃,我有点生气,可能这就是无趣吧?
当然,我一直认为,一个一边引用着了不起盖茨比,一边每天嘲笑别人的人也无趣。 挂着自己是个有趣的人 title 的大概也没那么有趣吧? 我是个有趣的人么?大概不是吧?不过倒是也无所谓是与不是,做个地道的人。 最近换工作的想法日益强烈但也不知道该怎么走下一步,倒是收到了一些邀请,但我,配的上这些邀请么?
今年的时间也剩的不多。想做的东西很多,时间精力,和动力好像都不太够。也只能慢慢来了。 刚去看了一眼现在跑了1064km 今年跑 2000km 的计划大概不可能完成了,希望自己努力超过去年吧。
应该比去年好,但我更想说的是,很多想法,不如从今天开始。
也快到 5 点了,今天早点下班吧。
其它还有些计划,先不写在这儿了。
]]>running_page 开源一周年了,虽然后面逐渐把精力放到了其他项目上,但还在维护着,无论是 issue 还是新需求也都第一时间去回复,感觉一个项目诞生但发展,像是看自己的孩子一样,喜怒哀乐。 当然,在程序上有一些进步的同时,带给我更大的收获是认识了好多好多跑步的朋友,程序上的朋友,能在帮到大家的同时还能交到一些志同道合的朋友,再把自己的东西回馈给社区,这也是我理解的开源的意义吧。
截止今天 2021-09-27
Stars | Fork | Issues | Contributors |
---|---|---|---|
1391 | 278 | 99 | 30 |
当然这一年经历了不少有意思的事儿。
所有贡献者和使用这个项目的人,希望大家一直跑下去,这个项目也一直 running 下去,也是 running_page 的意义
]]>不知不觉网上的粉丝多了起来,这一年,以前作为一个透明我从来没想过自己有一天也会有几千个 followers, 有 2 千多个 stars, 在推特上,在 GitHub 上。
而越是这样,越要控制自己表达欲,否则,不知不觉间也就迷失了自己,忘了自己是谁,忘了自己该做的事儿。 因为: 在概率模型下,无论我说什么,无论我对什么热点事件发表些评论,就永远有人赞同,而沉默的大多数,要么一笑而过,要么默默取消关注,而我,怎么可能一直是对的?
所以,无论外面啥热点事件,我都只是看着 timeline 刷屏,自己最多是对一些有趣的评论一下,希望以后我也能做到。
当然,也是写这个的原因,工作越来越无趣了,一直想换一个工作,希望年底能下决心动手吧。
不知道我们会走向何方,这种无力感,尤其是看多了很多历史后的无力感。
跑步,慢慢认真了起来。
格式如下(请参考我下面的 comment): 冒号为中文冒号 :
名字:xxxxxx 链接:xxxxxx 描述:xxxxxx
偶尔打开朋友圈,看到朋友在骂日本奥运作弊,骂日本乒乓球选手,会摇摇头,除了无奈什么也做不了。这种无奈体现在,他是你最好的朋友,不会因为观点不同有改变那种好朋友。
更无奈的是,也就在几年前,还在和他一起碰杯,谈谈 -- 中国没有历史,只有轮回
。不过,现在不会和任何人谈这些了。
昨天和朋友聊,现在我能做的只能是 -- 带上面具,去找内心的自由
,我也确实是这么做的。
打了几行话,又删了。
写到这儿。
]]>今天,王兴也不再更新了。 太多东西不会永远持续下去了,曾经饭否关停那么久,他也没停止更新,但今天。。。
即使不针对人的话,回过头看看十年前的言论也很有意思,有一种时间的错位感,10 年过去,有些变了,有些没变。而这十年,互联网变了好多,也有一些留住的东西。嗯,10 年过去了,墙还在,更高了一点儿。而当时,有趣就有趣在,这些现在看起来的名人不用在平台受舆论监控,一般都是想说什么就说什么,也是唯一我们能看到真实的他们的几年了。
新账号上路! 2010-11-26 13:59 # 第一条饭否
中国人比美国人有精力的体现是,中国人每天要看好几份国内的微博,还要出墙去留意美国的推特。 2010-11-26 17:36
一个产品,要加多少的功能,才能成为一个垃圾产品啊! 2010-11-27 23:24
产品往往是做着做着,就主旋律了,因为跟着用户走,用户爱听主旋律的歌。 2010-11-29 00:04
自从有了微博,我看书就少了。自我检讨。 2010-11-29 23:47
微博还真是个把事情越搞越复杂的地方,尤其是女人多的时候。 2010-12-01 01:59
微博也是个很危险的地方,因为你说一句话,每个人都有不同的理解。只怕有心人啊。 2010-12-01 02:02
平均每天收到一张iTunes Store的帐单。我要在apple上疯狂消费,来赎回以前在windows上狂用盗版的罪。 2010-12-12 14:01
不是所有东西,都需要2.0的。 2010-12-22 16:47
人无近忧,必有远虑。人有远虑,必有焦虑。 2010-12-27 22:58
手机是人的最重要的人工器官。 2011-01-02 15:33
转@憨豆主席 新闻联播证明了物理学上的一个重大课题——平行空间是真的存在的。 2011-01-07 18:23
智能手机市场曾经被加拿大和芬兰人占领。当这个市场终于迎来大爆发的时候,苹果, Google 和 MS 恰到好处的把他夺了回来。看来,没有核心竞争力保障的产权并不靠谱。
我在微博上说android的体验没有ip4好,很多人跟我急。我猜想,这大概和爱国的心理是类似的。我用的物品,如果被否定,那就否定了我的人格了。我出生的国家也是一样。这些人的人格退化为物格国格了。否则,我说android不好,他生什么气呢? 2011-05-15 22:35
一天看到三个不同的事情的描述,都是“内幕很可怕”。 2012-04-09 19:33 # 最后一条
一阵寒风袭后背啊。转@泡芙先生 2010年,中国社会科学院在京发布的《中国新媒体发展报告(2010)》指出,社交网站的病毒式营销手段、泄露个人隐私以及政治、军事、商业机密信息等问题也引发质疑,Facebook等社交网站被西方国家情报机构所利用,其特殊的政治功能则让人心生恐惧。 2010-12-27 23:57
钟南山说,空气污染对肺的伤害远远超过吸烟了。搞得我都不好意思戒烟了。转@阳光不锈钢 RT @elaoda 中国疾病专家最近表示,中国空气污染与呼吸疾病的联系越来越紧密,广州、北京、上海等许多大城市都面临肺癌率明显上升的趋势,肺癌已经取代肝癌成为中国癌症死亡的第一杀手。 2010-12-29 17:09
windows的糟糕的字体表现让中国人的UI审美水准滞后了10年。 2010-12-30 03:29
在鄙视了windows mobile多年之后,开始为windows phone7叫了一声好。微软这次能在iPhone之外找到了完全不同的另外一种交互模式,还是很牛逼闪闪的! 2010-12-30 15:32
quora让我感叹的是,人家的知识底子确实必我们厚太多了。 2010-12-31 01:36
现代通讯工具的要义是:我发出消息,你看,或者不看,都与我无关。人们在IM上花费的时间将越来越少。 2011-01-01 14:33
手机上需要实时聊天吗?谁有耐心用手机输入来聊天呢? 2011-01-02 15:14
胶卷,唱片,卡带,甚至固定电话,这些老物品在消逝,连同它们所代表的生活方式一道。 2011-01-04 18:51
为什么Kindle,iTouch在国内销量如此的小?iTouch在美国的销量和iPhone持平。 2011-01-10 13:12
互联网让80后90后产生了更严重的两级分化。 2011-01-10 15:07 # 00 后更不同了
中国互联网的落后在于硬件的落后,别人都普及了iphone的时候我们还在面对最大量的S60用户。 2011-01-16 03:11
千元android机应该今年会比较普及吧。转@bjshadow 大学校园基本都是诺基亚。其实我也感觉诺基亚如果仅用于上网电话与短信,用着还是不错的。 2011-01-16 03:17
体验不好的电子产品,都会罗列一堆硬件参数来吸引买家。当然,买家也认这个,虽然他并不知道1千万像素到底有什么最终的效果。 2011-01-18 17:17 # 草草草
腾讯微博注册量过亿。腾讯最不缺的就是注册量了。 2011-02-05 22:18
会有另外一个Steve让Nokia起死回生吗?让一个庞然大物起死回生,比从零建立一个王国还困难。 2011-02-11 01:03
知乎像个专业论坛。 2011-02-15 23:31
新浪微博的手机访问量是否超过web?手机写微博的量呢? 2011-02-24 16:39
从三分钟的体验来看,点点从形式上来说,比饭否和Instagram(拍拍)都复杂,不够优美,因此应该发展不过饭否和拍拍。但愿我是错的。 2011-02-25 00:05
互联时代了,基于ip的短信,语音,视频,还被人为限制。所以技术最大的敌人是人。 2011-02-26 22:16
如果扎克伯格在中国,他连在战略发展部旁听的资格都没有。 2011-03-07 17:08
instagram也要被做烂了。 2011-03-15 14:59
甲骨文的CEO对他的员工说,你们都是傻逼,所以甲骨文招揽了很多优秀员工。苹果的CEO对用户说,你们都是傻逼,所以苹果招揽了许多优秀用户。阿里巴巴的CEO对投资者说,你们都是傻逼,所以阿里巴巴招揽了许多股东。 2011-07-19 23:18
知乎上人越来越多,回答也就越来越不靠谱了。话说回来,人少的时候也不靠谱。这该怎么办呢,还是要颁证。 2011-10-11 04:27
talkbox在hk干不过whatsapp,可见那是个神奇的地方 2011-10-15 06:33
中国的教育是扼杀好奇心的完美历程。 2011-11-03 01:23
牛排的电池容量很大,如何让它可以给iphone充电? 2012-03-25 22:24
盛大出了一个叫“Kiki”的软件。我只能说,好歹,不要在名字上也这么山寨吧!取个名字有那么难么? 2010-12-30 15:53
当我在嘲笑盛大kiki的时候,其实我比它也好不了多少。 2010-12-30 16:58
当whatsapp,kik,米聊,速聊,kiki都狂推实时聊天概念时,老夫决定反其道而行。 2011-01-02 15:18
你问我们和竞争对手比有什么区别,我说我们没有他们那些臃肿艳俗的部分。 2011-01-02 15:20
短信的好处在于它是默认隐身的。 2011-01-02 15:31
这么多天过去了,米聊竟然才3千个用户。 2011-01-03 18:58
你为什么不用米聊? 2011-01-07 16:40
将whatsapp,kik,miliao打下来,也算是个小小的刺激吧。 2011-01-10 01:19
whatsapp kik,pingchat的兴起,将S,R,D这些术语灌输给用户,国内的后来者竟然也这样带入了。 2011-01-11 18:32
米聊竟然也做了好友动态,竟然尝试了我一直在想的东西。 2011-01-16 02:46
从众多的kik模仿犯来看,国内基本没有从用户心理考虑产品的产品经理。除了模仿,他们的创新也是意淫。 2011-01-17 17:42
做kik什么的都没意思,拟一个RFC协议,将kik,whatsapp,米聊什么的都互通起来,才算正经事。 2011-01-18 01:55
这么多年了,我还在做通讯工具,这让我相信一个宿命,每一个不善沟通的孩子都有强大的帮助别人沟通的内在力量。 2011-01-23 01:54
雷军还在用八一精神来工作,我比较难理解。http://is.gd/yEe5Rp 2011-02-07 02:12
talkbox突然大热,大量vc急杀过去。须小心大热倒灶。 2011-04-14 02:11
每次看到知乎上人在讨论为什么启动画面是一个人顶个球,我就很乐。 2011-09-20 18:08
米聊hold不住了,做了lbs。新浪hold不住了,做了对讲。飞聊翼聊一看就是外包的。 2011-09-29 15:55
line突然大火,可见萌很重要。 2011-10-15 06:29
微聊从概念上来说就偏了。 2011-10-25 03:56
因为Steve Jobs生病,苹果股价下跌8%,损失百亿美元。由此可知,Jobs生的是全世界最昂贵的一种病,目前只有Jobs一人患此病。 2011-01-18 00:19
Jobs是个被艺术化的商人,现在在跟android比销量。http://cnbeta.com/articles/... 2011-01-18 12:52
不谈Jobs,我们还能谈什么呢? 2011-10-09 22:14
“假设把乔布斯从30年的历史中抽掉,我们今天的世界未必会变得更糟糕,或者更美好,但可以肯定的是,如果没有乔布斯,硅谷一定会比较无趣,我们的世界也会比较无趣。” 2011-10-24 00:52
记录下: 来自 -- https://github.com/Allianzcortex/FF-Backup/blob/master/Allenzhang_fanfou_backup
]]>回到家依然有些生气。 今天在这里反思,我一直算一个随和的人,在网上,在生活中。
我真的有必要因为这种人心情沮丧么? 我骂她,骂赢了又如何了,浪费了时间,浪费了更多的心情。
这种人在网上我会默默拉黑或者 mute, 在生活中也是吧,不值得浪费一点点时间。
写到这儿。
]]>我的解法还不错,还得到了作者的称赞,开心了一下~
推特的好处是能遇到各种有趣的解法和讨论,下面对每个解法的解释,其中不少 Python 的巧妙应用
def merge(a, b):
res = []
for ab in zip(ab):
res.extend(ab)
return res
这种的解法的好处是清晰易懂,坏处是因为会不断的 resize list 当列表很大的时候会有效率问题
from itertools import chain
chain.from_iterable(zip(a,b))
这种是比较 Pythonic 的解法,用到了 Python 标准库中非常好用的 itertools, 且不用引入中间变量,没有特别的效率问题,清晰直观,也是工作中比较推荐的代码。
以上的都有循环或需要不断 resize 的小问题,那么能不能不 resize 呢?如果列表的长度相同,是可以的,我们只需要建一个列表,然后把 a, b 的元素按规定放进去就行了,这就用到了 Python 非常强大的切片了。
有用同样方式的推友贴出了效率的比较
可以看出,如果不去 resize 的话会有将近 10 倍的效率
def merge_gen(a, b):
for thing1, thing2 in zip(a, b):
yield thing1
yield thing2
list(merge_gen(a, b))
用到了生成器,还不需要引入中间变量,效率同样很高
sum(zip(a, b), ())
这个解法的有趣的地方在于,sum 是有第二个参数的,作为起始,默认是 0, 如果我们把第二个参数放一个空的 tuple, 就相当于不断的迭代,求和。 但因为也是循环迭代,当大列表时候存在效率问题
从这一个问题动手研究,看大家的思路,还是非常有趣的,有些解法很巧妙也很好玩,参与其中也体会到了写 Python 的乐趣,虽然这些大部分的方式不会让我们在工作中写出更好的代码。但,研究这些方式背后的知识非常有趣,至少让我快乐了一个小时,把我的快乐分享给大家哈哈。
]]>从最开始的用 GitHub 的 Issues 写博客,到尝试用 GitHub 记录的年度数据已经二年有余了,从最开始有想法 2020, 到 2021 加了很多功能,把大部分的记录自动化,一点一点记录也算是有些心得了,这篇文章就介绍一下我是怎么做的,能帮助到同样感兴趣的大家就更好了。也算是践行这 2 年对我影响最大的文章之一
好,我们把这些结合起来,记录自己的一年~
上图这些数字区是怎么实现方式分为两部分:
每天早 8 点和晚 9 点,定时跑一次,计算数据进行整合,并配合 telegram 的 bot 提醒自己。 入口大家可以参考 Actions 的这个 workflow
Issues 的代码思路为获取 label -> 通过 label 找 issues -> issues 的评论特定格式 -> 通过函数解析 -> 整合 -> 通过正则替换 README 中的原有数据(文字) (README 可以写注释,而注释是不显示的,利用这个完成显示和替换)
def main(
login_dict,
github_token,
repo_name,
):
my_num_stat_str = MY_NUMBER_STAT_HEAD
# API STAT STR
for name, value_dict in MY_STATUS_DICT_FROM_API.items():
try:
url = value_dict.get("url")
md_name = f"[{name}]({url})"
# maybe a better way?
total_data, streak, today_check = value_dict.get("daily_func")(
*login_dict.get(name, tuple())
)
total_data_str = str(total_data) + value_dict.get("unit_str", "")
my_num_stat_str += make_stat_str(
md_name, total_data_str, streak, today_check
)
# just a tricky code for others for use
except Exception as e:
print(e)
continue
u = Github(github_token)
# COMMENTS STAT STR
for name, value_dict in MY_STATUS_DICT_FROM_COMMENTS.items():
try:
labels, map_func, reduce_func = LABEL_DAILY_DICT.get(name)
except:
# tricky for mine
continue
func = value_dict.get("daily_func")
if not func:
break
issues = u.get_repo(repo_name).get_issues(labels=labels)
total_data, streak, today_check, url, month_summary_dict = func(
issues, map_func, reduce_func
)
# change the issue body for month summary
unit = value_dict.get("unit_str", "")
for i in issues:
body = ""
for b in i.body.splitlines():
# from the summary table
if b.startswith("|"):
break
body += b + "\r\n"
body = body + "\r\n" + make_month_summary_str(month_summary_dict, unit)
# edit this issue body
i.edit(body=body)
name = f"[{name}]({url})"
total_data_str = str(total_data) + unit
my_num_stat_str += make_stat_str(name, total_data_str, streak, today_check)
replace_readme_comments("README.md", my_num_stat_str, "my_number")
关于早起这个数据和 issue 因为自己喜欢诗歌,我找了一个获取一句诗的 API, 然后自动评论,评论是带时间戳的,正好记录自己的起床时间。 那么是怎么触发的呢? 我用的是 iOS 系统,而 iOS 有个重要的功能是“捷径“。利用捷径可以触发 Actions workflow 的 api, 触发 api 就有时间戳了,再判断是不是早起,给自己发送就好了。 捷径的触发条件是闹钟关闭,为了保险起见,我可能比闹钟起的早,再加一条关闭背单词软件,解决了用 GitHub 记录早起的问题。
def make_get_up_message():
sentence = get_one_sentence()
now = pendulum.now(TIMEZONE)
# 3 - 6 means early for me
is_get_up_early = 3 <= now.hour <= 6
get_up_time = now.to_datetime_string()
body = GET_UP_MESSAGE_TEMPLATE.format(get_up_time=get_up_time, sentence=sentence)
return body, is_get_up_early
关于如何利用捷径配合 Actions 我写过一篇文章 -- 巧妙利用 iOS 的快捷指令配合 GitHub Actions 实现自动化 而早起这句诗,我期待好久的 -- 苟利国家生死以,岂因福祸避趋之。还没随机到,随到这一天我决定跑 19.26 km.
利用了我写的 GitHubPoster 项目,自动生成 svg 引入,而自动跑的脚本也在那个项目上。
利用我写的 github-readme-stats 自动替换生成。
全部利用 Issues 评论 -> 触发 Actions -> 自动替换 README 的注释区域生成
def replace_readme_comments(file_name, comment_str, comments_name):
with open(file_name, "r+") as f:
text = f.read()
# regrex sub from github readme comments
text = re.sub(
GITHUB_README_COMMENTS.format(name=comments_name),
r"\1{}\n\3".format(comment_str),
text,
flags=re.DOTALL,
)
f.seek(0)
f.write(text)
f.truncate()
和上面类似,因为做的太多,我生成了个表格
def parse_cook_issue_table(me, issues):
comments_str = MY_FOOD_STAT_HEAD
food_dict = defaultdict(lambda: ["", "", 0])
for issue in issues:
comments = issue.get_comments()
for c in comments:
if not isMe(c, me):
continue
date_str = format_time(c.created_at)
food_list_str = c.body.splitlines()[0]
food_list = food_list_str.split(" ")
for food in food_list:
if food not in food_dict:
food_dict[food][0] = f"[{date_str}]({c.html_url})"
food_dict[food][1] = f"[{date_str}]({c.html_url})"
else:
food_dict[food][1] = f"[{date_str}]({c.html_url})"
food_dict[food][2] += 1
for k, v in food_dict.items():
comments_str += MY_FOOD_STAT_TEMPLATE.format(
name=k, first_date=v[0], last_date=v[1], times=v[2]
)
return comments_str
每次自动生成还会 edit issue 的内容生成月度数据整合
在 blog 的 repo 写 issue ->curl 2021 的 Actions workflow api -> 自动生成
这个完全手动添加,我想保留一些仪式感
如果大家想同样做一个这样的年度数据可以 follow 以下步骤:
COOK_LABEL_LIST = [
"Cook",
]
MOVIE_LABEL_LIST = [
"Movie",
]
READ_LABEL_LIST = [
"Read",
]
DRAMA_LABEL_LIST = [
"Drama",
]
PUSHUP_LABEL_LIST = [
"PushUps",
]
BANGUMI_LABEL_LIST = [
"Bangumi",
]
GAME_LABEL_LIST = [
"Game",
]
MONEY_LABEL_LIST = [
"Money",
]
MEDITATION_LABEL_LIST = [
"Meditation",
]
MORNING_LABEL_LIST = [
"Morning",
]
GTD_LABEL_LIST = [
"GTD",
]
MY_BLOG_REPO = "yihong0618/gitblog"
GITHUB_README_COMMENTS = (
"(<!--START_SECTION:{name}-->\n)(.*)(<!--END_SECTION:{name}-->\n)"
)
# add new label here
LABEL_DICT = {
"Cook": {"label_list": COOK_LABEL_LIST, "comment_name": "my_cook"},
"Movie": {"label_list": MOVIE_LABEL_LIST, "comment_name": "my_movie"},
"Read": {"label_list": READ_LABEL_LIST, "comment_name": "my_read"},
"Drama": {"label_list": DRAMA_LABEL_LIST, "comment_name": "my_drama"},
"Bangumi": {"label_list": BANGUMI_LABEL_LIST, "comment_name": "my_bangumi"},
"Game": {"label_list": GAME_LABEL_LIST, "comment_name": "my_game"},
}
##### SHANBAY ######
MY_SHANBAY_USER_NAME = "ufewz"
SHANBAY_CALENDAR_API = "https://apiv3.shanbay.com/uc/checkin/calendar/dates/?user_id={user_name}&start_date={start_date}&end_date={end_date}"
MY_SHANBAY_URL = f"https://web.shanbay.com/web/users/{MY_SHANBAY_USER_NAME}/zone"
##### DUO ######
MY_DUOLINGO_URL = "https://www.duolingo.com/profile/yihong0618"
##### CICHANG ######
MY_CICHANG_URL = "https://twitter.com/yihong06181/status/1359040099107897344?s=20"
##### FOOD ######
MY_FOOD_STAT_HEAD = (
"| Name | First_date | Last_date | Times | \n | ---- | ---- | ---- | ---- |\n"
)
MY_FOOD_STAT_TEMPLATE = "| {name} | {first_date} | {last_date} | {times} |\n"
##### Month Summary ######
MONTH_SUMMARY_HEAD = "| Month | Number | \n | ---- | ---- | \n"
MONTH_SUMMARY_STAT_TEMPLATE = "| {month} | {number} |\n"
]]>总是看一些人引用一句话:
世上只有一种英雄主义,就是认清生活的真相之后依然热爱生活。
但,对我来说这句话还有后面三个字 —— 要不呢? 这两天的新闻,注销了微博几乎不去看的我也感觉到了热度。当了父亲之后看了这样的新闻尤其的难受,因为见得多了,也大概能猜到是这样的收场。 早上送完儿子上幼儿园,车上,和媳妇讨论了几句,想着我们遇到了这样的事儿该怎么办?我们都不知道,也不敢再继续往下想。 是啊,要不呢?这种英雄主义,在很多时候只不过是无奈的选择罢了。
逃离。 这几年,很少去和我以为的傻逼认真交流,甚至不去反对他们,反而是应和,网上遇到有些看起来智力不是很够的评论,我也是默默点个赞,几乎没有对喷的时候 —— ”嗯,你对“。 昨天和朋友聊了下,这样活得有些狂了,以前还能交流下,后来慢慢意识到,大部分人很难改变,很难承认自己的错误的时候,就放弃和他们说自己的想法了。嗯,在我眼里这帮人和一坨猪肉的区别不大。
慢慢的 虽然有些事儿依然糟心,但学着更多地关注自身,关注自己的家庭了。
还没到必须唱赞歌的时候,就别去。
我是个懦夫,能力也不够,至少这辈子可能做不到为苍生说人话了。 只能在保护家人的前提下做到 Never forget, Never forgive.
]]>有段时间不写博客,就会浑身难受,实在没写的就更新下近况。
嗯,我今天有些这样的感觉。
起因是有个前公司的群(虽然我已经退了大部分群),群里有人呼吁抵制 nike, 我想骂上一句,还是算了,默默退掉了群。不知道为什么人能渐渐变得如此无趣,无论是同事还是生活中都是很不错的人,挺沮丧的。
最近的生活:
接下来:
吐槽完毕,总结畅想完毕,工作生活都要继续,让沮丧就是短暂的情绪吧。
]]>没有什么样的生活是容易的,又有很多困难需要解决。当然焦虑是毫无用处的,沮丧呢,也许只是短暂的情绪,更多的是要面对,不是豁达,也不是活的明白,更多的是因为被锤过几次之后知道了,有些事儿沮丧也好,焦虑也罢,只会适得其反。
这个年算是过完了,虽然谈不上开心,也谈不上难受,总归是过完了,还涨了几斤。
丈母娘的腿出了一点问题,好多重担就压了过来,许多事儿要有 Plan B 了,比如我的职业规划,比如我的努力的方向,比如很可能我又要放弃一些东西。
记得前些天播客听到一句话
成长是一个不断放弃的过程。
是啊,我不断的把自己的爱好抽出去,游戏,电影,读书,这些越来越少了。但也多了一些东西,看着自己孩子成长的快乐,和家人一起的快乐。拿起与放下,中间才是人生。好在,跑步还在继续,新的爱好编程成了工作。
记得读大学的时候,媚俗
的读了很多米兰昆德拉的书,大部分都忘了,甚至当时读的感觉都忘了,但有句话一直刻在脑子里,喝多了的时候总拿出来引用 --
人永远都无法知道自己该要什么,因为人只能活一次,既不能拿它跟前世相比,也不能在来生加以修正。
很多选择也就无所谓对错了。
年过完了,时间点上来看,是一个新的开始。
我也需要思考和多做一些事情。
不如
从今天开始。
]]>一般刚大家刷 LeetCode 难免好奇为什么会自动生成个 class Solution: 点击提交后台就能直接运行。虽然我们不能拿到 LeetCode 的源码,但是经过初步尝试,我发现,我们是能通过一定手段搞清楚 LeetCode 是如何提交运行的。
某天一位群友发了个问题,他有个地方 typo 把小写的 l 写成大写的 L, LeetCode 竟然能编译通过,代码如下:
class Solution:
def threeSum(self, nums: List[int]) -> List[List[int]]:
n = len(nums)
res = []
if (not nums or n <3):
return []
for i in range(n):
if nums[i] > 0:
return res
if i > 0 and nums[i] == [i-1]:
continue
l = i + 1
r = n - 1
while l < r:
if (nums[i] + nums[l] + nums[r]) == 0:
res.append([nums[i], nums[l], nums[r]])
while L < r and nums[l] == nums[l+1]: # 此处写成了大写的 L
l = l + 1
while L < r and nums[r] = nums[r-1]:
r = r-1
l = l + 1
r = r - 1
elif (nums[i] + nums[l] + nums[r]) > 0:
r = r - 1
else:
l = l + 1
return res
接下来有人回复,是因为 LeetCode 从 re 中 import * 导致了 L 是个全局变量,这个 L 的值是 4. 证明如下图:
可见,这个 L 是 re 里的 re.LOCALE
那么我们就可以好奇下,LeetCode 都导入了哪些默认的包呢。有哪些是 import * 呢 ?
直接 print globals() 发现是 copyright, 至于为啥是这个 copyright, 好奇的同学可以查一下,挺有趣的。 于是尝试下 print globals().keys(), 嗯,LeetCode 默认导入了相当多的模块,很多是 import *, Python 解析速度慢,也不奇怪了。 再尝试下用 sys 模块打印 import
知道这个之后,大家刷题可以不用在 collections 里导入包了
那么,既然他们好多模块是默认导入的,比如比较危险的 sys 和 os 模块,那么我们是否能做点什么呢?
leetcode
和 dockerenv
和猜想的一样,LeetCode 是用 docker 运行程序的
/mnt
找到了 .py
文件,我们看看是啥。很好,破案了。
具体代码如下: 原来 LeetCode 看似神秘的程序运行构造也并不复杂。
# coding: utf-8
from string import *
from re import *
from datetime import *
from collections import *
from heapq import *
from bisect import *
from copy import *
from math import *
from random import *
from statistics import *
from itertools import *
from functools import *
from operator import *
from io import *
from sys import *
from json import *
from builtins import *
import string
import re
import datetime
import collections
import heapq
import bisect
import copy
import math
import random
import statistics
import itertools
import functools
import operator
import io
import sys
import json
import precompiled.__settings__
from precompiled.__deserializer__ import __Deserializer__
from precompiled.__deserializer__ import DeserializeError
from precompiled.__serializer__ import __Serializer__
from precompiled.__utils__ import __Utils__
from precompiled.listnode import ListNode
from precompiled.nestedinteger import NestedInteger
from precompiled.treenode import TreeNode
from typing import *
sys.stdout = io.TextIOWrapper(sys.stdout.buffer, encoding='utf-8')
# user submitted code insert below
# Definition for singly-linked list.
# class ListNode:
# def __init__(self, val=0, next=None):
# self.val = val
# self.next = next
class Solution:
def addTwoNumbers(self, l1: ListNode, l2: ListNode) -> ListNode:
print(os.listdir("/mnt"))
with open("/mnt/prog_joined.py") as f:
print(f.read())
import sys
import os
import ujson as json
def _driver():
des = __Deserializer__()
ser = __Serializer__()
SEPARATOR = "\x1b\x09\x1d"
f = open("user.out", "wb", 0)
lines = __Utils__().read_lines()
while True:
line = next(lines, None)
if line == None:
break
param_1 = des._deserialize(line, 'ListNode')
line = next(lines, None)
if line == None:
raise Exception("Testcase does not have enough input arguments. Expected argument 'l2'")
param_2 = des._deserialize(line, 'ListNode')
ret = Solution().addTwoNumbers(param_1, param_2)
try:
out = ser._serialize(ret, 'ListNode')
except:
raise TypeError(str(ret) + " is not valid value for the expected return type ListNode");
out = str.encode(out + '\n')
f.write(out)
sys.stdout.write(SEPARATOR)
if __name__ == '__main__':
_driver()
至于下图中的这些是什么?LeetCode 其实在里面放的是 pyc 文件,但是大部分 pyc 是能转换回来的,通过一些手段,这个留给大家感兴趣自己研究哈哈。
理论上其它语言可以用同样的思路。至于其它好玩的事情,大家可以自行发掘(笑)。
]]>目前又卡在下图不知道啥情况,希望只是在下载吧。
一下午就这样没了。还是希望用 mac 开发,不用遇到这样一堆一堆环境问题。
生活上,还是不在这说了。
想起那天为了格式的代码也是搞了一上午,感叹了一句,排版真的是太难了,也没解决,啊。 写到这编译还没通过。
今天上了下微博,好像又被这帮弱智恶心到了,也不想去评价什么。不知道谁往粪坑里扔了个二踢脚。微博就这样了,民粹被点燃了,群魔乱舞。他们还会跳起来骂你,就很沮丧。我选择沉默图个清静也躲不开,因为这帮弱智好像传染病,会传染到你的亲人,朋友。
写到这的时候编译好像过了。
那就写到这儿吧。
]]>今天看到某人年终总结中的一句话: 恰好符合我今年的主题,记录一下。
优秀的程序员和普通的程序员之间很多时候只隔了一层好奇心,对「有没有更好,更有效率,更聪明的做法」的好奇心。在这个时代,「代码」是一种生产资料的,而大量的程序员们却自己忽略了这一点,或者自愿放弃了这点。
准备开坑个新的小玩具。
如果说我最近一段时间学到了什么,就是,尽量不去评价别人( judge people), 成长,是一个不断把傻逼列表清空的过程,当然,彻底清空是不可能的,总会有些人是纯傻逼,比如菜小龙。但是,我慢慢去理解每个人成长环境的不同,心智的差异,选择方式的不一样,价值观什么的也是完全不一样的,求同存异,努力去理解他人,be nice, 找到其中有趣的地方,并去享受这些,日子,也会过得快乐许多。
安全问题真重要。感动
]]>不知不觉已经快用 Issues 写博客两年了。倒是没什么心得,没什么观众,自言自语,留一些纪念。
新的一年开始了,准确说,庚子年还有一些时间。不迷信的话,其实,今年和去年没有本质的不同,无非是日期上的变化,牛年,也不意味着牛气冲天。
今天的新闻是 -- 拼多多女孩猝死,除了惋惜一下,在这里似乎也没什么办法破局
, 在有限的资源里,有些根本的东西不改变,一切也都不会变好。
朋友问我 2021 有什么计划,计划还是有一点的,但我看了看我去年写了好多 TODO List, 有一些实现了,但更多的是在那儿躺着,所以,还是不说了,去做就好了。
哦,有两点还是想说一下的:
广义上的计划,说说也无所谓,因为这两点是发自内心想做的,其余的计划,即使不说出来也是围绕这两点的。
新冠疫情还没结束,我和媳妇在家办公,幼儿园停了,身上的压力也大了一些,开年这样倒是也是对自己的一些磨炼。总是要成长啊。
新的一年,不可能一帆风顺的,希望自己能乘风破浪。
用一首很喜欢的友邻的签名作为结尾。这首诗我也是越读越喜欢。
]]>西风吹老洞庭波,一夜湘君白发多。 醉后不知天在水,满船清梦压星河。
突然想记住这一刻 帮儿子去买面包,明早吃 午夜,罗森 还买了两个鸡翅 一边吃一边独自走在街上 无人 风吹着,雪花飘的不大 今年要结束了 享受这一刻的自己 告诉我说 回去 一定要记下来 记住此刻的心境 对今年的种种无奈和喜悦 对明年的期待和畅想 记住此刻的雪花 记住此时在熟睡的老婆孩子 记住跑过的路 记住写下的代码和文字 记住此刻在手机敲的这个issue 然后睡觉去。
]]>于是想到了,可以利用捷径啊!我们一般利用 app 记录跑步,如果能用某种手段跑完步,触发 Actions 就可以同步数据,或是完成其它功能了。
这样就不用 crontab 了,只要能利用手机触发就可以了。
workflow_dispatch:
可以手动触发 curl https://api.github.com/repos/yihong0618/blog/actions/workflows -H "Authorization: token d8xxxxxxxxxx" # change to your config
curl -H "Content-Type:application/json" -X POST -d '{"inputs": {}, "ref":"master"}' https://api.github.com/repos/yihong0618/blog/actions/workflows/: actionid/dispatches -H "Authorization: token d8e03d6xxxxxxxxxxxx" # change to your config
]]>
NRC
发现自己当年一系列的操作几乎忘光了,他没有成功,有些遗憾。想着,如果当时写个博客就好了,以后跟人分享还方便,也能让更多的人转移成功。
于是,这些天尝试如何获取悦跑圈数据的过程,记录一下。
关于获取数据代码在这里。
]]>喝了点酒,总是不自觉的想起死去的朋友。想起你说你开始读村上春树,想起你玩了好些年的地下城,现在手游也要上了。想起来年少时我们拿着两个棍子在后院的煤山上比划,仿佛两个英雄。想起你酒后谈起不知道未来在哪里,想起北岛的《波兰来客》,想起了我们渐渐的少了话题,最后收到的却是你死去的消息。
昨天,读了一篇文章,新阡去岁留, 感觉难过极了,想起我和你见的最后一次是我们一起去参加朋友的婚礼,结束后来我家又喝了点儿,下午我回大连,分别的最后一句话是 -- “我再回来我们再喝酒”。
不知道哪次分别就成了永远。
这篇文章的英文标题其实更好 -- respect2dead, 我们最后几次见面经常聊到村上春树,你说你在读《挪威的森林》,也聊过几句死亡的话题,我还和你卖弄了下,“死并非生的对立面,而作为生的一部分永存”翻译的不是很好,有点后悔。
现在再重读这本书的时候,也不自觉的想起我们拿着两瓶“老雪花”,聊这个,聊最近看的新番,聊《石头门》,你和我推荐《小圆》我最后也没看。
离开最大的不幸可能就是不再经历了吧,好的坏的,都不会再经历了。
2020的新冠比当时的非典还要严重,2020川普没连任,《EVA》的新剧场版还没完结,你当时就期待的《地下城》手游延期了。《刺杀骑士团长》写的还不错。
讽刺的是,渐行渐远的我们,如果你还在的话很可能没有机会聊,现在想聊却只剩下了一些叹息。
希望有另一个世界,真的。到时候,我们再喝一杯。
]]>十一月
如今还有不久我也到了这个年纪。 这些年里我经历了从学生到员工 从单身到父亲。 换了4个行业了。
在这之前还有一些计划。 先写到这儿。
有些计划先不说出来。
终于还是到了这一天,32 岁了。 昨天还吵了一架,很大是自己的责任,还是需要修行啊。
]]>这也算是比较重要的一步。我一般采取以下步骤
api.gotokeep.com
garmin, strava
那样,几乎没人做过。 keep, 悦跑圈,咕咚那样的国内软件也鲜有人做过。幸运的是我发现了有人2年多以前做了 keepForMac, 那时候keep的接口好像还是开放的。虽然这个项目已经不能用了,但我找到了登陆接口。
H4sIAAAAAAAA
, 本着我的凡事先搜索精神我把这段贴在了 GitHub 中,发现有好多代码出现了这个,肯定是某种加密。
P.S. 本质是 base64 不算加密,做数据编码一定要记住。
]]>总结
展望
目前有的问题。
搞定了!! 开心,剩下的完善就可以了。
]]>终于找到了一个比较好的,知识管理系统 决定结合这个博客把技术部分导进去,并结合GitHub Actions 自动化。
慢慢把running page抽出来了,但是目前没啥动力做完。慢慢来吧。
]]>计划:
继续写这个,关于怎么实践。说起来我挺有意思,整个实践过程其实跟机核有非常大的关系。或者说开始的时候,在机核发文章贯穿了我整个转行和实践过程。希望对也想转行的人有些帮助。按时间顺序倒过来正好是 -> 竞品 -> 数据分析 -> Python -> 全栈
关于看书--之后再补充
2022.04.17 补充 之前的邮件一条回复:
很高兴你看我写的东西,真是特别开心。以下是我的一些回答,但都是我的个人经历或建议,非常非常大的概率不适合你,方向的话其实更需要自己找,如果我能帮上一点点忙就更好了~
其实我不想用转码这个词,有些功利。因为我大多数时候是兴趣和运气推着自己走,当时也没怎么想着自己有一天能从事这份职业(我的薪水目前还没我转行前高)。 游戏到数据分析师这个转变,其实是机缘巧合吧,进入了数据部门,而我之前在米其林 Excel 用的还算可以,从编程门外汉走进去这个过程就是突然知道了编程是用来解决问题的,而问题是能分成一部分一部分的(其实大多数事情都是如此吧),因为一直喜欢看书也就找了一些书看,读了一本很受益的书《像计算机科学家一样思考Python》(现在有第二版)豆瓣地址是:https://book.douban.com/subject/26870407/ 之后就是写脚本写爬虫,自动化之类的了。 其实你学的数电模电,嵌入式对都是编程的一部分,且是非常非常重要的一部分,如果你之后有机会喜欢编程的话,慢慢你会发现,编程不一定是 CRUD,也不一定是高并发,微服务,云原生,甚至不一定要从事这份工作。而是找到自己的乐趣,把他当成魔法,because I can. 就像我 twitter 上关注了一个非常厉害的推友,他的职业是产品经理,但是写了非常多网络相关的东西,对很多人来说编程就是像开车,游泳,下棋一样是人生的一部分而已。 推荐一篇他的博客:https://blog.lishun.me/openwrt-mega-post 因此我的建议是,也不用局限于 Python, 找个日常的工作,把他自动化,或者找个好玩的项目,尝试把他跑起来,增加些小功能,慢慢书本和实践就结合起来了。慢慢你就知道为什么需要 dict list 这些数据结构了 可以先玩玩我推荐的游戏 其实我研究生时候也不知道自己想干什么,未来在哪里。但,编程对机械也很有帮助的,比如你一直在用的 CAD. ProE 这些都是程序做出来的,你可以上 GitHub 找一些开源的这些软件,看看他们是怎么运行的,是否可以把一些工作自动化,这样编程也就和你的工作结合起来啦 最后,祝好。
2 年后的一些新的补充
2022.07.01 补充给一个网友的邮件回复,希望我能帮一点点
首先,请容许我简单介绍一下自身的基本情况。我是男生,今年31岁,目前在体制内工作。由于个人性格原因,我认为自己十分不适合目前的体制内工作,没有在体制内长期发展的打算,目前正在找机会尽快离开。离开之后,就需要面对很现实的生存问题。因此,在这段时间,我一直想着要为离开体制后的个人就业发展做一些规划和准备。我有研究生学历,但是是一所国内并不知名的一般本科学校,专业背景属于理工科。虽然我还比较喜欢自己的专业,但由于领域比较窄、圈子小,想找一个比较满意的对口工作也比较难,所以考虑是否需要转行。更重要的是,如果有机会,我有意向今后去海外试一试。思来想去,目前好像只有转码可以尝试一下。之前在学校读研期间的工作内容比较偏向于数据处理和建模分析,有点像现在比较热门的Data Scientist方面的工作,但接触的可能更偏向于专业方面的数据,不如现在互联网公司中一般意义上Data Scientist所面对的数据种类那么广。虽然平时接触编程也比较多,如Python, C/C++, Fortran等,但可能更注重计算编程或科研编程,感觉与专业程序员所谓的编程还是有很大的不同。所以,觉得如果真到要转到程序员这个行业,可能还是需要有一些系统的学习。 下面是我考虑的几点问题,如您方便,恳请不吝赐教:1. 是无止境的,如果能在一段时间的密集学习后,能够获得一份类似于实习之类的工作,以工促学,或许会好一些。2. 如果请您推荐,不知您是否在合理可行的转换路径方面有一些建议?3. 由于我不是CS方面的专业背景,转码过程中,为达到一些工作面试的门槛,是否有哪些证书是需要考取的? 由于对于计算机相关行业的情况缺乏了解,有些想法肯定很不成熟甚至很幼稚,对此感到抱歉!如您能在方便的时候,提供些许建议,我将不甚感激~ 谢谢您提供联系方式,祝您心情愉快!
Hi xxxx
很高兴收到你的邮件,我也没有太多的经验和能力,尽可能的按照我的经验回复你,如果有不妥的地方还请见谅:
最后,祝好。一个挺俗的话我觉得放在编程这里挺合适的
如果想做,不如从今天开始写第一行代码。
print("Good Luck")
伊洪 best wish 2022.07.01
]]>不过也要感谢这个时代,让我有机会窥探到天才是什么样子,不用在书本里,电视剧里。通过代码就能看出来是真正的天才。 那么我又有什么用呢? 有些讨厌诸如,tql,内卷,太菜了这些词。更喜欢默默做事,把自己有限的能力做好一点点,也就罢了。
倒是挺庆幸没生在那个时代,也没生在朝鲜。慢慢的也不再愤怒,也不想去跟大多数人表达自己的真实想法。
不知所云,权当碎碎念。
]]>计划如下:
目前阶段第一天10km完成。今天是147斤。
]]>还是做了些事儿的
还是有太多事儿没做的
希望9月这个开学的月份
也不知道10年以后会怎样,但好多事情真的没法预测。 就像10年前,我还在上着一所垃圾大学。我还不认识现在的老婆。未来还不知道会发生什么。
10年后呢? 我41岁,应该站在人生的正中央(如果我能活过80的话) 到那个时候,这篇文章还在么?我还有打开这篇文章读一读的心境么?推特还在么?GitHub还在么?
想起王兴那句话
我不祝你一帆风顺,我祝你乘风破浪。
也送个从今天起下一个10年的自己
]]>软件名称 | 优点 | 缺点 |
---|---|---|
strava | 支持运动种类多,开放api, 数据粒度很细,用户群较大,中国区支持,数据导出相对容易 | 很多功能需要订阅会员,运动手表支持一般 |
Nike Run Club | 完全免费,手表支持很好,数据稳定,UI非常漂亮,中国区支持大部分功能 | 数据统计做的相对一般,数据导出相对麻烦 |
Runtastic | 社区数据做的都很好,界面漂亮,手表支持很好,运动总类多 | 国区下架,数据导出导入相对麻烦 |
garmin | 数据精准度高,支持数据导入导出 | 国区和其它用的两套账号管理会带来麻烦 |
咕咚,悦跑圈,keep... | 国内软件目前没下架风险 | 不支持数据导出,做了一大堆无用的社交功能 |
我的选择: 我用了 8 年多的 Runtastic 后来国区下架,在其它区下载有gps偏移的问题,转到了
Nike Run Club
, 但我会备份一份数据上传到strava, 因为 strava 开放 api 比较方便 DIY 我个人页面用的也是 strava 的数据。在国区,我比较推荐Nike Run Club
虽然如此但也经历了几个阶段
如果你也想自己写issue博客,并自动生成README,你可以参考如下步骤
关于如何生成 GitHub secret token
generate new token
把需要的点上需要把 env 中的 name 和 email 改成自己的
]]>总之就是有些郁闷。 得准备跳槽的事儿了。
日语也开始学了,但我为什么这么倒霉。
]]>仿佛一下子蓝调了,不知道接下要做什么。 哎。
日语真的该提上日程了。
不自律就永远不可能达到自由。
]]>想着自己还有好多计划。想着自己的生活过的还挺乱,想着自己失去了好多东西,想着自己本来可能有的可能性。想着自己的工资还不足以支撑家庭。希望之后能涨一些。
想摆脱社交网络。 想好好把日语学了。 想六块腹肌。 想继续把编程那个搞好。 想跑马拉松。
今天看到句话,真正大牛不用番茄工作法,他们有天生的专注力,我突然想反过来理解这句话,我不是什么大牛,所以更需要啊。 不如就从今天的番茄工作法开始。 从今天开始, 从这一刻开始吧
这些天都在星巴克办公,每天花了太长时间刷手机了。这个星巴克还没有厕所。。。不知道怎么办,一会儿很可能我憋不住了,算了憋不住就回家吧。
忍住打开推特,微博的手。
多列个计划。一个真理是,计划永远比不计划强。
今天的计划是什么呢?
说说生活
说说焦虑
再说番茄工作法
今年还剩下五个月了,而似乎,一切还没有开始。 想想过去的七月我做了些什么呢?
想想这个7月我没做什么呢?
八月的展望呢?
日子在不停的流逝着。在家办公一段时间了。 也不知道这种日子什么时候是头儿。总之,有些东西永远回不去了。
]]>上个月开始减肥开始了(又一次) 这个月开始严格限制自己社交网络时间吧。今年开始 哦对,今天开始学日语了。晚上有课。 也不多定计划了,一点一点来吧。
计划如下:
具体计划如下
之后的想法
Sent from PPHub
]]>Sent from PPHub
]]>Sent from PPHub
]]>Sent from PPHub
]]>如果只需要完成1个就给自己60分,全完成是100分 这就是2020
]]>Sent from PPHub
]]>多学习,多写代码,少关心那些有的没的的东西 像飞哥一样,少做有的没的交流
少说话,管住自己的嘴。
]]>Sent from PPHub
]]>自己马上也31岁了。 过了太久了。
]]>Sent from PPHub
]]>尤其是跟某些傻逼完全无法交流,其实最好的方式只有闭嘴。 保护家人。
]]>从不刷微博开始
]]>一会儿深呼吸,喝杯咖啡
]]>因为给 vscode-leetcode 的原因接触了一点如何写 vscode 插件,在想,为何不自己写一个,顺便锻炼一下自己JS(TS)的能力,说干就干,从第一个 vscode 的 hello world 写起,到第一个目录,到调通第一个接口,再到完成第一篇文章的 webview 渲染,优化代码,继续增加目录,完善目录,完善 markdown 解析,搞设计,再一边学习 ts 一边开发,每天都到后半夜,不知不觉 ,半个月过去了,也算有了些心得和成就,现在也算是第一个可用的版本。
下面我在思考,是直接上线写文章还是继续开发,选择继续完善吧,其实还有好多想法,有一些技术难点,一点一点攻克吧。
一些心得:
今天鼓起勇气称了下体重,麻痹,胖了10斤,不控制自己就白瞎努力了,这次。 目前的计划是过年前至少瘦到143。
突然间发现似乎应该添加2020的标签了。
总之,大环境再差也要努力向上,给自己加油,2020的标签要来了。
]]>Sent from PPHub
]]>从这一刻开始,从下一刻放弃
好的
坏的
怎么办
每天需要的 routine(2019.11.22)
写在最后
docker cp foo.txt mycontainer:/foo.txt
]]>if (array === undefined || array.length == 0) {
// array empty or does not exist
}
]]>创建用户
postgres=# CREATE USER dbuser WITH PASSWORD '*****'
创建database
could not flush dirty data: Function not implemented
]]>接下来是,认真工作,调整自己心态,爱上工作。 给自己加个油
]]>除了领导人挺好,不加班似乎没有什么好处。 虽然我不知道下一家怎么样 但至少有些东西能学到。 要加油了,下一阶段要做的就是学会努力工作,认真工作,做漂亮的工作。 这也是我30岁剩下几个月需要做的最重要的事儿。 当然我靠自己争取还是学了不少东西的。 真的不少。 下一项就是要把这些学到的东西串起来,并用在工作中。
但是还是惹媳妇生气了,确实都是我的错
]]>今天算是第一天
]]>mac下,command + k + 0,折叠所有代码块。command + k + j,展开所有代码块。 windows下,ctrl + k + 0,折叠所有代码块。ctrl + k + j,展开所有代码块。
Press CTRL + A to select all of the text Press SHIFT + ALT + I to insert multiple cursors at the end of each line Press Home twice to jump to the start of every line
]]>整理下自己需要做点什么吧,对这里倒是一点留恋没有,每天抽出时间学一学下一家公司要做的事儿吧。其余的是工作
至少我先做到不烦吧,哎
]]>9.30我就可以离开这儿了
Sent from PPHub For GitHub
]]>今天重读了一篇文章《迷茫与倒退》 不知道为什么,最近时常重读这篇文章,大概是在这里真的不开心吧。
在这个人的博客简介里看到一首诗,真是喜欢,记录下来
深情似海,问相逢初度,是何年纪?依约而今还记取,不是前生夙世。放学花前,题诗石上,春水园亭里。逢君一笑,人间无此欢喜。 无奈苍狗看云,红羊数劫,惘惘休提起。客气渐多真气少,汩没心灵何已。千古声名,百年担负,事事违初意。心头阁住,儿时那种情味。
越发的想离开这里了 该去哪里呢? 哎
]]>一旦我找借口停下来,就永远不会再跑起来了
希望这次能坚持下去
]]> @media screen and (max-width: 300px) {
body {
background-color:lightblue;
}
}
]]>2. db.movie.insert(
{
title: 'Forrest Gump',
directed_by: 'Robert Zemeckis',
stars: ['Tom Hanks', 'Robin Wright', 'Gary Sinise'],
tags: ['drama', 'romance'],
debut: new Date(1994,7,6,0,0),
likes: 864367,
dislikes: 30127,
comments: [
{
user:'user1',
message: 'My first comment',
dateCreated: new Date(2013,11,10,2,35),
like: 0
},
{
user:'user2',
message: 'My first comment too!',
dateCreated: new Date(2013,11,11,6,20),
like: 0
}
]
}
)
3. db.movie.find(
{
$or:
[ {'stars':'Robin Wright'},
{'stars':'Morgan Freeman'}
]
}).pretty()
1. db.movie.findAndModify(
{
query:{'title':'Forrest Gump'},
update:{$inc:{likes:10}}
}
)
]]>
在这里还需要做几件事儿
最早12月最晚明年4月吧。要试试离开这里。 I mean it.
]]>]]>我太菜了,一但有一天没坚持下去,就永远坚持不下去了
今天读到了一段话:
很多人做事,就像挖井一样。挖了很多井一样,挖了很多井,没有一口到底的,当你回顾过往的时候,你要反思一下,你到底打了几口井。很多井没有达成,其实缺的就是一点坚持。很多年前,我看过笛卡尔的《谈谈方法》,里面有一个结论,在一个迷失的森林里,无论你朝那哪个方向走,你都可以走出困境。
好的方面
坏的部分
]]>
今天看微博读到一段话
对领导负责,完成领导交给的任务。对公司负责,实现在这个公司的价值。对自己负责,不断的提升自己,我,究竟做到了哪一级呢。
在这工作确实挺不开心的,主要是没有什么目标感。手头好多工作还不太想做,只是在这里摸鱼,真的挺难受的。 想写好多代码,想不断提升自己,发现距离真的好遥远。 想尽快离开这里吧。 不过怎么也得坚持过一年。 最好能拿到年终奖。 再精进下自己的能力 嗯,就写到这儿吧先
]]>每次用正则都是现查,想把正则弄好真的好长时间了。今天又刷到了正则表达式的文章,准备记录一下,方便日后复习。
元字符 | 描述 |
---|---|
. | 句号匹配任意单个字符除了换行符. |
[ ] | 字符种类. 匹配方括号内的任意字符. |
[^ ] | 否定的字符种类. 匹配除了方括号里的任意字符 |
* | 匹配>=0个重复的在*号之前的字符. |
+ | 匹配>=1个重复的+号前的字符. |
? | 标记?之前的字符为可选. |
{n,m} | 匹配num个大括号之前的字符 (n <= num <= m). |
(xyz) | 字符集, 匹配与 xyz 完全相等的字符串. |
| | 或运算符,匹配符号前或后的字符. |
\ | 转义字符,用于匹配一些保留的字符 [ ] ( ) { } . * + ? ^ $ \ | |
^ | 从开始行开始匹配. |
$ | 从末端开始匹配. |
简写 | 描述 |
---|---|
. | 除换行符外的所有字符 |
\w | 匹配所有字母数字, 等同于 [a-zA-Z0-9_] |
\W | 匹配所有非字母数字, 即符号, 等同于: [^\w] |
\d | 匹配数字: [0-9] |
\D | 匹配非数字: [^\d] |
\s | 匹配所有空格字符, 等同于: [\t\n\f\r\p{Z}] |
\S | 匹配所有非空格字符: [^\s] |
\f | 匹配一个换页符 |
\n | 匹配一个换行符 |
\r | 匹配一个回车符 |
\t | 匹配一个制表符 |
\v | 匹配一个垂直制表符 |
\p | 匹配 CR/LF (等同于 \r\n ),用来匹配 DOS 行终止符 |
横向(/g代表全文搜索):
var regex = /ab{2,5}c/g;
var string = "abc abbc abbbc abbbbc abbbbbc abbbbbbc";
console.log( string.match(regex) );
// => ["abbc", "abbbc", "abbbbc", "abbbbbc"]
纵向
var regex = /a[123]b/g;
var string = "a0b a1b a2b a3b a4b";
console.log( string.match(regex) );
// => ["a1b", "a2b", "a3b"]
These are some phone numbers 915-134-3122. Also,
you can call me at 643.123.1333 and of course,
I'm always reachable at (212)867-5509
\(?\d{3}[-.)]\d{3}[-.]\d{4}
212-555-1234
915-412-1333
//我想要保留区号,把后面的电话号码变为通用性的
👇👇👇👇👇👇👇👇👇👇👇👇
212-xxx-xxxx
915-xxx-xxxx按照之前的做法\d{3}-\d{3}-\d{4},这种匹配的方式,是将整个电话号码作为一个组(group)匹配起来。 我们把212-555-1234这样的叫Group0。
这个时候,如果我们加了一个括号\d{3}-(\d{3})-\d{4},那么匹配到的555就叫Group1。
以此类推,如果有两个小括号\d{3}-(\d{3})-(\d{4})那么分组就是下面的情况:
212-555-1234 Group0
555 Group1
1234 Group2
]]>root = Path("../PycharmProject")
config_dir = root/Path("config")
# 等价于config_dir = os.path.join(root, 'config')
print(str(config_dir))
config.files = config_dir.rglob("*.json")
with open(filename, encoding='utf-8', mode = ‘r') as f:
for line in f:
print(repr(line))
]]>ALTER TABLE 表名 MODIFY COLUMN 字段名 新数据类型 新类型长度 新默认值 新注释;
ALTER TABLE 表名 CHANGE 旧字段名 新字段名 新数据类型;
ALTER TABLE 表名 ADD 字段 类型 其他;
]]>docker stop $(docker ps | grep python | awk 'NR > 1 {print $1}'|xargs)
Find命令用法
- 列出当前目录以及子目录下的所有文件
find .
- 找到当前目录下名字为11.png的文件
find . -name "11.png"
- 找到当前目录下所有的jpg文件
find . -name "*.jpg"
- 找到当前目录下的jpg文件和png文件
find . -name "*.jpg" -o -name "*.png"
- 找到当前目录下,文件名都是数字的png文件。
find . -regex "\./*[0-9]+\.png"
- 举例,找出1天内被修改过的文件
find . -type f -mtime -1
- 看下实际例子。删除当前目录下所有的js文件。用-ok的效果如下,删除前有二次确认
find . -type f -name "*.js" -ok rm {} "rm ./1.js"?
mv配合grep移动
On OS X:
ls file_* | xargs -J {} mv {} temp/
On Linux:
ls file_* | xargs -i {} mv {} temp/
mkdir 同时创建子目录
mkdir -p letter/important
]]>精通一门语言是最基本的要求。所谓精通,就是要了解这门语言的各种阴暗角落。用每一样语言特性的背后的代价。知道在面临各种问题时用这门语言解决该问题的惯用法。大部分通用语言都会有设计缺陷,表现在具体方面就是面对某些问题,写起来直接了当,而另一类问题时却要绕很多弯弯,这些绕弯弯的部分就需要用某种模式去弥补。我认为,所谓编程的设计模式,并不是跨语言而独立存在的,它们是强烈依附于编程语言的。《设计模式》这本书,我读过的版本是基于 C++ 的,设计模式被谈论的更多的是在 Java 社区。这类模式都有很深的语言烙印。我们学习设计模式其实学的就是一门语言的惯用法。
在这工作实在是太无趣了,我也不能总跳把自己跳废了。 希望到我下一家公司我能写一个总结
]]>唐多令 芦叶满汀洲,寒沙带浅流。二十年重到南楼。柳下系船犹未稳,能几日,又中秋。 黄鹤断矶头,故人今在否。旧江山浑是新愁。欲买桂花重载酒,终不似,少年游。
哀叹之中又蕴含着无限的美。
]]>Sent from PPHub For GitHub
]]>Sent from PPHub For GitHub
]]>去做你害怕的事儿,最后你会发现:其实不过如此。
事情心中做。做前不声张,甚至做完后能不说也不说。
求人不如求己。关键时刻,除了爸妈,最可靠的就是自己。
过去的事情可以不忘记,但是一定要放下。为从前的事耽误当下的事,是不合算的。
微信时代,成年人间微信信息不回复,一是看不起你,二是不想理你。不存在没看到或者没收到的情况。无论是哪种情况,都说明你的价值有待提升。当然,对这类人,删除是不错的选择。拉黑毕竟还是在你的列表里。
Done is better than perfect.
不要去看什么网上所谓“导师”的进步指南、成长策略。
]]>想做的事,立刻行动。执行力是一个人最珍贵的品质。
今天没背书包,没带本子,还想写点什么。
不管做什么一旦堕落就太难回去了,对于我这样意志薄弱的有一次就万劫不复了。 所以再以后不想跑步的时候就告诉自己, 一旦这次不跑,就又要重新来过