洋蔥

耳不闻人是非,目不视人之短,口不言人之过。

JDK5中的注解

注解(@)

注解就相当于一种标记,在程序中加了注解就等于为程序加了某种标记。(JDK1.5新特性)。

作用

告诉javac编译器或者java开发工具……向其传递某种信息,作为一个标记。

阅读全文 »

Java 8 新特性 - 菜鸟

Java 8 Tutorials

Java 8 Tutorials

包含一些原计划在 Java 7 中却延迟发布的功能。

简介

我们通常所说的接口的作用是用于定义一套标准、约束、规范等,接口中的方法只声明方法的签名,不提供相应的方法体,方法体由对应的实现类去实现。

在JDK1.8中打破了这样的认识,接口中的方法可以有方法体,但需要关键字static或者default来修饰,使用static来修饰的称之为静态方法,静态方法通过接口名来调用,使用default来修饰的称之为默认方法,默认方法通过实例对象来调用。

静态方法和默认方法的作用:

静态方法和默认方法都有自己的方法体,用于提供一套默认的实现,这样子类对于该方法就不需要强制来实现,可以选择使用默认的实现,也可以重写自己的实现。当为接口扩展方法时,只需要提供该方法的默认实现即可,至于对应的实现类可以重写也可以使用默认的实现,这样所有的实现类不会报语法错误:Xxx不是抽象的, 并且未覆盖Yxx中的抽象方法。

阅读全文 »

Java7的新特性

新的invokedynamic字节码指令

JVM本身对动态语言的支持:新的invokedynamic字节码指令(JSR-292),与多语言虚拟机(Multi Language Virtual Machine)原型

Java语言的动态性-invokedynamic

新的 File I/O 程序库

新的文件 I/O 程序库 (JSR 203 定义) 增加多重文件的支持、文件原始数据和符号链接。新的包为:java.nio.filejava.nio.file.attributejava.nio.file.spi

阅读全文 »

Java6的新特性

Pluggable Annotation Processing API

可拔插注解处理API:用于编译时处理注解,而不是在运行时处理注解。

在运行时,我们仍然可以使用反射来分析注解并自定义行为。

阅读全文 »

Java5的新特性

泛型(Generics)

泛型 : 为集合提供编译期间 (静态) 类型安全,且不须为大多数类型转换 (类型转换) (规范在 JSR 14)

由来

​ 早期的时候,我们使用Object来代表任意的类型。向上转型是没有任何问题的,但是在向下转型的时候其实隐含了类型转换的问题。也就是说这样的程序其实并不是安全的。所以Java在JDK5后引入了泛型,提高程序的安全性。

​ 泛型提供了编译时类型安全检测机制,该机制允许程序员在编译时检测到非法的类型。泛型的本质是参数化类型,也就是说所操作的数据类型被指定为一个参数。

阅读全文 »

V2Ray 不区分服务器版和客户端版,它们运行的是同一个软件,区别是配置文件的不同。

应用场景

场景:外网无法访问部署在内网的 MySQL,导致 SpringBoot 项目启动时连不上数据库,接口无法调试,开发效率低。

解决:部署 v2ray,然后配置 JVM 启动参数 -DsocksProxyHost=127.0.0.1 -DsocksProxyPort=18998

注意:Navicat 不支持 socks 代理,仅支持以下两种方式:

  • 使用 SSH 隧道。会话的连接 ID 不会变。
  • 使用 HTTP 隧道(nginx 配置见 location.conf)。会话的连接 ID 会变化,所有基于连接级别(Session 级别)的功能和状态全部失效。

使用 HTTP 隧道后,会话的连接 ID 变化的核心原因:无状态与短连接

1、HTTP 协议是无状态的(Stateless)

标准的数据库连接(如直连或通过 SSH 隧道)是长连接。客户端与 MySQL 之间会保持一个持久的 TCP 握手状态,在此期间分配的 CONNECTION_ID 是固定不变的。

但 HTTP 协议每次请求都是独立的、无状态的

2、隧道脚本(ntunnel_mysql.php)的运行机制

当你通过 Navicat 的 HTTP 选项卡配置并运行:

  • 你在 Navicat 中点击或执行的每一次 SQL 查询,Navicat 都会向服务端的 ntunnel_mysql.php 脚本发送一个 HTTP POST 请求
  • PHP 脚本接收到请求后,在服务器本地通过 mysqli_connect() 临时新建一个数据库连接,执行你的 SQL,拿到结果返回给 Navicat,然后立刻关闭该数据库连接
  • 既然每次发送 SQL 都是服务端 PHP 重新 connect 的过程,MySQL 自然会为这个全新的连接分配一个新的内部线程 ID。因此,你连续执行 SELECT CONNECTION_ID(); 拿到的永远是不同的 ID。

部署方案一(推荐加密协议)

在服务器部署 V2Ray 服务端,本地部署客户端。

解压

1
2
3
mkdir -p /data/local/v2ray-linux-64/log/
cd /data/local/
unzip v2ray-linux-64.zip -d ./v2ray-linux-64

服务端

配置

