EFCore数据库反向工程

之前的大数据比赛取消了,就去弄了另外一个项目。

程序是师兄写的,但是后台数据库不见了,只能自己生成一个数据库来测试,有一个特点是程序运行时会自动生成空的数据表,这样就不用很麻烦的对着java的代码复现数据表结构(ef真香),在写爬虫找数据的时候就想着,能不能用程序把这些表变成实体类呢,网上找了一番,找到了解决方法就重新整理一下记录下了。

源链接:https://www.cnblogs.com/qidakang/p/11302327.html

打开VS,新建一个工程,然后安装如下的包

反向MySQL数据库就安装:

1
2
3
4
MySql.Data.EntityFrameworkCore
Pomelo.EntityFrameworkCore.MySql
Microsoft.EntityFrameworkCore.Tools
Microsoft.VisualStudio.Web.CodeGeneration.Design

反向SqlServer数据库就安装:

1
2
3
4
Microsoft.EntityFrameworkCore
Microsoft.EntityFrameworkCore.SqlServer
Microsoft.EntityFrameworkCore.Tools
Microsoft.VisualStudio.Web.CodeGeneration.Design

安装好后打开[程序包控制台],接着输入

MySQL版本:

1
2
3
4
第一次生成实体类:
Scaffold-DbContext "Server=127.0.0.1;port=3306;Database=db; User=root;Password=root;"Pomelo.EntityFrameworkCore.MySql -OutputDir Models
更新实体类:
Scaffold-DbContext "Server=127.0.0.1;port=3306;Database=db; User=root;Password=root;" Pomelo.EntityFrameworkCore.MySql -OutputDir Models -Force

SqlServer版本:

1
2
3
4
第一次生成实体:
Scaffold-DbContext "Server=127.0.0.1;port=3306;Database=db; User=root;Password=root;"Microsoft.EntityFrameworkCore.SqlServer -OutputDir Models
更新实体类:
Scaffold-DbContext "Server=127.0.0.1;port=3306;Database=db; User=root;Password=root;"Microsoft.EntityFrameworkCore.SqlServer -OutputDir Models -Force

运行后会多出一个Models文件夹,里面就是这个数据库的所有表

Windows10 下使用 IDEA 配置 Spark 的 Debug 环境

