0%

fatedier/frp

frp 是一个可用于内网穿透的高性能的反向代理应用,支持 tcp, udp, http, https 协议。

系统 版本 解压
Centos7(64) frp_0.48.0_linux_arm64.tar.gz tar -zxvf
mac frp_0.48.0_darwin_amd64.tar.gz 双击
Centos7(x86) frp_0.48.0_linux_386.tar.gz

搭建一个远程访问内网的web应用

frps 服务端程序(配置文件frps.ini),放到公网ip的机器上(阿里云)

frpc 客户端程序(配置文件frpc.ini),放到内网环境机器上(win10)

法一 通过域名访问内网web服务
frps 服务端设置
1
2
3
4
5
6
7
8
# frps.ini
[common]
#frps服务端口
bind_port = 7000
#web远程访问端口
vhost_http_port = 10080
#https使用这个
#vhost_https_port = 8080

启动服务端./frps -c ./frps.ini

frpc 客户端设置
1
2
3
4
5
6
7
8
9
10
11
12
13
14
# frpc.ini
[common]
#服务器公网ip
server_addr = 112.74.51.136
#frps 服务端口和服务端对应
server_port = 7000

[web]
#web服务网络类型,可选http、https
type = http
#内网机器的web服务端口
local_port = 8080
#配置域名(必须绑定域名)
custom_domains = exxk.me

启动客户端.\frpc.exe -c .\frpc.ini

法二 通过ssh(IP)访问内网web服务
frps 服务端设置
1
2
3
4
# frps.ini
[common]
#frps服务端口
bind_port = 7000

启动服务端./frps -c ./frps.ini

frpc 客户端设置
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
# frpc.ini
[common]
#服务器公网ip
server_addr = 112.74.51.136
#frps 服务端口和服务端对应
server_port = 7000

[ssh]
type = tcp
#web服务本地访问地址
local_ip = 127.0.0.1
#web服务本地访问端口
local_port = 8080
#远程调用web服务时的端口
remote_port = 10080

启动客户端.\frpc.exe -c .\frpc.ini

命令行

lxrun查看对LX子系统执行管理操作的帮助

lxrun /install 安装子系统

lxrun /uninstall 卸载子系统

lxrun /setdefaultuser配置子系统用户

lxrun /update 更新子系统的包索引

安装brew

1
2
3
4
5
sh -c "$(curl -fsSL https://raw.githubusercontent.com/Linuxbrew/install/master/install.sh)"
test -d ~/.linuxbrew && eval $(~/.linuxbrew/bin/brew shellenv)
test -d /home/linuxbrew/.linuxbrew && eval $(/home/linuxbrew/.linuxbrew/bin/brew shellenv)
test -r ~/.bash_profile && echo "eval \$($(brew --prefix)/bin/brew shellenv)" >>~/.bash_profile
echo "eval \$($(brew --prefix)/bin/brew shellenv)" >>~/.profile

WSL2配置桥接网络访问

以下是启用此模式的当前优势:

  • IPv6 支持
  • 使用 localhost 地址 127.0.0.1 从 Linux 内部连接到 Windows 服务器。 不支持 IPv6 localhost 地址 ::1
  • 改进了 VPN 的网络兼容性
  • 多播支持
  • 直接从局域网 (LAN) 连接到 WSL
  1. 安装wsl2,执行wsl --install

  2. 新建 .wslconfig 文件,文件路径为 C:\Users\<UserName>\.wslconfig。详细配置见https://learn.microsoft.com/zh-cn/windows/wsl/wsl-config#configuration-settings-for-wslconfig,部分配置需要 Windows 11 版本 22H2 或更高版本。

    1
    2
    3
    4
    5
    [wsl2]
    networkingMode=mirrored
    dnsTunneling=true
    firewall=false
    autoProxy=true
  3. 重启wsl,执行wsl --shutdown,然后执行wsl

  4. 使用管理员权限在 PowerShell 窗口中运行以下命令(允许入站连接),执行Set-NetFirewallHyperVVMSetting -Name '{40E0AC32-46A5-438A-A0B2-2B479E8F2E90}' -DefaultInboundAction Allow

