golang sync.Map

“golang sync.Map” func main() { m := sync.Map{} m.Store(1,1) go do(m) go do(m) time.Sleep(1*time.Second) fmt.Println(m.Load(1)) } func do (m sync.Map) { i := 0 for i < 10000 { m.Store(1,1) i++ } } 清空 sync.Map https://stackoverflow.com/questions/49355345/how-to-clean-a-sync-map //erase map: A zero sync.Map is empty and ready for use. map2 = sync.Map{} 在Go 1.6 之前, 内置的 map 类型是部分 goroutine 安全的, 并发的读没有问题, 并发的写可能有问题。自 go 1.6之后, 并发地读写 map 会报错, 这在一些知名的开源库中都存在这个问题, 所以go 1.9之前的解决方案是额外绑定一个锁, 封装成一个新的struct或者单独使用锁都可以。 ...

5 min · 908 words · -

golang 正则

“golang 正则” https://studygolang.com/articles/7256 func main() { fmt.Println(regexp.Match("H.* ", []byte("Hello World!"))) // true }

1 min · 13 words · -

golang的类型转换, 强转、断言、“向上造型“

“golang 的类型转换, 强转、断言、“向上造型“” Golang的类型转换-三种转型(强转、断言、“向上造型“) 无数_mirage 2021-02-04 16:05:12 216 收藏 文章标签: golang go 接口 版权 golang没有类似于java中的隐式类型转换 golang中的类型转换分为强制类型转换、类型断言、以及“向上造型” 向上造型这个词是取的Java中的定义,没有复杂的含义,表示将子类转为父类。在golang中达到同样的目的只需要.父结构体即可 package main import “fmt” // 隐式类型转换和强转 func t1(){ var a float32 = 5.6 var b int = 10 //fmt.Println (a * b) // – 隐式类型转换,编译报错,不支持 fmt.Println(a * float32(b)) // – 强转 } type Base interface { hello() } type P interface { hi() } type S1 struct { } func (s1 *S1) hi() { fmt.Println(“s1-hi”) } func (s1 *S1) hello() { fmt.Println(“s1-hello”) } type S2 struct { } ...

1 min · 176 words · -

http method, get, head, post, options, put, delte, trace, connect

“http method, get, head, post, options, put, delete, trace, connect” https://www.cnblogs.com/machao/p/5788425.html HTTP Method 的历史: HTTP 0.9 这个版本只有 GET 方法 HTTP 1.0 这个版本有 GET HEAD POST 这三个方法 HTTP 1.1 这个版本是当前版本,包含 GET HEAD POST OPTIONS PUT DELETE TRACE CONNECT 这 8 个方法 我们先看看HTTP 1.1 规范的中文翻译 方法定义 (Method Definitions) HTTP/1.1常用方法的定义如下。虽然方法可以被展开,但新加的方法不能认为能分享与扩展的客户端和服务器同样的语义。 Hst 请求头域 (见13.23节) 必须能在所有的HTTP/1.1请求里出现。 9.1 安全和等幂 (Idempotent) 方法 9.1.1 安全方法 (Safe Methods) 实现者应当知道软件是代表用户在互联网上进行交互,并且应该小心地允许用户知道任何它们可能采取的动作(action),这些动作可能给他们自己或他人带来无法预料的结果。 特别的,GET和HEAD方法仅仅应该获取资源而不是执行动作 (action) 。这些方法应该被考虑是"安全"的。可以让用户代理用其他的方法,如: POST,PUT,DELETE,这样用户代理就能知道这些方法可能会执行不安全的动作。 自然的,保证当服务器由于执行GET请求而不能产生副作用是不可能的;实际上,一些动态的资源会考虑这个特性。用户并没有请求这些副作用,因此不需要对这些副作用负责。 9.1.2等幂方法 (Idempotent Mehtods) 方法可以有等幂的性质因为 (除了出错或终止问题) N>0个相同请求的副作用同单个请求的副作用的效果是一样 (译注: 等幂就是值不变性,相同的请求得到相同的响应结果,不会出现相同的请求出现不同的响应结果) 。方法GET,HEAD,PUT,DELETE都有这种性质。同样,方法OPTIONS和TRACE不应该有副作用,因此具有内在的等幂性。然而,有可能几个请求的序列是不等幂的,即使在那样的序列中所有方法都是等幂的。 (如果整个序列整体的执行的结果总是相同的,并且此结果不会因为序列的整体,部分的再次执行而改变,那么此序列是等幂的。) 例如,一个序列是非等幂的如果它的结果依赖于一个值,此值在以后相同的序列里会改变。 ...