之前报名了学校的一些大数据比赛,做的笔记整理一下发出来,供以后查看
第一次用 ide 和 scala,不足之处还请批评指正

  • idea 的安装就不赘述了。
  • spark 在本地不需要安装。
  • jdk = 1.8
  • spark version = 2.0.0,比较老,但是是比赛的要求。
  • hadoop version = 2.6.0
  • scala version = 2.11.0
  1. 在 idea 中建立一个 maven 工程,注意路径不能包括中文

  2. 添加 pom.xml,示例在 Source\Task3\example\pom.xml 中

    pom.xml
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    <?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 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>

    <groupId>org.example</groupId>
    <artifactId>example</artifactId>
    <version>1.0-SNAPSHOT</version>

    <properties>
    <spark.version>2.0.0</spark.version>
    <scala.version>2.11</scala.version>
    </properties>

    <dependencies>
    <dependency>
    <groupId>org.apache.spark</groupId>
    <artifactId>spark-core_${scala.version}</artifactId>
    <version>${spark.version}</version>
    </dependency>
    <dependency>
    <groupId>com.alibaba</groupId>
    <artifactId>fastjson</artifactId>
    <version>1.2.4</version>
    </dependency>
    <dependency>
    <groupId>org.apache.spark</groupId>
    <artifactId>spark-streaming_${scala.version}</artifactId>
    <version>${spark.version}</version>
    </dependency>
    <dependency>
    <groupId>org.apache.spark</groupId>
    <artifactId>spark-sql_${scala.version}</artifactId>
    <version>${spark.version}</version>
    </dependency>
    <dependency>
    <groupId>org.apache.spark</groupId>
    <artifactId>spark-hive_${scala.version}</artifactId>
    <version>${spark.version}</version>
    </dependency>
    <dependency>
    <groupId>org.apache.spark</groupId>
    <artifactId>spark-mllib_${scala.version}</artifactId>
    <version>${spark.version}</version>
    </dependency>

    </dependencies>

    <build>
    <plugins>

    <plugin>
    <groupId>org.scala-tools</groupId>
    <artifactId>maven-scala-plugin</artifactId>
    <version>2.15.2</version>
    <executions>
    <execution>
    <goals>
    <goal>compile</goal>
    <goal>testCompile</goal>
    </goals>
    </execution>
    </executions>
    </plugin>

    <plugin>
    <artifactId>maven-compiler-plugin</artifactId>
    <version>3.6.0</version>
    <configuration>
    <source>1.8</source>
    <target>1.8</target>
    </configuration>
    </plugin>

    <plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-surefire-plugin</artifactId>
    <version>2.19</version>
    <configuration>
    <skip>true</skip>
    </configuration>
    </plugin>

    </plugins>
    </build>
    </project>
  3. 在 Idea 左侧 Project 窗口中选中 src\main 右键添加文件夹 scala

  4. 选中 scala 右键 make directory as -> Sources Root

  5. scala 变成蓝色后右键 new -> scala class ->选择 object,输入名称

  6. 我们先写一个最简单的 CsvShow 程序让他能在本地运行并且 debug

    CsvShow Code
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    package org.example.spark.scala

    import org.apache.spark.sql.{DataFrame, SparkSession}
    import org.apache.spark.{SparkConf, SparkContext}

    object CsvShow {
    def main(args:Array[String]):Unit= {
    val spark: SparkSession = SparkSession.builder()
    .master("local[*]")
    .appName("CsvShow")
    .config("spark.sql.warehouse.dir", "file:/")
    .getOrCreate()
    val csv: DataFrame = spark.read.csv("../../../../data/mysql.csv")
    csv.show()
    val pdf: DataFrame = csv.toDF()
    pdf.show()
    spark.stop()
    }
    }
  7. 解压 Hadoop,在没有安装 hadoop 的情况下是不能进行 spark 程序的本地 debug

  • 我们先下载如下两个文件 hadoop-2.6.0.tar.gz 和 hadooponwindows-master.zip

  • 先将 hadoop 解压出来

  • 再解压 hadooponwindows 到 hadoop 的根目录下,提示覆盖选择全覆盖

  • 添加如下环境变量

    1. 变量名=HADOOP_HOME, 变量值=你解压的路径
    1. 在 path 中添加 %HADOOP_HOME%\bin 变量
  • 打开 cmd,输入 hadoop version,显示版本说明 hadoop 环境变量配置正确

  1. 配置 Hadoop 环境
  • 修改 etc\hadoop\hadoop-env.cmd 中的 JAVA_HOME,如 JAVA_HOME=C:\PROGRA~1\Java\jdk1.8.0_241,路径中不能有空格

  • 在根目录下添加 datanode、namenode 和 tmp 文件夹

  • 修改 etc\hadoop\hdfs-site.xml,添加如下 xml, 注意/D:/hadoop-2.6.0/namenode 和/D:/hadoop-2.6.0/datanode 这两个值需要时之前创建文件夹的路径

1
2
3
4
5
6
7
8
9
10
11
12
13
14
<configuration>
<property>
<name>dfs.replication</name>
<value>1</value>
</property>
<property>
<name>dfs.namenode.name.dir</name>
<value>/D:/hadoop-2.6.0/namenode</value>
</property>
<property>
<name>dfs.datanode.data.dir</name>
<value>/D:/hadoop-2.6.0/datanode</value>
</property>
</configuration>
  • 修改 etc\hadoop\core-site.xml
1
2
3
4
5
6
<configuration>
<property>
<name>fs.defaultFS</name>
<value>hdfs://localhost:9000</value>
</property>
</configuration>
  • 修改 etc\hadoop\mapred-site.xml
1
2
3
4
5
6
<configuration>
<property>
<name>mapreduce.framework.name</name>
<value>yarn</value>
</property>
</configuration>
  • 修改 etc\hadoop\yarn-site.xml
1
2
3
4
5
6
7
8
9
10
<configuration>
<property>
<name>yarn.nodemanager.aux-services</name>
<value>mapreduce_shuffle</value>
</property>
<property>
<name>yarn.nodemanager.aux-services.mapreduce.shuffle.class</name>
<value>org.apache.hadoop.mapred.ShuffleHandler</value>
</property>
</configuration>
  1. 以管理员身份打开 cmd 输入 hdfs namenode -format 来执行格式化 hdfs,执行后 namenode 文件里会自动生成一个 current 文件
  2. cd 到根目录下 sbin 文件夹,输入 start-all.cmd 启动全部的 hadoop 服务
  3. 在相应的方法中右键 Debug “*”,就可以运行本地 debug 调试

