Java 语言特性
基本特性Java语言的特性包括:
简单易学:Java语言的语法与C++类似,但是去掉了一些复杂的特性,使得Java更加容易学习和使用。
面向对象:Java是一种纯面向对象的编程语言,所有的数据类型都是对象,所有的操作都是方法调用。
平台无关性:Java程序可以在不同的平台上运行,只需要安装相应的JVM即可。
安全性:Java提供了严格的安全机制,防止恶意代码对系统造成破坏。
自动内存管理:Java自动进行垃圾回收,程序员不需要手动管理内存。
多线程支持:Java提供了多线程支持,可以方便地实现并发编程。
异常处理:Java提供了异常处理机制,可以有效地处理程序中出现的错误。
开放性:Java是一种开放的编程语言,有大量的开源库和框架可供使用。
高性能:Java虚拟机(JVM)可以将字节码转换为本地机器码执行,具有较高的性能。
动态性:Java支持动态加载和卸载类,可以在运行时动态地修改程序行为。
版本的新特性Java历代版本的新特性如下:
Java 1.0:Java语言首次发布,包括基本的面向对象特性和网络编程API。
Java 1.1:增加了内部类、反射、JA ...
Linux 三剑客
正则表达式菜鸟
MDN
re
含义
*
匹配前面的子表达式零次或多次
.
匹配除换行符(\n、\r)之外的任何单个字符
?
匹配前面的子表达式零次或一次
+
匹配前面的子表达式一次或多次
^
匹配输入字符串的开始位置
$
匹配输入字符串的结束位置
[]
匹配所包含的任意一个字符
[^]
匹配未包含的任意字符
\
将下一个字符标记为一个特殊字符、或一个原义字符、或一个向后引用、或一个八进制转义符
{n}
n 是一个非负整数。匹配确定的 n 次
{n,m}
m 和 n 均为非负整数,其中n <= m。匹配 [n, m] 次
x|y
匹配 x 或 y
修饰符
含义
i
ignore - 不区分大小写
g
global - 全局匹配
m
multi line - 多行匹配
s
特殊字符圆点 . 中包含换行符 \n
grepgrep [OPTION...] PATTERNS [FILE...]
awk菜鸟
awk — pattern scanning and processing langu ...
Java 数据库框架
Java 数据库访问框架JDBCJDBC(Java Database Connectivity)是Java语言中用于连接和操作数据库的API。JDBC提供了一组标准接口,使得Java程序可以与各种关系型数据库进行交互,如Oracle、MySQL、SQL Server等。
JDBC的工作原理是通过驱动程序(Driver)来实现与数据库的连接。驱动程序是一个Java类库,它包含了与特定数据库通信所需的代码和协议。在使用JDBC时,需要先加载相应的驱动程序,然后通过驱动程序建立与数据库的连接,最后执行SQL语句或存储过程等操作。
JDBC的主要功能包括:
建立与数据库的连接:通过DriverManager类的getConnection()方法建立与数据库的连接。
执行SQL语句:通过Statement或PreparedStatement对象执行SQL语句,如查询数据、插入数据、更新数据等。
处理结果集:通过ResultSet对象处理查询结果集,如获取查询结果、遍历结果集等。
事务管理:通过Connection对象控制事务的提交、回滚等操作。
JDBC是Java EE平台的核心技术 ...
Java实现文件上传下载
Java实现文件上传下载开始之前使用Linux,比较麻烦的一点就是和手机共享文件(下载电脑上的,上传手机上的),
目前存在的选择有:
QQ,微信 优点:简单,安装即用 缺点:基于wine,慢,不稳定容易崩溃
Kde connection 优点:功能强大 缺点:依赖多,不稳定(连接不上),仅限于局域网
所以我就想用Java实现一个文件上传下载的小工具
简单的需求
启动程序会打开一个网页
网页显示二维码,手机浏览器扫描二维码在手机上打开相同网页
网页分为 “文件上传” 和 “文件下载” 两个部分
“文件上传” 用户选择手机上的文件上传
“文件下载” 显示电脑上的文件,并提供下载
设计我想的是使用快速原型,先实现基本的需求(文件上传和下载)再在基础功能上添加新的功能或者使得程序更易用
为了简单起见,我使用 SpringBoot 作为开发框架,我想想让程序能跑起来,再把它变得轻量快速
程序使用 MVC 架构
V :
负责和用户交互,提供文件上传下载的接口
异步获取二维码
C :
处理文件上传下载
M :
生成二维码
实现结果
网络编程模型
网络编程模型网络编程模型的核心:
服务器如何管理连接
服务器如何处理请求
以上两个设计点最终都和操作系统的 I/O 模型及进程模型相关
I/O模型:阻塞 、非阻塞、同步 、异步
进程模型:单进程、 多进程、多线程
PPC (Process per Connection)
父进程接受连接(图中accept)
父进程“fork”子进程(图中fork)
子进程处理连接的读写请求(图中子进程read、业务处理、write)
子进程关闭连接(图中子进程中的close)
PPC 模式实现简单,比较适合服务器的连接数没那么多的情况(eg. pgsql)
而互联网兴起后,服务器的并发和访问量从几十剧增到成千上万,这种模式的弊端就凸显出来了,主要体现在如下几个方面:
fork代价高:站在操作系统的角度,创建一个进程的代价是很高的,需要分配很多内核资源,需要将内存映像从父进程复制到子进程。
父子进程通信复杂:父进程“fork”子进程时,文件描述符可以通过内存映像复制从父进程传到子进程,但“fork”完成后,父子进程通信就比较麻烦了,需要采用IPC(InterprocessC ...
将Gitee Pages 转移到自己的服务器
将Gitee Pages 转移到自己的服务器开始之前我在自己的电脑上用 hexo 框架配置了一个博客。本来一切安好直到最近换了个主题博客访问变得有点慢了(原因应该是js比较多。。。)但是我不想放弃现在的主题,所以就决定转移原来部署在Gitee Pages的博客到自己租的服务器(是的,我有服务器。但是只有一年,用完了还得倒数据,嫌麻烦。。。)
我发现网页所有的资源都在这个文件夹下
而这个文件夹被推送到了gitee
现在就好办了,直接从gitee克隆到自己的服务器就行了。
克隆复制这个链接
在服务器上找个合适的地方执行
1quanwei@VM-8-7-ubuntu:~/workplaceFolder$ git clone https://gitee.com/quanw20/quanw20.git
输入密码(因为是私有的)就克隆下来了
更新每次推送到gitee之后服务器上的数据都不会自动更新(不知道有没有什么hook之类的)
所以我会在每次更新之后向服务器发送一条命令用来拉取更新,吧结果写入log
1ssh name@host "cd /dir/quanw20;git pu ...
Linux 系统管理
Linux 系统管理PS 查看进程状态12345ps [options]ps aux |grep <name>ps efps -u <username>
Options:
-A,-e,a Select all processes. Identical to -e.
-a Select all processes except both session leaders and processes not associated with a terminal.
-d Select all processes except session leaders.
g Really all, even session leaders.
-N,--deselect Select all processes except those that fulfill the specified conditions (negates the selection).
T,t Select all processes asso ...
Linux AT&T 汇编
开始之前大名鼎鼎的Hello World
1234567891011121314151617.data msg : .string "Hello Word!\n" len = . -msg.text.global _start _start : movl $len,%edx # len -> edx movl $msg,%ecx # msg -> ecx movl $1,%ebx movl $4,%eax # 系统调用号 int $0x80 # 调用 movl $0,%ebx # 退出代码 movl $1,%eax int $0x80
通用寄存器汇编就是在几个寄存器间倒来倒去
寄存器有两种概念,逻辑上的和物理上的,分别是:
架构相关寄存器(architectural register)
物理寄存器(physical register)
前者是指令集(ISA)提供给编译器可见的,相当于API接口规范,一共16个通用寄存器;后者是硬件上实际设计的,软件领域不直接接触。最新的CPU可能有上百个实际的 ...
三门问题和贝叶斯定理
三门问题也称为蒙提霍尔问题或蒙提霍尔悖论。这是一个经典的概率问题,最早由美国的数学家及电视主持人蒙提·霍尔(Monty Hall)在20世纪60年代初首次提出。
问题描述:你面前有三扇关闭的门,在其中一扇门后有奖品,另外两扇门后没有奖品。选手先选择其中一扇门,然后,主持人会在另外两扇门中打开一扇没有奖品的门。此时,选手可以选择是否更改自己的选择来获取奖品。请问,是否应该更改选择?
解决对于三门问题中新事件所提供的信息,也就是主持人打开一扇没有汽车的门后告诉你选择正确概率只有1/2,我们可以将其视为更新先前假设的过程。
在游戏开始前,我们有三个可能性:汽车在门A,汽车在门B,汽车在门C,每个可能性发生的先验概率都是1/3。而当主持人打开了门B,并告诉你选择正确的概率只有1/2时,这相当于给出了一个新的观测值(门B不含汽车),从而更新了我们的先验分布。
具体来说,我们可以根据贝叶斯定理计算更新后的后验分布。在这种情况下,我们需要计算的是汽车真实在门X(其中X=?)的概率,因此我们有:
P(X|B) = P(B|X) * P(X) / ...
Netty 框架入门
优势
统一API,多模型
自带编解码器
多通信协议
高吞吐、低延迟、低资源消耗、少内存复制
安全
核心组件ChannelChannel 接口是 Netty 对网络操作抽象类,它除了包括基本的 I/O 操作,如 bind()、connect()、read()、write() 等
EventLoopEventLoop 定义了 Netty 的核心抽象,用于处理连接的生命周期中所发生的事件
主要作用是负责监听网络事件并调用事件处理器进行相关 I/O 操作的处理。
ChannelFutureNetty 是异步非阻塞的,所有的 I/O 操作都为异步的。
我们不能立刻得到操作是否执行成功。可以通过 ChannelFuture 接口的 addListener() 方法注册一个 ChannelFutureListener,当操作执行成功或者失败时,监听就会自动触发返回结果。
另外,我们还可以通过 ChannelFuture 接口的 sync()方法让异步的操作变成同步的
ChannelHandler123456789b.group(eventLoopGroup) .ha ...