参考

Windows10 Ubuntu子系统的删除和重装

环境

  • ubuntu16.04(bash on window)

安装

  1. sudo apt-get update更新源
  2. sudo apt-get upgrade更新软件
  3. sudo apt-get install build-essential安装编译环境(包括gcc)
  4. sudo apt-get install tcl8.5安装tcl8.5
  5. wget http://download.redis.io/releases/redis-stable.tar.gz
  6. tar xzf redis-stable.tar.gz
  7. cd redis-stable
  8. make
  9. sudo make install
  10. cd utils/
  11. sudo ./install_server.sh
  12. sudo service redis_6379 start
  13. sudo service redis_6379 stop

安装结果:

Port : 6379
Config file : /etc/redis/6379.conf
Log file : /var/log/redis_6379.log
Data dir : /var/lib/redis/6379
Executable : /usr/local/bin/redis-server
Cli Executable : /usr/local/bin/redis-cli

参考:

Windows 10 Linux子系统 (wsl)学习手记

  • ubuntu16.04(bash on window)
  • gcc
1
2
3
4
5
6
7
8
9
10
sudo apt-get update && \
sudo apt-get install build-essential software-properties-common -y && \
sudo add-apt-repository ppa:ubuntu-toolchain-r/test -y && \
sudo apt-get update && \
sudo apt-get install gcc-snapshot -y && \
sudo apt-get update && \
sudo apt-get install gcc-6 g++-6 -y && \
sudo update-alternatives --install /usr/bin/gcc gcc /usr/bin/gcc-6 60 --slave /usr/bin/g++ g++ /usr/bin/g++-6 && \
sudo apt-get install gcc-4.8 g++-4.8 -y && \
sudo update-alternatives --install /usr/bin/gcc gcc /usr/bin/gcc-4.8 60 --slave /usr/bin/g++ g++ /usr/bin/g++-4.8;

选择默认gcc版本

sudo update-alternatives --config gcc

安装redis

安装好了要清理下redis的目录

make distcleanmake

在redis目录下

运行服务端

src/redis-server

运行客户端

src/redis-cli

参考

application2000/how-to-install-latest-gcc-on-ubuntu-lts.txt

方法二

sudo apt-get install build-essential安装编译环境(包括gcc)

环境安装

  1. 下载Oracle 12c(Enterprise),总共两个文件(File1,File2),可右键复制链接迅雷下载
  1. 两个文件都解压

  2. 双击setup.exe运行

    注:解决[INS-30131]错误:计算机管理添加C盘共享,权限设置为管理员完全权限,其他用户可读。

  3. 安装选项

    • 创建配置数据库

    • 桌面类

    • 创建新windos用户(root,xuanxuan)

    • 输入口令(数据库名orcl.lan;口令Mimais163)

    • 弹窗口令管理修改 sys(mimais163R)system(mimais163A)

参考:

Oracle Database 12c安装教程(Windows版)

Oracle 12c Windows安装、介绍及简单使用(图文)

监督学习(supervised-learning)

regression(回归)

Given a picture of a person, we have to predict their age on the basis of the given picture

通过历史的数据,预测新的数据(线性)

eg:预测问题、房价问题

classification(分类)

Given a patient with a tumor, we have to predict whether the tumor is malignant or benign.

根据特征识别,无数个好特征(向量),然后判断属于哪个

eg:识别问题、肿瘤问题

无监督学习(unsupervised-learning)

通过聚类(分组)算法,无需指定特征

聚类(Clustering)

eg: 新闻分组

集群(Non-clustering)

eg:音频分离

springboot mysql json 使用

  1. 添加@TableName(value = "table_name",autoResultMap = true)

  2. json实体添加@TableField(typeHandler = FastjsonTypeHandler.class)

    1
    2
    3
    4
    5
    6
    7
    @TableName(value = "table_name",autoResultMap = true)
    pulic class TableName{
    @TableField(typeHandler = FastjsonTypeHandler.class)
    private ExtendConfig extendConfig ;//扩展配置
    @TableField(typeHandler = MTableCellListTypeHandler.class)
    private List<Row> rows;
    }

