草稿和素材

curl的笔记

1
curl -X POST http://balabala.com/balabala -d {\"param1\":\"value\"}

-X可以指定请求方式,比如POST或者GET.

-d可以指定参数,但是似乎默认的参数格式是"a=sss&b=c"这种格式

似乎需要额外的参数指定json格式呢

找到了

1
curl -H "Content-Type:application/json" -X POST http://balabala.com/balabala -d {\"param1\":\"value\"}

DevOps

Development and Operations

特点?

好处都有啥?

缺点?

采用的技术?

VSCode

很好,vscode很好
vscode很奇怪 不是很好

材料

  • md编辑时打开preview关闭很迷
  • terminal放到右边时如何回到下方

零样本学习

pycryptodome

什么是pycryptodome

源码

为什么不看一看源码呢

iptables

1
iptables -t nat -nL

iptables好像很有趣

gitbook?

#的作用


比如#test可以访问这里

docker的网络模型

导出word的方案

telnet使用

Spring boot中使用redis做缓存

一篇文章: https://www.cnblogs.com/gdpuzxs/p/7222309.html
另一篇: https://www.cnblogs.com/badboyf/p/6995202.html?utm_source=itdadao&utm_medium=referral

中文文案排版指南

https://github.com/mzlogin/chinese-copywriting-guidelines#%E8%B0%81%E5%9C%A8%E8%BF%99%E6%A0%B7%E5%81%9A

Go

方法以及简单的Hello World

1
2
3
4
5
6
7
package main

import "fmt"

func main() {
fmt.Println("Hello, World!")
}

用scratch来制作一个go应用镜像

摘自菜鸟教程。

package main代表是一个可独立执行的程序。

fmt是一个IO库。

Println竟然是大写

