列车

原本我会每天坐上八点零八分的列车 因为思绪飘渺到了昨夜 晚落在阶梯的一脚最终停在了关闭的门前 下一班列车是八点十三分 我竖起了衣领拉低了帽檐 如果这一班列车可以直达你的城市 如果这一班可以回到那年的圣诞节

May 22, 2023 · 1 min

流星

从某一个日子起,我经常想到流星。小时候我见过三次流星,第一次我许愿我想成为一个机器人,第二次我许愿我想有一个大房子,第三次我许愿我可以正常走路。 从某一个日子起,我觉得自己就是流星。 流星划过天空,黑夜被划开一道细长的口子。我经常在深夜看着天空,黑色的天空和蓝色的天空给人的感觉很像,一开始看时会感觉很远,如果凝视着时间长了,周边的世界便开始模糊,天空好像不断地压下来,直到感觉吸不上气,我才会猛得起身,深吸一口气。这和游泳很像,我出人意料地不怕水,也许和我喜欢看天空有关。第一次下水时,我直接把脸扣在水面上,身体飘起来,我仔细看着泳池底部的砖纹,水也是蓝色的,但是是透明的蓝,我知道它的尽头是瓷砖。而天空的尽头是什么?我吐着泡泡,直接最后一口气吐完,猛的抬起头重新呼吸。 流星似乎在告诉我天空的背后是什么。每一次流星闪过,我都想透过白色的尾迹窥视一下天空的背后,她在遮挡着什么?但是我并看不透,因为太短,我只见过三次。 而后我再也没有见过流星了,是我抬头的次数太少了,还是因为空气污染愈发严重?我也不知道,只是最近我总是想起流星。也许是看不透她,也许是感叹她的转瞬即逝,也许是知道流星的闪耀是在大气层中燃烧自己的生命。大部分流星都会燃烧殆尽,那些幸存者也大概率变成一颗小石子落在树上或者砸起一朵小水花。 但是许愿的瞬间总是美好的,会遗憾吧。也许会遗憾吧。

May 22, 2023 · 1 min

RestTemplate使用

初始化 RestTemplate未来是要被弃用的,现在推荐使用webclient。 如果轻度使用,直接new一个RestTemplate就可以。 最小引用包是spring-web,如果引入spring-boot-starter-web这种很重的包会顺带启动tomcat。 在service中自动注入RestTemple restTemple. 自动注入需要先实力化,可以在启动类中(spring的各种初始化没认真看,得找个时间细学一下) @Bean public RestTemplate restTemplate(RestTemplateBuilder builder) { return builder.build(); } 使用 post MultiValueMap<String,String> params = new LinkedMultiValueMap<>(); params.add("key","value"); UriComponentsBuilder builder = UriComponentsBuilder.fromHttpUrl("url"); URI uri = builder.build().encode().toUri(); ResponseEntity<MyClass> response = restTemplate.postForEntity(uri,params,MyClass.class); get restTemplate.getForEntity(uri,MyClass.class); get方法拼接参数 // request url String url = "https://google.com/search?q={q}"; // create an instance of RestTemplate RestTemplate restTemplate = new RestTemplate(); // make an HTTP GET request String html = restTemplate.getForObject(url, String.class, "java"); response.getBody(); 中文乱码问题: restTemplate....

May 21, 2023 · 1 min

NebulaResultSetBoot

Nebula查询结果的封装对象ResultSet比较复杂,原因是需要保存数据类型。而JSON的一大缺点就是无法保存数据类型,当然这是它简洁的代价。 在实际生产过程中一些应用场景对数据类型并没有太多要求,典型的例子是可视化。很多小伙伴都有将valuewrapper转为自定义json对象的需求,或者是将官方的图模型映射到自己的领域模型的需求。我这里提供一个我写的框架抛砖引玉。 代码地址:https://github.com/Dragonchu/NebulaResultSetBoot https://github.com/Dragonchu/NebulaResultSetBoot 核心代码很简单,就这不断的判断value wrapper的数据类型,然后递归进行解析。 这里讲一下我个人对于nebula ResulSet模型的理解吧,Nebula的点是由id加tag列表组成,而每个tag对象里是tagName和一个属性Map,有很多人建模的时候只用单tag其实是没发挥这种模型的潜力的。 public class Vertex { private final String id; private final List<Tag> tags; } public class Tag { private final String name; private final Map<String, Object> properties; } 边的模型比较简单,起点,终点,属性,rank,edgeType。 public class Edge { private final String src; private final String dst; private final String name; private final Long ranking; private final Map<String, Object> properties; } 路径的模型有一个段(segment)的概念,每个segment是一个三元组,<起点,终点,边>,对于独立的点,起点和终点是相同的。而路径是一个段列表。 public class Segment { private final Vertex src; private final Vertex dst; private final Edge edge; } public class Path { private final List<Segment> segments; } 这样再去看ResultSet会比较明朗一些。