常见问题

  1. 查询时找不到对应字段,因为json序列话问题,不是驼峰,可以通过@JsonProperty(value = "isFiled")解决

  2. 当json数据是jsonArray时,需要自定义json解析器

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    public class MTableCellListTypeHandler extends JacksonTypeHandler {
    public MTableCellListTypeHandler(Class<?> type) {
    super(type);
    }
    @Override
    protected Object parse(String json) {
    try {
    return getObjectMapper().readValue(json, new TypeReference<List<Row>>() {});
    } catch (IOException e) {
    throw new RuntimeException(e);
    }
    }
    }

查询(SELECT)

查询employee_id为1,2,3的结果
1
2
3
4
5
6
7
8
9
10
#多条件查询
SELECT * FROM employee WHERE employee.employee_id =1 OR employee.employee_id=2 OR employee.employee_id=3
#范围(1~3)查询
SELECT * FROM employee WHERE employee.employee_id BETWEEN 1 and 3
#半开范围查询
SELECT * FROM employee WHERE employee.employee_id<=3
#截取
SELECT SUBSTRING_INDEX('0-21-3-4', '-', 2); -- 结果:0-21
#截取
SELECT SUBSTRING(SUBSTRING_INDEX('0-21-3-4', '-', 2),3); -- 结果:21

更新(UPDATE)

1
2
3
4
5
-- 更新子查询左连接语句模版
update table_name p left join (
select * from xxx
) m on p.id= m.pp_id
set p.app_id=m.app_id where 1=1 ;

数据库

1. 交叉连接(cross join)

交叉连接(CROSS JOIN):有两种,显式的和隐式的,不带ON子句,返回的是两表的乘积,也叫笛卡尔积

例如:下面的语句1和语句2的结果是相同的。

语句1:隐式的交叉连接,没有CROSS JOIN。

1
2
3
SELECT O.ID, O.ORDER_NUMBER, C.ID, C.NAME
FROM ORDERS O , CUSTOMERS C
WHERE O.ID=1;

语句2:显式的交叉连接,使用CROSS JOIN。

1
2
3
4
SELECT O.ID,O.ORDER_NUMBER,C.ID,
C.NAME
FROM ORDERS O CROSS JOIN CUSTOMERS C
WHERE O.ID=1;

语句1和语句2的结果是相同的,查询结果如下:

a表:

id name
1 张三
2 李四
3 王五

b表:

id job parent_id
1 java 1
2 php 2
3 php 4
1. 内连接(INNER JOIN)

内连接(INNER JOIN):有两种,显式的和隐式的,返回连接表中符合连接条件和查询条件的数据行。(所谓的链接表就是数据库在做查询形成的中间表)。

显式内连接
1
2
3
SELECT a.*,b.* FROM a INNER JOIN b ON a.id=b.parent_id
//或者
SELECT a.*,b.* FROM a INNER JOIN b WHERE a.id=b.parent_id
隐式内连接
1
SELECT a.*,b.* FROM a,b WHERE a.id=b.parent_id  //只能用where

结果:

id name id1 job parent_id
1 张三 1 java 1
2 李四 2 php 2
2. 左连接(LEFT JOIN)

左向外联接的结果集包括 LEFT OUTER子句中指定的左表的所有行,而不仅仅是联接列所匹配的行。如果左表的某行在右表中没有匹配行,则在相关联的结果集行中右表的所有选择列表列均为空值。

1
SELECT a.*,b.* FROM a LEFT JOIN b ON a.id=b.parent_id
id name id1 job parent_id
1 张三 1 java 1
2 李四 2 php 2
3 王五 null null null
3. 右连接(RIGHT JOIN)

右向外联接是左向外联接的反向联接。将返回右表的所有行。如果右表的某行在左表中没有匹配行,则将为左表返回空值。

