`deb http://mirrors.aliyun.com/ubuntu/ trusty main restricted universe multiverse`
`deb http://mirrors.aliyun.com/ubuntu/ trusty-security main restricted universe multiverse`
`deb http://mirrors.aliyun.com/ubuntu/ trusty-updates main restricted universe multiverse`
`deb http://mirrors.aliyun.com/ubuntu/ trusty-proposed main restricted universe multiverse`
`deb http://mirrors.aliyun.com/ubuntu/ trusty-backports main restricted universe multiverse`
`deb-src http://mirrors.aliyun.com/ubuntu/ trusty main restricted universe multiverse`
`deb-src http://mirrors.aliyun.com/ubuntu/ trusty-security main restricted universe multiverse`
`deb-src http://mirrors.aliyun.com/ubuntu/ trusty-updates main restricted universe multiverse`
`deb-src http://mirrors.aliyun.com/ubuntu/ trusty-proposed main restricted universe multiverse`
`deb-src http://mirrors.aliyun.com/ubuntu/ trusty-backports main restricted universe multiverse`
http://localhost:8080/memberIndex
http://localhost:8080/1.png对应于static/1.png
不要把jsp页面存放在resource下。
注意目录:src/main/webapp/WEB-INF
#添加jsp支持
spring.mvc.view.prefix=/WEB-INF/jsp
spring.mvc.view.suffix=.jsp
<!--用于编译jsp-->
<dependency>
<groupId>org.apache.tomcat.embed</groupId>
<artifactId>tomcat-embed-jasper</artifactId>
</dependency>
</dependencies>
package cn.goingtodo.hello_world_springboot;
import org.springframework.web.bind.annotation.ControllerAdvice;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.ResponseBody;
import java.util.HashMap;
import java.util.Map;
@ControllerAdvice(basePackages = "cn.goingtodo.hello_world_springboot")
public class GlobalExceptionController {
// 返回json,modeAndView返回页面
@ExceptionHandler(RuntimeException.class)
@ResponseBody
public Map<String, Object> errorResult() {
Map<String, Object> errorResultMap = new HashMap<String, Object>();
errorResultMap.put("errorCode", "500");
errorResultMap.put("errorMsg", "系统错误!");
return errorResultMap;
}
}
package cn.goingtodo.hello_world_springboot;
import org.aspectj.lang.JoinPoint;
import org.aspectj.lang.annotation.AfterReturning;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Before;
import org.aspectj.lang.annotation.Pointcut;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Component;
import org.springframework.web.context.request.RequestContextHolder;
import org.springframework.web.context.request.ServletRequestAttributes;
import javax.servlet.http.HttpServletRequest;
import java.util.Enumeration;
@Aspect
@Component
public class WebLogAspect {
private static final Logger logger = LoggerFactory.getLogger(WebLogAspect.class);
@Pointcut("execution (public * cn.goingtodo.hello_world_springboot.*.*(..))")
public void webLog() {
}
@Before("webLog()")
public void doBefore(JoinPoint joinPoint) throws Throwable {
// 接收到请求,记录请求内容,多半存储到nosql数据库
ServletRequestAttributes attributes = (ServletRequestAttributes) RequestContextHolder.getRequestAttributes();
HttpServletRequest request = attributes.getRequest();
// 记录下请求内容
logger.info("URL : " + request.getRequestURL().toString());
logger.info("HTTP_METHOD : " + request.getMethod());
logger.info("IP : " + request.getRemoteAddr());
Enumeration<String> enu = request.getParameterNames();
while (enu.hasMoreElements()) {
String name = (String) enu.nextElement();
logger.info("name:{},value:{}", name, request.getParameter(name));
}
//传统写磁盘有很大缺点,分布式情况服务器集群,20台服务器,日志存在各个server上,无法顺畅查看
//分布式日志收集
}
@AfterReturning(returning = "ret", pointcut = "webLog()")
public void doAfterReturning (Object ret) throws Throwable {
// 处理完请求,返回内容
logger.info("RESPONSE : " + ret);
}
}
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-log4j</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-aop</artifactId>
</dependency>
### 设置###
log4j.rootLogger=debug,stdout,D,E,I
### 输出信息到控制抬 ###
log4j.appender.stdout=org.apache.log4j.ConsoleAppender
log4j.appender.stdout.Target=System.out
log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
log4j.appender.stdout.layout.ConversionPattern=[%-5p] %d{yyyy-MM-dd HH:mm:ss,SSS} method:%l%n%m%n
### 输出DEBUG 级别以上的日志到=E://logs/error.log ###
log4j.appender.D=org.apache.log4j.DailyRollingFileAppender
log4j.appender.D.File=./log.log
log4j.appender.D.Append=true
log4j.appender.D.Threshold=DEBUG
log4j.appender.D.layout=org.apache.log4j.PatternLayout
log4j.appender.D.layout.ConversionPattern=%-d{yyyy-MM-dd HH:mm:ss} [ %t:%r ] - [ %p ] %m%n
### 输出ERROR 级别以上的日志到=E://logs/error.log ###
log4j.appender.E=org.apache.log4j.DailyRollingFileAppender
log4j.appender.E.File=./error.log
log4j.appender.E.Append=true
log4j.appender.E.Threshold=ERROR
log4j.appender.E.layout=org.apache.log4j.PatternLayout
log4j.appender.E.layout.ConversionPattern=%-d{yyyy-MM-dd HH:mm:ss} [ %t:%r ] - [ %p ] %m%n
### 输出INFO 级别以上的日志到=E://logs/error.log ###
log4j.appender.I=org.apache.log4j.DailyRollingFileAppender
log4j.appender.I.File=./info.log
log4j.appender.I.Append=true
log4j.appender.I.Threshold=INFO
log4j.appender.I.layout=org.apache.log4j.PatternLayout
log4j.appender.I.layout.ConversionPattern=%-d{yyyy-MM-dd HH:mm:ss} [ %t:%r ] - [ %p ] %m%n
package cn.goingtodo.hello_world_springboot.entity;
import lombok.Data;
import lombok.extern.slf4j.Slf4j;
@Slf4j//添加日志
@Data
public class User {
private String name;
private Integer age;
//lombok 底层使用字节码技术ASM修改字节码文件,生成get和set方法
public static void main(String[] args){
User user=new User();
user.setAge(36);
user.setName("livingbody");
log.info(user.toString());
}
}
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<optional>true</optional>
</dependency>
最终编译时,还是生成get/set方法。生产环境就不用lombok插件了,因为已经编译了。
//SpringBootApplication等同于扫同级包和子包
@EnableAsync//开启异步调用
@SpringBootApplication
public class HelloWorldSpringbootApplication {
public static void main(String[] args) {
SpringApplication.run(HelloWorldSpringbootApplication.class, args);
}
}
package cn.goingtodo.hello_world_springboot.service;
import lombok.extern.slf4j.Slf4j;
import org.springframework.scheduling.annotation.Async;
import org.springframework.stereotype.Service;
@Service
@Slf4j
public class MemberService {
// 添加用户时发送邮件
@Async //相当于这个方法是单独的线程在执行
public String addMemberAndEmail() {
log.info("******2...send user email");
try{
Thread.sleep(5000);
}catch (Exception e){
}
log.info("******3 ...line");
return "send Email Success";
}
}
#添加jsp支持
spring.mvc.view.prefix=/WEB-INF/jsp/
spring.mvc.view.suffix=.jsp
name= livingbody
package cn.goingtodo.hello_world_springboot;
import cn.goingtodo.hello_world_springboot.service.MemberService;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
//演示异步调用
@Slf4j
//@RestController表示该类的所有方法返回json格式
@RestController
public class MemberController {
@Autowired
private MemberService memberService;
@Value("${name}")
private String name;
@RequestMapping("/getName")
public String getName() {
return this.name;
}
@RequestMapping("/memberIndex")
public String memberIndex() {
return "Hello World,springboot2.1.3全新教程";
}
@RequestMapping("/addMemberAndEmail")
public String addMemberAndEmail() {
log.info("1...line.");
String result = memberService.addMemberAndEmail();
log.info("***...4...line..");
return result;
}
}
1.本地开发环境dev
2.测试环境 test
3.预生产环境 pre
4.生产环境prd
5.分布式配置中心—动态获取配置文件中心
spring.profiles.active=dev
application.properties
application-dev.properties
application-test.properties
application-prd.properties
...
install-info: No dir file specified; try --help for more information.dpkg:处理 gettext (--configure)时出错: 子进程 post-installation script 返回了错误号 1 在处理时有错误发生:
findutils
E: Sub-process /usr/bin/dpkg returned an error code (1)
1.$ sudo mv /var/lib/dpkg/info /var/lib/dpkg/info_old //现将info文件夹更名
2.$ sudo mkdir /var/lib/dpkg/info //再新建一个新的info文件夹
3.$ sudo apt-get update,再$sudoapt-get -f install //不用解释了吧
4.$ sudo mv /var/lib/dpkg/info/* /var/lib/dpkg/info_old //执行完上一步操作后会在新的info文件夹下生成一些文件,现将这些文件全部移到info_old文件夹下
5.$ sudo rm -rf /var/lib/dpkg/info //把自己新建的info文件夹删掉
6.$ sudo mv /var/lib/dpkg/info_old /var/lib/dpkg/info //把以前的info文件夹重新改回名字
到此问题顺利解决
curl -fsSL https://get.docker.com | bash -s docker --mirror Aliyun
针对Docker客户端版本大于 1.10.0 的用户
您可以通过修改daemon配置文件/etc/docker/daemon.json来使用加速器
sudo mkdir -p /etc/docker
sudo tee /etc/docker/daemon.json <<-'EOF'
{
"registry-mirrors": ["https://3uodgmj9.mirror.aliyuncs.com"]
}
EOF
sudo systemctl daemon-reload
sudo systemctl restart docker
https://3uodgmj9.mirror.aliyuncs.com
docker pull tensorflow/tensorflow # latest stable release
docker pull tensorflow/tensorflow:nightly-devel-gpu # nightly dev release w/ GPU support
docker run [-it] [--rm] [-p hostPort:containerPort] tensorflow/tensorflow[:tag] [command]
docker run -it --rm tensorflow/tensorflow \
python -c "import tensorflow as tf; tf.enable_eager_execution(); print(tf.reduce_sum(tf.random_normal([1000, 1000])))"
docker run -it --rm -v $PWD:/tmp -w /tmp tensorflow/tensorflow python ./script.py
6.
VMware Workstation 与 Device/Credential Guard 不兼容。在禁用 Device/Credential Guard 后,可以运行 VMware Workstation。有关更多详细信息,请访问 http://www.vmware.com/go/turnoff_CG_DG。
主要是win的虚拟机和vmware起冲突了
禁用服务即可:
bcdedit /set hypervisorlaunchtype off
重启win主机,即可使用。
from bs4 import BeautifulSoup;
import requests;
import pymysql
import re
info = []
titles = []
imgs = []
contents = []
rates = []
persons = []
url = 'https://movie.douban.com/chart'
f = requests.get(url)
soup = BeautifulSoup(f.content, 'lxml')
for k in soup.find_all('div', class_='pl2'): # ,找到div并且class为pl2的标签
a = k.find('span') # 在每个对应div标签下找span标签,会发现,一个a里面有四组span
titles.append(a.string)
for i in soup.find_all('img', attrs={'width': '75'}):
imgs.append(i['src'])
for c in soup.find_all('p', class_='pl'):
contents.append(c.string)
for r in soup.find_all('span', class_='rating_nums'):
rates.append(r.string)
for p in soup.find_all('span', class_='pl'):
pp = totalCount = re.sub("\D", "", p.string.replace("(", "").replace(")", ""))
persons.append(pp)
db = pymysql.connect("localhost", "root", "root", "finddouban")
cursor = db.cursor()
for title, img, content, rate, person in zip(titles, imgs, contents, rates, persons):
data = {
'title': title,
'img': img,
'content': content,
'rate': rate,
'person': person
}
info.append(data)
print(data)
cursor.execute('INSERT INTO moive(title,content,) VALUES (%s, %s )', (title, pymysql.escape_string(content)))
# cursor.execute('INSERT INTO moive(title,img,content,rate,person) VALUES (%s, %s, %s, %f, %d )',
# (title, pymysql.escape_string(img), pymysql.escape_string(content), float(rate), int(person)))
db.commit()
db.close()
C:\Users\livingbody\PycharmProjects\run\venv\Scripts\python.exe C:/Users/livingbody/PycharmProjects/run/src/getdoubanfilm.py
Traceback (most recent call last):
{'title': 'Dear EX', 'img': 'https://img3.doubanio.com/view/photo/s_ratio_poster/public/p2546961193.jpg', 'content': '2018-04-22(乌迪内远东电影节) / 2018-11-02(台湾) / 邱泽 / 谢盈萱 / 陈如山 / 黄圣球 / 周洺甫 / 梁正群 / 杨丽音 / 安哲 / 高隽雅 / 吴定谦 / 禾语辰 / 钟欣凌 / 万芳 / 高爱伦 / 台湾 / 徐誉庭 / 许智彦 / 100分钟 / 谁先爱上他的 / 剧情 / 喜剧...', 'rate': '8.6', 'person': '100795'}
File "C:/Users/livingbody/PycharmProjects/run/src/getdoubanfilm.py", line 56, in <module>
cursor.execute('INSERT INTO moive(title,content,) VALUES (%s, %s )', (title, pymysql.escape_string(content)))
File "C:\Users\livingbody\PycharmProjects\run\venv\lib\site-packages\pymysql\cursors.py", line 170, in execute
result = self._query(query)
File "C:\Users\livingbody\PycharmProjects\run\venv\lib\site-packages\pymysql\cursors.py", line 328, in _query
conn.query(q)
File "C:\Users\livingbody\PycharmProjects\run\venv\lib\site-packages\pymysql\connections.py", line 517, in query
self._affected_rows = self._read_query_result(unbuffered=unbuffered)
File "C:\Users\livingbody\PycharmProjects\run\venv\lib\site-packages\pymysql\connections.py", line 732, in _read_query_result
result.read()
File "C:\Users\livingbody\PycharmProjects\run\venv\lib\site-packages\pymysql\connections.py", line 1075, in read
first_packet = self.connection._read_packet()
File "C:\Users\livingbody\PycharmProjects\run\venv\lib\site-packages\pymysql\connections.py", line 684, in _read_packet
packet.check_error()
File "C:\Users\livingbody\PycharmProjects\run\venv\lib\site-packages\pymysql\protocol.py", line 220, in check_error
err.raise_mysql_exception(self._data)
File "C:\Users\livingbody\PycharmProjects\run\venv\lib\site-packages\pymysql\err.py", line 109, in raise_mysql_exception
raise errorclass(errno, errval)
pymysql.err.ProgrammingError: (1064, "You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near ') VALUES ('Dear EX', '2018-04-22(乌迪内远东电影节) / 2018-11-02(台湾) ' at line 1")
Process finished with exit code 1