-
Notifications
You must be signed in to change notification settings - Fork 0
/
content.json
1 lines (1 loc) · 215 KB
/
content.json
1
{"meta":{"title":"油炸小龙虾刺身","subtitle":"星期五晚上进来的人都有一个原因 ––––– 香香鸡小店 https://bakasine.com","description":"","author":"Wesker","url":"https://bakasine.github.io","root":"/"},"pages":[{"title":"404","date":"2018-10-30T06:18:37.000Z","updated":"2023-08-22T06:54:36.519Z","comments":true,"path":"/404.html","permalink":"https://bakasine.github.io/404.html","excerpt":"","text":"404 Not Found 对不起,您所访问的页面不存在或者已删除 你可以点击此处返回首页 我的Github:bakasine 或者给我留言:issue"},{"title":"分类","date":"2018-10-28T05:08:57.000Z","updated":"2023-08-22T06:46:54.679Z","comments":true,"path":"categories/index.html","permalink":"https://bakasine.github.io/categories/index.html","excerpt":"","text":""},{"title":"关于","date":"2023-03-30T05:27:40.000Z","updated":"2023-08-22T06:47:05.809Z","comments":true,"path":"about/index.html","permalink":"https://bakasine.github.io/about/index.html","excerpt":"","text":""},{"title":"search","date":"2018-10-30T06:18:32.000Z","updated":"2023-03-22T06:11:26.064Z","comments":true,"path":"search/index.html","permalink":"https://bakasine.github.io/search/index.html","excerpt":"","text":""},{"title":"links","date":"2023-10-30T06:18:32.000Z","updated":"2024-09-29T09:25:08.606Z","comments":true,"path":"links/index.html","permalink":"https://bakasine.github.io/links/index.html","excerpt":"","text":"二次元 └─视频 └─搜图工具 论坛 AI模型 工具 游戏 破解软件 DNS 域名 邮箱 接码平台 挖矿 二次元 二次元 - 视频 | girigirilove | nyafun | bilibili | 二次元 - 搜图工具 | saucenao | google搜图 | bing搜图 | yandex搜图 | 论坛 | v2ex | hostloc | nodeseek | bitcointalk | lowendtalk | AI 模型 | 画图模型 | 工具 | 朋友圈生成工具 | 图片压缩 | GIF工具 | Favicon生成 | 在线抠图 | FC2出处 | 图床 | 免费代理 | M3U8下载 | PDF编辑 | Warp生成 | QQ泄漏数据查询 | 游戏 破解软件 | 果核剥壳 | DNS | hostry | cloudflare | 域名 | 价格排行 | free.hr | eu.org | 域名 | 輔英科技大學 | 湖北工业大学 | 接码平台 | sms-activate | 挖矿 | 矿池统计 | 算力租赁 | 算力租赁 | 挖矿收益排行 |"},{"title":"标签","date":"2018-10-28T05:01:30.000Z","updated":"2023-03-22T06:11:26.064Z","comments":true,"path":"tags/index.html","permalink":"https://bakasine.github.io/tags/index.html","excerpt":"","text":""},{"title":"SpringBoot 学习笔记一","date":"2019-04-18T14:07:02.000Z","updated":"2023-03-22T06:11:26.054Z","comments":true,"path":"deprecated/bak/SpringBoot-1.html","permalink":"https://bakasine.github.io/deprecated/bak/SpringBoot-1.html","excerpt":"","text":"注释 JDBC配置 Mybatis 注释 1234567891011121314@SpringBootApplication :复合注解,包括 @ComponentScan,和 @SpringBootConfiguration,@EnableAutoConfiguration。@Configuration :声明该类是为类似 spring 的 XML 配置文件@Bean :等价于 XML 中配置的 bean@Value :注入 Spring boot application.properties 配置的属性的值,通过${}获取@PropertySource :加载指定的 properties 文件@ConfigurationProperties :将指定的前缀的数据封装到实体类相同名称的属性内,即不需要在每个属性都添加 @Value。如果报错可以添加 @Component 注解。需要设置 Getter 和 Setter@EnableConfigurationProperties :将指定的实体类作为配置信息 JDBC配置 1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556方法一 :@ConfigurationProperties(prefix = "")public class JdbcProperties { private String url; public String getUrl() { return this.url; } public void setUrl(String url) { this.url = url; }}@Configuration@EnableConfigurationProperties(JdbcProperties.class)public class JdbcConfig { @Bean public DataSource dataSource(JdbcProperties prop) { DruidDataSource dataSource = new DruidDataSource(); dataSource.setDriverClassName(prop.getDriverClassName()); dataSource.setUrl(prop.getUrl()); dataSource.setUsername(prop.getUsername()); dataSource.setPassword(prop.getPassword()); return dataSource; }}方法二 :@Configuration@EnableConfigurationProperties(JdbcProperties.class)public class JdbcConfig { @Autowired private JdbcProperties prop; @Bean public DataSource dataSource() { DruidDataSource dataSource = new DruidDataSource(); dataSource.setDriverClassName(prop.getDriverClassName()); dataSource.setUrl(prop.getUrl()); dataSource.setUsername(prop.getUsername()); dataSource.setPassword(prop.getPassword()); return dataSource; }}方法三 :@Configurationpublic class JdbcConfig { @Bean @ConfigurationProperties(prefix = "") public DataSource dataSource() { // application.properties 文件的名称必须为 driverClassName,url,username,password DruidDataSource dataSource = new DruidDataSource(); return dataSource; }} 整合MyBatis 1234567891011121314151617181920212223242526272829303132333435363738394041424344// 事先准备 User 实体类(Getter,Setter),user 数据库表// 创建 MyBatis 的映射一.注解法@Mapperpublic interface UserMapper { @Select("select * from user where username = #{username}") User findUserByUsername(@Param("username") String username);}二.XML配置法// 需要在 application.yml 额外添加 xml 文件的路径, xml 文件编写见 Mybatismybatis: type-aliases-package: com.uerax.springboot.domain mapper-locations: mapper/*.xml// UserMapper.java@Mapperpublic interface UserMapper { User findUserById(@Param("id") int id);}// UserMapper.xml 编写<?xml version="1.0" encoding="UTF-8" ?><!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Config 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd"><mapper namespace="com.uerax.springboot.mapper.UserMapper"> <select id="findUserById" parameterType="int" resultType="User"> select * from user where id = #{id} </select></mapper>// 配置 application.yml 的 DataSourcespring: datasource: driver-class-name: com.mysql.jdbc.Driver username: root password: root url: jdbc:mysql:///springboot?serverTimezone=GMT// 因为 SpringBoot 使用的是最新 mysql-connector-java 8+ ,JDBC 连接到mysql-connector-java 6+以上的需要指定时区 serverTimezone=GMT%2B8"},{"title":"SpringBoot 学习笔记二","date":"2019-04-23T13:10:35.000Z","updated":"2023-03-22T06:11:26.055Z","comments":true,"path":"deprecated/bak/SpringBoot-2.html","permalink":"https://bakasine.github.io/deprecated/bak/SpringBoot-2.html","excerpt":"","text":"Thymeleaf JDBC配置 Mybatis Thymeleaf 1234567891011// 配置 application.ymlSpring: thymeleaf: # 配置视图路径前缀 prefix: classpath:/templates/ # 配置视图路径后缀 suffix: .html mode: html # 关闭缓存 修改视图 刷新浏览器就显示 开发阶段务必关闭缓存 (=false) cache: false"},{"title":"Go笔记(1)","date":"2021-09-28T16:08:42.000Z","updated":"2023-03-22T06:11:26.055Z","comments":true,"path":"deprecated/bak/go-note.html","permalink":"https://bakasine.github.io/deprecated/bak/go-note.html","excerpt":"","text":"Go安装 Go工程结构 Go程序的编译和运行 Go安装 Windows 下的安装步骤 下载地址 安装 msi 文件 配置环境变量 GOPATH,GOPATH 是一个路径,用来存放开发中需要用到的代码包 Linux 下的安装步骤 下载地址 配置环境变量 12345wget https://dl.google.com/go/{开发包名}tar -C {安装路径} -xzf {开发包名}vi /etc/profile export GOROOT={gopath} export PATH=$PATH:$GOROOT/bin:$GOBIN Mac 下的安装步骤 下载地址 安装 pkg 文件(如果是M1版本需要下载arm的安装文件) 配置环境变量 1234vi ~/.bash_profile export GOPATH=$HOME/go source ~/.bash_profile export GOROOT=/usr/local/go Go工程结构 一个Go语言项目的目录一般包含以下三个子目录: src 目录:放置项目和库的源文件; pkg 目录:放置编译后生成的包/库的归档文件; bin 目录:放置编译后生成的可执行文件。 手动在 GOPATH 中创建以上三个文件夹,并在 src 下创建不同的项目文件夹 Go程序的编译和运行 123456789// build 编译成二进制的可执行文件go build file.go// install 一是编译包文件(无main包),将编译后的包文件放到 pkg 目录下($GOPATH/pkg)。二是编译生成可执行文件(有main包),将可执行文件放到 bin 目录($GOPATH/bin)go install file.go// run 直接执行go run file.go"},{"title":"Go笔记(3)","date":"2021-12-05T11:08:42.000Z","updated":"2023-03-22T06:11:26.056Z","comments":true,"path":"deprecated/bak/go-note3.html","permalink":"https://bakasine.github.io/deprecated/bak/go-note3.html","excerpt":"","text":"Go复合类型 Go结构体 Go接口 Go复合类型 Array 123var q [3]intvar q [3]int = [3]int{1, 2, 3}q := [...]int{1, 2, 3} Slice 1234567891011121314151617// slice之间可以共享底层的数据 类似于Java的ArrayListvar s []int // len(s) == 0, s == nils = nil // len(s) == 0, s == nils = []int(nil) // len(s) == 0, s == nils = []int{} // len(s) == 0, s != nilmonths := [...]string{1: "January", /* ... */, 12: "December"} // index: values := months[4:7]s := make([]T, len, cap) // same as make([]T, cap)[:len]// 使用例s = append(s, subS) // 添加s = append(s[:del], s[del + 1:]...) // 删除s[0] = value // 可能会导致其他切片的内容也收到改变// 遍历for index, value := range s {} Map 123456789101112ages := make(map[string]int) // string:intages["alice"] = 31ages["charlie"] = 34ages := map[string]int{ "alice": 31, "charlie": 34,}// 使用例delete(ages, “alice”) // 删除ages["alice"]++ // 加一_, ok := range ages[key] // key是否存在 Go结构体 函数和方法 123456789101112131415// 函数 注:go没有重载func functions() {}// 调用方法functions()// 方法 针对某个结构的方法type Test struct { A int B String}// Test接收值不为指针的话,无法改变调用方法的结构体的值func (t *Test) method() {}// 调用方法t := &Test{1, ""}t.method() 结构体嵌入 12345678910111213141516171819202122232425262728type House struct { Size uint} type Human struct { A string /* 嵌入扩展 当要将Human转成Json时,相当于 "human": { "a":"", "house": { "size":"" } */ house House }type Human struct { A string /* 嵌入扩展 当要将Human转成Json时,相当于 "human": { "A":"", "Size":"" } */ House } 方法表达式 12345678910type Test struct { A int B String}func (t *Test) Method(val int) {}t := new(Test)alias := t.Methodalias(val) // t.Method(t) Go接口 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748// 实现了接口的所有方法,则认为实现了该接口type Person interface { GetName() string GetSex}type Student struct { Name string Sex string}func (s *Student) GetName() string { return s.Name}func (s *Student) Sex() string { return s.Sex}// 判断interface是否实现接口type Animal struct {}var t interface{}t = &Animal{}_, ok := t.(Person) // falset = &Student{}_, ok := t.(Person) // true// 判断接口类型switch t.(type) {case int: // int类型case string: // string类型default: // 其他类型}//空接口就是不包含任何方法的接口。正因为如此,所有的类型都实现了空接口。var a interface{}a = ""a = 1// 一个包含nil指针的接口不是nil接口var p Personp = &Student{}notNil := func() *Student { return nil } p = notNil() // p != nil 因为interface中的value为nil但type不为nilisNil := func() *Person { return nil }p = isNil() // p == nil"},{"title":"Go笔记(2)","date":"2021-09-28T17:59:25.000Z","updated":"2023-03-22T06:11:26.056Z","comments":true,"path":"deprecated/bak/go-note2.html","permalink":"https://bakasine.github.io/deprecated/bak/go-note2.html","excerpt":"","text":"Go变量声明和初始化 Go作用域 Go变量声明和初始化 Go与Java不同,声明变量的类型在变量的名称之后 12var name typevar i int = 1 Go的基本类型有 123456789101112131415bool // true | falsestring // for循环取出rune类型int // 根据操作系统位数决定是int32还是int64int8 // 占1个字节 【-1 * 2 ^ 7,1 * 2 ^ 7 - 1】7是因为还有1位要作为符号位,-1是补码需要,最小值不需要-1因为还有个-0可以使用int16 // 占2个字节 【-1 * 2 ^ 15,1 * 2 ^ 15 - 1】int32 // 同int64 // 同uint // 根据操作系统位数决定是int32还是int64uint8 // 无符号整数,即非负数 1个字节 【0,1*2^8 - 1】 8是因为不需要符号位uint16、uint32、uint64 // 同上uintptr // 用uint保存地址byte // uint8 的别名rune // int32 的别名 代表一个 Unicode 码float32、float64complex64、complex128 批量格式 1234var ( name1 type1 name2 type2) 简短格式 定义变量,同时显式初始化。 不能提供数据类型。 只能用在函数内部。 1234// 名字 := 表达式i, j := 0, 1x := 100a, s = 1, "" 编译器推导 12var namevar x = 100 Go作用域 变量作用域 1234567v := 0if condition { v := 1 fmt.Println(v) // 1}fmt.Println(v) // 0// if for 里的变量都只作用于他们块中"},{"title":"Go笔记(3)","date":"2021-12-07T17:42:11.000Z","updated":"2023-03-22T06:11:26.057Z","comments":true,"path":"deprecated/bak/go-note4.html","permalink":"https://bakasine.github.io/deprecated/bak/go-note4.html","excerpt":"","text":"Go协程 Go结构体 Go接口 Go协程 1234567891011121314// 通过协程运行方法go method()// channel 协程的通信机制ch := make(chan int) // 无缓存channel接收intch <- val // val 传入 ch, 无缓存Channels的发送操作将导致发送者goroutine阻塞,直到另一个goroutine执行接收操作val = <- ch // val 接收 ch<- ch // 丢弃结果// 关闭一个 channelclose(ch)"},{"title":"JavaWeb 笔记(补)","date":"2018-11-01T14:07:32.000Z","updated":"2023-03-22T06:11:26.057Z","comments":true,"path":"deprecated/bak/javaweb-note.html","permalink":"https://bakasine.github.io/deprecated/bak/javaweb-note.html","excerpt":"","text":"Servlet Filter/Listener JSP JDBC Servlet 配置 123456789101112131415<servlet> <servlet-name>ServletName</servlet-name> <servlet-class>package.ServletName</servlet-class> // 可选, 使 Servlet 在服务器启动时就创建, 根据 n(n > 0) 的值从小到大开始 <load-on-startup>n</load-on-startup></servlet><servlet-mapping> <servlet-name>ServletName</servlet-name> <url-pattern>/urlName</url-pattern></servlet-mapping>// 表单传递<form action="urlName"> <input type="text" name="valueName"></form> Servlet Config 12345678910111213141516171819202122232425262728// 获取表单参数String str = request.getParameter("valueName");// 参数放入暂存区request.setAttribute("number", str);// 从暂存区取出参数String str = (String) request.getAttribute("number");// 从暂存区删除删除request.removeAttribute("number");// 配置文件配置公共参数, 定义的参数在 JSP 中也能调用<web-app> <context-param> <param-name>name</param-name> <param-value>value</param-value> </context-param></web-app>// 获取公共参数String value = getInitParameter("name");// 跳转到 servletName , 地址栏中的地址不变request.getRequestDispatcher("servletName").forward(request, response);// 运行(不跳转) servletName 后继续运行原 Servletrequest.getRequestDispatcher("servletName").include(request, response);// 重定向到 servletName , 地址栏中的地址改变request.sendRedirect("servletName"); Filter / Listener 1234567891011121314// 配置文件配置参数<filter> <filter-name>name</filter-name> <filter-class>package.filterClass</filter-class></filter><filter-mapping> <filter-name>name</filter-name> // 过滤器作用的对象 <url-pattern>*.jsp</url-pattern></filter-mapping><listener> <listener-class>package.listener</listener-class></listener> JSP 123456789101112131415161718// JSP 指令 <%@ 指令名 key1="value1" key2="value2" %><%@ page language="java" import="java.util.*, java.lang.*" pageEncoding="utf-8" %>// JSP 代码段// 存在 Servlet 的 Service 方法内, 每次刷新页面重新定义// 不能定义方法<% int i = 1; %>// JSP 表达式<%= i %>// JSP 定义区// 存在 Servlet 内作为其属性, 刷新页面不会重新定义// 可以定义方法<%! int i = 2; %>// JSP 注释<%-- --%> JSTL 标签库 需要的 jar 包 : JSTL 包 1234567891011121314151617181920212223242526272829303132333435363738394041424344454647// jsp 文件导入 jstl 标签库<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%>// c:forEach// items 集合对象, var 每一次值存放的变量<c:forEach items="${}" var="${var}" begin="" end=""> <c:out value="${var}" /></c:forEach>// c:forTokens// delims -> 分隔符<c:forTokens items="" delims="" var="${var}"> <c:out value="${var}" /></c:forTokens>// c:set 存放数据<c:set var="key" value="value">// 存放 Map 及对象, target 是 Map 则 property 指定的是 key, 是对象则 property 指定的是对象的属性<c:set target="${}" property="name" value="value" />// c:remove<c:remove var="">// c:out 类似 <%= %><c:out value="${key}" />// c:catch 获取错误信息并存放到变量里<c:catch var="">Exception</c:catch>// c:if 即 if 语句 test -> 条件<c:if test="${}"></c:if>// c:choose 类似 switch 语句, c:when 类似 case, c:otherwise 类似 default<c:choose> <c:when test=""> </c:when> <c:otherwise> </c:otherwise></c:choose>// c:redirect 重定向<c:redirect url=""/>// c:url 将 URL 地址格式化为一个字符串<c:url var="" url=""/> JDBC 1234567891011121314151617181920212223242526private String JDBC_URL = "jdbc:mysql:///database_name";private String USERNAME = "username";private String PASSWORD = "password";// 使用 ? 作为占位符private String SQL = "select * from table where id = ?" // 检查驱动是否存在Class.forName("com.mysql.jdbc.Driver");// 获取连接Connection conn = DriverManager.gerConnection(JDBC_URL, USERNAME, PASSWORD;// 读取 SQL 语句 PreparedStatement ps = conn.prepareStatement(SQL);// 按输入的数据类型选择方法, 1 代表第一个 ?ps.setString(1, "test");// 增删改ps.executeUpdate();// 查// 使用 ResultSet 保存取出来的数据ResultSet rs = ps.executeQuery();// 遍历 ResultSet 获取数据, 每次一条while (rs.next()) { int sqlCol = rs.setInt("sql_col"); String sqlColName = rs.setString("sql_col_name");}"},{"title":"Mybatis 逆向工程","date":"2018-12-20T11:24:08.000Z","updated":"2023-03-22T06:11:26.058Z","comments":true,"path":"deprecated/bak/mybatis-generator.html","permalink":"https://bakasine.github.io/deprecated/bak/mybatis-generator.html","excerpt":"","text":"MyBatis 逆向工程 需要的 jar 包 : mybatis-generator-core 包 (安装了插件不需要导入 jar 包) 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778<?xml version="1.0" encoding="UTF-8" ?><!DOCTYPE generatorConfiguration PUBLIC "-//mybatis.org//DTD MyBatis Generator Configuration 1.0//EN" "http://mybatis.org/dtd/mybatis-generator-config_1_0.dtd"><generatorConfiguration> <context id="testTables" targetRuntime="MyBatis3"> <commentGenerator> <!-- 是否去除自动生成的注释 true:是 : false:否 --> <property name="suppressAllComments" value="true" /> </commentGenerator> <!--数据库连接的信息:驱动类、连接地址、用户名、密码 --> <jdbcConnection driverClass="com.mysql.jdbc.Driver" connectionURL="jdbc:mysql://localhost:3306/spring" userId="root" password="root"> </jdbcConnection> <!-- 默认false,把JDBC DECIMAL 和 NUMERIC 类型解析为 Integer, 为 true时把JDBC DECIMAL 和 NUMERIC 类型解析为java.math.BigDecimal --> <javaTypeResolver> <property name="forceBigDecimals" value="false" /> </javaTypeResolver> <!-- targetProject:生成PO类的位置 --> <javaModelGenerator targetPackage="com.uerax.crud.domain" targetProject=".\\src\\main\\java"> <property name="enableSubPackages" value="false" /> <!-- 从数据库返回的值被清理前后的空格 --> <property name="trimStrings" value="true" /> </javaModelGenerator> <!-- mapper映射文件生成的位置 --> <sqlMapGenerator targetPackage="mapper" targetProject=".\\src\\main\\resource"> <property name="enableSubPackages" value="false" /> </sqlMapGenerator> <!-- mapper接口生成的位置 --> <javaClientGenerator type="XMLMAPPER" targetPackage="com.uerax.crud.mapper" targetProject=".\\src\\main\\java"> <property name="enableSubPackages" value="false" /> </javaClientGenerator> <!-- 指定数据库表 --> <table schema="" tableName="employee"></table> <table schema="" tableName="department"></table> </context></generatorConfiguration>// 安装插件直接执行 xml 文件即可生成, 没有安装插件则执行List<String> warnings = new ArrayList<String>();boolean overwrite = true;File configFile = new File("generatorConfig.xml");ConfigurationParser cp = new ConfigurationParser(warnings);Configuration config = cp.parseConfiguration(configFile);DefaultShellCallback callback = new DefaultShellCallback(overwrite);MyBatisGenerator myBatisGenerator = new MyBatisGenerator(config, callback, warnings);myBatisGenerator.generate(null);// 使用 selectByExamplepublic void testSelectByExample() { StudentMapper stuMapper = applicationContext.getBean(StudentMapper.class); StudentExample example = new StudentExample(); // 创建 Criteria Criteria c = example.createCriteria(); // 设置查询条件 c.andAgeBetween(11, 23); List<Student> list = stuMapper.selectByExample(example); for (Student stu : list) { System.out.println(stu); }}// 使用 insertSelective 自动忽略不插入的值public void testInsertSelective() { StudentMapper stuMapper = applicationContext.getBean(StudentMapper.class); Student stu = new Student(); stu.setName(""); stu.setAge(41); stu.setMoney(22221); stuMapper.insertSelective(stu);} 多表查询 123456789101112131415161718192021222324252627282930313233// class A { private B b}// 在 Mapper 接口内添加自定义方法// 在 Mapper 配置文件中添加<sql id="sql_id"> // 需要查询出来的字段</sql><resultMap id="WithDeptResultMap" type="package.A">// 将 BaseDeptResultMap 的内容复制进来<association property="b" javaType="package.B"> <id column="" property="" /> <result column="" property="" /></association>List<Employee> selectByExampleWithA(A a);<select id="selectByExampleWithA" parameterType="package.AExample" resultMap="WithDeptResultMap">// 换成我们需要的查询的字段<include refid="sql_id" />// 修改成多表查询语句from employee e left join department d on e.dept_id = d.dept_id</select>// 添加自定义指定查询语句Employee selectByPrimaryKeyWithA(Integer a.primaryKey);<select id="selectByPrimaryKeyWithA" parameterType="java.lang.Integer" resultMap="WithDeptResultMap">select<include refid="sql_id" />from employee e left join department d on e.dept_id = d.dept_idwhere emp_id = #{empId,jdbcType=INTEGER}</select> Idea 使用 maven 创建 Mybatis 逆向工程 1234567891011121314151617181920212223// pom.xml 文件添加插件// 必须放在 pluginManagement 标签同级的 plugins 标签内<plugin> <groupId>org.mybatis.generator</groupId> <artifactId>mybatis-generator-maven-plugin</artifactId> <version>1.3.2</version> <configuration> <verbose>true</verbose> <overwrite>true</overwrite> </configuration> // 添加数据库驱动依赖复制找不到 JDBC Driver <dependencies> <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> <version>${mysql.version}</version> <scope>runtime</scope> </dependency> </dependencies></plugin>// maven 的 mybatis-gererator 插件默认作用于 resources 文件夹内的 generatorConfig.xml 配置文件"},{"title":"Maven","date":"2018-11-10T15:52:24.000Z","updated":"2023-03-22T06:11:26.057Z","comments":true,"path":"deprecated/bak/maven.html","permalink":"https://bakasine.github.io/deprecated/bak/maven.html","excerpt":"","text":"创建 maven 工程 使用阿里云镜像仓库 1234567// 在 maven 的 settings.xml 文件的 mirrors 标签下添加<mirror> <id>alimaven</id> <name>aliyun maven</name> <url>http://maven.aliyun.com/nexus/content/groups/public/</url> <mirrorOf>central</mirrorOf></mirror> 指定 maven 默认使用的 JDK 版本 12345678910111213141516171819202122232425262728<!-- 局部jdk配置,pom.xml中 --><build> <plugins> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-compiler-plugin</artifactId> <configuration> <source>1.8</source> <target>1.8</target> </configuration> </plugin> </plugins></build><!-- 全局jdk配置, settings.xml --><profile> <id>jdk18</id> <activation> <activeByDefault>true</activeByDefault> <jdk>1.8</jdk> </activation> <properties> <maven.compiler.source>1.8</maven.compiler.source> <maven.compiler.target>1.8</maven.compiler.target> <maven.compiler.compilerVersion>1.8</maven.compiler.compilerVersion> </properties></profile> 引入 jar 包 maven 仓库 mvnrespository 12// 在 pom.xml 文件中的 dependencies 标签内添加<dependencies></dependencies> 使用 Idea 创建 选择 maven-archetype-webapp 修改默认 2.3 版本改用本地 Tomcat 的约束 使用 Eclipse 创建 右键工程 -> Properties -> Project Facets -> 去掉 Dynamic Web Module 的勾然后 apply -> 修改需要的版本再勾上 -> 填写需要生成的 webapp 文件位置 src/main/webapp"},{"title":"MyBatis 学习笔记(1)","date":"2018-10-30T07:37:39.000Z","updated":"2023-03-22T06:11:26.058Z","comments":true,"path":"deprecated/bak/mybatis-note-1.html","permalink":"https://bakasine.github.io/deprecated/bak/mybatis-note-1.html","excerpt":"","text":"配置环境 核心配置文件 映射文件 别名 配置环境 基础 jar 包 : MyBatis 自带所有 jar 包 编写数据库的 JAVA 类并提供 GET / Set 方法 1234567891011// 配置文件依赖<?xml version="1.0" encoding="UTF-8" ?><!DOCTYPE configuration PUBLIC "-//mybatis.org//DTD Config 3.0//EN" "http://mybatis.org/dtd/mybatis-3-config.dtd"> // 映射文件依赖<?xml version="1.0" encoding="UTF-8" ?><!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd"> 配置文件编写 12345678910111213141516171819202122<configuration> // 导入 properties 文件 <properties resource="jdbc.properties" ></properties> <!-- 和 spring 整合后 environments 配置将废除 --> <environments default="development"> <environment id="development"> <!-- 使用 JDBC 事务管理 --> <transactionManager type="JDBC" /> <!-- 数据库连接池 --> <dataSource type="POOLED"> <property name="driver" value="${jdbc.driverClassName}"/> <property name="url" value="${jdbc.url}" /> <property name="username" value="${jdbc.user}" /> <property name="password" value="${jdbc.password}"/> </dataSource> </environment> </environments> <!-- 加载映射文件 --> <mappers> <mapper resource="url/mapper.xml"/> </mappers></configuration> 映射文件 Mapper 编写 12345678910111213141516171819202122232425262728<!-- namespace 用于隔离 sql 语句 --><mapper namespace="student"> // id -> sql 语句标识符 parameterType -> 入参的数据类型 resultType -> 返回结果数据类型 <select id="getStudentById" parameterType="int" resultType="com.uerax.mybatis.domain.Student"> // #{} 点位符号, 类似 JDBC 的 ? // ${} 字符串拼接指令, 如果入参为普通类型 {} 只能写 value 如 : '%${value}%' </select> // 多个查询 <select id="getStudentByStudentName" parameterType="string" resultType="com.uerax.mybatis.domain.Student"> // sql </select> // 插入 <insert id="insertStudent" parameterType="com.uerax.mybatis.domain.Student"> // sql </insert> // 修改 <update id="updateStudent" parameterType="com.uerax.mybatis.domain.Student"> // sql </update> // 删除 <delete id="deleteStudent" parameterType="int"> // sql </delete></mapper> 调用方法 12345678910111213141516171819202122232425262728293031// 创建 SqlSeesionFactoryBuilder 对象SqlSessionFactoryBuilder ssfb = new SqlSessionFactoryBuilder();// 创建核心配置文件输入流InputStream is = Resources.getResourceAsStream("SqlMapConfig.xml");// 通过输入流创建 SqlSessionFactory 对象SqlSessionFactory ssf = ssfb.build(is);// 创建SqlSession 对象SqlSession ss = ssf.openSession();// 执行查询 (单个)Student stu = ss.selectOne("student.getStudentById", 2);// 查找多个, 映射的 resultType 直接用 List 内部数据类型List<Student> list = selectList();// 执行插入Student student = new Student();ss.insert("student.insertStudent", student);// 执行 commit 提交才能成功插入, 或者在openSession(true) 传入 truess.commit();// 执行修改, 删除// 如果参数包含多个 Student 类的属性则将需要的属性赋值即可Student stu = new Student();ss.update("student.updateStudent", stu);ss.delete("student.deleteStudent", 1);// 执行 commit 提交才能成功执行, 或者在openSession(true) 传入 truess.commit();ss.close(); 动态开发代理 1234567891011121314151617<!-- namespace 是接口的全路径名 接口方法名必须与 sql id一致 接口的入参必须与 parameterType 类型一致 接口的返回值必须与 resultType 类型一致 --><mapper namespace="com.uerax.mybatis.mapper.StudentMapper"> // 和上方写法一致</mapper>// StudentMapper 是一个接口, 只要遵守上方四条规则底层会自动帮我们实现public interface StudentMapper { Student getStudentByI(Integer id); List<Student> getStudent(); void insertStudent(Student stu);}// 调用时需要获取映射SqlSession.getMapper(StudentMapper.class); 别名设置 1234567<typeAliases> <!-- 单个别名定义, 不区分大小写 --> <typeAlias type="com.uerax.mybatis.domain.Student" alias="student" /> <!-- 包扫描器, 别名是类的全称,不区分大小写 --> <package name="com.uerax.mybatis.domain"/></typeAliases> 映射文件加载方法 1234567<mappers> <mapper resource="url" /> // 接口文件必须与映射文件在同一目录下, 接口文件必须与映射文件名称一致 <mapper class="package.mapperName" /> / 包扫描, 接口文件必须与映射文件在同一目录下, 接口文件必须与映射文件名称一致 <package name="package" /></mappers>"},{"title":"MyBatis 分页插件","date":"2018-11-12T07:07:52.000Z","updated":"2023-03-22T06:11:26.059Z","comments":true,"path":"deprecated/bak/pagehelper.html","permalink":"https://bakasine.github.io/deprecated/bak/pagehelper.html","excerpt":"","text":"需要引入的 jar 包 : pagehelper 包, sql 解析器的 sqlparser 包 使用 maven 只需要添加 pagehelper 依赖 配置 方法一 12345678// 使用 MyBatis 配置文件配置<plugins> <!-- com.github.pagehelper为PageHelper类所在包名 --> <plugin interceptor="com.github.pagehelper.PageInterceptor"> <!-- 使用下面的方式配置参数,后面会有所有的参数介绍 --> <property name="param1" value="value1"/> </plugin></plugins> 方法二 123456789101112131415<bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean"> <!-- 注意其他配置 --> <property name="plugins"> <array> <bean class="com.github.pagehelper.PageInterceptor"> <property name="properties"> <!--使用下面的方式配置参数,一行配置一个 --> <value> params=value1 </value> </property> </bean> </array> </property></bean> 参数 12345// reasonable:分页合理化参数,默认值为false。当该参数设置为 true 时,pageNum<=0 时会查询第一页, pageNum>pages(超过总数时),会查询最后一页。默认false 时,直接根据参数进行查询。<property name="reasonable" value="true"/>// offsetAsPageNum:默认值为 false,该参数对使用 RowBounds 作为分页参数时有效。 当该参数设置为 true 时,会将 RowBounds 中的 offset 参数当成 pageNum 使用,可以用页码和页面大小两个参数进行分页。<property name="reasonable" value="true"/> 使用方法 1234567891011121314151617181920212223242526272829303132333435363738394041// 只有紧跟在PageHelper.startPage方法后的第一个Mybatis的查询(Select)方法会被分页。public String getEmp(Model model, @RequestParam(defaultValue="1") Integer startPage) { // 获取第1页,10条内容,默认查询总数count PageHelper.startPage(startPage, 5); List<Employee> list = employeeService.getEmployee(); // 将 list 放进 PageInfo 并设置显示页码数如不设置默认为8 PageInfo page = new PageInfo(list, 5); model.addAttribute("pageInfo", page); return "list";}// pageContext.setAttribute("APP_PATH", request.getContextPath());// 获取 PageInfo 内的 list 遍历<c:forEach items="${ pageInfo.list }" var="emp"></c:forEach>// 修改 bootstrap 默认的分页模板<div class="row"> <div class="col-md-3 col-md-offset-8"> <nav aria-label="Page navigation"> <ul class="pagination"> <li><a href="${ APP_PATH }/emps?startPage=${ pageInfo.pageNum - 1 }" aria-label="Previous"> <span aria-hidden="true">&laquo;</span> </a></li> <!-- 获取所有导航页码遍历 --> <c:forEach items="${ pageInfo.navigatepageNums }" var="page"> <!-- 判断是否为当前页码 --> <c:if test="${ page == pageInfo.pageNum }"> <li class="active"><a href="#">${ page }</a></li> </c:if> <c:if test="${page != pageInfo.pageNum }"> <li><a href="${ APP_PATH }/emps?startPage=${page}">${ page }</a></li> </c:if> </c:forEach> <li><a href="${ APP_PATH }/emps?startPage=${ pageInfo.pageNum + 1 }" aria-label="Next"> <span aria-hidden="true">&raquo;</span> </a></li> </ul> </nav> </div></div>"},{"title":"MyBatis 整合 Spring 框架","date":"2018-11-03T12:54:58.000Z","updated":"2023-03-22T06:11:26.059Z","comments":true,"path":"deprecated/bak/spring-mybatis.html","permalink":"https://bakasine.github.io/deprecated/bak/spring-mybatis.html","excerpt":"","text":"整合环境 mybatis 的 jar 包 spring 的 jar 包 数据库连接池 jar 包(dbcp连接池) 数据库驱动 配置文件 Spring 配置文件 123456789101112131415161718<context:property-placeholder location="jdbc.properties"/><!-- 配置数据库连接池 --><bean id="dataSource" class="org.apache.commons.dbcp2.BasicDataSource"> <property name="driverClassName" value="${jdbc.dirver}" /> <property name="url" value="${jdbc.url}" /> <property name="username" value="${jdbc.username}" /> <property name="password" value="${jdbc.password}" /></bean><!-- SqlSessionFactory 配置 --><bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean"> <!-- 加载数据库连接池 --> <property name="dataSource" ref="dataSource" /> <!-- 加载 MyBatis 核心配置文件 --> <property name="configLocation" value="classpath:SqlMapConfig.xml" /> <!-- 别名包扫描 --> <property name="typeAliasesPackage" value="" /></bean> Mapper 编写三种方法 原始 DAO 开发 1234567891011121314151617181920212223242526272829303132333435363738394041// mapper.xml<mapper namespace=""> <select id="method" parameterType="" resultType=""> // sql </select></mapper>// MyBatis 核心配置文件<configuration> <mappers> <mapper resource="mapper.xml" /> </mappers></configuration>// 编写 DAO 接口及其实现类public interface StudentDao {}// 需要继承 SqlSessionDaoSupportpublic class StudentDaoImpl extends SqlSessionDaoSupport implements StudentDao { public void method() { // 通过 SqlSessionDaoSupport 获取 SqlSession SqlSession ss = this.getSqlSession(); }}// 需要在 Spring 配置文件中配置<bean id="studentDao" class=""> <property name="sqlSessionFactory" ref="sqlSessionFactory" /></bean>// 测试程序public class Tester { private ApplicationContext applicationContext; @Test public void test1() { applicationContext = new ClassPathXmlApplicationContext("classpath:applicationContext.xml"); // StudentDao stu = (StudentDao) applicationContext.getBean("studentDao"); StudentDao stu = applicationContext.getBean(StudentDao.class); }} Mapper 代理开发 123456789101112131415// 使用mapper代理开发时,namespace有特殊作用,namespace等于mapper接口地址<mapper namespace="package.StudentMapper"> <select id=""> // sql </select></mapper>// Spring 配置文件中配置<bean id="studentMapper" class="org.mybatis.spring.mapper.MapperFactoryBean"> <property name="sqlSessionFactory" ref="sqlSessionFactory" /> <property name="mapperInterface" value="package.MapperInterface" /></bean>// 测试文件StudentMapper stuMap = applicationContext.getBean(StudentMapper.class); Mapper 动态代理 123456// 只需在 Spring 配置文件下添加<bean class="org.mybatis.spring.mapper.MapperScannerConfigurer"> // 扫描的包路径 <property name="basePackage" value="com.uerax.mybatis.mapper" /> <property name="sqlSessionFactoryBeanName" value="sqlSessionFactory" /></bean>"},{"title":"MyBatis 学习笔记(2)","date":"2018-10-31T11:27:57.000Z","updated":"2023-03-22T06:11:26.059Z","comments":true,"path":"deprecated/bak/mybatis-note-2.html","permalink":"https://bakasine.github.io/deprecated/bak/mybatis-note-2.html","excerpt":"","text":"ResultMap 动态 sql 多表查询 ResultMap 定义 123456789101112131415<mapper namespace="com.uerax.mybatis.mapper.StudentMapper"> <!-- type -> 数据库对应的 JAVA 实体类 --> <resultMap type="com.uerax.mybatis.domain.Student" id="result_map_id"> <!-- id -> 用于映射主键(primary key) --> <!-- property -> 实体类属性 column -> 数据库字段 --> <id property="id" column="id"/> <!-- result -> 用于映射普通字段 --> <result property="" column=""/> </resultMap> <!-- 使用 ResultMap --> <select id="getStudentNameById" parameterType="" resultMap="result_map_id"> // sql </select></mapper> 动态 sql 1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950// if 标签<select> select * from `student` where 1 = 1 <if test = "name != null and name != ''"> and name like '%${name}%' </if> <if test = "age != null and age != ''" > and age = #{sex} </if></select>// where 标签// 自动补上 where 关键字, 同时处理多余的 and, 不能再自行加上 where 关键字<select> select * from `student` <where> <if test = "name != null and name != ''"> and name like '%${name}%' </if> <if test = "age != null and age != ''" > and age = #{sex} </if> </where></select>// sql 片段<sql id="sql_id"> // sql *</sql><select> select <include refid="sql_id"></include> from `studetn`</select>// foreach 标签select *from `student`<where> // collection -> 要遍历的集合(实体类内的集合属性名) open -> 循环开始前输出的内容 // separator -> 分割符号 item -> 设置的循环变量 close -> 循环结束输出的内容 <foreach collection="ids" open="id in(" item="id" separator="," close=")"> #{id} </foreach></where> 多表查询 一对一关联查询 方法一 12345678// foreign key(A.col) references B(col)class B {}class A extends B{}<mapper> <select id="" resultType="package.A"> // sql </select></mapper> 方法二 12345678910111213141516171819202122// foreign key(A.col) references B(col)class B {}class A { private B b;}<mapper> <resultMap type="package.A" id="id"> <id property="alias" column="primaryKey" /> <result property="alias" column="columnName" /> // javaType -> B 的数据类型 property -> A 内的 B 属性 <association property="b" javaType="package.B"> // 如果在 sql 中设置别名那么 column 要输入别名 <id property="alias" column="primaryKey" /> <result property="alias" column="columnName" /> </association> </resultMap> <select id="" resultMap="id"> // sql </select></mapper> 一对多关联查询 123456789101112131415161718192021// foreign key(A.col) references B(col)class B {}class A { private List<B> b;}<mapper> <resultMap type="package.A" id="id"> <id property="alias" column="primaryKey" /> <result property="alias" column="columnName" /> // collection 用于配置一对多类型 // ofType -> B 的数据类型 property -> A 内的 B 属性 <collection property="b" ofType="package.B"> <id property="alias" column="primaryKey" /> <result property="alias" column="columnName" /> </collection> </resultMap> <select id="" resultMap="id"> // sql </select></mapper>"},{"title":"Spring 学习笔记(1)","date":"2018-10-27T08:42:17.000Z","updated":"2023-03-22T06:11:26.060Z","comments":true,"path":"deprecated/bak/spring-note-1.html","permalink":"https://bakasine.github.io/deprecated/bak/spring-note-1.html","excerpt":"","text":"环境配置 bean 注释方法 AOP 环境配置 基础 jar 包 : Spring 自带的 beans, core, context, expression 包另外还需要 log4j 和 commons-logging 两个日志包 bean 标签来完成实例化 1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950// 需要添加 xml 的 bean 约束用 Eclipse 的 Spring tools 插件自动生成// beanId -> 实例化后的id classPath -> 类的包路径<bean id="beanId" class="classPath"><bean/>// 属性注入 - set 方法注入, 属性必须实现 set 方法<bean id="beanId" class="classPath"> // 普通属性注入 <property name="属性名" value="注入的值" /> // 对象类型注入 <property name="属性名" ref="beanId" /> // SpEL的属性注入 <property name="属性名" value="{注入的值(非字符)}" /> <property name="属性名" value="{'字符串或者字符'}" /> // 集合类型注入 // 数组和 List 类型 <property name="属性名"> <list> <value>注入的值</value> <value>注入的值</value> <list/> </property> // Set 类型 <property name="属性名"> <set> <value>注入的值</value> </set> </property> // Map 类型 <property name="属性名"> <map> <entry key="keyName" value="value"> </map> </property><bean/>// 可导入其他配置文件<import resource="path">// 在 applicationContext.xml 文件下配置好后// ClassPathXmlApplicationContext -> 读取类包同路径下(如同类包在 src 文件夹下)ApplicationContext applicationContext = new ClassPathXmlApplicationContext("xml文件路径");// FileSystemXmlApplicationContext -> 读取工程目录下ApplicationContext applicationContext = new FileSystemXmlApplicationContext("xml文件路径");ClassName className = (ClassName) applicationContext.getBean("beanId"); 通过注释实现实例化 12345678910111213141516171819// 需要添加 xml 的 context 约束用 Eclipse 的 Spring tools 插件自动生成// 需要在配置文件指定扫描的包<context:component-scan base-package="需要扫描的包及其子包">// Contorller 和 Service 和 Repository 一样的功能@Controller("beanId")public class className { // 普通类型使用 Value @Value("value") private int intValue; @Value("{'value'}") private String StringValue; // 对象类型使用 Resource 或者 Autowired + Qualifier @Resource(name="beanId") private ClassName className;} 使用 Spring 整合 JUnit4 的功能 需要引入的 jar 包 : Spring 的 Test 包 12345678910111213@RunWith(SpringJUnit4ClassRunner.class)@ContextConfiguration("classpath:配置文件") // 配置文件放在类包同路径下// 配置文件放在工程目录下 @ContextConfiguration("file:path/配置文件")public class classTester() { @Resource(name="beanId") private ClassName className; @Test public void method() { className.method(); }} Spring AOP 需要引入的 jar 包 : Spring 的 aop, aspect 包 AOP 的配置方法 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657// 在配置文件或者注解配置切面类<bean id="aspectClass" class="path"><bean/>// AOP 配置<aop:config> // 配置切点 // 常见写法 // execution(public * *(..)) 所有的public方法 // execution(* set*(..)) 所有set开头的方法 // execution(* com.uerax.service.AccountService.*(..)) AccountService类中的所有方法 // execution(* com.uerax.service.*.*(..)) com.uerax.service包下所有的方法 // execution(* com.uerax.service..*.*(..)) com.uerax.service包及其子包下所有的方法 <aop:pointcut expression="execution(* path.className.method(..))" id="切点名" /> // 配置切面 <aop:aspect ref="aspectClass"> // 前置通知 -> 执行前检查 <aop:before method="aspectClass的方法" pointcut-ref="切点名" /> // 后置通知 -> 执行后检查 <aop:after-returning method="" pointcut-ref="" /> // 环绕通知 -> 执行前后都检查 <aop:around method="" pointcut-ref="" /> // 异常抛出通知 <aop:after-throwing method="" pointcut-ref="" throwing="ex(抛出的异常id)"/> // finally 通知 -> 方法报错也会执行 <aop:after method="" pointcut-ref="" /> </aop:aspect></aop:config>// 切面类public class AspectClass { // 前置通知 // joinPoint 连接点,指的是被增强的那个方法 public void before(JoinPoint joinPoint) {} // 后置通知 // result 增强的方法的返回值 public void afterReturning(JoinPoint joinPoint, Object result) {} // 环绕通知 // proceedingJoinPoint 正在执行的连接点 public Object around(ProceedingJoinPoint proceedingJoinPoint) {} // 异常抛出通知 // ex 目标方法抛出的异常 要与配置文件命名一致 public void afterThrowing(JoinPoint joinPoint, Throwable ex) {} // 最终通知 // 作用:不管目标方法是否发生异常,最终通知都会执行 (类似于finally代码功能) // 应用场景 : 释放资源 (关闭文件、 关闭数据库连接、 网络连接、 释放内存对象) public void after(JoinPoint joinPoint) {}} AOP 的注释方法 123456789101112131415161718192021222324252627282930// 需要先在配置文件开启注解的 AOP 开发<aop:aspectj-autoproxy/>// 在切面类上添加@Aspectpublic void AspectClass { // 前置通知 @Before("execution(* *.className.method(..))") public void before() {} // 后置通知 // Object 声名的变量必须与注释配置的 returning 一致 @AfterReturning(value="execution(* *.className.method(..))", returning="result") public void afterReturning(Object result) {} // 环绕通知 @Around(value="execution(* *.className.method(..))") public void around(ProceedingJoinPoint joinPoint) throws Throwable {} // 异常抛出通知 @AfterThrowing(value="execution()") // 最终通知 @After(value="AspectClass.pointcut()", throwing="e") // 配置切入点 // 直接用 className.pointcut() 选择该切入点 @Pointcut("execution()") private void pointcut() {}}"},{"title":"Spring 学习笔记(2)","date":"2018-10-28T08:18:54.000Z","updated":"2023-03-22T06:11:26.060Z","comments":true,"path":"deprecated/bak/spring-note-2.html","permalink":"https://bakasine.github.io/deprecated/bak/spring-note-2.html","excerpt":"","text":"JDBC DBCP C3P0 事务管理 Spring JDBC 需要引入的 jar 包 : Spring 的 JDBC , tx , aop 的包和数据库驱动的包 1234567891011121314151617181920// 将连接池和模板交给 Spring 管理// 配置连接池<bean id="dataSourceId" class="org.springframework.jdbc.datasource.DriverManagerDataSource"> // 配置数据库驱动 <property name="driverClassName" value="com.mysql.jdbc.Driver" /> // 配置数据库 database <property name="url" value="jdbc:mysql:///database" /> <property name="username" value="username" /> <property name="password" value="password" /></bean><bean id="jdbcTemplate" class="org.springframework.jdbc.core.JdbcTemplate"> <property name="dataSource" ref="dataSourceId" /></bean>// 增 删 改 使用 update方法jdbcTemplate.update("sql", args);// 查 使用 queryForObject方法// 返回 String 类型的值String str = jdbcTemplate.queryForObject("sql", String.class, args) 使用开源连接池 DBCP 连接池 需要引入的 jar 包 : apache 的 dbcp , pool 包 1234567// 只需要将配置连接池的 class 改成 org.apache.commons.dbcp2.BasicDataSource 其他用法不变<bean id="dataSource" class="org.apache.commons.dbcp2.BasicDataSource"> <property name="driverClassName" value="com.mysql.jdbc.Driver" /> <property name="url" value="jdbc:mysql:///spring" /> <property name="username" value="root" /> <property name="password" value="root" /></bean> 使用 C3P0 连接池 需要引入的 jar 包 : c3p0 的 c3p0 , mchange-commons 包 123456<bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource"> <property name="driverClass" value="com.mysql.jdbc.Driver" /> <property name="jdbcUrl" value="jdbc:mysql:///spring" /> <property name="user" value="root" /> <property name="password" value="root" /></bean> 通过 properties 文件保存 12345678// 创建 properties 文件, 语法为 key=valuedriverClass=com.mysql.jdbc.Driver// 需要在配置文件配置<context:property-placeholder location="classpath:file.properties">// 通过 ${} 调用<property name="" value="${key}"> Spring 事务管理 声明式事务 通过配置实现 需要引入的 jar 包 : AOP 所需要的全部包 XML 配置方法 123456789101112131415161718// 配置平台管理器<bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager"> // 配置数据库连接池 <property name="dataSource" ref="dataSource" /></bean>// 配置增强<tx:advice id="txAdvice" transaction-manager="transactionManager"> <tx:attributes> <tx:method name="methodName" propagation="REQUIRED"/> </tx:attributes></tx:advice>// AOP 配置<aop:config> <aop:pointcut expression="execution(* com.uerax.spring.tx.demo1.StudentServiceImpl.*(..))" id="pointcut1" /> <aop:advisor advice-ref="txAdvice" pointcut-ref="pointcut1" /></aop:config> 注解方法 123456789101112// 配置平台管理器<bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager"> // 配置数据库连接池 <property name="dataSource" ref="dataSource" /></bean>// 开启注解事务<tx:annotation-driven transaction-manager="transactionManager"/>// 在业务层添加注解@Transactionalpublic class Service {} 编程式事务 需要手动书写代码 12345678910111213141516// 配置平台管理器<bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager"> // 配置数据库连接池 <property name="dataSource" ref="dataSource" /></bean>// 配置事务管理模板<bean id="transactionTemplate" class="org.springframework.transaction.support.TransactionTemplate"> <property name="transactionManager" ref="transactionManager" /></bean>// 在需要添加事务的方法中添加transactionTemplate.execute(new TransactionCallbackWithoutResult() { protected void doInTransactionWithoutResult(TransactionStatus arg0) { // 需要添加事务的方法 }});"},{"title":"SpringCloud 笔记一","date":"2020-03-26T10:38:50.000Z","updated":"2023-03-22T06:11:26.060Z","comments":true,"path":"deprecated/bak/springcloud-1.html","permalink":"https://bakasine.github.io/deprecated/bak/springcloud-1.html","excerpt":"","text":"Maven聚合工程 Eureka配置 Eureka配置Client Maven聚合工程 1.spring initializr 或者 maven 创建一个父亲工程 2.spring initializr 创建需要将 Type 改成 maven pom, maven 需要添加 packaging 标签为 pom 3.引入依赖 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748<parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> <version>2.2.5.RELEASE</version> <relativePath/></parent><properties> <java.version>1.8</java.version> <spring-cloud.version>Hoxton.SR3</spring-cloud.version></properties><!-- dependencyManagement 子项目需要引用才有效 --><dependencyManagement> <dependencies> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-dependencies</artifactId> <version>${spring-cloud.version}</version> <type>pom</type> <scope>import</scope> </dependency> </dependencies></dependencyManagement><!-- dependencies 子项目无需引用就有效 --><dependencies> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-test</artifactId> <scope>test</scope> <exclusions> <exclusion> <groupId>org.junit.vintage</groupId> <artifactId>junit-vintage-engine</artifactId> </exclusion> </exclusions> </dependency></dependencies><build> <plugins> <plugin> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-maven-plugin</artifactId> </plugin> </plugins></build> Eureka配置Server 1.添加 Eureka 子工程,添加依赖 12345678<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId></dependency><dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-netflix-eureka-server</artifactId></dependency> 2.在Application启动程序添加注解 @EnableEurekaServer 和配置 Eureka 参数 123456789server: port: 8080spring: application: name: eureka-servereureka: client: service-url: defaultZone: http://127.0.0.1:8080/eureka Eureka配置Client 1.新增一个生产者子工程并添加依赖 1234<dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId></dependency> 2.在Application启动程序添加注解 @EnableDiscoveryClient 和配置 Eureka 参数 123456789server: port: 8088spring: application: name: eureka-producereureka: client: service-url: defaultZone: http://127.0.0.1:8080/eureka 3.同样的参数新增一个消费者子工程,消费的方法如下 12345678910111213141516// Spring 提供的用于访问 Rest 服务的客户端@Autowiredprivate RestTemplate restTemplate;// 通过 Eureka 让服务器发现服务器@Autowiredprivate DiscoveryClient discoveryClient;@RequestMapping("")public User getUser() { // 生产者的spring.application.name List<ServiceInstance> list = discoveryClient.getInstances("service-web"); ServiceInstance instance = list.get(0); User user = restTemplate.getForObject("http://" + instance.getHost() + ":" + instance.getPort() + "/", User.class); return user;}"},{"title":"SpringCloud 笔记二","date":"2020-03-27T11:32:58.000Z","updated":"2023-03-22T06:11:26.061Z","comments":true,"path":"deprecated/bak/springcloud-2.html","permalink":"https://bakasine.github.io/deprecated/bak/springcloud-2.html","excerpt":"","text":"Hystrix熔断器 Feign实现服务间的调用 Hystrix熔断器 1.在消费者模块添加依赖 1234<dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-netflix-hystrix</artifactId></dependency> 2.在Application启动程序添加注解 @SpringCloudApplication 并在方法添加注解 @LoadBalanced 12345@Bean@LoadBalancedpublic RestTemplate restTemplate() { return new RestTemplate();} 3.在方法上添加注解单独使用 @HystrixCommand(fallbackMethod = “”) 或者在 controller 类添加 @DefaultProperties(defaultFallback = “”) 应用到全部方法。fallback 的方法的参数和返回值必须和原来的方法一致。 Feign实现服务间的调用 1.在消费者模块添加依赖 1234<dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-openfeign</artifactId></dependency> 2.在Application启动程序添加注解 @EnableFeignClients 3.在消费者模块编写 Feign 接口 1234567// 提供接口的应用名@FeignClient("provider-name")public interface ConsumerClient { // 是需要调用的生产者的方法和路径 @RequestMapping("provider/user") User getUser();} 4.直接通过接口调用 1234@Autowiredprivate ConsumerClient consumerClient;providerClient.getUser();"},{"title":"SpringCloud 笔记三","date":"2020-03-28T10:13:35.000Z","updated":"2023-03-22T06:11:26.061Z","comments":true,"path":"deprecated/bak/springcloud-3.html","permalink":"https://bakasine.github.io/deprecated/bak/springcloud-3.html","excerpt":"","text":"Zuul路由 Zuul拦截器 Zuul路由 1.创建 Zuul 的子模块并添加依赖 12345678910<!-- 使用阿里的maven库下载的包有缺漏导致一直爆红。用原生库问题解决 --><dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-netflix-zuul</artifactId></dependency><!-- 用于 eureka --><dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId></dependency> 2.在Application启动程序添加注解 @EnableZuulProxy 和配置 Zuul 参数 123456# 将 service-provider 应用绑定到以 /provider 为前缀的请求,Zuul回默认绑定绑定应用名为前缀zuul: routes: service-provider: /provider/** # 不默认绑定 service-test 到 /service-test 上 ignoredServices: service-test Zuul拦截器 1.创建类并继承 ZuulFilter 12345678910111213141516171819202122232425262728293031323334353637@Componentpublic class MyFilter extends ZuulFilter { @Override public String filterType() { // pre: 这种过滤器在请求被路由之前调用。可利用这种过滤器实现身份验证、在集群中选择请求的微服务,记录调试信息等。 // routing: 这种过滤器将请求路由到微服务。这种过滤器用于构建发送给微服务的请求,并使用apache httpclient或netflix ribbon请求微服务。 // post: 这种过滤器在路由到微服务以后执行。这种过滤器可用来为响应添加标准的http header、收集统计信息和指标、将响应从微服务发送给客户端等。 // error: 在其他阶段发送错误时执行该过滤器。 return FilterConstants.PRE_TYPE; } @Override public int filterOrder() { // 通过int值来定义过滤器的执行顺序,越小优先级越高 return FilterConstants.PRE_DECORATION_FILTER_ORDER - 1; } @Override public boolean shouldFilter() { // 判断是否过滤 return true; } @Override public Object run() throws ZuulException { // 过滤器的具体逻辑 RequestContext context = RequestContext.getCurrentContext(); HttpServletRequest request = context.getRequest(); String s = request.getParameter("access-token"); if (StringUtils.isBlank(s)) { context.setSendZuulResponse(false); context.setResponseStatusCode(HttpStatus.FORBIDDEN.value()); } return null; }}"},{"title":"SpringMVC 学习笔记(1)","date":"2018-11-05T11:42:15.000Z","updated":"2023-03-22T06:11:26.061Z","comments":true,"path":"deprecated/bak/springmvc-note-1.html","permalink":"https://bakasine.github.io/deprecated/bak/springmvc-note-1.html","excerpt":"","text":"配置环境 SSM 框架整合 配置环境 需要的 jar 包 : Spring 基础 jar 包, Spring 的 aop, web, webmvc 包, JSP 标签库 jstl 包, 日志 commons-logging 包 基础流程 1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192// 创建 controller 控制器@Controllerpublic class TestController { // 通过 ModelAndView返回 @RequestMapping("test") public ModelAndView test() { ModelAndView mav = new ModeAndView(); // 设置模型数据传递到 jsp, key = "msg", value="test" // jsp 文件获取数据 ${ key } mav.addObject("msg", "test"); // 设置 jsp 视图 mav.setViewName("path/jsp.jsp"); return mav; } // 通过字符串返回视图名称 @RequestMapping("test") public String test(Model model) { model.addAttribute("", ""); return "test"; } // 配置多个请求地址, 设置提交方法限定 @RequestMapping(value={"test", "test2"}, method=RequestRequest.POST) // 通过传入参数获取数据, integer 必须和传入的参数名称相同 public String test(Model model, Integer integer) {} // 如果要使 integer 和传入参数名称不同 public String test(Model model, @RequestParam("parameter") Integer integer) {} // required 要求参数必须传入否则会报错, defaultValue 设置默认参数 public String test(Model model, @RequestParam(value="parameter", required=true, defaultValue="") Integer integer) {} // 传递数组参数 public String test(Integer[] integer) {} // 通过返回值跳转 public String test() { return "forword:url"; // return "redirect:url"; } // 传入实体类参数, 要求传入的值的名称要和实体类的属性名一致 public String test(Student stu) {} // 传入包装实体类 public String test(Human human, Model model) {} // Human 内有 private Student student; <input type="" name="student.name" /> // 传递 List 参数 <c:forEach items="" var="var" varStatus="status"> <input type="text" name="var[${status.index}].name" value="${var.name}" /> </c:forEach> public class Human { private List<Student> lists; } public String test(Human human) {}}// 配置 Spring 配置文件 springmvc.xml// 需要扫描的包<context:component-scan base-package="" /><!-- 配置注解驱动, 相当于同时使用最新处理器映射器和处理器适配器, 对 json 数据提供支持 --><mvc:annotation-driven /><!-- 配置视图解析器 --><bean class="org.springframework.web.servlet.view.InternalResourceViewResolver"> <property name="prefix" value="/WEB-INF/jsp/" /> <property name="suffix" value=".jsp" /> <!-- ModelAndView.setViewName("jsp") 内的 jsp = /WEB-INF/jsp/jsp.jsp --></bean><!-- 将 SpringMVC 不能处理的请求交给 Tomcat --><mvc:default-servlet-handler/>// 配置 web.xml 文件<servlet> <servlet-name>dispatcherServlet</servlet-name> <servlet-value>org.springframework.web.servlet.DispatcherServlet</servlet-value> // 如果不配置这段那么 springmvc.xml 的名称需要修改成 dispatcherServlet-servlet.xml 并放在与 web.xml文件同级目录下 <init-param> <param-name>contextConfigLocation</param-name> <param-value>classpath:springmvc.xml</param-value> </init-param></servlet><servlet-mapping> <servlet-name>dispatcherServlet</servlet-name> // 给 springmvc 处理器配置拦截地址 <url-param>*.action</url-param></servlet-mapping> SSM 框架整合 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566// 创建 MyBatis 核心配置文件<?xml version="1.0" encoding="UTF-8" ?><!DOCTYPE configuration PUBLIC "-//mybatis.org//DTD Config 3.0//EN" "http://mybatis.org/dtd/mybatis-3-config.dtd"><configuration></configuration>// 创建 Spring 配置文件// applicationContext-dao.xml 持久层配置<context:property-placeholder location="db.properties"/>// 配置数据库连接池<bean id="dataSource" class="org.apache.commons.dbcp2.BasicDataSource"> <property name="driverClassName" value="${db.dirver}" /> <property name="url" value="${db.url}" /> <property name="username" value="${db.user}" /> <property name="password" value="${db.pw}" /></bean>// 配置 SqlSessionFactory<bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean"> <property name="dataSource" ref="dataSource" /> <property name="configLocation" value="classpath:SqlMapConfig.xml" /> // 如果要让 Mapper 的 xml 文件和接口放在不同位置则需要添加 <property name="mapperLocations" value="classpath:mapper/*.xml" /></bean>// 配置 MyBatis 映射扫描<bean class="org.mybatis.spring.mapper.MapperScannerConfigurer"> <property name="basePackage" value="com.uerax.springmvc.mapper" /></bean>// applicationContext-service.xml serice 层配置<context:component-scan base-package="com.uerax.springmvc.service" />// applicationContext-transaction.xml 业务配置<!-- 事务管理器配置 --><bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager"> <property name="dataSource" ref="dataSource" /></bean><!-- 配置通知 --><tx:advice id="txAdvice" transaction-manager="transactionManager"> <tx:attributes> <tx:method name="save*" propagation="REQUIRED" /> <tx:method name="insert*" propagation="REQUIRED" /> <tx:method name="delete*" propagation="REQUIRED" /> <tx:method name="update*" propagation="REQUIRED" /> <tx:method name="find*" propagation="SUPPORTS" read-only="true" /> <tx:method name="get*" propagation="SUPPORTS" read-only="true" /> <tx:method name="query*" propagation="SUPPORTS" read-only="true" /> </tx:attributes></tx:advice><aop:config> <aop:advisor advice-ref="txAdvice" pointcut="execution(* com.uerax.springmvc.*.*(..))"/></aop:config>// 在 web.xml 配置<!-- Spring 的配置文件 --><context-param> <param-name>contextConfigLocation</param-name> <param-value>applicationContext*.xml</param-value></context-param><!-- 自动加载 Spring 的配置文件 --><listener> <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class></listener>"},{"title":"SpringMVC 学习笔记(2)","date":"2018-11-08T18:14:44.000Z","updated":"2023-03-22T06:11:26.062Z","comments":true,"path":"deprecated/bak/springmvc-note-2.html","permalink":"https://bakasine.github.io/deprecated/bak/springmvc-note-2.html","excerpt":"","text":"Restful 风格 POST 请求乱码 拦截器 日期转换器 GET 请求乱码 异常处理 图片上传 JSON 交互 PUT, DELETE 方法支持 Restful 风格 123@RequestMapping("test/{id}")// public String test(@PathVariable("id") Integer integer) {}public String test(@PathVariable Integer id) {} POST 请求乱码 1234567891011121314<!-- 通过过滤器自动设置 POST 请求编码 --><filter> <filter-name>encoding</filter-name> <filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class> <!-- 设置编码参是UTF8 --> <init-param> <param-name>encoding</param-name> <param-value>UTF-8</param-value> </init-param></filter><filter-mapping> <filter-name>encoding</filter-name> <url-pattern>/*</url-pattern></filter-mapping> 拦截器 1234567891011121314151617181920212223242526272829// 编写拦截器public class MyInterceptor implements HandlerInterceptor { // 方法执行之后执行, 处理异常, 清理资源, 记录日志 public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex)throws Exception {} // 方法执行之后, 返回 ModelAndView 前执行。设置页面的共同参数 public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler,ModelAndView modelAndView) throws Exception {} // 进入方法前执行, 登陆拦截, 权限校验 public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler)throws Exception {}}// 在 SpringMVC 配置文件中配置<mvc:interceptors> <mvc:interceptor> <!-- /** 拦截所有请求, 包括二级目录 --> <mvc:mapping path="/**" /> <!-- 配置不拦截目录 --> <mvc:exclude-mapping path="" /> <bean class="com.uerax.springmvc.interceptor.MyInterceptor" /> </mvc:interceptor> <!-- 若添加多个拦截器则 preHandle 方法按照堆顺序先入先执行, postHandle 和 afterCompletion 按照出栈先入后执行 --> <mvc:interceptor> <!-- /** 拦截所有请求, 包括二级目录 --> <mvc:mapping path="/**"/> <bean class="com.uerax.springmvc.interceptor.MyInterceptor2" /> </mvc:interceptor></mvc:interceptors> 日期转换器 1234567891011121314151617181920212223242526// 编写日期转换器实现 Converter 接口public class DateConvert implements Converter<String, Date> { public Date convert(String source) { Date date = null; try { // 与 JSP 传入的格式一致 SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); date = sdf.parse(source); } catch (ParseException e) { e.printStackTrack(); } return date; }}// Spring 配置<!-- 使用自定义转换器 --><mvc:annotation-driven conversion-service="MyConvert" /><!-- 定义转换器 --><bean id="MyConvert" class="org.springframework.format.support.FormattingConversionServiceFactoryBean"> <property name="converters"> <set> <bean class="package.DateConvert" /> </set> </property></bean> GET 请求乱码 把 tomcat 配置文件 server.xml 的 添加上 URIEncoding=“utf-8” 属性 异常处理 12345678910// 编写全局异常处理器public class CustomerExceptionResolver implements HandlerExceptionResolver { public ModelAndView resolveException(HttpServletRequest arg0, HttpServletResponse arg1, Object arg2,Exception arg3) { // 系统出现异常则返回该试图 ModelAndView mav = new ModelAndView(); return mav; }}// 配置 SpringMVC<bean class="com.uerax.springmvc.exception.CustomerExceptionResolver" /> 图片上传 需要导入的 jar 包 : fileupload 和 io 包 1234567891011121314151617181920212223// 在 tomcat 的 server.xml 文件中配置// docBase -> 文件所在的目录 path -> 配置访问路径<Context docBase="url" path="/pic" reloadable="true" />// 在 SpringMVC 的配置文件中配置多媒体处理器<bean class="org.springframework.web.multipart.commons.CommonsMultipartResolver"> <!-- 最大上传文件, value 用字节计算--> <property name="maxUploadSize" value="" /></bean>// 控制器获取图片参数, 表单必须添加 enctype="multipart/form-data", 必须使用 POST 方法<form action="" enctype="multipart/form-data" method="POST"></form>public String test(MultipartFile pictureFile) { // 图片新名称 String newName = UUID.randomUUID().toString(); // 图片旧名称 String oldName = pictureFile.getOriginalFilename(); // 获取图片后缀 String sux = oldName.subString(oldName.lastIndexOf(".")); File file = new File("url" + newName + sux); // 写入磁盘 pictureFile.transferTo(file);} JSON 交互 需要导入的 jar 包 : jackson-annotations, jackson-core, jackson-databind 1234@RequestMapping("test")public @ResponseBody Student test(@RequestBody Student student) { return student;} PUT, DELETE 方法支持 1234567891011121314151617// 对于表单提交,tomcat默认只解析POST的表单,对于PUT和DELETE的不处理<filter> <filter-name>HiddenHttpMethodFilter</filter-name> <filter-class>org.springframework.web.filter.HiddenHttpMethodFilter</filter-class></filter><filter-mapping> <filter-name>HiddenHttpMethodFilter</filter-name> <url-pattern>/*</url-pattern></filter-mapping><filter> <filter-name>HttpPutFormContentFilter</filter-name> <filter-class>org.springframework.web.filter.HttpPutFormContentFilter</filter-class></filter><filter-mapping> <filter-name>HttpPutFormContentFilter</filter-name> <url-pattern>/*</url-pattern></filter-mapping> 通过修改 tomcat 的 server.xml 配置文件 12345<Connector port="8080" protocol="HTTP/1.1" connectionTimeout="20000" redirectPort="8443" parseBodyMethods="POST,PUT,DELETE" URIEncoding="UTF-8" />"},{"title":"thymeleaf","date":"2018-12-12T08:14:24.000Z","updated":"2023-03-22T06:11:26.062Z","comments":true,"path":"deprecated/bak/thymeleaf.html","permalink":"https://bakasine.github.io/deprecated/bak/thymeleaf.html","excerpt":"","text":"目录 配置 表达式语法 常用标签 th:text th:utext th:if th:unless th:switch th:each th:selected th:value th:action th:src th:href 内置对象 使用笔记 SpringMVC 配置文件下配置 Thymeleaf 依赖 : thymeleaf-spring5, spring-context-support 1234567891011121314151617181920<bean id="templateResolver" class="org.thymeleaf.spring5.templateresolver.SpringResourceTemplateResolver"> <property name="prefix" value="/WEB-INF/views/" /> <property name="suffix" value=".html" /> <property name="templateMode" value="HTML5" /> <property name="characterEncoding" value="UTF-8" /></bean><bean id="templateEngine" class="org.thymeleaf.spring5.SpringTemplateEngine"> <property name="templateResolver" ref="templateResolver" /></bean><-- 配置 Thymeleaf 视图解析器替代 InternalResourceViewResovler --><bean class="org.thymeleaf.spring5.view.ThymeleafViewResolver"> <property name="templateEngine" ref="templateEngine" /> <-- 解决中文乱码问题 --> <property name="characterEncoding" value="UTF-8" /></bean>// 在 html 标签引入<html xmlns:th=“http://www.thymeleaf.org"> 表达式语法 ${} : 变量表达式 1<p><span th:text="${helloword}"></span></p> *{} : 选择表达式 123456<-- 选择表达式 th:object 对象绑定的属性, 如果没有选择对象则和变量表达式语法一致 --><div th:object=" ${session.user}" > <p>Name: <span th: text=" *{firstName}" >Sebastian</span>. </p> <p>Surname: <span th: text=" *{lastName}" >Pepper</span>. </p> <p>Nationality: <span th: text=" *{nationality}" >Saturn</span>. </p></div> @{} : 超链接url表达式 1<script th:src="@{/resources/js/jquery/jquery.json-2.4.min.js}" #{} : 消息表达式 12<-- 通常与 th:text 一起使用, 使用消息表达式内的 key 所对应的 value 代替标签内文本 --><p th:text="#{home.welcome}" >This text will not be show! </p> 常用标签 th:text : 用于文本的显示 1<p th:text=""></p> th:utext : 和 th:text 类似但可以解析 HTML 文本 1<p th:utext=""></p> th:if : 用于判断条件, 可以与 and, or, !, not 一同使用, 如果条件为 true 则显示 1<div th:if="${a} != null"></div> th:unless : 与 th:if 作用相反, 如果条件为 false 则显示 1<div th:if="${user} != null">show</div> th:switch th:case 1234<div th:switch="${user.role}"> <p th:case="'admin'">User is an administrator</p> <p th:case="#{roles.manager}">User is a manager</p></div> th:each : foreach 12345<tr th:each="prod : ${prods}"> <td th:text="${prod.name}">Onions</td> <td th:text="${prod.price}">2.41</td> <td th:text="${prod}">arrays</td></tr> th:selected : 选中 select 的选项 1<option th:if="${}" th:selected="selected"></option> th:value : 属性赋值, 用于 option 和 input 1<option th:value="${user.name}"></option> th:action : 定义后台控制器的路径 1<form th:action="@{user/login}" method="post"></form> th:src : 外部资源引入 12<img th:src="@{../images/myself.jpg}"/><script th:src="@{../static/login.js}"></script> th:href : 定义超链接 1<a th:href="@{/user}"></a> th:remove : 用于删除 all : 删除所在标签及其全部内容 body : 不删除标签, 但删除子标签和其内容 tag : 删除所在标签, 不删除子标签 all-but-first : 删除除了第一个子标签以外的其他子标签 none : 什么都不删 1<tbody th:remove="${choice}? all : all-but-first"><tbody> th:object : 对象绑定 123<form th:object="${user}"> <input th:value="*{name}" /></form> 内置对象 123456789101112#dates : 日期格式化内置对象, 具体方法可以参照java.util.Date;#calendars : 类似于#dates, 但是是java.util.Calendar类的方法;#numbers: : 数字格式化;#strings : 字符串格式化, 具体方法可以参照java.lang.String, 如startsWith、contains等;#objects : 参照java.lang.Object;#bools : 判断boolean类型的工具;#arrays : 数组操作的工具;#lists : 列表操作的工具, 参照java.util.List;#sets : Set操作工具, 参照java.util.Set;#maps : Map操作工具, 参照java.util.Map;#aggregates : 操作数组或集合的工具;#messages : 操作消息的工具; 使用笔记 12345// 获取项目路径<meta name="ctx" th:content="${#httpServletRequest.getContextPath()}" />var _ctx = $("meta[name='ctx']").attr("content");"},{"title":"Vue 笔记二","date":"2020-04-02T18:31:26.000Z","updated":"2023-03-22T06:11:26.063Z","comments":true,"path":"deprecated/bak/vue-2.html","permalink":"https://bakasine.github.io/deprecated/bak/vue-2.html","excerpt":"","text":"Vue组件注册 Vue组件注册"},{"title":"Vue 笔记一","date":"2020-03-29T06:25:21.000Z","updated":"2023-03-22T06:11:26.063Z","comments":true,"path":"deprecated/bak/vue-1.html","permalink":"https://bakasine.github.io/deprecated/bak/vue-1.html","excerpt":"","text":"Vue环境搭建 Vue基本使用 Vue生命周期 Vue模板语法 Vue环境搭建 1.直接使用script标签引入或者使用CDN Vue下载 1<script src="https://cdn.jsdelivr.net/npm/vue/dist/vue.js"></script> Vue基本使用 12345678910<div id="app"> {{ msg }}</div>var vue = new Vue({ el : "#app", data : { msg : "Hello World" }} Vue生命周期 12345678910111213141516171819202122var vue = new Vue({ el : "#app", data : { msg : "Hello World" }, // 在实例还没有别完全创建出来之前执行 beforeCreate() {}, // 已经初始化好了Vue对象,一般可以在这里做初始数据的获取 created() {}, // 已经初始化完成但还没绑定到el上,一般可以在这里做初始数据的获取 beforeMount() {}, // 已经绑定到el上 mounted() {}, // data被修改时,页面还未重新渲染 beforeUpdate() {}, // data被修改后,页面也已经渲染完毕 updated() {}, // 销毁前执行($destroy方法被调用的时候就会执行),一般用于:清除计时器、清除非指令绑定的事件等 beforeDestroy() {}, // 销毁后执行($destroy方法被调用后执行),所有的事件监听器被移除,所有的子实例也都被销毁。 destroyed() {}}); Vue模板语法 12345678910111213141516171819202122232425262728293031323334353637383940<!-- v-text 更新元素的 text 和 {{}} 效果一样 --><p v-text="msg" v-once></p><p>{{ msg }}</p><!-- v-html 更新元素的页面。用 v-text 插入 html 语句会被 vue 当成字符串处理。 --><div v-html="html"></div><!-- v-show,为 true 显示,false 不显示。 --><p v-show="show"></p><!-- v-if,和 show 相似,区别在于需要满足 if 的条件才会渲染,而 show 是一定会渲染只是控制是否显示。 --><div v-if=""></div><div v-else-if=""></div><div v-else></div><!-- v-for --><div v-for="item in items"></div><div v-for="(item, index) in items"></div><div v-for="(val, key) in object"></div><div v-for="(val, name, index) in object"></div><!-- v-on 绑定事件监听器,可缩写成 @ --><button v-on:click="do"></button><button @click='do'></button><!-- v-bind 绑定属性或者特征,可缩写成 : --><img v-bind:src="imageSrc"><img :src="imageSrc"><!-- v-model 表单输入绑定。message 需要在 data 里提前定义 --><input v-model="message"><textarea v-model="message"></textarea><!-- 如果单个复选框要设置成bool值默认为字符串,多个复选框应该初始化为 [] 数组 --><input type="checkbox" v-model="message" id="checkbox"><input type="radio" value="" v-model="message"><select v-model="selected"> <option>A</option> <option>B</option> <option>C</option></select>"}],"posts":[{"title":"合订本","slug":"aq-collection","date":"2099-01-01T03:11:11.000Z","updated":"2024-06-21T16:07:47.300Z","comments":true,"path":"2099/01/01/aq-collection/","permalink":"https://bakasine.github.io/2099/01/01/aq-collection/","excerpt":"","text":"一. Mac M1 相关问题 Mac M1 遇到的问题 二. SSH 相关问题 1.SSH如何保持连接不自动断开 2.SSH使用跳板机 三. Linux 相关问题 1.Sed -e expression #1, char 14: unknown option to ‘s’ 2.安装应用后提示 Which services should be restarted 3.解决 vim 使用鼠标选择便进入 visual mode 的问题 四. Git 相关问题 1.删除Git仓库中的大文件 2.加速Git Clone 3.Git Bash乱码问题 五. 面试相关问题 面试相关 六. VPS 相关 1.纯 IPv6 怎么访问 IPv4 2.双栈网络设置 IPv4 优先 3.DD系统 七. Vim 相关 Vim 相关 八. Screen 相关 1.基本用法 SSH 相关问题 1.SSH 如何保持连接不自动断开 12345cat >> ~/.ssh/config << EOFHost * ServerAliveInterval 60EOF 2.SSH 使用跳板机 1.ProxyJump 123456Host target Hostname IdentityFile User Port ProxyJump jump 2.ProxyCommand 123456Host target Hostname IdentityFile User Port ProxyCommand ssh jump -W %h:%p Linux 相关问题 1.unknown option to ‘s’ sed使用变量替换,且变量含有’/'时 12345var="/etc/host"// 习惯写法sed -i "s/regex/$var/" file// 可用 # ~ 替换sed -i "s~regex~$var~" file 2.安装应用后提示 Which services should be restarted ubuntu默认安装 needrestart 导致 1apt purge needrestart -y 3.解决 vim 使用鼠标选择便进入 visual mode 的问题 输入 :set mouse-=a 或者直接 1234cat >> ~/.vimrc <<EOF:set mouse-=asyntax onEOF Git 相关问题 1.删除Git仓库中的大文件 12345678910111213# 找出大文件git rev-list --objects --all | grep "$(git verify-pack -v .git/objects/pack/*.idx | sort -k 3 -n | tail -5 | awk '{print$1}')"# 重写commit,删除大文件git filter-branch --force --index-filter 'git rm -rf --cached --ignore-unmatch LARGE_FILE_NAME' --prune-empty --tag-name-filter cat -- --all# 推送修改后的repogit push origin master --force# 清理和回收空间rm -rf .git/refs/original/git reflog expire --expire=now --allgit gc --prune=now 2.加速Git Clone 12345678910111213141516171819202122232425# 设置 Http Proxygit config --global http.proxy socks5://127.0.0.1:7890# 设置 SSH Proxyvim ~/.ssh/config# 1.Linux & macOScat ~/.ssh/configHost github.com Hostname ssh.github.com IdentityFile User git Port 443 ProxyCommand nc -v -x 127.0.0.1:7890 %h %p # 2.WindowsHost github.com Hostname ssh.github.com IdentityFile User git Port 443 ProxyCommand connect -S 127.0.0.1:7890 %h %p 3.Git Bash乱码问题 1234cat >> /etc/bash.bashrc << EOFexport LANG="zh_CN.UTF-8"export LC_ALL="zh_CN.UTF-8"EOF VPS 相关问题 1.纯 IPv6 怎么访问 IPv4 1wget -N https://gitlab.com/fscarmen/warp/-/raw/main/menu.sh && bash menu.sh 4 2.双栈网络设置 IPv4 优先 debian 1sed -i 's/#precedence ::ffff:0:0\\/96 100/precedence ::ffff:0:0\\/96 100/' /etc/gai.conf 撤回ipv6优先 1sed -i 's/precedence ::ffff:0:0\\/96 100/#precedence ::ffff:0:0\\/96 100/' /etc/gai.conf 3. DD 系统 DD 系统 Screen 相关 基本用法 1234567891011# 创建screen cmd# 保存退出ctrl+a d# lsscreen -ls# 重新连接screen -r 编号","categories":[{"name":"qa","slug":"qa","permalink":"https://bakasine.github.io/categories/qa/"}],"tags":[{"name":"qa","slug":"qa","permalink":"https://bakasine.github.io/tags/qa/"}]},{"title":"通过 Frp 实现内网穿透","slug":"frp","date":"2024-09-23T11:19:39.000Z","updated":"2024-09-29T11:53:40.405Z","comments":true,"path":"2024/09/23/frp/","permalink":"https://bakasine.github.io/2024/09/23/frp/","excerpt":"","text":"安装 配置服务端 配置客户端 用法 安装 下载链接 配置服务端 12345678910111213141516171819202122232425262728293031mkdir -p /root/tmptar --strip-components=1 -C /root/tmp -xvf 安装包mv -f /root/tmp/frps /usr/local/bin/azicat > /etc/systemd/system/azi.service <<EOF[Unit]Description = azi serverAfter = network.target syslog.targetWants = network.target[Service]Type = simpleExecStart = /usr/local/bin/azi -c /usr/local/etc/azi/config.tomlRestart=on-failureRestartSec=5[Install]WantedBy = multi-user.targetEOFsystemctl enable azimkdir -p /usr/local/etc/azi/cat > /usr/local/etc/azi/config.toml <<EOFbindPort = 8848bindAddr = "::"auth.token = "hentailolicon"EOFrm -r /root/tmp 配置客户端 123456789101112serverAddr = "服务端的IP"serverPort = 8848auth.token = "hentailolicon"[[proxies]]name = "ssh"type = "tcp"localIP = "::"localPort = 22remotePort = 2222transport.useEncryption = truetransport.useCompression = true Win11 安装 OpenSSH 12345设置 -> 系统 -> 可选功能 -> 添加可选功能 -> 搜索 OpenSSH搜索 OpenSSH 客户端 OpenSSH 服务器 -> 下一步 -> 安装win+r -> services.msc -> OpenSSH SSH Server -> 启动 开放端口 1win+r -> firewall.cpl -> 高级设置 -> 入站规则 -> 新建规则 用法 1ssh -p 2222 用户名@服务端ip","categories":[{"name":"tool","slug":"tool","permalink":"https://bakasine.github.io/categories/tool/"}],"tags":[{"name":"frp","slug":"frp","permalink":"https://bakasine.github.io/tags/frp/"}]},{"title":"Vim 相关","slug":"vim","date":"2024-03-11T18:44:26.000Z","updated":"2024-04-30T09:27:13.875Z","comments":true,"path":"2024/03/12/vim/","permalink":"https://bakasine.github.io/2024/03/12/vim/","excerpt":"","text":"12345678910111213141516171819202122232425262728293031323334353637viw // 选中单词CTRL + O // 光标跳转到之前的位置v%d // 复制整个括号的内容,需要用p粘贴daw // 删除光标所在的单词di" // 删除双引号内的文本d% // 删除整个括号内容,光标必须指向括号ctrl+v I 注释 ESC // 批量注释ctrl+v d // 批量取消注释 gg // 跳转顶部G // 跳转底部u // 撤回操作. // 重复上个操作/ // 搜索 n 下一项 N 上一项gg=G // 格式化:set nu // 显示行号:set nonu // 不显示行号"+y // 复制到粘贴板,必须 vim --version | grep clipboard 显示 +clipboardyy // 复制行dd // 剪切行p // 粘贴行:wq // 保存并退出。ZZ // 保存并退出。:q! // 不保存并退出。k j h l // 上 下 左 右","categories":[{"name":"note","slug":"note","permalink":"https://bakasine.github.io/categories/note/"}],"tags":[{"name":"vim","slug":"vim","permalink":"https://bakasine.github.io/tags/vim/"}]},{"title":"门罗币类钱包挖矿使用指北","slug":"monero-wallet","date":"2024-02-12T07:25:37.000Z","updated":"2024-02-17T15:43:29.531Z","comments":true,"path":"2024/02/12/monero-wallet/","permalink":"https://bakasine.github.io/2024/02/12/monero-wallet/","excerpt":"","text":"1./WALLET --start-mining ADDRESS --mining-threads "$(nproc)" --detach 运行 1234567891011121314# 在后台运行守护进程./monerod --detach# 查看日志文件tail -f ~/.bitmonero/bitmonero.log# 要求守护进程退出./monerod exit# 停止挖矿./monerod stop_mining# 恢复钱包./mangonote-wallet-cli --restore-from-seed","categories":[{"name":"mining","slug":"mining","permalink":"https://bakasine.github.io/categories/mining/"}],"tags":[{"name":"monero","slug":"monero","permalink":"https://bakasine.github.io/tags/monero/"}]},{"title":"N1 盒子 Openwrt 系统刷入","slug":"openwrt","date":"2024-01-16T06:43:59.000Z","updated":"2024-01-16T08:23:33.076Z","comments":true,"path":"2024/01/16/openwrt/","permalink":"https://bakasine.github.io/2024/01/16/openwrt/","excerpt":"","text":"准备 降级(可选) 刷机 旁路由 准备 下载固件Flippy版,官方版本 下载balenaEtcher 下载降级脚本(版本>2.19需要) 下载adb命令工具 降级 N1 盒子接上电源和显示器, 版本号大于2.19就需要进行降级 插上网线或者点击右下角连接 WIFI 后会显示 N1 盒子的 IP 插上无线鼠标点击4下版本号, 会显示adb打开 同一个网络下的电脑运行降级脚本 run.bat 输入 N1 盒子的 IP 刷机 电脑插上 U盘,打开 balenaEtcher 选择固件解压的 img文件 点击 Flash 拔下 N1 盒子的电源, 插上 U 盘后再接入电源 打开cmd 输入 adb.exe connect 盒子的IP, 然后输入 adb.exe reboot update Flippy版: 连接 N1 盒子发出的 Wi-Fi, 电脑访问 192.168.1.1 进入管理页面, 默认密码:password 点击左边的 系统 -> TTYD终端, 用户名: root, 密码: password 执行命令 cd /root && ./install-to-emmc.sh 根据不同的机器输入对应的数字, N1 盒子为 11, 执行完最后输入 1 显示 Successful··· 即安装成功, 拔掉 U盘 和 N1 电源线,重新插入启动即可 官方版本: 连接 N1 盒子发出的 Wi-Fi, 电脑访问 10.0.0.1 进入管理页面, 默认密码: root 点击左边的 服务 -> Terminal, 用户名: root, 密码: root 系统 -> 晶晨宝盒 -> 安装 OpenWrt -> 选择型号 -> 安装 显示 Successful··· 即安装成功, 拔掉 U盘 和 N1 电源线,重新插入启动即可 旁路由 网络 -> 接口 -> LAN 一般配置 协议: 静态协议 IPv4 地址: 主路由 IP 如果是 192.168.1.1, 就把最后位的 1 改成 255 以内的数 IPv4 网关: 填主路由的 IP, 一般为 192.168.1.1, 可以用 ipconfig 命令查看 设备: eth0 使用自定义的 DNS 服务器: 和IPv4 网关一致 DHCP 服务器 忽略此接口: 勾选 IPv6 设置: 前三项已禁用 接下来解决 IPv6 失效问题 再点击接口 -> 添加新接口 接口的名称: lan6 新接口协议: DHCPv6 客户端 自定义接口: @lan 创建后, 防火墙设置 lan 点击右下角的 保存&应用 网络 -> 防火墙 -> 自定义规则 添加后点击重启防火墙 1iptables -t nat -I POSTROUTING -o eth0 -j MASQUERADE 通信规则 -> 打开路由器端口 名称: all 协议: tcp+udp 外部接口: 不填为全部放行, 或者根据自己需求填写接口 点击添加后, 点击保存&应用 连接旁路由 正常连接主路由, DNS和路由器改为旁路由的IP, IP地址自设","categories":[{"name":"note","slug":"note","permalink":"https://bakasine.github.io/categories/note/"}],"tags":[{"name":"openwrt","slug":"openwrt","permalink":"https://bakasine.github.io/tags/openwrt/"},{"name":"openclash","slug":"openclash","permalink":"https://bakasine.github.io/tags/openclash/"}]},{"title":"矿机租赁","slug":"mining-rental","date":"2023-12-15T06:56:38.000Z","updated":"2023-12-15T07:34:34.052Z","comments":true,"path":"2023/12/15/mining-rental/","permalink":"https://bakasine.github.io/2023/12/15/mining-rental/","excerpt":"","text":"算力租赁平台 用法 算力租赁平台 miningrigrentals 用法 miningrigrentals 仅支持BTC LTC DOGE ETH BCH等支付方式,所以我们就选择手续费最低的DOGE作为矿机租赁费用来进行支付 充值: Balance -> Deposit Addresses 矿池参数: Favorite Pools -> Add A Pool 参数名 简介 Name 备注 Type 算法 Pool Host:Port 矿池地址:端口 Workername 钱包地址 租赁算力: Favorite Pools -> 左侧Marketplace -> 选择对应算法","categories":[{"name":"crypto","slug":"crypto","permalink":"https://bakasine.github.io/categories/crypto/"}],"tags":[{"name":"mining","slug":"mining","permalink":"https://bakasine.github.io/tags/mining/"}]},{"title":"CPU 挖矿工具 XMRIG 编译安装","slug":"mining-xmrig","date":"2023-11-27T06:49:36.000Z","updated":"2024-01-04T10:09:17.162Z","comments":true,"path":"2023/11/27/mining-xmrig/","permalink":"https://bakasine.github.io/2023/11/27/mining-xmrig/","excerpt":"","text":"脚本安装 工具下载 矿池 配置文件 查看数据 优化 问题集 脚本安装 1bash -c "$(curl -L https://cdn.jsdelivr.net/gh/uerax/script@master/xmrig.sh)" @ 工具下载 x86有编译好的版本(带捐赠) xmrig arm手动编译 编译流程 1.下载源码 123#需要自己编译apt-get install git build-essential cmake automake libtool autoconf -ygit clone https://github.com/xmrig/xmrig.git 2.去掉1%抽水,编辑 src/donate.h,将以下的数值改成0 12kMinimumDonateLevel=0kDefaultDonateLevel=0 3.编辑 src/net/strategies/DonateStrategy.cpp 1234将里面的kDonateHostkDonateHostTls改成自己的代理地址,如果没有修改,可以改成127.0.0.1 4.编译 1234mkdir xmrig/build && cd xmrig/scripts./build_deps.sh && cd ../buildcmake .. -DXMRIG_DEPS=scripts/depsmake -j$(nproc) 矿池 miningpools miningocean 配置文件 以miningocean为例 1234"algo": null,改为"algo": "RandomX","url": "donate.v2.xmrig.com:3333",改为"url": "hk-zephyr.miningocean.org:5432","user": "YOUR_WALLET_ADDRESS",改为你的mexc钱包地址"tls": false,改为"tls": true, 编写systemd文件 123456789101112cat > /etc/systemd/system/xmrig.service << EOF[Unit]Description=miner service[Service]ExecStart=/root/xmrig --config=/root/config.jsonCPUQuota=80%Restart=alwaysNice=10CPUWeight=1[Install]WantedBy=multi-user.targetEOF 开机自启 1systemctl enable xmrig 开始运行 1systemctl start xmrig 查看状态 1journalctl -fu xmrig 关闭自启 1systemctl disable xmrig 查看数据 统计数据和付款历史 挖矿数据 优化 启用hugepages,算力提升20-30%,会占用2.5GB内存 1bash -c "echo vm.nr_hugepages=1280 >> /etc/sysctl.conf" 问题集 服务器只有ipv6 12cp /etc/resolv.conf /etc/resolv.conf.bakecho -e "nameserver 2a01:4f8:c2c:123f::1\\nnameserver 2a00:1098:2c::1\\nnameserver 2a01:4f9:c010:3f02::1" > /etc/resolv.conf","categories":[{"name":"mining","slug":"mining","permalink":"https://bakasine.github.io/categories/mining/"}],"tags":[{"name":"note","slug":"note","permalink":"https://bakasine.github.io/tags/note/"},{"name":"zephyr","slug":"zephyr","permalink":"https://bakasine.github.io/tags/zephyr/"},{"name":"xmrig","slug":"xmrig","permalink":"https://bakasine.github.io/tags/xmrig/"}]},{"title":"面试相关记录","slug":"interview","date":"2023-10-25T11:39:34.000Z","updated":"2024-05-06T06:48:18.040Z","comments":true,"path":"2023/10/25/interview/","permalink":"https://bakasine.github.io/2023/10/25/interview/","excerpt":"","text":"Go Gin Redis Mysql 网络 Go make和new区别 123new: 分配内存清零并返回指针, 如果编译器发现 new 出来的内存在函数结束后就没有使用 且申请内存空间不是很大,那么 new 申请的内存空间还是会被分配在栈make: 用于slice,map,和channel的初始化并返回对象 内存逃逸 如果函数外部没有引用,则优先放到栈中 如果函数外部存在引用,则必定放到堆中 123456指针逃逸: - 函数返回指针 - interface{} 动态类型逃逸 - 栈空间不足 - 闭包 - 在切片上存储指针或带指针的值的时候, 对应的变量会逃逸 range 的 Bug 123456789101112131415v := []int{1,2,3,4,5}for _, v2 := range v { defer func () { fmt.Printf("v2: %v\\n", v2) }()}// v1.22.0 版本以前会输出5,5,5,5,5// v1.22.0 版本以后输出5,4,3,2,1v := []int{1,2,3,4,5}for _, v2 := range v { fmt.Printf("v2: %v\\n", v2)}// v1.22.0 版本以前会输出5,5,5,5,5// v1.22.0 版本以后输出1,2,3,4,5 defer关键字 1234栈顺序先进后出return 之后的语句先执行,defer 后的语句后执行defer 最大的功能是 panic 后依然有效defer 出现 panic 会覆盖掉前一个 panic 继续执行下一个 defer 12345678910111213141516171819202122func test() int { //无名返回 i := 9 defer func() { i++ }() return i // 最终返回 9 // 函数的返回值没有被提前声名,其值来自于其他变量的赋值 // 而defer中修改的也是其他变量,而非返回值本身,因此函数退出时返回值并没有被改变。} func test() (i int) { //有名返回i i = 9 defer func() { i++ }() return i // 最终返回 10 // 函数的返回值被提前声名,也就意味着defer中是可以调用到真实返回值的 // 因此defer在return赋值返回值 i 之后,再一次地修改了 i 的值 // 最终函数退出后的返回值才会是defer修改过的值。} 数组和切片 12数组: 长度固定, 数组作为函数参数时,函数操作的是数组的一个副本,不会影响原始数组切片: 长度可变, 当切片作为函数参数时,函数操作的是切片的引用,会影响原始切片 1切片扩容: append后len大于cap会触发扩容, cap小于1024翻倍,超过1024后每次扩容1.25倍 Map 1主要为bmap,每个bmap最多装8个key,当超过8个key会创建一个溢出桶指向新的bmap 1扩容: 元素个数大于bmap*6.5 或者 溢出桶的数量过多 Sync Map 12345678910主要是空间换时间的概念,通过read和dirty两个map来实现read读操作不加锁,读取不到数据后会对read加锁再读一次,然后再去dirty读取1.当read miss次数过多会将原本read删除然后dirty提升为read2.使用内置range函数当read和dirty不一致时也会触发dirty提升机制3.删除元素read有直接删除,没有则去dirty执行删除4.新增修改 - 在read中查找key,找到了则通过原子操作,尝试更新value - key在read中存在,但是被标记为已删除,则kv加入dirty中,并更新value值 - key在read中不存在,但在dirty中存在,则直接在dirty中更新value - key在read和dirty中都不存在,则直接在dirty中加入kv Channel 1主要由一个循环链表加上读写下标, 加上两个等待队列(双向链表) GMP 线程由 CPU 调度是抢占式的,协程由用户态调度是协作式的,一个协程让出 CPU 后,才执行下一个协程 因为它是发生在操作系统的用户态的,不需要进入内核态进行系统调用,操作系统的上下文切换会带来很大的开销,切goroutine和线程一样,共享堆,不共享栈。 12线程: 由1个用户态和1个内核态组成, 内存占用高, 线程调度消耗大协程: 通过调度器将N个用户态和M个内核态组成, 占用内存更小(几kb可扩容), 调度更灵活 G: Goroutine,它携带上下文运行的信息,是需要允许的任务 M: Machine,即一个真正的系统线程 P: Processor处理器,负责把Goroutine调度到M上 12341.P在程序开始的时候就会创建,根据参数GOMAXPROCS(默认为cpu核数)2.每次新建一个G时,都会尝试去唤醒其它的M,我们称它为M2,M2同样也会找一个P2去依附,但此时,P2本地没有可执行的G,那它这时候的策略就是去全局队列里面去偷n个G.3.如果全局队列里面再没有G的话, 就去其他P的本地队列里面去偷一半的数量过来,这就是work-stealing机制。4.如果其他P本地队列里面还是没有G的话,系统线程M就会进入自旋状态而不是销毁,因为我们希望我当有新的G创建时,能立刻有M运行它。 GC 12345白色对象 - 潜在的垃圾,表示还未搜索到的对象,其内存可能会被垃圾收集器回收黑色对象 - 活跃的对象,表示搜索完成的对象,包括不存在任何引用外部指针的对象以及从根对象可达的对象灰色对象 - 活跃的对象,表示正在搜索还未搜索完的对象,因为存在指向白色对象的外部指针,垃圾收集器会扫描这些对象的子对象 123451.初始时所有对象都是白色的2.从gc root对象出发,扫描所有可达对象标记为灰色,放入待处理队列3.从队列取出一个灰色对象并标记为黑色,将其引用对象标记为灰色,放入队列4.重复上一步骤,直到灰色对象队列为空5.此时剩下的所有白色对象都是垃圾对象 强三色不等式: 黑色不能直接指向白色 弱三色不等式: 黑色可以指向白色,但是需要白色间接被灰色指向 删除屏障: B对象失去A对象的引用时,如果B对象是个白色对象,那么它会变成灰色对象,这一点是为了满足弱三色不变式 插入屏障: 实现强三色不变式,保证当一个黑色对象指向一个白色对象前,会先触发屏障将白色对象置为灰色 三色标级+混合屏障: gc开始时所有栈标记为黑色, 以满足弱三色不等式 Gin 动态路由 通过字典树实现 中间件原理 http请求来到时先经过中间件,主要由一个函数切片通过index下标访问 Redis 基本数据类型 123456789101112131415string - 底层: 动态字符串,最大为512M - 应用场景:缓存对象、常规计数、分布式锁、共享 session 信息等。list - 底层: 双向链表 - 应用场景:消息队列hash - 底层: 哈希表 - 应用场景:缓存对象、购物车等set - 底层: 哈希表 - 应用场景:聚合计算(并集、交集、差集)场景,比如点赞、共同关注、抽奖活动等zset - 底层: 跳表 - 应用场景:排序场景,比如排行榜、电话和姓名排序等。 为什么快 1231.操作都是在内存中操作,再加上Redis自身的数据结构优化2.采用单线程防止了多线程之间的竞争,避免线程切换带来的时间开销3.采用IO多路复用即select/epoll机制,实现一个线程来处理多个IO 持久化 1234AOF日志: 命令追加方式写入文件, 性能差,体积大,恢复速度慢,保证数据完整性RDB快照: 某一时刻内存数据的快照保存, 保存频率高影响性能,频率低数据丢失混合持久化: 集成了 AOF 和 RBD, 前半部分为RDB格式的全量数据,后半部分为AOF的增量数据 集群 123456789101.主从复制主服务器负责读写,从服务器负责只读由于数据同步是异步的所以存在数据不一致的问题2.哨兵模式在主从的基础上增加了一个哨兵节点, 哨兵持续与服务器心跳交互通过投票算法: 以配置文件的优先级 复制偏移量 runid大小进行判断3.切片集群模式类似bitmap的方式进行存储分配 过期删除与内存淘汰 12惰性删除策略: key过期不做操作,当对key进行查询才会判断过期并删除返回null定期删除策略: 每隔一段时间抽取一定量的key检查是否过期,如果过期率大于25%重复开头操作 1234567891011121314151、不进行数据淘汰的策略(默认策略)当运行内存超过最大设置内存时,不淘汰任何数据直接返回错误2、进行数据淘汰的策略在设置了过期时间的数据中进行淘汰:volatile-random:随机淘汰设置了过期时间的任意键值;volatile-ttl:优先淘汰更早过期的键值。volatile-lru(Redis3.0 之前,默认的内存淘汰策略):淘汰所有设置了过期时间的键值中,最久未使用的键值;volatile-lfu(Redis 4.0 后新增的内存淘汰策略):淘汰所有设置了过期时间的键值中,最少使用的键值;在所有数据范围内进行淘汰:allkeys-random:随机淘汰任意键值;allkeys-lru:淘汰整个键值中最久未使用的键值;allkeys-lfu(Redis 4.0 后新增的内存淘汰策略):淘汰整个键值中最少使用的键值。 缓存雪崩、击穿、穿透 12345678缓存雪崩: 大量缓存数据在同一时间过期(失效)或者 Redis 故障宕机 - 解决方案: 互斥锁, 均匀设置过期时间 缓存击穿: 某个热点数据过期 - 解决方案: 互斥锁, 热点数据不设置过期时间缓存穿透: 大量请求既不在缓存中,也不在数据库中的数据 - 解决方案: 缓存空值或者默认值, 布隆过滤器(类似bitmap) Mysql 索引 123456789101112B+树: - 主键索引(聚簇索引): 根节点按顺序存放索引, 叶子节点双向链表并存放数据 - 二级索引: 根节点按顺序存放索引, 叶子节点双向链表只存放索引和主键 - 联合索引(复合索引): 最左匹配原则 - 根节点按最左侧字段顺序存放多个索引, 叶子节点双向链表并存放多个索引和主键 - 联合索引的最左匹配原则,在遇到范围查询(如 >、<)的时候,就会停止匹配 - 也就是范围查询的字段可以用到联合索引,但是在范围查询字段的后面的字段无法用到联合索引。 - 注意,对于 >=、<=、BETWEEN、like 前缀匹配的范围查询,并不会停止匹配 什么时候需要 / 不需要创建索引 索引最大的好处是提高查询速度,但是索引也是有缺点的,比如: 1231.需要占用物理空间,数量越大,占用空间越大;2.创建索引和维护索引要耗费时间,这种时间随着数据量的增加而增大;3.会降低表的增删改的效率,因为每次增删改索引,B+ 树为了维护索引有序性,都需要进行动态维护。 需要索引 1231.字段有唯一性限制的,比如商品编码2.经常经常where条件查询的字段3.经常用于group by和order by的字段 不需要索引 12341.极少作为查询条件的字段2.大量重复数据3.数据少4.经常维护修改的数据 索引失效 12341.左或者左右模糊匹配的时候,也就是 like %xx 或者 like %xx%这两种方式都会造成索引失效;2.查询条件中对索引列做了计算、函数、类型转换操作,这些情况下都会造成索引失效;3.使用联合索引没有按照最左匹配原则会导致失效4.where语句中or存在没有添加索引的字段。 事务 1特性: 原子性,一致性,隔离性,持久性 12345678910111213读未提交: 指一个事务还没提交时,它做的变更就能被其他事务看到读已提交: 指一个事务提交之后,它做的变更才能被其他事务看到 - 解决脏读: 一个事务还没提交的修改数据被读取到可重复读(默认): 指一个事务执行过程中看到的数据,一直跟这个事务启动时看到的数据是一致的 - 解决不可重复读: 一个事务第一次读取到的数据,在第二次读取之前被另一个事务提交修改 导致两次读取的数据不一样串行化: 会对记录加上读写锁,在多个事务对这条记录进行读写操作时,如果发生了读写冲突的时候,后访问的事务必须等前一个事务执行完成,才能继续执行 - 解决幻读: 一个事务第一次查询结果5条数据,在第二次读取之前另一个事务添加并提交了一条新数据 导致第二次查询结果为6条数据 网络 http,https和http2.0 http1.1: 新增tcp长连接, 增加缓存处理, 断点续传 http2.0: header压缩, 多个request共用一个连接(多路复用), 二进制格式传输, 服务器推送 https: ca证书加密,端口修改","categories":[{"name":"note","slug":"note","permalink":"https://bakasine.github.io/categories/note/"}],"tags":[{"name":"interview","slug":"interview","permalink":"https://bakasine.github.io/tags/interview/"}]},{"title":"Clash 基础用法","slug":"clash","date":"2023-08-29T06:43:59.000Z","updated":"2023-10-16T16:20:39.340Z","comments":true,"path":"2023/08/29/clash/","permalink":"https://bakasine.github.io/2023/08/29/clash/","excerpt":"","text":"安装 修改内核 如何开启tun模式 配置模板 安装 Meta内核 Clash.Meta 客户端 ClashX.Meta Clash for Windows Clash Verge 修改内核 Mac上可以直接使用ClashX.Meta原生支持3种Clash Core, 如果使用Clash for Windows默认不支持Meta Core, 但是可以手动更换 用Meta.Clash的内核更换 resources -> static -> files -> win -> x64 -> clash-win64.exe 如何开启tun模式 Clash for Windows Clash for Windows要启动tun模式需要安装Service Mode, 但是由于他做了内核校验我们更换成Meta内核后会安装失败 所以可以考虑使用管理员打开应用强行启动tun模式 Clash Verge Verge有便携版和安装包,根据issue反馈发现便携版开启tun会有一些问题,而使用安装包则不会出现问题 配置模板 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274#---------------------------------------------------### 配置文件需要放置在 $HOME/.config/clash/*.yaml## 这份文件是clashX的基础配置文件,请尽量新建配置文件进行修改。## !!!只有这份文件的端口设置会随ClashX启动生效## 如果您不知道如何操作,请参阅 官方Github文档 https://github.com/Dreamacro/clash/blob/dev/README.md#---------------------------------------------------## (HTTP and SOCKS5 in one port)mixed-port: 7890external-controller: 127.0.0.1:9090allow-lan: truemode: rulelog-level: silenttun: enable: false stack: system # gvisor / lwip / system dns-hijack: - 0.0.0.0:53 # 需要劫持的 DNS inet4-route-address: # 启用 auto_route 时使用自定义路由而不是默认路由 - 0.0.0.0/1 - 128.0.0.0/1 inet6-route-address: # 启用 auto_route 时使用自定义路由而不是默认路由 - "::/1" - "8000::/1"dns: enable: true prefer-h3: true listen: 0.0.0.0:53 ipv6: false default-nameserver: - 114.114.114.114 nameserver: - tls://223.5.5.5:853 - 114.114.114.114 - 119.29.29.29 - 180.76.76.76 enhanced-mode: fake-ip fake-ip-range: 198.18.0.1/16 fallback: - tls://8.8.4.4 - tls://1.1.1.1 fake-ip-filter: - "*.lan" - "*.localdomain" - "*.example" - "*.invalid" - "*.localhost" - "*.test" - "*.local" - "*.home.arpa" - router.asus.com - localhost.sec.qq.com - localhost.ptlogin2.qq.com - "+.msftconnecttest.com"proxies: # Demo - name: "Demo" type: trojan server: Demo port: 443 password: Demo # udp: true # sni: example.com # aka server name alpn: - h2 - http/1.1 # skip-cert-verify: trueproxy-groups: # 代理节点选择 - name: "PROXY" type: select proxies: - "Demo" # 白名单模式 PROXY,黑名单模式 DIRECT - name: "Final" type: select proxies: - "DIRECT" - "PROXY" - name: "Bilibili" type: select proxies: - "DIRECT" - "PROXY"script: code: | def main(ctx, metadata): # Log ProcessName ctx.log('Process Name: ' + ctx.resolve_process_name(metadata)) return 'DIRECT'rule-providers: bilibili: type: http behavior: classical url: "https://raw.githubusercontent.com/blackmatrix7/ios_rule_script/master/rule/Clash/BiliBili/BiliBili.yaml" path: ./ruleset/bilibili.yaml interval: 86400 reject: type: http behavior: classical url: "https://raw.githubusercontent.com/blackmatrix7/ios_rule_script/master/rule/Clash/Advertising/Advertising_Classical.yaml" path: ./ruleset/reject.yaml interval: 86400 privacy: type: http behavior: classical url: "https://raw.githubusercontent.com/blackmatrix7/ios_rule_script/master/rule/Clash/Privacy/Privacy_Classical.yaml" path: ./ruleset/privacy.yaml interval: 86400 hijacking: type: http behavior: classical url: "https://raw.githubusercontent.com/blackmatrix7/ios_rule_script/master/rule/Clash/Hijacking/Hijacking.yaml" path: ./ruleset/hijacking.yaml interval: 86400 icloud: type: http behavior: classical url: "https://cdn.jsdelivr.net/gh/blackmatrix7/ios_rule_script@master/rule/Clash/iCloud/iCloud.yaml" path: ./ruleset/icloud.yaml interval: 86400 apple: type: http behavior: domain url: "https://cdn.jsdelivr.net/gh/Loyalsoldier/clash-rules@release/apple.txt" path: ./ruleset/apple.yaml interval: 86400 google: type: http behavior: domain url: "https://cdn.jsdelivr.net/gh/Loyalsoldier/clash-rules@release/google.txt" path: ./ruleset/google.yaml interval: 86400 proxy: type: http behavior: domain url: "https://cdn.jsdelivr.net/gh/Loyalsoldier/clash-rules@release/proxy.txt" path: ./ruleset/proxy.yaml interval: 86400 direct: type: http behavior: domain url: "https://cdn.jsdelivr.net/gh/Loyalsoldier/clash-rules@release/direct.txt" path: ./ruleset/direct.yaml interval: 86400 private: type: http behavior: domain url: "https://cdn.jsdelivr.net/gh/Loyalsoldier/clash-rules@release/private.txt" path: ./ruleset/private.yaml interval: 86400 gfw: type: http behavior: domain url: "https://cdn.jsdelivr.net/gh/Loyalsoldier/clash-rules@release/gfw.txt" path: ./ruleset/gfw.yaml interval: 86400 greatfire: type: http behavior: domain url: "https://cdn.jsdelivr.net/gh/Loyalsoldier/clash-rules@release/greatfire.txt" path: ./ruleset/greatfire.yaml interval: 86400 tld-not-cn: type: http behavior: domain url: "https://cdn.jsdelivr.net/gh/Loyalsoldier/clash-rules@release/tld-not-cn.txt" path: ./ruleset/tld-not-cn.yaml interval: 86400 telegramcidr: type: http behavior: ipcidr url: "https://cdn.jsdelivr.net/gh/Loyalsoldier/clash-rules@release/telegramcidr.txt" path: ./ruleset/telegramcidr.yaml interval: 86400 cncidr: type: http behavior: ipcidr url: "https://cdn.jsdelivr.net/gh/Loyalsoldier/clash-rules@release/cncidr.txt" path: ./ruleset/cncidr.yaml interval: 86400 lancidr: type: http behavior: ipcidr url: "https://cdn.jsdelivr.net/gh/Loyalsoldier/clash-rules@release/lancidr.txt" path: ./ruleset/lancidr.yaml interval: 86400 applications: type: http behavior: classical url: "https://cdn.jsdelivr.net/gh/Loyalsoldier/clash-rules@release/applications.txt" path: ./ruleset/applications.yaml interval: 86400 my-direct: type: http behavior: classical url: "https://raw.githubusercontent.com/bakasine/rules/master/clash/my-direct.yaml" path: ./ruleset/my-direct.yaml interval: 86400 my-proxy: type: http behavior: classical url: "https://raw.githubusercontent.com/bakasine/rules/master/clash/my-proxy.yaml" path: ./ruleset/my-proxy.yaml interval: 86400 my-reject: type: http behavior: classical url: "https://raw.githubusercontent.com/bakasine/rules/master/clash/my-reject.yaml" path: ./ruleset/my-reject.yaml interval: 86400 Optimization: type: http behavior: classical url: "https://raw.githubusercontent.com/bakasine/rules/master/clash/optimization.yaml" path: ./ruleset/optimization.yaml interval: 86400rules: # REJECT - RULE-SET,reject,REJECT - RULE-SET,privacy,REJECT - RULE-SET,hijacking,REJECT - RULE-SET,my-reject,REJECT # CUSTOM - RULE-SET,my-direct,DIRECT - RULE-SET,bilibili,Bilibili # PROXY - RULE-SET,my-proxy,PROXY - RULE-SET,icloud,PROXY - RULE-SET,telegramcidr,PROXY - RULE-SET,proxy,PROXY # DIRECT - RULE-SET,applications,DIRECT - RULE-SET,private,DIRECT - RULE-SET,apple,DIRECT - RULE-SET,google,DIRECT - RULE-SET,direct,DIRECT - RULE-SET,lancidr,DIRECT - RULE-SET,cncidr,DIRECT - GEOIP,LAN,DIRECT - GEOIP,CN,DIRECT # FINAL - MATCH,Final","categories":[{"name":"note","slug":"note","permalink":"https://bakasine.github.io/categories/note/"}],"tags":[{"name":"clash","slug":"clash","permalink":"https://bakasine.github.io/tags/clash/"},{"name":"cfw","slug":"cfw","permalink":"https://bakasine.github.io/tags/cfw/"}]},{"title":"发行自己的加密货币并上架去中心交易所","slug":"crypto","date":"2023-06-05T11:58:19.000Z","updated":"2023-08-20T12:56:46.124Z","comments":true,"path":"2023/06/05/crypto/","permalink":"https://bakasine.github.io/2023/06/05/crypto/","excerpt":"","text":"前 言 很多人都听过defi项目,也在uniswap或pancake上买过新币。uniswap与pancakeswap这种去中心化的平台其实每个人都可以成为自主的买家和卖家,发行自己的代币放上到平台进行交易,下面教程就是教大家怎么去部署一个自己的加密货币 一、发币准备(所需工具及代码): Chrome MetaMask Remix 二、合约部署发币: 1. 打开Remix open remix -> create new file token.sol -> paste all code 2. 编译 check all parameters -> compiles 3. 链接钱包 injected provider - metamask -> connect -> must choose ACprotocol -> transact 4. 添加代币 copy token -> add coins 三、上架去中心化交易所 ETH链: UniSwap BSC链: PancakeSwap 1.打开流动池页面,并连接 MetaMask 钱包,按下图操作: 2.按下图:点击 创建币对 3.第一个币选择所在公链原生代币(ETH链选ETH,BSC链选BNB),也可以使用USDT,但还是推荐使用ETH或BNB效果较好,第二个币点击 选择代币 --> 粘贴新币的合约地址 --> 导入 --> 导入,按下图步骤操作 4. 分别设置注入流动池的 ETH 与 新币 的数量比例,点击供应 --> 确认数量比例,点击 创建流动池和供应流动资金 --> 小狐狸钱包会弹出支付框,核对ETH数量与手续费后,点击确认, 按以下图示操作:(注意:流动池比例需自己计算好,比例决定新币初始价格,且初次注入流动性后,比例无法再次调整的,以后只能按这个比例随时增加减少或撤销流动池的币,如果要更改比例只能重新发一个币) 四、撤销流动池 撤销流动池后,所有币都会回流到你自己的钱包(包括上架时添加的价值币、别人买新币花费的价值币及剩余的新币),按下图步骤操作: 五、开源教程 到 ETH link, BSC link --> 粘贴代币合约地址 --> 搜索,如下图: 六、参考 Telegra.ph","categories":[{"name":"others","slug":"others","permalink":"https://bakasine.github.io/categories/others/"}],"tags":[{"name":"note","slug":"note","permalink":"https://bakasine.github.io/tags/note/"},{"name":"crypto","slug":"crypto","permalink":"https://bakasine.github.io/tags/crypto/"},{"name":"contract","slug":"contract","permalink":"https://bakasine.github.io/tags/contract/"}]},{"title":"giffgaff 申请和保号","slug":"giffgaff","date":"2023-05-15T10:36:03.000Z","updated":"2023-08-20T12:56:37.533Z","comments":true,"path":"2023/05/15/giffgaff/","permalink":"https://bakasine.github.io/2023/05/15/giffgaff/","excerpt":"","text":"申请方式 申请地址 Order your free SIM -> No thanks, I just want a free SIM 以下是我成功申请并收到的例子 Your details label 例子 First name Hua Last name Li Email [email protected] Country China Address line 1 134,Xiashayifan,Xiashacun,Futianqu Address line 2 (optional) 填你的手机号 Town/City Shenzheng County/Province/State (optional) Guangdong Postcode/Zip 518047 激活 激活地址 billing address label 例子 First name Hua Last name Li Country United Kingdom Address line 1 53 Scrimshire Lane Town/City ASTON Postcode/Zip CH5 7HD 资费 1.接打电话 1 英镑/分钟 2.发短信 0.3 英镑/条 3.收短信免费 4.流量 0.2 英镑/Mb 保号方式 180天消费一次即可,任意消费一次,即可长期使用 1234打电话 1英镑/分钟接电话 1英镑/分钟发短信 0.3英镑/条流量上网 0.2英镑/MB","categories":[{"name":"others","slug":"others","permalink":"https://bakasine.github.io/categories/others/"}],"tags":[{"name":"sim","slug":"sim","permalink":"https://bakasine.github.io/tags/sim/"}]},{"title":"B站下架视频搜索和弹幕获取","slug":"search-danmuku","date":"2023-04-30T11:14:57.000Z","updated":"2023-04-30T16:30:42.750Z","comments":true,"path":"2023/04/30/search-danmuku/","permalink":"https://bakasine.github.io/2023/04/30/search-danmuku/","excerpt":"","text":"起因 之前我写过一篇关于找到B站下架视频历史弹幕的文章,里面有两个途径去获取历史弹幕 然而这两个方式本质上都是大家自己上传保存,一旦遇到冷门的番剧就会发现查无此弹幕 最全的弹幕库还是B站自己的数据库,所以这次我们直接通过番名去B的数据库下载弹幕文件 历史弹幕 获取CID号 biliplus 这个平台以前可以直接下载弹幕现在已经不支持了,不过没关系我们可以自己下载.打开网站后 1.点击展开更多选项 -> 数据源 -> biliplus站内搜索 接下来就可以关键词搜索了,可以用条件限制以缩小范围,如输入’秋叶原之旅 @连载动画’结果将只包含连载动画分区的视频 需要注意一部分较早或非官方的投稿并不在对应的分区中检索时不应该限制分区. 下面给出了一部分常用的分区名,具体参见文档 连载动画 完结动画 日本电影 国产剧 海外剧 此外如输入秋叶原之旅 @m=928123,结果将只包含哔哩哔哩番剧投稿的视频 其中928123为哔哩哔哩番剧的mid号,可以在其个人空间的链接中找到 下表给出了一部分官方账号的mid 官方账号 mid 哔哩哔哩番剧 928123 哔哩哔哩番剧出差 11783021 哔哩哔哩电影 15773384 迷影社 4856007 2.搜索后可以得到我们想要的AV号 3.其实有av号就可以用现有的接口转成cid了,不过biliplus有提供该功能 有兴趣可以去看大佬搜集的api文档 点击打开 -> 视频cid历史 下载弹幕并转换 方法一 bilitool 大佬提供的根据AV号或者cid的在线获取合并工具 方法二 注: 以下接口可能会因为B站更新而失效,可以去api文档替换 cid号粘贴到该链接最后并访问下载,segment_index=1为0-6分钟的弹幕,需要根据视频时长不断递增才能得到完整弹幕 1https://api.bilibili.com/x/v2/dm/web/seg.so?type=1&segment_index=1&oid= 下载后可以看到是个seg.so文件,我们可以直接用现成的在线转换 也可以自己写一个解析代码去转换,有兴趣可以看看这个文档 将seg.so转换成ass格式 ass-danmaku-online 将ass格式转换成xml格式 danmubox 至此我们的弹幕文件就下好了","categories":[{"name":"others","slug":"others","permalink":"https://bakasine.github.io/categories/others/"}],"tags":[{"name":"danmu","slug":"danmu","permalink":"https://bakasine.github.io/tags/danmu/"}]},{"title":"备用手机短信转发方案","slug":"sms-forward","date":"2023-04-07T06:55:41.000Z","updated":"2023-04-07T08:08:31.959Z","comments":true,"path":"2023/04/07/sms-forward/","permalink":"https://bakasine.github.io/2023/04/07/sms-forward/","excerpt":"","text":"一. 起因 由于越来越多账号不支持国内手机和GV注册 所以最近买了张免年费的国外SIM卡来使用 但是卡一多问题就出来了,出门不爱带包两个手机踹口袋裤子都要掉了 所以不得不找个方案, 让我出门只需要带一个手机 二. Android 备用机的转发方案 1.SmsForwarder + Telegram Bot SmsForwarder SmsForwarder是个Github上的开源库,支持监控Android手机短信、来电、APP通知并转发 同时也包括远程控制发短信发短信、查短信、查通话、查话簿、查电量等功能 这边根据官方文档给出一个简单的搭建流程,如果不想使用Telegram Bot可以去看文档自行配置 通用设置 按需打开转发功能的总开关,会弹出必需的权限授权;如果授权不正常,请去手机的【设置】中手动设置权限(无脑全部授予) 保活措施建议开启前3项设置 个性设置中卡槽备注点击刷新自动获取,如果转发信息中的卡槽匹配错误,根据SubId设置卡槽主键 如果设备处在网络不稳定的环境,请设置请求重试机制的重试次数 发送通道 我是用Telegram作为转发的工具,也可以使用SMS或者邮箱之类的 申请Telegram Bot 1234567891011与 @BotFather 私聊,申请 Bot发送/newbot 后输入机器人昵称然后输入机器人的用户名/token 获取apiToken,然后输入上面机器人的用户名获得apiToken,格式参考:1234567890:ABCDEFGHIJKLMNOPQRSTUVWXYZ复制 apiToken 到「设置Telegram机器人的ApiToken」一栏跟自己的机器人聊天,随便说点什么;或者创建一个群组,把机器人拉入群组,在群组里随便说点什么。然后打开这个链接 https://api.telegram.org/bot<apiToken>/getUpdates 获取(PS.注意<apiToken>整个换成你自己的)ChatID 取值 result->message->chat->id (个人是纯数字;群组是负数,type:group;)获取自己(或群组)的ChatID,粘贴到「设置被通知人的ChatId」一栏点击【测试】按钮验证一下 通话转发规则 发送通道选择刚刚添加的Telegram Bot 执行逻辑 -> 成功即止 匹配字段 -> 全部 启用该条转发规则 然后就可以发一条短信进行测试,如果有问题那就看文档或者自己Google 2. Tasker + Telegram Bot 注: Tasker是收费App 申请Telegram Bot 1234567891011与 @BotFather 私聊,申请 Bot发送/newbot 后输入机器人昵称然后输入机器人的用户名/token 获取apiToken,然后输入上面机器人的用户名获得apiToken,格式参考:1234567890:ABCDEFGHIJKLMNOPQRSTUVWXYZ复制 apiToken 到「设置Telegram机器人的ApiToken」一栏跟自己的机器人聊天,随便说点什么;或者创建一个群组,把机器人拉入群组,在群组里随便说点什么。然后打开这个链接 https://api.telegram.org/bot<apiToken>/getUpdates 获取(PS.注意<apiToken>整个换成你自己的)ChatID 取值 result->message->chat->id (个人是纯数字;群组是负数,type:group;)获取自己(或群组)的ChatID,粘贴到「设置被通知人的ChatId」一栏点击【测试】按钮验证一下 创建 Task 添加一个 HTTP Request 动作: Method 选 POST URL 一栏填写:https://api.telegram.org/bot<你的TOKEN>/sendMessage Headers 一栏填写:Content-Type:application/json (可以点击放大镜快速选择) Body内容填写如下(记得chat_id替换为你的uid): 12345{ "chat_id": <YOUR_CHAT_ID>, "parse_mode": "HTML", "text": "<b>%SMSRF(%SMSRN)</b> \\n\\n%SMSRB\\n\\n 时间:%SMSRD"} 其中用到了几个 Tasker 自带的变量: %SMSRF:sender address 地址 %SMSRN:sender name 通讯录中的名称或号码 %SMSRB:主体(短信内容) %MMSRS:主题(一般彩信才有) %SMSRD:接收日期 %SMSRT:接收时间 创建 Profile 来调用 Tasker 切换到 Tasker 的 PROFILES 选项卡,添加一个 Event 类型的 Profile :Phone > Received Text,按需求配置是否需要过滤类型,发送者和内容。 创建之后选择链接到刚刚创建的 Task就完成了。 三. Iphone 备用机的转发方案 iphone应用默认是没权限读取短信内容,然后快捷指令自动化还强制必须指定关键词或者联系人,暂时没找到转发给Android的方式 1. 转发到Iphone 123456在iPhone上启动设置转到消息切换iMessage查找并点按短信转发找到想要接收和发送短信的 iOS 设备(只有同一个apple id的设备才会显示在里面)验证码将发送到请求的设备 没有两台iphone没法测试, 看有些大佬反馈不同wifi下同步会有问题, 所以备用机还是用Android吧","categories":[{"name":"others","slug":"others","permalink":"https://bakasine.github.io/categories/others/"}],"tags":[{"name":"sms","slug":"sms","permalink":"https://bakasine.github.io/tags/sms/"}]},{"title":"Meta AI开源抠图模型使用","slug":"segment-anything","date":"2023-04-06T08:36:26.000Z","updated":"2023-04-06T09:25:09.900Z","comments":true,"path":"2023/04/06/segment-anything/","permalink":"https://bakasine.github.io/2023/04/06/segment-anything/","excerpt":"","text":"一. Segment Anything segment-anything 貌似需要代理才能问他们的官网, 他们也提供了Github库可以本地搭建 二. 食用方法 Hover & Click 先随便选一张简单的构图测试一下效果 鼠标移动的时候会自动选中鼠标所在位置的一个整体 点击左键就会被选中,如果他扣的不完整,可以左键选中没选中的部分 如果选到了不需要的部分,左边面板选择Remove Area后去点击不需要的部分即可清楚 选择完毕后,点击左边面板的Cut out object即可输出 这是输出的效果,能看出识别率还可以,就是没有羽化所以显得边缘不太平整 Box 除了第一种点击选中,类似PS的模板的使用方法外 他还提供了Box方法,鼠标长按拉动选中后自动识别物体 这次我们使用一张复杂一点的图片看看效果 这个选中框全部选中的单位才会被识别,只有部分被选中则不会被识别到 整体识别率还行,就是如果图片太大干扰物太多会导致选中一些奇怪的东西 Everything Segment Anything还提供一种全自动的抠图方式 这个方式会自动帮你选择图内的所有物体,并且输出为单独一个文件 我们放一张物体非常多的图, 扫描的时间大概在2-3秒 果然豆子这种一堆的他就没办法正常抠出了 白萝卜这种就能正常识别,但是边缘处理还是不太行 三. 总结 总体来看效果还是比较一般,虽然处理速度和识别率还可以 不过作为一个辅助工具已经是合格了,虽然效果不如removebg 但是胜在开源和免费,希望后面继续更新能把边缘处理好","categories":[{"name":"others","slug":"others","permalink":"https://bakasine.github.io/categories/others/"}],"tags":[{"name":"cutout","slug":"cutout","permalink":"https://bakasine.github.io/tags/cutout/"}]},{"title":"一些好用的免费工具推荐","slug":"useful-tools","date":"2023-04-03T13:44:33.000Z","updated":"2023-04-03T14:33:03.469Z","comments":true,"path":"2023/04/03/useful-tools/","permalink":"https://bakasine.github.io/2023/04/03/useful-tools/","excerpt":"","text":"由于本人不喜欢下载app, 所以推荐的都是直接线上使用的工具 图片出处 saucenao 你还在因为群友随手发的一张本子截图而到处搜索吗 还在因为搜索不到结果疯狂艾特群友而得不到答案着急吗 那就赶紧用上这个工具吧,一些本子和动漫动图都能搜到出处 在加上现在google搜图不支持动图后,可用性更高了 缺点只有动画、漫画、插画作品、二次元这类图片 效果: 自动扣图 remove.bg 在线抠图网站, 抠图速度很快而且准确度很高(比我自己扣的好) 缺点是免费账号只能下载低分辨率的图, 要高分辨率需要付费充值 也可以直接使用他提供的api来抠图,免费账号每个月有40次的使用上限 效果: 在线图片压缩 tinypng 在线图片压缩网站, 一般有写博客的会需要 当然有一些大佬会选择放到图床, 但是我更喜欢压缩完储存到本地 效果:","categories":[{"name":"others","slug":"others","permalink":"https://bakasine.github.io/categories/others/"}],"tags":[{"name":"tools","slug":"tools","permalink":"https://bakasine.github.io/tags/tools/"}]},{"title":"菲律宾Globe零月租手机卡申请和保号","slug":"globe-sim","date":"2023-04-02T07:48:05.000Z","updated":"2023-04-02T08:33:09.607Z","comments":true,"path":"2023/04/02/globe-sim/","permalink":"https://bakasine.github.io/2023/04/02/globe-sim/","excerpt":"","text":"起因 近期申请了一张菲律宾 Globe卡, 搜索一些相关问题的时候发现很多都是过期攻略 这些攻略的答案甚至都是失效的, 经过一些摸索找到的正确的食用方法 适用人群 此卡适合只需要一张低成本境外卡(购卡10加上每年5-10充值保号)接收短信注册各类账号的用户 如果你有通话和流量的需求,这张卡的资费并不适合 测试openai,google,twitter和telegram均可注册 Sim卡购买 淘宝直接搜索"菲律宾Globe",这边就不推荐商家,我买的时候是 10元/张 资费 拨出电话:120P/分钟 接听电话:100P/分钟 发送短信:20P/条 接收短信:免费 激活,实名认证和保号 到手后插入手机,有信号后拨打222此时会拨打不通,挂断后等待一会会收到"Globe"的短信成功激活 前往实名认证链接进行实名认证, 据说白纸都能通过, 我是随便找几张图上传也通过了(注:不要选择旅游) Globe卡有效期是激活日起2个月的有效期也就是2个月内必须充值一次保卡, 之后保卡方式网上有各种说法,有的说每两个月冲一次15比索(约2人民币),也有说半年一冲保号 流量费和通话费用 查询和充值 网上攻略提到的官网查询和拨号*134#查询均已失效, 现在只能通过下载globe one进行话费和有效期查询 下载Globe One然后用你的号码登录,选择Buy Load充值话费(不知道为什么我的信用卡一直充值失败) 使用微信小程序"境外话费充值"充值","categories":[{"name":"others","slug":"others","permalink":"https://bakasine.github.io/categories/others/"}],"tags":[{"name":"sim","slug":"sim","permalink":"https://bakasine.github.io/tags/sim/"}]},{"title":"找到B站下架视频历史弹幕","slug":"history-danmu","date":"2023-03-27T13:36:54.000Z","updated":"2023-04-30T12:55:35.750Z","comments":true,"path":"2023/03/27/history-danmu/","permalink":"https://bakasine.github.io/2023/03/27/history-danmu/","excerpt":"","text":"起因 由于B站大部分老番都已下架,有时候想去回顾老番但是没有弹幕又看不下去 在国内一顿搜索发现很多百度资源早都过期,而且也没有一个系统性的查找方案 最近有去探索一番得到了不少更好的方案, 也看到很多人需要这样的方案 所以写出来跟大家分享一下 下载方式 B站数据库下载 B站数据库 缺点: 操作麻烦,需要搜索cid后下载然后转换 来源: 全! OneDrive网盘下载 弹幕下载链接 缺点: 资源较少,只有少数动漫 来源: 大佬在NGA 上传的历史弹幕 弹幕盒子搜索下载 弹幕盒子 缺点: 虽然资源全了很多,但是由于是git page导致国内魔法才能访问 来源: 弹幕保存计划 有兴趣的可以反代一下或者搭建 弹弹play 弹弹play 缺点: 要下载app,不过用potplayer也要下载,但是我不太喜欢下载所以是缺点 使用方式 PotPlayer 把下载的XML文件转换成ASS文件 转换链接 参数选项 -> 字幕 -> 其他 -> 勾选当存在两个以上字幕语言时同时输出次字幕语言 缺点: 需要先下载视频 油猴脚本 脚本链接 大佬写的支持樱花动漫和其他一些网站的弹幕导入脚本, 配合下载下来的弹幕实现在线观看 油猴都不了解的可以自行搜索, 实在不行就是用potplayer方案 缺点: 支持的网站太少, 基本都是动漫网站缺少日剧等其他资源","categories":[{"name":"others","slug":"others","permalink":"https://bakasine.github.io/categories/others/"}],"tags":[{"name":"danmu","slug":"danmu","permalink":"https://bakasine.github.io/tags/danmu/"}]},{"title":"通过 Cloudflare 自建免费图床","slug":"img-hosting","date":"2023-03-11T14:17:05.000Z","updated":"2023-03-22T06:11:26.034Z","comments":true,"path":"2023/03/11/img-hosting/","permalink":"https://bakasine.github.io/2023/03/11/img-hosting/","excerpt":"","text":"一.准备 二.搭建 三.域名绑定 四.后台管理 五.其他 一.准备 1.注册 Cloudflare 2.注册 Github (可选) 3.购买域名(可选) 二.搭建 登录cloudflare -> 点击左边列表的page -> 点击创建项目 1.如果没有github,则下载 Telegraph-Image 点击直接上传, 跟着填写部署即可 2.有github,则fork项目 Telegraph-Image , 然后点击连接到Git, 点击添加账户后登录你的Github同意绑定,然后选择一个存储库选择Telegraph-Image,最后点开始设置即可 三.域名绑定 回到用户首页 -> page -> Telegraph-Image -> 自定义域 -> 设置自定义域 四.后台管理 Workers -> KV -> 创建命名空间 -> 添加 page -> Telegraph-Image -> 设置 -> 函数 -> KV 命名空间绑定 -> 编辑绑定 -> 变量名称img_url -> KV命名空间选择 -> 保存 page -> Telegraph-Image -> 设置 -> 环境变量 -> 制作 -> 编辑变量 -> 账号BASIC_USER -> 密码BASIC_PASS -> 保存 五.其他 其他功能教程前往 Telegraph-Image","categories":[{"name":"note","slug":"note","permalink":"https://bakasine.github.io/categories/note/"}],"tags":[{"name":"image","slug":"image","permalink":"https://bakasine.github.io/tags/image/"}]},{"title":"搭建自动发卡平台","slug":"kamifaka","date":"2023-03-09T17:40:50.000Z","updated":"2023-03-22T06:11:26.038Z","comments":true,"path":"2023/03/10/kamifaka/","permalink":"https://bakasine.github.io/2023/03/10/kamifaka/","excerpt":"","text":"一.安装环境 二.安装发卡平台 三.修改密码 四.收款方式 五.修改logo 一.安装环境 docker 12apt-get updatecurl -fsSL https://get.docker.com | bash -s docker openssl 1apt-get install libssl-dev mysql 123docker run --name mysql -v /opt/mysql:/etc/mysql/conf.d -e MYSQL_ROOT_PASSWORD=数据库密码 -d mysqldocker exec -it mysql mysql -uroot -pcreate database kami 二.安装发卡平台 1234567891011121314151617# 不使用mysql,并发差docker run -d --name=kmfaka -p 8000:8000 --restart=always -v /opt/kamifaka:/usr/src/app/public baiyuetribe/kamifaka# 使用mysqldocker run -d \\ -p 8000:8000 \\ --restart=always \\ --name=kmfaka \\ -e DB_TYPE=Mysql \\ -e DB_HOST="172.17.0.1" \\ -e DB_PORT=3306 \\ -e DB_USER=root \\ -e DB_PASSWORD=数据库用密码 \\ -e DB_DATABASE=数据库名 \\ -v /opt/kamifaka:/usr/src/app/public \\ baiyuetribe/kamifaka 三.修改密码 访问:8000/admin -> 默认账号[email protected], 默认密码123456 -> 用户修改 -> 立即修改 四.收款方式 开通当面付 1.web 2.手机支付宝搜索当面付 填写相关资料 1.经营类目 选择 “百货零售 / 其他零售 / 杂货店”,或者其他…问题不大 2.营业执照 可不上传 3.店铺招牌 可以拍一下身份的百货店,或者百度找一张类似的图 配置密钥 开发设置 -> 接口加签方式(证书/密钥) ->生成rsa密钥 12345opensslgenrsa -out app_private_key.pem 2048 pkcs8 -topk8 -inform PEM -in app_private_key.pem -outform PEM -nocrypt -out app_private_key_pkcs8.pem rsa -in app_private_key.pem -pubout -out app_public_key.pem exit app_public_key.pem内容填写 得到ali公钥,保存并填入即可使用 五.修改logo 把你的logo文件替换掉/opt/kamifaka下的logo.png","categories":[{"name":"note","slug":"note","permalink":"https://bakasine.github.io/categories/note/"}],"tags":[{"name":"web","slug":"web","permalink":"https://bakasine.github.io/tags/web/"}]},{"title":"搭建 AI 语音 TTS 服务","slug":"ai-voice","date":"2023-02-25T18:44:26.000Z","updated":"2023-03-22T06:11:26.026Z","comments":true,"path":"2023/02/26/ai-voice/","permalink":"https://bakasine.github.io/2023/02/26/ai-voice/","excerpt":"","text":"安装 常见问题 安装 1.安装git 2.安装 pip,python >= 3.7 3.安装 Microsoft C++ 生成工具 下载地址 添加环境变量(根据自己安装的目录修改) C:\\Program Files (x86)\\Microsoft Visual Studio\\2022\\BuildTools\\Common7\\IDE\\CommonExtensions\\Microsoft\\CMake\\CMake\\bin C:\\Program Files (x86)\\Microsoft Visual Studio\\2022\\BuildTools\\VC\\Tools\\MSVC\\14.34.31933\\bin\\Hostx86\\x64 win+r > 输入cmd回车 123456789101112pip install --upgrade pip -i https://mirrors.aliyun.com/pypi/simplegit lfs install# 包含近1g的训练模型慢慢等吧git clone https://huggingface.co/spaces/sayashi/vits-uma-genshin-honkaicd vits-uma-genshin-honkaipip install -r requirements.txt -i https://mirrors.aliyun.com/pypi/simple# 启动服务python app.py 常见问题 启动服务显示 initialization of _internal failed numpy高版本bug,回退到1.23.5后正常 pip install numpy==1.23.5 -i https://mirrors.aliyun.com/pypi/simple pyopenjtalk模块安装失败 查看Microsoft C++ 生成工具是否有安装和环境变量是否正确","categories":[{"name":"tool","slug":"tool","permalink":"https://bakasine.github.io/categories/tool/"}],"tags":[{"name":"ai","slug":"ai","permalink":"https://bakasine.github.io/tags/ai/"},{"name":"vits","slug":"vits","permalink":"https://bakasine.github.io/tags/vits/"}]},{"title":"正则表达式","slug":"regex","date":"2023-02-18T15:35:16.000Z","updated":"2023-03-22T06:11:26.047Z","comments":true,"path":"2023/02/18/regex/","permalink":"https://bakasine.github.io/2023/02/18/regex/","excerpt":"","text":"简单介绍 元字符 特殊字符 限定符 定位符 模式修饰符 常用正则表达式 简单介绍 12345678// 提取[]内的内容(包括[]) tip: () 是为了提取匹配的字符串`(?s)\\[(.*)\\]`// (?<=exp)是以exp开头的字符串, 但不包含本身// (?=exp)就匹配惟exp结尾的字符串, 但不包含本身.// 提取()内的内容(不包括())(?<=\\()(.*)(?=\\)) 元字符 1234567891011121314151617181920212223242526272829303132333435//匹配除换行符(\\n、\\r)之外的任何单个字符。要匹配包括 '\\n' 在内的任何字符,请使用像"(.|\\n)"的模式。.//匹配 x 或 y。例如,'z|food' 能匹配 "z" 或 "food"。'(z|f)ood' 则匹配 "zood" 或 "food"。** x|y **//字符集合。匹配所包含的任意一个字符。例如, '[abc]' 可以匹配 "plain" 中的 'a'。** [xyz] **//负值字符集合。匹配未包含的任意字符。例如, '[^abc]' 可以匹配 "plain" 中的'p'、'l'、'i'、'n'。[^xyz] //字符范围。匹配指定范围内的任意字符。例如,'[a-z]' 可以匹配 'a' 到 'z' 范围内的任意小写字母字符。[a-z]//负值字符范围。匹配任何不在指定范围内的任意字符。例如,'[^a-z]' 可以匹配任何不在 'a' 到 'z' 范围内的任意字符。[^a-z]//匹配一个数字字符。等价于 [0-9]。\\d//匹配一个非数字字符。等价于 [^0-9]。\\D//匹配任何空白字符,包括空格、制表符、换页符等等。等价于 [ \\f\\n\\r\\t\\v]。\\s//匹配任何非空白字符。等价于 [^ \\f\\n\\r\\t\\v]。\\S//匹配字母、数字、下划线。等价于'[A-Za-z0-9_]'。\\w//匹配非字母、数字、下划线。等价于 '[^A-Za-z0-9_]'。\\W 特殊字符 1234567891011121314151617181920212223242526//匹配任何空白字符,包括空格、制表符、换页符等等。等价于 [ \\f\\n\\r\\t\\v]。注意 Unicode 正则表达式会匹配全角空格符。\\s//匹配任何非空白字符。等价于 [^ \\f\\n\\r\\t\\v]。\\S//匹配输入字符串的结尾位置。要匹配 $ 字符本身,请使用 \\$$//匹配输入字符串的开始位置//在方括号表达式中使用,此时它表示不接受该字符集合。//要匹配 ^ 字符本身,请使用 \\^。^//匹配前面的子表达式零次或多次。要匹配 * 字符,请使用 \\*。*//匹配前面的子表达式一次或多次。要匹配 + 字符,请使用 \\+。+//匹配除换行符 \\n 之外的任何单字符。要匹配 . ,请使用 \\.。.//匹配前面的子表达式零次或一次,或指明一个非贪婪限定符。要匹配 ? 字符,请使用 \\?。? 限定符 123456789101112131415161718192021//匹配前面的子表达式零次或多次。例如,zo* 能匹配 "z" 以及 "zoo"。* 等价于{0,}。*//匹配前面的子表达式一次或多次。例如,'zo+' 能匹配 "zo" 以及 "zoo",但不能匹配 "z"。+ 等价于 {1,}。+//匹配前面的子表达式零次或一次。例如,"do(es)?" 可以匹配 "do" //"does" 中的 "does" 、 "doxy" 中的 "do" 。? 等价于 {0,1}。?//n 是一个非负整数。匹配确定的 n 次。例如,'o{2}' 不能匹配 "Bob" 中的 'o',但是能匹配 "food" 中的两个 o。{n}//n 是一个非负整数。至少匹配n 次。例如,'o{2,}' 不能匹配 "Bob" 中的 'o',但能匹配 "foooood" 中的所有 o。//'o{1,}' 等价于 'o+'。'o{0,}' 则等价于 'o*'。{n,}//m 和 n 均为非负整数,其中n <= m。最少匹配 n 次且最多匹配 m 次。例如,"o{1,3}" 将匹配 "fooooood" 中的前三个 o。//'o{0,1}' 等价于 'o?'。请注意在逗号和两个数之间不能有空格。{n,m} 定位符 12345678910111213//匹配输入字符串开始的位置。^//匹配输入字符串结尾的位置。$//匹配一个单词边界,即字与空格间的位置。 //例如, 'er\\b' 可以匹配"never" 中的 'er',但不能匹配 "verb" 中的 'er'。\\b//非单词边界匹配。'er\\B' 能匹配 "verb" 中的 'er',但不能匹配 "never" 中的 'er'。\\B 模式修饰符 1234567891011// (?i) 表示所在位置右侧的表达式开启忽略大小写模式// (?s) 表示更改.的含义,使它与每一个字符匹配(包括换行符\\n)// (?m) 表示更改^和$的 含义,使它们分别在任意一行的行首和行尾匹配,而不仅仅在整个字符串的开头和结尾匹配。(在此模式下,$的 精确含意是:匹配\\n之前的位置以及字符串结束前的位置.)// (?is) 更改句点字符 (.) 的含义,以使它与每个字符(而不是除 \\n 之外的所有字符)匹配// (?im) 更改 ^ 和 $ 的含义,以使它们分别与任何行的开头和结尾匹配,而不只是与整个字符串的开头和结尾匹配// (?x):表示如果加上该修饰符,表达式中的空白字符将会被忽略,除非它已经被转义。 常用正则表达式 校验数字的表达式 12345678910111213141516171819202122232425262728293031323334353637数字:^[0-9]*$n位的数字:^\\d{n}$至少n位的数字:^\\d{n,}$m-n位的数字:^\\d{m,n}$零和非零开头的数字:^(0|[1-9][0-9]*)$非零开头的最多带两位小数的数字:^([1-9][0-9]*)+(\\.[0-9]{1,2})?$带1-2位小数的正数或负数:^(\\-)?\\d+(\\.\\d{1,2})$正数、负数、和小数:^(\\-|\\+)?\\d+(\\.\\d+)?$有两位小数的正实数:^[0-9]+(\\.[0-9]{2})?$有1~3位小数的正实数:^[0-9]+(\\.[0-9]{1,3})?$非零的正整数:^[1-9]\\d*$ 或 ^([1-9][0-9]*){1,3}$ 或 ^\\+?[1-9][0-9]*$非零的负整数:^\\-[1-9][]0-9"*$ 或 ^-[1-9]\\d*$非负整数:^\\d+$ 或 ^[1-9]\\d*|0$非正整数:^-[1-9]\\d*|0$ 或 ^((-\\d+)|(0+))$非负浮点数:^\\d+(\\.\\d+)?$ 或 ^[1-9]\\d*\\.\\d*|0\\.\\d*[1-9]\\d*|0?\\.0+|0$非正浮点数:^((-\\d+(\\.\\d+)?)|(0+(\\.0+)?))$ 或 ^(-([1-9]\\d*\\.\\d*|0\\.\\d*[1-9]\\d*))|0?\\.0+|0$正浮点数:^[1-9]\\d*\\.\\d*|0\\.\\d*[1-9]\\d*$ 或 ^(([0-9]+\\.[0-9]*[1-9][0-9]*)|([0-9]*[1-9][0-9]*\\.[0-9]+)|([0-9]*[1-9][0-9]*))$负浮点数:^-([1-9]\\d*\\.\\d*|0\\.\\d*[1-9]\\d*)$ 或 ^(-(([0-9]+\\.[0-9]*[1-9][0-9]*)|([0-9]*[1-9][0-9]*\\.[0-9]+)|([0-9]*[1-9][0-9]*)))$浮点数:^(-?\\d+)(\\.\\d+)?$ 或 ^-?([1-9]\\d*\\.\\d*|0\\.\\d*[1-9]\\d*|0?\\.0+|0)$ 校验字符的表达式 1234567891011121314151617181920212223汉字:^[\\u4e00-\\u9fa5]{0,}$英文和数字:^[A-Za-z0-9]+$ 或 ^[A-Za-z0-9]{4,40}$长度为3-20的所有字符:^.{3,20}$由26个英文字母组成的字符串:^[A-Za-z]+$由26个大写英文字母组成的字符串:^[A-Z]+$由26个小写英文字母组成的字符串:^[a-z]+$由数字和26个英文字母组成的字符串:^[A-Za-z0-9]+$由数字、26个英文字母或者下划线组成的字符串:^\\w+$ 或 ^\\w{3,20}$中文、英文、数字包括下划线:^[\\u4E00-\\u9FA5A-Za-z0-9_]+$中文、英文、数字但不包括下划线等符号:^[\\u4E00-\\u9FA5A-Za-z0-9]+$ 或 ^[\\u4E00-\\u9FA5A-Za-z0-9]{2,20}$可以输入含有^%&',;=?$\\"等字符:[^%&',;=?$\\x22]+禁止输入含有~的字符:[^~\\x22]+ 特殊需求表达式 12345678910111213141516171819202122232425262728293031323334353637383940414243444546Email地址:^\\w+([-+.]\\w+)*@\\w+([-.]\\w+)*\\.\\w+([-.]\\w+)*$域名:[a-zA-Z0-9][-a-zA-Z0-9]{0,62}(/.[a-zA-Z0-9][-a-zA-Z0-9]{0,62})+/.?InternetURL:[a-zA-z]+://[^\\s]* 或 ^http://([\\w-]+\\.)+[\\w-]+(/[\\w-./?%&=]*)?$手机号码:^(13[0-9]|14[5|7]|15[0|1|2|3|5|6|7|8|9]|18[0|1|2|3|5|6|7|8|9])\\d{8}$电话号码("XXX-XXXXXXX"、"XXXX-XXXXXXXX"、"XXX-XXXXXXX"、"XXX-XXXXXXXX"、"XXXXXXX"和"XXXXXXXX):^(\\(\\d{3,4}-)|\\d{3.4}-)?\\d{7,8}$国内电话号码(0511-4405222、021-87888822):\\d{3}-\\d{8}|\\d{4}-\\d{7}电话号码正则表达式(支持手机号码,3-4位区号,7-8位直播号码,1-4位分机号): ((\\d{11})|^((\\d{7,8})|(\\d{4}|\\d{3})-(\\d{7,8})|(\\d{4}|\\d{3})-(\\d{7,8})-(\\d{4}|\\d{3}|\\d{2}|\\d{1})|(\\d{7,8})-(\\d{4}|\\d{3}|\\d{2}|\\d{1}))$)身份证号(15位、18位数字),最后一位是校验位,可能为数字或字符X:(^\\d{15}$)|(^\\d{18}$)|(^\\d{17}(\\d|X|x)$)帐号是否合法(字母开头,允许5-16字节,允许字母数字下划线):^[a-zA-Z][a-zA-Z0-9_]{4,15}$密码(以字母开头,长度在6~18之间,只能包含字母、数字和下划线):^[a-zA-Z]\\w{5,17}$强密码(必须包含大小写字母和数字的组合,不能使用特殊字符,长度在 8-10 之间):^(?=.*\\d)(?=.*[a-z])(?=.*[A-Z])[a-zA-Z0-9]{8,10}$强密码(必须包含大小写字母和数字的组合,可以使用特殊字符,长度在8-10之间):^(?=.*\\d)(?=.*[a-z])(?=.*[A-Z]).{8,10}$日期格式:^\\d{4}-\\d{1,2}-\\d{1,2}一年的12个月(01~09和1~12):^(0?[1-9]|1[0-2])$一个月的31天(01~09和1~31):^((0?[1-9])|((1|2)[0-9])|30|31)$xml文件:^([a-zA-Z]+-?)+[a-zA-Z0-9]+\\\\.[x|X][m|M][l|L]$中文字符的正则表达式:[\\u4e00-\\u9fa5]双字节字符:[^\\x00-\\xff] (包括汉字在内,可以用来计算字符串的长度(一个双字节字符长度计2,ASCII字符计1))空白行的正则表达式:\\n\\s*\\r (可以用来删除空白行)HTML标记的正则表达式:<(\\S*?)[^>]*>.*?|<.*? /> ( 首尾空白字符的正则表达式:^\\s*|\\s*$或(^\\s*)|(\\s*$) (可以用来删除行首行尾的空白字符(包括空格、制表符、换页符等等),非常有用的表达式)腾讯QQ号:[1-9][0-9]{4,} (腾讯QQ号从10000开始)中国邮政编码:[1-9]\\d{5}(?!\\d) (中国邮政编码为6位数字)IP地址:((?:(?:25[0-5]|2[0-4]\\\\d|[01]?\\\\d?\\\\d)\\\\.){3}(?:25[0-5]|2[0-4]\\\\d|[01]?\\\\d?\\\\d))","categories":[{"name":"note","slug":"note","permalink":"https://bakasine.github.io/categories/note/"}],"tags":[{"name":"regex","slug":"regex","permalink":"https://bakasine.github.io/tags/regex/"}]},{"title":"vmess/vless + ws + tls + dns","slug":"vmess-dns","date":"2022-10-15T02:52:47.000Z","updated":"2023-03-22T06:11:26.049Z","comments":true,"path":"2022/10/15/vmess-dns/","permalink":"https://bakasine.github.io/2022/10/15/vmess-dns/","excerpt":"","text":"准备 Vmess Vless 准备 安装nginx和申请证书 Vmess xray config 1234567891011121314151617181920212223242526272829303132333435363738394041424344454647{ "log":{ "access": "/var/log/xray/access.log", "error": "/var/log/xray/error.log", "loglevel": "warning" }, "inbounds": [ { "port": 1919, "listen": "127.0.0.1", "protocol": "vmess", "settings": { "clients": [{ "id": "", "alterID": 0 }] }, "streamSettings": { "network": "ws", "wsSettings": { "path": "/crayfish" } } } ], "outbounds": [ { "protocol": "freedom", "settings": {} }, { "protocol": "blackhole", "settings": {}, "tag": "blocked" } ], "routing": { "domainStrategy": "IPOnDemand", "rules": [ { "type": "field", "protocol": ["bittorrent"], "outboundTag": "blocked" } ] }} nginx config 123456789101112131415161718192021222324server { listen 443 ssl; server_name 你的域名; index index.html; root /home/xray/webpage/; ssl_certificate /home/xray/xray_cert/xray.crt; ssl_certificate_key /home/xray/xray_cert/xray.key; ssl_protocols TLSv1 TLSv1.1 TLSv1.2; ssl_ciphers HIGH:!aNULL:!MD5; # 在 location location /crayfish { proxy_pass http://127.0.0.1:1919; proxy_redirect off; proxy_http_version 1.1; proxy_set_header Upgrade $http_upgrade; proxy_set_header Connection "upgrade"; proxy_set_header Host $http_host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; }} Vless 12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849{ "log": { "loglevel": "warning" }, "inbounds": [ { "listen": "/dev/shm/Xray-VLESS-WSS-Nginx.socket,0666", "protocol": "vless", "settings": { "clients": [ { "id": "" // 填写你的 UUID } ], "decryption": "none" }, "streamSettings": { "network": "ws", "wsSettings": { "path": "/crayfish" // 填写你的 path } } } ], "outbounds": [ { "tag": "direct", "protocol": "freedom", "settings": {} }, { "tag": "blocked", "protocol": "blackhole", "settings": {} } ], "routing": { "domainStrategy": "AsIs", "rules": [ { "type": "field", "ip": [ "geoip:private" ], "outboundTag": "blocked" } ] }} nginx config 12345678910111213141516171819202122232425262728server { listen 443 ssl http2; server_name 你的域名; index index.html; root /home/xray/webpage; ssl_certificate /home/xray/xray_cert/xray.crt ssl_certificate_key /home/xray/xray_cert/xray.key; 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; # 在 location 后填写 /你的 path location /crayfish { if ($http_upgrade != "websocket") { return 404; } proxy_pass http://unix:/dev/shm/Xray-VLESS-WSS-Nginx.socket; proxy_redirect off; proxy_http_version 1.1; proxy_set_header Upgrade $http_upgrade; proxy_set_header Connection "upgrade"; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_read_timeout 52w; }}","categories":[{"name":"tools","slug":"tools","permalink":"https://bakasine.github.io/categories/tools/"}],"tags":[{"name":"xray","slug":"xray","permalink":"https://bakasine.github.io/tags/xray/"},{"name":"vmess","slug":"vmess","permalink":"https://bakasine.github.io/tags/vmess/"},{"name":"vless","slug":"vless","permalink":"https://bakasine.github.io/tags/vless/"}]},{"title":"bbr加速","slug":"bbr","date":"2022-09-27T06:16:24.000Z","updated":"2023-03-22T06:11:26.029Z","comments":true,"path":"2022/09/27/bbr/","permalink":"https://bakasine.github.io/2022/09/27/bbr/","excerpt":"","text":"开启BBR linux内核版本大于4.9的系统自带的bbr Debian 9+ Ubuntu 17.04+ CentOS 8+ 12345678910# debian10+ 可用echo 'deb http://deb.debian.org/debian buster-backports main' >> /etc/apt/sources.listapt update && apt -t buster-backports install linux-image-amd64# Ubuntu 跳过前两步echo net.core.default_qdisc=fq >> /etc/sysctl.confecho net.ipv4.tcp_congestion_control=bbr >> /etc/sysctl.confsysctl -preboot 确认 输入 lsmod | grep bbr 返回 tcp_bbr 输入 lsmod | grep fq 返回 sch_fq 输入 sysctl net.ipv4.tcp_available_congestion_control 返回 net.ipv4.tcp_available_congestion_control = bbr cubic reno","categories":[{"name":"linux","slug":"linux","permalink":"https://bakasine.github.io/categories/linux/"}],"tags":[{"name":"linux","slug":"linux","permalink":"https://bakasine.github.io/tags/linux/"},{"name":"bbr","slug":"bbr","permalink":"https://bakasine.github.io/tags/bbr/"}]},{"title":"lua笔记","slug":"lua-note","date":"2022-09-09T16:43:24.000Z","updated":"2023-03-22T06:11:26.038Z","comments":true,"path":"2022/09/10/lua-note/","permalink":"https://bakasine.github.io/2022/09/10/lua-note/","excerpt":"","text":"一.安装lua 二.基本变量 三.运算符 四.流程控制 五.函数 六.String库 七.模块 八.元表 九.协程 十.文件IO 十一.面向对象 十二.错误处理 一.安装lua Mac 12brew updatebrew install lua Linux 1sudo apt update && sudo apt install lua5.3 Windows 官方已编译包 下载lua-5.4.2_Win64_bin.zip -> 解压到path -> 配置环境变量为path 也可以直接通过安装包 安装 二.基本变量 12345678910-- local为局部变量, 不做声明默认为全局变量xint, xfloat = 10, 10.1 --numberlocal name = "Crayfish Run" --string "" or ''local names = [[ line1 line2]] --string [[字符串块]]local isAlive = true --booleanlocal a = nil --no value or invalid valuelocal talbe = {} --table 可以使用 type 函数测试变量类型 123print(type(123)) -- numberprint(type('123')) -- stringprint(type(print)) -- function lua对数字字符进行算术运算的逻辑会将字符串转换成数字进行运算 1234print("2" + 6) -- 8print("2" * 6) -- 12print("2" - 6) -- -4print("-2e2" * "6") -- -1200.0 字符串的连接采用'..' 12print("2" .. "6") -- 8print(2 .. 6) -- 8 字符串长度采用#获取 1print(#'123') -- 3 table 表 表其实就是一种数组+Map,不过和其他语言不同,他的初始index从1开始 1234567891011t = {1,2,3,4,5} -- 定义一个表可以看做 [1,2,3,4,5]t[1] -- 1 初始index为1而不是0t[1] = 2 -- [2,2,3,4,5]table.insert(t, 6) -- 插入6 [2,2,3,4,5,6]table.insert(t,2,7) -- 在索引2插入7 [2,7,2,3,4,5,6]table.remove(t,2) -- 删除索引2的值 [2,2,3,4,5,6]table.sort(t) -- 升序排序print(table.concat(t)) -- 所有值连接成string 223456print(table.concat(t,",")) -- 所有值和分隔符","连接成string 2,2,3,4,5,6print(table.concat(t,",",2,4)) -- 索引2-4的值分隔符","连接成string 2,3,4t["key"]="value" -- 加入后的索引为Key而不是7 三.运算符 1234567-- 基础常见不介绍了,只标注和其他语言不一样的点print(5 // 2) -- 2 整除(向下取整) print(5 ^ 2) -- 25 乘幂print(5 ~= 2) -- true 不等于即 !=print(true and false) -- false 即 &&print(true or false) -- true 即 ||print(not true) -- 逻辑非 取反! 四.流程控制 if 1234567if (condition) then statementelseif (condition) then statementelse statementend 循环 while 1234-- 条件为真时循环while (condition) do statementend for 1234567891011-- 可以看做其他语言的 for i=10; i!=1; i+=-1-- 即当i不为1时进入循环,每次循环后加上-1. -1可省略默认为1for i=10,1,-1 do statementend-- 类似java的foreach, golang的range-- i为索引,v为值, a为table数组for i, v in ipairs(a) do statementend repeat 12345-- java的do while-- 即while的至少执行一次模式repeat statementuntil (condition) goto语句 12345678-- goto 和其他语言差不多,不同点在于其他语言为 "label:", lua为 "::lable::"-- 一般用于双循环跳出local a = 1::label:: print("--- goto label ---")a = a+1if a < 3 then goto label -- a 小于 3 的时候跳转到标签 labelend 五.函数 1234567891011121314function name(param) statementend-- 函数可以赋值给变量func = function(param) statementend-- 不定参数function name(...) -- select("#",...) 可获得参数数量 statementend 六.String库 12345678910string.upper("a") -- Astring.lower("A") -- astring.gsub("aaaa", "a", "c", 3) -- ccca 把aaaa的前三个a替换成c, 3可省略, 省略为全部替换string.find("abcde", "bc", 1) -- 2 3 查找abcde的bc索引位置,从索引1开始查找. 1可省略,默认为从头开始查找string.reverse("12345") -- 54321string.format("xxx:%d", 1) -- xxx:1string.byte("A") -- 65 多个值取第一个string.char(65) -- A 多个值连接string.len("123") -- 3string.rep("123", 2) -- 123123 复制2个123并连接 七.模块 自定义模块 12345678910111213141516171819202122-- 文件名为 module.lua-- 定义一个名为 module 的模块module = {} -- 定义一个常量module.constant = "const" -- 定义一个函数function module.func1() print("func1")end-- local私用化声明local function func2() print("这是一个私有函数!")endfunction module.func3() func2()end return module 加载模块 123local m = require("module")print(m.constant)m.func1() 加载路径默认为LUA_PATH,需要手动配置 八.元表 相当于重写表的基本操作函数 1234567891011121314151617-- table原生不支持 +,- 等操作,需要通过元表-- 声明元表local mt = {}-- 对元表添加_add方法,用于描述+法操作mt.__add = function(a, b) local res = {} statement return resendt1 = {1,2,3}t2 = {2,3,4}setmetatable(t1, mt)t3 = t1 + t2 -- 3,5,7 支持的元方法 元方法 运算符 __add + __mul * __sub - __div / __unm ! __mod % __pow ^ __concat … __eq == __lt < __le <= __tostring 输出字符串 __call 函数调用 __index 调用索引值 __newindex 赋值 九.协程 12345678910111213141516171819202122-- 创建coroutineco = coroutine.create( function(i) print(i) end)coroutine.status() -- 查看 coroutine 的状态 dead,suspended,running-- 创建 coroutine,返回一个函数,一旦你调用这个函数,就进入 coroutinecw = coroutine.wrap( function(i) print(i) end)cw(1) -- 1-- 需要在 coroutine的方法中,可以使其挂起.coroutine.yield()coroutine.resume(co, 1) -- 重启 coroutine-- 返回正在跑的 coroutine,一个 coroutine 就是一个线程,当使用running的时候,就是返回一个 corouting 的线程号coroutine.running() 十.文件IO 参数 效果 r 以只读方式打开文件,该文件必须存在。 w 打开只写文件,若文件存在则文件长度清为0,即该文件内容会消失。若文件不存在则建立该文件。 a 以附加的方式打开只写文件。若文件不存在,则会建立该文件,如果文件存在,写入的数据会被加到文件尾 r+ 以可读写方式打开文件,该文件必须存在。 w+ 打开可读写文件,若文件存在则文件长度清为零,即该文件内容会消失。若文件不存在则建立该文件。 a+ 与a类似,但此文件可读可写 b 二进制模式,如果文件是二进制文件,可以加上b + 号表示对文件既可以读也可以写 123456789101112131415-- 只读file = io.open("file", "r")-- 输出文件第一行print(file:read())file:flush() -- 刷新-- 关闭打开的文件file:close()-- 以附加的方式打开只写文件file = io.open("test.lua", "a")-- 在文件最后一行添加 Lua 注释file:write("--test") read()的参数 参数 效果 a 读取文件全部内容 l 表示读取一行,不带换行符 L 表示读取一行,带换行符 n 表示读取一个数字 num 表示读取num个字符,num表示数字 12-- 读取全部file:read("a") 十一.面向对象 创建类 1234567891011121314151617181920212223242526272829-- lua 中的类可以通过 table + function 模拟出Clz = {p = 0}function Clz.paramMinus(v) print(Clz.p - v)endClz.paramMinus(10) -- -10-- 对象Object = {param = 0}-- 派生类的方法 newfunction Object:new (o, param) o = o or {} -- 如果 o 为 false 或 nil ,则 o ={} setmetatable(o, self) self.__index = self self.param = param return oend-- 基础类方法 printAreafunction Object:printP () print(self.param)end-- 创建对象myobj = Object:new(nil,10)myobj:printP() -- 10 `.`和`:`调用的区别在于默认self 1234567891011clz = {v=0}function clz.add(self, v) self.v = self.v + vendclz.add(clz, v)-- 上下方法一致function clz:add(v) self.v = self.v + vendclz:add(v) 继承 123456789101112131415161718192021clz = {v=0}function clz:new(o, v) o = o or {} metatable(o, self) self.__index =self self.v = v return 0endfunction clz:add(v) self.v = self.v + vend-- 继承ext = clz:new(nil,1)function ext:new(o, v) o = o or clz:new(o, v) setmetatable(o, self) self.__index=self return o 十二.错误处理 error 12-- 抛出异常error("msg") assert 12-- assert是一个断言, 包装error实现. 它会中断当前流程, 可省略抛出信息参数assert(type(a) == "number", "抛出的错误信息") pcall 和 xpcall、debug 123456789101112131415if pcall(function, ...) then-- 没有错误else-- 一些错误end-- 传入第一个值为函数,后面的则为参数pcall(function(i) print(i) end, 33) -- true 或者 false stdin:1: error..-- 即java的catch-- 传入第一个值为函数,第二个为报错函数(自动传入err消息),后面则为参数-- debug.traceback:根据调用桟来构建一个扩展的错误消息xpcall(function(i) print(i) error('error..') end, function() print(debug.traceback()) end, 33)-- stack traceback: ... false nil","categories":[{"name":"note","slug":"note","permalink":"https://bakasine.github.io/categories/note/"}],"tags":[{"name":"lua","slug":"lua","permalink":"https://bakasine.github.io/tags/lua/"}]},{"title":"dota2游廊RPG地图制作","slug":"dota2-rpg","date":"2022-09-09T10:43:42.000Z","updated":"2023-03-22T06:11:26.029Z","comments":true,"path":"2022/09/09/dota2-rpg/","permalink":"https://bakasine.github.io/2022/09/09/dota2-rpg/","excerpt":"","text":"下载Dota2 Workshop Tools RPG地图创建流程 一.下载Dota2 Workshop Tools 官方页面 1.安装方式 安装dota2游戏 --> 右击dota2 --> 选择属性 --> 选择DLC --> 勾选 Dota2 Workshop Tools DLC 二.RPG地图创建流程 1.启动Dota2 Workshop Tools 运行dota2 --> Launch Dota2 - Tools 2.创建新地图 Create Empty Addon --> Create --> Lauch Tools 构建一张地图 点击Hammer 新建地图文件 资源窗口选择Prefabs 标签 --> 搜索 basic_entities --> basic_entities.vmap拖到3D窗口 按F9或者File - Build map --> build --> Run 以上便是创建一张自定义RPG图的基本操作","categories":[{"name":"game","slug":"game","permalink":"https://bakasine.github.io/categories/game/"}],"tags":[{"name":"dota2","slug":"dota2","permalink":"https://bakasine.github.io/tags/dota2/"},{"name":"rpg","slug":"rpg","permalink":"https://bakasine.github.io/tags/rpg/"}]},{"title":"xray架设trojan节点","slug":"trojan-build","date":"2022-09-03T03:27:45.000Z","updated":"2023-03-22T06:11:26.048Z","comments":true,"path":"2022/09/03/trojan-build/","permalink":"https://bakasine.github.io/2022/09/03/trojan-build/","excerpt":"","text":"2022-11-13 17:22:21 更新一键安装脚本 一键安装 安装Nginx 申请证书 安装Xray 给Xray配置TLS证书 配置Xray 优化 一键安装 1wget -N --no-check-certificate -q -O xray.sh "https://raw.githubusercontent.com/uerax/xray-script/master/xray.sh" && chmod +x xray.sh && bash xray.sh 安装nginx 不推荐centos, 太折腾了 12345# ubuntu debiansudo apt update && sudo apt install -y nginx mkdir -p /home/xray/webpage/ && cd /home/xray/webpage/# https://html5up.net/ 随便找一个apt install unzip && wget -O web.zip --no-check-certificate https://html5up.net/phantom/download && unzip web.zip && rm web.zip 修改nginx.conf 123456789101112131415161718192021# 去除80端口默认占用sed -i '/\\/etc\\/nginx\\/sites-enabled\\//d' /etc/nginx/nginx.conf# 复制全部 startcat>/etc/nginx/conf.d/xray.conf<<EOFserver { listen 80; server_name yourdomain; root /home/xray/webpage/; index index.html;}EOF# 复制全部 end# 你的域名 替换sed -i 's/yourdomain/你的域名/' /etc/nginx/conf.d/xray.confsystemctl reload nginx# 访问 http://你的域名 显示正常则成功 申请证书 12345678wget -O - https://get.acme.sh | sh && cd ~ && . .bashrcacme.sh --upgrade --auto-upgradeacme.sh --issue --server letsencrypt --test -d 你的域名 -w /home/xray/webpage --keylength ec-256# 显示证书和4行cert才成功acme.sh --set-default-ca --server letsencryptacme.sh --issue -d 你的域名 -w /home/xray/webpage --keylength ec-256 --force 安装Xray 脚本安装 12wget https://github.com/XTLS/Xray-install/raw/main/install-release.sh && bash install-release.sh && rm install-release.sh 手动安装 xray包 1234567891011121314151617181920212223# 解压到root目录下的xray文件夹 wget https://github.com/XTLS/Xray-core/releases/download/v1.5.10/Xray-linux-64.zip -O xray.zip && unzip xray.zip -d /root/xray/ && rm xray.zip# 创建 systemd 部署 startcat>/etc/systemd/system/xray.service<<EOF[Unit]Description=Xray ServiceDocumentation=https://github.com/xtlsAfter=network.target nss-lookup.target[Service]User=rootCapabilityBoundingSet=CAP_NET_ADMIN CAP_NET_BIND_SERVICEAmbientCapabilities=CAP_NET_ADMIN CAP_NET_BIND_SERVICENoNewPrivileges=trueExecStart=/root/xray/xray run -config /usr/local/etc/xray/config.jsonRestart=on-failureRestartPreventExitStatus=23LimitNPROC=10000LimitNOFILE=1000000[Install]WantedBy=multi-user.targetEOF# end 给Xray配置TLS证书 1mkdir -p /home/xray/xray_cert && acme.sh --install-cert -d 你的域名 --ecc --fullchain-file /home/xray/xray_cert/xray.crt --key-file /home/xray/xray_cert/xray.key && chmod +r /home/xray/xray_cert/xray.key 自动更新临期证书 12345678910111213141516# 创建并写入cat>/home/xray/xray_cert/xray-cert-renew.sh<<EOF#!/bin/bash/root/.acme.sh/acme.sh --install-cert -d yourdomain --ecc --fullchain-file /home/xray/xray_cert/xray.crt --key-file /home/xray/xray_cert/xray.keyecho "Xray Certificates Renewed"chmod +r /home/xray/xray_cert/xray.keyecho "Read Permission Granted for Private Key"sudo systemctl restart xrayecho "Xray Restarted"EOF# 你的域名 替换sed -i 's/yourdomain/你的域名/' /home/xray/xray_cert/xray-cert-renew.sh 创建定时任务 123chmod +x /home/xray/xray_cert/xray-cert-renew.sh( crontab -l | grep -v "0 1 1 * * bash /home/xray/xray_cert/xray-cert-renew.sh"; echo "0 1 1 * * bash /home/xray/xray_cert/xray-cert-renew.sh" ) | crontab - 配置Xray 123456xray uuid# 自定义日志 可选 start# 默认日志位置 /var/log/xraymkdir /home/xray/xray_log && touch /home/xray/xray_log/access.log && touch /home/xray/xray_log/error.log && chmod a+w /home/xray/xray_log/*.log# end 模板文件修改 配置文件模板库 123456wget https://raw.githubusercontent.com/XTLS/Xray-examples/main/Trojan-TCP-XTLS/config_server.json -O /usr/local/etc/xray/config.jsonsed -i 's/\\/path\\/to\\/cert/\\/home\\/xray\\/xray_cert\\/xray.crt/' /usr/local/etc/xray/config.jsonsed -i 's/\\/path\\/to\\/key/\\/home\\/xray\\/xray_cert\\/xray.key/' /usr/local/etc/xray/config.json 启动Xray 1234// 脚本安装方式systemctl start xray && systemctl enable xray// 手动安装方式 优化 开启bbr 开启bbr加速 开启 HTTP 自动跳转 HTTPS 123456789101112131415161718192021222324252627sed -i '/\\/home\\/xray\\/webpage\\//d' /etc/nginx/conf.d/xray.confsed -i '/index/d' /etc/nginx/conf.d/xray.conf# 在80端口规则最后加入 可同时删除root和index两行sed -i '3a \\\\treturn 301 https://$http_host$request_uri;' /etc/nginx/conf.d/xray.conf#在加入新的servercat>>/etc/nginx/conf.d/xray.conf<<EOFserver { listen 127.0.0.1:8080; root /home/xray/webpage/; index index.html; add_header Strict-Transport-Security "max-age=63072000" always;}EOF#endsystemctl restart nginx#修改xray的fallback端口为8080 "dest": 80 -> 改成 "dest": 8080sed -i '19,24d' /usr/local/etc/xray/config.jsonsudo sed -i 's/\\"dest\\".*/"dest": 8080/g' /usr/local/etc/xray/config.jsonsystemctl restart xray","categories":[{"name":"tools","slug":"tools","permalink":"https://bakasine.github.io/categories/tools/"}],"tags":[{"name":"trojan","slug":"trojan","permalink":"https://bakasine.github.io/tags/trojan/"},{"name":"xray","slug":"xray","permalink":"https://bakasine.github.io/tags/xray/"}]},{"title":"oracle免费云服务","slug":"oraclevps","date":"2022-09-03T01:46:35.000Z","updated":"2023-12-19T13:59:55.971Z","comments":true,"path":"2022/09/03/oraclevps/","permalink":"https://bakasine.github.io/2022/09/03/oraclevps/","excerpt":"","text":"注册 修改ssh端口密码脚本 创建实例 申请Ipv6 优化系统 dd系统 原邮箱找回 注册 oracle 修改ssh端口密码脚本 1bash -c "$(curl -L https://cdn.jsdelivr.net/gh/uerax/script@master/ssh.sh)" @ 创建实例 Launch resources --> Create a VM instance --> Image and shape --> Add SSH keys --> Boot volume --> Specify a... Ipv6 虚拟云网络 -> 点击vcn -> CIDR Blocks/Prefixes -> Add CIDR Block/IPv6 Prefix -> 勾选 Assign an Oracle allocated IPv6 /56 prefix 子网 -> 编辑 -> 勾选 Assign an Oracle allocated IPv6 /64 prefix -> 输入 00-FF之间 路由表 -> 添加路由规则 -> 选择IPv6 安全列表 -> 入站规则 -> 添加入站/出站规则 -> CIDR | ::/0 | 所有协议 附加的VNIC -> "IPv6地址 -> 分配IPv6地址 -> 自动或者手动(:ABF) 优化系统 一键脚本 1bash -c "$(curl -L https://cdn.jsdelivr.net/gh/uerax/script@master/ssh.sh)" @ dd系统后出现失联的情况, 推荐使用原生系统关闭防火墙使用_ 实例 --> 主要 VNIC --> 子网 --> 安全列表 --> 添加入站规则 --> CIDR 0.0.0.0/0 所有协议 1234567891011121314151617181920212223# ubuntu# 关闭防火墙iptables -P INPUT ACCEPTiptables -P FORWARD ACCEPTiptables -P OUTPUT ACCEPTiptables -F# 卸载防火墙apt-get purge netfilter-persistent && reboot# 删除防火墙rm -rf /etc/iptables && reboot# centos# 删除多余附件systemctl stop oracle-cloud-agentsystemctl disable oracle-cloud-agentsystemctl stop oracle-cloud-agent-updatersystemctl disable oracle-cloud-agent-updater# 停止firewall并禁止自启动systemctl stop firewalld.servicesystemctl disable firewalld.service 配置密码登录 12345678910111213# 配置root密码sudo passwd root# 修改sshd_config配置vim /etc/ssh/sshd_configPermitRootLogin yesPasswordAuthentication yes# vim endsudo service sshd restart 通过脚本修改 1234echo root:你的密码 |sudo chpasswd rootsudo sed -i 's/^#\\?PermitRootLogin.*/PermitRootLogin yes/g' /etc/ssh/sshd_config;sudo sed -i 's/^#\\?PasswordAuthentication.*/PasswordAuthentication yes/g' /etc/ssh/sshd_config;sudo service sshd restart dd系统 12345# debian 11 (-firmware 额外驱动支持, 默认密码MoeClub.org)bash <(wget --no-check-certificate -qO- 'https://raw.githubusercontent.com/bakasine/Scripts/main/DebianNET.sh') -d 11 -v 64 -port "2222" -p "密码" # ubuntu 22.04bash <(wget --no-check-certificate -qO- 'https://raw.githubusercontent.com/bakasine/Scripts/main/DebianNET.sh') -u 22.04 -v 64 -port "2222" -p 'password' 原邮箱找回 1.使用原注册邮箱去support注册并登陆 2.然后创建技术支持工单,会有个选项,选择你的产品,你会发现有个支持id,绑定的是你的oraclecloud计划,详细内容是"我原来的用户因为邮箱损坏,无法继续登陆,麻烦将邮箱重置为[email protected]" 3.不出24小时他会告诉你完成,请用新油箱登陆,你去找回密码即可 12345678右上角"contact us",然后 点击"Create Non-Technical SR",problem type 选择"login/administration/profile issues—login/Assess issue"Problem Summary里面就写"my oracle account has been stolen"点击下一步,描述里面就英文写一下"my oracle account has been stolen,please change my administrator email address to [email protected]"注意这里要一个新邮箱,不能是原邮然后下一步是传附件之类的,可以传一下邮箱里面账户相关的截图。然后 提交我发了不到一个小时就回了,让我提供一个新的邮箱地址,因为我第一次不知道,没提供新的邮箱地址后来把新邮箱地址 发过去了 ,可能是下班了,目前暂未回消息","categories":[{"name":"vps","slug":"vps","permalink":"https://bakasine.github.io/categories/vps/"}],"tags":[{"name":"oracle","slug":"oracle","permalink":"https://bakasine.github.io/tags/oracle/"}]},{"title":"ios去广告、分流、代理","slug":"quantumult-x","date":"2022-08-31T17:59:46.000Z","updated":"2023-03-22T06:11:26.045Z","comments":true,"path":"2022/09/01/quantumult-x/","permalink":"https://bakasine.github.io/2022/09/01/quantumult-x/","excerpt":"","text":"准备工作 导入配置 后记 准备工作 下载相关的工具,目前ios大部分的代理工具都具备此功能,主流的有以下四个。 Shadowrocket (3刀) Quantumult X (8刀) Surge (50刀) Loon (5刀) 我只用过前两个,而去广告需要长时驻留后台,所以选用耗电更少的Quantumult X。目前上述工具都需要非国区账号才可购买。 导入配置 打开Quantumult X -> 点击右下角 -> 拉到最下点击下载配置 输入 http://211336.xyz:1919/quantumult.conf 这是我自己的配置,也可以用网上的 开启MitM并信任Quantumult X证书 打开Quantumult X -> 点击右下角 -> MitM -> 开启MitM -> 生成密钥及证书 -> 右上角点保存 -> 允许安装描述文件 -> 关闭 -> 前往手机的设置,不是在Quantumult X -> 看到已下载描述文件 -> 安装 -> 输入手机的解锁密码 -> 安装 -> 安装 -> 前往手机的设置 -> 通用 -> 关于本机 -> 证书信任设置 -> 找到Quantumult X Custom Root Certificate -> 点绿它以信任该根证书 -> 继续 开启规则分流 打开Quantumult X -> 长按右下角 -> 选中规则分流 -> 添加自己的节点 -> 漏网之鱼选择你的节点 -> 开启右上角 后记 如果你不需要代理,只需要去广告。那你可以删除所有的节点 -> 删除所有的自定义策略 但是广告过滤列表如果你没有代理会拉取失败,所以需要第一次开启代理。 只去广告的话时间久了不更新策略会出现广告过滤失败,因为广告列表需要经常更新。 所以至少需要一个代理来保证策略的实时性才能有完整的体验","categories":[{"name":"tool","slug":"tool","permalink":"https://bakasine.github.io/categories/tool/"}],"tags":[{"name":"quantumultx","slug":"quantumultx","permalink":"https://bakasine.github.io/tags/quantumultx/"},{"name":"ios","slug":"ios","permalink":"https://bakasine.github.io/tags/ios/"}]},{"title":"netch游戏加速器","slug":"netch","date":"2022-08-31T16:56:47.000Z","updated":"2023-03-22T06:11:26.040Z","comments":true,"path":"2022/09/01/netch/","permalink":"https://bakasine.github.io/2022/09/01/netch/","excerpt":"","text":"netch介绍 需要准备的工具 netch使用方法 netch介绍 Netch 是一款 Windows 平台的开源游戏加速工具,Netch 可以实现类似 SocksCap64 那样的进程代理,也可以实现 SSTap 那样的全局 TUN/TAP 代理,和 Shadowsocks-Windows 那样的本地 Socks5,HTTP 和系统代理 目前 Netch 支持以下代理协议 Socks5 Shadowsocks ShadowsocksR Trojan VMess VLess 准备工具 1.代理节点 目前主流协议均支持,ss的效果最佳。需要开启udp转发才能正常加速游戏 2.netch客户端 netch使用方法 1.使用默认提供的模式,或者大佬提供的模式(网上很多) 2.通过进程模式加速 选择模式 -> 创建进程模式 选择扫描 -> 扫描要加速的游戏目录 -> 填写备注 -> 保存","categories":[{"name":"tool","slug":"tool","permalink":"https://bakasine.github.io/categories/tool/"}],"tags":[{"name":"netch","slug":"netch","permalink":"https://bakasine.github.io/tags/netch/"}]},{"title":"MacBook(M1)遇到的问题","slug":"mac-issue","date":"2021-10-08T16:26:28.000Z","updated":"2023-09-27T05:22:52.899Z","comments":true,"path":"2021/10/09/mac-issue/","permalink":"https://bakasine.github.io/2021/10/09/mac-issue/","excerpt":"","text":"Oh-My-Zsh问题 MySQL问题 Docker问题 Oh-My-Zsh问题 终端启动速度慢 12# 注释掉.zshrc的这段写入, zprofile越来越大会导致写入速度巨慢echo 'eval "$(/opt/homebrew/bin/brew shellenv)"' >> ~/.zprofile MySQL 通过docker安装mysql 12345678910111213// mysql 暂不支持 arm架构,所以选用 mysql-serverdocker pull mysql/mysql-serverdocker run --name mysql -e MYSQL_ROOT_PASSWORD=root -p 3306:3306 -d mysql/mysql-server// 因为只有8.0的版本支持arm架构,所以需要修改配置后才能通过 navicat 连接docker exec -it mysql mysql -uroot -puse mysql;update user set host='%' where user='root';flush privileges; Docker 通过docker安装nginx 1234// m1的docker容器与windows不同,类似于虚拟机// 容器访问宿主机不能直接使用localhost要使用docker.for.mac.host.internal","categories":[{"name":"mac","slug":"mac","permalink":"https://bakasine.github.io/categories/mac/"}],"tags":[{"name":"mac","slug":"mac","permalink":"https://bakasine.github.io/tags/mac/"},{"name":"issue","slug":"issue","permalink":"https://bakasine.github.io/tags/issue/"}]},{"title":"简单的自动抢购脚本编写方法","slug":"auto-script","date":"2021-08-19T11:19:39.000Z","updated":"2023-03-22T06:11:26.027Z","comments":true,"path":"2021/08/19/auto-script/","permalink":"https://bakasine.github.io/2021/08/19/auto-script/","excerpt":"","text":"事先准备 Node.js/Python postman 获取request 1F12 - network - 右键copy - copy as cURL 转成js/py脚本 1postman - 左上角import - row test - import - 点击右边code - 选择 nodejs-request 或者 python-request 需要安装request依赖 1npm install -save request 编写shell脚本并发执行 12345678910#!/bin/bashfor(( i = 0; i < 200; i++));do{ node ./auto.js >> ./out.txt sleep 0.1}&donewait 使用crontab定时执行脚本 1234567891011121314151617181920212223242526272829303132333435363738#每分钟执行一次* * * * * myCommand#每天中午12点执行0 12 * * * myCommand#每小时的第3和第15分钟执行3,15 * * * * myCommand#在上午8点到11点的第3和第15分钟执行3,15 8-11 * * * myCommand#每隔两天的上午8点到11点的第3和第15分钟执行3,15 8-11 */2 * * myCommand#每周一上午8点到11点的第3和第15分钟执行3,15 8-11 * * 1 myCommand#每晚的21:30重启smb30 21 * * * /etc/init.d/smb restart#每月1、10、22日的4 : 45重启smb45 4 1,10,22 * * /etc/init.d/smb restart#每周六、周日的1 : 10重启smb10 1 * * 6,0 /etc/init.d/smb restart#每天18 : 00至23 : 00之间每隔30分钟重启smb0,30 18-23 * * * /etc/init.d/smb restart#每星期六的晚上11 : 00 pm重启smb0 23 * * 6 /etc/init.d/smb restart#每一小时重启smb0 */1 * * * /etc/init.d/smb restart#晚上11点到早上7点之间,每隔一小时重启smb0 23-7/1 * * * /etc/init.d/smb restart","categories":[{"name":"linux","slug":"linux","permalink":"https://bakasine.github.io/categories/linux/"}],"tags":[{"name":"linux","slug":"linux","permalink":"https://bakasine.github.io/tags/linux/"},{"name":"shell","slug":"shell","permalink":"https://bakasine.github.io/tags/shell/"},{"name":"nodejs","slug":"nodejs","permalink":"https://bakasine.github.io/tags/nodejs/"}]},{"title":"SSR一键安装整合","slug":"ssr","date":"2020-02-23T15:19:36.000Z","updated":"2023-03-22T06:11:26.048Z","comments":true,"path":"2020/02/23/ssr/","permalink":"https://bakasine.github.io/2020/02/23/ssr/","excerpt":"","text":"逗比 123456789101112wget -N --no-check-certificate https://raw.githubusercontent.com/ToyoDAdoubiBackup/doubi/master/ssr.sh && chmod +x ssr.sh && bash ssr.sh备份: wget -N --no-check-certificate https://www.vrrmr.net/55R/SSR.sh && chmod +x SSR.sh && bash SSR.shShadowsocksR 安装后,自动设置为 系统服务,所以支持使用服务来启动/停止等操作,同时支持开机启动。启动 ShadowsocksR:/etc/init.d/ssr start停止 ShadowsocksR:/etc/init.d/ssr stop重启 ShadowsocksR:/etc/init.d/ssr restart查看 ShadowsocksR状态:/etc/init.d/ssr statusShadowsocksR 默认支持UDP转发,服务端无需任何设置。 91大神 123456789101112131415161718 wget -N --no-check-certificate https://raw.githubusercontent.com/91yun/shadowsocks_install/master/ssr-install.sh && bash ssr-install.sh备用代码:wget -N --no-check-certificate https://www.vrrmr.net/55R/ssr-install.sh && bash ssr-install.sh管理命令:添加用户:ssr adduser删除用户:ssr deluser启动SSR:ssr start停止SSR:ssr stop重启SSR:ssr restart卸载SSR:ssr uninstall更新SSR:ssr update修改用户和的加密,混淆和协议的话:修改vi /home/ssr/mudb.json文件 秋水大神 123456789101112131415161718192021222324252627282930313233343536373839一键安装 Shadowsocks-Python, ShadowsocksR, Shadowsocks-Go, Shadowsocks-libev 版(四选一)服务端.wget --no-check-certificate -O shadowsocks-all.sh https://raw.githubusercontent.com/teddysun/shadowsocks_install/master/shadowsocks-all.shchmod +x shadowsocks-all.sh./shadowsocks-all.sh 2>&1 | tee shadowsocks-all.log备用:wget --no-check-certificate -O shadowsocks-all.sh https://www.vrrmr.net/55R/shadowsocks-all.sh卸载代码:./shadowsocks-all.sh uninstall启动脚本后面的参数含义,从左至右依次为:启动,停止,重启,查看状态。Shadowsocks-Python 版:/etc/init.d/shadowsocks-python start | stop | restart | statusShadowsocksR 版:/etc/init.d/shadowsocks-r start | stop | restart | statusShadowsocks-Go 版:/etc/init.d/shadowsocks-go start | stop | restart | statusShadowsocks-libev 版:/etc/init.d/shadowsocks-libev start | stop | restart | status各版本默认配置文件Shadowsocks-Python 版:/etc/shadowsocks-python/config.jsonShadowsocksR 版:/etc/shadowsocks-r/config.jsonShadowsocks-Go 版:/etc/shadowsocks-go/config.jsonShadowsocks-libev 版:/etc/shadowsocks-libev/config.json","categories":[{"name":"linux","slug":"linux","permalink":"https://bakasine.github.io/categories/linux/"}],"tags":[{"name":"debian","slug":"debian","permalink":"https://bakasine.github.io/tags/debian/"},{"name":"ubuntu","slug":"ubuntu","permalink":"https://bakasine.github.io/tags/ubuntu/"},{"name":"SSR","slug":"SSR","permalink":"https://bakasine.github.io/tags/SSR/"}]},{"title":"V2Ray+WebSocket+TLS+Nginx一键安装脚本","slug":"v2ray","date":"2020-02-23T15:19:36.000Z","updated":"2023-03-22T06:11:26.048Z","comments":true,"path":"2020/02/23/v2ray/","permalink":"https://bakasine.github.io/2020/02/23/v2ray/","excerpt":"","text":"更新于 2022-09-14 22:12:21 脚本过老已不推荐使用,而且不安全 建议使用 trojan搭建 的方式搭建 准备一个域名解析到当前服务器ip 一键安装脚本(二选一) 脚本适用于:Debian 9+ / Ubuntu 18.04+ / Centos7+ 1.Vmess+websocket+TLS+Nginx+Website(推荐) 1bash <(curl -L -s https://raw.githubusercontent.com/wulabing/V2Ray_ws-tls_bash_onekey/master/install.sh) | tee v2ray_ins.log 2.Vmess + HTTP2 over TLS 1bash <(curl -L -s https://raw.githubusercontent.com/wulabing/V2Ray_ws-tls_bash_onekey/master/install_h2.sh) | tee v2ray_ins_h2.log 脚本管理 123456789101112131415161718192021222324252627#启动 V2ray:systemctl start v2ray#停止 V2ray:systemctl stop v2ray#启动 Nginx:systemctl start nginx#停止 Nginx:systemctl stop nginx#Web 目录:/home/wwwroot/levis#V2ray 服务端配置:/etc/v2ray/config.json#V2ray 客户端配置:执行安装时所在目录下的 v2ray_info.txt#Nginx 目录:/etc/nginx#证书目录:/data/v2ray.key 和 /data/v2ray.crt v2rayN Windows客户端下载/配置 1Windows客户端下载地址:http://down.wangchao.info/soft/v2rayN.zip 转载自 逗逼","categories":[{"name":"proxy","slug":"proxy","permalink":"https://bakasine.github.io/categories/proxy/"}],"tags":[{"name":"linux","slug":"linux","permalink":"https://bakasine.github.io/tags/linux/"},{"name":"debian","slug":"debian","permalink":"https://bakasine.github.io/tags/debian/"},{"name":"ubuntu","slug":"ubuntu","permalink":"https://bakasine.github.io/tags/ubuntu/"}]},{"title":"锐速","slug":"server-speeder","date":"2018-11-28T12:01:55.000Z","updated":"2023-03-22T06:11:26.047Z","comments":true,"path":"2018/11/28/server-speeder/","permalink":"https://bakasine.github.io/2018/11/28/server-speeder/","excerpt":"","text":"GitHub项目地址 1https://github.com/0oVicero0/serverSpeeder_Install 安装 1wget --no-check-certificate -qO /tmp/appex.sh "https://raw.githubusercontent.com/0oVicero0/serverSpeeder_Install/master/appex.sh" && bash /tmp/appex.sh 'install' 卸载 1wget --no-check-certificate -qO /tmp/appex.sh "https://raw.githubusercontent.com/0oVicero0/serverSpeeder_Install/master/appex.sh" && bash /tmp/appex.sh 'uninstall' 使用方法 12345启动命令 /appex/bin/serverSpeeder.sh start停止加速 /appex/bin/serverSpeeder.sh stop状态查询 /appex/bin/serverSpeeder.sh status更新许可 /appex/bin/serverSpeeder.sh renewLic重新启动 /appex/bin/serverSpeeder.sh restart 转载自 萌咖","categories":[{"name":"linux","slug":"linux","permalink":"https://bakasine.github.io/categories/linux/"}],"tags":[{"name":"linux","slug":"linux","permalink":"https://bakasine.github.io/tags/linux/"}]},{"title":"Git学习","slug":"git-note","date":"2018-10-14T16:58:23.000Z","updated":"2023-03-22T06:11:26.033Z","comments":true,"path":"2018/10/15/git-note/","permalink":"https://bakasine.github.io/2018/10/15/git-note/","excerpt":"","text":"Login 12git config --global user.name "username"git config --global email.name "email" 初始化一个Git仓库 1git init 添加文件到Git仓库 12345//可以用git add .直接将所有文件放入暂存区git add <file-name>//提交到版本库, 描述本次提交的说明git commit -m "本次提交的说明" 获取工作区的状态 12345//查看是否有文件进行修改git status//查看修改内容git diff 版本控制 123456789101112//查看提交日志git log//git log --graph --pretty=oneline --abbrev-commit//HEAD代表当前版本, HEAD^是上个版本, HEAD^^上上个版本, HEAD~N前N个版本//也可以用版本号指定git reset --hard <version>//由于使用reset回退版本后之前版本的提交日志也会消失//可以显示你每次命令可以查看到被你回退的版本号git reflog 撤销修改 12345//让文件回到最近一次git add或者git commit的状态git checkout -- <file-name>//将文件移出暂存区, 即取消git add操作git reset HEAD -- <file-name> 删除文件 1234//与git add的用法一样//从版本库里中删除文件git rm <file-name>git commit -m "本次提交的说明" 远程仓库 1234567891011121314151617//添加远程仓库//origin是远程仓库的默认名称可更改git remote add origin [email protected]:<github_username>/<repository>//第一次推送加上-u参数, Git会将本地 master 分支和远程 master 分支关联起来, 以后在推送时可简化命令git push -u origin master//推送分支git push origin <branch-name>//将远程仓库中的改动同步到本地git pull//如果git pull提示no tracking information, 则说明本地分支和远程分支的链接关系没有创建git branch --set-upstream-to <branch-name> origin/<branch-name>//查看远程仓库信息, 添加-v常熟可显示更详细信息git remote 分支 12345678910111213141516//创建分支, 并且切换到该分支git branch <branch-name>git checkout <branch-name>//-b参数相当于上面两条命令git checkout -b <branch-name>//在本地创建和远程分支对应的分支, 本地和远程分支的名称最好一致git checkout -b <branch-name> origin/<branch-name>//合并指定分支到当前分支git merge <branch-name>//删除分支git branch -d <branch-name>//如果当前分支还未合并则需要-D参数强行删除git branch -D <branch-name> 工作暂存 12345678910111213141516//将未提交的修改(包括暂存的和非暂存的)都保存起来git stash//推荐使用可添加说明方法git stash save "本次提交的说明"//将缓存堆栈中的stash应用到当前工作目录下, 不删除stashgit stash apply <stash>//移除stashgit stash drop <stash>//将缓存堆栈中的第一个stash删除, 并将对应修改应用到当前工作目录下git stash pop//查看现有的stashgit stash list 标签 123456789101112131415//新建一个标签,不写<commit-id>则默认为HEADgit tag <tag-name> <commit-id>//可以用参数-a指定标签名,-m指定说明文字git tag -a <tag-name> -m "说明" <commit-id>//查看标签信息和说明文字, 按字母排序git show <tag-name>//删除本地标签git tag -d <tag-name>//删除远程仓库标签git push origin :refs/tags/<tag-name>//将标签推送到远程仓库, 可以用--tags参数代替<tag-name>直接将所有标签推送到远程仓库git push origin <tag-name> 创建别名 123456789//将命令名用一个<new-name>代替作为别名//--global参数使该命令作用在当前用户, 如不加则只针对当前仓库git config --global alias.<new-name> 'old-name'//也可通过修改.git/config文件//在[alias]后面添加<new-name> = <old-name>//删除别名//直接修改.git/config文件 忽略特殊文件 123Git为我们提供了.gitignore文件,此文件专门来做忽略,只要在此文件中设置你想忽略的内容就可以了。不需要从头写.gitignore文件,GitHub已经为我们准备了各种配置文件,只需要组合一下就可以使用了。所有配置文件可以直接在线浏览:https://github.com/github/gitignore 下载远程仓库 1git clone <URL>","categories":[{"name":"note","slug":"note","permalink":"https://bakasine.github.io/categories/note/"}],"tags":[{"name":"git","slug":"git","permalink":"https://bakasine.github.io/tags/git/"}]},{"title":"(已失效)如何申请msn.com、live.com、live.cn等后缀邮箱","slug":"mail","date":"2018-06-26T18:20:23.000Z","updated":"2023-03-22T06:11:26.039Z","comments":true,"path":"2018/06/27/mail/","permalink":"https://bakasine.github.io/2018/06/27/mail/","excerpt":"","text":"登录邮箱 1https://account.live.com/AddAssocId F12(打开调试) -> Console(控制台) -> 粘贴脚本 (回车) 1var sub = window.prompt('1. 输入域名,支持live.com/msn.com/live.cn等等...\\r\\n 2. 更多后缀请访问:https://51.ruyo.net/p/3194.html\\r\\n 提醒:直接点击取消即可前往上面的网址!\\r\\n 3. 点击确定后,页面会刷新。\\r\\n 4. 页面刷新后,请添加你想要的别名即可。','live.com');if(sub){document.getElementById("SingleDomain").value = sub;document.getElementById("idSingleDomain").innerText = "@"+sub;document.getElementById("AssociatedIdLive").value="a";document.getElementById("SubmitYes").click();}else{window.open("https://51.ruyo.net/p/3194.html")}; 转载自 如有乐享","categories":[{"name":"others","slug":"others","permalink":"https://bakasine.github.io/categories/others/"}],"tags":[{"name":"email","slug":"email","permalink":"https://bakasine.github.io/tags/email/"}]},{"title":"Debian(Ubuntu)网络安装/重装系统一键脚本","slug":"re-os","date":"2018-06-26T15:19:36.000Z","updated":"2024-09-29T09:25:08.601Z","comments":true,"path":"2018/06/26/re-os/","permalink":"https://bakasine.github.io/2018/06/26/re-os/","excerpt":"","text":"更新于 2023-11-26 22:12:21 1bash <(wget --no-check-certificate -qO- 'https://raw.githubusercontent.com/MoeClub/Note/master/InstallNET.sh') -d 11 -v 64 -p "password" -port "2222" 国内机器 1bash <(wget --no-check-certificate -qO- 'https://gh-proxy.com/https://raw.githubusercontent.com/MoeClub/Note/master/InstallNET.sh') -d 11 -v 64 -p "password" -port "2222" --mirror 'https://mirrors.cloud.tencent.com/debian/' OpenVZ/LXC 架构 1wget -qO OsMutation.sh https://raw.githubusercontent.com/LloydAsp/OsMutation/main/OsMutation.sh && chmod u+x OsMutation.sh && ./OsMutation.sh 注意 全自动安装默认root密码: MoeClub.org,安装完成后请立即更改密码 请使用 passwd root 命令更改密码 OpenVZ构架不适用 确保安装了所需软件 12345#Debian/Ubuntu:apt-get install -y gawk sed grep #RedHat/CentOS:yum install -y gawk sed grep 如果出现了错误,请运行 12345#Debian/Ubuntu:apt-get update#RedHat/CentOS:yum update 自用debian9 123wget --no-check-certificate -qO DebianNET.sh 'https://raw.githubusercontent.com/bakasine/Scripts/main/DebianNET.sh' && chmod a+x DebianNET.shbash DebianNET.sh -d 11 -v 64 -p 密码 -a 一键下载 1wget --no-check-certificate -qO DebianNET.sh 'https://raw.githubusercontent.com/bakasine/Scripts/main/DebianNET.sh' && chmod a+x DebianNET.sh 全自动/非自动示例 全自动安装 1bash DebianNET.sh -d wheezy -v i386 -a VNC手动安装 1bash DebianNET.sh -d wheezy -v i386 -m 全自动安装(指定网络参数) 12345# 将X.X.X.X替换为自己的网络参数.# --ip-addr :IP Address/IP地址# --ip-gate :Gateway /网关# --ip-mask :Netmask /子网掩码bash DebianNET.sh -d wheezy -v i386 -a --ip-addr X.X.X.X --ip-mask X.X.X.X --ip-gate X.X.X.X 使用示例 【默认】安装Debian 7 x32 1bash DebianNET.sh -d wheezy -v i386 1bash DebianNET.sh -d 7 -v 32 安装Debian 8 x64 1bash DebianNET.sh -d jessie -v amd64 1bash DebianNET.sh -d 8 -v 64 安装Debian 9 x64 1bash DebianNET.sh -d stretch -v amd64 1bash DebianNET.sh -d 9 -v 64 安装Ubuntu 14.04 x64 1bash DebianNET.sh -u trusty -v 64 安装Ubuntu 16.04 x64 1bash DebianNET.sh -u xenial -v 64 安装Ubuntu 18.04 x64 1bash DebianNET.sh -u bionic -v 64 转载自 萌咖","categories":[{"name":"linux","slug":"linux","permalink":"https://bakasine.github.io/categories/linux/"}],"tags":[{"name":"linux","slug":"linux","permalink":"https://bakasine.github.io/tags/linux/"},{"name":"debian","slug":"debian","permalink":"https://bakasine.github.io/tags/debian/"},{"name":"ubuntu","slug":"ubuntu","permalink":"https://bakasine.github.io/tags/ubuntu/"}]},{"title":"PayPal 更换汇率结算","slug":"paypalfees","date":"2018-06-26T14:27:45.000Z","updated":"2023-03-22T06:11:26.042Z","comments":true,"path":"2018/06/26/paypalfees/","permalink":"https://bakasine.github.io/2018/06/26/paypalfees/","excerpt":"","text":"点击右上角齿轮 付款 - 管理自动付款 管理预核准付款 设置可用资金来源 兑换选项 在给我的账单中使用卖家列出的币种","categories":[{"name":"others","slug":"others","permalink":"https://bakasine.github.io/categories/others/"}],"tags":[{"name":"paypal","slug":"paypal","permalink":"https://bakasine.github.io/tags/paypal/"}]},{"title":"GitHub + Hexo 搭建博客","slug":"hexo","date":"2018-05-25T17:59:25.000Z","updated":"2023-12-20T11:59:17.502Z","comments":true,"path":"2018/05/26/hexo/","permalink":"https://bakasine.github.io/2018/05/26/hexo/","excerpt":"","text":"事先准备 Node.js Git 创建 GitHub Pages 这个百度都有 安装 Hexo 并检查是否安装成功 123cd D://hexonpm install hexo -ghexo -v 初始化 Hexo 1hexo init 依赖包安装 1npm install 编译 1hexo g 打开服务器 1hexo s 默认是 localhost:4000 联系到 GitHub 打开 Hexo 文件夹里的 _config.yml 文件 配置Deployment 1234deploy: type: git repository: 你的 repo 值 branch: master 安装扩展 1install hexo-deployer-git --save 写作 12hexo new <file-name>hexo n "我的第一篇文章" 部署到GitHub 1hexo d 问题处理 123456789// 下载国外的资源众所周知的慢,常用设置镜像,平时多用yarn// yarn全局安装及设置镜像npm install -g yarnyarn config set registry http://registry.npm.taobao.org/ -gyarn config set sass_binary_site http://cdn.npm.taobao.org/dist/node-sass -gnpm config set registry https://registry.npm.taobao.orgnpm config get registry // 查看是否配置成功npm config list // 查看npm当前配置npm cache clear --force // 强制清除缓存","categories":[{"name":"others","slug":"others","permalink":"https://bakasine.github.io/categories/others/"}],"tags":[{"name":"hexo","slug":"hexo","permalink":"https://bakasine.github.io/tags/hexo/"},{"name":"github","slug":"github","permalink":"https://bakasine.github.io/tags/github/"}]}],"categories":[{"name":"qa","slug":"qa","permalink":"https://bakasine.github.io/categories/qa/"},{"name":"tool","slug":"tool","permalink":"https://bakasine.github.io/categories/tool/"},{"name":"note","slug":"note","permalink":"https://bakasine.github.io/categories/note/"},{"name":"mining","slug":"mining","permalink":"https://bakasine.github.io/categories/mining/"},{"name":"crypto","slug":"crypto","permalink":"https://bakasine.github.io/categories/crypto/"},{"name":"others","slug":"others","permalink":"https://bakasine.github.io/categories/others/"},{"name":"tools","slug":"tools","permalink":"https://bakasine.github.io/categories/tools/"},{"name":"linux","slug":"linux","permalink":"https://bakasine.github.io/categories/linux/"},{"name":"game","slug":"game","permalink":"https://bakasine.github.io/categories/game/"},{"name":"vps","slug":"vps","permalink":"https://bakasine.github.io/categories/vps/"},{"name":"mac","slug":"mac","permalink":"https://bakasine.github.io/categories/mac/"},{"name":"proxy","slug":"proxy","permalink":"https://bakasine.github.io/categories/proxy/"}],"tags":[{"name":"qa","slug":"qa","permalink":"https://bakasine.github.io/tags/qa/"},{"name":"frp","slug":"frp","permalink":"https://bakasine.github.io/tags/frp/"},{"name":"vim","slug":"vim","permalink":"https://bakasine.github.io/tags/vim/"},{"name":"monero","slug":"monero","permalink":"https://bakasine.github.io/tags/monero/"},{"name":"openwrt","slug":"openwrt","permalink":"https://bakasine.github.io/tags/openwrt/"},{"name":"openclash","slug":"openclash","permalink":"https://bakasine.github.io/tags/openclash/"},{"name":"mining","slug":"mining","permalink":"https://bakasine.github.io/tags/mining/"},{"name":"note","slug":"note","permalink":"https://bakasine.github.io/tags/note/"},{"name":"zephyr","slug":"zephyr","permalink":"https://bakasine.github.io/tags/zephyr/"},{"name":"xmrig","slug":"xmrig","permalink":"https://bakasine.github.io/tags/xmrig/"},{"name":"interview","slug":"interview","permalink":"https://bakasine.github.io/tags/interview/"},{"name":"clash","slug":"clash","permalink":"https://bakasine.github.io/tags/clash/"},{"name":"cfw","slug":"cfw","permalink":"https://bakasine.github.io/tags/cfw/"},{"name":"crypto","slug":"crypto","permalink":"https://bakasine.github.io/tags/crypto/"},{"name":"contract","slug":"contract","permalink":"https://bakasine.github.io/tags/contract/"},{"name":"sim","slug":"sim","permalink":"https://bakasine.github.io/tags/sim/"},{"name":"danmu","slug":"danmu","permalink":"https://bakasine.github.io/tags/danmu/"},{"name":"sms","slug":"sms","permalink":"https://bakasine.github.io/tags/sms/"},{"name":"cutout","slug":"cutout","permalink":"https://bakasine.github.io/tags/cutout/"},{"name":"tools","slug":"tools","permalink":"https://bakasine.github.io/tags/tools/"},{"name":"image","slug":"image","permalink":"https://bakasine.github.io/tags/image/"},{"name":"web","slug":"web","permalink":"https://bakasine.github.io/tags/web/"},{"name":"ai","slug":"ai","permalink":"https://bakasine.github.io/tags/ai/"},{"name":"vits","slug":"vits","permalink":"https://bakasine.github.io/tags/vits/"},{"name":"regex","slug":"regex","permalink":"https://bakasine.github.io/tags/regex/"},{"name":"xray","slug":"xray","permalink":"https://bakasine.github.io/tags/xray/"},{"name":"vmess","slug":"vmess","permalink":"https://bakasine.github.io/tags/vmess/"},{"name":"vless","slug":"vless","permalink":"https://bakasine.github.io/tags/vless/"},{"name":"linux","slug":"linux","permalink":"https://bakasine.github.io/tags/linux/"},{"name":"bbr","slug":"bbr","permalink":"https://bakasine.github.io/tags/bbr/"},{"name":"lua","slug":"lua","permalink":"https://bakasine.github.io/tags/lua/"},{"name":"dota2","slug":"dota2","permalink":"https://bakasine.github.io/tags/dota2/"},{"name":"rpg","slug":"rpg","permalink":"https://bakasine.github.io/tags/rpg/"},{"name":"trojan","slug":"trojan","permalink":"https://bakasine.github.io/tags/trojan/"},{"name":"oracle","slug":"oracle","permalink":"https://bakasine.github.io/tags/oracle/"},{"name":"quantumultx","slug":"quantumultx","permalink":"https://bakasine.github.io/tags/quantumultx/"},{"name":"ios","slug":"ios","permalink":"https://bakasine.github.io/tags/ios/"},{"name":"netch","slug":"netch","permalink":"https://bakasine.github.io/tags/netch/"},{"name":"mac","slug":"mac","permalink":"https://bakasine.github.io/tags/mac/"},{"name":"issue","slug":"issue","permalink":"https://bakasine.github.io/tags/issue/"},{"name":"shell","slug":"shell","permalink":"https://bakasine.github.io/tags/shell/"},{"name":"nodejs","slug":"nodejs","permalink":"https://bakasine.github.io/tags/nodejs/"},{"name":"debian","slug":"debian","permalink":"https://bakasine.github.io/tags/debian/"},{"name":"ubuntu","slug":"ubuntu","permalink":"https://bakasine.github.io/tags/ubuntu/"},{"name":"SSR","slug":"SSR","permalink":"https://bakasine.github.io/tags/SSR/"},{"name":"git","slug":"git","permalink":"https://bakasine.github.io/tags/git/"},{"name":"email","slug":"email","permalink":"https://bakasine.github.io/tags/email/"},{"name":"paypal","slug":"paypal","permalink":"https://bakasine.github.io/tags/paypal/"},{"name":"hexo","slug":"hexo","permalink":"https://bakasine.github.io/tags/hexo/"},{"name":"github","slug":"github","permalink":"https://bakasine.github.io/tags/github/"}]}