May 12, 2023 · 1 min

我对用户体验法则的一些理解

接触到用户体验法则,是我之前异动时需要写工作交接文档,我是一个做任何事情都想要了解一下这个事情做到极致会是什么样子(虽然我不一定要做到极致)。于是我了解到了文档工程师这个职业,然后通过Nebula的一位文档工程师写的博客,了解到了用户体验法则。在这之前,我对设计人机交互之类完全没有概念,这几个法则倒是打开了我的眼界。 https://lawsofux.com/ 这是一个简单介绍用户体验法则的网站,我想结合我之前的经历和认知来介绍我对用户体验法则的理解。 Aesthetic-Usability Effect Users often perceive aesthetically pleasing design as design that’s more usable. 这个法则,我觉得可以称之为一白遮百丑,人们自然会觉得好看的交互就是好用的,而且可以忍受好看的东西上的一点瑕疵。如果反向思维,如果有一些技术问题暂时无法解决,或许可以尝试先将交互美化一下,这样用户的容忍度就会高一些。 Doherty Threshold Productivity soars when a computer and its users interact at a pace (<400ms) that ensures that neither has to wait on the other. 这个法则说交互时延要控制在400ms之内,这不仅仅对于单次操作来说,我认为最佳理解是,一定要在400ms内让用户有感知系统发生变化。不如进度条的话,应该至少每400ms都变化一下。 Purposefully adding a delay to a process can actually increase its perceived value and instill a sense of trust, even when the process itself actually takes much less time....

May 7, 2023 · 1 min

思想的内耗

这是一篇旧文,迁移到本博客 人到晚上容易想多,这种半困不困的状态很容易进行一种思想上的内耗也就是一种自我斗争,或者说是两个,一群小人在打架。 我为什么要在空间写东西,写给谁看,肯定是写给一些人看的,有些东西读起来那肯定是矫情,让我过个十年再来看可能,我说可能,会觉得有点尴尬,有点幼稚。但那也不一定,就像现在的我去看我以前写的东西,文章或者一些不能成为诗的短句子,有时也会惊艳 “嘿,好家伙,居然能写出这一句话来” 我觉得大家不要嘲笑伤心的矫情的人,就像我看到有小朋友写点矫情的文章。我觉着挺好的,主要写东西是一种发泄。有人难受了喜欢摄入,摄入热量,糖分(吃糖使人分泌多巴胺快乐),有人就喜欢输出。我就是喜欢输出的那一批人,锻炼去输出热量,那是身体的热量,心里的热量只能写字。但也不一定靠写字,讲话也可以,就像我爸爸,喝醉了酒就会呱唧呱唧讲一大堆东西。不过这种算是幸运,总比醉酒了手舞足蹈来的好,那也可能是我爸爸他肚子太大,跳不起来舞。 言归正传,我为什么要写东西,写给谁看。主要目的是输出,发泄。写给谁看,我觉着第一个还是写给自己。写作,其实就像是在以后的自己讲话。这看起来十分孤单,但确实是这样,因为没有人可以讲话啊。人脑又不是多线程的,我没法给自己大脑开一个另一个自己出来,然后两个线程相互交流。据说就算是多人格患者,一个人格出来后其他人格也是休眠状态。 所以只能写给未来的自己看,未来的自己,这个未来有多远。也许不远,就是这篇文章结束后,也许十几年二十几年,我变成了一个老头,或者变成了骨灰盒,又或者我死后变得名声大作,这篇文章被挖出来放进教科书。老师们上课讲着,“啊,公元2021年,储惠龙先生写下了这么一篇文章,问,他想表达什么中心思想”。答:没有中心思想,睡不着而已。要是我这一篇文章入选了小学语文课本,可得乐死孩子们。 人生,事事难料啊,我也写过给多少年以后的自己的一封信,虽然我都已经忘记具体写的什么了。大概就是初中写给中考后的自己,还是高中来着?反正写了张纸条,说你不要难受,不管怎么样,巴拉巴拉之类的。其实读了之后也没有很震撼。相隔时间也没有多少年。说是人全身上下,七年时间,主要的细胞就换了一遍了,也就是七年之后我们可能整个物质层面上就不一样了。所以我觉得,这个写给未来的自己,可能七年算一个比较好的时间。也就是每一次写作,就是在和七年之后的自己对话。那七年之后的我要是死了呢?呜,那就是世界上最残忍的孤独了,连自己都没法讲话了。 写到这里又要想,我是写给自己的,那又有多少人在看呢?我不知道有多人在看我写的东西,有的时候我写的不够吸引人,可能划一下就走了,有的时候我写的过于矫情可能就被人屏蔽了。自大的讲,我觉得屏蔽我的人是他的损失,当然这只是玩笑话。因为我也不喜欢看别人写的文章,或者大部分同龄人吧。基本上瞄一眼就不看了,不好看。或者大家都是这样想法,毕竟同龄人,很容易谁也瞧不起谁。这篇文章我要是写个大作家的名字,只不准就有很多人看了。蒙娜丽莎的那个效应,越出名就越有人看就越出名。 人嘛,没有信仰的时候就要造一点信仰出来。 当然,肯定有人要扣帽子,“啊,你假文艺”,“啊,你矫情”,“啊,有什么大不了的,我也遇到过你这些事”,“啊,这点事情” 或者有过来者,会有一种稍微的优越感来看待这件事,也不是说优越感。大概就是一群人死里逃生,逃出来的人在看还在挣扎的人的那种感觉吧。应该用庆幸比较好。 呜,都是这样,反正多睡几觉就好了。不过想了想,一个人要是生活的平淡了起来,那也是没有滋味的,当然了,我也不想一直难受。人也是挺欠的。 内耗结束。