5 min · 976 words · -

hugo, envoy, github actions

“hugo, envoy, github actions” install sudo pacman -S hugo hugo new site quickstart cd quickstart git init git submodule add https://github.com/theNewDynamic/gohugo-theme-ananke.git themes/ananke echo theme = \"ananke\" >> config.toml hugo new posts/my-first-post.md hugo server -D hugo new site wiloon.com cd wiloon.com git init git clone https://github.com/olOwOlo/hugo-theme-even themes/even cp themes/even/exampleSite/config.toml config.toml hugo new post/my-first-post.md hugo server -D hugo pages, nginx server simple podman run -d \ --name hugo \ -p 30080:80 \ -v /home/blog/public:/usr/share/nginx/html \ -v /etc/localtime:/etc/localtime \ nginx:alpine hugo pages, nginx server podman run -d \ --name hugo \ --ip=10.88.0.10 \ -v /home/blog/public:/usr/share/nginx/html \ -v /etc/localtime:/etc/localtime \ nginx:alpine hugo-envoy podman run -d \ --name hugo-envoy \ -v /opt/hugo/service-envoy.yaml:/etc/envoy/envoy.yaml \ -v /etc/localtime:/etc/localtime \ --net=container:hugo \ envoyproxy/envoy-alpine:v1.14.1 front-envoy podman run -d \ --name front-envoy \ --add-host=hugo:10.88.0.10 \ -v /opt/hugo/front-envoy.yaml:/etc/envoy/envoy.yaml \ -v /etc/localtime:/etc/localtime \ -v /root/.acme.sh/yangcs.net:/root/.acme.sh/yangcs.net \ --net host \ envoyproxy/envoy-alpine:v1.14.1 https://blog.humblepg.com/post/2020/02/log-hugo-github-actions.html ...

2 min · 328 words · -

icebox

“icebox” 先用adb安装 谷歌版冰箱激活 Root方法: 把冰箱apk放到 /data/local/tmp/ 文件夹中,然后为方便起见重命名为icebox.apk 然后打开终端,su后输入 pm install -i “com.android.vending” -r /data/local/tmp/icebox.apk 搞定[受虐滑稽] adb方法: 手机接上电脑, 执行 adb push [冰箱apk位置] /data/local/tmp/icebox.apk adb shell pm install -i “com.android.vending” -r /data/local/tmp/icebox.apk adb shell rm /data/local/tmp/icebox.apk 同样搞定[受虐滑稽][受虐滑稽] 然后你就可以连上谷歌验证购买了 参考: https://medium.com/@pixplicity/setting-the-install-vendor-of-an-app-7d7deacb01ee 冰箱免 Root (设备管理员模式) 手动配置 https://github.com/heruoxin/Ice-Box-Docs/blob/master/Device%20Owner%20%EF%BC%88%E5%85%8D%20root%EF%BC%89%E6%A8%A1%E5%BC%8F%E8%AE%BE%E7%BD%AE.md adb shell dpm set-device-owner com.catchingnow.icebox/.receiver.DPMReceiver

1 min · 48 words · -

Infinitive 不定式

