3238. 求出胜利玩家的数目 作者: zorth 时间: 2024-11-23 分类: 算法 评论 简单题 | 数组 | 给你一个整数 `n` ,表示在一个游戏中的玩家数目。同时给你一个二维整数数组 `pick` ,其中 `pick[i] = [xi, yi]` 表示玩家 `xi` 获得了一个颜色为 `yi` 的球。 如果玩家 `i` 获得的球中任何一种颜色球的数目 **严格大于** `i` 个,那么我们说玩家 `i` 是胜利玩家。换句话说: - 如果玩家 0 获得了任何的球,那么玩家 0 是胜利玩家。 - 如果玩家 1 获得了至少 2 个相同颜色的球,那么玩家 1 是胜利玩家。 - ... - 如果玩家 `i` 获得了至少 `i + 1` 个相同颜色的球,那么玩家 `i` 是胜利玩家。 请你返回游戏中 **胜利玩家** 的数目。 **注意**,可能有多个玩家是胜利玩家。 **示例 1:** **输入:**n = 4, pick = [[0,0],[1,0],[1,0],[2,1],[2,1],[2,0]] **输出:**2 **解释:** 玩家 0 和玩家 1 是胜利玩家,玩家 2 和玩家 3 不是胜利玩家。 **示例 2:** **输入:**n = 5, pick = [[1,1],[1,2],[1,3],[1,4]] **输出:**0 **解释:** 没有胜利玩家。 **示例 3:** **输入:**n = 5, pick = [[1,1],[2,4],[2,4],[2,4]] **输出:**1 **解释:** 玩家 2 是胜利玩家,因为玩家 2 获得了 3 个颜色为 4 的球。 **提示:** - `2 <= n <= 10` - `1 <= pick.length <= 100` - `pick[i].length == 2` - `0 <= xi <= n - 1 ` - `0 <= yi <= 10` --- 刚上来的时候觉得可能是要用哈希表,还顺带复习了一下哈希表的相关知识: ```java // Creating a HashMap HashMap map = new HashMap<>(); // Adding elements map.put(key, value); // Getting values ValueType value = map.get(key); // Removing elements map.remove(key); // Checking if key exists boolean exists = map.containsKey(key); ``` 实际上,从哈希表的角度来想,太复杂了,针对每一个玩家都要进行一遍哈希表的对比,时间复杂度上、空间复杂度上来说,都太高了。 不得已看了题解,题解巧妙的地方在于把任务拆解了,因为提示里提到颜色的范围是大于0小于10的,所以至多有11个颜色,如果创建一个二维数组,每一行代表每一个用户,每一列代表每一个颜色,然后遍历pick数组,他的每一个数值出现时,在二维数组上对应坐标加一。 最后问题会变成一个简单的二维数组遍历问题。 ```java class Solution { public int winningPlayerCount(int n, int[][] pick) { int cnt[][] = new int[n][11]; for (int[] p : pick) { cnt[p[0]][p[1]]++; } int ans = 0; for (int i = 0; i < n; i++) { for (int j = 0; j < 11; j++) { if (cnt[i][j] > i) { ans++; break; } } } return ans; } } ``` --- 这里带上官方的题解: 首先我们需要统计每个玩家得到的每种颜色的球的数目,此时需要遍历 数组 pick。由于颜色 y 的取值范围为 [0,10],此时我们用一个 n×11 的二维数组统计每个玩家得到的每种颜色的球的数目。然后我们从 0 到 n−1 依次遍历每个玩家,如果d当前第 i 个玩家至少有一种颜色的球大于玩家编号 i,则胜利玩家数目加 1,返回总的胜利玩家数目即可。
兰空图床搭建 作者: zorth 时间: 2024-11-23 分类: 默认分类 评论 ![](https://zorth-1305096201.cos.ap-guangzhou.myqcloud.com/undefined20241123200945.png) 列出php的dnf源 [root@iZuf61llk9btoze85qtbmzZ ~]# dnf list php CentOS Stream 9 - BaseOS 34 MB/s | 8.3 MB 00:00 CentOS Stream 9 - AppStream 53 MB/s | 21 MB 00:00 CentOS Stream 9 - Extras packages 426 kB/s | 19 kB 00:00 Available Packages php.x86_64 8.0.30-1.el9 appstream [root@iZuf61llk9btoze85qtbmzZ ~]# 非常好,8.0.30,可以直接用了 [root@iZuf61llk9btoze85qtbmzZ ~]# dnf install php [root@iZuf61llk9btoze85qtbmzZ ~]# php -v PHP 8.0.30 (cli) (built: Aug 3 2023 17:13:08) ( NTS gcc x86_64 ) Copyright (c) The PHP Group Zend Engine v4.0.30, Copyright (c) Zend Technologies with Zend OPcache v8.0.30, Copyright (c), by Zend Technologies 下面开始安装nginx,安装好之后记得启动nginx [root@iZuf61llk9btoze85qtbmzZ ~]# dnf install nginx [root@iZuf61llk9btoze85qtbmzZ ~]# nginx -v nginx version: nginx/1.20.1 [root@iZuf61llk9btoze85qtbmzZ ~]# ps aux | grep nginx root 4721 0.0 0.1 6408 2304 pts/0 S+ 13:09 0:00 grep --color=auto nginx [root@iZuf61llk9btoze85qtbmzZ ~]# systemctl start nginx [root@iZuf61llk9btoze85qtbmzZ ~]# ps aux | grep nginx root 4728 0.0 0.0 11236 1632 ? Ss 13:09 0:00 nginx: master process /usr/sbin/nginx nginx 4729 0.0 0.2 15564 5216 ? S 13:09 0:00 nginx: worker process nginx 4730 0.0 0.3 15564 5344 ? S 13:09 0:00 nginx: worker process root 4737 0.0 0.1 6408 2304 pts/0 S+ 13:09 0:00 grep --color=auto nginx 启动nginx之后,可以直接访问网站了: ![image.png](https://note.youdao.com/yws/res/1/WEBRESOURCE6d4677ad43d90956d1293cd90c31c061) 进入nginx路径,开始配置https,操作配置文件之前记得备份 [root@iZuf61llk9btoze85qtbmzZ nginx]# cd /etc/nginx/ [root@iZuf61llk9btoze85qtbmzZ nginx]# cp nginx.conf nginx.conf.bak [root@iZuf61llk9btoze85qtbmzZ nginx]# 在此之前先去配置一下域名的dns,把我的域名和ip绑定好。 ![image.png](https://note.youdao.com/yws/res/0/WEBRESOURCE5587d5d43464a152cc7062301d19a350) 这里有一个很关键的地方,使用cf作为dns服务器的时候,还需要设置一下SSL的强制HTTPS ![image.png](https://note.youdao.com/yws/res/4/WEBRESOURCE38317958c014c0328d0b7cf55d256514) 现在开始配置nginx的配置文件: # HTTP服务器(重定向到HTTPS) server { listen 80; listen [::]:80; server_name zorth.top; # 替换为你的域名 # 将所有HTTP请求重定向到HTTPS return 301 https://$server_name$request_uri; } # HTTPS服务器 server { listen 443 ssl; listen [::]:443 ssl; server_name zorth.top; # 替换为你的域名 # SSL配置 ssl_certificate /path/to/your/certificate.crt; # 替换为你的证书路径 ssl_certificate_key /path/to/your/private.key; # 替换为你的私钥路径 # SSL安全配置 ssl_protocols TLSv1.2 TLSv1.3; ssl_ciphers ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:DHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES256-GCM-SHA384; ssl_prefer_server_ciphers off; # 网站根目录 root /usr/share/nginx/html; # 替换为你的网站目录 index index.php index.html index.htm; location / { try_files $uri $uri/ /index.php?$query_string; } # PHP配置 location ~ \.php$ { fastcgi_pass unix:/var/run/php-fpm/php-fpm.sock; # 如果使用TCP,改为 127.0.0.1:9000 fastcgi_index index.php; fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name; include fastcgi_params; } # 禁止访问 .htaccess 文件 location ~ /\.ht { deny all; } } 修改完配置之后,记得验证一下配置: [root@iZuf61llk9btoze85qtbmzZ nginx]# nginx -t nginx: [emerg] cannot load certificate "/path/to/your/certificate.crt": BIO_new_file() failed (SSL: error:80000002:system library::No such file or directory:calling fopen(/path/to/your/certificate.crt, r) error:10000080:BIO routines::no such file) nginx: configuration file /etc/nginx/nginx.conf test failed [root@iZuf61llk9btoze85qtbmzZ nginx]# nginx -t nginx: the configuration file /etc/nginx/nginx.conf syntax is ok nginx: configuration file /etc/nginx/nginx.conf test is successful [root@iZuf61llk9btoze85qtbmzZ nginx]# systemctl restart nginx 再次访问刚才的域名时,会直接重定向到https了 ![image.png](https://note.youdao.com/yws/res/3/WEBRESOURCEfff93410ce04d94d96b5b1d1d3a0a4c3) ![image.png](https://note.youdao.com/yws/res/f/WEBRESOURCE1903c4a491d17ffe03b11bad66289b4f) nginx配置完毕了,开始安装图床 [root@iZuf61llk9btoze85qtbmzZ nginx]# cd /usr/share/nginx/html/ [root@iZuf61llk9btoze85qtbmzZ html]# ll total 22356 -rw-r--r-- 1 root root 3971 Jul 16 07:21 404.html -rw-r--r-- 1 root root 4020 Jul 16 07:21 50x.html drwxr-xr-x 2 root root 27 Nov 23 13:08 icons lrwxrwxrwx 1 root root 25 Jul 16 07:22 index.html -> ../../testpage/index.html -rw-r--r-- 1 root root 22876343 Nov 23 13:32 lsky-pro-2.1.zip -rw-r--r-- 1 root root 368 Jul 16 07:21 nginx-logo.png lrwxrwxrwx 1 root root 14 Jul 16 07:22 poweredby.png -> nginx-logo.png lrwxrwxrwx 1 root root 37 Jul 16 07:22 system_noindex_logo.png -> ../../pixmaps/system-noindex-logo.png [root@iZuf61llk9btoze85qtbmzZ html]# 上传安装包之后,解压安装包。![image.png](https://note.youdao.com/yws/res/6/WEBRESOURCEf98d22b0e002a18e1c58de03ef076436) 我这里在root路径下解压了,然后将配置指向了public路径。
HTTP到HTTPS 作者: zorth 时间: 2024-11-20 分类: 默认分类 评论 # HTTP 与 HTTPS:有什么区别 HTTPS 是支持加密和验证的 HTTP。两种协议的唯一区别是HTTPS 使用 TLS (SSL) 来加密普通的 HTTP 请求和响应,并对这些请求和响应进行数字签名。因此,HTTPS 比 HTTP 安全得多。使用 HTTP 的网站的 URL 中带有 `http://`,而使用 HTTPS 的网站则带有 `https://`。 ![1732255490180.png](https://47.116.196.61/i/2024/11/22/67401f0495d7b.png) # 什么是 HTTP HTTP 代表超文本传输协议,它是一种用于通过网络传输数据的协议,或是一种表示信息的规范顺序和语法。通过互联网发送的大多数信息(包括网站内容和 API 调用)都使用 HTTP 协议。HTTP 消息主要有两种:请求和响应。 简单来说,HTTP 请求是遵循 HTTP 协议的一系列文本行。GET 请求可能如下所示: ```json GET /hello.txt HTTP/1.1 User-Agent: curl/7.63.0 libcurl/7.63.0 OpenSSL/1.1.l zlib/1.2.11 Host: www.example.com Accept-Language: en ``` 用户浏览器生成的这部分文本将通过 Internet 发送。而问题在于,它是明文形式发送的,监视连接的任何人都能读取它。(不熟悉 HTTP 协议的人可能觉得此文本难以理解,但任何对协议的命令和语法有基本了解的人都能轻松读懂。) 当用户通过网站或 Web 应用程序提交敏感数据时,这尤其是一个问题。敏感数据可能是密码、信用卡号,或在表单中输入的任何其他数据。而且在 HTTP 中,所有这些数据都以明文形式发送,任何人都能读取。(当用户提交表单时,浏览器会将其转换为 HTTP POST 请求,而不是 HTTP GET请求。) 源站服务器收到 HTTP 请求时,将发送 HTTP 响应,其类似于: ```json HTTP/1.1 200 OK Date: Wed, 30 Jan 2019 12:14:39 GMT Server: Apache Last-Modified: Mon, 28 Jan 2019 11:17:01 GMT Accept-Ranges: bytes Content-Length: 12 Vary: Accept-Encoding Content-Type: text/plain Hello World! ``` 如果网站使用 HTTP 而非 HTTPS,则监视会话的任何人都可以读取所有请求和响应。本质上,恶意行为者可以只读取请求或响应中的文本,就能知道某人正在索取、发送或接收的确切信息。 # 什么是 HTTPS HTTPS 中的 S 代表“安全”。HTTPS 使用 TLS(或 SSL)来加密HTTP 请求和响应,因此在上例中,攻击者看到的不是其文本,而是一堆看似随机的字符。 攻击者不会看到: ```json GET /hello.txt HTTP/1.1 User-Agent: curl/7.63.0 libcurl/7.63.0 OpenSSL/1.1.l zlib/1.2.11 Host: www.example.com Accept-Language: en ``` 而会看到类似如下: ```json t8Fw6T8UV81pQfyhDkhebbz7+oiwldr1j2gHBB3L3RFTRsQCpaSnSBZ78Vme+DpDVJPvZdZUZHpzbbcqmSW1+3xXGsERHg9YDmpYk0VVDiRvw1H5miNieJeJ/FNUjgH0BmVRWII6+T4MnDwmCMZUI/orxP3HGwYCSIvyzS3MpmmSe4iaWKCOHQ== ``` # 在 HTTPS 中,TLS/SSL 如何加密 HTTP 请求和响应 TLS 使用一种称为公钥加密的技术:密钥有两个,即公钥和私钥,其中公钥通过服务器的 SSL 证书与客户端设备共享。当客户端打开与服务器的连接时,这两个设备使用公钥和私钥商定新的密钥(称为会话密钥),以加密它们之间的后续通信。 然后,所有 HTTP 请求和响应都使用这些会话密钥进行加密),使任何截获通信的人都只能看到随机字符串,而不是明文。 有关加密和密钥的工作原理的更多信息,请参阅什么是加密? # HTTPS 如何帮助验证 Web 服务器身份 身份验证是指核实一个人或一台计算机是否是声称的身份。HTTP 中没有身份验证,它基于信任原则。HTTP 的架构师不一定是做出了隐式信任所有 Web 服务器的决定;他们当时除了安全以外还有其他优先事务。但在现代 Internet 上,身份验证是不可或缺的。 就像身份证件能确认一个人的身份一样,私钥可以确认服务器的身份。当客户端打开与源站服务器的连接通道时(例如,当用户导航到网站时),拥有与网站 SSL 证书中公钥匹配的私钥可证明此服务器确实是该网站的合法主机。这可以防止或帮助阻止在没有身份验证时可能发生的多种攻击. 此外,SSL 证书由签发它的证书颁发机构进行数字签名。这可以确认服务器就是它声称的身份。 # 举例 为了更鲜明得展示两者的区别,我们使用抓包工具Wireshark,分别抓取http请求和https请求。 ![http请求.png](https://47.116.196.61/i/2024/11/22/67401e4446047.png) ![https请求.png](https://47.116.196.61/i/2024/11/22/67401e84dd082.png) 我们可以看到,当使用http请求时,我们可以在Wireshark面板看到请求体中的明文信息,当我们使用https请求时,所有的请求体都是加密的。 ![微信图片_20240421104020.jpg](https://47.116.196.61/i/2024/11/20/673d66e182758.jpg) 这两天折腾了图床、博客还有学了会日语。我觉得这种状态挺好的,折腾图床的过程中学习了使用https提供加密的服务,原来可以通过修改nginx的配置来重定向http请求到https。 ```json # HTTP服务器配置(重定向到HTTPS) server { listen 80; server_name your_domain.com; # 替换成你的域名 # 将所有HTTP请求重定向到HTTPS return 301 https://$server_name$request_uri; } # HTTPS服务器配置 server { listen 443 ssl; server_name your_domain.com; # 替换成你的域名 # SSL证书配置 ssl_certificate /path/to/your/certificate.crt; # 替换成你的证书路径 ssl_certificate_key /path/to/your/private.key; # 替换成你的私钥路径 # SSL配置优化 ssl_protocols TLSv1.2 TLSv1.3; ssl_ciphers ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:DHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES256-GCM-SHA384; ssl_prefer_server_ciphers off; # SSL会话缓存 ssl_session_cache shared:SSL:10m; ssl_session_timeout 10m; # HSTS配置(可选) add_header Strict-Transport-Security "max-age=31536000" always; # 网站根目录配置 root /usr/share/nginx/html; index index.html index.htm; location / { try_files $uri $uri/ =404; } } ``` 这个是基础的使用示例,其实部署别人的服务的话,以php为例,还需要做一些处理,对于PHP服务,我们需要在Nginx配置中添加PHP-FPM的相关配置。以下是一个完整的包含PHP支持的HTTPS配置: ```json # HTTP服务器配置(重定向到HTTPS) server { listen 80; server_name your_domain.com; return 301 https://$server_name$request_uri; } # HTTPS服务器配置 server { listen 443 ssl; server_name your_domain.com; # SSL证书配置 ssl_certificate /path/to/your/certificate.crt; ssl_certificate_key /path/to/your/private.key; # SSL配置优化 ssl_protocols TLSv1.2 TLSv1.3; ssl_ciphers ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:DHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES256-GCM-SHA384; ssl_prefer_server_ciphers off; ssl_session_cache shared:SSL:10m; ssl_session_timeout 10m; # HSTS配置(可选) add_header Strict-Transport-Security "max-age=31536000" always; # 网站根目录 root /var/www/html; # 修改为你的网站目录 index index.php index.html index.htm; # PHP文件处理 location ~ \.php$ { try_files $uri =404; fastcgi_split_path_info ^(.+\.php)(/.+)$; fastcgi_pass unix:/var/run/php-fpm/php-fpm.sock; # PHP-FPM socket路径 # 或者使用TCP方式: # fastcgi_pass 127.0.0.1:9000; fastcgi_index index.php; fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name; include fastcgi_params; # 安全相关头部 fastcgi_param HTTPS on; } # 隐藏文件访问限制 location ~ /\. { deny all; } # 静态文件缓存设置 location ~* \.(jpg|jpeg|gif|png|css|js|ico|xml)$ { expires 30d; add_header Cache-Control "public, no-transform"; } # 主目录配置 location / { try_files $uri $uri/ /index.php?$query_string; # 支持PHP框架的URL重写 } } ``` 这里还需要确保php-fpm正在运行 ```json # 安装PHP-FPM(以Ubuntu为例) apt-get install php-fpm # CentOS/RHEL系统: yum install php-fpm # 启动PHP-FPM服务 systemctl start php-fpm systemctl enable php-fpm ``` 检查PHP-FPM配置文件(通常在 /etc/php-fpm.d/www.conf 或 /etc/php/7.x/fpm/pool.d/www.conf): ```json ; 确保用户和组设置正确 user = nginx group = nginx ; 如果使用Unix socket listen = /var/run/php-fpm/php-fpm.sock listen.owner = nginx listen.group = nginx listen.mode = 0660 ; 如果使用TCP ; listen = 127.0.0.1:9000 ``` 设置正确的文件权限: ```json # 设置网站目录权限 chown -R nginx:nginx /var/www/html chmod -R 755 /var/www/html ``` 注意:PHP-FPM错误日志(通常在 /var/log/php-fpm/error.log) --- ```json location ~ \.php$ { # ~ \.php$ 是一个正则表达式,匹配所有以.php结尾的文件 # location 块定义了对PHP文件的处理规则 try_files $uri =404; # 检查PHP文件是否存在,如果不存在则返回404错误 # 这是一个安全措施,防止执行不存在的PHP文件 fastcgi_split_path_info ^(.+\.php)(/.+)$; # 分割URL中的路径信息 # 例如:/script.php/extra/info 会被分割成: # $fastcgi_script_name: /script.php # $fastcgi_path_info: /extra/info fastcgi_pass unix:/var/run/php-fpm/php-fpm.sock; # 指定如何连接到PHP-FPM处理程序 # 这里使用Unix socket方式(更快,推荐在同一服务器上使用) # fastcgi_pass 127.0.0.1:9000; # 另一种连接方式是TCP(如果PHP-FPM在不同服务器上,就用这个) fastcgi_index index.php; # 设置默认的PHP文件名 # 当访问目录时,默认寻找index.php fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name; # 设置PHP脚本的实际文件路径 # $document_root 是网站根目录 # $fastcgi_script_name 是PHP文件名 # 例如:/var/www/html/index.php include fastcgi_params; # 包含Nginx预定义的FastCGI参数 # 这个文件通常在 /etc/nginx/fastcgi_params # 包含了许多必要的环境变量 fastcgi_param HTTPS on; # 告诉PHP脚本当前是HTTPS连接 # 这样PHP可以正确识别安全连接 } ``` 这里有一些实际的例子: 当访问 https://your-site.com/index.php 时: - Nginx 匹配到这是一个 .php 文件 - 检查文件是否存在(try_files) - 如果存在,通过 socket 或 TCP 传递给 PHP-FPM 处理 - PHP-FPM 执行这个文件并返回结果给 Nginx - Nginx 再将结果发送给用户 部署时的问题排查: ```json # 1. 检查PHP-FPM是否运行 systemctl status php-fpm # 2. 检查socket文件是否存在 ls -l /var/run/php-fpm/php-fpm.sock # 3. 检查日志文件权限 ls -l /var/log/php-fpm/error.log # 4. 测试PHP文件权限 ls -l /var/www/html/index.php ```
写作的意义 作者: zorth 时间: 2024-11-18 分类: 默认分类 1 条评论 2021年初,我偶然读到一篇文章,深深触动了我的内心: > 写作的意义是什么?也许写与不写,几年后的我都不会有太大差别。但我仍希望能为未来留下一些痕迹,记录下当时的心态与想法,见证自己的成长轨迹。 > > 正如CSDN上说的,唯有持续写作,才不至于在茫茫人海中被淹没。在这个短视频喧嚣的时代,我们的思考时间正在一点点被剥夺,而文字却像一束微光。诚然,短视频领域机会众多,但目前更多偏向娱乐化、大众化,尽管不乏优秀的创作者值得肯定。 > > 写作是孤独的。你不知道能否给他人带来价值,或许只能带来一点微小的帮助,激起一丝共鸣,但这便足够了。即便是自言自语,也要学会坦然面对真实的自己。对我而言,写作的真谛在于认识真实的自我。 > > 学习本身就是反人性的。简单记忆答案的思维方式一旦形成,我们可能会失去最宝贵的好奇心和热情。失去这两样,人就容易变得浮躁,难以静心探索。这不仅适用于技术领域,也适用于生活的方方面面。 > > 我们要常常问自己:为什么?为什么要这样而不是那样?为什么要如此设计?这种追根究底的好奇心会让人变得谦逊,因为知识越多,越发现自己的无知。有趣的是,计算机的问题追溯到底,往往都会回归到人性的复杂性,演变成哲学思考。带着这样的好奇心去写作、去生活,是了解世界的一种独特方式。 > > 作为程序员,我们的生活不应该只有技术。技术固然重要,是我们的职业和饭碗,但它只是生活的一部分。如果我们只专注于技术,难免会变得狭隘。 > > 我们需要时常抬头,欣赏树上的鸟儿,路边的花朵;翻阅全球通史,感受中华五千年文明;观看《国家宝藏》《典籍里的中国》《守护解放西》等纪录片。技术是服务于人类的工具,而不是束缚我们的枷锁。要做一个内心丰富的人,如同心中常怀一轮明月。 四年光阴飞逝,今天重读这篇文章,我想把它作为博客的开篇之作。回首往事,我曾认为写作就是整理过往、总结知识,于是从2021年初开始,我执着地收集和记录各类技术文章。 然而,AI的崛起成为了一个转折点。大语言模型的出现似乎让过去的笔记变得无足轻重——任何想知道的信息,无需翻阅笔记,只消在对话框输入几行文字,答案便唾手可得。 曾经为了抵御浮躁,我清除了所有短视频应用,强迫自己阅读长文,观看深度内容。讽刺的是,ChatGPT的便利反而让我陷入了另一种浮躁。 诚然,ChatGPT带来了前所未有的便利:不懂代码也能实现功能,甚至连需求都可以交给AI来梳理。但在这个过程中,我意识到自己虽然达成了目标,却只学会了如何与AI对话,而真正的学习过程被跳过了。 最近,推特上盛行的Cursor让我感受到了强烈的焦虑——几分钟或几小时就能完成一个项目,这种效率确实令人震撼。但当我亲身体验后发现,在AI的协助下,那些本应在解决问题过程中获得的知识和领悟,都被轻易跳过了。到头来,我的收获寥寥。 重建这个博客,是希望能让自己慢下来,用心感受生活,摆脱浮躁,静心积累。在这个快节奏的时代,也许慢才是我们最需要的生活态度。