May 5, 2023 · 1 min

使用GraphQL语法查询NebulaGraph中的数据

人之初,性本鸽。 大家好,我叫储惠龙(实名上网),你可以叫我小龙人,00后一枚。目前从事后端开发工作。 今天给大家带来一个简单的为NebulaGraph提供GraphQL查询支持的DEMO,为什么是简单的,因为本来想完成更多工作再给大家介绍的,但是上个月太忙加上下个月更忙,但是我又很想白嫖一下Nebula官方的奖品,所以就赶紧端上来了。 先上项目地址:https://github.com/Dragonchu/NebulaGraphQL 先简单介绍一下GraphQL,https://graphql.cn/ 详细的信息官方介绍的都很清晰。说一下我的理解,GraphQL并不是对标Cypher这种查询语言,而是对标REST的一种API设计风格。所以严格意义上,不是说使用GraphQL查询图数据库,而是使用一种GraphQL风格的API查询图数据库,或者说是将Cypher封装了一样,这个本质工作和大家做应用开发时,基于Nebula写一些通过的REST接口是一样的。 举个例子(本文的测试数据集使用的官方的basketballplayer数据集https://docs.nebula-graph.io/2.0/basketballplayer-2.X.ngql),如果我想根据科比的名字得到科比的全部信息,可能会使用下面这样的Ngql语句 LOOKUP ON player WHERE player.name == "Kobe Bryant" YIELD id(vertex) as vertexId | FETCH PROP ON player $-.vertexId YIELD properties(vertex); 虽然说Ngql已经很方便阅读了,但是如果让一个完全0基础的萌新来看也是看不懂的,并且这个语句的返回值是不明确的,至少没有办法从查询看到结果。返回值的解析一直也是很多人的痛苦。 那来看看使用GraphQL查询同一场景会是什么情况。 查询语句会是 { players(name:"Kobe Bryant"){ name age } } 返回结果是 { players=[{name=Kobe Bryant, age=40}] } 看看这优雅的查询和返回结果,想必我不多说,大家也都看得懂。这真的是 这其实就是官方对GraphQL的总结: 描述你的数据、请求你所要的数据、得到可预测的结果。 上述的查询在NebulaGraphQL中已经实现了,同时还支持通过VertexID查询数据(好吧,我也就实现了这两种)。 在项目中使用NebulaGraphQL也非常非常的简单,因为NebulaGraphQL本身只想做一个简单的工具库,未来如果想直接集成到MVC框架可能会再起一个NebulaGraphQL-spring之类的项目(画大饼中……)。所以NebulaGraphQL的使用和Nebula-Java是几乎完全一致的。 //创建一个config GraphqlSessionPoolConfig graphqlSessionPoolConfig = new GraphqlSessionPoolConfig( Lists.newArrayList(graphdAddress), Lists.newArrayList(metadAddress), spaceName, username, password); //创建一个连接池 GraphqlSessionPool pool = new GraphqlSessionPool(graphqlSessionPoolConfig); //执行语句 ExecutionResult executionResult = pool.execute("{players(age:32){name\nage}}"); //获取结果 System....

May 3, 2023 · 1 min

血色玫瑰(练笔)

