KMP算法是一种改进的字符串匹配算法,由D.E.Knuth,J.H.Morris和V.R.Pratt提出的,因此人们称它为克努特—莫里斯—普拉特操作(简称KMP算法)。KMP算法的核心是利用匹配失败后的信息,尽量减少模式串与主串的匹配次数以达到快速匹配的目的。具体实现就是通过一个next()函数实现,函数本身包含了模式串的局部匹配信息。KMP算法的时间复杂度O(m+n) 。
示例代码:
package main
import (
"fmt"
)
const (
PatternSize int = 100
)
func SearchNext(haystack string, needle string) int {
retSlice := KMP(haystack, needle)
if len(retSlice) > 0 {
return retSlice[len(retSlice)-1]
}
return -1
}
func SearchString(haystack string, needle string) int {
retSlice := KMP(haystack, needle)
if len(retSlice) > 0 {
return retSlice[0]
}
return -1
}
func KMP(haystack string, needle string) []int {
next := preKMP(needle)
i := 0
j := 0
m := len(needle)
n := len(haystack)
x := []byte(needle)
y := []byte(haystack)
var ret []int
//got zero target or want, just return empty result
if m == 0 || n == 0 {
return ret
}
//want string bigger than target string
if n < m {
return ret
}
for j < n {
for i > -1 && x[i] != y[j] {
i = next[i]
}
i++
j++
//fmt.Println(i, j)
if i >= m {
ret = append(ret, j-i)
//fmt.Println("find:", j, i)
i = next[i]
}
}
return ret
}
func preMP(x string) [PatternSize]int {
var i, j int
length := len(x) - 1
var mpNext [PatternSize]int
i = 0
j = -1
mpNext[0] = -1
for i < length {
for j > -1 && x[i] != x[j] {
j = mpNext[j]
}
i++
j++
mpNext[i] = j
}
return mpNext
}
func preKMP(x string) [PatternSize]int {
var i, j int
length := len(x) - 1
var kmpNext [PatternSize]int
i = 0
j = -1
kmpNext[0] = -1
for i < length {
for j > -1 && x[i] != x[j] {
j = kmpNext[j]
}
i++
j++
if x[i] == x[j] {
kmpNext[i] = kmpNext[j]
} else {
kmpNext[i] = j
}
}
return kmpNext
}
func main() {
fmt.Println("Search First Position String:\n")
fmt.Println(SearchString("cocacola", "co"))
fmt.Println(SearchString("Australia", "lia"))
fmt.Println(SearchString("cocacola", "cx"))
fmt.Println(SearchString("AABAACAADAABAABA", "AABA"))
fmt.Println("\nSearch Last Position String:\n")
fmt.Println(SearchNext("cocacola", "co"))
fmt.Println(SearchNext("Australia", "lia"))
fmt.Println(SearchNext("cocacola", "cx"))
fmt.Println(SearchNext("AABAACAADAABAABAAABAACAADAABAABA", "AABA"))
}
输出:
Search First Position String:
0
6
-1
0
Search Last Position String:
4
6
-1
25
更换国内的数据源
composer config -g repo.packagist composer https://mirrors.aliyun.com/composer/
错误信息:
docker.errors.DockerException: Error while fetching server API version: HTTPConnection.request() got an unexpected keyword argument 'chunked'
解决方案:
这是因urllib3的新版本导致的问题。需要降低urllib3的版本。首先,pip删除urllib3,然后安装2.0以下的版本,如下
pip install urllib3==1.26.8 -i https://pypi.tuna.tsinghua.edu.cn/simple
computed和watch的区别:
- computed是计算属性,通过属性计算得来的属性,而watch是监听一个值的变化,然后执行对应的回调1。
- computed中的函数直接调用,不用加(),而watch中的函数不需要调用1。
- computed是依赖data中的属性,data中属性发生改变的时候,当前函数才会执行,而watch不支持缓存1。
- computed属性的结果会被缓存,除非依赖的响应式属性变化才会重新计算,而watch一个对象,键是需要观察的表达式,值是对应回调函数。
computed和watch的运用场景:
- computed适合用在多个数据相互影响,需要处理复杂逻辑或多个属性影响一个属性的变化时使用,例如:购物车商品结算等。
- watch适合用在数据影响多个数据,需要在数据变化时执行异步操作或者开销较大的操作时使用,例如:搜索数据等。
在 Docker Compose 的yaml文件中,可以通过指定每个服务的内存限制来限制容器的内存。具体的做法是使用mem_limit字段来指定内存限制,单位可以是字节 (b) 或者是常用单位(例如 k 表示 KB,m 表示 MB,g 表示 GB)。
以下是示例代码:
yamlversion: '3'
services:
myservice:
image: myimage
mem_limit: 512m # 限制内存为 512 MB
ChatGPT对于我们价值不用多说,但我们也需要熟练掌握它,才能发挥出这款工具的最大作用,获得理想的交互体验。
今天,我们来介绍几个ChatGPT的指令参数,可以更好的指导ChatGPT的生成行为,以达到我们预期的目的。
"model"
说明:"model"是用于我们指定使用哪个AI模型。
值可以是:gpt-4,gpt-3.5-turbo,text-davinci-003, text-davinci-002等等。
备注:在网页版ChatGPT中gpt4模型无法使用,因为免费版的最多只能用gpt3.5了。在套壳ChatGPT中是无法使用指令的,因为作者已经对一些指令做了预设。
比如:"model":gpt-3.5-turbo
“temperature”
说明:这个指令是控制生成的文本与提示的相似度。也就是常说的温度值。较低的值将使输出更加的接近提示。较高的值GPT会输出的更加随机有创造性。
值可以是:0-2
比如:"temperature":1.5
“n"
说明:指定输出几个结果,可以供我们选择。
值可以是:大于或者等于1
比如:“n":3
“max_tokens”
说明:用于控制文本生成的最大长度。以token为单位。
值可以是:大于0——模型允许的最大值
比如:"max_tokens":2000
“top_p”
说明:用于控制GPT在预测下一单词时的单词取值范围,比如值设成0.7,GPT将在生成过程中考虑70个最有可能的单词。因此它可以控制生成结果的多样性,较小的值可以生成更加确定的文本,较大的值可以生成更多样性的结果。这个和"temperature"有着差不多的作用,建议在使用时只用其中一个就可以了。
值可以是:0-1
例如:"top_p":0.7
"stop"
说明:这个是指定模型在生成过程中遇到某个特定字符或者字符串时停止。它可以更好的控制生成文本的长度和内容,更符合某些场景中的应用。
值可以是:可以是一个字符或者字符串。
比如:"stop":stop
"echo"
说明:这个控制是否返回输入的提示作为输出的一部分。
值可以是:true或者false
比如:"echo":true
你手中拥有了最先进的AI技术ChatGPT。但是,如果你不知道如何“驾驶”,那么这个工具的价值就大打折扣。
但是别担心,今天我将带你揭开ChatGPT的驾驶秘诀,这四大“Prompts技巧”将让你瞬间变成AI赛车手,驾驶你的ChatGPT,领先99%的人。
1. 指令提示「Instruction prompting」
2. 角色提示「Role prompting」
3. 一次性提示「One-shot prompting」
4. 小提示「Few-shot prompting」
现在,系好安全带,我们一起开始这场ChatGPT驾驶之旅!
指令提示「Instruction prompting」
指令提示是最常见也最快速的Prompt使用方式。在这种模式下,你只需要向ChatGPT提出一个直接的问题或给出一个指令,比如:“为我提供一种在电子商务中增加客户参与度的策略”AI会迅速为你提供答案或者完成任务。这种方式的速度快,但可能不如其他方式那么准确。
速度:快
强度:1/5
示例:

角色提示「Role prompting」
你可以赋予ChatGPT一个特定的角色,让它扮演一个专家来为你提供咨询。例如:“假设你是一位电子商务优化专家,告诉我如何提高购物车转化率。”这样做,ChatGPT将更容易生成准确且符合上下文的答案。
速度:快
强度:2/5
示例:

一次性提示「One-shot prompting」
通过提供一个示例,你可以让ChatGPT学习你的思维方式,并根据这个单一输入生成你期望的输出。例如:“如果我正在优化我的电子商务网站,我可能会说:‘我们增加了产品详细的描述和高清的图片,这导致我们的销售额增加了15%。’现在,你来给我提供另一个优化电子商务网站的策略。”这种方式结合了指令提示和角色提示的优势,能够产生更精确的结果。
速度:中等
强度:3/5
示例:

小提示「Few-shot prompting」
你可以向ChatGPT提供几个示例,帮助它建立起对某个任务的全面理解。这种方式的结果往往最为准确和相关。例如:“假设我正在编写一篇关于电子商务最佳实践的文章。我已经写了以下几个要点:
1.为顾客提供无缝的购物体验。
2.在网站上实现简单直观的导航。
现在,你再为我列举出两个电子商务最佳实践。”
速度:慢
强度:5/5
示例:

现在你已经知道了如何更有效地使用AI,那么你可能会好奇,AI在我们生活的其他方面能做什么?答案是,AI的能力远超你的想象。从医疗到金融,从交通到教育,AI都正在深入渗透,它的潜力无穷无尽。
PHP Composer 是一个用于 PHP 项目依赖管理的工具,它通过自动加载机制来实现对依赖库的自动加载。下面是 Composer 实现自动加载的步骤:
- 安装 Composer:首先,你需要在项目根目录下安装 Composer。你可以通过在终端中执行 php -r "readline_readline('https://getcomposer.org/installer', 'composer-setup.php');" && php composer-setup.php 命令来安装 Composer。
- 创建 composer.json 文件:在项目根目录下创建一个名为 composer.json 的文件,用于定义项目的依赖关系和配置自动加载规则。
- 定义依赖:在 composer.json 文件中,你可以指定项目所依赖的库及其版本号。例如:
json{
"require": {
"vendor/package": "1.2.3"
}
}
- 自动加载配置:在 composer.json 文件中,你可以使用 autoload 属性来配置自动加载规则。这个属性可以让你指定自动加载的命名空间和文件路径。例如:
json{
"autoload": {
"psr-4": {
"App\\": "src/"
}
}
}
上述配置指定了命名空间 App 的类文件位于 src/ 目录下,使用 PSR-4 规范进行自动加载。你可以根据项目实际情况修改命名空间和目录路径。 5. 运行 Composer:在终端中进入项目根目录,执行 composer install 命令,Composer 将根据 composer.json 文件中的依赖信息下载依赖库,并根据自动加载配置生成自动加载文件。 6. 使用自动加载:在 PHP 代码中,你可以使用 use 语句引用自动加载的类。例如:
php<?php
use App\SomeClass;
$obj = new SomeClass();
// 执行一些操作...
?>
Composer 会根据自动加载规则自动加载 SomeClass 类所在的文件,你无需手动包含或引入文件。
以上是 PHP Composer 实现自动加载的基本过程。当你执行 PHP 代码时,Composer 会根据自动加载规则自动加载所需的类文件,确保你的代码能够正确地使用依赖库。
"microsoft/promptflow" 是一套开发工具,旨在简化 LLM(大型语言模型)基础的人工智能应用的全生命周期开发过程,包括构思、原型设计、测试、评估、生产部署和监控。使用 Prompt flow,您可以创建可执行的工作流,将 LLM、提示、Python 代码和其他工具链接在一起,轻松调试和迭代工作流,评估其质量和性能,将测试和评估集成到 CI/CD 系统中以确保质量,然后轻松部署到您选择的服务平台或将其集成到应用程序代码中。此项目欢迎贡献和建议,您可以开始通过查看开发设置指南 dev_setup.md。请注意,此项目采用了 MIT 许可证,并遵守 Microsoft 的开源行为准则。
创建将 LLM、提示、Python 代码和其他工具链接在一起的可执行工作流程。
轻松调试和迭代您的流程,尤其是与LLMs的交互。
使用更大的数据集评估流程的质量和性能。
将测试和评估集成到您的 CI/CD 系统中,以确保流程的质量。
将您的流程部署到您选择的服务平台或轻松集成到应用程序的代码库中。
利用 Azure AI 中的云版本提示流与您的团队协作。
使用提示流程开发您的 LLM 应用程序:请从我们的文档和示例开始:
提示流程入门:调用首次流程运行的分步指南。
教程:使用 PDF 聊天:关于如何构建具有提示流程的高质量聊天应用程序的端到端教程,包括流程开发和指标评估。
为提示流程做出贡献:请从我们的开发设置指南开始:dev_setup.md。
项目链接
https://github.com/microsoft/promptflow
- GIMP:GIMP 是一款功能强大的免费开源图像编辑软件,支持 Windows、macOS和 Linux等操作系统。GIMP 的网页版是基于GimpJS库开发的,该库是 GIMP 的 JavaScript 版本。GIMP 的网页版功能丰富,包括图像缩放、裁剪、旋转、滤镜、图层等。
- Photopea:Photopea是一款免费开源的在线图像编辑软件,支持多种图像格式,包括 JPEG、PNG、GIF、PSD 等。Photopea 的界面类似于 Adobe Photoshop,使用起来非常方便。Photopea 的功能也很丰富,包括图像缩放、裁剪、旋转、滤镜、图层、文字等。
- Sumopaint:Sumopaint是一款免费开源的在线图像编辑软件,支持多种图像格式,包括 JPEG、PNG、GIF、PSD 等。Sumopaint 的界面简洁明了,使用起来非常简单。Sumopaint 的功能也比较丰富,包括图像缩放、裁剪、旋转、滤镜、图层、文字等。
- Pixlr:Pixlr是一款免费开源的在线图像编辑软件,支持多种图像格式,包括 JPEG、PNG、GIF、PSD 等。Pixlr 的界面类似于 Adobe Photoshop,使用起来非常方便。Pixlr 的功能也很丰富,包括图像缩放、裁剪、旋转、滤镜、图层、文字等。
这是ImageMagic中有权限配置文件,需要修改PDF相关的读写权限。
# 打开policy.xml文件
sudo nano /etc/ImageMagick-6/policy.xml
# 修改PDF相关权限,由none改为read|write
<policy domain="coder" rights="none" pattern="PDF" />
# 改为
<policy domain="coder" rights="read|write" pattern="PDF" />
本地备份命令改为docker命令
#mysqldump -h 127.0.0.1 $dbname > $backup_file
改成如下
docker exec mysql容器名 mysqldump $dbname > $backup_file
其中-u root -p password都应该在my.cnf配置文件中设置,如下
[mysqldump]
user=root
password=你的密码
这个挖矿病毒是通过:开放的php9000端口或者开放的redis的6379端口且没有设置密码的漏洞入侵。
这里指的开放是外部可以访问这些端口,用telnet ip port就可以测试。
笔者用的是同样的dokcer文件构建的LNMP系统,
在阿里云上重来没有出现过这个病毒,
但在腾讯云服务器就一直有入侵,甚至我用ufw关闭了9000和6379依然无用。
最后,在腾讯云官网,管理【云服务实例】界面的【安全组】里发现,默认居然是开放全部端口。
这条设置使系统中的ufw配置无效,这实在不应该。
阿里云默认只有22,80,3389等必要端口是开放的。
既然发现了问题所在,解决方法就简单,
删除【接收all】的条目,增加必须的22,80,443等端口。
Docker Compose需要管理员权限才能运行,因为它需要控制Docker守护进程和容器。因此,您需要使用sudo或root用户来运行docker-compose命令。
如果您想让普通用户也能够运行docker-compose命令,可以按照以下步骤进行操作:
编辑sudoers文件,允许普通用户使用docker命令:
sudo visudo
在文件末尾添加以下行:
%sudo ALL = NOPASSWD: /usr/bin/docker
保存并退出。
将当前用户的组更改为sudo组:
sudo usermod -aG sudo yourusername
其中,yourusername是您的用户名。
重新登录或注销并重新登录,以使更改生效。
现在,您应该能够使用普通用户身份运行docker-compose命令了。