MySQL 时间函数加减计算

一、MySQL 获得当前日期时间 函数 1.1 获得当前日期 + 时间(date + time) 1.2 获得当前日期 + 时间(date + time) 1.3 获得当前日期(date) 1.4 获得当前时间(time) 1.5 获得当前 UTC 日期时间 二、MySQL 日期时间 Extract(选取) 函数 2.1 选取日期时间的各个部分: 2.2 MySQL Extract() 函数 2.3 MySQL dayof… 2.4 MySQL week… 2.5 MySQL 返回星期和月份名称 2.6 返回月份中的最后一天 三、MySQL 日期时间计算函数 3.1 MySQL 为日期增加一个时间间隔 3.2 MySQL 为日期减去一个时间间隔 3.3 MySQL 另类日期 3.4 MySQL 日期、时间相减 四、MySQL 日期转换函数、时间转换函数 4.1 MySQL (时间、秒)转换 4.2 MySQL (日期、天数)转换 4.3 MySQL Str to Date (字符串转换为日期) 4.4 MySQL Date/Time to Str(日期/时间转换为字符串) 4.5 MySQL 获得国家地区时间格式 4.6 MySQL 拼凑日期、时间 五、MySQL 时间戳(Timestamp)函数 5.1 MySQL 获得当前时间戳 5.2 MySQL (Unix 时间戳、日期)转换函数: 5.3 MySQL 时间戳(timestamp)转换、增、减函数: 六、MySQL 时区(timezone)转换函数 一、MySQL 获得当前日期时间 函数 1.1 获得当前日期 + 时间(date + time) 函数:now() ...

2020年6月8日 · 7 分钟 · 天边的星星

如何伪装Nginx的banner内容

我们常用的curl这个命令,curl可以查看服务器web server的banner信息: 如: C:Documents and SettingsAdministrator>curl -I www.dangdang.com HTTP/1.1 200 OK Server: nginx/0.7.61(当当到目前为止用的还是nginx/0.7.61) C:Documents and SettingsAdministrator>curl -I www.360buy.com HTTP/1.0 200 OK Server: jdws (几个月前我就看还是nginx,做手脚啦!) 来个猛一点的 C:Documents and SettingsAdministrator>curl -I www.google.com HTTP/1.1 302 Found Server: gws (google自己开发的ws) 我们可以看清每家公司的web—server,当然也为黑客入侵提供了信息。如果你的这版ws存在一个致命bug,那可就惨啦。哪有没有一种办法可以修改ws信息哪?答案自然是有。下面介绍一种修改nginx的banner信息的方法。 方法很简单: 安装nginx时,在./configure后不要马上安装。而是进到安装文件的../src/core/目录下找到nginx.h用vi编辑器进行修改,如下: #define NGINX_VERSION “1.1.1” #define NGINX_VER “nginx/” NGINX_VERSION #define NGINX_VAR “NGINX” 改为(自定义) #define NGINX_VERSION “0.0.1” #define NGINX_VER “zhuzhu/” NGINX_VERSION #define NGINX_VAR “zhuzhu” 然后再执行make && make install 这回来看看我们自己的nginx ws显示成啥样 C:Documents and SettingsAdministrator>curl -I 192.168.0.111 HTTP/1.1 200 OK Server: zhuzhu/0.0.1 ...

2020年6月5日 · 1 分钟 · 天边的星星

springBoot基于thymeleaf集成H-ui后台