Infinitive 不定式 动词不定式一般是由“to + 动词原形”构成,还需要注意得是,这里的 to 是动词不定式的一部分,不做介词使用。举几个动词不定式的例子: to be to have to hold to sleep to spend 一定要注意的是,动词不定式中词尾从不以-ed或-ing结尾。动词不定式是动词的三种类型之一,具有动词、形容词、名词或副词的特征。在句子中通常可以作主语、宾语、补语、表语、定语、状语等。 https://liulingo.com/infinitive-yong-fa-he-li-zi

1 min · 19 words · -

iperf3 测速

iperf3 测速 install # centos yum install iperf3 # openwrt opkg install iperf3 #ubuntu apt-get install iperf3 windows https://iperf.fr/iperf-download.php#windows command server iperf3 -s client iperf3 -c 192.168.50.101 -t 104 # -c, --client <host> run in client mode, connecting to <host> # -t, --time time in seconds to transmit for (default 10 secs) Iperf3 是一个网络性能测试工具。Iperf 可以测试最大 TCP 和 UDP 带宽性能, 具有多种参数和 UDP 特性, 可以根据需要调整, 可以报告带宽、延迟抖动和数据包丢失. 对于每个测试, 它都会报告带宽, 丢包和其他参数, 可在 Windows、Mac OS X、Linux、FreeBSD 等各种平台使用, 是一个简单又实用的小工具。 ...

1 min · 163 words · -

java coroutine

“java coroutine” Kotlin https://github.com/puniverse/quasar https://github.com/offbynull/coroutines https://github.com/kilim/kilim

1 min · 6 words · -

java 替换 ascii 不可见字符, StringEscapeUtils.escapeJava

“java 替换ascii不可见字符, StringEscapeUtils.escapeJava” StringEscapeUtils.escapeJava StringEscapeUtils.escapeJava String.replaceAll 替换成? my_string.replaceAll("\\p{C}", "?"); https://stackoverflow.com/questions/6198986/how-can-i-replace-non-printable-unicode-characters-in-java StringEscapeUtils 在java.commons.lang3的包中有许多方便好用的工具类,类似于处理字符串的StringUtils,处理日期的DateUtils等等,StringEscapeUtils也是其中的一员。 StringEscapeUtils是在java.commons.lang3的2.0版本中加入的工具类,在3.6版本中被标注为@deprecated,表明在之后的版本中则为过时状态,之后StringEscapeUtils类被移到java.commons.text包下。 功能用途 StringEscapeUtils的主要功能就是为Java,Java Script,Html,XML进行转义与反转义。 escapeJava(String input) / unescapeJava(String unionCodeString) 将输入字符串转为unicode编码 / 将unicode字符串转为Utf-8格式的字符串 escapeHtml4(String input) / unescapeHtml4(String input) 转义/反转义html脚本 escapeEcmaScript(String input) / unescapeEcmaScript(String input) 转义/反转义js脚本 escapeXml(String input) / unescapeXml(String input) 转义/反转义xml脚本 除了列出的几个较常用的方法,还有escapeJson(String input) / unescapeJson(String input)、escapeCsv(String input) / unescapeCsv(String input)等等,可以看一下下面的执行例子,有个直观的认识。 import org.apache.commons.text.StringEscapeUtils; import org.junit.Test; /** * @author liuqian * @date 2018/4/3 16:27 */ public class EscapeTest { @Test public void escapeTest() { System.out.println("转义/反转义Java字符串"); String javaString = "这是Java字符串"; System.out.println(StringEscapeUtils.escapeJava(javaString)); System.out.println(StringEscapeUtils.unescapeJava(StringEscapeUtils.escapeJava(javaString))); System.out.println("-------------------------------------------------------------"); System.out.println("转义/反转义Json字符串"); String jsonString = "{\"keyword\": \"这是Json字符串\"}"; System.out.println(StringEscapeUtils.escapeJson(jsonString)); System.out.println(StringEscapeUtils.unescapeJson(StringEscapeUtils.escapeJson(jsonString))); System.out.println("-------------------------------------------------------------"); //除了html4还有html3等格式 System.out.println("转义/反转义Html字符串"); String htmlString = "加粗字符"; System.out.println(StringEscapeUtils.escapeHtml4(htmlString)); System.out.println(StringEscapeUtils.unescapeHtml4(StringEscapeUtils.escapeHtml4(htmlString))); System.out.println("-------------------------------------------------------------"); //除了xml10还有xml11等格式 System.out.println("转义/反转义xml字符串"); String xmlString = "<xml>\"xml字符串\"</xml>"; System.out.println(StringEscapeUtils.escapeXml10(xmlString)); System.out.println(StringEscapeUtils.unescapeXml(StringEscapeUtils.escapeXml10(xmlString))); System.out.println("-------------------------------------------------------------"); System.out.println("转义/反转义csv字符串"); String csvString = "1997,Ford,E350,\"Super, luxurious truck\""; System.out.println(StringEscapeUtils.escapeCsv(csvString)); System.out.println(StringEscapeUtils.unescapeCsv(StringEscapeUtils.escapeCsv(csvString))); System.out.println("-------------------------------------------------------------"); System.out.println("转义/反转义Java Script字符串"); String jsString = "<script>alert('1111')</script>"; System.out.println(StringEscapeUtils.escapeEcmaScript(jsString)); System.out.println(StringEscapeUtils.unescapeEcmaScript(StringEscapeUtils.escapeEcmaScript(jsString))); } } 结果 转义/反转义Java字符串 \u8FD9\u662FJava\u5B57\u7B26\u4E32 这是Java字符串 ------------------------------------------------------------- 转义/反转义Json字符串 {\"keyword\": \"\u8FD9\u662FJson\u5B57\u7B26\u4E32\"} {\"keyword\": \"这是Json字符串\"} ------------------------------------------------------------- 转义/反转义Html字符串 <strong>加粗字符</strong> 加粗字符 ------------------------------------------------------------- 转义/反转义xml字符串 <xml>&quot;xml字符串&quot;</xml> <xml>"xml字符串"</xml> ------------------------------------------------------------- 转义/反转义csv字符串 "1997,Ford,E350,""Super, luxurious truck""" 1997,Ford,E350,"Super, luxurious truck" ------------------------------------------------------------- 转义/反转义Java Script字符串 <script>alert(\'1111\')<\/script> <script>alert('1111')</script> https://github.com/lq920320/blogs/issues/9

