shell 脚本和snippets
一些常用的shell 脚本和snippets。
一些常用的shell 脚本和snippets。
Shell 脚本(shell script),是一种为 shell 编写的脚本程序。Linux 的 Shell 种类众多,常见的有:
由于易用和免费,Bash 在日常工作中被广泛使用。同时,Bash 也是大多数Linux 系统默认的 Shell。
之前有听说过 java 8 的 lambda 实现不再是java 1.5的匿名内部类语法糖。今天刚好有时间看看:
public class App {
@FunctionalInterface
public interface LambdaDemo{
public void runLambda();
}
public static void doSomething(LambdaDemo demo){
demo.runLambda();
}
public static void main(String[] args) {
doSomething(()->System.out.println("hello world!"));
}
}在 Java 编程中,我们偶尔能看到“时钟回拨”的现象:
//now() returns 2019-01-13T22:34:05.681Z
order.setCreationTime(Instant.now());
//... 执行一些其他工作
//now() returns 2019-01-13T22:34:03.123Z
//发现时间比创建时间提前了,仿佛时间被回拨
order.setCancelationTime(Instant.now());哈希表最理想的状态是:一个 key 经过哈希函数计算后,直接落到一个确定的槽位。但不同 key 可能算出同一个位置,线性探测、链地址法等方法会引入探测链或桶内扫描,查询时间也就不再稳定。
Cuckoo Hash(布谷鸟哈希)最早由 Rasmus Pagh 和 Flemming Friche Rodler 提出。它给每个 key 安排两个候选位置:只要其中一个为空,就能直接放入;如果两个都被占用,就把已经占据位置的旧 key 踢到它的另一个候选位置。这个过程像布谷鸟把别的鸟蛋挤出鸟巢,因此得名。
它的最大特点是查询路径非常确定:计算两个哈希值,检查两个固定位置即可。不需要在冲突链上逐个比较,也不需要探测一段连续区间,因此删除也可以用同样简单的方式完成。
先来看个最简 DEMO(双向通信):

