Kindrage's blog

本性善良, 勇气满满

安装

ruby中连接mysql推荐使用mysql2 这个库, 这个库依赖系统中的mysql-client, 所以需要先安装mysql-client

macOS使用brew直接安装即可

1
brew install mysql-client

安装完成后,控制台会输出mysql-client 的安装目录, 记录下这个目录, 安装mysql2 的时候需要使用, 我这里是/opt/homebrew/opt/mysql-client/

安装mysql2:

1
sudo gem install mysql2 -- --with-mysql-dir=/opt/homebrew/opt/mysql-client/

如果使用的不是mac系统自带ruby, 则安装Gem的时候,需要添加 --user-install 选项

1
gem install mysql2  --user-install -- --with-mysql-dir=/opt/homebrew/opt/mysql-client/

使用

阅读全文 »

spring 项目需要根据 配置 来构建 ApplicationContext,并初始化项目中需要使用的组件,以及从什么地方去扫描组件。 所以 配置 对于spring项目来说有至关重要, 是spring的灵魂。

spring boot 提供了两种方式来定义配置:

  1. 在java代码中配置:@Configuration (推荐此种方式)
  2. 基于XML文件配置: spring 一直以来的配置方式, 不做多于说明。 好也XML,坏也XML。

以下细说代码风格的配置

配置类 @Configuration

配置是spring的核心, 有@Configuration 注解的类, 会被spring认为是 spring 运行环境的 配置类, 至于配置类有多重要,看下面这段代码就知道了:

1
2
3
public static void main(String[] args) {
SpringApplication.run(Example.class, args);
}

这是项目的运行入口, SpringApplication 运行参数,第一个参数 就是配置类。 可以说有配置类,才有SpringApplication。它的作用就是告诉spring容器, 有哪些bean需要容器来管理。

阅读全文 »

试着让 Ruby 更自然,而不是更简单

ruby 初见

Ruby 是一个注重均衡的语言,松本行弘(Yukihiro “Matz” Matsumoto)发明,兼具函数式编程和命令式编程特色的语言。

Ruby 完全免费

Ruby 把一切视为对象。

Ruby 很灵活性,Ruby 的核心部分可以更改,也可以重新定义。

Ruby 代码块:表现力强大的特性。 代码块使用 do ... end 结构表述,Ruby 中有很多方法都留出了切入点,让程序员编写代码块,控制方法具体的操作细节。

Ruby 中的混入。 Ruby“有意”只提供单继承,但是Ruby有模块,类可以混入模块,得到模块中的所有方法。

1
2
3
class MyArray
include Enumerable
end

Ruby 变量约定:在 Ruby 中,不需要提前声明变量。Ruby 使用简单的命名约定指明变量的作用域。

  • var 可能是局部变量
  • @var 是实例变量
  • $var 是全局变量
阅读全文 »

SpringApplication 类以main() 方法作为入口, 提供了非常方便的方式来启动Spring应用程序。大多数情况下直接调用静态方法SpringApplication.run就可以搞定:

1
2
3
public static void main(String[] args) {
SpringApplication.run(MySpringConfiguration.class, args);
}

应用启动时输出信息类似:

1
2
3
4
5
6
7
8
9
10
11
12
  .   ____          _            __ _ _