对于H-ui的体验与下载,大家可以直接访问他的官方网站:http://www.h-ui.net/H-ui.admin.shtml。 第一步下载H-UI admin 第二步 在Springboot 项目中的 static、templates 目录下面创建 admin文件夹 如下图 注意 把H-ui.admin所使用到的静态资源放到 static/admin下 第三步 配置controller ` import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; @Controller @RequestMapping("/admin/index") public class MainController { //日志 private Logger logger = LoggerFactory.getLogger(getClass()); @Autowired SysDictService sysDictService;//字典服务 @Autowired PjBankService pjBankService;//银行列表服务 /** * * @return */ @RequestMapping("/index") public String index(){ logger.info("后台首页"); return "/admin/index"; } /** * * @return */ @RequestMapping("/articlelist") public String articleList(){ logger.info("文字列表界面"); return "/admin/articlelist"; } /** * * @return */ @RequestMapping("/adminrole") public String adminrole(){ logger.info("角色管理"); return "/admin/admin-role"; } /** * * @return */ @RequestMapping("/admin-permission") public String adminpermission(){ logger.info("权限管理"); return "/admin/admin-permission"; } /** * * @return */ @RequestMapping("/admin-list") public String adminlist(){ logger.info("管理员管理"); return "/admin/admin-list"; } /** * * @return */ @RequestMapping("/member-list") public String memberlist(){ logger.info("管理员管理"); return "/admin/member-list"; } /** * * @return */ @RequestMapping("/admin-role-add") public String adminRoleAdd(){ logger.info("管理员管理"); return "/admin/admin-role-add"; } /** * * @return */ @RequestMapping(value = "/login",method = {RequestMethod.GET}) public String login(Model model){ logger.info("登录界面"); model.addAttribute("errorMsg",""); return "/admin/login"; } /** * * @return */ @PostMapping("/login") public String loginPost(Model model,HttpServletRequest request, HttpServletResponse response){ logger.info("登录用户名,密码验证"); String username = request.getParameter("username"); String password = request.getParameter("password"); String yzm = request.getParameter("yzmcode"); String pwd = new String(Base64.decodeBase64(password)); logger.info(username); logger.info(password); logger.info(pwd); logger.info(yzm); logger.info("session yzm=>"+request.getSession().getAttribute(VerifyUtil.RANDOMCODEKEY)); if (username.equals("zhangdl")&&pwd.equals("123456")){ return "redirect:/admin/index/welcome"; }else{ model.addAttribute("errorMsg","登录失败,用户名密码错误!"); return "/admin/login"; } } //创建方法 @RequestMapping("/welcome") public String welcome(){ logger.info("欢迎页"); return "/admin/welcome"; } /** * @desc 图形验证码生成 */ @RequestMapping("/createImg") public void createImg(HttpServletRequest request, HttpServletResponse response) throws Exception { try { response.setContentType("image/jpeg");//设置相应类型,告诉浏览器输出的内容为图片 response.setHeader("Pragma", "No-cache");//设置响应头信息,告诉浏览器不要缓存此内容 response.setHeader("Cache-Control", "no-cache"); response.setDateHeader("Expire", 0); VerifyUtil randomValidateCode = new VerifyUtil(); randomValidateCode.getRandCode(request, response);//输出验证码图片 }catch (Exception e){ logger.error("获取验证码失败!"); } } } ` 这个时候,基本上就集成完成。但是如果项目配置 server.servlet.context-path=/abc 这个时候,我们在开发的过程中 会出现路径问题。这个时候需要我们配置 界面中静态资源路径 ...

2020年5月29日 · 4 分钟 · 天边的星星

node.js中express框架的基本使用