1 min · 160 words · -

jdk14

jdk14 instanceof 模式匹配 JDK 14的新特性:instanceof模式匹配 JDK14在2020年的3月正式发布了。可惜的是正式特性只包含了最新的Switch表达式,而Records,patterns,text blocks仍然是预览特性。 本文要讲的就是JDK14的一个预览特性instanceof的pattern matching。 也就是说在instanceof中可以使用模式匹配了。 怎么理解呢? 我们先举个历史版本中使用instanceof的例子。 假如我们是动物园的管理员,动物园里面有Girraffe和Hippo两种动物。 @Data public class Girraffe { private String name; } @Data public class Hippo { private String name; } public class TestZoo { private final static Logger logger = LoggerFactory.getLogger(TestZoo.class); public static void main(String[] args) { Girraffe g = new Girraffe(); g.setName("gg"); testZooOld(g); testZooNew(g); Cat c = new Cat(); c.setName("pipi"); testZooOld(c); testZooNew(c); } public static void testZooOld(Object animal) { if (animal instanceof Girraffe) { Girraffe girraffe = (Girraffe) animal; logger.info("girraffe name is {}", girraffe.getName()); } else if (animal instanceof Hippo) { Hippo hippo = (Hippo) animal; logger.info("hippo name is {}", hippo.getName()); }else{ logger.info("test zoo old, 对不起,该动物不是地球上的生物!"); } } public static void testZooNew(Object animal){ if(animal instanceof Girraffe girraffe){ logger.info("name is {}",girraffe.getName()); }else if(animal instanceof Hippo hippo){ logger.info("name is {}",hippo.getName()); }else{ logger.info("test zoo new, 对不起,该动物不是地球上的生物!"); } } } ...

