最近

最近挺浮躁的,总静不下心来做事情,只有暑天带来的燥热和无尽的困,所以我觉得暂时停下来,想一想。

寒假,Deepseek发布并被大家熟知。我很想抓住这个机会,去做做AI应用。先做什么呢?我刻意地在生活中寻找灵感,甚至直接询问Deepseek如何落地的机会。那时我第一次知道技术可以出海,可以试试写程序去获得被动收入。不知道大家有没有想过,有些想法你觉得很新奇,可以尝试,但还是在头脑之中被自我否定。一个从理性来说有可能做成的事情会因为你的生活环境,从小到大的处事习惯(当个乖乖仔),以及现在的眼界而被想得很复杂。所以我迟迟没有走出第一步。

其实也不只是出海,还有很多事情在我脑子里打转,我预想的是:做出一个简单的,可以满足大家需求的AI产品,然后完善它,再利用这一版打出去,做成应用/小程序,看能不能成。如果中途反馈是伪需求,那我就丢掉它,重新发现idea。

问题是什么嘞,我容易陷入完美主义,然后什么都不敢尝试。

  • 1.与商业挂钩,如何推广,引流,获利?
  • 2.技术什么时候登场?
  • 3.如何结合人人都能用的AI,做出独特的优势?

以上三点是我对于最近思考问题的概况。
比如第一点,如果小demo真的找到需求了,如何引流能不被抄袭,需不需要离程序员远点,但我没有用户基础社群。第二点,我必须说服自己不知道从哪来的,没啥技术却一身的技术洁癖。我总觉得花很短的时间实现一个并不难的应用,很像在糊弄用户。但实际上小功能就是用不上那么多技术,而且技术是来解决问题的,不是装逼。所以我终于有点说服自己了,需求导向,用户导向,再好的技术也要服务于需求。不过第三点就来了,做AI应用,用的是大家都能用的AI工具,凭什么要专门用我的,甚至为此付费。我只有一个idea的前提下,是没有护城河的。所以我得研究,用户为什么喜欢,AI模型能不能自定义改进,数据怎么利用?以上几点说得越深,就越容易在脑子产生摩擦,把热情都磨没了。

偶然间看到了一些老词,给了我一些想法。
第一个是“产学研”,本来指的是产业、学校、科研机构的协调运转,却意外囊括了这三个问题。需求是一切技术的来源,本质上技术是为了产业提供服务。而现有技术受限的时候,就必须创新,做研究。寒假做了个兼职,整体工作流大概是:研究->应用->投产。我做的只是“应用”中的活,不是很难,没有很多创造性。当然收入链也是其中最低的。因此我在想,既然我大概率只读四年本科,现在不妨先从应用端入手,顺便能边做边学很多技术,以后也不怕失业。做的是AI应用,那么研究层就交给AI,毕竟AI的上限很高,如果我能用到80%,这就是属于我的护城河。难的反而是商业,我可能需要抽时间多参加社群,多发布博客,甚至利用自媒体,我还没想好。
第二个是“T型人才”。有没有可能,计算机的知识是学不完的。所以我并不需要面面俱到,也不需要做到事事亲为。有了AI,能用好为什么要排斥呢?我只需要掌握基本框架,需要我专业的时候专业,能够懂底层懂原理,比AI强一些。不需要我的时候,我把蓝图画好,让AI实现。所以我只用了解常用领域的关键20%,和我擅长部分的80%就够了。这么拆来,好像一切都欣欣向荣。开干吧!!!

如何写最基础的CRUD

本文基于Java,SpringMVC框架。MVC即Model+View+Controller。即使不太确切,我喜欢将其理解为:浏览器与数据库建立联系的方式。(Browser是浏览器,DB是数据库)

