背景
这两天体验了下最新生产力工具Cursor,基于最新的
GPT-4
大模型,目前免费,国内可访问,不限次数,跨平台,你确定不来体验一把?官方的
Slogan
:
Build Software. Fast. Write, edit, and chat about your code with GPT-4
In partnership with OpenAI
- 在进行初步体验时,以下几点需要了解:
Cursor编程
的上下文是你所在的代码文件,即如果你的文件后缀名为.py
,那么在具体沟通时,就无需再出现“使用Python实现……”这种多余的前提,可以用更具体的限制;- 代码生成之后还会提示合并还是丢弃:
Accept
或者Reject
; - 支持回滚:如果想撤销某次的
Prompt
,Ctrl+Z
,Reject
; - 偶尔会出现生产的代码不完整的问题,只需问一句:没写完吧?
Ctrl+K
,生成代码或者对选定的代码段进行优化;Ctrl+L
,对聊模式,对编程问题或者选定的代码段直接提问;
- 支持的语言
- 聊天模式
- 提示合并还是丢弃
以下通过12个简单的问题,从语言支持、语法支持、业务场景、代码解释、代码优化等方面来体验一把这个编程生产力利器。
理论上,对于复杂的任务,只要分解到GPT能够理解的那一步,都可以胜任。程序员的AI助手(它竟然可以帮我们找Bug~~),自然语言编程真的来了。至于下面生成的代码能不能用,还需要进行实际验证,但目测从语言支持、语义理解以及逻辑推理等方面来看,可用率至少80%吧。
语言支持
编程语言支持:
TypeScript
,
HTML
,
CSS
,
Python
,
C
,
Rust
,
Go
,
CSharp
,
Java
,
PHP
,
SQL
等数十种。
Node.js
- 第一问(源自于我的一篇文章:使用bcryptjs对密码加密时,其校验原理是怎样的?): - 使用bcryptjs生成hash- 校验密码
// Welcome to Cursor// 1. Try generating with command K on a new line. Ask for a new react component of an error popup.// 2. Then, select the outputted code and hit chat. Ask if there's a bug. Ask how to improve.// 3. Try selecting some code and hitting edit. Ask the bot to add a button that updates a statefield.// 4. To try out cursor on your own projects, go to file menu (top left) and open a folder.const bcrypt =require('bcryptjs');const password ='myPassword123';const salt = bcrypt.genSaltSync(10);const hash = bcrypt.hashSync(password, salt);
console.log(hash);const isMatch = bcrypt.compareSync('myPassword123', hash);
console.log(isMatch);// true
Python
- 第二问: - 编写一个聚类算法,并提供实例
# Welcome to Cursor# 1. Try generating with command K on a new line. Ask for a pytorch script of a feedforward neural network# 2. Then, select the outputted code and hit chat. Ask if there's a bug. Ask how to improve.# 3. Try selecting some code and hitting edit. Ask the bot to add residual layers.# 4. To try out cursor on your own projects, go to the file menu (top left) and open a folder.# K-Means Clustering Algorithmimport numpy as np
import matplotlib.pyplot as plt
classKMeans:def__init__(self, k=2, max_iter=100):
self.k = k
self.max_iter = max_iter
deffit(self, X):
self.centroids ={}# Initialize centroids randomlyfor i inrange(self.k):
self.centroids[i]= X[np.random.choice(len(X))]# Iterate until convergence or max iterations reachedfor i inrange(self.max_iter):
self.clusters ={}for j inrange(self.k):
self.clusters[j]=[]# Assign each data point to the closest centroidfor x in X:
distances =[np.linalg.norm(x - self.centroids[c])for c in self.centroids]
closest_centroid = distances.index(min(distances))
self.clusters[closest_centroid].append(x)# Update centroids to be the mean of their assigned data pointsfor c in self.clusters:
self.centroids[c]= np.mean(self.clusters[c], axis=0)defpredict(self, X):
predictions =[]for x in X:
distances =[np.linalg.norm(x - self.centroids[c])for c in self.centroids]
closest_centroid = distances.index(min(distances))
predictions.append(closest_centroid)return predictions
# Example usage
X = np.array([[1,2],[1.5,1.8],[5,8],[8,8],[1,0.6],[9,11]])
kmeans = KMeans(k=2)
kmeans.fit(X)
predictions = kmeans.predict(X)
colors =['r','g','b','c','m','y']for i inrange(len(X)):
plt.scatter(X[i][0], X[i][1], color=colors[predictions[i]])
plt.show()
Java
- 第三问(源自于一道面试题或者日常工作中遇到的一个小需求): - 请简单封装一个函数,实现友好时间的功能,要求该函数可输入一个参数【时间戳】,输出一个字符串【三天前、昨天、今天、明天、刚刚(10分钟内)】。
publicstaticStringfriendlyTime(long timestamp){long current =System.currentTimeMillis();long diff = current - timestamp;if(diff <10*60*1000){return"刚刚";}elseif(diff <24*60*60*1000){return"今天";}elseif(diff <2*24*60*60*1000){return"昨天";}elseif(diff <3*24*60*60*1000){return"前天";}else{return"更早之前";}}
Java
- 第四问(源自于一道面试题或者日常工作中遇到的一个小需求): - 请将一维数组的内容进行正向排序,并进行反向输出。[1,7,8,4,3,6,2,5,9]
publicclassArray{publicstaticvoidmain(String[] args){int[] arr ={1,7,8,4,3,6,2,5,9};Arrays.sort(arr);// sort the array in ascending orderfor(int i =0; i < arr.length; i++){System.out.print(arr[i]+" ");}System.out.println();for(int i = arr.length -1; i >=0; i--){System.out.print(arr[i]+" ");}}}
Java
- 第五问(源自于一道面试题或者日常工作中遇到的一个小需求): - 请将两个数组的交集与并集取出,存放于新的数组中。[q,w,e,r,t],[a,w,d,s,r,g]
publicstaticvoidmain(String[] args){String[] arr1 ={"q","w","e","r","t"};String[] arr2 ={"a","w","d","s","r","g"};Set<String> set1 =newHashSet<>(Arrays.asList(arr1));Set<String> set2 =newHashSet<>(Arrays.asList(arr2));// IntersectionSet<String> intersection =newHashSet<>(set1);
intersection.retainAll(set2);System.out.println("Intersection: "+ intersection);// UnionSet<String> union =newHashSet<>(set1);
union.addAll(set2);System.out.println("Union: "+ union);}
SQL
- 数据表结构
- 第六问: - 连接本地数据库:localhost:3306,用户名:root,密码:root,从数据库poetry中的poems读取前10条数据并打引,通过author_id关联poems_author表。
USE poetry;SELECT poems.title, poems.content, poems_author.name
FROM poems
JOIN poems_author
ON poems.author_id = poems_author.id
LIMIT10;
语法支持
- 第七问: - 编码实现从数组中找出最小值:[8, 1, 4, 0, -3]- 采用lambda方式实现
publicclassMin{publicstaticvoidmain(String[] args){int[] arr ={8,1,4,0,-3};int min =Arrays.stream(arr).min().getAsInt();System.out.println("The minimum value in the array is: "+ min);}}
业务场景
- 第八问(源自于实际的物联网开发场景): - 使用YoLoV5编码实现识别烟雾火焰
import torch
from PIL import Image
import requests
from io import BytesIO
# Load model
model = torch.hub.load('ultralytics/yolov5','yolov5s', pretrained=True)# Define class names
class_names =['smoke','fire']# Define function to predict imagedefpredict_image(image_url):# Load image from URL
response = requests.get(image_url)
img = Image.open(BytesIO(response.content))# Predict image
results = model(img)# Get class predictions
class_predictions = results.pred[0].softmax(-1)# Get class indices
class_indices = class_predictions.argmax(-1).tolist()# Get class names
class_names_predicted =[class_names[i]for i in class_indices]return class_names_predicted
- 第九问: - 连接本地数据库:localhost:3306,用户名:root,密码:root,从数据库poetry中的poems读取前5条数据并打印。- 把这5条数据导出到Excel- 发送到钉钉
importjava.sql.*;publicclassDatabase{publicstaticvoidmain(String[] args){try{// Connect to local databaseString url ="jdbc:mysql://localhost:3306/poetry";String user ="root";String password ="root";Connection connection =DriverManager.getConnection(url, user, password);// Read first 5 rows from poems tableStatement statement = connection.createStatement();ResultSet resultSet = statement.executeQuery("SELECT * FROM poems LIMIT 5");// Print resultswhile(resultSet.next()){System.out.println(resultSet.getString("title")+" by "+ resultSet.getString("author")+" "+ resultSet.getString("content")+" "+ resultSet.getString("style")+" "+ resultSet.getString("dynasty")+" "+ resultSet.getString("notes"));}// Export results to ExcelResultSetToExcelConverter converter =newResultSetToExcelConverter(resultSet);
converter.export("poems.xlsx");DingTalkClient client =newDefaultDingTalkClient("https://oapi.dingtalk.com/robot/send?access_token=ACCESS_TOKEN");OapiRobotSendRequest request =newOapiRobotSendRequest();
request.setMsgtype("text");OapiRobotSendRequest.Text text =newOapiRobotSendRequest.Text();
text.setContent("Results from database query: "+ resultSet.toString());
request.setText(text);
client.execute(request);// Close connection
resultSet.close();
statement.close();
connection.close();}catch(SQLException e){System.out.println("Error connecting to database: "+ e.getMessage());}}}
- 第十问(源自于实际的物联网开发场景): - 编码实现一个OPC UA客户端
importorg.eclipse.milo.opcua.sdk.client.OpcUaClient;importorg.eclipse.milo.opcua.stack.core.types.builtin.NodeId;importorg.eclipse.milo.opcua.stack.core.types.builtin.QualifiedName;importorg.eclipse.milo.opcua.stack.core.types.builtin.Variant;importorg.eclipse.milo.opcua.stack.core.types.structured.ReadValueId;importorg.eclipse.milo.opcua.stack.core.types.structured.ReadValueId;importorg.eclipse.milo.opcua.stack.core.types.structured.ReadResponse;importorg.eclipse.milo.opcua.stack.core.types.structured.WriteValue;importorg.eclipse.milo.opcua.stack.core.types.structured.WriteResponse;importjava.util.concurrent.CompletableFuture;publicclassOPCClient{publicstaticvoidmain(String[] args)throwsException{// Create a new OPC UA clientOpcUaClient client =OpcUaClient.create("opc.tcp://localhost:12686/example");// Connect to the server
client.connect().get();// Read a value from the serverNodeId nodeId =newNodeId(2,"/HelloWorld/ScalarTypes/Int32");ReadValueId readValueId =newReadValueId(nodeId,QualifiedName.DEFAULT,null,null);CompletableFuture<ReadResponse> readResponse = client.read(readValueId);Variant value = readResponse.get().getResults()[0].getValue().getValue();System.out.println("Value: "+ value);// Write a value to the serverWriteValue writeValue =newWriteValue(nodeId,QualifiedName.DEFAULT,newVariant(42));CompletableFuture<WriteResponse> writeResponse = client.write(writeValue);Boolean success = writeResponse.get().getResults()[0].isGood();System.out.println("Write success: "+ success);// Disconnect from the server
client.disconnect().get();}}
代码解释
publicstaticinttest(int n){int cnt =0;while(0!= n){
n = n &(n -1);++cnt;}return cnt;}publicstaticvoidmain(String[] args){System.out.println(test(15));}}
先将上述代码写入一个.java文件,然后
Ctrl+K
输入以下问题。
- 第十一问: - 解释下这段代码(或者:这段代码是什么意思?)
// 这段代码是一个Java程序,其中定义了一个名为test的静态方法,该方法接受一个整数参数n并返回一个整数。该方法使用while循环计算n的二进制表示中1的个数,并将其存储在cnt变量中。最后,该方法返回cnt的值。在main方法中,该程序调用test方法并将15作为参数传递给它,然后将结果打印到控制台。
代码优化
publicclassImprove{publicstaticinttest(int n){int cnt =0;while(0!= n){if((n &1)!=0){++cnt;
n >>=1;}else{
n >>=1;}}return cnt;}publicstaticvoidmain(String[] args){System.out.println(test(15));}}
先将上述代码写入一个.java文件,然后选择需要优化的代码段或者全选,
Ctrl+K
输入以下问题。
- 第十一问: - 优化下
publicclassImprove{publicstaticinttest(int n){int cnt =0;
cnt =Integer.bitCount(n);return cnt;}publicstaticvoidmain(String[] args){System.out.println(test(15));}}
从结果看,
Cursor
将我们自己编写的通过位运算右移计算二进制表示中1的个数,改成了一个内置方法调用。
小总结
其实,除了上述的入门体验,还有其他很多事情可以做,eg: 编写测试用例,解决力扣编程问题,网络爬虫,制作网页,小游戏编程,you name it,这一切仅受限于我们的想象力。
以下引用池建强的一句话:
人们需要警惕的是,当年因为汽车的诞生而失业的马车夫,他们并不是转行去干司机了,而是真失业了,或者去干别的苦力活。
当上时代司机的,是另一群人。
If you have any questions or any bugs are found, please feel free to contact me.
Your comments and suggestions are welcome!
版权归原作者 Heartsuit 所有, 如有侵权,请联系我们删除。