一

{"type":"编程笔记"}


  • Home

  • Archives
  • Search

zsh config on mac os

Posted on 2016-07-10   |   In macos

本文是使用powerline字体和一些zsh的插件,定制Mac OS上自带的命令行终端工具Terminal,而不是基于iTerm2。

首先查看一下系统是否已经安装了zsh,没有安装则使用brew install zsh安装。

 cat /etc/shells

# List of acceptable shells for chpass(1).

# Ftpd will not allow users to connect who are not using

# one of these shells.

/bin/bash

/bin/csh

/bin/ksh

/bin/sh

/bin/tcsh

/bin/zsh

切换到zsh并退出终端。

 chsh -s /bin/zsh

退出后重新进入Terminal,再确认当前的shell:

Read more »

mysql numeric data types

Posted on 2016-07-10   |   In mysql

INT数据类型

整数类型包括:TINYINT、SMALLINT、MEDIUMINT、INT、BIGINT,分别需要8、16、24、32和64位存储空间。

有符号(SIGNED)和无符号数(UNSIGNED)类型占用的存储空间是一样的,性能也是一样的,所以可以根据实际情况采用合适的类型。

MySQL还可以对整数类型定义显示宽度,比如INT(11)。这对于大多数应用程序而言并没有实际意义,它并不是限制值的范围,只是规定了MySQL的交互工具,如客户端来显示数字的字符数的。对于实际的存储和计算而言,INT(1)和INT(11)是一样的。

常用的INT类型举例说明一下,像SMALLINT就要慎用,很容易发生数值超过上限而发生存储问题:

  1. TINYINT能表示从-128到127的整型数据,存储大小为1字节,常用这个类型来表示true/false,虽然实际上-127一共有4个字符,但定义TINYINT字段最常用的形式是TINYINT(1)。
  2. INT能存储计算-2^31 (-2,147,483,648)到2^31–1 (2,147,483,647)的整型数据,最常使用的字段类型,因为-2147483648字符长度为11,所以INT字段一般定义为INT(11)。
  3. BIGINT能存储计算-2^63 (-9223372036854775808)到2^63-1 (9223372036854775807)的整型数据,UNSIGNED BIGINT范围为0 ~ 18446744073709551615,所以BIGINT字段一般定义为BIGINT(20)。

FLOAT/DOUBLE/DECIMAL/NUMERIC类型及区别

  1. MySQL中存在FLOAT,DOUBLE等非标准数据类型,也有DECIMAL这种标准数据类型。
  2. 单精度FLOAT和双精度DECIMAL类型支持使用标准的浮点运算进行近似计算并保存,DECIMAL类型用于保存精确的小数,实际保存以字符串形式存在。
  3. MySQL浮点类型可以用type_name(M,D)来表示,M表示该值的最多的所有数字个数(也就是不包括小数点和正负号的数字个数),M的有效范围为1到65,D表示小数点后面的数字长度,D的有效范围为0到30,并且不能大于M,M和D又称为精度precision和标度scale,如FLOAT(7,4)的可显示为-999.9999,MySQL保存值时进行四舍五入,如果插入999.00009,则结果为999.0001。
  4. FLOAT和DOUBLE在不指定精度时,默认会按照实际的精度来显示,而DECIMAL在不指定精度时,默认整数为10,小数为0。
  5. 这些类型实际上是定义数据的存储类型,在MySQL内部对浮点类型都使用DOUBLE进行计算。
  6. 由于DECIMAL需要额外的空间和计算开销,只有在需要对小数进行精确计算的时候才使用DECIMAL,比如处理金融数据。
  7. 在实际处理金融数据时,可以将数据放大100倍到分或者放大100,000倍到厘进行INT或者BIGINT整数存储和计算,可以避免用FLOAT、DOUBLE计算产生的误差。

关于NUMERIC(M,D)和DECIMAL(M,D)的说明

The SQL standard requires that the precision of NUMERIC(M,D) be exactly M digits. For DECIMAL(M,D), the standard requires a precision of at least M digits but permits more. In MySQL, DECIMAL(M,D) and NUMERIC(M,D) are the same, and both have a precision of exactly M digits.

实际测试结果及说明

以下测试代码基于MySQL 5.6.22版本。

建表语句如下:

Read more »

mysql-5.6.4 date and time representation

Posted on 2016-07-09   |   In mysql

DATETIME和TIMESTAMP区别

  1. DATETIME能保存大范围的值,从1000-01-01 00:00:00到9999-12-31 23:59:59,精度为秒。它把日期和时间封装在一个格式为YYYYMMDDHHMMSS的整数中,与时区无关。
  2. DATETIME在5.6.4版本之前使用了8字节的存储空间。默认情况下,MySQL以一种可排序,清楚的格式显示DATETIME值,如2016-07-09 10:12:33,这种方式也符合ANSI标准。
  3. TIMESTAMP类型保存了自1970年1月1日以来的秒数,它和Unix的时间戳相同。
  4. TIMESTAMP只使用了4个字节的存储空间。它能表示的范围比DATETIME小得多。它表示的日期范围只能从1970-01-01 00:00:01到2038-01-19 03:14:07(UTC),这个数值受int值最大值限制,如下javascript console示例说明。
  5. MySQL提供了FROM_UNIXTIME()函数把UNIX时间戳转换为日期,并提供了UNIX_TIMESTAMP()函数,把日期转换为UNIX时间戳。
  6. TIMESTAMP显示的值也依赖于时区,MySQL服务器,操作系统和客户端连接都有时区设置。数据库里保存为0的值,在不同的时区的客户端显示的结果并不相同。
  7. TIMESTAMP还有个自动更新的特殊功能。在默认情况下,更新和插入记录,如果没有显式设置TIMESTAMP列的值,MySQL会把它设置为当前时间。
  8. 除第一个以外的TIMESTAMP列也可以设置到当前的日期和时间,只要将列设为NULL,或NOW()。
  9. 最后,TIMESTAMP列的默认值为NOT NULL,这和其他的数据类型都不一样。