`express是一个基于node.js平台的,快速,开放,极简的web开发框架。 一、安装 express npm install express --save 二、简单使用 express //引入express const express = require('express'); //创建一个应用 let app = express(); //匹配GET请求路径设置回调函数 app.get('/hello', function (req, res) { res.end('hello'); }); //监听端口 app.listen(8888, function () { console.log('port : 8888'); }); 通过访问 localhost:8888/hello 我们就可以看到内容输出了。 当然 express 还支持其他的一些请求方法,比如 app.post(),app.put(),app.delete(),app.head() 等。 //引入express const express = require('express'); //创建一个应用 let app = express(); //匹配POST请求 app.post('/hello', function (req, res) { res.end('post hello'); }); //监听端口 app.listen(8888, function () { console.log('port : 8888'); }); 如果我们想要匹配所有的请求路径,可以使用通配符 * 号。 //引入express const express = require('express'); //创建一个应用 let app = express(); app.get('/hello', function (req, res) { res.end('hello'); }); //*号匹配所有路径 app.get('*', function (req, res) { res.end('not found'); }); //监听端口 app.listen(8888, function () { console.log('port : 8888'); }); express 还提供了 all() 方法,可以匹配所有请求方法。 //引入express const express = require('express'); //创建一个应用 let app = express(); //匹配所有请求方法 app.all('/hello', function (req, res) { res.end('all hello'); }); //监听端口 app.listen(8888, function () { console.log('port : 8888'); }); 三、express 中间件的概念 express中间件就是处理http请求的函数,用来完成一些特定的操作,比如登陆检查,权限控制等等。 1、一个中间件处理完请求和响应,可以把数据传递给下一个中间件。 2、在回调函数中使用 next(),就可以让请求继续向下传递。 3、通过不同路径,分别执行不同的中间件。 我们可以使用 use() ,在路由数组中添加一个中间件。注意我们设置的路由路径最终会存放在一个数组里,由上到下的把路径加入这个数组中。 //引入express const express = require('express'); //创建一个应用 let app = express(); //如果没有设置路径,则会匹配全部 app.use(function (req, res, next) { console.log('匹配全部路径'); //注意这里如果不调用next(),则请求并不会向下传递。 next(); }); app.use('/hello', function (req, res, next) { console.log('use hello'); next(); }); app.get('/hello', function (req, res, next) { console.log('get hello'); next(); }); //监听端口 app.listen(8888, function () { console.log('port : 8888'); }); next() 函数可以传入一个参数,表示错误信息,默认将执行错误中间件。 //引入express const express = require('express'); //创建一个应用 let app = express(); app.get('/hello', function (req, res, next) { console.log('get hello'); next('error!!!'); }); //注意错误处理中间件的参数是4个 app.use(function (err, req, res, next) { console.log(err); res.end(err); }); //监听端口 app.listen(8888, function () { console.log('port : 8888'); }); 四、express中的request对象 在express中对原生的req请求对象进行了扩展,添加了一些属性和方法。 //引入express const express = require('express'); //创建一个应用 let app = express(); app.get('/hello', function (req, res, next) { //主机名 res.write('req.hostname : ' + req.hostname + '\r\n'); //请求URL的路径 res.write('req.path : ' + req.path + '\r\n'); //查询字符串对象 res.write('req.query : ' + JSON.stringify(req.query) + '\r\n'); //请求的远程IP地址 res.write('req.ip : ' + req.ip + '\r\n'); //请求方法 res.write('req.method : ' + req.method + '\r\n'); res.end(); }); //监听端口 app.listen(8888, function () { console.log('port : 8888'); }); 通过 req.params 获取路径里的参数 //引入express const express = require('express'); //创建一个应用 let app = express(); app.get('/list/:key/:page/:size', function (req, res, next) { //注意,设置了多少参数,地址就需要传入多少参数 res.end(JSON.stringify(req.params)); }); //监听端口 app.listen(8888, function () { console.log('port : 8888'); }); 五、express中的response对象 express中也对原生的res对象进行了扩展,添加了一些属性和方法。 const path = require('path'); //引入express const express = require('express'); //创建一个应用 let app = express(); app.get('/send/str', function (req, res, next) { //send方法会自动判断数据类型,并进行相应的head信息设置 //如果参数是字符串,则Content-Type为 text/html res.send('hello, world'); }); app.get('/send/arr', function (req, res, next) { //如果参数是一个数组,则返回json res.send([1, 2, 3]); }); app.get('/send/obj', function (req, res, next) { //如果参数是一个对象,则返回json res.send({name: 'xiaoxu', age: 24}); }); app.get('/send/number', function (req, res, next) { //如果是一个数字,则返回相应状态码短语 res.send(404); }); app.get('/download', function (req, res, next) { //提示下载文件 res.download('./1.txt'); }); app.get('/json', function (req, res, next) { //响应json对象 res.json({name: 'xiaoxu'}); }); app.get('/jsonp', function (req, res, next) { //客户端请求时,需要带上callback=test res.jsonp('hello'); }); app.get('/redirect', function (req, res, next) { //重定向到一个地址 res.redirect('http://www.baidu.com'); }); app.get('/sendfile', function (req, res, next) { //发送一个文件 res.sendFile(path.resolve('./1.txt')); }); app.get('/sendstatus', function (req, res, next) { //发送一个状态码 res.sendStatus(302); }); //监听端口 app.listen(8888, function () { console.log('port : 8888'); }); 六、ejs模板的使用 支持express的模板有很多种,这里我们使用ejs作为模板引擎。 安装ejs: npm install ejs 使用ejs模板 const path = require('path'); const express = require('express'); //创建一个应用 let app = express(); //设置模板引擎 app.set('view engine', 'ejs'); //设置模板目录 app.set('views', path.join(__dirname, 'views')); //监听 app.listen(8888); 如果我们希望,ejs能够渲染html页面,可以使用如下 const path = require('path'); const express = require('express'); let app = express(); //设置视图引擎为html引擎 app.set('view engine', 'html'); //设置视图的路径 app.set('views', path.join(__dirname, 'views')); //配置html引擎 app.engine('html', require('ejs').__express); app.listen(8888); 渲染视图,输出内容。 const path = require('path'); const express = require('express'); let app = express(); app.set('view engine', 'html'); app.set('views', path.join(__dirname, 'views')); app.engine('html', require('ejs').__express); app.get('/hello', function (req, res, next) { //参数一表示模板的名称,会在当前项目目录下的views目录查找 //参数二表示传入模板中的数据 res.render('hello', { name: 'xiaoxu', age: 24 }); }); app.listen(8888); hello.html的代码: <!doctype html> <html lang="zh-CN"> <head> <meta charset="UTF-8"> <title>Document</title> </head> <body> <%= name %> <%= age %> </body> </html> 七、静态文件服务器 有些时候我们需要在页面上加载css,js,img等静态资源,指定存放静态资源的目录,浏览器发出非html文件请求时,服务器会到这个目录下找对应的资源。 const path = require('path'); const express = require('express'); let app = express(); app.set('view engine', 'html'); app.set('views', path.join(__dirname, 'views')); app.engine('html', require('ejs').__express); //注意express.static这个中间件是express内置的 app.use(express.static(path.join(__dirname, 'public'))); app.get('/hello', function (req, res, next) { //参数一表示模板的名称,会在当前项目目录下的views目录查找 //参数二表示传入模板中的数据 res.render('hello', { name: 'xiaoxu', age: 24 }); }); app.listen(8888); 八、使用body-parser中间件解析post过来的数据 安装body-parser npm install body-parser 使用body-parser const path = require('path'); const express = require('express'); const bodyParser = require('body-parser'); let app = express(); app.set('view engine', 'html'); app.set('views', path.join(__dirname, 'views')); app.engine('html', require('ejs').__express); //解析 application/json app.use(bodyParser.json()); //解析 application/x-www-form-urlencoded app.use(bodyParser.urlencoded({extended:false})); app.post('/form', function (req, res) { console.log(req.body); }); app.listen(8888);`

