laravel5日志设置篇(1/3) – 记录开始和结束日志

想要实现的功能

记录Application的开始和结束日志
– 开始日志: URL请求或命令行记录
– 结束日志: 处理时间和内存使用峰值记录

例如:

[2017-10-19 23:06:00] local.INFO: -- Startup {"command":"php artisan list"} 
[2017-10-19 23:06:00] local.INFO: -- Shutdown {"time":"36.955[ms]","memory":"10[mb]"} 
[2017-10-19 23:11:37] local.INFO: -- Startup {"method":"GET","uri":"/v1/stocks"} 
[2017-10-19 23:11:37] local.INFO: -- Shutdown {"time":"21.765[ms]","memory":"4096[kb]"} 

Continue reading

java stream api介绍

简介

Stream API借助前面介绍的java lambda表达式来进行集合数据处理。
下面举些常用的例子来熟悉下。

forEach

stream方法不调用也可以使用forEach

Arrays.asList(new Double[] { 1.0, 2.1, 3.2, 4.3, 5.4 }).forEach(System.out::println);

filter

集合内数据过滤

Arrays.asList(new Double[] { 1.0, 2.1, 3.2, 4.3, 5.4 }).stream().filter(x -> x > 3.0).forEach(System.out::println);

Continue reading

判断是不是iphone x齐刘海屏幕

判断规则

由于iphone x屏幕不是传统的长方形了,而是圆角矩形。如何判断当前的屏幕是长方形还是圆角矩形呢?
可以使用windowssafeAreaInsets方法,当返回值为0时,为长方形,非0时即认为是iphone x.

func isiPhoneXScreen() -> Bool {
        guard #available(iOS 11.0, *) else {
            return false
        }

        return UIApplication.shared.windows[0].safeAreaInsets != UIEdgeInsets.zero
}

Continue reading

Java lambda表达式

lambda表达式

lambda表达式是一种只拥有一个函数式接口的方法的叫法,可以简化封装。

函数式接口

在lisp这样的函数式编辑语言中,可以简单地把函数当作参数传递。在java中,由于函数不是对象,故不能直接当作参数传递。但可以通过函数式接口实现函数传递。

package foo;

public interface Func {
    public double apply(double x);
}

ps. 函数式接口只拥有一个抽象方法的接口
Continue reading

从问题角度来思考设计模式(2) – 结构编

目录

  1. 生成编
  2. 结构编
  3. 行为编

让API返回信息适配多样性

  • 改造前
FooAPI fooAPI = new FooAPI(lat, lng);
FooPlace place = new FooPlace();
place.setAddress(fooAPI.getPostalCode() + " " + fooAPI.getAddress()); // 邮编 **市**区
place.setStation(
    new StringJoiner(",")
    .add(fooAPI.getStation1())
    .add(fooAPI.getStation2())
    .add(fooAPI.getStation3())
    .toString());  //A车站,B车站,C车站

上面代码是API返回信息整形用例。这里只使用了FooAPI,未来如果返回信息的整形方式不变的话,倒也没有什么问题。但从易维护的角度思考,这称不上一个好的设计。
Continue reading

从问题角度来思考设计模式(1) – 生成编

目录

  1. 生成编
  2. 结构编
  3. 行为编

简介

关于设计模式可以理解为,那些经常会遇到的问题以及如何解决所洗练出来的总结。所以我们在考虑进行设计时,首先要做的就是查询当前所面临的问题,是否已经有很好的解决方案,而不是闭门造车。身边有些同事喜欢需求来了,直接上来就撸代码,认为为了迎合设计模式而设计的工作,会有过度设计的嫌疑。什么时候是导入新工具,新技术的最佳时机?当一个事物让人难以忍受的时候,这时改变所带来的团队收益远大于痛苦程度,就可以很平缓地推进。反之,强推工具反而引来的不是技术上的问题,而是人为的抵制。是不是很奇妙!

本文主要通过问题配合设计模式,来说明设计模式所带来的前后效果,加深大家各种模式的印象。

Continue reading

linux删除超过指定天数的文件

场景

现在流行的云服务器自身所附带的硬盘大小是小的,如阿里云是按大小增量收费。不过通常我们也是将程序代码部署到云服务器作为一个应用服务器,也不会将云服务器当成一个文件服务器来用。
这就有一个问题,我们的日志文件,该如何保存。有些访问频繁的接口/页面很快就会将自身的磁盘给填充满。如何解决这种问题,又保证日志文件不丢失?网上一搜就会有很多解决方案。
以前见过有人将日志文件定期同步到dropbox,腾讯的微云网盘号称T级别。题外话了,本文主要介绍,如何删除已经同步过的旧文件。

如何定位旧文件

find ./ -mtime +30 -name "*.gz" | xargs ls -ltrh

上条命令主要功能是查询当前目录下时间超过30天.gz结束所有文件名,并将其信息打印出来。关于find -mtime的详细用法,可以百度下。

Continue reading

类图中的聚合关系(aggregation)和组合关系(composition)比较

前言

在画类图时,空心菱形(聚合关系)和实心菱形(组合关系)两者分别在什么场景下使用?由于两者概念有些相近,相信搞混的人还是存在的。本文通过类图对比来说明两者的根本区别。

X先生的回答

  • 空心菱形代表has - a 即持有/拥有的意思
  • 实心菱形代表part - of 即 ~的一部分的意思

Continue reading