记:winserver2008 的任务计划特性

winserver2008 中任务计划程序运行程序时,程序的运行路径不是指定的路径下,而是 c:\Windows\system32\下

解决办法

  1. 文件放到 system32 中执行。

  2. 写一个 bat 将计划中操作指向 bat 文件,bat 文件先 cd 再执行程序。

将堆栈星轨变成一段流星雨视频

前言

疫情期间一直在家呆着也没事做就拍拍星星
前两天拍了张星轨 ,但是忘了关长时间降噪全是断点不怎么满意

星轨

昨天晚上又拍了一次,比较成功还误打误撞的做了一段流星雨视频(雾)打算记录一下,供以后参考

星轨的堆栈拍摄方法网上又很多教程这里就不赘述了

这里直接介绍后期处理的部分

前提:

只需要一种运动方向的星星

星星的运动轨迹是自下而上的话就需要进行反序,自上而下则不需要对图片进行反序

后期

我使用的是 lr 当然也可以用 acr 但是不方便统一管理图片

将图片导入电脑后在 lr 中添加图片然后进行调整

调整好照片后我们全选刚才拍摄的照片

在照片上右键——设置——同步设置

然后进行导出,导出设置中需要尽量选择小尺寸的图片输出不然后面的处理会很卡

导出后先需要对文件进行反序排列我编写了一个程序(附件在本文最后)进行反序

将程序放到图片文件夹内双击运行后目录下会多出一个 Re 文件夹里面就是反序好的图片

接下来我们打开 pr 建立好工程文档后以图片序列的方式导入反序好的图片

添加效果中视频效果——时间——残影

设置残影数量为 80、衰减 0.95、残影运算符最大值,其他的默认

导出就可以有一段类似流星雨的视频

也算是星空的另一种表现方式吧

文件反序程序

JS 实现 URL 变换

前言

今天无聊找东西玩翻书签翻到了 http://glench.com/hash/
就想着找源码搬到 blog 上,转了半天发现作者没开源,就有了下文。

演示

警告!请使用无痕模式再点击下面的按钮,不然会有一堆的历史记录。
表情循环:
滚动条位置动画:
滚动条动画演示

代码

ver0.2
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
//修改 url 的方法
//sub: 数组下标
//arr: 表情数组
async function setUrl(text) {
if (!!(window.history && history.pushState)) {
history.replaceState(null, null, window.location.href.split('#')[0] = text);
}
}
//修改 url 为默认 url
async function cleanUrl(url) {
if (!!(window.history && history.pushState)) {
history.replaceState(null, null, window.location.href.split('#')[0] = url);
}
}

function getPageHeight() {
let body = document.body,
html = document.documentElement;

let height = Math.max(body.scrollHeight, body.offsetHeight,
html.clientHeight, html.scrollHeight, html.offsetHeight);
return height;
}

function getWindowHeight() {
let height = window.innerHeight;
return height;
}

//循环动画使用的表情
var kaomoji = [
"(`・ω・)",
"(〃∀〃)",
"w(゚Д゚)w",
"_(:з」∠)_"
]

var emoji = [
"🌶️",
"💉",
"💦",
"🐂",
"🍺"
]

var bar = [
"-",
"0"
]

var defUrl = window.location.href.split('#')[0]; //默认 url

var scrollProgressIntervalId = null;

function scrollBarClick() {
UrlProgress(bar, 0, 1, 50, -1);
let e = window.event;
if (e != undefined) {
obj = e.target || e.srcElement;
}
if (e.path[0].innerText == "click") {
e.path[0].innerText = "stop";
window.addEventListener('scroll', e => scrollProgress(bar), true);
} else {
alert("需要停止请刷新!");
e.path[0].innerText = "click";
window.removeEventListener('scroll', scrollProgress(bar), true);
}

}

