0%

data stream 允许跨多个仅追加的时间序列索引,同时为请求提供单个命名资源。数据流非常适合日志、事件、指标和其他持续生成的数据。

为什么需要 data stream?

单纯 ILM 方案管理时间序列索引较繁琐,需要使用别名,多次操作。使用 data stream 可以简化操作

适合场景

数据流非常适合日志、事件、指标和其他持续生成的数据。

符合如下特点:

  • 数据极少更新
  • 时间序列数据
阅读全文 »

Side Project 项目之 toolkit

最近生了一场病,持续了一个多月,身体渐渐恢复,多次想提笔写点什么,许久没有动笔,不知从何开始。偶然间看到去年写的两篇《关于 Side Project 的思考和想法》《从 0 到 1 做产品,独立开发者初探之路》文章挺受人欢迎的,索性就动笔写一下最近在病中写完的一个小的个人软件Toolkit,专为程序员设计的极简、插件化的工具集!。

缘由

之前看到过两款软件:utools 和 rubick,研究了一下,发现他们都是 electron 写的,比较好奇怎么实现插件化,索性就给自己写个,将自己常用的工具插件化,定位为程序员的插件化工具集。

相似竞品

  1. rubick
  2. utools
  3. DevToys
  4. it-tools

产品设计

界面设计

正常页面面板点击后打开各类工具,通过搜索框快速搜索出想要的工具

阅读全文 »

好久没有写 java 代码了,持续更新一下自己的脚手架项目smart-spring-boot-project,发现有个更佳的实践,将脚手架以 jar 发布,脚手架项目以后升级版本就好了。

没有用中央仓库发布过 jar,听说也是比较麻烦,看到可以用 github 来实现,索性就来摸索一下。

简单看了一下发现有两种方式:

  • GitHub Packages registry
  • Github Repository 作为 Maven 仓库

接下来分别试试看。

阅读全文 »

如何学习编程?

George Hotz的影响,比较赞同:Learn by doing,找个自己感兴趣的项目,直接开干,在过程中学习。

很早之前就接触 redis,惊叹作者的代码和设计,如果你想学习数据库或者 cache 系统,推荐你看一下 redis 源码,短小精悍,完美融合了各种数据结构,协议的设计也完美的符合简单哲学。

我想学一下 go 语言,同时还能考虑一下 redis 的设计,这就是这个项目的最初动力。

go cache just for learn redis design and golang

本文所有代码:https://github.com/TrumanDu/the-force

项目初始化

在项目构建期纠结了很久,不知道如何组织 go 项目目录,因为自己的做 java 开发的,自己只能借鉴开源的经验

以下是我开始这个项目前参考的链接:

  1. golang-standards/project-layout
  2. How to Write Go Code

构建自己的项目目录结构

project-layout 能告诉我目前社区流行的 go 项目都采用什么目录结构。
根据自己的想法,目前构建如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
├─api //提供项目的api
├─build // 编译目录
│ ├─ci
│ └─package
├─cmd
│ └─gocache // 应用启动入口
├─configs // 应用配置
├─docs // 存放文档
├─init // 初始化
├─server
├─store
│ └─cache
└─tools // 工具类

阅读全文 »

NumPy

创建

1
2
3
4
5
6
7
8
9
10
11
array1 = np.array([1, 2, 3, 4, 5])
array2 = np.arange(0, 20, 2)
# 产生10个$[1, 100)$范围的随机整数
array5 = np.random.randint(1, 100, 10)
array7 = np.array([[1, 2, 3], [4, 5, 6]])
array8 = np.zeros((3, 4))
array9 = np.ones((3, 4))
# 使用eye函数创建单位矩阵
array11 = np.eye(4)
# 通过reshape将一维数组变成二维数组
array12 = np.array([1, 2, 3, 4, 5, 6]).reshape(2, 3)
阅读全文 »

依赖管理

  1. pip freeze > requirements.txt
  2. pip install pipreqs
    pipreqs ./ --encoding=utf8 --force

log 记录

简单使用

1
2
3
4
5
6
import logging

logging.basicConfig(format='%(levelname)s - %(asctime)s - %(message)s',level=logging.DEBUG)
logging.warning('this is %s log','warning')
logging.info('info log')
logging.error('error log')

运行代码输出:

1
2
3
4
WARNING - 2023-04-21 10:27:38,631 - this is warning log
INFO - 2023-04-21 10:27:38,631 - info log
ERROR - 2023-04-21 10:27:38,631 - error log

阅读全文 »

数据类型及流程结构

常用数据类型:

  • 整型 12
  • 浮点型 123.456 1.23456e2
  • 字符串型 hello
  • 布尔型 True False
  • 复数型 3+5j

变量命名,PEP8 要求:

  • 用小写字母拼写,多个单词用下划线连接。
  • 受保护的实例属性用单个下划线开头
  • 私有的实例属性用两个下划线开头

变量类型进行转换:

  • int():将一个数值或字符串转换成整数,可以指定进制。
  • float():将一个字符串转换成浮点数。
  • str():将指定的对象转换成字符串形式,可以指定编码。
  • chr():将整数转换成该编码对应的字符串(一个字符)。
  • ord():将字符串(一个字符)转换成对应的编码(整数)。

运算符

  • [] [:] 下标,切片
  • ** 指数
  • is is not 身份运算符
  • in not in 成员运算符
  • not or and 逻辑运算符

分支

1
2
3
4
5
6
7
if x > 1:
y = 3 * x - 5
elif x >= -1:
y = x + 2
else:
y = 5 * x + 3
print('f(%.2f) = %.2f' % (x, y))