1 min · 143 words · -

jdk16

jdk16 新语言特性 JEP 394,适用于 instanceof 的模式匹配 模式匹配 (Pattern Matching) 最早在 Java 14 中作为预览特性引入,在 Java 15 中还是预览特性。模式匹配通过对 instacneof 运算符进行模式匹配来增强 Java 语言。 模式匹配使程序中的通用逻辑 (即从对象中有条件地提取组件) 得以更简洁、更安全地表示。 wiloon.com/jdk14 JEP 395,记录 记录 (Records) 在 Java 14 和 Java 15 中作为预览特性引入。它提供了一种紧凑的语法来声明类,这些类是浅层不可变数据的透明持有者。这将大大简化这些类,并提高代码的可读性和可维护性。

1 min · 35 words · -

JTAG

“JTAG” JTAG JTAG (Joint Test Action Group,联合测试行动小组) 是一种国际标准测试协议,主要用于芯片内部测试。现在多数的高级器件都支持JTAG协议,如ARM、DSP、FPGA器件等。标准的JTAG接口是4线: TMS、 TCK、TDI、TDO,分别为模式选择、时钟、数据输入和数据输出线。 JTAG最初是用来对芯片进行测试的,基本原理是在器件内部定义一个TAP (Test Access Port,测试访问口) ,通过专用的JTAG测试工具对进行内部节点进行测试。JTAG测试允许多个器件通过JTAG接口串联在一起,形成一个JTAG链,能实现对各个器件分别测试。现在,JTAG接口还常用于实现在线编程 (ISP,In-System Programmable) ,对FLASH等器件进行编程。 JTAG编程方式是在线编程,传统生产流程中先对芯片进行预编程实现再装到板上因此而改变,简化的流程为先固定器件到电路板上,再用JTAG编程,从而大大加快工程进度。JTAG接口可对PSD芯片内部的所有部件进行编程。 简单地说,JTAG的工作原理可以归结为: 在器件内部定义一个TAP (TestAccessPort,测试访问口) ,通过专用的JTAG测试工具对内部节点进行测试和调试。 边界扫描 边界扫描 (Boundary-Scan) 即在芯片的每个输入输出管脚上都增加一个移位寄存器单元 (Boundary-Scan Register Cell) ,因为这些移位寄存器单元分布在芯片的边界上,所以被称为边界扫描寄存器。在JTAG 调试中,边界扫描是一个很重要的概念,当需要调试芯片时,这些寄存器将芯片与外围电路隔离,实现对芯片输入输出信号的观察和控制: 对于输入管脚,可以通过与之相连的边界扫描寄存器单元把数据加载到该管脚中;对于输出管脚,可以通过与之相连的边界扫描寄存器"捕获" (CAPTURE) 该管脚上的输出信号;正常运行状态下,这些边界扫描寄存器单元对芯片是透明的,所以正常的运行不会受到影响。另外,芯片输入输出管脚上的边界扫描 (移位) 寄存器单元可以相互连接起来,在芯片的周围形成一个边界扫描链 (Boundary-Scan Chain) ,它可以串行的输入和输出,通过相应的时钟信号和控制信号,实现对处在调试状态下的芯片的输入和输出状态的观察和控制。 在CPU外围,处理器内部包含了JTAG的硬件实现,并且向外界提供接口,也就是上面所说的TMS、TCK、TDI、TDO四个引脚。 这里的CPU: 是指运算处理单元,只包含了内部寄存器以及运算单元等基本部件。 这里的处理器: 是指CPU 扩展芯片,不是SoC。 说明: 更多关于CPU和处理器之间的关系,请参考文章《CPU MPU MCU SOC SOPC关系及区别》。 JTAG原理 边界扫描链 JTAG如何用于芯片测试呢?其中用到的最主要部件就是边界扫描链。命名为边界扫描链,是由于它位置处于处理器的边界上。 我们知道CPU是通过引脚与外围交流的,所有的数据都会通过引脚输入或者输出,而JTAG就是通过监控引脚的信号达到芯片测试的目的。而边界扫描链就是在引脚上的一个部件。如下图: 边界扫描链位置 边界扫描链位置 通过边界扫描链,当有信号输入的时候,边界扫描链就能获取信号,当CPU要输出信号的时候,边界扫描链也能获取要输出的信号。另外,也可以通过边界扫描链来直接向外部输出信号。 无论是信号的抓取还是输出,都需要有接口来保存这些信号,TDI 跟 TDO 就是做这样一些工作的。如图: JTAG TDI TDO示意图 JTAG TDI TDO示意图 本来边界扫描链保存着引脚上的信号,当通过TDI引脚输入我们自己的信号的时候,会发生沿上面红线方向的移位操作, ...