这是一篇旧稿,迁移到本博客 “传说有一对巫术大盗,她俩善于使用各种巫术,游走在布鲁大陆各个王国之间,烧杀抢掠,无恶不作,所到之地,寸草不生,无人生还,而且据说这其中一位……”一个老人身子伏在桌面上,用一种毛骨悚然的沙哑的声音幽幽地低声说道,那声音彷佛从只会生长朽木和乌鸦的大地裂缝中回荡出来。 “大爷,都无人生还了你这故事怎么流传的啊,人生没生还我不知道,这酒倒是被你喝的一干二净。”酒保端着盘子路过,挖苦地嘲讽道。 “嘿,你这个臭老头,我的酒怎么被你倒空了!” 酒馆里人声喧闹,沸沸腾腾,屋外不远处两个隐藏在斗篷之中的人影微微闪动,凭空消逝,只留下两瓣玫瑰花瓣从半空降落——一蓝一红。 三个月后…… ”传说有一对幻术大盗,她俩善于使用各种幻术,游走在格布其罗大陆各个王国之间……” “大叔,这故事自打我在这就听您念叨了不下三十次了,又是幻术大盗,又是体术大盗的,又是各种大陆,各种王国的,就不能换个花样吗?”同桌的一个雇佣兵一边抛接着自己的匕首一边漫不经心地说道。 “不能不能,终究会被找到的,要躲起来要躲起来……”老人颤巍巍地伸出手来拿起酒盅。 雇佣兵撇了一眼老人的手,空中转动的匕首嗖得一声扎到了酒桌上。这是如此恐怖的一双手,皮肤如同戈尔巴夫大沙漠里历经沙尘肆虐的布札剌树,血管犹如马拉戈沼泽里在翻腾着毒泡的土地里蠕动的硫磺蠕虫,左手的指甲根都已经腐烂不堪,薄薄的指甲下就是手上唯一的有一丝生命的鲜肉,右手的指甲早已不见,肉瘤已经布满了指甲盖。就算身经百战无数次死里逃生的雇佣兵也感到了一丝心慌,老人的身上满是死神的气味,手上尚且如此,不知道隐藏在斗篷之下的那副躯体到底是怎样恐怖的景象。想到这里,雇佣兵倒咽了一口口水,拔起桌面上的匕首。 “怪不得这老头整天神神巅巅的,怕是遭受了什么惨无人道的折磨,哎,这乱世,谁也不好过啊,我下次下手得利落点,可不能留下这种半死不活的。”雇佣兵心想,把自己吃剩下的肉片还有半壶酒推到老人面前,转身走了。 “小姐,结账!”雇佣兵来到前台。 “来了,稍等一会。”听到这一声回应,老人的咀嚼慢了下来,好像有一股力量在向下拉扯着他的咀嚼肌。他张大着嘴巴,口水慢慢地留下,却丝毫不敢眨眼,生怕闭眼的一瞬间,自己的脖子就会被一根丝线划断。 后厨的帘子微微响动,里面探出半个身子来,是一个面容清秀娇小玲珑的女子,年纪二十有余,眉如新月,樱桃小口,双瞳剪水。扎着一个麻花辫,额前留着两缕蓝发,在黑发的衬托下格外显眼。 ”在等一下下哦!“女子眯起眼睛微微一笑,歪了一下脑袋说道。 老人的喉咙开始发烫,此时好像有亿万的小精灵在从他的肚子里往食道爬。恐惧变成具象的寒冷,有无数的寒冰从全宇宙而来扎在老人身上。颤抖,杯中之酒 波涛汹涌。 ”终于好了。“女子拉开后厨的帘子,拍了拍手,走了出来。这才看到女子上身穿着一件黄色露肚上衣,下半身是一件蓝色高腰牛仔裤,围着一件沾了点点鲜血的围裙,脚上穿的是一双黑色塑胶雨靴,沾满了污渍。女子拿着一块湿手帕擦了擦脸上的一点血渍。 “这鱼是真的难杀,我都给它肚子掏空了,它还能蹦跶。你这个一共72本币。” “哎,你是新来的吗?之前那个姑娘呢?” “啊,我来了也有一段时间了,两周吧,之前那个姑娘不知道为什么突然不来上班了,这两天就我先顶着。” 啪,一阵清脆的响声,酒壶摔碎在地,老人的身体如一团松散的棉花倒下,但是他的脑袋却像一颗陨石一样重重的砸在大地上。那个被恐惧拉大的嘴巴还大大地长着,只可惜,哪怕他尽力不眨眼了,他的脖子还是被一根丝线利落地划过。 酒馆里一阵骚乱,老人的血液在酒馆的地上蔓延,蔓延到了前台,女子指甲缝中的一缕丝线闪出一点点光亮。 屋外不远处一个斗篷下的人影若影若现,她的指间也闪出一丝光亮。 又是三个月后…… “老头走了之后,酒馆倒是没以前那么热闹了。“一个大胡子捏着一个小酒杯抿了一口说道,比起惋惜更像是想拉起话题。 “那天老头的身子被搬走的时候你们看到了吗?”一个小个子有一点兴奋地凑过来。 “看到什么了,那天我被吓坏了,连枪都没拿就跑走了。” “那老头的身上全是一片片玫瑰花瓣大小的疤痕,你别以为听上去很美,那玫瑰花瓣的疤痕都是焦黑的,而且每一片上都有脓包,不少还开裂了,而且里面流出来的不知道是什么紫色的液体,有一股很刺鼻的味道,但是不难闻,甚至闻了还有点上瘾。也不知道这老头什么来头,摊上这种事。” “这老头应该不是这乌来城的,好像也就一年前来的吗?我也记不清了,哎,无所谓了,这年头死个人也不是什么新鲜事,能讨论这么久不是因为这个死人,而是杀他的那个人的手法。讲真,我还从来没见过这么利索的杀人方式,听说那脖子被切割的表面比最熟练的伐木工砍树留下的树桩还要光滑,现在都没人知道是拿什么武器暗杀的。法术我也没听说过有这种,不说会法术的人很好,既然会法术了,直接给他来一个身体爆炸不挺好。想起来还是恐怖,如果是单纯的血肉相拼我到不觉得有什么,这酒馆大大小小的屠杀多了去了,不过这种杀人还要做的这么精美的,总让我觉得害怕,真的,我也说不出个所以然,但我就是害怕。”大胡子又倒了一小杯酒。 未知总让人不安,尤其是美丽的未知,就像在灰暗的街道里升起一只艳红的气球。