循环

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
for x in range(1, 101):
if x % 2 == 0:
sum += x
print(sum)

while True:
counter += 1
number = int(input('请输入: '))
if number < answer:
print('大一点')
elif number > answer:
print('小一点')
else:
print('恭喜你猜对了!')
break
print('你总共猜了%d次' % counter)
阅读全文 »

​ 建筑与文化

建筑与文化建筑是一种相互关联的关系,建筑可以是文化的一种延续和表达。建筑不仅仅是一种物质的存在,更是一种文化的载体,它承载着人们的生活方式、思想观念和价值观念等。

比如,江南的房子典型的特征是白墙黑瓦,为什么是这样的呢?这种建筑风格不仅仅是因为它美观,更是因为它具有深厚的文化内涵。在中国的传统文化中,水墨画是一种重要的艺术形式,而江南的房子的建筑风格恰恰呼应了水墨画的特点,使得建筑与艺术形式之间达到了一种和谐的统一。

此外,在中国的传统文化中,家庭的礼仪也是非常重要的。中国人的家一定是有一个院子,不能推门登堂入室,这个就是礼仪。在中国传统文化中,礼仪一定是有一个循序渐进的过程,这种过程不仅仅是一种形式上的表现,更是一种对于家庭成员之间关系的体现。因此,建筑风格的选择也要与礼仪相符合,这样才能体现出中国传统文化的特点。

阅读全文 »

原力计划-从零实现最简 http 服务器

周末了,你带你的破电脑回到家并不能给你带来任何实质性作用,朋友们兜里掏出一大把钱吃喝玩乐,你默默的在家里摆弄你的破烂 java,spring 全家桶,srpingcloud 看了多少遍算法。亲戚朋友吃饭问你收获了什么,你说我装了个虚拟机,把各个工具都玩了一遍,亲戚们懵逼了,你还在心里默默嘲笑他们,笑他们不懂你的自动注入,不懂你的 10 层代理、不懂你的流量混淆,也笑他们连个复杂点的密码都记不住。你父母的同事都在说自己的子女一年的收获,儿子买了个房,女儿买了个车,姑娘升职加薪了,你的父母默默无言,说我的儿子搞了个破电脑,开起来嗡嗡响、家里电表走得越来越快了。

我就是那个段子里的大冤种,正文开始前自我调侃一下。

随着工作的年限的增长,越来越难写一些基础代码,总感觉自己的底子打的比较差,工作中写不了硬核代码,那我就用业余时间完成吧!我也知道网上代码一大堆,及时自己实现了也不见得有什么收获,就当学习,磨一磨生锈的刀。

若干年前在一个 java 项目中看到用纯 java 手撕前端代码,当时觉的好神奇,也大概只有功力深厚,大牛才能写出这样的代码,我等菜鸡只能写写 CURD,也许是那个时候埋下的种子吧,tomcat 没有精力写,但写一个简单的 http 服务器,让自己的网站跑在这个服务器上,想想也是美滋滋,什么 tomcat,什么 nginx,自己的服务器自己来写。

HTTP 服务器目标:让自己的网站跑在拥有自主知识产权的静态服务器上。

开始前要搞懂 http 协议。

HTTP 协议

HTTP 协议使用客户端-服务器模型,其中客户端发送一个 HTTP 请求到服务器,服务器则返回一个 HTTP 响应。HTTP 请求由请求方法(GET、POST、PUT、DELETE 等)和请求头(包含请求信息的元数据)组成,而 HTTP 响应由状态码(描述服务器对请求的响应)、响应头和响应正文(包含实际数据)组成。

以下是一个使用 HTTP 协议进行请求和响应的简单 demo:

  1. 客户端向服务器发送 GET 请求:

    1
    2
    3
    4
    GET /hello.txt HTTP/1.1
    Host: example.com
    User-Agent: Mozilla/5.0
    Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
  2. 服务器向客户端发送响应:

    1
    2
    3
    4
    5
    HTTP/1.1 200 OK
    Content-Type: text/plain
    Content-Length: 12

    Hello World!

在这个例子中,服务器返回一个 HTTP/1.1 200 OK 响应码,表示请求成功。响应头中包含了一些附加的信息,例如返回的数据类型和数据长度。响应正文中包含了实际的数据,即 Hello World!。

阅读全文 »

写文章确实不如发朋友圈便捷,发朋友圈不需要想文章标题,但写文章需要一个标题,还需要一个主题。我也不知道我能分享什么,暂且写一写最近一些对互联网的困惑吧。

冲浪

记得在初中时,我们经常会接触一个词:冲浪。这个说法起源于 20 世纪 80 年代晚期和 90 年代初期,当时互联网还比较新颖,人们在上网时需要通过调制解调器连接到电话线,网页的加载速度也比较缓慢,因此上网浏览网页的过程就像是在波浪中冲浪一样,需要花费一定的时间和耐心。

此外,冲浪这个词本身也具有一定的流行和时尚感,适合用于描述这种新颖、刺激的行为,因此在那个年代成为了一个比较流行的说法。随着互联网技术的不断发展和进步,上网的方式也发生了很大的改变,人们逐渐使用更快速、更方便的方式进行上网,因此“冲浪”这个词汇在日常生活中的使用逐渐减少。

那个时候对于信息的获取是如饥似渴,总是在互联网上获取很多新的信息,源源不断,就像打开新世界的窗口,很像现在在抖音里看到的各种段子,但那个时候我们上网真的是抱着学习的态度,记得有一款浏览器就叫世界之窗

阅读全文 »