1 min · 142 words · -

jvm

jvm JVM是Java Virtual Machine (Java虚拟机)的缩写 常用jvm 目前市面上普遍使用的JVM大致有三种 Sun公司的HotSpot——绝大多数java开发者都用的是这款,绝对的主力 Oracle公司的JRockit——这款主要用于金融和军事 IBM公司的J9 VM——这款是IBM硬件绑定的,用户也很少 IBM 开源了它开发的 J9 Java 虚拟机 (JVM),并将其贡献给了 Eclipse 基金会,重命名为 Eclipse OpenJ9。J9 是一个高性能可伸缩的 Java 虚拟机,是许多 IBM 企业级软件产品的核心,OpenJ9 可作为 Hotspot 的替代者用于 OpenJDK Java虚拟机四大组成部分 执行引擎(解释器和即时编译器) 类加载器 运行时数据区 垃圾回收器 执行引擎 Execution Engine Java虚拟机的执行引擎主要是用来执行Java字节码。JVM的执行引擎执行字节码通过两种解释器执行的:字节码解释器与模板解释器,运行过程中,可能会触发即时编译 (JIT),涉及到几种即时编译器,下面分别进行介绍。 执行引擎是Java虛拟机核心的组成部分之一。 虚拟机是一个相对于“物理机”的概念,这两种机器都有代码执行能力,其区别是物理机的执行引擎是直接建立在处理器、缓存、指令集和操作系统层面上的,而虚拟机的执行引擎则是由软件自行实现的,因此可以不受物理条件制约地定制指令集与执行引擎的结构体系,能够执行那些不被硬件直接支持的指令集格式。 JVM的主要任务是负责装载字节码到其内部,但字节码并不能够直接运行在操作系统之上,因为字节码指令并非等价于本地机器指令,它内部包含的仅仅只是一些能够被JVM所识别的字节码指令、符号表,以及其他辅助信息。 如果想要让一个Java程序运行起来,执行引擎(Execution Engine)的任务就是将字节码指令解释/编译为对应平台上的本地机器指令才可以。简单来说,JVM中的执行引擎充当了将高级语言翻译为机器语言的译者。 解释器分类 在Java的发展历史里,一共有两套解释执行器,即古老的字节码解释器、现在普遍使用的模板解释器。 字节码解释器:在执行时通过纯软件代码模拟字节码的执行,效率非常低下。 模板解释器:将每一条字节码和一个模板函数相关联,模板函数中直接产生这条字节码执行时的本地机器代码,从而很大程度上提高了解释器的性能。 在HotSpot VM中,解释器主要由Interpreter模块和Code模块构成。 Interpreter模块:实现了解释器的核心功能 Code模块:用于管理HotSpotVM在运行时生成的本地机器指令 JIT编译器(Just In Time Compiler) 就是虚拟机将源代码直接编译成和本地机器平台相关的汇编语言,通过汇编生成机器代码。 现代虚拟机为了提高执行效率,会使用即时编译技术将方法编译成本地机器代码后再执行 Hotspot JIT编译器生成的是汇编代码,保存在方法区的JIT缓存区 本地机器代码不等于机器码,不同平台虚拟机翻译成本地的能识别的指令集,或者说是汇编语言。指令集由不同的架构构成,如:x86指令集 为什么还需要解释器 有些开发人员会感觉到诧异,既然HotSpot VM中已经内置JIT编译器了,那么为什么还需要再使用解释器来“拖累”程序的执行性能呢?比如JRockit VM内部就不包含解释器,字节码全部都依靠即时编译器编译后执行。 首先明确: 当程序启动后,解释器可以马上发挥作用,省去编译的时间,立即执行。编译器要想发挥作用,把代码编译成本地代码,需要一定的执行时间。但编译为本地代码后,执行效率高。 所以: 尽管JRockitVM中程序的执行性能会非常高效,但程序在启动时必然需要花费更长的时间来进行编译。对于服务端应用来说,启动时间并非是关注重点,但对于那些看中启动时间的应用场景而言,或许就需要采用解释器与即时编译器并存的架构来换取一一个平衡点。在此模式下,当Java虛拟器启动时,解释器可以首先发挥作用,而不必等待即时编译器全 部编译完成后再执行,这样可以省去许多不必要的编译时间。随着时间的推移,编译器发挥作用,把越来越多的代码编译成本地代码,获得更高的执行效率。同时,解释执行在编译器进行激进优化不成立的时候,作为编译器的“逃生门” 当虚拟机启动的时候,解释器可以首先发挥作用,而不必等待即时编译器全部编译完成再执行,这样可以省去许多不必要的编译时间。并且随着程序运行时间的推移,即时编译器逐渐发挥作用,根据热点探测功能,将有价值的字节码编译为汇编语言,以换取更高的程序执行效率。 ...