{的位置

1
2
3
4
func main()
{
fmt.Println("Hello, Wolrd")
}

这样写会报错。。。。真的有这个必要吗

for循环

1
2
3
4
5
var list = []int32{1, 2, 3}

for i := 0; i < len(list); i++ {
fmt.Println(i)
}

变量命名

使用单驼峰命名方式,不是下划线或者双驼峰

调试

1
go run filename.go

新问题

在docker里面启动的东西能不能把命令行的日志放到日志文件里啊

试一下吧

docker启动一个redis

1
2
docker pull redis
docker run -d --name myredis -p 16379:6379 redis --requirepass "mypassword"

Arduino

注释

可以使用

舵机

使用Servo控制舵机

Serial

1
Serial.begin();

(Arduino高亮是不是有bug)

css3动画

真好玩

vue中操作cookie

axios默认不允许请求携带cookie

需要使用

1
axios.defaults.withCredetials = true;

接收不到cookie

不要使用mock即可

Redis

Redis在互联网公司一般有以下应用:

String:缓存、限流、计数器、分布式锁、分布式Session

Hash:存储用户信息、用户主页访问量、组合查询

List:微博关注人时间轴列表、简单队列

Set:赞、踩、标签、好友关系

Zset:排行榜

Ant Design

Kite

安装

先翻个墙:

1
2
3
go get -u github.com/gpmgo/gopm

gopm get -g -v github.com/koding/kite

创建Project

如果使用goland,不要把目录放在GOROOT下面

哈夫曼编码

glsl

点乘是dot

叉乘是cross

圈乘$\otimes$是把对应位置乘起来,可以用matrixCompMult

叉乘

假设有向量$\mathrm{A}=(x_1,y_1,z_1),\mathrm{B}=(x_2,y_2,z_2)$,那么

$$
\mathrm{A}\times\mathrm{B}=(y_1\times{z_2}-y_2\times{z_1},z_1\times{x_2}-z_2\times{x_1},x_1\times{y_2}-x_2\times{y_1})
$$

酷Q docker

测试一下

1
2
3
docker pull coolq/wine-coolq
mkdir /root/coolq-data
docker run --name=coolq -d -p 8080:9000 -v /root/coolq-data:/home/user/coolq -e VNC_PASSWD=12345678 -e COOLQ_ACCOUNT=123456 coolq/wine-coolq

访问对应的端口输入密码即可操作

进入/root/cooq-data/conf,编辑CQP.cfg,添加

1
2
[Debug]
DeveloperMode=1

把开发好的应用拉下来试试(

接下来开始开发请求模式的机器人

先启动一个docker版flask或者django试试?

使用HardSourcePlugin加快webpack速度

1
npm install --save hard-source-webpack-plugin

groovier的做法

整理OneToOne、OneToMany、ManyToOne的关系

OneToOne

假设有两个类A和B,它们互相只能持有一个对方的对象,我们想把这个关系存在A对应的表中。

也就是在数据库中A持有B的id字段,B则不持有A的字段。

而在类中它们则是相互持有的关系,此时应该如何处理呢?

如果我们在A类中写一个B类的属性并使用OneToOne注解,效果是在数据库中

A里面持有了一个B_id,而B没有。

如果两边都写一个OneToOne,则是A中存一个B_id,B中存一个A_id。

都不符合要求。

我们试试JoinColumn,但并不能达到效果。

比如在A中的B属性使用OneToOne,B中的A属性使用OneToOne,并且加上JoinColumn(name=’B_id’)

我们会发现并没有什么效果,只是B里面原来应该是A_id的字段变成了B_id

达到要求的操作应该是

对B使用:

OneToOne(mappedBy = “A中持有的B的属性名称”)

对A使用:

OneToOne
JoinColumn(unique=true)

这时达到的效果是:

B表中没有相关的A的信息,而A表中有B的信息。

具体一点则是:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
@Entity
class A {

@Id
int id

@OneToOne
@JoinColumn(unique = true)
B b
}

@Entity
class B {

@Id
int id

@OneToOne(mappedBy = "b")
A a
}

而在数据库中的字段:

A:

1
id, b_id

B:

1
id

级联更新和级联删除

我现在有一个需求:

不要那么多save,直接save一个 其他相关的也会save

我们来看看JPA中级联的几个方式

级联里面有Persist和Remove

其实还有好几个

  • PERSiST
  • REFRESH
  • DETACH
  • MERGE
  • ALL

看看CascadeType源码吧

里面并没有写特别多东西

算了

此外发现Java和Groovy中的一些不同

在Java的注解中

一个列表用的是{}

而在Groovy中使用的是[]

如:

1
@OneToOne(cascade = {CascadeType.PERSIST, CascadeType.REFRESH})
1
@OneToOne(cascade = [CascadeType.PERSIST, CascadeType.REFRESH])

几个同名类的不同

java.persistence.Id

org.springframework.data.annotation.Id有什么区别?

点进去看看⑧

java.persistence.Id说这个就是用来指定实体的主键的。

在Java类中它可以修饰的类型如下:

  • 基本类型
  • 基本类型的封装类型
  • String
  • java.util.Date
  • java.sql.Date
  • java.math.BigDecimal
  • java.math.BigInteger

但是有一件很神奇的事情是,它还可以修饰方法…emm

也就是只要返回值是这些类就可以?找个时间做个实验吧

而org.springframework.data.annotation.Id的解释少了一些

只说是用来修饰identifier的。

Target多了一个value是ANNOTATION_TYPE

这个是用来干什么的呢

写一个注解的例子

1
2
3
4
@Target({METHOD, FIELD})
@Retention(RUNTIME)

public @interface Id {}

其中Target里面有一个ElementType的数组,可以是:

  • TYPE(我猜是类型)
  • ANNOTATION_TYPE(注解类型)
  • FIELD(Field就是类的属性啦)
  • METHOD(方法)
  • PARAMETER(参数)
  • CONSTRUCTOR(构造器)
  • LOCAL_VARIABLE(局部变量)
  • PACKAGE
  • TYPE_PARAMETER
  • TYPE_USE(1.8起 也没搞懂)
  • MODULE(java9开始,应该是用在package-info里面)

什么是jls呢

而Retention呢?大概是指这个注解的生存期

RetentionPolicy里面定义的几个enum是

  • SOURCE(源码中存在,编译后去除)
  • CLASS(记录在class文件中,但在运行时没有,这个是默认选项)
  • RUNTIME(运行时也存在,可以通过反射获得)

去源码里面找一些骚操作

集合框架啊

ik分词器是什么呢

elasticsearch的使用

用完感觉也就一般

WordEmbedding

是一个比OneHot更高效的用向量表示单词的方式。

可以指定向量的长度 并由神经网络生成。

向量之间有相似度关系,而不是在OneHot中的只是表示一个编号。

(使用余弦相似度计算)

生成方式是使用下列方式的一种:

  1. CBOW(Continuous Bag of Words)
  2. n-gram(skip-gram)
  3. Glove

Word2Vec中包含了CBOW和n-gram方法。

Word2Vec使用

Hex-Rays Decompiler

IDA Pro

POSIX

KCachegrind

zcov

apktool

我们使用apktool来修改篮球经理2017

apktool下载地址

然后我们需要一个apk文件,想办法搞一个就ok了。

把它们放在同一个目录下,打开命令行,运行

(需要Java7环境)

1
java -jar apktool.jar d xxx.apk

我们可以看到结果会多出一个xxx文件夹。

如果需要重新编译 则使用:

1
java -jar apktool.jar b xxx

就会在xxx/dist文件夹下看到重新编译的xxx.apk。

我们需要对它进行签名才能使用,此时我们可以在java的目录下面找到一个keytool.exe,用他生成一个keystore文件

1
keytool -genkey -alias abc.keystore -keyalg RSA -validity 20000 -keystore abc.keystore

具体信息自己填就可以了。

最后我们要对apk进行签名,这次用到的是jarsigner.exe,也在java目录下。

1
jarsigner -verbose -keystore abc.keystore -signedjar signed.apk xxx/dist/xxx.apk abc.keystore

接下来就是愉快的修改环节了,开始写smali代码……

测试可以使用各种安卓模拟器。

tidbit: VSCode有smali插件

smali语法

方法

1
2
.method public static test()V
.end method

(smali高亮一般啊)

使用.method.end method来标识一个方法的开始和结束。

public static test()和Java中差不多,但是方法的返回值放在了方法参数括号的后面,并且:

  • V表示void
  • I表示int
  • Z表示boolean
  • B表示byte
  • D表示double
  • C表示char
  • J表示long
  • F表示float
  • S表示short
  • 其他类使用L, 如:Ljava/lang/String(需要使用全限定名)
  • 如果是数组,在前面加[

构造方法举例如下:

1
2
3
4
5
6
7
8
9
10
11
12
.method public constructor <init>()V
.locals 0 # 表示局部变量数

.prologue # 逻辑开始
.line 12 # 标识在源码中的代码行(应该是debug信息输出用的)

# 调用静态方法,{p0}是指包含p0的参数列表,p0在构造函数中指向自身
# ,后是需要调用的方法,格式是类->方法
invoke-direct {p0}, Ljava/lang/Object;-><init>()V

return-void
.end method

在构造方法中,<init>代表构造方法,而下面这个是静态方法块:

1
2
.method static constructor <clinit>()V
.end method

此外方法中一定要指定locals的数量。

属性获取

1
2
3
4
.locals 1

.prologue
iget-object v0, p0, Lcom/xxx/Test;->id:Ljava/lang/String;

new-instance

用于创建一个新变量

1
new-instance v0, L

invoke-virtual

调用对象的方法

1
invoke virtual {p1, v0} xxxxx.ClassName->mathodName(ParamType)ReturnValue;

第一个参数是调用此方法的对象,第二个开始是参数。

.source

.source表示源java文件,但这并不是一个必要的选项,我们可以去掉这一栏。

android.os.AsyncTask

去除广告

从程序入口找广告加载时间?

svg viewbox

大概是在svg上再抽象出一层,让一个固定大小的svg上总是能显示出图像。

Twine

Twine 是一个轻量的数据结构,用于高效率地表达字符串的连接。

Twine 是一种 rope(串接),它使用二叉树表示一个连接的字符串,结果字符串是二叉树节点由前序遍历拼接而成。只有当需要字符串拼接结果的时候,才进行这种拼接到一个最终的 buffer 中,因此可以避免在多个字符串拼接中产生临时的 string 对象,及避免不必要的高消耗的内存分配操作。

没搞定的问题

  • N^2的3-sum
  • 双调序列查找数字问题
  • 线性时间计算inversion数量
  • shuffle链表
  • 寻找两个已排序数组的第k大元素,在logn时间内完成

3-way-partition

很棒