vim /data/local/v2ray-linux-64/config.json,更多配置见官网 v2fly

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
{
// 请提前创建log目录。请使用绝对路径。
"log" : {
"access": "/data/local/v2ray-linux-64/log/access.log",
"error": "/data/local/v2ray-linux-64/log/error.log",
"loglevel": "warning"
},
"inbounds": [
{
"port": 8998, // 服务器监听端口
"protocol": "vmess",
"settings": {
"clients": [
{
"id": "755bc63b-e26d-47cd-85a1-b6ebbecbbabc"
}
]
}
}
],
"outbounds": [
{
"protocol": "freedom"
}
]
}

启动

1
2
3
chmod /data/local/v2ray-linux-64/v2ray +x # 授予可执行权限
nohup /data/local/v2ray-linux-64/v2ray run -config /data/local/v2ray-linux-64/config.json &>/dev/null &
jobs

开机自启

v2ray-linux-64.zip 解压文件中包含 systemd/system/v2ray.service,需要的选项包括 User、ExecStart 等。

vim /etc/systemd/system/v2ray.service

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
# v2ray.service
[Unit]
Description=V2Ray Service
Documentation=https://www.v2fly.org/
After=network.target nss-lookup.target

[Service]
User=root
Group=root
CapabilityBoundingSet=CAP_NET_ADMIN CAP_NET_BIND_SERVICE
AmbientCapabilities=CAP_NET_ADMIN CAP_NET_BIND_SERVICE
NoNewPrivileges=true
ExecStart=/data/local/v2ray-linux-64/v2ray run -config /data/local/v2ray-linux-64/config.json
Restart=on-failure
RestartSec=10s
RestartPreventExitStatus=23

[Install]
WantedBy=multi-user.target

重新加载配置文件:systemctl daemon-reload

客户端

配置

更多配置见官网 v2fly

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
{
/*
// 请提前创建log目录。请使用绝对路径。
"log" : {
"access": "X:\Program\v2ray-windows-64\log\access.log",
"error": "X:\Program\v2ray-windows-64\log\error.log",
"loglevel": "warning"
},
// 配置Routing路由。不建议配置,因为这样才能打印访问日志。
"routing": {
"domainStrategy": "IPOnDemand",
"rules": [
{
"type": "field",
"ip": [
"geoip:private"
],
"outboundTag": "direct" // 当一个规则生效时,即将这个连接转发至它所指定的 outboundTag。当没有匹配到任何规则时,流量默认被转发至第一个 outbound。
}
]
},
*/
"inbounds": [
{
"port": 18998, // SOCKS 代理端口,在浏览器中需配置代理并指向这个端口
"listen": "127.0.0.1",
"protocol": "socks",
"settings": {
"udp": true
}
}
],
// 一个数组,每个元素是一个出站连接配置。列表中的第一个元素作为主出站协议。当路由匹配不存在或没有匹配成功时,流量由主出站协议发出。
"outbounds": [
{
"protocol": "vmess",
"settings": {
"vnext": [
{
"address": "192.168.0.7", // 服务器地址,请修改为你自己的服务器 ip 或域名
"port": 8998, // 服务器端口
"users": [
{
"id": "755bc63b-e26d-47cd-85a1-b6ebbecbbabc"
}
]
}
]
}
},
{
"protocol": "freedom",
"tag": "direct" // 出站连接的标识,用于在其它的配置中定位此连接。当其值不为空时,必须在所有 tag 中唯一。配置Routing路由时可以指定使用哪个出站连接
}
]
}

启动

新建 windows 启动脚本 D:\Program\v2ray-windows-64\v2ray-run.cmd 内容如下:

1
2
v2ray.exe run
pause

部署方案二

仅在服务器部署 V2Ray 服务端。

解压

请参考上文。

服务端

配置

vim /data/local/v2ray-linux-64/config.json,更多配置见官网 v2fly

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
{
"inbounds": [
{
"listen": "0.0.0.0", // 服务器监听IP
"port": 8997, // 服务器监听端口
"protocol": "socks", // 协议名称
"settings": { // 详见每个协议中的InboundConfigurationObject
"auth": "noauth", // "noauth" | "password"。password模式下IDEA代理MySQL连接,提示socks验证失败
"accounts": [ // 支持多个用户账号。此选项仅当auth为password时有效。
{
"user": "zhaolq",
"pass": "123456789"
}
],
"udp": true // 是否开启UDP协议的支持
}
}
],
"outbounds": [
{
"protocol": "freedom"
}
]
}

启动

请参考上文。

启动后可以使用 SwitchyOmega 插件测试 socks 代理。

If you want to keep a secret, you must also hide it from yourself.

Project V,一个工具集合,官网: https://www.v2ray.com/ ,它可以帮助你打造专属的基础通信网络。Project V 的核心工具称为V2Ray,其主要负责网络协议和功能的实现,与其它 Project V 通信。V2Ray 可以单独运行,也可以和其它工具配合,以提供简便的操作流程。

Project V 工具比较复杂,本文仅针对 Shadowsocks

官网:https://shadowsocks.org/

阅读全文 »

markdown转html后没有缩进问题:

1
2
3
  半角空格
  全角空格
  不断行的空格

注意注意:H5不=HTML5

  H5 是一个产品名词

  HTML5是一个技术名词

阅读全文 »
0%