2020年4月14日 · 4 分钟 · 天边的星星

如何用 RSA生成生成公钥私钥(非对称加密)

Java版本 `import java.security.Key; import java.security.KeyFactory; import java.security.KeyPair; import java.security.KeyPairGenerator; import java.security.PrivateKey; import java.security.PublicKey; import java.security.SecureRandom; import java.security.Signature; import java.security.interfaces.RSAPrivateKey; import java.security.interfaces.RSAPublicKey; import java.security.spec.PKCS8EncodedKeySpec; import java.security.spec.X509EncodedKeySpec; import java.util.Date; import java.util.HashMap; import java.util.Map; import javax.crypto.Cipher; import sun.misc.BASE64Decoder; import sun.misc.BASE64Encoder; public class CreateSecretKey { public static final String KEY_ALGORITHM = "RSA"; private static final String PUBLIC_KEY = "RSAPublicKey"; private static final String PRIVATE_KEY = "RSAPrivateKey"; public static final String SIGNATURE_ALGORITHM="MD5withRSA"; /** * RSA最大加密明文大小 */ private static final int MAX_ENCRYPT_BLOCK = 117; /** * RSA最大解密密文大小 */ private static final int MAX_DECRYPT_BLOCK = 128; //获得公钥字符串 public static String getPublicKeyStr(Map<String, Object> keyMap) throws Exception { //获得map中的公钥对象 转为key对象 Key key = (Key) keyMap.get(PUBLIC_KEY); //编码返回字符串 return encryptBASE64(key.getEncoded()); } //获得私钥字符串 public static String getPrivateKeyStr(Map<String, Object> keyMap) throws Exception { //获得map中的私钥对象 转为key对象 Key key = (Key) keyMap.get(PRIVATE_KEY); //编码返回字符串 return encryptBASE64(key.getEncoded()); } //获取公钥 public static PublicKey getPublicKey(String key) throws Exception { byte[] keyBytes; keyBytes = (new BASE64Decoder()).decodeBuffer(key); X509EncodedKeySpec keySpec = new X509EncodedKeySpec(keyBytes); KeyFactory keyFactory = KeyFactory.getInstance(KEY_ALGORITHM); PublicKey publicKey = keyFactory.generatePublic(keySpec); return publicKey; } //获取私钥 public static PrivateKey getPrivateKey(String key) throws Exception { byte[] keyBytes; keyBytes = (new BASE64Decoder()).decodeBuffer(key); PKCS8EncodedKeySpec keySpec = new PKCS8EncodedKeySpec(keyBytes); KeyFactory keyFactory = KeyFactory.getInstance(KEY_ALGORITHM); PrivateKey privateKey = keyFactory.generatePrivate(keySpec); return privateKey; } //解码返回byte public static byte[] decryptBASE64(String key) throws Exception { return (new BASE64Decoder()).decodeBuffer(key); } //编码返回字符串 public static String encryptBASE64(byte[] key) throws Exception { return (new BASE64Encoder()).encodeBuffer(key); } //***************************签名和验证******************************* public static byte[] sign(byte[] data,String privateKeyStr) throws Exception{ PrivateKey priK = getPrivateKey(privateKeyStr); Signature sig = Signature.getInstance(SIGNATURE_ALGORITHM); sig.initSign(priK); sig.update(data); return sig.sign(); } public static boolean verify(byte[] data,byte[] sign,String publicKeyStr) throws Exception{ PublicKey pubK = getPublicKey(publicKeyStr); Signature sig = Signature.getInstance(SIGNATURE_ALGORITHM); sig.initVerify(pubK); sig.update(data); return sig.verify(sign); } //************************加密解密************************** public static byte[] encrypt(byte[] plainText,String publicKeyStr)throws Exception{ PublicKey publicKey = getPublicKey(publicKeyStr); Cipher cipher = Cipher.getInstance(KEY_ALGORITHM); cipher.init(Cipher.ENCRYPT_MODE, publicKey); int inputLen = plainText.length; ByteArrayOutputStream out = new ByteArrayOutputStream(); int offSet = 0; int i = 0; byte[] cache; while (inputLen - offSet > 0) { if (inputLen - offSet > MAX_ENCRYPT_BLOCK) { cache = cipher.doFinal(plainText, offSet, MAX_ENCRYPT_BLOCK); } else { cache = cipher.doFinal(plainText, offSet, inputLen - offSet); } out.write(cache, 0, cache.length); i++; offSet = i * MAX_ENCRYPT_BLOCK; } byte[] encryptText = out.toByteArray(); out.close(); return encryptText; } public static byte[] decrypt(byte[] encryptText,String privateKeyStr)throws Exception{ PrivateKey privateKey = getPrivateKey(privateKeyStr); Cipher cipher = Cipher.getInstance(KEY_ALGORITHM); cipher.init(Cipher.DECRYPT_MODE, privateKey); int inputLen = encryptText.length; ByteArrayOutputStream out = new ByteArrayOutputStream(); int offSet = 0; byte[] cache; int i = 0; // 对数据分段解密 while (inputLen - offSet > 0) { if (inputLen - offSet > MAX_DECRYPT_BLOCK) { cache = cipher.doFinal(encryptText, offSet, MAX_DECRYPT_BLOCK); } else { cache = cipher.doFinal(encryptText, offSet, inputLen - offSet); } out.write(cache, 0, cache.length); i++; offSet = i * MAX_DECRYPT_BLOCK; } byte[] plainText = out.toByteArray(); out.close(); return plainText; } public static void main(String[] args) { Map<String, Object> keyMap; byte[] cipherText; String input = "Hello World!"; try { keyMap = initKey(); String publicKey = getPublicKeyStr(keyMap); System.out.println("公钥------------------"); System.out.println(publicKey); String privateKey = getPrivateKeyStr(keyMap); System.out.println("私钥------------------"); System.out.println(privateKey); System.out.println("测试可行性-------------------"); System.out.println("明文======="+input); cipherText = encrypt(input.getBytes(),publicKey); //加密后的东西 System.out.println("密文======="+new String(cipherText)); //开始解密 byte[] plainText = decrypt(cipherText,privateKey); System.out.println("解密后明文===== " + new String(plainText)); System.out.println("验证签名-----------"); String str="被签名的内容"; System.out.println("\n原文:"+str); byte[] signature=sign(str.getBytes(),privateKey); boolean status=verify(str.getBytes(), signature,publicKey); System.out.println("验证情况:"+status); } catch (Exception e) { e.printStackTrace(); } } }` Python `import rsa # 生成密钥 (pubkey, privkey) = rsa.newkeys(1024) # 保存密钥 with open('public.pem','w+') as f: f.write(pubkey.save_pkcs1().decode()) with open('private.pem','w+') as f: f.write(privkey.save_pkcs1().decode()) # 导入密钥 with open('public.pem','r') as f: pubkey = rsa.PublicKey.load_pkcs1(f.read().encode()) with open('private.pem','r') as f: privkey = rsa.PrivateKey.load_pkcs1(f.read().encode()) # 明文 message = 'hello' # 公钥加密 crypto = rsa.encrypt(message.encode(), pubkey) # 私钥解密 message = rsa.decrypt(crypto, privkey).decode() print(message) # 私钥签名 signature = rsa.sign(message.encode(), privkey, 'SHA-1') # 公钥验证 rsa.verify(message.encode(), signature, pubkey)`