May 3, 2023 · 1 min

雨下

这是一篇旧文,迁移到本博客 很多事情会被下意识地隐藏,当偶尔被想起的时候,就像在阁楼翻出压在箱子最底下的日记。 我的大学也遇到过一个浪漫的人,我们的交集不多,但我还记得那天刚下完雨我们走在南校最美的那条路上。树叶铺在地上,应该刚入秋,路面湿润润的,她说她的皮鞋太磨脚于是脱下鞋提在手上,光着脚走在路面上。她的脚很美,莹洁光滑,踩在路面的积水上沿着脚边溅起一朵小小的水花。她就那样提着小皮鞋,像雨后森林深处出来嬉戏的小鹿,一蹦一跳。两边的树叶缓缓落着,已经显得有点秋色的落叶一片片贴在地面上,时间是静止了呀。 那时的我还太年轻,只想着怕她着凉于是赶紧找电动车,如果当时的我能有现在这般,我一定也会脱下自己的鞋和她一起走在赤脚走在路上。 她是喜欢下雨天的女孩子,她给我看过她的彩虹雨伞在大雨中旋转,她喜欢下雨,喜欢听雨的声音,喜欢淋雨。 那时的我还太年轻,我不懂得什么是爱。现在的我知道,人性中真诚中能有做作,高贵中能有卑鄙,小气与大方,怨怼与仁慈,憎恨与热爱,可以并存于一颗心。那么爱,也是复杂的,人世间的爱数不胜数,远不止亲人之爱,挚友之爱,伴侣之爱。有错爱的爱,虚假的爱,不忍拒绝的爱,强迫的爱,占有的爱,憎恶的爱。而爱,也从不只是单一的色彩,爱永远都是渐变色的,如果它是红色,那一定有浓烈的酒红和淡淡的粉红。 那时的我还不懂得如何去爱,我不懂得爱是相互的,我不懂得一味地付出和一味地索取本质上是相同的,我不懂得牺牲自己不一定会成全对方。 一到下雨的季节,我就会想起彩虹的雨伞和赤脚的女孩子啊。

May 3, 2023 · 1 min

不喝酒的扎克

这是一篇旧文,迁移到本博客 布什:Margarita 扎克:牛奶 布什:不来点酒吗 扎克:我不喝酒 布什:那来根烟? 扎克:我不抽烟 布什:那你也太无聊了 扎克:认识我的人都这么说我 布什:那你有其他的爱好吗 扎克:也没有 布什:怪不得这么难受,你得学会放松 扎克:唉 布什:你想想你活着是为了什么 扎克:我只是想…… 酒保:二位的饮品到了,请慢用 布什:你想什么? 扎克:我只是想……为了牛奶 布什摇摇头 布什:为了Margarita

May 2, 2023 · 1 min