最近在docker下跑python的定时任务,
apscheduler使用uWSGI的mule模块部署的时候报错,
因为系统时区和代码运行时区不一样导致。
解决办法:在初始化的时候指定上海的时区
scheduler = BlockingScheduler(timezone="Asia/Shanghai")
最近在docker下跑python的定时任务,
apscheduler使用uWSGI的mule模块部署的时候报错,
因为系统时区和代码运行时区不一样导致。
解决办法:在初始化的时候指定上海的时区
scheduler = BlockingScheduler(timezone="Asia/Shanghai")
《黄帝内经》记载:“春三月,此谓发陈,天地俱生,万物以荣。
”立春时节,在饮食上则应以补阳气为主。
而酸、涩、生冷、油腻之食物此时应尽量少吃。
晚睡早起,切忌放纵民间有“立春雨水到,早起晚睡觉”的民谣。立春以后,天气转暖,阳气回升,万物生发。“晚睡早起”是一种比较科学且顺势而为的养生法,可防止人体受到春天气息的震荡,给人体一个生发机会。
立春时节睡眠最好的时间是晚上11点到早晨6点。
温馨提示:立春时节,万物萌生,人体的性腺也进入活跃期。性腺可以分泌激素,使人感觉精力充沛,同时容易使人产生性冲动。立春时节如果不对性欲进行节制,则会耗气伤精,损伤阳气,严重还会导致阳痿。
散步慢跑,踏青防花粉过敏
立春日出之后,日落之时是散步健身的大好时光,散步地点可选择河边湖旁、公园、林荫道、乡村小路为好,因为这些地方空气中负离子含量较高,空气清新。
散步途中建议采取全身活动,如合擦双手、按摩胸腹、捶打腰背、拍打全身等,有利于活血化瘀、通气血、生发阳气。
中年和年轻人适合快步,每分钟120步为宜;
病后康复期或体力缺乏者适合逍遥步,且走且停,时快时慢。
慢跑是一项简单而实用的运动项目,对改善心肺功能、降低血脂、提高新陈代谢能力和增强机体免疫力、延缓衰老都有较好的作用。同时,慢跑还有助于调节大脑皮质的兴奋和抑制,促进胃肠蠕动,增强消化功能,消除便秘。
立春时节,踏青也是一项外出郊游、放松心情的最好时光,但是要避免出现季节性过敏症状,如花粉过敏、柳絮过敏等。
Caused by: java.lang.IncompatibleClassChangeError: class org.bouncycastle.asn1.DERObject has interface org.bouncycastle.asn1.ASN1Encodable as super class
solution:
找到jdk的安装目录,查找jdk1.8->jre->lib->ext,看下面是不是有个类似这样的bcpro-ext-jdk15.jar,(和bouncycastle相关的),删掉再重启idea就好了
1.application.xml
<?xml version="1.0" encoding="utf-8"?>
<application xmlns="http://ns.adobe.com/air/application/28.0">
<id>air.sms</id>
<versionNumber>0.1</versionNumber>
<supportedProfiles>mobileDevice</supportedProfiles>
<filename>sms</filename>
<name>sms</name>
<android>
<manifestAdditions><![CDATA[<manifest android:installLocation="auto">
<uses-permission android:name="android.permission.READ_SMS" />
<uses-permission android:name="android.permission.RECEIVE_SMS" />
<uses-permission android:name="android.permission.READ_PROFILE" />
<uses-permission android:name="android.permission.READ_LOGS" />
<uses-permission android:name="android.permission.READ_CONTACTS" />
<uses-permission android:name="android.permission.SEND_SMS" />
<uses-sdk android:minSdkVersion="8" />
<uses-permission android:name="android.permission.INTERNET" />
<uses-feature android:required="true" android:name="android.hardware.touchscreen.multitouch" />
</manifest>]]></manifestAdditions>
</android>
<iPhone>
<InfoAdditions><![CDATA[<key>UIStatusBarStyle</key>
<string>UIStatusBarStyleBlackOpaque</string>
<key>UIRequiresPersistentWiFi</key>
<string>NO</string>
<key>UIApplicationExitsOnSuspend</key>
<true />
<key>UIDeviceFamily</key>
<array>
<string>1</string>
</array>]]></InfoAdditions>
<requestedDisplayResolution>high</requestedDisplayResolution>
</iPhone>
<initialWindow>
<title>sms</title>
<content>sms.swf</content>
<visible>true</visible>
<fullScreen>true</fullScreen>
<!--<autoOrients>false</autoOrients>-->
<!--<aspectRatio>landscape</aspectRatio>-->
<renderMode>direct</renderMode>
<!--<depthAndStencil>true</depthAndStencil>-->
<!-- required for 3D -->
<systemChrome>standard</systemChrome>
</initialWindow>
<icon>
<image48x48>icons/icon_48.png</image48x48>
<image57x57>icons/icon_57.png</image57x57>
<image72x72>icons/icon_72.png</image72x72>
<image76x76>icons/icon_76.png</image76x76>
<image96x96>icons/icon_96.png</image96x96>
<image114x114>icons/icon_114.png</image114x114>
<image120x120>icons/icon_120.png</image120x120>
<image144x144>icons/icon_144.png</image144x144>
<image152x152>icons/icon_152.png</image152x152>
<!--<image512x512>icons/icon_512.png</image512x512>-->
</icon>
<!--
AIR options:
http://livedocs.adobe.com/flex/3/html/File_formats_1.html#1043413
AIR mobile options:
http://help.adobe.com/en_US/air/build/WSfffb011ac560372f-5d0f4f25128cc9cd0cb-7ffe.html
iOS icons guidelines:
http://developer.apple.com/library/ios/#documentation/userexperience/conceptual/mobilehig/IconsImages/IconsImages.html
Android manifest documentation:
http://developer.android.com/guide/topics/manifest/manifest-intro.html
-->
<extensions>
<extensionID>com.techmx.ext.MobileUtil</extensionID>
</extensions>
</application>
2.Package.bat
call adt -package -target %TYPE%%TARGET% %OPTIONS% %SIGNING_OPTIONS% "%OUTPUT%" "%APP_XML%" %FILE_OR_DIR% -extdir lib/
3.RunApp.bat
:target
::goto desktop
goto android-debug
Swagger2 是传说中的api文档管理利器,我们一起来学习下如何在sb2中集成swagger2
依赖选择Web、LomBok 依赖,(JPA 和 Mysql)可选,系统自动生成的 Pom文件中没有swagger相关的配置,所以需要手动加入:
<dependency>
<groupId>io.springfox</groupId>
<artifactId>springfox-swagger2</artifactId>
<version>2.4.0</version>
</dependency>
<dependency>
<groupId>io.springfox</groupId>
<artifactId>springfox-swagger-ui</artifactId>
<version>2.4.0</version>
</dependency>
有时候还需要加入maven-surefire-plugin,防test报错
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-surefire-plugin</artifactId>
<version>2.22.1</version>
<configuration>
<skipTests>true</skipTests>
</configuration>
</plugin>
最后的pom文件长成这样:
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.4.2</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
<groupId>com.study</groupId>
<artifactId>sb4</artifactId>
<version>0.0.1-SNAPSHOT</version>
<name>sb4</name>
<description>Demo project for Spring Boot</description>
<properties>
<java.version>1.8</java.version>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-jpa</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<scope>runtime</scope>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<optional>true</optional>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
<dependency>
<groupId>io.springfox</groupId>
<artifactId>springfox-swagger2</artifactId>
<version>2.4.0</version>
</dependency>
<dependency>
<groupId>io.springfox</groupId>
<artifactId>springfox-swagger-ui</artifactId>
<version>2.4.0</version>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<configuration>
<excludes>
<exclude>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
</exclude>
</excludes>
</configuration>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-surefire-plugin</artifactId>
<version>2.22.1</version>
<configuration>
<skipTests>true</skipTests>
</configuration>
</plugin>
</plugins>
</build>
</project>
如果选了jpa和mysql,那么要在application.properties上加上如下配置:
spring.datasource.url=jdbc:mysql://localhost:3306/test
spring.datasource.username=yourname
spring.datasource.password=yourcode
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
注意 Swagger2 配置类必须与项目入口类 Application 位于同一级目录,否则生成 Api 文档失败,代码如下:
package com.study.sb4;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import springfox.documentation.builders.ApiInfoBuilder;
import springfox.documentation.builders.PathSelectors;
import springfox.documentation.builders.RequestHandlerSelectors;
import springfox.documentation.service.ApiInfo;
import springfox.documentation.service.Contact;
import springfox.documentation.spi.DocumentationType;
import springfox.documentation.spring.web.plugins.Docket;
import springfox.documentation.swagger2.annotations.EnableSwagger2;
//Swagger 配置类
@Configuration
// 启用 Swagger2
@EnableSwagger2
public class Swagger2 {
@Bean
public Docket createRestApi() {
return new Docket(DocumentationType.SWAGGER_2)
// 文档信息对象
.apiInfo(apiInfo())
.select()
// 被注解的包路径
.apis(RequestHandlerSelectors.basePackage("com.study.sb4.controller"))
.paths(PathSelectors.any())
.build();
}
private ApiInfo apiInfo() {
return new ApiInfoBuilder()
// 标题
.title("springboot 利用 swagger 构建 API 文档")
// Api 文档描述
.description("简单优雅的 restful 风格,https://amyflash.com")
.termsOfServiceUrl("https://blog.csdn.net/turodog/")
// 文档作者信息
.contact(new Contact("harriet", "https://github.com/amyflash", "nbllq@qq.com"))
// 文档版本
.version("1.0")
.build();
}
}
编写各个接口的请求参数,返回结果,接口描述等等,代码如下:
package com.study.sb4.controller;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiImplicitParam;
import io.swagger.annotations.ApiImplicitParams;
import io.swagger.annotations.ApiOperation;
import org.springframework.web.bind.annotation.*;
import springfox.documentation.annotations.ApiIgnore;
@RestController
@RequestMapping("/test")
// @Api:修饰整个类,描述Controller的作用
@Api("TestController Api 接口文档")
public class TestController {
// 使用该注解忽略这个API
@ApiIgnore
@RequestMapping(value = "/hi", method = RequestMethod.GET)
public String jsonTest() {
return " hi you!";
}
// @ApiOperation:描述一个类的一个方法,或者说一个接口
@ApiOperation(value="无参get", notes="获取test")
@RequestMapping(value={""}, method= RequestMethod.GET)
public String getTest() {
return "test get without param";
}
@ApiOperation(value="带参get", notes="根据id来获取test详细信息")
@ApiImplicitParam(name = "id", value = "ID", required = true, dataType = "Integer",paramType = "path")
@GetMapping("/{id}")
public String findById(@PathVariable("id") Integer id){
return "this is get id:"+id;
}
@ApiOperation(value="post一个参数", notes="postxx信息")
// @ApiImplicitParam:一个请求参数
@ApiImplicitParam(name = "param", value = "param", required = true, dataType = "String")
//发送post请求
@PostMapping("/p1")
public String postTest1(@RequestBody String param){
return "this is post one param :"+param;
}
/*@ApiOperation(value="删除学生", notes="根据url的id来指定删除的学生")
@ApiImplicitParam(name = "id", value = "学生ID", required = true, dataType = "Integer",paramType = "path")
@DeleteMapping("/{id}")
public String deleteById(@PathVariable("id") Integer id){
studentService.delete(id);
return "success";
}*/
/* @ApiOperation(value="更新学生信息", notes="根据url的id来指定更新学生信息")
// @ApiImplicitParams:多个请求参数
@ApiImplicitParams({
@ApiImplicitParam(name = "id", value = "学生ID", required = true, dataType = "Integer",paramType = "path"),
@ApiImplicitParam(name = "student", value = "学生实体student", required = true, dataType = "Student")
})
@PutMapping(value="/{id}")
public String updateStudent(@PathVariable Integer id, @RequestBody Student student) {
Student oldStudent = this.findById(id);
oldStudent.setId(student.getId());
oldStudent.setName(student.getName());
oldStudent.setAge(student.getAge());
studentService.save(oldStudent);
return "success";
}*/
}
访问 http://localhost:8080/swagger-ui.html 地址,api文档就自动写好啦,nb得一塌糊涂,有没有!
LomBok 是什么?
LomBok 是一个插件,它能通过注解帮我们消除那些必须要写但是重复的代码,比如setter,getter,构造函数之类的方法。
试想一个场景,在项目开发中,我们往往需要定义大量的数据库实体或者某些工具 Bean ,每一个 Bean 都需要我们编写 getter 、setter 方法、构造方法以及 toString 等方法。这是一个非常繁琐的过程。程序员准则,做三遍以上的重复事情就必须想办法让它自动化了。所以今天给你们介绍一个牛逼的插件「LomBok」。
LomBok 常用注解简介
@Data:注解在类上,将类提供的所有属性都添加get、set方法,并添加、equals、canEquals、hashCode、toString方法
@Setter:注解在类上,为所有属性添加set方法、注解在属性上为该属性提供set方法
@Getter:注解在类上,为所有的属性添加get方法、注解在属性上为该属性提供get方法
@NotNull:在参数中使用时,如果调用时传了null值,就会抛出空指针异常
@Synchronized 用于方法,可以锁定指定的对象,如果不指定,则默认创建一个对象锁定
@Log作用于类,创建一个log属性
@Builder:使用builder模式创建对象
@NoArgsConstructor:创建一个无参构造函数
@AllArgsConstructor:创建一个全参构造函数
@ToStirng:创建一个toString方法
@Accessors(chain = true)使用链式设置属性,set方法返回的是this对象。
@RequiredArgsConstructor:创建对象
@UtilityClass:工具类
@ExtensionMethod:设置父类
@FieldDefaults:设置属性的使用范围,如private、public等,也可以设置属性是否被final修饰。
@Cleanup: 关闭流、连接点。
@EqualsAndHashCode:重写equals和hashcode方法。
@toString:创建toString方法。
如何安装?
直接从 http://plugins.jetbrains.com/ 下载,然后放到IDEA 安装文件下面的 plugins,然后重启 IDEA。
写个代码来测试一下:
package com.study.sb2lombok.mycode;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
@Data //自动生成set/get方法,toString方法,equals方法,hashCode方法,不带参数的构造方法
@AllArgsConstructor //自动生成构造方法
@NoArgsConstructor //自动生成构造方法
public class Testlombok {
private String url="amyflash.com";
}
package com.study.sb2lombok.controller;
import com.study.sb2lombok.mycode.Testlombok;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
@RestController
@RequestMapping("/test")
public class Test {
@GetMapping("/testLombok")
public Testlombok g1etUrl(){
Testlombok dd = new Testlombok();
// student.setUrl("6666666666");
System.out.println(dd.toString());
return dd;
}
}
访问:localhost:8080/test/testLombok
https://github.com/star7th/showdoc
设置centos环境变量,可以用export命令,也可以通过修改文件形式实现,本文以lavavel需要设置环境变量为例,将 /root/.config/composer/vendor/bin 路径加到 PATH
一、临时生效
export PATH=$PATH:/root/.config/composer/vendor/bin
1
使用 export 设置的变量,只对当前终端 Shell 有效,也就是说如果新打开一个终端,那这个 export 设置的变量在新终端中是无法读取到的。适合设置一些临时变量。
二、通过修改配置文件
首先是设置全局环境变量,对所有用户都会生效:
1、/etc/profile: 此文件为系统的每个用户设置环境信息。当用户登录时,该文件被执行一次,并从 /etc/profile.d 目录的配置文件中搜集shell 的设置。一般用于设置所有用户使用的全局变量。
2、/etc/bashrc: 当 bash shell 被打开时,该文件被读取。也就是说,每次新打开一个终端 shell,该文件就会被读取。
对单个用户生效:
1、~/.bash_profile 或 ~/.profile: 只对单个用户生效,当用户登录时该文件仅执行一次。用户可使用该文件添加自己使用的 shell 变量信息。另外在不同的LINUX操作系统下,这个文件可能是不同的,可能是 ~/.bash_profile, ~/.bash_login 或 ~/.profile 其中的一种或几种,如果存在几种的话,那么执行的顺序便是:~/.bash_profile、 ~/.bash_login、 ~/.profile。比如 Ubuntu 系统一般是 ~/.profile 文件。
2、~/.bashrc: 只对单个用户生效,当登录以及每次打开新的 shell 时,该文件被读取。
此外,修改 /etc/environment 这个文件也能实现环境变量的设置。
/etc/environment是设置整个系统的环境,而/etc/profile是设置所有用户的环境,前者与登录用户无关,后者与登录用户有关。
注:系统是先执行/etc/environment,再执行/etc/profile
以修改/etc/profile 为例:
PATH=”$PATH:/root/.config/composer/vendor/bin”
export PATH
1
2
执行
source /etc/profile
1
使其立即生效。
如果想多加个路径yourpath1,在将“:yourpath1” 加载path后面,如:
PATH=”$PATH:/root/.config/composer/vendor/bin:yourpath1”
163yum源:
1)备份当前yum源防止出现意外还可以还原回来
cd /etc/yum.repos.d/
cp /CentOS-Base.repo /CentOS-Base-repo.bak
2)使用wget下载163yum源repo文件
wget http://mirrors.163.com/.help/CentOS7-Base-163.repo
3) 清理旧包
yum clean all
4)把下载下来163repo文件设置成为默认源
mv CentOS7-Base-163.repo CentOS-Base.repo
5)生成163yum源缓存并更新yum源
yum makecache
yum update
阿里云yum源:
1)备份当前yum源防止出现意外还可以还原回来
cd /etc/yum.repos.d/
cp /CentOS-Base.repo /CentOS-Base-repo.bak
2)使用wget下载阿里yum源repo文件
wget http://mirrors.aliyun.com/repo/Centos-7.repo
3) 清理旧包
yum clean all
4)把下载下来阿里云repo文件设置成为默认源
mv Centos-7.repo CentOS-Base.repo
5)生成阿里云yum源缓存并更新yum源
yum makecache
yum update