7 min · 1412 words · -

jwt spring security

“jwt spring security” POST http://localhost:9333/api/users/sign-up content-type: application/json {“userName”:“123456”,“fullName”:“shuangkou”,“password”:“123456”} https://example.com/comments/1 POST https://example.com/comments HTTP/1.1 content-type: application/json { “name”: “sample”, “time”: “Wed, 21 Oct 2015 18:27:50 GMT” } https://www.jianshu.com/p/0c54788c94f3 https://github.com/Snailclimb/spring-security-jwt-guide

1 min · 27 words · -

Legendary

“Legendary” https://github.com/derrod/legendary https://github.com/doitsujin/dxvk/wiki/Common-issues legendary auth legendary list-games legendary launch Kinglet legendary list-installed –check-updates legendary launch Kinglet

1 min · 16 words · -

lombok

“lombok” lombok注解介绍 lombok注解文档 lombok官网下载 lombok是一个可以帮助我们简化java代码编写的工具类,尤其是简化javabean的编写,即通过采用注解的方式,消除代码中的构造方法,getter/setter等代码,使我们写的类更加简洁,当然,这带来的副作用就是不易阅读…不过,还是能看得懂吧,废话不多说,先看一下lombok支持的一些常见的注解。 @NonNull @Cleanup @Getter/@Setter @ToString @EqualsAndHashCode @NoArgsConstructor/@RequiredArgsConstructor /@AllArgsConstructor @Data @Value @SneakyThrows @Synchronized @Log

1 min · 17 words · -

Mustache语法