// server端
public class SocketServer {
public static void main(String[] args) throws Exception {
ServerSocket server = new ServerSocket(8080);
// 阻塞等待连接
Socket socket = server.accept();
// 从socket中获取输入流,并建立缓冲区进行读取
InputStream inputStream = socket.getInputStream();
byte[] bytes = new byte[1024];
int len;
StringBuilder sb = new StringBuilder();
while ((len = inputStream.read(bytes)) != -1) {
sb.append(new String(bytes, 0, len,"UTF-8"));
}
System.out.println("Received: " + sb);
OutputStream outputStream = socket.getOutputStream();
outputStream.write("hello client".getBytes("UTF-8"));
outputStream.flush();
// 关闭流&连接
inputStream.close();
outputStream.close();
socket.close();
server.close();
}
}
// client 端
public class SocketClient {
public static void main(String args[]) throws Exception {
Socket socket = new Socket("127.0.0.1", 8080);
// 建立连接后获得输出流
OutputStream outputStream = socket.getOutputStream();
String message="hello server";
outputStream.write(message.getBytes("UTF-8"));
//通知server消息发送完成
socket.shutdownOutput();
// 读取消息
InputStream inputStream = socket.getInputStream();
byte[] bytes = new byte[1024];
int len;
StringBuilder sb = new StringBuilder();
while ((len = inputStream.read(bytes)) != -1) {
sb.append(new String(bytes, 0, len,"UTF-8"));
}
System.out.println("Received: " + sb);
// 关闭流&连接
inputStream.close();
outputStream.close();
socket.close();
}
}每个服务器资源都有一个自己的名字,服务器资源名被称为统一资源标识符(URI),用于唯一标识标识并定位资源。URI 是一个通用的概念,由两个主要的子集 URL 和 URN 组成。 URL是通过描述资源的位置来标识资源的,而 URN 是通过名字来标识资源。
http规范将更通用的 URI 作为资源标识符,但在http应用程序实际使用中,更常见的是处理URL。
对象的创建和销毁在一定程度上会消耗系统的资源,虽然jvm的性能在近几年已经得到了很大的提高,对于多数对象来说,没有必要利用对象池技术来进行对象的创建和管理。但是对于有些对象来说,其创建的代价还是比较昂贵的,比如线程、tcp连接、数据库连接等对象。对于那些创建耗时较长,或者资源占用较多的对象,比如网络连接,线程之类的资源,通常使用池化来管理这些对象,从而达到提高性能的目的。
apache-common-pool提供了一个通用的对象池技术的实现。可以很方便的基于它来实现自己的对象池。比如DBCP和Jedis他们的内部对象池的实现就是依赖于apache-common-pool(本文分析的是apache common pool2)。
SOCKS是一种网络传输协议,主要用于客户端与外网服务器之间通讯的中间传递。当防火墙后的客户端要访问外部的服务器时,就跟SOCKS代理服务器连接。这个代理服务器控制客户端访问外网的资格,允许的话,就将客户端的请求发往外部的服务器。根据OSI模型,SOCKS是会话层的协议,位于表示层与传输层之间。
aaa,bbb,ccc CRLF
zzz,yyy,xxx CRLFaaa,bbb,ccc CRLF
zzz,yyy,xxxfield_name,field_name,field_name CRLF
aaa,bbb,ccc CRLF
zzz,yyy,xxx CRLF,号分隔,最后一个字段记录后面不能有分隔符。例如:AAA,BBB,CCC"aaa","bbb","ccc"CRLF
ZZZ,YYY,XXX"aaa","b CRLFbb","ccc" CRLF
zzz,yyy,xxx"aaa","b""bb","ccc"file = [header CRLF] record *(CRLF record) [CRLF]
header = name *(COMMA name)
record = field *(COMMA field)
name = field
field = (escaped / non-escaped)
escaped = DQUOTE *(TEXTDATA / COMMA / CR / LF / 2DQUOTE) DQUOTE
non-escaped = *TEXTDATA
COMMA = %x2C
CR = %x0D ;as per section 6.1 of RFC 2234 [2]
DQUOTE = %x22 ;as per section 6.1 of RFC 2234 [2]
LF = %x0A ;as per section 6.1 of RFC 2234 [2]
CRLF = CR LF ;as per section 6.1 of RFC 2234 [2]
TEXTDATA = %x20-21 / %x23-2B / %x2D-7E本文介绍如何批量执行 mysql 语句。
尝试复现问题
CREATE SCHEMA `tmp` DEFAULT CHARACTER SET utf8 COLLATE utf8_danish_ci ;
flush privileges;
grant all privileges on tmp.* to 'victorchu'@'localhost' ;CREATE TABLE IF NOT EXISTS `tmp`.`A`(
`id` INT NOT NULL,
`name` VARCHAR(45) NULL,
`b_name` VARCHAR(45) NULL,
PRIMARY KEY (`id`))
ENGINE = InnoDB
DEFAULT CHARACTER SET = utf8;
INSERT INTO `tmp`.`A` (`id`, `name`, `b_name`) VALUES ('1', '1', '1');
INSERT INTO `tmp`.`A` (`id`, `name`, `b_name`) VALUES ('2', '2', '2');
INSERT INTO `tmp`.`A` (`id`, `name`, `b_name`) VALUES ('3', '3', '3');接着创建表B。
MySQL提供的group_concat()函数可以拼接某个字段值成字符串,如 select group_concat(user_name) from sys_user,默认的分隔符是逗号,即,,如果需要自定义分隔符可以使用 SEPARATOR.如:select group_concat(user_name SEPARATOR '_') from sys_user。
java命令用于启动JVM虚拟机。Java启动参数分为3种:
有一个文本串S,和一个模式串P,现在要查找P在S中的位置,怎么查找呢?
假设主串target为: a b a c a a b a c a b a c a b a a b b,模式串pattern: a b a c a b(为了方便查看,每个字符间用空格隔开)。
用暴力算法匹配字符串过程中,我们会把target[0]跟 pattern[0] 匹配,如果相同则匹配下一个字符,直到出现不相同的情况,此时我们会丢弃前面的匹配信息,然后把target[1]跟 pattern[0] 匹配,循环进行,直到主串结束,或者出现匹配成功的情况。这种丢弃前面的匹配信息的方法,极大地降低了匹配效率。
以上面的字符为例子:pattern的前5个字符abaca可以匹配target的前5个字符,但是pattern[5]和target[5]不匹配。下面重新从target[1]开始和pattern匹配。
显然效率很差,因为你要把"搜索位置"移到已经比较过的位置,重比一遍。
上下文无关的组成部分:
例如,下面数学表达式:
$$ expr \to expr+term $$
$$ expr \to expr-term $$
$$ expr \to term $$
$$ term \to term * factor $$
$$ term \to term/factor $$
$$ term \to factor $$
$$ factor \to (expr) $$
$$ factor \to id $$
+,-。google 提出了 Jump consistent hash 算法,跳转一致性哈希不需要存储,速度更快,并且在均匀划分key方面做得更好。它的主要限制是桶必须按顺序编号,这使得它 比分布式 Web 缓存更适合数据存储应用程序
哈希环法是最常用的、最经典的一致性哈希算法, 也叫做割环法。 这个算法易于理解、应用广泛(例如亚马逊的Dynamo1), 实现了最小化的重新映射。
一致性哈希算法是一种特殊的哈希算法, 当目标槽位数量发生变化时,它会尽力降低的重新映射的数量。 传统的哈希表设计中,添加或者删除一个槽位,会造成全量的重新映射, 一致性哈希则追求的是增量式重新映射。