diff --git a/java/SpringBoot-JPA/pom.xml b/java/SpringBoot-JPA/pom.xml
index 514ef22..ab989b7 100644
--- a/java/SpringBoot-JPA/pom.xml
+++ b/java/SpringBoot-JPA/pom.xml
@@ -27,9 +27,9 @@
test
- mysql
- mysql-connector-java
-
+ mysql
+ mysql-connector-java
+
1.8
diff --git a/java/TMD/.vim/source b/java/TMD/.vim/source
new file mode 100644
index 0000000..981bcd1
--- /dev/null
+++ b/java/TMD/.vim/source
@@ -0,0 +1,8 @@
+
+src/main/java/com/wxnacy/spring/Application.java
+src/main/java/com/wxnacy/spring/UserController.java
+src/main/java/com/wxnacy/spring/UserRepository.java
+src/main/java/com/wxnacy/spring/bean/Screen.java
+src/main/java/com/wxnacy/spring/bean/User.java
+src/main/java/com/wxnacy/spring/controller/ScreenController.java
+src/main/java/com/wxnacy/spring/repository/ScreenRepository.java
diff --git a/java/TMD/TMD.iml b/java/TMD/TMD.iml
new file mode 100644
index 0000000..c07297e
--- /dev/null
+++ b/java/TMD/TMD.iml
@@ -0,0 +1,85 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/java/TMD/pom.xml b/java/TMD/pom.xml
new file mode 100644
index 0000000..b08df2d
--- /dev/null
+++ b/java/TMD/pom.xml
@@ -0,0 +1,57 @@
+
+ 4.0.0
+ com.wxnacy.spring
+ TMD
+ jar
+ 1.0-SNAPSHOT
+ TMD
+ http://maven.apache.org
+
+ org.springframework.boot
+ spring-boot-starter-parent
+ 1.5.9.RELEASE
+
+
+
+ org.springframework.boot
+ spring-boot-starter-data-jpa
+
+
+ org.springframework.boot
+ spring-boot-starter-web
+
+
+ org.springframework.boot
+ spring-boot-starter-test
+ test
+
+
+ org.springframework.boot
+ spring-boot-devtools
+ true
+
+
+ mysql
+ mysql-connector-java
+
+
+
+ 1.8
+
+
+
+
+ org.springframework.boot
+ spring-boot-maven-plugin
+
+
+
+
+
+
+
+
+
+
+
diff --git a/java/TMD/src/main/java/com/wxnacy/spring/Application.java b/java/TMD/src/main/java/com/wxnacy/spring/Application.java
new file mode 100644
index 0000000..31fe7e1
--- /dev/null
+++ b/java/TMD/src/main/java/com/wxnacy/spring/Application.java
@@ -0,0 +1,18 @@
+package com.wxnacy.spring;
+
+import java.util.Arrays;
+
+import org.springframework.boot.CommandLineRunner;
+import org.springframework.boot.SpringApplication;
+import org.springframework.boot.autoconfigure.SpringBootApplication;
+import org.springframework.context.ApplicationContext;
+import org.springframework.context.annotation.Bean;
+
+@SpringBootApplication
+public class Application {
+
+ public static void main(String[] args) {
+ SpringApplication.run(Application.class, args);
+ }
+
+}
diff --git a/java/TMD/src/main/java/com/wxnacy/spring/UserController.java b/java/TMD/src/main/java/com/wxnacy/spring/UserController.java
new file mode 100644
index 0000000..dc86ea8
--- /dev/null
+++ b/java/TMD/src/main/java/com/wxnacy/spring/UserController.java
@@ -0,0 +1,72 @@
+package com.wxnacy.spring;
+
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Map;
+
+import org.springframework.beans.factory.annotation.Autowired;
+
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.PathVariable;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.RequestBody;
+import org.springframework.web.bind.annotation.RequestParam;
+import org.springframework.web.bind.annotation.RestController;
+
+@RestController
+public class UserController {
+
+ @Autowired
+ private UserRepository userRepository;
+
+ @GetMapping("/user")
+ public List users(
+ @RequestParam(required=false, defaultValue="wxnacy") String name
+ ) {
+ List res = userRepository.findByName(name);
+ return res;
+ }
+
+ @GetMapping("/user/{id}")
+ public User user(
+ @PathVariable Integer id
+ ) {
+ User user = userRepository.findById(id);
+ return user;
+ }
+
+ @PostMapping("/user")
+ public User create(
+ @RequestBody Map body
+ ) {
+ User user = new User(body.get("name"));
+ System.out.println(user.getId());
+ User item = userRepository.save(user);
+ System.out.println(item.getId());
+ item = userRepository.save(user);
+ System.out.println(item.getId());
+ item = userRepository.saveAndFlush(user);
+ System.out.println(item.getId());
+
+ List users = new ArrayList();
+ users.add(new User("haah"));
+ users.add(new User("ssss"));
+ // List items = userRepository::save(users);
+ // for(int i = 0; i < items.size(); i++){
+ // System.out.println(items.get(i).getId());
+
+ // }
+
+ new Thread(new Runnable() {
+ @Override
+ public void run() {
+ System.out.println("Before Java8, too much code for too little to do");
+ }
+ }).start();
+
+ new Thread( () -> System.out.println("In Java8, Lambda expression rocks !!") ).start();
+
+
+ return item;
+ }
+}
diff --git a/java/TMD/src/main/java/com/wxnacy/spring/UserRepository.java b/java/TMD/src/main/java/com/wxnacy/spring/UserRepository.java
new file mode 100644
index 0000000..28676a9
--- /dev/null
+++ b/java/TMD/src/main/java/com/wxnacy/spring/UserRepository.java
@@ -0,0 +1,9 @@
+package com.wxnacy.spring;
+
+import java.util.List;
+import org.springframework.data.jpa.repository.JpaRepository;
+
+public interface UserRepository extends JpaRepository {
+ List findByName(String name);
+ User findById(Integer id);
+}
diff --git a/java/TMD/src/main/java/com/wxnacy/spring/bean/Screen.java b/java/TMD/src/main/java/com/wxnacy/spring/bean/Screen.java
new file mode 100644
index 0000000..d97b688
--- /dev/null
+++ b/java/TMD/src/main/java/com/wxnacy/spring/bean/Screen.java
@@ -0,0 +1,84 @@
+package com.wxnacy.spring.bean;
+
+import javax.persistence.CascadeType;
+import javax.persistence.Entity;
+import javax.persistence.GeneratedValue;
+import javax.persistence.GenerationType;
+import javax.persistence.Id;
+import javax.persistence.ManyToOne;
+import javax.persistence.JoinColumn;
+
+@Entity
+public class Screen{
+ @Id
+ @GeneratedValue()
+ private Long id;
+ private String code;
+ private String name;
+ private Long shopId;
+ private Shop shop;
+ private String brand;
+ private String mac;
+
+
+ public Screen() {
+ }
+
+ public void setId(Long id) {
+ this.id = id;
+ }
+
+ public Long getId() {
+ return id;
+ }
+
+ public void setCode(String code) {
+ this.code = code;
+ }
+
+ public String getCode() {
+ return code;
+ }
+
+ public void setName(String name) {
+ this.name = name;
+ }
+
+ public String getName() {
+ return name;
+ }
+
+ public void setShopId(Long shopId) {
+ this.shopId = shopId;
+ }
+
+ public Long getShopId() {
+ return shopId;
+ }
+
+ public void setMac(String mac) {
+ this.mac = mac;
+ }
+
+ public String getMac() {
+ return mac;
+ }
+
+ public void setBrand(String brand) {
+ this.brand = brand;
+ }
+
+ @ManyToOne(cascade = {CascadeType.MERGE,CascadeType.REFRESH }, optional = true)
+ @JoinColumn(name="shop_id")
+ public String getBrand() {
+ return brand;
+ }
+
+ public void setShop(Shop shop) {
+ this.shop = shop;
+ }
+
+ public Shop getShop() {
+ return shop;
+ }
+}
diff --git a/java/TMD/src/main/java/com/wxnacy/spring/bean/Shop.java b/java/TMD/src/main/java/com/wxnacy/spring/bean/Shop.java
new file mode 100644
index 0000000..9d47d05
--- /dev/null
+++ b/java/TMD/src/main/java/com/wxnacy/spring/bean/Shop.java
@@ -0,0 +1,43 @@
+package com.wxnacy.spring.bean;
+
+import javax.persistence.Entity;
+import javax.persistence.GeneratedValue;
+import javax.persistence.GenerationType;
+import javax.persistence.Id;
+
+@Entity
+public class Shop{
+ @Id
+ @GeneratedValue()
+ private Long id;
+ private String code;
+ private String name;
+
+
+ public Shop() {
+ }
+
+ public void setId(Long id) {
+ this.id = id;
+ }
+
+ public Long getId() {
+ return id;
+ }
+
+ public void setCode(String code) {
+ this.code = code;
+ }
+
+ public String getCode() {
+ return code;
+ }
+
+ public void setName(String name) {
+ this.name = name;
+ }
+
+ public String getName() {
+ return name;
+ }
+}
diff --git a/java/TMD/src/main/java/com/wxnacy/spring/bean/User.java b/java/TMD/src/main/java/com/wxnacy/spring/bean/User.java
new file mode 100644
index 0000000..0db56c3
--- /dev/null
+++ b/java/TMD/src/main/java/com/wxnacy/spring/bean/User.java
@@ -0,0 +1,45 @@
+package com.wxnacy.spring;
+
+import javax.persistence.Entity;
+import javax.persistence.GeneratedValue;
+import javax.persistence.GenerationType;
+import javax.persistence.Id;
+
+@Entity
+public class User{
+ @Id
+ @GeneratedValue(strategy = GenerationType.AUTO)
+ private Integer id;
+ private String name;
+
+
+ public void setName(String name) {
+ this.name = name;
+ }
+
+ public String getName() {
+ return name;
+ }
+
+ public User() {
+ }
+
+ public User(Integer id, String name) {
+ this.id = id;
+ this.name = name;
+ }
+ public User(String name) {
+ this.name = name;
+ }
+
+ public void setId(Integer id) {
+ this.id = id;
+ }
+
+ public Integer getId() {
+ return id;
+ }
+ public static void main(String args[]){
+ System.out.println("Hello World");
+ }
+}
diff --git a/java/TMD/src/main/java/com/wxnacy/spring/controller/ScreenController.java b/java/TMD/src/main/java/com/wxnacy/spring/controller/ScreenController.java
new file mode 100644
index 0000000..4a09e7d
--- /dev/null
+++ b/java/TMD/src/main/java/com/wxnacy/spring/controller/ScreenController.java
@@ -0,0 +1,47 @@
+package com.wxnacy.spring.controller;
+
+import java.util.List;
+import java.util.Map;
+
+import org.springframework.beans.factory.annotation.Autowired;
+
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.PathVariable;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.RequestBody;
+import org.springframework.web.bind.annotation.RequestParam;
+import org.springframework.web.bind.annotation.RestController;
+
+import com.wxnacy.spring.bean.Screen;
+import com.wxnacy.spring.repository.ScreenRepository;
+
+
+@RestController
+public class ScreenController {
+
+ @Autowired
+ private ScreenRepository screenRepository;
+
+ @GetMapping("/screen")
+ public Screen screenByCode(
+ @RequestParam(required=true) String code
+ ) {
+ // List items = screenRepository.findByCode(code);
+ Screen item = screenRepository.findByCode(code);
+ // Screen item = items.get(0);
+ System.out.println(item);
+ Screen s = screenRepository.getOne(57l);
+ System.out.println(s);
+ return item;
+ }
+
+ @GetMapping("/screen/{id}")
+ public Screen screenById(
+ @PathVariable Long id
+ ) {
+ Screen item = screenRepository.findById(id);
+ System.out.println(item);
+ return item;
+ }
+
+}
diff --git a/java/TMD/src/main/java/com/wxnacy/spring/repository/BaseRepository.java b/java/TMD/src/main/java/com/wxnacy/spring/repository/BaseRepository.java
new file mode 100644
index 0000000..6417fd5
--- /dev/null
+++ b/java/TMD/src/main/java/com/wxnacy/spring/repository/BaseRepository.java
@@ -0,0 +1,13 @@
+package com.wxnacy.spring.repository;
+
+import java.io.Serializable;
+import java.util.List;
+import org.springframework.data.domain.Example;
+import org.springframework.data.repository.NoRepositoryBean;
+import org.springframework.data.jpa.repository.JpaRepository;
+
+@NoRepositoryBean
+public interface BaseRepository extends JpaRepository {
+ T findById(ID var1);
+
+}
diff --git a/java/TMD/src/main/java/com/wxnacy/spring/repository/ScreenRepository.java b/java/TMD/src/main/java/com/wxnacy/spring/repository/ScreenRepository.java
new file mode 100644
index 0000000..7aa134a
--- /dev/null
+++ b/java/TMD/src/main/java/com/wxnacy/spring/repository/ScreenRepository.java
@@ -0,0 +1,9 @@
+package com.wxnacy.spring.repository;
+
+import java.util.List;
+
+import com.wxnacy.spring.bean.Screen;
+
+public interface ScreenRepository extends BaseRepository {
+ Screen findByCode(String code);
+}
diff --git a/java/TMD/src/main/resources/application.properties b/java/TMD/src/main/resources/application.properties
new file mode 100644
index 0000000..ed54da4
--- /dev/null
+++ b/java/TMD/src/main/resources/application.properties
@@ -0,0 +1,5 @@
+# spring.jpa.hibernate.ddl-auto=create
+spring.datasource.url=jdbc:mysql://localhost:3306/tmddev
+spring.datasource.username=root
+spring.datasource.password=wxnacy
+spring.datasource.driver-class-name=com.mysql.jdbc.Driver
diff --git a/python/flask_sqlalchemy_demo/requirements.txt b/python/flask_sqlalchemy_demo/requirements.txt
new file mode 100644
index 0000000..c709098
--- /dev/null
+++ b/python/flask_sqlalchemy_demo/requirements.txt
@@ -0,0 +1,8 @@
+# Requirements automatically generated by pigar.
+# https://github.com/Damnever/pigar
+
+# run.py: 7,8
+Flask == 0.12
+
+# run.py: 9
+Flask_SQLAlchemy == 2.1
diff --git a/python/flask_sqlalchemy_demo/run.py b/python/flask_sqlalchemy_demo/run.py
new file mode 100644
index 0000000..436de0b
--- /dev/null
+++ b/python/flask_sqlalchemy_demo/run.py
@@ -0,0 +1,51 @@
+#!/usr/bin/env python
+# -*- coding:utf-8 -*-
+# Author: wxnacy(wxnacy@gmail.com)
+# Description:
+# 启动 python run.py
+# 创建书籍
+# curl -X POST localhost:5000/book -H "Content-Type:application/json" -d '{"name":"wxnacy"}'
+# {
+ # "id": 94,
+ # "name": "wxnacy"
+# }
+# 获取数据
+# curl localhost:5000/book/94
+
+
+
+from flask import Flask
+from flask import jsonify
+from flask import request
+from flask_sqlalchemy import SQLAlchemy
+
+app = Flask(__name__)
+SQLALCHEMY_DATABASE_URI = 'mysql+pymysql://root:wxnacy@127.0.0.1:3306/study?charset=utf8mb4'
+app.config['SQLALCHEMY_DATABASE_URI'] = SQLALCHEMY_DATABASE_URI
+
+db = SQLAlchemy(app)
+
+
+class Book(db.Model):
+ __tablename__ = 'book'
+ id = db.Column(db.INT, primary_key=True)
+ name = db.Column(db.String, default="")
+
+ def format(self):
+ return dict(id=self.id, name=self.name)
+
+
+@app.route('/book', methods=['POST'])
+def create_book():
+ args = request.json
+ book = Book(**args)
+ db.session.add(book)
+ db.session.commit()
+ return jsonify(book.format())
+
+@app.route('/book/', methods=['GET'])
+def get_book(id):
+ book = Book.query.filter_by(id=id).first()
+ return jsonify(book.format())
+
+app.run()
diff --git a/python/requirements.txt b/python/requirements.txt
new file mode 100644
index 0000000..6096d13
--- /dev/null
+++ b/python/requirements.txt
@@ -0,0 +1,2 @@
+# Requirements automatically generated by pigar.
+# https://github.com/Damnever/pigar
diff --git a/python/simple/my_sqlalchemy.py b/python/simple/my_sqlalchemy.py
new file mode 100644
index 0000000..d59456f
--- /dev/null
+++ b/python/simple/my_sqlalchemy.py
@@ -0,0 +1,97 @@
+#!/usr/bin/env python
+# -*- coding:utf-8 -*-
+# Author: wxnacy(wxnacy@gmail.com)
+# Description:
+
+from sqlalchemy import create_engine
+from sqlalchemy.ext.declarative import declarative_base
+from sqlalchemy import Column, Integer, String
+from sqlalchemy.orm import sessionmaker
+from sqlalchemy import and_
+from sqlalchemy import or_
+from sqlalchemy import text
+from collections import namedtuple
+
+Base = declarative_base()
+
+SQLALCHEMY_DATABASE_URI = 'mysql+pymysql://root:wxnacy@127.0.0.1:3306/study?charset=utf8mb4'
+engine = create_engine(SQLALCHEMY_DATABASE_URI, echo=True)
+Session = sessionmaker(bind=engine)
+session = Session()
+
+class Book(Base):
+ __tablename__ = 'book'
+ id = Column(Integer, primary_key=True)
+ name = Column(String(132))
+
+ def __str__(self):
+ return f"Book[id:{self.id}, name:{self.name}]"
+
+# 创建表
+# Base.metadata.create_all(engine)
+
+# 添加数据
+# book = Book(name="new book")
+# session.add(book)
+# session.commit()
+
+# insert into book (name) values ('wxnacy');
+# insert into book (name) values ('wxnacy');
+# session.add(Book(name="wxnacy"))
+# session.add(Book(name="wxnacy"))
+# session.commit()
+
+# session.add_all([Book(name="wxnacy"), Book(name="wxnacy")])
+# session.commit()
+
+# insert into book (name) values ('wxnacy'), ('wxnacy');
+items = [dict(name="wxnacy"), dict(name="wxnacy")]
+session.execute(Book.__table__.insert(), items)
+session.commit()
+
+# books = session.query(Book).filter(and_(Book.id==2, Book.name=="new book")).all()
+# books = session.query(Book).filter(~Book.id.in_([2])).all()
+# books = session.query(Book).filter().limit(1).all()
+# for b in books:
+ # print(b)
+# print(books)
+
+# book = session.query(Book).filter_by(id=1).first()
+# book = session.query(Book).filter(Book.id==1).first()
+# print(book)
+# session.delete(book)
+# session.commit()
+
+
+# res = session.execute(text("select * from book where id = :id"), **dict(id=2)).fetchall()
+res = engine.execute(text("insert into book (name) values (:name)"),
+ **dict(name='text'))
+# print(res)
+# book = session.query(Book).filter(text("id = :id and name = :name")).params(id=2, name="new book").first()
+# print(book)
+# res = session.execute(text("select * from book where id = 2")).fetchall()
+# res = session.execute(text("select * from book where id = 2"))
+
+# Record = namedtuple('Record', res.keys())
+# records = {Record(*r) for r in res.fetchall()}
+# res = [r for r in records]
+# print(res) # > [Record(id=2, name='new book')]
+
+# def _fmt_i(k, v):
+ # return k ,v
+
+# def _fmt(o):
+ # r = list(map(_fmt_i, res.keys(), o))
+ # return {k: v for k, v in r}
+# res = [_fmt(o) for o in res.fetchall()]
+# print(res) # > [{'id': 2, 'name': 'new book'}]
+
+# books = session.query(Book).filter(text("id in :ids")).params(ids=[2, 3, 4, 5]).all()
+# for b in books:
+ # b.name = f'{b.id}-book'
+ # session.add(b)
+# session.commit()
+
+res = engine.execute(text("select sum(id) from book")).fetchall()
+print(res)
+
diff --git a/python/simple/scheduler.py b/python/simple/scheduler.py
new file mode 100644
index 0000000..505a239
--- /dev/null
+++ b/python/simple/scheduler.py
@@ -0,0 +1,20 @@
+#!/usr/bin/env python
+# -*- coding:utf-8 -*-
+# Author: wxnacy(wxnacy@gmail.com)
+# Description:
+
+from apscheduler.schedulers.blocking import BlockingScheduler
+from datetime import datetime
+
+sched = BlockingScheduler()
+
+# @sched.scheduled_job('interval', id='my_job1', seconds=3,
+ # start_date='2018-01-23 09:30:00',
+ # end_date='2018-01-23 18:22:00')
+@sched.scheduled_job('date', id='my_job', run_date='2018-01-23 18:25:30')
+def my_job():
+ print(f'{datetime.now():%H:%M:%S} Hello World ')
+
+# sched.add_job(my_job, 'interval', seconds=5)
+# sched.add_job(my_job, 'cron', hour=17, minute=22, second=55)
+sched.start()