我的博客又又重构了

博客改版历史

细数一下,这已经是我的博客第三次改版了。最开始博客是直接搭在 wordpress 上的,可能是默认主题也可能是别的什么,总之有了一个小小的博客。初衷就是想发文但不敢在知乎等平台发,由于一种奇怪的胆怯搭了自己的博客。清晰地记得当时我找了二三十条哲学名言,还找了哲学家的图片,写了一个在侧边栏随机展示哲学名言+图片的小组件,当时看起来还是很有个性的。

Git 常见问题及解决方案

本地领先远程一个 commit 的同时落后一个 commit

一般发生于本地写完准备 push 时发现有人已经 push 了一个 commit,这时直接 pull 会报错。

标准做法:假设当前分支为 master,先执行 git fetch 同步本地的 origin/master 分支,之后执行 git rebase origin/master 将本地 master 上领先的 commit 添加到远程分支(origin/master)的末尾,之后就可以正常 push。

蚂蚁体验技术部朝扬计划面试经历

一面

一面面了一个小时左右,感觉什么都不会🤯。面试官是支付宝前端做支付宝小程序编译的,所以挑了我简历上的编译原理和 c++ 问了很多问题,但是我真的不会😫,所以一开始很多问题都没回答上来,随便扯了一点。后来也问到了一些堆相关的问题,我也没回答上来😥,这时候我感觉快蚌埠住了。到最后问了一点 webpack 上的问题我才回答得多了点。总体感觉面完就寄了,非常崩溃,之前准备的面试题一个也没用上🥲。还好后来不清楚怎么回事(可能是被捞了,感谢),我又被二面面试官叫去做题,才感觉还有一丝希望。

使用 Webpack5 从零架一个 React+TS 项目(二)

css & less 配置

书接上文,我们已经完成了 tsx 的基本配置,可以直接写 tsx 了。但问题来了,我们编写网页不可能只写 html 和 js 吧,还需要 css 文件,所以不妨让我们来简单写一下 css。

// src/App.tsx
import React from 'react';
import './App.css';

const App: React.FC = () => {
  return (
    <div>
      <h1 id="title">Hello React + TypeScript!</h1>
    </div>
  );
};

export default App;
// src/App.css
#title {
  color: red;
  border: 1px solid aqua;
}

编译之后发现报错了,很显然是因为我们用 importApp.css 文件交给了 webpack 去解析,但 webpack 本身也无法解析 css 文件。所以归根到底我们还是需要增加一些 loader 来解析 css。这里我们需要的是 css-loaderstyle-loader,前者用于解析我们 import 的 css 文件(包括使用 @importurl() 引入的文件),后者用于把解析后的样式直接插入到 dom 中,无需在 html 中引入 css 文件。

使用 Webpack5 从零架一个 React+TS 项目(一)

近期要做一个 react+ts 的小项目,之前写 react 都是直接拿 creat-react-app 脚手架一键配置的,趁这次机会学习一下 webpack 从零配置项目,顺便记录一下这个过程加深印象。

最基本的配置

架项目的第一步,创建新文件夹,然后 npm init,其中选择我们的入口文件为 src 文件夹下的 index.ts

> mkdir nano
> cd nano
> npm init
{
  "name": "nano",
  "version": "1.0.0",
  "description": "",
  "main": "src/index.ts",
  "scripts": {
    "test": "echo \"Error: no test specified\" && exit 1"
  },
  "author": "",
  "license": "ISC"
}

然后简单创建一下入口文件 src/index.ts

从上手 Travis CI 时犯的错误聊起

现在是 2021 年 5 月 22 日晚 21 点,距我开始上手 travis ci 已经过去了 5 个小时。我大约花了 4 个小时才最终配置好一个最简单的对个人主页 (http://www.saltroping.com) 的自动部署,而这 4 个小时里我走过无数弯路,犯下无数错误,甚至一度想要放弃这个想法,不过最终我还是决定把这件简单的小事做完。而正是因为这个过程非常艰难,回头看来很多错误也非常蠢笨,所以我在此复盘这个过程,以此作为一次踩坑记录和反思。

记一次使用 SpringBoot+Sping Security+Vue 的前后端分离权限认证

项目介绍

该项目是针对“权限认证”这一事务的简单实验,主要用于学习前后端分离的开发过程,以及权限认证的方式。项目使用前后端分离架构,后端使用目前流行的 Spring 框架进行开发,使用 SpringBoot 进行快速配置,通过 Spring Security 进行傻瓜式权限认证功能。前端使用 Vue3 进行开发,利用 ElmentPlus 框架设计 UI。前后端交互通过前端使用 axios 向后端 RESTapi 接口发送 ajax 请求,后端响应返回 json 数据实现。最主要的认证功能基于 Spring Security,基本没有需要手动造轮子的部分。关于数据库部分,数据库使用 MySQL 数据库,后端使用 Spring JDBCTemplate 方便数据库操作。该项目仅用于开发、演示权限认证功能,因此没有具体事务功能,只有演示用的简单事务接口和测试接口。

线段树浅析-植树节限定(上)

线段树是刷题中一种常用的数据结构,其可以在O(logN)的复杂度内实现修改单个点、修改区间、区间求和、区间最大值、区间最小值等操作。那么线段树究竟是如何做到这一点的、线段树用代码又该如何实现,借着植树节的这个时间,我来浅析(学习)一下线段树的方方面面。

写在 2021 年春节之前

本来是像效仿大家在去年(2020)年底写一个年底总结的,不过想了想 2020 年也没有做什么事情,前半年受影响只能待在家里,当时还不清楚方向是什么该怎样去做,只能随便找个目标给点动力。现在想想当时以 ACM 为方向还是有点不妥,但好歹用在家半年的时间磨练了一下数据结构与算法,不过当时那种水平也只是能看罢了。后半年多少有点不同,放弃了 ACM、在别的系学自己喜欢的课、接触更多的人、尝试一些新鲜的东西、发展自己的技术栈。这些改变给我最大的感觉还是充实,相比之前的学习来说更有满足感,真正体现了 cs 的实践性,而不是一味的刷题。

Leetcode 周赛 211

A 两个相同字符之间的最长子字符串

题目

给你一个字符串 s,请你返回 两个相同字符之间的最长子字符串的长度 ,计算长度时不含这两个字符。如果不存在这样的子字符串,返回 -1 。

子字符串 是字符串中的一个连续字符序列。

思路

记录一个存储每个小写字母出现的开始位置的数组,遍历串维护最长子字符串即可。