“Mustache语法” Mustache是一个logic-less (轻逻辑) 模板解析引擎, 它是为了使用户界面与业务数据 (内容) 分离而产生的, 它可以生成特定格式的文档,通常是标准的HTML文档。 比如小程序的wxml中的代码 {{userInfo.nickName}},这里的{{ }}就是Mustache的语法。 Mustache的模板语法很简单,就那么几个 {{keyName}} {{{keyName}}} {{#keyName}} {{/keyName}} {{^keyName}} {{/keyName}} {{.}} {{!comments}} {{>partials}}

1 min · 21 words · -

MySQL 显示行号,以及分组排序

“MySQL 显示行号,以及分组排序” CREATE TABLE my_tb ( id int(11) NOT NULL AUTO_INCREMENT, parent_code varchar(255) DEFAULT NULL, code varchar(255) DEFAULT NULL, PRIMARY KEY (id) ) ENGINE=InnoDB AUTO_INCREMENT=8 DEFAULT CHARSET=utf8; INSERT INTO `my_tb` ( `parent_code`, `code`) VALUES ('01', '001'); INSERT INTO `my_tb` ( `parent_code`, `code`) VALUES ('01', '002'); INSERT INTO `my_tb` ( `parent_code`, `code`) VALUES ('02', '001'); INSERT INTO `my_tb` ( `parent_code`, `code`) VALUES ('01', '003'); INSERT INTO `my_tb` ( `parent_code`, `code`) VALUES ('02', '002'); INSERT INTO `my_tb` ( `parent_code`, `code`) VALUES ('03', '001'); INSERT INTO `my_tb` ( `parent_code`, `code`) VALUES ('04', '001'); -- 生成 行号 select @r:=@r+1 as row_num , a.* from my_tb a ,(select @r:=0) b -- 生成 分组排序号 select @group_row:=CASE when @parent_code=a.parent_code then @group_row+1 else 1 end as groupRow, @parent_code:=a.parent_code as parent_code, a.code from my_tb a ,( select @group_row:=1, @parent_code:='') as b ORDER BY a.parent_code , a.code 查询结果 "groupRow" "parent_code" "code" "1" "01" "001" "2" "01" "002" "3" "01" "003" "1" "02" "001" "2" "02" "002" "1" "03" "001" "1" "04" "001" https://blog.csdn.net/kxjrzyk/article/details/58588000

1 min · 163 words · -

MySQL自定义变量

“MySQL自定义变量” MySQL自定义变量的使用 用户自定义变量是一个容易被遗忘的MySQL特性,但是如果能用的好,发挥其潜力,在某些场景可以写出非常高效的查询语句。在查询中混合使用过程化和关系化逻辑的时候,自定义变量可能会非常有用。单纯的关系查询将所有的东西都当成无序的数据集合,并且一次性操作它们。MySQL则采用了更加程序化的处理方式。MySQL的这种方式有它的弱点,但如果能够熟练地掌握,则会发现其强大之处,而用户自定义变量也可以给这种方式带来很大的帮助 用户自定义变量是一个用来存储内容的临时容器,在连接MySQL的整个过程中都存在,可以使用下面的SET和SELECT语句来定义它们: SET @ONE := 1; SELECT @ONE; MySQL> SET @min_actor := (SELECT MIN(actor_id) FROM sakila.actor); MySQL> SET @last_week := CURRENT_DATE - INTERVAL 1 WEEK; 然后可以在任何可以使用表达式的地方使用这些自定义变量: SELECT … WHERE col <= @last_week; 在了解自定义变量的强大之前,我们先来看看它自身的一些属性和限制,看看在哪些场景下我们不能使用用户自定义变量: 使用自定义变量的查询,无法使用查询缓存 不能再使用常量或者标识符的地方使用自定义变量,例如表名、列名和LIMIT子句中。 用户自定义变量的生命周期是在一个连接中有效,所以不能用它们来做连接间的通信。 如果使用连接池或者持久化连接,自定义变量可能让看起来毫无关系的代码发生交互。 自定义变量的类型是一个动态类型。 MySQL优化器在某些场景下可能会将这些变量优化掉,这可能导致代码不按预想的方式运行。 赋值的顺序和赋值的时间点并不总是固定的,这依赖于优化器的决定。 赋值符号 :=的优先级非常低,所以需要注意,赋值表达式应该使用明确的括号。 使用未定义变量不会产生任何语法错误,如果没有意识到这一点,非常容易犯错。 https://www.jianshu.com/p/357a02fb2d64

1 min · 46 words · -