Controller 层

  • 掰收序列化信息(JSON)
  • 通过注解进行转换
  • @RequestParam(可默认不写)
    @DeleteMapping
    @ApiOperation("删除分类")
    public Result<String> deleteById(Long id){}
    查询字符串传递id参数:/admin/category?id=1
  • @PathVariable:
    @DeleteMapping("/{id}")//嵌入点
    @ApiOperation("删除分类")
    public Result<String> deleteById(@PathVariable Long id){}
    仅在URL后嵌入参数:/admin/category/1
  • @RequestBody:反序列化为实体类
    @PostMapping
    @ApiOperation("新增分类")
    public Result<String> addCategory(@RequestBody Category category) { // 业务逻辑 }

Service 层

一般来说,Service看有没有接口,有的话直接看Impl实现类会比较具体。

  • 新增(Insert): 需要将业务中的对象封装为程序中的完整实体类,再对应添加完整实体类中应该添加但业务对象缺失的部分(通过拷贝+set方法),好处是可以通过一次Mapper层编写实现不同新增对象的数据操作。(数据完整性/业务隔离/易维护) 说人话:把不健全的变得健全,这样方便数据操作时只用处理健全的一种情况。
  • 删除(Delete): 检查删除业务是否影响其余业务(调用其他Mapper),再进行删除处理
  • 更新(Update): 处理逻辑上与新增相同,封装+填充;但Mapper层有所不同,一般通过if判断需要更新哪些条件(实际上思想也是一致的,将所有情况假设好再使用if与where排除,只需写一次)
  • 查询(Select): Select的业务逻辑并不难,明确好输入参数,以及输出的是参数/对象/列表即可。

Mapper 层

  • 新增:
  Insert into 表名(字段名1,字段名2......) VALUES (#{对应对应参数1},#{对应对应参数2}...)
  • 删除
  Delete from 表名 where id = #{id}

注:若是删除某个属性,其实是通过update的更新逻辑去实现的

  • 更新
  Update 表名 
  SET column_name1 = new_value1,
      column_name2 = new_value2
  WHERE condition;

大部分会在xml进行操作,更加解耦与易管理,因为只需写一次

  • 查询
  Select * from 表名

一般是在xml中操作,需要明确parameterType和resultType会好一些。

琐碎的事情很多

好像时间越来越不够用了,技术门槛正在降低,但如何专注下来高效地做一件事已经变难了。课程、制度、欲望等等都在束缚着人们,很难挣脱。我一边做着这个,一边又不得不想着那个。《Head First》系列丛书的学习扉页中总会有个例子,关于一边学习,一边还要提防着是否有一个老虎会来靠近你(我觉得是暗示人类本能下的潜意识)。这种情况压根踏实不了。所以,有舍才有得吧,尽量不乱点技能树,不要做太多既要又要的选择。

Serializable 序列化[基于java]

前言:最近接触的技术慢慢增多,也写了一些方便的技术文档。苦于排版不够系统,干脆对Deepseek提了一些要求,让它重塑我写的这些文档。效果还不错,也拓展了一些还不够了解的知识。因此之后的技术分享很可能以这种形式出现,我自己读着还不错,请多提提意见!

这是我向Deepseek提问的模版:

  • 第一:不说废话,直抒胸臆;
  • 第二:能够给快速上手的人们快速开始的机会,比如多给命令行,支持复制粘贴;
  • 第三:有深度,能够结合实战开发,最好多一些实例;
  • 最后:如果能够引发人们思考更好。

0x00 基础知识(2分钟)

一句话理解:序列化就像把乐高玩具打包成盒子,反序列化就是拆开盒子恢复原样

  • 序列化->具体(对象->数据) 序列化用于将抽象数据转化为网络传输/存储形式(JSON/XML/二进制)
  • 反序列化->抽象(数据->对象) 反序列化主要是将数据抽象,便于业务逻辑处理

传播路径:[数据库] → 反序列化 → [程序处理(业务逻辑)] → 序列化 → [网络传输]

0x01 快速使用(5分钟)

 import java.io.*;
 ​
 // 第一步:实现Serializable接口(空接口)
 class User implements Serializable {  // [!code focus]
 // 第二步:添加版本号
     private static final long serialVersionUID = 1L;  // [!code focus]
     
     private String name;
     private transient String password; // transient不参与序列化
 }
 ​
 // 第三步:序列化对象
 try (ObjectOutputStream out = new ObjectOutputStream(
         new FileOutputStream("user.data"))) {  // [!code focus]
     out.writeObject(new User("张三", "123456"));
 }
 ​
 // 第四步:反序列化
 try (ObjectInputStream in = new ObjectInputStream(
         new FileInputStream("user.data"))) {
     User user = (User) in.readObject();  // [!code focus]
     System.out.println(user.getName()); // 输出"张三"
     System.out.println(user.getPassword()); // 输出null(因为transient)
 }

0x02 核心记忆点

✔️ 建议做

• 给每个类添加serialVersionUID (IDE可自动生成:Alt+Enter → Add serialVersionUID) • 敏感字段用transient修饰

❌ 不要做

• 序列化大对象(超过1MB要考虑其他方案) • 修改已序列化类的字段类型(会报错!)

💡 场景联想

 [数据库] → 反序列化 → [程序处理] → 序列化 → [网络传输]

0x03 常见问题

  1. 检查serialVersionUID是否一致
  2. 确认字段类型没有修改
  3. 删除旧的序列化文件重新生成

症状:反序列化后数据不对

• 检查是否有字段漏加transient • 验证序列化/反序列化代码顺序一致

0x04 新手实验室

实验1:修改serialVersionUID

 - private static final long serialVersionUID = 1L;
 + private static final long serialVersionUID = 2L;

观察反序列化时的报错信息

实验2:移除transient

 - private transient String password;
 + private String password;

查看反序列化后的密码值

0x05 未来升级入口(我将后续补充)

进阶预备区

• 高性能方案 → Protobuf • 安全方案 → 白名单校验 • 分布式方案 → 版本兼容策略

当前进度:🟢 基础掌握(可进行项目开发)

过年到春分期间,看到了很多科技创新的故事。我开始思考我的价值观,我所处的环境,我的能力,可以做成什么样的事。我看到过去90年代马云推崇自己思想时的不顾一切,看到《硅谷之火》中科技工作者开发产品时的废寝忘食,看到Deepseek的自我介绍中写着“不做中庸的事,带着好奇心,用最长期的眼光去回答最大的问题”。再想想自己一直不走出去,沉迷在所谓的学习中,没有压力,没有饥饿感,顶多是三天打鱼两天晒网。时候已经不晚了,码头上停着船。接下来要做的,不是刻意地把java,web等等技术做成学习计划,而是大胆出去,在真实的实践中不断解决问题,不断丰富技术。我会洗干净头发爬上桅杆,撑起这艘小船的。

如何快速上手宝塔面板?

近期配了台服务器,但还没有系统尝试过Linux系统中的复杂部署,更不懂得运维,甚至连远程SSH连接都极少使用。本文将会以快速上手为目的,使用宝塔面板完成第一次服务器部署。

注意:安装宝塔面板前请确保服务器是全新的!此处服务器页面演示以阿里云为例,其余厂商名词基本相同,照着提示词做即可,无需追求页面一致。

  • 1.在云服务器厂商中获取服务器的公网IP(不用关闭网页,后面还会用到)
  • 2.修改服务器的密码,为自己所知
  • 3.打开云服务器页面,在左侧边栏找到安全组并点击进入(不用关闭网页,后面还会用到)
  • 4.打开宝塔网址,根据自己的系统(Linux/Windows)选择对应产品
  • 5.选择对应产品后,可能会被指引到此处
  • 6.不用急着操作,我们选择更加快捷的在线安装。你只需要继续往下滑动鼠标,就会看到:
  • 7.接下来,回到第一步的网站,把公网IP复制粘贴进来在线安装界面,并使用自己第二步设置好的密码。做到这里,请不要点击立即安装
  • 8.回到第三步的网站,点击管理规则
  • 9.开放两个端口:
    22–用于SSH连接
    8888–用于宝塔面板
    详细操作:
    在目的后填写端口号:22,源选择所有IPV4,然后保存。
    同样步骤,在目的后填写端口号8888端口,源选择所有IPV4,保存。
  • 10.回到第七步,可以点击立即安装。若需要注册宝塔账号则跟着注册即可。
  • 11.服务器端已经下载了宝塔面板,你可以通过[IP地址]:[端口号(一般就是8888)]进行访问,比如192.168.0.1:8888
    现在你已成功安装宝塔面板!

世界,你好

大一,第一次敲下‘printf(“Hello,world!”);’的时候,有点不屑,以为做程序几乎不会用到如此的语句。而当我终于开通了个人小站,正襟危坐在电脑前编辑第一篇博客,却想不出更好的语句来代表此刻。互联网下,众生平等。实际上现在已经很少因为程序成功运行而感到如释重负或是欣喜若狂了,但越细想着文字、图片、音频、视频通过层层封装,封装成一个“发布”按钮被点击后,即能够全球可见,不禁向互联网致敬。

创立本站的原因很多,一是可以记录,二是能够分享,三是养成习惯。学习计算机的这一年半里,体会到一套普世的逻辑:输入->处理->输出。有时候输入很盲目,很沉迷,往往一头扎进去,结果是几天没用就忘了。知识跑不出全流程的话,只能在多次的失去、重拾中成为经验,很花时间。为了知识能够输出,我想在多使用的基础上,再多记录。曾经在网站上写一些很粗糙的技术帖,虽然能帮助到小部分急需快速上手的朋友,但总无法坚持。写在本地的也很多:日记、念头、计划,又没有公开的必要。如今在互联网上有了自己的域名,也算是有了个租了五年的电子小家,自然不能随意糟蹋,希望能够恢复往日的输出。

建站的计划从去年就在想,本想着自己搭一个前后端,可惜学习不够认真,技术落后于需求。这也是我要改进的地方:做事情要专心,不要因为不在“主线任务”里就敷衍了事。也许在以后这个计划会被实现,现在让我们用WordPress。这个系统支持读者发评论,搜索文章,欢迎每一个访客的留言。当前的网站结构延续着我去年的计划:技术/念头/行迹/灯塔。

  • 技术:写写每日的所做所学,专业知识涉及得比较多,我会尽可能写得浅显易懂,这不仅是分享给有缘的每一位访客,也是在写给遗忘后的自己。
  • 念头:我的想法,浮在空中,或许落地
  • 行迹:去过的一些地方,有点像游记。听说年轻时去过的地方,会一直让回忆价值复利。
  • 灯塔:曾指引我或一直指引我的东西。歌、书、电影、网站、等等。权当分享。

我喜欢找一个特别的节点来开始做一个长期的事情。今天是周一,因此xkai.site开始了。

世界,你好