go gpu 编程(Cursor编程初体验,搭载GPT-4大模型,你的AI助手,自然语言编程来了)
背景
这两天体验了下最新生产力工具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 theres 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); // truePython
第二问: 编写一个聚类算法 ,并提供实例 # 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 theres 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 Algorithm import numpy as np import matplotlib.pyplot as plt class KMeans: def __init__(self, k=2, max_iter=100): self.k = k self.max_iter = max_iter def fit(self, X): self.centroids = {} # Initialize centroids randomly for i in range(self.k): self.centroids[i] = X[np.random.choice(len(X))] # Iterate until convergence or max iterations reached for i in range(self.max_iter): self.clusters = {} for j in range(self.k): self.clusters[j] = [] # Assign each data point to the closest centroid for 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 points for c in self.clusters: self.centroids[c] = np.mean(self.clusters[c], axis=0) def predict(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 in range(len(X)): plt.scatter(X[i][0], X[i][1], color=colors[predictions[i]]) plt.show()Java
第三问(源自于一道面试题或者日常工作中遇到的一个小需求): 请简单封装一个函数 ,实现友好时间的功能 ,要求该函数可输入一个参数【时间戳】,输出一个字符串【三天前 、昨天 、今天 、明天 、刚刚(10分钟内)】 。 public static String friendlyTime(long timestamp) { long current = System.currentTimeMillis(); long diff = current - timestamp; if (diff < 10 * 60 * 1000) { return "刚刚"; } else if (diff < 24 * 60 * 60 * 1000) { return "今天"; } else if (diff < 2 * 24 * 60 * 60 * 1000) { return "昨天"; } else if (diff < 3 * 24 * 60 * 60 * 1000) { return "前天"; } else { return "更早之前"; } }Java
第四问(源自于一道面试题或者日常工作中遇到的一个小需求): 请将一维数组的内容进行正向排序 ,并进行反向输出 。[1 ,7,8 ,4 ,3 ,6 ,2 ,5 ,9] public class Array { public static void main(String[] args) { int[] arr = {1, 7, 8, 4, 3, 6, 2, 5, 9}; Arrays.sort(arr); // sort the array in ascending order for (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] public static void main(String[] args) { String[] arr1 = {"q", "w", "e", "r", "t"}; String[] arr2 = {"a", "w", "d", "s", "r", "g"}; Set<String> set1 = new HashSet<>(Arrays.asList(arr1)); Set<String> set2 = new HashSet<>(Arrays.asList(arr2)); // Intersection Set<String> intersection = new HashSet<>(set1); intersection.retainAll(set2); System.out.println("Intersection: " + intersection); // Union Set<String> union = new HashSet<>(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 LIMIT 10;语法支持
第七问: 编码实现从数组中找出最小值:[8, 1, 4, 0, -3] 采用lambda方式实现 public class Min { public static void main(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 image def predict_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 发送到钉钉 import java.sql.*; public class Database { public static void main(String[] args) { try { // Connect to local database String 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 table Statement statement = connection.createStatement(); ResultSet resultSet = statement.executeQuery("SELECT * FROM poems LIMIT 5"); // Print results while (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 Excel ResultSetToExcelConverter converter = new ResultSetToExcelConverter(resultSet); converter.export("poems.xlsx"); DingTalkClient client = new DefaultDingTalkClient("https://oapi.dingtalk.com/robot/send?access_token=ACCESS_TOKEN"); OapiRobotSendRequest request = new OapiRobotSendRequest(); request.setMsgtype("text"); OapiRobotSendRequest.Text text = new OapiRobotSendRequest.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客户端 import org.eclipse.milo.opcua.sdk.client.OpcUaClient; import org.eclipse.milo.opcua.stack.core.types.builtin.NodeId; import org.eclipse.milo.opcua.stack.core.types.builtin.QualifiedName; import org.eclipse.milo.opcua.stack.core.types.builtin.Variant; import org.eclipse.milo.opcua.stack.core.types.structured.ReadValueId; import org.eclipse.milo.opcua.stack.core.types.structured.ReadValueId; import org.eclipse.milo.opcua.stack.core.types.structured.ReadResponse; import org.eclipse.milo.opcua.stack.core.types.structured.WriteValue; import org.eclipse.milo.opcua.stack.core.types.structured.WriteResponse; import java.util.concurrent.CompletableFuture; public class OPCClient { public static void main(String[] args) throws Exception { // Create a new OPC UA client OpcUaClient client = OpcUaClient.create("opc.tcp://localhost:12686/example"); // Connect to the server client.connect().get(); // Read a value from the server NodeId nodeId = new NodeId(2, "/HelloWorld/ScalarTypes/Int32"); ReadValueId readValueId = new ReadValueId(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 server WriteValue writeValue = new WriteValue(nodeId, QualifiedName.DEFAULT, new Variant(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(); } }代码解释
public static int test(int n) { int cnt = 0; while(0 != n) { n = n & (n - 1); ++cnt; } return cnt; } public static void main(String[] args) { System.out.println(test(15)); } }先将上述代码写入一个.java文件 ,然后 Ctrl+K 输入以下问题 。
第十一问: 解释下这段代码(或者:这段代码是什么意思?) // 这段代码是一个Java程序,其中定义了一个名为test的静态方法 ,该方法接受一个整数参数n并返回一个整数 。该方法使用while循环计算n的二进制表示中1的个数 ,并将其存储在cnt变量中。最后 ,该方法返回cnt的值 。在main方法中 ,该程序调用test方法并将15作为参数传递给它 ,然后将结果打印到控制台 。代码优化
public class Improve { public static int test(int n) { int cnt = 0; while(0 != n) { if((n & 1) != 0) { ++cnt; n >>= 1; } else { n >>= 1; } } return cnt; } public static void main(String[] args) { System.out.println(test(15)); } }先将上述代码写入一个.java文件 ,然后选择需要优化的代码段或者全选 , Ctrl+K 输入以下问题。
第十一问: 优化下 public class Improve { public static int test(int n) { int cnt = 0; cnt = Integer.bitCount(n); return cnt; } public static void main(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!
创心域SEO版权声明:以上内容作者已申请原创保护,未经允许不得转载,侵权必究!授权事宜、对本内容有异议或投诉,敬请联系网站管理员,我们将尽快回复您,谢谢合作!