/\\ / ___'_ __ _ _(_)_ __ __ _ \ \ \ \
( ( )\___ | '_ | '_| | '_ \/ _` | \ \ \ \
\\/ ___)| |_)| | | | | || (_| | ) ) ) )
' |____| .__|_| |_|_| |_\__, | / / / /
=========|_|==============|___/=/_/_/_/
:: Spring Boot :: v2.4.0

2019-04-31 13:09:54.117 INFO 56603 --- [ main] o.s.b.s.app.SampleApplication : Starting SampleApplication v0.1.0 on mycomputer with PID 56603 (/apps/myapp.jar started by pwebb)
2019-04-31 13:09:54.166 INFO 56603 --- [ main] ationConfigServletWebServerApplicationContext : Refreshing org.springframework.boot.web.servlet.context.AnnotationConfigServletWebServerApplicationContext@6e5a8246: startup date [Wed Jul 31 00:08:16 PDT 2013]; root of context hierarchy
2019-04-01 13:09:56.912 INFO 41370 --- [ main] .t.TomcatServletWebServerFactory : Server initialized with port: 8080
2019-04-01 13:09:57.501 INFO 41370 --- [ main] o.s.b.s.app.SampleApplication : Started SampleApplication in 2.992 seconds (JVM running for 3.658)

默认输出INFO级别日志,包括一些启动相关的细节、启动应用的用户等。 设置spring.main.log-startup-infofalse可以关闭启动日志,包含当前生效的profile日志。

阅读全文 »

问题

今天开发中遇到了一个奇怪的问题, 三个表做join操作的时候,关联字段和查询条件都是有索引的,但是查询花了15秒。

这种时候,一般也不慌,查下执行计划看看哪里出了问题

1
2
3
4
5
EXPLAIN select count(*)
from pdd_order_refund r
join pdd_order o on o.id = r.order_id
left join pdd_order_outer_info i on i.order_id = o.id
where r.shop_id in (628990065,618972237);

结果如下:

explain

可以看到pdd_order表使用主键关联只扫描一行数据, 是正常的,而pdd_order_outer_info 表虽然使用到了IDX_DDD索引,但仍然扫描了全表(87422行)数据, 肯定是有问题的。

阅读全文 »

说明:转换仅支持ipv4地址

可实行性分析

ipv4 地址格式: [0-255].[0-255].[0-255].[0-255]

ipv4地址分为4段, 每一段是一个[0-255]之间的数字,可见第一段可使用的数字个数为256=2^8 , 刚好是一个字节能表示的无符号整数范围。那4段就是4个字节。 也就是说只需要4个字节就能存下ip地址, java中一个int是4个字节,一个int就能表示一个ipv4地址。

端口的范围是 0-65535 , 刚好是2^16 个数字, 是两个字节能表示的无符号整数范围。

所以实际上存储 ip:port 组合只需要6个字节, java中long是8个字节, 完全能够表示ip:port组合。

代码实现

实现依赖了guava来处理整数和字节数组的转换

阅读全文 »

本文主要介绍在centos7 上使用KVM(Kernel-based Virtual Machine)安装和管理虚拟机步骤, 不对虚拟化和KVM做深入讨论

官方文档 是个PDF, 由于外网打开慢, 最好下载下来放本地。

KVM 简介

KVM(Kernel-based Virtual Machine) 是一个Linux内核模块,允计用户空间进程使用硬件虚拟化特性,支持Intel和AMD cpu。KVM模块使得虚拟机可以像一个普通用户进程一样运行。

KVM 使用 QEMU实现I/O硬件模拟,QEMU是运行在用户空间的一种模拟器,能够以非常好的性能模拟各种处理器,配合KVM模块, 性能几乎可以接近物理机。KVM使用libvirt的API和工具来管理虚拟机,常用的工具有:virshvirt- installvirt-clone

阅读全文 »

可扩展的配置

Spring 可以使用外部配置, 这样的话同一个包就可以在不同的运行环境, 使用不同的配置了, 同时也可以保护生产环境配置。

外部配置支持的呈现方式:

  • properties 文件
  • YAML 文件
  • 环境变量
  • 命令行参数

获取属性值的方法:

  1. @Value : 通过@Value注解,注入到字段里
  2. Environment: 通过Environment抽象类访问
  3. @ConfigurationProperties: 通过@ConfigurationProperties注解绑定的类上

spring 获取属性值的顺序:

阅读全文 »

作为一个老java, 说来惭愧,spring boot出来这么多年了,才第一次使用。 不知从何下手,先看看官方文档 说了些什么吧。

后面内容就是照搬, 没动脑,只是记录,免得以后还得面对abc,实在是累

环境

首先确认开发环境

1
2
3
4
5
6
7
8
9
10
11
$ java -version
java version "1.8.0_201"
Java(TM) SE Runtime Environment (build 1.8.0_201-b09)
Java HotSpot(TM) 64-Bit Server VM (build 25.201-b09, mixed mode)

$ mvn -v
Apache Maven 3.6.0 (97c98ec64a1fdfee7767ce5ffb20918da4f719f3; 2018-10-25T02:41:47+08:00)
Maven home: /Users/huazhizui/application/apache-maven-3.6.0
Java version: 1.8.0_201, vendor: Oracle Corporation, runtime: /Library/Java/JavaVirtualMachines/jdk1.8.0_201.jdk/Contents/Home/jre
Default locale: zh_CN, platform encoding: UTF-8
OS name: "mac os x", version: "10.15.4", arch: "x86_64", family: "mac"

创建一个目录,作为本示例的工作目录, 后面都操作都在这个目录中进行。

1
2
$ mkdir spring-boot-demo2
$ cd spring-boot-demo2

创建pom文件

阅读全文 »
0%