1
SELECT a.*,b.* FROM a RIGHT JOIN b ON a.id=b.parent_id
id name id1 job parent_id
1 张三 1 java 1
2 李四 2 php 2
null null 3 php 4
4.完全连接(FULL JOIN,UNION

完整外部联接返回左表和右表中的所有行。当某行在另一个表中没有匹配行时,则另一个表的选择列表列包含空值。如果表之间有匹配行,则整个结果集行包含基表的数据值。

1
2
3
4
5
SELECT a.*,b.* FROM a FULL JOIN b ON a.id=b.parent_id   //MYSQL不支持full join
//可以用union连接左连接和右连接代替full join
SELECT a.*,b.* FROM a LEFT JOIN b ON a.id=b.parent_id
UNION
SELECT a.*,b.* FROM a RIGHT JOIN b ON a.id=b.parent_id
id name id1 job parent_id
1 张三 1 java 1
2 李四 2 php 2
3 王五 null null null
null null 3 php 4
5.交叉连接(CROSS JOIN
1
2
SELECT a.*,b.* FROM a CROSS JOIN b WHERE a.id=b.parent_id
SELECT a.*,b.* FROM a CROSS JOIN b ON a.id=b.parent_id

ON后面的条件(ON条件)和WHERE条件的区别:

  • ON条件:是过滤两个链接表笛卡尔积形成中间表的约束条件。
  • WHERE条件:在有ON条件的SELECT语句中是过滤中间表的约束条件。在没有ON的单表查询中,是限制物理表或者中间查询结果返回记录的约束。在两表或多表连接中是限制连接形成最终中间表的返回结果的约束。

从这里可以看出,将WHERE条件移入ON后面是不恰当的。推荐的做法是:
ON只进行连接操作,WHERE只过滤中间表的记录。

总结

  1. 查两表关联列相等的数据用内连接。
  2. Col_L是Col_R的子集时用右外连接。
  3. Col_R是Col_L的子集时用左外连接。
  4. Col_R和Col_L彼此有交集但彼此互不为子集时候用全外。
  5. 求差操作的时候用联合查询。

多个表查询的时候,这些不同的连接类型可以写到一块。例如:

1
2
3
4
5
6
7
8
9
10
11
SELECT T1.C1,T2.CX,T3.CY

FROM TAB1 T1

INNER JOIN TAB2 T2 ON (T1.C1=T2.C2)

INNER JOIN TAB3 T3 ON (T1.C1=T2.C3)

LEFT OUTER JOIN TAB4 ON(T2.C2=T3.C3);

WHERE T1.X >T3.Y;

上面这个SQL查询是多表连接的一个示范。

参考

深入理解MySQL的外连接、内连接、交叉连接

Java就业企业面试问题-数据库(强烈推荐)

Java Web基础

1 Ajax

AJAX = Asynchronous JavaScript and XML(异步的 JavaScript 和 XML)。

AJAX 是与服务器交换数据并更新部分网页的艺术(新方法),在不重新加载整个页面的情况下。

1
$.ajax({url:"/jquery/test1.txt",async:false}); //jQuery.ajax([settings])使用方法

2 cookie和session

Cookie是会话技术,将用户的信息保存到浏览器的对象.

Session也是会话技术,将Session的信息保存到服务器的对象.Session是基于Cookie的 利用Cookie向浏览器回写JSessionID.

3 网站大量登陆访问session过多

session默认保存在内存中,内存资源宝贵,session数据量大导致内存利用率高

  • 解决方案:
    1. 设置session超时时间
    2. 将session中的数据序列化到硬盘中
    3. 不使用session,使用cookie(此方法存在安全性问题)

4 Jsp九大内置对象

  • Page:指的是JSP被翻译成Servlet的对象的引用.
  • pageContext:对象可以用来获得其他8个内置对象,还可以作为JSP的域范围对象使用.pageContext中存的值是当前的页面的作用范围》
  • request:代表的是请求对象,可以用于获得客户机的信息,也可以作为域对象来使用,使用request保存的数据在一次请求范围内有效。
  • Session代表的是一次会话,可以用于保存用户的私有的信息,也可以作为域对象使用,使用session保存的数据在一次会话范围有效
  • Application:代表整个应用范围,使用这个对象保存的数据在整个web应用中都有效。
  • Response:是响应对象,代表的是从服务器向浏览器响应数据.
  • Out:out对象被封装为JSPWriter接口,是用于向页面输出内容的对象
  • Config:指的是ServletConfig用于JSP翻译成Servlet后 获得Servlet的配置的对象.
  • Exception:在页面中设置isErrorPage=”true”,即可使用,是Throwable的引用.用来获得页面的错误信息。

参考

Java就业企业面试问题-Java Web(强烈推荐)

SSH基础知识

1 Hibernate

hibernate框架是一个ORM的持久层框架,ORM的含义是对象关系映射,简单理解就是通过对象和关系型数据库之间建立映射信息,以后再操作对象就相当于操作数据库了。hibernate框架是对JDBC进行了轻量级的封装,可以更方便简单的对数据库完成增删改查的操作。同时也提供了查询的方式和查询的策略。例如HQL和QBC的查询方式等。还提供了缓存的策略,效率会更高。

优点
  1. 对象/关系数据库映射(ORM)

    它使用时只需要操纵对象,使开发更对象化,抛弃了数据库中心的思想,完全的面向对象思想

  2. 透明持久化(persistent)

    带有持久化状态的、具有业务功能的单线程对象,此对象生存期很短。这些对象可能是普通的JavaBeans/POJO,这个对象没有实现第三方框架或者接口,唯一特殊的是他们正与(仅仅一个)Session相关联。一旦这个Session被关闭,这些对象就会脱离持久化状态,这样就可被应用程序的任何层自由使用。(例如,用作跟表示层打交道的数据传输对象。)

  3. 事务Transaction(org.hibernate.Transaction)

    应用程序用来指定原子操作单元范围的对象,它是单线程的,生命周期很短。它通过抽象将应用从底层具体的JDBC、JTA以及CORBA事务隔离开。某些情况下,一个Session之内可
    能包含多个Transaction对象。尽管是否使用该对象是可选的,但无论是使用底层的API还是使用Transaction对象,事务边界的开启与关闭是必不可少的。

  4. 它没有侵入性,即所谓的轻量级框架

  5. 移植性会很好

  6. 缓存机制,提供一级缓存和二级缓存

  7. 简洁的HQL编程

缺点
  1. Hibernate在批量数据处理时有弱势
  2. 针对单一对象简单的增删查改,适合于Hibernate,而对于批量的修改,删除,不适合用Hibernate,这也是OR框架的弱点;要使用数据库的特定优化机制的时候,不适合用
  3. 优化策略应用不当会导致大量的资源消耗.
mybatis与hibernate区别
  1. mybatis是把sql语句与java代码分离了,sql语句在xml文件配置的
  2. hibernate是ORM框架,它对jdbc进行了封装,在分层结构中处于持久化层,它能建立面向对象的域模型和关系数据模型之间的映射.它大大简化了dao层的编码工作
  3. mybatis是半自动的,hibernate是全自动的,就是说mybatis可以配置sql语句,对于sql调优来说是比较好的,hibernate会自动生成所有的sql语句,调优不方便,hibernate用起来难度要大于mybatis

2 Spring

优点
  1. Spring能有效地组织你的中间层对象,不管你是否选择使用了EJB。如果你仅仅使用了Struts或其他为J2EE的 API特制的framework,Spring致力于解决剩下的问题。
  2. Spring能消除在许多工程中常见的对Singleton的过多使用。根据我的经验,这是一个很大的问题,它降低了系统的可测试性和面向对象的程度。
  3. 通过一种在不同应用程序和项目间一致的方法来处理配置文件,Spring能消除各种各样自定义格式的属性文件的需要。曾经对某个类要寻找的是哪个魔法般的属性项或系统属性感到不解,为此不得不去读Javadoc甚至源编码?有了Spring,你仅仅需要看看类的JavaBean属性。Inversion of Control的使用(在下面讨论)帮助完成了这种简化。
  1. 通过把对接口编程而不是对类编程的代价几乎减少到没有,Spring能够促进养成好的编程习惯。
  2. Spring被设计为让使用它创建的应用尽可能少的依赖于他的APIs。在Spring应用中的大多数业务对象没有依赖于Spring。
  3. 使用Spring构建的应用程序易于单元测试。
  4. Spring能使EJB的使用成为一个实现选择,而不是应用架构的必然选择。你能选择用POJOs或local EJBs来实现业务接口,却不会影响调用代码。
  5. Spring帮助你解决许多问题而无需使用EJB。Spring能提供一种EJB的替换物,它们适用于许多web应用。例如,Spring能使用AOP提供声明性事务管理而不通过EJB容器,如果你仅仅需要与单个数据库打交道,甚至不需要一个JTA实现。
  6. Spring为数据存取提供了一个一致的框架,不论是使用的是JDBC还是O/R mapping产品(如Hibernate)。
Ioc

Inversion of Control 控制反转。

实现IoC的思想就只有两种:依赖注入(Dependency Injection,简称DI)和依赖查找(Dependency Lookup)。

AOP

Aspect Oriented Programming 面向切面编程。

Spring实现面向切面编程使用的是动态代理技术,并且会根据实际情况来选择使用基于子类的还是基于接口的动态代理。

理解
  1. 它的核心之一IoC,降低了我们程序的耦合度,使我们可以把项目设计成为一个可插拔的组件式工程。
  2. 它的另一大核心AOP,使我们在开发过程中,精力得到释放,可以更专注的去理解客户的需求。并且在后期维护时,可以只维护很少的一部分。
  3. 它提供的事务管理机制,采用声明的方式来配置事务,从而在维护时无需改动源码,解决了程序硬编码的弊端。
  4. 它提供的DAO模板使我们的持久层开发又多了一种途径。
  5. 它可以整合其他时下流行的框架,使我们在管理项目时,更加清晰,明确。

3 Struts2

优点
  1. 对框架API和ServletAPI的依赖减少
  2. 可扩展性提高
  3. 框架对插件的可插拔
  4. 拦截器
  5. 可测程度大大提高
缺点
  1. 在并发量比较大的场景中,.每次请求都要创建一个Action,并维护很长的调用链(至少18个拦截器+OGNL解析+Action+Result),资源消耗比较大.
使用场景
  1. SSH对于中小型项目提供了一套完整的解决方案.在表关系相对简单,数据量不大,并发量不高的项目中,能够极大的提高开发效率.
  2. 表关系复杂或数据量比较大时,可以使用Mybatis替换Hibernate.
  3. 并发量很高时可以使用SpringMVC替换struts
框架处理步骤
  1. 客户端初始化一个指向Servlet容器(例如tomcat)的请求
  2. 这个请求经过一系列的过滤器(Filter)(这些过滤器中有一个叫做ActionContextCleanUp的可选过滤器,这个过滤器对于Struts2和其他框架的集成很有帮助,例如:SiteMesh Plugin)
  3. 接着StrutsPrepareAndExecuteFilter被调用,StrutsPrepareAndExecuteFilter询问ActionMapper来解析和判断该次请求是否需要由struts2框架来处理.
  4. 如果ActionMapper判断需要struts2来处理请求,StrutsPrepareAndExecuteFilter会把请求的处理交给ActionProxy
  5. ActionProxy通过Configuration Manager加载框架的配置文件,找到需要调用的Action以及拦截器配置信息
  6. ActionProxy创建一个ActionInvocation的实例。
  7. ActionInvocation实例使用命名模式来调用,在调用Action的过程前后,涉及到相关拦截器(Intercepter)的调用。
  8. 一旦Action执行完毕,ActionInvocation负责根据struts.xml中的配置找到对应的返回结果配置。根据配置找到对应的Result处理类来处理结果集.大多数情况输出会交由模版语言(JSP,FreeMarker)完成输出内容拼装

参考

Java就业企业面试问题-ssh框架(强烈推荐)