漫谈数据存储发展

用发展的眼光看问题(但是如何实践还是很难的)

1. 概览数据存储方式变化

  • 文本文件(csv, xml, json)
  • 二进制文件(*.dat, excel)(RCFile, Avro, parquet, orc)
  • sql rdb
  • no sql
  • redis <key, value>
  • mongo (partition, shard)
  • big table {HBase} (row, column family, time), slice, tablet
  • es (cluster 、 node 、 shard{ Lucene })
  • 图数据库 {Neo4J} (node - relation)
  • OceanBase?
  • TiDB,CockroachDB

1.1 RDBMS vs NoSQL

阅读全文>>

Kafka入门

web sites

wikipedia 介绍

Kafka from领英,2011年初开源,并于2012年10月23日由Apache Incubator孵化出站。2014年11月,几个曾在领英为Kafka工作的工程师,创建了confluent.io新公司。根据2014年Quora的帖子,Jay Kreps似乎已经将它以作家弗朗茨·卡夫卡命名,它是“一个用于优化写作的系统”。

different with MessageQueue

  • common mq: RabbitMQ, Redis, ActiveMQ, zeroMQ, rocketMQ,数据库?应用服务器间消息传递
  • kafka: 主要用于处理活跃的流式数据,大数据量的数据处理上.

阅读全文>>

JPA query 的几种写法

1. jpql

JPQL is hql? jpa 是javaee的一部分规范,spring data jpa 采用hibernate实现,eclipse也有实现JPA,等等 https://zh.wikipedia.org/wiki/Java%E6%8C%81%E4%B9%85%E5%8C%96API https://jcp.org/aboutJava/communityprocess/final/jsr338/index.html

interfaces 命名

  • findXxx
  • findBy
  • count
  • page

注解中写法 @query (nativeQuery=false)

  • select * from Entity
  • select e from Entity e
  • select e.* from Entity e
  • from Entity
  • select col1, col2, col3 from Entity // List<Object[]>
  • select new ai.advance.your.package.Pojo(col1, col2, col3) from Entity
  • select new map(… // 这种方式很傻,key为”0”,”1”.etc(??col as keyName)

构造criteria query

阅读全文>>

java11 var 关键字和 cli 方式执行

java11 在语法上支持动态类型推断,还支持在命令行运行源码。其实var关键字在java10已经支持了,而且从java9开始就添加了jshell命令等,不过9和10都已经夭折了,而且现在java11都更新过一个版本了,我们大大方方的讨论java11吧。

动态类型推断,这个术语可能不严谨,openjdk网站上描述是Local-Variable Type Inference(本地变量类型推断),参考 JEP 286

在命令行运行源码,不是指jshell,而是Launch Single-File Source-Code Programs(启动单个源码程序),java命令直接启动源码文件,还有shebang特性,参考 JEP 330

看个简单例子:创建Hello.java文件,内容如下

1
2
3
4
5
6
7
8
9
10
11
12
13
import java.util.ArrayList;
public class Hello {
public static void main(String[] args) {
var list = new ArrayList<>();
var hi = "hello world";
var bool = true;
var i = 1;
list.add(hi);
list.add(bool);
list.add(i+i);
System.out.println(list);
}
}

可以看到代码中使用了var关键字,即使用了动态类型推断特性。
然后,在命令行中执行java Hello.java命令,输出[hello world, true, 2]

阅读全文>>

构建 puppeteer docker 镜像

有时候需要在服务端生成PDF,可是在服务端生成的PDF不如浏览器中看到的页面美观,就想到了浏览器headless模式,在服务端访问前端,然后以PDF格式打印网页。
前端大神安利了puppeteer,确实很不错,还支持定制页眉页脚。
再者服务端程序是使用docker管理的,所以需要创建含有puppeteerdocker镜像。

先看Dockerfile

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
# 基于`alpine`版本的`node`10
FROM node:10.15.2-alpine

# 安装 Chromium (72)。从 alpine/v3.9 版本库中下载
RUN apk update && apk upgrade && \
echo @v3.9 http://dl-cdn.alpinelinux.org/alpine/v3.9/community >> /etc/apk/repositories && \
echo @v3.9 http://dl-cdn.alpinelinux.org/alpine/v3.9/main >> /etc/apk/repositories && \
apk add --no-cache \
freetype@v3.9 \
chromium@v3.9 \
harfbuzz@v3.9 \
nss@v3.9

# 安装 Puppeteer 时不让它自动下载 Chromium
ENV PUPPETEER_SKIP_CHROMIUM_DOWNLOAD true
# 选择 Chromium 72 对应的 Puppeteer 版本
RUN yarn add puppeteer@1.11.0

# 添加用户
RUN addgroup -S pptruser && adduser -S -g pptruser pptruser \
&& mkdir -p /home/pptruser/Downloads \
&& chown -R pptruser:pptruser /home/pptruser

# 添加 cjk 字体以支持中文
COPY NotoSansCJK-Regular.ttc /usr/share/fonts/TTF

USER pptruser

阅读全文>>

git stash clear 后恢复代码

使用git stash隐藏工作区内修改但未提交的代码,git stash list查看stash的历史记录,git stash clear清除所有的stash栈。

有时候可能不小心git stash clear掉了所有的记录,可是那些代码还有用。哎呀,杯具了,白写了!其实不用慌,可用下面的方法找回:

1
git fsck --no-reflogs 2>&1 | awk '/dangling commit/ {print $3}' | xargs git show --stat

阅读全文>>

spring-cloud zone, 类似 dubbo group 功能

spring-cloud zone 本地开发使用

当我们使用spring-cloud微服务框架时(netflix eureka组合),有很多微服务程序。开发时,本地启动eureka并注册所有微服务,成本太高。
直接使用公共开发环境的eureka,确实省事。比如有A, B, C三个服务,A没有变化,B有修改,C有修改并调用B,此时本地不用启动A,只启动B和C就可以。
不过不注意又有个问题,C调用B时,有时候调用公共环境上B服务,甚至其他开发者启动的B服务。dubbo有group配置给服务分组解决此问题;对于spring-cloud,此时需要配置zone:

1
2
eureka.instance.metadataMap.zone: YOUR-NAME
eureka.client.preferSameZoneEureka: true

阅读全文>>

git clone/checkout 指定文件/目录

对比svn,svn可以更新或下载特定目录(甚至精确控制每个目录权限),可是git不可以吗?在Git1.7.0以前,这无法实现,但是幸运的是在Git1.7.0以后加入了Sparse Checkout(直译为:稀疏检出)模式,这使得Check Out指定文件或者目录成为可能。操作如下:

对于已有项目

1
2
3
4
5
6
7
8
9
10
# 使能Sparse Checkout(稀疏检出)
git config core.sparsecheckout true
# 编辑'.git/info/sparse-checkout',规则类似gitignore。比如
echo '
/src
readme.md
' > .git/info/sparse-checkout
# 只保留根目录下/src目录和readme.md文件
git checkout
# ls,就可以看到内容已经变了,只有src和readme.md两项

阅读全文>>

Gradle 跨模块依赖测试代码

gradle中,模块A依赖core模块的测试代码

测试代码(test文件夹下的代码),是不跟随打包发布的,而且默认不随project依赖传递到其他的模块,需要用.sourceSets.test.output指明

简单配置,如下:

1
2
3
4
5
6
// A's build.gradle
dependencies {
compile project(':core')
//...
testCompile project(':core').sourceSets.test.output
}

阅读全文>>