因为TIMESTAMP值不能比1970-01-01早,也不能比2038-01-19晚,这意味着,如果要存储一个生日日期1968-01-01,只能使用DATETIME或DATE,而不能使用TIMESTAMP数据类型进行存储!

javascript console

new Date(1000 * (2 ** 31 - 1))
Tue Jan 19 2038 11:14:07 GMT+0800 (CST)

MySQL-5.6.4版本前后变化

MySQL-5.6.4版本升级对日期字段的精度和存储长度都有所变化。

下表为日期存储字段的长度变化:

Type Storage before MySQL 5.6.4 Storage as of MySQL 5.6.4
YEAR 1 byte, little endian Unchanged
DATE 3 bytes, little endian Unchanged
TIME 3 bytes, little endian 3 bytes + fractional-seconds storage, big endian
TIMESTAMP 4 bytes, little endian 4 bytes + fractional-seconds storage, big endian
DATETIME 8 bytes, little endian 5 bytes + fractional-seconds storage, big endian

MySQL-5.6.4之前的版本中日期和时间精度小数部分并不会被存储下来,如果需要存储时间的微秒或者毫秒级别的部分小数,需要用MySQL的时间处理函数,如MICROSECOND()截取小数部分,再存储到单独的一个整数字段中。

mysql> SELECT MICROSECOND('2010-12-10 14:12:09.019473');

MICROSECOND('2010-12-10 14:12:09.019473')
19473

MySQL-5.6.4中对于TIME,DATETIME,和TIMESTAMP这3种数据类型做了升级,可以提供最高6位精度的小数位,也就是能存储最高到微秒(microsecond)级别的时间精度。

TIMESTAMP(N)的N在老版本的MySQL中是代表显示的宽度,其实际存储的值还是一样的,而不是精度的含义,这个特性在MySQL-5.5.3中被移除了。

使用如下语法定义时间精度:type_name(fsp)

其中,type_name是TIME,DATETIME或者TIMESTAMP,而fsp是时间小数的精度部分(0-6),如下例所示:

Read more »

java object initialization order

Posted on 2016-07-04   |   In java

存在继承关系的java对象初始化顺序

  1. 执行父类静态域和静态初始化块。
  2. 执行子类静态域和静态初始化块。
  3. 执行父类非静态的实例域和实例初始化块。
  4. 执行父类的构造器方法。
  5. 执行子类非静态的实例域和实例初始化块。
  6. 执行子类的构造器方法。
Read more »

java thread interrupt mechanism

Posted on 2016-07-03   |   In java

如何中断线程

通过Thread#interrupt()方法中断线程,这里的中断并不是stop线程,而只是设置线程的中断状态位,是否中断是取决于线程本身。

实际上Java的线程中断是一种线程之间的协作机制,也就是说调用线程对象的Thread#interrupt()方法并不一定就中断了正在运行的线程,它只是要求线程自己在合适的时机中断自己,每个线程都有一个boolean的中断状态(这个状态不在Thread的属性上),Thread#interrupt()方法仅仅只是将该状态置为true。

判断线程是否被中断

使用Thread#isInterrupted()方法,一般是这样使用:while(!Thread.currentThread().isInterrupted()) {}。

线程中断相关方法说明

Method Description
public static boolean interrupted() 测试当前线程是否已经中断,线程的中断状态由该方法清除。换句话说,如果连续两次调用该方法,则第二次调用将返回false。
public boolean isInterrupted() 测试线程是否已经中断。线程的中断状态不受该方法的影响。
public void interrupt() 中断线程。

线程中断和线程阻塞

java中有很多方法会导致线程阻塞:

  • Object.wait()
  • Thread.sleep()
  • Process.waitFor()
  • AsynchronousChannelGroup.awaitTermination()
  • ExecutorService.awaitTermination()
  • Future.get()
  • BlockingQueue.take()
  • Semaphore.acquire()
  • Condition.await() and many others in java.util.concurrent.*
  • SwingUtilities.invokeAndWait()

需要特别注意传统阻塞IO(blocking I/O)并不会抛出InterruptedException。

以上提及的这些阻塞方法,如Object.wait(),Thread.sleep()等方法被调用后,线程处理阻塞状态,这些方法会不断的轮询监听线程的interrupted标志位,发现其设置为true后,会停止阻塞并抛出InterruptedException异常,并且在抛出异常之后立即清除中断状态,也就是说在这时候在异常catch处理块中调用Thread.currentThread().isInterrupted()方法返回的仍然是false。

抛出异常是为了唤醒线程,并且通知线程有中断信号需要处理,如何处理是由线程本身决定,下面也会提到2种常见的处理方式。

中断异常处理方式

1. 在catch子句中,调用Thread.currentThread.interrupt()来重新设置中断状态,因为在抛出InterruptedException异常后会清除中断状态,重置中断状态后可以让后面的代码通过判断Thread.currentThread().isInterrupted()结果而知道之前有中断发生过:

Read more »
1…192021…99
yuweijun

yuweijun

492 posts
12 categories
RSS
GitHub Twitter
© 2021 yuweijun
Powered by Hexo
Theme - NexT.Mist.KISS