Origin of Ray

一起探索互联网的秘密

GAMES101 系列总结(一):线性代数与模型变换中我们讲了如何通过MVP矩阵将模型上的点坐标变为[1,1]3[-1,1]^3的一个立方体之中的坐标,这篇文章我们继续介绍,如何将这个立方体中的点绘制到屏幕上。

光栅化主要分为三个部分,首先是将所有的点拆分为一个个的三角形,这个过程叫做Triangles,在这个过程中,可能出现某些三角形覆盖的位置没法用像素来表示而导致的锯齿,所以我们要做抗锯齿,这个过程叫做Antialiasin,还有就是我们从三维映射到二维的过程中,如何进行深度测试,即如何使用Z-Buffer。

阅读全文 »

最近在使用python调用gpt的sse接口并通过sse的方式返回给自己的前端。遇到了几个问题,简单记录下,也没什么代码量,但也用了大半天的时间才搞定。

  • python如何返回sse
  • 为什么我返回的sse中的换行符总是会丢失
阅读全文 »

我们都知道ChatGPT的接口支持流式SSE的方式进行数据返回,而前端浏览器默认提供了EventSource去接收SSE,但是问题在于,默认的EventSource只支持Get请求,切不支持任何自定义的头部,而ChatGPT的接口就是POST请求,且需要在头部携带token,于是使用了一个微软的库,我们来解释一下它的用法,源码以及从协议角度简单说一下它的源码可以运行的基础,即它的源码为什么可以工作

阅读全文 »

最近对chatgpt能够进行流式请求返回的协议产生了一点好奇,于是就去了解了一下,一开始我以为是HTTP2,或者是WS协议,后来发现都不是,而是一种叫做SSE(Server-Sent Events)的协议。

阅读全文 »

之前做了个关系图谱的需求,因为导出png等图片放大会失真,所以希望导出为矢量图。但是G6自带的导出图谱功能再Canvas模式下无法导出为SVG,而SVG模式又有很多特性不支持,所以就想办法能不能把Canvas导出为SVG了。

阅读全文 »

贪心算法是比较常见的一种算法,贪心的本质是选择每一阶段的局部最优,从而达到全局最优。而模拟退火算法比较常见于人工智能当中。

这两种算法之所以放在一起考虑是因为,模拟退火算法像是加强版的贪心算法。

如果一个问题的每一步的局部最优解无法得到全局最优解,我们常规前后端程序员的算法思维想到的是动态规划。

但是对于AI开发来讲,参数可能是上亿级别的,根本没有办法动态规划,这个时候就可以尝试用模拟退火算法以一定概率跳出这个局部,去整体中找到一个更优的答案,但是,其实这种算法也不像常规算法一样,会得到一个必然的结果。

本文把两种算法放在一起进行总结和比较,看看他们分别适用于什么情况,以及如何使用。

阅读全文 »

Tailwind这个CSS的框架不算是什么新东西了,不过也一直没有去研究过,最近有需要就看了下,看起来还是比较简单的。

这东西看起来就是个新的DSL之类的,提供了许多常用且内置的css样式,封装成语法,然后提供一个PostCSS插件,把封装好的语法又处理回普通的css。

我们需要做的事就是安装Tailwind的PostCSS插件,然后使用他封装好的DSL即可。

阅读全文 »

最近在想着飞书文档的关系图是怎么实现的,于是想起了之前用的G6,于是简单实现了一版。

最终效果

主要功能如下:

  • 节点分为两部分,上半部分是图标,下半部分是文字
    • 鼠标放到图标上时,会产生水波纹的扩散特效,同时出现一圈边框
    • 文字需要有下划线以及白色背景,且水波纹特效不能被白色背景挡住
    • 文字的下划线需要是方格
  • 连线要有渐变色,且渐变色要从箭头起点到箭头终点,且如果支持双向关系,如何实现两条边
  • 连线上中间位置要有一个Label
  • 节点和连线要支持半透明
  • 整体布局要是力导向布局,且支持节点拖拽,拖拽时不能让节点之间产生重叠,但是也不能因为连线拖动其他节点(单独提出这一点是因为G6自带的力导向布局节点会被拖拽)
阅读全文 »

作为一个程序员,我们平时关注的关于管理方面的知识,最初可能是设计模式,管理的是某一个需求的复杂度,慢慢的,我们会开始关注领域划分,DDD,业务建模等,这些管理的是系统的复杂度,再后来,事情的复杂度逐渐进化到我们个人无法处理了,我们就需要团队合作了,这里管理的就是项目复杂度。

其实这三者是自始至终都会存在且相互关联的,很多理念也很相似,只是我们需要逐渐的参与实际工作才会一步步认知到这种复杂度。

关于设计模式和领域驱动设计,我之前的博客都有总结过一些我看过的书和具体的实践,这次结合亲身的体验与《知行》这本书,总结一下项目管理中的一些方法论。

阅读全文 »
0%