function scrollProgress(arr) {
let now;

let scrollAvail = getPageHeight() - getWindowHeight(); // 可滚动的高度
let scrollTop = document.documentElement.scrollTop || document.body.scrollTop || window.pageYOffset;

let length = 50;
now = (scrollTop / scrollAvail) * length;
now = parseInt(now);
UrlProgress(arr, 0, 1, 50, now);
}
//arr 对应前景,背景数组
//subBack 进度条背景
//subFore 进度条前景
//length 进度条总长
//now 当前进度
function UrlProgress(arr, subBack, subFore, length, now) {
let args = "";
for (let i = 0; i < length; i++) {
args = args + arr[subBack]
}

if (now >= 0) {
args = args.split('');
args.splice(now, 1, arr[subFore]);
args = args.join('');
}

setUrl(args);
}

//循环动画
var UrlLoopIntervalId = null;

function UrlLoop(speed, arr, defUrl) {
var e = window.event;
if (e != undefined) {
obj = e.target || e.srcElement;
e.path[0].innerText = "stop";
}
//上面:
//选择触发方法的元素

if (UrlLoopIntervalId == null) {
this.speed = speed || '1000';
var i = 0;
UrlLoopIntervalId = setInterval(function () {
setUrl(arr[i]);
i++;
if (i == arr.length) {
i = 0;
}
}, speed);
} else {
clearInterval(UrlLoopIntervalId);
cleanUrl(defUrl);
UrlLoopIntervalId = null;
e.path[0].innerText = "click";
}
}
ver0.1
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
//修改 url 的方法
//sub: 数组下标
//arr: 表情数组
async function setUrl(text) {
if (!!(window.history && history.pushState)) {
history.replaceState(null, null, window.location.href.split('#')[0] = text);
}
}
//修改 url 为默认 url
async function cleanUrl(url) {
if (!!(window.history && history.pushState)) {
history.replaceState(null, null, window.location.href.split('#')[0] = url);
}
}

function getPageHeight() {
let body = document.body,
html = document.documentElement;

let height = Math.max(body.scrollHeight, body.offsetHeight,
html.clientHeight, html.scrollHeight, html.offsetHeight);
return height;
}

function getWindowHeight() {
let height = window.innerHeight;
return height;
}

//循环动画使用的表情
var kaomoji = [
"(`・ω・)",
"(〃∀〃)",
"w(゚Д゚)w",
"_(:з」∠)_"
]

var emoji = [
"🌶️",
"💉",
"💦",
"🐂",
"🍺"
]

var bar = [
"-",
"0"
]

var defUrl = window.location.href.split('#')[0]; //默认 url

var scrollProgressIntervalId = null;
window.addEventListener('scroll', e => scrollProgress(bar), true)

function scrollProgress(arr) {
let now;

let scrollAvail = getPageHeight() - getWindowHeight(); // 可滚动的高度
let scrollTop = document.documentElement.scrollTop || document.body.scrollTop || window.pageYOffset;

let length = 50;
now = (scrollTop / scrollAvail) * length;
now = parseInt(now);
UrlProgress(arr, 0, 1, 50, now);
}
//arr 对应前景,背景数组
//subBack 进度条背景
//subFore 进度条前景
//length 进度条总长
//now 当前进度
function UrlProgress(arr, subBack, subFore, length, now) {
let args = "";
for (let i = 0; i < length; i++) {
args = args + arr[subBack]
}

if (now >= 0) {
args = args.split('');
args.splice(now, 1, arr[subFore]);
args = args.join('');
}

setUrl(args);
}

//循环动画
var UrlLoopIntervalId = null;

function UrlLoop(speed, arr, defUrl) {
var e = window.event;
if (e != undefined) {
obj = e.target || e.srcElement;
e.path[0].innerText = "stop";
}
//上面:
//选择触发方法的元素

if (UrlLoopIntervalId == null) {
this.speed = speed || '1000';
var i = 0;
UrlLoopIntervalId = setInterval(function () {
setUrl(arr[i]);
i++;
if (i == arr.length) {
i = 0;
}
}, speed);
} else {
clearInterval(UrlLoopIntervalId);
cleanUrl(defUrl);
UrlLoopIntervalId = null;
e.path[0].innerText = "click";
}
}

TODO

  • 加一个进度条动画获取滚动位置改变进度。
  • 同时打开多个弹窗,实现播放动画。
  • 按钮解绑滚动条事件
  • 在进度条的末端加进度的百分比