2020年4月13日 · 3 分钟 · 天边的星星

java保留两位小数

java保留两位小数 1.使用java类库中自带的DecimalFormat类,使数字输出结果保留2位小数 代码如下: 运行结果如下: 2. 输出结果为: String.format表示字符串的格式化 3.使用BigDecimal四舍五入方法 需要导入BigDecimal类:import java.math.BigDecimal; 输出结果为: 1:scale指的是你小数点后的位数。比如123.456则score就是3. score()就是BigDecimal类中的方法啊。 比如:BigDecimal b = new BigDecimal(“123.456”); b.scale(),返回的就是3. 2:roundingMode是小数的保留模式。它们都是BigDecimal中的常量字段,有很多种。 比如:BigDecimal.ROUND_HALF_UP表示的就是4舍5入。 setScale(1)表示保留一位小数,默认用四舍五入方式 setScale(1,BigDecimal.ROUND_DOWN)直接删除多余的小数位,如2.35会变成2.3 setScale(1,BigDecimal.ROUND_UP)进位处理,2.35变成2.4 setScale(1,BigDecimal.ROUND_HALF_UP)四舍五入,2.35变成2.4 setScaler(1,BigDecimal.ROUND_HALF_DOWN)四舍五入,2.35变成2.3,如果是5则向下舍 BigDecimal的用法详解(保留两位小数,四舍五入,数字格式化,科学计数法转数字,数字里的逗号处理) 一、简介 Java在java.math包中提供的API类BigDecimal,用来对超过16位有效位的数进行精确的运算。双精度浮点型变量double可以处理16位有效数。在实际应用中,需要对更大或者更小的数进行运算和处理。float和double只能用来做科学计算或者是工程计算,在商业计算中要用java.math.BigDecimal。BigDecimal所创建的是对象,我们不能使用传统的+、-、*、/等算术运算符直接对其对象进行数学运算,而必须调用其相对应的方法。方法中的参数也必须是BigDecimal的对象。构造器是类的特殊方法,专门用来创建对象,特别是带有参数的对象。 二、构造器描述 BigDecimal(int) 创建一个具有参数所指定整数值的对象。 BigDecimal(double) 创建一个具有参数所指定双精度值的对象。 BigDecimal(long) 创建一个具有参数所指定长整数值的对象。 BigDecimal(String) 创建一个具有参数所指定以字符串表示的数值的对象。 三、方法描述 add(BigDecimal) BigDecimal对象中的值相加,然后返回这个对象。 subtract(BigDecimal) BigDecimal对象中的值相减,然后返回这个对象。 multiply(BigDecimal) BigDecimal对象中的值相乘,然后返回这个对象。 divide(BigDecimal) BigDecimal对象中的值相除,然后返回这个对象。 toString() 将BigDecimal对象的数值转换成字符串。 doubleValue() 将BigDecimal对象中的值以双精度数返回。 floatValue() 将BigDecimal对象中的值以单精度数返回。 longValue() 将BigDecimal对象中的值以长整数返回。 intValue() 将BigDecimal对象中的值以整数返回。 四、常用方法 4.1、保留两位小数 /** 保留两位小数 */ @org.junit.Test public void formatTest() { double num=13.154215; ` //方式一 DecimalFormat df1 = new DecimalFormat("0.00"); String str = df1.format(num); System.out.println(str); //13.15 //方式二 // #.00 表示两位小数 #.0000四位小数 DecimalFormat df2 =new DecimalFormat("#.00"); String str2 =df2.format(num); System.out.println(str2); //13.15 //方式三 //%.2f %. 表示 小数点前任意位数 2 表示两位小数 格式后的结果为f 表示浮点型 String result = String.format("%.2f", num); System.out.println(result); //13.15 }` String.formate用法详解: ...

2020年3月27日 · 4 分钟 · 天边的星星

Koa2 和 Express 中间件对比

koa2 中间件 koa2的中间件是通过 async await 实现的,中间件执行顺序是“洋葱圈”模型。 中间件之间通过next函数联系,当一个中间件调用 next() 后,会将控制权交给下一个中间件, 直到下一个中间件不再执行 next() 后, 将会沿路折返,将控制权依次交换给前一个中间件。 如图: koa2 中间件实例 app.js: `const Koa = require('koa'); const app = new Koa(); // logger app.use(async (ctx, next) => { console.log('第一层 - 开始') await next(); const rt = ctx.response.get('X-Response-Time'); console.log(`<span class="katex math inline">{ctx.method} -----------</span>{ctx.url} ----------- <span class="katex math inline">{rt}`); console.log('第一层 - 结束') }); // x-response-time app.use(async (ctx, next) => { console.log('第二层 - 开始') const start = Date.now(); await next(); const ms = Date.now() - start; ctx.set('X-Response-Time', `</span>{ms}ms`); console.log('第二层 - 结束') }); // response app.use(async ctx => { console.log('第三层 - 开始') ctx.body = 'Hello World'; console.log('第三层 - 结束') }); app.listen(3000); ` 执行app.js后,浏览器访问 http://localhost:3000/text , 控制台输出结果: ...

2020年3月26日 · 3 分钟 · 天边的星星

nohup不起作用?

刚刚出现了一个奇怪的问题,我执行以下命令 后,程序在后台开始执行,但是当我直接关闭终端后,程序在后台停止执行了。网上查了查,以下方法试了试,成功了 nohup命令执行后,不要直接关闭终端,使用exit命令退出会话 mark下。 如果还是解决不了使用 Screen是一款由GNU计划开发的用于命令行终端切换的自由软件 Screen参考:https://blog.csdn.net/han0373/article/details/81352663 https://www.jianshu.com/p/0702a451dd0c

2020年2月13日 · 1 分钟 · 天边的星星

adb常用命令总结

针对移动端 Android 的测试, adb 命令是很重要的一个点,必须将常用的 adb 命令熟记于心, 将会为 Android 测试带来很大的方便,其中很多命令将会用于自动化测试的脚本当中。 Android Debug Bridge adb 其实就是 Android Debug Bridge, Android 调试桥的缩写,adb 是一个 C/S 架构的命令行工具,用于通过电脑端与模拟器或者真实设备交互。在某些特殊的情况下进入不了系统,adb就派上用场啦!主要由 3 部分组成: · 运行在 PC 端的 Client : 可以通过它对 Android 应用进行安装、卸载及调试 · 运行在 PC 端的 Service : 其管理客户端到 Android 设备上 adb 后台进程的连接 adb 服务启动后,Windows 可以在任务管理器中找到 adb.exe 这个进程 · 运行在 Android 设备上的 adb 后台进程 执行 adb shell ps | grep adbd ,可以找到该后台进程,windows 请使用 findstr 替代 grep ...

2020年2月4日 · 2 分钟 · 天边的星星

Android shape/layer-list实现(渐变阴影)效果

知识点: layer-list : 简单来说layer-list就是图层列表的意思,是用来创建LayerDrawable的,LayerDrawable是DrawableResource的一种,所以,layer-list创建出来的是”图层列表”,也就是一个drawable图形 shape:这个老哥说的挺仔细的(https://www.jianshu.com/p/d97fcdde1fc6) 上效果: image.png 直接在drawable文件夹下面创建文件夹gradual.xml__ `<?xml version="1.0" encoding="utf-8"?> <layer-list xmlns:android="http://schemas.android.com/apk/res/android"> <item> <shape android:shape="rectangle"> <padding android:bottom="3dp" android:left="3dp" android:right="3dp" android:top="3dp" /> <solid android:color="#0DCCCCCC" /> <corners android:radius="10dp" /> </shape> </item> <item> <shape android:shape="rectangle"> <padding android:bottom="3dp" android:left="3dp" android:right="3dp" android:top="3dp" /> <solid android:color="#10CCCCCC" /> <corners android:radius="10dp" /> </shape> </item> <item> <shape android:shape="rectangle"> <padding android:bottom="3dp" android:left="3dp" android:right="3dp" android:top="3dp" /> <solid android:color="#15CCCCCC" /> <corners android:radius="10dp" /> </shape> </item> <item> <shape android:shape="rectangle"> <padding android:bottom="3dp" android:left="3dp" android:right="3dp" android:top="3dp" /> <solid android:color="#20CCCCCC" /> <corners android:radius="10dp" /> </shape> </item> <item> <shape android:shape="rectangle"> <padding android:bottom="3dp" android:left="3dp" android:right="3dp" android:top="3dp" /> <solid android:color="#30CCCCCC" /> <corners android:radius="10dp" /> </shape> </item> <item> <shape> <solid android:color="#FFFFFF" /> <corners android:radius="6dp" /> </shape> </item> </layer-list> ` 在上面代码大概可以理解到,就是用若干个渐浅色的图层叠加在一起,实现渐变的阴影效果,想要效果更好可以把间隔缩小,图层再增加几个就可以了,我觉得上面代码效果就挺好的了,刚好 ...

2020年2月3日 · 1 分钟 · 天边的星星