diff --git "a/2020/02/23/\347\273\210\344\272\216\351\227\262\344\270\213\346\235\245\357\274\214\350\257\264\344\270\200\350\257\264\346\210\221\345\273\272Blog\344\271\213\350\267\257/index.html" "b/2020/02/23/\347\273\210\344\272\216\351\227\262\344\270\213\346\235\245\357\274\214\350\257\264\344\270\200\350\257\264\346\210\221\345\273\272Blog\344\271\213\350\267\257/index.html" new file mode 100644 index 0000000..122a0e2 --- /dev/null +++ "b/2020/02/23/\347\273\210\344\272\216\351\227\262\344\270\213\346\235\245\357\274\214\350\257\264\344\270\200\350\257\264\346\210\221\345\273\272Blog\344\271\213\350\267\257/index.html" @@ -0,0 +1,194 @@ +终于闲下来,说一说我建Blog之路 | SHYEE-PLASMA + + + + + + + + + + + + +

终于闲下来,说一说我建Blog之路

买服务器

2020年鼠年的初二,在家里宅着无聊开始着手准备,搭建一个人网站。

+ + +

一开始做了一部分设计图,准备使用Java建站。最初的设计不仅仅是写博客,而是想多方面发展,包括博客,生活,旅行,剪辑,考研等,所以做了一份思维导图。当天决定了好久才定下来使用阿里云的学生服务器,年费:124;加上9块钱买了域名 ,一共是¥133。

+
+

wordpress

当然,买完才发现,自己购买的时候,选错了,选成了Wordpress版了,然后在第一时间重置了自己的服务器,改成了CentOS(阿里云的学生服务器只提供7.3版本的)。

+
+

Ajax+MVC

在学校学了一点关于MVC的知识,之前也有自己做过一个项目(具体会在别的文章里讲👌)。

+

接下来就是配置服务器了,在配置服务器的时候,遇到了很多的坑,基本都是版本版本问题,我有个癖好,就是软件习惯性选择最新的装。JDK搭建,apache tomcat搭建,nginx搭建都还好,但是到了数据库安装的时候,就出现了各种问题,版本号依赖关系不匹配之类的(具体会在别的文章里讲👌)。

+

2天后,环境基本安装完成,MVC的后台可以说也是基本有了雏形,然后就部署了 然后部署就遇到了其他的问题,后来一看是少穿了一个jar包。

+

这次 的设计是Ajax+mvc的设计,就是说先写个差不多的后端,放到服务器上,然后从本地直接发送请求,要个json串回来,用仅会的那么一两句js,解析一下,放到页面上。

+

3天后,(最先做的blog模块)页面上终于有差不多的个人博客的味道了,真香。

+

但是随着慢慢的发现这种动态网页的模式,(加上我技术有限)使我无法设置我在详情页上文字的样式,当时设计的是详情页上的文字直接放在数据库里的,然后固定一种详情页的模板,直接往里塞数据。所以,详情页只不过是一张图片,加一坨字罢了。

+

为此又愁了好几天,直到有一天,一位大佬问我,有没有听说过Hexo。

+
+

Hexo

我当然没听说过Hexo是什么,然后就去网上查,去了官网看了一圈感觉确实不错,然后查看安装方式 : npm... 。“什么是nmp”,在我了解git之前,一直以为npm是其他系统特有的命令。然后看到后面有 git 什么又是git,虽然以前听说过git,但是从来都不了解,然后花了一个下午在B站,学了git以及github相关的东西 ,才知道npm原来是 node.js相关的包管理工具。然后才知道,如何安装Hexo。

+

于是,看着B站某博主的视频,搭建好了自己的一套Hexo平台,并部署到了github。可我为什么要花钱买阿里的服务器呢?

+

后来慢慢转变了思想:搭建个人网站,为啥要搞的那么麻烦!于是又在b站查找相关资料(众所周知,bilibili是一个技术交流平台)。发现了Hugo

+
+

Hugo

Go语言。学过一两天,至少写个Hello World 不用去百度的那种👍。Hugo就是一个基于Go的平台,但是访问了一下午他们家的主题。我觉的还是换一个吧(主要还是接受了WordPress的宣传)。

+
+

回到wordpress

我又决定回到WordPress了,本来打算自己配置一套WordPress的环境,但是卡在安装Docker上了,Docker又是什么东西!!!🤢,之前只知道它是条鲸鱼,装了一晚上,才发现还需要那个Docker Compose,去百度了一下教程,终于,👴吐了。最后一刻想起来,阿里云不是自带WordPress的选项么。

+

然后系统再一次被重置。换上了WordPress,PHP对于我来说一片空白,但是还好有后台管理模块。

+

结果,阿里云自带的WP版本也太旧了8!4.8.2,都0202年了!MySQL 5.xx 在shell里输入mysql 显示没有该命令又是几个意思???结果我又将就着,配置了半天 ,不得不说 ,这个WP真的卡,管理员体验极差,配置了一晚上,写了一篇md传上去了。晚上,还兴奋的不行,寻思总算可以稳定的写blog了。

+

第二天中午,起床,发现我的网站进不去了,域名进不去,IP进不去。真心崩溃,我写的文案啊,码字不易啊,当机立断,不要耗在这上面,还是回头去用Hexo吧,毕竟WP对国内用户太不友好了。🤦‍♂️

+
+

回到Hexo

服务器再一次被重置。。

+

回到了CentOS7.3,转好了一堆乱七八糟 的环境,然后把以前学校里那个项目部署上去了。

+

写博客还是轻量一些好。。

+
+
Author: SHYEE
Link: http://example.com/2020/02/23/%E7%BB%88%E4%BA%8E%E9%97%B2%E4%B8%8B%E6%9D%A5%EF%BC%8C%E8%AF%B4%E4%B8%80%E8%AF%B4%E6%88%91%E5%BB%BABlog%E4%B9%8B%E8%B7%AF/
Copyright Notice: All articles in this blog are licensed under CC BY-NC-SA 4.0 unless stating additionally.
\ No newline at end of file diff --git "a/2020/02/24/MyBatis\345\256\211\350\243\205/connector.png" "b/2020/02/24/MyBatis\345\256\211\350\243\205/connector.png" new file mode 100644 index 0000000..633ec53 Binary files /dev/null and "b/2020/02/24/MyBatis\345\256\211\350\243\205/connector.png" differ diff --git "a/2020/02/24/MyBatis\345\256\211\350\243\205/image-20200224154635459.png" "b/2020/02/24/MyBatis\345\256\211\350\243\205/image-20200224154635459.png" new file mode 100644 index 0000000..1bcfde7 Binary files /dev/null and "b/2020/02/24/MyBatis\345\256\211\350\243\205/image-20200224154635459.png" differ diff --git "a/2020/02/24/MyBatis\345\256\211\350\243\205/index.html" "b/2020/02/24/MyBatis\345\256\211\350\243\205/index.html" new file mode 100644 index 0000000..b47035e --- /dev/null +++ "b/2020/02/24/MyBatis\345\256\211\350\243\205/index.html" @@ -0,0 +1,254 @@ +MyBatis安装 | SHYEE-PLASMA + + + + + + + + + + + + + + +

MyBatis安装

Mybatis✔

+

环境:

+
    +
  1. JDK 13.0.2

    +
  2. +
  3. tomcat 9.0.3

    +
  4. +
  5. mybatis 3.5.4

    +
  6. +
  7. mysql 8

    +
  8. +
+

入门

早期为:ibatis:apache

+

2010年被Google收购改称:Mybatis

+

主要作用:简化JDBC操作,实现数据的持久化。

+

ORM:Object Relational Mapping,可以使开发人员像操作对象一样操作数据库

+

mybatis是ORM的一种实现

+

下载

之前看过的一个教程是使用Idea的,也就是直接使用依赖库导入,这次看的是导入jar使用。

+

官网

+ +

选择Getting Started

+ + +

会有Maven方式,当然使用Idea就可以直接复制代码框内代码到idea中,但这次选择jar的超链接。

+ + +

就来到了熟悉的github,在最新版本下,有三个选项,这里选择第一个zip包下载。

+ + +

下好之后是个zip,

+ + +

打开以后目录文件如图,

+

lib文件夹存放mybatis的一些依赖包,

+

license就是字面意思 许可证,

+

mybatis-3.5.4.jar即要用到的jar,

+

.pdf即使用说明书,

+

NOTICE也是字面意思 注意事项。

+

使用

简单实用一下:

+

导包

打开eclipse,新建一个JAVA项目,因为mybatis是操控数据库的,所以暂时可以先间隔Javaproject试一下。

+

这里起名“TestMyBatis”,将mybatis-3.5.4.jar拖到src里面,顺便add to buildpath,添加环境。

+

建表

打开cmd或者使用navicat,因为我的navicat建数据库总是会有数据编码混乱的问题,我一般建表都是用cmd。

+ + +

创建实体类及映射关系

创建实体类 Person

+ + +

构建这个类

+
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
private String id;
private String name;
private int age;

public Person() {

}
public Person(String id, String name, int age) {
super();
this.id = id;
this.name = name;
this.age = age;
}
public String getId() {
return id;
}
public void setId(String id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}

+ +

创建配置文件映射表和类的映射 .xml文件

+ + +

点这里转换视图

+

在刚刚的.pdf文件中有大概的配置方法,打开后找到“Exploring Mapped SQL Statements

+

下面有

+
1
2
3
4
5
6
7
<?xml version="1.0" encoding="UTF-8" ?> 
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="org.mybatis.example.BlogMapper">
<select id="selectBlog" resultType="Blog">
select * from Blog where id = #{id}
</select>
</mapper>
+ +

直接复制,到刚刚的xml中,更改namespace 后面的内容为自己的xmltop.eshyee.entity.personMapper

+

改完之后

+
1
2
3
4
5
6
7
<?xml version="1.0" encoding="UTF-8" ?> 
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="top.eshyee.entity.personMapper">
<select id="queryPersonById" resultType="Person" parameterType="String">
select * from person where id= #{id}
</select>
</mapper>
+ +

在创建一个配置文件,在src下创建一个叫config.xml的文件。

+

在pdf中查找“Building SqlSessionFactory from XML

+

这里需要提前准备好一个用来链接的jar MySQL connector

+

网址:https://dev.mysql.com/downloads/connector/j/

+ + +

选zip,下好之后,里面乱七八糟的东西就不细致分析了,会点工地英语看看就好。主要使用mysql-connector-java-8.0.19.jar。拖到eclipse ,add一下环境。

+

配置xml如下:

+
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
<?xml version="1.0" encoding="UTF-8" ?> 
<!DOCTYPE configuration PUBLIC "-//mybatis.org//DTD Config 3.0//EN" "http://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration>
<environments default="development">
<environment id="development">
<transactionManager type="JDBC" />
<dataSource type="POOLED">
<property name="driver" value="com.mysql.cj.jdbc.Driver" />
<property name="url" value="jdbc:mysql://localhost:3306/test?useSSL=false&amp;serverTimezone=UTC" />
<property name="username" value="你的用户名" />
<property name="password" value="你的密码" />
</dataSource>
</environment>
</environments>
<mappers>
<mapper resource="top/eshyee/entity/personMapper.xml" />
</mappers>
</configuration>
+ +

ok写个测试用例

+
1
2
3
4
5
6
7
8
9
10
11
12
public static void main(String[] args) throws IOException {
// TODO Auto-generated method stub
//加载config
Reader reader =Resources.getResourceAsReader("config.xml");
SqlSessionFactory sessionFactory=new SqlSessionFactoryBuilder().build(reader);
SqlSession session= sessionFactory.openSession();
String statement ="top.eshyee.entity.personMapper.queryPersonById";
Person person=session.selectOne(statement,"1234567890");
//这里的1234567890是我接下来要插入的字符串
System.out.println(person.toString());
session.close();
}
+ +

同时在person下写一个toString()方法,这个可以自己来定,只要能看到person里的值就🉑。

+

测试

测试以下~~在数据库中插入一行数据

+ + +

run一下test

+ + +

🆗

+

常见问题

    +
  1. 写完之后run的时候除了问题,报了一坨错其中有个timezone…想起来url写的jdbc:mysql://localhost:3306/test,然后后面加了?useSSL=false&serverTimezone=UTC,结果还不对,就百度了一下&在xml中是一种很神奇的存在得写成&amp;.
  2. +
  3. Resource导包的时候选择org.apache.ibatis.io.*;
  4. +
+

总结

相对于写DButil方便了不少。

+
Author: SHYEE
Link: http://example.com/2020/02/24/MyBatis%E5%AE%89%E8%A3%85/
Copyright Notice: All articles in this blog are licensed under CC BY-NC-SA 4.0 unless stating additionally.
\ No newline at end of file diff --git "a/2020/02/24/MyBatis\345\256\211\350\243\205/mb1.png" "b/2020/02/24/MyBatis\345\256\211\350\243\205/mb1.png" new file mode 100644 index 0000000..ce2242f Binary files /dev/null and "b/2020/02/24/MyBatis\345\256\211\350\243\205/mb1.png" differ diff --git "a/2020/02/24/MyBatis\345\256\211\350\243\205/mb2.png" "b/2020/02/24/MyBatis\345\256\211\350\243\205/mb2.png" new file mode 100644 index 0000000..4c17645 Binary files /dev/null and "b/2020/02/24/MyBatis\345\256\211\350\243\205/mb2.png" differ diff --git "a/2020/02/24/MyBatis\345\256\211\350\243\205/mb4.png" "b/2020/02/24/MyBatis\345\256\211\350\243\205/mb4.png" new file mode 100644 index 0000000..4e4538c Binary files /dev/null and "b/2020/02/24/MyBatis\345\256\211\350\243\205/mb4.png" differ diff --git "a/2020/02/24/MyBatis\345\256\211\350\243\205/mb6.png" "b/2020/02/24/MyBatis\345\256\211\350\243\205/mb6.png" new file mode 100644 index 0000000..ab4bab4 Binary files /dev/null and "b/2020/02/24/MyBatis\345\256\211\350\243\205/mb6.png" differ diff --git "a/2020/02/24/MyBatis\345\256\211\350\243\205/mb7.png" "b/2020/02/24/MyBatis\345\256\211\350\243\205/mb7.png" new file mode 100644 index 0000000..1d9ccb2 Binary files /dev/null and "b/2020/02/24/MyBatis\345\256\211\350\243\205/mb7.png" differ diff --git "a/2020/02/24/MyBatis\345\256\211\350\243\205/person.png" "b/2020/02/24/MyBatis\345\256\211\350\243\205/person.png" new file mode 100644 index 0000000..e7f6da0 Binary files /dev/null and "b/2020/02/24/MyBatis\345\256\211\350\243\205/person.png" differ diff --git "a/2020/02/24/MyBatis\345\256\211\350\243\205/persontable.png" "b/2020/02/24/MyBatis\345\256\211\350\243\205/persontable.png" new file mode 100644 index 0000000..6f69b66 Binary files /dev/null and "b/2020/02/24/MyBatis\345\256\211\350\243\205/persontable.png" differ diff --git "a/2020/02/24/MyBatis\345\256\211\350\243\205/this.png" "b/2020/02/24/MyBatis\345\256\211\350\243\205/this.png" new file mode 100644 index 0000000..6c0357b Binary files /dev/null and "b/2020/02/24/MyBatis\345\256\211\350\243\205/this.png" differ diff --git "a/2020/02/24/MyBatis\345\256\211\350\243\205/zipmb.png" "b/2020/02/24/MyBatis\345\256\211\350\243\205/zipmb.png" new file mode 100644 index 0000000..83f4abb Binary files /dev/null and "b/2020/02/24/MyBatis\345\256\211\350\243\205/zipmb.png" differ diff --git "a/2020/02/25/Oracle\347\263\273\345\210\227\345\255\246\344\271\240-\344\270\200/image-20200225120405331.png" "b/2020/02/25/Oracle\347\263\273\345\210\227\345\255\246\344\271\240-\344\270\200/image-20200225120405331.png" new file mode 100644 index 0000000..c49e1e8 Binary files /dev/null and "b/2020/02/25/Oracle\347\263\273\345\210\227\345\255\246\344\271\240-\344\270\200/image-20200225120405331.png" differ diff --git "a/2020/02/25/Oracle\347\263\273\345\210\227\345\255\246\344\271\240-\344\270\200/image-20200225140230194.png" "b/2020/02/25/Oracle\347\263\273\345\210\227\345\255\246\344\271\240-\344\270\200/image-20200225140230194.png" new file mode 100644 index 0000000..97fd077 Binary files /dev/null and "b/2020/02/25/Oracle\347\263\273\345\210\227\345\255\246\344\271\240-\344\270\200/image-20200225140230194.png" differ diff --git "a/2020/02/25/Oracle\347\263\273\345\210\227\345\255\246\344\271\240-\344\270\200/image-20200225140548831.png" "b/2020/02/25/Oracle\347\263\273\345\210\227\345\255\246\344\271\240-\344\270\200/image-20200225140548831.png" new file mode 100644 index 0000000..6e7f1b5 Binary files /dev/null and "b/2020/02/25/Oracle\347\263\273\345\210\227\345\255\246\344\271\240-\344\270\200/image-20200225140548831.png" differ diff --git "a/2020/02/25/Oracle\347\263\273\345\210\227\345\255\246\344\271\240-\344\270\200/image-20200225140606895.png" "b/2020/02/25/Oracle\347\263\273\345\210\227\345\255\246\344\271\240-\344\270\200/image-20200225140606895.png" new file mode 100644 index 0000000..f338bb9 Binary files /dev/null and "b/2020/02/25/Oracle\347\263\273\345\210\227\345\255\246\344\271\240-\344\270\200/image-20200225140606895.png" differ diff --git "a/2020/02/25/Oracle\347\263\273\345\210\227\345\255\246\344\271\240-\344\270\200/image-20200225140804868.png" "b/2020/02/25/Oracle\347\263\273\345\210\227\345\255\246\344\271\240-\344\270\200/image-20200225140804868.png" new file mode 100644 index 0000000..8f00309 Binary files /dev/null and "b/2020/02/25/Oracle\347\263\273\345\210\227\345\255\246\344\271\240-\344\270\200/image-20200225140804868.png" differ diff --git "a/2020/02/25/Oracle\347\263\273\345\210\227\345\255\246\344\271\240-\344\270\200/image-20200225141806309.png" "b/2020/02/25/Oracle\347\263\273\345\210\227\345\255\246\344\271\240-\344\270\200/image-20200225141806309.png" new file mode 100644 index 0000000..a702b27 Binary files /dev/null and "b/2020/02/25/Oracle\347\263\273\345\210\227\345\255\246\344\271\240-\344\270\200/image-20200225141806309.png" differ diff --git "a/2020/02/25/Oracle\347\263\273\345\210\227\345\255\246\344\271\240-\344\270\200/image-20200225141901711.png" "b/2020/02/25/Oracle\347\263\273\345\210\227\345\255\246\344\271\240-\344\270\200/image-20200225141901711.png" new file mode 100644 index 0000000..ee048e7 Binary files /dev/null and "b/2020/02/25/Oracle\347\263\273\345\210\227\345\255\246\344\271\240-\344\270\200/image-20200225141901711.png" differ diff --git "a/2020/02/25/Oracle\347\263\273\345\210\227\345\255\246\344\271\240-\344\270\200/image-20200225142136582.png" "b/2020/02/25/Oracle\347\263\273\345\210\227\345\255\246\344\271\240-\344\270\200/image-20200225142136582.png" new file mode 100644 index 0000000..53fa43f Binary files /dev/null and "b/2020/02/25/Oracle\347\263\273\345\210\227\345\255\246\344\271\240-\344\270\200/image-20200225142136582.png" differ diff --git "a/2020/02/25/Oracle\347\263\273\345\210\227\345\255\246\344\271\240-\344\270\200/image-20200225143308994.png" "b/2020/02/25/Oracle\347\263\273\345\210\227\345\255\246\344\271\240-\344\270\200/image-20200225143308994.png" new file mode 100644 index 0000000..25fd58a Binary files /dev/null and "b/2020/02/25/Oracle\347\263\273\345\210\227\345\255\246\344\271\240-\344\270\200/image-20200225143308994.png" differ diff --git "a/2020/02/25/Oracle\347\263\273\345\210\227\345\255\246\344\271\240-\344\270\200/image-20200225143446828.png" "b/2020/02/25/Oracle\347\263\273\345\210\227\345\255\246\344\271\240-\344\270\200/image-20200225143446828.png" new file mode 100644 index 0000000..50cf5f2 Binary files /dev/null and "b/2020/02/25/Oracle\347\263\273\345\210\227\345\255\246\344\271\240-\344\270\200/image-20200225143446828.png" differ diff --git "a/2020/02/25/Oracle\347\263\273\345\210\227\345\255\246\344\271\240-\344\270\200/image-20200225143714410.png" "b/2020/02/25/Oracle\347\263\273\345\210\227\345\255\246\344\271\240-\344\270\200/image-20200225143714410.png" new file mode 100644 index 0000000..b5a9c26 Binary files /dev/null and "b/2020/02/25/Oracle\347\263\273\345\210\227\345\255\246\344\271\240-\344\270\200/image-20200225143714410.png" differ diff --git "a/2020/02/25/Oracle\347\263\273\345\210\227\345\255\246\344\271\240-\344\270\200/image-20200225145319695.png" "b/2020/02/25/Oracle\347\263\273\345\210\227\345\255\246\344\271\240-\344\270\200/image-20200225145319695.png" new file mode 100644 index 0000000..ec02f94 Binary files /dev/null and "b/2020/02/25/Oracle\347\263\273\345\210\227\345\255\246\344\271\240-\344\270\200/image-20200225145319695.png" differ diff --git "a/2020/02/25/Oracle\347\263\273\345\210\227\345\255\246\344\271\240-\344\270\200/image-20200225145447644.png" "b/2020/02/25/Oracle\347\263\273\345\210\227\345\255\246\344\271\240-\344\270\200/image-20200225145447644.png" new file mode 100644 index 0000000..1700035 Binary files /dev/null and "b/2020/02/25/Oracle\347\263\273\345\210\227\345\255\246\344\271\240-\344\270\200/image-20200225145447644.png" differ diff --git "a/2020/02/25/Oracle\347\263\273\345\210\227\345\255\246\344\271\240-\344\270\200/image-20200225145609209.png" "b/2020/02/25/Oracle\347\263\273\345\210\227\345\255\246\344\271\240-\344\270\200/image-20200225145609209.png" new file mode 100644 index 0000000..e15bd2c Binary files /dev/null and "b/2020/02/25/Oracle\347\263\273\345\210\227\345\255\246\344\271\240-\344\270\200/image-20200225145609209.png" differ diff --git "a/2020/02/25/Oracle\347\263\273\345\210\227\345\255\246\344\271\240-\344\270\200/image-20200225145653505.png" "b/2020/02/25/Oracle\347\263\273\345\210\227\345\255\246\344\271\240-\344\270\200/image-20200225145653505.png" new file mode 100644 index 0000000..e66b89e Binary files /dev/null and "b/2020/02/25/Oracle\347\263\273\345\210\227\345\255\246\344\271\240-\344\270\200/image-20200225145653505.png" differ diff --git "a/2020/02/25/Oracle\347\263\273\345\210\227\345\255\246\344\271\240-\344\270\200/image-20200225145931982.png" "b/2020/02/25/Oracle\347\263\273\345\210\227\345\255\246\344\271\240-\344\270\200/image-20200225145931982.png" new file mode 100644 index 0000000..eb5bb38 Binary files /dev/null and "b/2020/02/25/Oracle\347\263\273\345\210\227\345\255\246\344\271\240-\344\270\200/image-20200225145931982.png" differ diff --git "a/2020/02/25/Oracle\347\263\273\345\210\227\345\255\246\344\271\240-\344\270\200/index.html" "b/2020/02/25/Oracle\347\263\273\345\210\227\345\255\246\344\271\240-\344\270\200/index.html" new file mode 100644 index 0000000..8eb547c --- /dev/null +++ "b/2020/02/25/Oracle\347\263\273\345\210\227\345\255\246\344\271\240-\344\270\200/index.html" @@ -0,0 +1,212 @@ +Oracle系列学习(一) | SHYEE-PLASMA + + + + + + + + + + + + + +

Oracle系列学习(一)

之前都是一直在用MySQL,这回鸟枪换炮玩玩Oracle

+

环境:

+
    +
  1. Oracle 11g
  2. +
+

下载和安装

下载网址:https://www.oracle.com/cn/downloads/

+

选择11g,会有下载选项,两个file都要下载的。

+

image-20200225114215394

+

把两个zip解压在一个文件下,双击“setup”进行安装

+

image-20200225120405331

+

一波疯狂下一步就好了✔

+

这里安装的是桌面类,企业版

+

安装完成后会有Database Configuration Assistant,选择口令管理

+

image-20200225140230194

+

分别选择sys ,system 和scott,解锁,修改口令为”sys“,”system“,”tiger“(不带引号)。

+

image-20200225140548831

+

image-20200225140606895

+

然后点击确定,只要没输错 ,就不要管提示。

+

ok,Oracle11g就在电脑上成功安装。

+

image-20200225140804868

+

使用测试

打开sqlplus

+

image-20200225141806309

+

输入scott,口令就是tiger

+

image-20200225141901711

+

查看一下所有表

+

image-20200225142136582

+

连接到navicat

打开navicat

+

image-20200225143308994

+

新建链接+,如图配置,我这里选择的是以system链接,password就是安装的时候填的口令。

+

image-20200225143446828

+

advanced页面把SYSDBA选一下

+

image-20200225143714410

+

测试链接,连接成功!

+

image-20200225145319695

+

打开Oracle的连接,查看目录:

+

image-20200225145447644

+

打开scott,查看里面的表,当然跟刚刚查询到的是一样的

+

image-20200225145609209

+

然后是sysman里面的表(709张😵):

+

image-20200225145653505

+

system里面有156张:

+

image-20200225145931982

+

常见问题

    +
  1. 不要轻易尝试最新版。我一开始下的是最新版(19),然后一切都是常规安装,但是当时就卡在45%不动了,卡了一下午。是一个实例没有安装好,sqlplus能运行,但是navicat连不上(可能是配置问题)。最后中止安装删除D盘文件,C盘文件,注册表等。重新下的11g。
  2. +
  3. 安装过程中尽量不要在电脑上干别的事情。不知道是运气不好,还是怎么着,安装11g的时候一开始好好的,我就去搞别的事情了,但是过一会回来看,卡在60%了。又是一下午,最后无奈中止,重启安装文件,安装成功。
  4. +
  5. 如果忘记设置口令,问题不大,后期可以改。(alter user scott account unlock;)
  6. +
+
Author: SHYEE
Link: http://example.com/2020/02/25/Oracle%E7%B3%BB%E5%88%97%E5%AD%A6%E4%B9%A0-%E4%B8%80/
Copyright Notice: All articles in this blog are licensed under CC BY-NC-SA 4.0 unless stating additionally.
\ No newline at end of file diff --git "a/2020/02/25/Oracle\347\263\273\345\210\227\345\255\246\344\271\240-\344\270\200/xz.png" "b/2020/02/25/Oracle\347\263\273\345\210\227\345\255\246\344\271\240-\344\270\200/xz.png" new file mode 100644 index 0000000..b94dd5c Binary files /dev/null and "b/2020/02/25/Oracle\347\263\273\345\210\227\345\255\246\344\271\240-\344\270\200/xz.png" differ diff --git a/2020/02/25/PLSQL/index.html b/2020/02/25/PLSQL/index.html new file mode 100644 index 0000000..fb4991a --- /dev/null +++ b/2020/02/25/PLSQL/index.html @@ -0,0 +1,261 @@ +PL/SQL | SHYEE-PLASMA + + + + + + + + + + + + + + +

PL/SQL

PL/SQL是一种高级数据库程序设计语言,它是ORACLE对标准数据库语言的扩展,是PL (Procedural Language,过程语言)与SQL (Structured Query Language,结构化查询语言)结合而成的编程语言。它支持多种数据类型,如大对象和集合类型,可使用条件和循环等控制结构,可用于创建存储过程、触发器和程序包,还可以处理业务规则、数据库事件或给SQL语句的执行添加程序逻辑。另外,PL/SQL 还支持许多增强的功能,包括集合类型、面向对象的程序设计和异常处理等。

+

PL/SQL的特点

+

PL/SQL是一种可移植的高性能事务处理语言,支持SQL和面向对象编程,具有良好的性能和高效的处理能力。其特点包括以下几方面。

+

(1)支持SQL

+

通过使用SQL,用户可以轻松地操纵存储在关系数据库中的数据。PL/SQL中可以使用数据操纵命令、事务控制命令、游标控制命令、SQL函数和SQL运算符,因此可以更加灵活、有效地操纵表中的数据。

+

(2)可移植性

+

使用PLSQL编写的应用程序可移植到安装在任何操作系统和平台上的Oralce数据库服务器上。

+

(3)高性能

+

SQL是一种非过程语言,一次只能执行一条语句,在连续的语句之间没有关联。PL/SQL一次可处理整个语句块,减少了在应用程序和Oracle服务器之间进行通信所花费的时间,从而提高了性能。PL/SQL 经过编译执行,过程调用快速而高效。

+

(4)与SQL紧密集成

+

PL/SQL与SQL紧密集成,支持所有SQL数据类型,支持NULL值,支持%TYPE和%ROWTYPE属性类型,简化数据处理。

+

(5)安全性强

+

可以通过PLSQL存储过程对客户机和服务器之间的应用程序逻辑进行分隔,阻止客户机应用程序操纵敏感的Oracle数据,仅允许用户通过存储过程操纵数据,限制用户对数据的访问。

+

结构

+
1
2
3
4
5
6
7
8
[DECLARE]
-- declaration statements声明部分
BEGIN
-- executable statements可执行部分
[EXCEPTION]
--exception statements异常处理部分
END

+ +

用一个完整的PL/SQL块实现查询雇员号为7934的雇员信息。

+
1
2
3
4
5
6
7
8
9
Declare
p_sal number(7,0);
P_comm number(7,0);
Begin
select sal,comm into P_sal,p_comm from emp where empno=7934;
Exception
When no_data_found Then
Dbms_output.put_line('员工号不存在');
End;
+ +

声明常量或变量

+
1
2
3
4
<变量常量名>[CONSTANT]<数据类型>[NOT NULL][:=IDEFAULT<初始值>];
--例如:
total constant number: =100;
v_name varchar2 (10) ;
+ +

①变量名和常量名必须以字母AZ开头,不区分大小写,其后面可跟-一个或多个字母、数字(09)、特殊字符($、#或_ ),长度不能超过30个字符,变量名和常量名中不能有空格。

+

②CONSTANT是声明常量的关键字,只在声明常量时使用。

+

③每一个变量或常量都有一个特定的数据类型。

+

④每个变量或常量声明占- -行, 行尾使用分号结束。

+

⑤常量必须在声明时赋值。变量在声明时可以不赋值,如果变量在声明时没有赋初值,那么PL/SQL语言自动为其赋值NULL。若在变量声明中使用了NOT NULL, 则表示该变量是非空变量,即必须在声明时给该变量赋初值,否则会出现编译错误。在PLSQL程序中,变量值是可以改变的,而常量的值不能改变。变量的作用域是从声明开始到PL/SQL程序块结束。

+
1
2
3
4
5
6
7
--①%TYPE:引用变量和数据库列的数据类型。例如:
empcode emp.empno%TYPE;
--该语句声明了变量empcode,其数据类型与表emp中的empno列数据类型相同。
--②%ROWTYPE:表示表、视图或游标的完整一行的记录类型。 例如:
emp_ex emp%ROWTYPE;
--该语句声明了变量emp ex,它可以用于存储从emp中提取的记录。

+ +

编写 PL/SQL程序,使用%TYPE和%ROWTYPE声明变量,用于查
询雇员号及雇员信息。

+
1
2
3
4
5
6
7
8
9
10
SQL>set serverout on
declare
empcode emp.empno%type;
emp_ex emp%ROWTYPE;
begin
select empno into empcode from emp where ename= 'SMITH';
select * into emp_ex from emp where ename ='ALLEN';
dbms_output.put_line('员工SMITH的雇员号为: '||empcode);
dbms_output.put_line('员工ALLEN的雇员信息为:'||'雇员号'||emp_ex.empno||' '||'工作职位'||emp_ex.job||'薪水'||emp_ex.sal);
end;
+ +

记录类型

+

PL/SQL记录是由- -组相关的记录成员组成的,记录通常用来表示对应数据库表中的一行。使用PL/SQL 记录时应自定义记录类型和记录变量,也可以使用%ROWTYPE属性定义记录变量。引用记录成员时,必须要以记录变量作为前缀。

+
1
2
3
4
5
6
TYPE <记录类型名> IS RECORD (
<数据项1> <数据类型>[NOTNULL[:= <表达式1>]],
<数据项2> <数据类型>[NOTNULL[:=<表达式2>]],
......
<数据项n> <数据类型>[NOTNULL[:=<表达式n>]]) ;
<记录变量名> <记录类型名> ;
+ +

将雇员信息定义为记录类型。

+
1
2
3
4
5
6
7
8
9
10
11
12
declare
type emp_record_type is record
(v_ename emp.ename%type,
v_job emp.job%type,
v_sal emp.sal%type);
emp_rec emp_record_type;
begin
select ename,job,sal into emp_rec
from emp where empno=&eno;
dbms_output.put_line(emp_rec.v_ename||':'||
emp_rec.v_job||': '||emp_rec.v_sal);
end;
+ +

PL/SQL表

+

PL/SQL表是一种比较复杂的数据结构,与数据库中的表是有区别的。数据库表是一种二维表,是以数据库表的形式存储。这里的表是一种复合数据类型,是保存在数据缓冲区中的没有特别存储次序、可以离散存储的数据结构,它可以是-维的,也可以是二维的。当使用PLSQL表时,首先必须在声明部分定义该类型和变量,然后在执行部分引用该变量。

+
1
2
TYPE <表类型名> IS TABLE OF <数据类型> INDEX BY BINARY_INTEGER;
<表变量名><表类型名>;
+ +

索引表类型的定义。

+
1
2
3
4
5
6
7
8
9
DECLARE
TYPE ename_table_type IS TABLE OF emp.ename%TYPE
INDEX BY BINARY_INTEGER;
Ename_table ename_table_type;
BEGIN
SELECT ename INTO ename_table(1) FROM emp
WHERE empno= 7902;
Dbms_output.put_line('员工名:'|| ename_table(1));
END;
+ +

数组

+

数组也是一种复合类型,和表类似,与表不同的是声明了-一个数组,就确定了数组中元素的数目。同时,数组存储时,其元素的次序是固定且连续的,而且索引变量从1开始一直到其定义的最大值为止。

+
1
2
TYPE <数组类型名> IS VARRAY (<MAX_SIZE>) OF <数据类型>;
<表变量名><表类型名> ;
+ +

NULL

+
1
NULL;
+ +

赋值

+
1
<variable>:= <expression> ;
+ +

对变量赋值的两种方法。

+
1
2
3
4
5
6
7
8
declare
v_job varchar2(10);
v_sal number;
begin
v_job:='CLERK';
select max(sal) into v_sal from emp where job=v_job;
dbms_output.put_line(v_sal);
end;
+ +

IF…THEN

+

F…THEN..ELSE

+

F..THEN..ELSIF

+

通过IF条件控制语句为不同部门的员工增加工资

+
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
DECLARE
v_deptno emp.deptno%type;
v_empno emp.empno%type;
v_sal number(6,2);
BEGIN
v_empno:=&no;
SELECT deptno,sal INTO v_deptno,v_sal FROM emp WHERE empno= v_empno;
IF v_deptno =10 THEN
UPDATE emp SET sal=v_sal+100 WHERE empno=v_empno;
ELSIF v_deptno =20 THEN
UPDATE emp SET sal=v_sal+200 WHERE empno=v_empno;
ELSIF v_deptno =30 THEN
UPDATE emp SET sal=v_sal+300 WHERE empno=v_empno;
ELSE
UPDATE emp SET sal=v_sal+400 WHERE empno=v_empno;
END IF;
END;
+ +

CASE

+

带选择器按值比较的CASE语句

+
1
2
3
4
5
6
7
CASE选择器
WHEN表达式1THEN执行语句1;
WHEN表达式2 THEN执行语句2;
...
WHEN表达式N THEN 执行语句N;
ELSE执行语句N+1;
END CASE;
+ +

通过CASE条件控制语句为不同部门的员工增加工资。

+
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
DECLARE
v_deptno emp.deptno%type;
v_empno emp.empno%type;
v_sal number(6,2);
BEGIN
v_empno:= &no;
SELECT deptno,sal INTO v_deptno,v_sal FROM emp WHERE empno= v_empno;
CASE v_deptno
When 10 THEN
UPDATE emp SET sal=v_sal+ 100 WHERE empno= v_empno;
When 20 THEN
UPDATE emp SET sal=v_sal+300 WHERE empno= v_empno;
When 30 THEN
UPDATE emp SET sal=v_sal+300 WHERE empno= v_empno;
When 40 THEN
UPDATE emp SET sal=v_sal+300 WHERE empno= v_empno;
ELSE
Dbms_output.put_line('不存在该部门!');
END CASE;
END;
+ +

不带选择器按条件比较的CASE语句

+
1
2
3
4
5
6
CASE
WHEN条件表达式1 THEN执行语句l;
WHEN条件表达式2 THEN执行语句2;
WHEN条件表达式N THEN执行语句N;
[ELSE执行语句N+1;]
END CASE;
+ +

LOOP

+
1
2
3
4
5
LOOP
statements;
...
EXIT [WHEN condition];
END LOOP;
+ +

使用LOOP循环依次输出1~5的立方数。

+
1
2
3
4
5
6
7
8
9
DECLARE
i number:=1;
BEGIN
LOOP
Dbms_output.put_line(i ||'的立方为'|| i*i*i);
i:=i+1;
EXIT WHEN i>5;
END LOOP;
END;
+ +

while

+
1
2
3
4
5
WHILE condition LOOP
Statementl;
Statement2;
...
END LOOP;
+ +

使用WHILE循环依次输出1~5的立方数。

+
1
2
3
4
5
6
7
8
DECLARE
i number:=1;
BEGIN
WHILE i<=5 LOOP
Dbms_output.put_line(i||'的立方为'|| i*i*i);
i:=i+1;
END LOOP;
END;
+ +

FOR

+
1
2
3
FOR counter IN [REVERSE] start_rang...end_range LOOP
statements;
END LOOP;
+ +

使用FOR循环依次输出1~5的立方数。

+
1
2
3
4
5
6
7
DECLARE
i number:=1;
BEGIN
FOR i in 1..5 LOOP
Dbms_output.put_line(i ||'的立方为'|| i*i*i);
END LOOP;
END;
+ + + +
Author: SHYEE
Link: http://example.com/2020/02/25/PLSQL/
Copyright Notice: All articles in this blog are licensed under CC BY-NC-SA 4.0 unless stating additionally.
\ No newline at end of file diff --git "a/2020/02/26/CentOS7-3\345\256\211\350\243\205MySQL8/image-20200226230721735.png" "b/2020/02/26/CentOS7-3\345\256\211\350\243\205MySQL8/image-20200226230721735.png" new file mode 100644 index 0000000..0e6894d Binary files /dev/null and "b/2020/02/26/CentOS7-3\345\256\211\350\243\205MySQL8/image-20200226230721735.png" differ diff --git "a/2020/02/26/CentOS7-3\345\256\211\350\243\205MySQL8/index.html" "b/2020/02/26/CentOS7-3\345\256\211\350\243\205MySQL8/index.html" new file mode 100644 index 0000000..3f8bf93 --- /dev/null +++ "b/2020/02/26/CentOS7-3\345\256\211\350\243\205MySQL8/index.html" @@ -0,0 +1,208 @@ +CentOS7.3安装MySQL8 | SHYEE-PLASMA + + + + + + + + + + + + +

CentOS7.3安装MySQL8

这得追溯到刚过完年那会儿,现在想想都心酸。

+ + +

环境:

+

CentOS7.3

+

千万别装最新版的MySQL8!

我亲测,去了官网下了最新版的安装文件,很开心的装结果装到一半,依赖版本不够,装新依赖版本,然后牵扯出其他依赖版本不够。崩溃🤢🤢🤢

+

目前比较稳妥的版本应该是8.0.13

+

删掉自带的数据库

在安装MySQL之前先要把CentOS自带的mariadb,如果不卸载的话,在下面的安装中会报错。

+

查看mariadb版本
rpm -qa | grep mariadb

+

卸载mariadb
rpm -e mariadb-libs-5.5.56-2.el7.x86_64 --nodeps

+

去官网找Archives

下载网址:https://dev.mysql.com/downloads/mysql/

+

下载历史版本网址:https://downloads.mysql.com/archives/community/

+

选择红帽,然后 version就是8.0.13,你要够大胆可以尝试稍微新一点的版本,但是我装8.0.19就失败了。

+

下下来名字大概是mysql-8.0.13-1.el7.x86_64.rpm-bundle.tar字样,那说明咱俩下到了同一个版本👍

+

安装

解压

tar -xvf mysql-8.0.13-1.el7.x86_64.rpm-bundle.tar

+

解压以后差不多是这么几个文件

+
1
2
3
4
5
6
7
8
mysql-community-client-8.0.17-1.el7.x86_64.rpm 
mysql-community-common-8.0.17-1.el7.x86_64.rpm
mysql-community-devel-8.0.17-1.el7.x86_64.rpm
mysql-community-embedded-compat-8.0.17-1.el7.x86_64.rpm
mysql-community-libs-8.0.17-1.el7.x86_64.rpm
mysql-community-libs-compat-8.0.17-1.el7.x86_64.rpm
mysql-community-server-8.0.17-1.el7.x86_64.rpm
mysql-community-test-8.0.17-1.el7.x86_64.rpm
+ +
必须安装(注意安装顺序‼)

我只装了必须安装

+
1
2
3
4
rpm -ivh mysql-community-common-8.0.13-1.el7.x86_64.rpm
rpm -ivh mysql-community-libs-8.0.13-1.el7.x86_64.rpm
rpm -ivh mysql-community-client-8.0.13-1.el7.x86_64.rpm
rpm -ivh mysql-community-server-8.0.13-1.el7.x86_64.rpm
+ +
非必须安装(注意安装顺序‼)
1
2
3
4
rpm -ivh mysql-community-libs-compat-8.0.13-1.el7.x86_64.rpm
rpm -ivh mysql-community-embedded-compat-8.0.13-1.el7.x86_64.rpm
rpm -ivh mysql-community-devel-8.0.13-1.el7.x86_64.rpm
rpm -ivh mysql-community-test-8.0.13-1.el7.x86_64.rpm
+ +

安装过程中可能出现很多错误,但基本上逃不过就是依赖问题,诸如:

+
1
2
error:
Failed dependencies:
+ +

然后缺什么装什么就好 yum install.

+

初始化

装好之后就是初始化了,跟再Windows平台类似。

+
初始化数据库
1
mysqld --initialize --console
+ +
目录授权,这一步不能放过嗷

chown -R mysql:mysql /var/lib/mysql/

+
启动MySQL服务

systemctl start mysqld

+
停止MySQL服务

service mysqld stop

+
查看初始密码

cat /var/log/mysqld.log

+
登录

mysql -u root -p,输入初始密码

+
更改初始密码

alter USER 'root'@'localhost' IDENTIFIED BY '新密码(必须包含:数字大小写字母特殊字符,长度最小为8位)';

+
MySQL8授权

对于8的MySQL,新建用户并授权写在一句会报错。所以

+
1
2
3
mysql> CREATE USER 'username'@'%' IDENTIFIED BY 'yourpassword';          //创建账户
mysql> GRANT ALL PRIVILEGES ON *.* TO 'username'@'%' WITH GRANT OPTION; //赋予权限
mysql> flush privileges; //刷新权限
+ +
配置navicat

配置如下:(username和password写成刚授权的用户的)

+ + +

连接测试,如果正常配置,没有手残敲错是会成功的。👍

+

小结

MySQL装了我两天左右,主要还是版本问题,以及依赖关系,以及centOS不推荐用MySQL等等等等。。那一阵心态都崩了,现在想想还好。人家TX云都给的centOS7.6的,为啥阿里还活在7.3?!?!?

+
Author: SHYEE
Link: http://example.com/2020/02/26/CentOS7-3%E5%AE%89%E8%A3%85MySQL8/
Copyright Notice: All articles in this blog are licensed under CC BY-NC-SA 4.0 unless stating additionally.
\ No newline at end of file diff --git "a/2020/02/26/mybatis/MyBatis\347\263\273\345\210\227-\344\272\214/index.html" "b/2020/02/26/mybatis/MyBatis\347\263\273\345\210\227-\344\272\214/index.html" new file mode 100644 index 0000000..7e38c6f --- /dev/null +++ "b/2020/02/26/mybatis/MyBatis\347\263\273\345\210\227-\344\272\214/index.html" @@ -0,0 +1,192 @@ +MyBatis系列(二) | SHYEE-PLASMA + + + + + + + + + + + + + +

MyBatis系列(二)

mapper动态代理(MyBatis接口开发)

原则:约定优于配置
+ +

配置方式:

+

​ abc.xml

+

硬编码方式

+

​ abc.java

+

约定:默认值就是myProject

+

与传统配置的不同之处:省略掉statement,即根据约定直接定位出sql语句。

+

约定:

+
1
2
3
4
5
/*
* 1.方法名和mapper.xml文件中的id值相同
* 2.方法名的输入参数和mapper.xml文件中的标签parameterType类型一致
* 3.方法的返回值和mapper.xml文件中的resultType一致
*/
+ +

接口和mapper一一对应:namespace的value=接口的全类名

+

构建接口

所以说新建一个接口,根据前一个篇的mapper.xml的文件基础上改,注:我这里是把接口建在了mapper包下

+
1
2
3
4
5
Student queryStudentBystuNum(int stuno);
List<Student> queryAllStudent();
int addStudent(Student student);
int upDateStuByNo(Student student);
int deleteStuByNo(int stuno);
+ +

注意这里的接口要遵循上面的约定。

+

更改xml文件

再mapper.xml file中,namespace也应该改成接口的名字

+
1
<mapper namespace="top.eshyee.mapper.StudentMapper">
+ +

接下来,就是修改测试类,曾经使用的statement的地方,目前就不用使用了。

+

使用接口

这次拿删除学生举例,首先要从session中获取到这个接口,使用getMapper方法。然后从这个接口中要我刚刚写的那个删除的方法deleteStuByNo(),这里我写死删除no为3的 倒霉孩子

+
1
2
3
4
5
6
7
8
Reader reader = Resources.getResourceAsReader("conf.xml");
SqlSessionFactory sessionfactory = new SqlSessionFactoryBuilder().build(reader);
SqlSession session = sessionfactory.openSession();
StudentMapper stuMapper = session.getMapper(StudentMapper.class);
int count = stuMapper.deleteStuByNo(3);
session.commit();
System.out.println("删除成功," + count + "行受影响");
session.close();
+ +

测试一下

3号学生被删除并想你抛了一行log🌚

+ + +

总结

约定相对于配置来说,出错率更少了,因为不用写statement,而是通过调用接口去实现xml的id的调用,对于写statement的String容易手残的老哥来说,是不错的选择。

+
Author: SHYEE
Link: http://example.com/2020/02/26/mybatis/MyBatis%E7%B3%BB%E5%88%97-%E4%BA%8C/
Copyright Notice: All articles in this blog are licensed under CC BY-NC-SA 4.0 unless stating additionally.
\ No newline at end of file diff --git "a/2020/02/26/mybatis/MyBatis\347\263\273\345\210\227-\344\272\214/test.png" "b/2020/02/26/mybatis/MyBatis\347\263\273\345\210\227-\344\272\214/test.png" new file mode 100644 index 0000000..3172c93 Binary files /dev/null and "b/2020/02/26/mybatis/MyBatis\347\263\273\345\210\227-\344\272\214/test.png" differ diff --git "a/2020/02/28/mybatis/MyBatis\347\263\273\345\210\227-\344\272\214.5/index.html" "b/2020/02/28/mybatis/MyBatis\347\263\273\345\210\227-\344\272\214.5/index.html" new file mode 100644 index 0000000..31d7061 --- /dev/null +++ "b/2020/02/28/mybatis/MyBatis\347\263\273\345\210\227-\344\272\214.5/index.html" @@ -0,0 +1,190 @@ +MyBatis系列(二.5) | SHYEE-PLASMA + + + + + + + + + + + + +

MyBatis系列(二.5)

关于一些优化🍔

+ + +

数据库连接配置

config.xml中如果配置了很多的东西,这时在想去更改数据库配置的一些参数显得尤为麻烦,这是可以新建一个properties来写一些kv对,再在config中使用<properties>标签来传值貌似就会简化一部分操作。

+

因此在src下新建一个db.properties文件。如下配置:

+
1
2
3
4
driver=oracle.jdbc.driver.OracleDriver
url=jdbc:oracle:thin:@127.0.0.1:1521:ORCL
username=scott
password=tiger
+ +

config.xml中添加

+
1
<properties resource="db.properties"></properties>
+ +

数据源中配置:

+
1
2
3
4
<property name="driver" value="${driver}" />
<property name="url" value="${url}" />
<property name="username" value="${username}" />
<property name="password" value="${password}" />
+ +

如此,每次想对数据源做更改的时候只需改变kv对即可。

+

mybatis的全局参数设置更改

谨慎更改👨‍🔧

+
1
2
3
<settings>
<setting name="" value=""/>
</settings>
+ +

设置别名

top.eshyee.entity.Student太长了🤦‍♀️,想要改别名。

+

(大小写不敏感)

+

选择两种方式:

+
设置单个别名
1
2
3
<typeAliases>
<typeAlias type="top.eshyee.entity.Student" alias="student"/>
</typeAliases>
+ +
批量设置别名
1
2
3
<typeAliases>
<package name="top.eshyee.entity"/>
</typeAliases>
+ +

还有一些内置别名。

+

小节

怎么方便怎么来呗🏊‍♀️

+
Author: SHYEE
Link: http://example.com/2020/02/28/mybatis/MyBatis%E7%B3%BB%E5%88%97-%E4%BA%8C.5/
Copyright Notice: All articles in this blog are licensed under CC BY-NC-SA 4.0 unless stating additionally.
\ No newline at end of file diff --git "a/2020/03/01/\344\270\212\346\265\267\344\271\213\350\241\214/IMG_20200105_180845.jpg" "b/2020/03/01/\344\270\212\346\265\267\344\271\213\350\241\214/IMG_20200105_180845.jpg" new file mode 100644 index 0000000..8e1ddc4 Binary files /dev/null and "b/2020/03/01/\344\270\212\346\265\267\344\271\213\350\241\214/IMG_20200105_180845.jpg" differ diff --git "a/2020/03/01/\344\270\212\346\265\267\344\271\213\350\241\214/IMG_20200105_234729.jpg" "b/2020/03/01/\344\270\212\346\265\267\344\271\213\350\241\214/IMG_20200105_234729.jpg" new file mode 100644 index 0000000..4b3ea66 Binary files /dev/null and "b/2020/03/01/\344\270\212\346\265\267\344\271\213\350\241\214/IMG_20200105_234729.jpg" differ diff --git "a/2020/03/01/\344\270\212\346\265\267\344\271\213\350\241\214/index.html" "b/2020/03/01/\344\270\212\346\265\267\344\271\213\350\241\214/index.html" new file mode 100644 index 0000000..8fd9a18 --- /dev/null +++ "b/2020/03/01/\344\270\212\346\265\267\344\271\213\350\241\214/index.html" @@ -0,0 +1,184 @@ +上海之行 | SHYEE-PLASMA + + + + + + + + + + + + +

上海之行

2020年的第一站✈,想想已经过去将近三个月了。

+

1月5日

7:00 庆阳

已经准备了半个月的好心情被这一场雪搞的无比焦急。本以为五号,我可以睡个懒觉(✈是22点西安–>上海的),然后,去买点路上吃的零食🍪🍪,再然后坐上去西安的大巴…

+

结果,因为不稳定的高速封路的消息,使得我忙活了一早上,在退票与改票之间徘徊。

+

14:20 庆阳

终于,我还是在14点的时候赶上了一趟正规的赶往咸阳机场的大巴。🤦‍♂️

+

18:08 咸阳机场

经历了漫长的奔波,我还是顺利的赶到了咸阳机场,顺利的取出机票,顺利值机。

+ + +

21:20 候机区

飞机没有晚点,顺利登机。

+

22:00 321客机

起飞🚀🚀🚀

+

1月6日

00:25 浦东机场

成功抵达✌并开始对上海进行为期四天的市事访问。

+ + +

1:55 静安区海友酒店

下了飞机,就接到了在上海工作的学长的电话。真的是超级热情,从飞机出口处一直聊到机场出口处,正巧碰到了即将发车的通宵巴士,花了¥24把我送到了静安寺那片,然后又坐出租(¥18,1.2公里),到了海友酒店楼下,一个比想象中的破了一些的楼。但是上楼上去发现酒店还算是比较新,因为当时看到近期才装修就订了。订的大床,虽然房间很小,但是设施很全,一个人住是真的够了。

+

然后就睡觉了💤兴奋得根本睡不着,我也根本不知道我几点睡的。

+

6:40 静安区

我莫名奇妙的醒得这么早。而且,超级累😫。

+

但还是起来了,最近的地铁口里我大概1km,之前看到知乎上关于上海旅游有一个共同的point,办一张地铁三日卡💳,¥45 三日随便坐,真的是旅游党的福音,因为我还没有驾照,没法搞租车,所以基本的出行方式就是 腿 hello单车 交通车 和地铁。

+

10:00 地铁站

当售票员说 只收现金的时候 我人都啥了。

+

然后转身看到有售公交卡的机子,就顺便办了一张公交卡(旅游版)¥50,貌似不可退,满足了我的收藏欲,接着又下了当地的一个叫Metro大都会的App。

+
+

要睡觉了,迟点更新~

+
Author: SHYEE
Link: http://example.com/2020/03/01/%E4%B8%8A%E6%B5%B7%E4%B9%8B%E8%A1%8C/
Copyright Notice: All articles in this blog are licensed under CC BY-NC-SA 4.0 unless stating additionally.
\ No newline at end of file diff --git "a/2020/03/02/mybatis/MyBatis\347\263\273\345\210\227-\344\270\211/index.html" "b/2020/03/02/mybatis/MyBatis\347\263\273\345\210\227-\344\270\211/index.html" new file mode 100644 index 0000000..82aa352 --- /dev/null +++ "b/2020/03/02/mybatis/MyBatis\347\263\273\345\210\227-\344\270\211/index.html" @@ -0,0 +1,203 @@ +MyBatis系列(三) | SHYEE-PLASMA + + + + + + + + + + + + +

MyBatis系列(三)

关于类型处理器和resultmap

+ + +

类型处理器(类型转换器)

    +
  1. MyBatis自带一些常见的类型处理器

    +
  2. +
  3. 也可以自定义Mybatis类型处理器

    +
  4. +
+

JAVA 数据类型 –数据库(数据类型)

+

比如:

+

实体类 Student :Boolean stuSex true:男 /false:女

+

表中Student : number stuSex 1:男 / 0:女

+

自定义类型转换器

假设

我要在Student表里面新建一个性别列 男生用1 表示 女生用0表示(number类型),

+

此时实体类中我男生用的true 女生用的false(Boolean,仅仅是举个例子)。

+

数据类型不匹配此时数据类型不匹配。

+

创建类型转换器

需要实现TypeHandler接口 此接口有一个实现类 BaseTypeHandler

+

因此实现转换器有两种方法 实现 接口TypeHandler 和 继承BaseTypeHandler(简单)

+

所以这里采用后者,去extendthis method。

+
准备工作

新建一个Boolean的属性 叫做stuSex 。

+

private Boolean stuSex形成get set方法

+
转换器

新建一个转换器继承BaseTypeHandler,编译器会自动生成三个方法

+
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
//	get是DB数据-->java数据
public Boolean getNullableResult(ResultSet rs, String columnName) throws SQLException {
return rs.getInt(columnName)==1?true:false;
}

public Boolean getNullableResult(ResultSet rs, int columnIndex) throws SQLException {
return rs.getInt(columnIndex)==1?true:false;
}

public Boolean getNullableResult(CallableStatement cs, int columnIndex) throws SQLException {
return cs.getInt(columnIndex)==1?true:false;
}

// set是java数据-->DB数据
public void setNonNullParameter(PreparedStatement ps, int i, Boolean parameter, JdbcType jdbcType) throws SQLException {

if(parameter) {
ps.setInt(i, 1);
}else {
ps.setInt(i, 0);
}
}
+ +

其中,

+

ps:PreparedStatement对象
i:PreparedStatement对象操作的参数的位置
parameter:Java值
jdbcType:jdbc操作的数据类型

+

这里用到了三元运算符,想起了之前一个写个人网站用到的一个三元运算符🤦‍♂️(更)。

+
conf配置

在config中加上转换器

+
1
2
3
<typeHandlers>
<typeHandler handler="转换器类名" javaType="Boolean" jdbcType="INTEGER"/>
</typeHandlers>
+ +

这样就算是好了 测试一下

+
mapper配置

使用了转换器的查询
1如果类中属性和表中的字段类型都能合理识别(String-varchar2),则可以使用resultType resultType=”top.eshyee.entity.Student”
否则(boolean-integer)使用resultMap
2如果类中的属性名和表中的字段名都能够合理识别(stuNo-stuno)则可以使用resultType
否则(id-stuno)使用resultMap

+
1
2
3
4
5
6
7
8
9
10
<select id="queryStudentBystuNumConverter" resultMap="studentResult" parameterType="int">
select * from student where stuno= #{stuno}
</select>
<resultMap type="top.eshyee.entity.Student" id="studentResult">
<id property="stuNo" column="stuno"/>
<result property="stuName" column="stuname"/>
<result property="stuAge" column="stuage"/>
<result property="graName" column="graname"/>
<result property="stuSex" column="stusex" javaType="boolean" jdbcType="INTEGER"/>
</resultMap>
+ +

resultMap

resultMap可以实现两个功能:
1 类型转换
2 属性-字段名之间的映射关系

+

分为主键id和非主键result
如果实体类中的属性跟数据库中那个的字段名叫法不一样,从下面的映射关系中也可以更改 。

+

这样就好了,可以在test.java中测试一下了。🥐

+

总结

以前用过别的方法来转换数据库数据与java数据 但是这个更系统一些吧。

+

希望这次不要再出个3.5了。🐷

+
Author: SHYEE
Link: http://example.com/2020/03/02/mybatis/MyBatis%E7%B3%BB%E5%88%97-%E4%B8%89/
Copyright Notice: All articles in this blog are licensed under CC BY-NC-SA 4.0 unless stating additionally.
\ No newline at end of file diff --git "a/2020/03/02/\345\205\263\344\272\216\345\234\237\350\261\206\360\237\245\224/gaitubao_IMG_20200302_181523.jpg" "b/2020/03/02/\345\205\263\344\272\216\345\234\237\350\261\206\360\237\245\224/gaitubao_IMG_20200302_181523.jpg" new file mode 100644 index 0000000..58d163f Binary files /dev/null and "b/2020/03/02/\345\205\263\344\272\216\345\234\237\350\261\206\360\237\245\224/gaitubao_IMG_20200302_181523.jpg" differ diff --git "a/2020/03/02/\345\205\263\344\272\216\345\234\237\350\261\206\360\237\245\224/gaitubao_IMG_20200302_182828.jpg" "b/2020/03/02/\345\205\263\344\272\216\345\234\237\350\261\206\360\237\245\224/gaitubao_IMG_20200302_182828.jpg" new file mode 100644 index 0000000..d70a23e Binary files /dev/null and "b/2020/03/02/\345\205\263\344\272\216\345\234\237\350\261\206\360\237\245\224/gaitubao_IMG_20200302_182828.jpg" differ diff --git "a/2020/03/02/\345\205\263\344\272\216\345\234\237\350\261\206\360\237\245\224/index.html" "b/2020/03/02/\345\205\263\344\272\216\345\234\237\350\261\206\360\237\245\224/index.html" new file mode 100644 index 0000000..b73c093 --- /dev/null +++ "b/2020/03/02/\345\205\263\344\272\216\345\234\237\350\261\206\360\237\245\224/index.html" @@ -0,0 +1,174 @@ +关于土豆🥔 | SHYEE-PLASMA + + + + + + + + + + + + +

关于土豆🥔

关于🥔啊~

+ + +

如何刮土豆才能刮的干净?

+ +

使劲刮

+

如何切土豆才能把土豆切断?

+ +

使劲切

+

😎

+
Author: SHYEE
Link: http://example.com/2020/03/02/%E5%85%B3%E4%BA%8E%E5%9C%9F%E8%B1%86%F0%9F%A5%94/
Copyright Notice: All articles in this blog are licensed under CC BY-NC-SA 4.0 unless stating additionally.
\ No newline at end of file diff --git "a/2020/03/03/Oracle\347\263\273\345\210\227\345\255\246\344\271\240-\344\272\214/image-20200312085626885.png" "b/2020/03/03/Oracle\347\263\273\345\210\227\345\255\246\344\271\240-\344\272\214/image-20200312085626885.png" new file mode 100644 index 0000000..dd1c359 Binary files /dev/null and "b/2020/03/03/Oracle\347\263\273\345\210\227\345\255\246\344\271\240-\344\272\214/image-20200312085626885.png" differ diff --git "a/2020/03/03/Oracle\347\263\273\345\210\227\345\255\246\344\271\240-\344\272\214/index.html" "b/2020/03/03/Oracle\347\263\273\345\210\227\345\255\246\344\271\240-\344\272\214/index.html" new file mode 100644 index 0000000..b316b65 --- /dev/null +++ "b/2020/03/03/Oracle\347\263\273\345\210\227\345\255\246\344\271\240-\344\272\214/index.html" @@ -0,0 +1,188 @@ +Oracle系列学习(二) | SHYEE-PLASMA + + + + + + + + + + + + + +

Oracle系列学习(二)

上一篇的补充 + +

一些小科普

+

服务

主要常用的两个服务

+

OracleServiceORCL:主服务
Oracle***home1TNSListener TNS监听服务

+

TNS(透明网络底层)

+

如果没有监听服务,通过NetCA添加

+

链接

本地连接

sys as sysdba:以管理员身份链接

+

scott/tiger:以scott身份链接

+
远程连接

sqlplus sys/123456@//localhost:1521/orcl as sysdba

+

或者

+

sqlplus sys/orcl123@orcl as sysdba

+

tns标识符

sqlplus sys/orcl123@orcl as sysdba

+

D:\app\EShyee\product\11.2.0\dbhome_1\NETWORK\ADMIN有一个tns标识文件

+

其中有

+
1
2
3
4
5
6
7
8
ORCL =
(DESCRIPTION =
(ADDRESS = (PROTOCOL = TCP)(HOST = localhost)(PORT = 1521))
(CONNECT_DATA =
(SERVER = DEDICATED)
(SERVICE_NAME = orcl)
)
)
+ +

创建多个数据库

通过DBCA创建其他的数据库

+

当电脑里有多个数据库的时候,用SQL plus去链接 default都是链接ORCL,可以在注册表里改

+

链接其他的数据库就用sqlplus sys/orcl123@//localhost: 1521/其他数据库名 as sysdba;

+

数据库和数据库实例

完整的数据库通常由两部分组成:Oracle数据库和数据库实例。

+

1)数据库是一系列物理文件的集合(数据文件,控制文件,联机日志,参数文件等) ;
2) Oracle数据库实例则是一组Oracle后台进程/线程以及在服务器分配的共享内存区。
在启动Oracle数据库服务器时,实际上是在服务器的内存中创建一个Oracle实例(即在服务器内存中
分配共享内存并创建相关的后台内存) , 然后由这个Oracle数据库实例来访问和控制磁盘中的数据文
件。

+

数据库监听

一个重要的数据库服务进程,用来支持外部应用和远程连接数据库。

+

关系图示

Author: SHYEE
Link: http://example.com/2020/03/03/Oracle%E7%B3%BB%E5%88%97%E5%AD%A6%E4%B9%A0-%E4%BA%8C/
Copyright Notice: All articles in this blog are licensed under CC BY-NC-SA 4.0 unless stating additionally.
\ No newline at end of file diff --git a/2020/03/04/LinearTable/index.html b/2020/03/04/LinearTable/index.html new file mode 100644 index 0000000..c202a5a --- /dev/null +++ b/2020/03/04/LinearTable/index.html @@ -0,0 +1,234 @@ +LinearTable | SHYEE-PLASMA + + + + + + + + + + + + + + + + +

LinearTable

线性表–顺序表

+

顺序表

定义

用顺序存储的方式实现线性表顺序存储。把逻辑上相邻的元素存储在位置上也相邻的存储单元中,元素之间的关系由存储单元的邻接关系来体现。

+
1
2
3
a1->a2->a3->a4->a5
在内存中也是
a1-a2-a3-a4-a5
+ +

每个数据元素都是一样大的,即如果a1存放的位置为LOC(L),a2的位置=LOC(L)+数据元素的大小,a3的位置=LOC(L)+2*数据元素的大小…。

+

sizeof()

C语言中查看一个数据元素大小,使用sizeof(ElemType)。

+

例:

+
1
2
3
4
5
6
7
sizeof(int)==4B

typedef struct{
int num;
int people
} Customer;
sizeof(Customer)==8B
+ +

数据表的实现

静态分配

1
2
3
4
5
6
#define MaxSize 10 //定义最大长度

typedef struct{
Elemtype data [MaxSize]; //用静态的"数组"存放数据元素
int length; //顺序表的当前长度
}SqList;//顺序表的类型定义
+ +

这里就相当于一上来就定好了这么一个数据元素,内存为其分配连续的存储空间,大小为10.

+

初始化

+
1
2
3
4
5
6
7
8
9
10
11
12
//初始化
void InitList(SqList &L){
for(int i =0;i<MaxSize;i++)
L.data[i]=0;//各个元素初始化(根据需要不一定置零),如果不进行这一行代码,可能会使元素中存入之前内存遗留的"脏数据".
L.length=0;//长度标识置零
}
int main(){
SqList L;//声名这个表
InitList(L);//初始化这个表

return 0
}
+ +

缺点:存储空间不可变!

+

动态分配

1
2
3
4
5
6
7
#define InitSize 10 //定义最大长度

typedef struct{
Elemtype *data; //指示动态分配数组的指针
int MaxSize;//顺序表的最大容量
int length; //顺序表的当前长度
}SeqList;//顺序表的类型定义
+ +
malloc \free

c语言中用于申请内存空间和释放内存空间的函数

+

c++中是使用new 和delete

+

malloc 会返回一个地址

+

L.data=(ElemType *)malloc(sizeof(ElemType) * InitSize);

+

比如 如果Elemtype为int,则上行代码为L.data=(int *)malloc(sizeof(int)* InitSize);,然后把返回的这个指针赋值给data。

+

这里sizeof就是查看这数据元素的长度 然后成上大小,就完成这个内存空间的分配 然后返回地址,然后取出地址的指针赋给data。

+

具体例子

+
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
#include <stdlib.h>
#define InitSize 10 //定义最大长度

typedef struct{
int *data; //指示动态分配数组的指针
int MaxSize;//顺序表的最大容量
int length; //顺序表的当前长度
}SeqList;//顺序表的类型定义
//初始化
void InitList(SeqList &L){
//用malloc函数申请一篇连续的存储空间
L.data=(int *)malloc(sizeof(int)* InitSize);
L.length=0;
L.MaxSize=InitSize;
}
//增加动态数组的长度
void IncreaseSize(SeqList &L,int len){
int *p=L.data;
L.data=(int *)malloc(sizeof(int)* (L.MaxSize+len));
for(int i=0;i<L.length;i++){
L.data[i]=p[i];//将数据复制到新区域
}
L.MaxSize=L.MaxSzie+len;//顺序表最大长度增加len
free(p);//释放原来的内存空间
}
int main(){
SeqList L;
InitList(L);//初始化
IncreaseSize(L,5);//增加动态数据的长度
return 0;
}
+ +

在增加长度的过程中,会先申请一个新的空间(增加后的大小),然后把之前存放的数据元素放到新空间里,然后释放旧空间。

+

特点

随机访问,可以在O(1)时间内找到第i个元素。data[i-1]

+

存储密度搞,每个节点只存储数据元素

+

拓展容量不方便(即使采用动态存储分配的方式实现,拓展长度的时间复杂度也比较高)

+

插入、删除操作不方便,需要移动大量元素

+

顺序表的基本操作

插入

ListInsert(&L ,i,e):插入操作,在表L中的第i个位置上插入指定元素e。

+
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
#define MaxSize 10
typedef struct{
int data[MaxSize];
int length;
}SqList;
bool ListInsert(SqList &L ,int i,int e){
if (i < 1 || i > L.length + 1)//判断i的范围是否有效
return false;
if (L.length >= MaxSize)//当前存储空间已满,不能插入
return false;
for(int j=L.length;j>=i;j--)
L.data[j]=L.data[j-1];//将第i个元素及之后的元素后移
L.data[i-1]=e;//在位置i处放入e
L.length++;//长度+1
return true;
}
int main(){
SqList L;
InitList(L);
ListInsert(L,3,3);//往第三个位置插入数据元素3
return 0;
}
+ +
时间复杂度

最好情况:新元素插入到表尾,不需要移动元素

+

i=n+1,循环0次,最好时间复杂度=O(1)

+

最坏情况:新元素插入到表头,需要把原有的n个元素向后移动

+

i=1,循环n次,最坏时间复杂度=O(n)

+

平均情况:新元素随即插入任何位置,平均概率为p=1/(n+1)

+

则平均循环次数为n/2,化简后,平均时间复杂度=O(n)

+

删除

ListDelete(&L ,i,&e):删除操作。删除表L中第i个位置的元素,并用e返回删除元素的值。

+
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
#define MaxSize 10
typedef struct{
int data[MaxSize];
int length;
}SqList;
bool ListDelete(SqList &L ,int i,int &e){
if (i < 1 || i > L.length + 1)//判断i的范围是否有效
return false;
e=L.data[i-1];//将被删除的元素复制给e
for(int j=i;j<L.length;j++)
L.data[j-1]=L.data[j];//将第i个元素及之后的元素后前移
L.length--;//长度-1
return true;
}
int main(){
SqList L;
InitList(L);
int e=-1;//用变量e把删除的元素带回来
if(ListDelete(L,3,e))
printf("删除成功,删除元素为%d\n",e);
else
printf("删除失败,位序i不合法\n");
return 0;
}
+ +
时间复杂度

与插入操作的类似且相反

+

最好情况 删除表尾元素 O(1)

+

最坏情况 删除表头元素O(n)

+

平均情况 随机位置删除 O(n/2)即O(n)

+
注意

位序i与数组小标为i的区别(前者从1开始,后者从0开始)

+

按位查找

GetElem(L,i):按位查找操作,获取L中第i个位置的元素的值。

+
静态分配方式

直接选择第i个元素就行了

+
1
2
3
4
5
6
7
8
#define MaxSize 10 
typedef struct{
Elemtype data [MaxSize];
int length;
}SqList;
ElemType GetElem(SqList L,int i){
return L.data[i-1];
}
+ +
动态分配方式

也是直接选择第i个位置就行

+

data是个指针,data[i]返回的即内存中data开始到往后sizeof(ElemType)个字节 的数据。

+

即如果sizeof(ElemType)=3B,data指向123,data[i]= 123+i*3的内容。

+
1
2
3
4
5
6
7
8
9
#define InitSize 10 
typedef struct{
Elemtype *data;
int MaxSize;
int length;
}SeqList;
ElemType GetElem(SqList L,int i){
return L.data[i-1];
}
+ +
时间复杂度

O(1)

+

按值查找

LocateElem(L,e):按值查找操作,在表中查找给定关键字值的元素。

+
1
2
3
4
5
6
7
8
9
10
11
12
13
#define InitSize 10 
typedef struct{
Elemtype *data;
int MaxSize;
int length;
}SeqList;
int LocateElem(SqList L,int e){
for(int i=0;i<L.length;i++){
if(L.data[i]==e)
return i+1;//返回的是位序
return 0;
}
}
+ +
时间复杂度

最好情况 要查找的元素在第一个位置 最好时间复杂度=O(1)

+

最坏情况 要查找的元素在最后一个位置 最坏时间复杂度=O(n)

+

平均情况 要查找的元素在随机位置 平均时间复杂度=O((n+1)/2)即O(n)

+

总结

还总结?要啥自行车啊🥡

+
Author: SHYEE
Link: http://example.com/2020/03/04/LinearTable/
Copyright Notice: All articles in this blog are licensed under CC BY-NC-SA 4.0 unless stating additionally.
\ No newline at end of file diff --git a/2020/03/04/MAVEN/index.html b/2020/03/04/MAVEN/index.html new file mode 100644 index 0000000..18117ab --- /dev/null +++ b/2020/03/04/MAVEN/index.html @@ -0,0 +1,191 @@ +MAVEN | SHYEE-PLASMA + + + + + + + + + + + + + + +

MAVEN

MAVEN

管理jar

+

i 增加第三方的jar

+

ii jar包之间的依赖关系

+

将项目拆分成若干个模块

+

maven 自动话构建工具

+

清理

+

编译 java-class

+

测试 针对于关键点的测试

+

报告

+

打包

+

安装

+

部署

+

安装

下载二进制压缩包

+

下载后解压,我的解压路径为D:\apache-maven-3.6.3

+

右键我的电脑打开系统,点击高级系统设置(advance),点击环境变量,在系统变量中新建一个变量,变量名MAVEN_HOME,变量值D:\apache-maven-3.6.3

+

image-20210108150437064

+

系统变量中找到path,打开添加一条%MAVEN_HOME%\bin

+

image-20210108150641400

+

测试

打开cmd

+

输入mvn -v

+

image-20210108151005405

+

配置仓库

打开D:\apache-maven-3.6.3\conf\settings.xml

+

找到localRepository

+

image-20210108152001111

+

<localRepository>/path/to/local/repo</localRepository>摘出来,改成自己的路径<localRepository>D:\maven_repo</localRepository>

+

使用

pom文件

Author: SHYEE
Link: http://example.com/2020/03/04/MAVEN/
Copyright Notice: All articles in this blog are licensed under CC BY-NC-SA 4.0 unless stating additionally.
\ No newline at end of file diff --git "a/2020/03/04/mybatis \347\274\223\345\255\230/index.html" "b/2020/03/04/mybatis \347\274\223\345\255\230/index.html" new file mode 100644 index 0000000..16f1095 --- /dev/null +++ "b/2020/03/04/mybatis \347\274\223\345\255\230/index.html" @@ -0,0 +1,212 @@ +mybatis缓存 | SHYEE-PLASMA + + + + + + + + + + + + + + + +

mybatis缓存

查询缓存

一级缓存:同一个SqlSession对象

image-20200331082951809

+

MyBatis默认开启一级缓存,如果用同样的SqlSession对象查询相同的数据,则只会在第一次查询时向数据库发送SQL语句,并将查询的结果放入到SQLSESSION中(作为缓存在) ;后续再次查询该同样的对象时则直接从缓存中查询该对象即可(即省略了数据库的访问)。

+

二级缓存

+

Mybatis自带二级缓存: [同一个namespace]生成的mapper对象

+

MyBati s默认情况没有开启二级缓存,需要手工打开。

+

conf.xml中

+
1
2
<!-- 开启二级缓存 -->
<setting name="cacheEnable" value="true"/>
+ +

mapper中

+
1
2
<!-- 声明此namespace开启二级缓存 -->
<cache/>
+ +

异常提示:NotSerializableException可知,MyBatis的二级缓存是将对象放入硬盘文件中

+

序列化:内存->硬盘

+

反序列化:硬盘->内存

+

准备缓存的对象,必须实现了序列化接口( 如果开启的缓存Namespace="top.eshyee.mapper.StudentMapper" 可知序列化对象为Student,因此需要将Student序列化(序 列化Student类,以及Student的级联属性、和父类)

+

触发将对象写入二级缓存的时机: SqlSession对象的close()方法

+

回顾: namespace的值 就是接口的全类名(包名.类名) ,通过接口可以产生代理对象(Mapper对象)

+

–>namespace决定了Mapper对象的产生

+

结论:只要产生的xxxMapper对象来自于同一个namespace,则这些对象共享二级缓存。

+

如果是同一个SqISession对象进行多次相同的查询,则直接进入一级缓存查询;

+

image-20200331084348373

+

如果不是同一个SqISession对象进行多次相同的查询(但是均来自同一个namespace)则进入二级缓存查询

+

如果一个namespace, 如果有多个xxMapper. xml的namespace值相同, 则通过这些xxxMapper. xml产生的xxMapper,仍然共享二级缓存。

+

禁用:

+

在需要禁用的select标签中的usecache属性改为false

+

清理:与清理一级缓存的方法相同,一般执行增删改时会清理掉缓存 ,设计的原因是为了防止脏数据

+

commit();

+

commit会清理一级和二级缓存;但是清理二级缓存时,不能是查询自身的commit()

+

改标签

+

在select标签中设置flushCache= "true"

+

命中率:
1 :0% 0.0

+

2:50% 0.5

+

3:2/3 0.666

+

4:3/4 0.75

+

三方提供的二级缓存:

+

ehicache、memcache

+

要想整合三方提供的二级缓存(或者自定义二级缓存) ,必须实现org.apache.ibatis.cache.Cache接口,该接口的默认实现类是PerpetualCache

+

整合ehcache二级缓存:

+

Ehcache-core.jar
mybatis- Ehcache.jar
slf4j-api.jar

+

编写ehcache配置文件Ehcache.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
<ehcache xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:noNamespaceSchemaLocation="ehcache.xsd" updateCheck="true"
monitoring="autodetect" dynamicConfig="true">
<!-- 当二级缓存的对象超过内存限制时(缓存对象的个数>maxElements InMemory
),存放入的硬盘路径 -->
<diskStore path="D:\Ehcache" />
<!-- maxElementsInMemory:设置在内存中缓存对象的个数
maxElementsOnDisk:设置在硬盘中缓存对象的个数
eternal: 设置缓存是否永远不过期
overflowToDisk:当内存中缓存的对象个数超过maxElementsInMemory的时候,是否转移到硬盘中
timeToIdleSeconds:当2次访问超过该值的时候,将缓存对象失效
timeToliveSeconds:一个缓存对象最多存放的时间(生命周期)
diskExpiryThreadIntervalSeconds:设置每隔多长时间,通过一个线程来清理硬盘中的缓存
memoryStioreEvictionPolicy: 当超过缓存对象的最大值时,处理的策略 LRU,FIFO,LFU
-->

<defaultCache

maxElementsInMemory="1000"
maxElementsOnDisk="1000000"
eternal="false"
overflowToDisk="false"
timeToIdleSeconds="100"
timeToLiveSeconds="100"
diskExpiryThreadIntervalSeconds="120"
memoryStoreEvictionPolicy="LRU">
</defaultCache>

</ehcache>
+ +

配置mapper

+
1
2
3
4
<cache type= "org.mybatis.caches.ehcache.EhcacheCache">
<property name= "maxELementsInMemory" value= "2000" />
可以覆盖掉默认值
</cache>
+ +
Author: SHYEE
Link: http://example.com/2020/03/04/mybatis%20%E7%BC%93%E5%AD%98/
Copyright Notice: All articles in this blog are licensed under CC BY-NC-SA 4.0 unless stating additionally.
\ No newline at end of file diff --git "a/2020/03/05/PSTN\345\222\214\344\273\245\345\244\252\347\275\221\344\272\222\350\277\236\345\256\236\351\252\214/index.html" "b/2020/03/05/PSTN\345\222\214\344\273\245\345\244\252\347\275\221\344\272\222\350\277\236\345\256\236\351\252\214/index.html" new file mode 100644 index 0000000..c60e49f --- /dev/null +++ "b/2020/03/05/PSTN\345\222\214\344\273\245\345\244\252\347\275\221\344\272\222\350\277\236\345\256\236\351\252\214/index.html" @@ -0,0 +1,263 @@ +PSTN和以太网互连实验 | SHYEE-PLASMA + + + + + + + + + + + + + + +

PSTN和以太网互连实验

PSTN和以太网互连实验

实验内容

+

1、构建互连网,由路由器实现以太网和PSTN互连

+

2、通过路由器实现终端A和终端B之间相互通信的过程

+

image-20200403083419597

+

实验目的

+

1、验证路由器接口配置过程

+

2、验证路由器自动生成直连路由项的过程

+

3.验证连接在以太网.上的两个结点之间的IP分组传输过程

+

4、验证连接在PSTN上的两个结点之间的IP分组传输过程

+

5、验证IP分组经过不同类型传输网络传输时,封装成该传输网络对应的帧格式的过程

+

6、验证两个连接在不同类型网络上的终端之间的IP分组传输过程

+

7、验证路由器实现以太网和PSTN互连的过程

+

实验原理

+

1.路由器接口模块和IP地址配置

+
    +
  • 两个不同类型接口模块:以太网接口和PSTN网接口
  • +
  • 两个接口分别配置两个不同网络号的IP地址
  • +
+

2、路由器端口与所连接的网络终端属于同一网络,配置相同网络号IP地址

+

3、路由器接口IP地址成为连接在同一网络上的终端的默认网关地址

+

4、配置完路由器接口IP地址和子网掩码,路由器自动生成直连路由项

+

5,根据路由表实现终端A与终端B之间的通信过程

+

关键命令说明

+

1.路由器接口配置命令

+
+

Router(config)# interface FastEthernet0/0

+

全局模式下使用,进入路由器接口FastEthernet0/0的接口配置模式,其中FastEthernet表明是快速以太网接口, 0/0是接口编号。

+

Router(config-if)# ip address 192.1.1.254 255.255.255.0

+

接口配置模式下使用,为路由器接口FastEthernet0/0分配IP地址192.1.1.254和子网掩码255.255.255.0

+
+

关键命令说明

+

2.定义授权用户

+

➢授权用户:允许对路由器进行某种指定操作的远程用户

+

➢身份鉴别:当远程用户对路由器进行指定操作时,路由器需要对远程用户进行身份鉴别:需要提供定义授权用户时指定的用户名和口令。

+

➢定义授权用户命令

+

Router(config)#username aaa password bbb

+

全局模式下定义了-个用户名为aaa口令为bbb的授权用户。

+

静态路由项配置实验

实验内容

+

1、构建网络,路由器实现不同类型网络互连

+
    +
  • 单独的以太网、单独的无线局域网
  • +
  • 由AP实现互连的以太网和无线局域网
  • +
+

image-20200403084542715

+

2、配置静态路由项

+

通过配置静态路由项指出通

+

往非直连网络的传输路径

+

实验目的

+

1、验证路由器无线局域网接口的配置过程

+

2、验证AP和路由器之间的区别

+

3.验证静态路由项配置过程

+

4、验证路由器重新封装IP分组的过程

+

5、验证建立IP分组传输路径的过程

+

实验原理
1、AP和路由器工作原理

+

AP互连的以太网和无线局域网构成扩展服务集,分配相同的网络地址

+

路由器不同接口连接不同的网络,分配不同的网络地址

+

2、直连路由项生成原理

+
    +
  • 指出通往直连网络的传输路径
  • +
  • 配置接口IP地址和子网掩码后自动生成
  • +
+

3、静态路由项生成原理

+
    +
  • 指出通往非直连网络的传输路径
  • +
  • 需要手工配置每一项静态路由项
  • +
+

关键命令

+

1.无线局域网安全机制配置命令

+

➢Router(config)#dot11 ssid 123456

+

定义一个SSID=123456的无线局域网,井进入该无线局域网配置模式,即SSID配置模式

+

➢Router(config-ssid)#authentication open

+

终端与该无线局域网建立关联时使用:开放系统鉴别机制

+

➢Router(onfigssid)#no authentication network-eap

+

无线局域网在确定终端是否是授权终端时,不使用EAP鉴别机制

+

➢Router(config-ssid)# authentication key-management wpa

+

指定WPA作为该无线局域网的鉴别和密钥管理机制

+

➢Router(config-ssid)#wpa-psk ascii 1234567890

+

指定ASCII码形式的字符串1234567890为预共享密钥wpa-psk

+

➢Router(configssid)#guest mode

+

指定无线局域网支持guest模式。guest模式下:

+
    +
  • 一是信标帧中包含该无线局域网的SSID ;
  • +
  • 二是如果该无线局域网接收到用通配符作为SSID的探测请求帧,发送探测响应帧中包含该SSID.
  • +
+

2.无线接口配置命令

+

➢Router(config)#interface Dot11Radio0/3/0

+

进入路由器接口Dot11Radio0/3/0的接口配置模式,包含信息:

+

一是接口类型Dot11Radio ,表明该接口是无线局域网接口

+

二是接口编号为0/3/0

+

➢Router(config-if)#no shutdown

+

开启该接口

+

➢Router(config-if)#ip address 192.1.2.254 255.255.255.0

+

为路由器接口分配IP地址192.1.2.254和子网掩码255.255.255.0

+

➢Router(config-if)#ssid 123456

+

配置SSID为123456

+

➢Router(configif)#encryption mode ciphers aes-ccm

+

命令的作用是指定密码体制aes-ccm

+

RIPv1配置实验

Author: SHYEE
Link: http://example.com/2020/03/05/PSTN%E5%92%8C%E4%BB%A5%E5%A4%AA%E7%BD%91%E4%BA%92%E8%BF%9E%E5%AE%9E%E9%AA%8C/
Copyright Notice: All articles in this blog are licensed under CC BY-NC-SA 4.0 unless stating additionally.
\ No newline at end of file diff --git "a/2020/03/05/python\345\205\245\351\227\250/index.html" "b/2020/03/05/python\345\205\245\351\227\250/index.html" new file mode 100644 index 0000000..7548497 --- /dev/null +++ "b/2020/03/05/python\345\205\245\351\227\250/index.html" @@ -0,0 +1,277 @@ +python入门 | SHYEE-PLASMA + + + + + + + + + + + + + +

python入门

python入门

输出

打印的几个语法

+
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
#输出数字 字符串
print(1)
print(1.1)
print('hape')
#输出运算结果
print(1+1)

#输出到文件
fp=open('D:/Shyee.txt','a+')
print('??!!??ioio',file=fp)
fp.close()
#不换行输出
print('hi','I','am','Shyee')
#转移字符实现换行
print("转移\n字符")

#\t 空一格子表位(默认为四个字符,及占四个字符的整数倍,详细参考存储)
#\r 回车(覆盖之前的输出)
#\b 退格
+ +
1
2
#原字符,在输出之前加一个r或者R,使得转义字符不起作用
print(R'原字\n符')
+ +
1
2
3
4
5
6
#赋值
name='shyee'
print(name)
print('标识',id(name))
print('类型',type(name))
print('值',name)
+ +

运行结果:

+

shyee
标识 1739219025136
类型 <class ‘str’>
值 shyee

+

0b 二进制
0o 八进制
0x 十六进制

+
1
2
3
4
#小数加减法提高精度
print(1.1+2.2)
from decimal import Decimal
print(Decimal('1.1')+Decimal('2.2'))
+ +

运行结果

+

3.3000000000000003
3.3

+

open参数

+

类型转换

+

->string:str()

+
1
print('I am '+str(16)+' years old')
+ +

运行结果

+

I am 16 years old

+

->int :int()

+

字符串为小数串不能转为int,必须是数字串(整数)

+

->float :float()

+

输入

1
2
3
#输入
key=input("输入前的提示语")
print(key)
+ +
1
2
#输入两个整数,求整数的和
print(int(input("第一个整数"))+int(input("第二个整数")))
+ +

运行结果

+

第一个整数1
第二个整数1
2

+

加+ 减- 乘* 除/

+

整除//(一正一负的整除结果都是向下取整)

+

取余% (余数=被除数-除数*商)

+

求幂运算** (2**3,2的3次方)

+

赋值

+
1
2
3
4
a=b=c=20;
print(a,id(a))
print(b,id(b))
print(c,id(c))
+ +

运行结果:

+

20 140718458633888
20 140718458633888
20 140718458633888

+

解包赋值

+
1
2
q,w,e=1,2,3
print(q,w,e)
+ +

运行结果:

+

1 2 3

+

实现swap函数

+
1
2
3
#实现交换
q,w,e=w,e,q
print(q,w,e)
+ +

运行结果:

+

2 3 1

+

“==”与”is”

+

== 比较的是value值

+

is比较的是标识(id)

+
1
2
3
4
5
6
7
8
9
10
11
12
a=10
b=10
print(a==b)
print(a is b)

arr1=[1,2,3,4]
arr2=[1,2,3,4]
print(arr1==arr2)
print(arr1 is arr2)
print(id(arr1))
print(id(arr2))
print(arr1 is not arr2)
+ +

运行结果:

+

True
True
True
False
2293512569096
2293512569480
True

+

not 取反

+
1
2
3
#not 取反
print(a==b)
print(not a==b)
+ +

运行结果:

+

True
False

+

in和not in

+
1
2
3
4
#in&not in
print('s' in 'shyee')
print('l' not in 'shyee')
print(a in arr2)
+ +

运行结果:

+

True
True
False

+

按位与&按位或

+
1
2
3
4
5
6
print(4&8)
# 4:0100
# 8:1000
#按位与为0000
print(4|8)
#按位或为1100
+ +

运行结果:0 12

+

左移<<和右移>>

+
1
2
3
4
5
6
7
8
9
10
11
12
13
14
a=4
print(a<<1)
while a<100:
a=a<<1
print(a)
a=4
# print(a>>1)
while a>0:
a=a>>1
print(a)
#正数右移到最后为0
#负数右移到最后为-1
a=-4
print(a>>1>>1>>1)
+ +

运行结果:

+

8
8
16
32
64
128

+

2
1
0

+

-1

+

优先级:算数运算符>移位运算符(包括& 、|)>比较运算符>与或运算符>赋值运算符

+

0的布尔值为false none的bool为false

+

‘ ‘的布尔值为false(空的数据结构都是false)

+
1
2
3
if 90<=int(input('输入数值'))<=100:
print('数字在90~100之间')
print('数值在90~100之间' if 90<=int(input('输入数值'))<=100 else '数值不在90~100之间')
+ +

运行结果:

+

输入数值99
数字在90100之间
输入数值60
数值不在90
100之间

+

pass在while中与continue的区别,break还是那个break

+
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
i=10
while i>0:
i-=1
print(i)
pass
print("pass")
print('----continue----')
i=10
while i>0:
i-=1
print(i)
continue
print("continue")
print('----break----')
i=10
while i>0:
i-=1
print(i)
break
print("break")
+ +

运行结果:

+

9
pass
8
pass
7
pass
6
pass
5
pass
4
pass
3
pass
2
pass
1
pass
0
pass
—-continue—-
9
8
7
6
5
4
3
2
1
0
—-break—-
9

+

range

+
1
2
3
4
5
6
#range
print(range(10))
print(list(range(10)))
print(list(range(1,10)))#默认步长为1
print(list(range(1,10,2)))#步长为2
print(2 in list(range(1,10,2)))
+ +

运行结果:

+

range(0, 10)
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
[1, 2, 3, 4, 5, 6, 7, 8, 9]
[1, 3, 5, 7, 9]
False

+

for in

+
1
2
for i in 'shyee':
print(i)
+ +

运行结果:

+

s
h
y
e
e

+
1
2
for _ in range(4):
print('Shyee')
+ +

运行结果:

+

Shyee
Shyee
Shyee
Shyee

+

求1~100之间的偶数和

+
1
2
3
4
5
6
n=0
c=0
for _ in range(1,101,2):
n+=2
c+=n
print(c)
+ +

运行结果:2550

+

找到100~999之间的水仙花数

+
1
2
3
4
5
i=100
for _ in range(100,1000):
if ((i%10)**3+(int(i/10)%10)**3+(int(i/100)%10)**3)==i:
print(i,'是水仙花数')
i += 1
+ +

运行结果:

+

153 是水仙花数
370 是水仙花数
371 是水仙花数
407 是水仙花数

+
Author: SHYEE
Link: http://example.com/2020/03/05/python%E5%85%A5%E9%97%A8/
Copyright Notice: All articles in this blog are licensed under CC BY-NC-SA 4.0 unless stating additionally.
\ No newline at end of file diff --git "a/2020/03/05/python\345\205\245\351\227\2502/index.html" "b/2020/03/05/python\345\205\245\351\227\2502/index.html" new file mode 100644 index 0000000..a2e94d1 --- /dev/null +++ "b/2020/03/05/python\345\205\245\351\227\2502/index.html" @@ -0,0 +1,366 @@ +python入门2 | SHYEE-PLASMA + + + + + + + + + + + + + +

python入门2

python入门2

+

列表、字典、元组、集合

+
+

列表

1
2
3
4
5
6
# 列表
# 使用方括号定义列表
list1=['s','h','y','ee',123]
# 使用内置函数
list2=list(['s','h','y','ee',123])
print(list1,list2)
+ +

运行结果:

+

[‘s’, ‘h’, ‘y’, ‘ee’, 123] [‘s’, ‘h’, ‘y’, ‘ee’, 123]

+
1
print(list1[0],list1[-2])
+ +

运行结果:

+

s ee

+
获取索引
1
2
# 获取索引
print(list1.index('ss'),list1.index(123))
+ +

报错:

+

ValueError: ‘ss’ is not in list

+
1
2
list3=['s','ss',123,4,123,'ss','4']
print(list3.index(123))#只返回相同元素中的第一个元素的索引
+ +

运行结果:

+

2

+
规定查找区间
1
2
#规定查找区间
print(list3.index(123,3,5))
+ +

运行结果:4

+
查找索引区间超过列表长度
1
2
#查找索引区间超过列表长度
print(list3[10])
+ +

报错:IndexError: list index out of range

+
设置步长
1
2
3
4
5
6
7
8
9
10
11
#设置步长
list4=[10,20,30,40,50,60,70,80,90,100]
#start:stop:step
print(list4[2:6:2])
#省略步长,默认为1
print(list4[2:6])
print(list4[2:6:])
#start默认从0开始
print(list4[:6:])
# stop默认为最后一个
print(list4[::])
+ +

运行结果:

+

[30, 50]
[30, 40, 50, 60]
[30, 40, 50, 60]
[10, 20, 30, 40, 50, 60]
[10, 20, 30, 40, 50, 60, 70, 80, 90, 100]

+
添加新的元素
append
1
2
3
4
5
# 添加新的元素
list5=[1,2,3,4]
print('添加新元素前',list5,id(list5))
list5.append(6)
print('添加新元素之后',list5,id(list5))
+ +

运行结果:

+

添加新元素前 [1, 2, 3, 4] 2862260696008
添加新元素之后 [1, 2, 3, 4, 6] 2862260696008

+
extend
1
2
3
4
5
6
7
list5=[1,2,3,4]
print('添加新元素前',list5,id(list5))
list5.append(list4)
print('append添加新元素之后',list5,id(list5))
list5=[1,2,3,4]
list5.extend(list4)
print('extend添加新元素之后',list5,id(list5))
+ +

运行结果:

+

添加新元素前 [1, 2, 3, 4] 2213139002312
append添加新元素之后 [1, 2, 3, 4, [10, 20, 30, 40, 50, 60, 70, 80, 90, 100]] 2213139002312
extend添加新元素之后 [1, 2, 3, 4, 10, 20, 30, 40, 50, 60, 70, 80, 90, 100]

+
insert
1
2
3
list5=[1,2,3,4]
list5.insert(2,10)
print('insert添加新元素之后',list5)
+ +

运行结果:insert添加新元素之后 [1, 2, 10, 3, 4]

+
在某位置添加很多元素
1
2
3
4
5
6
7
8
list5=[1,2,3,4]
# list在任意位置添加很多元素
list5[1:]=list2
print('list添加新元素之后',list5)
#将第二个元素替换为另一个列表中的所有元素
list5=[1,2,3,4]
list5[1:2]=list2
print('list添加新元素之后',list5)
+ +

运行结果:

+

list添加新元素之后 [1, ‘s’, ‘h’, ‘y’, ‘ee’, 123]
list添加新元素之后 [1, ‘s’, ‘h’, ‘y’, ‘ee’, 123, 3, 4]

+
移除元素
remove
1
2
3
4
5
6
print('list添加新元素之后',list5)
# remove 移除出现的第一个元素
list6=[1,2,3,3,4,4,5,6,1]
list6.remove(3)
print(list6)
list6.remove(111)
+ +

运行结果:[1, 2, 3, 4, 4, 5, 6, 1]

+

运行报错:ValueError: list.remove(x): x not in list

+
pop
1
2
3
# 移除索引为n的元素
list6.pop(3)
print(list6)
+ +

运行结果:[1, 2, 3, 4, 5, 6, 1]

+
1
2
# 如果不知名参数,pop将删除列表中最后一个元素
print(list6.pop())
+ +

运行结果:1

+
切片
1
2
3
4
# 用切片删除多个元素
print(list6)
list6[1:3]=[]
print(list6)
+ +

运行结果:

+

[1, 2, 3, 4, 5, 6]
[1, 4, 5, 6]

+
del&clear
1
2
3
4
5
6
# clear:清空列表
list6.clear()
print(list6)
# delete:删除列表
del list6
print(list6)
+ +

运行结果:

+

[]

+

NameError: name ‘list6’ is not defined

+
修改
1
2
3
4
5
6
# 修改
list7=[1,23,4,3,2]
list7[1]=1
print(list7)
list7[1:3]=11,2,3
print(list7)
+ +

运行结果:

+

[1, 1, 4, 3, 2]
[1, 11, 2, 3, 3, 2]

+
排序
1
2
3
4
5
6
7
8
9
# sort默认升序
list7.sort()
print(list7)
# 降序排序
list7.sort(reverse=True)
print(list7)
# sorted
list9=sorted(list7,reverse=True)
print('list7:',list7,'list8:',list8,'list9:',list9)
+ +

运行结果:

+

[1, 2, 2, 3, 3, 11]
[11, 3, 3, 2, 2, 1]
list7: [11, 3, 3, 2, 2, 1] list8: [1, 2, 2, 3, 3, 11] list9: [11, 3, 3, 2, 2, 1]

+
生成
1
2
3
4
5
6
# 列表生成
lst=[i*i for i in range(1,10)]
print(lst)
# 产生元素为2,4,6,8,10的列表
lst=[i*2 for i in range(1,6)]
print(lst)
+ +

运行结果:

+

[1, 4, 9, 16, 25, 36, 49, 64, 81]
[2, 4, 6, 8, 10]

+

字典

创建字典

使用{}创建
1
2
3
4
# 字典的创建方式
# 使用{}创建
dict1={"张三":13,"李四":15,"王五":20,"赵六":""}
print(dict1,type(dict1))
+ +

运行结果:

+

{‘张三’: 13, ‘李四’: 15, ‘王五’: 20, ‘赵六’: ‘’} <class ‘dict’>

+
使用内置函数
1
2
3
# 使用内置函数dict
student=dict(name='Shyee',age=22)
print(student)
+ +

运行结果:

+

{‘name’: ‘Shyee’, ‘age’: 22}

+

创建空字典

+
1
d={}
+ +

获取字典中的元素

1
2
3
4
5
# 获取字典元素
print(dict1['张三'],dict1['jojo'])
# 或者
print(dict1.get('李四'),dict1.get('jojo'))
print(dict1.get('jojo',30))
+ +

运行结果:

+

13
KeyError: 'jojo'

+

15 None

+

30

+

判断在不在字典里

1
2
3
# 判断在不在字典里
print('李四' in dict1)
print('李四' not in dict1)
+ +

运行结果:

+

True
False

+

删除字典中的元素

1
2
3
# 删除字典中的元素
del dict1['王五']
print(dict1)
+ +

运行结果:

+

{‘张三’: 13, ‘李四’: 15, ‘赵六’: ‘’}

+
1
2
3
#清空字典
dict1.clear()
print(dict1)
+ +

运行结果:

+

{}

+

新增

1
2
3
# 新增
dict1['jojo']=20
print(dict1)
+ +

运行结果:

+

{‘jojo’: 20}

+

修改

1
2
3
# 修改
dict1['jojo']=1
print(dict1)
+ +

运行结果:

+

{‘jojo’: 1}

+

获取所有的key

1
2
3
4
5
dict1={"张三":13,"李四":15,"王五":20,"赵六":""}
# 获取所有的key
print(dict1.keys())
# 转成列表
print(list(dict1.keys()))
+ +

运行结果:

+

dict_keys([‘张三’, ‘李四’, ‘王五’, ‘赵六’])
[‘张三’, ‘李四’, ‘王五’, ‘赵六’]

+

获取所有的值

1
2
3
# 获取所有的值
print(dict1.values())
print(list(dict1.values()))
+ +

运行结果:

+

dict_values([13, 15, 20, ‘’])
[13, 15, 20, ‘’]

+

获取所有的键值对

1
2
3
# 获取所有的键值对
print(dict1.items())
print(list(dict1.items())[0][0])
+ +

dict_items([(‘张三’, 13), (‘李四’, 15), (‘王五’, 20), (‘赵六’, ‘’)])
张三

+

字典的遍历

1
2
3
# 字典的遍历
for item in dict1:
print(item,dict1[item],dict1.get(item))
+ +

运行结果:

+

张三 13 13
李四 15 15
王五 20 20
赵六

+

字典的特点

· 字典中的所有元素都是一个key-value对, key不允许重复, value可以重复

+

· 字典中的元素是无序的

+

· 字典中的key必须是不可变对象

+

· 字典也可以根据需要动态地伸缩

+

· 字典会浪费较大的内存,是一种使用空间换时间的数据结构

+

内置函数zip()

1
2
3
4
5
6
# 内置函数zip()
# 用于将可迭代的对象作为参数,将对象中对应的元素打包成一个元组,然后返回由这些元组组成的列表
items=['A','B','C','D']
codes=[27,28,29,30,31,32]
d={item.upper():code for item,code in zip(items,codes)}
print(d)
+ +

运行结果:

+

{‘A’: 27, ‘B’: 28, ‘C’: 29, ‘D’: 30}

+

元组

不可变序列与可变序列

不变可变序:字符串、元组
不变可变序列:没有增、删,改的操作
可变序列:列表、字典
可变序列:可以对序列执行增、删、改操作,对象地址不发生更改

+

元组的创建

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
# 元组的创建
t=('a',1,'1',('a',1,'1'),['l'],{'a'})
t1='a',1,'1',('a',1,'1'),['l'],{'a'}
print(t)
print(t1,type(t1))
t2=tuple(('a',1,'1',('a',1,'1'),['l'],{'a'}))
print(t2,type(t2))
# 如果元组当中只包含一个元素,用括号创建元组的时候应加逗号
s1=('ss')
s2='ss'
t1=('tt',)
t2='tt',
print("s1:",s1,type(s1))
print("s2:",s2,type(s2))
print("t1:",t1,type(t1))
print("t2:",t2,type(t2))
# 创建空元组
et=()
et1=tuple()
print("et:",et,type(et))
print("et1:",et1,type(et1))

#运行结果:
('a', 1, '1', ('a', 1, '1'), ['l'], {'a'})
('a', 1, '1', ('a', 1, '1'), ['l'], {'a'}) <class 'tuple'>
('a', 1, '1', ('a', 1, '1'), ['l'], {'a'}) <class 'tuple'>
s1: ss <class 'str'>
s2: ss <class 'str'>
t1: ('tt',) <class 'tuple'>
t2: ('tt',) <class 'tuple'>
et: () <class 'tuple'>
et1: () <class 'tuple'>
+ +

元组的修改

1
2
3
4
# 如果对元组中的值进行修改
t=('a',1,'1',('a',1,'1'),['l'],{'a'})
t[3]=1
print(t[3])
+ +

报错:TypeError: 'tuple' object does not support item assignment

+
1
2
3
# 向t[4]添加元素
t[4].append(3)
print(t[4],id(t[4]))
+ +

运行结果:

+

[‘l’] 2052995427208
[‘l’, 3] 2052995427208

+

元组的遍历

1
2
3
# 元组的遍历
for item in t:
print(item)
+ +

a
1
1
(‘a’, 1, ‘1’)
[‘l’, 3]
{‘a’}

+

集合

集合的创建

1
2
s={1,1,2,2,3,3,"a","a",'a',{'s'},{'s'}}
print(s)
+ +

报错:TypeError: unhashable type: 'set'

+
1
2
s={1,1,2,2,3,3,"a","a",'a'}
print(s)
+ +

运行结果:{1, 2, 3, ‘a’}

+

不能重复

+

内置函数set

1
2
3
4
5
6
7
# 内置函数set
s=set(range(6))
print(s)
print(set([3,4,5,""]))
print(set(([3,4,5,""])))
print(set('Python'))
print(set())
+ +

运行结果:

+

{0, 1, 2, 3, 4, 5}
{‘’, 3, 4, 5}
{‘’, 3, 4, 5}
{‘n’, ‘y’, ‘t’, ‘h’, ‘P’, ‘o’}
set()

+

集合的操作

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
# 判断
print(9 in s)
# 新增
s.add('s')
print(s)
s.update('o')
print(s)
# 删除
s.remove('a')#报错:KeyError: 'a'
print(s)
s.discard('a')#不报错也不执行
print(s)
s={1,1,2,2,3,3,"a","a",'a'}
print(s)
s.pop()
print(s)
s={1,1,2,2,3,3,"a","a",'a'}
s.clear()
print(s)
+ +

运行结果:

+

False
{0, 1, 2, 3, 4, 5, ‘s’}

+

{0, 1, 2, 3, 4, 5, ‘o’, ‘s’}

+

{‘a’, 1, 2, 3}
{1, 2, 3}
set()

+

字符串

字符串的驻留机制

1
2
3
4
a='Python'
b="Python"
c='''Python'''
print(a,id(a),b,id(b),c,id(c))
+ +

运行结果:

+

Python 2116166832240 Python 2116166832240 Python 2116166832240

+

有驻留的情况:

+

字符串的长度为0或1时·符合标识符的字符串

+

字符串只在编译时进行驻留,而非运行时

+

[-5,256]之间的整数数字

+
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
>>> s1=''
>>> s2=''
>>> s1 is s2
True
>>> s1='aa%'
>>> s2='aa%'
>>> s1==s2
True
>>> s1 is s2
False
--------------------
>>> a='abc'
>>> b='a'+'bc'
>>> c=''.join(['ab','c'])
>>> a,b,c
('abc', 'abc', 'abc')
>>> a is b
True
>>> a is c
False
+ +

sys中的intern方法强制驻留

+
1
2
3
4
5
6
>>> import sys
>>> a='asd%'
>>> b='asd%'
>>> a =sys.intern(b)
>>> a is b
True
+ +

然而pycharm对字符串进行了优化处理(会驻留)

+

注:在需要进行字符串拼接时建议使用str类型的join方法,而非+,因为join()方法是先计算出所有字符中的长度,然后再拷贝,只new一次对象,效率要比”+”效率高

+

字符串的查询

1
2
3
4
5
s='hello,hello'
print(s.index('lo'))
print(s.find('lo'))
print(s.rindex('lo'))
print(s.rfind('lo'))
+ +

运行结果:

+

3
3
9
9

+

大小写转换

1
2
3
4
5
6
7
8
9
10
11
12
s='Hello this is Shyee'
print("s:"+s,id(s))
a=s.upper()
b=s.lower()
c=s.swapcase()
d=s.capitalize()
e=s.title()
print("upper:",a,id(a))
print("lower:",b,id(b))
print("swapcase:",c,id(c))
print("capitalize:",d,id(d))
print("title:",e,id(e))
+ +

运行结果:

+

s:Hello this is Shyee 1336088248112
upper: HELLO THIS IS SHYEE 1336088256560
lower: hello this is shyee 1336088256720
swapcase: hELLO THIS IS sHYEE 1336088256800
capitalize: Hello this is shyee 1336088258240
title: Hello This Is Shyee 1336088258320

+

对齐操作

1
2
3
4
5
6
7
s='Hello this is Shyee'
print(s.center(22,'*'))#居中
print(s.center(15,'*'))#参数小于字符串长度,打印字符串
print(s.ljust(22,'-'))#第二个参数默认空格
print(s.rjust(22,"#"))
print(s.zfill(22))#默认左填零对齐
print('-123'.zfill(10))
+ +

运行结果:

+

Hello this is Shyee*
Hello this is Shyee
Hello this is Shyee—
###Hello this is Shyee
000Hello this is Shyee
-000000123

+

拆分

1
2
3
4
5
6
7
8
9
10
11
s='Hello this is Shyee'
a=s.split()#默认从左以空格分割
print(a)
a=s.split(sep='s')#指定分割符
print(a)
a=s.split(sep=' ',maxsplit=2)#指定最大分割次数
print(a)
a=s.rsplit()#从右侧
print(a)
print(s.rsplit(sep='s'))
print(s.rsplit(sep=' ',maxsplit=2))
+ +

运行结果:

+

[‘Hello’, ‘this’, ‘is’, ‘Shyee’]
[‘Hello thi’, ‘ i’, ‘ Shyee’]
[‘Hello’, ‘this’, ‘is Shyee’]
[‘Hello’, ‘this’, ‘is’, ‘Shyee’]
[‘Hello thi’, ‘ i’, ‘ Shyee’]
[‘Hello this’, ‘is’, ‘Shyee’]

+

字符串的判断

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
#判断是否是合法的标识符
print('hello,Shyee','hello,Shyee'.isidentifier())
print('hello','hello'.isidentifier())
print('中文_','中文_'.isidentifier())
print('中文_123','中文_123'.isidentifier())
print('hello Shyee','hello Shyee'.isspace())
print(" "," ".isspace(),"\t".isspace())
# 判断是否全由字母(汉字)组成
print('hello Shyee','hello Shyee'.isalpha())
print('helloShyee','helloShyee'.isalpha())
print('中文','中文'.isalpha())
# 判断是否全部是10进制的数字
print('123','123'.isdecimal())
print('123fh','123fh'.isdecimal())
# 判断是否全部有数字组成
print('123','123'.isnumeric())
print('四','四'.isnumeric())
print('ⅤⅢⅣ','ⅤⅢⅣ'.isnumeric())
# 判断是否全部是字母(汉字)和数字组成
print('123中文','123中文'.isalnum())
print('ⅤⅢⅣasd','ⅤⅢⅣasd'.isalnum())
+ +

运行结果:

+

hello,Shyee False
hello True
中文_ True
中文_123 True
hello Shyee False
True True
hello Shyee False
helloShyee True
中文 True
123 True
123fh False
123 True
四 True
ⅤⅢⅣ True
123中文 True
ⅤⅢⅣasd True

+
Author: SHYEE
Link: http://example.com/2020/03/05/python%E5%85%A5%E9%97%A82/
Copyright Notice: All articles in this blog are licensed under CC BY-NC-SA 4.0 unless stating additionally.
Announcement
等离子体实验室
Recent Post
\ No newline at end of file diff --git "a/2020/03/05/python\345\205\245\351\227\2503/index.html" "b/2020/03/05/python\345\205\245\351\227\2503/index.html" new file mode 100644 index 0000000..8e7f4ae --- /dev/null +++ "b/2020/03/05/python\345\205\245\351\227\2503/index.html" @@ -0,0 +1,186 @@ +python入门3 | SHYEE-PLASMA + + + + + + + + + + + + + +

python入门3

python入门3

image-20210129170554037

+

利用matplotlib画图

+

import matplotlib.pyplot as plt

+

plt.figure(figsize=(),dpi=) figsize:指定图的长宽 dpi: 图像的清晰度 返回fig对象

+

绘制图像 plt.plot()

+

显示图像

+

plt.show()

+
1
2
3
4
5
6
7
8
9
10
11
# 显示天气
import matplotlib.pyplot as plt

# 创建画布
plt.figure(figsize=(10,10),dpi=100)

# 绘制折线
plt.plot([1,2,3,4,5,6,7],[17,17,18,15,11,11,8])

# 显示图像
plt.show()
+ + + +

image-20210131195633439

+
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
# 自定义x y刻度

# x要显示的刻度
# plt.xticks(x,)

# y要显示的刻度
# plt.yticks(y,)

import matplotlib.pyplot as plt
import random

# 解决中文乱码问题
plt.rcParams['font.sans-serif']=['SimHei']
plt.rcParams['axes.unicode_minus']=False

# 画出温度变化图
# 准备xy坐标数据
x=range(60)
y_DongYing=[random.uniform(15,18) for i in x]

# 插入上海的数据
y_ShangHai=[random.uniform(25,28) for i in x]

# 创建画布
plt.figure(figsize=(20,8),dpi=100)

# 绘制折线图
plt.plot(x,y_DongYing,label='东营')
plt.plot(x,y_ShangHai,color='g',linestyle='--',label='上海')#线的风格

# 构造x的刻度
xTicksLabel=["11点{}分".format(i) for i in x]
# 构造y的刻度
yTicks=range(40)
# 修改x y轴坐标的刻度显示
plt.xticks(x[::5],xTicksLabel[::5])
plt.yticks(yTicks[::5])

# 添加网格显示
plt.grid(True,linestyle="--",alpha=1)#alpha:透明度

# 添加描述信息
plt.xlabel("时间")
plt.ylabel("温度")
plt.title("当地气温变化",fontsize=22)

# 图像保存
plt.savefig("D:/pictures/当地气温变化.png")

# 显示图例
plt.legend(loc='best')#等于plt.legend(loc=0)

plt.show()
+ +

当地气温变化

+

多个坐标系实现绘图

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
# 自定义x y刻度

# x要显示的刻度
# plt.xticks(x,)

# y要显示的刻度
# plt.yticks(y,)

import matplotlib.pyplot as plt
import random

# 解决中文乱码问题
plt.rcParams['font.sans-serif']=['SimHei']
plt.rcParams['axes.unicode_minus']=False

# 画出温度变化图
# 准备xy坐标数据
x=range(60)
y_DongYing=[random.uniform(15,18) for i in x]

# 插入上海的数据
y_ShangHai=[random.uniform(25,28) for i in x]

# 创建画布
fig,axes=plt.subplots(nrows=1,ncols=2,figsize=(20,8),dpi=100)

# 绘制折线图
axes[0].plot(x,y_DongYing,label='东营')
axes[1].plot(x,y_ShangHai,color='g',linestyle='--',label='上海')#线的风格


# 构造x的刻度
xTicksLabel=["11点{}分".format(i) for i in x]
# 构造y的刻度
yTicks=range(40)
#修改刻度显示
axes[0].set_xticks(x[::5])
axes[0].set_yticks(yTicks[::5])

axes[0].set_xticklabels(xTicksLabel[::5])

axes[1].set_xticks(x[::5])
axes[1].set_yticks(yTicks[::5])

axes[1].set_xticklabels(xTicksLabel[::5])
# 添加网格
axes[0].grid(True,linestyle="--",alpha=1)
axes[1].grid(True,linestyle="--",alpha=1)

# 添加描述信息
axes[0].set_xlabel("时间")
axes[0].set_ylabel("温度")
axes[0].set_title("当地气温变化",fontsize=22)
axes[1].set_xlabel("时间")
axes[1].set_ylabel("温度")
axes[1].set_title("当地气温变化",fontsize=22)


# 显示图例
axes[0].legend(loc='best')#等于plt.legend(loc=0)
axes[1].legend(loc='best')#等于plt.legend(loc=0)

plt.show()
+ +

download

+

其他领域

1
2
3
4
5
6
7
8
import numpy as np

x=np.linspace(-10,10,1000)
y=np.sin(x)
plt.figure(figsize=(20,8),dpi=100)
plt.plot(x,y)
plt.grid()
plt.show()
+ +

download

+
Author: SHYEE
Link: http://example.com/2020/03/05/python%E5%85%A5%E9%97%A83/
Copyright Notice: All articles in this blog are licensed under CC BY-NC-SA 4.0 unless stating additionally.
\ No newline at end of file diff --git "a/2020/03/05/\345\201\232\346\240\271\347\275\221\347\272\277/image-20200313084755969.png" "b/2020/03/05/\345\201\232\346\240\271\347\275\221\347\272\277/image-20200313084755969.png" new file mode 100644 index 0000000..1231cb5 Binary files /dev/null and "b/2020/03/05/\345\201\232\346\240\271\347\275\221\347\272\277/image-20200313084755969.png" differ diff --git "a/2020/03/05/\345\201\232\346\240\271\347\275\221\347\272\277/image-20200313084850783.png" "b/2020/03/05/\345\201\232\346\240\271\347\275\221\347\272\277/image-20200313084850783.png" new file mode 100644 index 0000000..1132c35 Binary files /dev/null and "b/2020/03/05/\345\201\232\346\240\271\347\275\221\347\272\277/image-20200313084850783.png" differ diff --git "a/2020/03/05/\345\201\232\346\240\271\347\275\221\347\272\277/image-20200313085312548.png" "b/2020/03/05/\345\201\232\346\240\271\347\275\221\347\272\277/image-20200313085312548.png" new file mode 100644 index 0000000..f4f5afb Binary files /dev/null and "b/2020/03/05/\345\201\232\346\240\271\347\275\221\347\272\277/image-20200313085312548.png" differ diff --git "a/2020/03/05/\345\201\232\346\240\271\347\275\221\347\272\277/image-20200313085614513.png" "b/2020/03/05/\345\201\232\346\240\271\347\275\221\347\272\277/image-20200313085614513.png" new file mode 100644 index 0000000..a36b840 Binary files /dev/null and "b/2020/03/05/\345\201\232\346\240\271\347\275\221\347\272\277/image-20200313085614513.png" differ diff --git "a/2020/03/05/\345\201\232\346\240\271\347\275\221\347\272\277/image-20200313085720071.png" "b/2020/03/05/\345\201\232\346\240\271\347\275\221\347\272\277/image-20200313085720071.png" new file mode 100644 index 0000000..793988d Binary files /dev/null and "b/2020/03/05/\345\201\232\346\240\271\347\275\221\347\272\277/image-20200313085720071.png" differ diff --git "a/2020/03/05/\345\201\232\346\240\271\347\275\221\347\272\277/index.html" "b/2020/03/05/\345\201\232\346\240\271\347\275\221\347\272\277/index.html" new file mode 100644 index 0000000..be036e5 --- /dev/null +++ "b/2020/03/05/\345\201\232\346\240\271\347\275\221\347\272\277/index.html" @@ -0,0 +1,178 @@ +做根网线 | SHYEE-PLASMA + + + + + + + + + + + + + + +

做根网线

如题🛠

+

双绞线+RJ-45连接器(水晶头)=直通线/交叉线

+

直通线

双绞线缆两端按照EIA/TIA568B规格连接水晶头,称该双绞线缆为直通线。

+

image-20200313084755969

+

交叉线

双绞线缆一端按照EIA/TIA568A规格连接水晶头,另一端按EIA/TIA568B规格连接
水晶头,称该双绞线缆为交叉线。

+

image-20200313084850783

+

Cisco网络设备中

相同类型设备之间,用交叉线连接
不同类型设备之间,用直通线连接
目前大部分网络设备都支持自适应

+

发送和接收

不同类型设备:直通线

发送(1/2)–>接收(1/2 )
接收(3/6)<–发送(3/6 )
image-20200313085312548

+
相同类型设备:交叉线

发送(1/2)–>接收(3/6)
接收(1/2 )<–发送(3/6 )

+

image-20200313085614513

+

自适应就是通过检测确定对方的发送端和接收端

+

EIA/TIA568B规格线序

image-20200313085720071

+
Author: SHYEE
Link: http://example.com/2020/03/05/%E5%81%9A%E6%A0%B9%E7%BD%91%E7%BA%BF/
Copyright Notice: All articles in this blog are licensed under CC BY-NC-SA 4.0 unless stating additionally.
\ No newline at end of file diff --git a/2020/03/06/LinearTable-2/image.png b/2020/03/06/LinearTable-2/image.png new file mode 100644 index 0000000..8616656 Binary files /dev/null and b/2020/03/06/LinearTable-2/image.png differ diff --git a/2020/03/06/LinearTable-2/index.html b/2020/03/06/LinearTable-2/index.html new file mode 100644 index 0000000..2d6968c --- /dev/null +++ b/2020/03/06/LinearTable-2/index.html @@ -0,0 +1,240 @@ +LinearTable-2 | SHYEE-PLASMA + + + + + + + + + + + + + + + +

LinearTable-2

先来比较一下顺序表跟单链表的优缺点:

+

顺序表:

+

优点: 可随机存取,存取密度高

+

缺点:要求大片连续空间,改变容量不方便

+

单链表:

+

优点:不要求大量的存储空间,改变容量方便

+

缺点:不可随机存取,要耗费一定空间存放指针

+

单链表

用线性存储的方式实现线性结构。

+

结点:空间+指针

+

定义一个单链表

∵单链表都是靠其结构中的指针找寻下一个结点的头指针而连起来的,∴找到这个单链表只需要找到其头指针即可。

+
1
2
3
4
5
6
7
8
9
typedef struct LNode
{
ElemType data;//data成为数据域
struct LNode* next;//指针存放下一个节点
}LNode,*LinkList;
LinkList L;//声明一个指向单链表第一个节点的指针 等价于LNode*L
//向单链表中增加一个新的节点:在内存中申请一个节点空间,并用指针p指向这个节点
struct LNode* p = (struct LNode*)malloc(sizeof(struct LNode));

+ +

LinkList等价于LNode*

+

前者强调这个是单链表,后者强调这是结点

+

区分来写为了提高代码可读性。

+

初始化

不带头节点

1
2
3
4
5
6
7
8
9
10
11
12
13
//初始化一个单链表
bool InitList(LinList &L){
L=NULL;//防止脏数据
return true;
}
//判断单链表是否为空
bool Empty(LinkList L){
return (L==NULL);
}
void test(){
LinkList L;//声明一个指向单链表的指针
InitList(L);
}
+ +

带头节点

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
typedef struct LNode
{
ElemType data;//data成为数据域
struct LNode* next;//指针存放下一个节点
}LNode,*LinkList;
bool InitList(LinList &L){
L= (LNode*)malloc(sizeof(LNode));//分配头结点
if(L==NULL)//内存不足,分配失败
return false;
L->next=NULL;//头结点之后没有其他结点
return true;
}
bool isEmpty(LinList L){
return L->next==NULL;
}
void test(){
LinkList L;//声明一个指向单链表的指针
InitList(L);
}
+ +

带头节点先办会比不带头节点更方便。

+

插入

LineInsert(&L,i,e):插入操作。在表L中的第i个位置上插入指定元素。

+

带头节点

+ +
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
typedef struct LNode {
int data;
struct LNode* next;
}LNode, *LinkList;
//在第i个位置插入元素e(带头节点)
bool ListInert(LinkList &L,int i,ElemType e){
if(i<1)
return false;
LNode *p;//指针p指向当前扫描到的结点
int j =0;//当p指向的是第几个节点
p =L;//L指向头节点,头节点是第0个结点(不保存数据)
while(p!=NULL && j<i-1){//循环找到第i-1个结点
p=p->next;
j++;
}
if(p==NULL)//i值不合法
return false;
LNode *s=(LNode *)malloc(sizeof(LNode));
s->data=e;
s->next=p->next;
p->next=s;//将结点s连接到p之后
return true;//插入成功
}
+ +

平均时间复杂度=O(n)

+

不带头结点

如果不带头结点,则插入、删除第1个元素时,需要更改头指针L。

+
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
typedef struct LNode {
int data;
struct LNode* next;
}LNode, *LinkList;
//在第i个位置插入元素e(不带头节点)
bool ListInert(LinkList &L,int i,ElemType e){
if(i<1)
return false;
if(i==1){
LNode *s=(LNode *)malloc(sizeof(LNode));
s->data=e;
s->next=L;
L=s;
return true;//头指针指向新结点
}
LNode *p;//指针p指向当前扫描到的结点
int j =1;//当p指向的是第几个节点
p =L;//L指向头节点,头节点是第1个结点
while(p!=NULL && j<i-1){//循环找到第i-1个结点
p=p->next;
j++;
}
if(p==NULL)//i值不合法
return false;
LNode *s=(LNode *)malloc(sizeof(LNode));
s->data=e;
s->next=p->next;
p->next=s;//将结点s连接到p之后
return true;//插入成功
}
+ +

指定结点的后插操作

在指定结点之前插入都是未知区域,之后都是可知区域

+
1
2
3
4
5
6
7
8
9
10
11
12
//在p结点之后插入元素
bool InsertNextNode(LNode *p,ElemType e){
if(p==NULL)
return false;
LNode *s=(LNode *)malloc(sizeof(LNode));
if(s==NULL)//内存分配失败情况
return false;//某些情况可能分配失败
s->data=e;//用结点s保存数据元素e
s->next=p->next;
p->next=s;//将结点s连到p之后
return true;
}
+ +

时间复杂度=O(1)

+

对照上面的带头节点的第i个元素插入元素e可直接找到第i-1个结点,调用此时的后插操作。

+

指定结点的前插操作

直接去找前驱除非指定头结点,否则很难办到

+

这时可以将要插入的结点与该结点替换

+
1
2
3
4
5
6
7
8
9
10
11
12
13
//在p结点之前插入元素e
bool InsertPriorNode(LNode *p,ElemType e){
if(p==NULL)
return false;
LNode *s=(LNode *)malloc(sizeof(LNode));
if(s==NULL)//内存分配失败
return false;
s->next=p->next;
p->next=s;//将新结点s连接到p之后
s->data=p->data;//将p中元素复制到s中
p->data=e;//p中元素覆盖为e
return true;
}
+ +

or

+
1
2
3
4
5
6
7
8
9
10
bool InsertPriorNode(LNode *p,LNode *s){
if(p==NULL||s=NULL)
return false;
s->next=p->next;
p->next=s;//将新结点s连接到p之后
ElemType temp=->p->data;//交换数据部分
p->data=s->data;//将p中元素复制到s中
s->data=temp;//p中元素覆盖为e
return true;
}
+ +

删除

ListDelete(&L,i,&e):删除操作。删除表L中第i个位置的元素,并用e返回删除元素的值。

+

找到第i-1个结点,将其指针指向第i+1个结点,并释放第i个结点。

+

带头指针

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
typedef struct LNode {
int data;
struct LNode* next;
}LNode, *LinkList;
//在第i个位置插入元素e(带头节点)
bool ListDelete(LinkList &L,int i,ElemType &e){
if(i<1)
return false;
LNode *p;//指针p指向当前扫描到的结点
int j =0;//当p指向的是第几个节点
p =L;//L指向头节点,头节点是第0个结点(不保存数据)
while(p!=NULL && j<i-1){//循环找到第i-1个结点
p=p->next;
j++;
}
if(p==NULL)//i值不合法
return false;
if(p->next==NULL){
return false//第i-1个之后没有结点了
}
LNode *q=p—>next;//令q指向被删除结点
e=q->data;//用e返回元素的值
p->next=q->next;//将*q结点从链中断开
free(q);//释放结点的存储空间
return true;//删除成功
}
+ +

最坏、平均时间复杂度=O(n)

+

最好时间复杂度=O(1)

+

指定结点的删除

1
2
3
4
5
6
7
8
9
bool DeleteNode (LNode *p) {
if (p==NULL)
return false;
LNode *q=p->next;//令q指向*p的后继结点
p->data=p->next->data;//和后继结点交换数据域
p->next=q->next;//将*q结点从链中“断开”
free(q);//释放后继结点的存储空间
return true;
}
+ +

如果要被删除的结点恰巧是最后一个结点,p指向next的后继的时候会出现bug

+

此时只能从头开始检索

+

时间复杂度=O(1)

+

查找

按位查找

GetElem(L,i):按位查找操作,获取表中第i个位置的元素的值。

+
1
2
3
4
5
6
7
8
9
10
11
12
LNode * GetElem(LinkList L,int i){
if(i<0)
return false;
LNode *p;//指针p指向当前扫描到的结点
int j =0;//当p指向的是第几个节点
p =L;//L指向头节点,头节点是第0个结点(不保存数据)
while(p!=NULL && j<i){//循环找到第i-1个结点
p=p->next;
j++;
}
return p;
}
+ +

平均时间复杂度=O(n)

+

则带头结点的插入操作也可简化

+
1
2
3
4
5
6
bool ListInert(LinkList &L,int i,ElemType e){
if(i<1)
return false;
LNode *p=GetElem(L,i-1);
return InsertNextNode(p,e);
}
+ +

按值查找

LocateElem(L,e):按值查找操作,在表L中查找具有给定关键字值的元素。

+
1
2
3
4
5
6
7
8
//找到数据域==e的结点
LNode * LocateElem(LinkList L,ElemType e){
LNode *p =L->next;
//从第一个结点开始查找数据域为e的结点
while(p!=NULL && p->data!=e)//这里默认就是int型数据,如果是struct类型则!=应该被替换
p=p->next;
return p;//找到后返回该结点指针,否则返回NULL
}
+ +

时间复杂度为O(n)

+

求表的长度

1
2
3
4
5
6
7
8
9
int Length(LinkList L){
int len=0;//计数器
LNode *p=L;
while(p->next !=NULL){
p=p->next;
len++;
}
return len;
}
+ +

时间复杂度为O(n)

+

单链表的建立

尾插法

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
LinkList List_TailInsert(ListList &L){//正向建立单链表
int x;//设ElemType为整型

//初始化空表
L=(LinkList)malloc(sizeof(LNode));//建立头结点

LNode *s,*r=L;//r为表尾指针
scanf("%d",&x);//输入结点的值

//后插操作
while(x!=8848){//输入8848表示结束
s=(LNode*)malloc(sizeof(LNode));
s->data=x;
r->next=s;

//保持r指向最后一个结点
r=s;//r指向新的表尾结点

scanf("%d",&x);
}
r->next=NULL;//尾结点指针置空
return L;
}
+ +

头插法

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
LinkList List_HeadInsert(ListList &L){//逆向建立单链表
LNode *s;
int x;//设ElemType为整型

//初始化空表
L=(LinkList)malloc(sizeof(LNode));//建立头结点
L->next=NULL;//初始化为空链表

scanf("%d",&x);//输入结点的值

//后插操作
while(x!=8848){//输入8848表示结束
s=(LNode*)malloc(sizeof(LNode));
s->data=x;
r->next=L->next;
L->next=s;

scanf("%d",&x);
}
return L;
}
+ +

因为每次直接往头结点后面插入

+

这样会使得插入的数据逆置

+

小结

饿🍲

+
Author: SHYEE
Link: http://example.com/2020/03/06/LinearTable-2/
Copyright Notice: All articles in this blog are licensed under CC BY-NC-SA 4.0 unless stating additionally.
\ No newline at end of file diff --git "a/2020/03/08/mybatis/MyBatis\347\263\273\345\210\227-\345\233\233/index.html" "b/2020/03/08/mybatis/MyBatis\347\263\273\345\210\227-\345\233\233/index.html" new file mode 100644 index 0000000..5ad9ed3 --- /dev/null +++ "b/2020/03/08/mybatis/MyBatis\347\263\273\345\210\227-\345\233\233/index.html" @@ -0,0 +1,201 @@ +MyBatis系列(四) | SHYEE-PLASMA + + + + + + + + + + + + + + +

MyBatis系列(四)

输入参数和输出参数

+ + +

输入参数parameterType

简单类型

${}#{}比较

+

#{任意值}或者${value}(标识符只能是value)

+

#{}会自动给String加上’’(自动类型转换)

+

${}会原样输出,但是适合于动态排序(动态字段)

+

#{}可以防止sql注入

+

${}不可以

+

${}#{}相同之处

+

都可以获取对象的值,(嵌套类型对象)

+

对象类型

#{属性名}或者${属性名}(对象的属性名例如stuNo)

+
1
2
3
4
<select id="queryStudentByAddress" resultType="top.eshyee.entity.Student" parameterType="address">
select stuno,stuname,stuage from student
where homeaddress=#{homeAddress} or schooladdress='${schoolAddress}'
</select>
+ + + +

嵌套类型输入参数为级联属性

1
2
3
4
5
6
7
<select id="queryStudentByAddress" resultType="top.eshyee.entity.Student" parameterType="Student">
select stuno,stuname,stuage from student where homeaddress=#{address.homeAddress} or schooladdress='${address.schoolAddress}'
</select>
<select id="queryStudentBystuNameOrAge" resultType="top.eshyee.entity.Student" parameterType="Student">
select stuno,stuname,stuage from student
where stuname like '%${stuName}%' or stuage=#{stuAge}
</select>
+ +

传入为hashmap

1
2
3
4
<select id="queryStudentBystuNameOrAgewithHashmap" resultType="top.eshyee.entity.Student" parameterType="HashMap">
select stuno,stuname,stuage from student
where stuname like '%${stuName}%' or stuage=#{stuAge}
</select>
+ +

调用存储过程

存储过程的传入参数在mybatis中用map来传递(Hashmap)
CALLABLE设置sql 的调用方式是存储过程
输出参数通过map的get方法获取

+

查询某个年级的所有学生总数

数据库里
1
2
3
4
5
6
create or replace procedure queryCountByGradeWithProcadure(gName in varchar,scount out number )
as
begin
select count(1) into scount from student where graname=gname;
end;
/
+ +
mapper中
1
2
3
4
5
<select id="queryCountByGradeWithPrecadure" statementType="CALLABLE" parameterType="HashMap">
{CALL queryCountByGradeWithProcadure(
#{gName,jdbcType=VARCHAR,mode=IN},
#{sCount,jdbcType=INTEGER,mode=OUT} )}
</select>
+ +

根据学号删除学生

数据库里
1
2
3
4
5
6
create or replace procedure deleteStuBystunoWithProcedure(sno in number)
as
begin
delete from student where stuno=sno;
end;
/
+ +
mapper中
1
2
3
<delete id="deletestuByStunoWithPrecadure" statementType="CALLABLE" parameterType="HashMap">
{CALL deleteStuBystunoWithProcedure(#{sno,jdbcType=INTEGER,mode=IN})}
</delete>
+ +

输出参数

resultType

简单类型,实体对象类型,实体对象类型的集合之前有提到过,此处不再赘述。

+
输出为HashMap

通过别名作为map的key

+
1
2
3
<select id="queryStudentWithHash" resultType="HashMap">
select stuno "no",stuname "name" from student
</select>
+ +

resultMap

解决实体类型属性与数据表字段名不一致(前面有用到)

+

也可以使用HashMap+resultType

+
Author: SHYEE
Link: http://example.com/2020/03/08/mybatis/MyBatis%E7%B3%BB%E5%88%97-%E5%9B%9B/
Copyright Notice: All articles in this blog are licensed under CC BY-NC-SA 4.0 unless stating additionally.
\ No newline at end of file diff --git a/2020/03/10/LinearTable-3/image-20200310151506398.png b/2020/03/10/LinearTable-3/image-20200310151506398.png new file mode 100644 index 0000000..919bc6f Binary files /dev/null and b/2020/03/10/LinearTable-3/image-20200310151506398.png differ diff --git a/2020/03/10/LinearTable-3/index.html b/2020/03/10/LinearTable-3/index.html new file mode 100644 index 0000000..9464a3a --- /dev/null +++ b/2020/03/10/LinearTable-3/index.html @@ -0,0 +1,191 @@ +LinearTable-3 | SHYEE-PLASMA + + + + + + + + + + + + + + +

LinearTable-3

单链表vs双链表–初篇

+

单链表对于某一结点前面的区域是未知的。即无法逆向检索,有时候不太方便

+

双链表则可以逆向检索,但是存储密度相比较稍微低一点。

+

双链表

+ +

初始化(带头结点)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
typedef struct DNode {
Elemtype data;
struct DNode* prior, * next;
}DNode,*DLinklist;
//初始化双链表
bool InitDLinklist(DLinklist& L) {
L = (DNode*)malloc(sizeof(DNode));//分配一个头结点
if (L == NULL)//内存不足 分配失败
return false;
L->prior = NULL;//头结点的prior永远指向NULL
L->next = NULL;//头结点之后暂时还没有结点
return true;
}
void testDLinklist() {
DLinklist L;
InitDLinklist(L);
}
//判断双链表是否为空 带头结点
bool Empty(DLinklist L){
if(L->next==NULL)
return true;
else
return false;
}
+ +

插入

修改指针时注意顺序

+
1
2
3
4
5
6
7
8
9
10
11
//后插
bool InsertNextDNode(DNode* p, DNode* s) {
if (p==NULL||s==NULL)//非法参数
return false;
s->next = p->next;
if (p->next != NULL)//如果p结点有后继节点
p->next->prior = s;
s->prior = p;
p->next = s;
return true;
}
+ +

删除

1
2
3
4
5
6
7
8
9
10
11
12
13
//删除p结点的后继结点
bool DeleteNextDNode(DNode* p) {
if (p == NULL)
return false;
DNode* q = p->next;//找到p的后继节点給q
if (q == NULL)//p没有后继节点
return false;
p->next = q ->next;
if (q->next != NULL)//判断q是不是最后一个结点
q->next->prior = p;
free(q);//释放q
return true;
}
+ +

此时若要销毁这个双链表,只需找到头结点,然后循环删除后继节点即可。

+
1
2
3
4
5
6
7
void DestroyList(DLinklist& L) {
//循环释放各个数据节点
while (L->next != NULL)
DeleteNextDNode(L);
free(L);//释放L
L = NULL;//使头指针指向NULL
}
+ +

遍历

后向遍历

+
1
2
3
4
while(p!==NULL){
//对结点p做相应处理,例如打印p
p=p->next;
}
+ +

前向遍历

+
1
2
3
4
while(p!==NULL){
//对结点p做相应处理,例如打印p
p=p->prior;
}
+ +

跳过头结点的前向便利

+
1
2
3
4
while(p->prior!=NULL){
//对结点p做相应处理,例如打印p
p=p->prior;
}
+ +

双链表不可以随机存取,按位查找,按值查找都只能用遍历的方式实现。时间复杂度为O(n)

+
Author: SHYEE
Link: http://example.com/2020/03/10/LinearTable-3/
Copyright Notice: All articles in this blog are licensed under CC BY-NC-SA 4.0 unless stating additionally.
\ No newline at end of file diff --git "a/2020/03/10/mybatis/MyBatis\347\263\273\345\210\227-\344\272\224/index.html" "b/2020/03/10/mybatis/MyBatis\347\263\273\345\210\227-\344\272\224/index.html" new file mode 100644 index 0000000..f07005c --- /dev/null +++ "b/2020/03/10/mybatis/MyBatis\347\263\273\345\210\227-\344\272\224/index.html" @@ -0,0 +1,189 @@ +MyBatis系列(五) | SHYEE-PLASMA + + + + + + + + + + + + +

MyBatis系列(五)

关于动态sql

+ + +

if

按姓名和年龄查询

+
1
2
3
4
5
6
7
8
9
10
11
<select id="qStuByNOrAWithSQLTag" parameterType="top.eshyee.entity.Student" resultType="top.eshyee.entity.Student">
select stuno ,stuname from student where 1=1
<if test="stuName!=null and stuName!= ''">
student有stuname属性且不为null
and stuname=#{stuName}
</if>
<if test="stuAge!=null and stuAge!=0">
student有stunage属性且不为null
and stuage=#{stuAge}
</if>
</select>
+ +

这里and会出问题

+

where

where:处理第一个and

+
1
2
3
4
5
6
7
8
9
10
11
<select id="qStuByNOrAWithSQLTag" parameterType="top.eshyee.entity.Student" resultType="top.eshyee.entity.Student">
select stuno ,stuname from student
<where>
<if test="stuName!=null and stuName!= ''">
and stuname=#{stuName}
</if>
<if test="stuAge!=null and stuAge!=0">
and stuage=#{stuAge}
</if>
</where>
</select>
+ +

foreach

查询学号为1 2 4的学生学号信息

+

迭代的类型:数组、对象数组、集合、属性

+

数组

数组固定写法:array 这是约定

+
1
2
3
4
5
6
7
8
9
10
<select id="queryStuwithNoWitharray" resultType="top.eshyee.entity.Student" parameterType="int[]">
select * from student
<where>
<if test="array!=null and array.length>0">
<foreach collection="array" open="and stuno in(" close=")" item="stuNo" separator=",">
#{stuNo}
</foreach>
</if>
</where>
</select>
+ +

放入对象的属性中

1
2
3
4
5
6
7
8
9
10
<select id="queryStuwithNoInGra" resultType="top.eshyee.entity.Student" parameterType="top.eshyee.entity.Grade">
select * from student
<where>
<if test="stuNos!=null and stuNos.size>0">
<foreach collection="stuNos" open="and stuno in(" close=")" item="stuNo" separator=",">
#{stuNo}
</foreach>
</if>
</where>
</select>
+ +

集合

1
2
3
4
5
6
7
8
9
10
<select id="queryStuwithNowithlist" resultType="top.eshyee.entity.Student" parameterType="top.eshyee.entity.Grade">
select * from student
<where>
<if test="list!=null and list.size>0">
<foreach collection="list" open="and stuno in(" close=")" item="stuNo" separator=",">
#{stuNo}
</foreach>
</if>
</where>
</select>
+ +

对象数组

必须使用Object[]

+
1
2
3
4
5
6
7
8
<select id="queryStuwithNowithObjArr" 
resultType="top.eshyee.entity.Student" parameterType="Object[]">
select * from student
<include refid="objectArraStuno"></include>
<!-- 如果sql片段不在一个文件
<include refid="top.eshyee.mapper.StudentMapper.objectArraStuno"></include>
-->
</select>
+ +

sql片段

重复使用的提取出来

+
1
2
3
4
5
6
7
8
9
<sql id="objectArraStuno">
<where>
<if test="array!=null and array.length>0">
<foreach collection="array" open="and stuno in(" close=")" item="student" separator=",">
#{student.stuNo}
</foreach>
</if>
</where>
</sql>
+ +
Author: SHYEE
Link: http://example.com/2020/03/10/mybatis/MyBatis%E7%B3%BB%E5%88%97-%E4%BA%94/
Copyright Notice: All articles in this blog are licensed under CC BY-NC-SA 4.0 unless stating additionally.
\ No newline at end of file diff --git a/2020/03/11/LinearTable-4/image-20200312175542402.png b/2020/03/11/LinearTable-4/image-20200312175542402.png new file mode 100644 index 0000000..8e4b89e Binary files /dev/null and b/2020/03/11/LinearTable-4/image-20200312175542402.png differ diff --git a/2020/03/11/LinearTable-4/index.html b/2020/03/11/LinearTable-4/index.html new file mode 100644 index 0000000..cec201c --- /dev/null +++ b/2020/03/11/LinearTable-4/index.html @@ -0,0 +1,178 @@ +LinearTable-4 | SHYEE-PLASMA + + + + + + + + + + + + + + +

LinearTable-4

在单链表和双链表上加上一点小小的改进–循环链表

+

循环单链表

最后一个结点的next指针指向头结点

+

初始化

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
typedef struct LNode
{
ElemType data;//data成为数据域
struct LNode* next;//指针存放下一个节点
}LNode,*LinkList;
bool InitList(LinList &L){
L= (LNode*)malloc(sizeof(LNode));//分配头结点
if(L==NULL)//内存不足,分配失败
return false;
L->next=L;//头结点之后没有其他结点
return true;
}
bool isEmpty(LinList L){
return L->next==L;
}
void test(){
LinkList L;//声明一个指向单链表的指针
InitList(L);
}
+ +

循环双链表

表头结点的prior指向表尾结点

+

表尾结点的next指针指向头结点

+

初始化

+ +
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
typedef struct DNode {
Elemtype data;
struct DNode* prior, * next;
}DNode,*DLinklist;
//初始化双链表
bool InitDLinklist(DLinklist& L) {
L = (DNode*)malloc(sizeof(DNode));//分配一个头结点
if (L == NULL)//内存不足 分配失败
return false;
L->prior = L;
L->next = L;
return true;
}
void testDLinklist() {
DLinklist L;
InitDLinklist(L);
}
//判断双链表是否为空 带头结点
bool Empty(DLinklist L){
if(L->next==L)
return true;
else
return false;
}
+ +

对于添加(和删除)操作的时候

+

直接抢p(尾)结点 的next指针的prior指向下(删除反过来)一个结点

+
Author: SHYEE
Link: http://example.com/2020/03/11/LinearTable-4/
Copyright Notice: All articles in this blog are licensed under CC BY-NC-SA 4.0 unless stating additionally.
\ No newline at end of file diff --git a/2020/03/12/LinearTable-5/image-20200312180410982.png b/2020/03/12/LinearTable-5/image-20200312180410982.png new file mode 100644 index 0000000..c2b0025 Binary files /dev/null and b/2020/03/12/LinearTable-5/image-20200312180410982.png differ diff --git a/2020/03/12/LinearTable-5/image-20200312180624806.png b/2020/03/12/LinearTable-5/image-20200312180624806.png new file mode 100644 index 0000000..f6533a4 Binary files /dev/null and b/2020/03/12/LinearTable-5/image-20200312180624806.png differ diff --git a/2020/03/12/LinearTable-5/index.html b/2020/03/12/LinearTable-5/index.html new file mode 100644 index 0000000..cb52ca4 --- /dev/null +++ b/2020/03/12/LinearTable-5/index.html @@ -0,0 +1,196 @@ +LinearTable-5 | SHYEE-PLASMA + + + + + + + + + + + + + + +

LinearTable-5

静态链表–简简单单做个NPC

+

定义

+ +

分配一整片连续的内存空间,各个结点集中安置。

+
1
2
3
4
5
6
7
8
#define MaxSize 10//静态链表的最大长度
typedef struct{//静态链表结构类型的定义
ElemType data;//存储数据元素
int next;//下一个元素的数组下标
}SLinkList[MaxSize];
void test(){
SLinkList a;
}
+ +

基本操作

初始化

+

把头结点的游标设为-1,并且将其他结点的游标设为一个默认值 如8848

+

查找

+

从头结点出发依次往后遍历结点

+

插入

+

插入位序为i的结点

+
    +
  1. 找到一个空的结点(循环遍历找到那个”8848“),存入数据元素

    +
  2. +
  3. 从头结点出发找到位序为i-1的结点

    +
  4. +
  5. 修改新结点的next

    +
  6. +
  7. 修改i-1号结点的next

    +
  8. +
+

删除

+
    +
  1. 从头结点出发找到前驱结点
  2. +
  3. 修改前驱节点的游标
  4. +
  5. 被删除结点的next设为”8848“
  6. +
+

小结

静态链表:用数组的方式实现的链表
优点:增、删操作不需要大量移动元素
缺点:不能随机存取,只能从头结点开始依次往后查找;容量固定不可变

+

适用场景:①不支持指针的低级语言:②数据元素数量固定不变的场景(如操作系统的文件分配表FAT)

+
Author: SHYEE
Link: http://example.com/2020/03/12/LinearTable-5/
Copyright Notice: All articles in this blog are licensed under CC BY-NC-SA 4.0 unless stating additionally.
\ No newline at end of file diff --git a/2020/03/12/LinearTable-6/index.html b/2020/03/12/LinearTable-6/index.html new file mode 100644 index 0000000..6bc9ac9 --- /dev/null +++ b/2020/03/12/LinearTable-6/index.html @@ -0,0 +1,191 @@ +LinearTable-6 | SHYEE-PLASMA + + + + + + + + + + + + + + + +

LinearTable-6

线性表学习终章–顺序表与链表的最终对决!

+

逻辑结构

都属于线性表,都是线性结构🙋‍♂️

+

物理结构

顺序表(顺序存储)

优点:支持随机存取、存储密度高👍
缺点:大片连续空间分配不方便,改变容量不方便👎

+

链表(链式存储)

优点:离散的小空间分配方便,改变容量方便👍
缺点:不可随机存取,存储密度低👎

+

数据的运算\基本操作

创建

顺序表👎

需要预分配大片连续空间。若分配空间过小,则之后不方便拓展容量;若分配空间
过大,则浪费内存资源。

+

静态分配:静态数组

+

容量不可改变
动态分配:动态数组

+

容量可改变,但需要移动大量元素,时间代价高

+
链表👍

只需分配一个头结点(也可以不要头结点,只声明一个头指针),之后方便拓展。

+

销毁

顺序表👎

修改Length = 0

+

静态分配:静态数组->系统自动回收空间
动态分配:动态数组->需要手动free

+

malloc函数申请的空间为堆区,系统不会自动回收

+
链表👍

依次删除各个结点(free)

+

增删

顺序表👎

插入/删除元素要将后续元素都后移/前移

+

时间复杂度0(n),时间开销主要来自移动元素

+

若数据元素很大,则移动的时间代价很高

+
链表👍

插入/删除元素只需修改指针即可

+

时间复杂度0(n),时间开销主要来自查找目标元素

+

查找元素的时间代价更低

+

查找

顺序表👍

按位查找: 0(1)

+

按值查找: 0(n)若表内元素有序,可在O(logn)(以2为底)时间内找到

+
链表👎

按位查找: O(n)

+

按值查找: O(n)

+

小结

线性表·完🎊

+
Author: SHYEE
Link: http://example.com/2020/03/12/LinearTable-6/
Copyright Notice: All articles in this blog are licensed under CC BY-NC-SA 4.0 unless stating additionally.
\ No newline at end of file diff --git a/2020/03/12/LinearTable-6/pic51.jpg b/2020/03/12/LinearTable-6/pic51.jpg new file mode 100644 index 0000000..8fa96d0 Binary files /dev/null and b/2020/03/12/LinearTable-6/pic51.jpg differ diff --git "a/2020/03/12/Oracle\347\263\273\345\210\227\345\255\246\344\271\240-\344\270\211/image-20200317102333059.png" "b/2020/03/12/Oracle\347\263\273\345\210\227\345\255\246\344\271\240-\344\270\211/image-20200317102333059.png" new file mode 100644 index 0000000..e636edd Binary files /dev/null and "b/2020/03/12/Oracle\347\263\273\345\210\227\345\255\246\344\271\240-\344\270\211/image-20200317102333059.png" differ diff --git "a/2020/03/12/Oracle\347\263\273\345\210\227\345\255\246\344\271\240-\344\270\211/index.html" "b/2020/03/12/Oracle\347\263\273\345\210\227\345\255\246\344\271\240-\344\270\211/index.html" new file mode 100644 index 0000000..03d7e7e --- /dev/null +++ "b/2020/03/12/Oracle\347\263\273\345\210\227\345\255\246\344\271\240-\344\270\211/index.html" @@ -0,0 +1,236 @@ +Oracle系列学习(三) | SHYEE-PLASMA + + + + + + + + + + + + + +

Oracle系列学习(三)

创建用户、创建表、简单操作

+

创建用户与授权

表空间

对应物理磁盘上建立一个数据文件,作为数据库对象(用户、表、存储过程等等)的物理存储
空间;

+

创建表空间:

+

便于管理

+

性能提升

+

防止IO竞争

+
1
2
3
4
5
6
7
8
CREATE TABLESPACE 表空间名
DATAFILE 文件路径 SIZE 文件大小
AUTOEXTEND ON NEXT 扩展大小 MAXSIZE 最大空间;

例如:
CREATE TABLESPACE MYFIR_TBS
DATAFILE 'D:\app\EShyee\oradata\orcl\MYFIR_TBS.DBF' SIZE 100M
AUTOEXTEND ON NEXT 10M MAXSIZE 200M;
+ +

查看表空间:

+
1
select file_name,tablespace_name,bytes from dba_data_files;
+ +

用户

创建用户

1
create user 用户名 identified by 密码 [default tablespace 表空间名];
+ +

创建用户时如果不指定 会使用默认的表空间users

+

授权

1
grant connect,resource to 用户名 [with grant option];
+ +
三种角色权限

dba系统管理员最高权限,啥都能干

+

resource操作数据库数据,但是不能管理数据库(如用户管理)

+

connect连接数据库,但是不能操作数据库

+

角色是权限的集合,一个角色里,包含有很多个细分权限,

+

比如,resource角色包含create drop select insert等

+

-般为普通用授予connect和resource权限即可,如scott账户

+

with grant option表示该用户还可以将其权限授权给其他用户。

+
+

注意:

+

12c版本开始,回收的unlimited tablespace权限,导致即使给用户指定了表空间,也不能使用。

+

解决办法是给用户授予该权限:

+

grant unlimited tablespace to用户

+
+
实体权限

对数据库实体的具体操作(如增删改查等),使用实体权限能细化授权

+

实体权限有select, update, insert, alter, index, delete,execute, all (all包括所有权限) 等

+
1
2
3
grant select, update, insert on表名to用户
grant all on表名to用户
grant select, update, insert on emp to EShyee
+ +

补充其他管理操作

1
2
3
4
5
6
7
8
9
10
11
12
查询当前用户的默认表空间
select default_tablespace from user_users ;

修改密码
Alter user EShyee identified by tt456;

冻结用户与解锁用户
Alter user scott account lock
Alter user scott account unlock

删除用户
drop user 用户名;
+ +

创建表

三要素

1、表名
2、表中有哪些列(列名)
3、列的数据类型

+

create table名(列名数据类型列名数据类型..);

+
1
2
3
4
5
6
7
8
9
10
11
12
create table student(
stuno varchar2(20) ,
name varchar2(20),
age int,
height number(4, 1)
);
创建一个表,名字是student该表中,有
stuno学号
name姓名
age年龄
height身高

+ +

常用数据类型

数字类型:
number(p,s)数字

+

p为总位数,s为小数点后最多几位

+

例如,number(5,3) 可以表示99999 123.32 135.5等

+

Integer/int 整数,相当于number(38,0), 可以表示很大的数

+

float:小数

+

字符类型

varchar2(p)表示能存储一个字符串, 其最大的长度为p

+

char(p)表示能存储一个字符串,固定长度为p,如果长度不够,自动补充空格

+

比如: varchar2 (20) 与char(20)同时存放一个字符串’123’:

+

varchar2只存放’123’这三个字符

+

char会存放’123 (17个空格)’。

+

日期类型

date:存储日期类型,可以精确到秒,通常存储格式是年月日时分秒

+

timestamp:和DATE相比,这个可以精确到纳秒,存储时间精度更高

+

大对象类型

CLOB:最大为(4GB-1)*数据库块大小,存储字符数据,主要用于存储大型英文字符

+

BLOB:最大为(4GB- 1)*数据库块大小,存储非结构化二进制数据,主要存储图像、声音、视频等文件。

+

查看已创建的表

1
select table_name from user_tables ;
+ +

修改表

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
1、重命名
rename student to stu;
将student表 名改为stu
2、 重命名列
alter table表rename column列名to新列名
alter table stu rename column class to banji;
将stu表的class 列改为banji
3、添加一列
alter tableadd 列名数据类型;
alter table stu add sex char(1);
在表stu中添加一列,性别sex,类型为char(1); 1表示字节byte长度1
4、修改列
一般修改列时,修改其长度大小
alter table stu modify sex char(2);
修改表stu中的sex列,将其长度改为2
5、删除列
alter table 表名 drop column 列名;
alter table stu drop column sex;
6、删除表
drop table表名;
+ +

单双引号

双引号表明是个关键字

+

Oracle 默认大写 如果非要规定 大小写 用双引号

+
1
2
3
4
5
6
7
8
创建一个带双引号的表
create table "student2"(
"stuno" varchar2 (20),
"school" varchar2 (50)
);
查看表的时候也得加上双引号
desc "student2"
对表操作的时候也得加上
+ +

单引号表示的值

+

关系

image-20200317102333059

+

实例中包含多个表空间

+

用户关联表空间

+

表放在表空间中

+

用户拥有表 表可能来自不同的表空间

+
1
create table test(id int) tablespace 别的表;
+ + + +

小结

Author: SHYEE
Link: http://example.com/2020/03/12/Oracle%E7%B3%BB%E5%88%97%E5%AD%A6%E4%B9%A0-%E4%B8%89/
Copyright Notice: All articles in this blog are licensed under CC BY-NC-SA 4.0 unless stating additionally.
\ No newline at end of file diff --git "a/2020/03/13/\345\215\225BSS\345\256\236\351\252\214/image-20200320090048168.png" "b/2020/03/13/\345\215\225BSS\345\256\236\351\252\214/image-20200320090048168.png" new file mode 100644 index 0000000..5b0184b Binary files /dev/null and "b/2020/03/13/\345\215\225BSS\345\256\236\351\252\214/image-20200320090048168.png" differ diff --git "a/2020/03/13/\345\215\225BSS\345\256\236\351\252\214/image-20200320090306579.png" "b/2020/03/13/\345\215\225BSS\345\256\236\351\252\214/image-20200320090306579.png" new file mode 100644 index 0000000..1f36a58 Binary files /dev/null and "b/2020/03/13/\345\215\225BSS\345\256\236\351\252\214/image-20200320090306579.png" differ diff --git "a/2020/03/13/\345\215\225BSS\345\256\236\351\252\214/index.html" "b/2020/03/13/\345\215\225BSS\345\256\236\351\252\214/index.html" new file mode 100644 index 0000000..d2d4514 --- /dev/null +++ "b/2020/03/13/\345\215\225BSS\345\256\236\351\252\214/index.html" @@ -0,0 +1,216 @@ +单BSS实验 | SHYEE-PLASMA + + + + + + + + + + + + +

单BSS实验

单BSS实验

实验内容

    +
  1. 构建基本服务集
  2. +
  3. 安装终端无线网卡
  4. +
  5. 实现基本服务集终端之间通信
  6. +
+

在这个基本服务集里面呢,我们是有一个AP和两个终端

+

实验目的

    +
  1. 验证基本服务集的通信区域
  2. +
  3. 验证终端与AP之间建立关联的过程
  4. +
+

实验原理

AP与BSS中终端之间要成功建立关联,必须满足条件:

+
    +
  1. 终端位于AP的有效通信范围内
  2. +
  3. 终端与AP配置相同的服务集标识符SSID
  4. +
  5. 终端与AP配置相同的安全机制和密钥
  6. +
+

实验配置

两个装有无线网卡的笔记本aptop0、laptop1和AP

+

讲笔记本移入AP工作区

+

为AP0配置SSID

+

这里配置为123456

+

鉴别防密机制选择WPA2PSK

+

输入密钥1234567890

+

此时,laptop0和laptop1与AP0之间终止关联

+

分别给两个笔记本进行配置

+

配置与AP0租同的SSID、鉴别动密机制

+

启动笔记本电脑的IP配置实用程序

+

安装无线网卡的笔记本电脑,它的默认状态下是通过dhcp自动获取网络信息的,在没有配置dhcp服务器的情况下有操作系统自动的在保留的地址当中169.254.0.0/16当中随机分配IP地址。启动两台笔记本电脑之间的ICMP报文的传输过程,看到两台终端是可以互相通信的

+

无线局域网与以太网互联

实验内容

    +
  1. 构建以下无线局域网和以太网
  2. +
  3. AP实现无线局域网和以太网互连
  4. +
  5. 查看无线MAC帧和以太网MAC帧转换过程
  6. +
  7. 查看交换机转发表内容变化过程
  8. +
+

实验目的

    +
  1. 验证AP完成无线局域网MAC帧格式与以太网MAC帧格式相互转换的过程
  2. +
  3. 验证无线局域网和以太网中终端之间的通信过程
  4. +
+

实验原理

    +
  1. 分配终端IP地址信息时,每个终端需要配置相同网络地址,因为以太网和无线局域网互连后是同一个网络。
  2. +
  3. AP是链路层设备,能够完成两种格式之间转换原因
  4. +
+
    +
  • 无线局域网和以太网的MAC地址相同

    +
  • +
  • 两种网络MAC帧格式相似

    +

    以太网MAC帧的一般格式

    +
  • +
+

image-20200320090048168

+

无线局域网的MAC帧的一般格式

+

image-20200320090306579

+

都是数据+地址+校验码,等等这样一些控制信息组成的

+
Author: SHYEE
Link: http://example.com/2020/03/13/%E5%8D%95BSS%E5%AE%9E%E9%AA%8C/
Copyright Notice: All articles in this blog are licensed under CC BY-NC-SA 4.0 unless stating additionally.
\ No newline at end of file diff --git "a/2020/03/13/\345\215\225\344\272\244\346\215\242\346\234\272\345\260\217\345\256\236\351\252\214/image-20200313092558995.png" "b/2020/03/13/\345\215\225\344\272\244\346\215\242\346\234\272\345\260\217\345\256\236\351\252\214/image-20200313092558995.png" new file mode 100644 index 0000000..24e0c88 Binary files /dev/null and "b/2020/03/13/\345\215\225\344\272\244\346\215\242\346\234\272\345\260\217\345\256\236\351\252\214/image-20200313092558995.png" differ diff --git "a/2020/03/13/\345\215\225\344\272\244\346\215\242\346\234\272\345\260\217\345\256\236\351\252\214/image-20200313092658988.png" "b/2020/03/13/\345\215\225\344\272\244\346\215\242\346\234\272\345\260\217\345\256\236\351\252\214/image-20200313092658988.png" new file mode 100644 index 0000000..1a2db08 Binary files /dev/null and "b/2020/03/13/\345\215\225\344\272\244\346\215\242\346\234\272\345\260\217\345\256\236\351\252\214/image-20200313092658988.png" differ diff --git "a/2020/03/13/\345\215\225\344\272\244\346\215\242\346\234\272\345\260\217\345\256\236\351\252\214/image-20200313092729040.png" "b/2020/03/13/\345\215\225\344\272\244\346\215\242\346\234\272\345\260\217\345\256\236\351\252\214/image-20200313092729040.png" new file mode 100644 index 0000000..00f3764 Binary files /dev/null and "b/2020/03/13/\345\215\225\344\272\244\346\215\242\346\234\272\345\260\217\345\256\236\351\252\214/image-20200313092729040.png" differ diff --git "a/2020/03/13/\345\215\225\344\272\244\346\215\242\346\234\272\345\260\217\345\256\236\351\252\214/image-20200313092819248.png" "b/2020/03/13/\345\215\225\344\272\244\346\215\242\346\234\272\345\260\217\345\256\236\351\252\214/image-20200313092819248.png" new file mode 100644 index 0000000..93cee48 Binary files /dev/null and "b/2020/03/13/\345\215\225\344\272\244\346\215\242\346\234\272\345\260\217\345\256\236\351\252\214/image-20200313092819248.png" differ diff --git "a/2020/03/13/\345\215\225\344\272\244\346\215\242\346\234\272\345\260\217\345\256\236\351\252\214/image-20200313092849139.png" "b/2020/03/13/\345\215\225\344\272\244\346\215\242\346\234\272\345\260\217\345\256\236\351\252\214/image-20200313092849139.png" new file mode 100644 index 0000000..27471ee Binary files /dev/null and "b/2020/03/13/\345\215\225\344\272\244\346\215\242\346\234\272\345\260\217\345\256\236\351\252\214/image-20200313092849139.png" differ diff --git "a/2020/03/13/\345\215\225\344\272\244\346\215\242\346\234\272\345\260\217\345\256\236\351\252\214/image-20200313093238525.png" "b/2020/03/13/\345\215\225\344\272\244\346\215\242\346\234\272\345\260\217\345\256\236\351\252\214/image-20200313093238525.png" new file mode 100644 index 0000000..52da689 Binary files /dev/null and "b/2020/03/13/\345\215\225\344\272\244\346\215\242\346\234\272\345\260\217\345\256\236\351\252\214/image-20200313093238525.png" differ diff --git "a/2020/03/13/\345\215\225\344\272\244\346\215\242\346\234\272\345\260\217\345\256\236\351\252\214/image-20200313093341917.png" "b/2020/03/13/\345\215\225\344\272\244\346\215\242\346\234\272\345\260\217\345\256\236\351\252\214/image-20200313093341917.png" new file mode 100644 index 0000000..8991253 Binary files /dev/null and "b/2020/03/13/\345\215\225\344\272\244\346\215\242\346\234\272\345\260\217\345\256\236\351\252\214/image-20200313093341917.png" differ diff --git "a/2020/03/13/\345\215\225\344\272\244\346\215\242\346\234\272\345\260\217\345\256\236\351\252\214/image-20200313093416948.png" "b/2020/03/13/\345\215\225\344\272\244\346\215\242\346\234\272\345\260\217\345\256\236\351\252\214/image-20200313093416948.png" new file mode 100644 index 0000000..f70b132 Binary files /dev/null and "b/2020/03/13/\345\215\225\344\272\244\346\215\242\346\234\272\345\260\217\345\256\236\351\252\214/image-20200313093416948.png" differ diff --git "a/2020/03/13/\345\215\225\344\272\244\346\215\242\346\234\272\345\260\217\345\256\236\351\252\214/image-20200313094123758.png" "b/2020/03/13/\345\215\225\344\272\244\346\215\242\346\234\272\345\260\217\345\256\236\351\252\214/image-20200313094123758.png" new file mode 100644 index 0000000..363eefb Binary files /dev/null and "b/2020/03/13/\345\215\225\344\272\244\346\215\242\346\234\272\345\260\217\345\256\236\351\252\214/image-20200313094123758.png" differ diff --git "a/2020/03/13/\345\215\225\344\272\244\346\215\242\346\234\272\345\260\217\345\256\236\351\252\214/image-20200313095215588.png" "b/2020/03/13/\345\215\225\344\272\244\346\215\242\346\234\272\345\260\217\345\256\236\351\252\214/image-20200313095215588.png" new file mode 100644 index 0000000..e2f2459 Binary files /dev/null and "b/2020/03/13/\345\215\225\344\272\244\346\215\242\346\234\272\345\260\217\345\256\236\351\252\214/image-20200313095215588.png" differ diff --git "a/2020/03/13/\345\215\225\344\272\244\346\215\242\346\234\272\345\260\217\345\256\236\351\252\214/index.html" "b/2020/03/13/\345\215\225\344\272\244\346\215\242\346\234\272\345\260\217\345\256\236\351\252\214/index.html" new file mode 100644 index 0000000..71bd75c --- /dev/null +++ "b/2020/03/13/\345\215\225\344\272\244\346\215\242\346\234\272\345\260\217\345\256\236\351\252\214/index.html" @@ -0,0 +1,200 @@ +单交换机小实验 | SHYEE-PLASMA + + + + + + + + + + + + +

单交换机小实验

内容

1、用一台交换机连接四个终端
2、启动终端A与终端B之间的MAC帧交换过程
3、观察交换机转发表变化过程
4、检查ICMP报文至MAC帧的封装过程

+

目的

1、验证交换机的连通性
2、验证转发表建立过程
3、验证交换机MAC帧转发过程
4、验证ICMP报文逐层封装过程

+

1.清除MAC表
➢Switch#clear mac-address-table
clear mac-address-table是在特权模式下使用的命令,该命令的作
用是清除交换机转发表(也称MAC表)中的动态转发项。

+

➢为什么要清除MAC表呢 ?
在终端之间交换ARP报文时,交换机中会产生转发项,这样会干扰我
们的验证过程。因此,完成ARP地址解析过程后,清空转发表,开始
交换机实验。

+

2.停止运行CDP
➢Switch(config)#no cdp
run
no cdp run是全局模式下使用的命令,该命令的作用是停止运行CDP
➢CDP是什么 ?为什么要停止运行CDP呢?
CDP : Cisco Discovery Protocol ( Cisco发现协议) , CDP能检
测到与交换机直接连接的设备,因此即使终端不发送MAC帧,交换
机也能检测到各端口连接的终端,并在转发表中创建相应的转发项。

+

为了防止CDP干扰交换机实验,应该在交换机中停止运行CDP。

+

在设备类型选择框中选择交换机
设备型号选择框中选择型号为2950-24的交换机把它拖放到工作区

+

然后在设备类型选择框中选择终端,设备型号选择框中选择台式机,我们放置四台终端
用直通线把交换机的四个端回分别和四台终端连接起来。

+

image-20200313092558995完成了交换机和终端连接后,为每一个终端配置iP地址和子网掩码

+

pc0

+

image-20200313092658988

+

pc1

+

image-20200313092729040

+

pc2

+

image-20200313092819248

+

pc3

+

image-20200313092849139

+

启动PCO与PC1之间的ICMP报文传输过程

+

使得PCO租PC1完成对方IP地址的解析过程

+

进入模以操作模式,勾选ICMP

+

image-20200313093238525
然后查看MAC表,
可以看到MAC表中已经存在MAC转发项

+

image-20200313093416948

+

通过在特权模式下输入命令clear mac-addresstable,清余MAC表中已经存在的转发项

+
1
2
3
Switch>enable
Switch#clear mac-address-table
Switch#
+ +

再次启动PCO与PC1之间的ICMP报文传输过程,采用步进模式查看ICMP报文传输过程

+

交换机接收到PC0发送的MAC帧后,在MAC表创建PCO对应的转发项,由于转发表中没有PC1的转发项,所以采用户播这个MAC帧的方式,当交换机接收到PC1发送的MAC帧后,在MAC表当中创建PC1对应的转发项,由于MAC表中已经存在PC0对应的转发项,所以交换机转发该MAC帧给PCO

+

查看PC1至PCOCMP报文封装过程

+

image-20200313094123758

+

ICMP报文封装成IP分组,IP分组的源IP地址是PC1的IP地址192.1.1.2,目的P地址是PC0的P地址192.1.1.1

+

IP分组又封装成MAC帧,MAC帧的源MAC地址应该是PC1的MAC地址,目的MAC地址应该是PC0的MAC地址

+

image-20200313095215588

+

命令模式完成

+

pc0cmd下pingpc1

+
1
ping 192.1.1.2
+ +
Author: SHYEE
Link: http://example.com/2020/03/13/%E5%8D%95%E4%BA%A4%E6%8D%A2%E6%9C%BA%E5%B0%8F%E5%AE%9E%E9%AA%8C/
Copyright Notice: All articles in this blog are licensed under CC BY-NC-SA 4.0 unless stating additionally.
\ No newline at end of file diff --git "a/2020/03/13/\345\267\245\344\275\234\345\210\206\350\247\243\347\273\223\346\236\204/image-20200323104341369.png" "b/2020/03/13/\345\267\245\344\275\234\345\210\206\350\247\243\347\273\223\346\236\204/image-20200323104341369.png" new file mode 100644 index 0000000..c11240b Binary files /dev/null and "b/2020/03/13/\345\267\245\344\275\234\345\210\206\350\247\243\347\273\223\346\236\204/image-20200323104341369.png" differ diff --git "a/2020/03/13/\345\267\245\344\275\234\345\210\206\350\247\243\347\273\223\346\236\204/index.html" "b/2020/03/13/\345\267\245\344\275\234\345\210\206\350\247\243\347\273\223\346\236\204/index.html" new file mode 100644 index 0000000..afcbd2b --- /dev/null +++ "b/2020/03/13/\345\267\245\344\275\234\345\210\206\350\247\243\347\273\223\346\236\204/index.html" @@ -0,0 +1,288 @@ +工作分解结构 | SHYEE-PLASMA + + + + + + + + + + + + +

工作分解结构

工作分解结构

+

本知识点主要讲述如下内容:

+

(1)生活案例引导

+

(2)工作分解思想

+

生活案例

+

你和同学你们2个人一起做菜:炒鸡蛋。问怎么做?

+

阶段1:准备材料(包括配料及工具)

+
    +
  • 准备配料:鸡蛋、葱、姜、蒜、油
  • +
  • 准备工具:碗、搅拌器(或筷子)、锅、火、铲子等
  • +
  • 1个人做(另个人看)还是2个人同时做
  • +
+

阶段2:炒鸡蛋

+

炒鸡蛋

+
    +
  • (1个人)(包括搅鸡蛋、热油锅等)
  • +
  • 另个人千吗? 闲着吗?还是准备盘子?(同时吗?)
  • +
+

阶段3:盛盘上桌

+

工作分解结构的思想

+

工作分解结构的思想是:

+

项目范围->工作阶段->工作单元->任务

+

工作阶段(Phase) 是按时间顺序分布的工作里程碑

+

工作单元(Work Unit)是阶段的组成部分,彼此之间可以使串行也可以是并行的
任务是组成工作单元的单位活动

+

工作单元和任务可以逐步细分,但分的过细会导致过于零碎,分得过粗,
则会不容易控制

+

项目经理按分解结构委派和监控项目

+

工作分解结构的思想

+

为什么需要WBS:

+

项目经理按分解结构委深和监控项目,可以准确地预测下面的内容:

+
    +
  1. WBS明确了完成项0所需要进行的工作

    +
  2. +
  3. WBS能给项日组,管理层和团队成员产生紧迫感

    +
  4. +
  5. WBS能防止项目范围的盲目扩大

    +
  6. +
  7. WBS为管理层和项日经理提供了控制手段

    +
  8. +
+

如:

+

学生小组做实验的例子:

+
    +
  • 1)、分配各小组作实验的内容(1天)
  • +
  • 2)、各小组组长分配组员工作、整合(5天)
  • +
  • 3)、整理各小组实验报告,分析,整理(2天)
  • +
+

工作分解结构

+

本知识点主要讲述如下内容:

+

(1)创建工作分解结构

+

(2)工作分解结构的表示

+

创建工作分解结构

+

创建WBS有两种方法:

+

自顶向下和自底向上

+

1、自顶向下是由一般到特殊的过程

+

是先将项目分成阶段,再将阶段分解为工作单元,再将单元分解为任务,最后整合的过程。是最常用的一种方法。本方法容易遗漏单元或任务。

+

2、自底向上是由特殊到一般的过程

+

是想了解任务,找到相应的解决方案,再逆推到阶段,再到项目分解结构的过程。本方法容易陷入解决方案的泥潭。

+

自顶向下创建WBS的过程:

+

1、召集相关的管理层人员,项目发起人,团队成员或财务人员

+

2、先将项目分解为若干阶段

+

3、再将每个阶段分解为若干个单元

+

4、将每个单元分解为若干个任务

+

5、对WBS中的每个阶段、单元和任务进行复核和修订

+

将项目分解为若干阶段:

+

从顶层目标入手来确定项目的各个阶段

+
    +
  • 项目内部存在逻辑上的划分吗(如日期或活动)
  • +
  • 存在代表各个阶段可识别的里程碑吗
  • +
  • 在项目中是否考虑了企业的商业周期
  • +
  • 在项目中是否存在财务责任或限制来标识各阶段
  • +
  • 在公司项目生命周期中有什么因素能影响项目
  • +
  • 你的公司正在采用什么样的项目开发过程
  • +
+

划分阶段所使用的工具

+
    +
  • 白板,即时贴等
  • +
  • MS Excel 或 MS Project
  • +
  • 控制会议的内容
  • +
+

将项目阶段分解为若干单元/任务:

+
    +
  • 从阶段1,阶段2,…,按阶段顺序进行划分
  • +
  • 将单元和任务不可以分解的太细
  • +
  • 只需要注明单元和任务干什么,而不是如何去做
  • +
  • 检查任务依赖:一个任务必须等另一个任务完成后才开始
  • +
  • 检查任务限制:一个任务必须在某个特定时间开始
  • +
  • 检查任务的串行关系,并注明
  • +
  • 检查任务的并行关系,并注明
  • +
+

使用的工具

+
    +
  • 白板,即时贴等
  • +
  • MS Excel 或 MS Project
  • +
  • 控制会议的内容
  • +
+

建立现实的项目时间表的任务:

+
    +
  • 严格保证项目的范围,不允许随意改变
  • +
  • 项目范围若一定要改变,则应重新校订可行性、预算、WBS
  • +
  • 保证项目的各阶段、各单元、各任务的时间分配是合理的
  • +
  • 组织团队成员或外聘专家对项目的各任务的详细讨论
  • +
  • 检查每个任务完成的时间和可交付的成果(!!!)
  • +
  • 检查每个单元完成的时间和可交付的成果(!!!)
  • +
  • 检查每个阶段完成的时间和可交付的成果(!!!)
  • +
  • 检查整个项目完成的时间和可交付的成果(!!!)
  • +
+

严格按WBS委派和执行任务,确定项目经理的权威性可管理角色

+

项目经理应经常和团队成员(特别是核心成员)交流,保持项目团队的积极向上精神,建立信心,增强信任感和价值感

+

工作分解结构的表示(图结构示例)

+

image-20200323104341369

+

目录结构示例

+

1 Alpha

+

1.1 问题定义

+

1.2 可行性研究

+

1.3 需求分析

+

1.4 设计

+

1.4.1 UI 设计

+

1.4.2 网络设计

+

1.4.3 数据库设计

+

1.4.4 架构设计

+

1.4.5 业务所涉及

+

1.5 编码

+

2 Beta

+

3 Finial

+
Author: SHYEE
Link: http://example.com/2020/03/13/%E5%B7%A5%E4%BD%9C%E5%88%86%E8%A7%A3%E7%BB%93%E6%9E%84/
Copyright Notice: All articles in this blog are licensed under CC BY-NC-SA 4.0 unless stating additionally.
\ No newline at end of file diff --git "a/2020/03/13/\347\254\254\344\270\200\351\203\250\345\210\206\357\274\232\346\211\213\345\267\245\345\244\207\344\273\275\344\270\216\346\201\242\345\244\215/index.html" "b/2020/03/13/\347\254\254\344\270\200\351\203\250\345\210\206\357\274\232\346\211\213\345\267\245\345\244\207\344\273\275\344\270\216\346\201\242\345\244\215/index.html" new file mode 100644 index 0000000..f8d754a --- /dev/null +++ "b/2020/03/13/\347\254\254\344\270\200\351\203\250\345\210\206\357\274\232\346\211\213\345\267\245\345\244\207\344\273\275\344\270\216\346\201\242\345\244\215/index.html" @@ -0,0 +1,764 @@ +备份与恢复 | SHYEE-PLASMA + + + + + + + + + + + + + +

备份与恢复

第一部分:手工备份与恢复

+

第一章:备份恢复概述

+

一)数据库故障类型:

+

1)user process failure: pmon 自动处理

+

2)instance failure: smon 自动处理

+

3)user errors : 需要dba通过备份恢复解决

+

4)media failure:必须通过备份和日志恢复

+

二)备份和恢复计划

+

1)根据生产环境的恢复周期,制定详细的备份计划,然后严格执行

+

2)对备份,要在一定的时间内利用测试环境,进行故障恢复的练习

+

三)备份恢复分类

+

1)逻辑备份与恢复– 面向object

+

①传统的导入导出:exp/imp:

+

②数据泵导入导出:expdp/impdp

+

逻辑备份就是热备数据库对象某一时刻状态,不能运用在media failure上,逻辑备份的恢复就是还原备份,没有recover的概念。

+

2)物理备份与恢复– 面向media failure

+

①手工备份与恢复,也叫用户管理的备份与恢复,通过OS 的命令,完成备份与还原,然后再运用日志进行恢复。

+

②自动备份与恢复,利用oracle 的备份恢复工具rman,使还原与恢复过程自动完成,可以备份恢复ASM FILE。

+

物理备份从方式上可以有一致性备份(冷备)和非一致性备份(热备)

+

完整的备份策略应该以物理备份为主,逻辑备份为辅(用于备份一些重要的表)

+

3)闪回技术– 面向人为的逻辑错误

+

一种利用undo数据或闪回日志的快速恢复技术。可以针对不同层面问题进行逻辑恢复,11g支持七种flashback方式。

+

四)完全恢复与不完全恢复

+

media failure后,需要运用日志进行recover。

+

1)完全恢复:

+

利用完整备份或部分备份,可以将datafile恢复到failure前得最后一次commit,不会出现数据丢失。

+

2)不完全恢复

+

需要运用完整备份和日志将database恢复到过去的某个时间点(或SCN),有数据丢失。

+

img

+

五)归档与非归档

+

1)归档模式:redo log 写入 archive log

+

2)非归档模式:没有archive log, redo log file循环覆盖

+

img

+

当处于非归档模式下时,在丢失数据文件后唯一的选择是执行完整的数据库还原,而不能进行recover。

+

第二章:手工备份与恢复

+

一)相关命令

+

1)备份和还原都使用OS命令,如linux中的cp

+

2)恢复用sqlplus命令:recover

+

二)备份前进行检查:

+

1)检查需要备份的数据文件

+

SQL> select name from v$datafile;

+

SQL> select file_id,file_name,tablespace_name from dba_data_files;

+

2)检查要备份的控制文件

+

SQL> select name from v$controlfile;

+

3)在线redo日志不需要做备份

+

三)dbv检查坏块

+

在手工备份前,应该检查datafile 是否有坏块,备份完后对备份也要做检查。

+

对某个datafile做坏块检查

+

$ dbv file=/u01/oradata/prod/users01.dbf feedback=50

+

DBVERIFY - 开始验证: FILE = /u01/oradata/prod/users01.dbf

+

…….

+

四)冷备的注意事项:

+

1)必须干净的关闭数据库,以保证数据一致性。

+

SQL>shutdwon immediate;

+

2)在OS下必须备份所有数据文件

+

3)在OS下必须备份控制文件(至少备份一个)

+

4)非归档备份还原策略

+

恢复时还原所有备份,重建所有在线日志, 没有recover步骤。

+

SQL>startup mount

+

SQL>alter database clear logfile group n;(n为所有在线日志组)

+

SQL>alter database open;

+

五)手工非一致性备份(热备份)

+

1)在备份前要进入热备模式,备份后要结束热备模式

+

执行begin backup 设置备份模式(在数据文件上生成检查点,写入scn ,将来恢复的时候以此scn为起点)

+

对只读的表空间不能做热备份,临时表空间不需要备份,特别强调:NOARCHIVE模式下不支持手工热备。

+

对整个数据库设置热备模式:SQL> alter database begin backup

+

对整个数据库结束热备模式:SQL> alter database end backup;

+

对单个表空间设置热备模式:SQL> alter tablespace users begin backup;

+

对单个表空间结束热备模式:SQL> alter tablespace users end backup;

+

2)手工热备利用v$backup 监控

+

例;

+

SQL> alter tablespace test begin backup;

+

SQL> select file#,checkpoint_change# from v$datafile_header;

+

FILE# CHECKPOINT_CHANGE#

+
+

​ 1 2414314

+

​ 2 2414314

+

​ 3 2414314

+

​ 4 2414314

+

​ 5 2414314

+

​ 6 2430480 在备份期间,scn被冻结,它是恢复阶段运用日志的起点。

+

​ 7 2414314

+

SQL> select * from v$backup;

+

FILE# STATUS CHANGE# TIME

+
+

​ 1 NOT ACTIVE 0

+

​ 2 NOT ACTIVE 0

+

​ 3 NOT ACTIVE 0

+

​ 4 NOT ACTIVE 0

+

​ 5 NOT ACTIVE 0

+

​ 6 ACTIVE 2430480 2012-07-30 11:07:19

+

​ 7 NOT ACTIVE 0

+

STATUS 是ACTIVE,表示可以备份相应的数据文件。

+

$cp test01.dbf test01.bak

+

SQL> alter tablespace test end backup;

+

SQL> select * from v$backup;

+

备份完毕,尽快执行end backup

+

如果在end backup之前发生数据库abort,那么可以在下次启动到mount时end backup,从而完成实例恢复。

+

六)split block问题

+

一个Oracle block一般包含多个OS block,,当手工热备时,OS的cp单位不是Oracle block而是OS block,而Oracle的DBWR又可能不时的从内存中刷新Oracle block(,如此,OS级的脏块)到磁盘上拷贝便可能造成:一个Oracle Block是由不同的版本组成,比如未被DBWR刷新Header block 加上另一部分被刷新的foot block,这样cp出来的Oracle blcok就是split block。

+

数据库的一致性是不允许oracle block是split的, Oracle采取的办法是:在backup mode后,如果发现首次DBWR要写脏块,则将该块被刷新之前的镜像数据记录到redo buffer,这样,虽然cp后的文件里仍然含有split block,而当需要恢复时,日志会前滚该块的前镜像,以保证所有被恢复的oracle block最终是一个完整的版本。

+

这就是我们常常发现在热备时日志文件会急剧增大的原因。

+

第三章:手工完全恢复

+

一)基本概念

+

1)完全恢复的步骤

+

1)restore: OS拷贝命令还原所有或部分datafile

+

2)recover:SQL*PLUS利用归档日志和当前的redo日志做恢复

+

2)完全恢复可以基于三个级别

+

recover database: 所有数据文件损坏,或包括大部分datafile丢失,一般是在mount状态完成

+

recover tablespace: 非关键表空间损坏,表空间下某些数据文件不能访问,一般是在open下完成

+

recover datafile: 单一或少数数据文件损坏,可以在mount或open 状态完成

+

3)什么是关键文件

+

如果关键文件损坏,数据库将不能维持在open状态,或崩溃或死机!

+

哪些文件是关键文件:①system01 file,②undotbs file,③control file,④current log file

+

4)恢复过程可以查看的视图:

+

1)v$recover_file 查看需要恢复的datafile

+

2)v$recovery_log 查看recover 需要的redo 日志

+

3)v$archvied_log 查看已经归档的日志

+

二)适用场景

+

1)recover database (所有或大部分数据文件损坏,mount或open下进行)

+

OS:使用cp 还原受损的dbf(不一定是全部,v$recover_file记录的都需要还原)

+

SQLPLUS:

+

①recover database;

+

②alter database open;

+

2)recover tablespace (针对表空间的非关键数据文件损坏,一般是open下进行)

+

OS:使用cp 还原该表空间XXX下的所有数据文件

+

SQLPLUS:

+

①alter tablespace XXX offline;

+

②recover tablespace XXX;

+

③alter tablespace XXX online;

+

3)recover datafile (单个或几个数据文件损坏,关键文件在mount下进行,非关键文件在open下进行)

+

第一种情形

+

OS:使用cp 还原相关的关键数据文件(mount)

+

SQLPLUS:

+

①recover datafile 6,8;

+

②alter database open;

+

第二种情形

+

OS:使用cp 还原相关的非关键数据文件(open)

+

SQLPLUS:

+

①alter database datafile 6,8 offline;

+

②recover datafile 6,8;

+

③alter database datafile 6,8 online;

+

三)示例

+

前提: 有一套datafile全备, 使用当前控制文件, 自上次备份以来的归档日志和当前联机日志是完整的。

+

示例1:recover database (如果是system01.dbf损坏只能在mount下恢复。)

+

sys:

+

SQL> select * from scott.test;

+

​ ID

+

-———

+

​ 1

+

在这个状态下先在OS下做一个数据文件和控制文件的冷备。

+

SQL> shutdown immediate

+

[oracle@prod ~] $cp /u01/oradata/prod/*.dbf /u01/back1

+

[oracle@prod ~] $cp /u01/oradata/prod/*.ctl /u01/back1

+

[oracle@prod ~] $startup

+

SQL> insert into scott.test values(2);

+

SQL> commit;

+

SQL> insert into scott.test values(3);

+

SQL> select * from scott.test;

+

​ ID

+

-———

+

​ 2

+

​ 3 这条记录未提交,恢复时会回滚掉

+

​ 1

+

1)模拟介质失败

+

[oracle@prod ~]$ rm /u01/oradata/prod/system01.dbf 数据库在打开的情况下就删除关键文件

+

[oracle@prod ~]$ rm/u01/oradata/prod/users01.dbf

+

[oracle@prod ~]$ rm/u01/oradata/prod/example01.dbf

+

$sqlplus / as sysdba 换个session登录,然后关闭数据库

+

SQL> shutdown abort 数据库直接abort了

+

2)启动database,报错!

+

SQL> startup

+

SQL>select file#,error from v$recover_file;

+

3)还原损坏的三个数据文件

+

[oracle@prod ~]$ cp /u01/back1/system01.dbf /u01/oradata/prod

+

[oracle@prod ~]$ cp /u01/back1/users01.dbf /u01/oradata/prod

+

[oracle@prod ~]$ cp /u01/back1/example01.dbf /u01/oradata/prod

+

4)比较控制文件和数据文件头的SCN

+

SQL> select file#,heckpoint_change# from v$datafile;

+

SQL> select file#,heckpoint_change# from v$datafile_header;

+

SQL> recover database;

+

SQL> select file#,checkpoint_change# from v$datafile;

+

5)打开数据库

+

SQL> alter database open;

+

6)验证

+

SQL> select * from scott.test;

+

​ ID

+

-———

+

​ 2

+

​ 1

+

示例2:recover tablespace(状态:database open)

+

针对的是非关键表空间的损坏,基于表空间的完全恢复实际上还是对其下的datafile的恢复

+

模拟这种情形非常实用,通常是某个非关键表空间下的数据文件受损,但并没有造成Oracle崩溃,我们只需针对个别有问题的tablespace去做单独的在线恢复操作,也就是说恢复时数据库整体是online的,而局部表空间是offline的,数据库不需要shutdown。

+

恢复表空间(删除了tablespace下的所有的datafile)

+

1)了解一下当前状态,在test表空间上建立scott.t1表,

+

SQL> conn scott/scott

+

SQL> create table t1 (id int) tablespace test;

+

SQL> insert into t1 values(1);

+

SQL> commit;

+

SQL> select * from t1;

+

NAME

+

-————————————————-

+

1

+

2)模拟表空间损坏,数据库open下,直接删除表空间下的数据文件

+

[oracle@prod ~]$ rm /u01/oradata/prod/test01.dbf

+

3)查证该表空间上的表不可访问了

+

SQL> alter system flush buffer_cache; 清除data buffer

+

SQL> conn / as sysdba 换个session登陆,访问t1表,因内存里已清除了buffer块,只好去做物理读,所以报错!

+

SQL> select * from scott.t1;

+

4)看看scn的情况

+

SQL> select file#,checkpoint_change# from v$datafile;

+

SQL> select file#,checkpoint_change# from v$datafile_header;

+

5)将test表空间offline

+

SQL> alter tablespace test offline immediate; immediate使表空间能立即脱机,不等Oracle对任何数据文件做检查

+

6)数据库open下,使用备份还原这个表空间下的所有数据文件

+

[oracle@prod ~]$ cp /u01/back1/test01.dbf /u01/oradata/prod

+

7)恢复tablespace

+

SQL> recover tablespace test;

+

8)使表空间online

+

SQL> alter tablespace test online; 此时数据库状态一直是open的

+

9)验证

+

SQL> select * from scott.t1;

+

ID

+

-————————————————-

+

1

+

示例3:recover datafile(database mount或open状态)

+

恢复datafile, 同范例2不同的是模拟UNDO文件损坏: 因UNDO数据文件也是关键文件,所以只能在mount状态下恢复。

+

1)模拟环境:

+

SQL> insert into scott.t1 values(2); 插入一行记录是为了使t1和备份有区别

+

SQL> commit;

+

SQL> select * from scott.t1;

+

ID

+

-————————————————-

+

1

+

2

+

SQL> delete scott.t1; 注意:删掉了t1并没有提交,老值在UNDO里。

+

2)在open 状态下删除datafile

+

[oracle@prod ~]$ rm /u01/oradata/prod/undotbs01.dbf

+

3)关闭数据库

+

SQL> shtudown abort

+

4)启动数据库mount

+

SQL> startup

+

数据库装载完毕。

+

ORA-01157: 无法标识/锁定数据文件 3 - 请参阅 DBWR 跟踪文件

+

ORA-01110: 数据文件 3: ‘/u01/oradata/prod/undotbs01.dbf’

+

5)还原并恢复UNDO数据文件

+

[oracle@prod prod]$ cp /u01/back1/undotbs01.dbf ./

+

SQL> recover datafile 3;

+

完成介质恢复。

+

6)打开数据库(会完成UNDO表空间数据的回滚)

+

SQL> alter database open;

+

数据库已更改

+

7)验证

+

SQL> select * from scott.t1;

+

ID

+

-————————————————-

+

1

+

2

+

第四章:手工不完全恢复

+

一)基本概念

+

1)不完全恢复的特点:

+

①必须停机,在mount下运行重做日志。

+

②必须以sysdba身份连接进行不完全恢复。

+

③让整个database 回到过去某个时间点,不能避免数据丢失。

+

2)不完全恢复(Incomplete recover) 适用环境:

+

①在过去的某个时间点重要的数据被破坏。

+

②最小化备份测试。

+

③在做完全恢复时,丢失了部分归档日志或当前online redo log(考点)

+

④当误删除了表空间时(使用备份的控制文件)

+

3)不完全恢复的基本类型:

+

①基于时间点(until time) 使整个数据库恢复到过去的一个时间点前

+

②基于scn(until change) 使整个数据库恢复到过去的某个SCN前

+

③基于cancel (until cancel) 使整个数据库恢复到归档日志或当前日志的断点前

+

④基于误删除表空间(使用备份的controlfile) 使整个数据库恢复到误删除表空间前

+

二)不完全恢复的步骤

+

1)利用logminer 工具,找出在某个时间点所作的DDL 或DML 误操作(包括:时间点、scn、sql语句)

+

2)做当前数据库的最新全备。

+

3)使用还原点前的备份还原数据文件,

+

4)运用日志恢复所有数据文件,前滚至需要的时间点前停止。

+

5)使用resetlogs方式打开数据库。

+

三)使用当前控制文件做不完全恢复

+

示例1: 恢复过去某个时间点误删除的table(基于时间点的不完全恢复)

+

1)环境:scott用户在test表空间下有个t1表

+

SQL> conn scott/scott

+

SQL> select * from t1;

+

​ ID

+

-———

+

​ 1

+

​ 2

+

2)误删除了t1表,并purge了。

+

SQL> drop table t1 purge;

+

SQL> select * from v$log;

+

SQL> alter system switch logfile;

+

SQL> /

+

SQL> select name from v$archived_log;

+

NAME

+

-——————————————————————————-

+

/u01/disk1/prod/arch_1_782662700_131.log

+

/u01/disk1/prod/arch_1_782662700_132.log

+

/u01/disk1/prod/arch_1_782662700_133.log drop table t1 purge的日志条目切换到此归档日志里了。

+

/u01/disk1/prod/arch_1_782662700_134.log

+

/u01/disk1/prod/arch_1_782662700_135.log

+

3)通过logmr 找出误操作的ddl命令的timestamp 或 scn,然后做一个不完全恢复。

+

①建目录、设置参数

+

$>mkdir -p /home/oracle/logmnr

+

SQL> alter system set utl_file_dir=’/home/oracle/logmnr’ scope=spfile;

+

SQL> startup force;

+

SQL> show parameter utl_file_dir

+

NAME TYPE VALUE

+
+

utl_file_dir string /home/oracle/logmnr

+

②指定logmnr目录

+

SQL> execute dbms_logmnr_d.build(‘dict.ora’,’/home/oracle/logmnr’,dbms_logmnr_d.store_in_flat_file);

+

③添加第一条日志条目

+

SQL> execute dbms_logmnr.add_logfile(logfilename=>’/u01/disk1/prod/arch_1_782662700_133.log’,options=>dbms_logmnr.new);

+

④添加后续日志条目

+

SQL> execute dbms_logmnr.add_logfile(logfilename=>’/u01/disk1/prod/arch_1_782662700_134.log’,options=>dbms_logmnr.addfile);

+

⑤解析日志条目

+

SQL> execute dbms_logmnr.start_logmnr(dictfilename=>’/home/oracle/logmnr/dict.ora’,options=>dbms_logmnr.ddl_dict_tracking);

+

⑥查看v$logmnr_contents视图

+

SQL> select username,scn,to_char(timestamp,’yyyy-mm-dd hh24:mi:ss’) time,sql_redo from v$logmnr_contents WHERE lower(sql_redo) like ‘drop table%’;

+

USERNAME SCN TIME SQL_REDO

+
+

SCOTT 1918000 2012-08-01 17:28:29 drop table t1 purge;

+

⑦关闭lognmr

+

SQL> execute dbms_logmnr.end_logmnr;

+

4)关闭数据库,删除所有dbf,准备做不完全恢复

+

SQL> shutdown abort

+

[oracle@prod ~]$ cd /u01/oradata/prod

+

[oracle@prod ~]$ rm *.dbf

+

5)还原所有备份的数据文件

+

[oracle@prod ~]$ cp /u01/back1/*.dbf ./

+

6)根据log miner提供的信息,做基于时间点的不完全恢复

+

SQL> startup

+

SQL> recover database until time ‘2012-08-01 17:28:29’;

+

ORA-00279: change 1917581 generated at 07/18/2012 16:46:34 needed for thread 1

+

ORA-00289: suggestion : /u01/disk1/prod/arch_1_782662700_133.log

+

ORA-00280: change 1917581 for thread 1 is in sequence #133

+

17:33:17 Specify log: {=suggested | filename | AUTO | CANCEL}

+

auto

+

Log applied.

+

Media recovery complete.

+

7)resetlogs方式打开数据库

+

SQL> alter database open resetlogs;

+

8)验证

+

SQL> select * from scott.t1;

+

​ ID

+

-———

+

​ 1

+

​ 2

+

9)看看在resetlogs后,日志sequence重置了。

+

SQL> select * from v$log;

+

示例2:当前日志组损坏,造成数据库崩溃。

+

session 1

+

SQL> create table scott.t1(id int);

+

SQL> insert into scott.t1 values(1);

+

SQL> commit;

+

SQL> alter system archive log current;

+

SQL> insert into scott.t1 values(2);

+

SQL> commit;

+

SQL> select * from scott.t1;

+

​ ID

+

-———

+

​ 1 这条已经归档

+

​ 2 这条在当前日志中,没有归档

+

SQL> select group#,sequence#,status from v$log;

+

GROUP# SEQUENCE# STATUS

+
+

​ 1 22 CURRENT 查v$logfile知道group1是redo01.log

+

​ 2 20 INACTIVE

+

​ 3 21 ACTIVE

+

session 2

+

[oracle@cuug prod]$ rm redo01.log

+

session 1

+

SQL> shutdown abort

+

session 2

+

[oracle@cuug prod]$ rm *.dbf

+

[oracle@cuug prod]$ cp /u01/back1/*.dbf ./ 还原所有数据文件备份

+

session 1

+

SQL> startup

+

ORA-00313: 无法打开日志组 1 (用于线程 1) 的成员 ORA-00312:

+

联机日志 1 线程 1: ‘/u01/oradata/prod/redo01.log’

+

SQL> recover database until cancel;

+

ORA-00279: 更改 1016334 (在 04/08/2016 15:45:03 生成) 对于线程 1 是必需的 ORA-00289:

+

建议: /u01/arch/prod/arch_1_904564083_22.log 一定要确认一下这个日志是否是当前日志。

+

ORA-00280: 更改 1016334 (用于线程 1) 在序列 #22 中

+

Specify log: {=suggested | filename | AUTO | CANCEL}

+

cancel

+

Media recovery cancelled.

+

SQL> alter database open resetlogs;

+

SQL> select * from scott.t1;

+

​ ID

+

-———

+

​ 1

+

四)使用备份控制文件做不完全恢复

+

1)为什么会使用备份的控制文件?

+

①当前控制文件全部损坏,而数据文件和控制文件的备份及当前日志处于不同的SCN版本

+

②当前控制文件没有损坏,但想要恢复误删除的表空间。

+

2)使用备份的控制文件恢复数据库的语法:

+

recover database until [time|change] using backup controlfile;

+

[time|change]是可选的,就是说如果条件满足,仍然可以做到完全恢复。

+

接下来会有如下选项:

+

Specify log: {=suggested | filename | AUTO | CANCEL}

+

此语法的出现是由于控制文件和当前日志不一致,当前日志的scn总是最新的,而控制文件可能是旧的或尚未更新的(类似shutdwon abort操作)。

+

AUTO: 根据v$archived_log记录的归档日志前滚恢复,不包括前滚current log;

+

filename: 不在v$archived_log中的日志,指控制文件中受损的归档记录或current log

+

CANCEL: 退出。

+

3)使用backup controlfile子句的恢复数据库之后,一律要使用alter database open resetlogs打开数据库。

+

示例1

+

环境:当前所有控制文件损坏,数据文件损坏,有数据文件全备,但之后增加了表空间,并备份了配套的控制文件。

+

模式:所有数据文件备份(老)——(新建表空间abcd)—–备份控制文件(次新)——日志文件(新)

+

分析:新建表空间数据文件损坏, 全备里没有该数据文件的备份及控制文件描述,当前控制文件又丢失,只能用备份的控制文件恢复。

+

1)环境:

+

SQL> select * from v$tablespace;

+

SQL> select GROUP#,SEQUENCE#,STATUS from v$log;

+

GROUP# SEQUENCE# STATUS

+
+

1 7 CURRENT

+

2 5 INACTIVE

+

3 6 INACTIVE

+

SQL> create tablespace abcd datafile ‘/u01/oradata/prod/abcd01.dbf’ size 5m;

+

SQL> create table scott.a1 (name char(10)) tablespace abcd;

+

SQL> insert into scott.a1 values(‘a’);

+

SQL> commit;

+

SQL> select * from scott.a1;

+

NAME

+

-———

+

a

+

SQL> alter system switch logfile;

+

2)备份控制文件

+

SQL> alter database backup controlfile to ‘/u01/oradata/prod/con.bak1’;

+

3)模拟abcd01.dbf损坏和所有ctl损坏

+

[oracle@prod ~]$rm /u01/oradata/prod/abcd01.dbf 数据库open状态,删除abcd01.dbf数据文件

+

SQL> alter system flush buffer_cache; db buffer 清空

+

SQL> conn / as sysdba 换个session查看 a1表物理读失败

+

SQL> select * from scott.a1;

+

[oracle@prod ~]$ rm *.ctl

+

4)关闭数据库

+

SQL> shutdown abort;

+

5)恢复所有数据文件备份,准备做不完全恢复

+

[oracle@prod ~]$ cd /u01/oradata/prod

+

[oracle@prod ~]$ rm *.dbf

+

[oracle@prod ~]$ cp /u01/back1/*.dbf ./

+

[oracle@prod ~]$ cp con.bak1 control01.ctl

+

[oracle@prod ~]$ cp con.bak1 control02.ctl

+

[oracle@prod ~]$ cp con.bak1 control03.ctl

+

SQL> startup

+

SQL> col name for a50;

+

SQL> select file#,checkpoint_change#,name from v$datafile;

+

FILE# CHECKPOINT_CHANGE# NAME

+
+

​ 1 6676574 /u01/oradata/prod/system01.dbf

+

​ 2 6676574 /u01/oradata/prod/sysaux01.dbf

+

​ 3 6676601 /u01/oradata/prod/abcd01.dbf

+

​ 4 6676574 /u01/oradata/prod/user01.dbf

+

​ 5 6676574 /u01/oradata/prod/example01.dbf

+

​ 6 6676574 /u01/oradata/prod/test01.dbf

+

​ 7 6676574 /u01/oradata/prod/undotbs01.dbf

+

SQL> select file#,checkpoint_change# from v$datafile_header;

+

FILE# CHECKPOINT_CHANGE#

+
+

​ 1 6676343

+

​ 2 6676343

+

​ 3 0

+

​ 4 6676343

+

​ 5 6676343

+

​ 6 6676343

+

​ 7 6676343

+

可以看出:

+

①file3 在控制文件里记录是abcd01.dbf,而与之对应的数据文件3是不存在的,

+

②备份的数据备份的scn比控制文件scn还老。

+

6)使用备份控制文件恢复

+

SQL> recover database using backup controlfile;

+

ORA-00283: 恢复会话因错误而取消

+

ORA-01110: 数据文件 3: ‘/u01/oradata/prod/abcd01.dbf’

+

ORA-01157: 无法标识/锁定数据文件 3 - 请参阅 DBWR 跟踪文件

+

ORA-01110: 数据文件 3: ‘/u01/oradata/prod/abcd01.dbf’

+

此错是因为老备份里没有abcd表空间,但只要控制文件里记录了abcd就好办,方法是建一个datafile的空文件,而其中内容可由日志文件recover(前滚)时填补出来。

+

SQL> alter database create datafile ‘/u01/oradata/prod/abcd01.dbf’;

+

SQL> recover database using backup controlfile; 再次使用备份控制文件恢复

+

ORA-00308: 无法打开归档日志 ‘/u01/disk1/prod/arch_1_804846837_9.log’

+

ORA-27037: 无法获得文件状态

+

Linux Error: 2: No such file or directory

+

Additional information: 3

+

archive日志前滚结束了,但当前日志里还有信息需要恢复

+

注意: 对于这个例子来说,一定要看清提示:如果提示的不是归档的日志(是当前日志),则要直接要输入filename 而不能输入auto,否则open时会失败。

+

SQL> recover database using backup controlfile; 再次使用备份控制文件恢复

+

指定日志: {=suggested | filename | AUTO | CANCEL}

+

/u01/oradata/prod/redo03.log 把当前日志它。

+

已应用的日志。

+

完成介质恢复。

+

7)resetlogs打开数据库

+

SQL> alter database open resetlogs;

+

8)验证

+

SQL> select * from scott.a1;

+

NAME

+

-—————————————

+

a

+

示例2:

+

环境:当前控制文件损坏,新建表空间在备份控制文件之后

+

模式:全备(老)—–备份控制文件(次新)—–新建表空间abcd——日志文件(新)

+

分析:整个恢复过程中datafile结构有了变化,变化发生在备份控制文件之后,新增了表空间abcd。控制文件备份里没有此表空间记录,但日志里有。

+

1)环境

+

SQL> drop tablespace abcd including contents and datafiles;

+

SQL> alter database backup controlfile to ‘/u01/oradata/prod/con.bak’;

+

控制文件备份中没有abcd表空间

+

SQL> create tablespace abcd datafile ‘/u01/oradata/prod/abcd01.dbf’ size 5m;

+

SQL> create table scott.r1 (id int) tablespace abcd ;

+

SQL> insert into scott.r1 values(1);

+

SQL> commit;

+

SQL> select * from v$tablespace;

+

SQL> select * from scott.r1;

+

​ ID

+

-———

+

​ 1

+

SQL>select GROUP#,SEQUENCE#,STATUS from v$log;

+

GROUP# SEQUENCE# STATUS

+
+

1 1 CURRENT

+

2 0 UNUSED

+

3 0 UNUSED

+

2)模拟新建数据文件损坏

+

[oracle@prod ~]rm abcd01.dbf

+

SQL>alter system flush buffer_cache;

+

SQL>conn / as sysdba

+

SQL>select * from scott.r1;

+

3)关闭数据库

+

SQL>shutdown abort

+

4)还原所有数据文件,以老控制文件替换当前控制文件

+

[oracle@prod ~]$ cd /u01/oradata/prod

+

[oracle@prod ~]$ rm *.ctl

+

[oracle@prod ~]$ rm *.dbf

+

[oracle@prod ~]$ cp /u01/back1/*.dbf ./

+

[oracle@prod ~]$ cp con.bak2 control01.ctl

+

[oracle@prod ~]$ cp con.bak2 control02.ctl

+

[oracle@prod ~]$ cp con.bak2 control03.ctl

+

5)启动数据库

+

SQL> startup

+

ORACLE 例程已经启动。

+

……

+

数据库装载完毕。

+

ORA-01589: 要打开数据库则必须使用 RESETLOGS 或 NORESETLOGS 选项

+

SQL> select file#,checkpoint_change#,name from v$datafile;

+

SQL> select file#,checkpoint_change# from v$datafile_header;

+

6)使用备份控制文件恢复数据库

+

SQL> recover database using backup controlfile;

+

ORA-00279: 更改 6676343 (在 01/16/2013 14:11:39 生成) 对于线程 1 是必需的

+

ORA-00289: 建议: /u01/disk1/prod/arch_1_804846837_4.log

+

ORA-00280: 更改 6676343 (用于线程 1) 在序列 #4 中

+

指定日志: {=suggested | filename | AUTO | CANCEL}

+

auto

+

指定日志: {=suggested | filename | AUTO | CANCEL}

+

/u01/oradata/prod/redo01.log

+

ORA-00283: 恢复会话因错误而取消

+

ORA-01244: 未命名的数据文件由介质恢复添加至控制文件

+

ORA-01110: 数据文件 3: ‘/u01/oradata/prod/abcd01.dbf’

+

ORA-01112: 未启动介质恢复

+

SQL> select file#,checkpoint_change#,name from v$datafile;

+

FILE# CHECKPOINT_CHANGE# NAME

+
+

​ 1 6678002 /u01/oradata/prod/system01.dbf

+

​ 2 6678002 /u01/oradata/prod/sysaux01.dbf

+

​ 3 6677999 /u01/oracle/dbs/UNNAMED00003 这是从日志回写到控制文件中的名字,需要重命名

+

​ 4 6678002 /u01/oradata/prod/user01.dbf

+

​ 5 6678002 /u01/oradata/prod/example01.dbf

+

​ 6 6678002 /u01/oradata/prod/test01.dbf

+

​ 7 6678002 /u01/oradata/prod/undotbs01.dbf

+

SQL> select file#,checkpoint_change# from v$datafile_header;

+

FILE# CHECKPOINT_CHANGE#

+
+

​ 1 6678002

+

​ 2 6678002

+

​ 3 0 这里需要建立一个空的数据文件。

+

​ 4 6678002

+

​ 5 6678002

+

​ 6 6678002

+

​ 7 6678002

+

7)建立数据文件并对控制文件中未知的数据文件重命名

+

SQL> alter database create datafile ‘/u01/oracle/dbs/UNNAMED00003’ as ‘/u01/oradata/prod/abcd01.dbf’;

+

上面的命令一石二鸟,自动完成了两个动作

+

①加了一个数据文件abcd01.dbf,

+

②重命名控制文件UNNAMED00003为abcd01.dbf

+

SQL> select file#,checkpoint_change#,name from v$datafile;

+

FILE# CHECKPOINT_CHANGE# NAME

+
+

​ 1 6678002 /u01/oradata/prod/system01.dbf

+

​ 2 6678002 /u01/oradata/prod/sysaux01.dbf

+

​ 3 6677999 /u01/oradata/prod/abcd01.dbf

+

​ 4 6678002 /u01/oradata/prod/user01.dbf

+

​ 5 6678002 /u01/oradata/prod/example01.dbf

+

​ 6 6678002 /u01/oradata/prod/test01.dbf

+

​ 7 6678002 /u01/oradata/prod/undotbs01.dbf

+

SQL> recover database using backup controlfile;

+

8)resetlogs打开数据库

+

SQL> alter database open resetlogs;

+

9)验证

+

SQL> select * from scott.r1;

+

​ ID

+

-———

+
Author: SHYEE
Link: http://example.com/2020/03/13/%E7%AC%AC%E4%B8%80%E9%83%A8%E5%88%86%EF%BC%9A%E6%89%8B%E5%B7%A5%E5%A4%87%E4%BB%BD%E4%B8%8E%E6%81%A2%E5%A4%8D/
Copyright Notice: All articles in this blog are licensed under CC BY-NC-SA 4.0 unless stating additionally.
\ No newline at end of file diff --git "a/2020/03/16/Heliogabalus\347\232\204\347\216\253\347\221\260/index.html" "b/2020/03/16/Heliogabalus\347\232\204\347\216\253\347\221\260/index.html" new file mode 100644 index 0000000..255560d --- /dev/null +++ "b/2020/03/16/Heliogabalus\347\232\204\347\216\253\347\221\260/index.html" @@ -0,0 +1,175 @@ +Heliogabalus的玫瑰 | SHYEE-PLASMA + + + + + + + + + + + + +

Heliogabalus的玫瑰

img

+

The Roses of Heliogabalus depicts the young Roman emperor Elagabalus (203–222 CE) hosting a banquet, being swamped by drifts of pink rose petals falling from a false ceiling above. The youthful emperor, wearing a golden silk robe and tiara, watches the spectacle from a platform behind them, with other garlanded guests. A woman plays the double pipes beside a marble pillar in the background, wearing the leopard skin of a maenad, with a bronze statue of Dionysus, based on the Ludovisi Dionysus, in front of a view of distant hills.

+

Heliogabalus的玫瑰描绘了年轻的罗马皇帝Elagabalus(公元203-222年)举办的一场宴会,会场上,从屋顶假天花板上掉下来的粉红玫瑰花瓣淹没了宾客。这位年轻的皇帝穿着金色的丝绸长袍,带着头饰,半卧在客人身后的平台上,和其他有花环的客人一起观看了这场奇观。一名妇女在后面的大理石柱子旁边演奏着双管,她身穿梅纳德的豹纹裙,在她身边,是以卢多维西·狄俄尼索斯(Ludovisi Dionysus)为基础雕刻的狄俄尼索斯铜像,向雕像后方眺望,远处便是成片的山峦。

+

The painting depicts a (probably invented) episode taken from the Augustan History. Although the Latin refers to “violets and other flowers,” Alma-Tadema depicts Elagabalus smothering his unsuspecting guests with rose petals. The original reference is this: “In a banqueting-room with a reversible ceiling he once buried his guests in violets and other flowers, so that some were actually smothered to death, being unable to crawl out to the top.”

+

这幅画描绘了摘自奥古斯都历史的一部分(可能是杜撰)。尽管拉丁语提到的是“紫罗兰色和其他花朵”,但Alma-Tadema所描绘是Elagabalus用玫瑰花瓣窒息了他那些毫无戒心的客人。最初的参考是这样的:“在一个有可翻转天花板的宴会厅里,他曾经把客人们埋在紫罗兰和其他花朵中,使一些人被窒息而死,无法爬到山顶。”

+

The painting was commissioned by Sir John Aird in 1888. As roses were out of season in the United Kingdom, Alma-Tadema is reputed to have had rose petals sent from the south of France each week during the four months in which it was painted.

+

这幅画是约翰·艾尔德爵士(Sir John Aird)于1888年创作的。由于玫瑰在英国已经不合时宜,据说Alma-Tadema在创作的四个月中,每周都有从法国南部寄来的玫瑰花瓣。

+
+

Elagabalus(埃拉伽巴路斯)

+

他的本名为瓦瑞乌斯·阿维图斯·巴西安努斯(Varius Avitus Bassianus),登基之後改名为马尔库斯·奥瑞里乌斯·安东尼努斯(Marcus Aurelius Antoninus)。他是罗马帝国建立以来,第一位出身自帝国东方——叙利亚——的皇帝。在卡拉卡拉遇刺身亡後,政军情势纷扰不已,东方军团拥立这位流有塞维鲁王族血统的少年继位;218年,在战胜马克里努斯之後,埃拉伽巴路斯成为罗马帝国的皇帝。

+

——百度百科

+
Author: SHYEE
Link: http://example.com/2020/03/16/Heliogabalus%E7%9A%84%E7%8E%AB%E7%91%B0/
Copyright Notice: All articles in this blog are licensed under CC BY-NC-SA 4.0 unless stating additionally.
\ No newline at end of file diff --git a/2020/03/16/Stack/image-20200316102101311.png b/2020/03/16/Stack/image-20200316102101311.png new file mode 100644 index 0000000..5fe399b Binary files /dev/null and b/2020/03/16/Stack/image-20200316102101311.png differ diff --git a/2020/03/16/Stack/index.html b/2020/03/16/Stack/index.html new file mode 100644 index 0000000..12e0305 --- /dev/null +++ b/2020/03/16/Stack/index.html @@ -0,0 +1,208 @@ +Stack | SHYEE-PLASMA + + + + + + + + + + + + + + + +

Stack

只允许在一端进行插入或删除操作的线性表

+

后进先出LIFO

image-20200316102101311

+

进栈顺序:a1->a2->a3->a4->a5

+

出栈顺序:a5->a4->a3->a2->a1

+

基本操作

InitStack(&S):初始化栈。构造一个空栈S,分配内存空间。创建

+

DestroyStack(&L):销毁栈。销毁并释放栈S所占用的内存空间。销毁

+

Push(&S,x):进栈,若栈S未满,则将x加入使之成为新栈顶。

+

Pop(&S,&x):出栈,若栈S非空,则弹出栈项元素,并用x返回。

+

GetTop(S, &x):读栈顶元素。若栈S非空,则用x返回栈顶元素。
查栈的使用场景中大
多只访问栈顶元素

+

其他常用操作

StackEmpty(S):判断-一个栈S是否为空。若S为空,则返回true,否则返回false。

+

规律

n个不同元素进栈,出栈元素不同排列的个数为

+

$$ \frac{1}{n+1}\sideset{}{^n_2n}C $$

+

1/n+1乘Cn 2n

+

上述公式称为卡特兰(Catalan) 数,可采用数学归纳法证
明(不要求掌握)

+

5个进栈有42种方式

+

顺序栈

定义

1
2
3
4
5
6
7
8
#define MaxSize 10
//定义栈中元素的最大个数
typedef struct{
ElemType data [MaxSize];
//静态数组存放栈中元素
int top;
//栈顶指针
} SqStack;
+ +

顺序存储:给各个数据元素分配连续的存储空间,大小为MaxSize*sizeof(ElemType)

+

初始化

1
2
3
4
5
//初始化栈
void InitStack(SqStack &S){
S.top=-1;
//初始化栈顶指针
}
+ +

判断是否为空

1
2
3
4
5
//判断栈空
bool StackEmpty(SqStack S){
return S.top==-1?true:false;
//S.top==-1为空栈
}
+ +

进栈

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
#define MaxSize 10//定义栈中元素的最大个数
typedef struct{
ElemType data [MaxSize];//静态数组存放栈中元素
int top;//栈顶指针
} SqStack;

//新元素入栈
bool Push(SqStack &S , ElemType x){
if(S.top==MaxSize-1) //栈满,报错
return false;
S.top = S.top + 1;//指针先加1
S.data[S.top]=x;//新元素入栈
//相当于S.data[++S.top]=x;
return true;
}
+ +

出栈

1
2
3
4
5
6
7
8
9
//出栈操作
bool Pop(SqStack &S, ElemType &x){
if(S.top==-1)//栈空,报错
return false;
x=S.data [S.top];//栈顶元素先出栈
S.top = S.top-1; //指针再减1
//相当于x=S.data[S.top--];
return true;
}
+ +

读栈顶元素

1
2
3
4
5
6
7
//读栈项元素
bool GetTop(SqStack S, ElemType &x){
if(S.top==-1)//栈空,报错
return false;
x=S.data[S.top];//x记录栈顶元素
return true;
}
+ +

销毁

清空:top=-1

+

回收:系统自动回收

+

栈顶指针的另一种设计方式

在初始化栈的时候 S.top=-1改为S.top=0

+

即设定top指向下一个元素

+

出栈和入栈等操作相应的改变

S.data[++S.top]=x->S.data[S.top++]=x

+

x=S.data[S.top--]->x=S.data[--S.top]

+

缺点

栈的大小不可变

+

共享栈

两个栈共享一片空间

+
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
//定义
#define MaxSize 10 //定义栈中元素的最大个数
typedef struct{
ElemType data [MaxSize]; //静态数组存放栈中元素
int top0; //0号栈钱顶指针
int top1; //1号栈浅顶指针
} ShStack;

//初始化栈
void InitStack(ShStack &S){
S.top0=-1; //初始化栈顶指针
S.top1=MaxSize;
}
//判满
top0+1==top1
+ +

链栈

相当于一个规定只能从头节点一侧进行操作的单链表

+

定义

1
2
3
4
typedef struct Linknode{
ElemType data;//数据域
struct Linknode *next;//指针域
}*LiStack;//栈类型定义
+ +
Author: SHYEE
Link: http://example.com/2020/03/16/Stack/
Copyright Notice: All articles in this blog are licensed under CC BY-NC-SA 4.0 unless stating additionally.
\ No newline at end of file diff --git "a/2020/03/16/\345\205\263\344\272\216\345\256\211\350\243\205MyBatis/index.html" "b/2020/03/16/\345\205\263\344\272\216\345\256\211\350\243\205MyBatis/index.html" new file mode 100644 index 0000000..a67af6f --- /dev/null +++ "b/2020/03/16/\345\205\263\344\272\216\345\256\211\350\243\205MyBatis/index.html" @@ -0,0 +1,243 @@ +关于安装MyBatis | SHYEE-PLASMA + + + + + + + + + + + + +

关于安装MyBatis

环境:

+
    +
  1. JDK 13.0.2
  2. +
  3. tomcat 9.0.3
  4. +
  5. mybatis 3.5.4
  6. +
  7. mysql 8
  8. +
+

入门

早期为:ibatis:apache

+

2010年被Google收购改称:Mybatis

+

主要作用:简化JDBC操作,实现数据的持久化。

+

ORM:Object Relational Mapping,可以使开发人员像操作对象一样操作数据库

+

mybatis是ORM的一种实现

+

下载

之前看过的一个教程是使用Idea的,也就是直接使用依赖库导入,这次看的是导入jar使用。

+

去官网

img

+

选择Getting Started

+

img

+

会有Maven方式,当然使用Idea就可以直接复制代码框内代码到idea中,但这次选择jar的超链接。

+

img

+

就来到了熟悉的github,在最新版本下,有三个选项,这里选择第一个zip包下载。

+

img

+

下好之后是个zip,

+

img

+

打开以后目录文件如图,

+

lib文件夹存放mybatis的一些依赖包,

+

license就是字面意思 许可证,

+

mybatis-3.5.4.jar即要用到的jar,

+

.pdf即使用说明书,

+

NOTICE也是字面意思 注意事项。

+

使用

简单使用一下:

+

导包

打开eclipse,新建一个JAVA项目,因为mybatis是操控数据库的,所以暂时可以先间隔Javaproject试一下。

+

这里起名“TestMyBatis”,将mybatis-3.5.4.jar拖到src里面,顺便add to buildpath,添加环境。

+

建表

打开cmd或者使用navicat,因为我的navicat建数据库总是会有数据编码混乱的问题,我一般建表都是用cmd。

+

img

+

创建实体类及映射关系

创建实体类 Person

+

img

+

构建这个类

+

-

-

-

-

-

-

-

-

-

-

-

-

-

-

-

-

+
1
2
private String id;private String name;private int age;
public Person() { }public Person(String id, String name, int age) { super(); this.id = id; this.name = name; this.age = age;}public String getId() { return id;}public void setId(String id) { this.id = id;}public String getName() { return name;}public void setName(String name) { this.name = name;}public int getAge() { return age;}public void setAge(int age) { this.age = age;}
+ +

创建配置文件映射表和类的映射 .xml文件

+

img

+

点这里转换视图

+

在刚刚的.pdf文件中有大概的配置方法,打开后找到“Exploring Mapped SQL Statements

+

下面有

+

-

-

-

-

+
1
<?xml version="1.0" encoding="UTF-8" ?> <!DOCTYPE mapper  PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd"> <mapper namespace="org.mybatis.example.BlogMapper">      <select id="selectBlog" resultType="Blog">            select * from Blog where id = #{id}    </select> </mapper>
+ +

直接复制,到刚刚的xml中,更改namespace 后面的内容为自己的xmltop.eshyee.entity.personMapper

+

改完之后

+

-

-

-

-

+
1
<?xml version="1.0" encoding="UTF-8" ?> <!DOCTYPE mapper  PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"  "http://mybatis.org/dtd/mybatis-3-mapper.dtd"><mapper namespace="top.eshyee.entity.personMapper">  <select id="queryPersonById" resultType="Person" parameterType="String">    select * from person where id= #{id}  </select></mapper>
+ +

在创建一个配置文件,在src下创建一个叫config.xml的文件。

+

在pdf中查找“Building SqlSessionFactory from XML

+

这里需要提前准备好一个用来链接的jar MySQL connector

+

网址:https://dev.mysql.com/downloads/connector/j/

+

img

+

选zip,下好之后,里面乱七八糟的东西就不细致分析了,会点工地英语看看就好。主要使用mysql-connector-java-8.0.19.jar。拖到eclipse ,add一下环境。

+

配置xml如下:

+

-

-

-

-

-

-

-

-

-

1
<?xml version="1.0" encoding="UTF-8" ?> <!DOCTYPE configuration  PUBLIC "-//mybatis.org//DTD Config 3.0//EN"  "http://mybatis.org/dtd/mybatis-3-config.dtd"><configuration>  <environments default="development">    <environment id="development">      <transactionManager type="JDBC" />      <dataSource type="POOLED">        <property name="driver" value="com.mysql.cj.jdbc.Driver" />        <property name="url" value="jdbc:mysql://localhost:3306/test?useSSL=false&amp;serverTimezone=UTC" />        <property name="username" value="我的用户名" />        <property name="password" value="我的密码" />      </dataSource>    </environment>  </environments>  <mappers>    <mapper resource="top/eshyee/entity/personMapper.xml" />  </mappers></configuration>
+ +

ok写个测试用例

+

-

-

-

-

-

-

1
public static void main(String[] args) throws IOException {    // TODO Auto-generated method stub    //加载config    Reader reader =Resources.getResourceAsReader("config.xml");    SqlSessionFactory sessionFactory=new SqlSessionFactoryBuilder().build(reader);    SqlSession session= sessionFactory.openSession();    String statement ="top.eshyee.entity.personMapper.queryPersonById";    Person person=session.selectOne(statement,"1234567890");    //这里的1234567890是我接下来要插入的字符串    System.out.println(person.toString());    session.close();  }
+ +

同时在person下写一个toString()方法,这个可以自己来定,只要能看到person里的值就🉑。

+

测试

测试一下~~在数据库中插入一行数据

+

img

+

run一下test

+

img

+

🆗

+

常见问题

    +
  1. 写完之后run的时候除了问题,报了一坨错其中有个timezone…想起来url写的jdbc:mysql://localhost:3306/test,然后后面加了?useSSL=false&serverTimezone=UTC,结果还不对,就百度了一下&在xml中是一种很神奇的存在得写成&.
  2. +
  3. Resource导包的时候选择org.apache.ibatis.io.*;
  4. +
+

总结

从不总结👌

+

喜欢此内容的人还喜欢

+

恭喜中国作协,你们的会员汪芳和港独一起被BBC授奖了!恭喜中国作协,你们的会员汪芳和港独一起被BBC授奖了!…明德时评不喜欢不看的原因确定内容质量低 不看此公众号BC爆增1933例,17人丧生,27校沦陷,麦当劳大统华中招,持续恶化学校或将关闭BC爆增1933例,17人丧生,27校沦陷,麦当劳大统华中招,持续恶化学校或将关闭…每天温哥华不喜欢不看的原因确定内容质量低 不看此公众号

+

img

+

微信扫一扫
关注该公众号

+
Author: SHYEE
Link: http://example.com/2020/03/16/%E5%85%B3%E4%BA%8E%E5%AE%89%E8%A3%85MyBatis/
Copyright Notice: All articles in this blog are licensed under CC BY-NC-SA 4.0 unless stating additionally.
\ No newline at end of file diff --git "a/2020/03/16/\345\206\231\345\207\272\350\277\231\344\270\252\346\225\260/index.html" "b/2020/03/16/\345\206\231\345\207\272\350\277\231\344\270\252\346\225\260/index.html" new file mode 100644 index 0000000..657d42d --- /dev/null +++ "b/2020/03/16/\345\206\231\345\207\272\350\277\231\344\270\252\346\225\260/index.html" @@ -0,0 +1,238 @@ +写出这个数 | SHYEE-PLASMA + + + + + + + + + + + + +

写出这个数

写出这个数

原创 EShyee EShyee 2019-09-26

+

写出这个数

+

读入一个正整数 n,计算其各位数字之和,用汉语拼音写出和的每一位数字。

+

输入格式:

每个测试输入包含 1 个测试用例,即给出自然数 n 的值。这里保证 n 小于 10100。

+

输出格式:

在一行内输出 n 的各位数字之和的每一位,拼音数字间有 1 空格,但一行中最后一个拼音数字后没有空格。

+

输入样例:

1
1234567890987654321123456789
+ +

输出样例:

1
yi san wu
+ + + +

My answer:

+

package com.Eshyee.SumIn;

+

import java.util.Scanner;

+

public class Sum {

+

​ public static void main(String[] args) {

+

​ Scanner in = new Scanner(System.in);

+

​ //输入这个字符串

+

​ String s = in.nextLine();

+

​ int a = 0;

+

​ String c = “\0”;

+

​ for (int i = 0; i < s.length(); i++) {

+

​ //把字符串转换成int类型

+

​ a += s.charAt(i) - 48;

+

​ }

+

​ String n = String.valueOf(a);

+

​ for (int j = 0; j < n.length(); j++) {

+

​ int b = 0;

+

​ b = n.charAt(j) - 48;

+

​ //这里相当于把数字转换成汉字

+

​ switch (b) {

+

​ case 1:

+

​ c += “yi”;

+

​ break;

+

​ case 2:

+

​ c += “er”;

+

​ break;

+

​ case 3:

+

​ c += “san”;

+

​ break;

+

​ case 4:

+

​ c += “si”;

+

​ break;

+

​ case 5:

+

​ c += “wu”;

+

​ break;

+

​ case 6:

+

​ c += “liu”;

+

​ break;

+

​ case 7:

+

​ c += “qi”;

+

​ break;

+

​ case 8:

+

​ c += “ba”;

+

​ break;

+

​ case 9:

+

​ c += “jiu”;

+

​ break;

+

​ case 0:

+

​ c += “ling”;

+

​ break;

+

​ }

+

​ c += “ “;

+

​ }

+

​ System.out.print(c.trim());

+

​ }

+

}

+

本道题主要用到switch case charAt ascii码等方面的知识点

+

主要思想是:

+

先获取一串字符,然后遍历字符串,分别转换成int类型

+

此时的int是ascii码值 然后减48 获得真正的值

+

然后做累加 然后放到一个int里面 做一个switch case(笨办法)

+

将得到的这个值转换成汉字

+

最后System从console里面输出出来

+
Author: SHYEE
Link: http://example.com/2020/03/16/%E5%86%99%E5%87%BA%E8%BF%99%E4%B8%AA%E6%95%B0/
Copyright Notice: All articles in this blog are licensed under CC BY-NC-SA 4.0 unless stating additionally.
\ No newline at end of file diff --git "a/2020/03/17/\351\234\200\346\261\202\345\210\206\346\236\220\345\255\246\344\271\240\347\254\224\350\256\260-1/index.html" "b/2020/03/17/\351\234\200\346\261\202\345\210\206\346\236\220\345\255\246\344\271\240\347\254\224\350\256\260-1/index.html" new file mode 100644 index 0000000..93e0a52 --- /dev/null +++ "b/2020/03/17/\351\234\200\346\261\202\345\210\206\346\236\220\345\255\246\344\271\240\347\254\224\350\256\260-1/index.html" @@ -0,0 +1,206 @@ +需求分析学习笔记-1 | SHYEE-PLASMA + + + + + + + + + + + + +

需求分析学习笔记-1

3-3需求分析案例

“Android点餐系统”项目案例需求获取资料介绍如下:

+

(1)目标和范围

本软件主要作用是为点餐者提供一套可以在移动设备(手机、平板)上运行的点餐软件。 系统分为前台和后台,前台是点餐者使用的,点餐者可以在移动设备上查看餐馆所有的菜目、价格、简单的菜品介绍以及餐馆的特色菜介绍,同时点餐者还可以查看、取消自己已经挑选的菜品,最后上传订单。后台是管理员使用的,管理员可以在后进行订单管理、用户管理、菜谱管理等。

+

(2)系统角色和职责

系统的使用人群包括两类管理员:系统的维护,订单管理、菜品的增删。

+

普通用户:注册账号,点餐、座位预订。

+

(3)系统处理功能要求

查询菜品
设置菜品
顾客下单
订单处理
数据处理

+

(4)系统其他要求

本系统客户端要求符合大众操作习惯,与网上其他的Android系统App操作方式保持基本一致。餐馆要求每笔订单交易误差不得超过工角,每天交易额的误差不得超过100元。5年内价位在500元以上的Android手机都可以流畅运行该系统。

+

第一阶段

工作的输入是需求定义阶段产生的业务事件列表和报表列表,输出的是领域模型和用例模型。

+

针对每个业务事件进行业务流程分析、业务实体分析和用例分析;

+

针对每类报表进行业务实体分析和用例分析。

+

业务流程分析

在分析过程中,要注意抓住核心业务和主要活动点、部门内以及部门之间的衔接,工作中的烦琐及反复的环节,成本高、效率低、时间长的环节以及任务转手次数较多的环节。

+

“Android点餐系统”中的主要业务就是点餐,我们要围绕点餐的主业务展开分析。

+

业务流程分析的过程中的三个关键的要点

一是理解流程的层次性,其中包含三大层次,有组织级,部门级
岗位级;

+

二是了解流程的类型,包括生产性流程,管理性流程和支持性流
程;

+

三是掌握以业务事件识别、寻找流程的技巧。

+

产物

跨职责流程图
活动图
数据流图

+

基于Android平台的点餐系统的总体流程包括的步骤有

1
2
3
4
5
6
7
8
9
(1)顾客在智能手机上登录点餐系统客户端后,自动进入
菜谱界面,查看菜谱;
(2)顾客选择菜品进行下单;
(3)顾客选择菜品数量,若需在餐厅用餐还需选择座位号;
(4)选择完成并确定后,提交订单;
(5)订单提交后,订单数据会上传到服务器;
(6)订单提交后,顾客可以在客户端查看自己的订单情况;
(7)在管理员未确认订单之前,顾客可以对订单进行修改或取消操作;
(8)管理员登录点餐系统服务器端,对用户订单进行确认;
+ +

跨职责流程图的应用

跨指责流程图绘制要点是在进行业务流程分析时,采用的关键入手点为部门级的业务流程,也就是从业务事件出发,分析该业务事件会触发的一系列活动。要真正保障绘制出来的跨职责流程图是真实、有效的,就必须强化用户的参与。

+

我们应先找到业务事件的负责人,然后通过设问的方式,让他描述响应该业务事件所进行的活动,说明活动的执行岗位以及它们之间的关系、数据传递。

+

(三)活动图
活动图是一种表述过程机理、业务过程以及工作流的技术。它可以用来对业务过程、工作流建模,也可以对用例实现甚至是程序实现来建模。
活动图的主要元素包含初始节点活动终点活动节点转换分支与监护条件分岔汇合等。

+

数据流程图

点餐系统由客户端和服务器端两部分组成,客户端主要负责点菜,服务器端负责信息管理。

+
客户端的基本流程
1
2
3
(1)用户输入正确的登录信息进入系统,若登录信息不对,系统提示重新输入登录系统,直到用户成功登录系统,新用户要先进行注册并注册成功才可以登录系统。
(2)用户成功登录系统后,可先查看菜品信息,选择菜品及数量,若需在餐馆用餐还需选择座位,完成后进行下单操作。
(3)用户可以查看自己的订单,在订单未确定的情况下,可以修改或取消订单。
+ +
服务器端的基本流程
1
2
(1)管理员输入正确的登录信息进入系统,若登录信息不对,系统会提示重新输入登录信息,直到管理员成功登录系统。
(2)管理员成功进入系统后,可进行各类信息的管理,如菜品信息管理、用户信息管理、订单管理等,其实就是对上述信息进行添加、删除及修改操作。
+ +

业务实体分析

要了解这个问题域中有哪些业务实体,它们之间存在什么样的逻辑关系、数量关系,以及有什么相应的结构规则。

+

1.业务实体分析任务概述

“自底向上”

+

识别出业务实体
确定实体间关系
定义实体关健属性

+

业务实体分析的产物有两种可选的模型,包括类图和E/R模型也叫实体关系图。

+

2.类图

根据边界类、控制类、实体类帮助分析系统中的类

(1)领域建模方法

+

领域建模时,其工作主要就是识别标识类、明确类之间的逻辑关系和数量关系以及添加重要的结构规则三个方面。

+

(2)建立类之间的关联

+

(3)添加类的重要属性

+
分析模型中有3种十分有用的构造型即实体类、控制类和边界类。

实体类:即实体对象的抽象,通常来自域模型也就是现实世界,用来描述具体的实体,通常映射到数据库表格与文件中;

+

控制类:即控制对象的抽象,主要用来体现应用程序的执行逻辑,将其抽象出来,可以使得变化不影响用户界面和数据库中的表;

+

边界类:即边界对象的抽象,通常是用来完成参与者(用户、外部系统)与系统之间交互的对象,例如From、对话框、菜单、接口等。

+

3.E/R图应用基础

数据建模过程的优势体现在能够更好地与后续的数据库设计
结合;

+

缺点是语义相对于类图来说更弱一些,同时对面向对象开发的指导作用相对差- - .些。

+

概念模型是需求人员的视图,等价于现在出镜率很高的领域模型;

+

逻辑模型是开发人员(包括设计人员)的视图,它约等于面向对象分析与设计方法中提到的“分析模型”。

+
概念模型与逻辑模型具体区别在于两个方面

完整性:逻辑模型在完整性上要比概念模型更胜筹,通过在需求细化、设计的阶段会对类的属性进行细化,会补充-些新的类;

+

加工方式:概念模型的原则是忠于问题域,而逻辑模型则会从实现的便利性和需要的角度进行细化,具体来说可能会对一些类进行分拆、合并。

+
Author: SHYEE
Link: http://example.com/2020/03/17/%E9%9C%80%E6%B1%82%E5%88%86%E6%9E%90%E5%AD%A6%E4%B9%A0%E7%AC%94%E8%AE%B0-1/
Copyright Notice: All articles in this blog are licensed under CC BY-NC-SA 4.0 unless stating additionally.
\ No newline at end of file diff --git "a/2020/03/19/mybatis/MyBatis\347\263\273\345\210\227-\345\205\255/index.html" "b/2020/03/19/mybatis/MyBatis\347\263\273\345\210\227-\345\205\255/index.html" new file mode 100644 index 0000000..8c6ce4b --- /dev/null +++ "b/2020/03/19/mybatis/MyBatis\347\263\273\345\210\227-\345\205\255/index.html" @@ -0,0 +1,184 @@ +MyBatis系列(六) | SHYEE-PLASMA + + + + + + + + + + + + + + + +

MyBatis系列(六)

关联查询

+ +

关于关联查询主要重点是配置好mapper

+

一对一

a.业务扩展类

+

核心:用resultType指定的类的属性包含多表查询的所有字段

+

b. resultMap

+

通过属性成员将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
<!-- 利用业务扩展类实现一对一 -->
<select id="qSByNWithO2O" resultType="top.eshyee.entity.StudentBussiness" parameterType="int">
select s.*,c.* from student s inner join studentcard c
on s.cardid =c.cardid
where s.stuno=#{stuNo}
</select>
<!-- 利用resultmap实现一对一 -->
<select id="qSByNWithMapO2O" resultMap="student_card_map" parameterType="int">
select s.*,c.* from student s inner join studentcard c
on s.cardid =c.cardid
where s.stuno=#{stuNo}
</select>
<resultMap type="student" id="student_card_map">
<id property="stuNo" column="stuNo"/>
<result property="stuName" column="stuName"/>
<result property="stuAge" column="stuAge"/>
<result property="graName" column="graName"/>
<result property="stuSex" column="stuSex"/>
<!-- 一一映射用association,一对多用collection -->
<association property="card" javaType="StudentCard">
<id property="cardId" column="cardId"/>
<result property="cardInfo" column="cardInfo"/>
</association>
</resultMap>
+ + + +

一对多(多对一)

(MyBatis:多对一,多对多的本质就是一对多的变化)

+
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
<!-- 查询1班的班级信息 和所有学生的信息 建立一对多关系 -->
<select id="qCAS" resultMap="class_student_classid" parameterType="int">
select c.*,s.* from student s
inner join studentclass c
on c.classid=s.classid
where c.classid=#{classId}
</select>
<resultMap type="top.eshyee.entity.StudentClass" id="class_student_classid">
<id property="classId" column="classId" />
<result property="className" column="className"/>
<!-- 属性类型用javatype 属性的元素类型用oftype -->
<collection property="student" ofType="top.eshyee.entity.Student">
<id property="stuNo" column="stuNo"/>
<result property="stuName" column="stuName"/>
<result property="stuAge" column="stuAge"/>
<result property="graName" column="graName"/>
<result property="stuSex" column="stuSex"/>
</collection>
</resultMap>
+ + + +

多对多

多对多 可由两个多对一等方法实现!

+
Author: SHYEE
Link: http://example.com/2020/03/19/mybatis/MyBatis%E7%B3%BB%E5%88%97-%E5%85%AD/
Copyright Notice: All articles in this blog are licensed under CC BY-NC-SA 4.0 unless stating additionally.
\ No newline at end of file diff --git "a/2020/03/25/mybatis/MyBatis\347\263\273\345\210\227-\344\270\203/index.html" "b/2020/03/25/mybatis/MyBatis\347\263\273\345\210\227-\344\270\203/index.html" new file mode 100644 index 0000000..f4c4834 --- /dev/null +++ "b/2020/03/25/mybatis/MyBatis\347\263\273\345\210\227-\344\270\203/index.html" @@ -0,0 +1,189 @@ +MyBatis系列(七) | SHYEE-PLASMA + + + + + + + + + + + + + +

MyBatis系列(七)

log4j和延迟加载

+ +

在之前下载的mybatis包中找到log4j并导入到项目

+

开启日志

如果不指定,Mybatis就会根据以下顺序寻找日志
SLF4J →Apache Commons Logging →Log4j 2→Log4j → JDK logging
日志级别:
DEBUG< INFO< WARN< ERROR
如果设置为info, 则只显示info及以上级别的信息;
建议:
在开发时设置debug,在运行时设置为info或以上。

+
1
2
3
<settings>
<setting name="logImpl" value="LOG4J" />
</settings>
+ +

每次运行就会出现诸如此类的debug

+
1
2
3
4
5
6
7
DEBUG [main] - PooledDataSource forcefully closed/removed all connections.
DEBUG [main] - PooledDataSource forcefully closed/removed all connections.
DEBUG [main] - PooledDataSource forcefully closed/removed all connections.
DEBUG [main] - PooledDataSource forcefully closed/removed all connections.
DEBUG [main] - Opening JDBC Connection
DEBUG [main] - Created connection 961160488.
DEBUG [main] - Setting autocommit to false on JDBC Connection [oracle.jdbc.driver.T4CConnection@394a2528]
+ +

配置延迟加载

嵌套查询多用于延迟加载的设计

+

具体如下

+

一对一:查学生和学生卡信息

在xml中

+
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
<!-- 延迟加载 -->
<select id="qSByNWithMapO2OLazy" resultMap="student_card_Lazyload_map" parameterType="int">
<!-- 先查学生 -->
select * from student
</select>
<resultMap type="student" id="student_card_Lazyload_map">
<id property="stuNo" column="stuNo"/>
<result property="stuName" column="stuName"/>
<result property="stuAge" column="stuAge"/>
<result property="graName" column="graName"/>
<result property="stuSex" column="stuSex"/>
<!-- 此次采用延迟加载:在查询学生时,并不立即加载学生证信息
通过select在需要的时候再查学生证
-->
<association property="card" javaType="StudentCard" select="top.eshyee.mapper.StudentCardMapper.querycardbyid" column="cardid">
<!-- <id property="cardId" column="cardId"/>
<result property="cardInfo" column="cardInfo"/> -->
</association>
</resultMap>
+ +

新建Cardmapper

+
1
2
3
4
5
<!-- 查询学生信息 -->

<select id="querycardbyid" parameterType="int" resultType="top.eshyee.entity.StudentCard">
select * from studentCard where cardid=#{cardId}
</select>
+ +

一对多:查班级和学生信息

新建班级mapper

+
1
2
3
4
5
6
7
8
9
10
11
12
13
<select id="qCASLazy" resultMap="class_student_classid_lazy" parameterType="int">
select c.* from studentclass c
</select>

<resultMap type="top.eshyee.entity.StudentClass" id="class_student_classid_lazy">
<id property="classId" column="classId" />
<result property="className" column="className"/>
<!-- 属性类型用javatype 属性的元素类型用oftype -->
<!-- 延迟加载 -->
<collection property="student" ofType="top.eshyee.entity.Student" select="top.eshyee.mapper.StudentMapper.queryStuByClassId" column="classId">

</collection>
</resultMap>
+ +

在studentmapper中

+
1
2
3
4
<!-- 延迟加载一对多 查询班级中的所有学生 -->
<select id="queryStuByClassId" parameterType="int" resultType="top.eshyee.entity.Student">
select * from student where classId=#{classId}
</select>
+ +

一对多和一对一的延迟加载配置方法相同

+
Author: SHYEE
Link: http://example.com/2020/03/25/mybatis/MyBatis%E7%B3%BB%E5%88%97-%E4%B8%83/
Copyright Notice: All articles in this blog are licensed under CC BY-NC-SA 4.0 unless stating additionally.
\ No newline at end of file diff --git "a/2020/03/26/Oracle\347\263\273\345\210\227\345\255\246\344\271\240-\345\233\233/index.html" "b/2020/03/26/Oracle\347\263\273\345\210\227\345\255\246\344\271\240-\345\233\233/index.html" new file mode 100644 index 0000000..1f75006 --- /dev/null +++ "b/2020/03/26/Oracle\347\263\273\345\210\227\345\255\246\344\271\240-\345\233\233/index.html" @@ -0,0 +1,216 @@ +Oracle系列学习(四) | SHYEE-PLASMA + + + + + + + + + + + + + +

Oracle系列学习(四)

增删改查和完整性约束

建表

+
1
2
3
4
5
6
create table student(
stuno varchar2(20),
name varchar2(20),
age int,
height number(4,1)
);
+ +

插入

insert into表 values值

+
1
2
3
4
insert into student values ('1002','李四',20,180.5);

insert into student( stuno, name ) values('1003','王五');
insert into student ( stuno, name,age )values( '1004','王五1',null) ;
+ +

查询

select字段from表

+
1
2
3
4
5
6
select * from student;
select name,age from student;
select name as 姓名 from student;
select name from student where stuno= '1004 ' ;
--隐私转换,字符串和数之间,可以自动转换
select name from student where stuno=1004;
+ +

修改

update表set字段=值 [字段=值]

+
1
2
3
4
update student set age=30, height=170;--所有字段的更新
update student set age=age+5 where name= 'ZHANGSAN';
--当字段值为null的是后执行类似age=age+5的语句不会对字段值产生影响
update student set age=age+5;--即age得现有值 才能顺利执行age+5
+ +

删除

delete from 表

+
1
delete from student where age=20;
+ +

where子句

在查询,修改,删除时可以使用where子句作为条件筛选,表示操作那些符合条件的记录

+

提交

对表的修改必须提交后才生效

+

提交指令: commit

+

回滚指令: rollback

+

表的完整性约束

当我们向表中添加数据时,如student, 可以会由于数据错误或误操作,表中会产生一些错误数据。而表的完整性约束就是为了解决这个问题。

+

如:通过唯一性约束确保学号不能重复;通过非空约束确保姓名不能为空;

+

当我们给表中的列设置约束条件后,再向表中插入数据或修改表的数据时,会检查插入或修改的数据是否满足我们的”约束条件”,如果不满足,就不会执行,这样就防止了垃圾数据的产生。

+

唯一

unique
添加唯一-约束的列, 该列值不能重复。

+

添加时机

1创建表时

+

直接在字段后添加约束名

+
1
2
3
4
5
6
create table student (
stuno varchar2(20) unique,
name varchar2(20) ,
age int,
height number(4,1)
);
+ +

2建表后再添加

+

alter table表名add constraint约束名约束关键字(字段)

+
1
alter table student add constraint uq_ stu_ stuno unique( stuno ) ;
+ +

唯一约束的列可以有多个空值(NULL)

+

非空not null

该列的值不能为空

+

例如:

+
1
2
3
4
5
--给student表的name字段添加非空约束

alter table student add constraint nn_stu_name not null(name);
--修改的时候
ALTER TABLE "MYB". "STUDENT" MODIFY ("NAME" NOT NULL)
+ +

检查check

自定义某- -列的值必须满足某个条件
例如,

+
1
2
-- 学生年龄必须在10~40之间
alter table student add constraint ck_stu_age check(age between 10 and 40);
+ +

性别只有男和女两个值
(注意当前student表并无sex字段)

+
1
alter table student add constraint ck_stu_sex check(sex in('男''女'));
+ +

主键约束与主键列的选择 primary key

主键列的数据就不能为空,并且不能重复(非空且唯一 )

+

一个表最多只能有一个主键(建议创建主键)

+

使用主键来唯一标识某条记录

+
1
ALTER TABLE“MYB"."STUDENT" ADD PRIMARY KEY ("STUNO")
+ +

逻辑主键 和 业务主键

外键

除此之外还有外键约束,这个等之后讲到多表关联之后再讲解

+

约束的真实项目使用说明

+

在真正的企业开发中,除了主键约束这类具有强需求的约束,像唯一约束、外键约束、检查约束等更多时候仅仅出现在数据库设计阶段,真实环境却很少应用,更多是放到程序逻辑中去进行处理。

+
+
Author: SHYEE
Link: http://example.com/2020/03/26/Oracle%E7%B3%BB%E5%88%97%E5%AD%A6%E4%B9%A0-%E5%9B%9B/
Copyright Notice: All articles in this blog are licensed under CC BY-NC-SA 4.0 unless stating additionally.
\ No newline at end of file diff --git "a/2020/03/30/Oracle\347\263\273\345\210\227\345\255\246\344\271\240-\344\272\224/index.html" "b/2020/03/30/Oracle\347\263\273\345\210\227\345\255\246\344\271\240-\344\272\224/index.html" new file mode 100644 index 0000000..6e0eff1 --- /dev/null +++ "b/2020/03/30/Oracle\347\263\273\345\210\227\345\255\246\344\271\240-\344\272\224/index.html" @@ -0,0 +1,311 @@ +Oracle系列学习(五) | SHYEE-PLASMA + + + + + + + + + + + + + +

Oracle系列学习(五)

查询

单表查询

主要涉及到sq|运算符、单行函数、多行函数、排序、去重

+

首先创建一个学生表stu, 包含如下字段:

+

学号id、姓名name、年龄age、性别sex、java成绩score、 体重(kg) weight、 星座xz、 生日birth、 寝室room

+
1
2
3
4
5
6
7
8
9
10
11
create table stu(
id varchar2(30) primary key,
name varchar2(30) not null,
age int,
sex varchar2(10),
score number(4,1),
weight number(4,1),
xz varchar2(10),
birth date ,
room varchar2(10)
);
+ +

向表中插入一条学生信息:

+
1
insert into stu values( '17820135', '张三' ,19,'男',81,50'狮子' ,to_date('1999-08-12,'yyyy-mm-dd'),'201');
+ +

sq|运算符

Like匹配 通配符**%**

例如:

+

查询所有姓张的学生

+
1
SELECT * FROM STU WHERE NAME LIKE '张%'
+ +

查找姓名中带有“文”字的学生信息

+
1
SELECT * FROM STU WHERE NAME LIKE '%文%'
+ +

between… and…

在两个值之间

+

例如:

+

查找班级里体重在60~70kg的学生姓名

+
1
2
3
SELECT NAME FROM STU WHERE weight BETWEEN 60 AND 70
--等价于
select * from stu where weight>F60 and weight<=70;
+ +

in

1
2
3
4
5
6
--查询体重是60或体重是70,或体重是80的同学
--查询体重是60,和体重是70,和体重是80的同学
--都是
select * from stu where weight in (60, 70, 80);
--或者
select * from stu where weight=60 or weight=70 or weight=80;
+ +

is null

值为空,即没有填写值

+

例如:
查找没有填写星座的学生信息

+
1
select * from stu where XZ is null;
+ +

not

与其他sq|运算符一起使用, 表示取反:

+

not like not between not in is not null

+

例如:

+

查找所有不姓张的学生信息

+
1
select * from stu where name not like '张%'
+ +

单行函数

使用规范: 函数名(参数)根据参数, 获取函数的结果

+

to_date

将字符串转换为日期

+

例如: to_ date( ‘2018-09-01’ ,’ yyyy-mm-dd’ )

+

表示将2018-09-01这个字符串,转换为日期数据类型

+

查询所有1999年出生的学生

+
1
select * from stu where birth between to_date( '1999-01-01' ,'YYYY-MM-DD') and to_date('1999-12-31','YYYY-MM-DD');
+ +

to_char

1
2
select * from stu where to_char(birth, 'YYYY' )='1999' ;
select * from stu where to_char(birth, 'YYYY-MM-DD') like '1999%' ;|
+ +

length

获取指定字符串值的长度

+

例如:

+

查找所有姓名是两个字的学生信息

+
1
SELECT * FROM STU WHERE LENGTH(NAME)=2;
+ +

查询学生的姓名,以及姓名的长度

+
1
SELECT NAME "学生姓名", LENGTH(NAME) "姓名长度" FROM STU ;
+ +

concat

拼接两个值,concat(值1,值2)—> 值1值2

+

查询学生的学号信息(学号信息是指 学号+姓名)

+
1
select concat(id,name) as 学生信息 from stu;
+ +
修改stu表,规范星座信息,将所有的星座保存为**座.
1
update stu set xz=concat(xz,'座') where length(xz)=2;
+ +

查询截止到当前时间每个学生都活了多少天、多少个月

+

+
1
2
3
select months_between(sysdate,(BIRTH))As 相差月份 from STU;

select NAME 姓名,FLOOR(months_between(sysdate,(BIRTH)))As 相差月份 from STU;
+ +

+
1
select TO_NUMBER(sysdate- (BIRTH))As 相差天数 from STU;
+ +

查询当前日期向后50天是多少天

+
1
select sysdate+50 next_day from dual;
+ +

查询每个学生名字的最后一个字是什么字

+
1
select substr(NAME,LENGTH(NAME),1) from STU
+ +

多行函数

多行/聚合/分组函数,作用在多行记录上,

+

avg(字段)字段的平均值

查询班级java成绩的平均分

+
1
SELECT AVG(SCORE) as java平均分 FROM "STU"
+ +

查询平均体重

+
1
SELECT avg(WEIGHT) as 平均体重 FROM stu
+ +

查询班级男同学的平均体重

+
1
SELECT avg(WEIGHT) as 平均体重 FROM stu WHERE SEX='男'
+ +

sum(字段)字段求和

查询班级所有学生的体重的和

+
1
SELECT sum(SCORE) FROM stu
+ +

max(字段)最大值

查询最高分的学生的成绩

+
1
SELECT max(SCORE) as 最高分数 FROM stu
+ +

查询最重的学生的体重

+
1
SELECT max(WEIGHT) as 最大体重 FROM stu
+ +

注意:多行函数,不能出现在where子包含

+

例如:查询最重的学生的姓名

+
1
SELECT name as 最大体重学生姓名 FROM stu where WEIGHT=(SELECT max(WEIGHT) FROM stu)
+ +

min(字段)最小值

查询最轻的学生的体重

+
1
SELECT min(WEIGHT) as 最大体重 FROM stu
+ +

查询男同学中,最轻的学生的体重

+
1
SELECT min(WEIGHT) as 男同学最小体重 FROM stu where sex='男'
+ +

count(*)查询数量

查询表中有多少条记录

+
1
select COUNT(*) FROM STU
+ +

查询班里有多少个男生

+
1
select COUNT(*) FROM STU where sex='男'
+ +

查询班级里60~ 70分之间的学生有多少个

+
1
select COUNT(*) FROM STU WHERE SCORE BETWEEN 60 AND 70
+ +

排序

order by字段 desc

默认从小到大升序,添加desc从大到小降序

+

查询所有学生信息,并按照体重从小到大排列

+
1
select *FROM stu ORDER BY WEIGHT
+ +

查询所有学生信息,按照成绩从大到小排序

+
1
select *FROM stu ORDER BY SCORE DESC
+ +

去重distinct

一般distinct都用在select查询字段中

+

查询本班级有哪些寝室

+
1
select DISTINCT room FROM stu 
+ +
+

分组

1
2
3
--@1确定按照哪个字段进行分组
--@2确定用哪个分组函数
--@3按照语法组建sq1语句
+ +

查询班级里分别有多少个男生和女生

+
1
SELECT sex,COUNT(*) FROM stu GROUP BY SEX
+ +

查询男生和女生的平均分都是多少

+
1
SELECT sex,AVG(SCORE) FROM stu GROUP BY SEX
+ +

查询每个寝室有多少成绩大于80分的同学

+
1
2
--注意,从语法上where子句要写在group by前,从逻辑上,where 也是在分组前进行条件过滤
SELECT room,COUNT(*) FROM stu WHERE SCORE>80 GROUP BY ROOM
+ +

通过查询确认一下是否有同年同月同日生的学生

+
1
select birth,count(*) from stu WHERE BIRTH is not NULL group by birth;
+ +

查询每个男生寝室有多少成绩大于80分的同学和名字

+
1
select wm_concat(name) , room, count(*) from stu where sex= '男' and score>80 group by room;
+ +

分组后的筛选

having

having子句里添加条件,对group by的结果进行条件筛选

+

having写在group by之后,并且逻辑上也是先得到分组结果,再执行筛选

+

查询寝室中人数大于5人的那些寝室和人数

+
1
select count(*) from stu group by room having count(*)>5
+ +

查询班里有没有同年同月同日生

+
1

+ +

查询平均分大于75分的寝室的寝室号和平均分

+
1

+ +
Author: SHYEE
Link: http://example.com/2020/03/30/Oracle%E7%B3%BB%E5%88%97%E5%AD%A6%E4%B9%A0-%E4%BA%94/
Copyright Notice: All articles in this blog are licensed under CC BY-NC-SA 4.0 unless stating additionally.
\ No newline at end of file diff --git "a/2020/03/30/\350\216\267\345\276\227\347\256\241\347\220\206\345\261\202\350\256\270\345\217\257\345\217\212\346\214\221\351\200\211\345\233\242\351\230\237\351\230\237\345\221\230/image-20200330102749530.png" "b/2020/03/30/\350\216\267\345\276\227\347\256\241\347\220\206\345\261\202\350\256\270\345\217\257\345\217\212\346\214\221\351\200\211\345\233\242\351\230\237\351\230\237\345\221\230/image-20200330102749530.png" new file mode 100644 index 0000000..64f06cb Binary files /dev/null and "b/2020/03/30/\350\216\267\345\276\227\347\256\241\347\220\206\345\261\202\350\256\270\345\217\257\345\217\212\346\214\221\351\200\211\345\233\242\351\230\237\351\230\237\345\221\230/image-20200330102749530.png" differ diff --git "a/2020/03/30/\350\216\267\345\276\227\347\256\241\347\220\206\345\261\202\350\256\270\345\217\257\345\217\212\346\214\221\351\200\211\345\233\242\351\230\237\351\230\237\345\221\230/image-20200330102857000.png" "b/2020/03/30/\350\216\267\345\276\227\347\256\241\347\220\206\345\261\202\350\256\270\345\217\257\345\217\212\346\214\221\351\200\211\345\233\242\351\230\237\351\230\237\345\221\230/image-20200330102857000.png" new file mode 100644 index 0000000..9894824 Binary files /dev/null and "b/2020/03/30/\350\216\267\345\276\227\347\256\241\347\220\206\345\261\202\350\256\270\345\217\257\345\217\212\346\214\221\351\200\211\345\233\242\351\230\237\351\230\237\345\221\230/image-20200330102857000.png" differ diff --git "a/2020/03/30/\350\216\267\345\276\227\347\256\241\347\220\206\345\261\202\350\256\270\345\217\257\345\217\212\346\214\221\351\200\211\345\233\242\351\230\237\351\230\237\345\221\230/index.html" "b/2020/03/30/\350\216\267\345\276\227\347\256\241\347\220\206\345\261\202\350\256\270\345\217\257\345\217\212\346\214\221\351\200\211\345\233\242\351\230\237\351\230\237\345\221\230/index.html" new file mode 100644 index 0000000..275feab --- /dev/null +++ "b/2020/03/30/\350\216\267\345\276\227\347\256\241\347\220\206\345\261\202\350\256\270\345\217\257\345\217\212\346\214\221\351\200\211\345\233\242\351\230\237\351\230\237\345\221\230/index.html" @@ -0,0 +1,279 @@ +获得管理层许可及挑选团队队员 | SHYEE-PLASMA + + + + + + + + + + + + +

获得管理层许可及挑选团队队员

获得管理层的许可

(1)向管理层提交WBS

+

(2)建立交流平台

+

步骤1:向项目发起人提交WBS

    +
  • 项目发起人可能是你的WBS获得许可的第一个障碍
  • +
  • 你要详细了解(最好记住)WBS中的每个细节
  • +
  • 必要的时候向项目发起人做必要的解释
  • +
  • 考虑你公司的商业周期和其他项目
  • +
  • 选择合适的时间提交你的WBS
  • +
  • 给项目发起人预留足够的审批时间
  • +
  • 应尽量争取一次通过项目WBS的审批通过
  • +
  • 记录项目发起人提出的任何意见或建议
  • +
  • 任何一次失败都会对你们的信任和信心造成打击
  • +
+

步骤2:向管理层提交WBS

    +
  • 同项目发起人一起向管理层提交WBS
  • +
  • 用时间基线的方式提交你的WBS
  • +
  • 演讲时强调每个阶段的完成日期,而不是时间
  • +
  • 强调停工和其他对公司造成严重影响的日期和时间
  • +
  • 不必要讲述每个阶段是如何完成的,但需要记牢,以防提问
  • +
  • 给管理层预留足够的审批时间
  • +
  • 应尽量争取一次通过项目WBS的审批通过
  • +
  • 记录管理层提出的任何意见或建议
  • +
  • 任何一次失败都会对你们的信任和信心造成打击
  • +
+

时间基线的实例

+ +

步骤3:同管理层一同工作

    +
  • 管理层的强力支持是项目成功的保障
  • +
  • 管理层和项目团队内可能存在不同看法
  • +
  • 项目经理可能和他们之间存在不同看法
  • +
  • 使管理者明白某个人可能在这个项目上要花一定时间
  • +
  • 使项目经理明白管理层将参与该项目
  • +
  • 使团队成员明白管理层已和项目经理沟通好了
  • +
  • 通过团队成员投入的时间,确定项目经理的职权范围和树立权威
  • +
+

建立交流渠道(1)

交流渠道的搭建及工具

+ + +

建立交流渠道(2)

    +
  • 交流的任务
  • +
  • 能够随时同管理层和团队成员进行交流
  • +
  • 提供有关项目的状态
  • +
  • 提供项目的更新情况
  • +
  • 告诉大家是如何完成的
  • +
  • 提供项目本身的相关信息和相关事宜
  • +
  • 交流的目的
  • +
  • 维持项目的动力
  • +
  • 鼓舞团队的士气
  • +
  • 保持信息的通畅,使团队成员有参与感
  • +
  • 保持团队活力
  • +
  • 领导团队走向成功
  • +
+

挑选团队队员

评估内部技能

了解团队成员的经验 、技能 、能力 和合作精神是项目

经理按WBS委派任务的依托。

+

如何才能了解每个成员的能力呢?

    +
  • 考查成员的经验
  • +
  • 查看成员的个人履历
  • +
  • 查看成员的技能及培训证书
  • +
  • 如何选择培训中心培训成员?
  • +
+

考查成员的经验

经验是最佳的参考指数

+
    +
  • 以前的项目:成员参加以前项目的程度、深度及角色
  • +
  • 个人的知识:用事实说明他们的声誉、完成工作的能力
  • +
  • 管理层推荐:从管理层那里获得成员的能力、知识技能
  • +
  • 成员的推荐:从其他成员那里获得成员的能力、 知识技能
  • +
+

查看成员的个人履历

    +
  • 个人履历是成员的绝密资料,要小心使用
  • +
  • 可以让成员填写从事过的项目
  • +
+

查看成员的技能及培训证书

    +
  • 证书说明成员能够使用某种技术,了解重要概念
  • +
  • 有证书并不就是专家
  • +
+

要在经验、履历和证书方面取得平衡

如何选择培训中心培训成员

    +
  • 培训方有哪些经验
  • +
  • 培训方能否特别提供适合你项目的培训计划
  • +
  • 是特别聘请老师好呢,还是让成员参加课堂培训好?
  • +
  • 有网上培训吗?
  • +
  • 课程中包含哪些材料?
  • +
  • 课程费用多少?
  • +
  • 培训地点在哪?
  • +
  • 哪种培训方式更省钱?
  • +
+

面试潜在的队员

    +
  • 面试的目的和任务
  • +
  • 怎样面试
  • +
  • 选择标准
  • +
  • 提问的方式
  • +
+

面试的目的和任务

    +
  • 以项目需要的能力、知识、技能和合作精神等为原则
  • +
  • 其一、给应试者一个深刻的印象,明白是你在管理项目
  • +
  • 其二、尽可能多地了解应试者,判断是否符合项目的需求
  • +
+

怎样面试

对项目(部门 、公司)的详细描述
    +
  • 其一、告诉应试者还有哪些工作需要完成
  • +
  • 其二、可以把注意力集中在成员所需要具有的特点上
  • +
+
要求应试者答卷或自我介绍或完成一个小的工作

选择标准

    +
  • 选择的标准是基于对工作的描述
  • +
  • 教育程度
  • +
  • 对任务的认识
  • +
  • 完成任务的经验
  • +
  • 有助于完成任务的各种技能
  • +
  • 在公司内的业绩
  • +
  • 其他的重要素质,如智力、 领导能力、合作精神及品德
  • +
+

提问的方式

    +
  • 封闭式问题,只可以回答“是”或“不是”
  • +
  • 简单的问题,如“为什么想加入我们的公司?
  • +
  • 经验问题,如“你的上司在大会上批评了你怎么办?
  • +
  • 追问问题,从应试者的回答中找问题,紧追不放
  • +
  • 不能问的问题,如:‘你先生或太太做什么的?”等
  • +
+
Author: SHYEE
Link: http://example.com/2020/03/30/%E8%8E%B7%E5%BE%97%E7%AE%A1%E7%90%86%E5%B1%82%E8%AE%B8%E5%8F%AF%E5%8F%8A%E6%8C%91%E9%80%89%E5%9B%A2%E9%98%9F%E9%98%9F%E5%91%98/
Copyright Notice: All articles in this blog are licensed under CC BY-NC-SA 4.0 unless stating additionally.
\ No newline at end of file diff --git "a/2020/04/01/MyBatis\347\263\273\345\210\227/image-20200226220001121.png" "b/2020/04/01/MyBatis\347\263\273\345\210\227/image-20200226220001121.png" new file mode 100644 index 0000000..a6c3f55 Binary files /dev/null and "b/2020/04/01/MyBatis\347\263\273\345\210\227/image-20200226220001121.png" differ diff --git "a/2020/04/01/MyBatis\347\263\273\345\210\227/image-20200331082951809.png" "b/2020/04/01/MyBatis\347\263\273\345\210\227/image-20200331082951809.png" new file mode 100644 index 0000000..12bbaa2 Binary files /dev/null and "b/2020/04/01/MyBatis\347\263\273\345\210\227/image-20200331082951809.png" differ diff --git "a/2020/04/01/MyBatis\347\263\273\345\210\227/image-20200331084348373.png" "b/2020/04/01/MyBatis\347\263\273\345\210\227/image-20200331084348373.png" new file mode 100644 index 0000000..89a4886 Binary files /dev/null and "b/2020/04/01/MyBatis\347\263\273\345\210\227/image-20200331084348373.png" differ diff --git "a/2020/04/01/MyBatis\347\263\273\345\210\227/index.html" "b/2020/04/01/MyBatis\347\263\273\345\210\227/index.html" new file mode 100644 index 0000000..bf9477c --- /dev/null +++ "b/2020/04/01/MyBatis\347\263\273\345\210\227/index.html" @@ -0,0 +1,430 @@ +MyBatis系列 | SHYEE-PLASMA + + + + + + + + + + + + + + + + + + + + +

MyBatis系列

mybatis

+ + +

关于MyBatis的增删改查实现

在MyBatis系列(一)中涉及了如何创建一个入门级的mybatis测试。

+

但是只涉及了查询单行数据,接下来 我把它补全。

+

上次采用的是MySQL数据库 ,这次我采用的是Oracle。从官网下到了Oracle6的一个jar.

+

环境:

+

eclipse 2019-12

+

Oracle 11g

+

apache tomcat 9.0.3

+

mybatis 3.5.4.jar

+

Oracle.jar

+

在Oracle中建个表

create table (stuno number,stuname varchar(20),stuage number,graname varchar(20));,

+

随变插入几行数据,此处就不放图了🈚。

+

在eclipse里构建这个类

此处省略代码,详见MyBatis系列(一)。

+

映射

新建一个studentMapper.xml(当然是要映射了🍔)。

+

新建conf.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
<configuration>
<environments default="development">
<!-- 通过default选择 数据库环境(说白了就是运行哪个数据库) -->
<environment id="development">
<!-- transactionManager事物的提交方式
JDBC 利用JDBC处理事务,手动(commit rollback,close)
MANAGED:将事务交由其他组件(spring,jobss)去托管 ,默认使用完之后会关闭连接
<property name="closeConnection" value="false" />这样就默认不关闭
-->
<transactionManager type="JDBC" />
<!-- 数据源类型:
POOLED:使用数据链接池
UNPOOLED:不用连接池,传统JDBC,每次访问数据库均需要打开和关闭数据库
JNDI:从tomcat中获取一个内置的数据库链接池(数据库链接池-数据源)
-->
<dataSource type="POOLED">
<property name="driver" value="oracle.jdbc.driver.OracleDriver" />
<property name="url" value="jdbc:oracle:thin:@127.0.0.1:1521:ORCL" />
<property name="username" value="scott" />
<property name="password" value="tiger" />
</dataSource>
</environment>
<!--因为我远端也有个数据库所以我可以再配一个环境-->
<environment id="cloud">
<transactionManager type="JDBC" />
<dataSource type="POOLED">
<property name="driver" value="com.mysql.cj.jdbc.Driver" />
<property name="url" value="jdbc:mysql://eshyee,top:3306/test?useSSL=false&amp;serverTimezone=UTC" />
<property name="username" value="我的用户名" />
<property name="password" value="我的密码" />
</dataSource>
</environment>
</environments>
<mappers>
<mapper resource="top/eshyee/entity/studentMapper.xml" />
</mappers>
</configuration>
+ +

关于Mapper.xml的新增代码,无非就是增删改查✨

+
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
<select id="queryStudentBystuNum" resultType="top.eshyee.entity.Student" parameterType="int">
select * from student where stuno= #{stuno}
</select>
<select id="queryAllStudent" resultType="top.eshyee.entity.Student">
select * from student
</select>
<insert id="addStudent" parameterType="top.eshyee.entity.Student" >
insert into student(stuno,stuname,stuage,graname) values(#{stuNo},#{stuName},#{stuAge},#{graName})
</insert>
<update id="upDateStuByNo" parameterType="top.eshyee.entity.Student">
update student set stuname=#{stuName},stuage=#{stuAge},graname=#{graName} where stuno=#{stuNo}
</update>
<delete id="deleteStuByNo" parameterType="int">
delete from student where stuno=#{stuno}
</delete>
+ +

因为查之前说了,这里就拿改学生信息来做个小测试

+
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
// 修改学生--按学号
public static void updateStuByNo() throws IOException {
Reader reader = Resources.getResourceAsReader("conf.xml");
SqlSessionFactory sessionfactory = new SqlSessionFactoryBuilder().build(reader);
SqlSession session = sessionfactory.openSession();
String statement = "top.eshyee.entity.studentMapper.upDateStuByNo";
Student stu=new Student(2,"小牛",33,"二年级");
int count = session.update(statement, stu);
session.commit();
System.out.println("修改成功," + count + "行受影响");
session.close();
}

public static void main(String[] args) throws IOException {
selectAll();
updateStuByNo();
selectAll();
}
+ +

测试,得到结果,注意要提交。

+ + +
+

mapper动态代理(MyBatis接口开发)

原则:约定优于配置

配置方式:

+

​ abc.xml

+

硬编码方式

+

​ abc.java

+

约定:默认值就是myProject

+

与传统配置的不同之处:省略掉statement,即根据约定直接定位出sql语句。

+

约定:

+
1
2
3
4
5
/*
* 1.方法名和mapper.xml文件中的id值相同
* 2.方法名的输入参数和mapper.xml文件中的标签parameterType类型一致
* 3.方法的返回值和mapper.xml文件中的resultType一致
*/
+ +

接口和mapper一一对应:namespace的value=接口的全类名

+

构建接口

所以说新建一个接口,根据前一个篇的mapper.xml的文件基础上改,注:我这里是把接口建在了mapper包下

+
1
2
3
4
5
Student queryStudentBystuNum(int stuno);
List<Student> queryAllStudent();
int addStudent(Student student);
int upDateStuByNo(Student student);
int deleteStuByNo(int stuno);
+ +

注意这里的接口要遵循上面的约定。

+

更改xml文件

再mapper.xml file中,namespace也应该改成接口的名字

+
1
<mapper namespace="top.eshyee.mapper.StudentMapper">
+ +

接下来,就是修改测试类,曾经使用的statement的地方,目前就不用使用了。

+

使用接口

这次拿删除学生举例,首先要从session中获取到这个接口,使用getMapper方法。然后从这个接口中要我刚刚写的那个删除的方法deleteStuByNo(),这里我写死删除no为3的 倒霉孩子

+
1
2
3
4
5
6
7
8
Reader reader = Resources.getResourceAsReader("conf.xml");
SqlSessionFactory sessionfactory = new SqlSessionFactoryBuilder().build(reader);
SqlSession session = sessionfactory.openSession();
StudentMapper stuMapper = session.getMapper(StudentMapper.class);
int count = stuMapper.deleteStuByNo(3);
session.commit();
System.out.println("删除成功," + count + "行受影响");
session.close();
+ +

测试一下

3号学生被删除并想你抛了一行log🌚

+ + +

总结

约定相对于配置来说,出错率更少了,因为不用写statement,而是通过调用接口去实现xml的id的调用,对于写statement的String容易手残的老哥来说,是不错的选择。

+
+

关于一些优化🍔

+

数据库连接配置

config.xml中如果配置了很多的东西,这时在想去更改数据库配置的一些参数显得尤为麻烦,这是可以新建一个properties来写一些kv对,再在config中使用<properties>标签来传值貌似就会简化一部分操作。

+

因此在src下新建一个db.properties文件。如下配置:

+
1
2
3
4
driver=oracle.jdbc.driver.OracleDriver
url=jdbc:oracle:thin:@127.0.0.1:1521:ORCL
username=scott
password=tiger
+ +

config.xml中添加

+
1
<properties resource="db.properties"></properties>
+ +

数据源中配置:

+
1
2
3
4
<property name="driver" value="${driver}" />
<property name="url" value="${url}" />
<property name="username" value="${username}" />
<property name="password" value="${password}" />
+ +

如此,每次想对数据源做更改的时候只需改变kv对即可。

+

mybatis的全局参数设置更改

谨慎更改👨‍🔧

+
1
2
3
<settings>
<setting name="" value=""/>
</settings>
+ +

设置别名

top.eshyee.entity.Student太长了🤦‍♀️,想要改别名。

+

(大小写不敏感)

+

选择两种方式:

+
设置单个别名
1
2
3
<typeAliases>
<typeAlias type="top.eshyee.entity.Student" alias="student"/>
</typeAliases>
+ +
批量设置别名
1
2
3
<typeAliases>
<package name="top.eshyee.entity"/>
</typeAliases>
+ +

还有一些内置别名。

+

小节

怎么方便怎么来呗🏊‍♀️

+
+

关于类型处理器和resultmap

+

类型处理器(类型转换器)

    +
  1. MyBatis自带一些常见的类型处理器

    +
  2. +
  3. 也可以自定义Mybatis类型处理器

    +
  4. +
+

JAVA 数据类型 –数据库(数据类型)

+

比如:

+

实体类 Student :Boolean stuSex true:男 /false:女

+

表中Student : number stuSex 1:男 / 0:女

+

自定义类型转换器

假设

我要在Student表里面新建一个性别列 男生用1 表示 女生用0表示(number类型),

+

此时实体类中我男生用的true 女生用的false(Boolean,仅仅是举个例子)。

+

数据类型不匹配此时数据类型不匹配。

+

创建类型转换器

需要实现TypeHandler接口 此接口有一个实现类 BaseTypeHandler

+

因此实现转换器有两种方法 实现 接口TypeHandler 和 继承BaseTypeHandler(简单)

+

所以这里采用后者,去extendthis method。

+
准备工作

新建一个Boolean的属性 叫做stuSex 。

+

private Boolean stuSex形成get set方法

+
转换器

新建一个转换器继承BaseTypeHandler,编译器会自动生成三个方法

+
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
//	get是DB数据-->java数据
public Boolean getNullableResult(ResultSet rs, String columnName) throws SQLException {
return rs.getInt(columnName)==1?true:false;
}

public Boolean getNullableResult(ResultSet rs, int columnIndex) throws SQLException {
return rs.getInt(columnIndex)==1?true:false;
}

public Boolean getNullableResult(CallableStatement cs, int columnIndex) throws SQLException {
return cs.getInt(columnIndex)==1?true:false;
}

// set是java数据-->DB数据
public void setNonNullParameter(PreparedStatement ps, int i, Boolean parameter, JdbcType jdbcType) throws SQLException {

if(parameter) {
ps.setInt(i, 1);
}else {
ps.setInt(i, 0);
}
}
+ +

其中,

+

ps:PreparedStatement对象
i:PreparedStatement对象操作的参数的位置
parameter:Java值
jdbcType:jdbc操作的数据类型

+

这里用到了三元运算符,想起了之前一个写个人网站用到的一个三元运算符🤦‍♂️(更)。

+
conf配置

在config中加上转换器

+
1
2
3
<typeHandlers>
<typeHandler handler="转换器类名" javaType="Boolean" jdbcType="INTEGER"/>
</typeHandlers>
+ +

这样就算是好了 测试一下

+
mapper配置

使用了转换器的查询
1如果类中属性和表中的字段类型都能合理识别(String-varchar2),则可以使用resultType resultType=”top.eshyee.entity.Student”
否则(boolean-integer)使用resultMap
2如果类中的属性名和表中的字段名都能够合理识别(stuNo-stuno)则可以使用resultType
否则(id-stuno)使用resultMap

+
1
2
3
4
5
6
7
8
9
10
<select id="queryStudentBystuNumConverter" resultMap="studentResult" parameterType="int">
select * from student where stuno= #{stuno}
</select>
<resultMap type="top.eshyee.entity.Student" id="studentResult">
<id property="stuNo" column="stuno"/>
<result property="stuName" column="stuname"/>
<result property="stuAge" column="stuage"/>
<result property="graName" column="graname"/>
<result property="stuSex" column="stusex" javaType="boolean" jdbcType="INTEGER"/>
</resultMap>
+ +

resultMap

resultMap可以实现两个功能:
1 类型转换
2 属性-字段名之间的映射关系

+

分为主键id和非主键result
如果实体类中的属性跟数据库中那个的字段名叫法不一样,从下面的映射关系中也可以更改 。

+

这样就好了,可以在test.java中测试一下了。🥐

+

小结

以前用过别的方法来转换数据库数据与java数据 但是这个更系统一些吧。

+
+

输入参数和输出参数

输入参数parameterType

简单类型

${}#{}比较

+

#{任意值}或者${value}(标识符只能是value)

+

#{}会自动给String加上’’(自动类型转换)

+

${}会原样输出,但是适合于动态排序(动态字段)

+

#{}可以防止sql注入

+

${}不可以

+

${}#{}相同之处

+

都可以获取对象的值,(嵌套类型对象)

+

对象类型

#{属性名}或者${属性名}(对象的属性名例如stuNo)

+
1
2
3
4
<select id="queryStudentByAddress" resultType="top.eshyee.entity.Student" parameterType="address">
select stuno,stuname,stuage from student
where homeaddress=#{homeAddress} or schooladdress='${schoolAddress}'
</select>
+ + + +

嵌套类型输入参数为级联属性

1
2
3
4
5
6
7
<select id="queryStudentByAddress" resultType="top.eshyee.entity.Student" parameterType="Student">
select stuno,stuname,stuage from student where homeaddress=#{address.homeAddress} or schooladdress='${address.schoolAddress}'
</select>
<select id="queryStudentBystuNameOrAge" resultType="top.eshyee.entity.Student" parameterType="Student">
select stuno,stuname,stuage from student
where stuname like '%${stuName}%' or stuage=#{stuAge}
</select>
+ +

传入为hashmap

1
2
3
4
<select id="queryStudentBystuNameOrAgewithHashmap" resultType="top.eshyee.entity.Student" parameterType="HashMap">
select stuno,stuname,stuage from student
where stuname like '%${stuName}%' or stuage=#{stuAge}
</select>
+ +

调用存储过程

存储过程的传入参数在mybatis中用map来传递(Hashmap)
CALLABLE设置sql 的调用方式是存储过程
输出参数通过map的get方法获取

+

查询某个年级的所有学生总数

数据库里
1
2
3
4
5
6
create or replace procedure queryCountByGradeWithProcadure(gName in varchar,scount out number )
as
begin
select count(1) into scount from student where graname=gname;
end;
/
+ +
mapper中
1
2
3
4
5
<select id="queryCountByGradeWithPrecadure" statementType="CALLABLE" parameterType="HashMap">
{CALL queryCountByGradeWithProcadure(
#{gName,jdbcType=VARCHAR,mode=IN},
#{sCount,jdbcType=INTEGER,mode=OUT} )}
</select>
+ +

根据学号删除学生

数据库里
1
2
3
4
5
6
create or replace procedure deleteStuBystunoWithProcedure(sno in number)
as
begin
delete from student where stuno=sno;
end;
/
+ +
mapper中
1
2
3
<delete id="deletestuByStunoWithPrecadure" statementType="CALLABLE" parameterType="HashMap">
{CALL deleteStuBystunoWithProcedure(#{sno,jdbcType=INTEGER,mode=IN})}
</delete>
+ +

输出参数

resultType

简单类型,实体对象类型,实体对象类型的集合之前有提到过,此处不再赘述。

+
输出为HashMap

通过别名作为map的key

+
1
2
3
<select id="queryStudentWithHash" resultType="HashMap">
select stuno "no",stuname "name" from student
</select>
+ +

resultMap

解决实体类型属性与数据表字段名不一致(前面有用到)

+

也可以使用HashMap+resultType

+
+

关于动态sql

if

按姓名和年龄查询

+
1
2
3
4
5
6
7
8
9
10
11
<select id="qStuByNOrAWithSQLTag" parameterType="top.eshyee.entity.Student" resultType="top.eshyee.entity.Student">
select stuno ,stuname from student where 1=1
<if test="stuName!=null and stuName!= ''">
student有stuname属性且不为null
and stuname=#{stuName}
</if>
<if test="stuAge!=null and stuAge!=0">
student有stunage属性且不为null
and stuage=#{stuAge}
</if>
</select>
+ +

这里and会出问题

+

where

where:处理第一个and

+
1
2
3
4
5
6
7
8
9
10
11
<select id="qStuByNOrAWithSQLTag" parameterType="top.eshyee.entity.Student" resultType="top.eshyee.entity.Student">
select stuno ,stuname from student
<where>
<if test="stuName!=null and stuName!= ''">
and stuname=#{stuName}
</if>
<if test="stuAge!=null and stuAge!=0">
and stuage=#{stuAge}
</if>
</where>
</select>
+ +

foreach

查询学号为1 2 4的学生学号信息

+

迭代的类型:数组、对象数组、集合、属性

+

数组

数组固定写法:array 这是约定

+
1
2
3
4
5
6
7
8
9
10
<select id="queryStuwithNoWitharray" resultType="top.eshyee.entity.Student" parameterType="int[]">
select * from student
<where>
<if test="array!=null and array.length>0">
<foreach collection="array" open="and stuno in(" close=")" item="stuNo" separator=",">
#{stuNo}
</foreach>
</if>
</where>
</select>
+ +

放入对象的属性中

1
2
3
4
5
6
7
8
9
10
<select id="queryStuwithNoInGra" resultType="top.eshyee.entity.Student" parameterType="top.eshyee.entity.Grade">
select * from student
<where>
<if test="stuNos!=null and stuNos.size>0">
<foreach collection="stuNos" open="and stuno in(" close=")" item="stuNo" separator=",">
#{stuNo}
</foreach>
</if>
</where>
</select>
+ +

集合

1
2
3
4
5
6
7
8
9
10
<select id="queryStuwithNowithlist" resultType="top.eshyee.entity.Student" parameterType="top.eshyee.entity.Grade">
select * from student
<where>
<if test="list!=null and list.size>0">
<foreach collection="list" open="and stuno in(" close=")" item="stuNo" separator=",">
#{stuNo}
</foreach>
</if>
</where>
</select>
+ +

对象数组

必须使用Object[]

+
1
2
3
4
5
6
7
8
<select id="queryStuwithNowithObjArr" 
resultType="top.eshyee.entity.Student" parameterType="Object[]">
select * from student
<include refid="objectArraStuno"></include>
<!-- 如果sql片段不在一个文件
<include refid="top.eshyee.mapper.StudentMapper.objectArraStuno"></include>
-->
</select>
+ +

sql片段

重复使用的提取出来

+
1
2
3
4
5
6
7
8
9
<sql id="objectArraStuno">
<where>
<if test="array!=null and array.length>0">
<foreach collection="array" open="and stuno in(" close=")" item="student" separator=",">
#{student.stuNo}
</foreach>
</if>
</where>
</sql>
+ +
+

关联查询

关于关联查询主要重点是配置好mapper

+

一对一

a.业务扩展类

+

核心:用resultType指定的类的属性包含多表查询的所有字段

+

b. resultMap

+

通过属性成员将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
<!-- 利用业务扩展类实现一对一 -->
<select id="qSByNWithO2O" resultType="top.eshyee.entity.StudentBussiness" parameterType="int">
select s.*,c.* from student s inner join studentcard c
on s.cardid =c.cardid
where s.stuno=#{stuNo}
</select>
<!-- 利用resultmap实现一对一 -->
<select id="qSByNWithMapO2O" resultMap="student_card_map" parameterType="int">
select s.*,c.* from student s inner join studentcard c
on s.cardid =c.cardid
where s.stuno=#{stuNo}
</select>
<resultMap type="student" id="student_card_map">
<id property="stuNo" column="stuNo"/>
<result property="stuName" column="stuName"/>
<result property="stuAge" column="stuAge"/>
<result property="graName" column="graName"/>
<result property="stuSex" column="stuSex"/>
<!-- 一一映射用association,一对多用collection -->
<association property="card" javaType="StudentCard">
<id property="cardId" column="cardId"/>
<result property="cardInfo" column="cardInfo"/>
</association>
</resultMap>
+ + + +

一对多(多对一)

(MyBatis:多对一,多对多的本质就是一对多的变化)

+
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
<!-- 查询1班的班级信息 和所有学生的信息 建立一对多关系 -->
<select id="qCAS" resultMap="class_student_classid" parameterType="int">
select c.*,s.* from student s
inner join studentclass c
on c.classid=s.classid
where c.classid=#{classId}
</select>
<resultMap type="top.eshyee.entity.StudentClass" id="class_student_classid">
<id property="classId" column="classId" />
<result property="className" column="className"/>
<!-- 属性类型用javatype 属性的元素类型用oftype -->
<collection property="student" ofType="top.eshyee.entity.Student">
<id property="stuNo" column="stuNo"/>
<result property="stuName" column="stuName"/>
<result property="stuAge" column="stuAge"/>
<result property="graName" column="graName"/>
<result property="stuSex" column="stuSex"/>
</collection>
</resultMap>
+ +

多对多

多对多 可由两个多对一等方法实现!

+
+

log4j和延迟加载

在之前下载的mybatis包中找到log4j并导入到项目

+

开启日志

如果不指定,Mybatis就会根据以下顺序寻找日志
SLF4J →Apache Commons Logging →Log4j 2→Log4j → JDK logging
日志级别:
DEBUG< INFO< WARN< ERROR
如果设置为info, 则只显示info及以上级别的信息;
建议:
在开发时设置debug,在运行时设置为info或以上。

+
1
2
3
<settings>
<setting name="logImpl" value="LOG4J" />
</settings>
+ +

每次运行就会出现诸如此类的debug

+
1
2
3
4
5
6
7
DEBUG [main] - PooledDataSource forcefully closed/removed all connections.
DEBUG [main] - PooledDataSource forcefully closed/removed all connections.
DEBUG [main] - PooledDataSource forcefully closed/removed all connections.
DEBUG [main] - PooledDataSource forcefully closed/removed all connections.
DEBUG [main] - Opening JDBC Connection
DEBUG [main] - Created connection 961160488.
DEBUG [main] - Setting autocommit to false on JDBC Connection [oracle.jdbc.driver.T4CConnection@394a2528]
+ +

配置延迟加载

嵌套查询多用于延迟加载的设计

+

具体如下

+

一对一:查学生和学生卡信息

在xml中

+
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
<!-- 延迟加载 -->
<select id="qSByNWithMapO2OLazy" resultMap="student_card_Lazyload_map" parameterType="int">
<!-- 先查学生 -->
select * from student
</select>
<resultMap type="student" id="student_card_Lazyload_map">
<id property="stuNo" column="stuNo"/>
<result property="stuName" column="stuName"/>
<result property="stuAge" column="stuAge"/>
<result property="graName" column="graName"/>
<result property="stuSex" column="stuSex"/>
<!-- 此次采用延迟加载:在查询学生时,并不立即加载学生证信息
通过select在需要的时候再查学生证
-->
<association property="card" javaType="StudentCard" select="top.eshyee.mapper.StudentCardMapper.querycardbyid" column="cardid">
<!-- <id property="cardId" column="cardId"/>
<result property="cardInfo" column="cardInfo"/> -->
</association>
</resultMap>
+ +

新建Cardmapper

+
1
2
3
4
5
<!-- 查询学生信息 -->

<select id="querycardbyid" parameterType="int" resultType="top.eshyee.entity.StudentCard">
select * from studentCard where cardid=#{cardId}
</select>
+ +

一对多:查班级和学生信息

新建班级mapper

+
1
2
3
4
5
6
7
8
9
10
11
12
13
<select id="qCASLazy" resultMap="class_student_classid_lazy" parameterType="int">
select c.* from studentclass c
</select>

<resultMap type="top.eshyee.entity.StudentClass" id="class_student_classid_lazy">
<id property="classId" column="classId" />
<result property="className" column="className"/>
<!-- 属性类型用javatype 属性的元素类型用oftype -->
<!-- 延迟加载 -->
<collection property="student" ofType="top.eshyee.entity.Student" select="top.eshyee.mapper.StudentMapper.queryStuByClassId" column="classId">

</collection>
</resultMap>
+ +

在studentmapper中

+
1
2
3
4
<!-- 延迟加载一对多 查询班级中的所有学生 -->
<select id="queryStuByClassId" parameterType="int" resultType="top.eshyee.entity.Student">
select * from student where classId=#{classId}
</select>
+ +

一对多和一对一的延迟加载配置方法相同

+
+

mybatis 缓存

查询缓存

一级缓存:同一个SqlSession对象

+ +

MyBatis默认开启一级缓存,如果用同样的SqlSession对象查询相同的数据,则只会在第一次查询时向数据库发送SQL语句,并将查询的结果放入到SQLSESSION中(作为缓存在) ;后续再次查询该同样的对象时则直接从缓存中查询该对象即可(即省略了数据库的访问)。

+

二级缓存

+

Mybatis自带二级缓存: [同一个namespace]生成的mapper对象

+

MyBati s默认情况没有开启二级缓存,需要手工打开。

+

conf.xml中

+
1
2
<!-- 开启二级缓存 -->
<setting name="cacheEnable" value="true"/>
+ +

mapper中

+
1
2
<!-- 声明此namespace开启二级缓存 -->
<cache/>
+ +

异常提示:NotSerializableException可知,MyBatis的二级缓存是将对象放入硬盘文件中

+

序列化:内存->硬盘

+

反序列化:硬盘->内存

+

准备缓存的对象,必须实现了序列化接口( 如果开启的缓存Namespace="top.eshyee.mapper.StudentMapper" 可知序列化对象为Student,因此需要将Student序列化(序 列化Student类,以及Student的级联属性、和父类)

+

触发将对象写入二级缓存的时机: SqlSession对象的close()方法

+

回顾: namespace的值 就是接口的全类名(包名.类名) ,通过接口可以产生代理对象(Mapper对象)

+

–>namespace决定了Mapper对象的产生

+

结论:只要产生的xxxMapper对象来自于同一个namespace,则这些对象共享二级缓存。

+

如果是同一个SqISession对象进行多次相同的查询,则直接进入一级缓存查询;

+ + +

如果不是同一个SqISession对象进行多次相同的查询(但是均来自同一个namespace)则进入二级缓存查询

+

如果一个namespace, 如果有多个xxMapper. xml的namespace值相同, 则通过这些xxxMapper. xml产生的xxMapper,仍然共享二级缓存。

+

禁用:

+

在需要禁用的select标签中的usecache属性改为false

+

清理:与清理一级缓存的方法相同,一般执行增删改时会清理掉缓存 ,设计的原因是为了防止脏数据

+

commit();

+

commit会清理一级和二级缓存;但是清理二级缓存时,不能是查询自身的commit()

+

改标签

+

在select标签中设置flushCache= "true"

+

命中率:
1 :0% 0.0

+

2:50% 0.5

+

3:2/3 0.666

+

4:3/4 0.75

+

三方提供的二级缓存:

+

ehicache、memcache

+

要想整合三方提供的二级缓存(或者自定义二级缓存) ,必须实现org.apache.ibatis.cache.Cache接口,该接口的默认实现类是PerpetualCache

+

整合ehcache二级缓存:

+

Ehcache-core.jar
mybatis- Ehcache.jar
slf4j-api.jar

+

编写ehcache配置文件Ehcache.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
<ehcache xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:noNamespaceSchemaLocation="ehcache.xsd" updateCheck="true"
monitoring="autodetect" dynamicConfig="true">
<!-- 当二级缓存的对象超过内存限制时(缓存对象的个数>maxElements InMemory
),存放入的硬盘路径 -->
<diskStore path="D:\Ehcache" />
<!-- maxElementsInMemory:设置在内存中缓存对象的个数
maxElementsOnDisk:设置在硬盘中缓存对象的个数
eternal: 设置缓存是否永远不过期
overflowToDisk:当内存中缓存的对象个数超过maxElementsInMemory的时候,是否转移到硬盘中
timeToIdleSeconds:当2次访问超过该值的时候,将缓存对象失效
timeToliveSeconds:一个缓存对象最多存放的时间(生命周期)
diskExpiryThreadIntervalSeconds:设置每隔多长时间,通过一个线程来清理硬盘中的缓存
memoryStioreEvictionPolicy: 当超过缓存对象的最大值时,处理的策略 LRU,FIFO,LFU
-->

<defaultCache

maxElementsInMemory="1000"
maxElementsOnDisk="1000000"
eternal="false"
overflowToDisk="false"
timeToIdleSeconds="100"
timeToLiveSeconds="100"
diskExpiryThreadIntervalSeconds="120"
memoryStoreEvictionPolicy="LRU">
</defaultCache>

</ehcache>
+ +

配置mapper

+
1
2
3
4
<cache type= "org.mybatis.caches.ehcache.EhcacheCache">
<property name= "maxELementsInMemory" value= "2000" />
可以覆盖掉默认值
</cache>
+ +
Author: SHYEE
Link: http://example.com/2020/04/01/MyBatis%E7%B3%BB%E5%88%97/
Copyright Notice: All articles in this blog are licensed under CC BY-NC-SA 4.0 unless stating additionally.
Announcement
等离子体实验室
Catalog
  1. 1. 关于MyBatis的增删改查实现
    1. 1.0.1. 在Oracle中建个表
    2. 1.0.2. 在eclipse里构建这个类
    3. 1.0.3. 映射
  • 2. mapper动态代理(MyBatis接口开发)
    1. 2.0.0.0.1. 原则:约定优于配置
  • 2.0.1. 构建接口
  • 2.0.2. 更改xml文件
  • 2.0.3. 使用接口
  • 2.0.4. 测试一下
  • 3. 总结
    1. 3.1. 数据库连接配置
    2. 3.2. mybatis的全局参数设置更改
    3. 3.3. 设置别名
      1. 3.3.0.0.1. 设置单个别名
      2. 3.3.0.0.2. 批量设置别名
  • 4. 小节
  • 5. 类型处理器(类型转换器)
    1. 5.1. 自定义类型转换器
      1. 5.1.1. 假设
      2. 5.1.2. 创建类型转换器
        1. 5.1.2.1. 准备工作
        2. 5.1.2.2. 转换器
        3. 5.1.2.3. conf配置
        4. 5.1.2.4. mapper配置
      3. 5.1.3. resultMap
  • 6. 小结
  • 7. 输入参数和输出参数
    1. 7.1. 输入参数parameterType
      1. 7.1.1. 简单类型
      2. 7.1.2. 对象类型
      3. 7.1.3. 嵌套类型输入参数为级联属性
      4. 7.1.4. 传入为hashmap
    2. 7.2. 调用存储过程
      1. 7.2.1. 查询某个年级的所有学生总数
        1. 7.2.1.1. 数据库里
        2. 7.2.1.2. mapper中
      2. 7.2.2. 根据学号删除学生
        1. 7.2.2.1. 数据库里
        2. 7.2.2.2. mapper中
    3. 7.3. 输出参数
      1. 7.3.1. resultType
        1. 7.3.1.1. 输出为HashMap
      2. 7.3.2. resultMap
  • 8. 关于动态sql
    1. 8.1. if
    2. 8.2. where
    3. 8.3. foreach
      1. 8.3.1. 数组
      2. 8.3.2. 放入对象的属性中
      3. 8.3.3. 集合
      4. 8.3.4. 对象数组
      5. 8.3.5. sql片段
  • 9. 关联查询
    1. 9.1. 一对一
    2. 9.2. 一对多(多对一)
    3. 9.3. 多对多
  • 10. log4j和延迟加载
    1. 10.1. 开启日志
    2. 10.2. 配置延迟加载
      1. 10.2.1. 一对一:查学生和学生卡信息
      2. 10.2.2. 一对多:查班级和学生信息
    3. 10.3.
  • 11. mybatis 缓存
    1. 11.1. 查询缓存
      1. 11.1.1. 一级缓存:同一个SqlSession对象
  • Recent Post
    \ No newline at end of file diff --git "a/2020/04/01/MyBatis\347\263\273\345\210\227/test.png" "b/2020/04/01/MyBatis\347\263\273\345\210\227/test.png" new file mode 100644 index 0000000..3172c93 Binary files /dev/null and "b/2020/04/01/MyBatis\347\263\273\345\210\227/test.png" differ diff --git "a/2020/04/01/Mysql \350\277\233\351\230\266/index.html" "b/2020/04/01/Mysql \350\277\233\351\230\266/index.html" new file mode 100644 index 0000000..a553a6b --- /dev/null +++ "b/2020/04/01/Mysql \350\277\233\351\230\266/index.html" @@ -0,0 +1,349 @@ +MySQL进阶 | SHYEE-PLASMA + + + + + + + + + + + + + + +

    MySQL进阶

    使用Docker安装一个MySQL5.7

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    [root@Shyee ~]# docker pull mysql:5.7
    [root@Shyee ~]# docker images

    #返回结果
    REPOSITORY TAG IMAGE ID CREATED SIZE
    mysql 5.7 a70d36bc331a 13 days ago 449MB

    #运行前需要一点配置
    [root@Shyee ~]# docker run --name mysql5 -v /usr/local/MySQL5:/var/lib/mysql -p 3306:3306 -e MYSQL_ROOT_PASSWORD=密码 -d a70d36bc331a

    [root@Shyee ~]# docker ps
    CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
    7b829aa38925 a70d36bc331a "docker-entrypoint.s…" 6 minutes ago Up 6 minutes 0.0.0.0:3306->3306/tcp, 33060/tcp mysql5

    #进入服务
    docker exec -it id /bin/bash
    + +

    数据库目录: datadir=/var/lib/mysql
    pid文件目录:–pid-file=/var/lib/mysql/ibdata01.pid

    +

    MySQL的文件结构

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    root@7b829aa38925:/var/lib/mysql# ls
    auto.cnf ca.pem client-key.pem ib_logfile0 ibdata1 mysql private_key.pem server-cert.pem sys
    ca-key.pem client-cert.pem ib_buffer_pool ib_logfile1 ibtmp1 performance_schema public_key.pem server-key.pem

    root@7b829aa38925:/var/lib/mysql# cd /usr/share/mysql
    root@7b829aa38925:/usr/share/mysql# ls
    bulgarian errmsg-utf8.txt innodb_memcached_config.sql mysql-log-rotate mysqld_multi.server serbian
    charsets estonian install_rewriter.sql mysql-systemd-start norwegian slovak
    czech fill_help_tables.sql italian mysql_security_commands.sql norwegian-ny spanish
    danish french japanese mysql_sys_schema.sql polish swedish
    dictionary.txt german korean mysql_system_tables.sql portuguese ukrainian
    dutch greek magic mysql_system_tables_data.sql romanian uninstall_rewriter.sql
    english hungarian mysql-helpers mysql_test_data_timezone.sql russian

    + +

    查询MySQL的编码

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    show variables like '%char%';

    +--------------------------+----------------------------+
    | Variable_name | Value |
    +--------------------------+----------------------------+
    | character_set_client | latin1 |
    | character_set_connection | latin1 |
    | character_set_database | latin1 |
    | character_set_filesystem | binary |
    | character_set_results | latin1 |
    | character_set_server | latin1 |
    | character_set_system | utf8 |
    | character_sets_dir | /usr/share/mysql/charsets/ |
    +--------------------------+----------------------------+
    8 rows in set (0.00 sec)
    需要统一设置编码UTF-8
    好麻烦,还是直接装在centOS上
    + +

    CentOS8 安装MySQL5.5

    下载

    https://dev.mysql.com/get/Downloads/MySQL-5.5/MySQL-server-5.5.59-1.el7.x86_64.rpm

    +

    https://dev.mysql.com/get/Downloads/MySQL-5.5/MySQL-client-5.5.59-1.el7.x86_64.rpm

    +

    上传到服务器

    +

    安装

    无依赖安装(–nodeps)

    +

    rpm -ivh –nodeps MySQL-server-5.5.59-1.el7.x86_64.rpm

    +

    rpm -ivh –nodeps MySQL-client-5.5.59-1.el7.x86_64.rpm

    +

    启动

    1
    2
    3
    4
    5
    6
    7
    8
    9
    #验证
    [root@Shyee MySQL5]# mysqladmin --version
    mysqladmin Ver 8.42 Distrib 5.5.59, for Linux on x86_64
    #启动
    [root@Shyee MySQL5]# service mysql start
    Starting MySQL.Logging to '/var/lib/mysql/Shyee.err'.
    . [ OK ]
    #配置开机自启
    chkconfig mysql on
    + +

    改密码

    1
    /usr/bin/mysqladmin -u root password 'new-password'
    + +

    使用

    1
    mysql -u root -p
    + +

    统一编码

    改my-huge.cnf文件,复制到/etc,名字改为my.cnf

    +

    分别在mysql 和client插入一句default-character-set=utf8

    +

    mysqld中插入

    +

    character_set_server=utf8
    character_set_client=utf8
    collation_server=utf8_general_ci

    +
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    修改后
    mysql> show variables like '%char%';
    +--------------------------+----------------------------+
    | Variable_name | Value |
    +--------------------------+----------------------------+
    | character_set_client | utf8 |
    | character_set_connection | utf8 |
    | character_set_database | utf8 |
    | character_set_filesystem | binary |
    | character_set_results | utf8 |
    | character_set_server | utf8 |
    | character_set_system | utf8 |
    | character_sets_dir | /usr/share/mysql/charsets/ |
    +--------------------------+----------------------------+
    8 rows in set (0.00 sec)
    + +

    mysql小知识

    MySQL逻辑分层:连接层->服务层->引擎层->存储层

    InnoDB与MyISAM

    InnoDB :事务优先(适合高并发操作;行锁)

    +

    My ISAM :性能优先(表锁)

    +

    查询MySQL支持哪些引擎

    1
    mysql> show engines;
    + +

    ![image-20210202093942237](D:\bloglocal\Mysql 进阶.assets\image-20210202093942237.png)

    +

    查询当前使用的引擎

    +

    show variables like ‘%storage_engine%’;

    +
    1
    2
    3
    4
    5
    6
    7
    8
    mysql> show variables like '%storage_engine%';
    +------------------------+--------+
    | Variable_name | Value |
    +------------------------+--------+
    | default_storage_engine | InnoDB |
    | storage_engine | InnoDB |
    +------------------------+--------+
    2 rows in set (0.00 sec)
    + +

    默认innoDB

    +

    创建一个myISAM引擎的表

    1
    2
    3
    4
    5
    6
    7
    mysql> create database myDB;
    Query OK, 1 row affected (0.00 sec)

    mysql> use myDB
    Database changed
    mysql> create table tb(id int(4) auto_increment,name varchar(5),dept varchar(5),primary key(id))ENGINE=MyISAM AUTO_INCREMENT=1 DEFAULT CHARSET=utf8;
    Query OK, 0 rows affected (0.01 sec)
    + +

    sql优化

    编写sql的过程

    +

    select distinct..from ..join ..on ..where ..group by ...having ..order by ..limit ..

    +

    MySQL执行代码的过程

    +

    from .. on.. join ..where ..group by ... having ...select distinct..order by limit ..

    +

    sql优化,重在优化索引

    +

    MySQL默认使用B+树做索引

    +

    如果一个字段是primary key,则改字段默认就是主键索引

    +

    索引的弊端:

    1.索引本身很大,可以存放在内存/硬盘(通常为硬盘)

    +

    2.索引不是所有情况均适用:a.少量数据b.频繁更新的字段c.很少使用的字段

    +

    3.索引会降低增删改的效率

    +

    优势:

    1提高查询效率(降低IO使用率)

    +

    2.降低CPU使用率(…order by age desc)

    +

    分类:

    单值索引:单列,age ;一个表可以多个单值索引, name

    +

    唯一索引:不能重复。id

    +

    复合索引:多个列构成的索引(相当于二级目录)(可以有多个列)

    +

    索引的创建

    方式一

    create 索引类型 索引名 on 表(字段)

    +
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    --创建一个单值索引
    mysql> create index dept_index on tb(dept);
    Query OK, 0 rows affected (0.00 sec)
    Records: 0 Duplicates: 0 Warnings: 0

    --创建一个唯一索引
    mysql> create unique index name_index on tb(name);
    Query OK, 0 rows affected (0.00 sec)
    Records: 0 Duplicates: 0 Warnings: 0

    --创建一个复合索引
    mysql> create index dept_name_index on tb(dept,name);
    Query OK, 0 rows affected (0.00 sec)
    Records: 0 Duplicates: 0 Warnings: 0

    + +

    方式二

    alter table 表名 add index 索引名(字段)

    +
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    --添加一个单值索引
    mysql> alter table tb add index dept_index(dept) ;
    Query OK, 0 rows affected (0.00 sec)
    Records: 0 Duplicates: 0 Warnings: 0
    --创建一个唯一索引
    mysql> alter table tb add unique index name_index(name) ;
    Query OK, 0 rows affected (0.00 sec)
    Records: 0 Duplicates: 0 Warnings: 0
    --创建一个复合索引
    mysql> alter table tb add index dept_name_index(dept,name) ;
    Query OK, 0 rows affected (0.00 sec)
    Records: 0 Duplicates: 0 Warnings: 0
    + +

    删除索引

    drop index 索引名 on 表名;

    +
    1
    2
    3
    mysql> drop index name_index on tb;
    Query OK, 0 rows affected (0.00 sec)
    Records: 0 Duplicates: 0 Warnings: 0
    + +

    查询索引

    show index from 表名;

    +
    1
    show index from tb;
    + +

    ![image-20210202102426701](D:\bloglocal\Mysql 进阶.assets\image-20210202102426701.png)

    +

    sql性能问题

    a.分析SQL的执行计划: explain,可以模拟SQL优化执行SQL语句

    +

    b.MySQL查询优化其会干扰我们的优化

    +

    官网提供的解决方案:https://dev.mysql.com/doc/refman/8.0/en/optimization.html

    +

    ![image-20210202103105970](D:\bloglocal\Mysql 进阶.assets\image-20210202103105970.png)

    +

    explain

    1
    mysql> explain select * from tb;
    + +

    ![image-20210202103206570](D:\bloglocal\Mysql 进阶.assets\image-20210202103206570.png)

    +

    id :编号

    +

    select_type :查询类型

    +

    table :表

    +

    type:类型

    +

    possible_keys:预测用到的索引

    +

    key :实际使用的索引

    +

    key_len:实际使用索引的长度

    +

    ref:表之间的引用

    +

    rows :通过索引查询到的数据量

    +

    Extra:额外的信息

    +

    实例

    准备数据
    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
    create table course(
    cid int(3),
    cname varchar(10),
    tid int(3)
    );
    create table teacher(
    tid int(3),
    tname varchar(20),
    tcid int(3)
    );
    create table teachercard(
    tcid int(3),
    tcdesc varchar(200)
    );
    --插入一些数据
    INSERT INTO course VALUES(1,'java',1);
    INSERT INTO course VALUES(2,'html',1);
    INSERT INTO course VALUES(3,'sql',2);
    INSERT INTO course VALUES(4,'web',3);

    INSERT INTO teacher VALUES(1,'tz',1);
    INSERT INTO teacher VALUES(2,'tw',2);
    INSERT INTO teacher VALUES(3,'tl',3);

    INSERT INTO teachercard VALUES(1,'tzdesc');
    INSERT INTO teachercard VALUES(2,'twdesc');
    INSERT INTO teachercard VALUES(3,'tldesc');
    + +
    查询课程编号为2或教师证编号为3 的老师信息
    1
    2
    3
    4
    5
    6
    7
    mysql> select * from teacher t,course c,teachercard tc where c.tid=t.tid and t.tcid=tc.tcid and(c.cid=2 or tc.tcid=3);
    +------+-------+------+------+-------+------+------+--------+
    | tid | tname | tcid | cid | cname | tid | tcid | tcdesc |
    +------+-------+------+------+-------+------+------+--------+
    | 1 | tz | 1 | 2 | html | 1 | 1 | tzdesc |
    | 3 | tl | 3 | 4 | web | 3 | 3 | tldesc |
    +------+-------+------+------+-------+------+------+--------+
    + +
    explain
    1
    mysql> explain select * from teacher t,course c,teachercard tc where c.tid=t.tid and t.tcid=tc.tcid and(c.cid=2 or tc.tcid=3);
    + +

    ![image-20210202105854202](D:\bloglocal\Mysql 进阶.assets\image-20210202105854202.png)

    +

    可以看到执行顺序,自上至下是t(三条记录) tc(三条记录) c(4条记录)

    +

    现在给teacher 插入几条记录

    +
    1
    2
    3
    INSERT INTO teacher VALUES(4,'ta',4);
    INSERT INTO teacher VALUES(5,'tz',5);
    INSERT INTO teacher VALUES(6,'tv',6);
    + +

    再次解释

    +

    ![image-20210202110851529](D:\bloglocal\Mysql 进阶.assets\image-20210202110851529.png)

    +

    可以看到执行顺序是tc(三条记录) c(四条记录) t(6条记录)

    +

    顺序改变的原因:笛卡尔积

    +

    中间过程(乘积)越小越好–数据小的表优先查询

    +
    查询课程名字为sql的教师描述
    1
    2
    3
    4
    5
    6
    7
    mysql> select tc.tcdesc from teacher t,course c,teachercard tc where c.tid=t.tid and t.tcid=tc.tcid and(c.cname='sql');
    +--------+
    | tcdesc |
    +--------+
    | twdesc |
    +--------+
    1 row in set (0.00 sec)
    + +
    explain
    1
    explain select tc.tcdesc from teacher t,course c,teachercard tc where c.tid=t.tid and t.tcid=tc.tcid and(c.cname='sql');
    + +

    ![image-20210202114014023](D:\bloglocal\Mysql 进阶.assets\image-20210202114014023.png)

    +

    如果是嵌套查询

    +
    1
    SELECT tcdesc from teachercard where tcid=(select tcid from teacher where tid=(select tid from course where cname='sql'));
    + +
    explain
    1
    mysql> explain SELECT tcdesc from teachercard where tcid=(select tcid from teacher where tid=(select tid from course where cname='sql'));
    + +

    ![image-20210202114510975](D:\bloglocal\Mysql 进阶.assets\image-20210202114510975.png)

    +

    Id值不同时,id越大越优先查询

    +

    多表连接+嵌套查询

    +
    1
    2
    3
    4
    5
    6
    7
    mysql> SELECT t.tname, tc.tcdesc from teachercard tc,teacher t where t.tcid=tc.tcid and t.tid=(select tid from course where cname='sql');
    +-------+--------+
    | tname | tcdesc |
    +-------+--------+
    | tw | twdesc |
    +-------+--------+
    1 row in set (0.00 sec)
    + +
    explain
    1
    mysql> explain SELECT t.tname, tc.tcdesc from teachercard tc,teacher t where t.tcid=tc.tcid and t.tid=(select tid from course where cname='sql');
    + +

    ![image-20210202115402526](D:\bloglocal\Mysql 进阶.assets\image-20210202115402526.png)

    +

    id有相同有不同 所以执行顺序为 course tc t

    +

    select_type:

    +

    primary:主查询(最外层)

    +

    subquery:子查询(非最外层)

    +

    simple:简单查询

    +

    derived:衍生查询(查询时 使用到了临时表 在from中只有一张表)

    +

    Union

    +

    union result

    +

    type:索引类型

    system->const->eq_ref->ref->range->index->all

    +

    越往左性能越高

    +

    system:只有一条数据的系统表或衍生表只有一条数据的主查询 才能达到

    +

    const:只能查到一条数据的SQL,用于primary key 或unique索引 (类型与索引类型有关)

    +

    eq_ref:唯一性索引:对于每个索引键的额查询,返回匹配唯一行数据(有且只有1个,不能多,不能0)常见于主键或者唯一

    +

    ref:非唯一性索引:对于每个索引的查询,返回匹配的所有行(0,多)

    +

    range:检索指定范围的行,where 后面是一个有索引的范围查询(between in < > |in有时候会失效)

    +

    index:查询全部索引的数据:

    +

    all:查询全部表中的数据:

    +

    system/const:结果只有一条数据

    +

    eq_ref:结果多条 但是每条数据都是唯一的

    +

    ref:结果多条,但是每条数据是0或多条

    +

    possible keys:可能使用到的索引

    是一种预测,不准

    +

    keys:实际用到的索引

    key_len:索引长度

    用于判断复合索引是否被完全使用

    +

    创建一个用于实验的表

    +
    1
    2
    3
    create table test_kl(name char(20) not null default '');
    alter table test_kl add index index_name(name);
    select * from test_kl where name='';
    + +

    ![image-20210207152639778](D:\bloglocal\Mysql 进阶.assets\image-20210207152639778.png)

    +

    key_len:60

    +

    在utf-8中1个字符占3个字节

    +

    索引字段是20 所以长度一共为60

    +

    如果字段可以为空

    +
    1
    2
    3
    4
    5
    6
    7
    mysql> alter table test_kl add column name1 char(20) ;
    Query OK, 0 rows affected (0.00 sec)
    Records: 0 Duplicates: 0 Warnings: 0

    mysql> alter table test_kl add index index_name1(name1);
    Query OK, 0 rows affected (0.01 sec)
    Records: 0 Duplicates: 0 Warnings: 0
    + +

    ![image-20210207153309555](D:\bloglocal\Mysql 进阶.assets\image-20210207153309555.png)

    +

    如果字段可以为null MySQL 会用一个字节来标识

    +
    1
    2
    drop index index_name1 on test_kl;
    drop index index_name on test_kl;
    + +

    创建复合索引

    +
    1
    alter table test_kl add index index_name1(name,name1);
    + +

    ![image-20210207153606087](D:\bloglocal\Mysql 进阶.assets\image-20210207153606087.png)

    +

    60 +60+1

    +
    1
    2
    alter table  test_kl add column name2 varchar(20);
    alter table test_kl add index name2_index(name2);
    + +

    ![image-20210207153855236](D:\bloglocal\Mysql 进阶.assets\image-20210207153855236.png)

    +

    20*3 +1+2

    +

    mysql用两个字节标识可变长度

    +

    gbk 一个字符2字节

    +

    Latin 一个字符一个字节

    +

    ref

    与type中的ref不同

    +

    指明当前表所参照的字段

    +

    rows

    被索引优化查询的 数据个数

    +

    extra

    using filesort:性能消耗大,需要额外的一次排序

    +

    常出现于order by

    +
    1
    create table test02(a1 char(3),a2 char(3), a3 char(3),index idx_a1(a1),index idx_a2(a2),index idx_a3(a3));
    + +

    ![image-20210207154713367](D:\bloglocal\Mysql 进阶.assets\image-20210207154713367.png)

    +

    复合索引:不能跨列(最佳最前缀)

    +

    where 和order by 按照复合索引的顺序使用 ,不要跨列和无序使用

    +

    using temporary:性能损耗大,用到了临时表

    +

    一般出现在group by中

    +

    减少跨列使用

    +

    using index:索引覆盖(性能提升)

    +

    没有读取源文件,只从索引中获取数据

    +

    using where

    +

    需要回表查询

    +

    impossible where

    +

    where 字句为false

    +
    Author: SHYEE
    Link: http://example.com/2020/04/01/Mysql%20%E8%BF%9B%E9%98%B6/
    Copyright Notice: All articles in this blog are licensed under CC BY-NC-SA 4.0 unless stating additionally.
    \ No newline at end of file diff --git "a/2020/04/01/mybatis\345\260\217\347\273\203\344\271\240/QQ\345\233\276\347\211\20720200324171345.png" "b/2020/04/01/mybatis\345\260\217\347\273\203\344\271\240/QQ\345\233\276\347\211\20720200324171345.png" new file mode 100644 index 0000000..b71ab72 Binary files /dev/null and "b/2020/04/01/mybatis\345\260\217\347\273\203\344\271\240/QQ\345\233\276\347\211\20720200324171345.png" differ diff --git "a/2020/04/01/mybatis\345\260\217\347\273\203\344\271\240/QQ\345\233\276\347\211\20720200324173927.png" "b/2020/04/01/mybatis\345\260\217\347\273\203\344\271\240/QQ\345\233\276\347\211\20720200324173927.png" new file mode 100644 index 0000000..af629f8 Binary files /dev/null and "b/2020/04/01/mybatis\345\260\217\347\273\203\344\271\240/QQ\345\233\276\347\211\20720200324173927.png" differ diff --git "a/2020/04/01/mybatis\345\260\217\347\273\203\344\271\240/QQ\345\233\276\347\211\20720200324180303.png" "b/2020/04/01/mybatis\345\260\217\347\273\203\344\271\240/QQ\345\233\276\347\211\20720200324180303.png" new file mode 100644 index 0000000..9cc1d0c Binary files /dev/null and "b/2020/04/01/mybatis\345\260\217\347\273\203\344\271\240/QQ\345\233\276\347\211\20720200324180303.png" differ diff --git "a/2020/04/01/mybatis\345\260\217\347\273\203\344\271\240/QQ\345\233\276\347\211\20720200324193915.png" "b/2020/04/01/mybatis\345\260\217\347\273\203\344\271\240/QQ\345\233\276\347\211\20720200324193915.png" new file mode 100644 index 0000000..a5433df Binary files /dev/null and "b/2020/04/01/mybatis\345\260\217\347\273\203\344\271\240/QQ\345\233\276\347\211\20720200324193915.png" differ diff --git "a/2020/04/01/mybatis\345\260\217\347\273\203\344\271\240/QQ\345\233\276\347\211\20720200325113701.png" "b/2020/04/01/mybatis\345\260\217\347\273\203\344\271\240/QQ\345\233\276\347\211\20720200325113701.png" new file mode 100644 index 0000000..08e545a Binary files /dev/null and "b/2020/04/01/mybatis\345\260\217\347\273\203\344\271\240/QQ\345\233\276\347\211\20720200325113701.png" differ diff --git "a/2020/04/01/mybatis\345\260\217\347\273\203\344\271\240/QQ\345\233\276\347\211\20720200325113913.png" "b/2020/04/01/mybatis\345\260\217\347\273\203\344\271\240/QQ\345\233\276\347\211\20720200325113913.png" new file mode 100644 index 0000000..7acfdeb Binary files /dev/null and "b/2020/04/01/mybatis\345\260\217\347\273\203\344\271\240/QQ\345\233\276\347\211\20720200325113913.png" differ diff --git "a/2020/04/01/mybatis\345\260\217\347\273\203\344\271\240/QQ\345\233\276\347\211\20720200325115338.png" "b/2020/04/01/mybatis\345\260\217\347\273\203\344\271\240/QQ\345\233\276\347\211\20720200325115338.png" new file mode 100644 index 0000000..390d6bf Binary files /dev/null and "b/2020/04/01/mybatis\345\260\217\347\273\203\344\271\240/QQ\345\233\276\347\211\20720200325115338.png" differ diff --git "a/2020/04/01/mybatis\345\260\217\347\273\203\344\271\240/QQ\345\233\276\347\211\20720200325120220.png" "b/2020/04/01/mybatis\345\260\217\347\273\203\344\271\240/QQ\345\233\276\347\211\20720200325120220.png" new file mode 100644 index 0000000..dabd067 Binary files /dev/null and "b/2020/04/01/mybatis\345\260\217\347\273\203\344\271\240/QQ\345\233\276\347\211\20720200325120220.png" differ diff --git "a/2020/04/01/mybatis\345\260\217\347\273\203\344\271\240/QQ\345\233\276\347\211\20720200325120539.png" "b/2020/04/01/mybatis\345\260\217\347\273\203\344\271\240/QQ\345\233\276\347\211\20720200325120539.png" new file mode 100644 index 0000000..2ee58ec Binary files /dev/null and "b/2020/04/01/mybatis\345\260\217\347\273\203\344\271\240/QQ\345\233\276\347\211\20720200325120539.png" differ diff --git "a/2020/04/01/mybatis\345\260\217\347\273\203\344\271\240/index.html" "b/2020/04/01/mybatis\345\260\217\347\273\203\344\271\240/index.html" new file mode 100644 index 0000000..7c13264 --- /dev/null +++ "b/2020/04/01/mybatis\345\260\217\347\273\203\344\271\240/index.html" @@ -0,0 +1,236 @@ +MyBatis进阶小练习 | SHYEE-PLASMA + + + + + + + + + + + + + + + + + + + + +

    MyBatis进阶小练习

    环境说明:eclipse JDK13 Oracle11g

    +

    情景说明

    公司里各个部门的员工可以进行企业项目的申报,如果项目通过企业审核,可以投入企业的项目规划环节。

    +

    员工可以申请项目。一个员工申请多个项目,一个项目可以有多个员工。备注:

    +

    项目包含的数据项(项目编号,项目名称,项目内容,项目提交的时间

    +

    继续建设company数据库以及进行程序设计,完成上面关于多对多的映射案例。

    +

    设计三个表

    +

    员工表(empinfo)

    +

    项目表(cproject)

    +

    映射表(主要用于把两个主键映射起来,为了看着舒服一点,不创建也可以)

    +

    测试的公用部分

    +
    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
    // 公用部分
    public static void connUntil() throws IOException {
    Reader reader = Resources.getResourceAsReader("conf.xml");
    SqlSessionFactory sessionfactory = new SqlSessionFactoryBuilder().build(reader);
    SqlSession session = sessionfactory.openSession();
    UserMapper stuMapper = session.getMapper(UserMapper.class);
    //qUserAll(stuMapper);
    //System.out.println(updateUserALL(stuMapper));
    //System.out.println(deleteUserALL(stuMapper)+"has been totally deleted.✔");
    //selectDepartAll(stuMapper);
    //System.out.println(addProject(stuMapper)+"的项目已经提交✔");
    //System.out.println(updateProject(stuMapper)+"行已经受影响✔");
    //System.out.println(delteProject(stuMapper)+"已经被删除✔");
    //queryprojectWithEid(stuMapper);
    //queryprojectWithDid(stuMapper);
    //queryprojectWithPName(stuMapper);
    session.commit();
    session.close();
    }
    public static void main(String[] args) throws IOException {
    connUntil();
    }
    //放一个map
    public static Map<String, Object> giveMeAMap() {
    User user = giveMeAUser();
    Map<String, Object> userMap = new HashMap<>();
    userMap.put("UNAMEin", user.getUserinfo().getuName());
    return userMap;
    }

    // 放一个user
    public static User giveMeAUser() {
    Detail detail = new Detail(3, "北京", "2085321569", "2085321569@qq.com");
    UserInfo userinfo = new UserInfo(3, "老张", "321321");
    User user = new User(userinfo, detail);
    return user;
    }
    //放一个EMP
    public static EmpInfo giveMeAEMP() {
    EmpInfo ep =new EmpInfo(1, "根哥",10,"女","12321212545");
    return ep;
    }
    + + + +

    (1)申请项目,插入操作。插入一个员工申请的项目。

    +

    SQL端制作一个存储过程

    +
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    CREATE OR REPLACE PROCEDURE InsertPROJECT(PNAMEin IN VARCHAR2,PCONTENTin IN VARCHAR2,ENAMEin IN VARCHAR2,Informo OUT VARCHAR2)
    AS
    n1 NUMBER;--两个自增
    n2 NUMBER;
    BEGIN
    select PROJECTSEQ.nextval into n1 from dual;
    INSERT into CPROJECT(PID,PNAME,PCONTENT,PTIME) values (n1,PNAMEin,PCONTENTin,SYSDATE);
    select EPMAPPERSEQ.nextval into n2 from dual;
    INSERT INTO EPMAPPER(EPID,EID,PID) VALUES(n2,(SELECT e.EID FROM EMPINFO e WHERE e.ENAME=ENAMEin),n1);
    SELECT ENAME INTO Informo FROM EMPINFO e WHERE e.ENAME=ENAMEin;
    END;
    + +

    xml

    +
    1
    2
    3
    4
    5
    6
    7
    8
    9
    <!-- 添加项目 -->
    <insert id="addProject" parameterType="HashMap" statementType="CALLABLE">
    {CALL InsertPROJECT(
    #{PNAMEin,jdbcType=VARCHAR,mode=IN},
    #{PCONTENTin,jdbcType=VARCHAR,mode=IN},
    #{ENAMEin,jdbcType=VARCHAR,mode=IN},
    #{Informo,jdbcType=VARCHAR,mode=OUT}
    )}
    </insert>
    + +

    测试

    +
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    //insert一个项目

    public static String addProject(UserMapper stuMapper) throws IOException {
    Map<String, Object> empMap=new HashMap<>();
    EProject ep=new EProject("小项目","很小的一个项目");
    EmpInfo emp=giveMeAEMP();
    empMap.put("PNAMEin", ep.getpName());
    empMap.put("PCONTENTin", ep.getpContent());
    empMap.put("ENAMEin", emp.geteName());
    stuMapper.addProject(empMap);

    return (String) empMap.get("Informo");
    }
    + + + +

    (2)修改项目,更新操作。修改一个员工申请的项目。

    +

    对项目信息的更新相对简单一些

    +

    xml中

    +
    1
    2
    3
    4
    <!-- 更新项目 -->
    <update id="updateProject" parameterType="top.eshyee.entity.EProject">
    UPDATE CPROJECT p SET p.PNAME=#{pName},p.PCONTENT=#{pContent},p.PTIME=SYSDATE WHERE PID=#{pId}
    </update>
    + +

    测试集

    +
    1
    2
    3
    4
    5
    //修改项目
    public static int updateProject(UserMapper stuMapper) throws IOException {
    EProject ep=new EProject(1,"成功的小项目","哈");
    return stuMapper.updateProject(ep);
    }
    + +

    测试结果

    +

    (3)删除项目,删除操作。删除一个员工申请的项目。

    +

    删除除了删掉项目本身以外 还应考虑删掉映射表中的映射关系

    +

    创建存储过程

    +
    1
    2
    3
    4
    5
    6
    7
    8
    CREATE OR REPLACE PROCEDURE delproject(PIDin IN NUMBER,PNameout OUT VARCHAR2)
    AS
    BEGIN
    SELECT PNAME INTO PNameout from CPROJECT WHERE PID=PIDin ;
    DELETE FROM EPMAPPER WHERE PID=PIDin;
    DELETE FROM CPROJECT WHERE PID=PIDin;

    END;
    + +

    配置xml

    +
    1
    2
    3
    4
    5
    6
    <delete id="delteProject" parameterType="HashMap" statementType="CALLABLE">
    {CALL delproject(
    #{PIDin,jdbcType=INTEGER,mode=IN},
    #{PNameout,jdbcType=VARCHAR,mode=OUT}
    )}
    </delete>
    + +

    测试集

    +
    1
    2
    3
    4
    5
    6
    7
    //删除项目
    public static String delteProject (UserMapper stuMapper) throws IOException {
    Map<String, Object> userMap = new HashMap<>();
    userMap.put("PIDin", 5);
    stuMapper.delteProject(userMap);
    return (String) userMap.get("PNameout");
    }
    + + + +

    (4)查询项目,查询操作。进行多条件查询。根据员工编号,员工所在部门,员工的项目名称(模糊查询)等条件进行查询。

    +

    这里虽然使用到多对多的概念 但是mybatis目前没有真正意义上的多对多 ,需要使用到两个多对一。然后采用resultmap,这里提供另一个思路。

    +

    SQL端将三个表连接起来去重

    +
    1
    SELECT A.*,B.EPID,C.* FROM EMPINFO A  ,EPMAPPER B ,CPROJECT C WHERE A.EID=B.EID AND B.PID=C.PID
    + +
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    4	1	根哥	1013254621021	7	1	成功的小项目	哈	2020-03-24 17:39:14
    2 1 小王 912545236547 5 1 成功的小项目 哈 2020-03-24 17:39:14
    1 1 小刘 1121326545231 1 1 成功的小项目 哈 2020-03-24 17:39:14
    4 1 根哥 1013254621021 8 2 项目二 项目二 2020-03-12 09:07:37
    2 1 小王 912545236547 4 2 项目二 项目二 2020-03-12 09:07:37
    1 1 小刘 1121326545231 2 2 项目二 项目二 2020-03-12 09:07:37
    4 1 根哥 1013254621021 9 3 项目三 项目三 2020-03-15 09:08:03
    2 1 小王 912545236547 6 3 项目三 项目三 2020-03-15 09:08:03
    1 1 小刘 1121326545231 3 3 项目三 项目三 2020-03-15 09:08:03
    4 1 根哥 1013254621021 12 8 小项目 很小的一个项目 2020-03-24 17:13:17
    + +

    这样关系似乎更加明显了

    +

    然后再在mapper.xml文件中分别写三个查询就ok了

    +
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    <!-- project查询 EID-->
    <select id="queryprojectWithEid" resultType="HashMap" parameterType="int">
    SELECT DISTINCT * FROM (
    <include refid="projectJoinAll"></include>
    ) WHERE EID=#{eId}
    </select>

    <!-- project查询 DID -->
    <select id="queryprojectWithDid" resultType="HashMap" parameterType="int">
    SELECT DISTINCT * FROM (
    <include refid="projectJoinAll"></include>
    ) WHERE DID=#{dId}
    </select>
    <!-- project查询 模糊项目名称 -->
    <select id="queryprojectWithPName" resultType="HashMap" parameterType="int">
    SELECT DISTINCT * FROM (
    <include refid="projectJoinAll"></include>
    ) WHERE PNAME like '%${pName}%'
    </select>

    <!-- 连接三个表 -->
    <sql id="projectJoinAll">
    SELECT A.*,B.EPID,C.* FROM EMPINFO A ,EPMAPPER B ,CPROJECT C WHERE A.EID=B.EID AND B.PID=C.PID
    </sql>
    + +

    测试文件中

    +
    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
    //查询全部project相关 BY eId
    public static void queryprojectWithEid(UserMapper stuMapper) throws IOException {
    List<Map<String, Object>> map=stuMapper.queryprojectWithEid(1);
    System.out.println("根据员工编号查询");
    for(int i=0;i<map.size();i++) {
    System.out.println(map.get(i));

    }
    }
    //查询全部project相关 BY dId
    public static void queryprojectWithDid(UserMapper stuMapper) throws IOException {
    List<Map<String, Object>> map=stuMapper.queryprojectWithDid(1);
    System.out.println("根据员工所在部门查询");
    for(int i=0;i<map.size();i++) {
    System.out.println(map.get(i));

    }
    }
    //查询全部project相关 BY pName
    public static void queryprojectWithPName(UserMapper stuMapper) throws IOException {
    List<Map<String, Object>> map=stuMapper.queryprojectWithPName("项目三");
    System.out.println("根据项目名称模糊查询");
    for(int i=0;i<map.size();i++) {
    System.out.println(map.get(i));

    }
    }
    // 公用部分
    + +

    测试结果

    +

    QQ图片20200324193915

    +
    Author: SHYEE
    Link: http://example.com/2020/04/01/mybatis%E5%B0%8F%E7%BB%83%E4%B9%A0/
    Copyright Notice: All articles in this blog are licensed under CC BY-NC-SA 4.0 unless stating additionally.
    \ No newline at end of file diff --git "a/2020/04/01/mysql\347\232\204\344\270\200\347\202\271\344\270\234\350\245\277/index.html" "b/2020/04/01/mysql\347\232\204\344\270\200\347\202\271\344\270\234\350\245\277/index.html" new file mode 100644 index 0000000..beb58d7 --- /dev/null +++ "b/2020/04/01/mysql\347\232\204\344\270\200\347\202\271\344\270\234\350\245\277/index.html" @@ -0,0 +1,557 @@ +mysql的一点东西 | SHYEE-PLASMA + + + + + + + + + + + + + + +

    mysql的一点东西

    mysql的一点东西

    增删改查–数据记录常见操作

    –如何在数据库服务器中创建数据库

    1
    2
    3
    4
    5
    6
    mysql> Create database test;
    Query OK, 1 row affected (0.02 sec)

    mysql> use test
    Database changed

    + +

    –如何查看某个数据库中所有的数据表

    1
    2
    3
    mysql> show tables;
    Empty set (0.01 sec)

    + +

    –如何创建一个数据表

    1
    2
    3
    4
    5
    6
    7
    8
    9
    CREATE TABLE pet (
    name VARCHAR(20),
    owner VARCHAR(20),
    specials VARCHAR(20),
    sex VARCHAR(1),
    birth DATE,
    death DATE);
    Query OK, 0 rows affected (0.08 sec)

    + +

    –查看数据表是否创建成功

    1
    2
    3
    4
    5
    6
    7
    mysql> show tables;
    +----------------+
    | Tables_in_test |
    +----------------+
    | pet |
    +----------------+
    1 row in set (0.00 sec)
    + +

    –查看创建好的数据表的结构

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    mysql> describe pet;
    +----------+-------------+------+-----+---------+-------+
    | Field | Type | Null | Key | Default | Extra |
    +----------+-------------+------+-----+---------+-------+
    | name | varchar(20) | YES | | NULL | |
    | owner | varchar(20) | YES | | NULL | |
    | specials | varchar(20) | YES | | NULL | |
    | sex | varchar(1) | YES | | NULL | |
    | birth | date | YES | | NULL | |
    | death | date | YES | | NULL | |
    +----------+-------------+------+-----+---------+-------+
    6 rows in set (0.00 sec)
    + +

    –查看表中的记录

    1
    2
    3
    mysql> select * from pet;
    Empty set (0.00 sec)

    + +

    –如何往数据表中添加数据记录

    1
    2
    3
    4
    mysql> INSERT INTO pet
    -> VALUES('Puffball','Diane','hamster','f','1999-03-30',NULL);
    Query OK, 1 row affected (0.02 sec)

    + +

    –再一次查询

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    mysql> select * from pet;
    +----------+-------+----------+------+------------+-------+
    | name | owner | specials | sex | birth | death |
    +----------+-------+----------+------+------------+-------+
    | Puffball | Diane | hamster | f | 1999-03-30 | NULL |
    +----------+-------+----------+------+------------+-------+
    1 row in set (0.00 sec)

    INSERT INTO pet
    VALUES('旺财','周星驰','狗','公','1990-01-01',NULL);
    mysql> select * from pet;
    +----------+-----------+----------+------+------------+-------+
    | name | owner | specials | sex | birth | death |
    +----------+-----------+----------+------+------------+-------+
    | Puffball | Diane | hamster | f | 1999-03-30 | NULL |
    | 旺财 | 周星驰 ||| 1990-01-01 | NULL |
    +----------+-----------+----------+------+------------+-------+
    2 rows in set (0.00 sec)

    + +

    –MySQL常用数据类型有哪些

    –MySQL支持多种类型,大致可以分为三类:

    +

    –数值

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    TINYINT1 字节(-128,127)(0,255)小整数值
    SMALLINT2 字节(-32 768,32 767)(0,65 535)大整数值
    MEDIUMINT3 字节(-8 388 608,8 388 607)(0,16 777 215)大整数值
    INT或INTEGER4 字节(-2 147 483 648,2 147 483 647)(0,4 294 967 295)大整数值
    BIGINT8 字节(-9,223,372,036,854,775,808,9 223 372 036 854 775 807)(0,18 446 744 073 709 551 615)极大整数值
    FLOAT4 字节(-3.402 823 466 E+38,-1.175 494 351 E-38),0,(1.175 494 351 E-38,3.402 823 466 351 E+38)0,(1.175 494 351 E-38,3.402 823 466 E+38)单精度 浮点数值
    DOUBLE8 字节(-1.797 693 134 862 315 7 E+308,-2.225 073 858 507 201 4 E-308),0,(2.225 073 858 507 201 4 E-308,1.797 693 134 862 315 7 E+308)0,(2.225 073 858 507 201 4 E-308,1.797 693 134 862 315 7 E+308)双精度 浮点数值
    DECIMAL对DECIMAL(M,D) ,如果M>D,为M+2否则为D+2依赖于M和D的值依赖于M和D的值小数值
    +
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    mysql> Create table testType(
    -> Number TINYINT
    -> );
    Query OK, 0 rows affected (0.08 sec)

    mysql> show tables;
    +----------------+
    | Tables_in_test |
    +----------------+
    | pet |
    | testtype |
    +----------------+
    2 rows in set (0.00 sec)
    + +
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    mysql> describe testtype;
    +--------+------------+------+-----+---------+-------+
    | Field | Type | Null | Key | Default | Extra |
    +--------+------------+------+-----+---------+-------+
    | Number | tinyint(4) | YES | | NULL | |
    +--------+------------+------+-----+---------+-------+
    1 row in set (0.00 sec)

    mysql> INSERT INTO testType VALUES(127);
    Query OK, 1 row affected (0.02 sec)

    mysql> select * from testtype;
    +--------+
    | Number |
    +--------+
    | 127 |
    +--------+
    1 row in set (0.00 sec)

    mysql> INSERT INTO testType VALUES(128);
    ERROR 1264 (22003): Out of range value for column 'Number' at row 1

    + +

    –日期/时间

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    类型大小 (字节)范围格式用途
    DATE31000-01-01/9999-12-31YYYY-MM-DD日期值
    TIME3‘-838:59:59’/‘838:59:59’HH:MM:SS时间值或持续时间
    YEAR11901/2155YYYY年份值
    DATETIME81000-01-01 00:00:00/9999-12-31 23:59:59YYYY-MM-DD HH:MM:SS混合日期和时间值
    TIMESTAMP41970-01-01 00:00:00/2038 结束时间是第 2147483647 秒,北京时间 2038-1-19 11:14:07,格林尼治时间 2038年1月19日 凌晨 03:14:07YYYYMMDD HHMMSS混合日期和时间值,时间戳
    +

    –字符串(字符)类型

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    类型大小用途
    CHAR0-255字节定长字符串
    VARCHAR0-65535 字节变长字符串
    TINYBLOB0-255字节不超过 255 个字符的二进制字符串
    TINYTEXT0-255字节短文本字符串
    BLOB0-65 535字节二进制形式的长文本数据
    TEXT0-65 535字节长文本数据
    MEDIUMBLOB0-16 777 215字节二进制形式的中等长度文本数据
    MEDIUMTEXT0-16 777 215字节中等长度文本数据
    LONGBLOB0-4 294 967 295字节二进制形式的极大文本数据
    LONGTEXT0-4 294 967 295字节极大文本数据
    +

    –如何往数据库里插入数据

    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
    INSERT INTO pet VALUES('Fluffy','Harold','cat','f','1993-02-04',NULL);
    INSERT INTO pet VALUES('Claws','Gwen','cat','m','1994-03-17',NULL);
    INSERT INTO pet VALUES('Buffy','Harold','dog','f','1989-05-13',NULL);
    INSERT INTO pet VALUES('Fang','Benny','dog','m','1990-08-27',NULL);
    INSERT INTO pet VALUES('Bowser','Diane','dog','m','1979-08-31','1995-07-29');
    INSERT INTO pet VALUES('Chirpy','Gwen','bird','f','1998-09-11',NULL);
    INSERT INTO pet VALUES('Whistler','Gwen','bird',NULL,'1997-12-09',NULL) ;
    INSERT INTO pet VALUES('Slim','Benny','snake','m','1996-04-29',NULL);
    INSERT INTO pet VALUES('Puffball','Diane','hamster','f','1999-03-30',NULL);

    mysql> select * from pet;
    +----------+-----------+----------+------+------------+------------+
    | name | owner | specials | sex | birth | death |
    +----------+-----------+----------+------+------------+------------+
    | Puffball | Diane | hamster | f | 1999-03-30 | NULL |
    | 旺财 | 周星驰 ||| 1990-01-01 | NULL |
    | Fluffy | Harold | cat | f | 1993-02-04 | NULL |
    | Claws | Gwen | cat | m | 1994-03-17 | NULL |
    | Buffy | Harold | dog | f | 1989-05-13 | NULL |
    | Fang | Benny | dog | m | 1990-08-27 | NULL |
    | Bowser | Diane | dog | m | 1979-08-31 | 1995-07-29 |
    | Chirpy | Gwen | bird | f | 1998-09-11 | NULL |
    | Whistler | Gwen | bird | NULL | 1997-12-09 | NULL |
    | Slim | Benny | snake | m | 1996-04-29 | NULL |
    | Puffball | Diane | hamster | f | 1999-03-30 | NULL |
    +----------+-----------+----------+------+------------+------------+
    11 rows in set (0.00 sec)
    + +

    –如何删除数据

    1
    2
    mysql> delete from pet where name = 'Fluffy';
    Query OK, 1 row affected (0.02 sec)
    + +

    –如何修改数据

    1
    2
    3
    4
    mysql> update pet set name='旺旺财' where owner ='周星驰';
    Query OK, 1 row affected (0.01 sec)
    Rows matched: 1 Changed: 1 Warnings: 0

    + +

    –数据记录常见操作

    1
    2
    3
    4
    5
    6
    7
    8
    --增加
    INSERT
    --删除
    DELETE
    --修改
    UPDATE
    --查询
    SELECT
    + +

    建表约束

    –主键约束

    它能够唯一确定一张表中的一条记录,也就我们通过某个字段添加约束,可以使得字段不重复且不为空。

    +
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    create table user(
    id int primary key,
    name varchar(20)
    );

    mysql> insert into user values(1,'张三');
    Query OK, 1 row affected (0.02 sec)

    mysql> insert into user values(1,'张三');
    ERROR 1062 (23000): Duplicate entry '1' for key 'PRIMARY'

    mysql> insert into user values(2,'张三');
    Query OK, 1 row affected (0.01 sec)

    mysql> select * from user;
    +----+--------+
    | id | name |
    +----+--------+
    | 1 | 张三 |
    | 2 | 张三 |
    +----+--------+
    2 rows in set (0.00 sec)
    + +
    1
    2
    mysql> insert into user values(NULL,'张三');
    ERROR 1048 (23000): Column 'id' cannot be null
    + +
    –联合主键
    –只要联合的主键值(均不为空)加起来不重复就OK
    1
    2
    3
    4
    5
    6
    7
    mysql> create table user2(
    -> id int,
    -> name varchar(20),
    -> password varchar(20),
    -> primary key(id,name)
    -> ) ;
    Query OK, 0 rows affected (0.07 sec)
    + +
    1
    2
    3
    4
    5
    6
    7
    8
    9
    mysql> insert into user2 values(1,'张三','123');
    Query OK, 1 row affected (0.02 sec)

    mysql> insert into user2 values(1,'张三','123');
    ERROR 1062 (23000): Duplicate entry '1-张三' for key 'PRIMARY'
    mysql> insert into user2 values(2,'张三','123');
    Query OK, 1 row affected (0.01 sec)
    mysql> insert into user2 values(1,'李四','123');
    Query OK, 1 row affected (0.01 sec)
    + +
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    mysql> select * from user2
    -> ;
    +----+--------+----------+
    | id | name | password |
    +----+--------+----------+
    | 1 | 张三 | 123 |
    | 1 | 李四 | 123 |
    | 2 | 张三 | 123 |
    +----+--------+----------+
    3 rows in set (0.00 sec)
    + +

    –自增约束

    –auto_increment
    1
    2
    3
    4
    create table user3(
    id int primary key auto_increment,
    name varchar(20)
    );
    + +
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    mysql> insert into user3 (name) values('zhangsan');
    Query OK, 1 row affected (0.02 sec)

    mysql> select * from user3;
    +----+----------+
    | id | name |
    +----+----------+
    | 1 | zhangsan |
    +----+----------+
    1 row in set (0.00 sec)
    mysql> insert into user3 (name) values('zhangsan');
    Query OK, 1 row affected (0.01 sec)

    mysql> select * from user3;
    +----+----------+
    | id | name |
    +----+----------+
    | 1 | zhangsan |
    | 2 | zhangsan |
    +----+----------+
    2 rows in set (0.00 sec)

    + +
    –如果创建表的时候忘记创建主键约束
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    mysql> create table user4(
    -> id int,
    -> name varchar(20)
    -> );
    Query OK, 0 rows affected (0.07 sec)

    mysql> desc user4;
    +-------+-------------+------+-----+---------+-------+
    | Field | Type | Null | Key | Default | Extra |
    +-------+-------------+------+-----+---------+-------+
    | id | int(11) | YES | | NULL | |
    | name | varchar(20) | YES | | NULL | |
    +-------+-------------+------+-----+---------+-------+
    2 rows in set (0.00 sec)
    + +
    –修改表结构,添加主键
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    mysql> alter table user4 add primary key(id);
    Query OK, 0 rows affected (0.14 sec)
    Records: 0 Duplicates: 0 Warnings: 0

    mysql> desc user4;
    +-------+-------------+------+-----+---------+-------+
    | Field | Type | Null | Key | Default | Extra |
    +-------+-------------+------+-----+---------+-------+
    | id | int(11) | NO | PRI | NULL | |
    | name | varchar(20) | YES | | NULL | |
    +-------+-------------+------+-----+---------+-------+
    2 rows in set (0.00 sec)
    + +
    –如何删除
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    mysql> alter table user4 drop primary key;
    Query OK, 0 rows affected (0.14 sec)
    Records: 0 Duplicates: 0 Warnings: 0

    mysql> desc user4;
    +-------+-------------+------+-----+---------+-------+
    | Field | Type | Null | Key | Default | Extra |
    +-------+-------------+------+-----+---------+-------+
    | id | int(11) | NO | | NULL | |
    | name | varchar(20) | YES | | NULL | |
    +-------+-------------+------+-----+---------+-------+
    2 rows in set (0.00 sec)
    + +
    –使用modify 修改字段添加约束
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    mysql> alter table user4 modify id int primary key;
    Query OK, 0 rows affected (0.12 sec)
    Records: 0 Duplicates: 0 Warnings: 0

    mysql> desc user4;
    +-------+-------------+------+-----+---------+-------+
    | Field | Type | Null | Key | Default | Extra |
    +-------+-------------+------+-----+---------+-------+
    | id | int(11) | NO | PRI | NULL | |
    | name | varchar(20) | YES | | NULL | |
    +-------+-------------+------+-----+---------+-------+
    2 rows in set (0.00 sec)
    + +

    –唯一约束

    –约束修饰字段的值不可以重复

    +
    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
    mysql> create table user5(
    -> id int,
    -> name varchar(20)
    -> );
    Query OK, 0 rows affected (0.07 sec)

    mysql> alter table user5 add unique(name);
    Query OK, 0 rows affected (0.04 sec)
    Records: 0 Duplicates: 0 Warnings: 0

    mysql> desc user5;
    +-------+-------------+------+-----+---------+-------+
    | Field | Type | Null | Key | Default | Extra |
    +-------+-------------+------+-----+---------+-------+
    | id | int(11) | YES | | NULL | |
    | name | varchar(20) | YES | UNI | NULL | |
    +-------+-------------+------+-----+---------+-------+
    2 rows in set (0.00 sec)

    mysql> insert into user5 values(1,'zhangsan');
    Query OK, 1 row affected (0.01 sec)

    mysql> insert into user5 values(1,'zhangsan');
    ERROR 1062 (23000): Duplicate entry 'zhangsan' for key 'name'
    mysql> insert into user5 values(1,'lisi');
    Query OK, 1 row affected (0.01 sec)
    + +
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    create table user6(
    id int,
    name varchar(20),
    unique(name)
    );

    create table user7(
    id int,
    name varchar(20) unique
    );


    create table user8(
    id int,
    name varchar(20),
    unique(id,name)
    );
    + +
    –两个键在一起不重复就OK
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    Query OK, 0 rows affected (0.08 sec)

    mysql> desc user8;
    +-------+-------------+------+-----+---------+-------+
    | Field | Type | Null | Key | Default | Extra |
    +-------+-------------+------+-----+---------+-------+
    | id | int(11) | YES | MUL | NULL | |
    | name | varchar(20) | YES | | NULL | |
    +-------+-------------+------+-----+---------+-------+
    2 rows in set (0.00 sec)

    mysql> insert into user8 values(1,'zhangsan');
    Query OK, 1 row affected (0.02 sec)

    mysql> insert into user8 values(2,'zhangsan');
    Query OK, 1 row affected (0.02 sec)
    + +
    –如何删除唯一约束
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    alter table user7 drop index name;
    Query OK, 0 rows affected (0.03 sec)
    Records: 0 Duplicates: 0 Warnings: 0

    mysql> desc user7;
    +-------+-------------+------+-----+---------+-------+
    | Field | Type | Null | Key | Default | Extra |
    +-------+-------------+------+-----+---------+-------+
    | id | int(11) | YES | | NULL | |
    | name | varchar(20) | YES | | NULL | |
    +-------+-------------+------+-----+---------+-------+
    2 rows in set (0.00 sec)
    + +
    –modify添加
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    alter table user7 modify name varchar(20) unique;
    Query OK, 0 rows affected (0.04 sec)
    Records: 0 Duplicates: 0 Warnings: 0

    mysql> desc user7;
    +-------+-------------+------+-----+---------+-------+
    | Field | Type | Null | Key | Default | Extra |
    +-------+-------------+------+-----+---------+-------+
    | id | int(11) | YES | | NULL | |
    | name | varchar(20) | YES | UNI | NULL | |
    +-------+-------------+------+-----+---------+-------+
    2 rows in set (0.00 sec)
    + +

    –总结

    –1 建表的时候添加约束
    –2 alter add
    –3 alter modify
    –4 删除 alter drop

    –非空约束

    –修饰的字段不能为空 NULL

    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
    create table user9(
    id int,
    name varchar(20) not null
    );
    Query OK, 0 rows affected (0.07 sec)

    mysql> desc user9;
    +-------+-------------+------+-----+---------+-------+
    | Field | Type | Null | Key | Default | Extra |
    +-------+-------------+------+-----+---------+-------+
    | id | int(11) | YES | | NULL | |
    | name | varchar(20) | NO | | NULL | |
    +-------+-------------+------+-----+---------+-------+
    2 rows in set (0.00 sec)

    insert into user9 (id) values(1);
    ERROR 1364 (HY000): Field 'name' doesn't have a default value

    insert into user9 values(1,'张三');
    Query OK, 1 row affected (0.01 sec)
    mysql> select * from user9;
    +------+--------+
    | id | name |
    +------+--------+
    | 1 | 张三 |
    +------+--------+
    1 row in set (0.00 sec)

    insert into user9 (name) values('lisi');
    mysql> insert into user9 (name) values('lisi');
    Query OK, 1 row affected (0.01 sec)

    mysql> select * from user9;
    +------+--------+
    | id | name |
    +------+--------+
    | 1 | 张三 |
    | NULL | lisi |
    +------+--------+
    2 rows in set (0.00 sec)
    + +

    –默认约束

    –当插入字段值的时候,如果没有传值,就会使用默认值

    +
    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
    create table user10(
    id int,
    name varchar(20),
    age int default 10
    );
    Query OK, 0 rows affected (0.07 sec)

    mysql> desc user10;
    +-------+-------------+------+-----+---------+-------+
    | Field | Type | Null | Key | Default | Extra |
    +-------+-------------+------+-----+---------+-------+
    | id | int(11) | YES | | NULL | |
    | name | varchar(20) | YES | | NULL | |
    | age | int(11) | YES | | 10 | |
    +-------+-------------+------+-----+---------+-------+
    3 rows in set (0.00 sec)

    insert into user10 (id,name) values(1,'zhangsan');
    Query OK, 1 row affected (0.02 sec)

    mysql> select * from user10;
    +------+----------+------+
    | id | name | age |
    +------+----------+------+
    | 1 | zhangsan | 10 |
    +------+----------+------+
    1 row in set (0.00 sec)
    + +
    –传了值就不会使用默认值
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    insert into user10 values(1,'zhangsan',19);
    Query OK, 1 row affected (0.02 sec)

    mysql> select * from user10;
    +------+----------+------+
    | id | name | age |
    +------+----------+------+
    | 1 | zhangsan | 10 |
    | 1 | zhangsan | 19 |
    +------+----------+------+
    2 rows in set (0.00 sec)

    + +

    –外键约束

    –牵扯到两个表:父表、子表
    –主表、副表

    –班级

    +

    create table classes(

    +

    id int primary key,

    +

    name varchar(20)

    +

    );

    +

    –学生

    +
    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
    create table students(
    id int primary key,
    name varchar(20),
    class_id int,
    foreign key(class_id) references classes(id)
    );

    insert into classes values(1,'一班');
    insert into classes values(2,'二班');
    insert into classes values(3,'三班');
    insert into classes values(4,'四班');
    mysql> select * from classes;
    +----+--------+
    | id | name |
    +----+--------+
    | 1 | 一班 |
    | 2 | 二班 |
    | 3 | 三班 |
    | 4 | 四班 |
    +----+--------+
    4 rows in set (0.00 sec)

    insert into students values(1001,'张三',1);
    insert into students values(1002,'张三',2);
    insert into students values(1003,'张三',3);
    insert into students values(1004,'张三',4);

    insert into students values(1005,'张三',5);
    ERROR 1452 (23000): Cannot add or update a child row: a foreign key constraint fails (`test`.`students`, CONSTRAINT `students_ibfk_1` FOREIGN KEY (`class_id`) REFERENCES `classes` (`id`))

    --1 主表classes中没有的数据值,在副表中是不可以使用的
    --2 主表中的记录被副标使用,是不可以删除的


    delete from classes where id=4;
    ERROR 1451 (23000): Cannot delete or update a parent row: a foreign key constraint fails (`test`.`students`, CONSTRAINT `students_ibfk_1` FOREIGN KEY (`class_id`) REFERENCES `classes` (`id`))
    + +

    三大范式

    –1.第一范式

    –1NF

    –数据表中的所有字段都是不可分割的原子值

    +
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    create table student2(
    id int primary key,
    name varchar(20),
    address varchar(30)
    );

    insert into student2 values(1,'张三','中国山东省东营市东营区济南路100号');
    insert into student2 values(2,'李四','中国山东省东营市东营区东二路200号');
    insert into student2 values(3,'王五','中国山东省东营市广饶县天府路300号');
    mysql> select * from student2;
    +----+--------+--------------------------------------------------+
    | id | name | address |
    +----+--------+--------------------------------------------------+
    | 1 | 张三 | 中国山东省东营市东营区济南路100|
    | 2 | 李四 | 中国山东省东营市东营区东二路200|
    | 3 | 王五 | 中国山东省东营市广饶县天府路300|
    +----+--------+--------------------------------------------------+
    3 rows in set (0.00 sec)

    + +
    –字段值还可以继续拆分的,不满足第一范式
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
     
    create table student3(
    id int primary key,
    name varchar(20),
    country varchar(30),
    privence varchar(30),
    city varchar(30),
    details varchar(30)
    );

    insert into student3 values(1,'张三','中国','山东省','东营市','东营区济南路100号');
    insert into student3 values(2,'李四','中国','山东省','东营市','东营区东二路200号');
    insert into student3 values(3,'王五','中国','山东省','东营市','广饶县天府路300号');
    mysql> select * from student3;
    +----+--------+---------+-----------+-----------+--------------------------+
    | id | name | country | privence | city | details |
    +----+--------+---------+-----------+-----------+--------------------------+
    | 1 | 张三 | 中国 | 山东省 | 东营市 | 东营区济南路100|
    | 2 | 李四 | 中国 | 山东省 | 东营市 | 东营区东二路200|
    | 3 | 王五 | 中国 | 山东省 | 东营市 | 广饶县天府路300|
    +----+--------+---------+-----------+-----------+--------------------------+
    3 rows in set (0.00 sec)

    + +
    –范式设计的越详细,对于某些实际操作可能更好,但是不一定都是好处

    –第二范式

    –必须满足第一范式的前提下,第二范式要求,除主键外的每一列都必须完全依赖于主键

    +

    –如果出现不完全依赖,只可能发生在联合主键的情况下

    +
    1
    2
    3
    4
    5
    6
    7
    create table myorder(
    product_id int,
    customer_id int,
    product_name varchar(20),
    customer_name varchar(20),
    primary key(product_id,customer_id)
    );
    + +
    –问题
    –除主键以外的其他列,只依赖于主键的其他部分字段
    –拆表
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    create table myorder(
    order_id primary key,
    product_id int,
    customer_id int
    );

    create table product(
    id int,
    name varchar(20)
    );

    create table customer(
    id int primary key,
    name varchar(20)
    );

    + +
    –分成三个表之后完全依赖 满足第二范式

    –第三范式

    –3NF

    +

    –必须先满足第二范式,除开主键列的其他列之间不能有传递关系

    +
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    create table myorder(
    order_id primary key,
    product_id int,
    customer_id int
    );

    create table customer(
    id int primary key,
    name varchar(20)
    phone varchar(15)
    );
    + +

    查询练习

    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
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
    146
    147
    148
    149
    150
    151
    152
    153
    154
    155
    156
    157
    158
    1.查询student表中所有记录
    select * from student;

    2.查询student表中所有记录的sname 、ssex、class、
    select sname,ssex,class from student;

    3.查询教师所有的单位即不重复的depart列
    distinct 排除重复
    select distinct depart from teacher;

    4.查询score表中成绩在6080之间的记录
    查询区间 betweenand
    select * from score where degree between 60 and 80
    或者
    selet * from score where degree > 60 and degree <80;

    5.查询score表中成绩为858688 的记录
    表示或者关系的查询 in
    select * from score where degree in (85,86,88);

    6.查询student表中“95031”班或性别为“女”的同学的记录
    or 表示或者
    select * from student where class='95031' or ssex='女';

    7.以class降序查询student表的所有记录
    升序asc,降序desc
    select * from studnt order by class desc;
    默认升序
    select * from studnt order by class (asc);

    8.以cno升序、degree降序查询score表中的所有记录
    select * from student score oder by cno asc,degree desc;

    9.查询“95031”班 的学生人数
    统计 count
    select count(*) from student where class='95031';

    10.查询score表中的最高分的学生学号和课程号(子查询或排序)
    select sno,cno from score where degree=(select max(degree) from score);
    1、找到最高分
    select max(degree) from score;
    2、找最高分的sno 和cno
    select sno,cno from score where degree=(select max(degree) from score);
    排序的做法
    select sno,cno from score oder by degree;
    select sno,cno from score oder by degree desc limit 0,1;
    limit a,b
    a=从第几条开始查
    b=查多少条


    11.查询每门课的平均成绩
    分开去找
    select * from course;

    avg()
    select avg(degree) from score where cno-'3-105';
    select degree from score where cno ='3-105';
    在一个sql中写
    group by 分组
    select cno,avg(degree) from score group by cno;

    12.查询score表中至少有两名学生选修的并以3开头的课程的平均数
    select cno,avg(degree) from score
    group by cno
    having count(cno)>=2
    and cno like '3%';

    13.查询分数大于70,小于90的sno列
    select sno ,dgree from score
    where degree >70 and degree <90;
    或者
    select sno ,dgree from score
    where degree between 70 and 90;


    14.查询所有学生的sname cno 和degree列
    select sname from student;
    select cno,degree from score;

    多表查询
    select sname,cno,degree from student,score
    where student.sno=score.sno;

    15.查询所有学生的sno cname 和degree 列
    select sno,cname,degree from course,score
    where course.cno=score.cno;

    16.查询所有学生的sname cname和degree 列
    sname->student
    cname->course
    degree->score
    select sname,cname,degree from student,course,score
    where student.sno=score.sno and course.cno=score.cno;

    17.查询“95031”班学生每门课的平均成绩
    分步思路
    select * from student where class ='95031';
    select sno from student where class='95031';
    select * from score where sno in(select * from student where class ='95031');

    合并
    select cno,avg(degree)
    from score
    where sno in (select sno from student where class='95031')
    group by cno;

    18.查询选修“3-105”课程的成绩高于“109”号同学“3-105”成绩的所有同学的记录
    select degree from score where sno='109' and cno='3-105';

    select *from score where cno='3-105' and degree>(select degree from score where sno='109' and cno='3-105');

    19.查询成绩高于学号为“109”、课程号为“3-105”的成绩的所有记录
    select *from score where and degree>(select degree from score where sno='109' and cno='3-105');

    20.查询和学号为108101的同学同年出生的所有学生的sno、sname和sbirthday列
    select year(sbirthday) from student where sno in (108,101);

    select * from student where year(sbirthday) in (select year(sbirthday) from student where sno in (108,101));

    21.查询“张旭”教师任课的学生成绩
    select * from teacher where tname='张旭';
    select tno from teacher where tname='张旭';
    select * from course where tno=(select tno from teacher where tname='张旭');
    select cno from course where tno=(select tno from teacher where tname='张旭');
    select * from score where cno=(select cno from course where tno=(select tno from teacher where tname='张旭'));

    22.查询选修某课程的同学人数多于5人的教师姓名
    select cno from score group by cno having count(*)>5;

    select * from teacher;
    select tno from course where cno=(select cno from score group by cno having count(*)>5);
    select tname from teacher where tno=(select tno from course where cno=(select cno from score group by cno having count(*)>5));

    23.查询95033班和95031班全体学生的记录
    select * from student;
    select * from student where calss in ('95031','95033');

    24.查询存在有85分以上成绩的课程Cno
    select cno from score where degree >85;

    25.查询出“计算机系”教师所教课程的成绩表
    select * from teacher where depart='计算机系';
    select * from course where tno in(select tno from teacher where depart='计算机系');
    select * from score where cno in(select cno from course where tno in(select tno from teacher where depart='计算机系'));

    26.查询“计算机系”与“电子工程系”不同职称的教师的tname和prof
    union 求并集
    select * from teacher ;
    select prof from teacher where depart ='电子工程系';
    select * from teacher where depart ='计算机系' and prof not in(select prof from teacher where depart ='电子工程系') ;
    select * from teacher where depart ='电子工程系' and prof not in(select prof from teacher where depart ='计算机系') ;

    select * from teacher where depart ='计算机系' and prof not in(select prof from teacher where depart ='电子工程系') union select * from teacher where depart ='电子工程系' and prof not in(select prof from teacher where depart ='计算机系') ;

    27.查询选修编号为“3-105”课程且成绩至少高于选修编号为“3-245”的同学的cno 、sno和degree,并按照degree从高到低的次序排序
    select * from score where cno='3-245';
    select * from score where cno='3-105';
    + +
    +

    至少:大于其中至少一个,**any

    +
    +
    1
    2
    3
    4
    5
    6
    7
    8
    9
    select * from score 
    where cno='3-105'
    and degree>any(select degree from score where cno='3-245')
    order by degree desc;

    28.查询选修编号为“3-105”且成绩高于选修编号为“3-245”课程的同学的cno、sno和degree
    select * from score
    where cno='3-105'
    and degree>all(select degree from score where cno='3-245');
    + +
    +

    all**表示所有的关系

    +
    +
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
     
    29.查询所有教师和同学的name、sex和birthday
    别名 as
    select tname as name,tsex as sex,tbirthday as birthday from teacher
    union
    select sname,ssex,sbirthday from student;

    30.查询所有“女”教师和“女”同学的name、sex、birthday
    select tname as name,tsex as sex,tbirthday as birthday from teacher
    where tsex='女'
    union
    select sname,ssex,sbirthday from student
    where ssex='女';

    31.查询成绩比该课程平均成绩低的同学的成绩表
    select cno,avg(degree) from score group by cno;
    select * from score;

    select * from score a where degree < (select avg(degree) from score b where a.cno=b.cno);

    32.查询所有任课教师的tname和depart
    select * from teacher;
    + +
    +

    任课:在课程表中安排了课程

    +
    +
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    select * from course;
    select * from teacher where tno in(select tno from course);
    select tname,depart from teacher where tno in(select tno from course);

    33.查询至少有两名男生的班号
    select * from student;
    select class from student where ssex ='男' group by class having count(*)>1;

    34.查询student表中不姓“王”的同学的记录
    select * from student;
    select * from student where sname not like '王%';

    35.查询student表中每个学生的姓名和年龄
    年龄:当前年份-出生年龄
    当前年龄:
    select year (now());
    select year(sbirthday) from student;

    select sname,year(now())-year(sbirthday) as '年龄' from student;

    36.查询student表中最大和最小的sbirthday日期值
    select sbirthday from student;
    select sbirthday from student order by sbirthday;
    + +
    +

    max,min 数值大小

    +
    +
    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
    select max(sbirthday) as '最大',min(sbirthday) as '最小' from student;

    37.以班号和年龄从大到小的顺序查询student表中的全部记录
    select * from student order by class sedc,sbirthday;

    38.查询“男”教师及其所上的课程
    select * from teacher where tsex='男';

    select * from course where tno in(select tno from teacher where tsex='男');

    39.查询最高分同学的sno、cno和degree列
    select max(degree) from score;
    select * from score where degree=(select max(degree) from score);

    40.查询和“李军”同性别的所有同学的sname;
    select ssex from student where sname='李军';
    select sname from student where ssex=(select ssex from student where sname='李军');

    41.查询和李军同性别并且同班的同学sname
    select sname from student
    where ssex=(select ssex from score where degree=(select max(degree) from score))
    and class=(select class from student where sname='李军');

    42.查询所有选修“计算机导论”课程的“男”同学的成绩表
    select * from student where ssex='男';
    select * from course where cname='计算机导论';

    select * from score
    where cno=(select cno from course where cname='计算机导论')
    and where sno in(select sno from student where ssex='男');

    43.
    + +

    连接查询

    SQL的四种连接查询

    +

    内连接

    +

    inner join或 join

    +

    外连接

    +

    左连接 left join 或者left outer join

    +

    右连接right join或者 right outer join

    +

    完全外连接 full join 或者full outer join

    +

    创建数据库:

    +
    1
    2
    3
    4
    5
    6
    create database testJoin;
    Query OK, 1 row affected (0.02 sec)

    mysql> use testJoin;
    Database changed
    mysql>
    + +

    创建两个表:

    +

    person 表

    +
    1
    2
    3
    4
    5
    6
    7
    8
    9
    id,
    name,
    cardId

    create table person(
    id int,
    name varchar(20),
    cardId int
    );
    + +

    card 表

    +
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    id,
    name

    create table card(
    id int,
    name varchar(20)
    );


    mysql> show tables;
    +--------------------+
    | Tables_in_testjoin |
    +--------------------+
    | card |
    | person |
    +--------------------+
    2 rows in set (0.02 sec)

    insert into card values(1,'饭卡');
    insert into card values(2,'建行卡');
    insert into card values(3,'农行卡');
    insert into card values(4,'工商卡');
    insert into card values(5,'邮政卡');
    + +
    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
    mysql> select * from card;
    +------+-----------+
    | id | name |
    +------+-----------+
    | 1 | 饭卡 |
    | 2 | 建行卡 |
    | 3 | 农行卡 |
    | 4 | 工商卡 |
    | 5 | 邮政卡 |
    +------+-----------+
    5 rows in set (0.00 sec)

    insert into person values(1,'张三',1);
    insert into person values(2,'李四',3);
    insert into person values(3,'王五',6);
    mysql> select * from person;
    +------+--------+--------+
    | id | name | cardId |
    +------+--------+--------+
    | 1 | 张三 | 1 |
    | 2 | 李四 | 3 |
    | 3 | 王五 | 6 |
    +------+--------+--------+
    3 rows in set (0.00 sec)

    + +
    1.inner join查询(内连接)
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
     
    select * from person inner join card on person.cardId =card.id;
    +------+--------+--------+------+-----------+
    | id | name | cardId | id | name |
    +------+--------+--------+------+-----------+
    | 1 | 张三 | 1 | 1 | 饭卡 |
    | 2 | 李四 | 3 | 3 | 农行卡 |
    +------+--------+--------+------+-----------+
    2 rows in set (0.00 sec)

    内联查询,就是两张表中的数据,通过某个字段相对,查询出相关记录数据

    select * from person join card on person.cardId =card.id;
    +------+--------+--------+------+-----------+
    | id | name | cardId | id | name |
    +------+--------+--------+------+-----------+
    | 1 | 张三 | 1 | 1 | 饭卡 |
    | 2 | 李四 | 3 | 3 | 农行卡 |
    +------+--------+--------+------+-----------+
    2 rows in set (0.00 sec)

    + +
    2.left join(左外连接)
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    select * from person left join card on person.cardId=card.id;
    +------+--------+--------+------+-----------+
    | id | name | cardId | id | name |
    +------+--------+--------+------+-----------+
    | 1 | 张三 | 1 | 1 | 饭卡 |
    | 2 | 李四 | 3 | 3 | 农行卡 |
    | 3 | 王五 | 6 | NULL | NULL |
    +------+--------+--------+------+-----------+
    3 rows in set (0.00 sec)

    左外连接,会把左表里面的所有数据取出来,而右表中的数据,如果有相等的,就显示出来,如果没有,就补NULL
    select * from person left outer join card on person.cardId=card.id;
    +------+--------+--------+------+-----------+
    | id | name | cardId | id | name |
    +------+--------+--------+------+-----------+
    | 1 | 张三 | 1 | 1 | 饭卡 |
    | 2 | 李四 | 3 | 3 | 农行卡 |
    | 3 | 王五 | 6 | NULL | NULL |
    +------+--------+--------+------+-----------+
    3 rows in set (0.00 sec)

    + +
    3.right join(右外连接)
    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
    select * from person right join card on person.cardId=card.id;
    +------+--------+--------+------+-----------+
    | id | name | cardId | id | name |
    +------+--------+--------+------+-----------+
    | 1 | 张三 | 1 | 1 | 饭卡 |
    | 2 | 李四 | 3 | 3 | 农行卡 |
    | NULL | NULL | NULL | 2 | 建行卡 |
    | NULL | NULL | NULL | 4 | 工商卡 |
    | NULL | NULL | NULL | 5 | 邮政卡 |
    +------+--------+--------+------+-----------+
    5 rows in set (0.00 sec)

    右外连接,会把右表里面的所有数据取出来,而左表中的数据,如果有相等的,就显示出来,如果没有,就补NULL
    select * from person right outer join card on person.cardId=card.id;
    +------+--------+--------+------+-----------+
    | id | name | cardId | id | name |
    +------+--------+--------+------+-----------+
    | 1 | 张三 | 1 | 1 | 饭卡 |
    | 2 | 李四 | 3 | 3 | 农行卡 |
    | NULL | NULL | NULL | 2 | 建行卡 |
    | NULL | NULL | NULL | 4 | 工商卡 |
    | NULL | NULL | NULL | 5 | 邮政卡 |
    +------+--------+--------+------+-----------+
    5 rows in set (0.00 sec)

    4.full join(全外连接)
    select * from person full join card on person.cardId=card.id;

    mysql 不支持full join

    select * from person left join card on person.cardId=card.id
    union
    select * from person right join card on person.cardId=card.id;
    +------+--------+--------+------+-----------+
    | id | name | cardId | id | name |
    +------+--------+--------+------+-----------+
    | 1 | 张三 | 1 | 1 | 饭卡 |
    | 2 | 李四 | 3 | 3 | 农行卡 |
    | 3 | 王五 | 6 | NULL | NULL |
    | NULL | NULL | NULL | 2 | 建行卡 |
    | NULL | NULL | NULL | 4 | 工商卡 |
    | NULL | NULL | NULL | 5 | 邮政卡 |
    +------+--------+--------+------+-----------+
    6 rows in set (0.01 sec)
    + +

    事务

    MySQL中,事务是一个最小的不可分割的工作单元。事务能够保证一个业务的完整性。

    +

    比如银行转账:

    +
    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
    a->-100
    update user set money =money-100 where name='a';

    b->+100
    update user set money =money+100 where name='b';

    多条sql语句,可能会有同时成功的要求,要么就同时失败

    MySQL中如何控制事务?

    1.MySQL默认开启事务(自动提交)
    mysql> select @@autocommit;
    +--------------+
    | @@autocommit |
    +--------------+
    | 1 |
    +--------------+
    1 row in set (0.00 sec)

    默认开启事务的作用:
    当我们去执行一个sql语句的时候,效果会立即体现出来,且不能回滚

    create database bank;

    create table user(
    id int primary key,
    name varchar(20),
    money int
    );
    insert into user values(1,'a',1000);

    事务回滚:撤销sql语句执行效果
    roolback;

    mysql> select * from user;
    +----+------+-------+
    | id | name | money |
    +----+------+-------+
    | 1 | a | 1000 |
    +----+------+-------+
    1 row in set (0.00 sec)

    mysql> rollback;
    Query OK, 0 rows affected (0.00 sec)

    mysql> select * from user;
    +----+------+-------+
    | id | name | money |
    +----+------+-------+
    | 1 | a | 1000 |
    +----+------+-------+
    1 row in set (0.00 sec)

    设置MySQL自动提交为false
    set autocommit=0;
    Query OK, 0 rows affected (0.00 sec)

    mysql> select @@autocommit;
    +--------------+
    | @@autocommit |
    +--------------+
    | 0 |
    +--------------+
    1 row in set (0.00 sec)

    上面的操作,关闭了MySQL的自动提交(autocommit)

    insert into user values(2,'b',1000);
    Query OK, 1 row affected (0.00 sec)

    mysql> select * from user;
    +----+------+-------+
    | id | name | money |
    +----+------+-------+
    | 1 | a | 1000 |
    | 2 | b | 1000 |
    +----+------+-------+
    2 rows in set (0.00 sec)

    mysql> rollback;
    Query OK, 0 rows affected (0.01 sec)

    mysql> select * from user;
    +----+------+-------+
    | id | name | money |
    +----+------+-------+
    | 1 | a | 1000 |
    +----+------+-------+
    1 row in set (0.00 sec)

    再一次插入数据

    mysql> insert into user values(2,'b',1000);
    Query OK, 1 row affected (0.00 sec)
    手动提交数据

    mysql> commit;
    Query OK, 0 rows affected (0.02 sec)
    再撤销,是不可以撤销的(持久性)
    mysql> rollback;
    Query OK, 0 rows affected (0.00 sec)

    mysql> select * from user;
    +----+------+-------+
    | id | name | money |
    +----+------+-------+
    | 1 | a | 1000 |
    | 2 | b | 1000 |
    +----+------+-------+
    2 rows in set (0.00 sec)

    + +

    字段提交 @@autocommit=1

    手动提交 commit

    事务回滚 rollback

    如果说这个时候转账:

    +
    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
    update user set money =money-100 where name='a';
    update user set money =money+100 where name='b';
    mysql> select * from user;
    +----+------+-------+
    | id | name | money |
    +----+------+-------+
    | 1 | a | 900 |
    | 2 | b | 1100 |
    +----+------+-------+
    2 rows in set (0.00 sec)

    rollback

    mysql> rollback;
    Query OK, 0 rows affected (0.01 sec)

    mysql> select * from user;
    +----+------+-------+
    | id | name | money |
    +----+------+-------+
    | 1 | a | 1000 |
    | 2 | b | 1000 |
    +----+------+-------+
    2 rows in set (0.00 sec)

    事务提供了一个反悔的机会


    set autocommit=1;
    Query OK, 0 rows affected (0.00 sec)

    mysql> select @@autocommit;
    +--------------+
    | @@autocommit |
    +--------------+
    | 1 |
    +--------------+
    1 row in set (0.00 sec)

    begin;
    或者
    start transaction;
    都可以帮助手动开启一个事务
    mysql> select * from user;
    +----+------+-------+
    | id | name | money |
    +----+------+-------+
    | 1 | a | 1000 |
    | 2 | b | 1000 |
    +----+------+-------+
    2 rows in set (0.00 sec)
    update user set money =money-100 where name='a';
    update user set money =money+100 where name='b';
    mysql> select * from user;
    +----+------+-------+
    | id | name | money |
    +----+------+-------+
    | 1 | a | 900 |
    | 2 | b | 1100 |
    +----+------+-------+
    2 rows in set (0.00 sec)
    + +
    +

    事务回滚

    +
    +
    1
    2
    mysql> rollback;
    Query OK, 0 rows affected (0.00 sec)
    + +
    +

    没有被撤销

    +
    +
    1
    2
    3
    4
    5
    6
    7
    8
    9
    mysql> select * from user;
    +----+------+-------+
    | id | name | money |
    +----+------+-------+
    | 1 | a | 900 |
    | 2 | b | 1100 |
    +----+------+-------+
    2 rows in set (0.00 sec)

    + +
    手动开启事务(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
    begin;
    update user set money =money-100 where name='a';
    update user set money =money+100 where name='b';
    mysql> select * from user;
    +----+------+-------+
    | id | name | money |
    +----+------+-------+
    | 1 | a | 800 |
    | 2 | b | 1200 |
    +----+------+-------+
    2 rows in set (0.00 sec)

    mysql> rollback;
    Query OK, 0 rows affected (0.01 sec)

    mysql> select * from user;
    +----+------+-------+
    | id | name | money |
    +----+------+-------+
    | 1 | a | 900 |
    | 2 | b | 1100 |
    +----+------+-------+
    2 rows in set (0.00 sec)

    + +
    手动开启事务(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
    start transaction;
    update user set money =money-100 where name='a';
    update user set money =money+100 where name='b';
    mysql> select * from user;
    +----+------+-------+
    | id | name | money |
    +----+------+-------+
    | 1 | a | 800 |
    | 2 | b | 1200 |
    +----+------+-------+
    2 rows in set (0.00 sec)

    mysql> rollback;
    Query OK, 0 rows affected (0.01 sec)

    mysql> select * from user;
    +----+------+-------+
    | id | name | money |
    +----+------+-------+
    | 1 | a | 900 |
    | 2 | b | 1100 |
    +----+------+-------+
    2 rows in set (0.00 sec)

    + +
    事务开启之后,一旦提交,回滚(rollback)无效
    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
    mysql> start transaction;
    Query OK, 0 rows affected (0.00 sec)

    mysql> update user set money =money-100 where name='a';
    Query OK, 1 row affected (0.00 sec)
    Rows matched: 1 Changed: 1 Warnings: 0

    mysql> update user set money =money+100 where name='b';
    Query OK, 1 row affected (0.00 sec)
    Rows matched: 1 Changed: 1 Warnings: 0

    mysql> commit;
    Query OK, 0 rows affected (0.01 sec)

    mysql> select * from user;
    +----+------+-------+
    | id | name | money |
    +----+------+-------+
    | 1 | a | 800 |
    | 2 | b | 1200 |
    +----+------+-------+
    2 rows in set (0.00 sec)

    mysql> rollback;
    Query OK, 0 rows affected (0.00 sec)

    mysql> select * from user;
    +----+------+-------+
    | id | name | money |
    +----+------+-------+
    | 1 | a | 800 |
    | 2 | b | 1200 |
    +----+------+-------+
    2 rows in set (0.00 sec)

    事务的四大特征:
    A:原子性:事务是最小的单位,不可以再分割
    C:一致性:事务要求,同一事务中的sql语句,必须保证同时成功或者同时失败
    I:隔离性:事务1和事务2之间是具有隔离性的
    D:持久性:事务一旦结束,就不可以返回

    事务开启:
    1.修改默认提交 set autocommit=0;
    2.begin;
    3.start transaction;

    事务手动提交
    commit;

    事务手动回滚
    rollback;


    事务的隔离性:

    + + + + + + + + + + + + + + + + + + + + +
    1.read uncommitted;读未提交的
    2.read committed;都已经提交的
    3.repeatable read;可重复读
    4.serializable;串行化
    +
    1
     
    + +
    1-read uncommitted
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    如果有事务a,事务b,
    a事务对数据进行操作,在操作的过程中,事务没有被提交,但是b可以看见a操作的结果

    bank表 user
    insert into user values(3,'小明',1000);
    insert into user values(4,'淘宝店',1000);
    mysql> select * from user;
    +----+-----------+-------+
    | id | name | money |
    +----+-----------+-------+
    | 1 | a | 800 |
    | 2 | b | 1200 |
    | 3 | 小明 | 1000 |
    | 4 | 淘宝店 | 1000 |
    +----+-----------+-------+
    4 rows in set (0.00 sec)

    如何查看数据库的隔离级别
    MySQL 8.0:
    + + + + + + + + + + + + +
    select @@global.transaction_isolation;系统级别
    select @@transaction_isolation;会话级别
    +
    1
    2
    3
    4
    5
    6
    7
    8
    9
    MySQL默认隔离级别 REPEATABLE-READ
    +--------------------------------+
    | @@global.transaction_isolation |
    +--------------------------------+
    | REPEATABLE-READ |
    +--------------------------------+
    1 row in set (0.00 sec)

    MySQL 5.x:
    + + + + + + + + + + + + +
    select @@global.tx_isolation;系统级别
    select @@tx_isolation;会话级别
    +
    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
     
    如何修改隔离级别
    set global transaction isolation level read uncommitted;
    Query OK, 0 rows affected (0.00 sec)

    mysql> select @@global.transaction_isolation;
    +--------------------------------+
    | @@global.transaction_isolation |
    +--------------------------------+
    | READ-COMMITTED |
    +--------------------------------+
    1 row in set (0.00 sec)

    mysql> set global transaction isolation level read uncommitted;
    Query OK, 0 rows affected (0.00 sec)

    mysql> select @@global.transaction_isolation;
    +--------------------------------+
    | @@global.transaction_isolation |
    +--------------------------------+
    | READ-UNCOMMITTED |
    +--------------------------------+
    1 row in set (0.00 sec)

    转账:小明在淘宝店买鞋子:800
    小明-》成都 ATM
    淘宝店-》广州 ATM

    start transaction;
    update user set money =money-800 where name='小明';
    update user set money =money+800 where name='淘宝店';
    mysql> select * from user;
    +----+-----------+-------+
    | id | name | money |
    +----+-----------+-------+
    | 1 | a | 800 |
    | 2 | b | 1200 |
    | 3 | 小明 | 200 |
    | 4 | 淘宝店 | 1800 |
    +----+-----------+-------+
    4 rows in set (0.00 sec)

    告知淘宝店
    淘宝店在广州查账
    mysql> select * from user;
    +----+-----------+-------+
    | id | name | money |
    +----+-----------+-------+
    | 1 | a | 800 |
    | 2 | b | 1200 |
    | 3 | 小明 | 200 |
    | 4 | 淘宝店 | 1800 |
    +----+-----------+-------+
    4 rows in set (0.00 sec)

    发货
    晚上请女朋友吃饭
    1800

    小明rollback
    mysql> select * from user;
    +----+-----------+-------+
    | id | name | money |
    +----+-----------+-------+
    | 1 | a | 800 |
    | 2 | b | 1200 |
    | 3 | 小明 | 1000 |
    | 4 | 淘宝店 | 1000 |
    +----+-----------+-------+
    4 rows in set (0.00 sec)
    淘宝结账的时候发现钱不够
    mysql> select * from user;
    +----+-----------+-------+
    | id | name | money |
    +----+-----------+-------+
    | 1 | a | 800 |
    | 2 | b | 1200 |
    | 3 | 小明 | 1000 |
    | 4 | 淘宝店 | 1000 |
    +----+-----------+-------+
    4 rows in set (0.00 sec)

    如果两个地方都在进行操作,如果事务a开启之后,他的数据可以被其他事务读取到
    这样就会出现“脏读”
    脏读:一个事务读到了另外一个事务没有提交的数据
    实际开发是不允许脏读出现的

    + +
    2-read committed

    修改隔离级别为 READ-COMMITTED

    +
    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
    set global transaction isolation level read committed;
    select @@global.transaction_isolation;
    +--------------------------------+
    | @@global.transaction_isolation |
    +--------------------------------+
    | READ-COMMITTED |
    +--------------------------------+
    1 row in set (0.00 sec)

    bank 数据库 user

    小张:银行的会计
    start transaction;
    select * from user;
    mysql> select * from user;
    +----+-----------+-------+
    | id | name | money |
    +----+-----------+-------+
    | 1 | a | 800 |
    | 2 | b | 1200 |
    | 3 | 小明 | 1000 |
    | 4 | 淘宝店 | 1000 |
    +----+-----------+-------+
    4 rows in set (0.00 sec)

    小张出去上厕所去。。。

    小王:
    start transaction;
    insert into user values(5,'c',100);
    commit;
    mysql> select * from user;
    +----+-----------+-------+
    | id | name | money |
    +----+-----------+-------+
    | 1 | a | 800 |
    | 2 | b | 1200 |
    | 3 | 小明 | 1000 |
    | 4 | 淘宝店 | 1000 |
    | 5 | c | 100 |
    +----+-----------+-------+
    5 rows in set (0.00 sec)

    小张回来了

    select avg(money) from user;
    +------------+
    | avg(money) |
    +------------+
    | 820.0000 |
    +------------+
    1 row in set (0.00 sec)

    money 的平均值不是1000,变少了。。
    虽然只能读到事务提交的数据,但是还是会出现问题,就是读取同一个表的数据,发现前后不一致。
    不可重复读现象:read committed

    + +
    3-repeatable read
    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
    set global transaction isolation level repeatable read;
    select @@global.transaction_isolation;
    +--------------------------------+
    | @@global.transaction_isolation |
    +--------------------------------+
    | REPEATABLE-READ |
    +--------------------------------+
    1 row in set (0.00 sec)

    在repeatable read 隔离级别下出现什么问题:
    mysql> select * from user;
    +----+-----------+-------+
    | id | name | money |
    +----+-----------+-------+
    | 1 | a | 800 |
    | 2 | b | 1200 |
    | 3 | 小明 | 1000 |
    | 4 | 淘宝店 | 1000 |
    | 5 | c | 100 |
    +----+-----------+-------+
    5 rows in set (0.00 sec)

    张全蛋-成都
    start transaction;

    王尼玛-北京
    start transaction;

    张全蛋-成都
    insert into user values(6,'d',1000);
    + +

    Query OK, 1 row affected (0.00 sec)

    +
    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
     
    mysql> commit;
    Query OK, 0 rows affected (0.02 sec)

    mysql> select * from user;
    +----+-----------+-------+
    | id | name | money |
    +----+-----------+-------+
    | 1 | a | 800 |
    | 2 | b | 1200 |
    | 3 | 小明 | 1000 |
    | 4 | 淘宝店 | 1000 |
    | 5 | c | 100 |
    | 6 | d | 1000 |
    +----+-----------+-------+
    6 rows in set (0.00 sec)

    王尼玛-北京
    mysql> select * from user;
    +----+-----------+-------+
    | id | name | money |
    +----+-----------+-------+
    | 1 | a | 800 |
    | 2 | b | 1200 |
    | 3 | 小明 | 1000 |
    | 4 | 淘宝店 | 1000 |
    | 5 | c | 100 |
    +----+-----------+-------+
    5 rows in set (0.00 sec)

    insert into user values(6,'d',1000);
    mysql> insert into user values(6,'d',1000);
    ERROR 1062 (23000): Duplicate entry '6' for key 'PRIMARY'

    这就现象就叫做幻读!
    两个事务,事务a和事务b同时操作一张表 事务a提交的数据也不能被事务b读到,可能出现幻读

    + +
    4-serializable
    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
     
    修改隔离级别为串行化
    set global transaction isolation level serializable;
    select @@global.transaction_isolation;
    +--------------------------------+
    | @@global.transaction_isolation |
    +--------------------------------+
    | SERIALIZABLE |
    +--------------------------------+
    1 row in set (0.00 sec)


    mysql> select *from user;
    +----+-----------+-------+
    | id | name | money |
    +----+-----------+-------+
    | 1 | a | 800 |
    | 2 | b | 1200 |
    | 3 | 小明 | 1000 |
    | 4 | 淘宝店 | 1000 |
    | 5 | c | 100 |
    | 6 | d | 1000 |
    +----+-----------+-------+
    6 rows in set (0.00 sec)

    张全蛋-成都
    start transaction;

    王尼玛-北京
    start transaction;

    张全蛋-成都
    insert into user values(7,'赵铁柱',1000);
    Query OK, 1 row affected (0.00 sec)

    mysql> commit;
    Query OK, 0 rows affected (0.01 sec)

    mysql> select *from user;
    +----+-----------+-------+
    | id | name | money |
    +----+-----------+-------+
    | 1 | a | 800 |
    | 2 | b | 1200 |
    | 3 | 小明 | 1000 |
    | 4 | 淘宝店 | 1000 |
    | 5 | c | 100 |
    | 6 | d | 1000 |
    | 7 | 赵铁柱 | 1000 |
    +----+-----------+-------+
    7 rows in set (0.00 sec)

    王尼玛-北京
    mysql> select * from user;
    +----+-----------+-------+
    | id | name | money |
    +----+-----------+-------+
    | 1 | a | 800 |
    | 2 | b | 1200 |
    | 3 | 小明 | 1000 |
    | 4 | 淘宝店 | 1000 |
    | 5 | c | 100 |
    | 6 | d | 1000 |
    | 7 | 赵铁柱 | 1000 |
    +----+-----------+-------+
    7 rows in set (0.00 sec)

    张全蛋-成都
    start transaction;
    insert into user values(8,'王小花',1000);

    被卡住了

    user表被另外一个事务操作的时候,其他事务里面的写操作,是不可以进行的
    进入排队状态,直到王尼玛那边事务结束之后,张全蛋的写入才会执行
    前提是在没有等待超时的情况下

    王尼玛-北京
    mysql> commit;
    Query OK, 0 rows affected (0.00 sec)

    张全蛋-成都
    Query OK, 1 row affected (0.00 sec)

    串行化带来的问题:性能很差


    性能:uncommitted>committed>repeatable>serializable;
    隔离级别越高性能越差

    MySQL默认隔离级别是 repeatable
    Author: SHYEE
    Link: http://example.com/2020/04/01/mysql%E7%9A%84%E4%B8%80%E7%82%B9%E4%B8%9C%E8%A5%BF/
    Copyright Notice: All articles in this blog are licensed under CC BY-NC-SA 4.0 unless stating additionally.
    Announcement
    等离子体实验室
    Catalog
    1. 1. mysql的一点东西
      1. 1.1. 增删改查–数据记录常见操作
        1. 1.1.1. –如何在数据库服务器中创建数据库
        2. 1.1.2. –如何查看某个数据库中所有的数据表
        3. 1.1.3. –如何创建一个数据表
        4. 1.1.4. –查看数据表是否创建成功
        5. 1.1.5. –查看创建好的数据表的结构
        6. 1.1.6. –查看表中的记录
        7. 1.1.7. –如何往数据表中添加数据记录
        8. 1.1.8. –再一次查询
        9. 1.1.9. –MySQL常用数据类型有哪些
        10. 1.1.10. –如何往数据库里插入数据
        11. 1.1.11. –如何删除数据
        12. 1.1.12. –如何修改数据
        13. 1.1.13. –数据记录常见操作
      2. 1.2. 建表约束
        1. 1.2.1. –主键约束
          1. 1.2.1.0.1. –联合主键
          2. 1.2.1.0.2. –只要联合的主键值(均不为空)加起来不重复就OK
      3. 1.2.2. –自增约束
        1. 1.2.2.0.1. –auto_increment
        2. 1.2.2.0.2. –如果创建表的时候忘记创建主键约束
        3. 1.2.2.0.3. –修改表结构,添加主键
        4. 1.2.2.0.4. –如何删除
        5. 1.2.2.0.5. –使用modify 修改字段添加约束
    2. 1.2.3. –唯一约束
      1. 1.2.3.0.1. –两个键在一起不重复就OK
      2. 1.2.3.0.2. –如何删除唯一约束
      3. 1.2.3.0.3. –modify添加
  • 1.2.4. –总结
    1. 1.2.4.0.1. –1 建表的时候添加约束
    2. 1.2.4.0.2. –2 alter add
    3. 1.2.4.0.3. –3 alter modify
    4. 1.2.4.0.4. –4 删除 alter drop
  • 1.2.5. –非空约束
    1. 1.2.5.1. –修饰的字段不能为空 NULL
  • 1.2.6. –默认约束
    1. 1.2.6.0.1. –传了值就不会使用默认值
  • 1.2.7. –外键约束
    1. 1.2.7.0.1. –牵扯到两个表:父表、子表
    2. 1.2.7.0.2. –主表、副表
  • 1.2.8. 三大范式
    1. 1.2.8.1. –1.第一范式
  • 1.2.9. –1NF
    1. 1.2.9.0.1. –字段值还可以继续拆分的,不满足第一范式
    2. 1.2.9.0.2. –范式设计的越详细,对于某些实际操作可能更好,但是不一定都是好处
  • 1.2.10. –第二范式
    1. 1.2.10.0.1. –问题
    2. 1.2.10.0.2. –除主键以外的其他列,只依赖于主键的其他部分字段
    3. 1.2.10.0.3. –拆表
    4. 1.2.10.0.4. –分成三个表之后完全依赖 满足第二范式
  • 1.2.11. –第三范式
  • 1.3. 查询练习
  • 1.4. 连接查询
    1. 1.4.0.0.1. 1.inner join查询(内连接)
    2. 1.4.0.0.2. 2.left join(左外连接)
    3. 1.4.0.0.3. 3.right join(右外连接)
  • 1.5. 事务
    1. 1.5.1. 字段提交 @@autocommit=1
    2. 1.5.2. 手动提交 commit
      1. 1.5.2.1. 事务回滚 rollback
        1. 1.5.2.1.1. 手动开启事务(1)
        2. 1.5.2.1.2. 手动开启事务(2)
        3. 1.5.2.1.3. 事务开启之后,一旦提交,回滚(rollback)无效
        4. 1.5.2.1.4. 1-read uncommitted
        5. 1.5.2.1.5. 2-read committed
        6. 1.5.2.1.6. 3-repeatable read
        7. 1.5.2.1.7. 4-serializable
  • Recent Post
    \ No newline at end of file diff --git "a/2020/04/03/3-3\351\234\200\346\261\202\345\210\206\346\236\220\346\241\210\344\276\213/index.html" "b/2020/04/03/3-3\351\234\200\346\261\202\345\210\206\346\236\220\346\241\210\344\276\213/index.html" new file mode 100644 index 0000000..752fee6 --- /dev/null +++ "b/2020/04/03/3-3\351\234\200\346\261\202\345\210\206\346\236\220\346\241\210\344\276\213/index.html" @@ -0,0 +1,206 @@ +需求分析 | SHYEE-PLASMA + + + + + + + + + + + + +

    需求分析

    3-3需求分析案例

    “Android点餐系统”项目案例需求获取资料介绍如下:

    +

    (1)目标和范围

    本软件主要作用是为点餐者提供一套可以在移动设备(手机、平板)上运行的点餐软件。 系统分为前台和后台,前台是点餐者使用的,点餐者可以在移动设备上查看餐馆所有的菜目、价格、简单的菜品介绍以及餐馆的特色菜介绍,同时点餐者还可以查看、取消自己已经挑选的菜品,最后上传订单。后台是管理员使用的,管理员可以在后进行订单管理、用户管理、菜谱管理等。

    +

    (2)系统角色和职责

    系统的使用人群包括两类管理员:系统的维护,订单管理、菜品的增删。

    +

    普通用户:注册账号,点餐、座位预订。

    +

    (3)系统处理功能要求

    查询菜品
    设置菜品
    顾客下单
    订单处理
    数据处理

    +

    (4)系统其他要求

    本系统客户端要求符合大众操作习惯,与网上其他的Android系统App操作方式保持基本一致。餐馆要求每笔订单交易误差不得超过工角,每天交易额的误差不得超过100元。5年内价位在500元以上的Android手机都可以流畅运行该系统。

    +

    第一阶段

    工作的输入是需求定义阶段产生的业务事件列表和报表列表,输出的是领域模型和用例模型。

    +

    针对每个业务事件进行业务流程分析、业务实体分析和用例分析;

    +

    针对每类报表进行业务实体分析和用例分析。

    +

    业务流程分析

    在分析过程中,要注意抓住核心业务和主要活动点、部门内以及部门之间的衔接,工作中的烦琐及反复的环节,成本高、效率低、时间长的环节以及任务转手次数较多的环节。

    +

    “Android点餐系统”中的主要业务就是点餐,我们要围绕点餐的主业务展开分析。

    +

    业务流程分析的过程中的三个关键的要点

    一是理解流程的层次性,其中包含三大层次,有组织级,部门级
    岗位级;

    +

    二是了解流程的类型,包括生产性流程,管理性流程和支持性流
    程;

    +

    三是掌握以业务事件识别、寻找流程的技巧。

    +

    产物

    跨职责流程图
    活动图
    数据流图

    +

    基于Android平台的点餐系统的总体流程包括的步骤有

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10

    (1)顾客在智能手机上登录点餐系统客户端后,自动进入
    菜谱界面,查看菜谱;
    (2)顾客选择菜品进行下单;
    (3)顾客选择菜品数量,若需在餐厅用餐还需选择座位号;
    (4)选择完成并确定后,提交订单;
    (5)订单提交后,订单数据会上传到服务器;
    (6)订单提交后,顾客可以在客户端查看自己的订单情况;
    (7)在管理员未确认订单之前,顾客可以对订单进行修改或取消操作;
    (8)管理员登录点餐系统服务器端,对用户订单进行确认;
    + +

    跨职责流程图的应用

    跨指责流程图绘制要点是在进行业务流程分析时,采用的关键入手点为部门级的业务流程,也就是从业务事件出发,分析该业务事件会触发的一系列活动。要真正保障绘制出来的跨职责流程图是真实、有效的,就必须强化用户的参与。

    +

    我们应先找到业务事件的负责人,然后通过设问的方式,让他描述响应该业务事件所进行的活动,说明活动的执行岗位以及它们之间的关系、数据传递。

    +

    (三)活动图
    活动图是一种表述过程机理、业务过程以及工作流的技术。它可以用来对业务过程、工作流建模,也可以对用例实现甚至是程序实现来建模。
    活动图的主要元素包含初始节点活动终点活动节点转换分支与监护条件分岔汇合等。

    +

    数据流程图

    点餐系统由客户端和服务器端两部分组成,客户端主要负责点菜,服务器端负责信息管理。

    +
    客户端的基本流程
    1
    2
    3
    (1)用户输入正确的登录信息进入系统,若登录信息不对,系统提示重新输入登录系统,直到用户成功登录系统,新用户要先进行注册并注册成功才可以登录系统。
    (2)用户成功登录系统后,可先查看菜品信息,选择菜品及数量,若需在餐馆用餐还需选择座位,完成后进行下单操作。
    (3)用户可以查看自己的订单,在订单未确定的情况下,可以修改或取消订单。
    + +
    服务器端的基本流程
    1
    2
    (1)管理员输入正确的登录信息进入系统,若登录信息不对,系统会提示重新输入登录信息,直到管理员成功登录系统。
    (2)管理员成功进入系统后,可进行各类信息的管理,如菜品信息管理、用户信息管理、订单管理等,其实就是对上述信息进行添加、删除及修改操作。
    + +

    业务实体分析

    要了解这个问题域中有哪些业务实体,它们之间存在什么样的逻辑关系、数量关系,以及有什么相应的结构规则。

    +

    1.业务实体分析任务概述

    “自底向上”

    +

    识别出业务实体
    确定实体间关系
    定义实体关健属性

    +

    业务实体分析的产物有两种可选的模型,包括类图和E/R模型也叫实体关系图。

    +

    2.类图

    根据边界类、控制类、实体类帮助分析系统中的类

    (1)领域建模方法

    +

    领域建模时,其工作主要就是识别标识类、明确类之间的逻辑关系和数量关系以及添加重要的结构规则三个方面。

    +

    (2)建立类之间的关联

    +

    (3)添加类的重要属性

    +
    分析模型中有3种十分有用的构造型即实体类、控制类和边界类。

    实体类:即实体对象的抽象,通常来自域模型也就是现实世界,用来描述具体的实体,通常映射到数据库表格与文件中;

    +

    控制类:即控制对象的抽象,主要用来体现应用程序的执行逻辑,将其抽象出来,可以使得变化不影响用户界面和数据库中的表;

    +

    边界类:即边界对象的抽象,通常是用来完成参与者(用户、外部系统)与系统之间交互的对象,例如From、对话框、菜单、接口等。

    +

    3.E/R图应用基础

    数据建模过程的优势体现在能够更好地与后续的数据库设计
    结合;

    +

    缺点是语义相对于类图来说更弱一些,同时对面向对象开发的指导作用相对差- - .些。

    +

    概念模型是需求人员的视图,等价于现在出镜率很高的领域模型;

    +

    逻辑模型是开发人员(包括设计人员)的视图,它约等于面向对象分析与设计方法中提到的“分析模型”。

    +
    概念模型与逻辑模型具体区别在于两个方面

    完整性:逻辑模型在完整性上要比概念模型更胜筹,通过在需求细化、设计的阶段会对类的属性进行细化,会补充-些新的类;

    +

    加工方式:概念模型的原则是忠于问题域,而逻辑模型则会从实现的便利性和需要的角度进行细化,具体来说可能会对一些类进行分拆、合并。

    +
    Author: SHYEE
    Link: http://example.com/2020/04/03/3-3%E9%9C%80%E6%B1%82%E5%88%86%E6%9E%90%E6%A1%88%E4%BE%8B/
    Copyright Notice: All articles in this blog are licensed under CC BY-NC-SA 4.0 unless stating additionally.
    \ No newline at end of file diff --git a/2020/04/03/Golang/index.html b/2020/04/03/Golang/index.html new file mode 100644 index 0000000..588c3ac --- /dev/null +++ b/2020/04/03/Golang/index.html @@ -0,0 +1,183 @@ +Golang | SHYEE-PLASMA + + + + + + + + + + + + + +

    Golang

    Golang

    下载和安装

    官网下载,next安装。

    +

    在喜欢的磁盘找一个路径放GoPath并添加到系统变量

    +

    在GoPath中创建pkg src bin 路径,并配到环境变量中。

    +

    src存放开发代码,可创建多个域名以及子路径

    +

    开发

    使用VS code 开发下载所需要的 Go 插件。

    +

    使用VsCode打开go\src\域名\子路径(随意)。

    +

    Hello Go

    创建Hello路径,路径中创建main.go

    +

    输入

    +
    1
    2
    3
    4
    5
    6
    7
    package main

    import "fmt"

    func main(){
    fmt.Println("Hello")
    }
    + +

    编译

    使用go build

    +

    1.在项目目录下执行go build

    +

    2.在其他路径下执行go build,需要在后面加上项目的路径(项目路径从GOPATH/Src后开始写起,编译之后的可执行文件就保存在当前目录下)

    +

    3.go build -o hello.exe (更改可执行文件的名称)

    +
    +

    go run类似于执行脚本文件

    +

    go install 先编译后执行

    +

    跨平台编译–自行百度

    +
    Author: SHYEE
    Link: http://example.com/2020/04/03/Golang/
    Copyright Notice: All articles in this blog are licensed under CC BY-NC-SA 4.0 unless stating additionally.
    \ No newline at end of file diff --git "a/2020/04/03/eclipse\345\246\202\344\275\225\351\205\215\347\275\256Spring/QQ\345\233\276\347\211\20720200403114936.png" "b/2020/04/03/eclipse\345\246\202\344\275\225\351\205\215\347\275\256Spring/QQ\345\233\276\347\211\20720200403114936.png" new file mode 100644 index 0000000..96926f2 Binary files /dev/null and "b/2020/04/03/eclipse\345\246\202\344\275\225\351\205\215\347\275\256Spring/QQ\345\233\276\347\211\20720200403114936.png" differ diff --git "a/2020/04/03/eclipse\345\246\202\344\275\225\351\205\215\347\275\256Spring/QQ\345\233\276\347\211\20720200403115141.png" "b/2020/04/03/eclipse\345\246\202\344\275\225\351\205\215\347\275\256Spring/QQ\345\233\276\347\211\20720200403115141.png" new file mode 100644 index 0000000..6f20415 Binary files /dev/null and "b/2020/04/03/eclipse\345\246\202\344\275\225\351\205\215\347\275\256Spring/QQ\345\233\276\347\211\20720200403115141.png" differ diff --git "a/2020/04/03/eclipse\345\246\202\344\275\225\351\205\215\347\275\256Spring/image-20200403115744046.png" "b/2020/04/03/eclipse\345\246\202\344\275\225\351\205\215\347\275\256Spring/image-20200403115744046.png" new file mode 100644 index 0000000..66ab15f Binary files /dev/null and "b/2020/04/03/eclipse\345\246\202\344\275\225\351\205\215\347\275\256Spring/image-20200403115744046.png" differ diff --git "a/2020/04/03/eclipse\345\246\202\344\275\225\351\205\215\347\275\256Spring/image-20200403115951857.png" "b/2020/04/03/eclipse\345\246\202\344\275\225\351\205\215\347\275\256Spring/image-20200403115951857.png" new file mode 100644 index 0000000..51608e9 Binary files /dev/null and "b/2020/04/03/eclipse\345\246\202\344\275\225\351\205\215\347\275\256Spring/image-20200403115951857.png" differ diff --git "a/2020/04/03/eclipse\345\246\202\344\275\225\351\205\215\347\275\256Spring/image-20200403120115875.png" "b/2020/04/03/eclipse\345\246\202\344\275\225\351\205\215\347\275\256Spring/image-20200403120115875.png" new file mode 100644 index 0000000..c32b7e2 Binary files /dev/null and "b/2020/04/03/eclipse\345\246\202\344\275\225\351\205\215\347\275\256Spring/image-20200403120115875.png" differ diff --git "a/2020/04/03/eclipse\345\246\202\344\275\225\351\205\215\347\275\256Spring/image-20200403120449135.png" "b/2020/04/03/eclipse\345\246\202\344\275\225\351\205\215\347\275\256Spring/image-20200403120449135.png" new file mode 100644 index 0000000..4d256c8 Binary files /dev/null and "b/2020/04/03/eclipse\345\246\202\344\275\225\351\205\215\347\275\256Spring/image-20200403120449135.png" differ diff --git "a/2020/04/03/eclipse\345\246\202\344\275\225\351\205\215\347\275\256Spring/image-20200403120750526.png" "b/2020/04/03/eclipse\345\246\202\344\275\225\351\205\215\347\275\256Spring/image-20200403120750526.png" new file mode 100644 index 0000000..247d0bf Binary files /dev/null and "b/2020/04/03/eclipse\345\246\202\344\275\225\351\205\215\347\275\256Spring/image-20200403120750526.png" differ diff --git "a/2020/04/03/eclipse\345\246\202\344\275\225\351\205\215\347\275\256Spring/image-20200403120805859.png" "b/2020/04/03/eclipse\345\246\202\344\275\225\351\205\215\347\275\256Spring/image-20200403120805859.png" new file mode 100644 index 0000000..fe0911f Binary files /dev/null and "b/2020/04/03/eclipse\345\246\202\344\275\225\351\205\215\347\275\256Spring/image-20200403120805859.png" differ diff --git "a/2020/04/03/eclipse\345\246\202\344\275\225\351\205\215\347\275\256Spring/index.html" "b/2020/04/03/eclipse\345\246\202\344\275\225\351\205\215\347\275\256Spring/index.html" new file mode 100644 index 0000000..3968677 --- /dev/null +++ "b/2020/04/03/eclipse\345\246\202\344\275\225\351\205\215\347\275\256Spring/index.html" @@ -0,0 +1,196 @@ +eclipse如何配置Spring | SHYEE-PLASMA + + + + + + + + + + + + +

    eclipse如何配置Spring

    仅限4.12版本以上

    +

    eclipse如何配置Spring

    查看自己的eclipse版本号

    + +

    help里找到About eclipse IDE

    +

    我这里版本号是4.14

    + + +

    去官网的仓库

    https://github.com/spring-projects/toolsuite-distribution/wiki/Spring-Tool-Suite-3

    + + +

    官方提供的历史版本最早的到了4.12

    +

    如果版本过低建议更新eclipse。

    +

    找自己的对应的版本号

    以 Latest STS3 Downloads 为例

    +

    注意用仓库下载不是这些连接

    + + +

    而是这一些

    + + +

    复制4.14的对应地址

    +

    https://download.springsource.com/release/TOOLS/update/3.9.12.RELEASE/e4.14/

    +

    打开eclipse

    找到Install new software–add

    + + +

    名字随便取 比如Springtool

    +

    location 填地址

    + + +

    点Add

    + + +

    然后全选–next–agree–等待就行

    +
    Author: SHYEE
    Link: http://example.com/2020/04/03/eclipse%E5%A6%82%E4%BD%95%E9%85%8D%E7%BD%AESpring/
    Copyright Notice: All articles in this blog are licensed under CC BY-NC-SA 4.0 unless stating additionally.
    \ No newline at end of file diff --git "a/2020/04/03/mybatis/MyBatis-\345\205\253/index.html" "b/2020/04/03/mybatis/MyBatis-\345\205\253/index.html" new file mode 100644 index 0000000..77f3633 --- /dev/null +++ "b/2020/04/03/mybatis/MyBatis-\345\205\253/index.html" @@ -0,0 +1,210 @@ +MyBatis(八) | SHYEE-PLASMA + + + + + + + + + + + +

    MyBatis(八)

    mybatis 缓存

    + +

    查询缓存

    一级缓存:同一个SqlSession对象

    image-20200331082951809

    +

    MyBatis默认开启一级缓存,如果用同样的SqlSession对象查询相同的数据,则只会在第一次查询时向数据库发送SQL语句,并将查询的结果放入到SQLSESSION中(作为缓存在) ;后续再次查询该同样的对象时则直接从缓存中查询该对象即可(即省略了数据库的访问)。

    +

    二级缓存

    +

    Mybatis自带二级缓存: [同一个namespace]生成的mapper对象

    +

    MyBati s默认情况没有开启二级缓存,需要手工打开。

    +

    conf.xml中

    +
    1
    2
    <!-- 开启二级缓存 -->
    <setting name="cacheEnable" value="true"/>
    + +

    mapper中

    +
    1
    2
    <!-- 声明此namespace开启二级缓存 -->
    <cache/>
    + +

    异常提示:NotSerializableException可知,MyBatis的二级缓存是将对象放入硬盘文件中

    +

    序列化:内存->硬盘

    +

    反序列化:硬盘->内存

    +

    准备缓存的对象,必须实现了序列化接口( 如果开启的缓存Namespace="top.eshyee.mapper.StudentMapper" 可知序列化对象为Student,因此需要将Student序列化(序 列化Student类,以及Student的级联属性、和父类)

    +

    触发将对象写入二级缓存的时机: SqlSession对象的close()方法

    +

    回顾: namespace的值 就是接口的全类名(包名.类名) ,通过接口可以产生代理对象(Mapper对象)

    +

    –>namespace决定了Mapper对象的产生

    +

    结论:只要产生的xxxMapper对象来自于同一个namespace,则这些对象共享二级缓存。

    +

    如果是同一个SqISession对象进行多次相同的查询,则直接进入一级缓存查询;

    +

    image-20200331084348373

    +

    如果不是同一个SqISession对象进行多次相同的查询(但是均来自同一个namespace)则进入二级缓存查询

    +

    如果一个namespace, 如果有多个xxMapper. xml的namespace值相同, 则通过这些xxxMapper. xml产生的xxMapper,仍然共享二级缓存。

    +

    禁用:

    +

    在需要禁用的select标签中的usecache属性改为false

    +

    清理:与清理一级缓存的方法相同,一般执行增删改时会清理掉缓存 ,设计的原因是为了防止脏数据

    +

    commit();

    +

    commit会清理一级和二级缓存;但是清理二级缓存时,不能是查询自身的commit()

    +

    改标签

    +

    在select标签中设置flushCache= "true"

    +

    命中率:
    1 :0% 0.0

    +

    2:50% 0.5

    +

    3:2/3 0.666

    +

    4:3/4 0.75

    +

    三方提供的二级缓存:

    +

    ehicache、memcache

    +

    要想整合三方提供的二级缓存(或者自定义二级缓存) ,必须实现org.apache.ibatis.cache.Cache接口,该接口的默认实现类是PerpetualCache

    +

    整合ehcache二级缓存:

    +

    Ehcache-core.jar
    mybatis- Ehcache.jar
    slf4j-api.jar

    +

    编写ehcache配置文件Ehcache.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
    <ehcache xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:noNamespaceSchemaLocation="ehcache.xsd" updateCheck="true"
    monitoring="autodetect" dynamicConfig="true">
    <!-- 当二级缓存的对象超过内存限制时(缓存对象的个数>maxElements InMemory
    ),存放入的硬盘路径 -->
    <diskStore path="D:\Ehcache" />
    <!-- maxElementsInMemory:设置在内存中缓存对象的个数
    maxElementsOnDisk:设置在硬盘中缓存对象的个数
    eternal: 设置缓存是否永远不过期
    overflowToDisk:当内存中缓存的对象个数超过maxElementsInMemory的时候,是否转移到硬盘中
    timeToIdleSeconds:当2次访问超过该值的时候,将缓存对象失效
    timeToliveSeconds:一个缓存对象最多存放的时间(生命周期)
    diskExpiryThreadIntervalSeconds:设置每隔多长时间,通过一个线程来清理硬盘中的缓存
    memoryStioreEvictionPolicy: 当超过缓存对象的最大值时,处理的策略 LRU,FIFO,LFU
    -->

    <defaultCache

    maxElementsInMemory="1000"
    maxElementsOnDisk="1000000"
    eternal="false"
    overflowToDisk="false"
    timeToIdleSeconds="100"
    timeToLiveSeconds="100"
    diskExpiryThreadIntervalSeconds="120"
    memoryStoreEvictionPolicy="LRU">
    </defaultCache>

    </ehcache>
    + +

    配置mapper

    +
    1
    2
    3
    4
    <cache type= "org.mybatis.caches.ehcache.EhcacheCache">
    <property name= "maxELementsInMemory" value= "2000" />
    可以覆盖掉默认值
    </cache>
    + +
    Author: SHYEE
    Link: http://example.com/2020/04/03/mybatis/MyBatis-%E5%85%AB/
    Copyright Notice: All articles in this blog are licensed under CC BY-NC-SA 4.0 unless stating additionally.
    \ No newline at end of file diff --git a/2020/04/11/Queue/index.html b/2020/04/11/Queue/index.html new file mode 100644 index 0000000..f6a22a0 --- /dev/null +++ b/2020/04/11/Queue/index.html @@ -0,0 +1,172 @@ +Queue | SHYEE-PLASMA + + + + + + + + + + + + + +

    Queue

    队列(Queue)是只允许在一端进行插入,在另一端删除的线性表。

    +

    队列的实现

    +
    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
    typedef struct {	//定义队列中元素最大个数
    int data[MaxSize]; //用静态数组存放队列元素
    int front, rear; //队头指针和队尾指针
    } SqQueue;

    void testQuene(){
    SqQuene Q;
    }
    //初始化队列
    void InitQueue(SqQueue &Q) {
    //初始时队头.队尾指针指向0
    Q.rear=Q.front=0;
    }
    //判断队列是否为空
    bool QueueEmpty (SqQueue Q){
    if(Q.rear==Q.front) //队空条件
    return true ;
    else
    return false;
    }
    //入队操作--只能从队尾插入

    #define MaxSize 10
    //定义队列中元素的最大个数
    typedef struct{
    ElemType data [MaxSize];
    //用静态数组存放队列元素
    int front, rear;
    //队头指针和队尾指针
    } SqQueue;

    //入队
    bool EnQueue(SqQueue &Q, ElemType x){
    if((Q.rear+1)%MaxSize==Q.front)
    return false; //队满则报错
    Q.data [Q.rear]=x;
    //将x插入队尾
    Q.rear=(Q.rear+1)%MaxSize;//区域运算形成循环队列
    //队尾指针后移
    return true ;
    }

    //出队(删除一个队头元素,并用x返回)
    bool DeQueue(SqQueue &Q, ElemType &x){
    if(Q.rear==Q.front)
    //判断队空
    return false; //队空则报错
    x=Q.data [Q.front];
    Q.front=(Q.front+1 )%MaxSize;
    return true;
    }

    + +

    队列已满的条件:队尾指针
    的再下一个位置是队头,即
    (Q.rear+ 1)%MaxSize==Q.front

    +

    队空条件:
    Q.rear= =Q.front

    +

    不浪费最后一个存储区域的做法,设置一个int队列长度,或者设置一个tag,当删除操作的时候tag=1,插入的时候为0,当rear==front&&tag==1时为空。

    +
    Author: SHYEE
    Link: http://example.com/2020/04/11/Queue/
    Copyright Notice: All articles in this blog are licensed under CC BY-NC-SA 4.0 unless stating additionally.
    \ No newline at end of file diff --git a/2020/04/11/Redis/index.html b/2020/04/11/Redis/index.html new file mode 100644 index 0000000..1f54dfd --- /dev/null +++ b/2020/04/11/Redis/index.html @@ -0,0 +1,358 @@ +Redis | SHYEE-PLASMA + + + + + + + + + + + + + + +

    Redis

    Redis

    Nosql

    not only sql 泛指非关系型数据库

    +

    Nosql的四大分类

    KV键值对

    +

    redis

    +

    文档型数据库(boson格式)

    +
      +
    • MongoDB
      MongoDB是一个基于分布式文件存储的数据库,C++编写,主要用来处理大量的文档!

      +

      MongoDB是一个介于关系型数据库和非关系型数据中间的产品

      +
    • +
    • conchDB

      +
    • +
    +

    列存储数据库

    +

    HBase

    +

    分布式文件系统

    +

    图关系型数据库

    +

    NEO4J

    +

    redis

    用途

    1、内存存储、持久化,内存中是断电即失、所以说持久化很重要( rdb、aof )

    +

    2、效率高,可以用于高速缓存

    +

    3、发布订阅系统

    +

    4、地图信息分析

    +

    5、计时器、计数器(浏览量)

    +

    安装

    Windows

    下包 安装 运行

    +

    Linux

    1、官网下载压缩包

    +

    2、解压安装包

    +

    tar -zxvf redis-6.0.10.tar.gz

    +

    image-20210116132318923

    +

    基本文件结构如下

    +

    image-20210116132421492

    +

    安装gcc:yum install gcc-c++

    +

    在当前路径下make

    +

    完成后再make检查一下

    +
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    [root@Shyee redis-6.0.10]# make
    cd src && make all
    make[1]: Entering directory '/usr/local/redis-6.0.10/src'
    CC Makefile.dep

    Hint: It's a good idea to run 'make test' ;)

    make[1]: Leaving directory '/usr/local/redis-6.0.10/src'
    [root@Shyee redis-6.0.10]# make install
    cd src && make install
    make[1]: Entering directory '/usr/local/redis-6.0.10/src'

    Hint: It's a good idea to run 'make test' ;)

    INSTALL install
    INSTALL install
    INSTALL install
    INSTALL install
    INSTALL install
    make[1]: Leaving directory '/usr/local/redis-6.0.10/src'
    [root@Shyee redis-6.0.10]#
    + +

    redis的默认安装路径

    user/local/bin

    +

    简单的配置

    将redis文件夹下的redis.configcopy到local/bin中的rconfig文件夹(自行创建)中

    +

    设置后台启动

    修改config文件中的 daemonize no,改为yes

    +

    启动

    user/local/bin下,redis-server rconfig/redis.conf

    +
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    [root@Shyee bin]# redis-server rconfig/redis.conf 
    [root@Shyee bin]# redis-cli -p 6379/6235
    127.0.0.1:6379> ping
    PONG
    127.0.0.1:6379> set name Shyee
    OK
    127.0.0.1:6379> get name
    "Shyee"
    127.0.0.1:6379> keys *
    1) "name"
    127.0.0.1:6379>
    + +

    如果启动不成功,则在刚刚make之后在去src中make install 一下

    +

    关闭

    1
    2
    127.0.0.1:6379> SHUTDOWN
    not connected> exit
    + +

    查看redis服务是否启动

    1
    2
    3
    4
    [root@Shyee ~]# ps -ef|grep redis
    root 216409 1 0 15:49 ? 00:00:00 redis-server 127.0.0.1:6379
    root 216414 216382 0 15:49 pts/1 00:00:00 redis-cli -p 6379
    root 216443 216421 0 15:50 pts/2 00:00:00 grep --color=auto redis
    + +

    benchmark 测试

    redis 性能测试工具可选参数如下所示:

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    序号选项描述默认值
    1-h指定服务器主机名127.0.0.1
    2-p指定服务器端口6379
    3-s指定服务器 socket
    4-c指定并发连接数50
    5-n指定请求数10000
    6-d以字节的形式指定 SET/GET 值的数据大小2
    7-k1=keep alive 0=reconnect1
    8-rSET/GET/INCR 使用随机 key, SADD 使用随机值
    9-P通过管道传输 请求1
    10-q强制退出 redis。仅显示 query/sec 值
    11–csv以 CSV 格式输出
    12-l生成循环,永久执行测试
    13-t仅运行以逗号分隔的测试命令列表。
    14-IIdle 模式。仅打开 N 个 idle 连接并等待。
    +

    测试100个并发链接 100000个请求

    +
    1
    redis-benchmark -h localhost -p 6379 -c 100 -n 100000
    + +

    部分分析

    +

    image-20210221163231907

    +

    基础知识

    redis 默认有16个数据库

    +
    1
    2
    3
    4
    127.0.0.1:6379> SELECT 3 --选择第三个数据库
    OK
    127.0.0.1:6379[3]> DBSIZE --查看数据库大小
    (integer) 0
    + +

    set一个kv后

    +
    1
    2
    3
    4
    127.0.0.1:6379[3]> SET name Shyee
    OK
    127.0.0.1:6379[3]> DBSIZE
    (integer) 1
    + +

    查看所有的key

    +
    1
    2
    127.0.0.1:6379[3]> KEYS *
    1) "name"
    + +

    清空当前库

    +
    1
    2
    3
    4
    127.0.0.1:6379[3]> FLUSHDB
    OK
    127.0.0.1:6379[3]> KEYS *
    (empty array)
    + +

    清空全部数据库

    +
    1
    flushall
    + +

    redis 是单线程的

    基于内存操作的 redis 的瓶颈是机器内存及网络带宽。

    +

    redis是c语言写的

    +

    redis 将所有的数据放在内存中的,所以使用单线程操作时效率最高的。对于内存,没有上下文切换,效率是最高的,多次读写实在一个cpu上的。

    +

    redis 的基本数据类型

    基本命令

    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
    127.0.0.1:6379> set name Shyee 
    OK
    127.0.0.1:6379> SET age 12
    OK
    127.0.0.1:6379> EXISTS name #查看是否存在关键字
    (integer) 1
    127.0.0.1:6379> EXPIRE name 10 #设置过期时间
    (integer) 1
    127.0.0.1:6379> ttl name #查看当前k的剩余时间
    (integer) 6
    127.0.0.1:6379> ttl name
    (integer) 4
    127.0.0.1:6379> ttl name
    (integer) 2
    127.0.0.1:6379> ttl name
    (integer) 0
    127.0.0.1:6379> ttl name #-2代表已经过期
    (integer) -2
    127.0.0.1:6379> get name
    (nil)
    127.0.0.1:6379> move name 1 #将该关键字转移到1号库
    (integer) 1
    127.0.0.1:6379> type name #查看当前k的类型
    string
    127.0.0.1:6379> TYPE age
    string
    + +

    String(字符串)

    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
    127.0.0.1:6379> APPEND name " Hello" #字符串的拼接,如果当前key不存在,就相当于set
    (integer) 11
    127.0.0.1:6379> GET name
    "Shyee Hello"
    127.0.0.1:6379> STRLEN name #查看当前字符串的长度
    (integer) 11

    #设计自增减
    127.0.0.1:6379> set views 0
    OK
    127.0.0.1:6379> GET views
    "0"
    127.0.0.1:6379> INCR views #自增
    (integer) 1
    127.0.0.1:6379> GET views
    "1"
    127.0.0.1:6379> DECR views #自减
    (integer) 0
    127.0.0.1:6379> GET views
    "0"
    127.0.0.1:6379> INCRBY views 10 #设置步长的增减
    (integer) 10
    127.0.0.1:6379> DECRBY views 8
    (integer) 2
    127.0.0.1:6379> GET views
    "2"
    #截取
    127.0.0.1:6379> get name
    "Shyee Hello"
    127.0.0.1:6379> GETRANGE name 2 5 #截取2~5
    "yee "
    127.0.0.1:6379> GETRANGE name 0 -1 #查看全部
    "Shyee Hello"
    #setrange
    127.0.0.1:6379> set k1 abcdefg
    OK
    127.0.0.1:6379> SETRANGE k1 2 ggg #修改第二个以后的三个字符
    (integer) 7
    127.0.0.1:6379> GET k1
    "abgggfg"

    #setex(set with expire) 设置过期时间
    #setnx(set if not exist) 不存在设置
    127.0.0.1:6379> SETEX k2 5 "只有5秒"
    OK
    127.0.0.1:6379> ttl k2
    (integer) 3
    127.0.0.1:6379> SETNX k2 "ifexist"
    (integer) 1
    127.0.0.1:6379> SETNX k2 "ife"
    (integer) 0 #SET 失败,因为存在了
    #一下设置很多值
    127.0.0.1:6379> mset k1 v1 k2 v2 k3 v3 k4 v4
    OK
    127.0.0.1:6379> KEYS *
    1) "k4"
    2) "k3"
    3) "k2"
    4) "k1"
    #一下拿很多值
    127.0.0.1:6379> MGET k1 k2 k3 k4
    1) "v1"
    2) "v2"
    3) "v3"
    4) "v4"
    127.0.0.1:6379> MSETNX k1 vv1 k5 v5
    (integer) 0 #mset是原子性的操作,要么一起成功,要么一起失败
    #对象的批量set
    127.0.0.1:6379> MSET user:1:name Shyee user:1:age 13 user:3:name XY
    OK
    127.0.0.1:6379> MGET user:3:name user:1:name user:1:age
    1) "XY"
    2) "Shyee"
    3) "13"
    #取值并设置值
    127.0.0.1:6379> getset name XY #如果不存在 则返回nil
    (nil)
    127.0.0.1:6379> GETSET name Shyee
    "XY"
    127.0.0.1:6379> GET name
    "Shyee"
    + +

    List

    redis中的list是双向链表

    +
    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
    127.0.0.1:6379> lpush list1 abcd
    (integer) 1
    127.0.0.1:6379> rpush list1 aaa
    (integer) 2
    127.0.0.1:6379> get list1
    (error) WRONGTYPE Operation against a key holding the wrong kind of value
    #不能直接使用get来取list中的值
    127.0.0.1:6379> lrange list1 0 5
    1) "abcd"
    2) "aaa"
    127.0.0.1:6379> lpush list1 a b c d e
    (integer) 7
    127.0.0.1:6379> lrange list1 0 -1
    1) "e"
    2) "d"
    3) "c"
    4) "b"
    5) "a"
    6) "abcd"
    7) "aaa"
    127.0.0.1:6379> rrange 0 -1
    (error) ERR unknown command `rrange`, with args beginning with: `0`, `-1`,
    127.0.0.1:6379> rpop list1 2
    1) "aaa"
    2) "abcd"
    127.0.0.1:6379> lrange list1 0 -1
    1) "e"
    2) "d"
    3) "c"
    4) "b"
    5) "a"
    127.0.0.1:6379> rpush o p q r s t
    (integer) 5
    127.0.0.1:6379> lrange list1 0 -1
    1) "e"
    2) "d"
    3) "c"
    4) "b"
    5) "a"
    127.0.0.1:6379> rpush list1 o p q r s t
    (integer) 11
    127.0.0.1:6379> lrange list1 0 -1
    1) "e"
    2) "d"
    3) "c"
    4) "b"
    5) "a"
    6) "o"
    7) "p"
    8) "q"
    9) "r"
    10) "s"
    11) "t"
    127.0.0.1:6379> lpop list1 5
    1) "e"
    2) "d"
    3) "c"
    4) "b"
    5) "a"
    127.0.0.1:6379> lrange list1 0 -1
    1) "o"
    2) "p"
    3) "q"
    4) "r"
    5) "s"
    6) "t"
    #pop到最后没值了,键就不存在了
    + +

    rpoplpush :从key1 的右边pop一个值放到key2的左边

    +
    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
    127.0.0.1:6379> lrange list1 0 -1
    1) "o"
    2) "p"
    3) "q"
    4) "r"
    5) "s"
    6) "t"
    127.0.0.1:6379> lpush list2 a
    (integer) 1
    127.0.0.1:6379> lrange list2 0 -1
    1) "a"
    127.0.0.1:6379> rpush list2 b c d
    (integer) 4
    127.0.0.1:6379> lrange list2 0 -1
    1) "a"
    2) "b"
    3) "c"
    4) "d"
    127.0.0.1:6379> rpoplpush list1 list2
    "t"
    127.0.0.1:6379> lrange list2 0 -1
    1) "t"
    2) "a"
    3) "b"
    4) "c"
    5) "d"
    127.0.0.1:6379> lrange list1 0 -1
    1) "o"
    2) "p"
    3) "q"
    4) "r"
    5) "s"
    + +

    取指定下标元素

    +
    1
    2
    127.0.0.1:6379> lindex list1 4
    "s"
    + +

    获取list长度

    +
    1
    2
    127.0.0.1:6379> llen list1
    (integer) 5
    + +

    linsert

    +
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    127.0.0.1:6379> linsert list1 before "p" ddd
    (integer) 6
    127.0.0.1:6379> lrange list1 0 -1
    1) "o"
    2) "ddd"
    3) "p"
    4) "q"
    5) "r"
    6) "s"
    127.0.0.1:6379> linsert list1 after "p" aaa
    (integer) 7
    127.0.0.1:6379> lrange list1 0 -1
    1) "o"
    2) "ddd"
    3) "p"
    4) "aaa"
    5) "q"
    6) "r"
    7) "s"
    + +

    lrem key n value

    +

    从左边删除n个value

    +
    1
    2
    3
    4
    5
    6
    7
    8
    9
    127.0.0.1:6379> lrem list1 2 "aaa"
    (integer) 1
    127.0.0.1:6379> lrange list1 0 -1
    1) "o"
    2) "ddd"
    3) "p"
    4) "q"
    5) "r"
    6) "s"
    + +

    lset 替换

    +
    1
    2
    3
    4
    5
    6
    7
    8
    9
    127.0.0.1:6379> lset list1 4 qwerewr
    OK
    127.0.0.1:6379> lrange list1 0 -1
    1) "o"
    2) "ddd"
    3) "p"
    4) "q"
    5) "qwerewr"
    6) "s"
    + +

    list 的数据结构

    list的数据结构是quicklist

    +

    当列表中元素较少的时候会使用一块连续的存储空间,这个结构是ziplist,压缩列表

    +

    当数据量比较多的时候才会使用quicklist ,是一种双向链表

    +

    且redis 将ziplist组合起来组成quicklist

    +
    Author: SHYEE
    Link: http://example.com/2020/04/11/Redis/
    Copyright Notice: All articles in this blog are licensed under CC BY-NC-SA 4.0 unless stating additionally.
    \ No newline at end of file diff --git "a/2020/04/22/Spring\346\263\250\350\247\243\345\274\200\345\217\221/index.html" "b/2020/04/22/Spring\346\263\250\350\247\243\345\274\200\345\217\221/index.html" new file mode 100644 index 0000000..f78f29a --- /dev/null +++ "b/2020/04/22/Spring\346\263\250\350\247\243\345\274\200\345\217\221/index.html" @@ -0,0 +1,283 @@ +Spring注解开发 | SHYEE-PLASMA + + + + + + + + + + + + +

    Spring注解开发

    Bean的作用域

    +

    作用域

    singleton

    +

    单例(默认值), 在每个SpringIOC容器中,一个bean定义对应一个对象实例

    +

    prototype

    +

    一个bean定义对应多个对象实例

    +

    request

    +

    在一次HTTP请求中,一个bean定义对应一个实例,即每次HTTP请求将会有各自的bean实例,它们依据某个bean定义创建而成。该作用域仅在基于Web的Spring ApplicationContext的情况下有效。

    +

    session

    +

    在一个HTTP Session 中,一个bean定义对应一个实例。该作用域仅在基于Web 的SpringApplicationContext的情况下有效

    +

    global session

    +

    在一个全局的HTTP Session中,一个bean定义对应一个实例。典型情况下,仅在使用portlet context的时候有效。该作用域仅在基于Web的Spring ApplicationContext的情况下有效

    +
    +

    注解形式

    +
    1
    @Bean ("stu")
    + +

    配置文件形式

    +
    1
    2
    3
    4
    5
    6
    7
    8
    <bean id="student" class=" com.ehshyee.entity.Student">
    value :简单类型
    <property name="stuNo"value="1"></property>
    <property name="stuName" value="张三"></property>
    <property name="stuAge" value="23"></ property>
    ref:其他类型
    <property name="address" ref="myaddress"></property>
    </bean>
    + +

    分别对其获取两个学生 查看是否为同一个

    +
    1
    2
    3
    Student stul = (Student) context.getBean(S:"student") ;
    Student stu2 = (Student) context.getBean(S:"student") ;
    System.out.println(stul =stu2) ;
    + +

    均返回true

    +

    在xml中scope默认是singleton 可改为prototype

    +
    1
    <bean id="student" class=" top.ehshyee.entity.Student" scope="prototype">
    + +

    改后返回false

    +

    注解中添加

    +
    1
    @scope("prototype")//默认singleton
    + +

    对于实例产生的时机

    +

    一些测试

    +
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    public Student() {
    System.out.println("student无参构造") ;
    }
    public Student(int stuNo, String stuName, int stuAge) {
    super();
    this.stuNo = stuNo;
    this.stuName = stuName;
    this.stuAge = stuAge;
    //有参构造
    }
    + + +

    singleton | prototype

    +

    执行时机(产生bean的时机) :

    +

    default)singleton:容器在初始化时,就会创建对象(唯一的一个);以后再getBean时,不再产生新的bean.singleton也支持延迟加载(懒加载) :在第一次使用时产生。

    +

    prototype:容器在初始化时,不创建对象;只是在每次使用时(每次从容器获取对象时,context.getBean(Xxxx)),再创建对象,并且,每次getBean()都会创建一个新的对象。

    +

    延迟加载(注解形式)

    +
    1
    @lazy
    + +

    条件注解 –>SpringBoot

    可以让某一个Bean在某些条件下加入Ioc容器,其他情况下不加IoC容器。

    +

    a.准备bean

    +
    1
    2
    3
    4
    5
    6
    7
    public interface Car {

    }
    public class EnegerCar implements Car {
    }
    public class OilCar implements Car{
    }
    + +

    b.增加条件Bean:给每个Bean设置条件,必须实现Condition接口

    +
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    public class OilCarCondition implements Condition {
    @Override
    public boolean matches(ConditionContext conditionContext, AnnotatedTypeMetadata annotatedTypeMetadata) {
    //如果当前环境的车类型是Oil,则加入OilCar
    //获取环境
    Environment environment=conditionContext.getEnvironment();
    String carType=environment.getProperty("car.type");

    return carType.contains("oil");
    }
    }
    public class EnergyCarCondition implements Condition {
    @Override
    public boolean matches(ConditionContext conditionContext, AnnotatedTypeMetadata annotatedTypeMetadata) {
    //如果当前环境的车类型是energy,则加入energyCar
    //获取环境
    Environment environment = conditionContext.getEnvironment();
    String carType = environment.getProperty("car.type");

    return carType.contains("energy");
    }
    }
    + +

    c.根据条件加入IOC容器

    +
    1
    2
    3
    4
    5
    6
    7
    8
    @Bean
    @Conditional (OilCarCondition.class)
    public Car oilCar ()
    {return new oilCar()}
    @Bean
    @Conditional (EnergyCarCondition.class)
    public Car energyCar ()
    {return new EnergyCar ()}
    + +

    测试

    +

    在VM option中添加参数为oil-Dcar.type=oil

    +
    1
    2
    3
    4
    5
    6
    7
    public static void testAnnotation {
    //注解方式
    ApplicationContext context = new AnnotationConfigApplicationContext (MyConfig.class);
    String[] beanDefinitionNames = context.getBeanDefinitionNames();
    for (String name : beanDefinitionNames) {
    System.out.println(name) ;
    }}
    + +

    给IoC加入Bean的方法

    注解:

    +

    ​ 三层组件: 扫描器+三层注解

    +

    ​ 非三层组件@Confiquration:

    +
      +
    1. @Bean+返回值
    2. +
    3. @import
    4. +
    5. FactoryBean(工厂 Bean)
    6. +
    +

    @import使用:

    ①直接编写到@Import中

    +
    1
    2
    3
    @Confiquration
    @Import ( {Apple.class, Banana.class} )
    //bean是id 是全类名
    + +

    ②自定义ImportSelector接口的实现类,通过selectimports方法实现,方法的返回值就是要纳入IoC容器的Bean),并告知系统自己编写的实现类。

    +
    1
    2
    3
    4
    5
    6
    public class MyImportSelector implements ImportSelector {
    @Override
    public String[] selectImports (AnnotationMetadata importingClassMetadata) {
    //return new string[0] ;//返回值就是要加入IOC容器的bean的全类名
    return new String[]{ "top.eshyee.entity.Apple", "top.eshyee.entity.Banana"}
    }
    + +
    1
    @Import(Orage.class,MyImportSelector.class)
    + +

    ③编写ImportBeanDefinitionRegistrar接口的实现类,重写方法

    +
    1
    2
    3
    4
    5
    6
    7
    8
    public class MyImportBeanDefinitionRegistrar implements ImportBeanDefinitionRegistrar{
    @Override
    public void registerBeanDefinitions(AnnotationMetadata importingClassMetadata, BeanDefinitionRegistry registry) {
    BeanDefinition beanDefinition new RootBeanDefinition(Orange.class) ;
    // or BeanDefinition beanDefinition new RootBeanDefinition("top.eshyee.entity.Orange") ;
    registry.registerBeanDefinition("myorange",beanDefinition);
    }
    }
    + +
    1
    @Import(MyImportBeanDefinitionRegistrar)
    + +

    FactoryBean(工厂 Bean)

    写注册类

    +
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    public class MyEactoryBean implements FactoryBean
    {
    @Override
    public Object getobject() throws Exception {

    return new Apple;
    }
    @Override
    public Class<?> getobjectType() {
    return Apple.class ;
    }
    @Override
    public boolean isSingleton() {
    return true;
    }
    }
    + +

    bean中实现

    +
    1
    2
    3
    4
    @Bean
    public FactoryBean<Apple> myFactoryBean() {
    return new MyFactoryBean() ;
    }
    + +

    拿myFactoryBean中的值

    +
    1
    2
    3
    4
    object obj (context. getBean( "myFactoryBean") );
    System.out.println(obj) ;
    object obj (context. getBean( "&myFactoryBean") );
    System.out.println(obj) ;
    + +

    &:不加&获取的是最内部真实的Apple;

    +

    Bean的生命周期

    创建(new …)、 初始化(赋初值)、….销毁(servlet)

    +

    方法一:

    +

    init destroy

    +

    xml :

    +
    1
    <bean id="StudentDao" class="top.eshyee.dao.impl.StudentDaoImpl" init-method="" destroy-method=""></bean>
    + +

    注解:

    +
    1
    @Bean(value="stu", initMethod ="myInit", destroyMethod="myDestroy")
    + +

    IoC容器在初始化时,会自动创建对象(构造方法) ->init ->…..-> 当容器关闭时调用destroy..

    +

    方法二:

    +

    三层组件: 扫描器+三层注解(功能性注解+MyIntToStringConverter. java转换器)@Controller、@Service、@Repository、@Component

    +

    JAVA规范:JSR250

    +

    @PostConstruct:相当于方法一的init

    +

    @PreDestroy:相当于方法- - 的destroy

    +

    1.将响应组件加入@Component注解、给初始化方法加@PostConstruct、给销毁方法加@PreDestroy

    +

    如果要获取@Component注解中的bean,那么该Bean的名字就是@Component (value= “xxx”)的value值

    +

    调用

    +
    1
    MyIntToStringConverter converter= (MyIntToStringConverter) context.getBean
    + +

    方法三:

    +

    双接口

    +

    三层组件

    +

    InitializingBean初始化
    DisposableBean销毁

    +

    初始化:只需要实现InitializingBean中 的afterPropertiesSet()方法

    +

    销毁:实现DisposableBean 中的destroy()方法

    +

    +

    如果是注解形式,随便写一个方法,然后加上相应注解即可

    +

    如果是接口形式,必须实现接口中规定的方法

    +

    方法四:

    +

    三层组件

    +

    单接口:

    +

    接口BeanPostProcessor:拦截了所有容器中的Bean

    +
    Author: SHYEE
    Link: http://example.com/2020/04/22/Spring%E6%B3%A8%E8%A7%A3%E5%BC%80%E5%8F%91/
    Copyright Notice: All articles in this blog are licensed under CC BY-NC-SA 4.0 unless stating additionally.
    \ No newline at end of file diff --git "a/2021/01/18/Spring \345\205\245\351\227\250/index.html" "b/2021/01/18/Spring \345\205\245\351\227\250/index.html" new file mode 100644 index 0000000..544ed49 --- /dev/null +++ "b/2021/01/18/Spring \345\205\245\351\227\250/index.html" @@ -0,0 +1,383 @@ +Spring 入门 | SHYEE-PLASMA + + + + + + + + + + + + + + + +

    Spring 入门

    Spring 入门

    简单工厂

    实例:学生学习课程

    +

    创建课程工厂、课程接口

    +
    1
    2
    3
    4
    5
    6
    package top.eshyee.newinstance;
    //课程接口
    public interface ICourse {

    public void learn() ;
    }
    + +
    1
    2
    3
    4
    5
    6
    7
    8
    package top.eshyee.newinstance;

    public class JavaCourse implements ICourse{
    @Override
    public void learn() {
    System.out.println("java课程");
    }
    }
    + +
    1
    2
    3
    4
    5
    6
    7
    8
    9
    package top.eshyee.newinstance;

    public class HtmlCourse implements ICourse{

    @Override
    public void learn() {
    System.out.println("html课程");
    }
    }
    + +

    课程工厂

    +
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    package top.shyee.factory;
    import top.eshyee.newinstance.HtmlCourse;
    import top.eshyee.newinstance.ICourse;
    import top.eshyee.newinstance.JavaCourse;

    public class CourseFactory {
    public static ICourse getCourse(String name) {
    return name.equals("java") ? new JavaCourse() : name.equals("html")?new HtmlCourse():null;
    }
    }

    + +

    学生类

    +
    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
    package top.eshyee.entity;

    import top.eshyee.newinstance.HtmlCourse;
    import top.eshyee.newinstance.ICourse;
    import top.eshyee.newinstance.JavaCourse;
    import top.shyee.factory.CourseFactory;

    public class Student {
    private int stuNo;
    private String stuName;
    private int stuAge;

    public int getStuNo() {
    return stuNo;
    }

    public void setStuNo(int stuNo) {
    this.stuNo = stuNo;
    }

    public String getStuName() {
    return stuName;
    }

    public void setStuName(String stuName) {
    this.stuName = stuName;
    }

    public int getStuAge() {
    return stuAge;
    }

    public void setStuAge(int stuAge) {
    this.stuAge = stuAge;
    }

    @Override
    public String toString() {
    return "Student [stuNo=" + stuNo + ", stuName=" + stuName + ", stuAge=" + stuAge + "]";
    }

    // 学生学习课程
    public void learn(String name) {
    ICourse course1=CourseFactory.getCourse(name);
    course1.learn();
    }
    }
    + +

    测试

    +

    public class Test1 {
    public static void main(String[] args) {
    StudentlearnwithFactory();
    }

    +
    1
    2
    3
    4
    5
    6
    7
    8
    public class Test1 {
    public static void main(String[] args) {
    StudentlearnwithFactory();
    }
    public static void StudentlearnwithFactory() {
    Student student = new Student();
    student.learn("java");
    }}
    +

    测试结果:java课程

    +

    IOC

    超级工厂,可以放各种对象。控制反转,也成为DI(依赖注入)

    +

    使用IOC实现以上操作

    +

    配置XML–添加三个bean

    +
    1
    2
    3
    4
    5
    6
    7
    <bean id="student" class="top.eshyee.entity.Student">
    <property name="stuNo" value="1"></property>
    <property name="stuAge" value="2"></property>
    <property name="stuName" value="genge"></property>
    </bean>
    <bean id="JavaCourse" class="top.eshyee.newinstance.JavaCourse"></bean>
    <bean id="HtmlCourse" class="top.eshyee.newinstance.HtmlCourse"></bean>
    + +

    重写学生的learn方法

    +
    1
    2
    3
    4
    5
    public void learn(String name) {
    ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml");
    ICourse course =(ICourse)context.getBean(name);
    course.learn();
    }
    + +

    写个测试方法

    +
    1
    2
    3
    4
    5
    public static void StudentlearnwithIOC() {
    ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml");
    Student student = (Student) context.getBean("student");
    student.learn("JavaCourse");
    }
    + +

    运行结果:java课程

    +

    依赖注入(DI)

    set注入

    property

    +

    创建teacher和course类

    +
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    package top.eshyee.entity;

    public class Teacher {
    private String name;
    private int age;
    public String getName() {
    return name;
    }
    public void setName(String name) {
    this.name = name;
    }
    public int getAge() {
    return age;
    }
    public void setAge(int age) {
    this.age = age;
    }
    @Override
    public String toString() {
    return "Teacher [name=" + name + ", age=" + age + "]";
    }
    }
    + +
    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
    package top.eshyee.entity;

    public class Course {
    private String courseName;
    private int courseHour;
    private Teacher teacher;//依赖于teacher
    public String getCourseName() {
    return courseName;
    }
    public void setCourseName(String courseName) {
    this.courseName = courseName;
    }
    public int getCourseHour() {
    return courseHour;
    }
    public void setCourseHour(int courseHour) {
    this.courseHour = courseHour;
    }
    public Teacher getTeacher() {
    return teacher;
    }
    public void setTeacher(Teacher teacher) {
    this.teacher = teacher;
    }
    @Override
    public String toString() {
    return "Course [courseName=" + courseName + ", courseHour=" + courseHour + ", teacher=" + teacher + "]";
    }
    }
    + +

    加入到IOC中

    +
    1
    2
    3
    4
    5
    6
    7
    8
    9
    <bean id="teacher" class="top.eshyee.entity.Teacher">
    <property name="name" value="Shyee"></property>
    <property name="age" value="12"></property>
    </bean>
    <bean id="course" class="top.eshyee.entity.Course">
    <property name="courseName" value="JAVA"></property>
    <property name="courseHour" value="13"></property>
    <property name="teacher" ref="teacher"></property>
    </bean>
    + +

    写一个测试类

    +
    1
    2
    3
    4
    5
    6
    public static void testDI() {
    ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml");
    Teacher teacher = (Teacher) context.getBean("teacher");
    Course course = (Course) context.getBean("course");
    System.out.println(course);
    }
    + +

    运行结果:Course [courseName=JAVA, courseHour=13, teacher=Teacher [name=Shyee, age=12]]

    +

    赋值默认是set方法

    +

    构造方法注入

    constructor

    +

    修改xml

    +
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    <bean id="teacher" class="top.eshyee.entity.Teacher">
    <!-- index 指定参数位置
    <constructor-arg value="Shyeee" index="0"></constructor-arg>
    <constructor-arg value="15" index="1"></constructor-arg> -->
    <!-- name指定参数
    <constructor-arg value="Shyeee" name="name"></constructor-arg>
    <constructor-arg value="15" name="age"></constructor-arg> -->
    <!-- 指定类型
    <constructor-arg value="Shyeee" type="String"></constructor-arg>
    <constructor-arg value="15" type="int"></constructor-arg>-->
    <!-- 默认 -->
    <constructor-arg value="Shyeee" ></constructor-arg>
    <constructor-arg value="15" ></constructor-arg>
    </bean>
    <bean id="course" class="top.eshyee.entity.Course">
    <constructor-arg value="PYTHON"></constructor-arg>
    <constructor-arg value="15"></constructor-arg>
    <constructor-arg ref="teacher"></constructor-arg>
    </bean>
    + +

    加入构造方法

    +

    Course

    +
    1
    2
    3
    4
    5
    6
    7
    8
    9
    public Course(String courseName, int courseHour, Teacher teacher) {
    super();
    this.courseName = courseName;
    this.courseHour = courseHour;
    this.teacher = teacher;
    }
    public Course() {
    super();
    }
    + +

    Teacher

    +
    1
    2
    3
    4
    5
    6
    7
    8
    9
    public Teacher(String name, int age) {
    super();
    this.name = name;
    this.age = age;
    }
    public Teacher() {
    super();
    }

    + +

    运行结果:Course [courseName=PYTHON, courseHour=15, teacher=Teacher [name=Shyeee, age=15]]

    +

    P命名空间

    xmlns:p="http://www.springframework.org/schema/p"

    +
    1
    2
    3
    4
    5
    6
    7
    8
    <?xml version="1.0" encoding="UTF-8"?>
    <beans xmlns="http://www.springframework.org/schema/beans"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xmlns:p="http://www.springframework.org/schema/p"
    xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">
    <bean id="teacher" class="top.eshyee.entity.Teacher" p:name="Shyeeee" p:age="14"></bean>
    <bean id="course" class="top.eshyee.entity.Course" p:courseName="ORACLE" p:courseHour="1" p:teacher-ref="teacher">
    </bean></beans>
    + +

    运行结果:Course [courseName=ORACLE, courseHour=1, teacher=Teacher [name=Shyeeee, age=14]]

    +

    各种类型的注入

    Arrays&List&Map&Properties&Set

    创建包含各种类型的类

    +
    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
    package top.eshyee.entity;

    import java.util.Arrays;
    import java.util.List;
    import java.util.Map;
    import java.util.Properties;
    import java.util.Set;

    public class AllcollectionType {
    private List<String> list;
    private String[] array;
    private Set<String> set;
    private Map<String, String> map;
    private Properties properties;
    public List<String> getList() {
    return list;
    }
    public void setList(List<String> list) {
    this.list = list;
    }
    public String[] getArray() {
    return array;
    }
    public void setArray(String[] array) {
    this.array = array;
    }
    public Set<String> getSet() {
    return set;
    }
    public void setSet(Set<String> set) {
    this.set = set;
    }
    public Map<String, String> getMap() {
    return map;
    }
    public void setMap(Map<String, String> map) {
    this.map = map;
    }
    public Properties getProperties() {
    return properties;
    }
    public void setProperties(Properties properties) {
    this.properties = properties;
    }
    @Override
    public String toString() {
    String ss="";
    for(String s:array) {
    ss=ss+s+",";
    }
    ss="["+ss+"]";
    return "AllcollectionType [list=" + list + "\n array=" + ss + "\n set=" + set + "\n map=" + map
    + "\n properties=" + properties + "]";
    }
    }
    + +

    注入

    +
    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
    <bean id="collectionType"
    class="top.eshyee.entity.AllcollectionType">
    <property name="array">
    <array>
    <value>I</value>
    <value>A</value>
    <value>M</value>
    </array>
    </property>
    <property name="list">
    <list>
    <value>S</value>
    <value>H</value>
    <value>Y</value>
    <value>E</value>
    <value>E</value>
    </list>
    </property>
    <property name="map">
    <map>
    <entry>
    <key>
    <value>NI</value>
    </key>
    <value>ni</value>
    </entry>
    <entry>
    <key>
    <value>C</value>
    </key>
    <value>c</value>
    </entry>
    <entry>
    <key>
    <value>E</value>
    </key>
    <value>e</value>
    </entry>
    </map>
    </property>
    <property name="properties">
    <props>
    <prop key="TO">to</prop>
    <prop key="ME">me</prop>
    <prop key="ET">et</prop>
    </props>
    </property>
    <property name="set">
    <set>
    <value>Y</value>
    <value>O</value>
    <value>U</value>
    </set>
    </property>
    </bean>
    + +

    set和array都可以用list标签,相反也可,但是建议用相应标签

    +

    测试

    +
    1
    2
    3
    4
    5
    public static void testcollectionType() {
    ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml");
    AllcollectionType a = (AllcollectionType) context.getBean("collectionType");
    System.out.println(a);
    }
    + +

    运行结果

    +

    AllcollectionType [list=[S, H, Y, E, E]
    array=[I,A,M,]
    set=[Y, O, U]
    map={NI=ni, C=c, E=e}
    properties={ME=me, TO=to, ET=et}]

    +

    null和空字符串

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    <bean id="student1" class="top.eshyee.entity.Student">
    <!-- 赋空值 -->
    <property name="stuNo">
    <!-- null -->
    <null />
    </property>
    <!-- 空字符串"" -->
    <property name="stuName">
    <value></value>
    </property>
    </bean>
    + +

    自动装配

    autowire="byName"会自动找一个id为teacher 的bean,只有对象之间的依赖关系可以自动装配

    +
    1
    2
    3
    4
    5
    6
    7
    8
    9
    <bean id="teacher" class="top.eshyee.entity.Teacher">
    <property name="name" value="Shyee"></property>
    <property name="age" value="12"></property>
    </bean>
    <bean id="course" class="top.eshyee.entity.Course"
    autowire="byName">
    <property name="courseName" value="JAVA"></property>
    <property name="courseHour" value="13"></property>
    </bean>
    + +

    运行结果:Course [courseName=JAVA, courseHour=13, teacher=Teacher [name=Shyee, age=12]]

    +

    autowire="byType"按类型自动装配,寻找一个teacher类型的bean,但是有两个teacher会报错。

    +

    expected single matching bean but found 2: teacher1,teacher2

    +

    autowire="constructor"适用于构造方法中有多个依赖

    +

    添加全局的autowire–default-autowire="byName"

    +
    1
    2
    3
    4
    5
    6
    <beans xmlns="http://www.springframework.org/schema/beans"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xmlns:p="http://www.springframework.org/schema/p"
    xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd"
    default-autowire="byName"
    >
    + +

    注解

    配置扫描器

    +
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    <?xml version="1.0" encoding="UTF-8"?>
    <beans xmlns="http://www.springframework.org/schema/beans"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xmlns:p="http://www.springframework.org/schema/p"
    default-autowire="byName"
    xmlns:context="http://www.springframework.org/schema/context"
    xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
    http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.3.xsd">
    <!-- 配置扫描器 -->
    <context:component-scan base-package="top.eshyee.dao"></context:component-scan></beans>
    + +

    用注解声明一个bean

    +

    相当于在xml中的<bean id="stuentDao" class="top.eshyee.dao.StuentDaoImpl"></bean>

    +
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    package top.eshyee.dao;
    import org.springframework.stereotype.Component;
    import top.eshyee.entity.Student;
    @Component("StuentDao")
    public class StuentDaoImpl {
    public void addStudent(Student student) {
    // TODO Auto-generated method stub
    System.out.println("增加学生");
    }
    }
    + +

    dao层注解:@Repository

    +

    service层注解:@Service

    +

    控制器层注解:@Controller

    +

    使用注解实现事务

    需要使用到spring-tx-4.3.9.RELEASE.jarojdbc.jarcommons-dbcp.jarcommons-pool.jarspring-jdbc-4.3.9.RELEASE.jaraopalliance.jar

    +

    配置xml

    +
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    <!-- 配置数据库相关-事务 -->
    <bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource">
    <property name="driverClassName" value="oracle.jdbc.driver"></property>
    <property name="url" value="127.0.0.1:1521:ORCL"></property>
    <property name="username" value="SCOTT"></property>
    <property name="password" value="tiger"></property>
    <property name="maxActive" value="10"></property>
    <property name="maxIdle" value="6"></property>
    </bean>
    <!-- 配置事务管理器-txmanager -->
    <bean id="txManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
    <property name="dataSource" ref="dataSource"></property>
    </bean>
    <!-- 增加对事务的支持 -->
    <tx:annotation-driven transaction-manager="txManager"/>
    + +

    创建DAO层及实现类

    +
    1
    2
    3
    4
    5
    6
    7
    package top.eshyee.dao;

    import top.eshyee.entity.Student;

    public interface IStudentDao {
    public void addStudent(Student student);
    }
    + + + +
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    package top.eshyee.dao.impl;
    import org.springframework.stereotype.Repository;

    import top.eshyee.dao.IStudentDao;
    import top.eshyee.entity.Student;
    //相当于<bean id="stuentDao" class="top.eshyee.dao.StuentDaoImpl"></bean>
    @Repository("StuentDao")
    public class StudentDaoImpl implements IStudentDao{
    public void addStudent(Student student) {
    // TODO Auto-generated method stub
    System.out.println("增加学生");
    }
    }
    + +

    创建service层及实现类

    +
    1
    2
    3
    4
    5
    6
    7
    package top.eshyee.service;

    import top.eshyee.entity.Student;

    public interface IStudentService {
    void addStudent(Student student);
    }
    + +
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    package top.eshyee.service.impl;
    import org.springframework.transaction.annotation.Propagation;
    import org.springframework.transaction.annotation.Transactional;
    import top.eshyee.dao.IStudentDao;
    import top.eshyee.entity.Student;
    import top.eshyee.service.IStudentService;

    public class StudentServiceImpl implements IStudentService {
    IStudentDao studentDao ;

    @Transactional(readOnly = false ,propagation = Propagation.REQUIRED)
    @Override
    public void addStudent(Student student) {
    studentDao.addStudent(student);
    }
    public IStudentDao getStudentDao() {
    return studentDao;
    }
    public void setStudentDao(IStudentDao studentDao) {
    this.studentDao = studentDao;
    }
    }
    + +

    注入到IOC

    +
    1
    2
    3
    4
    5
    <bean id="studentDao" class="top.eshyee.dao.impl.StudentDaoImpl"></bean>
    <bean id="studentService"
    class="top.eshyee.service.impl.StudentServiceImpl">
    <property name="studentDao" ref="studentDao"></property>
    </bean>
    + +

    AOP

    面向方面编程

    +

    前置通知

    每当执行add之前自动执行的方法

    +

    准备jar

    +

    aopalliance.jaraspectjweaver-1.5.3.jar

    +

    编写前置通知

    +
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    package top.eshyee.aop;
    import java.lang.reflect.Method;
    import org.springframework.aop.MethodBeforeAdvice;
    public class LogBefore implements MethodBeforeAdvice{
    @Override
    public void before(Method method, Object[] args, Object target) throws Throwable {
    // TODO Auto-generated method stub
    System.out.println("前置通知");
    }
    }
    + +

    配置前置通知

    +
    1
    2
    3
    4
    5
    6
    7
    8
    <!-- 配置前置通知 -->
    <bean id="logBefore" class="top.eshyee.aop.LogBefore"></bean>

    <!-- 将addstudent方法与通知进行关联 -->
    <aop:config>
    <aop:pointcut expression="execution(public void top.eshyee.service.impl.StudentServiceImpl.addStudent(top.eshyee.entity.Student))" id="pointcut"/>
    <aop:advisor advice-ref="logBefore" pointcut-ref="pointcut"/>
    </aop:config>
    + +

    测试

    +
    1
    2
    3
    4
    5
    public static void testAOP() {
    ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml");
    IStudentService studentService= (IStudentService) context.getBean("studentService");
    Student student=getStudent1();
    studentService.addStudent(student);
    + +

    运行结果:

    +

    前置通知
    增加学生

    +

    expression=“execution(…)” 的常见写法

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    举例含义
    public boolean addStudent(org.lanqiao.entity.Student))所有返回类型为boolean、参数类型为org.lanqiao.entity.Student的addStudent()方法。
    public boolean org.lanqiao.service.IStudentService. addStudent(org.lanqiao.entity.Student)org.lanqiao.service.IStudentService类(或接口)中的addStudent()方法,并且返回类型是boolean、参数类型是org.lanqiao.entity.Student
    public * addStudent(org.lanqiao.entity.Student)“*”代表任意返回类型
    public void *( org.lanqiao.entity.Student)“*”代表任意方法名
    public void addStudent(..)“..”代表任意参数列表
    * org.lanqiao.service..(..)org.lanqiao.service.IStudentService包中,包含的所有方法(不包含子包中的方法)
    * org.lanqiao.service...(..)org.lanqiao.service.IStudentService包中,包含的所有方法(包含子包中的方法)
    +

    后置通知

    service层添加一个新业务 void deleteStudentByno(int stuNo);

    +

    添加实现方法

    +
    1
    2
    3
    4
    @Override
    public void deleteStudentByno(int stuNo) {
    System.out.println("删除学生");
    }
    + +

    编写AOP

    +
    1
    2
    3
    4
    5
    6
    7
    8
    9
    package top.eshyee.aop;
    import java.lang.reflect.Method;
    import org.springframework.aop.AfterReturningAdvice;
    public class LogAfter implements AfterReturningAdvice{
    @Override
    public void afterReturning(Object returnValue, Method method, Object[] args, Object target) throws Throwable {
    System.out.println("后置通知,目标对象:"+target+",调用的方法名:"+method.getName()+",调用的参数个数:"+args.length+",方法的返回值:"+returnValue);
    }
    }
    + +

    注入IOC

    +
    1
    2
    3
    4
    5
    6
    7
    8
    <!-- 配置后置通知 -->
    <bean id="logAfter" class="top.eshyee.aop.LogAfter"></bean>
    <!-- 将addstudent方法与通知进行关联 -->
    <aop:config>
    <aop:pointcut expression="execution(public void top.eshyee.service.impl.StudentServiceImpl.addStudent(top.eshyee.entity.Student)) or execution(public void top.eshyee.service.impl.StudentServiceImpl.deleteStudentByno(int))" id="pointcut"/>
    <aop:advisor advice-ref="logBefore" pointcut-ref="pointcut"/>
    <aop:advisor advice-ref="logAfter" pointcut-ref="pointcut"/>
    </aop:config>
    + +

    运行结果:

    +

    前置通知
    增加学生
    后置通知,目标对象:top.eshyee.service.impl.StudentServiceImpl@5b1ebf56,调用的方法名:addStudent,调用的参数个数:1,方法的返回值:null
    前置通知
    删除学生
    后置通知,目标对象:top.eshyee.service.impl.StudentServiceImpl@5b1ebf56,调用的方法名:deleteStudentByno,调用的参数个数:1,方法的返回值:null

    +

    异常通知

    源码注释中:Implementing classes must implement methods of the form: void afterThrowing([Method, args, target], ThrowableSubclass);

    +

    及必须实现以上方法

    +

    编写AOP

    +
    1
    2
    3
    4
    5
    6
    7
    8
    9
    package top.eshyee.aop;
    import java.lang.reflect.Method;
    import org.springframework.aop.ThrowsAdvice;

    public class LogException implements ThrowsAdvice{
    public void afterThrowing(Method method, Object[] args,Object target, Throwable ex) {
    System.out.println("异常通知,目标对象:"+target+",调用方法:"+method.getName()+",参数个数:"+args.length+",异常原因:"+ex.getMessage());
    }
    }
    + +

    注入IOC

    +
    1
    2
    3
    4
    5
    6
    7
    8
    9
    <!-- 配置异常通知 -->
    <bean id="logException" class="top.eshyee.aop.LogException"></bean>
    <!-- 将addstudent方法与通知进行关联 -->
    <aop:config>
    <aop:pointcut expression="execution(public void top.eshyee.service.impl.StudentServiceImpl.addStudent(top.eshyee.entity.Student)) or execution(public void top.eshyee.service.impl.StudentServiceImpl.deleteStudentByno(int))" id="pointcut"/>
    <aop:advisor advice-ref="logBefore" pointcut-ref="pointcut"/>
    <aop:advisor advice-ref="logAfter" pointcut-ref="pointcut"/>
    <aop:advisor advice-ref="logException" pointcut-ref="pointcut"/>
    </aop:config>
    + +

    搞点异常

    +
    1
    2
    3
    4
    5
    @Override
    public void deleteStudentByno(int stuNo) {
    int a=1/0;
    System.out.println("删除学生");
    }
    + +

    运行结果:

    +

    前置通知
    增加学生
    后置通知,目标对象:top.eshyee.service.impl.StudentServiceImpl@16414e40,调用的方法名:addStudent,调用的参数个数:1,方法的返回值:null
    前置通知
    异常通知,目标对象:top.eshyee.service.impl.StudentServiceImpl@16414e40,调用方法:deleteStudentByno,参数个数:1,异常原因:/ by zero
    Exception in thread "main" java.lang.ArithmeticException: / by zero

    +

    环绕通知

    前后+异常

    +

    编写AOP

    +
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    package top.eshyee.aop;

    import org.aopalliance.intercept.MethodInterceptor;
    import org.aopalliance.intercept.MethodInvocation;

    public class LogAround implements MethodInterceptor {

    @Override
    public Object invoke(MethodInvocation invocation) throws Throwable {
    Object result = null;
    try {
    System.out.println("环绕通知实现的前置通知");
    result = invocation.proceed();
    // result就是目标方法如add student的返回值
    System.out.println("环绕通知实现的后置通知,目标对象:" + invocation.getThis() + ",调用的方法名:"
    + invocation.getMethod().getName() + ",调用的参数个数:" + invocation.getArguments() + ",方法的返回值:" + result);

    } catch (Exception e) {
    System.out.println("环绕通知实现的异常通知");
    }
    return result;
    }
    }
    + +

    注入IOC

    +
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    <!-- 配置环绕通知 -->
    <bean id="logAround" class="top.eshyee.aop.LogAround"></bean>
    <!-- 将addstudent方法与通知进行关联 -->
    <aop:config>
    <aop:pointcut expression="execution(public void top.eshyee.service.impl.StudentServiceImpl.addStudent(top.eshyee.entity.Student)) or execution(public void top.eshyee.service.impl.StudentServiceImpl.deleteStudentByno(int))" id="pointcut"/>
    <aop:advisor advice-ref="logBefore" pointcut-ref="pointcut"/>
    <aop:advisor advice-ref="logAfter" pointcut-ref="pointcut"/>
    <aop:advisor advice-ref="logException" pointcut-ref="pointcut"/>
    <aop:advisor advice-ref="logAround" pointcut-ref="pointcut"/>
    </aop:config>
    + +

    运行结果:

    +

    前置通知
    环绕通知实现的前置通知
    增加学生
    环绕通知实现的后置通知,目标对象:top.eshyee.service.impl.StudentServiceImpl@46dffdc3,调用的方法名:addStudent,调用的参数个数:[Ljava.lang.Object;@5a709816,方法的返回值:null
    后置通知,目标对象:top.eshyee.service.impl.StudentServiceImpl@46dffdc3,调用的方法名:addStudent,调用的参数个数:1,方法的返回值:null
    前置通知
    环绕通知实现的前置通知
    删除学生
    环绕通知实现的后置通知,目标对象:top.eshyee.service.impl.StudentServiceImpl@46dffdc3,调用的方法名:deleteStudentByno,调用的参数个数:[Ljava.lang.Object;@78383390,方法的返回值:null
    后置通知,目标对象:top.eshyee.service.impl.StudentServiceImpl@46dffdc3,调用的方法名:deleteStudentByno,调用的参数个数:1,方法的返回值:null

    +

    使用注解实现AOP

    在XML配置扫描器以及对AOP的支持

    +
    1
    2
    3
    4
    <!-- 开启注解对AOP的支持 -->
    <aop:aspectj-autoproxy></aop:aspectj-autoproxy>
    <!-- 开启扫描器对该包的扫描 -->
    <context:component-scan base-package="top.eshyee.aop"></context:component-scan>
    + +

    编写AOP

    +
    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
    package top.eshyee.aop;
    import java.util.Arrays;
    import org.aspectj.lang.JoinPoint;
    import org.aspectj.lang.ProceedingJoinPoint;
    import org.aspectj.lang.annotation.After;
    import org.aspectj.lang.annotation.AfterReturning;
    import org.aspectj.lang.annotation.AfterThrowing;
    import org.aspectj.lang.annotation.Around;
    import org.aspectj.lang.annotation.Aspect;
    import org.aspectj.lang.annotation.Before;
    import org.springframework.stereotype.Component;
    @Component("logAnnotation")
    @Aspect
    public class LogWithAnnotation {
    @Before("execution(public void top.eshyee.service.impl.StudentServiceImpl.addStudent(top.eshyee.entity.Student))")
    public void myBefore(JoinPoint jp) {
    System.out.println("注解形式--前置通知");
    }

    @AfterReturning(pointcut = "execution(public void top.eshyee.service.impl.StudentServiceImpl.addStudent(top.eshyee.entity.Student))", returning = "returningValue")
    public void myAfterReturning(JoinPoint jp, Object returningValue) {
    System.out.println("注解形式--后置通知,目标对象:" + jp.getTarget() + ",方法名:" + jp.getSignature() + ",参数列表:"
    + Arrays.toString(jp.getArgs()) + "返回值:" + returningValue);
    }

    @AfterThrowing(pointcut="execution(public void top.eshyee.service.impl.StudentServiceImpl.addStudent(top.eshyee.entity.Student))",throwing ="e")
    public void myException(JoinPoint jp,NullPointerException e) {//通过第二个参数来捕获特定异常如NullPointerException
    System.out.println("注解形式--异常通知");
    }

    @Around("execution(public void top.eshyee.service.impl.StudentServiceImpl.addStudent(top.eshyee.entity.Student))")
    public void myAround(ProceedingJoinPoint pjp) {
    try {
    System.out.println("注解形式--环绕通知--前置通知");
    pjp.proceed();
    System.out.println("注解形式--环绕通知--后置通知");
    } catch (Throwable e) {
    System.out.println("注解形式--环绕通知--异常通知");
    } finally {
    System.out.println("注解形式--环绕通知--最终通知");
    }
    }
    @After("execution(public void top.eshyee.service.impl.StudentServiceImpl.addStudent(top.eshyee.entity.Student))")
    public void myAfter() {
    System.out.println("注解形式--最终通知");
    }
    }
    + +

    运行结果:

    +

    注解形式–环绕通知–前置通知
    注解形式–前置通知
    增加学生
    注解形式–环绕通知–后置通知
    注解形式–环绕通知–最终通知
    注解形式–最终通知
    注解形式–后置通知,目标对象:top.eshyee.service.impl.StudentServiceImpl@77b14724,方法名:void top.eshyee.service.IStudentService.addStudent(Student),参数列表:[Student [stuNo=0, stuName=genge, stuAge=0]]返回值:null
    删除学生

    +

    基于SCHEMA配置

    类似于实现接口的方式

    +

    编写AOP

    +
    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
    package top.eshyee.aop;
    import java.util.Arrays;
    import org.aspectj.lang.JoinPoint;
    import org.aspectj.lang.ProceedingJoinPoint;

    public class LogSchema {

    public void afterReturning(JoinPoint jp,Object returningValue) throws Throwable {
    System.out.println("Schema形式--后置通知,目标对象:" + jp.getTarget() + ",方法名:" + jp.getSignature() + ",参数列表:"
    + Arrays.toString(jp.getArgs()) + "返回值:" + returningValue);
    }
    public void before() throws Throwable {
    System.out.println("Schema后置通知");

    }
    public void myException(JoinPoint jp) {
    System.out.println("Schema异常通知");
    }
    public Object myAround(ProceedingJoinPoint pjp) {
    Object result=null;
    try {
    System.out.println("Schema环绕前置通知");
    result=pjp.proceed();
    System.out.println("Schema环绕后置通知");
    } catch (Throwable e) {
    System.out.println("Schema环绕异常通知");
    }
    return result;//返回目标方法的返回值
    }
    }
    + +

    注入IOC

    +
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    <!-- 将准备转入通知 的类纳入IOC -->
    <bean id="logSchema" class="top.eshyee.aop.LogSchema"></bean>

    <!-- 将addstudent方法与通知进行关联 -->
    <aop:config>
    <aop:pointcut expression="execution(public void top.eshyee.service.impl.StudentServiceImpl.addStudent(top.eshyee.entity.Student)) or execution(public void top.eshyee.service.impl.StudentServiceImpl.deleteStudentByno(int))" id="pointcut2"/>
    <aop:aspect ref="logSchema" >
    <aop:before method="before" pointcut-ref="pointcut2"/>
    <aop:after-returning method="afterReturning" returning="returningValue" pointcut-ref="pointcut2"/>
    <aop:after-throwing method="myException" pointcut-ref="pointcut2"/>
    <aop:around method="myAround" pointcut-ref="pointcut2"/>
    </aop:aspect>
    </aop:config>
    + +

    运行结果:

    +

    Schema后置通知
    Schema环绕前置通知
    注解形式–环绕通知–前置通知
    注解形式–前置通知
    增加学生
    注解形式–后置通知,目标对象:top.eshyee.service.impl.StudentServiceImpl@31000e60,方法名:void top.eshyee.service.IStudentService.addStudent(Student),参数列表:[Student [stuNo=0, stuName=genge, stuAge=0]]返回值:null
    注解形式–最终通知
    注解形式–环绕通知–后置通知
    注解形式–环绕通知–最终通知
    Schema环绕后置通知
    Schema形式–后置通知,目标对象:top.eshyee.service.impl.StudentServiceImpl@31000e60,方法名:void top.eshyee.service.IStudentService.addStudent(Student),参数列表:[Student [stuNo=0, stuName=genge, stuAge=0]]返回值:null
    Schema后置通知
    Schema环绕前置通知
    删除学生
    Schema环绕后置通知
    Schema形式–后置通知,目标对象:top.eshyee.service.impl.StudentServiceImpl@31000e60,方法名:void top.eshyee.service.IStudentService.deleteStudentByno(int),参数列表:[1]返回值:null

    +
    Author: SHYEE
    Link: http://example.com/2021/01/18/Spring%20%E5%85%A5%E9%97%A8/
    Copyright Notice: All articles in this blog are licensed under CC BY-NC-SA 4.0 unless stating additionally.
    \ No newline at end of file diff --git "a/2021/02/24/SSM\346\225\264\345\220\210/index.html" "b/2021/02/24/SSM\346\225\264\345\220\210/index.html" new file mode 100644 index 0000000..f818011 --- /dev/null +++ "b/2021/02/24/SSM\346\225\264\345\220\210/index.html" @@ -0,0 +1,184 @@ +SSM | SHYEE-PLASMA + + + + + + + + + + + + + + +

    SSM

    创建一个web项目

    添加JAR

    +

    commons-dbcp2-2.9.0.jar
    commons-logging-1.2.jar
    commons-pool2-2.11.1.jar
    log4j-1.2.17.jar
    log4j-1.2.17-javadoc.jar
    mybatis-3.5.8.jar
    mybatis-spring-2.0.6.jar
    mysql-connector-java-8.0.27.jar
    spring-aop-5.3.14.jar
    spring-beans-5.3.14.jar
    spring-context-5.3.14.jar
    spring-context-support-5.3.14.jar
    spring-core-5.3.14.jar
    spring-expression-5.3.14.jar
    spring-jdbc-5.3.14.jar
    spring-tx-5.3.14.jar
    spring-web-5.3.14.jar

    +

    创建相关User表

    +

    Mybatis的Conf.xml可以不配置,全部交给Spring去管理

    +

    在src中创建applicationContext.xml

    +

    创建mapper,并写一个userMapper.xml

    +

    web.xml中引入applicationContext.xml

    +
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    <!-- web项目中引入Spring -->
    <!-- needed for ContextLoaderListener -->
    <context-param>
    <param-name>contextConfigLocation</param-name>
    <param-value>classpath:applicationContext.xml</param-value>
    </context-param>

    <!-- Bootstraps the root web application context before servlet initialization -->
    <listener>
    <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
    </listener>
    + +

    整合SM

    整合SS

    加入jar

    +

    spring-webmvc-5.3.14.jar

    +

    配置web.xml

    +
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18

    <!-- 整合SpringMVC -->
    <!-- The front controller of this Spring Web application, responsible for handling all application requests -->
    <servlet>
    <servlet-name>springDispatcherServlet</servlet-name>
    <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
    <init-param>
    <param-name>contextConfigLocation</param-name>
    <param-value>classpath:applicationContext-controller.xml</param-value>
    </init-param>
    <load-on-startup>1</load-on-startup>
    </servlet>

    <!-- Map all requests to the DispatcherServlet for handling -->
    <servlet-mapping>
    <servlet-name>springDispatcherServlet</servlet-name>
    <url-pattern>/</url-pattern>
    </servlet-mapping>
    + +

    编写SpringMVC配置文件

    +

    applicationContext-controller.xml

    +
    1
    2
    3
    4
    5
    6
    7
    8
    <!-- 配置视图解析器 -->
    <bean
    class="org.springframework.web.servlet.view.InternalResourceViewResolver">
    <property name="prefix" value="/views/"></property>
    <property name="suffix" value=".jsp"></property>
    </bean>
    <!-- 配置注解驱动 -->
    <mvc:annotation-driven></mvc:annotation-driven>
    + +
    Author: SHYEE
    Link: http://example.com/2021/02/24/SSM%E6%95%B4%E5%90%88/
    Copyright Notice: All articles in this blog are licensed under CC BY-NC-SA 4.0 unless stating additionally.
    \ No newline at end of file diff --git a/2021/02/24/Spring - MyBatis/index.html b/2021/02/24/Spring - MyBatis/index.html new file mode 100644 index 0000000..cc30ce4 --- /dev/null +++ b/2021/02/24/Spring - MyBatis/index.html @@ -0,0 +1,214 @@ +Spring - MyBatis | SHYEE-PLASMA + + + + + + + + + + + + + +

    Spring - MyBatis

    思路:

    SqlSessionFactory -> SqlSession ->StudentMapper ->CRUD
    可以发现,MyBatis最终是通过SqlSessionFactory来操作数据库,
    Spring整合MyBatis其实就是将MyBatis的SqlSessionFactory交给Spring

    +

    SM整合步骤:

    +
      +
    1. jar
      mybatis-spring. jar
      spring- tx. jar
      spring- jdbc. jar
      spring- -expression. jar
      spr ing- context- support. jar
      spring- -core. jar
      spring- -context. jar
      spr ing- -beans. jar
      spring- aop. jar
      spring- web. jar
      commons- logging. jar
    2. +
    +

    commons-dbcp. jar

    +

    ojdbc. jar

    +

    mybatis. jar

    +

    log4j. jar

    +

    commons - pool. jar

    +

    2.类-表

    +

    3.MyBatis配置文件conf. xml

    +

    4.通过mapper. xml将类、表建立映射关系

    +

    5.之前使mybatis:用conf.xml ->SqlSessionFacotry

    +

    现在整合的时候,需要通过Spring管理SqlSessionFacotry,因此产生sqlSessionFacotry 所需要的数据库信息不在放入conf.xml而需要放入spring配置文件中

    +

    配置Spring配置文件(applicationContext. xml )

    +

    6.使用Spring-MyBatis整合产物开发程序

    +

    目标:通过spring产 生mybatis最终操作需要的动态mapper对 象(StudentMapper对象)

    +

    Spring产生动态mapper对象有三种方法:
    a. DAO层实现类继承SqlSessionDaoSupport类

    +

    SqlSessionDaoSupport类提供了一个 属性SqlSession

    +

    项目结构

    ![image-20220128223004647](D:\bloglocal\Spring - MyBatis.assets\image-20220128223004647.png)

    +

    applicationContext.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
    <?xml version="1.0" encoding="UTF-8"?>
    <beans xmlns="http://www.springframework.org/schema/beans"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">

    <!-- 加载db.properties -->
    <bean id="config"
    class="org.springframework.beans.factory.config.PreferencesPlaceholderConfigurer">
    <property name="locations">
    <array>
    <value>classpath:db.properties</value>
    </array>
    </property>
    </bean>

    <bean id="dataSource"
    class="org.apache.commons.dbcp2.BasicDataSource">
    <property name="url" value="${url}"></property>
    <property name="username" value="${username}"></property>
    <property name="password" value="${password}"></property>
    <property name="driverClassName" value="${driver}"></property>
    <property name="maxIdle" value="${maxIdle}"></property>
    </bean>

    <!-- 在Spring中整合SqlSession -->
    <bean id="sqlSessionFactoryBean"
    class="org.mybatis.spring.SqlSessionFactoryBean">
    <property name="dataSource" ref="dataSource"></property>
    <!-- 加载mybatis配置文件 -->
    <!-- <property name="configLocation" value="classpath:conf.xml"></property> -->
    <!-- 加载映射文件路径 -->
    <property name="mapperLocations"
    value="club/shyee/mapper/*.xml"></property>
    </bean>

    <!-- 注入 --><!-- 第一种方式实现 -->
    <!-- <bean id="userDao" class="club.shyee.dao.impl.UserDaoImpl"> 需要将sqlsessionfactory配到Dao里
    <property name="sqlSessionFactory" ref="sqlSessionFactoryBean"></property>
    </bean> -->
    <!-- 第二种方式,直接使用mybatis提供的mapper实现类 -->
    <!-- <bean id="userDao"
    class="org.mybatis.spring.mapper.MapperFactoryBean">
    <property name="mapperInterface"
    value="club.shyee.dao.IUserDao"></property>
    <property name="sqlSessionFactory"
    ref="sqlSessionFactoryBean"></property>
    </bean> -->
    <!-- 第三种方式,批量产生Mapper 批量产生的Mapper在SpringIOC中的id值默认是接口名(首字母小写)-->
    <bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">
    <property name="sqlSessionFactoryBeanName"
    value="sqlSessionFactoryBean"></property>
    <!-- 指定批量产生哪个包 -->
    <property name="basePackage" value="club.shyee.mapper,club.shyee.dao"></property>
    </bean>

    <bean id="userService"
    class="club.shyee.service.impl.UserServiceImpl">
    <property name="userMapper" ref="userMapper"></property>
    </bean>
    </beans>
    + +

    采用第三种方式,不走Dao层,人家直接写好了。

    +

    而且不用conf.xml,因为直接加载到IOC中了

    +

    db.properties

    +
    1
    2
    3
    4
    5
    driver=com.mysql.cj.jdbc.Driver
    url=url
    username=user
    password=password
    maxIdle=1000
    + + + +

    entity

    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
    package club.shyee.entity;

    public class User {
    private int uId;
    private String uName;
    private String uPass;
    private String phone;
    private String email;
    public int getuId() {
    return uId;
    }
    public void setuId(int uId) {
    this.uId = uId;
    }
    public String getuName() {
    return uName;
    }
    public void setuName(String uName) {
    this.uName = uName;
    }
    public String getuPass() {
    return uPass;
    }
    public void setuPass(String uPass) {
    this.uPass = uPass;
    }


    public String getPhone() {
    return phone;
    }
    public void setPhone(String phone) {
    this.phone = phone;
    }
    public String getEmail() {
    return email;
    }
    public void setEmail(String email) {
    this.email = email;
    }


    @Override
    public String toString() {
    return "User [uId=" + uId + ", uName=" + uName + ", uPass=" + uPass + ", phone=" + phone + ", email=" + email + "]";
    }
    public User(int uId, String uName, String uPass, String phone, String email) {
    super();
    this.uId = uId;
    this.uName = uName;
    this.uPass = uPass;
    this.phone = phone;
    this.email = email;
    }
    public User() {
    super();
    }
    }

    + +

    mapper

    UserMapper.java

    +
    1
    2
    3
    4
    5
    6
    7
    8
    package club.shyee.mapper;

    import club.shyee.entity.User;

    public interface UserMapper {
    public void queryUserById(int uId);
    public void addUser(User user);
    }
    + +

    userMapper.xml

    +
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    <?xml version="1.0" encoding="UTF-8" ?>
    <!DOCTYPE mapper
    PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
    "http://mybatis.org/dtd/mybatis-3-mapper.dtd">


    <mapper namespace="club.shyee.mapper.UserMapper">

    <select id="queryUserById" parameterType="int"
    resultType="club.shyee.entity.User">
    select * from user where uId=${uId}
    </select>

    <insert id="addUser" parameterType="club.shyee.entity.User">

    insert into user(uName,uPass,phone,email) values(#{uName},#{uPass},#{phone},#{email})
    </insert>
    </mapper>
    + +

    service

    接口

    +
    1
    2
    3
    4
    5
    6
    7
    package club.shyee.service;

    import club.shyee.entity.User;

    public interface IUserService {
    public void addUser(User user);
    }
    + +

    实现类

    +

    set方法必要

    +
    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
    package club.shyee.service.impl;

    import club.shyee.entity.User;
    import club.shyee.mapper.UserMapper;
    import club.shyee.service.IUserService;

    public class UserServiceImpl implements IUserService {
    private UserMapper userMapper;


    public UserMapper getUserMapper() {
    return userMapper;
    }


    public void setUserMapper(UserMapper userMapper) {
    this.userMapper = userMapper;
    }


    @Override
    public void addUser(User user) {
    System.out.println("Service 实现类中的User"+user);
    userMapper.addUser(user);
    }
    }
    + +

    测试

    写一个测试

    +
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    package club.shyee.test;

    import org.springframework.context.ApplicationContext;
    import org.springframework.context.support.ClassPathXmlApplicationContext;

    import club.shyee.entity.User;
    import club.shyee.service.IUserService;

    public class Test1 {

    public static void main(String[] args) {
    System.out.println("测试");
    test1();
    }
    public static void test1() {
    ApplicationContext context=new ClassPathXmlApplicationContext("classpath:applicationContext.xml");
    IUserService userService =(IUserService)context.getBean("userService");
    User user=new User(1,"老刘","12596874","14523654254","ttt@qq.com");
    userService.addUser(user);
    }
    }
    + +

    我放了两个打印,一个在service层一个在Dao层,会发现,application Context会自动写好了Dao的过程,所以不会打印出dao层的数据。即不用设计dao层。

    +
    Author: SHYEE
    Link: http://example.com/2021/02/24/Spring%20-%20MyBatis/
    Copyright Notice: All articles in this blog are licensed under CC BY-NC-SA 4.0 unless stating additionally.
    \ No newline at end of file diff --git "a/2021/02/24/Spring web \345\274\200\345\217\221/index.html" "b/2021/02/24/Spring web \345\274\200\345\217\221/index.html" new file mode 100644 index 0000000..440f1dc --- /dev/null +++ "b/2021/02/24/Spring web \345\274\200\345\217\221/index.html" @@ -0,0 +1,181 @@ +Spring web 开发 | SHYEE-PLASMA + + + + + + + + + + + + +

    Spring web 开发

    至少需要7个jar

    +

    image-20210123154134146

    +

    新建一个动态web项目

    +

    配置web.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
    <?xml version="1.0" encoding="UTF-8"?>
    <web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xmlns="http://xmlns.jcp.org/xml/ns/javaee"
    xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd"
    id="WebApp_ID" version="4.0">
    <display-name>SpringWeb1</display-name>
    <welcome-file-list>
    <welcome-file>index.html</welcome-file>
    <welcome-file>index.htm</welcome-file>
    <welcome-file>index.jsp</welcome-file>
    <welcome-file>default.html</welcome-file>
    <welcome-file>default.htm</welcome-file>
    <welcome-file>default.jsp</welcome-file>
    </welcome-file-list>
    <context-param>
    <!-- 指定IOC容器的位置 -->
    <param-name>contextConfigLocation</param-name>
    <param-value>classpath:applicationContext.xml</param-value>
    </context-param>
    <listener>
    <!-- 配置Spring-web.jar提供的监听器,此监听器可以在服务器启动时,初始化IOC容器 初始化IOC容器,必须告诉此容器的位置:contextparam -->
    <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
    </listener>
    </web-app>
    + +

    新建一个applicationContext

    +

    启动tomcat

    +

    信息: Loading XML bean definitions from class path resource [applicationContext.xml]

    +

    加载多个XML

    +
    1
    2
    3
    4
    5
    6
    7
    8
    9
    <context-param>
    <!-- 指定IOC容器的位置 -->
    <param-name>contextConfigLocation</param-name>
    <param-value>
    classpath:applicationContext.xml,
    classpath:applicationContext-*.xml
    </param-value>
    <!-- 加载多个applicationContext -->
    </context-param>
    + +

    或者

    +

    在主配置文件中

    +

    <import resource="applicationContext-Controller.xml"/>

    +
    1
    2
    3
    4
    5
    6
    <?xml version="1.0" encoding="UTF-8"?>
    <beans xmlns="http://www.springframework.org/schema/beans"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">
    <import resource="applicationContext-Controller.xml"/>
    </beans>
    + +
    Author: SHYEE
    Link: http://example.com/2021/02/24/Spring%20web%20%E5%BC%80%E5%8F%91/
    Copyright Notice: All articles in this blog are licensed under CC BY-NC-SA 4.0 unless stating additionally.
    \ No newline at end of file diff --git a/2021/02/24/Spring/index.html b/2021/02/24/Spring/index.html new file mode 100644 index 0000000..61d98d3 --- /dev/null +++ b/2021/02/24/Spring/index.html @@ -0,0 +1,194 @@ +Spring | SHYEE-PLASMA + + + + + + + + + + + + +

    Spring

    Spring

    因为之前重装系统忘记备份,放在c盘的代码和笔记(因为一般喜欢写到注释里),全没了。再加上一年没有敲代码,只能是从0开始敲一套完整的体系了。

    + + +

    安装与配置

    jar去这个网址下载,找最新版

    +

    下载后解压

    +

    QQ图片20210116214711

    +

    解压后差不多是这个样子:

    +

    image-20210116214923201

    +

    一堆jar

    +

    image-20210116214946140

    +

    开发简单的Spring 必须用的5个jar

    +

    spring-aop、spring-beans、spring-context、spring-core、spring-expression

    +

    以及一个日志的jar

    +

    commons-logging

    +

    创建一个Java项目作为重新开始的第一个测试项目

    +

    这里IDE选用eclipse(简单好上手),提前装好sts插件。

    +

    image-20210116215406732

    +

    编写“第一个”SpringIOC程序

    创建一个applicationContext.xml

    +

    创建一个实体Student

    +
    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
    package top.eshyee.entity;

    public class Student {
    private int stuNo;
    private String stuName;
    private int stuAge;
    public int getStuNo() {
    return stuNo;
    }
    public void setStuNo(int stuNo) {
    this.stuNo = stuNo;
    }
    public String getStuName() {
    return stuName;
    }
    public void setStuName(String stuName) {
    this.stuName = stuName;
    }
    public int getStuAge() {
    return stuAge;
    }
    public void setStuAge(int stuAge) {
    this.stuAge = stuAge;
    }
    @Override
    public String toString() {
    return "Student [stuNo=" + stuNo + ", stuName=" + stuName + ", stuAge=" + stuAge + "]";
    }
    }
    + +

    在Spring的applicationcontext的xml中,创建一个bean

    +
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    <?xml version="1.0" encoding="UTF-8"?>
    <beans xmlns="http://www.springframework.org/schema/beans"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">

    <bean id="student" class="top.eshyee.entity.Student">
    <property name="stuNo" value="1"></property>
    <property name="stuAge" value="2"></property>
    <property name="stuName" value="genge"></property>

    </bean>
    </beans>

    + +

    新建一个test

    +

    尝试拿取bean:

    +
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    package top.eshyee.test;

    import org.springframework.context.ApplicationContext;
    import org.springframework.context.support.ClassPathXmlApplicationContext;

    import top.eshyee.entity.Student;

    public class Test1 {
    public static void main(String[] args) {
    //Spring 上下文对象
    ApplicationContext context=new ClassPathXmlApplicationContext("applicationContext.xml");

    Student student=(Student) context.getBean("student");
    System.out.println(student);
    }
    Student getStudent1() {
    Student student = new Student();
    student.setStuName("genge");
    student.setStuNo(0);
    student.setStuAge(0);
    System.out.println(student);
    return student;
    }
    }
    + +

    运行结果:

    +

    Student [stuNo=1, stuName=genge, stuAge=2]

    +
    Author: SHYEE
    Link: http://example.com/2021/02/24/Spring/
    Copyright Notice: All articles in this blog are licensed under CC BY-NC-SA 4.0 unless stating additionally.
    \ No newline at end of file diff --git a/2021/02/24/SpringMVC/index.html b/2021/02/24/SpringMVC/index.html new file mode 100644 index 0000000..7567094 --- /dev/null +++ b/2021/02/24/SpringMVC/index.html @@ -0,0 +1,299 @@ +SpringMVC | SHYEE-PLASMA + + + + + + + + + + + + + +

    SpringMVC

    入门-第一个SpringMVC程序

    jars

    spring-aop.jar

    +

    spring-bean. jar

    +

    spring-context. jar

    +

    spring-core. jar

    +

    spring-web. jar

    +

    spring-webmvc. jar

    +

    spring-webmvc.jar

    +

    commons-logging

    +

    image-20210123222410984

    +

    配置web.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
    <?xml version="1.0" encoding="UTF-8"?>
    <web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xmlns="http://java.sun.com/xml/ns/javaee"
    xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd"
    id="WebApp_ID" version="3.0">
    <display-name>SpringMVCProject</display-name>
    <welcome-file-list>
    <welcome-file>index.html</welcome-file>
    <welcome-file>index.htm</welcome-file>
    <welcome-file>index.jsp</welcome-file>
    <welcome-file>default.html</welcome-file>
    <welcome-file>default.htm</welcome-file>
    <welcome-file>default.jsp</welcome-file>
    </welcome-file-list>
    <!-- 配置映射 -->
    <servlet>
    <servlet-name>springDispatcherServlet</servlet-name>
    <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
    <init-param>
    <param-name>contextConfigLocation</param-name>
    <param-value>classpath:springmvc.xml</param-value>
    </init-param>
    <!-- 使启动时自动生效 -->
    <load-on-startup>1</load-on-startup>
    </servlet>
    <servlet-mapping>
    <servlet-name>springDispatcherServlet</servlet-name>
    <url-pattern>/</url-pattern>
    </servlet-mapping>
    </web-app>
    + +

    创建springmvc.xml

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    <?xml version="1.0" encoding="UTF-8"?>
    <beans xmlns="http://www.springframework.org/schema/beans"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xmlns:aop="http://www.springframework.org/schema/aop"
    xmlns:context="http://www.springframework.org/schema/context"
    xmlns:mvc="http://www.springframework.org/schema/mvc"
    xsi:schemaLocation="http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc-4.3.xsd
    http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
    http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.3.xsd
    http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-4.3.xsd">
    <!-- 扫描有注解的包 -->
    <context:component-scan base-package="top.eshyee.Controller"></context:component-scan>
    <!-- 配置视图解析器InternalResourceViewResolver -->
    <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
    <property name="prefix" value="/views/"></property>
    <property name="suffix" value=".jsp"></property>
    </bean>
    </beans>
    + +

    index.jsp/success.jsp

    在WebContent中创建index.jsp

    +
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    <%@ page language="java" contentType="text/html; charset=ISO-8859-1"
    pageEncoding="ISO-8859-1"%>
    <!DOCTYPE html>
    <html>
    <head>
    <meta charset="ISO-8859-1">
    <title>Insert title here</title>
    </head>
    <body>
    <a href="welcome">firstSpringMVC</a>
    </body>
    </html>
    + +

    再创建一个FOLDER起名“views”,其中创建success.jsp

    +
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    <%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
    <!DOCTYPE html>
    <html>
    <head>
    <meta charset="ISO-8859-1">
    <title>Insert title here</title>
    </head>
    <body>
    第一个实例成功
    </body>
    </html>
    + +

    编写SpringMVCController

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    package top.eshyee.Controller;

    import org.springframework.stereotype.Controller;
    import org.springframework.web.bind.annotation.RequestMapping;
    import org.springframework.web.bind.annotation.RequestMethod;

    @Controller
    @RequestMapping("SpringMVCController")
    public class SpringMVCController {
    // 通过method更改请求方式,params指定请求参数中必须有的参数 如:“name”且必须为zs,"age"!=23
    @RequestMapping(value = "welcome")
    public String welcome() {
    return "success";
    }
    }
    + + + +

    如果没配置错,运行成功。

    +

    其他配置

    Controller

    +
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    //	通过method更改请求方式,params指定请求参数中必须有的参数 如:“name”且必须为zs,"age"!=23
    @RequestMapping(value = "welcome", method = RequestMethod.POST, params = { "name=zs", "age!=23" })
    public String welcome() {
    return "success";
    }

    //限制请求头
    @RequestMapping(value = "welcome2", headers = {
    "accept=text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9",
    "accept-encoding=gzip, deflate, br" })
    public String welcome2() {
    return "success";
    }
    + +

    JSP

    +
    1
    2
    3
    4
    5
    6
    7
    8
    <body>
    <a href="SpringMVCController/welcome2">firstSpringMVC</a>
    <form action="SpringMVCController/welcome" method="post">
    <input name="name">
    <input name="age">
    <input type="submit" value="post">
    </form>
    </body>
    + +

    ANT风格

    Controller

    +
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    //	ant风格
    //中间 任意字符*,任意目录**
    @RequestMapping(value = "welcome3/**/test")
    public String welcome3() {
    return "success";
    }
    // 中间单个字符
    @RequestMapping(value = "welcome4/a?c/test")
    public String welcome4() {
    return "success";
    }
    @RequestMapping(value = "welcome5/{name}")
    public String welcome5(@PathVariable("name") String name) {
    System.out.println(name);
    return "success";
    }
    + +

    jsp

    +
    1
    2
    3
    <a href="SpringMVCController/welcome3/adas/test">ant风格1</a>
    <a href="SpringMVCController/welcome4/abc/test">ant风格2</a>
    <a href="SpringMVCController/welcome5/张三">ant风格-@PathVariable</a>
    + +

    REST 实现delete和put

    controller

    +
    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
    //REST 风格--通过隐藏域区分delete和put
    @RequestMapping(value = "testPost/{name}")
    public String testPost(@PathVariable("name") String name) {
    System.out.println("增"+name);
    return "success";
    }
    @RequestMapping(value = "testDelete/{name}" )
    public String testDelete(@PathVariable("name") String name) {
    System.out.println("删"+name);
    return "success";
    }
    @RequestMapping(value = "testPut/{name}")
    public String testPut(@PathVariable("name") Integer name) {
    System.out.println("改"+name);
    return "success";
    }
    @RequestMapping(value = "testGet/{name}")
    public String testGet(@PathVariable("name") String name) {
    System.out.println("查"+name);
    return "success";
    }
    @RequestMapping(value="testRest/{id}",method=RequestMethod.DELETE)
    public String testDelete(@PathVariable("id") Integer id) {
    System.out.println("delete:删 " +id);
    return "success" ;
    }
    + +

    jsp

    +
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    <form action="SpringMVCController/testPost/1234" method="post">
    <input type="submit" value="增">
    </form><br/>
    <form action="SpringMVCController/testDelete/1234" method="post">
    <input type="hidden" name="_method" value="DELETE">
    <input type="submit" value="删">
    </form><br/>
    <form action="SpringMVCController/testPut/1234" method="post">
    <input type="hidden" name="_method" value="PUT">
    <input type="submit" value="改">
    </form><br/>
    <form action="SpringMVCController/testGet/1234" method="get">
    <input type="submit" value="查">
    </form><br/>
    <form action="SpringMVCController/testRest/1234" method="post">
    <input type="hidden" name="_method" value="DELETE"/>
    <input type="submit" value="删">
    </form>
    + +

    过滤器 xml

    +
    1
    2
    3
    4
    5
    6
    7
    8
    9
    <!-- 增加一个过滤器,目的是给普通浏览器增加delete|put的支持 -->
    <filter>
    <filter-name>HiddenHttpMethodFilte</filter-name>
    <filter-class>org.springframework.web.filter.HiddenHttpMethodFilter</filter-class>
    </filter>
    <filter-mapping>
    <filter-name>HiddenHttpMethodFilte</filter-name>
    <url-pattern>/*</url-pattern>
    </filter-mapping>
    + +

    杂项

    Controller

    +
    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
    @RequestMapping(value = "testParam")
    // required = false,defaultValue = "2" 可以不传uage ,默认值为2,客户端没有传入uage参数才能生效defaultValue配置
    public String testParam(@RequestParam("uname") String uname,@RequestParam(value="uage",required = false,defaultValue = "2") Integer uage) {
    System.out.println(uname);
    System.out.println(uage);
    return "success";
    }
    @RequestMapping(value = "testRequestHeader")
    public String testRequestHeader(@RequestHeader("Accept-Language") String al) {
    System.out.println(al);
    return "success";
    }
    @RequestMapping(value = "testCookieValue")
    public String testCookieValue(@CookieValue("JSESSIONID") String jSessionId) {
    System.out.println(jSessionId);
    return "success";
    }

    // 使用原生态的ServletAPI--直接使用
    @RequestMapping(value = "testSerlet")
    public String testSerlet(HttpServletRequest request, HttpServletResponse response) {
    System.out.println(request);
    System.out.println(response);
    return "success";
    }
    + +

    JSP

    +
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    </form>
    <br />
    <form action="SpringMVCController/testParam" method="post">
    <input type="text" name="uname">
    <!-- <input type="text" name="uage"> -->
    <input type="submit" value="提交">

    </form>
    <br />
    <a href="SpringMVCController/testRequestHeader">testRequestHeader</a>

    <br />
    <a href="SpringMVCController/testCookieValue">testCookieValue</a>
    <br />
    <a href="SpringMVCController/testSerlet">testSerlet</a>
    <br />
    + +

    对象的接收(级联)

    创建一个级联对象

    +

    Student

    +
    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
    package top.eshyee.entity;

    public class Student {
    private String name;
    private int age;
    private Address address;
    public String getName() {
    return name;
    }
    public void setName(String name) {
    this.name = name;
    }

    public int getAge() {
    return age;
    }
    public void setAge(int age) {
    this.age = age;
    }
    public Address getAddress() {
    return address;
    }
    public void setAddress(Address address) {
    this.address = address;
    }
    @Override
    public String toString() {
    return "Student [name=" + name + ", age=" + age + ", address=" + address + "]";
    }
    }
    + +

    Address

    +
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    package top.eshyee.entity;

    public class Address {
    private String homeAddress;
    private String schoolAddress;
    public String getHomeAddress() {
    return homeAddress;
    }
    public void setHomeAddress(String homeAddress) {
    this.homeAddress = homeAddress;
    }
    public String getSchoolAddress() {
    return schoolAddress;
    }
    public void setSchoolAddress(String schoolAddress) {
    this.schoolAddress = schoolAddress;
    }
    @Override
    public String toString() {
    return "Address [homeAddress=" + homeAddress + ", schoolAddress=" + schoolAddress + "]";
    }
    }
    + +

    controller

    +
    1
    2
    3
    4
    5
    @RequestMapping(value = "testObject")
    public String testObject(Student student) {//属性必须跟表单内的值一样
    System.out.println(student);
    return "success";
    }
    + +

    jsp

    +
    1
    2
    3
    4
    5
    6
    7
    <form action="SpringMVCController/testObject" method="post">
    name:<input type="text" name="name"><br/>
    age:<input type="text" name="age"><br/>
    schooladdress:<input type="text" name="address.schoolAddress"><br/>
    homeaddress:<input type="text" name="address.homeAddress"><br/>
    <input type="submit" value="提交">
    </form>
    + +

    ModelAndView

    Controller

    +
    1
    2
    3
    4
    5
    6
    7
    8
    9
    @RequestMapping(value = "testModelAndView")
    public ModelAndView testModelAndView() {
    ModelAndView mv=new ModelAndView("success");
    Student student=new Student();
    student.setName("aa");
    student.setAge(1);
    mv.addObject("student",student);//相当于request.setAttribute
    return mv;
    }
    + +

    Success JSP

    +

    用于展示拿到的值

    +
    1
    ${requestScope.student.age}--${requestScope.student.name}--
    + +

    测试页面的JSP

    +
    1
    2
    <a href="SpringMVCController/testModelAndView">testModelAndView</a>
    <br />
    + +

    其他方法

    +

    Controller

    +
    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
    @RequestMapping(value = "testModelMap")
    public String testModelMap(ModelMap mm) {

    Student student = new Student();
    student.setName("aa");
    student.setAge(1);
    mm.put("student", student);// request域
    return "success";
    }

    @RequestMapping(value = "testMap")
    public String testMap(Map<String, Object> map) {

    Student student = new Student();
    student.setName("aa");
    student.setAge(1);
    map.put("student", student);// request域
    return "success";
    }

    @RequestMapping(value = "testModel")
    public String testModel(Model model) {

    Student student = new Student();
    student.setName("aa");
    student.setAge(1);
    model.addAttribute("student", student);// request域
    return "success";
    }
    + +

    JSP

    +
    1
    2
    3
    4
    5
    6
    <a href="SpringMVCController/testModelMap">testModelMap</a>
    <br />
    <a href="SpringMVCController/testMap">testMap</a>
    <br />
    <a href="SpringMVCController/testModel">testModel</a>
    <br />
    + +

    如果要把request的中的对象放入session中,在类前加注解@SessionAttributes

    +

    Controller

    +
    1
    2
    3
    4
    5
    6
    @SessionAttributes("student")
    @Controller
    @RequestMapping("SpringMVCController")
    public class SpringMVCController {
    ...
    }
    + +

    Success JSP

    +
    1
    2
    3
    4
    5
    6
    7
    <body>
    实例成功
    request:<br/>
    ${requestScope.student.age}--${requestScope.student.name}--
    <br/>session:<br/>
    ${sessionScope.student.age}--${sessionScope.student.name}--
    </body>
    + +

    视图、视图解析器

    视图的顶级接口:View
    视图解析器:ViewResolver常见的视图和解析器:
    InternalResourceView、InternalResourceViewResolverpublic class JstlView extends InternalResourceView:
    springMVC解析jsp时会默认使用InternalResourceView,如果发现Jsp中包含了jstl语言,则自动转为JstlView

    +

    JstlView 可以解析jst1\实现国际化操作

    +

    mvc:view-controller

    在xml使用该标签可不用写Controller

    +

    xml

    +
    1
    <mvc:view-controller path="Controller/testMvcViewController" view-name="success"/>
    + +

    index jsp

    +
    1
    <a href="Controller/testMvcViewController" >testMvcViewController</a>
    + +

    但是只写mvc:view-controller 会自动屏蔽Controller

    +

    若需共存,需加标签

    +
    1
    <mvc:annotation-driven></mvc:annotation-driven>
    + +

    指定跳转方式

    forward: 请求转发 redirect: 重定向

    +

    此种方式不会被视图解析器加上前缀和后缀

    +

    Controller中

    +
    1
    return "forward:/views/success.jsp";//或者redirect
    + +

    处理静态资源

    在SpringMVC中,直接访问静态资源,会 报404

    +

    原因:所有请求在web.xml中被拦截,交给SpringMVC的DispatchServlet处理,然而该处理方式是直接找requestmapping了,但静态资源没有配requestmapping,所以404.

    +

    解决方式:不需要mvc的,交给tomcat的servlet处理

    +
    1
    2
    3
    <!-- 该注解会使SpringMVC在收到没有对应requestmapping的请求时,将请求交给服务器的servlet处理 -->
    <mvc:default-servlet-handler/>
    <mvc:annotation-driven></mvc:annotation-driven>
    + +

    类型转换

    Spring自带一些常见的类型转换

    +

    可以自定义

    +

    i 编写自定义转换器的类(实现convert接口)

    +
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    package top.eshyee.converter;

    import org.springframework.core.convert.converter.Converter;

    import top.eshyee.entity.Student;

    public class MyConverter implements Converter<String,Student>{

    @Override
    public Student convert(String source) {//字符串--返回学生--传入格式1-zs-23
    return new Student(Integer.parseInt(source.split("-")[0]),source.split("-")[1],Integer.parseInt(source.split("-")[2]));

    }
    }
    + +

    ii 将编写的转换器加入到MVC中

    +
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    <!-- 1 将转换器纳入SpringIOC容器 -->
    <bean id="MyConverter" class="top.eshyee.converter.MyConverter"></bean>
    <!-- 2 将MyConverter纳入到SpringMVC提供的bean中 -->
    <bean id="conversionServiceFactoryBean" class="org.springframework.context.support.ConversionServiceFactoryBean">
    <property name="converters">
    <set>
    <ref bean="MyConverter"/>
    </set>
    </property>
    </bean>
    <!-- 将conversionServiceFactoryBean注册到annotationdriven中 -->
    <!-- 此配置是mvc的基础配置 -->
    <mvc:annotation-driven conversion-service="conversionServiceFactoryBean"></mvc:annotation-driven>
    + +

    iii 测试

    +

    jsp

    +
    1
    2
    3
    4
    <form action="SpringMVCController/testConverter" method="post">
    studentInfo:<input type="text" name="studentInfo"><br/>
    <input type="submit" value="提交">
    </form>
    + +

    Controller

    +
    1
    2
    3
    4
    5
    @RequestMapping(value = "testConverter") 
    public String testConverter(@RequestParam("studentInfo") Student student) {
    System.out.println(student);
    return "success";
    }
    + +

    数据格式化

    SpringMVC提供注解实现格式化

    +

    配置标签

    +
    1
    2
    3
    <!-- 配置数据格式化 注解所依赖的bean -->
    <bean id="formattingConversionServiceFactoryBean" class="org.springframework.format.support.FormattingConversionServiceFactoryBean"></bean>
    <mvc:annotation-driven conversion-service="formattingConversionServiceFactoryBean"></mvc:annotation-driven>
    + +

    添加注解

    +

    Student类中

    +
    1
    2
    @DateTimeFormat(pattern = "yyyy-MM-dd")
    private Date birthday;
    + +
    Author: SHYEE
    Link: http://example.com/2021/02/24/SpringMVC/
    Copyright Notice: All articles in this blog are licensed under CC BY-NC-SA 4.0 unless stating additionally.
    \ No newline at end of file diff --git a/2021/02/24/Springboot/index.html b/2021/02/24/Springboot/index.html new file mode 100644 index 0000000..3cab84f --- /dev/null +++ b/2021/02/24/Springboot/index.html @@ -0,0 +1,259 @@ +Springboot | SHYEE-PLASMA + + + + + + + + + + + + +

    Springboot

    1.微服务: -一个项目 可以由多个小型服务构成(微服务)

    +
      +
    1. spring boot可以快速开发微服务|
    2. +
    +

    a.简化j2ee开发
    b.整个spring技术栈的整合
    c.整个j2ee技术的整个

    +

    准备:
    jdk:
    JAVA_ HOME: jdk根 目录
    path: jdk根目录\bin
    classpath: . ; jdk根目录\lib
    maven

    +

    MAVEN_ HOME: maven根 目录
    path: maven根目录\bin

    +

    配置Maven本地仓库: mvn根 目录/ conf/ setting. xml

    +

    目录结构
    resources: .
    static:静态资源(js css图片音频视频)
    templates:模板文件(freemarker , thymeleaf;默认不支持jsp)

    +

    appl ication. properties:
    配置文件

    +

    spring boot内置了tomcat, 并且不需要打成war再执行。

    +

    可以在appication. properties对端口号等服务端信息进行配置

    +

    spring boot将各个应用/三方框架设置成了一个个“场景”stater,
    以后要用哪个,只需要引入那个场景即可。
    选完之后,s
    spring
    boot就会将该场景所需要的所有依赖自动注入。
    例如选择
    ‘web’
    ’, spring boot就会将web相关的依赖(tomcat json) 全部引入本项目
    @SpringBootAppl icat ion: spring boot 的主配置类

    +

    该注解包含:
    @Spr i ngBootConf i guration

    +

    @Enabl eAutoConf i gurat ion 使spring boot可以自动配置

    +

    @configuration

    +

    表示“配置类”: 1.该类是一个配置类
    2.加了@Configuration注解的类,会自动纳入Spring容器

    +

    spring boot 在启动时,会根据META- INF/spring. factories找到相应的三方依赖

    +

    并将这些依赖引入该项目

    +

    自己写的
    引入三方依赖(jar、配置)

    +

    总结:
    编写项目时,- -般会对自己写的代码以及三方依赖进行配置。但是spring boot可以自动进行配置:
    a:自己写的代码,spring boot通过@Spr ingBootConf igurat ion自动帮我们配置;
    b.三方依赖通过spring- boot-autoconfigure- -2. 0.3. RELEASE. jar中的META- INF/ spring. factories进行声明,然后开启使用

    +

    spring-boot-autoconfigure-2.0. 3. RELEASE. jar包中包含了J2EE整合体系中需要的依赖。

    +

    c.如何自动装配:

    +

    通过观察该源码发现:
    @Configuration:标识此类是一个配置类 、 将此类纳入springioc容器

    +

    如:通过HttpEncodingProperties将编码设置为了UTF_ 8

    +

    如何修改改编码:通过改Ht tpEncodingProperties的predfix+属性名进行修改

    +

    1每一个XxAutoConfiguration都有很多条件@Conditional0nXxx,当这些条件都满足时,配置生效

    +

    2全局配置文件中的key, 来源于某个Properties文件中的prefix+属性名

    +

    image-20200526090050002

    +

    如何知道spring boot开启了哪些自动装配、禁止了哪些自动装配:application. properties中debug=true

    +

    Positive matches

    +

    积极装配 表示spring boot自动开启的装配

    +

    negative matches

    +

    消极装配 没开启的

    +

    配置文件
    作用: spring boot自动配置(约定,8080 ). 可以使用配置文件对默认得配置进行修改

    +

    默认全局配置文件:
    application. properties k=v
    application. yml 不是一个标记文档 k:空格v ;通过垂直对齐指定层次关系 ; 默认可以不写引号; “”会将其中的转义符进行转义,其他得不会

    +
    1
    2
    3
    server :
    port: 8882
    path: /a/b/c
    + + +

    xml:是一个标记文档

    +
    1
    2
    3
    4
    <server>
    <port>8882</ port>
    <path>/a/b/c</ path>
    </server>
    + +

    9.通过yam1给对象注入值:
    注入值
    s tudent:
    #name: zs
    #age: 23
    sex: true
    birthday: 2019/02/12
    绑定:

    +

    @Component //将此Javabean
    @ConfigurationProperties (prefix=” student”)
    public class Student

    +

    image-20200528092519700

    +
      +
    1. @PropertySource:默认会加载applicat ion. properties/ application. yml文件中的数据;
      例如@PropertySource (value= {”classpath: conf. properties” } )加载conf. properties
    2. +
    +

    但是,@PropertySource 只能加载properties,不能加载yml

    +
      +
    1. @ImportResource
      spring. boot 自动装配/自动配置.
      spring等配置文件默认 会被spring boot 自动给配置好。
      如果要自己编写spring等配置文件,spring boot 能否识别?默认不识别。
    2. +
    +

    随机占位表达式

    +

    $ {random. uuid} : uuid
    $ {random. value}随机字符串.
    $ {random. int}: 随机整型数
    $ {random. long}: 随机长整型数
    $ {random. int(10)}: 10以内的整型数
    $ {random. int[1024, 65536]}: 指定随机数范围

    +

    13.多环境的切换(profile)

    +

    a properties

    +

    b yml

    +

    c.动态切换环境
    i:通过运行参数指定环境
    (1) STS(Eclipse) : Run Configuration - Argument - program Argument
    –spring. profiles. active=环境名
    (2)命令行方式:
    java -jar_ 项目名. jar –spring. profiles. active=环境名
    ii:通过vm参数指定环境
    STS(Eclipse) : Run Configuration - Argument - program Argument
    -Dspring. profiles. active=环境名|

    +
      +
    1. 配置文件的位置

      +

      内部

      +

      properties和yml中的配置,相互补充;如果冲突,则properties优 先级高。
      spring. boot默认能够读取的app1 ication. properties/ application. yml,这2个文件可以存在于以下
      file:项目根目录/config
      file:项目根目录
      classpath:项目根目录/config
      classpath:项目 根目录

      +
    2. +
    +

    注意:
    a.如果某项配置冲突,则优先级从上往下
    b.如果不冲突,则互补结合使用

    +

    外部:

    +

    在项目Run confi guration , argumenets:
    – spr ing. config. location=文件路径
    如果同一个配置同时存在于内部配置文件和外部配置文件,则外部>内部

    +

    通过命令行调用外部配置文件
    java -jar项目. jar – spring. config. location=D:/ appl ication. properties

    +

    14.日志
    日志框架UCL JUL jboss- logging, logback, log4j, 1og4j2, s1f4j…
    spring boot默认选用slf4j, logback

    +

    spring boot默认帮我们配置好了日志,我们直接使用即可。

    +

    日志级别

    +

    TRACE< DEBUG< INFO<WARN< ERROR< FATAL<0FF

    +

    springboot默认的日志级别是info (即只打印info及之 后级别的信息

    +

    可以通过配置将日志信息存储到文件中logging. file=springboot. log存储到了项目的根目录中的springboot.log中

    +

    也可以指定具体的日志路径: logging. file=D:/springboot. log
    也可以存储到一一个文件夹中,logging. path=D:/log/, 并且默认的文件名是spring. log
    指定日志显示格式:
    a.日志显示在console中I
    b.日志显示在文件中

    +
      +
    1. springboot开发Web项目 (静态资源html css js )
      new - spring starer -设置I (选择需要的场景,web)
      springboot是-一个jar,因此静态资源就不是再存放到webapps中,
    2. +
    +

    静态资源的存放路径通过WebMvcAutoConfiguration类的addResourceHandlers ()指定/webjars

    +

    spring boot将静态资源存入到jar包中,引入:http://localhost:8080/webjars/jquery/3.5.1/jquery.js

    +

    如何自己写静态资源,如何放到如spring boot中?将自己写的静态资源-> jar

    +

    推荐: springIboot约定:springboot将–些目录结构设置成静态资源存放目录

    +

    默认目录

    +

    “classpath:/META- INF/resources/”,” classpath:/resources/”,
    ”classpath:/static/“, ”classpath:/public/”

    +

    注意:在以上目录存放资源文件后,访问时不 需要加前缀,直接访问即可: http://localhost : 8080+名字

    +

    设置欢迎页:
    welcomePageHandlerMapping

    +

    网站中网页标签的Logo是固定名字favicon.ico

    +

    自定义favicon. ico :阅读源码得知:只需要将 favicon. ico文件放入任意静态资源目录中即可

    +

    总结: 1. 通过源码发现静态资源的目录
    2.用静态资源:只需要将静态资源放入以上目录即可
    3.其他特定的文件(欢迎页、ico) ,只需要根据约定放入改 目录即可

    +

    动态资源: JSP (spring. boot默认不支持)
    推荐:模板引擎thymeleaf
    网页=模板+数据|

    +

    使用thymeleaf:代码在哪里写?
    Thyme leafAutoCongifutation、
    XxProperties
    通过Thyme leafProperties源码得知:
    使用thymeleaf只需要将文件放入目录: “classpath:/templates/“;文件的后缀:”. html”;

    +

    th就是替换原有html的值: th;html属性名=值 ;

    +

    /<p id=” pid” class=” pclass’> /

    +

    th:id=” $ {welcome}”th:class=” $ {welcome}”th:text=” $
    th:xx_ (参 见第10章Attrubite Pre…. )
    th:text 获取文本值(不转义)
    th:utext获取文 本值

    +

    除了$以外其他符号?查看 第四章Standard Express….|

    +
    Author: SHYEE
    Link: http://example.com/2021/02/24/Springboot/
    Copyright Notice: All articles in this blog are licensed under CC BY-NC-SA 4.0 unless stating additionally.
    \ No newline at end of file diff --git a/2021/03/12/2021-03-21(1)/index.html b/2021/03/12/2021-03-21(1)/index.html new file mode 100644 index 0000000..9df0b18 --- /dev/null +++ b/2021/03/12/2021-03-21(1)/index.html @@ -0,0 +1,970 @@ +计算机操作系统 | SHYEE-PLASMA + + + + + + + + + + + + + +

    计算机操作系统

    进程–>处理机

    +

    操作系统小TIPS

    + + + +

    进程管理

    程序的并发执行

    程序是描述计算机所要完成的具有特定功能的,并在时间上按严格次序前后相继的计算机操作序列集合(一个静态的概念)

    +

    程序顺序执行的特点:

    +
      +
    1. 顺序性
    2. +
    3. 封闭性
    4. +
    5. 可再现性
    6. +
    +

    程序在执行时应考虑的环境

    +
      +
    1. 独立性
    2. +
    3. 随机性
    4. +
    5. 资源共享性
    6. +
    +

    进程

    并发执行的程序在执行过程中分配和管理资源的基本单位

    +

    特点:

      +
    1. 动态概念
    2. +
    3. 并发特征(程序没有)
    4. +
    5. 竞争计算机系统资源的基本单位
    6. +
    7. 不同的进程可以包含同一个程序
    8. +
    +

    进程的组成:

    进程控制块PCB:
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    信息含义
    状态说明进程当前的状态
    进程标识符标明系统中各个进程
    位置信息指明程序及数据在主存或外存的位置
    控制信息参数、信号量、消息等
    队列指针连接统一状态的进程
    优先级进程调度的依据
    现场保护区将处理机的现场保护到该区域
    其他
    +
    程序
    数据

    进程的状态

    运行态、就绪态、阻塞态/等待态、新建态、退出态

    +

    进程切换

    切换的时机

    +
      +
    1. 时钟中断
    2. +
    3. I/O中断
    4. +
    5. 内存失效
    6. +
    7. 遇到陷阱
    8. +
    9. 系统调用
    10. +
    +

    空->创建:新的批处理作业、交互登录、为提供服务而由操作系统创建、由现有进程派生

    +

    新建->就绪态:操作系统做好准备再接纳一批新进程时

    +

    就绪->运行态:需要选择一个新进程时

    +

    运行->就绪:正在运行的进程达到“允许不中断执行”的最大时间段、被优先级更高的进程抢占、进程自愿释放处理器(周期性的进程)

    +

    运行->阻塞:对于进程请求的服务,操作系统无法立即予以服务、请求一个无法得到的资源、需要进行初始化的时候、进程通信时,一个进程等待另一个进程的信息。从磁盘读数据时(可能)

    +

    阻塞->就绪:等待的时间发生时

    +

    一个读磁盘操作完成以后,操作系统会修改进程状态为就绪态

    +

    进程的创建

      +
    1. 由系统程序模块统一创建
    2. +
    3. 有父进程创建
    4. +
    +

    用户登录成功后需要创建新进程
    启动程序执行创建新进程

    +
    +

    设备分配是通过在系统中设置相应的数据结构实现的,不必创建新进程。

    +

    进程的撤销

      +
    1. 该进程已完成所要求的功能而正常终止
    2. +
    3. 由于某种错误导致非正常终止
    4. +
    5. 祖先进程要求撤销某个子进程
    6. +
    +

    进程的通信

    主从式
      +
    1. 主进程可自由使用从进程的资源或数据
    2. +
    3. 从进程的动作受主进程的控制
    4. +
    5. 主进程和从进程的关系是固定的
    6. +
    +
    会话式
      +
    1. 使用进程在服务进程所提供的服务之前,必须得到许可
    2. +
    3. 服务进程所提供的服务的控制由自身完成
    4. +
    5. 使用进程和服务进程在通信时有固定的链接关系
    6. +
    +
    消息或邮箱机制
      +
    1. 只要存在空缓冲区或邮箱,发送进程就可以发送消息
    2. +
    3. 发送进程和接受进程无直接连接关系
    4. +
    5. 两进程之间存在缓冲区或邮箱
    6. +
    +
    共享存储区方式

    不要求数据移动

    +
    管道通信

    类似于半双工
    大小为内存上的一页

    +

    临界区

    不允许多个并发进程交叉执行的一段程序
    禁止两个进程同时进入临界区的准则:

    +
      +
    1. 空闲让进
    2. +
    3. 忙则等待
    4. +
    5. 有限等待
    6. +
    7. 让权等待
    8. +
    +

    实现互斥

    软件方法

      +
    1. 单标志法
      违背空闲让进
    2. +
    3. 双标志法先检查
      违背忙则等待
    4. +
    5. 双标志法后检查
      导致互相谦让,谁也进不了临界区
      最终饥饿
    6. +
    7. Peterson算法
      代码语句中设置了turn
      无法实现让权等待
    8. +
    +

    硬件实现方法

      +
    1. 中断屏蔽法
      限制了处理机交替执行程序的能力
    2. +
    3. 硬件指令法
      TestAndSet指令(原子操作)(不会主动放弃CPU,完成时会唤醒处于就绪态的进程,在开中断下运行)、Swap指令
      硬件方法不能实现让权等待
    4. +
    +

    信号量

    条件变量与信号量的比较

    +
      +
    • 相同点
      条件变量的wait/signal操作类似于信号量的p/v操作,可实现进程的阻塞/唤醒
    • +
    • 不同点
      条件变量是没有值的,仅实现了“排队等待”功能;而信号量是“有值”的,信号量的值反应了剩余资源数,而在管程中,剩余资源数用共享数据结构记录。
    • +
    +

    管程

    代表共享资源的数据结构,以及由对该共享资源数据结构实施操作的一组过程所组成的资源管理程序。

    +

    实现共享资源封装
    每次只允许一个进程进入管程

    +

    经典同步问题

    生产者消费者问题
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    semaphore mutex=1;	//临界区互斥信号量
    semaphore empty=n; //空闲缓冲区
    semaphore full=0; //缓冲区初始化为空
    producer(){ //生产者进程
    while(1){
    produce an item in next; //生产数据
    P(empty); //获取空缓冲单元
    P(mutex); //进入临界区
    Add next to buffer; //加入数据
    V(mutex); //离开临界区,释放互斥信号量
    V(full); //满缓冲区加1
    }
    }
    consumer(){ //消费者进程
    while(1){
    P(full); //获取满缓冲单元
    P(mutex); //进入临界区
    Remove an item from buffer;
    V(mutex); //离开缓冲区
    V(empty); //空缓冲区加1
    Consume the item; //消费
    }
    }
    + +
    读者-写者问题
    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
    int count=0;			//用于记录当前的读者数量

    semaphore mutex=1; //用于保护更新count变量时的互斥
    semaphore rw=1; //用于保证读者和写者互斥地访问文件
    semaphore w=1; //用于实现写优先

    writer() { //写者进程

    while(1) {
    P(w);
    P(rw) ; //互斥访问共享文件

    writing; //写入

    V(rW); //释放共享文件
    V(w);


    reader() { //读者进程
    while (1) {
    P(w)
    P (mutex) ; //互斥访问count变量
    if (count==0) //当第一个读进程读共享文件时
    P(rw); //阻止写进程写
    count++; //读者计数器加1
    V (mutex) ; //释放互斥变量count
    V(w);
    reading; //读取
    P (mutex) ; //互斥访问count变量
    count--; //读者计数器减1
    if (count==0) //当最后一个读进程读完共享文件
    V(rw) ; //允许写进程写
    V (mutex) ; //释放互斥变量count
    }
    }
    + +
    哲学家问题
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    semaphore chopstick[5]={1,1,1,1,1}; //初始化信号量
    semaphore mutex=1; //设置取筷子的信号量
    Pi() { //i号哲学家的进程
    do{
    P (mutex) ; //在取筷子前获得互斥量
    P (chopstick[i]) ; //取左边筷子
    P (chopstick[(i+1)%5]) ; //取右边筷子
    V (mutex) ; //释放取筷子的信号量
    eat; //进餐
    V(chopstick[i]) ; //放回左边筷子
    V (chopstick[(i+1)%5]) ; //放回右边筷子
    think; //思考
    } while (1) ;
    }
    + +

    死锁

    死锁的原因

      +
    1. 系统资源的竞争
    2. +
    3. 进程推进顺序非法
    4. +
    5. 死锁产生的必要条件:
    6. +
    +
      +
    • 互斥条件
    • +
    • 不剥夺条件
    • +
    • 请求并保持条件
    • +
    • 循环等待条件
    • +
    +

    死锁的预防

      +
    1. 破坏互斥条件
      不可行
    2. +
    3. 破坏不剥夺条件
      用于状态易于保存和恢复的资源 如CPU的寄存器及内存资源,不适用于打印机
    4. +
    5. 破坏请求并保持条件
      采用预先静态分配方法
      会导致饥饿
    6. +
    7. 破坏循环等待条件
      采用顺序资源分配算法
      限制了新设备的增加
      造成资源浪费
      给用户编程带来麻烦
    8. +
    +

    死锁避免

      +
    1. 系统安全状态
    2. +
    3. 银行家算法
    4. +
    +

    死锁的检测和排除

      +
    1. 资源分配图
    2. +
    3. 死锁定理
    4. +
    5. 死锁解除
    6. +
    +
      +
    • 资源剥夺法
    • +
    • 撤销进程法
    • +
    • 进程回退法
    • +
    +

    线程

    线程是调度的基本单位
    线程控制块TCB
    用户级线程只可在用户空间中进行,所以在不支持内核级线程的系统中也可以实现管理。
    用户级线程的切换效率更高。

    +

    典型应用

      +
    1. 服务器中的文件管理或通信控制
    2. +
    3. 前后台处理
    4. +
    5. 异步处理
    6. +
    +

    多线程模型

    多对一

    多个用户映射到一个内核级线程,用户线程对操作系统不可见
    多个线程不能并行运行在多处理机上

    +

    一对一

    每个用户级线程映射到一个内核级线程
    线程开销大

    +

    多对多

    n个用户级映射到m个内核级线程上,要求m<=n

    +

    中断技术

    在程序执行过程中遇到急需处理的事件时,暂时中止现行程序在CPU上的执行,转而执行相应的事件处理程序,待处理完成后返回中断点或调用其他程序。

    +

    外中断(中断或者异步中断)

    来自处理器之外的中断
    分为可屏蔽中断和不可屏蔽中断
    既发生在用户态又发生在内核态

    +
      +
    1. 时钟中断
    2. +
    3. 键盘中断
    4. +
    5. 它机中断
    6. +
    7. 外部设备中断
    8. +
    +

    内中断(异常或同步中断)

      +
    1. 访管中断->执行系统调用引起
    2. +
    3. 硬件故障中断->电源失效、奇偶校验错误、总线超时
    4. +
    5. 程序性异常->非法操作、地址越界、页面故障、调试指令、除数为零、浮点溢出
      大部分异常都发生在用户态,只有“缺页异常“发生在内核态
    6. +
    +

    中断的执行过程

      +
    1. 关中断 此时不能响应更高级的中断请求
    2. +
    3. 保存断点 即PC
    4. +
    5. 引出中断服务程序 将地址送入PC
    6. +
    7. 保存现场和屏蔽字
    8. +
    9. 开中断 此时允许更高级的的中断
    10. +
    11. 执行中断服务程序
    12. +
    13. 关中断
    14. +
    15. 恢复现场和屏蔽字
    16. +
    17. 开中断、中断返回
      PC由硬件保存,通用寄存器由操作系统保存
      1~3由硬件(中断隐指令)完成,4~9 软件完成
    18. +
    +

    中断事件处理

    硬件故障中断

    硬件故障导致

    +
    处理过程
      +
    1. 中断处理程序 保护现场
    2. +
    3. 停止设备工作
    4. +
    5. 停止处理及运行
    6. +
    7. 向操作员报告
    8. +
    +

    程序性中断

    语法错误、逻辑错误、运行中异常

    +
    处理过程
      +
    1. 因人而异
    2. +
    3. 借助于信号机制
    4. +
    5. 操作系统将中断事件捕获交给应用程序
    6. +
    +

    I/O中断

    处理原则
      +
    1. I/O正常结束 待传输的下一个进程设置为就绪态
    2. +
    3. I/O发生故障 向设备发命令索取状态字、分析故障的确切原因、复执或转人工
    4. +
    5. I/O异常 报告操作员
    6. +
    7. 设备报到或设备结束 操作系统修改系统数据结构中相应设备的状态
    8. +
    +

    访管中断

    表示当前运行程序对操作系统功能的调用

    +
    处理过程
      +
    1. 程序执行访管指令,并通过适当方式指明系统调用号。
    2. +
    3. 通过中断机制进入访管中断处理程序,现场信息被保护到核心栈,按功能号实现跳转。
    4. +
    5. 通过系统调用人口地址表找到相应中断服务例程的入口地址。
    6. +
    7. 执行中断服务例程,正常情况下在结束后返回系统调用的下一条指令继续
      执行。
    8. +
    +

    时钟中断

    处理和时间有关的信息及决定是否程序调度
    和时间有关的信息:系统时间、进程的时间片、延时、使用CPU的时间、各种定时器。
    时钟分绝对时钟和间隔时钟

    +
    间隔定时器:
      +
    1. real 永远在计时(包括进程挂起时)
    2. +
    3. virtual 只在用户态计时
    4. +
    5. profile 在用户态和内核态都计时
    6. +
    +

    系统调用

    分类

      +
    • 设备管理
    • +
    • 文件管理
    • +
    • 进程管理
    • +
    • 进程通信
    • +
    • 内存管理
    • +
    +

    要运行在核心态

    由内核程序负责完成
    用户通过trap 来发起系统调用请求

    +

    用户态转向核心态

      +
    1. 用户程序要求操作系统的服务,如系统调用
    2. +
    3. 发生一次中断
    4. +
    5. 用户程序产生了一次错误状态
    6. +
    7. 用户程序企图执行一条特权指令
      用中断返回指令返回用户态
    8. +
    +

    主要过程

      +
    1. 传递系统调用参数
    2. +
    3. 执行trap指令
    4. +
    5. 执行相应的服务程序
    6. +
    7. 返回用户态
    8. +
    +

    大内核与微内核

    大内核的好处

    可充分利用模块之间有效特性,无可比拟的性能优势

    +

    微内核的特点

      +
    1. 添加系统服务时,不必修改内核
    2. +
    3. 有效分离接口
    4. +
    5. 微内核结构没有单一内核稳定
    6. +
    +

    处理机调度

    分级调度

      +
    1. 作业调度 又称宏观调度或者高级调度
    2. +
    3. 交换调度 又称中级调度或者内存调度
    4. +
    5. 进程调度 又称微观调度或者低级调度
    6. +
    7. 线程调度
      作业调度次数少,中级次数略多,进程调度频率最高
      进程调度和切换程序是操作系统内核程序
    8. +
    +
    +

    现代操作系统中,不能进行进程的调度与切换的情况有以下几种:1. 在处理中断的过程中,中断处理过程复杂,在实现上很难做到进程程切换,而且中断处理是系统工作的一部分,逻辑上不属于某一进程,不应被剥夺处理机资源。
    2. 进程在操作系统内核程序临界区中。进入临界区后,需要独占式地访问共享数据,理论上必须加锁,以防止其他并行程序进入,在解锁前不应切换到其他进程运行,以加快该共享数据的释放。
    3. 其他需要完全屏蔽中断的原子操作过程中。如加锁、解锁、中断现场保护、恢复等原子操作。在原子过程中,连中断都要屏蔽,更不应该进行进程调度与切换。

    +
    +

    进程调度方式

      +
    • 非抢占(剥夺)式
    • +
    • 抢占(剥夺)式
    • +
    +

    调度的基本准则

      +
    1. CPU利用率
    2. +
    3. 系统吞吐量 单位时间内CPU完成作业的数量 作业数量/时间
    4. +
    5. 周转时间
      周转时间=作业完成时间-作业提交时间
      平均周转时间=(作业1的周转时间+…+作业n的周转时间)/n
      带权周转时间=作业周转时间/作业实际运行时间
      平均带权周转时间=n个带权周转时间/n
    6. +
    7. 等待时间 进程处于等处理机状态的时间之和
    8. +
    9. 响应时间 用户提交到系统首次响应的时间
    10. +
    +

    进程调度

    功能

      +
    1. 记录系统中所有进程执行的的情况
    2. +
    3. 选择占有处理机的过程
    4. +
    5. 进行进程上下文的切换
    6. +
    +

    进程调度的时机

      +
    1. 正在执行的进程执行完毕,或者进程被创建时
    2. +
    3. 执行中进程自己调用阻塞原语将自己阻塞起来,进入睡眠等待状态
    4. +
    5. 执行中进程提出IO请求后被阻塞
    6. +
    7. 在分时系统中时间片已经用完
    8. +
    9. 在执行完系统调用,系统程序返回用户程序时
    10. +
    11. 进程处于临界区时也可以调度
      以上是不可剥夺方式下的原因
    12. +
    13. 就绪队列中的某进程的优先级变得高于当前执行进程的优先级
    14. +
    +
    UNIX中
      +
    1. 进程自己调用sleep和wait进入睡眠
    2. +
    3. 由于系统调用结束返回用户态,调度标志被置位
    4. +
    5. 完成中断或trap
    6. +
    7. 时间片用完
    8. +
    9. 调用exit自我终止
    10. +
    +

    调度算法

    先来先服务算法FIFS

    算法简单效率低
    对长作业有利对短作业不利
    有利于CPU繁忙型作业,不利于IO繁忙型

    +

    短作业优先调度算法SJF

    对于长作业不利
    未考虑作业的紧迫程度
    作业的长短根据用户的估计而定(不准)
    SJF的平均等待时间、平均周转时间最少

    +

    优先级调度算法

      +
    1. 非剥夺式
    2. +
    3. 剥夺式
    4. +
    5. 静态优先级 创建进程时决定的
    6. +
    7. 动态优先级 进程运行过程中调整
    8. +
    +

    优先级的设置参照原则

      +
    1. 系统进程>用户进程

      +
    2. +
    3. 交互型进程 >非交互型进程

      +
    4. +
    5. IO型进程 >计算型进程

      +
    6. +
    +

    高响应比优先调度算法

    响应比Rp=(等待时间+要求服务时间)/要求服务时间
    因此

    +
      +
    1. 作业的等待时间相同时,要求服务时间越短,响应比越高,有利于短作业
    2. +
    3. 要求时间相同时,作业的响应比由其等待时间决定,(FCFS)
    4. +
    5. 对长作业,等待时间足够长时,其响应比便可升的很高
    6. +
    +

    时间片轮转调度算法

    适用于分时系统
    剥夺式
    当一个处于运行态的进程用完一个时间片后它的状态处于就绪

    +

    多级反馈队列调度算法

      +
    1. 设置多个就绪队列,每个队列优先级不同
    2. +
    3. 每个队列中进程执行的时间片的大小各不相同
    4. +
    5. 队列中FCFS,队列间时间片轮转
    6. +
    7. 允许抢占
    8. +
    +
    优势
      +
    1. 终端型作业用户:短作业优先
    2. +
    3. 短批处理作业用户:周转时间较短
    4. +
    5. 长批处理作业用户:不会长期得不到处理
    6. +
    +

    实时调度

    分为软实时调度和硬实时调度
    实时操作系统的特点:

    +
      +
    1. 有限等待时间(决定性)
    2. +
    3. 有限响应时长
    4. +
    5. 用户控制
    6. +
    7. 可靠性高
    8. +
    9. 系统出错处理能力强
    10. +
    +

    要求:

      +
    1. 很快的进程或线程切换速度
    2. +
    3. 快速的外部中断响应能力
    4. +
    5. 基于优先级的随时抢占式调度策略:
    6. +
    +
      +
    • 优先级+时间片轮转调度
    • +
    • 基于优先级的非抢占式调度
    • +
    • 基于优先级的固定抢占式调度
    • +
    • 基于优先级的随时抢占式调度
    • +
    +

    分类:

      +
    1. 静态表格法
      静态分析——直接产生调度结果
      多用于处理周期性任务
    2. +
    3. 静态优先级驱动抢占式调度算法
      也进行静态分析——不直接产生调度结果——只用来指定优先级
    4. +
    5. 动态计划调度算法
      在执行调度任务前排调度计划
    6. +
    7. 尽力而为调度算法
      不进行可能性分析
    8. +
    +

    实现调度算法

    所包涵的内容信息:

    +
      +
    1. 任务就绪时间或事件到达时间
      周期性事件可预知,但非周期性事件大部分时间不可预知
    2. +
    3. 开始时限
    4. +
    5. 完成时限
    6. +
    7. 处理时间
    8. +
    9. 资源要求
    10. +
    11. 优先级
    12. +
    +

    算法思想:按用户的时限要求顺序设置处理机
    抢占式的
    可用于非周期性任务调度

    +

    频率单调调度算法

    广泛应用于多周期性实时处理
    原理:
    频率越低优先级越低

    +

    内存管理基本原理

    功能

    1. 虚拟存储器

    进程中的目标代码、数据等的虚存地址组成的虚拟空间称为虚拟存储器

    +

    2. 地址变换

    内存地址(物理单元)的集合成为内存空间或物理地址空间
    物理地址空间是地址转换的最终地址

    +
      +
    • 静态地址重定位
      要求执行前完成链接
      必须占用连续的内存空间
    • +
    • 动态地址重定位
      依靠硬件地址变换机构
      该机构需要一个或多个基地址寄存器BR和一个或多个程序虚拟地址寄存器VR
      内存地址MA=BR+VR
      优点:
    • +
    +
      +
    1. 可以对内存进行非连续分配
    2. +
    3. 提供了实现虚拟存储器的基础
    4. +
    5. 有利于程序段的共享
    6. +
    +

    3. 内外存数据传输的控制

    用户控制:覆盖
    系统控制:交换、请求调入+预调入
    一个进程正在IO时,不能交换出内存

    +

    4. 内存的分配与回收

    连续分配方式
      +
    • 单一连续分配
      无外部碎片、可采用覆盖技术
      只能用于单用户、有内部碎片
    • +
    • 固定分区分配
      多道
      分区大小相等。用于一台计算机控制多个相同对象
      分区大小不等。多个较小,适量中分区,少量大分区
      程序太大就放不进任何分区了
      内存利用率低,会产生内部碎片
      无外部碎片
      有关管理通过分区说明表进行
    • +
    • 动态分区分配
      旗下的几种算法:
    • +
    +
      +
    1. 首次适应算法
      空闲地址递增的顺序链接
      具有最佳性能
    2. +
    3. 最佳适应算法
      容量递增方式链接
    4. +
    5. 最坏适应算法
      容量递减方式链接
    6. +
    7. 邻近适应算法
      首次适应的演变,在上次查找的位置开始查找
    8. +
    +

    5. 内存信息的共享与保护

    常用的内存信息保护方法:
      +
    1. 上下界保护法(硬件)
    2. +
    3. 保护键法
    4. +
    5. 界限寄存器与CPU的用户态或核心态工作方式相结合
    6. +
    +

    源程序转换为在内存中执行的程序步骤:

    +
      +
    1. 编译
    2. +
    3. 链接 逻辑地址——>物理地址
    4. +
    5. 装入
    6. +
    +
    程序链接的三种方式:
      +
    1. 静态链接
    2. +
    3. 装入时动态链接
    4. +
    5. 运行时动态链接
    6. +
    +
    装入的的三种方法:
      +
    1. 绝对装入
    2. +
    3. 可重定位装入
    4. +
    5. 动态运行时装入
    6. +
    +

    页式管理

    为了减少碎片以及为了只在内存存放那些反复利用的或即将执行的程序段与数据部分,而把那些不经常执行的程序段和数据存储在外存。
    不会产生外部碎片

    +

    名词

    每个进程平均产生半个块大小的内部碎片(页内碎片)
    进程的虚拟空间被划分为若干个等长的页(Page)
    每个页1~4K(旧)
    内存空间按页的大小分为片或页面/帧/框(Page framework)
    外存也以同样的单位划分,成为块(block)

    +

    地址结构

    分为两部分
    页号P——页内偏移量W

    +

    页表

    记录页面在内存中对应的物理块号
    一般存于内存中
    页表由页表项
    页表项的结构:页号——物理内存中的块号
    页表项的第二部分与地址的第二部分共同组成物理地址
    加入中断处理后的页表

    + + + + + + + + + + + + + + + +
    页号页面号中断位外存始址
    +

    | 页号 | 页面号 | 中断位 | 外存始址 |
    加入改变位后的页表
    | 页号 | 页面号 | 中断位 | 外存始址 | 改变位 |

    +

    计算过程

    页号P=逻辑地址A/页面大小L
    页内偏移量W=A%L
    如果页号P>=页表长度M,产生越界中断
    页表项地址=页表始址F+页号P页表项长度
    页表长度一般指有多少页
    页表项长度一般指页地址占多大的存储空间
    物理地址E=块内内容b
    页面大小L+页内偏移量W
    注:
    页表项的确定:
    n位逻辑地址空间对应的2^nB除以一页的大小mB
    得到的u=2^n/m页,页表项以字节编址,因此页表项大于等于log(u)/8

    +

    快表

    在地址转换机构中添加一个具有并行查找能力的高速缓冲存储器。

    +

    段式管理

    分段

    按进程中的自然段划分逻辑空间
    其逻辑地址由段号s——段内偏移量w组成
    段内连续,段间不要求连续

    +

    段表

    | 段号 | 段长 | 本段在主存中的地址 |
    | 段号 | 始址 | 长度 | 存取方式 | 内外 | 访问位 |

    +

    地址变换结构

      +
    • 逻辑地址A中前几位为段号S,后几位为段内偏移量W
    • +
    • 比较段号S和段表长度M,if(S>=M)越界中断
    • +
    • 段号S对应的段表项地址=段表始址F+段号S*段表项长度
    • +
    • 取出段表中该段的始址b,计算物理地址E=b+W
    • +
    +

    段的共享与保护

    都指向被共享的段的同一个物理副本。不能修改的代码成为纯代码或可重入代码(不属于临界资源)
    保护方法一般有两种:

    +
      +
    1. 存取控制
    2. +
    3. 地址越界保护
    4. +
    +

    段业式管理

    | 段号 | 页号 | 页内相对地址(偏移量) |
    在一个进程中,段表只有一个,而页表可能有多个

    +

    虚拟内存管理

    需要的支持

      +
    1. 页表机制(或段表机制),作为主要的数据结构
    2. +
    3. 中断机制,当用户程序要访问的部分尚未调入内存时,产生中断
    4. +
    5. 地址变换机构,逻辑地址到物理地址
    6. +
    +

    请求页表机制

    页表项
    | 页号 | 物理块号 | 状态位P | 访问字段A | 修改位M | 外存地址 |

    +
      +
    • 状态位P:用于指示是否调入内存
    • +
    • 访问字段A:用于页面置换
    • +
    • 修改位M:标识调入内存后是否被修改过
    • +
    • 外存地址:支持该页在外存上的地址,通常是物理块号
    • +
    +

    缺页中断机构

    缺页中断后,进程进入阻塞。
    属于内部中断

    +

    页面置换算法

    最佳置换算法(OPT)

    淘汰一个最长时间内不再被访问的页
    无法实现

    +

    先进先出页面置换算法(FIFO)

    会产生所分配的物理块数增大而故障数不减反增的异常现象(Belady异常)
    基于队列实现

    +

    最近最久未使用置换算法

    堆栈类算法

    +

    时钟(clock)置换算法

    每帧关联一个附加位(使用位)

    +

    改进的clock算法:

    增加一个修改位
    每帧有四种情况:

    +
      +
    1. 最近未被访问,也未被修改(u=0,m=0)
    2. +
    3. 最近被访问,但未被修改(u=1,m=0)
    4. +
    5. 最近位被访问,但被修改 (u=0,m=1)
    6. +
    7. 最近被访问,被修改 (u=1,m=1)
      按以上顺序进行淘汰
    8. +
    +

    页面分配策略

    驻留集大小

    三种策略

    +
      +
    1. 固定分配局部置换
    2. +
    3. 可变分配全局置换
    4. +
    5. 可变分配局部置换
    6. +
    +

    调入的时机

      +
    1. 预调页策略
    2. +
    3. 请求调页策略
    4. +
    +

    从何处调页

    请求分页系统的外存分为

    +
      +
    • 存放文件的文件区(连续分配方式)
    • +
    • 存放对换页面的对换区 (离散分配方式) IO更快
    • +
    +

    调入时机

      +
    1. 系统拥有足够的对换区空间:全部从对换区调入
    2. +
    3. 系统缺少足够的对换区空间:凡不会被修改的文件直接从文件区调入,可能被修改的文件在换出时调入对换区,以后需要的时候直接从对换区调入
    4. +
    5. UNXI方式:与进程有关的放入文件区。运行过被换出的页面放在对换区。进程请求的共享页面若被其他进程调入内存,则无需再从对换区调入
    6. +
    +

    抖动

    频繁发生缺页中断(抖动)的原因:某个进程频繁访问的页面数目高于可用的物理页帧数。
    虚拟内存技术可以在内存中保留更多的进程以提高系统效率。

    +

    工作集

    某段时间间隔内,进程要访问的页面集合。
    工作集大小一般比工作集窗口小很多
    分配给进程的物理块数(驻留集大小)大小要大于工作集大小

    +

    文件的一些概念

    定义

    以计算机硬盘为载体的储存在计算机上的信息的集合。
    计算机进行资源的调度和分配:进程
    用户进行的输入、输出中的基本单位:文件

    +

    文件的属性

      +
    • 名称
    • +
    • 标识符
    • +
    • 类型
    • +
    • 位置
    • +
    • 大小
    • +
    • 保护
    • +
    • 时间
    • +
    +

    文件的基本操作

      +
    • 创建文件
    • +
    • 写文件
    • +
    • 读文件
    • +
    • 文件重定位(文件寻址)
    • +
    • 删除文件
    • +
    • 截断文件
    • +
    +

    文件的分类

    按性质和用途

      +
    • 系统文件
    • +
    • 库文件
    • +
    • 用户文件
    • +
    +

    按组织形式

      +
    • 普通文件
    • +
    • 目录文件
    • +
    • 特殊文件
    • +
    +

    文件的打开与关闭

    打开文件相关联的信息:

    +
      +
    • 文件指针 系统跟踪上次读写位置,作为当前文件位置的指针
    • +
    • 文件打开计数 计数为零时,系统关闭文件,删除该条目
    • +
    • 文件磁盘位置
    • +
    • 访问权限
    • +
    +

    文件的逻辑结构

    无文件结构(流式文件)

    以字节Byte为单位

    +

    访问通过穷举搜索方式

    +

    源程序文件、目标代码文件等采用这种方式

    +

    有文件结构(记录式文件)

    顺序文件

    记录定长

    +

    顺序存储或链表形式存储

    +

    顺序搜索

    +

    两种结构:

    +
      +
    • 串结构 记录之间的顺序与关键字无关 按时间先后排序
    • +
    • 顺序结构 按关键字排序
    • +
    +

    索引文件

    第i条记录相对于第一条记录的地址 A=i*L

    +

    索引表

    + + + + + + + + + + + + + +
    索引号长度m指针ptr
    0m
    +

    索引顺序文件

    将每组中的第一个文件放在索引表中

    +

    直接文件或散列文件

    没有顺序的特性

    +

    存取方法

    线性搜索法

    散列法

    二分搜索法

    文件的物理结构和存储设备

    连续文件(连续分配)

    一旦知道文件在文件存储设备上的起始地址和文件长度就能很快的进行物理存取。
    反复增删后会产生外部碎片

    +

    串联文件(链接分配)

    搜索效率低。

    +

    隐式链接分配

    显式链接分配

    创建文件分配表(FAT),用于存放链接文件各物理块的指针。

    +

    索引文件(索引分配)

    把每个文件的所有盘块号都集中放到一起构成索引块(表)

    +

    处理索引块的问题

      +
    1. 链接方案 将多个索引块链接
    2. +
    3. 多层索引
    4. +
    5. 混合索引
    6. +
    +

    文件存储设备

    顺序存储设备

    磁带 磁带的两个相邻物理块之间有间隙让他提前加速和不停止

    +
    存取速度的的因素
      +
    1. 信息密度(字符数/英寸)
    2. +
    3. 磁带带速(英寸/秒)
    4. +
    5. 块间间隙
      信息密度大、块间间隙小、带速高,存取快。
    6. +
    +

    直接存储设备

    磁盘

    +

    文件存储空间管理

    一般一个问价存储在一个文件卷中,文件卷可以是磁盘的一部分,也可以是整个物理盘。

    +

    空闲文件目录(空闲表)

    空闲盘块表

    + + + + + + + + + + + + + + + + + + + + + + + +
    序号第一个空闲盘块号空闲盘块数
    124
    293
    适用于连续文件结构的文件存储区的分配与回收
    +

    空闲块链

    分类

    +
      +
    • 空闲盘块链
    • +
    • 空闲盘区链
    • +
    +

    常用的链接方法

      +
    • 按空闲区大小顺序链接
    • +
    • 按释放先后循序链接
    • +
    • 成组链法
    • +
    +

    位示图

    盘块的分配

      +
    1. 顺序扫描位示图,找到一个或一组“0”
    2. +
    3. 若“0”位于第i行,第j列,对应的盘块b=n(i -1)+j
    4. +
    5. 修改位示图“0”变“1”
    6. +
    +

    盘块回收

    i=(b-1)/n +1
    j=(b-1)%n +1

    +

    目录结构

    文件控制块FCB

    FCB必须连续存放

    +

    FCB的有序集合称为文件目录

    +

    FCB包含的信息:

    +
      +
    1. 基本信息
    2. +
    3. 存取控制信息 文件存取权限等
    4. +
    5. 使用信息 文件建立时间、修改时间
    6. +
    +

    索引结点

    UNXI中的磁盘索引结点包含信息:

    +
      +
    1. 文件主标识符 个人或小组
    2. +
    3. 文件类型 普通文件、目录文件、特别文件
    4. +
    5. 文件存取权限
    6. +
    7. 文件物理地址 13个地址项iaddr(0)~iaddr(12)
    8. +
    9. 文件长度 以字节为单位
    10. +
    11. 文件链接计数
    12. +
    13. 文件存取时间
    14. +
    +

    文件被打开时有增加了以下内容:

    +
      +
    • 索引结点编号 标识内存索引结点
    • +
    • 状态 指示是否上锁或被修改
    • +
    • 访问计数
    • +
    • 逻辑设备号
    • +
    • 链接指针
    • +
    +

    目录结构

    所要执行的操作

    +
      +
    • 搜索
    • +
    • 创建文件
    • +
    • 删除文件
    • +
    • 显示目录
    • +
    • 修改目录
    • +
    +

    单级目录结构

    一个文件占一个目录

    +

    两级目录结构

    主文件目录MFD

    记录用户文件目录所在位置和用户名

    +
    用户文件目录UFD

    用户文件的FCB

    +

    多级目录结构

    树形目录结构

    +

    从根目录出发的路径是绝对路径

    +

    当前目录 :基于当前工作目录(相对路径)

    +

    方便对文件分类

    +

    无环图目录结构

    树形目录结构的基础上增加了一些指向同一结点的有向边

    +

    实现文件共享

    +

    目录实现

    线性列表

    最简单的方法:使用存储文件名和数据指针的线性表

    +

    哈希表

    根据文件名,得到一个值,并返回一个指向线性列表中元素的指针。

    +

    文件共享

    从系统管理的角度,三种方法实现文件共享

      +
    1. 绕道法
    2. +
    3. 链接法
    4. +
    5. 基本文件目录表
    6. +
    +

    现代常用的两种共享方法

    基于索引结点的共享方式(硬链接)

    树形结构中,当有两个或多个用户要共享一个子目录或文件时,必须将共享文件或子目录链接到两个或多个用户的目录中。

    +

    利用符号链实现文件共享(软链接)

    创建一个LINK类型的新文件,B用户借助该文件实现对A用户的F文件的共享,新文件也取名F,其中存放F的路径名,视为符号链。

    +

    硬链接和软链接都是静态共享方法。

    +

    文件保护

    文件的保护方式有口令保护、加密保护、访问控制等。

    +

    存取控制

    存取控制分三个步骤

      +
    1. 审定用户的存取权限
    2. +
    3. 比较用户权限与用户的本次存取要求是否一致
    4. +
    5. 将存取要求和被访问文件的保密性比较,看是否有冲突
    6. +
    +

    四种方式来验证用户的存取

    1. 存取控制矩阵

    二维矩阵,一维是所有的用户,一维是所有的文件。
    对应的矩阵元素是用户对文件的存取权限,包括读R,写W,执行E。

    +
    2. 存取控制表

    (访问控制表)
    规定每个用户名和其所允许的访问类型
    精简的表分三种用户类型

    +
      +
    • 拥有者
    • +
    • +
    • 其他
    • +
    +
    3. 口令

    分两种

    +
      +
    • 一种是当用户进入系统时,为建立终端进程时获得操作系统使用权的口令
    • +
    • 另一种是每一个用户创建文件夹时,为每一个创建的文件设置一个口令,并将其置于文件说明中。
    • +
    +
    4. 密码术

    比口令方式保密性好

    +

    文件系统的结构层次模型

    用户接口(系统调用)——符号文件系统SFD(文件名—>文件标识符fd)——基本文件系统BFD(由fd—>获得控制信息)——存取控制验证(合法性检查)——逻辑文件系统(逻辑块号—>相对块号)——物理文件系统(相对块号—>物理块号)——存储设备分配 或 设备策略模块(物理块号—>设备要求的地址格式)——启动IO

    +

    磁盘调度算法

    一次磁盘读写操作的时间由寻道时间、旋转延迟和传输时间决定。

    +
      +
    • 寻道时间Ts=与磁盘转速有关的常数m*n条磁道+启动磁臂的时间s,其中m约等于0.2ms,s约等于2ms
    • +
    • 旋转延迟时间Tr=1/2*磁盘旋转速度r 5400转的磁盘一周11.1ms,Tr为5.55ms
    • +
    • 传输时间Tt=每次所读写的字节数b/(磁盘每秒转速r*一个磁道上的字节数N)
    • +
    • 总平均存取时间Ta=Ts+Tr+Tt
    • +
    +

    磁盘调度算法

    先来先服务FCFS

    寻找先来的

    +

    最短寻找时间优先SSTF

    寻找离最近的

    +

    扫描算法SCAN

    (电梯调度)
    走到头(磁盘的最远端)再回头

    +

    循环扫描C-SCAN

    走到头再回头+只沿一个方向走

    +

    LOOK C-LOOK

    与SCAN和C-SCAN类似
    但是走到最远端的请求就回头

    +

    设文件索引结点中有7个地址项,其中4个地址项是直接地址索引,2个地址项是一级间接地址索引,1个地址项是二级间接地址索引,每个地址项大小为4B,若磁盘索引块和磁盘数据块大小均为256B,则可表示单个文件的最大长度为()
    4个直接地址索引指向的数据块大小为4256B。
    每个磁盘索引块有256/4=64个地址项。
    2个一级间接索引包含2
    64个地址项,所指向的数据块大小为264256B
    1个二级索引指向的数据块大小为16464256B
    最大长度为(4+2
    64+26464)*256B

    +

    簇大小相当于磁盘索引块大小
    4KB的簇可放4K/4=1024个4B的地址项
    可表示的文件的总个数受限于文件索引结点的总个数
    所以在计算最多存多少文件的时候除了考虑簇大小,还应考虑文件索引结点的总个数。
    如每个文件索引结点占64B,文件系统用1M个簇存放文件索引结点,512M个簇存放文件数据,文件大小为5600B,则索引总个数为1M*4KB/64B=65M,簇占4KB一个文件占2个簇,512M个簇可存放256M个文件。则最后最多存放64M个文件。

    +

    IO设备

    按使用特性分

      +
    • 人机交互类外部设备
    • +
    • 存储设备
    • +
    • 网络通信设备
    • +
    +

    按传输速率分

      +
    • 低速设备 每秒几字节到几百字节
    • +
    • 中速设备 每秒数千字节到上万字节
    • +
    • 高速设备 每秒数百千字节到千兆字节
    • +
    +

    按信息交换单位分

      +
    • 块设备
    • +
    • 字符设备
    • +
    +

    IO控制方式

    程序直接控制方式

    CPU与IO只能串行工作

    +

    中断驱动方式

    允许IO设备主动打断CPU的运行并请求服务

    +

    DMA

    在IO设备和内存之间开辟直接的数据交换通路 ,彻底解放CPU。

    +

    特点

      +
    • 基本单位是数据块
    • +
    • 数据从设备直接送入内存
    • +
    • 整块数据的传送都是在DMA控制器下控制的
    • +
    +

    必须的寄存器

      +
    • 命令/状态寄存器(CR)存放控制信息,或设备状态
    • +
    • 内存地址寄存器(MAR)设备到内存的起始目标地址和内存到设备的内存源地址
    • +
    • 数据寄存器(DR) 暂存数据
    • +
    • 数据寄存器(DC) 存放本次要传送的字节数
    • +
    +

    通道控制方式

    专门负责IO的处理机。
    可实现CPU、通道、IO设备的并行工作。

    +

    IO子系统的层次结构

    用户层IO软件

    实现与用户交互的接口 提供与IO有关的库函数。

    +

    设备独立性软件

    实现用户程序与设备驱动器的统一接口、设备命令、设备保护以及设备分配与释放等。
    将逻辑设备名映射为物理设备名(通过LUT)

    +

    好处

      +
    • 增加设备分配灵活性
    • +
    • 易于实现IO重定向
    • +
    +

    其主要功能

      +
    • 指向所有设备的公有操作
    • +
    • 向用户层提供统一接口
    • +
    +

    设备驱动程序

    具体实现系统对设备发出的操作指令,驱动IO设备工作的驱动程序

    +

    中断处理程序

    用于保存被中断进程的CPU环境。切换上下文、中断信号源测试、读取设备状态、修改进程状态。

    +

    硬件

    机械部件

    设备本身

    +

    电子部件

    设备控制器(适配器)

    +
    主要功能
      +
    • 接受和识别CPU指令
    • +
    • 实现数据交换
    • +
    • 发现和记录设备及自身的状态信息
    • +
    • 设备地址识别
    • +
    +
    组成
      +
    • 设备控制器与CPU的接口:数据线、地址线、控制线
    • +
    • 设备控制器与设备的接口
    • +
    • IO控制逻辑
    • +
    +

    缓冲

    目的

      +
    1. 减少CPU与IO设备间速度不匹配矛盾
    2. +
    3. 减少CPU中断频率
    4. +
    5. 解决基本数据单元大小不匹配问题
    6. +
    7. 提高CPU与IO之间的并行行
    8. +
    +

    实现方法

      +
    • 采用硬件缓冲器
    • +
    • 采用缓冲区(位于内存)
    • +
    +

    缓冲种类

    单缓冲

    设备和处理机之间设置一个缓冲区。

    +

    双缓冲

    因为CPU在传送中存在空闲状态,引入双缓冲。

    +

    循环缓冲

    最后一个缓冲区指针指向第一个缓冲区

    +

    缓冲池

    多个系统公用的缓冲区组成,形成 空缓冲队列装满输入数据的缓冲队列(输入队列)和装满输出数据的缓冲队列(输出队列)
    缓冲首部:设备号——数据块号——缓冲器号——互斥标识符——链接指针

    +

    设备的分配与回收

    按设备的分配特性分类

    独占式使用设备
    分时式共享使用设备
    以SPOOLing方式使用外部设备

    +

    设备分配的数据结构

    设备控制表DCT

    内容
      +
    • 设备标识符
    • +
    • 设备类型
    • +
    • 设备地址或设备号
    • +
    • 设备状态
    • +
    • 等待队列指针
    • +
    • IO控制器指针
    • +
    +

    通道控制表CHCT

    内容
      +
    • 通道标识符
    • +
    • 通道忙/闲标识
    • +
    • 等待队列的首/尾指针
    • +
    +

    控制器控制表COCT

    反映IO控制器的使用状态及与通道的连接情况等

    +

    系统设备表SDT

    内容
      +
    • DCT指针
    • +
    • 正在使用进程标识符
    • +
    • 设备类型和设备标识符
    • +
    +

    设备分配的策略

    设备分配原则

    又要效率又减少死锁还要独立

    +

    分配方式

    静态分配
    动态分配

    +

    设备分配算法

    先请求先分配
    优先级高者分配

    +

    安全性

    安全分配方式

    每当有IO请求时进入阻塞,直到IO结束被唤醒

    +

    不安全分配方式

    进程在IO请求后继续运行

    +

    逻辑设备名到物理设备名的映射

    通过逻辑设备表LUT

    +

    SPOOLing

    (假脱机技术)

    +

    输入输出井

    输入缓冲区和输出缓冲区

    输入进程和输出进程

    特点

    提高了IO速度,将独占设备改造成共享设备,实现了虚拟设备功能。

    +
    Author: SHYEE
    Link: http://example.com/2021/03/12/2021-03-21(1)/
    Copyright Notice: All articles in this blog are licensed under CC BY-NC-SA 4.0 unless stating additionally.
    Announcement
    等离子体实验室
    Catalog
    1. 1. 进程管理
      1. 1.1. 程序的并发执行
      2. 1.2. 进程
        1. 1.2.1. 特点:
        2. 1.2.2. 进程的组成:
          1. 1.2.2.1. 进程控制块PCB:
          2. 1.2.2.2. 程序
          3. 1.2.2.3. 数据
        3. 1.2.3. 进程的状态
        4. 1.2.4. 进程切换
        5. 1.2.5. 进程的创建
        6. 1.2.6. 进程的撤销
        7. 1.2.7. 进程的通信
          1. 1.2.7.1. 主从式
          2. 1.2.7.2. 会话式
          3. 1.2.7.3. 消息或邮箱机制
          4. 1.2.7.4. 共享存储区方式
          5. 1.2.7.5. 管道通信
      3. 1.3. 临界区
      4. 1.4. 实现互斥
        1. 1.4.1. 软件方法
        2. 1.4.2. 硬件实现方法
        3. 1.4.3. 信号量
        4. 1.4.4. 管程
        5. 1.4.5. 经典同步问题
          1. 1.4.5.1. 生产者消费者问题
          2. 1.4.5.2. 读者-写者问题
          3. 1.4.5.3. 哲学家问题
    2. 2. 死锁
      1. 2.1. 死锁的原因
      2. 2.2. 死锁的预防
      3. 2.3. 死锁避免
      4. 2.4. 死锁的检测和排除
    3. 3. 线程
      1. 3.1. 典型应用
      2. 3.2. 多线程模型
        1. 3.2.1. 多对一
        2. 3.2.2. 一对一
        3. 3.2.3. 多对多
    4. 4. 中断技术
      1. 4.0.1. 外中断(中断或者异步中断)
      2. 4.0.2. 内中断(异常或同步中断)
      3. 4.0.3. 中断的执行过程
    5. 4.1. 中断事件处理
      1. 4.1.1. 硬件故障中断
        1. 4.1.1.1. 处理过程
      2. 4.1.2. 程序性中断
        1. 4.1.2.1. 处理过程
      3. 4.1.3. I/O中断
        1. 4.1.3.1. 处理原则
      4. 4.1.4. 访管中断
        1. 4.1.4.1. 处理过程
      5. 4.1.5. 时钟中断
        1. 4.1.5.1. 间隔定时器:
  • 5. 系统调用
    1. 5.1. 分类
    2. 5.2. 要运行在核心态
    3. 5.3. 用户态转向核心态
    4. 5.4. 主要过程
  • 6. 大内核与微内核
    1. 6.1. 大内核的好处
    2. 6.2. 微内核的特点
  • 7. 处理机调度
    1. 7.1. 分级调度
    2. 7.2. 进程调度方式
    3. 7.3. 调度的基本准则
    4. 7.4. 进程调度
      1. 7.4.1. 功能
      2. 7.4.2. 进程调度的时机
        1. 7.4.2.1. UNIX中
    5. 7.5. 调度算法
      1. 7.5.1. 先来先服务算法FIFS
      2. 7.5.2. 短作业优先调度算法SJF
      3. 7.5.3. 优先级调度算法
      4. 7.5.4. 优先级的设置参照原则
      5. 7.5.5. 高响应比优先调度算法
      6. 7.5.6. 时间片轮转调度算法
      7. 7.5.7. 多级反馈队列调度算法
        1. 7.5.7.1. 优势
    6. 7.6. 实时调度
      1. 7.6.1. 要求:
      2. 7.6.2. 分类:
      3. 7.6.3. 实现调度算法
      4. 7.6.4. 频率单调调度算法
  • 8. 内存管理基本原理
    1. 8.1. 功能
      1. 8.1.1. 1. 虚拟存储器
      2. 8.1.2. 2. 地址变换
      3. 8.1.3. 3. 内外存数据传输的控制
      4. 8.1.4. 4. 内存的分配与回收
        1. 8.1.4.1. 连续分配方式
      5. 8.1.5. 5. 内存信息的共享与保护
        1. 8.1.5.1. 常用的内存信息保护方法:
        2. 8.1.5.2. 程序链接的三种方式:
        3. 8.1.5.3. 装入的的三种方法:
  • 9. 页式管理
    1. 9.1. 名词
    2. 9.2. 地址结构
    3. 9.3. 页表
    4. 9.4. 计算过程
    5. 9.5. 快表
  • 10. 段式管理
    1. 10.1. 分段
    2. 10.2. 段表
    3. 10.3. 地址变换结构
    4. 10.4. 段的共享与保护
  • 11. 段业式管理
  • 12. 虚拟内存管理
    1. 12.1. 需要的支持
    2. 12.2. 请求页表机制
    3. 12.3. 缺页中断机构
  • 13. 页面置换算法
    1. 13.1. 最佳置换算法(OPT)
    2. 13.2. 先进先出页面置换算法(FIFO)
    3. 13.3. 最近最久未使用置换算法
    4. 13.4. 时钟(clock)置换算法
      1. 13.4.1. 改进的clock算法:
  • 14. 页面分配策略
    1. 14.1. 驻留集大小
    2. 14.2. 调入的时机
    3. 14.3. 从何处调页
      1. 14.3.1. 调入时机
  • 15. 抖动
  • 16. 工作集
  • 17. 文件的一些概念
    1. 17.1. 定义
    2. 17.2. 文件的属性
    3. 17.3. 文件的基本操作
    4. 17.4. 文件的分类
      1. 17.4.1. 按性质和用途
      2. 17.4.2. 按组织形式
    5. 17.5. 文件的打开与关闭
  • 18. 文件的逻辑结构
    1. 18.1. 无文件结构(流式文件)
    2. 18.2. 有文件结构(记录式文件)
      1. 18.2.1. 顺序文件
      2. 18.2.2. 索引文件
      3. 18.2.3. 索引顺序文件
      4. 18.2.4. 直接文件或散列文件
    3. 18.3. 存取方法
      1. 18.3.1. 线性搜索法
      2. 18.3.2. 散列法
      3. 18.3.3. 二分搜索法
  • 19. 文件的物理结构和存储设备
    1. 19.1. 连续文件(连续分配)
    2. 19.2. 串联文件(链接分配)
      1. 19.2.1. 隐式链接分配
      2. 19.2.2. 显式链接分配
    3. 19.3. 索引文件(索引分配)
      1. 19.3.1. 处理索引块的问题
    4. 19.4. 文件存储设备
      1. 19.4.1. 顺序存储设备
        1. 19.4.1.1. 存取速度的的因素
      2. 19.4.2. 直接存储设备
  • 20. 文件存储空间管理
    1. 20.1. 空闲文件目录(空闲表)
    2. 20.2. 空闲块链
      1. 20.2.1. 常用的链接方法
    3. 20.3. 位示图
      1. 20.3.1. 盘块的分配
      2. 20.3.2. 盘块回收
  • 21. 目录结构
    1. 21.1. 文件控制块FCB
    2. 21.2. 索引结点
    3. 21.3. 目录结构
      1. 21.3.1. 单级目录结构
      2. 21.3.2. 两级目录结构
        1. 21.3.2.1. 主文件目录MFD
        2. 21.3.2.2. 用户文件目录UFD
      3. 21.3.3. 多级目录结构
      4. 21.3.4. 无环图目录结构
  • 22. 目录实现
    1. 22.1. 线性列表
    2. 22.2. 哈希表
  • 23. 文件共享
    1. 23.1. 从系统管理的角度,三种方法实现文件共享
    2. 23.2. 现代常用的两种共享方法
      1. 23.2.1. 基于索引结点的共享方式(硬链接)
      2. 23.2.2. 利用符号链实现文件共享(软链接)
      3. 23.2.3.
  • 24. 文件保护
    1. 24.1. 存取控制
      1. 24.1.1. 存取控制分三个步骤
      2. 24.1.2. 四种方式来验证用户的存取
        1. 24.1.2.1. 1. 存取控制矩阵
        2. 24.1.2.2. 2. 存取控制表
        3. 24.1.2.3. 3. 口令
        4. 24.1.2.4. 4. 密码术
  • 25. 文件系统的结构层次模型
  • 26. 磁盘调度算法
    1. 26.1. 磁盘调度算法
      1. 26.1.1. 先来先服务FCFS
      2. 26.1.2. 最短寻找时间优先SSTF
      3. 26.1.3. 扫描算法SCAN
      4. 26.1.4. 循环扫描C-SCAN
      5. 26.1.5. LOOK C-LOOK
  • 27. IO设备
    1. 27.1. 按使用特性分
    2. 27.2. 按传输速率分
    3. 27.3. 按信息交换单位分
  • 28. IO控制方式
    1. 28.1. 程序直接控制方式
    2. 28.2. 中断驱动方式
    3. 28.3. DMA
      1. 28.3.1. 特点
      2. 28.3.2. 必须的寄存器
    4. 28.4. 通道控制方式
  • 29. IO子系统的层次结构
    1. 29.1. 用户层IO软件
    2. 29.2. 设备独立性软件
      1. 29.2.1. 好处
      2. 29.2.2. 其主要功能
    3. 29.3. 设备驱动程序
    4. 29.4. 中断处理程序
    5. 29.5. 硬件
      1. 29.5.1. 机械部件
      2. 29.5.2. 电子部件
        1. 29.5.2.1. 主要功能
        2. 29.5.2.2. 组成
  • 30. 缓冲
    1. 30.1. 目的
    2. 30.2. 实现方法
    3. 30.3. 缓冲种类
      1. 30.3.1. 单缓冲
      2. 30.3.2. 双缓冲
      3. 30.3.3. 循环缓冲
      4. 30.3.4. 缓冲池
  • 31. 设备的分配与回收
    1. 31.1. 按设备的分配特性分类
    2. 31.2. 设备分配的数据结构
      1. 31.2.1. 设备控制表DCT
        1. 31.2.1.1. 内容
      2. 31.2.2. 通道控制表CHCT
        1. 31.2.2.1. 内容
      3. 31.2.3. 控制器控制表COCT
      4. 31.2.4. 系统设备表SDT
        1. 31.2.4.1. 内容
    3. 31.3. 设备分配的策略
      1. 31.3.1. 设备分配原则
      2. 31.3.2. 分配方式
      3. 31.3.3. 设备分配算法
    4. 31.4. 安全性
      1. 31.4.1. 安全分配方式
      2. 31.4.2. 不安全分配方式
    5. 31.5. 逻辑设备名到物理设备名的映射
  • 32. SPOOLing
    1. 32.1. 输入输出井
    2. 32.2. 输入缓冲区和输出缓冲区
    3. 32.3. 输入进程和输出进程
    4. 32.4. 特点
  • Recent Post
    \ No newline at end of file diff --git "a/2021/03/12/Bean\347\232\204\344\275\234\347\224\250\345\237\237/index.html" "b/2021/03/12/Bean\347\232\204\344\275\234\347\224\250\345\237\237/index.html" new file mode 100644 index 0000000..78aafee --- /dev/null +++ "b/2021/03/12/Bean\347\232\204\344\275\234\347\224\250\345\237\237/index.html" @@ -0,0 +1,253 @@ +Bean的作用域 | SHYEE-PLASMA + + + + + + + + + + + + + +

    Bean的作用域

    Bean的作用域

    + +
    +

    作用域

    singleton

    +

    单例(默认值), 在每个SpringIOC容器中,一个bean定义对应一个对象实例

    +

    prototype

    +

    一个bean定义对应多个对象实例

    +

    request

    +

    在一次HTTP请求中,一个bean定义对应一-个实例,即每次HTTP请求将会有各自的bean实例,它们依据某个bean定义创建而成。该作用域仅在基于Web的Spring ApplicationContext的情况下有效。

    +

    session

    +

    在一个HTTP Session 中,一个bean定义对应一个实例。该作用域仅在基于Web 的SpringApplicationContext的情况下有效

    +

    global session

    +

    在一个全局的HTTP Session中,一个bean定义对应一个实例。典型情况下,仅在使用portlet context的时候有效。该作用域仅在基于Web的Spring ApplicationContext的情况下有效

    +
    +

    注解形式

    +
    1
    @Bean ("stu")
    + +

    配置文件形式

    +
    1
    2
    3
    4
    5
    6
    7
    8
    <bean id="student" class=" com.ehshyee.entity.Student">
    value :简单类型
    <property name="stuNo"value="1"></property>
    <property name="stuName" value="张三"></property>
    <property name="stuAge" value="23"></ property>
    ref:其他类型
    <property name="address" ref="myaddress"></property>
    </bean>
    + +

    分别对其获取两个学生 查看是否为同一个

    +
    1
    2
    3
    Student stul = (Student) context.getBean(S:"student") ;
    Student stu2 = (Student) context.getBean(S:"student") ;
    System.out.println(stul =stu2) ;
    + +

    均返回true

    +

    在xml中scope默认是singleton 可改为prototype

    +
    1
    <bean id="student" class=" top.ehshyee.entity.Student" scope="prototype">
    + +

    改后返回false

    +

    注解中添加

    +
    1
    @scope("prototype")//默认singleton
    + +

    对于实例产生的时机

    +

    一些测试

    +
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    public Student() {
    System.out.println("student无参构造") ;
    }
    public Student(int stuNo, String stuName, int stuAge) {
    super();
    this.stuNo = stuNo;
    this.stuName = stuName;
    this.stuAge = stuAge;
    //有参构造
    }
    + + +

    singleton | prototype

    +

    执行时机(产生bean的时机) :

    +

    default)singleton:容器在初始化时,就会创建对象(唯一的一个);以后再getBean时,不再产生新的bean.singleton也支持延迟加载(懒加载) :在第一次使用时产生。

    +

    prototype:容器在初始化时,不创建对象;只是在每次使用时(每次从容器获取对象时,context.getBean(Xxxx)),再创建对象,并且,每次getBean()都会创建一个新的对象。

    +

    延迟加载(注解形式)

    +
    1
    @lazy
    + +

    条件注解 –>SpringBoot

    可以让某一个Bean在某些条件下加入Ioc容器,其他情况下不加IoC容器。

    +

    a.准备bean

    +
    1
    2
    3
    4
    5
    6
    7
    public interface Car {

    }
    public class EnegerCar implements Car {
    }
    public class OilCar implements Car{
    }
    + +

    b.增加条件Bean:给每个Bean设置条件,必须实现Condition接口

    +
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    public class OilCarCondition implements Condition {
    @Override
    public boolean matches(ConditionContext conditionContext, AnnotatedTypeMetadata annotatedTypeMetadata) {
    //如果当前环境的车类型是Oil,则加入OilCar
    //获取环境
    Environment environment=conditionContext.getEnvironment();
    String carType=environment.getProperty("car.type");

    return carType.contains("oil");
    }
    }
    public class EnergyCarCondition implements Condition {
    @Override
    public boolean matches(ConditionContext conditionContext, AnnotatedTypeMetadata annotatedTypeMetadata) {
    //如果当前环境的车类型是energy,则加入energyCar
    //获取环境
    Environment environment = conditionContext.getEnvironment();
    String carType = environment.getProperty("car.type");

    return carType.contains("energy");
    }
    }
    + +

    c.根据条件加入IOC容器

    +
    1
    2
    3
    4
    5
    6
    7
    8
    @Bean
    @Conditional (OilCarCondition.class)
    public Car oilCar ()
    {return new oilCar()}
    @Bean
    @Conditional (EnergyCarCondition.class)
    public Car energyCar ()
    {return new EnergyCar ()}
    + +

    测试

    +

    在VM option中添加参数为oil-Dcar.type=oil

    +
    1
    2
    3
    4
    5
    6
    7
    public static void testAnnotation {
    //注解方式
    ApplicationContext context = new AnnotationConfigApplicationContext (MyConfig.class);
    String[] beanDefinitionNames = context.getBeanDefinitionNames();
    for (String name : beanDefinitionNames) {
    System.out.println(name) ;
    }}
    + +

    给IoC加入Bean的方法

    注解:

    +

    ​ 三层组件: 扫描器+三层注解

    +

    ​ 非三层组件@Confiquration:

    +
      +
    1. @Bean+返回值
    2. +
    3. @import
    4. +
    5. FactoryBean(工厂 Bean)
    6. +
    +

    @import使用:

    ①直接编写到@Import中

    +
    1
    2
    3
    @Confiquration
    @Import ( {Apple.class, Banana.class} )
    //bean是id 是全类名
    + +

    ②自定义ImportSelector接口的实现类,通过selectimports方法实现,方法的返回值就是要纳入IoC容器的Bean),并告知系统自己编写的实现类。

    +
    1
    2
    3
    4
    5
    6
    public class MyImportSelector implements ImportSelector {
    @Override
    public String[] selectImports (AnnotationMetadata importingClassMetadata) {
    //return new string[0] ;//返回值就是要加入IOC容器的bean的全类名
    return new String[]{ "top.eshyee.entity.Apple", "top.eshyee.entity.Banana"}
    }
    + +
    1
    @Import(Orage.class,MyImportSelector.class)
    + +

    ③编写ImportBeanDefinitionRegistrar接口的实现类,重写方法

    +
    1
    2
    3
    4
    5
    6
    7
    8
    public class MyImportBeanDefinitionRegistrar implements ImportBeanDefinitionRegistrar{
    @Override
    public void registerBeanDefinitions(AnnotationMetadata importingClassMetadata, BeanDefinitionRegistry registry) {
    BeanDefinition beanDefinition new RootBeanDefinition(Orange.class) ;
    // or BeanDefinition beanDefinition new RootBeanDefinition("top.eshyee.entity.Orange") ;
    registry.registerBeanDefinition("myorange",beanDefinition);
    }
    }
    + +
    1
    @Import(MyImportBeanDefinitionRegistrar)
    + +

    FactoryBean(工厂 Bean)

    写注册类

    +
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    public class MyEactoryBean implements FactoryBean
    {
    @Override
    public Object getobject() throws Exception {

    return new Apple;
    }
    @Override
    public Class<?> getobjectType() {
    return Apple.class ;
    }
    @Override
    public boolean isSingleton() {
    return true;
    }
    }
    + +

    bean中实现

    +
    1
    2
    3
    4
    @Bean
    public FactoryBean<Apple> myFactoryBean() {
    return new MyFactoryBean() ;
    }
    + +

    拿myFactoryBean中的值

    +
    1
    2
    3
    4
    object obj (context. getBean( "myFactoryBean") );
    System.out.println(obj) ;
    object obj (context. getBean( "&myFactoryBean") );
    System.out.println(obj) ;
    + +

    &:不加&获取的是最内部真实的Apple;

    +
    Author: SHYEE
    Link: http://example.com/2021/03/12/Bean%E7%9A%84%E4%BD%9C%E7%94%A8%E5%9F%9F/
    Copyright Notice: All articles in this blog are licensed under CC BY-NC-SA 4.0 unless stating additionally.
    \ No newline at end of file diff --git "a/2021/03/12/C++\345\260\217tips/index.html" "b/2021/03/12/C++\345\260\217tips/index.html" new file mode 100644 index 0000000..4b688e5 --- /dev/null +++ "b/2021/03/12/C++\345\260\217tips/index.html" @@ -0,0 +1,166 @@ +C++小tips | SHYEE-PLASMA + + + + + + + + + + + + +

    C++小tips

    C++小tips

    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
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
    146
    147
    148
    149
    150
    151
    152
    153
    154
    155
    156
    157
    158
    159
    160
    161
    162
    163
    164
    165
    166
    167
    168
    169
    170
    171
    172
    173
    174
    175
    176
    177
    178
    179
    180
    181
    182
    183
    184
    185
    186
    187
    188
    189
    190
    191
    192
    193
    194
    195
    196
    197
    198
    199
    200
    201
    202
    203
    204
    205
    206
    207
    208
    209
    210
    211
    212
    213
    214
    215
    216
    217
    218
    219
    220
    221
    222
    223
    224
    225
    226
    227
    228
    229
    230
    231
    232
    233
    234
    235
    236
    237
    238
    239
    240
    241
    242
    243
    244
    245
    246
    247
    248
    249
    250
    251
    252
    253
    254
    255
    256
    257
    258
    259
    260
    261
    262
    263
    264
    265
    266
    267
    268
    269
    270
    271
    272
    273
    274
    275
    276
    277
    278
    279
    280
    281
    282
    283
    284
    285
    286
    287
    288
    289
    290
    291
    292
    293
    294
    295
    296
    297
    298
    299
    300
    301
    302
    303
    304
    305
    306
    307
    308
    309
    310
    311
    312
    313
    314
    315
    316
    317
    318
    319
    320
    321
    322
    323
    324
    325
    326
    327
    328
    329
    330
    331
    332
    333
    334
    335
    336
    337
    338
    339
    340
    341
    342
    343
    344
    345
    346
    347
    348
    349
    350
    351
    352
    353
    354
    355
    356
    357
    358
    359
    360
    361
    362
    363
    364
    365
    366
    367
    368
    369
    370
    371
    372
    373
    374
    375
    376
    377
    378
    379
    380
    381
    382
    383
    384
    385
    386
    387
    388
    389
    390
    391
    392
    393
    394
    395
    396
    397
    398
    399
    400
    401
    402
    403
    404
    405
    406
    407
    408
    409
    410
    411
    412
    413
    414
    415
    416
    417
    418
    419
    420
    421
    422
    423
    424
    425
    426
    427
    428
    429
    430
    431
    432
    433
    434
    435
    436
    437
    438
    439
    440
    441
    442
    443
    444
    445
    446
    447
    448
    449
    450
    451
    452
    453
    454
    455
    456
    457
    458
    459
    460
    461
    462
    463
    464
    465
    466
    467
    468
    469
    470
    471
    472
    473
    474
    475
    476
    477
    478
    479
    480
    481
    482
    483
    484
    485
    486
    487
    488
    489
    490
    491
    492
    493
    494
    495
    496
    497
    498
    499
    500
    501
    502
    503
    504
    505
    506
    507
    508
    509
    510
    511
    512
    513
    514
    515
    516
    517
    518
    519
    520
    521
    522
    523
    524
    525
    526
    527
    528
    529
    530
    531
    532
    533
    534
    535
    536
    537
    538
    539
    540
    541
    542
    543
    544
    545
    546
    547
    548
    549
    550
    551
    552
    553
    554
    555
    556
    557
    558
    559
    560
    561
    562
    563
    564
    565
    566
    567
    568
    569
    570
    571
    572
    573
    574
    575
    576
    577
    578
    579
    580
    581
    582
    583
    584
    585
    586
    587
    588
    589
    590
    591
    592
    593
    594
    595
    596
    597
    598
    599
    600
    601
    602
    603
    604
    605
    606
    607
    608
    609
    610
    611
    612
    613
    614
    615
    616
    617
    618
    619
    620
    621
    622
    623
    624
    625
    626
    627
    628
    629
    630
    631
    632
    633
    634
    635
    636
    637
    638
    639
    640
    641
    642
    643
    644
    645
    646
    647
    648
    649
    650
    651
    652
    653
    654
    655
    656
    657
    658
    659
    660
    661
    662
    663
    664
    665
    666
    667
    668
    669
    670
    671
    672
    673
    674
    675
    676
    677
    678
    679
    680
    681
    682
    683
    684
    685
    686
    687
    688
    689
    690
    691
    692
    693
    694
    695
    696
    697
    698
    699
    700
    701
    702
    703
    704
    705
    706
    707
    708
    709
    710
    711
    712
    713
    714
    715
    716
    717
    718
    719
    720
    721
    722
    723
    724
    725
    726
    727
    728
    729
    730
    731
    732
    733
    734
    735
    736
    737
    738
    739
    740
    741
    742
    743
    744
    745
    746
    747
    748
    749
    750
    751
    752
    753
    754
    755
    756
    #include<iostream>
    #include<string>
    //#include "swap.h"

    using namespace std;

    //定义常量--第一种方式--宏常量
    #define Pi 3.14

    int numGuess() {
    cout << "猜数字" << endl;
    int uu = 0;
    cin >> uu;
    int num = rand() % 100;
    while (uu != num)
    {
    if (uu > num) {
    cout << "大了" << endl;
    cin >> uu;
    }
    else
    {
    cout << "小了" << endl;
    cin >> uu;
    }
    }
    cout << "猜对了" << endl;
    return uu;
    }

    int foruse(int u) {
    float i = 1.000001;
    for (; i < u; )
    {
    i *= i;
    }
    return i;
    }


    int base() {
    //注释
    cout << "Hello Shyee" << endl;
    /*多行
    注释*/

    //创建变量a
    int a = 10;
    cout << "a= " << a << endl;
    //定义常量的第二种方法--const
    const int Day = 7;
    cout << "Pi= " << Pi << endl;
    cout << "Day= " << Day << endl;
    //Day = 18; 修改常量会报错

    short b = 65536;
    cout << "b=" << b << endl;

    //SizeOf关键字
    //求数据类型站内存的大小

    short num1 = 10;
    cout << "short占内存大小为:" << sizeof(short) << endl;
    cout << "short占内存大小为:" << sizeof(num1) << endl;

    /*
    short[短整型)
    2字节
    (-2^15~2^15 - 1)
    int(整型)
    4字节
    (-2 ^ 31 ~2 ^ 31 - 1)
    long(长整形
    Windows为4字节, Linux为4字节(32位),8字节(64位)
    (-2 ^ 31 ~2 ^ 31 - 1)
    long long(长长整形
    8字节
    (-2 ^ 63 ~2 ^ 63 - 1)
    */

    float f1 = 3.14f;//小数默认时双精度,所以后面加一个f
    double f2 = 3.14;
    cout << "f1:" << f1 << endl;
    cout << "f2:" << f2 << endl;
    //科学计数法
    float f3 = 3e2;//e:10^2
    cout << f3 << endl;
    float f4 = 3e-2;//e:0.1^2
    cout << "f4:" << f4 << endl;

    //字符型
    char ch = 'a';
    cout << "ch占用内存空间:" << sizeof(ch) << endl;
    cout << "a对应的ASCII码" << (int)ch << endl;

    //c中的字符串
    char str1[] = "C String";
    //c++中的字符串

    string str2 = "C++ String";

    cout << str2 << endl;//使用时需要加一个头文件<string>

    //布尔数据
    bool x = true;
    cout << "布尔类型的大小:" << sizeof(x) << endl;

    //数据的输入
    //整形
    int u=0;
    cout << "请给整型变量u进行赋值" << endl;

    cin >> u;
    cout << u << endl;

    //浮点型
    float f = 1.1f;
    cout << "给float进行赋值" << endl;
    //cin >> f;
    cout << f << endl;

    //字符串
    string strl = "";
    cout << "给String进行赋值" << endl;
    //cin >> strl;
    cout << "字符串strl:" << strl << endl;

    //if
    if (u < 45)
    cout << "u小于45" << endl;
    else
    cout << "u不小于45" << endl;
    switch (u)
    {
    case 10:
    cout << "u此时被switch找到" << endl;
    break;
    default:
    cout << "" << endl;
    break;
    }

    while (u<20) {
    u++;
    }
    cout <<"while让u自增到:"<< u << endl;
    //三只小猪称体重
    /*int piga = 0, pigb = 0, pigc = 0;
    cout << "分别输入三个重量" << endl;
    cin >> piga;
    cin >> pigb;
    cin >> pigc;
    string fs = piga > pigb ? (piga > pigc ? "a最重" : "c最重") : (pigb > pigc ? "b最重" : "c最重");
    cout << fs << endl;*/

    //猜数字100以内
    //u=numGuess();

    f = foruse(u);
    cout<<f<<endl;
    system("pause");
    return 0;
    }

    int arraylearn() {
    //数组
    int a[6];
    char c[] = { 's','t','r','i','n','g' };
    for (char i:c) {
    cout << i;
    }
    cout << endl;
    cout << sizeof(a[0]) << endl;
    cout << sizeof(a)<<endl;
    cout << sizeof(a)/ sizeof(a[0])<<"个元素" << endl;
    cout << a << endl;
    cout << &a[0] << endl;
    cout << &a[1] << endl;
    cout << (int)&a[1]-(int)&a[0] << endl;
    //数组是常量
    return 0;
    }
    int fivePigsWeght() {
    int h = 0;
    int a[5];
    for (int i = 0; i < 5;i++) {
    cin >> a[i];
    }
    for (int i:a) {
    h=h < i ? i : h;
    }
    cout << h << endl;
    return h;
    }
    //地址传递
    void swap(int* a, int* b) {
    int* c = 0;
    c = a;
    a = b;
    b = c;

    }
    //引用传递
    void swap01(int& a, int& b) {
    int temp = a;
    a = b;
    b = temp;
    }
    //参数传递
    void swap03(int a, int b) {
    int temp = a;
    a = b;
    b = temp;
    }
    void swap02(int *p1,int *p2) {
    int temp = *p1;
    *p1 = *p2;
    *p2 = *p1;
    }
    //调用swap(&a,&b)可实现地址传递的函数调用
    //值传递不会修改实参
    int arrayResive(int b[]) {
    //int a[] = b;
    int a[] = {1,2,3,4,5,6,7,8,9};
    int f = 0;
    int t = sizeof(a) / sizeof(a[0])-1;
    for (int i:a) {
    cout << i << endl;
    }
    while (f < t) {
    swap(a[f], a[t]);
    f++;
    t--;
    }
    /*for (int i = 0;i< sizeof(a) / sizeof(a[0]);i++) {
    if (f<t) {
    swap(a[f], a[t]);
    f++;
    t--;
    }
    else {
    break;
    }
    }*/
    for (int i : a) {
    cout << i << endl;
    }
    return 0;
    }
    int add(int a,int b) {
    return a + b;
    }
    void helloworld() {
    cout << "hello world" << endl;
    }

    int point() {
    int a = 10;
    int* p;
    p = &a;
    cout << "a的地址为:" << &a << endl;
    cout << "p的值:" << p << endl;
    //指针前加一个*代表解引用,找到指针所指向的内存的数据
    *p = 100;
    cout << a << endl;

    return 0;
    }

    int pointSe() {
    /*在32操作系统下占4个字节
    64位系统占8个字节*/
    int a = 10;
    int* p = &a;
    cout << sizeof(p) << endl;
    return 0;
    }
    int nullpointAndRow() {
    //空指针用于给指针变量进行初始化
    //空指针不可以进行访问
    int* p = NULL;
    //*p = 100;
    //野指针
    int* q = (int*)0x1100;
    cout << *q << endl;
    return 0;
    }

    //const修饰指针
    int constpoint() {
    int a = 20;
    //常量指针
    const int* p = &a;
    /*指针指向可以改
    指针指向的值不可改*/
    //指针常量
    int* const q = &a;
    //指针的指向不可以改
    //指针指向的值可以改

    const int* const x = &a;
    //两者都不能改
    return 0;
    }
    //指针和数组
    int arrpoint() {
    int arr[] = { 1,2,3,4,5,6,7,8,9,10 };
    int* p = arr;
    cout << *p << endl;
    cout << *++p << endl;
    int n = 0;
    //cout << *++p << endl;
    /*while (*p!=NULL)
    {
    n++;
    p++;
    }
    cout <<"n的值为:"<< n << endl;*/
    return 0;
    }
    //冒泡排序
    int bubbleSort(int* a ,int length ) {

    for (int i = 0; i < length-1;i++) {
    for (int j = 0; j < length-i-1;j++) {
    if (*(a+j)>*(a+j+1)) {
    //cout<<"if中的"<< *(a + j + 1) <<endl;
    int temp = *(a + j + 1);
    *(a + j + 1) = *(a + j);
    *(a + j) = temp;
    }
    }
    }
    for (int i =0 ; i < length;i++) {
    cout << *(a + i)<<" ";
    }
    return 0;
    }
    //结构体

    int structLearn() {
    //创建学生类型

    struct Student
    {
    string name;
    int age;
    int score;
    } s3;
    //通过学生类型创建具体的 变量
    //在C++中结构体创建的时候,Struct可以省略
    Student s1;
    s1.name = "李四";
    s1.age = 14;
    s1.score = 90;
    cout << "姓名" << s1.name << "年龄" << s1.age << "成绩" << s1.score << endl;
    struct Student s2{"张三",13,91 };
    cout << "姓名" << s2.name << "年龄" << s2.age << "成绩" << s2.score << endl;
    s3.name = "王五";
    s3.age = 12;
    s3.score = 94;
    cout << "姓名" << s3.name << "年龄" << s3.age << "成绩" << s3.score << endl;
    return 0;

    }

    //结构体数组
    int structArray(){
    //创建结构体
    struct Student
    {
    string name;
    int age;
    int score;
    };
    //创建结构体数组

    struct Student stuArray[3] = {
    {"张三",13,91},
    {"李四",15,93},
    {"王五",14,95}
    };

    stuArray[2].age = 18;
    for (int i = 0; i < 3; i++) {
    cout << "姓名" << stuArray[i].name << "年龄" << stuArray[i].age << "成绩" << stuArray[i].score << endl;
    }
    return 0;
    }

    //结构体指针
    int structPoint() {
    //第一学生的结构体
    struct Student
    {
    string name;
    int age;
    int score;
    };
    //创建结构体变量
    Student s = { "张三",13,91 };
    //通过指针指向结构题变量
    Student* p=&s;
    //通过指针访问结构体变量中的数据
    cout << "姓名:" <<p->name<<endl ;
    cout << "年龄:" << p->age << endl;
    cout << "成绩:" << p->score << endl;
    return 0;
    }
    //结构体嵌套结构体
    int strInStr() {
    struct Student
    {
    string name;
    int age;
    int score;
    }stu1 = {"张三",13,91};
    struct Teacher
    {
    int id;
    string name;
    int age;
    Student stu;
    };
    Teacher t1 = {1,"王五",30,stu1 };
    Teacher* p1 = &t1;
    cout << "姓名:" << p1->name << endl;
    cout << "年龄:" << p1->age << endl;
    cout << "编号:" << p1->id << endl;
    cout << "所教学生:" << p1->stu.name << endl;
    return 0;
    }
    //结构体做函数参数
    struct Student
    {
    string name;
    int age;
    int score;
    };
    //值传递
    void printStu(Student stu) {
    cout << "姓名:" << stu.name << endl;
    cout << "年龄:" << stu.age << endl;
    cout << "成绩:" << stu.score << endl;
    }
    //地址传递
    void printStu2(Student* p) {
    cout << "姓名:" << p->name << endl;
    cout << "年龄:" << p->age << endl;
    cout << "成绩:" << p->score << endl;
    p->age = 232;
    }
    int strArg() {
    Student stu1 = { "张三",13,91 };
    //printStu(stu1);
    printStu2(&stu1);
    return 0;
    }
    //const与结构体
    void printStu2withConst(const Student* p) {
    cout << "姓名:" << p->name << endl;
    cout << "年龄:" << p->age << endl;
    cout << "成绩:" << p->score << endl;
    //p->age = 232;加入const可以防止误操作
    }
    int strConst() {
    Student stu1 = { "张三",13,91 };
    return 0;
    }
    int hero() {
    struct Hero {
    string name;
    int age;
    string sex;
    };
    Hero heros[5] = {
    {"刘备",23,"男"},
    {"关羽",22,"男"},
    {"张飞",20,"男"},
    {"赵云",21,"男"},
    {"貂蝉",19,"女"}
    };
    for (Hero hero:heros) {
    cout << hero.name << hero.age << hero.sex << endl;
    }
    //冒泡开排
    for (int i = 0; i < 5;i++) {
    for (int j = 0; j < 4-i; j++) {
    if (heros[j].age>heros[j+1].age)
    {
    Hero hero = heros[j];
    heros[j] = heros[j + 1];
    heros[j + 1] = hero;
    }
    }
    }
    cout << "-------------------"<< endl;
    for (Hero hero : heros) {
    cout << hero.name << hero.age << hero.sex << endl;
    }
    return 0;
    }

    //全局变量、静态变量、常量---都会放在全局区
    int glob_a = 10;
    int glob_b = 10;
    const int glob_c = 10;
    void vary() {
    int a = 10;
    int b = 10;
    const int c = 10;
    static int e = 10;
    cout << "局部变量a的地址:" << (int)&a << endl;
    cout << "局部变量b的地址:" << (int)&b << endl;


    cout << "全局变量glob_a的地址:" << (int)&glob_a << endl;
    cout << "全局变量glob_b的地址:" << (int)&glob_b << endl;
    cout << "静态变量e的地址:" << (int)&e << endl;
    cout << "字符串常量的地址:" << (int)&"hello" << endl;
    //const修饰常量
    cout << "const修饰的全局常量glob_c的地址:" << (int)&glob_c << endl;
    cout << "const修饰的局部常量c的地址:" << (int)&c << endl;
    }
    //栈区
    //栈区的数据由编译器管理开辟 和释放
    //注意:不要返回局部变量的地址

    int * func(int b) {//形参数据也会放在栈区
    int a = 10; //栈区在函数执行后释放
    return &a;
    }
    void usefunc() {
    int* p = func(11);
    cout << *p << endl;//第一次可以打印出来正确的结果,因为编译器会做一次保留
    cout << *p << endl;
    }
    //堆区 由程序员来管理
    int* func2() {
    //利用new关键字,将数据开辟到堆区
    //指针 本质也是局部变量,放在栈上,指针保存的数据是放在堆区
    int* p = new int(10);
    return p;
    }
    int usefunc2() {
    int* p = func2();
    cout << *p << endl;
    return 0;
    }
    void test01() {
    int* p = func2();
    cout << *p << endl;
    cout << *p << endl;
    //若要删除堆区的数据需要用delete关键字
    delete p;
    cout << *p << endl;//内存已经释放,再访问就是非法操作
    }
    void test02() {
    int * arr=new int[10];//创建一个数组
    for (int i = 0; i < 10; i++) {
    arr[i] = i + 100;
    }
    for (int i = 0; i < 10; i++) {
    cout << arr[i] << endl;
    }
    //释放数组的时候要加一个中括号
    delete[] arr;
    }
    //引用
    void refrence1() {
    int a = 10;
    int& b = a;
    cout << b << endl;
    a = 120;
    cout << b << endl;
    b = 100;
    cout << a << endl;
    }
    //引用必须初始化
    //引用在初始化后, 不可以改变

    //引用做函数参数
    //作用 : 函故传参时,可以利用引用的技术让形参修饰实参
    //优点:可以简化指针修改实参

    void reference2() {
    int a = 8, b = 10;
    cout << a << b << endl;
    swap(a,b);
    cout << a << b << endl;
    swap01(a, b);
    cout << a << b << endl;
    swap03(a, b);
    cout << a << b << endl;
    }
    //引用做函数变量的返回值

    //1.不要做局部变量的应用
    int& test03() {
    int a = 10;
    return a;

    }

    //2.函数的调用可以做左值
    int& test04() {
    static int a = 10;//静态变量,存放在全局区,在程序结束后释放
    return a;

    }
    void reference3() {
    int& ref = test03();
    cout << ref << endl;//编译器会保存一份数据
    cout << ref << endl;//第二次的操作就是错误的

    int& ref1 = test04();
    cout << ref1 << endl;
    cout << ref1 << endl;
    test04() = 1000;
    cout << ref1 << endl;
    cout << ref1 << endl;
    }
    //引用的本质
    void func0502(int & ref) {
    ref = 100;
    }
    //引用的本质就是一个指针常量
    int ref4() {
    int a = 10;
    int& ref = a;
    ref = 20;
    cout << a << endl;
    cout << ref << endl;
    return 0;
    }

    //常量引用
    //使用场景:修饰形参,防止误操作
    void ref5() {
    int a = 10;
    const int& ref = 10;//引用必须引用一块合法的内存空间
    //加上const之后编译器将代码修改为 int temp=10;const int &ref=temp;
    }
    void showValue( const int& val) {
    //val = 1000; 不允许修改
    cout << val << endl;
    }
    void ref6() {
    int a = 100;
    showValue(a);
    cout << "a:"<<a << endl;
    }
    //函数的默认参数
    int func05021(int a,int b=100,int c=10) {
    return a + b + c;
    }
    //注意:
    //1.如果某个位置已经有了默认参数,则从这个位置往后,从左到右都必须有默认参数
    //2.如果函数声明有默认参数,函数实现就不能有默认参数
    void func05022() {
    cout << func05021(10,20) << endl;
    }

    //占位参数
    //只放一个数据类型用作占位
    //目前阶段的占位参数用不到,占位参数可以有默认参数
    //void func05031(int a, 10)
    void func05031(int a,int) {
    cout << "占位符" << endl;
    }
    void test05031() {
    func05031(10,10);
    }

    //函数重载
    //可以让函数名同名,提高函数的重用性
    //·同一个作用域下
    //·函数名称相同
    //函数参数类型不同或者个数不同或者顺序不同
    //函数的返回值不可以做为函数的重载的条件

    void reload() {
    cout << "函数reload()重载!" << endl;
    }

    void reload(int a) {
    cout << "函数reload(int a)重载" << endl;
    }
    void reload(double a) {
    cout << "函数reload(double a)重载" << endl;
    }
    void reload(double a,int b) {
    cout << "函数reload(double a,int b)重载" << endl;
    }

    void reload(int a, double b) {
    cout << "函数reload(int a, double b)重载" << endl;
    }

    void test05032() {
    reload(10,1.1);
    }

    //函数重载的注意事项
    //1、引用作为重载的条件
    void reload1(int &a) {
    cout << "reload1(int &a)调用" << endl;
    }
    void reload1(const int& a) {
    cout << "reload1(const int& a)调用" << endl;
    }
    void test05033() {
    int a = 10;
    reload1(a);//会调用不带const的
    //reload1(10);//会调用带const的
    }
    //2、函数重载碰到默认参数
    void reload2(int a,int b=10) {
    cout<<"reload2(int a)"<<endl;
    }
    void reload2(int a) {
    cout << "reload2(int a)" << endl;
    }
    //可以编译通过 调用时会出错,二义性,调用函数的时候调用两个参数不会报错

    int main() {
    cout << "MAIN" << endl;
    //helloworld();
    /*int a = 0, b = 1;
    swap(a,b);
    cout << a << b << endl;*/
    /*int a[] = { 1,2,3,4,5,6,7 };
    arrayResive(a);*/
    //cout << add(80, 50) << endl;
    /*point();*/
    /*int arr[] = {10,9,8,7,6,5,4,3,2,1};
    int a=sizeof(arr) / sizeof(arr[0]);
    bubbleSort(arr,a);*/
    /*arrpoint();*/
    //structLearn();
    //structArray();
    /*structPoint();*/
    //strInStr();
    //strArg();
    //hero();
    //vary();
    //test01();
    //reference3();
    //ref6();
    //func05022();
    //test05032();
    test05033();
    system("pause");
    }


    + +
    Author: SHYEE
    Link: http://example.com/2021/03/12/C++%E5%B0%8Ftips/
    Copyright Notice: All articles in this blog are licensed under CC BY-NC-SA 4.0 unless stating additionally.
    \ No newline at end of file diff --git "a/2021/03/12/Docker \345\270\270\347\224\250\345\221\275\344\273\244/index.html" "b/2021/03/12/Docker \345\270\270\347\224\250\345\221\275\344\273\244/index.html" new file mode 100644 index 0000000..11898b1 --- /dev/null +++ "b/2021/03/12/Docker \345\270\270\347\224\250\345\221\275\344\273\244/index.html" @@ -0,0 +1,876 @@ +Docker常用命令 | SHYEE-PLASMA + + + + + + + + + + + + + +

    Docker常用命令

    Docker 常用命令

    帮助命令

    1
    2
    3
    docker version #显示详细信息
    docker info #显示更详细的信息
    docker命令--help #万能命令
    + +

    官网命令教程

    +

    镜像命令

    docker images

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    docker images #查询
    #运行结果
    REPOSITORY TAG IMAGE ID CREATED SIZE
    hello-world latest bf756fb1ae65 12 months ago 13.3kB
    docker images -a #查询全部镜像
    #运行结果
    REPOSITORY TAG IMAGE ID CREATED SIZE
    hello-world latest bf756fb1ae65 12 months ago 13.3kB
    docker images -q #显示镜像的id
    #运行结果
    bf756fb1ae65
    docker images -aq #显示所有的id
    bf756fb1ae65
    + +

    可选项

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    Name, shorthandDefaultDescription
    --all , -aShow all images (default hides intermediate images)
    --digestsShow digests
    --filter , -fFilter output based on conditions provided
    --formatPretty-print images using a Go template
    --no-truncDon’t truncate output
    --quiet , -qOnly show image IDs
    +

    REPOSITORY :镜像的仓库源

    +

    TAG : 镜像的标签

    +

    IMAGE ID:镜像的id

    +

    CREATED:镜像的创建时间

    +

    SIZE:镜像的大小

    +
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    docker search mysql #搜索mysql的镜像信息
    #运行结果
    NAME DESCRIPTION STARS OFFICIAL AUTOMATED
    mysql MySQL is a widely used, open-source relation… 10380 [OK]
    mariadb MariaDB is a community-developed fork of MyS… 3848 [OK]
    mysql/mysql-server Optimized MySQL Server Docker images. Create… 758 [OK]
    percona Percona Server is a fork of the MySQL relati… 519 [OK]
    centos/mysql-57-centos7 MySQL 5.7 SQL database server 87
    docker search mysql --filter=STARS=3000 #搜索STARS>3000的mysql的镜像信息
    #运行结果
    NAME DESCRIPTION STARS OFFICIAL AUTOMATED
    mysql MySQL is a widely used, open-source relation… 10380 [OK]
    mariadb MariaDB is a community-developed fork of MyS… 3848 [OK]
    + +

    可选项

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    Name, shorthandDefaultDescription
    --filter , -fFilter output based on conditions provided
    --formatPretty-print search using a Go template
    --limit25Max number of search results
    --no-truncDon’t truncate output
    +

    都是在dockerhub上搜索

    +

    docker pull

    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
    docker pull mysql # 下载MySQL的镜像
    #运行结果--默认下载最新版
    Using default tag: latest #tag就是版本号,默认为最新
    latest: Pulling from library/mysql
    a076a628af6f: Pull complete #分层下载
    f6c208f3f991: Pull complete
    88a9455a9165: Pull complete
    406c9b8427c6: Pull complete
    7c88599c0b25: Pull complete
    25b5c6debdaf: Pull complete
    43a5816f1617: Pull complete
    1a8c919e89bf: Pull complete
    9f3cf4bd1a07: Pull complete
    80539cea118d: Pull complete
    201b3cad54ce: Pull complete
    944ba37e1c06: Pull complete
    Digest: sha256:feada149cb8ff54eade1336da7c1d080c4a1c7ed82b5e320efb5beebed85ae8c
    Status: Downloaded newer image for mysql:latest
    docker.io/library/mysql:latest #真实地址
    #因此
    docker pull mysql
    等价于
    docker pull docker.io/library/mysql:latest
    #下载指定版本的MySQL
    docker pull mysql:5.7
    #运行结果
    5.7: Pulling from library/mysql
    a076a628af6f: Already exists
    f6c208f3f991: Already exists
    88a9455a9165: Already exists
    406c9b8427c6: Already exists #与刚刚下载的分层公用了
    7c88599c0b25: Already exists
    25b5c6debdaf: Already exists
    43a5816f1617: Already exists
    1831ac1245f4: Pull complete
    37677b8c1f79: Pull complete
    27e4ac3b0f6e: Pull complete
    7227baa8c445: Pull complete
    Digest: sha256:b3d1eff023f698cd433695c9506171f0d08a8f92a0c8063c1a4d9db9a55808df
    Status: Downloaded newer image for mysql:5.7
    docker.io/library/mysql:5.7
    + +

    可选项

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    Name, shorthandDefaultDescription
    --all-tags , -aDownload all tagged images in the repository
    --disable-content-trusttrueSkip image verification
    --platformAPI 1.32+ Set platform if server is multi-platform capable
    --quiet , -qSuppress verbose output
    +

    docker rmi 删除镜像

    1
    2
    3
    4
    5
    6
    #查询镜像
    docker images -a
    REPOSITORY TAG IMAGE ID CREATED SIZE
    mysql 5.7 a70d36bc331a 16 hours ago 449MB
    mysql latest c8562eaf9d81 16 hours ago 546MB
    hello-world latest bf756fb1ae65 12 months ago 13.3kB
    + +
    1
    2
    3
    4
    5
    #删除ID为 a70d36bc331a的镜像
    docker rmi -f a70d36bc331a

    #删除所有镜像
    docker rmi -f $(docker images -aq)
    + +

    容器命令

    新建容器并启动

    用docker下载一个centOS

    +
    1
    docker pull centos
    + +

    docker run

    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
    docker run [可选参数] image
    #参数
    --name="Name" 容器名字”tomcat01 tomcat02“,用来区分容器
    -d 后台方式运行
    -it 使用交互方式运行,进入容器查看内容
    -P 指定容器的端口-p 8080:8080
    -p ip:主机端口:容器端口
    -p 主机端口:容器端口
    -p 容器端口
    容器端口
    -p 随机指定端口

    #进入容器
    [root@Shyee ~]# docker run -it centos /bin/bash
    [root@c549e8ba2456 /]#
    exit #退出容器
    [root@c549e8ba2456 /]# exit
    exit
    [root@Shyee ~]#

    #后台启动容器
    docker run -d 容器名
    #运行结果
    [root@Shyee ~]# docker run -d centos
    c8d9334aae4794a0d6456207fd5d52deb7328190f3059e6b74d90be64616e3e9
    [root@Shyee ~]# docker ps
    CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
    #启动后会被停掉
    #因为docker把容器后台启动后,发现前台没有容器正在运行,认为没有容器,所以就把后台的容器给停掉了
    + +

    可加载项

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    Name, shorthandDefaultDescription
    --add-hostAdd a custom host-to-IP mapping (host:ip)
    --attach , -aAttach to STDIN, STDOUT or STDERR
    --blkio-weightBlock IO (relative weight), between 10 and 1000, or 0 to disable (default 0)
    --blkio-weight-deviceBlock IO weight (relative device weight)
    --cap-addAdd Linux capabilities
    --cap-dropDrop Linux capabilities
    --cgroup-parentOptional parent cgroup for the container
    --cgroupnsAPI 1.41+ Cgroup namespace to use (host|private) ‘host’: Run the container in the Docker host’s cgroup namespace ‘private’: Run the container in its own private cgroup namespace ‘’: Use the cgroup namespace as configured by the default-cgroupns-mode option on the daemon (default)
    --cidfileWrite the container ID to the file
    --cpu-countCPU count (Windows only)
    --cpu-percentCPU percent (Windows only)
    --cpu-periodLimit CPU CFS (Completely Fair Scheduler) period
    --cpu-quotaLimit CPU CFS (Completely Fair Scheduler) quota
    --cpu-rt-periodAPI 1.25+ Limit CPU real-time period in microseconds
    --cpu-rt-runtimeAPI 1.25+ Limit CPU real-time runtime in microseconds
    --cpu-shares , -cCPU shares (relative weight)
    --cpusAPI 1.25+ Number of CPUs
    --cpuset-cpusCPUs in which to allow execution (0-3, 0,1)
    --cpuset-memsMEMs in which to allow execution (0-3, 0,1)
    --detach , -dRun container in background and print container ID
    --detach-keysOverride the key sequence for detaching a container
    --deviceAdd a host device to the container
    --device-cgroup-ruleAdd a rule to the cgroup allowed devices list
    --device-read-bpsLimit read rate (bytes per second) from a device
    --device-read-iopsLimit read rate (IO per second) from a device
    --device-write-bpsLimit write rate (bytes per second) to a device
    --device-write-iopsLimit write rate (IO per second) to a device
    --disable-content-trusttrueSkip image verification
    --dnsSet custom DNS servers
    --dns-optSet DNS options
    --dns-optionSet DNS options
    --dns-searchSet custom DNS search domains
    --domainnameContainer NIS domain name
    --entrypointOverwrite the default ENTRYPOINT of the image
    --env , -eSet environment variables
    --env-fileRead in a file of environment variables
    --exposeExpose a port or a range of ports
    --gpusAPI 1.40+ GPU devices to add to the container (‘all’ to pass all GPUs)
    --group-addAdd additional groups to join
    --health-cmdCommand to run to check health
    --health-intervalTime between running the check (ms|s|m|h) (default 0s)
    --health-retriesConsecutive failures needed to report unhealthy
    --health-start-periodAPI 1.29+ Start period for the container to initialize before starting health-retries countdown (ms|s|m|h) (default 0s)
    --health-timeoutMaximum time to allow one check to run (ms|s|m|h) (default 0s)
    --helpPrint usage
    --hostname , -hContainer host name
    --initAPI 1.25+ Run an init inside the container that forwards signals and reaps processes
    --interactive , -iKeep STDIN open even if not attached
    --io-maxbandwidthMaximum IO bandwidth limit for the system drive (Windows only)
    --io-maxiopsMaximum IOps limit for the system drive (Windows only)
    --ipIPv4 address (e.g., 172.30.100.104)
    --ip6IPv6 address (e.g., 2001:db8::33)
    --ipcIPC mode to use
    --isolationContainer isolation technology
    --kernel-memoryKernel memory limit
    --label , -lSet meta data on a container
    --label-fileRead in a line delimited file of labels
    --linkAdd link to another container
    --link-local-ipContainer IPv4/IPv6 link-local addresses
    --log-driverLogging driver for the container
    --log-optLog driver options
    --mac-addressContainer MAC address (e.g., 92:d0:c6:0a:29:33)
    --memory , -mMemory limit
    --memory-reservationMemory soft limit
    --memory-swapSwap limit equal to memory plus swap: ‘-1’ to enable unlimited swap
    --memory-swappiness-1Tune container memory swappiness (0 to 100)
    --mountAttach a filesystem mount to the container
    --nameAssign a name to the container
    --netConnect a container to a network
    --net-aliasAdd network-scoped alias for the container
    --networkConnect a container to a network
    --network-aliasAdd network-scoped alias for the container
    --no-healthcheckDisable any container-specified HEALTHCHECK
    --oom-kill-disableDisable OOM Killer
    --oom-score-adjTune host’s OOM preferences (-1000 to 1000)
    --pidPID namespace to use
    --pids-limitTune container pids limit (set -1 for unlimited)
    --platformAPI 1.32+ Set platform if server is multi-platform capable
    --privilegedGive extended privileges to this container
    --publish , -pPublish a container’s port(s) to the host
    --publish-all , -PPublish all exposed ports to random ports
    --pullmissingPull image before running (“always”|”missing”|”never”)
    --read-onlyMount the container’s root filesystem as read only
    --restartnoRestart policy to apply when a container exits
    --rmAutomatically remove the container when it exits
    --runtimeRuntime to use for this container
    --security-optSecurity Options
    --shm-sizeSize of /dev/shm
    --sig-proxytrueProxy received signals to the process
    --stop-signalSIGTERMSignal to stop a container
    --stop-timeoutAPI 1.25+ Timeout (in seconds) to stop a container
    --storage-optStorage driver options for the container
    --sysctlSysctl options
    --tmpfsMount a tmpfs directory
    --tty , -tAllocate a pseudo-TTY
    --ulimitUlimit options
    --user , -uUsername or UID (format: <name|uid>[:<group|gid>])
    --usernsUser namespace to use
    --utsUTS namespace to use
    --volume , -vBind mount a volume
    --volume-driverOptional volume driver for the container
    --volumes-fromMount volumes from the specified container(s)
    --workdir , -wWorking directory inside the container
    +

    docker ps

    1
    2
    3
    docker ps #查看正在运行的容器
    docker ps -a #查看运行过的容器
    docker ps -a -n=? #显示最近?个容器
    + +

    退出

    1
    2
    exit #停止并退出
    Ctrl+P+Q #不停止退出
    + +

    删除容器

    1
    2
    3
    docker rm 容器id #不能删除正在运行的容器
    docker rm -f $(docker ps -aq) #删除所有容器
    docker ps -a -q|xargs docker rm #删除所有容器
    + +

    启动和停止

    1
    2
    3
    4
    docker start 容器id #启动
    docker restart 容器id # 重启
    docker stop 容器id #停止
    docker kill 容器id #强行停止
    + +

    查看命令

    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
    docker logs
    Options:
    --details Show extra details provided to logs
    -f, --follow Follow log output
    --since string Show logs since timestamp (e.g. 2013-01-02T13:23:37) or relative (e.g. 42m for 42 minutes)
    --tail string Number of lines to show from the end of the logs (default "all")
    -t, --timestamps Show timestamps
    --until string Show logs before a timestamp (e.g. 2013-01-02T13:23:37) or relative (e.g. 42m for 42 minutes)
    #运行一个容器,让他不停打印
    [root@Shyee ~]# docker run -d centos /bin/sh -c "while true;do echo Shyee;sleep 1;done"
    936f798488f4afb85055dea3d75c40703b827823467af54f0ee20834f2298760
    [root@Shyee ~]# docker ps
    CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
    936f798488f4 centos "/bin/sh -c 'while t…" 9 seconds ago Up 8 seconds laughing_feistel
    [root@Shyee ~]# docker logs -tf --tail 10 936f798488f4
    2021-01-20T04:17:47.958314992Z Shyee
    2021-01-20T04:17:48.960104271Z Shyee
    2021-01-20T04:17:49.962248118Z Shyee
    2021-01-20T04:17:50.964089661Z Shyee
    2021-01-20T04:17:51.965808705Z Shyee
    2021-01-20T04:17:52.967578590Z Shyee
    2021-01-20T04:17:53.969388856Z Shyee
    2021-01-20T04:17:54.971137786Z Shyee
    2021-01-20T04:17:55.972977481Z Shyee
    2021-01-20T04:17:56.974827278Z Shyee
    2021-01-20T04:17:57.976766489Z Shyee
    #一直会刷新
    + +

    查看docker容器内部信息

    1
    2
    3
    4
    5
    docker top
    [root@Shyee ~]# docker top a87e6c731659
    UID PID PPID C STIME TTY TIME CMD
    root 101771 101755 1 12:22 ? 00:00:00 /bin/sh -c while true;do echo Shyee;sleep 1;done
    root 101826 101771 0 12:22 ? 00:00:00 /usr/bin/coreutils --coreutils-prog-shebang=sleep /usr/bin/sleep 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
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
    146
    147
    148
    149
    150
    151
    152
    153
    154
    155
    156
    157
    158
    159
    160
    161
    162
    163
    164
    165
    166
    167
    168
    169
    170
    171
    172
    173
    174
    175
    176
    177
    178
    179
    180
    181
    182
    183
    184
    185
    186
    187
    188
    189
    190
    191
    192
    193
    194
    195
    196
    197
    198
    199
    200
    201
    202
    203
    204
    205
    206
    207
    208
    209
    docker inspect
    [root@Shyee ~]# docker inspect a87e6c731659
    [
    {
    "Id": "a87e6c731659ecff036fac2cede73e586466f15bbc026f5a1f3d106bc990a38a",
    "Created": "2021-01-20T04:22:02.208432632Z",
    "Path": "/bin/sh",
    "Args": [
    "-c",
    "while true;do echo Shyee;sleep 1;done"
    ],
    "State": {
    "Status": "running",
    "Running": true,
    "Paused": false,
    "Restarting": false,
    "OOMKilled": false,
    "Dead": false,
    "Pid": 101771,
    "ExitCode": 0,
    "Error": "",
    "StartedAt": "2021-01-20T04:22:02.751586945Z",
    "FinishedAt": "0001-01-01T00:00:00Z"
    },
    "Image": "sha256:300e315adb2f96afe5f0b2780b87f28ae95231fe3bdd1e16b9ba606307728f55",
    "ResolvConfPath": "/var/lib/docker/containers/a87e6c731659ecff036fac2cede73e586466f15bbc026f5a1f3d106bc990a38a/resolv.conf",
    "HostnamePath": "/var/lib/docker/containers/a87e6c731659ecff036fac2cede73e586466f15bbc026f5a1f3d106bc990a38a/hostname",
    "HostsPath": "/var/lib/docker/containers/a87e6c731659ecff036fac2cede73e586466f15bbc026f5a1f3d106bc990a38a/hosts",
    "LogPath": "/var/lib/docker/containers/a87e6c731659ecff036fac2cede73e586466f15bbc026f5a1f3d106bc990a38a/a87e6c731659ecff036fac2cede73e586466f15bbc026f5a1f3d106bc990a38a-json.log",
    "Name": "/dazzling_matsumoto",
    "RestartCount": 0,
    "Driver": "overlay2",
    "Platform": "linux",
    "MountLabel": "",
    "ProcessLabel": "",
    "AppArmorProfile": "",
    "ExecIDs": null,
    "HostConfig": {
    "Binds": null,
    "ContainerIDFile": "",
    "LogConfig": {
    "Type": "json-file",
    "Config": {}
    },
    "NetworkMode": "default",
    "PortBindings": {},
    "RestartPolicy": {
    "Name": "no",
    "MaximumRetryCount": 0
    },
    "AutoRemove": false,
    "VolumeDriver": "",
    "VolumesFrom": null,
    "CapAdd": null,
    "CapDrop": null,
    "Capabilities": null,
    "Dns": [],
    "DnsOptions": [],
    "DnsSearch": [],
    "ExtraHosts": null,
    "GroupAdd": null,
    "IpcMode": "private",
    "Cgroup": "",
    "Links": null,
    "OomScoreAdj": 0,
    "PidMode": "",
    "Privileged": false,
    "PublishAllPorts": false,
    "ReadonlyRootfs": false,
    "SecurityOpt": null,
    "UTSMode": "",
    "UsernsMode": "",
    "ShmSize": 67108864,
    "Runtime": "runc",
    "ConsoleSize": [
    0,
    0
    ],
    "Isolation": "",
    "CpuShares": 0,
    "Memory": 0,
    "NanoCpus": 0,
    "CgroupParent": "",
    "BlkioWeight": 0,
    "BlkioWeightDevice": [],
    "BlkioDeviceReadBps": null,
    "BlkioDeviceWriteBps": null,
    "BlkioDeviceReadIOps": null,
    "BlkioDeviceWriteIOps": null,
    "CpuPeriod": 0,
    "CpuQuota": 0,
    "CpuRealtimePeriod": 0,
    "CpuRealtimeRuntime": 0,
    "CpusetCpus": "",
    "CpusetMems": "",
    "Devices": [],
    "DeviceCgroupRules": null,
    "DeviceRequests": null,
    "KernelMemory": 0,
    "KernelMemoryTCP": 0,
    "MemoryReservation": 0,
    "MemorySwap": 0,
    "MemorySwappiness": null,
    "OomKillDisable": false,
    "PidsLimit": null,
    "Ulimits": null,
    "CpuCount": 0,
    "CpuPercent": 0,
    "IOMaximumIOps": 0,
    "IOMaximumBandwidth": 0,
    "MaskedPaths": [
    "/proc/asound",
    "/proc/acpi",
    "/proc/kcore",
    "/proc/keys",
    "/proc/latency_stats",
    "/proc/timer_list",
    "/proc/timer_stats",
    "/proc/sched_debug",
    "/proc/scsi",
    "/sys/firmware"
    ],
    "ReadonlyPaths": [
    "/proc/bus",
    "/proc/fs",
    "/proc/irq",
    "/proc/sys",
    "/proc/sysrq-trigger"
    ]
    },
    "GraphDriver": {
    "Data": {
    "LowerDir": "/var/lib/docker/overlay2/24893cfd3f87c08a9366dac239c9fd5b02fea33a192fcc3f0c243a671c4da2c8-init/diff:/var/lib/docker/overlay2/f660b0f563e2db7f1e4e7c42e598560f1c25d2e10d534e781bfb2ccd45e9b38b/diff",
    "MergedDir": "/var/lib/docker/overlay2/24893cfd3f87c08a9366dac239c9fd5b02fea33a192fcc3f0c243a671c4da2c8/merged",
    "UpperDir": "/var/lib/docker/overlay2/24893cfd3f87c08a9366dac239c9fd5b02fea33a192fcc3f0c243a671c4da2c8/diff",
    "WorkDir": "/var/lib/docker/overlay2/24893cfd3f87c08a9366dac239c9fd5b02fea33a192fcc3f0c243a671c4da2c8/work"
    },
    "Name": "overlay2"
    },
    "Mounts": [],
    "Config": {
    "Hostname": "a87e6c731659",
    "Domainname": "",
    "User": "",
    "AttachStdin": false,
    "AttachStdout": false,
    "AttachStderr": false,
    "Tty": false,
    "OpenStdin": false,
    "StdinOnce": false,
    "Env": [
    "PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin"
    ],
    "Cmd": [
    "/bin/sh",
    "-c",
    "while true;do echo Shyee;sleep 1;done"
    ],
    "Image": "centos",
    "Volumes": null,
    "WorkingDir": "",
    "Entrypoint": null,
    "OnBuild": null,
    "Labels": {
    "org.label-schema.build-date": "20201204",
    "org.label-schema.license": "GPLv2",
    "org.label-schema.name": "CentOS Base Image",
    "org.label-schema.schema-version": "1.0",
    "org.label-schema.vendor": "CentOS"
    }
    },
    "NetworkSettings": {
    "Bridge": "",
    "SandboxID": "b1519a918616f880d5139e041386bce0c0a2e49c4330750c5f4ca8da34cae7e9",
    "HairpinMode": false,
    "LinkLocalIPv6Address": "",
    "LinkLocalIPv6PrefixLen": 0,
    "Ports": {},
    "SandboxKey": "/var/run/docker/netns/b1519a918616",
    "SecondaryIPAddresses": null,
    "SecondaryIPv6Addresses": null,
    "EndpointID": "1b101194ef0bb0cb2990db0acfa26a50e9dd20d10a0f633993ab1ef7a8b4ff98",
    "Gateway": "172.17.0.1",
    "GlobalIPv6Address": "",
    "GlobalIPv6PrefixLen": 0,
    "IPAddress": "172.17.0.2",
    "IPPrefixLen": 16,
    "IPv6Gateway": "",
    "MacAddress": "02:42:ac:11:00:02",
    "Networks": {
    "bridge": {
    "IPAMConfig": null,
    "Links": null,
    "Aliases": null,
    "NetworkID": "a414e1e71fc0c80a2484ca0c656819a0532ccc902b70b9123a07dab25baaf04a",
    "EndpointID": "1b101194ef0bb0cb2990db0acfa26a50e9dd20d10a0f633993ab1ef7a8b4ff98",
    "Gateway": "172.17.0.1",
    "IPAddress": "172.17.0.2",
    "IPPrefixLen": 16,
    "IPv6Gateway": "",
    "GlobalIPv6Address": "",
    "GlobalIPv6PrefixLen": 0,
    "MacAddress": "02:42:ac:11:00:02",
    "DriverOpts": null
    }
    }
    }
    }
    ]
    + +

    进入正在运行的容器

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    docker exec -it 容器ID

    [root@Shyee ~]# docker exec -it a87e6c731659 /bin/bash
    [root@a87e6c731659 /]#
    [root@a87e6c731659 /]# ls
    bin dev etc home lib lib64 lost+found media mnt opt proc root run sbin srv sys tmp usr var
    [root@a87e6c731659 /]# ps -ef
    UID PID PPID C STIME TTY TIME CMD
    root 1 0 0 04:22 ? 00:00:00 /bin/sh -c while true;do echo Shyee;sleep 1;done
    root 396 0 0 04:28 pts/0 00:00:00 /bin/bash
    root 464 1 0 04:29 ? 00:00:00 /usr/bin/coreutils --coreutils-prog-shebang=sleep /usr/bin/sleep 1
    root 465 396 0 04:29 pts/0 00:00:00 ps -ef

    #另一种方法
    docker attach 容器ID
    [root@Shyee ~]# docker attach a87e6c731659
    + +

    拷贝

    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
    #从容器内拷到容器外
    docker cp
    [root@Shyee ~]# docker images
    REPOSITORY TAG IMAGE ID CREATED SIZE
    centos latest 300e315adb2f 6 weeks ago 209MB
    #进入容器
    [root@Shyee ~]# docker run -it centos /bin/bash
    [root@112cbae27efa /]# cd /home
    [root@112cbae27efa home]# ls
    #创建测试文件
    [root@112cbae27efa home]# touch a.txt
    [root@112cbae27efa home]# ls
    a.txt
    #退出容器
    [root@112cbae27efa home]# exit
    exit
    [root@Shyee local]# docker ps
    CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
    [root@Shyee local]# docker ps -a
    CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
    112cbae27efa centos "/bin/bash" 4 minutes ago Exited (0) 14 seconds ago laughing_leakey
    #将测试文件拷贝出来
    [root@Shyee local]# docker cp 112cbae27efa:/home/a.txt /usr/local
    [root@Shyee local]# ls
    aegis a.txt bin blog etc games include jdk-15.0.1 lib lib64 libexec nginx nginx-1.19.6 sbin share src
    + +

    docker 部署nginx

    查找并下载容器

    1
    2
    docker search nginx
    docker pull nginx
    + +

    启动并配置

    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
    #-d 后台启动
    #将25565映射到容器内的80
    [root@Shyee local]# docker run -d --name nginx01 -p 25565:80 nginx
    6cf85750f6e82fbeaffd84e90c28cdcbbc91e70a2771ff1ea81cba9f35281c33
    [root@Shyee local]# curl localhost:25565
    <!DOCTYPE html>
    <html>
    <head>
    <title>Welcome to nginx!</title>
    <style>
    body {
    width: 35em;
    margin: 0 auto;
    font-family: Tahoma, Verdana, Arial, sans-serif;
    }
    </style>
    </head>
    <body>
    <h1>Welcome to nginx!</h1>
    <p>If you see this page, the nginx web server is successfully installed and
    working. Further configuration is required.</p>

    <p>For online documentation and support please refer to
    <a href="http://nginx.org/">nginx.org</a>.<br/>
    Commercial support is available at
    <a href="http://nginx.com/">nginx.com</a>.</p>

    <p><em>Thank you for using nginx.</em></p>
    </body>
    </html>
    + +

    进入nginx

    1
    2
    3
    4
    5
    6
    [root@Shyee local]# docker exec -it nginx01 /bin/bash
    root@6cf85750f6e8:/# whereis nginx
    nginx: /usr/sbin/nginx /usr/lib/nginx /etc/nginx /usr/share/nginx
    root@6cf85750f6e8:/# cd etc/nginx
    root@6cf85750f6e8:/etc/nginx# ls
    conf.d fastcgi_params koi-utf koi-win mime.types modules nginx.conf scgi_params uwsgi_params win-utf
    + +

    dockers部署tomcat

    官方方式

    +
    1
    2
    $ docker run -it --rm tomcat:9.0
    #--rm 适用于测试,用完即关
    + +
    1
    2
    3
    4
    5
    6
    7
    8
    9
    [root@Shyee local]# docker run -d -p 19132:8080 --name tomcat01 tomcat
    #测试报404
    #进入tomcat01
    [root@Shyee local]# docker exec -it tomcat01 /bin/bash
    root@b1085cdbfb07:/usr/local/tomcat# ls
    BUILDING.txt CONTRIBUTING.md LICENSE NOTICE README.md RELEASE-NOTES RUNNING.txt bin conf lib logs native-jni-lib temp webapps webapps.dist work
    root@b1085cdbfb07:/usr/local/tomcat# cd webapps
    root@b1085cdbfb07:/usr/local/tomcat/webapps# ls
    #webapp是空的
    + +

    webapps原有的文件都在 webapps.dist 中,所以把webapps.dist中的文件拷到webapps里。

    +
    1
    2
    3
    4
    5
    root@b1085cdbfb07:/usr/local/tomcat# cp -r webapps.dist/* webapps
    root@b1085cdbfb07:/usr/local/tomcat# cd webapps
    root@b1085cdbfb07:/usr/local/tomcat/webapps# ls
    ROOT docs examples host-manager manager
    # 测试通过
    + +

    部署es+kibana

    es暴露的端口很多!

    +

    es十分的耗内存

    +

    es的数据一般需要放置到安全目录!挂载

    +

    官方文档

    +
    1
    $ docker run -d --name elasticsearch -p 9200:9200 -p 9300:9300 -e "discovery.type=single-node" elasticsearch:7.10.1
    + +

    卡死了。

    +

    限制内存

    +
    1
    $ docker run -d --name elasticsearch02 -p 9200:9200 -p 9300:9300 -e "discovery.type=single-node"  -e ES_JAVA_OPTS="-Xms64m -Xmx512m" elasticsearch:7.10.1
    + +
    1
    2
    3
    4
    5
    6
    7
    [root@Shyee ~]# docker ps
    CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
    22dcdeaf2f79 elasticsearch:7.10.1 "/tini -- /usr/local…" 7 seconds ago Up 6 seconds 0.0.0.0:9200->9200/tcp, 0.0.0.0:9300->9300/tcp elasticsearch02
    [root@iZ2zeeg68odufzgdsoyyujZ ~]# docker stats

    CONTAINER ID NAME CPU % MEM USAGE / LIMIT MEM % NET I/O BLOCK I/O PIDS
    22dcdeaf2f79 elasticsearch02 5.87% 358.7MiB / 1.774GiB 19.74% 1.1kB / 0B 162MB / 0B 31
    + +

    检查

    +
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    [root@Shyee ~]# curl localhost:9200
    {
    "name" : "22dcdeaf2f79",
    "cluster_name" : "docker-cluster",
    "cluster_uuid" : "_YJ5sKDETeqelK3n1v2U_w",
    "version" : {
    "number" : "7.10.1",
    "build_flavor" : "default",
    "build_type" : "docker",
    "build_hash" : "1c34507e66d7db1211f66f3513706fdf548736aa",
    "build_date" : "2020-12-05T01:00:33.671820Z",
    "build_snapshot" : false,
    "lucene_version" : "8.7.0",
    "minimum_wire_compatibility_version" : "6.8.0",
    "minimum_index_compatibility_version" : "6.0.0-beta1"
    },
    "tagline" : "You Know, for Search"
    }
    + +

    可视化

    portainer

    +
    1
    docker run -d -p 8088:9000 --restart=always -v /var/run/docker.sock:/var/run/docker.sock --privileged=true portainer/portainer
    + +

    从浏览器链接8088端口进入

    +

    选择local

    +

    ![image-20210221204835330](D:\bloglocal\Docker 常用命令.assets\image-20210221204835330.png)

    +

    会进入到这种页面

    +

    ![image-20210221205209445](D:\bloglocal\Docker 常用命令.assets\image-20210221205209445.png)

    +

    commit镜像

    1
    2
    docker commit #提交容器为一个新的副本
    docker commit -m="提交的描述信息" -a="作者" 容器id 目标镜像名
    + +

    测试

    +
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    #启动一个默认tomcat,
    docker run -it -p 8080:8080 tomcat
    docker exec -it 5fea3e1cfa5a /bin/bash
    root@5fea3e1cfa5a:/usr/local/tomcat# cd webapps
    root@5fea3e1cfa5a:/usr/local/tomcat/webapps# ls
    #发现webapps中没有东西(都在webapps.dist中)
    #将其拷贝到webapps中
    root@5fea3e1cfa5a:/usr/local/tomcat# cp -r webapps.dist/* webapps
    root@5fea3e1cfa5a:/usr/local/tomcat# cd webapps
    root@5fea3e1cfa5a:/usr/local/tomcat/webapps# ls
    ROOT docs examples host-manager manager
    + +

    进行提交

    1
    2
    3
    4
    5
    [root@Shyee ~]# docker commit -a ="Shyee" -m="init tomcat done" 5fea3e1cfa5a tomcat02:1.0
    sha256:75830e7057278f119161e5e0745c90fc9d58ea475476d64d50d522186ce58df4
    [root@Shyee ~]# docker images
    REPOSITORY TAG IMAGE ID CREATED SIZE
    tomcat02 1.0 75830e705727 6 seconds ago 654MB
    + +
    Author: SHYEE
    Link: http://example.com/2021/03/12/Docker%20%E5%B8%B8%E7%94%A8%E5%91%BD%E4%BB%A4/
    Copyright Notice: All articles in this blog are licensed under CC BY-NC-SA 4.0 unless stating additionally.
    \ No newline at end of file diff --git a/2021/03/12/Docker/index.html b/2021/03/12/Docker/index.html new file mode 100644 index 0000000..600454e --- /dev/null +++ b/2021/03/12/Docker/index.html @@ -0,0 +1,214 @@ +Docker | SHYEE-PLASMA + + + + + + + + + + + + + +

    Docker

    Docker

    用于打包,解决环境搭建问题

    +

    基于Go

    +

    安装(linux-CentOS)

    查看官方的帮助文档

    +

    卸载旧的版本

    1
    2
    3
    4
    5
    6
    7
    8
    yum remove docker \
    docker-client \
    docker-client-latest \
    docker-common \
    docker-latest \
    docker-latest-logrotate \
    docker-logrotate \
    docker-engine
    + +

    使用仓库安装

    1
    2
    3
    4
    5
    6
    7
    8
    9
    yum install -y yum-utils
    # 设置镜像地址
    yum-config-manager \
    --add-repo \
    https://download.docker.com/linux/centos/docker-ce.repo
    #这里使用阿里云的镜像
    yum-config-manager \
    --add-repo \
    http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
    + +

    更新Docker

    1
    2
    yum makecache
    yum update
    + +

    安装Docker引擎

    1
    yum install docker-ce docker-ce-cli containerd.io
    + +

    可能会报错

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    1. 首先更新yum

    $ yum update

    2. 以下方法任选一种
    # 方法1: 安装特定版本的docker-ce和containerd.io
    $ yum list docker-ce --showduplicates | sort -r

    docker-ce.x86_64 3:18.09.1-3.el7 docker-ce-stable
    docker-ce.x86_64 3:18.09.0-3.el7 docker-ce-stable
    docker-ce.x86_64 18.06.1.ce-3.el7 docker-ce-stable
    docker-ce.x86_64 18.06.0.ce-3.el7 docker-ce-stable
    ...

    $ sudo yum install docker-ce-<VERSION_STRING> docker-ce-cli-<VERSION_STRING> containerd.io

    # 方法2: 通过阿里云镜像库安装符合最新docker-ce版本的containerd.io
    $ yum install -y https://mirrors.aliyun.com/docker-ce/linux/centos/8/x86_64/edge/Packages/containerd.io-1.3.7-3.1.el8.x86_64.rpm
    yum install -y https://download.docker.com/linux/centos/8/x86_64/edge/Packages/docker-ce-19.03.13-3.el8.x86_64.rpm
    yum install -y https://download.docker.com/linux/centos/8/x86_64/edge/Packages/docker-ce-cli-19.03.13-3.el8.x86_64.rpm
    #装第三个的时候反复timeout,人晕了
    + +

    启动Docker

    1
    systemctl start docker
    + +

    检查安装

    1
    2
    3
    4
    #检查版本号
    docker version
    #运行hello world
    docker run hello-world
    + +

    报错

    +
    1
    2
    3
    Unable to find image 'hello-world:latest' locally
    docker: Error response from daemon: Get https://registry-1.docker.io/v2/: net/http: TLS handshake timeout.
    See 'docker run --help'.
    + +

    timeout,应该是镜像源的问题,这个阿里云真够恶心的,用了阿里自己的镜像下rpm的时候都会timeout。

    +
    1
    2
    3
    4
    5
    [root@Shyee local]# yum install -y https://download.docker.com/linux/centos/8/x86_64/edge/Packages/docker-ce-cli-19.03.13-3.el8.x86_64.rpm
    Last metadata expiration check: 2:09:13 ago on Tue 19 Jan 2021 06:27:23 PM CST.
    [MIRROR] docker-ce-cli-19.03.13-3.el8.x86_64.rpm: Curl error (28): Timeout was reached for https://download.docker.com/linux/centos/8/x86_64/edge/Packages/docker-ce-cli-19.03.13-3.el8.x86_64.rpm [Operation too slow. Less than 1000 bytes/sec transferred the last 30 seconds]
    [MIRROR] docker-ce-cli-19.03.13-3.el8.x86_64.rpm: Curl error (28): Timeout was reached for https://download.docker.com/linux/centos/8/x86_64/edge/Packages/docker-ce-cli-19.03.13-3.el8.x86_64.rpm [Operation too slow. Less than 1000 bytes/sec transferred the last 30 seconds]
    [MIRROR] docker-ce-cli-19.03.13-3.el8.x86_64.rpm: Curl error (28): Timeout was reached for https://download.docker.com/linux/centos/8/x86_64/edge/Packages/docker-ce-cli-19.03.13-3.el8.x86_64.rpm [Operation too slow. Less than 1000 bytes/sec transferred the last 30 seconds]
    + +

    尝试解决:

    +

    /etc/docker新增daemon.json,添加镜像

    +
    1
    2
    3
    {
    "registry-mirrors": ["http://hub-mirror.c.163.com"]
    }
    + +

    重启

    +
    1
    systemctl restart docker.service
    + +

    报错

    +
    1
    docker: Get https://registry-1.docker.io/v2/library/hello-world/manifests/sha256:90659bf80b44ce6be8234e6ff90a1ac34acbeb826903b02cfa0da11c82cbc042: net/http: TLS handshake timeout.
    + +

    尝试解决:

    +

    更改镜像:

    +
    1
    {"registry-mirrors":["https://registry.docker-cn.com","https://pee6w651.mirror.aliyuncs.com"]}
    + +

    后来才知道,阿里云有个容器镜像服务,可以开启,并拿到自己的镜像加速器,也是如上配置。

    +

    成功

    +
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    Hello from Docker!
    This message shows that your installation appears to be working correctly.

    To generate this message, Docker took the following steps:
    1. The Docker client contacted the Docker daemon.
    2. The Docker daemon pulled the "hello-world" image from the Docker Hub.
    (amd64)
    3. The Docker daemon created a new container from that image which runs the
    executable that produces the output you are currently reading.
    4. The Docker daemon streamed that output to the Docker client, which sent it
    to your terminal.

    To try something more ambitious, you can run an Ubuntu container with:
    $ docker run -it ubuntu bash

    Share images, automate workflows, and more with a free Docker ID:
    https://hub.docker.com/

    For more examples and ideas, visit:
    https://docs.docker.com/get-started/
    + +

    检查镜像

    1
    2
    3
    4
    5
    docker images

    #运行结果
    REPOSITORY TAG IMAGE ID CREATED SIZE
    hello-world latest bf756fb1ae65 12 months ago 13.3kB
    + +

    卸载Docker

    1
    2
    3
    yum remove docker-ce docker-ce-cli containerd.io

    rm -rf /var/lib/docker
    + +

    底层原理

    C/S结构

    +

    通过socket连接

    +

    1、Docker有着比虚拟机更少的抽象层。

    +

    2、docker利用的是宿主机的内核,vm需要是Guest Os。

    +
    Author: SHYEE
    Link: http://example.com/2021/03/12/Docker/
    Copyright Notice: All articles in this blog are licensed under CC BY-NC-SA 4.0 unless stating additionally.
    \ No newline at end of file diff --git "a/2021/03/12/\347\246\273\346\225\243\346\225\260\345\255\246/index.html" "b/2021/03/12/\347\246\273\346\225\243\346\225\260\345\255\246/index.html" new file mode 100644 index 0000000..9e8e52f --- /dev/null +++ "b/2021/03/12/\347\246\273\346\225\243\346\225\260\345\255\246/index.html" @@ -0,0 +1,220 @@ +离散数学 | SHYEE-PLASMA + + + + + + + + + + + + + +

    离散数学

    离散数学

    集合

    将若干个可确定的、可分辨的对象构成的无序整体称为集合

    +

    必须明确判断一个对象

    +

    集合中没有相同的元素

    +

    集合表示法

    外延表示法(列举法)

    +

    内涵表示法(描述法)

    +

    image-20220113104324776

    +

    子集与超集

    包含于是集合之间的关系

    +

    属于是元素和集合的关系

    +

    A包含于B&&B包含于A时 A=B

    +

    全集 U

    讨论的具体问题中的全体

    +

    空集

    任意一个集合都是自己的子集 ,空集是任意一个集合的子集

    +

    空集是唯一的

    +

    基数或势

    一个集合A所包含的元素数目称为该集合的基数或势,记作|A|或#A或card(A)。

    +

    if |A|<∞ 则称A为有限集或有穷集(finite set)。否则称为无穷集。

    +

    card({a,b,a,2,🐷})=4,因为a出现了两次。

    +

    幂集

    设A是集合,则A的所有子集组成的集合称为幂集。

    +

    集合的运算

    设 U 为全集,A、B 为 U 的两个子集,则:

    +

    (a) A 与 B 的交集(intersection) A∩B = { x | x∈A 且 x∈B };

    +

    (b) A 与 B 的并集(union) A∪B = { x | x∈A 或 x∈B };

    +

    (c) B 关于 A 的相对补(complement of B with respect to A) 或 A 与 B 的差集(difference)A-B 定义为 A-B = { x |x∈A 且x不属于B},也记作 A\B;

    +

    (d) A 关 于全 集 U 的相 对补称作 A的 绝对补 或补 集 (complement),记作A(或 ~A ),即A={x|x∈U且x不属于A};

    +

    (e) A 与 B 的对称差(symmetric difference)AB 定义为 A⊕B = { x | x∈A或x∈B且x不同时属于A和B }。

    +

    交换律

    +

    A∪B=B∪A A∩B=B∩A

    +

    结合律

    +

    ( A∪B )∪C = A∪( B∪C )

    +

    ( A∩B )∩C = A∩( B∩C )

    +

    分配律

    +

    A∪( B∩C ) = ( A∪B )∩( A∪C )

    +

    A∩( B∪C ) = ( A∩B )∪( A∩C )

    +

    吸收律

    +

    A∪(A∩B)=A,A∩(A∪B)=A

    +

    幂等律

    +

    A∪A = A,A∩A = A

    +

    双重否定律

    +

    非非A = A

    +

    矛盾律

    +

    A∩A = 

    +

    排中律

    +

    A∪A = U

    +

    余补律   = U,U = 

    +

    零律

    +

    A∪U=U, A∩=

    +

    同一律

    +

    A∪=A,A∩U=A

    +

    德·摩根律

    +

    A∪B = A∩B  A∩B = A∪B

    +

    A( B∪C ) = ( AB )∩( AC )

    +

    A( B∩C ) = ( AB )∪( AC )

    +

    U( B∪C ) = ( UB )∩( UC )

    +

    U( B∩C ) = ( UB )∪( UC )

    +

    维恩图

    序列

    序列(sequence)是被排成一列的 对象,各对象之间的顺序非常重要。

    +

    序列中的对象也称为项(item),

    +

    项的个数(可能是无限的)称为序 列的长度(length)。

    +

    取出序列中的某些特定的项并保持 它们在原来序列中的顺序,所得到 的 新 序 列 称 为 原 序 列 的 子 序 列 (subsequence)。

    +
    Author: SHYEE
    Link: http://example.com/2021/03/12/%E7%A6%BB%E6%95%A3%E6%95%B0%E5%AD%A6/
    Copyright Notice: All articles in this blog are licensed under CC BY-NC-SA 4.0 unless stating additionally.
    \ No newline at end of file diff --git "a/2021/03/12/\350\247\206\345\233\276/index.html" "b/2021/03/12/\350\247\206\345\233\276/index.html" new file mode 100644 index 0000000..801967b --- /dev/null +++ "b/2021/03/12/\350\247\206\345\233\276/index.html" @@ -0,0 +1,228 @@ +视图 | SHYEE-PLASMA + + + + + + + + + + + + + +

    视图

    视图

    创建视图 emp_view,连接system用户,将创建视图的权限授予用户

    +
    1
    2
    3
    4
    GRANT CREATE VIEW to scott;
    conn scottiger;
    CREATE VIEW emp_view
    AS SELECT ename,job,sal FROM emp;
    + + + +

    创建带检查约束的视图。 建立一个部门员工薪水介于1000~3000元的员工信息SAL_MID视图。

    +
    1
    create view SAL_MID as select ename,job,sal from emp where sal between 1000 and 3000 with check option;
    + +

    创建只读视图。建立一个部门号为10的10员工的只读视图DEP_10。

    +
    1
    create view dep_10 as select ename,job,sal from emp where deptno=10 with read only;
    + +

    创建一个包含各部门的部门号、部门人数和部门平均工资的视图。

    +
    1
    create view  sal_avg as select deptno ,avg(sal) avgsal,count(*) total from emp group by deptno;
    + +

    创建一个部门员工信息视图,此视图中包含员工名、部门名、工作职位、薪水等信息。

    +
    1
    create view emp_dept as select empno,ename,dname,job,sal from emp ,dept where emp.deptno =dept.deptno;
    + +

    更改视图emp_view

    +
    1
    create or replace view emp_view as select empno,ename,job,sal from emp;
    + +

    给emp_view重新命名为emp_view1.

    +
    1
    rename emp_view to emp_view1;
    + +

    删除视图emp_view

    +
    1
    drop view emp_view;
    + +

    查询SCOTT用户下的视图及视图定义信息。

    +
    1
    2
    col view_name format a10;
    select view_name ,text from user_views;
    + +

    索引

    从emp表上创建不同的索引。

    +
    1
    2
    3
    create index emp_idx on emp(ename);

    create index emp_idx_j on emp(ename,job);
    + +

    创建基于函数的索引。

    +
    1
    create index emp_fun_idx on emp(UPPER(ename));
    + +

    建立一个大表,对表中数据进行查询操作,比较建立索引前后的系统开销。

    +

    ①建立单独的表空间wb和单独的临时表空间wbtemp,创建用户wb并为其指定表空间wb和临时表空间wbtemp,用于存放大量数据。

    +
    1
    2
    3
    4
    5
    conn system/password
    create tablespace wb datafile 'D:\app\EShyee\oradata\orcl\wb01.DBF' size 50M autoextEND on;

    create temporary tablespace wbtemp tempfile 'D:\app\EShyee\oradata\orcl\wbtemp.dbf' size 300M;
    CREATE user wb identified by wb default tablespace wb temporary tablespace wbtemp;
    + +

    ②建立表emp1,并用pl/sql程序为其生成一百万行数据。

    +
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    grant connect,resource to wb;
    conn wb/wb;
    create table emp1(id number(8,0),name varchar2(20),sex number(1,0),birth date ,phone varchar2(15));
    DECLARE
    vtoday date;
    vcnt number(8,0):=1000000;
    --PL
    begin
    SELECT sysdate into vtoday from dual;
    for i in 1..vcnt LOOP
    INSERT into EMP1(id,name,sex,birth,PHONE) VALUES(i,'name'||i,mod(i,2),vtoday-i,'phone'||i);

    IF mod(i,100)=0 THEN
    commit;
    END IF;
    END LOOP;
    end;
    + +

    ③通过计算表上的统计数据得到查询语句的开销。由于表中有大量的数据,为确保SQL*Plus显示查询的开销,而不显示查询结果。进行如下设置:

    +
    1
    2
    analyze table emp1 compute statistics;
    set autotrace trace explain;
    + +

    ④对empl表进行查询,从中获取一行数据,

    +
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
     select id,name,phone from emp1 where id=849765;

    执行计划
    ----------------------------------------------------------
    Plan hash value: 2226897347

    --------------------------------------------------------------------------
    | Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time |
    --------------------------------------------------------------------------
    | 0 | SELECT STATEMENT | | 1 | 25 | 1654 (2)| 00:00:20 |
    |* 1 | TABLE ACCESS FULL| EMP1 | 1 | 25 | 1654 (2)| 00:00:20 |
    --------------------------------------------------------------------------

    Predicate Information (identified by operation id):
    ---------------------------------------------------

    1 - filter("ID"=849765)
    + +

    ⑤在empl表的id列上创建索引,重新执行查询,

    +
    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
    create index idx_id on emp1(id);

    select id,name,phone from emp1 where id=849765;

    执行计划
    ----------------------------------------------------------
    Plan hash value: 3940360760

    --------------------------------------------------------------------------------
    ------

    | Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time
    |

    --------------------------------------------------------------------------------
    ------

    | 0 | SELECT STATEMENT | | 1 | 25 | 4 (0)| 00:0
    0:01 |

    | 1 | TABLE ACCESS BY INDEX ROWID| EMP1 | 1 | 25 | 4 (0)| 00:0
    0:01 |

    |* 2 | INDEX RANGE SCAN | IDX_ID | 1 | | 3 (0)| 00:0
    0:01 |

    --------------------------------------------------------------------------------
    ------


    Predicate Information (identified by operation id):
    ---------------------------------------------------

    2 - access("ID"=849765)
    + +

    检查索引是否已经创建。

    +
    1
    select index_name from user_indexes where table_name='emp1';
    + +

    使用SELECT查看表emp1的索引信息。

    +
    1
    select index_name,table_name,uniqueness,status from user_indexes where table_name='emp1';
    + +

    修改idx_ id 索引。

    +
    1
    alter index idx_id rename to emp1_idx_id;
    + +

    删除idx_sex 索引。

    +
    1
    DROP index idx_sex;
    + +
    Author: SHYEE
    Link: http://example.com/2021/03/12/%E8%A7%86%E5%9B%BE/
    Copyright Notice: All articles in this blog are licensed under CC BY-NC-SA 4.0 unless stating additionally.
    \ No newline at end of file diff --git "a/2021/03/12/\350\256\241\347\256\227\346\234\272\346\223\215\344\275\234\347\263\273\347\273\237(2)/index.html" "b/2021/03/12/\350\256\241\347\256\227\346\234\272\346\223\215\344\275\234\347\263\273\347\273\237(2)/index.html" new file mode 100644 index 0000000..022c98f --- /dev/null +++ "b/2021/03/12/\350\256\241\347\256\227\346\234\272\346\223\215\344\275\234\347\263\273\347\273\237(2)/index.html" @@ -0,0 +1,774 @@ +计算机操作系统(2) | SHYEE-PLASMA + + + + + + + + + + + + + +

    计算机操作系统(2)

    + +

    进程管理

    程序的并发执行

    程序是描述计算机所要完成的具有特定功能的,并在时间上按严格次序前后相继的计算机操作序列集合(一个静态的概念)

    +

    程序顺序执行的特点:

    +
      +
    1. 顺序性
    2. +
    3. 封闭性
    4. +
    5. 可再现性
    6. +
    +

    程序在执行时应考虑的环境

    +
      +
    1. 独立性
    2. +
    3. 随机性
    4. +
    5. 资源共享性
    6. +
    +

    进程

    并发执行的程序在执行过程中分配和管理资源的基本单位

    +

    特点:

      +
    1. 动态概念
    2. +
    3. 并发特征(程序没有)
    4. +
    5. 竞争计算机系统资源的基本单位
    6. +
    7. 不同的进程可以包含同一个程序
    8. +
    +

    进程的组成:

    进程控制块PCB:
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    信息含义
    状态说明进程当前的状态
    进程标识符标明系统中各个进程
    位置信息指明程序及数据在主存或外存的位置
    控制信息参数、信号量、消息等
    队列指针连接统一状态的进程
    优先级进程调度的依据
    现场保护区将处理机的现场保护到该区域
    其他
    +
    程序
    数据

    进程的状态

    运行态、就绪态、阻塞态/等待态、新建态、退出态

    +

    进程切换

    切换的时机

    +
      +
    1. 时钟中断
    2. +
    3. I/O中断
    4. +
    5. 内存失效
    6. +
    7. 遇到陷阱
    8. +
    9. 系统调用
    10. +
    +

    空->创建:新的批处理作业、交互登录、为提供服务而由操作系统创建、由现有进程派生

    +

    新建->就绪态:操作系统做好准备再接纳一批新进程时

    +

    就绪->运行态:需要选择一个新进程时

    +

    运行->就绪:正在运行的进程达到“允许不中断执行”的最大时间段、被优先级更高的进程抢占、进程自愿释放处理器(周期性的进程)

    +

    运行->阻塞:对于进程请求的服务,操作系统无法立即予以服务、请求一个无法得到的资源、需要进行初始化的时候、进程通信时,一个进程等待另一个进程的信息。从磁盘读数据时(可能)

    +

    阻塞->就绪:等待的时间发生时

    +

    一个读磁盘操作完成以后,操作系统会修改进程状态为就绪态

    +

    进程的创建

      +
    1. 由系统程序模块统一创建
    2. +
    3. 有父进程创建
    4. +
    +

    用户登录成功后需要创建新进程
    启动程序执行创建新进程

    +
    +

    设备分配是通过在系统中设置相应的数据结构实现的,不必创建新进程。

    +

    进程的撤销

      +
    1. 该进程已完成所要求的功能而正常终止
    2. +
    3. 由于某种错误导致非正常终止
    4. +
    5. 祖先进程要求撤销某个子进程
    6. +
    +

    进程的通信

    主从式
      +
    1. 主进程可自由使用从进程的资源或数据
    2. +
    3. 从进程的动作受主进程的控制
    4. +
    5. 主进程和从进程的关系是固定的
    6. +
    +
    会话式
      +
    1. 使用进程在服务进程所提供的服务之前,必须得到许可
    2. +
    3. 服务进程所提供的服务的控制由自身完成
    4. +
    5. 使用进程和服务进程在通信时有固定的链接关系
    6. +
    +
    消息或邮箱机制
      +
    1. 只要存在空缓冲区或邮箱,发送进程就可以发送消息
    2. +
    3. 发送进程和接受进程无直接连接关系
    4. +
    5. 两进程之间存在缓冲区或邮箱
    6. +
    +
    共享存储区方式

    不要求数据移动

    +
    管道通信

    类似于半双工
    大小为内存上的一页

    +

    临界区

    不允许多个并发进程交叉执行的一段程序
    禁止两个进程同时进入临界区的准则:

    +
      +
    1. 空闲让进
    2. +
    3. 忙则等待
    4. +
    5. 有限等待
    6. +
    7. 让权等待
    8. +
    +

    实现互斥

    软件方法

      +
    1. 单标志法
      违背空闲让进
    2. +
    3. 双标志法先检查
      违背忙则等待
    4. +
    5. 双标志法后检查
      导致互相谦让,谁也进不了临界区
      最终饥饿
    6. +
    7. Peterson算法
      代码语句中设置了turn
      无法实现让权等待
    8. +
    +

    硬件实现方法

      +
    1. 中断屏蔽法
      限制了处理机交替执行程序的能力
    2. +
    3. 硬件指令法
      TestAndSet指令(原子操作)(不会主动放弃CPU,完成时会唤醒处于就绪态的进程,在开中断下运行)、Swap指令
      硬件方法不能实现让权等待
    4. +
    +

    信号量

    条件变量与信号量的比较

    +
      +
    • 相同点
      条件变量的wait/signal操作类似于信号量的p/v操作,可实现进程的阻塞/唤醒
    • +
    • 不同点
      条件变量是没有值的,仅实现了“排队等待”功能;而信号量是“有值”的,信号量的值反应了剩余资源数,而在管程中,剩余资源数用共享数据结构记录。
    • +
    +

    管程

    代表共享资源的数据结构,以及由对该共享资源数据结构实施操作的一组过程所组成的资源管理程序。

    +

    实现共享资源封装
    每次只允许一个进程进入管程

    +

    经典同步问题

    生产者消费者问题
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    semaphore mutex=1;	//临界区互斥信号量
    semaphore empty=n; //空闲缓冲区
    semaphore full=0; //缓冲区初始化为空
    producer(){ //生产者进程
    while(1){
    produce an item in next; //生产数据
    P(empty); //获取空缓冲单元
    P(mutex); //进入临界区
    Add next to buffer; //加入数据
    V(mutex); //离开临界区,释放互斥信号量
    V(full); //满缓冲区加1
    }
    }
    consumer(){ //消费者进程
    while(1){
    P(full); //获取满缓冲单元
    P(mutex); //进入临界区
    Remove an item from buffer;
    V(mutex); //离开缓冲区
    V(empty); //空缓冲区加1
    Consume the item; //消费
    }
    }
    + +
    读者-写者问题
    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
    int count=0;			//用于记录当前的读者数量

    semaphore mutex=1; //用于保护更新count变量时的互斥
    semaphore rw=1; //用于保证读者和写者互斥地访问文件
    semaphore w=1; //用于实现写优先

    writer() { //写者进程

    while(1) {
    P(w);
    P(rw) ; //互斥访问共享文件

    writing; //写入

    V(rW); //释放共享文件
    V(w);


    reader() { //读者进程
    while (1) {
    P(w)
    P (mutex) ; //互斥访问count变量
    if (count==0) //当第一个读进程读共享文件时
    P(rw); //阻止写进程写
    count++; //读者计数器加1
    V (mutex) ; //释放互斥变量count
    V(w);
    reading; //读取
    P (mutex) ; //互斥访问count变量
    count--; //读者计数器减1
    if (count==0) //当最后一个读进程读完共享文件
    V(rw) ; //允许写进程写
    V (mutex) ; //释放互斥变量count
    }
    }
    + +
    哲学家问题
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    semaphore chopstick[5]={1,1,1,1,1}; //初始化信号量
    semaphore mutex=1; //设置取筷子的信号量
    Pi() { //i号哲学家的进程
    do{
    P (mutex) ; //在取筷子前获得互斥量
    P (chopstick[i]) ; //取左边筷子
    P (chopstick[(i+1)%5]) ; //取右边筷子
    V (mutex) ; //释放取筷子的信号量
    eat; //进餐
    V(chopstick[i]) ; //放回左边筷子
    V (chopstick[(i+1)%5]) ; //放回右边筷子
    think; //思考
    } while (1) ;
    }
    + +

    死锁

    死锁的原因

      +
    1. 系统资源的竞争
    2. +
    3. 进程推进顺序非法
    4. +
    5. 死锁产生的必要条件:
    6. +
    +
      +
    • 互斥条件
    • +
    • 不剥夺条件
    • +
    • 请求并保持条件
    • +
    • 循环等待条件
    • +
    +

    死锁的预防

      +
    1. 破坏互斥条件
      不可行
    2. +
    3. 破坏不剥夺条件
      用于状态易于保存和恢复的资源 如CPU的寄存器及内存资源,不适用于打印机
    4. +
    5. 破坏请求并保持条件
      采用预先静态分配方法
      会导致饥饿
    6. +
    7. 破坏循环等待条件
      采用顺序资源分配算法
      限制了新设备的增加
      造成资源浪费
      给用户编程带来麻烦
    8. +
    +

    死锁避免

      +
    1. 系统安全状态
    2. +
    3. 银行家算法
    4. +
    +

    死锁的检测和排除

      +
    1. 资源分配图
    2. +
    3. 死锁定理
    4. +
    5. 死锁解除
    6. +
    +
      +
    • 资源剥夺法
    • +
    • 撤销进程法
    • +
    • 进程回退法
    • +
    +

    线程

    线程是调度的基本单位
    线程控制块TCB
    用户级线程只可在用户空间中进行,所以在不支持内核级线程的系统中也可以实现管理。
    用户级线程的切换效率更高。

    +

    典型应用

      +
    1. 服务器中的文件管理或通信控制
    2. +
    3. 前后台处理
    4. +
    5. 异步处理
    6. +
    +

    多线程模型

    多对一

    多个用户映射到一个内核级线程,用户线程对操作系统不可见
    多个线程不能并行运行在多处理机上

    +

    一对一

    每个用户级线程映射到一个内核级线程
    线程开销大

    +

    多对多

    n个用户级映射到m个内核级线程上,要求m<=n

    +

    中断技术

    在程序执行过程中遇到急需处理的事件时,暂时中止现行程序在CPU上的执行,转而执行相应的事件处理程序,待处理完成后返回中断点或调用其他程序。

    +

    外中断(中断或者异步中断)

    来自处理器之外的中断
    分为可屏蔽中断和不可屏蔽中断
    既发生在用户态又发生在内核态

    +
      +
    1. 时钟中断
    2. +
    3. 键盘中断
    4. +
    5. 它机中断
    6. +
    7. 外部设备中断
    8. +
    +

    内中断(异常或同步中断)

      +
    1. 访管中断->执行系统调用引起
    2. +
    3. 硬件故障中断->电源失效、奇偶校验错误、总线超时
    4. +
    5. 程序性异常->非法操作、地址越界、页面故障、调试指令、除数为零、浮点溢出
      大部分异常都发生在用户态,只有“缺页异常“发生在内核态
    6. +
    +

    中断的执行过程

      +
    1. 关中断 此时不能响应更高级的中断请求
    2. +
    3. 保存断点 即PC
    4. +
    5. 引出中断服务程序 将地址送入PC
    6. +
    7. 保存现场和屏蔽字
    8. +
    9. 开中断 此时允许更高级的的中断
    10. +
    11. 执行中断服务程序
    12. +
    13. 关中断
    14. +
    15. 恢复现场和屏蔽字
    16. +
    17. 开中断、中断返回
      PC由硬件保存,通用寄存器由操作系统保存
      1~3由硬件(中断隐指令)完成,4~9 软件完成
    18. +
    +

    中断事件处理

    硬件故障中断

    硬件故障导致

    +
    处理过程
      +
    1. 中断处理程序 保护现场
    2. +
    3. 停止设备工作
    4. +
    5. 停止处理及运行
    6. +
    7. 向操作员报告
    8. +
    +

    程序性中断

    语法错误、逻辑错误、运行中异常

    +
    处理过程
      +
    1. 因人而异
    2. +
    3. 借助于信号机制
    4. +
    5. 操作系统将中断事件捕获交给应用程序
    6. +
    +

    I/O中断

    处理原则
      +
    1. I/O正常结束 待传输的下一个进程设置为就绪态
    2. +
    3. I/O发生故障 向设备发命令索取状态字、分析故障的确切原因、复执或转人工
    4. +
    5. I/O异常 报告操作员
    6. +
    7. 设备报到或设备结束 操作系统修改系统数据结构中相应设备的状态
    8. +
    +

    访管中断

    表示当前运行程序对操作系统功能的调用

    +
    处理过程
      +
    1. 程序执行访管指令,并通过适当方式指明系统调用号。
    2. +
    3. 通过中断机制进入访管中断处理程序,现场信息被保护到核心栈,按功能号实现跳转。
    4. +
    5. 通过系统调用人口地址表找到相应中断服务例程的入口地址。
    6. +
    7. 执行中断服务例程,正常情况下在结束后返回系统调用的下一条指令继续
      执行。
    8. +
    +

    时钟中断

    处理和时间有关的信息及决定是否程序调度
    和时间有关的信息:系统时间、进程的时间片、延时、使用CPU的时间、各种定时器。
    时钟分绝对时钟和间隔时钟

    +
    间隔定时器:
      +
    1. real 永远在计时(包括进程挂起时)
    2. +
    3. virtual 只在用户态计时
    4. +
    5. profile 在用户态和内核态都计时
    6. +
    +

    系统调用

    分类

      +
    • 设备管理
    • +
    • 文件管理
    • +
    • 进程管理
    • +
    • 进程通信
    • +
    • 内存管理
    • +
    +

    要运行在核心态

    由内核程序负责完成
    用户通过trap 来发起系统调用请求

    +

    用户态转向核心态

      +
    1. 用户程序要求操作系统的服务,如系统调用
    2. +
    3. 发生一次中断
    4. +
    5. 用户程序产生了一次错误状态
    6. +
    7. 用户程序企图执行一条特权指令
      用中断返回指令返回用户态
    8. +
    +

    主要过程

      +
    1. 传递系统调用参数
    2. +
    3. 执行trap指令
    4. +
    5. 执行相应的服务程序
    6. +
    7. 返回用户态
    8. +
    +

    大内核与微内核

    大内核的好处

    可充分利用模块之间有效特性,无可比拟的性能优势

    +

    微内核的特点

      +
    1. 添加系统服务时,不必修改内核
    2. +
    3. 有效分离接口
    4. +
    5. 微内核结构没有单一内核稳定
    6. +
    +

    处理机调度

    分级调度

      +
    1. 作业调度 又称宏观调度或者高级调度
    2. +
    3. 交换调度 又称中级调度或者内存调度
    4. +
    5. 进程调度 又称微观调度或者低级调度
    6. +
    7. 线程调度
      作业调度次数少,中级次数略多,进程调度频率最高
      进程调度和切换程序是操作系统内核程序
    8. +
    +
    +

    现代操作系统中,不能进行进程的调度与切换的情况有以下几种:

    +
      +
    1. 在处理中断的过程中,中断处理过程复杂,在实现上很难做到进程程切换,而且中断处理是系统工作的一部分,逻辑上不属于某一进程,不应被剥夺处理机资源。
    2. +
    3. 进程在操作系统内核程序临界区中。进入临界区后,需要独占式地访问共享数据,理论上必须加锁,以防止其他并行程序进入,在解锁前不应切换到其他进程运行,以加快该共享数据的释放。
    4. +
    5. 其他需要完全屏蔽中断的原子操作过程中。如加锁、解锁、中断现场保护、恢复等原子操作。在原子过程中,连中断都要屏蔽,更不应该进行进程调度与切换。
    6. +
    +
    +

    进程调度方式

      +
    • 非抢占(剥夺)式
    • +
    • 抢占(剥夺)式
    • +
    +

    调度的基本准则

      +
    1. CPU利用率
    2. +
    3. 系统吞吐量 单位时间内CPU完成作业的数量 作业数量/时间
    4. +
    5. 周转时间
      周转时间=作业完成时间-作业提交时间
      平均周转时间=(作业1的周转时间+…+作业n的周转时间)/n
      带权周转时间=作业周转时间/作业实际运行时间
      平均带权周转时间=n个带权周转时间/n
    6. +
    7. 等待时间 进程处于等处理机状态的时间之和
    8. +
    9. 响应时间 用户提交到系统首次响应的时间
    10. +
    +

    进程调度

    功能

      +
    1. 记录系统中所有进程执行的的情况
    2. +
    3. 选择占有处理机的过程
    4. +
    5. 进行进程上下文的切换
    6. +
    +

    进程调度的时机

      +
    1. 正在执行的进程执行完毕,或者进程被创建时
    2. +
    3. 执行中进程自己调用阻塞原语将自己阻塞起来,进入睡眠等待状态
    4. +
    5. 执行中进程提出IO请求后被阻塞
    6. +
    7. 在分时系统中时间片已经用完
    8. +
    9. 在执行完系统调用,系统程序返回用户程序时
    10. +
    11. 进程处于临界区时也可以调度
      以上是不可剥夺方式下的原因
    12. +
    13. 就绪队列中的某进程的优先级变得高于当前执行进程的优先级
    14. +
    +
    UNIX中
      +
    1. 进程自己调用sleep和wait进入睡眠
    2. +
    3. 由于系统调用结束返回用户态,调度标志被置位
    4. +
    5. 完成中断或trap
    6. +
    7. 时间片用完
    8. +
    9. 调用exit自我终止
    10. +
    +

    调度算法

    先来先服务算法FIFS

    算法简单效率低
    对长作业有利对短作业不利
    有利于CPU繁忙型作业,不利于IO繁忙型

    +

    短作业优先调度算法SJF

    对于长作业不利
    未考虑作业的紧迫程度
    作业的长短根据用户的估计而定(不准)
    SJF的平均等待时间、平均周转时间最少

    +

    优先级调度算法

      +
    1. 非剥夺式
    2. +
    3. 剥夺式
    4. +
    5. 静态优先级 创建进程时决定的
    6. +
    7. 动态优先级 进程运行过程中调整
    8. +
    +

    优先级的设置参照原则

      +
    1. 系统进程>用户进程

      +
    2. +
    3. 交互型进程 >非交互型进程

      +
    4. +
    5. IO型进程 >计算型进程

      +
    6. +
    +

    高响应比优先调度算法

    响应比Rp=(等待时间+要求服务时间)/要求服务时间
    因此

    +
      +
    1. 作业的等待时间相同时,要求服务时间越短,响应比越高,有利于短作业
    2. +
    3. 要求时间相同时,作业的响应比由其等待时间决定,(FCFS)
    4. +
    5. 对长作业,等待时间足够长时,其响应比便可升的很高
    6. +
    +

    时间片轮转调度算法

    适用于分时系统
    剥夺式
    当一个处于运行态的进程用完一个时间片后它的状态处于就绪

    +

    多级反馈队列调度算法

      +
    1. 设置多个就绪队列,每个队列优先级不同
    2. +
    3. 每个队列中进程执行的时间片的大小各不相同
    4. +
    5. 队列中FCFS,队列间时间片轮转
    6. +
    7. 允许抢占
    8. +
    +
    优势
      +
    1. 终端型作业用户:短作业优先
    2. +
    3. 短批处理作业用户:周转时间较短
    4. +
    5. 长批处理作业用户:不会长期得不到处理
    6. +
    +

    实时调度

    分为软实时调度和硬实时调度
    实时操作系统的特点:

    +
      +
    1. 有限等待时间(决定性)
    2. +
    3. 有限响应时长
    4. +
    5. 用户控制
    6. +
    7. 可靠性高
    8. +
    9. 系统出错处理能力强
    10. +
    +

    要求:

      +
    1. 很快的进程或线程切换速度
    2. +
    3. 快速的外部中断响应能力
    4. +
    5. 基于优先级的随时抢占式调度策略:
    6. +
    +
      +
    • 优先级+时间片轮转调度
    • +
    • 基于优先级的非抢占式调度
    • +
    • 基于优先级的固定抢占式调度
    • +
    • 基于优先级的随时抢占式调度
    • +
    +

    分类:

      +
    1. 静态表格法
      静态分析——直接产生调度结果
      多用于处理周期性任务
    2. +
    3. 静态优先级驱动抢占式调度算法
      也进行静态分析——不直接产生调度结果——只用来指定优先级
    4. +
    5. 动态计划调度算法
      在执行调度任务前排调度计划
    6. +
    7. 尽力而为调度算法
      不进行可能性分析
    8. +
    +

    实现调度算法

    所包涵的内容信息:

    +
      +
    1. 任务就绪时间或事件到达时间
      周期性事件可预知,但非周期性事件大部分时间不可预知
    2. +
    3. 开始时限
    4. +
    5. 完成时限
    6. +
    7. 处理时间
    8. +
    9. 资源要求
    10. +
    11. 优先级
    12. +
    +

    算法思想:按用户的时限要求顺序设置处理机
    抢占式的
    可用于非周期性任务调度

    +

    频率单调调度算法

    广泛应用于多周期性实时处理
    原理:
    频率越低优先级越低

    +

    内存管理基本原理

    功能

    1. 虚拟存储器

    进程中的目标代码、数据等的虚存地址组成的虚拟空间称为虚拟存储器

    +

    2. 地址变换

    内存地址(物理单元)的集合成为内存空间或物理地址空间
    物理地址空间是地址转换的最终地址

    +
      +
    • 静态地址重定位
      要求执行前完成链接
      必须占用连续的内存空间
    • +
    • 动态地址重定位
      依靠硬件地址变换机构
      该机构需要一个或多个基地址寄存器BR和一个或多个程序虚拟地址寄存器VR
      内存地址MA=BR+VR
      优点:
    • +
    +
      +
    1. 可以对内存进行非连续分配
    2. +
    3. 提供了实现虚拟存储器的基础
    4. +
    5. 有利于程序段的共享
    6. +
    +

    3. 内外存数据传输的控制

    用户控制:覆盖
    系统控制:交换、请求调入+预调入
    一个进程正在IO时,不能交换出内存

    +

    4. 内存的分配与回收

    连续分配方式
      +
    • 单一连续分配
      无外部碎片、可采用覆盖技术
      只能用于单用户、有内部碎片
    • +
    • 固定分区分配
      多道
      分区大小相等。用于一台计算机控制多个相同对象
      分区大小不等。多个较小,适量中分区,少量大分区
      程序太大就放不进任何分区了
      内存利用率低,会产生内部碎片
      无外部碎片
      有关管理通过分区说明表进行
    • +
    • 动态分区分配
      旗下的几种算法:
    • +
    +
      +
    1. 首次适应算法
      空闲地址递增的顺序链接
      具有最佳性能
    2. +
    3. 最佳适应算法
      容量递增方式链接
    4. +
    5. 最坏适应算法
      容量递减方式链接
    6. +
    7. 邻近适应算法
      首次适应的演变,在上次查找的位置开始查找
    8. +
    +

    5. 内存信息的共享与保护

    常用的内存信息保护方法:
      +
    1. 上下界保护法(硬件)
    2. +
    3. 保护键法
    4. +
    5. 界限寄存器与CPU的用户态或核心态工作方式相结合
    6. +
    +

    源程序转换为在内存中执行的程序步骤:

    +
      +
    1. 编译
    2. +
    3. 链接 逻辑地址——>物理地址
    4. +
    5. 装入
    6. +
    +
    程序链接的三种方式:
      +
    1. 静态链接
    2. +
    3. 装入时动态链接
    4. +
    5. 运行时动态链接
    6. +
    +
    装入的的三种方法:
      +
    1. 绝对装入
    2. +
    3. 可重定位装入
    4. +
    5. 动态运行时装入
    6. +
    +

    页式管理

    为了减少碎片以及为了只在内存存放那些反复利用的或即将执行的程序段与数据部分,而把那些不经常执行的程序段和数据存储在外存。
    不会产生外部碎片

    +

    名词

    每个进程平均产生半个块大小的内部碎片(页内碎片)
    进程的虚拟空间被划分为若干个等长的页(Page)
    每个页1~4K(旧)
    内存空间按页的大小分为片或页面/帧/框(Page framework)
    外存也以同样的单位划分,成为块(block)

    +

    地址结构

    分为两部分
    页号P——页内偏移量W

    +

    页表

    记录页面在内存中对应的物理块号
    一般存于内存中
    页表由页表项
    页表项的结构:页号——物理内存中的块号
    页表项的第二部分与地址的第二部分共同组成物理地址
    加入中断处理后的页表

    + + + + + + + + + + + + + + + +
    页号页面号中断位外存始址
    +

    | 页号 | 页面号 | 中断位 | 外存始址 |
    加入改变位后的页表
    | 页号 | 页面号 | 中断位 | 外存始址 | 改变位 |

    +

    计算过程

    页号P=逻辑地址A/页面大小L
    页内偏移量W=A%L
    如果页号P>=页表长度M,产生越界中断
    页表项地址=页表始址F+页号P页表项长度
    页表长度一般指有多少页
    页表项长度一般指页地址占多大的存储空间
    物理地址E=块内内容b
    页面大小L+页内偏移量W
    注:
    页表项的确定:
    n位逻辑地址空间对应的2^nB除以一页的大小mB
    得到的u=2^n/m页,页表项以字节编址,因此页表项大于等于log(u)/8

    +

    快表

    在地址转换机构中添加一个具有并行查找能力的高速缓冲存储器。

    +

    段式管理

    分段

    按进程中的自然段划分逻辑空间
    其逻辑地址由段号s——段内偏移量w组成
    段内连续,段间不要求连续

    +

    段表

    | 段号 | 段长 | 本段在主存中的地址 |
    | 段号 | 始址 | 长度 | 存取方式 | 内外 | 访问位 |

    +

    地址变换结构

      +
    • 逻辑地址A中前几位为段号S,后几位为段内偏移量W
    • +
    • 比较段号S和段表长度M,if(S>=M)越界中断
    • +
    • 段号S对应的段表项地址=段表始址F+段号S*段表项长度
    • +
    • 取出段表中该段的始址b,计算物理地址E=b+W
    • +
    +

    段的共享与保护

    都指向被共享的段的同一个物理副本。不能修改的代码成为纯代码或可重入代码(不属于临界资源)
    保护方法一般有两种:

    +
      +
    1. 存取控制
    2. +
    3. 地址越界保护
    4. +
    +

    段业式管理

    | 段号 | 页号 | 页内相对地址(偏移量) |
    在一个进程中,段表只有一个,而页表可能有多个

    +

    虚拟内存管理

    需要的支持

      +
    1. 页表机制(或段表机制),作为主要的数据结构
    2. +
    3. 中断机制,当用户程序要访问的部分尚未调入内存时,产生中断
    4. +
    5. 地址变换机构,逻辑地址到物理地址
    6. +
    +

    请求页表机制

    页表项
    | 页号 | 物理块号 | 状态位P | 访问字段A | 修改位M | 外存地址 |

    +
      +
    • 状态位P:用于指示是否调入内存
    • +
    • 访问字段A:用于页面置换
    • +
    • 修改位M:标识调入内存后是否被修改过
    • +
    • 外存地址:支持该页在外存上的地址,通常是物理块号
    • +
    +

    缺页中断机构

    缺页中断后,进程进入阻塞。
    属于内部中断

    +

    页面置换算法

    最佳置换算法(OPT)

    淘汰一个最长时间内不再被访问的页
    无法实现

    +

    先进先出页面置换算法(FIFO)

    会产生所分配的物理块数增大而故障数不减反增的异常现象(Belady异常)
    基于队列实现

    +

    最近最久未使用置换算法

    堆栈类算法

    +

    时钟(clock)置换算法

    每帧关联一个附加位(使用位)

    +

    改进的clock算法:

    增加一个修改位
    每帧有四种情况:

    +
      +
    1. 最近未被访问,也未被修改(u=0,m=0)
    2. +
    3. 最近被访问,但未被修改(u=1,m=0)
    4. +
    5. 最近位被访问,但被修改 (u=0,m=1)
    6. +
    7. 最近被访问,被修改 (u=1,m=1)
      按以上顺序进行淘汰
    8. +
    +

    页面分配策略

    驻留集大小

    三种策略

    +
      +
    1. 固定分配局部置换
    2. +
    3. 可变分配全局置换
    4. +
    5. 可变分配局部置换
    6. +
    +

    调入的时机

      +
    1. 预调页策略
    2. +
    3. 请求调页策略
    4. +
    +

    从何处调页

    请求分页系统的外存分为

    +
      +
    • 存放文件的文件区(连续分配方式)
    • +
    • 存放对换页面的对换区 (离散分配方式) IO更快
    • +
    +

    调入时机

      +
    1. 系统拥有足够的对换区空间:全部从对换区调入
    2. +
    3. 系统缺少足够的对换区空间:凡不会被修改的文件直接从文件区调入,可能被修改的文件在换出时调入对换区,以后需要的时候直接从对换区调入
    4. +
    5. UNXI方式:与进程有关的放入文件区。运行过被换出的页面放在对换区。进程请求的共享页面若被其他进程调入内存,则无需再从对换区调入
    6. +
    +

    抖动

    频繁发生缺页中断(抖动)的原因:某个进程频繁访问的页面数目高于可用的物理页帧数。
    虚拟内存技术可以在内存中保留更多的进程以提高系统效率。

    +

    工作集

    某段时间间隔内,进程要访问的页面集合。
    工作集大小一般比工作集窗口小很多
    分配给进程的物理块数(驻留集大小)大小要大于工作集大小

    +

    文件的一些概念

    定义

    以计算机硬盘为载体的储存在计算机上的信息的集合。
    计算机进行资源的调度和分配:进程
    用户进行的输入、输出中的基本单位:文件

    +

    文件的属性

      +
    • 名称
    • +
    • 标识符
    • +
    • 类型
    • +
    • 位置
    • +
    • 大小
    • +
    • 保护
    • +
    • 时间
    • +
    +

    文件的基本操作

      +
    • 创建文件
    • +
    • 写文件
    • +
    • 读文件
    • +
    • 文件重定位(文件寻址)
    • +
    • 删除文件
    • +
    • 截断文件
    • +
    +

    文件的分类

    按性质和用途

      +
    • 系统文件
    • +
    • 库文件
    • +
    • 用户文件
    • +
    +

    按组织形式

      +
    • 普通文件
    • +
    • 目录文件
    • +
    • 特殊文件
    • +
    +

    文件的打开与关闭

    打开文件相关联的信息:

    +
      +
    • 文件指针 系统跟踪上次读写位置,作为当前文件位置的指针
    • +
    • 文件打开计数 计数为零时,系统关闭文件,删除该条目
    • +
    • 文件磁盘位置
    • +
    • 访问权限
    • +
    +

    文件的逻辑结构

    无文件结构(流式文件)

    以字节Byte为单位

    +

    访问通过穷举搜索方式

    +

    源程序文件、目标代码文件等采用这种方式

    +

    有文件结构(记录式文件)

    顺序文件

    记录定长

    +

    顺序存储或链表形式存储

    +

    顺序搜索

    +

    两种结构:

    +
      +
    • 串结构 记录之间的顺序与关键字无关 按时间先后排序
    • +
    • 顺序结构 按关键字排序
    • +
    +

    索引文件

    第i条记录相对于第一条记录的地址 A=i*L

    +

    索引表

    + + + + + + + + + + + + + +
    索引号长度m指针ptr
    0m
    +

    索引顺序文件

    将每组中的第一个文件放在索引表中

    +

    直接文件或散列文件

    没有顺序的特性

    +

    目录结构

    文件控制块FCB

    FCB必须连续存放

    +

    FCB的有序集合称为文件目录

    +

    FCB包含的信息:

    +
      +
    1. 基本信息
    2. +
    3. 存取控制信息 文件存取权限等
    4. +
    5. 使用信息 文件建立时间、修改时间
    6. +
    +

    索引结点

    UNXI中的磁盘索引结点包含信息:

    +
      +
    1. 文件主标识符 个人或小组
    2. +
    3. 文件类型 普通文件、目录文件、特别文件
    4. +
    5. 文件存取权限
    6. +
    7. 文件物理地址 13个地址项iaddr(0)~iaddr(12)
    8. +
    9. 文件长度 以字节为单位
    10. +
    11. 文件链接计数
    12. +
    13. 文件存取时间
    14. +
    +

    文件被打开时有增加了以下内容:

    +
      +
    • 索引结点编号 标识内存索引结点
    • +
    • 状态 指示是否上锁或被修改
    • +
    • 访问计数
    • +
    • 逻辑设备号
    • +
    • 链接指针
    • +
    +

    目录结构

    所要执行的操作

    +
      +
    • 搜索
    • +
    • 创建文件
    • +
    • 删除文件
    • +
    • 显示目录
    • +
    • 修改目录
    • +
    +

    单级目录结构

    一个文件占一个目录

    +

    两级目录结构

    主文件目录MFD

    记录用户文件目录所在位置和用户名

    +
    用户文件目录UFD

    用户文件的FCB

    +

    多级目录结构

    树形目录结构

    +

    从根目录出发的路径是绝对路径

    +

    当前目录 :基于当前工作目录(相对路径)

    +

    方便对文件分类

    +

    无环图目录结构

    树形目录结构的基础上增加了一些指向同一结点的有向边

    +

    实现文件共享

    +
    Author: SHYEE
    Link: http://example.com/2021/03/12/%E8%AE%A1%E7%AE%97%E6%9C%BA%E6%93%8D%E4%BD%9C%E7%B3%BB%E7%BB%9F(2)/
    Copyright Notice: All articles in this blog are licensed under CC BY-NC-SA 4.0 unless stating additionally.
    Announcement
    等离子体实验室
    Catalog
    1. 1. 进程管理
      1. 1.1. 程序的并发执行
      2. 1.2. 进程
        1. 1.2.1. 特点:
        2. 1.2.2. 进程的组成:
          1. 1.2.2.1. 进程控制块PCB:
          2. 1.2.2.2. 程序
          3. 1.2.2.3. 数据
        3. 1.2.3. 进程的状态
        4. 1.2.4. 进程切换
        5. 1.2.5. 进程的创建
        6. 1.2.6. 进程的撤销
        7. 1.2.7. 进程的通信
          1. 1.2.7.1. 主从式
          2. 1.2.7.2. 会话式
          3. 1.2.7.3. 消息或邮箱机制
          4. 1.2.7.4. 共享存储区方式
          5. 1.2.7.5. 管道通信
      3. 1.3. 临界区
      4. 1.4. 实现互斥
        1. 1.4.1. 软件方法
        2. 1.4.2. 硬件实现方法
        3. 1.4.3. 信号量
        4. 1.4.4. 管程
        5. 1.4.5. 经典同步问题
          1. 1.4.5.1. 生产者消费者问题
          2. 1.4.5.2. 读者-写者问题
          3. 1.4.5.3. 哲学家问题
    2. 2. 死锁
      1. 2.1. 死锁的原因
      2. 2.2. 死锁的预防
      3. 2.3. 死锁避免
      4. 2.4. 死锁的检测和排除
    3. 3. 线程
      1. 3.1. 典型应用
      2. 3.2. 多线程模型
        1. 3.2.1. 多对一
        2. 3.2.2. 一对一
        3. 3.2.3. 多对多
    4. 4. 中断技术
      1. 4.0.1. 外中断(中断或者异步中断)
      2. 4.0.2. 内中断(异常或同步中断)
      3. 4.0.3. 中断的执行过程
    5. 4.1. 中断事件处理
      1. 4.1.1. 硬件故障中断
        1. 4.1.1.1. 处理过程
      2. 4.1.2. 程序性中断
        1. 4.1.2.1. 处理过程
      3. 4.1.3. I/O中断
        1. 4.1.3.1. 处理原则
      4. 4.1.4. 访管中断
        1. 4.1.4.1. 处理过程
      5. 4.1.5. 时钟中断
        1. 4.1.5.1. 间隔定时器:
  • 5. 系统调用
    1. 5.1. 分类
    2. 5.2. 要运行在核心态
    3. 5.3. 用户态转向核心态
    4. 5.4. 主要过程
  • 6. 大内核与微内核
    1. 6.1. 大内核的好处
    2. 6.2. 微内核的特点
  • 7. 处理机调度
    1. 7.1. 分级调度
    2. 7.2. 进程调度方式
    3. 7.3. 调度的基本准则
    4. 7.4. 进程调度
      1. 7.4.1. 功能
      2. 7.4.2. 进程调度的时机
        1. 7.4.2.1. UNIX中
    5. 7.5. 调度算法
      1. 7.5.1. 先来先服务算法FIFS
      2. 7.5.2. 短作业优先调度算法SJF
      3. 7.5.3. 优先级调度算法
      4. 7.5.4. 优先级的设置参照原则
      5. 7.5.5. 高响应比优先调度算法
      6. 7.5.6. 时间片轮转调度算法
      7. 7.5.7. 多级反馈队列调度算法
        1. 7.5.7.1. 优势
    6. 7.6. 实时调度
      1. 7.6.1. 要求:
      2. 7.6.2. 分类:
      3. 7.6.3. 实现调度算法
      4. 7.6.4. 频率单调调度算法
  • 8. 内存管理基本原理
    1. 8.1. 功能
      1. 8.1.1. 1. 虚拟存储器
      2. 8.1.2. 2. 地址变换
      3. 8.1.3. 3. 内外存数据传输的控制
      4. 8.1.4. 4. 内存的分配与回收
        1. 8.1.4.1. 连续分配方式
      5. 8.1.5. 5. 内存信息的共享与保护
        1. 8.1.5.1. 常用的内存信息保护方法:
        2. 8.1.5.2. 程序链接的三种方式:
        3. 8.1.5.3. 装入的的三种方法:
  • 9. 页式管理
    1. 9.1. 名词
    2. 9.2. 地址结构
    3. 9.3. 页表
    4. 9.4. 计算过程
    5. 9.5. 快表
  • 10. 段式管理
    1. 10.1. 分段
    2. 10.2. 段表
    3. 10.3. 地址变换结构
    4. 10.4. 段的共享与保护
  • 11. 段业式管理
  • 12. 虚拟内存管理
    1. 12.1. 需要的支持
    2. 12.2. 请求页表机制
    3. 12.3. 缺页中断机构
  • 13. 页面置换算法
    1. 13.1. 最佳置换算法(OPT)
    2. 13.2. 先进先出页面置换算法(FIFO)
    3. 13.3. 最近最久未使用置换算法
    4. 13.4. 时钟(clock)置换算法
      1. 13.4.1. 改进的clock算法:
  • 14. 页面分配策略
    1. 14.1. 驻留集大小
    2. 14.2. 调入的时机
    3. 14.3. 从何处调页
      1. 14.3.1. 调入时机
  • 15. 抖动
  • 16. 工作集
  • 17. 文件的一些概念
    1. 17.1. 定义
    2. 17.2. 文件的属性
    3. 17.3. 文件的基本操作
    4. 17.4. 文件的分类
      1. 17.4.1. 按性质和用途
      2. 17.4.2. 按组织形式
    5. 17.5. 文件的打开与关闭
  • 18. 文件的逻辑结构
    1. 18.1. 无文件结构(流式文件)
    2. 18.2. 有文件结构(记录式文件)
      1. 18.2.1. 顺序文件
      2. 18.2.2. 索引文件
      3. 18.2.3. 索引顺序文件
      4. 18.2.4. 直接文件或散列文件
  • 19. 目录结构
    1. 19.1. 文件控制块FCB
    2. 19.2. 索引结点
    3. 19.3. 目录结构
      1. 19.3.1. 单级目录结构
      2. 19.3.2. 两级目录结构
        1. 19.3.2.1. 主文件目录MFD
        2. 19.3.2.2. 用户文件目录UFD
      3. 19.3.3. 多级目录结构
      4. 19.3.4. 无环图目录结构
  • Recent Post
    \ No newline at end of file diff --git "a/2021/03/12/\350\256\241\347\256\227\346\234\272\347\273\204\346\210\220\345\216\237\347\220\206/index.html" "b/2021/03/12/\350\256\241\347\256\227\346\234\272\347\273\204\346\210\220\345\216\237\347\220\206/index.html" new file mode 100644 index 0000000..ee36df7 --- /dev/null +++ "b/2021/03/12/\350\256\241\347\256\227\346\234\272\347\273\204\346\210\220\345\216\237\347\220\206/index.html" @@ -0,0 +1,307 @@ +计算机组成原理 | SHYEE-PLASMA + + + + + + + + + + + + + + +

    计算机组成原理

    计算机组成原理

    基本原理

    冯诺依曼机的特点

      +
    • 计算机由运算器、存储器、控制器、输入设备、输出设备组成
    • +
    • 指令和数据以同等的地位存放于存储器内,并可按地址寻访。
    • +
    • 指令和数据均用二进制数表示,形式上无差别
    • +
    • 指令由操作码和地址码组成
    • +
    • 指令在存储器内按顺序存放
    • +
    • 机器以运算算器为中心
    • +
    +
    +

    易混淆

    指令字长:一个指令字中包含的二进制代码的位数

    +

    存储字长:一个存储单元存储的二进制代码的长度

    +

    机器字长:计算机能直接处理的二进制数据的位数

    +

    三者都是字节的整数倍

    +

    if 指令字长+2*存储字长 需要两次访存取一条指令

    +

    此时取值周期 为 机器周期的2倍

    +

    CPU区分指令和地址的依据:指令周期的不同阶段

    +

    MAR用于寻址,位数对应于存储单元的个数,等于地址码长度

    +

    MDR位数和存储字长相等

    +

    IR、MAR、MDR对程序员均不可见

    +

    n位的计算机用m位来表示,机器字长为n位,一次可以处理n位的数据,m为地址码的长度。

    +

    相联存储器既可按地址寻址又可按内容寻址

    +
    +

    计算机的运算过程

      +
    1. 预处理阶段
    2. +
    3. 编译阶段
    4. +
    5. 汇编阶段
    6. +
    7. 链接阶段
    8. +
    +

    指令执行的过程

    取指令过程

      +
    1. 取指令 PC–>MAR–>M–>IR
    2. +
    3. 分析指令 OP(IR)–>CU
    4. +
    5. 执行指令 Ad(IR)–>MAR–>M–>MDR–>ACC
    6. +
    +

    计算机系统的多级层次结构

      +
    1. 微程序机器M0(微指令系统) 微程序机器层
    2. +
    3. 传统机器(用机器语言的机器)M1
    4. +
    5. 虚拟机器(操作系统)M2
    6. +
    7. 虚拟机器M3(汇编语言机器)
    8. +
    9. 虚拟机器M4(高级语言机器)
    10. +
    +

    计算机性能指标

    机器字长

    计算机进行一次整数运算所能处理的二进制数据的位数。

    +

    CPU的寄存器位数、加法器有关

    +

    机器字长=内部寄存器的大小,通常为字节的整数倍

    +

    与机器字长相同的部件

    机器字长=CPU内部用于整数运算的运算器位数和通用寄存器宽度

    +

    ALU、通用寄存器

    +

    数据通路带宽

    数据总线一次所能并行传送信息的位数。

    +

    数据通路宽度=外部总线的宽度

    +

    主存容量

    主存储器所能存储信息的最大容量,单位:B,也可用字数*字长表示

    +

    MAR的位数反应存储单元的个数

    +

    运算速度

    吞吐量

    系统在单位时间内处理请求的数量。取决于主存的存取周期

    +

    响应时间

    用户向计算机发出一个请求到系统对该请求做出响应并获得结果的时间。

    +

    CPU时间(运行一个程序所花费的时间)+等待时间(磁盘访问、存储器访问、IO操作、操作系统开销等)

    +

    CPU时钟周期

    节拍脉冲或T周期,主频的倒数

    +

    CPU中最小的单位

    +

    主频

    1Hz表示每秒一次

    +

    CPI

    执行一条指令所需的时钟周期数。

    +

    CPU执行时间

    CPU执行时间=CPU时钟周期/主频=(指令条数*CPI)/主频

    +

    MIPS

    每秒执行多少万条指令

    +

    MIPS=指令条数/(执行时间* 10^6)=主频/(CPI * 10^6)

    +

    MFLOPS、GFLOPS、PFLOPS、ZFLOPS

    M:百万次

    +

    G:十亿次

    +

    T:万亿次

    +

    基准程序

    专门用来评价性能的一组程序

    +

    专业术语

    系列机

    具有基本相同的体系结构,使用相同基本指令系统的多个不同型号的计算机

    +

    兼容

    软件可移植性

    固件

    固定在ROM中的部件

    +

    校验码

    奇偶校验码

    可检测出一(或奇数)位错误,但不能确定出错的位置,也不能检测出偶数位错误。

    +

    奇校验码:整过校验码中“1”的个数为奇数,偶校验相反。

    +

    海明码

    海明码的位数

    n为有效信息的位数,k为校验位的位数

    +

    n+k<=(2^k)-1

    +

    确定校验位的分布

    规定校验位分布在海明号为2^(i-1)的位置(1、2、4、8….)

    +

    分组形成校验关系

    校验位取值

    海明码的校验原理

    CRC循环冗余码

    定点数

    定点小数的范围:-(1-2^(-n))~1-2^(-n)

    +

    定点整数的范围:-(2^n -1)~2^n -1

    +

    若字长为n+1,

    +

    原码小数的范围:-(1-2^(-n))~1-2^(-n)

    +

    原码整数的范围:-(2^n -1)~2^n -1

    +

    补码小数的范围:-1~1-2^(-n)

    +

    补码整数的范围:-2^n~2^n -1

    +

    反码小数的范围:-(1-2^(-n))~1-2^(-n)

    +

    反码整数的范围:-(2^n -1)~2n -1

    +

    补位规则

    算数移位

    image-20210322203746474

    +

    逻辑移位

    逻辑移位将操作数视为无符号数

    +

    移位规则:逻辑左移时,高位移丢,低位添0;逻辑右移时,低位移丢,高位添0。

    +

    循环移位

    循环移位分为带进位标志位CF的循环移位(大循环)和不带进位标志位的循环移位(小循环)。

    +

    溢出判断

    采用一符号位

    两个相同符号的数运算,结果符号相反,则溢出

    +

    采用双符号位

    模4补码

    +

    运算结果的两个符号位相同:未溢出

    +

    运算结果的两个符号位不同:溢出

    +

    00:结果为正数,未溢出

    +

    01:正溢出

    +

    10:负溢出

    +

    11:结果为负数,未溢出

    +

    采用一位符号位根据数据位的进位情况判断

    符号位与数据位最高位相同:未溢出,否则溢出

    +

    大端存储 和 小端存储

    大端存储

    + + + + + + + + + + + + + + + + + + + +
    0800H0801H0802H0803H
    ……01H23H45H67H……
    +

    小端存储

    + + + + + + + + + + + + + + + + + + + +
    0800H0801H0802H0803H
    ……67H45H23H01H……
    +

    边界对齐

    image-20210322210605115

    +

    浮点数

    N=r^E *M

    +

    r:浮点数阶码的底

    +

    E:阶码

    +

    M:尾数

    +

    规格化

    原码规格化后的范围:1/2~(1-2^(-n))

    +

    原码规格化后的范围:-(1-2^(-n))~-1/2

    +
    Author: SHYEE
    Link: http://example.com/2021/03/12/%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%BB%84%E6%88%90%E5%8E%9F%E7%90%86/
    Copyright Notice: All articles in this blog are licensed under CC BY-NC-SA 4.0 unless stating additionally.
    Announcement
    等离子体实验室
    Recent Post
    \ No newline at end of file diff --git "a/2021/03/12/\351\235\242\345\220\221\345\257\271\350\261\241\346\226\271\346\263\225\345\255\246/index.html" "b/2021/03/12/\351\235\242\345\220\221\345\257\271\350\261\241\346\226\271\346\263\225\345\255\246/index.html" new file mode 100644 index 0000000..8c22817 --- /dev/null +++ "b/2021/03/12/\351\235\242\345\220\221\345\257\271\350\261\241\346\226\271\346\263\225\345\255\246/index.html" @@ -0,0 +1,232 @@ +面向对象方法学 | SHYEE-PLASMA + + + + + + + + + + + + + + + +

    面向对象方法学

    面向对象方法学方程式

    对象 + 类 + 继承 + 消息

    +

    基本概念

    对象:具有相同状态的一组操作的集合。对属性值和操作的封装。

    +

    类:对具有相同数据和相同操作的一组相似对象的定义。

    +

    类是一个支持继承的抽象数据类型,对象是类的实例.

    +

    实例:由某个特定类所描述的具体对象

    +

    消息:要求某对象执行在定义它的类中所定义的某个操作的规格说明。

    +

    三部分:

    +
      +
    • 接收消息的对象
    • +
    • 消息名
    • +
    • 0 或多个变元
    • +
    +

    封装性:数据和操作集中起来放在对象内部。

    +

    继承:子类自动共享基类中定义的数据和方法的机制。

    +
      +
    • 提高程序可复用性(接口设计的复用,不是代码实现复用)
    • +
    • 派生类的功能可被基类指针引用,提高程序可扩充性和可维护性。
    • +
    +

    多态性:在类等级不同层次可共享一个方法名,不同层次每个类按各自

    +

    需要实现这个方法。

    +

    重载:函数重载;运算符重载

    +

    与传统方法比较

    传统方法:系统是过程的集合;

    +

    面向对象方法:系统是交互对象的集合。

    +

    面向对象优点

    (1)与人类习惯思维方法一致

    +

    (2)稳定性好

    +

    (3)可重用性好

    +

    (4)易开发大型软件产品

    +

    (5)可维护性好

    +

    UML

    全称为Unified Modeling Language 目前最流行的面向对象建模语

    +

    必要性

    捕获商业流程

    +

    促进沟通

    +

    管理复杂性

    +

    定义软件构架

    +

    促进软件复用

    +

    面向对象方法的发展

    UML 是通用可视化建模语言,用于对软件进行描述、可视化处理、构造和建立软件系统制品的文档。

    +

    UML 适用于各种软件开发方法、软件生命周期的各个阶段、各种应用领域以及各种开发工具,是总结以往建模技术经验并吸收当今优秀成果的标准建模方法。

    +

    UML 的形成、定义、优势

    1997 年 UML1.1 被对象管理组织 OMG 确定为标准建模语言是软件工程领域最重要的、具有划时代重大意义的事件。 UML 是一种定义良好、易于表达、功能强大且普遍适用的标准的图形化建模语言 , 用它可以简明、准确地为目标系统建立模型 。它融入了软件工程领域的新思想、新方法和新技术。它的作用域不限于支持面向对象的分析与设计,还支持从需求分析开始的软件开发的全过程。

    +

    UML 组成

    由视图、图、模型元素和通用机制几部分组成。

    +

    视图:从不同角度描述系统,建立多个模型。

    +

    图: 一个视图由多张图组成, UML 定义 9 种图。有机结合可形成任何形式视图。

    +

    模型元素:图中使用概念(用例、类、对象),统称模型元素。在图中用视图元素(图形符号)表示。

    +

    通用机制:通过通用机制为图通过附加信息,如注释、标签值等。

    +

    用例视图

    定义了系统的外部行为,是最终用户、分析人员和测试人员所关心.该视图定义了系统的需求,因此约束了描述系统设计和构造的某些方面的所有其他视图。

    +

    主要元素:用例和执行者。

    +

    执行者:描述与系统交互的人或物,代表外部实体(如用户、硬件设备或其它软件系统)

    +

    设计视图

    描述的是支持用例视图中规定的功能需求的逻辑结构。它由程序组件的定义,主要是类、类所包含的数据、类的行为以及类之间交互的说明组成。

    +

    实现视图

    描述构造系统的物理组件,这些组件包括如可执行文件、代码库和数据库等内容.这个视图中包含的信息与配置管理和系统集成这类活动有关.

    +

    如何建立用例模型

    1、发现执行者

    发现执行者的原则、实例

    +

    谁使用该系统;

    +

    谁改变系统的数据;

    +

    谁从系统获取信息;

    +

    谁需要系统的支持以完成日常工作任务

    +

    谁负责维护、管理并保持系统正常运行

    +

    系统需要应付那些硬件设各;

    +

    系统需要和那些外部系统交互;

    +

    谁对系统运行产生的结果感兴趣。

    +

    2、发现用例

    向执行者提出问题获取用例:

    +

    执行者需获取何种功能,需要作什么;

    +

    执行者需读取、产生、删除、修改或存储系统中某种信息

    +

    系统发生事件和执行者间是否需要通信;

    +

    3、确定用例间关系

    关系包括四种:泛化、扩展、包含、使用

    +

    泛化关系:一般与特殊关系。

    +

    扩展关系:允许一个使用案例扩展另一案例提供的功能。

    +

    包含关系:一个基本 UseCase 行为包含另一个 UseCase 行为。

    +

    使用关系:某个用例使用另外一个用例的功能。

    +
    Author: SHYEE
    Link: http://example.com/2021/03/12/%E9%9D%A2%E5%90%91%E5%AF%B9%E8%B1%A1%E6%96%B9%E6%B3%95%E5%AD%A6/
    Copyright Notice: All articles in this blog are licensed under CC BY-NC-SA 4.0 unless stating additionally.
    \ No newline at end of file diff --git "a/2021/03/12/\351\241\271\347\233\256\351\242\204\347\256\227/index.html" "b/2021/03/12/\351\241\271\347\233\256\351\242\204\347\256\227/index.html" new file mode 100644 index 0000000..6357475 --- /dev/null +++ "b/2021/03/12/\351\241\271\347\233\256\351\242\204\347\256\227/index.html" @@ -0,0 +1,279 @@ +项目预算 | SHYEE-PLASMA + + + + + + + + + + + + + +

    项目预算

    项目预算

    编制项目的预算

    项目的预算是用来记录和控制项目的花费情况的。是编制项目可行性的重要组成部分。它包括项目的成本和投资回报率。

    +

    (1)编制预算的基础

    +

    (2)自底向上成本估算法

    +

    (3)项目完成时的预算

    +

    (4)项目的零基预算

    +

    预算编制

    预算对项目的前进方向起到财务向导的作用

    +

    编制预算,首先要把注意力集中在项目的范围上制定预算计划,把项目分解成若千个步骤和阶段( WBS Work Break down Structure )

    +

    预算会得到批准-执行项目

    +

    预算会被削减-缩小项目

    +

    预算会被拒绝-放弃项目

    +

    自底向上的成本估算法

    沿着从项目的底层和根源到项目的交付成果这个方向来制定预算的方法

    把项目分成若千个阶段,计算每个阶段的成本

    +

    注意整合阶段,考虑停工、拖延、和其他工作上的投入

    +

    考虑完成项目每个阶段所需要的满负荷工作量(小时数)

    +

    考虑专业服务的成本(如聘请专家等)

    +

    考虑设备、产品、服务、人员的成本

    +

    考虑生产成本,如打字、复印、用户手册、网页设计及开发费用等

    +

    注意:

    +

    时间是一个变动因素,价格会随时间而变动

    +

    设备、产品、服务、人员的成本会随时间而变动

    +

    预算允许的改变

    把项目分成若千个阶段,计算每个阶段的成本

    +

    把每个阶段最好和最坏的情况分解成各个可能的价格波动情况,从而计算每个阶段的平均预算值

    +

    估算中有些情况根本不会达到最差的情况,甚至不会差到平均水平,有些则会达到最坏情况,甚至还差

    +
      +
    • 可以根据以往的经验
    • +
    • 可以借鉴别人的经验
    • +
    • 供应商的固定报价
    • +
    • 预算部门门的标准成本
    • +
    +

    预算偏差容忍度

    与管理层协商预算偏差容忍度,几个或十几个百分点

    +

    项目完成时的预算

    项目完成时的预算就是项目各个阶段的预算的总和。是整个项目预算的保障。

    +

    项目经理把项目分成不同的阶段,每个阶段都有自己的预算

    +

    优点是:

    +
      +
    • 公司不需要在项目的-开始就把预算的全部资金都分配下去,而是只分配项目启动阶段的资金
    • +
    • 公司可以可以根据需要在不同的项目之间调用资金,加快资金的利用率
    • +
    • 它能够使参与项目的人通过项目各个阶段的成本来把握项目,从而得到整个项目的成本
    • +
    +

    项目的零基预算

    总是从零开始进行的项目预算方法,它不是在其他类似的项,目的基础上把项目一项项加入的方法。如:在去年的成本之上增加20%的预算方法。

    +

    它迫使项目经理计算出项目的每个阶段的实际成本

    +

    好像在做重复的工作,但它迫使你关注实际成本的变化

    +

    使项目经理产生一种责任感

    +

    在去年的成本之上增加百分比的预算方法的缺点:

    +
      +
    • 容易漏项
    • +
    • 容易忽略成本随时间的变化
    • +
    • 项目的预算不够准确
    • +
    +

    项目支出的确认与跟踪

    (1 )确定项目的支出

    +

    (2)跟踪项目的支出

    +

    (3)防止项目失控

    +

    确定项目的支出

    要确定项目预算的支出,必须考虑:

    +

    员工个人、员工的组织形式、硬件花费、项目范围、时间等

    +

    要创建准确的项目预算,周密的计划和丰富的经验

    +

    物品的成本

    +
      +
    • 硬件的使用方式决定物品的成本
    • +
    • 自己购买组装,或由供应商组装
    • +
    • 需要多少时间、有哪些工作、工作质量如何?
    • +
    +

    还有别的选择吗?

    +

    软件许可证-也影响成本

    +
      +
    • 每个站点、每个连接、每个服务器、按使用次数的证书
    • +
    +

    外包方式-影响成本

    +
      +
    • 节约成本吗?增加效率吗?信誉如何?等
    • +
    +

    估算工作时数

    +
      +
    • 项目中最昂贵的就是时间
    • +
    • 按项目任务计算每个人的时间和费用
    • +
    • 统计所有人的时间和费用
    • +
    +

    跟踪项目的支出

    千万不要随便说“好吧”

    +
      +
    • 供应商会给你一些好处,再让你增加一些成本
    • +
    • 每一部分增加一点成本,就会造成阶段成本的增加
    • +
    • 每个阶段成本的增加就会造成项目的大幅度增加
    • +
    • 千万别购买与项目无关的东西
    • +
    • 千万别贪便宜
    • +
    +

    做记录表,记录每次购买的东西

    +

    检查购买是否符合项目计划,项目预算

    +

    可以用MS Excel或MS project来跟踪

    +

    跟踪的内容有:

    +
      +
    • 工作时间:团队成员的工作时间,供应商的工作时间,加班时间
    • +
    • 购买的物品:所有购买的软件、硬件、工具和其他办公用品,包括用现金支付的小东西,如皮萨饼,晚餐等
    • +
    • 软件许可证:各种证件的种类、数量和价格
    • +
    • 工作站和服务器
    • +
    • 各种咨询服务、讲座、培训、书籍等费用
    • +
    +

    防止项目失控

    失控的项目的特点

    +
      +
    • 项目范围增加,功能扩大
    • +
    • 时间失控,预算失控
    • +
    • 信誉或失业严重失控
    • +
    +

    造成项目失控的原因:

    +
      +
    • 缺乏周密的计划:在项目的各个阶段缺乏周密的计划
    • +
    • 缺乏项目视图:没有给项目确定一个清楚明确的视图
    • +
    • 项目范围的扩大:管理层和别的部门不断给项目增加要求
    • +
    • 缺乏领导:项目的发展沿着非正确的方向前进,没有好好地领导项目的发展
    • +
    +

    如何防止项目的失控:

    +
      +
    • 制定周密的计划,并严格按着计划执行
    • +
    • 清楚项目视图,给项目确定一个清楚明确的视图
    • +
    • 限制项目范围的扩大,若非扩大不可,则应改变计划、预算
    • +
    • 加强项目的领导
    • +
    +

    小结

    千万不要轻易说”好吧”

    +
    Author: SHYEE
    Link: http://example.com/2021/03/12/%E9%A1%B9%E7%9B%AE%E9%A2%84%E7%AE%97/
    Copyright Notice: All articles in this blog are licensed under CC BY-NC-SA 4.0 unless stating additionally.
    \ No newline at end of file diff --git "a/2021/03/30/\346\234\272\345\231\250\345\255\246\344\271\240/index.html" "b/2021/03/30/\346\234\272\345\231\250\345\255\246\344\271\240/index.html" new file mode 100644 index 0000000..1e92caa --- /dev/null +++ "b/2021/03/30/\346\234\272\345\231\250\345\255\246\344\271\240/index.html" @@ -0,0 +1,212 @@ +机器学习 | SHYEE-PLASMA + + + + + + + + + + + + + +

    机器学习

    机器学习

    机器学习的分类

    目标值:类型-分类问题

    +

    目标值:连续的数据-回归问题

    +

    目标值:无目标值-无监督学习

    +

    机器学习的流程

    1 获取数据

    +

    2 数据处理

    +

    3 特征工程

    +

    4 机器学习算法训练-模型

    +

    5 模型评估

    +

    6 应用

    +

    数据集

    sklearn

    +

    kaggle

    +

    UCI

    +

    sklearn

    sklearn的安装

    +
    1
    pip install sklearn
    + +

    sklearn.datasets

    +
      +
    • 加载获取数据集

      +

      datasets.load_*() 获取小规模数据集

      +

      datasets.fetch_*()获取大规模数据集

      +
    • +
    +

    数据集的返回值

    +

    datasets.base.Bunch(继承自字典)

    +

    查看iris的数据集

    +
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    #-*- coding: utf-8 -*-
    #@Time : 2022/1/12 18:45
    #@Author: Shyee

    from sklearn.datasets import load_iris
    """
    sklearn的数据集使用
    """
    def datasets_demo():

    iris=load_iris()
    print("鸢尾花数据集:\n",iris)
    print("查看数据集的描述:\n",iris["DESCR"])
    print("查看特征值的名字:\n",iris.feature_names)
    print("查看特征值:\n",iris.data,iris.data.shape)
    return None

    if __name__=="__main__":
    datasets_demo()
    + +

    数据集的划分

    +

    训练数据

    +

    测试数据 20%~30%

    +

    sklearn中的数据集划分

    +
    1
    sklean.model_selection.train_test.split(arrays,*option)
    + +

    训练集的特征值 x_train

    +

    测试集特征值 x_test

    +

    训练集的目标值 y_train

    +

    测试集目标值 y_test

    +
    1
    2
    3
    4
    #数据集划分
    x_train,x_test,y_train,y_test=train_test_split(iris.data,iris.target,test_size=0.2,random_state=22)
    print("训练集的特征值:\n",x_train,"\n测试集的目标值:\n",y_test)
    return None
    + +

    训练集此时的shape为120行,因为取了0.2给测试集

    +

    特征工程

    特征抽取

    将任意数据转换成可以给用于机器学习的数字特征

    +

    sklearn的特征提取

    1
    sklearn.feature_extraction
    + +

    字典的特征提取

    +

    在sklearn中实现特征提取

    +

    特征预处理

    +

    特征降维

    +
    Author: SHYEE
    Link: http://example.com/2021/03/30/%E6%9C%BA%E5%99%A8%E5%AD%A6%E4%B9%A0/
    Copyright Notice: All articles in this blog are licensed under CC BY-NC-SA 4.0 unless stating additionally.
    \ No newline at end of file diff --git "a/2023/05/05/\350\236\272\346\227\213\347\255\211\347\246\273\345\255\220\344\275\223\346\216\250\350\277\233\345\231\250\345\217\212\345\205\266\347\276\275\346\265\201\344\270\255\347\232\204\346\263\242\344\274\240\346\222\255\344\270\216\345\220\270\346\224\266/index.html" "b/2023/05/05/\350\236\272\346\227\213\347\255\211\347\246\273\345\255\220\344\275\223\346\216\250\350\277\233\345\231\250\345\217\212\345\205\266\347\276\275\346\265\201\344\270\255\347\232\204\346\263\242\344\274\240\346\222\255\344\270\216\345\220\270\346\224\266/index.html" new file mode 100644 index 0000000..c312739 --- /dev/null +++ "b/2023/05/05/\350\236\272\346\227\213\347\255\211\347\246\273\345\255\220\344\275\223\346\216\250\350\277\233\345\231\250\345\217\212\345\205\266\347\276\275\346\265\201\344\270\255\347\232\204\346\263\242\344\274\240\346\222\255\344\270\216\345\220\270\346\224\266/index.html" @@ -0,0 +1,203 @@ +螺旋等离子体推进器及其羽流中的波传播与吸收 | SHYEE-PLASMA + + + + + + + + + + + + + +

    螺旋等离子体推进器及其羽流中的波传播与吸收

    螺旋等离子体推进器及其羽流中的波传播与吸收

    摘要

    采用二维全波频域冷等离子体模型研究了螺旋形等离子体推力器中电磁功率的传播和吸收,包括远羽流区和周围空间。结果表明,功率的一小部分在羽流区被吸收,功率在源中的沉积基本不受模拟区域大小、金属障碍物的存在或环境中的等离子体密度的影响。电子回旋共振(ECR)表面始终存在于下游,有效地防止沿羽流向空间以外的辐射。在存在过密的环境等离子体时,就像在真空室中预期的那样,场在这个转变之后完全消失,真空室边界条件对这个表面之前的波场影响很小。在没有环境等离子体的情况下,等离子体与真空界面处存在双波态转变,影响了羽流区数值模拟的准确性。

    +

    介绍

    Helicon等离子体推进器(HPTs)是目前正在研发的电力推进装置[1-9]。它们的工作依赖于通过电感器/天线产生的振荡电磁场对圆柱形容器中的磁约束等离子体进行加热[10,11],并在外部磁喷嘴(MN)中对等离子体进行膨胀和加速,在分离发生之前产生磁推力[12-14]。由于无电极,与传统的电力推进技术(如网格离子推进器或霍尔推进器)相比,HPTs具有一定的优势,例如潜在的寿命延长,整体系统和电气架构的简化。MN拓扑结构易于控制,表明具有较高的节流性。此外,由于缺乏带有敏感材料插入的空心阴极,因此有可能使用替代推进剂。然而,报道的推力效率仍然低于20%[6,16],在理解驱动HPT性能的物理机制方面仍然存在悬而未决的问题,特别是电磁波对等离子体的加热问题。

    +

    电磁场的传播和吸收是该装置运行的核心,也是本工作的研究对象。这些过程取决于天线的几何形状和电流、源的形状、磁拓扑结构和强度、等离子体密度图,以及在较小程度上影响有效碰撞的等离子体温度。反过 来,电磁功率沉积决定了设备中的等离子体特性。当两个方面是紧密耦合、电磁问题的时间表(10−7年代,或数十兆赫)要快得多的等离子体运输问题(离子转运时间的顺序10−5 s)。这使得单独的近似研究这些现象,这种方法已成功用于分析源等离子体动力学缓慢一方面[日],和内部电磁场问题另一方面(21、22)。

    +

    在使用的MHz级频率(通常为13.56 MHz)下,离子对快速场的响应可以忽略不计,电子响应决定了传播和吸收特性。当等离子体密度n已大于1012 ~ 1013 m−3,外加磁场强度Ba大于1 ~ 10 G时,激发频率ω小于电子等离子体频率ωpe和电子回旋频率ωce,即:ω<ωpe,ωce。这意味着左极化(L)波是倏灭的,只有右极化(R)哨声波在HPT等离子体内传播,且只有当其波矢量k落在与磁场矢量Ba[23]半角αc的锥内时才会传播。在这个锥的表面,k→∞,因此它被称为共振锥。传统上,当k基本上与Ba平行时,这种波被称为helicon (H)波[10,24](波长较长),当k基本上与共振锥平行时,这种波被称为trivelake - gould (TG)[25]波(波长较短)(因此有一个重要的k⊥分量)。对于高Ba,有一些k‖的值,其中k有两个解,一个与H波有关,另一个与TG波有关。这被称为双波状态(DWR)[26]。相比之下,在较低的Ba下,每个传播k‖只有一个k⊥的值,这被称为单波态(SWR)。一般来说,H波和TG波都有助于等离子体加热,但更大份额的功率沉积有时归因于TG波,特别是在等离子体表面附近[27]。

    +

    随着等离子体向MN中扩展,磁场强度和等离子体密度逐渐减小。在羽流下游的某些表面,电子回旋共振(ECR)最终发生在ω = ωce。在典型工作频率下,ECR表面外的共振磁场强度为4.84 g,且只要等离子体持续过密(ω<ωpe),磁场就会消失。最终,临界密度转变(ω = ωpe)也会达到,尽管这通常发生在离器件很远的地方。

    +

    此外,部分电磁激励可能泄漏到周围的周边空间。这里的情况取决于环境条件:在完美真空中,L波和R波传播均匀,不受Ba的影响,速度为c,波长为几十米,明显大于器件尺寸。在高密度HPT等离子体与真空的界面处,L波截止和临界密度跃迁迅速连续发生。

    +

    然而,在等离子体稀薄的环境中,传播仍然由n和Ba决定。外围空间也存在ecr跃迁,并可能对波场产生重大影响。特别是,当等离子体密度高于临界密度时,R波的传播性质与器件内部相同——哨声波沿与Ba成一定角度传播,在ECR表面外消失。而且,当密度大约是临界值的两倍时,L波不会传播。这些环境条件与实验室真空室的实验有关,它旨在代表飞行条件,但只能达到非完全真空。

    +

    最简单的一维径向模型已经显示了圆柱形等离子体源内部存在H波和TG波[21,28,29];然而,它们忽略了n和Ba轴向不均匀性的影响。全波二维非对称码过去已被开发来解决这一问题[30,31],但在轴向对准磁场Ba = Baz1z的假设下。最近,Tian等[32]放宽了这一限制,在模型中加入了一小部分发散的MN羽流,从而可以分析磁场拓扑结构对波传播的影响。Melazzi等[21]采用了另一种依赖矩量法求解天线表面电流密度和等离子体内体积极化电流的方法。相关的,Sánchez-Villar等[33]提出了一个全波有限元方法工具,已成功地用于模拟另一种类型的无极推力器,电子回旋共振推力器。

    +

    现有的HPTs电磁场研究仅限于等离子体源和极近羽流。这就忽略了关于传播和吸收问题的几个主要问题,例如这个有限的模拟域是否足以理解等离子体作为一个整体的功率吸收;或者部分射频辐射能否沿着羽流向下游逃逸,并在那里被吸收。据我们所知,在HPTs的操作中,远处ECR表面的作用尚未被考虑。最后,有必要问一下周围环境的影响是什么,即微弱的等离子体或金属障碍物是否会通过打开/关闭传播路径改变吸收性能。

    +

    本工作扩展了[32]的二维有限差分频域(FDFD)模型,改进了数值实现和更大域的插值例程,并用于模拟高频脉冲发生器源、环境和远羽在ECR表面以外的RF场的传播和吸收,将轴对称域的尺寸从轴向15 cm增加到67 cm,径向2 cm增加到20 cm,实现了对ECR跃迁的完整模拟。此外,通过传输编码得到了一个真实的等离子体密度图,一个是内部等离子体动力学[34],另一个是MN[12]的外部扩张,并使用了基于该密度的碰撞图,而不是简单的等离子体密度展开和整个域的恒定碰撞频率。本文通过四个不同的仿真案例来探讨上述问题。最后,我们确定并评论了在求解发生在高密度HPT等离子体和完美真空之间的临界密度转变的波场时发现的建模和数值困难。

    +

    该研究的参考设备是一个中等尺寸的HPT(约350-500 W),类似于SENER航空航天公司和UC3M[35]联合开发的HPT05原型。

    +

    本文的其余部分结构如下:第2节描述了等离子体波模型、数值实现以及模拟的几何和等离子体剖面输入。第3节讨论了在四种不同的模拟情况下获得的电磁场和功率沉积剖面。最后,在第4节中讨论了模拟和模拟临界密度跃迁电磁场的困难,以及数值结果的收敛性。第5节总结了这项工作的结论。

    +

    电磁模型

    二维频域电磁模型考虑图1所示的物理域。HPT源及其近羽流标记为区域1,磁导远羽流标记为区域2,装置外围标记为区域3。已知性质的轴对称等离子体填充区域1和2。区域是根据等离子传输码确定的,该传输码用于获得第2.2节所述波码的输入剖面。此外,在区域3中可能存在环境等离子体,这取决于研究案例。除了对称轴外,该区域在代表真空室的金属壁上终止,这可以被认为是完美的导体。此外,域内的磁线圈和HPT支撑设备箱(电源处理单元,气体供给系统等)被视为完全导体金属箱。

    +

    图1的畴由位于源周围的半螺旋天线中频率ω/(2π) = 13.56 MHz的已知外加电流J a激发。外加磁场Ba也如图所示。Ba拓扑结构在源内部缓慢收敛,在羽流中发散,磁喉大约位于表1。设计和操作参数。参数全仿真域尺寸67 cm × 20 cm室长lc 12.5 cm室半径rc 1.25 cm天线类型半转螺旋线圈电流11 × 103安培转天线频率f = ω/(2π) 13.56 MHz天线功率350w天线环半径ra 1.75 cm天线长度la 7.5 cm天线中心位置za 27.5 cm天线厚度dt 0.5 cm发射药种类Xe发射药质量流量1.0 mg s−1推力管出口。当磁场强度在远离源的地方减小时,出现一个ECR表面,ω = ωce。按照[26]的命名法,等离子体源和部分羽流位于深空区,只有当Ba降低时,等离子体才会进入深空区(靠近ERC表面)。

    +

    HPT的尺寸和特性如表1所示。四个仿真案例定义如下:

    +

    案例R:这是主要的仿真案例,在讨论中作为参考。区域3充满了密度为n = 1014 m−3的稀薄等离子体,这对于典型的实验室真空室操作来说是一个相当低的值。这就导致了推进器周边空间的过密等离子体。内部金属元件(线圈、电子元件……)被视为完美的电导体(PEC)。

    +

    案例T:该案例与案例R相同,除了内部金属盒子从模拟中移除,因此对场是透明的。这种情况与情况R的比较说明了障碍物对电磁场传播的影响。

    +

    情形V:与情形R的区别在于,去除区域3的等离子体密度,n = 0,即区域3为完全真空。这种情况与情况R的比较显示了环境等离子体的影响,以及发生在等离子体真空边缘的临界密度转变的复杂性。

    +

    案例S:这个缩小版的案例R将积分域限制在区域1和区域3的最小部分,使域成为矩形,大小为[20-40]cm × [0-4] cm。

    +

    在下面,我们使用一个圆柱形右手向量基{1z, 1r, 1θ}。平行于或垂直于局部外加磁场的单位向量也可以形成辅助向量基{1‖,1⊥,1θ}。

    +

    模型公式

    采用冷等离子体模型来描述等离子体对电磁场的线性化响应。虽然等离子体本身是轴对称的,但我们允许存在非轴对称场,我们将其分解为方位m模式。任意矢量F (z, r, θ, t)表示为这些模态叠加的实部,

    +

    结果和讨论

    在参考模拟情形R中,等离子体处处都是过密的,即ωpe >ω。此外,如第6节所述,模拟中存在源周围的金属障碍物。图5的第一行显示了E1 θ的幅值和相位,即m = 1模态的方位电场。射频场显然受到ECR表面的限制,因为它必须在ECR表面之外消失。总的来说,在圆柱形源内部(区域1),场最强,表明与致密等离子体耦合良好。当场在羽流(区域2)和外围(区域3)衰减时,很明显,它们不是零:电磁场在这些区域传播,并不局限于源。圆柱形源的后部磁场较小。在等离子体源内部有一个部分驻波结构,这可以从局部的幅度下降和近180度的台阶上得到证明。从区域2的单调相位开始,沿轴向存在向右行波直到ECR表面,其传播方向基本上为轴向。通过在图5的相图中取一个完整的360度相位周期的距离,可以估计其波长约为20厘米。请注意,由于高磁场,波长比源管大。当等离子体密度n≈5 × 1017 m−3,磁场强度Ba≈100 G时(得到ωpe = 4.0 × 1010 rad s−1,ωce = 1.8 × 109 rad s−1),H波的解析波长近似λ≈2πde√ωce/ω,其中= c/ωpe为局部电子表皮深度,这是z≈40 cm处轴附近的特征值。有趣的是,随着密度和磁场沿羽流的减小,分析波长的变化很小。

    +

    在远离轴的地方,随着r的增加,这个轴向波形成了一个不可忽略的k⊥波向量,即它的传播与磁场矢量成一定的角度。羽流中较大的磁场存在于横向区域的磁管中,这表明Ba在一定程度上决定了电磁场的传播路径。传播停止在ECR表面,场的大小迅速下降超过它。

    +

    区域3的电场不可忽略,特别是靠近天线处,其传播也受Ba方向的影响。在磁线圈上方的空间中可以观察到低量级的小波长结构,在那里辐射是弥漫的,并形成驻波模式。这种辐射似乎被限制在区域3的ECR表面和区域1和2的密度更大的等离子体之间。

    +

    功率沉积剖面q1显示在图6的第一个面板中。最大的吸收与最大的场无关,并且发生在圆柱源的致密等离子体内部(约95%)。不可忽略的一部分功率在下游的MN中被吸收,在ECR表面之前,这表明在模型中包括该区域2对理解功率吸收的相关性。

    +

    在ECR表面存在薄的吸收层;然而,这一层在磁场矢量的部分引导下,在区域3的区域顶部偏离ECR。天线发射的能量中只有不到0.6%的能量被ECR表面以外的空间吸收,在那里溶液是消失的。这一结果表明,当在自由空间中工作时,ECR表面可以作为有效的屏蔽来防止辐射损失,即阻止射频功率逃离HPT等离子体及其邻近区域,只要环境密度过大。

    +

    在模拟情况T中,去除域内的金属部分并没有导致波场或功率沉积剖面的任何重大变化,可以从图5和图6的第二行中观察到。唯一明显的区别是向设备后部移动的射频场略高,之前被金属障碍物阻挡,并且在区域3的后部有一些额外的吸收。这些金属盒子的小影响表明,这种类型的障碍基本上不影响解决方案。

    +

    在情形V中,将环境改变为完美真空对射频场(以及数值解的精度)有更显著的影响。这种情况在图5和图6的最后一行中表示。首先,区域3中等离子体的缺失也消除了在该区域的ECR表面发生共振的可能性,现在它对场是透明的。事实上,在没有等离子体密度的情况下,Ba的值和方向对于波的传播问题就变得无关紧要了。这意味着场可以接近代表真空室的金属边界条件。请注意,在自由空间中,任何向外传播的功率都会引起辐射损失;然而,在目前的设置中,代表实验室真空室的操作,这种功率被边界条件反射回区域,直到所有的功率被区域1和2的等离子体吸收。在情形R中,在区域3中存在的微弱等离子体的短波结构在情形V中消失,辐射部分被浸入区域的导电盒所分隔。然而,ECR面在区域2继续活跃。其次,区域1和2的场本质上成为驻波,如图5的幅度图中E1 θ = 0的节点线所示,这表明在这种情况下,壁面反射确实起了作用。传播方向形成了一个主要的垂直分量k⊥到Ba,观测到的波长较短,特别是在MN羽流的外围部分。这表明TG模式的作用更相关,与H模式相比,TG模式对应的波长更短,传播更垂直。与前面的情况一样,等离子体羽流内的传播在ECR处结束。第三,羽流中场的重要性比以前的情况更大,特别是在下游,功率吸收也是如此。

    +

    尽管有这些一般性的观察结果,值得注意的是,模拟情形V在网格细化后的羽流区域没有表现出与其他情形相同的数值收敛特征。这个问题及其假定的原因将在第4节中讨论。

    +

    图7显示了源区域功率沉积剖面的放大视图,并包括情况s的小域模拟。四种解表明,功率吸收剖面基本上独立于模拟情况。这个结论之所以有价值,有两个原因。首先,它支持了建模过程的鲁棒性,因为推力器周围细节的变化对源内能量沉积的计算没有重大影响,而能量沉积占吸收的更大份额。事实上,源内部的功率似乎几乎独立于腔室条件和羽流中的传播。其次,这些结果表明,当只需要计算源吸收的功率时,可以通过只包含该区域的较小仿真域(仿真情形S)可靠地得到。

    +

    与[32]中所示的吸收图相比,图7中的沉积只显示了一个高吸收区域,覆盖了源的大部分区域。这与本工作中使用的等离子体条件(特别是轴为1500 G)是一致的,这与[32](轴为150高斯)的等离子体条件不同,导致Helicon模式波长增加。

    +

    为了结束本节,简要讨论了方位模态m = 1的相关性。以往的研究[10,32]已经确定了m =±1方位模在不同天线类型的螺旋源功率耦合中的主导地位。事实上,这个天线的设计主要是为了激发+1模式。因此,上述结果仅考虑了这种主导模式。为了评估这种方法的有效性,图8比较了m =±1,±3在模拟情况R的整个域内的功率吸收(螺旋天线只激发奇数模式)。可以推断,在模态m =+1之后,下一个重要的模态是m =−1。高m模的功率吸收下降较快。

    +

    结论

    利用有限差分、频域、全波模型研究了电磁场在高功率脉冲发生器(HPT)中的传播和吸收,包括远羽流区域和周围空间,目的是了解羽流中沉积的功率量以及环境对电磁问题的影响。等离子体密度和应用磁场来自于类似HPT05原型推进器的等离子体传输模拟,被用作研究的输入。虽然大部分的能量吸收发生在圆柱形源内部,但等离子体羽流所吸收的能量的一部分是不可忽略的。电场沿MN向上传播到始终存在于下游的ECR表面。波长和传播方向对应于绕着装置轴的螺旋波。在羽流边缘,波具有更短的波长和更重要的垂直波矢量分量,接近TG模式。

    +

    在器件及其羽流附近存在密度为n > 2.3 × 1012 m−3的微弱等离子体,对于通常的激发频率(13.56 MHz),足以使该区域过密(ωpe >ω)。这是实验室真空室实验中常见的情况,抽吸并不完美。即使在太空环境中,微弱的低密度等离子体也可能包裹着推进器,使周围空间的ECR表面保持活跃。在这些条件下,ECR表面已经被证明集中了一些功率吸收,并在限制辐射远离设备方面发挥了基本作用,因为场在它之外变得消失了。特别是,这与有限尺寸真空室实验的“自由空间”代表性有很大关系,这些实验通常由导电金属制成,因此构成了一个封闭的、反射的场腔。如果ECR表面位于腔室内,这些反射壁对场的影响变得可以忽略不计,因为它们只与场消失的空间区域接触。

    +

    在严格的真空条件下,ECR表面在周围空间中没有任何作用,因为在这种情况下,没有电子与场共振,辐射损失的路径在远离推进器的径向上打开(但不是沿着羽流,那里的等离子体继续过密,并且在ECR跃迁之后场继续消失)。实际上,由于在模拟中使用了反射包围盒,传播和吸收图发生了变化,并显示出驻波结构。

    +

    区域内的反射箱(代表推进器的支撑设备)的影响很小。此外,源区域的功率吸收被认为是稳定的,并且在模拟中基本相同,这表明影响羽流和环境区域的所有方面对于源功率吸收都是多余的。这增加了先前工作中进行的小域、纯源模拟的可信度,尽管它们遗漏了羽流中能量吸收的信息。

    +

    最后,数值收敛研究表明,除真空环境外,所有情况都具有良好的收敛特性,在真空环境中,等离子体羽流与真空界面处的强病态临界密度过渡面,加上那里的数值阶梯网格条件,被认为是小尺度数值噪声的来源。在这项工作中使用的实现是基于一种新的插值方案,它在一定程度上缓解了这个问题,并将噪声限制在一个小区域,而不影响其他地方的结果。尽管如此,未来的工作必须解决这些转变的理论建模和数值处理。在第4节中提出了一些额外的研究途径,即在该区域使用增强阻尼,并将网格几何形状与过渡对齐,也许可以切换到其他方案,如有限元,以简化非结构化网格的实现。

    +

    验证现有波模型的实验数据需要直接测量电磁场及其相位,特别是在等离子体源内部,而不干扰推进器的工作。目前,作者不知道存在这样的数据。然而,耦合等离子体输运和波动模拟(使用与本工作相同的FDTD求解器)在间接测量(如推力和几个效率)方面与类似HTP设置的实验研究比较得相当好。特别是对于HPT05原型,数值[20]和实验[6]的结果显示,在类似的工作状态下,在推力效率等关键性能数据上约有30%的相对差异(尽管比较并不完美,因为[6]的配置具有略高的天线功率)。在这个方向上的进一步工作和新的、更精确的实验测量仍然需要缩小验证差距。

    +
    Author: SHYEE
    Link: http://example.com/2023/05/05/%E8%9E%BA%E6%97%8B%E7%AD%89%E7%A6%BB%E5%AD%90%E4%BD%93%E6%8E%A8%E8%BF%9B%E5%99%A8%E5%8F%8A%E5%85%B6%E7%BE%BD%E6%B5%81%E4%B8%AD%E7%9A%84%E6%B3%A2%E4%BC%A0%E6%92%AD%E4%B8%8E%E5%90%B8%E6%94%B6/
    Copyright Notice: All articles in this blog are licensed under CC BY-NC-SA 4.0 unless stating additionally.
    \ No newline at end of file diff --git a/2023/05/09/pic/index/index.html b/2023/05/09/pic/index/index.html new file mode 100644 index 0000000..9a0e3af --- /dev/null +++ b/2023/05/09/pic/index/index.html @@ -0,0 +1,161 @@ +pic | SHYEE-PLASMA + + + + + + + + + +

    pic

    Author: SHYEE
    Link: http://example.com/2023/05/09/pic/index/
    Copyright Notice: All articles in this blog are licensed under CC BY-NC-SA 4.0 unless stating additionally.
    \ No newline at end of file diff --git "a/2023/05/09/\344\275\277\347\224\250comsol\344\273\277\347\234\237ICP/image-1.png" "b/2023/05/09/\344\275\277\347\224\250comsol\344\273\277\347\234\237ICP/image-1.png" new file mode 100644 index 0000000..c71f499 Binary files /dev/null and "b/2023/05/09/\344\275\277\347\224\250comsol\344\273\277\347\234\237ICP/image-1.png" differ diff --git "a/2023/05/09/\344\275\277\347\224\250comsol\344\273\277\347\234\237ICP/image-2.png" "b/2023/05/09/\344\275\277\347\224\250comsol\344\273\277\347\234\237ICP/image-2.png" new file mode 100644 index 0000000..197354e Binary files /dev/null and "b/2023/05/09/\344\275\277\347\224\250comsol\344\273\277\347\234\237ICP/image-2.png" differ diff --git "a/2023/05/09/\344\275\277\347\224\250comsol\344\273\277\347\234\237ICP/image-3.png" "b/2023/05/09/\344\275\277\347\224\250comsol\344\273\277\347\234\237ICP/image-3.png" new file mode 100644 index 0000000..34129ff Binary files /dev/null and "b/2023/05/09/\344\275\277\347\224\250comsol\344\273\277\347\234\237ICP/image-3.png" differ diff --git "a/2023/05/09/\344\275\277\347\224\250comsol\344\273\277\347\234\237ICP/image.png" "b/2023/05/09/\344\275\277\347\224\250comsol\344\273\277\347\234\237ICP/image.png" new file mode 100644 index 0000000..b8d74c4 Binary files /dev/null and "b/2023/05/09/\344\275\277\347\224\250comsol\344\273\277\347\234\237ICP/image.png" differ diff --git "a/2023/05/09/\344\275\277\347\224\250comsol\344\273\277\347\234\237ICP/image1.png" "b/2023/05/09/\344\275\277\347\224\250comsol\344\273\277\347\234\237ICP/image1.png" new file mode 100644 index 0000000..fe5ad98 Binary files /dev/null and "b/2023/05/09/\344\275\277\347\224\250comsol\344\273\277\347\234\237ICP/image1.png" differ diff --git "a/2023/05/09/\344\275\277\347\224\250comsol\344\273\277\347\234\237ICP/image2.png" "b/2023/05/09/\344\275\277\347\224\250comsol\344\273\277\347\234\237ICP/image2.png" new file mode 100644 index 0000000..ca9754a Binary files /dev/null and "b/2023/05/09/\344\275\277\347\224\250comsol\344\273\277\347\234\237ICP/image2.png" differ diff --git "a/2023/05/09/\344\275\277\347\224\250comsol\344\273\277\347\234\237ICP/image3.png" "b/2023/05/09/\344\275\277\347\224\250comsol\344\273\277\347\234\237ICP/image3.png" new file mode 100644 index 0000000..e19d956 Binary files /dev/null and "b/2023/05/09/\344\275\277\347\224\250comsol\344\273\277\347\234\237ICP/image3.png" differ diff --git "a/2023/05/09/\344\275\277\347\224\250comsol\344\273\277\347\234\237ICP/image4.png" "b/2023/05/09/\344\275\277\347\224\250comsol\344\273\277\347\234\237ICP/image4.png" new file mode 100644 index 0000000..7b3f16c Binary files /dev/null and "b/2023/05/09/\344\275\277\347\224\250comsol\344\273\277\347\234\237ICP/image4.png" differ diff --git "a/2023/05/09/\344\275\277\347\224\250comsol\344\273\277\347\234\237ICP/index.html" "b/2023/05/09/\344\275\277\347\224\250comsol\344\273\277\347\234\237ICP/index.html" new file mode 100644 index 0000000..dbc7027 --- /dev/null +++ "b/2023/05/09/\344\275\277\347\224\250comsol\344\273\277\347\234\237ICP/index.html" @@ -0,0 +1,411 @@ +使用comsol仿真ICP | SHYEE-PLASMA + + + + + + + + + + + + + +

    使用comsol仿真ICP

    直接版

      +
    1. 打开comsol
    2. +
    3. 点击打开案例库
    4. +
    5. 选择ICP,打开
    6. +
    7. 计算,导出结果
    8. +
    +

    手动版

    感应耦合等离子体

    对于感应放电,求解频域中的磁失势
    Alt text

    +

    感应耦合等离子体相当于等离子体和磁场的耦合建模

    +

    磁场和等离子体耦合

    等离子体计算得到的电导率耦合到磁场,用于计算电磁场分布

    +

    磁场计算得到的热源耦合到等离子体接口中

    +

    等离子体电导耦合

    +

    查找资料(文献)

    从COMSOL官网查找ICP

    +

    选择ICP_torch

    +

    可以看到官网给定的参数,将这段参数保存为xxx.txt

    +
    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
    T0 300[K] "环境温度"
    Pext 11[kW] "线圈激励功率"
    f0 3[MHz] "线圈激励频率"
    r_3 125[mm] "轴向长度:计算域"
    L_3 200[mm] "高度:计算域和鞘管"
    d_1 2[mm] "厚度:载流子管"
    L_0 50[mm] "高度:载流子管和中心管"
    r_1 3.7[mm] "内半径:载流子管"
    d_2 2.2[mm] "厚度:中心管"
    r_2 18.8[mm] "内半径:中心管"
    d_3 3.5[mm] "厚度:鞘管"
    r_0 25[mm] "内半径:鞘管"
    d_c 6[mm] "直径:线圈"
    r_c 33[mm] "轴向长度:线圈中心"
    L_1 63[mm] "高度:下线圈的中心"
    L_2 121[mm] "高度:上线圈的中心"
    Q_1 1[l/min] "气流:载流子管"
    Q_2 3[l/min] "气流:中心管"
    Q_3 31[l/min] "气流:鞘管"
    M 0.04[kg/mole] "摩尔质量:氩"
    mv_stp 22.4[l/mole] "stp 下的摩尔体积"
    mdot1 M*Q_1/mv_stp "质量流率:载流子管"
    mdot2 M*Q_2/mv_stp "质量流率:中心管"
    mdot3 M*Q_3/mv_stp "质量流率:鞘管"
    rho_stp 1.91[kg/m^3] "stp 下的氩密度"
    A1 pi*(r_1)^2 "横截面积:载气流"
    A2 pi*(r_2^2-(r_1+d_1)^2) "横截面积:中心气流"
    A3 pi*(r_0^2-(r_2+d_2)^2) "横截面积:鞘管气流"
    v1 mdot1/rho_stp/A1 "速度:载气流"
    v2 mdot2/rho_stp/A2 "速度:中心气流"
    v3 mdot3/rho_stp/A3 "速度:鞘管气流"
    + +

    理论

    假定热等离子体处于部分至完全的局部热力学平衡 (LTE) 条件下,因此这类等离子体可以被视为导电流体混合物,可以使用磁流体动力学 (MHD) 方程来建模。本模型介绍如何使用 “平衡放电,面外电流”接口(可用于二维和二维轴对称)来模拟电感耦合等离子体炬中产生的等离子体。

    +

    需要建模的ICP等离子体的几何结构

    +

    Alt text

    +

    电感耦合等离子体炬的几何结构,炬由三个同心石英管组成,气体从底部注入,从顶部喷出。在此模型中,通过在 3MHz 下运行的三匝线圈将 11 kW 的固定功率传递到等离子体。

    +

    模型定义

      +
    • 等离子体炬通过完全轴对称的构型进行建模。
    • +
    • 等离子体内部的电流由面外 (即方位角方向)的感应电流控制。
    • +
    • 线圈由横截面为圆形、直径为6mm的平行载流环组成。这意味着忽略了线圈电流的轴向分量。
    • +
    • 大气压下的纯氩等离子体稳态层流。
    • +
    • 局部热力学平衡 (LTE) 条件下的光学薄等离子体。
    • +
    +

    Alt text

    +/pic/image4.png + +

    ICP炬示意图。气体从底部(v1、v2和v3)进入,从顶部流出。

    +

    在本模型中,以3MHz的频率向三匝线圈提供激励。然后,通过焦耳热使在鞘管(等离子体约束管)中流动的气体电离。

    +

    本模型通过使用频域-稳态研究结合单匝线圈特征来求解,其中为系统设置了固定功率(11kW)。通过固定功率,线圈中的电流和电势会随着等离子体电导率的增加发生变化。

    +

    本模型中包含三种不同气流速度(载流子管的速度 v1、中心管的速度 v2、鞘管的速度v3)的纯氩气。在“平衡放电”条件下从材料库中加载与温度相关的氩的物理属性。请注意,物理属性的温度范围从500K到25,000K。另请注意,由于数值稳定性的原因,我们使用最小电导率1S/m。

    +

    如果初始温度过低,得到的解很可能对应于最小电导率的平坦分布(默认为1S/m)。这显然是一个没有意义的解,事实上这是最容易获得的解。为了避免这种情况,从更接近实验值的较高温度开始。务必绘制电导率图,以查看是否设置为最小电导率。

    +

    新建

    打开COMSOL,新建-模型向导

    +

    选择二维轴对称

    +

    物理场选择 等离子体-电感耦合等离子体-添加

    +

    选择研究-频域-瞬态

    +

    这个求解器是一个双向耦合求解器

    +

    根节点

    选择单位mm

    +

    几何 1

    模型开发器窗口的组件1(comp1)节点下,单击几何1

    +

    几何设置窗口中,定位到单位

    +

    长度单位列表中选择mm

    +

    全局定义

    参数1

    模型开发器窗口的全局定义节点下,单击参数1

    +

    参数设置窗口中,定位到参数栏。

    +

    单击从文件加载

    +

    选择之前的xxx.txt,定义计算域

    +

    几何1

    矩形1(r1)

    几何工具栏中点击矩形

    +

    矩形设置窗口中,定位到大小和形状栏。

    +

    宽度文本框中键入 “r_3”。

    +

    高度文本框中键入 “L_3”。

    +

    定义载流子管

    +

    矩形2(r2)

    几何工具栏中单击矩形

    +

    矩形设置窗口中,定位到大小和形状栏。

    +

    宽度文本框中键入 “d_1”。

    +

    高度文本框中键入 “L_0”。

    +

    定位到位置栏。在r文本框中键入 “r_1”。

    +

    定义中心管。

    +

    矩形3(r3)

    几何工具栏中单击矩形

    +

    矩形设置窗口中,定位到大小和形状栏。

    +

    宽度文本框中键入 “d_2”。

    +

    高度文本框中键入 “L_0”。

    +

    定位到位置栏。在r文本框中键入 “r_2”。

    +

    定义管

    +

    矩形4(r4)

    几何工具栏中单击矩形

    +

    矩形设置窗口中,定位到大小和形状栏。

    +

    宽度文本框中键入 “d_3”。

    +

    高度文本框中键入 “L_3”。

    +

    定位到位置栏。在r文本框中键入 “r_0”。

    +

    定义线圈。

    +

    圆1(c1)

    几何工具栏中单击

    +

    设置窗口中,定位到大小和形状栏。

    +

    半径文本框中键入“d_c/2”。

    +

    定位到位置栏。在r文本框中键入“r_c”。

    +

    z文本框中键入“L_1”。

    +

    圆2(c2)

    几何工具栏中单击

    +

    设置窗口中,定位到大小和形状栏。

    +

    半径文本框中键入“d_c/2”。

    +

    定位到位置栏。在r文本框中键入 “r_c”。

    +

    z文本框中键入“(L_1+L_2)/2”。

    +

    圆3(c3)

    几何工具栏中单击

    +

    设置窗口中,定位到大小和形状栏。

    +

    半径文本框中键入 “d_c/2”。

    +

    定位到位置栏。在r文本框中键入 “r_c”。

    +

    z文本框中键入 “L_2”。

    +

    单击构建所有对象

    +

    定义其他域类型以便于选择。

    +

    定义

    空气

    在定义工具栏中单击 显式。

    +

    在显式的设置窗口中,在标签文本框中键入 “空气”。

    +

    选择 “域” 5。

    +

    等离子体

    在定义工具栏中单击 显式。

    +

    在显式的设置窗口中,在标签文本框中键入 “等离子体”。

    +

    选择 “域” 1。

    +

    石英

    在定义工具栏中单击 显式。

    +

    在显式的设置窗口中,在标签文本框中键入 “石英”。

    +

    选择 “域” 2–4。

    +

    线圈

    在定义工具栏中单击 显式。

    +

    在显式的设置窗口中,在标签文本框中键入 “线圈”。

    +

    选择 “域” 6–8。

    +

    使用材料库添加模型中使用的不同材料。

    +

    添加材料

    在主屏幕工具栏中,单击 添加材料以打开添加材料窗口。

    +

    转到添加材料窗口。

    +

    在模型树中选择内置材料 >Air。

    +

    单击窗口工具栏中的添加到组件。

    +

    在模型树中选择 AC/DC>Copper。

    +

    单击窗口工具栏中的添加到组件。

    +

    在模型树中选择 AC/DC>Quartz。

    +

    单击窗口工具栏中的添加到组件。

    +

    在模型树中选择材料 >Argon。

    +

    单击窗口工具栏中的添加到组件。

    +

    在主屏幕工具栏中,单击 添加材料以关闭添加材料窗口。

    +

    材料

    Air (mat1)

    在模型开发器窗口的组件 1 (comp1)> 材料节点下,单击 Air (mat1)。

    +

    在材料的设置窗口中,定位到几何实体选择栏。

    +

    从选择列表中选择空气。

    +

    Copper (mat2)

    在模型开发器窗口中,单击 Copper (mat2)。

    +

    在材料的设置窗口中,定位到几何实体选择栏。

    +

    从选择列表中选择线圈。

    +

    Quartz (mat3)

    在模型开发器窗口中,单击 Quartz (mat3)。

    +

    在材料的设置窗口中,定位到几何实体选择栏。

    +

    从选择列表中选择石英。

    +

    Argon (mat4)

    在模型开发器窗口中,单击 Argon (mat4)。

    +

    在材料的设置窗口中,定位到几何实体选择栏。

    +

    从选择列表中选择等离子体。

    +

    调整组成模型的每个物理场的选择和特征。

    +

    磁场接口用于整个计算域,本例使用 “单导体线圈”特征将激励功率传递到等离子体。

    +

    磁场 (MF)

    在模型开发器窗口的组件 1 (comp1) 节点下,单击磁场 (mf)。

    +

    在磁场的设置窗口中,单击以展开离散化栏。

    +

    从磁矢势列表中选择线性单元。

    +

    线圈 1

    在物理场工具栏中单击 域,然后选择线圈。

    +

    在线圈的设置窗口中,定位到域选择栏。

    +

    从选择列表中选择线圈。

    +

    定位到线圈栏。选中线圈组复选框。

    +

    从线圈激励列表中选择功率。

    +

    在 Pcoil 文本框中键入 “Pext”。

    +

    模型中忽略了空气中的传热。

    +

    流体传热 (HT)

    在模型开发器窗口的组件 1 (comp1) 节点下,单击流体传热 (ht)。

    +

    选择 “域” 1 和 4。

    +

    固体 1

    在物理场工具栏中单击 域,然后选择固体。

    +

    选择 “域” 4。

    +

    初始值 1

    务必从高温开始。

    +

    在模型开发器窗口中,单击初始值 1。

    +

    在初始值的设置窗口中,定位到初始值栏。

    +

    在 T 文本框中键入 “6000”。

    +

    为传热模型的实体部分 (管和线圈)添加 “固体传热”特征。

    +

    温度 1

    在物理场工具栏中单击 边界,然后选择温度。

    +

    选择 “边界” 2、 8、 13、 15 和 17。

    +

    在温度的设置窗口中,定位到温度栏。

    +

    在 T0 文本框中键入 “T0”。

    +

    流出 1

    在物理场工具栏中单击 边界,然后选择流出。

    +

    在图形工具栏中单击 缩放到窗口大小按钮。

    +

    选择 “边界” 3。

    +

    单相流仅应用于等离子体区域。

    +

    层 流 (SPF)

    由于密度变化并不小,我们不能将流动视为不可压缩流动。因此,将流动设置为弱可压缩流动。

    +

    在模型开发器窗口的组件 1 (comp1) 节点下,单击层流 (spf)。

    +

    在层流的设置窗口中,定位到物理模型栏。

    +

    从可压缩性列表中选择弱可压缩流动。

    +

    定位到域选择栏。从选择列表中选择等离子体。

    +

    单击以展开方程栏。从方程形式列表中选择稳态。

    +

    入口 1

    在物理场工具栏中单击 边界,然后选择入口。

    +

    添加具有合适速度的入口。

    +

    选择 “边界” 2。

    +

    在入口的设置窗口中,定位到速度栏。

    +

    在 U0 文本框中键入 “v1”。

    +

    入口 2

    在物理场工具栏中单击 边界,然后选择入口。

    +

    选择 “边界” 8。

    +

    在入口的设置窗口中,定位到速度栏。

    +

    在 U0 文本框中键入 “v2”。

    +

    入口 3

    在物理场工具栏中单击 边界,然后选择入口。

    +

    选择 “边界” 13。

    +

    在入口的设置窗口中,定位到速度栏。

    +

    在 U0 文本框中键入 “v3”。

    +

    出口 1

    在物理场工具栏中单击 边界,然后选择出口。

    +

    选择 “边界” 3。

    +

    在出口的设置窗口中,定位到压力条件栏。

    +

    清除抑制回流复选框。

    +

    网格 1

    大小

    在模型开发器窗口的组件 1 (comp1) 节点下,右键单击网格 1 并选择编辑物理场引导的序列。

    +

    大小 1

    在大小的设置窗口中,定位到单元大小栏。

    +

    从预定义列表中选择超细化。

    +

    边 1

    在网格工具栏中单击三角边。

    +

    拖放到大小节点下方。

    +

    选择 “边界” 2、 8 和 13。

    +

    大小 1

    右键单击边 1 并选择大小。

    +

    在大小的设置窗口中,定位到单元大小栏。

    +

    单击定制按钮。

    +

    单击以折叠单元大小参数栏。单击以展开单元大小参数栏。

    +

    选中最大单元大小复选框。在关联文本框中键入 “0.5”。

    +

    大小 2

    在模型开发器窗口的组件 1 (comp1)> 网格 1 节点下,单击大小 2。

    +

    在大小的设置窗口中,定位到单元大小栏。

    +

    从预定义列表中选择超细化。

    +

    边界层 2

    在网格工具栏中单击 边界层。

    +

    右键单击边界层 2 并选择上移。

    +

    在边界层的设置窗口中,定位到域选择栏。

    +

    从几何实体层列表中选择域。

    +

    选择 “域” 6–8。

    +

    边界层属性

    在模型开发器窗口中,单击边界层属性。

    +

    选择 “边界” 21–32。

    +

    在边界层属性的设置窗口中,定位到层栏。

    +

    在层数文本框中键入 “4”。

    +

    从厚度明细列表中选择第一层。

    +

    在厚度文本框中键入 “8[um]”。

    +

    单击 全部构建。

    +

    对于这种情况,最好是全耦合求解方程,需要更改求解器中的一些设置以提高稳定性。

    +

    研究 1

    步骤 1:频域 - 稳态

    在模型开发器窗口的研究 1 节点下,单击步骤 1: 频域 - 稳态。

    +

    在频域 - 稳态的设置窗口中,定位到研究设置栏。

    +

    在频率文本框中键入 “f0”。

    +

    解 1 (sol1)

    在研究工具栏中单击 显示默认求解器。

    +

    在模型开发器窗口中展开解 1 (sol1) 节点。

    +

    在模型开发器窗口中展开研究 1> 求解器配置 > 解 1 (sol1)> 稳态求解器 1 节点。

    +

    右键单击研究 1> 求解器配置 > 解 1 (sol1)> 稳态求解器 1 并选择全耦合。

    +

    在全耦合的设置窗口中,单击以展开方法和终止栏。

    +

    在初始阻尼系数文本框中键入 “1e-4”。

    +

    在最小阻尼系数文本框中键入 “1.0E-6”。

    +

    在更新步长的限制文本框中键入 “1.2”。

    +

    在恢复阻尼系数文本框中键入 “0.1”。

    +

    在最大迭代次数文本框中键入 “200”。

    +

    在研究工具栏中单击 计算。

    +

    结果

    二维温度

    在主屏幕工具栏中单击 添加绘图组,然后选择二维绘图组。

    +

    在二维绘图组的设置窗口中,在标签文本框中键入 “二维温度”。

    +

    表面 1

    右键单击二维温度并选择表面。

    +

    在表面的设置窗口中,定位到表达式栏。

    +

    在表达式文本框中键入 “T”。

    +

    在二维温度工具栏中单击 绘制。

    +

    二维温度

    在模型开发器窗口中,右键单击二维温度并选择上移。

    +

    电导率

    在主屏幕工具栏中单击 添加绘图组,然后选择二维绘图组。

    +

    在二维绘图组的设置窗口中,在标签文本框中键入 “电导率”。

    +

    表面 1

    右键单击电导率并选择表面。

    +

    在表面的设置窗口中,定位到表达式栏。

    +

    在表达式文本框中键入 “mf.sigmarr”。

    +

    选择 1

    右键单击表面 1 并选择选择。

    +

    选择 “域” 1。

    +

    在电导率工具栏中单击 绘制。

    +

    电导率

    在模型开发器窗口的结果节点下,右键单击电导率并选择上移

    +

    结果

    氩等离子体的等离子体温度分布

    +

    Alt text

    +

    氩等离子体的等离子体速度大小

    +

    Alt text

    +

    线圈附近的温度峰值达到10,000K。等离子体电导率随着温度的升高而增加,在最高温度区域具有最大值,

    +

    下图绘制了等离子体的电导率。

    +

    Alt text

    +

    下图显示磁通量模。

    +

    Alt text

    +

    请注意,由于集肤效应,等离子体的电导率屏蔽了磁通量。

    +

    参考文献

      +
    1. S. Xue, P. Proulx, and M.I. Boulos, “Extended-field electromagnetic model for inductively
      coupled plasma,” J. Phys. D. 34, 1897, 2001.
    2. +
    +
    Author: SHYEE
    Link: http://example.com/2023/05/09/%E4%BD%BF%E7%94%A8comsol%E4%BB%BF%E7%9C%9FICP/
    Copyright Notice: All articles in this blog are licensed under CC BY-NC-SA 4.0 unless stating additionally.
    Announcement
    等离子体实验室
    Recent Post
    \ No newline at end of file diff --git "a/2023/05/12/\345\246\202\344\275\225\345\205\263306\347\232\204\346\260\264\346\260\224/index.html" "b/2023/05/12/\345\246\202\344\275\225\345\205\263306\347\232\204\346\260\264\346\260\224/index.html" new file mode 100644 index 0000000..8c8f271 --- /dev/null +++ "b/2023/05/12/\345\246\202\344\275\225\345\205\263306\347\232\204\346\260\264\346\260\224/index.html" @@ -0,0 +1,181 @@ +如何关306的水气 | SHYEE-PLASMA + + + + + + + + + + + + + + +

    如何关306的水气

      +
    1. 进入306的阳台
    2. +
    3. 向左手边看去可以看到一个水箱
      水箱
    4. +
    5. 注意水箱上的几个按键
      按键
    6. +
    7. 按下红色按键,液晶屏熄灭,代表OFF
    8. +
    9. 注意左边墙上的闸箱
      闸箱
    10. +
    11. 拉下黑闸
    12. +
    +

    主要关闭氩气和氧气的气瓶

    +
      +
    1. 进入306的阳台
    2. +
    3. 右转走到头
    4. +
    5. 右手边有三个气瓶,最里面的两个是氩气和氧气的气瓶
    6. +
    7. 顺时针旋转阀,直到拧不动为完全关闭(逆时针是开启,也会拧到头,此时为完全打开)
      气瓶
    8. +
    +
    Author: SHYEE
    Link: http://example.com/2023/05/12/%E5%A6%82%E4%BD%95%E5%85%B3306%E7%9A%84%E6%B0%B4%E6%B0%94/
    Copyright Notice: All articles in this blog are licensed under CC BY-NC-SA 4.0 unless stating additionally.
    \ No newline at end of file diff --git "a/2023/05/14/20230514\345\221\250\346\200\273\347\273\223/index.html" "b/2023/05/14/20230514\345\221\250\346\200\273\347\273\223/index.html" new file mode 100644 index 0000000..9e852d7 --- /dev/null +++ "b/2023/05/14/20230514\345\221\250\346\200\273\347\273\223/index.html" @@ -0,0 +1,165 @@ +20230514周总结 | SHYEE-PLASMA + + + + + + + + + + + + +

    20230514周总结

    🈚

    +
    Author: SHYEE
    Link: http://example.com/2023/05/14/20230514%E5%91%A8%E6%80%BB%E7%BB%93/
    Copyright Notice: All articles in this blog are licensed under CC BY-NC-SA 4.0 unless stating additionally.
    \ No newline at end of file diff --git a/2023/05/17/An-evaluation-of-different-antenna-designs-for-helicon-wave-excitation-in-a-cylindrical-plasma-source/index.html b/2023/05/17/An-evaluation-of-different-antenna-designs-for-helicon-wave-excitation-in-a-cylindrical-plasma-source/index.html new file mode 100644 index 0000000..4388a9e --- /dev/null +++ b/2023/05/17/An-evaluation-of-different-antenna-designs-for-helicon-wave-excitation-in-a-cylindrical-plasma-source/index.html @@ -0,0 +1,161 @@ +An evaluation of different antenna designs for helicon wave excitation in a cylindrical plasma source | SHYEE-PLASMA + + + + + + + + + +

    An evaluation of different antenna designs for helicon wave excitation in a cylindrical plasma source

    Author: SHYEE
    Link: http://example.com/2023/05/17/An-evaluation-of-different-antenna-designs-for-helicon-wave-excitation-in-a-cylindrical-plasma-source/
    Copyright Notice: All articles in this blog are licensed under CC BY-NC-SA 4.0 unless stating additionally.
    \ No newline at end of file diff --git "a/2023/05/23/\344\273\216\351\233\266\345\274\200\345\247\213\345\255\246\344\271\240\350\236\272\346\227\213\346\263\242\347\255\211\347\246\273\345\255\220\344\275\223/index.html" "b/2023/05/23/\344\273\216\351\233\266\345\274\200\345\247\213\345\255\246\344\271\240\350\236\272\346\227\213\346\263\242\347\255\211\347\246\273\345\255\220\344\275\223/index.html" new file mode 100644 index 0000000..ec4baab --- /dev/null +++ "b/2023/05/23/\344\273\216\351\233\266\345\274\200\345\247\213\345\255\246\344\271\240\350\236\272\346\227\213\346\263\242\347\255\211\347\246\273\345\255\220\344\275\223/index.html" @@ -0,0 +1,171 @@ +从零开始学习螺旋波等离子体 | SHYEE-PLASMA + + + + + + + + + + + + + +

    从零开始学习螺旋波等离子体

    维基百科的定义如下

    在电磁学中,螺旋波是一种低频电磁波,在磁场存在的约束等离子体中可以存在。最初被观察到的螺旋波是大气哨声波,但它们也存在于固体导体或任何其他电磁等离子体中。波中的电场被霍尔效应所主导,几乎垂直于电流(而不是平行的,如果没有磁场),因此波的传播分量是螺旋形的,因此称为“螺旋波”。这个术语是由Aigrain创造的。

    +

    螺旋波有一种特殊的能力,可以在低温和高磁场条件下穿过纯金属。在普通导体中,大多数电磁波都不能做到这一点,因为由于自由电子的存在,金属的高导电性会起到屏蔽电磁场的作用。实际上,通常情况下电磁波会在金属上经历非常薄的皮深度:当试图进入金属时,电场或磁场会很快反射。 (因此是金属的光泽。)然而,皮深度取决于角频率的平方根的倒数。因此,低频电磁波可能能够克服皮深度问题,并遍布整个材料。

    +

    螺旋波的一个特性(仅使用霍尔效应项和电阻率项进行简单计算即可证明)是,在样品表面与磁场平行的位置,一个模式中包含的电流在完美导电的极限下“趋向于无穷大”;因此在这种表面区域的焦耳热损失趋向于一个非零极限。表面模式在与磁场平行的圆柱形样品中特别普遍,对于这种配置,方程的确切解法已经找到,并在随后的实验中发挥重要作用。

    +

    光滑模式和其超高电流密度的实用意义最初并未被认识到,但在几年之后,Boswell发现了螺旋波的优越等离子体产生能力,实现的电荷密度比以前的方法高出10倍,而不需要磁场。

    +

    从那时起,螺旋波在许多科学和工业应用中得到使用,无论何时需要高效的等离子体生成,例如在核聚变反应器和空间推进中(螺旋双层推进器和可变比冲磁约束等离子体火箭在其等离子体加热阶段中都利用了螺旋波)。螺旋波也用于等离子体刻蚀的程序中,用于制造计算机微电路。

    +

    螺旋放电是通过无线电频率加热诱导的螺旋波来激发等离子体。螺旋等离子源和感应耦合等离子体(ICP)之间的区别在于天线轴向存在一个磁场。这个磁场的存在创建了一个具有更高电离效率和更大电子密度的螺旋工作模式,而不是典型的ICP。目前,澳大利亚国立大学正在研究这项技术的应用。由商业开发的磁等离子发动机VASIMR也利用螺旋放电来产生其发动机中的等离子体。潜在地,基于螺旋双层推进器等离子体的火箭非常适合星际旅行。

    +
    Author: SHYEE
    Link: http://example.com/2023/05/23/%E4%BB%8E%E9%9B%B6%E5%BC%80%E5%A7%8B%E5%AD%A6%E4%B9%A0%E8%9E%BA%E6%97%8B%E6%B3%A2%E7%AD%89%E7%A6%BB%E5%AD%90%E4%BD%93/
    Copyright Notice: All articles in this blog are licensed under CC BY-NC-SA 4.0 unless stating additionally.
    \ No newline at end of file diff --git "a/2023/05/24/\346\231\256\346\236\227\346\226\257\351\241\277\347\255\211\347\246\273\345\255\220\344\275\223\350\257\276/image-17.png" "b/2023/05/24/\346\231\256\346\236\227\346\226\257\351\241\277\347\255\211\347\246\273\345\255\220\344\275\223\350\257\276/image-17.png" new file mode 100644 index 0000000..dd7b1bf Binary files /dev/null and "b/2023/05/24/\346\231\256\346\236\227\346\226\257\351\241\277\347\255\211\347\246\273\345\255\220\344\275\223\350\257\276/image-17.png" differ diff --git "a/2023/05/24/\346\231\256\346\236\227\346\226\257\351\241\277\347\255\211\347\246\273\345\255\220\344\275\223\350\257\276/image-18.png" "b/2023/05/24/\346\231\256\346\236\227\346\226\257\351\241\277\347\255\211\347\246\273\345\255\220\344\275\223\350\257\276/image-18.png" new file mode 100644 index 0000000..261598d Binary files /dev/null and "b/2023/05/24/\346\231\256\346\236\227\346\226\257\351\241\277\347\255\211\347\246\273\345\255\220\344\275\223\350\257\276/image-18.png" differ diff --git "a/2023/05/24/\346\231\256\346\236\227\346\226\257\351\241\277\347\255\211\347\246\273\345\255\220\344\275\223\350\257\276/image-19.png" "b/2023/05/24/\346\231\256\346\236\227\346\226\257\351\241\277\347\255\211\347\246\273\345\255\220\344\275\223\350\257\276/image-19.png" new file mode 100644 index 0000000..d663d48 Binary files /dev/null and "b/2023/05/24/\346\231\256\346\236\227\346\226\257\351\241\277\347\255\211\347\246\273\345\255\220\344\275\223\350\257\276/image-19.png" differ diff --git "a/2023/05/24/\346\231\256\346\236\227\346\226\257\351\241\277\347\255\211\347\246\273\345\255\220\344\275\223\350\257\276/image-20.png" "b/2023/05/24/\346\231\256\346\236\227\346\226\257\351\241\277\347\255\211\347\246\273\345\255\220\344\275\223\350\257\276/image-20.png" new file mode 100644 index 0000000..58d10df Binary files /dev/null and "b/2023/05/24/\346\231\256\346\236\227\346\226\257\351\241\277\347\255\211\347\246\273\345\255\220\344\275\223\350\257\276/image-20.png" differ diff --git "a/2023/05/24/\346\231\256\346\236\227\346\226\257\351\241\277\347\255\211\347\246\273\345\255\220\344\275\223\350\257\276/image-21.png" "b/2023/05/24/\346\231\256\346\236\227\346\226\257\351\241\277\347\255\211\347\246\273\345\255\220\344\275\223\350\257\276/image-21.png" new file mode 100644 index 0000000..1cd7702 Binary files /dev/null and "b/2023/05/24/\346\231\256\346\236\227\346\226\257\351\241\277\347\255\211\347\246\273\345\255\220\344\275\223\350\257\276/image-21.png" differ diff --git "a/2023/05/24/\346\231\256\346\236\227\346\226\257\351\241\277\347\255\211\347\246\273\345\255\220\344\275\223\350\257\276/image-22.png" "b/2023/05/24/\346\231\256\346\236\227\346\226\257\351\241\277\347\255\211\347\246\273\345\255\220\344\275\223\350\257\276/image-22.png" new file mode 100644 index 0000000..a4a819c Binary files /dev/null and "b/2023/05/24/\346\231\256\346\236\227\346\226\257\351\241\277\347\255\211\347\246\273\345\255\220\344\275\223\350\257\276/image-22.png" differ diff --git "a/2023/05/24/\346\231\256\346\236\227\346\226\257\351\241\277\347\255\211\347\246\273\345\255\220\344\275\223\350\257\276/image-23.png" "b/2023/05/24/\346\231\256\346\236\227\346\226\257\351\241\277\347\255\211\347\246\273\345\255\220\344\275\223\350\257\276/image-23.png" new file mode 100644 index 0000000..6b8d78d Binary files /dev/null and "b/2023/05/24/\346\231\256\346\236\227\346\226\257\351\241\277\347\255\211\347\246\273\345\255\220\344\275\223\350\257\276/image-23.png" differ diff --git "a/2023/05/24/\346\231\256\346\236\227\346\226\257\351\241\277\347\255\211\347\246\273\345\255\220\344\275\223\350\257\276/image-24.png" "b/2023/05/24/\346\231\256\346\236\227\346\226\257\351\241\277\347\255\211\347\246\273\345\255\220\344\275\223\350\257\276/image-24.png" new file mode 100644 index 0000000..46a8bee Binary files /dev/null and "b/2023/05/24/\346\231\256\346\236\227\346\226\257\351\241\277\347\255\211\347\246\273\345\255\220\344\275\223\350\257\276/image-24.png" differ diff --git "a/2023/05/24/\346\231\256\346\236\227\346\226\257\351\241\277\347\255\211\347\246\273\345\255\220\344\275\223\350\257\276/image-25.png" "b/2023/05/24/\346\231\256\346\236\227\346\226\257\351\241\277\347\255\211\347\246\273\345\255\220\344\275\223\350\257\276/image-25.png" new file mode 100644 index 0000000..a5ffc59 Binary files /dev/null and "b/2023/05/24/\346\231\256\346\236\227\346\226\257\351\241\277\347\255\211\347\246\273\345\255\220\344\275\223\350\257\276/image-25.png" differ diff --git "a/2023/05/24/\346\231\256\346\236\227\346\226\257\351\241\277\347\255\211\347\246\273\345\255\220\344\275\223\350\257\276/image-26.png" "b/2023/05/24/\346\231\256\346\236\227\346\226\257\351\241\277\347\255\211\347\246\273\345\255\220\344\275\223\350\257\276/image-26.png" new file mode 100644 index 0000000..aa53041 Binary files /dev/null and "b/2023/05/24/\346\231\256\346\236\227\346\226\257\351\241\277\347\255\211\347\246\273\345\255\220\344\275\223\350\257\276/image-26.png" differ diff --git "a/2023/05/24/\346\231\256\346\236\227\346\226\257\351\241\277\347\255\211\347\246\273\345\255\220\344\275\223\350\257\276/image-27.png" "b/2023/05/24/\346\231\256\346\236\227\346\226\257\351\241\277\347\255\211\347\246\273\345\255\220\344\275\223\350\257\276/image-27.png" new file mode 100644 index 0000000..d7f1cde Binary files /dev/null and "b/2023/05/24/\346\231\256\346\236\227\346\226\257\351\241\277\347\255\211\347\246\273\345\255\220\344\275\223\350\257\276/image-27.png" differ diff --git "a/2023/05/24/\346\231\256\346\236\227\346\226\257\351\241\277\347\255\211\347\246\273\345\255\220\344\275\223\350\257\276/image-28.png" "b/2023/05/24/\346\231\256\346\236\227\346\226\257\351\241\277\347\255\211\347\246\273\345\255\220\344\275\223\350\257\276/image-28.png" new file mode 100644 index 0000000..55c74cf Binary files /dev/null and "b/2023/05/24/\346\231\256\346\236\227\346\226\257\351\241\277\347\255\211\347\246\273\345\255\220\344\275\223\350\257\276/image-28.png" differ diff --git "a/2023/05/24/\346\231\256\346\236\227\346\226\257\351\241\277\347\255\211\347\246\273\345\255\220\344\275\223\350\257\276/index.html" "b/2023/05/24/\346\231\256\346\236\227\346\226\257\351\241\277\347\255\211\347\246\273\345\255\220\344\275\223\350\257\276/index.html" new file mode 100644 index 0000000..10c3ce0 --- /dev/null +++ "b/2023/05/24/\346\231\256\346\236\227\346\226\257\351\241\277\347\255\211\347\246\273\345\255\220\344\275\223\350\257\276/index.html" @@ -0,0 +1,204 @@ +普林斯顿等离子体课 | SHYEE-PLASMA + + + + + + + + + + + + +

    普林斯顿等离子体课

    Kinetic Plasma Simulation

    intro

    characteristic time and length scales

    +

    如果我们要绘制这些参数,我们有特征等离子体时间和长度的列表。

    +

    Time scales & Length scales

    +

    绿色的部分是Fluid models,在这个范畴内考虑的是流体参数,前面的使用全动力学模型,中间部分使用混合模型

    +

    time

    +

    When are collisions important?

    我们会去关系在一个德拜Cube中粒子的数量

    +

    德拜屏蔽

    +

    以上情况下等离子体会很少碰撞

    +

    一些等离子体的德拜屏蔽

    +

    可以用Vlasov—Maxwell等式来描述低碰撞等离子体的分布函数f(x,v,t)

    +

    +
      +
    • 直接解这些公式涉及六个维度
    • +
    • 可以通过特征来求解(粒子)
    • +
    • Delta函数导致碰撞
    • +
    +

    所以我们真正要解决的是一下几个公式

    +

    +

    第一个式子是带有洛伦兹力的动量方程

    +

    第三个式子法拉第方程

    +

    下面是安培定律的source

    +

    最后一个式子是将上述几个等式进行总计和整合,如果我们计算的是单个粒子的电流,则其图像将会非常尖锐

    +

    PIC方式来求解Vlasov等式(VE)

    我们可以减少计算的开销通过使用gird

    +
      +
    • 6D-VE不在网格上
    • +
    • 重新引入Np计算离散的f(r,p,t)
    • +
    • 宏观力再次变成颗粒状(随机噪声)
    • +
    +

    +
      +
    • 粒子动量等式(EQM)
    • +
    +

    +

    VE 特征:f = const

    +

    粒子长度 也是const

    +
      +
    • 洛伦兹力:洛伦兹力
    • +
    +

    这里主要讲了一下算法的原理,大概就是在网格中将电场和磁场用力向外推,将他们内插到粒子内

    +

    +
    Author: SHYEE
    Link: http://example.com/2023/05/24/%E6%99%AE%E6%9E%97%E6%96%AF%E9%A1%BF%E7%AD%89%E7%A6%BB%E5%AD%90%E4%BD%93%E8%AF%BE/
    Copyright Notice: All articles in this blog are licensed under CC BY-NC-SA 4.0 unless stating additionally.
    \ No newline at end of file diff --git "a/2023/05/24/\347\255\211\347\246\273\345\255\220\344\275\223\345\211\215\347\275\256\347\237\245\350\257\206/image-1.png" "b/2023/05/24/\347\255\211\347\246\273\345\255\220\344\275\223\345\211\215\347\275\256\347\237\245\350\257\206/image-1.png" new file mode 100644 index 0000000..0233afc Binary files /dev/null and "b/2023/05/24/\347\255\211\347\246\273\345\255\220\344\275\223\345\211\215\347\275\256\347\237\245\350\257\206/image-1.png" differ diff --git "a/2023/05/24/\347\255\211\347\246\273\345\255\220\344\275\223\345\211\215\347\275\256\347\237\245\350\257\206/image-10.png" "b/2023/05/24/\347\255\211\347\246\273\345\255\220\344\275\223\345\211\215\347\275\256\347\237\245\350\257\206/image-10.png" new file mode 100644 index 0000000..0459d86 Binary files /dev/null and "b/2023/05/24/\347\255\211\347\246\273\345\255\220\344\275\223\345\211\215\347\275\256\347\237\245\350\257\206/image-10.png" differ diff --git "a/2023/05/24/\347\255\211\347\246\273\345\255\220\344\275\223\345\211\215\347\275\256\347\237\245\350\257\206/image-11.png" "b/2023/05/24/\347\255\211\347\246\273\345\255\220\344\275\223\345\211\215\347\275\256\347\237\245\350\257\206/image-11.png" new file mode 100644 index 0000000..4ffbef4 Binary files /dev/null and "b/2023/05/24/\347\255\211\347\246\273\345\255\220\344\275\223\345\211\215\347\275\256\347\237\245\350\257\206/image-11.png" differ diff --git "a/2023/05/24/\347\255\211\347\246\273\345\255\220\344\275\223\345\211\215\347\275\256\347\237\245\350\257\206/image-12.png" "b/2023/05/24/\347\255\211\347\246\273\345\255\220\344\275\223\345\211\215\347\275\256\347\237\245\350\257\206/image-12.png" new file mode 100644 index 0000000..eab2d0e Binary files /dev/null and "b/2023/05/24/\347\255\211\347\246\273\345\255\220\344\275\223\345\211\215\347\275\256\347\237\245\350\257\206/image-12.png" differ diff --git "a/2023/05/24/\347\255\211\347\246\273\345\255\220\344\275\223\345\211\215\347\275\256\347\237\245\350\257\206/image-13.png" "b/2023/05/24/\347\255\211\347\246\273\345\255\220\344\275\223\345\211\215\347\275\256\347\237\245\350\257\206/image-13.png" new file mode 100644 index 0000000..d73a3bb Binary files /dev/null and "b/2023/05/24/\347\255\211\347\246\273\345\255\220\344\275\223\345\211\215\347\275\256\347\237\245\350\257\206/image-13.png" differ diff --git "a/2023/05/24/\347\255\211\347\246\273\345\255\220\344\275\223\345\211\215\347\275\256\347\237\245\350\257\206/image-14.png" "b/2023/05/24/\347\255\211\347\246\273\345\255\220\344\275\223\345\211\215\347\275\256\347\237\245\350\257\206/image-14.png" new file mode 100644 index 0000000..773dfec Binary files /dev/null and "b/2023/05/24/\347\255\211\347\246\273\345\255\220\344\275\223\345\211\215\347\275\256\347\237\245\350\257\206/image-14.png" differ diff --git "a/2023/05/24/\347\255\211\347\246\273\345\255\220\344\275\223\345\211\215\347\275\256\347\237\245\350\257\206/image-15.png" "b/2023/05/24/\347\255\211\347\246\273\345\255\220\344\275\223\345\211\215\347\275\256\347\237\245\350\257\206/image-15.png" new file mode 100644 index 0000000..2630563 Binary files /dev/null and "b/2023/05/24/\347\255\211\347\246\273\345\255\220\344\275\223\345\211\215\347\275\256\347\237\245\350\257\206/image-15.png" differ diff --git "a/2023/05/24/\347\255\211\347\246\273\345\255\220\344\275\223\345\211\215\347\275\256\347\237\245\350\257\206/image-16.png" "b/2023/05/24/\347\255\211\347\246\273\345\255\220\344\275\223\345\211\215\347\275\256\347\237\245\350\257\206/image-16.png" new file mode 100644 index 0000000..07d9279 Binary files /dev/null and "b/2023/05/24/\347\255\211\347\246\273\345\255\220\344\275\223\345\211\215\347\275\256\347\237\245\350\257\206/image-16.png" differ diff --git "a/2023/05/24/\347\255\211\347\246\273\345\255\220\344\275\223\345\211\215\347\275\256\347\237\245\350\257\206/image-2.png" "b/2023/05/24/\347\255\211\347\246\273\345\255\220\344\275\223\345\211\215\347\275\256\347\237\245\350\257\206/image-2.png" new file mode 100644 index 0000000..c503103 Binary files /dev/null and "b/2023/05/24/\347\255\211\347\246\273\345\255\220\344\275\223\345\211\215\347\275\256\347\237\245\350\257\206/image-2.png" differ diff --git "a/2023/05/24/\347\255\211\347\246\273\345\255\220\344\275\223\345\211\215\347\275\256\347\237\245\350\257\206/image-3.png" "b/2023/05/24/\347\255\211\347\246\273\345\255\220\344\275\223\345\211\215\347\275\256\347\237\245\350\257\206/image-3.png" new file mode 100644 index 0000000..b4e907f Binary files /dev/null and "b/2023/05/24/\347\255\211\347\246\273\345\255\220\344\275\223\345\211\215\347\275\256\347\237\245\350\257\206/image-3.png" differ diff --git "a/2023/05/24/\347\255\211\347\246\273\345\255\220\344\275\223\345\211\215\347\275\256\347\237\245\350\257\206/image-4.png" "b/2023/05/24/\347\255\211\347\246\273\345\255\220\344\275\223\345\211\215\347\275\256\347\237\245\350\257\206/image-4.png" new file mode 100644 index 0000000..ed7ac8a Binary files /dev/null and "b/2023/05/24/\347\255\211\347\246\273\345\255\220\344\275\223\345\211\215\347\275\256\347\237\245\350\257\206/image-4.png" differ diff --git "a/2023/05/24/\347\255\211\347\246\273\345\255\220\344\275\223\345\211\215\347\275\256\347\237\245\350\257\206/image-5.png" "b/2023/05/24/\347\255\211\347\246\273\345\255\220\344\275\223\345\211\215\347\275\256\347\237\245\350\257\206/image-5.png" new file mode 100644 index 0000000..ae3b6e8 Binary files /dev/null and "b/2023/05/24/\347\255\211\347\246\273\345\255\220\344\275\223\345\211\215\347\275\256\347\237\245\350\257\206/image-5.png" differ diff --git "a/2023/05/24/\347\255\211\347\246\273\345\255\220\344\275\223\345\211\215\347\275\256\347\237\245\350\257\206/image-6.png" "b/2023/05/24/\347\255\211\347\246\273\345\255\220\344\275\223\345\211\215\347\275\256\347\237\245\350\257\206/image-6.png" new file mode 100644 index 0000000..bcc2712 Binary files /dev/null and "b/2023/05/24/\347\255\211\347\246\273\345\255\220\344\275\223\345\211\215\347\275\256\347\237\245\350\257\206/image-6.png" differ diff --git "a/2023/05/24/\347\255\211\347\246\273\345\255\220\344\275\223\345\211\215\347\275\256\347\237\245\350\257\206/image-7.png" "b/2023/05/24/\347\255\211\347\246\273\345\255\220\344\275\223\345\211\215\347\275\256\347\237\245\350\257\206/image-7.png" new file mode 100644 index 0000000..684e135 Binary files /dev/null and "b/2023/05/24/\347\255\211\347\246\273\345\255\220\344\275\223\345\211\215\347\275\256\347\237\245\350\257\206/image-7.png" differ diff --git "a/2023/05/24/\347\255\211\347\246\273\345\255\220\344\275\223\345\211\215\347\275\256\347\237\245\350\257\206/image-8.png" "b/2023/05/24/\347\255\211\347\246\273\345\255\220\344\275\223\345\211\215\347\275\256\347\237\245\350\257\206/image-8.png" new file mode 100644 index 0000000..da00bc0 Binary files /dev/null and "b/2023/05/24/\347\255\211\347\246\273\345\255\220\344\275\223\345\211\215\347\275\256\347\237\245\350\257\206/image-8.png" differ diff --git "a/2023/05/24/\347\255\211\347\246\273\345\255\220\344\275\223\345\211\215\347\275\256\347\237\245\350\257\206/image-9.png" "b/2023/05/24/\347\255\211\347\246\273\345\255\220\344\275\223\345\211\215\347\275\256\347\237\245\350\257\206/image-9.png" new file mode 100644 index 0000000..a1f559c Binary files /dev/null and "b/2023/05/24/\347\255\211\347\246\273\345\255\220\344\275\223\345\211\215\347\275\256\347\237\245\350\257\206/image-9.png" differ diff --git "a/2023/05/24/\347\255\211\347\246\273\345\255\220\344\275\223\345\211\215\347\275\256\347\237\245\350\257\206/image.png" "b/2023/05/24/\347\255\211\347\246\273\345\255\220\344\275\223\345\211\215\347\275\256\347\237\245\350\257\206/image.png" new file mode 100644 index 0000000..46de44a Binary files /dev/null and "b/2023/05/24/\347\255\211\347\246\273\345\255\220\344\275\223\345\211\215\347\275\256\347\237\245\350\257\206/image.png" differ diff --git "a/2023/05/24/\347\255\211\347\246\273\345\255\220\344\275\223\345\211\215\347\275\256\347\237\245\350\257\206/index.html" "b/2023/05/24/\347\255\211\347\246\273\345\255\220\344\275\223\345\211\215\347\275\256\347\237\245\350\257\206/index.html" new file mode 100644 index 0000000..48203b5 --- /dev/null +++ "b/2023/05/24/\347\255\211\347\246\273\345\255\220\344\275\223\345\211\215\347\275\256\347\237\245\350\257\206/index.html" @@ -0,0 +1,200 @@ +等离子体前置知识 | SHYEE-PLASMA + + + + + + + + + + + + + +

    等离子体前置知识

    色散关系

    在物理科学和电气工程学中,色散关系描述波在介质中传播的色散现象的性质。色散关系将波的波长或波数与其频率建立了联系。由这组关系,波的相速度和群速度有了方便的确定介质中折射率的表达式。克拉莫-克若尼关系式可以描述波的传播、衰减的频率依赖性,这关系比与几何相关和与材料相关的色散关系更具一般性。

    +

    色散

    当不同波长的平面波表现出不同的传播速度时,色散会发生,如此造成混合各种波长的波包渐渐地在空间中扩展开来。平面波的速率v为波长λ的函数:

    +

    +

    波速、波长、频率f之间具有恒等式:

    +

    +

    函数f(λ)指出了该介质中的色散关系。色散关系更常用角频率 与波数 来表示。上述式子可改写为

    +

    +

    在此ω成为k的函数。使用ω(k)来描述色散关系已经成为一种标准写法,因为相速度 ω/k 与群速度 ∂ω/∂k 可以轻松地从这样写法的色散关系中求得。

    +

    因此所关注的平面波可写为如下数学式:

    +

    +

    其中

    +

    A是波的振幅,

    +

    A0 = A(0,0),

    +

    x是波传递方向上的任一特定位置,

    +

    t是描述波的任一特定时间。

    +

    真空中的平面波

    电磁波

    对真空中的电磁波而言,角频率与波数呈正比:

    +

    +

    这是“线性”的色散关系。在此情形下,相速度与群速度乃是相同的:

    +

    +

    两者皆为c,真空中的光速,为与频率无关的常数。

    +

    德布罗意色散关系

    粒子的总能量、动量与质量透过如下相对论关系连结:

    +

    +

    其中m是静质量。

    +

    当静质量m为零时,比如光子的例子:

    +

    +

    又静质量不为零的粒子,当其接近光速时,pc项远大于mc^2项,因此关系式可趋近于E = pc。其在非相对论极限,也就是速度远小于光速c的情形,可趋近于如下关系式:

    +

    +

    此情形下, 是常数,而 是常见的动能,可以动量 来写出关系式。

    +

    从近光速的例子过渡到低速度极限,可看到E与p的关系是从p转成p^2,在垂直轴跟水平轴皆取对数log的色散关系图中可看出斜率的改变。

    +

    基本粒子、原子核、原子,甚至是分子,皆有物质波的波动表现。根据描述物质波的“德布罗意关系”,能量E与角频率ω之间以及动量p与波数k之间皆为正比关系,比值为约化普朗克常数ħ:

    +

    +

    相应地,角频率与波数之间也可透过色散关系连结。在非相对论极限(低速度极限的牛顿力学)条件下,利用能量(动能)与动量的关系式:

    +

    +

    此处省去常数mc^2的效应。等式左右分别代入德布罗意关系,可得色散关系:

    +

    +
    Author: SHYEE
    Link: http://example.com/2023/05/24/%E7%AD%89%E7%A6%BB%E5%AD%90%E4%BD%93%E5%89%8D%E7%BD%AE%E7%9F%A5%E8%AF%86/
    Copyright Notice: All articles in this blog are licensed under CC BY-NC-SA 4.0 unless stating additionally.
    \ No newline at end of file diff --git "a/2023/05/24/\347\255\211\347\246\273\345\255\220\344\275\223\347\211\251\347\220\206-pyk/0960A420F60DE4125AA02629259C81BE.jpg" "b/2023/05/24/\347\255\211\347\246\273\345\255\220\344\275\223\347\211\251\347\220\206-pyk/0960A420F60DE4125AA02629259C81BE.jpg" new file mode 100644 index 0000000..cbba77d Binary files /dev/null and "b/2023/05/24/\347\255\211\347\246\273\345\255\220\344\275\223\347\211\251\347\220\206-pyk/0960A420F60DE4125AA02629259C81BE.jpg" differ diff --git "a/2023/05/24/\347\255\211\347\246\273\345\255\220\344\275\223\347\211\251\347\220\206-pyk/1D6A5C77DD8DAFC4A5964A8CE8C8C498.jpg" "b/2023/05/24/\347\255\211\347\246\273\345\255\220\344\275\223\347\211\251\347\220\206-pyk/1D6A5C77DD8DAFC4A5964A8CE8C8C498.jpg" new file mode 100644 index 0000000..b2d879e Binary files /dev/null and "b/2023/05/24/\347\255\211\347\246\273\345\255\220\344\275\223\347\211\251\347\220\206-pyk/1D6A5C77DD8DAFC4A5964A8CE8C8C498.jpg" differ diff --git "a/2023/05/24/\347\255\211\347\246\273\345\255\220\344\275\223\347\211\251\347\220\206-pyk/C63440A1FCE157A0572C6B274E057392.jpg" "b/2023/05/24/\347\255\211\347\246\273\345\255\220\344\275\223\347\211\251\347\220\206-pyk/C63440A1FCE157A0572C6B274E057392.jpg" new file mode 100644 index 0000000..7f59281 Binary files /dev/null and "b/2023/05/24/\347\255\211\347\246\273\345\255\220\344\275\223\347\211\251\347\220\206-pyk/C63440A1FCE157A0572C6B274E057392.jpg" differ diff --git "a/2023/05/24/\347\255\211\347\246\273\345\255\220\344\275\223\347\211\251\347\220\206-pyk/image-29.png" "b/2023/05/24/\347\255\211\347\246\273\345\255\220\344\275\223\347\211\251\347\220\206-pyk/image-29.png" new file mode 100644 index 0000000..3c3351e Binary files /dev/null and "b/2023/05/24/\347\255\211\347\246\273\345\255\220\344\275\223\347\211\251\347\220\206-pyk/image-29.png" differ diff --git "a/2023/05/24/\347\255\211\347\246\273\345\255\220\344\275\223\347\211\251\347\220\206-pyk/image-30.png" "b/2023/05/24/\347\255\211\347\246\273\345\255\220\344\275\223\347\211\251\347\220\206-pyk/image-30.png" new file mode 100644 index 0000000..de03876 Binary files /dev/null and "b/2023/05/24/\347\255\211\347\246\273\345\255\220\344\275\223\347\211\251\347\220\206-pyk/image-30.png" differ diff --git "a/2023/05/24/\347\255\211\347\246\273\345\255\220\344\275\223\347\211\251\347\220\206-pyk/image-31.png" "b/2023/05/24/\347\255\211\347\246\273\345\255\220\344\275\223\347\211\251\347\220\206-pyk/image-31.png" new file mode 100644 index 0000000..2a6c6a1 Binary files /dev/null and "b/2023/05/24/\347\255\211\347\246\273\345\255\220\344\275\223\347\211\251\347\220\206-pyk/image-31.png" differ diff --git "a/2023/05/24/\347\255\211\347\246\273\345\255\220\344\275\223\347\211\251\347\220\206-pyk/image-32.png" "b/2023/05/24/\347\255\211\347\246\273\345\255\220\344\275\223\347\211\251\347\220\206-pyk/image-32.png" new file mode 100644 index 0000000..30f0c4b Binary files /dev/null and "b/2023/05/24/\347\255\211\347\246\273\345\255\220\344\275\223\347\211\251\347\220\206-pyk/image-32.png" differ diff --git "a/2023/05/24/\347\255\211\347\246\273\345\255\220\344\275\223\347\211\251\347\220\206-pyk/image-33.png" "b/2023/05/24/\347\255\211\347\246\273\345\255\220\344\275\223\347\211\251\347\220\206-pyk/image-33.png" new file mode 100644 index 0000000..c304ca5 Binary files /dev/null and "b/2023/05/24/\347\255\211\347\246\273\345\255\220\344\275\223\347\211\251\347\220\206-pyk/image-33.png" differ diff --git "a/2023/05/24/\347\255\211\347\246\273\345\255\220\344\275\223\347\211\251\347\220\206-pyk/image-34.png" "b/2023/05/24/\347\255\211\347\246\273\345\255\220\344\275\223\347\211\251\347\220\206-pyk/image-34.png" new file mode 100644 index 0000000..6bb6ffe Binary files /dev/null and "b/2023/05/24/\347\255\211\347\246\273\345\255\220\344\275\223\347\211\251\347\220\206-pyk/image-34.png" differ diff --git "a/2023/05/24/\347\255\211\347\246\273\345\255\220\344\275\223\347\211\251\347\220\206-pyk/image-35.png" "b/2023/05/24/\347\255\211\347\246\273\345\255\220\344\275\223\347\211\251\347\220\206-pyk/image-35.png" new file mode 100644 index 0000000..13b76ad Binary files /dev/null and "b/2023/05/24/\347\255\211\347\246\273\345\255\220\344\275\223\347\211\251\347\220\206-pyk/image-35.png" differ diff --git "a/2023/05/24/\347\255\211\347\246\273\345\255\220\344\275\223\347\211\251\347\220\206-pyk/image-36.png" "b/2023/05/24/\347\255\211\347\246\273\345\255\220\344\275\223\347\211\251\347\220\206-pyk/image-36.png" new file mode 100644 index 0000000..05ef3dc Binary files /dev/null and "b/2023/05/24/\347\255\211\347\246\273\345\255\220\344\275\223\347\211\251\347\220\206-pyk/image-36.png" differ diff --git "a/2023/05/24/\347\255\211\347\246\273\345\255\220\344\275\223\347\211\251\347\220\206-pyk/image-37.png" "b/2023/05/24/\347\255\211\347\246\273\345\255\220\344\275\223\347\211\251\347\220\206-pyk/image-37.png" new file mode 100644 index 0000000..a62324a Binary files /dev/null and "b/2023/05/24/\347\255\211\347\246\273\345\255\220\344\275\223\347\211\251\347\220\206-pyk/image-37.png" differ diff --git "a/2023/05/24/\347\255\211\347\246\273\345\255\220\344\275\223\347\211\251\347\220\206-pyk/image-38.png" "b/2023/05/24/\347\255\211\347\246\273\345\255\220\344\275\223\347\211\251\347\220\206-pyk/image-38.png" new file mode 100644 index 0000000..fbf88de Binary files /dev/null and "b/2023/05/24/\347\255\211\347\246\273\345\255\220\344\275\223\347\211\251\347\220\206-pyk/image-38.png" differ diff --git "a/2023/05/24/\347\255\211\347\246\273\345\255\220\344\275\223\347\211\251\347\220\206-pyk/image-39.png" "b/2023/05/24/\347\255\211\347\246\273\345\255\220\344\275\223\347\211\251\347\220\206-pyk/image-39.png" new file mode 100644 index 0000000..10d9f1c Binary files /dev/null and "b/2023/05/24/\347\255\211\347\246\273\345\255\220\344\275\223\347\211\251\347\220\206-pyk/image-39.png" differ diff --git "a/2023/05/24/\347\255\211\347\246\273\345\255\220\344\275\223\347\211\251\347\220\206-pyk/image-40.png" "b/2023/05/24/\347\255\211\347\246\273\345\255\220\344\275\223\347\211\251\347\220\206-pyk/image-40.png" new file mode 100644 index 0000000..d42c425 Binary files /dev/null and "b/2023/05/24/\347\255\211\347\246\273\345\255\220\344\275\223\347\211\251\347\220\206-pyk/image-40.png" differ diff --git "a/2023/05/24/\347\255\211\347\246\273\345\255\220\344\275\223\347\211\251\347\220\206-pyk/image-41.png" "b/2023/05/24/\347\255\211\347\246\273\345\255\220\344\275\223\347\211\251\347\220\206-pyk/image-41.png" new file mode 100644 index 0000000..b2fdf08 Binary files /dev/null and "b/2023/05/24/\347\255\211\347\246\273\345\255\220\344\275\223\347\211\251\347\220\206-pyk/image-41.png" differ diff --git "a/2023/05/24/\347\255\211\347\246\273\345\255\220\344\275\223\347\211\251\347\220\206-pyk/image-42.png" "b/2023/05/24/\347\255\211\347\246\273\345\255\220\344\275\223\347\211\251\347\220\206-pyk/image-42.png" new file mode 100644 index 0000000..1d57655 Binary files /dev/null and "b/2023/05/24/\347\255\211\347\246\273\345\255\220\344\275\223\347\211\251\347\220\206-pyk/image-42.png" differ diff --git "a/2023/05/24/\347\255\211\347\246\273\345\255\220\344\275\223\347\211\251\347\220\206-pyk/image-43.png" "b/2023/05/24/\347\255\211\347\246\273\345\255\220\344\275\223\347\211\251\347\220\206-pyk/image-43.png" new file mode 100644 index 0000000..1259481 Binary files /dev/null and "b/2023/05/24/\347\255\211\347\246\273\345\255\220\344\275\223\347\211\251\347\220\206-pyk/image-43.png" differ diff --git "a/2023/05/24/\347\255\211\347\246\273\345\255\220\344\275\223\347\211\251\347\220\206-pyk/image-44.png" "b/2023/05/24/\347\255\211\347\246\273\345\255\220\344\275\223\347\211\251\347\220\206-pyk/image-44.png" new file mode 100644 index 0000000..dfdc18b Binary files /dev/null and "b/2023/05/24/\347\255\211\347\246\273\345\255\220\344\275\223\347\211\251\347\220\206-pyk/image-44.png" differ diff --git "a/2023/05/24/\347\255\211\347\246\273\345\255\220\344\275\223\347\211\251\347\220\206-pyk/image-45.png" "b/2023/05/24/\347\255\211\347\246\273\345\255\220\344\275\223\347\211\251\347\220\206-pyk/image-45.png" new file mode 100644 index 0000000..d57b059 Binary files /dev/null and "b/2023/05/24/\347\255\211\347\246\273\345\255\220\344\275\223\347\211\251\347\220\206-pyk/image-45.png" differ diff --git "a/2023/05/24/\347\255\211\347\246\273\345\255\220\344\275\223\347\211\251\347\220\206-pyk/image-46.png" "b/2023/05/24/\347\255\211\347\246\273\345\255\220\344\275\223\347\211\251\347\220\206-pyk/image-46.png" new file mode 100644 index 0000000..05a668a Binary files /dev/null and "b/2023/05/24/\347\255\211\347\246\273\345\255\220\344\275\223\347\211\251\347\220\206-pyk/image-46.png" differ diff --git "a/2023/05/24/\347\255\211\347\246\273\345\255\220\344\275\223\347\211\251\347\220\206-pyk/image-47.png" "b/2023/05/24/\347\255\211\347\246\273\345\255\220\344\275\223\347\211\251\347\220\206-pyk/image-47.png" new file mode 100644 index 0000000..c2041c5 Binary files /dev/null and "b/2023/05/24/\347\255\211\347\246\273\345\255\220\344\275\223\347\211\251\347\220\206-pyk/image-47.png" differ diff --git "a/2023/05/24/\347\255\211\347\246\273\345\255\220\344\275\223\347\211\251\347\220\206-pyk/image-48.png" "b/2023/05/24/\347\255\211\347\246\273\345\255\220\344\275\223\347\211\251\347\220\206-pyk/image-48.png" new file mode 100644 index 0000000..7cf7f29 Binary files /dev/null and "b/2023/05/24/\347\255\211\347\246\273\345\255\220\344\275\223\347\211\251\347\220\206-pyk/image-48.png" differ diff --git "a/2023/05/24/\347\255\211\347\246\273\345\255\220\344\275\223\347\211\251\347\220\206-pyk/image-49.png" "b/2023/05/24/\347\255\211\347\246\273\345\255\220\344\275\223\347\211\251\347\220\206-pyk/image-49.png" new file mode 100644 index 0000000..911320f Binary files /dev/null and "b/2023/05/24/\347\255\211\347\246\273\345\255\220\344\275\223\347\211\251\347\220\206-pyk/image-49.png" differ diff --git "a/2023/05/24/\347\255\211\347\246\273\345\255\220\344\275\223\347\211\251\347\220\206-pyk/image-50.png" "b/2023/05/24/\347\255\211\347\246\273\345\255\220\344\275\223\347\211\251\347\220\206-pyk/image-50.png" new file mode 100644 index 0000000..80aa62c Binary files /dev/null and "b/2023/05/24/\347\255\211\347\246\273\345\255\220\344\275\223\347\211\251\347\220\206-pyk/image-50.png" differ diff --git "a/2023/05/24/\347\255\211\347\246\273\345\255\220\344\275\223\347\211\251\347\220\206-pyk/image-51.png" "b/2023/05/24/\347\255\211\347\246\273\345\255\220\344\275\223\347\211\251\347\220\206-pyk/image-51.png" new file mode 100644 index 0000000..7788545 Binary files /dev/null and "b/2023/05/24/\347\255\211\347\246\273\345\255\220\344\275\223\347\211\251\347\220\206-pyk/image-51.png" differ diff --git "a/2023/05/24/\347\255\211\347\246\273\345\255\220\344\275\223\347\211\251\347\220\206-pyk/index.html" "b/2023/05/24/\347\255\211\347\246\273\345\255\220\344\275\223\347\211\251\347\220\206-pyk/index.html" new file mode 100644 index 0000000..b165716 --- /dev/null +++ "b/2023/05/24/\347\255\211\347\246\273\345\255\220\344\275\223\347\211\251\347\220\206-pyk/index.html" @@ -0,0 +1,253 @@ +等离子体物理_pyk | SHYEE-PLASMA + + + + + + + + + + + + +

    等离子体物理_pyk

    麦克斯韦方程组

    一般形式

    +

    +

    对(2.2.2)两边求散度(左乘拉普拉斯算子),再联立(2.2.3)就可以推出电荷守恒方程(2.2.5)

    +

    洛伦兹力定律

    F = q(E+v x B)

    +

    v是粒子速度

    +

    B= u0 ·H 是磁感应强度矢量

    +

    玻尔兹曼方程

    引入一个六位相空间(r,v)中的分布函数f(r,v,t),r代表位置,t代表速度。

    +

    可以得到无碰撞玻尔兹曼方程,或弗拉索夫(Vlasov)方程

    +

    2.3.2

    +

    +

    对其两边加上碰撞项,就得到玻尔兹曼方程

    +

    2.3.3

    +

    宏观量

    粒子密度

    +

    2.3.4

    +

    粒子通量

    +

    2.3.5

    +

    单位体积内粒子的动能

    +

    2.3.6

    +

    动量守恒方程&能量守恒方程

    对玻尔兹曼方程两端成v,然后对速度积分,就是动量守恒方程

    +

    2.3.9

    +

    其常见表达式为

    +

    2.3.15

    +

    对玻尔兹曼方程两端同乘1/2mv^2,并对速度积分,能得到能量守恒方程

    +

    2.3.21

    +

    麦克斯韦分布

    在没有空间梯度和加速度项的稳态情况下,玻尔兹曼方程简化为

    +

    2.4.1

    +

    c代表同种粒子之间的碰撞,其解为一个有高斯形式的速度分布函数f(v)

    +

    2.4.2

    +

    最终可以解出C和ξ可以得到

    +

    2.4.7

    +

    等离子体在均匀场中的运动

    回旋频率

    回旋半径

    ExB漂移

    电磁波

    静电波

    介电张量

    波的色散关系

    磁化等离子体中的波

    包括离子运动的磁化等离子体基本波的色散关系曲线

    +

    IV曲线

    chatGPT

    我们可以利用IV曲线上的斜率来计算等离子体密度。在低压下,当电流随电压增加呈指数增长时,IV曲线上的斜率与等离子体密度成正比。因此,我们可以使用以下公式来计算等离子体密度:

    +

    n_e = (I_s/2πrLqA) * [(dV/dI) / V_p]

    +

    其中,n_e 表示等离子体密度;I_s 表示饱和电流;r 是探针半径;L 是探针长度;q 是电子电量;A 是探针截面积;dV/dI 是IV曲线的斜率;V_p 是等离子体的诱导电压。

    +

    需要注意的是,这种方法只能用于计算等离子体密度的数量级,而无法得到精确值。同时,由于该方法对实验条件要求较高,可能存在误差。

    +

    对于弱等离子体(即电离度较低),可以使用Langmuir剖面计算等离子体密度:
    n_e = (I_sat / A) * ((4ε_0me)/(e^2π^2))^(1/2)

    +

    其中,n_e表示等离子体密度;I_sat表示探针饱和电流;A表示探针表面积;ε_0表示真空介电常数;m_e表示电子质量;e表示元电荷。

    +

    对于强等离子体(即电离度较高),可以使用Saha-Boltzmann方程计算电子密度:
    n_e = (2πm_e k_B T_e/h^2)^(3/2) * (N_i/N)^2 * exp((-E_i/k_B T_e)* (1-β))

    +

    其中,N_i表示第i种粒子的数密度;N表示总数密度;T_e表示等离子体电子温度;k_B表示玻尔兹曼常数;h表示普朗克常数;E_i表示第i种粒子的电离势;β表示热化学平衡指数,通常在1左右。

    +

    Wang

    +

    +

    +

    Vp是IV曲线的拐点

    +

    Vp

    +

    EEDF

    6.6.15

    +
    +chatGPT方案--展开查看 + + +

    等离子体的EEDF(能量电子分布函数)描述了等离子体中电子的能级分布情况,是等离子体物理学中一个重要的参数。以下是计算等离子体EEDF的基本步骤:

    +

    选取合适的实验方法来测量等离子体的电子能谱。常用的实验方法包括:光电子显微镜、辐射法、气体磁谱计等。

    +

    对于得到的电子能谱进行预处理,并将其转换为电子能量分布函数。通常,可以使用不同的数值技术和算法来进行预处理和转换。

    +

    根据转换后的电子能量分布函数,计算出等离子体的EEDF。这可以通过应用Boltzmann方程或其他相关方程进行计算。Boltzmann方程给出了EEDF的形式,可以写成下面的形式:

    +

    f(E) = A * exp(-E/kT_e)

    +

    其中,E是电子能量;T_e是电子温度;A是归一化常数。

    +

    对于复杂等离子体,例如非平衡等离子体,可能需要考虑更多的因素并采用更加复杂的模型来计算EEDF。在这种情况下,可以结合数值模拟和实验数据来进行计算和分析。
    计算等离子体EEDF的公式通常基于Boltzmann方程,其形式如下:

    +

    f(E) = A * exp(-E/kT_e)

    +

    其中,f(E)是电子能量分布函数;E是电子能量;T_e是等离子体电子温度;A是归一化常数。

    +

    计算EEDF需要确定电子能量分布函数中的参数,包括归一化常数A和电子温度T_e。这可以通过将实验数据与理论模型进行比较来获得。

    +

    对于平衡态等离子体,可以使用以下公式计算电子密度n_e和电子温度T_e:

    +

    n_e = n_0 * exp(-E_i/kT_e)

    +

    T_e = (2/3)*(kT_n/m_e)

    +

    其中,n_0是等离子体中的中性原子或分子浓度;E_i是电离势;T_n是等离子体中的中性粒子温度;m_e是电子质量;k是玻尔兹曼常数。

    +

    归一化常数A是EEDF中的一个重要参数,它通常用于确保电子能量分布函数f(E)的总积分为1。确定归一化常数A的方法可能因实验条件和等离子体类型而异,但以下是一些常见的方法:

    +

    使用计算机模拟来估计归一化常数A。可以通过对Boltzmann方程进行数值求解来获得电子能量分布函数,并根据总积分为1的条件来确定归一化常数A。

    +

    使用实验数据来确定归一化常数A。这可以通过将实验得到的电子能谱与理论模型进行比较来实现。首先,需要计算出理论上的电子能谱,并使用已知的归一化常数A来匹配实验结果。然后,通过比较实验数据和模型预测值的差异来调整归一化常数A的值。

    +

    采用标准归一化常数。有时候,也可以使用标准归一化常数(例如,SI制中的1/m^3)来简化计算过程。这意味着电子能量分布函数f(E)将被除以总电子密度n_e,以确保总积分为1。

    + +
    + +

    EEPF

    6.6.18

    +
    +

    单粒子方程

    +

     1

    +

    第一项是压力梯度项

    +

    第二项是qn洛伦兹力

    +

    第三项是碰撞项

    +

    离子束守恒(速率平衡方程)

    +

    +

    右边分别是产生项-损失项

    +

    对于1式中u比较小,所以可以省略,最终化简为以下式子

    +

    +

    电子电流

    +

    +

    u是平均速度

    +

    综上就可以推出欧姆定律(?)

    +

    +

    +

    又知道j =电导率xE,所以根据上式就可以得出等离子体的电导率.

    +
    Author: SHYEE
    Link: http://example.com/2023/05/24/%E7%AD%89%E7%A6%BB%E5%AD%90%E4%BD%93%E7%89%A9%E7%90%86-pyk/
    Copyright Notice: All articles in this blog are licensed under CC BY-NC-SA 4.0 unless stating additionally.
    \ No newline at end of file diff --git a/2023/06/02/A-flowing-plasma-model-to-describe-drift-waves-in-a-cylindrical-helicon-discharge/index.html b/2023/06/02/A-flowing-plasma-model-to-describe-drift-waves-in-a-cylindrical-helicon-discharge/index.html new file mode 100644 index 0000000..b5a72e1 --- /dev/null +++ b/2023/06/02/A-flowing-plasma-model-to-describe-drift-waves-in-a-cylindrical-helicon-discharge/index.html @@ -0,0 +1,177 @@ +A flowing plasma model to describe drift waves in a cylindrical helicon discharge | SHYEE-PLASMA + + + + + + + + + + + +

    A flowing plasma model to describe drift waves in a cylindrical helicon discharge

    摘要

    一种双流体模型最初是用来描述真空电弧离心机(一个快速旋转、低温、密闭的圆柱形等离子体柱)中的波振荡,该模型被用于解释具有相似密度和场强的RF产生的线性磁化等离子体[WOMBAT(磁化束和湍流上的波)]中的等离子体振荡。与典型的离心等离子体相比,WOMBAT等离子体的归一化旋转频率较慢,温度较低,轴向速度较低。尽管存在这些差异,但双流体模型提供了对WOMBAT等离子体结构的一致描述,并且在测量和预测的波振荡频率轴向场强之间取得了定性一致。此外,该模型预测的密度扰动的径向分布与实测数据一致。参数扫描表明,色散曲线对轴向场强电子温度敏感,振荡频率随电子温度的变化规律与实验吻合。这些结果巩固了先前的说法,即密度和浮动电位振荡是由密度梯度驱动的电阻漂移模式。据我们所知,这是第一个在远离射频源的扩散区域流动等离子体的详细物理模型。还讨论了模型的可能扩展,包括温度不均匀性和磁场振荡。

    +

    WOMBAT装置

    Figure 1

    +

    该图为不同螺旋波等离子体装置以及典型操作参数

    +

    table from another article

    +

    典型的WOMBAT和PCEN等离子体装置的参数

    table 1

    +
    +

    螺旋等离子体中的低频振荡大致可分为两类:开尔文-亥姆霍兹不稳定性和漂移波

    +

    开尔文-亥姆霍兹不确定性(Kelvin–Helmholtz instability)

    开尔文-亥姆霍兹不稳定性是由质量流中的速度剪切或两种流体界面上的速度差驱动的这可能发生在螺旋等离子体中,因为离子流体的流动速度比电子慢得多

    +

    漂移波(drift waves)

    漂移波是由垂直于环境场的等离子体压力梯度驱动的普遍不稳定性它可以在完全电离、磁约束和低β等离子体中产生,并且在线性和环形场几何中都被观察到。

    +

    双流体模型

    包括离子流体和电子流体的运动方程和连续性方程:

    +

    (1)

    +

    (2)

    +

    (3)

    +

    (4)

    +
    Author: SHYEE
    Link: http://example.com/2023/06/02/A-flowing-plasma-model-to-describe-drift-waves-in-a-cylindrical-helicon-discharge/
    Copyright Notice: All articles in this blog are licensed under CC BY-NC-SA 4.0 unless stating additionally.
    \ No newline at end of file diff --git a/2023/06/07/3D-VIRTUS-Equilibrium-condition-solver-of-radio-frequency-magnetized-plasma-discharges-for-space-applications/index.html b/2023/06/07/3D-VIRTUS-Equilibrium-condition-solver-of-radio-frequency-magnetized-plasma-discharges-for-space-applications/index.html new file mode 100644 index 0000000..20c52ca --- /dev/null +++ b/2023/06/07/3D-VIRTUS-Equilibrium-condition-solver-of-radio-frequency-magnetized-plasma-discharges-for-space-applications/index.html @@ -0,0 +1,176 @@ +3D-VIRTUS Equilibrium condition solver of radio-frequency magnetized plasma discharges for space applications | SHYEE-PLASMA + + + + + + + + + + + +

    3D-VIRTUS Equilibrium condition solver of radio-frequency magnetized plasma discharges for space applications

    摘要

    我们介绍了 3D-VIRTUS(3 维高级流体漂移扩散等离子体求解器),这是一种用于评估螺旋等离子体源平衡条件的数值工具,由电磁模块流体模块组成。第一个评估通过驱动放电的天线沉积到等离子体中的功率,它基于固体数值工具(即 ADAMANT)。第二个模块使用功率沉积通过流体方法解决带电和中性物质的宏观传输,并假设 DriftDiffusion 近似有效。连续性、动量、能量和泊松方程组通过有限体积法进行数值求解,并在 OpenFOAM 中实现。迭代这两个模块,直到获得收敛的解决方案。这种方法允许对 Helicon 源中处于平衡状态的局部等离子体参数(例如,等离子体密度)进行自洽评估,该参数具有(i)任意形状的等离子体区域和天线,(ii)由电磁铁产生的真实静磁场或永久磁铁。 FLUID 模块的数值精度已被评估为时间和空间离散化的函数。 FLUID 模块和 3D-VIRTUS 代码已经针对其他成熟的数值方法和实验测量进行了独立验证。最后,3D-VIRTUS 已被用于研究用于空间推进应用的 Helicon 等离子体放电,静磁场值从 0 G 到 750 G。

    +

    模拟

    流体

    流体方法假定粒子分布函数,并根据连续性、动量和能量方程 [27] 来描述等离子体放电。如果未计算分布函数,则流体模型无法解释非局部动力学 [28]。

    +

    因此,这种方法不适用于低压放电 (≤1mTorr),在这种情况下,由于碰撞率低,非局部效应往往很重要。尽管有此限制,流体模型已被广泛使用,因为它们在计算速度方面相对于其他方法具有优势 [29]。此外,可以轻松处理大量物种,从而可以研究以众多反应为特征的系统 [28]。

    +

    动力学

    动力学方法基于麦克斯韦方程的解以及积分微分玻尔兹曼方程 [27],并允许唯一地确定自洽粒子分布函数。

    +

    从后者的知识来看,粒子密度、平均速度等宏观量都是通过对分布函数求平均来确定的。由于它复杂且计算量大,因此动力学方法主要应用于简化假设,例如单维模拟 [30]。

    +

    具有蒙特卡洛碰撞的Paticle-In-Cell (PIC-MCC)

    在 PIC-MCC 方法中,计算粒子(即物理带电粒子云)的轨迹在 EM 场的影响下及时整合 [31]。

    +

    特别是,控制方程用很少的近似值求解,允许对局部和非局部效应进行精确建模,进而对粒子分布函数进行建模 [28]。这种方法虽然非常准确,但计算量很大,对于高密度 (≥ 10^19 m^−3) 等离子体尤其如此;计算成本实际上与模拟的粒子数量有关。

    +

    尽管如此,已经开发出各种技术来加速 PIC-MCC 模拟,即隐式移动器、更长的离子时间步长、更轻的质量离子、电子和离子的不同权重、不均匀的初始密度分布、低和高的不同权重能量粒子和代码并行化[28]。

    +

    尽管结合使用这些技术可以大大减少仿真时间,但 PIC-MCC 代码通常仍然比流体代码慢。因此,PIC 模拟非常适合非局部效应非常重要且粒子密度低 (≤ 10^17 m^−3) [28] 的低压排放。

    +

    混合

    为了保持 PIC-MCC 和动力学模拟的准确性,同时减少计算负担,上述方法已结合在混合求解器中 [30,32]。根据要建模的物理场,可以采用各种策略。离子可以模拟为流体,而电子在 PIC-MCC 方案中进行处理 [33]。或者,只有高能电子可以使用 PIC-MCC 策略进行模拟,而离子和低能电子被视为流体 [34]。混合方法的主要限制是生成的算法可能非常繁琐 [28]。

    +

    3D-VIRTUS的主要特点:

    (i)处理复杂形状的 Helicon 源的能力

    +

    (ii) 实际射频天线的建模及其电流分布

    +

    (iii) 在流体问题的解决方案中可以很容易地从 1D 重新配置到3D,这取决于手头问题的几何复杂性和所需的精度

    +
    Author: SHYEE
    Link: http://example.com/2023/06/07/3D-VIRTUS-Equilibrium-condition-solver-of-radio-frequency-magnetized-plasma-discharges-for-space-applications/
    Copyright Notice: All articles in this blog are licensed under CC BY-NC-SA 4.0 unless stating additionally.
    \ No newline at end of file diff --git a/2023/06/07/Helicon_wave_coupling_to_a_finite_plasma_column/index.html b/2023/06/07/Helicon_wave_coupling_to_a_finite_plasma_column/index.html new file mode 100644 index 0000000..d4625f8 --- /dev/null +++ b/2023/06/07/Helicon_wave_coupling_to_a_finite_plasma_column/index.html @@ -0,0 +1,210 @@ +Helicon wave coupling to a finite plasma column | SHYEE-PLASMA + + + + + + + + + + + + +

    Helicon wave coupling to a finite plasma column

    实验装置(带天线版)

    +

    计算了

    螺旋波体系中的色散关系

    介电张量(dielectric tensor)

    +

    介电张量

    +

    其中张量元素为:

    +

    tensor elements

    +

    +

    上图为等离子体色散函数

    +

    wpj、wcj和vj分别为等离子体、回旋、电子和离子碰撞频率,vTe=(2Te/me)^(1/2)为热电子速度。

    +

    磁化等离子体中的波传播

    +

    色散关系

    +

    其中 N = kc/ω = k/k0,k 是波矢量,I 是单位张量。

    +

    由于平行折射率 N = k/k0与发射天线的平行波数谱相关,因此很自然地将垂直折射率 N= k/k0 中的色散关系写为双二次方程,

    +

    perpendicular refractive index

    +

    解得

    +

    solution

    +

    其中

    +

    各参数

    +

    对应于垂直于外部磁场的相速度分量,与两个解相关的波被表示为慢波(s,+符号)和快波(f,-符号)。

    +

    本文考虑频率范围内的波传播

    +

    wave propagation in the frequency regime

    +

    为了处理易于管理的公式,假设波是弱阻尼的。然后我们得到ε元素的简化表达式,

    +

    simplified expressions

    +

    结合碰撞阻尼和朗道阻尼γe,ie,i/ω≪1,γeffeELD,则

    +

    further assumption

    +

    慢波色散公式如下:

    +

    慢波色散公式

    +

    慢波以大于几何平均频率ω0=(ωciωce)1/2的频率传播,反过来可以忽略离子阻尼,

    +

    neglected ion damping

    +

    快波色散关系可以写为:

    +

    fast wave dispersion relation

    +

    进一步得出螺旋波色散关系

    +

    helicon wave dispersion

    +

    由于实验中波数分量由天线等离子体系统的几何形状给出,所以色散关系可以写为

    +

    another form

    +

    与有限等离子圆柱体的电感耦合

    电磁波场的傅里叶表示可写为

    +

    Fourier representation of the electromagnetic wave field

    +

    因为磁化等离子体存在不同的左旋和右旋极化波方程,所以需要引入复杂的方位角本征函数。
    代入麦克斯韦方程

    +

    ansatz into Maxwell

    +

    得出了

    天线频谱

    能量沉积

    conclusion

    结果就是本文结论部分提到了用了一种code,但是通篇都没说用的啥code

    +

    除了通过当前的计算推断出更深入的物理理解之外,还有几个方面应该使我们能够使用当前的代码。

    +

    (i)只要沿磁场线不存在等离子体不均匀性,就可以处理发射天线的任意电流分布。因此,假设真实的等离子体数据(包括径向密度分布),可以研究不同天线的效率以找到最佳的天线几何形状。

    +

    (ii) 该代码产生系统的复阻抗,以便通过与阻抗测量结果比较,获得有关射频功率吸收的信息。

    +

    (iii) 原则上,该代码允许我们计算未来计划的等离子体中的电磁场分布。除了与等离子柱中电磁场的测量进行比较(例如使用磁探针)之外,利用电磁场的知识来研究测试电子的运动可能是有价值的。通过这种方式,可以获得可能导致螺旋波器件高效率的加速机制的一些物理见解。

    +

    ELD

    “Chen (1991, 1992) provided some evidence that electron Landau damping (ELD) combined with particle trapping may be a decisive factor in accelerating a considerable portion of the electrons to the ionization energy.” (Fischer 等, 1994, p. 2003) Chen (1991, 1992) 提供了一些证据表明,电子朗道阻尼 (ELD) 与粒子捕获相结合可能是将相当一部分电子加速到电离能的决定性因素。

    +

    快波(fast waves)& 慢波(slow waves)

    “We attempt to understand the results in terms of the fast and slow wave dispersion relations, and study, in this context, the validity of the approximate (fast) helicon wave dispersion relation.” (Fischer 等, 1994, p. 2003) 我们试图根据快波和慢波色散关系来理解结果,并在这种情况下研究近似(快)螺旋波色散关系的有效性。

    +

    这篇文章讲了什么?

    “Inductive helicon wave coupling to a plasma column is studied numeridy. In our theoretical model, the RF current distribution of the launching antenna is taken into account as well as the finite size of the plasma cylinder. Computational mults based on the data of presentday helicon devices are shown. The efficiency of various types of antennae is Studied for a wide range ofexperimental parameters. In particular, we discuss the role of magnetic-field-aligned electron Landau damping far the helicon wave absorption. In many cases, the numerical findings can be understood reasonably in term of the wavenumber spectra of the antenna and the helicon wave dispersion relation. In general, however, the full electromagnetic treatment is necessary in order to describe and to understand the inductive coupling in the helicon wave regime.” (Fischer 等, 1994, p. 2003) 耦合到等离子体柱的感应螺旋波被大量研究。在我们的理论模型中,发射天线的射频电流分布被考量以及等离子圆柱体的有限尺寸。显示了基于当今螺旋装置数据的计算倍数。针对广泛的实验参数研究了各种类型天线的效率。特别是,我们讨论了磁场对齐的电子 Landau 对螺旋波吸收的阻尼作用。在许多情况下,可以根据天线的波数谱和螺旋波色散关系合理地理解数值结果。然而,一般来说,为了描述和理解螺旋波区域中的电感耦合,完整的电磁处理是必要的。

    +
    Author: SHYEE
    Link: http://example.com/2023/06/07/Helicon_wave_coupling_to_a_finite_plasma_column/
    Copyright Notice: All articles in this blog are licensed under CC BY-NC-SA 4.0 unless stating additionally.
    \ No newline at end of file diff --git "a/2023/06/13/helicon\344\273\277\347\234\237\357\274\210\344\273\243\347\240\201\357\274\211\345\220\210\351\233\206/index.html" "b/2023/06/13/helicon\344\273\277\347\234\237\357\274\210\344\273\243\347\240\201\357\274\211\345\220\210\351\233\206/index.html" new file mode 100644 index 0000000..2d827f6 --- /dev/null +++ "b/2023/06/13/helicon\344\273\277\347\234\237\357\274\210\344\273\243\347\240\201\357\274\211\345\220\210\351\233\206/index.html" @@ -0,0 +1,161 @@ +helicon仿真(代码)合集 | SHYEE-PLASMA + + + + + + + + + +

    helicon仿真(代码)合集

    Author: SHYEE
    Link: http://example.com/2023/06/13/helicon%E4%BB%BF%E7%9C%9F%EF%BC%88%E4%BB%A3%E7%A0%81%EF%BC%89%E5%90%88%E9%9B%86/
    Copyright Notice: All articles in this blog are licensed under CC BY-NC-SA 4.0 unless stating additionally.
    \ No newline at end of file diff --git a/2023/06/28/Measurement-and-modeling-of-ion-energy-distribution-functions-in-a-low-pressure-argon-plasma-diffusing-from-a-13-56-MHz-helicon-source/index.html b/2023/06/28/Measurement-and-modeling-of-ion-energy-distribution-functions-in-a-low-pressure-argon-plasma-diffusing-from-a-13-56-MHz-helicon-source/index.html new file mode 100644 index 0000000..eaed98d --- /dev/null +++ b/2023/06/28/Measurement-and-modeling-of-ion-energy-distribution-functions-in-a-low-pressure-argon-plasma-diffusing-from-a-13-56-MHz-helicon-source/index.html @@ -0,0 +1,187 @@ +Measurement and modeling of ion energy distribution functions in a low pressure argon plasma diffusing from a 13.56 MHz helicon source | SHYEE-PLASMA + + + + + + + + + + + + +

    Measurement and modeling of ion energy distribution functions in a low pressure argon plasma diffusing from a 13.56 MHz helicon source

    摘要

    与扩散室耦合的螺旋源提供了一种更好地控制等离子体处理的新方法。然而,重要的是要了解扩散对从源到位于腔室中的晶片的等离子体的影响。 300 W 氩等离子体从 13.56 MHz(直径 6 厘米,长 20 厘米)圆柱形无磁场源扩散到直径 30 厘米,长 20 厘米的腔室中,已经进行了实验和理论研究。使用移动静电能量分析仪来测量沿源和室的公共轴的电子温度、等离子体电势、等离子体密度和离子能量分布函数(EDF)。开发了基于实验结果的分析模型。尽管源和衬底台之间存在约 40 V 的电势差,但与等离子体膨胀相关的电荷交换碰撞将撞击腔室底部接地探针的离子的平均能量降低至约 3 eV。在 1 μbar 时,碰撞次数太少,无法冷却场中加速的所有离子,并且离子分布函数中仍保留尾部。虽然没有测量,但热中性物也应该作为电荷交换碰撞的结果而产生,并且会撞击基板。

    +

    实验装置

    实验装置

    +

    用什么方法(模型)测量什么参数?

    密度

    测定了Density,使用empirical fit

    +

    经验公式

    +

    其中 n(0) 是源中心的密度,C 是与等离子体的几何形状和耦合相关的常数。

    +

    等离子体电势

    等离子体电势是根据分析仪测量的离子电流与鉴别器电压的关系推导出来的。

    +

    对于给定恒定的麦克斯韦电子分布,玻尔兹曼关系可用于将密度的演变与电势联系起来

    +

    玻尔兹曼关系

    +

    其中Vp(0)是源中心的电势,Te是电子温度。

    +

    离子能量分布函数

    离子 EDF 由测量电流的导数获得

    +

    (5)

    +

    vf(Vd)能测出来

    +

    能估计出平均离子速度。

    +

    轴向电场由等离子体电势的导数获得

    +

    轴向电场

    +

    分布函数取决于从产生点到测量点的电势和平均自由程变化。

    +

    平均自由程:

    +

    mean free path

    +

    其中nn(x)是中性数密度,a是横截面。

    +

    分析仪在轴向位置 xp 和鉴别器电势 Vd 处收集的离子电流的表达式

    +

    电流

    +

    +

    结论

    我们提出了氩等离子体低压扩散远离源区的实验结果。开发了一个简单的分析模型,该模型与实验结果一致,并显示了扩散区域中电荷交换碰撞的重要性。离子EDF的形状是膨胀产生的自洽场的加速效应与电荷交换碰撞的热化效应之间的平衡。这两种现象的直接后果将是产生快速中性粒子,该中性粒子会撞击扩散区域底部的基板。这些中性粒子代表了基底表面的额外能量输入,在估计表面反应时应予以考虑。

    +
    Author: SHYEE
    Link: http://example.com/2023/06/28/Measurement-and-modeling-of-ion-energy-distribution-functions-in-a-low-pressure-argon-plasma-diffusing-from-a-13-56-MHz-helicon-source/
    Copyright Notice: All articles in this blog are licensed under CC BY-NC-SA 4.0 unless stating additionally.
    \ No newline at end of file diff --git a/2023/07/01/Modeling-of-profile-effects-for-inductive-helicon-plasma-sources/index.html b/2023/07/01/Modeling-of-profile-effects-for-inductive-helicon-plasma-sources/index.html new file mode 100644 index 0000000..3b15f5c --- /dev/null +++ b/2023/07/01/Modeling-of-profile-effects-for-inductive-helicon-plasma-sources/index.html @@ -0,0 +1,243 @@ +Modeling of profile effects for inductive helicon plasma sources | SHYEE-PLASMA + + + + + + + + + + + + +

    Modeling of profile effects for inductive helicon plasma sources

    摘要

    已经开发出用于对现有和新的材料加工螺旋源进行建模的计算机代码。 Nagoya Ⅲ型、螺旋形和 Stix 线圈天线已被建模,用于研究和检查等离子体密度和温度分布对一小部分 (nfe/ne≈5%) 快电子 (T≈40eV) 功率吸收的影响,这提供了实验中中性气体的电离,以及氩气中体相(T≈3 eV)电子的分布。 “ANTENA”计算机代码最初由 B.McVey 编写,用于研究离子回旋波,经过修改后用于研究和模拟螺旋源。代码中添加了包含径向密度和温度分布的碰撞模型,以研究碰撞对加热机制的影响。详细研究了碰撞和朗道阻尼加热机制的竞争效应,结果表明碰撞在高密度(ne ≥1013 cm-3)的等离子体吸收剖面中起着重要作用。射频波吸收曲线对等离子体密度和温度曲线敏感。研究发现,仅激发 m = +1 方位角模式的部分匝螺旋天线在将功率耦合到假设的等离子体轮廓方面比 Nagoya Ⅲ 型天线更有效。 Stix线圈也因其波热场的轴上峰值而被认为很有前途。

    +

    ANTNA

    Brian McVey编写 1984年

    +

    该代码计算了各种ICRF天线配置的真空场和线性自洽等离子体场。

    +

    随着电场和磁场的变化,计算了径向功率沉积曲线、径向功率流和天线阻抗(包括线圈之间的相互阻抗)。

    +

    程序结构图

    程序结构图

    +

    通过名称列表,INPUT读取定义图中所示问题所需的所有参数。下面的子例程,INITLZE执行各种计算,例如从cm转换。到m.,设置径向等离子体剖面,等等。绘图和打印子例程将输入信息写入磁盘文件。现在我们到了程序的主循环。IVAR是计算字段的自变量。方程的检验。(1)和(2)表明IVAR可以取多个不同的值;r, Φ, z, W/Wci, f, ne, T, T, B0, kz,以及其他用户定义的变量。根据ISPECTR的值,由SPECTRM计算Eq.(1)的被积,或由INTEG进行逆变换。子程序INTEG执行傅里叶求和或使用积分器包DRIVE。这些子程序中的每一个都调用FIELDS来计算给定n, kz模式下的Eq.(2)。最后,将计算出的字段数量写入磁盘文件,并重复该过程以获得新的IVAR值。图是“ANTENA”的一般流程图。

    +

    “ANTENA”代码使用包含源代码INTPROG4的集成包。

    +

    此代码计算由 RF 感应线圈包围的一维 (1-D) 圆柱形热磁化等离子体中的三维 (3-D) 电磁等离子体场。作者修改了此代码来研究和分析螺旋天线以及名古屋 Ⅲ 型和 m=0 Stix 线圈,以了解较低混合频率范围内高密度等离子体源的等离子体吸收曲线。

    +

    等离子体密度 ne(T) 和等离子体温度 Te(r) 是半径的函数,并且它们的径向变化通过分层模型来近似。等离子体响应的特征是等离子体等效介电张量,其中包括射频场的自洽朗道阻尼和碰撞阻尼。电子和离子均假定为麦克斯韦速度分布。引入“ANTENA”中实现的粒子守恒Krook碰撞模型,以唯象方式模拟电子碰撞。

    +

    物理含义

    Antenna-plasma geometry.

    +

    上图所示的几何形状(除去天线后)在 z(轴向)和 Φ(方位角)方向上是均匀的。因此,场量在这些方向上的空间变化可以表示为傅立叶表示。傅里叶逆变换由下式给出

    +

    (1)

    +

    傅里叶系数可以写为

    +

    (2)

    +

    圆柱形管中的真空电磁场可以扩展为相对于圆柱形波导的轴为横向电(TE)和横向磁(TM)的波导模式。轴向场分量满足贝塞尔方程

    +

    (3)

    +

    对于由下式给出的径向波数

    +

    (4)

    +

    横向场是根据轴向场的麦克斯韦方程确定的。在等离子体中,近 TE 模式的贝塞尔方程变为

    +

    (5)

    +

    (6)

    +

    (7)

    +

    对于近 TM 模式,我们有

    +

    (8)

    +

    (9)

    +

    (10)

    +

    径向波数 kr1,kr2 定义为

    +

    (11)

    +

    等离子体由“Stix”等效介电张量的众所周知的元素表示

    +

    (12)

    +

    其中 P 分量包括碰撞和朗道阻尼效应,由下式给出

    +

    (13)

    +

    (14)

    +

    其中 Z 是 Fried 和 Conte 列出的等离子体色散函数

    +

    +

    +

    返回到(1),较小的根(kr1)分配给近横向电模式,较大的根(kr2)分配给近横向磁模式。总轴向等离子体场由下式给出

    +

    (15)

    +

    (16)

    +

    轴向分量Hz1(r)和Ez2(r)分别满足贝塞尔方程,横向等离子体场Er,EΦ,Hr,HΦ由轴向分量确定。上述通解是通过在上图所示的三个区域之间的界面处施加边界条件来求解的。

    +

    当导电管半径 r = c 时,电场的切向分量必须消失

    +

    +

    在r=a处的等离子体-真空边界上,电场和磁场的切向分量是连续的。那是

    +

    +

    其中上标v表示真空,p表示等离子体区域。根据安培定律,在r=b处的电流片上,电场的切向分量是连续的,而磁场的切向分量是不连续的。因此,我们可以写

    +

    +

    +

    天线上的电流分布

    假设天线的电流密度为螺线管(V·J = 0),我们只需确定方位角电流密度,因为轴向电流密度可以通过连续性方程的 m - kz变换来计算。那是

    +

    (17)

    +

    对于分数螺旋线圈:直螺旋绕组极限中的分数螺旋模拟了名古屋Ⅲ型线圈。电流分布以 delta 函数和亥维赛函数表示

    +

    (18)

    +

    L = 线圈长度

    +

    ANTENA Ⅱ

    McVey编写的“ANTENA”代码在 CRAY CTSS 计算机系统上用 FORTRAN 语言编程,用于研究磁聚变等离子体的 ICRF(离子回旋加速器频率范围)加热。作者使用图形包 PlPlot 将代码从 CRAY 设施移植到基于 UNIX 的工作站。

    +

    我们减小了圆柱壳的宽度,并检查了2.5厘米和5.0厘米半径分层等离子体密度和温度分布的收敛性(通常为 800 个径向点)。这使我们能够研究频率范围 f ~1-30 MHz 的螺旋波的传播,该波在径向轮廓中表现出短波长。在 IBM RS/6000 370 型工作站上,典型的 800 个层(径向点)运行描述了分层等离子体密度和温度分布,并假设只有一种方位角模式,需要大约五分钟的运行时间。

    +

    下图中所示的天线被建模为主要激发 m = +1 和 m = 0 方位角模式以产生等离子体。 Nagoya Ⅲ 型和螺旋线圈主要激发 m = +1 模式,而 Stix 线圈由于其方位均匀性,主要激发 m = 0 模式。

    +

    图a-不同天线的配置

    +

    “ANTENA”代码能够计算图a所示的感应天线的辐射电阻和电抗。传输到等离子体的功率可以是。写成

    +

    (21)power transfer

    +

    天线的阻抗可写为

    +

    (22)

    +

    其中

    +

    RA = Rr + RL = 天线电阻

    +

    Rr = 天线的辐射电阻

    +

    RL = 天线的趋肤损耗电阻

    +

    XA = 天线电抗

    +

    辐射电阻和品质因数Q是确定等离子体耦合功率效率的重要参数。辐射功率贡献于天线阻抗的实部,而存储在近场中的功率由阻抗的无功部分表示。

    +

    总体品质因数 Q 可以根据等离子体 Qp= wL/R 确定,根据“ANTENA”计算得出,以及外部匹配网络 Qc。即1/Q=1/Q+1/Qc

    +

    通过对所有方位模数 m 进行积分,计算了三种等离子体密度分布的分数螺旋、Nagoya-Ⅲ 型天线和 Stix 线圈的辐射电阻。天线中心位于 z = 0 cm,长度 L = 25 cm,半径 T = 5.5 cm。对于所有三种等离子体剖面建模,螺旋天线比 Nagoya type-Ⅲ 具有更高的辐射电阻值和更低的品质因数。因此,该天线更容易与外部发生器匹配,并有效地将功率耦合到等离子体。螺旋天线较高的辐射电阻还可以实现与等离子体的有效功率耦合,同时线圈结构上的集肤效应损耗最小。还计算了 Stix 线圈的阻抗 (m = 0)。与其他天线相比,Stix 线圈激发低幅度 Ez(kz) 频谱。它具有最小的辐射电阻和较大的电抗,导致品质因数Q值非常大。因此,从射频源到天线的输入功率的匹配更加困难。

    +

    螺旋源模拟结果

    “ANTENA”代码用于对与螺旋源选定的实验数据相对应的案例进行建模。m = +1 螺旋模式的近似色散关系可以写为

    +

    (23)

    +

    然后获得该模式的轴向波长

    +

    (24)

    +

    也就是说,对于给定的频率 f 和磁场 Bo,螺旋波长将大致按 1/ne 变化。(波长与电子密度相关)

    +

    图 5. 对于 Nagoya Ⅲ型天线,在固定频率 f = 6 MHz 和磁场 Bo = 800 G 下,随着等离子体密度的增加,阻尼波的空间变化。

    +

    图5显示了空间阻尼B波幅随电子密度ne的增加而变化,假设抛物线等离子体密度ne(r)和等离子体温度Te(r)。名古屋Ⅲ型天线的长度为L = 25 cm,中心位于 z = 0 cm。我们观察到,正如预期的那样,轴向波长随着密度的增加而减小,并且波长约为 50 cm,是天线长度的两倍。

    +

    作者对低和高等离子体密度区域进行了建模,如图 7 所示。我们将频率固定在 f = 7 MHz,并改变磁场 B0 以保持比率 B0/ne,因此螺旋轴向波长 λ∥,[见(24)]常数。对于模型中使用的参数,该轴向波长在 10 到 60 cm 的范围内。尺寸如前所述的分数螺旋天线用于激发 m = +1 模式。

    +

    图 7. 由于 m = +1 模式和频率 f = 7 MHz 的螺旋波的朗道和碰撞阻尼,分数螺旋天线的体电子(实线)和快电子(虚线)吸收的径向功率。 (a) 低密度 (ne0 = 1 x 10^11 cm-3,B0 = 250 G)。 (b) 高密度 (ne0= 2 x10^13 cm-3,B0 = 700 G)。

    +

    图 7 说明朗道阻尼过程和碰撞阻尼过程均发生在该密度范围内。在低密度下,如图 7(a) 所示,大部分射频功率通过螺旋波的朗道阻尼被一小部分快电子吸收。随着等离子体密度的增加,由于碰撞阻尼而导致的大块慢电子的吸收变得占主导地位,并且碰撞阻尼率变得比朗道过程导致的更大。在高密度(ne≥10^13cm-3)下,碰撞阻尼是这些 3-4 eV 等离子体中的主要加热机制,但快速电子上存在少量朗道吸收。

    +

    作者根据二参数相关曲线 ne(r) = ne0(1-(r/a)^s)^t 模拟了各种等离子体密度分布,以检查它们对功率吸收的影响。假设温度分布均匀,各对参数 (s,t) 如图 10(a) 所示

    +
    Author: SHYEE
    Link: http://example.com/2023/07/01/Modeling-of-profile-effects-for-inductive-helicon-plasma-sources/
    Copyright Notice: All articles in this blog are licensed under CC BY-NC-SA 4.0 unless stating additionally.
    \ No newline at end of file diff --git "a/2023/07/03/\350\256\260\344\270\200\344\270\252\346\234\200\345\237\272\347\241\200\347\232\204\346\234\272\345\231\250\345\255\246\344\271\240/index.html" "b/2023/07/03/\350\256\260\344\270\200\344\270\252\346\234\200\345\237\272\347\241\200\347\232\204\346\234\272\345\231\250\345\255\246\344\271\240/index.html" new file mode 100644 index 0000000..3d8d987 --- /dev/null +++ "b/2023/07/03/\350\256\260\344\270\200\344\270\252\346\234\200\345\237\272\347\241\200\347\232\204\346\234\272\345\231\250\345\255\246\344\271\240/index.html" @@ -0,0 +1,630 @@ +记一个最基础的机器学习 | SHYEE-PLASMA + + + + + + + + + + + + +

    记一个最基础的机器学习

    Titanic

    作为Kaggle中最经典的机器学习入门算法,总结了机器学习的思路

    +

    导入数据

    1
    2
    3
    import numpy as np # linear algebra
    import pandas as pd # data processing, CSV file I/O (e.g. pd.read_csv)

    + + +
    1
    2
    3
    4
    5
    6
    7
    8
    # Input data files are available in the read-only "../input/" directory
    # For example, running this (by clicking run or pressing Shift+Enter) will list all files under the input directory

    import os
    for dirname, _, filenames in os.walk('datasets/titanic'):
    for filename in filenames:
    print(os.path.join(dirname, filename))

    + +
    datasets/titanic\gender_submission.csv
    +datasets/titanic\test.csv
    +datasets/titanic\train.csv
    +
    +

    简单看一眼数据

    1
    2
    train_data = pd.read_csv("datasets/titanic/train.csv")
    train_data.head()
    + + + + +
    +

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    PassengerIdSurvivedPclassNameSexAgeSibSpParchTicketFareCabinEmbarked
    0103Braund, Mr. Owen Harrismale22.010A/5 211717.2500NaNS
    1211Cumings, Mrs. John Bradley (Florence Briggs Th...female38.010PC 1759971.2833C85C
    2313Heikkinen, Miss. Lainafemale26.000STON/O2. 31012827.9250NaNS
    3411Futrelle, Mrs. Jacques Heath (Lily May Peel)female35.01011380353.1000C123S
    4503Allen, Mr. William Henrymale35.0003734508.0500NaNS
    +
    + + + + +
    1
    2
    test_data = pd.read_csv("datasets/titanic/test.csv")
    test_data.head()
    + + + + +
    +

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    PassengerIdPclassNameSexAgeSibSpParchTicketFareCabinEmbarked
    08923Kelly, Mr. Jamesmale34.5003309117.8292NaNQ
    18933Wilkes, Mrs. James (Ellen Needs)female47.0103632727.0000NaNS
    28942Myles, Mr. Thomas Francismale62.0002402769.6875NaNQ
    38953Wirz, Mr. Albertmale27.0003151548.6625NaNS
    48963Hirvonen, Mrs. Alexander (Helga E Lindqvist)female22.011310129812.2875NaNS
    +
    + + + +

    用原始的方法看一下性别对幸存的影响

    1
    2
    3
    4
    women = train_data.loc[train_data.Sex == 'female']["Survived"]
    rate_women = sum(women)/len(women)

    print("% of women who survived:", rate_women)
    + +
    % of women who survived: 0.7420382165605095
    +
    +
    1
    2
    3
    4
    men = train_data.loc[train_data.Sex == 'male']["Survived"]
    rate_men = sum(men)/len(men)

    print("% of men who survived:", rate_men)
    + +
    % of men who survived: 0.18890814558058924
    +
    +

    使用决策树的方式对数据进行预测

    原理如下

    +

    image.png

    +
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    from sklearn.ensemble import RandomForestClassifier

    y = train_data["Survived"]

    features = ["Pclass", "Sex", "SibSp", "Parch"]
    X = pd.get_dummies(train_data[features])
    X_test = pd.get_dummies(test_data[features])

    # 构建了100课随机树
    model = RandomForestClassifier(n_estimators=100, max_depth=5, random_state=1)
    model.fit(X, y)
    predictions = model.predict(X_test)

    output = pd.DataFrame({'PassengerId': test_data.PassengerId, 'Survived': predictions})
    output.to_csv('submission.csv', index=False)
    print("Your submission was successfully saved!")
    + +
    Your submission was successfully saved!
    +
    +
    1
    train_data.describe(include='all')
    + + + + +
    +

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    PassengerIdSurvivedPclassNameSexAgeSibSpParchTicketFareCabinEmbarked
    count891.000000891.000000891.000000891891714.000000891.000000891.000000891891.000000204889
    uniqueNaNNaNNaN8912NaNNaNNaN681NaN1473
    topNaNNaNNaNBraund, Mr. Owen HarrismaleNaNNaNNaN347082NaNB96 B98S
    freqNaNNaNNaN1577NaNNaNNaN7NaN4644
    mean446.0000000.3838382.308642NaNNaN29.6991180.5230080.381594NaN32.204208NaNNaN
    std257.3538420.4865920.836071NaNNaN14.5264971.1027430.806057NaN49.693429NaNNaN
    min1.0000000.0000001.000000NaNNaN0.4200000.0000000.000000NaN0.000000NaNNaN
    25%223.5000000.0000002.000000NaNNaN20.1250000.0000000.000000NaN7.910400NaNNaN
    50%446.0000000.0000003.000000NaNNaN28.0000000.0000000.000000NaN14.454200NaNNaN
    75%668.5000001.0000003.000000NaNNaN38.0000001.0000000.000000NaN31.000000NaNNaN
    max891.0000001.0000003.000000NaNNaN80.0000008.0000006.000000NaN512.329200NaNNaN
    +
    +
    Author: SHYEE
    Link: http://example.com/2023/07/03/%E8%AE%B0%E4%B8%80%E4%B8%AA%E6%9C%80%E5%9F%BA%E7%A1%80%E7%9A%84%E6%9C%BA%E5%99%A8%E5%AD%A6%E4%B9%A0/
    Copyright Notice: All articles in this blog are licensed under CC BY-NC-SA 4.0 unless stating additionally.
    \ No newline at end of file diff --git a/2023/07/05/Machine-Learning-Algorithms-A-Review/index.html b/2023/07/05/Machine-Learning-Algorithms-A-Review/index.html new file mode 100644 index 0000000..c3abc07 --- /dev/null +++ b/2023/07/05/Machine-Learning-Algorithms-A-Review/index.html @@ -0,0 +1,235 @@ +Machine Learning Algorithms A Review | SHYEE-PLASMA + + + + + + + + + + + + + + +

    Machine Learning Algorithms A Review

    摘要

    机器学习 (ML) 是对计算机系统用于执行特定任务而无需显式编程的算法和统计模型的科学研究。我们日常使用的许多应用程序中的学习算法。每次使用像谷歌这样的网络搜索引擎来搜索互联网时,其如此有效的原因之一是因为学习算法已经学会了如何对网页进行排名。这些算法用于各种目的,例如数据挖掘、图像处理、预测分析等。使用机器学习的主要优点是,一旦算法学会如何处理数据,它就可以自动完成其工作。本文对机器学习算法的广泛应用进行了简要回顾和未来展望。

    +

    算法分类

      +
    • supervised learning
        +
      • decision tree
      • +
      • naive bayes
      • +
      • support vector machine
      • +
      +
    • +
    • unsupervised learning
        +
      • principal component analysis
      • +
      • k-means
      • +
      +
    • +
    • semi-supervised learning
        +
      • generative model
      • +
      • self training
      • +
      • transductive support vector machine
      • +
      +
    • +
    • reinforcement learning
    • +
    • multi-task learning
    • +
    • ensemble learning
        +
      • boosting
      • +
      • bagging
      • +
      +
    • +
    • neutral network
        +
      • supervised neural network
      • +
      • unsupervised neural network
      • +
      • reinforce neural network
      • +
      +
    • +
    • instance based learning
        +
      • k-nearest neighbor
      • +
      +
    • +
    +

    决策树(decision tree)

    决策树是以树的形式表示选择及其结果的图。图中的节点表示事件或选择,图的边表示决策规则或条件。每棵树都由节点和分支组成。每个节点代表要分类的组中的属性,每个分支代表该节点可以取的值。

    +

    decisiontree

    +

    决策树的实现伪代码如下

    +
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    def decisionTreeLearning(examples, attributes, parent_examples): 
    if len(examples) == 0:
    return pluralityValue(parent_examples)
    # return most probable answer as there is no training data left
    elif len(attributes) == 0:
    return pluralityValue(examples)
    elif (all examples classify the same):
    return their classification
    A = max(attributes, key(a)=importance(a, examples)
    # choose the most promissing attribute to condition on
    tree = new Tree(root=A)
    for value in A.values():
    exs = examples[e.A == value]
    subtree = decisionTreeLearning(exs, attributes.remove(A), examples)
    # note implementation should probably wrap the trivial case returns into trees for consistency
    tree.addSubtreeAsBranch(subtree, label=(A, value)
    return tree
    + +

    朴素贝叶斯(naive bayes)

    +

    它是一种基于贝叶斯定理的分类技术,假设预测变量之间独立。简而言之,朴素贝叶斯分类器假设类中特定特征的存在与任何其他特征的存在无关。朴素贝叶斯主要针对文本分类行业。它主要用于依赖于发生的条件概率的聚类和分类目的。

    +

    朴素贝叶斯

    +

    伪代码如下:

    +

    输入:训练数据集T,

    +

    F= (f1, f2, f3,.., fn) // 测试数据集中预测变量的值。

    +

    输出:一类测试数据集。

    +

    步骤:

    +
      +
    1. 读取训练数据集T;
    2. +
    3. 计算每类预测变量的均值和标准差;
    4. +
    5. 重复计算每类中使用高斯密度方程计算fi的概率;直到计算出所有预测变量(f1、f2、f3、..、fn)的概率。
    6. +
    7. 计算每个类别的可能性;
    8. +
    9. 获得最大的可能性
    10. +
    +

    支持向量机(support vector machine)

    另一种最广泛使用的最先进的机器学习技术是支持向量机(SVM)。在机器学习中,支持向量机是具有相关学习算法的监督学习模型,用于分析用于分类和回归分析的数据。除了执行线性分类之外,SVM 还可以使用所谓的核技巧有效地执行非线性分类,将其输入隐式映射到高维特征空间。它基本上是在类之间绘制边距。边距的绘制方式使得边距与类别之间的距离最大,从而最大限度地减少分类误差。

    +

    SVM

    +

    伪代码如下:

    +
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    初始化 Yi = YI for i ⋹ I 
    重复
    计算具有估算标签的数据集的 svm 解决方案 vv , b
    计算正袋中所有 xi 的输出 ii = (vv , xi) + b
    对每个 i e i 设置 yi = sgn(fi),yi = 1
    对于(每个正bag bi)结束
    if (liei(l + yi)/2 == 0)
    计算 i* = arg maxiei ii
    set yi* = 1
    end
    while (imputed labels have changed)
    output (vv, b)
    + +

    主成分分析(Principal Component Analysis)

    主成分分析是一种统计过程,它使用正交变换将一组可能相关变量的观测值转换为一组称为主成分的线性不相关变量的值。在这种情况下,数据的维度被减少,使得计算更快更容易。它用于通过线性组合来解释一组变量的方差-协方差结构。它经常被用作降维技术。

    +

    PCA

    +

    K 均值聚类(k-means)

    +

    K-means 是解决众所周知的聚类问题的最简单的无监督学习算法之一。该过程遵循一种简单易行的方法,通过一定数量的聚类对给定数据集进行分类。主要思想是定义 k 个中心,每个簇一个。这些中心应该巧妙地放置,因为不同的位置会导致不同的结果。因此,更好的选择是将它们放置得尽可能远离彼此。

    +
    +

    这篇文章没有什么意义,主要是介绍,很多内容直接抄的,连字都懒得打,直接截图。

    +

    避雷Batta Mahesh,这个人的其它文章中还提到了制造永动机。

    +
    Author: SHYEE
    Link: http://example.com/2023/07/05/Machine-Learning-Algorithms-A-Review/
    Copyright Notice: All articles in this blog are licensed under CC BY-NC-SA 4.0 unless stating additionally.
    \ No newline at end of file diff --git a/2023/07/05/Machine-learning-Trends-perspectives-and-prospects/index.html b/2023/07/05/Machine-learning-Trends-perspectives-and-prospects/index.html new file mode 100644 index 0000000..b7ad085 --- /dev/null +++ b/2023/07/05/Machine-learning-Trends-perspectives-and-prospects/index.html @@ -0,0 +1,161 @@ +Machine learning Trends perspectives and prospects | SHYEE-PLASMA + + + + + + + + + +

    Machine learning Trends perspectives and prospects

    Author: SHYEE
    Link: http://example.com/2023/07/05/Machine-learning-Trends-perspectives-and-prospects/
    Copyright Notice: All articles in this blog are licensed under CC BY-NC-SA 4.0 unless stating additionally.
    \ No newline at end of file diff --git "a/2023/07/06/\347\275\221\347\273\234\345\256\211\345\205\250/index.html" "b/2023/07/06/\347\275\221\347\273\234\345\256\211\345\205\250/index.html" new file mode 100644 index 0000000..4a88f7e --- /dev/null +++ "b/2023/07/06/\347\275\221\347\273\234\345\256\211\345\205\250/index.html" @@ -0,0 +1,161 @@ +网络安全 | SHYEE-PLASMA + + + + + + + + + +

    网络安全

    Author: SHYEE
    Link: http://example.com/2023/07/06/%E7%BD%91%E7%BB%9C%E5%AE%89%E5%85%A8/
    Copyright Notice: All articles in this blog are licensed under CC BY-NC-SA 4.0 unless stating additionally.
    \ No newline at end of file diff --git a/2023/07/08/A-1D-cylindrical-kinetic-wave-code-for-helicon-plasma-sources/index.html b/2023/07/08/A-1D-cylindrical-kinetic-wave-code-for-helicon-plasma-sources/index.html new file mode 100644 index 0000000..cc7fd25 --- /dev/null +++ b/2023/07/08/A-1D-cylindrical-kinetic-wave-code-for-helicon-plasma-sources/index.html @@ -0,0 +1,221 @@ +A 1D cylindrical kinetic wave code for helicon plasma sources | SHYEE-PLASMA + + + + + + + + + + + + +

    A 1D cylindrical kinetic wave code for helicon plasma sources

    摘要

    我们描述了一个一维等离子体动力学代码 UFEM,它是专门为处理圆柱形低温等离子体中的射频波激发和传播而设计的。该代码应该广泛应用于螺旋波驱动等离子体源的设计和研究,螺旋波驱动等离子体源越来越多地用于工业等离子体处理。该代码包括碰撞耗散的影响和重要的并行电子动力学,例如描述波吸收所必需的朗道阻尼。它采用电磁势方面的射频场有限元离散化,适用于螺旋波通常传播的较低混合频率范围内的波计算。已知有限拉莫尔半径效应在工业等离子体源中可以忽略不计。因此,这些被忽略,导致介电张量大大简化;特别是,避免了平衡梯度项的复杂问题。用户可以从多种标准天线类型的菜单中进行选择,以便可以轻松地执行天线优化。可以使用四种不同的圆柱系统几何形状。复杂天线近场和短波长模式的重要问题可以完全自洽地处理。我们还针对 Alfven 至较低混合频率范围的四种不同波浪条件对 UFEM 和 ISMENE 5 代码进行了基准测试。最后,我们总结了由实际天线驱动的典型螺旋等离子体源条件下的代码结果。

    +

    温等离子体介电张量

    从粒子守恒模型中带有碰撞项的线性化 Vlasov 方程开始

    +

    (1)

    +

    f 是分布函数

    +

    n 是密度

    +

    v 是碰撞频率

    +

    wc 为特定粒子(电子或离子)的回旋频率

    +

    下标1表示扰动量,0表示平衡量(f0为麦克斯韦分布)

    +

    可推导出以下形式的等离子体介电张量

    +

    (2)

    +

    VTα= (2Tα/mα)^(1/2)为粒子热速度

    +

    综上可知,在所有带电粒子中(电子和离子)wcα占电荷符号

    +

    Z是著名的等离子体色散函数

    +

    +

    (3)

    +

    这也可以通过二维化的复误差函数来表示

    +

    (4)

    +

    上述定义的等离子体色散函数满足对称性要求

    +

    (5)

    +

    由Stix在因果关系原理的基础上推导得到。

    +

    在磁流体动力学( Mhd )极限下,

    +

    (6)

    +

    而张量元素(2)化简为

    +

    (7)

    +

    在张量(2)的推导过程中做出的假设是,粒子拉莫尔半径p相对于波场变化的尺度长度较小。

    +

    (8)

    +

    而且波的频率并不接近粒子陀螺频率的谐波

    +

    (9)

    +

    通过使用介电张量的”降阶”形式可以实现显著的简化,该形式仅描述快速磁声波( FMW ),但通过FMW耗散可以适当地解释模式转换能量,从而消除了与短波长离子Bcrnstein波的数值分辨率有关的问题。

    +

    这主要是针对众多面向聚变的设备中的离子回旋共振加热(ICRH)场景,通常需要至少2D数值方案来进行适当的建模。然而,在螺旋波频率范围内,有限拉莫尔半径(FLR)效应往往并不重要。

    +

    我们在张量( 2 )中使用的碰撞频率包括电子-离子和离子-电子碰撞

    +

    (10)

    +

    (11)

    +

    (12)

    +

    (13)

    +

    +

    对于螺旋波等离子体源,我们往往还必须考虑电子-中性碰撞

    +

    由于这种情况下的等离子体通常被限制在绝缘的(玻璃)管中,电子-壁面碰撞可以在等离子体边缘提供一个显著的波耗散机制。电子与壁面的碰撞频率可以表示为

    +

    (14)

    +

    (14)式可以用公式非常精确地近似

    +

    (15)

    +

    概述了模型所描述的波型

    UFEM

    UFEM代码是在考虑了helicon等离子体源的情况下设计的。

    +

    数学模型

    方程的有限差分离散。程序ORION [37]采用了( 26 )的方法。

    +

    (26)

    +

    我们介绍了有限元数值算法的理论基础,该算法允许我们获得具有等离子体介电张量(2)的麦克斯韦方程组的无污染解。

    +

    我们最终得到如下线性系统,联立方程(34)-(37),得(4N-3)^2,15对角带矩阵(虽然有点麻烦,但我们在这里重现它,因为它是剩余分析所需要的):

    +

    (34)

    +

    +

    (35)

    +

    (36)

    +

    (37)

    +

    其中:

    +

    +

    +

    能量沉积

    半径为r的等离子体柱内的总功率沉积率Q(r)可以通过介电张量的反厄米部分表示并分裂为(m,kz)模。

    +

    (42)

    +

    文中对介电张量在不同角度求解

    +
    Author: SHYEE
    Link: http://example.com/2023/07/08/A-1D-cylindrical-kinetic-wave-code-for-helicon-plasma-sources/
    Copyright Notice: All articles in this blog are licensed under CC BY-NC-SA 4.0 unless stating additionally.
    \ No newline at end of file diff --git "a/2023/07/15/\350\256\260\344\270\200\344\270\252\347\256\200\345\215\225\347\232\204\344\272\272\350\204\270\350\257\206\345\210\253/index.html" "b/2023/07/15/\350\256\260\344\270\200\344\270\252\347\256\200\345\215\225\347\232\204\344\272\272\350\204\270\350\257\206\345\210\253/index.html" new file mode 100644 index 0000000..dab11d6 --- /dev/null +++ "b/2023/07/15/\350\256\260\344\270\200\344\270\252\347\256\200\345\215\225\347\232\204\344\272\272\350\204\270\350\257\206\345\210\253/index.html" @@ -0,0 +1,174 @@ +记一个简单的人脸识别 | SHYEE-PLASMA + + + + + + + + + + + + + + +

    记一个简单的人脸识别

    导入所需的库文件:在Python项目中,使用以下代码导入OpenCV库

    +
    1
    import cv2
    + +

    加载人脸识别模型:将预训练好的人脸识别模型(如Haar级联分类器)下载到本地并加载它

    +
    1
    face_cascade = cv2.CascadeClassifier('C:/shyee/opencv/sources/data/haarcascades/haarcascade_frontalface_default.xml')
    + +

    调用摄像头并进行实时人脸识别:使用OpenCV调用电脑摄像头,并在每个视频帧上进行人脸检测和识别。

    +
    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
    video_capture = cv2.VideoCapture(0)  # 0代表默认的摄像头设备

    while True:
    # 读取视频帧
    ret, frame = video_capture.read()

    # 将视频帧转换为灰度图像
    gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)

    # 在灰度图像上进行人脸检测
    faces = face_cascade.detectMultiScale(gray, scaleFactor=1.1, minNeighbors=5, minSize=(30, 30))

    # 在视频帧上标记出人脸
    for (x, y, w, h) in faces:
    cv2.rectangle(frame, (x, y), (x+w, y+h), (0, 255, 0), 2)

    # 显示实时视频帧
    cv2.imshow('Video', frame)

    # 按下'q'键退出循环
    if cv2.waitKey(1) & 0xFF == ord('q'):
    break

    # 释放摄像头资源
    video_capture.release()
    cv2.destroyAllWindows()
    +
    Author: SHYEE
    Link: http://example.com/2023/07/15/%E8%AE%B0%E4%B8%80%E4%B8%AA%E7%AE%80%E5%8D%95%E7%9A%84%E4%BA%BA%E8%84%B8%E8%AF%86%E5%88%AB/
    Copyright Notice: All articles in this blog are licensed under CC BY-NC-SA 4.0 unless stating additionally.
    \ No newline at end of file diff --git "a/2023/07/18/\345\255\246\344\271\240pandas-\344\273\216kaggle\344\270\212/index.html" "b/2023/07/18/\345\255\246\344\271\240pandas-\344\273\216kaggle\344\270\212/index.html" new file mode 100644 index 0000000..5fe86f0 --- /dev/null +++ "b/2023/07/18/\345\255\246\344\271\240pandas-\344\273\216kaggle\344\270\212/index.html" @@ -0,0 +1,9312 @@ +学习pandas(从kaggle上) | SHYEE-PLASMA + + + + + + + + + + + + + + +

    学习pandas(从kaggle上)

    先来个小测试

    1
    2
    3
    4
    import pandas as pd


    print("Setup complete.")
    + +
    Setup complete.
    +
    +

    1.

    In the cell below, create a DataFrame fruits that looks like this:

    +

    +
    1
    2
    3
    # Your code goes here. Create a dataframe matching the above diagram and assign it to the variable fruits.
    fruits = pd.DataFrame({'Apples': [30], 'Bananas': [21]})
    print(fruits)
    + +
       Apples  Bananas
    +0      30       21
    +
    +

    2.

    Create a dataframe fruit_sales that matches the diagram below:

    +

    +
    1
    2
    3
    # Your code goes here. Create a dataframe matching the above diagram and assign it to the variable fruit_sales.
    fruit_sales = pd.DataFrame({'Apples': [35,41], 'Bananas': [21,34]},index= ['2017 Sales','2018 Sales'])
    print(fruit_sales)
    + +
                Apples  Bananas
    +2017 Sales      35       21
    +2018 Sales      41       34
    +
    +

    3.

    Create a variable ingredients with a Series that looks like:

    +
    1
    2
    3
    4
    5
    Flour     4 cups
    Milk 1 cup
    Eggs 2 large
    Spam 1 can
    Name: Dinner, dtype: object
    + + +
    1
    2
    ingredients = pd.Series(['4 cups','1 cup', '2 large', '1 can'],index=['Flour','Milk','Eggs','Spam'],name='Dinner',dtype=object)
    ingredients
    + + + + +
    Flour     4 cups
    +Milk       1 cup
    +Eggs     2 large
    +Spam       1 can
    +Name: Dinner, dtype: object
    +
    +

    4.

    Read the following csv dataset of wine reviews into a DataFrame called reviews:

    +

    +

    The filepath to the csv file is ../input/wine-reviews/winemag-data_first150k.csv. The first few lines look like:

    +
    1
    2
    3
    ,country,description,designation,points,price,province,region_1,region_2,variety,winery
    0,US,"This tremendous 100% varietal wine[...]",Martha's Vineyard,96,235.0,California,Napa Valley,Napa,Cabernet Sauvignon,Heitz
    1,Spain,"Ripe aromas of fig, blackberry and[...]",Carodorum Selección Especial Reserva,96,110.0,Northern Spain,Toro,,Tinta de Toro,Bodega Carmen Rodríguez
    + + +
    1
    reviews = pd.read_csv('../input/wine-reviews/winemag-data_first150k.csv',index_col=0)
    + +

    reviews = pd.read_csv(‘../input/wine-reviews/winemag-data_first150k.csv’,index_col=0)

    +
    1
    2
    animals = pd.DataFrame({'Cows': [12, 20], 'Goats': [22, 19]}, index=['Year 1', 'Year 2'])
    animals
    + + + + +
    +

    + + + + + + + + + + + + + + + + + + + + +
    CowsGoats
    Year 11222
    Year 22019
    +
    + + + +

    In the cell below, write code to save this DataFrame to disk as a csv file with the name cows_and_goats.csv.

    +
    1
    animals.to_csv('cows_and_goats.csv')
    + + +
    1
    2
    reviews = pd.read_csv("datasets/wine/winemag-data-130k-v2.csv", index_col=0)
    reviews
    + + + + +
    +

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    countrydescriptiondesignationpointspriceprovinceregion_1region_2taster_nametaster_twitter_handletitlevarietywinery
    0ItalyAromas include tropical fruit, broom, brimston...Vulkà Bianco87NaNSicily & SardiniaEtnaNaNKerin O’Keefe@kerinokeefeNicosia 2013 Vulkà Bianco (Etna)White BlendNicosia
    1PortugalThis is ripe and fruity, a wine that is smooth...Avidagos8715.0DouroNaNNaNRoger Voss@vossrogerQuinta dos Avidagos 2011 Avidagos Red (Douro)Portuguese RedQuinta dos Avidagos
    2USTart and snappy, the flavors of lime flesh and...NaN8714.0OregonWillamette ValleyWillamette ValleyPaul Gregutt@paulgwineRainstorm 2013 Pinot Gris (Willamette Valley)Pinot GrisRainstorm
    3USPineapple rind, lemon pith and orange blossom ...Reserve Late Harvest8713.0MichiganLake Michigan ShoreNaNAlexander PeartreeNaNSt. Julian 2013 Reserve Late Harvest Riesling ...RieslingSt. Julian
    4USMuch like the regular bottling from 2012, this...Vintner's Reserve Wild Child Block8765.0OregonWillamette ValleyWillamette ValleyPaul Gregutt@paulgwineSweet Cheeks 2012 Vintner's Reserve Wild Child...Pinot NoirSweet Cheeks
    ..........................................
    129966GermanyNotes of honeysuckle and cantaloupe sweeten th...Brauneberger Juffer-Sonnenuhr Spätlese9028.0MoselNaNNaNAnna Lee C. IijimaNaNDr. H. Thanisch (Erben Müller-Burggraef) 2013 ...RieslingDr. H. Thanisch (Erben Müller-Burggraef)
    129967USCitation is given as much as a decade of bottl...NaN9075.0OregonOregonOregon OtherPaul Gregutt@paulgwineCitation 2004 Pinot Noir (Oregon)Pinot NoirCitation
    129968FranceWell-drained gravel soil gives this wine its c...Kritt9030.0AlsaceAlsaceNaNRoger Voss@vossrogerDomaine Gresser 2013 Kritt Gewurztraminer (Als...GewürztraminerDomaine Gresser
    129969FranceA dry style of Pinot Gris, this is crisp with ...NaN9032.0AlsaceAlsaceNaNRoger Voss@vossrogerDomaine Marcel Deiss 2012 Pinot Gris (Alsace)Pinot GrisDomaine Marcel Deiss
    129970FranceBig, rich and off-dry, this is powered by inte...Lieu-dit Harth Cuvée Caroline9021.0AlsaceAlsaceNaNRoger Voss@vossrogerDomaine Schoffit 2012 Lieu-dit Harth Cuvée Car...GewürztraminerDomaine Schoffit
    +

    129971 rows × 13 columns

    +
    + + + +

    我们将数据当对象来访问

    +
    1
    reviews.country
    + + + + +
    0            Italy
    +1         Portugal
    +2               US
    +3               US
    +4               US
    +            ...   
    +129966     Germany
    +129967          US
    +129968      France
    +129969      France
    +129970      France
    +Name: country, Length: 129971, dtype: object
    +
    +

    如果我们有一个 Python 字典,我们可以使用索引 ([]) 运算符访问它的值。我们可以对 DataFrame 中的列执行相同的操作:

    +
    1
    reviews['country']
    + + + + +
    0            Italy
    +1         Portugal
    +2               US
    +3               US
    +4               US
    +            ...   
    +129966     Germany
    +129967          US
    +129968      France
    +129969      France
    +129970      France
    +Name: country, Length: 129971, dtype: object
    +
    +

    这是从 DataFrame 中选择特定 Series 的两种方法。这两种方法在语法上都不太有效,但索引操作符[]的优点是可以处理列名中的保留字符(例如,如果我们有一个country providence列,reviews.country providence就不起作用)。

    +

    pandas 系列看起来不像一本精美的dictionary吗?几乎是这样,所以毫不奇怪,要深入到单个特定值,我们只需要再次使用索引运算符 [] :

    +
    1
    reviews['country'][0]
    + + + + +
    'Italy'
    +
    +

    Indexing in pandas

    索引运算符和属性选择很好,因为它们就像在 Python 生态系统的其它部分一样工作。作为新手,这使得它们很容易上手和使用。然而,pandas有自己的访问操作符,loc和iloc。对于更高级的操作,你应该使用它们。

    +

    Index-based selection

    Pandas 索引以两种范式之一工作。第一种是基于索引的选择:根据数据在数据中的数字位置来选择数据。iloc遵循这一范例。

    +

    要选择 DataFrame 中的第一行数据,我们可以使用以下命令:

    +
    1
    reviews.iloc[0]
    + + + + +
    country                                                              Italy
    +description              Aromas include tropical fruit, broom, brimston...
    +designation                                                   Vulkà Bianco
    +points                                                                  87
    +price                                                                  NaN
    +province                                                 Sicily & Sardinia
    +region_1                                                              Etna
    +region_2                                                               NaN
    +taster_name                                                  Kerin O’Keefe
    +taster_twitter_handle                                         @kerinokeefe
    +title                                    Nicosia 2013 Vulkà Bianco  (Etna)
    +variety                                                        White Blend
    +winery                                                             Nicosia
    +Name: 0, dtype: object
    +
    +

    loc 和 iloc 都是行第一、列第二。这与我们在原生 Python 中所做的相反,即列在前,行在后。

    +

    这意味着检索行稍微容易一些,而检索列稍微困难一些。要使用 iloc 获取列,我们可以执行以下操作:

    +
    1
    reviews.iloc[:, 0]
    + + + + +
    0            Italy
    +1         Portugal
    +2               US
    +3               US
    +4               US
    +            ...   
    +129966     Germany
    +129967          US
    +129968      France
    +129969      France
    +129970      France
    +Name: country, Length: 129971, dtype: object
    +
    +

    就其本身而言,:操作符(也来自本地Python)表示 “一切”。然而,当与其他选择器组合时,它可以用来表示值的范围。例如,要从第一、第二和第三行中选择country列,我们可以这样做

    +
    1
    reviews.iloc[:3, 0]
    + + + + +
    0       Italy
    +1    Portugal
    +2          US
    +Name: country, dtype: object
    +
    +
    1
    reviews.iloc[999:-99999, 0]
    + + + + +
    999             US
    +1000            US
    +1001         Italy
    +1002            US
    +1003        France
    +           ...    
    +29967       France
    +29968           US
    +29969    Argentina
    +29970           US
    +29971           US
    +Name: country, Length: 28973, dtype: object
    +
    +

    It’s also possible to pass a list:

    +
    1
    reviews.iloc[[0, 1, 2], 0]
    + + + + +
    0       Italy
    +1    Portugal
    +2          US
    +Name: country, dtype: object
    +
    +

    最后,值得注意的是,负数可以用于选择。这将从数值的末尾开始向前计数。例如,这里是数据集的最后五个元素。

    +
    1
    reviews.iloc[-5:]
    + + + + +
    +

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    countrydescriptiondesignationpointspriceprovinceregion_1region_2taster_nametaster_twitter_handletitlevarietywinery
    129966GermanyNotes of honeysuckle and cantaloupe sweeten th...Brauneberger Juffer-Sonnenuhr Spätlese9028.0MoselNaNNaNAnna Lee C. IijimaNaNDr. H. Thanisch (Erben Müller-Burggraef) 2013 ...RieslingDr. H. Thanisch (Erben Müller-Burggraef)
    129967USCitation is given as much as a decade of bottl...NaN9075.0OregonOregonOregon OtherPaul Gregutt@paulgwineCitation 2004 Pinot Noir (Oregon)Pinot NoirCitation
    129968FranceWell-drained gravel soil gives this wine its c...Kritt9030.0AlsaceAlsaceNaNRoger Voss@vossrogerDomaine Gresser 2013 Kritt Gewurztraminer (Als...GewürztraminerDomaine Gresser
    129969FranceA dry style of Pinot Gris, this is crisp with ...NaN9032.0AlsaceAlsaceNaNRoger Voss@vossrogerDomaine Marcel Deiss 2012 Pinot Gris (Alsace)Pinot GrisDomaine Marcel Deiss
    129970FranceBig, rich and off-dry, this is powered by inte...Lieu-dit Harth Cuvée Caroline9021.0AlsaceAlsaceNaNRoger Voss@vossrogerDomaine Schoffit 2012 Lieu-dit Harth Cuvée Car...GewürztraminerDomaine Schoffit
    +
    + + + +

    Label-based selection

    属性选择的第二种模式是loc操作符所遵循的模式:基于标签的选择。在这种模式下,重要的是数据索引值,而不是它的位置。

    +

    例如,要获得reviews中的第一个条目,我们现在要做如下操作:

    +
    1
    reviews.loc[0, 'country']
    + + + + +
    'Italy'
    +
    +

    iloc在概念上比loc简单,因为它忽略了数据集的索引。当我们使用 iloc 时,我们把数据集当作一个大矩阵(一个列表的列表),一个我们必须按位置进行索引的矩阵。由于您的数据集通常具有有意义的索引,因此使用loc通常会更容易。例如,这里有一个使用loc更容易的操作:

    +
    1
    reviews.loc[:, ['taster_name', 'taster_twitter_handle', 'points']]
    + + + + +
    +

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    taster_nametaster_twitter_handlepoints
    0Kerin O’Keefe@kerinokeefe87
    1Roger Voss@vossroger87
    2Paul Gregutt@paulgwine87
    3Alexander PeartreeNaN87
    4Paul Gregutt@paulgwine87
    ............
    129966Anna Lee C. IijimaNaN90
    129967Paul Gregutt@paulgwine90
    129968Roger Voss@vossroger90
    129969Roger Voss@vossroger90
    129970Roger Voss@vossroger90
    +

    129971 rows × 3 columns

    +
    + + + +

    Choosing between loc and iloc

    在 loc 和 iloc 之间选择或转换时,有一个 “小问题 “值得注意,那就是这两种方法使用的索引方案略有不同。

    +

    iloc 使用 Python stdlib 索引方案,其中包含范围的第一个元素,而排除最后一个元素。因此,0:10 将选择条目 0,……9。而loc包含最后一个元素,因此0:10将选择0,…,10。

    +

    为什么会有这样的变化?请记住,loc可以索引任何stdlib类型:例如字符串。如果我们有一个索引值为 Apples, …, Potatoes, … 的 DataFrame,并且我们想选择 “所有按字母顺序排列的苹果和土豆之间的水果选择”,那么索引 df.loc[‘Apples’:’Potatoes’] 要比索引 df.loc[‘Apples’, ‘Potatoet’] 这样的东西方便得多 (t 在字母表的 s 后面)。

    +

    当DataFrame索引是一个简单的数字列表(例如0,…,1000)时,这种情况尤其令人困惑。在这种情况下,df.iloc[0:1000]将返回1000个条目,而df.loc[0:1000]将返回1001个条目!要使用 loc 得到 1000 个元素,您需要再低一级,请求 df.loc[0:999]。

    +

    否则,使用loc的语义和使用iloc的语义是一样的。

    +

    Manipulating the index

    基于标签的选择功能来自索引中的标签。重要的是,我们使用的索引并非一成不变。我们可以以任何我们认为合适的方式操作索引。

    +

    我们可以使用set_index()方法来完成这项工作。下面是当我们将set_index设置为title字段时发生的情况:

    +
    1
    reviews.set_index("title")
    + + + + +
    +

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    countrydescriptiondesignationpointspriceprovinceregion_1region_2taster_nametaster_twitter_handlevarietywinery
    title
    Nicosia 2013 Vulkà Bianco (Etna)ItalyAromas include tropical fruit, broom, brimston...Vulkà Bianco87NaNSicily & SardiniaEtnaNaNKerin O’Keefe@kerinokeefeWhite BlendNicosia
    Quinta dos Avidagos 2011 Avidagos Red (Douro)PortugalThis is ripe and fruity, a wine that is smooth...Avidagos8715.0DouroNaNNaNRoger Voss@vossrogerPortuguese RedQuinta dos Avidagos
    Rainstorm 2013 Pinot Gris (Willamette Valley)USTart and snappy, the flavors of lime flesh and...NaN8714.0OregonWillamette ValleyWillamette ValleyPaul Gregutt@paulgwinePinot GrisRainstorm
    St. Julian 2013 Reserve Late Harvest Riesling (Lake Michigan Shore)USPineapple rind, lemon pith and orange blossom ...Reserve Late Harvest8713.0MichiganLake Michigan ShoreNaNAlexander PeartreeNaNRieslingSt. Julian
    Sweet Cheeks 2012 Vintner's Reserve Wild Child Block Pinot Noir (Willamette Valley)USMuch like the regular bottling from 2012, this...Vintner's Reserve Wild Child Block8765.0OregonWillamette ValleyWillamette ValleyPaul Gregutt@paulgwinePinot NoirSweet Cheeks
    .......................................
    Dr. H. Thanisch (Erben Müller-Burggraef) 2013 Brauneberger Juffer-Sonnenuhr Spätlese Riesling (Mosel)GermanyNotes of honeysuckle and cantaloupe sweeten th...Brauneberger Juffer-Sonnenuhr Spätlese9028.0MoselNaNNaNAnna Lee C. IijimaNaNRieslingDr. H. Thanisch (Erben Müller-Burggraef)
    Citation 2004 Pinot Noir (Oregon)USCitation is given as much as a decade of bottl...NaN9075.0OregonOregonOregon OtherPaul Gregutt@paulgwinePinot NoirCitation
    Domaine Gresser 2013 Kritt Gewurztraminer (Alsace)FranceWell-drained gravel soil gives this wine its c...Kritt9030.0AlsaceAlsaceNaNRoger Voss@vossrogerGewürztraminerDomaine Gresser
    Domaine Marcel Deiss 2012 Pinot Gris (Alsace)FranceA dry style of Pinot Gris, this is crisp with ...NaN9032.0AlsaceAlsaceNaNRoger Voss@vossrogerPinot GrisDomaine Marcel Deiss
    Domaine Schoffit 2012 Lieu-dit Harth Cuvée Caroline Gewurztraminer (Alsace)FranceBig, rich and off-dry, this is powered by inte...Lieu-dit Harth Cuvée Caroline9021.0AlsaceAlsaceNaNRoger Voss@vossrogerGewürztraminerDomaine Schoffit
    +

    129971 rows × 12 columns

    +
    + + + +

    如果您可以为数据集找到一个比当前索引更好的索引,那么这将非常有用。

    +

    Conditional selection

    到目前为止,我们已经使用 DataFrame 本身的结构属性对各种数据进行索引。然而,为了利用数据做有趣的事情,我们经常需要根据条件提出问题。

    +

    例如,假设我们对意大利生产的优于平均水平的葡萄酒特别感兴趣。

    +

    我们可以首先检查每种葡萄酒是否是意大利的:

    +
    1
    reviews.country == 'Italy'
    + + + + +
    0          True
    +1         False
    +2         False
    +3         False
    +4         False
    +          ...  
    +129966    False
    +129967    False
    +129968    False
    +129969    False
    +129970    False
    +Name: country, Length: 129971, dtype: bool
    +
    +

    此操作根据每条记录的国家/地区生成一系列 True/False 布尔值。然后可以在 loc 内部使用此结果来选择相关数据:

    +
    1
    reviews.loc[reviews.country == 'Italy']
    + + + + +
    +

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    countrydescriptiondesignationpointspriceprovinceregion_1region_2taster_nametaster_twitter_handletitlevarietywinery
    0ItalyAromas include tropical fruit, broom, brimston...Vulkà Bianco87NaNSicily & SardiniaEtnaNaNKerin O’Keefe@kerinokeefeNicosia 2013 Vulkà Bianco (Etna)White BlendNicosia
    6ItalyHere's a bright, informal red that opens with ...Belsito8716.0Sicily & SardiniaVittoriaNaNKerin O’Keefe@kerinokeefeTerre di Giurfo 2013 Belsito Frappato (Vittoria)FrappatoTerre di Giurfo
    13ItalyThis is dominated by oak and oak-driven aromas...Rosso87NaNSicily & SardiniaEtnaNaNKerin O’Keefe@kerinokeefeMasseria Setteporte 2012 Rosso (Etna)Nerello MascaleseMasseria Setteporte
    22ItalyDelicate aromas recall white flower and citrus...Ficiligno8719.0Sicily & SardiniaSiciliaNaNKerin O’Keefe@kerinokeefeBaglio di Pianetto 2007 Ficiligno White (Sicilia)White BlendBaglio di Pianetto
    24ItalyAromas of prune, blackcurrant, toast and oak c...Aynat8735.0Sicily & SardiniaSiciliaNaNKerin O’Keefe@kerinokeefeCanicattì 2009 Aynat Nero d'Avola (Sicilia)Nero d'AvolaCanicattì
    ..........................................
    129929ItalyThis luminous sparkler has a sweet, fruit-forw...NaN9138.0VenetoProsecco Superiore di CartizzeNaNNaNNaNCol Vetoraz Spumanti NV Prosecco Superiore di...ProseccoCol Vetoraz Spumanti
    129943ItalyA blend of Nero d'Avola and Syrah, this convey...Adènzia9029.0Sicily & SardiniaSiciliaNaNKerin O’Keefe@kerinokeefeBaglio del Cristo di Campobello 2012 Adènzia R...Red BlendBaglio del Cristo di Campobello
    129947ItalyA blend of 65% Cabernet Sauvignon, 30% Merlot ...Symposio9020.0Sicily & SardiniaTerre SicilianeNaNKerin O’Keefe@kerinokeefeFeudo Principi di Butera 2012 Symposio Red (Te...Red BlendFeudo Principi di Butera
    129961ItalyIntense aromas of wild cherry, baking spice, t...NaN9030.0Sicily & SardiniaSiciliaNaNKerin O’Keefe@kerinokeefeCOS 2013 Frappato (Sicilia)FrappatoCOS
    129962ItalyBlackberry, cassis, grilled herb and toasted a...Sàgana Tenuta San Giacomo9040.0Sicily & SardiniaSiciliaNaNKerin O’Keefe@kerinokeefeCusumano 2012 Sàgana Tenuta San Giacomo Nero d...Nero d'AvolaCusumano
    +

    19540 rows × 13 columns

    +
    + + + +

    该DataFrame有~20,000行。原来的数据约为130,000行。这意味着大约15%的葡萄酒来自意大利。

    +

    我们还想知道哪些葡萄酒比平均水平好。葡萄酒的评价标准为80-100分,因此这可能意味着至少获得90分的葡萄酒。

    +

    我们可以用”&”将这两个问题联系起来:

    +
    1
    reviews.loc[(reviews.country == 'Italy') & (reviews.points >= 90)]
    + + + + +
    +

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    countrydescriptiondesignationpointspriceprovinceregion_1region_2taster_nametaster_twitter_handletitlevarietywinery
    120ItalySlightly backward, particularly given the vint...Bricco Rocche Prapó9270.0PiedmontBaroloNaNNaNNaNCeretto 2003 Bricco Rocche Prapó (Barolo)NebbioloCeretto
    130ItalyAt the first it was quite muted and subdued, b...Bricco Rocche Brunate9170.0PiedmontBaroloNaNNaNNaNCeretto 2003 Bricco Rocche Brunate (Barolo)NebbioloCeretto
    133ItalyEinaudi's wines have been improving lately, an...NaN9168.0PiedmontBaroloNaNNaNNaNPoderi Luigi Einaudi 2003 BaroloNebbioloPoderi Luigi Einaudi
    135ItalyThe color is just beginning to show signs of b...Sorano9160.0PiedmontBaroloNaNNaNNaNGiacomo Ascheri 2001 Sorano (Barolo)NebbioloGiacomo Ascheri
    140ItalyA big, fat, luscious wine with plenty of toast...Costa Bruna9026.0PiedmontBarbera d'AlbaNaNNaNNaNPoderi Colla 2005 Costa Bruna (Barbera d'Alba)BarberaPoderi Colla
    ..........................................
    129929ItalyThis luminous sparkler has a sweet, fruit-forw...NaN9138.0VenetoProsecco Superiore di CartizzeNaNNaNNaNCol Vetoraz Spumanti NV Prosecco Superiore di...ProseccoCol Vetoraz Spumanti
    129943ItalyA blend of Nero d'Avola and Syrah, this convey...Adènzia9029.0Sicily & SardiniaSiciliaNaNKerin O’Keefe@kerinokeefeBaglio del Cristo di Campobello 2012 Adènzia R...Red BlendBaglio del Cristo di Campobello
    129947ItalyA blend of 65% Cabernet Sauvignon, 30% Merlot ...Symposio9020.0Sicily & SardiniaTerre SicilianeNaNKerin O’Keefe@kerinokeefeFeudo Principi di Butera 2012 Symposio Red (Te...Red BlendFeudo Principi di Butera
    129961ItalyIntense aromas of wild cherry, baking spice, t...NaN9030.0Sicily & SardiniaSiciliaNaNKerin O’Keefe@kerinokeefeCOS 2013 Frappato (Sicilia)FrappatoCOS
    129962ItalyBlackberry, cassis, grilled herb and toasted a...Sàgana Tenuta San Giacomo9040.0Sicily & SardiniaSiciliaNaNKerin O’Keefe@kerinokeefeCusumano 2012 Sàgana Tenuta San Giacomo Nero d...Nero d'AvolaCusumano
    +

    6648 rows × 13 columns

    +
    + + + +

    Pandas内置了一些条件选择器,我们在此重点介绍其中的两个。

    +

    第一个是 “isin”。”isin “让您选择其值 “位于 “一个值列表中的数据。例如,我们可以用它来选择仅来自意大利或法国的葡萄酒:

    +
    1
    reviews.loc[reviews.country.isin(['Italy', 'France'])]
    + + + + +
    +

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    countrydescriptiondesignationpointspriceprovinceregion_1region_2taster_nametaster_twitter_handletitlevarietywinery
    0ItalyAromas include tropical fruit, broom, brimston...Vulkà Bianco87NaNSicily & SardiniaEtnaNaNKerin O’Keefe@kerinokeefeNicosia 2013 Vulkà Bianco (Etna)White BlendNicosia
    6ItalyHere's a bright, informal red that opens with ...Belsito8716.0Sicily & SardiniaVittoriaNaNKerin O’Keefe@kerinokeefeTerre di Giurfo 2013 Belsito Frappato (Vittoria)FrappatoTerre di Giurfo
    7FranceThis dry and restrained wine offers spice in p...NaN8724.0AlsaceAlsaceNaNRoger Voss@vossrogerTrimbach 2012 Gewurztraminer (Alsace)GewürztraminerTrimbach
    9FranceThis has great depth of flavor with its fresh ...Les Natures8727.0AlsaceAlsaceNaNRoger Voss@vossrogerJean-Baptiste Adam 2012 Les Natures Pinot Gris...Pinot GrisJean-Baptiste Adam
    11FranceThis is a dry wine, very spicy, with a tight, ...NaN8730.0AlsaceAlsaceNaNRoger Voss@vossrogerLeon Beyer 2012 Gewurztraminer (Alsace)GewürztraminerLeon Beyer
    ..........................................
    129964FranceInitially quite muted, this wine slowly develo...Domaine Saint-Rémy Herrenweg90NaNAlsaceAlsaceNaNRoger Voss@vossrogerDomaine Ehrhart 2013 Domaine Saint-Rémy Herren...GewürztraminerDomaine Ehrhart
    129965FranceWhile it's rich, this beautiful dry wine also ...Seppi Landmann Vallée Noble9028.0AlsaceAlsaceNaNRoger Voss@vossrogerDomaine Rieflé-Landmann 2013 Seppi Landmann Va...Pinot GrisDomaine Rieflé-Landmann
    129968FranceWell-drained gravel soil gives this wine its c...Kritt9030.0AlsaceAlsaceNaNRoger Voss@vossrogerDomaine Gresser 2013 Kritt Gewurztraminer (Als...GewürztraminerDomaine Gresser
    129969FranceA dry style of Pinot Gris, this is crisp with ...NaN9032.0AlsaceAlsaceNaNRoger Voss@vossrogerDomaine Marcel Deiss 2012 Pinot Gris (Alsace)Pinot GrisDomaine Marcel Deiss
    129970FranceBig, rich and off-dry, this is powered by inte...Lieu-dit Harth Cuvée Caroline9021.0AlsaceAlsaceNaNRoger Voss@vossrogerDomaine Schoffit 2012 Lieu-dit Harth Cuvée Car...GewürztraminerDomaine Schoffit
    +

    41633 rows × 13 columns

    +
    + + + +

    第二个是 isnull (及其同伴 notnull)。这些方法可让您突出显示空(或非空)(NaN) 的值。例如,要过滤掉数据集中缺少价格标签的葡萄酒,我们将执行以下操作:

    +
    1
    reviews.loc[reviews.price.notnull()]
    + + + + +
    +

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    countrydescriptiondesignationpointspriceprovinceregion_1region_2taster_nametaster_twitter_handletitlevarietywinery
    1PortugalThis is ripe and fruity, a wine that is smooth...Avidagos8715.0DouroNaNNaNRoger Voss@vossrogerQuinta dos Avidagos 2011 Avidagos Red (Douro)Portuguese RedQuinta dos Avidagos
    2USTart and snappy, the flavors of lime flesh and...NaN8714.0OregonWillamette ValleyWillamette ValleyPaul Gregutt@paulgwineRainstorm 2013 Pinot Gris (Willamette Valley)Pinot GrisRainstorm
    3USPineapple rind, lemon pith and orange blossom ...Reserve Late Harvest8713.0MichiganLake Michigan ShoreNaNAlexander PeartreeNaNSt. Julian 2013 Reserve Late Harvest Riesling ...RieslingSt. Julian
    4USMuch like the regular bottling from 2012, this...Vintner's Reserve Wild Child Block8765.0OregonWillamette ValleyWillamette ValleyPaul Gregutt@paulgwineSweet Cheeks 2012 Vintner's Reserve Wild Child...Pinot NoirSweet Cheeks
    5SpainBlackberry and raspberry aromas show a typical...Ars In Vitro8715.0Northern SpainNavarraNaNMichael Schachner@wineschachTandem 2011 Ars In Vitro Tempranillo-Merlot (N...Tempranillo-MerlotTandem
    ..........................................
    129966GermanyNotes of honeysuckle and cantaloupe sweeten th...Brauneberger Juffer-Sonnenuhr Spätlese9028.0MoselNaNNaNAnna Lee C. IijimaNaNDr. H. Thanisch (Erben Müller-Burggraef) 2013 ...RieslingDr. H. Thanisch (Erben Müller-Burggraef)
    129967USCitation is given as much as a decade of bottl...NaN9075.0OregonOregonOregon OtherPaul Gregutt@paulgwineCitation 2004 Pinot Noir (Oregon)Pinot NoirCitation
    129968FranceWell-drained gravel soil gives this wine its c...Kritt9030.0AlsaceAlsaceNaNRoger Voss@vossrogerDomaine Gresser 2013 Kritt Gewurztraminer (Als...GewürztraminerDomaine Gresser
    129969FranceA dry style of Pinot Gris, this is crisp with ...NaN9032.0AlsaceAlsaceNaNRoger Voss@vossrogerDomaine Marcel Deiss 2012 Pinot Gris (Alsace)Pinot GrisDomaine Marcel Deiss
    129970FranceBig, rich and off-dry, this is powered by inte...Lieu-dit Harth Cuvée Caroline9021.0AlsaceAlsaceNaNRoger Voss@vossrogerDomaine Schoffit 2012 Lieu-dit Harth Cuvée Car...GewürztraminerDomaine Schoffit
    +

    120975 rows × 13 columns

    +
    + + + +

    分配数据

    另一方面,将数据分配给 DataFrame 很容易。可以分配一个常量值:

    +
    1
    2
    reviews['critic'] = 'everyone'
    reviews['critic']
    + + + + +
    0         everyone
    +1         everyone
    +2         everyone
    +3         everyone
    +4         everyone
    +            ...   
    +129966    everyone
    +129967    everyone
    +129968    everyone
    +129969    everyone
    +129970    everyone
    +Name: critic, Length: 129971, dtype: object
    +
    +

    或者使用可迭代的值:

    +
    1
    2
    reviews['index_backwards'] = range(len(reviews), 0, -1)
    reviews['index_backwards']
    + + + + +
    0         129971
    +1         129970
    +2         129969
    +3         129968
    +4         129967
    +           ...  
    +129966         5
    +129967         4
    +129968         3
    +129969         2
    +129970         1
    +Name: index_backwards, Length: 129971, dtype: int64
    +
    +

    TEST

    1
    reviews = pd.read_csv("datasets/wine/winemag-data-130k-v2.csv", index_col=0)
    + + +
    1
    reviews.head()
    + + + + +
    +

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    countrydescriptiondesignationpointspriceprovinceregion_1region_2taster_nametaster_twitter_handletitlevarietywinery
    0ItalyAromas include tropical fruit, broom, brimston...Vulkà Bianco87NaNSicily & SardiniaEtnaNaNKerin O’Keefe@kerinokeefeNicosia 2013 Vulkà Bianco (Etna)White BlendNicosia
    1PortugalThis is ripe and fruity, a wine that is smooth...Avidagos8715.0DouroNaNNaNRoger Voss@vossrogerQuinta dos Avidagos 2011 Avidagos Red (Douro)Portuguese RedQuinta dos Avidagos
    2USTart and snappy, the flavors of lime flesh and...NaN8714.0OregonWillamette ValleyWillamette ValleyPaul Gregutt@paulgwineRainstorm 2013 Pinot Gris (Willamette Valley)Pinot GrisRainstorm
    3USPineapple rind, lemon pith and orange blossom ...Reserve Late Harvest8713.0MichiganLake Michigan ShoreNaNAlexander PeartreeNaNSt. Julian 2013 Reserve Late Harvest Riesling ...RieslingSt. Julian
    4USMuch like the regular bottling from 2012, this...Vintner's Reserve Wild Child Block8765.0OregonWillamette ValleyWillamette ValleyPaul Gregutt@paulgwineSweet Cheeks 2012 Vintner's Reserve Wild Child...Pinot NoirSweet Cheeks
    +
    + + + +

    1.从description中选择描述列,并将结果分配给变量 desc。

    +
    1
    2
    desc = reviews['description']
    desc
    + + + + +
    0         Aromas include tropical fruit, broom, brimston...
    +1         This is ripe and fruity, a wine that is smooth...
    +2         Tart and snappy, the flavors of lime flesh and...
    +3         Pineapple rind, lemon pith and orange blossom ...
    +4         Much like the regular bottling from 2012, this...
    +                                ...                        
    +129966    Notes of honeysuckle and cantaloupe sweeten th...
    +129967    Citation is given as much as a decade of bottl...
    +129968    Well-drained gravel soil gives this wine its c...
    +129969    A dry style of Pinot Gris, this is crisp with ...
    +129970    Big, rich and off-dry, this is powered by inte...
    +Name: description, Length: 129971, dtype: object
    +
    +

    2.从评论的描述列中选择第一个值,将其分配给变量first_description。

    +
    1
    2
    first_description = desc[0]
    first_description
    + + + + +
    "Aromas include tropical fruit, broom, brimstone and dried herb. The palate isn't overly expressive, offering unripened apple, citrus and dried sage alongside brisk acidity."
    +
    +

    3.从reviews中选择第一行数据(第一条记录),并将其分配给变量first_row。

    +
    1
    2
    first_row = reviews.loc[0]
    first_row
    + + + + +
    country                                                              Italy
    +description              Aromas include tropical fruit, broom, brimston...
    +designation                                                   Vulkà Bianco
    +points                                                                  87
    +price                                                                  NaN
    +province                                                 Sicily & Sardinia
    +region_1                                                              Etna
    +region_2                                                               NaN
    +taster_name                                                  Kerin O’Keefe
    +taster_twitter_handle                                         @kerinokeefe
    +title                                    Nicosia 2013 Vulkà Bianco  (Etna)
    +variety                                                        White Blend
    +winery                                                             Nicosia
    +Name: 0, dtype: object
    +
    +

    4.从评论中的描述列中选择前 10 个值,将结果分配给变量first_descriptions。

    +

    提示:将输出格式化为 pandas 系列。

    +
    1
    2
    first_descriptions = reviews['description'].loc[0:9]
    first_descriptions
    + + + + +
    0    Aromas include tropical fruit, broom, brimston...
    +1    This is ripe and fruity, a wine that is smooth...
    +2    Tart and snappy, the flavors of lime flesh and...
    +3    Pineapple rind, lemon pith and orange blossom ...
    +4    Much like the regular bottling from 2012, this...
    +5    Blackberry and raspberry aromas show a typical...
    +6    Here's a bright, informal red that opens with ...
    +7    This dry and restrained wine offers spice in p...
    +8    Savory dried thyme notes accent sunnier flavor...
    +9    This has great depth of flavor with its fresh ...
    +Name: description, dtype: object
    +
    +

    5.Select the records with index labels 1, 2, 3, 5, and 8, assigning the result to the variable sample_reviews.

    +

    In other words, generate the following DataFrame:

    +

    +
    1
    2
    sample_reviews = reviews.loc[[1,2,3,5,8]]
    sample_reviews
    + + + + +
    +

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    countrydescriptiondesignationpointspriceprovinceregion_1region_2taster_nametaster_twitter_handletitlevarietywinery
    1PortugalThis is ripe and fruity, a wine that is smooth...Avidagos8715.0DouroNaNNaNRoger Voss@vossrogerQuinta dos Avidagos 2011 Avidagos Red (Douro)Portuguese RedQuinta dos Avidagos
    2USTart and snappy, the flavors of lime flesh and...NaN8714.0OregonWillamette ValleyWillamette ValleyPaul Gregutt@paulgwineRainstorm 2013 Pinot Gris (Willamette Valley)Pinot GrisRainstorm
    3USPineapple rind, lemon pith and orange blossom ...Reserve Late Harvest8713.0MichiganLake Michigan ShoreNaNAlexander PeartreeNaNSt. Julian 2013 Reserve Late Harvest Riesling ...RieslingSt. Julian
    5SpainBlackberry and raspberry aromas show a typical...Ars In Vitro8715.0Northern SpainNavarraNaNMichael Schachner@wineschachTandem 2011 Ars In Vitro Tempranillo-Merlot (N...Tempranillo-MerlotTandem
    8GermanySavory dried thyme notes accent sunnier flavor...Shine8712.0RheinhessenNaNNaNAnna Lee C. IijimaNaNHeinz Eifel 2013 Shine Gewürztraminer (Rheinhe...GewürztraminerHeinz Eifel
    +
    + + + +

    创建一个变量 df,其中包含索引标签为 0、1、10 和 100 的记录的 Country、Province、Region_1 和 Region_2 列。换句话说,生成以下 DataFrame:

    +

    +
    1
    2
    df = reviews[['country','province','region_1','region_2']].loc[[0,1,10,100]]
    df
    + + + + +
    +

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    countryprovinceregion_1region_2
    0ItalySicily & SardiniaEtnaNaN
    1PortugalDouroNaNNaN
    10USCaliforniaNapa ValleyNapa
    100USNew YorkFinger LakesFinger Lakes
    +
    + + + +

    7.Create a variable df containing the country and variety columns of the first 100 records.

    +

    Hint: you may use loc or iloc. When working on the answer this question and the several of the ones that follow, keep the following “gotcha” described in the tutorial:

    +
    +

    iloc uses the Python stdlib indexing scheme, where the first element of the range is included and the last one excluded.
    loc, meanwhile, indexes inclusively.

    +
    +
    +

    This is particularly confusing when the DataFrame index is a simple numerical list, e.g. 0,...,1000. In this case df.iloc[0:1000] will return 1000 entries, while df.loc[0:1000] return 1001 of them! To get 1000 elements using loc, you will need to go one lower and ask for df.iloc[0:999].

    +
    +
    1
    2
    df = reviews[['country','variety']].loc[0:99]
    df
    + + + + +
    +

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    countryvariety
    0ItalyWhite Blend
    1PortugalPortuguese Red
    2USPinot Gris
    3USRiesling
    4USPinot Noir
    .........
    95FranceGamay
    96FranceGamay
    97USRiesling
    98ItalySangiovese
    99USBordeaux-style Red Blend
    +

    100 rows × 2 columns

    +
    + + + +

    8.创建一个包含意大利葡萄酒评论的 DataFrame italian_wines。提示:reviews.country 等于什么?

    +
    1
    2
    italian_wines = reviews[reviews['country']=='Italy']
    italian_wines
    + + + + +
    +

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    countrydescriptiondesignationpointspriceprovinceregion_1region_2taster_nametaster_twitter_handletitlevarietywinery
    0ItalyAromas include tropical fruit, broom, brimston...Vulkà Bianco87NaNSicily & SardiniaEtnaNaNKerin O’Keefe@kerinokeefeNicosia 2013 Vulkà Bianco (Etna)White BlendNicosia
    6ItalyHere's a bright, informal red that opens with ...Belsito8716.0Sicily & SardiniaVittoriaNaNKerin O’Keefe@kerinokeefeTerre di Giurfo 2013 Belsito Frappato (Vittoria)FrappatoTerre di Giurfo
    13ItalyThis is dominated by oak and oak-driven aromas...Rosso87NaNSicily & SardiniaEtnaNaNKerin O’Keefe@kerinokeefeMasseria Setteporte 2012 Rosso (Etna)Nerello MascaleseMasseria Setteporte
    22ItalyDelicate aromas recall white flower and citrus...Ficiligno8719.0Sicily & SardiniaSiciliaNaNKerin O’Keefe@kerinokeefeBaglio di Pianetto 2007 Ficiligno White (Sicilia)White BlendBaglio di Pianetto
    24ItalyAromas of prune, blackcurrant, toast and oak c...Aynat8735.0Sicily & SardiniaSiciliaNaNKerin O’Keefe@kerinokeefeCanicattì 2009 Aynat Nero d'Avola (Sicilia)Nero d'AvolaCanicattì
    ..........................................
    129929ItalyThis luminous sparkler has a sweet, fruit-forw...NaN9138.0VenetoProsecco Superiore di CartizzeNaNNaNNaNCol Vetoraz Spumanti NV Prosecco Superiore di...ProseccoCol Vetoraz Spumanti
    129943ItalyA blend of Nero d'Avola and Syrah, this convey...Adènzia9029.0Sicily & SardiniaSiciliaNaNKerin O’Keefe@kerinokeefeBaglio del Cristo di Campobello 2012 Adènzia R...Red BlendBaglio del Cristo di Campobello
    129947ItalyA blend of 65% Cabernet Sauvignon, 30% Merlot ...Symposio9020.0Sicily & SardiniaTerre SicilianeNaNKerin O’Keefe@kerinokeefeFeudo Principi di Butera 2012 Symposio Red (Te...Red BlendFeudo Principi di Butera
    129961ItalyIntense aromas of wild cherry, baking spice, t...NaN9030.0Sicily & SardiniaSiciliaNaNKerin O’Keefe@kerinokeefeCOS 2013 Frappato (Sicilia)FrappatoCOS
    129962ItalyBlackberry, cassis, grilled herb and toasted a...Sàgana Tenuta San Giacomo9040.0Sicily & SardiniaSiciliaNaNKerin O’Keefe@kerinokeefeCusumano 2012 Sàgana Tenuta San Giacomo Nero d...Nero d'AvolaCusumano
    +

    19540 rows × 13 columns

    +
    + + + +

    9.创建一个 DataFrame top_oceania_wines,其中包含来自澳大利亚或新西兰的葡萄酒的至少 95 分(满分 100 分)的所有评论。

    +
    1
    2
    top_oceania_wines = reviews[reviews.country.isin(['Australia', 'New Zealand']) & (reviews.points>=95)]
    top_oceania_wines
    + + + + +
    +

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    countrydescriptiondesignationpointspriceprovinceregion_1region_2taster_nametaster_twitter_handletitlevarietywinery
    345AustraliaThis wine contains some material over 100 year...Rare100350.0VictoriaRutherglenNaNJoe Czerwinski@JoeCzChambers Rosewood Vineyards NV Rare Muscat (Ru...MuscatChambers Rosewood Vineyards
    346AustraliaThis deep brown wine smells like a damp, mossy...Rare98350.0VictoriaRutherglenNaNJoe Czerwinski@JoeCzChambers Rosewood Vineyards NV Rare Muscadelle...MuscadelleChambers Rosewood Vineyards
    348AustraliaDeep mahogany. Dried fig and black tea on the ...Grand97100.0VictoriaRutherglenNaNJoe Czerwinski@JoeCzChambers Rosewood Vineyards NV Grand Muscat (R...MuscatChambers Rosewood Vineyards
    349AustraliaRunRig is always complex, and the 2012 doesn't...RunRig97225.0South AustraliaBarossaNaNJoe Czerwinski@JoeCzTorbreck 2012 RunRig Shiraz-Viognier (Barossa)Shiraz-ViognierTorbreck
    356AustraliaDusty, firm, powerful: just a few apt descript...Georgia's Paddock9585.0VictoriaHeathcoteNaNJoe Czerwinski@JoeCzJasper Hill 2013 Georgia's Paddock Shiraz (Hea...ShirazJasper Hill
    360AustraliaBacon and tapenade elements merge easily on th...Descendant95125.0South AustraliaBarossa ValleyNaNJoe Czerwinski@JoeCzTorbreck 2012 Descendant Shiraz-Viognier (Baro...Shiraz-ViognierTorbreck
    365AustraliaThe Taylor family selected Clare Valley for it...St. Andrews Single Vineyard Release9560.0South AustraliaClare ValleyNaNJoe Czerwinski@JoeCzWakefield 2013 St. Andrews Single Vineyard Rel...ShirazWakefield
    14354AustraliaThis wine's concentrated dark fruit shows in t...Old Vine9560.0South AustraliaBarossa ValleyNaNJoe Czerwinski@JoeCzKaesler 2006 Old Vine Shiraz (Barossa Valley)ShirazKaesler
    16538AustraliaRich, dense and intense, this is a big, muscul...The Family Tree9565.0South AustraliaBarossa ValleyNaNJoe Czerwinski@JoeCzLambert 2013 The Family Tree Shiraz (Barossa V...ShirazLambert
    28573AustraliaAstralis has become one of Australia's top col...Astralis95350.0South AustraliaClarendonNaNJoe Czerwinski@JoeCzClarendon Hills 2005 Astralis Syrah (Clarendon)SyrahClarendon Hills
    34502AustraliaThis prodigious wine showcases Barossa's abili...The Relic98135.0South AustraliaBarossa ValleyNaNJoe Czerwinski@JoeCzStandish 2006 The Relic Shiraz (Barossa Valley)ShirazStandish
    34506AustraliaIf Standish's Relic is the feminine side of Sh...The Standish Single Vineyard96135.0South AustraliaBarossa ValleyNaNJoe Czerwinski@JoeCzStandish 2005 The Standish Single Vineyard Shi...ShirazStandish
    38988AustraliaPenfolds Bin 707 has leapt in quality over the...Bin 70795200.0South AustraliaSouth AustraliaNaNJoe Czerwinski@JoeCzPenfolds 2009 Bin 707 Cabernet Sauvignon (Sout...Cabernet SauvignonPenfolds
    39059AustraliaThe Taylor family selected Clare Valley for it...St. Andrews Single Vineyard Release9560.0South AustraliaClare ValleyNaNJoe Czerwinski@JoeCzWakefield 2013 St. Andrews Single Vineyard Rel...ShirazWakefield
    39961AustraliaAs unevolved as they are, the dense and multil...Grange96185.0South AustraliaSouth AustraliaNaNNaNNaNPenfolds 1996 Grange Shiraz (South Australia)ShirazPenfolds
    39962AustraliaSeamless luxury from stem to stern, this ‘baby...RWT9570.0South AustraliaBarossa ValleyNaNNaNNaNPenfolds 1998 RWT Shiraz (Barossa Valley)ShirazPenfolds
    45809AustraliaThe 2007 Astralis impresses for its combinatio...Astralis95225.0South AustraliaClarendonNaNJoe Czerwinski@JoeCzClarendon Hills 2007 Astralis Syrah (Clarendon)SyrahClarendon Hills
    56953AustraliaThis inky, embryonic wine deserves to be cella...Grange99850.0South AustraliaSouth AustraliaNaNJoe Czerwinski@JoeCzPenfolds 2010 Grange Shiraz (South Australia)ShirazPenfolds
    56956AustraliaYou may have to scour the country to secure so...Andelmonde9795.0South AustraliaBarossa ValleyNaNJoe Czerwinski@JoeCzStandish 2012 Andelmonde Shiraz (Barossa Valley)ShirazStandish
    56957AustraliaThorn Clarke has taken its Shiraz to a new lev...Ron Thorn Single Vineyard9689.0South AustraliaBarossaNaNJoe Czerwinski@JoeCzThorn Clarke 2012 Ron Thorn Single Vineyard Sh...ShirazThorn Clarke
    56959AustraliaIs this the Yin to Grange's Yang? The wines ar...Hill of Grace96820.0South AustraliaEden ValleyNaNJoe Czerwinski@JoeCzHenschke 2010 Hill of Grace Shiraz (Eden Valley)ShirazHenschke
    59977AustraliaThis is a top example of the classic Australia...The Peake96150.0South AustraliaMcLaren ValeNaNJoe Czerwinski@JoeCzHickinbotham 2013 The Peake Cabernet-Shiraz (M...Cabernet-ShirazHickinbotham
    59984AustraliaThis is a throwback to those brash, flavor-exu...One9595.0South AustraliaLanghorne CreekNaNJoe Czerwinski@JoeCzHeartland 2013 One Red (Langhorne Creek)Red BlendHeartland
    67096AustraliaJust a tiny serving of this dark nectar will l...Calliope Rare9886.0VictoriaRutherglenNaNJoe Czerwinski@JoeCzR.L. Buller & Son NV Calliope Rare Tokay (Ruth...TokayR.L. Buller & Son
    67101AustraliaThis Muscat is the color of dark coffee, with ...Rare95300.0VictoriaRutherglenNaNJoe Czerwinski@JoeCzChambers Rosewood Vineyards NV Rare Muscat (Ru...MuscatChambers Rosewood Vineyards
    76392AustraliaWhen the alcohol levels are reined in to appro...Georgia's Paddock9585.0VictoriaHeathcoteNaNJoe Czerwinski@JoeCzJasper Hill 2012 Georgia's Paddock Shiraz (Hea...ShirazJasper Hill
    77028AustraliaThis has all the size and weight you've come t...Grange98850.0South AustraliaSouth AustraliaNaNJoe Czerwinski@JoeCzPenfolds 2008 Grange Shiraz (South Australia)ShirazPenfolds
    77036AustraliaRWT (unromantically derived from “Red Wine Tri...RWT96150.0South AustraliaBarossa ValleyNaNJoe Czerwinski@JoeCzPenfolds 2009 RWT Shiraz (Barossa Valley)ShirazPenfolds
    77037AustraliaWinemaker Dave Powell is no longer with Torbre...RunRig96225.0South AustraliaBarossa ValleyNaNJoe Czerwinski@JoeCzTorbreck 2007 RunRig Shiraz-Viognier (Barossa ...Shiraz-ViognierTorbreck
    77042AustraliaThis is likely the most ageworthy Shiraz winem...Eligo95100.0South AustraliaBarossaNaNJoe Czerwinski@JoeCzJohn Duval Wines 2010 Eligo Shiraz (Barossa)ShirazJohn Duval Wines
    77044AustraliaThe fruit for this offering comes from the Gre...R Reserve95105.0South AustraliaBarossa ValleyNaNJoe Czerwinski@JoeCzKilikanoon 2009 R Reserve Shiraz (Barossa Valley)ShirazKilikanoon
    77046AustraliaWith aromas and flavors that range widely from...The Factor95125.0South AustraliaBarossa ValleyNaNJoe Czerwinski@JoeCzTorbreck 2007 The Factor Shiraz (Barossa Valley)ShirazTorbreck
    83357AustraliaA throwback to the monster Shiraz style of old...Grange96500.0South AustraliaSouth AustraliaNaNJoe Czerwinski@JoeCzPenfolds 2004 Grange Shiraz (South Australia)ShirazPenfolds
    84815AustraliaThe Factor is always one of Torbreck's biggest...The Factor95125.0South AustraliaBarossaNaNJoe Czerwinski@JoeCzTorbreck 2012 The Factor Shiraz (Barossa)ShirazTorbreck
    84816AustraliaNashwauk is Kaesler's McLaren Vale project, fi...Beacon95145.0South AustraliaMcLaren ValeNaNJoe Czerwinski@JoeCzNashwauk 2010 Beacon Shiraz (McLaren Vale)ShirazNashwauk
    87128AustraliaThis full-bodied, muscular Shiraz is built for...Amery Vineyard Block 696120.0South AustraliaMcLaren ValeNaNJoe Czerwinski@JoeCzKay Brothers 2012 Amery Vineyard Block 6 Shira...ShirazKay Brothers
    87137AustraliaPerhaps the best young wine I've tasted from M...NaN9584.0Western AustraliaMargaret RiverNaNJoe Czerwinski@JoeCzMoss Wood 2011 Cabernet Sauvignon (Margaret Ri...Cabernet SauvignonMoss Wood
    87143AustraliaThis is wonderfully complex and aromatic, with...St. Andrews Single Vineyard Release9560.0South AustraliaClare ValleyNaNJoe Czerwinski@JoeCzWakefield 2012 St. Andrews Single Vineyard Rel...ShirazWakefield
    91851New ZealandThis full-bodied, richly tannic wine delivers....Homage95100.0Hawke's BayNaNNaNJoe Czerwinski@JoeCzTrinity Hill 2013 Homage Syrah (Hawke's Bay)SyrahTrinity Hill
    98386AustraliaOne of the more approachable of the d'Arenberg...Little Venice Single Vineyard9585.0South AustraliaMcLaren ValeNaNJoe Czerwinski@JoeCzD'Arenberg 2010 Little Venice Single Vineyard ...ShirazD'Arenberg
    99318AustraliaFrom vines planted in 1912, this has been an i...Mount Edelstone Vineyard95200.0South AustraliaEden ValleyNaNJoe Czerwinski@JoeCzHenschke 2014 Mount Edelstone Vineyard Shiraz ...ShirazHenschke
    99330AustraliaThis Cabernet equivalent to Grange has explode...Bin 70795500.0South AustraliaSouth AustraliaNaNJoe Czerwinski@JoeCzPenfolds 2014 Bin 707 Cabernet Sauvignon (Sout...Cabernet SauvignonPenfolds
    99340AustraliaThis rich, opulent wine carries its massive oa...Les Amis95185.0South AustraliaBarossa ValleyNaNJoe Czerwinski@JoeCzTorbreck 2013 Les Amis Grenache (Barossa Valley)GrenacheTorbreck
    109427AustraliaThis wine is dark brown in hue with a greenish...Rare99300.0VictoriaRutherglenNaNJoe Czerwinski@JoeCzChambers Rosewood Vineyards NV Rare Muscadelle...MuscadelleChambers Rosewood Vineyards
    109434AustraliaD'Arenberg's lineup of single-vineyard Shiraze...The Swinging Malaysian Single Vineyard9685.0South AustraliaMcLaren ValeNaNJoe Czerwinski@JoeCzD'Arenberg 2010 The Swinging Malaysian Single ...ShirazD'Arenberg
    122421AustraliaDespite this wine's weight and richness, it re...Amon-Ra Unfiltered96110.0South AustraliaBarossa ValleyNaNJoe Czerwinski@JoeCzGlaetzer 2010 Amon-Ra Unfiltered Shiraz (Baros...ShirazGlaetzer
    122430AustraliaThese blends are traditional in Australia—they...Anaperenna9580.0South AustraliaBarossa ValleyNaNJoe Czerwinski@JoeCzGlaetzer 2010 Anaperenna Shiraz-Cabernet Sauvi...Shiraz-Cabernet SauvignonGlaetzer
    122507New ZealandThis blend of Cabernet Sauvignon (62.5%), Merl...SQM Gimblett Gravels Cabernets/Merlot9579.0Hawke's BayNaNNaNJoe Czerwinski@JoeCzSquawking Magpie 2014 SQM Gimblett Gravels Cab...Bordeaux-style Red BlendSquawking Magpie
    122939AustraliaFull-bodied and plush yet vibrant and imbued w...The Factor98125.0South AustraliaBarossa ValleyNaNJoe Czerwinski@JoeCzTorbreck 2013 The Factor Shiraz (Barossa Valley)ShirazTorbreck
    +
    + + + +

    Summary Functions and Maps

    介绍

    在上一教程中,我们学习了如何从 DataFrame 或 Series 中选择相关数据。正如我们在练习中演示的那样,从数据表示中提取正确的数据对于完成工作至关重要。

    +

    然而,数据并不总是以我们想要的格式从内存中直接取出。有时,我们必须自己再做一些工作来重新格式化数据,以完成手头的任务。本教程将介绍我们可以对数据进行的不同操作,以获得 “恰到好处 “的输入。

    +
    1
    2
    3
    4
    import pandas as pd
    import numpy as np

    reviews = pd.read_csv('datasets/wine/winemag-data-130k-v2.csv',index_col=0)
    + + +
    1
    reviews
    + + + + +
    +

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    countrydescriptiondesignationpointspriceprovinceregion_1region_2taster_nametaster_twitter_handletitlevarietywinery
    0ItalyAromas include tropical fruit, broom, brimston...Vulkà Bianco87NaNSicily & SardiniaEtnaNaNKerin O’Keefe@kerinokeefeNicosia 2013 Vulkà Bianco (Etna)White BlendNicosia
    1PortugalThis is ripe and fruity, a wine that is smooth...Avidagos8715.0DouroNaNNaNRoger Voss@vossrogerQuinta dos Avidagos 2011 Avidagos Red (Douro)Portuguese RedQuinta dos Avidagos
    2USTart and snappy, the flavors of lime flesh and...NaN8714.0OregonWillamette ValleyWillamette ValleyPaul Gregutt@paulgwineRainstorm 2013 Pinot Gris (Willamette Valley)Pinot GrisRainstorm
    3USPineapple rind, lemon pith and orange blossom ...Reserve Late Harvest8713.0MichiganLake Michigan ShoreNaNAlexander PeartreeNaNSt. Julian 2013 Reserve Late Harvest Riesling ...RieslingSt. Julian
    4USMuch like the regular bottling from 2012, this...Vintner's Reserve Wild Child Block8765.0OregonWillamette ValleyWillamette ValleyPaul Gregutt@paulgwineSweet Cheeks 2012 Vintner's Reserve Wild Child...Pinot NoirSweet Cheeks
    ..........................................
    129966GermanyNotes of honeysuckle and cantaloupe sweeten th...Brauneberger Juffer-Sonnenuhr Spätlese9028.0MoselNaNNaNAnna Lee C. IijimaNaNDr. H. Thanisch (Erben Müller-Burggraef) 2013 ...RieslingDr. H. Thanisch (Erben Müller-Burggraef)
    129967USCitation is given as much as a decade of bottl...NaN9075.0OregonOregonOregon OtherPaul Gregutt@paulgwineCitation 2004 Pinot Noir (Oregon)Pinot NoirCitation
    129968FranceWell-drained gravel soil gives this wine its c...Kritt9030.0AlsaceAlsaceNaNRoger Voss@vossrogerDomaine Gresser 2013 Kritt Gewurztraminer (Als...GewürztraminerDomaine Gresser
    129969FranceA dry style of Pinot Gris, this is crisp with ...NaN9032.0AlsaceAlsaceNaNRoger Voss@vossrogerDomaine Marcel Deiss 2012 Pinot Gris (Alsace)Pinot GrisDomaine Marcel Deiss
    129970FranceBig, rich and off-dry, this is powered by inte...Lieu-dit Harth Cuvée Caroline9021.0AlsaceAlsaceNaNRoger Voss@vossrogerDomaine Schoffit 2012 Lieu-dit Harth Cuvée Car...GewürztraminerDomaine Schoffit
    +

    129971 rows × 13 columns

    +
    + + + +

    Summary functions

    Pandas 提供了许多简单的“摘要函数”(不是官方名称),它们以某种有用的方式重组数据。例如,考虑describe()方法:

    +
    1
    reviews.points.describe()
    + + + + +
    count    129971.000000
    +mean         88.447138
    +std           3.039730
    +min          80.000000
    +25%          86.000000
    +50%          88.000000
    +75%          91.000000
    +max         100.000000
    +Name: points, dtype: float64
    +
    +

    该方法生成给定列属性的高级摘要。它是类型感知的,这意味着它的输出会根据输入的数据类型而改变。上面的输出仅对数值数据有意义;对于字符串数据,我们得到的结果如下:

    +
    1
    reviews.taster_name.describe()
    + + + + +
    count         103727
    +unique            19
    +top       Roger Voss
    +freq           25514
    +Name: taster_name, dtype: object
    +
    +

    如果你想得到DataFrame或Series中某一列的一些特定的简单汇总统计,通常有一个有用的pandas函数可以实现。

    +

    例如,我们可以使用mean()函数来查看所分配分数的平均值(例如,平均评分的葡萄酒的表现如何):

    +
    1
    reviews.points.mean()
    + + + + +
    88.44713820775404
    +
    +

    要查看唯一值的列表,我们可以使用 unique() 函数:

    +
    1
    reviews.taster_name.unique()
    + + + + +
    array(['Kerin O’Keefe', 'Roger Voss', 'Paul Gregutt',
    +       'Alexander Peartree', 'Michael Schachner', 'Anna Lee C. Iijima',
    +       'Virginie Boone', 'Matt Kettmann', nan, 'Sean P. Sullivan',
    +       'Jim Gordon', 'Joe Czerwinski', 'Anne Krebiehl\xa0MW',
    +       'Lauren Buzzeo', 'Mike DeSimone', 'Jeff Jenssen',
    +       'Susan Kostrzewa', 'Carrie Dykes', 'Fiona Adams',
    +       'Christina Pickard'], dtype=object)
    +
    +

    要查看唯一值的列表以及它们在数据集中出现的频率,我们可以使用 value_counts() 方法:

    +
    1
    reviews.taster_name.value_counts()
    + + + + +
    taster_name
    +Roger Voss            25514
    +Michael Schachner     15134
    +Kerin O’Keefe         10776
    +Virginie Boone         9537
    +Paul Gregutt           9532
    +Matt Kettmann          6332
    +Joe Czerwinski         5147
    +Sean P. Sullivan       4966
    +Anna Lee C. Iijima     4415
    +Jim Gordon             4177
    +Anne Krebiehl MW       3685
    +Lauren Buzzeo          1835
    +Susan Kostrzewa        1085
    +Mike DeSimone           514
    +Jeff Jenssen            491
    +Alexander Peartree      415
    +Carrie Dykes            139
    +Fiona Adams              27
    +Christina Pickard         6
    +Name: count, dtype: int64
    +
    +

    Maps

    映射(map)是从数学中借用的术语,指的是将一组值 “映射 “到另一组值的函数。在数据科学中,我们经常需要从现有数据中创建新的表示方法,或者将数据从现在的格式转换为我们希望的格式。映射就是处理这些工作的工具,因此它对于完成工作极为重要!

    +

    有两种映射方法您会经常用到。

    +

    map()是第一个,也是稍微简单的一个。例如,假设我们想将葡萄酒得到的分数重新平均为0:

    +
    1
    2
    review_points_mean = reviews.points.mean()
    reviews.points.map(lambda p: p - review_points_mean) #输入points,函数为points-points_mean
    + + + + +
    0        -1.447138
    +1        -1.447138
    +2        -1.447138
    +3        -1.447138
    +4        -1.447138
    +            ...   
    +129966    1.552862
    +129967    1.552862
    +129968    1.552862
    +129969    1.552862
    +129970    1.552862
    +Name: points, Length: 129971, dtype: float64
    +
    +

    您传递给map()的函数应该期望从Series中得到一个单独的值(在上面的示例中是一个点值),并返回该值的转换版本。 map()返回一个新的Series,其中所有的值都已被您的函数转换。

    +

    如果我们想通过在每一行上调用自定义方法来转换整个DataFrame,则apply()是等价的方法。

    +
    1
    2
    3
    4
    5
    def remean_points(row):
    row.points = row.points - review_points_mean
    return row

    reviews.apply(remean_points, axis='columns')
    + + + + +
    +

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    countrydescriptiondesignationpointspriceprovinceregion_1region_2taster_nametaster_twitter_handletitlevarietywinery
    0ItalyAromas include tropical fruit, broom, brimston...Vulkà Bianco-1.447138NaNSicily & SardiniaEtnaNaNKerin O’Keefe@kerinokeefeNicosia 2013 Vulkà Bianco (Etna)White BlendNicosia
    1PortugalThis is ripe and fruity, a wine that is smooth...Avidagos-1.44713815.0DouroNaNNaNRoger Voss@vossrogerQuinta dos Avidagos 2011 Avidagos Red (Douro)Portuguese RedQuinta dos Avidagos
    2USTart and snappy, the flavors of lime flesh and...NaN-1.44713814.0OregonWillamette ValleyWillamette ValleyPaul Gregutt@paulgwineRainstorm 2013 Pinot Gris (Willamette Valley)Pinot GrisRainstorm
    3USPineapple rind, lemon pith and orange blossom ...Reserve Late Harvest-1.44713813.0MichiganLake Michigan ShoreNaNAlexander PeartreeNaNSt. Julian 2013 Reserve Late Harvest Riesling ...RieslingSt. Julian
    4USMuch like the regular bottling from 2012, this...Vintner's Reserve Wild Child Block-1.44713865.0OregonWillamette ValleyWillamette ValleyPaul Gregutt@paulgwineSweet Cheeks 2012 Vintner's Reserve Wild Child...Pinot NoirSweet Cheeks
    ..........................................
    129966GermanyNotes of honeysuckle and cantaloupe sweeten th...Brauneberger Juffer-Sonnenuhr Spätlese1.55286228.0MoselNaNNaNAnna Lee C. IijimaNaNDr. H. Thanisch (Erben Müller-Burggraef) 2013 ...RieslingDr. H. Thanisch (Erben Müller-Burggraef)
    129967USCitation is given as much as a decade of bottl...NaN1.55286275.0OregonOregonOregon OtherPaul Gregutt@paulgwineCitation 2004 Pinot Noir (Oregon)Pinot NoirCitation
    129968FranceWell-drained gravel soil gives this wine its c...Kritt1.55286230.0AlsaceAlsaceNaNRoger Voss@vossrogerDomaine Gresser 2013 Kritt Gewurztraminer (Als...GewürztraminerDomaine Gresser
    129969FranceA dry style of Pinot Gris, this is crisp with ...NaN1.55286232.0AlsaceAlsaceNaNRoger Voss@vossrogerDomaine Marcel Deiss 2012 Pinot Gris (Alsace)Pinot GrisDomaine Marcel Deiss
    129970FranceBig, rich and off-dry, this is powered by inte...Lieu-dit Harth Cuvée Caroline1.55286221.0AlsaceAlsaceNaNRoger Voss@vossrogerDomaine Schoffit 2012 Lieu-dit Harth Cuvée Car...GewürztraminerDomaine Schoffit
    +

    129971 rows × 13 columns

    +
    + + + +

    如果我们在调用views.apply()时使用的是axis=’index’,那么我们就不需要传递一个函数来转换每一行,而是需要给出一个函数来转换每一列。请注意,map()和apply()分别返回新的、转换后的Series和DataFrames。它们不会修改被调用的原始数据。如果我们查看第一行的评论,我们可以看到它仍然具有原始的点值。

    +
    1
    reviews.head(1)
    + + + + +
    +

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    countrydescriptiondesignationpointspriceprovinceregion_1region_2taster_nametaster_twitter_handletitlevarietywinery
    0ItalyAromas include tropical fruit, broom, brimston...Vulkà Bianco87NaNSicily & SardiniaEtnaNaNKerin O’Keefe@kerinokeefeNicosia 2013 Vulkà Bianco (Etna)White BlendNicosia
    +
    + + + +

    Pandas 提供了许多常见的内置映射操作。例如,以下是重新定义点列的更快方法:

    +
    1
    2
    review_points_mean = reviews.points.mean()
    reviews.points - review_points_mean
    + + + + +
    0        -1.447138
    +1        -1.447138
    +2        -1.447138
    +3        -1.447138
    +4        -1.447138
    +            ...   
    +129966    1.552862
    +129967    1.552862
    +129968    1.552862
    +129969    1.552862
    +129970    1.552862
    +Name: points, Length: 129971, dtype: float64
    +
    +

    在这段代码中,我们在左侧的大量值(系列中的所有值)和右侧的单个值(平均值)之间执行运算。Pandas查看该表达式,并计算出我们必须从数据集中的每个值中减去该平均值。

    +

    如果我们在等长序列之间执行这些操作,Pandas也会明白该怎么做。例如,结合数据集中的国家和地区信息的简单方法如下:

    +
    1
    reviews.country + " - " + reviews.region_1
    + + + + +
    0                     Italy - Etna
    +1                              NaN
    +2           US - Willamette Valley
    +3         US - Lake Michigan Shore
    +4           US - Willamette Valley
    +                    ...           
    +129966                         NaN
    +129967                 US - Oregon
    +129968             France - Alsace
    +129969             France - Alsace
    +129970             France - Alsace
    +Length: 129971, dtype: object
    +
    +

    这些运算符比map()或apply()更快,因为它们使用了pandas内置的加速功能。所有标准的 Python 运算符 (>, <, ==, 等等) 都以这种方式工作。

    +

    然而,它们不如map()或apply()灵活,后者可以做更高级的事情,比如应用条件逻辑,而这是加减法无法做到的。

    +

    TEST

    1
    2
    import pandas as pd
    reviews = pd.read_csv('datasets/wine/winemag-data-130k-v2.csv',index_col=0)
    + +

    1.review DataFrame 中points列的中位数是多少?

    +
    1
    reviews['points'].median()
    + + + + +
    88.0
    +
    +

    2.What countries are represented in the dataset? (Your answer should not include any duplicates.)

    +
    1
    2
    countries=reviews['country'].unique()
    countries
    + + + + +
    array(['Italy', 'Portugal', 'US', 'Spain', 'France', 'Germany',
    +       'Argentina', 'Chile', 'Australia', 'Austria', 'South Africa',
    +       'New Zealand', 'Israel', 'Hungary', 'Greece', 'Romania', 'Mexico',
    +       'Canada', nan, 'Turkey', 'Czech Republic', 'Slovenia',
    +       'Luxembourg', 'Croatia', 'Georgia', 'Uruguay', 'England',
    +       'Lebanon', 'Serbia', 'Brazil', 'Moldova', 'Morocco', 'Peru',
    +       'India', 'Bulgaria', 'Cyprus', 'Armenia', 'Switzerland',
    +       'Bosnia and Herzegovina', 'Ukraine', 'Slovakia', 'Macedonia',
    +       'China', 'Egypt'], dtype=object)
    +
    +

    3.How often does each country appear in the dataset? Create a Series reviews_per_country mapping countries to the count of reviews of wines from that country.
    每个国家在数据集中出现的频率是多少?创建一个 Series Reviews_per_country,将国家映射到该国家的葡萄酒reviews数量。

    +
    1
    2

    reviews['country'].value_counts()
    + + + + +
    country
    +US                        54504
    +France                    22093
    +Italy                     19540
    +Spain                      6645
    +Portugal                   5691
    +Chile                      4472
    +Argentina                  3800
    +Austria                    3345
    +Australia                  2329
    +Germany                    2165
    +New Zealand                1419
    +South Africa               1401
    +Israel                      505
    +Greece                      466
    +Canada                      257
    +Hungary                     146
    +Bulgaria                    141
    +Romania                     120
    +Uruguay                     109
    +Turkey                       90
    +Slovenia                     87
    +Georgia                      86
    +England                      74
    +Croatia                      73
    +Mexico                       70
    +Moldova                      59
    +Brazil                       52
    +Lebanon                      35
    +Morocco                      28
    +Peru                         16
    +Ukraine                      14
    +Serbia                       12
    +Czech Republic               12
    +Macedonia                    12
    +Cyprus                       11
    +India                         9
    +Switzerland                   7
    +Luxembourg                    6
    +Bosnia and Herzegovina        2
    +Armenia                       2
    +Slovakia                      1
    +China                         1
    +Egypt                         1
    +Name: count, dtype: int64
    +
    +

    Create variable centered_price containing a version of the price column with the mean price subtracted. (Note: this ‘centering’ transformation is a common preprocessing step before applying various machine learning algorithms.)

    +

    创建变量 centered_price,其中包含减去平均价格的价格列版本。 (注意:这种“居中”转换是应用各种机器学习算法之前的常见预处理步骤。)

    +
    1
    2
    a = reviews['price'].mean()
    reviews['price'].map(lambda p: p-a)
    + + + + +
    0               NaN
    +1        -20.363389
    +2        -21.363389
    +3        -22.363389
    +4         29.636611
    +            ...    
    +129966    -7.363389
    +129967    39.636611
    +129968    -5.363389
    +129969    -3.363389
    +129970   -14.363389
    +Name: price, Length: 129971, dtype: float64
    +
    +

    I’m an economical wine buyer. Which wine is the “best bargain”? Create a variable bargain_wine with the title of the wine with the highest points-to-price ratio in the dataset.

    +

    我是一个经济实惠的葡萄酒买家。哪种酒是“最划算的”?使用数据集中积分价格比最高的葡萄酒的标题创建一个变量 deal_wine。

    +
    1
    2
    3
    # reviews[[(reviews['points']/reviews['price']).idxmax()]]
    reviews['title'][(reviews['points']/reviews['price']).idxmax()]

    + + + + +
    'Bandit NV Merlot (California)'
    +
    +

    6.There are only so many words you can use when describing a bottle of wine. Is a wine more likely to be “tropical” or “fruity”? Create a Series descriptor_counts counting how many times each of these two words appears in the description column in the dataset. (For simplicity, let’s ignore the capitalized versions of these words.)

    +

    在描述一瓶葡萄酒时,您可以使用的词汇有限。葡萄酒更可能是 “热带 “还是 “果味”?创建一个 “descriptor_counts “系列,计算这两个词在数据集的 “description “列中分别出现的次数。(为简单起见,让我们忽略这些词的大写版本)。

    +
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    import re

    def trop_ocurr(row):
    return re.search("tropical",row.description)==None

    def frui_ocurr(row):
    return re.search("fruity",row.description)==None

    a = reviews.apply(trop_ocurr, axis='columns').value_counts()[False]
    b = reviews.apply(frui_ocurr, axis='columns').value_counts()[False]

    pd.Series([a,b],index=['tropical', 'fruity'])

    + + + + +
    0    3607
    +1    9090
    +dtype: int64
    +
    +
    1
    2
    3
    4
    ############答案的方法##########
    n_trop = reviews.description.map(lambda desc: "tropical" in desc).sum()
    n_fruity = reviews.description.map(lambda desc: "fruity" in desc).sum()
    pd.Series([n_trop, n_fruity], index=['tropical', 'fruity'])
    + + + + +
    tropical    3607
    +fruity      9090
    +dtype: int64
    +
    +
      +
    1. We’d like to host these wine reviews on our website, but a rating system ranging from 80 to 100 points is too hard to understand - we’d like to translate them into simple star ratings. A score of 95 or higher counts as 3 stars, a score of at least 85 but less than 95 is 2 stars. Any other score is 1 star.
    2. +
    +

    Also, the Canadian Vintners Association bought a lot of ads on the site, so any wines from Canada should automatically get 3 stars, regardless of points.

    +

    Create a series star_ratings with the number of stars corresponding to each review in the dataset.

    +

    我们希望将这些酒评放在我们的网站上,但从80分到100分的评分系统太难懂了–我们希望将其转化为简单的星级评分。95分及以上为3星,85分以上95分以下为2星。其他分数为1星。

    +

    此外,加拿大葡萄酒商协会在网站上购买了大量广告,因此任何来自加拿大的葡萄酒都应该自动获得3星,无论分数高低。

    +

    创建一个 “star_ratings “序列,其中包含数据集中每条review对应的星级数。

    +
    1
    2
    3
    4
    5
    6
    7
    8
    9
    a = pd.Series()
    def rate(row):
    # row['points']=3 if (row['country']=='Canada' or row['points']>=95) else 2 if(row['points']>=85) else 1
    return 3 if (row['country']=='Canada' or row['points']>=95) else 2 if(row['points']>=85) else 1
    # return row

    # reviews.apply(rate, axis='columns')['points']
    reviews.apply(rate, axis='columns')

    + + + + +
    0         2
    +1         2
    +2         2
    +3         2
    +4         2
    +         ..
    +129966    2
    +129967    2
    +129968    2
    +129969    2
    +129970    2
    +Length: 129971, dtype: int64
    +
    +
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    ###官方答案###
    def stars(row):
    if row.country == 'Canada':
    return 3
    elif row.points >= 95:
    return 3
    elif row.points >= 85:
    return 2
    else:
    return 1

    reviews.apply(stars, axis='columns')
    + + + + +
    0         2
    +1         2
    +2         2
    +3         2
    +4         2
    +         ..
    +129966    2
    +129967    2
    +129968    2
    +129969    2
    +129970    2
    +Length: 129971, dtype: int64
    +
    +

    Grouping and Sorting

    映射允许我们对数据帧或系列中的数据进行转换,一次只转换整个列中的一个值。然而,我们经常希望对数据进行分组,然后对数据所在的组进行特定操作。

    +

    正如您将了解到的,我们通过groupby()操作来实现这一点。我们还将介绍一些其他主题,例如索引DataFrames的更复杂方法,以及如何排序数据。

    +

    分组分析

    到目前为止,我们经常使用的一个函数是 value_counts() 函数。我们可以通过执行以下操作来复制 value_counts() 的作用:

    +
    1
    2
    3
    import pandas as pd

    reviews = pd.read_csv('datasets/wine/winemag-data-130k-v2.csv',index_col=0)
    + + +
    1
    2
    3
    4
    print(reviews.groupby('points').points.count())
    print(reviews.groupby('points').price.count())
    print(reviews.groupby('price').price.count())
    print(reviews.groupby('price').points.count())
    + +
    points
    +80       397
    +81       692
    +82      1836
    +83      3025
    +84      6480
    +85      9530
    +86     12600
    +87     16933
    +88     17207
    +89     12226
    +90     15410
    +91     11359
    +92      9613
    +93      6489
    +94      3758
    +95      1535
    +96       523
    +97       229
    +98        77
    +99        33
    +100       19
    +Name: points, dtype: int64
    +points
    +80       395
    +81       680
    +82      1772
    +83      2886
    +84      6099
    +85      8902
    +86     11745
    +87     15767
    +88     16014
    +89     11324
    +90     14361
    +91     10564
    +92      8871
    +93      5935
    +94      3449
    +95      1406
    +96       482
    +97       207
    +98        69
    +99        28
    +100       19
    +Name: price, dtype: int64
    +price
    +4.0        11
    +5.0        46
    +6.0       120
    +7.0       433
    +8.0       892
    +         ... 
    +1900.0      1
    +2000.0      2
    +2013.0      1
    +2500.0      2
    +3300.0      1
    +Name: price, Length: 390, dtype: int64
    +price
    +4.0        11
    +5.0        46
    +6.0       120
    +7.0       433
    +8.0       892
    +         ... 
    +1900.0      1
    +2000.0      2
    +2013.0      1
    +2500.0      2
    +3300.0      1
    +Name: points, Length: 390, dtype: int64
    +
    +

    groupby()创建了一组评论,这些评论为给定的葡萄酒分配了相同的分值。然后,对于每一组,我们抓取points()列并计算它出现的次数。 value_counts()只是groupby()操作的快捷方式。

    +

    我们可以对这些数据使用我们之前使用过的任何汇总函数。例如,要获得每个点值类别中最便宜的葡萄酒,我们可以执行以下操作:

    +
    1
    reviews.groupby('points').price.min()
    + + + + +
    points
    +80      5.0
    +81      5.0
    +82      4.0
    +83      4.0
    +84      4.0
    +85      4.0
    +86      4.0
    +87      5.0
    +88      6.0
    +89      7.0
    +90      8.0
    +91      7.0
    +92     11.0
    +93     12.0
    +94     13.0
    +95     20.0
    +96     20.0
    +97     35.0
    +98     50.0
    +99     44.0
    +100    80.0
    +Name: price, dtype: float64
    +
    +

    您可以将我们生成的每个组视为DataFrame的一个片段,其中仅包含值匹配的数据。我们可以使用apply()方法直接访问该DataFrame,然后以我们认为合适的方式处理数据。例如,我们可以从数据集中的每个酒庄中选择第一款葡萄酒的名称:

    +
    1
    reviews.groupby('winery').apply(lambda df: df.title.iloc[0])
    + + + + +
    winery
    +1+1=3                                     1+1=3 NV Rosé Sparkling (Cava)
    +10 Knots                            10 Knots 2010 Viognier (Paso Robles)
    +100 Percent Wine              100 Percent Wine 2015 Moscato (California)
    +1000 Stories           1000 Stories 2013 Bourbon Barrel Aged Zinfande...
    +1070 Green                  1070 Green 2011 Sauvignon Blanc (Rutherford)
    +                                             ...                        
    +Órale                       Órale 2011 Cabronita Red (Santa Ynez Valley)
    +Öko                    Öko 2013 Made With Organically Grown Grapes Ma...
    +Ökonomierat Rebholz    Ökonomierat Rebholz 2007 Von Rotliegenden Spät...
    +àMaurice               àMaurice 2013 Fred Estate Syrah (Walla Walla V...
    +Štoka                                    Štoka 2009 Izbrani Teran (Kras)
    +Length: 16757, dtype: object
    +
    +

    为了进行更细粒度的控制,您还可以按多列进行分组。举个例子,以下是我们如何按国家和省份挑选最好的葡萄酒的方法:

    +
    1
    reviews.groupby(['country', 'province']).apply(lambda df: df.loc[df.points.idxmax()])
    + + + + +
    +

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    countrydescriptiondesignationpointspriceprovinceregion_1region_2taster_nametaster_twitter_handletitlevarietywinery
    countryprovince
    ArgentinaMendoza ProvinceArgentinaIf the color doesn't tell the full story, the ...Nicasia Vineyard97120.0Mendoza ProvinceMendozaNaNMichael Schachner@wineschachBodega Catena Zapata 2006 Nicasia Vineyard Mal...MalbecBodega Catena Zapata
    OtherArgentinaTake note, this could be the best wine Colomé ...Reserva9590.0OtherSaltaNaNMichael Schachner@wineschachColomé 2010 Reserva Malbec (Salta)MalbecColomé
    ArmeniaArmeniaArmeniaDeep salmon in color, this wine offers a bouqu...Estate Bottled8815.0ArmeniaNaNNaNMike DeSimone@worldwineguysVan Ardi 2015 Estate Bottled Rosé (Armenia)RoséVan Ardi
    AustraliaAustralia OtherAustraliaWrites the book on how to make a wine filled w...Sarah's Blend9315.0Australia OtherSouth Eastern AustraliaNaNNaNNaNMarquis Philips 2000 Sarah's Blend Red (South ...Red BlendMarquis Philips
    New South WalesAustraliaDe Bortoli's Noble One is as good as ever in 2...Noble One Bortytis9432.0New South WalesNew South WalesNaNJoe Czerwinski@JoeCzDe Bortoli 2007 Noble One Bortytis Semillon (N...SémillonDe Bortoli
    .............................................
    UruguayJuanicoUruguayThis mature Bordeaux-style blend is earthy on ...Preludio Barrel Select Lote N 779045.0JuanicoNaNNaNMichael Schachner@wineschachFamilia Deicas 2004 Preludio Barrel Select Lot...Red BlendFamilia Deicas
    MontevideoUruguayA rich, heady bouquet offers aromas of blackbe...Monte Vide Eu Tannat-Merlot-Tempranillo9160.0MontevideoNaNNaNMichael Schachner@wineschachBouza 2015 Monte Vide Eu Tannat-Merlot-Tempran...Red BlendBouza
    ProgresoUruguayRusty in color but deep and complex in nature,...Etxe Oneko Fortified Sweet Red9046.0ProgresoNaNNaNMichael Schachner@wineschachPisano 2007 Etxe Oneko Fortified Sweet Red Tan...TannatPisano
    San JoseUruguayBaked, sweet, heavy aromas turn earthy with ti...El Preciado Gran Reserva8750.0San JoseNaNNaNMichael Schachner@wineschachCastillo Viejo 2005 El Preciado Gran Reserva R...Red BlendCastillo Viejo
    UruguayUruguayCherry and berry aromas are ripe, healthy and ...Blend 002 Limited Edition9122.0UruguayNaNNaNMichael Schachner@wineschachNarbona NV Blend 002 Limited Edition Tannat-Ca...Tannat-Cabernet FrancNarbona
    +

    425 rows × 13 columns

    +
    + + + +

    另一个值得一提的 groupby() 方法是 agg(),它允许您同时在 DataFrame 上运行一堆不同的函数。例如,我们可以生成数据集的简单统计摘要,如下所示:

    +
    1
    reviews.groupby(['country']).price.agg([len, min, max])
    + + + + +
    +

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    lenminmax
    country
    Argentina38004.0230.0
    Armenia214.015.0
    Australia23295.0850.0
    Austria33457.01100.0
    Bosnia and Herzegovina212.013.0
    Brazil5210.060.0
    Bulgaria1418.0100.0
    Canada25712.0120.0
    Chile44725.0400.0
    China118.018.0
    Croatia7312.065.0
    Cyprus1111.021.0
    Czech Republic1215.045.0
    Egypt1NaNNaN
    England7425.095.0
    France220935.03300.0
    Georgia869.040.0
    Germany21655.0775.0
    Greece4668.079.0
    Hungary14610.0764.0
    India910.020.0
    Israel5058.0150.0
    Italy195405.0900.0
    Lebanon3513.075.0
    Luxembourg616.030.0
    Macedonia1215.020.0
    Mexico708.0108.0
    Moldova598.042.0
    Morocco2814.040.0
    New Zealand14197.0130.0
    Peru1610.068.0
    Portugal56915.01000.0
    Romania1204.0320.0
    Serbia1215.042.0
    Slovakia116.016.0
    Slovenia877.090.0
    South Africa14015.0330.0
    Spain66454.0770.0
    Switzerland721.0160.0
    Turkey9014.0120.0
    US545044.02013.0
    Ukraine146.013.0
    Uruguay10910.0130.0
    +
    + + + +

    有效使用 groupby() 将使您能够利用数据集做很多真正强大的事情。

    +

    Multi-indexes

    在我们迄今为止看到的所有示例中,我们一直在使用单标签索引的DataFrame或Series对象。
    groupby()略有不同,根据我们运行的操作,它有时会产生所谓的多索引。
    多索引与常规索引的不同之处在于它具有多个级别。例如:

    +
    1
    2
    3
    countries_reviewed = reviews.groupby(['country', 'province']).description.agg([len])
    countries_reviewed
    # reviews['description'][0].__len__()
    + + + + +
    +

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    len
    countryprovince
    ArgentinaMendoza Province3264
    Other536
    ArmeniaArmenia2
    AustraliaAustralia Other245
    New South Wales85
    .........
    UruguayJuanico12
    Montevideo11
    Progreso11
    San Jose3
    Uruguay24
    +

    425 rows × 1 columns

    +
    + + + + +
    1
    2
    mi = countries_reviewed.index
    type(mi)
    + + + + +
    pandas.core.indexes.multi.MultiIndex
    +
    +

    多级索引有几种处理分层结构的方法,而单级索引则没有这些方法。它们还需要两层标签来获取一个值。对于刚接触pandas的用户来说,处理多索引输出是一个常见的 “疑难杂症”。

    +

    在pandas文档的MultiIndex/Advanced Selection部分详细介绍了多索引的用例和使用说明。

    +

    然而,一般来说,你最常使用的多索引方法是转换回普通索引的reset_index()方法:

    +
    1
    countries_reviewed.reset_index()
    + + + + +
    +

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    countryprovincelen
    0ArgentinaMendoza Province3264
    1ArgentinaOther536
    2ArmeniaArmenia2
    3AustraliaAustralia Other245
    4AustraliaNew South Wales85
    ............
    420UruguayJuanico12
    421UruguayMontevideo11
    422UruguayProgreso11
    423UruguaySan Jose3
    424UruguayUruguay24
    +

    425 rows × 3 columns

    +
    + + + +

    Sorting

    再次查看 countries_reviewed,我们可以看到分组返回的数据是按照索引顺序而不是值的顺序排列的。也就是说,在输出分组结果时,行的顺序取决于索引中的值,而不是数据中的值。

    +

    为了按照我们想要的顺序获得数据,我们可以自己对数据进行排序。sort_values()方法在这方面非常方便。

    +
    1
    2
    countries_reviewed = countries_reviewed.reset_index()
    countries_reviewed.sort_values(by='len')
    + + + + +
    +

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    countryprovincelen
    179GreeceMuscat of Kefallonian1
    192GreeceSterea Ellada1
    194GreeceThraki1
    354South AfricaPaardeberg1
    40BrazilSerra do Sudeste1
    ............
    409USOregon5373
    227ItalyTuscany5897
    118FranceBordeaux5941
    415USWashington8639
    392USCalifornia36247
    +

    425 rows × 3 columns

    +
    + + + +

    sort_values() 默认为升序排序,其中最低的值排在前面。然而,大多数时候我们想要降序排序,即数字较大的排在前面。事情是这样的:

    +
    1
    countries_reviewed.sort_values(by='len', ascending=False)
    + + + + +
    +

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    countryprovincelen
    392USCalifornia36247
    415USWashington8639
    118FranceBordeaux5941
    227ItalyTuscany5897
    409USOregon5373
    ............
    101CroatiaKrk1
    247New ZealandGladstone1
    357South AfricaPiekenierskloof1
    63ChileCoelemu1
    149GreeceBeotia1
    +

    425 rows × 3 columns

    +
    + + + +

    要按索引值排序,请使用配套方法 sort_index()。此方法具有相同的参数和默认顺序:

    +
    1
    countries_reviewed.sort_index()
    + + + + +
    +

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    countryprovincelen
    0ArgentinaMendoza Province3264
    1ArgentinaOther536
    2ArmeniaArmenia2
    3AustraliaAustralia Other245
    4AustraliaNew South Wales85
    ............
    420UruguayJuanico12
    421UruguayMontevideo11
    422UruguayProgreso11
    423UruguaySan Jose3
    424UruguayUruguay24
    +

    425 rows × 3 columns

    +
    + + + +

    最后,要知道您一次可以按多个列进行排序:

    +
    1
    countries_reviewed.sort_values(by=['country', 'len'])
    + + + + +
    +

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    countryprovincelen
    1ArgentinaOther536
    0ArgentinaMendoza Province3264
    2ArmeniaArmenia2
    6AustraliaTasmania42
    4AustraliaNew South Wales85
    ............
    421UruguayMontevideo11
    422UruguayProgreso11
    420UruguayJuanico12
    424UruguayUruguay24
    419UruguayCanelones43
    +

    425 rows × 3 columns

    +
    + + + +

    TEST

    1
    2
    3
    4
    import pandas as pd

    reviews = pd.read_csv('datasets/wine/winemag-data-130k-v2.csv')
    reviews.head()
    + + + + +
    +

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    Unnamed: 0countrydescriptiondesignationpointspriceprovinceregion_1region_2taster_nametaster_twitter_handletitlevarietywinery
    00ItalyAromas include tropical fruit, broom, brimston...Vulkà Bianco87NaNSicily & SardiniaEtnaNaNKerin O’Keefe@kerinokeefeNicosia 2013 Vulkà Bianco (Etna)White BlendNicosia
    11PortugalThis is ripe and fruity, a wine that is smooth...Avidagos8715.0DouroNaNNaNRoger Voss@vossrogerQuinta dos Avidagos 2011 Avidagos Red (Douro)Portuguese RedQuinta dos Avidagos
    22USTart and snappy, the flavors of lime flesh and...NaN8714.0OregonWillamette ValleyWillamette ValleyPaul Gregutt@paulgwineRainstorm 2013 Pinot Gris (Willamette Valley)Pinot GrisRainstorm
    33USPineapple rind, lemon pith and orange blossom ...Reserve Late Harvest8713.0MichiganLake Michigan ShoreNaNAlexander PeartreeNaNSt. Julian 2013 Reserve Late Harvest Riesling ...RieslingSt. Julian
    44USMuch like the regular bottling from 2012, this...Vintner's Reserve Wild Child Block8765.0OregonWillamette ValleyWillamette ValleyPaul Gregutt@paulgwineSweet Cheeks 2012 Vintner's Reserve Wild Child...Pinot NoirSweet Cheeks
    +
    + + + +

    1.

    Who are the most common wine reviewers in the dataset? Create a Series whose index is the taster_twitter_handle category from the dataset, and whose values count how many reviews each person wrote.

    +

    数据集中最常见的酒评人是谁?创建一个 “系列”,其索引是数据集中的 “taster_twitter_handle “类别,其值计算每个人写了多少评论。

    +
    1
    reviews.groupby('taster_twitter_handle')['taster_twitter_handle'].count()
    + + + + +
    taster_twitter_handle
    +@AnneInVino          3685
    +@JoeCz               5147
    +@bkfiona               27
    +@gordone_cellars     4177
    +@kerinokeefe        10776
    +@laurbuzz            1835
    +@mattkettmann        6332
    +@paulgwine           9532
    +@suskostrzewa        1085
    +@vboone              9537
    +@vossroger          25514
    +@wawinereport        4966
    +@wineschach         15134
    +@winewchristina         6
    +@worldwineguys       1005
    +Name: taster_twitter_handle, dtype: int64
    +
    +

    2.

    What is the best wine I can buy for a given amount of money? Create a Series whose index is wine prices and whose values is the maximum number of points a wine costing that much was given in a review. Sort the values by price, ascending (so that 4.0 dollars is at the top and 3300.0 dollars is at the bottom).

    +

    我花多少钱可以买到最好的葡萄酒?创建一个 “系列”,其索引是葡萄酒的价格,其值是该价格的葡萄酒在评论中得到的最高分。按价格升序排序(这样4.0美元在最上面,3300.0美元在最下面)。

    +
    1
    reviews.groupby('price')['points'].max()
    + + + + +
    price
    +4.0       86
    +5.0       87
    +6.0       88
    +7.0       91
    +8.0       91
    +          ..
    +1900.0    98
    +2000.0    97
    +2013.0    91
    +2500.0    96
    +3300.0    88
    +Name: points, Length: 390, dtype: int64
    +
    +

    3.

    What are the minimum and maximum prices for each variety of wine? Create a DataFrame whose index is the variety category from the dataset and whose values are the min and max values thereof.

    +

    每种葡萄酒的最低和最高价格是多少?创建一个DataFrame,其索引为数据集中的variety类别,其值为minmax值。

    +
    1
    2
    price_extremes = reviews.groupby('variety')['price'].agg([min,max])
    price_extremes
    + + + + +
    +

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    minmax
    variety
    Abouriou15.075.0
    Agiorgitiko10.066.0
    Aglianico6.0180.0
    Aidani27.027.0
    Airen8.010.0
    .........
    Zinfandel5.0100.0
    Zlahtina13.016.0
    Zweigelt9.070.0
    Çalkarası19.019.0
    Žilavka15.015.0
    +

    707 rows × 2 columns

    +
    + + + +

    4.

    What are the most expensive wine varieties? Create a variable sorted_varieties containing a copy of the dataframe from the previous question where varieties are sorted in descending order based on minimum price, then on maximum price (to break ties).

    +

    最贵的葡萄酒品种是什么?创建一个变量sorted_varieties,其中包含上一个问题中数据帧的副本,根据最低价格,然后根据最高价格,按降序排列(打破并列关系)。

    +
    1
    price_extremes.sort_values(by=['min', 'max'],ascending=False)
    + + + + +
    +

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    minmax
    variety
    Ramisco495.0495.0
    Terrantez236.0236.0
    Francisa160.0160.0
    Rosenmuskateller150.0150.0
    Tinta Negra Mole112.0112.0
    .........
    RoscettoNaNNaN
    Sauvignon Blanc-Sauvignon GrisNaNNaN
    Tempranillo-MalbecNaNNaN
    VitalNaNNaN
    ZelenNaNNaN
    +

    707 rows × 2 columns

    +
    + + + +

    5.

    Create a Series whose index is reviewers and whose values is the average review score given out by that reviewer. Hint: you will need the taster_name and points columns.

    +

    创建一个 “系列”,其索引为reviewers,其值为该reviewer给出的平均review分数。提示:您将需要taster_namepoints列。

    +
    1
    2
    3
    # reviews.groupby('taster_name')['points'].agg(['mean'])
    reviewer_mean_ratings = reviews.groupby('taster_name').apply(lambda df: df['points'].mean())
    reviewer_mean_ratings
    + + + + +
    taster_name
    +Alexander Peartree    85.855422
    +Anna Lee C. Iijima    88.415629
    +Anne Krebiehl MW      90.562551
    +Carrie Dykes          86.395683
    +Christina Pickard     87.833333
    +Fiona Adams           86.888889
    +Jeff Jenssen          88.319756
    +Jim Gordon            88.626287
    +Joe Czerwinski        88.536235
    +Kerin O’Keefe         88.867947
    +Lauren Buzzeo         87.739510
    +Matt Kettmann         90.008686
    +Michael Schachner     86.907493
    +Mike DeSimone         89.101167
    +Paul Gregutt          89.082564
    +Roger Voss            88.708003
    +Sean P. Sullivan      88.755739
    +Susan Kostrzewa       86.609217
    +Virginie Boone        89.213379
    +dtype: float64
    +
    +

    Are there significant differences in the average scores assigned by the various reviewers? Run the cell below to use the describe() method to see a summary of the range of values.

    +

    不同评论人给出的平均分是否存在明显差异?运行下面的单元格,使用 describe()方法查看数值范围的摘要。

    +
    1
    reviewer_mean_ratings.describe()
    + + + + +
    count    19.000000
    +mean     88.233026
    +std       1.243610
    +min      85.855422
    +25%      87.323501
    +50%      88.536235
    +75%      88.975256
    +max      90.562551
    +dtype: float64
    +
    +

    6.

    What combination of countries and varieties are most common? Create a Series whose index is a MultiIndexof {country, variety} pairs. For example, a pinot noir produced in the US should map to {"US", "Pinot Noir"}. Sort the values in the Series in descending order based on wine count.

    +

    什么国家和品种的组合最常见?创建一个 Series,其索引是{country, variety} 对的 MultiIndex。例如,产自美国的黑比诺应该映射到{"美国", "黑比诺"}。将 Series中的值按照葡萄酒数量降序排序。

    +
    1
    2
    reviews.groupby(['country', 'variety']).size().sort_values(ascending=False)
    # reviews.head()
    + + + + +
    country  variety                 
    +US       Pinot Noir                  9885
    +         Cabernet Sauvignon          7315
    +         Chardonnay                  6801
    +France   Bordeaux-style Red Blend    4725
    +Italy    Red Blend                   3624
    +                                     ... 
    +Mexico   Cinsault                       1
    +         Grenache                       1
    +         Merlot                         1
    +         Rosado                         1
    +Uruguay  White Blend                    1
    +Length: 1612, dtype: int64
    +
    +

    Data Types and Missing Values

    Dtypes

    DataFrame 或 Series 中列的数据类型称为 dtype。

    +

    您可以使用 dtype 属性来获取特定列的类型。例如,我们可以获取评论 DataFrame 中价格列的 dtype:

    +
    1
    2
    import pandas as pd
    reviews = pd.read_csv("datasets/wine/winemag-data-130k-v2.csv", index_col=0)
    + + +
    1
    reviews.price.dtype
    + + + + +
    dtype('float64')
    +
    +

    或者,dtypes 属性返回 DataFrame 中每列的 dtype:

    +
    1
    reviews.dtypes
    + + + + +
    country                   object
    +description               object
    +designation               object
    +points                     int64
    +price                    float64
    +province                  object
    +region_1                  object
    +region_2                  object
    +taster_name               object
    +taster_twitter_handle     object
    +title                     object
    +variety                   object
    +winery                    object
    +dtype: object
    +
    +

    float64 表示使用 64 位浮点数;int64 表示使用类似大小的整数,以此类推。

    +

    需要注意的一个特殊情况是(在这里可以很清楚地看到),完全由字符串组成的列没有自己的类型,而是被赋予了对象类型。

    +

    我们可以使用 astype() 函数将一种类型的列转换为另一种类型,只要这种转换是合理的。例如,我们可以将积分列从现有的 int64 数据类型转换为 float64 数据类型:

    +
    1
    reviews.points.astype('float64')
    + + + + +
    0         87.0
    +1         87.0
    +2         87.0
    +3         87.0
    +4         87.0
    +          ... 
    +129966    90.0
    +129967    90.0
    +129968    90.0
    +129969    90.0
    +129970    90.0
    +Name: points, Length: 129971, dtype: float64
    +
    +

    DataFrame 或 Series 索引也有自己的数据类型:

    +
    1
    reviews.index.dtype
    + + + + +
    dtype('int64')
    +
    +

    Pandas 还支持更奇特的数据类型,例如分类数据和时间序列数据。

    +

    Missing data

    缺失值的输入值为 NaN,即 “Not a Number(非数值)”的缩写。由于技术原因,这些 NaN 值始终是 float64 类型。

    +

    Pandas 提供了一些专门针对缺失数据的方法。要选择 NaN 条目,可以使用 pd.isnull()(或其同伴 pd.notnull())。使用方法如下

    +
    1
    reviews[pd.isnull(reviews.country)]
    + + + + +
    +

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    countrydescriptiondesignationpointspriceprovinceregion_1region_2taster_nametaster_twitter_handletitlevarietywinery
    913NaNAmber in color, this wine has aromas of peach ...Asureti Valley8730.0NaNNaNNaNMike DeSimone@worldwineguysGotsa Family Wines 2014 Asureti Valley ChinuriChinuriGotsa Family Wines
    3131NaNSoft, fruity and juicy, this is a pleasant, si...Partager83NaNNaNNaNNaNRoger Voss@vossrogerBarton & Guestier NV Partager RedRed BlendBarton & Guestier
    4243NaNViolet-red in color, this semisweet wine has a...Red Naturally Semi-Sweet8818.0NaNNaNNaNMike DeSimone@worldwineguysKakhetia Traditional Winemaking 2012 Red Natur...OjaleshiKakhetia Traditional Winemaking
    9509NaNThis mouthwatering blend starts with a nose of...Theopetra Malagouzia-Assyrtiko9228.0NaNNaNNaNSusan Kostrzewa@suskostrzewaTsililis 2015 Theopetra Malagouzia-Assyrtiko W...White BlendTsililis
    9750NaNThis orange-style wine has a cloudy yellow-gol...Orange Nikolaevo Vineyard8928.0NaNNaNNaNJeff Jenssen@worldwineguysRoss-idi 2015 Orange Nikolaevo Vineyard Chardo...ChardonnayRoss-idi
    ..........................................
    124176NaNThis Swiss red blend is composed of four varie...Les Romaines9030.0NaNNaNNaNJeff Jenssen@worldwineguysLes Frères Dutruy 2014 Les Romaines RedRed BlendLes Frères Dutruy
    129407NaNDry spicy aromas of dusty plum and tomato add ...Reserve8922.0NaNNaNNaNMichael Schachner@wineschachEl Capricho 2015 Reserve Cabernet SauvignonCabernet SauvignonEl Capricho
    129408NaNEl Capricho is one of Uruguay's more consisten...Reserve8922.0NaNNaNNaNMichael Schachner@wineschachEl Capricho 2015 Reserve TempranilloTempranilloEl Capricho
    129590NaNA blend of 60% Syrah, 30% Cabernet Sauvignon a...Shah9030.0NaNNaNNaNMike DeSimone@worldwineguysBüyülübağ 2012 Shah RedRed BlendBüyülübağ
    129900NaNThis wine offers a delightful bouquet of black...NaN9132.0NaNNaNNaNMike DeSimone@worldwineguysPsagot 2014 MerlotMerlotPsagot
    +

    63 rows × 13 columns

    +
    + + + +

    替换缺失值是一种常见操作。 Pandas 为这个问题提供了一个非常方便的方法:fillna()。 fillna() 提供了几种不同的策略来减少此类数据。例如,我们可以简单地将每个 NaN 替换为“Unknown”:

    +
    1
    reviews.region_2.fillna("Unknown")
    + + + + +
    0                   Unknown
    +1                   Unknown
    +2         Willamette Valley
    +3                   Unknown
    +4         Willamette Valley
    +                ...        
    +129966              Unknown
    +129967         Oregon Other
    +129968              Unknown
    +129969              Unknown
    +129970              Unknown
    +Name: region_2, Length: 129971, dtype: object
    +
    +

    或者,我们可以使用数据库中给定记录之后某个时间出现的第一个非空值来填充每个缺失值。这称为回填策略。

    +

    或者,我们可能有一个非空值需要替换。例如,假设自本数据集发布以来,评论员 Kerin O’Keefe 已将其 Twitter 手柄从 @kerinokeefe 更改为 @kerino。使用 replace() 方法是在数据集中反映这一情况的方法之一:

    +
    1
    reviews.taster_twitter_handle.replace("@kerinokeefe", "@kerino")
    + + + + +
    0             @kerino
    +1          @vossroger
    +2         @paulgwine 
    +3                 NaN
    +4         @paulgwine 
    +             ...     
    +129966            NaN
    +129967    @paulgwine 
    +129968     @vossroger
    +129969     @vossroger
    +129970     @vossroger
    +Name: taster_twitter_handle, Length: 129971, dtype: object
    +
    +

    这里值得一提的是 Replace() 方法,因为它可以方便地替换丢失的数据,这些数据在数据集中被赋予某种哨兵值:诸如“未知”、“未公开”、“无效”等。

    +

    TEST

    1
    2
    import pandas as pd
    reviews = pd.read_csv("datasets/wine/winemag-data-130k-v2.csv", index_col=0)
    + +

    1.数据集中pionts列的数据类型是什么?

    +
    1
    reviews['points'].dtype
    + + + + +
    dtype('int64')
    +
    +

    2.从points列中的条目创建一个系列,但将条目转换为字符串。提示:字符串在 Python 中是 str

    +
    1
    reviews.points.astype('str')
    + + + + +
    0         87
    +1         87
    +2         87
    +3         87
    +4         87
    +          ..
    +129966    90
    +129967    90
    +129968    90
    +129969    90
    +129970    90
    +Name: points, Length: 129971, dtype: object
    +
    +

    3.有时价格列为空。数据集中有多少评论缺少价格?

    +
    1
    reviews['price'].isnull().sum()
    + + + + +
    8996
    +
    +

    4.最常见的葡萄酒产区有哪些?创建一个Series,计算 region_1 字段中每个值出现的次数。这个字段经常缺少数据,因此用unknown替换缺少的值。按降序排序。输出结果应如下所示:

    +
    1
    2
    3
    4
    5
    6
    Unknown                    21247
    Napa Valley 4480
    ...
    Bardolino Superiore 1
    Primitivo del Tarantino 1
    Name: region_1, Length: 1230, dtype: int64
    + + +
    1
    2
    reviews['region_1'] = reviews['region_1'].fillna("Unknown")
    reviews['region_1'].value_counts()
    + + + + +
    region_1
    +Unknown                    21247
    +Napa Valley                 4480
    +Columbia Valley (WA)        4124
    +Russian River Valley        3091
    +California                  2629
    +                           ...  
    +Lamezia                        1
    +Trentino Superiore             1
    +Grave del Friuli               1
    +Vin Santo di Carmignano        1
    +Paestum                        1
    +Name: count, Length: 1230, dtype: int64
    +
    +

    Renaming and Combining

    Renaming

    我们在这里介绍的第一个函数是 rename(),它允许您更改索引名称和/或列名称。例如,要更改数据集中的分数列以进行评分,我们将执行以下操作:

    +
    1
    2
    import pandas as pd
    reviews = pd.read_csv("datasets/wine/winemag-data-130k-v2.csv", index_col=0)
    + + +
    1
    reviews.rename(columns={'points': 'score'})
    + + + + +
    +

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    countrydescriptiondesignationscorepriceprovinceregion_1region_2taster_nametaster_twitter_handletitlevarietywinery
    0ItalyAromas include tropical fruit, broom, brimston...Vulkà Bianco87NaNSicily & SardiniaEtnaNaNKerin O’Keefe@kerinokeefeNicosia 2013 Vulkà Bianco (Etna)White BlendNicosia
    1PortugalThis is ripe and fruity, a wine that is smooth...Avidagos8715.0DouroNaNNaNRoger Voss@vossrogerQuinta dos Avidagos 2011 Avidagos Red (Douro)Portuguese RedQuinta dos Avidagos
    2USTart and snappy, the flavors of lime flesh and...NaN8714.0OregonWillamette ValleyWillamette ValleyPaul Gregutt@paulgwineRainstorm 2013 Pinot Gris (Willamette Valley)Pinot GrisRainstorm
    3USPineapple rind, lemon pith and orange blossom ...Reserve Late Harvest8713.0MichiganLake Michigan ShoreNaNAlexander PeartreeNaNSt. Julian 2013 Reserve Late Harvest Riesling ...RieslingSt. Julian
    4USMuch like the regular bottling from 2012, this...Vintner's Reserve Wild Child Block8765.0OregonWillamette ValleyWillamette ValleyPaul Gregutt@paulgwineSweet Cheeks 2012 Vintner's Reserve Wild Child...Pinot NoirSweet Cheeks
    ..........................................
    129966GermanyNotes of honeysuckle and cantaloupe sweeten th...Brauneberger Juffer-Sonnenuhr Spätlese9028.0MoselNaNNaNAnna Lee C. IijimaNaNDr. H. Thanisch (Erben Müller-Burggraef) 2013 ...RieslingDr. H. Thanisch (Erben Müller-Burggraef)
    129967USCitation is given as much as a decade of bottl...NaN9075.0OregonOregonOregon OtherPaul Gregutt@paulgwineCitation 2004 Pinot Noir (Oregon)Pinot NoirCitation
    129968FranceWell-drained gravel soil gives this wine its c...Kritt9030.0AlsaceAlsaceNaNRoger Voss@vossrogerDomaine Gresser 2013 Kritt Gewurztraminer (Als...GewürztraminerDomaine Gresser
    129969FranceA dry style of Pinot Gris, this is crisp with ...NaN9032.0AlsaceAlsaceNaNRoger Voss@vossrogerDomaine Marcel Deiss 2012 Pinot Gris (Alsace)Pinot GrisDomaine Marcel Deiss
    129970FranceBig, rich and off-dry, this is powered by inte...Lieu-dit Harth Cuvée Caroline9021.0AlsaceAlsaceNaNRoger Voss@vossrogerDomaine Schoffit 2012 Lieu-dit Harth Cuvée Car...GewürztraminerDomaine Schoffit
    +

    129971 rows × 13 columns

    +
    + + + +

    rename()可以让你通过分别指定索引或列关键字参数来重命名索引或列值。它支持多种输入格式,但通常 Python 字典是最方便的。下面是一个使用它重命名索引中某些元素的示例。

    +
    1
    reviews.rename(index={0: 'firstEntry', 1: 'secondEntry'})
    + + + + +
    +

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    countrydescriptiondesignationpointspriceprovinceregion_1region_2taster_nametaster_twitter_handletitlevarietywinery
    firstEntryItalyAromas include tropical fruit, broom, brimston...Vulkà Bianco87NaNSicily & SardiniaEtnaNaNKerin O’Keefe@kerinokeefeNicosia 2013 Vulkà Bianco (Etna)White BlendNicosia
    secondEntryPortugalThis is ripe and fruity, a wine that is smooth...Avidagos8715.0DouroNaNNaNRoger Voss@vossrogerQuinta dos Avidagos 2011 Avidagos Red (Douro)Portuguese RedQuinta dos Avidagos
    2USTart and snappy, the flavors of lime flesh and...NaN8714.0OregonWillamette ValleyWillamette ValleyPaul Gregutt@paulgwineRainstorm 2013 Pinot Gris (Willamette Valley)Pinot GrisRainstorm
    3USPineapple rind, lemon pith and orange blossom ...Reserve Late Harvest8713.0MichiganLake Michigan ShoreNaNAlexander PeartreeNaNSt. Julian 2013 Reserve Late Harvest Riesling ...RieslingSt. Julian
    4USMuch like the regular bottling from 2012, this...Vintner's Reserve Wild Child Block8765.0OregonWillamette ValleyWillamette ValleyPaul Gregutt@paulgwineSweet Cheeks 2012 Vintner's Reserve Wild Child...Pinot NoirSweet Cheeks
    ..........................................
    129966GermanyNotes of honeysuckle and cantaloupe sweeten th...Brauneberger Juffer-Sonnenuhr Spätlese9028.0MoselNaNNaNAnna Lee C. IijimaNaNDr. H. Thanisch (Erben Müller-Burggraef) 2013 ...RieslingDr. H. Thanisch (Erben Müller-Burggraef)
    129967USCitation is given as much as a decade of bottl...NaN9075.0OregonOregonOregon OtherPaul Gregutt@paulgwineCitation 2004 Pinot Noir (Oregon)Pinot NoirCitation
    129968FranceWell-drained gravel soil gives this wine its c...Kritt9030.0AlsaceAlsaceNaNRoger Voss@vossrogerDomaine Gresser 2013 Kritt Gewurztraminer (Als...GewürztraminerDomaine Gresser
    129969FranceA dry style of Pinot Gris, this is crisp with ...NaN9032.0AlsaceAlsaceNaNRoger Voss@vossrogerDomaine Marcel Deiss 2012 Pinot Gris (Alsace)Pinot GrisDomaine Marcel Deiss
    129970FranceBig, rich and off-dry, this is powered by inte...Lieu-dit Harth Cuvée Caroline9021.0AlsaceAlsaceNaNRoger Voss@vossrogerDomaine Schoffit 2012 Lieu-dit Harth Cuvée Car...GewürztraminerDomaine Schoffit
    +

    129971 rows × 13 columns

    +
    + + + +

    你可能会经常重命名列,但很少重命名索引值。为此,set_index() 通常更方便。

    +

    行索引和列索引都可以有自己的名称属性。可以使用赠送的 rename_axis() 方法来更改这些名称。例如

    +
    1
    reviews.rename_axis("wines", axis='rows').rename_axis("fields", axis='columns')
    + + + + +
    +

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    fieldscountrydescriptiondesignationpointspriceprovinceregion_1region_2taster_nametaster_twitter_handletitlevarietywinery
    wines
    0ItalyAromas include tropical fruit, broom, brimston...Vulkà Bianco87NaNSicily & SardiniaEtnaNaNKerin O’Keefe@kerinokeefeNicosia 2013 Vulkà Bianco (Etna)White BlendNicosia
    1PortugalThis is ripe and fruity, a wine that is smooth...Avidagos8715.0DouroNaNNaNRoger Voss@vossrogerQuinta dos Avidagos 2011 Avidagos Red (Douro)Portuguese RedQuinta dos Avidagos
    2USTart and snappy, the flavors of lime flesh and...NaN8714.0OregonWillamette ValleyWillamette ValleyPaul Gregutt@paulgwineRainstorm 2013 Pinot Gris (Willamette Valley)Pinot GrisRainstorm
    3USPineapple rind, lemon pith and orange blossom ...Reserve Late Harvest8713.0MichiganLake Michigan ShoreNaNAlexander PeartreeNaNSt. Julian 2013 Reserve Late Harvest Riesling ...RieslingSt. Julian
    4USMuch like the regular bottling from 2012, this...Vintner's Reserve Wild Child Block8765.0OregonWillamette ValleyWillamette ValleyPaul Gregutt@paulgwineSweet Cheeks 2012 Vintner's Reserve Wild Child...Pinot NoirSweet Cheeks
    ..........................................
    129966GermanyNotes of honeysuckle and cantaloupe sweeten th...Brauneberger Juffer-Sonnenuhr Spätlese9028.0MoselNaNNaNAnna Lee C. IijimaNaNDr. H. Thanisch (Erben Müller-Burggraef) 2013 ...RieslingDr. H. Thanisch (Erben Müller-Burggraef)
    129967USCitation is given as much as a decade of bottl...NaN9075.0OregonOregonOregon OtherPaul Gregutt@paulgwineCitation 2004 Pinot Noir (Oregon)Pinot NoirCitation
    129968FranceWell-drained gravel soil gives this wine its c...Kritt9030.0AlsaceAlsaceNaNRoger Voss@vossrogerDomaine Gresser 2013 Kritt Gewurztraminer (Als...GewürztraminerDomaine Gresser
    129969FranceA dry style of Pinot Gris, this is crisp with ...NaN9032.0AlsaceAlsaceNaNRoger Voss@vossrogerDomaine Marcel Deiss 2012 Pinot Gris (Alsace)Pinot GrisDomaine Marcel Deiss
    129970FranceBig, rich and off-dry, this is powered by inte...Lieu-dit Harth Cuvée Caroline9021.0AlsaceAlsaceNaNRoger Voss@vossrogerDomaine Schoffit 2012 Lieu-dit Harth Cuvée Car...GewürztraminerDomaine Schoffit
    +

    129971 rows × 13 columns

    +
    + + + +

    Combining

    在对数据集执行操作时,我们有时需要将不同的 DataFrames 和/或 Series 以非同寻常的方式组合起来。Pandas 有三种核心方法可以实现这一目的。按照复杂程度递增的顺序,它们是 concat()join()merge()merge() 的大部分功能也可以通过 join() 更简单地实现。

    +

    最简单的合并方法是 concat()。如果给定一个元素列表,该函数会将这些元素沿着一个轴挤在一起。

    +

    当我们在不同的 DataFrame 或 Series 对象中拥有相同字段(列)的数据时,这种方法非常有用。例如:YouTube 视频数据集根据来源国(例如本例中的加拿大和英国)对数据进行了分割。如果我们想同时研究多个国家,可以使用 concat() 将它们合并在一起:

    +
    1
    2
    3
    4
    canadian_youtube = pd.read_csv("datasets/Trending_YouTube_Video_Statistics/CAvideos.csv")
    british_youtube = pd.read_csv("datasets/Trending_YouTube_Video_Statistics/GBvideos.csv")

    pd.concat([canadian_youtube,british_youtube])
    + + + + +
    +

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    video_idtrending_datetitlechannel_titlecategory_idpublish_timetagsviewslikesdislikescomment_countthumbnail_linkcomments_disabledratings_disabledvideo_error_or_removeddescription
    0n1WpP7iowLc17.14.11Eminem - Walk On Water (Audio) ft. BeyoncéEminemVEVO102017-11-10T17:00:03.000ZEminem|"Walk"|"On"|"Water"|"Aftermath/Shady/In...1715857978742543420125882https://i.ytimg.com/vi/n1WpP7iowLc/default.jpgFalseFalseFalseEminem's new track Walk on Water ft. Beyoncé i...
    10dBIkQ4Mz1M17.14.11PLUSH - Bad Unboxing Fan MailiDubbbzTV232017-11-13T17:00:00.000Zplush|"bad unboxing"|"unboxing"|"fan mail"|"id...1014651127794168813030https://i.ytimg.com/vi/0dBIkQ4Mz1M/default.jpgFalseFalseFalseSTill got a lot of packages. Probably will las...
    25qpjK5DgCt417.14.11Racist Superman | Rudy Mancuso, King Bach & Le...Rudy Mancuso232017-11-12T19:05:24.000Zracist superman|"rudy"|"mancuso"|"king"|"bach"...319143414603553398181https://i.ytimg.com/vi/5qpjK5DgCt4/default.jpgFalseFalseFalseWATCH MY PREVIOUS VIDEO ▶ \n\nSUBSCRIBE ► http...
    3d380meD0W0M17.14.11I Dare You: GOING BALD!?nigahiga242017-11-12T18:01:41.000Zryan|"higa"|"higatv"|"nigahiga"|"i dare you"|"...2095828132239198917518https://i.ytimg.com/vi/d380meD0W0M/default.jpgFalseFalseFalseI know it's been a while since we did this sho...
    42Vv-BfVoq4g17.14.11Ed Sheeran - Perfect (Official Music Video)Ed Sheeran102017-11-09T11:04:14.000Zedsheeran|"ed sheeran"|"acoustic"|"live"|"cove...3352362216341302108285067https://i.ytimg.com/vi/2Vv-BfVoq4g/default.jpgFalseFalseFalse🎧: https://ad.gt/yt-perfect\n💰: https://atlant...
    ...................................................
    38911l884wKofd5418.14.06Enrique Iglesias - MOVE TO MIAMI (Official Vid...EnriqueIglesiasVEVO102018-05-09T07:00:01.000ZEnrique Iglesias feat. Pitbull|"MOVE TO MIAMI"...25066952268088127839933https://i.ytimg.com/vi/l884wKofd54/default.jpgFalseFalseFalseNEW SONG - MOVE TO MIAMI feat. Pitbull (Click ...
    38912IP8k2xkhOdI18.14.06Jacob Sartorius - Up With It (Official Music V...Jacob Sartorius102018-05-11T17:09:16.000Zjacob sartorius|"jacob"|"up with it"|"jacob sa...1492219619981378124330https://i.ytimg.com/vi/IP8k2xkhOdI/default.jpgFalseFalseFalseTHE OFFICIAL UP WITH IT MUSIC VIDEO!Get my new...
    38913Il-an3K9pjg18.14.06Anne-Marie - 2002 [Official Video]Anne-Marie102018-05-08T11:05:08.000Zanne|"marie"|"anne-marie"|"2002"|"two thousand...29641412394830889219988https://i.ytimg.com/vi/Il-an3K9pjg/default.jpgFalseFalseFalseGet 2002 by Anne-Marie HERE ▶ http://ad.gt/200...
    38914-DRsfNObKIQ18.14.06Eleni Foureira - Fuego - Cyprus - LIVE - First...Eurovision Song Contest242018-05-08T20:32:32.000ZEurovision Song Contest|"2018"|"Lisbon"|"Cypru...143175151518704587526766https://i.ytimg.com/vi/-DRsfNObKIQ/default.jpgFalseFalseFalseEleni Foureira represented Cyprus at the first...
    389154YFo4bdMO8Q18.14.06KYLE - Ikuyo feat. 2 Chainz & Sophia Black [A...SuperDuperKyle102018-05-11T04:06:35.000ZKyle|"SuperDuperKyle"|"Ikuyo"|"2 Chainz"|"Soph...607552182712741423https://i.ytimg.com/vi/4YFo4bdMO8Q/default.jpgFalseFalseFalseDebut album 'Light of Mine' out now: http://ky...
    +

    79797 rows × 16 columns

    +
    + + + +

    join()可让您组合具有共同索引的不同 DataFrame 对象。例如,要提取加拿大和英国同一天流行的视频,我们可以执行以下操作:

    +
    1
    2
    3
    4
    left = canadian_youtube.set_index(['title', 'trending_date'])
    right = british_youtube.set_index(['title', 'trending_date'])

    left.join(right, lsuffix='_CAN', rsuffix='_UK')
    + + + + +
    +

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    video_id_CANchannel_title_CANcategory_id_CANpublish_time_CANtags_CANviews_CANlikes_CANdislikes_CANcomment_count_CANthumbnail_link_CAN...tags_UKviews_UKlikes_UKdislikes_UKcomment_count_UKthumbnail_link_UKcomments_disabled_UKratings_disabled_UKvideo_error_or_removed_UKdescription_UK
    titletrending_date
    !! THIS VIDEO IS NOTHING BUT PAIN !! | Getting Over It - Part 718.04.01PNn8sECd7ioMarkiplier202018-01-03T19:33:53.000Zgetting over it|"markiplier"|"funny moments"|"...8359304705810238250https://i.ytimg.com/vi/PNn8sECd7io/default.jpg...NaNNaNNaNNaNNaNNaNNaNNaNNaNNaN
    #1 Fortnite World Rank - 2,323 Solo Wins!18.09.03DvPW66IFhMIAlexRamiGaming202018-03-09T07:15:52.000ZPS4 Battle Royale|"PS4 Pro Battle Royale"|"Bat...212838519954211https://i.ytimg.com/vi/DvPW66IFhMI/default.jpg...NaNNaNNaNNaNNaNNaNNaNNaNNaNNaN
    #1 Fortnite World Rank - 2,330 Solo Wins!18.10.03EXEaMjFeiEkAlexRamiGaming202018-03-10T06:26:17.000ZPS4 Battle Royale|"PS4 Pro Battle Royale"|"Bat...200764562053745https://i.ytimg.com/vi/EXEaMjFeiEk/default.jpg...NaNNaNNaNNaNNaNNaNNaNNaNNaNNaN
    #1 MOST ANTICIPATED VIDEO (Timber Frame House Raising)17.20.12bYvQmusLaxwPure Living for Life242017-12-20T02:49:11.000Ztimber frame|"timber framing"|"timber frame ra...7915277611591965https://i.ytimg.com/vi/bYvQmusLaxw/default.jpg...NaNNaNNaNNaNNaNNaNNaNNaNNaNNaN
    17.21.12bYvQmusLaxwPure Living for Life242017-12-20T02:49:11.000Ztimber frame|"timber framing"|"timber frame ra...232762155153293601https://i.ytimg.com/vi/bYvQmusLaxw/default.jpg...NaNNaNNaNNaNNaNNaNNaNNaNNaNNaN
    .....................................................................
    😲She Is So Nervous But BLOWS The ROOF After Taking on OPERA Song! | Britain´s Got Talent 201818.02.05WttN1Z0XF4kHow Talented242018-04-28T19:40:58.000Zbgt|"bgt 2018"|"britain got talent"|"britain´s...7134004684260266https://i.ytimg.com/vi/WttN1Z0XF4k/default.jpg...NaNNaNNaNNaNNaNNaNNaNNaNNaNNaN
    18.29.04WttN1Z0XF4kHow Talented242018-04-28T19:40:58.000Zbgt|"bgt 2018"|"britain got talent"|"britain´s...231906192478146https://i.ytimg.com/vi/WttN1Z0XF4k/default.jpg...NaNNaNNaNNaNNaNNaNNaNNaNNaNNaN
    18.30.04WttN1Z0XF4kHow Talented242018-04-28T19:40:58.000Zbgt|"bgt 2018"|"britain got talent"|"britain´s...4762533417176240https://i.ytimg.com/vi/WttN1Z0XF4k/default.jpg...NaNNaNNaNNaNNaNNaNNaNNaNNaNNaN
    🚨 BREAKING NEWS 🔴 Raja Live all Slot Channels Welcome 🎰18.07.05Wt9Gkpmbt44TheBigJackpot242018-05-07T06:58:59.000ZSlot Machine|"win"|"Gambling"|"Big Win"|"raja"...28973216717510https://i.ytimg.com/vi/Wt9Gkpmbt44/default.jpg...NaNNaNNaNNaNNaNNaNNaNNaNNaNNaN
    🚨Active Shooter at YouTube Headquarters - LIVE BREAKING NEWS COVERAGE18.04.04Az72jrKbANARight Side Broadcasting Network252018-04-03T23:12:37.000ZYouTube shooter|"YouTube active shooter"|"acti...103513172218176https://i.ytimg.com/vi/Az72jrKbANA/default.jpg...NaNNaNNaNNaNNaNNaNNaNNaNNaNNaN
    +

    40900 rows × 28 columns

    +
    + + + +

    此处 lsuffixrsuffix 参数是必需的,因为数据在英国和加拿大数据集中具有相同的列名称。如果这不是真的(因为,比如说,我们事先重命名了它们),我们就不需要它们。

    +

    TEST

    1
    2
    import pandas as pd
    reviews = pd.read_csv("datasets/wine/winemag-data-130k-v2.csv", index_col=0)
    + + +
    1
    reviews.head()
    + + + + +
    +

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    countrydescriptiondesignationpointspriceprovinceregion_1region_2taster_nametaster_twitter_handletitlevarietywinery
    0ItalyAromas include tropical fruit, broom, brimston...Vulkà Bianco87NaNSicily & SardiniaEtnaNaNKerin O’Keefe@kerinokeefeNicosia 2013 Vulkà Bianco (Etna)White BlendNicosia
    1PortugalThis is ripe and fruity, a wine that is smooth...Avidagos8715.0DouroNaNNaNRoger Voss@vossrogerQuinta dos Avidagos 2011 Avidagos Red (Douro)Portuguese RedQuinta dos Avidagos
    2USTart and snappy, the flavors of lime flesh and...NaN8714.0OregonWillamette ValleyWillamette ValleyPaul Gregutt@paulgwineRainstorm 2013 Pinot Gris (Willamette Valley)Pinot GrisRainstorm
    3USPineapple rind, lemon pith and orange blossom ...Reserve Late Harvest8713.0MichiganLake Michigan ShoreNaNAlexander PeartreeNaNSt. Julian 2013 Reserve Late Harvest Riesling ...RieslingSt. Julian
    4USMuch like the regular bottling from 2012, this...Vintner's Reserve Wild Child Block8765.0OregonWillamette ValleyWillamette ValleyPaul Gregutt@paulgwineSweet Cheeks 2012 Vintner's Reserve Wild Child...Pinot NoirSweet Cheeks
    +
    + + + +

    1.Region_1Region_2 是数据集中区域设置列的非常无信息的名称。创建reviews副本,并将这些列分别重命名为regionlocale

    +
    1
    reviews.rename(columns={'region_1': 'region','region_2':'locale'})
    + + + + +
    +

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    countrydescriptiondesignationpointspriceprovinceregionlocaletaster_nametaster_twitter_handletitlevarietywinery
    0ItalyAromas include tropical fruit, broom, brimston...Vulkà Bianco87NaNSicily & SardiniaEtnaNaNKerin O’Keefe@kerinokeefeNicosia 2013 Vulkà Bianco (Etna)White BlendNicosia
    1PortugalThis is ripe and fruity, a wine that is smooth...Avidagos8715.0DouroNaNNaNRoger Voss@vossrogerQuinta dos Avidagos 2011 Avidagos Red (Douro)Portuguese RedQuinta dos Avidagos
    2USTart and snappy, the flavors of lime flesh and...NaN8714.0OregonWillamette ValleyWillamette ValleyPaul Gregutt@paulgwineRainstorm 2013 Pinot Gris (Willamette Valley)Pinot GrisRainstorm
    3USPineapple rind, lemon pith and orange blossom ...Reserve Late Harvest8713.0MichiganLake Michigan ShoreNaNAlexander PeartreeNaNSt. Julian 2013 Reserve Late Harvest Riesling ...RieslingSt. Julian
    4USMuch like the regular bottling from 2012, this...Vintner's Reserve Wild Child Block8765.0OregonWillamette ValleyWillamette ValleyPaul Gregutt@paulgwineSweet Cheeks 2012 Vintner's Reserve Wild Child...Pinot NoirSweet Cheeks
    ..........................................
    129966GermanyNotes of honeysuckle and cantaloupe sweeten th...Brauneberger Juffer-Sonnenuhr Spätlese9028.0MoselNaNNaNAnna Lee C. IijimaNaNDr. H. Thanisch (Erben Müller-Burggraef) 2013 ...RieslingDr. H. Thanisch (Erben Müller-Burggraef)
    129967USCitation is given as much as a decade of bottl...NaN9075.0OregonOregonOregon OtherPaul Gregutt@paulgwineCitation 2004 Pinot Noir (Oregon)Pinot NoirCitation
    129968FranceWell-drained gravel soil gives this wine its c...Kritt9030.0AlsaceAlsaceNaNRoger Voss@vossrogerDomaine Gresser 2013 Kritt Gewurztraminer (Als...GewürztraminerDomaine Gresser
    129969FranceA dry style of Pinot Gris, this is crisp with ...NaN9032.0AlsaceAlsaceNaNRoger Voss@vossrogerDomaine Marcel Deiss 2012 Pinot Gris (Alsace)Pinot GrisDomaine Marcel Deiss
    129970FranceBig, rich and off-dry, this is powered by inte...Lieu-dit Harth Cuvée Caroline9021.0AlsaceAlsaceNaNRoger Voss@vossrogerDomaine Schoffit 2012 Lieu-dit Harth Cuvée Car...GewürztraminerDomaine Schoffit
    +

    129971 rows × 13 columns

    +
    + + + +

    2.将数据集中的索引名称设置为 wines

    +
    1
    reviews.rename_axis("wines", axis='columns')
    + + + + +
    +

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    winescountrydescriptiondesignationpointspriceprovinceregion_1region_2taster_nametaster_twitter_handletitlevarietywinery
    0ItalyAromas include tropical fruit, broom, brimston...Vulkà Bianco87NaNSicily & SardiniaEtnaNaNKerin O’Keefe@kerinokeefeNicosia 2013 Vulkà Bianco (Etna)White BlendNicosia
    1PortugalThis is ripe and fruity, a wine that is smooth...Avidagos8715.0DouroNaNNaNRoger Voss@vossrogerQuinta dos Avidagos 2011 Avidagos Red (Douro)Portuguese RedQuinta dos Avidagos
    2USTart and snappy, the flavors of lime flesh and...NaN8714.0OregonWillamette ValleyWillamette ValleyPaul Gregutt@paulgwineRainstorm 2013 Pinot Gris (Willamette Valley)Pinot GrisRainstorm
    3USPineapple rind, lemon pith and orange blossom ...Reserve Late Harvest8713.0MichiganLake Michigan ShoreNaNAlexander PeartreeNaNSt. Julian 2013 Reserve Late Harvest Riesling ...RieslingSt. Julian
    4USMuch like the regular bottling from 2012, this...Vintner's Reserve Wild Child Block8765.0OregonWillamette ValleyWillamette ValleyPaul Gregutt@paulgwineSweet Cheeks 2012 Vintner's Reserve Wild Child...Pinot NoirSweet Cheeks
    ..........................................
    129966GermanyNotes of honeysuckle and cantaloupe sweeten th...Brauneberger Juffer-Sonnenuhr Spätlese9028.0MoselNaNNaNAnna Lee C. IijimaNaNDr. H. Thanisch (Erben Müller-Burggraef) 2013 ...RieslingDr. H. Thanisch (Erben Müller-Burggraef)
    129967USCitation is given as much as a decade of bottl...NaN9075.0OregonOregonOregon OtherPaul Gregutt@paulgwineCitation 2004 Pinot Noir (Oregon)Pinot NoirCitation
    129968FranceWell-drained gravel soil gives this wine its c...Kritt9030.0AlsaceAlsaceNaNRoger Voss@vossrogerDomaine Gresser 2013 Kritt Gewurztraminer (Als...GewürztraminerDomaine Gresser
    129969FranceA dry style of Pinot Gris, this is crisp with ...NaN9032.0AlsaceAlsaceNaNRoger Voss@vossrogerDomaine Marcel Deiss 2012 Pinot Gris (Alsace)Pinot GrisDomaine Marcel Deiss
    129970FranceBig, rich and off-dry, this is powered by inte...Lieu-dit Harth Cuvée Caroline9021.0AlsaceAlsaceNaNRoger Voss@vossrogerDomaine Schoffit 2012 Lieu-dit Harth Cuvée Car...GewürztraminerDomaine Schoffit
    +

    129971 rows × 13 columns

    +
    + + + +

    3.Things on Reddit 数据集包含了来自 reddit.com 上部分排名靠前的论坛(”subreddits”)的产品链接。运行下面的单元格,加载在 /r/gaming 子论坛上提到的产品的数据框,以及在 r//movies 子论坛上提到的产品的数据框。

    +
    1
    2
    3
    4
    gaming_products = pd.read_csv("datasets/top-things/reddits/g/gaming.csv")
    gaming_products['subreddit'] = "r/gaming"
    movie_products = pd.read_csv("datasets/top-things/reddits/m/movies.csv")
    movie_products['subreddit'] = "r/movies"
    + +

    创建一个包含 Reddit 子版块中提到的产品(either subreddit)的 DataFrame

    +
    1
    gaming_products.head()
    + + + + +
    +

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    namecategoryamazon_linktotal_mentionssubreddit_mentionssubreddit
    0BOOMco Halo Covenant Needler BlasterToys & Gameshttps://www.amazon.com/BOOMco-Halo-Covenant-Ne...4.04r/gaming
    1Raspberry PI 3 Model B 1.2GHz 64-bit quad-core...Electronicshttps://www.amazon.com/Raspberry-Model-A1-2GHz...19.03r/gaming
    2CanaKit 5V 2.5A Raspberry Pi 3 Power Supply / ...Electronicshttps://www.amazon.com/CanaKit-Raspberry-Suppl...7.03r/gaming
    3Panasonic K-KJ17MCA4BA Advanced Individual Cel...Electronicshttps://www.amazon.com/Panasonic-Advanced-Indi...29.02r/gaming
    4Mayflash GameCube Controller Adapter for Wii U...Electronicshttps://www.amazon.com/GameCube-Controller-Ada...24.02r/gaming
    +
    + + + + +
    1
    pd.concat([gaming_products,movie_products])
    + + + + +
    +

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    namecategoryamazon_linktotal_mentionssubreddit_mentionssubreddit
    0BOOMco Halo Covenant Needler BlasterToys & Gameshttps://www.amazon.com/BOOMco-Halo-Covenant-Ne...4.04r/gaming
    1Raspberry PI 3 Model B 1.2GHz 64-bit quad-core...Electronicshttps://www.amazon.com/Raspberry-Model-A1-2GHz...19.03r/gaming
    2CanaKit 5V 2.5A Raspberry Pi 3 Power Supply / ...Electronicshttps://www.amazon.com/CanaKit-Raspberry-Suppl...7.03r/gaming
    3Panasonic K-KJ17MCA4BA Advanced Individual Cel...Electronicshttps://www.amazon.com/Panasonic-Advanced-Indi...29.02r/gaming
    4Mayflash GameCube Controller Adapter for Wii U...Electronicshttps://www.amazon.com/GameCube-Controller-Ada...24.02r/gaming
    .....................
    298Welcome to Night Vale CD: A NovelBookshttps://www.amazon.com/Welcome-Night-Vale-CD-N...1.01r/movies
    299Ran (StudioCanal Collection) [Blu-ray]Movies & TVhttps://www.amazon.com/StudioCanal-Collection-...1.01r/movies
    300The Art of John AlvinBookshttps://www.amazon.com/Art-John-Alvin-Andrea/d...1.01r/movies
    301Apocalypto [Blu-ray]Movies & TVhttps://www.amazon.com/Apocalypto-Blu-ray-Rudy...1.01r/movies
    302Cinelinx: A Card Game for People Who Love Movi...Toys & Gameshttps://www.amazon.com/Cinelinx-Card-Game-Peop...1.01r/movies
    +

    796 rows × 6 columns

    +
    + + + +

    4.Kaggle 上的举重数据库数据集包括一张用于举重比赛的 CSV 表和一张单独的举重参赛者表。运行下面的单元格将这些数据集加载到数据框中:

    +
    1
    2
    powerlifting_meets = pd.read_csv("datasets/openpowerlifting/v1/meets.csv")
    powerlifting_competitors = pd.read_csv("datasets/openpowerlifting/v1/openpowerlifting.csv")
    + + +
    1
    powerlifting_competitors
    + + + + +
    +

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    MeetIDNameSexEquipmentAgeDivisionBodyweightKgWeightClassKgSquat4KgBestSquatKgBench4KgBestBenchKgDeadlift4KgBestDeadliftKgTotalKgPlaceWilks
    00Angie Belk TerryFWraps47.0Mst 45-4959.6060NaN47.63NaN20.41NaN70.31138.351155.05
    10Dawn BogartFSingle-ply42.0Mst 40-4458.5160NaN142.88NaN95.25NaN163.29401.421456.38
    20Dawn BogartFSingle-ply42.0Open Senior58.5160NaN142.88NaN95.25NaN163.29401.421456.38
    30Dawn BogartFRaw42.0Open Senior58.5160NaNNaNNaN95.25NaNNaN95.251108.29
    40Destiny DulaFRaw18.0Teen 18-1963.6867.5NaNNaNNaN31.75NaN90.72122.471130.47
    ......................................................
    3864098481William BarabasMMulti-plyNaNElite113.58125NaNNaNNaNNaNNaN347.50347.502202.60
    3864108481Justin ZottlMMulti-plyNaNElite119.02125NaNNaNNaNNaNNaN322.50322.503185.77
    3864118481Jake AndersonMMulti-plyNaNElite120.29125NaNNaNNaNNaNNaN367.50367.501211.17
    3864128481Jeff BumanglagMMulti-plyNaNElite126.73140NaNNaNNaNNaNNaN320.00320.003181.85
    3864138481Shane HammockMMulti-plyNaNElite129.46140NaNNaNNaNNaNNaN362.50362.502205.18
    +

    386414 rows × 17 columns

    +
    + + + +

    两个表都包含对 MeetID 的引用,MeetID 是数据库中包含的每次会议(竞赛)的唯一键。使用它,生成一个将两个表合并为一个的数据集。

    +
    1
    2
    3
    4
    left = powerlifting_meets.set_index(['MeetID'])
    right = powerlifting_competitors.set_index(['MeetID'])
    left.join(right)
    # powerlifting_meets.join(powerlifting_competitors)
    + + + + +
    +

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    MeetPathFederationDateMeetCountryMeetStateMeetTownMeetNameNameSexEquipment...WeightClassKgSquat4KgBestSquatKgBench4KgBestBenchKgDeadlift4KgBestDeadliftKgTotalKgPlaceWilks
    MeetID
    0365strong/1601365Strong2016-10-29USANCCharlotte2016 Junior & Senior National Powerlifting Cha...Angie Belk TerryFWraps...60NaN47.63NaN20.41NaN70.31138.351155.05
    0365strong/1601365Strong2016-10-29USANCCharlotte2016 Junior & Senior National Powerlifting Cha...Dawn BogartFSingle-ply...60NaN142.88NaN95.25NaN163.29401.421456.38
    0365strong/1601365Strong2016-10-29USANCCharlotte2016 Junior & Senior National Powerlifting Cha...Dawn BogartFSingle-ply...60NaN142.88NaN95.25NaN163.29401.421456.38
    0365strong/1601365Strong2016-10-29USANCCharlotte2016 Junior & Senior National Powerlifting Cha...Dawn BogartFRaw...60NaNNaNNaN95.25NaNNaN95.251108.29
    0365strong/1601365Strong2016-10-29USANCCharlotte2016 Junior & Senior National Powerlifting Cha...Destiny DulaFRaw...67.5NaNNaNNaN31.75NaN90.72122.471130.47
    ..................................................................
    8481xpc/2017-finalsXPC2017-03-03USAOHColumbus2017 XPC FinalsWilliam BarabasMMulti-ply...125NaNNaNNaNNaNNaN347.50347.502202.60
    8481xpc/2017-finalsXPC2017-03-03USAOHColumbus2017 XPC FinalsJustin ZottlMMulti-ply...125NaNNaNNaNNaNNaN322.50322.503185.77
    8481xpc/2017-finalsXPC2017-03-03USAOHColumbus2017 XPC FinalsJake AndersonMMulti-ply...125NaNNaNNaNNaNNaN367.50367.501211.17
    8481xpc/2017-finalsXPC2017-03-03USAOHColumbus2017 XPC FinalsJeff BumanglagMMulti-ply...140NaNNaNNaNNaNNaN320.00320.003181.85
    8481xpc/2017-finalsXPC2017-03-03USAOHColumbus2017 XPC FinalsShane HammockMMulti-ply...140NaNNaNNaNNaNNaN362.50362.502205.18
    +

    386414 rows × 23 columns

    +
    + + + +

    完成

    +
    1

    + +
    +

    test for vue

    +

    aaaaaaa

    + + + + +
    +

    + +
    + + + +

    sssssss

    Author: SHYEE
    Link: http://example.com/2023/07/18/%E5%AD%A6%E4%B9%A0pandas-%E4%BB%8Ekaggle%E4%B8%8A/
    Copyright Notice: All articles in this blog are licensed under CC BY-NC-SA 4.0 unless stating additionally.
    \ No newline at end of file diff --git a/2023/07/19/Discharge-Directionality-and-Dominance-of-Right-Handed-Modes-in-Helicon-Plasmas-due-to-Radial-Electron-Density-Gradients/index.html b/2023/07/19/Discharge-Directionality-and-Dominance-of-Right-Handed-Modes-in-Helicon-Plasmas-due-to-Radial-Electron-Density-Gradients/index.html new file mode 100644 index 0000000..a736ee6 --- /dev/null +++ b/2023/07/19/Discharge-Directionality-and-Dominance-of-Right-Handed-Modes-in-Helicon-Plasmas-due-to-Radial-Electron-Density-Gradients/index.html @@ -0,0 +1,199 @@ +Discharge Directionality and Dominance of Right-Handed Modes in Helicon Plasmas due to Radial Electron Density Gradients | SHYEE-PLASMA + + + + + + + + + + + + +

    Discharge Directionality and Dominance of Right-Handed Modes in Helicon Plasmas due to Radial Electron Density Gradients

    摘要

    螺旋波是磁化等离子体波,类似于地球电离层中的哨声波,用于产生高密度实验室等离子体。我们证明可以通过改变天线螺旋度或磁场方向来反转放电方向。如果存在径向密度梯度,模拟将重现这些发现。包含这种密度梯度的螺旋波动方程会产生一个调制磁场,该磁场会放大右旋螺旋模式,但会减弱左旋螺旋模式。这首次一致地解释了右手模式相对于左手模式的主导地位以及螺旋等离子体中的放电方向性。

    +

    图 1

    +

    如图右手半螺旋天线。半个射频周期内的电流以绿色显示,圆柱坐标系以黑色显示,不同方位角模式的发射方向以蓝色显示。

    +

    实验

    这里介绍的实验是在 Madison Awake 原型机 (MAP) 上进行的,如图 2 所示。MAP 由一根 2 m 长的硼硅酸盐玻璃管组成,内径为 52 mm,外径为 58 mm。

    +

    图 2.MAP 实验核心组件的 CAD 模型

    +

    MAP 由一根 2 m 长的硼硅酸盐玻璃管组成,内径为 52 mm,外径为 58 mm。 14 个线圈在设备中心 1.6 m 处产生 49 mT 的非常均匀的磁场,在末端达到 55 mT。在图 2 中,场可以向左或向右定向。带有 1 厘米宽带的 10 厘米长天线以右侧或左侧方向缠绕,用于激发螺旋等离子体。天线位于实验中心,轴向位置 z = 0。所有实验均在 10−2 mbar 的氩气填充压力下进行,射频功率输入设置为 1.3 kW,频率为 13.56 MHz。使用阻抗匹配网络将反射功率降低到可忽略不计的水平,低于 10 W。气体从右侧进入,被迫通过真空容器,然后到达左侧的涡轮泵。

    +

    等离子体密度通过单电离氩气上的 激光诱导荧光(LIF) 进行测量,如 [17, 29] 中所述。此外还拍摄了天线周围放电的照片。结果如图3所示。RH天线在向右磁场中产生向左放电(蓝色曲线),而在向左磁场中产生向右放电(绿色曲线)。密度分布在天线位置周围镜像。对于 LH 天线,向右场(黄色)放电在右侧,向左场(红色)放电在左侧。这表明天线螺旋度或背景场方向的反转会反转放电方向,并且两者的反转会恢复原始放电方向。匹配网络能够匹配所有四种等离子体,无需任何调整,这表明等离子体阻抗在所有放电中都是相同的。这些结果是通过非常好的轴向磁场均匀性和与可能导致轴向各向异性的真空元件的适当距离获得的,消除了由于实验设置而导致的其他组的实验解释中的模糊性,例如通过将天线放置在附近的轴向边界或等离子体密度或场强超出色散关系允许值的区域[30]。

    +

    图 3 螺旋等离子体密度和光发射对天线螺旋度和磁场方向的依赖性

    +

    模拟

    使用 COMSOL 中开发的准 3D 有限元代码(使用冷等离子体波描述) 对 MAP 中的螺旋放电进行建模。在高密度螺旋等离子体中,很大一部分功率是通过 Trivelpiece-Gould[31] 模式沉积的,该模式在亚毫米级上具有非常短的径向波长。这就需要使用轴向 500 μm、径向 30 μm 的非常精细的网格单元。该模型假设波场在方位角方向上具有 eimφ 依赖性,其中 m 是方位角模式数。由于高阶模式的强阻尼,完整的 3D 解决方案可以从六个主阶模式计算,即 m = {±1, ±3, ±5},如稍后图 5 所示。由于朗道阻尼可以忽略不计,功率沉积是通过电子-离子和电子中性碰撞严格欧姆计算的[32]。通过将均匀等离子体中的结果与分析螺旋色散关系进行比较来验证该模型。

    +

    使用 LIF 技术在 116 个点处测量了左向场中 RH 天线的密度分布。等离子体温度和中性压力分别设置为均匀的 3 eV 和 10−3 mbar,后者假设 90% 中性耗尽。该模拟的结果如图 4 和 5 所示。图4示出了总波磁场的大小,其中白色等高线表示等离子体密度。螺旋波从天线位置径向向内传播并轴向向前传播。图 5 显示了不同方位角模式的径向积分功率沉积贡献。很明显,负 m 模式和正 m 模式分别向前和向后沉积功率,如图 1 所示。在该设置中,占主导地位的右手模式 m = -1,沉积总功率的 58.7%,大部分位于右侧。领先的左手模式 m = +1,沉积总功率的 29.5%,大部分在相反方向。剩下的 11.8% 是由遵循主导 RH 和 LH 模式的方向性模式的高阶模式所占。总体而言,通过光学和 LIF 观察,功率沉积位于放电方向。

    +

    图 4

    +

    图4 磁场为负 z 方向的 RH 天线的总螺旋波磁场幅度的仿真结果。实验测量的密度由白色轮廓线给出。

    +

    图 5

    +

    图 4 中模拟的方位模式轴向功率沉积。

    +

    为了阐明这种定向功率沉积的原因,我们使用轴向均匀的等离子体密度分布进行了模拟。径向等离子体密度分布被建模为平顶(flat top)形式

    +

    (1)

    +

    图 6 显示了两种径向密度分布的天线螺旋度和背景场方向的四种可能组合的结果。对于径向密度梯度,在向右场和 RH 天线中,功率沉积主要向左。对于与 LH 天线组合的左向场,会出现相同的沉积剖面。对于其他两种组合,功率沉积主要位于左侧。 z = 0 附近的左右功率不平衡为 36.5% 至 63.5%。对于径向均匀等离子体,不存在显着的优先功率沉积,左右不平衡度仅为48.1%至51.9%。

    +

    数学模型

    由于在螺旋等离子体中,电子电流远强于位移电流并且离子是不动的,因此频域中的相关麦克斯韦方程变为

    +

    (2)

    +

    (3)

    +

    其中不可压缩电子流体的密度为 n,速度为 v。电子受到电力、磁力、摩擦力和压力梯度力的作用,使得它们的动量方程变为

    +

    (4)

    +

    其中 B0 是背景磁场,Te 是电子温度,ν 是电子-离子和电子-中性碰撞的有效组合频率。

    +

    利用这组方程,我们可以消除 E、j 和 v,并得到纯径向密度梯度

    +

    (5)

    +

    (6)

    +

    在方程 5 中,∓ 符号说明背景磁场沿 z 方向或逆 z 方向指向。方程 5 的左侧是推导出来的均匀等离子体中的螺旋波方程。右侧代表一个新项,仅存在于存在密度梯度的情况下。我们在下文中将该术语称为调制磁场,如下所述。由于 δ 是 RF 频率与电子回旋加速器频率的比率,因此方程 5 右侧的第一项可以忽略不计,调制磁场变为

    +

    (7)

    +

    其中右侧利用 r 在密度最高的等离子体核心处变小,使得 ∇ × B 的 Bz 项占主导地位。

    +

    这种形式非常清楚地显示了对磁场方向、密度梯度和方位模数的依赖性。在与 z 对齐的背景场中,附加调制磁场增强正 m 模式,但减弱负 m 模式。加上相反螺旋度的天线以相反方向发送这些模式的事实,这解释了右手模式相对于左手模式的主导地位、螺旋放电的方向性以及为什么螺旋或场反转会翻转放电方向。

    +

    通过使用方程 3 将波动方程转化为以下形式,可以理解这种效应背后的物理机制

    +

    (8)

    +

    这表明,径向电流与场方向和密度梯度相结合,产生了与 jr 波电流有 ∓90° 相移的附加调制磁场。

    +

    图 7 给出了这种现象的物理解释。在沿 z 的背景场中,携带径向电流 jr 的电子流体元件受到洛伦兹力的作用,从而在方位角方向产生电流。该电流也受到洛伦兹力,从而产生负径向方向的电流。这是螺旋波在均匀等离子体中的径向电流和方位角电流之间交换能量的机制。然而,在存在电子密度梯度的情况下,相邻流体元件将携带大小与电子密度成比例的方位角电流,从而导致方位角剪切电流。这些电流可以通过大电流加上不同径向位置的局部电流来描述。局部部分代表偶极子电流,它在 ± z 方向上产生磁场,我们已通过方程 1 中的调制磁场以数学方式表示该磁场。 8. 对于均匀等离子体中的 RH 螺旋模式,jr 电流使 j​​φ 超前 90°,使得调制场沿着波的规则 Bz 场指向,并导致波场增强。相比之下,LH 模式的 jr 滞后 jφ 90°,因此额外的调制磁场会导致 Bz 波场方向错误,从而整体衰减 jr、jφ 和波。

    +

    图 7 存在径向密度梯度时剪切电流源的机制

    +
    Author: SHYEE
    Link: http://example.com/2023/07/19/Discharge-Directionality-and-Dominance-of-Right-Handed-Modes-in-Helicon-Plasmas-due-to-Radial-Electron-Density-Gradients/
    Copyright Notice: All articles in this blog are licensed under CC BY-NC-SA 4.0 unless stating additionally.
    \ No newline at end of file diff --git a/2023/08/28/Radio-Frequency-Excited-Plasma-Discharge-Simulation-for-Potential-Helicon-Plasma-Thruster/index.html b/2023/08/28/Radio-Frequency-Excited-Plasma-Discharge-Simulation-for-Potential-Helicon-Plasma-Thruster/index.html new file mode 100644 index 0000000..aecf845 --- /dev/null +++ b/2023/08/28/Radio-Frequency-Excited-Plasma-Discharge-Simulation-for-Potential-Helicon-Plasma-Thruster/index.html @@ -0,0 +1,243 @@ +Radio Frequency Excited Plasma Discharge Simulation for Potential Helicon Plasma Thruster | SHYEE-PLASMA + + + + + + + + + + + + +

    Radio Frequency Excited Plasma Discharge Simulation for Potential Helicon Plasma Thruster

    Abstract

    先进推进装置的发展是实施强有力的太空探索计划的关键要素。先进的推进器概念,例如开发具有高密度螺旋等离子体源的无电极等离子体推进器,有望缓解电力推进固有的有限寿命的现有问题。无电极等离子推进器可能比使用栅格离子、霍尔推进器、电弧喷射器和电阻喷射器等电极的传统推进器更耐用。该研究的目标是模拟紧凑型高功率密度螺旋等离子体源的运行,目前正在检查其潜在的电力推进应用。等离子体建模在 COMSOL Multiphysics 等离子体模块中执行。 Nagoya III 型天线放置在介电管周围并以 13.56 MHz 电激励。等离子体在含有低压氩气的电离室中形成。利用电磁感应来维持等离子体。

    +

    1. Introduction

    电力推进能够实现高比冲,并且控制推力水平的能力使其成为空间推进应用中传统化学推进器的合适替代品。最近的改进将使电动推进器能够用作未来航天器的主要推进系统。具有多种太空加油能力的可变比冲推进器将允许成功的小行星重定向任务。

    +

    电力推进将电能从外部电源施加到推进剂上。电动推进器分为两大类:使用电力加热推进剂(以中性气体形式出现),以及使用电场或磁场加速离子。自太空时代开始以来,化学火箭因其高推力质量比而占据主导地位。然而,化学火箭的寿命有限。

    +

    电力推进具有多种基于利用电力加速流动的机制的推进器。不同空间推进器的特征比冲范围如表1所示。目前,空间应用中采用的是电热式、静电式或电磁式推进器。电热推进器的工作原理是利用电将推进剂加热至高温,通过喷嘴产生加速产生驱动力。推进剂流体的热能转化为动能。静电推进器利用静电场通过加速带电等离子体来产生推力。电磁场可以是外部产生的,也可以是自感产生的。

    +

    表 1. 已部署和实验的电动推进器的比冲量、推力效率和推力。

    +

    +

    到目前为止,所有运行的电动推进器都使用无电极来电离推进剂,以加速离子和电子。电离输入功率的增加会导致腐蚀,主要是通过溅射降低此类设备的使用寿命。为了解决这个问题,开发了无电极推进器,这种推进器使用电或磁体力来电离气体以产生具有定向速度的推进剂流。在无电极等离子推进器的开发中,Helicon 等离子源在各种情况下都有用处。它们可以产生高密度 ~ 1013cm−3 螺旋等离子体,具有广泛的操作参数范围。螺旋等离子体产生的实验和理论方法及其加速方案已被描述和表征。

    +

    2.Helicon等离子推进器

    为了实现电力推进系统的长寿命,我们一直在研究利用螺旋等离子体源的各种无电极电力推进概念。目前,多个研究小组正在致力于螺旋等离子体推进器(HPT)的开发。该研究的重点是永磁体的实现、优化磁体以满足所需的磁通量、工作功率范围、天线优化。

    +

    麻省理工学院的迷你螺旋实验 (mHTX)、欧空局的螺旋等离子体联氨组合微型 (HPHCOM) 和澳大利亚国立大学的螺旋双层推进器 (HDLT) 是潜在的 HPT 原型。这些不同技术演示原型的推进器性能如表 2 所示并如下所述。

    +

    HPHCOM 原型机的标称功率为 700 W,磁场强度为 200 G,称为 S-helicon 的新型谐振天线在 13.25 MHz 频率下运行,天线的管理功率优化至低于 100 W 的极低范围。提出了永磁体不同排列方式,磁场强度范围400-1100 G。

    +

    HDTL 使用磁场强度为 100-200 G 的电磁体,工作范围为 200-800 W。射频天线的工作频率为 13.25 MHz。实验结果检测到使用氩推进剂时的稳态电流、预期推力高达 6 mN 和比冲 800 S。

    +

    迷你螺旋推进器实验(mHTX)投射了具有单磁体配置的准直等离子体羽流,这对于电力推进应用具有潜力。不同的测量技术证明,微型螺旋在原子Ar和分子N2上产生真实的推力。与 HDTL 相比,其高度电离的推进剂的燃料利用率高达 90%。采用单磁体配置,气体沿着介电石英管流动,天线包围着它。标称工作功率范围为 700-1000 W。

    +

    天线工作频率为13.25 MHz。 mHTX 的实验结果显示,比冲为 2000 S,效率为 12%,推力高达 20 mN。使用不同的控制方式改变等离子束速度使得螺旋最适合可变比冲。

    +

    表 2.HPT 主要原型:推进性能总结。

    +

    +

    可变比冲磁等离子火箭(VASIMR)是一种混合推进器。目前,Ad Astra Rocket Co.正在开发中。它并不完全被视为螺旋等离子体推进器,但它使用螺旋等离子体源来产生等离子体。离子回旋共振为等离子体提供能量并通过磁性喷嘴加速,相反,产生推力。标称工作功率200kW,推力效率达到近50%,可产生3N的推力。射频工作功率估计约为 30 kW。需要>1T的相当大的磁场,这只能通过超导磁体来实现。热行为也是一个重要问题。高温影响磁体的最佳运行,解释了不同轨道的太阳辐射效应。

    +

    3. Helicon 推进器的工作原理

    Helicon 等离子体推进器原型的特征在于推进器运行时的射频功率范围和磁场强度。该设计包含了广泛的控制变量;电离室长度 L、质量流量 m、射频功率 PRF、磁场强度 B、射频频率。决定推进器性能的主要设计参数是电离室尺寸、输入质量流量、输入射频功率和频率。天线形状和位置、磁场强度。这些设计参数以微不足道的方式相互作用,并影响推进器中的整个过程,从电离到内部等离子体损失和外部膨胀。

    +

    3.1.电离室

    从中性气体到等离子体的有效电离发生在电离室中。中性气体推进剂沿介电石英管流动;射频天线产生电磁波传播并激发电子,使气体电离。在电离过程中,低于 5-7 eV 的低电子温度下的主要损失机制是激发、去激发或永久亚稳态。

    +

    为了实现有效的电离,需要高电子温度(>10 eV)和小于腔室长度λion<<L的平均自由程。腔室的尺寸必须符合要求,以便电磁波模式可以在其中传播。

    +

    电子拉莫尔半径需要小于石英管半径 le<<R,以获得更好的电子磁化,从而减少壁上的等离子体损失。介电石英管具有高耐热性,并且当电子和离子到达管壁并不断沉积能量并且管暴露于恒定的热通量时热膨胀低。等离子体约束需要强磁场。磁铁、天线和管子的最佳位置是推进器高效运行所必需的。

    +

    3.2.射频天线

    螺旋天线向等离子体产生电磁波分解功率。螺旋波被称为哨声波,一种低频波,其中 ω 低于等离子体频率 ωp,介于较低混合频率和电子回旋频率 ωc 之间,螺旋放电具有高电离效率。使用较低的射频功率 1-2 kW 可以实现相对完全电离的等离子体 η ≥ 1014 cm−3。施加到天线的电流和波可以被等离子体反射,部分辐射到自由空间并被等离子体重新吸收。天线作为无功功率。高等离子体电阻和功率因数是天线优化设计的关键因素。

    +

    3.3.超导磁体

    磁场发生器是Helicon等离子体推进器的重要组成部分。螺旋等离子体推进器设计主要采用磁场存在下的射频等离子体放电。用于产生必要磁场的电磁体的优化设计是决定推进器性能和效率的关键因素之一。磁场允许电磁波穿过等离子体传播,减少等离子体对壁的损失,并为超音速等离子体膨胀创建磁性喷嘴。

    +

    4. 运作制度

    HPT推进器的流程示意图如图1所示。

    +

    +

    图 1. 迷你螺旋推进器操作示意图。

    +

    4.1.设计限制

    用于模拟的等离子体推进器的标称值如表3所示。

    +

    表 3. 等离子推进器原型的标称值。

    +

    +

    5. 仿真 COMSOL Multiphysics

    螺旋等离子体推进器设计主要采用磁场存在下的射频等离子体放电。使用跨平台 FEA 多物理软件 COMSOL Multiphysics 进行射频等离子体放电。等离子体模块模拟低温等离子体源、系统和放电。射频模块用于模拟天线电磁波传播,AC/DC模块用于模拟磁场配置。模拟过程描述如下。

    +

    5.1.二维几何

    仿真过程中使用的推进器的二维横截面如图2所示。

    +

    +

    图 2. 迷你螺旋推进器仿真二维草图

    +

    5.2.模拟步骤

    5.2.1.等离子模块:

    COMSOL 求解电子密度和能量密度的漂移扩散方程。 COMSOL 等离子体仿真的数学模型在数学建模部分进行了解释。

    +

    5.2.2.磁场:

    超导磁体配置由围绕电离室的螺线管线圈组成,根据所需的磁场强度选择。螺线管线圈相应地放置,因此限制了与射频天线的相互作用。

    +

    5.2.3.电磁波导:

    用于模拟的名古屋 III 型天线。天线放置在介电石英管的外部。天线长度为 100 毫米,专为氩等离子体而设计。射频天线发射频率为13.56 MHz,标称功率约为1000 W。

    +

    5.3.数学建模

    COMSOL Multiphysics 频率瞬态研究中使用的数学模型如下所述。

    +

    波加热等离子体放电大多具有较高的数密度。通过求解漂移扩散方程计算电子密度和平均电子密度。电子数密度:

    +

    (1)

    +

    (2)

    +

    ne 表示电子密度,(1/m3),Re 是电子速率表达式 (1/(m3·s)), 是电子迁移率,(m2/(V·s)),E 是电场 (V/m), De 是电子扩散率。

    +

    (3)

    +

    电子能量密度:

    +

    (4)

    +

    (5)

    +

    Rɛ是非弹性碰撞引起的能量损失/增加 (V/m3·s),με 是电子能量迁移率 (m2/V·s),E是电场 (V/m), 是电子能量扩散率(平方米/秒)。

    +

    (6)

    +

    计算静电场,

    +

    (7)

    +

    高频电场在频域中计算,

    +

    (8)

    +

    当等离子体电流密度和电场比较复杂时,

    +

    (9)

    +

    电磁波与磁场之间的等离子体耦合。是等离子体电导率张量,是电子密度碰撞频率和磁通量的函数。

    +

    (10)

    +

    其中,q= 电子电荷,me= 电子质量,ne= 碰撞频率,ω 是电磁场的角频率。

    +

    5.4.截面数据 氩 (Ar)

    等离子体由三种离子、电子以及大部分中性的原子和分子组成。电子和离子的密度只占中性原子和分子的一小部分,但地基等离子体核聚变除外,它是完全电离的。工业和商业应用中使用的等离子体不一定完全电离。由于中性原子和分子的高密度,它们之间以及电子和离子之间的碰撞变得显着。碰撞过程的中心参数是横截面。电子与气体粒子或离子碰撞,可能发生多种反应。电子可以使气体电离,赋予其动量,可以激发分子和离子周围电子的能级,并且可以与离子重新结合等等。在所有这些随机过程中,电子都会失去能量。中性气体 Ar 的横截面数据如表 4 所示,横截面表示电子发生碰撞时可用的面积。横截面数据允许使用电子能量分布函数 (EEDF) 计算特定反应的速率系数。

    +

    表 4. 氩气碰撞和反应建模。

    +

    +

    6 结果与讨论

    COMSOL 求解电子密度和能量密度的漂移扩散方程。图 3 显示了沿中间横截面朝向电离室长度方向的电子密度分布。

    +

    +

    图 3. 沿电离室长度的电子能量密度分布。

    +

    等离子体柱内电子密度最大,约为1.8×1012cm−3。采用Nagoya III型螺旋天线,置于电离室中部环抱石英管内。射频驱动等离子体发动机的关键因素在于天线,它将初始中性气体的中性流激发成具有高电离密度的磁化等离子体。等离子体放电在天线附近开始,并向电离室的中心位置扩展。

    +

    +

    图 4. 沿电离室长度的电子温度分布。

    +

    电子温度分布如图4所示。最高电子温度达到2.25 eV。在磁场存在下,电子被磁化并通过回旋与中性原子碰撞。在此过程中,电子因原子碰撞而失去能量,并失去达到更高等离子体温度的能力。电子势分布如图5所示。

    +

    +

    图 5. 沿电离室长度的电子势分布。

    +

    命名法

    +
      +
    • λion 离子平均自由程
    • +
    • ω RF 射频
    • +
    • B 磁通密度矢量
    • +
    • E 电场矢量
    • +
    • EM 电磁波
    • +
    • PRF 射频功率
    • +
    • HPT 螺旋等离子体推进器
    • +
    • L 电离室长度
    • +
    +

    该研究的重点是永磁体的实现、优化磁体以满足所需的磁通量、工作功率范围、天线优化。

    +
    Author: SHYEE
    Link: http://example.com/2023/08/28/Radio-Frequency-Excited-Plasma-Discharge-Simulation-for-Potential-Helicon-Plasma-Thruster/
    Copyright Notice: All articles in this blog are licensed under CC BY-NC-SA 4.0 unless stating additionally.
    \ No newline at end of file diff --git a/2023/08/29/Design-of-a-novel-high-efficiency-antenna-for-helicon-plasma-sources/index.html b/2023/08/29/Design-of-a-novel-high-efficiency-antenna-for-helicon-plasma-sources/index.html new file mode 100644 index 0000000..94597d3 --- /dev/null +++ b/2023/08/29/Design-of-a-novel-high-efficiency-antenna-for-helicon-plasma-sources/index.html @@ -0,0 +1,247 @@ +Design of a novel high efficiency antenna for helicon plasma sources | SHYEE-PLASMA + + + + + + + + + + + + + +

    Design of a novel high efficiency antenna for helicon plasma sources

    一种新型螺旋等离子体源高效天线的设计

    +

    abstract

    为螺旋等离子体源提出了一种新的天线配置,可以增加吸收功率和等离子体密度。使用标准 COMSOL Multiphysics 5.3 软件分析了电磁波图案对称性对具有普通天线的螺旋等离子体源(名古屋)中等离子体密度和吸收功率的影响。与理论模型预测相反,电磁波并不代表普通名古屋天线的对称图案。在这项工作中,提出了一种新的天线配置,它改善了螺旋等离子体源中波形的不对称性。通过模拟研究了相同条件下普通名古屋天线和我们提出的天线的等离子体参数,例如等离子体密度和吸收率。此外,将具有通用名古屋天线的七个运行螺旋等离子体源装置的等离子体密度与我们提出的天线和通用名古屋天线的仿真结果进行了比较。模拟结果表明,使用我们提出的天线产生的等离子体密度大约是使用普通名古屋天线产生的等离子体密度的两倍。事实上,模拟结果表明,螺旋波的电场和磁场对称性对于增强波粒耦合起着至关重要的作用。结果,波粒能量交换和螺旋等离子体源的等离子体密度将增加。

    +

    instruction

    Helicon 等离子体源产生低温、高密度和低压等离子体(Chen 2006)。如今,方便且经济的螺旋等离子体源是有吸引力的资产,它们被用作加速器、惯性静电约束聚变装置和等离子体射流的粒子源,以及磁约束装置中预电离的电子源(Hwang、Hong 和 Eom) 1998;陈2008)。

    +

    陈研究了天线的物理机制以及螺旋放电中电磁场和静电场的传播(Chen 1996)。 Park 及其同事研究了螺旋等离子体放电理论以及天线电阻率和等离子体电阻的计算(Park、Choi 和 Yoon 1997)。 Melazzi 从理论上对螺旋等离子体源中常见的几种射频天线进行了比较研究(Melazzi & Lancellotti 2015)。 Caneses 和他的同事研究了高压氢螺旋等离子体源中螺旋波的波传播和碰撞吸收(Caneses & Blackwell 2016)。

    +

    已经进行了多项研究来提高螺旋等离子体源的电离效率。研究人员试图设计一种最佳的等离子体源。 Miljak 和 Chen 发现,通过使用相控双线天线,可以通过施加在空间或时间上或同时旋转的场来激发螺旋波。由于螺旋波形是在空间和时间上旋转的螺旋,因此可以通过使用本身是螺旋的天线或具有随时间旋转的场的天线来改善天线与等离子体的耦合,从而获得更高的等离子体密度(Miljak & Chen 1998) 。在 2005 年报道的另一项工作中,Guittienne 和 Chevalier Towards 提出了螺旋天线的最佳配置(Guittienne, Chevalier & Hollenstein 2005)。他们提出了一种用于激励螺旋波的鸟笼形天线。

    +

    如今,使用计算代码和标准软件对于螺旋等离子体源中等离子体产生的不同方面的调查和研究很有趣。在这方面,杨和他的同事采用三维二维流体方程的螺旋等离子体放电直接数值模拟模型来研究电子密度和温度随时间演化的特征。他们使用 COMSOL Multiphysics 中的有限元求解器来求解所有偏微分方程(Xiong 等人,2017)。

    +

    Caneses 等人使用计算代码和 COMSOL Multiphysics 软件。研究了 MAGPIE 和 Proto MPEX 线性等离子体设备中氢等离子体中螺旋天线附近的天线辐射模式(Caneses、Blackwell 和 Piotrowicz 2017)。影响螺旋等离子体源效率的重要方面之一是有效参数的对称性或不对称性。螺旋等离子体放电部件的构造、图案和分布的对称性可以增加螺旋波与等离子体的耦合。因此,研究螺旋等离子体放电参数的对称性或不对称性可以帮助我们设计和改进螺旋等离子体源的参数。

    +

    这样,Black和Chen发现法拉第屏蔽可以阻挡螺旋放电中的静电场(Blackwell & Chen 1997)。他们发现在这种情况下等离子体密度分布具有对称图案。他们可以通过在天线和玻璃室之间插入法拉第屏蔽来观察电容耦合的影响,这在理论上通常被忽略。结果表明,即使在等离子体被称为“波耦合”的高密度区域(Ellingboe & Boswell 1996),电容耦合也会对等离子体特性产生显着影响。另一个重要参数是天线几何形状。我们发现以前的工作没有考虑天线当前端口的影响。我们的仿真结果表明,天线电流端口(名古屋 III 中)可以影响螺旋等离子体放电系统中电磁场图案的对称性。在这项工作中,提出了一种新的天线配置,可以保护波场图案的对称性。我们的模拟表明,如果在螺旋等离子体源中使用具有两组对称端口的名古屋天线(III型),则螺旋波场分量呈现对称图案。使用标准 COMSOL Multiphysics 5.3 软件分析了电磁波模式对称性对普通名古屋天线螺旋等离子体源中等离子体密度和功率吸收的影响。

    +

    模拟结果表明,使用我们提出的天线产生的等离子体的密度比普通天线增加了两倍。这一结果表明,场模式的对称性会影响等离子体密度和功率吸收,并对波粒耦合的增强起着至关重要的作用。这一事实在以往的文献中没有报道过。应该注意的是,模拟中包含了能量为 0.001 eV 至 1 MeV 的所有参数以及与横截面的相互作用。

    +

    最后,这项工作的目标可以体现在两个方面:首先,提出一种新的天线配置,以增加功率吸收和等离子体密度。其次,借助这种新型天线,我们可以研究模拟结果并将其与可运行的螺旋等离子体源设备的实验结果进行比较。

    +

    该手稿的组织如下:第 2 节介绍了工作原理,第 3 节描述了常见名古屋天线以及我们提出的天线的模拟结果,并处理使用这两种天线类型的等离子体生产。最后,本文在第 4 节中进行了总结。

    +

    理论

    最简单形式的螺旋波源自三个线性化麦克斯韦方程、动量方程和欧姆定律。使用柱坐标,麦克斯韦方程导出了螺旋波磁场分量的贝塞尔方程。随后,楞次定律导出了螺旋波的电场分量。该柱坐标方程形成了螺旋波磁场分量的贝塞尔方程(Chen 1991、2012;Ziemba 等人 2006)。

    +

    螺旋波的磁场分量可由下式获得:

    +

    (2.1)

    +

    (2.2)

    +

    (2.3)

    +

    其中a等于腔室半径rp,Jm−1、Jm+1和Jm分别为m-1、m+1、m阶贝塞尔函数,在上述关系中,A是常数参数,等于至√2/2。上式中 α = ωω2p/kωcc2,ωc=eB0/me,ω2p= 4πn0e2/m,c 为光速,k 为螺旋波矢量,ω 为螺旋波频率,k是波矢量的轴向分量,T 是波矢量的横向分量。利用楞次定律和磁场分量,可以得到螺旋波的电场分量为:

    +

    (2.4)

    +

    (2.5)

    +

    (2.6)

    +

    很明显,螺旋波具有TE(横向电)模式特征。图 1 中绘制了 m = +1 模式的螺旋波电场和磁场模式。该图显示了螺旋设备的场分量,其参数如表 1 所列。磁场和磁场的对称模式电场如图 1 所示。

    +

    +

    图 1. 在垂直于直流磁场的平面中,螺旋波 m = +1 时的磁力线(实线)和电场线(虚线)图案。

    +

    +

    表 1. 螺旋等离子体源的参数。

    +

    这些结果是根据理论模型得出的,在此分析中忽略了天线的当前端口及其影响。当前端口的影响无法使用分析方法进行研究,而是使用下一节中的 COMSOL Multiphysics 5.3 软件进行分析。

    +

    3 设计与仿真

    对两种类型的天线(具有一组电流端口的常见名古屋天线和具有两组对称端口的天线)产生的电磁波的磁场和电场模式进行了仿真。仿真实验是在相同的理论模型和系统参数下进行的,如表1所示。

    +

    我们最初想法的精髓是螺旋等离子体源天线的新配置,旨在修改天线的性能并增加等离子体密度。由于普通名古屋天线中的电流端口效应,螺旋源中磁场和电场图案的对称性被打破。图2(a)示出了具有当前一组端口的普通名古屋天线的示意图。在从天线轴中心点经过的(x-y)平面中,螺旋波相对于 y 轴的磁场大小如图 2(b)所示。此外,在图 2(c) 中,对模式 m = +1 模拟了这种常见名古屋天线的螺旋波模式。图2(b,c)表明螺旋波图案的电场和磁场的对称性已经消失。

    +

    (a)

    +

    (b)

    +

    (c)

    +

    图 2. (a) 普通名古屋天线,(b) 螺旋波磁场强度,(c) 螺旋波图案电场和磁场的对称性。

    +

    (a)

    +

    (b)

    +

    (c)

    +

    图 3. (a) 提议的天线(两组电流端口),(b) 螺旋波的磁场强度(提议的天线),(c) 螺旋波的电场和磁场的对称性模式(建议的天线)。

    +

    另一方面,图 3(a) 展示了具有两组当前端口的改进天线的示意图。对于与图 2 相同的条件,我们提出的模式 m = +1 的天线的螺旋波磁场大小以及螺旋波方向图的电场和磁场方向图 s 绘制在图 3(b, c) 分别。

    +

    (a)

    +

    (b)

    +

    图 4。(a) 普通天线的电磁场方向图(z = L/2(L 是天线长度)),(b) 普通天线的电磁场方向图(z = L(L 是天线长度))。

    +

    值得一提的是,在所有上述图中,坐标系的选择使得 z 轴与天线和暗室的轴重合。仿真结果表明,新改进的天线产生的螺旋波图是对称的,正如预期的那样。换句话说,使用位于第一电流端口正对面的额外两个电流端口可以消除螺旋波图案中第一电流端口的失真效应。

    +

    图 4 和图 5 显示了具有一组端口的普通天线 (4a,b) 和我们的改进天线(图 5a,b)的两个不同横截面中螺旋波的电磁场方向图。图 4(a) 和 5(a) 是在穿过天线轴 z = L/2(L 是天线长度)中心点的平面上绘制的。面板 2(a,b) 绘制在通过端点 z = L 处的天线轴的平面中。我们提出的天线的电磁场方向图的对称性和普通天线的电磁场方向图的不对称性(具有一组电流端口)在图 4 和图 5 的所有不同横截面中都很明显。

    +

    螺旋波的电场和磁场的对称性导致吸收功率和等离子体密度的增加。普通名古屋天线和我们改进的天线系统的功率吸收密度、等离子体密度和饱和时间分别绘制在图6(a-c)和(7a-c)中。

    +

    (a)

    +

    (b)

    +

    图 5. (a) 我们提出的天线的电磁场方向图(z = L/2(L 是天线长度)),(b) 我们提出的天线的电磁场方向图(z = L(L 是天线长度)) 。

    +

    根据图6(a,b),我们改进的两组电流端口天线的功率吸收密度和等离子体密度是普通名古屋天线的一组电流端口的两倍。

    +

    在存在轴向磁场的情况下,带电粒子轨迹是对称的螺旋线。另一方面,对于粒子和波之间的强耦合,螺旋波形必须是螺旋(Miljak & Chen 1998)。在我们的工作中,该波是由名古屋天线引起的。螺旋波的磁场和电场分量模式(在没有电流端口效应的情况下)显示偶极子对称性。可以使天线在固定z处产生的电场随时间旋转。如图 2、4 和 6 所示,天线一侧存在一组电流端口会破坏波场方向图的偶极子对称性。波场分量的不对称导致带电粒子在错误的方向和时间上加速或减速。因此,粒子轨迹偏离对称螺旋的形式,与相对于螺旋波异相旋转的粒子相同。结果,螺旋波与带电粒子的耦合减弱,波粒能量交换减少。另一方面,我们在图3、图5和图7中的仿真结果表明,通过使用两组对称的电流端口,螺旋波场分量的不对称性得到了显着改善。因此,期望粒子通过螺旋波场分量在适当的方向、时间和空间上加速/减速。结果,螺旋波和带电粒子强烈耦合,波粒能量交换增加。

    +

    (a)

    +

    (b)

    +

    (c)

    +

    图 6。(a) 功率吸收密度(普通名古屋天线),(b) 等离子体密度(普通名古屋天线),(c) 普通名古屋天线系统的饱和时间。

    +

    (a)

    +

    (b)

    +

    (c)

    +

    图 7。(a) 功率吸收密度(建议的天线),(b) 等离子体密度(建议的天线),(c) 我们改进的天线(建议​​的天线)系统的饱和时间。

    +

    COMSOL 软件采用的模型通过以下一组碰撞类型研究氩等离子体化学;弹性、激发、直接电离和逐步电离。该模型还涉及彭宁电离和亚稳态猝灭。1 这些碰撞和反应列于表 2 中。

    +

    正如 COMSOL 软件帮助中提到的(参见脚注 1),逐步电离(反应 5)在维持低压氩气放电方面可以发挥重要作用。激发态的氩原子通过与电子的超弹性碰撞、中性氩原子猝灭、电离或潘宁电离而被消耗,其中两个亚稳态氩原子反应形成中性氩原子、氩离子和电子。 7 号反应负责气体的加热。当激发的亚稳态淬灭时,用于产生电子激发的氩原子的 11.5 eV 能量将作为热能返回到气体中。除了体积反应之外,还执行以下表面反应,如表 3 所示:

    +

    +

    表 2. 模拟的碰撞和反应表(参见脚注 1)。

    +

    +

    表 3. 表面反应表(参见脚注 1)。

    +

    当亚稳态氩原子与壁接触时,它以一定的概率(粘附系数)恢复到基态氩原子(见脚注1)。然而,螺旋等离子体放电过程是通过使用常见的名古屋天线和我们提出的天线来模拟的。普通名古屋天线和我们提出的天线的电子密度(等离子体密度)的变化分别以三维表示形式显示在图8(a)和图9(a)中。模拟结果(图 8a 和 9a)估计普通名古屋天线的螺旋等离子体放电的最大电子密度约为 1.7 × 1018 m−3,我们提出的天线约为 3 × 1018 m−3。此外,对于图8(b)和9(b)中的两种情况,沿着对称轴(天线轴)表示电子密度的变化。这些图表示两种情况沿天线轴的空间电子密度分布。这些结果的比较表明,两种情况下空间电子密度分布的形式没有不同,并且类似于高斯函数。然而,很明显,使用我们提出的天线,最大电子密度增加了大约百分之一百。使用常见的名古屋天线图 8(c) 和我们提出的天线图 9(c) 绘制了电子温度沿对称轴(天线轴)的变化。这些数字表明,在普通名古屋天线和我们提出的天线的情况下,电子可以分别达到约 2.9 和 2.5 eV 的能量。这些模拟结果与文献中先前的报告非常吻合(Chen 1996;Sudit & Chen 1996;Chen & Boswell 1997;Braginskii, Vasil’eva & Kovalev 2001;Navarro-Cavallé et al. 2018;Lee et al. 2011) 。

    +

    (a)

    +

    (b)

    +

    (c)

    +

    图 8. 沿天线轴(普通名古屋天线)绘制的三维电子密度变化 (a)、一维电子密度变化 (b) 和电子温度变化 (c)。

    +

    在许多实验工作中(Light & Chen 1995;Sudit & Chen 1996;Miljak & Chen 1998)等离子体密度的下游峰值沿着螺旋源中的天线轴出现(在存在均匀静磁场的情况下) 。 Sudit & Chen (1996) 中的压力平衡解释了下游密度峰值。在该参考文献中,电子运动方程的 z 分量表示为:

    +

    (3.1)

    +

    其中 n、Ez、K、Te、uz、vm 和 m 分别是等离子体密度、电场的 z 分量、玻尔兹曼常数、电子温度、电子流体速度、动量传递的电子碰撞频率和电子质量。正如该参考文献中提到的,实际上碰撞项小得可以忽略不计。因此,在给定 Te(z) 和 Ez(z) 剖面的情况下,该方程显示了压力平衡所需的下游密度峰值(Sudit & Chen 1996)。

    +

    但我们认为,实际中静磁场不可能完全均匀。等离子体密度的下游峰值应该用静磁场径向分量存在时的压力平衡来解释。

    +

    (a)

    +

    (b)

    +

    (c)

    +

    图 9. 沿着天线轴绘制的电子密度在三个维度 (a)、一维 (b) 和电子温度 (c) 的变化(建议的天线)。

    +

    事实上,洛伦兹力的轴向分量(由等离子体电流的方位角分量 (Jθ ) 和静磁场的径向分量的叉积产生)可以沿压力平衡方向移动压力平衡的位置。放电管并沿着天线的轴移动等离子体密度的峰值。在我们的工作中,为了减少仿真运行时间,系统在精确均匀的静态磁场(沿着系统的对称轴)存在的情况下进行仿真。结果,洛伦兹力的轴向分量消失,等离子体密度峰值出现在天线区域,如图8和图9所示。这个想法可能与ICP报道的实验数据一致。系统。密度峰值出现在 ICP(感应耦合等离子体)系统的天线区域(Sudit & Chen 1996)。

    +

    如上所述,我们提出的改进天线的对称性提供了具有对称电场和磁场模式的螺旋波。在这方面,七个螺旋等离子体源装置的结果和数据在参考文献Light & Chen (1995)、Chen (1996)、Molvik 等人中报道。 (1996),郭等人。 (1999),同振等人。 (2001),陈等人。 (2006),李等人。 (2011),进行了研究。根据这些器件的参数,分别采用普通名古屋天线的一组电流端口和我们的改进型天线的两组电流端口对这七种器件进行了仿真分析。为了验证我们的模拟结果,将这些设备的实验报告结果与我们从这些设备的模拟中获得的结果进行比较。该比较表明,根据实验结果报告的这些装置的等离子体电子密度与通过模拟实验估计的等离子体密度平均相差约15%。因此,这种比较表明我们的模拟结果是可靠的并且是一个很好的近似值。表 4 列出了这些设备的参数、报告的产生电子密度的实验数据以及我们的模拟结果。在此表中,电子等离子体密度是文献中报道的实验结果(a 列),电子等离子体密度是通过我们使用具有一组电流端口的通用天线对设备进行模拟而获得的(b 列)并使用我们修改后的建议天线和两组当前端口(c 列)进行表示。

    +

    +

    图 10. 这七种设备的等离子体密度实验结果(蓝色)、我们使用普通天线(名古屋)的模拟结果(红色)以及使用我们改进的天线的模拟结果(绿色)。

    +

    如表 4 所示,仿真结果表明,所报告的实验结果证实了我们对具有一组当前端口的普通天线的仿真结果。此外,模拟结果表明,与使用普通天线相比,使用我们提出的天线和两组电流端口,在所有情况下都能增加螺旋源的等离子体密度,平均约增加 40%。这七个设备的实验结果(蓝色)、我们使用普通天线(名古屋)的模拟结果(红色)和使用我们改进的天线的模拟结果(绿色)的等离子体密度绘制在图 10 中。绿色柱上的黑色箭头代表使用我们建议的天线相对于这七个设备报告的实验数据的等离子体密度增量(以百分比表示)。

    +

    结论

    在本文中,使用标准 COMSOL Multiphysics 5.3 软件对螺旋等离子体源进行了模拟和分析。此外,模拟中还包含 0.001 eV 至 1 MeV 能量的所有参数以及与横截面的相互作用。仿真结果表明,具有一组电流端口的普通名古屋天线产生电场和磁场不对称模式的螺旋波。提出了一种具有两组电流端口的新型改进天线,以减轻电流端口对波形的干扰影响。研究发现,普通名古屋天线采用两组对称的电流端口,可以显着改善螺旋波场分量的不对称性。因此,期望粒子通过螺旋波场分量在适当的方向、时间和空间上加速/减速。结果,螺旋波和带电粒子强烈耦合,波粒能量交换增加。分析表明,与报告的实验结果以及具有一组当前端口的常见天线模拟结果(名古屋)相比,使用我们的改进天线,等离子体密度和功率吸收平均增加了约 40%。这一事实表明电磁波图案的对称性对于提高功率吸收率以及等离子体密度起着至关重要的作用。

    +

    +
    Author: SHYEE
    Link: http://example.com/2023/08/29/Design-of-a-novel-high-efficiency-antenna-for-helicon-plasma-sources/
    Copyright Notice: All articles in this blog are licensed under CC BY-NC-SA 4.0 unless stating additionally.
    \ No newline at end of file diff --git a/404.html b/404.html new file mode 100644 index 0000000..1123a58 --- /dev/null +++ b/404.html @@ -0,0 +1,159 @@ +Page not found | SHYEE-PLASMA + + + + + + + +
    Page not found

    404

    Page Not Found
    \ No newline at end of file diff --git a/about/index.html b/about/index.html new file mode 100644 index 0000000..090a2df --- /dev/null +++ b/about/index.html @@ -0,0 +1,219 @@ +about | SHYEE-PLASMA + + + + + + + + + + + +

    关于这个网站
    新建的网站
    写点笔记用
    关于我

    +

    个人说明


    +

    中级软件设计师

    +

    英语水平:CET-6(500)

    +

    邮箱:eshyee@foxmail.com

    +

    本科专业:计算机科学与技术

    +

    研究生方向:螺旋波等离子体

    +

    出生日期:1999.02.21

    +
    +

    教育背景

    2017.09-2021.06 陇东学院 计算机科学与技术
    2022.09-2025.06 北京印刷学院 材料科学与工程

    +

    实习和工作经历

    2017.10-2018.09 陇东学院信息工程学院团总支学生分会 宣传部干事

    +

    微信公众号运营,宣传视频、海报制作。

    +

    2018.09-2019.09 陇东学院信息工程学院团总支学生分会 新媒体主任

    +

    制定新媒体部门创立和发展方案, 管理公众号运营状况,活动策划等。

    +

    2018.09-2019.10 陇东学院信息工程学院视频工作室 管理员

    +

    帮助教师制作竞赛用视频,学院活动视频录制等。

    +

    2019.10.11-10.21 西安云创公司 实习

    +

    担任小组组长,带领小组使用 html 和 css 完成了一个基本商业网站前端的页面设计。

    +

    2022.01.05-01.12 山东兴旺软件科技有限公司 后端开发

    +

    学习 JFinal 框架,并帮助技术经理完成需求。

    +

    项目经历

    (1)某社交旅游类网站开发

    +

    项目职务:全栈

    +

    项目概述: 实现用户对旅游动向的获取,注册并使用网站基础功能,如消息发布,用户之间点赞评论关注等

    +

    责任描述: 从需求分析到数据库设计,再到前后端代码实现 最初采用的 jsp+mvc 开发,数据库方面使用的 MySQL,服务器软件采用 tomcat。 设计了多个 bean 实现了简单的用户以及用户推送的增删改查。最近正 在整合项目准备使用 jFinal 框架进行重构,并部署在个人服务器上。

    +

    (2)个人网站开发

    +

    项目职务: 全栈

    +

    项目描述: 简单的个人网站搭建,使用到 Ajax,实现分布式开发。数据库方面使用了 MySQL,设计了一些个 触发器。 自己购买并部署了服务器,了解了 centOS 服务器相关部署。后来将整个项目改为静态项目,使用 hexo 作为引擎。

    +

    (3)校园二手交易平台开发

    +

    项目职务: 后端

    +

    责任描述: 使用 SpringBoot,基于 jsp+ssm+mysql 的开发。 实现交易平台产品发布,交易,管理,用户基 本操作等基本功能。

    +

    (4)个人电商平台

    +

    项目职务: 全栈

    +

    责任描述: 使用 SpringBoot,前端使用 vue,中间件依旧是 springMVC,服务器采用 undertow。 该项目是 近期正在制作中的,实现了基本的商品展示和用户登录和管理,正在准备整合 redis 实现访问量等功能。

    +

    项目(5)利用机器学习对螺旋波等离子体放电规律进行拟合与预测

    +

    项目职务:数据处理
    责任描述:对实验获得的数据进行归一化,然后利用传统机器学习(decision tree/Polynomial)和深度学习(keras)对螺旋波等离子体电子密度和功率进行非线性拟合和预测,找出其中几种模式跳变的功率值,预测更大功率下的电子密度。

    +

    专业技能

    等离子体及螺旋波等离子体基本理论
    对COMSOL建模有一定了解
    对使用机器学习对螺旋波等离子体进行预测有一定了解
    熟悉Java、python语言
    了解C 语言
    了解 SpringMVC、Springboot、JFinal 框架使用
    有一定的数据结构和操作系统理论基础
    有数据库设计经验

    +

    额外技能

    了解 Linux、Windows sever 的安装配置与操作
    掌握编写 SQL 语句,有 Oracle 使用经验,熟悉 PL/SQL 块
    了解计算机网络以及操作系统相关知识
    有 html/CSS 设计经历
    了解近些年的电子产品与硬件信息
    熟悉 PR PS AE
    了解 Ableton 以及 FL Studio使用
    有标书制作及竞标经历。

    +

    校园及荣誉证书

    计算机水平考试二级 C 语言证书

    +

    软件设计师

    +

    年度优秀共青团员

    +

    青马工程结业证

    +

    数学竞赛校赛三等奖

    +

    学院新媒体主任聘书

    +

    校优秀新媒体人获奖证书

    +

    西安云创公司实习优秀学员证书

    +

    其他院级证书若干

    +

    北京印刷学院入学奖学金

    +
    \ No newline at end of file diff --git a/archives/2020/02/index.html b/archives/2020/02/index.html new file mode 100644 index 0000000..02a9202 --- /dev/null +++ b/archives/2020/02/index.html @@ -0,0 +1,168 @@ +二月 2020 | SHYEE-PLASMA + + + + + + + +
    \ No newline at end of file diff --git a/archives/2020/03/index.html b/archives/2020/03/index.html new file mode 100644 index 0000000..8481df8 --- /dev/null +++ b/archives/2020/03/index.html @@ -0,0 +1,168 @@ +三月 2020 | SHYEE-PLASMA + + + + + + + +
    \ No newline at end of file diff --git a/archives/2020/03/page/2/index.html b/archives/2020/03/page/2/index.html new file mode 100644 index 0000000..0e54222 --- /dev/null +++ b/archives/2020/03/page/2/index.html @@ -0,0 +1,168 @@ +三月 2020 | SHYEE-PLASMA + + + + + + + +
    Articles - 34
    2020
    单BSS实验
    单BSS实验
    单交换机小实验
    单交换机小实验
    工作分解结构
    工作分解结构
    备份与恢复
    备份与恢复
    LinearTable-6
    LinearTable-6
    LinearTable-5
    LinearTable-5
    Oracle系列学习(三)
    Oracle系列学习(三)
    LinearTable-4
    LinearTable-4
    LinearTable-3
    LinearTable-3
    MyBatis系列(五)
    MyBatis系列(五)
    \ No newline at end of file diff --git a/archives/2020/03/page/3/index.html b/archives/2020/03/page/3/index.html new file mode 100644 index 0000000..bf4bc73 --- /dev/null +++ b/archives/2020/03/page/3/index.html @@ -0,0 +1,168 @@ +三月 2020 | SHYEE-PLASMA + + + + + + + +
    Articles - 34
    2020
    MyBatis系列(四)
    MyBatis系列(四)
    LinearTable-2
    LinearTable-2
    PSTN和以太网互连实验
    PSTN和以太网互连实验
    python入门
    python入门
    python入门2
    python入门2
    python入门3
    python入门3
    做根网线
    做根网线
    LinearTable
    LinearTable
    MAVEN
    MAVEN
    mybatis缓存
    mybatis缓存
    \ No newline at end of file diff --git a/archives/2020/03/page/4/index.html b/archives/2020/03/page/4/index.html new file mode 100644 index 0000000..96caa3d --- /dev/null +++ b/archives/2020/03/page/4/index.html @@ -0,0 +1,168 @@ +三月 2020 | SHYEE-PLASMA + + + + + + + +
    Articles - 34
    2020
    Oracle系列学习(二)
    Oracle系列学习(二)
    关于土豆🥔
    关于土豆🥔
    MyBatis系列(三)
    MyBatis系列(三)
    上海之行
    上海之行
    \ No newline at end of file diff --git a/archives/2020/04/index.html b/archives/2020/04/index.html new file mode 100644 index 0000000..06db11c --- /dev/null +++ b/archives/2020/04/index.html @@ -0,0 +1,168 @@ +四月 2020 | SHYEE-PLASMA + + + + + + + +
    Articles - 11
    2020
    Spring注解开发
    Spring注解开发
    Queue
    Queue
    Redis
    Redis
    需求分析
    需求分析
    Golang
    Golang
    eclipse如何配置Spring
    eclipse如何配置Spring
    MyBatis(八)
    MyBatis(八)
    MySQL进阶
    MySQL进阶
    MyBatis系列
    MyBatis系列
    MyBatis进阶小练习
    MyBatis进阶小练习
    \ No newline at end of file diff --git a/archives/2020/04/page/2/index.html b/archives/2020/04/page/2/index.html new file mode 100644 index 0000000..c33abcc --- /dev/null +++ b/archives/2020/04/page/2/index.html @@ -0,0 +1,168 @@ +四月 2020 | SHYEE-PLASMA + + + + + + + +
    Articles - 11
    2020
    mysql的一点东西
    mysql的一点东西
    \ No newline at end of file diff --git a/archives/2020/index.html b/archives/2020/index.html new file mode 100644 index 0000000..7935e2c --- /dev/null +++ b/archives/2020/index.html @@ -0,0 +1,168 @@ +2020 | SHYEE-PLASMA + + + + + + + +
    Articles - 52
    2020
    Spring注解开发
    Spring注解开发
    Queue
    Queue
    Redis
    Redis
    需求分析
    需求分析
    Golang
    Golang
    eclipse如何配置Spring
    eclipse如何配置Spring
    MyBatis(八)
    MyBatis(八)
    MySQL进阶
    MySQL进阶
    MyBatis系列
    MyBatis系列
    MyBatis进阶小练习
    MyBatis进阶小练习
    \ No newline at end of file diff --git a/archives/2020/page/2/index.html b/archives/2020/page/2/index.html new file mode 100644 index 0000000..3457f67 --- /dev/null +++ b/archives/2020/page/2/index.html @@ -0,0 +1,168 @@ +2020 | SHYEE-PLASMA + + + + + + + +
    \ No newline at end of file diff --git a/archives/2020/page/3/index.html b/archives/2020/page/3/index.html new file mode 100644 index 0000000..2d6cd7e --- /dev/null +++ b/archives/2020/page/3/index.html @@ -0,0 +1,168 @@ +2020 | SHYEE-PLASMA + + + + + + + +
    Articles - 52
    2020
    写出这个数
    写出这个数
    单BSS实验
    单BSS实验
    单交换机小实验
    单交换机小实验
    工作分解结构
    工作分解结构
    备份与恢复
    备份与恢复
    LinearTable-6
    LinearTable-6
    LinearTable-5
    LinearTable-5
    Oracle系列学习(三)
    Oracle系列学习(三)
    LinearTable-4
    LinearTable-4
    LinearTable-3
    LinearTable-3
    \ No newline at end of file diff --git a/archives/2020/page/4/index.html b/archives/2020/page/4/index.html new file mode 100644 index 0000000..2defdc0 --- /dev/null +++ b/archives/2020/page/4/index.html @@ -0,0 +1,168 @@ +2020 | SHYEE-PLASMA + + + + + + + +
    Articles - 52
    2020
    MyBatis系列(五)
    MyBatis系列(五)
    MyBatis系列(四)
    MyBatis系列(四)
    LinearTable-2
    LinearTable-2
    PSTN和以太网互连实验
    PSTN和以太网互连实验
    python入门
    python入门
    python入门2
    python入门2
    python入门3
    python入门3
    做根网线
    做根网线
    LinearTable
    LinearTable
    MAVEN
    MAVEN
    \ No newline at end of file diff --git a/archives/2020/page/5/index.html b/archives/2020/page/5/index.html new file mode 100644 index 0000000..96ba0b7 --- /dev/null +++ b/archives/2020/page/5/index.html @@ -0,0 +1,168 @@ +2020 | SHYEE-PLASMA + + + + + + + +
    Articles - 52
    2020
    mybatis缓存
    mybatis缓存
    Oracle系列学习(二)
    Oracle系列学习(二)
    关于土豆🥔
    关于土豆🥔
    MyBatis系列(三)
    MyBatis系列(三)
    上海之行
    上海之行
    MyBatis系列(二.5)
    MyBatis系列(二.5)
    CentOS7.3安装MySQL8
    CentOS7.3安装MySQL8
    MyBatis系列(二)
    MyBatis系列(二)
    Oracle系列学习(一)
    Oracle系列学习(一)
    PL/SQL
    PL/SQL
    \ No newline at end of file diff --git a/archives/2020/page/6/index.html b/archives/2020/page/6/index.html new file mode 100644 index 0000000..7690855 --- /dev/null +++ b/archives/2020/page/6/index.html @@ -0,0 +1,168 @@ +2020 | SHYEE-PLASMA + + + + + + + +
    Articles - 52
    2020
    MyBatis安装
    MyBatis安装
    终于闲下来,说一说我建Blog之路
    终于闲下来,说一说我建Blog之路
    \ No newline at end of file diff --git a/archives/2021/01/index.html b/archives/2021/01/index.html new file mode 100644 index 0000000..81dcba5 --- /dev/null +++ b/archives/2021/01/index.html @@ -0,0 +1,168 @@ +一月 2021 | SHYEE-PLASMA + + + + + + + +
    Articles - 1
    2021
    Spring 入门
    Spring 入门
    \ No newline at end of file diff --git a/archives/2021/02/index.html b/archives/2021/02/index.html new file mode 100644 index 0000000..609e349 --- /dev/null +++ b/archives/2021/02/index.html @@ -0,0 +1,168 @@ +二月 2021 | SHYEE-PLASMA + + + + + + + +
    Articles - 6
    2021
    Spring - MyBatis
    Spring - MyBatis
    SSM
    SSM
    Spring web 开发
    Spring web 开发
    Spring
    Spring
    SpringMVC
    SpringMVC
    Springboot
    Springboot
    \ No newline at end of file diff --git a/archives/2021/03/index.html b/archives/2021/03/index.html new file mode 100644 index 0000000..dd87b46 --- /dev/null +++ b/archives/2021/03/index.html @@ -0,0 +1,168 @@ +三月 2021 | SHYEE-PLASMA + + + + + + + +
    Articles - 12
    2021
    机器学习
    机器学习
    计算机操作系统
    计算机操作系统
    Bean的作用域
    Bean的作用域
    C++小tips
    C++小tips
    Docker
    Docker
    Docker常用命令
    Docker常用命令
    离散数学
    离散数学
    视图
    视图
    计算机组成原理
    计算机组成原理
    计算机操作系统(2)
    计算机操作系统(2)
    \ No newline at end of file diff --git a/archives/2021/03/page/2/index.html b/archives/2021/03/page/2/index.html new file mode 100644 index 0000000..f753f2a --- /dev/null +++ b/archives/2021/03/page/2/index.html @@ -0,0 +1,168 @@ +三月 2021 | SHYEE-PLASMA + + + + + + + +
    Articles - 12
    2021
    项目预算
    项目预算
    面向对象方法学
    面向对象方法学
    \ No newline at end of file diff --git a/archives/2021/index.html b/archives/2021/index.html new file mode 100644 index 0000000..ce8a2de --- /dev/null +++ b/archives/2021/index.html @@ -0,0 +1,168 @@ +2021 | SHYEE-PLASMA + + + + + + + +
    Articles - 19
    2021
    机器学习
    机器学习
    计算机操作系统
    计算机操作系统
    Bean的作用域
    Bean的作用域
    C++小tips
    C++小tips
    Docker
    Docker
    Docker常用命令
    Docker常用命令
    离散数学
    离散数学
    视图
    视图
    计算机组成原理
    计算机组成原理
    计算机操作系统(2)
    计算机操作系统(2)
    \ No newline at end of file diff --git a/archives/2021/page/2/index.html b/archives/2021/page/2/index.html new file mode 100644 index 0000000..5c16215 --- /dev/null +++ b/archives/2021/page/2/index.html @@ -0,0 +1,168 @@ +2021 | SHYEE-PLASMA + + + + + + + +
    Articles - 19
    2021
    项目预算
    项目预算
    面向对象方法学
    面向对象方法学
    Spring - MyBatis
    Spring - MyBatis
    SSM
    SSM
    Spring web 开发
    Spring web 开发
    Spring
    Spring
    SpringMVC
    SpringMVC
    Springboot
    Springboot
    Spring 入门
    Spring 入门
    \ No newline at end of file diff --git a/archives/2023/05/index.html b/archives/2023/05/index.html new file mode 100644 index 0000000..333a90c --- /dev/null +++ b/archives/2023/05/index.html @@ -0,0 +1,168 @@ +五月 2023 | SHYEE-PLASMA + + + + + + + +
    \ No newline at end of file diff --git a/archives/2023/06/index.html b/archives/2023/06/index.html new file mode 100644 index 0000000..6501ccd --- /dev/null +++ b/archives/2023/06/index.html @@ -0,0 +1,168 @@ +六月 2023 | SHYEE-PLASMA + + + + + + + +
    \ No newline at end of file diff --git a/archives/2023/07/index.html b/archives/2023/07/index.html new file mode 100644 index 0000000..b4767e7 --- /dev/null +++ b/archives/2023/07/index.html @@ -0,0 +1,168 @@ +七月 2023 | SHYEE-PLASMA + + + + + + + +
    \ No newline at end of file diff --git a/archives/2023/08/index.html b/archives/2023/08/index.html new file mode 100644 index 0000000..f2acfa0 --- /dev/null +++ b/archives/2023/08/index.html @@ -0,0 +1,168 @@ +八月 2023 | SHYEE-PLASMA + + + + + + + +
    \ No newline at end of file diff --git a/archives/2023/index.html b/archives/2023/index.html new file mode 100644 index 0000000..afd1765 --- /dev/null +++ b/archives/2023/index.html @@ -0,0 +1,168 @@ +2023 | SHYEE-PLASMA + + + + + + + +
    \ No newline at end of file diff --git a/archives/2023/page/2/index.html b/archives/2023/page/2/index.html new file mode 100644 index 0000000..f2101fc --- /dev/null +++ b/archives/2023/page/2/index.html @@ -0,0 +1,168 @@ +2023 | SHYEE-PLASMA + + + + + + + +
    \ No newline at end of file diff --git a/archives/2023/page/3/index.html b/archives/2023/page/3/index.html new file mode 100644 index 0000000..07aee64 --- /dev/null +++ b/archives/2023/page/3/index.html @@ -0,0 +1,168 @@ +2023 | SHYEE-PLASMA + + + + + + + +
    \ No newline at end of file diff --git a/archives/index.html b/archives/index.html new file mode 100644 index 0000000..5a27bf2 --- /dev/null +++ b/archives/index.html @@ -0,0 +1,168 @@ +Archives | SHYEE-PLASMA + + + + + + + +
    \ No newline at end of file diff --git a/archives/page/10/index.html b/archives/page/10/index.html new file mode 100644 index 0000000..d4e2ab9 --- /dev/null +++ b/archives/page/10/index.html @@ -0,0 +1,168 @@ +Archives | SHYEE-PLASMA + + + + + + + +
    \ No newline at end of file diff --git a/archives/page/2/index.html b/archives/page/2/index.html new file mode 100644 index 0000000..27442d8 --- /dev/null +++ b/archives/page/2/index.html @@ -0,0 +1,168 @@ +Archives | SHYEE-PLASMA + + + + + + + +
    \ No newline at end of file diff --git a/archives/page/3/index.html b/archives/page/3/index.html new file mode 100644 index 0000000..91c7671 --- /dev/null +++ b/archives/page/3/index.html @@ -0,0 +1,168 @@ +Archives | SHYEE-PLASMA + + + + + + + +
    \ No newline at end of file diff --git a/archives/page/4/index.html b/archives/page/4/index.html new file mode 100644 index 0000000..0e9b5ba --- /dev/null +++ b/archives/page/4/index.html @@ -0,0 +1,168 @@ +Archives | SHYEE-PLASMA + + + + + + + +
    Articles - 97
    2021
    Docker
    Docker
    Docker常用命令
    Docker常用命令
    离散数学
    离散数学
    视图
    视图
    计算机组成原理
    计算机组成原理
    计算机操作系统(2)
    计算机操作系统(2)
    项目预算
    项目预算
    面向对象方法学
    面向对象方法学
    Spring - MyBatis
    Spring - MyBatis
    SSM
    SSM
    \ No newline at end of file diff --git a/archives/page/5/index.html b/archives/page/5/index.html new file mode 100644 index 0000000..386617c --- /dev/null +++ b/archives/page/5/index.html @@ -0,0 +1,168 @@ +Archives | SHYEE-PLASMA + + + + + + + +
    Articles - 97
    2021
    Spring web 开发
    Spring web 开发
    Spring
    Spring
    SpringMVC
    SpringMVC
    Springboot
    Springboot
    Spring 入门
    Spring 入门
    2020
    Spring注解开发
    Spring注解开发
    Queue
    Queue
    Redis
    Redis
    需求分析
    需求分析
    Golang
    Golang
    \ No newline at end of file diff --git a/archives/page/6/index.html b/archives/page/6/index.html new file mode 100644 index 0000000..a4e95ca --- /dev/null +++ b/archives/page/6/index.html @@ -0,0 +1,168 @@ +Archives | SHYEE-PLASMA + + + + + + + +
    \ No newline at end of file diff --git a/archives/page/7/index.html b/archives/page/7/index.html new file mode 100644 index 0000000..41d8e2e --- /dev/null +++ b/archives/page/7/index.html @@ -0,0 +1,168 @@ +Archives | SHYEE-PLASMA + + + + + + + +
    Articles - 97
    2020
    MyBatis系列(六)
    MyBatis系列(六)
    需求分析学习笔记-1
    需求分析学习笔记-1
    Heliogabalus的玫瑰
    Heliogabalus的玫瑰
    Stack
    Stack
    关于安装MyBatis
    关于安装MyBatis
    写出这个数
    写出这个数
    单BSS实验
    单BSS实验
    单交换机小实验
    单交换机小实验
    工作分解结构
    工作分解结构
    备份与恢复
    备份与恢复
    \ No newline at end of file diff --git a/archives/page/8/index.html b/archives/page/8/index.html new file mode 100644 index 0000000..00a25b3 --- /dev/null +++ b/archives/page/8/index.html @@ -0,0 +1,168 @@ +Archives | SHYEE-PLASMA + + + + + + + +
    Articles - 97
    2020
    LinearTable-6
    LinearTable-6
    LinearTable-5
    LinearTable-5
    Oracle系列学习(三)
    Oracle系列学习(三)
    LinearTable-4
    LinearTable-4
    LinearTable-3
    LinearTable-3
    MyBatis系列(五)
    MyBatis系列(五)
    MyBatis系列(四)
    MyBatis系列(四)
    LinearTable-2
    LinearTable-2
    PSTN和以太网互连实验
    PSTN和以太网互连实验
    python入门
    python入门
    \ No newline at end of file diff --git a/archives/page/9/index.html b/archives/page/9/index.html new file mode 100644 index 0000000..9b4c38f --- /dev/null +++ b/archives/page/9/index.html @@ -0,0 +1,168 @@ +Archives | SHYEE-PLASMA + + + + + + + +
    Articles - 97
    2020
    python入门2
    python入门2
    python入门3
    python入门3
    做根网线
    做根网线
    LinearTable
    LinearTable
    MAVEN
    MAVEN
    mybatis缓存
    mybatis缓存
    Oracle系列学习(二)
    Oracle系列学习(二)
    关于土豆🥔
    关于土豆🥔
    MyBatis系列(三)
    MyBatis系列(三)
    上海之行
    上海之行
    \ No newline at end of file diff --git a/categories/C/index.html b/categories/C/index.html new file mode 100644 index 0000000..05b1c17 --- /dev/null +++ b/categories/C/index.html @@ -0,0 +1,168 @@ +Category: C++ | SHYEE-PLASMA + + + + + + + +
    Category - C++
    2021
    C++小tips
    C++小tips
    \ No newline at end of file diff --git a/categories/Golang/index.html b/categories/Golang/index.html new file mode 100644 index 0000000..12073f6 --- /dev/null +++ b/categories/Golang/index.html @@ -0,0 +1,168 @@ +Category: Golang | SHYEE-PLASMA + + + + + + + +
    Category - Golang
    2020
    Golang
    Golang
    \ No newline at end of file diff --git a/categories/Java/index.html b/categories/Java/index.html new file mode 100644 index 0000000..7f1acb0 --- /dev/null +++ b/categories/Java/index.html @@ -0,0 +1,168 @@ +Category: Java | SHYEE-PLASMA + + + + + + + +
    Category - Java
    2021
    Bean的作用域
    Bean的作用域
    \ No newline at end of file diff --git "a/categories/MyBatis\347\263\273\345\210\227/index.html" "b/categories/MyBatis\347\263\273\345\210\227/index.html" new file mode 100644 index 0000000..906a29c --- /dev/null +++ "b/categories/MyBatis\347\263\273\345\210\227/index.html" @@ -0,0 +1,168 @@ +Category: MyBatis系列 | SHYEE-PLASMA + + + + + + + +
    Category - MyBatis系列
    2020
    MyBatis系列
    MyBatis系列
    MyBatis进阶小练习
    MyBatis进阶小练习
    关于安装MyBatis
    关于安装MyBatis
    mybatis缓存
    mybatis缓存
    MyBatis安装
    MyBatis安装
    \ No newline at end of file diff --git "a/categories/Oracle\347\263\273\345\210\227/index.html" "b/categories/Oracle\347\263\273\345\210\227/index.html" new file mode 100644 index 0000000..78123f2 --- /dev/null +++ "b/categories/Oracle\347\263\273\345\210\227/index.html" @@ -0,0 +1,168 @@ +Category: Oracle系列 | SHYEE-PLASMA + + + + + + + +
    Category - Oracle系列
    2020
    Oracle系列学习(五)
    Oracle系列学习(五)
    Oracle系列学习(四)
    Oracle系列学习(四)
    Oracle系列学习(三)
    Oracle系列学习(三)
    Oracle系列学习(二)
    Oracle系列学习(二)
    Oracle系列学习(一)
    Oracle系列学习(一)
    PL/SQL
    PL/SQL
    \ No newline at end of file diff --git a/categories/Spring/index.html b/categories/Spring/index.html new file mode 100644 index 0000000..7dd07dc --- /dev/null +++ b/categories/Spring/index.html @@ -0,0 +1,168 @@ +Category: Spring | SHYEE-PLASMA + + + + + + + +
    Category - Spring
    2021
    Spring - MyBatis
    Spring - MyBatis
    SSM
    SSM
    Spring web 开发
    Spring web 开发
    Spring
    Spring
    SpringMVC
    SpringMVC
    Springboot
    Springboot
    Spring 入门
    Spring 入门
    2020
    Spring注解开发
    Spring注解开发
    eclipse如何配置Spring
    eclipse如何配置Spring
    \ No newline at end of file diff --git a/categories/helicon/index.html b/categories/helicon/index.html new file mode 100644 index 0000000..d479663 --- /dev/null +++ b/categories/helicon/index.html @@ -0,0 +1,168 @@ +Category: helicon | SHYEE-PLASMA + + + + + + + +
    Category - helicon
    2023
    从零开始学习螺旋波等离子体
    从零开始学习螺旋波等离子体
    \ No newline at end of file diff --git a/categories/index.html b/categories/index.html new file mode 100644 index 0000000..3075457 --- /dev/null +++ b/categories/index.html @@ -0,0 +1,170 @@ +分类 | SHYEE-PLASMA + + + + + + + + + +
    \ No newline at end of file diff --git a/categories/plasma/index.html b/categories/plasma/index.html new file mode 100644 index 0000000..7d2f50e --- /dev/null +++ b/categories/plasma/index.html @@ -0,0 +1,168 @@ +Category: plasma | SHYEE-PLASMA + + + + + + + +
    Category - plasma
    2023
    等离子体前置知识
    等离子体前置知识
    \ No newline at end of file diff --git a/categories/python/index.html b/categories/python/index.html new file mode 100644 index 0000000..8e75b1f --- /dev/null +++ b/categories/python/index.html @@ -0,0 +1,168 @@ +Category: python | SHYEE-PLASMA + + + + + + + +
    Category - python
    2023
    学习pandas(从kaggle上)
    学习pandas(从kaggle上)
    2020
    python入门
    python入门
    python入门2
    python入门2
    python入门3
    python入门3
    \ No newline at end of file diff --git "a/categories/\344\273\277\347\234\237/index.html" "b/categories/\344\273\277\347\234\237/index.html" new file mode 100644 index 0000000..5cb17cd --- /dev/null +++ "b/categories/\344\273\277\347\234\237/index.html" @@ -0,0 +1,168 @@ +Category: 仿真 | SHYEE-PLASMA + + + + + + + +
    Category - 仿真
    2023
    使用comsol仿真ICP
    使用comsol仿真ICP
    \ No newline at end of file diff --git "a/categories/\345\256\236\351\252\214/index.html" "b/categories/\345\256\236\351\252\214/index.html" new file mode 100644 index 0000000..533d72d --- /dev/null +++ "b/categories/\345\256\236\351\252\214/index.html" @@ -0,0 +1,168 @@ +Category: 实验 | SHYEE-PLASMA + + + + + + + +
    Category - 实验
    2023
    如何关306的水气
    如何关306的水气
    \ No newline at end of file diff --git "a/categories/\346\200\273\347\273\223/index.html" "b/categories/\346\200\273\347\273\223/index.html" new file mode 100644 index 0000000..d26ebae --- /dev/null +++ "b/categories/\346\200\273\347\273\223/index.html" @@ -0,0 +1,168 @@ +Category: 总结 | SHYEE-PLASMA + + + + + + + +
    Category - 总结
    2023
    20230514周总结
    20230514周总结
    \ No newline at end of file diff --git "a/categories/\346\212\200\346\234\257/MyBatis/index.html" "b/categories/\346\212\200\346\234\257/MyBatis/index.html" new file mode 100644 index 0000000..ec38b71 --- /dev/null +++ "b/categories/\346\212\200\346\234\257/MyBatis/index.html" @@ -0,0 +1,168 @@ +Category: MyBatis | SHYEE-PLASMA + + + + + + + +
    Category - MyBatis
    2020
    MyBatis(八)
    MyBatis(八)
    \ No newline at end of file diff --git "a/categories/\346\212\200\346\234\257/MyBatis\347\263\273\345\210\227/index.html" "b/categories/\346\212\200\346\234\257/MyBatis\347\263\273\345\210\227/index.html" new file mode 100644 index 0000000..13cb546 --- /dev/null +++ "b/categories/\346\212\200\346\234\257/MyBatis\347\263\273\345\210\227/index.html" @@ -0,0 +1,168 @@ +Category: MyBatis系列 | SHYEE-PLASMA + + + + + + + +
    Category - MyBatis系列
    2020
    MyBatis系列(七)
    MyBatis系列(七)
    MyBatis系列(六)
    MyBatis系列(六)
    MyBatis系列(五)
    MyBatis系列(五)
    MyBatis系列(四)
    MyBatis系列(四)
    MyBatis系列(三)
    MyBatis系列(三)
    MyBatis系列(二.5)
    MyBatis系列(二.5)
    MyBatis系列(二)
    MyBatis系列(二)
    \ No newline at end of file diff --git "a/categories/\346\212\200\346\234\257/index.html" "b/categories/\346\212\200\346\234\257/index.html" new file mode 100644 index 0000000..00df6ef --- /dev/null +++ "b/categories/\346\212\200\346\234\257/index.html" @@ -0,0 +1,168 @@ +Category: 技术 | SHYEE-PLASMA + + + + + + + +
    Category - 技术
    2021
    计算机操作系统
    计算机操作系统
    2020
    需求分析
    需求分析
    MyBatis(八)
    MyBatis(八)
    MyBatis系列(七)
    MyBatis系列(七)
    MyBatis系列(六)
    MyBatis系列(六)
    MyBatis系列(五)
    MyBatis系列(五)
    MyBatis系列(四)
    MyBatis系列(四)
    MyBatis系列(三)
    MyBatis系列(三)
    MyBatis系列(二.5)
    MyBatis系列(二.5)
    CentOS7.3安装MySQL8
    CentOS7.3安装MySQL8
    \ No newline at end of file diff --git "a/categories/\346\212\200\346\234\257/page/2/index.html" "b/categories/\346\212\200\346\234\257/page/2/index.html" new file mode 100644 index 0000000..c78fd46 --- /dev/null +++ "b/categories/\346\212\200\346\234\257/page/2/index.html" @@ -0,0 +1,168 @@ +Category: 技术 | SHYEE-PLASMA + + + + + + + +
    Category - 技术
    2020
    MyBatis系列(二)
    MyBatis系列(二)
    终于闲下来,说一说我建Blog之路
    终于闲下来,说一说我建Blog之路
    \ No newline at end of file diff --git "a/categories/\346\212\200\346\234\257/\345\273\272\347\253\231\344\271\213\350\267\257/index.html" "b/categories/\346\212\200\346\234\257/\345\273\272\347\253\231\344\271\213\350\267\257/index.html" new file mode 100644 index 0000000..690fa22 --- /dev/null +++ "b/categories/\346\212\200\346\234\257/\345\273\272\347\253\231\344\271\213\350\267\257/index.html" @@ -0,0 +1,168 @@ +Category: 建站之路 | SHYEE-PLASMA + + + + + + + +
    Category - 建站之路
    2020
    CentOS7.3安装MySQL8
    CentOS7.3安装MySQL8
    终于闲下来,说一说我建Blog之路
    终于闲下来,说一说我建Blog之路
    \ No newline at end of file diff --git "a/categories/\346\212\200\346\234\257/\346\223\215\344\275\234\347\263\273\347\273\237/index.html" "b/categories/\346\212\200\346\234\257/\346\223\215\344\275\234\347\263\273\347\273\237/index.html" new file mode 100644 index 0000000..3be6ea3 --- /dev/null +++ "b/categories/\346\212\200\346\234\257/\346\223\215\344\275\234\347\263\273\347\273\237/index.html" @@ -0,0 +1,168 @@ +Category: 操作系统 | SHYEE-PLASMA + + + + + + + +
    Category - 操作系统
    2021
    计算机操作系统
    计算机操作系统
    \ No newline at end of file diff --git "a/categories/\346\223\215\344\275\234\347\263\273\347\273\237/index.html" "b/categories/\346\223\215\344\275\234\347\263\273\347\273\237/index.html" new file mode 100644 index 0000000..3f6fc6b --- /dev/null +++ "b/categories/\346\223\215\344\275\234\347\263\273\347\273\237/index.html" @@ -0,0 +1,168 @@ +Category: 操作系统 | SHYEE-PLASMA + + + + + + + +
    Category - 操作系统
    2021
    计算机操作系统(2)
    计算机操作系统(2)
    \ No newline at end of file diff --git "a/categories/\346\225\260\345\255\246/index.html" "b/categories/\346\225\260\345\255\246/index.html" new file mode 100644 index 0000000..ae0296c --- /dev/null +++ "b/categories/\346\225\260\345\255\246/index.html" @@ -0,0 +1,168 @@ +Category: 数学 | SHYEE-PLASMA + + + + + + + +
    Category - 数学
    2021
    离散数学
    离散数学
    \ No newline at end of file diff --git "a/categories/\346\225\260\346\215\256\345\272\223/index.html" "b/categories/\346\225\260\346\215\256\345\272\223/index.html" new file mode 100644 index 0000000..2e8763b --- /dev/null +++ "b/categories/\346\225\260\346\215\256\345\272\223/index.html" @@ -0,0 +1,168 @@ +Category: 数据库 | SHYEE-PLASMA + + + + + + + +
    Category - 数据库
    2021
    视图
    视图
    2020
    Redis
    Redis
    MySQL进阶
    MySQL进阶
    mysql的一点东西
    mysql的一点东西
    \ No newline at end of file diff --git "a/categories/\346\225\260\346\215\256\347\273\223\346\236\204/index.html" "b/categories/\346\225\260\346\215\256\347\273\223\346\236\204/index.html" new file mode 100644 index 0000000..f56a4cf --- /dev/null +++ "b/categories/\346\225\260\346\215\256\347\273\223\346\236\204/index.html" @@ -0,0 +1,168 @@ +Category: 数据结构 | SHYEE-PLASMA + + + + + + + +
    Category - 数据结构
    2020
    LinearTable-6
    LinearTable-6
    LinearTable-5
    LinearTable-5
    LinearTable-4
    LinearTable-4
    LinearTable-3
    LinearTable-3
    LinearTable-2
    LinearTable-2
    LinearTable
    LinearTable
    \ No newline at end of file diff --git "a/categories/\346\226\207\347\214\256/index.html" "b/categories/\346\226\207\347\214\256/index.html" new file mode 100644 index 0000000..e9f7d03 --- /dev/null +++ "b/categories/\346\226\207\347\214\256/index.html" @@ -0,0 +1,168 @@ +Category: 文献 | SHYEE-PLASMA + + + + + + + +
    \ No newline at end of file diff --git "a/categories/\346\234\272\345\231\250\345\255\246\344\271\240/index.html" "b/categories/\346\234\272\345\231\250\345\255\246\344\271\240/index.html" new file mode 100644 index 0000000..0f86ab4 --- /dev/null +++ "b/categories/\346\234\272\345\231\250\345\255\246\344\271\240/index.html" @@ -0,0 +1,168 @@ +Category: 机器学习 | SHYEE-PLASMA + + + + + + + +
    Category - 机器学习
    2023
    记一个简单的人脸识别
    记一个简单的人脸识别
    记一个最基础的机器学习
    记一个最基础的机器学习
    2021
    机器学习
    机器学习
    \ No newline at end of file diff --git "a/categories/\346\240\210/index.html" "b/categories/\346\240\210/index.html" new file mode 100644 index 0000000..e71d2a0 --- /dev/null +++ "b/categories/\346\240\210/index.html" @@ -0,0 +1,168 @@ +Category: 栈 | SHYEE-PLASMA + + + + + + + +
    Category - 栈
    2020
    Stack
    Stack
    \ No newline at end of file diff --git "a/categories/\347\224\237\346\264\273/index.html" "b/categories/\347\224\237\346\264\273/index.html" new file mode 100644 index 0000000..4ed70ce --- /dev/null +++ "b/categories/\347\224\237\346\264\273/index.html" @@ -0,0 +1,168 @@ +Category: 生活 | SHYEE-PLASMA + + + + + + + +
    Category - 生活
    2020
    关于土豆🥔
    关于土豆🥔
    上海之行
    上海之行
    \ No newline at end of file diff --git "a/categories/\347\224\237\346\264\273/\346\227\205\350\241\214/index.html" "b/categories/\347\224\237\346\264\273/\346\227\205\350\241\214/index.html" new file mode 100644 index 0000000..08472eb --- /dev/null +++ "b/categories/\347\224\237\346\264\273/\346\227\205\350\241\214/index.html" @@ -0,0 +1,168 @@ +Category: 旅行 | SHYEE-PLASMA + + + + + + + +
    Category - 旅行
    2020
    上海之行
    上海之行
    \ No newline at end of file diff --git "a/categories/\347\224\237\346\264\273/\347\203\247\351\245\255/index.html" "b/categories/\347\224\237\346\264\273/\347\203\247\351\245\255/index.html" new file mode 100644 index 0000000..239c963 --- /dev/null +++ "b/categories/\347\224\237\346\264\273/\347\203\247\351\245\255/index.html" @@ -0,0 +1,168 @@ +Category: 烧饭 | SHYEE-PLASMA + + + + + + + +
    Category - 烧饭
    2020
    关于土豆🥔
    关于土豆🥔
    \ No newline at end of file diff --git "a/categories/\347\255\211\347\246\273\345\255\220\344\275\223/index.html" "b/categories/\347\255\211\347\246\273\345\255\220\344\275\223/index.html" new file mode 100644 index 0000000..6f87cbd --- /dev/null +++ "b/categories/\347\255\211\347\246\273\345\255\220\344\275\223/index.html" @@ -0,0 +1,168 @@ +Category: 等离子体 | SHYEE-PLASMA + + + + + + + +
    Category - 等离子体
    2023
    等离子体物理_pyk
    等离子体物理_pyk
    普林斯顿等离子体课
    普林斯顿等离子体课
    \ No newline at end of file diff --git "a/categories/\347\256\227\346\263\225/index.html" "b/categories/\347\256\227\346\263\225/index.html" new file mode 100644 index 0000000..ffe4454 --- /dev/null +++ "b/categories/\347\256\227\346\263\225/index.html" @@ -0,0 +1,168 @@ +Category: 算法 | SHYEE-PLASMA + + + + + + + +
    Category - 算法
    2020
    写出这个数
    写出这个数
    \ No newline at end of file diff --git "a/categories/\347\273\204\346\210\220\345\216\237\347\220\206/index.html" "b/categories/\347\273\204\346\210\220\345\216\237\347\220\206/index.html" new file mode 100644 index 0000000..a52516a --- /dev/null +++ "b/categories/\347\273\204\346\210\220\345\216\237\347\220\206/index.html" @@ -0,0 +1,168 @@ +Category: 组成原理 | SHYEE-PLASMA + + + + + + + +
    Category - 组成原理
    2021
    计算机组成原理
    计算机组成原理
    \ No newline at end of file diff --git "a/categories/\350\211\272\346\234\257/index.html" "b/categories/\350\211\272\346\234\257/index.html" new file mode 100644 index 0000000..1e7aa15 --- /dev/null +++ "b/categories/\350\211\272\346\234\257/index.html" @@ -0,0 +1,168 @@ +Category: 艺术 | SHYEE-PLASMA + + + + + + + +
    Category - 艺术
    2020
    Heliogabalus的玫瑰
    Heliogabalus的玫瑰
    \ No newline at end of file diff --git "a/categories/\350\256\241\347\256\227\346\234\272/index.html" "b/categories/\350\256\241\347\256\227\346\234\272/index.html" new file mode 100644 index 0000000..2cb8a30 --- /dev/null +++ "b/categories/\350\256\241\347\256\227\346\234\272/index.html" @@ -0,0 +1,168 @@ +Category: 计算机 | SHYEE-PLASMA + + + + + + + +
    Category - 计算机
    2021
    Docker
    Docker
    Docker常用命令
    Docker常用命令
    面向对象方法学
    面向对象方法学
    2020
    Queue
    Queue
    MAVEN
    MAVEN
    \ No newline at end of file diff --git "a/categories/\350\256\241\347\256\227\346\234\272\345\256\211\345\205\250/index.html" "b/categories/\350\256\241\347\256\227\346\234\272\345\256\211\345\205\250/index.html" new file mode 100644 index 0000000..dc85df1 --- /dev/null +++ "b/categories/\350\256\241\347\256\227\346\234\272\345\256\211\345\205\250/index.html" @@ -0,0 +1,168 @@ +Category: 计算机安全 | SHYEE-PLASMA + + + + + + + +
    Category - 计算机安全
    2020
    备份与恢复
    备份与恢复
    \ No newline at end of file diff --git "a/categories/\350\256\241\347\256\227\346\234\272\347\275\221\347\273\234/index.html" "b/categories/\350\256\241\347\256\227\346\234\272\347\275\221\347\273\234/index.html" new file mode 100644 index 0000000..b250d7e --- /dev/null +++ "b/categories/\350\256\241\347\256\227\346\234\272\347\275\221\347\273\234/index.html" @@ -0,0 +1,168 @@ +Category: 计算机网络 | SHYEE-PLASMA + + + + + + + +
    Category - 计算机网络
    2020
    单BSS实验
    单BSS实验
    单交换机小实验
    单交换机小实验
    PSTN和以太网互连实验
    PSTN和以太网互连实验
    做根网线
    做根网线
    \ No newline at end of file diff --git "a/categories/\351\234\200\346\261\202\345\210\206\346\236\220/index.html" "b/categories/\351\234\200\346\261\202\345\210\206\346\236\220/index.html" new file mode 100644 index 0000000..c54d3c8 --- /dev/null +++ "b/categories/\351\234\200\346\261\202\345\210\206\346\236\220/index.html" @@ -0,0 +1,168 @@ +Category: 需求分析 | SHYEE-PLASMA + + + + + + + +
    Category - 需求分析
    2020
    需求分析学习笔记-1
    需求分析学习笔记-1
    \ No newline at end of file diff --git "a/categories/\351\241\271\347\233\256\347\256\241\347\220\206/index.html" "b/categories/\351\241\271\347\233\256\347\256\241\347\220\206/index.html" new file mode 100644 index 0000000..7776634 --- /dev/null +++ "b/categories/\351\241\271\347\233\256\347\256\241\347\220\206/index.html" @@ -0,0 +1,168 @@ +Category: 项目管理 | SHYEE-PLASMA + + + + + + + +
    Category - 项目管理
    2021
    项目预算
    项目预算
    2020
    获得管理层许可及挑选团队队员
    获得管理层许可及挑选团队队员
    工作分解结构
    工作分解结构
    \ No newline at end of file diff --git a/css/index.css b/css/index.css new file mode 100644 index 0000000..98027c8 --- /dev/null +++ b/css/index.css @@ -0,0 +1,5845 @@ +/*! normalize.css v8.0.1 | MIT License | github.com/necolas/normalize.css */ +html { + line-height: 1.15; + -webkit-text-size-adjust: 100% +} + +body { + margin: 0 +} + +main { + display: block +} + +h1 { + font-size: 2em; + margin: .67em 0 +} + +hr { + box-sizing: content-box; + height: 0; + overflow: visible +} + +pre { + font-family: monospace, monospace; + font-size: 1em +} + +a { + background-color: transparent +} + +abbr[title] { + border-bottom: none; + text-decoration: underline; + text-decoration: underline dotted +} + +b, +strong { + font-weight: bolder +} + +code, +kbd, +samp { + font-family: monospace, monospace; + font-size: 1em +} + +small { + font-size: 80% +} + +sub, +sup { + font-size: 75%; + line-height: 0; + position: relative; + vertical-align: baseline +} + +sub { + bottom: -.25em +} + +sup { + top: -.5em +} + +img { + border-style: none +} + +button, +input, +optgroup, +select, +textarea { + font-family: inherit; + font-size: 100%; + line-height: 1.15; + margin: 0 +} + +button, +input { + overflow: visible +} + +button, +select { + text-transform: none +} + +[type=button], +[type=reset], +[type=submit], +button { + -webkit-appearance: button +} + +[type=button]::-moz-focus-inner, +[type=reset]::-moz-focus-inner, +[type=submit]::-moz-focus-inner, +button::-moz-focus-inner { + border-style: none; + padding: 0 +} + +[type=button]:-moz-focusring, +[type=reset]:-moz-focusring, +[type=submit]:-moz-focusring, +button:-moz-focusring { + outline: 1px dotted ButtonText +} + +fieldset { + padding: .35em .75em .625em +} + +legend { + box-sizing: border-box; + color: inherit; + display: table; + max-width: 100%; + padding: 0; + white-space: normal +} + +progress { + vertical-align: baseline +} + +textarea { + overflow: auto +} + +[type=checkbox], +[type=radio] { + box-sizing: border-box; + padding: 0 +} + +[type=number]::-webkit-inner-spin-button, +[type=number]::-webkit-outer-spin-button { + height: auto +} + +[type=search] { + -webkit-appearance: textfield; + outline-offset: -2px +} + +[type=search]::-webkit-search-decoration { + -webkit-appearance: none +} + +::-webkit-file-upload-button { + -webkit-appearance: button; + font: inherit +} + +details { + display: block +} + +summary { + display: list-item +} + +template { + display: none +} + +[hidden] { + display: none +} +.limit-one-line, +#article-container .flink .flink-item-name, +#article-container .flink .flink-item-desc, +#aside-content .card-archives ul.card-archive-list > .card-archive-list-item a span, +#aside-content .card-categories ul.card-category-list > .card-category-list-item a span, +.site-data > a .headline, +#nav #blog-info, +#pagination .prev_info, +#pagination .next_info, +#sidebar #sidebar-menus .menus_items .site-page { + overflow: hidden; + -o-text-overflow: ellipsis; + text-overflow: ellipsis; + white-space: nowrap; +} +.limit-more-line, +.error404 #error-wrap .error-content .error-info .error_subtitle, +.article-sort-item-title, +#recent-posts > .recent-post-item >.recent-post-info > .article-title, +#recent-posts > .recent-post-item >.recent-post-info > .content, +#aside-content .aside-list > .aside-list-item .content > .name, +#aside-content .aside-list > .aside-list-item .content > .title, +#aside-content .aside-list > .aside-list-item .content > .comment, +#post-info .post-title, +.relatedPosts > .relatedPosts-list .content .title, +#article-container figure.gallery-group p, +#article-container figure.gallery-group .gallery-group-name { + display: -webkit-box; + overflow: hidden; + -webkit-box-orient: vertical; +} +.fontawesomeIcon, +hr:before, +#post .post-copyright:before, +#post .post-outdate-notice:before, +.note:not(.no-icon)::before { + display: inline-block; + font-weight: 600; + font-family: 'Font Awesome 6 Free'; + text-rendering: auto; + -webkit-font-smoothing: antialiased; +} +.cardHover, +.error404 #error-wrap .error-content, +.layout > div:first-child:not(.recent-posts), +#recent-posts > .recent-post-item, +#aside-content .card-widget, +.layout > .recent-posts .pagination > *:not(.space) { + border-radius: 8px; + background: var(--card-bg); + -webkit-box-shadow: var(--card-box-shadow); + box-shadow: var(--card-box-shadow); + -webkit-transition: all 0.3s; + -moz-transition: all 0.3s; + -o-transition: all 0.3s; + -ms-transition: all 0.3s; + transition: all 0.3s; +} +.cardHover:hover, +.error404 #error-wrap .error-content:hover, +.layout > div:first-child:not(.recent-posts):hover, +#recent-posts > .recent-post-item:hover, +#aside-content .card-widget:hover, +.layout > .recent-posts .pagination > *:not(.space):hover { + -webkit-box-shadow: var(--card-hover-box-shadow); + box-shadow: var(--card-hover-box-shadow); +} +.imgHover, +.error404 #error-wrap .error-content .error-img img, +.article-sort-item-img :first-child, +#recent-posts > .recent-post-item .post_cover .post-bg, +#aside-content .aside-list > .aside-list-item .thumbnail :first-child { + width: 100%; + height: 100%; + -webkit-transition: filter 375ms ease-in 0.2s, -webkit-transform 0.6s; + -moz-transition: filter 375ms ease-in 0.2s, -moz-transform 0.6s; + -o-transition: filter 375ms ease-in 0.2s, -o-transform 0.6s; + -ms-transition: filter 375ms ease-in 0.2s, -ms-transform 0.6s; + transition: filter 375ms ease-in 0.2s, transform 0.6s; + object-fit: cover; +} +.imgHover:hover, +.error404 #error-wrap .error-content .error-img img:hover, +.article-sort-item-img :first-child:hover, +#recent-posts > .recent-post-item .post_cover .post-bg:hover, +#aside-content .aside-list > .aside-list-item .thumbnail :first-child:hover { + -webkit-transform: scale(1.1); + -moz-transform: scale(1.1); + -o-transform: scale(1.1); + -ms-transform: scale(1.1); + transform: scale(1.1); +} +.postImgHover:hover .cover, +#pagination .prev-post:hover .cover, +#pagination .next-post:hover .cover, +.relatedPosts > .relatedPosts-list > div:hover .cover { + opacity: 0.8; + -ms-filter: "progid:DXImageTransform.Microsoft.Alpha(Opacity=80)"; + filter: alpha(opacity=80); + -webkit-transform: scale(1.1); + -moz-transform: scale(1.1); + -o-transform: scale(1.1); + -ms-transform: scale(1.1); + transform: scale(1.1); +} +.postImgHover .cover, +#pagination .prev-post .cover, +#pagination .next-post .cover, +.relatedPosts > .relatedPosts-list > div .cover { + position: absolute; + width: 100%; + height: 100%; + opacity: 0.4; + -ms-filter: "progid:DXImageTransform.Microsoft.Alpha(Opacity=40)"; + filter: alpha(opacity=40); + -webkit-transition: all 0.6s, filter 375ms ease-in 0.2s; + -moz-transition: all 0.6s, filter 375ms ease-in 0.2s; + -o-transition: all 0.6s, filter 375ms ease-in 0.2s; + -ms-transition: all 0.6s, filter 375ms ease-in 0.2s; + transition: all 0.6s, filter 375ms ease-in 0.2s; + object-fit: cover; +} +.list-beauty, +.category-lists ul { + list-style: none; +} +.list-beauty li, +.category-lists ul li { + position: relative; + padding: 0.12em 0.4em 0.12em 1.4em; +} +.list-beauty li:hover:before, +.category-lists ul li:hover:before { + border-color: var(--pseudo-hover); +} +.list-beauty li:before, +.category-lists ul li:before { + position: absolute; + top: 0.67em; + left: 0; + width: 0.43em; + height: 0.43em; + border: 0.215em solid #49b1f5; + border-radius: 0.43em; + background: transparent; + content: ''; + cursor: pointer; + -webkit-transition: all 0.3s ease-out; + -moz-transition: all 0.3s ease-out; + -o-transition: all 0.3s ease-out; + -ms-transition: all 0.3s ease-out; + transition: all 0.3s ease-out; +} +#content-inner, +#footer { + -webkit-animation: bottom-top 1s; + -moz-animation: bottom-top 1s; + -o-animation: bottom-top 1s; + -ms-animation: bottom-top 1s; + animation: bottom-top 1s; +} +#page-header { + -webkit-animation: header-effect 1s; + -moz-animation: header-effect 1s; + -o-animation: header-effect 1s; + -ms-animation: header-effect 1s; + animation: header-effect 1s; +} +#site-title, +#site-subtitle { + -webkit-animation: titleScale 1s; + -moz-animation: titleScale 1s; + -o-animation: titleScale 1s; + -ms-animation: titleScale 1s; + animation: titleScale 1s; +} +#nav.show { + -webkit-animation: headerNoOpacity 1s; + -moz-animation: headerNoOpacity 1s; + -o-animation: headerNoOpacity 1s; + -ms-animation: headerNoOpacity 1s; + animation: headerNoOpacity 1s; +} +canvas:not(#ribbon-canvas), +#web_bg { + -webkit-animation: to_show 4s; + -moz-animation: to_show 4s; + -o-animation: to_show 4s; + -ms-animation: to_show 4s; + animation: to_show 4s; +} +#ribbon-canvas { + -webkit-animation: ribbon_to_show 4s; + -moz-animation: ribbon_to_show 4s; + -o-animation: ribbon_to_show 4s; + -ms-animation: ribbon_to_show 4s; + animation: ribbon_to_show 4s; +} +#sidebar-menus.open > :nth-child(1) { + -webkit-animation: sidebarItem 0.2s; + -moz-animation: sidebarItem 0.2s; + -o-animation: sidebarItem 0.2s; + -ms-animation: sidebarItem 0.2s; + animation: sidebarItem 0.2s; +} +#sidebar-menus.open > :nth-child(2) { + -webkit-animation: sidebarItem 0.4s; + -moz-animation: sidebarItem 0.4s; + -o-animation: sidebarItem 0.4s; + -ms-animation: sidebarItem 0.4s; + animation: sidebarItem 0.4s; +} +#sidebar-menus.open > :nth-child(3) { + -webkit-animation: sidebarItem 0.6s; + -moz-animation: sidebarItem 0.6s; + -o-animation: sidebarItem 0.6s; + -ms-animation: sidebarItem 0.6s; + animation: sidebarItem 0.6s; +} +#sidebar-menus.open > :nth-child(4) { + -webkit-animation: sidebarItem 0.8s; + -moz-animation: sidebarItem 0.8s; + -o-animation: sidebarItem 0.8s; + -ms-animation: sidebarItem 0.8s; + animation: sidebarItem 0.8s; +} +.scroll-down-effects { + -webkit-animation: scroll-down-effect 1.5s infinite; + -moz-animation: scroll-down-effect 1.5s infinite; + -o-animation: scroll-down-effect 1.5s infinite; + -ms-animation: scroll-down-effect 1.5s infinite; + animation: scroll-down-effect 1.5s infinite; +} +.reward-main { + -webkit-animation: donate_effcet 0.3s 0.1s ease both; + -moz-animation: donate_effcet 0.3s 0.1s ease both; + -o-animation: donate_effcet 0.3s 0.1s ease both; + -ms-animation: donate_effcet 0.3s 0.1s ease both; + animation: donate_effcet 0.3s 0.1s ease both; +} +@-moz-keyframes scroll-down-effect { + 0% { + top: 0; + opacity: 0.4; + -ms-filter: "progid:DXImageTransform.Microsoft.Alpha(Opacity=40)"; + filter: alpha(opacity=40); + } + 50% { + top: -16px; + opacity: 1; + -ms-filter: none; + filter: none; + } + 100% { + top: 0; + opacity: 0.4; + -ms-filter: "progid:DXImageTransform.Microsoft.Alpha(Opacity=40)"; + filter: alpha(opacity=40); + } +} +@-webkit-keyframes scroll-down-effect { + 0% { + top: 0; + opacity: 0.4; + -ms-filter: "progid:DXImageTransform.Microsoft.Alpha(Opacity=40)"; + filter: alpha(opacity=40); + } + 50% { + top: -16px; + opacity: 1; + -ms-filter: none; + filter: none; + } + 100% { + top: 0; + opacity: 0.4; + -ms-filter: "progid:DXImageTransform.Microsoft.Alpha(Opacity=40)"; + filter: alpha(opacity=40); + } +} +@-o-keyframes scroll-down-effect { + 0% { + top: 0; + opacity: 0.4; + -ms-filter: "progid:DXImageTransform.Microsoft.Alpha(Opacity=40)"; + filter: alpha(opacity=40); + } + 50% { + top: -16px; + opacity: 1; + -ms-filter: none; + filter: none; + } + 100% { + top: 0; + opacity: 0.4; + -ms-filter: "progid:DXImageTransform.Microsoft.Alpha(Opacity=40)"; + filter: alpha(opacity=40); + } +} +@keyframes scroll-down-effect { + 0% { + top: 0; + opacity: 0.4; + -ms-filter: "progid:DXImageTransform.Microsoft.Alpha(Opacity=40)"; + filter: alpha(opacity=40); + } + 50% { + top: -16px; + opacity: 1; + -ms-filter: none; + filter: none; + } + 100% { + top: 0; + opacity: 0.4; + -ms-filter: "progid:DXImageTransform.Microsoft.Alpha(Opacity=40)"; + filter: alpha(opacity=40); + } +} +@-moz-keyframes header-effect { + 0% { + opacity: 0; + -ms-filter: "progid:DXImageTransform.Microsoft.Alpha(Opacity=0)"; + filter: alpha(opacity=0); + -webkit-transform: translateY(-50px); + -moz-transform: translateY(-50px); + -o-transform: translateY(-50px); + -ms-transform: translateY(-50px); + transform: translateY(-50px); + } + 100% { + opacity: 1; + -ms-filter: none; + filter: none; + -webkit-transform: translateY(0); + -moz-transform: translateY(0); + -o-transform: translateY(0); + -ms-transform: translateY(0); + transform: translateY(0); + } +} +@-webkit-keyframes header-effect { + 0% { + opacity: 0; + -ms-filter: "progid:DXImageTransform.Microsoft.Alpha(Opacity=0)"; + filter: alpha(opacity=0); + -webkit-transform: translateY(-50px); + -moz-transform: translateY(-50px); + -o-transform: translateY(-50px); + -ms-transform: translateY(-50px); + transform: translateY(-50px); + } + 100% { + opacity: 1; + -ms-filter: none; + filter: none; + -webkit-transform: translateY(0); + -moz-transform: translateY(0); + -o-transform: translateY(0); + -ms-transform: translateY(0); + transform: translateY(0); + } +} +@-o-keyframes header-effect { + 0% { + opacity: 0; + -ms-filter: "progid:DXImageTransform.Microsoft.Alpha(Opacity=0)"; + filter: alpha(opacity=0); + -webkit-transform: translateY(-50px); + -moz-transform: translateY(-50px); + -o-transform: translateY(-50px); + -ms-transform: translateY(-50px); + transform: translateY(-50px); + } + 100% { + opacity: 1; + -ms-filter: none; + filter: none; + -webkit-transform: translateY(0); + -moz-transform: translateY(0); + -o-transform: translateY(0); + -ms-transform: translateY(0); + transform: translateY(0); + } +} +@keyframes header-effect { + 0% { + opacity: 0; + -ms-filter: "progid:DXImageTransform.Microsoft.Alpha(Opacity=0)"; + filter: alpha(opacity=0); + -webkit-transform: translateY(-50px); + -moz-transform: translateY(-50px); + -o-transform: translateY(-50px); + -ms-transform: translateY(-50px); + transform: translateY(-50px); + } + 100% { + opacity: 1; + -ms-filter: none; + filter: none; + -webkit-transform: translateY(0); + -moz-transform: translateY(0); + -o-transform: translateY(0); + -ms-transform: translateY(0); + transform: translateY(0); + } +} +@-moz-keyframes headerNoOpacity { + 0% { + -webkit-transform: translateY(-50px); + -moz-transform: translateY(-50px); + -o-transform: translateY(-50px); + -ms-transform: translateY(-50px); + transform: translateY(-50px); + } + 100% { + -webkit-transform: translateY(0); + -moz-transform: translateY(0); + -o-transform: translateY(0); + -ms-transform: translateY(0); + transform: translateY(0); + } +} +@-webkit-keyframes headerNoOpacity { + 0% { + -webkit-transform: translateY(-50px); + -moz-transform: translateY(-50px); + -o-transform: translateY(-50px); + -ms-transform: translateY(-50px); + transform: translateY(-50px); + } + 100% { + -webkit-transform: translateY(0); + -moz-transform: translateY(0); + -o-transform: translateY(0); + -ms-transform: translateY(0); + transform: translateY(0); + } +} +@-o-keyframes headerNoOpacity { + 0% { + -webkit-transform: translateY(-50px); + -moz-transform: translateY(-50px); + -o-transform: translateY(-50px); + -ms-transform: translateY(-50px); + transform: translateY(-50px); + } + 100% { + -webkit-transform: translateY(0); + -moz-transform: translateY(0); + -o-transform: translateY(0); + -ms-transform: translateY(0); + transform: translateY(0); + } +} +@keyframes headerNoOpacity { + 0% { + -webkit-transform: translateY(-50px); + -moz-transform: translateY(-50px); + -o-transform: translateY(-50px); + -ms-transform: translateY(-50px); + transform: translateY(-50px); + } + 100% { + -webkit-transform: translateY(0); + -moz-transform: translateY(0); + -o-transform: translateY(0); + -ms-transform: translateY(0); + transform: translateY(0); + } +} +@-moz-keyframes bottom-top { + 0% { + margin-top: 50px; + opacity: 0; + -ms-filter: "progid:DXImageTransform.Microsoft.Alpha(Opacity=0)"; + filter: alpha(opacity=0); + } + 100% { + margin-top: 0; + opacity: 1; + -ms-filter: none; + filter: none; + } +} +@-webkit-keyframes bottom-top { + 0% { + margin-top: 50px; + opacity: 0; + -ms-filter: "progid:DXImageTransform.Microsoft.Alpha(Opacity=0)"; + filter: alpha(opacity=0); + } + 100% { + margin-top: 0; + opacity: 1; + -ms-filter: none; + filter: none; + } +} +@-o-keyframes bottom-top { + 0% { + margin-top: 50px; + opacity: 0; + -ms-filter: "progid:DXImageTransform.Microsoft.Alpha(Opacity=0)"; + filter: alpha(opacity=0); + } + 100% { + margin-top: 0; + opacity: 1; + -ms-filter: none; + filter: none; + } +} +@keyframes bottom-top { + 0% { + margin-top: 50px; + opacity: 0; + -ms-filter: "progid:DXImageTransform.Microsoft.Alpha(Opacity=0)"; + filter: alpha(opacity=0); + } + 100% { + margin-top: 0; + opacity: 1; + -ms-filter: none; + filter: none; + } +} +@-moz-keyframes titleScale { + 0% { + opacity: 0; + -ms-filter: "progid:DXImageTransform.Microsoft.Alpha(Opacity=0)"; + filter: alpha(opacity=0); + -webkit-transform: scale(0.7); + -moz-transform: scale(0.7); + -o-transform: scale(0.7); + -ms-transform: scale(0.7); + transform: scale(0.7); + } + 100% { + opacity: 1; + -ms-filter: none; + filter: none; + -webkit-transform: scale(1); + -moz-transform: scale(1); + -o-transform: scale(1); + -ms-transform: scale(1); + transform: scale(1); + } +} +@-webkit-keyframes titleScale { + 0% { + opacity: 0; + -ms-filter: "progid:DXImageTransform.Microsoft.Alpha(Opacity=0)"; + filter: alpha(opacity=0); + -webkit-transform: scale(0.7); + -moz-transform: scale(0.7); + -o-transform: scale(0.7); + -ms-transform: scale(0.7); + transform: scale(0.7); + } + 100% { + opacity: 1; + -ms-filter: none; + filter: none; + -webkit-transform: scale(1); + -moz-transform: scale(1); + -o-transform: scale(1); + -ms-transform: scale(1); + transform: scale(1); + } +} +@-o-keyframes titleScale { + 0% { + opacity: 0; + -ms-filter: "progid:DXImageTransform.Microsoft.Alpha(Opacity=0)"; + filter: alpha(opacity=0); + -webkit-transform: scale(0.7); + -moz-transform: scale(0.7); + -o-transform: scale(0.7); + -ms-transform: scale(0.7); + transform: scale(0.7); + } + 100% { + opacity: 1; + -ms-filter: none; + filter: none; + -webkit-transform: scale(1); + -moz-transform: scale(1); + -o-transform: scale(1); + -ms-transform: scale(1); + transform: scale(1); + } +} +@keyframes titleScale { + 0% { + opacity: 0; + -ms-filter: "progid:DXImageTransform.Microsoft.Alpha(Opacity=0)"; + filter: alpha(opacity=0); + -webkit-transform: scale(0.7); + -moz-transform: scale(0.7); + -o-transform: scale(0.7); + -ms-transform: scale(0.7); + transform: scale(0.7); + } + 100% { + opacity: 1; + -ms-filter: none; + filter: none; + -webkit-transform: scale(1); + -moz-transform: scale(1); + -o-transform: scale(1); + -ms-transform: scale(1); + transform: scale(1); + } +} +@-moz-keyframes search_close { + 0% { + opacity: 1; + -ms-filter: none; + filter: none; + -webkit-transform: scale(1); + -moz-transform: scale(1); + -o-transform: scale(1); + -ms-transform: scale(1); + transform: scale(1); + } + 100% { + opacity: 0; + -ms-filter: "progid:DXImageTransform.Microsoft.Alpha(Opacity=0)"; + filter: alpha(opacity=0); + -webkit-transform: scale(0.7); + -moz-transform: scale(0.7); + -o-transform: scale(0.7); + -ms-transform: scale(0.7); + transform: scale(0.7); + } +} +@-webkit-keyframes search_close { + 0% { + opacity: 1; + -ms-filter: none; + filter: none; + -webkit-transform: scale(1); + -moz-transform: scale(1); + -o-transform: scale(1); + -ms-transform: scale(1); + transform: scale(1); + } + 100% { + opacity: 0; + -ms-filter: "progid:DXImageTransform.Microsoft.Alpha(Opacity=0)"; + filter: alpha(opacity=0); + -webkit-transform: scale(0.7); + -moz-transform: scale(0.7); + -o-transform: scale(0.7); + -ms-transform: scale(0.7); + transform: scale(0.7); + } +} +@-o-keyframes search_close { + 0% { + opacity: 1; + -ms-filter: none; + filter: none; + -webkit-transform: scale(1); + -moz-transform: scale(1); + -o-transform: scale(1); + -ms-transform: scale(1); + transform: scale(1); + } + 100% { + opacity: 0; + -ms-filter: "progid:DXImageTransform.Microsoft.Alpha(Opacity=0)"; + filter: alpha(opacity=0); + -webkit-transform: scale(0.7); + -moz-transform: scale(0.7); + -o-transform: scale(0.7); + -ms-transform: scale(0.7); + transform: scale(0.7); + } +} +@keyframes search_close { + 0% { + opacity: 1; + -ms-filter: none; + filter: none; + -webkit-transform: scale(1); + -moz-transform: scale(1); + -o-transform: scale(1); + -ms-transform: scale(1); + transform: scale(1); + } + 100% { + opacity: 0; + -ms-filter: "progid:DXImageTransform.Microsoft.Alpha(Opacity=0)"; + filter: alpha(opacity=0); + -webkit-transform: scale(0.7); + -moz-transform: scale(0.7); + -o-transform: scale(0.7); + -ms-transform: scale(0.7); + transform: scale(0.7); + } +} +@-moz-keyframes to_show { + 0% { + opacity: 0; + -ms-filter: "progid:DXImageTransform.Microsoft.Alpha(Opacity=0)"; + filter: alpha(opacity=0); + } + 100% { + opacity: 1; + -ms-filter: none; + filter: none; + } +} +@-webkit-keyframes to_show { + 0% { + opacity: 0; + -ms-filter: "progid:DXImageTransform.Microsoft.Alpha(Opacity=0)"; + filter: alpha(opacity=0); + } + 100% { + opacity: 1; + -ms-filter: none; + filter: none; + } +} +@-o-keyframes to_show { + 0% { + opacity: 0; + -ms-filter: "progid:DXImageTransform.Microsoft.Alpha(Opacity=0)"; + filter: alpha(opacity=0); + } + 100% { + opacity: 1; + -ms-filter: none; + filter: none; + } +} +@keyframes to_show { + 0% { + opacity: 0; + -ms-filter: "progid:DXImageTransform.Microsoft.Alpha(Opacity=0)"; + filter: alpha(opacity=0); + } + 100% { + opacity: 1; + -ms-filter: none; + filter: none; + } +} +@-moz-keyframes to_hide { + 0% { + opacity: 1; + -ms-filter: none; + filter: none; + } + 100% { + opacity: 0; + -ms-filter: "progid:DXImageTransform.Microsoft.Alpha(Opacity=0)"; + filter: alpha(opacity=0); + } +} +@-webkit-keyframes to_hide { + 0% { + opacity: 1; + -ms-filter: none; + filter: none; + } + 100% { + opacity: 0; + -ms-filter: "progid:DXImageTransform.Microsoft.Alpha(Opacity=0)"; + filter: alpha(opacity=0); + } +} +@-o-keyframes to_hide { + 0% { + opacity: 1; + -ms-filter: none; + filter: none; + } + 100% { + opacity: 0; + -ms-filter: "progid:DXImageTransform.Microsoft.Alpha(Opacity=0)"; + filter: alpha(opacity=0); + } +} +@keyframes to_hide { + 0% { + opacity: 1; + -ms-filter: none; + filter: none; + } + 100% { + opacity: 0; + -ms-filter: "progid:DXImageTransform.Microsoft.Alpha(Opacity=0)"; + filter: alpha(opacity=0); + } +} +@-moz-keyframes ribbon_to_show { + 0% { + opacity: 0; + -ms-filter: "progid:DXImageTransform.Microsoft.Alpha(Opacity=0)"; + filter: alpha(opacity=0); + } + 100% { + opacity: 0.6; + -ms-filter: "progid:DXImageTransform.Microsoft.Alpha(Opacity=60)"; + filter: alpha(opacity=60); + } +} +@-webkit-keyframes ribbon_to_show { + 0% { + opacity: 0; + -ms-filter: "progid:DXImageTransform.Microsoft.Alpha(Opacity=0)"; + filter: alpha(opacity=0); + } + 100% { + opacity: 0.6; + -ms-filter: "progid:DXImageTransform.Microsoft.Alpha(Opacity=60)"; + filter: alpha(opacity=60); + } +} +@-o-keyframes ribbon_to_show { + 0% { + opacity: 0; + -ms-filter: "progid:DXImageTransform.Microsoft.Alpha(Opacity=0)"; + filter: alpha(opacity=0); + } + 100% { + opacity: 0.6; + -ms-filter: "progid:DXImageTransform.Microsoft.Alpha(Opacity=60)"; + filter: alpha(opacity=60); + } +} +@keyframes ribbon_to_show { + 0% { + opacity: 0; + -ms-filter: "progid:DXImageTransform.Microsoft.Alpha(Opacity=0)"; + filter: alpha(opacity=0); + } + 100% { + opacity: 0.6; + -ms-filter: "progid:DXImageTransform.Microsoft.Alpha(Opacity=60)"; + filter: alpha(opacity=60); + } +} +@-moz-keyframes avatar_turn_around { + from { + -webkit-transform: rotate(0); + -moz-transform: rotate(0); + -o-transform: rotate(0); + -ms-transform: rotate(0); + transform: rotate(0); + } + to { + -webkit-transform: rotate(360deg); + -moz-transform: rotate(360deg); + -o-transform: rotate(360deg); + -ms-transform: rotate(360deg); + transform: rotate(360deg); + } +} +@-webkit-keyframes avatar_turn_around { + from { + -webkit-transform: rotate(0); + -moz-transform: rotate(0); + -o-transform: rotate(0); + -ms-transform: rotate(0); + transform: rotate(0); + } + to { + -webkit-transform: rotate(360deg); + -moz-transform: rotate(360deg); + -o-transform: rotate(360deg); + -ms-transform: rotate(360deg); + transform: rotate(360deg); + } +} +@-o-keyframes avatar_turn_around { + from { + -webkit-transform: rotate(0); + -moz-transform: rotate(0); + -o-transform: rotate(0); + -ms-transform: rotate(0); + transform: rotate(0); + } + to { + -webkit-transform: rotate(360deg); + -moz-transform: rotate(360deg); + -o-transform: rotate(360deg); + -ms-transform: rotate(360deg); + transform: rotate(360deg); + } +} +@keyframes avatar_turn_around { + from { + -webkit-transform: rotate(0); + -moz-transform: rotate(0); + -o-transform: rotate(0); + -ms-transform: rotate(0); + transform: rotate(0); + } + to { + -webkit-transform: rotate(360deg); + -moz-transform: rotate(360deg); + -o-transform: rotate(360deg); + -ms-transform: rotate(360deg); + transform: rotate(360deg); + } +} +@-moz-keyframes sub_menus { + 0% { + opacity: 0; + -ms-filter: "progid:DXImageTransform.Microsoft.Alpha(Opacity=0)"; + filter: alpha(opacity=0); + -webkit-transform: translateY(10px); + -moz-transform: translateY(10px); + -o-transform: translateY(10px); + -ms-transform: translateY(10px); + transform: translateY(10px); + } + 100% { + opacity: 1; + -ms-filter: none; + filter: none; + -webkit-transform: translateY(0); + -moz-transform: translateY(0); + -o-transform: translateY(0); + -ms-transform: translateY(0); + transform: translateY(0); + } +} +@-webkit-keyframes sub_menus { + 0% { + opacity: 0; + -ms-filter: "progid:DXImageTransform.Microsoft.Alpha(Opacity=0)"; + filter: alpha(opacity=0); + -webkit-transform: translateY(10px); + -moz-transform: translateY(10px); + -o-transform: translateY(10px); + -ms-transform: translateY(10px); + transform: translateY(10px); + } + 100% { + opacity: 1; + -ms-filter: none; + filter: none; + -webkit-transform: translateY(0); + -moz-transform: translateY(0); + -o-transform: translateY(0); + -ms-transform: translateY(0); + transform: translateY(0); + } +} +@-o-keyframes sub_menus { + 0% { + opacity: 0; + -ms-filter: "progid:DXImageTransform.Microsoft.Alpha(Opacity=0)"; + filter: alpha(opacity=0); + -webkit-transform: translateY(10px); + -moz-transform: translateY(10px); + -o-transform: translateY(10px); + -ms-transform: translateY(10px); + transform: translateY(10px); + } + 100% { + opacity: 1; + -ms-filter: none; + filter: none; + -webkit-transform: translateY(0); + -moz-transform: translateY(0); + -o-transform: translateY(0); + -ms-transform: translateY(0); + transform: translateY(0); + } +} +@keyframes sub_menus { + 0% { + opacity: 0; + -ms-filter: "progid:DXImageTransform.Microsoft.Alpha(Opacity=0)"; + filter: alpha(opacity=0); + -webkit-transform: translateY(10px); + -moz-transform: translateY(10px); + -o-transform: translateY(10px); + -ms-transform: translateY(10px); + transform: translateY(10px); + } + 100% { + opacity: 1; + -ms-filter: none; + filter: none; + -webkit-transform: translateY(0); + -moz-transform: translateY(0); + -o-transform: translateY(0); + -ms-transform: translateY(0); + transform: translateY(0); + } +} +@-moz-keyframes donate_effcet { + 0% { + opacity: 0; + -ms-filter: "progid:DXImageTransform.Microsoft.Alpha(Opacity=0)"; + filter: alpha(opacity=0); + -webkit-transform: translateY(-20px); + -moz-transform: translateY(-20px); + -o-transform: translateY(-20px); + -ms-transform: translateY(-20px); + transform: translateY(-20px); + } + 100% { + opacity: 1; + -ms-filter: none; + filter: none; + -webkit-transform: translateY(0); + -moz-transform: translateY(0); + -o-transform: translateY(0); + -ms-transform: translateY(0); + transform: translateY(0); + } +} +@-webkit-keyframes donate_effcet { + 0% { + opacity: 0; + -ms-filter: "progid:DXImageTransform.Microsoft.Alpha(Opacity=0)"; + filter: alpha(opacity=0); + -webkit-transform: translateY(-20px); + -moz-transform: translateY(-20px); + -o-transform: translateY(-20px); + -ms-transform: translateY(-20px); + transform: translateY(-20px); + } + 100% { + opacity: 1; + -ms-filter: none; + filter: none; + -webkit-transform: translateY(0); + -moz-transform: translateY(0); + -o-transform: translateY(0); + -ms-transform: translateY(0); + transform: translateY(0); + } +} +@-o-keyframes donate_effcet { + 0% { + opacity: 0; + -ms-filter: "progid:DXImageTransform.Microsoft.Alpha(Opacity=0)"; + filter: alpha(opacity=0); + -webkit-transform: translateY(-20px); + -moz-transform: translateY(-20px); + -o-transform: translateY(-20px); + -ms-transform: translateY(-20px); + transform: translateY(-20px); + } + 100% { + opacity: 1; + -ms-filter: none; + filter: none; + -webkit-transform: translateY(0); + -moz-transform: translateY(0); + -o-transform: translateY(0); + -ms-transform: translateY(0); + transform: translateY(0); + } +} +@keyframes donate_effcet { + 0% { + opacity: 0; + -ms-filter: "progid:DXImageTransform.Microsoft.Alpha(Opacity=0)"; + filter: alpha(opacity=0); + -webkit-transform: translateY(-20px); + -moz-transform: translateY(-20px); + -o-transform: translateY(-20px); + -ms-transform: translateY(-20px); + transform: translateY(-20px); + } + 100% { + opacity: 1; + -ms-filter: none; + filter: none; + -webkit-transform: translateY(0); + -moz-transform: translateY(0); + -o-transform: translateY(0); + -ms-transform: translateY(0); + transform: translateY(0); + } +} +@-moz-keyframes sidebarItem { + 0% { + -webkit-transform: translateX(200px); + -moz-transform: translateX(200px); + -o-transform: translateX(200px); + -ms-transform: translateX(200px); + transform: translateX(200px); + } + 100% { + -webkit-transform: translateX(0); + -moz-transform: translateX(0); + -o-transform: translateX(0); + -ms-transform: translateX(0); + transform: translateX(0); + } +} +@-webkit-keyframes sidebarItem { + 0% { + -webkit-transform: translateX(200px); + -moz-transform: translateX(200px); + -o-transform: translateX(200px); + -ms-transform: translateX(200px); + transform: translateX(200px); + } + 100% { + -webkit-transform: translateX(0); + -moz-transform: translateX(0); + -o-transform: translateX(0); + -ms-transform: translateX(0); + transform: translateX(0); + } +} +@-o-keyframes sidebarItem { + 0% { + -webkit-transform: translateX(200px); + -moz-transform: translateX(200px); + -o-transform: translateX(200px); + -ms-transform: translateX(200px); + transform: translateX(200px); + } + 100% { + -webkit-transform: translateX(0); + -moz-transform: translateX(0); + -o-transform: translateX(0); + -ms-transform: translateX(0); + transform: translateX(0); + } +} +@keyframes sidebarItem { + 0% { + -webkit-transform: translateX(200px); + -moz-transform: translateX(200px); + -o-transform: translateX(200px); + -ms-transform: translateX(200px); + transform: translateX(200px); + } + 100% { + -webkit-transform: translateX(0); + -moz-transform: translateX(0); + -o-transform: translateX(0); + -ms-transform: translateX(0); + transform: translateX(0); + } +} +:root { + --global-font-size: 14px; + --global-bg: #fff; + --font-color: #4c4948; + --hr-border: #a4d8fa; + --hr-before-color: #80c8f8; + --search-bg: #f6f8fa; + --search-input-color: #4c4948; + --search-a-color: #4c4948; + --preloader-bg: #37474f; + --preloader-color: #fff; + --tab-border-color: #f0f0f0; + --tab-botton-bg: #f0f0f0; + --tab-botton-color: #1f2d3d; + --tab-button-hover-bg: #dcdcdc; + --tab-button-active-bg: #fff; + --card-bg: #fff; + --sidebar-bg: #f6f8fa; + --btn-hover-color: #ff7242; + --btn-color: #fff; + --btn-bg: #49b1f5; + --text-bg-hover: rgba(73,177,245,0.7); + --light-grey: #eee; + --dark-grey: #cacaca; + --white: #fff; + --text-highlight-color: #1f2d3d; + --blockquote-color: #6a737d; + --blockquote-bg: rgba(73,177,245,0.1); + --reward-pop: #f5f5f5; + --toc-link-color: #666261; + --card-box-shadow: 0 3px 8px 6px rgba(7,17,27,0.05); + --card-hover-box-shadow: 0 3px 8px 6px rgba(7,17,27,0.09); + --pseudo-hover: #ff7242; + --headline-presudo: #a0a0a0; + --scrollbar-color: #49b1f5; + --default-bg-color: #49b1f5; +} +body { + position: relative; + min-height: 100%; + background: var(--global-bg); + color: var(--font-color); + font-size: var(--global-font-size); + font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', 'Helvetica Neue', Lato, Roboto, 'PingFang SC', 'Microsoft YaHei', sans-serif; + line-height: 2; + -webkit-tap-highlight-color: rgba(0,0,0,0); +} +*::-webkit-scrollbar { + width: 5px; + height: 5px; +} +*::-webkit-scrollbar-thumb { + background: var(--scrollbar-color); +} +*::-webkit-scrollbar-track { + background-color: transparent; +} +* { + scrollbar-width: thin; + scrollbar-color: var(--scrollbar-color) transparent; +} +input::placeholder { + color: var(--font-color); +} +h1, +h2, +h3, +h4, +h5, +h6 { + position: relative; + margin: 20px 0 14px; + color: var(--text-highlight-color); + font-weight: bold; +} +h1 code, +h2 code, +h3 code, +h4 code, +h5 code, +h6 code { + font-size: inherit !important; +} +* { + -webkit-box-sizing: border-box; + -moz-box-sizing: border-box; + box-sizing: border-box; +} +hr { + position: relative; + margin: 40px auto; + border: 2px dashed var(--hr-border); + width: calc(100% - 4px); +} +hr:hover:before { + left: calc(95% - 20px); +} +hr:before { + position: absolute; + top: -10px; + left: 5%; + z-index: 1; + color: var(--hr-before-color); + content: '\f0c4'; + font-size: 20px; + line-height: 1; + -webkit-transition: all 1s ease-in-out; + -moz-transition: all 1s ease-in-out; + -o-transition: all 1s ease-in-out; + -ms-transition: all 1s ease-in-out; + transition: all 1s ease-in-out; +} +.table-wrap { + overflow-x: scroll; + margin: 0 0 20px; +} +table { + display: table; + width: 100%; + border-spacing: 0; + border-collapse: collapse; + empty-cells: show; +} +table thead { + background: rgba(153,169,191,0.1); +} +table th, +table td { + padding: 6px 12px; + border: 1px solid var(--light-grey); + vertical-align: middle; +} +*::selection { + background: #00c4b6; + color: #f7f7f7; +} +button { + padding: 0; + outline: 0; + border: none; + background: none; + cursor: pointer; + touch-action: manipulation; +} +a { + color: #99a9bf; + text-decoration: none; + word-wrap: break-word; + -webkit-transition: all 0.2s; + -moz-transition: all 0.2s; + -o-transition: all 0.2s; + -ms-transition: all 0.2s; + transition: all 0.2s; + overflow-wrap: break-word; +} +a:hover { + color: #49b1f5; +} +.is-center { + text-align: center; +} +.copy-true { + -webkit-user-select: all; + -moz-user-select: all; + -ms-user-select: all; + user-select: all; +} +.pull-left { + float: left; +} +.pull-right { + float: right; +} +img[src=''], +img:not([src]) { + opacity: 0; + -ms-filter: "progid:DXImageTransform.Microsoft.Alpha(Opacity=0)"; + filter: alpha(opacity=0); +} +.img-alt { + margin: -10px 0 10px; + color: #858585; +} +.img-alt:hover { + text-decoration: none !important; +} +blockquote { + margin: 0 0 20px; + padding: 12px 15px; + border-left: 3px solid #49b1f5; + background-color: var(--blockquote-bg); + color: var(--blockquote-color); +} +blockquote footer cite:before { + padding: 0 5px; + content: '—'; +} +blockquote > :last-child { + margin-bottom: 0 !important; +} +:root { + --hl-color: #eff; + --hl-bg: #212121; + --hltools-bg: #1c1c1c; + --hltools-color: rgba(238,255,255,0.8); + --hlnumber-bg: #212121; + --hlnumber-color: rgba(238,255,255,0.5); + --hlscrollbar-bg: #353535; + --hlexpand-bg: linear-gradient(180deg, rgba(33,33,33,0.6), rgba(33,33,33,0.9)); +} +figure.highlight table { + scrollbar-color: var(--hlscrollbar-bg) transparent; +} +figure.highlight table::-webkit-scrollbar-thumb { + background: var(--hlscrollbar-bg); +} +figure.highlight pre .deletion { + color: #bf42bf; +} +figure.highlight pre .addition { + color: #105ede; +} +figure.highlight pre .meta { + color: #c792ea; +} +figure.highlight pre .comment { + color: #969896; +} +figure.highlight pre .variable, +figure.highlight pre .attribute, +figure.highlight pre .regexp, +figure.highlight pre .ruby .constant, +figure.highlight pre .xml .tag .title, +figure.highlight pre .xml .pi, +figure.highlight pre .xml .doctype, +figure.highlight pre .html .doctype, +figure.highlight pre .css .id, +figure.highlight pre .tag .name, +figure.highlight pre .css .class, +figure.highlight pre .css .pseudo { + color: #ff5370; +} +figure.highlight pre .tag { + color: #89ddff; +} +figure.highlight pre .number, +figure.highlight pre .preprocessor, +figure.highlight pre .literal, +figure.highlight pre .params, +figure.highlight pre .constant, +figure.highlight pre .command { + color: #f78c6c; +} +figure.highlight pre .built_in { + color: #ffcb6b; +} +figure.highlight pre .ruby .class .title, +figure.highlight pre .css .rules .attribute, +figure.highlight pre .string, +figure.highlight pre .value, +figure.highlight pre .inheritance, +figure.highlight pre .header, +figure.highlight pre .ruby .symbol, +figure.highlight pre .xml .cdata, +figure.highlight pre .special, +figure.highlight pre .number, +figure.highlight pre .formula { + color: #c3e88d; +} +figure.highlight pre .keyword, +figure.highlight pre .title, +figure.highlight pre .css .hexcolor { + color: #89ddff; +} +figure.highlight pre .function, +figure.highlight pre .python .decorator, +figure.highlight pre .python .title, +figure.highlight pre .ruby .function .title, +figure.highlight pre .ruby .title .keyword, +figure.highlight pre .perl .sub, +figure.highlight pre .javascript .title, +figure.highlight pre .coffeescript .title { + color: #82aaff; +} +figure.highlight pre .tag .attr, +figure.highlight pre .javascript .function { + color: #c792ea; +} +#article-container figure.highlight .line.marked { + background-color: rgba(97,97,97,0.314); +} +#article-container figure.highlight table { + display: block; + overflow: auto; + border: none; +} +#article-container figure.highlight table td { + padding: 0; + border: none; +} +#article-container figure.highlight .gutter pre { + padding-right: 10px; + padding-left: 10px; + background-color: var(--hlnumber-bg); + color: var(--hlnumber-color); + text-align: right; +} +#article-container figure.highlight .code pre { + padding-right: 10px; + padding-left: 10px; + width: 100%; +} +#article-container pre, +#article-container figure.highlight { + overflow: auto; + margin: 0 0 20px; + padding: 0; + background: var(--hl-bg); + color: var(--hl-color); + line-height: 1.6; +} +#article-container pre, +#article-container code { + font-size: var(--global-font-size); + font-family: consolas, Menlo, 'PingFang SC', 'Microsoft YaHei', sans-serif !important; +} +#article-container code { + padding: 2px 4px; + background: rgba(27,31,35,0.05); + color: #f47466; +} +#article-container pre { + padding: 10px 20px; +} +#article-container pre code { + padding: 0; + background: none; + color: var(--hl-color); + text-shadow: none; +} +#article-container figure.highlight { + position: relative; +} +#article-container figure.highlight pre { + margin: 0; + padding: 8px 0; + border: none; +} +#article-container figure.highlight figcaption, +#article-container figure.highlight .caption { + padding: 6px 0 2px 14px; + font-size: var(--global-font-size); + line-height: 1em; +} +#article-container figure.highlight figcaption a, +#article-container figure.highlight .caption a { + float: right; + padding-right: 10px; + color: var(--hl-color); +} +#article-container figure.highlight figcaption a:hover, +#article-container figure.highlight .caption a:hover { + border-bottom-color: var(--hl-color); +} +#article-container .highlight-tools { + position: relative; + display: -webkit-box; + display: -moz-box; + display: -webkit-flex; + display: -ms-flexbox; + display: box; + display: flex; + -webkit-box-align: center; + -moz-box-align: center; + -o-box-align: center; + -ms-flex-align: center; + -webkit-align-items: center; + align-items: center; + overflow: hidden; + min-height: 24px; + height: 2.15em; + background: var(--hltools-bg); + color: var(--hltools-color); + font-size: var(--global-font-size); +} +#article-container .highlight-tools.closed ~ * { + display: none; +} +#article-container .highlight-tools .expand { + position: absolute; + padding: 0.57em 0.7em; + cursor: pointer; + -webkit-transition: -webkit-transform 0.3s; + -moz-transition: -moz-transform 0.3s; + -o-transition: -o-transform 0.3s; + -ms-transition: -ms-transform 0.3s; + transition: transform 0.3s; +} +#article-container .highlight-tools .expand + .code-lang { + left: 1.7em; +} +#article-container .highlight-tools .expand.closed { + -webkit-transition: all 0.3s; + -moz-transition: all 0.3s; + -o-transition: all 0.3s; + -ms-transition: all 0.3s; + transition: all 0.3s; + -webkit-transform: rotate(-90deg) !important; + -moz-transform: rotate(-90deg) !important; + -o-transform: rotate(-90deg) !important; + -ms-transform: rotate(-90deg) !important; + transform: rotate(-90deg) !important; +} +#article-container .highlight-tools .code-lang { + position: absolute; + left: 14px; + text-transform: uppercase; + font-weight: bold; + font-size: 1.15em; + -webkit-user-select: none; + -moz-user-select: none; + -ms-user-select: none; + user-select: none; +} +#article-container .highlight-tools .copy-notice { + position: absolute; + right: 2.4em; + opacity: 0; + -ms-filter: "progid:DXImageTransform.Microsoft.Alpha(Opacity=0)"; + filter: alpha(opacity=0); + -webkit-transition: opacity 0.4s; + -moz-transition: opacity 0.4s; + -o-transition: opacity 0.4s; + -ms-transition: opacity 0.4s; + transition: opacity 0.4s; +} +#article-container .highlight-tools .copy-button { + position: absolute; + right: 14px; + cursor: pointer; + -webkit-transition: color 0.2s; + -moz-transition: color 0.2s; + -o-transition: color 0.2s; + -ms-transition: color 0.2s; + transition: color 0.2s; +} +#article-container .highlight-tools .copy-button:hover { + color: #49b1f5; +} +#article-container .gutter { + -webkit-user-select: none; + -moz-user-select: none; + -ms-user-select: none; + user-select: none; +} +#article-container .gist table { + width: auto; +} +#article-container .gist table td { + border: none; +} +@-moz-keyframes code-expand-key { + 0% { + opacity: 0.6; + -ms-filter: "progid:DXImageTransform.Microsoft.Alpha(Opacity=60)"; + filter: alpha(opacity=60); + } + 50% { + opacity: 0.1; + -ms-filter: "progid:DXImageTransform.Microsoft.Alpha(Opacity=10)"; + filter: alpha(opacity=10); + } + 100% { + opacity: 0.6; + -ms-filter: "progid:DXImageTransform.Microsoft.Alpha(Opacity=60)"; + filter: alpha(opacity=60); + } +} +@-webkit-keyframes code-expand-key { + 0% { + opacity: 0.6; + -ms-filter: "progid:DXImageTransform.Microsoft.Alpha(Opacity=60)"; + filter: alpha(opacity=60); + } + 50% { + opacity: 0.1; + -ms-filter: "progid:DXImageTransform.Microsoft.Alpha(Opacity=10)"; + filter: alpha(opacity=10); + } + 100% { + opacity: 0.6; + -ms-filter: "progid:DXImageTransform.Microsoft.Alpha(Opacity=60)"; + filter: alpha(opacity=60); + } +} +@-o-keyframes code-expand-key { + 0% { + opacity: 0.6; + -ms-filter: "progid:DXImageTransform.Microsoft.Alpha(Opacity=60)"; + filter: alpha(opacity=60); + } + 50% { + opacity: 0.1; + -ms-filter: "progid:DXImageTransform.Microsoft.Alpha(Opacity=10)"; + filter: alpha(opacity=10); + } + 100% { + opacity: 0.6; + -ms-filter: "progid:DXImageTransform.Microsoft.Alpha(Opacity=60)"; + filter: alpha(opacity=60); + } +} +@keyframes code-expand-key { + 0% { + opacity: 0.6; + -ms-filter: "progid:DXImageTransform.Microsoft.Alpha(Opacity=60)"; + filter: alpha(opacity=60); + } + 50% { + opacity: 0.1; + -ms-filter: "progid:DXImageTransform.Microsoft.Alpha(Opacity=10)"; + filter: alpha(opacity=10); + } + 100% { + opacity: 0.6; + -ms-filter: "progid:DXImageTransform.Microsoft.Alpha(Opacity=60)"; + filter: alpha(opacity=60); + } +} +.error404 #error-wrap { + position: absolute; + top: 50%; + right: 0; + left: 0; + margin: 0 auto; + padding: 60px 20px 0; + max-width: 1000px; + -webkit-transform: translate(0, -50%); + -moz-transform: translate(0, -50%); + -o-transform: translate(0, -50%); + -ms-transform: translate(0, -50%); + transform: translate(0, -50%); +} +.error404 #error-wrap .error-content { + overflow: hidden; + margin: 0 20px; + height: 360px; +} +@media screen and (max-width: 768px) { + .error404 #error-wrap .error-content { + margin: 0; + height: 500px; + } +} +.error404 #error-wrap .error-content .error-img { + display: inline-block; + overflow: hidden; + width: 50%; + height: 100%; +} +@media screen and (max-width: 768px) { + .error404 #error-wrap .error-content .error-img { + width: 100%; + height: 45%; + } +} +.error404 #error-wrap .error-content .error-img img { + background-color: #49b1f5; +} +.error404 #error-wrap .error-content .error-info { + display: -webkit-inline-box; + display: -moz-inline-box; + display: -webkit-inline-flex; + display: -ms-inline-flexbox; + display: inline-box; + display: inline-flex; + -webkit-box-orient: vertical; + -moz-box-orient: vertical; + -o-box-orient: vertical; + -webkit-flex-direction: column; + -ms-flex-direction: column; + flex-direction: column; + -webkit-box-pack: center; + -moz-box-pack: center; + -o-box-pack: center; + -ms-flex-pack: center; + -webkit-justify-content: center; + justify-content: center; + -ms-flex-line-pack: center; + -webkit-align-content: center; + align-content: center; + width: 50%; + height: 100%; + vertical-align: top; + text-align: center; +} +@media screen and (max-width: 768px) { + .error404 #error-wrap .error-content .error-info { + width: 100%; + height: 55%; + } +} +.error404 #error-wrap .error-content .error-info .error_title { + margin-top: -0.6em; + font-size: 9em; +} +@media screen and (max-width: 768px) { + .error404 #error-wrap .error-content .error-info .error_title { + font-size: 8em; + } +} +.error404 #error-wrap .error-content .error-info .error_subtitle { + margin-top: -3em; + word-break: break-word; + font-size: 1.6em; + -webkit-line-clamp: 2; +} +.error404 + #rightside { + display: none; +} +.article-sort { + margin-left: 10px; + padding-left: 20px; + border-left: 2px solid #aadafa; +} +.article-sort-title { + position: relative; + margin-left: 10px; + padding-bottom: 20px; + padding-left: 20px; + font-size: 1.72em; +} +.article-sort-title:hover:before { + border-color: var(--pseudo-hover); +} +.article-sort-title:before { + position: absolute; + top: calc(((100% - 36px) / 2)); + left: -9px; + z-index: 1; + width: 10px; + height: 10px; + border: 5px solid #49b1f5; + border-radius: 10px; + background: var(--card-bg); + content: ''; + line-height: 10px; + -webkit-transition: all 0.2s ease-in-out; + -moz-transition: all 0.2s ease-in-out; + -o-transition: all 0.2s ease-in-out; + -ms-transition: all 0.2s ease-in-out; + transition: all 0.2s ease-in-out; +} +.article-sort-title:after { + position: absolute; + bottom: 0; + left: 0; + z-index: 0; + width: 2px; + height: 1.5em; + background: #aadafa; + content: ''; +} +.article-sort-item { + position: relative; + display: -webkit-box; + display: -moz-box; + display: -webkit-flex; + display: -ms-flexbox; + display: box; + display: flex; + -webkit-box-align: center; + -moz-box-align: center; + -o-box-align: center; + -ms-flex-align: center; + -webkit-align-items: center; + align-items: center; + margin: 0 0 20px 10px; + -webkit-transition: all 0.2s ease-in-out; + -moz-transition: all 0.2s ease-in-out; + -o-transition: all 0.2s ease-in-out; + -ms-transition: all 0.2s ease-in-out; + transition: all 0.2s ease-in-out; +} +.article-sort-item:hover:before { + border-color: var(--pseudo-hover); +} +.article-sort-item:before { + position: absolute; + left: calc(-20px - 17px); + width: 6px; + height: 6px; + border: 3px solid #49b1f5; + border-radius: 6px; + background: var(--card-bg); + content: ''; + -webkit-transition: all 0.2s ease-in-out; + -moz-transition: all 0.2s ease-in-out; + -o-transition: all 0.2s ease-in-out; + -ms-transition: all 0.2s ease-in-out; + transition: all 0.2s ease-in-out; +} +.article-sort-item.no-article-cover { + height: 80px; +} +.article-sort-item.no-article-cover .article-sort-item-info { + padding: 0; +} +.article-sort-item.year { + font-size: 1.43em; +} +.article-sort-item.year:hover:before { + border-color: #49b1f5; +} +.article-sort-item.year:before { + border-color: var(--pseudo-hover); +} +.article-sort-item-time { + color: #858585; + font-size: 95%; +} +.article-sort-item-time time { + padding-left: 6px; + cursor: default; +} +.article-sort-item-title { + color: var(--font-color); + font-size: 1.1em; + -webkit-transition: all 0.3s; + -moz-transition: all 0.3s; + -o-transition: all 0.3s; + -ms-transition: all 0.3s; + transition: all 0.3s; + -webkit-line-clamp: 2; +} +.article-sort-item-title:hover { + color: #49b1f5; + -webkit-transform: translateX(10px); + -moz-transform: translateX(10px); + -o-transform: translateX(10px); + -ms-transform: translateX(10px); + transform: translateX(10px); +} +.article-sort-item-img { + overflow: hidden; + width: 80px; + height: 80px; +} +.article-sort-item-info { + -webkit-box-flex: 1; + -moz-box-flex: 1; + -o-box-flex: 1; + box-flex: 1; + -webkit-flex: 1; + -ms-flex: 1; + flex: 1; + padding: 0 16px; +} +.category-lists .category-title { + font-size: 2.57em; +} +@media screen and (max-width: 768px) { + .category-lists .category-title { + font-size: 2em; + } +} +.category-lists .category-list { + margin-bottom: 0; +} +.category-lists .category-list a { + color: var(--font-color); +} +.category-lists .category-list a:hover { + color: #49b1f5; +} +.category-lists .category-list .category-list-count { + margin-left: 8px; + color: #858585; +} +.category-lists .category-list .category-list-count:before { + content: '('; +} +.category-lists .category-list .category-list-count:after { + content: ')'; +} +.category-lists ul { + padding: 0 0 0 20px; +} +.category-lists ul ul { + padding-left: 4px; +} +.category-lists ul li { + position: relative; + margin: 6px 0; + padding: 0.12em 0.4em 0.12em 1.4em; +} +#body-wrap { + display: -webkit-box; + display: -moz-box; + display: -webkit-flex; + display: -ms-flexbox; + display: box; + display: flex; + -webkit-box-orient: vertical; + -moz-box-orient: vertical; + -o-box-orient: vertical; + -webkit-flex-direction: column; + -ms-flex-direction: column; + flex-direction: column; + min-height: 100vh; +} +.layout { + display: -webkit-box; + display: -moz-box; + display: -webkit-flex; + display: -ms-flexbox; + display: box; + display: flex; + -webkit-box-flex: 1; + -moz-box-flex: 1; + -o-box-flex: 1; + box-flex: 1; + -webkit-flex: 1 auto; + -ms-flex: 1 auto; + flex: 1 auto; + margin: 0 auto; + padding: 40px 15px; + max-width: 1200px; + width: 100%; +} +@media screen and (max-width: 900px) { + .layout { + -webkit-box-orient: vertical; + -moz-box-orient: vertical; + -o-box-orient: vertical; + -webkit-flex-direction: column; + -ms-flex-direction: column; + flex-direction: column; + } +} +@media screen and (max-width: 768px) { + .layout { + padding: 20px 5px; + } +} +@media screen and (min-width: 2000px) { + .layout { + max-width: 1700px; + } +} +.layout > div:first-child:not(.recent-posts) { + -webkit-align-self: flex-start; + align-self: flex-start; + -ms-flex-item-align: start; + padding: 50px 40px; +} +@media screen and (max-width: 768px) { + .layout > div:first-child:not(.recent-posts) { + padding: 36px 14px; + } +} +.layout > div:first-child { + width: 74%; + -webkit-transition: all 0.3s; + -moz-transition: all 0.3s; + -o-transition: all 0.3s; + -ms-transition: all 0.3s; + transition: all 0.3s; +} +@media screen and (max-width: 900px) { + .layout > div:first-child { + width: 100% !important; + } +} +.layout.hide-aside { + max-width: 1000px; +} +@media screen and (min-width: 2000px) { + .layout.hide-aside { + max-width: 1300px; + } +} +.layout.hide-aside > div { + width: 100% !important; +} +.apple #page-header.full_page { + background-attachment: scroll !important; +} +.apple .recent-post-item, +.apple .avatar-img, +.apple .flink-item-icon { + -webkit-transform: translateZ(0); + -moz-transform: translateZ(0); + -o-transform: translateZ(0); + -ms-transform: translateZ(0); + transform: translateZ(0); +} +#article-container .flink { + margin-bottom: 20px; +} +#article-container .flink .flink-list { + overflow: auto; + padding: 10px 10px 0; + text-align: center; +} +#article-container .flink .flink-list > .flink-list-item { + position: relative; + float: left; + overflow: hidden; + margin: 15px 7px; + width: calc(100% / 3 - 15px); + height: 90px; + border-radius: 8px; + line-height: 17px; + -webkit-transform: translateZ(0); +} +@media screen and (max-width: 1024px) { + #article-container .flink .flink-list > .flink-list-item { + width: calc(50% - 15px) !important; + } +} +@media screen and (max-width: 600px) { + #article-container .flink .flink-list > .flink-list-item { + width: calc(100% - 15px) !important; + } +} +#article-container .flink .flink-list > .flink-list-item:hover .flink-item-icon { + margin-left: -10px; + width: 0; +} +#article-container .flink .flink-list > .flink-list-item:before { + position: absolute; + top: 0; + right: 0; + bottom: 0; + left: 0; + z-index: -1; + background: var(--text-bg-hover); + content: ''; + -webkit-transition: -webkit-transform 0.3s ease-out; + -moz-transition: -moz-transform 0.3s ease-out; + -o-transition: -o-transform 0.3s ease-out; + -ms-transition: -ms-transform 0.3s ease-out; + transition: transform 0.3s ease-out; + -webkit-transform: scale(0); + -moz-transform: scale(0); + -o-transform: scale(0); + -ms-transform: scale(0); + transform: scale(0); +} +#article-container .flink .flink-list > .flink-list-item:hover:before, +#article-container .flink .flink-list > .flink-list-item:focus:before, +#article-container .flink .flink-list > .flink-list-item:active:before { + -webkit-transform: scale(1); + -moz-transform: scale(1); + -o-transform: scale(1); + -ms-transform: scale(1); + transform: scale(1); +} +#article-container .flink .flink-list > .flink-list-item a { + color: var(--font-color); + text-decoration: none; +} +#article-container .flink .flink-list > .flink-list-item a .flink-item-icon { + float: left; + overflow: hidden; + margin: 15px 10px; + width: 60px; + height: 60px; + border-radius: 35px; + -webkit-transition: width 0.3s ease-out; + -moz-transition: width 0.3s ease-out; + -o-transition: width 0.3s ease-out; + -ms-transition: width 0.3s ease-out; + transition: width 0.3s ease-out; +} +#article-container .flink .flink-list > .flink-list-item a .flink-item-icon img { + width: 100%; + height: 100%; + -webkit-transition: filter 375ms ease-in 0.2s, -webkit-transform 0.3s; + -moz-transition: filter 375ms ease-in 0.2s, -moz-transform 0.3s; + -o-transition: filter 375ms ease-in 0.2s, -o-transform 0.3s; + -ms-transition: filter 375ms ease-in 0.2s, -ms-transform 0.3s; + transition: filter 375ms ease-in 0.2s, transform 0.3s; + object-fit: cover; +} +#article-container .flink .flink-list > .flink-list-item a .img-alt { + display: none; +} +#article-container .flink .flink-item-name { + padding: 16px 10px 0 0; + height: 40px; + font-weight: bold; + font-size: 1.43em; +} +#article-container .flink .flink-item-desc { + padding: 16px 10px 16px 0; + height: 50px; + font-size: 0.93em; +} +#article-container .flink .flink-name { + margin-bottom: 5px; + font-weight: bold; + font-size: 1.5em; +} +#recent-posts > .recent-post-item:not(:first-child) { + margin-top: 20px; +} +#recent-posts > .recent-post-item { + display: -webkit-box; + display: -moz-box; + display: -webkit-flex; + display: -ms-flexbox; + display: box; + display: flex; + -webkit-box-orient: horizontal; + -moz-box-orient: horizontal; + -o-box-orient: horizontal; + -webkit-flex-direction: row; + -ms-flex-direction: row; + flex-direction: row; + -webkit-box-align: center; + -moz-box-align: center; + -o-box-align: center; + -ms-flex-align: center; + -webkit-align-items: center; + align-items: center; + overflow: hidden; + height: 18em; +} +@media screen and (max-width: 768px) { + #recent-posts > .recent-post-item { + -webkit-box-orient: vertical; + -moz-box-orient: vertical; + -o-box-orient: vertical; + -webkit-flex-direction: column; + -ms-flex-direction: column; + flex-direction: column; + height: auto; + } +} +#recent-posts > .recent-post-item:hover img.post-bg { + -webkit-transform: scale(1.1); + -moz-transform: scale(1.1); + -o-transform: scale(1.1); + -ms-transform: scale(1.1); + transform: scale(1.1); +} +#recent-posts > .recent-post-item.ads-wrap { + display: block !important; + height: auto !important; +} +#recent-posts > .recent-post-item .post_cover { + overflow: hidden; + width: 44%; + height: 100%; +} +@media screen and (max-width: 768px) { + #recent-posts > .recent-post-item .post_cover { + width: 100%; + height: 230px; + } +} +#recent-posts > .recent-post-item .post_cover.right { + -webkit-box-ordinal-group: 1; + -moz-box-ordinal-group: 1; + -o-box-ordinal-group: 1; + -ms-flex-order: 1; + -webkit-order: 1; + order: 1; +} +@media screen and (max-width: 768px) { + #recent-posts > .recent-post-item .post_cover.right { + -webkit-box-ordinal-group: 0; + -moz-box-ordinal-group: 0; + -o-box-ordinal-group: 0; + -ms-flex-order: 0; + -webkit-order: 0; + order: 0; + } +} +#recent-posts > .recent-post-item >.recent-post-info { + padding: 0 40px; + width: 57%; +} +@media screen and (max-width: 768px) { + #recent-posts > .recent-post-item >.recent-post-info { + padding: 20px 20px 30px; + width: 100%; + } +} +#recent-posts > .recent-post-item >.recent-post-info.no-cover { + width: 100%; +} +@media screen and (max-width: 768px) { + #recent-posts > .recent-post-item >.recent-post-info.no-cover { + padding: 30px 20px; + } +} +#recent-posts > .recent-post-item >.recent-post-info > .article-title { + color: var(--text-highlight-color); + font-size: 1.72em; + line-height: 1.4; + -webkit-transition: all 0.2s ease-in-out; + -moz-transition: all 0.2s ease-in-out; + -o-transition: all 0.2s ease-in-out; + -ms-transition: all 0.2s ease-in-out; + transition: all 0.2s ease-in-out; + -webkit-line-clamp: 2; +} +@media screen and (max-width: 768px) { + #recent-posts > .recent-post-item >.recent-post-info > .article-title { + font-size: 1.43em; + } +} +#recent-posts > .recent-post-item >.recent-post-info > .article-title:hover { + color: #49b1f5; +} +#recent-posts > .recent-post-item >.recent-post-info > .article-meta-wrap { + margin: 6px 0; + color: #858585; + font-size: 90%; +} +#recent-posts > .recent-post-item >.recent-post-info > .article-meta-wrap > .post-meta-date { + cursor: default; +} +#recent-posts > .recent-post-item >.recent-post-info > .article-meta-wrap .sticky { + color: #ff7242; +} +#recent-posts > .recent-post-item >.recent-post-info > .article-meta-wrap i { + margin: 0 4px 0 0; +} +#recent-posts > .recent-post-item >.recent-post-info > .article-meta-wrap .fa-spinner { + margin: 0; +} +#recent-posts > .recent-post-item >.recent-post-info > .article-meta-wrap .article-meta-label { + padding-right: 4px; +} +#recent-posts > .recent-post-item >.recent-post-info > .article-meta-wrap .article-meta-separator { + margin: 0 6px; +} +#recent-posts > .recent-post-item >.recent-post-info > .article-meta-wrap .article-meta-link { + margin: 0 4px; +} +#recent-posts > .recent-post-item >.recent-post-info > .article-meta-wrap a { + color: #858585; +} +#recent-posts > .recent-post-item >.recent-post-info > .article-meta-wrap a:hover { + color: #49b1f5; + text-decoration: underline; +} +#recent-posts > .recent-post-item >.recent-post-info > .content { + -webkit-line-clamp: 2; +} +.tag-cloud-list a { + display: inline-block; + padding: 0 8px; + -webkit-transition: all 0.3s; + -moz-transition: all 0.3s; + -o-transition: all 0.3s; + -ms-transition: all 0.3s; + transition: all 0.3s; +} +.tag-cloud-list a:hover { + color: #49b1f5 !important; + -webkit-transform: scale(1.1); + -moz-transform: scale(1.1); + -o-transform: scale(1.1); + -ms-transform: scale(1.1); + transform: scale(1.1); +} +@media screen and (max-width: 768px) { + .tag-cloud-list a { + zoom: 0.85; + } +} +.tag-cloud-title { + font-size: 2.57em; +} +@media screen and (max-width: 768px) { + .tag-cloud-title { + font-size: 2em; + } +} +h1.page-title + .tag-cloud-list { + text-align: left; +} +#aside-content { + width: 26%; +} +@media screen and (min-width: 900px) { + #aside-content { + padding-left: 15px; + } +} +@media screen and (max-width: 900px) { + #aside-content { + width: 100%; + } +} +#aside-content > .card-widget:first-child { + margin-top: 0; +} +@media screen and (max-width: 900px) { + #aside-content > .card-widget:first-child { + margin-top: 20px; + } +} +#aside-content .card-widget { + position: relative; + overflow: hidden; + margin-top: 20px; + padding: 20px 24px; +} +#aside-content .card-info .author-info__name { + font-weight: 500; + font-size: 1.57em; +} +#aside-content .card-info .author-info__description { + margin-top: -0.42em; +} +#aside-content .card-info .card-info-data { + margin: 14px 0 4px; +} +#aside-content .card-info .card-info-social-icons { + margin: 6px 0 -6px; +} +#aside-content .card-info .card-info-social-icons .social-icon { + margin: 0 10px; + color: var(--font-color); + font-size: 1.4em; +} +#aside-content .card-info .card-info-social-icons i { + -webkit-transition: all 0.3s; + -moz-transition: all 0.3s; + -o-transition: all 0.3s; + -ms-transition: all 0.3s; + transition: all 0.3s; +} +#aside-content .card-info .card-info-social-icons i:hover { + -webkit-transform: rotate(360deg); + -moz-transform: rotate(360deg); + -o-transform: rotate(360deg); + -ms-transform: rotate(360deg); + transform: rotate(360deg); +} +#aside-content .card-info #card-info-btn { + display: block; + margin-top: 14px; + background-color: var(--btn-bg); + color: var(--btn-color); + text-align: center; + line-height: 2.4; +} +#aside-content .card-info #card-info-btn:hover { + background-color: var(--btn-hover-color); +} +#aside-content .card-info #card-info-btn span { + padding-left: 10px; +} +#aside-content .item-headline { + padding-bottom: 6px; + font-size: 1.2em; +} +#aside-content .item-headline span { + margin-left: 6px; +} +@media screen and (min-width: 900px) { + #aside-content .sticky_layout { + position: sticky; + position: -webkit-sticky; + top: 20px; + -webkit-transition: top 0.3s; + -moz-transition: top 0.3s; + -o-transition: top 0.3s; + -ms-transition: top 0.3s; + transition: top 0.3s; + } +} +#aside-content .card-tag-cloud a { + display: inline-block; + padding: 0 4px; +} +#aside-content .card-tag-cloud a:hover { + color: #49b1f5 !important; +} +#aside-content .aside-list > span { + display: block; + margin-bottom: 10px; + text-align: center; +} +#aside-content .aside-list > .aside-list-item { + display: -webkit-box; + display: -moz-box; + display: -webkit-flex; + display: -ms-flexbox; + display: box; + display: flex; + -webkit-box-align: center; + -moz-box-align: center; + -o-box-align: center; + -ms-flex-align: center; + -webkit-align-items: center; + align-items: center; + padding: 6px 0; +} +#aside-content .aside-list > .aside-list-item:first-child { + padding-top: 0; +} +#aside-content .aside-list > .aside-list-item:not(:last-child) { + border-bottom: 1px dashed #f5f5f5; +} +#aside-content .aside-list > .aside-list-item:last-child { + padding-bottom: 0; +} +#aside-content .aside-list > .aside-list-item .thumbnail { + overflow: hidden; + width: 4.2em; + height: 4.2em; +} +#aside-content .aside-list > .aside-list-item .content { + -webkit-box-flex: 1; + -moz-box-flex: 1; + -o-box-flex: 1; + box-flex: 1; + -webkit-flex: 1; + -ms-flex: 1; + flex: 1; + padding-left: 10px; + word-break: break-all; +} +#aside-content .aside-list > .aside-list-item .content > .name { + -webkit-line-clamp: 1; +} +#aside-content .aside-list > .aside-list-item .content > time, +#aside-content .aside-list > .aside-list-item .content > .name { + display: block; + color: #858585; + font-size: 85%; +} +#aside-content .aside-list > .aside-list-item .content > .title, +#aside-content .aside-list > .aside-list-item .content > .comment { + color: var(--font-color); + font-size: 95%; + line-height: 1.5; + -webkit-line-clamp: 2; +} +#aside-content .aside-list > .aside-list-item .content > .title:hover, +#aside-content .aside-list > .aside-list-item .content > .comment:hover { + color: #49b1f5; +} +#aside-content .aside-list > .aside-list-item.no-cover { + min-height: 4.4em; +} +#aside-content .card-archives ul.card-archive-list, +#aside-content .card-categories ul.card-category-list { + margin: 0; + padding: 0; + list-style: none; +} +#aside-content .card-archives ul.card-archive-list > .card-archive-list-item a, +#aside-content .card-categories ul.card-category-list > .card-category-list-item a { + display: -webkit-box; + display: -moz-box; + display: -webkit-flex; + display: -ms-flexbox; + display: box; + display: flex; + -webkit-box-orient: horizontal; + -moz-box-orient: horizontal; + -o-box-orient: horizontal; + -webkit-flex-direction: row; + -ms-flex-direction: row; + flex-direction: row; + padding: 3px 10px; + color: var(--font-color); + -webkit-transition: all 0.4s; + -moz-transition: all 0.4s; + -o-transition: all 0.4s; + -ms-transition: all 0.4s; + transition: all 0.4s; +} +#aside-content .card-archives ul.card-archive-list > .card-archive-list-item a:hover, +#aside-content .card-categories ul.card-category-list > .card-category-list-item a:hover { + padding: 3px 17px; + background-color: var(--text-bg-hover); +} +#aside-content .card-archives ul.card-archive-list > .card-archive-list-item a span:first-child, +#aside-content .card-categories ul.card-category-list > .card-category-list-item a span:first-child { + -webkit-box-flex: 1; + -moz-box-flex: 1; + -o-box-flex: 1; + box-flex: 1; + -webkit-flex: 1; + -ms-flex: 1; + flex: 1; +} +#aside-content .card-categories .card-category-list.child { + padding: 0 0 0 16px; +} +#aside-content .card-categories .card-category-list > .parent > a .card-category-list-name { + width: 70% !important; +} +#aside-content .card-categories .card-category-list > .parent > a .card-category-list-count { + width: calc(100% - 70% - 20px); + text-align: right; +} +#aside-content .card-categories .card-category-list > .parent i { + float: right; + margin-right: -0.5em; + padding: 0.5em; + -webkit-transition: -webkit-transform 0.3s; + -moz-transition: -moz-transform 0.3s; + -o-transition: -o-transform 0.3s; + -ms-transition: -ms-transform 0.3s; + transition: transform 0.3s; + -webkit-transform: rotate(0); + -moz-transform: rotate(0); + -o-transform: rotate(0); + -ms-transform: rotate(0); + transform: rotate(0); +} +#aside-content .card-categories .card-category-list > .parent i.expand { + -webkit-transform: rotate(-90deg); + -moz-transform: rotate(-90deg); + -o-transform: rotate(-90deg); + -ms-transform: rotate(-90deg); + transform: rotate(-90deg); +} +#aside-content .card-webinfo .webinfo .webinfo-item { + display: -webkit-box; + display: -moz-box; + display: -webkit-flex; + display: -ms-flexbox; + display: box; + display: flex; + -webkit-box-align: center; + -moz-box-align: center; + -o-box-align: center; + -ms-flex-align: center; + -webkit-align-items: center; + align-items: center; + padding: 2px 10px 0; +} +#aside-content .card-webinfo .webinfo .webinfo-item div:first-child { + -webkit-box-flex: 1; + -moz-box-flex: 1; + -o-box-flex: 1; + box-flex: 1; + -webkit-flex: 1; + -ms-flex: 1; + flex: 1; + padding-right: 20px; +} +@media screen and (min-width: 901px) { + #aside-content #card-toc { + right: 0 !important; + } +} +@media screen and (max-width: 900px) { + #aside-content #card-toc { + position: fixed; + right: -100%; + bottom: 30px; + z-index: 100; + max-width: 380px; + max-height: calc(100% - 60px); + width: calc(100% - 80px); + opacity: 0; + -ms-filter: "progid:DXImageTransform.Microsoft.Alpha(Opacity=0)"; + filter: alpha(opacity=0); + -webkit-transition: initial; + -moz-transition: initial; + -o-transition: initial; + -ms-transition: initial; + transition: initial; + -webkit-transform-origin: right bottom; + -moz-transform-origin: right bottom; + -o-transform-origin: right bottom; + -ms-transform-origin: right bottom; + transform-origin: right bottom; + } +} +#aside-content #card-toc .toc-percentage { + float: right; + margin-top: -9px; + color: #a9a9a9; + font-style: italic; + font-size: 140%; +} +#aside-content #card-toc .toc-content { + overflow-y: scroll; + overflow-y: overlay; + margin: 0 -24px; + max-height: calc(100vh - 120px); +} +@media screen and (max-width: 900px) { + #aside-content #card-toc .toc-content { + max-height: calc(100vh - 140px); + } +} +#aside-content #card-toc .toc-content > * { + margin: 0 20px !important; +} +#aside-content #card-toc .toc-content > * > .toc-item > .toc-child { + margin-left: 10px; + padding-left: 10px; + border-left: 1px solid var(--dark-grey); +} +#aside-content #card-toc .toc-content:not(.is-expand) .toc-child { + display: none; +} +@media screen and (max-width: 900px) { + #aside-content #card-toc .toc-content:not(.is-expand) .toc-child { + display: block !important; + } +} +#aside-content #card-toc .toc-content:not(.is-expand) .toc-item.active .toc-child { + display: block; +} +#aside-content #card-toc .toc-content ol, +#aside-content #card-toc .toc-content li { + list-style: none; +} +#aside-content #card-toc .toc-content > ol { + padding: 0 !important; +} +#aside-content #card-toc .toc-content ol { + margin: 0; + padding-left: 18px; +} +#aside-content #card-toc .toc-content .toc-link { + display: block; + margin: 4px 0; + padding: 1px 6px; + color: var(--toc-link-color); + -webkit-transition: all 0.2s ease-in-out; + -moz-transition: all 0.2s ease-in-out; + -o-transition: all 0.2s ease-in-out; + -ms-transition: all 0.2s ease-in-out; + transition: all 0.2s ease-in-out; +} +#aside-content #card-toc .toc-content .toc-link:hover { + color: #49b1f5; +} +#aside-content #card-toc .toc-content .toc-link.active { + background: #00c4b6; + color: #fff; +} +#aside-content .sticky_layout:only-child > :first-child { + margin-top: 0; +} +#aside-content .card-more-btn { + float: right; + color: inherit; +} +#aside-content .card-more-btn:hover { + -webkit-animation: more-btn-move 1s infinite; + -moz-animation: more-btn-move 1s infinite; + -o-animation: more-btn-move 1s infinite; + -ms-animation: more-btn-move 1s infinite; + animation: more-btn-move 1s infinite; +} +#aside-content .card-announcement .item-headline i { + color: #f00; +} +.avatar-img { + overflow: hidden; + margin: 0 auto; + width: 110px; + height: 110px; + border-radius: 70px; +} +.avatar-img img { + width: 100%; + height: 100%; + -webkit-transition: filter 375ms ease-in 0.2s, -webkit-transform 0.3s; + -moz-transition: filter 375ms ease-in 0.2s, -moz-transform 0.3s; + -o-transition: filter 375ms ease-in 0.2s, -o-transform 0.3s; + -ms-transition: filter 375ms ease-in 0.2s, -ms-transform 0.3s; + transition: filter 375ms ease-in 0.2s, transform 0.3s; + object-fit: cover; +} +.avatar-img img:hover { + -webkit-transform: rotate(360deg); + -moz-transform: rotate(360deg); + -o-transform: rotate(360deg); + -ms-transform: rotate(360deg); + transform: rotate(360deg); +} +.site-data { + display: table; + width: 100%; + table-layout: fixed; +} +.site-data > a { + display: table-cell; +} +.site-data > a div { + -webkit-transition: all 0.3s; + -moz-transition: all 0.3s; + -o-transition: all 0.3s; + -ms-transition: all 0.3s; + transition: all 0.3s; +} +.site-data > a:hover div { + color: #49b1f5 !important; +} +.site-data > a .headline { + color: var(--font-color); +} +.site-data > a .length-num { + margin-top: -0.32em; + color: var(--text-highlight-color); + font-size: 1.4em; +} +@media screen and (min-width: 900px) { + html.hide-aside .layout { + -webkit-box-pack: center; + -moz-box-pack: center; + -o-box-pack: center; + -ms-flex-pack: center; + -webkit-justify-content: center; + justify-content: center; + } + html.hide-aside .layout > .aside-content { + display: none; + } + html.hide-aside .layout > div:first-child { + width: 80%; + } +} +.page .sticky_layout { + display: -webkit-box; + display: -moz-box; + display: -webkit-flex; + display: -ms-flexbox; + display: box; + display: flex; + -webkit-box-orient: vertical; + -moz-box-orient: vertical; + -o-box-orient: vertical; + -webkit-flex-direction: column; + -ms-flex-direction: column; + flex-direction: column; +} +@-moz-keyframes more-btn-move { + 0%, 100% { + -webkit-transform: translateX(0); + -moz-transform: translateX(0); + -o-transform: translateX(0); + -ms-transform: translateX(0); + transform: translateX(0); + } + 50% { + -webkit-transform: translateX(3px); + -moz-transform: translateX(3px); + -o-transform: translateX(3px); + -ms-transform: translateX(3px); + transform: translateX(3px); + } +} +@-webkit-keyframes more-btn-move { + 0%, 100% { + -webkit-transform: translateX(0); + -moz-transform: translateX(0); + -o-transform: translateX(0); + -ms-transform: translateX(0); + transform: translateX(0); + } + 50% { + -webkit-transform: translateX(3px); + -moz-transform: translateX(3px); + -o-transform: translateX(3px); + -ms-transform: translateX(3px); + transform: translateX(3px); + } +} +@-o-keyframes more-btn-move { + 0%, 100% { + -webkit-transform: translateX(0); + -moz-transform: translateX(0); + -o-transform: translateX(0); + -ms-transform: translateX(0); + transform: translateX(0); + } + 50% { + -webkit-transform: translateX(3px); + -moz-transform: translateX(3px); + -o-transform: translateX(3px); + -ms-transform: translateX(3px); + transform: translateX(3px); + } +} +@keyframes more-btn-move { + 0%, 100% { + -webkit-transform: translateX(0); + -moz-transform: translateX(0); + -o-transform: translateX(0); + -ms-transform: translateX(0); + transform: translateX(0); + } + 50% { + -webkit-transform: translateX(3px); + -moz-transform: translateX(3px); + -o-transform: translateX(3px); + -ms-transform: translateX(3px); + transform: translateX(3px); + } +} +@-moz-keyframes toc-open { + 0% { + -webkit-transform: scale(0.7); + -moz-transform: scale(0.7); + -o-transform: scale(0.7); + -ms-transform: scale(0.7); + transform: scale(0.7); + } + 100% { + -webkit-transform: scale(1); + -moz-transform: scale(1); + -o-transform: scale(1); + -ms-transform: scale(1); + transform: scale(1); + } +} +@-webkit-keyframes toc-open { + 0% { + -webkit-transform: scale(0.7); + -moz-transform: scale(0.7); + -o-transform: scale(0.7); + -ms-transform: scale(0.7); + transform: scale(0.7); + } + 100% { + -webkit-transform: scale(1); + -moz-transform: scale(1); + -o-transform: scale(1); + -ms-transform: scale(1); + transform: scale(1); + } +} +@-o-keyframes toc-open { + 0% { + -webkit-transform: scale(0.7); + -moz-transform: scale(0.7); + -o-transform: scale(0.7); + -ms-transform: scale(0.7); + transform: scale(0.7); + } + 100% { + -webkit-transform: scale(1); + -moz-transform: scale(1); + -o-transform: scale(1); + -ms-transform: scale(1); + transform: scale(1); + } +} +@keyframes toc-open { + 0% { + -webkit-transform: scale(0.7); + -moz-transform: scale(0.7); + -o-transform: scale(0.7); + -ms-transform: scale(0.7); + transform: scale(0.7); + } + 100% { + -webkit-transform: scale(1); + -moz-transform: scale(1); + -o-transform: scale(1); + -ms-transform: scale(1); + transform: scale(1); + } +} +@-moz-keyframes toc-close { + 0% { + -webkit-transform: scale(1); + -moz-transform: scale(1); + -o-transform: scale(1); + -ms-transform: scale(1); + transform: scale(1); + } + 100% { + -webkit-transform: scale(0.7); + -moz-transform: scale(0.7); + -o-transform: scale(0.7); + -ms-transform: scale(0.7); + transform: scale(0.7); + } +} +@-webkit-keyframes toc-close { + 0% { + -webkit-transform: scale(1); + -moz-transform: scale(1); + -o-transform: scale(1); + -ms-transform: scale(1); + transform: scale(1); + } + 100% { + -webkit-transform: scale(0.7); + -moz-transform: scale(0.7); + -o-transform: scale(0.7); + -ms-transform: scale(0.7); + transform: scale(0.7); + } +} +@-o-keyframes toc-close { + 0% { + -webkit-transform: scale(1); + -moz-transform: scale(1); + -o-transform: scale(1); + -ms-transform: scale(1); + transform: scale(1); + } + 100% { + -webkit-transform: scale(0.7); + -moz-transform: scale(0.7); + -o-transform: scale(0.7); + -ms-transform: scale(0.7); + transform: scale(0.7); + } +} +@keyframes toc-close { + 0% { + -webkit-transform: scale(1); + -moz-transform: scale(1); + -o-transform: scale(1); + -ms-transform: scale(1); + transform: scale(1); + } + 100% { + -webkit-transform: scale(0.7); + -moz-transform: scale(0.7); + -o-transform: scale(0.7); + -ms-transform: scale(0.7); + transform: scale(0.7); + } +} +#post-comment .comment-head { + margin-bottom: 20px; +} +#post-comment .comment-head .comment-headline { + display: inline-block; + vertical-align: middle; + font-weight: 700; + font-size: 1.43em; +} +#post-comment .comment-head #comment-switch { + display: inline-block; + float: right; + margin: 2px auto 0; + padding: 4px 16px; + width: max-content; + border-radius: 8px; + background: #f6f8fa; +} +#post-comment .comment-head #comment-switch .first-comment { + color: #49b1f5; +} +#post-comment .comment-head #comment-switch .second-comment { + color: #ff7242; +} +#post-comment .comment-head #comment-switch .switch-btn { + position: relative; + display: inline-block; + margin: -4px 8px 0; + width: 42px; + height: 22px; + border-radius: 34px; + background-color: #49b1f5; + vertical-align: middle; + cursor: pointer; + -webkit-transition: 0.4s; + -moz-transition: 0.4s; + -o-transition: 0.4s; + -ms-transition: 0.4s; + transition: 0.4s; +} +#post-comment .comment-head #comment-switch .switch-btn:before { + position: absolute; + bottom: 4px; + left: 4px; + width: 14px; + height: 14px; + border-radius: 50%; + background-color: #fff; + content: ''; + -webkit-transition: 0.4s; + -moz-transition: 0.4s; + -o-transition: 0.4s; + -ms-transition: 0.4s; + transition: 0.4s; +} +#post-comment .comment-head #comment-switch .switch-btn.move { + background-color: #ff7242; +} +#post-comment .comment-head #comment-switch .switch-btn.move:before { + -webkit-transform: translateX(20px); + -moz-transform: translateX(20px); + -o-transform: translateX(20px); + -ms-transform: translateX(20px); + transform: translateX(20px); +} +#post-comment .comment-wrap > div:nth-child(2) { + display: none; +} +#footer { + position: relative; + background-color: #49b1f5; + background-attachment: scroll; + background-position: bottom; + background-size: cover; +} +#footer-wrap { + position: relative; + padding: 40px 20px; + color: var(--light-grey); + text-align: center; +} +#footer-wrap a { + color: var(--light-grey); +} +#footer-wrap a:hover { + text-decoration: underline; +} +#footer-wrap .footer-separator { + margin: 0 4px; +} +#footer-wrap .icp-icon { + padding: 0 4px; + max-height: 1.4em; + width: auto; + vertical-align: text-bottom; +} +#page-header { + position: relative; + width: 100%; + background-color: #49b1f5; + background-position: center center; + background-size: cover; + background-repeat: no-repeat; + -webkit-transition: all 0.5s; + -moz-transition: all 0.5s; + -o-transition: all 0.5s; + -ms-transition: all 0.5s; + transition: all 0.5s; +} +#page-header:not(.not-top-img):before { + position: absolute; + width: 100%; + height: 100%; + background-color: rgba(0,0,0,0.3); + content: ''; +} +#page-header.full_page { + height: 100vh; + background-attachment: fixed; +} +#page-header.full_page #site-info { + position: absolute; + top: 43%; + padding: 0 10px; + width: 100%; +} +#page-header #site-title, +#page-header #site-subtitle, +#page-header #scroll-down .scroll-down-effects { + text-align: center; + text-shadow: 2px 2px 4px rgba(0,0,0,0.15); + line-height: 1.5; +} +#page-header #site-title { + margin: 0; + color: var(--white); + font-size: 1.85em; +} +@media screen and (min-width: 768px) { + #page-header #site-title { + font-size: 2.85em; + } +} +#page-header #site-subtitle { + color: var(--light-grey); + font-size: 1.15em; +} +@media screen and (min-width: 768px) { + #page-header #site-subtitle { + font-size: 1.72em; + } +} +#page-header #site_social_icons { + display: none; + margin: 0 auto; + width: 300px; + text-align: center; +} +@media screen and (max-width: 768px) { + #page-header #site_social_icons { + display: block; + } +} +#page-header #site_social_icons .social-icon { + margin: 0 10px; + color: var(--light-grey); + text-shadow: 2px 2px 4px rgba(0,0,0,0.15); + font-size: 1.43em; +} +#page-header #scroll-down { + position: absolute; + bottom: 0; + width: 100%; + cursor: pointer; +} +#page-header #scroll-down .scroll-down-effects { + position: relative; + width: 100%; + color: var(--light-grey); + font-size: 30px; +} +#page-header.not-home-page { + height: 400px; +} +@media screen and (max-width: 768px) { + #page-header.not-home-page { + height: 280px; + } +} +#page-header #page-site-info { + position: absolute; + top: 200px; + padding: 0 10px; + width: 100%; +} +@media screen and (max-width: 768px) { + #page-header #page-site-info { + top: 140px; + } +} +#page-header.post-bg { + height: 400px; +} +@media screen and (max-width: 768px) { + #page-header.post-bg { + height: 360px; + } +} +#page-header.post-bg:before { + background-color: rgba(0,0,0,0.5); +} +#page-header #post-info { + position: absolute; + bottom: 100px; + padding: 0 8%; + width: 100%; + text-align: center; +} +@media screen and (max-width: 900px) { + #page-header #post-info { + bottom: 30px; + text-align: left; + } +} +@media screen and (max-width: 768px) { + #page-header #post-info { + bottom: 22px; + padding: 0 22px; + } +} +#page-header.not-top-img { + margin-bottom: 10px; + height: 60px; + background: 0; +} +#page-header.not-top-img #nav { + background: rgba(255,255,255,0.8); + -webkit-box-shadow: 0 5px 6px -5px rgba(133,133,133,0.6); + box-shadow: 0 5px 6px -5px rgba(133,133,133,0.6); +} +#page-header.not-top-img #nav a, +#page-header.not-top-img #nav .site-name { + color: var(--font-color); + text-shadow: none; +} +#page-header.nav-fixed #nav { + position: fixed; + top: -60px; + z-index: 91; + background: rgba(255,255,255,0.8); + -webkit-box-shadow: 0 5px 6px -5px rgba(133,133,133,0.6); + box-shadow: 0 5px 6px -5px rgba(133,133,133,0.6); + -webkit-transition: -webkit-transform 0.2s ease-in-out, opacity 0.2s ease-in-out; + -moz-transition: -moz-transform 0.2s ease-in-out, opacity 0.2s ease-in-out; + -o-transition: -o-transform 0.2s ease-in-out, opacity 0.2s ease-in-out; + -ms-transition: -ms-transform 0.2s ease-in-out, opacity 0.2s ease-in-out; + transition: transform 0.2s ease-in-out, opacity 0.2s ease-in-out; +} +#page-header.nav-fixed #nav #blog-info { + color: var(--font-color); +} +#page-header.nav-fixed #nav #blog-info:hover { + color: #49b1f5; +} +#page-header.nav-fixed #nav #blog-info .site-name { + text-shadow: none; +} +#page-header.nav-fixed #nav a, +#page-header.nav-fixed #nav #toggle-menu { + color: var(--font-color); + text-shadow: none; +} +#page-header.nav-fixed #nav a:hover, +#page-header.nav-fixed #nav #toggle-menu:hover { + color: #49b1f5; +} +#page-header.nav-fixed.fixed #nav { + top: 0; + -webkit-transition: all 0.5s; + -moz-transition: all 0.5s; + -o-transition: all 0.5s; + -ms-transition: all 0.5s; + transition: all 0.5s; +} +#page-header.nav-visible:not(.fixed) #nav { + -webkit-transition: all 0.5s; + -moz-transition: all 0.5s; + -o-transition: all 0.5s; + -ms-transition: all 0.5s; + transition: all 0.5s; + -webkit-transform: translate3d(0, 100%, 0); + -moz-transform: translate3d(0, 100%, 0); + -o-transform: translate3d(0, 100%, 0); + -ms-transform: translate3d(0, 100%, 0); + transform: translate3d(0, 100%, 0); +} +#page-header.nav-visible:not(.fixed) + .layout > .aside-content > .sticky_layout { + top: 70px; + -webkit-transition: top 0.5s; + -moz-transition: top 0.5s; + -o-transition: top 0.5s; + -ms-transition: top 0.5s; + transition: top 0.5s; +} +#page-header.fixed #nav { + position: fixed; +} +#page-header.fixed + .layout > .aside-content > .sticky_layout { + top: 70px; + -webkit-transition: top 0.5s; + -moz-transition: top 0.5s; + -o-transition: top 0.5s; + -ms-transition: top 0.5s; + transition: top 0.5s; +} +#page-header.fixed + .layout #card-toc .toc-content { + max-height: calc(100vh - 170px); +} +#page h1.page-title { + margin: 8px 0 20px; +} +#post > #post-info { + margin-bottom: 30px; +} +#post > #post-info .post-title { + padding-bottom: 4px; + border-bottom: 1px solid var(--light-grey); + color: var(--text-highlight-color); +} +#post > #post-info .post-title .post-edit-link { + float: right; +} +#post > #post-info #post-meta, +#post > #post-info #post-meta a { + color: #78818a; +} +#post-info .post-title { + margin-bottom: 8px; + color: var(--white); + font-weight: normal; + font-size: 2.5em; + line-height: 1.5; + -webkit-line-clamp: 3; +} +@media screen and (max-width: 768px) { + #post-info .post-title { + font-size: 2.1em; + } +} +#post-info .post-title .post-edit-link { + padding-left: 10px; +} +#post-info #post-meta { + color: var(--light-grey); + font-size: 95%; +} +@media screen and (min-width: 768px) { + #post-info #post-meta > .meta-secondline > span:first-child { + display: none; + } +} +@media screen and (max-width: 768px) { + #post-info #post-meta { + font-size: 90%; + } + #post-info #post-meta > .meta-firstline, + #post-info #post-meta > .meta-secondline { + display: inline; + } +} +#post-info #post-meta .post-meta-separator { + margin: 0 5px; +} +#post-info #post-meta .post-meta-icon { + margin-right: 4px; +} +#post-info #post-meta .post-meta-label { + margin-right: 4px; +} +#post-info #post-meta a { + color: var(--light-grey); + -webkit-transition: all 0.3s ease-out; + -moz-transition: all 0.3s ease-out; + -o-transition: all 0.3s ease-out; + -ms-transition: all 0.3s ease-out; + transition: all 0.3s ease-out; +} +#post-info #post-meta a:hover { + color: #49b1f5; + text-decoration: underline; +} +#nav { + position: absolute; + top: 0; + z-index: 90; + display: -webkit-box; + display: -moz-box; + display: -webkit-flex; + display: -ms-flexbox; + display: box; + display: flex; + -webkit-box-align: center; + -moz-box-align: center; + -o-box-align: center; + -ms-flex-align: center; + -webkit-align-items: center; + align-items: center; + padding: 0 36px; + width: 100%; + height: 60px; + font-size: 1.3em; + opacity: 0; + -ms-filter: "progid:DXImageTransform.Microsoft.Alpha(Opacity=0)"; + filter: alpha(opacity=0); + -webkit-transition: all 0.5s; + -moz-transition: all 0.5s; + -o-transition: all 0.5s; + -ms-transition: all 0.5s; + transition: all 0.5s; +} +@media screen and (max-width: 768px) { + #nav { + padding: 0 16px; + } +} +#nav.show { + opacity: 1; + -ms-filter: none; + filter: none; +} +#nav #blog-info { + -webkit-box-flex: 1; + -moz-box-flex: 1; + -o-box-flex: 1; + box-flex: 1; + -webkit-flex: 1; + -ms-flex: 1; + flex: 1; + color: var(--light-grey); +} +#nav #blog-info .site-icon { + margin-right: 6px; + height: 36px; + vertical-align: middle; +} +#nav #toggle-menu { + display: none; + padding: 2px 0 0 6px; + vertical-align: top; +} +#nav #toggle-menu:hover { + color: var(--white); +} +#nav a { + color: var(--light-grey); +} +#nav a:hover { + color: var(--white); +} +#nav .site-name { + text-shadow: 2px 2px 4px rgba(0,0,0,0.15); + font-weight: bold; +} +#nav .menus_items { + display: inline; +} +#nav .menus_items .menus_item { + position: relative; + display: inline-block; + padding: 0 0 0 14px; +} +#nav .menus_items .menus_item:hover .menus_item_child { + display: block; +} +#nav .menus_items .menus_item:hover > a > i:last-child { + -webkit-transform: rotate(180deg); + -moz-transform: rotate(180deg); + -o-transform: rotate(180deg); + -ms-transform: rotate(180deg); + transform: rotate(180deg); +} +#nav .menus_items .menus_item > a > i:last-child { + padding: 4px; + -webkit-transition: -webkit-transform 0.3s; + -moz-transition: -moz-transform 0.3s; + -o-transition: -o-transform 0.3s; + -ms-transition: -ms-transform 0.3s; + transition: transform 0.3s; +} +#nav .menus_items .menus_item .menus_item_child { + position: absolute; + right: 0; + display: none; + margin-top: 8px; + padding: 0; + width: max-content; + border-radius: 5px; + background-color: var(--sidebar-bg); + -webkit-box-shadow: 0 5px 20px -4px rgba(0,0,0,0.5); + box-shadow: 0 5px 20px -4px rgba(0,0,0,0.5); + -webkit-animation: sub_menus 0.3s 0.1s ease both; + -moz-animation: sub_menus 0.3s 0.1s ease both; + -o-animation: sub_menus 0.3s 0.1s ease both; + -ms-animation: sub_menus 0.3s 0.1s ease both; + animation: sub_menus 0.3s 0.1s ease both; +} +#nav .menus_items .menus_item .menus_item_child:before { + position: absolute; + top: -8px; + left: 0; + width: 100%; + height: 20px; + content: ''; +} +#nav .menus_items .menus_item .menus_item_child li { + list-style: none; +} +#nav .menus_items .menus_item .menus_item_child li:hover { + background: var(--text-bg-hover); +} +#nav .menus_items .menus_item .menus_item_child li:first-child { + border-top-left-radius: 5px; + border-top-right-radius: 5px; +} +#nav .menus_items .menus_item .menus_item_child li:last-child { + border-bottom-right-radius: 5px; + border-bottom-left-radius: 5px; +} +#nav .menus_items .menus_item .menus_item_child li a { + display: inline-block; + padding: 8px 16px; + width: 100%; + color: var(--font-color) !important; + text-shadow: none !important; +} +#nav.hide-menu #toggle-menu { + display: inline-block !important; +} +#nav.hide-menu #toggle-menu .site-page { + font-size: inherit; +} +#nav.hide-menu .menus_items { + display: none; +} +#nav.hide-menu #search-button span { + display: none; +} +#nav #search-button { + display: inline; + padding: 0 0 0 14px; +} +#nav .site-page { + position: relative; + padding-bottom: 6px; + text-shadow: 1px 1px 2px rgba(0,0,0,0.3); + font-size: 0.78em; + cursor: pointer; +} +#nav .site-page:not(.child):after { + position: absolute; + bottom: 0; + left: 0; + z-index: -1; + width: 0; + height: 3px; + background-color: #80c8f8; + content: ''; + -webkit-transition: all 0.3s ease-in-out; + -moz-transition: all 0.3s ease-in-out; + -o-transition: all 0.3s ease-in-out; + -ms-transition: all 0.3s ease-in-out; + transition: all 0.3s ease-in-out; +} +#nav .site-page:not(.child):hover:after { + width: 100%; +} +#pagination .pagination { + margin-top: 20px; + text-align: center; +} +#pagination .page-number.current { + background: #00c4b6; + color: var(--white); +} +#pagination .pagination-info { + position: absolute; + top: 50%; + padding: 20px 40px; + width: 100%; + -webkit-transform: translate(0, -50%); + -moz-transform: translate(0, -50%); + -o-transform: translate(0, -50%); + -ms-transform: translate(0, -50%); + transform: translate(0, -50%); +} +#pagination .prev_info, +#pagination .next_info { + color: var(--white); + font-weight: 500; +} +#pagination .next-post .pagination-info { + text-align: right; +} +#pagination .pull-full { + width: 100% !important; +} +#pagination .prev-post .label, +#pagination .next-post .label { + color: var(--light-grey); + text-transform: uppercase; + font-size: 90%; +} +#pagination .prev-post, +#pagination .next-post { + width: 50%; +} +@media screen and (max-width: 768px) { + #pagination .prev-post, + #pagination .next-post { + width: 100%; + } +} +#pagination .prev-post a, +#pagination .next-post a { + position: relative; + display: block; + overflow: hidden; + height: 150px; +} +#pagination.pagination-post { + overflow: hidden; + margin-top: 40px; + width: 100%; + background: #000; +} +.layout > .recent-posts .pagination > * { + display: inline-block; + margin: 0 6px; + width: 2.5em; + height: 2.5em; + line-height: 2.5em; +} +.layout > .recent-posts .pagination > *:not(.space):hover { + background: var(--btn-hover-color); + color: var(--btn-color); +} +.layout > div:not(.recent-posts) .pagination .page-number { + display: inline-block; + margin: 0 4px; + min-width: 24px; + height: 24px; + text-align: center; + line-height: 24px; + cursor: pointer; +} +#article-container { + word-wrap: break-word; + overflow-wrap: break-word; +} +#article-container a { + color: #49b1f5; +} +#article-container a:hover { + text-decoration: underline; +} +#article-container img { + display: block; + margin: 0 auto 20px; + max-width: 100%; + -webkit-transition: filter 375ms ease-in 0.2s; + -moz-transition: filter 375ms ease-in 0.2s; + -o-transition: filter 375ms ease-in 0.2s; + -ms-transition: filter 375ms ease-in 0.2s; + transition: filter 375ms ease-in 0.2s; +} +#article-container p { + margin: 0 0 16px; +} +#article-container iframe { + margin: 0 0 20px; +} +#article-container kbd { + margin: 0 3px; + padding: 3px 5px; + border: 1px solid #b4b4b4; + border-radius: 3px; + background-color: #f8f8f8; + -webkit-box-shadow: 0 1px 3px rgba(0,0,0,0.25), 0 2px 1px 0 rgba(255,255,255,0.6) inset; + box-shadow: 0 1px 3px rgba(0,0,0,0.25), 0 2px 1px 0 rgba(255,255,255,0.6) inset; + color: #34495e; + white-space: nowrap; + font-weight: 600; + font-size: 0.9em; + font-family: Monaco, 'Ubuntu Mono', monospace; + line-height: 1em; +} +#article-container ol ol, +#article-container ul ol, +#article-container ol ul, +#article-container ul ul { + padding-left: 20px; +} +#article-container ol li, +#article-container ul li { + margin: 4px 0; +} +#article-container ol p, +#article-container ul p { + margin: 0 0 8px; +} +#article-container > :last-child { + margin-bottom: 0 !important; +} +#article-container hr { + margin: 20px 0; +} +#article-container hr { + margin: 20px 0; + border: 1px inset; + width: 100%; +} +#article-container hr:before { + content: none; +} +#post .tag_share:after { + display: block; + clear: both; + content: ''; +} +#post .tag_share .post-meta__tag-list { + display: inline-block; +} +#post .tag_share .post-meta__tags { + display: inline-block; + margin: 8px 8px 8px 0; + padding: 0 12px; + width: fit-content; + border: 1px solid #49b1f5; + border-radius: 12px; + color: #49b1f5; + font-size: 0.85em; + -webkit-transition: all 0.2s ease-in-out; + -moz-transition: all 0.2s ease-in-out; + -o-transition: all 0.2s ease-in-out; + -ms-transition: all 0.2s ease-in-out; + transition: all 0.2s ease-in-out; +} +#post .tag_share .post-meta__tags:hover { + background: #49b1f5; + color: var(--white); +} +#post .tag_share .post_share { + display: inline-block; + float: right; + margin: 8px 0 0; + width: fit-content; +} +#post .tag_share .post_share .social-share { + font-size: 0.85em; +} +#post .tag_share .post_share .social-share .social-share-icon { + margin: 0 4px; + width: 1.85em; + height: 1.85em; + font-size: 1.2em; + line-height: 1.85em; +} +#post .post-copyright { + position: relative; + margin: 40px 0 10px; + padding: 10px 16px; + border: 1px solid var(--light-grey); + -webkit-transition: box-shadow 0.3s ease-in-out; + -moz-transition: box-shadow 0.3s ease-in-out; + -o-transition: box-shadow 0.3s ease-in-out; + -ms-transition: box-shadow 0.3s ease-in-out; + transition: box-shadow 0.3s ease-in-out; +} +#post .post-copyright:before { + position: absolute; + top: 2px; + right: 12px; + color: #49b1f5; + content: '\f1f9'; + font-size: 1.3em; +} +#post .post-copyright:hover { + -webkit-box-shadow: 0 0 8px 0 rgba(232,237,250,0.6), 0 2px 4px 0 rgba(232,237,250,0.5); + box-shadow: 0 0 8px 0 rgba(232,237,250,0.6), 0 2px 4px 0 rgba(232,237,250,0.5); +} +#post .post-copyright .post-copyright-meta { + color: #49b1f5; + font-weight: bold; +} +#post .post-copyright .post-copyright-info { + padding-left: 6px; +} +#post .post-copyright .post-copyright-info a { + text-decoration: underline; + word-break: break-word; +} +#post .post-copyright .post-copyright-info a:hover { + text-decoration: none; +} +#post .post-outdate-notice { + position: relative; + margin: 0 0 20px; + padding: 0.5em 1.2em; + border-radius: 3px; + background-color: #ffe6e6; + color: #f66; + padding: 0.5em 1em 0.5em 2.6em; + border-left: 5px solid #ff8080; +} +#post .post-outdate-notice:before { + position: absolute; + top: 50%; + left: 0.9em; + color: #ff8080; + content: '\f071'; + -webkit-transform: translateY(-50%); + -moz-transform: translateY(-50%); + -o-transform: translateY(-50%); + -ms-transform: translateY(-50%); + transform: translateY(-50%); +} +#post .ads-wrap { + margin: 40px 0; +} +.relatedPosts { + margin-top: 40px; +} +.relatedPosts > .headline { + margin-bottom: 5px; + font-weight: 700; + font-size: 1.43em; +} +.relatedPosts > .relatedPosts-list > div { + position: relative; + display: inline-block; + overflow: hidden; + margin: 3px; + width: calc(33.333% - 6px); + height: 200px; + background: #000; + vertical-align: bottom; +} +@media screen and (max-width: 768px) { + .relatedPosts > .relatedPosts-list > div { + margin: 2px; + width: calc(50% - 4px); + height: 150px; + } +} +@media screen and (max-width: 600px) { + .relatedPosts > .relatedPosts-list > div { + width: calc(100% - 4px); + } +} +.relatedPosts > .relatedPosts-list .content { + position: absolute; + top: 50%; + padding: 0 20px; + width: 100%; + -webkit-transform: translate(0, -50%); + -moz-transform: translate(0, -50%); + -o-transform: translate(0, -50%); + -ms-transform: translate(0, -50%); + transform: translate(0, -50%); +} +.relatedPosts > .relatedPosts-list .content .date { + color: var(--light-grey); + font-size: 90%; +} +.relatedPosts > .relatedPosts-list .content .title { + color: var(--white); + -webkit-line-clamp: 2; +} +.post-reward { + position: relative; + margin-top: 80px; + width: 100%; + text-align: center; + pointer-events: none; +} +.post-reward > * { + pointer-events: auto; +} +.post-reward .reward-button { + display: inline-block; + padding: 4px 24px; + background: var(--btn-bg); + color: var(--btn-color); + cursor: pointer; +} +.post-reward:hover .reward-button { + background: var(--btn-hover-color); +} +.post-reward:hover > .reward-main { + display: block; +} +.post-reward .reward-main { + position: absolute; + bottom: 40px; + left: 0; + z-index: 100; + display: none; + padding: 0 0 15px; + width: 100%; +} +.post-reward .reward-main .reward-all { + display: inline-block; + margin: 0; + padding: 20px 10px; + border-radius: 4px; + background: var(--reward-pop); +} +.post-reward .reward-main .reward-all:before { + position: absolute; + bottom: -10px; + left: 0; + width: 100%; + height: 20px; + content: ''; +} +.post-reward .reward-main .reward-all:after { + position: absolute; + right: 0; + bottom: 2px; + left: 0; + margin: 0 auto; + width: 0; + height: 0; + border-top: 13px solid var(--reward-pop); + border-right: 13px solid transparent; + border-left: 13px solid transparent; + content: ''; +} +.post-reward .reward-main .reward-all .reward-item { + display: inline-block; + padding: 0 8px; + list-style-type: none; + vertical-align: top; +} +.post-reward .reward-main .reward-all .reward-item img { + width: 130px; + height: 130px; +} +.post-reward .reward-main .reward-all .reward-item .post-qr-code-desc { + width: 130px; + color: #858585; +} +#rightside { + position: fixed; + right: -48px; + bottom: 40px; + z-index: 100; + opacity: 0; + -ms-filter: "progid:DXImageTransform.Microsoft.Alpha(Opacity=0)"; + filter: alpha(opacity=0); + -webkit-transition: all 0.5s; + -moz-transition: all 0.5s; + -o-transition: all 0.5s; + -ms-transition: all 0.5s; + transition: all 0.5s; +} +#rightside #rightside-config-hide { + height: 0; + opacity: 0; + -ms-filter: "progid:DXImageTransform.Microsoft.Alpha(Opacity=0)"; + filter: alpha(opacity=0); + -webkit-transition: -webkit-transform 0.4s; + -moz-transition: -moz-transform 0.4s; + -o-transition: -o-transform 0.4s; + -ms-transition: -ms-transform 0.4s; + transition: transform 0.4s; + -webkit-transform: translate(45px, 0); + -moz-transform: translate(45px, 0); + -o-transform: translate(45px, 0); + -ms-transform: translate(45px, 0); + transform: translate(45px, 0); +} +#rightside #rightside-config-hide.show { + height: auto; + opacity: 1; + -ms-filter: none; + filter: none; + -webkit-transform: translate(0, 0); + -moz-transform: translate(0, 0); + -o-transform: translate(0, 0); + -ms-transform: translate(0, 0); + transform: translate(0, 0); +} +#rightside #rightside-config-hide.status { + height: auto; + opacity: 1; + -ms-filter: none; + filter: none; +} +#rightside > div > button, +#rightside > div > a { + display: block; + margin-bottom: 5px; + width: 35px; + height: 35px; + border-radius: 5px; + background-color: var(--btn-bg); + color: var(--btn-color); + text-align: center; + font-size: 16px; + line-height: 35px; +} +#rightside > div > button:hover, +#rightside > div > a:hover { + background-color: var(--btn-hover-color); +} +#rightside #mobile-toc-button { + display: none; +} +@media screen and (max-width: 900px) { + #rightside #mobile-toc-button { + display: block; + } +} +@media screen and (max-width: 900px) { + #rightside #hide-aside-btn { + display: none; + } +} +#rightside #go-up .scroll-percent { + display: none; +} +#rightside #go-up.show-percent .scroll-percent { + display: block; +} +#rightside #go-up.show-percent .scroll-percent + i { + display: none; +} +#rightside #go-up:hover .scroll-percent { + display: none; +} +#rightside #go-up:hover .scroll-percent + i { + display: block; +} +#sidebar #menu-mask { + position: fixed; + z-index: 102; + display: none; + width: 100%; + height: 100%; + background: rgba(0,0,0,0.8); +} +#sidebar #sidebar-menus { + position: fixed; + top: 0; + right: -300px; + z-index: 103; + overflow-x: hidden; + overflow-y: auto; + width: 300px; + height: 100%; + background: var(--sidebar-bg); + -webkit-transition: all 0.5s; + -moz-transition: all 0.5s; + -o-transition: all 0.5s; + -ms-transition: all 0.5s; + transition: all 0.5s; +} +#sidebar #sidebar-menus.open { + -webkit-transform: translate3d(-100%, 0, 0); + -moz-transform: translate3d(-100%, 0, 0); + -o-transform: translate3d(-100%, 0, 0); + -ms-transform: translate3d(-100%, 0, 0); + transform: translate3d(-100%, 0, 0); +} +#sidebar #sidebar-menus > .avatar-img { + margin: 20px auto; +} +#sidebar #sidebar-menus .sidebar-site-data { + padding: 0 10px; +} +#sidebar #sidebar-menus hr { + margin: 20px auto; +} +#sidebar #sidebar-menus .menus_items { + padding: 0 10px 40px; +} +#sidebar #sidebar-menus .menus_items .site-page { + position: relative; + display: block; + padding: 6px 30px 6px 22px; + color: var(--font-color); + font-size: 1.15em; +} +#sidebar #sidebar-menus .menus_items .site-page:hover { + background: var(--text-bg-hover); +} +#sidebar #sidebar-menus .menus_items .site-page i:first-child { + width: 15%; + text-align: left; +} +#sidebar #sidebar-menus .menus_items .site-page.group > i:last-child { + position: absolute; + top: 0.78em; + right: 18px; + -webkit-transition: -webkit-transform 0.3s; + -moz-transition: -moz-transform 0.3s; + -o-transition: -o-transform 0.3s; + -ms-transition: -ms-transform 0.3s; + transition: transform 0.3s; +} +#sidebar #sidebar-menus .menus_items .site-page.group.hide > i:last-child { + -webkit-transform: rotate(90deg); + -moz-transform: rotate(90deg); + -o-transform: rotate(90deg); + -ms-transform: rotate(90deg); + transform: rotate(90deg); +} +#sidebar #sidebar-menus .menus_items .site-page.group.hide + .menus_item_child { + display: none; +} +#sidebar #sidebar-menus .menus_items .menus_item_child { + margin: 0; + list-style: none; +} +#vcomment { + font-size: 1.1em; +} +#vcomment .vbtn { + border: none; + background: var(--btn-bg); + color: var(--btn-color); +} +#vcomment .vbtn:hover { + background: var(--btn-hover-color); +} +#vcomment .vimg { + -webkit-transition: all 0.3s; + -moz-transition: all 0.3s; + -o-transition: all 0.3s; + -ms-transition: all 0.3s; + transition: all 0.3s; +} +#vcomment .vimg:hover { + -webkit-transform: rotate(360deg); + -moz-transform: rotate(360deg); + -o-transform: rotate(360deg); + -ms-transform: rotate(360deg); + transform: rotate(360deg); +} +#vcomment .vcards .vcard .vcontent.expand:before, +#vcomment .vcards .vcard .vcontent.expand:after { + z-index: 22; +} +#waline-wrap { + --waline-font-size: 1.1em; + --waline-theme-color: #49b1f5; + --waline-active-color: #ff7242; +} +#waline-wrap .wl-comment-actions > button:not(last-child) { + padding-right: 4px; +} +.fireworks { + position: fixed; + top: 0; + left: 0; + z-index: 9999; + pointer-events: none; +} +.medium-zoom-image--opened { + z-index: 99999 !important; + margin: 0 !important; +} +.medium-zoom-overlay { + z-index: 99999 !important; +} +.mermaid-wrap { + margin: 0 0 20px; + text-align: center; +} +.mermaid-wrap > svg { + height: 100%; +} +.utterances, +.fb-comments iframe { + width: 100% !important; +} +#gitalk-container .gt-meta { + margin: 0 0 0.8em; + padding: 6px 0 16px; +} +.katex-wrap { + overflow: auto; +} +.katex-wrap::-webkit-scrollbar { + display: none; +} +.mathjax-overflow { + overflow-x: auto; + overflow-y: hidden; +} +span.mathjax-overflow { + display: inline-block; + padding: 0 2px; + max-width: 100%; + vertical-align: bottom; +} +.aplayer { + color: #4c4948; +} +#article-container .aplayer { + margin: 0 0 20px; +} +.snackbar-css { + border-radius: 5px !important; +} +.abc-music-sheet { + margin: 0 0 20px; + opacity: 0; + -ms-filter: "progid:DXImageTransform.Microsoft.Alpha(Opacity=0)"; + filter: alpha(opacity=0); + -webkit-transition: opacity 0.3s; + -moz-transition: opacity 0.3s; + -o-transition: opacity 0.3s; + -ms-transition: opacity 0.3s; + transition: opacity 0.3s; +} +.abc-music-sheet.abcjs-container { + opacity: 1; + -ms-filter: none; + filter: none; +} +@media screen and (max-width: 768px) { + .fancybox__toolbar__column.is-middle { + display: none; + } +} +#article-container .btn-center { + margin: 0 0 20px; + text-align: center; +} +#article-container .btn-beautify { + display: inline-block; + margin: 0 4px 6px; + padding: 0 15px; + background-color: var(--btn-beautify-color, #777); + color: #fff; + line-height: 2; +} +#article-container .btn-beautify.blue { + --btn-beautify-color: #428bca; +} +#article-container .btn-beautify.pink { + --btn-beautify-color: #ff69b4; +} +#article-container .btn-beautify.red { + --btn-beautify-color: #f00; +} +#article-container .btn-beautify.purple { + --btn-beautify-color: #6f42c1; +} +#article-container .btn-beautify.orange { + --btn-beautify-color: #ff8c00; +} +#article-container .btn-beautify.green { + --btn-beautify-color: #5cb85c; +} +#article-container .btn-beautify:hover { + background-color: var(--btn-hover-color); +} +#article-container .btn-beautify i + span { + margin-left: 6px; +} +#article-container .btn-beautify:not(.block) + .btn-beautify:not(.block) { + margin: 0 4px 20px; +} +#article-container .btn-beautify.block { + display: block; + margin: 0 0 20px; + width: fit-content; + width: -moz-fit-content; +} +#article-container .btn-beautify.block.center { + margin: 0 auto 20px; +} +#article-container .btn-beautify.block.right { + margin: 0 0 20px auto; +} +#article-container .btn-beautify.larger { + padding: 6px 15px; +} +#article-container .btn-beautify:hover { + text-decoration: none; +} +#article-container .btn-beautify.outline { + border: 1px solid transparent; + border-color: var(--btn-beautify-color, #777); + background-color: transparent; + color: var(--btn-beautify-color, #777); +} +#article-container .btn-beautify.outline:hover { + background-color: var(--btn-beautify-color, #777); +} +#article-container .btn-beautify.outline:hover { + color: #fff !important; +} +#article-container figure.gallery-group { + position: relative; + float: left; + overflow: hidden; + margin: 6px 4px; + width: calc(50% - 8px); + height: 250px; + border-radius: 8px; + background: #000; + -webkit-transform: translate3d(0, 0, 0); +} +@media screen and (max-width: 600px) { + #article-container figure.gallery-group { + width: calc(100% - 8px); + } +} +#article-container figure.gallery-group:hover img { + opacity: 0.4; + -ms-filter: "progid:DXImageTransform.Microsoft.Alpha(Opacity=40)"; + filter: alpha(opacity=40); + -webkit-transform: translate3d(0, 0, 0); + -moz-transform: translate3d(0, 0, 0); + -o-transform: translate3d(0, 0, 0); + -ms-transform: translate3d(0, 0, 0); + transform: translate3d(0, 0, 0); +} +#article-container figure.gallery-group:hover .gallery-group-name::after { + -webkit-transform: translate3d(0, 0, 0); + -moz-transform: translate3d(0, 0, 0); + -o-transform: translate3d(0, 0, 0); + -ms-transform: translate3d(0, 0, 0); + transform: translate3d(0, 0, 0); +} +#article-container figure.gallery-group:hover p { + opacity: 1; + -ms-filter: none; + filter: none; + -webkit-transform: translate3d(0, 0, 0); + -moz-transform: translate3d(0, 0, 0); + -o-transform: translate3d(0, 0, 0); + -ms-transform: translate3d(0, 0, 0); + transform: translate3d(0, 0, 0); +} +#article-container figure.gallery-group img { + position: relative; + margin: 0; + max-width: none; + width: calc(100% + 20px); + height: 250px; + -webkit-backface-visibility: hidden; + -moz-backface-visibility: hidden; + -ms-backface-visibility: hidden; + backface-visibility: hidden; + opacity: 0.8; + -ms-filter: "progid:DXImageTransform.Microsoft.Alpha(Opacity=80)"; + filter: alpha(opacity=80); + -webkit-transition: all 0.3s, filter 375ms ease-in 0.2s; + -moz-transition: all 0.3s, filter 375ms ease-in 0.2s; + -o-transition: all 0.3s, filter 375ms ease-in 0.2s; + -ms-transition: all 0.3s, filter 375ms ease-in 0.2s; + transition: all 0.3s, filter 375ms ease-in 0.2s; + -webkit-transform: translate3d(-10px, 0, 0); + -moz-transform: translate3d(-10px, 0, 0); + -o-transform: translate3d(-10px, 0, 0); + -ms-transform: translate3d(-10px, 0, 0); + transform: translate3d(-10px, 0, 0); + object-fit: cover; +} +#article-container figure.gallery-group figcaption { + position: absolute; + top: 0; + left: 0; + padding: 30px; + width: 100%; + height: 100%; + color: #fff; + text-transform: uppercase; + -webkit-backface-visibility: hidden; + -moz-backface-visibility: hidden; + -ms-backface-visibility: hidden; + backface-visibility: hidden; +} +#article-container figure.gallery-group figcaption > a { + position: absolute; + top: 0; + right: 0; + bottom: 0; + left: 0; + z-index: 1000; + opacity: 0; + -ms-filter: "progid:DXImageTransform.Microsoft.Alpha(Opacity=0)"; + filter: alpha(opacity=0); +} +#article-container figure.gallery-group p { + margin: 0; + padding: 8px 0 0; + letter-spacing: 1px; + font-size: 1.1em; + line-height: 1.5; + opacity: 0; + -ms-filter: "progid:DXImageTransform.Microsoft.Alpha(Opacity=0)"; + filter: alpha(opacity=0); + -webkit-transition: opacity 0.35s, -webkit-transform 0.35s; + -moz-transition: opacity 0.35s, -moz-transform 0.35s; + -o-transition: opacity 0.35s, -o-transform 0.35s; + -ms-transition: opacity 0.35s, -ms-transform 0.35s; + transition: opacity 0.35s, transform 0.35s; + -webkit-transform: translate3d(100%, 0, 0); + -moz-transform: translate3d(100%, 0, 0); + -o-transform: translate3d(100%, 0, 0); + -ms-transform: translate3d(100%, 0, 0); + transform: translate3d(100%, 0, 0); + -webkit-line-clamp: 4; +} +#article-container figure.gallery-group .gallery-group-name { + position: relative; + margin: 0; + padding: 8px 0; + font-weight: bold; + font-size: 1.65em; + line-height: 1.5; + -webkit-line-clamp: 2; +} +#article-container figure.gallery-group .gallery-group-name:after { + position: absolute; + bottom: 0; + left: 0; + width: 100%; + height: 2px; + background: #fff; + content: ''; + -webkit-transition: -webkit-transform 0.35s; + -moz-transition: -moz-transform 0.35s; + -o-transition: -o-transform 0.35s; + -ms-transition: -ms-transform 0.35s; + transition: transform 0.35s; + -webkit-transform: translate3d(-100%, 0, 0); + -moz-transform: translate3d(-100%, 0, 0); + -o-transform: translate3d(-100%, 0, 0); + -ms-transform: translate3d(-100%, 0, 0); + transform: translate3d(-100%, 0, 0); +} +#article-container .gallery-group-main { + overflow: auto; + padding: 0 0 16px; +} +#article-container .gallery { + margin: 0 0 16px; + text-align: center; +} +#article-container .gallery .fj-gallery { + opacity: 0; + -ms-filter: "progid:DXImageTransform.Microsoft.Alpha(Opacity=0)"; + filter: alpha(opacity=0); +} +#article-container .gallery .fj-gallery .img-alt { + display: none; +} +#article-container .gallery .fj-gallery.lazyload + button { + display: inline-block; +} +#article-container .gallery .fj-gallery .gallery-data { + display: none; +} +#article-container .gallery button { + display: none; + margin-top: 25px; + padding: 10px; + width: 9em; + border-radius: 5px; + background: var(--btn-bg); + color: var(--btn-color); + font-weight: bold; + font-size: 1.1em; + -webkit-transition: all 0.3s; + -moz-transition: all 0.3s; + -o-transition: all 0.3s; + -ms-transition: all 0.3s; + transition: all 0.3s; +} +#article-container .gallery button > * { + -webkit-transition: all 0.4s; + -moz-transition: all 0.4s; + -o-transition: all 0.4s; + -ms-transition: all 0.4s; + transition: all 0.4s; +} +#article-container .gallery button i { + width: 0; + opacity: 0; + -ms-filter: "progid:DXImageTransform.Microsoft.Alpha(Opacity=0)"; + filter: alpha(opacity=0); +} +#article-container .gallery button:hover { + background: var(--btn-hover-color); +} +#article-container .gallery button:hover i { + margin-left: 2px; + width: 20px; + opacity: 1; + -ms-filter: none; + filter: none; +} +blockquote.pullquote { + position: relative; + max-width: 45%; + font-size: 110%; +} +blockquote.pullquote.left { + float: left; + margin: 1em 0.5em 0 0; +} +blockquote.pullquote.right { + float: right; + margin: 1em 0 0 0.5em; +} +.video-container { + position: relative; + overflow: hidden; + margin-bottom: 16px; + padding-top: 56.25%; + height: 0; +} +.video-container iframe { + position: absolute; + top: 0; + left: 0; + margin-top: 0; + width: 100%; + height: 100%; +} +.hide-inline > .hide-button, +.hide-block > .hide-button { + display: inline-block; + padding: 5px 18px; + background: #49b1f5; + color: var(--white); +} +.hide-inline > .hide-button:hover, +.hide-block > .hide-button:hover { + background-color: var(--btn-hover-color); +} +.hide-inline > .hide-button.open, +.hide-block > .hide-button.open { + display: none; +} +.hide-inline > .hide-button.open + div, +.hide-block > .hide-button.open + div { + display: block; +} +.hide-inline > .hide-button.open + span, +.hide-block > .hide-button.open + span { + display: inline; +} +.hide-inline > .hide-content, +.hide-block > .hide-content { + display: none; +} +.hide-inline > .hide-button { + margin: 0 6px; +} +.hide-inline > .hide-content { + margin: 0 6px; +} +.hide-block { + margin: 0 0 16px; +} +.toggle { + margin-bottom: 20px; + border: 1px solid #f0f0f0; +} +.toggle > .toggle-button { + padding: 6px 15px; + background: #f0f0f0; + color: #1f2d3d; + cursor: pointer; +} +.toggle > .toggle-content { + margin: 30px 24px; +} +#article-container .inline-img { + display: inline; + margin: 0 3px; + height: 1.1em; + vertical-align: text-bottom; +} +.hl-label { + padding: 2px 4px; + border-radius: 3px; + color: #fff; +} +.hl-label.default { + background-color: #777; +} +.hl-label.blue { + background-color: #428bca; +} +.hl-label.pink { + background-color: #ff69b4; +} +.hl-label.red { + background-color: #f00; +} +.hl-label.purple { + background-color: #6f42c1; +} +.hl-label.orange { + background-color: #ff8c00; +} +.hl-label.green { + background-color: #5cb85c; +} +.note { + position: relative; + margin: 0 0 20px; + padding: 15px; + border-radius: 3px; +} +.note.icon-padding { + padding-left: 3em; +} +.note > .note-icon { + position: absolute; + top: calc(50% - 0.5em); + left: 0.8em; + font-size: larger; +} +.note.blue:not(.disabled) { + border-left-color: #428bca !important; +} +.note.blue:not(.disabled).modern { + border-left-color: transparent !important; + color: #428bca; +} +.note.blue:not(.disabled):not(.simple) { + background: #e3eef7 !important; +} +.note.blue > .note-icon { + color: #428bca; +} +.note.pink:not(.disabled) { + border-left-color: #ff69b4 !important; +} +.note.pink:not(.disabled).modern { + border-left-color: transparent !important; + color: #ff69b4; +} +.note.pink:not(.disabled):not(.simple) { + background: #ffe9f4 !important; +} +.note.pink > .note-icon { + color: #ff69b4; +} +.note.red:not(.disabled) { + border-left-color: #f00 !important; +} +.note.red:not(.disabled).modern { + border-left-color: transparent !important; + color: #f00; +} +.note.red:not(.disabled):not(.simple) { + background: #ffd9d9 !important; +} +.note.red > .note-icon { + color: #f00; +} +.note.purple:not(.disabled) { + border-left-color: #6f42c1 !important; +} +.note.purple:not(.disabled).modern { + border-left-color: transparent !important; + color: #6f42c1; +} +.note.purple:not(.disabled):not(.simple) { + background: #e9e3f6 !important; +} +.note.purple > .note-icon { + color: #6f42c1; +} +.note.orange:not(.disabled) { + border-left-color: #ff8c00 !important; +} +.note.orange:not(.disabled).modern { + border-left-color: transparent !important; + color: #ff8c00; +} +.note.orange:not(.disabled):not(.simple) { + background: #ffeed9 !important; +} +.note.orange > .note-icon { + color: #ff8c00; +} +.note.green:not(.disabled) { + border-left-color: #5cb85c !important; +} +.note.green:not(.disabled).modern { + border-left-color: transparent !important; + color: #5cb85c; +} +.note.green:not(.disabled):not(.simple) { + background: #e7f4e7 !important; +} +.note.green > .note-icon { + color: #5cb85c; +} +.note.simple { + border: 1px solid #eee; + border-left-width: 5px; +} +.note.modern { + border: 1px solid transparent !important; + background-color: #f5f5f5; + color: #4c4948; +} +.note.flat { + border: initial; + border-left: 5px solid #eee; + background-color: #f9f9f9; + color: #4c4948; +} +.note h2, +.note h3, +.note h4, +.note h5, +.note h6 { + margin-top: 3px; + margin-bottom: 0; + padding-top: 0 !important; + border-bottom: initial; +} +.note p:first-child, +.note ul:first-child, +.note ol:first-child, +.note table:first-child, +.note pre:first-child, +.note blockquote:first-child, +.note img:first-child { + margin-top: 0 !important; +} +.note p:last-child, +.note ul:last-child, +.note ol:last-child, +.note table:last-child, +.note pre:last-child, +.note blockquote:last-child, +.note img:last-child { + margin-bottom: 0 !important; +} +.note:not(.no-icon) { + padding-left: 3em; +} +.note:not(.no-icon)::before { + position: absolute; + top: calc(50% - 0.95em); + left: 0.8em; + font-size: larger; +} +.note.default.flat { + background: #f7f7f7; +} +.note.default.modern { + border-color: #e1e1e1; + background: #f3f3f3; + color: #666; +} +.note.default.modern a:not(.btn) { + color: #666; +} +.note.default.modern a:not(.btn):hover { + color: #454545; +} +.note.default:not(.modern) { + border-left-color: #777; +} +.note.default:not(.modern) h2, +.note.default:not(.modern) h3, +.note.default:not(.modern) h4, +.note.default:not(.modern) h5, +.note.default:not(.modern) h6 { + color: #777; +} +.note.default:not(.no-icon)::before { + content: '\f0a9'; +} +.note.default:not(.no-icon):not(.modern)::before { + color: #777; +} +.note.primary.flat { + background: #f5f0fa; +} +.note.primary.modern { + border-color: #e1c2ff; + background: #f3daff; + color: #6f42c1; +} +.note.primary.modern a:not(.btn) { + color: #6f42c1; +} +.note.primary.modern a:not(.btn):hover { + color: #453298; +} +.note.primary:not(.modern) { + border-left-color: #6f42c1; +} +.note.primary:not(.modern) h2, +.note.primary:not(.modern) h3, +.note.primary:not(.modern) h4, +.note.primary:not(.modern) h5, +.note.primary:not(.modern) h6 { + color: #6f42c1; +} +.note.primary:not(.no-icon)::before { + content: '\f055'; +} +.note.primary:not(.no-icon):not(.modern)::before { + color: #6f42c1; +} +.note.info.flat { + background: #eef7fa; +} +.note.info.modern { + border-color: #b3e5ef; + background: #d9edf7; + color: #31708f; +} +.note.info.modern a:not(.btn) { + color: #31708f; +} +.note.info.modern a:not(.btn):hover { + color: #215761; +} +.note.info:not(.modern) { + border-left-color: #428bca; +} +.note.info:not(.modern) h2, +.note.info:not(.modern) h3, +.note.info:not(.modern) h4, +.note.info:not(.modern) h5, +.note.info:not(.modern) h6 { + color: #428bca; +} +.note.info:not(.no-icon)::before { + content: '\f05a'; +} +.note.info:not(.no-icon):not(.modern)::before { + color: #428bca; +} +.note.success.flat { + background: #eff8f0; +} +.note.success.modern { + border-color: #d0e6be; + background: #dff0d8; + color: #3c763d; +} +.note.success.modern a:not(.btn) { + color: #3c763d; +} +.note.success.modern a:not(.btn):hover { + color: #32562c; +} +.note.success:not(.modern) { + border-left-color: #5cb85c; +} +.note.success:not(.modern) h2, +.note.success:not(.modern) h3, +.note.success:not(.modern) h4, +.note.success:not(.modern) h5, +.note.success:not(.modern) h6 { + color: #5cb85c; +} +.note.success:not(.no-icon)::before { + content: '\f058'; +} +.note.success:not(.no-icon):not(.modern)::before { + color: #5cb85c; +} +.note.warning.flat { + background: #fdf8ea; +} +.note.warning.modern { + border-color: #fae4cd; + background: #fcf4e3; + color: #8a6d3b; +} +.note.warning.modern a:not(.btn) { + color: #8a6d3b; +} +.note.warning.modern a:not(.btn):hover { + color: #714f30; +} +.note.warning:not(.modern) { + border-left-color: #f0ad4e; +} +.note.warning:not(.modern) h2, +.note.warning:not(.modern) h3, +.note.warning:not(.modern) h4, +.note.warning:not(.modern) h5, +.note.warning:not(.modern) h6 { + color: #f0ad4e; +} +.note.warning:not(.no-icon)::before { + content: '\f06a'; +} +.note.warning:not(.no-icon):not(.modern)::before { + color: #f0ad4e; +} +.note.danger.flat { + background: #fcf1f2; +} +.note.danger.modern { + border-color: #ebcdd2; + background: #f2dfdf; + color: #a94442; +} +.note.danger.modern a:not(.btn) { + color: #a94442; +} +.note.danger.modern a:not(.btn):hover { + color: #84333f; +} +.note.danger:not(.modern) { + border-left-color: #d9534f; +} +.note.danger:not(.modern) h2, +.note.danger:not(.modern) h3, +.note.danger:not(.modern) h4, +.note.danger:not(.modern) h5, +.note.danger:not(.modern) h6 { + color: #d9534f; +} +.note.danger:not(.no-icon)::before { + content: '\f056'; +} +.note.danger:not(.no-icon):not(.modern)::before { + color: #d9534f; +} +#article-container .tabs { + position: relative; + margin: 0 0 20px; + border-right: 1px solid var(--tab-border-color); + border-bottom: 1px solid var(--tab-border-color); + border-left: 1px solid var(--tab-border-color); +} +#article-container .tabs > .nav-tabs { + display: -webkit-box; + display: -moz-box; + display: -webkit-flex; + display: -ms-flexbox; + display: box; + display: flex; + -webkit-box-lines: multiple; + -moz-box-lines: multiple; + -o-box-lines: multiple; + -webkit-flex-wrap: wrap; + -ms-flex-wrap: wrap; + flex-wrap: wrap; + margin: 0; + padding: 0; + background: var(--tab-botton-bg); +} +#article-container .tabs > .nav-tabs > .tab { + margin: 0; + padding: 0; + list-style: none; +} +@media screen and (max-width: 768px) { + #article-container .tabs > .nav-tabs > .tab { + -webkit-box-flex: 1; + -moz-box-flex: 1; + -o-box-flex: 1; + -ms-box-flex: 1; + box-flex: 1; + -webkit-flex-grow: 1; + flex-grow: 1; + } +} +#article-container .tabs > .nav-tabs > .tab button { + display: block; + padding: 8px 18px; + width: 100%; + border-top: 2px solid var(--tab-border-color); + background: var(--tab-botton-bg); + color: var(--tab-botton-color); + line-height: 2; + -webkit-transition: all 0.4s; + -moz-transition: all 0.4s; + -o-transition: all 0.4s; + -ms-transition: all 0.4s; + transition: all 0.4s; +} +#article-container .tabs > .nav-tabs > .tab button i { + width: 1.5em; +} +#article-container .tabs > .nav-tabs > .tab.active button { + border-top: 2px solid #49b1f5; + background: var(--tab-button-active-bg); + cursor: default; +} +#article-container .tabs > .nav-tabs > .tab:not(.active) button:hover { + border-top: 2px solid var(--tab-button-hover-bg); + background: var(--tab-button-hover-bg); +} +#article-container .tabs > .tab-contents .tab-item-content { + position: relative; + display: none; + padding: 36px 24px; +} +@media screen and (max-width: 768px) { + #article-container .tabs > .tab-contents .tab-item-content { + padding: 24px 14px; + } +} +#article-container .tabs > .tab-contents .tab-item-content.active { + display: block; + -webkit-animation: tabshow 0.5s; + -moz-animation: tabshow 0.5s; + -o-animation: tabshow 0.5s; + -ms-animation: tabshow 0.5s; + animation: tabshow 0.5s; +} +#article-container .tabs .tab-to-top { + position: relative; + display: block; + margin: 0 0 0 auto; + color: #99a9bf; +} +@-moz-keyframes tabshow { + 0% { + -webkit-transform: translateY(15px); + -moz-transform: translateY(15px); + -o-transform: translateY(15px); + -ms-transform: translateY(15px); + transform: translateY(15px); + } + 100% { + -webkit-transform: translateY(0); + -moz-transform: translateY(0); + -o-transform: translateY(0); + -ms-transform: translateY(0); + transform: translateY(0); + } +} +@-webkit-keyframes tabshow { + 0% { + -webkit-transform: translateY(15px); + -moz-transform: translateY(15px); + -o-transform: translateY(15px); + -ms-transform: translateY(15px); + transform: translateY(15px); + } + 100% { + -webkit-transform: translateY(0); + -moz-transform: translateY(0); + -o-transform: translateY(0); + -ms-transform: translateY(0); + transform: translateY(0); + } +} +@-o-keyframes tabshow { + 0% { + -webkit-transform: translateY(15px); + -moz-transform: translateY(15px); + -o-transform: translateY(15px); + -ms-transform: translateY(15px); + transform: translateY(15px); + } + 100% { + -webkit-transform: translateY(0); + -moz-transform: translateY(0); + -o-transform: translateY(0); + -ms-transform: translateY(0); + transform: translateY(0); + } +} +@keyframes tabshow { + 0% { + -webkit-transform: translateY(15px); + -moz-transform: translateY(15px); + -o-transform: translateY(15px); + -ms-transform: translateY(15px); + transform: translateY(15px); + } + 100% { + -webkit-transform: translateY(0); + -moz-transform: translateY(0); + -o-transform: translateY(0); + -ms-transform: translateY(0); + transform: translateY(0); + } +} +#article-container .timeline { + margin: 0 0 20px 10px; + padding: 14px 20px 5px; + border-left: 2px solid var(--timeline-color, #49b1f5); +} +#article-container .timeline.blue { + --timeline-color: #428bca; + --timeline-bg: rgba(66,139,202, 0.2); +} +#article-container .timeline.pink { + --timeline-color: #ff69b4; + --timeline-bg: rgba(255,105,180, 0.2); +} +#article-container .timeline.red { + --timeline-color: #f00; + --timeline-bg: rgba(255,0,0, 0.2); +} +#article-container .timeline.purple { + --timeline-color: #6f42c1; + --timeline-bg: rgba(111,66,193, 0.2); +} +#article-container .timeline.orange { + --timeline-color: #ff8c00; + --timeline-bg: rgba(255,140,0, 0.2); +} +#article-container .timeline.green { + --timeline-color: #5cb85c; + --timeline-bg: rgba(92,184,92, 0.2); +} +#article-container .timeline .timeline-item { + margin: 0 0 15px; +} +#article-container .timeline .timeline-item:hover .item-circle:before { + border-color: var(--timeline-color, #49b1f5); +} +#article-container .timeline .timeline-item.headline .timeline-item-title .item-circle > p { + font-weight: 600; + font-size: 1.2em; +} +#article-container .timeline .timeline-item.headline .timeline-item-title .item-circle:before { + left: -28px; + border: 4px solid var(--timeline-color, #49b1f5); +} +#article-container .timeline .timeline-item.headline:hover .item-circle:before { + border-color: var(--pseudo-hover); +} +#article-container .timeline .timeline-item .timeline-item-title { + position: relative; +} +#article-container .timeline .timeline-item .item-circle:before { + position: absolute; + top: 50%; + left: -27px; + width: 6px; + height: 6px; + border: 3px solid var(--pseudo-hover); + border-radius: 50%; + background: var(--card-bg); + content: ''; + -webkit-transition: all 0.3s; + -moz-transition: all 0.3s; + -o-transition: all 0.3s; + -ms-transition: all 0.3s; + transition: all 0.3s; + -webkit-transform: translate(0, -50%); + -moz-transform: translate(0, -50%); + -o-transform: translate(0, -50%); + -ms-transform: translate(0, -50%); + transform: translate(0, -50%); +} +#article-container .timeline .timeline-item .item-circle > p { + margin: 0 0 8px; + font-weight: 500; +} +#article-container .timeline .timeline-item .timeline-item-content { + position: relative; + padding: 12px 15px; + border-radius: 8px; + background: var(--timeline-bg, #e4f3fd); + font-size: 0.93em; +} +#article-container .timeline .timeline-item .timeline-item-content > :last-child { + margin-bottom: 0; +} +#article-container .timeline + .timeline { + margin-top: -20px; +} +[data-theme='dark'] { + --global-bg: #0d0d0d; + --font-color: rgba(255,255,255,0.7); + --hr-border: rgba(255,255,255,0.4); + --hr-before-color: rgba(255,255,255,0.7); + --search-bg: #121212; + --search-input-color: rgba(255,255,255,0.7); + --search-a-color: rgba(255,255,255,0.7); + --preloader-bg: #0d0d0d; + --preloader-color: rgba(255,255,255,0.7); + --tab-border-color: #2c2c2c; + --tab-botton-bg: #2c2c2c; + --tab-botton-color: rgba(255,255,255,0.7); + --tab-button-hover-bg: #383838; + --tab-button-active-bg: #121212; + --card-bg: #121212; + --sidebar-bg: #121212; + --btn-hover-color: #787878; + --btn-color: rgba(255,255,255,0.7); + --btn-bg: #1f1f1f; + --text-bg-hover: #383838; + --light-grey: rgba(255,255,255,0.7); + --dark-grey: rgba(255,255,255,0.2); + --white: rgba(255,255,255,0.9); + --text-highlight-color: rgba(255,255,255,0.9); + --blockquote-color: rgba(255,255,255,0.7); + --blockquote-bg: #2c2c2c; + --reward-pop: #2c2c2c; + --toc-link-color: rgba(255,255,255,0.6); + --hl-color: rgba(255,255,255,0.7); + --hl-bg: #171717; + --hltools-bg: #1a1a1a; + --hltools-color: #90a4ae; + --hlnumber-bg: #171717; + --hlnumber-color: rgba(255,255,255,0.4); + --hlscrollbar-bg: #1f1f1f; + --hlexpand-bg: linear-gradient(180deg, rgba(23,23,23,0.6), rgba(23,23,23,0.9)); + --scrollbar-color: #1f1f1f; + --timeline-bg: #1f1f1f; +} +[data-theme='dark'] #web_bg:before, +[data-theme='dark'] #footer:before, +[data-theme='dark'] #page-header:before { + position: absolute; + width: 100%; + height: 100%; + background-color: rgba(0,0,0,0.7); + content: ''; +} +[data-theme='dark'] #article-container code { + background: #2c2c2c; +} +[data-theme='dark'] #article-container pre > code { + background: #171717; +} +[data-theme='dark'] #article-container figure.highlight { + -webkit-box-shadow: none; + box-shadow: none; +} +[data-theme='dark'] #article-container .note code { + background: rgba(27,31,35,0.05); +} +[data-theme='dark'] #article-container .aplayer { + filter: brightness(0.8); +} +[data-theme='dark'] #article-container kbd { + border-color: #696969; + background-color: #525252; + color: #e2f1ff; +} +[data-theme='dark'] #page-header.nav-fixed > #nav, +[data-theme='dark'] #page-header.not-top-img > #nav { + background: rgba(18,18,18,0.8); + -webkit-box-shadow: 0 5px 6px -5px rgba(133,133,133,0); + box-shadow: 0 5px 6px -5px rgba(133,133,133,0); +} +[data-theme='dark'] #post-comment #comment-switch { + background: #2c2c2c !important; +} +[data-theme='dark'] #post-comment #comment-switch .switch-btn { + filter: brightness(0.8); +} +[data-theme='dark'] .note { + filter: brightness(0.8); +} +[data-theme='dark'] .hide-button, +[data-theme='dark'] .btn-beautify, +[data-theme='dark'] .hl-label, +[data-theme='dark'] .post-outdate-notice, +[data-theme='dark'] .error-img, +[data-theme='dark'] #article-container iframe, +[data-theme='dark'] .gist, +[data-theme='dark'] .ads-wrap { + filter: brightness(0.8); +} +[data-theme='dark'] img { + filter: brightness(0.8); +} +[data-theme='dark'] #aside-content .aside-list > .aside-list-item:not(:last-child) { + border-bottom: 1px dashed rgba(255,255,255,0.1); +} +[data-theme='dark'] #gitalk-container { + filter: brightness(0.8); +} +[data-theme='dark'] #gitalk-container svg { + fill: rgba(255,255,255,0.9) !important; +} +[data-theme='dark'] #disqusjs #dsqjs:hover, +[data-theme='dark'] #disqusjs #dsqjs:focus, +[data-theme='dark'] #disqusjs #dsqjs .dsqjs-tab-active, +[data-theme='dark'] #disqusjs #dsqjs .dsqjs-no-comment { + color: rgba(255,255,255,0.7); +} +[data-theme='dark'] #disqusjs #dsqjs .dsqjs-order-label { + background-color: #1f1f1f; +} +[data-theme='dark'] #disqusjs #dsqjs .dsqjs-post-body { + color: rgba(255,255,255,0.7); +} +[data-theme='dark'] #disqusjs #dsqjs .dsqjs-post-body code, +[data-theme='dark'] #disqusjs #dsqjs .dsqjs-post-body pre { + background: #2c2c2c; +} +[data-theme='dark'] #disqusjs #dsqjs .dsqjs-post-body blockquote { + color: rgba(255,255,255,0.7); +} +[data-theme='dark'] #artitalk_main #lazy { + background: #121212; +} +[data-theme='dark'] #operare_artitalk .c2 { + background: #121212; +} +@media screen and (max-width: 900px) { + [data-theme='dark'] #card-toc { + background: #1f1f1f; + } +} +.read-mode { + --font-color: #4c4948; + --readmode-light-color: #fff; + --white: #4c4948; + --light-grey: #4c4948; + --gray: #d6dbdf; + --hr-border: #d6dbdf; + --hr-before-color: #b9c2c9; + --highlight-bg: #f7f7f7; + --exit-btn-bg: #c0c0c0; + --exit-btn-color: #fff; + --exit-btn-hover: #8d8d8d; + --pseudo-hover: none; +} +[data-theme='dark'] .read-mode { + --font-color: rgba(255,255,255,0.7); + --readmode-light-color: #0d0d0d; + --white: rgba(255,255,255,0.9); + --light-grey: rgba(255,255,255,0.7); + --gray: rgba(255,255,255,0.7); + --hr-border: rgba(255,255,255,0.5); + --hr-before-color: rgba(255,255,255,0.7); + --highlight-bg: #171717; + --exit-btn-bg: #1f1f1f; + --exit-btn-color: rgba(255,255,255,0.9); + --exit-btn-hover: #525252; +} +.read-mode { + background: var(--readmode-light-color); +} +.read-mode .exit-readmode { + position: fixed; + top: 30px; + right: 30px; + z-index: 100; + width: 40px; + height: 40px; + border-radius: 8px; + background: var(--exit-btn-bg); + color: var(--exit-btn-color); + font-size: 16px; + -webkit-transition: background 0.3s; + -moz-transition: background 0.3s; + -o-transition: background 0.3s; + -ms-transition: background 0.3s; + transition: background 0.3s; +} +@media screen and (max-width: 768px) { + .read-mode .exit-readmode { + top: initial; + bottom: 30px; + } +} +.read-mode .exit-readmode:hover { + background: var(--exit-btn-hover); +} +.read-mode #aside-content { + display: none; +} +.read-mode #page-header.post-bg { + background-color: transparent; + background-image: none !important; +} +.read-mode #page-header.post-bg:before { + opacity: 0; + -ms-filter: "progid:DXImageTransform.Microsoft.Alpha(Opacity=0)"; + filter: alpha(opacity=0); +} +.read-mode #page-header.post-bg > #post-info { + text-align: center; +} +.read-mode #post { + margin: 0 auto; + background: transparent; + -webkit-box-shadow: none; + box-shadow: none; +} +.read-mode #post:hover { + -webkit-box-shadow: none; + box-shadow: none; +} +.read-mode > canvas { + display: none !important; +} +.read-mode .highlight-tools, +.read-mode #footer, +.read-mode #post > *:not(#post-info):not(.post-content), +.read-mode #nav, +.read-mode .post-outdate-notice, +.read-mode #web_bg, +.read-mode #rightside, +.read-mode .not-top-img { + display: none !important; +} +.read-mode #article-container a { + color: #99a9bf; +} +.read-mode #article-container pre, +.read-mode #article-container .highlight:not(.js-file-line-container) { + background: var(--highlight-bg) !important; +} +.read-mode #article-container pre *, +.read-mode #article-container .highlight:not(.js-file-line-container) * { + color: var(--font-color) !important; +} +.read-mode #article-container figure.highlight { + border-radius: 0 !important; + -webkit-box-shadow: none !important; + box-shadow: none !important; +} +.read-mode #article-container figure.highlight > :not(.highlight-tools) { + display: block !important; +} +.read-mode #article-container figure.highlight .line:before { + color: var(--font-color) !important; +} +.read-mode #article-container figure.highlight .hljs { + background: var(--highlight-bg) !important; +} +.read-mode #article-container h1, +.read-mode #article-container h2, +.read-mode #article-container h3, +.read-mode #article-container h4, +.read-mode #article-container h5, +.read-mode #article-container h6 { + padding: 0; +} +.read-mode #article-container h1:before, +.read-mode #article-container h2:before, +.read-mode #article-container h3:before, +.read-mode #article-container h4:before, +.read-mode #article-container h5:before, +.read-mode #article-container h6:before { + content: ''; +} +.read-mode #article-container h1:hover, +.read-mode #article-container h2:hover, +.read-mode #article-container h3:hover, +.read-mode #article-container h4:hover, +.read-mode #article-container h5:hover, +.read-mode #article-container h6:hover { + padding: 0; +} +.read-mode #article-container ul:hover:before, +.read-mode #article-container li:hover:before, +.read-mode #article-container ol:hover:before { + -webkit-transform: none !important; + -moz-transform: none !important; + -o-transform: none !important; + -ms-transform: none !important; + transform: none !important; +} +.read-mode #article-container ol:before, +.read-mode #article-container li:before { + background: transparent !important; + color: var(--font-color) !important; +} +.read-mode #article-container ul >li:before { + border-color: var(--gray) !important; +} +.read-mode #article-container .tabs { + border: 2px solid var(--tab-border-color); +} +.read-mode #article-container .tabs > .nav-tabs { + background: transparent; +} +.read-mode #article-container .tabs > .nav-tabs > .tab { + border-bottom: 0; +} +.read-mode #article-container .tabs > .nav-tabs > .tab button { + border-top: none !important; + background: transparent; +} +.read-mode #article-container .tabs > .nav-tabs > .tab button:hover { + background: none !important; +} +.read-mode #article-container .tabs > .nav-tabs > .tab.active button { + text-decoration: underline; +} +.read-mode #article-container .tabs > .tab-contents .tab-item-content.active { + -webkit-animation: none; + -moz-animation: none; + -o-animation: none; + -ms-animation: none; + animation: none; +} +.read-mode #article-container code { + color: var(--font-color); +} +.read-mode #article-container blockquote { + border-color: var(--gray); + background-color: var(--readmode-light-color); +} +.read-mode #article-container kbd { + border: 1px solid var(--gray); + background-color: transparent; + -webkit-box-shadow: none; + box-shadow: none; + color: var(--font-color); +} +.read-mode #article-container .hide-toggle { + border: 1px solid var(--gray) !important; +} +.read-mode #article-container .hide-button, +.read-mode #article-container .btn-beautify, +.read-mode #article-container .hl-label { + border: 1px solid var(--gray) !important; + background: var(--readmode-light-color) !important; + color: var(--font-color) !important; +} +.read-mode #article-container .note { + border: 2px solid var(--gray); + border-left-color: var(--gray) !important; + filter: none; + background-color: var(--readmode-light-color) !important; + color: var(--font-color); +} +.read-mode #article-container .note:before, +.read-mode #article-container .note .note-icon { + color: var(--font-color); +} +.search-dialog { + position: fixed; + top: 10%; + left: 50%; + z-index: 1001; + display: none; + margin-left: -300px; + padding: 20px; + width: 600px; + border-radius: 8px; + background: var(--search-bg); + --search-height: 100vh; +} +@media screen and (max-width: 768px) { + .search-dialog { + top: 0; + left: 0; + margin: 0; + width: 100%; + height: 100%; + border-radius: 0; + } +} +.search-dialog hr { + margin: 20px auto; +} +.search-dialog .search-nav { + margin: 0 0 14px; + color: #49b1f5; + font-size: 1.4em; + line-height: 1; +} +.search-dialog .search-nav .search-dialog-title { + margin-right: 10px; +} +.search-dialog .search-nav .search-close-button { + float: right; + color: #858585; + -webkit-transition: color 0.2s ease-in-out; + -moz-transition: color 0.2s ease-in-out; + -o-transition: color 0.2s ease-in-out; + -ms-transition: color 0.2s ease-in-out; + transition: color 0.2s ease-in-out; +} +.search-dialog .search-nav .search-close-button:hover { + color: #49b1f5; +} +#search-mask { + position: fixed; + top: 0; + right: 0; + bottom: 0; + left: 0; + z-index: 1000; + display: none; + background: rgba(0,0,0,0.6); +} +#local-search .search-dialog .local-search-box { + margin: 0 auto; + max-width: 100%; + width: 100%; +} +#local-search .search-dialog .local-search-box input { + padding: 5px 14px; + width: 100%; + outline: none; + border: 2px solid #49b1f5; + border-radius: 40px; + background: var(--search-bg); + color: var(--search-input-color); + -webkit-appearance: none; +} +#local-search .search-dialog .search-wrap { + display: none; +} +#local-search .search-dialog .local-search-hit-item { + position: relative; + padding-left: 24px; + line-height: 1.7; +} +#local-search .search-dialog .local-search-hit-item:hover:before { + border-color: var(--pseudo-hover); +} +#local-search .search-dialog .local-search-hit-item:before { + position: absolute; + top: 0.45em; + left: 0; + width: 0.5em; + height: 0.5em; + border: 3px solid #49b1f5; + border-radius: 0.5em; + background: transparent; + content: ''; + line-height: 0.5em; + -webkit-transition: all 0.2s ease-in-out; + -moz-transition: all 0.2s ease-in-out; + -o-transition: all 0.2s ease-in-out; + -ms-transition: all 0.2s ease-in-out; + transition: all 0.2s ease-in-out; +} +#local-search .search-dialog .local-search-hit-item a { + display: block; + color: var(--search-a-color); +} +#local-search .search-dialog .local-search-hit-item a:hover { + color: #49b1f5; +} +#local-search .search-dialog .local-search-hit-item .search-result-title { + font-weight: 600; +} +#local-search .search-dialog .local-search-hit-item .search-result { + margin: 0 0 8px; + word-break: break-word; +} +#local-search .search-dialog .search-result-list { + overflow-y: overlay; + margin: 0 -20px; + padding: 0 22px; + max-height: calc(80vh - 200px); +} +@media screen and (max-width: 768px) { + #local-search .search-dialog .search-result-list { + max-height: calc(var(--search-height) - 220px) !important; + } +} +#local-search .search-dialog .no-result + #local-search-stats-wrap { + display: none; +} +.search-keyword { + background: transparent; + color: #f47466; + font-weight: bold; +} diff --git a/placeholder b/css/var.css similarity index 100% rename from placeholder rename to css/var.css diff --git a/img/123.png b/img/123.png new file mode 100644 index 0000000..862ebe8 Binary files /dev/null and b/img/123.png differ diff --git a/img/404.jpg b/img/404.jpg new file mode 100644 index 0000000..4bab3c3 Binary files /dev/null and b/img/404.jpg differ diff --git a/img/favicon.png b/img/favicon.png new file mode 100644 index 0000000..b40a52a Binary files /dev/null and b/img/favicon.png differ diff --git a/img/friend_404.gif b/img/friend_404.gif new file mode 100644 index 0000000..91dd56a Binary files /dev/null and b/img/friend_404.gif differ diff --git a/index.html b/index.html new file mode 100644 index 0000000..efa2c87 --- /dev/null +++ b/index.html @@ -0,0 +1,228 @@ +SHYEE-PLASMA - 306 + + + + + + + +
    Design of a novel high efficiency antenna for helicon plasma sources
    Radio Frequency Excited Plasma Discharge Simulation for Potential Helicon Plasma Thruster
    Discharge Directionality and Dominance of Right-Handed Modes in Helicon Plasmas due to Radial Electron Density Gradients
    学习pandas(从kaggle上)
    记一个简单的人脸识别
    A 1D cylindrical kinetic wave code for helicon plasma sources
    网络安全
    Machine learning Trends perspectives and prospects
    Machine Learning Algorithms A Review
    记一个最基础的机器学习
    \ No newline at end of file diff --git a/js/main.js b/js/main.js new file mode 100644 index 0000000..e00d435 --- /dev/null +++ b/js/main.js @@ -0,0 +1,827 @@ +document.addEventListener('DOMContentLoaded', function () { + let headerContentWidth, $nav + let mobileSidebarOpen = false + + const adjustMenu = init => { + const getAllWidth = ele => { + let width = 0 + ele.length && Array.from(ele).forEach(i => { width += i.offsetWidth }) + return width + } + + if (init) { + const blogInfoWidth = getAllWidth(document.querySelector('#blog-info > a').children) + const menusWidth = getAllWidth(document.getElementById('menus').children) + headerContentWidth = blogInfoWidth + menusWidth + $nav = document.getElementById('nav') + } + + let hideMenuIndex = '' + if (window.innerWidth <= 768) hideMenuIndex = true + else hideMenuIndex = headerContentWidth > $nav.offsetWidth - 120 + + if (hideMenuIndex) { + $nav.classList.add('hide-menu') + } else { + $nav.classList.remove('hide-menu') + } + } + + // 初始化header + const initAdjust = () => { + adjustMenu(true) + $nav.classList.add('show') + } + + // sidebar menus + const sidebarFn = { + open: () => { + btf.sidebarPaddingR() + document.body.style.overflow = 'hidden' + btf.animateIn(document.getElementById('menu-mask'), 'to_show 0.5s') + document.getElementById('sidebar-menus').classList.add('open') + mobileSidebarOpen = true + }, + close: () => { + const $body = document.body + $body.style.overflow = '' + $body.style.paddingRight = '' + btf.animateOut(document.getElementById('menu-mask'), 'to_hide 0.5s') + document.getElementById('sidebar-menus').classList.remove('open') + mobileSidebarOpen = false + } + } + + /** + * 首頁top_img底下的箭頭 + */ + const scrollDownInIndex = () => { + const $scrollDownEle = document.getElementById('scroll-down') + $scrollDownEle && $scrollDownEle.addEventListener('click', function () { + btf.scrollToDest(document.getElementById('content-inner').offsetTop, 300) + }) + } + + /** + * 代碼 + * 只適用於Hexo默認的代碼渲染 + */ + const addHighlightTool = function () { + const highLight = GLOBAL_CONFIG.highlight + if (!highLight) return + + const isHighlightCopy = highLight.highlightCopy + const isHighlightLang = highLight.highlightLang + const isHighlightShrink = GLOBAL_CONFIG_SITE.isHighlightShrink + const highlightHeightLimit = highLight.highlightHeightLimit + const isShowTool = isHighlightCopy || isHighlightLang || isHighlightShrink !== undefined + const $figureHighlight = highLight.plugin === 'highlighjs' ? document.querySelectorAll('figure.highlight') : document.querySelectorAll('pre[class*="language-"]') + + if (!((isShowTool || highlightHeightLimit) && $figureHighlight.length)) return + + const isPrismjs = highLight.plugin === 'prismjs' + + let highlightShrinkEle = '' + let highlightCopyEle = '' + const highlightShrinkClass = isHighlightShrink === true ? 'closed' : '' + + if (isHighlightShrink !== undefined) { + highlightShrinkEle = `` + } + + if (isHighlightCopy) { + highlightCopyEle = '
    ' + } + + const copy = (text, ctx) => { + if (document.queryCommandSupported && document.queryCommandSupported('copy')) { + document.execCommand('copy') + if (GLOBAL_CONFIG.Snackbar !== undefined) { + btf.snackbarShow(GLOBAL_CONFIG.copy.success) + } else { + const prevEle = ctx.previousElementSibling + prevEle.innerText = GLOBAL_CONFIG.copy.success + prevEle.style.opacity = 1 + setTimeout(() => { prevEle.style.opacity = 0 }, 700) + } + } else { + if (GLOBAL_CONFIG.Snackbar !== undefined) { + btf.snackbarShow(GLOBAL_CONFIG.copy.noSupport) + } else { + ctx.previousElementSibling.innerText = GLOBAL_CONFIG.copy.noSupport + } + } + } + + // click events + const highlightCopyFn = (ele) => { + const $buttonParent = ele.parentNode + $buttonParent.classList.add('copy-true') + const selection = window.getSelection() + const range = document.createRange() + if (isPrismjs) range.selectNodeContents($buttonParent.querySelectorAll('pre code')[0]) + else range.selectNodeContents($buttonParent.querySelectorAll('table .code pre')[0]) + selection.removeAllRanges() + selection.addRange(range) + const text = selection.toString() + copy(text, ele.lastChild) + selection.removeAllRanges() + $buttonParent.classList.remove('copy-true') + } + + const highlightShrinkFn = (ele) => { + const $nextEle = [...ele.parentNode.children].slice(1) + ele.firstChild.classList.toggle('closed') + if (btf.isHidden($nextEle[$nextEle.length - 1])) { + $nextEle.forEach(e => { e.style.display = 'block' }) + } else { + $nextEle.forEach(e => { e.style.display = 'none' }) + } + } + + const highlightToolsFn = function (e) { + const $target = e.target.classList + if ($target.contains('expand')) highlightShrinkFn(this) + else if ($target.contains('copy-button')) highlightCopyFn(this) + } + + const expandCode = function () { + this.classList.toggle('expand-done') + } + + function createEle (lang, item, service) { + const fragment = document.createDocumentFragment() + + if (isShowTool) { + const hlTools = document.createElement('div') + hlTools.className = `highlight-tools ${highlightShrinkClass}` + hlTools.innerHTML = highlightShrinkEle + lang + highlightCopyEle + hlTools.addEventListener('click', highlightToolsFn) + fragment.appendChild(hlTools) + } + + if (highlightHeightLimit && item.offsetHeight > highlightHeightLimit + 30) { + const ele = document.createElement('div') + ele.className = 'code-expand-btn' + ele.innerHTML = '' + ele.addEventListener('click', expandCode) + fragment.appendChild(ele) + } + + if (service === 'hl') { + item.insertBefore(fragment, item.firstChild) + } else { + item.parentNode.insertBefore(fragment, item) + } + } + + if (isHighlightLang) { + if (isPrismjs) { + $figureHighlight.forEach(function (item) { + const langName = item.getAttribute('data-language') ? item.getAttribute('data-language') : 'Code' + const highlightLangEle = `
    ${langName}
    ` + btf.wrap(item, 'figure', { class: 'highlight' }) + createEle(highlightLangEle, item) + }) + } else { + $figureHighlight.forEach(function (item) { + let langName = item.getAttribute('class').split(' ')[1] + if (langName === 'plain' || langName === undefined) langName = 'Code' + const highlightLangEle = `
    ${langName}
    ` + createEle(highlightLangEle, item, 'hl') + }) + } + } else { + if (isPrismjs) { + $figureHighlight.forEach(function (item) { + btf.wrap(item, 'figure', { class: 'highlight' }) + createEle('', item) + }) + } else { + $figureHighlight.forEach(function (item) { + createEle('', item, 'hl') + }) + } + } + } + + /** + * PhotoFigcaption + */ + function addPhotoFigcaption () { + document.querySelectorAll('#article-container img').forEach(function (item) { + const parentEle = item.parentNode + const altValue = item.title || item.alt + if (altValue && !parentEle.parentNode.classList.contains('justified-gallery')) { + const ele = document.createElement('div') + ele.className = 'img-alt is-center' + ele.textContent = altValue + parentEle.insertBefore(ele, item.nextSibling) + } + }) + } + + /** + * Lightbox + */ + const runLightbox = () => { + btf.loadLightbox(document.querySelectorAll('#article-container img:not(.no-lightbox)')) + } + + /** + * justified-gallery 圖庫排版 + */ + const runJustifiedGallery = function (ele) { + const htmlStr = arr => { + let str = '' + const replaceDq = str => str.replace(/"/g, '"') // replace double quotes to " + arr.forEach(i => { + const alt = i.alt ? `alt="${replaceDq(i.alt)}"` : '' + const title = i.title ? `title="${replaceDq(i.title)}"` : '' + str += `` + }) + return str + } + + const lazyloadFn = (i, arr, limit) => { + const loadItem = limit + const arrLength = arr.length + if (arrLength > loadItem) i.insertAdjacentHTML('beforeend', htmlStr(arr.splice(0, loadItem))) + else { + i.insertAdjacentHTML('beforeend', htmlStr(arr)) + i.classList.remove('lazyload') + } + return arrLength > loadItem ? loadItem : arrLength + } + + const fetchUrl = async (url) => { + const response = await fetch(url) + return await response.json() + } + + const runJustifiedGallery = (item, arr) => { + if (!item.classList.contains('lazyload')) item.innerHTML = htmlStr(arr) + else { + const limit = item.getAttribute('data-limit') + lazyloadFn(item, arr, limit) + const clickBtnFn = () => { + const lastItemLength = lazyloadFn(item, arr, limit) + fjGallery(item, 'appendImages', item.querySelectorAll(`.fj-gallery-item:nth-last-child(-n+${lastItemLength})`)) + btf.loadLightbox(item.querySelectorAll('img')) + lastItemLength < limit && item.nextElementSibling.removeEventListener('click', clickBtnFn) + } + item.nextElementSibling.addEventListener('click', clickBtnFn) + } + btf.initJustifiedGallery(item) + btf.loadLightbox(item.querySelectorAll('img')) + } + + const addJustifiedGallery = () => { + ele.forEach(item => { + item.classList.contains('url') + ? fetchUrl(item.textContent).then(res => { runJustifiedGallery(item, res) }) + : runJustifiedGallery(item, JSON.parse(item.textContent)) + }) + } + + if (window.fjGallery) { + addJustifiedGallery() + return + } + + getCSS(`${GLOBAL_CONFIG.source.justifiedGallery.css}`) + getScript(`${GLOBAL_CONFIG.source.justifiedGallery.js}`).then(addJustifiedGallery) + } + + /** + * rightside scroll percent + */ + const rightsideScrollPercent = currentTop => { + const perNum = btf.getScrollPercent(currentTop, document.body) + const $goUp = document.getElementById('go-up') + if (perNum < 95) { + $goUp.classList.add('show-percent') + $goUp.querySelector('.scroll-percent').textContent = perNum + } else { + $goUp.classList.remove('show-percent') + } + } + + /** + * 滾動處理 + */ + const scrollFn = function () { + const $rightside = document.getElementById('rightside') + const innerHeight = window.innerHeight + 56 + + // 當滾動條小于 56 的時候 + if (document.body.scrollHeight <= innerHeight) { + $rightside.style.cssText = 'opacity: 1; transform: translateX(-58px)' + return + } + + // find the scroll direction + function scrollDirection (currentTop) { + const result = currentTop > initTop // true is down & false is up + initTop = currentTop + return result + } + + let initTop = 0 + let isChatShow = true + const $header = document.getElementById('page-header') + const isChatBtnHide = typeof chatBtnHide === 'function' + const isChatBtnShow = typeof chatBtnShow === 'function' + const isShowPercent = GLOBAL_CONFIG.percent.rightside + + const scrollTask = btf.throttle(() => { + const currentTop = window.scrollY || document.documentElement.scrollTop + const isDown = scrollDirection(currentTop) + if (currentTop > 56) { + if (isDown) { + if ($header.classList.contains('nav-visible')) $header.classList.remove('nav-visible') + if (isChatBtnShow && isChatShow === true) { + chatBtnHide() + isChatShow = false + } + } else { + if (!$header.classList.contains('nav-visible')) $header.classList.add('nav-visible') + if (isChatBtnHide && isChatShow === false) { + chatBtnShow() + isChatShow = true + } + } + $header.classList.add('nav-fixed') + if (window.getComputedStyle($rightside).getPropertyValue('opacity') === '0') { + $rightside.style.cssText = 'opacity: 0.8; transform: translateX(-58px)' + } + } else { + if (currentTop === 0) { + $header.classList.remove('nav-fixed', 'nav-visible') + } + $rightside.style.cssText = "opacity: ''; transform: ''" + } + + isShowPercent && rightsideScrollPercent(currentTop) + + if (document.body.scrollHeight <= innerHeight) { + $rightside.style.cssText = 'opacity: 0.8; transform: translateX(-58px)' + } + }, 200) + + window.scrollCollect = scrollTask + + window.addEventListener('scroll', scrollCollect) + } + + /** + * toc,anchor + */ + const scrollFnToDo = function () { + const isToc = GLOBAL_CONFIG_SITE.isToc + const isAnchor = GLOBAL_CONFIG.isAnchor + const $article = document.getElementById('article-container') + + if (!($article && (isToc || isAnchor))) return + + let $tocLink, $cardToc, autoScrollToc, $tocPercentage, isExpand + + if (isToc) { + const $cardTocLayout = document.getElementById('card-toc') + $cardToc = $cardTocLayout.getElementsByClassName('toc-content')[0] + $tocLink = $cardToc.querySelectorAll('.toc-link') + $tocPercentage = $cardTocLayout.querySelector('.toc-percentage') + isExpand = $cardToc.classList.contains('is-expand') + + window.mobileToc = { + open: () => { + $cardTocLayout.style.cssText = 'animation: toc-open .3s; opacity: 1; right: 55px' + }, + + close: () => { + $cardTocLayout.style.animation = 'toc-close .2s' + setTimeout(() => { + $cardTocLayout.style.cssText = "opacity:''; animation: ''; right: ''" + }, 100) + } + } + + // toc元素點擊 + $cardToc.addEventListener('click', e => { + e.preventDefault() + const target = e.target.classList + if (target.contains('toc-content')) return + const $target = target.contains('toc-link') + ? e.target + : e.target.parentElement + btf.scrollToDest(btf.getEleTop(document.getElementById(decodeURI($target.getAttribute('href')).replace('#', ''))), 300) + if (window.innerWidth < 900) { + window.mobileToc.close() + } + }) + + autoScrollToc = item => { + const activePosition = item.getBoundingClientRect().top + const sidebarScrollTop = $cardToc.scrollTop + if (activePosition > (document.documentElement.clientHeight - 100)) { + $cardToc.scrollTop = sidebarScrollTop + 150 + } + if (activePosition < 100) { + $cardToc.scrollTop = sidebarScrollTop - 150 + } + } + } + + // find head position & add active class + const list = $article.querySelectorAll('h1,h2,h3,h4,h5,h6') + let detectItem = '' + const findHeadPosition = function (top) { + if (top === 0) { + return false + } + + let currentId = '' + let currentIndex = '' + + list.forEach(function (ele, index) { + if (top > btf.getEleTop(ele) - 80) { + const id = ele.id + currentId = id ? '#' + encodeURI(id) : '' + currentIndex = index + } + }) + + if (detectItem === currentIndex) return + + if (isAnchor) btf.updateAnchor(currentId) + + detectItem = currentIndex + + if (isToc) { + $cardToc.querySelectorAll('.active').forEach(i => { i.classList.remove('active') }) + + if (currentId === '') { + return + } + + const currentActive = $tocLink[currentIndex] + currentActive.classList.add('active') + + setTimeout(() => { + autoScrollToc(currentActive) + }, 0) + + if (isExpand) return + let parent = currentActive.parentNode + + for (; !parent.matches('.toc'); parent = parent.parentNode) { + if (parent.matches('li')) parent.classList.add('active') + } + } + } + + // main of scroll + window.tocScrollFn = btf.throttle(() => { + const currentTop = window.scrollY || document.documentElement.scrollTop + if (isToc && GLOBAL_CONFIG.percent.toc) { + $tocPercentage.textContent = btf.getScrollPercent(currentTop, $article) + } + findHeadPosition(currentTop) + }, 100) + + window.addEventListener('scroll', tocScrollFn) + } + + /** + * Rightside + */ + const rightSideFn = { + switchReadMode: () => { // read-mode + const $body = document.body + $body.classList.add('read-mode') + const newEle = document.createElement('button') + newEle.type = 'button' + newEle.className = 'fas fa-sign-out-alt exit-readmode' + $body.appendChild(newEle) + + function clickFn () { + $body.classList.remove('read-mode') + newEle.remove() + newEle.removeEventListener('click', clickFn) + } + + newEle.addEventListener('click', clickFn) + }, + switchDarkMode: () => { // Switch Between Light And Dark Mode + const nowMode = document.documentElement.getAttribute('data-theme') === 'dark' ? 'dark' : 'light' + if (nowMode === 'light') { + activateDarkMode() + saveToLocal.set('theme', 'dark', 2) + GLOBAL_CONFIG.Snackbar !== undefined && btf.snackbarShow(GLOBAL_CONFIG.Snackbar.day_to_night) + } else { + activateLightMode() + saveToLocal.set('theme', 'light', 2) + GLOBAL_CONFIG.Snackbar !== undefined && btf.snackbarShow(GLOBAL_CONFIG.Snackbar.night_to_day) + } + // handle some cases + typeof utterancesTheme === 'function' && utterancesTheme() + typeof changeGiscusTheme === 'function' && changeGiscusTheme() + typeof FB === 'object' && window.loadFBComment && window.loadFBComment() + typeof runMermaid === 'function' && window.runMermaid() + }, + showOrHideBtn: (e) => { // rightside 點擊設置 按鈕 展開 + const rightsideHideClassList = document.getElementById('rightside-config-hide').classList + rightsideHideClassList.toggle('show') + if (e.classList.contains('show')) { + rightsideHideClassList.add('status') + setTimeout(() => { + rightsideHideClassList.remove('status') + }, 300) + } + e.classList.toggle('show') + }, + scrollToTop: () => { // Back to top + btf.scrollToDest(0, 500) + }, + hideAsideBtn: () => { // Hide aside + const $htmlDom = document.documentElement.classList + $htmlDom.contains('hide-aside') + ? saveToLocal.set('aside-status', 'show', 2) + : saveToLocal.set('aside-status', 'hide', 2) + $htmlDom.toggle('hide-aside') + }, + + runMobileToc: () => { + if (window.getComputedStyle(document.getElementById('card-toc')).getPropertyValue('opacity') === '0') window.mobileToc.open() + else window.mobileToc.close() + } + } + + document.getElementById('rightside').addEventListener('click', function (e) { + const $target = e.target.id ? e.target : e.target.parentNode + switch ($target.id) { + case 'go-up': + rightSideFn.scrollToTop() + break + case 'rightside_config': + rightSideFn.showOrHideBtn($target) + break + case 'mobile-toc-button': + rightSideFn.runMobileToc() + break + case 'readmode': + rightSideFn.switchReadMode() + break + case 'darkmode': + rightSideFn.switchDarkMode() + break + case 'hide-aside-btn': + rightSideFn.hideAsideBtn() + break + default: + break + } + }) + + /** + * menu + * 側邊欄sub-menu 展開/收縮 + */ + const clickFnOfSubMenu = () => { + document.querySelectorAll('#sidebar-menus .site-page.group').forEach(function (item) { + item.addEventListener('click', function () { + this.classList.toggle('hide') + }) + }) + } + + /** + * 複製時加上版權信息 + */ + const addCopyright = () => { + const copyright = GLOBAL_CONFIG.copyright + document.body.oncopy = (e) => { + e.preventDefault() + let textFont; const copyFont = window.getSelection(0).toString() + if (copyFont.length > copyright.limitCount) { + textFont = copyFont + '\n' + '\n' + '\n' + + copyright.languages.author + '\n' + + copyright.languages.link + window.location.href + '\n' + + copyright.languages.source + '\n' + + copyright.languages.info + } else { + textFont = copyFont + } + if (e.clipboardData) { + return e.clipboardData.setData('text', textFont) + } else { + return window.clipboardData.setData('text', textFont) + } + } + } + + /** + * 網頁運行時間 + */ + const addRuntime = () => { + const $runtimeCount = document.getElementById('runtimeshow') + if ($runtimeCount) { + const publishDate = $runtimeCount.getAttribute('data-publishDate') + $runtimeCount.innerText = btf.diffDate(publishDate) + ' ' + GLOBAL_CONFIG.runtime + } + } + + /** + * 最後一次更新時間 + */ + const addLastPushDate = () => { + const $lastPushDateItem = document.getElementById('last-push-date') + if ($lastPushDateItem) { + const lastPushDate = $lastPushDateItem.getAttribute('data-lastPushDate') + $lastPushDateItem.innerText = btf.diffDate(lastPushDate, true) + } + } + + /** + * table overflow + */ + const addTableWrap = () => { + const $table = document.querySelectorAll('#article-container :not(.highlight) > table, #article-container > table') + if ($table.length) { + $table.forEach(item => { + btf.wrap(item, 'div', { class: 'table-wrap' }) + }) + } + } + + /** + * tag-hide + */ + const clickFnOfTagHide = function () { + const $hideInline = document.querySelectorAll('#article-container .hide-button') + if ($hideInline.length) { + $hideInline.forEach(function (item) { + item.addEventListener('click', function (e) { + const $this = this + $this.classList.add('open') + const $fjGallery = $this.nextElementSibling.querySelectorAll('.fj-gallery') + $fjGallery.length && btf.initJustifiedGallery($fjGallery) + }) + }) + } + } + + const tabsFn = { + clickFnOfTabs: function () { + document.querySelectorAll('#article-container .tab > button').forEach(function (item) { + item.addEventListener('click', function (e) { + const $this = this + const $tabItem = $this.parentNode + + if (!$tabItem.classList.contains('active')) { + const $tabContent = $tabItem.parentNode.nextElementSibling + const $siblings = btf.siblings($tabItem, '.active')[0] + $siblings && $siblings.classList.remove('active') + $tabItem.classList.add('active') + const tabId = $this.getAttribute('data-href').replace('#', '') + const childList = [...$tabContent.children] + childList.forEach(item => { + if (item.id === tabId) item.classList.add('active') + else item.classList.remove('active') + }) + const $isTabJustifiedGallery = $tabContent.querySelectorAll(`#${tabId} .fj-gallery`) + if ($isTabJustifiedGallery.length > 0) { + btf.initJustifiedGallery($isTabJustifiedGallery) + } + } + }) + }) + }, + backToTop: () => { + document.querySelectorAll('#article-container .tabs .tab-to-top').forEach(function (item) { + item.addEventListener('click', function () { + btf.scrollToDest(btf.getEleTop(btf.getParents(this, '.tabs')), 300) + }) + }) + } + } + + const toggleCardCategory = function () { + const $cardCategory = document.querySelectorAll('#aside-cat-list .card-category-list-item.parent i') + if ($cardCategory.length) { + $cardCategory.forEach(function (item) { + item.addEventListener('click', function (e) { + e.preventDefault() + const $this = this + $this.classList.toggle('expand') + const $parentEle = $this.parentNode.nextElementSibling + if (btf.isHidden($parentEle)) { + $parentEle.style.display = 'block' + } else { + $parentEle.style.display = 'none' + } + }) + }) + } + } + + const switchComments = function () { + let switchDone = false + const $switchBtn = document.querySelector('#comment-switch > .switch-btn') + $switchBtn && $switchBtn.addEventListener('click', function () { + this.classList.toggle('move') + document.querySelectorAll('#post-comment > .comment-wrap > div').forEach(function (item) { + if (btf.isHidden(item)) { + item.style.cssText = 'display: block;animation: tabshow .5s' + } else { + item.style.cssText = "display: none;animation: ''" + } + }) + + if (!switchDone && typeof loadOtherComment === 'function') { + switchDone = true + loadOtherComment() + } + }) + } + + const addPostOutdateNotice = function () { + const data = GLOBAL_CONFIG.noticeOutdate + const diffDay = btf.diffDate(GLOBAL_CONFIG_SITE.postUpdate) + if (diffDay >= data.limitDay) { + const ele = document.createElement('div') + ele.className = 'post-outdate-notice' + ele.textContent = data.messagePrev + ' ' + diffDay + ' ' + data.messageNext + const $targetEle = document.getElementById('article-container') + if (data.position === 'top') { + $targetEle.insertBefore(ele, $targetEle.firstChild) + } else { + $targetEle.appendChild(ele) + } + } + } + + const lazyloadImg = () => { + window.lazyLoadInstance = new LazyLoad({ + elements_selector: 'img', + threshold: 0, + data_src: 'lazy-src' + }) + } + + const relativeDate = function (selector) { + selector.forEach(item => { + const $this = item + const timeVal = $this.getAttribute('datetime') + $this.innerText = btf.diffDate(timeVal, true) + $this.style.display = 'inline' + }) + } + + const unRefreshFn = function () { + window.addEventListener('resize', () => { + adjustMenu(false) + btf.isHidden(document.getElementById('toggle-menu')) && mobileSidebarOpen && sidebarFn.close() + }) + + document.getElementById('menu-mask').addEventListener('click', e => { sidebarFn.close() }) + + clickFnOfSubMenu() + GLOBAL_CONFIG.islazyload && lazyloadImg() + GLOBAL_CONFIG.copyright !== undefined && addCopyright() + } + + window.refreshFn = function () { + initAdjust() + + if (GLOBAL_CONFIG_SITE.isPost) { + GLOBAL_CONFIG.noticeOutdate !== undefined && addPostOutdateNotice() + GLOBAL_CONFIG.relativeDate.post && relativeDate(document.querySelectorAll('#post-meta time')) + } else { + GLOBAL_CONFIG.relativeDate.homepage && relativeDate(document.querySelectorAll('#recent-posts time')) + GLOBAL_CONFIG.runtime && addRuntime() + addLastPushDate() + toggleCardCategory() + } + + scrollFnToDo() + GLOBAL_CONFIG_SITE.isHome && scrollDownInIndex() + addHighlightTool() + GLOBAL_CONFIG.isPhotoFigcaption && addPhotoFigcaption() + scrollFn() + + const $jgEle = document.querySelectorAll('#article-container .fj-gallery') + $jgEle.length && runJustifiedGallery($jgEle) + + runLightbox() + addTableWrap() + clickFnOfTagHide() + tabsFn.clickFnOfTabs() + tabsFn.backToTop() + switchComments() + document.getElementById('toggle-menu').addEventListener('click', () => { sidebarFn.open() }) + } + + refreshFn() + unRefreshFn() +}) diff --git a/js/search/algolia.js b/js/search/algolia.js new file mode 100644 index 0000000..9ac9f94 --- /dev/null +++ b/js/search/algolia.js @@ -0,0 +1,177 @@ +window.addEventListener('load', () => { + const $searchMask = document.getElementById('search-mask') + const $searchDialog = document.querySelector('#algolia-search .search-dialog') + + const openSearch = () => { + const bodyStyle = document.body.style + bodyStyle.width = '100%' + bodyStyle.overflow = 'hidden' + btf.animateIn($searchMask, 'to_show 0.5s') + btf.animateIn($searchDialog, 'titleScale 0.5s') + setTimeout(() => { document.querySelector('#algolia-search .ais-SearchBox-input').focus() }, 100) + + // shortcut: ESC + document.addEventListener('keydown', function f (event) { + if (event.code === 'Escape') { + closeSearch() + document.removeEventListener('keydown', f) + } + }) + + fixSafariHeight() + window.addEventListener('resize', fixSafariHeight) + } + + const closeSearch = () => { + const bodyStyle = document.body.style + bodyStyle.width = '' + bodyStyle.overflow = '' + btf.animateOut($searchDialog, 'search_close .5s') + btf.animateOut($searchMask, 'to_hide 0.5s') + window.removeEventListener('resize', fixSafariHeight) + } + + // fix safari + const fixSafariHeight = () => { + if (window.innerWidth < 768) { + $searchDialog.style.setProperty('--search-height', window.innerHeight + 'px') + } + } + + const searchClickFn = () => { + document.querySelector('#search-button > .search').addEventListener('click', openSearch) + } + + const searchFnOnce = () => { + $searchMask.addEventListener('click', closeSearch) + document.querySelector('#algolia-search .search-close-button').addEventListener('click', closeSearch) + } + + const cutContent = content => { + if (content === '') return '' + + const firstOccur = content.indexOf('') + + let start = firstOccur - 30 + let end = firstOccur + 120 + let pre = '' + let post = '' + + if (start <= 0) { + start = 0 + end = 140 + } else { + pre = '...' + } + + if (end > content.length) { + end = content.length + } else { + post = '...' + } + + const matchContent = pre + content.substring(start, end) + post + return matchContent + } + + const algolia = GLOBAL_CONFIG.algolia + const isAlgoliaValid = algolia.appId && algolia.apiKey && algolia.indexName + if (!isAlgoliaValid) { + return console.error('Algolia setting is invalid!') + } + + const search = instantsearch({ + indexName: algolia.indexName, + /* global algoliasearch */ + searchClient: algoliasearch(algolia.appId, algolia.apiKey), + searchFunction (helper) { + helper.state.query && helper.search() + } + }) + + const configure = instantsearch.widgets.configure({ + hitsPerPage: 5 + }) + + const searchBox = instantsearch.widgets.searchBox({ + container: '#algolia-search-input', + showReset: false, + showSubmit: false, + placeholder: GLOBAL_CONFIG.algolia.languages.input_placeholder, + showLoadingIndicator: true + }) + + const hits = instantsearch.widgets.hits({ + container: '#algolia-hits', + templates: { + item (data) { + const link = data.permalink ? data.permalink : (GLOBAL_CONFIG.root + data.path) + const result = data._highlightResult + const content = result.contentStripTruncate + ? cutContent(result.contentStripTruncate.value) + : result.contentStrip + ? cutContent(result.contentStrip.value) + : result.content + ? cutContent(result.content.value) + : '' + return ` + + ${result.title.value || 'no-title'} +

    ${content}

    +
    ` + }, + empty: function (data) { + return ( + '
    ' + + GLOBAL_CONFIG.algolia.languages.hits_empty.replace(/\$\{query}/, data.query) + + '
    ' + ) + } + } + }) + + const stats = instantsearch.widgets.stats({ + container: '#algolia-info > .algolia-stats', + templates: { + text: function (data) { + const stats = GLOBAL_CONFIG.algolia.languages.hits_stats + .replace(/\$\{hits}/, data.nbHits) + .replace(/\$\{time}/, data.processingTimeMS) + return ( + `
    ${stats}` + ) + } + } + }) + + const powerBy = instantsearch.widgets.poweredBy({ + container: '#algolia-info > .algolia-poweredBy' + }) + + const pagination = instantsearch.widgets.pagination({ + container: '#algolia-pagination', + totalPages: 5, + templates: { + first: '', + last: '', + previous: '', + next: '' + } + }) + + search.addWidgets([configure, searchBox, hits, stats, powerBy, pagination]) // add the widgets to the instantsearch instance + + search.start() + + searchClickFn() + searchFnOnce() + + window.addEventListener('pjax:complete', () => { + !btf.isHidden($searchMask) && closeSearch() + searchClickFn() + }) + + window.pjax && search.on('render', () => { + window.pjax.refresh(document.getElementById('algolia-hits')) + }) +}) diff --git a/js/search/local-search.js b/js/search/local-search.js new file mode 100644 index 0000000..73dfe6b --- /dev/null +++ b/js/search/local-search.js @@ -0,0 +1,360 @@ +/** + * Refer to hexo-generator-searchdb + * https://github.com/next-theme/hexo-generator-searchdb/blob/main/dist/search.js + * Modified by hexo-theme-butterfly + */ + +class LocalSearch { + constructor ({ + path = '', + unescape = false, + top_n_per_article = 1 + }) { + this.path = path + this.unescape = unescape + this.top_n_per_article = top_n_per_article + this.isfetched = false + this.datas = null + } + + getIndexByWord (words, text, caseSensitive = false) { + const index = [] + const included = new Set() + + if (!caseSensitive) { + text = text.toLowerCase() + } + words.forEach(word => { + if (this.unescape) { + const div = document.createElement('div') + div.innerText = word + word = div.innerHTML + } + const wordLen = word.length + if (wordLen === 0) return + let startPosition = 0 + let position = -1 + if (!caseSensitive) { + word = word.toLowerCase() + } + while ((position = text.indexOf(word, startPosition)) > -1) { + index.push({ position, word }) + included.add(word) + startPosition = position + wordLen + } + }) + // Sort index by position of keyword + index.sort((left, right) => { + if (left.position !== right.position) { + return left.position - right.position + } + return right.word.length - left.word.length + }) + return [index, included] + } + + // Merge hits into slices + mergeIntoSlice (start, end, index) { + let item = index[0] + let { position, word } = item + const hits = [] + const count = new Set() + while (position + word.length <= end && index.length !== 0) { + count.add(word) + hits.push({ + position, + length: word.length + }) + const wordEnd = position + word.length + + // Move to next position of hit + index.shift() + while (index.length !== 0) { + item = index[0] + position = item.position + word = item.word + if (wordEnd > position) { + index.shift() + } else { + break + } + } + } + return { + hits, + start, + end, + count: count.size + } + } + + // Highlight title and content + highlightKeyword (val, slice) { + let result = '' + let index = slice.start + for (const { position, length } of slice.hits) { + result += val.substring(index, position) + index = position + length + result += `${val.substr(position, length)}` + } + result += val.substring(index, slice.end) + return result + } + + getResultItems (keywords) { + const resultItems = [] + this.datas.forEach(({ title, content, url }) => { + // The number of different keywords included in the article. + const [indexOfTitle, keysOfTitle] = this.getIndexByWord(keywords, title) + const [indexOfContent, keysOfContent] = this.getIndexByWord(keywords, content) + const includedCount = new Set([...keysOfTitle, ...keysOfContent]).size + + // Show search results + const hitCount = indexOfTitle.length + indexOfContent.length + if (hitCount === 0) return + + const slicesOfTitle = [] + if (indexOfTitle.length !== 0) { + slicesOfTitle.push(this.mergeIntoSlice(0, title.length, indexOfTitle)) + } + + let slicesOfContent = [] + while (indexOfContent.length !== 0) { + const item = indexOfContent[0] + const { position } = item + // Cut out 120 characters. The maxlength of .search-input is 80. + const start = Math.max(0, position - 20) + const end = Math.min(content.length, position + 100) + slicesOfContent.push(this.mergeIntoSlice(start, end, indexOfContent)) + } + + // Sort slices in content by included keywords' count and hits' count + slicesOfContent.sort((left, right) => { + if (left.count !== right.count) { + return right.count - left.count + } else if (left.hits.length !== right.hits.length) { + return right.hits.length - left.hits.length + } + return left.start - right.start + }) + + // Select top N slices in content + const upperBound = parseInt(this.top_n_per_article, 10) + if (upperBound >= 0) { + slicesOfContent = slicesOfContent.slice(0, upperBound) + } + + let resultItem = '' + + url = new URL(url, location.origin) + url.searchParams.append('highlight', keywords.join(' ')) + + if (slicesOfTitle.length !== 0) { + resultItem += `
    ${this.highlightKeyword(title, slicesOfTitle[0])}` + } else { + resultItem += `' + resultItems.push({ + item: resultItem, + id: resultItems.length, + hitCount, + includedCount + }) + }) + return resultItems + } + + fetchData () { + const isXml = !this.path.endsWith('json') + fetch(this.path) + .then(response => response.text()) + .then(res => { + // Get the contents from search data + this.isfetched = true + this.datas = isXml + ? [...new DOMParser().parseFromString(res, 'text/xml').querySelectorAll('entry')].map(element => ({ + title: element.querySelector('title').textContent, + content: element.querySelector('content').textContent, + url: element.querySelector('url').textContent + })) + : JSON.parse(res) + // Only match articles with non-empty titles + this.datas = this.datas.filter(data => data.title).map(data => { + data.title = data.title.trim() + data.content = data.content ? data.content.trim().replace(/<[^>]+>/g, '') : '' + data.url = decodeURIComponent(data.url).replace(/\/{2,}/g, '/') + return data + }) + // Remove loading animation + window.dispatchEvent(new Event('search:loaded')) + }) + } + + // Highlight by wrapping node in mark elements with the given class name + highlightText (node, slice, className) { + const val = node.nodeValue + let index = slice.start + const children = [] + for (const { position, length } of slice.hits) { + const text = document.createTextNode(val.substring(index, position)) + index = position + length + const mark = document.createElement('mark') + mark.className = className + mark.appendChild(document.createTextNode(val.substr(position, length))) + children.push(text, mark) + } + node.nodeValue = val.substring(index, slice.end) + children.forEach(element => { + node.parentNode.insertBefore(element, node) + }) + } + + // Highlight the search words provided in the url in the text + highlightSearchWords (body) { + const params = new URL(location.href).searchParams.get('highlight') + const keywords = params ? params.split(' ') : [] + if (!keywords.length || !body) return + const walk = document.createTreeWalker(body, NodeFilter.SHOW_TEXT, null) + const allNodes = [] + while (walk.nextNode()) { + if (!walk.currentNode.parentNode.matches('button, select, textarea, .mermaid')) allNodes.push(walk.currentNode) + } + allNodes.forEach(node => { + const [indexOfNode] = this.getIndexByWord(keywords, node.nodeValue) + if (!indexOfNode.length) return + const slice = this.mergeIntoSlice(0, node.nodeValue.length, indexOfNode) + this.highlightText(node, slice, 'search-keyword') + }) + } +} + +window.addEventListener('load', () => { +// Search + const { path, top_n_per_article, unescape, languages } = GLOBAL_CONFIG.localSearch + const localSearch = new LocalSearch({ + path, + top_n_per_article, + unescape + }) + + const input = document.querySelector('#local-search-input input') + const statsItem = document.getElementById('local-search-stats-wrap') + const $loadingStatus = document.getElementById('loading-status') + + const inputEventFunction = () => { + if (!localSearch.isfetched) return + const searchText = input.value.trim().toLowerCase() + if (searchText !== '') $loadingStatus.innerHTML = '' + const keywords = searchText.split(/[-\s]+/) + const container = document.getElementById('local-search-results') + let resultItems = [] + if (searchText.length > 0) { + // Perform local searching + resultItems = localSearch.getResultItems(keywords) + } + if (keywords.length === 1 && keywords[0] === '') { + container.classList.add('no-result') + container.textContent = '' + } else if (resultItems.length === 0) { + container.textContent = '' + statsItem.innerHTML = `
    ${languages.hits_empty.replace(/\$\{query}/, searchText)}
    ` + } else { + resultItems.sort((left, right) => { + if (left.includedCount !== right.includedCount) { + return right.includedCount - left.includedCount + } else if (left.hitCount !== right.hitCount) { + return right.hitCount - left.hitCount + } + return right.id - left.id + }) + + const stats = languages.hits_stats.replace(/\$\{hits}/, resultItems.length) + + container.classList.remove('no-result') + container.innerHTML = `
    ${resultItems.map(result => result.item).join('')}
    ` + statsItem.innerHTML = `
    ${stats}
    ` + window.pjax && window.pjax.refresh(container) + } + + $loadingStatus.innerHTML = '' + } + + let loadFlag = false + const $searchMask = document.getElementById('search-mask') + const $searchDialog = document.querySelector('#local-search .search-dialog') + + // fix safari + const fixSafariHeight = () => { + if (window.innerWidth < 768) { + $searchDialog.style.setProperty('--search-height', window.innerHeight + 'px') + } + } + + const openSearch = () => { + const bodyStyle = document.body.style + bodyStyle.width = '100%' + bodyStyle.overflow = 'hidden' + btf.animateIn($searchMask, 'to_show 0.5s') + btf.animateIn($searchDialog, 'titleScale 0.5s') + setTimeout(() => { input.focus() }, 300) + if (!loadFlag) { + !localSearch.isfetched && localSearch.fetchData() + input.addEventListener('input', inputEventFunction) + loadFlag = true + } + // shortcut: ESC + document.addEventListener('keydown', function f (event) { + if (event.code === 'Escape') { + closeSearch() + document.removeEventListener('keydown', f) + } + }) + + fixSafariHeight() + window.addEventListener('resize', fixSafariHeight) + } + + const closeSearch = () => { + const bodyStyle = document.body.style + bodyStyle.width = '' + bodyStyle.overflow = '' + btf.animateOut($searchDialog, 'search_close .5s') + btf.animateOut($searchMask, 'to_hide 0.5s') + window.removeEventListener('resize', fixSafariHeight) + } + + const searchClickFn = () => { + document.querySelector('#search-button > .search').addEventListener('click', openSearch) + } + + const searchFnOnce = () => { + document.querySelector('#local-search .search-close-button').addEventListener('click', closeSearch) + $searchMask.addEventListener('click', closeSearch) + if (GLOBAL_CONFIG.localSearch.preload) { + localSearch.fetchData() + } + localSearch.highlightSearchWords(document.getElementById('article-container')) + } + + window.addEventListener('search:loaded', () => { + const $loadDataItem = document.getElementById('loading-database') + $loadDataItem.nextElementSibling.style.display = 'block' + $loadDataItem.remove() + }) + + searchClickFn() + searchFnOnce() + + // pjax + window.addEventListener('pjax:complete', () => { + !btf.isHidden($searchMask) && closeSearch() + localSearch.highlightSearchWords(document.getElementById('article-container')) + searchClickFn() + }) +}) diff --git a/js/tw_cn.js b/js/tw_cn.js new file mode 100644 index 0000000..cfff352 --- /dev/null +++ b/js/tw_cn.js @@ -0,0 +1,119 @@ +document.addEventListener('DOMContentLoaded', function () { + const translate = GLOBAL_CONFIG.translate + const snackbarData = GLOBAL_CONFIG.Snackbar + const defaultEncoding = translate.defaultEncoding // 網站默認語言,1: 繁體中文, 2: 簡體中文 + const translateDelay = translate.translateDelay // 延遲時間,若不在前, 要設定延遲翻譯時間, 如100表示100ms,默認為0 + const msgToTraditionalChinese = translate.msgToTraditionalChinese // 此處可以更改為你想要顯示的文字 + const msgToSimplifiedChinese = translate.msgToSimplifiedChinese // 同上,但兩處均不建議更改 + let currentEncoding = defaultEncoding + const targetEncodingCookie = 'translate-chn-cht' + let targetEncoding = + saveToLocal.get(targetEncodingCookie) === undefined + ? defaultEncoding + : Number(saveToLocal.get('translate-chn-cht')) + let translateButtonObject + const isSnackbar = GLOBAL_CONFIG.Snackbar !== undefined + + function setLang () { + document.documentElement.lang = targetEncoding === 1 ? 'zh-TW' : 'zh-CN' + } + + function translateText (txt) { + if (txt === '' || txt == null) return '' + if (currentEncoding === 1 && targetEncoding === 2) return Simplized(txt) + else if (currentEncoding === 2 && targetEncoding === 1) { + return Traditionalized(txt) + } else return txt + } + function translateBody (fobj) { + let objs + if (typeof fobj === 'object') objs = fobj.childNodes + else objs = document.body.childNodes + for (let i = 0; i < objs.length; i++) { + const obj = objs.item(i) + if ( + '||BR|HR|'.indexOf('|' + obj.tagName + '|') > 0 || + obj === translateButtonObject + ) { + continue + } + if (obj.title !== '' && obj.title != null) { + obj.title = translateText(obj.title) + } + if (obj.alt !== '' && obj.alt != null) obj.alt = translateText(obj.alt) + if (obj.placeholder !== '' && obj.placeholder != null) { obj.placeholder = translateText(obj.placeholder) } + if ( + obj.tagName === 'INPUT' && + obj.value !== '' && + obj.type !== 'text' && + obj.type !== 'hidden' + ) { + obj.value = translateText(obj.value) + } + if (obj.nodeType === 3) obj.data = translateText(obj.data) + else translateBody(obj) + } + } + function translatePage () { + if (targetEncoding === 1) { + currentEncoding = 1 + targetEncoding = 2 + translateButtonObject.innerHTML = msgToTraditionalChinese + isSnackbar && btf.snackbarShow(snackbarData.cht_to_chs) + } else if (targetEncoding === 2) { + currentEncoding = 2 + targetEncoding = 1 + translateButtonObject.innerHTML = msgToSimplifiedChinese + isSnackbar && btf.snackbarShow(snackbarData.chs_to_cht) + } + saveToLocal.set(targetEncodingCookie, targetEncoding, 2) + setLang() + translateBody() + } + + function JTPYStr () { + return '万与丑专业丛东丝丢两严丧个丬丰临为丽举么义乌乐乔习乡书买乱争于亏云亘亚产亩亲亵亸亿仅从仑仓仪们价众优伙会伛伞伟传伤伥伦伧伪伫体余佣佥侠侣侥侦侧侨侩侪侬俣俦俨俩俪俭债倾偬偻偾偿傥傧储傩儿兑兖党兰关兴兹养兽冁内冈册写军农冢冯冲决况冻净凄凉凌减凑凛几凤凫凭凯击凼凿刍划刘则刚创删别刬刭刽刿剀剂剐剑剥剧劝办务劢动励劲劳势勋勐勚匀匦匮区医华协单卖卢卤卧卫却卺厂厅历厉压厌厍厕厢厣厦厨厩厮县参叆叇双发变叙叠叶号叹叽吁后吓吕吗吣吨听启吴呒呓呕呖呗员呙呛呜咏咔咙咛咝咤咴咸哌响哑哒哓哔哕哗哙哜哝哟唛唝唠唡唢唣唤唿啧啬啭啮啰啴啸喷喽喾嗫呵嗳嘘嘤嘱噜噼嚣嚯团园囱围囵国图圆圣圹场坂坏块坚坛坜坝坞坟坠垄垅垆垒垦垧垩垫垭垯垱垲垴埘埙埚埝埯堑堕塆墙壮声壳壶壸处备复够头夸夹夺奁奂奋奖奥妆妇妈妩妪妫姗姜娄娅娆娇娈娱娲娴婳婴婵婶媪嫒嫔嫱嬷孙学孪宁宝实宠审宪宫宽宾寝对寻导寿将尔尘尧尴尸尽层屃屉届属屡屦屿岁岂岖岗岘岙岚岛岭岳岽岿峃峄峡峣峤峥峦崂崃崄崭嵘嵚嵛嵝嵴巅巩巯币帅师帏帐帘帜带帧帮帱帻帼幂幞干并广庄庆庐庑库应庙庞废庼廪开异弃张弥弪弯弹强归当录彟彦彻径徕御忆忏忧忾怀态怂怃怄怅怆怜总怼怿恋恳恶恸恹恺恻恼恽悦悫悬悭悯惊惧惨惩惫惬惭惮惯愍愠愤愦愿慑慭憷懑懒懔戆戋戏戗战戬户扎扑扦执扩扪扫扬扰抚抛抟抠抡抢护报担拟拢拣拥拦拧拨择挂挚挛挜挝挞挟挠挡挢挣挤挥挦捞损捡换捣据捻掳掴掷掸掺掼揸揽揿搀搁搂搅携摄摅摆摇摈摊撄撑撵撷撸撺擞攒敌敛数斋斓斗斩断无旧时旷旸昙昼昽显晋晒晓晔晕晖暂暧札术朴机杀杂权条来杨杩杰极构枞枢枣枥枧枨枪枫枭柜柠柽栀栅标栈栉栊栋栌栎栏树栖样栾桊桠桡桢档桤桥桦桧桨桩梦梼梾检棂椁椟椠椤椭楼榄榇榈榉槚槛槟槠横樯樱橥橱橹橼檐檩欢欤欧歼殁殇残殒殓殚殡殴毁毂毕毙毡毵氇气氢氩氲汇汉污汤汹沓沟没沣沤沥沦沧沨沩沪沵泞泪泶泷泸泺泻泼泽泾洁洒洼浃浅浆浇浈浉浊测浍济浏浐浑浒浓浔浕涂涌涛涝涞涟涠涡涢涣涤润涧涨涩淀渊渌渍渎渐渑渔渖渗温游湾湿溃溅溆溇滗滚滞滟滠满滢滤滥滦滨滩滪漤潆潇潋潍潜潴澜濑濒灏灭灯灵灾灿炀炉炖炜炝点炼炽烁烂烃烛烟烦烧烨烩烫烬热焕焖焘煅煳熘爱爷牍牦牵牺犊犟状犷犸犹狈狍狝狞独狭狮狯狰狱狲猃猎猕猡猪猫猬献獭玑玙玚玛玮环现玱玺珉珏珐珑珰珲琎琏琐琼瑶瑷璇璎瓒瓮瓯电画畅畲畴疖疗疟疠疡疬疮疯疱疴痈痉痒痖痨痪痫痴瘅瘆瘗瘘瘪瘫瘾瘿癞癣癫癯皑皱皲盏盐监盖盗盘眍眦眬着睁睐睑瞒瞩矫矶矾矿砀码砖砗砚砜砺砻砾础硁硅硕硖硗硙硚确硷碍碛碜碱碹磙礼祎祢祯祷祸禀禄禅离秃秆种积称秽秾稆税稣稳穑穷窃窍窑窜窝窥窦窭竖竞笃笋笔笕笺笼笾筑筚筛筜筝筹签简箓箦箧箨箩箪箫篑篓篮篱簖籁籴类籼粜粝粤粪粮糁糇紧絷纟纠纡红纣纤纥约级纨纩纪纫纬纭纮纯纰纱纲纳纴纵纶纷纸纹纺纻纼纽纾线绀绁绂练组绅细织终绉绊绋绌绍绎经绐绑绒结绔绕绖绗绘给绚绛络绝绞统绠绡绢绣绤绥绦继绨绩绪绫绬续绮绯绰绱绲绳维绵绶绷绸绹绺绻综绽绾绿缀缁缂缃缄缅缆缇缈缉缊缋缌缍缎缏缐缑缒缓缔缕编缗缘缙缚缛缜缝缞缟缠缡缢缣缤缥缦缧缨缩缪缫缬缭缮缯缰缱缲缳缴缵罂网罗罚罢罴羁羟羡翘翙翚耢耧耸耻聂聋职聍联聩聪肃肠肤肷肾肿胀胁胆胜胧胨胪胫胶脉脍脏脐脑脓脔脚脱脶脸腊腌腘腭腻腼腽腾膑臜舆舣舰舱舻艰艳艹艺节芈芗芜芦苁苇苈苋苌苍苎苏苘苹茎茏茑茔茕茧荆荐荙荚荛荜荞荟荠荡荣荤荥荦荧荨荩荪荫荬荭荮药莅莜莱莲莳莴莶获莸莹莺莼萚萝萤营萦萧萨葱蒇蒉蒋蒌蓝蓟蓠蓣蓥蓦蔷蔹蔺蔼蕲蕴薮藁藓虏虑虚虫虬虮虽虾虿蚀蚁蚂蚕蚝蚬蛊蛎蛏蛮蛰蛱蛲蛳蛴蜕蜗蜡蝇蝈蝉蝎蝼蝾螀螨蟏衅衔补衬衮袄袅袆袜袭袯装裆裈裢裣裤裥褛褴襁襕见观觃规觅视觇览觉觊觋觌觍觎觏觐觑觞触觯詟誉誊讠计订讣认讥讦讧讨让讪讫训议讯记讱讲讳讴讵讶讷许讹论讻讼讽设访诀证诂诃评诅识诇诈诉诊诋诌词诎诏诐译诒诓诔试诖诗诘诙诚诛诜话诞诟诠诡询诣诤该详诧诨诩诪诫诬语诮误诰诱诲诳说诵诶请诸诹诺读诼诽课诿谀谁谂调谄谅谆谇谈谊谋谌谍谎谏谐谑谒谓谔谕谖谗谘谙谚谛谜谝谞谟谠谡谢谣谤谥谦谧谨谩谪谫谬谭谮谯谰谱谲谳谴谵谶谷豮贝贞负贠贡财责贤败账货质贩贪贫贬购贮贯贰贱贲贳贴贵贶贷贸费贺贻贼贽贾贿赀赁赂赃资赅赆赇赈赉赊赋赌赍赎赏赐赑赒赓赔赕赖赗赘赙赚赛赜赝赞赟赠赡赢赣赪赵赶趋趱趸跃跄跖跞践跶跷跸跹跻踊踌踪踬踯蹑蹒蹰蹿躏躜躯车轧轨轩轪轫转轭轮软轰轱轲轳轴轵轶轷轸轹轺轻轼载轾轿辀辁辂较辄辅辆辇辈辉辊辋辌辍辎辏辐辑辒输辔辕辖辗辘辙辚辞辩辫边辽达迁过迈运还这进远违连迟迩迳迹适选逊递逦逻遗遥邓邝邬邮邹邺邻郁郄郏郐郑郓郦郧郸酝酦酱酽酾酿释里鉅鉴銮錾钆钇针钉钊钋钌钍钎钏钐钑钒钓钔钕钖钗钘钙钚钛钝钞钟钠钡钢钣钤钥钦钧钨钩钪钫钬钭钮钯钰钱钲钳钴钵钶钷钸钹钺钻钼钽钾钿铀铁铂铃铄铅铆铈铉铊铋铍铎铏铐铑铒铕铗铘铙铚铛铜铝铞铟铠铡铢铣铤铥铦铧铨铪铫铬铭铮铯铰铱铲铳铴铵银铷铸铹铺铻铼铽链铿销锁锂锃锄锅锆锇锈锉锊锋锌锍锎锏锐锑锒锓锔锕锖锗错锚锜锞锟锠锡锢锣锤锥锦锨锩锫锬锭键锯锰锱锲锳锴锵锶锷锸锹锺锻锼锽锾锿镀镁镂镃镆镇镈镉镊镌镍镎镏镐镑镒镕镖镗镙镚镛镜镝镞镟镠镡镢镣镤镥镦镧镨镩镪镫镬镭镮镯镰镱镲镳镴镶长门闩闪闫闬闭问闯闰闱闲闳间闵闶闷闸闹闺闻闼闽闾闿阀阁阂阃阄阅阆阇阈阉阊阋阌阍阎阏阐阑阒阓阔阕阖阗阘阙阚阛队阳阴阵阶际陆陇陈陉陕陧陨险随隐隶隽难雏雠雳雾霁霉霭靓静靥鞑鞒鞯鞴韦韧韨韩韪韫韬韵页顶顷顸项顺须顼顽顾顿颀颁颂颃预颅领颇颈颉颊颋颌颍颎颏颐频颒颓颔颕颖颗题颙颚颛颜额颞颟颠颡颢颣颤颥颦颧风飏飐飑飒飓飔飕飖飗飘飙飚飞飨餍饤饥饦饧饨饩饪饫饬饭饮饯饰饱饲饳饴饵饶饷饸饹饺饻饼饽饾饿馀馁馂馃馄馅馆馇馈馉馊馋馌馍馎馏馐馑馒馓馔馕马驭驮驯驰驱驲驳驴驵驶驷驸驹驺驻驼驽驾驿骀骁骂骃骄骅骆骇骈骉骊骋验骍骎骏骐骑骒骓骔骕骖骗骘骙骚骛骜骝骞骟骠骡骢骣骤骥骦骧髅髋髌鬓魇魉鱼鱽鱾鱿鲀鲁鲂鲄鲅鲆鲇鲈鲉鲊鲋鲌鲍鲎鲏鲐鲑鲒鲓鲔鲕鲖鲗鲘鲙鲚鲛鲜鲝鲞鲟鲠鲡鲢鲣鲤鲥鲦鲧鲨鲩鲪鲫鲬鲭鲮鲯鲰鲱鲲鲳鲴鲵鲶鲷鲸鲹鲺鲻鲼鲽鲾鲿鳀鳁鳂鳃鳄鳅鳆鳇鳈鳉鳊鳋鳌鳍鳎鳏鳐鳑鳒鳓鳔鳕鳖鳗鳘鳙鳛鳜鳝鳞鳟鳠鳡鳢鳣鸟鸠鸡鸢鸣鸤鸥鸦鸧鸨鸩鸪鸫鸬鸭鸮鸯鸰鸱鸲鸳鸴鸵鸶鸷鸸鸹鸺鸻鸼鸽鸾鸿鹀鹁鹂鹃鹄鹅鹆鹇鹈鹉鹊鹋鹌鹍鹎鹏鹐鹑鹒鹓鹔鹕鹖鹗鹘鹚鹛鹜鹝鹞鹟鹠鹡鹢鹣鹤鹥鹦鹧鹨鹩鹪鹫鹬鹭鹯鹰鹱鹲鹳鹴鹾麦麸黄黉黡黩黪黾龙历志制一台皋准复猛钟注范签' + } + function FTPYStr () { + return '萬與醜專業叢東絲丟兩嚴喪個爿豐臨為麗舉麼義烏樂喬習鄉書買亂爭於虧雲亙亞產畝親褻嚲億僅從侖倉儀們價眾優夥會傴傘偉傳傷倀倫傖偽佇體餘傭僉俠侶僥偵側僑儈儕儂俁儔儼倆儷儉債傾傯僂僨償儻儐儲儺兒兌兗黨蘭關興茲養獸囅內岡冊寫軍農塚馮衝決況凍淨淒涼淩減湊凜幾鳳鳧憑凱擊氹鑿芻劃劉則剛創刪別剗剄劊劌剴劑剮劍剝劇勸辦務勱動勵勁勞勢勳猛勩勻匭匱區醫華協單賣盧鹵臥衛卻巹廠廳曆厲壓厭厙廁廂厴廈廚廄廝縣參靉靆雙發變敘疊葉號歎嘰籲後嚇呂嗎唚噸聽啟吳嘸囈嘔嚦唄員咼嗆嗚詠哢嚨嚀噝吒噅鹹呱響啞噠嘵嗶噦嘩噲嚌噥喲嘜嗊嘮啢嗩唕喚呼嘖嗇囀齧囉嘽嘯噴嘍嚳囁嗬噯噓嚶囑嚕劈囂謔團園囪圍圇國圖圓聖壙場阪壞塊堅壇壢壩塢墳墜壟壟壚壘墾坰堊墊埡墶壋塏堖塒塤堝墊垵塹墮壪牆壯聲殼壺壼處備複夠頭誇夾奪奩奐奮獎奧妝婦媽嫵嫗媯姍薑婁婭嬈嬌孌娛媧嫻嫿嬰嬋嬸媼嬡嬪嬙嬤孫學孿寧寶實寵審憲宮寬賓寢對尋導壽將爾塵堯尷屍盡層屭屜屆屬屢屨嶼歲豈嶇崗峴嶴嵐島嶺嶽崠巋嶨嶧峽嶢嶠崢巒嶗崍嶮嶄嶸嶔崳嶁脊巔鞏巰幣帥師幃帳簾幟帶幀幫幬幘幗冪襆幹並廣莊慶廬廡庫應廟龐廢廎廩開異棄張彌弳彎彈強歸當錄彠彥徹徑徠禦憶懺憂愾懷態慫憮慪悵愴憐總懟懌戀懇惡慟懨愷惻惱惲悅愨懸慳憫驚懼慘懲憊愜慚憚慣湣慍憤憒願懾憖怵懣懶懍戇戔戲戧戰戩戶紮撲扡執擴捫掃揚擾撫拋摶摳掄搶護報擔擬攏揀擁攔擰撥擇掛摯攣掗撾撻挾撓擋撟掙擠揮撏撈損撿換搗據撚擄摑擲撣摻摜摣攬撳攙擱摟攪攜攝攄擺搖擯攤攖撐攆擷擼攛擻攢敵斂數齋斕鬥斬斷無舊時曠暘曇晝曨顯晉曬曉曄暈暉暫曖劄術樸機殺雜權條來楊榪傑極構樅樞棗櫪梘棖槍楓梟櫃檸檉梔柵標棧櫛櫳棟櫨櫟欄樹棲樣欒棬椏橈楨檔榿橋樺檜槳樁夢檮棶檢欞槨櫝槧欏橢樓欖櫬櫚櫸檟檻檳櫧橫檣櫻櫫櫥櫓櫞簷檁歡歟歐殲歿殤殘殞殮殫殯毆毀轂畢斃氈毿氌氣氫氬氳彙漢汙湯洶遝溝沒灃漚瀝淪滄渢溈滬濔濘淚澩瀧瀘濼瀉潑澤涇潔灑窪浹淺漿澆湞溮濁測澮濟瀏滻渾滸濃潯濜塗湧濤澇淶漣潿渦溳渙滌潤澗漲澀澱淵淥漬瀆漸澠漁瀋滲溫遊灣濕潰濺漵漊潷滾滯灩灄滿瀅濾濫灤濱灘澦濫瀠瀟瀲濰潛瀦瀾瀨瀕灝滅燈靈災燦煬爐燉煒熗點煉熾爍爛烴燭煙煩燒燁燴燙燼熱煥燜燾煆糊溜愛爺牘犛牽犧犢強狀獷獁猶狽麅獮獰獨狹獅獪猙獄猻獫獵獼玀豬貓蝟獻獺璣璵瑒瑪瑋環現瑲璽瑉玨琺瓏璫琿璡璉瑣瓊瑤璦璿瓔瓚甕甌電畫暢佘疇癤療瘧癘瘍鬁瘡瘋皰屙癰痙癢瘂癆瘓癇癡癉瘮瘞瘺癟癱癮癭癩癬癲臒皚皺皸盞鹽監蓋盜盤瞘眥矓著睜睞瞼瞞矚矯磯礬礦碭碼磚硨硯碸礪礱礫礎硜矽碩硤磽磑礄確鹼礙磧磣堿镟滾禮禕禰禎禱禍稟祿禪離禿稈種積稱穢穠穭稅穌穩穡窮竊竅窯竄窩窺竇窶豎競篤筍筆筧箋籠籩築篳篩簹箏籌簽簡籙簀篋籜籮簞簫簣簍籃籬籪籟糴類秈糶糲粵糞糧糝餱緊縶糸糾紆紅紂纖紇約級紈纊紀紉緯紜紘純紕紗綱納紝縱綸紛紙紋紡紵紖紐紓線紺絏紱練組紳細織終縐絆紼絀紹繹經紿綁絨結絝繞絰絎繪給絢絳絡絕絞統綆綃絹繡綌綏絛繼綈績緒綾緓續綺緋綽緔緄繩維綿綬繃綢綯綹綣綜綻綰綠綴緇緙緗緘緬纜緹緲緝縕繢緦綞緞緶線緱縋緩締縷編緡緣縉縛縟縝縫縗縞纏縭縊縑繽縹縵縲纓縮繆繅纈繚繕繒韁繾繰繯繳纘罌網羅罰罷羆羈羥羨翹翽翬耮耬聳恥聶聾職聹聯聵聰肅腸膚膁腎腫脹脅膽勝朧腖臚脛膠脈膾髒臍腦膿臠腳脫腡臉臘醃膕齶膩靦膃騰臏臢輿艤艦艙艫艱豔艸藝節羋薌蕪蘆蓯葦藶莧萇蒼苧蘇檾蘋莖蘢蔦塋煢繭荊薦薘莢蕘蓽蕎薈薺蕩榮葷滎犖熒蕁藎蓀蔭蕒葒葤藥蒞蓧萊蓮蒔萵薟獲蕕瑩鶯蓴蘀蘿螢營縈蕭薩蔥蕆蕢蔣蔞藍薊蘺蕷鎣驀薔蘞藺藹蘄蘊藪槁蘚虜慮虛蟲虯蟣雖蝦蠆蝕蟻螞蠶蠔蜆蠱蠣蟶蠻蟄蛺蟯螄蠐蛻蝸蠟蠅蟈蟬蠍螻蠑螿蟎蠨釁銜補襯袞襖嫋褘襪襲襏裝襠褌褳襝褲襇褸襤繈襴見觀覎規覓視覘覽覺覬覡覿覥覦覯覲覷觴觸觶讋譽謄訁計訂訃認譏訐訌討讓訕訖訓議訊記訒講諱謳詎訝訥許訛論訩訟諷設訪訣證詁訶評詛識詗詐訴診詆謅詞詘詔詖譯詒誆誄試詿詩詰詼誠誅詵話誕詬詮詭詢詣諍該詳詫諢詡譸誡誣語誚誤誥誘誨誑說誦誒請諸諏諾讀諑誹課諉諛誰諗調諂諒諄誶談誼謀諶諜謊諫諧謔謁謂諤諭諼讒諮諳諺諦謎諞諝謨讜謖謝謠謗諡謙謐謹謾謫譾謬譚譖譙讕譜譎讞譴譫讖穀豶貝貞負貟貢財責賢敗賬貨質販貪貧貶購貯貫貳賤賁貰貼貴貺貸貿費賀貽賊贄賈賄貲賃賂贓資賅贐賕賑賚賒賦賭齎贖賞賜贔賙賡賠賧賴賵贅賻賺賽賾贗讚贇贈贍贏贛赬趙趕趨趲躉躍蹌蹠躒踐躂蹺蹕躚躋踴躊蹤躓躑躡蹣躕躥躪躦軀車軋軌軒軑軔轉軛輪軟轟軲軻轤軸軹軼軤軫轢軺輕軾載輊轎輈輇輅較輒輔輛輦輩輝輥輞輬輟輜輳輻輯轀輸轡轅轄輾轆轍轔辭辯辮邊遼達遷過邁運還這進遠違連遲邇逕跡適選遜遞邐邏遺遙鄧鄺鄔郵鄒鄴鄰鬱郤郟鄶鄭鄆酈鄖鄲醞醱醬釅釃釀釋裏钜鑒鑾鏨釓釔針釘釗釙釕釷釺釧釤鈒釩釣鍆釹鍚釵鈃鈣鈈鈦鈍鈔鍾鈉鋇鋼鈑鈐鑰欽鈞鎢鉤鈧鈁鈥鈄鈕鈀鈺錢鉦鉗鈷缽鈳鉕鈽鈸鉞鑽鉬鉭鉀鈿鈾鐵鉑鈴鑠鉛鉚鈰鉉鉈鉍鈹鐸鉶銬銠鉺銪鋏鋣鐃銍鐺銅鋁銱銦鎧鍘銖銑鋌銩銛鏵銓鉿銚鉻銘錚銫鉸銥鏟銃鐋銨銀銣鑄鐒鋪鋙錸鋱鏈鏗銷鎖鋰鋥鋤鍋鋯鋨鏽銼鋝鋒鋅鋶鐦鐧銳銻鋃鋟鋦錒錆鍺錯錨錡錁錕錩錫錮鑼錘錐錦鍁錈錇錟錠鍵鋸錳錙鍥鍈鍇鏘鍶鍔鍤鍬鍾鍛鎪鍠鍰鎄鍍鎂鏤鎡鏌鎮鎛鎘鑷鐫鎳鎿鎦鎬鎊鎰鎔鏢鏜鏍鏰鏞鏡鏑鏃鏇鏐鐔钁鐐鏷鑥鐓鑭鐠鑹鏹鐙鑊鐳鐶鐲鐮鐿鑔鑣鑞鑲長門閂閃閆閈閉問闖閏闈閑閎間閔閌悶閘鬧閨聞闥閩閭闓閥閣閡閫鬮閱閬闍閾閹閶鬩閿閽閻閼闡闌闃闠闊闋闔闐闒闕闞闤隊陽陰陣階際陸隴陳陘陝隉隕險隨隱隸雋難雛讎靂霧霽黴靄靚靜靨韃鞽韉韝韋韌韍韓韙韞韜韻頁頂頃頇項順須頊頑顧頓頎頒頌頏預顱領頗頸頡頰頲頜潁熲頦頤頻頮頹頷頴穎顆題顒顎顓顏額顳顢顛顙顥纇顫顬顰顴風颺颭颮颯颶颸颼颻飀飄飆飆飛饗饜飣饑飥餳飩餼飪飫飭飯飲餞飾飽飼飿飴餌饒餉餄餎餃餏餅餑餖餓餘餒餕餜餛餡館餷饋餶餿饞饁饃餺餾饈饉饅饊饌饢馬馭馱馴馳驅馹駁驢駔駛駟駙駒騶駐駝駑駕驛駘驍罵駰驕驊駱駭駢驫驪騁驗騂駸駿騏騎騍騅騌驌驂騙騭騤騷騖驁騮騫騸驃騾驄驏驟驥驦驤髏髖髕鬢魘魎魚魛魢魷魨魯魴魺鮁鮃鯰鱸鮋鮓鮒鮊鮑鱟鮍鮐鮭鮚鮳鮪鮞鮦鰂鮜鱠鱭鮫鮮鮺鯗鱘鯁鱺鰱鰹鯉鰣鰷鯀鯊鯇鮶鯽鯒鯖鯪鯕鯫鯡鯤鯧鯝鯢鯰鯛鯨鯵鯴鯔鱝鰈鰏鱨鯷鰮鰃鰓鱷鰍鰒鰉鰁鱂鯿鰠鼇鰭鰨鰥鰩鰟鰜鰳鰾鱈鱉鰻鰵鱅鰼鱖鱔鱗鱒鱯鱤鱧鱣鳥鳩雞鳶鳴鳲鷗鴉鶬鴇鴆鴣鶇鸕鴨鴞鴦鴒鴟鴝鴛鴬鴕鷥鷙鴯鴰鵂鴴鵃鴿鸞鴻鵐鵓鸝鵑鵠鵝鵒鷳鵜鵡鵲鶓鵪鶤鵯鵬鵮鶉鶊鵷鷫鶘鶡鶚鶻鶿鶥鶩鷊鷂鶲鶹鶺鷁鶼鶴鷖鸚鷓鷚鷯鷦鷲鷸鷺鸇鷹鸌鸏鸛鸘鹺麥麩黃黌黶黷黲黽龍歷誌製壹臺臯準復勐鐘註範籤' + } + function Traditionalized (cc) { + let str = '' + const ss = JTPYStr() + const tt = FTPYStr() + for (let i = 0; i < cc.length; i++) { + if (cc.charCodeAt(i) > 10000 && ss.indexOf(cc.charAt(i)) !== -1) { + str += tt.charAt(ss.indexOf(cc.charAt(i))) + } else str += cc.charAt(i) + } + return str + } + function Simplized (cc) { + let str = '' + const ss = JTPYStr() + const tt = FTPYStr() + for (let i = 0; i < cc.length; i++) { + if (cc.charCodeAt(i) > 10000 && tt.indexOf(cc.charAt(i)) !== -1) { + str += ss.charAt(tt.indexOf(cc.charAt(i))) + } else str += cc.charAt(i) + } + return str + } + + function translateInitialization () { + translateButtonObject = document.getElementById('translateLink') + if (translateButtonObject) { + if (currentEncoding !== targetEncoding) { + translateButtonObject.innerHTML = + targetEncoding === 1 + ? msgToSimplifiedChinese + : msgToTraditionalChinese + setLang() + setTimeout(translateBody, translateDelay) + } + translateButtonObject.addEventListener('click', translatePage, false) + } + } + translateInitialization() + document.addEventListener('pjax:complete', translateInitialization) +}) diff --git a/js/utils.js b/js/utils.js new file mode 100644 index 0000000..b5df288 --- /dev/null +++ b/js/utils.js @@ -0,0 +1,306 @@ +const btf = { + debounce: function (func, wait, immediate) { + let timeout + return function () { + const context = this + const args = arguments + const later = function () { + timeout = null + if (!immediate) func.apply(context, args) + } + const callNow = immediate && !timeout + clearTimeout(timeout) + timeout = setTimeout(later, wait) + if (callNow) func.apply(context, args) + } + }, + + throttle: function (func, wait, options) { + let timeout, context, args + let previous = 0 + if (!options) options = {} + + const later = function () { + previous = options.leading === false ? 0 : new Date().getTime() + timeout = null + func.apply(context, args) + if (!timeout) context = args = null + } + + const throttled = function () { + const now = new Date().getTime() + if (!previous && options.leading === false) previous = now + const remaining = wait - (now - previous) + context = this + args = arguments + if (remaining <= 0 || remaining > wait) { + if (timeout) { + clearTimeout(timeout) + timeout = null + } + previous = now + func.apply(context, args) + if (!timeout) context = args = null + } else if (!timeout && options.trailing !== false) { + timeout = setTimeout(later, remaining) + } + } + + return throttled + }, + + sidebarPaddingR: () => { + const innerWidth = window.innerWidth + const clientWidth = document.body.clientWidth + const paddingRight = innerWidth - clientWidth + if (innerWidth !== clientWidth) { + document.body.style.paddingRight = paddingRight + 'px' + } + }, + + snackbarShow: (text, showAction = false, duration = 2000) => { + const { position, bgLight, bgDark } = GLOBAL_CONFIG.Snackbar + const bg = document.documentElement.getAttribute('data-theme') === 'light' ? bgLight : bgDark + Snackbar.show({ + text, + backgroundColor: bg, + showAction, + duration, + pos: position, + customClass: 'snackbar-css' + }) + }, + + diffDate: (d, more = false) => { + const dateNow = new Date() + const datePost = new Date(d) + const dateDiff = dateNow.getTime() - datePost.getTime() + const minute = 1000 * 60 + const hour = minute * 60 + const day = hour * 24 + const month = day * 30 + const { dateSuffix } = GLOBAL_CONFIG + + if (!more) return parseInt(dateDiff / day) + + const monthCount = dateDiff / month + const dayCount = dateDiff / day + const hourCount = dateDiff / hour + const minuteCount = dateDiff / minute + + if (monthCount > 12) return datePost.toISOString().slice(0, 10) + if (monthCount >= 1) return `${parseInt(monthCount)} ${dateSuffix.month}` + if (dayCount >= 1) return `${parseInt(dayCount)} ${dateSuffix.day}` + if (hourCount >= 1) return `${parseInt(hourCount)} ${dateSuffix.hour}` + if (minuteCount >= 1) return `${parseInt(minuteCount)} ${dateSuffix.min}` + return dateSuffix.just + }, + + loadComment: (dom, callback) => { + if ('IntersectionObserver' in window) { + const observerItem = new IntersectionObserver((entries) => { + if (entries[0].isIntersecting) { + callback() + observerItem.disconnect() + } + }, { threshold: [0] }) + observerItem.observe(dom) + } else { + callback() + } + }, + + scrollToDest: (pos, time = 500) => { + const currentPos = window.pageYOffset + const isNavFixed = document.getElementById('page-header').classList.contains('fixed') + if (currentPos > pos || isNavFixed) pos = pos - 70 + + if ('scrollBehavior' in document.documentElement.style) { + window.scrollTo({ + top: pos, + behavior: 'smooth' + }) + return + } + + let start = null + pos = +pos + window.requestAnimationFrame(function step (currentTime) { + start = !start ? currentTime : start + const progress = currentTime - start + if (currentPos < pos) { + window.scrollTo(0, ((pos - currentPos) * progress / time) + currentPos) + } else { + window.scrollTo(0, currentPos - ((currentPos - pos) * progress / time)) + } + if (progress < time) { + window.requestAnimationFrame(step) + } else { + window.scrollTo(0, pos) + } + }) + }, + + animateIn: (ele, text) => { + ele.style.display = 'block' + ele.style.animation = text + }, + + animateOut: (ele, text) => { + ele.addEventListener('animationend', function f () { + ele.style.display = '' + ele.style.animation = '' + ele.removeEventListener('animationend', f) + }) + ele.style.animation = text + }, + + getParents: (elem, selector) => { + for (; elem && elem !== document; elem = elem.parentNode) { + if (elem.matches(selector)) return elem + } + return null + }, + + siblings: (ele, selector) => { + return [...ele.parentNode.children].filter((child) => { + if (selector) { + return child !== ele && child.matches(selector) + } + return child !== ele + }) + }, + + /** + * @param {*} selector + * @param {*} eleType the type of create element + * @param {*} options object key: value + */ + wrap: (selector, eleType, options) => { + const createEle = document.createElement(eleType) + for (const [key, value] of Object.entries(options)) { + createEle.setAttribute(key, value) + } + selector.parentNode.insertBefore(createEle, selector) + createEle.appendChild(selector) + }, + + unwrap: el => { + const elParentNode = el.parentNode + if (elParentNode !== document.body) { + elParentNode.parentNode.insertBefore(el, elParentNode) + elParentNode.parentNode.removeChild(elParentNode) + } + }, + + isHidden: ele => ele.offsetHeight === 0 && ele.offsetWidth === 0, + + getEleTop: ele => { + let actualTop = ele.offsetTop + let current = ele.offsetParent + + while (current !== null) { + actualTop += current.offsetTop + current = current.offsetParent + } + + return actualTop + }, + + loadLightbox: ele => { + const service = GLOBAL_CONFIG.lightbox + + if (service === 'mediumZoom') { + const zoom = mediumZoom(ele) + zoom.on('open', e => { + const photoBg = document.documentElement.getAttribute('data-theme') === 'dark' ? '#121212' : '#fff' + zoom.update({ + background: photoBg + }) + }) + } + + if (service === 'fancybox') { + ele.forEach(i => { + if (i.parentNode.tagName !== 'A') { + const dataSrc = i.dataset.lazySrc || i.src + const dataCaption = i.title || i.alt || '' + btf.wrap(i, 'a', { href: dataSrc, 'data-fancybox': 'gallery', 'data-caption': dataCaption, 'data-thumb': dataSrc }) + } + }) + + if (!window.fancyboxRun) { + Fancybox.bind('[data-fancybox]', { + Hash: false, + Thumbs: { + showOnStart: false + }, + Images: { + Panzoom: { + maxScale: 4 + } + }, + Carousel: { + transition: 'slide' + }, + Toolbar: { + display: { + left: ['infobar'], + middle: [ + 'zoomIn', + 'zoomOut', + 'toggle1to1', + 'rotateCCW', + 'rotateCW', + 'flipX', + 'flipY' + ], + right: ['slideshow', 'thumbs', 'close'] + } + } + }) + window.fancyboxRun = true + } + } + }, + + initJustifiedGallery: function (selector) { + const runJustifiedGallery = i => { + if (!btf.isHidden(i)) { + fjGallery(i, { + itemSelector: '.fj-gallery-item', + rowHeight: i.getAttribute('data-rowHeight'), + gutter: 4, + onJustify: function () { + this.$container.style.opacity = '1' + } + }) + } + } + + if (Array.from(selector).length === 0) runJustifiedGallery(selector) + else selector.forEach(i => { runJustifiedGallery(i) }) + }, + + updateAnchor: (anchor) => { + if (anchor !== window.location.hash) { + if (!anchor) anchor = location.pathname + const title = GLOBAL_CONFIG_SITE.title + window.history.replaceState({ + url: location.href, + title + }, title, anchor) + } + }, + + getScrollPercent: (currentTop, ele) => { + const docHeight = ele.clientHeight + const winHeight = document.documentElement.clientHeight + const headerHeight = ele.offsetTop + const contentMath = (docHeight > winHeight) ? (docHeight - winHeight) : (document.documentElement.scrollHeight - winHeight) + const scrollPercent = (currentTop - headerHeight) / (contentMath) + const scrollPercentRounded = Math.round(scrollPercent * 100) + const percentage = (scrollPercentRounded > 100) ? 100 : (scrollPercentRounded <= 0) ? 0 : scrollPercentRounded + return percentage + } +} diff --git a/link/index.html b/link/index.html new file mode 100644 index 0000000..fbe61d4 --- /dev/null +++ b/link/index.html @@ -0,0 +1,206 @@ +友情链接 | SHYEE-PLASMA + + + + + + + + + +
    \ No newline at end of file diff --git a/movies/index.html b/movies/index.html new file mode 100644 index 0000000..81adb1c --- /dev/null +++ b/movies/index.html @@ -0,0 +1,170 @@ +movies | SHYEE-PLASMA + + + + + + + + + +
    \ No newline at end of file diff --git a/music/image.png b/music/image.png new file mode 100644 index 0000000..510226d Binary files /dev/null and b/music/image.png differ diff --git a/music/index.html b/music/index.html new file mode 100644 index 0000000..b55800e --- /dev/null +++ b/music/index.html @@ -0,0 +1,171 @@ +music | SHYEE-PLASMA + + + + + + + + + +
    \ No newline at end of file diff --git a/page/10/index.html b/page/10/index.html new file mode 100644 index 0000000..79b7570 --- /dev/null +++ b/page/10/index.html @@ -0,0 +1,294 @@ +SHYEE-PLASMA - 306 + + + + + + + +
    MyBatis系列(二.5)
    CentOS7.3安装MySQL8
    MyBatis系列(二)
    Oracle系列学习(一)
    PL/SQL
    MyBatis安装
    终于闲下来,说一说我建Blog之路
    \ No newline at end of file diff --git a/page/2/index.html b/page/2/index.html new file mode 100644 index 0000000..d2be9b2 --- /dev/null +++ b/page/2/index.html @@ -0,0 +1,294 @@ +SHYEE-PLASMA - 306 + + + + + + + +
    Modeling of profile effects for inductive helicon plasma sources
    Measurement and modeling of ion energy distribution functions in a low pressure argon plasma diffusing from a 13.56 MHz helicon source
    helicon仿真(代码)合集
    3D-VIRTUS Equilibrium condition solver of radio-frequency magnetized plasma discharges for space applications
    Helicon wave coupling to a finite plasma column
    A flowing plasma model to describe drift waves in a cylindrical helicon discharge
    等离子体物理_pyk
    普林斯顿等离子体课
    等离子体前置知识
    从零开始学习螺旋波等离子体
    \ No newline at end of file diff --git a/page/3/index.html b/page/3/index.html new file mode 100644 index 0000000..c953970 --- /dev/null +++ b/page/3/index.html @@ -0,0 +1,316 @@ +SHYEE-PLASMA - 306 + + + + + + + +
    An evaluation of different antenna designs for helicon wave excitation in a cylindrical plasma source
    20230514周总结
    如何关306的水气
    pic
    使用comsol仿真ICP
    螺旋等离子体推进器及其羽流中的波传播与吸收
    机器学习
    计算机操作系统
    Bean的作用域
    C++小tips
    \ No newline at end of file diff --git a/page/4/index.html b/page/4/index.html new file mode 100644 index 0000000..5fbd204 --- /dev/null +++ b/page/4/index.html @@ -0,0 +1,374 @@ +SHYEE-PLASMA - 306 + + + + + + + +
    Docker
    Docker常用命令
    离散数学
    视图
    计算机组成原理
    计算机操作系统(2)
    项目预算
    面向对象方法学
    Spring - MyBatis
    SSM
    \ No newline at end of file diff --git a/page/5/index.html b/page/5/index.html new file mode 100644 index 0000000..b9e6784 --- /dev/null +++ b/page/5/index.html @@ -0,0 +1,294 @@ +SHYEE-PLASMA - 306 + + + + + + + +
    Spring web 开发
    Spring
    SpringMVC
    Springboot
    Spring 入门
    Spring注解开发
    Queue
    Redis
    需求分析
    Golang
    \ No newline at end of file diff --git a/page/6/index.html b/page/6/index.html new file mode 100644 index 0000000..a50e91b --- /dev/null +++ b/page/6/index.html @@ -0,0 +1,300 @@ +SHYEE-PLASMA - 306 + + + + + + + +
    eclipse如何配置Spring
    MyBatis(八)
    MySQL进阶
    MyBatis系列
    MyBatis进阶小练习
    mysql的一点东西
    Oracle系列学习(五)
    获得管理层许可及挑选团队队员
    Oracle系列学习(四)
    MyBatis系列(七)
    \ No newline at end of file diff --git a/page/7/index.html b/page/7/index.html new file mode 100644 index 0000000..c937ec8 --- /dev/null +++ b/page/7/index.html @@ -0,0 +1,324 @@ +SHYEE-PLASMA - 306 + + + + + + + +
    MyBatis系列(六)
    需求分析学习笔记-1
    Heliogabalus的玫瑰
    Stack
    关于安装MyBatis
    写出这个数
    单BSS实验
    单交换机小实验
    工作分解结构
    备份与恢复
    \ No newline at end of file diff --git a/page/8/index.html b/page/8/index.html new file mode 100644 index 0000000..46b4ea7 --- /dev/null +++ b/page/8/index.html @@ -0,0 +1,296 @@ +SHYEE-PLASMA - 306 + + + + + + + +
    LinearTable-6
    LinearTable-5
    Oracle系列学习(三)
    LinearTable-4
    LinearTable-3
    MyBatis系列(五)
    MyBatis系列(四)
    LinearTable-2
    PSTN和以太网互连实验
    python入门
    \ No newline at end of file diff --git a/page/9/index.html b/page/9/index.html new file mode 100644 index 0000000..422d149 --- /dev/null +++ b/page/9/index.html @@ -0,0 +1,311 @@ +SHYEE-PLASMA - 306 + + + + + + + +
    python入门2
    python入门3
    做根网线
    LinearTable
    MAVEN
    mybatis缓存
    Oracle系列学习(二)
    关于土豆🥔
    MyBatis系列(三)
    上海之行
    \ No newline at end of file diff --git a/pic/A-1D-cylindrical-kinetic-wave-code-for-helicon-plasma-sources/56457128067100.png b/pic/A-1D-cylindrical-kinetic-wave-code-for-helicon-plasma-sources/56457128067100.png new file mode 100644 index 0000000..e92e28f Binary files /dev/null and b/pic/A-1D-cylindrical-kinetic-wave-code-for-helicon-plasma-sources/56457128067100.png differ diff --git a/pic/A-1D-cylindrical-kinetic-wave-code-for-helicon-plasma-sources/56631194780500.png b/pic/A-1D-cylindrical-kinetic-wave-code-for-helicon-plasma-sources/56631194780500.png new file mode 100644 index 0000000..cbc8dca Binary files /dev/null and b/pic/A-1D-cylindrical-kinetic-wave-code-for-helicon-plasma-sources/56631194780500.png differ diff --git a/pic/A-1D-cylindrical-kinetic-wave-code-for-helicon-plasma-sources/57148998728900.png b/pic/A-1D-cylindrical-kinetic-wave-code-for-helicon-plasma-sources/57148998728900.png new file mode 100644 index 0000000..9b1a7e3 Binary files /dev/null and b/pic/A-1D-cylindrical-kinetic-wave-code-for-helicon-plasma-sources/57148998728900.png differ diff --git a/pic/A-1D-cylindrical-kinetic-wave-code-for-helicon-plasma-sources/57167778145700.png b/pic/A-1D-cylindrical-kinetic-wave-code-for-helicon-plasma-sources/57167778145700.png new file mode 100644 index 0000000..e1b01fe Binary files /dev/null and b/pic/A-1D-cylindrical-kinetic-wave-code-for-helicon-plasma-sources/57167778145700.png differ diff --git a/pic/A-1D-cylindrical-kinetic-wave-code-for-helicon-plasma-sources/57242650638700.png b/pic/A-1D-cylindrical-kinetic-wave-code-for-helicon-plasma-sources/57242650638700.png new file mode 100644 index 0000000..23a65d6 Binary files /dev/null and b/pic/A-1D-cylindrical-kinetic-wave-code-for-helicon-plasma-sources/57242650638700.png differ diff --git a/pic/A-1D-cylindrical-kinetic-wave-code-for-helicon-plasma-sources/57304824613000.png b/pic/A-1D-cylindrical-kinetic-wave-code-for-helicon-plasma-sources/57304824613000.png new file mode 100644 index 0000000..bf64bba Binary files /dev/null and b/pic/A-1D-cylindrical-kinetic-wave-code-for-helicon-plasma-sources/57304824613000.png differ diff --git a/pic/A-1D-cylindrical-kinetic-wave-code-for-helicon-plasma-sources/57374076293800.png b/pic/A-1D-cylindrical-kinetic-wave-code-for-helicon-plasma-sources/57374076293800.png new file mode 100644 index 0000000..c697e5f Binary files /dev/null and b/pic/A-1D-cylindrical-kinetic-wave-code-for-helicon-plasma-sources/57374076293800.png differ diff --git a/pic/A-1D-cylindrical-kinetic-wave-code-for-helicon-plasma-sources/57407197366700.png b/pic/A-1D-cylindrical-kinetic-wave-code-for-helicon-plasma-sources/57407197366700.png new file mode 100644 index 0000000..22e1636 Binary files /dev/null and b/pic/A-1D-cylindrical-kinetic-wave-code-for-helicon-plasma-sources/57407197366700.png differ diff --git a/pic/A-1D-cylindrical-kinetic-wave-code-for-helicon-plasma-sources/57752114433400.png b/pic/A-1D-cylindrical-kinetic-wave-code-for-helicon-plasma-sources/57752114433400.png new file mode 100644 index 0000000..f3ce29d Binary files /dev/null and b/pic/A-1D-cylindrical-kinetic-wave-code-for-helicon-plasma-sources/57752114433400.png differ diff --git a/pic/A-1D-cylindrical-kinetic-wave-code-for-helicon-plasma-sources/57787407646600.png b/pic/A-1D-cylindrical-kinetic-wave-code-for-helicon-plasma-sources/57787407646600.png new file mode 100644 index 0000000..a27dfdb Binary files /dev/null and b/pic/A-1D-cylindrical-kinetic-wave-code-for-helicon-plasma-sources/57787407646600.png differ diff --git a/pic/A-1D-cylindrical-kinetic-wave-code-for-helicon-plasma-sources/58881979523300.png b/pic/A-1D-cylindrical-kinetic-wave-code-for-helicon-plasma-sources/58881979523300.png new file mode 100644 index 0000000..b6d7b1b Binary files /dev/null and b/pic/A-1D-cylindrical-kinetic-wave-code-for-helicon-plasma-sources/58881979523300.png differ diff --git a/pic/A-1D-cylindrical-kinetic-wave-code-for-helicon-plasma-sources/58898048826400.png b/pic/A-1D-cylindrical-kinetic-wave-code-for-helicon-plasma-sources/58898048826400.png new file mode 100644 index 0000000..f0bd134 Binary files /dev/null and b/pic/A-1D-cylindrical-kinetic-wave-code-for-helicon-plasma-sources/58898048826400.png differ diff --git a/pic/A-1D-cylindrical-kinetic-wave-code-for-helicon-plasma-sources/58949934805500.png b/pic/A-1D-cylindrical-kinetic-wave-code-for-helicon-plasma-sources/58949934805500.png new file mode 100644 index 0000000..db98cda Binary files /dev/null and b/pic/A-1D-cylindrical-kinetic-wave-code-for-helicon-plasma-sources/58949934805500.png differ diff --git a/pic/A-1D-cylindrical-kinetic-wave-code-for-helicon-plasma-sources/58968793283100.png b/pic/A-1D-cylindrical-kinetic-wave-code-for-helicon-plasma-sources/58968793283100.png new file mode 100644 index 0000000..1f36ba7 Binary files /dev/null and b/pic/A-1D-cylindrical-kinetic-wave-code-for-helicon-plasma-sources/58968793283100.png differ diff --git a/pic/A-1D-cylindrical-kinetic-wave-code-for-helicon-plasma-sources/59022628752700.png b/pic/A-1D-cylindrical-kinetic-wave-code-for-helicon-plasma-sources/59022628752700.png new file mode 100644 index 0000000..e8ce17f Binary files /dev/null and b/pic/A-1D-cylindrical-kinetic-wave-code-for-helicon-plasma-sources/59022628752700.png differ diff --git a/pic/A-1D-cylindrical-kinetic-wave-code-for-helicon-plasma-sources/60459544848200.png b/pic/A-1D-cylindrical-kinetic-wave-code-for-helicon-plasma-sources/60459544848200.png new file mode 100644 index 0000000..0b315b3 Binary files /dev/null and b/pic/A-1D-cylindrical-kinetic-wave-code-for-helicon-plasma-sources/60459544848200.png differ diff --git a/pic/A-1D-cylindrical-kinetic-wave-code-for-helicon-plasma-sources/60527728768200.png b/pic/A-1D-cylindrical-kinetic-wave-code-for-helicon-plasma-sources/60527728768200.png new file mode 100644 index 0000000..bb8f982 Binary files /dev/null and b/pic/A-1D-cylindrical-kinetic-wave-code-for-helicon-plasma-sources/60527728768200.png differ diff --git a/pic/A-1D-cylindrical-kinetic-wave-code-for-helicon-plasma-sources/93811600288000.png b/pic/A-1D-cylindrical-kinetic-wave-code-for-helicon-plasma-sources/93811600288000.png new file mode 100644 index 0000000..0d9b7f9 Binary files /dev/null and b/pic/A-1D-cylindrical-kinetic-wave-code-for-helicon-plasma-sources/93811600288000.png differ diff --git a/pic/A-1D-cylindrical-kinetic-wave-code-for-helicon-plasma-sources/93839575856200.png b/pic/A-1D-cylindrical-kinetic-wave-code-for-helicon-plasma-sources/93839575856200.png new file mode 100644 index 0000000..fecbb55 Binary files /dev/null and b/pic/A-1D-cylindrical-kinetic-wave-code-for-helicon-plasma-sources/93839575856200.png differ diff --git a/pic/A-1D-cylindrical-kinetic-wave-code-for-helicon-plasma-sources/93868134675400.png b/pic/A-1D-cylindrical-kinetic-wave-code-for-helicon-plasma-sources/93868134675400.png new file mode 100644 index 0000000..e112a41 Binary files /dev/null and b/pic/A-1D-cylindrical-kinetic-wave-code-for-helicon-plasma-sources/93868134675400.png differ diff --git a/pic/A-1D-cylindrical-kinetic-wave-code-for-helicon-plasma-sources/93890034952500.png b/pic/A-1D-cylindrical-kinetic-wave-code-for-helicon-plasma-sources/93890034952500.png new file mode 100644 index 0000000..ded6e8f Binary files /dev/null and b/pic/A-1D-cylindrical-kinetic-wave-code-for-helicon-plasma-sources/93890034952500.png differ diff --git a/pic/A-1D-cylindrical-kinetic-wave-code-for-helicon-plasma-sources/93923001449800.png b/pic/A-1D-cylindrical-kinetic-wave-code-for-helicon-plasma-sources/93923001449800.png new file mode 100644 index 0000000..9e17794 Binary files /dev/null and b/pic/A-1D-cylindrical-kinetic-wave-code-for-helicon-plasma-sources/93923001449800.png differ diff --git a/pic/A-1D-cylindrical-kinetic-wave-code-for-helicon-plasma-sources/93979131725100.png b/pic/A-1D-cylindrical-kinetic-wave-code-for-helicon-plasma-sources/93979131725100.png new file mode 100644 index 0000000..288cea1 Binary files /dev/null and b/pic/A-1D-cylindrical-kinetic-wave-code-for-helicon-plasma-sources/93979131725100.png differ diff --git a/pic/A-1D-cylindrical-kinetic-wave-code-for-helicon-plasma-sources/94004794358800.png b/pic/A-1D-cylindrical-kinetic-wave-code-for-helicon-plasma-sources/94004794358800.png new file mode 100644 index 0000000..42d6b74 Binary files /dev/null and b/pic/A-1D-cylindrical-kinetic-wave-code-for-helicon-plasma-sources/94004794358800.png differ diff --git a/pic/A-1D-cylindrical-kinetic-wave-code-for-helicon-plasma-sources/94880349801200.png b/pic/A-1D-cylindrical-kinetic-wave-code-for-helicon-plasma-sources/94880349801200.png new file mode 100644 index 0000000..de8abaf Binary files /dev/null and b/pic/A-1D-cylindrical-kinetic-wave-code-for-helicon-plasma-sources/94880349801200.png differ diff --git a/pic/A-1D-cylindrical-kinetic-wave-code-for-helicon-plasma-sources/95036629168700.png b/pic/A-1D-cylindrical-kinetic-wave-code-for-helicon-plasma-sources/95036629168700.png new file mode 100644 index 0000000..8c73f7c Binary files /dev/null and b/pic/A-1D-cylindrical-kinetic-wave-code-for-helicon-plasma-sources/95036629168700.png differ diff --git a/pic/A-1D-cylindrical-kinetic-wave-code-for-helicon-plasma-sources/images/56408552027400.png b/pic/A-1D-cylindrical-kinetic-wave-code-for-helicon-plasma-sources/images/56408552027400.png new file mode 100644 index 0000000..e92e28f Binary files /dev/null and b/pic/A-1D-cylindrical-kinetic-wave-code-for-helicon-plasma-sources/images/56408552027400.png differ diff --git a/pic/Design-of-a-novel-high-efficiency-antenna-for-helicon-plasma-sources/2814072835100.png b/pic/Design-of-a-novel-high-efficiency-antenna-for-helicon-plasma-sources/2814072835100.png new file mode 100644 index 0000000..e16c526 Binary files /dev/null and b/pic/Design-of-a-novel-high-efficiency-antenna-for-helicon-plasma-sources/2814072835100.png differ diff --git a/pic/Design-of-a-novel-high-efficiency-antenna-for-helicon-plasma-sources/2832126126900.png b/pic/Design-of-a-novel-high-efficiency-antenna-for-helicon-plasma-sources/2832126126900.png new file mode 100644 index 0000000..8985581 Binary files /dev/null and b/pic/Design-of-a-novel-high-efficiency-antenna-for-helicon-plasma-sources/2832126126900.png differ diff --git a/pic/Design-of-a-novel-high-efficiency-antenna-for-helicon-plasma-sources/2847039631200.png b/pic/Design-of-a-novel-high-efficiency-antenna-for-helicon-plasma-sources/2847039631200.png new file mode 100644 index 0000000..e7dbca4 Binary files /dev/null and b/pic/Design-of-a-novel-high-efficiency-antenna-for-helicon-plasma-sources/2847039631200.png differ diff --git a/pic/Design-of-a-novel-high-efficiency-antenna-for-helicon-plasma-sources/3251796298200.png b/pic/Design-of-a-novel-high-efficiency-antenna-for-helicon-plasma-sources/3251796298200.png new file mode 100644 index 0000000..084b326 Binary files /dev/null and b/pic/Design-of-a-novel-high-efficiency-antenna-for-helicon-plasma-sources/3251796298200.png differ diff --git a/pic/Design-of-a-novel-high-efficiency-antenna-for-helicon-plasma-sources/3265118284100.png b/pic/Design-of-a-novel-high-efficiency-antenna-for-helicon-plasma-sources/3265118284100.png new file mode 100644 index 0000000..5efe1f1 Binary files /dev/null and b/pic/Design-of-a-novel-high-efficiency-antenna-for-helicon-plasma-sources/3265118284100.png differ diff --git a/pic/Design-of-a-novel-high-efficiency-antenna-for-helicon-plasma-sources/3280557029500.png b/pic/Design-of-a-novel-high-efficiency-antenna-for-helicon-plasma-sources/3280557029500.png new file mode 100644 index 0000000..f28e4ae Binary files /dev/null and b/pic/Design-of-a-novel-high-efficiency-antenna-for-helicon-plasma-sources/3280557029500.png differ diff --git a/pic/Design-of-a-novel-high-efficiency-antenna-for-helicon-plasma-sources/3319607102600.png b/pic/Design-of-a-novel-high-efficiency-antenna-for-helicon-plasma-sources/3319607102600.png new file mode 100644 index 0000000..5477841 Binary files /dev/null and b/pic/Design-of-a-novel-high-efficiency-antenna-for-helicon-plasma-sources/3319607102600.png differ diff --git a/pic/Design-of-a-novel-high-efficiency-antenna-for-helicon-plasma-sources/3347011648700.png b/pic/Design-of-a-novel-high-efficiency-antenna-for-helicon-plasma-sources/3347011648700.png new file mode 100644 index 0000000..15d5470 Binary files /dev/null and b/pic/Design-of-a-novel-high-efficiency-antenna-for-helicon-plasma-sources/3347011648700.png differ diff --git a/pic/Design-of-a-novel-high-efficiency-antenna-for-helicon-plasma-sources/3423606045600.png b/pic/Design-of-a-novel-high-efficiency-antenna-for-helicon-plasma-sources/3423606045600.png new file mode 100644 index 0000000..0d61fa7 Binary files /dev/null and b/pic/Design-of-a-novel-high-efficiency-antenna-for-helicon-plasma-sources/3423606045600.png differ diff --git a/pic/Design-of-a-novel-high-efficiency-antenna-for-helicon-plasma-sources/3435376587300.png b/pic/Design-of-a-novel-high-efficiency-antenna-for-helicon-plasma-sources/3435376587300.png new file mode 100644 index 0000000..017c353 Binary files /dev/null and b/pic/Design-of-a-novel-high-efficiency-antenna-for-helicon-plasma-sources/3435376587300.png differ diff --git a/pic/Design-of-a-novel-high-efficiency-antenna-for-helicon-plasma-sources/3446446288100.png b/pic/Design-of-a-novel-high-efficiency-antenna-for-helicon-plasma-sources/3446446288100.png new file mode 100644 index 0000000..dd46e23 Binary files /dev/null and b/pic/Design-of-a-novel-high-efficiency-antenna-for-helicon-plasma-sources/3446446288100.png differ diff --git a/pic/Design-of-a-novel-high-efficiency-antenna-for-helicon-plasma-sources/3470158755700.png b/pic/Design-of-a-novel-high-efficiency-antenna-for-helicon-plasma-sources/3470158755700.png new file mode 100644 index 0000000..4bf358c Binary files /dev/null and b/pic/Design-of-a-novel-high-efficiency-antenna-for-helicon-plasma-sources/3470158755700.png differ diff --git a/pic/Design-of-a-novel-high-efficiency-antenna-for-helicon-plasma-sources/3486661259400.png b/pic/Design-of-a-novel-high-efficiency-antenna-for-helicon-plasma-sources/3486661259400.png new file mode 100644 index 0000000..51ce798 Binary files /dev/null and b/pic/Design-of-a-novel-high-efficiency-antenna-for-helicon-plasma-sources/3486661259400.png differ diff --git a/pic/Design-of-a-novel-high-efficiency-antenna-for-helicon-plasma-sources/3505628631500.png b/pic/Design-of-a-novel-high-efficiency-antenna-for-helicon-plasma-sources/3505628631500.png new file mode 100644 index 0000000..54831e8 Binary files /dev/null and b/pic/Design-of-a-novel-high-efficiency-antenna-for-helicon-plasma-sources/3505628631500.png differ diff --git a/pic/Design-of-a-novel-high-efficiency-antenna-for-helicon-plasma-sources/3542679398100.png b/pic/Design-of-a-novel-high-efficiency-antenna-for-helicon-plasma-sources/3542679398100.png new file mode 100644 index 0000000..d464827 Binary files /dev/null and b/pic/Design-of-a-novel-high-efficiency-antenna-for-helicon-plasma-sources/3542679398100.png differ diff --git a/pic/Design-of-a-novel-high-efficiency-antenna-for-helicon-plasma-sources/3561791655500.png b/pic/Design-of-a-novel-high-efficiency-antenna-for-helicon-plasma-sources/3561791655500.png new file mode 100644 index 0000000..b472f32 Binary files /dev/null and b/pic/Design-of-a-novel-high-efficiency-antenna-for-helicon-plasma-sources/3561791655500.png differ diff --git a/pic/Design-of-a-novel-high-efficiency-antenna-for-helicon-plasma-sources/3612808259000.png b/pic/Design-of-a-novel-high-efficiency-antenna-for-helicon-plasma-sources/3612808259000.png new file mode 100644 index 0000000..af4364a Binary files /dev/null and b/pic/Design-of-a-novel-high-efficiency-antenna-for-helicon-plasma-sources/3612808259000.png differ diff --git a/pic/Design-of-a-novel-high-efficiency-antenna-for-helicon-plasma-sources/3626462770800.png b/pic/Design-of-a-novel-high-efficiency-antenna-for-helicon-plasma-sources/3626462770800.png new file mode 100644 index 0000000..ed675e0 Binary files /dev/null and b/pic/Design-of-a-novel-high-efficiency-antenna-for-helicon-plasma-sources/3626462770800.png differ diff --git a/pic/Design-of-a-novel-high-efficiency-antenna-for-helicon-plasma-sources/3673533773600.png b/pic/Design-of-a-novel-high-efficiency-antenna-for-helicon-plasma-sources/3673533773600.png new file mode 100644 index 0000000..a29bf8e Binary files /dev/null and b/pic/Design-of-a-novel-high-efficiency-antenna-for-helicon-plasma-sources/3673533773600.png differ diff --git a/pic/Design-of-a-novel-high-efficiency-antenna-for-helicon-plasma-sources/3689286505500.png b/pic/Design-of-a-novel-high-efficiency-antenna-for-helicon-plasma-sources/3689286505500.png new file mode 100644 index 0000000..fa6ff1b Binary files /dev/null and b/pic/Design-of-a-novel-high-efficiency-antenna-for-helicon-plasma-sources/3689286505500.png differ diff --git a/pic/Design-of-a-novel-high-efficiency-antenna-for-helicon-plasma-sources/3706670738000.png b/pic/Design-of-a-novel-high-efficiency-antenna-for-helicon-plasma-sources/3706670738000.png new file mode 100644 index 0000000..c0f353b Binary files /dev/null and b/pic/Design-of-a-novel-high-efficiency-antenna-for-helicon-plasma-sources/3706670738000.png differ diff --git a/pic/Design-of-a-novel-high-efficiency-antenna-for-helicon-plasma-sources/3732089583300.png b/pic/Design-of-a-novel-high-efficiency-antenna-for-helicon-plasma-sources/3732089583300.png new file mode 100644 index 0000000..9918bf0 Binary files /dev/null and b/pic/Design-of-a-novel-high-efficiency-antenna-for-helicon-plasma-sources/3732089583300.png differ diff --git a/pic/Design-of-a-novel-high-efficiency-antenna-for-helicon-plasma-sources/3747330995600.png b/pic/Design-of-a-novel-high-efficiency-antenna-for-helicon-plasma-sources/3747330995600.png new file mode 100644 index 0000000..a840e28 Binary files /dev/null and b/pic/Design-of-a-novel-high-efficiency-antenna-for-helicon-plasma-sources/3747330995600.png differ diff --git a/pic/Design-of-a-novel-high-efficiency-antenna-for-helicon-plasma-sources/3760757984900.png b/pic/Design-of-a-novel-high-efficiency-antenna-for-helicon-plasma-sources/3760757984900.png new file mode 100644 index 0000000..48a243a Binary files /dev/null and b/pic/Design-of-a-novel-high-efficiency-antenna-for-helicon-plasma-sources/3760757984900.png differ diff --git a/pic/Design-of-a-novel-high-efficiency-antenna-for-helicon-plasma-sources/3804464051800.png b/pic/Design-of-a-novel-high-efficiency-antenna-for-helicon-plasma-sources/3804464051800.png new file mode 100644 index 0000000..c10e383 Binary files /dev/null and b/pic/Design-of-a-novel-high-efficiency-antenna-for-helicon-plasma-sources/3804464051800.png differ diff --git a/pic/Design-of-a-novel-high-efficiency-antenna-for-helicon-plasma-sources/3820798670900.png b/pic/Design-of-a-novel-high-efficiency-antenna-for-helicon-plasma-sources/3820798670900.png new file mode 100644 index 0000000..062912f Binary files /dev/null and b/pic/Design-of-a-novel-high-efficiency-antenna-for-helicon-plasma-sources/3820798670900.png differ diff --git a/pic/Design-of-a-novel-high-efficiency-antenna-for-helicon-plasma-sources/3889672816000.png b/pic/Design-of-a-novel-high-efficiency-antenna-for-helicon-plasma-sources/3889672816000.png new file mode 100644 index 0000000..ea94cec Binary files /dev/null and b/pic/Design-of-a-novel-high-efficiency-antenna-for-helicon-plasma-sources/3889672816000.png differ diff --git a/pic/Design-of-a-novel-high-efficiency-antenna-for-helicon-plasma-sources/3908540696300.png b/pic/Design-of-a-novel-high-efficiency-antenna-for-helicon-plasma-sources/3908540696300.png new file mode 100644 index 0000000..2ca8375 Binary files /dev/null and b/pic/Design-of-a-novel-high-efficiency-antenna-for-helicon-plasma-sources/3908540696300.png differ diff --git a/pic/Design-of-a-novel-high-efficiency-antenna-for-helicon-plasma-sources/3924517283300.png b/pic/Design-of-a-novel-high-efficiency-antenna-for-helicon-plasma-sources/3924517283300.png new file mode 100644 index 0000000..52d7fac Binary files /dev/null and b/pic/Design-of-a-novel-high-efficiency-antenna-for-helicon-plasma-sources/3924517283300.png differ diff --git a/pic/Design-of-a-novel-high-efficiency-antenna-for-helicon-plasma-sources/3937172646400.png b/pic/Design-of-a-novel-high-efficiency-antenna-for-helicon-plasma-sources/3937172646400.png new file mode 100644 index 0000000..2c1f4e8 Binary files /dev/null and b/pic/Design-of-a-novel-high-efficiency-antenna-for-helicon-plasma-sources/3937172646400.png differ diff --git a/pic/Design-of-a-novel-high-efficiency-antenna-for-helicon-plasma-sources/4010431047700.png b/pic/Design-of-a-novel-high-efficiency-antenna-for-helicon-plasma-sources/4010431047700.png new file mode 100644 index 0000000..4e2fdf9 Binary files /dev/null and b/pic/Design-of-a-novel-high-efficiency-antenna-for-helicon-plasma-sources/4010431047700.png differ diff --git a/pic/Design-of-a-novel-high-efficiency-antenna-for-helicon-plasma-sources/4023774033400.png b/pic/Design-of-a-novel-high-efficiency-antenna-for-helicon-plasma-sources/4023774033400.png new file mode 100644 index 0000000..a84365f Binary files /dev/null and b/pic/Design-of-a-novel-high-efficiency-antenna-for-helicon-plasma-sources/4023774033400.png differ diff --git a/pic/Design-of-a-novel-high-efficiency-antenna-for-helicon-plasma-sources/4038685115300.png b/pic/Design-of-a-novel-high-efficiency-antenna-for-helicon-plasma-sources/4038685115300.png new file mode 100644 index 0000000..046ce91 Binary files /dev/null and b/pic/Design-of-a-novel-high-efficiency-antenna-for-helicon-plasma-sources/4038685115300.png differ diff --git a/pic/Design-of-a-novel-high-efficiency-antenna-for-helicon-plasma-sources/4094823827500.png b/pic/Design-of-a-novel-high-efficiency-antenna-for-helicon-plasma-sources/4094823827500.png new file mode 100644 index 0000000..cebb77f Binary files /dev/null and b/pic/Design-of-a-novel-high-efficiency-antenna-for-helicon-plasma-sources/4094823827500.png differ diff --git a/pic/Design-of-a-novel-high-efficiency-antenna-for-helicon-plasma-sources/4165606249499.png b/pic/Design-of-a-novel-high-efficiency-antenna-for-helicon-plasma-sources/4165606249499.png new file mode 100644 index 0000000..5aa7f6c Binary files /dev/null and b/pic/Design-of-a-novel-high-efficiency-antenna-for-helicon-plasma-sources/4165606249499.png differ diff --git a/pic/Discharge-Directionality-and-Dominance-of-Right-Handed-Modes-in-Helicon-Plasmas-due-to-Radial-Electron-Density-Gradients/11603306534400.png b/pic/Discharge-Directionality-and-Dominance-of-Right-Handed-Modes-in-Helicon-Plasmas-due-to-Radial-Electron-Density-Gradients/11603306534400.png new file mode 100644 index 0000000..b1cd095 Binary files /dev/null and b/pic/Discharge-Directionality-and-Dominance-of-Right-Handed-Modes-in-Helicon-Plasmas-due-to-Radial-Electron-Density-Gradients/11603306534400.png differ diff --git a/pic/Discharge-Directionality-and-Dominance-of-Right-Handed-Modes-in-Helicon-Plasmas-due-to-Radial-Electron-Density-Gradients/11673987796500.png b/pic/Discharge-Directionality-and-Dominance-of-Right-Handed-Modes-in-Helicon-Plasmas-due-to-Radial-Electron-Density-Gradients/11673987796500.png new file mode 100644 index 0000000..9756cc2 Binary files /dev/null and b/pic/Discharge-Directionality-and-Dominance-of-Right-Handed-Modes-in-Helicon-Plasmas-due-to-Radial-Electron-Density-Gradients/11673987796500.png differ diff --git a/pic/Discharge-Directionality-and-Dominance-of-Right-Handed-Modes-in-Helicon-Plasmas-due-to-Radial-Electron-Density-Gradients/12569777194700.png b/pic/Discharge-Directionality-and-Dominance-of-Right-Handed-Modes-in-Helicon-Plasmas-due-to-Radial-Electron-Density-Gradients/12569777194700.png new file mode 100644 index 0000000..7fec3c5 Binary files /dev/null and b/pic/Discharge-Directionality-and-Dominance-of-Right-Handed-Modes-in-Helicon-Plasmas-due-to-Radial-Electron-Density-Gradients/12569777194700.png differ diff --git a/pic/Discharge-Directionality-and-Dominance-of-Right-Handed-Modes-in-Helicon-Plasmas-due-to-Radial-Electron-Density-Gradients/12629467159200.png b/pic/Discharge-Directionality-and-Dominance-of-Right-Handed-Modes-in-Helicon-Plasmas-due-to-Radial-Electron-Density-Gradients/12629467159200.png new file mode 100644 index 0000000..5172f51 Binary files /dev/null and b/pic/Discharge-Directionality-and-Dominance-of-Right-Handed-Modes-in-Helicon-Plasmas-due-to-Radial-Electron-Density-Gradients/12629467159200.png differ diff --git a/pic/Discharge-Directionality-and-Dominance-of-Right-Handed-Modes-in-Helicon-Plasmas-due-to-Radial-Electron-Density-Gradients/33458955362800.png b/pic/Discharge-Directionality-and-Dominance-of-Right-Handed-Modes-in-Helicon-Plasmas-due-to-Radial-Electron-Density-Gradients/33458955362800.png new file mode 100644 index 0000000..dfb6cae Binary files /dev/null and b/pic/Discharge-Directionality-and-Dominance-of-Right-Handed-Modes-in-Helicon-Plasmas-due-to-Radial-Electron-Density-Gradients/33458955362800.png differ diff --git a/pic/Discharge-Directionality-and-Dominance-of-Right-Handed-Modes-in-Helicon-Plasmas-due-to-Radial-Electron-Density-Gradients/33473868691600.png b/pic/Discharge-Directionality-and-Dominance-of-Right-Handed-Modes-in-Helicon-Plasmas-due-to-Radial-Electron-Density-Gradients/33473868691600.png new file mode 100644 index 0000000..3e28c0a Binary files /dev/null and b/pic/Discharge-Directionality-and-Dominance-of-Right-Handed-Modes-in-Helicon-Plasmas-due-to-Radial-Electron-Density-Gradients/33473868691600.png differ diff --git a/pic/Discharge-Directionality-and-Dominance-of-Right-Handed-Modes-in-Helicon-Plasmas-due-to-Radial-Electron-Density-Gradients/38134196466500.png b/pic/Discharge-Directionality-and-Dominance-of-Right-Handed-Modes-in-Helicon-Plasmas-due-to-Radial-Electron-Density-Gradients/38134196466500.png new file mode 100644 index 0000000..1f870d3 Binary files /dev/null and b/pic/Discharge-Directionality-and-Dominance-of-Right-Handed-Modes-in-Helicon-Plasmas-due-to-Radial-Electron-Density-Gradients/38134196466500.png differ diff --git a/pic/Discharge-Directionality-and-Dominance-of-Right-Handed-Modes-in-Helicon-Plasmas-due-to-Radial-Electron-Density-Gradients/38212351650000.png b/pic/Discharge-Directionality-and-Dominance-of-Right-Handed-Modes-in-Helicon-Plasmas-due-to-Radial-Electron-Density-Gradients/38212351650000.png new file mode 100644 index 0000000..4fda20c Binary files /dev/null and b/pic/Discharge-Directionality-and-Dominance-of-Right-Handed-Modes-in-Helicon-Plasmas-due-to-Radial-Electron-Density-Gradients/38212351650000.png differ diff --git a/pic/Discharge-Directionality-and-Dominance-of-Right-Handed-Modes-in-Helicon-Plasmas-due-to-Radial-Electron-Density-Gradients/38251945600700.png b/pic/Discharge-Directionality-and-Dominance-of-Right-Handed-Modes-in-Helicon-Plasmas-due-to-Radial-Electron-Density-Gradients/38251945600700.png new file mode 100644 index 0000000..8f42eaa Binary files /dev/null and b/pic/Discharge-Directionality-and-Dominance-of-Right-Handed-Modes-in-Helicon-Plasmas-due-to-Radial-Electron-Density-Gradients/38251945600700.png differ diff --git a/pic/Discharge-Directionality-and-Dominance-of-Right-Handed-Modes-in-Helicon-Plasmas-due-to-Radial-Electron-Density-Gradients/38406293170600.png b/pic/Discharge-Directionality-and-Dominance-of-Right-Handed-Modes-in-Helicon-Plasmas-due-to-Radial-Electron-Density-Gradients/38406293170600.png new file mode 100644 index 0000000..fbe4217 Binary files /dev/null and b/pic/Discharge-Directionality-and-Dominance-of-Right-Handed-Modes-in-Helicon-Plasmas-due-to-Radial-Electron-Density-Gradients/38406293170600.png differ diff --git a/pic/Discharge-Directionality-and-Dominance-of-Right-Handed-Modes-in-Helicon-Plasmas-due-to-Radial-Electron-Density-Gradients/40596730570300.png b/pic/Discharge-Directionality-and-Dominance-of-Right-Handed-Modes-in-Helicon-Plasmas-due-to-Radial-Electron-Density-Gradients/40596730570300.png new file mode 100644 index 0000000..4b913c9 Binary files /dev/null and b/pic/Discharge-Directionality-and-Dominance-of-Right-Handed-Modes-in-Helicon-Plasmas-due-to-Radial-Electron-Density-Gradients/40596730570300.png differ diff --git a/pic/Discharge-Directionality-and-Dominance-of-Right-Handed-Modes-in-Helicon-Plasmas-due-to-Radial-Electron-Density-Gradients/40997373408200.png b/pic/Discharge-Directionality-and-Dominance-of-Right-Handed-Modes-in-Helicon-Plasmas-due-to-Radial-Electron-Density-Gradients/40997373408200.png new file mode 100644 index 0000000..c4e328a Binary files /dev/null and b/pic/Discharge-Directionality-and-Dominance-of-Right-Handed-Modes-in-Helicon-Plasmas-due-to-Radial-Electron-Density-Gradients/40997373408200.png differ diff --git a/pic/Discharge-Directionality-and-Dominance-of-Right-Handed-Modes-in-Helicon-Plasmas-due-to-Radial-Electron-Density-Gradients/6039952572400.png b/pic/Discharge-Directionality-and-Dominance-of-Right-Handed-Modes-in-Helicon-Plasmas-due-to-Radial-Electron-Density-Gradients/6039952572400.png new file mode 100644 index 0000000..58110d1 Binary files /dev/null and b/pic/Discharge-Directionality-and-Dominance-of-Right-Handed-Modes-in-Helicon-Plasmas-due-to-Radial-Electron-Density-Gradients/6039952572400.png differ diff --git a/pic/Discharge-Directionality-and-Dominance-of-Right-Handed-Modes-in-Helicon-Plasmas-due-to-Radial-Electron-Density-Gradients/6332773188200.png b/pic/Discharge-Directionality-and-Dominance-of-Right-Handed-Modes-in-Helicon-Plasmas-due-to-Radial-Electron-Density-Gradients/6332773188200.png new file mode 100644 index 0000000..c65d659 Binary files /dev/null and b/pic/Discharge-Directionality-and-Dominance-of-Right-Handed-Modes-in-Helicon-Plasmas-due-to-Radial-Electron-Density-Gradients/6332773188200.png differ diff --git a/pic/Discharge-Directionality-and-Dominance-of-Right-Handed-Modes-in-Helicon-Plasmas-due-to-Radial-Electron-Density-Gradients/8740836632700.png b/pic/Discharge-Directionality-and-Dominance-of-Right-Handed-Modes-in-Helicon-Plasmas-due-to-Radial-Electron-Density-Gradients/8740836632700.png new file mode 100644 index 0000000..970c0bf Binary files /dev/null and b/pic/Discharge-Directionality-and-Dominance-of-Right-Handed-Modes-in-Helicon-Plasmas-due-to-Radial-Electron-Density-Gradients/8740836632700.png differ diff --git a/pic/Helicon_wave_coupling_to_a_finite_plasma_column/image-29.png b/pic/Helicon_wave_coupling_to_a_finite_plasma_column/image-29.png new file mode 100644 index 0000000..26ac997 Binary files /dev/null and b/pic/Helicon_wave_coupling_to_a_finite_plasma_column/image-29.png differ diff --git a/pic/Helicon_wave_coupling_to_a_finite_plasma_column/image-30.png b/pic/Helicon_wave_coupling_to_a_finite_plasma_column/image-30.png new file mode 100644 index 0000000..61ea3a9 Binary files /dev/null and b/pic/Helicon_wave_coupling_to_a_finite_plasma_column/image-30.png differ diff --git a/pic/Helicon_wave_coupling_to_a_finite_plasma_column/image-31.png b/pic/Helicon_wave_coupling_to_a_finite_plasma_column/image-31.png new file mode 100644 index 0000000..b3f7b8f Binary files /dev/null and b/pic/Helicon_wave_coupling_to_a_finite_plasma_column/image-31.png differ diff --git a/pic/Helicon_wave_coupling_to_a_finite_plasma_column/image-32.png b/pic/Helicon_wave_coupling_to_a_finite_plasma_column/image-32.png new file mode 100644 index 0000000..b428259 Binary files /dev/null and b/pic/Helicon_wave_coupling_to_a_finite_plasma_column/image-32.png differ diff --git a/pic/Helicon_wave_coupling_to_a_finite_plasma_column/image-33.png b/pic/Helicon_wave_coupling_to_a_finite_plasma_column/image-33.png new file mode 100644 index 0000000..01506bb Binary files /dev/null and b/pic/Helicon_wave_coupling_to_a_finite_plasma_column/image-33.png differ diff --git a/pic/Helicon_wave_coupling_to_a_finite_plasma_column/image-34.png b/pic/Helicon_wave_coupling_to_a_finite_plasma_column/image-34.png new file mode 100644 index 0000000..1a4a5e0 Binary files /dev/null and b/pic/Helicon_wave_coupling_to_a_finite_plasma_column/image-34.png differ diff --git a/pic/Helicon_wave_coupling_to_a_finite_plasma_column/image-35.png b/pic/Helicon_wave_coupling_to_a_finite_plasma_column/image-35.png new file mode 100644 index 0000000..d171dae Binary files /dev/null and b/pic/Helicon_wave_coupling_to_a_finite_plasma_column/image-35.png differ diff --git a/pic/Helicon_wave_coupling_to_a_finite_plasma_column/image-36.png b/pic/Helicon_wave_coupling_to_a_finite_plasma_column/image-36.png new file mode 100644 index 0000000..94ec226 Binary files /dev/null and b/pic/Helicon_wave_coupling_to_a_finite_plasma_column/image-36.png differ diff --git a/pic/Helicon_wave_coupling_to_a_finite_plasma_column/image-37.png b/pic/Helicon_wave_coupling_to_a_finite_plasma_column/image-37.png new file mode 100644 index 0000000..617f281 Binary files /dev/null and b/pic/Helicon_wave_coupling_to_a_finite_plasma_column/image-37.png differ diff --git a/pic/Helicon_wave_coupling_to_a_finite_plasma_column/image-38.png b/pic/Helicon_wave_coupling_to_a_finite_plasma_column/image-38.png new file mode 100644 index 0000000..56f324c Binary files /dev/null and b/pic/Helicon_wave_coupling_to_a_finite_plasma_column/image-38.png differ diff --git a/pic/Helicon_wave_coupling_to_a_finite_plasma_column/image-39.png b/pic/Helicon_wave_coupling_to_a_finite_plasma_column/image-39.png new file mode 100644 index 0000000..379270f Binary files /dev/null and b/pic/Helicon_wave_coupling_to_a_finite_plasma_column/image-39.png differ diff --git a/pic/Helicon_wave_coupling_to_a_finite_plasma_column/image-40.png b/pic/Helicon_wave_coupling_to_a_finite_plasma_column/image-40.png new file mode 100644 index 0000000..a58ddc5 Binary files /dev/null and b/pic/Helicon_wave_coupling_to_a_finite_plasma_column/image-40.png differ diff --git a/pic/Helicon_wave_coupling_to_a_finite_plasma_column/image-41.png b/pic/Helicon_wave_coupling_to_a_finite_plasma_column/image-41.png new file mode 100644 index 0000000..cb44171 Binary files /dev/null and b/pic/Helicon_wave_coupling_to_a_finite_plasma_column/image-41.png differ diff --git a/pic/Helicon_wave_coupling_to_a_finite_plasma_column/image-42.png b/pic/Helicon_wave_coupling_to_a_finite_plasma_column/image-42.png new file mode 100644 index 0000000..6f82116 Binary files /dev/null and b/pic/Helicon_wave_coupling_to_a_finite_plasma_column/image-42.png differ diff --git a/pic/Helicon_wave_coupling_to_a_finite_plasma_column/image-43.png b/pic/Helicon_wave_coupling_to_a_finite_plasma_column/image-43.png new file mode 100644 index 0000000..b91d358 Binary files /dev/null and b/pic/Helicon_wave_coupling_to_a_finite_plasma_column/image-43.png differ diff --git a/pic/Helicon_wave_coupling_to_a_finite_plasma_column/image-44.png b/pic/Helicon_wave_coupling_to_a_finite_plasma_column/image-44.png new file mode 100644 index 0000000..8a84dc6 Binary files /dev/null and b/pic/Helicon_wave_coupling_to_a_finite_plasma_column/image-44.png differ diff --git a/pic/Helicon_wave_coupling_to_a_finite_plasma_column/image-45.png b/pic/Helicon_wave_coupling_to_a_finite_plasma_column/image-45.png new file mode 100644 index 0000000..98d799d Binary files /dev/null and b/pic/Helicon_wave_coupling_to_a_finite_plasma_column/image-45.png differ diff --git a/pic/Helicon_wave_coupling_to_a_finite_plasma_column/image-46.png b/pic/Helicon_wave_coupling_to_a_finite_plasma_column/image-46.png new file mode 100644 index 0000000..ead19fc Binary files /dev/null and b/pic/Helicon_wave_coupling_to_a_finite_plasma_column/image-46.png differ diff --git a/pic/MAVEN/image-20210108150437064.png b/pic/MAVEN/image-20210108150437064.png new file mode 100644 index 0000000..c2f81b5 Binary files /dev/null and b/pic/MAVEN/image-20210108150437064.png differ diff --git a/pic/MAVEN/image-20210108150641400.png b/pic/MAVEN/image-20210108150641400.png new file mode 100644 index 0000000..800abf3 Binary files /dev/null and b/pic/MAVEN/image-20210108150641400.png differ diff --git a/pic/MAVEN/image-20210108150909017.png b/pic/MAVEN/image-20210108150909017.png new file mode 100644 index 0000000..53fc4fd Binary files /dev/null and b/pic/MAVEN/image-20210108150909017.png differ diff --git a/pic/MAVEN/image-20210108151005405.png b/pic/MAVEN/image-20210108151005405.png new file mode 100644 index 0000000..4fee11d Binary files /dev/null and b/pic/MAVEN/image-20210108151005405.png differ diff --git a/pic/MAVEN/image-20210108152001111.png b/pic/MAVEN/image-20210108152001111.png new file mode 100644 index 0000000..2e97b8e Binary files /dev/null and b/pic/MAVEN/image-20210108152001111.png differ diff --git a/pic/Machine-Learning-Algorithms-A-Review/1688527293973 b/pic/Machine-Learning-Algorithms-A-Review/1688527293973 new file mode 100644 index 0000000..e69de29 diff --git a/pic/Machine-Learning-Algorithms-A-Review/1688527339027.png b/pic/Machine-Learning-Algorithms-A-Review/1688527339027.png new file mode 100644 index 0000000..281b1d9 Binary files /dev/null and b/pic/Machine-Learning-Algorithms-A-Review/1688527339027.png differ diff --git a/pic/Machine-Learning-Algorithms-A-Review/1688540715285.png b/pic/Machine-Learning-Algorithms-A-Review/1688540715285.png new file mode 100644 index 0000000..844c070 Binary files /dev/null and b/pic/Machine-Learning-Algorithms-A-Review/1688540715285.png differ diff --git a/pic/Machine-Learning-Algorithms-A-Review/1688541026956.png b/pic/Machine-Learning-Algorithms-A-Review/1688541026956.png new file mode 100644 index 0000000..f10cc10 Binary files /dev/null and b/pic/Machine-Learning-Algorithms-A-Review/1688541026956.png differ diff --git a/pic/Machine-Learning-Algorithms-A-Review/1688541651835.png b/pic/Machine-Learning-Algorithms-A-Review/1688541651835.png new file mode 100644 index 0000000..a2476b6 Binary files /dev/null and b/pic/Machine-Learning-Algorithms-A-Review/1688541651835.png differ diff --git a/pic/Machine-Learning-Algorithms-A-Review/bfe3c249e82c4ccebfb6821e1b075dd3.png b/pic/Machine-Learning-Algorithms-A-Review/bfe3c249e82c4ccebfb6821e1b075dd3.png new file mode 100644 index 0000000..281b1d9 Binary files /dev/null and b/pic/Machine-Learning-Algorithms-A-Review/bfe3c249e82c4ccebfb6821e1b075dd3.png differ diff --git a/pic/Machine-Learning-Algorithms-A-Review/decisiontree.png b/pic/Machine-Learning-Algorithms-A-Review/decisiontree.png new file mode 100644 index 0000000..246b0ac Binary files /dev/null and b/pic/Machine-Learning-Algorithms-A-Review/decisiontree.png differ diff --git a/pic/Measurement-and-modeling-of-ion-energy-distribution-functions-in-a-low-pressure-argon-plasma-diffusing-from-a-13-56-MHz-helicon-source/image-21.png b/pic/Measurement-and-modeling-of-ion-energy-distribution-functions-in-a-low-pressure-argon-plasma-diffusing-from-a-13-56-MHz-helicon-source/image-21.png new file mode 100644 index 0000000..7d3b1ac Binary files /dev/null and b/pic/Measurement-and-modeling-of-ion-energy-distribution-functions-in-a-low-pressure-argon-plasma-diffusing-from-a-13-56-MHz-helicon-source/image-21.png differ diff --git a/pic/Measurement-and-modeling-of-ion-energy-distribution-functions-in-a-low-pressure-argon-plasma-diffusing-from-a-13-56-MHz-helicon-source/image-22.png b/pic/Measurement-and-modeling-of-ion-energy-distribution-functions-in-a-low-pressure-argon-plasma-diffusing-from-a-13-56-MHz-helicon-source/image-22.png new file mode 100644 index 0000000..d9bb53e Binary files /dev/null and b/pic/Measurement-and-modeling-of-ion-energy-distribution-functions-in-a-low-pressure-argon-plasma-diffusing-from-a-13-56-MHz-helicon-source/image-22.png differ diff --git a/pic/Measurement-and-modeling-of-ion-energy-distribution-functions-in-a-low-pressure-argon-plasma-diffusing-from-a-13-56-MHz-helicon-source/image-23.png b/pic/Measurement-and-modeling-of-ion-energy-distribution-functions-in-a-low-pressure-argon-plasma-diffusing-from-a-13-56-MHz-helicon-source/image-23.png new file mode 100644 index 0000000..dbc7262 Binary files /dev/null and b/pic/Measurement-and-modeling-of-ion-energy-distribution-functions-in-a-low-pressure-argon-plasma-diffusing-from-a-13-56-MHz-helicon-source/image-23.png differ diff --git a/pic/Measurement-and-modeling-of-ion-energy-distribution-functions-in-a-low-pressure-argon-plasma-diffusing-from-a-13-56-MHz-helicon-source/image-24.png b/pic/Measurement-and-modeling-of-ion-energy-distribution-functions-in-a-low-pressure-argon-plasma-diffusing-from-a-13-56-MHz-helicon-source/image-24.png new file mode 100644 index 0000000..5b1decc Binary files /dev/null and b/pic/Measurement-and-modeling-of-ion-energy-distribution-functions-in-a-low-pressure-argon-plasma-diffusing-from-a-13-56-MHz-helicon-source/image-24.png differ diff --git a/pic/Measurement-and-modeling-of-ion-energy-distribution-functions-in-a-low-pressure-argon-plasma-diffusing-from-a-13-56-MHz-helicon-source/image-25.png b/pic/Measurement-and-modeling-of-ion-energy-distribution-functions-in-a-low-pressure-argon-plasma-diffusing-from-a-13-56-MHz-helicon-source/image-25.png new file mode 100644 index 0000000..6ed33cd Binary files /dev/null and b/pic/Measurement-and-modeling-of-ion-energy-distribution-functions-in-a-low-pressure-argon-plasma-diffusing-from-a-13-56-MHz-helicon-source/image-25.png differ diff --git a/pic/Measurement-and-modeling-of-ion-energy-distribution-functions-in-a-low-pressure-argon-plasma-diffusing-from-a-13-56-MHz-helicon-source/image-26.png b/pic/Measurement-and-modeling-of-ion-energy-distribution-functions-in-a-low-pressure-argon-plasma-diffusing-from-a-13-56-MHz-helicon-source/image-26.png new file mode 100644 index 0000000..9243ff7 Binary files /dev/null and b/pic/Measurement-and-modeling-of-ion-energy-distribution-functions-in-a-low-pressure-argon-plasma-diffusing-from-a-13-56-MHz-helicon-source/image-26.png differ diff --git a/pic/Measurement-and-modeling-of-ion-energy-distribution-functions-in-a-low-pressure-argon-plasma-diffusing-from-a-13-56-MHz-helicon-source/image-27.png b/pic/Measurement-and-modeling-of-ion-energy-distribution-functions-in-a-low-pressure-argon-plasma-diffusing-from-a-13-56-MHz-helicon-source/image-27.png new file mode 100644 index 0000000..1bec549 Binary files /dev/null and b/pic/Measurement-and-modeling-of-ion-energy-distribution-functions-in-a-low-pressure-argon-plasma-diffusing-from-a-13-56-MHz-helicon-source/image-27.png differ diff --git a/pic/Measurement-and-modeling-of-ion-energy-distribution-functions-in-a-low-pressure-argon-plasma-diffusing-from-a-13-56-MHz-helicon-source/image-28.png b/pic/Measurement-and-modeling-of-ion-energy-distribution-functions-in-a-low-pressure-argon-plasma-diffusing-from-a-13-56-MHz-helicon-source/image-28.png new file mode 100644 index 0000000..04e6d39 Binary files /dev/null and b/pic/Measurement-and-modeling-of-ion-energy-distribution-functions-in-a-low-pressure-argon-plasma-diffusing-from-a-13-56-MHz-helicon-source/image-28.png differ diff --git a/pic/Modeling-of-profile-effects-for-inductive-helicon-plasma-sources/1688606201806.png b/pic/Modeling-of-profile-effects-for-inductive-helicon-plasma-sources/1688606201806.png new file mode 100644 index 0000000..4bb7640 Binary files /dev/null and b/pic/Modeling-of-profile-effects-for-inductive-helicon-plasma-sources/1688606201806.png differ diff --git a/pic/Modeling-of-profile-effects-for-inductive-helicon-plasma-sources/1688606964366.png b/pic/Modeling-of-profile-effects-for-inductive-helicon-plasma-sources/1688606964366.png new file mode 100644 index 0000000..d1259f4 Binary files /dev/null and b/pic/Modeling-of-profile-effects-for-inductive-helicon-plasma-sources/1688606964366.png differ diff --git a/pic/Modeling-of-profile-effects-for-inductive-helicon-plasma-sources/1688607028636.png b/pic/Modeling-of-profile-effects-for-inductive-helicon-plasma-sources/1688607028636.png new file mode 100644 index 0000000..6743fbb Binary files /dev/null and b/pic/Modeling-of-profile-effects-for-inductive-helicon-plasma-sources/1688607028636.png differ diff --git a/pic/Modeling-of-profile-effects-for-inductive-helicon-plasma-sources/1688608325658.png b/pic/Modeling-of-profile-effects-for-inductive-helicon-plasma-sources/1688608325658.png new file mode 100644 index 0000000..5110901 Binary files /dev/null and b/pic/Modeling-of-profile-effects-for-inductive-helicon-plasma-sources/1688608325658.png differ diff --git a/pic/Modeling-of-profile-effects-for-inductive-helicon-plasma-sources/1688608368528.png b/pic/Modeling-of-profile-effects-for-inductive-helicon-plasma-sources/1688608368528.png new file mode 100644 index 0000000..fe7921d Binary files /dev/null and b/pic/Modeling-of-profile-effects-for-inductive-helicon-plasma-sources/1688608368528.png differ diff --git a/pic/Modeling-of-profile-effects-for-inductive-helicon-plasma-sources/1688646743877.png b/pic/Modeling-of-profile-effects-for-inductive-helicon-plasma-sources/1688646743877.png new file mode 100644 index 0000000..06a4722 Binary files /dev/null and b/pic/Modeling-of-profile-effects-for-inductive-helicon-plasma-sources/1688646743877.png differ diff --git a/pic/Modeling-of-profile-effects-for-inductive-helicon-plasma-sources/1688649961349.png b/pic/Modeling-of-profile-effects-for-inductive-helicon-plasma-sources/1688649961349.png new file mode 100644 index 0000000..80e5563 Binary files /dev/null and b/pic/Modeling-of-profile-effects-for-inductive-helicon-plasma-sources/1688649961349.png differ diff --git a/pic/Modeling-of-profile-effects-for-inductive-helicon-plasma-sources/image-47.png b/pic/Modeling-of-profile-effects-for-inductive-helicon-plasma-sources/image-47.png new file mode 100644 index 0000000..ef82934 Binary files /dev/null and b/pic/Modeling-of-profile-effects-for-inductive-helicon-plasma-sources/image-47.png differ diff --git a/pic/Modeling-of-profile-effects-for-inductive-helicon-plasma-sources/image-48.png b/pic/Modeling-of-profile-effects-for-inductive-helicon-plasma-sources/image-48.png new file mode 100644 index 0000000..5915c09 Binary files /dev/null and b/pic/Modeling-of-profile-effects-for-inductive-helicon-plasma-sources/image-48.png differ diff --git a/pic/Modeling-of-profile-effects-for-inductive-helicon-plasma-sources/image-49.png b/pic/Modeling-of-profile-effects-for-inductive-helicon-plasma-sources/image-49.png new file mode 100644 index 0000000..d129a67 Binary files /dev/null and b/pic/Modeling-of-profile-effects-for-inductive-helicon-plasma-sources/image-49.png differ diff --git a/pic/Modeling-of-profile-effects-for-inductive-helicon-plasma-sources/image-50.png b/pic/Modeling-of-profile-effects-for-inductive-helicon-plasma-sources/image-50.png new file mode 100644 index 0000000..d2670dd Binary files /dev/null and b/pic/Modeling-of-profile-effects-for-inductive-helicon-plasma-sources/image-50.png differ diff --git a/pic/Modeling-of-profile-effects-for-inductive-helicon-plasma-sources/image-51.png b/pic/Modeling-of-profile-effects-for-inductive-helicon-plasma-sources/image-51.png new file mode 100644 index 0000000..a6b5a71 Binary files /dev/null and b/pic/Modeling-of-profile-effects-for-inductive-helicon-plasma-sources/image-51.png differ diff --git a/pic/Modeling-of-profile-effects-for-inductive-helicon-plasma-sources/image-52.png b/pic/Modeling-of-profile-effects-for-inductive-helicon-plasma-sources/image-52.png new file mode 100644 index 0000000..b418430 Binary files /dev/null and b/pic/Modeling-of-profile-effects-for-inductive-helicon-plasma-sources/image-52.png differ diff --git a/pic/Modeling-of-profile-effects-for-inductive-helicon-plasma-sources/image-53.png b/pic/Modeling-of-profile-effects-for-inductive-helicon-plasma-sources/image-53.png new file mode 100644 index 0000000..7ebe925 Binary files /dev/null and b/pic/Modeling-of-profile-effects-for-inductive-helicon-plasma-sources/image-53.png differ diff --git a/pic/Modeling-of-profile-effects-for-inductive-helicon-plasma-sources/image-54.png b/pic/Modeling-of-profile-effects-for-inductive-helicon-plasma-sources/image-54.png new file mode 100644 index 0000000..a05d2c1 Binary files /dev/null and b/pic/Modeling-of-profile-effects-for-inductive-helicon-plasma-sources/image-54.png differ diff --git a/pic/Modeling-of-profile-effects-for-inductive-helicon-plasma-sources/image-55.png b/pic/Modeling-of-profile-effects-for-inductive-helicon-plasma-sources/image-55.png new file mode 100644 index 0000000..a456b69 Binary files /dev/null and b/pic/Modeling-of-profile-effects-for-inductive-helicon-plasma-sources/image-55.png differ diff --git a/pic/Modeling-of-profile-effects-for-inductive-helicon-plasma-sources/image-56.png b/pic/Modeling-of-profile-effects-for-inductive-helicon-plasma-sources/image-56.png new file mode 100644 index 0000000..2282c34 Binary files /dev/null and b/pic/Modeling-of-profile-effects-for-inductive-helicon-plasma-sources/image-56.png differ diff --git a/pic/Modeling-of-profile-effects-for-inductive-helicon-plasma-sources/image-57.png b/pic/Modeling-of-profile-effects-for-inductive-helicon-plasma-sources/image-57.png new file mode 100644 index 0000000..2518e76 Binary files /dev/null and b/pic/Modeling-of-profile-effects-for-inductive-helicon-plasma-sources/image-57.png differ diff --git a/pic/Modeling-of-profile-effects-for-inductive-helicon-plasma-sources/image-58.png b/pic/Modeling-of-profile-effects-for-inductive-helicon-plasma-sources/image-58.png new file mode 100644 index 0000000..0a9e225 Binary files /dev/null and b/pic/Modeling-of-profile-effects-for-inductive-helicon-plasma-sources/image-58.png differ diff --git a/pic/Modeling-of-profile-effects-for-inductive-helicon-plasma-sources/image-59.png b/pic/Modeling-of-profile-effects-for-inductive-helicon-plasma-sources/image-59.png new file mode 100644 index 0000000..3860ccd Binary files /dev/null and b/pic/Modeling-of-profile-effects-for-inductive-helicon-plasma-sources/image-59.png differ diff --git a/pic/Modeling-of-profile-effects-for-inductive-helicon-plasma-sources/image-60.png b/pic/Modeling-of-profile-effects-for-inductive-helicon-plasma-sources/image-60.png new file mode 100644 index 0000000..69e99f4 Binary files /dev/null and b/pic/Modeling-of-profile-effects-for-inductive-helicon-plasma-sources/image-60.png differ diff --git a/pic/Modeling-of-profile-effects-for-inductive-helicon-plasma-sources/image-61.png b/pic/Modeling-of-profile-effects-for-inductive-helicon-plasma-sources/image-61.png new file mode 100644 index 0000000..0727fe8 Binary files /dev/null and b/pic/Modeling-of-profile-effects-for-inductive-helicon-plasma-sources/image-61.png differ diff --git a/pic/Modeling-of-profile-effects-for-inductive-helicon-plasma-sources/image-62.png b/pic/Modeling-of-profile-effects-for-inductive-helicon-plasma-sources/image-62.png new file mode 100644 index 0000000..4f3069e Binary files /dev/null and b/pic/Modeling-of-profile-effects-for-inductive-helicon-plasma-sources/image-62.png differ diff --git a/pic/Modeling-of-profile-effects-for-inductive-helicon-plasma-sources/image-63.png b/pic/Modeling-of-profile-effects-for-inductive-helicon-plasma-sources/image-63.png new file mode 100644 index 0000000..9c407fc Binary files /dev/null and b/pic/Modeling-of-profile-effects-for-inductive-helicon-plasma-sources/image-63.png differ diff --git a/pic/Modeling-of-profile-effects-for-inductive-helicon-plasma-sources/image-64.png b/pic/Modeling-of-profile-effects-for-inductive-helicon-plasma-sources/image-64.png new file mode 100644 index 0000000..27c0e0a Binary files /dev/null and b/pic/Modeling-of-profile-effects-for-inductive-helicon-plasma-sources/image-64.png differ diff --git a/pic/Modeling-of-profile-effects-for-inductive-helicon-plasma-sources/image-65.png b/pic/Modeling-of-profile-effects-for-inductive-helicon-plasma-sources/image-65.png new file mode 100644 index 0000000..4723bb4 Binary files /dev/null and b/pic/Modeling-of-profile-effects-for-inductive-helicon-plasma-sources/image-65.png differ diff --git a/pic/Modeling-of-profile-effects-for-inductive-helicon-plasma-sources/image-66.png b/pic/Modeling-of-profile-effects-for-inductive-helicon-plasma-sources/image-66.png new file mode 100644 index 0000000..be91ad9 Binary files /dev/null and b/pic/Modeling-of-profile-effects-for-inductive-helicon-plasma-sources/image-66.png differ diff --git a/pic/Modeling-of-profile-effects-for-inductive-helicon-plasma-sources/image-67.png b/pic/Modeling-of-profile-effects-for-inductive-helicon-plasma-sources/image-67.png new file mode 100644 index 0000000..f213a89 Binary files /dev/null and b/pic/Modeling-of-profile-effects-for-inductive-helicon-plasma-sources/image-67.png differ diff --git a/pic/Modeling-of-profile-effects-for-inductive-helicon-plasma-sources/image-68.png b/pic/Modeling-of-profile-effects-for-inductive-helicon-plasma-sources/image-68.png new file mode 100644 index 0000000..0339df1 Binary files /dev/null and b/pic/Modeling-of-profile-effects-for-inductive-helicon-plasma-sources/image-68.png differ diff --git a/pic/Modeling-of-profile-effects-for-inductive-helicon-plasma-sources/image-69.png b/pic/Modeling-of-profile-effects-for-inductive-helicon-plasma-sources/image-69.png new file mode 100644 index 0000000..cb4fcf1 Binary files /dev/null and b/pic/Modeling-of-profile-effects-for-inductive-helicon-plasma-sources/image-69.png differ diff --git a/pic/Modeling-of-profile-effects-for-inductive-helicon-plasma-sources/image-70.png b/pic/Modeling-of-profile-effects-for-inductive-helicon-plasma-sources/image-70.png new file mode 100644 index 0000000..0cc0d8e Binary files /dev/null and b/pic/Modeling-of-profile-effects-for-inductive-helicon-plasma-sources/image-70.png differ diff --git a/pic/Modeling-of-profile-effects-for-inductive-helicon-plasma-sources/image-71.png b/pic/Modeling-of-profile-effects-for-inductive-helicon-plasma-sources/image-71.png new file mode 100644 index 0000000..f2d13d7 Binary files /dev/null and b/pic/Modeling-of-profile-effects-for-inductive-helicon-plasma-sources/image-71.png differ diff --git a/pic/Modeling-of-profile-effects-for-inductive-helicon-plasma-sources/image-72.png b/pic/Modeling-of-profile-effects-for-inductive-helicon-plasma-sources/image-72.png new file mode 100644 index 0000000..dd5e203 Binary files /dev/null and b/pic/Modeling-of-profile-effects-for-inductive-helicon-plasma-sources/image-72.png differ diff --git a/pic/Radio-Frequency-Excited-Plasma-Discharge-Simulation-for-Potential-Helicon-Plasma-Thruster/295269660622400.png b/pic/Radio-Frequency-Excited-Plasma-Discharge-Simulation-for-Potential-Helicon-Plasma-Thruster/295269660622400.png new file mode 100644 index 0000000..163c39a Binary files /dev/null and b/pic/Radio-Frequency-Excited-Plasma-Discharge-Simulation-for-Potential-Helicon-Plasma-Thruster/295269660622400.png differ diff --git a/pic/Radio-Frequency-Excited-Plasma-Discharge-Simulation-for-Potential-Helicon-Plasma-Thruster/296044033346700.png b/pic/Radio-Frequency-Excited-Plasma-Discharge-Simulation-for-Potential-Helicon-Plasma-Thruster/296044033346700.png new file mode 100644 index 0000000..11701fb Binary files /dev/null and b/pic/Radio-Frequency-Excited-Plasma-Discharge-Simulation-for-Potential-Helicon-Plasma-Thruster/296044033346700.png differ diff --git a/pic/Radio-Frequency-Excited-Plasma-Discharge-Simulation-for-Potential-Helicon-Plasma-Thruster/296304218911400.png b/pic/Radio-Frequency-Excited-Plasma-Discharge-Simulation-for-Potential-Helicon-Plasma-Thruster/296304218911400.png new file mode 100644 index 0000000..dbf617d Binary files /dev/null and b/pic/Radio-Frequency-Excited-Plasma-Discharge-Simulation-for-Potential-Helicon-Plasma-Thruster/296304218911400.png differ diff --git a/pic/Radio-Frequency-Excited-Plasma-Discharge-Simulation-for-Potential-Helicon-Plasma-Thruster/296350811008800.png b/pic/Radio-Frequency-Excited-Plasma-Discharge-Simulation-for-Potential-Helicon-Plasma-Thruster/296350811008800.png new file mode 100644 index 0000000..4f944a5 Binary files /dev/null and b/pic/Radio-Frequency-Excited-Plasma-Discharge-Simulation-for-Potential-Helicon-Plasma-Thruster/296350811008800.png differ diff --git a/pic/Radio-Frequency-Excited-Plasma-Discharge-Simulation-for-Potential-Helicon-Plasma-Thruster/296407943786100.png b/pic/Radio-Frequency-Excited-Plasma-Discharge-Simulation-for-Potential-Helicon-Plasma-Thruster/296407943786100.png new file mode 100644 index 0000000..96022cc Binary files /dev/null and b/pic/Radio-Frequency-Excited-Plasma-Discharge-Simulation-for-Potential-Helicon-Plasma-Thruster/296407943786100.png differ diff --git a/pic/Radio-Frequency-Excited-Plasma-Discharge-Simulation-for-Potential-Helicon-Plasma-Thruster/296528207264600.png b/pic/Radio-Frequency-Excited-Plasma-Discharge-Simulation-for-Potential-Helicon-Plasma-Thruster/296528207264600.png new file mode 100644 index 0000000..a7355cf Binary files /dev/null and b/pic/Radio-Frequency-Excited-Plasma-Discharge-Simulation-for-Potential-Helicon-Plasma-Thruster/296528207264600.png differ diff --git a/pic/Radio-Frequency-Excited-Plasma-Discharge-Simulation-for-Potential-Helicon-Plasma-Thruster/296543468580400.png b/pic/Radio-Frequency-Excited-Plasma-Discharge-Simulation-for-Potential-Helicon-Plasma-Thruster/296543468580400.png new file mode 100644 index 0000000..827c2dd Binary files /dev/null and b/pic/Radio-Frequency-Excited-Plasma-Discharge-Simulation-for-Potential-Helicon-Plasma-Thruster/296543468580400.png differ diff --git a/pic/Radio-Frequency-Excited-Plasma-Discharge-Simulation-for-Potential-Helicon-Plasma-Thruster/296700142481800.png b/pic/Radio-Frequency-Excited-Plasma-Discharge-Simulation-for-Potential-Helicon-Plasma-Thruster/296700142481800.png new file mode 100644 index 0000000..ffcb866 Binary files /dev/null and b/pic/Radio-Frequency-Excited-Plasma-Discharge-Simulation-for-Potential-Helicon-Plasma-Thruster/296700142481800.png differ diff --git a/pic/Radio-Frequency-Excited-Plasma-Discharge-Simulation-for-Potential-Helicon-Plasma-Thruster/296724032807600.png b/pic/Radio-Frequency-Excited-Plasma-Discharge-Simulation-for-Potential-Helicon-Plasma-Thruster/296724032807600.png new file mode 100644 index 0000000..05d4d59 Binary files /dev/null and b/pic/Radio-Frequency-Excited-Plasma-Discharge-Simulation-for-Potential-Helicon-Plasma-Thruster/296724032807600.png differ diff --git a/pic/Radio-Frequency-Excited-Plasma-Discharge-Simulation-for-Potential-Helicon-Plasma-Thruster/296738794008700.png b/pic/Radio-Frequency-Excited-Plasma-Discharge-Simulation-for-Potential-Helicon-Plasma-Thruster/296738794008700.png new file mode 100644 index 0000000..cd3cf7a Binary files /dev/null and b/pic/Radio-Frequency-Excited-Plasma-Discharge-Simulation-for-Potential-Helicon-Plasma-Thruster/296738794008700.png differ diff --git a/pic/Radio-Frequency-Excited-Plasma-Discharge-Simulation-for-Potential-Helicon-Plasma-Thruster/297109048683300.png b/pic/Radio-Frequency-Excited-Plasma-Discharge-Simulation-for-Potential-Helicon-Plasma-Thruster/297109048683300.png new file mode 100644 index 0000000..64a14b8 Binary files /dev/null and b/pic/Radio-Frequency-Excited-Plasma-Discharge-Simulation-for-Potential-Helicon-Plasma-Thruster/297109048683300.png differ diff --git a/pic/Radio-Frequency-Excited-Plasma-Discharge-Simulation-for-Potential-Helicon-Plasma-Thruster/297129282756800.png b/pic/Radio-Frequency-Excited-Plasma-Discharge-Simulation-for-Potential-Helicon-Plasma-Thruster/297129282756800.png new file mode 100644 index 0000000..e48e318 Binary files /dev/null and b/pic/Radio-Frequency-Excited-Plasma-Discharge-Simulation-for-Potential-Helicon-Plasma-Thruster/297129282756800.png differ diff --git a/pic/Radio-Frequency-Excited-Plasma-Discharge-Simulation-for-Potential-Helicon-Plasma-Thruster/297159087542300.png b/pic/Radio-Frequency-Excited-Plasma-Discharge-Simulation-for-Potential-Helicon-Plasma-Thruster/297159087542300.png new file mode 100644 index 0000000..1e87538 Binary files /dev/null and b/pic/Radio-Frequency-Excited-Plasma-Discharge-Simulation-for-Potential-Helicon-Plasma-Thruster/297159087542300.png differ diff --git a/pic/Radio-Frequency-Excited-Plasma-Discharge-Simulation-for-Potential-Helicon-Plasma-Thruster/297181176570800.png b/pic/Radio-Frequency-Excited-Plasma-Discharge-Simulation-for-Potential-Helicon-Plasma-Thruster/297181176570800.png new file mode 100644 index 0000000..f5dd3b9 Binary files /dev/null and b/pic/Radio-Frequency-Excited-Plasma-Discharge-Simulation-for-Potential-Helicon-Plasma-Thruster/297181176570800.png differ diff --git a/pic/Radio-Frequency-Excited-Plasma-Discharge-Simulation-for-Potential-Helicon-Plasma-Thruster/297206113418100.png b/pic/Radio-Frequency-Excited-Plasma-Discharge-Simulation-for-Potential-Helicon-Plasma-Thruster/297206113418100.png new file mode 100644 index 0000000..58f15fd Binary files /dev/null and b/pic/Radio-Frequency-Excited-Plasma-Discharge-Simulation-for-Potential-Helicon-Plasma-Thruster/297206113418100.png differ diff --git a/pic/Radio-Frequency-Excited-Plasma-Discharge-Simulation-for-Potential-Helicon-Plasma-Thruster/297263457546800.png b/pic/Radio-Frequency-Excited-Plasma-Discharge-Simulation-for-Potential-Helicon-Plasma-Thruster/297263457546800.png new file mode 100644 index 0000000..ad98402 Binary files /dev/null and b/pic/Radio-Frequency-Excited-Plasma-Discharge-Simulation-for-Potential-Helicon-Plasma-Thruster/297263457546800.png differ diff --git a/pic/Radio-Frequency-Excited-Plasma-Discharge-Simulation-for-Potential-Helicon-Plasma-Thruster/297294527937200.png b/pic/Radio-Frequency-Excited-Plasma-Discharge-Simulation-for-Potential-Helicon-Plasma-Thruster/297294527937200.png new file mode 100644 index 0000000..34ee04c Binary files /dev/null and b/pic/Radio-Frequency-Excited-Plasma-Discharge-Simulation-for-Potential-Helicon-Plasma-Thruster/297294527937200.png differ diff --git a/pic/Radio-Frequency-Excited-Plasma-Discharge-Simulation-for-Potential-Helicon-Plasma-Thruster/297348063168700.png b/pic/Radio-Frequency-Excited-Plasma-Discharge-Simulation-for-Potential-Helicon-Plasma-Thruster/297348063168700.png new file mode 100644 index 0000000..e42190e Binary files /dev/null and b/pic/Radio-Frequency-Excited-Plasma-Discharge-Simulation-for-Potential-Helicon-Plasma-Thruster/297348063168700.png differ diff --git a/pic/Radio-Frequency-Excited-Plasma-Discharge-Simulation-for-Potential-Helicon-Plasma-Thruster/297390222055000.png b/pic/Radio-Frequency-Excited-Plasma-Discharge-Simulation-for-Potential-Helicon-Plasma-Thruster/297390222055000.png new file mode 100644 index 0000000..ca628ff Binary files /dev/null and b/pic/Radio-Frequency-Excited-Plasma-Discharge-Simulation-for-Potential-Helicon-Plasma-Thruster/297390222055000.png differ diff --git a/pic/about/3.jpg b/pic/about/3.jpg new file mode 100644 index 0000000..52a9039 Binary files /dev/null and b/pic/about/3.jpg differ diff --git a/pic/about/me.jpg b/pic/about/me.jpg new file mode 100644 index 0000000..1b6480e Binary files /dev/null and b/pic/about/me.jpg differ diff --git a/pic/avatar.png b/pic/avatar.png new file mode 100644 index 0000000..b40a52a Binary files /dev/null and b/pic/avatar.png differ diff --git a/pic/image-1.png b/pic/image-1.png new file mode 100644 index 0000000..c71f499 Binary files /dev/null and b/pic/image-1.png differ diff --git a/pic/image-2.png b/pic/image-2.png new file mode 100644 index 0000000..197354e Binary files /dev/null and b/pic/image-2.png differ diff --git a/pic/image-3.png b/pic/image-3.png new file mode 100644 index 0000000..34129ff Binary files /dev/null and b/pic/image-3.png differ diff --git a/pic/image.png b/pic/image.png new file mode 100644 index 0000000..b8d74c4 Binary files /dev/null and b/pic/image.png differ diff --git a/pic/image1.png b/pic/image1.png new file mode 100644 index 0000000..fe5ad98 Binary files /dev/null and b/pic/image1.png differ diff --git a/pic/image2.png b/pic/image2.png new file mode 100644 index 0000000..ca9754a Binary files /dev/null and b/pic/image2.png differ diff --git a/pic/image3.png b/pic/image3.png new file mode 100644 index 0000000..e19d956 Binary files /dev/null and b/pic/image3.png differ diff --git a/pic/image4.png b/pic/image4.png new file mode 100644 index 0000000..7b3f16c Binary files /dev/null and b/pic/image4.png differ diff --git a/pic/index.html b/pic/index.html new file mode 100644 index 0000000..8571c64 --- /dev/null +++ b/pic/index.html @@ -0,0 +1,170 @@ +pic | SHYEE-PLASMA + + + + + + + + + +
    \ No newline at end of file diff --git "a/pic/mybatis\347\274\223\345\255\230/QQ\345\233\276\347\211\20720200403114936.png" "b/pic/mybatis\347\274\223\345\255\230/QQ\345\233\276\347\211\20720200403114936.png" new file mode 100644 index 0000000..96926f2 Binary files /dev/null and "b/pic/mybatis\347\274\223\345\255\230/QQ\345\233\276\347\211\20720200403114936.png" differ diff --git "a/pic/mybatis\347\274\223\345\255\230/QQ\345\233\276\347\211\20720200403115141.png" "b/pic/mybatis\347\274\223\345\255\230/QQ\345\233\276\347\211\20720200403115141.png" new file mode 100644 index 0000000..6f20415 Binary files /dev/null and "b/pic/mybatis\347\274\223\345\255\230/QQ\345\233\276\347\211\20720200403115141.png" differ diff --git "a/pic/mybatis\347\274\223\345\255\230/image-20200331082951809.png" "b/pic/mybatis\347\274\223\345\255\230/image-20200331082951809.png" new file mode 100644 index 0000000..12bbaa2 Binary files /dev/null and "b/pic/mybatis\347\274\223\345\255\230/image-20200331082951809.png" differ diff --git "a/pic/mybatis\347\274\223\345\255\230/image-20200331084348373.png" "b/pic/mybatis\347\274\223\345\255\230/image-20200331084348373.png" new file mode 100644 index 0000000..89a4886 Binary files /dev/null and "b/pic/mybatis\347\274\223\345\255\230/image-20200331084348373.png" differ diff --git "a/pic/mybatis\347\274\223\345\255\230/image-20200403083419597.png" "b/pic/mybatis\347\274\223\345\255\230/image-20200403083419597.png" new file mode 100644 index 0000000..17150c5 Binary files /dev/null and "b/pic/mybatis\347\274\223\345\255\230/image-20200403083419597.png" differ diff --git "a/pic/mybatis\347\274\223\345\255\230/image-20200403084433782.png" "b/pic/mybatis\347\274\223\345\255\230/image-20200403084433782.png" new file mode 100644 index 0000000..af882e0 Binary files /dev/null and "b/pic/mybatis\347\274\223\345\255\230/image-20200403084433782.png" differ diff --git "a/pic/mybatis\347\274\223\345\255\230/image-20200403084542715.png" "b/pic/mybatis\347\274\223\345\255\230/image-20200403084542715.png" new file mode 100644 index 0000000..b5cac29 Binary files /dev/null and "b/pic/mybatis\347\274\223\345\255\230/image-20200403084542715.png" differ diff --git "a/pic/mybatis\347\274\223\345\255\230/image-20200526090050002.png" "b/pic/mybatis\347\274\223\345\255\230/image-20200526090050002.png" new file mode 100644 index 0000000..644829b Binary files /dev/null and "b/pic/mybatis\347\274\223\345\255\230/image-20200526090050002.png" differ diff --git "a/pic/mybatis\347\274\223\345\255\230/image-20200528092519700.png" "b/pic/mybatis\347\274\223\345\255\230/image-20200528092519700.png" new file mode 100644 index 0000000..d90c704 Binary files /dev/null and "b/pic/mybatis\347\274\223\345\255\230/image-20200528092519700.png" differ diff --git "a/pic/mybatis\347\274\223\345\255\230/image-20210123154134146.png" "b/pic/mybatis\347\274\223\345\255\230/image-20210123154134146.png" new file mode 100644 index 0000000..582d11d Binary files /dev/null and "b/pic/mybatis\347\274\223\345\255\230/image-20210123154134146.png" differ diff --git "a/pic/mybatis\347\274\223\345\255\230/image-20210123222410984.png" "b/pic/mybatis\347\274\223\345\255\230/image-20210123222410984.png" new file mode 100644 index 0000000..9940624 Binary files /dev/null and "b/pic/mybatis\347\274\223\345\255\230/image-20210123222410984.png" differ diff --git "a/pic/mybatis\347\274\223\345\255\230/image-20210129170554037.png" "b/pic/mybatis\347\274\223\345\255\230/image-20210129170554037.png" new file mode 100644 index 0000000..53dbb50 Binary files /dev/null and "b/pic/mybatis\347\274\223\345\255\230/image-20210129170554037.png" differ diff --git "a/pic/mybatis\347\274\223\345\255\230/image-20210131195633439.png" "b/pic/mybatis\347\274\223\345\255\230/image-20210131195633439.png" new file mode 100644 index 0000000..3c33c57 Binary files /dev/null and "b/pic/mybatis\347\274\223\345\255\230/image-20210131195633439.png" differ diff --git "a/pic/\345\215\225\344\272\244\346\215\242\346\234\272\345\260\217\345\256\236\351\252\214/image-20200313092558995.png" "b/pic/\345\215\225\344\272\244\346\215\242\346\234\272\345\260\217\345\256\236\351\252\214/image-20200313092558995.png" new file mode 100644 index 0000000..24e0c88 Binary files /dev/null and "b/pic/\345\215\225\344\272\244\346\215\242\346\234\272\345\260\217\345\256\236\351\252\214/image-20200313092558995.png" differ diff --git "a/pic/\345\215\225\344\272\244\346\215\242\346\234\272\345\260\217\345\256\236\351\252\214/image-20200313092658988.png" "b/pic/\345\215\225\344\272\244\346\215\242\346\234\272\345\260\217\345\256\236\351\252\214/image-20200313092658988.png" new file mode 100644 index 0000000..1a2db08 Binary files /dev/null and "b/pic/\345\215\225\344\272\244\346\215\242\346\234\272\345\260\217\345\256\236\351\252\214/image-20200313092658988.png" differ diff --git "a/pic/\345\215\225\344\272\244\346\215\242\346\234\272\345\260\217\345\256\236\351\252\214/image-20200313092729040.png" "b/pic/\345\215\225\344\272\244\346\215\242\346\234\272\345\260\217\345\256\236\351\252\214/image-20200313092729040.png" new file mode 100644 index 0000000..00f3764 Binary files /dev/null and "b/pic/\345\215\225\344\272\244\346\215\242\346\234\272\345\260\217\345\256\236\351\252\214/image-20200313092729040.png" differ diff --git "a/pic/\345\215\225\344\272\244\346\215\242\346\234\272\345\260\217\345\256\236\351\252\214/image-20200313092819248.png" "b/pic/\345\215\225\344\272\244\346\215\242\346\234\272\345\260\217\345\256\236\351\252\214/image-20200313092819248.png" new file mode 100644 index 0000000..93cee48 Binary files /dev/null and "b/pic/\345\215\225\344\272\244\346\215\242\346\234\272\345\260\217\345\256\236\351\252\214/image-20200313092819248.png" differ diff --git "a/pic/\345\215\225\344\272\244\346\215\242\346\234\272\345\260\217\345\256\236\351\252\214/image-20200313092849139.png" "b/pic/\345\215\225\344\272\244\346\215\242\346\234\272\345\260\217\345\256\236\351\252\214/image-20200313092849139.png" new file mode 100644 index 0000000..27471ee Binary files /dev/null and "b/pic/\345\215\225\344\272\244\346\215\242\346\234\272\345\260\217\345\256\236\351\252\214/image-20200313092849139.png" differ diff --git "a/pic/\345\215\225\344\272\244\346\215\242\346\234\272\345\260\217\345\256\236\351\252\214/image-20200313093238525.png" "b/pic/\345\215\225\344\272\244\346\215\242\346\234\272\345\260\217\345\256\236\351\252\214/image-20200313093238525.png" new file mode 100644 index 0000000..52da689 Binary files /dev/null and "b/pic/\345\215\225\344\272\244\346\215\242\346\234\272\345\260\217\345\256\236\351\252\214/image-20200313093238525.png" differ diff --git "a/pic/\345\215\225\344\272\244\346\215\242\346\234\272\345\260\217\345\256\236\351\252\214/image-20200313093341917.png" "b/pic/\345\215\225\344\272\244\346\215\242\346\234\272\345\260\217\345\256\236\351\252\214/image-20200313093341917.png" new file mode 100644 index 0000000..8991253 Binary files /dev/null and "b/pic/\345\215\225\344\272\244\346\215\242\346\234\272\345\260\217\345\256\236\351\252\214/image-20200313093341917.png" differ diff --git "a/pic/\345\215\225\344\272\244\346\215\242\346\234\272\345\260\217\345\256\236\351\252\214/image-20200313093416948.png" "b/pic/\345\215\225\344\272\244\346\215\242\346\234\272\345\260\217\345\256\236\351\252\214/image-20200313093416948.png" new file mode 100644 index 0000000..f70b132 Binary files /dev/null and "b/pic/\345\215\225\344\272\244\346\215\242\346\234\272\345\260\217\345\256\236\351\252\214/image-20200313093416948.png" differ diff --git "a/pic/\345\215\225\344\272\244\346\215\242\346\234\272\345\260\217\345\256\236\351\252\214/image-20200313094123758.png" "b/pic/\345\215\225\344\272\244\346\215\242\346\234\272\345\260\217\345\256\236\351\252\214/image-20200313094123758.png" new file mode 100644 index 0000000..363eefb Binary files /dev/null and "b/pic/\345\215\225\344\272\244\346\215\242\346\234\272\345\260\217\345\256\236\351\252\214/image-20200313094123758.png" differ diff --git "a/pic/\345\215\225\344\272\244\346\215\242\346\234\272\345\260\217\345\256\236\351\252\214/image-20200313095215588.png" "b/pic/\345\215\225\344\272\244\346\215\242\346\234\272\345\260\217\345\256\236\351\252\214/image-20200313095215588.png" new file mode 100644 index 0000000..e2f2459 Binary files /dev/null and "b/pic/\345\215\225\344\272\244\346\215\242\346\234\272\345\260\217\345\256\236\351\252\214/image-20200313095215588.png" differ diff --git "a/pic/\345\246\202\344\275\225\345\205\263306\347\232\204\346\260\264\346\260\224/IMG_20230513_110026.jpg" "b/pic/\345\246\202\344\275\225\345\205\263306\347\232\204\346\260\264\346\260\224/IMG_20230513_110026.jpg" new file mode 100644 index 0000000..d246afc Binary files /dev/null and "b/pic/\345\246\202\344\275\225\345\205\263306\347\232\204\346\260\264\346\260\224/IMG_20230513_110026.jpg" differ diff --git "a/pic/\345\246\202\344\275\225\345\205\263306\347\232\204\346\260\264\346\260\224/IMG_20230513_110053.jpg" "b/pic/\345\246\202\344\275\225\345\205\263306\347\232\204\346\260\264\346\260\224/IMG_20230513_110053.jpg" new file mode 100644 index 0000000..0b62345 Binary files /dev/null and "b/pic/\345\246\202\344\275\225\345\205\263306\347\232\204\346\260\264\346\260\224/IMG_20230513_110053.jpg" differ diff --git "a/pic/\345\246\202\344\275\225\345\205\263306\347\232\204\346\260\264\346\260\224/image-1.png" "b/pic/\345\246\202\344\275\225\345\205\263306\347\232\204\346\260\264\346\260\224/image-1.png" new file mode 100644 index 0000000..607d1e5 Binary files /dev/null and "b/pic/\345\246\202\344\275\225\345\205\263306\347\232\204\346\260\264\346\260\224/image-1.png" differ diff --git "a/pic/\345\246\202\344\275\225\345\205\263306\347\232\204\346\260\264\346\260\224/image-2.png" "b/pic/\345\246\202\344\275\225\345\205\263306\347\232\204\346\260\264\346\260\224/image-2.png" new file mode 100644 index 0000000..006c1d0 Binary files /dev/null and "b/pic/\345\246\202\344\275\225\345\205\263306\347\232\204\346\260\264\346\260\224/image-2.png" differ diff --git "a/pic/\345\246\202\344\275\225\345\205\263306\347\232\204\346\260\264\346\260\224/image.png" "b/pic/\345\246\202\344\275\225\345\205\263306\347\232\204\346\260\264\346\260\224/image.png" new file mode 100644 index 0000000..8819d5c Binary files /dev/null and "b/pic/\345\246\202\344\275\225\345\205\263306\347\232\204\346\260\264\346\260\224/image.png" differ diff --git "a/pic/\345\255\246\344\271\240pandas-\344\273\216kaggle\344\270\212/55173134486000.png" "b/pic/\345\255\246\344\271\240pandas-\344\273\216kaggle\344\270\212/55173134486000.png" new file mode 100644 index 0000000..644c906 Binary files /dev/null and "b/pic/\345\255\246\344\271\240pandas-\344\273\216kaggle\344\270\212/55173134486000.png" differ diff --git "a/pic/\346\231\256\346\236\227\346\226\257\351\241\277\347\255\211\347\246\273\345\255\220\344\275\223\350\257\276/image-17.png" "b/pic/\346\231\256\346\236\227\346\226\257\351\241\277\347\255\211\347\246\273\345\255\220\344\275\223\350\257\276/image-17.png" new file mode 100644 index 0000000..dd7b1bf Binary files /dev/null and "b/pic/\346\231\256\346\236\227\346\226\257\351\241\277\347\255\211\347\246\273\345\255\220\344\275\223\350\257\276/image-17.png" differ diff --git "a/pic/\346\231\256\346\236\227\346\226\257\351\241\277\347\255\211\347\246\273\345\255\220\344\275\223\350\257\276/image-18.png" "b/pic/\346\231\256\346\236\227\346\226\257\351\241\277\347\255\211\347\246\273\345\255\220\344\275\223\350\257\276/image-18.png" new file mode 100644 index 0000000..261598d Binary files /dev/null and "b/pic/\346\231\256\346\236\227\346\226\257\351\241\277\347\255\211\347\246\273\345\255\220\344\275\223\350\257\276/image-18.png" differ diff --git "a/pic/\346\231\256\346\236\227\346\226\257\351\241\277\347\255\211\347\246\273\345\255\220\344\275\223\350\257\276/image-19.png" "b/pic/\346\231\256\346\236\227\346\226\257\351\241\277\347\255\211\347\246\273\345\255\220\344\275\223\350\257\276/image-19.png" new file mode 100644 index 0000000..d663d48 Binary files /dev/null and "b/pic/\346\231\256\346\236\227\346\226\257\351\241\277\347\255\211\347\246\273\345\255\220\344\275\223\350\257\276/image-19.png" differ diff --git "a/pic/\346\231\256\346\236\227\346\226\257\351\241\277\347\255\211\347\246\273\345\255\220\344\275\223\350\257\276/image-20.png" "b/pic/\346\231\256\346\236\227\346\226\257\351\241\277\347\255\211\347\246\273\345\255\220\344\275\223\350\257\276/image-20.png" new file mode 100644 index 0000000..58d10df Binary files /dev/null and "b/pic/\346\231\256\346\236\227\346\226\257\351\241\277\347\255\211\347\246\273\345\255\220\344\275\223\350\257\276/image-20.png" differ diff --git "a/pic/\346\231\256\346\236\227\346\226\257\351\241\277\347\255\211\347\246\273\345\255\220\344\275\223\350\257\276/image-21.png" "b/pic/\346\231\256\346\236\227\346\226\257\351\241\277\347\255\211\347\246\273\345\255\220\344\275\223\350\257\276/image-21.png" new file mode 100644 index 0000000..1cd7702 Binary files /dev/null and "b/pic/\346\231\256\346\236\227\346\226\257\351\241\277\347\255\211\347\246\273\345\255\220\344\275\223\350\257\276/image-21.png" differ diff --git "a/pic/\346\231\256\346\236\227\346\226\257\351\241\277\347\255\211\347\246\273\345\255\220\344\275\223\350\257\276/image-22.png" "b/pic/\346\231\256\346\236\227\346\226\257\351\241\277\347\255\211\347\246\273\345\255\220\344\275\223\350\257\276/image-22.png" new file mode 100644 index 0000000..a4a819c Binary files /dev/null and "b/pic/\346\231\256\346\236\227\346\226\257\351\241\277\347\255\211\347\246\273\345\255\220\344\275\223\350\257\276/image-22.png" differ diff --git "a/pic/\346\231\256\346\236\227\346\226\257\351\241\277\347\255\211\347\246\273\345\255\220\344\275\223\350\257\276/image-23.png" "b/pic/\346\231\256\346\236\227\346\226\257\351\241\277\347\255\211\347\246\273\345\255\220\344\275\223\350\257\276/image-23.png" new file mode 100644 index 0000000..6b8d78d Binary files /dev/null and "b/pic/\346\231\256\346\236\227\346\226\257\351\241\277\347\255\211\347\246\273\345\255\220\344\275\223\350\257\276/image-23.png" differ diff --git "a/pic/\346\231\256\346\236\227\346\226\257\351\241\277\347\255\211\347\246\273\345\255\220\344\275\223\350\257\276/image-24.png" "b/pic/\346\231\256\346\236\227\346\226\257\351\241\277\347\255\211\347\246\273\345\255\220\344\275\223\350\257\276/image-24.png" new file mode 100644 index 0000000..46a8bee Binary files /dev/null and "b/pic/\346\231\256\346\236\227\346\226\257\351\241\277\347\255\211\347\246\273\345\255\220\344\275\223\350\257\276/image-24.png" differ diff --git "a/pic/\346\231\256\346\236\227\346\226\257\351\241\277\347\255\211\347\246\273\345\255\220\344\275\223\350\257\276/image-25.png" "b/pic/\346\231\256\346\236\227\346\226\257\351\241\277\347\255\211\347\246\273\345\255\220\344\275\223\350\257\276/image-25.png" new file mode 100644 index 0000000..a5ffc59 Binary files /dev/null and "b/pic/\346\231\256\346\236\227\346\226\257\351\241\277\347\255\211\347\246\273\345\255\220\344\275\223\350\257\276/image-25.png" differ diff --git "a/pic/\346\231\256\346\236\227\346\226\257\351\241\277\347\255\211\347\246\273\345\255\220\344\275\223\350\257\276/image-26.png" "b/pic/\346\231\256\346\236\227\346\226\257\351\241\277\347\255\211\347\246\273\345\255\220\344\275\223\350\257\276/image-26.png" new file mode 100644 index 0000000..aa53041 Binary files /dev/null and "b/pic/\346\231\256\346\236\227\346\226\257\351\241\277\347\255\211\347\246\273\345\255\220\344\275\223\350\257\276/image-26.png" differ diff --git "a/pic/\346\231\256\346\236\227\346\226\257\351\241\277\347\255\211\347\246\273\345\255\220\344\275\223\350\257\276/image-27.png" "b/pic/\346\231\256\346\236\227\346\226\257\351\241\277\347\255\211\347\246\273\345\255\220\344\275\223\350\257\276/image-27.png" new file mode 100644 index 0000000..d7f1cde Binary files /dev/null and "b/pic/\346\231\256\346\236\227\346\226\257\351\241\277\347\255\211\347\246\273\345\255\220\344\275\223\350\257\276/image-27.png" differ diff --git "a/pic/\346\231\256\346\236\227\346\226\257\351\241\277\347\255\211\347\246\273\345\255\220\344\275\223\350\257\276/image-28.png" "b/pic/\346\231\256\346\236\227\346\226\257\351\241\277\347\255\211\347\246\273\345\255\220\344\275\223\350\257\276/image-28.png" new file mode 100644 index 0000000..55c74cf Binary files /dev/null and "b/pic/\346\231\256\346\236\227\346\226\257\351\241\277\347\255\211\347\246\273\345\255\220\344\275\223\350\257\276/image-28.png" differ diff --git "a/pic/\347\246\273\346\225\243\346\225\260\345\255\246/image-20220113104324776.png" "b/pic/\347\246\273\346\225\243\346\225\260\345\255\246/image-20220113104324776.png" new file mode 100644 index 0000000..11c16a5 Binary files /dev/null and "b/pic/\347\246\273\346\225\243\346\225\260\345\255\246/image-20220113104324776.png" differ diff --git "a/pic/\347\255\211\347\246\273\345\255\220\344\275\223\345\211\215\347\275\256\347\237\245\350\257\206/image-1.png" "b/pic/\347\255\211\347\246\273\345\255\220\344\275\223\345\211\215\347\275\256\347\237\245\350\257\206/image-1.png" new file mode 100644 index 0000000..0233afc Binary files /dev/null and "b/pic/\347\255\211\347\246\273\345\255\220\344\275\223\345\211\215\347\275\256\347\237\245\350\257\206/image-1.png" differ diff --git "a/pic/\347\255\211\347\246\273\345\255\220\344\275\223\345\211\215\347\275\256\347\237\245\350\257\206/image-10.png" "b/pic/\347\255\211\347\246\273\345\255\220\344\275\223\345\211\215\347\275\256\347\237\245\350\257\206/image-10.png" new file mode 100644 index 0000000..0459d86 Binary files /dev/null and "b/pic/\347\255\211\347\246\273\345\255\220\344\275\223\345\211\215\347\275\256\347\237\245\350\257\206/image-10.png" differ diff --git "a/pic/\347\255\211\347\246\273\345\255\220\344\275\223\345\211\215\347\275\256\347\237\245\350\257\206/image-11.png" "b/pic/\347\255\211\347\246\273\345\255\220\344\275\223\345\211\215\347\275\256\347\237\245\350\257\206/image-11.png" new file mode 100644 index 0000000..4ffbef4 Binary files /dev/null and "b/pic/\347\255\211\347\246\273\345\255\220\344\275\223\345\211\215\347\275\256\347\237\245\350\257\206/image-11.png" differ diff --git "a/pic/\347\255\211\347\246\273\345\255\220\344\275\223\345\211\215\347\275\256\347\237\245\350\257\206/image-12.png" "b/pic/\347\255\211\347\246\273\345\255\220\344\275\223\345\211\215\347\275\256\347\237\245\350\257\206/image-12.png" new file mode 100644 index 0000000..eab2d0e Binary files /dev/null and "b/pic/\347\255\211\347\246\273\345\255\220\344\275\223\345\211\215\347\275\256\347\237\245\350\257\206/image-12.png" differ diff --git "a/pic/\347\255\211\347\246\273\345\255\220\344\275\223\345\211\215\347\275\256\347\237\245\350\257\206/image-13.png" "b/pic/\347\255\211\347\246\273\345\255\220\344\275\223\345\211\215\347\275\256\347\237\245\350\257\206/image-13.png" new file mode 100644 index 0000000..d73a3bb Binary files /dev/null and "b/pic/\347\255\211\347\246\273\345\255\220\344\275\223\345\211\215\347\275\256\347\237\245\350\257\206/image-13.png" differ diff --git "a/pic/\347\255\211\347\246\273\345\255\220\344\275\223\345\211\215\347\275\256\347\237\245\350\257\206/image-14.png" "b/pic/\347\255\211\347\246\273\345\255\220\344\275\223\345\211\215\347\275\256\347\237\245\350\257\206/image-14.png" new file mode 100644 index 0000000..773dfec Binary files /dev/null and "b/pic/\347\255\211\347\246\273\345\255\220\344\275\223\345\211\215\347\275\256\347\237\245\350\257\206/image-14.png" differ diff --git "a/pic/\347\255\211\347\246\273\345\255\220\344\275\223\345\211\215\347\275\256\347\237\245\350\257\206/image-15.png" "b/pic/\347\255\211\347\246\273\345\255\220\344\275\223\345\211\215\347\275\256\347\237\245\350\257\206/image-15.png" new file mode 100644 index 0000000..2630563 Binary files /dev/null and "b/pic/\347\255\211\347\246\273\345\255\220\344\275\223\345\211\215\347\275\256\347\237\245\350\257\206/image-15.png" differ diff --git "a/pic/\347\255\211\347\246\273\345\255\220\344\275\223\345\211\215\347\275\256\347\237\245\350\257\206/image-16.png" "b/pic/\347\255\211\347\246\273\345\255\220\344\275\223\345\211\215\347\275\256\347\237\245\350\257\206/image-16.png" new file mode 100644 index 0000000..07d9279 Binary files /dev/null and "b/pic/\347\255\211\347\246\273\345\255\220\344\275\223\345\211\215\347\275\256\347\237\245\350\257\206/image-16.png" differ diff --git "a/pic/\347\255\211\347\246\273\345\255\220\344\275\223\345\211\215\347\275\256\347\237\245\350\257\206/image-2.png" "b/pic/\347\255\211\347\246\273\345\255\220\344\275\223\345\211\215\347\275\256\347\237\245\350\257\206/image-2.png" new file mode 100644 index 0000000..c503103 Binary files /dev/null and "b/pic/\347\255\211\347\246\273\345\255\220\344\275\223\345\211\215\347\275\256\347\237\245\350\257\206/image-2.png" differ diff --git "a/pic/\347\255\211\347\246\273\345\255\220\344\275\223\345\211\215\347\275\256\347\237\245\350\257\206/image-3.png" "b/pic/\347\255\211\347\246\273\345\255\220\344\275\223\345\211\215\347\275\256\347\237\245\350\257\206/image-3.png" new file mode 100644 index 0000000..b4e907f Binary files /dev/null and "b/pic/\347\255\211\347\246\273\345\255\220\344\275\223\345\211\215\347\275\256\347\237\245\350\257\206/image-3.png" differ diff --git "a/pic/\347\255\211\347\246\273\345\255\220\344\275\223\345\211\215\347\275\256\347\237\245\350\257\206/image-4.png" "b/pic/\347\255\211\347\246\273\345\255\220\344\275\223\345\211\215\347\275\256\347\237\245\350\257\206/image-4.png" new file mode 100644 index 0000000..ed7ac8a Binary files /dev/null and "b/pic/\347\255\211\347\246\273\345\255\220\344\275\223\345\211\215\347\275\256\347\237\245\350\257\206/image-4.png" differ diff --git "a/pic/\347\255\211\347\246\273\345\255\220\344\275\223\345\211\215\347\275\256\347\237\245\350\257\206/image-5.png" "b/pic/\347\255\211\347\246\273\345\255\220\344\275\223\345\211\215\347\275\256\347\237\245\350\257\206/image-5.png" new file mode 100644 index 0000000..ae3b6e8 Binary files /dev/null and "b/pic/\347\255\211\347\246\273\345\255\220\344\275\223\345\211\215\347\275\256\347\237\245\350\257\206/image-5.png" differ diff --git "a/pic/\347\255\211\347\246\273\345\255\220\344\275\223\345\211\215\347\275\256\347\237\245\350\257\206/image-6.png" "b/pic/\347\255\211\347\246\273\345\255\220\344\275\223\345\211\215\347\275\256\347\237\245\350\257\206/image-6.png" new file mode 100644 index 0000000..bcc2712 Binary files /dev/null and "b/pic/\347\255\211\347\246\273\345\255\220\344\275\223\345\211\215\347\275\256\347\237\245\350\257\206/image-6.png" differ diff --git "a/pic/\347\255\211\347\246\273\345\255\220\344\275\223\345\211\215\347\275\256\347\237\245\350\257\206/image-7.png" "b/pic/\347\255\211\347\246\273\345\255\220\344\275\223\345\211\215\347\275\256\347\237\245\350\257\206/image-7.png" new file mode 100644 index 0000000..684e135 Binary files /dev/null and "b/pic/\347\255\211\347\246\273\345\255\220\344\275\223\345\211\215\347\275\256\347\237\245\350\257\206/image-7.png" differ diff --git "a/pic/\347\255\211\347\246\273\345\255\220\344\275\223\345\211\215\347\275\256\347\237\245\350\257\206/image-8.png" "b/pic/\347\255\211\347\246\273\345\255\220\344\275\223\345\211\215\347\275\256\347\237\245\350\257\206/image-8.png" new file mode 100644 index 0000000..da00bc0 Binary files /dev/null and "b/pic/\347\255\211\347\246\273\345\255\220\344\275\223\345\211\215\347\275\256\347\237\245\350\257\206/image-8.png" differ diff --git "a/pic/\347\255\211\347\246\273\345\255\220\344\275\223\345\211\215\347\275\256\347\237\245\350\257\206/image-9.png" "b/pic/\347\255\211\347\246\273\345\255\220\344\275\223\345\211\215\347\275\256\347\237\245\350\257\206/image-9.png" new file mode 100644 index 0000000..a1f559c Binary files /dev/null and "b/pic/\347\255\211\347\246\273\345\255\220\344\275\223\345\211\215\347\275\256\347\237\245\350\257\206/image-9.png" differ diff --git "a/pic/\347\255\211\347\246\273\345\255\220\344\275\223\345\211\215\347\275\256\347\237\245\350\257\206/image.png" "b/pic/\347\255\211\347\246\273\345\255\220\344\275\223\345\211\215\347\275\256\347\237\245\350\257\206/image.png" new file mode 100644 index 0000000..46de44a Binary files /dev/null and "b/pic/\347\255\211\347\246\273\345\255\220\344\275\223\345\211\215\347\275\256\347\237\245\350\257\206/image.png" differ diff --git "a/pic/\347\255\211\347\246\273\345\255\220\344\275\223\347\211\251\347\220\206-pyk/0960A420F60DE4125AA02629259C81BE.jpg" "b/pic/\347\255\211\347\246\273\345\255\220\344\275\223\347\211\251\347\220\206-pyk/0960A420F60DE4125AA02629259C81BE.jpg" new file mode 100644 index 0000000..cbba77d Binary files /dev/null and "b/pic/\347\255\211\347\246\273\345\255\220\344\275\223\347\211\251\347\220\206-pyk/0960A420F60DE4125AA02629259C81BE.jpg" differ diff --git "a/pic/\347\255\211\347\246\273\345\255\220\344\275\223\347\211\251\347\220\206-pyk/1D6A5C77DD8DAFC4A5964A8CE8C8C498.jpg" "b/pic/\347\255\211\347\246\273\345\255\220\344\275\223\347\211\251\347\220\206-pyk/1D6A5C77DD8DAFC4A5964A8CE8C8C498.jpg" new file mode 100644 index 0000000..b2d879e Binary files /dev/null and "b/pic/\347\255\211\347\246\273\345\255\220\344\275\223\347\211\251\347\220\206-pyk/1D6A5C77DD8DAFC4A5964A8CE8C8C498.jpg" differ diff --git "a/pic/\347\255\211\347\246\273\345\255\220\344\275\223\347\211\251\347\220\206-pyk/C63440A1FCE157A0572C6B274E057392.jpg" "b/pic/\347\255\211\347\246\273\345\255\220\344\275\223\347\211\251\347\220\206-pyk/C63440A1FCE157A0572C6B274E057392.jpg" new file mode 100644 index 0000000..7f59281 Binary files /dev/null and "b/pic/\347\255\211\347\246\273\345\255\220\344\275\223\347\211\251\347\220\206-pyk/C63440A1FCE157A0572C6B274E057392.jpg" differ diff --git "a/pic/\347\255\211\347\246\273\345\255\220\344\275\223\347\211\251\347\220\206-pyk/image-29.png" "b/pic/\347\255\211\347\246\273\345\255\220\344\275\223\347\211\251\347\220\206-pyk/image-29.png" new file mode 100644 index 0000000..3c3351e Binary files /dev/null and "b/pic/\347\255\211\347\246\273\345\255\220\344\275\223\347\211\251\347\220\206-pyk/image-29.png" differ diff --git "a/pic/\347\255\211\347\246\273\345\255\220\344\275\223\347\211\251\347\220\206-pyk/image-30.png" "b/pic/\347\255\211\347\246\273\345\255\220\344\275\223\347\211\251\347\220\206-pyk/image-30.png" new file mode 100644 index 0000000..de03876 Binary files /dev/null and "b/pic/\347\255\211\347\246\273\345\255\220\344\275\223\347\211\251\347\220\206-pyk/image-30.png" differ diff --git "a/pic/\347\255\211\347\246\273\345\255\220\344\275\223\347\211\251\347\220\206-pyk/image-31.png" "b/pic/\347\255\211\347\246\273\345\255\220\344\275\223\347\211\251\347\220\206-pyk/image-31.png" new file mode 100644 index 0000000..2a6c6a1 Binary files /dev/null and "b/pic/\347\255\211\347\246\273\345\255\220\344\275\223\347\211\251\347\220\206-pyk/image-31.png" differ diff --git "a/pic/\347\255\211\347\246\273\345\255\220\344\275\223\347\211\251\347\220\206-pyk/image-32.png" "b/pic/\347\255\211\347\246\273\345\255\220\344\275\223\347\211\251\347\220\206-pyk/image-32.png" new file mode 100644 index 0000000..30f0c4b Binary files /dev/null and "b/pic/\347\255\211\347\246\273\345\255\220\344\275\223\347\211\251\347\220\206-pyk/image-32.png" differ diff --git "a/pic/\347\255\211\347\246\273\345\255\220\344\275\223\347\211\251\347\220\206-pyk/image-33.png" "b/pic/\347\255\211\347\246\273\345\255\220\344\275\223\347\211\251\347\220\206-pyk/image-33.png" new file mode 100644 index 0000000..c304ca5 Binary files /dev/null and "b/pic/\347\255\211\347\246\273\345\255\220\344\275\223\347\211\251\347\220\206-pyk/image-33.png" differ diff --git "a/pic/\347\255\211\347\246\273\345\255\220\344\275\223\347\211\251\347\220\206-pyk/image-34.png" "b/pic/\347\255\211\347\246\273\345\255\220\344\275\223\347\211\251\347\220\206-pyk/image-34.png" new file mode 100644 index 0000000..6bb6ffe Binary files /dev/null and "b/pic/\347\255\211\347\246\273\345\255\220\344\275\223\347\211\251\347\220\206-pyk/image-34.png" differ diff --git "a/pic/\347\255\211\347\246\273\345\255\220\344\275\223\347\211\251\347\220\206-pyk/image-35.png" "b/pic/\347\255\211\347\246\273\345\255\220\344\275\223\347\211\251\347\220\206-pyk/image-35.png" new file mode 100644 index 0000000..13b76ad Binary files /dev/null and "b/pic/\347\255\211\347\246\273\345\255\220\344\275\223\347\211\251\347\220\206-pyk/image-35.png" differ diff --git "a/pic/\347\255\211\347\246\273\345\255\220\344\275\223\347\211\251\347\220\206-pyk/image-36.png" "b/pic/\347\255\211\347\246\273\345\255\220\344\275\223\347\211\251\347\220\206-pyk/image-36.png" new file mode 100644 index 0000000..05ef3dc Binary files /dev/null and "b/pic/\347\255\211\347\246\273\345\255\220\344\275\223\347\211\251\347\220\206-pyk/image-36.png" differ diff --git "a/pic/\347\255\211\347\246\273\345\255\220\344\275\223\347\211\251\347\220\206-pyk/image-37.png" "b/pic/\347\255\211\347\246\273\345\255\220\344\275\223\347\211\251\347\220\206-pyk/image-37.png" new file mode 100644 index 0000000..a62324a Binary files /dev/null and "b/pic/\347\255\211\347\246\273\345\255\220\344\275\223\347\211\251\347\220\206-pyk/image-37.png" differ diff --git "a/pic/\347\255\211\347\246\273\345\255\220\344\275\223\347\211\251\347\220\206-pyk/image-38.png" "b/pic/\347\255\211\347\246\273\345\255\220\344\275\223\347\211\251\347\220\206-pyk/image-38.png" new file mode 100644 index 0000000..fbf88de Binary files /dev/null and "b/pic/\347\255\211\347\246\273\345\255\220\344\275\223\347\211\251\347\220\206-pyk/image-38.png" differ diff --git "a/pic/\347\255\211\347\246\273\345\255\220\344\275\223\347\211\251\347\220\206-pyk/image-39.png" "b/pic/\347\255\211\347\246\273\345\255\220\344\275\223\347\211\251\347\220\206-pyk/image-39.png" new file mode 100644 index 0000000..10d9f1c Binary files /dev/null and "b/pic/\347\255\211\347\246\273\345\255\220\344\275\223\347\211\251\347\220\206-pyk/image-39.png" differ diff --git "a/pic/\347\255\211\347\246\273\345\255\220\344\275\223\347\211\251\347\220\206-pyk/image-40.png" "b/pic/\347\255\211\347\246\273\345\255\220\344\275\223\347\211\251\347\220\206-pyk/image-40.png" new file mode 100644 index 0000000..d42c425 Binary files /dev/null and "b/pic/\347\255\211\347\246\273\345\255\220\344\275\223\347\211\251\347\220\206-pyk/image-40.png" differ diff --git "a/pic/\347\255\211\347\246\273\345\255\220\344\275\223\347\211\251\347\220\206-pyk/image-41.png" "b/pic/\347\255\211\347\246\273\345\255\220\344\275\223\347\211\251\347\220\206-pyk/image-41.png" new file mode 100644 index 0000000..b2fdf08 Binary files /dev/null and "b/pic/\347\255\211\347\246\273\345\255\220\344\275\223\347\211\251\347\220\206-pyk/image-41.png" differ diff --git "a/pic/\347\255\211\347\246\273\345\255\220\344\275\223\347\211\251\347\220\206-pyk/image-42.png" "b/pic/\347\255\211\347\246\273\345\255\220\344\275\223\347\211\251\347\220\206-pyk/image-42.png" new file mode 100644 index 0000000..1d57655 Binary files /dev/null and "b/pic/\347\255\211\347\246\273\345\255\220\344\275\223\347\211\251\347\220\206-pyk/image-42.png" differ diff --git "a/pic/\347\255\211\347\246\273\345\255\220\344\275\223\347\211\251\347\220\206-pyk/image-43.png" "b/pic/\347\255\211\347\246\273\345\255\220\344\275\223\347\211\251\347\220\206-pyk/image-43.png" new file mode 100644 index 0000000..1259481 Binary files /dev/null and "b/pic/\347\255\211\347\246\273\345\255\220\344\275\223\347\211\251\347\220\206-pyk/image-43.png" differ diff --git "a/pic/\347\255\211\347\246\273\345\255\220\344\275\223\347\211\251\347\220\206-pyk/image-44.png" "b/pic/\347\255\211\347\246\273\345\255\220\344\275\223\347\211\251\347\220\206-pyk/image-44.png" new file mode 100644 index 0000000..dfdc18b Binary files /dev/null and "b/pic/\347\255\211\347\246\273\345\255\220\344\275\223\347\211\251\347\220\206-pyk/image-44.png" differ diff --git "a/pic/\347\255\211\347\246\273\345\255\220\344\275\223\347\211\251\347\220\206-pyk/image-45.png" "b/pic/\347\255\211\347\246\273\345\255\220\344\275\223\347\211\251\347\220\206-pyk/image-45.png" new file mode 100644 index 0000000..d57b059 Binary files /dev/null and "b/pic/\347\255\211\347\246\273\345\255\220\344\275\223\347\211\251\347\220\206-pyk/image-45.png" differ diff --git "a/pic/\347\255\211\347\246\273\345\255\220\344\275\223\347\211\251\347\220\206-pyk/image-46.png" "b/pic/\347\255\211\347\246\273\345\255\220\344\275\223\347\211\251\347\220\206-pyk/image-46.png" new file mode 100644 index 0000000..05a668a Binary files /dev/null and "b/pic/\347\255\211\347\246\273\345\255\220\344\275\223\347\211\251\347\220\206-pyk/image-46.png" differ diff --git "a/pic/\347\255\211\347\246\273\345\255\220\344\275\223\347\211\251\347\220\206-pyk/image-47.png" "b/pic/\347\255\211\347\246\273\345\255\220\344\275\223\347\211\251\347\220\206-pyk/image-47.png" new file mode 100644 index 0000000..c2041c5 Binary files /dev/null and "b/pic/\347\255\211\347\246\273\345\255\220\344\275\223\347\211\251\347\220\206-pyk/image-47.png" differ diff --git "a/pic/\347\255\211\347\246\273\345\255\220\344\275\223\347\211\251\347\220\206-pyk/image-48.png" "b/pic/\347\255\211\347\246\273\345\255\220\344\275\223\347\211\251\347\220\206-pyk/image-48.png" new file mode 100644 index 0000000..7cf7f29 Binary files /dev/null and "b/pic/\347\255\211\347\246\273\345\255\220\344\275\223\347\211\251\347\220\206-pyk/image-48.png" differ diff --git "a/pic/\347\255\211\347\246\273\345\255\220\344\275\223\347\211\251\347\220\206-pyk/image-49.png" "b/pic/\347\255\211\347\246\273\345\255\220\344\275\223\347\211\251\347\220\206-pyk/image-49.png" new file mode 100644 index 0000000..911320f Binary files /dev/null and "b/pic/\347\255\211\347\246\273\345\255\220\344\275\223\347\211\251\347\220\206-pyk/image-49.png" differ diff --git "a/pic/\347\255\211\347\246\273\345\255\220\344\275\223\347\211\251\347\220\206-pyk/image-50.png" "b/pic/\347\255\211\347\246\273\345\255\220\344\275\223\347\211\251\347\220\206-pyk/image-50.png" new file mode 100644 index 0000000..80aa62c Binary files /dev/null and "b/pic/\347\255\211\347\246\273\345\255\220\344\275\223\347\211\251\347\220\206-pyk/image-50.png" differ diff --git "a/pic/\347\255\211\347\246\273\345\255\220\344\275\223\347\211\251\347\220\206-pyk/image-51.png" "b/pic/\347\255\211\347\246\273\345\255\220\344\275\223\347\211\251\347\220\206-pyk/image-51.png" new file mode 100644 index 0000000..7788545 Binary files /dev/null and "b/pic/\347\255\211\347\246\273\345\255\220\344\275\223\347\211\251\347\220\206-pyk/image-51.png" differ diff --git "a/pic/\350\256\260\344\270\200\344\270\252\346\234\200\345\237\272\347\241\200\347\232\204\346\234\272\345\231\250\345\255\246\344\271\240/AC9Bq63.png" "b/pic/\350\256\260\344\270\200\344\270\252\346\234\200\345\237\272\347\241\200\347\232\204\346\234\272\345\231\250\345\255\246\344\271\240/AC9Bq63.png" new file mode 100644 index 0000000..facae52 Binary files /dev/null and "b/pic/\350\256\260\344\270\200\344\270\252\346\234\200\345\237\272\347\241\200\347\232\204\346\234\272\345\231\250\345\255\246\344\271\240/AC9Bq63.png" differ diff --git a/search.xml b/search.xml new file mode 100644 index 0000000..d4e921a --- /dev/null +++ b/search.xml @@ -0,0 +1,19126 @@ + + + + 20230514周总结 + /2023/05/14/20230514%E5%91%A8%E6%80%BB%E7%BB%93/ + 🈚

    +]]>
    + + 总结 + + + 周总结 + +
    + + 计算机操作系统 + /2021/03/12/2021-03-21(1)/ + 进程–>处理机

    +

    操作系统小TIPS

    + + + +

    进程管理

    程序的并发执行

    程序是描述计算机所要完成的具有特定功能的,并在时间上按严格次序前后相继的计算机操作序列集合(一个静态的概念)

    +

    程序顺序执行的特点:

    +
      +
    1. 顺序性
    2. +
    3. 封闭性
    4. +
    5. 可再现性
    6. +
    +

    程序在执行时应考虑的环境

    +
      +
    1. 独立性
    2. +
    3. 随机性
    4. +
    5. 资源共享性
    6. +
    +

    进程

    并发执行的程序在执行过程中分配和管理资源的基本单位

    +

    特点:

      +
    1. 动态概念
    2. +
    3. 并发特征(程序没有)
    4. +
    5. 竞争计算机系统资源的基本单位
    6. +
    7. 不同的进程可以包含同一个程序
    8. +
    +

    进程的组成:

    进程控制块PCB:
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    信息含义
    状态说明进程当前的状态
    进程标识符标明系统中各个进程
    位置信息指明程序及数据在主存或外存的位置
    控制信息参数、信号量、消息等
    队列指针连接统一状态的进程
    优先级进程调度的依据
    现场保护区将处理机的现场保护到该区域
    其他
    +
    程序
    数据

    进程的状态

    运行态、就绪态、阻塞态/等待态、新建态、退出态

    +

    进程切换

    切换的时机

    +
      +
    1. 时钟中断
    2. +
    3. I/O中断
    4. +
    5. 内存失效
    6. +
    7. 遇到陷阱
    8. +
    9. 系统调用
    10. +
    +

    空->创建:新的批处理作业、交互登录、为提供服务而由操作系统创建、由现有进程派生

    +

    新建->就绪态:操作系统做好准备再接纳一批新进程时

    +

    就绪->运行态:需要选择一个新进程时

    +

    运行->就绪:正在运行的进程达到“允许不中断执行”的最大时间段、被优先级更高的进程抢占、进程自愿释放处理器(周期性的进程)

    +

    运行->阻塞:对于进程请求的服务,操作系统无法立即予以服务、请求一个无法得到的资源、需要进行初始化的时候、进程通信时,一个进程等待另一个进程的信息。从磁盘读数据时(可能)

    +

    阻塞->就绪:等待的时间发生时

    +

    一个读磁盘操作完成以后,操作系统会修改进程状态为就绪态

    +

    进程的创建

      +
    1. 由系统程序模块统一创建
    2. +
    3. 有父进程创建
    4. +
    +

    用户登录成功后需要创建新进程
    启动程序执行创建新进程

    +
    +

    设备分配是通过在系统中设置相应的数据结构实现的,不必创建新进程。

    +

    进程的撤销

      +
    1. 该进程已完成所要求的功能而正常终止
    2. +
    3. 由于某种错误导致非正常终止
    4. +
    5. 祖先进程要求撤销某个子进程
    6. +
    +

    进程的通信

    主从式
      +
    1. 主进程可自由使用从进程的资源或数据
    2. +
    3. 从进程的动作受主进程的控制
    4. +
    5. 主进程和从进程的关系是固定的
    6. +
    +
    会话式
      +
    1. 使用进程在服务进程所提供的服务之前,必须得到许可
    2. +
    3. 服务进程所提供的服务的控制由自身完成
    4. +
    5. 使用进程和服务进程在通信时有固定的链接关系
    6. +
    +
    消息或邮箱机制
      +
    1. 只要存在空缓冲区或邮箱,发送进程就可以发送消息
    2. +
    3. 发送进程和接受进程无直接连接关系
    4. +
    5. 两进程之间存在缓冲区或邮箱
    6. +
    +
    共享存储区方式

    不要求数据移动

    +
    管道通信

    类似于半双工
    大小为内存上的一页

    +

    临界区

    不允许多个并发进程交叉执行的一段程序
    禁止两个进程同时进入临界区的准则:

    +
      +
    1. 空闲让进
    2. +
    3. 忙则等待
    4. +
    5. 有限等待
    6. +
    7. 让权等待
    8. +
    +

    实现互斥

    软件方法

      +
    1. 单标志法
      违背空闲让进
    2. +
    3. 双标志法先检查
      违背忙则等待
    4. +
    5. 双标志法后检查
      导致互相谦让,谁也进不了临界区
      最终饥饿
    6. +
    7. Peterson算法
      代码语句中设置了turn
      无法实现让权等待
    8. +
    +

    硬件实现方法

      +
    1. 中断屏蔽法
      限制了处理机交替执行程序的能力
    2. +
    3. 硬件指令法
      TestAndSet指令(原子操作)(不会主动放弃CPU,完成时会唤醒处于就绪态的进程,在开中断下运行)、Swap指令
      硬件方法不能实现让权等待
    4. +
    +

    信号量

    条件变量与信号量的比较

    +
      +
    • 相同点
      条件变量的wait/signal操作类似于信号量的p/v操作,可实现进程的阻塞/唤醒
    • +
    • 不同点
      条件变量是没有值的,仅实现了“排队等待”功能;而信号量是“有值”的,信号量的值反应了剩余资源数,而在管程中,剩余资源数用共享数据结构记录。
    • +
    +

    管程

    代表共享资源的数据结构,以及由对该共享资源数据结构实施操作的一组过程所组成的资源管理程序。

    +

    实现共享资源封装
    每次只允许一个进程进入管程

    +

    经典同步问题

    生产者消费者问题
    semaphore mutex=1;	//临界区互斥信号量
    semaphore empty=n; //空闲缓冲区
    semaphore full=0; //缓冲区初始化为空
    producer(){ //生产者进程
    while(1){
    produce an item in next; //生产数据
    P(empty); //获取空缓冲单元
    P(mutex); //进入临界区
    Add next to buffer; //加入数据
    V(mutex); //离开临界区,释放互斥信号量
    V(full); //满缓冲区加1
    }
    }
    consumer(){ //消费者进程
    while(1){
    P(full); //获取满缓冲单元
    P(mutex); //进入临界区
    Remove an item from buffer;
    V(mutex); //离开缓冲区
    V(empty); //空缓冲区加1
    Consume the item; //消费
    }
    }
    + +
    读者-写者问题
    int count=0;			//用于记录当前的读者数量

    semaphore mutex=1; //用于保护更新count变量时的互斥
    semaphore rw=1; //用于保证读者和写者互斥地访问文件
    semaphore w=1; //用于实现写优先

    writer() { //写者进程

    while(1) {
    P(w);
    P(rw) ; //互斥访问共享文件

    writing; //写入

    V(rW); //释放共享文件
    V(w);


    reader() { //读者进程
    while (1) {
    P(w)
    P (mutex) ; //互斥访问count变量
    if (count==0) //当第一个读进程读共享文件时
    P(rw); //阻止写进程写
    count++; //读者计数器加1
    V (mutex) ; //释放互斥变量count
    V(w);
    reading; //读取
    P (mutex) ; //互斥访问count变量
    count--; //读者计数器减1
    if (count==0) //当最后一个读进程读完共享文件
    V(rw) ; //允许写进程写
    V (mutex) ; //释放互斥变量count
    }
    }
    + +
    哲学家问题
    semaphore chopstick[5]={1,1,1,1,1}; //初始化信号量
    semaphore mutex=1; //设置取筷子的信号量
    Pi() { //i号哲学家的进程
    do{
    P (mutex) ; //在取筷子前获得互斥量
    P (chopstick[i]) ; //取左边筷子
    P (chopstick[(i+1)%5]) ; //取右边筷子
    V (mutex) ; //释放取筷子的信号量
    eat; //进餐
    V(chopstick[i]) ; //放回左边筷子
    V (chopstick[(i+1)%5]) ; //放回右边筷子
    think; //思考
    } while (1) ;
    }
    + +

    死锁

    死锁的原因

      +
    1. 系统资源的竞争
    2. +
    3. 进程推进顺序非法
    4. +
    5. 死锁产生的必要条件:
    6. +
    +
      +
    • 互斥条件
    • +
    • 不剥夺条件
    • +
    • 请求并保持条件
    • +
    • 循环等待条件
    • +
    +

    死锁的预防

      +
    1. 破坏互斥条件
      不可行
    2. +
    3. 破坏不剥夺条件
      用于状态易于保存和恢复的资源 如CPU的寄存器及内存资源,不适用于打印机
    4. +
    5. 破坏请求并保持条件
      采用预先静态分配方法
      会导致饥饿
    6. +
    7. 破坏循环等待条件
      采用顺序资源分配算法
      限制了新设备的增加
      造成资源浪费
      给用户编程带来麻烦
    8. +
    +

    死锁避免

      +
    1. 系统安全状态
    2. +
    3. 银行家算法
    4. +
    +

    死锁的检测和排除

      +
    1. 资源分配图
    2. +
    3. 死锁定理
    4. +
    5. 死锁解除
    6. +
    +
      +
    • 资源剥夺法
    • +
    • 撤销进程法
    • +
    • 进程回退法
    • +
    +

    线程

    线程是调度的基本单位
    线程控制块TCB
    用户级线程只可在用户空间中进行,所以在不支持内核级线程的系统中也可以实现管理。
    用户级线程的切换效率更高。

    +

    典型应用

      +
    1. 服务器中的文件管理或通信控制
    2. +
    3. 前后台处理
    4. +
    5. 异步处理
    6. +
    +

    多线程模型

    多对一

    多个用户映射到一个内核级线程,用户线程对操作系统不可见
    多个线程不能并行运行在多处理机上

    +

    一对一

    每个用户级线程映射到一个内核级线程
    线程开销大

    +

    多对多

    n个用户级映射到m个内核级线程上,要求m<=n

    +

    中断技术

    在程序执行过程中遇到急需处理的事件时,暂时中止现行程序在CPU上的执行,转而执行相应的事件处理程序,待处理完成后返回中断点或调用其他程序。

    +

    外中断(中断或者异步中断)

    来自处理器之外的中断
    分为可屏蔽中断和不可屏蔽中断
    既发生在用户态又发生在内核态

    +
      +
    1. 时钟中断
    2. +
    3. 键盘中断
    4. +
    5. 它机中断
    6. +
    7. 外部设备中断
    8. +
    +

    内中断(异常或同步中断)

      +
    1. 访管中断->执行系统调用引起
    2. +
    3. 硬件故障中断->电源失效、奇偶校验错误、总线超时
    4. +
    5. 程序性异常->非法操作、地址越界、页面故障、调试指令、除数为零、浮点溢出
      大部分异常都发生在用户态,只有“缺页异常“发生在内核态
    6. +
    +

    中断的执行过程

      +
    1. 关中断 此时不能响应更高级的中断请求
    2. +
    3. 保存断点 即PC
    4. +
    5. 引出中断服务程序 将地址送入PC
    6. +
    7. 保存现场和屏蔽字
    8. +
    9. 开中断 此时允许更高级的的中断
    10. +
    11. 执行中断服务程序
    12. +
    13. 关中断
    14. +
    15. 恢复现场和屏蔽字
    16. +
    17. 开中断、中断返回
      PC由硬件保存,通用寄存器由操作系统保存
      1~3由硬件(中断隐指令)完成,4~9 软件完成
    18. +
    +

    中断事件处理

    硬件故障中断

    硬件故障导致

    +
    处理过程
      +
    1. 中断处理程序 保护现场
    2. +
    3. 停止设备工作
    4. +
    5. 停止处理及运行
    6. +
    7. 向操作员报告
    8. +
    +

    程序性中断

    语法错误、逻辑错误、运行中异常

    +
    处理过程
      +
    1. 因人而异
    2. +
    3. 借助于信号机制
    4. +
    5. 操作系统将中断事件捕获交给应用程序
    6. +
    +

    I/O中断

    处理原则
      +
    1. I/O正常结束 待传输的下一个进程设置为就绪态
    2. +
    3. I/O发生故障 向设备发命令索取状态字、分析故障的确切原因、复执或转人工
    4. +
    5. I/O异常 报告操作员
    6. +
    7. 设备报到或设备结束 操作系统修改系统数据结构中相应设备的状态
    8. +
    +

    访管中断

    表示当前运行程序对操作系统功能的调用

    +
    处理过程
      +
    1. 程序执行访管指令,并通过适当方式指明系统调用号。
    2. +
    3. 通过中断机制进入访管中断处理程序,现场信息被保护到核心栈,按功能号实现跳转。
    4. +
    5. 通过系统调用人口地址表找到相应中断服务例程的入口地址。
    6. +
    7. 执行中断服务例程,正常情况下在结束后返回系统调用的下一条指令继续
      执行。
    8. +
    +

    时钟中断

    处理和时间有关的信息及决定是否程序调度
    和时间有关的信息:系统时间、进程的时间片、延时、使用CPU的时间、各种定时器。
    时钟分绝对时钟和间隔时钟

    +
    间隔定时器:
      +
    1. real 永远在计时(包括进程挂起时)
    2. +
    3. virtual 只在用户态计时
    4. +
    5. profile 在用户态和内核态都计时
    6. +
    +

    系统调用

    分类

      +
    • 设备管理
    • +
    • 文件管理
    • +
    • 进程管理
    • +
    • 进程通信
    • +
    • 内存管理
    • +
    +

    要运行在核心态

    由内核程序负责完成
    用户通过trap 来发起系统调用请求

    +

    用户态转向核心态

      +
    1. 用户程序要求操作系统的服务,如系统调用
    2. +
    3. 发生一次中断
    4. +
    5. 用户程序产生了一次错误状态
    6. +
    7. 用户程序企图执行一条特权指令
      用中断返回指令返回用户态
    8. +
    +

    主要过程

      +
    1. 传递系统调用参数
    2. +
    3. 执行trap指令
    4. +
    5. 执行相应的服务程序
    6. +
    7. 返回用户态
    8. +
    +

    大内核与微内核

    大内核的好处

    可充分利用模块之间有效特性,无可比拟的性能优势

    +

    微内核的特点

      +
    1. 添加系统服务时,不必修改内核
    2. +
    3. 有效分离接口
    4. +
    5. 微内核结构没有单一内核稳定
    6. +
    +

    处理机调度

    分级调度

      +
    1. 作业调度 又称宏观调度或者高级调度
    2. +
    3. 交换调度 又称中级调度或者内存调度
    4. +
    5. 进程调度 又称微观调度或者低级调度
    6. +
    7. 线程调度
      作业调度次数少,中级次数略多,进程调度频率最高
      进程调度和切换程序是操作系统内核程序
    8. +
    +
    +

    现代操作系统中,不能进行进程的调度与切换的情况有以下几种:1. 在处理中断的过程中,中断处理过程复杂,在实现上很难做到进程程切换,而且中断处理是系统工作的一部分,逻辑上不属于某一进程,不应被剥夺处理机资源。
    2. 进程在操作系统内核程序临界区中。进入临界区后,需要独占式地访问共享数据,理论上必须加锁,以防止其他并行程序进入,在解锁前不应切换到其他进程运行,以加快该共享数据的释放。
    3. 其他需要完全屏蔽中断的原子操作过程中。如加锁、解锁、中断现场保护、恢复等原子操作。在原子过程中,连中断都要屏蔽,更不应该进行进程调度与切换。

    +
    +

    进程调度方式

      +
    • 非抢占(剥夺)式
    • +
    • 抢占(剥夺)式
    • +
    +

    调度的基本准则

      +
    1. CPU利用率
    2. +
    3. 系统吞吐量 单位时间内CPU完成作业的数量 作业数量/时间
    4. +
    5. 周转时间
      周转时间=作业完成时间-作业提交时间
      平均周转时间=(作业1的周转时间+…+作业n的周转时间)/n
      带权周转时间=作业周转时间/作业实际运行时间
      平均带权周转时间=n个带权周转时间/n
    6. +
    7. 等待时间 进程处于等处理机状态的时间之和
    8. +
    9. 响应时间 用户提交到系统首次响应的时间
    10. +
    +

    进程调度

    功能

      +
    1. 记录系统中所有进程执行的的情况
    2. +
    3. 选择占有处理机的过程
    4. +
    5. 进行进程上下文的切换
    6. +
    +

    进程调度的时机

      +
    1. 正在执行的进程执行完毕,或者进程被创建时
    2. +
    3. 执行中进程自己调用阻塞原语将自己阻塞起来,进入睡眠等待状态
    4. +
    5. 执行中进程提出IO请求后被阻塞
    6. +
    7. 在分时系统中时间片已经用完
    8. +
    9. 在执行完系统调用,系统程序返回用户程序时
    10. +
    11. 进程处于临界区时也可以调度
      以上是不可剥夺方式下的原因
    12. +
    13. 就绪队列中的某进程的优先级变得高于当前执行进程的优先级
    14. +
    +
    UNIX中
      +
    1. 进程自己调用sleep和wait进入睡眠
    2. +
    3. 由于系统调用结束返回用户态,调度标志被置位
    4. +
    5. 完成中断或trap
    6. +
    7. 时间片用完
    8. +
    9. 调用exit自我终止
    10. +
    +

    调度算法

    先来先服务算法FIFS

    算法简单效率低
    对长作业有利对短作业不利
    有利于CPU繁忙型作业,不利于IO繁忙型

    +

    短作业优先调度算法SJF

    对于长作业不利
    未考虑作业的紧迫程度
    作业的长短根据用户的估计而定(不准)
    SJF的平均等待时间、平均周转时间最少

    +

    优先级调度算法

      +
    1. 非剥夺式
    2. +
    3. 剥夺式
    4. +
    5. 静态优先级 创建进程时决定的
    6. +
    7. 动态优先级 进程运行过程中调整
    8. +
    +

    优先级的设置参照原则

      +
    1. 系统进程>用户进程

      +
    2. +
    3. 交互型进程 >非交互型进程

      +
    4. +
    5. IO型进程 >计算型进程

      +
    6. +
    +

    高响应比优先调度算法

    响应比Rp=(等待时间+要求服务时间)/要求服务时间
    因此

    +
      +
    1. 作业的等待时间相同时,要求服务时间越短,响应比越高,有利于短作业
    2. +
    3. 要求时间相同时,作业的响应比由其等待时间决定,(FCFS)
    4. +
    5. 对长作业,等待时间足够长时,其响应比便可升的很高
    6. +
    +

    时间片轮转调度算法

    适用于分时系统
    剥夺式
    当一个处于运行态的进程用完一个时间片后它的状态处于就绪

    +

    多级反馈队列调度算法

      +
    1. 设置多个就绪队列,每个队列优先级不同
    2. +
    3. 每个队列中进程执行的时间片的大小各不相同
    4. +
    5. 队列中FCFS,队列间时间片轮转
    6. +
    7. 允许抢占
    8. +
    +
    优势
      +
    1. 终端型作业用户:短作业优先
    2. +
    3. 短批处理作业用户:周转时间较短
    4. +
    5. 长批处理作业用户:不会长期得不到处理
    6. +
    +

    实时调度

    分为软实时调度和硬实时调度
    实时操作系统的特点:

    +
      +
    1. 有限等待时间(决定性)
    2. +
    3. 有限响应时长
    4. +
    5. 用户控制
    6. +
    7. 可靠性高
    8. +
    9. 系统出错处理能力强
    10. +
    +

    要求:

      +
    1. 很快的进程或线程切换速度
    2. +
    3. 快速的外部中断响应能力
    4. +
    5. 基于优先级的随时抢占式调度策略:
    6. +
    +
      +
    • 优先级+时间片轮转调度
    • +
    • 基于优先级的非抢占式调度
    • +
    • 基于优先级的固定抢占式调度
    • +
    • 基于优先级的随时抢占式调度
    • +
    +

    分类:

      +
    1. 静态表格法
      静态分析——直接产生调度结果
      多用于处理周期性任务
    2. +
    3. 静态优先级驱动抢占式调度算法
      也进行静态分析——不直接产生调度结果——只用来指定优先级
    4. +
    5. 动态计划调度算法
      在执行调度任务前排调度计划
    6. +
    7. 尽力而为调度算法
      不进行可能性分析
    8. +
    +

    实现调度算法

    所包涵的内容信息:

    +
      +
    1. 任务就绪时间或事件到达时间
      周期性事件可预知,但非周期性事件大部分时间不可预知
    2. +
    3. 开始时限
    4. +
    5. 完成时限
    6. +
    7. 处理时间
    8. +
    9. 资源要求
    10. +
    11. 优先级
    12. +
    +

    算法思想:按用户的时限要求顺序设置处理机
    抢占式的
    可用于非周期性任务调度

    +

    频率单调调度算法

    广泛应用于多周期性实时处理
    原理:
    频率越低优先级越低

    +

    内存管理基本原理

    功能

    1. 虚拟存储器

    进程中的目标代码、数据等的虚存地址组成的虚拟空间称为虚拟存储器

    +

    2. 地址变换

    内存地址(物理单元)的集合成为内存空间或物理地址空间
    物理地址空间是地址转换的最终地址

    +
      +
    • 静态地址重定位
      要求执行前完成链接
      必须占用连续的内存空间
    • +
    • 动态地址重定位
      依靠硬件地址变换机构
      该机构需要一个或多个基地址寄存器BR和一个或多个程序虚拟地址寄存器VR
      内存地址MA=BR+VR
      优点:
    • +
    +
      +
    1. 可以对内存进行非连续分配
    2. +
    3. 提供了实现虚拟存储器的基础
    4. +
    5. 有利于程序段的共享
    6. +
    +

    3. 内外存数据传输的控制

    用户控制:覆盖
    系统控制:交换、请求调入+预调入
    一个进程正在IO时,不能交换出内存

    +

    4. 内存的分配与回收

    连续分配方式
      +
    • 单一连续分配
      无外部碎片、可采用覆盖技术
      只能用于单用户、有内部碎片
    • +
    • 固定分区分配
      多道
      分区大小相等。用于一台计算机控制多个相同对象
      分区大小不等。多个较小,适量中分区,少量大分区
      程序太大就放不进任何分区了
      内存利用率低,会产生内部碎片
      无外部碎片
      有关管理通过分区说明表进行
    • +
    • 动态分区分配
      旗下的几种算法:
    • +
    +
      +
    1. 首次适应算法
      空闲地址递增的顺序链接
      具有最佳性能
    2. +
    3. 最佳适应算法
      容量递增方式链接
    4. +
    5. 最坏适应算法
      容量递减方式链接
    6. +
    7. 邻近适应算法
      首次适应的演变,在上次查找的位置开始查找
    8. +
    +

    5. 内存信息的共享与保护

    常用的内存信息保护方法:
      +
    1. 上下界保护法(硬件)
    2. +
    3. 保护键法
    4. +
    5. 界限寄存器与CPU的用户态或核心态工作方式相结合
    6. +
    +

    源程序转换为在内存中执行的程序步骤:

    +
      +
    1. 编译
    2. +
    3. 链接 逻辑地址——>物理地址
    4. +
    5. 装入
    6. +
    +
    程序链接的三种方式:
      +
    1. 静态链接
    2. +
    3. 装入时动态链接
    4. +
    5. 运行时动态链接
    6. +
    +
    装入的的三种方法:
      +
    1. 绝对装入
    2. +
    3. 可重定位装入
    4. +
    5. 动态运行时装入
    6. +
    +

    页式管理

    为了减少碎片以及为了只在内存存放那些反复利用的或即将执行的程序段与数据部分,而把那些不经常执行的程序段和数据存储在外存。
    不会产生外部碎片

    +

    名词

    每个进程平均产生半个块大小的内部碎片(页内碎片)
    进程的虚拟空间被划分为若干个等长的页(Page)
    每个页1~4K(旧)
    内存空间按页的大小分为片或页面/帧/框(Page framework)
    外存也以同样的单位划分,成为块(block)

    +

    地址结构

    分为两部分
    页号P——页内偏移量W

    +

    页表

    记录页面在内存中对应的物理块号
    一般存于内存中
    页表由页表项
    页表项的结构:页号——物理内存中的块号
    页表项的第二部分与地址的第二部分共同组成物理地址
    加入中断处理后的页表

    + + + + + + + + + + + + + + + +
    页号页面号中断位外存始址
    +

    | 页号 | 页面号 | 中断位 | 外存始址 |
    加入改变位后的页表
    | 页号 | 页面号 | 中断位 | 外存始址 | 改变位 |

    +

    计算过程

    页号P=逻辑地址A/页面大小L
    页内偏移量W=A%L
    如果页号P>=页表长度M,产生越界中断
    页表项地址=页表始址F+页号P页表项长度
    页表长度一般指有多少页
    页表项长度一般指页地址占多大的存储空间
    物理地址E=块内内容b
    页面大小L+页内偏移量W
    注:
    页表项的确定:
    n位逻辑地址空间对应的2^nB除以一页的大小mB
    得到的u=2^n/m页,页表项以字节编址,因此页表项大于等于log(u)/8

    +

    快表

    在地址转换机构中添加一个具有并行查找能力的高速缓冲存储器。

    +

    段式管理

    分段

    按进程中的自然段划分逻辑空间
    其逻辑地址由段号s——段内偏移量w组成
    段内连续,段间不要求连续

    +

    段表

    | 段号 | 段长 | 本段在主存中的地址 |
    | 段号 | 始址 | 长度 | 存取方式 | 内外 | 访问位 |

    +

    地址变换结构

      +
    • 逻辑地址A中前几位为段号S,后几位为段内偏移量W
    • +
    • 比较段号S和段表长度M,if(S>=M)越界中断
    • +
    • 段号S对应的段表项地址=段表始址F+段号S*段表项长度
    • +
    • 取出段表中该段的始址b,计算物理地址E=b+W
    • +
    +

    段的共享与保护

    都指向被共享的段的同一个物理副本。不能修改的代码成为纯代码或可重入代码(不属于临界资源)
    保护方法一般有两种:

    +
      +
    1. 存取控制
    2. +
    3. 地址越界保护
    4. +
    +

    段业式管理

    | 段号 | 页号 | 页内相对地址(偏移量) |
    在一个进程中,段表只有一个,而页表可能有多个

    +

    虚拟内存管理

    需要的支持

      +
    1. 页表机制(或段表机制),作为主要的数据结构
    2. +
    3. 中断机制,当用户程序要访问的部分尚未调入内存时,产生中断
    4. +
    5. 地址变换机构,逻辑地址到物理地址
    6. +
    +

    请求页表机制

    页表项
    | 页号 | 物理块号 | 状态位P | 访问字段A | 修改位M | 外存地址 |

    +
      +
    • 状态位P:用于指示是否调入内存
    • +
    • 访问字段A:用于页面置换
    • +
    • 修改位M:标识调入内存后是否被修改过
    • +
    • 外存地址:支持该页在外存上的地址,通常是物理块号
    • +
    +

    缺页中断机构

    缺页中断后,进程进入阻塞。
    属于内部中断

    +

    页面置换算法

    最佳置换算法(OPT)

    淘汰一个最长时间内不再被访问的页
    无法实现

    +

    先进先出页面置换算法(FIFO)

    会产生所分配的物理块数增大而故障数不减反增的异常现象(Belady异常)
    基于队列实现

    +

    最近最久未使用置换算法

    堆栈类算法

    +

    时钟(clock)置换算法

    每帧关联一个附加位(使用位)

    +

    改进的clock算法:

    增加一个修改位
    每帧有四种情况:

    +
      +
    1. 最近未被访问,也未被修改(u=0,m=0)
    2. +
    3. 最近被访问,但未被修改(u=1,m=0)
    4. +
    5. 最近位被访问,但被修改 (u=0,m=1)
    6. +
    7. 最近被访问,被修改 (u=1,m=1)
      按以上顺序进行淘汰
    8. +
    +

    页面分配策略

    驻留集大小

    三种策略

    +
      +
    1. 固定分配局部置换
    2. +
    3. 可变分配全局置换
    4. +
    5. 可变分配局部置换
    6. +
    +

    调入的时机

      +
    1. 预调页策略
    2. +
    3. 请求调页策略
    4. +
    +

    从何处调页

    请求分页系统的外存分为

    +
      +
    • 存放文件的文件区(连续分配方式)
    • +
    • 存放对换页面的对换区 (离散分配方式) IO更快
    • +
    +

    调入时机

      +
    1. 系统拥有足够的对换区空间:全部从对换区调入
    2. +
    3. 系统缺少足够的对换区空间:凡不会被修改的文件直接从文件区调入,可能被修改的文件在换出时调入对换区,以后需要的时候直接从对换区调入
    4. +
    5. UNXI方式:与进程有关的放入文件区。运行过被换出的页面放在对换区。进程请求的共享页面若被其他进程调入内存,则无需再从对换区调入
    6. +
    +

    抖动

    频繁发生缺页中断(抖动)的原因:某个进程频繁访问的页面数目高于可用的物理页帧数。
    虚拟内存技术可以在内存中保留更多的进程以提高系统效率。

    +

    工作集

    某段时间间隔内,进程要访问的页面集合。
    工作集大小一般比工作集窗口小很多
    分配给进程的物理块数(驻留集大小)大小要大于工作集大小

    +

    文件的一些概念

    定义

    以计算机硬盘为载体的储存在计算机上的信息的集合。
    计算机进行资源的调度和分配:进程
    用户进行的输入、输出中的基本单位:文件

    +

    文件的属性

      +
    • 名称
    • +
    • 标识符
    • +
    • 类型
    • +
    • 位置
    • +
    • 大小
    • +
    • 保护
    • +
    • 时间
    • +
    +

    文件的基本操作

      +
    • 创建文件
    • +
    • 写文件
    • +
    • 读文件
    • +
    • 文件重定位(文件寻址)
    • +
    • 删除文件
    • +
    • 截断文件
    • +
    +

    文件的分类

    按性质和用途

      +
    • 系统文件
    • +
    • 库文件
    • +
    • 用户文件
    • +
    +

    按组织形式

      +
    • 普通文件
    • +
    • 目录文件
    • +
    • 特殊文件
    • +
    +

    文件的打开与关闭

    打开文件相关联的信息:

    +
      +
    • 文件指针 系统跟踪上次读写位置,作为当前文件位置的指针
    • +
    • 文件打开计数 计数为零时,系统关闭文件,删除该条目
    • +
    • 文件磁盘位置
    • +
    • 访问权限
    • +
    +

    文件的逻辑结构

    无文件结构(流式文件)

    以字节Byte为单位

    +

    访问通过穷举搜索方式

    +

    源程序文件、目标代码文件等采用这种方式

    +

    有文件结构(记录式文件)

    顺序文件

    记录定长

    +

    顺序存储或链表形式存储

    +

    顺序搜索

    +

    两种结构:

    +
      +
    • 串结构 记录之间的顺序与关键字无关 按时间先后排序
    • +
    • 顺序结构 按关键字排序
    • +
    +

    索引文件

    第i条记录相对于第一条记录的地址 A=i*L

    +

    索引表

    + + + + + + + + + + + + + +
    索引号长度m指针ptr
    0m
    +

    索引顺序文件

    将每组中的第一个文件放在索引表中

    +

    直接文件或散列文件

    没有顺序的特性

    +

    存取方法

    线性搜索法

    散列法

    二分搜索法

    文件的物理结构和存储设备

    连续文件(连续分配)

    一旦知道文件在文件存储设备上的起始地址和文件长度就能很快的进行物理存取。
    反复增删后会产生外部碎片

    +

    串联文件(链接分配)

    搜索效率低。

    +

    隐式链接分配

    显式链接分配

    创建文件分配表(FAT),用于存放链接文件各物理块的指针。

    +

    索引文件(索引分配)

    把每个文件的所有盘块号都集中放到一起构成索引块(表)

    +

    处理索引块的问题

      +
    1. 链接方案 将多个索引块链接
    2. +
    3. 多层索引
    4. +
    5. 混合索引
    6. +
    +

    文件存储设备

    顺序存储设备

    磁带 磁带的两个相邻物理块之间有间隙让他提前加速和不停止

    +
    存取速度的的因素
      +
    1. 信息密度(字符数/英寸)
    2. +
    3. 磁带带速(英寸/秒)
    4. +
    5. 块间间隙
      信息密度大、块间间隙小、带速高,存取快。
    6. +
    +

    直接存储设备

    磁盘

    +

    文件存储空间管理

    一般一个问价存储在一个文件卷中,文件卷可以是磁盘的一部分,也可以是整个物理盘。

    +

    空闲文件目录(空闲表)

    空闲盘块表

    + + + + + + + + + + + + + + + + + + + + + + + +
    序号第一个空闲盘块号空闲盘块数
    124
    293
    适用于连续文件结构的文件存储区的分配与回收
    +

    空闲块链

    分类

    +
      +
    • 空闲盘块链
    • +
    • 空闲盘区链
    • +
    +

    常用的链接方法

      +
    • 按空闲区大小顺序链接
    • +
    • 按释放先后循序链接
    • +
    • 成组链法
    • +
    +

    位示图

    盘块的分配

      +
    1. 顺序扫描位示图,找到一个或一组“0”
    2. +
    3. 若“0”位于第i行,第j列,对应的盘块b=n(i -1)+j
    4. +
    5. 修改位示图“0”变“1”
    6. +
    +

    盘块回收

    i=(b-1)/n +1
    j=(b-1)%n +1

    +

    目录结构

    文件控制块FCB

    FCB必须连续存放

    +

    FCB的有序集合称为文件目录

    +

    FCB包含的信息:

    +
      +
    1. 基本信息
    2. +
    3. 存取控制信息 文件存取权限等
    4. +
    5. 使用信息 文件建立时间、修改时间
    6. +
    +

    索引结点

    UNXI中的磁盘索引结点包含信息:

    +
      +
    1. 文件主标识符 个人或小组
    2. +
    3. 文件类型 普通文件、目录文件、特别文件
    4. +
    5. 文件存取权限
    6. +
    7. 文件物理地址 13个地址项iaddr(0)~iaddr(12)
    8. +
    9. 文件长度 以字节为单位
    10. +
    11. 文件链接计数
    12. +
    13. 文件存取时间
    14. +
    +

    文件被打开时有增加了以下内容:

    +
      +
    • 索引结点编号 标识内存索引结点
    • +
    • 状态 指示是否上锁或被修改
    • +
    • 访问计数
    • +
    • 逻辑设备号
    • +
    • 链接指针
    • +
    +

    目录结构

    所要执行的操作

    +
      +
    • 搜索
    • +
    • 创建文件
    • +
    • 删除文件
    • +
    • 显示目录
    • +
    • 修改目录
    • +
    +

    单级目录结构

    一个文件占一个目录

    +

    两级目录结构

    主文件目录MFD

    记录用户文件目录所在位置和用户名

    +
    用户文件目录UFD

    用户文件的FCB

    +

    多级目录结构

    树形目录结构

    +

    从根目录出发的路径是绝对路径

    +

    当前目录 :基于当前工作目录(相对路径)

    +

    方便对文件分类

    +

    无环图目录结构

    树形目录结构的基础上增加了一些指向同一结点的有向边

    +

    实现文件共享

    +

    目录实现

    线性列表

    最简单的方法:使用存储文件名和数据指针的线性表

    +

    哈希表

    根据文件名,得到一个值,并返回一个指向线性列表中元素的指针。

    +

    文件共享

    从系统管理的角度,三种方法实现文件共享

      +
    1. 绕道法
    2. +
    3. 链接法
    4. +
    5. 基本文件目录表
    6. +
    +

    现代常用的两种共享方法

    基于索引结点的共享方式(硬链接)

    树形结构中,当有两个或多个用户要共享一个子目录或文件时,必须将共享文件或子目录链接到两个或多个用户的目录中。

    +

    利用符号链实现文件共享(软链接)

    创建一个LINK类型的新文件,B用户借助该文件实现对A用户的F文件的共享,新文件也取名F,其中存放F的路径名,视为符号链。

    +

    硬链接和软链接都是静态共享方法。

    +

    文件保护

    文件的保护方式有口令保护、加密保护、访问控制等。

    +

    存取控制

    存取控制分三个步骤

      +
    1. 审定用户的存取权限
    2. +
    3. 比较用户权限与用户的本次存取要求是否一致
    4. +
    5. 将存取要求和被访问文件的保密性比较,看是否有冲突
    6. +
    +

    四种方式来验证用户的存取

    1. 存取控制矩阵

    二维矩阵,一维是所有的用户,一维是所有的文件。
    对应的矩阵元素是用户对文件的存取权限,包括读R,写W,执行E。

    +
    2. 存取控制表

    (访问控制表)
    规定每个用户名和其所允许的访问类型
    精简的表分三种用户类型

    +
      +
    • 拥有者
    • +
    • +
    • 其他
    • +
    +
    3. 口令

    分两种

    +
      +
    • 一种是当用户进入系统时,为建立终端进程时获得操作系统使用权的口令
    • +
    • 另一种是每一个用户创建文件夹时,为每一个创建的文件设置一个口令,并将其置于文件说明中。
    • +
    +
    4. 密码术

    比口令方式保密性好

    +

    文件系统的结构层次模型

    用户接口(系统调用)——符号文件系统SFD(文件名—>文件标识符fd)——基本文件系统BFD(由fd—>获得控制信息)——存取控制验证(合法性检查)——逻辑文件系统(逻辑块号—>相对块号)——物理文件系统(相对块号—>物理块号)——存储设备分配 或 设备策略模块(物理块号—>设备要求的地址格式)——启动IO

    +

    磁盘调度算法

    一次磁盘读写操作的时间由寻道时间、旋转延迟和传输时间决定。

    +
      +
    • 寻道时间Ts=与磁盘转速有关的常数m*n条磁道+启动磁臂的时间s,其中m约等于0.2ms,s约等于2ms
    • +
    • 旋转延迟时间Tr=1/2*磁盘旋转速度r 5400转的磁盘一周11.1ms,Tr为5.55ms
    • +
    • 传输时间Tt=每次所读写的字节数b/(磁盘每秒转速r*一个磁道上的字节数N)
    • +
    • 总平均存取时间Ta=Ts+Tr+Tt
    • +
    +

    磁盘调度算法

    先来先服务FCFS

    寻找先来的

    +

    最短寻找时间优先SSTF

    寻找离最近的

    +

    扫描算法SCAN

    (电梯调度)
    走到头(磁盘的最远端)再回头

    +

    循环扫描C-SCAN

    走到头再回头+只沿一个方向走

    +

    LOOK C-LOOK

    与SCAN和C-SCAN类似
    但是走到最远端的请求就回头

    +

    设文件索引结点中有7个地址项,其中4个地址项是直接地址索引,2个地址项是一级间接地址索引,1个地址项是二级间接地址索引,每个地址项大小为4B,若磁盘索引块和磁盘数据块大小均为256B,则可表示单个文件的最大长度为()
    4个直接地址索引指向的数据块大小为4256B。
    每个磁盘索引块有256/4=64个地址项。
    2个一级间接索引包含2
    64个地址项,所指向的数据块大小为264256B
    1个二级索引指向的数据块大小为16464256B
    最大长度为(4+2
    64+26464)*256B

    +

    簇大小相当于磁盘索引块大小
    4KB的簇可放4K/4=1024个4B的地址项
    可表示的文件的总个数受限于文件索引结点的总个数
    所以在计算最多存多少文件的时候除了考虑簇大小,还应考虑文件索引结点的总个数。
    如每个文件索引结点占64B,文件系统用1M个簇存放文件索引结点,512M个簇存放文件数据,文件大小为5600B,则索引总个数为1M*4KB/64B=65M,簇占4KB一个文件占2个簇,512M个簇可存放256M个文件。则最后最多存放64M个文件。

    +

    IO设备

    按使用特性分

      +
    • 人机交互类外部设备
    • +
    • 存储设备
    • +
    • 网络通信设备
    • +
    +

    按传输速率分

      +
    • 低速设备 每秒几字节到几百字节
    • +
    • 中速设备 每秒数千字节到上万字节
    • +
    • 高速设备 每秒数百千字节到千兆字节
    • +
    +

    按信息交换单位分

      +
    • 块设备
    • +
    • 字符设备
    • +
    +

    IO控制方式

    程序直接控制方式

    CPU与IO只能串行工作

    +

    中断驱动方式

    允许IO设备主动打断CPU的运行并请求服务

    +

    DMA

    在IO设备和内存之间开辟直接的数据交换通路 ,彻底解放CPU。

    +

    特点

      +
    • 基本单位是数据块
    • +
    • 数据从设备直接送入内存
    • +
    • 整块数据的传送都是在DMA控制器下控制的
    • +
    +

    必须的寄存器

      +
    • 命令/状态寄存器(CR)存放控制信息,或设备状态
    • +
    • 内存地址寄存器(MAR)设备到内存的起始目标地址和内存到设备的内存源地址
    • +
    • 数据寄存器(DR) 暂存数据
    • +
    • 数据寄存器(DC) 存放本次要传送的字节数
    • +
    +

    通道控制方式

    专门负责IO的处理机。
    可实现CPU、通道、IO设备的并行工作。

    +

    IO子系统的层次结构

    用户层IO软件

    实现与用户交互的接口 提供与IO有关的库函数。

    +

    设备独立性软件

    实现用户程序与设备驱动器的统一接口、设备命令、设备保护以及设备分配与释放等。
    将逻辑设备名映射为物理设备名(通过LUT)

    +

    好处

      +
    • 增加设备分配灵活性
    • +
    • 易于实现IO重定向
    • +
    +

    其主要功能

      +
    • 指向所有设备的公有操作
    • +
    • 向用户层提供统一接口
    • +
    +

    设备驱动程序

    具体实现系统对设备发出的操作指令,驱动IO设备工作的驱动程序

    +

    中断处理程序

    用于保存被中断进程的CPU环境。切换上下文、中断信号源测试、读取设备状态、修改进程状态。

    +

    硬件

    机械部件

    设备本身

    +

    电子部件

    设备控制器(适配器)

    +
    主要功能
      +
    • 接受和识别CPU指令
    • +
    • 实现数据交换
    • +
    • 发现和记录设备及自身的状态信息
    • +
    • 设备地址识别
    • +
    +
    组成
      +
    • 设备控制器与CPU的接口:数据线、地址线、控制线
    • +
    • 设备控制器与设备的接口
    • +
    • IO控制逻辑
    • +
    +

    缓冲

    目的

      +
    1. 减少CPU与IO设备间速度不匹配矛盾
    2. +
    3. 减少CPU中断频率
    4. +
    5. 解决基本数据单元大小不匹配问题
    6. +
    7. 提高CPU与IO之间的并行行
    8. +
    +

    实现方法

      +
    • 采用硬件缓冲器
    • +
    • 采用缓冲区(位于内存)
    • +
    +

    缓冲种类

    单缓冲

    设备和处理机之间设置一个缓冲区。

    +

    双缓冲

    因为CPU在传送中存在空闲状态,引入双缓冲。

    +

    循环缓冲

    最后一个缓冲区指针指向第一个缓冲区

    +

    缓冲池

    多个系统公用的缓冲区组成,形成 空缓冲队列装满输入数据的缓冲队列(输入队列)和装满输出数据的缓冲队列(输出队列)
    缓冲首部:设备号——数据块号——缓冲器号——互斥标识符——链接指针

    +

    设备的分配与回收

    按设备的分配特性分类

    独占式使用设备
    分时式共享使用设备
    以SPOOLing方式使用外部设备

    +

    设备分配的数据结构

    设备控制表DCT

    内容
      +
    • 设备标识符
    • +
    • 设备类型
    • +
    • 设备地址或设备号
    • +
    • 设备状态
    • +
    • 等待队列指针
    • +
    • IO控制器指针
    • +
    +

    通道控制表CHCT

    内容
      +
    • 通道标识符
    • +
    • 通道忙/闲标识
    • +
    • 等待队列的首/尾指针
    • +
    +

    控制器控制表COCT

    反映IO控制器的使用状态及与通道的连接情况等

    +

    系统设备表SDT

    内容
      +
    • DCT指针
    • +
    • 正在使用进程标识符
    • +
    • 设备类型和设备标识符
    • +
    +

    设备分配的策略

    设备分配原则

    又要效率又减少死锁还要独立

    +

    分配方式

    静态分配
    动态分配

    +

    设备分配算法

    先请求先分配
    优先级高者分配

    +

    安全性

    安全分配方式

    每当有IO请求时进入阻塞,直到IO结束被唤醒

    +

    不安全分配方式

    进程在IO请求后继续运行

    +

    逻辑设备名到物理设备名的映射

    通过逻辑设备表LUT

    +

    SPOOLing

    (假脱机技术)

    +

    输入输出井

    输入缓冲区和输出缓冲区

    输入进程和输出进程

    特点

    提高了IO速度,将独占设备改造成共享设备,实现了虚拟设备功能。

    +]]>
    + + 技术 + 操作系统 + + + 操作系统 + 进程 + +
    + + 需求分析 + /2020/04/03/3-3%E9%9C%80%E6%B1%82%E5%88%86%E6%9E%90%E6%A1%88%E4%BE%8B/ + 3-3需求分析案例

    “Android点餐系统”项目案例需求获取资料介绍如下:

    +

    (1)目标和范围

    本软件主要作用是为点餐者提供一套可以在移动设备(手机、平板)上运行的点餐软件。 系统分为前台和后台,前台是点餐者使用的,点餐者可以在移动设备上查看餐馆所有的菜目、价格、简单的菜品介绍以及餐馆的特色菜介绍,同时点餐者还可以查看、取消自己已经挑选的菜品,最后上传订单。后台是管理员使用的,管理员可以在后进行订单管理、用户管理、菜谱管理等。

    +

    (2)系统角色和职责

    系统的使用人群包括两类管理员:系统的维护,订单管理、菜品的增删。

    +

    普通用户:注册账号,点餐、座位预订。

    +

    (3)系统处理功能要求

    查询菜品
    设置菜品
    顾客下单
    订单处理
    数据处理

    +

    (4)系统其他要求

    本系统客户端要求符合大众操作习惯,与网上其他的Android系统App操作方式保持基本一致。餐馆要求每笔订单交易误差不得超过工角,每天交易额的误差不得超过100元。5年内价位在500元以上的Android手机都可以流畅运行该系统。

    +

    第一阶段

    工作的输入是需求定义阶段产生的业务事件列表和报表列表,输出的是领域模型和用例模型。

    +

    针对每个业务事件进行业务流程分析、业务实体分析和用例分析;

    +

    针对每类报表进行业务实体分析和用例分析。

    +

    业务流程分析

    在分析过程中,要注意抓住核心业务和主要活动点、部门内以及部门之间的衔接,工作中的烦琐及反复的环节,成本高、效率低、时间长的环节以及任务转手次数较多的环节。

    +

    “Android点餐系统”中的主要业务就是点餐,我们要围绕点餐的主业务展开分析。

    +

    业务流程分析的过程中的三个关键的要点

    一是理解流程的层次性,其中包含三大层次,有组织级,部门级
    岗位级;

    +

    二是了解流程的类型,包括生产性流程,管理性流程和支持性流
    程;

    +

    三是掌握以业务事件识别、寻找流程的技巧。

    +

    产物

    跨职责流程图
    活动图
    数据流图

    +

    基于Android平台的点餐系统的总体流程包括的步骤有


    (1)顾客在智能手机上登录点餐系统客户端后,自动进入
    菜谱界面,查看菜谱;
    (2)顾客选择菜品进行下单;
    (3)顾客选择菜品数量,若需在餐厅用餐还需选择座位号;
    (4)选择完成并确定后,提交订单;
    (5)订单提交后,订单数据会上传到服务器;
    (6)订单提交后,顾客可以在客户端查看自己的订单情况;
    (7)在管理员未确认订单之前,顾客可以对订单进行修改或取消操作;
    (8)管理员登录点餐系统服务器端,对用户订单进行确认;
    + +

    跨职责流程图的应用

    跨指责流程图绘制要点是在进行业务流程分析时,采用的关键入手点为部门级的业务流程,也就是从业务事件出发,分析该业务事件会触发的一系列活动。要真正保障绘制出来的跨职责流程图是真实、有效的,就必须强化用户的参与。

    +

    我们应先找到业务事件的负责人,然后通过设问的方式,让他描述响应该业务事件所进行的活动,说明活动的执行岗位以及它们之间的关系、数据传递。

    +

    (三)活动图
    活动图是一种表述过程机理、业务过程以及工作流的技术。它可以用来对业务过程、工作流建模,也可以对用例实现甚至是程序实现来建模。
    活动图的主要元素包含初始节点活动终点活动节点转换分支与监护条件分岔汇合等。

    +

    数据流程图

    点餐系统由客户端和服务器端两部分组成,客户端主要负责点菜,服务器端负责信息管理。

    +
    客户端的基本流程
    (1)用户输入正确的登录信息进入系统,若登录信息不对,系统提示重新输入登录系统,直到用户成功登录系统,新用户要先进行注册并注册成功才可以登录系统。
    (2)用户成功登录系统后,可先查看菜品信息,选择菜品及数量,若需在餐馆用餐还需选择座位,完成后进行下单操作。
    (3)用户可以查看自己的订单,在订单未确定的情况下,可以修改或取消订单。
    + +
    服务器端的基本流程
    (1)管理员输入正确的登录信息进入系统,若登录信息不对,系统会提示重新输入登录信息,直到管理员成功登录系统。
    (2)管理员成功进入系统后,可进行各类信息的管理,如菜品信息管理、用户信息管理、订单管理等,其实就是对上述信息进行添加、删除及修改操作。
    + +

    业务实体分析

    要了解这个问题域中有哪些业务实体,它们之间存在什么样的逻辑关系、数量关系,以及有什么相应的结构规则。

    +

    1.业务实体分析任务概述

    “自底向上”

    +

    识别出业务实体
    确定实体间关系
    定义实体关健属性

    +

    业务实体分析的产物有两种可选的模型,包括类图和E/R模型也叫实体关系图。

    +

    2.类图

    根据边界类、控制类、实体类帮助分析系统中的类

    (1)领域建模方法

    +

    领域建模时,其工作主要就是识别标识类、明确类之间的逻辑关系和数量关系以及添加重要的结构规则三个方面。

    +

    (2)建立类之间的关联

    +

    (3)添加类的重要属性

    +
    分析模型中有3种十分有用的构造型即实体类、控制类和边界类。

    实体类:即实体对象的抽象,通常来自域模型也就是现实世界,用来描述具体的实体,通常映射到数据库表格与文件中;

    +

    控制类:即控制对象的抽象,主要用来体现应用程序的执行逻辑,将其抽象出来,可以使得变化不影响用户界面和数据库中的表;

    +

    边界类:即边界对象的抽象,通常是用来完成参与者(用户、外部系统)与系统之间交互的对象,例如From、对话框、菜单、接口等。

    +

    3.E/R图应用基础

    数据建模过程的优势体现在能够更好地与后续的数据库设计
    结合;

    +

    缺点是语义相对于类图来说更弱一些,同时对面向对象开发的指导作用相对差- - .些。

    +

    概念模型是需求人员的视图,等价于现在出镜率很高的领域模型;

    +

    逻辑模型是开发人员(包括设计人员)的视图,它约等于面向对象分析与设计方法中提到的“分析模型”。

    +
    概念模型与逻辑模型具体区别在于两个方面

    完整性:逻辑模型在完整性上要比概念模型更胜筹,通过在需求细化、设计的阶段会对类的属性进行细化,会补充-些新的类;

    +

    加工方式:概念模型的原则是忠于问题域,而逻辑模型则会从实现的便利性和需要的角度进行细化,具体来说可能会对一些类进行分拆、合并。

    +]]>
    + + 技术 + + + 小白 + +
    + + 3D-VIRTUS Equilibrium condition solver of radio-frequency magnetized plasma discharges for space applications + /2023/06/07/3D-VIRTUS-Equilibrium-condition-solver-of-radio-frequency-magnetized-plasma-discharges-for-space-applications/ + 摘要

    我们介绍了 3D-VIRTUS(3 维高级流体漂移扩散等离子体求解器),这是一种用于评估螺旋等离子体源平衡条件的数值工具,由电磁模块流体模块组成。第一个评估通过驱动放电的天线沉积到等离子体中的功率,它基于固体数值工具(即 ADAMANT)。第二个模块使用功率沉积通过流体方法解决带电和中性物质的宏观传输,并假设 DriftDiffusion 近似有效。连续性、动量、能量和泊松方程组通过有限体积法进行数值求解,并在 OpenFOAM 中实现。迭代这两个模块,直到获得收敛的解决方案。这种方法允许对 Helicon 源中处于平衡状态的局部等离子体参数(例如,等离子体密度)进行自洽评估,该参数具有(i)任意形状的等离子体区域和天线,(ii)由电磁铁产生的真实静磁场或永久磁铁。 FLUID 模块的数值精度已被评估为时间和空间离散化的函数。 FLUID 模块和 3D-VIRTUS 代码已经针对其他成熟的数值方法和实验测量进行了独立验证。最后,3D-VIRTUS 已被用于研究用于空间推进应用的 Helicon 等离子体放电,静磁场值从 0 G 到 750 G。

    +

    模拟

    流体

    流体方法假定粒子分布函数,并根据连续性、动量和能量方程 [27] 来描述等离子体放电。如果未计算分布函数,则流体模型无法解释非局部动力学 [28]。

    +

    因此,这种方法不适用于低压放电 (≤1mTorr),在这种情况下,由于碰撞率低,非局部效应往往很重要。尽管有此限制,流体模型已被广泛使用,因为它们在计算速度方面相对于其他方法具有优势 [29]。此外,可以轻松处理大量物种,从而可以研究以众多反应为特征的系统 [28]。

    +

    动力学

    动力学方法基于麦克斯韦方程的解以及积分微分玻尔兹曼方程 [27],并允许唯一地确定自洽粒子分布函数。

    +

    从后者的知识来看,粒子密度、平均速度等宏观量都是通过对分布函数求平均来确定的。由于它复杂且计算量大,因此动力学方法主要应用于简化假设,例如单维模拟 [30]。

    +

    具有蒙特卡洛碰撞的Paticle-In-Cell (PIC-MCC)

    在 PIC-MCC 方法中,计算粒子(即物理带电粒子云)的轨迹在 EM 场的影响下及时整合 [31]。

    +

    特别是,控制方程用很少的近似值求解,允许对局部和非局部效应进行精确建模,进而对粒子分布函数进行建模 [28]。这种方法虽然非常准确,但计算量很大,对于高密度 (≥ 10^19 m^−3) 等离子体尤其如此;计算成本实际上与模拟的粒子数量有关。

    +

    尽管如此,已经开发出各种技术来加速 PIC-MCC 模拟,即隐式移动器、更长的离子时间步长、更轻的质量离子、电子和离子的不同权重、不均匀的初始密度分布、低和高的不同权重能量粒子和代码并行化[28]。

    +

    尽管结合使用这些技术可以大大减少仿真时间,但 PIC-MCC 代码通常仍然比流体代码慢。因此,PIC 模拟非常适合非局部效应非常重要且粒子密度低 (≤ 10^17 m^−3) [28] 的低压排放。

    +

    混合

    为了保持 PIC-MCC 和动力学模拟的准确性,同时减少计算负担,上述方法已结合在混合求解器中 [30,32]。根据要建模的物理场,可以采用各种策略。离子可以模拟为流体,而电子在 PIC-MCC 方案中进行处理 [33]。或者,只有高能电子可以使用 PIC-MCC 策略进行模拟,而离子和低能电子被视为流体 [34]。混合方法的主要限制是生成的算法可能非常繁琐 [28]。

    +

    3D-VIRTUS的主要特点:

    (i)处理复杂形状的 Helicon 源的能力

    +

    (ii) 实际射频天线的建模及其电流分布

    +

    (iii) 在流体问题的解决方案中可以很容易地从 1D 重新配置到3D,这取决于手头问题的几何复杂性和所需的精度

    +]]>
    +
    + + A 1D cylindrical kinetic wave code for helicon plasma sources + /2023/07/08/A-1D-cylindrical-kinetic-wave-code-for-helicon-plasma-sources/ + 摘要

    我们描述了一个一维等离子体动力学代码 UFEM,它是专门为处理圆柱形低温等离子体中的射频波激发和传播而设计的。该代码应该广泛应用于螺旋波驱动等离子体源的设计和研究,螺旋波驱动等离子体源越来越多地用于工业等离子体处理。该代码包括碰撞耗散的影响和重要的并行电子动力学,例如描述波吸收所必需的朗道阻尼。它采用电磁势方面的射频场有限元离散化,适用于螺旋波通常传播的较低混合频率范围内的波计算。已知有限拉莫尔半径效应在工业等离子体源中可以忽略不计。因此,这些被忽略,导致介电张量大大简化;特别是,避免了平衡梯度项的复杂问题。用户可以从多种标准天线类型的菜单中进行选择,以便可以轻松地执行天线优化。可以使用四种不同的圆柱系统几何形状。复杂天线近场和短波长模式的重要问题可以完全自洽地处理。我们还针对 Alfven 至较低混合频率范围的四种不同波浪条件对 UFEM 和 ISMENE 5 代码进行了基准测试。最后,我们总结了由实际天线驱动的典型螺旋等离子体源条件下的代码结果。

    +

    温等离子体介电张量

    从粒子守恒模型中带有碰撞项的线性化 Vlasov 方程开始

    +

    (1)

    +

    f 是分布函数

    +

    n 是密度

    +

    v 是碰撞频率

    +

    wc 为特定粒子(电子或离子)的回旋频率

    +

    下标1表示扰动量,0表示平衡量(f0为麦克斯韦分布)

    +

    可推导出以下形式的等离子体介电张量

    +

    (2)

    +

    VTα= (2Tα/mα)^(1/2)为粒子热速度

    +

    综上可知,在所有带电粒子中(电子和离子)wcα占电荷符号

    +

    Z是著名的等离子体色散函数

    +

    +

    (3)

    +

    这也可以通过二维化的复误差函数来表示

    +

    (4)

    +

    上述定义的等离子体色散函数满足对称性要求

    +

    (5)

    +

    由Stix在因果关系原理的基础上推导得到。

    +

    在磁流体动力学( Mhd )极限下,

    +

    (6)

    +

    而张量元素(2)化简为

    +

    (7)

    +

    在张量(2)的推导过程中做出的假设是,粒子拉莫尔半径p相对于波场变化的尺度长度较小。

    +

    (8)

    +

    而且波的频率并不接近粒子陀螺频率的谐波

    +

    (9)

    +

    通过使用介电张量的”降阶”形式可以实现显著的简化,该形式仅描述快速磁声波( FMW ),但通过FMW耗散可以适当地解释模式转换能量,从而消除了与短波长离子Bcrnstein波的数值分辨率有关的问题。

    +

    这主要是针对众多面向聚变的设备中的离子回旋共振加热(ICRH)场景,通常需要至少2D数值方案来进行适当的建模。然而,在螺旋波频率范围内,有限拉莫尔半径(FLR)效应往往并不重要。

    +

    我们在张量( 2 )中使用的碰撞频率包括电子-离子和离子-电子碰撞

    +

    (10)

    +

    (11)

    +

    (12)

    +

    (13)

    +

    +

    对于螺旋波等离子体源,我们往往还必须考虑电子-中性碰撞

    +

    由于这种情况下的等离子体通常被限制在绝缘的(玻璃)管中,电子-壁面碰撞可以在等离子体边缘提供一个显著的波耗散机制。电子与壁面的碰撞频率可以表示为

    +

    (14)

    +

    (14)式可以用公式非常精确地近似

    +

    (15)

    +

    概述了模型所描述的波型

    UFEM

    UFEM代码是在考虑了helicon等离子体源的情况下设计的。

    +

    数学模型

    方程的有限差分离散。程序ORION [37]采用了( 26 )的方法。

    +

    (26)

    +

    我们介绍了有限元数值算法的理论基础,该算法允许我们获得具有等离子体介电张量(2)的麦克斯韦方程组的无污染解。

    +

    我们最终得到如下线性系统,联立方程(34)-(37),得(4N-3)^2,15对角带矩阵(虽然有点麻烦,但我们在这里重现它,因为它是剩余分析所需要的):

    +

    (34)

    +

    +

    (35)

    +

    (36)

    +

    (37)

    +

    其中:

    +

    +

    +

    能量沉积

    半径为r的等离子体柱内的总功率沉积率Q(r)可以通过介电张量的反厄米部分表示并分裂为(m,kz)模。

    +

    (42)

    +

    文中对介电张量在不同角度求解

    +]]>
    + + 文献 + + + 文献 + +
    + + A flowing plasma model to describe drift waves in a cylindrical helicon discharge + /2023/06/02/A-flowing-plasma-model-to-describe-drift-waves-in-a-cylindrical-helicon-discharge/ + 摘要

    一种双流体模型最初是用来描述真空电弧离心机(一个快速旋转、低温、密闭的圆柱形等离子体柱)中的波振荡,该模型被用于解释具有相似密度和场强的RF产生的线性磁化等离子体[WOMBAT(磁化束和湍流上的波)]中的等离子体振荡。与典型的离心等离子体相比,WOMBAT等离子体的归一化旋转频率较慢,温度较低,轴向速度较低。尽管存在这些差异,但双流体模型提供了对WOMBAT等离子体结构的一致描述,并且在测量和预测的波振荡频率轴向场强之间取得了定性一致。此外,该模型预测的密度扰动的径向分布与实测数据一致。参数扫描表明,色散曲线对轴向场强电子温度敏感,振荡频率随电子温度的变化规律与实验吻合。这些结果巩固了先前的说法,即密度和浮动电位振荡是由密度梯度驱动的电阻漂移模式。据我们所知,这是第一个在远离射频源的扩散区域流动等离子体的详细物理模型。还讨论了模型的可能扩展,包括温度不均匀性和磁场振荡。

    +

    WOMBAT装置

    Figure 1

    +

    该图为不同螺旋波等离子体装置以及典型操作参数

    +

    table from another article

    +

    典型的WOMBAT和PCEN等离子体装置的参数

    table 1

    +
    +

    螺旋等离子体中的低频振荡大致可分为两类:开尔文-亥姆霍兹不稳定性和漂移波

    +

    开尔文-亥姆霍兹不确定性(Kelvin–Helmholtz instability)

    开尔文-亥姆霍兹不稳定性是由质量流中的速度剪切或两种流体界面上的速度差驱动的这可能发生在螺旋等离子体中,因为离子流体的流动速度比电子慢得多

    +

    漂移波(drift waves)

    漂移波是由垂直于环境场的等离子体压力梯度驱动的普遍不稳定性它可以在完全电离、磁约束和低β等离子体中产生,并且在线性和环形场几何中都被观察到。

    +

    双流体模型

    包括离子流体和电子流体的运动方程和连续性方程:

    +

    (1)

    +

    (2)

    +

    (3)

    +

    (4)

    +]]>
    +
    + + An evaluation of different antenna designs for helicon wave excitation in a cylindrical plasma source + /2023/05/17/An-evaluation-of-different-antenna-designs-for-helicon-wave-excitation-in-a-cylindrical-plasma-source/ + + + + Bean的作用域 + /2021/03/12/Bean%E7%9A%84%E4%BD%9C%E7%94%A8%E5%9F%9F/ + Bean的作用域 + +
    +

    作用域

    singleton

    +

    单例(默认值), 在每个SpringIOC容器中,一个bean定义对应一个对象实例

    +

    prototype

    +

    一个bean定义对应多个对象实例

    +

    request

    +

    在一次HTTP请求中,一个bean定义对应一-个实例,即每次HTTP请求将会有各自的bean实例,它们依据某个bean定义创建而成。该作用域仅在基于Web的Spring ApplicationContext的情况下有效。

    +

    session

    +

    在一个HTTP Session 中,一个bean定义对应一个实例。该作用域仅在基于Web 的SpringApplicationContext的情况下有效

    +

    global session

    +

    在一个全局的HTTP Session中,一个bean定义对应一个实例。典型情况下,仅在使用portlet context的时候有效。该作用域仅在基于Web的Spring ApplicationContext的情况下有效

    +
    +

    注解形式

    +
    @Bean ("stu")
    + +

    配置文件形式

    +
    <bean id="student" class=" com.ehshyee.entity.Student">
    value :简单类型
    <property name="stuNo"value="1"></property>
    <property name="stuName" value="张三"></property>
    <property name="stuAge" value="23"></ property>
    ref:其他类型
    <property name="address" ref="myaddress"></property>
    </bean>
    + +

    分别对其获取两个学生 查看是否为同一个

    +
    Student stul = (Student) context.getBean(S:"student") ;
    Student stu2 = (Student) context.getBean(S:"student") ;
    System.out.println(stul =stu2) ;
    + +

    均返回true

    +

    在xml中scope默认是singleton 可改为prototype

    +
    <bean id="student" class=" top.ehshyee.entity.Student" scope="prototype">
    + +

    改后返回false

    +

    注解中添加

    +
    @scope("prototype")//默认singleton
    + +

    对于实例产生的时机

    +

    一些测试

    +
    public Student() {
    System.out.println("student无参构造") ;
    }
    public Student(int stuNo, String stuName, int stuAge) {
    super();
    this.stuNo = stuNo;
    this.stuName = stuName;
    this.stuAge = stuAge;
    //有参构造
    }
    + + +

    singleton | prototype

    +

    执行时机(产生bean的时机) :

    +

    default)singleton:容器在初始化时,就会创建对象(唯一的一个);以后再getBean时,不再产生新的bean.singleton也支持延迟加载(懒加载) :在第一次使用时产生。

    +

    prototype:容器在初始化时,不创建对象;只是在每次使用时(每次从容器获取对象时,context.getBean(Xxxx)),再创建对象,并且,每次getBean()都会创建一个新的对象。

    +

    延迟加载(注解形式)

    +
    @lazy
    + +

    条件注解 –>SpringBoot

    可以让某一个Bean在某些条件下加入Ioc容器,其他情况下不加IoC容器。

    +

    a.准备bean

    +
    public interface Car {

    }
    public class EnegerCar implements Car {
    }
    public class OilCar implements Car{
    }
    + +

    b.增加条件Bean:给每个Bean设置条件,必须实现Condition接口

    +
    public class OilCarCondition implements Condition {
    @Override
    public boolean matches(ConditionContext conditionContext, AnnotatedTypeMetadata annotatedTypeMetadata) {
    //如果当前环境的车类型是Oil,则加入OilCar
    //获取环境
    Environment environment=conditionContext.getEnvironment();
    String carType=environment.getProperty("car.type");

    return carType.contains("oil");
    }
    }
    public class EnergyCarCondition implements Condition {
    @Override
    public boolean matches(ConditionContext conditionContext, AnnotatedTypeMetadata annotatedTypeMetadata) {
    //如果当前环境的车类型是energy,则加入energyCar
    //获取环境
    Environment environment = conditionContext.getEnvironment();
    String carType = environment.getProperty("car.type");

    return carType.contains("energy");
    }
    }
    + +

    c.根据条件加入IOC容器

    +
    @Bean
    @Conditional (OilCarCondition.class)
    public Car oilCar ()
    {return new oilCar()}
    @Bean
    @Conditional (EnergyCarCondition.class)
    public Car energyCar ()
    {return new EnergyCar ()}
    + +

    测试

    +

    在VM option中添加参数为oil-Dcar.type=oil

    +
    public static void testAnnotation {
    //注解方式
    ApplicationContext context = new AnnotationConfigApplicationContext (MyConfig.class);
    String[] beanDefinitionNames = context.getBeanDefinitionNames();
    for (String name : beanDefinitionNames) {
    System.out.println(name) ;
    }}
    + +

    给IoC加入Bean的方法

    注解:

    +

    ​ 三层组件: 扫描器+三层注解

    +

    ​ 非三层组件@Confiquration:

    +
      +
    1. @Bean+返回值
    2. +
    3. @import
    4. +
    5. FactoryBean(工厂 Bean)
    6. +
    +

    @import使用:

    ①直接编写到@Import中

    +
    @Confiquration
    @Import ( {Apple.class, Banana.class} )
    //bean是id 是全类名
    + +

    ②自定义ImportSelector接口的实现类,通过selectimports方法实现,方法的返回值就是要纳入IoC容器的Bean),并告知系统自己编写的实现类。

    +
    public class MyImportSelector implements ImportSelector {
    @Override
    public String[] selectImports (AnnotationMetadata importingClassMetadata) {
    //return new string[0] ;//返回值就是要加入IOC容器的bean的全类名
    return new String[]{ "top.eshyee.entity.Apple", "top.eshyee.entity.Banana"}
    }
    + +
    @Import(Orage.class,MyImportSelector.class)
    + +

    ③编写ImportBeanDefinitionRegistrar接口的实现类,重写方法

    +
    public class MyImportBeanDefinitionRegistrar implements ImportBeanDefinitionRegistrar{
    @Override
    public void registerBeanDefinitions(AnnotationMetadata importingClassMetadata, BeanDefinitionRegistry registry) {
    BeanDefinition beanDefinition new RootBeanDefinition(Orange.class) ;
    // or BeanDefinition beanDefinition new RootBeanDefinition("top.eshyee.entity.Orange") ;
    registry.registerBeanDefinition("myorange",beanDefinition);
    }
    }
    + +
    @Import(MyImportBeanDefinitionRegistrar)
    + +

    FactoryBean(工厂 Bean)

    写注册类

    +
    public class MyEactoryBean implements FactoryBean
    {
    @Override
    public Object getobject() throws Exception {

    return new Apple;
    }
    @Override
    public Class<?> getobjectType() {
    return Apple.class ;
    }
    @Override
    public boolean isSingleton() {
    return true;
    }
    }
    + +

    bean中实现

    +
    @Bean
    public FactoryBean<Apple> myFactoryBean() {
    return new MyFactoryBean() ;
    }
    + +

    拿myFactoryBean中的值

    +
    object obj (context. getBean( "myFactoryBean") );
    System.out.println(obj) ;
    object obj (context. getBean( "&myFactoryBean") );
    System.out.println(obj) ;
    + +

    &:不加&获取的是最内部真实的Apple;

    +]]>
    + + Java + + + Spring + Java + +
    + + C++小tips + /2021/03/12/C++%E5%B0%8Ftips/ + C++小tips
    #include<iostream>
    #include<string>
    //#include "swap.h"

    using namespace std;

    //定义常量--第一种方式--宏常量
    #define Pi 3.14

    int numGuess() {
    cout << "猜数字" << endl;
    int uu = 0;
    cin >> uu;
    int num = rand() % 100;
    while (uu != num)
    {
    if (uu > num) {
    cout << "大了" << endl;
    cin >> uu;
    }
    else
    {
    cout << "小了" << endl;
    cin >> uu;
    }
    }
    cout << "猜对了" << endl;
    return uu;
    }

    int foruse(int u) {
    float i = 1.000001;
    for (; i < u; )
    {
    i *= i;
    }
    return i;
    }


    int base() {
    //注释
    cout << "Hello Shyee" << endl;
    /*多行
    注释*/

    //创建变量a
    int a = 10;
    cout << "a= " << a << endl;
    //定义常量的第二种方法--const
    const int Day = 7;
    cout << "Pi= " << Pi << endl;
    cout << "Day= " << Day << endl;
    //Day = 18; 修改常量会报错

    short b = 65536;
    cout << "b=" << b << endl;

    //SizeOf关键字
    //求数据类型站内存的大小

    short num1 = 10;
    cout << "short占内存大小为:" << sizeof(short) << endl;
    cout << "short占内存大小为:" << sizeof(num1) << endl;

    /*
    short[短整型)
    2字节
    (-2^15~2^15 - 1)
    int(整型)
    4字节
    (-2 ^ 31 ~2 ^ 31 - 1)
    long(长整形
    Windows为4字节, Linux为4字节(32位),8字节(64位)
    (-2 ^ 31 ~2 ^ 31 - 1)
    long long(长长整形
    8字节
    (-2 ^ 63 ~2 ^ 63 - 1)
    */

    float f1 = 3.14f;//小数默认时双精度,所以后面加一个f
    double f2 = 3.14;
    cout << "f1:" << f1 << endl;
    cout << "f2:" << f2 << endl;
    //科学计数法
    float f3 = 3e2;//e:10^2
    cout << f3 << endl;
    float f4 = 3e-2;//e:0.1^2
    cout << "f4:" << f4 << endl;

    //字符型
    char ch = 'a';
    cout << "ch占用内存空间:" << sizeof(ch) << endl;
    cout << "a对应的ASCII码" << (int)ch << endl;

    //c中的字符串
    char str1[] = "C String";
    //c++中的字符串

    string str2 = "C++ String";

    cout << str2 << endl;//使用时需要加一个头文件<string>

    //布尔数据
    bool x = true;
    cout << "布尔类型的大小:" << sizeof(x) << endl;

    //数据的输入
    //整形
    int u=0;
    cout << "请给整型变量u进行赋值" << endl;

    cin >> u;
    cout << u << endl;

    //浮点型
    float f = 1.1f;
    cout << "给float进行赋值" << endl;
    //cin >> f;
    cout << f << endl;

    //字符串
    string strl = "";
    cout << "给String进行赋值" << endl;
    //cin >> strl;
    cout << "字符串strl:" << strl << endl;

    //if
    if (u < 45)
    cout << "u小于45" << endl;
    else
    cout << "u不小于45" << endl;
    switch (u)
    {
    case 10:
    cout << "u此时被switch找到" << endl;
    break;
    default:
    cout << "" << endl;
    break;
    }

    while (u<20) {
    u++;
    }
    cout <<"while让u自增到:"<< u << endl;
    //三只小猪称体重
    /*int piga = 0, pigb = 0, pigc = 0;
    cout << "分别输入三个重量" << endl;
    cin >> piga;
    cin >> pigb;
    cin >> pigc;
    string fs = piga > pigb ? (piga > pigc ? "a最重" : "c最重") : (pigb > pigc ? "b最重" : "c最重");
    cout << fs << endl;*/

    //猜数字100以内
    //u=numGuess();

    f = foruse(u);
    cout<<f<<endl;
    system("pause");
    return 0;
    }

    int arraylearn() {
    //数组
    int a[6];
    char c[] = { 's','t','r','i','n','g' };
    for (char i:c) {
    cout << i;
    }
    cout << endl;
    cout << sizeof(a[0]) << endl;
    cout << sizeof(a)<<endl;
    cout << sizeof(a)/ sizeof(a[0])<<"个元素" << endl;
    cout << a << endl;
    cout << &a[0] << endl;
    cout << &a[1] << endl;
    cout << (int)&a[1]-(int)&a[0] << endl;
    //数组是常量
    return 0;
    }
    int fivePigsWeght() {
    int h = 0;
    int a[5];
    for (int i = 0; i < 5;i++) {
    cin >> a[i];
    }
    for (int i:a) {
    h=h < i ? i : h;
    }
    cout << h << endl;
    return h;
    }
    //地址传递
    void swap(int* a, int* b) {
    int* c = 0;
    c = a;
    a = b;
    b = c;

    }
    //引用传递
    void swap01(int& a, int& b) {
    int temp = a;
    a = b;
    b = temp;
    }
    //参数传递
    void swap03(int a, int b) {
    int temp = a;
    a = b;
    b = temp;
    }
    void swap02(int *p1,int *p2) {
    int temp = *p1;
    *p1 = *p2;
    *p2 = *p1;
    }
    //调用swap(&a,&b)可实现地址传递的函数调用
    //值传递不会修改实参
    int arrayResive(int b[]) {
    //int a[] = b;
    int a[] = {1,2,3,4,5,6,7,8,9};
    int f = 0;
    int t = sizeof(a) / sizeof(a[0])-1;
    for (int i:a) {
    cout << i << endl;
    }
    while (f < t) {
    swap(a[f], a[t]);
    f++;
    t--;
    }
    /*for (int i = 0;i< sizeof(a) / sizeof(a[0]);i++) {
    if (f<t) {
    swap(a[f], a[t]);
    f++;
    t--;
    }
    else {
    break;
    }
    }*/
    for (int i : a) {
    cout << i << endl;
    }
    return 0;
    }
    int add(int a,int b) {
    return a + b;
    }
    void helloworld() {
    cout << "hello world" << endl;
    }

    int point() {
    int a = 10;
    int* p;
    p = &a;
    cout << "a的地址为:" << &a << endl;
    cout << "p的值:" << p << endl;
    //指针前加一个*代表解引用,找到指针所指向的内存的数据
    *p = 100;
    cout << a << endl;

    return 0;
    }

    int pointSe() {
    /*在32操作系统下占4个字节
    64位系统占8个字节*/
    int a = 10;
    int* p = &a;
    cout << sizeof(p) << endl;
    return 0;
    }
    int nullpointAndRow() {
    //空指针用于给指针变量进行初始化
    //空指针不可以进行访问
    int* p = NULL;
    //*p = 100;
    //野指针
    int* q = (int*)0x1100;
    cout << *q << endl;
    return 0;
    }

    //const修饰指针
    int constpoint() {
    int a = 20;
    //常量指针
    const int* p = &a;
    /*指针指向可以改
    指针指向的值不可改*/
    //指针常量
    int* const q = &a;
    //指针的指向不可以改
    //指针指向的值可以改

    const int* const x = &a;
    //两者都不能改
    return 0;
    }
    //指针和数组
    int arrpoint() {
    int arr[] = { 1,2,3,4,5,6,7,8,9,10 };
    int* p = arr;
    cout << *p << endl;
    cout << *++p << endl;
    int n = 0;
    //cout << *++p << endl;
    /*while (*p!=NULL)
    {
    n++;
    p++;
    }
    cout <<"n的值为:"<< n << endl;*/
    return 0;
    }
    //冒泡排序
    int bubbleSort(int* a ,int length ) {

    for (int i = 0; i < length-1;i++) {
    for (int j = 0; j < length-i-1;j++) {
    if (*(a+j)>*(a+j+1)) {
    //cout<<"if中的"<< *(a + j + 1) <<endl;
    int temp = *(a + j + 1);
    *(a + j + 1) = *(a + j);
    *(a + j) = temp;
    }
    }
    }
    for (int i =0 ; i < length;i++) {
    cout << *(a + i)<<" ";
    }
    return 0;
    }
    //结构体

    int structLearn() {
    //创建学生类型

    struct Student
    {
    string name;
    int age;
    int score;
    } s3;
    //通过学生类型创建具体的 变量
    //在C++中结构体创建的时候,Struct可以省略
    Student s1;
    s1.name = "李四";
    s1.age = 14;
    s1.score = 90;
    cout << "姓名" << s1.name << "年龄" << s1.age << "成绩" << s1.score << endl;
    struct Student s2{"张三",13,91 };
    cout << "姓名" << s2.name << "年龄" << s2.age << "成绩" << s2.score << endl;
    s3.name = "王五";
    s3.age = 12;
    s3.score = 94;
    cout << "姓名" << s3.name << "年龄" << s3.age << "成绩" << s3.score << endl;
    return 0;

    }

    //结构体数组
    int structArray(){
    //创建结构体
    struct Student
    {
    string name;
    int age;
    int score;
    };
    //创建结构体数组

    struct Student stuArray[3] = {
    {"张三",13,91},
    {"李四",15,93},
    {"王五",14,95}
    };

    stuArray[2].age = 18;
    for (int i = 0; i < 3; i++) {
    cout << "姓名" << stuArray[i].name << "年龄" << stuArray[i].age << "成绩" << stuArray[i].score << endl;
    }
    return 0;
    }

    //结构体指针
    int structPoint() {
    //第一学生的结构体
    struct Student
    {
    string name;
    int age;
    int score;
    };
    //创建结构体变量
    Student s = { "张三",13,91 };
    //通过指针指向结构题变量
    Student* p=&s;
    //通过指针访问结构体变量中的数据
    cout << "姓名:" <<p->name<<endl ;
    cout << "年龄:" << p->age << endl;
    cout << "成绩:" << p->score << endl;
    return 0;
    }
    //结构体嵌套结构体
    int strInStr() {
    struct Student
    {
    string name;
    int age;
    int score;
    }stu1 = {"张三",13,91};
    struct Teacher
    {
    int id;
    string name;
    int age;
    Student stu;
    };
    Teacher t1 = {1,"王五",30,stu1 };
    Teacher* p1 = &t1;
    cout << "姓名:" << p1->name << endl;
    cout << "年龄:" << p1->age << endl;
    cout << "编号:" << p1->id << endl;
    cout << "所教学生:" << p1->stu.name << endl;
    return 0;
    }
    //结构体做函数参数
    struct Student
    {
    string name;
    int age;
    int score;
    };
    //值传递
    void printStu(Student stu) {
    cout << "姓名:" << stu.name << endl;
    cout << "年龄:" << stu.age << endl;
    cout << "成绩:" << stu.score << endl;
    }
    //地址传递
    void printStu2(Student* p) {
    cout << "姓名:" << p->name << endl;
    cout << "年龄:" << p->age << endl;
    cout << "成绩:" << p->score << endl;
    p->age = 232;
    }
    int strArg() {
    Student stu1 = { "张三",13,91 };
    //printStu(stu1);
    printStu2(&stu1);
    return 0;
    }
    //const与结构体
    void printStu2withConst(const Student* p) {
    cout << "姓名:" << p->name << endl;
    cout << "年龄:" << p->age << endl;
    cout << "成绩:" << p->score << endl;
    //p->age = 232;加入const可以防止误操作
    }
    int strConst() {
    Student stu1 = { "张三",13,91 };
    return 0;
    }
    int hero() {
    struct Hero {
    string name;
    int age;
    string sex;
    };
    Hero heros[5] = {
    {"刘备",23,"男"},
    {"关羽",22,"男"},
    {"张飞",20,"男"},
    {"赵云",21,"男"},
    {"貂蝉",19,"女"}
    };
    for (Hero hero:heros) {
    cout << hero.name << hero.age << hero.sex << endl;
    }
    //冒泡开排
    for (int i = 0; i < 5;i++) {
    for (int j = 0; j < 4-i; j++) {
    if (heros[j].age>heros[j+1].age)
    {
    Hero hero = heros[j];
    heros[j] = heros[j + 1];
    heros[j + 1] = hero;
    }
    }
    }
    cout << "-------------------"<< endl;
    for (Hero hero : heros) {
    cout << hero.name << hero.age << hero.sex << endl;
    }
    return 0;
    }

    //全局变量、静态变量、常量---都会放在全局区
    int glob_a = 10;
    int glob_b = 10;
    const int glob_c = 10;
    void vary() {
    int a = 10;
    int b = 10;
    const int c = 10;
    static int e = 10;
    cout << "局部变量a的地址:" << (int)&a << endl;
    cout << "局部变量b的地址:" << (int)&b << endl;


    cout << "全局变量glob_a的地址:" << (int)&glob_a << endl;
    cout << "全局变量glob_b的地址:" << (int)&glob_b << endl;
    cout << "静态变量e的地址:" << (int)&e << endl;
    cout << "字符串常量的地址:" << (int)&"hello" << endl;
    //const修饰常量
    cout << "const修饰的全局常量glob_c的地址:" << (int)&glob_c << endl;
    cout << "const修饰的局部常量c的地址:" << (int)&c << endl;
    }
    //栈区
    //栈区的数据由编译器管理开辟 和释放
    //注意:不要返回局部变量的地址

    int * func(int b) {//形参数据也会放在栈区
    int a = 10; //栈区在函数执行后释放
    return &a;
    }
    void usefunc() {
    int* p = func(11);
    cout << *p << endl;//第一次可以打印出来正确的结果,因为编译器会做一次保留
    cout << *p << endl;
    }
    //堆区 由程序员来管理
    int* func2() {
    //利用new关键字,将数据开辟到堆区
    //指针 本质也是局部变量,放在栈上,指针保存的数据是放在堆区
    int* p = new int(10);
    return p;
    }
    int usefunc2() {
    int* p = func2();
    cout << *p << endl;
    return 0;
    }
    void test01() {
    int* p = func2();
    cout << *p << endl;
    cout << *p << endl;
    //若要删除堆区的数据需要用delete关键字
    delete p;
    cout << *p << endl;//内存已经释放,再访问就是非法操作
    }
    void test02() {
    int * arr=new int[10];//创建一个数组
    for (int i = 0; i < 10; i++) {
    arr[i] = i + 100;
    }
    for (int i = 0; i < 10; i++) {
    cout << arr[i] << endl;
    }
    //释放数组的时候要加一个中括号
    delete[] arr;
    }
    //引用
    void refrence1() {
    int a = 10;
    int& b = a;
    cout << b << endl;
    a = 120;
    cout << b << endl;
    b = 100;
    cout << a << endl;
    }
    //引用必须初始化
    //引用在初始化后, 不可以改变

    //引用做函数参数
    //作用 : 函故传参时,可以利用引用的技术让形参修饰实参
    //优点:可以简化指针修改实参

    void reference2() {
    int a = 8, b = 10;
    cout << a << b << endl;
    swap(a,b);
    cout << a << b << endl;
    swap01(a, b);
    cout << a << b << endl;
    swap03(a, b);
    cout << a << b << endl;
    }
    //引用做函数变量的返回值

    //1.不要做局部变量的应用
    int& test03() {
    int a = 10;
    return a;

    }

    //2.函数的调用可以做左值
    int& test04() {
    static int a = 10;//静态变量,存放在全局区,在程序结束后释放
    return a;

    }
    void reference3() {
    int& ref = test03();
    cout << ref << endl;//编译器会保存一份数据
    cout << ref << endl;//第二次的操作就是错误的

    int& ref1 = test04();
    cout << ref1 << endl;
    cout << ref1 << endl;
    test04() = 1000;
    cout << ref1 << endl;
    cout << ref1 << endl;
    }
    //引用的本质
    void func0502(int & ref) {
    ref = 100;
    }
    //引用的本质就是一个指针常量
    int ref4() {
    int a = 10;
    int& ref = a;
    ref = 20;
    cout << a << endl;
    cout << ref << endl;
    return 0;
    }

    //常量引用
    //使用场景:修饰形参,防止误操作
    void ref5() {
    int a = 10;
    const int& ref = 10;//引用必须引用一块合法的内存空间
    //加上const之后编译器将代码修改为 int temp=10;const int &ref=temp;
    }
    void showValue( const int& val) {
    //val = 1000; 不允许修改
    cout << val << endl;
    }
    void ref6() {
    int a = 100;
    showValue(a);
    cout << "a:"<<a << endl;
    }
    //函数的默认参数
    int func05021(int a,int b=100,int c=10) {
    return a + b + c;
    }
    //注意:
    //1.如果某个位置已经有了默认参数,则从这个位置往后,从左到右都必须有默认参数
    //2.如果函数声明有默认参数,函数实现就不能有默认参数
    void func05022() {
    cout << func05021(10,20) << endl;
    }

    //占位参数
    //只放一个数据类型用作占位
    //目前阶段的占位参数用不到,占位参数可以有默认参数
    //void func05031(int a, 10)
    void func05031(int a,int) {
    cout << "占位符" << endl;
    }
    void test05031() {
    func05031(10,10);
    }

    //函数重载
    //可以让函数名同名,提高函数的重用性
    //·同一个作用域下
    //·函数名称相同
    //函数参数类型不同或者个数不同或者顺序不同
    //函数的返回值不可以做为函数的重载的条件

    void reload() {
    cout << "函数reload()重载!" << endl;
    }

    void reload(int a) {
    cout << "函数reload(int a)重载" << endl;
    }
    void reload(double a) {
    cout << "函数reload(double a)重载" << endl;
    }
    void reload(double a,int b) {
    cout << "函数reload(double a,int b)重载" << endl;
    }

    void reload(int a, double b) {
    cout << "函数reload(int a, double b)重载" << endl;
    }

    void test05032() {
    reload(10,1.1);
    }

    //函数重载的注意事项
    //1、引用作为重载的条件
    void reload1(int &a) {
    cout << "reload1(int &a)调用" << endl;
    }
    void reload1(const int& a) {
    cout << "reload1(const int& a)调用" << endl;
    }
    void test05033() {
    int a = 10;
    reload1(a);//会调用不带const的
    //reload1(10);//会调用带const的
    }
    //2、函数重载碰到默认参数
    void reload2(int a,int b=10) {
    cout<<"reload2(int a)"<<endl;
    }
    void reload2(int a) {
    cout << "reload2(int a)" << endl;
    }
    //可以编译通过 调用时会出错,二义性,调用函数的时候调用两个参数不会报错

    int main() {
    cout << "MAIN" << endl;
    //helloworld();
    /*int a = 0, b = 1;
    swap(a,b);
    cout << a << b << endl;*/
    /*int a[] = { 1,2,3,4,5,6,7 };
    arrayResive(a);*/
    //cout << add(80, 50) << endl;
    /*point();*/
    /*int arr[] = {10,9,8,7,6,5,4,3,2,1};
    int a=sizeof(arr) / sizeof(arr[0]);
    bubbleSort(arr,a);*/
    /*arrpoint();*/
    //structLearn();
    //structArray();
    /*structPoint();*/
    //strInStr();
    //strArg();
    //hero();
    //vary();
    //test01();
    //reference3();
    //ref6();
    //func05022();
    //test05032();
    test05033();
    system("pause");
    }


    + +]]>
    + + C++ + + + C++ + +
    + + CentOS7.3安装MySQL8 + /2020/02/26/CentOS7-3%E5%AE%89%E8%A3%85MySQL8/ + 这得追溯到刚过完年那会儿,现在想想都心酸。

    + + +

    环境:

    +

    CentOS7.3

    +

    千万别装最新版的MySQL8!

    我亲测,去了官网下了最新版的安装文件,很开心的装结果装到一半,依赖版本不够,装新依赖版本,然后牵扯出其他依赖版本不够。崩溃🤢🤢🤢

    +

    目前比较稳妥的版本应该是8.0.13

    +

    删掉自带的数据库

    在安装MySQL之前先要把CentOS自带的mariadb,如果不卸载的话,在下面的安装中会报错。

    +

    查看mariadb版本
    rpm -qa | grep mariadb

    +

    卸载mariadb
    rpm -e mariadb-libs-5.5.56-2.el7.x86_64 --nodeps

    +

    去官网找Archives

    下载网址:https://dev.mysql.com/downloads/mysql/

    +

    下载历史版本网址:https://downloads.mysql.com/archives/community/

    +

    选择红帽,然后 version就是8.0.13,你要够大胆可以尝试稍微新一点的版本,但是我装8.0.19就失败了。

    +

    下下来名字大概是mysql-8.0.13-1.el7.x86_64.rpm-bundle.tar字样,那说明咱俩下到了同一个版本👍

    +

    安装

    解压

    tar -xvf mysql-8.0.13-1.el7.x86_64.rpm-bundle.tar

    +

    解压以后差不多是这么几个文件

    +
    mysql-community-client-8.0.17-1.el7.x86_64.rpm 
    mysql-community-common-8.0.17-1.el7.x86_64.rpm
    mysql-community-devel-8.0.17-1.el7.x86_64.rpm
    mysql-community-embedded-compat-8.0.17-1.el7.x86_64.rpm
    mysql-community-libs-8.0.17-1.el7.x86_64.rpm
    mysql-community-libs-compat-8.0.17-1.el7.x86_64.rpm
    mysql-community-server-8.0.17-1.el7.x86_64.rpm
    mysql-community-test-8.0.17-1.el7.x86_64.rpm
    + +
    必须安装(注意安装顺序‼)

    我只装了必须安装

    +
    rpm -ivh mysql-community-common-8.0.13-1.el7.x86_64.rpm
    rpm -ivh mysql-community-libs-8.0.13-1.el7.x86_64.rpm
    rpm -ivh mysql-community-client-8.0.13-1.el7.x86_64.rpm
    rpm -ivh mysql-community-server-8.0.13-1.el7.x86_64.rpm
    + +
    非必须安装(注意安装顺序‼)
    rpm -ivh mysql-community-libs-compat-8.0.13-1.el7.x86_64.rpm
    rpm -ivh mysql-community-embedded-compat-8.0.13-1.el7.x86_64.rpm
    rpm -ivh mysql-community-devel-8.0.13-1.el7.x86_64.rpm
    rpm -ivh mysql-community-test-8.0.13-1.el7.x86_64.rpm
    + +

    安装过程中可能出现很多错误,但基本上逃不过就是依赖问题,诸如:

    +
    error:
    Failed dependencies:
    + +

    然后缺什么装什么就好 yum install.

    +

    初始化

    装好之后就是初始化了,跟再Windows平台类似。

    +
    初始化数据库
    mysqld --initialize --console
    + +
    目录授权,这一步不能放过嗷

    chown -R mysql:mysql /var/lib/mysql/

    +
    启动MySQL服务

    systemctl start mysqld

    +
    停止MySQL服务

    service mysqld stop

    +
    查看初始密码

    cat /var/log/mysqld.log

    +
    登录

    mysql -u root -p,输入初始密码

    +
    更改初始密码

    alter USER 'root'@'localhost' IDENTIFIED BY '新密码(必须包含:数字大小写字母特殊字符,长度最小为8位)';

    +
    MySQL8授权

    对于8的MySQL,新建用户并授权写在一句会报错。所以

    +
    mysql> CREATE USER 'username'@'%' IDENTIFIED BY 'yourpassword';          //创建账户
    mysql> GRANT ALL PRIVILEGES ON *.* TO 'username'@'%' WITH GRANT OPTION; //赋予权限
    mysql> flush privileges; //刷新权限
    + +
    配置navicat

    配置如下:(username和password写成刚授权的用户的)

    + + +

    连接测试,如果正常配置,没有手残敲错是会成功的。👍

    +

    小结

    MySQL装了我两天左右,主要还是版本问题,以及依赖关系,以及centOS不推荐用MySQL等等等等。。那一阵心态都崩了,现在想想还好。人家TX云都给的centOS7.6的,为啥阿里还活在7.3?!?!?

    +]]>
    + + 技术 + 建站之路 + + + 崩溃的 + +
    + + Discharge Directionality and Dominance of Right-Handed Modes in Helicon Plasmas due to Radial Electron Density Gradients + /2023/07/19/Discharge-Directionality-and-Dominance-of-Right-Handed-Modes-in-Helicon-Plasmas-due-to-Radial-Electron-Density-Gradients/ + 摘要

    螺旋波是磁化等离子体波,类似于地球电离层中的哨声波,用于产生高密度实验室等离子体。我们证明可以通过改变天线螺旋度或磁场方向来反转放电方向。如果存在径向密度梯度,模拟将重现这些发现。包含这种密度梯度的螺旋波动方程会产生一个调制磁场,该磁场会放大右旋螺旋模式,但会减弱左旋螺旋模式。这首次一致地解释了右手模式相对于左手模式的主导地位以及螺旋等离子体中的放电方向性。

    +

    图 1

    +

    如图右手半螺旋天线。半个射频周期内的电流以绿色显示,圆柱坐标系以黑色显示,不同方位角模式的发射方向以蓝色显示。

    +

    实验

    这里介绍的实验是在 Madison Awake 原型机 (MAP) 上进行的,如图 2 所示。MAP 由一根 2 m 长的硼硅酸盐玻璃管组成,内径为 52 mm,外径为 58 mm。

    +

    图 2.MAP 实验核心组件的 CAD 模型

    +

    MAP 由一根 2 m 长的硼硅酸盐玻璃管组成,内径为 52 mm,外径为 58 mm。 14 个线圈在设备中心 1.6 m 处产生 49 mT 的非常均匀的磁场,在末端达到 55 mT。在图 2 中,场可以向左或向右定向。带有 1 厘米宽带的 10 厘米长天线以右侧或左侧方向缠绕,用于激发螺旋等离子体。天线位于实验中心,轴向位置 z = 0。所有实验均在 10−2 mbar 的氩气填充压力下进行,射频功率输入设置为 1.3 kW,频率为 13.56 MHz。使用阻抗匹配网络将反射功率降低到可忽略不计的水平,低于 10 W。气体从右侧进入,被迫通过真空容器,然后到达左侧的涡轮泵。

    +

    等离子体密度通过单电离氩气上的 激光诱导荧光(LIF) 进行测量,如 [17, 29] 中所述。此外还拍摄了天线周围放电的照片。结果如图3所示。RH天线在向右磁场中产生向左放电(蓝色曲线),而在向左磁场中产生向右放电(绿色曲线)。密度分布在天线位置周围镜像。对于 LH 天线,向右场(黄色)放电在右侧,向左场(红色)放电在左侧。这表明天线螺旋度或背景场方向的反转会反转放电方向,并且两者的反转会恢复原始放电方向。匹配网络能够匹配所有四种等离子体,无需任何调整,这表明等离子体阻抗在所有放电中都是相同的。这些结果是通过非常好的轴向磁场均匀性和与可能导致轴向各向异性的真空元件的适当距离获得的,消除了由于实验设置而导致的其他组的实验解释中的模糊性,例如通过将天线放置在附近的轴向边界或等离子体密度或场强超出色散关系允许值的区域[30]。

    +

    图 3 螺旋等离子体密度和光发射对天线螺旋度和磁场方向的依赖性

    +

    模拟

    使用 COMSOL 中开发的准 3D 有限元代码(使用冷等离子体波描述) 对 MAP 中的螺旋放电进行建模。在高密度螺旋等离子体中,很大一部分功率是通过 Trivelpiece-Gould[31] 模式沉积的,该模式在亚毫米级上具有非常短的径向波长。这就需要使用轴向 500 μm、径向 30 μm 的非常精细的网格单元。该模型假设波场在方位角方向上具有 eimφ 依赖性,其中 m 是方位角模式数。由于高阶模式的强阻尼,完整的 3D 解决方案可以从六个主阶模式计算,即 m = {±1, ±3, ±5},如稍后图 5 所示。由于朗道阻尼可以忽略不计,功率沉积是通过电子-离子和电子中性碰撞严格欧姆计算的[32]。通过将均匀等离子体中的结果与分析螺旋色散关系进行比较来验证该模型。

    +

    使用 LIF 技术在 116 个点处测量了左向场中 RH 天线的密度分布。等离子体温度和中性压力分别设置为均匀的 3 eV 和 10−3 mbar,后者假设 90% 中性耗尽。该模拟的结果如图 4 和 5 所示。图4示出了总波磁场的大小,其中白色等高线表示等离子体密度。螺旋波从天线位置径向向内传播并轴向向前传播。图 5 显示了不同方位角模式的径向积分功率沉积贡献。很明显,负 m 模式和正 m 模式分别向前和向后沉积功率,如图 1 所示。在该设置中,占主导地位的右手模式 m = -1,沉积总功率的 58.7%,大部分位于右侧。领先的左手模式 m = +1,沉积总功率的 29.5%,大部分在相反方向。剩下的 11.8% 是由遵循主导 RH 和 LH 模式的方向性模式的高阶模式所占。总体而言,通过光学和 LIF 观察,功率沉积位于放电方向。

    +

    图 4

    +

    图4 磁场为负 z 方向的 RH 天线的总螺旋波磁场幅度的仿真结果。实验测量的密度由白色轮廓线给出。

    +

    图 5

    +

    图 4 中模拟的方位模式轴向功率沉积。

    +

    为了阐明这种定向功率沉积的原因,我们使用轴向均匀的等离子体密度分布进行了模拟。径向等离子体密度分布被建模为平顶(flat top)形式

    +

    (1)

    +

    图 6 显示了两种径向密度分布的天线螺旋度和背景场方向的四种可能组合的结果。对于径向密度梯度,在向右场和 RH 天线中,功率沉积主要向左。对于与 LH 天线组合的左向场,会出现相同的沉积剖面。对于其他两种组合,功率沉积主要位于左侧。 z = 0 附近的左右功率不平衡为 36.5% 至 63.5%。对于径向均匀等离子体,不存在显着的优先功率沉积,左右不平衡度仅为48.1%至51.9%。

    +

    数学模型

    由于在螺旋等离子体中,电子电流远强于位移电流并且离子是不动的,因此频域中的相关麦克斯韦方程变为

    +

    (2)

    +

    (3)

    +

    其中不可压缩电子流体的密度为 n,速度为 v。电子受到电力、磁力、摩擦力和压力梯度力的作用,使得它们的动量方程变为

    +

    (4)

    +

    其中 B0 是背景磁场,Te 是电子温度,ν 是电子-离子和电子-中性碰撞的有效组合频率。

    +

    利用这组方程,我们可以消除 E、j 和 v,并得到纯径向密度梯度

    +

    (5)

    +

    (6)

    +

    在方程 5 中,∓ 符号说明背景磁场沿 z 方向或逆 z 方向指向。方程 5 的左侧是推导出来的均匀等离子体中的螺旋波方程。右侧代表一个新项,仅存在于存在密度梯度的情况下。我们在下文中将该术语称为调制磁场,如下所述。由于 δ 是 RF 频率与电子回旋加速器频率的比率,因此方程 5 右侧的第一项可以忽略不计,调制磁场变为

    +

    (7)

    +

    其中右侧利用 r 在密度最高的等离子体核心处变小,使得 ∇ × B 的 Bz 项占主导地位。

    +

    这种形式非常清楚地显示了对磁场方向、密度梯度和方位模数的依赖性。在与 z 对齐的背景场中,附加调制磁场增强正 m 模式,但减弱负 m 模式。加上相反螺旋度的天线以相反方向发送这些模式的事实,这解释了右手模式相对于左手模式的主导地位、螺旋放电的方向性以及为什么螺旋或场反转会翻转放电方向。

    +

    通过使用方程 3 将波动方程转化为以下形式,可以理解这种效应背后的物理机制

    +

    (8)

    +

    这表明,径向电流与场方向和密度梯度相结合,产生了与 jr 波电流有 ∓90° 相移的附加调制磁场。

    +

    图 7 给出了这种现象的物理解释。在沿 z 的背景场中,携带径向电流 jr 的电子流体元件受到洛伦兹力的作用,从而在方位角方向产生电流。该电流也受到洛伦兹力,从而产生负径向方向的电流。这是螺旋波在均匀等离子体中的径向电流和方位角电流之间交换能量的机制。然而,在存在电子密度梯度的情况下,相邻流体元件将携带大小与电子密度成比例的方位角电流,从而导致方位角剪切电流。这些电流可以通过大电流加上不同径向位置的局部电流来描述。局部部分代表偶极子电流,它在 ± z 方向上产生磁场,我们已通过方程 1 中的调制磁场以数学方式表示该磁场。 8. 对于均匀等离子体中的 RH 螺旋模式,jr 电流使 j​​φ 超前 90°,使得调制场沿着波的规则 Bz 场指向,并导致波场增强。相比之下,LH 模式的 jr 滞后 jφ 90°,因此额外的调制磁场会导致 Bz 波场方向错误,从而整体衰减 jr、jφ 和波。

    +

    图 7 存在径向密度梯度时剪切电流源的机制

    +]]>
    + + 文献 + + + 文献 + +
    + + Design of a novel high efficiency antenna for helicon plasma sources + /2023/08/29/Design-of-a-novel-high-efficiency-antenna-for-helicon-plasma-sources/ + 一种新型螺旋等离子体源高效天线的设计

    +

    abstract

    为螺旋等离子体源提出了一种新的天线配置,可以增加吸收功率和等离子体密度。使用标准 COMSOL Multiphysics 5.3 软件分析了电磁波图案对称性对具有普通天线的螺旋等离子体源(名古屋)中等离子体密度和吸收功率的影响。与理论模型预测相反,电磁波并不代表普通名古屋天线的对称图案。在这项工作中,提出了一种新的天线配置,它改善了螺旋等离子体源中波形的不对称性。通过模拟研究了相同条件下普通名古屋天线和我们提出的天线的等离子体参数,例如等离子体密度和吸收率。此外,将具有通用名古屋天线的七个运行螺旋等离子体源装置的等离子体密度与我们提出的天线和通用名古屋天线的仿真结果进行了比较。模拟结果表明,使用我们提出的天线产生的等离子体密度大约是使用普通名古屋天线产生的等离子体密度的两倍。事实上,模拟结果表明,螺旋波的电场和磁场对称性对于增强波粒耦合起着至关重要的作用。结果,波粒能量交换和螺旋等离子体源的等离子体密度将增加。

    +

    instruction

    Helicon 等离子体源产生低温、高密度和低压等离子体(Chen 2006)。如今,方便且经济的螺旋等离子体源是有吸引力的资产,它们被用作加速器、惯性静电约束聚变装置和等离子体射流的粒子源,以及磁约束装置中预电离的电子源(Hwang、Hong 和 Eom) 1998;陈2008)。

    +

    陈研究了天线的物理机制以及螺旋放电中电磁场和静电场的传播(Chen 1996)。 Park 及其同事研究了螺旋等离子体放电理论以及天线电阻率和等离子体电阻的计算(Park、Choi 和 Yoon 1997)。 Melazzi 从理论上对螺旋等离子体源中常见的几种射频天线进行了比较研究(Melazzi & Lancellotti 2015)。 Caneses 和他的同事研究了高压氢螺旋等离子体源中螺旋波的波传播和碰撞吸收(Caneses & Blackwell 2016)。

    +

    已经进行了多项研究来提高螺旋等离子体源的电离效率。研究人员试图设计一种最佳的等离子体源。 Miljak 和 Chen 发现,通过使用相控双线天线,可以通过施加在空间或时间上或同时旋转的场来激发螺旋波。由于螺旋波形是在空间和时间上旋转的螺旋,因此可以通过使用本身是螺旋的天线或具有随时间旋转的场的天线来改善天线与等离子体的耦合,从而获得更高的等离子体密度(Miljak & Chen 1998) 。在 2005 年报道的另一项工作中,Guittienne 和 Chevalier Towards 提出了螺旋天线的最佳配置(Guittienne, Chevalier & Hollenstein 2005)。他们提出了一种用于激励螺旋波的鸟笼形天线。

    +

    如今,使用计算代码和标准软件对于螺旋等离子体源中等离子体产生的不同方面的调查和研究很有趣。在这方面,杨和他的同事采用三维二维流体方程的螺旋等离子体放电直接数值模拟模型来研究电子密度和温度随时间演化的特征。他们使用 COMSOL Multiphysics 中的有限元求解器来求解所有偏微分方程(Xiong 等人,2017)。

    +

    Caneses 等人使用计算代码和 COMSOL Multiphysics 软件。研究了 MAGPIE 和 Proto MPEX 线性等离子体设备中氢等离子体中螺旋天线附近的天线辐射模式(Caneses、Blackwell 和 Piotrowicz 2017)。影响螺旋等离子体源效率的重要方面之一是有效参数的对称性或不对称性。螺旋等离子体放电部件的构造、图案和分布的对称性可以增加螺旋波与等离子体的耦合。因此,研究螺旋等离子体放电参数的对称性或不对称性可以帮助我们设计和改进螺旋等离子体源的参数。

    +

    这样,Black和Chen发现法拉第屏蔽可以阻挡螺旋放电中的静电场(Blackwell & Chen 1997)。他们发现在这种情况下等离子体密度分布具有对称图案。他们可以通过在天线和玻璃室之间插入法拉第屏蔽来观察电容耦合的影响,这在理论上通常被忽略。结果表明,即使在等离子体被称为“波耦合”的高密度区域(Ellingboe & Boswell 1996),电容耦合也会对等离子体特性产生显着影响。另一个重要参数是天线几何形状。我们发现以前的工作没有考虑天线当前端口的影响。我们的仿真结果表明,天线电流端口(名古屋 III 中)可以影响螺旋等离子体放电系统中电磁场图案的对称性。在这项工作中,提出了一种新的天线配置,可以保护波场图案的对称性。我们的模拟表明,如果在螺旋等离子体源中使用具有两组对称端口的名古屋天线(III型),则螺旋波场分量呈现对称图案。使用标准 COMSOL Multiphysics 5.3 软件分析了电磁波模式对称性对普通名古屋天线螺旋等离子体源中等离子体密度和功率吸收的影响。

    +

    模拟结果表明,使用我们提出的天线产生的等离子体的密度比普通天线增加了两倍。这一结果表明,场模式的对称性会影响等离子体密度和功率吸收,并对波粒耦合的增强起着至关重要的作用。这一事实在以往的文献中没有报道过。应该注意的是,模拟中包含了能量为 0.001 eV 至 1 MeV 的所有参数以及与横截面的相互作用。

    +

    最后,这项工作的目标可以体现在两个方面:首先,提出一种新的天线配置,以增加功率吸收和等离子体密度。其次,借助这种新型天线,我们可以研究模拟结果并将其与可运行的螺旋等离子体源设备的实验结果进行比较。

    +

    该手稿的组织如下:第 2 节介绍了工作原理,第 3 节描述了常见名古屋天线以及我们提出的天线的模拟结果,并处理使用这两种天线类型的等离子体生产。最后,本文在第 4 节中进行了总结。

    +

    理论

    最简单形式的螺旋波源自三个线性化麦克斯韦方程、动量方程和欧姆定律。使用柱坐标,麦克斯韦方程导出了螺旋波磁场分量的贝塞尔方程。随后,楞次定律导出了螺旋波的电场分量。该柱坐标方程形成了螺旋波磁场分量的贝塞尔方程(Chen 1991、2012;Ziemba 等人 2006)。

    +

    螺旋波的磁场分量可由下式获得:

    +

    (2.1)

    +

    (2.2)

    +

    (2.3)

    +

    其中a等于腔室半径rp,Jm−1、Jm+1和Jm分别为m-1、m+1、m阶贝塞尔函数,在上述关系中,A是常数参数,等于至√2/2。上式中 α = ωω2p/kωcc2,ωc=eB0/me,ω2p= 4πn0e2/m,c 为光速,k 为螺旋波矢量,ω 为螺旋波频率,k是波矢量的轴向分量,T 是波矢量的横向分量。利用楞次定律和磁场分量,可以得到螺旋波的电场分量为:

    +

    (2.4)

    +

    (2.5)

    +

    (2.6)

    +

    很明显,螺旋波具有TE(横向电)模式特征。图 1 中绘制了 m = +1 模式的螺旋波电场和磁场模式。该图显示了螺旋设备的场分量,其参数如表 1 所列。磁场和磁场的对称模式电场如图 1 所示。

    +

    +

    图 1. 在垂直于直流磁场的平面中,螺旋波 m = +1 时的磁力线(实线)和电场线(虚线)图案。

    +

    +

    表 1. 螺旋等离子体源的参数。

    +

    这些结果是根据理论模型得出的,在此分析中忽略了天线的当前端口及其影响。当前端口的影响无法使用分析方法进行研究,而是使用下一节中的 COMSOL Multiphysics 5.3 软件进行分析。

    +

    3 设计与仿真

    对两种类型的天线(具有一组电流端口的常见名古屋天线和具有两组对称端口的天线)产生的电磁波的磁场和电场模式进行了仿真。仿真实验是在相同的理论模型和系统参数下进行的,如表1所示。

    +

    我们最初想法的精髓是螺旋等离子体源天线的新配置,旨在修改天线的性能并增加等离子体密度。由于普通名古屋天线中的电流端口效应,螺旋源中磁场和电场图案的对称性被打破。图2(a)示出了具有当前一组端口的普通名古屋天线的示意图。在从天线轴中心点经过的(x-y)平面中,螺旋波相对于 y 轴的磁场大小如图 2(b)所示。此外,在图 2(c) 中,对模式 m = +1 模拟了这种常见名古屋天线的螺旋波模式。图2(b,c)表明螺旋波图案的电场和磁场的对称性已经消失。

    +

    (a)

    +

    (b)

    +

    (c)

    +

    图 2. (a) 普通名古屋天线,(b) 螺旋波磁场强度,(c) 螺旋波图案电场和磁场的对称性。

    +

    (a)

    +

    (b)

    +

    (c)

    +

    图 3. (a) 提议的天线(两组电流端口),(b) 螺旋波的磁场强度(提议的天线),(c) 螺旋波的电场和磁场的对称性模式(建议的天线)。

    +

    另一方面,图 3(a) 展示了具有两组当前端口的改进天线的示意图。对于与图 2 相同的条件,我们提出的模式 m = +1 的天线的螺旋波磁场大小以及螺旋波方向图的电场和磁场方向图 s 绘制在图 3(b, c) 分别。

    +

    (a)

    +

    (b)

    +

    图 4。(a) 普通天线的电磁场方向图(z = L/2(L 是天线长度)),(b) 普通天线的电磁场方向图(z = L(L 是天线长度))。

    +

    值得一提的是,在所有上述图中,坐标系的选择使得 z 轴与天线和暗室的轴重合。仿真结果表明,新改进的天线产生的螺旋波图是对称的,正如预期的那样。换句话说,使用位于第一电流端口正对面的额外两个电流端口可以消除螺旋波图案中第一电流端口的失真效应。

    +

    图 4 和图 5 显示了具有一组端口的普通天线 (4a,b) 和我们的改进天线(图 5a,b)的两个不同横截面中螺旋波的电磁场方向图。图 4(a) 和 5(a) 是在穿过天线轴 z = L/2(L 是天线长度)中心点的平面上绘制的。面板 2(a,b) 绘制在通过端点 z = L 处的天线轴的平面中。我们提出的天线的电磁场方向图的对称性和普通天线的电磁场方向图的不对称性(具有一组电流端口)在图 4 和图 5 的所有不同横截面中都很明显。

    +

    螺旋波的电场和磁场的对称性导致吸收功率和等离子体密度的增加。普通名古屋天线和我们改进的天线系统的功率吸收密度、等离子体密度和饱和时间分别绘制在图6(a-c)和(7a-c)中。

    +

    (a)

    +

    (b)

    +

    图 5. (a) 我们提出的天线的电磁场方向图(z = L/2(L 是天线长度)),(b) 我们提出的天线的电磁场方向图(z = L(L 是天线长度)) 。

    +

    根据图6(a,b),我们改进的两组电流端口天线的功率吸收密度和等离子体密度是普通名古屋天线的一组电流端口的两倍。

    +

    在存在轴向磁场的情况下,带电粒子轨迹是对称的螺旋线。另一方面,对于粒子和波之间的强耦合,螺旋波形必须是螺旋(Miljak & Chen 1998)。在我们的工作中,该波是由名古屋天线引起的。螺旋波的磁场和电场分量模式(在没有电流端口效应的情况下)显示偶极子对称性。可以使天线在固定z处产生的电场随时间旋转。如图 2、4 和 6 所示,天线一侧存在一组电流端口会破坏波场方向图的偶极子对称性。波场分量的不对称导致带电粒子在错误的方向和时间上加速或减速。因此,粒子轨迹偏离对称螺旋的形式,与相对于螺旋波异相旋转的粒子相同。结果,螺旋波与带电粒子的耦合减弱,波粒能量交换减少。另一方面,我们在图3、图5和图7中的仿真结果表明,通过使用两组对称的电流端口,螺旋波场分量的不对称性得到了显着改善。因此,期望粒子通过螺旋波场分量在适当的方向、时间和空间上加速/减速。结果,螺旋波和带电粒子强烈耦合,波粒能量交换增加。

    +

    (a)

    +

    (b)

    +

    (c)

    +

    图 6。(a) 功率吸收密度(普通名古屋天线),(b) 等离子体密度(普通名古屋天线),(c) 普通名古屋天线系统的饱和时间。

    +

    (a)

    +

    (b)

    +

    (c)

    +

    图 7。(a) 功率吸收密度(建议的天线),(b) 等离子体密度(建议的天线),(c) 我们改进的天线(建议​​的天线)系统的饱和时间。

    +

    COMSOL 软件采用的模型通过以下一组碰撞类型研究氩等离子体化学;弹性、激发、直接电离和逐步电离。该模型还涉及彭宁电离和亚稳态猝灭。1 这些碰撞和反应列于表 2 中。

    +

    正如 COMSOL 软件帮助中提到的(参见脚注 1),逐步电离(反应 5)在维持低压氩气放电方面可以发挥重要作用。激发态的氩原子通过与电子的超弹性碰撞、中性氩原子猝灭、电离或潘宁电离而被消耗,其中两个亚稳态氩原子反应形成中性氩原子、氩离子和电子。 7 号反应负责气体的加热。当激发的亚稳态淬灭时,用于产生电子激发的氩原子的 11.5 eV 能量将作为热能返回到气体中。除了体积反应之外,还执行以下表面反应,如表 3 所示:

    +

    +

    表 2. 模拟的碰撞和反应表(参见脚注 1)。

    +

    +

    表 3. 表面反应表(参见脚注 1)。

    +

    当亚稳态氩原子与壁接触时,它以一定的概率(粘附系数)恢复到基态氩原子(见脚注1)。然而,螺旋等离子体放电过程是通过使用常见的名古屋天线和我们提出的天线来模拟的。普通名古屋天线和我们提出的天线的电子密度(等离子体密度)的变化分别以三维表示形式显示在图8(a)和图9(a)中。模拟结果(图 8a 和 9a)估计普通名古屋天线的螺旋等离子体放电的最大电子密度约为 1.7 × 1018 m−3,我们提出的天线约为 3 × 1018 m−3。此外,对于图8(b)和9(b)中的两种情况,沿着对称轴(天线轴)表示电子密度的变化。这些图表示两种情况沿天线轴的空间电子密度分布。这些结果的比较表明,两种情况下空间电子密度分布的形式没有不同,并且类似于高斯函数。然而,很明显,使用我们提出的天线,最大电子密度增加了大约百分之一百。使用常见的名古屋天线图 8(c) 和我们提出的天线图 9(c) 绘制了电子温度沿对称轴(天线轴)的变化。这些数字表明,在普通名古屋天线和我们提出的天线的情况下,电子可以分别达到约 2.9 和 2.5 eV 的能量。这些模拟结果与文献中先前的报告非常吻合(Chen 1996;Sudit & Chen 1996;Chen & Boswell 1997;Braginskii, Vasil’eva & Kovalev 2001;Navarro-Cavallé et al. 2018;Lee et al. 2011) 。

    +

    (a)

    +

    (b)

    +

    (c)

    +

    图 8. 沿天线轴(普通名古屋天线)绘制的三维电子密度变化 (a)、一维电子密度变化 (b) 和电子温度变化 (c)。

    +

    在许多实验工作中(Light & Chen 1995;Sudit & Chen 1996;Miljak & Chen 1998)等离子体密度的下游峰值沿着螺旋源中的天线轴出现(在存在均匀静磁场的情况下) 。 Sudit & Chen (1996) 中的压力平衡解释了下游密度峰值。在该参考文献中,电子运动方程的 z 分量表示为:

    +

    (3.1)

    +

    其中 n、Ez、K、Te、uz、vm 和 m 分别是等离子体密度、电场的 z 分量、玻尔兹曼常数、电子温度、电子流体速度、动量传递的电子碰撞频率和电子质量。正如该参考文献中提到的,实际上碰撞项小得可以忽略不计。因此,在给定 Te(z) 和 Ez(z) 剖面的情况下,该方程显示了压力平衡所需的下游密度峰值(Sudit & Chen 1996)。

    +

    但我们认为,实际中静磁场不可能完全均匀。等离子体密度的下游峰值应该用静磁场径向分量存在时的压力平衡来解释。

    +

    (a)

    +

    (b)

    +

    (c)

    +

    图 9. 沿着天线轴绘制的电子密度在三个维度 (a)、一维 (b) 和电子温度 (c) 的变化(建议的天线)。

    +

    事实上,洛伦兹力的轴向分量(由等离子体电流的方位角分量 (Jθ ) 和静磁场的径向分量的叉积产生)可以沿压力平衡方向移动压力平衡的位置。放电管并沿着天线的轴移动等离子体密度的峰值。在我们的工作中,为了减少仿真运行时间,系统在精确均匀的静态磁场(沿着系统的对称轴)存在的情况下进行仿真。结果,洛伦兹力的轴向分量消失,等离子体密度峰值出现在天线区域,如图8和图9所示。这个想法可能与ICP报道的实验数据一致。系统。密度峰值出现在 ICP(感应耦合等离子体)系统的天线区域(Sudit & Chen 1996)。

    +

    如上所述,我们提出的改进天线的对称性提供了具有对称电场和磁场模式的螺旋波。在这方面,七个螺旋等离子体源装置的结果和数据在参考文献Light & Chen (1995)、Chen (1996)、Molvik 等人中报道。 (1996),郭等人。 (1999),同振等人。 (2001),陈等人。 (2006),李等人。 (2011),进行了研究。根据这些器件的参数,分别采用普通名古屋天线的一组电流端口和我们的改进型天线的两组电流端口对这七种器件进行了仿真分析。为了验证我们的模拟结果,将这些设备的实验报告结果与我们从这些设备的模拟中获得的结果进行比较。该比较表明,根据实验结果报告的这些装置的等离子体电子密度与通过模拟实验估计的等离子体密度平均相差约15%。因此,这种比较表明我们的模拟结果是可靠的并且是一个很好的近似值。表 4 列出了这些设备的参数、报告的产生电子密度的实验数据以及我们的模拟结果。在此表中,电子等离子体密度是文献中报道的实验结果(a 列),电子等离子体密度是通过我们使用具有一组电流端口的通用天线对设备进行模拟而获得的(b 列)并使用我们修改后的建议天线和两组当前端口(c 列)进行表示。

    +

    +

    图 10. 这七种设备的等离子体密度实验结果(蓝色)、我们使用普通天线(名古屋)的模拟结果(红色)以及使用我们改进的天线的模拟结果(绿色)。

    +

    如表 4 所示,仿真结果表明,所报告的实验结果证实了我们对具有一组当前端口的普通天线的仿真结果。此外,模拟结果表明,与使用普通天线相比,使用我们提出的天线和两组电流端口,在所有情况下都能增加螺旋源的等离子体密度,平均约增加 40%。这七个设备的实验结果(蓝色)、我们使用普通天线(名古屋)的模拟结果(红色)和使用我们改进的天线的模拟结果(绿色)的等离子体密度绘制在图 10 中。绿色柱上的黑色箭头代表使用我们建议的天线相对于这七个设备报告的实验数据的等离子体密度增量(以百分比表示)。

    +

    结论

    在本文中,使用标准 COMSOL Multiphysics 5.3 软件对螺旋等离子体源进行了模拟和分析。此外,模拟中还包含 0.001 eV 至 1 MeV 能量的所有参数以及与横截面的相互作用。仿真结果表明,具有一组电流端口的普通名古屋天线产生电场和磁场不对称模式的螺旋波。提出了一种具有两组电流端口的新型改进天线,以减轻电流端口对波形的干扰影响。研究发现,普通名古屋天线采用两组对称的电流端口,可以显着改善螺旋波场分量的不对称性。因此,期望粒子通过螺旋波场分量在适当的方向、时间和空间上加速/减速。结果,螺旋波和带电粒子强烈耦合,波粒能量交换增加。分析表明,与报告的实验结果以及具有一组当前端口的常见天线模拟结果(名古屋)相比,使用我们的改进天线,等离子体密度和功率吸收平均增加了约 40%。这一事实表明电磁波图案的对称性对于提高功率吸收率以及等离子体密度起着至关重要的作用。

    +

    +]]>
    + + 文献 + + + 文献 + 翻译 + +
    + + Docker + /2021/03/12/Docker/ + Docker

    用于打包,解决环境搭建问题

    +

    基于Go

    +

    安装(linux-CentOS)

    查看官方的帮助文档

    +

    卸载旧的版本

    yum remove docker \
    docker-client \
    docker-client-latest \
    docker-common \
    docker-latest \
    docker-latest-logrotate \
    docker-logrotate \
    docker-engine
    + +

    使用仓库安装

    yum install -y yum-utils
    # 设置镜像地址
    yum-config-manager \
    --add-repo \
    https://download.docker.com/linux/centos/docker-ce.repo
    #这里使用阿里云的镜像
    yum-config-manager \
    --add-repo \
    http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
    + +

    更新Docker

    yum makecache
    yum update
    + +

    安装Docker引擎

    yum install docker-ce docker-ce-cli containerd.io
    + +

    可能会报错

    1. 首先更新yum

    $ yum update

    2. 以下方法任选一种
    # 方法1: 安装特定版本的docker-ce和containerd.io
    $ yum list docker-ce --showduplicates | sort -r

    docker-ce.x86_64 3:18.09.1-3.el7 docker-ce-stable
    docker-ce.x86_64 3:18.09.0-3.el7 docker-ce-stable
    docker-ce.x86_64 18.06.1.ce-3.el7 docker-ce-stable
    docker-ce.x86_64 18.06.0.ce-3.el7 docker-ce-stable
    ...

    $ sudo yum install docker-ce-<VERSION_STRING> docker-ce-cli-<VERSION_STRING> containerd.io

    # 方法2: 通过阿里云镜像库安装符合最新docker-ce版本的containerd.io
    $ yum install -y https://mirrors.aliyun.com/docker-ce/linux/centos/8/x86_64/edge/Packages/containerd.io-1.3.7-3.1.el8.x86_64.rpm
    yum install -y https://download.docker.com/linux/centos/8/x86_64/edge/Packages/docker-ce-19.03.13-3.el8.x86_64.rpm
    yum install -y https://download.docker.com/linux/centos/8/x86_64/edge/Packages/docker-ce-cli-19.03.13-3.el8.x86_64.rpm
    #装第三个的时候反复timeout,人晕了
    + +

    启动Docker

    systemctl start docker
    + +

    检查安装

    #检查版本号
    docker version
    #运行hello world
    docker run hello-world
    + +

    报错

    +
    Unable to find image 'hello-world:latest' locally
    docker: Error response from daemon: Get https://registry-1.docker.io/v2/: net/http: TLS handshake timeout.
    See 'docker run --help'.
    + +

    timeout,应该是镜像源的问题,这个阿里云真够恶心的,用了阿里自己的镜像下rpm的时候都会timeout。

    +
    [root@Shyee local]# yum install -y https://download.docker.com/linux/centos/8/x86_64/edge/Packages/docker-ce-cli-19.03.13-3.el8.x86_64.rpm
    Last metadata expiration check: 2:09:13 ago on Tue 19 Jan 2021 06:27:23 PM CST.
    [MIRROR] docker-ce-cli-19.03.13-3.el8.x86_64.rpm: Curl error (28): Timeout was reached for https://download.docker.com/linux/centos/8/x86_64/edge/Packages/docker-ce-cli-19.03.13-3.el8.x86_64.rpm [Operation too slow. Less than 1000 bytes/sec transferred the last 30 seconds]
    [MIRROR] docker-ce-cli-19.03.13-3.el8.x86_64.rpm: Curl error (28): Timeout was reached for https://download.docker.com/linux/centos/8/x86_64/edge/Packages/docker-ce-cli-19.03.13-3.el8.x86_64.rpm [Operation too slow. Less than 1000 bytes/sec transferred the last 30 seconds]
    [MIRROR] docker-ce-cli-19.03.13-3.el8.x86_64.rpm: Curl error (28): Timeout was reached for https://download.docker.com/linux/centos/8/x86_64/edge/Packages/docker-ce-cli-19.03.13-3.el8.x86_64.rpm [Operation too slow. Less than 1000 bytes/sec transferred the last 30 seconds]
    + +

    尝试解决:

    +

    /etc/docker新增daemon.json,添加镜像

    +
    {
    "registry-mirrors": ["http://hub-mirror.c.163.com"]
    }
    + +

    重启

    +
    systemctl restart docker.service
    + +

    报错

    +
    docker: Get https://registry-1.docker.io/v2/library/hello-world/manifests/sha256:90659bf80b44ce6be8234e6ff90a1ac34acbeb826903b02cfa0da11c82cbc042: net/http: TLS handshake timeout.
    + +

    尝试解决:

    +

    更改镜像:

    +
    {"registry-mirrors":["https://registry.docker-cn.com","https://pee6w651.mirror.aliyuncs.com"]}
    + +

    后来才知道,阿里云有个容器镜像服务,可以开启,并拿到自己的镜像加速器,也是如上配置。

    +

    成功

    +
    Hello from Docker!
    This message shows that your installation appears to be working correctly.

    To generate this message, Docker took the following steps:
    1. The Docker client contacted the Docker daemon.
    2. The Docker daemon pulled the "hello-world" image from the Docker Hub.
    (amd64)
    3. The Docker daemon created a new container from that image which runs the
    executable that produces the output you are currently reading.
    4. The Docker daemon streamed that output to the Docker client, which sent it
    to your terminal.

    To try something more ambitious, you can run an Ubuntu container with:
    $ docker run -it ubuntu bash

    Share images, automate workflows, and more with a free Docker ID:
    https://hub.docker.com/

    For more examples and ideas, visit:
    https://docs.docker.com/get-started/
    + +

    检查镜像

    docker images

    #运行结果
    REPOSITORY TAG IMAGE ID CREATED SIZE
    hello-world latest bf756fb1ae65 12 months ago 13.3kB
    + +

    卸载Docker

    yum remove docker-ce docker-ce-cli containerd.io

    rm -rf /var/lib/docker
    + +

    底层原理

    C/S结构

    +

    通过socket连接

    +

    1、Docker有着比虚拟机更少的抽象层。

    +

    2、docker利用的是宿主机的内核,vm需要是Guest Os。

    +]]>
    + + 计算机 + + + Docker + linux + +
    + + Docker常用命令 + /2021/03/12/Docker%20%E5%B8%B8%E7%94%A8%E5%91%BD%E4%BB%A4/ + Docker 常用命令

    帮助命令

    docker version #显示详细信息
    docker info #显示更详细的信息
    docker命令--help #万能命令
    + +

    官网命令教程

    +

    镜像命令

    docker images

    docker images #查询
    #运行结果
    REPOSITORY TAG IMAGE ID CREATED SIZE
    hello-world latest bf756fb1ae65 12 months ago 13.3kB
    docker images -a #查询全部镜像
    #运行结果
    REPOSITORY TAG IMAGE ID CREATED SIZE
    hello-world latest bf756fb1ae65 12 months ago 13.3kB
    docker images -q #显示镜像的id
    #运行结果
    bf756fb1ae65
    docker images -aq #显示所有的id
    bf756fb1ae65
    + +

    可选项

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    Name, shorthandDefaultDescription
    --all , -aShow all images (default hides intermediate images)
    --digestsShow digests
    --filter , -fFilter output based on conditions provided
    --formatPretty-print images using a Go template
    --no-truncDon’t truncate output
    --quiet , -qOnly show image IDs
    +

    REPOSITORY :镜像的仓库源

    +

    TAG : 镜像的标签

    +

    IMAGE ID:镜像的id

    +

    CREATED:镜像的创建时间

    +

    SIZE:镜像的大小

    +
    docker search mysql #搜索mysql的镜像信息
    #运行结果
    NAME DESCRIPTION STARS OFFICIAL AUTOMATED
    mysql MySQL is a widely used, open-source relation… 10380 [OK]
    mariadb MariaDB is a community-developed fork of MyS… 3848 [OK]
    mysql/mysql-server Optimized MySQL Server Docker images. Create… 758 [OK]
    percona Percona Server is a fork of the MySQL relati… 519 [OK]
    centos/mysql-57-centos7 MySQL 5.7 SQL database server 87
    docker search mysql --filter=STARS=3000 #搜索STARS>3000的mysql的镜像信息
    #运行结果
    NAME DESCRIPTION STARS OFFICIAL AUTOMATED
    mysql MySQL is a widely used, open-source relation… 10380 [OK]
    mariadb MariaDB is a community-developed fork of MyS… 3848 [OK]
    + +

    可选项

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    Name, shorthandDefaultDescription
    --filter , -fFilter output based on conditions provided
    --formatPretty-print search using a Go template
    --limit25Max number of search results
    --no-truncDon’t truncate output
    +

    都是在dockerhub上搜索

    +

    docker pull

    docker pull mysql # 下载MySQL的镜像
    #运行结果--默认下载最新版
    Using default tag: latest #tag就是版本号,默认为最新
    latest: Pulling from library/mysql
    a076a628af6f: Pull complete #分层下载
    f6c208f3f991: Pull complete
    88a9455a9165: Pull complete
    406c9b8427c6: Pull complete
    7c88599c0b25: Pull complete
    25b5c6debdaf: Pull complete
    43a5816f1617: Pull complete
    1a8c919e89bf: Pull complete
    9f3cf4bd1a07: Pull complete
    80539cea118d: Pull complete
    201b3cad54ce: Pull complete
    944ba37e1c06: Pull complete
    Digest: sha256:feada149cb8ff54eade1336da7c1d080c4a1c7ed82b5e320efb5beebed85ae8c
    Status: Downloaded newer image for mysql:latest
    docker.io/library/mysql:latest #真实地址
    #因此
    docker pull mysql
    等价于
    docker pull docker.io/library/mysql:latest
    #下载指定版本的MySQL
    docker pull mysql:5.7
    #运行结果
    5.7: Pulling from library/mysql
    a076a628af6f: Already exists
    f6c208f3f991: Already exists
    88a9455a9165: Already exists
    406c9b8427c6: Already exists #与刚刚下载的分层公用了
    7c88599c0b25: Already exists
    25b5c6debdaf: Already exists
    43a5816f1617: Already exists
    1831ac1245f4: Pull complete
    37677b8c1f79: Pull complete
    27e4ac3b0f6e: Pull complete
    7227baa8c445: Pull complete
    Digest: sha256:b3d1eff023f698cd433695c9506171f0d08a8f92a0c8063c1a4d9db9a55808df
    Status: Downloaded newer image for mysql:5.7
    docker.io/library/mysql:5.7
    + +

    可选项

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    Name, shorthandDefaultDescription
    --all-tags , -aDownload all tagged images in the repository
    --disable-content-trusttrueSkip image verification
    --platformAPI 1.32+ Set platform if server is multi-platform capable
    --quiet , -qSuppress verbose output
    +

    docker rmi 删除镜像

    #查询镜像
    docker images -a
    REPOSITORY TAG IMAGE ID CREATED SIZE
    mysql 5.7 a70d36bc331a 16 hours ago 449MB
    mysql latest c8562eaf9d81 16 hours ago 546MB
    hello-world latest bf756fb1ae65 12 months ago 13.3kB
    + +
    #删除ID为 a70d36bc331a的镜像
    docker rmi -f a70d36bc331a

    #删除所有镜像
    docker rmi -f $(docker images -aq)
    + +

    容器命令

    新建容器并启动

    用docker下载一个centOS

    +
    docker pull centos
    + +

    docker run

    docker run [可选参数] image
    #参数
    --name="Name" 容器名字”tomcat01 tomcat02“,用来区分容器
    -d 后台方式运行
    -it 使用交互方式运行,进入容器查看内容
    -P 指定容器的端口-p 8080:8080
    -p ip:主机端口:容器端口
    -p 主机端口:容器端口
    -p 容器端口
    容器端口
    -p 随机指定端口

    #进入容器
    [root@Shyee ~]# docker run -it centos /bin/bash
    [root@c549e8ba2456 /]#
    exit #退出容器
    [root@c549e8ba2456 /]# exit
    exit
    [root@Shyee ~]#

    #后台启动容器
    docker run -d 容器名
    #运行结果
    [root@Shyee ~]# docker run -d centos
    c8d9334aae4794a0d6456207fd5d52deb7328190f3059e6b74d90be64616e3e9
    [root@Shyee ~]# docker ps
    CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
    #启动后会被停掉
    #因为docker把容器后台启动后,发现前台没有容器正在运行,认为没有容器,所以就把后台的容器给停掉了
    + +

    可加载项

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    Name, shorthandDefaultDescription
    --add-hostAdd a custom host-to-IP mapping (host:ip)
    --attach , -aAttach to STDIN, STDOUT or STDERR
    --blkio-weightBlock IO (relative weight), between 10 and 1000, or 0 to disable (default 0)
    --blkio-weight-deviceBlock IO weight (relative device weight)
    --cap-addAdd Linux capabilities
    --cap-dropDrop Linux capabilities
    --cgroup-parentOptional parent cgroup for the container
    --cgroupnsAPI 1.41+ Cgroup namespace to use (host|private) ‘host’: Run the container in the Docker host’s cgroup namespace ‘private’: Run the container in its own private cgroup namespace ‘’: Use the cgroup namespace as configured by the default-cgroupns-mode option on the daemon (default)
    --cidfileWrite the container ID to the file
    --cpu-countCPU count (Windows only)
    --cpu-percentCPU percent (Windows only)
    --cpu-periodLimit CPU CFS (Completely Fair Scheduler) period
    --cpu-quotaLimit CPU CFS (Completely Fair Scheduler) quota
    --cpu-rt-periodAPI 1.25+ Limit CPU real-time period in microseconds
    --cpu-rt-runtimeAPI 1.25+ Limit CPU real-time runtime in microseconds
    --cpu-shares , -cCPU shares (relative weight)
    --cpusAPI 1.25+ Number of CPUs
    --cpuset-cpusCPUs in which to allow execution (0-3, 0,1)
    --cpuset-memsMEMs in which to allow execution (0-3, 0,1)
    --detach , -dRun container in background and print container ID
    --detach-keysOverride the key sequence for detaching a container
    --deviceAdd a host device to the container
    --device-cgroup-ruleAdd a rule to the cgroup allowed devices list
    --device-read-bpsLimit read rate (bytes per second) from a device
    --device-read-iopsLimit read rate (IO per second) from a device
    --device-write-bpsLimit write rate (bytes per second) to a device
    --device-write-iopsLimit write rate (IO per second) to a device
    --disable-content-trusttrueSkip image verification
    --dnsSet custom DNS servers
    --dns-optSet DNS options
    --dns-optionSet DNS options
    --dns-searchSet custom DNS search domains
    --domainnameContainer NIS domain name
    --entrypointOverwrite the default ENTRYPOINT of the image
    --env , -eSet environment variables
    --env-fileRead in a file of environment variables
    --exposeExpose a port or a range of ports
    --gpusAPI 1.40+ GPU devices to add to the container (‘all’ to pass all GPUs)
    --group-addAdd additional groups to join
    --health-cmdCommand to run to check health
    --health-intervalTime between running the check (ms|s|m|h) (default 0s)
    --health-retriesConsecutive failures needed to report unhealthy
    --health-start-periodAPI 1.29+ Start period for the container to initialize before starting health-retries countdown (ms|s|m|h) (default 0s)
    --health-timeoutMaximum time to allow one check to run (ms|s|m|h) (default 0s)
    --helpPrint usage
    --hostname , -hContainer host name
    --initAPI 1.25+ Run an init inside the container that forwards signals and reaps processes
    --interactive , -iKeep STDIN open even if not attached
    --io-maxbandwidthMaximum IO bandwidth limit for the system drive (Windows only)
    --io-maxiopsMaximum IOps limit for the system drive (Windows only)
    --ipIPv4 address (e.g., 172.30.100.104)
    --ip6IPv6 address (e.g., 2001:db8::33)
    --ipcIPC mode to use
    --isolationContainer isolation technology
    --kernel-memoryKernel memory limit
    --label , -lSet meta data on a container
    --label-fileRead in a line delimited file of labels
    --linkAdd link to another container
    --link-local-ipContainer IPv4/IPv6 link-local addresses
    --log-driverLogging driver for the container
    --log-optLog driver options
    --mac-addressContainer MAC address (e.g., 92:d0:c6:0a:29:33)
    --memory , -mMemory limit
    --memory-reservationMemory soft limit
    --memory-swapSwap limit equal to memory plus swap: ‘-1’ to enable unlimited swap
    --memory-swappiness-1Tune container memory swappiness (0 to 100)
    --mountAttach a filesystem mount to the container
    --nameAssign a name to the container
    --netConnect a container to a network
    --net-aliasAdd network-scoped alias for the container
    --networkConnect a container to a network
    --network-aliasAdd network-scoped alias for the container
    --no-healthcheckDisable any container-specified HEALTHCHECK
    --oom-kill-disableDisable OOM Killer
    --oom-score-adjTune host’s OOM preferences (-1000 to 1000)
    --pidPID namespace to use
    --pids-limitTune container pids limit (set -1 for unlimited)
    --platformAPI 1.32+ Set platform if server is multi-platform capable
    --privilegedGive extended privileges to this container
    --publish , -pPublish a container’s port(s) to the host
    --publish-all , -PPublish all exposed ports to random ports
    --pullmissingPull image before running (“always”|”missing”|”never”)
    --read-onlyMount the container’s root filesystem as read only
    --restartnoRestart policy to apply when a container exits
    --rmAutomatically remove the container when it exits
    --runtimeRuntime to use for this container
    --security-optSecurity Options
    --shm-sizeSize of /dev/shm
    --sig-proxytrueProxy received signals to the process
    --stop-signalSIGTERMSignal to stop a container
    --stop-timeoutAPI 1.25+ Timeout (in seconds) to stop a container
    --storage-optStorage driver options for the container
    --sysctlSysctl options
    --tmpfsMount a tmpfs directory
    --tty , -tAllocate a pseudo-TTY
    --ulimitUlimit options
    --user , -uUsername or UID (format: <name|uid>[:<group|gid>])
    --usernsUser namespace to use
    --utsUTS namespace to use
    --volume , -vBind mount a volume
    --volume-driverOptional volume driver for the container
    --volumes-fromMount volumes from the specified container(s)
    --workdir , -wWorking directory inside the container
    +

    docker ps

    docker ps #查看正在运行的容器
    docker ps -a #查看运行过的容器
    docker ps -a -n=? #显示最近?个容器
    + +

    退出

    exit #停止并退出
    Ctrl+P+Q #不停止退出
    + +

    删除容器

    docker rm 容器id #不能删除正在运行的容器
    docker rm -f $(docker ps -aq) #删除所有容器
    docker ps -a -q|xargs docker rm #删除所有容器
    + +

    启动和停止

    docker start 容器id #启动
    docker restart 容器id # 重启
    docker stop 容器id #停止
    docker kill 容器id #强行停止
    + +

    查看命令

    docker logs
    Options:
    --details Show extra details provided to logs
    -f, --follow Follow log output
    --since string Show logs since timestamp (e.g. 2013-01-02T13:23:37) or relative (e.g. 42m for 42 minutes)
    --tail string Number of lines to show from the end of the logs (default "all")
    -t, --timestamps Show timestamps
    --until string Show logs before a timestamp (e.g. 2013-01-02T13:23:37) or relative (e.g. 42m for 42 minutes)
    #运行一个容器,让他不停打印
    [root@Shyee ~]# docker run -d centos /bin/sh -c "while true;do echo Shyee;sleep 1;done"
    936f798488f4afb85055dea3d75c40703b827823467af54f0ee20834f2298760
    [root@Shyee ~]# docker ps
    CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
    936f798488f4 centos "/bin/sh -c 'while t…" 9 seconds ago Up 8 seconds laughing_feistel
    [root@Shyee ~]# docker logs -tf --tail 10 936f798488f4
    2021-01-20T04:17:47.958314992Z Shyee
    2021-01-20T04:17:48.960104271Z Shyee
    2021-01-20T04:17:49.962248118Z Shyee
    2021-01-20T04:17:50.964089661Z Shyee
    2021-01-20T04:17:51.965808705Z Shyee
    2021-01-20T04:17:52.967578590Z Shyee
    2021-01-20T04:17:53.969388856Z Shyee
    2021-01-20T04:17:54.971137786Z Shyee
    2021-01-20T04:17:55.972977481Z Shyee
    2021-01-20T04:17:56.974827278Z Shyee
    2021-01-20T04:17:57.976766489Z Shyee
    #一直会刷新
    + +

    查看docker容器内部信息

    docker top
    [root@Shyee ~]# docker top a87e6c731659
    UID PID PPID C STIME TTY TIME CMD
    root 101771 101755 1 12:22 ? 00:00:00 /bin/sh -c while true;do echo Shyee;sleep 1;done
    root 101826 101771 0 12:22 ? 00:00:00 /usr/bin/coreutils --coreutils-prog-shebang=sleep /usr/bin/sleep 1
    + +

    查看容器的信息

    docker inspect
    [root@Shyee ~]# docker inspect a87e6c731659
    [
    {
    "Id": "a87e6c731659ecff036fac2cede73e586466f15bbc026f5a1f3d106bc990a38a",
    "Created": "2021-01-20T04:22:02.208432632Z",
    "Path": "/bin/sh",
    "Args": [
    "-c",
    "while true;do echo Shyee;sleep 1;done"
    ],
    "State": {
    "Status": "running",
    "Running": true,
    "Paused": false,
    "Restarting": false,
    "OOMKilled": false,
    "Dead": false,
    "Pid": 101771,
    "ExitCode": 0,
    "Error": "",
    "StartedAt": "2021-01-20T04:22:02.751586945Z",
    "FinishedAt": "0001-01-01T00:00:00Z"
    },
    "Image": "sha256:300e315adb2f96afe5f0b2780b87f28ae95231fe3bdd1e16b9ba606307728f55",
    "ResolvConfPath": "/var/lib/docker/containers/a87e6c731659ecff036fac2cede73e586466f15bbc026f5a1f3d106bc990a38a/resolv.conf",
    "HostnamePath": "/var/lib/docker/containers/a87e6c731659ecff036fac2cede73e586466f15bbc026f5a1f3d106bc990a38a/hostname",
    "HostsPath": "/var/lib/docker/containers/a87e6c731659ecff036fac2cede73e586466f15bbc026f5a1f3d106bc990a38a/hosts",
    "LogPath": "/var/lib/docker/containers/a87e6c731659ecff036fac2cede73e586466f15bbc026f5a1f3d106bc990a38a/a87e6c731659ecff036fac2cede73e586466f15bbc026f5a1f3d106bc990a38a-json.log",
    "Name": "/dazzling_matsumoto",
    "RestartCount": 0,
    "Driver": "overlay2",
    "Platform": "linux",
    "MountLabel": "",
    "ProcessLabel": "",
    "AppArmorProfile": "",
    "ExecIDs": null,
    "HostConfig": {
    "Binds": null,
    "ContainerIDFile": "",
    "LogConfig": {
    "Type": "json-file",
    "Config": {}
    },
    "NetworkMode": "default",
    "PortBindings": {},
    "RestartPolicy": {
    "Name": "no",
    "MaximumRetryCount": 0
    },
    "AutoRemove": false,
    "VolumeDriver": "",
    "VolumesFrom": null,
    "CapAdd": null,
    "CapDrop": null,
    "Capabilities": null,
    "Dns": [],
    "DnsOptions": [],
    "DnsSearch": [],
    "ExtraHosts": null,
    "GroupAdd": null,
    "IpcMode": "private",
    "Cgroup": "",
    "Links": null,
    "OomScoreAdj": 0,
    "PidMode": "",
    "Privileged": false,
    "PublishAllPorts": false,
    "ReadonlyRootfs": false,
    "SecurityOpt": null,
    "UTSMode": "",
    "UsernsMode": "",
    "ShmSize": 67108864,
    "Runtime": "runc",
    "ConsoleSize": [
    0,
    0
    ],
    "Isolation": "",
    "CpuShares": 0,
    "Memory": 0,
    "NanoCpus": 0,
    "CgroupParent": "",
    "BlkioWeight": 0,
    "BlkioWeightDevice": [],
    "BlkioDeviceReadBps": null,
    "BlkioDeviceWriteBps": null,
    "BlkioDeviceReadIOps": null,
    "BlkioDeviceWriteIOps": null,
    "CpuPeriod": 0,
    "CpuQuota": 0,
    "CpuRealtimePeriod": 0,
    "CpuRealtimeRuntime": 0,
    "CpusetCpus": "",
    "CpusetMems": "",
    "Devices": [],
    "DeviceCgroupRules": null,
    "DeviceRequests": null,
    "KernelMemory": 0,
    "KernelMemoryTCP": 0,
    "MemoryReservation": 0,
    "MemorySwap": 0,
    "MemorySwappiness": null,
    "OomKillDisable": false,
    "PidsLimit": null,
    "Ulimits": null,
    "CpuCount": 0,
    "CpuPercent": 0,
    "IOMaximumIOps": 0,
    "IOMaximumBandwidth": 0,
    "MaskedPaths": [
    "/proc/asound",
    "/proc/acpi",
    "/proc/kcore",
    "/proc/keys",
    "/proc/latency_stats",
    "/proc/timer_list",
    "/proc/timer_stats",
    "/proc/sched_debug",
    "/proc/scsi",
    "/sys/firmware"
    ],
    "ReadonlyPaths": [
    "/proc/bus",
    "/proc/fs",
    "/proc/irq",
    "/proc/sys",
    "/proc/sysrq-trigger"
    ]
    },
    "GraphDriver": {
    "Data": {
    "LowerDir": "/var/lib/docker/overlay2/24893cfd3f87c08a9366dac239c9fd5b02fea33a192fcc3f0c243a671c4da2c8-init/diff:/var/lib/docker/overlay2/f660b0f563e2db7f1e4e7c42e598560f1c25d2e10d534e781bfb2ccd45e9b38b/diff",
    "MergedDir": "/var/lib/docker/overlay2/24893cfd3f87c08a9366dac239c9fd5b02fea33a192fcc3f0c243a671c4da2c8/merged",
    "UpperDir": "/var/lib/docker/overlay2/24893cfd3f87c08a9366dac239c9fd5b02fea33a192fcc3f0c243a671c4da2c8/diff",
    "WorkDir": "/var/lib/docker/overlay2/24893cfd3f87c08a9366dac239c9fd5b02fea33a192fcc3f0c243a671c4da2c8/work"
    },
    "Name": "overlay2"
    },
    "Mounts": [],
    "Config": {
    "Hostname": "a87e6c731659",
    "Domainname": "",
    "User": "",
    "AttachStdin": false,
    "AttachStdout": false,
    "AttachStderr": false,
    "Tty": false,
    "OpenStdin": false,
    "StdinOnce": false,
    "Env": [
    "PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin"
    ],
    "Cmd": [
    "/bin/sh",
    "-c",
    "while true;do echo Shyee;sleep 1;done"
    ],
    "Image": "centos",
    "Volumes": null,
    "WorkingDir": "",
    "Entrypoint": null,
    "OnBuild": null,
    "Labels": {
    "org.label-schema.build-date": "20201204",
    "org.label-schema.license": "GPLv2",
    "org.label-schema.name": "CentOS Base Image",
    "org.label-schema.schema-version": "1.0",
    "org.label-schema.vendor": "CentOS"
    }
    },
    "NetworkSettings": {
    "Bridge": "",
    "SandboxID": "b1519a918616f880d5139e041386bce0c0a2e49c4330750c5f4ca8da34cae7e9",
    "HairpinMode": false,
    "LinkLocalIPv6Address": "",
    "LinkLocalIPv6PrefixLen": 0,
    "Ports": {},
    "SandboxKey": "/var/run/docker/netns/b1519a918616",
    "SecondaryIPAddresses": null,
    "SecondaryIPv6Addresses": null,
    "EndpointID": "1b101194ef0bb0cb2990db0acfa26a50e9dd20d10a0f633993ab1ef7a8b4ff98",
    "Gateway": "172.17.0.1",
    "GlobalIPv6Address": "",
    "GlobalIPv6PrefixLen": 0,
    "IPAddress": "172.17.0.2",
    "IPPrefixLen": 16,
    "IPv6Gateway": "",
    "MacAddress": "02:42:ac:11:00:02",
    "Networks": {
    "bridge": {
    "IPAMConfig": null,
    "Links": null,
    "Aliases": null,
    "NetworkID": "a414e1e71fc0c80a2484ca0c656819a0532ccc902b70b9123a07dab25baaf04a",
    "EndpointID": "1b101194ef0bb0cb2990db0acfa26a50e9dd20d10a0f633993ab1ef7a8b4ff98",
    "Gateway": "172.17.0.1",
    "IPAddress": "172.17.0.2",
    "IPPrefixLen": 16,
    "IPv6Gateway": "",
    "GlobalIPv6Address": "",
    "GlobalIPv6PrefixLen": 0,
    "MacAddress": "02:42:ac:11:00:02",
    "DriverOpts": null
    }
    }
    }
    }
    ]
    + +

    进入正在运行的容器

    docker exec -it 容器ID

    [root@Shyee ~]# docker exec -it a87e6c731659 /bin/bash
    [root@a87e6c731659 /]#
    [root@a87e6c731659 /]# ls
    bin dev etc home lib lib64 lost+found media mnt opt proc root run sbin srv sys tmp usr var
    [root@a87e6c731659 /]# ps -ef
    UID PID PPID C STIME TTY TIME CMD
    root 1 0 0 04:22 ? 00:00:00 /bin/sh -c while true;do echo Shyee;sleep 1;done
    root 396 0 0 04:28 pts/0 00:00:00 /bin/bash
    root 464 1 0 04:29 ? 00:00:00 /usr/bin/coreutils --coreutils-prog-shebang=sleep /usr/bin/sleep 1
    root 465 396 0 04:29 pts/0 00:00:00 ps -ef

    #另一种方法
    docker attach 容器ID
    [root@Shyee ~]# docker attach a87e6c731659
    + +

    拷贝

    #从容器内拷到容器外
    docker cp
    [root@Shyee ~]# docker images
    REPOSITORY TAG IMAGE ID CREATED SIZE
    centos latest 300e315adb2f 6 weeks ago 209MB
    #进入容器
    [root@Shyee ~]# docker run -it centos /bin/bash
    [root@112cbae27efa /]# cd /home
    [root@112cbae27efa home]# ls
    #创建测试文件
    [root@112cbae27efa home]# touch a.txt
    [root@112cbae27efa home]# ls
    a.txt
    #退出容器
    [root@112cbae27efa home]# exit
    exit
    [root@Shyee local]# docker ps
    CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
    [root@Shyee local]# docker ps -a
    CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
    112cbae27efa centos "/bin/bash" 4 minutes ago Exited (0) 14 seconds ago laughing_leakey
    #将测试文件拷贝出来
    [root@Shyee local]# docker cp 112cbae27efa:/home/a.txt /usr/local
    [root@Shyee local]# ls
    aegis a.txt bin blog etc games include jdk-15.0.1 lib lib64 libexec nginx nginx-1.19.6 sbin share src
    + +

    docker 部署nginx

    查找并下载容器

    docker search nginx
    docker pull nginx
    + +

    启动并配置

    #-d 后台启动
    #将25565映射到容器内的80
    [root@Shyee local]# docker run -d --name nginx01 -p 25565:80 nginx
    6cf85750f6e82fbeaffd84e90c28cdcbbc91e70a2771ff1ea81cba9f35281c33
    [root@Shyee local]# curl localhost:25565
    <!DOCTYPE html>
    <html>
    <head>
    <title>Welcome to nginx!</title>
    <style>
    body {
    width: 35em;
    margin: 0 auto;
    font-family: Tahoma, Verdana, Arial, sans-serif;
    }
    </style>
    </head>
    <body>
    <h1>Welcome to nginx!</h1>
    <p>If you see this page, the nginx web server is successfully installed and
    working. Further configuration is required.</p>

    <p>For online documentation and support please refer to
    <a href="http://nginx.org/">nginx.org</a>.<br/>
    Commercial support is available at
    <a href="http://nginx.com/">nginx.com</a>.</p>

    <p><em>Thank you for using nginx.</em></p>
    </body>
    </html>
    + +

    进入nginx

    [root@Shyee local]# docker exec -it nginx01 /bin/bash
    root@6cf85750f6e8:/# whereis nginx
    nginx: /usr/sbin/nginx /usr/lib/nginx /etc/nginx /usr/share/nginx
    root@6cf85750f6e8:/# cd etc/nginx
    root@6cf85750f6e8:/etc/nginx# ls
    conf.d fastcgi_params koi-utf koi-win mime.types modules nginx.conf scgi_params uwsgi_params win-utf
    + +

    dockers部署tomcat

    官方方式

    +
    $ docker run -it --rm tomcat:9.0
    #--rm 适用于测试,用完即关
    + +
    [root@Shyee local]# docker run -d -p 19132:8080 --name tomcat01 tomcat
    #测试报404
    #进入tomcat01
    [root@Shyee local]# docker exec -it tomcat01 /bin/bash
    root@b1085cdbfb07:/usr/local/tomcat# ls
    BUILDING.txt CONTRIBUTING.md LICENSE NOTICE README.md RELEASE-NOTES RUNNING.txt bin conf lib logs native-jni-lib temp webapps webapps.dist work
    root@b1085cdbfb07:/usr/local/tomcat# cd webapps
    root@b1085cdbfb07:/usr/local/tomcat/webapps# ls
    #webapp是空的
    + +

    webapps原有的文件都在 webapps.dist 中,所以把webapps.dist中的文件拷到webapps里。

    +
    root@b1085cdbfb07:/usr/local/tomcat# cp -r webapps.dist/* webapps
    root@b1085cdbfb07:/usr/local/tomcat# cd webapps
    root@b1085cdbfb07:/usr/local/tomcat/webapps# ls
    ROOT docs examples host-manager manager
    # 测试通过
    + +

    部署es+kibana

    es暴露的端口很多!

    +

    es十分的耗内存

    +

    es的数据一般需要放置到安全目录!挂载

    +

    官方文档

    +
    $ docker run -d --name elasticsearch -p 9200:9200 -p 9300:9300 -e "discovery.type=single-node" elasticsearch:7.10.1
    + +

    卡死了。

    +

    限制内存

    +
    $ docker run -d --name elasticsearch02 -p 9200:9200 -p 9300:9300 -e "discovery.type=single-node"  -e ES_JAVA_OPTS="-Xms64m -Xmx512m" elasticsearch:7.10.1
    + +
    [root@Shyee ~]# docker ps
    CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
    22dcdeaf2f79 elasticsearch:7.10.1 "/tini -- /usr/local…" 7 seconds ago Up 6 seconds 0.0.0.0:9200->9200/tcp, 0.0.0.0:9300->9300/tcp elasticsearch02
    [root@iZ2zeeg68odufzgdsoyyujZ ~]# docker stats

    CONTAINER ID NAME CPU % MEM USAGE / LIMIT MEM % NET I/O BLOCK I/O PIDS
    22dcdeaf2f79 elasticsearch02 5.87% 358.7MiB / 1.774GiB 19.74% 1.1kB / 0B 162MB / 0B 31
    + +

    检查

    +
    [root@Shyee ~]# curl localhost:9200
    {
    "name" : "22dcdeaf2f79",
    "cluster_name" : "docker-cluster",
    "cluster_uuid" : "_YJ5sKDETeqelK3n1v2U_w",
    "version" : {
    "number" : "7.10.1",
    "build_flavor" : "default",
    "build_type" : "docker",
    "build_hash" : "1c34507e66d7db1211f66f3513706fdf548736aa",
    "build_date" : "2020-12-05T01:00:33.671820Z",
    "build_snapshot" : false,
    "lucene_version" : "8.7.0",
    "minimum_wire_compatibility_version" : "6.8.0",
    "minimum_index_compatibility_version" : "6.0.0-beta1"
    },
    "tagline" : "You Know, for Search"
    }
    + +

    可视化

    portainer

    +
    docker run -d -p 8088:9000 --restart=always -v /var/run/docker.sock:/var/run/docker.sock --privileged=true portainer/portainer
    + +

    从浏览器链接8088端口进入

    +

    选择local

    +

    ![image-20210221204835330](D:\bloglocal\Docker 常用命令.assets\image-20210221204835330.png)

    +

    会进入到这种页面

    +

    ![image-20210221205209445](D:\bloglocal\Docker 常用命令.assets\image-20210221205209445.png)

    +

    commit镜像

    docker commit #提交容器为一个新的副本
    docker commit -m="提交的描述信息" -a="作者" 容器id 目标镜像名
    + +

    测试

    +
    #启动一个默认tomcat,
    docker run -it -p 8080:8080 tomcat
    docker exec -it 5fea3e1cfa5a /bin/bash
    root@5fea3e1cfa5a:/usr/local/tomcat# cd webapps
    root@5fea3e1cfa5a:/usr/local/tomcat/webapps# ls
    #发现webapps中没有东西(都在webapps.dist中)
    #将其拷贝到webapps中
    root@5fea3e1cfa5a:/usr/local/tomcat# cp -r webapps.dist/* webapps
    root@5fea3e1cfa5a:/usr/local/tomcat# cd webapps
    root@5fea3e1cfa5a:/usr/local/tomcat/webapps# ls
    ROOT docs examples host-manager manager
    + +

    进行提交

    [root@Shyee ~]# docker commit -a ="Shyee" -m="init tomcat done" 5fea3e1cfa5a tomcat02:1.0
    sha256:75830e7057278f119161e5e0745c90fc9d58ea475476d64d50d522186ce58df4
    [root@Shyee ~]# docker images
    REPOSITORY TAG IMAGE ID CREATED SIZE
    tomcat02 1.0 75830e705727 6 seconds ago 654MB
    + +]]>
    + + 计算机 + + + Docker + linux + +
    + + Golang + /2020/04/03/Golang/ + Golang

    下载和安装

    官网下载,next安装。

    +

    在喜欢的磁盘找一个路径放GoPath并添加到系统变量

    +

    在GoPath中创建pkg src bin 路径,并配到环境变量中。

    +

    src存放开发代码,可创建多个域名以及子路径

    +

    开发

    使用VS code 开发下载所需要的 Go 插件。

    +

    使用VsCode打开go\src\域名\子路径(随意)。

    +

    Hello Go

    创建Hello路径,路径中创建main.go

    +

    输入

    +
    package main

    import "fmt"

    func main(){
    fmt.Println("Hello")
    }
    + +

    编译

    使用go build

    +

    1.在项目目录下执行go build

    +

    2.在其他路径下执行go build,需要在后面加上项目的路径(项目路径从GOPATH/Src后开始写起,编译之后的可执行文件就保存在当前目录下)

    +

    3.go build -o hello.exe (更改可执行文件的名称)

    +
    +

    go run类似于执行脚本文件

    +

    go install 先编译后执行

    +

    跨平台编译–自行百度

    +]]>
    + + Golang + + + 小白 + 啥都学点 + +
    + + Helicon wave coupling to a finite plasma column + /2023/06/07/Helicon_wave_coupling_to_a_finite_plasma_column/ + 实验装置(带天线版)

    +

    计算了

    螺旋波体系中的色散关系

    介电张量(dielectric tensor)

    +

    介电张量

    +

    其中张量元素为:

    +

    tensor elements

    +

    +

    上图为等离子体色散函数

    +

    wpj、wcj和vj分别为等离子体、回旋、电子和离子碰撞频率,vTe=(2Te/me)^(1/2)为热电子速度。

    +

    磁化等离子体中的波传播

    +

    色散关系

    +

    其中 N = kc/ω = k/k0,k 是波矢量,I 是单位张量。

    +

    由于平行折射率 N = k/k0与发射天线的平行波数谱相关,因此很自然地将垂直折射率 N= k/k0 中的色散关系写为双二次方程,

    +

    perpendicular refractive index

    +

    解得

    +

    solution

    +

    其中

    +

    各参数

    +

    对应于垂直于外部磁场的相速度分量,与两个解相关的波被表示为慢波(s,+符号)和快波(f,-符号)。

    +

    本文考虑频率范围内的波传播

    +

    wave propagation in the frequency regime

    +

    为了处理易于管理的公式,假设波是弱阻尼的。然后我们得到ε元素的简化表达式,

    +

    simplified expressions

    +

    结合碰撞阻尼和朗道阻尼γe,ie,i/ω≪1,γeffeELD,则

    +

    further assumption

    +

    慢波色散公式如下:

    +

    慢波色散公式

    +

    慢波以大于几何平均频率ω0=(ωciωce)1/2的频率传播,反过来可以忽略离子阻尼,

    +

    neglected ion damping

    +

    快波色散关系可以写为:

    +

    fast wave dispersion relation

    +

    进一步得出螺旋波色散关系

    +

    helicon wave dispersion

    +

    由于实验中波数分量由天线等离子体系统的几何形状给出,所以色散关系可以写为

    +

    another form

    +

    与有限等离子圆柱体的电感耦合

    电磁波场的傅里叶表示可写为

    +

    Fourier representation of the electromagnetic wave field

    +

    因为磁化等离子体存在不同的左旋和右旋极化波方程,所以需要引入复杂的方位角本征函数。
    代入麦克斯韦方程

    +

    ansatz into Maxwell

    +

    得出了

    天线频谱

    能量沉积

    conclusion

    结果就是本文结论部分提到了用了一种code,但是通篇都没说用的啥code

    +

    除了通过当前的计算推断出更深入的物理理解之外,还有几个方面应该使我们能够使用当前的代码。

    +

    (i)只要沿磁场线不存在等离子体不均匀性,就可以处理发射天线的任意电流分布。因此,假设真实的等离子体数据(包括径向密度分布),可以研究不同天线的效率以找到最佳的天线几何形状。

    +

    (ii) 该代码产生系统的复阻抗,以便通过与阻抗测量结果比较,获得有关射频功率吸收的信息。

    +

    (iii) 原则上,该代码允许我们计算未来计划的等离子体中的电磁场分布。除了与等离子柱中电磁场的测量进行比较(例如使用磁探针)之外,利用电磁场的知识来研究测试电子的运动可能是有价值的。通过这种方式,可以获得可能导致螺旋波器件高效率的加速机制的一些物理见解。

    +

    ELD

    “Chen (1991, 1992) provided some evidence that electron Landau damping (ELD) combined with particle trapping may be a decisive factor in accelerating a considerable portion of the electrons to the ionization energy.” (Fischer 等, 1994, p. 2003) Chen (1991, 1992) 提供了一些证据表明,电子朗道阻尼 (ELD) 与粒子捕获相结合可能是将相当一部分电子加速到电离能的决定性因素。

    +

    快波(fast waves)& 慢波(slow waves)

    “We attempt to understand the results in terms of the fast and slow wave dispersion relations, and study, in this context, the validity of the approximate (fast) helicon wave dispersion relation.” (Fischer 等, 1994, p. 2003) 我们试图根据快波和慢波色散关系来理解结果,并在这种情况下研究近似(快)螺旋波色散关系的有效性。

    +

    这篇文章讲了什么?

    “Inductive helicon wave coupling to a plasma column is studied numeridy. In our theoretical model, the RF current distribution of the launching antenna is taken into account as well as the finite size of the plasma cylinder. Computational mults based on the data of presentday helicon devices are shown. The efficiency of various types of antennae is Studied for a wide range ofexperimental parameters. In particular, we discuss the role of magnetic-field-aligned electron Landau damping far the helicon wave absorption. In many cases, the numerical findings can be understood reasonably in term of the wavenumber spectra of the antenna and the helicon wave dispersion relation. In general, however, the full electromagnetic treatment is necessary in order to describe and to understand the inductive coupling in the helicon wave regime.” (Fischer 等, 1994, p. 2003) 耦合到等离子体柱的感应螺旋波被大量研究。在我们的理论模型中,发射天线的射频电流分布被考量以及等离子圆柱体的有限尺寸。显示了基于当今螺旋装置数据的计算倍数。针对广泛的实验参数研究了各种类型天线的效率。特别是,我们讨论了磁场对齐的电子 Landau 对螺旋波吸收的阻尼作用。在许多情况下,可以根据天线的波数谱和螺旋波色散关系合理地理解数值结果。然而,一般来说,为了描述和理解螺旋波区域中的电感耦合,完整的电磁处理是必要的。

    +]]>
    + + 文献 + + + 文献 + +
    + + Heliogabalus的玫瑰 + /2020/03/16/Heliogabalus%E7%9A%84%E7%8E%AB%E7%91%B0/ + img

    +

    The Roses of Heliogabalus depicts the young Roman emperor Elagabalus (203–222 CE) hosting a banquet, being swamped by drifts of pink rose petals falling from a false ceiling above. The youthful emperor, wearing a golden silk robe and tiara, watches the spectacle from a platform behind them, with other garlanded guests. A woman plays the double pipes beside a marble pillar in the background, wearing the leopard skin of a maenad, with a bronze statue of Dionysus, based on the Ludovisi Dionysus, in front of a view of distant hills.

    +

    Heliogabalus的玫瑰描绘了年轻的罗马皇帝Elagabalus(公元203-222年)举办的一场宴会,会场上,从屋顶假天花板上掉下来的粉红玫瑰花瓣淹没了宾客。这位年轻的皇帝穿着金色的丝绸长袍,带着头饰,半卧在客人身后的平台上,和其他有花环的客人一起观看了这场奇观。一名妇女在后面的大理石柱子旁边演奏着双管,她身穿梅纳德的豹纹裙,在她身边,是以卢多维西·狄俄尼索斯(Ludovisi Dionysus)为基础雕刻的狄俄尼索斯铜像,向雕像后方眺望,远处便是成片的山峦。

    +

    The painting depicts a (probably invented) episode taken from the Augustan History. Although the Latin refers to “violets and other flowers,” Alma-Tadema depicts Elagabalus smothering his unsuspecting guests with rose petals. The original reference is this: “In a banqueting-room with a reversible ceiling he once buried his guests in violets and other flowers, so that some were actually smothered to death, being unable to crawl out to the top.”

    +

    这幅画描绘了摘自奥古斯都历史的一部分(可能是杜撰)。尽管拉丁语提到的是“紫罗兰色和其他花朵”,但Alma-Tadema所描绘是Elagabalus用玫瑰花瓣窒息了他那些毫无戒心的客人。最初的参考是这样的:“在一个有可翻转天花板的宴会厅里,他曾经把客人们埋在紫罗兰和其他花朵中,使一些人被窒息而死,无法爬到山顶。”

    +

    The painting was commissioned by Sir John Aird in 1888. As roses were out of season in the United Kingdom, Alma-Tadema is reputed to have had rose petals sent from the south of France each week during the four months in which it was painted.

    +

    这幅画是约翰·艾尔德爵士(Sir John Aird)于1888年创作的。由于玫瑰在英国已经不合时宜,据说Alma-Tadema在创作的四个月中,每周都有从法国南部寄来的玫瑰花瓣。

    +
    +

    Elagabalus(埃拉伽巴路斯)

    +

    他的本名为瓦瑞乌斯·阿维图斯·巴西安努斯(Varius Avitus Bassianus),登基之後改名为马尔库斯·奥瑞里乌斯·安东尼努斯(Marcus Aurelius Antoninus)。他是罗马帝国建立以来,第一位出身自帝国东方——叙利亚——的皇帝。在卡拉卡拉遇刺身亡後,政军情势纷扰不已,东方军团拥立这位流有塞维鲁王族血统的少年继位;218年,在战胜马克里努斯之後,埃拉伽巴路斯成为罗马帝国的皇帝。

    +

    ——百度百科

    +]]>
    + + 艺术 + + + 艺术 + +
    + + LinearTable-3 + /2020/03/10/LinearTable-3/ + 单链表vs双链表–初篇

    +

    单链表对于某一结点前面的区域是未知的。即无法逆向检索,有时候不太方便

    +

    双链表则可以逆向检索,但是存储密度相比较稍微低一点。

    +

    双链表

    + +

    初始化(带头结点)

    typedef struct DNode {
    Elemtype data;
    struct DNode* prior, * next;
    }DNode,*DLinklist;
    //初始化双链表
    bool InitDLinklist(DLinklist& L) {
    L = (DNode*)malloc(sizeof(DNode));//分配一个头结点
    if (L == NULL)//内存不足 分配失败
    return false;
    L->prior = NULL;//头结点的prior永远指向NULL
    L->next = NULL;//头结点之后暂时还没有结点
    return true;
    }
    void testDLinklist() {
    DLinklist L;
    InitDLinklist(L);
    }
    //判断双链表是否为空 带头结点
    bool Empty(DLinklist L){
    if(L->next==NULL)
    return true;
    else
    return false;
    }
    + +

    插入

    修改指针时注意顺序

    +
    //后插
    bool InsertNextDNode(DNode* p, DNode* s) {
    if (p==NULL||s==NULL)//非法参数
    return false;
    s->next = p->next;
    if (p->next != NULL)//如果p结点有后继节点
    p->next->prior = s;
    s->prior = p;
    p->next = s;
    return true;
    }
    + +

    删除

    //删除p结点的后继结点
    bool DeleteNextDNode(DNode* p) {
    if (p == NULL)
    return false;
    DNode* q = p->next;//找到p的后继节点給q
    if (q == NULL)//p没有后继节点
    return false;
    p->next = q ->next;
    if (q->next != NULL)//判断q是不是最后一个结点
    q->next->prior = p;
    free(q);//释放q
    return true;
    }
    + +

    此时若要销毁这个双链表,只需找到头结点,然后循环删除后继节点即可。

    +
    void DestroyList(DLinklist& L) {
    //循环释放各个数据节点
    while (L->next != NULL)
    DeleteNextDNode(L);
    free(L);//释放L
    L = NULL;//使头指针指向NULL
    }
    + +

    遍历

    后向遍历

    +
    while(p!==NULL){
    //对结点p做相应处理,例如打印p
    p=p->next;
    }
    + +

    前向遍历

    +
    while(p!==NULL){
    //对结点p做相应处理,例如打印p
    p=p->prior;
    }
    + +

    跳过头结点的前向便利

    +
    while(p->prior!=NULL){
    //对结点p做相应处理,例如打印p
    p=p->prior;
    }
    + +

    双链表不可以随机存取,按位查找,按值查找都只能用遍历的方式实现。时间复杂度为O(n)

    +]]>
    + + 数据结构 + + + 线性表 + 双链表 + C + +
    + + LinearTable-2 + /2020/03/06/LinearTable-2/ + 先来比较一下顺序表跟单链表的优缺点:

    +

    顺序表:

    +

    优点: 可随机存取,存取密度高

    +

    缺点:要求大片连续空间,改变容量不方便

    +

    单链表:

    +

    优点:不要求大量的存储空间,改变容量方便

    +

    缺点:不可随机存取,要耗费一定空间存放指针

    +

    单链表

    用线性存储的方式实现线性结构。

    +

    结点:空间+指针

    +

    定义一个单链表

    ∵单链表都是靠其结构中的指针找寻下一个结点的头指针而连起来的,∴找到这个单链表只需要找到其头指针即可。

    +
    typedef struct LNode
    {
    ElemType data;//data成为数据域
    struct LNode* next;//指针存放下一个节点
    }LNode,*LinkList;
    LinkList L;//声明一个指向单链表第一个节点的指针 等价于LNode*L
    //向单链表中增加一个新的节点:在内存中申请一个节点空间,并用指针p指向这个节点
    struct LNode* p = (struct LNode*)malloc(sizeof(struct LNode));

    + +

    LinkList等价于LNode*

    +

    前者强调这个是单链表,后者强调这是结点

    +

    区分来写为了提高代码可读性。

    +

    初始化

    不带头节点

    //初始化一个单链表
    bool InitList(LinList &L){
    L=NULL;//防止脏数据
    return true;
    }
    //判断单链表是否为空
    bool Empty(LinkList L){
    return (L==NULL);
    }
    void test(){
    LinkList L;//声明一个指向单链表的指针
    InitList(L);
    }
    + +

    带头节点

    typedef struct LNode
    {
    ElemType data;//data成为数据域
    struct LNode* next;//指针存放下一个节点
    }LNode,*LinkList;
    bool InitList(LinList &L){
    L= (LNode*)malloc(sizeof(LNode));//分配头结点
    if(L==NULL)//内存不足,分配失败
    return false;
    L->next=NULL;//头结点之后没有其他结点
    return true;
    }
    bool isEmpty(LinList L){
    return L->next==NULL;
    }
    void test(){
    LinkList L;//声明一个指向单链表的指针
    InitList(L);
    }
    + +

    带头节点先办会比不带头节点更方便。

    +

    插入

    LineInsert(&L,i,e):插入操作。在表L中的第i个位置上插入指定元素。

    +

    带头节点

    + +
    typedef struct LNode {
    int data;
    struct LNode* next;
    }LNode, *LinkList;
    //在第i个位置插入元素e(带头节点)
    bool ListInert(LinkList &L,int i,ElemType e){
    if(i<1)
    return false;
    LNode *p;//指针p指向当前扫描到的结点
    int j =0;//当p指向的是第几个节点
    p =L;//L指向头节点,头节点是第0个结点(不保存数据)
    while(p!=NULL && j<i-1){//循环找到第i-1个结点
    p=p->next;
    j++;
    }
    if(p==NULL)//i值不合法
    return false;
    LNode *s=(LNode *)malloc(sizeof(LNode));
    s->data=e;
    s->next=p->next;
    p->next=s;//将结点s连接到p之后
    return true;//插入成功
    }
    + +

    平均时间复杂度=O(n)

    +

    不带头结点

    如果不带头结点,则插入、删除第1个元素时,需要更改头指针L。

    +
    typedef struct LNode {
    int data;
    struct LNode* next;
    }LNode, *LinkList;
    //在第i个位置插入元素e(不带头节点)
    bool ListInert(LinkList &L,int i,ElemType e){
    if(i<1)
    return false;
    if(i==1){
    LNode *s=(LNode *)malloc(sizeof(LNode));
    s->data=e;
    s->next=L;
    L=s;
    return true;//头指针指向新结点
    }
    LNode *p;//指针p指向当前扫描到的结点
    int j =1;//当p指向的是第几个节点
    p =L;//L指向头节点,头节点是第1个结点
    while(p!=NULL && j<i-1){//循环找到第i-1个结点
    p=p->next;
    j++;
    }
    if(p==NULL)//i值不合法
    return false;
    LNode *s=(LNode *)malloc(sizeof(LNode));
    s->data=e;
    s->next=p->next;
    p->next=s;//将结点s连接到p之后
    return true;//插入成功
    }
    + +

    指定结点的后插操作

    在指定结点之前插入都是未知区域,之后都是可知区域

    +
    //在p结点之后插入元素
    bool InsertNextNode(LNode *p,ElemType e){
    if(p==NULL)
    return false;
    LNode *s=(LNode *)malloc(sizeof(LNode));
    if(s==NULL)//内存分配失败情况
    return false;//某些情况可能分配失败
    s->data=e;//用结点s保存数据元素e
    s->next=p->next;
    p->next=s;//将结点s连到p之后
    return true;
    }
    + +

    时间复杂度=O(1)

    +

    对照上面的带头节点的第i个元素插入元素e可直接找到第i-1个结点,调用此时的后插操作。

    +

    指定结点的前插操作

    直接去找前驱除非指定头结点,否则很难办到

    +

    这时可以将要插入的结点与该结点替换

    +
    //在p结点之前插入元素e
    bool InsertPriorNode(LNode *p,ElemType e){
    if(p==NULL)
    return false;
    LNode *s=(LNode *)malloc(sizeof(LNode));
    if(s==NULL)//内存分配失败
    return false;
    s->next=p->next;
    p->next=s;//将新结点s连接到p之后
    s->data=p->data;//将p中元素复制到s中
    p->data=e;//p中元素覆盖为e
    return true;
    }
    + +

    or

    +
    bool InsertPriorNode(LNode *p,LNode *s){
    if(p==NULL||s=NULL)
    return false;
    s->next=p->next;
    p->next=s;//将新结点s连接到p之后
    ElemType temp=->p->data;//交换数据部分
    p->data=s->data;//将p中元素复制到s中
    s->data=temp;//p中元素覆盖为e
    return true;
    }
    + +

    删除

    ListDelete(&L,i,&e):删除操作。删除表L中第i个位置的元素,并用e返回删除元素的值。

    +

    找到第i-1个结点,将其指针指向第i+1个结点,并释放第i个结点。

    +

    带头指针

    typedef struct LNode {
    int data;
    struct LNode* next;
    }LNode, *LinkList;
    //在第i个位置插入元素e(带头节点)
    bool ListDelete(LinkList &L,int i,ElemType &e){
    if(i<1)
    return false;
    LNode *p;//指针p指向当前扫描到的结点
    int j =0;//当p指向的是第几个节点
    p =L;//L指向头节点,头节点是第0个结点(不保存数据)
    while(p!=NULL && j<i-1){//循环找到第i-1个结点
    p=p->next;
    j++;
    }
    if(p==NULL)//i值不合法
    return false;
    if(p->next==NULL){
    return false//第i-1个之后没有结点了
    }
    LNode *q=p—>next;//令q指向被删除结点
    e=q->data;//用e返回元素的值
    p->next=q->next;//将*q结点从链中断开
    free(q);//释放结点的存储空间
    return true;//删除成功
    }
    + +

    最坏、平均时间复杂度=O(n)

    +

    最好时间复杂度=O(1)

    +

    指定结点的删除

    bool DeleteNode (LNode *p) {
    if (p==NULL)
    return false;
    LNode *q=p->next;//令q指向*p的后继结点
    p->data=p->next->data;//和后继结点交换数据域
    p->next=q->next;//将*q结点从链中“断开”
    free(q);//释放后继结点的存储空间
    return true;
    }
    + +

    如果要被删除的结点恰巧是最后一个结点,p指向next的后继的时候会出现bug

    +

    此时只能从头开始检索

    +

    时间复杂度=O(1)

    +

    查找

    按位查找

    GetElem(L,i):按位查找操作,获取表中第i个位置的元素的值。

    +
    LNode * GetElem(LinkList L,int i){
    if(i<0)
    return false;
    LNode *p;//指针p指向当前扫描到的结点
    int j =0;//当p指向的是第几个节点
    p =L;//L指向头节点,头节点是第0个结点(不保存数据)
    while(p!=NULL && j<i){//循环找到第i-1个结点
    p=p->next;
    j++;
    }
    return p;
    }
    + +

    平均时间复杂度=O(n)

    +

    则带头结点的插入操作也可简化

    +
    bool ListInert(LinkList &L,int i,ElemType e){
    if(i<1)
    return false;
    LNode *p=GetElem(L,i-1);
    return InsertNextNode(p,e);
    }
    + +

    按值查找

    LocateElem(L,e):按值查找操作,在表L中查找具有给定关键字值的元素。

    +
    //找到数据域==e的结点
    LNode * LocateElem(LinkList L,ElemType e){
    LNode *p =L->next;
    //从第一个结点开始查找数据域为e的结点
    while(p!=NULL && p->data!=e)//这里默认就是int型数据,如果是struct类型则!=应该被替换
    p=p->next;
    return p;//找到后返回该结点指针,否则返回NULL
    }
    + +

    时间复杂度为O(n)

    +

    求表的长度

    int Length(LinkList L){
    int len=0;//计数器
    LNode *p=L;
    while(p->next !=NULL){
    p=p->next;
    len++;
    }
    return len;
    }
    + +

    时间复杂度为O(n)

    +

    单链表的建立

    尾插法

    LinkList List_TailInsert(ListList &L){//正向建立单链表
    int x;//设ElemType为整型

    //初始化空表
    L=(LinkList)malloc(sizeof(LNode));//建立头结点

    LNode *s,*r=L;//r为表尾指针
    scanf("%d",&x);//输入结点的值

    //后插操作
    while(x!=8848){//输入8848表示结束
    s=(LNode*)malloc(sizeof(LNode));
    s->data=x;
    r->next=s;

    //保持r指向最后一个结点
    r=s;//r指向新的表尾结点

    scanf("%d",&x);
    }
    r->next=NULL;//尾结点指针置空
    return L;
    }
    + +

    头插法

    LinkList List_HeadInsert(ListList &L){//逆向建立单链表
    LNode *s;
    int x;//设ElemType为整型

    //初始化空表
    L=(LinkList)malloc(sizeof(LNode));//建立头结点
    L->next=NULL;//初始化为空链表

    scanf("%d",&x);//输入结点的值

    //后插操作
    while(x!=8848){//输入8848表示结束
    s=(LNode*)malloc(sizeof(LNode));
    s->data=x;
    r->next=L->next;
    L->next=s;

    scanf("%d",&x);
    }
    return L;
    }
    + +

    因为每次直接往头结点后面插入

    +

    这样会使得插入的数据逆置

    +

    小结

    饿🍲

    +]]>
    + + 数据结构 + + + 线性表 + C + 单链表 + 头结点 + +
    + + LinearTable-5 + /2020/03/12/LinearTable-5/ + 静态链表–简简单单做个NPC

    +

    定义

    + +

    分配一整片连续的内存空间,各个结点集中安置。

    +
    #define MaxSize 10//静态链表的最大长度
    typedef struct{//静态链表结构类型的定义
    ElemType data;//存储数据元素
    int next;//下一个元素的数组下标
    }SLinkList[MaxSize];
    void test(){
    SLinkList a;
    }
    + +

    基本操作

    初始化

    +

    把头结点的游标设为-1,并且将其他结点的游标设为一个默认值 如8848

    +

    查找

    +

    从头结点出发依次往后遍历结点

    +

    插入

    +

    插入位序为i的结点

    +
      +
    1. 找到一个空的结点(循环遍历找到那个”8848“),存入数据元素

      +
    2. +
    3. 从头结点出发找到位序为i-1的结点

      +
    4. +
    5. 修改新结点的next

      +
    6. +
    7. 修改i-1号结点的next

      +
    8. +
    +

    删除

    +
      +
    1. 从头结点出发找到前驱结点
    2. +
    3. 修改前驱节点的游标
    4. +
    5. 被删除结点的next设为”8848“
    6. +
    +

    小结

    静态链表:用数组的方式实现的链表
    优点:增、删操作不需要大量移动元素
    缺点:不能随机存取,只能从头结点开始依次往后查找;容量固定不可变

    +

    适用场景:①不支持指针的低级语言:②数据元素数量固定不变的场景(如操作系统的文件分配表FAT)

    +]]>
    + + 数据结构 + + + 线性表 + C + 静态链表 + +
    + + LinearTable-4 + /2020/03/11/LinearTable-4/ + 在单链表和双链表上加上一点小小的改进–循环链表

    +

    循环单链表

    最后一个结点的next指针指向头结点

    +

    初始化

    typedef struct LNode
    {
    ElemType data;//data成为数据域
    struct LNode* next;//指针存放下一个节点
    }LNode,*LinkList;
    bool InitList(LinList &L){
    L= (LNode*)malloc(sizeof(LNode));//分配头结点
    if(L==NULL)//内存不足,分配失败
    return false;
    L->next=L;//头结点之后没有其他结点
    return true;
    }
    bool isEmpty(LinList L){
    return L->next==L;
    }
    void test(){
    LinkList L;//声明一个指向单链表的指针
    InitList(L);
    }
    + +

    循环双链表

    表头结点的prior指向表尾结点

    +

    表尾结点的next指针指向头结点

    +

    初始化

    + +
    typedef struct DNode {
    Elemtype data;
    struct DNode* prior, * next;
    }DNode,*DLinklist;
    //初始化双链表
    bool InitDLinklist(DLinklist& L) {
    L = (DNode*)malloc(sizeof(DNode));//分配一个头结点
    if (L == NULL)//内存不足 分配失败
    return false;
    L->prior = L;
    L->next = L;
    return true;
    }
    void testDLinklist() {
    DLinklist L;
    InitDLinklist(L);
    }
    //判断双链表是否为空 带头结点
    bool Empty(DLinklist L){
    if(L->next==L)
    return true;
    else
    return false;
    }
    + +

    对于添加(和删除)操作的时候

    +

    直接抢p(尾)结点 的next指针的prior指向下(删除反过来)一个结点

    +]]>
    + + 数据结构 + + + 线性表 + C + 循环链表 + +
    + + LinearTable-6 + /2020/03/12/LinearTable-6/ + 线性表学习终章–顺序表与链表的最终对决!

    +

    逻辑结构

    都属于线性表,都是线性结构🙋‍♂️

    +

    物理结构

    顺序表(顺序存储)

    优点:支持随机存取、存储密度高👍
    缺点:大片连续空间分配不方便,改变容量不方便👎

    +

    链表(链式存储)

    优点:离散的小空间分配方便,改变容量方便👍
    缺点:不可随机存取,存储密度低👎

    +

    数据的运算\基本操作

    创建

    顺序表👎

    需要预分配大片连续空间。若分配空间过小,则之后不方便拓展容量;若分配空间
    过大,则浪费内存资源。

    +

    静态分配:静态数组

    +

    容量不可改变
    动态分配:动态数组

    +

    容量可改变,但需要移动大量元素,时间代价高

    +
    链表👍

    只需分配一个头结点(也可以不要头结点,只声明一个头指针),之后方便拓展。

    +

    销毁

    顺序表👎

    修改Length = 0

    +

    静态分配:静态数组->系统自动回收空间
    动态分配:动态数组->需要手动free

    +

    malloc函数申请的空间为堆区,系统不会自动回收

    +
    链表👍

    依次删除各个结点(free)

    +

    增删

    顺序表👎

    插入/删除元素要将后续元素都后移/前移

    +

    时间复杂度0(n),时间开销主要来自移动元素

    +

    若数据元素很大,则移动的时间代价很高

    +
    链表👍

    插入/删除元素只需修改指针即可

    +

    时间复杂度0(n),时间开销主要来自查找目标元素

    +

    查找元素的时间代价更低

    +

    查找

    顺序表👍

    按位查找: 0(1)

    +

    按值查找: 0(n)若表内元素有序,可在O(logn)(以2为底)时间内找到

    +
    链表👎

    按位查找: O(n)

    +

    按值查找: O(n)

    +

    小结

    线性表·完🎊

    +]]>
    + + 数据结构 + + + 线性表 + 双链表 + C + 单链表 + +
    + + LinearTable + /2020/03/04/LinearTable/ + 线性表–顺序表

    +

    顺序表

    定义

    用顺序存储的方式实现线性表顺序存储。把逻辑上相邻的元素存储在位置上也相邻的存储单元中,元素之间的关系由存储单元的邻接关系来体现。

    +
    a1->a2->a3->a4->a5
    在内存中也是
    a1-a2-a3-a4-a5
    + +

    每个数据元素都是一样大的,即如果a1存放的位置为LOC(L),a2的位置=LOC(L)+数据元素的大小,a3的位置=LOC(L)+2*数据元素的大小…。

    +

    sizeof()

    C语言中查看一个数据元素大小,使用sizeof(ElemType)。

    +

    例:

    +
    sizeof(int)==4B

    typedef struct{
    int num;
    int people
    } Customer;
    sizeof(Customer)==8B
    + +

    数据表的实现

    静态分配

    #define MaxSize 10 //定义最大长度

    typedef struct{
    Elemtype data [MaxSize]; //用静态的"数组"存放数据元素
    int length; //顺序表的当前长度
    }SqList;//顺序表的类型定义
    + +

    这里就相当于一上来就定好了这么一个数据元素,内存为其分配连续的存储空间,大小为10.

    +

    初始化

    +
    //初始化
    void InitList(SqList &L){
    for(int i =0;i<MaxSize;i++)
    L.data[i]=0;//各个元素初始化(根据需要不一定置零),如果不进行这一行代码,可能会使元素中存入之前内存遗留的"脏数据".
    L.length=0;//长度标识置零
    }
    int main(){
    SqList L;//声名这个表
    InitList(L);//初始化这个表

    return 0
    }
    + +

    缺点:存储空间不可变!

    +

    动态分配

    #define InitSize 10 //定义最大长度

    typedef struct{
    Elemtype *data; //指示动态分配数组的指针
    int MaxSize;//顺序表的最大容量
    int length; //顺序表的当前长度
    }SeqList;//顺序表的类型定义
    + +
    malloc \free

    c语言中用于申请内存空间和释放内存空间的函数

    +

    c++中是使用new 和delete

    +

    malloc 会返回一个地址

    +

    L.data=(ElemType *)malloc(sizeof(ElemType) * InitSize);

    +

    比如 如果Elemtype为int,则上行代码为L.data=(int *)malloc(sizeof(int)* InitSize);,然后把返回的这个指针赋值给data。

    +

    这里sizeof就是查看这数据元素的长度 然后成上大小,就完成这个内存空间的分配 然后返回地址,然后取出地址的指针赋给data。

    +

    具体例子

    +
    #include <stdlib.h>
    #define InitSize 10 //定义最大长度

    typedef struct{
    int *data; //指示动态分配数组的指针
    int MaxSize;//顺序表的最大容量
    int length; //顺序表的当前长度
    }SeqList;//顺序表的类型定义
    //初始化
    void InitList(SeqList &L){
    //用malloc函数申请一篇连续的存储空间
    L.data=(int *)malloc(sizeof(int)* InitSize);
    L.length=0;
    L.MaxSize=InitSize;
    }
    //增加动态数组的长度
    void IncreaseSize(SeqList &L,int len){
    int *p=L.data;
    L.data=(int *)malloc(sizeof(int)* (L.MaxSize+len));
    for(int i=0;i<L.length;i++){
    L.data[i]=p[i];//将数据复制到新区域
    }
    L.MaxSize=L.MaxSzie+len;//顺序表最大长度增加len
    free(p);//释放原来的内存空间
    }
    int main(){
    SeqList L;
    InitList(L);//初始化
    IncreaseSize(L,5);//增加动态数据的长度
    return 0;
    }
    + +

    在增加长度的过程中,会先申请一个新的空间(增加后的大小),然后把之前存放的数据元素放到新空间里,然后释放旧空间。

    +

    特点

    随机访问,可以在O(1)时间内找到第i个元素。data[i-1]

    +

    存储密度搞,每个节点只存储数据元素

    +

    拓展容量不方便(即使采用动态存储分配的方式实现,拓展长度的时间复杂度也比较高)

    +

    插入、删除操作不方便,需要移动大量元素

    +

    顺序表的基本操作

    插入

    ListInsert(&L ,i,e):插入操作,在表L中的第i个位置上插入指定元素e。

    +
    #define MaxSize 10
    typedef struct{
    int data[MaxSize];
    int length;
    }SqList;
    bool ListInsert(SqList &L ,int i,int e){
    if (i < 1 || i > L.length + 1)//判断i的范围是否有效
    return false;
    if (L.length >= MaxSize)//当前存储空间已满,不能插入
    return false;
    for(int j=L.length;j>=i;j--)
    L.data[j]=L.data[j-1];//将第i个元素及之后的元素后移
    L.data[i-1]=e;//在位置i处放入e
    L.length++;//长度+1
    return true;
    }
    int main(){
    SqList L;
    InitList(L);
    ListInsert(L,3,3);//往第三个位置插入数据元素3
    return 0;
    }
    + +
    时间复杂度

    最好情况:新元素插入到表尾,不需要移动元素

    +

    i=n+1,循环0次,最好时间复杂度=O(1)

    +

    最坏情况:新元素插入到表头,需要把原有的n个元素向后移动

    +

    i=1,循环n次,最坏时间复杂度=O(n)

    +

    平均情况:新元素随即插入任何位置,平均概率为p=1/(n+1)

    +

    则平均循环次数为n/2,化简后,平均时间复杂度=O(n)

    +

    删除

    ListDelete(&L ,i,&e):删除操作。删除表L中第i个位置的元素,并用e返回删除元素的值。

    +
    #define MaxSize 10
    typedef struct{
    int data[MaxSize];
    int length;
    }SqList;
    bool ListDelete(SqList &L ,int i,int &e){
    if (i < 1 || i > L.length + 1)//判断i的范围是否有效
    return false;
    e=L.data[i-1];//将被删除的元素复制给e
    for(int j=i;j<L.length;j++)
    L.data[j-1]=L.data[j];//将第i个元素及之后的元素后前移
    L.length--;//长度-1
    return true;
    }
    int main(){
    SqList L;
    InitList(L);
    int e=-1;//用变量e把删除的元素带回来
    if(ListDelete(L,3,e))
    printf("删除成功,删除元素为%d\n",e);
    else
    printf("删除失败,位序i不合法\n");
    return 0;
    }
    + +
    时间复杂度

    与插入操作的类似且相反

    +

    最好情况 删除表尾元素 O(1)

    +

    最坏情况 删除表头元素O(n)

    +

    平均情况 随机位置删除 O(n/2)即O(n)

    +
    注意

    位序i与数组小标为i的区别(前者从1开始,后者从0开始)

    +

    按位查找

    GetElem(L,i):按位查找操作,获取L中第i个位置的元素的值。

    +
    静态分配方式

    直接选择第i个元素就行了

    +
    #define MaxSize 10 
    typedef struct{
    Elemtype data [MaxSize];
    int length;
    }SqList;
    ElemType GetElem(SqList L,int i){
    return L.data[i-1];
    }
    + +
    动态分配方式

    也是直接选择第i个位置就行

    +

    data是个指针,data[i]返回的即内存中data开始到往后sizeof(ElemType)个字节 的数据。

    +

    即如果sizeof(ElemType)=3B,data指向123,data[i]= 123+i*3的内容。

    +
    #define InitSize 10 
    typedef struct{
    Elemtype *data;
    int MaxSize;
    int length;
    }SeqList;
    ElemType GetElem(SqList L,int i){
    return L.data[i-1];
    }
    + +
    时间复杂度

    O(1)

    +

    按值查找

    LocateElem(L,e):按值查找操作,在表中查找给定关键字值的元素。

    +
    #define InitSize 10 
    typedef struct{
    Elemtype *data;
    int MaxSize;
    int length;
    }SeqList;
    int LocateElem(SqList L,int e){
    for(int i=0;i<L.length;i++){
    if(L.data[i]==e)
    return i+1;//返回的是位序
    return 0;
    }
    }
    + +
    时间复杂度

    最好情况 要查找的元素在第一个位置 最好时间复杂度=O(1)

    +

    最坏情况 要查找的元素在最后一个位置 最坏时间复杂度=O(n)

    +

    平均情况 要查找的元素在随机位置 平均时间复杂度=O((n+1)/2)即O(n)

    +

    总结

    还总结?要啥自行车啊🥡

    +]]>
    + + 数据结构 + + + 线性表 + C + 顺序表 + 动态分配 + 静态分配 + +
    + + MAVEN + /2020/03/04/MAVEN/ + MAVEN

    管理jar

    +

    i 增加第三方的jar

    +

    ii jar包之间的依赖关系

    +

    将项目拆分成若干个模块

    +

    maven 自动话构建工具

    +

    清理

    +

    编译 java-class

    +

    测试 针对于关键点的测试

    +

    报告

    +

    打包

    +

    安装

    +

    部署

    +

    安装

    下载二进制压缩包

    +

    下载后解压,我的解压路径为D:\apache-maven-3.6.3

    +

    右键我的电脑打开系统,点击高级系统设置(advance),点击环境变量,在系统变量中新建一个变量,变量名MAVEN_HOME,变量值D:\apache-maven-3.6.3

    +

    image-20210108150437064

    +

    系统变量中找到path,打开添加一条%MAVEN_HOME%\bin

    +

    image-20210108150641400

    +

    测试

    打开cmd

    +

    输入mvn -v

    +

    image-20210108151005405

    +

    配置仓库

    打开D:\apache-maven-3.6.3\conf\settings.xml

    +

    找到localRepository

    +

    image-20210108152001111

    +

    <localRepository>/path/to/local/repo</localRepository>摘出来,改成自己的路径<localRepository>D:\maven_repo</localRepository>

    +

    使用

    pom文件

    ]]>
    + + 计算机 + + + Java + MAVEN + 仓库 + +
    + + Machine Learning Algorithms A Review + /2023/07/05/Machine-Learning-Algorithms-A-Review/ + 摘要

    机器学习 (ML) 是对计算机系统用于执行特定任务而无需显式编程的算法和统计模型的科学研究。我们日常使用的许多应用程序中的学习算法。每次使用像谷歌这样的网络搜索引擎来搜索互联网时,其如此有效的原因之一是因为学习算法已经学会了如何对网页进行排名。这些算法用于各种目的,例如数据挖掘、图像处理、预测分析等。使用机器学习的主要优点是,一旦算法学会如何处理数据,它就可以自动完成其工作。本文对机器学习算法的广泛应用进行了简要回顾和未来展望。

    +

    算法分类

      +
    • supervised learning
        +
      • decision tree
      • +
      • naive bayes
      • +
      • support vector machine
      • +
      +
    • +
    • unsupervised learning
        +
      • principal component analysis
      • +
      • k-means
      • +
      +
    • +
    • semi-supervised learning
        +
      • generative model
      • +
      • self training
      • +
      • transductive support vector machine
      • +
      +
    • +
    • reinforcement learning
    • +
    • multi-task learning
    • +
    • ensemble learning
        +
      • boosting
      • +
      • bagging
      • +
      +
    • +
    • neutral network
        +
      • supervised neural network
      • +
      • unsupervised neural network
      • +
      • reinforce neural network
      • +
      +
    • +
    • instance based learning
        +
      • k-nearest neighbor
      • +
      +
    • +
    +

    决策树(decision tree)

    决策树是以树的形式表示选择及其结果的图。图中的节点表示事件或选择,图的边表示决策规则或条件。每棵树都由节点和分支组成。每个节点代表要分类的组中的属性,每个分支代表该节点可以取的值。

    +

    decisiontree

    +

    决策树的实现伪代码如下

    +
    def decisionTreeLearning(examples, attributes, parent_examples): 
    if len(examples) == 0:
    return pluralityValue(parent_examples)
    # return most probable answer as there is no training data left
    elif len(attributes) == 0:
    return pluralityValue(examples)
    elif (all examples classify the same):
    return their classification
    A = max(attributes, key(a)=importance(a, examples)
    # choose the most promissing attribute to condition on
    tree = new Tree(root=A)
    for value in A.values():
    exs = examples[e.A == value]
    subtree = decisionTreeLearning(exs, attributes.remove(A), examples)
    # note implementation should probably wrap the trivial case returns into trees for consistency
    tree.addSubtreeAsBranch(subtree, label=(A, value)
    return tree
    + +

    朴素贝叶斯(naive bayes)

    +

    它是一种基于贝叶斯定理的分类技术,假设预测变量之间独立。简而言之,朴素贝叶斯分类器假设类中特定特征的存在与任何其他特征的存在无关。朴素贝叶斯主要针对文本分类行业。它主要用于依赖于发生的条件概率的聚类和分类目的。

    +

    朴素贝叶斯

    +

    伪代码如下:

    +

    输入:训练数据集T,

    +

    F= (f1, f2, f3,.., fn) // 测试数据集中预测变量的值。

    +

    输出:一类测试数据集。

    +

    步骤:

    +
      +
    1. 读取训练数据集T;
    2. +
    3. 计算每类预测变量的均值和标准差;
    4. +
    5. 重复计算每类中使用高斯密度方程计算fi的概率;直到计算出所有预测变量(f1、f2、f3、..、fn)的概率。
    6. +
    7. 计算每个类别的可能性;
    8. +
    9. 获得最大的可能性
    10. +
    +

    支持向量机(support vector machine)

    另一种最广泛使用的最先进的机器学习技术是支持向量机(SVM)。在机器学习中,支持向量机是具有相关学习算法的监督学习模型,用于分析用于分类和回归分析的数据。除了执行线性分类之外,SVM 还可以使用所谓的核技巧有效地执行非线性分类,将其输入隐式映射到高维特征空间。它基本上是在类之间绘制边距。边距的绘制方式使得边距与类别之间的距离最大,从而最大限度地减少分类误差。

    +

    SVM

    +

    伪代码如下:

    +
    初始化 Yi = YI for i ⋹ I 
    重复
    计算具有估算标签的数据集的 svm 解决方案 vv , b
    计算正袋中所有 xi 的输出 ii = (vv , xi) + b
    对每个 i e i 设置 yi = sgn(fi),yi = 1
    对于(每个正bag bi)结束
    if (liei(l + yi)/2 == 0)
    计算 i* = arg maxiei ii
    set yi* = 1
    end
    while (imputed labels have changed)
    output (vv, b)
    + +

    主成分分析(Principal Component Analysis)

    主成分分析是一种统计过程,它使用正交变换将一组可能相关变量的观测值转换为一组称为主成分的线性不相关变量的值。在这种情况下,数据的维度被减少,使得计算更快更容易。它用于通过线性组合来解释一组变量的方差-协方差结构。它经常被用作降维技术。

    +

    PCA

    +

    K 均值聚类(k-means)

    +

    K-means 是解决众所周知的聚类问题的最简单的无监督学习算法之一。该过程遵循一种简单易行的方法,通过一定数量的聚类对给定数据集进行分类。主要思想是定义 k 个中心,每个簇一个。这些中心应该巧妙地放置,因为不同的位置会导致不同的结果。因此,更好的选择是将它们放置得尽可能远离彼此。

    +
    +

    这篇文章没有什么意义,主要是介绍,很多内容直接抄的,连字都懒得打,直接截图。

    +

    避雷Batta Mahesh,这个人的其它文章中还提到了制造永动机。

    +]]>
    + + 文献 + + + 文献 + 机器学习 + 综述 + +
    + + Machine learning Trends perspectives and prospects + /2023/07/05/Machine-learning-Trends-perspectives-and-prospects/ + + + + Measurement and modeling of ion energy distribution functions in a low pressure argon plasma diffusing from a 13.56 MHz helicon source + /2023/06/28/Measurement-and-modeling-of-ion-energy-distribution-functions-in-a-low-pressure-argon-plasma-diffusing-from-a-13-56-MHz-helicon-source/ + 摘要

    与扩散室耦合的螺旋源提供了一种更好地控制等离子体处理的新方法。然而,重要的是要了解扩散对从源到位于腔室中的晶片的等离子体的影响。 300 W 氩等离子体从 13.56 MHz(直径 6 厘米,长 20 厘米)圆柱形无磁场源扩散到直径 30 厘米,长 20 厘米的腔室中,已经进行了实验和理论研究。使用移动静电能量分析仪来测量沿源和室的公共轴的电子温度、等离子体电势、等离子体密度和离子能量分布函数(EDF)。开发了基于实验结果的分析模型。尽管源和衬底台之间存在约 40 V 的电势差,但与等离子体膨胀相关的电荷交换碰撞将撞击腔室底部接地探针的离子的平均能量降低至约 3 eV。在 1 μbar 时,碰撞次数太少,无法冷却场中加速的所有离子,并且离子分布函数中仍保留尾部。虽然没有测量,但热中性物也应该作为电荷交换碰撞的结果而产生,并且会撞击基板。

    +

    实验装置

    实验装置

    +

    用什么方法(模型)测量什么参数?

    密度

    测定了Density,使用empirical fit

    +

    经验公式

    +

    其中 n(0) 是源中心的密度,C 是与等离子体的几何形状和耦合相关的常数。

    +

    等离子体电势

    等离子体电势是根据分析仪测量的离子电流与鉴别器电压的关系推导出来的。

    +

    对于给定恒定的麦克斯韦电子分布,玻尔兹曼关系可用于将密度的演变与电势联系起来

    +

    玻尔兹曼关系

    +

    其中Vp(0)是源中心的电势,Te是电子温度。

    +

    离子能量分布函数

    离子 EDF 由测量电流的导数获得

    +

    (5)

    +

    vf(Vd)能测出来

    +

    能估计出平均离子速度。

    +

    轴向电场由等离子体电势的导数获得

    +

    轴向电场

    +

    分布函数取决于从产生点到测量点的电势和平均自由程变化。

    +

    平均自由程:

    +

    mean free path

    +

    其中nn(x)是中性数密度,a是横截面。

    +

    分析仪在轴向位置 xp 和鉴别器电势 Vd 处收集的离子电流的表达式

    +

    电流

    +

    +

    结论

    我们提出了氩等离子体低压扩散远离源区的实验结果。开发了一个简单的分析模型,该模型与实验结果一致,并显示了扩散区域中电荷交换碰撞的重要性。离子EDF的形状是膨胀产生的自洽场的加速效应与电荷交换碰撞的热化效应之间的平衡。这两种现象的直接后果将是产生快速中性粒子,该中性粒子会撞击扩散区域底部的基板。这些中性粒子代表了基底表面的额外能量输入,在估计表面反应时应予以考虑。

    +]]>
    + + 文献 + + + 文献 + +
    + + Modeling of profile effects for inductive helicon plasma sources + /2023/07/01/Modeling-of-profile-effects-for-inductive-helicon-plasma-sources/ + 摘要

    已经开发出用于对现有和新的材料加工螺旋源进行建模的计算机代码。 Nagoya Ⅲ型、螺旋形和 Stix 线圈天线已被建模,用于研究和检查等离子体密度和温度分布对一小部分 (nfe/ne≈5%) 快电子 (T≈40eV) 功率吸收的影响,这提供了实验中中性气体的电离,以及氩气中体相(T≈3 eV)电子的分布。 “ANTENA”计算机代码最初由 B.McVey 编写,用于研究离子回旋波,经过修改后用于研究和模拟螺旋源。代码中添加了包含径向密度和温度分布的碰撞模型,以研究碰撞对加热机制的影响。详细研究了碰撞和朗道阻尼加热机制的竞争效应,结果表明碰撞在高密度(ne ≥1013 cm-3)的等离子体吸收剖面中起着重要作用。射频波吸收曲线对等离子体密度和温度曲线敏感。研究发现,仅激发 m = +1 方位角模式的部分匝螺旋天线在将功率耦合到假设的等离子体轮廓方面比 Nagoya Ⅲ 型天线更有效。 Stix线圈也因其波热场的轴上峰值而被认为很有前途。

    +

    ANTNA

    Brian McVey编写 1984年

    +

    该代码计算了各种ICRF天线配置的真空场和线性自洽等离子体场。

    +

    随着电场和磁场的变化,计算了径向功率沉积曲线、径向功率流和天线阻抗(包括线圈之间的相互阻抗)。

    +

    程序结构图

    程序结构图

    +

    通过名称列表,INPUT读取定义图中所示问题所需的所有参数。下面的子例程,INITLZE执行各种计算,例如从cm转换。到m.,设置径向等离子体剖面,等等。绘图和打印子例程将输入信息写入磁盘文件。现在我们到了程序的主循环。IVAR是计算字段的自变量。方程的检验。(1)和(2)表明IVAR可以取多个不同的值;r, Φ, z, W/Wci, f, ne, T, T, B0, kz,以及其他用户定义的变量。根据ISPECTR的值,由SPECTRM计算Eq.(1)的被积,或由INTEG进行逆变换。子程序INTEG执行傅里叶求和或使用积分器包DRIVE。这些子程序中的每一个都调用FIELDS来计算给定n, kz模式下的Eq.(2)。最后,将计算出的字段数量写入磁盘文件,并重复该过程以获得新的IVAR值。图是“ANTENA”的一般流程图。

    +

    “ANTENA”代码使用包含源代码INTPROG4的集成包。

    +

    此代码计算由 RF 感应线圈包围的一维 (1-D) 圆柱形热磁化等离子体中的三维 (3-D) 电磁等离子体场。作者修改了此代码来研究和分析螺旋天线以及名古屋 Ⅲ 型和 m=0 Stix 线圈,以了解较低混合频率范围内高密度等离子体源的等离子体吸收曲线。

    +

    等离子体密度 ne(T) 和等离子体温度 Te(r) 是半径的函数,并且它们的径向变化通过分层模型来近似。等离子体响应的特征是等离子体等效介电张量,其中包括射频场的自洽朗道阻尼和碰撞阻尼。电子和离子均假定为麦克斯韦速度分布。引入“ANTENA”中实现的粒子守恒Krook碰撞模型,以唯象方式模拟电子碰撞。

    +

    物理含义

    Antenna-plasma geometry.

    +

    上图所示的几何形状(除去天线后)在 z(轴向)和 Φ(方位角)方向上是均匀的。因此,场量在这些方向上的空间变化可以表示为傅立叶表示。傅里叶逆变换由下式给出

    +

    (1)

    +

    傅里叶系数可以写为

    +

    (2)

    +

    圆柱形管中的真空电磁场可以扩展为相对于圆柱形波导的轴为横向电(TE)和横向磁(TM)的波导模式。轴向场分量满足贝塞尔方程

    +

    (3)

    +

    对于由下式给出的径向波数

    +

    (4)

    +

    横向场是根据轴向场的麦克斯韦方程确定的。在等离子体中,近 TE 模式的贝塞尔方程变为

    +

    (5)

    +

    (6)

    +

    (7)

    +

    对于近 TM 模式,我们有

    +

    (8)

    +

    (9)

    +

    (10)

    +

    径向波数 kr1,kr2 定义为

    +

    (11)

    +

    等离子体由“Stix”等效介电张量的众所周知的元素表示

    +

    (12)

    +

    其中 P 分量包括碰撞和朗道阻尼效应,由下式给出

    +

    (13)

    +

    (14)

    +

    其中 Z 是 Fried 和 Conte 列出的等离子体色散函数

    +

    +

    +

    返回到(1),较小的根(kr1)分配给近横向电模式,较大的根(kr2)分配给近横向磁模式。总轴向等离子体场由下式给出

    +

    (15)

    +

    (16)

    +

    轴向分量Hz1(r)和Ez2(r)分别满足贝塞尔方程,横向等离子体场Er,EΦ,Hr,HΦ由轴向分量确定。上述通解是通过在上图所示的三个区域之间的界面处施加边界条件来求解的。

    +

    当导电管半径 r = c 时,电场的切向分量必须消失

    +

    +

    在r=a处的等离子体-真空边界上,电场和磁场的切向分量是连续的。那是

    +

    +

    其中上标v表示真空,p表示等离子体区域。根据安培定律,在r=b处的电流片上,电场的切向分量是连续的,而磁场的切向分量是不连续的。因此,我们可以写

    +

    +

    +

    天线上的电流分布

    假设天线的电流密度为螺线管(V·J = 0),我们只需确定方位角电流密度,因为轴向电流密度可以通过连续性方程的 m - kz变换来计算。那是

    +

    (17)

    +

    对于分数螺旋线圈:直螺旋绕组极限中的分数螺旋模拟了名古屋Ⅲ型线圈。电流分布以 delta 函数和亥维赛函数表示

    +

    (18)

    +

    L = 线圈长度

    +

    ANTENA Ⅱ

    McVey编写的“ANTENA”代码在 CRAY CTSS 计算机系统上用 FORTRAN 语言编程,用于研究磁聚变等离子体的 ICRF(离子回旋加速器频率范围)加热。作者使用图形包 PlPlot 将代码从 CRAY 设施移植到基于 UNIX 的工作站。

    +

    我们减小了圆柱壳的宽度,并检查了2.5厘米和5.0厘米半径分层等离子体密度和温度分布的收敛性(通常为 800 个径向点)。这使我们能够研究频率范围 f ~1-30 MHz 的螺旋波的传播,该波在径向轮廓中表现出短波长。在 IBM RS/6000 370 型工作站上,典型的 800 个层(径向点)运行描述了分层等离子体密度和温度分布,并假设只有一种方位角模式,需要大约五分钟的运行时间。

    +

    下图中所示的天线被建模为主要激发 m = +1 和 m = 0 方位角模式以产生等离子体。 Nagoya Ⅲ 型和螺旋线圈主要激发 m = +1 模式,而 Stix 线圈由于其方位均匀性,主要激发 m = 0 模式。

    +

    图a-不同天线的配置

    +

    “ANTENA”代码能够计算图a所示的感应天线的辐射电阻和电抗。传输到等离子体的功率可以是。写成

    +

    (21)power transfer

    +

    天线的阻抗可写为

    +

    (22)

    +

    其中

    +

    RA = Rr + RL = 天线电阻

    +

    Rr = 天线的辐射电阻

    +

    RL = 天线的趋肤损耗电阻

    +

    XA = 天线电抗

    +

    辐射电阻和品质因数Q是确定等离子体耦合功率效率的重要参数。辐射功率贡献于天线阻抗的实部,而存储在近场中的功率由阻抗的无功部分表示。

    +

    总体品质因数 Q 可以根据等离子体 Qp= wL/R 确定,根据“ANTENA”计算得出,以及外部匹配网络 Qc。即1/Q=1/Q+1/Qc

    +

    通过对所有方位模数 m 进行积分,计算了三种等离子体密度分布的分数螺旋、Nagoya-Ⅲ 型天线和 Stix 线圈的辐射电阻。天线中心位于 z = 0 cm,长度 L = 25 cm,半径 T = 5.5 cm。对于所有三种等离子体剖面建模,螺旋天线比 Nagoya type-Ⅲ 具有更高的辐射电阻值和更低的品质因数。因此,该天线更容易与外部发生器匹配,并有效地将功率耦合到等离子体。螺旋天线较高的辐射电阻还可以实现与等离子体的有效功率耦合,同时线圈结构上的集肤效应损耗最小。还计算了 Stix 线圈的阻抗 (m = 0)。与其他天线相比,Stix 线圈激发低幅度 Ez(kz) 频谱。它具有最小的辐射电阻和较大的电抗,导致品质因数Q值非常大。因此,从射频源到天线的输入功率的匹配更加困难。

    +

    螺旋源模拟结果

    “ANTENA”代码用于对与螺旋源选定的实验数据相对应的案例进行建模。m = +1 螺旋模式的近似色散关系可以写为

    +

    (23)

    +

    然后获得该模式的轴向波长

    +

    (24)

    +

    也就是说,对于给定的频率 f 和磁场 Bo,螺旋波长将大致按 1/ne 变化。(波长与电子密度相关)

    +

    图 5. 对于 Nagoya Ⅲ型天线,在固定频率 f = 6 MHz 和磁场 Bo = 800 G 下,随着等离子体密度的增加,阻尼波的空间变化。

    +

    图5显示了空间阻尼B波幅随电子密度ne的增加而变化,假设抛物线等离子体密度ne(r)和等离子体温度Te(r)。名古屋Ⅲ型天线的长度为L = 25 cm,中心位于 z = 0 cm。我们观察到,正如预期的那样,轴向波长随着密度的增加而减小,并且波长约为 50 cm,是天线长度的两倍。

    +

    作者对低和高等离子体密度区域进行了建模,如图 7 所示。我们将频率固定在 f = 7 MHz,并改变磁场 B0 以保持比率 B0/ne,因此螺旋轴向波长 λ∥,[见(24)]常数。对于模型中使用的参数,该轴向波长在 10 到 60 cm 的范围内。尺寸如前所述的分数螺旋天线用于激发 m = +1 模式。

    +

    图 7. 由于 m = +1 模式和频率 f = 7 MHz 的螺旋波的朗道和碰撞阻尼,分数螺旋天线的体电子(实线)和快电子(虚线)吸收的径向功率。 (a) 低密度 (ne0 = 1 x 10^11 cm-3,B0 = 250 G)。 (b) 高密度 (ne0= 2 x10^13 cm-3,B0 = 700 G)。

    +

    图 7 说明朗道阻尼过程和碰撞阻尼过程均发生在该密度范围内。在低密度下,如图 7(a) 所示,大部分射频功率通过螺旋波的朗道阻尼被一小部分快电子吸收。随着等离子体密度的增加,由于碰撞阻尼而导致的大块慢电子的吸收变得占主导地位,并且碰撞阻尼率变得比朗道过程导致的更大。在高密度(ne≥10^13cm-3)下,碰撞阻尼是这些 3-4 eV 等离子体中的主要加热机制,但快速电子上存在少量朗道吸收。

    +

    作者根据二参数相关曲线 ne(r) = ne0(1-(r/a)^s)^t 模拟了各种等离子体密度分布,以检查它们对功率吸收的影响。假设温度分布均匀,各对参数 (s,t) 如图 10(a) 所示

    +]]>
    + + 文献 + + + 文献 + +
    + + MyBatis安装 + /2020/02/24/MyBatis%E5%AE%89%E8%A3%85/ + Mybatis✔

    +

    环境:

    +
      +
    1. JDK 13.0.2

      +
    2. +
    3. tomcat 9.0.3

      +
    4. +
    5. mybatis 3.5.4

      +
    6. +
    7. mysql 8

      +
    8. +
    +

    入门

    早期为:ibatis:apache

    +

    2010年被Google收购改称:Mybatis

    +

    主要作用:简化JDBC操作,实现数据的持久化。

    +

    ORM:Object Relational Mapping,可以使开发人员像操作对象一样操作数据库

    +

    mybatis是ORM的一种实现

    +

    下载

    之前看过的一个教程是使用Idea的,也就是直接使用依赖库导入,这次看的是导入jar使用。

    +

    官网

    + +

    选择Getting Started

    + + +

    会有Maven方式,当然使用Idea就可以直接复制代码框内代码到idea中,但这次选择jar的超链接。

    + + +

    就来到了熟悉的github,在最新版本下,有三个选项,这里选择第一个zip包下载。

    + + +

    下好之后是个zip,

    + + +

    打开以后目录文件如图,

    +

    lib文件夹存放mybatis的一些依赖包,

    +

    license就是字面意思 许可证,

    +

    mybatis-3.5.4.jar即要用到的jar,

    +

    .pdf即使用说明书,

    +

    NOTICE也是字面意思 注意事项。

    +

    使用

    简单实用一下:

    +

    导包

    打开eclipse,新建一个JAVA项目,因为mybatis是操控数据库的,所以暂时可以先间隔Javaproject试一下。

    +

    这里起名“TestMyBatis”,将mybatis-3.5.4.jar拖到src里面,顺便add to buildpath,添加环境。

    +

    建表

    打开cmd或者使用navicat,因为我的navicat建数据库总是会有数据编码混乱的问题,我一般建表都是用cmd。

    + + +

    创建实体类及映射关系

    创建实体类 Person

    + + +

    构建这个类

    +
    private String id;
    private String name;
    private int age;

    public Person() {

    }
    public Person(String id, String name, int age) {
    super();
    this.id = id;
    this.name = name;
    this.age = age;
    }
    public String getId() {
    return id;
    }
    public void setId(String id) {
    this.id = id;
    }
    public String getName() {
    return name;
    }
    public void setName(String name) {
    this.name = name;
    }
    public int getAge() {
    return age;
    }
    public void setAge(int age) {
    this.age = age;
    }

    + +

    创建配置文件映射表和类的映射 .xml文件

    + + +

    点这里转换视图

    +

    在刚刚的.pdf文件中有大概的配置方法,打开后找到“Exploring Mapped SQL Statements

    +

    下面有

    +
    <?xml version="1.0" encoding="UTF-8" ?> 
    <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
    <mapper namespace="org.mybatis.example.BlogMapper">
    <select id="selectBlog" resultType="Blog">
    select * from Blog where id = #{id}
    </select>
    </mapper>
    + +

    直接复制,到刚刚的xml中,更改namespace 后面的内容为自己的xmltop.eshyee.entity.personMapper

    +

    改完之后

    +
    <?xml version="1.0" encoding="UTF-8" ?> 
    <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
    <mapper namespace="top.eshyee.entity.personMapper">
    <select id="queryPersonById" resultType="Person" parameterType="String">
    select * from person where id= #{id}
    </select>
    </mapper>
    + +

    在创建一个配置文件,在src下创建一个叫config.xml的文件。

    +

    在pdf中查找“Building SqlSessionFactory from XML

    +

    这里需要提前准备好一个用来链接的jar MySQL connector

    +

    网址:https://dev.mysql.com/downloads/connector/j/

    + + +

    选zip,下好之后,里面乱七八糟的东西就不细致分析了,会点工地英语看看就好。主要使用mysql-connector-java-8.0.19.jar。拖到eclipse ,add一下环境。

    +

    配置xml如下:

    +
    <?xml version="1.0" encoding="UTF-8" ?> 
    <!DOCTYPE configuration PUBLIC "-//mybatis.org//DTD Config 3.0//EN" "http://mybatis.org/dtd/mybatis-3-config.dtd">
    <configuration>
    <environments default="development">
    <environment id="development">
    <transactionManager type="JDBC" />
    <dataSource type="POOLED">
    <property name="driver" value="com.mysql.cj.jdbc.Driver" />
    <property name="url" value="jdbc:mysql://localhost:3306/test?useSSL=false&amp;serverTimezone=UTC" />
    <property name="username" value="你的用户名" />
    <property name="password" value="你的密码" />
    </dataSource>
    </environment>
    </environments>
    <mappers>
    <mapper resource="top/eshyee/entity/personMapper.xml" />
    </mappers>
    </configuration>
    + +

    ok写个测试用例

    +
    public static void main(String[] args) throws IOException {
    // TODO Auto-generated method stub
    //加载config
    Reader reader =Resources.getResourceAsReader("config.xml");
    SqlSessionFactory sessionFactory=new SqlSessionFactoryBuilder().build(reader);
    SqlSession session= sessionFactory.openSession();
    String statement ="top.eshyee.entity.personMapper.queryPersonById";
    Person person=session.selectOne(statement,"1234567890");
    //这里的1234567890是我接下来要插入的字符串
    System.out.println(person.toString());
    session.close();
    }
    + +

    同时在person下写一个toString()方法,这个可以自己来定,只要能看到person里的值就🉑。

    +

    测试

    测试以下~~在数据库中插入一行数据

    + + +

    run一下test

    + + +

    🆗

    +

    常见问题

      +
    1. 写完之后run的时候除了问题,报了一坨错其中有个timezone…想起来url写的jdbc:mysql://localhost:3306/test,然后后面加了?useSSL=false&serverTimezone=UTC,结果还不对,就百度了一下&在xml中是一种很神奇的存在得写成&amp;.
    2. +
    3. Resource导包的时候选择org.apache.ibatis.io.*;
    4. +
    +

    总结

    相对于写DButil方便了不少。

    +]]>
    + + MyBatis系列 + + + mybatis + 入门 + 初学者 + +
    + + MySQL进阶 + /2020/04/01/Mysql%20%E8%BF%9B%E9%98%B6/ + 使用Docker安装一个MySQL5.7
    [root@Shyee ~]# docker pull mysql:5.7
    [root@Shyee ~]# docker images

    #返回结果
    REPOSITORY TAG IMAGE ID CREATED SIZE
    mysql 5.7 a70d36bc331a 13 days ago 449MB

    #运行前需要一点配置
    [root@Shyee ~]# docker run --name mysql5 -v /usr/local/MySQL5:/var/lib/mysql -p 3306:3306 -e MYSQL_ROOT_PASSWORD=密码 -d a70d36bc331a

    [root@Shyee ~]# docker ps
    CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
    7b829aa38925 a70d36bc331a "docker-entrypoint.s…" 6 minutes ago Up 6 minutes 0.0.0.0:3306->3306/tcp, 33060/tcp mysql5

    #进入服务
    docker exec -it id /bin/bash
    + +

    数据库目录: datadir=/var/lib/mysql
    pid文件目录:–pid-file=/var/lib/mysql/ibdata01.pid

    +

    MySQL的文件结构

    root@7b829aa38925:/var/lib/mysql# ls
    auto.cnf ca.pem client-key.pem ib_logfile0 ibdata1 mysql private_key.pem server-cert.pem sys
    ca-key.pem client-cert.pem ib_buffer_pool ib_logfile1 ibtmp1 performance_schema public_key.pem server-key.pem

    root@7b829aa38925:/var/lib/mysql# cd /usr/share/mysql
    root@7b829aa38925:/usr/share/mysql# ls
    bulgarian errmsg-utf8.txt innodb_memcached_config.sql mysql-log-rotate mysqld_multi.server serbian
    charsets estonian install_rewriter.sql mysql-systemd-start norwegian slovak
    czech fill_help_tables.sql italian mysql_security_commands.sql norwegian-ny spanish
    danish french japanese mysql_sys_schema.sql polish swedish
    dictionary.txt german korean mysql_system_tables.sql portuguese ukrainian
    dutch greek magic mysql_system_tables_data.sql romanian uninstall_rewriter.sql
    english hungarian mysql-helpers mysql_test_data_timezone.sql russian

    + +

    查询MySQL的编码

    show variables like '%char%';

    +--------------------------+----------------------------+
    | Variable_name | Value |
    +--------------------------+----------------------------+
    | character_set_client | latin1 |
    | character_set_connection | latin1 |
    | character_set_database | latin1 |
    | character_set_filesystem | binary |
    | character_set_results | latin1 |
    | character_set_server | latin1 |
    | character_set_system | utf8 |
    | character_sets_dir | /usr/share/mysql/charsets/ |
    +--------------------------+----------------------------+
    8 rows in set (0.00 sec)
    需要统一设置编码UTF-8
    好麻烦,还是直接装在centOS上
    + +

    CentOS8 安装MySQL5.5

    下载

    https://dev.mysql.com/get/Downloads/MySQL-5.5/MySQL-server-5.5.59-1.el7.x86_64.rpm

    +

    https://dev.mysql.com/get/Downloads/MySQL-5.5/MySQL-client-5.5.59-1.el7.x86_64.rpm

    +

    上传到服务器

    +

    安装

    无依赖安装(–nodeps)

    +

    rpm -ivh –nodeps MySQL-server-5.5.59-1.el7.x86_64.rpm

    +

    rpm -ivh –nodeps MySQL-client-5.5.59-1.el7.x86_64.rpm

    +

    启动

    #验证
    [root@Shyee MySQL5]# mysqladmin --version
    mysqladmin Ver 8.42 Distrib 5.5.59, for Linux on x86_64
    #启动
    [root@Shyee MySQL5]# service mysql start
    Starting MySQL.Logging to '/var/lib/mysql/Shyee.err'.
    . [ OK ]
    #配置开机自启
    chkconfig mysql on
    + +

    改密码

    /usr/bin/mysqladmin -u root password 'new-password'
    + +

    使用

    mysql -u root -p
    + +

    统一编码

    改my-huge.cnf文件,复制到/etc,名字改为my.cnf

    +

    分别在mysql 和client插入一句default-character-set=utf8

    +

    mysqld中插入

    +

    character_set_server=utf8
    character_set_client=utf8
    collation_server=utf8_general_ci

    +
    修改后
    mysql> show variables like '%char%';
    +--------------------------+----------------------------+
    | Variable_name | Value |
    +--------------------------+----------------------------+
    | character_set_client | utf8 |
    | character_set_connection | utf8 |
    | character_set_database | utf8 |
    | character_set_filesystem | binary |
    | character_set_results | utf8 |
    | character_set_server | utf8 |
    | character_set_system | utf8 |
    | character_sets_dir | /usr/share/mysql/charsets/ |
    +--------------------------+----------------------------+
    8 rows in set (0.00 sec)
    + +

    mysql小知识

    MySQL逻辑分层:连接层->服务层->引擎层->存储层

    InnoDB与MyISAM

    InnoDB :事务优先(适合高并发操作;行锁)

    +

    My ISAM :性能优先(表锁)

    +

    查询MySQL支持哪些引擎

    mysql> show engines;
    + +

    ![image-20210202093942237](D:\bloglocal\Mysql 进阶.assets\image-20210202093942237.png)

    +

    查询当前使用的引擎

    +

    show variables like ‘%storage_engine%’;

    +
    mysql> show variables like '%storage_engine%';
    +------------------------+--------+
    | Variable_name | Value |
    +------------------------+--------+
    | default_storage_engine | InnoDB |
    | storage_engine | InnoDB |
    +------------------------+--------+
    2 rows in set (0.00 sec)
    + +

    默认innoDB

    +

    创建一个myISAM引擎的表

    mysql> create database myDB;
    Query OK, 1 row affected (0.00 sec)

    mysql> use myDB
    Database changed
    mysql> create table tb(id int(4) auto_increment,name varchar(5),dept varchar(5),primary key(id))ENGINE=MyISAM AUTO_INCREMENT=1 DEFAULT CHARSET=utf8;
    Query OK, 0 rows affected (0.01 sec)
    + +

    sql优化

    编写sql的过程

    +

    select distinct..from ..join ..on ..where ..group by ...having ..order by ..limit ..

    +

    MySQL执行代码的过程

    +

    from .. on.. join ..where ..group by ... having ...select distinct..order by limit ..

    +

    sql优化,重在优化索引

    +

    MySQL默认使用B+树做索引

    +

    如果一个字段是primary key,则改字段默认就是主键索引

    +

    索引的弊端:

    1.索引本身很大,可以存放在内存/硬盘(通常为硬盘)

    +

    2.索引不是所有情况均适用:a.少量数据b.频繁更新的字段c.很少使用的字段

    +

    3.索引会降低增删改的效率

    +

    优势:

    1提高查询效率(降低IO使用率)

    +

    2.降低CPU使用率(…order by age desc)

    +

    分类:

    单值索引:单列,age ;一个表可以多个单值索引, name

    +

    唯一索引:不能重复。id

    +

    复合索引:多个列构成的索引(相当于二级目录)(可以有多个列)

    +

    索引的创建

    方式一

    create 索引类型 索引名 on 表(字段)

    +
    --创建一个单值索引
    mysql> create index dept_index on tb(dept);
    Query OK, 0 rows affected (0.00 sec)
    Records: 0 Duplicates: 0 Warnings: 0

    --创建一个唯一索引
    mysql> create unique index name_index on tb(name);
    Query OK, 0 rows affected (0.00 sec)
    Records: 0 Duplicates: 0 Warnings: 0

    --创建一个复合索引
    mysql> create index dept_name_index on tb(dept,name);
    Query OK, 0 rows affected (0.00 sec)
    Records: 0 Duplicates: 0 Warnings: 0

    + +

    方式二

    alter table 表名 add index 索引名(字段)

    +
    --添加一个单值索引
    mysql> alter table tb add index dept_index(dept) ;
    Query OK, 0 rows affected (0.00 sec)
    Records: 0 Duplicates: 0 Warnings: 0
    --创建一个唯一索引
    mysql> alter table tb add unique index name_index(name) ;
    Query OK, 0 rows affected (0.00 sec)
    Records: 0 Duplicates: 0 Warnings: 0
    --创建一个复合索引
    mysql> alter table tb add index dept_name_index(dept,name) ;
    Query OK, 0 rows affected (0.00 sec)
    Records: 0 Duplicates: 0 Warnings: 0
    + +

    删除索引

    drop index 索引名 on 表名;

    +
    mysql> drop index name_index on tb;
    Query OK, 0 rows affected (0.00 sec)
    Records: 0 Duplicates: 0 Warnings: 0
    + +

    查询索引

    show index from 表名;

    +
    show index from tb;
    + +

    ![image-20210202102426701](D:\bloglocal\Mysql 进阶.assets\image-20210202102426701.png)

    +

    sql性能问题

    a.分析SQL的执行计划: explain,可以模拟SQL优化执行SQL语句

    +

    b.MySQL查询优化其会干扰我们的优化

    +

    官网提供的解决方案:https://dev.mysql.com/doc/refman/8.0/en/optimization.html

    +

    ![image-20210202103105970](D:\bloglocal\Mysql 进阶.assets\image-20210202103105970.png)

    +

    explain

    mysql> explain select * from tb;
    + +

    ![image-20210202103206570](D:\bloglocal\Mysql 进阶.assets\image-20210202103206570.png)

    +

    id :编号

    +

    select_type :查询类型

    +

    table :表

    +

    type:类型

    +

    possible_keys:预测用到的索引

    +

    key :实际使用的索引

    +

    key_len:实际使用索引的长度

    +

    ref:表之间的引用

    +

    rows :通过索引查询到的数据量

    +

    Extra:额外的信息

    +

    实例

    准备数据
    create table course(
    cid int(3),
    cname varchar(10),
    tid int(3)
    );
    create table teacher(
    tid int(3),
    tname varchar(20),
    tcid int(3)
    );
    create table teachercard(
    tcid int(3),
    tcdesc varchar(200)
    );
    --插入一些数据
    INSERT INTO course VALUES(1,'java',1);
    INSERT INTO course VALUES(2,'html',1);
    INSERT INTO course VALUES(3,'sql',2);
    INSERT INTO course VALUES(4,'web',3);

    INSERT INTO teacher VALUES(1,'tz',1);
    INSERT INTO teacher VALUES(2,'tw',2);
    INSERT INTO teacher VALUES(3,'tl',3);

    INSERT INTO teachercard VALUES(1,'tzdesc');
    INSERT INTO teachercard VALUES(2,'twdesc');
    INSERT INTO teachercard VALUES(3,'tldesc');
    + +
    查询课程编号为2或教师证编号为3 的老师信息
    mysql> select * from teacher t,course c,teachercard tc where c.tid=t.tid and t.tcid=tc.tcid and(c.cid=2 or tc.tcid=3);
    +------+-------+------+------+-------+------+------+--------+
    | tid | tname | tcid | cid | cname | tid | tcid | tcdesc |
    +------+-------+------+------+-------+------+------+--------+
    | 1 | tz | 1 | 2 | html | 1 | 1 | tzdesc |
    | 3 | tl | 3 | 4 | web | 3 | 3 | tldesc |
    +------+-------+------+------+-------+------+------+--------+
    + +
    explain
    mysql> explain select * from teacher t,course c,teachercard tc where c.tid=t.tid and t.tcid=tc.tcid and(c.cid=2 or tc.tcid=3);
    + +

    ![image-20210202105854202](D:\bloglocal\Mysql 进阶.assets\image-20210202105854202.png)

    +

    可以看到执行顺序,自上至下是t(三条记录) tc(三条记录) c(4条记录)

    +

    现在给teacher 插入几条记录

    +
    INSERT INTO teacher VALUES(4,'ta',4);
    INSERT INTO teacher VALUES(5,'tz',5);
    INSERT INTO teacher VALUES(6,'tv',6);
    + +

    再次解释

    +

    ![image-20210202110851529](D:\bloglocal\Mysql 进阶.assets\image-20210202110851529.png)

    +

    可以看到执行顺序是tc(三条记录) c(四条记录) t(6条记录)

    +

    顺序改变的原因:笛卡尔积

    +

    中间过程(乘积)越小越好–数据小的表优先查询

    +
    查询课程名字为sql的教师描述
    mysql> select tc.tcdesc from teacher t,course c,teachercard tc where c.tid=t.tid and t.tcid=tc.tcid and(c.cname='sql');
    +--------+
    | tcdesc |
    +--------+
    | twdesc |
    +--------+
    1 row in set (0.00 sec)
    + +
    explain
    explain select tc.tcdesc from teacher t,course c,teachercard tc where c.tid=t.tid and t.tcid=tc.tcid and(c.cname='sql');
    + +

    ![image-20210202114014023](D:\bloglocal\Mysql 进阶.assets\image-20210202114014023.png)

    +

    如果是嵌套查询

    +
    SELECT tcdesc from teachercard where tcid=(select tcid from teacher where tid=(select tid from course where cname='sql'));
    + +
    explain
    mysql> explain SELECT tcdesc from teachercard where tcid=(select tcid from teacher where tid=(select tid from course where cname='sql'));
    + +

    ![image-20210202114510975](D:\bloglocal\Mysql 进阶.assets\image-20210202114510975.png)

    +

    Id值不同时,id越大越优先查询

    +

    多表连接+嵌套查询

    +
    mysql> SELECT t.tname, tc.tcdesc from teachercard tc,teacher t where t.tcid=tc.tcid and t.tid=(select tid from course where cname='sql');
    +-------+--------+
    | tname | tcdesc |
    +-------+--------+
    | tw | twdesc |
    +-------+--------+
    1 row in set (0.00 sec)
    + +
    explain
    mysql> explain SELECT t.tname, tc.tcdesc from teachercard tc,teacher t where t.tcid=tc.tcid and t.tid=(select tid from course where cname='sql');
    + +

    ![image-20210202115402526](D:\bloglocal\Mysql 进阶.assets\image-20210202115402526.png)

    +

    id有相同有不同 所以执行顺序为 course tc t

    +

    select_type:

    +

    primary:主查询(最外层)

    +

    subquery:子查询(非最外层)

    +

    simple:简单查询

    +

    derived:衍生查询(查询时 使用到了临时表 在from中只有一张表)

    +

    Union

    +

    union result

    +

    type:索引类型

    system->const->eq_ref->ref->range->index->all

    +

    越往左性能越高

    +

    system:只有一条数据的系统表或衍生表只有一条数据的主查询 才能达到

    +

    const:只能查到一条数据的SQL,用于primary key 或unique索引 (类型与索引类型有关)

    +

    eq_ref:唯一性索引:对于每个索引键的额查询,返回匹配唯一行数据(有且只有1个,不能多,不能0)常见于主键或者唯一

    +

    ref:非唯一性索引:对于每个索引的查询,返回匹配的所有行(0,多)

    +

    range:检索指定范围的行,where 后面是一个有索引的范围查询(between in < > |in有时候会失效)

    +

    index:查询全部索引的数据:

    +

    all:查询全部表中的数据:

    +

    system/const:结果只有一条数据

    +

    eq_ref:结果多条 但是每条数据都是唯一的

    +

    ref:结果多条,但是每条数据是0或多条

    +

    possible keys:可能使用到的索引

    是一种预测,不准

    +

    keys:实际用到的索引

    key_len:索引长度

    用于判断复合索引是否被完全使用

    +

    创建一个用于实验的表

    +
    create table test_kl(name char(20) not null default '');
    alter table test_kl add index index_name(name);
    select * from test_kl where name='';
    + +

    ![image-20210207152639778](D:\bloglocal\Mysql 进阶.assets\image-20210207152639778.png)

    +

    key_len:60

    +

    在utf-8中1个字符占3个字节

    +

    索引字段是20 所以长度一共为60

    +

    如果字段可以为空

    +
    mysql> alter table test_kl add column name1 char(20) ;
    Query OK, 0 rows affected (0.00 sec)
    Records: 0 Duplicates: 0 Warnings: 0

    mysql> alter table test_kl add index index_name1(name1);
    Query OK, 0 rows affected (0.01 sec)
    Records: 0 Duplicates: 0 Warnings: 0
    + +

    ![image-20210207153309555](D:\bloglocal\Mysql 进阶.assets\image-20210207153309555.png)

    +

    如果字段可以为null MySQL 会用一个字节来标识

    +
    drop index index_name1 on test_kl;
    drop index index_name on test_kl;
    + +

    创建复合索引

    +
    alter table test_kl add index index_name1(name,name1);
    + +

    ![image-20210207153606087](D:\bloglocal\Mysql 进阶.assets\image-20210207153606087.png)

    +

    60 +60+1

    +
    alter table  test_kl add column name2 varchar(20);
    alter table test_kl add index name2_index(name2);
    + +

    ![image-20210207153855236](D:\bloglocal\Mysql 进阶.assets\image-20210207153855236.png)

    +

    20*3 +1+2

    +

    mysql用两个字节标识可变长度

    +

    gbk 一个字符2字节

    +

    Latin 一个字符一个字节

    +

    ref

    与type中的ref不同

    +

    指明当前表所参照的字段

    +

    rows

    被索引优化查询的 数据个数

    +

    extra

    using filesort:性能消耗大,需要额外的一次排序

    +

    常出现于order by

    +
    create table test02(a1 char(3),a2 char(3), a3 char(3),index idx_a1(a1),index idx_a2(a2),index idx_a3(a3));
    + +

    ![image-20210207154713367](D:\bloglocal\Mysql 进阶.assets\image-20210207154713367.png)

    +

    复合索引:不能跨列(最佳最前缀)

    +

    where 和order by 按照复合索引的顺序使用 ,不要跨列和无序使用

    +

    using temporary:性能损耗大,用到了临时表

    +

    一般出现在group by中

    +

    减少跨列使用

    +

    using index:索引覆盖(性能提升)

    +

    没有读取源文件,只从索引中获取数据

    +

    using where

    +

    需要回表查询

    +

    impossible where

    +

    where 字句为false

    +]]>
    + + 数据库 + + + MySQL + 数据库 + 事务 + +
    + + MyBatis系列 + /2020/04/01/MyBatis%E7%B3%BB%E5%88%97/ + mybatis

    + + +

    关于MyBatis的增删改查实现

    在MyBatis系列(一)中涉及了如何创建一个入门级的mybatis测试。

    +

    但是只涉及了查询单行数据,接下来 我把它补全。

    +

    上次采用的是MySQL数据库 ,这次我采用的是Oracle。从官网下到了Oracle6的一个jar.

    +

    环境:

    +

    eclipse 2019-12

    +

    Oracle 11g

    +

    apache tomcat 9.0.3

    +

    mybatis 3.5.4.jar

    +

    Oracle.jar

    +

    在Oracle中建个表

    create table (stuno number,stuname varchar(20),stuage number,graname varchar(20));,

    +

    随变插入几行数据,此处就不放图了🈚。

    +

    在eclipse里构建这个类

    此处省略代码,详见MyBatis系列(一)。

    +

    映射

    新建一个studentMapper.xml(当然是要映射了🍔)。

    +

    新建conf.xml(选择数据库以及映射关系)。

    +

    这里关于一些细节

    +
    <configuration>
    <environments default="development">
    <!-- 通过default选择 数据库环境(说白了就是运行哪个数据库) -->
    <environment id="development">
    <!-- transactionManager事物的提交方式
    JDBC 利用JDBC处理事务,手动(commit rollback,close)
    MANAGED:将事务交由其他组件(spring,jobss)去托管 ,默认使用完之后会关闭连接
    <property name="closeConnection" value="false" />这样就默认不关闭
    -->
    <transactionManager type="JDBC" />
    <!-- 数据源类型:
    POOLED:使用数据链接池
    UNPOOLED:不用连接池,传统JDBC,每次访问数据库均需要打开和关闭数据库
    JNDI:从tomcat中获取一个内置的数据库链接池(数据库链接池-数据源)
    -->
    <dataSource type="POOLED">
    <property name="driver" value="oracle.jdbc.driver.OracleDriver" />
    <property name="url" value="jdbc:oracle:thin:@127.0.0.1:1521:ORCL" />
    <property name="username" value="scott" />
    <property name="password" value="tiger" />
    </dataSource>
    </environment>
    <!--因为我远端也有个数据库所以我可以再配一个环境-->
    <environment id="cloud">
    <transactionManager type="JDBC" />
    <dataSource type="POOLED">
    <property name="driver" value="com.mysql.cj.jdbc.Driver" />
    <property name="url" value="jdbc:mysql://eshyee,top:3306/test?useSSL=false&amp;serverTimezone=UTC" />
    <property name="username" value="我的用户名" />
    <property name="password" value="我的密码" />
    </dataSource>
    </environment>
    </environments>
    <mappers>
    <mapper resource="top/eshyee/entity/studentMapper.xml" />
    </mappers>
    </configuration>
    + +

    关于Mapper.xml的新增代码,无非就是增删改查✨

    +
    <select id="queryStudentBystuNum" resultType="top.eshyee.entity.Student" parameterType="int">
    select * from student where stuno= #{stuno}
    </select>
    <select id="queryAllStudent" resultType="top.eshyee.entity.Student">
    select * from student
    </select>
    <insert id="addStudent" parameterType="top.eshyee.entity.Student" >
    insert into student(stuno,stuname,stuage,graname) values(#{stuNo},#{stuName},#{stuAge},#{graName})
    </insert>
    <update id="upDateStuByNo" parameterType="top.eshyee.entity.Student">
    update student set stuname=#{stuName},stuage=#{stuAge},graname=#{graName} where stuno=#{stuNo}
    </update>
    <delete id="deleteStuByNo" parameterType="int">
    delete from student where stuno=#{stuno}
    </delete>
    + +

    因为查之前说了,这里就拿改学生信息来做个小测试

    +
    // 修改学生--按学号
    public static void updateStuByNo() throws IOException {
    Reader reader = Resources.getResourceAsReader("conf.xml");
    SqlSessionFactory sessionfactory = new SqlSessionFactoryBuilder().build(reader);
    SqlSession session = sessionfactory.openSession();
    String statement = "top.eshyee.entity.studentMapper.upDateStuByNo";
    Student stu=new Student(2,"小牛",33,"二年级");
    int count = session.update(statement, stu);
    session.commit();
    System.out.println("修改成功," + count + "行受影响");
    session.close();
    }

    public static void main(String[] args) throws IOException {
    selectAll();
    updateStuByNo();
    selectAll();
    }
    + +

    测试,得到结果,注意要提交。

    + + +
    +

    mapper动态代理(MyBatis接口开发)

    原则:约定优于配置

    配置方式:

    +

    ​ abc.xml

    +

    硬编码方式

    +

    ​ abc.java

    +

    约定:默认值就是myProject

    +

    与传统配置的不同之处:省略掉statement,即根据约定直接定位出sql语句。

    +

    约定:

    +
    /*
    * 1.方法名和mapper.xml文件中的id值相同
    * 2.方法名的输入参数和mapper.xml文件中的标签parameterType类型一致
    * 3.方法的返回值和mapper.xml文件中的resultType一致
    */
    + +

    接口和mapper一一对应:namespace的value=接口的全类名

    +

    构建接口

    所以说新建一个接口,根据前一个篇的mapper.xml的文件基础上改,注:我这里是把接口建在了mapper包下

    +
    Student queryStudentBystuNum(int stuno);
    List<Student> queryAllStudent();
    int addStudent(Student student);
    int upDateStuByNo(Student student);
    int deleteStuByNo(int stuno);
    + +

    注意这里的接口要遵循上面的约定。

    +

    更改xml文件

    再mapper.xml file中,namespace也应该改成接口的名字

    +
    <mapper namespace="top.eshyee.mapper.StudentMapper">
    + +

    接下来,就是修改测试类,曾经使用的statement的地方,目前就不用使用了。

    +

    使用接口

    这次拿删除学生举例,首先要从session中获取到这个接口,使用getMapper方法。然后从这个接口中要我刚刚写的那个删除的方法deleteStuByNo(),这里我写死删除no为3的 倒霉孩子

    +
    Reader reader = Resources.getResourceAsReader("conf.xml");
    SqlSessionFactory sessionfactory = new SqlSessionFactoryBuilder().build(reader);
    SqlSession session = sessionfactory.openSession();
    StudentMapper stuMapper = session.getMapper(StudentMapper.class);
    int count = stuMapper.deleteStuByNo(3);
    session.commit();
    System.out.println("删除成功," + count + "行受影响");
    session.close();
    + +

    测试一下

    3号学生被删除并想你抛了一行log🌚

    + + +

    总结

    约定相对于配置来说,出错率更少了,因为不用写statement,而是通过调用接口去实现xml的id的调用,对于写statement的String容易手残的老哥来说,是不错的选择。

    +
    +

    关于一些优化🍔

    +

    数据库连接配置

    config.xml中如果配置了很多的东西,这时在想去更改数据库配置的一些参数显得尤为麻烦,这是可以新建一个properties来写一些kv对,再在config中使用<properties>标签来传值貌似就会简化一部分操作。

    +

    因此在src下新建一个db.properties文件。如下配置:

    +
    driver=oracle.jdbc.driver.OracleDriver
    url=jdbc:oracle:thin:@127.0.0.1:1521:ORCL
    username=scott
    password=tiger
    + +

    config.xml中添加

    +
    <properties resource="db.properties"></properties>
    + +

    数据源中配置:

    +
    <property name="driver" value="${driver}" />
    <property name="url" value="${url}" />
    <property name="username" value="${username}" />
    <property name="password" value="${password}" />
    + +

    如此,每次想对数据源做更改的时候只需改变kv对即可。

    +

    mybatis的全局参数设置更改

    谨慎更改👨‍🔧

    +
    <settings>
    <setting name="" value=""/>
    </settings>
    + +

    设置别名

    top.eshyee.entity.Student太长了🤦‍♀️,想要改别名。

    +

    (大小写不敏感)

    +

    选择两种方式:

    +
    设置单个别名
    <typeAliases>
    <typeAlias type="top.eshyee.entity.Student" alias="student"/>
    </typeAliases>
    + +
    批量设置别名
    <typeAliases>
    <package name="top.eshyee.entity"/>
    </typeAliases>
    + +

    还有一些内置别名。

    +

    小节

    怎么方便怎么来呗🏊‍♀️

    +
    +

    关于类型处理器和resultmap

    +

    类型处理器(类型转换器)

      +
    1. MyBatis自带一些常见的类型处理器

      +
    2. +
    3. 也可以自定义Mybatis类型处理器

      +
    4. +
    +

    JAVA 数据类型 –数据库(数据类型)

    +

    比如:

    +

    实体类 Student :Boolean stuSex true:男 /false:女

    +

    表中Student : number stuSex 1:男 / 0:女

    +

    自定义类型转换器

    假设

    我要在Student表里面新建一个性别列 男生用1 表示 女生用0表示(number类型),

    +

    此时实体类中我男生用的true 女生用的false(Boolean,仅仅是举个例子)。

    +

    数据类型不匹配此时数据类型不匹配。

    +

    创建类型转换器

    需要实现TypeHandler接口 此接口有一个实现类 BaseTypeHandler

    +

    因此实现转换器有两种方法 实现 接口TypeHandler 和 继承BaseTypeHandler(简单)

    +

    所以这里采用后者,去extendthis method。

    +
    准备工作

    新建一个Boolean的属性 叫做stuSex 。

    +

    private Boolean stuSex形成get set方法

    +
    转换器

    新建一个转换器继承BaseTypeHandler,编译器会自动生成三个方法

    +
    //	get是DB数据-->java数据
    public Boolean getNullableResult(ResultSet rs, String columnName) throws SQLException {
    return rs.getInt(columnName)==1?true:false;
    }

    public Boolean getNullableResult(ResultSet rs, int columnIndex) throws SQLException {
    return rs.getInt(columnIndex)==1?true:false;
    }

    public Boolean getNullableResult(CallableStatement cs, int columnIndex) throws SQLException {
    return cs.getInt(columnIndex)==1?true:false;
    }

    // set是java数据-->DB数据
    public void setNonNullParameter(PreparedStatement ps, int i, Boolean parameter, JdbcType jdbcType) throws SQLException {

    if(parameter) {
    ps.setInt(i, 1);
    }else {
    ps.setInt(i, 0);
    }
    }
    + +

    其中,

    +

    ps:PreparedStatement对象
    i:PreparedStatement对象操作的参数的位置
    parameter:Java值
    jdbcType:jdbc操作的数据类型

    +

    这里用到了三元运算符,想起了之前一个写个人网站用到的一个三元运算符🤦‍♂️(更)。

    +
    conf配置

    在config中加上转换器

    +
    <typeHandlers>
    <typeHandler handler="转换器类名" javaType="Boolean" jdbcType="INTEGER"/>
    </typeHandlers>
    + +

    这样就算是好了 测试一下

    +
    mapper配置

    使用了转换器的查询
    1如果类中属性和表中的字段类型都能合理识别(String-varchar2),则可以使用resultType resultType=”top.eshyee.entity.Student”
    否则(boolean-integer)使用resultMap
    2如果类中的属性名和表中的字段名都能够合理识别(stuNo-stuno)则可以使用resultType
    否则(id-stuno)使用resultMap

    +
    <select id="queryStudentBystuNumConverter" resultMap="studentResult" parameterType="int">
    select * from student where stuno= #{stuno}
    </select>
    <resultMap type="top.eshyee.entity.Student" id="studentResult">
    <id property="stuNo" column="stuno"/>
    <result property="stuName" column="stuname"/>
    <result property="stuAge" column="stuage"/>
    <result property="graName" column="graname"/>
    <result property="stuSex" column="stusex" javaType="boolean" jdbcType="INTEGER"/>
    </resultMap>
    + +

    resultMap

    resultMap可以实现两个功能:
    1 类型转换
    2 属性-字段名之间的映射关系

    +

    分为主键id和非主键result
    如果实体类中的属性跟数据库中那个的字段名叫法不一样,从下面的映射关系中也可以更改 。

    +

    这样就好了,可以在test.java中测试一下了。🥐

    +

    小结

    以前用过别的方法来转换数据库数据与java数据 但是这个更系统一些吧。

    +
    +

    输入参数和输出参数

    输入参数parameterType

    简单类型

    ${}#{}比较

    +

    #{任意值}或者${value}(标识符只能是value)

    +

    #{}会自动给String加上’’(自动类型转换)

    +

    ${}会原样输出,但是适合于动态排序(动态字段)

    +

    #{}可以防止sql注入

    +

    ${}不可以

    +

    ${}#{}相同之处

    +

    都可以获取对象的值,(嵌套类型对象)

    +

    对象类型

    #{属性名}或者${属性名}(对象的属性名例如stuNo)

    +
    <select id="queryStudentByAddress" resultType="top.eshyee.entity.Student" parameterType="address">
    select stuno,stuname,stuage from student
    where homeaddress=#{homeAddress} or schooladdress='${schoolAddress}'
    </select>
    + + + +

    嵌套类型输入参数为级联属性

    <select id="queryStudentByAddress" resultType="top.eshyee.entity.Student" parameterType="Student">
    select stuno,stuname,stuage from student where homeaddress=#{address.homeAddress} or schooladdress='${address.schoolAddress}'
    </select>
    <select id="queryStudentBystuNameOrAge" resultType="top.eshyee.entity.Student" parameterType="Student">
    select stuno,stuname,stuage from student
    where stuname like '%${stuName}%' or stuage=#{stuAge}
    </select>
    + +

    传入为hashmap

    <select id="queryStudentBystuNameOrAgewithHashmap" resultType="top.eshyee.entity.Student" parameterType="HashMap">
    select stuno,stuname,stuage from student
    where stuname like '%${stuName}%' or stuage=#{stuAge}
    </select>
    + +

    调用存储过程

    存储过程的传入参数在mybatis中用map来传递(Hashmap)
    CALLABLE设置sql 的调用方式是存储过程
    输出参数通过map的get方法获取

    +

    查询某个年级的所有学生总数

    数据库里
    create or replace procedure queryCountByGradeWithProcadure(gName in varchar,scount out number )
    as
    begin
    select count(1) into scount from student where graname=gname;
    end;
    /
    + +
    mapper中
    <select id="queryCountByGradeWithPrecadure" statementType="CALLABLE" parameterType="HashMap">
    {CALL queryCountByGradeWithProcadure(
    #{gName,jdbcType=VARCHAR,mode=IN},
    #{sCount,jdbcType=INTEGER,mode=OUT} )}
    </select>
    + +

    根据学号删除学生

    数据库里
    create or replace procedure deleteStuBystunoWithProcedure(sno in number)
    as
    begin
    delete from student where stuno=sno;
    end;
    /
    + +
    mapper中
    <delete id="deletestuByStunoWithPrecadure" statementType="CALLABLE" parameterType="HashMap">
    {CALL deleteStuBystunoWithProcedure(#{sno,jdbcType=INTEGER,mode=IN})}
    </delete>
    + +

    输出参数

    resultType

    简单类型,实体对象类型,实体对象类型的集合之前有提到过,此处不再赘述。

    +
    输出为HashMap

    通过别名作为map的key

    +
    <select id="queryStudentWithHash" resultType="HashMap">
    select stuno "no",stuname "name" from student
    </select>
    + +

    resultMap

    解决实体类型属性与数据表字段名不一致(前面有用到)

    +

    也可以使用HashMap+resultType

    +
    +

    关于动态sql

    if

    按姓名和年龄查询

    +
    <select id="qStuByNOrAWithSQLTag" parameterType="top.eshyee.entity.Student" resultType="top.eshyee.entity.Student">
    select stuno ,stuname from student where 1=1
    <if test="stuName!=null and stuName!= ''">
    student有stuname属性且不为null
    and stuname=#{stuName}
    </if>
    <if test="stuAge!=null and stuAge!=0">
    student有stunage属性且不为null
    and stuage=#{stuAge}
    </if>
    </select>
    + +

    这里and会出问题

    +

    where

    where:处理第一个and

    +
    <select id="qStuByNOrAWithSQLTag" parameterType="top.eshyee.entity.Student" resultType="top.eshyee.entity.Student">
    select stuno ,stuname from student
    <where>
    <if test="stuName!=null and stuName!= ''">
    and stuname=#{stuName}
    </if>
    <if test="stuAge!=null and stuAge!=0">
    and stuage=#{stuAge}
    </if>
    </where>
    </select>
    + +

    foreach

    查询学号为1 2 4的学生学号信息

    +

    迭代的类型:数组、对象数组、集合、属性

    +

    数组

    数组固定写法:array 这是约定

    +
    <select id="queryStuwithNoWitharray" resultType="top.eshyee.entity.Student" parameterType="int[]">
    select * from student
    <where>
    <if test="array!=null and array.length>0">
    <foreach collection="array" open="and stuno in(" close=")" item="stuNo" separator=",">
    #{stuNo}
    </foreach>
    </if>
    </where>
    </select>
    + +

    放入对象的属性中

    <select id="queryStuwithNoInGra" resultType="top.eshyee.entity.Student" parameterType="top.eshyee.entity.Grade">
    select * from student
    <where>
    <if test="stuNos!=null and stuNos.size>0">
    <foreach collection="stuNos" open="and stuno in(" close=")" item="stuNo" separator=",">
    #{stuNo}
    </foreach>
    </if>
    </where>
    </select>
    + +

    集合

    <select id="queryStuwithNowithlist" resultType="top.eshyee.entity.Student" parameterType="top.eshyee.entity.Grade">
    select * from student
    <where>
    <if test="list!=null and list.size>0">
    <foreach collection="list" open="and stuno in(" close=")" item="stuNo" separator=",">
    #{stuNo}
    </foreach>
    </if>
    </where>
    </select>
    + +

    对象数组

    必须使用Object[]

    +
    <select id="queryStuwithNowithObjArr" 
    resultType="top.eshyee.entity.Student" parameterType="Object[]">
    select * from student
    <include refid="objectArraStuno"></include>
    <!-- 如果sql片段不在一个文件
    <include refid="top.eshyee.mapper.StudentMapper.objectArraStuno"></include>
    -->
    </select>
    + +

    sql片段

    重复使用的提取出来

    +
    <sql id="objectArraStuno">
    <where>
    <if test="array!=null and array.length>0">
    <foreach collection="array" open="and stuno in(" close=")" item="student" separator=",">
    #{student.stuNo}
    </foreach>
    </if>
    </where>
    </sql>
    + +
    +

    关联查询

    关于关联查询主要重点是配置好mapper

    +

    一对一

    a.业务扩展类

    +

    核心:用resultType指定的类的属性包含多表查询的所有字段

    +

    b. resultMap

    +

    通过属性成员将2个类建立起联系

    +
    <!-- 利用业务扩展类实现一对一 -->
    <select id="qSByNWithO2O" resultType="top.eshyee.entity.StudentBussiness" parameterType="int">
    select s.*,c.* from student s inner join studentcard c
    on s.cardid =c.cardid
    where s.stuno=#{stuNo}
    </select>
    <!-- 利用resultmap实现一对一 -->
    <select id="qSByNWithMapO2O" resultMap="student_card_map" parameterType="int">
    select s.*,c.* from student s inner join studentcard c
    on s.cardid =c.cardid
    where s.stuno=#{stuNo}
    </select>
    <resultMap type="student" id="student_card_map">
    <id property="stuNo" column="stuNo"/>
    <result property="stuName" column="stuName"/>
    <result property="stuAge" column="stuAge"/>
    <result property="graName" column="graName"/>
    <result property="stuSex" column="stuSex"/>
    <!-- 一一映射用association,一对多用collection -->
    <association property="card" javaType="StudentCard">
    <id property="cardId" column="cardId"/>
    <result property="cardInfo" column="cardInfo"/>
    </association>
    </resultMap>
    + + + +

    一对多(多对一)

    (MyBatis:多对一,多对多的本质就是一对多的变化)

    +
    <!-- 查询1班的班级信息 和所有学生的信息 建立一对多关系 -->
    <select id="qCAS" resultMap="class_student_classid" parameterType="int">
    select c.*,s.* from student s
    inner join studentclass c
    on c.classid=s.classid
    where c.classid=#{classId}
    </select>
    <resultMap type="top.eshyee.entity.StudentClass" id="class_student_classid">
    <id property="classId" column="classId" />
    <result property="className" column="className"/>
    <!-- 属性类型用javatype 属性的元素类型用oftype -->
    <collection property="student" ofType="top.eshyee.entity.Student">
    <id property="stuNo" column="stuNo"/>
    <result property="stuName" column="stuName"/>
    <result property="stuAge" column="stuAge"/>
    <result property="graName" column="graName"/>
    <result property="stuSex" column="stuSex"/>
    </collection>
    </resultMap>
    + +

    多对多

    多对多 可由两个多对一等方法实现!

    +
    +

    log4j和延迟加载

    在之前下载的mybatis包中找到log4j并导入到项目

    +

    开启日志

    如果不指定,Mybatis就会根据以下顺序寻找日志
    SLF4J →Apache Commons Logging →Log4j 2→Log4j → JDK logging
    日志级别:
    DEBUG< INFO< WARN< ERROR
    如果设置为info, 则只显示info及以上级别的信息;
    建议:
    在开发时设置debug,在运行时设置为info或以上。

    +
    <settings>
    <setting name="logImpl" value="LOG4J" />
    </settings>
    + +

    每次运行就会出现诸如此类的debug

    +
    DEBUG [main] - PooledDataSource forcefully closed/removed all connections.
    DEBUG [main] - PooledDataSource forcefully closed/removed all connections.
    DEBUG [main] - PooledDataSource forcefully closed/removed all connections.
    DEBUG [main] - PooledDataSource forcefully closed/removed all connections.
    DEBUG [main] - Opening JDBC Connection
    DEBUG [main] - Created connection 961160488.
    DEBUG [main] - Setting autocommit to false on JDBC Connection [oracle.jdbc.driver.T4CConnection@394a2528]
    + +

    配置延迟加载

    嵌套查询多用于延迟加载的设计

    +

    具体如下

    +

    一对一:查学生和学生卡信息

    在xml中

    +
    <!-- 延迟加载 -->
    <select id="qSByNWithMapO2OLazy" resultMap="student_card_Lazyload_map" parameterType="int">
    <!-- 先查学生 -->
    select * from student
    </select>
    <resultMap type="student" id="student_card_Lazyload_map">
    <id property="stuNo" column="stuNo"/>
    <result property="stuName" column="stuName"/>
    <result property="stuAge" column="stuAge"/>
    <result property="graName" column="graName"/>
    <result property="stuSex" column="stuSex"/>
    <!-- 此次采用延迟加载:在查询学生时,并不立即加载学生证信息
    通过select在需要的时候再查学生证
    -->
    <association property="card" javaType="StudentCard" select="top.eshyee.mapper.StudentCardMapper.querycardbyid" column="cardid">
    <!-- <id property="cardId" column="cardId"/>
    <result property="cardInfo" column="cardInfo"/> -->
    </association>
    </resultMap>
    + +

    新建Cardmapper

    +
    <!-- 查询学生信息 -->

    <select id="querycardbyid" parameterType="int" resultType="top.eshyee.entity.StudentCard">
    select * from studentCard where cardid=#{cardId}
    </select>
    + +

    一对多:查班级和学生信息

    新建班级mapper

    +
    <select id="qCASLazy" resultMap="class_student_classid_lazy" parameterType="int">
    select c.* from studentclass c
    </select>

    <resultMap type="top.eshyee.entity.StudentClass" id="class_student_classid_lazy">
    <id property="classId" column="classId" />
    <result property="className" column="className"/>
    <!-- 属性类型用javatype 属性的元素类型用oftype -->
    <!-- 延迟加载 -->
    <collection property="student" ofType="top.eshyee.entity.Student" select="top.eshyee.mapper.StudentMapper.queryStuByClassId" column="classId">

    </collection>
    </resultMap>
    + +

    在studentmapper中

    +
    <!-- 延迟加载一对多 查询班级中的所有学生 -->
    <select id="queryStuByClassId" parameterType="int" resultType="top.eshyee.entity.Student">
    select * from student where classId=#{classId}
    </select>
    + +

    一对多和一对一的延迟加载配置方法相同

    +
    +

    mybatis 缓存

    查询缓存

    一级缓存:同一个SqlSession对象

    + +

    MyBatis默认开启一级缓存,如果用同样的SqlSession对象查询相同的数据,则只会在第一次查询时向数据库发送SQL语句,并将查询的结果放入到SQLSESSION中(作为缓存在) ;后续再次查询该同样的对象时则直接从缓存中查询该对象即可(即省略了数据库的访问)。

    +

    二级缓存

    +

    Mybatis自带二级缓存: [同一个namespace]生成的mapper对象

    +

    MyBati s默认情况没有开启二级缓存,需要手工打开。

    +

    conf.xml中

    +
    <!-- 开启二级缓存 -->
    <setting name="cacheEnable" value="true"/>
    + +

    mapper中

    +
    <!-- 声明此namespace开启二级缓存 -->
    <cache/>
    + +

    异常提示:NotSerializableException可知,MyBatis的二级缓存是将对象放入硬盘文件中

    +

    序列化:内存->硬盘

    +

    反序列化:硬盘->内存

    +

    准备缓存的对象,必须实现了序列化接口( 如果开启的缓存Namespace="top.eshyee.mapper.StudentMapper" 可知序列化对象为Student,因此需要将Student序列化(序 列化Student类,以及Student的级联属性、和父类)

    +

    触发将对象写入二级缓存的时机: SqlSession对象的close()方法

    +

    回顾: namespace的值 就是接口的全类名(包名.类名) ,通过接口可以产生代理对象(Mapper对象)

    +

    –>namespace决定了Mapper对象的产生

    +

    结论:只要产生的xxxMapper对象来自于同一个namespace,则这些对象共享二级缓存。

    +

    如果是同一个SqISession对象进行多次相同的查询,则直接进入一级缓存查询;

    + + +

    如果不是同一个SqISession对象进行多次相同的查询(但是均来自同一个namespace)则进入二级缓存查询

    +

    如果一个namespace, 如果有多个xxMapper. xml的namespace值相同, 则通过这些xxxMapper. xml产生的xxMapper,仍然共享二级缓存。

    +

    禁用:

    +

    在需要禁用的select标签中的usecache属性改为false

    +

    清理:与清理一级缓存的方法相同,一般执行增删改时会清理掉缓存 ,设计的原因是为了防止脏数据

    +

    commit();

    +

    commit会清理一级和二级缓存;但是清理二级缓存时,不能是查询自身的commit()

    +

    改标签

    +

    在select标签中设置flushCache= "true"

    +

    命中率:
    1 :0% 0.0

    +

    2:50% 0.5

    +

    3:2/3 0.666

    +

    4:3/4 0.75

    +

    三方提供的二级缓存:

    +

    ehicache、memcache

    +

    要想整合三方提供的二级缓存(或者自定义二级缓存) ,必须实现org.apache.ibatis.cache.Cache接口,该接口的默认实现类是PerpetualCache

    +

    整合ehcache二级缓存:

    +

    Ehcache-core.jar
    mybatis- Ehcache.jar
    slf4j-api.jar

    +

    编写ehcache配置文件Ehcache.xml

    +
    <ehcache xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:noNamespaceSchemaLocation="ehcache.xsd" updateCheck="true"
    monitoring="autodetect" dynamicConfig="true">
    <!-- 当二级缓存的对象超过内存限制时(缓存对象的个数>maxElements InMemory
    ),存放入的硬盘路径 -->
    <diskStore path="D:\Ehcache" />
    <!-- maxElementsInMemory:设置在内存中缓存对象的个数
    maxElementsOnDisk:设置在硬盘中缓存对象的个数
    eternal: 设置缓存是否永远不过期
    overflowToDisk:当内存中缓存的对象个数超过maxElementsInMemory的时候,是否转移到硬盘中
    timeToIdleSeconds:当2次访问超过该值的时候,将缓存对象失效
    timeToliveSeconds:一个缓存对象最多存放的时间(生命周期)
    diskExpiryThreadIntervalSeconds:设置每隔多长时间,通过一个线程来清理硬盘中的缓存
    memoryStioreEvictionPolicy: 当超过缓存对象的最大值时,处理的策略 LRU,FIFO,LFU
    -->

    <defaultCache

    maxElementsInMemory="1000"
    maxElementsOnDisk="1000000"
    eternal="false"
    overflowToDisk="false"
    timeToIdleSeconds="100"
    timeToLiveSeconds="100"
    diskExpiryThreadIntervalSeconds="120"
    memoryStoreEvictionPolicy="LRU">
    </defaultCache>

    </ehcache>
    + +

    配置mapper

    +
    <cache type= "org.mybatis.caches.ehcache.EhcacheCache">
    <property name= "maxELementsInMemory" value= "2000" />
    可以覆盖掉默认值
    </cache>
    + +]]>
    + + MyBatis系列 + + + MyBatis + 类型处理器 + 存储过程 + 动态sql + 关联查询 + 一对多 + log4j + 延迟加载 + 二级缓存 + +
    + + Oracle系列学习(一) + /2020/02/25/Oracle%E7%B3%BB%E5%88%97%E5%AD%A6%E4%B9%A0-%E4%B8%80/ + 之前都是一直在用MySQL,这回鸟枪换炮玩玩Oracle

    +

    环境:

    +
      +
    1. Oracle 11g
    2. +
    +

    下载和安装

    下载网址:https://www.oracle.com/cn/downloads/

    +

    选择11g,会有下载选项,两个file都要下载的。

    +

    image-20200225114215394

    +

    把两个zip解压在一个文件下,双击“setup”进行安装

    +

    image-20200225120405331

    +

    一波疯狂下一步就好了✔

    +

    这里安装的是桌面类,企业版

    +

    安装完成后会有Database Configuration Assistant,选择口令管理

    +

    image-20200225140230194

    +

    分别选择sys ,system 和scott,解锁,修改口令为”sys“,”system“,”tiger“(不带引号)。

    +

    image-20200225140548831

    +

    image-20200225140606895

    +

    然后点击确定,只要没输错 ,就不要管提示。

    +

    ok,Oracle11g就在电脑上成功安装。

    +

    image-20200225140804868

    +

    使用测试

    打开sqlplus

    +

    image-20200225141806309

    +

    输入scott,口令就是tiger

    +

    image-20200225141901711

    +

    查看一下所有表

    +

    image-20200225142136582

    +

    连接到navicat

    打开navicat

    +

    image-20200225143308994

    +

    新建链接+,如图配置,我这里选择的是以system链接,password就是安装的时候填的口令。

    +

    image-20200225143446828

    +

    advanced页面把SYSDBA选一下

    +

    image-20200225143714410

    +

    测试链接,连接成功!

    +

    image-20200225145319695

    +

    打开Oracle的连接,查看目录:

    +

    image-20200225145447644

    +

    打开scott,查看里面的表,当然跟刚刚查询到的是一样的

    +

    image-20200225145609209

    +

    然后是sysman里面的表(709张😵):

    +

    image-20200225145653505

    +

    system里面有156张:

    +

    image-20200225145931982

    +

    常见问题

      +
    1. 不要轻易尝试最新版。我一开始下的是最新版(19),然后一切都是常规安装,但是当时就卡在45%不动了,卡了一下午。是一个实例没有安装好,sqlplus能运行,但是navicat连不上(可能是配置问题)。最后中止安装删除D盘文件,C盘文件,注册表等。重新下的11g。
    2. +
    3. 安装过程中尽量不要在电脑上干别的事情。不知道是运气不好,还是怎么着,安装11g的时候一开始好好的,我就去搞别的事情了,但是过一会回来看,卡在60%了。又是一下午,最后无奈中止,重启安装文件,安装成功。
    4. +
    5. 如果忘记设置口令,问题不大,后期可以改。(alter user scott account unlock;)
    6. +
    +]]>
    + + Oracle系列 + + + 数据库 + Oracle + +
    + + Oracle系列学习(三) + /2020/03/12/Oracle%E7%B3%BB%E5%88%97%E5%AD%A6%E4%B9%A0-%E4%B8%89/ + 创建用户、创建表、简单操作

    +

    创建用户与授权

    表空间

    对应物理磁盘上建立一个数据文件,作为数据库对象(用户、表、存储过程等等)的物理存储
    空间;

    +

    创建表空间:

    +

    便于管理

    +

    性能提升

    +

    防止IO竞争

    +
    CREATE TABLESPACE 表空间名
    DATAFILE 文件路径 SIZE 文件大小
    AUTOEXTEND ON NEXT 扩展大小 MAXSIZE 最大空间;

    例如:
    CREATE TABLESPACE MYFIR_TBS
    DATAFILE 'D:\app\EShyee\oradata\orcl\MYFIR_TBS.DBF' SIZE 100M
    AUTOEXTEND ON NEXT 10M MAXSIZE 200M;
    + +

    查看表空间:

    +
    select file_name,tablespace_name,bytes from dba_data_files;
    + +

    用户

    创建用户

    create user 用户名 identified by 密码 [default tablespace 表空间名];
    + +

    创建用户时如果不指定 会使用默认的表空间users

    +

    授权

    grant connect,resource to 用户名 [with grant option];
    + +
    三种角色权限

    dba系统管理员最高权限,啥都能干

    +

    resource操作数据库数据,但是不能管理数据库(如用户管理)

    +

    connect连接数据库,但是不能操作数据库

    +

    角色是权限的集合,一个角色里,包含有很多个细分权限,

    +

    比如,resource角色包含create drop select insert等

    +

    -般为普通用授予connect和resource权限即可,如scott账户

    +

    with grant option表示该用户还可以将其权限授权给其他用户。

    +
    +

    注意:

    +

    12c版本开始,回收的unlimited tablespace权限,导致即使给用户指定了表空间,也不能使用。

    +

    解决办法是给用户授予该权限:

    +

    grant unlimited tablespace to用户

    +
    +
    实体权限

    对数据库实体的具体操作(如增删改查等),使用实体权限能细化授权

    +

    实体权限有select, update, insert, alter, index, delete,execute, all (all包括所有权限) 等

    +
    grant select, update, insert on表名to用户
    grant all on表名to用户
    grant select, update, insert on emp to EShyee
    + +

    补充其他管理操作

    查询当前用户的默认表空间
    select default_tablespace from user_users ;

    修改密码
    Alter user EShyee identified by tt456;

    冻结用户与解锁用户
    Alter user scott account lock
    Alter user scott account unlock

    删除用户
    drop user 用户名;
    + +

    创建表

    三要素

    1、表名
    2、表中有哪些列(列名)
    3、列的数据类型

    +

    create table名(列名数据类型列名数据类型..);

    +
    create table student(
    stuno varchar2(20) ,
    name varchar2(20),
    age int,
    height number(4, 1)
    );
    创建一个表,名字是student该表中,有
    stuno学号
    name姓名
    age年龄
    height身高

    + +

    常用数据类型

    数字类型:
    number(p,s)数字

    +

    p为总位数,s为小数点后最多几位

    +

    例如,number(5,3) 可以表示99999 123.32 135.5等

    +

    Integer/int 整数,相当于number(38,0), 可以表示很大的数

    +

    float:小数

    +

    字符类型

    varchar2(p)表示能存储一个字符串, 其最大的长度为p

    +

    char(p)表示能存储一个字符串,固定长度为p,如果长度不够,自动补充空格

    +

    比如: varchar2 (20) 与char(20)同时存放一个字符串’123’:

    +

    varchar2只存放’123’这三个字符

    +

    char会存放’123 (17个空格)’。

    +

    日期类型

    date:存储日期类型,可以精确到秒,通常存储格式是年月日时分秒

    +

    timestamp:和DATE相比,这个可以精确到纳秒,存储时间精度更高

    +

    大对象类型

    CLOB:最大为(4GB-1)*数据库块大小,存储字符数据,主要用于存储大型英文字符

    +

    BLOB:最大为(4GB- 1)*数据库块大小,存储非结构化二进制数据,主要存储图像、声音、视频等文件。

    +

    查看已创建的表

    select table_name from user_tables ;
    + +

    修改表

    1、重命名
    rename student to stu;
    将student表 名改为stu
    2、 重命名列
    alter table表rename column列名to新列名
    alter table stu rename column class to banji;
    将stu表的class 列改为banji
    3、添加一列
    alter tableadd 列名数据类型;
    alter table stu add sex char(1);
    在表stu中添加一列,性别sex,类型为char(1); 1表示字节byte长度1
    4、修改列
    一般修改列时,修改其长度大小
    alter table stu modify sex char(2);
    修改表stu中的sex列,将其长度改为2
    5、删除列
    alter table 表名 drop column 列名;
    alter table stu drop column sex;
    6、删除表
    drop table表名;
    + +

    单双引号

    双引号表明是个关键字

    +

    Oracle 默认大写 如果非要规定 大小写 用双引号

    +
    创建一个带双引号的表
    create table "student2"(
    "stuno" varchar2 (20),
    "school" varchar2 (50)
    );
    查看表的时候也得加上双引号
    desc "student2"
    对表操作的时候也得加上
    + +

    单引号表示的值

    +

    关系

    image-20200317102333059

    +

    实例中包含多个表空间

    +

    用户关联表空间

    +

    表放在表空间中

    +

    用户拥有表 表可能来自不同的表空间

    +
    create table test(id int) tablespace 别的表;
    + + + +

    小结

    ]]>
    + + Oracle系列 + + + 初学者 + 数据库 + +
    + + Oracle系列学习(二) + /2020/03/03/Oracle%E7%B3%BB%E5%88%97%E5%AD%A6%E4%B9%A0-%E4%BA%8C/ + 上一篇的补充 + +

    一些小科普

    +

    服务

    主要常用的两个服务

    +

    OracleServiceORCL:主服务
    Oracle***home1TNSListener TNS监听服务

    +

    TNS(透明网络底层)

    +

    如果没有监听服务,通过NetCA添加

    +

    链接

    本地连接

    sys as sysdba:以管理员身份链接

    +

    scott/tiger:以scott身份链接

    +
    远程连接

    sqlplus sys/123456@//localhost:1521/orcl as sysdba

    +

    或者

    +

    sqlplus sys/orcl123@orcl as sysdba

    +

    tns标识符

    sqlplus sys/orcl123@orcl as sysdba

    +

    D:\app\EShyee\product\11.2.0\dbhome_1\NETWORK\ADMIN有一个tns标识文件

    +

    其中有

    +
    ORCL =
    (DESCRIPTION =
    (ADDRESS = (PROTOCOL = TCP)(HOST = localhost)(PORT = 1521))
    (CONNECT_DATA =
    (SERVER = DEDICATED)
    (SERVICE_NAME = orcl)
    )
    )
    + +

    创建多个数据库

    通过DBCA创建其他的数据库

    +

    当电脑里有多个数据库的时候,用SQL plus去链接 default都是链接ORCL,可以在注册表里改

    +

    链接其他的数据库就用sqlplus sys/orcl123@//localhost: 1521/其他数据库名 as sysdba;

    +

    数据库和数据库实例

    完整的数据库通常由两部分组成:Oracle数据库和数据库实例。

    +

    1)数据库是一系列物理文件的集合(数据文件,控制文件,联机日志,参数文件等) ;
    2) Oracle数据库实例则是一组Oracle后台进程/线程以及在服务器分配的共享内存区。
    在启动Oracle数据库服务器时,实际上是在服务器的内存中创建一个Oracle实例(即在服务器内存中
    分配共享内存并创建相关的后台内存) , 然后由这个Oracle数据库实例来访问和控制磁盘中的数据文
    件。

    +

    数据库监听

    一个重要的数据库服务进程,用来支持外部应用和远程连接数据库。

    +

    关系图示

    ]]>
    + + Oracle系列 + + + 初学者 + 数据库 + +
    + + Oracle系列学习(五) + /2020/03/30/Oracle%E7%B3%BB%E5%88%97%E5%AD%A6%E4%B9%A0-%E4%BA%94/ + 查询

    单表查询

    主要涉及到sq|运算符、单行函数、多行函数、排序、去重

    +

    首先创建一个学生表stu, 包含如下字段:

    +

    学号id、姓名name、年龄age、性别sex、java成绩score、 体重(kg) weight、 星座xz、 生日birth、 寝室room

    +
    create table stu(
    id varchar2(30) primary key,
    name varchar2(30) not null,
    age int,
    sex varchar2(10),
    score number(4,1),
    weight number(4,1),
    xz varchar2(10),
    birth date ,
    room varchar2(10)
    );
    + +

    向表中插入一条学生信息:

    +
    insert into stu values( '17820135', '张三' ,19,'男',81,50'狮子' ,to_date('1999-08-12,'yyyy-mm-dd'),'201');
    + +

    sq|运算符

    Like匹配 通配符**%**

    例如:

    +

    查询所有姓张的学生

    +
    SELECT * FROM STU WHERE NAME LIKE '张%'
    + +

    查找姓名中带有“文”字的学生信息

    +
    SELECT * FROM STU WHERE NAME LIKE '%文%'
    + +

    between… and…

    在两个值之间

    +

    例如:

    +

    查找班级里体重在60~70kg的学生姓名

    +
    SELECT NAME FROM STU WHERE weight BETWEEN 60 AND 70
    --等价于
    select * from stu where weight>F60 and weight<=70;
    + +

    in

    --查询体重是60或体重是70,或体重是80的同学
    --查询体重是60,和体重是70,和体重是80的同学
    --都是
    select * from stu where weight in (60, 70, 80);
    --或者
    select * from stu where weight=60 or weight=70 or weight=80;
    + +

    is null

    值为空,即没有填写值

    +

    例如:
    查找没有填写星座的学生信息

    +
    select * from stu where XZ is null;
    + +

    not

    与其他sq|运算符一起使用, 表示取反:

    +

    not like not between not in is not null

    +

    例如:

    +

    查找所有不姓张的学生信息

    +
    select * from stu where name not like '张%'
    + +

    单行函数

    使用规范: 函数名(参数)根据参数, 获取函数的结果

    +

    to_date

    将字符串转换为日期

    +

    例如: to_ date( ‘2018-09-01’ ,’ yyyy-mm-dd’ )

    +

    表示将2018-09-01这个字符串,转换为日期数据类型

    +

    查询所有1999年出生的学生

    +
    select * from stu where birth between to_date( '1999-01-01' ,'YYYY-MM-DD') and to_date('1999-12-31','YYYY-MM-DD');
    + +

    to_char

    select * from stu where to_char(birth, 'YYYY' )='1999' ;
    select * from stu where to_char(birth, 'YYYY-MM-DD') like '1999%' ;|
    + +

    length

    获取指定字符串值的长度

    +

    例如:

    +

    查找所有姓名是两个字的学生信息

    +
    SELECT * FROM STU WHERE LENGTH(NAME)=2;
    + +

    查询学生的姓名,以及姓名的长度

    +
    SELECT NAME "学生姓名", LENGTH(NAME) "姓名长度" FROM STU ;
    + +

    concat

    拼接两个值,concat(值1,值2)—> 值1值2

    +

    查询学生的学号信息(学号信息是指 学号+姓名)

    +
    select concat(id,name) as 学生信息 from stu;
    + +
    修改stu表,规范星座信息,将所有的星座保存为**座.
    update stu set xz=concat(xz,'座') where length(xz)=2;
    + +

    查询截止到当前时间每个学生都活了多少天、多少个月

    +

    +
    select months_between(sysdate,(BIRTH))As 相差月份 from STU;

    select NAME 姓名,FLOOR(months_between(sysdate,(BIRTH)))As 相差月份 from STU;
    + +

    +
    select TO_NUMBER(sysdate- (BIRTH))As 相差天数 from STU;
    + +

    查询当前日期向后50天是多少天

    +
    select sysdate+50 next_day from dual;
    + +

    查询每个学生名字的最后一个字是什么字

    +
    select substr(NAME,LENGTH(NAME),1) from STU
    + +

    多行函数

    多行/聚合/分组函数,作用在多行记录上,

    +

    avg(字段)字段的平均值

    查询班级java成绩的平均分

    +
    SELECT AVG(SCORE) as java平均分 FROM "STU"
    + +

    查询平均体重

    +
    SELECT avg(WEIGHT) as 平均体重 FROM stu
    + +

    查询班级男同学的平均体重

    +
    SELECT avg(WEIGHT) as 平均体重 FROM stu WHERE SEX='男'
    + +

    sum(字段)字段求和

    查询班级所有学生的体重的和

    +
    SELECT sum(SCORE) FROM stu
    + +

    max(字段)最大值

    查询最高分的学生的成绩

    +
    SELECT max(SCORE) as 最高分数 FROM stu
    + +

    查询最重的学生的体重

    +
    SELECT max(WEIGHT) as 最大体重 FROM stu
    + +

    注意:多行函数,不能出现在where子包含

    +

    例如:查询最重的学生的姓名

    +
    SELECT name as 最大体重学生姓名 FROM stu where WEIGHT=(SELECT max(WEIGHT) FROM stu)
    + +

    min(字段)最小值

    查询最轻的学生的体重

    +
    SELECT min(WEIGHT) as 最大体重 FROM stu
    + +

    查询男同学中,最轻的学生的体重

    +
    SELECT min(WEIGHT) as 男同学最小体重 FROM stu where sex='男'
    + +

    count(*)查询数量

    查询表中有多少条记录

    +
    select COUNT(*) FROM STU
    + +

    查询班里有多少个男生

    +
    select COUNT(*) FROM STU where sex='男'
    + +

    查询班级里60~ 70分之间的学生有多少个

    +
    select COUNT(*) FROM STU WHERE SCORE BETWEEN 60 AND 70
    + +

    排序

    order by字段 desc

    默认从小到大升序,添加desc从大到小降序

    +

    查询所有学生信息,并按照体重从小到大排列

    +
    select *FROM stu ORDER BY WEIGHT
    + +

    查询所有学生信息,按照成绩从大到小排序

    +
    select *FROM stu ORDER BY SCORE DESC
    + +

    去重distinct

    一般distinct都用在select查询字段中

    +

    查询本班级有哪些寝室

    +
    select DISTINCT room FROM stu 
    + +
    +

    分组

    --@1确定按照哪个字段进行分组
    --@2确定用哪个分组函数
    --@3按照语法组建sq1语句
    + +

    查询班级里分别有多少个男生和女生

    +
    SELECT sex,COUNT(*) FROM stu GROUP BY SEX
    + +

    查询男生和女生的平均分都是多少

    +
    SELECT sex,AVG(SCORE) FROM stu GROUP BY SEX
    + +

    查询每个寝室有多少成绩大于80分的同学

    +
    --注意,从语法上where子句要写在group by前,从逻辑上,where 也是在分组前进行条件过滤
    SELECT room,COUNT(*) FROM stu WHERE SCORE>80 GROUP BY ROOM
    + +

    通过查询确认一下是否有同年同月同日生的学生

    +
    select birth,count(*) from stu WHERE BIRTH is not NULL group by birth;
    + +

    查询每个男生寝室有多少成绩大于80分的同学和名字

    +
    select wm_concat(name) , room, count(*) from stu where sex= '男' and score>80 group by room;
    + +

    分组后的筛选

    having

    having子句里添加条件,对group by的结果进行条件筛选

    +

    having写在group by之后,并且逻辑上也是先得到分组结果,再执行筛选

    +

    查询寝室中人数大于5人的那些寝室和人数

    +
    select count(*) from stu group by room having count(*)>5
    + +

    查询班里有没有同年同月同日生

    +

    + +

    查询平均分大于75分的寝室的寝室号和平均分

    +

    + +]]>
    + + Oracle系列 + + + 初学者 + 数据库 + +
    + + Oracle系列学习(四) + /2020/03/26/Oracle%E7%B3%BB%E5%88%97%E5%AD%A6%E4%B9%A0-%E5%9B%9B/ + 增删改查和完整性约束

    建表

    +
    create table student(
    stuno varchar2(20),
    name varchar2(20),
    age int,
    height number(4,1)
    );
    + +

    插入

    insert into表 values值

    +
    insert into student values ('1002','李四',20,180.5);

    insert into student( stuno, name ) values('1003','王五');
    insert into student ( stuno, name,age )values( '1004','王五1',null) ;
    + +

    查询

    select字段from表

    +
    select * from student;
    select name,age from student;
    select name as 姓名 from student;
    select name from student where stuno= '1004 ' ;
    --隐私转换,字符串和数之间,可以自动转换
    select name from student where stuno=1004;
    + +

    修改

    update表set字段=值 [字段=值]

    +
    update student set age=30, height=170;--所有字段的更新
    update student set age=age+5 where name= 'ZHANGSAN';
    --当字段值为null的是后执行类似age=age+5的语句不会对字段值产生影响
    update student set age=age+5;--即age得现有值 才能顺利执行age+5
    + +

    删除

    delete from 表

    +
    delete from student where age=20;
    + +

    where子句

    在查询,修改,删除时可以使用where子句作为条件筛选,表示操作那些符合条件的记录

    +

    提交

    对表的修改必须提交后才生效

    +

    提交指令: commit

    +

    回滚指令: rollback

    +

    表的完整性约束

    当我们向表中添加数据时,如student, 可以会由于数据错误或误操作,表中会产生一些错误数据。而表的完整性约束就是为了解决这个问题。

    +

    如:通过唯一性约束确保学号不能重复;通过非空约束确保姓名不能为空;

    +

    当我们给表中的列设置约束条件后,再向表中插入数据或修改表的数据时,会检查插入或修改的数据是否满足我们的”约束条件”,如果不满足,就不会执行,这样就防止了垃圾数据的产生。

    +

    唯一

    unique
    添加唯一-约束的列, 该列值不能重复。

    +

    添加时机

    1创建表时

    +

    直接在字段后添加约束名

    +
    create table student (
    stuno varchar2(20) unique,
    name varchar2(20) ,
    age int,
    height number(4,1)
    );
    + +

    2建表后再添加

    +

    alter table表名add constraint约束名约束关键字(字段)

    +
    alter table student add constraint uq_ stu_ stuno unique( stuno ) ;
    + +

    唯一约束的列可以有多个空值(NULL)

    +

    非空not null

    该列的值不能为空

    +

    例如:

    +
    --给student表的name字段添加非空约束

    alter table student add constraint nn_stu_name not null(name);
    --修改的时候
    ALTER TABLE "MYB". "STUDENT" MODIFY ("NAME" NOT NULL)
    + +

    检查check

    自定义某- -列的值必须满足某个条件
    例如,

    +
    -- 学生年龄必须在10~40之间
    alter table student add constraint ck_stu_age check(age between 10 and 40);
    + +

    性别只有男和女两个值
    (注意当前student表并无sex字段)

    +
    alter table student add constraint ck_stu_sex check(sex in('男''女'));
    + +

    主键约束与主键列的选择 primary key

    主键列的数据就不能为空,并且不能重复(非空且唯一 )

    +

    一个表最多只能有一个主键(建议创建主键)

    +

    使用主键来唯一标识某条记录

    +
    ALTER TABLE“MYB"."STUDENT" ADD PRIMARY KEY ("STUNO")
    + +

    逻辑主键 和 业务主键

    外键

    除此之外还有外键约束,这个等之后讲到多表关联之后再讲解

    +

    约束的真实项目使用说明

    +

    在真正的企业开发中,除了主键约束这类具有强需求的约束,像唯一约束、外键约束、检查约束等更多时候仅仅出现在数据库设计阶段,真实环境却很少应用,更多是放到程序逻辑中去进行处理。

    +
    +]]>
    + + Oracle系列 + + + 初学者 + 数据库 + +
    + + PL/SQL + /2020/02/25/PLSQL/ + PL/SQL是一种高级数据库程序设计语言,它是ORACLE对标准数据库语言的扩展,是PL (Procedural Language,过程语言)与SQL (Structured Query Language,结构化查询语言)结合而成的编程语言。它支持多种数据类型,如大对象和集合类型,可使用条件和循环等控制结构,可用于创建存储过程、触发器和程序包,还可以处理业务规则、数据库事件或给SQL语句的执行添加程序逻辑。另外,PL/SQL 还支持许多增强的功能,包括集合类型、面向对象的程序设计和异常处理等。

    +

    PL/SQL的特点

    +

    PL/SQL是一种可移植的高性能事务处理语言,支持SQL和面向对象编程,具有良好的性能和高效的处理能力。其特点包括以下几方面。

    +

    (1)支持SQL

    +

    通过使用SQL,用户可以轻松地操纵存储在关系数据库中的数据。PL/SQL中可以使用数据操纵命令、事务控制命令、游标控制命令、SQL函数和SQL运算符,因此可以更加灵活、有效地操纵表中的数据。

    +

    (2)可移植性

    +

    使用PLSQL编写的应用程序可移植到安装在任何操作系统和平台上的Oralce数据库服务器上。

    +

    (3)高性能

    +

    SQL是一种非过程语言,一次只能执行一条语句,在连续的语句之间没有关联。PL/SQL一次可处理整个语句块,减少了在应用程序和Oracle服务器之间进行通信所花费的时间,从而提高了性能。PL/SQL 经过编译执行,过程调用快速而高效。

    +

    (4)与SQL紧密集成

    +

    PL/SQL与SQL紧密集成,支持所有SQL数据类型,支持NULL值,支持%TYPE和%ROWTYPE属性类型,简化数据处理。

    +

    (5)安全性强

    +

    可以通过PLSQL存储过程对客户机和服务器之间的应用程序逻辑进行分隔,阻止客户机应用程序操纵敏感的Oracle数据,仅允许用户通过存储过程操纵数据,限制用户对数据的访问。

    +

    结构

    +
    [DECLARE]
    -- declaration statements声明部分
    BEGIN
    -- executable statements可执行部分
    [EXCEPTION]
    --exception statements异常处理部分
    END

    + +

    用一个完整的PL/SQL块实现查询雇员号为7934的雇员信息。

    +
    Declare
    p_sal number(7,0);
    P_comm number(7,0);
    Begin
    select sal,comm into P_sal,p_comm from emp where empno=7934;
    Exception
    When no_data_found Then
    Dbms_output.put_line('员工号不存在');
    End;
    + +

    声明常量或变量

    +
    <变量常量名>[CONSTANT]<数据类型>[NOT NULL][:=IDEFAULT<初始值>];
    --例如:
    total constant number: =100;
    v_name varchar2 (10) ;
    + +

    ①变量名和常量名必须以字母AZ开头,不区分大小写,其后面可跟-一个或多个字母、数字(09)、特殊字符($、#或_ ),长度不能超过30个字符,变量名和常量名中不能有空格。

    +

    ②CONSTANT是声明常量的关键字,只在声明常量时使用。

    +

    ③每一个变量或常量都有一个特定的数据类型。

    +

    ④每个变量或常量声明占- -行, 行尾使用分号结束。

    +

    ⑤常量必须在声明时赋值。变量在声明时可以不赋值,如果变量在声明时没有赋初值,那么PL/SQL语言自动为其赋值NULL。若在变量声明中使用了NOT NULL, 则表示该变量是非空变量,即必须在声明时给该变量赋初值,否则会出现编译错误。在PLSQL程序中,变量值是可以改变的,而常量的值不能改变。变量的作用域是从声明开始到PL/SQL程序块结束。

    +
    --①%TYPE:引用变量和数据库列的数据类型。例如:
    empcode emp.empno%TYPE;
    --该语句声明了变量empcode,其数据类型与表emp中的empno列数据类型相同。
    --②%ROWTYPE:表示表、视图或游标的完整一行的记录类型。 例如:
    emp_ex emp%ROWTYPE;
    --该语句声明了变量emp ex,它可以用于存储从emp中提取的记录。

    + +

    编写 PL/SQL程序,使用%TYPE和%ROWTYPE声明变量,用于查
    询雇员号及雇员信息。

    +
    SQL>set serverout on
    declare
    empcode emp.empno%type;
    emp_ex emp%ROWTYPE;
    begin
    select empno into empcode from emp where ename= 'SMITH';
    select * into emp_ex from emp where ename ='ALLEN';
    dbms_output.put_line('员工SMITH的雇员号为: '||empcode);
    dbms_output.put_line('员工ALLEN的雇员信息为:'||'雇员号'||emp_ex.empno||' '||'工作职位'||emp_ex.job||'薪水'||emp_ex.sal);
    end;
    + +

    记录类型

    +

    PL/SQL记录是由- -组相关的记录成员组成的,记录通常用来表示对应数据库表中的一行。使用PL/SQL 记录时应自定义记录类型和记录变量,也可以使用%ROWTYPE属性定义记录变量。引用记录成员时,必须要以记录变量作为前缀。

    +
    TYPE <记录类型名> IS RECORD (
    <数据项1> <数据类型>[NOTNULL[:= <表达式1>]],
    <数据项2> <数据类型>[NOTNULL[:=<表达式2>]],
    ......
    <数据项n> <数据类型>[NOTNULL[:=<表达式n>]]) ;
    <记录变量名> <记录类型名> ;
    + +

    将雇员信息定义为记录类型。

    +
    declare
    type emp_record_type is record
    (v_ename emp.ename%type,
    v_job emp.job%type,
    v_sal emp.sal%type);
    emp_rec emp_record_type;
    begin
    select ename,job,sal into emp_rec
    from emp where empno=&eno;
    dbms_output.put_line(emp_rec.v_ename||':'||
    emp_rec.v_job||': '||emp_rec.v_sal);
    end;
    + +

    PL/SQL表

    +

    PL/SQL表是一种比较复杂的数据结构,与数据库中的表是有区别的。数据库表是一种二维表,是以数据库表的形式存储。这里的表是一种复合数据类型,是保存在数据缓冲区中的没有特别存储次序、可以离散存储的数据结构,它可以是-维的,也可以是二维的。当使用PLSQL表时,首先必须在声明部分定义该类型和变量,然后在执行部分引用该变量。

    +
    TYPE <表类型名> IS TABLE OF <数据类型> INDEX BY BINARY_INTEGER;
    <表变量名><表类型名>;
    + +

    索引表类型的定义。

    +
    DECLARE
    TYPE ename_table_type IS TABLE OF emp.ename%TYPE
    INDEX BY BINARY_INTEGER;
    Ename_table ename_table_type;
    BEGIN
    SELECT ename INTO ename_table(1) FROM emp
    WHERE empno= 7902;
    Dbms_output.put_line('员工名:'|| ename_table(1));
    END;
    + +

    数组

    +

    数组也是一种复合类型,和表类似,与表不同的是声明了-一个数组,就确定了数组中元素的数目。同时,数组存储时,其元素的次序是固定且连续的,而且索引变量从1开始一直到其定义的最大值为止。

    +
    TYPE <数组类型名> IS VARRAY (<MAX_SIZE>) OF <数据类型>;
    <表变量名><表类型名> ;
    + +

    NULL

    +
    NULL;
    + +

    赋值

    +
    <variable>:= <expression> ;
    + +

    对变量赋值的两种方法。

    +
    declare
    v_job varchar2(10);
    v_sal number;
    begin
    v_job:='CLERK';
    select max(sal) into v_sal from emp where job=v_job;
    dbms_output.put_line(v_sal);
    end;
    + +

    IF…THEN

    +

    F…THEN..ELSE

    +

    F..THEN..ELSIF

    +

    通过IF条件控制语句为不同部门的员工增加工资

    +
    DECLARE
    v_deptno emp.deptno%type;
    v_empno emp.empno%type;
    v_sal number(6,2);
    BEGIN
    v_empno:=&no;
    SELECT deptno,sal INTO v_deptno,v_sal FROM emp WHERE empno= v_empno;
    IF v_deptno =10 THEN
    UPDATE emp SET sal=v_sal+100 WHERE empno=v_empno;
    ELSIF v_deptno =20 THEN
    UPDATE emp SET sal=v_sal+200 WHERE empno=v_empno;
    ELSIF v_deptno =30 THEN
    UPDATE emp SET sal=v_sal+300 WHERE empno=v_empno;
    ELSE
    UPDATE emp SET sal=v_sal+400 WHERE empno=v_empno;
    END IF;
    END;
    + +

    CASE

    +

    带选择器按值比较的CASE语句

    +
    CASE选择器
    WHEN表达式1THEN执行语句1;
    WHEN表达式2 THEN执行语句2;
    ...
    WHEN表达式N THEN 执行语句N;
    ELSE执行语句N+1;
    END CASE;
    + +

    通过CASE条件控制语句为不同部门的员工增加工资。

    +
    DECLARE
    v_deptno emp.deptno%type;
    v_empno emp.empno%type;
    v_sal number(6,2);
    BEGIN
    v_empno:= &no;
    SELECT deptno,sal INTO v_deptno,v_sal FROM emp WHERE empno= v_empno;
    CASE v_deptno
    When 10 THEN
    UPDATE emp SET sal=v_sal+ 100 WHERE empno= v_empno;
    When 20 THEN
    UPDATE emp SET sal=v_sal+300 WHERE empno= v_empno;
    When 30 THEN
    UPDATE emp SET sal=v_sal+300 WHERE empno= v_empno;
    When 40 THEN
    UPDATE emp SET sal=v_sal+300 WHERE empno= v_empno;
    ELSE
    Dbms_output.put_line('不存在该部门!');
    END CASE;
    END;
    + +

    不带选择器按条件比较的CASE语句

    +
    CASE
    WHEN条件表达式1 THEN执行语句l;
    WHEN条件表达式2 THEN执行语句2;
    WHEN条件表达式N THEN执行语句N;
    [ELSE执行语句N+1;]
    END CASE;
    + +

    LOOP

    +
    LOOP
    statements;
    ...
    EXIT [WHEN condition];
    END LOOP;
    + +

    使用LOOP循环依次输出1~5的立方数。

    +
    DECLARE
    i number:=1;
    BEGIN
    LOOP
    Dbms_output.put_line(i ||'的立方为'|| i*i*i);
    i:=i+1;
    EXIT WHEN i>5;
    END LOOP;
    END;
    + +

    while

    +
    WHILE condition LOOP
    Statementl;
    Statement2;
    ...
    END LOOP;
    + +

    使用WHILE循环依次输出1~5的立方数。

    +
    DECLARE
    i number:=1;
    BEGIN
    WHILE i<=5 LOOP
    Dbms_output.put_line(i||'的立方为'|| i*i*i);
    i:=i+1;
    END LOOP;
    END;
    + +

    FOR

    +
    FOR counter IN [REVERSE] start_rang...end_range LOOP
    statements;
    END LOOP;
    + +

    使用FOR循环依次输出1~5的立方数。

    +
    DECLARE
    i number:=1;
    BEGIN
    FOR i in 1..5 LOOP
    Dbms_output.put_line(i ||'的立方为'|| i*i*i);
    END LOOP;
    END;
    + + + +]]>
    + + Oracle系列 + + + 数据库 + Oracle + PL/SQL + +
    + + PSTN和以太网互连实验 + /2020/03/05/PSTN%E5%92%8C%E4%BB%A5%E5%A4%AA%E7%BD%91%E4%BA%92%E8%BF%9E%E5%AE%9E%E9%AA%8C/ + PSTN和以太网互连实验

    实验内容

    +

    1、构建互连网,由路由器实现以太网和PSTN互连

    +

    2、通过路由器实现终端A和终端B之间相互通信的过程

    +

    image-20200403083419597

    +

    实验目的

    +

    1、验证路由器接口配置过程

    +

    2、验证路由器自动生成直连路由项的过程

    +

    3.验证连接在以太网.上的两个结点之间的IP分组传输过程

    +

    4、验证连接在PSTN上的两个结点之间的IP分组传输过程

    +

    5、验证IP分组经过不同类型传输网络传输时,封装成该传输网络对应的帧格式的过程

    +

    6、验证两个连接在不同类型网络上的终端之间的IP分组传输过程

    +

    7、验证路由器实现以太网和PSTN互连的过程

    +

    实验原理

    +

    1.路由器接口模块和IP地址配置

    +
      +
    • 两个不同类型接口模块:以太网接口和PSTN网接口
    • +
    • 两个接口分别配置两个不同网络号的IP地址
    • +
    +

    2、路由器端口与所连接的网络终端属于同一网络,配置相同网络号IP地址

    +

    3、路由器接口IP地址成为连接在同一网络上的终端的默认网关地址

    +

    4、配置完路由器接口IP地址和子网掩码,路由器自动生成直连路由项

    +

    5,根据路由表实现终端A与终端B之间的通信过程

    +

    关键命令说明

    +

    1.路由器接口配置命令

    +
    +

    Router(config)# interface FastEthernet0/0

    +

    全局模式下使用,进入路由器接口FastEthernet0/0的接口配置模式,其中FastEthernet表明是快速以太网接口, 0/0是接口编号。

    +

    Router(config-if)# ip address 192.1.1.254 255.255.255.0

    +

    接口配置模式下使用,为路由器接口FastEthernet0/0分配IP地址192.1.1.254和子网掩码255.255.255.0

    +
    +

    关键命令说明

    +

    2.定义授权用户

    +

    ➢授权用户:允许对路由器进行某种指定操作的远程用户

    +

    ➢身份鉴别:当远程用户对路由器进行指定操作时,路由器需要对远程用户进行身份鉴别:需要提供定义授权用户时指定的用户名和口令。

    +

    ➢定义授权用户命令

    +

    Router(config)#username aaa password bbb

    +

    全局模式下定义了-个用户名为aaa口令为bbb的授权用户。

    +

    静态路由项配置实验

    实验内容

    +

    1、构建网络,路由器实现不同类型网络互连

    +
      +
    • 单独的以太网、单独的无线局域网
    • +
    • 由AP实现互连的以太网和无线局域网
    • +
    +

    image-20200403084542715

    +

    2、配置静态路由项

    +

    通过配置静态路由项指出通

    +

    往非直连网络的传输路径

    +

    实验目的

    +

    1、验证路由器无线局域网接口的配置过程

    +

    2、验证AP和路由器之间的区别

    +

    3.验证静态路由项配置过程

    +

    4、验证路由器重新封装IP分组的过程

    +

    5、验证建立IP分组传输路径的过程

    +

    实验原理
    1、AP和路由器工作原理

    +

    AP互连的以太网和无线局域网构成扩展服务集,分配相同的网络地址

    +

    路由器不同接口连接不同的网络,分配不同的网络地址

    +

    2、直连路由项生成原理

    +
      +
    • 指出通往直连网络的传输路径
    • +
    • 配置接口IP地址和子网掩码后自动生成
    • +
    +

    3、静态路由项生成原理

    +
      +
    • 指出通往非直连网络的传输路径
    • +
    • 需要手工配置每一项静态路由项
    • +
    +

    关键命令

    +

    1.无线局域网安全机制配置命令

    +

    ➢Router(config)#dot11 ssid 123456

    +

    定义一个SSID=123456的无线局域网,井进入该无线局域网配置模式,即SSID配置模式

    +

    ➢Router(config-ssid)#authentication open

    +

    终端与该无线局域网建立关联时使用:开放系统鉴别机制

    +

    ➢Router(onfigssid)#no authentication network-eap

    +

    无线局域网在确定终端是否是授权终端时,不使用EAP鉴别机制

    +

    ➢Router(config-ssid)# authentication key-management wpa

    +

    指定WPA作为该无线局域网的鉴别和密钥管理机制

    +

    ➢Router(config-ssid)#wpa-psk ascii 1234567890

    +

    指定ASCII码形式的字符串1234567890为预共享密钥wpa-psk

    +

    ➢Router(configssid)#guest mode

    +

    指定无线局域网支持guest模式。guest模式下:

    +
      +
    • 一是信标帧中包含该无线局域网的SSID ;
    • +
    • 二是如果该无线局域网接收到用通配符作为SSID的探测请求帧,发送探测响应帧中包含该SSID.
    • +
    +

    2.无线接口配置命令

    +

    ➢Router(config)#interface Dot11Radio0/3/0

    +

    进入路由器接口Dot11Radio0/3/0的接口配置模式,包含信息:

    +

    一是接口类型Dot11Radio ,表明该接口是无线局域网接口

    +

    二是接口编号为0/3/0

    +

    ➢Router(config-if)#no shutdown

    +

    开启该接口

    +

    ➢Router(config-if)#ip address 192.1.2.254 255.255.255.0

    +

    为路由器接口分配IP地址192.1.2.254和子网掩码255.255.255.0

    +

    ➢Router(config-if)#ssid 123456

    +

    配置SSID为123456

    +

    ➢Router(configif)#encryption mode ciphers aes-ccm

    +

    命令的作用是指定密码体制aes-ccm

    +

    RIPv1配置实验

    ]]>
    + + 计算机网络 + + + 双绞线 + 直通线 + 交叉线 + +
    + + Queue + /2020/04/11/Queue/ + 队列(Queue)是只允许在一端进行插入,在另一端删除的线性表。

    +

    队列的实现

    +
    typedef struct {	//定义队列中元素最大个数
    int data[MaxSize]; //用静态数组存放队列元素
    int front, rear; //队头指针和队尾指针
    } SqQueue;

    void testQuene(){
    SqQuene Q;
    }
    //初始化队列
    void InitQueue(SqQueue &Q) {
    //初始时队头.队尾指针指向0
    Q.rear=Q.front=0;
    }
    //判断队列是否为空
    bool QueueEmpty (SqQueue Q){
    if(Q.rear==Q.front) //队空条件
    return true ;
    else
    return false;
    }
    //入队操作--只能从队尾插入

    #define MaxSize 10
    //定义队列中元素的最大个数
    typedef struct{
    ElemType data [MaxSize];
    //用静态数组存放队列元素
    int front, rear;
    //队头指针和队尾指针
    } SqQueue;

    //入队
    bool EnQueue(SqQueue &Q, ElemType x){
    if((Q.rear+1)%MaxSize==Q.front)
    return false; //队满则报错
    Q.data [Q.rear]=x;
    //将x插入队尾
    Q.rear=(Q.rear+1)%MaxSize;//区域运算形成循环队列
    //队尾指针后移
    return true ;
    }

    //出队(删除一个队头元素,并用x返回)
    bool DeQueue(SqQueue &Q, ElemType &x){
    if(Q.rear==Q.front)
    //判断队空
    return false; //队空则报错
    x=Q.data [Q.front];
    Q.front=(Q.front+1 )%MaxSize;
    return true;
    }

    + +

    队列已满的条件:队尾指针
    的再下一个位置是队头,即
    (Q.rear+ 1)%MaxSize==Q.front

    +

    队空条件:
    Q.rear= =Q.front

    +

    不浪费最后一个存储区域的做法,设置一个int队列长度,或者设置一个tag,当删除操作的时候tag=1,插入的时候为0,当rear==front&&tag==1时为空。

    +]]>
    + + 计算机 + + + 数据结构 + 队列 + +
    + + Radio Frequency Excited Plasma Discharge Simulation for Potential Helicon Plasma Thruster + /2023/08/28/Radio-Frequency-Excited-Plasma-Discharge-Simulation-for-Potential-Helicon-Plasma-Thruster/ + Abstract

    先进推进装置的发展是实施强有力的太空探索计划的关键要素。先进的推进器概念,例如开发具有高密度螺旋等离子体源的无电极等离子体推进器,有望缓解电力推进固有的有限寿命的现有问题。无电极等离子推进器可能比使用栅格离子、霍尔推进器、电弧喷射器和电阻喷射器等电极的传统推进器更耐用。该研究的目标是模拟紧凑型高功率密度螺旋等离子体源的运行,目前正在检查其潜在的电力推进应用。等离子体建模在 COMSOL Multiphysics 等离子体模块中执行。 Nagoya III 型天线放置在介电管周围并以 13.56 MHz 电激励。等离子体在含有低压氩气的电离室中形成。利用电磁感应来维持等离子体。

    +

    1. Introduction

    电力推进能够实现高比冲,并且控制推力水平的能力使其成为空间推进应用中传统化学推进器的合适替代品。最近的改进将使电动推进器能够用作未来航天器的主要推进系统。具有多种太空加油能力的可变比冲推进器将允许成功的小行星重定向任务。

    +

    电力推进将电能从外部电源施加到推进剂上。电动推进器分为两大类:使用电力加热推进剂(以中性气体形式出现),以及使用电场或磁场加速离子。自太空时代开始以来,化学火箭因其高推力质量比而占据主导地位。然而,化学火箭的寿命有限。

    +

    电力推进具有多种基于利用电力加速流动的机制的推进器。不同空间推进器的特征比冲范围如表1所示。目前,空间应用中采用的是电热式、静电式或电磁式推进器。电热推进器的工作原理是利用电将推进剂加热至高温,通过喷嘴产生加速产生驱动力。推进剂流体的热能转化为动能。静电推进器利用静电场通过加速带电等离子体来产生推力。电磁场可以是外部产生的,也可以是自感产生的。

    +

    表 1. 已部署和实验的电动推进器的比冲量、推力效率和推力。

    +

    +

    到目前为止,所有运行的电动推进器都使用无电极来电离推进剂,以加速离子和电子。电离输入功率的增加会导致腐蚀,主要是通过溅射降低此类设备的使用寿命。为了解决这个问题,开发了无电极推进器,这种推进器使用电或磁体力来电离气体以产生具有定向速度的推进剂流。在无电极等离子推进器的开发中,Helicon 等离子源在各种情况下都有用处。它们可以产生高密度 ~ 1013cm−3 螺旋等离子体,具有广泛的操作参数范围。螺旋等离子体产生的实验和理论方法及其加速方案已被描述和表征。

    +

    2.Helicon等离子推进器

    为了实现电力推进系统的长寿命,我们一直在研究利用螺旋等离子体源的各种无电极电力推进概念。目前,多个研究小组正在致力于螺旋等离子体推进器(HPT)的开发。该研究的重点是永磁体的实现、优化磁体以满足所需的磁通量、工作功率范围、天线优化。

    +

    麻省理工学院的迷你螺旋实验 (mHTX)、欧空局的螺旋等离子体联氨组合微型 (HPHCOM) 和澳大利亚国立大学的螺旋双层推进器 (HDLT) 是潜在的 HPT 原型。这些不同技术演示原型的推进器性能如表 2 所示并如下所述。

    +

    HPHCOM 原型机的标称功率为 700 W,磁场强度为 200 G,称为 S-helicon 的新型谐振天线在 13.25 MHz 频率下运行,天线的管理功率优化至低于 100 W 的极低范围。提出了永磁体不同排列方式,磁场强度范围400-1100 G。

    +

    HDTL 使用磁场强度为 100-200 G 的电磁体,工作范围为 200-800 W。射频天线的工作频率为 13.25 MHz。实验结果检测到使用氩推进剂时的稳态电流、预期推力高达 6 mN 和比冲 800 S。

    +

    迷你螺旋推进器实验(mHTX)投射了具有单磁体配置的准直等离子体羽流,这对于电力推进应用具有潜力。不同的测量技术证明,微型螺旋在原子Ar和分子N2上产生真实的推力。与 HDTL 相比,其高度电离的推进剂的燃料利用率高达 90%。采用单磁体配置,气体沿着介电石英管流动,天线包围着它。标称工作功率范围为 700-1000 W。

    +

    天线工作频率为13.25 MHz。 mHTX 的实验结果显示,比冲为 2000 S,效率为 12%,推力高达 20 mN。使用不同的控制方式改变等离子束速度使得螺旋最适合可变比冲。

    +

    表 2.HPT 主要原型:推进性能总结。

    +

    +

    可变比冲磁等离子火箭(VASIMR)是一种混合推进器。目前,Ad Astra Rocket Co.正在开发中。它并不完全被视为螺旋等离子体推进器,但它使用螺旋等离子体源来产生等离子体。离子回旋共振为等离子体提供能量并通过磁性喷嘴加速,相反,产生推力。标称工作功率200kW,推力效率达到近50%,可产生3N的推力。射频工作功率估计约为 30 kW。需要>1T的相当大的磁场,这只能通过超导磁体来实现。热行为也是一个重要问题。高温影响磁体的最佳运行,解释了不同轨道的太阳辐射效应。

    +

    3. Helicon 推进器的工作原理

    Helicon 等离子体推进器原型的特征在于推进器运行时的射频功率范围和磁场强度。该设计包含了广泛的控制变量;电离室长度 L、质量流量 m、射频功率 PRF、磁场强度 B、射频频率。决定推进器性能的主要设计参数是电离室尺寸、输入质量流量、输入射频功率和频率。天线形状和位置、磁场强度。这些设计参数以微不足道的方式相互作用,并影响推进器中的整个过程,从电离到内部等离子体损失和外部膨胀。

    +

    3.1.电离室

    从中性气体到等离子体的有效电离发生在电离室中。中性气体推进剂沿介电石英管流动;射频天线产生电磁波传播并激发电子,使气体电离。在电离过程中,低于 5-7 eV 的低电子温度下的主要损失机制是激发、去激发或永久亚稳态。

    +

    为了实现有效的电离,需要高电子温度(>10 eV)和小于腔室长度λion<<L的平均自由程。腔室的尺寸必须符合要求,以便电磁波模式可以在其中传播。

    +

    电子拉莫尔半径需要小于石英管半径 le<<R,以获得更好的电子磁化,从而减少壁上的等离子体损失。介电石英管具有高耐热性,并且当电子和离子到达管壁并不断沉积能量并且管暴露于恒定的热通量时热膨胀低。等离子体约束需要强磁场。磁铁、天线和管子的最佳位置是推进器高效运行所必需的。

    +

    3.2.射频天线

    螺旋天线向等离子体产生电磁波分解功率。螺旋波被称为哨声波,一种低频波,其中 ω 低于等离子体频率 ωp,介于较低混合频率和电子回旋频率 ωc 之间,螺旋放电具有高电离效率。使用较低的射频功率 1-2 kW 可以实现相对完全电离的等离子体 η ≥ 1014 cm−3。施加到天线的电流和波可以被等离子体反射,部分辐射到自由空间并被等离子体重新吸收。天线作为无功功率。高等离子体电阻和功率因数是天线优化设计的关键因素。

    +

    3.3.超导磁体

    磁场发生器是Helicon等离子体推进器的重要组成部分。螺旋等离子体推进器设计主要采用磁场存在下的射频等离子体放电。用于产生必要磁场的电磁体的优化设计是决定推进器性能和效率的关键因素之一。磁场允许电磁波穿过等离子体传播,减少等离子体对壁的损失,并为超音速等离子体膨胀创建磁性喷嘴。

    +

    4. 运作制度

    HPT推进器的流程示意图如图1所示。

    +

    +

    图 1. 迷你螺旋推进器操作示意图。

    +

    4.1.设计限制

    用于模拟的等离子体推进器的标称值如表3所示。

    +

    表 3. 等离子推进器原型的标称值。

    +

    +

    5. 仿真 COMSOL Multiphysics

    螺旋等离子体推进器设计主要采用磁场存在下的射频等离子体放电。使用跨平台 FEA 多物理软件 COMSOL Multiphysics 进行射频等离子体放电。等离子体模块模拟低温等离子体源、系统和放电。射频模块用于模拟天线电磁波传播,AC/DC模块用于模拟磁场配置。模拟过程描述如下。

    +

    5.1.二维几何

    仿真过程中使用的推进器的二维横截面如图2所示。

    +

    +

    图 2. 迷你螺旋推进器仿真二维草图

    +

    5.2.模拟步骤

    5.2.1.等离子模块:

    COMSOL 求解电子密度和能量密度的漂移扩散方程。 COMSOL 等离子体仿真的数学模型在数学建模部分进行了解释。

    +

    5.2.2.磁场:

    超导磁体配置由围绕电离室的螺线管线圈组成,根据所需的磁场强度选择。螺线管线圈相应地放置,因此限制了与射频天线的相互作用。

    +

    5.2.3.电磁波导:

    用于模拟的名古屋 III 型天线。天线放置在介电石英管的外部。天线长度为 100 毫米,专为氩等离子体而设计。射频天线发射频率为13.56 MHz,标称功率约为1000 W。

    +

    5.3.数学建模

    COMSOL Multiphysics 频率瞬态研究中使用的数学模型如下所述。

    +

    波加热等离子体放电大多具有较高的数密度。通过求解漂移扩散方程计算电子密度和平均电子密度。电子数密度:

    +

    (1)

    +

    (2)

    +

    ne 表示电子密度,(1/m3),Re 是电子速率表达式 (1/(m3·s)), 是电子迁移率,(m2/(V·s)),E 是电场 (V/m), De 是电子扩散率。

    +

    (3)

    +

    电子能量密度:

    +

    (4)

    +

    (5)

    +

    Rɛ是非弹性碰撞引起的能量损失/增加 (V/m3·s),με 是电子能量迁移率 (m2/V·s),E是电场 (V/m), 是电子能量扩散率(平方米/秒)。

    +

    (6)

    +

    计算静电场,

    +

    (7)

    +

    高频电场在频域中计算,

    +

    (8)

    +

    当等离子体电流密度和电场比较复杂时,

    +

    (9)

    +

    电磁波与磁场之间的等离子体耦合。是等离子体电导率张量,是电子密度碰撞频率和磁通量的函数。

    +

    (10)

    +

    其中,q= 电子电荷,me= 电子质量,ne= 碰撞频率,ω 是电磁场的角频率。

    +

    5.4.截面数据 氩 (Ar)

    等离子体由三种离子、电子以及大部分中性的原子和分子组成。电子和离子的密度只占中性原子和分子的一小部分,但地基等离子体核聚变除外,它是完全电离的。工业和商业应用中使用的等离子体不一定完全电离。由于中性原子和分子的高密度,它们之间以及电子和离子之间的碰撞变得显着。碰撞过程的中心参数是横截面。电子与气体粒子或离子碰撞,可能发生多种反应。电子可以使气体电离,赋予其动量,可以激发分子和离子周围电子的能级,并且可以与离子重新结合等等。在所有这些随机过程中,电子都会失去能量。中性气体 Ar 的横截面数据如表 4 所示,横截面表示电子发生碰撞时可用的面积。横截面数据允许使用电子能量分布函数 (EEDF) 计算特定反应的速率系数。

    +

    表 4. 氩气碰撞和反应建模。

    +

    +

    6 结果与讨论

    COMSOL 求解电子密度和能量密度的漂移扩散方程。图 3 显示了沿中间横截面朝向电离室长度方向的电子密度分布。

    +

    +

    图 3. 沿电离室长度的电子能量密度分布。

    +

    等离子体柱内电子密度最大,约为1.8×1012cm−3。采用Nagoya III型螺旋天线,置于电离室中部环抱石英管内。射频驱动等离子体发动机的关键因素在于天线,它将初始中性气体的中性流激发成具有高电离密度的磁化等离子体。等离子体放电在天线附近开始,并向电离室的中心位置扩展。

    +

    +

    图 4. 沿电离室长度的电子温度分布。

    +

    电子温度分布如图4所示。最高电子温度达到2.25 eV。在磁场存在下,电子被磁化并通过回旋与中性原子碰撞。在此过程中,电子因原子碰撞而失去能量,并失去达到更高等离子体温度的能力。电子势分布如图5所示。

    +

    +

    图 5. 沿电离室长度的电子势分布。

    +

    命名法

    +
      +
    • λion 离子平均自由程
    • +
    • ω RF 射频
    • +
    • B 磁通密度矢量
    • +
    • E 电场矢量
    • +
    • EM 电磁波
    • +
    • PRF 射频功率
    • +
    • HPT 螺旋等离子体推进器
    • +
    • L 电离室长度
    • +
    +

    该研究的重点是永磁体的实现、优化磁体以满足所需的磁通量、工作功率范围、天线优化。

    +]]>
    + + 文献 + + + 文献 + +
    + + Redis + /2020/04/11/Redis/ + Redis

    Nosql

    not only sql 泛指非关系型数据库

    +

    Nosql的四大分类

    KV键值对

    +

    redis

    +

    文档型数据库(boson格式)

    +
      +
    • MongoDB
      MongoDB是一个基于分布式文件存储的数据库,C++编写,主要用来处理大量的文档!

      +

      MongoDB是一个介于关系型数据库和非关系型数据中间的产品

      +
    • +
    • conchDB

      +
    • +
    +

    列存储数据库

    +

    HBase

    +

    分布式文件系统

    +

    图关系型数据库

    +

    NEO4J

    +

    redis

    用途

    1、内存存储、持久化,内存中是断电即失、所以说持久化很重要( rdb、aof )

    +

    2、效率高,可以用于高速缓存

    +

    3、发布订阅系统

    +

    4、地图信息分析

    +

    5、计时器、计数器(浏览量)

    +

    安装

    Windows

    下包 安装 运行

    +

    Linux

    1、官网下载压缩包

    +

    2、解压安装包

    +

    tar -zxvf redis-6.0.10.tar.gz

    +

    image-20210116132318923

    +

    基本文件结构如下

    +

    image-20210116132421492

    +

    安装gcc:yum install gcc-c++

    +

    在当前路径下make

    +

    完成后再make检查一下

    +
    [root@Shyee redis-6.0.10]# make
    cd src && make all
    make[1]: Entering directory '/usr/local/redis-6.0.10/src'
    CC Makefile.dep

    Hint: It's a good idea to run 'make test' ;)

    make[1]: Leaving directory '/usr/local/redis-6.0.10/src'
    [root@Shyee redis-6.0.10]# make install
    cd src && make install
    make[1]: Entering directory '/usr/local/redis-6.0.10/src'

    Hint: It's a good idea to run 'make test' ;)

    INSTALL install
    INSTALL install
    INSTALL install
    INSTALL install
    INSTALL install
    make[1]: Leaving directory '/usr/local/redis-6.0.10/src'
    [root@Shyee redis-6.0.10]#
    + +

    redis的默认安装路径

    user/local/bin

    +

    简单的配置

    将redis文件夹下的redis.configcopy到local/bin中的rconfig文件夹(自行创建)中

    +

    设置后台启动

    修改config文件中的 daemonize no,改为yes

    +

    启动

    user/local/bin下,redis-server rconfig/redis.conf

    +
    [root@Shyee bin]# redis-server rconfig/redis.conf 
    [root@Shyee bin]# redis-cli -p 6379/6235
    127.0.0.1:6379> ping
    PONG
    127.0.0.1:6379> set name Shyee
    OK
    127.0.0.1:6379> get name
    "Shyee"
    127.0.0.1:6379> keys *
    1) "name"
    127.0.0.1:6379>
    + +

    如果启动不成功,则在刚刚make之后在去src中make install 一下

    +

    关闭

    127.0.0.1:6379> SHUTDOWN
    not connected> exit
    + +

    查看redis服务是否启动

    [root@Shyee ~]# ps -ef|grep redis
    root 216409 1 0 15:49 ? 00:00:00 redis-server 127.0.0.1:6379
    root 216414 216382 0 15:49 pts/1 00:00:00 redis-cli -p 6379
    root 216443 216421 0 15:50 pts/2 00:00:00 grep --color=auto redis
    + +

    benchmark 测试

    redis 性能测试工具可选参数如下所示:

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    序号选项描述默认值
    1-h指定服务器主机名127.0.0.1
    2-p指定服务器端口6379
    3-s指定服务器 socket
    4-c指定并发连接数50
    5-n指定请求数10000
    6-d以字节的形式指定 SET/GET 值的数据大小2
    7-k1=keep alive 0=reconnect1
    8-rSET/GET/INCR 使用随机 key, SADD 使用随机值
    9-P通过管道传输 请求1
    10-q强制退出 redis。仅显示 query/sec 值
    11–csv以 CSV 格式输出
    12-l生成循环,永久执行测试
    13-t仅运行以逗号分隔的测试命令列表。
    14-IIdle 模式。仅打开 N 个 idle 连接并等待。
    +

    测试100个并发链接 100000个请求

    +
    redis-benchmark -h localhost -p 6379 -c 100 -n 100000
    + +

    部分分析

    +

    image-20210221163231907

    +

    基础知识

    redis 默认有16个数据库

    +
    127.0.0.1:6379> SELECT 3 --选择第三个数据库
    OK
    127.0.0.1:6379[3]> DBSIZE --查看数据库大小
    (integer) 0
    + +

    set一个kv后

    +
    127.0.0.1:6379[3]> SET name Shyee
    OK
    127.0.0.1:6379[3]> DBSIZE
    (integer) 1
    + +

    查看所有的key

    +
    127.0.0.1:6379[3]> KEYS *
    1) "name"
    + +

    清空当前库

    +
    127.0.0.1:6379[3]> FLUSHDB
    OK
    127.0.0.1:6379[3]> KEYS *
    (empty array)
    + +

    清空全部数据库

    +
    flushall
    + +

    redis 是单线程的

    基于内存操作的 redis 的瓶颈是机器内存及网络带宽。

    +

    redis是c语言写的

    +

    redis 将所有的数据放在内存中的,所以使用单线程操作时效率最高的。对于内存,没有上下文切换,效率是最高的,多次读写实在一个cpu上的。

    +

    redis 的基本数据类型

    基本命令

    127.0.0.1:6379> set name Shyee 
    OK
    127.0.0.1:6379> SET age 12
    OK
    127.0.0.1:6379> EXISTS name #查看是否存在关键字
    (integer) 1
    127.0.0.1:6379> EXPIRE name 10 #设置过期时间
    (integer) 1
    127.0.0.1:6379> ttl name #查看当前k的剩余时间
    (integer) 6
    127.0.0.1:6379> ttl name
    (integer) 4
    127.0.0.1:6379> ttl name
    (integer) 2
    127.0.0.1:6379> ttl name
    (integer) 0
    127.0.0.1:6379> ttl name #-2代表已经过期
    (integer) -2
    127.0.0.1:6379> get name
    (nil)
    127.0.0.1:6379> move name 1 #将该关键字转移到1号库
    (integer) 1
    127.0.0.1:6379> type name #查看当前k的类型
    string
    127.0.0.1:6379> TYPE age
    string
    + +

    String(字符串)

    127.0.0.1:6379> APPEND name " Hello" #字符串的拼接,如果当前key不存在,就相当于set
    (integer) 11
    127.0.0.1:6379> GET name
    "Shyee Hello"
    127.0.0.1:6379> STRLEN name #查看当前字符串的长度
    (integer) 11

    #设计自增减
    127.0.0.1:6379> set views 0
    OK
    127.0.0.1:6379> GET views
    "0"
    127.0.0.1:6379> INCR views #自增
    (integer) 1
    127.0.0.1:6379> GET views
    "1"
    127.0.0.1:6379> DECR views #自减
    (integer) 0
    127.0.0.1:6379> GET views
    "0"
    127.0.0.1:6379> INCRBY views 10 #设置步长的增减
    (integer) 10
    127.0.0.1:6379> DECRBY views 8
    (integer) 2
    127.0.0.1:6379> GET views
    "2"
    #截取
    127.0.0.1:6379> get name
    "Shyee Hello"
    127.0.0.1:6379> GETRANGE name 2 5 #截取2~5
    "yee "
    127.0.0.1:6379> GETRANGE name 0 -1 #查看全部
    "Shyee Hello"
    #setrange
    127.0.0.1:6379> set k1 abcdefg
    OK
    127.0.0.1:6379> SETRANGE k1 2 ggg #修改第二个以后的三个字符
    (integer) 7
    127.0.0.1:6379> GET k1
    "abgggfg"

    #setex(set with expire) 设置过期时间
    #setnx(set if not exist) 不存在设置
    127.0.0.1:6379> SETEX k2 5 "只有5秒"
    OK
    127.0.0.1:6379> ttl k2
    (integer) 3
    127.0.0.1:6379> SETNX k2 "ifexist"
    (integer) 1
    127.0.0.1:6379> SETNX k2 "ife"
    (integer) 0 #SET 失败,因为存在了
    #一下设置很多值
    127.0.0.1:6379> mset k1 v1 k2 v2 k3 v3 k4 v4
    OK
    127.0.0.1:6379> KEYS *
    1) "k4"
    2) "k3"
    3) "k2"
    4) "k1"
    #一下拿很多值
    127.0.0.1:6379> MGET k1 k2 k3 k4
    1) "v1"
    2) "v2"
    3) "v3"
    4) "v4"
    127.0.0.1:6379> MSETNX k1 vv1 k5 v5
    (integer) 0 #mset是原子性的操作,要么一起成功,要么一起失败
    #对象的批量set
    127.0.0.1:6379> MSET user:1:name Shyee user:1:age 13 user:3:name XY
    OK
    127.0.0.1:6379> MGET user:3:name user:1:name user:1:age
    1) "XY"
    2) "Shyee"
    3) "13"
    #取值并设置值
    127.0.0.1:6379> getset name XY #如果不存在 则返回nil
    (nil)
    127.0.0.1:6379> GETSET name Shyee
    "XY"
    127.0.0.1:6379> GET name
    "Shyee"
    + +

    List

    redis中的list是双向链表

    +
    127.0.0.1:6379> lpush list1 abcd
    (integer) 1
    127.0.0.1:6379> rpush list1 aaa
    (integer) 2
    127.0.0.1:6379> get list1
    (error) WRONGTYPE Operation against a key holding the wrong kind of value
    #不能直接使用get来取list中的值
    127.0.0.1:6379> lrange list1 0 5
    1) "abcd"
    2) "aaa"
    127.0.0.1:6379> lpush list1 a b c d e
    (integer) 7
    127.0.0.1:6379> lrange list1 0 -1
    1) "e"
    2) "d"
    3) "c"
    4) "b"
    5) "a"
    6) "abcd"
    7) "aaa"
    127.0.0.1:6379> rrange 0 -1
    (error) ERR unknown command `rrange`, with args beginning with: `0`, `-1`,
    127.0.0.1:6379> rpop list1 2
    1) "aaa"
    2) "abcd"
    127.0.0.1:6379> lrange list1 0 -1
    1) "e"
    2) "d"
    3) "c"
    4) "b"
    5) "a"
    127.0.0.1:6379> rpush o p q r s t
    (integer) 5
    127.0.0.1:6379> lrange list1 0 -1
    1) "e"
    2) "d"
    3) "c"
    4) "b"
    5) "a"
    127.0.0.1:6379> rpush list1 o p q r s t
    (integer) 11
    127.0.0.1:6379> lrange list1 0 -1
    1) "e"
    2) "d"
    3) "c"
    4) "b"
    5) "a"
    6) "o"
    7) "p"
    8) "q"
    9) "r"
    10) "s"
    11) "t"
    127.0.0.1:6379> lpop list1 5
    1) "e"
    2) "d"
    3) "c"
    4) "b"
    5) "a"
    127.0.0.1:6379> lrange list1 0 -1
    1) "o"
    2) "p"
    3) "q"
    4) "r"
    5) "s"
    6) "t"
    #pop到最后没值了,键就不存在了
    + +

    rpoplpush :从key1 的右边pop一个值放到key2的左边

    +
    127.0.0.1:6379> lrange list1 0 -1
    1) "o"
    2) "p"
    3) "q"
    4) "r"
    5) "s"
    6) "t"
    127.0.0.1:6379> lpush list2 a
    (integer) 1
    127.0.0.1:6379> lrange list2 0 -1
    1) "a"
    127.0.0.1:6379> rpush list2 b c d
    (integer) 4
    127.0.0.1:6379> lrange list2 0 -1
    1) "a"
    2) "b"
    3) "c"
    4) "d"
    127.0.0.1:6379> rpoplpush list1 list2
    "t"
    127.0.0.1:6379> lrange list2 0 -1
    1) "t"
    2) "a"
    3) "b"
    4) "c"
    5) "d"
    127.0.0.1:6379> lrange list1 0 -1
    1) "o"
    2) "p"
    3) "q"
    4) "r"
    5) "s"
    + +

    取指定下标元素

    +
    127.0.0.1:6379> lindex list1 4
    "s"
    + +

    获取list长度

    +
    127.0.0.1:6379> llen list1
    (integer) 5
    + +

    linsert

    +
    127.0.0.1:6379> linsert list1 before "p" ddd
    (integer) 6
    127.0.0.1:6379> lrange list1 0 -1
    1) "o"
    2) "ddd"
    3) "p"
    4) "q"
    5) "r"
    6) "s"
    127.0.0.1:6379> linsert list1 after "p" aaa
    (integer) 7
    127.0.0.1:6379> lrange list1 0 -1
    1) "o"
    2) "ddd"
    3) "p"
    4) "aaa"
    5) "q"
    6) "r"
    7) "s"
    + +

    lrem key n value

    +

    从左边删除n个value

    +
    127.0.0.1:6379> lrem list1 2 "aaa"
    (integer) 1
    127.0.0.1:6379> lrange list1 0 -1
    1) "o"
    2) "ddd"
    3) "p"
    4) "q"
    5) "r"
    6) "s"
    + +

    lset 替换

    +
    127.0.0.1:6379> lset list1 4 qwerewr
    OK
    127.0.0.1:6379> lrange list1 0 -1
    1) "o"
    2) "ddd"
    3) "p"
    4) "q"
    5) "qwerewr"
    6) "s"
    + +

    list 的数据结构

    list的数据结构是quicklist

    +

    当列表中元素较少的时候会使用一块连续的存储空间,这个结构是ziplist,压缩列表

    +

    当数据量比较多的时候才会使用quicklist ,是一种双向链表

    +

    且redis 将ziplist组合起来组成quicklist

    +]]>
    + + 数据库 + + + 数据库 + redis + 非关系型 + +
    + + Spring - MyBatis + /2021/02/24/Spring%20-%20MyBatis/ + 思路:

    SqlSessionFactory -> SqlSession ->StudentMapper ->CRUD
    可以发现,MyBatis最终是通过SqlSessionFactory来操作数据库,
    Spring整合MyBatis其实就是将MyBatis的SqlSessionFactory交给Spring

    +

    SM整合步骤:

    +
      +
    1. jar
      mybatis-spring. jar
      spring- tx. jar
      spring- jdbc. jar
      spring- -expression. jar
      spr ing- context- support. jar
      spring- -core. jar
      spring- -context. jar
      spr ing- -beans. jar
      spring- aop. jar
      spring- web. jar
      commons- logging. jar
    2. +
    +

    commons-dbcp. jar

    +

    ojdbc. jar

    +

    mybatis. jar

    +

    log4j. jar

    +

    commons - pool. jar

    +

    2.类-表

    +

    3.MyBatis配置文件conf. xml

    +

    4.通过mapper. xml将类、表建立映射关系

    +

    5.之前使mybatis:用conf.xml ->SqlSessionFacotry

    +

    现在整合的时候,需要通过Spring管理SqlSessionFacotry,因此产生sqlSessionFacotry 所需要的数据库信息不在放入conf.xml而需要放入spring配置文件中

    +

    配置Spring配置文件(applicationContext. xml )

    +

    6.使用Spring-MyBatis整合产物开发程序

    +

    目标:通过spring产 生mybatis最终操作需要的动态mapper对 象(StudentMapper对象)

    +

    Spring产生动态mapper对象有三种方法:
    a. DAO层实现类继承SqlSessionDaoSupport类

    +

    SqlSessionDaoSupport类提供了一个 属性SqlSession

    +

    项目结构

    ![image-20220128223004647](D:\bloglocal\Spring - MyBatis.assets\image-20220128223004647.png)

    +

    applicationContext.xml

    <?xml version="1.0" encoding="UTF-8"?>
    <beans xmlns="http://www.springframework.org/schema/beans"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">

    <!-- 加载db.properties -->
    <bean id="config"
    class="org.springframework.beans.factory.config.PreferencesPlaceholderConfigurer">
    <property name="locations">
    <array>
    <value>classpath:db.properties</value>
    </array>
    </property>
    </bean>

    <bean id="dataSource"
    class="org.apache.commons.dbcp2.BasicDataSource">
    <property name="url" value="${url}"></property>
    <property name="username" value="${username}"></property>
    <property name="password" value="${password}"></property>
    <property name="driverClassName" value="${driver}"></property>
    <property name="maxIdle" value="${maxIdle}"></property>
    </bean>

    <!-- 在Spring中整合SqlSession -->
    <bean id="sqlSessionFactoryBean"
    class="org.mybatis.spring.SqlSessionFactoryBean">
    <property name="dataSource" ref="dataSource"></property>
    <!-- 加载mybatis配置文件 -->
    <!-- <property name="configLocation" value="classpath:conf.xml"></property> -->
    <!-- 加载映射文件路径 -->
    <property name="mapperLocations"
    value="club/shyee/mapper/*.xml"></property>
    </bean>

    <!-- 注入 --><!-- 第一种方式实现 -->
    <!-- <bean id="userDao" class="club.shyee.dao.impl.UserDaoImpl"> 需要将sqlsessionfactory配到Dao里
    <property name="sqlSessionFactory" ref="sqlSessionFactoryBean"></property>
    </bean> -->
    <!-- 第二种方式,直接使用mybatis提供的mapper实现类 -->
    <!-- <bean id="userDao"
    class="org.mybatis.spring.mapper.MapperFactoryBean">
    <property name="mapperInterface"
    value="club.shyee.dao.IUserDao"></property>
    <property name="sqlSessionFactory"
    ref="sqlSessionFactoryBean"></property>
    </bean> -->
    <!-- 第三种方式,批量产生Mapper 批量产生的Mapper在SpringIOC中的id值默认是接口名(首字母小写)-->
    <bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">
    <property name="sqlSessionFactoryBeanName"
    value="sqlSessionFactoryBean"></property>
    <!-- 指定批量产生哪个包 -->
    <property name="basePackage" value="club.shyee.mapper,club.shyee.dao"></property>
    </bean>

    <bean id="userService"
    class="club.shyee.service.impl.UserServiceImpl">
    <property name="userMapper" ref="userMapper"></property>
    </bean>
    </beans>
    + +

    采用第三种方式,不走Dao层,人家直接写好了。

    +

    而且不用conf.xml,因为直接加载到IOC中了

    +

    db.properties

    +
    driver=com.mysql.cj.jdbc.Driver
    url=url
    username=user
    password=password
    maxIdle=1000
    + + + +

    entity

    package club.shyee.entity;

    public class User {
    private int uId;
    private String uName;
    private String uPass;
    private String phone;
    private String email;
    public int getuId() {
    return uId;
    }
    public void setuId(int uId) {
    this.uId = uId;
    }
    public String getuName() {
    return uName;
    }
    public void setuName(String uName) {
    this.uName = uName;
    }
    public String getuPass() {
    return uPass;
    }
    public void setuPass(String uPass) {
    this.uPass = uPass;
    }


    public String getPhone() {
    return phone;
    }
    public void setPhone(String phone) {
    this.phone = phone;
    }
    public String getEmail() {
    return email;
    }
    public void setEmail(String email) {
    this.email = email;
    }


    @Override
    public String toString() {
    return "User [uId=" + uId + ", uName=" + uName + ", uPass=" + uPass + ", phone=" + phone + ", email=" + email + "]";
    }
    public User(int uId, String uName, String uPass, String phone, String email) {
    super();
    this.uId = uId;
    this.uName = uName;
    this.uPass = uPass;
    this.phone = phone;
    this.email = email;
    }
    public User() {
    super();
    }
    }

    + +

    mapper

    UserMapper.java

    +
    package club.shyee.mapper;

    import club.shyee.entity.User;

    public interface UserMapper {
    public void queryUserById(int uId);
    public void addUser(User user);
    }
    + +

    userMapper.xml

    +
    <?xml version="1.0" encoding="UTF-8" ?>
    <!DOCTYPE mapper
    PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
    "http://mybatis.org/dtd/mybatis-3-mapper.dtd">


    <mapper namespace="club.shyee.mapper.UserMapper">

    <select id="queryUserById" parameterType="int"
    resultType="club.shyee.entity.User">
    select * from user where uId=${uId}
    </select>

    <insert id="addUser" parameterType="club.shyee.entity.User">

    insert into user(uName,uPass,phone,email) values(#{uName},#{uPass},#{phone},#{email})
    </insert>
    </mapper>
    + +

    service

    接口

    +
    package club.shyee.service;

    import club.shyee.entity.User;

    public interface IUserService {
    public void addUser(User user);
    }
    + +

    实现类

    +

    set方法必要

    +
    package club.shyee.service.impl;

    import club.shyee.entity.User;
    import club.shyee.mapper.UserMapper;
    import club.shyee.service.IUserService;

    public class UserServiceImpl implements IUserService {
    private UserMapper userMapper;


    public UserMapper getUserMapper() {
    return userMapper;
    }


    public void setUserMapper(UserMapper userMapper) {
    this.userMapper = userMapper;
    }


    @Override
    public void addUser(User user) {
    System.out.println("Service 实现类中的User"+user);
    userMapper.addUser(user);
    }
    }
    + +

    测试

    写一个测试

    +
    package club.shyee.test;

    import org.springframework.context.ApplicationContext;
    import org.springframework.context.support.ClassPathXmlApplicationContext;

    import club.shyee.entity.User;
    import club.shyee.service.IUserService;

    public class Test1 {

    public static void main(String[] args) {
    System.out.println("测试");
    test1();
    }
    public static void test1() {
    ApplicationContext context=new ClassPathXmlApplicationContext("classpath:applicationContext.xml");
    IUserService userService =(IUserService)context.getBean("userService");
    User user=new User(1,"老刘","12596874","14523654254","ttt@qq.com");
    userService.addUser(user);
    }
    }
    + +

    我放了两个打印,一个在service层一个在Dao层,会发现,application Context会自动写好了Dao的过程,所以不会打印出dao层的数据。即不用设计dao层。

    +]]>
    + + Spring + + + Spring + MyBatis + +
    + + SSM + /2021/02/24/SSM%E6%95%B4%E5%90%88/ + 创建一个web项目

    添加JAR

    +

    commons-dbcp2-2.9.0.jar
    commons-logging-1.2.jar
    commons-pool2-2.11.1.jar
    log4j-1.2.17.jar
    log4j-1.2.17-javadoc.jar
    mybatis-3.5.8.jar
    mybatis-spring-2.0.6.jar
    mysql-connector-java-8.0.27.jar
    spring-aop-5.3.14.jar
    spring-beans-5.3.14.jar
    spring-context-5.3.14.jar
    spring-context-support-5.3.14.jar
    spring-core-5.3.14.jar
    spring-expression-5.3.14.jar
    spring-jdbc-5.3.14.jar
    spring-tx-5.3.14.jar
    spring-web-5.3.14.jar

    +

    创建相关User表

    +

    Mybatis的Conf.xml可以不配置,全部交给Spring去管理

    +

    在src中创建applicationContext.xml

    +

    创建mapper,并写一个userMapper.xml

    +

    web.xml中引入applicationContext.xml

    +
    <!-- web项目中引入Spring -->
    <!-- needed for ContextLoaderListener -->
    <context-param>
    <param-name>contextConfigLocation</param-name>
    <param-value>classpath:applicationContext.xml</param-value>
    </context-param>

    <!-- Bootstraps the root web application context before servlet initialization -->
    <listener>
    <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
    </listener>
    + +

    整合SM

    整合SS

    加入jar

    +

    spring-webmvc-5.3.14.jar

    +

    配置web.xml

    +

    <!-- 整合SpringMVC -->
    <!-- The front controller of this Spring Web application, responsible for handling all application requests -->
    <servlet>
    <servlet-name>springDispatcherServlet</servlet-name>
    <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
    <init-param>
    <param-name>contextConfigLocation</param-name>
    <param-value>classpath:applicationContext-controller.xml</param-value>
    </init-param>
    <load-on-startup>1</load-on-startup>
    </servlet>

    <!-- Map all requests to the DispatcherServlet for handling -->
    <servlet-mapping>
    <servlet-name>springDispatcherServlet</servlet-name>
    <url-pattern>/</url-pattern>
    </servlet-mapping>
    + +

    编写SpringMVC配置文件

    +

    applicationContext-controller.xml

    +
    <!-- 配置视图解析器 -->
    <bean
    class="org.springframework.web.servlet.view.InternalResourceViewResolver">
    <property name="prefix" value="/views/"></property>
    <property name="suffix" value=".jsp"></property>
    </bean>
    <!-- 配置注解驱动 -->
    <mvc:annotation-driven></mvc:annotation-driven>
    + +]]>
    + + Spring + + + Spring + MVC + SSM + +
    + + Spring web 开发 + /2021/02/24/Spring%20web%20%E5%BC%80%E5%8F%91/ + 至少需要7个jar

    +

    image-20210123154134146

    +

    新建一个动态web项目

    +

    配置web.xml

    +
    <?xml version="1.0" encoding="UTF-8"?>
    <web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xmlns="http://xmlns.jcp.org/xml/ns/javaee"
    xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd"
    id="WebApp_ID" version="4.0">
    <display-name>SpringWeb1</display-name>
    <welcome-file-list>
    <welcome-file>index.html</welcome-file>
    <welcome-file>index.htm</welcome-file>
    <welcome-file>index.jsp</welcome-file>
    <welcome-file>default.html</welcome-file>
    <welcome-file>default.htm</welcome-file>
    <welcome-file>default.jsp</welcome-file>
    </welcome-file-list>
    <context-param>
    <!-- 指定IOC容器的位置 -->
    <param-name>contextConfigLocation</param-name>
    <param-value>classpath:applicationContext.xml</param-value>
    </context-param>
    <listener>
    <!-- 配置Spring-web.jar提供的监听器,此监听器可以在服务器启动时,初始化IOC容器 初始化IOC容器,必须告诉此容器的位置:contextparam -->
    <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
    </listener>
    </web-app>
    + +

    新建一个applicationContext

    +

    启动tomcat

    +

    信息: Loading XML bean definitions from class path resource [applicationContext.xml]

    +

    加载多个XML

    +
    <context-param>
    <!-- 指定IOC容器的位置 -->
    <param-name>contextConfigLocation</param-name>
    <param-value>
    classpath:applicationContext.xml,
    classpath:applicationContext-*.xml
    </param-value>
    <!-- 加载多个applicationContext -->
    </context-param>
    + +

    或者

    +

    在主配置文件中

    +

    <import resource="applicationContext-Controller.xml"/>

    +
    <?xml version="1.0" encoding="UTF-8"?>
    <beans xmlns="http://www.springframework.org/schema/beans"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">
    <import resource="applicationContext-Controller.xml"/>
    </beans>
    + +]]>
    + + Spring + + + Spring + +
    + + Spring 入门 + /2021/01/18/Spring%20%E5%85%A5%E9%97%A8/ + Spring 入门

    简单工厂

    实例:学生学习课程

    +

    创建课程工厂、课程接口

    +
    package top.eshyee.newinstance;
    //课程接口
    public interface ICourse {

    public void learn() ;
    }
    + +
    package top.eshyee.newinstance;

    public class JavaCourse implements ICourse{
    @Override
    public void learn() {
    System.out.println("java课程");
    }
    }
    + +
    package top.eshyee.newinstance;

    public class HtmlCourse implements ICourse{

    @Override
    public void learn() {
    System.out.println("html课程");
    }
    }
    + +

    课程工厂

    +
    package top.shyee.factory;
    import top.eshyee.newinstance.HtmlCourse;
    import top.eshyee.newinstance.ICourse;
    import top.eshyee.newinstance.JavaCourse;

    public class CourseFactory {
    public static ICourse getCourse(String name) {
    return name.equals("java") ? new JavaCourse() : name.equals("html")?new HtmlCourse():null;
    }
    }

    + +

    学生类

    +
    package top.eshyee.entity;

    import top.eshyee.newinstance.HtmlCourse;
    import top.eshyee.newinstance.ICourse;
    import top.eshyee.newinstance.JavaCourse;
    import top.shyee.factory.CourseFactory;

    public class Student {
    private int stuNo;
    private String stuName;
    private int stuAge;

    public int getStuNo() {
    return stuNo;
    }

    public void setStuNo(int stuNo) {
    this.stuNo = stuNo;
    }

    public String getStuName() {
    return stuName;
    }

    public void setStuName(String stuName) {
    this.stuName = stuName;
    }

    public int getStuAge() {
    return stuAge;
    }

    public void setStuAge(int stuAge) {
    this.stuAge = stuAge;
    }

    @Override
    public String toString() {
    return "Student [stuNo=" + stuNo + ", stuName=" + stuName + ", stuAge=" + stuAge + "]";
    }

    // 学生学习课程
    public void learn(String name) {
    ICourse course1=CourseFactory.getCourse(name);
    course1.learn();
    }
    }
    + +

    测试

    +

    public class Test1 {
    public static void main(String[] args) {
    StudentlearnwithFactory();
    }

    +
    public class Test1 {
    public static void main(String[] args) {
    StudentlearnwithFactory();
    }
    public static void StudentlearnwithFactory() {
    Student student = new Student();
    student.learn("java");
    }}
    +

    测试结果:java课程

    +

    IOC

    超级工厂,可以放各种对象。控制反转,也成为DI(依赖注入)

    +

    使用IOC实现以上操作

    +

    配置XML–添加三个bean

    +
    <bean id="student" class="top.eshyee.entity.Student">
    <property name="stuNo" value="1"></property>
    <property name="stuAge" value="2"></property>
    <property name="stuName" value="genge"></property>
    </bean>
    <bean id="JavaCourse" class="top.eshyee.newinstance.JavaCourse"></bean>
    <bean id="HtmlCourse" class="top.eshyee.newinstance.HtmlCourse"></bean>
    + +

    重写学生的learn方法

    +
    public void learn(String name) {
    ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml");
    ICourse course =(ICourse)context.getBean(name);
    course.learn();
    }
    + +

    写个测试方法

    +
    public static void StudentlearnwithIOC() {
    ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml");
    Student student = (Student) context.getBean("student");
    student.learn("JavaCourse");
    }
    + +

    运行结果:java课程

    +

    依赖注入(DI)

    set注入

    property

    +

    创建teacher和course类

    +
    package top.eshyee.entity;

    public class Teacher {
    private String name;
    private int age;
    public String getName() {
    return name;
    }
    public void setName(String name) {
    this.name = name;
    }
    public int getAge() {
    return age;
    }
    public void setAge(int age) {
    this.age = age;
    }
    @Override
    public String toString() {
    return "Teacher [name=" + name + ", age=" + age + "]";
    }
    }
    + +
    package top.eshyee.entity;

    public class Course {
    private String courseName;
    private int courseHour;
    private Teacher teacher;//依赖于teacher
    public String getCourseName() {
    return courseName;
    }
    public void setCourseName(String courseName) {
    this.courseName = courseName;
    }
    public int getCourseHour() {
    return courseHour;
    }
    public void setCourseHour(int courseHour) {
    this.courseHour = courseHour;
    }
    public Teacher getTeacher() {
    return teacher;
    }
    public void setTeacher(Teacher teacher) {
    this.teacher = teacher;
    }
    @Override
    public String toString() {
    return "Course [courseName=" + courseName + ", courseHour=" + courseHour + ", teacher=" + teacher + "]";
    }
    }
    + +

    加入到IOC中

    +
    <bean id="teacher" class="top.eshyee.entity.Teacher">
    <property name="name" value="Shyee"></property>
    <property name="age" value="12"></property>
    </bean>
    <bean id="course" class="top.eshyee.entity.Course">
    <property name="courseName" value="JAVA"></property>
    <property name="courseHour" value="13"></property>
    <property name="teacher" ref="teacher"></property>
    </bean>
    + +

    写一个测试类

    +
    public static void testDI() {
    ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml");
    Teacher teacher = (Teacher) context.getBean("teacher");
    Course course = (Course) context.getBean("course");
    System.out.println(course);
    }
    + +

    运行结果:Course [courseName=JAVA, courseHour=13, teacher=Teacher [name=Shyee, age=12]]

    +

    赋值默认是set方法

    +

    构造方法注入

    constructor

    +

    修改xml

    +
    <bean id="teacher" class="top.eshyee.entity.Teacher">
    <!-- index 指定参数位置
    <constructor-arg value="Shyeee" index="0"></constructor-arg>
    <constructor-arg value="15" index="1"></constructor-arg> -->
    <!-- name指定参数
    <constructor-arg value="Shyeee" name="name"></constructor-arg>
    <constructor-arg value="15" name="age"></constructor-arg> -->
    <!-- 指定类型
    <constructor-arg value="Shyeee" type="String"></constructor-arg>
    <constructor-arg value="15" type="int"></constructor-arg>-->
    <!-- 默认 -->
    <constructor-arg value="Shyeee" ></constructor-arg>
    <constructor-arg value="15" ></constructor-arg>
    </bean>
    <bean id="course" class="top.eshyee.entity.Course">
    <constructor-arg value="PYTHON"></constructor-arg>
    <constructor-arg value="15"></constructor-arg>
    <constructor-arg ref="teacher"></constructor-arg>
    </bean>
    + +

    加入构造方法

    +

    Course

    +
    public Course(String courseName, int courseHour, Teacher teacher) {
    super();
    this.courseName = courseName;
    this.courseHour = courseHour;
    this.teacher = teacher;
    }
    public Course() {
    super();
    }
    + +

    Teacher

    +
    public Teacher(String name, int age) {
    super();
    this.name = name;
    this.age = age;
    }
    public Teacher() {
    super();
    }

    + +

    运行结果:Course [courseName=PYTHON, courseHour=15, teacher=Teacher [name=Shyeee, age=15]]

    +

    P命名空间

    xmlns:p="http://www.springframework.org/schema/p"

    +
    <?xml version="1.0" encoding="UTF-8"?>
    <beans xmlns="http://www.springframework.org/schema/beans"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xmlns:p="http://www.springframework.org/schema/p"
    xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">
    <bean id="teacher" class="top.eshyee.entity.Teacher" p:name="Shyeeee" p:age="14"></bean>
    <bean id="course" class="top.eshyee.entity.Course" p:courseName="ORACLE" p:courseHour="1" p:teacher-ref="teacher">
    </bean></beans>
    + +

    运行结果:Course [courseName=ORACLE, courseHour=1, teacher=Teacher [name=Shyeeee, age=14]]

    +

    各种类型的注入

    Arrays&List&Map&Properties&Set

    创建包含各种类型的类

    +
    package top.eshyee.entity;

    import java.util.Arrays;
    import java.util.List;
    import java.util.Map;
    import java.util.Properties;
    import java.util.Set;

    public class AllcollectionType {
    private List<String> list;
    private String[] array;
    private Set<String> set;
    private Map<String, String> map;
    private Properties properties;
    public List<String> getList() {
    return list;
    }
    public void setList(List<String> list) {
    this.list = list;
    }
    public String[] getArray() {
    return array;
    }
    public void setArray(String[] array) {
    this.array = array;
    }
    public Set<String> getSet() {
    return set;
    }
    public void setSet(Set<String> set) {
    this.set = set;
    }
    public Map<String, String> getMap() {
    return map;
    }
    public void setMap(Map<String, String> map) {
    this.map = map;
    }
    public Properties getProperties() {
    return properties;
    }
    public void setProperties(Properties properties) {
    this.properties = properties;
    }
    @Override
    public String toString() {
    String ss="";
    for(String s:array) {
    ss=ss+s+",";
    }
    ss="["+ss+"]";
    return "AllcollectionType [list=" + list + "\n array=" + ss + "\n set=" + set + "\n map=" + map
    + "\n properties=" + properties + "]";
    }
    }
    + +

    注入

    +
    <bean id="collectionType"
    class="top.eshyee.entity.AllcollectionType">
    <property name="array">
    <array>
    <value>I</value>
    <value>A</value>
    <value>M</value>
    </array>
    </property>
    <property name="list">
    <list>
    <value>S</value>
    <value>H</value>
    <value>Y</value>
    <value>E</value>
    <value>E</value>
    </list>
    </property>
    <property name="map">
    <map>
    <entry>
    <key>
    <value>NI</value>
    </key>
    <value>ni</value>
    </entry>
    <entry>
    <key>
    <value>C</value>
    </key>
    <value>c</value>
    </entry>
    <entry>
    <key>
    <value>E</value>
    </key>
    <value>e</value>
    </entry>
    </map>
    </property>
    <property name="properties">
    <props>
    <prop key="TO">to</prop>
    <prop key="ME">me</prop>
    <prop key="ET">et</prop>
    </props>
    </property>
    <property name="set">
    <set>
    <value>Y</value>
    <value>O</value>
    <value>U</value>
    </set>
    </property>
    </bean>
    + +

    set和array都可以用list标签,相反也可,但是建议用相应标签

    +

    测试

    +
    public static void testcollectionType() {
    ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml");
    AllcollectionType a = (AllcollectionType) context.getBean("collectionType");
    System.out.println(a);
    }
    + +

    运行结果

    +

    AllcollectionType [list=[S, H, Y, E, E]
    array=[I,A,M,]
    set=[Y, O, U]
    map={NI=ni, C=c, E=e}
    properties={ME=me, TO=to, ET=et}]

    +

    null和空字符串

    <bean id="student1" class="top.eshyee.entity.Student">
    <!-- 赋空值 -->
    <property name="stuNo">
    <!-- null -->
    <null />
    </property>
    <!-- 空字符串"" -->
    <property name="stuName">
    <value></value>
    </property>
    </bean>
    + +

    自动装配

    autowire="byName"会自动找一个id为teacher 的bean,只有对象之间的依赖关系可以自动装配

    +
    <bean id="teacher" class="top.eshyee.entity.Teacher">
    <property name="name" value="Shyee"></property>
    <property name="age" value="12"></property>
    </bean>
    <bean id="course" class="top.eshyee.entity.Course"
    autowire="byName">
    <property name="courseName" value="JAVA"></property>
    <property name="courseHour" value="13"></property>
    </bean>
    + +

    运行结果:Course [courseName=JAVA, courseHour=13, teacher=Teacher [name=Shyee, age=12]]

    +

    autowire="byType"按类型自动装配,寻找一个teacher类型的bean,但是有两个teacher会报错。

    +

    expected single matching bean but found 2: teacher1,teacher2

    +

    autowire="constructor"适用于构造方法中有多个依赖

    +

    添加全局的autowire–default-autowire="byName"

    +
    <beans xmlns="http://www.springframework.org/schema/beans"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xmlns:p="http://www.springframework.org/schema/p"
    xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd"
    default-autowire="byName"
    >
    + +

    注解

    配置扫描器

    +
    <?xml version="1.0" encoding="UTF-8"?>
    <beans xmlns="http://www.springframework.org/schema/beans"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xmlns:p="http://www.springframework.org/schema/p"
    default-autowire="byName"
    xmlns:context="http://www.springframework.org/schema/context"
    xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
    http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.3.xsd">
    <!-- 配置扫描器 -->
    <context:component-scan base-package="top.eshyee.dao"></context:component-scan></beans>
    + +

    用注解声明一个bean

    +

    相当于在xml中的<bean id="stuentDao" class="top.eshyee.dao.StuentDaoImpl"></bean>

    +
    package top.eshyee.dao;
    import org.springframework.stereotype.Component;
    import top.eshyee.entity.Student;
    @Component("StuentDao")
    public class StuentDaoImpl {
    public void addStudent(Student student) {
    // TODO Auto-generated method stub
    System.out.println("增加学生");
    }
    }
    + +

    dao层注解:@Repository

    +

    service层注解:@Service

    +

    控制器层注解:@Controller

    +

    使用注解实现事务

    需要使用到spring-tx-4.3.9.RELEASE.jarojdbc.jarcommons-dbcp.jarcommons-pool.jarspring-jdbc-4.3.9.RELEASE.jaraopalliance.jar

    +

    配置xml

    +
    <!-- 配置数据库相关-事务 -->
    <bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource">
    <property name="driverClassName" value="oracle.jdbc.driver"></property>
    <property name="url" value="127.0.0.1:1521:ORCL"></property>
    <property name="username" value="SCOTT"></property>
    <property name="password" value="tiger"></property>
    <property name="maxActive" value="10"></property>
    <property name="maxIdle" value="6"></property>
    </bean>
    <!-- 配置事务管理器-txmanager -->
    <bean id="txManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
    <property name="dataSource" ref="dataSource"></property>
    </bean>
    <!-- 增加对事务的支持 -->
    <tx:annotation-driven transaction-manager="txManager"/>
    + +

    创建DAO层及实现类

    +
    package top.eshyee.dao;

    import top.eshyee.entity.Student;

    public interface IStudentDao {
    public void addStudent(Student student);
    }
    + + + +
    package top.eshyee.dao.impl;
    import org.springframework.stereotype.Repository;

    import top.eshyee.dao.IStudentDao;
    import top.eshyee.entity.Student;
    //相当于<bean id="stuentDao" class="top.eshyee.dao.StuentDaoImpl"></bean>
    @Repository("StuentDao")
    public class StudentDaoImpl implements IStudentDao{
    public void addStudent(Student student) {
    // TODO Auto-generated method stub
    System.out.println("增加学生");
    }
    }
    + +

    创建service层及实现类

    +
    package top.eshyee.service;

    import top.eshyee.entity.Student;

    public interface IStudentService {
    void addStudent(Student student);
    }
    + +
    package top.eshyee.service.impl;
    import org.springframework.transaction.annotation.Propagation;
    import org.springframework.transaction.annotation.Transactional;
    import top.eshyee.dao.IStudentDao;
    import top.eshyee.entity.Student;
    import top.eshyee.service.IStudentService;

    public class StudentServiceImpl implements IStudentService {
    IStudentDao studentDao ;

    @Transactional(readOnly = false ,propagation = Propagation.REQUIRED)
    @Override
    public void addStudent(Student student) {
    studentDao.addStudent(student);
    }
    public IStudentDao getStudentDao() {
    return studentDao;
    }
    public void setStudentDao(IStudentDao studentDao) {
    this.studentDao = studentDao;
    }
    }
    + +

    注入到IOC

    +
    <bean id="studentDao" class="top.eshyee.dao.impl.StudentDaoImpl"></bean>
    <bean id="studentService"
    class="top.eshyee.service.impl.StudentServiceImpl">
    <property name="studentDao" ref="studentDao"></property>
    </bean>
    + +

    AOP

    面向方面编程

    +

    前置通知

    每当执行add之前自动执行的方法

    +

    准备jar

    +

    aopalliance.jaraspectjweaver-1.5.3.jar

    +

    编写前置通知

    +
    package top.eshyee.aop;
    import java.lang.reflect.Method;
    import org.springframework.aop.MethodBeforeAdvice;
    public class LogBefore implements MethodBeforeAdvice{
    @Override
    public void before(Method method, Object[] args, Object target) throws Throwable {
    // TODO Auto-generated method stub
    System.out.println("前置通知");
    }
    }
    + +

    配置前置通知

    +
    <!-- 配置前置通知 -->
    <bean id="logBefore" class="top.eshyee.aop.LogBefore"></bean>

    <!-- 将addstudent方法与通知进行关联 -->
    <aop:config>
    <aop:pointcut expression="execution(public void top.eshyee.service.impl.StudentServiceImpl.addStudent(top.eshyee.entity.Student))" id="pointcut"/>
    <aop:advisor advice-ref="logBefore" pointcut-ref="pointcut"/>
    </aop:config>
    + +

    测试

    +
    public static void testAOP() {
    ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml");
    IStudentService studentService= (IStudentService) context.getBean("studentService");
    Student student=getStudent1();
    studentService.addStudent(student);
    + +

    运行结果:

    +

    前置通知
    增加学生

    +

    expression=“execution(…)” 的常见写法

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    举例含义
    public boolean addStudent(org.lanqiao.entity.Student))所有返回类型为boolean、参数类型为org.lanqiao.entity.Student的addStudent()方法。
    public boolean org.lanqiao.service.IStudentService. addStudent(org.lanqiao.entity.Student)org.lanqiao.service.IStudentService类(或接口)中的addStudent()方法,并且返回类型是boolean、参数类型是org.lanqiao.entity.Student
    public * addStudent(org.lanqiao.entity.Student)“*”代表任意返回类型
    public void *( org.lanqiao.entity.Student)“*”代表任意方法名
    public void addStudent(..)“..”代表任意参数列表
    * org.lanqiao.service..(..)org.lanqiao.service.IStudentService包中,包含的所有方法(不包含子包中的方法)
    * org.lanqiao.service...(..)org.lanqiao.service.IStudentService包中,包含的所有方法(包含子包中的方法)
    +

    后置通知

    service层添加一个新业务 void deleteStudentByno(int stuNo);

    +

    添加实现方法

    +
    @Override
    public void deleteStudentByno(int stuNo) {
    System.out.println("删除学生");
    }
    + +

    编写AOP

    +
    package top.eshyee.aop;
    import java.lang.reflect.Method;
    import org.springframework.aop.AfterReturningAdvice;
    public class LogAfter implements AfterReturningAdvice{
    @Override
    public void afterReturning(Object returnValue, Method method, Object[] args, Object target) throws Throwable {
    System.out.println("后置通知,目标对象:"+target+",调用的方法名:"+method.getName()+",调用的参数个数:"+args.length+",方法的返回值:"+returnValue);
    }
    }
    + +

    注入IOC

    +
    <!-- 配置后置通知 -->
    <bean id="logAfter" class="top.eshyee.aop.LogAfter"></bean>
    <!-- 将addstudent方法与通知进行关联 -->
    <aop:config>
    <aop:pointcut expression="execution(public void top.eshyee.service.impl.StudentServiceImpl.addStudent(top.eshyee.entity.Student)) or execution(public void top.eshyee.service.impl.StudentServiceImpl.deleteStudentByno(int))" id="pointcut"/>
    <aop:advisor advice-ref="logBefore" pointcut-ref="pointcut"/>
    <aop:advisor advice-ref="logAfter" pointcut-ref="pointcut"/>
    </aop:config>
    + +

    运行结果:

    +

    前置通知
    增加学生
    后置通知,目标对象:top.eshyee.service.impl.StudentServiceImpl@5b1ebf56,调用的方法名:addStudent,调用的参数个数:1,方法的返回值:null
    前置通知
    删除学生
    后置通知,目标对象:top.eshyee.service.impl.StudentServiceImpl@5b1ebf56,调用的方法名:deleteStudentByno,调用的参数个数:1,方法的返回值:null

    +

    异常通知

    源码注释中:Implementing classes must implement methods of the form: void afterThrowing([Method, args, target], ThrowableSubclass);

    +

    及必须实现以上方法

    +

    编写AOP

    +
    package top.eshyee.aop;
    import java.lang.reflect.Method;
    import org.springframework.aop.ThrowsAdvice;

    public class LogException implements ThrowsAdvice{
    public void afterThrowing(Method method, Object[] args,Object target, Throwable ex) {
    System.out.println("异常通知,目标对象:"+target+",调用方法:"+method.getName()+",参数个数:"+args.length+",异常原因:"+ex.getMessage());
    }
    }
    + +

    注入IOC

    +
    <!-- 配置异常通知 -->
    <bean id="logException" class="top.eshyee.aop.LogException"></bean>
    <!-- 将addstudent方法与通知进行关联 -->
    <aop:config>
    <aop:pointcut expression="execution(public void top.eshyee.service.impl.StudentServiceImpl.addStudent(top.eshyee.entity.Student)) or execution(public void top.eshyee.service.impl.StudentServiceImpl.deleteStudentByno(int))" id="pointcut"/>
    <aop:advisor advice-ref="logBefore" pointcut-ref="pointcut"/>
    <aop:advisor advice-ref="logAfter" pointcut-ref="pointcut"/>
    <aop:advisor advice-ref="logException" pointcut-ref="pointcut"/>
    </aop:config>
    + +

    搞点异常

    +
    @Override
    public void deleteStudentByno(int stuNo) {
    int a=1/0;
    System.out.println("删除学生");
    }
    + +

    运行结果:

    +

    前置通知
    增加学生
    后置通知,目标对象:top.eshyee.service.impl.StudentServiceImpl@16414e40,调用的方法名:addStudent,调用的参数个数:1,方法的返回值:null
    前置通知
    异常通知,目标对象:top.eshyee.service.impl.StudentServiceImpl@16414e40,调用方法:deleteStudentByno,参数个数:1,异常原因:/ by zero
    Exception in thread "main" java.lang.ArithmeticException: / by zero

    +

    环绕通知

    前后+异常

    +

    编写AOP

    +
    package top.eshyee.aop;

    import org.aopalliance.intercept.MethodInterceptor;
    import org.aopalliance.intercept.MethodInvocation;

    public class LogAround implements MethodInterceptor {

    @Override
    public Object invoke(MethodInvocation invocation) throws Throwable {
    Object result = null;
    try {
    System.out.println("环绕通知实现的前置通知");
    result = invocation.proceed();
    // result就是目标方法如add student的返回值
    System.out.println("环绕通知实现的后置通知,目标对象:" + invocation.getThis() + ",调用的方法名:"
    + invocation.getMethod().getName() + ",调用的参数个数:" + invocation.getArguments() + ",方法的返回值:" + result);

    } catch (Exception e) {
    System.out.println("环绕通知实现的异常通知");
    }
    return result;
    }
    }
    + +

    注入IOC

    +
    <!-- 配置环绕通知 -->
    <bean id="logAround" class="top.eshyee.aop.LogAround"></bean>
    <!-- 将addstudent方法与通知进行关联 -->
    <aop:config>
    <aop:pointcut expression="execution(public void top.eshyee.service.impl.StudentServiceImpl.addStudent(top.eshyee.entity.Student)) or execution(public void top.eshyee.service.impl.StudentServiceImpl.deleteStudentByno(int))" id="pointcut"/>
    <aop:advisor advice-ref="logBefore" pointcut-ref="pointcut"/>
    <aop:advisor advice-ref="logAfter" pointcut-ref="pointcut"/>
    <aop:advisor advice-ref="logException" pointcut-ref="pointcut"/>
    <aop:advisor advice-ref="logAround" pointcut-ref="pointcut"/>
    </aop:config>
    + +

    运行结果:

    +

    前置通知
    环绕通知实现的前置通知
    增加学生
    环绕通知实现的后置通知,目标对象:top.eshyee.service.impl.StudentServiceImpl@46dffdc3,调用的方法名:addStudent,调用的参数个数:[Ljava.lang.Object;@5a709816,方法的返回值:null
    后置通知,目标对象:top.eshyee.service.impl.StudentServiceImpl@46dffdc3,调用的方法名:addStudent,调用的参数个数:1,方法的返回值:null
    前置通知
    环绕通知实现的前置通知
    删除学生
    环绕通知实现的后置通知,目标对象:top.eshyee.service.impl.StudentServiceImpl@46dffdc3,调用的方法名:deleteStudentByno,调用的参数个数:[Ljava.lang.Object;@78383390,方法的返回值:null
    后置通知,目标对象:top.eshyee.service.impl.StudentServiceImpl@46dffdc3,调用的方法名:deleteStudentByno,调用的参数个数:1,方法的返回值:null

    +

    使用注解实现AOP

    在XML配置扫描器以及对AOP的支持

    +
    <!-- 开启注解对AOP的支持 -->
    <aop:aspectj-autoproxy></aop:aspectj-autoproxy>
    <!-- 开启扫描器对该包的扫描 -->
    <context:component-scan base-package="top.eshyee.aop"></context:component-scan>
    + +

    编写AOP

    +
    package top.eshyee.aop;
    import java.util.Arrays;
    import org.aspectj.lang.JoinPoint;
    import org.aspectj.lang.ProceedingJoinPoint;
    import org.aspectj.lang.annotation.After;
    import org.aspectj.lang.annotation.AfterReturning;
    import org.aspectj.lang.annotation.AfterThrowing;
    import org.aspectj.lang.annotation.Around;
    import org.aspectj.lang.annotation.Aspect;
    import org.aspectj.lang.annotation.Before;
    import org.springframework.stereotype.Component;
    @Component("logAnnotation")
    @Aspect
    public class LogWithAnnotation {
    @Before("execution(public void top.eshyee.service.impl.StudentServiceImpl.addStudent(top.eshyee.entity.Student))")
    public void myBefore(JoinPoint jp) {
    System.out.println("注解形式--前置通知");
    }

    @AfterReturning(pointcut = "execution(public void top.eshyee.service.impl.StudentServiceImpl.addStudent(top.eshyee.entity.Student))", returning = "returningValue")
    public void myAfterReturning(JoinPoint jp, Object returningValue) {
    System.out.println("注解形式--后置通知,目标对象:" + jp.getTarget() + ",方法名:" + jp.getSignature() + ",参数列表:"
    + Arrays.toString(jp.getArgs()) + "返回值:" + returningValue);
    }

    @AfterThrowing(pointcut="execution(public void top.eshyee.service.impl.StudentServiceImpl.addStudent(top.eshyee.entity.Student))",throwing ="e")
    public void myException(JoinPoint jp,NullPointerException e) {//通过第二个参数来捕获特定异常如NullPointerException
    System.out.println("注解形式--异常通知");
    }

    @Around("execution(public void top.eshyee.service.impl.StudentServiceImpl.addStudent(top.eshyee.entity.Student))")
    public void myAround(ProceedingJoinPoint pjp) {
    try {
    System.out.println("注解形式--环绕通知--前置通知");
    pjp.proceed();
    System.out.println("注解形式--环绕通知--后置通知");
    } catch (Throwable e) {
    System.out.println("注解形式--环绕通知--异常通知");
    } finally {
    System.out.println("注解形式--环绕通知--最终通知");
    }
    }
    @After("execution(public void top.eshyee.service.impl.StudentServiceImpl.addStudent(top.eshyee.entity.Student))")
    public void myAfter() {
    System.out.println("注解形式--最终通知");
    }
    }
    + +

    运行结果:

    +

    注解形式–环绕通知–前置通知
    注解形式–前置通知
    增加学生
    注解形式–环绕通知–后置通知
    注解形式–环绕通知–最终通知
    注解形式–最终通知
    注解形式–后置通知,目标对象:top.eshyee.service.impl.StudentServiceImpl@77b14724,方法名:void top.eshyee.service.IStudentService.addStudent(Student),参数列表:[Student [stuNo=0, stuName=genge, stuAge=0]]返回值:null
    删除学生

    +

    基于SCHEMA配置

    类似于实现接口的方式

    +

    编写AOP

    +
    package top.eshyee.aop;
    import java.util.Arrays;
    import org.aspectj.lang.JoinPoint;
    import org.aspectj.lang.ProceedingJoinPoint;

    public class LogSchema {

    public void afterReturning(JoinPoint jp,Object returningValue) throws Throwable {
    System.out.println("Schema形式--后置通知,目标对象:" + jp.getTarget() + ",方法名:" + jp.getSignature() + ",参数列表:"
    + Arrays.toString(jp.getArgs()) + "返回值:" + returningValue);
    }
    public void before() throws Throwable {
    System.out.println("Schema后置通知");

    }
    public void myException(JoinPoint jp) {
    System.out.println("Schema异常通知");
    }
    public Object myAround(ProceedingJoinPoint pjp) {
    Object result=null;
    try {
    System.out.println("Schema环绕前置通知");
    result=pjp.proceed();
    System.out.println("Schema环绕后置通知");
    } catch (Throwable e) {
    System.out.println("Schema环绕异常通知");
    }
    return result;//返回目标方法的返回值
    }
    }
    + +

    注入IOC

    +
    <!-- 将准备转入通知 的类纳入IOC -->
    <bean id="logSchema" class="top.eshyee.aop.LogSchema"></bean>

    <!-- 将addstudent方法与通知进行关联 -->
    <aop:config>
    <aop:pointcut expression="execution(public void top.eshyee.service.impl.StudentServiceImpl.addStudent(top.eshyee.entity.Student)) or execution(public void top.eshyee.service.impl.StudentServiceImpl.deleteStudentByno(int))" id="pointcut2"/>
    <aop:aspect ref="logSchema" >
    <aop:before method="before" pointcut-ref="pointcut2"/>
    <aop:after-returning method="afterReturning" returning="returningValue" pointcut-ref="pointcut2"/>
    <aop:after-throwing method="myException" pointcut-ref="pointcut2"/>
    <aop:around method="myAround" pointcut-ref="pointcut2"/>
    </aop:aspect>
    </aop:config>
    + +

    运行结果:

    +

    Schema后置通知
    Schema环绕前置通知
    注解形式–环绕通知–前置通知
    注解形式–前置通知
    增加学生
    注解形式–后置通知,目标对象:top.eshyee.service.impl.StudentServiceImpl@31000e60,方法名:void top.eshyee.service.IStudentService.addStudent(Student),参数列表:[Student [stuNo=0, stuName=genge, stuAge=0]]返回值:null
    注解形式–最终通知
    注解形式–环绕通知–后置通知
    注解形式–环绕通知–最终通知
    Schema环绕后置通知
    Schema形式–后置通知,目标对象:top.eshyee.service.impl.StudentServiceImpl@31000e60,方法名:void top.eshyee.service.IStudentService.addStudent(Student),参数列表:[Student [stuNo=0, stuName=genge, stuAge=0]]返回值:null
    Schema后置通知
    Schema环绕前置通知
    删除学生
    Schema环绕后置通知
    Schema形式–后置通知,目标对象:top.eshyee.service.impl.StudentServiceImpl@31000e60,方法名:void top.eshyee.service.IStudentService.deleteStudentByno(int),参数列表:[1]返回值:null

    +]]>
    + + Spring + + + Spring + IOC + AOP + 注入 + +
    + + Spring + /2021/02/24/Spring/ + Spring

    因为之前重装系统忘记备份,放在c盘的代码和笔记(因为一般喜欢写到注释里),全没了。再加上一年没有敲代码,只能是从0开始敲一套完整的体系了。

    + + +

    安装与配置

    jar去这个网址下载,找最新版

    +

    下载后解压

    +

    QQ图片20210116214711

    +

    解压后差不多是这个样子:

    +

    image-20210116214923201

    +

    一堆jar

    +

    image-20210116214946140

    +

    开发简单的Spring 必须用的5个jar

    +

    spring-aop、spring-beans、spring-context、spring-core、spring-expression

    +

    以及一个日志的jar

    +

    commons-logging

    +

    创建一个Java项目作为重新开始的第一个测试项目

    +

    这里IDE选用eclipse(简单好上手),提前装好sts插件。

    +

    image-20210116215406732

    +

    编写“第一个”SpringIOC程序

    创建一个applicationContext.xml

    +

    创建一个实体Student

    +
    package top.eshyee.entity;

    public class Student {
    private int stuNo;
    private String stuName;
    private int stuAge;
    public int getStuNo() {
    return stuNo;
    }
    public void setStuNo(int stuNo) {
    this.stuNo = stuNo;
    }
    public String getStuName() {
    return stuName;
    }
    public void setStuName(String stuName) {
    this.stuName = stuName;
    }
    public int getStuAge() {
    return stuAge;
    }
    public void setStuAge(int stuAge) {
    this.stuAge = stuAge;
    }
    @Override
    public String toString() {
    return "Student [stuNo=" + stuNo + ", stuName=" + stuName + ", stuAge=" + stuAge + "]";
    }
    }
    + +

    在Spring的applicationcontext的xml中,创建一个bean

    +
    <?xml version="1.0" encoding="UTF-8"?>
    <beans xmlns="http://www.springframework.org/schema/beans"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">

    <bean id="student" class="top.eshyee.entity.Student">
    <property name="stuNo" value="1"></property>
    <property name="stuAge" value="2"></property>
    <property name="stuName" value="genge"></property>

    </bean>
    </beans>

    + +

    新建一个test

    +

    尝试拿取bean:

    +
    package top.eshyee.test;

    import org.springframework.context.ApplicationContext;
    import org.springframework.context.support.ClassPathXmlApplicationContext;

    import top.eshyee.entity.Student;

    public class Test1 {
    public static void main(String[] args) {
    //Spring 上下文对象
    ApplicationContext context=new ClassPathXmlApplicationContext("applicationContext.xml");

    Student student=(Student) context.getBean("student");
    System.out.println(student);
    }
    Student getStudent1() {
    Student student = new Student();
    student.setStuName("genge");
    student.setStuNo(0);
    student.setStuAge(0);
    System.out.println(student);
    return student;
    }
    }
    + +

    运行结果:

    +

    Student [stuNo=1, stuName=genge, stuAge=2]

    +]]>
    + + Spring + + + Spring + +
    + + SpringMVC + /2021/02/24/SpringMVC/ + 入门-第一个SpringMVC程序

    jars

    spring-aop.jar

    +

    spring-bean. jar

    +

    spring-context. jar

    +

    spring-core. jar

    +

    spring-web. jar

    +

    spring-webmvc. jar

    +

    spring-webmvc.jar

    +

    commons-logging

    +

    image-20210123222410984

    +

    配置web.xml

    <?xml version="1.0" encoding="UTF-8"?>
    <web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xmlns="http://java.sun.com/xml/ns/javaee"
    xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd"
    id="WebApp_ID" version="3.0">
    <display-name>SpringMVCProject</display-name>
    <welcome-file-list>
    <welcome-file>index.html</welcome-file>
    <welcome-file>index.htm</welcome-file>
    <welcome-file>index.jsp</welcome-file>
    <welcome-file>default.html</welcome-file>
    <welcome-file>default.htm</welcome-file>
    <welcome-file>default.jsp</welcome-file>
    </welcome-file-list>
    <!-- 配置映射 -->
    <servlet>
    <servlet-name>springDispatcherServlet</servlet-name>
    <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
    <init-param>
    <param-name>contextConfigLocation</param-name>
    <param-value>classpath:springmvc.xml</param-value>
    </init-param>
    <!-- 使启动时自动生效 -->
    <load-on-startup>1</load-on-startup>
    </servlet>
    <servlet-mapping>
    <servlet-name>springDispatcherServlet</servlet-name>
    <url-pattern>/</url-pattern>
    </servlet-mapping>
    </web-app>
    + +

    创建springmvc.xml

    <?xml version="1.0" encoding="UTF-8"?>
    <beans xmlns="http://www.springframework.org/schema/beans"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xmlns:aop="http://www.springframework.org/schema/aop"
    xmlns:context="http://www.springframework.org/schema/context"
    xmlns:mvc="http://www.springframework.org/schema/mvc"
    xsi:schemaLocation="http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc-4.3.xsd
    http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
    http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.3.xsd
    http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-4.3.xsd">
    <!-- 扫描有注解的包 -->
    <context:component-scan base-package="top.eshyee.Controller"></context:component-scan>
    <!-- 配置视图解析器InternalResourceViewResolver -->
    <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
    <property name="prefix" value="/views/"></property>
    <property name="suffix" value=".jsp"></property>
    </bean>
    </beans>
    + +

    index.jsp/success.jsp

    在WebContent中创建index.jsp

    +
    <%@ page language="java" contentType="text/html; charset=ISO-8859-1"
    pageEncoding="ISO-8859-1"%>
    <!DOCTYPE html>
    <html>
    <head>
    <meta charset="ISO-8859-1">
    <title>Insert title here</title>
    </head>
    <body>
    <a href="welcome">firstSpringMVC</a>
    </body>
    </html>
    + +

    再创建一个FOLDER起名“views”,其中创建success.jsp

    +
    <%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
    <!DOCTYPE html>
    <html>
    <head>
    <meta charset="ISO-8859-1">
    <title>Insert title here</title>
    </head>
    <body>
    第一个实例成功
    </body>
    </html>
    + +

    编写SpringMVCController

    package top.eshyee.Controller;

    import org.springframework.stereotype.Controller;
    import org.springframework.web.bind.annotation.RequestMapping;
    import org.springframework.web.bind.annotation.RequestMethod;

    @Controller
    @RequestMapping("SpringMVCController")
    public class SpringMVCController {
    // 通过method更改请求方式,params指定请求参数中必须有的参数 如:“name”且必须为zs,"age"!=23
    @RequestMapping(value = "welcome")
    public String welcome() {
    return "success";
    }
    }
    + + + +

    如果没配置错,运行成功。

    +

    其他配置

    Controller

    +
    //	通过method更改请求方式,params指定请求参数中必须有的参数 如:“name”且必须为zs,"age"!=23
    @RequestMapping(value = "welcome", method = RequestMethod.POST, params = { "name=zs", "age!=23" })
    public String welcome() {
    return "success";
    }

    //限制请求头
    @RequestMapping(value = "welcome2", headers = {
    "accept=text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9",
    "accept-encoding=gzip, deflate, br" })
    public String welcome2() {
    return "success";
    }
    + +

    JSP

    +
    <body>
    <a href="SpringMVCController/welcome2">firstSpringMVC</a>
    <form action="SpringMVCController/welcome" method="post">
    <input name="name">
    <input name="age">
    <input type="submit" value="post">
    </form>
    </body>
    + +

    ANT风格

    Controller

    +
    //	ant风格
    //中间 任意字符*,任意目录**
    @RequestMapping(value = "welcome3/**/test")
    public String welcome3() {
    return "success";
    }
    // 中间单个字符
    @RequestMapping(value = "welcome4/a?c/test")
    public String welcome4() {
    return "success";
    }
    @RequestMapping(value = "welcome5/{name}")
    public String welcome5(@PathVariable("name") String name) {
    System.out.println(name);
    return "success";
    }
    + +

    jsp

    +
    <a href="SpringMVCController/welcome3/adas/test">ant风格1</a>
    <a href="SpringMVCController/welcome4/abc/test">ant风格2</a>
    <a href="SpringMVCController/welcome5/张三">ant风格-@PathVariable</a>
    + +

    REST 实现delete和put

    controller

    +
    //REST 风格--通过隐藏域区分delete和put
    @RequestMapping(value = "testPost/{name}")
    public String testPost(@PathVariable("name") String name) {
    System.out.println("增"+name);
    return "success";
    }
    @RequestMapping(value = "testDelete/{name}" )
    public String testDelete(@PathVariable("name") String name) {
    System.out.println("删"+name);
    return "success";
    }
    @RequestMapping(value = "testPut/{name}")
    public String testPut(@PathVariable("name") Integer name) {
    System.out.println("改"+name);
    return "success";
    }
    @RequestMapping(value = "testGet/{name}")
    public String testGet(@PathVariable("name") String name) {
    System.out.println("查"+name);
    return "success";
    }
    @RequestMapping(value="testRest/{id}",method=RequestMethod.DELETE)
    public String testDelete(@PathVariable("id") Integer id) {
    System.out.println("delete:删 " +id);
    return "success" ;
    }
    + +

    jsp

    +
    <form action="SpringMVCController/testPost/1234" method="post">
    <input type="submit" value="增">
    </form><br/>
    <form action="SpringMVCController/testDelete/1234" method="post">
    <input type="hidden" name="_method" value="DELETE">
    <input type="submit" value="删">
    </form><br/>
    <form action="SpringMVCController/testPut/1234" method="post">
    <input type="hidden" name="_method" value="PUT">
    <input type="submit" value="改">
    </form><br/>
    <form action="SpringMVCController/testGet/1234" method="get">
    <input type="submit" value="查">
    </form><br/>
    <form action="SpringMVCController/testRest/1234" method="post">
    <input type="hidden" name="_method" value="DELETE"/>
    <input type="submit" value="删">
    </form>
    + +

    过滤器 xml

    +
    <!-- 增加一个过滤器,目的是给普通浏览器增加delete|put的支持 -->
    <filter>
    <filter-name>HiddenHttpMethodFilte</filter-name>
    <filter-class>org.springframework.web.filter.HiddenHttpMethodFilter</filter-class>
    </filter>
    <filter-mapping>
    <filter-name>HiddenHttpMethodFilte</filter-name>
    <url-pattern>/*</url-pattern>
    </filter-mapping>
    + +

    杂项

    Controller

    +
    @RequestMapping(value = "testParam")
    // required = false,defaultValue = "2" 可以不传uage ,默认值为2,客户端没有传入uage参数才能生效defaultValue配置
    public String testParam(@RequestParam("uname") String uname,@RequestParam(value="uage",required = false,defaultValue = "2") Integer uage) {
    System.out.println(uname);
    System.out.println(uage);
    return "success";
    }
    @RequestMapping(value = "testRequestHeader")
    public String testRequestHeader(@RequestHeader("Accept-Language") String al) {
    System.out.println(al);
    return "success";
    }
    @RequestMapping(value = "testCookieValue")
    public String testCookieValue(@CookieValue("JSESSIONID") String jSessionId) {
    System.out.println(jSessionId);
    return "success";
    }

    // 使用原生态的ServletAPI--直接使用
    @RequestMapping(value = "testSerlet")
    public String testSerlet(HttpServletRequest request, HttpServletResponse response) {
    System.out.println(request);
    System.out.println(response);
    return "success";
    }
    + +

    JSP

    +
    </form>
    <br />
    <form action="SpringMVCController/testParam" method="post">
    <input type="text" name="uname">
    <!-- <input type="text" name="uage"> -->
    <input type="submit" value="提交">

    </form>
    <br />
    <a href="SpringMVCController/testRequestHeader">testRequestHeader</a>

    <br />
    <a href="SpringMVCController/testCookieValue">testCookieValue</a>
    <br />
    <a href="SpringMVCController/testSerlet">testSerlet</a>
    <br />
    + +

    对象的接收(级联)

    创建一个级联对象

    +

    Student

    +
    package top.eshyee.entity;

    public class Student {
    private String name;
    private int age;
    private Address address;
    public String getName() {
    return name;
    }
    public void setName(String name) {
    this.name = name;
    }

    public int getAge() {
    return age;
    }
    public void setAge(int age) {
    this.age = age;
    }
    public Address getAddress() {
    return address;
    }
    public void setAddress(Address address) {
    this.address = address;
    }
    @Override
    public String toString() {
    return "Student [name=" + name + ", age=" + age + ", address=" + address + "]";
    }
    }
    + +

    Address

    +
    package top.eshyee.entity;

    public class Address {
    private String homeAddress;
    private String schoolAddress;
    public String getHomeAddress() {
    return homeAddress;
    }
    public void setHomeAddress(String homeAddress) {
    this.homeAddress = homeAddress;
    }
    public String getSchoolAddress() {
    return schoolAddress;
    }
    public void setSchoolAddress(String schoolAddress) {
    this.schoolAddress = schoolAddress;
    }
    @Override
    public String toString() {
    return "Address [homeAddress=" + homeAddress + ", schoolAddress=" + schoolAddress + "]";
    }
    }
    + +

    controller

    +
    @RequestMapping(value = "testObject")
    public String testObject(Student student) {//属性必须跟表单内的值一样
    System.out.println(student);
    return "success";
    }
    + +

    jsp

    +
    <form action="SpringMVCController/testObject" method="post">
    name:<input type="text" name="name"><br/>
    age:<input type="text" name="age"><br/>
    schooladdress:<input type="text" name="address.schoolAddress"><br/>
    homeaddress:<input type="text" name="address.homeAddress"><br/>
    <input type="submit" value="提交">
    </form>
    + +

    ModelAndView

    Controller

    +
    @RequestMapping(value = "testModelAndView")
    public ModelAndView testModelAndView() {
    ModelAndView mv=new ModelAndView("success");
    Student student=new Student();
    student.setName("aa");
    student.setAge(1);
    mv.addObject("student",student);//相当于request.setAttribute
    return mv;
    }
    + +

    Success JSP

    +

    用于展示拿到的值

    +
    ${requestScope.student.age}--${requestScope.student.name}--
    + +

    测试页面的JSP

    +
    <a href="SpringMVCController/testModelAndView">testModelAndView</a>
    <br />
    + +

    其他方法

    +

    Controller

    +
    @RequestMapping(value = "testModelMap")
    public String testModelMap(ModelMap mm) {

    Student student = new Student();
    student.setName("aa");
    student.setAge(1);
    mm.put("student", student);// request域
    return "success";
    }

    @RequestMapping(value = "testMap")
    public String testMap(Map<String, Object> map) {

    Student student = new Student();
    student.setName("aa");
    student.setAge(1);
    map.put("student", student);// request域
    return "success";
    }

    @RequestMapping(value = "testModel")
    public String testModel(Model model) {

    Student student = new Student();
    student.setName("aa");
    student.setAge(1);
    model.addAttribute("student", student);// request域
    return "success";
    }
    + +

    JSP

    +
    <a href="SpringMVCController/testModelMap">testModelMap</a>
    <br />
    <a href="SpringMVCController/testMap">testMap</a>
    <br />
    <a href="SpringMVCController/testModel">testModel</a>
    <br />
    + +

    如果要把request的中的对象放入session中,在类前加注解@SessionAttributes

    +

    Controller

    +
    @SessionAttributes("student")
    @Controller
    @RequestMapping("SpringMVCController")
    public class SpringMVCController {
    ...
    }
    + +

    Success JSP

    +
    <body>
    实例成功
    request:<br/>
    ${requestScope.student.age}--${requestScope.student.name}--
    <br/>session:<br/>
    ${sessionScope.student.age}--${sessionScope.student.name}--
    </body>
    + +

    视图、视图解析器

    视图的顶级接口:View
    视图解析器:ViewResolver常见的视图和解析器:
    InternalResourceView、InternalResourceViewResolverpublic class JstlView extends InternalResourceView:
    springMVC解析jsp时会默认使用InternalResourceView,如果发现Jsp中包含了jstl语言,则自动转为JstlView

    +

    JstlView 可以解析jst1\实现国际化操作

    +

    mvc:view-controller

    在xml使用该标签可不用写Controller

    +

    xml

    +
    <mvc:view-controller path="Controller/testMvcViewController" view-name="success"/>
    + +

    index jsp

    +
    <a href="Controller/testMvcViewController" >testMvcViewController</a>
    + +

    但是只写mvc:view-controller 会自动屏蔽Controller

    +

    若需共存,需加标签

    +
    <mvc:annotation-driven></mvc:annotation-driven>
    + +

    指定跳转方式

    forward: 请求转发 redirect: 重定向

    +

    此种方式不会被视图解析器加上前缀和后缀

    +

    Controller中

    +
    return "forward:/views/success.jsp";//或者redirect
    + +

    处理静态资源

    在SpringMVC中,直接访问静态资源,会 报404

    +

    原因:所有请求在web.xml中被拦截,交给SpringMVC的DispatchServlet处理,然而该处理方式是直接找requestmapping了,但静态资源没有配requestmapping,所以404.

    +

    解决方式:不需要mvc的,交给tomcat的servlet处理

    +
    <!-- 该注解会使SpringMVC在收到没有对应requestmapping的请求时,将请求交给服务器的servlet处理 -->
    <mvc:default-servlet-handler/>
    <mvc:annotation-driven></mvc:annotation-driven>
    + +

    类型转换

    Spring自带一些常见的类型转换

    +

    可以自定义

    +

    i 编写自定义转换器的类(实现convert接口)

    +
    package top.eshyee.converter;

    import org.springframework.core.convert.converter.Converter;

    import top.eshyee.entity.Student;

    public class MyConverter implements Converter<String,Student>{

    @Override
    public Student convert(String source) {//字符串--返回学生--传入格式1-zs-23
    return new Student(Integer.parseInt(source.split("-")[0]),source.split("-")[1],Integer.parseInt(source.split("-")[2]));

    }
    }
    + +

    ii 将编写的转换器加入到MVC中

    +
    <!-- 1 将转换器纳入SpringIOC容器 -->
    <bean id="MyConverter" class="top.eshyee.converter.MyConverter"></bean>
    <!-- 2 将MyConverter纳入到SpringMVC提供的bean中 -->
    <bean id="conversionServiceFactoryBean" class="org.springframework.context.support.ConversionServiceFactoryBean">
    <property name="converters">
    <set>
    <ref bean="MyConverter"/>
    </set>
    </property>
    </bean>
    <!-- 将conversionServiceFactoryBean注册到annotationdriven中 -->
    <!-- 此配置是mvc的基础配置 -->
    <mvc:annotation-driven conversion-service="conversionServiceFactoryBean"></mvc:annotation-driven>
    + +

    iii 测试

    +

    jsp

    +
    <form action="SpringMVCController/testConverter" method="post">
    studentInfo:<input type="text" name="studentInfo"><br/>
    <input type="submit" value="提交">
    </form>
    + +

    Controller

    +
    @RequestMapping(value = "testConverter") 
    public String testConverter(@RequestParam("studentInfo") Student student) {
    System.out.println(student);
    return "success";
    }
    + +

    数据格式化

    SpringMVC提供注解实现格式化

    +

    配置标签

    +
    <!-- 配置数据格式化 注解所依赖的bean -->
    <bean id="formattingConversionServiceFactoryBean" class="org.springframework.format.support.FormattingConversionServiceFactoryBean"></bean>
    <mvc:annotation-driven conversion-service="formattingConversionServiceFactoryBean"></mvc:annotation-driven>
    + +

    添加注解

    +

    Student类中

    +
    @DateTimeFormat(pattern = "yyyy-MM-dd")
    private Date birthday;
    + +]]>
    + + Spring + + + Spring + MVC + +
    + + Springboot + /2021/02/24/Springboot/ + 1.微服务: -一个项目 可以由多个小型服务构成(微服务)

    +
      +
    1. spring boot可以快速开发微服务|
    2. +
    +

    a.简化j2ee开发
    b.整个spring技术栈的整合
    c.整个j2ee技术的整个

    +

    准备:
    jdk:
    JAVA_ HOME: jdk根 目录
    path: jdk根目录\bin
    classpath: . ; jdk根目录\lib
    maven

    +

    MAVEN_ HOME: maven根 目录
    path: maven根目录\bin

    +

    配置Maven本地仓库: mvn根 目录/ conf/ setting. xml

    +

    目录结构
    resources: .
    static:静态资源(js css图片音频视频)
    templates:模板文件(freemarker , thymeleaf;默认不支持jsp)

    +

    appl ication. properties:
    配置文件

    +

    spring boot内置了tomcat, 并且不需要打成war再执行。

    +

    可以在appication. properties对端口号等服务端信息进行配置

    +

    spring boot将各个应用/三方框架设置成了一个个“场景”stater,
    以后要用哪个,只需要引入那个场景即可。
    选完之后,s
    spring
    boot就会将该场景所需要的所有依赖自动注入。
    例如选择
    ‘web’
    ’, spring boot就会将web相关的依赖(tomcat json) 全部引入本项目
    @SpringBootAppl icat ion: spring boot 的主配置类

    +

    该注解包含:
    @Spr i ngBootConf i guration

    +

    @Enabl eAutoConf i gurat ion 使spring boot可以自动配置

    +

    @configuration

    +

    表示“配置类”: 1.该类是一个配置类
    2.加了@Configuration注解的类,会自动纳入Spring容器

    +

    spring boot 在启动时,会根据META- INF/spring. factories找到相应的三方依赖

    +

    并将这些依赖引入该项目

    +

    自己写的
    引入三方依赖(jar、配置)

    +

    总结:
    编写项目时,- -般会对自己写的代码以及三方依赖进行配置。但是spring boot可以自动进行配置:
    a:自己写的代码,spring boot通过@Spr ingBootConf igurat ion自动帮我们配置;
    b.三方依赖通过spring- boot-autoconfigure- -2. 0.3. RELEASE. jar中的META- INF/ spring. factories进行声明,然后开启使用

    +

    spring-boot-autoconfigure-2.0. 3. RELEASE. jar包中包含了J2EE整合体系中需要的依赖。

    +

    c.如何自动装配:

    +

    通过观察该源码发现:
    @Configuration:标识此类是一个配置类 、 将此类纳入springioc容器

    +

    如:通过HttpEncodingProperties将编码设置为了UTF_ 8

    +

    如何修改改编码:通过改Ht tpEncodingProperties的predfix+属性名进行修改

    +

    1每一个XxAutoConfiguration都有很多条件@Conditional0nXxx,当这些条件都满足时,配置生效

    +

    2全局配置文件中的key, 来源于某个Properties文件中的prefix+属性名

    +

    image-20200526090050002

    +

    如何知道spring boot开启了哪些自动装配、禁止了哪些自动装配:application. properties中debug=true

    +

    Positive matches

    +

    积极装配 表示spring boot自动开启的装配

    +

    negative matches

    +

    消极装配 没开启的

    +

    配置文件
    作用: spring boot自动配置(约定,8080 ). 可以使用配置文件对默认得配置进行修改

    +

    默认全局配置文件:
    application. properties k=v
    application. yml 不是一个标记文档 k:空格v ;通过垂直对齐指定层次关系 ; 默认可以不写引号; “”会将其中的转义符进行转义,其他得不会

    +
    server :
    port: 8882
    path: /a/b/c
    + + +

    xml:是一个标记文档

    +
    <server>
    <port>8882</ port>
    <path>/a/b/c</ path>
    </server>
    + +

    9.通过yam1给对象注入值:
    注入值
    s tudent:
    #name: zs
    #age: 23
    sex: true
    birthday: 2019/02/12
    绑定:

    +

    @Component //将此Javabean
    @ConfigurationProperties (prefix=” student”)
    public class Student

    +

    image-20200528092519700

    +
      +
    1. @PropertySource:默认会加载applicat ion. properties/ application. yml文件中的数据;
      例如@PropertySource (value= {”classpath: conf. properties” } )加载conf. properties
    2. +
    +

    但是,@PropertySource 只能加载properties,不能加载yml

    +
      +
    1. @ImportResource
      spring. boot 自动装配/自动配置.
      spring等配置文件默认 会被spring boot 自动给配置好。
      如果要自己编写spring等配置文件,spring boot 能否识别?默认不识别。
    2. +
    +

    随机占位表达式

    +

    $ {random. uuid} : uuid
    $ {random. value}随机字符串.
    $ {random. int}: 随机整型数
    $ {random. long}: 随机长整型数
    $ {random. int(10)}: 10以内的整型数
    $ {random. int[1024, 65536]}: 指定随机数范围

    +

    13.多环境的切换(profile)

    +

    a properties

    +

    b yml

    +

    c.动态切换环境
    i:通过运行参数指定环境
    (1) STS(Eclipse) : Run Configuration - Argument - program Argument
    –spring. profiles. active=环境名
    (2)命令行方式:
    java -jar_ 项目名. jar –spring. profiles. active=环境名
    ii:通过vm参数指定环境
    STS(Eclipse) : Run Configuration - Argument - program Argument
    -Dspring. profiles. active=环境名|

    +
      +
    1. 配置文件的位置

      +

      内部

      +

      properties和yml中的配置,相互补充;如果冲突,则properties优 先级高。
      spring. boot默认能够读取的app1 ication. properties/ application. yml,这2个文件可以存在于以下
      file:项目根目录/config
      file:项目根目录
      classpath:项目根目录/config
      classpath:项目 根目录

      +
    2. +
    +

    注意:
    a.如果某项配置冲突,则优先级从上往下
    b.如果不冲突,则互补结合使用

    +

    外部:

    +

    在项目Run confi guration , argumenets:
    – spr ing. config. location=文件路径
    如果同一个配置同时存在于内部配置文件和外部配置文件,则外部>内部

    +

    通过命令行调用外部配置文件
    java -jar项目. jar – spring. config. location=D:/ appl ication. properties

    +

    14.日志
    日志框架UCL JUL jboss- logging, logback, log4j, 1og4j2, s1f4j…
    spring boot默认选用slf4j, logback

    +

    spring boot默认帮我们配置好了日志,我们直接使用即可。

    +

    日志级别

    +

    TRACE< DEBUG< INFO<WARN< ERROR< FATAL<0FF

    +

    springboot默认的日志级别是info (即只打印info及之 后级别的信息

    +

    可以通过配置将日志信息存储到文件中logging. file=springboot. log存储到了项目的根目录中的springboot.log中

    +

    也可以指定具体的日志路径: logging. file=D:/springboot. log
    也可以存储到一一个文件夹中,logging. path=D:/log/, 并且默认的文件名是spring. log
    指定日志显示格式:
    a.日志显示在console中I
    b.日志显示在文件中

    +
      +
    1. springboot开发Web项目 (静态资源html css js )
      new - spring starer -设置I (选择需要的场景,web)
      springboot是-一个jar,因此静态资源就不是再存放到webapps中,
    2. +
    +

    静态资源的存放路径通过WebMvcAutoConfiguration类的addResourceHandlers ()指定/webjars

    +

    spring boot将静态资源存入到jar包中,引入:http://localhost:8080/webjars/jquery/3.5.1/jquery.js

    +

    如何自己写静态资源,如何放到如spring boot中?将自己写的静态资源-> jar

    +

    推荐: springIboot约定:springboot将–些目录结构设置成静态资源存放目录

    +

    默认目录

    +

    “classpath:/META- INF/resources/”,” classpath:/resources/”,
    ”classpath:/static/“, ”classpath:/public/”

    +

    注意:在以上目录存放资源文件后,访问时不 需要加前缀,直接访问即可: http://localhost : 8080+名字

    +

    设置欢迎页:
    welcomePageHandlerMapping

    +

    网站中网页标签的Logo是固定名字favicon.ico

    +

    自定义favicon. ico :阅读源码得知:只需要将 favicon. ico文件放入任意静态资源目录中即可

    +

    总结: 1. 通过源码发现静态资源的目录
    2.用静态资源:只需要将静态资源放入以上目录即可
    3.其他特定的文件(欢迎页、ico) ,只需要根据约定放入改 目录即可

    +

    动态资源: JSP (spring. boot默认不支持)
    推荐:模板引擎thymeleaf
    网页=模板+数据|

    +

    使用thymeleaf:代码在哪里写?
    Thyme leafAutoCongifutation、
    XxProperties
    通过Thyme leafProperties源码得知:
    使用thymeleaf只需要将文件放入目录: “classpath:/templates/“;文件的后缀:”. html”;

    +

    th就是替换原有html的值: th;html属性名=值 ;

    +

    /<p id=” pid” class=” pclass’> /

    +

    th:id=” $ {welcome}”th:class=” $ {welcome}”th:text=” $
    th:xx_ (参 见第10章Attrubite Pre…. )
    th:text 获取文本值(不转义)
    th:utext获取文 本值

    +

    除了$以外其他符号?查看 第四章Standard Express….|

    +]]>
    + + Spring + + + Spring + +
    + + Spring注解开发 + /2020/04/22/Spring%E6%B3%A8%E8%A7%A3%E5%BC%80%E5%8F%91/ + Bean的作用域
    +

    作用域

    singleton

    +

    单例(默认值), 在每个SpringIOC容器中,一个bean定义对应一个对象实例

    +

    prototype

    +

    一个bean定义对应多个对象实例

    +

    request

    +

    在一次HTTP请求中,一个bean定义对应一个实例,即每次HTTP请求将会有各自的bean实例,它们依据某个bean定义创建而成。该作用域仅在基于Web的Spring ApplicationContext的情况下有效。

    +

    session

    +

    在一个HTTP Session 中,一个bean定义对应一个实例。该作用域仅在基于Web 的SpringApplicationContext的情况下有效

    +

    global session

    +

    在一个全局的HTTP Session中,一个bean定义对应一个实例。典型情况下,仅在使用portlet context的时候有效。该作用域仅在基于Web的Spring ApplicationContext的情况下有效

    +
    +

    注解形式

    +
    @Bean ("stu")
    + +

    配置文件形式

    +
    <bean id="student" class=" com.ehshyee.entity.Student">
    value :简单类型
    <property name="stuNo"value="1"></property>
    <property name="stuName" value="张三"></property>
    <property name="stuAge" value="23"></ property>
    ref:其他类型
    <property name="address" ref="myaddress"></property>
    </bean>
    + +

    分别对其获取两个学生 查看是否为同一个

    +
    Student stul = (Student) context.getBean(S:"student") ;
    Student stu2 = (Student) context.getBean(S:"student") ;
    System.out.println(stul =stu2) ;
    + +

    均返回true

    +

    在xml中scope默认是singleton 可改为prototype

    +
    <bean id="student" class=" top.ehshyee.entity.Student" scope="prototype">
    + +

    改后返回false

    +

    注解中添加

    +
    @scope("prototype")//默认singleton
    + +

    对于实例产生的时机

    +

    一些测试

    +
    public Student() {
    System.out.println("student无参构造") ;
    }
    public Student(int stuNo, String stuName, int stuAge) {
    super();
    this.stuNo = stuNo;
    this.stuName = stuName;
    this.stuAge = stuAge;
    //有参构造
    }
    + + +

    singleton | prototype

    +

    执行时机(产生bean的时机) :

    +

    default)singleton:容器在初始化时,就会创建对象(唯一的一个);以后再getBean时,不再产生新的bean.singleton也支持延迟加载(懒加载) :在第一次使用时产生。

    +

    prototype:容器在初始化时,不创建对象;只是在每次使用时(每次从容器获取对象时,context.getBean(Xxxx)),再创建对象,并且,每次getBean()都会创建一个新的对象。

    +

    延迟加载(注解形式)

    +
    @lazy
    + +

    条件注解 –>SpringBoot

    可以让某一个Bean在某些条件下加入Ioc容器,其他情况下不加IoC容器。

    +

    a.准备bean

    +
    public interface Car {

    }
    public class EnegerCar implements Car {
    }
    public class OilCar implements Car{
    }
    + +

    b.增加条件Bean:给每个Bean设置条件,必须实现Condition接口

    +
    public class OilCarCondition implements Condition {
    @Override
    public boolean matches(ConditionContext conditionContext, AnnotatedTypeMetadata annotatedTypeMetadata) {
    //如果当前环境的车类型是Oil,则加入OilCar
    //获取环境
    Environment environment=conditionContext.getEnvironment();
    String carType=environment.getProperty("car.type");

    return carType.contains("oil");
    }
    }
    public class EnergyCarCondition implements Condition {
    @Override
    public boolean matches(ConditionContext conditionContext, AnnotatedTypeMetadata annotatedTypeMetadata) {
    //如果当前环境的车类型是energy,则加入energyCar
    //获取环境
    Environment environment = conditionContext.getEnvironment();
    String carType = environment.getProperty("car.type");

    return carType.contains("energy");
    }
    }
    + +

    c.根据条件加入IOC容器

    +
    @Bean
    @Conditional (OilCarCondition.class)
    public Car oilCar ()
    {return new oilCar()}
    @Bean
    @Conditional (EnergyCarCondition.class)
    public Car energyCar ()
    {return new EnergyCar ()}
    + +

    测试

    +

    在VM option中添加参数为oil-Dcar.type=oil

    +
    public static void testAnnotation {
    //注解方式
    ApplicationContext context = new AnnotationConfigApplicationContext (MyConfig.class);
    String[] beanDefinitionNames = context.getBeanDefinitionNames();
    for (String name : beanDefinitionNames) {
    System.out.println(name) ;
    }}
    + +

    给IoC加入Bean的方法

    注解:

    +

    ​ 三层组件: 扫描器+三层注解

    +

    ​ 非三层组件@Confiquration:

    +
      +
    1. @Bean+返回值
    2. +
    3. @import
    4. +
    5. FactoryBean(工厂 Bean)
    6. +
    +

    @import使用:

    ①直接编写到@Import中

    +
    @Confiquration
    @Import ( {Apple.class, Banana.class} )
    //bean是id 是全类名
    + +

    ②自定义ImportSelector接口的实现类,通过selectimports方法实现,方法的返回值就是要纳入IoC容器的Bean),并告知系统自己编写的实现类。

    +
    public class MyImportSelector implements ImportSelector {
    @Override
    public String[] selectImports (AnnotationMetadata importingClassMetadata) {
    //return new string[0] ;//返回值就是要加入IOC容器的bean的全类名
    return new String[]{ "top.eshyee.entity.Apple", "top.eshyee.entity.Banana"}
    }
    + +
    @Import(Orage.class,MyImportSelector.class)
    + +

    ③编写ImportBeanDefinitionRegistrar接口的实现类,重写方法

    +
    public class MyImportBeanDefinitionRegistrar implements ImportBeanDefinitionRegistrar{
    @Override
    public void registerBeanDefinitions(AnnotationMetadata importingClassMetadata, BeanDefinitionRegistry registry) {
    BeanDefinition beanDefinition new RootBeanDefinition(Orange.class) ;
    // or BeanDefinition beanDefinition new RootBeanDefinition("top.eshyee.entity.Orange") ;
    registry.registerBeanDefinition("myorange",beanDefinition);
    }
    }
    + +
    @Import(MyImportBeanDefinitionRegistrar)
    + +

    FactoryBean(工厂 Bean)

    写注册类

    +
    public class MyEactoryBean implements FactoryBean
    {
    @Override
    public Object getobject() throws Exception {

    return new Apple;
    }
    @Override
    public Class<?> getobjectType() {
    return Apple.class ;
    }
    @Override
    public boolean isSingleton() {
    return true;
    }
    }
    + +

    bean中实现

    +
    @Bean
    public FactoryBean<Apple> myFactoryBean() {
    return new MyFactoryBean() ;
    }
    + +

    拿myFactoryBean中的值

    +
    object obj (context. getBean( "myFactoryBean") );
    System.out.println(obj) ;
    object obj (context. getBean( "&myFactoryBean") );
    System.out.println(obj) ;
    + +

    &:不加&获取的是最内部真实的Apple;

    +

    Bean的生命周期

    创建(new …)、 初始化(赋初值)、….销毁(servlet)

    +

    方法一:

    +

    init destroy

    +

    xml :

    +
    <bean id="StudentDao" class="top.eshyee.dao.impl.StudentDaoImpl" init-method="" destroy-method=""></bean>
    + +

    注解:

    +
    @Bean(value="stu", initMethod ="myInit", destroyMethod="myDestroy")
    + +

    IoC容器在初始化时,会自动创建对象(构造方法) ->init ->…..-> 当容器关闭时调用destroy..

    +

    方法二:

    +

    三层组件: 扫描器+三层注解(功能性注解+MyIntToStringConverter. java转换器)@Controller、@Service、@Repository、@Component

    +

    JAVA规范:JSR250

    +

    @PostConstruct:相当于方法一的init

    +

    @PreDestroy:相当于方法- - 的destroy

    +

    1.将响应组件加入@Component注解、给初始化方法加@PostConstruct、给销毁方法加@PreDestroy

    +

    如果要获取@Component注解中的bean,那么该Bean的名字就是@Component (value= “xxx”)的value值

    +

    调用

    +
    MyIntToStringConverter converter= (MyIntToStringConverter) context.getBean
    + +

    方法三:

    +

    双接口

    +

    三层组件

    +

    InitializingBean初始化
    DisposableBean销毁

    +

    初始化:只需要实现InitializingBean中 的afterPropertiesSet()方法

    +

    销毁:实现DisposableBean 中的destroy()方法

    +

    +

    如果是注解形式,随便写一个方法,然后加上相应注解即可

    +

    如果是接口形式,必须实现接口中规定的方法

    +

    方法四:

    +

    三层组件

    +

    单接口:

    +

    接口BeanPostProcessor:拦截了所有容器中的Bean

    +]]>
    + + Spring + + + Spring + +
    + + Stack + /2020/03/16/Stack/ + 只允许在一端进行插入或删除操作的线性表

    +

    后进先出LIFO

    image-20200316102101311

    +

    进栈顺序:a1->a2->a3->a4->a5

    +

    出栈顺序:a5->a4->a3->a2->a1

    +

    基本操作

    InitStack(&S):初始化栈。构造一个空栈S,分配内存空间。创建

    +

    DestroyStack(&L):销毁栈。销毁并释放栈S所占用的内存空间。销毁

    +

    Push(&S,x):进栈,若栈S未满,则将x加入使之成为新栈顶。

    +

    Pop(&S,&x):出栈,若栈S非空,则弹出栈项元素,并用x返回。

    +

    GetTop(S, &x):读栈顶元素。若栈S非空,则用x返回栈顶元素。
    查栈的使用场景中大
    多只访问栈顶元素

    +

    其他常用操作

    StackEmpty(S):判断-一个栈S是否为空。若S为空,则返回true,否则返回false。

    +

    规律

    n个不同元素进栈,出栈元素不同排列的个数为

    +

    $$ \frac{1}{n+1}\sideset{}{^n_2n}C $$

    +

    1/n+1乘Cn 2n

    +

    上述公式称为卡特兰(Catalan) 数,可采用数学归纳法证
    明(不要求掌握)

    +

    5个进栈有42种方式

    +

    顺序栈

    定义

    #define MaxSize 10
    //定义栈中元素的最大个数
    typedef struct{
    ElemType data [MaxSize];
    //静态数组存放栈中元素
    int top;
    //栈顶指针
    } SqStack;
    + +

    顺序存储:给各个数据元素分配连续的存储空间,大小为MaxSize*sizeof(ElemType)

    +

    初始化

    //初始化栈
    void InitStack(SqStack &S){
    S.top=-1;
    //初始化栈顶指针
    }
    + +

    判断是否为空

    //判断栈空
    bool StackEmpty(SqStack S){
    return S.top==-1?true:false;
    //S.top==-1为空栈
    }
    + +

    进栈

    #define MaxSize 10//定义栈中元素的最大个数
    typedef struct{
    ElemType data [MaxSize];//静态数组存放栈中元素
    int top;//栈顶指针
    } SqStack;

    //新元素入栈
    bool Push(SqStack &S , ElemType x){
    if(S.top==MaxSize-1) //栈满,报错
    return false;
    S.top = S.top + 1;//指针先加1
    S.data[S.top]=x;//新元素入栈
    //相当于S.data[++S.top]=x;
    return true;
    }
    + +

    出栈

    //出栈操作
    bool Pop(SqStack &S, ElemType &x){
    if(S.top==-1)//栈空,报错
    return false;
    x=S.data [S.top];//栈顶元素先出栈
    S.top = S.top-1; //指针再减1
    //相当于x=S.data[S.top--];
    return true;
    }
    + +

    读栈顶元素

    //读栈项元素
    bool GetTop(SqStack S, ElemType &x){
    if(S.top==-1)//栈空,报错
    return false;
    x=S.data[S.top];//x记录栈顶元素
    return true;
    }
    + +

    销毁

    清空:top=-1

    +

    回收:系统自动回收

    +

    栈顶指针的另一种设计方式

    在初始化栈的时候 S.top=-1改为S.top=0

    +

    即设定top指向下一个元素

    +

    出栈和入栈等操作相应的改变

    S.data[++S.top]=x->S.data[S.top++]=x

    +

    x=S.data[S.top--]->x=S.data[--S.top]

    +

    缺点

    栈的大小不可变

    +

    共享栈

    两个栈共享一片空间

    +
    //定义
    #define MaxSize 10 //定义栈中元素的最大个数
    typedef struct{
    ElemType data [MaxSize]; //静态数组存放栈中元素
    int top0; //0号栈钱顶指针
    int top1; //1号栈浅顶指针
    } ShStack;

    //初始化栈
    void InitStack(ShStack &S){
    S.top0=-1; //初始化栈顶指针
    S.top1=MaxSize;
    }
    //判满
    top0+1==top1
    + +

    链栈

    相当于一个规定只能从头节点一侧进行操作的单链表

    +

    定义

    typedef struct Linknode{
    ElemType data;//数据域
    struct Linknode *next;//指针域
    }*LiStack;//栈类型定义
    + +]]>
    + + + + + 数据结构 + 顺序栈 + 共享栈 + 链栈 + +
    + + eclipse如何配置Spring + /2020/04/03/eclipse%E5%A6%82%E4%BD%95%E9%85%8D%E7%BD%AESpring/ + 仅限4.12版本以上

    +

    eclipse如何配置Spring

    查看自己的eclipse版本号

    + +

    help里找到About eclipse IDE

    +

    我这里版本号是4.14

    + + +

    去官网的仓库

    https://github.com/spring-projects/toolsuite-distribution/wiki/Spring-Tool-Suite-3

    + + +

    官方提供的历史版本最早的到了4.12

    +

    如果版本过低建议更新eclipse。

    +

    找自己的对应的版本号

    以 Latest STS3 Downloads 为例

    +

    注意用仓库下载不是这些连接

    + + +

    而是这一些

    + + +

    复制4.14的对应地址

    +

    https://download.springsource.com/release/TOOLS/update/3.9.12.RELEASE/e4.14/

    +

    打开eclipse

    找到Install new software–add

    + + +

    名字随便取 比如Springtool

    +

    location 填地址

    + + +

    点Add

    + + +

    然后全选–next–agree–等待就行

    +]]>
    + + Spring + + + 小白 + +
    + + helicon仿真(代码)合集 + /2023/06/13/helicon%E4%BB%BF%E7%9C%9F%EF%BC%88%E4%BB%A3%E7%A0%81%EF%BC%89%E5%90%88%E9%9B%86/ + + + + mybatis缓存 + /2020/03/04/mybatis%20%E7%BC%93%E5%AD%98/ + 查询缓存

    一级缓存:同一个SqlSession对象

    image-20200331082951809

    +

    MyBatis默认开启一级缓存,如果用同样的SqlSession对象查询相同的数据,则只会在第一次查询时向数据库发送SQL语句,并将查询的结果放入到SQLSESSION中(作为缓存在) ;后续再次查询该同样的对象时则直接从缓存中查询该对象即可(即省略了数据库的访问)。

    +

    二级缓存

    +

    Mybatis自带二级缓存: [同一个namespace]生成的mapper对象

    +

    MyBati s默认情况没有开启二级缓存,需要手工打开。

    +

    conf.xml中

    +
    <!-- 开启二级缓存 -->
    <setting name="cacheEnable" value="true"/>
    + +

    mapper中

    +
    <!-- 声明此namespace开启二级缓存 -->
    <cache/>
    + +

    异常提示:NotSerializableException可知,MyBatis的二级缓存是将对象放入硬盘文件中

    +

    序列化:内存->硬盘

    +

    反序列化:硬盘->内存

    +

    准备缓存的对象,必须实现了序列化接口( 如果开启的缓存Namespace="top.eshyee.mapper.StudentMapper" 可知序列化对象为Student,因此需要将Student序列化(序 列化Student类,以及Student的级联属性、和父类)

    +

    触发将对象写入二级缓存的时机: SqlSession对象的close()方法

    +

    回顾: namespace的值 就是接口的全类名(包名.类名) ,通过接口可以产生代理对象(Mapper对象)

    +

    –>namespace决定了Mapper对象的产生

    +

    结论:只要产生的xxxMapper对象来自于同一个namespace,则这些对象共享二级缓存。

    +

    如果是同一个SqISession对象进行多次相同的查询,则直接进入一级缓存查询;

    +

    image-20200331084348373

    +

    如果不是同一个SqISession对象进行多次相同的查询(但是均来自同一个namespace)则进入二级缓存查询

    +

    如果一个namespace, 如果有多个xxMapper. xml的namespace值相同, 则通过这些xxxMapper. xml产生的xxMapper,仍然共享二级缓存。

    +

    禁用:

    +

    在需要禁用的select标签中的usecache属性改为false

    +

    清理:与清理一级缓存的方法相同,一般执行增删改时会清理掉缓存 ,设计的原因是为了防止脏数据

    +

    commit();

    +

    commit会清理一级和二级缓存;但是清理二级缓存时,不能是查询自身的commit()

    +

    改标签

    +

    在select标签中设置flushCache= "true"

    +

    命中率:
    1 :0% 0.0

    +

    2:50% 0.5

    +

    3:2/3 0.666

    +

    4:3/4 0.75

    +

    三方提供的二级缓存:

    +

    ehicache、memcache

    +

    要想整合三方提供的二级缓存(或者自定义二级缓存) ,必须实现org.apache.ibatis.cache.Cache接口,该接口的默认实现类是PerpetualCache

    +

    整合ehcache二级缓存:

    +

    Ehcache-core.jar
    mybatis- Ehcache.jar
    slf4j-api.jar

    +

    编写ehcache配置文件Ehcache.xml

    +
    <ehcache xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:noNamespaceSchemaLocation="ehcache.xsd" updateCheck="true"
    monitoring="autodetect" dynamicConfig="true">
    <!-- 当二级缓存的对象超过内存限制时(缓存对象的个数>maxElements InMemory
    ),存放入的硬盘路径 -->
    <diskStore path="D:\Ehcache" />
    <!-- maxElementsInMemory:设置在内存中缓存对象的个数
    maxElementsOnDisk:设置在硬盘中缓存对象的个数
    eternal: 设置缓存是否永远不过期
    overflowToDisk:当内存中缓存的对象个数超过maxElementsInMemory的时候,是否转移到硬盘中
    timeToIdleSeconds:当2次访问超过该值的时候,将缓存对象失效
    timeToliveSeconds:一个缓存对象最多存放的时间(生命周期)
    diskExpiryThreadIntervalSeconds:设置每隔多长时间,通过一个线程来清理硬盘中的缓存
    memoryStioreEvictionPolicy: 当超过缓存对象的最大值时,处理的策略 LRU,FIFO,LFU
    -->

    <defaultCache

    maxElementsInMemory="1000"
    maxElementsOnDisk="1000000"
    eternal="false"
    overflowToDisk="false"
    timeToIdleSeconds="100"
    timeToLiveSeconds="100"
    diskExpiryThreadIntervalSeconds="120"
    memoryStoreEvictionPolicy="LRU">
    </defaultCache>

    </ehcache>
    + +

    配置mapper

    +
    <cache type= "org.mybatis.caches.ehcache.EhcacheCache">
    <property name= "maxELementsInMemory" value= "2000" />
    可以覆盖掉默认值
    </cache>
    + +]]>
    + + MyBatis系列 + + + Java + mybatis + 数据库 + 缓存 + +
    + + MyBatis进阶小练习 + /2020/04/01/mybatis%E5%B0%8F%E7%BB%83%E4%B9%A0/ + 环境说明:eclipse JDK13 Oracle11g

    +

    情景说明

    公司里各个部门的员工可以进行企业项目的申报,如果项目通过企业审核,可以投入企业的项目规划环节。

    +

    员工可以申请项目。一个员工申请多个项目,一个项目可以有多个员工。备注:

    +

    项目包含的数据项(项目编号,项目名称,项目内容,项目提交的时间

    +

    继续建设company数据库以及进行程序设计,完成上面关于多对多的映射案例。

    +

    设计三个表

    +

    员工表(empinfo)

    +

    项目表(cproject)

    +

    映射表(主要用于把两个主键映射起来,为了看着舒服一点,不创建也可以)

    +

    测试的公用部分

    +
    // 公用部分
    public static void connUntil() throws IOException {
    Reader reader = Resources.getResourceAsReader("conf.xml");
    SqlSessionFactory sessionfactory = new SqlSessionFactoryBuilder().build(reader);
    SqlSession session = sessionfactory.openSession();
    UserMapper stuMapper = session.getMapper(UserMapper.class);
    //qUserAll(stuMapper);
    //System.out.println(updateUserALL(stuMapper));
    //System.out.println(deleteUserALL(stuMapper)+"has been totally deleted.✔");
    //selectDepartAll(stuMapper);
    //System.out.println(addProject(stuMapper)+"的项目已经提交✔");
    //System.out.println(updateProject(stuMapper)+"行已经受影响✔");
    //System.out.println(delteProject(stuMapper)+"已经被删除✔");
    //queryprojectWithEid(stuMapper);
    //queryprojectWithDid(stuMapper);
    //queryprojectWithPName(stuMapper);
    session.commit();
    session.close();
    }
    public static void main(String[] args) throws IOException {
    connUntil();
    }
    //放一个map
    public static Map<String, Object> giveMeAMap() {
    User user = giveMeAUser();
    Map<String, Object> userMap = new HashMap<>();
    userMap.put("UNAMEin", user.getUserinfo().getuName());
    return userMap;
    }

    // 放一个user
    public static User giveMeAUser() {
    Detail detail = new Detail(3, "北京", "2085321569", "2085321569@qq.com");
    UserInfo userinfo = new UserInfo(3, "老张", "321321");
    User user = new User(userinfo, detail);
    return user;
    }
    //放一个EMP
    public static EmpInfo giveMeAEMP() {
    EmpInfo ep =new EmpInfo(1, "根哥",10,"女","12321212545");
    return ep;
    }
    + + + +

    (1)申请项目,插入操作。插入一个员工申请的项目。

    +

    SQL端制作一个存储过程

    +
    CREATE OR REPLACE PROCEDURE InsertPROJECT(PNAMEin IN VARCHAR2,PCONTENTin IN VARCHAR2,ENAMEin IN VARCHAR2,Informo OUT VARCHAR2)
    AS
    n1 NUMBER;--两个自增
    n2 NUMBER;
    BEGIN
    select PROJECTSEQ.nextval into n1 from dual;
    INSERT into CPROJECT(PID,PNAME,PCONTENT,PTIME) values (n1,PNAMEin,PCONTENTin,SYSDATE);
    select EPMAPPERSEQ.nextval into n2 from dual;
    INSERT INTO EPMAPPER(EPID,EID,PID) VALUES(n2,(SELECT e.EID FROM EMPINFO e WHERE e.ENAME=ENAMEin),n1);
    SELECT ENAME INTO Informo FROM EMPINFO e WHERE e.ENAME=ENAMEin;
    END;
    + +

    xml

    +
    <!-- 添加项目 -->
    <insert id="addProject" parameterType="HashMap" statementType="CALLABLE">
    {CALL InsertPROJECT(
    #{PNAMEin,jdbcType=VARCHAR,mode=IN},
    #{PCONTENTin,jdbcType=VARCHAR,mode=IN},
    #{ENAMEin,jdbcType=VARCHAR,mode=IN},
    #{Informo,jdbcType=VARCHAR,mode=OUT}
    )}
    </insert>
    + +

    测试

    +
    //insert一个项目

    public static String addProject(UserMapper stuMapper) throws IOException {
    Map<String, Object> empMap=new HashMap<>();
    EProject ep=new EProject("小项目","很小的一个项目");
    EmpInfo emp=giveMeAEMP();
    empMap.put("PNAMEin", ep.getpName());
    empMap.put("PCONTENTin", ep.getpContent());
    empMap.put("ENAMEin", emp.geteName());
    stuMapper.addProject(empMap);

    return (String) empMap.get("Informo");
    }
    + + + +

    (2)修改项目,更新操作。修改一个员工申请的项目。

    +

    对项目信息的更新相对简单一些

    +

    xml中

    +
    <!-- 更新项目 -->
    <update id="updateProject" parameterType="top.eshyee.entity.EProject">
    UPDATE CPROJECT p SET p.PNAME=#{pName},p.PCONTENT=#{pContent},p.PTIME=SYSDATE WHERE PID=#{pId}
    </update>
    + +

    测试集

    +
    //修改项目
    public static int updateProject(UserMapper stuMapper) throws IOException {
    EProject ep=new EProject(1,"成功的小项目","哈");
    return stuMapper.updateProject(ep);
    }
    + +

    测试结果

    +

    (3)删除项目,删除操作。删除一个员工申请的项目。

    +

    删除除了删掉项目本身以外 还应考虑删掉映射表中的映射关系

    +

    创建存储过程

    +
    CREATE OR REPLACE PROCEDURE delproject(PIDin IN NUMBER,PNameout OUT VARCHAR2)
    AS
    BEGIN
    SELECT PNAME INTO PNameout from CPROJECT WHERE PID=PIDin ;
    DELETE FROM EPMAPPER WHERE PID=PIDin;
    DELETE FROM CPROJECT WHERE PID=PIDin;

    END;
    + +

    配置xml

    +
    <delete id="delteProject" parameterType="HashMap" statementType="CALLABLE">
    {CALL delproject(
    #{PIDin,jdbcType=INTEGER,mode=IN},
    #{PNameout,jdbcType=VARCHAR,mode=OUT}
    )}
    </delete>
    + +

    测试集

    +
    //删除项目
    public static String delteProject (UserMapper stuMapper) throws IOException {
    Map<String, Object> userMap = new HashMap<>();
    userMap.put("PIDin", 5);
    stuMapper.delteProject(userMap);
    return (String) userMap.get("PNameout");
    }
    + + + +

    (4)查询项目,查询操作。进行多条件查询。根据员工编号,员工所在部门,员工的项目名称(模糊查询)等条件进行查询。

    +

    这里虽然使用到多对多的概念 但是mybatis目前没有真正意义上的多对多 ,需要使用到两个多对一。然后采用resultmap,这里提供另一个思路。

    +

    SQL端将三个表连接起来去重

    +
    SELECT A.*,B.EPID,C.* FROM EMPINFO A  ,EPMAPPER B ,CPROJECT C WHERE A.EID=B.EID AND B.PID=C.PID
    + +
    4	1	根哥	1013254621021	7	1	成功的小项目	哈	2020-03-24 17:39:14
    2 1 小王 912545236547 5 1 成功的小项目 哈 2020-03-24 17:39:14
    1 1 小刘 1121326545231 1 1 成功的小项目 哈 2020-03-24 17:39:14
    4 1 根哥 1013254621021 8 2 项目二 项目二 2020-03-12 09:07:37
    2 1 小王 912545236547 4 2 项目二 项目二 2020-03-12 09:07:37
    1 1 小刘 1121326545231 2 2 项目二 项目二 2020-03-12 09:07:37
    4 1 根哥 1013254621021 9 3 项目三 项目三 2020-03-15 09:08:03
    2 1 小王 912545236547 6 3 项目三 项目三 2020-03-15 09:08:03
    1 1 小刘 1121326545231 3 3 项目三 项目三 2020-03-15 09:08:03
    4 1 根哥 1013254621021 12 8 小项目 很小的一个项目 2020-03-24 17:13:17
    + +

    这样关系似乎更加明显了

    +

    然后再在mapper.xml文件中分别写三个查询就ok了

    +
    <!-- project查询 EID-->
    <select id="queryprojectWithEid" resultType="HashMap" parameterType="int">
    SELECT DISTINCT * FROM (
    <include refid="projectJoinAll"></include>
    ) WHERE EID=#{eId}
    </select>

    <!-- project查询 DID -->
    <select id="queryprojectWithDid" resultType="HashMap" parameterType="int">
    SELECT DISTINCT * FROM (
    <include refid="projectJoinAll"></include>
    ) WHERE DID=#{dId}
    </select>
    <!-- project查询 模糊项目名称 -->
    <select id="queryprojectWithPName" resultType="HashMap" parameterType="int">
    SELECT DISTINCT * FROM (
    <include refid="projectJoinAll"></include>
    ) WHERE PNAME like '%${pName}%'
    </select>

    <!-- 连接三个表 -->
    <sql id="projectJoinAll">
    SELECT A.*,B.EPID,C.* FROM EMPINFO A ,EPMAPPER B ,CPROJECT C WHERE A.EID=B.EID AND B.PID=C.PID
    </sql>
    + +

    测试文件中

    +
    //查询全部project相关 BY eId
    public static void queryprojectWithEid(UserMapper stuMapper) throws IOException {
    List<Map<String, Object>> map=stuMapper.queryprojectWithEid(1);
    System.out.println("根据员工编号查询");
    for(int i=0;i<map.size();i++) {
    System.out.println(map.get(i));

    }
    }
    //查询全部project相关 BY dId
    public static void queryprojectWithDid(UserMapper stuMapper) throws IOException {
    List<Map<String, Object>> map=stuMapper.queryprojectWithDid(1);
    System.out.println("根据员工所在部门查询");
    for(int i=0;i<map.size();i++) {
    System.out.println(map.get(i));

    }
    }
    //查询全部project相关 BY pName
    public static void queryprojectWithPName(UserMapper stuMapper) throws IOException {
    List<Map<String, Object>> map=stuMapper.queryprojectWithPName("项目三");
    System.out.println("根据项目名称模糊查询");
    for(int i=0;i<map.size();i++) {
    System.out.println(map.get(i));

    }
    }
    // 公用部分
    + +

    测试结果

    +

    QQ图片20200324193915

    +]]>
    + + MyBatis系列 + + + MyBatis + 类型处理器 + 存储过程 + 动态sql + 关联查询 + 一对多 + log4j + 延迟加载 + 二级缓存 + +
    + + python入门 + /2020/03/05/python%E5%85%A5%E9%97%A8/ + python入门

    输出

    打印的几个语法

    +
    #输出数字 字符串
    print(1)
    print(1.1)
    print('hape')
    #输出运算结果
    print(1+1)

    #输出到文件
    fp=open('D:/Shyee.txt','a+')
    print('??!!??ioio',file=fp)
    fp.close()
    #不换行输出
    print('hi','I','am','Shyee')
    #转移字符实现换行
    print("转移\n字符")

    #\t 空一格子表位(默认为四个字符,及占四个字符的整数倍,详细参考存储)
    #\r 回车(覆盖之前的输出)
    #\b 退格
    + +
    #原字符,在输出之前加一个r或者R,使得转义字符不起作用
    print(R'原字\n符')
    + +
    #赋值
    name='shyee'
    print(name)
    print('标识',id(name))
    print('类型',type(name))
    print('值',name)
    + +

    运行结果:

    +

    shyee
    标识 1739219025136
    类型 <class ‘str’>
    值 shyee

    +

    0b 二进制
    0o 八进制
    0x 十六进制

    +
    #小数加减法提高精度
    print(1.1+2.2)
    from decimal import Decimal
    print(Decimal('1.1')+Decimal('2.2'))
    + +

    运行结果

    +

    3.3000000000000003
    3.3

    +

    open参数

    +

    类型转换

    +

    ->string:str()

    +
    print('I am '+str(16)+' years old')
    + +

    运行结果

    +

    I am 16 years old

    +

    ->int :int()

    +

    字符串为小数串不能转为int,必须是数字串(整数)

    +

    ->float :float()

    +

    输入

    #输入
    key=input("输入前的提示语")
    print(key)
    + +
    #输入两个整数,求整数的和
    print(int(input("第一个整数"))+int(input("第二个整数")))
    + +

    运行结果

    +

    第一个整数1
    第二个整数1
    2

    +

    加+ 减- 乘* 除/

    +

    整除//(一正一负的整除结果都是向下取整)

    +

    取余% (余数=被除数-除数*商)

    +

    求幂运算** (2**3,2的3次方)

    +

    赋值

    +
    a=b=c=20;
    print(a,id(a))
    print(b,id(b))
    print(c,id(c))
    + +

    运行结果:

    +

    20 140718458633888
    20 140718458633888
    20 140718458633888

    +

    解包赋值

    +
    q,w,e=1,2,3
    print(q,w,e)
    + +

    运行结果:

    +

    1 2 3

    +

    实现swap函数

    +
    #实现交换
    q,w,e=w,e,q
    print(q,w,e)
    + +

    运行结果:

    +

    2 3 1

    +

    “==”与”is”

    +

    == 比较的是value值

    +

    is比较的是标识(id)

    +
    a=10
    b=10
    print(a==b)
    print(a is b)

    arr1=[1,2,3,4]
    arr2=[1,2,3,4]
    print(arr1==arr2)
    print(arr1 is arr2)
    print(id(arr1))
    print(id(arr2))
    print(arr1 is not arr2)
    + +

    运行结果:

    +

    True
    True
    True
    False
    2293512569096
    2293512569480
    True

    +

    not 取反

    +
    #not 取反
    print(a==b)
    print(not a==b)
    + +

    运行结果:

    +

    True
    False

    +

    in和not in

    +
    #in&not in
    print('s' in 'shyee')
    print('l' not in 'shyee')
    print(a in arr2)
    + +

    运行结果:

    +

    True
    True
    False

    +

    按位与&按位或

    +
    print(4&8)
    # 4:0100
    # 8:1000
    #按位与为0000
    print(4|8)
    #按位或为1100
    + +

    运行结果:0 12

    +

    左移<<和右移>>

    +
    a=4
    print(a<<1)
    while a<100:
    a=a<<1
    print(a)
    a=4
    # print(a>>1)
    while a>0:
    a=a>>1
    print(a)
    #正数右移到最后为0
    #负数右移到最后为-1
    a=-4
    print(a>>1>>1>>1)
    + +

    运行结果:

    +

    8
    8
    16
    32
    64
    128

    +

    2
    1
    0

    +

    -1

    +

    优先级:算数运算符>移位运算符(包括& 、|)>比较运算符>与或运算符>赋值运算符

    +

    0的布尔值为false none的bool为false

    +

    ‘ ‘的布尔值为false(空的数据结构都是false)

    +
    if 90<=int(input('输入数值'))<=100:
    print('数字在90~100之间')
    print('数值在90~100之间' if 90<=int(input('输入数值'))<=100 else '数值不在90~100之间')
    + +

    运行结果:

    +

    输入数值99
    数字在90100之间
    输入数值60
    数值不在90
    100之间

    +

    pass在while中与continue的区别,break还是那个break

    +
    i=10
    while i>0:
    i-=1
    print(i)
    pass
    print("pass")
    print('----continue----')
    i=10
    while i>0:
    i-=1
    print(i)
    continue
    print("continue")
    print('----break----')
    i=10
    while i>0:
    i-=1
    print(i)
    break
    print("break")
    + +

    运行结果:

    +

    9
    pass
    8
    pass
    7
    pass
    6
    pass
    5
    pass
    4
    pass
    3
    pass
    2
    pass
    1
    pass
    0
    pass
    —-continue—-
    9
    8
    7
    6
    5
    4
    3
    2
    1
    0
    —-break—-
    9

    +

    range

    +
    #range
    print(range(10))
    print(list(range(10)))
    print(list(range(1,10)))#默认步长为1
    print(list(range(1,10,2)))#步长为2
    print(2 in list(range(1,10,2)))
    + +

    运行结果:

    +

    range(0, 10)
    [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
    [1, 2, 3, 4, 5, 6, 7, 8, 9]
    [1, 3, 5, 7, 9]
    False

    +

    for in

    +
    for i in 'shyee':
    print(i)
    + +

    运行结果:

    +

    s
    h
    y
    e
    e

    +
    for _ in range(4):
    print('Shyee')
    + +

    运行结果:

    +

    Shyee
    Shyee
    Shyee
    Shyee

    +

    求1~100之间的偶数和

    +
    n=0
    c=0
    for _ in range(1,101,2):
    n+=2
    c+=n
    print(c)
    + +

    运行结果:2550

    +

    找到100~999之间的水仙花数

    +
    i=100
    for _ in range(100,1000):
    if ((i%10)**3+(int(i/10)%10)**3+(int(i/100)%10)**3)==i:
    print(i,'是水仙花数')
    i += 1
    + +

    运行结果:

    +

    153 是水仙花数
    370 是水仙花数
    371 是水仙花数
    407 是水仙花数

    +]]>
    + + python + + + 入门 + python + +
    + + mysql的一点东西 + /2020/04/01/mysql%E7%9A%84%E4%B8%80%E7%82%B9%E4%B8%9C%E8%A5%BF/ + mysql的一点东西

    增删改查–数据记录常见操作

    –如何在数据库服务器中创建数据库

    mysql> Create database test;
    Query OK, 1 row affected (0.02 sec)

    mysql> use test
    Database changed

    + +

    –如何查看某个数据库中所有的数据表

    mysql> show tables;
    Empty set (0.01 sec)

    + +

    –如何创建一个数据表

    CREATE TABLE pet (
    name VARCHAR(20),
    owner VARCHAR(20),
    specials VARCHAR(20),
    sex VARCHAR(1),
    birth DATE,
    death DATE);
    Query OK, 0 rows affected (0.08 sec)

    + +

    –查看数据表是否创建成功

    mysql> show tables;
    +----------------+
    | Tables_in_test |
    +----------------+
    | pet |
    +----------------+
    1 row in set (0.00 sec)
    + +

    –查看创建好的数据表的结构

    mysql> describe pet;
    +----------+-------------+------+-----+---------+-------+
    | Field | Type | Null | Key | Default | Extra |
    +----------+-------------+------+-----+---------+-------+
    | name | varchar(20) | YES | | NULL | |
    | owner | varchar(20) | YES | | NULL | |
    | specials | varchar(20) | YES | | NULL | |
    | sex | varchar(1) | YES | | NULL | |
    | birth | date | YES | | NULL | |
    | death | date | YES | | NULL | |
    +----------+-------------+------+-----+---------+-------+
    6 rows in set (0.00 sec)
    + +

    –查看表中的记录

    mysql> select * from pet;
    Empty set (0.00 sec)

    + +

    –如何往数据表中添加数据记录

    mysql> INSERT INTO pet
    -> VALUES('Puffball','Diane','hamster','f','1999-03-30',NULL);
    Query OK, 1 row affected (0.02 sec)

    + +

    –再一次查询

    mysql> select * from pet;
    +----------+-------+----------+------+------------+-------+
    | name | owner | specials | sex | birth | death |
    +----------+-------+----------+------+------------+-------+
    | Puffball | Diane | hamster | f | 1999-03-30 | NULL |
    +----------+-------+----------+------+------------+-------+
    1 row in set (0.00 sec)

    INSERT INTO pet
    VALUES('旺财','周星驰','狗','公','1990-01-01',NULL);
    mysql> select * from pet;
    +----------+-----------+----------+------+------------+-------+
    | name | owner | specials | sex | birth | death |
    +----------+-----------+----------+------+------------+-------+
    | Puffball | Diane | hamster | f | 1999-03-30 | NULL |
    | 旺财 | 周星驰 ||| 1990-01-01 | NULL |
    +----------+-----------+----------+------+------------+-------+
    2 rows in set (0.00 sec)

    + +

    –MySQL常用数据类型有哪些

    –MySQL支持多种类型,大致可以分为三类:

    +

    –数值

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    TINYINT1 字节(-128,127)(0,255)小整数值
    SMALLINT2 字节(-32 768,32 767)(0,65 535)大整数值
    MEDIUMINT3 字节(-8 388 608,8 388 607)(0,16 777 215)大整数值
    INT或INTEGER4 字节(-2 147 483 648,2 147 483 647)(0,4 294 967 295)大整数值
    BIGINT8 字节(-9,223,372,036,854,775,808,9 223 372 036 854 775 807)(0,18 446 744 073 709 551 615)极大整数值
    FLOAT4 字节(-3.402 823 466 E+38,-1.175 494 351 E-38),0,(1.175 494 351 E-38,3.402 823 466 351 E+38)0,(1.175 494 351 E-38,3.402 823 466 E+38)单精度 浮点数值
    DOUBLE8 字节(-1.797 693 134 862 315 7 E+308,-2.225 073 858 507 201 4 E-308),0,(2.225 073 858 507 201 4 E-308,1.797 693 134 862 315 7 E+308)0,(2.225 073 858 507 201 4 E-308,1.797 693 134 862 315 7 E+308)双精度 浮点数值
    DECIMAL对DECIMAL(M,D) ,如果M>D,为M+2否则为D+2依赖于M和D的值依赖于M和D的值小数值
    +
    mysql> Create table testType(
    -> Number TINYINT
    -> );
    Query OK, 0 rows affected (0.08 sec)

    mysql> show tables;
    +----------------+
    | Tables_in_test |
    +----------------+
    | pet |
    | testtype |
    +----------------+
    2 rows in set (0.00 sec)
    + +
    mysql> describe testtype;
    +--------+------------+------+-----+---------+-------+
    | Field | Type | Null | Key | Default | Extra |
    +--------+------------+------+-----+---------+-------+
    | Number | tinyint(4) | YES | | NULL | |
    +--------+------------+------+-----+---------+-------+
    1 row in set (0.00 sec)

    mysql> INSERT INTO testType VALUES(127);
    Query OK, 1 row affected (0.02 sec)

    mysql> select * from testtype;
    +--------+
    | Number |
    +--------+
    | 127 |
    +--------+
    1 row in set (0.00 sec)

    mysql> INSERT INTO testType VALUES(128);
    ERROR 1264 (22003): Out of range value for column 'Number' at row 1

    + +

    –日期/时间

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    类型大小 (字节)范围格式用途
    DATE31000-01-01/9999-12-31YYYY-MM-DD日期值
    TIME3‘-838:59:59’/‘838:59:59’HH:MM:SS时间值或持续时间
    YEAR11901/2155YYYY年份值
    DATETIME81000-01-01 00:00:00/9999-12-31 23:59:59YYYY-MM-DD HH:MM:SS混合日期和时间值
    TIMESTAMP41970-01-01 00:00:00/2038 结束时间是第 2147483647 秒,北京时间 2038-1-19 11:14:07,格林尼治时间 2038年1月19日 凌晨 03:14:07YYYYMMDD HHMMSS混合日期和时间值,时间戳
    +

    –字符串(字符)类型

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    类型大小用途
    CHAR0-255字节定长字符串
    VARCHAR0-65535 字节变长字符串
    TINYBLOB0-255字节不超过 255 个字符的二进制字符串
    TINYTEXT0-255字节短文本字符串
    BLOB0-65 535字节二进制形式的长文本数据
    TEXT0-65 535字节长文本数据
    MEDIUMBLOB0-16 777 215字节二进制形式的中等长度文本数据
    MEDIUMTEXT0-16 777 215字节中等长度文本数据
    LONGBLOB0-4 294 967 295字节二进制形式的极大文本数据
    LONGTEXT0-4 294 967 295字节极大文本数据
    +

    –如何往数据库里插入数据

    INSERT INTO pet VALUES('Fluffy','Harold','cat','f','1993-02-04',NULL);
    INSERT INTO pet VALUES('Claws','Gwen','cat','m','1994-03-17',NULL);
    INSERT INTO pet VALUES('Buffy','Harold','dog','f','1989-05-13',NULL);
    INSERT INTO pet VALUES('Fang','Benny','dog','m','1990-08-27',NULL);
    INSERT INTO pet VALUES('Bowser','Diane','dog','m','1979-08-31','1995-07-29');
    INSERT INTO pet VALUES('Chirpy','Gwen','bird','f','1998-09-11',NULL);
    INSERT INTO pet VALUES('Whistler','Gwen','bird',NULL,'1997-12-09',NULL) ;
    INSERT INTO pet VALUES('Slim','Benny','snake','m','1996-04-29',NULL);
    INSERT INTO pet VALUES('Puffball','Diane','hamster','f','1999-03-30',NULL);

    mysql> select * from pet;
    +----------+-----------+----------+------+------------+------------+
    | name | owner | specials | sex | birth | death |
    +----------+-----------+----------+------+------------+------------+
    | Puffball | Diane | hamster | f | 1999-03-30 | NULL |
    | 旺财 | 周星驰 ||| 1990-01-01 | NULL |
    | Fluffy | Harold | cat | f | 1993-02-04 | NULL |
    | Claws | Gwen | cat | m | 1994-03-17 | NULL |
    | Buffy | Harold | dog | f | 1989-05-13 | NULL |
    | Fang | Benny | dog | m | 1990-08-27 | NULL |
    | Bowser | Diane | dog | m | 1979-08-31 | 1995-07-29 |
    | Chirpy | Gwen | bird | f | 1998-09-11 | NULL |
    | Whistler | Gwen | bird | NULL | 1997-12-09 | NULL |
    | Slim | Benny | snake | m | 1996-04-29 | NULL |
    | Puffball | Diane | hamster | f | 1999-03-30 | NULL |
    +----------+-----------+----------+------+------------+------------+
    11 rows in set (0.00 sec)
    + +

    –如何删除数据

    mysql> delete from pet where name = 'Fluffy';
    Query OK, 1 row affected (0.02 sec)
    + +

    –如何修改数据

    mysql> update pet set name='旺旺财' where owner ='周星驰';
    Query OK, 1 row affected (0.01 sec)
    Rows matched: 1 Changed: 1 Warnings: 0

    + +

    –数据记录常见操作

    --增加
    INSERT
    --删除
    DELETE
    --修改
    UPDATE
    --查询
    SELECT
    + +

    建表约束

    –主键约束

    它能够唯一确定一张表中的一条记录,也就我们通过某个字段添加约束,可以使得字段不重复且不为空。

    +
    create table user(
    id int primary key,
    name varchar(20)
    );

    mysql> insert into user values(1,'张三');
    Query OK, 1 row affected (0.02 sec)

    mysql> insert into user values(1,'张三');
    ERROR 1062 (23000): Duplicate entry '1' for key 'PRIMARY'

    mysql> insert into user values(2,'张三');
    Query OK, 1 row affected (0.01 sec)

    mysql> select * from user;
    +----+--------+
    | id | name |
    +----+--------+
    | 1 | 张三 |
    | 2 | 张三 |
    +----+--------+
    2 rows in set (0.00 sec)
    + +
    mysql> insert into user values(NULL,'张三');
    ERROR 1048 (23000): Column 'id' cannot be null
    + +
    –联合主键
    –只要联合的主键值(均不为空)加起来不重复就OK
    mysql> create table user2(
    -> id int,
    -> name varchar(20),
    -> password varchar(20),
    -> primary key(id,name)
    -> ) ;
    Query OK, 0 rows affected (0.07 sec)
    + +
    mysql> insert into user2 values(1,'张三','123');
    Query OK, 1 row affected (0.02 sec)

    mysql> insert into user2 values(1,'张三','123');
    ERROR 1062 (23000): Duplicate entry '1-张三' for key 'PRIMARY'
    mysql> insert into user2 values(2,'张三','123');
    Query OK, 1 row affected (0.01 sec)
    mysql> insert into user2 values(1,'李四','123');
    Query OK, 1 row affected (0.01 sec)
    + +
    mysql> select * from user2
    -> ;
    +----+--------+----------+
    | id | name | password |
    +----+--------+----------+
    | 1 | 张三 | 123 |
    | 1 | 李四 | 123 |
    | 2 | 张三 | 123 |
    +----+--------+----------+
    3 rows in set (0.00 sec)
    + +

    –自增约束

    –auto_increment
    create table user3(
    id int primary key auto_increment,
    name varchar(20)
    );
    + +
    mysql> insert into user3 (name) values('zhangsan');
    Query OK, 1 row affected (0.02 sec)

    mysql> select * from user3;
    +----+----------+
    | id | name |
    +----+----------+
    | 1 | zhangsan |
    +----+----------+
    1 row in set (0.00 sec)
    mysql> insert into user3 (name) values('zhangsan');
    Query OK, 1 row affected (0.01 sec)

    mysql> select * from user3;
    +----+----------+
    | id | name |
    +----+----------+
    | 1 | zhangsan |
    | 2 | zhangsan |
    +----+----------+
    2 rows in set (0.00 sec)

    + +
    –如果创建表的时候忘记创建主键约束
    mysql> create table user4(
    -> id int,
    -> name varchar(20)
    -> );
    Query OK, 0 rows affected (0.07 sec)

    mysql> desc user4;
    +-------+-------------+------+-----+---------+-------+
    | Field | Type | Null | Key | Default | Extra |
    +-------+-------------+------+-----+---------+-------+
    | id | int(11) | YES | | NULL | |
    | name | varchar(20) | YES | | NULL | |
    +-------+-------------+------+-----+---------+-------+
    2 rows in set (0.00 sec)
    + +
    –修改表结构,添加主键
    mysql> alter table user4 add primary key(id);
    Query OK, 0 rows affected (0.14 sec)
    Records: 0 Duplicates: 0 Warnings: 0

    mysql> desc user4;
    +-------+-------------+------+-----+---------+-------+
    | Field | Type | Null | Key | Default | Extra |
    +-------+-------------+------+-----+---------+-------+
    | id | int(11) | NO | PRI | NULL | |
    | name | varchar(20) | YES | | NULL | |
    +-------+-------------+------+-----+---------+-------+
    2 rows in set (0.00 sec)
    + +
    –如何删除
    mysql> alter table user4 drop primary key;
    Query OK, 0 rows affected (0.14 sec)
    Records: 0 Duplicates: 0 Warnings: 0

    mysql> desc user4;
    +-------+-------------+------+-----+---------+-------+
    | Field | Type | Null | Key | Default | Extra |
    +-------+-------------+------+-----+---------+-------+
    | id | int(11) | NO | | NULL | |
    | name | varchar(20) | YES | | NULL | |
    +-------+-------------+------+-----+---------+-------+
    2 rows in set (0.00 sec)
    + +
    –使用modify 修改字段添加约束
    mysql> alter table user4 modify id int primary key;
    Query OK, 0 rows affected (0.12 sec)
    Records: 0 Duplicates: 0 Warnings: 0

    mysql> desc user4;
    +-------+-------------+------+-----+---------+-------+
    | Field | Type | Null | Key | Default | Extra |
    +-------+-------------+------+-----+---------+-------+
    | id | int(11) | NO | PRI | NULL | |
    | name | varchar(20) | YES | | NULL | |
    +-------+-------------+------+-----+---------+-------+
    2 rows in set (0.00 sec)
    + +

    –唯一约束

    –约束修饰字段的值不可以重复

    +
    mysql> create table user5(
    -> id int,
    -> name varchar(20)
    -> );
    Query OK, 0 rows affected (0.07 sec)

    mysql> alter table user5 add unique(name);
    Query OK, 0 rows affected (0.04 sec)
    Records: 0 Duplicates: 0 Warnings: 0

    mysql> desc user5;
    +-------+-------------+------+-----+---------+-------+
    | Field | Type | Null | Key | Default | Extra |
    +-------+-------------+------+-----+---------+-------+
    | id | int(11) | YES | | NULL | |
    | name | varchar(20) | YES | UNI | NULL | |
    +-------+-------------+------+-----+---------+-------+
    2 rows in set (0.00 sec)

    mysql> insert into user5 values(1,'zhangsan');
    Query OK, 1 row affected (0.01 sec)

    mysql> insert into user5 values(1,'zhangsan');
    ERROR 1062 (23000): Duplicate entry 'zhangsan' for key 'name'
    mysql> insert into user5 values(1,'lisi');
    Query OK, 1 row affected (0.01 sec)
    + +
    create table user6(
    id int,
    name varchar(20),
    unique(name)
    );

    create table user7(
    id int,
    name varchar(20) unique
    );


    create table user8(
    id int,
    name varchar(20),
    unique(id,name)
    );
    + +
    –两个键在一起不重复就OK
    Query OK, 0 rows affected (0.08 sec)

    mysql> desc user8;
    +-------+-------------+------+-----+---------+-------+
    | Field | Type | Null | Key | Default | Extra |
    +-------+-------------+------+-----+---------+-------+
    | id | int(11) | YES | MUL | NULL | |
    | name | varchar(20) | YES | | NULL | |
    +-------+-------------+------+-----+---------+-------+
    2 rows in set (0.00 sec)

    mysql> insert into user8 values(1,'zhangsan');
    Query OK, 1 row affected (0.02 sec)

    mysql> insert into user8 values(2,'zhangsan');
    Query OK, 1 row affected (0.02 sec)
    + +
    –如何删除唯一约束
    alter table user7 drop index name;
    Query OK, 0 rows affected (0.03 sec)
    Records: 0 Duplicates: 0 Warnings: 0

    mysql> desc user7;
    +-------+-------------+------+-----+---------+-------+
    | Field | Type | Null | Key | Default | Extra |
    +-------+-------------+------+-----+---------+-------+
    | id | int(11) | YES | | NULL | |
    | name | varchar(20) | YES | | NULL | |
    +-------+-------------+------+-----+---------+-------+
    2 rows in set (0.00 sec)
    + +
    –modify添加
    alter table user7 modify name varchar(20) unique;
    Query OK, 0 rows affected (0.04 sec)
    Records: 0 Duplicates: 0 Warnings: 0

    mysql> desc user7;
    +-------+-------------+------+-----+---------+-------+
    | Field | Type | Null | Key | Default | Extra |
    +-------+-------------+------+-----+---------+-------+
    | id | int(11) | YES | | NULL | |
    | name | varchar(20) | YES | UNI | NULL | |
    +-------+-------------+------+-----+---------+-------+
    2 rows in set (0.00 sec)
    + +

    –总结

    –1 建表的时候添加约束
    –2 alter add
    –3 alter modify
    –4 删除 alter drop

    –非空约束

    –修饰的字段不能为空 NULL

    create table user9(
    id int,
    name varchar(20) not null
    );
    Query OK, 0 rows affected (0.07 sec)

    mysql> desc user9;
    +-------+-------------+------+-----+---------+-------+
    | Field | Type | Null | Key | Default | Extra |
    +-------+-------------+------+-----+---------+-------+
    | id | int(11) | YES | | NULL | |
    | name | varchar(20) | NO | | NULL | |
    +-------+-------------+------+-----+---------+-------+
    2 rows in set (0.00 sec)

    insert into user9 (id) values(1);
    ERROR 1364 (HY000): Field 'name' doesn't have a default value

    insert into user9 values(1,'张三');
    Query OK, 1 row affected (0.01 sec)
    mysql> select * from user9;
    +------+--------+
    | id | name |
    +------+--------+
    | 1 | 张三 |
    +------+--------+
    1 row in set (0.00 sec)

    insert into user9 (name) values('lisi');
    mysql> insert into user9 (name) values('lisi');
    Query OK, 1 row affected (0.01 sec)

    mysql> select * from user9;
    +------+--------+
    | id | name |
    +------+--------+
    | 1 | 张三 |
    | NULL | lisi |
    +------+--------+
    2 rows in set (0.00 sec)
    + +

    –默认约束

    –当插入字段值的时候,如果没有传值,就会使用默认值

    +
    create table user10(
    id int,
    name varchar(20),
    age int default 10
    );
    Query OK, 0 rows affected (0.07 sec)

    mysql> desc user10;
    +-------+-------------+------+-----+---------+-------+
    | Field | Type | Null | Key | Default | Extra |
    +-------+-------------+------+-----+---------+-------+
    | id | int(11) | YES | | NULL | |
    | name | varchar(20) | YES | | NULL | |
    | age | int(11) | YES | | 10 | |
    +-------+-------------+------+-----+---------+-------+
    3 rows in set (0.00 sec)

    insert into user10 (id,name) values(1,'zhangsan');
    Query OK, 1 row affected (0.02 sec)

    mysql> select * from user10;
    +------+----------+------+
    | id | name | age |
    +------+----------+------+
    | 1 | zhangsan | 10 |
    +------+----------+------+
    1 row in set (0.00 sec)
    + +
    –传了值就不会使用默认值
    insert into user10 values(1,'zhangsan',19);
    Query OK, 1 row affected (0.02 sec)

    mysql> select * from user10;
    +------+----------+------+
    | id | name | age |
    +------+----------+------+
    | 1 | zhangsan | 10 |
    | 1 | zhangsan | 19 |
    +------+----------+------+
    2 rows in set (0.00 sec)

    + +

    –外键约束

    –牵扯到两个表:父表、子表
    –主表、副表

    –班级

    +

    create table classes(

    +

    id int primary key,

    +

    name varchar(20)

    +

    );

    +

    –学生

    +
    create table students(
    id int primary key,
    name varchar(20),
    class_id int,
    foreign key(class_id) references classes(id)
    );

    insert into classes values(1,'一班');
    insert into classes values(2,'二班');
    insert into classes values(3,'三班');
    insert into classes values(4,'四班');
    mysql> select * from classes;
    +----+--------+
    | id | name |
    +----+--------+
    | 1 | 一班 |
    | 2 | 二班 |
    | 3 | 三班 |
    | 4 | 四班 |
    +----+--------+
    4 rows in set (0.00 sec)

    insert into students values(1001,'张三',1);
    insert into students values(1002,'张三',2);
    insert into students values(1003,'张三',3);
    insert into students values(1004,'张三',4);

    insert into students values(1005,'张三',5);
    ERROR 1452 (23000): Cannot add or update a child row: a foreign key constraint fails (`test`.`students`, CONSTRAINT `students_ibfk_1` FOREIGN KEY (`class_id`) REFERENCES `classes` (`id`))

    --1 主表classes中没有的数据值,在副表中是不可以使用的
    --2 主表中的记录被副标使用,是不可以删除的


    delete from classes where id=4;
    ERROR 1451 (23000): Cannot delete or update a parent row: a foreign key constraint fails (`test`.`students`, CONSTRAINT `students_ibfk_1` FOREIGN KEY (`class_id`) REFERENCES `classes` (`id`))
    + +

    三大范式

    –1.第一范式

    –1NF

    –数据表中的所有字段都是不可分割的原子值

    +
    create table student2(
    id int primary key,
    name varchar(20),
    address varchar(30)
    );

    insert into student2 values(1,'张三','中国山东省东营市东营区济南路100号');
    insert into student2 values(2,'李四','中国山东省东营市东营区东二路200号');
    insert into student2 values(3,'王五','中国山东省东营市广饶县天府路300号');
    mysql> select * from student2;
    +----+--------+--------------------------------------------------+
    | id | name | address |
    +----+--------+--------------------------------------------------+
    | 1 | 张三 | 中国山东省东营市东营区济南路100|
    | 2 | 李四 | 中国山东省东营市东营区东二路200|
    | 3 | 王五 | 中国山东省东营市广饶县天府路300|
    +----+--------+--------------------------------------------------+
    3 rows in set (0.00 sec)

    + +
    –字段值还可以继续拆分的,不满足第一范式
     
    create table student3(
    id int primary key,
    name varchar(20),
    country varchar(30),
    privence varchar(30),
    city varchar(30),
    details varchar(30)
    );

    insert into student3 values(1,'张三','中国','山东省','东营市','东营区济南路100号');
    insert into student3 values(2,'李四','中国','山东省','东营市','东营区东二路200号');
    insert into student3 values(3,'王五','中国','山东省','东营市','广饶县天府路300号');
    mysql> select * from student3;
    +----+--------+---------+-----------+-----------+--------------------------+
    | id | name | country | privence | city | details |
    +----+--------+---------+-----------+-----------+--------------------------+
    | 1 | 张三 | 中国 | 山东省 | 东营市 | 东营区济南路100|
    | 2 | 李四 | 中国 | 山东省 | 东营市 | 东营区东二路200|
    | 3 | 王五 | 中国 | 山东省 | 东营市 | 广饶县天府路300|
    +----+--------+---------+-----------+-----------+--------------------------+
    3 rows in set (0.00 sec)

    + +
    –范式设计的越详细,对于某些实际操作可能更好,但是不一定都是好处

    –第二范式

    –必须满足第一范式的前提下,第二范式要求,除主键外的每一列都必须完全依赖于主键

    +

    –如果出现不完全依赖,只可能发生在联合主键的情况下

    +
    create table myorder(
    product_id int,
    customer_id int,
    product_name varchar(20),
    customer_name varchar(20),
    primary key(product_id,customer_id)
    );
    + +
    –问题
    –除主键以外的其他列,只依赖于主键的其他部分字段
    –拆表
    create table myorder(
    order_id primary key,
    product_id int,
    customer_id int
    );

    create table product(
    id int,
    name varchar(20)
    );

    create table customer(
    id int primary key,
    name varchar(20)
    );

    + +
    –分成三个表之后完全依赖 满足第二范式

    –第三范式

    –3NF

    +

    –必须先满足第二范式,除开主键列的其他列之间不能有传递关系

    +
    create table myorder(
    order_id primary key,
    product_id int,
    customer_id int
    );

    create table customer(
    id int primary key,
    name varchar(20)
    phone varchar(15)
    );
    + +

    查询练习

    1.查询student表中所有记录
    select * from student;

    2.查询student表中所有记录的sname 、ssex、class、
    select sname,ssex,class from student;

    3.查询教师所有的单位即不重复的depart列
    distinct 排除重复
    select distinct depart from teacher;

    4.查询score表中成绩在6080之间的记录
    查询区间 betweenand
    select * from score where degree between 60 and 80
    或者
    selet * from score where degree > 60 and degree <80;

    5.查询score表中成绩为858688 的记录
    表示或者关系的查询 in
    select * from score where degree in (85,86,88);

    6.查询student表中“95031”班或性别为“女”的同学的记录
    or 表示或者
    select * from student where class='95031' or ssex='女';

    7.以class降序查询student表的所有记录
    升序asc,降序desc
    select * from studnt order by class desc;
    默认升序
    select * from studnt order by class (asc);

    8.以cno升序、degree降序查询score表中的所有记录
    select * from student score oder by cno asc,degree desc;

    9.查询“95031”班 的学生人数
    统计 count
    select count(*) from student where class='95031';

    10.查询score表中的最高分的学生学号和课程号(子查询或排序)
    select sno,cno from score where degree=(select max(degree) from score);
    1、找到最高分
    select max(degree) from score;
    2、找最高分的sno 和cno
    select sno,cno from score where degree=(select max(degree) from score);
    排序的做法
    select sno,cno from score oder by degree;
    select sno,cno from score oder by degree desc limit 0,1;
    limit a,b
    a=从第几条开始查
    b=查多少条


    11.查询每门课的平均成绩
    分开去找
    select * from course;

    avg()
    select avg(degree) from score where cno-'3-105';
    select degree from score where cno ='3-105';
    在一个sql中写
    group by 分组
    select cno,avg(degree) from score group by cno;

    12.查询score表中至少有两名学生选修的并以3开头的课程的平均数
    select cno,avg(degree) from score
    group by cno
    having count(cno)>=2
    and cno like '3%';

    13.查询分数大于70,小于90的sno列
    select sno ,dgree from score
    where degree >70 and degree <90;
    或者
    select sno ,dgree from score
    where degree between 70 and 90;


    14.查询所有学生的sname cno 和degree列
    select sname from student;
    select cno,degree from score;

    多表查询
    select sname,cno,degree from student,score
    where student.sno=score.sno;

    15.查询所有学生的sno cname 和degree 列
    select sno,cname,degree from course,score
    where course.cno=score.cno;

    16.查询所有学生的sname cname和degree 列
    sname->student
    cname->course
    degree->score
    select sname,cname,degree from student,course,score
    where student.sno=score.sno and course.cno=score.cno;

    17.查询“95031”班学生每门课的平均成绩
    分步思路
    select * from student where class ='95031';
    select sno from student where class='95031';
    select * from score where sno in(select * from student where class ='95031');

    合并
    select cno,avg(degree)
    from score
    where sno in (select sno from student where class='95031')
    group by cno;

    18.查询选修“3-105”课程的成绩高于“109”号同学“3-105”成绩的所有同学的记录
    select degree from score where sno='109' and cno='3-105';

    select *from score where cno='3-105' and degree>(select degree from score where sno='109' and cno='3-105');

    19.查询成绩高于学号为“109”、课程号为“3-105”的成绩的所有记录
    select *from score where and degree>(select degree from score where sno='109' and cno='3-105');

    20.查询和学号为108101的同学同年出生的所有学生的sno、sname和sbirthday列
    select year(sbirthday) from student where sno in (108,101);

    select * from student where year(sbirthday) in (select year(sbirthday) from student where sno in (108,101));

    21.查询“张旭”教师任课的学生成绩
    select * from teacher where tname='张旭';
    select tno from teacher where tname='张旭';
    select * from course where tno=(select tno from teacher where tname='张旭');
    select cno from course where tno=(select tno from teacher where tname='张旭');
    select * from score where cno=(select cno from course where tno=(select tno from teacher where tname='张旭'));

    22.查询选修某课程的同学人数多于5人的教师姓名
    select cno from score group by cno having count(*)>5;

    select * from teacher;
    select tno from course where cno=(select cno from score group by cno having count(*)>5);
    select tname from teacher where tno=(select tno from course where cno=(select cno from score group by cno having count(*)>5));

    23.查询95033班和95031班全体学生的记录
    select * from student;
    select * from student where calss in ('95031','95033');

    24.查询存在有85分以上成绩的课程Cno
    select cno from score where degree >85;

    25.查询出“计算机系”教师所教课程的成绩表
    select * from teacher where depart='计算机系';
    select * from course where tno in(select tno from teacher where depart='计算机系');
    select * from score where cno in(select cno from course where tno in(select tno from teacher where depart='计算机系'));

    26.查询“计算机系”与“电子工程系”不同职称的教师的tname和prof
    union 求并集
    select * from teacher ;
    select prof from teacher where depart ='电子工程系';
    select * from teacher where depart ='计算机系' and prof not in(select prof from teacher where depart ='电子工程系') ;
    select * from teacher where depart ='电子工程系' and prof not in(select prof from teacher where depart ='计算机系') ;

    select * from teacher where depart ='计算机系' and prof not in(select prof from teacher where depart ='电子工程系') union select * from teacher where depart ='电子工程系' and prof not in(select prof from teacher where depart ='计算机系') ;

    27.查询选修编号为“3-105”课程且成绩至少高于选修编号为“3-245”的同学的cno 、sno和degree,并按照degree从高到低的次序排序
    select * from score where cno='3-245';
    select * from score where cno='3-105';
    + +
    +

    至少:大于其中至少一个,**any

    +
    +
    select * from score 
    where cno='3-105'
    and degree>any(select degree from score where cno='3-245')
    order by degree desc;

    28.查询选修编号为“3-105”且成绩高于选修编号为“3-245”课程的同学的cno、sno和degree
    select * from score
    where cno='3-105'
    and degree>all(select degree from score where cno='3-245');
    + +
    +

    all**表示所有的关系

    +
    +
     
    29.查询所有教师和同学的name、sex和birthday
    别名 as
    select tname as name,tsex as sex,tbirthday as birthday from teacher
    union
    select sname,ssex,sbirthday from student;

    30.查询所有“女”教师和“女”同学的name、sex、birthday
    select tname as name,tsex as sex,tbirthday as birthday from teacher
    where tsex='女'
    union
    select sname,ssex,sbirthday from student
    where ssex='女';

    31.查询成绩比该课程平均成绩低的同学的成绩表
    select cno,avg(degree) from score group by cno;
    select * from score;

    select * from score a where degree < (select avg(degree) from score b where a.cno=b.cno);

    32.查询所有任课教师的tname和depart
    select * from teacher;
    + +
    +

    任课:在课程表中安排了课程

    +
    +
    select * from course;
    select * from teacher where tno in(select tno from course);
    select tname,depart from teacher where tno in(select tno from course);

    33.查询至少有两名男生的班号
    select * from student;
    select class from student where ssex ='男' group by class having count(*)>1;

    34.查询student表中不姓“王”的同学的记录
    select * from student;
    select * from student where sname not like '王%';

    35.查询student表中每个学生的姓名和年龄
    年龄:当前年份-出生年龄
    当前年龄:
    select year (now());
    select year(sbirthday) from student;

    select sname,year(now())-year(sbirthday) as '年龄' from student;

    36.查询student表中最大和最小的sbirthday日期值
    select sbirthday from student;
    select sbirthday from student order by sbirthday;
    + +
    +

    max,min 数值大小

    +
    +
    select max(sbirthday) as '最大',min(sbirthday) as '最小' from student;

    37.以班号和年龄从大到小的顺序查询student表中的全部记录
    select * from student order by class sedc,sbirthday;

    38.查询“男”教师及其所上的课程
    select * from teacher where tsex='男';

    select * from course where tno in(select tno from teacher where tsex='男');

    39.查询最高分同学的sno、cno和degree列
    select max(degree) from score;
    select * from score where degree=(select max(degree) from score);

    40.查询和“李军”同性别的所有同学的sname;
    select ssex from student where sname='李军';
    select sname from student where ssex=(select ssex from student where sname='李军');

    41.查询和李军同性别并且同班的同学sname
    select sname from student
    where ssex=(select ssex from score where degree=(select max(degree) from score))
    and class=(select class from student where sname='李军');

    42.查询所有选修“计算机导论”课程的“男”同学的成绩表
    select * from student where ssex='男';
    select * from course where cname='计算机导论';

    select * from score
    where cno=(select cno from course where cname='计算机导论')
    and where sno in(select sno from student where ssex='男');

    43.
    + +

    连接查询

    SQL的四种连接查询

    +

    内连接

    +

    inner join或 join

    +

    外连接

    +

    左连接 left join 或者left outer join

    +

    右连接right join或者 right outer join

    +

    完全外连接 full join 或者full outer join

    +

    创建数据库:

    +
    create database testJoin;
    Query OK, 1 row affected (0.02 sec)

    mysql> use testJoin;
    Database changed
    mysql>
    + +

    创建两个表:

    +

    person 表

    +
    id,
    name,
    cardId

    create table person(
    id int,
    name varchar(20),
    cardId int
    );
    + +

    card 表

    +
    id,
    name

    create table card(
    id int,
    name varchar(20)
    );


    mysql> show tables;
    +--------------------+
    | Tables_in_testjoin |
    +--------------------+
    | card |
    | person |
    +--------------------+
    2 rows in set (0.02 sec)

    insert into card values(1,'饭卡');
    insert into card values(2,'建行卡');
    insert into card values(3,'农行卡');
    insert into card values(4,'工商卡');
    insert into card values(5,'邮政卡');
    + +
    mysql> select * from card;
    +------+-----------+
    | id | name |
    +------+-----------+
    | 1 | 饭卡 |
    | 2 | 建行卡 |
    | 3 | 农行卡 |
    | 4 | 工商卡 |
    | 5 | 邮政卡 |
    +------+-----------+
    5 rows in set (0.00 sec)

    insert into person values(1,'张三',1);
    insert into person values(2,'李四',3);
    insert into person values(3,'王五',6);
    mysql> select * from person;
    +------+--------+--------+
    | id | name | cardId |
    +------+--------+--------+
    | 1 | 张三 | 1 |
    | 2 | 李四 | 3 |
    | 3 | 王五 | 6 |
    +------+--------+--------+
    3 rows in set (0.00 sec)

    + +
    1.inner join查询(内连接)
     
    select * from person inner join card on person.cardId =card.id;
    +------+--------+--------+------+-----------+
    | id | name | cardId | id | name |
    +------+--------+--------+------+-----------+
    | 1 | 张三 | 1 | 1 | 饭卡 |
    | 2 | 李四 | 3 | 3 | 农行卡 |
    +------+--------+--------+------+-----------+
    2 rows in set (0.00 sec)

    内联查询,就是两张表中的数据,通过某个字段相对,查询出相关记录数据

    select * from person join card on person.cardId =card.id;
    +------+--------+--------+------+-----------+
    | id | name | cardId | id | name |
    +------+--------+--------+------+-----------+
    | 1 | 张三 | 1 | 1 | 饭卡 |
    | 2 | 李四 | 3 | 3 | 农行卡 |
    +------+--------+--------+------+-----------+
    2 rows in set (0.00 sec)

    + +
    2.left join(左外连接)
    select * from person left join card on person.cardId=card.id;
    +------+--------+--------+------+-----------+
    | id | name | cardId | id | name |
    +------+--------+--------+------+-----------+
    | 1 | 张三 | 1 | 1 | 饭卡 |
    | 2 | 李四 | 3 | 3 | 农行卡 |
    | 3 | 王五 | 6 | NULL | NULL |
    +------+--------+--------+------+-----------+
    3 rows in set (0.00 sec)

    左外连接,会把左表里面的所有数据取出来,而右表中的数据,如果有相等的,就显示出来,如果没有,就补NULL
    select * from person left outer join card on person.cardId=card.id;
    +------+--------+--------+------+-----------+
    | id | name | cardId | id | name |
    +------+--------+--------+------+-----------+
    | 1 | 张三 | 1 | 1 | 饭卡 |
    | 2 | 李四 | 3 | 3 | 农行卡 |
    | 3 | 王五 | 6 | NULL | NULL |
    +------+--------+--------+------+-----------+
    3 rows in set (0.00 sec)

    + +
    3.right join(右外连接)
    select * from person right join card on person.cardId=card.id;
    +------+--------+--------+------+-----------+
    | id | name | cardId | id | name |
    +------+--------+--------+------+-----------+
    | 1 | 张三 | 1 | 1 | 饭卡 |
    | 2 | 李四 | 3 | 3 | 农行卡 |
    | NULL | NULL | NULL | 2 | 建行卡 |
    | NULL | NULL | NULL | 4 | 工商卡 |
    | NULL | NULL | NULL | 5 | 邮政卡 |
    +------+--------+--------+------+-----------+
    5 rows in set (0.00 sec)

    右外连接,会把右表里面的所有数据取出来,而左表中的数据,如果有相等的,就显示出来,如果没有,就补NULL
    select * from person right outer join card on person.cardId=card.id;
    +------+--------+--------+------+-----------+
    | id | name | cardId | id | name |
    +------+--------+--------+------+-----------+
    | 1 | 张三 | 1 | 1 | 饭卡 |
    | 2 | 李四 | 3 | 3 | 农行卡 |
    | NULL | NULL | NULL | 2 | 建行卡 |
    | NULL | NULL | NULL | 4 | 工商卡 |
    | NULL | NULL | NULL | 5 | 邮政卡 |
    +------+--------+--------+------+-----------+
    5 rows in set (0.00 sec)

    4.full join(全外连接)
    select * from person full join card on person.cardId=card.id;

    mysql 不支持full join

    select * from person left join card on person.cardId=card.id
    union
    select * from person right join card on person.cardId=card.id;
    +------+--------+--------+------+-----------+
    | id | name | cardId | id | name |
    +------+--------+--------+------+-----------+
    | 1 | 张三 | 1 | 1 | 饭卡 |
    | 2 | 李四 | 3 | 3 | 农行卡 |
    | 3 | 王五 | 6 | NULL | NULL |
    | NULL | NULL | NULL | 2 | 建行卡 |
    | NULL | NULL | NULL | 4 | 工商卡 |
    | NULL | NULL | NULL | 5 | 邮政卡 |
    +------+--------+--------+------+-----------+
    6 rows in set (0.01 sec)
    + +

    事务

    MySQL中,事务是一个最小的不可分割的工作单元。事务能够保证一个业务的完整性。

    +

    比如银行转账:

    +
    a->-100
    update user set money =money-100 where name='a';

    b->+100
    update user set money =money+100 where name='b';

    多条sql语句,可能会有同时成功的要求,要么就同时失败

    MySQL中如何控制事务?

    1.MySQL默认开启事务(自动提交)
    mysql> select @@autocommit;
    +--------------+
    | @@autocommit |
    +--------------+
    | 1 |
    +--------------+
    1 row in set (0.00 sec)

    默认开启事务的作用:
    当我们去执行一个sql语句的时候,效果会立即体现出来,且不能回滚

    create database bank;

    create table user(
    id int primary key,
    name varchar(20),
    money int
    );
    insert into user values(1,'a',1000);

    事务回滚:撤销sql语句执行效果
    roolback;

    mysql> select * from user;
    +----+------+-------+
    | id | name | money |
    +----+------+-------+
    | 1 | a | 1000 |
    +----+------+-------+
    1 row in set (0.00 sec)

    mysql> rollback;
    Query OK, 0 rows affected (0.00 sec)

    mysql> select * from user;
    +----+------+-------+
    | id | name | money |
    +----+------+-------+
    | 1 | a | 1000 |
    +----+------+-------+
    1 row in set (0.00 sec)

    设置MySQL自动提交为false
    set autocommit=0;
    Query OK, 0 rows affected (0.00 sec)

    mysql> select @@autocommit;
    +--------------+
    | @@autocommit |
    +--------------+
    | 0 |
    +--------------+
    1 row in set (0.00 sec)

    上面的操作,关闭了MySQL的自动提交(autocommit)

    insert into user values(2,'b',1000);
    Query OK, 1 row affected (0.00 sec)

    mysql> select * from user;
    +----+------+-------+
    | id | name | money |
    +----+------+-------+
    | 1 | a | 1000 |
    | 2 | b | 1000 |
    +----+------+-------+
    2 rows in set (0.00 sec)

    mysql> rollback;
    Query OK, 0 rows affected (0.01 sec)

    mysql> select * from user;
    +----+------+-------+
    | id | name | money |
    +----+------+-------+
    | 1 | a | 1000 |
    +----+------+-------+
    1 row in set (0.00 sec)

    再一次插入数据

    mysql> insert into user values(2,'b',1000);
    Query OK, 1 row affected (0.00 sec)
    手动提交数据

    mysql> commit;
    Query OK, 0 rows affected (0.02 sec)
    再撤销,是不可以撤销的(持久性)
    mysql> rollback;
    Query OK, 0 rows affected (0.00 sec)

    mysql> select * from user;
    +----+------+-------+
    | id | name | money |
    +----+------+-------+
    | 1 | a | 1000 |
    | 2 | b | 1000 |
    +----+------+-------+
    2 rows in set (0.00 sec)

    + +

    字段提交 @@autocommit=1

    手动提交 commit

    事务回滚 rollback

    如果说这个时候转账:

    +
    update user set money =money-100 where name='a';
    update user set money =money+100 where name='b';
    mysql> select * from user;
    +----+------+-------+
    | id | name | money |
    +----+------+-------+
    | 1 | a | 900 |
    | 2 | b | 1100 |
    +----+------+-------+
    2 rows in set (0.00 sec)

    rollback

    mysql> rollback;
    Query OK, 0 rows affected (0.01 sec)

    mysql> select * from user;
    +----+------+-------+
    | id | name | money |
    +----+------+-------+
    | 1 | a | 1000 |
    | 2 | b | 1000 |
    +----+------+-------+
    2 rows in set (0.00 sec)

    事务提供了一个反悔的机会


    set autocommit=1;
    Query OK, 0 rows affected (0.00 sec)

    mysql> select @@autocommit;
    +--------------+
    | @@autocommit |
    +--------------+
    | 1 |
    +--------------+
    1 row in set (0.00 sec)

    begin;
    或者
    start transaction;
    都可以帮助手动开启一个事务
    mysql> select * from user;
    +----+------+-------+
    | id | name | money |
    +----+------+-------+
    | 1 | a | 1000 |
    | 2 | b | 1000 |
    +----+------+-------+
    2 rows in set (0.00 sec)
    update user set money =money-100 where name='a';
    update user set money =money+100 where name='b';
    mysql> select * from user;
    +----+------+-------+
    | id | name | money |
    +----+------+-------+
    | 1 | a | 900 |
    | 2 | b | 1100 |
    +----+------+-------+
    2 rows in set (0.00 sec)
    + +
    +

    事务回滚

    +
    +
    mysql> rollback;
    Query OK, 0 rows affected (0.00 sec)
    + +
    +

    没有被撤销

    +
    +
    mysql> select * from user;
    +----+------+-------+
    | id | name | money |
    +----+------+-------+
    | 1 | a | 900 |
    | 2 | b | 1100 |
    +----+------+-------+
    2 rows in set (0.00 sec)

    + +
    手动开启事务(1)
    begin;
    update user set money =money-100 where name='a';
    update user set money =money+100 where name='b';
    mysql> select * from user;
    +----+------+-------+
    | id | name | money |
    +----+------+-------+
    | 1 | a | 800 |
    | 2 | b | 1200 |
    +----+------+-------+
    2 rows in set (0.00 sec)

    mysql> rollback;
    Query OK, 0 rows affected (0.01 sec)

    mysql> select * from user;
    +----+------+-------+
    | id | name | money |
    +----+------+-------+
    | 1 | a | 900 |
    | 2 | b | 1100 |
    +----+------+-------+
    2 rows in set (0.00 sec)

    + +
    手动开启事务(2)
    start transaction;
    update user set money =money-100 where name='a';
    update user set money =money+100 where name='b';
    mysql> select * from user;
    +----+------+-------+
    | id | name | money |
    +----+------+-------+
    | 1 | a | 800 |
    | 2 | b | 1200 |
    +----+------+-------+
    2 rows in set (0.00 sec)

    mysql> rollback;
    Query OK, 0 rows affected (0.01 sec)

    mysql> select * from user;
    +----+------+-------+
    | id | name | money |
    +----+------+-------+
    | 1 | a | 900 |
    | 2 | b | 1100 |
    +----+------+-------+
    2 rows in set (0.00 sec)

    + +
    事务开启之后,一旦提交,回滚(rollback)无效
    mysql> start transaction;
    Query OK, 0 rows affected (0.00 sec)

    mysql> update user set money =money-100 where name='a';
    Query OK, 1 row affected (0.00 sec)
    Rows matched: 1 Changed: 1 Warnings: 0

    mysql> update user set money =money+100 where name='b';
    Query OK, 1 row affected (0.00 sec)
    Rows matched: 1 Changed: 1 Warnings: 0

    mysql> commit;
    Query OK, 0 rows affected (0.01 sec)

    mysql> select * from user;
    +----+------+-------+
    | id | name | money |
    +----+------+-------+
    | 1 | a | 800 |
    | 2 | b | 1200 |
    +----+------+-------+
    2 rows in set (0.00 sec)

    mysql> rollback;
    Query OK, 0 rows affected (0.00 sec)

    mysql> select * from user;
    +----+------+-------+
    | id | name | money |
    +----+------+-------+
    | 1 | a | 800 |
    | 2 | b | 1200 |
    +----+------+-------+
    2 rows in set (0.00 sec)

    事务的四大特征:
    A:原子性:事务是最小的单位,不可以再分割
    C:一致性:事务要求,同一事务中的sql语句,必须保证同时成功或者同时失败
    I:隔离性:事务1和事务2之间是具有隔离性的
    D:持久性:事务一旦结束,就不可以返回

    事务开启:
    1.修改默认提交 set autocommit=0;
    2.begin;
    3.start transaction;

    事务手动提交
    commit;

    事务手动回滚
    rollback;


    事务的隔离性:

    + + + + + + + + + + + + + + + + + + + + +
    1.read uncommitted;读未提交的
    2.read committed;都已经提交的
    3.repeatable read;可重复读
    4.serializable;串行化
    +
     
    + +
    1-read uncommitted
    如果有事务a,事务b,
    a事务对数据进行操作,在操作的过程中,事务没有被提交,但是b可以看见a操作的结果

    bank表 user
    insert into user values(3,'小明',1000);
    insert into user values(4,'淘宝店',1000);
    mysql> select * from user;
    +----+-----------+-------+
    | id | name | money |
    +----+-----------+-------+
    | 1 | a | 800 |
    | 2 | b | 1200 |
    | 3 | 小明 | 1000 |
    | 4 | 淘宝店 | 1000 |
    +----+-----------+-------+
    4 rows in set (0.00 sec)

    如何查看数据库的隔离级别
    MySQL 8.0:
    + + + + + + + + + + + + +
    select @@global.transaction_isolation;系统级别
    select @@transaction_isolation;会话级别
    +
    MySQL默认隔离级别 REPEATABLE-READ
    +--------------------------------+
    | @@global.transaction_isolation |
    +--------------------------------+
    | REPEATABLE-READ |
    +--------------------------------+
    1 row in set (0.00 sec)

    MySQL 5.x:
    + + + + + + + + + + + + +
    select @@global.tx_isolation;系统级别
    select @@tx_isolation;会话级别
    +
     
    如何修改隔离级别
    set global transaction isolation level read uncommitted;
    Query OK, 0 rows affected (0.00 sec)

    mysql> select @@global.transaction_isolation;
    +--------------------------------+
    | @@global.transaction_isolation |
    +--------------------------------+
    | READ-COMMITTED |
    +--------------------------------+
    1 row in set (0.00 sec)

    mysql> set global transaction isolation level read uncommitted;
    Query OK, 0 rows affected (0.00 sec)

    mysql> select @@global.transaction_isolation;
    +--------------------------------+
    | @@global.transaction_isolation |
    +--------------------------------+
    | READ-UNCOMMITTED |
    +--------------------------------+
    1 row in set (0.00 sec)

    转账:小明在淘宝店买鞋子:800
    小明-》成都 ATM
    淘宝店-》广州 ATM

    start transaction;
    update user set money =money-800 where name='小明';
    update user set money =money+800 where name='淘宝店';
    mysql> select * from user;
    +----+-----------+-------+
    | id | name | money |
    +----+-----------+-------+
    | 1 | a | 800 |
    | 2 | b | 1200 |
    | 3 | 小明 | 200 |
    | 4 | 淘宝店 | 1800 |
    +----+-----------+-------+
    4 rows in set (0.00 sec)

    告知淘宝店
    淘宝店在广州查账
    mysql> select * from user;
    +----+-----------+-------+
    | id | name | money |
    +----+-----------+-------+
    | 1 | a | 800 |
    | 2 | b | 1200 |
    | 3 | 小明 | 200 |
    | 4 | 淘宝店 | 1800 |
    +----+-----------+-------+
    4 rows in set (0.00 sec)

    发货
    晚上请女朋友吃饭
    1800

    小明rollback
    mysql> select * from user;
    +----+-----------+-------+
    | id | name | money |
    +----+-----------+-------+
    | 1 | a | 800 |
    | 2 | b | 1200 |
    | 3 | 小明 | 1000 |
    | 4 | 淘宝店 | 1000 |
    +----+-----------+-------+
    4 rows in set (0.00 sec)
    淘宝结账的时候发现钱不够
    mysql> select * from user;
    +----+-----------+-------+
    | id | name | money |
    +----+-----------+-------+
    | 1 | a | 800 |
    | 2 | b | 1200 |
    | 3 | 小明 | 1000 |
    | 4 | 淘宝店 | 1000 |
    +----+-----------+-------+
    4 rows in set (0.00 sec)

    如果两个地方都在进行操作,如果事务a开启之后,他的数据可以被其他事务读取到
    这样就会出现“脏读”
    脏读:一个事务读到了另外一个事务没有提交的数据
    实际开发是不允许脏读出现的

    + +
    2-read committed

    修改隔离级别为 READ-COMMITTED

    +
    set global transaction isolation level read committed;
    select @@global.transaction_isolation;
    +--------------------------------+
    | @@global.transaction_isolation |
    +--------------------------------+
    | READ-COMMITTED |
    +--------------------------------+
    1 row in set (0.00 sec)

    bank 数据库 user

    小张:银行的会计
    start transaction;
    select * from user;
    mysql> select * from user;
    +----+-----------+-------+
    | id | name | money |
    +----+-----------+-------+
    | 1 | a | 800 |
    | 2 | b | 1200 |
    | 3 | 小明 | 1000 |
    | 4 | 淘宝店 | 1000 |
    +----+-----------+-------+
    4 rows in set (0.00 sec)

    小张出去上厕所去。。。

    小王:
    start transaction;
    insert into user values(5,'c',100);
    commit;
    mysql> select * from user;
    +----+-----------+-------+
    | id | name | money |
    +----+-----------+-------+
    | 1 | a | 800 |
    | 2 | b | 1200 |
    | 3 | 小明 | 1000 |
    | 4 | 淘宝店 | 1000 |
    | 5 | c | 100 |
    +----+-----------+-------+
    5 rows in set (0.00 sec)

    小张回来了

    select avg(money) from user;
    +------------+
    | avg(money) |
    +------------+
    | 820.0000 |
    +------------+
    1 row in set (0.00 sec)

    money 的平均值不是1000,变少了。。
    虽然只能读到事务提交的数据,但是还是会出现问题,就是读取同一个表的数据,发现前后不一致。
    不可重复读现象:read committed

    + +
    3-repeatable read
    set global transaction isolation level repeatable read;
    select @@global.transaction_isolation;
    +--------------------------------+
    | @@global.transaction_isolation |
    +--------------------------------+
    | REPEATABLE-READ |
    +--------------------------------+
    1 row in set (0.00 sec)

    在repeatable read 隔离级别下出现什么问题:
    mysql> select * from user;
    +----+-----------+-------+
    | id | name | money |
    +----+-----------+-------+
    | 1 | a | 800 |
    | 2 | b | 1200 |
    | 3 | 小明 | 1000 |
    | 4 | 淘宝店 | 1000 |
    | 5 | c | 100 |
    +----+-----------+-------+
    5 rows in set (0.00 sec)

    张全蛋-成都
    start transaction;

    王尼玛-北京
    start transaction;

    张全蛋-成都
    insert into user values(6,'d',1000);
    + +

    Query OK, 1 row affected (0.00 sec)

    +
     
    mysql> commit;
    Query OK, 0 rows affected (0.02 sec)

    mysql> select * from user;
    +----+-----------+-------+
    | id | name | money |
    +----+-----------+-------+
    | 1 | a | 800 |
    | 2 | b | 1200 |
    | 3 | 小明 | 1000 |
    | 4 | 淘宝店 | 1000 |
    | 5 | c | 100 |
    | 6 | d | 1000 |
    +----+-----------+-------+
    6 rows in set (0.00 sec)

    王尼玛-北京
    mysql> select * from user;
    +----+-----------+-------+
    | id | name | money |
    +----+-----------+-------+
    | 1 | a | 800 |
    | 2 | b | 1200 |
    | 3 | 小明 | 1000 |
    | 4 | 淘宝店 | 1000 |
    | 5 | c | 100 |
    +----+-----------+-------+
    5 rows in set (0.00 sec)

    insert into user values(6,'d',1000);
    mysql> insert into user values(6,'d',1000);
    ERROR 1062 (23000): Duplicate entry '6' for key 'PRIMARY'

    这就现象就叫做幻读!
    两个事务,事务a和事务b同时操作一张表 事务a提交的数据也不能被事务b读到,可能出现幻读

    + +
    4-serializable
     
    修改隔离级别为串行化
    set global transaction isolation level serializable;
    select @@global.transaction_isolation;
    +--------------------------------+
    | @@global.transaction_isolation |
    +--------------------------------+
    | SERIALIZABLE |
    +--------------------------------+
    1 row in set (0.00 sec)


    mysql> select *from user;
    +----+-----------+-------+
    | id | name | money |
    +----+-----------+-------+
    | 1 | a | 800 |
    | 2 | b | 1200 |
    | 3 | 小明 | 1000 |
    | 4 | 淘宝店 | 1000 |
    | 5 | c | 100 |
    | 6 | d | 1000 |
    +----+-----------+-------+
    6 rows in set (0.00 sec)

    张全蛋-成都
    start transaction;

    王尼玛-北京
    start transaction;

    张全蛋-成都
    insert into user values(7,'赵铁柱',1000);
    Query OK, 1 row affected (0.00 sec)

    mysql> commit;
    Query OK, 0 rows affected (0.01 sec)

    mysql> select *from user;
    +----+-----------+-------+
    | id | name | money |
    +----+-----------+-------+
    | 1 | a | 800 |
    | 2 | b | 1200 |
    | 3 | 小明 | 1000 |
    | 4 | 淘宝店 | 1000 |
    | 5 | c | 100 |
    | 6 | d | 1000 |
    | 7 | 赵铁柱 | 1000 |
    +----+-----------+-------+
    7 rows in set (0.00 sec)

    王尼玛-北京
    mysql> select * from user;
    +----+-----------+-------+
    | id | name | money |
    +----+-----------+-------+
    | 1 | a | 800 |
    | 2 | b | 1200 |
    | 3 | 小明 | 1000 |
    | 4 | 淘宝店 | 1000 |
    | 5 | c | 100 |
    | 6 | d | 1000 |
    | 7 | 赵铁柱 | 1000 |
    +----+-----------+-------+
    7 rows in set (0.00 sec)

    张全蛋-成都
    start transaction;
    insert into user values(8,'王小花',1000);

    被卡住了

    user表被另外一个事务操作的时候,其他事务里面的写操作,是不可以进行的
    进入排队状态,直到王尼玛那边事务结束之后,张全蛋的写入才会执行
    前提是在没有等待超时的情况下

    王尼玛-北京
    mysql> commit;
    Query OK, 0 rows affected (0.00 sec)

    张全蛋-成都
    Query OK, 1 row affected (0.00 sec)

    串行化带来的问题:性能很差


    性能:uncommitted>committed>repeatable>serializable;
    隔离级别越高性能越差

    MySQL默认隔离级别是 repeatable
    ]]>
    + + 数据库 + + + MySQL + 数据库 + 事务 + +
    + + python入门2 + /2020/03/05/python%E5%85%A5%E9%97%A82/ + python入门2
    +

    列表、字典、元组、集合

    +
    +

    列表

    # 列表
    # 使用方括号定义列表
    list1=['s','h','y','ee',123]
    # 使用内置函数
    list2=list(['s','h','y','ee',123])
    print(list1,list2)
    + +

    运行结果:

    +

    [‘s’, ‘h’, ‘y’, ‘ee’, 123] [‘s’, ‘h’, ‘y’, ‘ee’, 123]

    +
    print(list1[0],list1[-2])
    + +

    运行结果:

    +

    s ee

    +
    获取索引
    # 获取索引
    print(list1.index('ss'),list1.index(123))
    + +

    报错:

    +

    ValueError: ‘ss’ is not in list

    +
    list3=['s','ss',123,4,123,'ss','4']
    print(list3.index(123))#只返回相同元素中的第一个元素的索引
    + +

    运行结果:

    +

    2

    +
    规定查找区间
    #规定查找区间
    print(list3.index(123,3,5))
    + +

    运行结果:4

    +
    查找索引区间超过列表长度
    #查找索引区间超过列表长度
    print(list3[10])
    + +

    报错:IndexError: list index out of range

    +
    设置步长
    #设置步长
    list4=[10,20,30,40,50,60,70,80,90,100]
    #start:stop:step
    print(list4[2:6:2])
    #省略步长,默认为1
    print(list4[2:6])
    print(list4[2:6:])
    #start默认从0开始
    print(list4[:6:])
    # stop默认为最后一个
    print(list4[::])
    + +

    运行结果:

    +

    [30, 50]
    [30, 40, 50, 60]
    [30, 40, 50, 60]
    [10, 20, 30, 40, 50, 60]
    [10, 20, 30, 40, 50, 60, 70, 80, 90, 100]

    +
    添加新的元素
    append
    # 添加新的元素
    list5=[1,2,3,4]
    print('添加新元素前',list5,id(list5))
    list5.append(6)
    print('添加新元素之后',list5,id(list5))
    + +

    运行结果:

    +

    添加新元素前 [1, 2, 3, 4] 2862260696008
    添加新元素之后 [1, 2, 3, 4, 6] 2862260696008

    +
    extend
    list5=[1,2,3,4]
    print('添加新元素前',list5,id(list5))
    list5.append(list4)
    print('append添加新元素之后',list5,id(list5))
    list5=[1,2,3,4]
    list5.extend(list4)
    print('extend添加新元素之后',list5,id(list5))
    + +

    运行结果:

    +

    添加新元素前 [1, 2, 3, 4] 2213139002312
    append添加新元素之后 [1, 2, 3, 4, [10, 20, 30, 40, 50, 60, 70, 80, 90, 100]] 2213139002312
    extend添加新元素之后 [1, 2, 3, 4, 10, 20, 30, 40, 50, 60, 70, 80, 90, 100]

    +
    insert
    list5=[1,2,3,4]
    list5.insert(2,10)
    print('insert添加新元素之后',list5)
    + +

    运行结果:insert添加新元素之后 [1, 2, 10, 3, 4]

    +
    在某位置添加很多元素
    list5=[1,2,3,4]
    # list在任意位置添加很多元素
    list5[1:]=list2
    print('list添加新元素之后',list5)
    #将第二个元素替换为另一个列表中的所有元素
    list5=[1,2,3,4]
    list5[1:2]=list2
    print('list添加新元素之后',list5)
    + +

    运行结果:

    +

    list添加新元素之后 [1, ‘s’, ‘h’, ‘y’, ‘ee’, 123]
    list添加新元素之后 [1, ‘s’, ‘h’, ‘y’, ‘ee’, 123, 3, 4]

    +
    移除元素
    remove
    print('list添加新元素之后',list5)
    # remove 移除出现的第一个元素
    list6=[1,2,3,3,4,4,5,6,1]
    list6.remove(3)
    print(list6)
    list6.remove(111)
    + +

    运行结果:[1, 2, 3, 4, 4, 5, 6, 1]

    +

    运行报错:ValueError: list.remove(x): x not in list

    +
    pop
    # 移除索引为n的元素
    list6.pop(3)
    print(list6)
    + +

    运行结果:[1, 2, 3, 4, 5, 6, 1]

    +
    # 如果不知名参数,pop将删除列表中最后一个元素
    print(list6.pop())
    + +

    运行结果:1

    +
    切片
    # 用切片删除多个元素
    print(list6)
    list6[1:3]=[]
    print(list6)
    + +

    运行结果:

    +

    [1, 2, 3, 4, 5, 6]
    [1, 4, 5, 6]

    +
    del&clear
    # clear:清空列表
    list6.clear()
    print(list6)
    # delete:删除列表
    del list6
    print(list6)
    + +

    运行结果:

    +

    []

    +

    NameError: name ‘list6’ is not defined

    +
    修改
    # 修改
    list7=[1,23,4,3,2]
    list7[1]=1
    print(list7)
    list7[1:3]=11,2,3
    print(list7)
    + +

    运行结果:

    +

    [1, 1, 4, 3, 2]
    [1, 11, 2, 3, 3, 2]

    +
    排序
    # sort默认升序
    list7.sort()
    print(list7)
    # 降序排序
    list7.sort(reverse=True)
    print(list7)
    # sorted
    list9=sorted(list7,reverse=True)
    print('list7:',list7,'list8:',list8,'list9:',list9)
    + +

    运行结果:

    +

    [1, 2, 2, 3, 3, 11]
    [11, 3, 3, 2, 2, 1]
    list7: [11, 3, 3, 2, 2, 1] list8: [1, 2, 2, 3, 3, 11] list9: [11, 3, 3, 2, 2, 1]

    +
    生成
    # 列表生成
    lst=[i*i for i in range(1,10)]
    print(lst)
    # 产生元素为2,4,6,8,10的列表
    lst=[i*2 for i in range(1,6)]
    print(lst)
    + +

    运行结果:

    +

    [1, 4, 9, 16, 25, 36, 49, 64, 81]
    [2, 4, 6, 8, 10]

    +

    字典

    创建字典

    使用{}创建
    # 字典的创建方式
    # 使用{}创建
    dict1={"张三":13,"李四":15,"王五":20,"赵六":""}
    print(dict1,type(dict1))
    + +

    运行结果:

    +

    {‘张三’: 13, ‘李四’: 15, ‘王五’: 20, ‘赵六’: ‘’} <class ‘dict’>

    +
    使用内置函数
    # 使用内置函数dict
    student=dict(name='Shyee',age=22)
    print(student)
    + +

    运行结果:

    +

    {‘name’: ‘Shyee’, ‘age’: 22}

    +

    创建空字典

    +
    d={}
    + +

    获取字典中的元素

    # 获取字典元素
    print(dict1['张三'],dict1['jojo'])
    # 或者
    print(dict1.get('李四'),dict1.get('jojo'))
    print(dict1.get('jojo',30))
    + +

    运行结果:

    +

    13
    KeyError: 'jojo'

    +

    15 None

    +

    30

    +

    判断在不在字典里

    # 判断在不在字典里
    print('李四' in dict1)
    print('李四' not in dict1)
    + +

    运行结果:

    +

    True
    False

    +

    删除字典中的元素

    # 删除字典中的元素
    del dict1['王五']
    print(dict1)
    + +

    运行结果:

    +

    {‘张三’: 13, ‘李四’: 15, ‘赵六’: ‘’}

    +
    #清空字典
    dict1.clear()
    print(dict1)
    + +

    运行结果:

    +

    {}

    +

    新增

    # 新增
    dict1['jojo']=20
    print(dict1)
    + +

    运行结果:

    +

    {‘jojo’: 20}

    +

    修改

    # 修改
    dict1['jojo']=1
    print(dict1)
    + +

    运行结果:

    +

    {‘jojo’: 1}

    +

    获取所有的key

    dict1={"张三":13,"李四":15,"王五":20,"赵六":""}
    # 获取所有的key
    print(dict1.keys())
    # 转成列表
    print(list(dict1.keys()))
    + +

    运行结果:

    +

    dict_keys([‘张三’, ‘李四’, ‘王五’, ‘赵六’])
    [‘张三’, ‘李四’, ‘王五’, ‘赵六’]

    +

    获取所有的值

    # 获取所有的值
    print(dict1.values())
    print(list(dict1.values()))
    + +

    运行结果:

    +

    dict_values([13, 15, 20, ‘’])
    [13, 15, 20, ‘’]

    +

    获取所有的键值对

    # 获取所有的键值对
    print(dict1.items())
    print(list(dict1.items())[0][0])
    + +

    dict_items([(‘张三’, 13), (‘李四’, 15), (‘王五’, 20), (‘赵六’, ‘’)])
    张三

    +

    字典的遍历

    # 字典的遍历
    for item in dict1:
    print(item,dict1[item],dict1.get(item))
    + +

    运行结果:

    +

    张三 13 13
    李四 15 15
    王五 20 20
    赵六

    +

    字典的特点

    · 字典中的所有元素都是一个key-value对, key不允许重复, value可以重复

    +

    · 字典中的元素是无序的

    +

    · 字典中的key必须是不可变对象

    +

    · 字典也可以根据需要动态地伸缩

    +

    · 字典会浪费较大的内存,是一种使用空间换时间的数据结构

    +

    内置函数zip()

    # 内置函数zip()
    # 用于将可迭代的对象作为参数,将对象中对应的元素打包成一个元组,然后返回由这些元组组成的列表
    items=['A','B','C','D']
    codes=[27,28,29,30,31,32]
    d={item.upper():code for item,code in zip(items,codes)}
    print(d)
    + +

    运行结果:

    +

    {‘A’: 27, ‘B’: 28, ‘C’: 29, ‘D’: 30}

    +

    元组

    不可变序列与可变序列

    不变可变序:字符串、元组
    不变可变序列:没有增、删,改的操作
    可变序列:列表、字典
    可变序列:可以对序列执行增、删、改操作,对象地址不发生更改

    +

    元组的创建

    # 元组的创建
    t=('a',1,'1',('a',1,'1'),['l'],{'a'})
    t1='a',1,'1',('a',1,'1'),['l'],{'a'}
    print(t)
    print(t1,type(t1))
    t2=tuple(('a',1,'1',('a',1,'1'),['l'],{'a'}))
    print(t2,type(t2))
    # 如果元组当中只包含一个元素,用括号创建元组的时候应加逗号
    s1=('ss')
    s2='ss'
    t1=('tt',)
    t2='tt',
    print("s1:",s1,type(s1))
    print("s2:",s2,type(s2))
    print("t1:",t1,type(t1))
    print("t2:",t2,type(t2))
    # 创建空元组
    et=()
    et1=tuple()
    print("et:",et,type(et))
    print("et1:",et1,type(et1))

    #运行结果:
    ('a', 1, '1', ('a', 1, '1'), ['l'], {'a'})
    ('a', 1, '1', ('a', 1, '1'), ['l'], {'a'}) <class 'tuple'>
    ('a', 1, '1', ('a', 1, '1'), ['l'], {'a'}) <class 'tuple'>
    s1: ss <class 'str'>
    s2: ss <class 'str'>
    t1: ('tt',) <class 'tuple'>
    t2: ('tt',) <class 'tuple'>
    et: () <class 'tuple'>
    et1: () <class 'tuple'>
    + +

    元组的修改

    # 如果对元组中的值进行修改
    t=('a',1,'1',('a',1,'1'),['l'],{'a'})
    t[3]=1
    print(t[3])
    + +

    报错:TypeError: 'tuple' object does not support item assignment

    +
    # 向t[4]添加元素
    t[4].append(3)
    print(t[4],id(t[4]))
    + +

    运行结果:

    +

    [‘l’] 2052995427208
    [‘l’, 3] 2052995427208

    +

    元组的遍历

    # 元组的遍历
    for item in t:
    print(item)
    + +

    a
    1
    1
    (‘a’, 1, ‘1’)
    [‘l’, 3]
    {‘a’}

    +

    集合

    集合的创建

    s={1,1,2,2,3,3,"a","a",'a',{'s'},{'s'}}
    print(s)
    + +

    报错:TypeError: unhashable type: 'set'

    +
    s={1,1,2,2,3,3,"a","a",'a'}
    print(s)
    + +

    运行结果:{1, 2, 3, ‘a’}

    +

    不能重复

    +

    内置函数set

    # 内置函数set
    s=set(range(6))
    print(s)
    print(set([3,4,5,""]))
    print(set(([3,4,5,""])))
    print(set('Python'))
    print(set())
    + +

    运行结果:

    +

    {0, 1, 2, 3, 4, 5}
    {‘’, 3, 4, 5}
    {‘’, 3, 4, 5}
    {‘n’, ‘y’, ‘t’, ‘h’, ‘P’, ‘o’}
    set()

    +

    集合的操作

    # 判断
    print(9 in s)
    # 新增
    s.add('s')
    print(s)
    s.update('o')
    print(s)
    # 删除
    s.remove('a')#报错:KeyError: 'a'
    print(s)
    s.discard('a')#不报错也不执行
    print(s)
    s={1,1,2,2,3,3,"a","a",'a'}
    print(s)
    s.pop()
    print(s)
    s={1,1,2,2,3,3,"a","a",'a'}
    s.clear()
    print(s)
    + +

    运行结果:

    +

    False
    {0, 1, 2, 3, 4, 5, ‘s’}

    +

    {0, 1, 2, 3, 4, 5, ‘o’, ‘s’}

    +

    {‘a’, 1, 2, 3}
    {1, 2, 3}
    set()

    +

    字符串

    字符串的驻留机制

    a='Python'
    b="Python"
    c='''Python'''
    print(a,id(a),b,id(b),c,id(c))
    + +

    运行结果:

    +

    Python 2116166832240 Python 2116166832240 Python 2116166832240

    +

    有驻留的情况:

    +

    字符串的长度为0或1时·符合标识符的字符串

    +

    字符串只在编译时进行驻留,而非运行时

    +

    [-5,256]之间的整数数字

    +
    >>> s1=''
    >>> s2=''
    >>> s1 is s2
    True
    >>> s1='aa%'
    >>> s2='aa%'
    >>> s1==s2
    True
    >>> s1 is s2
    False
    --------------------
    >>> a='abc'
    >>> b='a'+'bc'
    >>> c=''.join(['ab','c'])
    >>> a,b,c
    ('abc', 'abc', 'abc')
    >>> a is b
    True
    >>> a is c
    False
    + +

    sys中的intern方法强制驻留

    +
    >>> import sys
    >>> a='asd%'
    >>> b='asd%'
    >>> a =sys.intern(b)
    >>> a is b
    True
    + +

    然而pycharm对字符串进行了优化处理(会驻留)

    +

    注:在需要进行字符串拼接时建议使用str类型的join方法,而非+,因为join()方法是先计算出所有字符中的长度,然后再拷贝,只new一次对象,效率要比”+”效率高

    +

    字符串的查询

    s='hello,hello'
    print(s.index('lo'))
    print(s.find('lo'))
    print(s.rindex('lo'))
    print(s.rfind('lo'))
    + +

    运行结果:

    +

    3
    3
    9
    9

    +

    大小写转换

    s='Hello this is Shyee'
    print("s:"+s,id(s))
    a=s.upper()
    b=s.lower()
    c=s.swapcase()
    d=s.capitalize()
    e=s.title()
    print("upper:",a,id(a))
    print("lower:",b,id(b))
    print("swapcase:",c,id(c))
    print("capitalize:",d,id(d))
    print("title:",e,id(e))
    + +

    运行结果:

    +

    s:Hello this is Shyee 1336088248112
    upper: HELLO THIS IS SHYEE 1336088256560
    lower: hello this is shyee 1336088256720
    swapcase: hELLO THIS IS sHYEE 1336088256800
    capitalize: Hello this is shyee 1336088258240
    title: Hello This Is Shyee 1336088258320

    +

    对齐操作

    s='Hello this is Shyee'
    print(s.center(22,'*'))#居中
    print(s.center(15,'*'))#参数小于字符串长度,打印字符串
    print(s.ljust(22,'-'))#第二个参数默认空格
    print(s.rjust(22,"#"))
    print(s.zfill(22))#默认左填零对齐
    print('-123'.zfill(10))
    + +

    运行结果:

    +

    Hello this is Shyee*
    Hello this is Shyee
    Hello this is Shyee—
    ###Hello this is Shyee
    000Hello this is Shyee
    -000000123

    +

    拆分

    s='Hello this is Shyee'
    a=s.split()#默认从左以空格分割
    print(a)
    a=s.split(sep='s')#指定分割符
    print(a)
    a=s.split(sep=' ',maxsplit=2)#指定最大分割次数
    print(a)
    a=s.rsplit()#从右侧
    print(a)
    print(s.rsplit(sep='s'))
    print(s.rsplit(sep=' ',maxsplit=2))
    + +

    运行结果:

    +

    [‘Hello’, ‘this’, ‘is’, ‘Shyee’]
    [‘Hello thi’, ‘ i’, ‘ Shyee’]
    [‘Hello’, ‘this’, ‘is Shyee’]
    [‘Hello’, ‘this’, ‘is’, ‘Shyee’]
    [‘Hello thi’, ‘ i’, ‘ Shyee’]
    [‘Hello this’, ‘is’, ‘Shyee’]

    +

    字符串的判断

    #判断是否是合法的标识符
    print('hello,Shyee','hello,Shyee'.isidentifier())
    print('hello','hello'.isidentifier())
    print('中文_','中文_'.isidentifier())
    print('中文_123','中文_123'.isidentifier())
    print('hello Shyee','hello Shyee'.isspace())
    print(" "," ".isspace(),"\t".isspace())
    # 判断是否全由字母(汉字)组成
    print('hello Shyee','hello Shyee'.isalpha())
    print('helloShyee','helloShyee'.isalpha())
    print('中文','中文'.isalpha())
    # 判断是否全部是10进制的数字
    print('123','123'.isdecimal())
    print('123fh','123fh'.isdecimal())
    # 判断是否全部有数字组成
    print('123','123'.isnumeric())
    print('四','四'.isnumeric())
    print('ⅤⅢⅣ','ⅤⅢⅣ'.isnumeric())
    # 判断是否全部是字母(汉字)和数字组成
    print('123中文','123中文'.isalnum())
    print('ⅤⅢⅣasd','ⅤⅢⅣasd'.isalnum())
    + +

    运行结果:

    +

    hello,Shyee False
    hello True
    中文_ True
    中文_123 True
    hello Shyee False
    True True
    hello Shyee False
    helloShyee True
    中文 True
    123 True
    123fh False
    123 True
    四 True
    ⅤⅢⅣ True
    123中文 True
    ⅤⅢⅣasd True

    +]]>
    + + python + + + 入门 + python + +
    + + python入门3 + /2020/03/05/python%E5%85%A5%E9%97%A83/ + python入门3

    image-20210129170554037

    +

    利用matplotlib画图

    +

    import matplotlib.pyplot as plt

    +

    plt.figure(figsize=(),dpi=) figsize:指定图的长宽 dpi: 图像的清晰度 返回fig对象

    +

    绘制图像 plt.plot()

    +

    显示图像

    +

    plt.show()

    +
    # 显示天气
    import matplotlib.pyplot as plt

    # 创建画布
    plt.figure(figsize=(10,10),dpi=100)

    # 绘制折线
    plt.plot([1,2,3,4,5,6,7],[17,17,18,15,11,11,8])

    # 显示图像
    plt.show()
    + + + +

    image-20210131195633439

    +
    # 自定义x y刻度

    # x要显示的刻度
    # plt.xticks(x,)

    # y要显示的刻度
    # plt.yticks(y,)

    import matplotlib.pyplot as plt
    import random

    # 解决中文乱码问题
    plt.rcParams['font.sans-serif']=['SimHei']
    plt.rcParams['axes.unicode_minus']=False

    # 画出温度变化图
    # 准备xy坐标数据
    x=range(60)
    y_DongYing=[random.uniform(15,18) for i in x]

    # 插入上海的数据
    y_ShangHai=[random.uniform(25,28) for i in x]

    # 创建画布
    plt.figure(figsize=(20,8),dpi=100)

    # 绘制折线图
    plt.plot(x,y_DongYing,label='东营')
    plt.plot(x,y_ShangHai,color='g',linestyle='--',label='上海')#线的风格

    # 构造x的刻度
    xTicksLabel=["11点{}分".format(i) for i in x]
    # 构造y的刻度
    yTicks=range(40)
    # 修改x y轴坐标的刻度显示
    plt.xticks(x[::5],xTicksLabel[::5])
    plt.yticks(yTicks[::5])

    # 添加网格显示
    plt.grid(True,linestyle="--",alpha=1)#alpha:透明度

    # 添加描述信息
    plt.xlabel("时间")
    plt.ylabel("温度")
    plt.title("当地气温变化",fontsize=22)

    # 图像保存
    plt.savefig("D:/pictures/当地气温变化.png")

    # 显示图例
    plt.legend(loc='best')#等于plt.legend(loc=0)

    plt.show()
    + +

    当地气温变化

    +

    多个坐标系实现绘图

    # 自定义x y刻度

    # x要显示的刻度
    # plt.xticks(x,)

    # y要显示的刻度
    # plt.yticks(y,)

    import matplotlib.pyplot as plt
    import random

    # 解决中文乱码问题
    plt.rcParams['font.sans-serif']=['SimHei']
    plt.rcParams['axes.unicode_minus']=False

    # 画出温度变化图
    # 准备xy坐标数据
    x=range(60)
    y_DongYing=[random.uniform(15,18) for i in x]

    # 插入上海的数据
    y_ShangHai=[random.uniform(25,28) for i in x]

    # 创建画布
    fig,axes=plt.subplots(nrows=1,ncols=2,figsize=(20,8),dpi=100)

    # 绘制折线图
    axes[0].plot(x,y_DongYing,label='东营')
    axes[1].plot(x,y_ShangHai,color='g',linestyle='--',label='上海')#线的风格


    # 构造x的刻度
    xTicksLabel=["11点{}分".format(i) for i in x]
    # 构造y的刻度
    yTicks=range(40)
    #修改刻度显示
    axes[0].set_xticks(x[::5])
    axes[0].set_yticks(yTicks[::5])

    axes[0].set_xticklabels(xTicksLabel[::5])

    axes[1].set_xticks(x[::5])
    axes[1].set_yticks(yTicks[::5])

    axes[1].set_xticklabels(xTicksLabel[::5])
    # 添加网格
    axes[0].grid(True,linestyle="--",alpha=1)
    axes[1].grid(True,linestyle="--",alpha=1)

    # 添加描述信息
    axes[0].set_xlabel("时间")
    axes[0].set_ylabel("温度")
    axes[0].set_title("当地气温变化",fontsize=22)
    axes[1].set_xlabel("时间")
    axes[1].set_ylabel("温度")
    axes[1].set_title("当地气温变化",fontsize=22)


    # 显示图例
    axes[0].legend(loc='best')#等于plt.legend(loc=0)
    axes[1].legend(loc='best')#等于plt.legend(loc=0)

    plt.show()
    + +

    download

    +

    其他领域

    import numpy as np

    x=np.linspace(-10,10,1000)
    y=np.sin(x)
    plt.figure(figsize=(20,8),dpi=100)
    plt.plot(x,y)
    plt.grid()
    plt.show()
    + +

    download

    +]]>
    + + python + + + 入门 + python + +
    + + 从零开始学习螺旋波等离子体 + /2023/05/23/%E4%BB%8E%E9%9B%B6%E5%BC%80%E5%A7%8B%E5%AD%A6%E4%B9%A0%E8%9E%BA%E6%97%8B%E6%B3%A2%E7%AD%89%E7%A6%BB%E5%AD%90%E4%BD%93/ + 维基百科的定义如下

    在电磁学中,螺旋波是一种低频电磁波,在磁场存在的约束等离子体中可以存在。最初被观察到的螺旋波是大气哨声波,但它们也存在于固体导体或任何其他电磁等离子体中。波中的电场被霍尔效应所主导,几乎垂直于电流(而不是平行的,如果没有磁场),因此波的传播分量是螺旋形的,因此称为“螺旋波”。这个术语是由Aigrain创造的。

    +

    螺旋波有一种特殊的能力,可以在低温和高磁场条件下穿过纯金属。在普通导体中,大多数电磁波都不能做到这一点,因为由于自由电子的存在,金属的高导电性会起到屏蔽电磁场的作用。实际上,通常情况下电磁波会在金属上经历非常薄的皮深度:当试图进入金属时,电场或磁场会很快反射。 (因此是金属的光泽。)然而,皮深度取决于角频率的平方根的倒数。因此,低频电磁波可能能够克服皮深度问题,并遍布整个材料。

    +

    螺旋波的一个特性(仅使用霍尔效应项和电阻率项进行简单计算即可证明)是,在样品表面与磁场平行的位置,一个模式中包含的电流在完美导电的极限下“趋向于无穷大”;因此在这种表面区域的焦耳热损失趋向于一个非零极限。表面模式在与磁场平行的圆柱形样品中特别普遍,对于这种配置,方程的确切解法已经找到,并在随后的实验中发挥重要作用。

    +

    光滑模式和其超高电流密度的实用意义最初并未被认识到,但在几年之后,Boswell发现了螺旋波的优越等离子体产生能力,实现的电荷密度比以前的方法高出10倍,而不需要磁场。

    +

    从那时起,螺旋波在许多科学和工业应用中得到使用,无论何时需要高效的等离子体生成,例如在核聚变反应器和空间推进中(螺旋双层推进器和可变比冲磁约束等离子体火箭在其等离子体加热阶段中都利用了螺旋波)。螺旋波也用于等离子体刻蚀的程序中,用于制造计算机微电路。

    +

    螺旋放电是通过无线电频率加热诱导的螺旋波来激发等离子体。螺旋等离子源和感应耦合等离子体(ICP)之间的区别在于天线轴向存在一个磁场。这个磁场的存在创建了一个具有更高电离效率和更大电子密度的螺旋工作模式,而不是典型的ICP。目前,澳大利亚国立大学正在研究这项技术的应用。由商业开发的磁等离子发动机VASIMR也利用螺旋放电来产生其发动机中的等离子体。潜在地,基于螺旋双层推进器等离子体的火箭非常适合星际旅行。

    +]]>
    + + helicon + + + helicon + plasma + +
    + + 做根网线 + /2020/03/05/%E5%81%9A%E6%A0%B9%E7%BD%91%E7%BA%BF/ + 如题🛠

    +

    双绞线+RJ-45连接器(水晶头)=直通线/交叉线

    +

    直通线

    双绞线缆两端按照EIA/TIA568B规格连接水晶头,称该双绞线缆为直通线。

    +

    image-20200313084755969

    +

    交叉线

    双绞线缆一端按照EIA/TIA568A规格连接水晶头,另一端按EIA/TIA568B规格连接
    水晶头,称该双绞线缆为交叉线。

    +

    image-20200313084850783

    +

    Cisco网络设备中

    相同类型设备之间,用交叉线连接
    不同类型设备之间,用直通线连接
    目前大部分网络设备都支持自适应

    +

    发送和接收

    不同类型设备:直通线

    发送(1/2)–>接收(1/2 )
    接收(3/6)<–发送(3/6 )
    image-20200313085312548

    +
    相同类型设备:交叉线

    发送(1/2)–>接收(3/6)
    接收(1/2 )<–发送(3/6 )

    +

    image-20200313085614513

    +

    自适应就是通过检测确定对方的发送端和接收端

    +

    EIA/TIA568B规格线序

    image-20200313085720071

    +]]>
    + + 计算机网络 + + + 双绞线 + 直通线 + 交叉线 + +
    + + 使用comsol仿真ICP + /2023/05/09/%E4%BD%BF%E7%94%A8comsol%E4%BB%BF%E7%9C%9FICP/ + 直接版
      +
    1. 打开comsol
    2. +
    3. 点击打开案例库
    4. +
    5. 选择ICP,打开
    6. +
    7. 计算,导出结果
    8. +
    +

    手动版

    感应耦合等离子体

    对于感应放电,求解频域中的磁失势
    Alt text

    +

    感应耦合等离子体相当于等离子体和磁场的耦合建模

    +

    磁场和等离子体耦合

    等离子体计算得到的电导率耦合到磁场,用于计算电磁场分布

    +

    磁场计算得到的热源耦合到等离子体接口中

    +

    等离子体电导耦合

    +

    查找资料(文献)

    从COMSOL官网查找ICP

    +

    选择ICP_torch

    +

    可以看到官网给定的参数,将这段参数保存为xxx.txt

    +
    T0 300[K] "环境温度"
    Pext 11[kW] "线圈激励功率"
    f0 3[MHz] "线圈激励频率"
    r_3 125[mm] "轴向长度:计算域"
    L_3 200[mm] "高度:计算域和鞘管"
    d_1 2[mm] "厚度:载流子管"
    L_0 50[mm] "高度:载流子管和中心管"
    r_1 3.7[mm] "内半径:载流子管"
    d_2 2.2[mm] "厚度:中心管"
    r_2 18.8[mm] "内半径:中心管"
    d_3 3.5[mm] "厚度:鞘管"
    r_0 25[mm] "内半径:鞘管"
    d_c 6[mm] "直径:线圈"
    r_c 33[mm] "轴向长度:线圈中心"
    L_1 63[mm] "高度:下线圈的中心"
    L_2 121[mm] "高度:上线圈的中心"
    Q_1 1[l/min] "气流:载流子管"
    Q_2 3[l/min] "气流:中心管"
    Q_3 31[l/min] "气流:鞘管"
    M 0.04[kg/mole] "摩尔质量:氩"
    mv_stp 22.4[l/mole] "stp 下的摩尔体积"
    mdot1 M*Q_1/mv_stp "质量流率:载流子管"
    mdot2 M*Q_2/mv_stp "质量流率:中心管"
    mdot3 M*Q_3/mv_stp "质量流率:鞘管"
    rho_stp 1.91[kg/m^3] "stp 下的氩密度"
    A1 pi*(r_1)^2 "横截面积:载气流"
    A2 pi*(r_2^2-(r_1+d_1)^2) "横截面积:中心气流"
    A3 pi*(r_0^2-(r_2+d_2)^2) "横截面积:鞘管气流"
    v1 mdot1/rho_stp/A1 "速度:载气流"
    v2 mdot2/rho_stp/A2 "速度:中心气流"
    v3 mdot3/rho_stp/A3 "速度:鞘管气流"
    + +

    理论

    假定热等离子体处于部分至完全的局部热力学平衡 (LTE) 条件下,因此这类等离子体可以被视为导电流体混合物,可以使用磁流体动力学 (MHD) 方程来建模。本模型介绍如何使用 “平衡放电,面外电流”接口(可用于二维和二维轴对称)来模拟电感耦合等离子体炬中产生的等离子体。

    +

    需要建模的ICP等离子体的几何结构

    +

    Alt text

    +

    电感耦合等离子体炬的几何结构,炬由三个同心石英管组成,气体从底部注入,从顶部喷出。在此模型中,通过在 3MHz 下运行的三匝线圈将 11 kW 的固定功率传递到等离子体。

    +

    模型定义

      +
    • 等离子体炬通过完全轴对称的构型进行建模。
    • +
    • 等离子体内部的电流由面外 (即方位角方向)的感应电流控制。
    • +
    • 线圈由横截面为圆形、直径为6mm的平行载流环组成。这意味着忽略了线圈电流的轴向分量。
    • +
    • 大气压下的纯氩等离子体稳态层流。
    • +
    • 局部热力学平衡 (LTE) 条件下的光学薄等离子体。
    • +
    +

    Alt text

    +/pic/image4.png + +

    ICP炬示意图。气体从底部(v1、v2和v3)进入,从顶部流出。

    +

    在本模型中,以3MHz的频率向三匝线圈提供激励。然后,通过焦耳热使在鞘管(等离子体约束管)中流动的气体电离。

    +

    本模型通过使用频域-稳态研究结合单匝线圈特征来求解,其中为系统设置了固定功率(11kW)。通过固定功率,线圈中的电流和电势会随着等离子体电导率的增加发生变化。

    +

    本模型中包含三种不同气流速度(载流子管的速度 v1、中心管的速度 v2、鞘管的速度v3)的纯氩气。在“平衡放电”条件下从材料库中加载与温度相关的氩的物理属性。请注意,物理属性的温度范围从500K到25,000K。另请注意,由于数值稳定性的原因,我们使用最小电导率1S/m。

    +

    如果初始温度过低,得到的解很可能对应于最小电导率的平坦分布(默认为1S/m)。这显然是一个没有意义的解,事实上这是最容易获得的解。为了避免这种情况,从更接近实验值的较高温度开始。务必绘制电导率图,以查看是否设置为最小电导率。

    +

    新建

    打开COMSOL,新建-模型向导

    +

    选择二维轴对称

    +

    物理场选择 等离子体-电感耦合等离子体-添加

    +

    选择研究-频域-瞬态

    +

    这个求解器是一个双向耦合求解器

    +

    根节点

    选择单位mm

    +

    几何 1

    模型开发器窗口的组件1(comp1)节点下,单击几何1

    +

    几何设置窗口中,定位到单位

    +

    长度单位列表中选择mm

    +

    全局定义

    参数1

    模型开发器窗口的全局定义节点下,单击参数1

    +

    参数设置窗口中,定位到参数栏。

    +

    单击从文件加载

    +

    选择之前的xxx.txt,定义计算域

    +

    几何1

    矩形1(r1)

    几何工具栏中点击矩形

    +

    矩形设置窗口中,定位到大小和形状栏。

    +

    宽度文本框中键入 “r_3”。

    +

    高度文本框中键入 “L_3”。

    +

    定义载流子管

    +

    矩形2(r2)

    几何工具栏中单击矩形

    +

    矩形设置窗口中,定位到大小和形状栏。

    +

    宽度文本框中键入 “d_1”。

    +

    高度文本框中键入 “L_0”。

    +

    定位到位置栏。在r文本框中键入 “r_1”。

    +

    定义中心管。

    +

    矩形3(r3)

    几何工具栏中单击矩形

    +

    矩形设置窗口中,定位到大小和形状栏。

    +

    宽度文本框中键入 “d_2”。

    +

    高度文本框中键入 “L_0”。

    +

    定位到位置栏。在r文本框中键入 “r_2”。

    +

    定义管

    +

    矩形4(r4)

    几何工具栏中单击矩形

    +

    矩形设置窗口中,定位到大小和形状栏。

    +

    宽度文本框中键入 “d_3”。

    +

    高度文本框中键入 “L_3”。

    +

    定位到位置栏。在r文本框中键入 “r_0”。

    +

    定义线圈。

    +

    圆1(c1)

    几何工具栏中单击

    +

    设置窗口中,定位到大小和形状栏。

    +

    半径文本框中键入“d_c/2”。

    +

    定位到位置栏。在r文本框中键入“r_c”。

    +

    z文本框中键入“L_1”。

    +

    圆2(c2)

    几何工具栏中单击

    +

    设置窗口中,定位到大小和形状栏。

    +

    半径文本框中键入“d_c/2”。

    +

    定位到位置栏。在r文本框中键入 “r_c”。

    +

    z文本框中键入“(L_1+L_2)/2”。

    +

    圆3(c3)

    几何工具栏中单击

    +

    设置窗口中,定位到大小和形状栏。

    +

    半径文本框中键入 “d_c/2”。

    +

    定位到位置栏。在r文本框中键入 “r_c”。

    +

    z文本框中键入 “L_2”。

    +

    单击构建所有对象

    +

    定义其他域类型以便于选择。

    +

    定义

    空气

    在定义工具栏中单击 显式。

    +

    在显式的设置窗口中,在标签文本框中键入 “空气”。

    +

    选择 “域” 5。

    +

    等离子体

    在定义工具栏中单击 显式。

    +

    在显式的设置窗口中,在标签文本框中键入 “等离子体”。

    +

    选择 “域” 1。

    +

    石英

    在定义工具栏中单击 显式。

    +

    在显式的设置窗口中,在标签文本框中键入 “石英”。

    +

    选择 “域” 2–4。

    +

    线圈

    在定义工具栏中单击 显式。

    +

    在显式的设置窗口中,在标签文本框中键入 “线圈”。

    +

    选择 “域” 6–8。

    +

    使用材料库添加模型中使用的不同材料。

    +

    添加材料

    在主屏幕工具栏中,单击 添加材料以打开添加材料窗口。

    +

    转到添加材料窗口。

    +

    在模型树中选择内置材料 >Air。

    +

    单击窗口工具栏中的添加到组件。

    +

    在模型树中选择 AC/DC>Copper。

    +

    单击窗口工具栏中的添加到组件。

    +

    在模型树中选择 AC/DC>Quartz。

    +

    单击窗口工具栏中的添加到组件。

    +

    在模型树中选择材料 >Argon。

    +

    单击窗口工具栏中的添加到组件。

    +

    在主屏幕工具栏中,单击 添加材料以关闭添加材料窗口。

    +

    材料

    Air (mat1)

    在模型开发器窗口的组件 1 (comp1)> 材料节点下,单击 Air (mat1)。

    +

    在材料的设置窗口中,定位到几何实体选择栏。

    +

    从选择列表中选择空气。

    +

    Copper (mat2)

    在模型开发器窗口中,单击 Copper (mat2)。

    +

    在材料的设置窗口中,定位到几何实体选择栏。

    +

    从选择列表中选择线圈。

    +

    Quartz (mat3)

    在模型开发器窗口中,单击 Quartz (mat3)。

    +

    在材料的设置窗口中,定位到几何实体选择栏。

    +

    从选择列表中选择石英。

    +

    Argon (mat4)

    在模型开发器窗口中,单击 Argon (mat4)。

    +

    在材料的设置窗口中,定位到几何实体选择栏。

    +

    从选择列表中选择等离子体。

    +

    调整组成模型的每个物理场的选择和特征。

    +

    磁场接口用于整个计算域,本例使用 “单导体线圈”特征将激励功率传递到等离子体。

    +

    磁场 (MF)

    在模型开发器窗口的组件 1 (comp1) 节点下,单击磁场 (mf)。

    +

    在磁场的设置窗口中,单击以展开离散化栏。

    +

    从磁矢势列表中选择线性单元。

    +

    线圈 1

    在物理场工具栏中单击 域,然后选择线圈。

    +

    在线圈的设置窗口中,定位到域选择栏。

    +

    从选择列表中选择线圈。

    +

    定位到线圈栏。选中线圈组复选框。

    +

    从线圈激励列表中选择功率。

    +

    在 Pcoil 文本框中键入 “Pext”。

    +

    模型中忽略了空气中的传热。

    +

    流体传热 (HT)

    在模型开发器窗口的组件 1 (comp1) 节点下,单击流体传热 (ht)。

    +

    选择 “域” 1 和 4。

    +

    固体 1

    在物理场工具栏中单击 域,然后选择固体。

    +

    选择 “域” 4。

    +

    初始值 1

    务必从高温开始。

    +

    在模型开发器窗口中,单击初始值 1。

    +

    在初始值的设置窗口中,定位到初始值栏。

    +

    在 T 文本框中键入 “6000”。

    +

    为传热模型的实体部分 (管和线圈)添加 “固体传热”特征。

    +

    温度 1

    在物理场工具栏中单击 边界,然后选择温度。

    +

    选择 “边界” 2、 8、 13、 15 和 17。

    +

    在温度的设置窗口中,定位到温度栏。

    +

    在 T0 文本框中键入 “T0”。

    +

    流出 1

    在物理场工具栏中单击 边界,然后选择流出。

    +

    在图形工具栏中单击 缩放到窗口大小按钮。

    +

    选择 “边界” 3。

    +

    单相流仅应用于等离子体区域。

    +

    层 流 (SPF)

    由于密度变化并不小,我们不能将流动视为不可压缩流动。因此,将流动设置为弱可压缩流动。

    +

    在模型开发器窗口的组件 1 (comp1) 节点下,单击层流 (spf)。

    +

    在层流的设置窗口中,定位到物理模型栏。

    +

    从可压缩性列表中选择弱可压缩流动。

    +

    定位到域选择栏。从选择列表中选择等离子体。

    +

    单击以展开方程栏。从方程形式列表中选择稳态。

    +

    入口 1

    在物理场工具栏中单击 边界,然后选择入口。

    +

    添加具有合适速度的入口。

    +

    选择 “边界” 2。

    +

    在入口的设置窗口中,定位到速度栏。

    +

    在 U0 文本框中键入 “v1”。

    +

    入口 2

    在物理场工具栏中单击 边界,然后选择入口。

    +

    选择 “边界” 8。

    +

    在入口的设置窗口中,定位到速度栏。

    +

    在 U0 文本框中键入 “v2”。

    +

    入口 3

    在物理场工具栏中单击 边界,然后选择入口。

    +

    选择 “边界” 13。

    +

    在入口的设置窗口中,定位到速度栏。

    +

    在 U0 文本框中键入 “v3”。

    +

    出口 1

    在物理场工具栏中单击 边界,然后选择出口。

    +

    选择 “边界” 3。

    +

    在出口的设置窗口中,定位到压力条件栏。

    +

    清除抑制回流复选框。

    +

    网格 1

    大小

    在模型开发器窗口的组件 1 (comp1) 节点下,右键单击网格 1 并选择编辑物理场引导的序列。

    +

    大小 1

    在大小的设置窗口中,定位到单元大小栏。

    +

    从预定义列表中选择超细化。

    +

    边 1

    在网格工具栏中单击三角边。

    +

    拖放到大小节点下方。

    +

    选择 “边界” 2、 8 和 13。

    +

    大小 1

    右键单击边 1 并选择大小。

    +

    在大小的设置窗口中,定位到单元大小栏。

    +

    单击定制按钮。

    +

    单击以折叠单元大小参数栏。单击以展开单元大小参数栏。

    +

    选中最大单元大小复选框。在关联文本框中键入 “0.5”。

    +

    大小 2

    在模型开发器窗口的组件 1 (comp1)> 网格 1 节点下,单击大小 2。

    +

    在大小的设置窗口中,定位到单元大小栏。

    +

    从预定义列表中选择超细化。

    +

    边界层 2

    在网格工具栏中单击 边界层。

    +

    右键单击边界层 2 并选择上移。

    +

    在边界层的设置窗口中,定位到域选择栏。

    +

    从几何实体层列表中选择域。

    +

    选择 “域” 6–8。

    +

    边界层属性

    在模型开发器窗口中,单击边界层属性。

    +

    选择 “边界” 21–32。

    +

    在边界层属性的设置窗口中,定位到层栏。

    +

    在层数文本框中键入 “4”。

    +

    从厚度明细列表中选择第一层。

    +

    在厚度文本框中键入 “8[um]”。

    +

    单击 全部构建。

    +

    对于这种情况,最好是全耦合求解方程,需要更改求解器中的一些设置以提高稳定性。

    +

    研究 1

    步骤 1:频域 - 稳态

    在模型开发器窗口的研究 1 节点下,单击步骤 1: 频域 - 稳态。

    +

    在频域 - 稳态的设置窗口中,定位到研究设置栏。

    +

    在频率文本框中键入 “f0”。

    +

    解 1 (sol1)

    在研究工具栏中单击 显示默认求解器。

    +

    在模型开发器窗口中展开解 1 (sol1) 节点。

    +

    在模型开发器窗口中展开研究 1> 求解器配置 > 解 1 (sol1)> 稳态求解器 1 节点。

    +

    右键单击研究 1> 求解器配置 > 解 1 (sol1)> 稳态求解器 1 并选择全耦合。

    +

    在全耦合的设置窗口中,单击以展开方法和终止栏。

    +

    在初始阻尼系数文本框中键入 “1e-4”。

    +

    在最小阻尼系数文本框中键入 “1.0E-6”。

    +

    在更新步长的限制文本框中键入 “1.2”。

    +

    在恢复阻尼系数文本框中键入 “0.1”。

    +

    在最大迭代次数文本框中键入 “200”。

    +

    在研究工具栏中单击 计算。

    +

    结果

    二维温度

    在主屏幕工具栏中单击 添加绘图组,然后选择二维绘图组。

    +

    在二维绘图组的设置窗口中,在标签文本框中键入 “二维温度”。

    +

    表面 1

    右键单击二维温度并选择表面。

    +

    在表面的设置窗口中,定位到表达式栏。

    +

    在表达式文本框中键入 “T”。

    +

    在二维温度工具栏中单击 绘制。

    +

    二维温度

    在模型开发器窗口中,右键单击二维温度并选择上移。

    +

    电导率

    在主屏幕工具栏中单击 添加绘图组,然后选择二维绘图组。

    +

    在二维绘图组的设置窗口中,在标签文本框中键入 “电导率”。

    +

    表面 1

    右键单击电导率并选择表面。

    +

    在表面的设置窗口中,定位到表达式栏。

    +

    在表达式文本框中键入 “mf.sigmarr”。

    +

    选择 1

    右键单击表面 1 并选择选择。

    +

    选择 “域” 1。

    +

    在电导率工具栏中单击 绘制。

    +

    电导率

    在模型开发器窗口的结果节点下,右键单击电导率并选择上移

    +

    结果

    氩等离子体的等离子体温度分布

    +

    Alt text

    +

    氩等离子体的等离子体速度大小

    +

    Alt text

    +

    线圈附近的温度峰值达到10,000K。等离子体电导率随着温度的升高而增加,在最高温度区域具有最大值,

    +

    下图绘制了等离子体的电导率。

    +

    Alt text

    +

    下图显示磁通量模。

    +

    Alt text

    +

    请注意,由于集肤效应,等离子体的电导率屏蔽了磁通量。

    +

    参考文献

      +
    1. S. Xue, P. Proulx, and M.I. Boulos, “Extended-field electromagnetic model for inductively
      coupled plasma,” J. Phys. D. 34, 1897, 2001.
    2. +
    +]]>
    + + 仿真 + + + comsol + 仿真 + +
    + + 关于土豆🥔 + /2020/03/02/%E5%85%B3%E4%BA%8E%E5%9C%9F%E8%B1%86%F0%9F%A5%94/ + 关于🥔啊~

    + + +

    如何刮土豆才能刮的干净?

    + +

    使劲刮

    +

    如何切土豆才能把土豆切断?

    + +

    使劲切

    +

    😎

    +]]>
    + + 生活 + 烧饭 + + + 土豆 + +
    + + 关于安装MyBatis + /2020/03/16/%E5%85%B3%E4%BA%8E%E5%AE%89%E8%A3%85MyBatis/ + 环境:

    +
      +
    1. JDK 13.0.2
    2. +
    3. tomcat 9.0.3
    4. +
    5. mybatis 3.5.4
    6. +
    7. mysql 8
    8. +
    +

    入门

    早期为:ibatis:apache

    +

    2010年被Google收购改称:Mybatis

    +

    主要作用:简化JDBC操作,实现数据的持久化。

    +

    ORM:Object Relational Mapping,可以使开发人员像操作对象一样操作数据库

    +

    mybatis是ORM的一种实现

    +

    下载

    之前看过的一个教程是使用Idea的,也就是直接使用依赖库导入,这次看的是导入jar使用。

    +

    去官网

    img

    +

    选择Getting Started

    +

    img

    +

    会有Maven方式,当然使用Idea就可以直接复制代码框内代码到idea中,但这次选择jar的超链接。

    +

    img

    +

    就来到了熟悉的github,在最新版本下,有三个选项,这里选择第一个zip包下载。

    +

    img

    +

    下好之后是个zip,

    +

    img

    +

    打开以后目录文件如图,

    +

    lib文件夹存放mybatis的一些依赖包,

    +

    license就是字面意思 许可证,

    +

    mybatis-3.5.4.jar即要用到的jar,

    +

    .pdf即使用说明书,

    +

    NOTICE也是字面意思 注意事项。

    +

    使用

    简单使用一下:

    +

    导包

    打开eclipse,新建一个JAVA项目,因为mybatis是操控数据库的,所以暂时可以先间隔Javaproject试一下。

    +

    这里起名“TestMyBatis”,将mybatis-3.5.4.jar拖到src里面,顺便add to buildpath,添加环境。

    +

    建表

    打开cmd或者使用navicat,因为我的navicat建数据库总是会有数据编码混乱的问题,我一般建表都是用cmd。

    +

    img

    +

    创建实体类及映射关系

    创建实体类 Person

    +

    img

    +

    构建这个类

    +

    -

    -

    -

    -

    -

    -

    -

    -

    -

    -

    -

    -

    -

    -

    -

    -

    +
    private String id;private String name;private int age;
    public Person() { }public Person(String id, String name, int age) { super(); this.id = id; this.name = name; this.age = age;}public String getId() { return id;}public void setId(String id) { this.id = id;}public String getName() { return name;}public void setName(String name) { this.name = name;}public int getAge() { return age;}public void setAge(int age) { this.age = age;}
    + +

    创建配置文件映射表和类的映射 .xml文件

    +

    img

    +

    点这里转换视图

    +

    在刚刚的.pdf文件中有大概的配置方法,打开后找到“Exploring Mapped SQL Statements

    +

    下面有

    +

    -

    -

    -

    -

    +
    <?xml version="1.0" encoding="UTF-8" ?> <!DOCTYPE mapper  PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd"> <mapper namespace="org.mybatis.example.BlogMapper">      <select id="selectBlog" resultType="Blog">            select * from Blog where id = #{id}    </select> </mapper>
    + +

    直接复制,到刚刚的xml中,更改namespace 后面的内容为自己的xmltop.eshyee.entity.personMapper

    +

    改完之后

    +

    -

    -

    -

    -

    +
    <?xml version="1.0" encoding="UTF-8" ?> <!DOCTYPE mapper  PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"  "http://mybatis.org/dtd/mybatis-3-mapper.dtd"><mapper namespace="top.eshyee.entity.personMapper">  <select id="queryPersonById" resultType="Person" parameterType="String">    select * from person where id= #{id}  </select></mapper>
    + +

    在创建一个配置文件,在src下创建一个叫config.xml的文件。

    +

    在pdf中查找“Building SqlSessionFactory from XML

    +

    这里需要提前准备好一个用来链接的jar MySQL connector

    +

    网址:https://dev.mysql.com/downloads/connector/j/

    +

    img

    +

    选zip,下好之后,里面乱七八糟的东西就不细致分析了,会点工地英语看看就好。主要使用mysql-connector-java-8.0.19.jar。拖到eclipse ,add一下环境。

    +

    配置xml如下:

    +

    -

    -

    -

    -

    -

    -

    -

    -

    -

    <?xml version="1.0" encoding="UTF-8" ?> <!DOCTYPE configuration  PUBLIC "-//mybatis.org//DTD Config 3.0//EN"  "http://mybatis.org/dtd/mybatis-3-config.dtd"><configuration>  <environments default="development">    <environment id="development">      <transactionManager type="JDBC" />      <dataSource type="POOLED">        <property name="driver" value="com.mysql.cj.jdbc.Driver" />        <property name="url" value="jdbc:mysql://localhost:3306/test?useSSL=false&amp;serverTimezone=UTC" />        <property name="username" value="我的用户名" />        <property name="password" value="我的密码" />      </dataSource>    </environment>  </environments>  <mappers>    <mapper resource="top/eshyee/entity/personMapper.xml" />  </mappers></configuration>
    + +

    ok写个测试用例

    +

    -

    -

    -

    -

    -

    -

    public static void main(String[] args) throws IOException {    // TODO Auto-generated method stub    //加载config    Reader reader =Resources.getResourceAsReader("config.xml");    SqlSessionFactory sessionFactory=new SqlSessionFactoryBuilder().build(reader);    SqlSession session= sessionFactory.openSession();    String statement ="top.eshyee.entity.personMapper.queryPersonById";    Person person=session.selectOne(statement,"1234567890");    //这里的1234567890是我接下来要插入的字符串    System.out.println(person.toString());    session.close();  }
    + +

    同时在person下写一个toString()方法,这个可以自己来定,只要能看到person里的值就🉑。

    +

    测试

    测试一下~~在数据库中插入一行数据

    +

    img

    +

    run一下test

    +

    img

    +

    🆗

    +

    常见问题

      +
    1. 写完之后run的时候除了问题,报了一坨错其中有个timezone…想起来url写的jdbc:mysql://localhost:3306/test,然后后面加了?useSSL=false&serverTimezone=UTC,结果还不对,就百度了一下&在xml中是一种很神奇的存在得写成&.
    2. +
    3. Resource导包的时候选择org.apache.ibatis.io.*;
    4. +
    +

    总结

    从不总结👌

    +

    喜欢此内容的人还喜欢

    +

    恭喜中国作协,你们的会员汪芳和港独一起被BBC授奖了!恭喜中国作协,你们的会员汪芳和港独一起被BBC授奖了!…明德时评不喜欢不看的原因确定内容质量低 不看此公众号BC爆增1933例,17人丧生,27校沦陷,麦当劳大统华中招,持续恶化学校或将关闭BC爆增1933例,17人丧生,27校沦陷,麦当劳大统华中招,持续恶化学校或将关闭…每天温哥华不喜欢不看的原因确定内容质量低 不看此公众号

    +

    img

    +

    微信扫一扫
    关注该公众号

    +]]>
    + + MyBatis系列 + + + MyBatis + +
    + + 上海之行 + /2020/03/01/%E4%B8%8A%E6%B5%B7%E4%B9%8B%E8%A1%8C/ + 2020年的第一站✈,想想已经过去将近三个月了。

    +

    1月5日

    7:00 庆阳

    已经准备了半个月的好心情被这一场雪搞的无比焦急。本以为五号,我可以睡个懒觉(✈是22点西安–>上海的),然后,去买点路上吃的零食🍪🍪,再然后坐上去西安的大巴…

    +

    结果,因为不稳定的高速封路的消息,使得我忙活了一早上,在退票与改票之间徘徊。

    +

    14:20 庆阳

    终于,我还是在14点的时候赶上了一趟正规的赶往咸阳机场的大巴。🤦‍♂️

    +

    18:08 咸阳机场

    经历了漫长的奔波,我还是顺利的赶到了咸阳机场,顺利的取出机票,顺利值机。

    + + +

    21:20 候机区

    飞机没有晚点,顺利登机。

    +

    22:00 321客机

    起飞🚀🚀🚀

    +

    1月6日

    00:25 浦东机场

    成功抵达✌并开始对上海进行为期四天的市事访问。

    + + +

    1:55 静安区海友酒店

    下了飞机,就接到了在上海工作的学长的电话。真的是超级热情,从飞机出口处一直聊到机场出口处,正巧碰到了即将发车的通宵巴士,花了¥24把我送到了静安寺那片,然后又坐出租(¥18,1.2公里),到了海友酒店楼下,一个比想象中的破了一些的楼。但是上楼上去发现酒店还算是比较新,因为当时看到近期才装修就订了。订的大床,虽然房间很小,但是设施很全,一个人住是真的够了。

    +

    然后就睡觉了💤兴奋得根本睡不着,我也根本不知道我几点睡的。

    +

    6:40 静安区

    我莫名奇妙的醒得这么早。而且,超级累😫。

    +

    但还是起来了,最近的地铁口里我大概1km,之前看到知乎上关于上海旅游有一个共同的point,办一张地铁三日卡💳,¥45 三日随便坐,真的是旅游党的福音,因为我还没有驾照,没法搞租车,所以基本的出行方式就是 腿 hello单车 交通车 和地铁。

    +

    10:00 地铁站

    当售票员说 只收现金的时候 我人都啥了。

    +

    然后转身看到有售公交卡的机子,就顺便办了一张公交卡(旅游版)¥50,貌似不可退,满足了我的收藏欲,接着又下了当地的一个叫Metro大都会的App。

    +
    +

    要睡觉了,迟点更新~

    +]]>
    + + 生活 + 旅行 + + + 上海 + +
    + + 写出这个数 + /2020/03/16/%E5%86%99%E5%87%BA%E8%BF%99%E4%B8%AA%E6%95%B0/ + 写出这个数

    原创 EShyee EShyee 2019-09-26

    +

    写出这个数

    +

    读入一个正整数 n,计算其各位数字之和,用汉语拼音写出和的每一位数字。

    +

    输入格式:

    每个测试输入包含 1 个测试用例,即给出自然数 n 的值。这里保证 n 小于 10100。

    +

    输出格式:

    在一行内输出 n 的各位数字之和的每一位,拼音数字间有 1 空格,但一行中最后一个拼音数字后没有空格。

    +

    输入样例:

    1234567890987654321123456789
    + +

    输出样例:

    yi san wu
    + + + +

    My answer:

    +

    package com.Eshyee.SumIn;

    +

    import java.util.Scanner;

    +

    public class Sum {

    +

    ​ public static void main(String[] args) {

    +

    ​ Scanner in = new Scanner(System.in);

    +

    ​ //输入这个字符串

    +

    ​ String s = in.nextLine();

    +

    ​ int a = 0;

    +

    ​ String c = “\0”;

    +

    ​ for (int i = 0; i < s.length(); i++) {

    +

    ​ //把字符串转换成int类型

    +

    ​ a += s.charAt(i) - 48;

    +

    ​ }

    +

    ​ String n = String.valueOf(a);

    +

    ​ for (int j = 0; j < n.length(); j++) {

    +

    ​ int b = 0;

    +

    ​ b = n.charAt(j) - 48;

    +

    ​ //这里相当于把数字转换成汉字

    +

    ​ switch (b) {

    +

    ​ case 1:

    +

    ​ c += “yi”;

    +

    ​ break;

    +

    ​ case 2:

    +

    ​ c += “er”;

    +

    ​ break;

    +

    ​ case 3:

    +

    ​ c += “san”;

    +

    ​ break;

    +

    ​ case 4:

    +

    ​ c += “si”;

    +

    ​ break;

    +

    ​ case 5:

    +

    ​ c += “wu”;

    +

    ​ break;

    +

    ​ case 6:

    +

    ​ c += “liu”;

    +

    ​ break;

    +

    ​ case 7:

    +

    ​ c += “qi”;

    +

    ​ break;

    +

    ​ case 8:

    +

    ​ c += “ba”;

    +

    ​ break;

    +

    ​ case 9:

    +

    ​ c += “jiu”;

    +

    ​ break;

    +

    ​ case 0:

    +

    ​ c += “ling”;

    +

    ​ break;

    +

    ​ }

    +

    ​ c += “ “;

    +

    ​ }

    +

    ​ System.out.print(c.trim());

    +

    ​ }

    +

    }

    +

    本道题主要用到switch case charAt ascii码等方面的知识点

    +

    主要思想是:

    +

    先获取一串字符,然后遍历字符串,分别转换成int类型

    +

    此时的int是ascii码值 然后减48 获得真正的值

    +

    然后做累加 然后放到一个int里面 做一个switch case(笨办法)

    +

    将得到的这个值转换成汉字

    +

    最后System从console里面输出出来

    +]]>
    + + 算法 + + + 数据结构 + +
    + + 单BSS实验 + /2020/03/13/%E5%8D%95BSS%E5%AE%9E%E9%AA%8C/ + 单BSS实验

    实验内容

      +
    1. 构建基本服务集
    2. +
    3. 安装终端无线网卡
    4. +
    5. 实现基本服务集终端之间通信
    6. +
    +

    在这个基本服务集里面呢,我们是有一个AP和两个终端

    +

    实验目的

      +
    1. 验证基本服务集的通信区域
    2. +
    3. 验证终端与AP之间建立关联的过程
    4. +
    +

    实验原理

    AP与BSS中终端之间要成功建立关联,必须满足条件:

    +
      +
    1. 终端位于AP的有效通信范围内
    2. +
    3. 终端与AP配置相同的服务集标识符SSID
    4. +
    5. 终端与AP配置相同的安全机制和密钥
    6. +
    +

    实验配置

    两个装有无线网卡的笔记本aptop0、laptop1和AP

    +

    讲笔记本移入AP工作区

    +

    为AP0配置SSID

    +

    这里配置为123456

    +

    鉴别防密机制选择WPA2PSK

    +

    输入密钥1234567890

    +

    此时,laptop0和laptop1与AP0之间终止关联

    +

    分别给两个笔记本进行配置

    +

    配置与AP0租同的SSID、鉴别动密机制

    +

    启动笔记本电脑的IP配置实用程序

    +

    安装无线网卡的笔记本电脑,它的默认状态下是通过dhcp自动获取网络信息的,在没有配置dhcp服务器的情况下有操作系统自动的在保留的地址当中169.254.0.0/16当中随机分配IP地址。启动两台笔记本电脑之间的ICMP报文的传输过程,看到两台终端是可以互相通信的

    +

    无线局域网与以太网互联

    实验内容

      +
    1. 构建以下无线局域网和以太网
    2. +
    3. AP实现无线局域网和以太网互连
    4. +
    5. 查看无线MAC帧和以太网MAC帧转换过程
    6. +
    7. 查看交换机转发表内容变化过程
    8. +
    +

    实验目的

      +
    1. 验证AP完成无线局域网MAC帧格式与以太网MAC帧格式相互转换的过程
    2. +
    3. 验证无线局域网和以太网中终端之间的通信过程
    4. +
    +

    实验原理

      +
    1. 分配终端IP地址信息时,每个终端需要配置相同网络地址,因为以太网和无线局域网互连后是同一个网络。
    2. +
    3. AP是链路层设备,能够完成两种格式之间转换原因
    4. +
    +
      +
    • 无线局域网和以太网的MAC地址相同

      +
    • +
    • 两种网络MAC帧格式相似

      +

      以太网MAC帧的一般格式

      +
    • +
    +

    image-20200320090048168

    +

    无线局域网的MAC帧的一般格式

    +

    image-20200320090306579

    +

    都是数据+地址+校验码,等等这样一些控制信息组成的

    +]]>
    + + 计算机网络 + + + Cisco + +
    + + 单交换机小实验 + /2020/03/13/%E5%8D%95%E4%BA%A4%E6%8D%A2%E6%9C%BA%E5%B0%8F%E5%AE%9E%E9%AA%8C/ + 内容

    1、用一台交换机连接四个终端
    2、启动终端A与终端B之间的MAC帧交换过程
    3、观察交换机转发表变化过程
    4、检查ICMP报文至MAC帧的封装过程

    +

    目的

    1、验证交换机的连通性
    2、验证转发表建立过程
    3、验证交换机MAC帧转发过程
    4、验证ICMP报文逐层封装过程

    +

    1.清除MAC表
    ➢Switch#clear mac-address-table
    clear mac-address-table是在特权模式下使用的命令,该命令的作
    用是清除交换机转发表(也称MAC表)中的动态转发项。

    +

    ➢为什么要清除MAC表呢 ?
    在终端之间交换ARP报文时,交换机中会产生转发项,这样会干扰我
    们的验证过程。因此,完成ARP地址解析过程后,清空转发表,开始
    交换机实验。

    +

    2.停止运行CDP
    ➢Switch(config)#no cdp
    run
    no cdp run是全局模式下使用的命令,该命令的作用是停止运行CDP
    ➢CDP是什么 ?为什么要停止运行CDP呢?
    CDP : Cisco Discovery Protocol ( Cisco发现协议) , CDP能检
    测到与交换机直接连接的设备,因此即使终端不发送MAC帧,交换
    机也能检测到各端口连接的终端,并在转发表中创建相应的转发项。

    +

    为了防止CDP干扰交换机实验,应该在交换机中停止运行CDP。

    +

    在设备类型选择框中选择交换机
    设备型号选择框中选择型号为2950-24的交换机把它拖放到工作区

    +

    然后在设备类型选择框中选择终端,设备型号选择框中选择台式机,我们放置四台终端
    用直通线把交换机的四个端回分别和四台终端连接起来。

    +

    image-20200313092558995完成了交换机和终端连接后,为每一个终端配置iP地址和子网掩码

    +

    pc0

    +

    image-20200313092658988

    +

    pc1

    +

    image-20200313092729040

    +

    pc2

    +

    image-20200313092819248

    +

    pc3

    +

    image-20200313092849139

    +

    启动PCO与PC1之间的ICMP报文传输过程

    +

    使得PCO租PC1完成对方IP地址的解析过程

    +

    进入模以操作模式,勾选ICMP

    +

    image-20200313093238525
    然后查看MAC表,
    可以看到MAC表中已经存在MAC转发项

    +

    image-20200313093416948

    +

    通过在特权模式下输入命令clear mac-addresstable,清余MAC表中已经存在的转发项

    +
    Switch>enable
    Switch#clear mac-address-table
    Switch#
    + +

    再次启动PCO与PC1之间的ICMP报文传输过程,采用步进模式查看ICMP报文传输过程

    +

    交换机接收到PC0发送的MAC帧后,在MAC表创建PCO对应的转发项,由于转发表中没有PC1的转发项,所以采用户播这个MAC帧的方式,当交换机接收到PC1发送的MAC帧后,在MAC表当中创建PC1对应的转发项,由于MAC表中已经存在PC0对应的转发项,所以交换机转发该MAC帧给PCO

    +

    查看PC1至PCOCMP报文封装过程

    +

    image-20200313094123758

    +

    ICMP报文封装成IP分组,IP分组的源IP地址是PC1的IP地址192.1.1.2,目的P地址是PC0的P地址192.1.1.1

    +

    IP分组又封装成MAC帧,MAC帧的源MAC地址应该是PC1的MAC地址,目的MAC地址应该是PC0的MAC地址

    +

    image-20200313095215588

    +

    命令模式完成

    +

    pc0cmd下pingpc1

    +
    ping 192.1.1.2
    + +]]>
    + + 计算机网络 + + + Cisco + +
    + + 如何关306的水气 + /2023/05/12/%E5%A6%82%E4%BD%95%E5%85%B3306%E7%9A%84%E6%B0%B4%E6%B0%94/ +
      +
    1. 进入306的阳台
    2. +
    3. 向左手边看去可以看到一个水箱
      水箱
    4. +
    5. 注意水箱上的几个按键
      按键
    6. +
    7. 按下红色按键,液晶屏熄灭,代表OFF
    8. +
    9. 注意左边墙上的闸箱
      闸箱
    10. +
    11. 拉下黑闸
    12. +
    +

    主要关闭氩气和氧气的气瓶

    +
      +
    1. 进入306的阳台
    2. +
    3. 右转走到头
    4. +
    5. 右手边有三个气瓶,最里面的两个是氩气和氧气的气瓶
    6. +
    7. 顺时针旋转阀,直到拧不动为完全关闭(逆时针是开启,也会拧到头,此时为完全打开)
      气瓶
    8. +
    +]]>
    + + 实验 + + + 实验 + 教程 + 阿尔兹海默症拯救计划 + +
    + + 工作分解结构 + /2020/03/13/%E5%B7%A5%E4%BD%9C%E5%88%86%E8%A7%A3%E7%BB%93%E6%9E%84/ + 工作分解结构

    +

    本知识点主要讲述如下内容:

    +

    (1)生活案例引导

    +

    (2)工作分解思想

    +

    生活案例

    +

    你和同学你们2个人一起做菜:炒鸡蛋。问怎么做?

    +

    阶段1:准备材料(包括配料及工具)

    +
      +
    • 准备配料:鸡蛋、葱、姜、蒜、油
    • +
    • 准备工具:碗、搅拌器(或筷子)、锅、火、铲子等
    • +
    • 1个人做(另个人看)还是2个人同时做
    • +
    +

    阶段2:炒鸡蛋

    +

    炒鸡蛋

    +
      +
    • (1个人)(包括搅鸡蛋、热油锅等)
    • +
    • 另个人千吗? 闲着吗?还是准备盘子?(同时吗?)
    • +
    +

    阶段3:盛盘上桌

    +

    工作分解结构的思想

    +

    工作分解结构的思想是:

    +

    项目范围->工作阶段->工作单元->任务

    +

    工作阶段(Phase) 是按时间顺序分布的工作里程碑

    +

    工作单元(Work Unit)是阶段的组成部分,彼此之间可以使串行也可以是并行的
    任务是组成工作单元的单位活动

    +

    工作单元和任务可以逐步细分,但分的过细会导致过于零碎,分得过粗,
    则会不容易控制

    +

    项目经理按分解结构委派和监控项目

    +

    工作分解结构的思想

    +

    为什么需要WBS:

    +

    项目经理按分解结构委深和监控项目,可以准确地预测下面的内容:

    +
      +
    1. WBS明确了完成项0所需要进行的工作

      +
    2. +
    3. WBS能给项日组,管理层和团队成员产生紧迫感

      +
    4. +
    5. WBS能防止项目范围的盲目扩大

      +
    6. +
    7. WBS为管理层和项日经理提供了控制手段

      +
    8. +
    +

    如:

    +

    学生小组做实验的例子:

    +
      +
    • 1)、分配各小组作实验的内容(1天)
    • +
    • 2)、各小组组长分配组员工作、整合(5天)
    • +
    • 3)、整理各小组实验报告,分析,整理(2天)
    • +
    +

    工作分解结构

    +

    本知识点主要讲述如下内容:

    +

    (1)创建工作分解结构

    +

    (2)工作分解结构的表示

    +

    创建工作分解结构

    +

    创建WBS有两种方法:

    +

    自顶向下和自底向上

    +

    1、自顶向下是由一般到特殊的过程

    +

    是先将项目分成阶段,再将阶段分解为工作单元,再将单元分解为任务,最后整合的过程。是最常用的一种方法。本方法容易遗漏单元或任务。

    +

    2、自底向上是由特殊到一般的过程

    +

    是想了解任务,找到相应的解决方案,再逆推到阶段,再到项目分解结构的过程。本方法容易陷入解决方案的泥潭。

    +

    自顶向下创建WBS的过程:

    +

    1、召集相关的管理层人员,项目发起人,团队成员或财务人员

    +

    2、先将项目分解为若干阶段

    +

    3、再将每个阶段分解为若干个单元

    +

    4、将每个单元分解为若干个任务

    +

    5、对WBS中的每个阶段、单元和任务进行复核和修订

    +

    将项目分解为若干阶段:

    +

    从顶层目标入手来确定项目的各个阶段

    +
      +
    • 项目内部存在逻辑上的划分吗(如日期或活动)
    • +
    • 存在代表各个阶段可识别的里程碑吗
    • +
    • 在项目中是否考虑了企业的商业周期
    • +
    • 在项目中是否存在财务责任或限制来标识各阶段
    • +
    • 在公司项目生命周期中有什么因素能影响项目
    • +
    • 你的公司正在采用什么样的项目开发过程
    • +
    +

    划分阶段所使用的工具

    +
      +
    • 白板,即时贴等
    • +
    • MS Excel 或 MS Project
    • +
    • 控制会议的内容
    • +
    +

    将项目阶段分解为若干单元/任务:

    +
      +
    • 从阶段1,阶段2,…,按阶段顺序进行划分
    • +
    • 将单元和任务不可以分解的太细
    • +
    • 只需要注明单元和任务干什么,而不是如何去做
    • +
    • 检查任务依赖:一个任务必须等另一个任务完成后才开始
    • +
    • 检查任务限制:一个任务必须在某个特定时间开始
    • +
    • 检查任务的串行关系,并注明
    • +
    • 检查任务的并行关系,并注明
    • +
    +

    使用的工具

    +
      +
    • 白板,即时贴等
    • +
    • MS Excel 或 MS Project
    • +
    • 控制会议的内容
    • +
    +

    建立现实的项目时间表的任务:

    +
      +
    • 严格保证项目的范围,不允许随意改变
    • +
    • 项目范围若一定要改变,则应重新校订可行性、预算、WBS
    • +
    • 保证项目的各阶段、各单元、各任务的时间分配是合理的
    • +
    • 组织团队成员或外聘专家对项目的各任务的详细讨论
    • +
    • 检查每个任务完成的时间和可交付的成果(!!!)
    • +
    • 检查每个单元完成的时间和可交付的成果(!!!)
    • +
    • 检查每个阶段完成的时间和可交付的成果(!!!)
    • +
    • 检查整个项目完成的时间和可交付的成果(!!!)
    • +
    +

    严格按WBS委派和执行任务,确定项目经理的权威性可管理角色

    +

    项目经理应经常和团队成员(特别是核心成员)交流,保持项目团队的积极向上精神,建立信心,增强信任感和价值感

    +

    工作分解结构的表示(图结构示例)

    +

    image-20200323104341369

    +

    目录结构示例

    +

    1 Alpha

    +

    1.1 问题定义

    +

    1.2 可行性研究

    +

    1.3 需求分析

    +

    1.4 设计

    +

    1.4.1 UI 设计

    +

    1.4.2 网络设计

    +

    1.4.3 数据库设计

    +

    1.4.4 架构设计

    +

    1.4.5 业务所涉及

    +

    1.5 编码

    +

    2 Beta

    +

    3 Finial

    +]]>
    + + 项目管理 + + + 项目管理 + +
    + + 普林斯顿等离子体课 + /2023/05/24/%E6%99%AE%E6%9E%97%E6%96%AF%E9%A1%BF%E7%AD%89%E7%A6%BB%E5%AD%90%E4%BD%93%E8%AF%BE/ + Kinetic Plasma Simulation

    intro

    characteristic time and length scales

    +

    如果我们要绘制这些参数,我们有特征等离子体时间和长度的列表。

    +

    Time scales & Length scales

    +

    绿色的部分是Fluid models,在这个范畴内考虑的是流体参数,前面的使用全动力学模型,中间部分使用混合模型

    +

    time

    +

    When are collisions important?

    我们会去关系在一个德拜Cube中粒子的数量

    +

    德拜屏蔽

    +

    以上情况下等离子体会很少碰撞

    +

    一些等离子体的德拜屏蔽

    +

    可以用Vlasov—Maxwell等式来描述低碰撞等离子体的分布函数f(x,v,t)

    +

    +
      +
    • 直接解这些公式涉及六个维度
    • +
    • 可以通过特征来求解(粒子)
    • +
    • Delta函数导致碰撞
    • +
    +

    所以我们真正要解决的是一下几个公式

    +

    +

    第一个式子是带有洛伦兹力的动量方程

    +

    第三个式子法拉第方程

    +

    下面是安培定律的source

    +

    最后一个式子是将上述几个等式进行总计和整合,如果我们计算的是单个粒子的电流,则其图像将会非常尖锐

    +

    PIC方式来求解Vlasov等式(VE)

    我们可以减少计算的开销通过使用gird

    +
      +
    • 6D-VE不在网格上
    • +
    • 重新引入Np计算离散的f(r,p,t)
    • +
    • 宏观力再次变成颗粒状(随机噪声)
    • +
    +

    +
      +
    • 粒子动量等式(EQM)
    • +
    +

    +

    VE 特征:f = const

    +

    粒子长度 也是const

    +
      +
    • 洛伦兹力:洛伦兹力
    • +
    +

    这里主要讲了一下算法的原理,大概就是在网格中将电场和磁场用力向外推,将他们内插到粒子内

    +

    +]]>
    + + 等离子体 + + + 等离子体 + +
    + + 机器学习 + /2021/03/30/%E6%9C%BA%E5%99%A8%E5%AD%A6%E4%B9%A0/ + 机器学习

    机器学习的分类

    目标值:类型-分类问题

    +

    目标值:连续的数据-回归问题

    +

    目标值:无目标值-无监督学习

    +

    机器学习的流程

    1 获取数据

    +

    2 数据处理

    +

    3 特征工程

    +

    4 机器学习算法训练-模型

    +

    5 模型评估

    +

    6 应用

    +

    数据集

    sklearn

    +

    kaggle

    +

    UCI

    +

    sklearn

    sklearn的安装

    +
    pip install sklearn
    + +

    sklearn.datasets

    +
      +
    • 加载获取数据集

      +

      datasets.load_*() 获取小规模数据集

      +

      datasets.fetch_*()获取大规模数据集

      +
    • +
    +

    数据集的返回值

    +

    datasets.base.Bunch(继承自字典)

    +

    查看iris的数据集

    +
    #-*- coding: utf-8 -*-
    #@Time : 2022/1/12 18:45
    #@Author: Shyee

    from sklearn.datasets import load_iris
    """
    sklearn的数据集使用
    """
    def datasets_demo():

    iris=load_iris()
    print("鸢尾花数据集:\n",iris)
    print("查看数据集的描述:\n",iris["DESCR"])
    print("查看特征值的名字:\n",iris.feature_names)
    print("查看特征值:\n",iris.data,iris.data.shape)
    return None

    if __name__=="__main__":
    datasets_demo()
    + +

    数据集的划分

    +

    训练数据

    +

    测试数据 20%~30%

    +

    sklearn中的数据集划分

    +
    sklean.model_selection.train_test.split(arrays,*option)
    + +

    训练集的特征值 x_train

    +

    测试集特征值 x_test

    +

    训练集的目标值 y_train

    +

    测试集目标值 y_test

    +
    #数据集划分
    x_train,x_test,y_train,y_test=train_test_split(iris.data,iris.target,test_size=0.2,random_state=22)
    print("训练集的特征值:\n",x_train,"\n测试集的目标值:\n",y_test)
    return None
    + +

    训练集此时的shape为120行,因为取了0.2给测试集

    +

    特征工程

    特征抽取

    将任意数据转换成可以给用于机器学习的数字特征

    +

    sklearn的特征提取

    sklearn.feature_extraction
    + +

    字典的特征提取

    +

    在sklearn中实现特征提取

    +

    特征预处理

    +

    特征降维

    +]]>
    + + 机器学习 + + + 机器学习 + python + +
    + + 离散数学 + /2021/03/12/%E7%A6%BB%E6%95%A3%E6%95%B0%E5%AD%A6/ + 离散数学

    集合

    将若干个可确定的、可分辨的对象构成的无序整体称为集合

    +

    必须明确判断一个对象

    +

    集合中没有相同的元素

    +

    集合表示法

    外延表示法(列举法)

    +

    内涵表示法(描述法)

    +

    image-20220113104324776

    +

    子集与超集

    包含于是集合之间的关系

    +

    属于是元素和集合的关系

    +

    A包含于B&&B包含于A时 A=B

    +

    全集 U

    讨论的具体问题中的全体

    +

    空集

    任意一个集合都是自己的子集 ,空集是任意一个集合的子集

    +

    空集是唯一的

    +

    基数或势

    一个集合A所包含的元素数目称为该集合的基数或势,记作|A|或#A或card(A)。

    +

    if |A|<∞ 则称A为有限集或有穷集(finite set)。否则称为无穷集。

    +

    card({a,b,a,2,🐷})=4,因为a出现了两次。

    +

    幂集

    设A是集合,则A的所有子集组成的集合称为幂集。

    +

    集合的运算

    设 U 为全集,A、B 为 U 的两个子集,则:

    +

    (a) A 与 B 的交集(intersection) A∩B = { x | x∈A 且 x∈B };

    +

    (b) A 与 B 的并集(union) A∪B = { x | x∈A 或 x∈B };

    +

    (c) B 关于 A 的相对补(complement of B with respect to A) 或 A 与 B 的差集(difference)A-B 定义为 A-B = { x |x∈A 且x不属于B},也记作 A\B;

    +

    (d) A 关 于全 集 U 的相 对补称作 A的 绝对补 或补 集 (complement),记作A(或 ~A ),即A={x|x∈U且x不属于A};

    +

    (e) A 与 B 的对称差(symmetric difference)AB 定义为 A⊕B = { x | x∈A或x∈B且x不同时属于A和B }。

    +

    交换律

    +

    A∪B=B∪A A∩B=B∩A

    +

    结合律

    +

    ( A∪B )∪C = A∪( B∪C )

    +

    ( A∩B )∩C = A∩( B∩C )

    +

    分配律

    +

    A∪( B∩C ) = ( A∪B )∩( A∪C )

    +

    A∩( B∪C ) = ( A∩B )∪( A∩C )

    +

    吸收律

    +

    A∪(A∩B)=A,A∩(A∪B)=A

    +

    幂等律

    +

    A∪A = A,A∩A = A

    +

    双重否定律

    +

    非非A = A

    +

    矛盾律

    +

    A∩A = 

    +

    排中律

    +

    A∪A = U

    +

    余补律   = U,U = 

    +

    零律

    +

    A∪U=U, A∩=

    +

    同一律

    +

    A∪=A,A∩U=A

    +

    德·摩根律

    +

    A∪B = A∩B  A∩B = A∪B

    +

    A( B∪C ) = ( AB )∩( AC )

    +

    A( B∩C ) = ( AB )∪( AC )

    +

    U( B∪C ) = ( UB )∩( UC )

    +

    U( B∩C ) = ( UB )∪( UC )

    +

    维恩图

    序列

    序列(sequence)是被排成一列的 对象,各对象之间的顺序非常重要。

    +

    序列中的对象也称为项(item),

    +

    项的个数(可能是无限的)称为序 列的长度(length)。

    +

    取出序列中的某些特定的项并保持 它们在原来序列中的顺序,所得到 的 新 序 列 称 为 原 序 列 的 子 序 列 (subsequence)。

    +]]>
    + + 数学 + + + 数学 + 计算机前置知识 + +
    + + 备份与恢复 + /2020/03/13/%E7%AC%AC%E4%B8%80%E9%83%A8%E5%88%86%EF%BC%9A%E6%89%8B%E5%B7%A5%E5%A4%87%E4%BB%BD%E4%B8%8E%E6%81%A2%E5%A4%8D/ + 第一部分:手工备份与恢复

    +

    第一章:备份恢复概述

    +

    一)数据库故障类型:

    +

    1)user process failure: pmon 自动处理

    +

    2)instance failure: smon 自动处理

    +

    3)user errors : 需要dba通过备份恢复解决

    +

    4)media failure:必须通过备份和日志恢复

    +

    二)备份和恢复计划

    +

    1)根据生产环境的恢复周期,制定详细的备份计划,然后严格执行

    +

    2)对备份,要在一定的时间内利用测试环境,进行故障恢复的练习

    +

    三)备份恢复分类

    +

    1)逻辑备份与恢复– 面向object

    +

    ①传统的导入导出:exp/imp:

    +

    ②数据泵导入导出:expdp/impdp

    +

    逻辑备份就是热备数据库对象某一时刻状态,不能运用在media failure上,逻辑备份的恢复就是还原备份,没有recover的概念。

    +

    2)物理备份与恢复– 面向media failure

    +

    ①手工备份与恢复,也叫用户管理的备份与恢复,通过OS 的命令,完成备份与还原,然后再运用日志进行恢复。

    +

    ②自动备份与恢复,利用oracle 的备份恢复工具rman,使还原与恢复过程自动完成,可以备份恢复ASM FILE。

    +

    物理备份从方式上可以有一致性备份(冷备)和非一致性备份(热备)

    +

    完整的备份策略应该以物理备份为主,逻辑备份为辅(用于备份一些重要的表)

    +

    3)闪回技术– 面向人为的逻辑错误

    +

    一种利用undo数据或闪回日志的快速恢复技术。可以针对不同层面问题进行逻辑恢复,11g支持七种flashback方式。

    +

    四)完全恢复与不完全恢复

    +

    media failure后,需要运用日志进行recover。

    +

    1)完全恢复:

    +

    利用完整备份或部分备份,可以将datafile恢复到failure前得最后一次commit,不会出现数据丢失。

    +

    2)不完全恢复

    +

    需要运用完整备份和日志将database恢复到过去的某个时间点(或SCN),有数据丢失。

    +

    img

    +

    五)归档与非归档

    +

    1)归档模式:redo log 写入 archive log

    +

    2)非归档模式:没有archive log, redo log file循环覆盖

    +

    img

    +

    当处于非归档模式下时,在丢失数据文件后唯一的选择是执行完整的数据库还原,而不能进行recover。

    +

    第二章:手工备份与恢复

    +

    一)相关命令

    +

    1)备份和还原都使用OS命令,如linux中的cp

    +

    2)恢复用sqlplus命令:recover

    +

    二)备份前进行检查:

    +

    1)检查需要备份的数据文件

    +

    SQL> select name from v$datafile;

    +

    SQL> select file_id,file_name,tablespace_name from dba_data_files;

    +

    2)检查要备份的控制文件

    +

    SQL> select name from v$controlfile;

    +

    3)在线redo日志不需要做备份

    +

    三)dbv检查坏块

    +

    在手工备份前,应该检查datafile 是否有坏块,备份完后对备份也要做检查。

    +

    对某个datafile做坏块检查

    +

    $ dbv file=/u01/oradata/prod/users01.dbf feedback=50

    +

    DBVERIFY - 开始验证: FILE = /u01/oradata/prod/users01.dbf

    +

    …….

    +

    四)冷备的注意事项:

    +

    1)必须干净的关闭数据库,以保证数据一致性。

    +

    SQL>shutdwon immediate;

    +

    2)在OS下必须备份所有数据文件

    +

    3)在OS下必须备份控制文件(至少备份一个)

    +

    4)非归档备份还原策略

    +

    恢复时还原所有备份,重建所有在线日志, 没有recover步骤。

    +

    SQL>startup mount

    +

    SQL>alter database clear logfile group n;(n为所有在线日志组)

    +

    SQL>alter database open;

    +

    五)手工非一致性备份(热备份)

    +

    1)在备份前要进入热备模式,备份后要结束热备模式

    +

    执行begin backup 设置备份模式(在数据文件上生成检查点,写入scn ,将来恢复的时候以此scn为起点)

    +

    对只读的表空间不能做热备份,临时表空间不需要备份,特别强调:NOARCHIVE模式下不支持手工热备。

    +

    对整个数据库设置热备模式:SQL> alter database begin backup

    +

    对整个数据库结束热备模式:SQL> alter database end backup;

    +

    对单个表空间设置热备模式:SQL> alter tablespace users begin backup;

    +

    对单个表空间结束热备模式:SQL> alter tablespace users end backup;

    +

    2)手工热备利用v$backup 监控

    +

    例;

    +

    SQL> alter tablespace test begin backup;

    +

    SQL> select file#,checkpoint_change# from v$datafile_header;

    +

    FILE# CHECKPOINT_CHANGE#

    +
    +

    ​ 1 2414314

    +

    ​ 2 2414314

    +

    ​ 3 2414314

    +

    ​ 4 2414314

    +

    ​ 5 2414314

    +

    ​ 6 2430480 在备份期间,scn被冻结,它是恢复阶段运用日志的起点。

    +

    ​ 7 2414314

    +

    SQL> select * from v$backup;

    +

    FILE# STATUS CHANGE# TIME

    +
    +

    ​ 1 NOT ACTIVE 0

    +

    ​ 2 NOT ACTIVE 0

    +

    ​ 3 NOT ACTIVE 0

    +

    ​ 4 NOT ACTIVE 0

    +

    ​ 5 NOT ACTIVE 0

    +

    ​ 6 ACTIVE 2430480 2012-07-30 11:07:19

    +

    ​ 7 NOT ACTIVE 0

    +

    STATUS 是ACTIVE,表示可以备份相应的数据文件。

    +

    $cp test01.dbf test01.bak

    +

    SQL> alter tablespace test end backup;

    +

    SQL> select * from v$backup;

    +

    备份完毕,尽快执行end backup

    +

    如果在end backup之前发生数据库abort,那么可以在下次启动到mount时end backup,从而完成实例恢复。

    +

    六)split block问题

    +

    一个Oracle block一般包含多个OS block,,当手工热备时,OS的cp单位不是Oracle block而是OS block,而Oracle的DBWR又可能不时的从内存中刷新Oracle block(,如此,OS级的脏块)到磁盘上拷贝便可能造成:一个Oracle Block是由不同的版本组成,比如未被DBWR刷新Header block 加上另一部分被刷新的foot block,这样cp出来的Oracle blcok就是split block。

    +

    数据库的一致性是不允许oracle block是split的, Oracle采取的办法是:在backup mode后,如果发现首次DBWR要写脏块,则将该块被刷新之前的镜像数据记录到redo buffer,这样,虽然cp后的文件里仍然含有split block,而当需要恢复时,日志会前滚该块的前镜像,以保证所有被恢复的oracle block最终是一个完整的版本。

    +

    这就是我们常常发现在热备时日志文件会急剧增大的原因。

    +

    第三章:手工完全恢复

    +

    一)基本概念

    +

    1)完全恢复的步骤

    +

    1)restore: OS拷贝命令还原所有或部分datafile

    +

    2)recover:SQL*PLUS利用归档日志和当前的redo日志做恢复

    +

    2)完全恢复可以基于三个级别

    +

    recover database: 所有数据文件损坏,或包括大部分datafile丢失,一般是在mount状态完成

    +

    recover tablespace: 非关键表空间损坏,表空间下某些数据文件不能访问,一般是在open下完成

    +

    recover datafile: 单一或少数数据文件损坏,可以在mount或open 状态完成

    +

    3)什么是关键文件

    +

    如果关键文件损坏,数据库将不能维持在open状态,或崩溃或死机!

    +

    哪些文件是关键文件:①system01 file,②undotbs file,③control file,④current log file

    +

    4)恢复过程可以查看的视图:

    +

    1)v$recover_file 查看需要恢复的datafile

    +

    2)v$recovery_log 查看recover 需要的redo 日志

    +

    3)v$archvied_log 查看已经归档的日志

    +

    二)适用场景

    +

    1)recover database (所有或大部分数据文件损坏,mount或open下进行)

    +

    OS:使用cp 还原受损的dbf(不一定是全部,v$recover_file记录的都需要还原)

    +

    SQLPLUS:

    +

    ①recover database;

    +

    ②alter database open;

    +

    2)recover tablespace (针对表空间的非关键数据文件损坏,一般是open下进行)

    +

    OS:使用cp 还原该表空间XXX下的所有数据文件

    +

    SQLPLUS:

    +

    ①alter tablespace XXX offline;

    +

    ②recover tablespace XXX;

    +

    ③alter tablespace XXX online;

    +

    3)recover datafile (单个或几个数据文件损坏,关键文件在mount下进行,非关键文件在open下进行)

    +

    第一种情形

    +

    OS:使用cp 还原相关的关键数据文件(mount)

    +

    SQLPLUS:

    +

    ①recover datafile 6,8;

    +

    ②alter database open;

    +

    第二种情形

    +

    OS:使用cp 还原相关的非关键数据文件(open)

    +

    SQLPLUS:

    +

    ①alter database datafile 6,8 offline;

    +

    ②recover datafile 6,8;

    +

    ③alter database datafile 6,8 online;

    +

    三)示例

    +

    前提: 有一套datafile全备, 使用当前控制文件, 自上次备份以来的归档日志和当前联机日志是完整的。

    +

    示例1:recover database (如果是system01.dbf损坏只能在mount下恢复。)

    +

    sys:

    +

    SQL> select * from scott.test;

    +

    ​ ID

    +

    -———

    +

    ​ 1

    +

    在这个状态下先在OS下做一个数据文件和控制文件的冷备。

    +

    SQL> shutdown immediate

    +

    [oracle@prod ~] $cp /u01/oradata/prod/*.dbf /u01/back1

    +

    [oracle@prod ~] $cp /u01/oradata/prod/*.ctl /u01/back1

    +

    [oracle@prod ~] $startup

    +

    SQL> insert into scott.test values(2);

    +

    SQL> commit;

    +

    SQL> insert into scott.test values(3);

    +

    SQL> select * from scott.test;

    +

    ​ ID

    +

    -———

    +

    ​ 2

    +

    ​ 3 这条记录未提交,恢复时会回滚掉

    +

    ​ 1

    +

    1)模拟介质失败

    +

    [oracle@prod ~]$ rm /u01/oradata/prod/system01.dbf 数据库在打开的情况下就删除关键文件

    +

    [oracle@prod ~]$ rm/u01/oradata/prod/users01.dbf

    +

    [oracle@prod ~]$ rm/u01/oradata/prod/example01.dbf

    +

    $sqlplus / as sysdba 换个session登录,然后关闭数据库

    +

    SQL> shutdown abort 数据库直接abort了

    +

    2)启动database,报错!

    +

    SQL> startup

    +

    SQL>select file#,error from v$recover_file;

    +

    3)还原损坏的三个数据文件

    +

    [oracle@prod ~]$ cp /u01/back1/system01.dbf /u01/oradata/prod

    +

    [oracle@prod ~]$ cp /u01/back1/users01.dbf /u01/oradata/prod

    +

    [oracle@prod ~]$ cp /u01/back1/example01.dbf /u01/oradata/prod

    +

    4)比较控制文件和数据文件头的SCN

    +

    SQL> select file#,heckpoint_change# from v$datafile;

    +

    SQL> select file#,heckpoint_change# from v$datafile_header;

    +

    SQL> recover database;

    +

    SQL> select file#,checkpoint_change# from v$datafile;

    +

    5)打开数据库

    +

    SQL> alter database open;

    +

    6)验证

    +

    SQL> select * from scott.test;

    +

    ​ ID

    +

    -———

    +

    ​ 2

    +

    ​ 1

    +

    示例2:recover tablespace(状态:database open)

    +

    针对的是非关键表空间的损坏,基于表空间的完全恢复实际上还是对其下的datafile的恢复

    +

    模拟这种情形非常实用,通常是某个非关键表空间下的数据文件受损,但并没有造成Oracle崩溃,我们只需针对个别有问题的tablespace去做单独的在线恢复操作,也就是说恢复时数据库整体是online的,而局部表空间是offline的,数据库不需要shutdown。

    +

    恢复表空间(删除了tablespace下的所有的datafile)

    +

    1)了解一下当前状态,在test表空间上建立scott.t1表,

    +

    SQL> conn scott/scott

    +

    SQL> create table t1 (id int) tablespace test;

    +

    SQL> insert into t1 values(1);

    +

    SQL> commit;

    +

    SQL> select * from t1;

    +

    NAME

    +

    -————————————————-

    +

    1

    +

    2)模拟表空间损坏,数据库open下,直接删除表空间下的数据文件

    +

    [oracle@prod ~]$ rm /u01/oradata/prod/test01.dbf

    +

    3)查证该表空间上的表不可访问了

    +

    SQL> alter system flush buffer_cache; 清除data buffer

    +

    SQL> conn / as sysdba 换个session登陆,访问t1表,因内存里已清除了buffer块,只好去做物理读,所以报错!

    +

    SQL> select * from scott.t1;

    +

    4)看看scn的情况

    +

    SQL> select file#,checkpoint_change# from v$datafile;

    +

    SQL> select file#,checkpoint_change# from v$datafile_header;

    +

    5)将test表空间offline

    +

    SQL> alter tablespace test offline immediate; immediate使表空间能立即脱机,不等Oracle对任何数据文件做检查

    +

    6)数据库open下,使用备份还原这个表空间下的所有数据文件

    +

    [oracle@prod ~]$ cp /u01/back1/test01.dbf /u01/oradata/prod

    +

    7)恢复tablespace

    +

    SQL> recover tablespace test;

    +

    8)使表空间online

    +

    SQL> alter tablespace test online; 此时数据库状态一直是open的

    +

    9)验证

    +

    SQL> select * from scott.t1;

    +

    ID

    +

    -————————————————-

    +

    1

    +

    示例3:recover datafile(database mount或open状态)

    +

    恢复datafile, 同范例2不同的是模拟UNDO文件损坏: 因UNDO数据文件也是关键文件,所以只能在mount状态下恢复。

    +

    1)模拟环境:

    +

    SQL> insert into scott.t1 values(2); 插入一行记录是为了使t1和备份有区别

    +

    SQL> commit;

    +

    SQL> select * from scott.t1;

    +

    ID

    +

    -————————————————-

    +

    1

    +

    2

    +

    SQL> delete scott.t1; 注意:删掉了t1并没有提交,老值在UNDO里。

    +

    2)在open 状态下删除datafile

    +

    [oracle@prod ~]$ rm /u01/oradata/prod/undotbs01.dbf

    +

    3)关闭数据库

    +

    SQL> shtudown abort

    +

    4)启动数据库mount

    +

    SQL> startup

    +

    数据库装载完毕。

    +

    ORA-01157: 无法标识/锁定数据文件 3 - 请参阅 DBWR 跟踪文件

    +

    ORA-01110: 数据文件 3: ‘/u01/oradata/prod/undotbs01.dbf’

    +

    5)还原并恢复UNDO数据文件

    +

    [oracle@prod prod]$ cp /u01/back1/undotbs01.dbf ./

    +

    SQL> recover datafile 3;

    +

    完成介质恢复。

    +

    6)打开数据库(会完成UNDO表空间数据的回滚)

    +

    SQL> alter database open;

    +

    数据库已更改

    +

    7)验证

    +

    SQL> select * from scott.t1;

    +

    ID

    +

    -————————————————-

    +

    1

    +

    2

    +

    第四章:手工不完全恢复

    +

    一)基本概念

    +

    1)不完全恢复的特点:

    +

    ①必须停机,在mount下运行重做日志。

    +

    ②必须以sysdba身份连接进行不完全恢复。

    +

    ③让整个database 回到过去某个时间点,不能避免数据丢失。

    +

    2)不完全恢复(Incomplete recover) 适用环境:

    +

    ①在过去的某个时间点重要的数据被破坏。

    +

    ②最小化备份测试。

    +

    ③在做完全恢复时,丢失了部分归档日志或当前online redo log(考点)

    +

    ④当误删除了表空间时(使用备份的控制文件)

    +

    3)不完全恢复的基本类型:

    +

    ①基于时间点(until time) 使整个数据库恢复到过去的一个时间点前

    +

    ②基于scn(until change) 使整个数据库恢复到过去的某个SCN前

    +

    ③基于cancel (until cancel) 使整个数据库恢复到归档日志或当前日志的断点前

    +

    ④基于误删除表空间(使用备份的controlfile) 使整个数据库恢复到误删除表空间前

    +

    二)不完全恢复的步骤

    +

    1)利用logminer 工具,找出在某个时间点所作的DDL 或DML 误操作(包括:时间点、scn、sql语句)

    +

    2)做当前数据库的最新全备。

    +

    3)使用还原点前的备份还原数据文件,

    +

    4)运用日志恢复所有数据文件,前滚至需要的时间点前停止。

    +

    5)使用resetlogs方式打开数据库。

    +

    三)使用当前控制文件做不完全恢复

    +

    示例1: 恢复过去某个时间点误删除的table(基于时间点的不完全恢复)

    +

    1)环境:scott用户在test表空间下有个t1表

    +

    SQL> conn scott/scott

    +

    SQL> select * from t1;

    +

    ​ ID

    +

    -———

    +

    ​ 1

    +

    ​ 2

    +

    2)误删除了t1表,并purge了。

    +

    SQL> drop table t1 purge;

    +

    SQL> select * from v$log;

    +

    SQL> alter system switch logfile;

    +

    SQL> /

    +

    SQL> select name from v$archived_log;

    +

    NAME

    +

    -——————————————————————————-

    +

    /u01/disk1/prod/arch_1_782662700_131.log

    +

    /u01/disk1/prod/arch_1_782662700_132.log

    +

    /u01/disk1/prod/arch_1_782662700_133.log drop table t1 purge的日志条目切换到此归档日志里了。

    +

    /u01/disk1/prod/arch_1_782662700_134.log

    +

    /u01/disk1/prod/arch_1_782662700_135.log

    +

    3)通过logmr 找出误操作的ddl命令的timestamp 或 scn,然后做一个不完全恢复。

    +

    ①建目录、设置参数

    +

    $>mkdir -p /home/oracle/logmnr

    +

    SQL> alter system set utl_file_dir=’/home/oracle/logmnr’ scope=spfile;

    +

    SQL> startup force;

    +

    SQL> show parameter utl_file_dir

    +

    NAME TYPE VALUE

    +
    +

    utl_file_dir string /home/oracle/logmnr

    +

    ②指定logmnr目录

    +

    SQL> execute dbms_logmnr_d.build(‘dict.ora’,’/home/oracle/logmnr’,dbms_logmnr_d.store_in_flat_file);

    +

    ③添加第一条日志条目

    +

    SQL> execute dbms_logmnr.add_logfile(logfilename=>’/u01/disk1/prod/arch_1_782662700_133.log’,options=>dbms_logmnr.new);

    +

    ④添加后续日志条目

    +

    SQL> execute dbms_logmnr.add_logfile(logfilename=>’/u01/disk1/prod/arch_1_782662700_134.log’,options=>dbms_logmnr.addfile);

    +

    ⑤解析日志条目

    +

    SQL> execute dbms_logmnr.start_logmnr(dictfilename=>’/home/oracle/logmnr/dict.ora’,options=>dbms_logmnr.ddl_dict_tracking);

    +

    ⑥查看v$logmnr_contents视图

    +

    SQL> select username,scn,to_char(timestamp,’yyyy-mm-dd hh24:mi:ss’) time,sql_redo from v$logmnr_contents WHERE lower(sql_redo) like ‘drop table%’;

    +

    USERNAME SCN TIME SQL_REDO

    +
    +

    SCOTT 1918000 2012-08-01 17:28:29 drop table t1 purge;

    +

    ⑦关闭lognmr

    +

    SQL> execute dbms_logmnr.end_logmnr;

    +

    4)关闭数据库,删除所有dbf,准备做不完全恢复

    +

    SQL> shutdown abort

    +

    [oracle@prod ~]$ cd /u01/oradata/prod

    +

    [oracle@prod ~]$ rm *.dbf

    +

    5)还原所有备份的数据文件

    +

    [oracle@prod ~]$ cp /u01/back1/*.dbf ./

    +

    6)根据log miner提供的信息,做基于时间点的不完全恢复

    +

    SQL> startup

    +

    SQL> recover database until time ‘2012-08-01 17:28:29’;

    +

    ORA-00279: change 1917581 generated at 07/18/2012 16:46:34 needed for thread 1

    +

    ORA-00289: suggestion : /u01/disk1/prod/arch_1_782662700_133.log

    +

    ORA-00280: change 1917581 for thread 1 is in sequence #133

    +

    17:33:17 Specify log: {=suggested | filename | AUTO | CANCEL}

    +

    auto

    +

    Log applied.

    +

    Media recovery complete.

    +

    7)resetlogs方式打开数据库

    +

    SQL> alter database open resetlogs;

    +

    8)验证

    +

    SQL> select * from scott.t1;

    +

    ​ ID

    +

    -———

    +

    ​ 1

    +

    ​ 2

    +

    9)看看在resetlogs后,日志sequence重置了。

    +

    SQL> select * from v$log;

    +

    示例2:当前日志组损坏,造成数据库崩溃。

    +

    session 1

    +

    SQL> create table scott.t1(id int);

    +

    SQL> insert into scott.t1 values(1);

    +

    SQL> commit;

    +

    SQL> alter system archive log current;

    +

    SQL> insert into scott.t1 values(2);

    +

    SQL> commit;

    +

    SQL> select * from scott.t1;

    +

    ​ ID

    +

    -———

    +

    ​ 1 这条已经归档

    +

    ​ 2 这条在当前日志中,没有归档

    +

    SQL> select group#,sequence#,status from v$log;

    +

    GROUP# SEQUENCE# STATUS

    +
    +

    ​ 1 22 CURRENT 查v$logfile知道group1是redo01.log

    +

    ​ 2 20 INACTIVE

    +

    ​ 3 21 ACTIVE

    +

    session 2

    +

    [oracle@cuug prod]$ rm redo01.log

    +

    session 1

    +

    SQL> shutdown abort

    +

    session 2

    +

    [oracle@cuug prod]$ rm *.dbf

    +

    [oracle@cuug prod]$ cp /u01/back1/*.dbf ./ 还原所有数据文件备份

    +

    session 1

    +

    SQL> startup

    +

    ORA-00313: 无法打开日志组 1 (用于线程 1) 的成员 ORA-00312:

    +

    联机日志 1 线程 1: ‘/u01/oradata/prod/redo01.log’

    +

    SQL> recover database until cancel;

    +

    ORA-00279: 更改 1016334 (在 04/08/2016 15:45:03 生成) 对于线程 1 是必需的 ORA-00289:

    +

    建议: /u01/arch/prod/arch_1_904564083_22.log 一定要确认一下这个日志是否是当前日志。

    +

    ORA-00280: 更改 1016334 (用于线程 1) 在序列 #22 中

    +

    Specify log: {=suggested | filename | AUTO | CANCEL}

    +

    cancel

    +

    Media recovery cancelled.

    +

    SQL> alter database open resetlogs;

    +

    SQL> select * from scott.t1;

    +

    ​ ID

    +

    -———

    +

    ​ 1

    +

    四)使用备份控制文件做不完全恢复

    +

    1)为什么会使用备份的控制文件?

    +

    ①当前控制文件全部损坏,而数据文件和控制文件的备份及当前日志处于不同的SCN版本

    +

    ②当前控制文件没有损坏,但想要恢复误删除的表空间。

    +

    2)使用备份的控制文件恢复数据库的语法:

    +

    recover database until [time|change] using backup controlfile;

    +

    [time|change]是可选的,就是说如果条件满足,仍然可以做到完全恢复。

    +

    接下来会有如下选项:

    +

    Specify log: {=suggested | filename | AUTO | CANCEL}

    +

    此语法的出现是由于控制文件和当前日志不一致,当前日志的scn总是最新的,而控制文件可能是旧的或尚未更新的(类似shutdwon abort操作)。

    +

    AUTO: 根据v$archived_log记录的归档日志前滚恢复,不包括前滚current log;

    +

    filename: 不在v$archived_log中的日志,指控制文件中受损的归档记录或current log

    +

    CANCEL: 退出。

    +

    3)使用backup controlfile子句的恢复数据库之后,一律要使用alter database open resetlogs打开数据库。

    +

    示例1

    +

    环境:当前所有控制文件损坏,数据文件损坏,有数据文件全备,但之后增加了表空间,并备份了配套的控制文件。

    +

    模式:所有数据文件备份(老)——(新建表空间abcd)—–备份控制文件(次新)——日志文件(新)

    +

    分析:新建表空间数据文件损坏, 全备里没有该数据文件的备份及控制文件描述,当前控制文件又丢失,只能用备份的控制文件恢复。

    +

    1)环境:

    +

    SQL> select * from v$tablespace;

    +

    SQL> select GROUP#,SEQUENCE#,STATUS from v$log;

    +

    GROUP# SEQUENCE# STATUS

    +
    +

    1 7 CURRENT

    +

    2 5 INACTIVE

    +

    3 6 INACTIVE

    +

    SQL> create tablespace abcd datafile ‘/u01/oradata/prod/abcd01.dbf’ size 5m;

    +

    SQL> create table scott.a1 (name char(10)) tablespace abcd;

    +

    SQL> insert into scott.a1 values(‘a’);

    +

    SQL> commit;

    +

    SQL> select * from scott.a1;

    +

    NAME

    +

    -———

    +

    a

    +

    SQL> alter system switch logfile;

    +

    2)备份控制文件

    +

    SQL> alter database backup controlfile to ‘/u01/oradata/prod/con.bak1’;

    +

    3)模拟abcd01.dbf损坏和所有ctl损坏

    +

    [oracle@prod ~]$rm /u01/oradata/prod/abcd01.dbf 数据库open状态,删除abcd01.dbf数据文件

    +

    SQL> alter system flush buffer_cache; db buffer 清空

    +

    SQL> conn / as sysdba 换个session查看 a1表物理读失败

    +

    SQL> select * from scott.a1;

    +

    [oracle@prod ~]$ rm *.ctl

    +

    4)关闭数据库

    +

    SQL> shutdown abort;

    +

    5)恢复所有数据文件备份,准备做不完全恢复

    +

    [oracle@prod ~]$ cd /u01/oradata/prod

    +

    [oracle@prod ~]$ rm *.dbf

    +

    [oracle@prod ~]$ cp /u01/back1/*.dbf ./

    +

    [oracle@prod ~]$ cp con.bak1 control01.ctl

    +

    [oracle@prod ~]$ cp con.bak1 control02.ctl

    +

    [oracle@prod ~]$ cp con.bak1 control03.ctl

    +

    SQL> startup

    +

    SQL> col name for a50;

    +

    SQL> select file#,checkpoint_change#,name from v$datafile;

    +

    FILE# CHECKPOINT_CHANGE# NAME

    +
    +

    ​ 1 6676574 /u01/oradata/prod/system01.dbf

    +

    ​ 2 6676574 /u01/oradata/prod/sysaux01.dbf

    +

    ​ 3 6676601 /u01/oradata/prod/abcd01.dbf

    +

    ​ 4 6676574 /u01/oradata/prod/user01.dbf

    +

    ​ 5 6676574 /u01/oradata/prod/example01.dbf

    +

    ​ 6 6676574 /u01/oradata/prod/test01.dbf

    +

    ​ 7 6676574 /u01/oradata/prod/undotbs01.dbf

    +

    SQL> select file#,checkpoint_change# from v$datafile_header;

    +

    FILE# CHECKPOINT_CHANGE#

    +
    +

    ​ 1 6676343

    +

    ​ 2 6676343

    +

    ​ 3 0

    +

    ​ 4 6676343

    +

    ​ 5 6676343

    +

    ​ 6 6676343

    +

    ​ 7 6676343

    +

    可以看出:

    +

    ①file3 在控制文件里记录是abcd01.dbf,而与之对应的数据文件3是不存在的,

    +

    ②备份的数据备份的scn比控制文件scn还老。

    +

    6)使用备份控制文件恢复

    +

    SQL> recover database using backup controlfile;

    +

    ORA-00283: 恢复会话因错误而取消

    +

    ORA-01110: 数据文件 3: ‘/u01/oradata/prod/abcd01.dbf’

    +

    ORA-01157: 无法标识/锁定数据文件 3 - 请参阅 DBWR 跟踪文件

    +

    ORA-01110: 数据文件 3: ‘/u01/oradata/prod/abcd01.dbf’

    +

    此错是因为老备份里没有abcd表空间,但只要控制文件里记录了abcd就好办,方法是建一个datafile的空文件,而其中内容可由日志文件recover(前滚)时填补出来。

    +

    SQL> alter database create datafile ‘/u01/oradata/prod/abcd01.dbf’;

    +

    SQL> recover database using backup controlfile; 再次使用备份控制文件恢复

    +

    ORA-00308: 无法打开归档日志 ‘/u01/disk1/prod/arch_1_804846837_9.log’

    +

    ORA-27037: 无法获得文件状态

    +

    Linux Error: 2: No such file or directory

    +

    Additional information: 3

    +

    archive日志前滚结束了,但当前日志里还有信息需要恢复

    +

    注意: 对于这个例子来说,一定要看清提示:如果提示的不是归档的日志(是当前日志),则要直接要输入filename 而不能输入auto,否则open时会失败。

    +

    SQL> recover database using backup controlfile; 再次使用备份控制文件恢复

    +

    指定日志: {=suggested | filename | AUTO | CANCEL}

    +

    /u01/oradata/prod/redo03.log 把当前日志它。

    +

    已应用的日志。

    +

    完成介质恢复。

    +

    7)resetlogs打开数据库

    +

    SQL> alter database open resetlogs;

    +

    8)验证

    +

    SQL> select * from scott.a1;

    +

    NAME

    +

    -—————————————

    +

    a

    +

    示例2:

    +

    环境:当前控制文件损坏,新建表空间在备份控制文件之后

    +

    模式:全备(老)—–备份控制文件(次新)—–新建表空间abcd——日志文件(新)

    +

    分析:整个恢复过程中datafile结构有了变化,变化发生在备份控制文件之后,新增了表空间abcd。控制文件备份里没有此表空间记录,但日志里有。

    +

    1)环境

    +

    SQL> drop tablespace abcd including contents and datafiles;

    +

    SQL> alter database backup controlfile to ‘/u01/oradata/prod/con.bak’;

    +

    控制文件备份中没有abcd表空间

    +

    SQL> create tablespace abcd datafile ‘/u01/oradata/prod/abcd01.dbf’ size 5m;

    +

    SQL> create table scott.r1 (id int) tablespace abcd ;

    +

    SQL> insert into scott.r1 values(1);

    +

    SQL> commit;

    +

    SQL> select * from v$tablespace;

    +

    SQL> select * from scott.r1;

    +

    ​ ID

    +

    -———

    +

    ​ 1

    +

    SQL>select GROUP#,SEQUENCE#,STATUS from v$log;

    +

    GROUP# SEQUENCE# STATUS

    +
    +

    1 1 CURRENT

    +

    2 0 UNUSED

    +

    3 0 UNUSED

    +

    2)模拟新建数据文件损坏

    +

    [oracle@prod ~]rm abcd01.dbf

    +

    SQL>alter system flush buffer_cache;

    +

    SQL>conn / as sysdba

    +

    SQL>select * from scott.r1;

    +

    3)关闭数据库

    +

    SQL>shutdown abort

    +

    4)还原所有数据文件,以老控制文件替换当前控制文件

    +

    [oracle@prod ~]$ cd /u01/oradata/prod

    +

    [oracle@prod ~]$ rm *.ctl

    +

    [oracle@prod ~]$ rm *.dbf

    +

    [oracle@prod ~]$ cp /u01/back1/*.dbf ./

    +

    [oracle@prod ~]$ cp con.bak2 control01.ctl

    +

    [oracle@prod ~]$ cp con.bak2 control02.ctl

    +

    [oracle@prod ~]$ cp con.bak2 control03.ctl

    +

    5)启动数据库

    +

    SQL> startup

    +

    ORACLE 例程已经启动。

    +

    ……

    +

    数据库装载完毕。

    +

    ORA-01589: 要打开数据库则必须使用 RESETLOGS 或 NORESETLOGS 选项

    +

    SQL> select file#,checkpoint_change#,name from v$datafile;

    +

    SQL> select file#,checkpoint_change# from v$datafile_header;

    +

    6)使用备份控制文件恢复数据库

    +

    SQL> recover database using backup controlfile;

    +

    ORA-00279: 更改 6676343 (在 01/16/2013 14:11:39 生成) 对于线程 1 是必需的

    +

    ORA-00289: 建议: /u01/disk1/prod/arch_1_804846837_4.log

    +

    ORA-00280: 更改 6676343 (用于线程 1) 在序列 #4 中

    +

    指定日志: {=suggested | filename | AUTO | CANCEL}

    +

    auto

    +

    指定日志: {=suggested | filename | AUTO | CANCEL}

    +

    /u01/oradata/prod/redo01.log

    +

    ORA-00283: 恢复会话因错误而取消

    +

    ORA-01244: 未命名的数据文件由介质恢复添加至控制文件

    +

    ORA-01110: 数据文件 3: ‘/u01/oradata/prod/abcd01.dbf’

    +

    ORA-01112: 未启动介质恢复

    +

    SQL> select file#,checkpoint_change#,name from v$datafile;

    +

    FILE# CHECKPOINT_CHANGE# NAME

    +
    +

    ​ 1 6678002 /u01/oradata/prod/system01.dbf

    +

    ​ 2 6678002 /u01/oradata/prod/sysaux01.dbf

    +

    ​ 3 6677999 /u01/oracle/dbs/UNNAMED00003 这是从日志回写到控制文件中的名字,需要重命名

    +

    ​ 4 6678002 /u01/oradata/prod/user01.dbf

    +

    ​ 5 6678002 /u01/oradata/prod/example01.dbf

    +

    ​ 6 6678002 /u01/oradata/prod/test01.dbf

    +

    ​ 7 6678002 /u01/oradata/prod/undotbs01.dbf

    +

    SQL> select file#,checkpoint_change# from v$datafile_header;

    +

    FILE# CHECKPOINT_CHANGE#

    +
    +

    ​ 1 6678002

    +

    ​ 2 6678002

    +

    ​ 3 0 这里需要建立一个空的数据文件。

    +

    ​ 4 6678002

    +

    ​ 5 6678002

    +

    ​ 6 6678002

    +

    ​ 7 6678002

    +

    7)建立数据文件并对控制文件中未知的数据文件重命名

    +

    SQL> alter database create datafile ‘/u01/oracle/dbs/UNNAMED00003’ as ‘/u01/oradata/prod/abcd01.dbf’;

    +

    上面的命令一石二鸟,自动完成了两个动作

    +

    ①加了一个数据文件abcd01.dbf,

    +

    ②重命名控制文件UNNAMED00003为abcd01.dbf

    +

    SQL> select file#,checkpoint_change#,name from v$datafile;

    +

    FILE# CHECKPOINT_CHANGE# NAME

    +
    +

    ​ 1 6678002 /u01/oradata/prod/system01.dbf

    +

    ​ 2 6678002 /u01/oradata/prod/sysaux01.dbf

    +

    ​ 3 6677999 /u01/oradata/prod/abcd01.dbf

    +

    ​ 4 6678002 /u01/oradata/prod/user01.dbf

    +

    ​ 5 6678002 /u01/oradata/prod/example01.dbf

    +

    ​ 6 6678002 /u01/oradata/prod/test01.dbf

    +

    ​ 7 6678002 /u01/oradata/prod/undotbs01.dbf

    +

    SQL> recover database using backup controlfile;

    +

    8)resetlogs打开数据库

    +

    SQL> alter database open resetlogs;

    +

    9)验证

    +

    SQL> select * from scott.r1;

    +

    ​ ID

    +

    -———

    +]]>
    + + 计算机安全 + + + 数据库 + 计算机安全 + +
    + + 等离子体前置知识 + /2023/05/24/%E7%AD%89%E7%A6%BB%E5%AD%90%E4%BD%93%E5%89%8D%E7%BD%AE%E7%9F%A5%E8%AF%86/ + 色散关系

    在物理科学和电气工程学中,色散关系描述波在介质中传播的色散现象的性质。色散关系将波的波长或波数与其频率建立了联系。由这组关系,波的相速度和群速度有了方便的确定介质中折射率的表达式。克拉莫-克若尼关系式可以描述波的传播、衰减的频率依赖性,这关系比与几何相关和与材料相关的色散关系更具一般性。

    +

    色散

    当不同波长的平面波表现出不同的传播速度时,色散会发生,如此造成混合各种波长的波包渐渐地在空间中扩展开来。平面波的速率v为波长λ的函数:

    +

    +

    波速、波长、频率f之间具有恒等式:

    +

    +

    函数f(λ)指出了该介质中的色散关系。色散关系更常用角频率 与波数 来表示。上述式子可改写为

    +

    +

    在此ω成为k的函数。使用ω(k)来描述色散关系已经成为一种标准写法,因为相速度 ω/k 与群速度 ∂ω/∂k 可以轻松地从这样写法的色散关系中求得。

    +

    因此所关注的平面波可写为如下数学式:

    +

    +

    其中

    +

    A是波的振幅,

    +

    A0 = A(0,0),

    +

    x是波传递方向上的任一特定位置,

    +

    t是描述波的任一特定时间。

    +

    真空中的平面波

    电磁波

    对真空中的电磁波而言,角频率与波数呈正比:

    +

    +

    这是“线性”的色散关系。在此情形下,相速度与群速度乃是相同的:

    +

    +

    两者皆为c,真空中的光速,为与频率无关的常数。

    +

    德布罗意色散关系

    粒子的总能量、动量与质量透过如下相对论关系连结:

    +

    +

    其中m是静质量。

    +

    当静质量m为零时,比如光子的例子:

    +

    +

    又静质量不为零的粒子,当其接近光速时,pc项远大于mc^2项,因此关系式可趋近于E = pc。其在非相对论极限,也就是速度远小于光速c的情形,可趋近于如下关系式:

    +

    +

    此情形下, 是常数,而 是常见的动能,可以动量 来写出关系式。

    +

    从近光速的例子过渡到低速度极限,可看到E与p的关系是从p转成p^2,在垂直轴跟水平轴皆取对数log的色散关系图中可看出斜率的改变。

    +

    基本粒子、原子核、原子,甚至是分子,皆有物质波的波动表现。根据描述物质波的“德布罗意关系”,能量E与角频率ω之间以及动量p与波数k之间皆为正比关系,比值为约化普朗克常数ħ:

    +

    +

    相应地,角频率与波数之间也可透过色散关系连结。在非相对论极限(低速度极限的牛顿力学)条件下,利用能量(动能)与动量的关系式:

    +

    +

    此处省去常数mc^2的效应。等式左右分别代入德布罗意关系,可得色散关系:

    +

    +]]>
    + + plasma + + + 等离子体 + 前置任务 + +
    + + 学习pandas(从kaggle上) + /2023/07/18/%E5%AD%A6%E4%B9%A0pandas-%E4%BB%8Ekaggle%E4%B8%8A/ + 先来个小测试
    import pandas as pd


    print("Setup complete.")
    + +
    Setup complete.
    +
    +

    1.

    In the cell below, create a DataFrame fruits that looks like this:

    +

    +
    # Your code goes here. Create a dataframe matching the above diagram and assign it to the variable fruits.
    fruits = pd.DataFrame({'Apples': [30], 'Bananas': [21]})
    print(fruits)
    + +
       Apples  Bananas
    +0      30       21
    +
    +

    2.

    Create a dataframe fruit_sales that matches the diagram below:

    +

    +
    # Your code goes here. Create a dataframe matching the above diagram and assign it to the variable fruit_sales.
    fruit_sales = pd.DataFrame({'Apples': [35,41], 'Bananas': [21,34]},index= ['2017 Sales','2018 Sales'])
    print(fruit_sales)
    + +
                Apples  Bananas
    +2017 Sales      35       21
    +2018 Sales      41       34
    +
    +

    3.

    Create a variable ingredients with a Series that looks like:

    +
    Flour     4 cups
    Milk 1 cup
    Eggs 2 large
    Spam 1 can
    Name: Dinner, dtype: object
    + + +
    ingredients = pd.Series(['4 cups','1 cup', '2 large', '1 can'],index=['Flour','Milk','Eggs','Spam'],name='Dinner',dtype=object)
    ingredients
    + + + + +
    Flour     4 cups
    +Milk       1 cup
    +Eggs     2 large
    +Spam       1 can
    +Name: Dinner, dtype: object
    +
    +

    4.

    Read the following csv dataset of wine reviews into a DataFrame called reviews:

    +

    +

    The filepath to the csv file is ../input/wine-reviews/winemag-data_first150k.csv. The first few lines look like:

    +
    ,country,description,designation,points,price,province,region_1,region_2,variety,winery
    0,US,"This tremendous 100% varietal wine[...]",Martha's Vineyard,96,235.0,California,Napa Valley,Napa,Cabernet Sauvignon,Heitz
    1,Spain,"Ripe aromas of fig, blackberry and[...]",Carodorum Selección Especial Reserva,96,110.0,Northern Spain,Toro,,Tinta de Toro,Bodega Carmen Rodríguez
    + + +
    reviews = pd.read_csv('../input/wine-reviews/winemag-data_first150k.csv',index_col=0)
    + +

    reviews = pd.read_csv(‘../input/wine-reviews/winemag-data_first150k.csv’,index_col=0)

    +
    animals = pd.DataFrame({'Cows': [12, 20], 'Goats': [22, 19]}, index=['Year 1', 'Year 2'])
    animals
    + + + + +
    +

    + + + + + + + + + + + + + + + + + + + + +
    CowsGoats
    Year 11222
    Year 22019
    +
    + + + +

    In the cell below, write code to save this DataFrame to disk as a csv file with the name cows_and_goats.csv.

    +
    animals.to_csv('cows_and_goats.csv')
    + + +
    reviews = pd.read_csv("datasets/wine/winemag-data-130k-v2.csv", index_col=0)
    reviews
    + + + + +
    +

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    countrydescriptiondesignationpointspriceprovinceregion_1region_2taster_nametaster_twitter_handletitlevarietywinery
    0ItalyAromas include tropical fruit, broom, brimston...Vulkà Bianco87NaNSicily & SardiniaEtnaNaNKerin O’Keefe@kerinokeefeNicosia 2013 Vulkà Bianco (Etna)White BlendNicosia
    1PortugalThis is ripe and fruity, a wine that is smooth...Avidagos8715.0DouroNaNNaNRoger Voss@vossrogerQuinta dos Avidagos 2011 Avidagos Red (Douro)Portuguese RedQuinta dos Avidagos
    2USTart and snappy, the flavors of lime flesh and...NaN8714.0OregonWillamette ValleyWillamette ValleyPaul Gregutt@paulgwineRainstorm 2013 Pinot Gris (Willamette Valley)Pinot GrisRainstorm
    3USPineapple rind, lemon pith and orange blossom ...Reserve Late Harvest8713.0MichiganLake Michigan ShoreNaNAlexander PeartreeNaNSt. Julian 2013 Reserve Late Harvest Riesling ...RieslingSt. Julian
    4USMuch like the regular bottling from 2012, this...Vintner's Reserve Wild Child Block8765.0OregonWillamette ValleyWillamette ValleyPaul Gregutt@paulgwineSweet Cheeks 2012 Vintner's Reserve Wild Child...Pinot NoirSweet Cheeks
    ..........................................
    129966GermanyNotes of honeysuckle and cantaloupe sweeten th...Brauneberger Juffer-Sonnenuhr Spätlese9028.0MoselNaNNaNAnna Lee C. IijimaNaNDr. H. Thanisch (Erben Müller-Burggraef) 2013 ...RieslingDr. H. Thanisch (Erben Müller-Burggraef)
    129967USCitation is given as much as a decade of bottl...NaN9075.0OregonOregonOregon OtherPaul Gregutt@paulgwineCitation 2004 Pinot Noir (Oregon)Pinot NoirCitation
    129968FranceWell-drained gravel soil gives this wine its c...Kritt9030.0AlsaceAlsaceNaNRoger Voss@vossrogerDomaine Gresser 2013 Kritt Gewurztraminer (Als...GewürztraminerDomaine Gresser
    129969FranceA dry style of Pinot Gris, this is crisp with ...NaN9032.0AlsaceAlsaceNaNRoger Voss@vossrogerDomaine Marcel Deiss 2012 Pinot Gris (Alsace)Pinot GrisDomaine Marcel Deiss
    129970FranceBig, rich and off-dry, this is powered by inte...Lieu-dit Harth Cuvée Caroline9021.0AlsaceAlsaceNaNRoger Voss@vossrogerDomaine Schoffit 2012 Lieu-dit Harth Cuvée Car...GewürztraminerDomaine Schoffit
    +

    129971 rows × 13 columns

    +
    + + + +

    我们将数据当对象来访问

    +
    reviews.country
    + + + + +
    0            Italy
    +1         Portugal
    +2               US
    +3               US
    +4               US
    +            ...   
    +129966     Germany
    +129967          US
    +129968      France
    +129969      France
    +129970      France
    +Name: country, Length: 129971, dtype: object
    +
    +

    如果我们有一个 Python 字典,我们可以使用索引 ([]) 运算符访问它的值。我们可以对 DataFrame 中的列执行相同的操作:

    +
    reviews['country']
    + + + + +
    0            Italy
    +1         Portugal
    +2               US
    +3               US
    +4               US
    +            ...   
    +129966     Germany
    +129967          US
    +129968      France
    +129969      France
    +129970      France
    +Name: country, Length: 129971, dtype: object
    +
    +

    这是从 DataFrame 中选择特定 Series 的两种方法。这两种方法在语法上都不太有效,但索引操作符[]的优点是可以处理列名中的保留字符(例如,如果我们有一个country providence列,reviews.country providence就不起作用)。

    +

    pandas 系列看起来不像一本精美的dictionary吗?几乎是这样,所以毫不奇怪,要深入到单个特定值,我们只需要再次使用索引运算符 [] :

    +
    reviews['country'][0]
    + + + + +
    'Italy'
    +
    +

    Indexing in pandas

    索引运算符和属性选择很好,因为它们就像在 Python 生态系统的其它部分一样工作。作为新手,这使得它们很容易上手和使用。然而,pandas有自己的访问操作符,loc和iloc。对于更高级的操作,你应该使用它们。

    +

    Index-based selection

    Pandas 索引以两种范式之一工作。第一种是基于索引的选择:根据数据在数据中的数字位置来选择数据。iloc遵循这一范例。

    +

    要选择 DataFrame 中的第一行数据,我们可以使用以下命令:

    +
    reviews.iloc[0]
    + + + + +
    country                                                              Italy
    +description              Aromas include tropical fruit, broom, brimston...
    +designation                                                   Vulkà Bianco
    +points                                                                  87
    +price                                                                  NaN
    +province                                                 Sicily & Sardinia
    +region_1                                                              Etna
    +region_2                                                               NaN
    +taster_name                                                  Kerin O’Keefe
    +taster_twitter_handle                                         @kerinokeefe
    +title                                    Nicosia 2013 Vulkà Bianco  (Etna)
    +variety                                                        White Blend
    +winery                                                             Nicosia
    +Name: 0, dtype: object
    +
    +

    loc 和 iloc 都是行第一、列第二。这与我们在原生 Python 中所做的相反,即列在前,行在后。

    +

    这意味着检索行稍微容易一些,而检索列稍微困难一些。要使用 iloc 获取列,我们可以执行以下操作:

    +
    reviews.iloc[:, 0]
    + + + + +
    0            Italy
    +1         Portugal
    +2               US
    +3               US
    +4               US
    +            ...   
    +129966     Germany
    +129967          US
    +129968      France
    +129969      France
    +129970      France
    +Name: country, Length: 129971, dtype: object
    +
    +

    就其本身而言,:操作符(也来自本地Python)表示 “一切”。然而,当与其他选择器组合时,它可以用来表示值的范围。例如,要从第一、第二和第三行中选择country列,我们可以这样做

    +
    reviews.iloc[:3, 0]
    + + + + +
    0       Italy
    +1    Portugal
    +2          US
    +Name: country, dtype: object
    +
    +
    reviews.iloc[999:-99999, 0]
    + + + + +
    999             US
    +1000            US
    +1001         Italy
    +1002            US
    +1003        France
    +           ...    
    +29967       France
    +29968           US
    +29969    Argentina
    +29970           US
    +29971           US
    +Name: country, Length: 28973, dtype: object
    +
    +

    It’s also possible to pass a list:

    +
    reviews.iloc[[0, 1, 2], 0]
    + + + + +
    0       Italy
    +1    Portugal
    +2          US
    +Name: country, dtype: object
    +
    +

    最后,值得注意的是,负数可以用于选择。这将从数值的末尾开始向前计数。例如,这里是数据集的最后五个元素。

    +
    reviews.iloc[-5:]
    + + + + +
    +

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    countrydescriptiondesignationpointspriceprovinceregion_1region_2taster_nametaster_twitter_handletitlevarietywinery
    129966GermanyNotes of honeysuckle and cantaloupe sweeten th...Brauneberger Juffer-Sonnenuhr Spätlese9028.0MoselNaNNaNAnna Lee C. IijimaNaNDr. H. Thanisch (Erben Müller-Burggraef) 2013 ...RieslingDr. H. Thanisch (Erben Müller-Burggraef)
    129967USCitation is given as much as a decade of bottl...NaN9075.0OregonOregonOregon OtherPaul Gregutt@paulgwineCitation 2004 Pinot Noir (Oregon)Pinot NoirCitation
    129968FranceWell-drained gravel soil gives this wine its c...Kritt9030.0AlsaceAlsaceNaNRoger Voss@vossrogerDomaine Gresser 2013 Kritt Gewurztraminer (Als...GewürztraminerDomaine Gresser
    129969FranceA dry style of Pinot Gris, this is crisp with ...NaN9032.0AlsaceAlsaceNaNRoger Voss@vossrogerDomaine Marcel Deiss 2012 Pinot Gris (Alsace)Pinot GrisDomaine Marcel Deiss
    129970FranceBig, rich and off-dry, this is powered by inte...Lieu-dit Harth Cuvée Caroline9021.0AlsaceAlsaceNaNRoger Voss@vossrogerDomaine Schoffit 2012 Lieu-dit Harth Cuvée Car...GewürztraminerDomaine Schoffit
    +
    + + + +

    Label-based selection

    属性选择的第二种模式是loc操作符所遵循的模式:基于标签的选择。在这种模式下,重要的是数据索引值,而不是它的位置。

    +

    例如,要获得reviews中的第一个条目,我们现在要做如下操作:

    +
    reviews.loc[0, 'country']
    + + + + +
    'Italy'
    +
    +

    iloc在概念上比loc简单,因为它忽略了数据集的索引。当我们使用 iloc 时,我们把数据集当作一个大矩阵(一个列表的列表),一个我们必须按位置进行索引的矩阵。由于您的数据集通常具有有意义的索引,因此使用loc通常会更容易。例如,这里有一个使用loc更容易的操作:

    +
    reviews.loc[:, ['taster_name', 'taster_twitter_handle', 'points']]
    + + + + +
    +

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    taster_nametaster_twitter_handlepoints
    0Kerin O’Keefe@kerinokeefe87
    1Roger Voss@vossroger87
    2Paul Gregutt@paulgwine87
    3Alexander PeartreeNaN87
    4Paul Gregutt@paulgwine87
    ............
    129966Anna Lee C. IijimaNaN90
    129967Paul Gregutt@paulgwine90
    129968Roger Voss@vossroger90
    129969Roger Voss@vossroger90
    129970Roger Voss@vossroger90
    +

    129971 rows × 3 columns

    +
    + + + +

    Choosing between loc and iloc

    在 loc 和 iloc 之间选择或转换时,有一个 “小问题 “值得注意,那就是这两种方法使用的索引方案略有不同。

    +

    iloc 使用 Python stdlib 索引方案,其中包含范围的第一个元素,而排除最后一个元素。因此,0:10 将选择条目 0,……9。而loc包含最后一个元素,因此0:10将选择0,…,10。

    +

    为什么会有这样的变化?请记住,loc可以索引任何stdlib类型:例如字符串。如果我们有一个索引值为 Apples, …, Potatoes, … 的 DataFrame,并且我们想选择 “所有按字母顺序排列的苹果和土豆之间的水果选择”,那么索引 df.loc[‘Apples’:’Potatoes’] 要比索引 df.loc[‘Apples’, ‘Potatoet’] 这样的东西方便得多 (t 在字母表的 s 后面)。

    +

    当DataFrame索引是一个简单的数字列表(例如0,…,1000)时,这种情况尤其令人困惑。在这种情况下,df.iloc[0:1000]将返回1000个条目,而df.loc[0:1000]将返回1001个条目!要使用 loc 得到 1000 个元素,您需要再低一级,请求 df.loc[0:999]。

    +

    否则,使用loc的语义和使用iloc的语义是一样的。

    +

    Manipulating the index

    基于标签的选择功能来自索引中的标签。重要的是,我们使用的索引并非一成不变。我们可以以任何我们认为合适的方式操作索引。

    +

    我们可以使用set_index()方法来完成这项工作。下面是当我们将set_index设置为title字段时发生的情况:

    +
    reviews.set_index("title")
    + + + + +
    +

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    countrydescriptiondesignationpointspriceprovinceregion_1region_2taster_nametaster_twitter_handlevarietywinery
    title
    Nicosia 2013 Vulkà Bianco (Etna)ItalyAromas include tropical fruit, broom, brimston...Vulkà Bianco87NaNSicily & SardiniaEtnaNaNKerin O’Keefe@kerinokeefeWhite BlendNicosia
    Quinta dos Avidagos 2011 Avidagos Red (Douro)PortugalThis is ripe and fruity, a wine that is smooth...Avidagos8715.0DouroNaNNaNRoger Voss@vossrogerPortuguese RedQuinta dos Avidagos
    Rainstorm 2013 Pinot Gris (Willamette Valley)USTart and snappy, the flavors of lime flesh and...NaN8714.0OregonWillamette ValleyWillamette ValleyPaul Gregutt@paulgwinePinot GrisRainstorm
    St. Julian 2013 Reserve Late Harvest Riesling (Lake Michigan Shore)USPineapple rind, lemon pith and orange blossom ...Reserve Late Harvest8713.0MichiganLake Michigan ShoreNaNAlexander PeartreeNaNRieslingSt. Julian
    Sweet Cheeks 2012 Vintner's Reserve Wild Child Block Pinot Noir (Willamette Valley)USMuch like the regular bottling from 2012, this...Vintner's Reserve Wild Child Block8765.0OregonWillamette ValleyWillamette ValleyPaul Gregutt@paulgwinePinot NoirSweet Cheeks
    .......................................
    Dr. H. Thanisch (Erben Müller-Burggraef) 2013 Brauneberger Juffer-Sonnenuhr Spätlese Riesling (Mosel)GermanyNotes of honeysuckle and cantaloupe sweeten th...Brauneberger Juffer-Sonnenuhr Spätlese9028.0MoselNaNNaNAnna Lee C. IijimaNaNRieslingDr. H. Thanisch (Erben Müller-Burggraef)
    Citation 2004 Pinot Noir (Oregon)USCitation is given as much as a decade of bottl...NaN9075.0OregonOregonOregon OtherPaul Gregutt@paulgwinePinot NoirCitation
    Domaine Gresser 2013 Kritt Gewurztraminer (Alsace)FranceWell-drained gravel soil gives this wine its c...Kritt9030.0AlsaceAlsaceNaNRoger Voss@vossrogerGewürztraminerDomaine Gresser
    Domaine Marcel Deiss 2012 Pinot Gris (Alsace)FranceA dry style of Pinot Gris, this is crisp with ...NaN9032.0AlsaceAlsaceNaNRoger Voss@vossrogerPinot GrisDomaine Marcel Deiss
    Domaine Schoffit 2012 Lieu-dit Harth Cuvée Caroline Gewurztraminer (Alsace)FranceBig, rich and off-dry, this is powered by inte...Lieu-dit Harth Cuvée Caroline9021.0AlsaceAlsaceNaNRoger Voss@vossrogerGewürztraminerDomaine Schoffit
    +

    129971 rows × 12 columns

    +
    + + + +

    如果您可以为数据集找到一个比当前索引更好的索引,那么这将非常有用。

    +

    Conditional selection

    到目前为止,我们已经使用 DataFrame 本身的结构属性对各种数据进行索引。然而,为了利用数据做有趣的事情,我们经常需要根据条件提出问题。

    +

    例如,假设我们对意大利生产的优于平均水平的葡萄酒特别感兴趣。

    +

    我们可以首先检查每种葡萄酒是否是意大利的:

    +
    reviews.country == 'Italy'
    + + + + +
    0          True
    +1         False
    +2         False
    +3         False
    +4         False
    +          ...  
    +129966    False
    +129967    False
    +129968    False
    +129969    False
    +129970    False
    +Name: country, Length: 129971, dtype: bool
    +
    +

    此操作根据每条记录的国家/地区生成一系列 True/False 布尔值。然后可以在 loc 内部使用此结果来选择相关数据:

    +
    reviews.loc[reviews.country == 'Italy']
    + + + + +
    +

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    countrydescriptiondesignationpointspriceprovinceregion_1region_2taster_nametaster_twitter_handletitlevarietywinery
    0ItalyAromas include tropical fruit, broom, brimston...Vulkà Bianco87NaNSicily & SardiniaEtnaNaNKerin O’Keefe@kerinokeefeNicosia 2013 Vulkà Bianco (Etna)White BlendNicosia
    6ItalyHere's a bright, informal red that opens with ...Belsito8716.0Sicily & SardiniaVittoriaNaNKerin O’Keefe@kerinokeefeTerre di Giurfo 2013 Belsito Frappato (Vittoria)FrappatoTerre di Giurfo
    13ItalyThis is dominated by oak and oak-driven aromas...Rosso87NaNSicily & SardiniaEtnaNaNKerin O’Keefe@kerinokeefeMasseria Setteporte 2012 Rosso (Etna)Nerello MascaleseMasseria Setteporte
    22ItalyDelicate aromas recall white flower and citrus...Ficiligno8719.0Sicily & SardiniaSiciliaNaNKerin O’Keefe@kerinokeefeBaglio di Pianetto 2007 Ficiligno White (Sicilia)White BlendBaglio di Pianetto
    24ItalyAromas of prune, blackcurrant, toast and oak c...Aynat8735.0Sicily & SardiniaSiciliaNaNKerin O’Keefe@kerinokeefeCanicattì 2009 Aynat Nero d'Avola (Sicilia)Nero d'AvolaCanicattì
    ..........................................
    129929ItalyThis luminous sparkler has a sweet, fruit-forw...NaN9138.0VenetoProsecco Superiore di CartizzeNaNNaNNaNCol Vetoraz Spumanti NV Prosecco Superiore di...ProseccoCol Vetoraz Spumanti
    129943ItalyA blend of Nero d'Avola and Syrah, this convey...Adènzia9029.0Sicily & SardiniaSiciliaNaNKerin O’Keefe@kerinokeefeBaglio del Cristo di Campobello 2012 Adènzia R...Red BlendBaglio del Cristo di Campobello
    129947ItalyA blend of 65% Cabernet Sauvignon, 30% Merlot ...Symposio9020.0Sicily & SardiniaTerre SicilianeNaNKerin O’Keefe@kerinokeefeFeudo Principi di Butera 2012 Symposio Red (Te...Red BlendFeudo Principi di Butera
    129961ItalyIntense aromas of wild cherry, baking spice, t...NaN9030.0Sicily & SardiniaSiciliaNaNKerin O’Keefe@kerinokeefeCOS 2013 Frappato (Sicilia)FrappatoCOS
    129962ItalyBlackberry, cassis, grilled herb and toasted a...Sàgana Tenuta San Giacomo9040.0Sicily & SardiniaSiciliaNaNKerin O’Keefe@kerinokeefeCusumano 2012 Sàgana Tenuta San Giacomo Nero d...Nero d'AvolaCusumano
    +

    19540 rows × 13 columns

    +
    + + + +

    该DataFrame有~20,000行。原来的数据约为130,000行。这意味着大约15%的葡萄酒来自意大利。

    +

    我们还想知道哪些葡萄酒比平均水平好。葡萄酒的评价标准为80-100分,因此这可能意味着至少获得90分的葡萄酒。

    +

    我们可以用”&”将这两个问题联系起来:

    +
    reviews.loc[(reviews.country == 'Italy') & (reviews.points >= 90)]
    + + + + +
    +

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    countrydescriptiondesignationpointspriceprovinceregion_1region_2taster_nametaster_twitter_handletitlevarietywinery
    120ItalySlightly backward, particularly given the vint...Bricco Rocche Prapó9270.0PiedmontBaroloNaNNaNNaNCeretto 2003 Bricco Rocche Prapó (Barolo)NebbioloCeretto
    130ItalyAt the first it was quite muted and subdued, b...Bricco Rocche Brunate9170.0PiedmontBaroloNaNNaNNaNCeretto 2003 Bricco Rocche Brunate (Barolo)NebbioloCeretto
    133ItalyEinaudi's wines have been improving lately, an...NaN9168.0PiedmontBaroloNaNNaNNaNPoderi Luigi Einaudi 2003 BaroloNebbioloPoderi Luigi Einaudi
    135ItalyThe color is just beginning to show signs of b...Sorano9160.0PiedmontBaroloNaNNaNNaNGiacomo Ascheri 2001 Sorano (Barolo)NebbioloGiacomo Ascheri
    140ItalyA big, fat, luscious wine with plenty of toast...Costa Bruna9026.0PiedmontBarbera d'AlbaNaNNaNNaNPoderi Colla 2005 Costa Bruna (Barbera d'Alba)BarberaPoderi Colla
    ..........................................
    129929ItalyThis luminous sparkler has a sweet, fruit-forw...NaN9138.0VenetoProsecco Superiore di CartizzeNaNNaNNaNCol Vetoraz Spumanti NV Prosecco Superiore di...ProseccoCol Vetoraz Spumanti
    129943ItalyA blend of Nero d'Avola and Syrah, this convey...Adènzia9029.0Sicily & SardiniaSiciliaNaNKerin O’Keefe@kerinokeefeBaglio del Cristo di Campobello 2012 Adènzia R...Red BlendBaglio del Cristo di Campobello
    129947ItalyA blend of 65% Cabernet Sauvignon, 30% Merlot ...Symposio9020.0Sicily & SardiniaTerre SicilianeNaNKerin O’Keefe@kerinokeefeFeudo Principi di Butera 2012 Symposio Red (Te...Red BlendFeudo Principi di Butera
    129961ItalyIntense aromas of wild cherry, baking spice, t...NaN9030.0Sicily & SardiniaSiciliaNaNKerin O’Keefe@kerinokeefeCOS 2013 Frappato (Sicilia)FrappatoCOS
    129962ItalyBlackberry, cassis, grilled herb and toasted a...Sàgana Tenuta San Giacomo9040.0Sicily & SardiniaSiciliaNaNKerin O’Keefe@kerinokeefeCusumano 2012 Sàgana Tenuta San Giacomo Nero d...Nero d'AvolaCusumano
    +

    6648 rows × 13 columns

    +
    + + + +

    Pandas内置了一些条件选择器,我们在此重点介绍其中的两个。

    +

    第一个是 “isin”。”isin “让您选择其值 “位于 “一个值列表中的数据。例如,我们可以用它来选择仅来自意大利或法国的葡萄酒:

    +
    reviews.loc[reviews.country.isin(['Italy', 'France'])]
    + + + + +
    +

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    countrydescriptiondesignationpointspriceprovinceregion_1region_2taster_nametaster_twitter_handletitlevarietywinery
    0ItalyAromas include tropical fruit, broom, brimston...Vulkà Bianco87NaNSicily & SardiniaEtnaNaNKerin O’Keefe@kerinokeefeNicosia 2013 Vulkà Bianco (Etna)White BlendNicosia
    6ItalyHere's a bright, informal red that opens with ...Belsito8716.0Sicily & SardiniaVittoriaNaNKerin O’Keefe@kerinokeefeTerre di Giurfo 2013 Belsito Frappato (Vittoria)FrappatoTerre di Giurfo
    7FranceThis dry and restrained wine offers spice in p...NaN8724.0AlsaceAlsaceNaNRoger Voss@vossrogerTrimbach 2012 Gewurztraminer (Alsace)GewürztraminerTrimbach
    9FranceThis has great depth of flavor with its fresh ...Les Natures8727.0AlsaceAlsaceNaNRoger Voss@vossrogerJean-Baptiste Adam 2012 Les Natures Pinot Gris...Pinot GrisJean-Baptiste Adam
    11FranceThis is a dry wine, very spicy, with a tight, ...NaN8730.0AlsaceAlsaceNaNRoger Voss@vossrogerLeon Beyer 2012 Gewurztraminer (Alsace)GewürztraminerLeon Beyer
    ..........................................
    129964FranceInitially quite muted, this wine slowly develo...Domaine Saint-Rémy Herrenweg90NaNAlsaceAlsaceNaNRoger Voss@vossrogerDomaine Ehrhart 2013 Domaine Saint-Rémy Herren...GewürztraminerDomaine Ehrhart
    129965FranceWhile it's rich, this beautiful dry wine also ...Seppi Landmann Vallée Noble9028.0AlsaceAlsaceNaNRoger Voss@vossrogerDomaine Rieflé-Landmann 2013 Seppi Landmann Va...Pinot GrisDomaine Rieflé-Landmann
    129968FranceWell-drained gravel soil gives this wine its c...Kritt9030.0AlsaceAlsaceNaNRoger Voss@vossrogerDomaine Gresser 2013 Kritt Gewurztraminer (Als...GewürztraminerDomaine Gresser
    129969FranceA dry style of Pinot Gris, this is crisp with ...NaN9032.0AlsaceAlsaceNaNRoger Voss@vossrogerDomaine Marcel Deiss 2012 Pinot Gris (Alsace)Pinot GrisDomaine Marcel Deiss
    129970FranceBig, rich and off-dry, this is powered by inte...Lieu-dit Harth Cuvée Caroline9021.0AlsaceAlsaceNaNRoger Voss@vossrogerDomaine Schoffit 2012 Lieu-dit Harth Cuvée Car...GewürztraminerDomaine Schoffit
    +

    41633 rows × 13 columns

    +
    + + + +

    第二个是 isnull (及其同伴 notnull)。这些方法可让您突出显示空(或非空)(NaN) 的值。例如,要过滤掉数据集中缺少价格标签的葡萄酒,我们将执行以下操作:

    +
    reviews.loc[reviews.price.notnull()]
    + + + + +
    +

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    countrydescriptiondesignationpointspriceprovinceregion_1region_2taster_nametaster_twitter_handletitlevarietywinery
    1PortugalThis is ripe and fruity, a wine that is smooth...Avidagos8715.0DouroNaNNaNRoger Voss@vossrogerQuinta dos Avidagos 2011 Avidagos Red (Douro)Portuguese RedQuinta dos Avidagos
    2USTart and snappy, the flavors of lime flesh and...NaN8714.0OregonWillamette ValleyWillamette ValleyPaul Gregutt@paulgwineRainstorm 2013 Pinot Gris (Willamette Valley)Pinot GrisRainstorm
    3USPineapple rind, lemon pith and orange blossom ...Reserve Late Harvest8713.0MichiganLake Michigan ShoreNaNAlexander PeartreeNaNSt. Julian 2013 Reserve Late Harvest Riesling ...RieslingSt. Julian
    4USMuch like the regular bottling from 2012, this...Vintner's Reserve Wild Child Block8765.0OregonWillamette ValleyWillamette ValleyPaul Gregutt@paulgwineSweet Cheeks 2012 Vintner's Reserve Wild Child...Pinot NoirSweet Cheeks
    5SpainBlackberry and raspberry aromas show a typical...Ars In Vitro8715.0Northern SpainNavarraNaNMichael Schachner@wineschachTandem 2011 Ars In Vitro Tempranillo-Merlot (N...Tempranillo-MerlotTandem
    ..........................................
    129966GermanyNotes of honeysuckle and cantaloupe sweeten th...Brauneberger Juffer-Sonnenuhr Spätlese9028.0MoselNaNNaNAnna Lee C. IijimaNaNDr. H. Thanisch (Erben Müller-Burggraef) 2013 ...RieslingDr. H. Thanisch (Erben Müller-Burggraef)
    129967USCitation is given as much as a decade of bottl...NaN9075.0OregonOregonOregon OtherPaul Gregutt@paulgwineCitation 2004 Pinot Noir (Oregon)Pinot NoirCitation
    129968FranceWell-drained gravel soil gives this wine its c...Kritt9030.0AlsaceAlsaceNaNRoger Voss@vossrogerDomaine Gresser 2013 Kritt Gewurztraminer (Als...GewürztraminerDomaine Gresser
    129969FranceA dry style of Pinot Gris, this is crisp with ...NaN9032.0AlsaceAlsaceNaNRoger Voss@vossrogerDomaine Marcel Deiss 2012 Pinot Gris (Alsace)Pinot GrisDomaine Marcel Deiss
    129970FranceBig, rich and off-dry, this is powered by inte...Lieu-dit Harth Cuvée Caroline9021.0AlsaceAlsaceNaNRoger Voss@vossrogerDomaine Schoffit 2012 Lieu-dit Harth Cuvée Car...GewürztraminerDomaine Schoffit
    +

    120975 rows × 13 columns

    +
    + + + +

    分配数据

    另一方面,将数据分配给 DataFrame 很容易。可以分配一个常量值:

    +
    reviews['critic'] = 'everyone'
    reviews['critic']
    + + + + +
    0         everyone
    +1         everyone
    +2         everyone
    +3         everyone
    +4         everyone
    +            ...   
    +129966    everyone
    +129967    everyone
    +129968    everyone
    +129969    everyone
    +129970    everyone
    +Name: critic, Length: 129971, dtype: object
    +
    +

    或者使用可迭代的值:

    +
    reviews['index_backwards'] = range(len(reviews), 0, -1)
    reviews['index_backwards']
    + + + + +
    0         129971
    +1         129970
    +2         129969
    +3         129968
    +4         129967
    +           ...  
    +129966         5
    +129967         4
    +129968         3
    +129969         2
    +129970         1
    +Name: index_backwards, Length: 129971, dtype: int64
    +
    +

    TEST

    reviews = pd.read_csv("datasets/wine/winemag-data-130k-v2.csv", index_col=0)
    + + +
    reviews.head()
    + + + + +
    +

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    countrydescriptiondesignationpointspriceprovinceregion_1region_2taster_nametaster_twitter_handletitlevarietywinery
    0ItalyAromas include tropical fruit, broom, brimston...Vulkà Bianco87NaNSicily & SardiniaEtnaNaNKerin O’Keefe@kerinokeefeNicosia 2013 Vulkà Bianco (Etna)White BlendNicosia
    1PortugalThis is ripe and fruity, a wine that is smooth...Avidagos8715.0DouroNaNNaNRoger Voss@vossrogerQuinta dos Avidagos 2011 Avidagos Red (Douro)Portuguese RedQuinta dos Avidagos
    2USTart and snappy, the flavors of lime flesh and...NaN8714.0OregonWillamette ValleyWillamette ValleyPaul Gregutt@paulgwineRainstorm 2013 Pinot Gris (Willamette Valley)Pinot GrisRainstorm
    3USPineapple rind, lemon pith and orange blossom ...Reserve Late Harvest8713.0MichiganLake Michigan ShoreNaNAlexander PeartreeNaNSt. Julian 2013 Reserve Late Harvest Riesling ...RieslingSt. Julian
    4USMuch like the regular bottling from 2012, this...Vintner's Reserve Wild Child Block8765.0OregonWillamette ValleyWillamette ValleyPaul Gregutt@paulgwineSweet Cheeks 2012 Vintner's Reserve Wild Child...Pinot NoirSweet Cheeks
    +
    + + + +

    1.从description中选择描述列,并将结果分配给变量 desc。

    +
    desc = reviews['description']
    desc
    + + + + +
    0         Aromas include tropical fruit, broom, brimston...
    +1         This is ripe and fruity, a wine that is smooth...
    +2         Tart and snappy, the flavors of lime flesh and...
    +3         Pineapple rind, lemon pith and orange blossom ...
    +4         Much like the regular bottling from 2012, this...
    +                                ...                        
    +129966    Notes of honeysuckle and cantaloupe sweeten th...
    +129967    Citation is given as much as a decade of bottl...
    +129968    Well-drained gravel soil gives this wine its c...
    +129969    A dry style of Pinot Gris, this is crisp with ...
    +129970    Big, rich and off-dry, this is powered by inte...
    +Name: description, Length: 129971, dtype: object
    +
    +

    2.从评论的描述列中选择第一个值,将其分配给变量first_description。

    +
    first_description = desc[0]
    first_description
    + + + + +
    "Aromas include tropical fruit, broom, brimstone and dried herb. The palate isn't overly expressive, offering unripened apple, citrus and dried sage alongside brisk acidity."
    +
    +

    3.从reviews中选择第一行数据(第一条记录),并将其分配给变量first_row。

    +
    first_row = reviews.loc[0]
    first_row
    + + + + +
    country                                                              Italy
    +description              Aromas include tropical fruit, broom, brimston...
    +designation                                                   Vulkà Bianco
    +points                                                                  87
    +price                                                                  NaN
    +province                                                 Sicily & Sardinia
    +region_1                                                              Etna
    +region_2                                                               NaN
    +taster_name                                                  Kerin O’Keefe
    +taster_twitter_handle                                         @kerinokeefe
    +title                                    Nicosia 2013 Vulkà Bianco  (Etna)
    +variety                                                        White Blend
    +winery                                                             Nicosia
    +Name: 0, dtype: object
    +
    +

    4.从评论中的描述列中选择前 10 个值,将结果分配给变量first_descriptions。

    +

    提示:将输出格式化为 pandas 系列。

    +
    first_descriptions = reviews['description'].loc[0:9]
    first_descriptions
    + + + + +
    0    Aromas include tropical fruit, broom, brimston...
    +1    This is ripe and fruity, a wine that is smooth...
    +2    Tart and snappy, the flavors of lime flesh and...
    +3    Pineapple rind, lemon pith and orange blossom ...
    +4    Much like the regular bottling from 2012, this...
    +5    Blackberry and raspberry aromas show a typical...
    +6    Here's a bright, informal red that opens with ...
    +7    This dry and restrained wine offers spice in p...
    +8    Savory dried thyme notes accent sunnier flavor...
    +9    This has great depth of flavor with its fresh ...
    +Name: description, dtype: object
    +
    +

    5.Select the records with index labels 1, 2, 3, 5, and 8, assigning the result to the variable sample_reviews.

    +

    In other words, generate the following DataFrame:

    +

    +
    sample_reviews = reviews.loc[[1,2,3,5,8]]
    sample_reviews
    + + + + +
    +

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    countrydescriptiondesignationpointspriceprovinceregion_1region_2taster_nametaster_twitter_handletitlevarietywinery
    1PortugalThis is ripe and fruity, a wine that is smooth...Avidagos8715.0DouroNaNNaNRoger Voss@vossrogerQuinta dos Avidagos 2011 Avidagos Red (Douro)Portuguese RedQuinta dos Avidagos
    2USTart and snappy, the flavors of lime flesh and...NaN8714.0OregonWillamette ValleyWillamette ValleyPaul Gregutt@paulgwineRainstorm 2013 Pinot Gris (Willamette Valley)Pinot GrisRainstorm
    3USPineapple rind, lemon pith and orange blossom ...Reserve Late Harvest8713.0MichiganLake Michigan ShoreNaNAlexander PeartreeNaNSt. Julian 2013 Reserve Late Harvest Riesling ...RieslingSt. Julian
    5SpainBlackberry and raspberry aromas show a typical...Ars In Vitro8715.0Northern SpainNavarraNaNMichael Schachner@wineschachTandem 2011 Ars In Vitro Tempranillo-Merlot (N...Tempranillo-MerlotTandem
    8GermanySavory dried thyme notes accent sunnier flavor...Shine8712.0RheinhessenNaNNaNAnna Lee C. IijimaNaNHeinz Eifel 2013 Shine Gewürztraminer (Rheinhe...GewürztraminerHeinz Eifel
    +
    + + + +

    创建一个变量 df,其中包含索引标签为 0、1、10 和 100 的记录的 Country、Province、Region_1 和 Region_2 列。换句话说,生成以下 DataFrame:

    +

    +
    df = reviews[['country','province','region_1','region_2']].loc[[0,1,10,100]]
    df
    + + + + +
    +

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    countryprovinceregion_1region_2
    0ItalySicily & SardiniaEtnaNaN
    1PortugalDouroNaNNaN
    10USCaliforniaNapa ValleyNapa
    100USNew YorkFinger LakesFinger Lakes
    +
    + + + +

    7.Create a variable df containing the country and variety columns of the first 100 records.

    +

    Hint: you may use loc or iloc. When working on the answer this question and the several of the ones that follow, keep the following “gotcha” described in the tutorial:

    +
    +

    iloc uses the Python stdlib indexing scheme, where the first element of the range is included and the last one excluded.
    loc, meanwhile, indexes inclusively.

    +
    +
    +

    This is particularly confusing when the DataFrame index is a simple numerical list, e.g. 0,...,1000. In this case df.iloc[0:1000] will return 1000 entries, while df.loc[0:1000] return 1001 of them! To get 1000 elements using loc, you will need to go one lower and ask for df.iloc[0:999].

    +
    +
    df = reviews[['country','variety']].loc[0:99]
    df
    + + + + +
    +

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    countryvariety
    0ItalyWhite Blend
    1PortugalPortuguese Red
    2USPinot Gris
    3USRiesling
    4USPinot Noir
    .........
    95FranceGamay
    96FranceGamay
    97USRiesling
    98ItalySangiovese
    99USBordeaux-style Red Blend
    +

    100 rows × 2 columns

    +
    + + + +

    8.创建一个包含意大利葡萄酒评论的 DataFrame italian_wines。提示:reviews.country 等于什么?

    +
    italian_wines = reviews[reviews['country']=='Italy']
    italian_wines
    + + + + +
    +

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    countrydescriptiondesignationpointspriceprovinceregion_1region_2taster_nametaster_twitter_handletitlevarietywinery
    0ItalyAromas include tropical fruit, broom, brimston...Vulkà Bianco87NaNSicily & SardiniaEtnaNaNKerin O’Keefe@kerinokeefeNicosia 2013 Vulkà Bianco (Etna)White BlendNicosia
    6ItalyHere's a bright, informal red that opens with ...Belsito8716.0Sicily & SardiniaVittoriaNaNKerin O’Keefe@kerinokeefeTerre di Giurfo 2013 Belsito Frappato (Vittoria)FrappatoTerre di Giurfo
    13ItalyThis is dominated by oak and oak-driven aromas...Rosso87NaNSicily & SardiniaEtnaNaNKerin O’Keefe@kerinokeefeMasseria Setteporte 2012 Rosso (Etna)Nerello MascaleseMasseria Setteporte
    22ItalyDelicate aromas recall white flower and citrus...Ficiligno8719.0Sicily & SardiniaSiciliaNaNKerin O’Keefe@kerinokeefeBaglio di Pianetto 2007 Ficiligno White (Sicilia)White BlendBaglio di Pianetto
    24ItalyAromas of prune, blackcurrant, toast and oak c...Aynat8735.0Sicily & SardiniaSiciliaNaNKerin O’Keefe@kerinokeefeCanicattì 2009 Aynat Nero d'Avola (Sicilia)Nero d'AvolaCanicattì
    ..........................................
    129929ItalyThis luminous sparkler has a sweet, fruit-forw...NaN9138.0VenetoProsecco Superiore di CartizzeNaNNaNNaNCol Vetoraz Spumanti NV Prosecco Superiore di...ProseccoCol Vetoraz Spumanti
    129943ItalyA blend of Nero d'Avola and Syrah, this convey...Adènzia9029.0Sicily & SardiniaSiciliaNaNKerin O’Keefe@kerinokeefeBaglio del Cristo di Campobello 2012 Adènzia R...Red BlendBaglio del Cristo di Campobello
    129947ItalyA blend of 65% Cabernet Sauvignon, 30% Merlot ...Symposio9020.0Sicily & SardiniaTerre SicilianeNaNKerin O’Keefe@kerinokeefeFeudo Principi di Butera 2012 Symposio Red (Te...Red BlendFeudo Principi di Butera
    129961ItalyIntense aromas of wild cherry, baking spice, t...NaN9030.0Sicily & SardiniaSiciliaNaNKerin O’Keefe@kerinokeefeCOS 2013 Frappato (Sicilia)FrappatoCOS
    129962ItalyBlackberry, cassis, grilled herb and toasted a...Sàgana Tenuta San Giacomo9040.0Sicily & SardiniaSiciliaNaNKerin O’Keefe@kerinokeefeCusumano 2012 Sàgana Tenuta San Giacomo Nero d...Nero d'AvolaCusumano
    +

    19540 rows × 13 columns

    +
    + + + +

    9.创建一个 DataFrame top_oceania_wines,其中包含来自澳大利亚或新西兰的葡萄酒的至少 95 分(满分 100 分)的所有评论。

    +
    top_oceania_wines = reviews[reviews.country.isin(['Australia', 'New Zealand']) & (reviews.points>=95)]
    top_oceania_wines
    + + + + +
    +

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    countrydescriptiondesignationpointspriceprovinceregion_1region_2taster_nametaster_twitter_handletitlevarietywinery
    345AustraliaThis wine contains some material over 100 year...Rare100350.0VictoriaRutherglenNaNJoe Czerwinski@JoeCzChambers Rosewood Vineyards NV Rare Muscat (Ru...MuscatChambers Rosewood Vineyards
    346AustraliaThis deep brown wine smells like a damp, mossy...Rare98350.0VictoriaRutherglenNaNJoe Czerwinski@JoeCzChambers Rosewood Vineyards NV Rare Muscadelle...MuscadelleChambers Rosewood Vineyards
    348AustraliaDeep mahogany. Dried fig and black tea on the ...Grand97100.0VictoriaRutherglenNaNJoe Czerwinski@JoeCzChambers Rosewood Vineyards NV Grand Muscat (R...MuscatChambers Rosewood Vineyards
    349AustraliaRunRig is always complex, and the 2012 doesn't...RunRig97225.0South AustraliaBarossaNaNJoe Czerwinski@JoeCzTorbreck 2012 RunRig Shiraz-Viognier (Barossa)Shiraz-ViognierTorbreck
    356AustraliaDusty, firm, powerful: just a few apt descript...Georgia's Paddock9585.0VictoriaHeathcoteNaNJoe Czerwinski@JoeCzJasper Hill 2013 Georgia's Paddock Shiraz (Hea...ShirazJasper Hill
    360AustraliaBacon and tapenade elements merge easily on th...Descendant95125.0South AustraliaBarossa ValleyNaNJoe Czerwinski@JoeCzTorbreck 2012 Descendant Shiraz-Viognier (Baro...Shiraz-ViognierTorbreck
    365AustraliaThe Taylor family selected Clare Valley for it...St. Andrews Single Vineyard Release9560.0South AustraliaClare ValleyNaNJoe Czerwinski@JoeCzWakefield 2013 St. Andrews Single Vineyard Rel...ShirazWakefield
    14354AustraliaThis wine's concentrated dark fruit shows in t...Old Vine9560.0South AustraliaBarossa ValleyNaNJoe Czerwinski@JoeCzKaesler 2006 Old Vine Shiraz (Barossa Valley)ShirazKaesler
    16538AustraliaRich, dense and intense, this is a big, muscul...The Family Tree9565.0South AustraliaBarossa ValleyNaNJoe Czerwinski@JoeCzLambert 2013 The Family Tree Shiraz (Barossa V...ShirazLambert
    28573AustraliaAstralis has become one of Australia's top col...Astralis95350.0South AustraliaClarendonNaNJoe Czerwinski@JoeCzClarendon Hills 2005 Astralis Syrah (Clarendon)SyrahClarendon Hills
    34502AustraliaThis prodigious wine showcases Barossa's abili...The Relic98135.0South AustraliaBarossa ValleyNaNJoe Czerwinski@JoeCzStandish 2006 The Relic Shiraz (Barossa Valley)ShirazStandish
    34506AustraliaIf Standish's Relic is the feminine side of Sh...The Standish Single Vineyard96135.0South AustraliaBarossa ValleyNaNJoe Czerwinski@JoeCzStandish 2005 The Standish Single Vineyard Shi...ShirazStandish
    38988AustraliaPenfolds Bin 707 has leapt in quality over the...Bin 70795200.0South AustraliaSouth AustraliaNaNJoe Czerwinski@JoeCzPenfolds 2009 Bin 707 Cabernet Sauvignon (Sout...Cabernet SauvignonPenfolds
    39059AustraliaThe Taylor family selected Clare Valley for it...St. Andrews Single Vineyard Release9560.0South AustraliaClare ValleyNaNJoe Czerwinski@JoeCzWakefield 2013 St. Andrews Single Vineyard Rel...ShirazWakefield
    39961AustraliaAs unevolved as they are, the dense and multil...Grange96185.0South AustraliaSouth AustraliaNaNNaNNaNPenfolds 1996 Grange Shiraz (South Australia)ShirazPenfolds
    39962AustraliaSeamless luxury from stem to stern, this ‘baby...RWT9570.0South AustraliaBarossa ValleyNaNNaNNaNPenfolds 1998 RWT Shiraz (Barossa Valley)ShirazPenfolds
    45809AustraliaThe 2007 Astralis impresses for its combinatio...Astralis95225.0South AustraliaClarendonNaNJoe Czerwinski@JoeCzClarendon Hills 2007 Astralis Syrah (Clarendon)SyrahClarendon Hills
    56953AustraliaThis inky, embryonic wine deserves to be cella...Grange99850.0South AustraliaSouth AustraliaNaNJoe Czerwinski@JoeCzPenfolds 2010 Grange Shiraz (South Australia)ShirazPenfolds
    56956AustraliaYou may have to scour the country to secure so...Andelmonde9795.0South AustraliaBarossa ValleyNaNJoe Czerwinski@JoeCzStandish 2012 Andelmonde Shiraz (Barossa Valley)ShirazStandish
    56957AustraliaThorn Clarke has taken its Shiraz to a new lev...Ron Thorn Single Vineyard9689.0South AustraliaBarossaNaNJoe Czerwinski@JoeCzThorn Clarke 2012 Ron Thorn Single Vineyard Sh...ShirazThorn Clarke
    56959AustraliaIs this the Yin to Grange's Yang? The wines ar...Hill of Grace96820.0South AustraliaEden ValleyNaNJoe Czerwinski@JoeCzHenschke 2010 Hill of Grace Shiraz (Eden Valley)ShirazHenschke
    59977AustraliaThis is a top example of the classic Australia...The Peake96150.0South AustraliaMcLaren ValeNaNJoe Czerwinski@JoeCzHickinbotham 2013 The Peake Cabernet-Shiraz (M...Cabernet-ShirazHickinbotham
    59984AustraliaThis is a throwback to those brash, flavor-exu...One9595.0South AustraliaLanghorne CreekNaNJoe Czerwinski@JoeCzHeartland 2013 One Red (Langhorne Creek)Red BlendHeartland
    67096AustraliaJust a tiny serving of this dark nectar will l...Calliope Rare9886.0VictoriaRutherglenNaNJoe Czerwinski@JoeCzR.L. Buller & Son NV Calliope Rare Tokay (Ruth...TokayR.L. Buller & Son
    67101AustraliaThis Muscat is the color of dark coffee, with ...Rare95300.0VictoriaRutherglenNaNJoe Czerwinski@JoeCzChambers Rosewood Vineyards NV Rare Muscat (Ru...MuscatChambers Rosewood Vineyards
    76392AustraliaWhen the alcohol levels are reined in to appro...Georgia's Paddock9585.0VictoriaHeathcoteNaNJoe Czerwinski@JoeCzJasper Hill 2012 Georgia's Paddock Shiraz (Hea...ShirazJasper Hill
    77028AustraliaThis has all the size and weight you've come t...Grange98850.0South AustraliaSouth AustraliaNaNJoe Czerwinski@JoeCzPenfolds 2008 Grange Shiraz (South Australia)ShirazPenfolds
    77036AustraliaRWT (unromantically derived from “Red Wine Tri...RWT96150.0South AustraliaBarossa ValleyNaNJoe Czerwinski@JoeCzPenfolds 2009 RWT Shiraz (Barossa Valley)ShirazPenfolds
    77037AustraliaWinemaker Dave Powell is no longer with Torbre...RunRig96225.0South AustraliaBarossa ValleyNaNJoe Czerwinski@JoeCzTorbreck 2007 RunRig Shiraz-Viognier (Barossa ...Shiraz-ViognierTorbreck
    77042AustraliaThis is likely the most ageworthy Shiraz winem...Eligo95100.0South AustraliaBarossaNaNJoe Czerwinski@JoeCzJohn Duval Wines 2010 Eligo Shiraz (Barossa)ShirazJohn Duval Wines
    77044AustraliaThe fruit for this offering comes from the Gre...R Reserve95105.0South AustraliaBarossa ValleyNaNJoe Czerwinski@JoeCzKilikanoon 2009 R Reserve Shiraz (Barossa Valley)ShirazKilikanoon
    77046AustraliaWith aromas and flavors that range widely from...The Factor95125.0South AustraliaBarossa ValleyNaNJoe Czerwinski@JoeCzTorbreck 2007 The Factor Shiraz (Barossa Valley)ShirazTorbreck
    83357AustraliaA throwback to the monster Shiraz style of old...Grange96500.0South AustraliaSouth AustraliaNaNJoe Czerwinski@JoeCzPenfolds 2004 Grange Shiraz (South Australia)ShirazPenfolds
    84815AustraliaThe Factor is always one of Torbreck's biggest...The Factor95125.0South AustraliaBarossaNaNJoe Czerwinski@JoeCzTorbreck 2012 The Factor Shiraz (Barossa)ShirazTorbreck
    84816AustraliaNashwauk is Kaesler's McLaren Vale project, fi...Beacon95145.0South AustraliaMcLaren ValeNaNJoe Czerwinski@JoeCzNashwauk 2010 Beacon Shiraz (McLaren Vale)ShirazNashwauk
    87128AustraliaThis full-bodied, muscular Shiraz is built for...Amery Vineyard Block 696120.0South AustraliaMcLaren ValeNaNJoe Czerwinski@JoeCzKay Brothers 2012 Amery Vineyard Block 6 Shira...ShirazKay Brothers
    87137AustraliaPerhaps the best young wine I've tasted from M...NaN9584.0Western AustraliaMargaret RiverNaNJoe Czerwinski@JoeCzMoss Wood 2011 Cabernet Sauvignon (Margaret Ri...Cabernet SauvignonMoss Wood
    87143AustraliaThis is wonderfully complex and aromatic, with...St. Andrews Single Vineyard Release9560.0South AustraliaClare ValleyNaNJoe Czerwinski@JoeCzWakefield 2012 St. Andrews Single Vineyard Rel...ShirazWakefield
    91851New ZealandThis full-bodied, richly tannic wine delivers....Homage95100.0Hawke's BayNaNNaNJoe Czerwinski@JoeCzTrinity Hill 2013 Homage Syrah (Hawke's Bay)SyrahTrinity Hill
    98386AustraliaOne of the more approachable of the d'Arenberg...Little Venice Single Vineyard9585.0South AustraliaMcLaren ValeNaNJoe Czerwinski@JoeCzD'Arenberg 2010 Little Venice Single Vineyard ...ShirazD'Arenberg
    99318AustraliaFrom vines planted in 1912, this has been an i...Mount Edelstone Vineyard95200.0South AustraliaEden ValleyNaNJoe Czerwinski@JoeCzHenschke 2014 Mount Edelstone Vineyard Shiraz ...ShirazHenschke
    99330AustraliaThis Cabernet equivalent to Grange has explode...Bin 70795500.0South AustraliaSouth AustraliaNaNJoe Czerwinski@JoeCzPenfolds 2014 Bin 707 Cabernet Sauvignon (Sout...Cabernet SauvignonPenfolds
    99340AustraliaThis rich, opulent wine carries its massive oa...Les Amis95185.0South AustraliaBarossa ValleyNaNJoe Czerwinski@JoeCzTorbreck 2013 Les Amis Grenache (Barossa Valley)GrenacheTorbreck
    109427AustraliaThis wine is dark brown in hue with a greenish...Rare99300.0VictoriaRutherglenNaNJoe Czerwinski@JoeCzChambers Rosewood Vineyards NV Rare Muscadelle...MuscadelleChambers Rosewood Vineyards
    109434AustraliaD'Arenberg's lineup of single-vineyard Shiraze...The Swinging Malaysian Single Vineyard9685.0South AustraliaMcLaren ValeNaNJoe Czerwinski@JoeCzD'Arenberg 2010 The Swinging Malaysian Single ...ShirazD'Arenberg
    122421AustraliaDespite this wine's weight and richness, it re...Amon-Ra Unfiltered96110.0South AustraliaBarossa ValleyNaNJoe Czerwinski@JoeCzGlaetzer 2010 Amon-Ra Unfiltered Shiraz (Baros...ShirazGlaetzer
    122430AustraliaThese blends are traditional in Australia—they...Anaperenna9580.0South AustraliaBarossa ValleyNaNJoe Czerwinski@JoeCzGlaetzer 2010 Anaperenna Shiraz-Cabernet Sauvi...Shiraz-Cabernet SauvignonGlaetzer
    122507New ZealandThis blend of Cabernet Sauvignon (62.5%), Merl...SQM Gimblett Gravels Cabernets/Merlot9579.0Hawke's BayNaNNaNJoe Czerwinski@JoeCzSquawking Magpie 2014 SQM Gimblett Gravels Cab...Bordeaux-style Red BlendSquawking Magpie
    122939AustraliaFull-bodied and plush yet vibrant and imbued w...The Factor98125.0South AustraliaBarossa ValleyNaNJoe Czerwinski@JoeCzTorbreck 2013 The Factor Shiraz (Barossa Valley)ShirazTorbreck
    +
    + + + +

    Summary Functions and Maps

    介绍

    在上一教程中,我们学习了如何从 DataFrame 或 Series 中选择相关数据。正如我们在练习中演示的那样,从数据表示中提取正确的数据对于完成工作至关重要。

    +

    然而,数据并不总是以我们想要的格式从内存中直接取出。有时,我们必须自己再做一些工作来重新格式化数据,以完成手头的任务。本教程将介绍我们可以对数据进行的不同操作,以获得 “恰到好处 “的输入。

    +
    import pandas as pd
    import numpy as np

    reviews = pd.read_csv('datasets/wine/winemag-data-130k-v2.csv',index_col=0)
    + + +
    reviews
    + + + + +
    +

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    countrydescriptiondesignationpointspriceprovinceregion_1region_2taster_nametaster_twitter_handletitlevarietywinery
    0ItalyAromas include tropical fruit, broom, brimston...Vulkà Bianco87NaNSicily & SardiniaEtnaNaNKerin O’Keefe@kerinokeefeNicosia 2013 Vulkà Bianco (Etna)White BlendNicosia
    1PortugalThis is ripe and fruity, a wine that is smooth...Avidagos8715.0DouroNaNNaNRoger Voss@vossrogerQuinta dos Avidagos 2011 Avidagos Red (Douro)Portuguese RedQuinta dos Avidagos
    2USTart and snappy, the flavors of lime flesh and...NaN8714.0OregonWillamette ValleyWillamette ValleyPaul Gregutt@paulgwineRainstorm 2013 Pinot Gris (Willamette Valley)Pinot GrisRainstorm
    3USPineapple rind, lemon pith and orange blossom ...Reserve Late Harvest8713.0MichiganLake Michigan ShoreNaNAlexander PeartreeNaNSt. Julian 2013 Reserve Late Harvest Riesling ...RieslingSt. Julian
    4USMuch like the regular bottling from 2012, this...Vintner's Reserve Wild Child Block8765.0OregonWillamette ValleyWillamette ValleyPaul Gregutt@paulgwineSweet Cheeks 2012 Vintner's Reserve Wild Child...Pinot NoirSweet Cheeks
    ..........................................
    129966GermanyNotes of honeysuckle and cantaloupe sweeten th...Brauneberger Juffer-Sonnenuhr Spätlese9028.0MoselNaNNaNAnna Lee C. IijimaNaNDr. H. Thanisch (Erben Müller-Burggraef) 2013 ...RieslingDr. H. Thanisch (Erben Müller-Burggraef)
    129967USCitation is given as much as a decade of bottl...NaN9075.0OregonOregonOregon OtherPaul Gregutt@paulgwineCitation 2004 Pinot Noir (Oregon)Pinot NoirCitation
    129968FranceWell-drained gravel soil gives this wine its c...Kritt9030.0AlsaceAlsaceNaNRoger Voss@vossrogerDomaine Gresser 2013 Kritt Gewurztraminer (Als...GewürztraminerDomaine Gresser
    129969FranceA dry style of Pinot Gris, this is crisp with ...NaN9032.0AlsaceAlsaceNaNRoger Voss@vossrogerDomaine Marcel Deiss 2012 Pinot Gris (Alsace)Pinot GrisDomaine Marcel Deiss
    129970FranceBig, rich and off-dry, this is powered by inte...Lieu-dit Harth Cuvée Caroline9021.0AlsaceAlsaceNaNRoger Voss@vossrogerDomaine Schoffit 2012 Lieu-dit Harth Cuvée Car...GewürztraminerDomaine Schoffit
    +

    129971 rows × 13 columns

    +
    + + + +

    Summary functions

    Pandas 提供了许多简单的“摘要函数”(不是官方名称),它们以某种有用的方式重组数据。例如,考虑describe()方法:

    +
    reviews.points.describe()
    + + + + +
    count    129971.000000
    +mean         88.447138
    +std           3.039730
    +min          80.000000
    +25%          86.000000
    +50%          88.000000
    +75%          91.000000
    +max         100.000000
    +Name: points, dtype: float64
    +
    +

    该方法生成给定列属性的高级摘要。它是类型感知的,这意味着它的输出会根据输入的数据类型而改变。上面的输出仅对数值数据有意义;对于字符串数据,我们得到的结果如下:

    +
    reviews.taster_name.describe()
    + + + + +
    count         103727
    +unique            19
    +top       Roger Voss
    +freq           25514
    +Name: taster_name, dtype: object
    +
    +

    如果你想得到DataFrame或Series中某一列的一些特定的简单汇总统计,通常有一个有用的pandas函数可以实现。

    +

    例如,我们可以使用mean()函数来查看所分配分数的平均值(例如,平均评分的葡萄酒的表现如何):

    +
    reviews.points.mean()
    + + + + +
    88.44713820775404
    +
    +

    要查看唯一值的列表,我们可以使用 unique() 函数:

    +
    reviews.taster_name.unique()
    + + + + +
    array(['Kerin O’Keefe', 'Roger Voss', 'Paul Gregutt',
    +       'Alexander Peartree', 'Michael Schachner', 'Anna Lee C. Iijima',
    +       'Virginie Boone', 'Matt Kettmann', nan, 'Sean P. Sullivan',
    +       'Jim Gordon', 'Joe Czerwinski', 'Anne Krebiehl\xa0MW',
    +       'Lauren Buzzeo', 'Mike DeSimone', 'Jeff Jenssen',
    +       'Susan Kostrzewa', 'Carrie Dykes', 'Fiona Adams',
    +       'Christina Pickard'], dtype=object)
    +
    +

    要查看唯一值的列表以及它们在数据集中出现的频率,我们可以使用 value_counts() 方法:

    +
    reviews.taster_name.value_counts()
    + + + + +
    taster_name
    +Roger Voss            25514
    +Michael Schachner     15134
    +Kerin O’Keefe         10776
    +Virginie Boone         9537
    +Paul Gregutt           9532
    +Matt Kettmann          6332
    +Joe Czerwinski         5147
    +Sean P. Sullivan       4966
    +Anna Lee C. Iijima     4415
    +Jim Gordon             4177
    +Anne Krebiehl MW       3685
    +Lauren Buzzeo          1835
    +Susan Kostrzewa        1085
    +Mike DeSimone           514
    +Jeff Jenssen            491
    +Alexander Peartree      415
    +Carrie Dykes            139
    +Fiona Adams              27
    +Christina Pickard         6
    +Name: count, dtype: int64
    +
    +

    Maps

    映射(map)是从数学中借用的术语,指的是将一组值 “映射 “到另一组值的函数。在数据科学中,我们经常需要从现有数据中创建新的表示方法,或者将数据从现在的格式转换为我们希望的格式。映射就是处理这些工作的工具,因此它对于完成工作极为重要!

    +

    有两种映射方法您会经常用到。

    +

    map()是第一个,也是稍微简单的一个。例如,假设我们想将葡萄酒得到的分数重新平均为0:

    +
    review_points_mean = reviews.points.mean()
    reviews.points.map(lambda p: p - review_points_mean) #输入points,函数为points-points_mean
    + + + + +
    0        -1.447138
    +1        -1.447138
    +2        -1.447138
    +3        -1.447138
    +4        -1.447138
    +            ...   
    +129966    1.552862
    +129967    1.552862
    +129968    1.552862
    +129969    1.552862
    +129970    1.552862
    +Name: points, Length: 129971, dtype: float64
    +
    +

    您传递给map()的函数应该期望从Series中得到一个单独的值(在上面的示例中是一个点值),并返回该值的转换版本。 map()返回一个新的Series,其中所有的值都已被您的函数转换。

    +

    如果我们想通过在每一行上调用自定义方法来转换整个DataFrame,则apply()是等价的方法。

    +
    def remean_points(row):
    row.points = row.points - review_points_mean
    return row

    reviews.apply(remean_points, axis='columns')
    + + + + +
    +

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    countrydescriptiondesignationpointspriceprovinceregion_1region_2taster_nametaster_twitter_handletitlevarietywinery
    0ItalyAromas include tropical fruit, broom, brimston...Vulkà Bianco-1.447138NaNSicily & SardiniaEtnaNaNKerin O’Keefe@kerinokeefeNicosia 2013 Vulkà Bianco (Etna)White BlendNicosia
    1PortugalThis is ripe and fruity, a wine that is smooth...Avidagos-1.44713815.0DouroNaNNaNRoger Voss@vossrogerQuinta dos Avidagos 2011 Avidagos Red (Douro)Portuguese RedQuinta dos Avidagos
    2USTart and snappy, the flavors of lime flesh and...NaN-1.44713814.0OregonWillamette ValleyWillamette ValleyPaul Gregutt@paulgwineRainstorm 2013 Pinot Gris (Willamette Valley)Pinot GrisRainstorm
    3USPineapple rind, lemon pith and orange blossom ...Reserve Late Harvest-1.44713813.0MichiganLake Michigan ShoreNaNAlexander PeartreeNaNSt. Julian 2013 Reserve Late Harvest Riesling ...RieslingSt. Julian
    4USMuch like the regular bottling from 2012, this...Vintner's Reserve Wild Child Block-1.44713865.0OregonWillamette ValleyWillamette ValleyPaul Gregutt@paulgwineSweet Cheeks 2012 Vintner's Reserve Wild Child...Pinot NoirSweet Cheeks
    ..........................................
    129966GermanyNotes of honeysuckle and cantaloupe sweeten th...Brauneberger Juffer-Sonnenuhr Spätlese1.55286228.0MoselNaNNaNAnna Lee C. IijimaNaNDr. H. Thanisch (Erben Müller-Burggraef) 2013 ...RieslingDr. H. Thanisch (Erben Müller-Burggraef)
    129967USCitation is given as much as a decade of bottl...NaN1.55286275.0OregonOregonOregon OtherPaul Gregutt@paulgwineCitation 2004 Pinot Noir (Oregon)Pinot NoirCitation
    129968FranceWell-drained gravel soil gives this wine its c...Kritt1.55286230.0AlsaceAlsaceNaNRoger Voss@vossrogerDomaine Gresser 2013 Kritt Gewurztraminer (Als...GewürztraminerDomaine Gresser
    129969FranceA dry style of Pinot Gris, this is crisp with ...NaN1.55286232.0AlsaceAlsaceNaNRoger Voss@vossrogerDomaine Marcel Deiss 2012 Pinot Gris (Alsace)Pinot GrisDomaine Marcel Deiss
    129970FranceBig, rich and off-dry, this is powered by inte...Lieu-dit Harth Cuvée Caroline1.55286221.0AlsaceAlsaceNaNRoger Voss@vossrogerDomaine Schoffit 2012 Lieu-dit Harth Cuvée Car...GewürztraminerDomaine Schoffit
    +

    129971 rows × 13 columns

    +
    + + + +

    如果我们在调用views.apply()时使用的是axis=’index’,那么我们就不需要传递一个函数来转换每一行,而是需要给出一个函数来转换每一列。请注意,map()和apply()分别返回新的、转换后的Series和DataFrames。它们不会修改被调用的原始数据。如果我们查看第一行的评论,我们可以看到它仍然具有原始的点值。

    +
    reviews.head(1)
    + + + + +
    +

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    countrydescriptiondesignationpointspriceprovinceregion_1region_2taster_nametaster_twitter_handletitlevarietywinery
    0ItalyAromas include tropical fruit, broom, brimston...Vulkà Bianco87NaNSicily & SardiniaEtnaNaNKerin O’Keefe@kerinokeefeNicosia 2013 Vulkà Bianco (Etna)White BlendNicosia
    +
    + + + +

    Pandas 提供了许多常见的内置映射操作。例如,以下是重新定义点列的更快方法:

    +
    review_points_mean = reviews.points.mean()
    reviews.points - review_points_mean
    + + + + +
    0        -1.447138
    +1        -1.447138
    +2        -1.447138
    +3        -1.447138
    +4        -1.447138
    +            ...   
    +129966    1.552862
    +129967    1.552862
    +129968    1.552862
    +129969    1.552862
    +129970    1.552862
    +Name: points, Length: 129971, dtype: float64
    +
    +

    在这段代码中,我们在左侧的大量值(系列中的所有值)和右侧的单个值(平均值)之间执行运算。Pandas查看该表达式,并计算出我们必须从数据集中的每个值中减去该平均值。

    +

    如果我们在等长序列之间执行这些操作,Pandas也会明白该怎么做。例如,结合数据集中的国家和地区信息的简单方法如下:

    +
    reviews.country + " - " + reviews.region_1
    + + + + +
    0                     Italy - Etna
    +1                              NaN
    +2           US - Willamette Valley
    +3         US - Lake Michigan Shore
    +4           US - Willamette Valley
    +                    ...           
    +129966                         NaN
    +129967                 US - Oregon
    +129968             France - Alsace
    +129969             France - Alsace
    +129970             France - Alsace
    +Length: 129971, dtype: object
    +
    +

    这些运算符比map()或apply()更快,因为它们使用了pandas内置的加速功能。所有标准的 Python 运算符 (>, <, ==, 等等) 都以这种方式工作。

    +

    然而,它们不如map()或apply()灵活,后者可以做更高级的事情,比如应用条件逻辑,而这是加减法无法做到的。

    +

    TEST

    import pandas as pd
    reviews = pd.read_csv('datasets/wine/winemag-data-130k-v2.csv',index_col=0)
    + +

    1.review DataFrame 中points列的中位数是多少?

    +
    reviews['points'].median()
    + + + + +
    88.0
    +
    +

    2.What countries are represented in the dataset? (Your answer should not include any duplicates.)

    +
    countries=reviews['country'].unique()
    countries
    + + + + +
    array(['Italy', 'Portugal', 'US', 'Spain', 'France', 'Germany',
    +       'Argentina', 'Chile', 'Australia', 'Austria', 'South Africa',
    +       'New Zealand', 'Israel', 'Hungary', 'Greece', 'Romania', 'Mexico',
    +       'Canada', nan, 'Turkey', 'Czech Republic', 'Slovenia',
    +       'Luxembourg', 'Croatia', 'Georgia', 'Uruguay', 'England',
    +       'Lebanon', 'Serbia', 'Brazil', 'Moldova', 'Morocco', 'Peru',
    +       'India', 'Bulgaria', 'Cyprus', 'Armenia', 'Switzerland',
    +       'Bosnia and Herzegovina', 'Ukraine', 'Slovakia', 'Macedonia',
    +       'China', 'Egypt'], dtype=object)
    +
    +

    3.How often does each country appear in the dataset? Create a Series reviews_per_country mapping countries to the count of reviews of wines from that country.
    每个国家在数据集中出现的频率是多少?创建一个 Series Reviews_per_country,将国家映射到该国家的葡萄酒reviews数量。

    +

    reviews['country'].value_counts()
    + + + + +
    country
    +US                        54504
    +France                    22093
    +Italy                     19540
    +Spain                      6645
    +Portugal                   5691
    +Chile                      4472
    +Argentina                  3800
    +Austria                    3345
    +Australia                  2329
    +Germany                    2165
    +New Zealand                1419
    +South Africa               1401
    +Israel                      505
    +Greece                      466
    +Canada                      257
    +Hungary                     146
    +Bulgaria                    141
    +Romania                     120
    +Uruguay                     109
    +Turkey                       90
    +Slovenia                     87
    +Georgia                      86
    +England                      74
    +Croatia                      73
    +Mexico                       70
    +Moldova                      59
    +Brazil                       52
    +Lebanon                      35
    +Morocco                      28
    +Peru                         16
    +Ukraine                      14
    +Serbia                       12
    +Czech Republic               12
    +Macedonia                    12
    +Cyprus                       11
    +India                         9
    +Switzerland                   7
    +Luxembourg                    6
    +Bosnia and Herzegovina        2
    +Armenia                       2
    +Slovakia                      1
    +China                         1
    +Egypt                         1
    +Name: count, dtype: int64
    +
    +

    Create variable centered_price containing a version of the price column with the mean price subtracted. (Note: this ‘centering’ transformation is a common preprocessing step before applying various machine learning algorithms.)

    +

    创建变量 centered_price,其中包含减去平均价格的价格列版本。 (注意:这种“居中”转换是应用各种机器学习算法之前的常见预处理步骤。)

    +
    a = reviews['price'].mean()
    reviews['price'].map(lambda p: p-a)
    + + + + +
    0               NaN
    +1        -20.363389
    +2        -21.363389
    +3        -22.363389
    +4         29.636611
    +            ...    
    +129966    -7.363389
    +129967    39.636611
    +129968    -5.363389
    +129969    -3.363389
    +129970   -14.363389
    +Name: price, Length: 129971, dtype: float64
    +
    +

    I’m an economical wine buyer. Which wine is the “best bargain”? Create a variable bargain_wine with the title of the wine with the highest points-to-price ratio in the dataset.

    +

    我是一个经济实惠的葡萄酒买家。哪种酒是“最划算的”?使用数据集中积分价格比最高的葡萄酒的标题创建一个变量 deal_wine。

    +
    # reviews[[(reviews['points']/reviews['price']).idxmax()]]
    reviews['title'][(reviews['points']/reviews['price']).idxmax()]

    + + + + +
    'Bandit NV Merlot (California)'
    +
    +

    6.There are only so many words you can use when describing a bottle of wine. Is a wine more likely to be “tropical” or “fruity”? Create a Series descriptor_counts counting how many times each of these two words appears in the description column in the dataset. (For simplicity, let’s ignore the capitalized versions of these words.)

    +

    在描述一瓶葡萄酒时,您可以使用的词汇有限。葡萄酒更可能是 “热带 “还是 “果味”?创建一个 “descriptor_counts “系列,计算这两个词在数据集的 “description “列中分别出现的次数。(为简单起见,让我们忽略这些词的大写版本)。

    +
    import re

    def trop_ocurr(row):
    return re.search("tropical",row.description)==None

    def frui_ocurr(row):
    return re.search("fruity",row.description)==None

    a = reviews.apply(trop_ocurr, axis='columns').value_counts()[False]
    b = reviews.apply(frui_ocurr, axis='columns').value_counts()[False]

    pd.Series([a,b],index=['tropical', 'fruity'])

    + + + + +
    0    3607
    +1    9090
    +dtype: int64
    +
    +
    ############答案的方法##########
    n_trop = reviews.description.map(lambda desc: "tropical" in desc).sum()
    n_fruity = reviews.description.map(lambda desc: "fruity" in desc).sum()
    pd.Series([n_trop, n_fruity], index=['tropical', 'fruity'])
    + + + + +
    tropical    3607
    +fruity      9090
    +dtype: int64
    +
    +
      +
    1. We’d like to host these wine reviews on our website, but a rating system ranging from 80 to 100 points is too hard to understand - we’d like to translate them into simple star ratings. A score of 95 or higher counts as 3 stars, a score of at least 85 but less than 95 is 2 stars. Any other score is 1 star.
    2. +
    +

    Also, the Canadian Vintners Association bought a lot of ads on the site, so any wines from Canada should automatically get 3 stars, regardless of points.

    +

    Create a series star_ratings with the number of stars corresponding to each review in the dataset.

    +

    我们希望将这些酒评放在我们的网站上,但从80分到100分的评分系统太难懂了–我们希望将其转化为简单的星级评分。95分及以上为3星,85分以上95分以下为2星。其他分数为1星。

    +

    此外,加拿大葡萄酒商协会在网站上购买了大量广告,因此任何来自加拿大的葡萄酒都应该自动获得3星,无论分数高低。

    +

    创建一个 “star_ratings “序列,其中包含数据集中每条review对应的星级数。

    +
    a = pd.Series()
    def rate(row):
    # row['points']=3 if (row['country']=='Canada' or row['points']>=95) else 2 if(row['points']>=85) else 1
    return 3 if (row['country']=='Canada' or row['points']>=95) else 2 if(row['points']>=85) else 1
    # return row

    # reviews.apply(rate, axis='columns')['points']
    reviews.apply(rate, axis='columns')

    + + + + +
    0         2
    +1         2
    +2         2
    +3         2
    +4         2
    +         ..
    +129966    2
    +129967    2
    +129968    2
    +129969    2
    +129970    2
    +Length: 129971, dtype: int64
    +
    +
    ###官方答案###
    def stars(row):
    if row.country == 'Canada':
    return 3
    elif row.points >= 95:
    return 3
    elif row.points >= 85:
    return 2
    else:
    return 1

    reviews.apply(stars, axis='columns')
    + + + + +
    0         2
    +1         2
    +2         2
    +3         2
    +4         2
    +         ..
    +129966    2
    +129967    2
    +129968    2
    +129969    2
    +129970    2
    +Length: 129971, dtype: int64
    +
    +

    Grouping and Sorting

    映射允许我们对数据帧或系列中的数据进行转换,一次只转换整个列中的一个值。然而,我们经常希望对数据进行分组,然后对数据所在的组进行特定操作。

    +

    正如您将了解到的,我们通过groupby()操作来实现这一点。我们还将介绍一些其他主题,例如索引DataFrames的更复杂方法,以及如何排序数据。

    +

    分组分析

    到目前为止,我们经常使用的一个函数是 value_counts() 函数。我们可以通过执行以下操作来复制 value_counts() 的作用:

    +
    import pandas as pd

    reviews = pd.read_csv('datasets/wine/winemag-data-130k-v2.csv',index_col=0)
    + + +
    print(reviews.groupby('points').points.count())
    print(reviews.groupby('points').price.count())
    print(reviews.groupby('price').price.count())
    print(reviews.groupby('price').points.count())
    + +
    points
    +80       397
    +81       692
    +82      1836
    +83      3025
    +84      6480
    +85      9530
    +86     12600
    +87     16933
    +88     17207
    +89     12226
    +90     15410
    +91     11359
    +92      9613
    +93      6489
    +94      3758
    +95      1535
    +96       523
    +97       229
    +98        77
    +99        33
    +100       19
    +Name: points, dtype: int64
    +points
    +80       395
    +81       680
    +82      1772
    +83      2886
    +84      6099
    +85      8902
    +86     11745
    +87     15767
    +88     16014
    +89     11324
    +90     14361
    +91     10564
    +92      8871
    +93      5935
    +94      3449
    +95      1406
    +96       482
    +97       207
    +98        69
    +99        28
    +100       19
    +Name: price, dtype: int64
    +price
    +4.0        11
    +5.0        46
    +6.0       120
    +7.0       433
    +8.0       892
    +         ... 
    +1900.0      1
    +2000.0      2
    +2013.0      1
    +2500.0      2
    +3300.0      1
    +Name: price, Length: 390, dtype: int64
    +price
    +4.0        11
    +5.0        46
    +6.0       120
    +7.0       433
    +8.0       892
    +         ... 
    +1900.0      1
    +2000.0      2
    +2013.0      1
    +2500.0      2
    +3300.0      1
    +Name: points, Length: 390, dtype: int64
    +
    +

    groupby()创建了一组评论,这些评论为给定的葡萄酒分配了相同的分值。然后,对于每一组,我们抓取points()列并计算它出现的次数。 value_counts()只是groupby()操作的快捷方式。

    +

    我们可以对这些数据使用我们之前使用过的任何汇总函数。例如,要获得每个点值类别中最便宜的葡萄酒,我们可以执行以下操作:

    +
    reviews.groupby('points').price.min()
    + + + + +
    points
    +80      5.0
    +81      5.0
    +82      4.0
    +83      4.0
    +84      4.0
    +85      4.0
    +86      4.0
    +87      5.0
    +88      6.0
    +89      7.0
    +90      8.0
    +91      7.0
    +92     11.0
    +93     12.0
    +94     13.0
    +95     20.0
    +96     20.0
    +97     35.0
    +98     50.0
    +99     44.0
    +100    80.0
    +Name: price, dtype: float64
    +
    +

    您可以将我们生成的每个组视为DataFrame的一个片段,其中仅包含值匹配的数据。我们可以使用apply()方法直接访问该DataFrame,然后以我们认为合适的方式处理数据。例如,我们可以从数据集中的每个酒庄中选择第一款葡萄酒的名称:

    +
    reviews.groupby('winery').apply(lambda df: df.title.iloc[0])
    + + + + +
    winery
    +1+1=3                                     1+1=3 NV Rosé Sparkling (Cava)
    +10 Knots                            10 Knots 2010 Viognier (Paso Robles)
    +100 Percent Wine              100 Percent Wine 2015 Moscato (California)
    +1000 Stories           1000 Stories 2013 Bourbon Barrel Aged Zinfande...
    +1070 Green                  1070 Green 2011 Sauvignon Blanc (Rutherford)
    +                                             ...                        
    +Órale                       Órale 2011 Cabronita Red (Santa Ynez Valley)
    +Öko                    Öko 2013 Made With Organically Grown Grapes Ma...
    +Ökonomierat Rebholz    Ökonomierat Rebholz 2007 Von Rotliegenden Spät...
    +àMaurice               àMaurice 2013 Fred Estate Syrah (Walla Walla V...
    +Štoka                                    Štoka 2009 Izbrani Teran (Kras)
    +Length: 16757, dtype: object
    +
    +

    为了进行更细粒度的控制,您还可以按多列进行分组。举个例子,以下是我们如何按国家和省份挑选最好的葡萄酒的方法:

    +
    reviews.groupby(['country', 'province']).apply(lambda df: df.loc[df.points.idxmax()])
    + + + + +
    +

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    countrydescriptiondesignationpointspriceprovinceregion_1region_2taster_nametaster_twitter_handletitlevarietywinery
    countryprovince
    ArgentinaMendoza ProvinceArgentinaIf the color doesn't tell the full story, the ...Nicasia Vineyard97120.0Mendoza ProvinceMendozaNaNMichael Schachner@wineschachBodega Catena Zapata 2006 Nicasia Vineyard Mal...MalbecBodega Catena Zapata
    OtherArgentinaTake note, this could be the best wine Colomé ...Reserva9590.0OtherSaltaNaNMichael Schachner@wineschachColomé 2010 Reserva Malbec (Salta)MalbecColomé
    ArmeniaArmeniaArmeniaDeep salmon in color, this wine offers a bouqu...Estate Bottled8815.0ArmeniaNaNNaNMike DeSimone@worldwineguysVan Ardi 2015 Estate Bottled Rosé (Armenia)RoséVan Ardi
    AustraliaAustralia OtherAustraliaWrites the book on how to make a wine filled w...Sarah's Blend9315.0Australia OtherSouth Eastern AustraliaNaNNaNNaNMarquis Philips 2000 Sarah's Blend Red (South ...Red BlendMarquis Philips
    New South WalesAustraliaDe Bortoli's Noble One is as good as ever in 2...Noble One Bortytis9432.0New South WalesNew South WalesNaNJoe Czerwinski@JoeCzDe Bortoli 2007 Noble One Bortytis Semillon (N...SémillonDe Bortoli
    .............................................
    UruguayJuanicoUruguayThis mature Bordeaux-style blend is earthy on ...Preludio Barrel Select Lote N 779045.0JuanicoNaNNaNMichael Schachner@wineschachFamilia Deicas 2004 Preludio Barrel Select Lot...Red BlendFamilia Deicas
    MontevideoUruguayA rich, heady bouquet offers aromas of blackbe...Monte Vide Eu Tannat-Merlot-Tempranillo9160.0MontevideoNaNNaNMichael Schachner@wineschachBouza 2015 Monte Vide Eu Tannat-Merlot-Tempran...Red BlendBouza
    ProgresoUruguayRusty in color but deep and complex in nature,...Etxe Oneko Fortified Sweet Red9046.0ProgresoNaNNaNMichael Schachner@wineschachPisano 2007 Etxe Oneko Fortified Sweet Red Tan...TannatPisano
    San JoseUruguayBaked, sweet, heavy aromas turn earthy with ti...El Preciado Gran Reserva8750.0San JoseNaNNaNMichael Schachner@wineschachCastillo Viejo 2005 El Preciado Gran Reserva R...Red BlendCastillo Viejo
    UruguayUruguayCherry and berry aromas are ripe, healthy and ...Blend 002 Limited Edition9122.0UruguayNaNNaNMichael Schachner@wineschachNarbona NV Blend 002 Limited Edition Tannat-Ca...Tannat-Cabernet FrancNarbona
    +

    425 rows × 13 columns

    +
    + + + +

    另一个值得一提的 groupby() 方法是 agg(),它允许您同时在 DataFrame 上运行一堆不同的函数。例如,我们可以生成数据集的简单统计摘要,如下所示:

    +
    reviews.groupby(['country']).price.agg([len, min, max])
    + + + + +
    +

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    lenminmax
    country
    Argentina38004.0230.0
    Armenia214.015.0
    Australia23295.0850.0
    Austria33457.01100.0
    Bosnia and Herzegovina212.013.0
    Brazil5210.060.0
    Bulgaria1418.0100.0
    Canada25712.0120.0
    Chile44725.0400.0
    China118.018.0
    Croatia7312.065.0
    Cyprus1111.021.0
    Czech Republic1215.045.0
    Egypt1NaNNaN
    England7425.095.0
    France220935.03300.0
    Georgia869.040.0
    Germany21655.0775.0
    Greece4668.079.0
    Hungary14610.0764.0
    India910.020.0
    Israel5058.0150.0
    Italy195405.0900.0
    Lebanon3513.075.0
    Luxembourg616.030.0
    Macedonia1215.020.0
    Mexico708.0108.0
    Moldova598.042.0
    Morocco2814.040.0
    New Zealand14197.0130.0
    Peru1610.068.0
    Portugal56915.01000.0
    Romania1204.0320.0
    Serbia1215.042.0
    Slovakia116.016.0
    Slovenia877.090.0
    South Africa14015.0330.0
    Spain66454.0770.0
    Switzerland721.0160.0
    Turkey9014.0120.0
    US545044.02013.0
    Ukraine146.013.0
    Uruguay10910.0130.0
    +
    + + + +

    有效使用 groupby() 将使您能够利用数据集做很多真正强大的事情。

    +

    Multi-indexes

    在我们迄今为止看到的所有示例中,我们一直在使用单标签索引的DataFrame或Series对象。
    groupby()略有不同,根据我们运行的操作,它有时会产生所谓的多索引。
    多索引与常规索引的不同之处在于它具有多个级别。例如:

    +
    countries_reviewed = reviews.groupby(['country', 'province']).description.agg([len])
    countries_reviewed
    # reviews['description'][0].__len__()
    + + + + +
    +

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    len
    countryprovince
    ArgentinaMendoza Province3264
    Other536
    ArmeniaArmenia2
    AustraliaAustralia Other245
    New South Wales85
    .........
    UruguayJuanico12
    Montevideo11
    Progreso11
    San Jose3
    Uruguay24
    +

    425 rows × 1 columns

    +
    + + + + +
    mi = countries_reviewed.index
    type(mi)
    + + + + +
    pandas.core.indexes.multi.MultiIndex
    +
    +

    多级索引有几种处理分层结构的方法,而单级索引则没有这些方法。它们还需要两层标签来获取一个值。对于刚接触pandas的用户来说,处理多索引输出是一个常见的 “疑难杂症”。

    +

    在pandas文档的MultiIndex/Advanced Selection部分详细介绍了多索引的用例和使用说明。

    +

    然而,一般来说,你最常使用的多索引方法是转换回普通索引的reset_index()方法:

    +
    countries_reviewed.reset_index()
    + + + + +
    +

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    countryprovincelen
    0ArgentinaMendoza Province3264
    1ArgentinaOther536
    2ArmeniaArmenia2
    3AustraliaAustralia Other245
    4AustraliaNew South Wales85
    ............
    420UruguayJuanico12
    421UruguayMontevideo11
    422UruguayProgreso11
    423UruguaySan Jose3
    424UruguayUruguay24
    +

    425 rows × 3 columns

    +
    + + + +

    Sorting

    再次查看 countries_reviewed,我们可以看到分组返回的数据是按照索引顺序而不是值的顺序排列的。也就是说,在输出分组结果时,行的顺序取决于索引中的值,而不是数据中的值。

    +

    为了按照我们想要的顺序获得数据,我们可以自己对数据进行排序。sort_values()方法在这方面非常方便。

    +
    countries_reviewed = countries_reviewed.reset_index()
    countries_reviewed.sort_values(by='len')
    + + + + +
    +

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    countryprovincelen
    179GreeceMuscat of Kefallonian1
    192GreeceSterea Ellada1
    194GreeceThraki1
    354South AfricaPaardeberg1
    40BrazilSerra do Sudeste1
    ............
    409USOregon5373
    227ItalyTuscany5897
    118FranceBordeaux5941
    415USWashington8639
    392USCalifornia36247
    +

    425 rows × 3 columns

    +
    + + + +

    sort_values() 默认为升序排序,其中最低的值排在前面。然而,大多数时候我们想要降序排序,即数字较大的排在前面。事情是这样的:

    +
    countries_reviewed.sort_values(by='len', ascending=False)
    + + + + +
    +

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    countryprovincelen
    392USCalifornia36247
    415USWashington8639
    118FranceBordeaux5941
    227ItalyTuscany5897
    409USOregon5373
    ............
    101CroatiaKrk1
    247New ZealandGladstone1
    357South AfricaPiekenierskloof1
    63ChileCoelemu1
    149GreeceBeotia1
    +

    425 rows × 3 columns

    +
    + + + +

    要按索引值排序,请使用配套方法 sort_index()。此方法具有相同的参数和默认顺序:

    +
    countries_reviewed.sort_index()
    + + + + +
    +

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    countryprovincelen
    0ArgentinaMendoza Province3264
    1ArgentinaOther536
    2ArmeniaArmenia2
    3AustraliaAustralia Other245
    4AustraliaNew South Wales85
    ............
    420UruguayJuanico12
    421UruguayMontevideo11
    422UruguayProgreso11
    423UruguaySan Jose3
    424UruguayUruguay24
    +

    425 rows × 3 columns

    +
    + + + +

    最后,要知道您一次可以按多个列进行排序:

    +
    countries_reviewed.sort_values(by=['country', 'len'])
    + + + + +
    +

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    countryprovincelen
    1ArgentinaOther536
    0ArgentinaMendoza Province3264
    2ArmeniaArmenia2
    6AustraliaTasmania42
    4AustraliaNew South Wales85
    ............
    421UruguayMontevideo11
    422UruguayProgreso11
    420UruguayJuanico12
    424UruguayUruguay24
    419UruguayCanelones43
    +

    425 rows × 3 columns

    +
    + + + +

    TEST

    import pandas as pd

    reviews = pd.read_csv('datasets/wine/winemag-data-130k-v2.csv')
    reviews.head()
    + + + + +
    +

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    Unnamed: 0countrydescriptiondesignationpointspriceprovinceregion_1region_2taster_nametaster_twitter_handletitlevarietywinery
    00ItalyAromas include tropical fruit, broom, brimston...Vulkà Bianco87NaNSicily & SardiniaEtnaNaNKerin O’Keefe@kerinokeefeNicosia 2013 Vulkà Bianco (Etna)White BlendNicosia
    11PortugalThis is ripe and fruity, a wine that is smooth...Avidagos8715.0DouroNaNNaNRoger Voss@vossrogerQuinta dos Avidagos 2011 Avidagos Red (Douro)Portuguese RedQuinta dos Avidagos
    22USTart and snappy, the flavors of lime flesh and...NaN8714.0OregonWillamette ValleyWillamette ValleyPaul Gregutt@paulgwineRainstorm 2013 Pinot Gris (Willamette Valley)Pinot GrisRainstorm
    33USPineapple rind, lemon pith and orange blossom ...Reserve Late Harvest8713.0MichiganLake Michigan ShoreNaNAlexander PeartreeNaNSt. Julian 2013 Reserve Late Harvest Riesling ...RieslingSt. Julian
    44USMuch like the regular bottling from 2012, this...Vintner's Reserve Wild Child Block8765.0OregonWillamette ValleyWillamette ValleyPaul Gregutt@paulgwineSweet Cheeks 2012 Vintner's Reserve Wild Child...Pinot NoirSweet Cheeks
    +
    + + + +

    1.

    Who are the most common wine reviewers in the dataset? Create a Series whose index is the taster_twitter_handle category from the dataset, and whose values count how many reviews each person wrote.

    +

    数据集中最常见的酒评人是谁?创建一个 “系列”,其索引是数据集中的 “taster_twitter_handle “类别,其值计算每个人写了多少评论。

    +
    reviews.groupby('taster_twitter_handle')['taster_twitter_handle'].count()
    + + + + +
    taster_twitter_handle
    +@AnneInVino          3685
    +@JoeCz               5147
    +@bkfiona               27
    +@gordone_cellars     4177
    +@kerinokeefe        10776
    +@laurbuzz            1835
    +@mattkettmann        6332
    +@paulgwine           9532
    +@suskostrzewa        1085
    +@vboone              9537
    +@vossroger          25514
    +@wawinereport        4966
    +@wineschach         15134
    +@winewchristina         6
    +@worldwineguys       1005
    +Name: taster_twitter_handle, dtype: int64
    +
    +

    2.

    What is the best wine I can buy for a given amount of money? Create a Series whose index is wine prices and whose values is the maximum number of points a wine costing that much was given in a review. Sort the values by price, ascending (so that 4.0 dollars is at the top and 3300.0 dollars is at the bottom).

    +

    我花多少钱可以买到最好的葡萄酒?创建一个 “系列”,其索引是葡萄酒的价格,其值是该价格的葡萄酒在评论中得到的最高分。按价格升序排序(这样4.0美元在最上面,3300.0美元在最下面)。

    +
    reviews.groupby('price')['points'].max()
    + + + + +
    price
    +4.0       86
    +5.0       87
    +6.0       88
    +7.0       91
    +8.0       91
    +          ..
    +1900.0    98
    +2000.0    97
    +2013.0    91
    +2500.0    96
    +3300.0    88
    +Name: points, Length: 390, dtype: int64
    +
    +

    3.

    What are the minimum and maximum prices for each variety of wine? Create a DataFrame whose index is the variety category from the dataset and whose values are the min and max values thereof.

    +

    每种葡萄酒的最低和最高价格是多少?创建一个DataFrame,其索引为数据集中的variety类别,其值为minmax值。

    +
    price_extremes = reviews.groupby('variety')['price'].agg([min,max])
    price_extremes
    + + + + +
    +

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    minmax
    variety
    Abouriou15.075.0
    Agiorgitiko10.066.0
    Aglianico6.0180.0
    Aidani27.027.0
    Airen8.010.0
    .........
    Zinfandel5.0100.0
    Zlahtina13.016.0
    Zweigelt9.070.0
    Çalkarası19.019.0
    Žilavka15.015.0
    +

    707 rows × 2 columns

    +
    + + + +

    4.

    What are the most expensive wine varieties? Create a variable sorted_varieties containing a copy of the dataframe from the previous question where varieties are sorted in descending order based on minimum price, then on maximum price (to break ties).

    +

    最贵的葡萄酒品种是什么?创建一个变量sorted_varieties,其中包含上一个问题中数据帧的副本,根据最低价格,然后根据最高价格,按降序排列(打破并列关系)。

    +
    price_extremes.sort_values(by=['min', 'max'],ascending=False)
    + + + + +
    +

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    minmax
    variety
    Ramisco495.0495.0
    Terrantez236.0236.0
    Francisa160.0160.0
    Rosenmuskateller150.0150.0
    Tinta Negra Mole112.0112.0
    .........
    RoscettoNaNNaN
    Sauvignon Blanc-Sauvignon GrisNaNNaN
    Tempranillo-MalbecNaNNaN
    VitalNaNNaN
    ZelenNaNNaN
    +

    707 rows × 2 columns

    +
    + + + +

    5.

    Create a Series whose index is reviewers and whose values is the average review score given out by that reviewer. Hint: you will need the taster_name and points columns.

    +

    创建一个 “系列”,其索引为reviewers,其值为该reviewer给出的平均review分数。提示:您将需要taster_namepoints列。

    +
    # reviews.groupby('taster_name')['points'].agg(['mean'])
    reviewer_mean_ratings = reviews.groupby('taster_name').apply(lambda df: df['points'].mean())
    reviewer_mean_ratings
    + + + + +
    taster_name
    +Alexander Peartree    85.855422
    +Anna Lee C. Iijima    88.415629
    +Anne Krebiehl MW      90.562551
    +Carrie Dykes          86.395683
    +Christina Pickard     87.833333
    +Fiona Adams           86.888889
    +Jeff Jenssen          88.319756
    +Jim Gordon            88.626287
    +Joe Czerwinski        88.536235
    +Kerin O’Keefe         88.867947
    +Lauren Buzzeo         87.739510
    +Matt Kettmann         90.008686
    +Michael Schachner     86.907493
    +Mike DeSimone         89.101167
    +Paul Gregutt          89.082564
    +Roger Voss            88.708003
    +Sean P. Sullivan      88.755739
    +Susan Kostrzewa       86.609217
    +Virginie Boone        89.213379
    +dtype: float64
    +
    +

    Are there significant differences in the average scores assigned by the various reviewers? Run the cell below to use the describe() method to see a summary of the range of values.

    +

    不同评论人给出的平均分是否存在明显差异?运行下面的单元格,使用 describe()方法查看数值范围的摘要。

    +
    reviewer_mean_ratings.describe()
    + + + + +
    count    19.000000
    +mean     88.233026
    +std       1.243610
    +min      85.855422
    +25%      87.323501
    +50%      88.536235
    +75%      88.975256
    +max      90.562551
    +dtype: float64
    +
    +

    6.

    What combination of countries and varieties are most common? Create a Series whose index is a MultiIndexof {country, variety} pairs. For example, a pinot noir produced in the US should map to {"US", "Pinot Noir"}. Sort the values in the Series in descending order based on wine count.

    +

    什么国家和品种的组合最常见?创建一个 Series,其索引是{country, variety} 对的 MultiIndex。例如,产自美国的黑比诺应该映射到{"美国", "黑比诺"}。将 Series中的值按照葡萄酒数量降序排序。

    +
    reviews.groupby(['country', 'variety']).size().sort_values(ascending=False)
    # reviews.head()
    + + + + +
    country  variety                 
    +US       Pinot Noir                  9885
    +         Cabernet Sauvignon          7315
    +         Chardonnay                  6801
    +France   Bordeaux-style Red Blend    4725
    +Italy    Red Blend                   3624
    +                                     ... 
    +Mexico   Cinsault                       1
    +         Grenache                       1
    +         Merlot                         1
    +         Rosado                         1
    +Uruguay  White Blend                    1
    +Length: 1612, dtype: int64
    +
    +

    Data Types and Missing Values

    Dtypes

    DataFrame 或 Series 中列的数据类型称为 dtype。

    +

    您可以使用 dtype 属性来获取特定列的类型。例如,我们可以获取评论 DataFrame 中价格列的 dtype:

    +
    import pandas as pd
    reviews = pd.read_csv("datasets/wine/winemag-data-130k-v2.csv", index_col=0)
    + + +
    reviews.price.dtype
    + + + + +
    dtype('float64')
    +
    +

    或者,dtypes 属性返回 DataFrame 中每列的 dtype:

    +
    reviews.dtypes
    + + + + +
    country                   object
    +description               object
    +designation               object
    +points                     int64
    +price                    float64
    +province                  object
    +region_1                  object
    +region_2                  object
    +taster_name               object
    +taster_twitter_handle     object
    +title                     object
    +variety                   object
    +winery                    object
    +dtype: object
    +
    +

    float64 表示使用 64 位浮点数;int64 表示使用类似大小的整数,以此类推。

    +

    需要注意的一个特殊情况是(在这里可以很清楚地看到),完全由字符串组成的列没有自己的类型,而是被赋予了对象类型。

    +

    我们可以使用 astype() 函数将一种类型的列转换为另一种类型,只要这种转换是合理的。例如,我们可以将积分列从现有的 int64 数据类型转换为 float64 数据类型:

    +
    reviews.points.astype('float64')
    + + + + +
    0         87.0
    +1         87.0
    +2         87.0
    +3         87.0
    +4         87.0
    +          ... 
    +129966    90.0
    +129967    90.0
    +129968    90.0
    +129969    90.0
    +129970    90.0
    +Name: points, Length: 129971, dtype: float64
    +
    +

    DataFrame 或 Series 索引也有自己的数据类型:

    +
    reviews.index.dtype
    + + + + +
    dtype('int64')
    +
    +

    Pandas 还支持更奇特的数据类型,例如分类数据和时间序列数据。

    +

    Missing data

    缺失值的输入值为 NaN,即 “Not a Number(非数值)”的缩写。由于技术原因,这些 NaN 值始终是 float64 类型。

    +

    Pandas 提供了一些专门针对缺失数据的方法。要选择 NaN 条目,可以使用 pd.isnull()(或其同伴 pd.notnull())。使用方法如下

    +
    reviews[pd.isnull(reviews.country)]
    + + + + +
    +

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    countrydescriptiondesignationpointspriceprovinceregion_1region_2taster_nametaster_twitter_handletitlevarietywinery
    913NaNAmber in color, this wine has aromas of peach ...Asureti Valley8730.0NaNNaNNaNMike DeSimone@worldwineguysGotsa Family Wines 2014 Asureti Valley ChinuriChinuriGotsa Family Wines
    3131NaNSoft, fruity and juicy, this is a pleasant, si...Partager83NaNNaNNaNNaNRoger Voss@vossrogerBarton & Guestier NV Partager RedRed BlendBarton & Guestier
    4243NaNViolet-red in color, this semisweet wine has a...Red Naturally Semi-Sweet8818.0NaNNaNNaNMike DeSimone@worldwineguysKakhetia Traditional Winemaking 2012 Red Natur...OjaleshiKakhetia Traditional Winemaking
    9509NaNThis mouthwatering blend starts with a nose of...Theopetra Malagouzia-Assyrtiko9228.0NaNNaNNaNSusan Kostrzewa@suskostrzewaTsililis 2015 Theopetra Malagouzia-Assyrtiko W...White BlendTsililis
    9750NaNThis orange-style wine has a cloudy yellow-gol...Orange Nikolaevo Vineyard8928.0NaNNaNNaNJeff Jenssen@worldwineguysRoss-idi 2015 Orange Nikolaevo Vineyard Chardo...ChardonnayRoss-idi
    ..........................................
    124176NaNThis Swiss red blend is composed of four varie...Les Romaines9030.0NaNNaNNaNJeff Jenssen@worldwineguysLes Frères Dutruy 2014 Les Romaines RedRed BlendLes Frères Dutruy
    129407NaNDry spicy aromas of dusty plum and tomato add ...Reserve8922.0NaNNaNNaNMichael Schachner@wineschachEl Capricho 2015 Reserve Cabernet SauvignonCabernet SauvignonEl Capricho
    129408NaNEl Capricho is one of Uruguay's more consisten...Reserve8922.0NaNNaNNaNMichael Schachner@wineschachEl Capricho 2015 Reserve TempranilloTempranilloEl Capricho
    129590NaNA blend of 60% Syrah, 30% Cabernet Sauvignon a...Shah9030.0NaNNaNNaNMike DeSimone@worldwineguysBüyülübağ 2012 Shah RedRed BlendBüyülübağ
    129900NaNThis wine offers a delightful bouquet of black...NaN9132.0NaNNaNNaNMike DeSimone@worldwineguysPsagot 2014 MerlotMerlotPsagot
    +

    63 rows × 13 columns

    +
    + + + +

    替换缺失值是一种常见操作。 Pandas 为这个问题提供了一个非常方便的方法:fillna()。 fillna() 提供了几种不同的策略来减少此类数据。例如,我们可以简单地将每个 NaN 替换为“Unknown”:

    +
    reviews.region_2.fillna("Unknown")
    + + + + +
    0                   Unknown
    +1                   Unknown
    +2         Willamette Valley
    +3                   Unknown
    +4         Willamette Valley
    +                ...        
    +129966              Unknown
    +129967         Oregon Other
    +129968              Unknown
    +129969              Unknown
    +129970              Unknown
    +Name: region_2, Length: 129971, dtype: object
    +
    +

    或者,我们可以使用数据库中给定记录之后某个时间出现的第一个非空值来填充每个缺失值。这称为回填策略。

    +

    或者,我们可能有一个非空值需要替换。例如,假设自本数据集发布以来,评论员 Kerin O’Keefe 已将其 Twitter 手柄从 @kerinokeefe 更改为 @kerino。使用 replace() 方法是在数据集中反映这一情况的方法之一:

    +
    reviews.taster_twitter_handle.replace("@kerinokeefe", "@kerino")
    + + + + +
    0             @kerino
    +1          @vossroger
    +2         @paulgwine 
    +3                 NaN
    +4         @paulgwine 
    +             ...     
    +129966            NaN
    +129967    @paulgwine 
    +129968     @vossroger
    +129969     @vossroger
    +129970     @vossroger
    +Name: taster_twitter_handle, Length: 129971, dtype: object
    +
    +

    这里值得一提的是 Replace() 方法,因为它可以方便地替换丢失的数据,这些数据在数据集中被赋予某种哨兵值:诸如“未知”、“未公开”、“无效”等。

    +

    TEST

    import pandas as pd
    reviews = pd.read_csv("datasets/wine/winemag-data-130k-v2.csv", index_col=0)
    + +

    1.数据集中pionts列的数据类型是什么?

    +
    reviews['points'].dtype
    + + + + +
    dtype('int64')
    +
    +

    2.从points列中的条目创建一个系列,但将条目转换为字符串。提示:字符串在 Python 中是 str

    +
    reviews.points.astype('str')
    + + + + +
    0         87
    +1         87
    +2         87
    +3         87
    +4         87
    +          ..
    +129966    90
    +129967    90
    +129968    90
    +129969    90
    +129970    90
    +Name: points, Length: 129971, dtype: object
    +
    +

    3.有时价格列为空。数据集中有多少评论缺少价格?

    +
    reviews['price'].isnull().sum()
    + + + + +
    8996
    +
    +

    4.最常见的葡萄酒产区有哪些?创建一个Series,计算 region_1 字段中每个值出现的次数。这个字段经常缺少数据,因此用unknown替换缺少的值。按降序排序。输出结果应如下所示:

    +
    Unknown                    21247
    Napa Valley 4480
    ...
    Bardolino Superiore 1
    Primitivo del Tarantino 1
    Name: region_1, Length: 1230, dtype: int64
    + + +
    reviews['region_1'] = reviews['region_1'].fillna("Unknown")
    reviews['region_1'].value_counts()
    + + + + +
    region_1
    +Unknown                    21247
    +Napa Valley                 4480
    +Columbia Valley (WA)        4124
    +Russian River Valley        3091
    +California                  2629
    +                           ...  
    +Lamezia                        1
    +Trentino Superiore             1
    +Grave del Friuli               1
    +Vin Santo di Carmignano        1
    +Paestum                        1
    +Name: count, Length: 1230, dtype: int64
    +
    +

    Renaming and Combining

    Renaming

    我们在这里介绍的第一个函数是 rename(),它允许您更改索引名称和/或列名称。例如,要更改数据集中的分数列以进行评分,我们将执行以下操作:

    +
    import pandas as pd
    reviews = pd.read_csv("datasets/wine/winemag-data-130k-v2.csv", index_col=0)
    + + +
    reviews.rename(columns={'points': 'score'})
    + + + + +
    +

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    countrydescriptiondesignationscorepriceprovinceregion_1region_2taster_nametaster_twitter_handletitlevarietywinery
    0ItalyAromas include tropical fruit, broom, brimston...Vulkà Bianco87NaNSicily & SardiniaEtnaNaNKerin O’Keefe@kerinokeefeNicosia 2013 Vulkà Bianco (Etna)White BlendNicosia
    1PortugalThis is ripe and fruity, a wine that is smooth...Avidagos8715.0DouroNaNNaNRoger Voss@vossrogerQuinta dos Avidagos 2011 Avidagos Red (Douro)Portuguese RedQuinta dos Avidagos
    2USTart and snappy, the flavors of lime flesh and...NaN8714.0OregonWillamette ValleyWillamette ValleyPaul Gregutt@paulgwineRainstorm 2013 Pinot Gris (Willamette Valley)Pinot GrisRainstorm
    3USPineapple rind, lemon pith and orange blossom ...Reserve Late Harvest8713.0MichiganLake Michigan ShoreNaNAlexander PeartreeNaNSt. Julian 2013 Reserve Late Harvest Riesling ...RieslingSt. Julian
    4USMuch like the regular bottling from 2012, this...Vintner's Reserve Wild Child Block8765.0OregonWillamette ValleyWillamette ValleyPaul Gregutt@paulgwineSweet Cheeks 2012 Vintner's Reserve Wild Child...Pinot NoirSweet Cheeks
    ..........................................
    129966GermanyNotes of honeysuckle and cantaloupe sweeten th...Brauneberger Juffer-Sonnenuhr Spätlese9028.0MoselNaNNaNAnna Lee C. IijimaNaNDr. H. Thanisch (Erben Müller-Burggraef) 2013 ...RieslingDr. H. Thanisch (Erben Müller-Burggraef)
    129967USCitation is given as much as a decade of bottl...NaN9075.0OregonOregonOregon OtherPaul Gregutt@paulgwineCitation 2004 Pinot Noir (Oregon)Pinot NoirCitation
    129968FranceWell-drained gravel soil gives this wine its c...Kritt9030.0AlsaceAlsaceNaNRoger Voss@vossrogerDomaine Gresser 2013 Kritt Gewurztraminer (Als...GewürztraminerDomaine Gresser
    129969FranceA dry style of Pinot Gris, this is crisp with ...NaN9032.0AlsaceAlsaceNaNRoger Voss@vossrogerDomaine Marcel Deiss 2012 Pinot Gris (Alsace)Pinot GrisDomaine Marcel Deiss
    129970FranceBig, rich and off-dry, this is powered by inte...Lieu-dit Harth Cuvée Caroline9021.0AlsaceAlsaceNaNRoger Voss@vossrogerDomaine Schoffit 2012 Lieu-dit Harth Cuvée Car...GewürztraminerDomaine Schoffit
    +

    129971 rows × 13 columns

    +
    + + + +

    rename()可以让你通过分别指定索引或列关键字参数来重命名索引或列值。它支持多种输入格式,但通常 Python 字典是最方便的。下面是一个使用它重命名索引中某些元素的示例。

    +
    reviews.rename(index={0: 'firstEntry', 1: 'secondEntry'})
    + + + + +
    +

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    countrydescriptiondesignationpointspriceprovinceregion_1region_2taster_nametaster_twitter_handletitlevarietywinery
    firstEntryItalyAromas include tropical fruit, broom, brimston...Vulkà Bianco87NaNSicily & SardiniaEtnaNaNKerin O’Keefe@kerinokeefeNicosia 2013 Vulkà Bianco (Etna)White BlendNicosia
    secondEntryPortugalThis is ripe and fruity, a wine that is smooth...Avidagos8715.0DouroNaNNaNRoger Voss@vossrogerQuinta dos Avidagos 2011 Avidagos Red (Douro)Portuguese RedQuinta dos Avidagos
    2USTart and snappy, the flavors of lime flesh and...NaN8714.0OregonWillamette ValleyWillamette ValleyPaul Gregutt@paulgwineRainstorm 2013 Pinot Gris (Willamette Valley)Pinot GrisRainstorm
    3USPineapple rind, lemon pith and orange blossom ...Reserve Late Harvest8713.0MichiganLake Michigan ShoreNaNAlexander PeartreeNaNSt. Julian 2013 Reserve Late Harvest Riesling ...RieslingSt. Julian
    4USMuch like the regular bottling from 2012, this...Vintner's Reserve Wild Child Block8765.0OregonWillamette ValleyWillamette ValleyPaul Gregutt@paulgwineSweet Cheeks 2012 Vintner's Reserve Wild Child...Pinot NoirSweet Cheeks
    ..........................................
    129966GermanyNotes of honeysuckle and cantaloupe sweeten th...Brauneberger Juffer-Sonnenuhr Spätlese9028.0MoselNaNNaNAnna Lee C. IijimaNaNDr. H. Thanisch (Erben Müller-Burggraef) 2013 ...RieslingDr. H. Thanisch (Erben Müller-Burggraef)
    129967USCitation is given as much as a decade of bottl...NaN9075.0OregonOregonOregon OtherPaul Gregutt@paulgwineCitation 2004 Pinot Noir (Oregon)Pinot NoirCitation
    129968FranceWell-drained gravel soil gives this wine its c...Kritt9030.0AlsaceAlsaceNaNRoger Voss@vossrogerDomaine Gresser 2013 Kritt Gewurztraminer (Als...GewürztraminerDomaine Gresser
    129969FranceA dry style of Pinot Gris, this is crisp with ...NaN9032.0AlsaceAlsaceNaNRoger Voss@vossrogerDomaine Marcel Deiss 2012 Pinot Gris (Alsace)Pinot GrisDomaine Marcel Deiss
    129970FranceBig, rich and off-dry, this is powered by inte...Lieu-dit Harth Cuvée Caroline9021.0AlsaceAlsaceNaNRoger Voss@vossrogerDomaine Schoffit 2012 Lieu-dit Harth Cuvée Car...GewürztraminerDomaine Schoffit
    +

    129971 rows × 13 columns

    +
    + + + +

    你可能会经常重命名列,但很少重命名索引值。为此,set_index() 通常更方便。

    +

    行索引和列索引都可以有自己的名称属性。可以使用赠送的 rename_axis() 方法来更改这些名称。例如

    +
    reviews.rename_axis("wines", axis='rows').rename_axis("fields", axis='columns')
    + + + + +
    +

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    fieldscountrydescriptiondesignationpointspriceprovinceregion_1region_2taster_nametaster_twitter_handletitlevarietywinery
    wines
    0ItalyAromas include tropical fruit, broom, brimston...Vulkà Bianco87NaNSicily & SardiniaEtnaNaNKerin O’Keefe@kerinokeefeNicosia 2013 Vulkà Bianco (Etna)White BlendNicosia
    1PortugalThis is ripe and fruity, a wine that is smooth...Avidagos8715.0DouroNaNNaNRoger Voss@vossrogerQuinta dos Avidagos 2011 Avidagos Red (Douro)Portuguese RedQuinta dos Avidagos
    2USTart and snappy, the flavors of lime flesh and...NaN8714.0OregonWillamette ValleyWillamette ValleyPaul Gregutt@paulgwineRainstorm 2013 Pinot Gris (Willamette Valley)Pinot GrisRainstorm
    3USPineapple rind, lemon pith and orange blossom ...Reserve Late Harvest8713.0MichiganLake Michigan ShoreNaNAlexander PeartreeNaNSt. Julian 2013 Reserve Late Harvest Riesling ...RieslingSt. Julian
    4USMuch like the regular bottling from 2012, this...Vintner's Reserve Wild Child Block8765.0OregonWillamette ValleyWillamette ValleyPaul Gregutt@paulgwineSweet Cheeks 2012 Vintner's Reserve Wild Child...Pinot NoirSweet Cheeks
    ..........................................
    129966GermanyNotes of honeysuckle and cantaloupe sweeten th...Brauneberger Juffer-Sonnenuhr Spätlese9028.0MoselNaNNaNAnna Lee C. IijimaNaNDr. H. Thanisch (Erben Müller-Burggraef) 2013 ...RieslingDr. H. Thanisch (Erben Müller-Burggraef)
    129967USCitation is given as much as a decade of bottl...NaN9075.0OregonOregonOregon OtherPaul Gregutt@paulgwineCitation 2004 Pinot Noir (Oregon)Pinot NoirCitation
    129968FranceWell-drained gravel soil gives this wine its c...Kritt9030.0AlsaceAlsaceNaNRoger Voss@vossrogerDomaine Gresser 2013 Kritt Gewurztraminer (Als...GewürztraminerDomaine Gresser
    129969FranceA dry style of Pinot Gris, this is crisp with ...NaN9032.0AlsaceAlsaceNaNRoger Voss@vossrogerDomaine Marcel Deiss 2012 Pinot Gris (Alsace)Pinot GrisDomaine Marcel Deiss
    129970FranceBig, rich and off-dry, this is powered by inte...Lieu-dit Harth Cuvée Caroline9021.0AlsaceAlsaceNaNRoger Voss@vossrogerDomaine Schoffit 2012 Lieu-dit Harth Cuvée Car...GewürztraminerDomaine Schoffit
    +

    129971 rows × 13 columns

    +
    + + + +

    Combining

    在对数据集执行操作时,我们有时需要将不同的 DataFrames 和/或 Series 以非同寻常的方式组合起来。Pandas 有三种核心方法可以实现这一目的。按照复杂程度递增的顺序,它们是 concat()join()merge()merge() 的大部分功能也可以通过 join() 更简单地实现。

    +

    最简单的合并方法是 concat()。如果给定一个元素列表,该函数会将这些元素沿着一个轴挤在一起。

    +

    当我们在不同的 DataFrame 或 Series 对象中拥有相同字段(列)的数据时,这种方法非常有用。例如:YouTube 视频数据集根据来源国(例如本例中的加拿大和英国)对数据进行了分割。如果我们想同时研究多个国家,可以使用 concat() 将它们合并在一起:

    +
    canadian_youtube = pd.read_csv("datasets/Trending_YouTube_Video_Statistics/CAvideos.csv")
    british_youtube = pd.read_csv("datasets/Trending_YouTube_Video_Statistics/GBvideos.csv")

    pd.concat([canadian_youtube,british_youtube])
    + + + + +
    +

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    video_idtrending_datetitlechannel_titlecategory_idpublish_timetagsviewslikesdislikescomment_countthumbnail_linkcomments_disabledratings_disabledvideo_error_or_removeddescription
    0n1WpP7iowLc17.14.11Eminem - Walk On Water (Audio) ft. BeyoncéEminemVEVO102017-11-10T17:00:03.000ZEminem|"Walk"|"On"|"Water"|"Aftermath/Shady/In...1715857978742543420125882https://i.ytimg.com/vi/n1WpP7iowLc/default.jpgFalseFalseFalseEminem's new track Walk on Water ft. Beyoncé i...
    10dBIkQ4Mz1M17.14.11PLUSH - Bad Unboxing Fan MailiDubbbzTV232017-11-13T17:00:00.000Zplush|"bad unboxing"|"unboxing"|"fan mail"|"id...1014651127794168813030https://i.ytimg.com/vi/0dBIkQ4Mz1M/default.jpgFalseFalseFalseSTill got a lot of packages. Probably will las...
    25qpjK5DgCt417.14.11Racist Superman | Rudy Mancuso, King Bach & Le...Rudy Mancuso232017-11-12T19:05:24.000Zracist superman|"rudy"|"mancuso"|"king"|"bach"...319143414603553398181https://i.ytimg.com/vi/5qpjK5DgCt4/default.jpgFalseFalseFalseWATCH MY PREVIOUS VIDEO ▶ \n\nSUBSCRIBE ► http...
    3d380meD0W0M17.14.11I Dare You: GOING BALD!?nigahiga242017-11-12T18:01:41.000Zryan|"higa"|"higatv"|"nigahiga"|"i dare you"|"...2095828132239198917518https://i.ytimg.com/vi/d380meD0W0M/default.jpgFalseFalseFalseI know it's been a while since we did this sho...
    42Vv-BfVoq4g17.14.11Ed Sheeran - Perfect (Official Music Video)Ed Sheeran102017-11-09T11:04:14.000Zedsheeran|"ed sheeran"|"acoustic"|"live"|"cove...3352362216341302108285067https://i.ytimg.com/vi/2Vv-BfVoq4g/default.jpgFalseFalseFalse🎧: https://ad.gt/yt-perfect\n💰: https://atlant...
    ...................................................
    38911l884wKofd5418.14.06Enrique Iglesias - MOVE TO MIAMI (Official Vid...EnriqueIglesiasVEVO102018-05-09T07:00:01.000ZEnrique Iglesias feat. Pitbull|"MOVE TO MIAMI"...25066952268088127839933https://i.ytimg.com/vi/l884wKofd54/default.jpgFalseFalseFalseNEW SONG - MOVE TO MIAMI feat. Pitbull (Click ...
    38912IP8k2xkhOdI18.14.06Jacob Sartorius - Up With It (Official Music V...Jacob Sartorius102018-05-11T17:09:16.000Zjacob sartorius|"jacob"|"up with it"|"jacob sa...1492219619981378124330https://i.ytimg.com/vi/IP8k2xkhOdI/default.jpgFalseFalseFalseTHE OFFICIAL UP WITH IT MUSIC VIDEO!Get my new...
    38913Il-an3K9pjg18.14.06Anne-Marie - 2002 [Official Video]Anne-Marie102018-05-08T11:05:08.000Zanne|"marie"|"anne-marie"|"2002"|"two thousand...29641412394830889219988https://i.ytimg.com/vi/Il-an3K9pjg/default.jpgFalseFalseFalseGet 2002 by Anne-Marie HERE ▶ http://ad.gt/200...
    38914-DRsfNObKIQ18.14.06Eleni Foureira - Fuego - Cyprus - LIVE - First...Eurovision Song Contest242018-05-08T20:32:32.000ZEurovision Song Contest|"2018"|"Lisbon"|"Cypru...143175151518704587526766https://i.ytimg.com/vi/-DRsfNObKIQ/default.jpgFalseFalseFalseEleni Foureira represented Cyprus at the first...
    389154YFo4bdMO8Q18.14.06KYLE - Ikuyo feat. 2 Chainz & Sophia Black [A...SuperDuperKyle102018-05-11T04:06:35.000ZKyle|"SuperDuperKyle"|"Ikuyo"|"2 Chainz"|"Soph...607552182712741423https://i.ytimg.com/vi/4YFo4bdMO8Q/default.jpgFalseFalseFalseDebut album 'Light of Mine' out now: http://ky...
    +

    79797 rows × 16 columns

    +
    + + + +

    join()可让您组合具有共同索引的不同 DataFrame 对象。例如,要提取加拿大和英国同一天流行的视频,我们可以执行以下操作:

    +
    left = canadian_youtube.set_index(['title', 'trending_date'])
    right = british_youtube.set_index(['title', 'trending_date'])

    left.join(right, lsuffix='_CAN', rsuffix='_UK')
    + + + + +
    +

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    video_id_CANchannel_title_CANcategory_id_CANpublish_time_CANtags_CANviews_CANlikes_CANdislikes_CANcomment_count_CANthumbnail_link_CAN...tags_UKviews_UKlikes_UKdislikes_UKcomment_count_UKthumbnail_link_UKcomments_disabled_UKratings_disabled_UKvideo_error_or_removed_UKdescription_UK
    titletrending_date
    !! THIS VIDEO IS NOTHING BUT PAIN !! | Getting Over It - Part 718.04.01PNn8sECd7ioMarkiplier202018-01-03T19:33:53.000Zgetting over it|"markiplier"|"funny moments"|"...8359304705810238250https://i.ytimg.com/vi/PNn8sECd7io/default.jpg...NaNNaNNaNNaNNaNNaNNaNNaNNaNNaN
    #1 Fortnite World Rank - 2,323 Solo Wins!18.09.03DvPW66IFhMIAlexRamiGaming202018-03-09T07:15:52.000ZPS4 Battle Royale|"PS4 Pro Battle Royale"|"Bat...212838519954211https://i.ytimg.com/vi/DvPW66IFhMI/default.jpg...NaNNaNNaNNaNNaNNaNNaNNaNNaNNaN
    #1 Fortnite World Rank - 2,330 Solo Wins!18.10.03EXEaMjFeiEkAlexRamiGaming202018-03-10T06:26:17.000ZPS4 Battle Royale|"PS4 Pro Battle Royale"|"Bat...200764562053745https://i.ytimg.com/vi/EXEaMjFeiEk/default.jpg...NaNNaNNaNNaNNaNNaNNaNNaNNaNNaN
    #1 MOST ANTICIPATED VIDEO (Timber Frame House Raising)17.20.12bYvQmusLaxwPure Living for Life242017-12-20T02:49:11.000Ztimber frame|"timber framing"|"timber frame ra...7915277611591965https://i.ytimg.com/vi/bYvQmusLaxw/default.jpg...NaNNaNNaNNaNNaNNaNNaNNaNNaNNaN
    17.21.12bYvQmusLaxwPure Living for Life242017-12-20T02:49:11.000Ztimber frame|"timber framing"|"timber frame ra...232762155153293601https://i.ytimg.com/vi/bYvQmusLaxw/default.jpg...NaNNaNNaNNaNNaNNaNNaNNaNNaNNaN
    .....................................................................
    😲She Is So Nervous But BLOWS The ROOF After Taking on OPERA Song! | Britain´s Got Talent 201818.02.05WttN1Z0XF4kHow Talented242018-04-28T19:40:58.000Zbgt|"bgt 2018"|"britain got talent"|"britain´s...7134004684260266https://i.ytimg.com/vi/WttN1Z0XF4k/default.jpg...NaNNaNNaNNaNNaNNaNNaNNaNNaNNaN
    18.29.04WttN1Z0XF4kHow Talented242018-04-28T19:40:58.000Zbgt|"bgt 2018"|"britain got talent"|"britain´s...231906192478146https://i.ytimg.com/vi/WttN1Z0XF4k/default.jpg...NaNNaNNaNNaNNaNNaNNaNNaNNaNNaN
    18.30.04WttN1Z0XF4kHow Talented242018-04-28T19:40:58.000Zbgt|"bgt 2018"|"britain got talent"|"britain´s...4762533417176240https://i.ytimg.com/vi/WttN1Z0XF4k/default.jpg...NaNNaNNaNNaNNaNNaNNaNNaNNaNNaN
    🚨 BREAKING NEWS 🔴 Raja Live all Slot Channels Welcome 🎰18.07.05Wt9Gkpmbt44TheBigJackpot242018-05-07T06:58:59.000ZSlot Machine|"win"|"Gambling"|"Big Win"|"raja"...28973216717510https://i.ytimg.com/vi/Wt9Gkpmbt44/default.jpg...NaNNaNNaNNaNNaNNaNNaNNaNNaNNaN
    🚨Active Shooter at YouTube Headquarters - LIVE BREAKING NEWS COVERAGE18.04.04Az72jrKbANARight Side Broadcasting Network252018-04-03T23:12:37.000ZYouTube shooter|"YouTube active shooter"|"acti...103513172218176https://i.ytimg.com/vi/Az72jrKbANA/default.jpg...NaNNaNNaNNaNNaNNaNNaNNaNNaNNaN
    +

    40900 rows × 28 columns

    +
    + + + +

    此处 lsuffixrsuffix 参数是必需的,因为数据在英国和加拿大数据集中具有相同的列名称。如果这不是真的(因为,比如说,我们事先重命名了它们),我们就不需要它们。

    +

    TEST

    import pandas as pd
    reviews = pd.read_csv("datasets/wine/winemag-data-130k-v2.csv", index_col=0)
    + + +
    reviews.head()
    + + + + +
    +

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    countrydescriptiondesignationpointspriceprovinceregion_1region_2taster_nametaster_twitter_handletitlevarietywinery
    0ItalyAromas include tropical fruit, broom, brimston...Vulkà Bianco87NaNSicily & SardiniaEtnaNaNKerin O’Keefe@kerinokeefeNicosia 2013 Vulkà Bianco (Etna)White BlendNicosia
    1PortugalThis is ripe and fruity, a wine that is smooth...Avidagos8715.0DouroNaNNaNRoger Voss@vossrogerQuinta dos Avidagos 2011 Avidagos Red (Douro)Portuguese RedQuinta dos Avidagos
    2USTart and snappy, the flavors of lime flesh and...NaN8714.0OregonWillamette ValleyWillamette ValleyPaul Gregutt@paulgwineRainstorm 2013 Pinot Gris (Willamette Valley)Pinot GrisRainstorm
    3USPineapple rind, lemon pith and orange blossom ...Reserve Late Harvest8713.0MichiganLake Michigan ShoreNaNAlexander PeartreeNaNSt. Julian 2013 Reserve Late Harvest Riesling ...RieslingSt. Julian
    4USMuch like the regular bottling from 2012, this...Vintner's Reserve Wild Child Block8765.0OregonWillamette ValleyWillamette ValleyPaul Gregutt@paulgwineSweet Cheeks 2012 Vintner's Reserve Wild Child...Pinot NoirSweet Cheeks
    +
    + + + +

    1.Region_1Region_2 是数据集中区域设置列的非常无信息的名称。创建reviews副本,并将这些列分别重命名为regionlocale

    +
    reviews.rename(columns={'region_1': 'region','region_2':'locale'})
    + + + + +
    +

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    countrydescriptiondesignationpointspriceprovinceregionlocaletaster_nametaster_twitter_handletitlevarietywinery
    0ItalyAromas include tropical fruit, broom, brimston...Vulkà Bianco87NaNSicily & SardiniaEtnaNaNKerin O’Keefe@kerinokeefeNicosia 2013 Vulkà Bianco (Etna)White BlendNicosia
    1PortugalThis is ripe and fruity, a wine that is smooth...Avidagos8715.0DouroNaNNaNRoger Voss@vossrogerQuinta dos Avidagos 2011 Avidagos Red (Douro)Portuguese RedQuinta dos Avidagos
    2USTart and snappy, the flavors of lime flesh and...NaN8714.0OregonWillamette ValleyWillamette ValleyPaul Gregutt@paulgwineRainstorm 2013 Pinot Gris (Willamette Valley)Pinot GrisRainstorm
    3USPineapple rind, lemon pith and orange blossom ...Reserve Late Harvest8713.0MichiganLake Michigan ShoreNaNAlexander PeartreeNaNSt. Julian 2013 Reserve Late Harvest Riesling ...RieslingSt. Julian
    4USMuch like the regular bottling from 2012, this...Vintner's Reserve Wild Child Block8765.0OregonWillamette ValleyWillamette ValleyPaul Gregutt@paulgwineSweet Cheeks 2012 Vintner's Reserve Wild Child...Pinot NoirSweet Cheeks
    ..........................................
    129966GermanyNotes of honeysuckle and cantaloupe sweeten th...Brauneberger Juffer-Sonnenuhr Spätlese9028.0MoselNaNNaNAnna Lee C. IijimaNaNDr. H. Thanisch (Erben Müller-Burggraef) 2013 ...RieslingDr. H. Thanisch (Erben Müller-Burggraef)
    129967USCitation is given as much as a decade of bottl...NaN9075.0OregonOregonOregon OtherPaul Gregutt@paulgwineCitation 2004 Pinot Noir (Oregon)Pinot NoirCitation
    129968FranceWell-drained gravel soil gives this wine its c...Kritt9030.0AlsaceAlsaceNaNRoger Voss@vossrogerDomaine Gresser 2013 Kritt Gewurztraminer (Als...GewürztraminerDomaine Gresser
    129969FranceA dry style of Pinot Gris, this is crisp with ...NaN9032.0AlsaceAlsaceNaNRoger Voss@vossrogerDomaine Marcel Deiss 2012 Pinot Gris (Alsace)Pinot GrisDomaine Marcel Deiss
    129970FranceBig, rich and off-dry, this is powered by inte...Lieu-dit Harth Cuvée Caroline9021.0AlsaceAlsaceNaNRoger Voss@vossrogerDomaine Schoffit 2012 Lieu-dit Harth Cuvée Car...GewürztraminerDomaine Schoffit
    +

    129971 rows × 13 columns

    +
    + + + +

    2.将数据集中的索引名称设置为 wines

    +
    reviews.rename_axis("wines", axis='columns')
    + + + + +
    +

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    winescountrydescriptiondesignationpointspriceprovinceregion_1region_2taster_nametaster_twitter_handletitlevarietywinery
    0ItalyAromas include tropical fruit, broom, brimston...Vulkà Bianco87NaNSicily & SardiniaEtnaNaNKerin O’Keefe@kerinokeefeNicosia 2013 Vulkà Bianco (Etna)White BlendNicosia
    1PortugalThis is ripe and fruity, a wine that is smooth...Avidagos8715.0DouroNaNNaNRoger Voss@vossrogerQuinta dos Avidagos 2011 Avidagos Red (Douro)Portuguese RedQuinta dos Avidagos
    2USTart and snappy, the flavors of lime flesh and...NaN8714.0OregonWillamette ValleyWillamette ValleyPaul Gregutt@paulgwineRainstorm 2013 Pinot Gris (Willamette Valley)Pinot GrisRainstorm
    3USPineapple rind, lemon pith and orange blossom ...Reserve Late Harvest8713.0MichiganLake Michigan ShoreNaNAlexander PeartreeNaNSt. Julian 2013 Reserve Late Harvest Riesling ...RieslingSt. Julian
    4USMuch like the regular bottling from 2012, this...Vintner's Reserve Wild Child Block8765.0OregonWillamette ValleyWillamette ValleyPaul Gregutt@paulgwineSweet Cheeks 2012 Vintner's Reserve Wild Child...Pinot NoirSweet Cheeks
    ..........................................
    129966GermanyNotes of honeysuckle and cantaloupe sweeten th...Brauneberger Juffer-Sonnenuhr Spätlese9028.0MoselNaNNaNAnna Lee C. IijimaNaNDr. H. Thanisch (Erben Müller-Burggraef) 2013 ...RieslingDr. H. Thanisch (Erben Müller-Burggraef)
    129967USCitation is given as much as a decade of bottl...NaN9075.0OregonOregonOregon OtherPaul Gregutt@paulgwineCitation 2004 Pinot Noir (Oregon)Pinot NoirCitation
    129968FranceWell-drained gravel soil gives this wine its c...Kritt9030.0AlsaceAlsaceNaNRoger Voss@vossrogerDomaine Gresser 2013 Kritt Gewurztraminer (Als...GewürztraminerDomaine Gresser
    129969FranceA dry style of Pinot Gris, this is crisp with ...NaN9032.0AlsaceAlsaceNaNRoger Voss@vossrogerDomaine Marcel Deiss 2012 Pinot Gris (Alsace)Pinot GrisDomaine Marcel Deiss
    129970FranceBig, rich and off-dry, this is powered by inte...Lieu-dit Harth Cuvée Caroline9021.0AlsaceAlsaceNaNRoger Voss@vossrogerDomaine Schoffit 2012 Lieu-dit Harth Cuvée Car...GewürztraminerDomaine Schoffit
    +

    129971 rows × 13 columns

    +
    + + + +

    3.Things on Reddit 数据集包含了来自 reddit.com 上部分排名靠前的论坛(”subreddits”)的产品链接。运行下面的单元格,加载在 /r/gaming 子论坛上提到的产品的数据框,以及在 r//movies 子论坛上提到的产品的数据框。

    +
    gaming_products = pd.read_csv("datasets/top-things/reddits/g/gaming.csv")
    gaming_products['subreddit'] = "r/gaming"
    movie_products = pd.read_csv("datasets/top-things/reddits/m/movies.csv")
    movie_products['subreddit'] = "r/movies"
    + +

    创建一个包含 Reddit 子版块中提到的产品(either subreddit)的 DataFrame

    +
    gaming_products.head()
    + + + + +
    +

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    namecategoryamazon_linktotal_mentionssubreddit_mentionssubreddit
    0BOOMco Halo Covenant Needler BlasterToys & Gameshttps://www.amazon.com/BOOMco-Halo-Covenant-Ne...4.04r/gaming
    1Raspberry PI 3 Model B 1.2GHz 64-bit quad-core...Electronicshttps://www.amazon.com/Raspberry-Model-A1-2GHz...19.03r/gaming
    2CanaKit 5V 2.5A Raspberry Pi 3 Power Supply / ...Electronicshttps://www.amazon.com/CanaKit-Raspberry-Suppl...7.03r/gaming
    3Panasonic K-KJ17MCA4BA Advanced Individual Cel...Electronicshttps://www.amazon.com/Panasonic-Advanced-Indi...29.02r/gaming
    4Mayflash GameCube Controller Adapter for Wii U...Electronicshttps://www.amazon.com/GameCube-Controller-Ada...24.02r/gaming
    +
    + + + + +
    pd.concat([gaming_products,movie_products])
    + + + + +
    +

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    namecategoryamazon_linktotal_mentionssubreddit_mentionssubreddit
    0BOOMco Halo Covenant Needler BlasterToys & Gameshttps://www.amazon.com/BOOMco-Halo-Covenant-Ne...4.04r/gaming
    1Raspberry PI 3 Model B 1.2GHz 64-bit quad-core...Electronicshttps://www.amazon.com/Raspberry-Model-A1-2GHz...19.03r/gaming
    2CanaKit 5V 2.5A Raspberry Pi 3 Power Supply / ...Electronicshttps://www.amazon.com/CanaKit-Raspberry-Suppl...7.03r/gaming
    3Panasonic K-KJ17MCA4BA Advanced Individual Cel...Electronicshttps://www.amazon.com/Panasonic-Advanced-Indi...29.02r/gaming
    4Mayflash GameCube Controller Adapter for Wii U...Electronicshttps://www.amazon.com/GameCube-Controller-Ada...24.02r/gaming
    .....................
    298Welcome to Night Vale CD: A NovelBookshttps://www.amazon.com/Welcome-Night-Vale-CD-N...1.01r/movies
    299Ran (StudioCanal Collection) [Blu-ray]Movies & TVhttps://www.amazon.com/StudioCanal-Collection-...1.01r/movies
    300The Art of John AlvinBookshttps://www.amazon.com/Art-John-Alvin-Andrea/d...1.01r/movies
    301Apocalypto [Blu-ray]Movies & TVhttps://www.amazon.com/Apocalypto-Blu-ray-Rudy...1.01r/movies
    302Cinelinx: A Card Game for People Who Love Movi...Toys & Gameshttps://www.amazon.com/Cinelinx-Card-Game-Peop...1.01r/movies
    +

    796 rows × 6 columns

    +
    + + + +

    4.Kaggle 上的举重数据库数据集包括一张用于举重比赛的 CSV 表和一张单独的举重参赛者表。运行下面的单元格将这些数据集加载到数据框中:

    +
    powerlifting_meets = pd.read_csv("datasets/openpowerlifting/v1/meets.csv")
    powerlifting_competitors = pd.read_csv("datasets/openpowerlifting/v1/openpowerlifting.csv")
    + + +
    powerlifting_competitors
    + + + + +
    +

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    MeetIDNameSexEquipmentAgeDivisionBodyweightKgWeightClassKgSquat4KgBestSquatKgBench4KgBestBenchKgDeadlift4KgBestDeadliftKgTotalKgPlaceWilks
    00Angie Belk TerryFWraps47.0Mst 45-4959.6060NaN47.63NaN20.41NaN70.31138.351155.05
    10Dawn BogartFSingle-ply42.0Mst 40-4458.5160NaN142.88NaN95.25NaN163.29401.421456.38
    20Dawn BogartFSingle-ply42.0Open Senior58.5160NaN142.88NaN95.25NaN163.29401.421456.38
    30Dawn BogartFRaw42.0Open Senior58.5160NaNNaNNaN95.25NaNNaN95.251108.29
    40Destiny DulaFRaw18.0Teen 18-1963.6867.5NaNNaNNaN31.75NaN90.72122.471130.47
    ......................................................
    3864098481William BarabasMMulti-plyNaNElite113.58125NaNNaNNaNNaNNaN347.50347.502202.60
    3864108481Justin ZottlMMulti-plyNaNElite119.02125NaNNaNNaNNaNNaN322.50322.503185.77
    3864118481Jake AndersonMMulti-plyNaNElite120.29125NaNNaNNaNNaNNaN367.50367.501211.17
    3864128481Jeff BumanglagMMulti-plyNaNElite126.73140NaNNaNNaNNaNNaN320.00320.003181.85
    3864138481Shane HammockMMulti-plyNaNElite129.46140NaNNaNNaNNaNNaN362.50362.502205.18
    +

    386414 rows × 17 columns

    +
    + + + +

    两个表都包含对 MeetID 的引用,MeetID 是数据库中包含的每次会议(竞赛)的唯一键。使用它,生成一个将两个表合并为一个的数据集。

    +
    left = powerlifting_meets.set_index(['MeetID'])
    right = powerlifting_competitors.set_index(['MeetID'])
    left.join(right)
    # powerlifting_meets.join(powerlifting_competitors)
    + + + + +
    +

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    MeetPathFederationDateMeetCountryMeetStateMeetTownMeetNameNameSexEquipment...WeightClassKgSquat4KgBestSquatKgBench4KgBestBenchKgDeadlift4KgBestDeadliftKgTotalKgPlaceWilks
    MeetID
    0365strong/1601365Strong2016-10-29USANCCharlotte2016 Junior & Senior National Powerlifting Cha...Angie Belk TerryFWraps...60NaN47.63NaN20.41NaN70.31138.351155.05
    0365strong/1601365Strong2016-10-29USANCCharlotte2016 Junior & Senior National Powerlifting Cha...Dawn BogartFSingle-ply...60NaN142.88NaN95.25NaN163.29401.421456.38
    0365strong/1601365Strong2016-10-29USANCCharlotte2016 Junior & Senior National Powerlifting Cha...Dawn BogartFSingle-ply...60NaN142.88NaN95.25NaN163.29401.421456.38
    0365strong/1601365Strong2016-10-29USANCCharlotte2016 Junior & Senior National Powerlifting Cha...Dawn BogartFRaw...60NaNNaNNaN95.25NaNNaN95.251108.29
    0365strong/1601365Strong2016-10-29USANCCharlotte2016 Junior & Senior National Powerlifting Cha...Destiny DulaFRaw...67.5NaNNaNNaN31.75NaN90.72122.471130.47
    ..................................................................
    8481xpc/2017-finalsXPC2017-03-03USAOHColumbus2017 XPC FinalsWilliam BarabasMMulti-ply...125NaNNaNNaNNaNNaN347.50347.502202.60
    8481xpc/2017-finalsXPC2017-03-03USAOHColumbus2017 XPC FinalsJustin ZottlMMulti-ply...125NaNNaNNaNNaNNaN322.50322.503185.77
    8481xpc/2017-finalsXPC2017-03-03USAOHColumbus2017 XPC FinalsJake AndersonMMulti-ply...125NaNNaNNaNNaNNaN367.50367.501211.17
    8481xpc/2017-finalsXPC2017-03-03USAOHColumbus2017 XPC FinalsJeff BumanglagMMulti-ply...140NaNNaNNaNNaNNaN320.00320.003181.85
    8481xpc/2017-finalsXPC2017-03-03USAOHColumbus2017 XPC FinalsShane HammockMMulti-ply...140NaNNaNNaNNaNNaN362.50362.502205.18
    +

    386414 rows × 23 columns

    +
    + + + +

    完成

    +

    + +
    +

    test for vue

    +

    aaaaaaa

    + + + + +
    +

    + +
    + + + +

    sssssss

    ]]>
    + + python + + + python + pandas + kaggle + +
    + + 等离子体物理_pyk + /2023/05/24/%E7%AD%89%E7%A6%BB%E5%AD%90%E4%BD%93%E7%89%A9%E7%90%86-pyk/ + 麦克斯韦方程组

    一般形式

    +

    +

    对(2.2.2)两边求散度(左乘拉普拉斯算子),再联立(2.2.3)就可以推出电荷守恒方程(2.2.5)

    +

    洛伦兹力定律

    F = q(E+v x B)

    +

    v是粒子速度

    +

    B= u0 ·H 是磁感应强度矢量

    +

    玻尔兹曼方程

    引入一个六位相空间(r,v)中的分布函数f(r,v,t),r代表位置,t代表速度。

    +

    可以得到无碰撞玻尔兹曼方程,或弗拉索夫(Vlasov)方程

    +

    2.3.2

    +

    +

    对其两边加上碰撞项,就得到玻尔兹曼方程

    +

    2.3.3

    +

    宏观量

    粒子密度

    +

    2.3.4

    +

    粒子通量

    +

    2.3.5

    +

    单位体积内粒子的动能

    +

    2.3.6

    +

    动量守恒方程&能量守恒方程

    对玻尔兹曼方程两端成v,然后对速度积分,就是动量守恒方程

    +

    2.3.9

    +

    其常见表达式为

    +

    2.3.15

    +

    对玻尔兹曼方程两端同乘1/2mv^2,并对速度积分,能得到能量守恒方程

    +

    2.3.21

    +

    麦克斯韦分布

    在没有空间梯度和加速度项的稳态情况下,玻尔兹曼方程简化为

    +

    2.4.1

    +

    c代表同种粒子之间的碰撞,其解为一个有高斯形式的速度分布函数f(v)

    +

    2.4.2

    +

    最终可以解出C和ξ可以得到

    +

    2.4.7

    +

    等离子体在均匀场中的运动

    回旋频率

    回旋半径

    ExB漂移

    电磁波

    静电波

    介电张量

    波的色散关系

    磁化等离子体中的波

    包括离子运动的磁化等离子体基本波的色散关系曲线

    +

    IV曲线

    chatGPT

    我们可以利用IV曲线上的斜率来计算等离子体密度。在低压下,当电流随电压增加呈指数增长时,IV曲线上的斜率与等离子体密度成正比。因此,我们可以使用以下公式来计算等离子体密度:

    +

    n_e = (I_s/2πrLqA) * [(dV/dI) / V_p]

    +

    其中,n_e 表示等离子体密度;I_s 表示饱和电流;r 是探针半径;L 是探针长度;q 是电子电量;A 是探针截面积;dV/dI 是IV曲线的斜率;V_p 是等离子体的诱导电压。

    +

    需要注意的是,这种方法只能用于计算等离子体密度的数量级,而无法得到精确值。同时,由于该方法对实验条件要求较高,可能存在误差。

    +

    对于弱等离子体(即电离度较低),可以使用Langmuir剖面计算等离子体密度:
    n_e = (I_sat / A) * ((4ε_0me)/(e^2π^2))^(1/2)

    +

    其中,n_e表示等离子体密度;I_sat表示探针饱和电流;A表示探针表面积;ε_0表示真空介电常数;m_e表示电子质量;e表示元电荷。

    +

    对于强等离子体(即电离度较高),可以使用Saha-Boltzmann方程计算电子密度:
    n_e = (2πm_e k_B T_e/h^2)^(3/2) * (N_i/N)^2 * exp((-E_i/k_B T_e)* (1-β))

    +

    其中,N_i表示第i种粒子的数密度;N表示总数密度;T_e表示等离子体电子温度;k_B表示玻尔兹曼常数;h表示普朗克常数;E_i表示第i种粒子的电离势;β表示热化学平衡指数,通常在1左右。

    +

    Wang

    +

    +

    +

    Vp是IV曲线的拐点

    +

    Vp

    +

    EEDF

    6.6.15

    +
    +chatGPT方案--展开查看 + + +

    等离子体的EEDF(能量电子分布函数)描述了等离子体中电子的能级分布情况,是等离子体物理学中一个重要的参数。以下是计算等离子体EEDF的基本步骤:

    +

    选取合适的实验方法来测量等离子体的电子能谱。常用的实验方法包括:光电子显微镜、辐射法、气体磁谱计等。

    +

    对于得到的电子能谱进行预处理,并将其转换为电子能量分布函数。通常,可以使用不同的数值技术和算法来进行预处理和转换。

    +

    根据转换后的电子能量分布函数,计算出等离子体的EEDF。这可以通过应用Boltzmann方程或其他相关方程进行计算。Boltzmann方程给出了EEDF的形式,可以写成下面的形式:

    +

    f(E) = A * exp(-E/kT_e)

    +

    其中,E是电子能量;T_e是电子温度;A是归一化常数。

    +

    对于复杂等离子体,例如非平衡等离子体,可能需要考虑更多的因素并采用更加复杂的模型来计算EEDF。在这种情况下,可以结合数值模拟和实验数据来进行计算和分析。
    计算等离子体EEDF的公式通常基于Boltzmann方程,其形式如下:

    +

    f(E) = A * exp(-E/kT_e)

    +

    其中,f(E)是电子能量分布函数;E是电子能量;T_e是等离子体电子温度;A是归一化常数。

    +

    计算EEDF需要确定电子能量分布函数中的参数,包括归一化常数A和电子温度T_e。这可以通过将实验数据与理论模型进行比较来获得。

    +

    对于平衡态等离子体,可以使用以下公式计算电子密度n_e和电子温度T_e:

    +

    n_e = n_0 * exp(-E_i/kT_e)

    +

    T_e = (2/3)*(kT_n/m_e)

    +

    其中,n_0是等离子体中的中性原子或分子浓度;E_i是电离势;T_n是等离子体中的中性粒子温度;m_e是电子质量;k是玻尔兹曼常数。

    +

    归一化常数A是EEDF中的一个重要参数,它通常用于确保电子能量分布函数f(E)的总积分为1。确定归一化常数A的方法可能因实验条件和等离子体类型而异,但以下是一些常见的方法:

    +

    使用计算机模拟来估计归一化常数A。可以通过对Boltzmann方程进行数值求解来获得电子能量分布函数,并根据总积分为1的条件来确定归一化常数A。

    +

    使用实验数据来确定归一化常数A。这可以通过将实验得到的电子能谱与理论模型进行比较来实现。首先,需要计算出理论上的电子能谱,并使用已知的归一化常数A来匹配实验结果。然后,通过比较实验数据和模型预测值的差异来调整归一化常数A的值。

    +

    采用标准归一化常数。有时候,也可以使用标准归一化常数(例如,SI制中的1/m^3)来简化计算过程。这意味着电子能量分布函数f(E)将被除以总电子密度n_e,以确保总积分为1。

    + +
    + +

    EEPF

    6.6.18

    +
    +

    单粒子方程

    +

     1

    +

    第一项是压力梯度项

    +

    第二项是qn洛伦兹力

    +

    第三项是碰撞项

    +

    离子束守恒(速率平衡方程)

    +

    +

    右边分别是产生项-损失项

    +

    对于1式中u比较小,所以可以省略,最终化简为以下式子

    +

    +

    电子电流

    +

    +

    u是平均速度

    +

    综上就可以推出欧姆定律(?)

    +

    +

    +

    又知道j =电导率xE,所以根据上式就可以得出等离子体的电导率.

    +]]>
    + + 等离子体 + + + 等离子体 + +
    + + 网络安全 + /2023/07/06/%E7%BD%91%E7%BB%9C%E5%AE%89%E5%85%A8/ + + + + 终于闲下来,说一说我建Blog之路 + /2020/02/23/%E7%BB%88%E4%BA%8E%E9%97%B2%E4%B8%8B%E6%9D%A5%EF%BC%8C%E8%AF%B4%E4%B8%80%E8%AF%B4%E6%88%91%E5%BB%BABlog%E4%B9%8B%E8%B7%AF/ + 买服务器

    2020年鼠年的初二,在家里宅着无聊开始着手准备,搭建一个人网站。

    + + +

    一开始做了一部分设计图,准备使用Java建站。最初的设计不仅仅是写博客,而是想多方面发展,包括博客,生活,旅行,剪辑,考研等,所以做了一份思维导图。当天决定了好久才定下来使用阿里云的学生服务器,年费:124;加上9块钱买了域名 ,一共是¥133。

    +
    +

    wordpress

    当然,买完才发现,自己购买的时候,选错了,选成了Wordpress版了,然后在第一时间重置了自己的服务器,改成了CentOS(阿里云的学生服务器只提供7.3版本的)。

    +
    +

    Ajax+MVC

    在学校学了一点关于MVC的知识,之前也有自己做过一个项目(具体会在别的文章里讲👌)。

    +

    接下来就是配置服务器了,在配置服务器的时候,遇到了很多的坑,基本都是版本版本问题,我有个癖好,就是软件习惯性选择最新的装。JDK搭建,apache tomcat搭建,nginx搭建都还好,但是到了数据库安装的时候,就出现了各种问题,版本号依赖关系不匹配之类的(具体会在别的文章里讲👌)。

    +

    2天后,环境基本安装完成,MVC的后台可以说也是基本有了雏形,然后就部署了 然后部署就遇到了其他的问题,后来一看是少穿了一个jar包。

    +

    这次 的设计是Ajax+mvc的设计,就是说先写个差不多的后端,放到服务器上,然后从本地直接发送请求,要个json串回来,用仅会的那么一两句js,解析一下,放到页面上。

    +

    3天后,(最先做的blog模块)页面上终于有差不多的个人博客的味道了,真香。

    +

    但是随着慢慢的发现这种动态网页的模式,(加上我技术有限)使我无法设置我在详情页上文字的样式,当时设计的是详情页上的文字直接放在数据库里的,然后固定一种详情页的模板,直接往里塞数据。所以,详情页只不过是一张图片,加一坨字罢了。

    +

    为此又愁了好几天,直到有一天,一位大佬问我,有没有听说过Hexo。

    +
    +

    Hexo

    我当然没听说过Hexo是什么,然后就去网上查,去了官网看了一圈感觉确实不错,然后查看安装方式 : npm... 。“什么是nmp”,在我了解git之前,一直以为npm是其他系统特有的命令。然后看到后面有 git 什么又是git,虽然以前听说过git,但是从来都不了解,然后花了一个下午在B站,学了git以及github相关的东西 ,才知道npm原来是 node.js相关的包管理工具。然后才知道,如何安装Hexo。

    +

    于是,看着B站某博主的视频,搭建好了自己的一套Hexo平台,并部署到了github。可我为什么要花钱买阿里的服务器呢?

    +

    后来慢慢转变了思想:搭建个人网站,为啥要搞的那么麻烦!于是又在b站查找相关资料(众所周知,bilibili是一个技术交流平台)。发现了Hugo

    +
    +

    Hugo

    Go语言。学过一两天,至少写个Hello World 不用去百度的那种👍。Hugo就是一个基于Go的平台,但是访问了一下午他们家的主题。我觉的还是换一个吧(主要还是接受了WordPress的宣传)。

    +
    +

    回到wordpress

    我又决定回到WordPress了,本来打算自己配置一套WordPress的环境,但是卡在安装Docker上了,Docker又是什么东西!!!🤢,之前只知道它是条鲸鱼,装了一晚上,才发现还需要那个Docker Compose,去百度了一下教程,终于,👴吐了。最后一刻想起来,阿里云不是自带WordPress的选项么。

    +

    然后系统再一次被重置。换上了WordPress,PHP对于我来说一片空白,但是还好有后台管理模块。

    +

    结果,阿里云自带的WP版本也太旧了8!4.8.2,都0202年了!MySQL 5.xx 在shell里输入mysql 显示没有该命令又是几个意思???结果我又将就着,配置了半天 ,不得不说 ,这个WP真的卡,管理员体验极差,配置了一晚上,写了一篇md传上去了。晚上,还兴奋的不行,寻思总算可以稳定的写blog了。

    +

    第二天中午,起床,发现我的网站进不去了,域名进不去,IP进不去。真心崩溃,我写的文案啊,码字不易啊,当机立断,不要耗在这上面,还是回头去用Hexo吧,毕竟WP对国内用户太不友好了。🤦‍♂️

    +
    +

    回到Hexo

    服务器再一次被重置。。

    +

    回到了CentOS7.3,转好了一堆乱七八糟 的环境,然后把以前学校里那个项目部署上去了。

    +

    写博客还是轻量一些好。。

    +
    +]]>
    + + 技术 + 建站之路 + + + 崩溃的 + +
    + + 获得管理层许可及挑选团队队员 + /2020/03/30/%E8%8E%B7%E5%BE%97%E7%AE%A1%E7%90%86%E5%B1%82%E8%AE%B8%E5%8F%AF%E5%8F%8A%E6%8C%91%E9%80%89%E5%9B%A2%E9%98%9F%E9%98%9F%E5%91%98/ + 获得管理层的许可

    (1)向管理层提交WBS

    +

    (2)建立交流平台

    +

    步骤1:向项目发起人提交WBS

      +
    • 项目发起人可能是你的WBS获得许可的第一个障碍
    • +
    • 你要详细了解(最好记住)WBS中的每个细节
    • +
    • 必要的时候向项目发起人做必要的解释
    • +
    • 考虑你公司的商业周期和其他项目
    • +
    • 选择合适的时间提交你的WBS
    • +
    • 给项目发起人预留足够的审批时间
    • +
    • 应尽量争取一次通过项目WBS的审批通过
    • +
    • 记录项目发起人提出的任何意见或建议
    • +
    • 任何一次失败都会对你们的信任和信心造成打击
    • +
    +

    步骤2:向管理层提交WBS

      +
    • 同项目发起人一起向管理层提交WBS
    • +
    • 用时间基线的方式提交你的WBS
    • +
    • 演讲时强调每个阶段的完成日期,而不是时间
    • +
    • 强调停工和其他对公司造成严重影响的日期和时间
    • +
    • 不必要讲述每个阶段是如何完成的,但需要记牢,以防提问
    • +
    • 给管理层预留足够的审批时间
    • +
    • 应尽量争取一次通过项目WBS的审批通过
    • +
    • 记录管理层提出的任何意见或建议
    • +
    • 任何一次失败都会对你们的信任和信心造成打击
    • +
    +

    时间基线的实例

    + +

    步骤3:同管理层一同工作

      +
    • 管理层的强力支持是项目成功的保障
    • +
    • 管理层和项目团队内可能存在不同看法
    • +
    • 项目经理可能和他们之间存在不同看法
    • +
    • 使管理者明白某个人可能在这个项目上要花一定时间
    • +
    • 使项目经理明白管理层将参与该项目
    • +
    • 使团队成员明白管理层已和项目经理沟通好了
    • +
    • 通过团队成员投入的时间,确定项目经理的职权范围和树立权威
    • +
    +

    建立交流渠道(1)

    交流渠道的搭建及工具

    + + +

    建立交流渠道(2)

      +
    • 交流的任务
    • +
    • 能够随时同管理层和团队成员进行交流
    • +
    • 提供有关项目的状态
    • +
    • 提供项目的更新情况
    • +
    • 告诉大家是如何完成的
    • +
    • 提供项目本身的相关信息和相关事宜
    • +
    • 交流的目的
    • +
    • 维持项目的动力
    • +
    • 鼓舞团队的士气
    • +
    • 保持信息的通畅,使团队成员有参与感
    • +
    • 保持团队活力
    • +
    • 领导团队走向成功
    • +
    +

    挑选团队队员

    评估内部技能

    了解团队成员的经验 、技能 、能力 和合作精神是项目

    经理按WBS委派任务的依托。

    +

    如何才能了解每个成员的能力呢?

      +
    • 考查成员的经验
    • +
    • 查看成员的个人履历
    • +
    • 查看成员的技能及培训证书
    • +
    • 如何选择培训中心培训成员?
    • +
    +

    考查成员的经验

    经验是最佳的参考指数

    +
      +
    • 以前的项目:成员参加以前项目的程度、深度及角色
    • +
    • 个人的知识:用事实说明他们的声誉、完成工作的能力
    • +
    • 管理层推荐:从管理层那里获得成员的能力、知识技能
    • +
    • 成员的推荐:从其他成员那里获得成员的能力、 知识技能
    • +
    +

    查看成员的个人履历

      +
    • 个人履历是成员的绝密资料,要小心使用
    • +
    • 可以让成员填写从事过的项目
    • +
    +

    查看成员的技能及培训证书

      +
    • 证书说明成员能够使用某种技术,了解重要概念
    • +
    • 有证书并不就是专家
    • +
    +

    要在经验、履历和证书方面取得平衡

    如何选择培训中心培训成员

      +
    • 培训方有哪些经验
    • +
    • 培训方能否特别提供适合你项目的培训计划
    • +
    • 是特别聘请老师好呢,还是让成员参加课堂培训好?
    • +
    • 有网上培训吗?
    • +
    • 课程中包含哪些材料?
    • +
    • 课程费用多少?
    • +
    • 培训地点在哪?
    • +
    • 哪种培训方式更省钱?
    • +
    +

    面试潜在的队员

      +
    • 面试的目的和任务
    • +
    • 怎样面试
    • +
    • 选择标准
    • +
    • 提问的方式
    • +
    +

    面试的目的和任务

      +
    • 以项目需要的能力、知识、技能和合作精神等为原则
    • +
    • 其一、给应试者一个深刻的印象,明白是你在管理项目
    • +
    • 其二、尽可能多地了解应试者,判断是否符合项目的需求
    • +
    +

    怎样面试

    对项目(部门 、公司)的详细描述
      +
    • 其一、告诉应试者还有哪些工作需要完成
    • +
    • 其二、可以把注意力集中在成员所需要具有的特点上
    • +
    +
    要求应试者答卷或自我介绍或完成一个小的工作

    选择标准

      +
    • 选择的标准是基于对工作的描述
    • +
    • 教育程度
    • +
    • 对任务的认识
    • +
    • 完成任务的经验
    • +
    • 有助于完成任务的各种技能
    • +
    • 在公司内的业绩
    • +
    • 其他的重要素质,如智力、 领导能力、合作精神及品德
    • +
    +

    提问的方式

      +
    • 封闭式问题,只可以回答“是”或“不是”
    • +
    • 简单的问题,如“为什么想加入我们的公司?
    • +
    • 经验问题,如“你的上司在大会上批评了你怎么办?
    • +
    • 追问问题,从应试者的回答中找问题,紧追不放
    • +
    • 不能问的问题,如:‘你先生或太太做什么的?”等
    • +
    +]]>
    + + 项目管理 + + + 软件项目管理 + +
    + + 螺旋等离子体推进器及其羽流中的波传播与吸收 + /2023/05/05/%E8%9E%BA%E6%97%8B%E7%AD%89%E7%A6%BB%E5%AD%90%E4%BD%93%E6%8E%A8%E8%BF%9B%E5%99%A8%E5%8F%8A%E5%85%B6%E7%BE%BD%E6%B5%81%E4%B8%AD%E7%9A%84%E6%B3%A2%E4%BC%A0%E6%92%AD%E4%B8%8E%E5%90%B8%E6%94%B6/ + 螺旋等离子体推进器及其羽流中的波传播与吸收

    摘要

    采用二维全波频域冷等离子体模型研究了螺旋形等离子体推力器中电磁功率的传播和吸收,包括远羽流区和周围空间。结果表明,功率的一小部分在羽流区被吸收,功率在源中的沉积基本不受模拟区域大小、金属障碍物的存在或环境中的等离子体密度的影响。电子回旋共振(ECR)表面始终存在于下游,有效地防止沿羽流向空间以外的辐射。在存在过密的环境等离子体时,就像在真空室中预期的那样,场在这个转变之后完全消失,真空室边界条件对这个表面之前的波场影响很小。在没有环境等离子体的情况下,等离子体与真空界面处存在双波态转变,影响了羽流区数值模拟的准确性。

    +

    介绍

    Helicon等离子体推进器(HPTs)是目前正在研发的电力推进装置[1-9]。它们的工作依赖于通过电感器/天线产生的振荡电磁场对圆柱形容器中的磁约束等离子体进行加热[10,11],并在外部磁喷嘴(MN)中对等离子体进行膨胀和加速,在分离发生之前产生磁推力[12-14]。由于无电极,与传统的电力推进技术(如网格离子推进器或霍尔推进器)相比,HPTs具有一定的优势,例如潜在的寿命延长,整体系统和电气架构的简化。MN拓扑结构易于控制,表明具有较高的节流性。此外,由于缺乏带有敏感材料插入的空心阴极,因此有可能使用替代推进剂。然而,报道的推力效率仍然低于20%[6,16],在理解驱动HPT性能的物理机制方面仍然存在悬而未决的问题,特别是电磁波对等离子体的加热问题。

    +

    电磁场的传播和吸收是该装置运行的核心,也是本工作的研究对象。这些过程取决于天线的几何形状和电流、源的形状、磁拓扑结构和强度、等离子体密度图,以及在较小程度上影响有效碰撞的等离子体温度。反过 来,电磁功率沉积决定了设备中的等离子体特性。当两个方面是紧密耦合、电磁问题的时间表(10−7年代,或数十兆赫)要快得多的等离子体运输问题(离子转运时间的顺序10−5 s)。这使得单独的近似研究这些现象,这种方法已成功用于分析源等离子体动力学缓慢一方面[日],和内部电磁场问题另一方面(21、22)。

    +

    在使用的MHz级频率(通常为13.56 MHz)下,离子对快速场的响应可以忽略不计,电子响应决定了传播和吸收特性。当等离子体密度n已大于1012 ~ 1013 m−3,外加磁场强度Ba大于1 ~ 10 G时,激发频率ω小于电子等离子体频率ωpe和电子回旋频率ωce,即:ω<ωpe,ωce。这意味着左极化(L)波是倏灭的,只有右极化(R)哨声波在HPT等离子体内传播,且只有当其波矢量k落在与磁场矢量Ba[23]半角αc的锥内时才会传播。在这个锥的表面,k→∞,因此它被称为共振锥。传统上,当k基本上与Ba平行时,这种波被称为helicon (H)波[10,24](波长较长),当k基本上与共振锥平行时,这种波被称为trivelake - gould (TG)[25]波(波长较短)(因此有一个重要的k⊥分量)。对于高Ba,有一些k‖的值,其中k有两个解,一个与H波有关,另一个与TG波有关。这被称为双波状态(DWR)[26]。相比之下,在较低的Ba下,每个传播k‖只有一个k⊥的值,这被称为单波态(SWR)。一般来说,H波和TG波都有助于等离子体加热,但更大份额的功率沉积有时归因于TG波,特别是在等离子体表面附近[27]。

    +

    随着等离子体向MN中扩展,磁场强度和等离子体密度逐渐减小。在羽流下游的某些表面,电子回旋共振(ECR)最终发生在ω = ωce。在典型工作频率下,ECR表面外的共振磁场强度为4.84 g,且只要等离子体持续过密(ω<ωpe),磁场就会消失。最终,临界密度转变(ω = ωpe)也会达到,尽管这通常发生在离器件很远的地方。

    +

    此外,部分电磁激励可能泄漏到周围的周边空间。这里的情况取决于环境条件:在完美真空中,L波和R波传播均匀,不受Ba的影响,速度为c,波长为几十米,明显大于器件尺寸。在高密度HPT等离子体与真空的界面处,L波截止和临界密度跃迁迅速连续发生。

    +

    然而,在等离子体稀薄的环境中,传播仍然由n和Ba决定。外围空间也存在ecr跃迁,并可能对波场产生重大影响。特别是,当等离子体密度高于临界密度时,R波的传播性质与器件内部相同——哨声波沿与Ba成一定角度传播,在ECR表面外消失。而且,当密度大约是临界值的两倍时,L波不会传播。这些环境条件与实验室真空室的实验有关,它旨在代表飞行条件,但只能达到非完全真空。

    +

    最简单的一维径向模型已经显示了圆柱形等离子体源内部存在H波和TG波[21,28,29];然而,它们忽略了n和Ba轴向不均匀性的影响。全波二维非对称码过去已被开发来解决这一问题[30,31],但在轴向对准磁场Ba = Baz1z的假设下。最近,Tian等[32]放宽了这一限制,在模型中加入了一小部分发散的MN羽流,从而可以分析磁场拓扑结构对波传播的影响。Melazzi等[21]采用了另一种依赖矩量法求解天线表面电流密度和等离子体内体积极化电流的方法。相关的,Sánchez-Villar等[33]提出了一个全波有限元方法工具,已成功地用于模拟另一种类型的无极推力器,电子回旋共振推力器。

    +

    现有的HPTs电磁场研究仅限于等离子体源和极近羽流。这就忽略了关于传播和吸收问题的几个主要问题,例如这个有限的模拟域是否足以理解等离子体作为一个整体的功率吸收;或者部分射频辐射能否沿着羽流向下游逃逸,并在那里被吸收。据我们所知,在HPTs的操作中,远处ECR表面的作用尚未被考虑。最后,有必要问一下周围环境的影响是什么,即微弱的等离子体或金属障碍物是否会通过打开/关闭传播路径改变吸收性能。

    +

    本工作扩展了[32]的二维有限差分频域(FDFD)模型,改进了数值实现和更大域的插值例程,并用于模拟高频脉冲发生器源、环境和远羽在ECR表面以外的RF场的传播和吸收,将轴对称域的尺寸从轴向15 cm增加到67 cm,径向2 cm增加到20 cm,实现了对ECR跃迁的完整模拟。此外,通过传输编码得到了一个真实的等离子体密度图,一个是内部等离子体动力学[34],另一个是MN[12]的外部扩张,并使用了基于该密度的碰撞图,而不是简单的等离子体密度展开和整个域的恒定碰撞频率。本文通过四个不同的仿真案例来探讨上述问题。最后,我们确定并评论了在求解发生在高密度HPT等离子体和完美真空之间的临界密度转变的波场时发现的建模和数值困难。

    +

    该研究的参考设备是一个中等尺寸的HPT(约350-500 W),类似于SENER航空航天公司和UC3M[35]联合开发的HPT05原型。

    +

    本文的其余部分结构如下:第2节描述了等离子体波模型、数值实现以及模拟的几何和等离子体剖面输入。第3节讨论了在四种不同的模拟情况下获得的电磁场和功率沉积剖面。最后,在第4节中讨论了模拟和模拟临界密度跃迁电磁场的困难,以及数值结果的收敛性。第5节总结了这项工作的结论。

    +

    电磁模型

    二维频域电磁模型考虑图1所示的物理域。HPT源及其近羽流标记为区域1,磁导远羽流标记为区域2,装置外围标记为区域3。已知性质的轴对称等离子体填充区域1和2。区域是根据等离子传输码确定的,该传输码用于获得第2.2节所述波码的输入剖面。此外,在区域3中可能存在环境等离子体,这取决于研究案例。除了对称轴外,该区域在代表真空室的金属壁上终止,这可以被认为是完美的导体。此外,域内的磁线圈和HPT支撑设备箱(电源处理单元,气体供给系统等)被视为完全导体金属箱。

    +

    图1的畴由位于源周围的半螺旋天线中频率ω/(2π) = 13.56 MHz的已知外加电流J a激发。外加磁场Ba也如图所示。Ba拓扑结构在源内部缓慢收敛,在羽流中发散,磁喉大约位于表1。设计和操作参数。参数全仿真域尺寸67 cm × 20 cm室长lc 12.5 cm室半径rc 1.25 cm天线类型半转螺旋线圈电流11 × 103安培转天线频率f = ω/(2π) 13.56 MHz天线功率350w天线环半径ra 1.75 cm天线长度la 7.5 cm天线中心位置za 27.5 cm天线厚度dt 0.5 cm发射药种类Xe发射药质量流量1.0 mg s−1推力管出口。当磁场强度在远离源的地方减小时,出现一个ECR表面,ω = ωce。按照[26]的命名法,等离子体源和部分羽流位于深空区,只有当Ba降低时,等离子体才会进入深空区(靠近ERC表面)。

    +

    HPT的尺寸和特性如表1所示。四个仿真案例定义如下:

    +

    案例R:这是主要的仿真案例,在讨论中作为参考。区域3充满了密度为n = 1014 m−3的稀薄等离子体,这对于典型的实验室真空室操作来说是一个相当低的值。这就导致了推进器周边空间的过密等离子体。内部金属元件(线圈、电子元件……)被视为完美的电导体(PEC)。

    +

    案例T:该案例与案例R相同,除了内部金属盒子从模拟中移除,因此对场是透明的。这种情况与情况R的比较说明了障碍物对电磁场传播的影响。

    +

    情形V:与情形R的区别在于,去除区域3的等离子体密度,n = 0,即区域3为完全真空。这种情况与情况R的比较显示了环境等离子体的影响,以及发生在等离子体真空边缘的临界密度转变的复杂性。

    +

    案例S:这个缩小版的案例R将积分域限制在区域1和区域3的最小部分,使域成为矩形,大小为[20-40]cm × [0-4] cm。

    +

    在下面,我们使用一个圆柱形右手向量基{1z, 1r, 1θ}。平行于或垂直于局部外加磁场的单位向量也可以形成辅助向量基{1‖,1⊥,1θ}。

    +

    模型公式

    采用冷等离子体模型来描述等离子体对电磁场的线性化响应。虽然等离子体本身是轴对称的,但我们允许存在非轴对称场,我们将其分解为方位m模式。任意矢量F (z, r, θ, t)表示为这些模态叠加的实部,

    +

    结果和讨论

    在参考模拟情形R中,等离子体处处都是过密的,即ωpe >ω。此外,如第6节所述,模拟中存在源周围的金属障碍物。图5的第一行显示了E1 θ的幅值和相位,即m = 1模态的方位电场。射频场显然受到ECR表面的限制,因为它必须在ECR表面之外消失。总的来说,在圆柱形源内部(区域1),场最强,表明与致密等离子体耦合良好。当场在羽流(区域2)和外围(区域3)衰减时,很明显,它们不是零:电磁场在这些区域传播,并不局限于源。圆柱形源的后部磁场较小。在等离子体源内部有一个部分驻波结构,这可以从局部的幅度下降和近180度的台阶上得到证明。从区域2的单调相位开始,沿轴向存在向右行波直到ECR表面,其传播方向基本上为轴向。通过在图5的相图中取一个完整的360度相位周期的距离,可以估计其波长约为20厘米。请注意,由于高磁场,波长比源管大。当等离子体密度n≈5 × 1017 m−3,磁场强度Ba≈100 G时(得到ωpe = 4.0 × 1010 rad s−1,ωce = 1.8 × 109 rad s−1),H波的解析波长近似λ≈2πde√ωce/ω,其中= c/ωpe为局部电子表皮深度,这是z≈40 cm处轴附近的特征值。有趣的是,随着密度和磁场沿羽流的减小,分析波长的变化很小。

    +

    在远离轴的地方,随着r的增加,这个轴向波形成了一个不可忽略的k⊥波向量,即它的传播与磁场矢量成一定的角度。羽流中较大的磁场存在于横向区域的磁管中,这表明Ba在一定程度上决定了电磁场的传播路径。传播停止在ECR表面,场的大小迅速下降超过它。

    +

    区域3的电场不可忽略,特别是靠近天线处,其传播也受Ba方向的影响。在磁线圈上方的空间中可以观察到低量级的小波长结构,在那里辐射是弥漫的,并形成驻波模式。这种辐射似乎被限制在区域3的ECR表面和区域1和2的密度更大的等离子体之间。

    +

    功率沉积剖面q1显示在图6的第一个面板中。最大的吸收与最大的场无关,并且发生在圆柱源的致密等离子体内部(约95%)。不可忽略的一部分功率在下游的MN中被吸收,在ECR表面之前,这表明在模型中包括该区域2对理解功率吸收的相关性。

    +

    在ECR表面存在薄的吸收层;然而,这一层在磁场矢量的部分引导下,在区域3的区域顶部偏离ECR。天线发射的能量中只有不到0.6%的能量被ECR表面以外的空间吸收,在那里溶液是消失的。这一结果表明,当在自由空间中工作时,ECR表面可以作为有效的屏蔽来防止辐射损失,即阻止射频功率逃离HPT等离子体及其邻近区域,只要环境密度过大。

    +

    在模拟情况T中,去除域内的金属部分并没有导致波场或功率沉积剖面的任何重大变化,可以从图5和图6的第二行中观察到。唯一明显的区别是向设备后部移动的射频场略高,之前被金属障碍物阻挡,并且在区域3的后部有一些额外的吸收。这些金属盒子的小影响表明,这种类型的障碍基本上不影响解决方案。

    +

    在情形V中,将环境改变为完美真空对射频场(以及数值解的精度)有更显著的影响。这种情况在图5和图6的最后一行中表示。首先,区域3中等离子体的缺失也消除了在该区域的ECR表面发生共振的可能性,现在它对场是透明的。事实上,在没有等离子体密度的情况下,Ba的值和方向对于波的传播问题就变得无关紧要了。这意味着场可以接近代表真空室的金属边界条件。请注意,在自由空间中,任何向外传播的功率都会引起辐射损失;然而,在目前的设置中,代表实验室真空室的操作,这种功率被边界条件反射回区域,直到所有的功率被区域1和2的等离子体吸收。在情形R中,在区域3中存在的微弱等离子体的短波结构在情形V中消失,辐射部分被浸入区域的导电盒所分隔。然而,ECR面在区域2继续活跃。其次,区域1和2的场本质上成为驻波,如图5的幅度图中E1 θ = 0的节点线所示,这表明在这种情况下,壁面反射确实起了作用。传播方向形成了一个主要的垂直分量k⊥到Ba,观测到的波长较短,特别是在MN羽流的外围部分。这表明TG模式的作用更相关,与H模式相比,TG模式对应的波长更短,传播更垂直。与前面的情况一样,等离子体羽流内的传播在ECR处结束。第三,羽流中场的重要性比以前的情况更大,特别是在下游,功率吸收也是如此。

    +

    尽管有这些一般性的观察结果,值得注意的是,模拟情形V在网格细化后的羽流区域没有表现出与其他情形相同的数值收敛特征。这个问题及其假定的原因将在第4节中讨论。

    +

    图7显示了源区域功率沉积剖面的放大视图,并包括情况s的小域模拟。四种解表明,功率吸收剖面基本上独立于模拟情况。这个结论之所以有价值,有两个原因。首先,它支持了建模过程的鲁棒性,因为推力器周围细节的变化对源内能量沉积的计算没有重大影响,而能量沉积占吸收的更大份额。事实上,源内部的功率似乎几乎独立于腔室条件和羽流中的传播。其次,这些结果表明,当只需要计算源吸收的功率时,可以通过只包含该区域的较小仿真域(仿真情形S)可靠地得到。

    +

    与[32]中所示的吸收图相比,图7中的沉积只显示了一个高吸收区域,覆盖了源的大部分区域。这与本工作中使用的等离子体条件(特别是轴为1500 G)是一致的,这与[32](轴为150高斯)的等离子体条件不同,导致Helicon模式波长增加。

    +

    为了结束本节,简要讨论了方位模态m = 1的相关性。以往的研究[10,32]已经确定了m =±1方位模在不同天线类型的螺旋源功率耦合中的主导地位。事实上,这个天线的设计主要是为了激发+1模式。因此,上述结果仅考虑了这种主导模式。为了评估这种方法的有效性,图8比较了m =±1,±3在模拟情况R的整个域内的功率吸收(螺旋天线只激发奇数模式)。可以推断,在模态m =+1之后,下一个重要的模态是m =−1。高m模的功率吸收下降较快。

    +

    结论

    利用有限差分、频域、全波模型研究了电磁场在高功率脉冲发生器(HPT)中的传播和吸收,包括远羽流区域和周围空间,目的是了解羽流中沉积的功率量以及环境对电磁问题的影响。等离子体密度和应用磁场来自于类似HPT05原型推进器的等离子体传输模拟,被用作研究的输入。虽然大部分的能量吸收发生在圆柱形源内部,但等离子体羽流所吸收的能量的一部分是不可忽略的。电场沿MN向上传播到始终存在于下游的ECR表面。波长和传播方向对应于绕着装置轴的螺旋波。在羽流边缘,波具有更短的波长和更重要的垂直波矢量分量,接近TG模式。

    +

    在器件及其羽流附近存在密度为n > 2.3 × 1012 m−3的微弱等离子体,对于通常的激发频率(13.56 MHz),足以使该区域过密(ωpe >ω)。这是实验室真空室实验中常见的情况,抽吸并不完美。即使在太空环境中,微弱的低密度等离子体也可能包裹着推进器,使周围空间的ECR表面保持活跃。在这些条件下,ECR表面已经被证明集中了一些功率吸收,并在限制辐射远离设备方面发挥了基本作用,因为场在它之外变得消失了。特别是,这与有限尺寸真空室实验的“自由空间”代表性有很大关系,这些实验通常由导电金属制成,因此构成了一个封闭的、反射的场腔。如果ECR表面位于腔室内,这些反射壁对场的影响变得可以忽略不计,因为它们只与场消失的空间区域接触。

    +

    在严格的真空条件下,ECR表面在周围空间中没有任何作用,因为在这种情况下,没有电子与场共振,辐射损失的路径在远离推进器的径向上打开(但不是沿着羽流,那里的等离子体继续过密,并且在ECR跃迁之后场继续消失)。实际上,由于在模拟中使用了反射包围盒,传播和吸收图发生了变化,并显示出驻波结构。

    +

    区域内的反射箱(代表推进器的支撑设备)的影响很小。此外,源区域的功率吸收被认为是稳定的,并且在模拟中基本相同,这表明影响羽流和环境区域的所有方面对于源功率吸收都是多余的。这增加了先前工作中进行的小域、纯源模拟的可信度,尽管它们遗漏了羽流中能量吸收的信息。

    +

    最后,数值收敛研究表明,除真空环境外,所有情况都具有良好的收敛特性,在真空环境中,等离子体羽流与真空界面处的强病态临界密度过渡面,加上那里的数值阶梯网格条件,被认为是小尺度数值噪声的来源。在这项工作中使用的实现是基于一种新的插值方案,它在一定程度上缓解了这个问题,并将噪声限制在一个小区域,而不影响其他地方的结果。尽管如此,未来的工作必须解决这些转变的理论建模和数值处理。在第4节中提出了一些额外的研究途径,即在该区域使用增强阻尼,并将网格几何形状与过渡对齐,也许可以切换到其他方案,如有限元,以简化非结构化网格的实现。

    +

    验证现有波模型的实验数据需要直接测量电磁场及其相位,特别是在等离子体源内部,而不干扰推进器的工作。目前,作者不知道存在这样的数据。然而,耦合等离子体输运和波动模拟(使用与本工作相同的FDTD求解器)在间接测量(如推力和几个效率)方面与类似HTP设置的实验研究比较得相当好。特别是对于HPT05原型,数值[20]和实验[6]的结果显示,在类似的工作状态下,在推力效率等关键性能数据上约有30%的相对差异(尽管比较并不完美,因为[6]的配置具有略高的天线功率)。在这个方向上的进一步工作和新的、更精确的实验测量仍然需要缩小验证差距。

    +]]>
    + + 文献 + + + 等离子体 + 文献翻译 + +
    + + 视图 + /2021/03/12/%E8%A7%86%E5%9B%BE/ + 视图

    创建视图 emp_view,连接system用户,将创建视图的权限授予用户

    +
    GRANT CREATE VIEW to scott;
    conn scottiger;
    CREATE VIEW emp_view
    AS SELECT ename,job,sal FROM emp;
    + + + +

    创建带检查约束的视图。 建立一个部门员工薪水介于1000~3000元的员工信息SAL_MID视图。

    +
    create view SAL_MID as select ename,job,sal from emp where sal between 1000 and 3000 with check option;
    + +

    创建只读视图。建立一个部门号为10的10员工的只读视图DEP_10。

    +
    create view dep_10 as select ename,job,sal from emp where deptno=10 with read only;
    + +

    创建一个包含各部门的部门号、部门人数和部门平均工资的视图。

    +
    create view  sal_avg as select deptno ,avg(sal) avgsal,count(*) total from emp group by deptno;
    + +

    创建一个部门员工信息视图,此视图中包含员工名、部门名、工作职位、薪水等信息。

    +
    create view emp_dept as select empno,ename,dname,job,sal from emp ,dept where emp.deptno =dept.deptno;
    + +

    更改视图emp_view

    +
    create or replace view emp_view as select empno,ename,job,sal from emp;
    + +

    给emp_view重新命名为emp_view1.

    +
    rename emp_view to emp_view1;
    + +

    删除视图emp_view

    +
    drop view emp_view;
    + +

    查询SCOTT用户下的视图及视图定义信息。

    +
    col view_name format a10;
    select view_name ,text from user_views;
    + +

    索引

    从emp表上创建不同的索引。

    +
    create index emp_idx on emp(ename);

    create index emp_idx_j on emp(ename,job);
    + +

    创建基于函数的索引。

    +
    create index emp_fun_idx on emp(UPPER(ename));
    + +

    建立一个大表,对表中数据进行查询操作,比较建立索引前后的系统开销。

    +

    ①建立单独的表空间wb和单独的临时表空间wbtemp,创建用户wb并为其指定表空间wb和临时表空间wbtemp,用于存放大量数据。

    +
    conn system/password
    create tablespace wb datafile 'D:\app\EShyee\oradata\orcl\wb01.DBF' size 50M autoextEND on;

    create temporary tablespace wbtemp tempfile 'D:\app\EShyee\oradata\orcl\wbtemp.dbf' size 300M;
    CREATE user wb identified by wb default tablespace wb temporary tablespace wbtemp;
    + +

    ②建立表emp1,并用pl/sql程序为其生成一百万行数据。

    +
    grant connect,resource to wb;
    conn wb/wb;
    create table emp1(id number(8,0),name varchar2(20),sex number(1,0),birth date ,phone varchar2(15));
    DECLARE
    vtoday date;
    vcnt number(8,0):=1000000;
    --PL
    begin
    SELECT sysdate into vtoday from dual;
    for i in 1..vcnt LOOP
    INSERT into EMP1(id,name,sex,birth,PHONE) VALUES(i,'name'||i,mod(i,2),vtoday-i,'phone'||i);

    IF mod(i,100)=0 THEN
    commit;
    END IF;
    END LOOP;
    end;
    + +

    ③通过计算表上的统计数据得到查询语句的开销。由于表中有大量的数据,为确保SQL*Plus显示查询的开销,而不显示查询结果。进行如下设置:

    +
    analyze table emp1 compute statistics;
    set autotrace trace explain;
    + +

    ④对empl表进行查询,从中获取一行数据,

    +
     select id,name,phone from emp1 where id=849765;

    执行计划
    ----------------------------------------------------------
    Plan hash value: 2226897347

    --------------------------------------------------------------------------
    | Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time |
    --------------------------------------------------------------------------
    | 0 | SELECT STATEMENT | | 1 | 25 | 1654 (2)| 00:00:20 |
    |* 1 | TABLE ACCESS FULL| EMP1 | 1 | 25 | 1654 (2)| 00:00:20 |
    --------------------------------------------------------------------------

    Predicate Information (identified by operation id):
    ---------------------------------------------------

    1 - filter("ID"=849765)
    + +

    ⑤在empl表的id列上创建索引,重新执行查询,

    +
    create index idx_id on emp1(id);

    select id,name,phone from emp1 where id=849765;

    执行计划
    ----------------------------------------------------------
    Plan hash value: 3940360760

    --------------------------------------------------------------------------------
    ------

    | Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time
    |

    --------------------------------------------------------------------------------
    ------

    | 0 | SELECT STATEMENT | | 1 | 25 | 4 (0)| 00:0
    0:01 |

    | 1 | TABLE ACCESS BY INDEX ROWID| EMP1 | 1 | 25 | 4 (0)| 00:0
    0:01 |

    |* 2 | INDEX RANGE SCAN | IDX_ID | 1 | | 3 (0)| 00:0
    0:01 |

    --------------------------------------------------------------------------------
    ------


    Predicate Information (identified by operation id):
    ---------------------------------------------------

    2 - access("ID"=849765)
    + +

    检查索引是否已经创建。

    +
    select index_name from user_indexes where table_name='emp1';
    + +

    使用SELECT查看表emp1的索引信息。

    +
    select index_name,table_name,uniqueness,status from user_indexes where table_name='emp1';
    + +

    修改idx_ id 索引。

    +
    alter index idx_id rename to emp1_idx_id;
    + +

    删除idx_sex 索引。

    +
    DROP index idx_sex;
    + +]]>
    + + 数据库 + + + 数据库 + 视图 + +
    + + 计算机组成原理 + /2021/03/12/%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%BB%84%E6%88%90%E5%8E%9F%E7%90%86/ + 计算机组成原理

    基本原理

    冯诺依曼机的特点

      +
    • 计算机由运算器、存储器、控制器、输入设备、输出设备组成
    • +
    • 指令和数据以同等的地位存放于存储器内,并可按地址寻访。
    • +
    • 指令和数据均用二进制数表示,形式上无差别
    • +
    • 指令由操作码和地址码组成
    • +
    • 指令在存储器内按顺序存放
    • +
    • 机器以运算算器为中心
    • +
    +
    +

    易混淆

    指令字长:一个指令字中包含的二进制代码的位数

    +

    存储字长:一个存储单元存储的二进制代码的长度

    +

    机器字长:计算机能直接处理的二进制数据的位数

    +

    三者都是字节的整数倍

    +

    if 指令字长+2*存储字长 需要两次访存取一条指令

    +

    此时取值周期 为 机器周期的2倍

    +

    CPU区分指令和地址的依据:指令周期的不同阶段

    +

    MAR用于寻址,位数对应于存储单元的个数,等于地址码长度

    +

    MDR位数和存储字长相等

    +

    IR、MAR、MDR对程序员均不可见

    +

    n位的计算机用m位来表示,机器字长为n位,一次可以处理n位的数据,m为地址码的长度。

    +

    相联存储器既可按地址寻址又可按内容寻址

    +
    +

    计算机的运算过程

      +
    1. 预处理阶段
    2. +
    3. 编译阶段
    4. +
    5. 汇编阶段
    6. +
    7. 链接阶段
    8. +
    +

    指令执行的过程

    取指令过程

      +
    1. 取指令 PC–>MAR–>M–>IR
    2. +
    3. 分析指令 OP(IR)–>CU
    4. +
    5. 执行指令 Ad(IR)–>MAR–>M–>MDR–>ACC
    6. +
    +

    计算机系统的多级层次结构

      +
    1. 微程序机器M0(微指令系统) 微程序机器层
    2. +
    3. 传统机器(用机器语言的机器)M1
    4. +
    5. 虚拟机器(操作系统)M2
    6. +
    7. 虚拟机器M3(汇编语言机器)
    8. +
    9. 虚拟机器M4(高级语言机器)
    10. +
    +

    计算机性能指标

    机器字长

    计算机进行一次整数运算所能处理的二进制数据的位数。

    +

    CPU的寄存器位数、加法器有关

    +

    机器字长=内部寄存器的大小,通常为字节的整数倍

    +

    与机器字长相同的部件

    机器字长=CPU内部用于整数运算的运算器位数和通用寄存器宽度

    +

    ALU、通用寄存器

    +

    数据通路带宽

    数据总线一次所能并行传送信息的位数。

    +

    数据通路宽度=外部总线的宽度

    +

    主存容量

    主存储器所能存储信息的最大容量,单位:B,也可用字数*字长表示

    +

    MAR的位数反应存储单元的个数

    +

    运算速度

    吞吐量

    系统在单位时间内处理请求的数量。取决于主存的存取周期

    +

    响应时间

    用户向计算机发出一个请求到系统对该请求做出响应并获得结果的时间。

    +

    CPU时间(运行一个程序所花费的时间)+等待时间(磁盘访问、存储器访问、IO操作、操作系统开销等)

    +

    CPU时钟周期

    节拍脉冲或T周期,主频的倒数

    +

    CPU中最小的单位

    +

    主频

    1Hz表示每秒一次

    +

    CPI

    执行一条指令所需的时钟周期数。

    +

    CPU执行时间

    CPU执行时间=CPU时钟周期/主频=(指令条数*CPI)/主频

    +

    MIPS

    每秒执行多少万条指令

    +

    MIPS=指令条数/(执行时间* 10^6)=主频/(CPI * 10^6)

    +

    MFLOPS、GFLOPS、PFLOPS、ZFLOPS

    M:百万次

    +

    G:十亿次

    +

    T:万亿次

    +

    基准程序

    专门用来评价性能的一组程序

    +

    专业术语

    系列机

    具有基本相同的体系结构,使用相同基本指令系统的多个不同型号的计算机

    +

    兼容

    软件可移植性

    固件

    固定在ROM中的部件

    +

    校验码

    奇偶校验码

    可检测出一(或奇数)位错误,但不能确定出错的位置,也不能检测出偶数位错误。

    +

    奇校验码:整过校验码中“1”的个数为奇数,偶校验相反。

    +

    海明码

    海明码的位数

    n为有效信息的位数,k为校验位的位数

    +

    n+k<=(2^k)-1

    +

    确定校验位的分布

    规定校验位分布在海明号为2^(i-1)的位置(1、2、4、8….)

    +

    分组形成校验关系

    校验位取值

    海明码的校验原理

    CRC循环冗余码

    定点数

    定点小数的范围:-(1-2^(-n))~1-2^(-n)

    +

    定点整数的范围:-(2^n -1)~2^n -1

    +

    若字长为n+1,

    +

    原码小数的范围:-(1-2^(-n))~1-2^(-n)

    +

    原码整数的范围:-(2^n -1)~2^n -1

    +

    补码小数的范围:-1~1-2^(-n)

    +

    补码整数的范围:-2^n~2^n -1

    +

    反码小数的范围:-(1-2^(-n))~1-2^(-n)

    +

    反码整数的范围:-(2^n -1)~2n -1

    +

    补位规则

    算数移位

    image-20210322203746474

    +

    逻辑移位

    逻辑移位将操作数视为无符号数

    +

    移位规则:逻辑左移时,高位移丢,低位添0;逻辑右移时,低位移丢,高位添0。

    +

    循环移位

    循环移位分为带进位标志位CF的循环移位(大循环)和不带进位标志位的循环移位(小循环)。

    +

    溢出判断

    采用一符号位

    两个相同符号的数运算,结果符号相反,则溢出

    +

    采用双符号位

    模4补码

    +

    运算结果的两个符号位相同:未溢出

    +

    运算结果的两个符号位不同:溢出

    +

    00:结果为正数,未溢出

    +

    01:正溢出

    +

    10:负溢出

    +

    11:结果为负数,未溢出

    +

    采用一位符号位根据数据位的进位情况判断

    符号位与数据位最高位相同:未溢出,否则溢出

    +

    大端存储 和 小端存储

    大端存储

    + + + + + + + + + + + + + + + + + + + +
    0800H0801H0802H0803H
    ……01H23H45H67H……
    +

    小端存储

    + + + + + + + + + + + + + + + + + + + +
    0800H0801H0802H0803H
    ……67H45H23H01H……
    +

    边界对齐

    image-20210322210605115

    +

    浮点数

    N=r^E *M

    +

    r:浮点数阶码的底

    +

    E:阶码

    +

    M:尾数

    +

    规格化

    原码规格化后的范围:1/2~(1-2^(-n))

    +

    原码规格化后的范围:-(1-2^(-n))~-1/2

    +]]>
    + + 组成原理 + + + 进程 + 组成原理 + 并发 + +
    + + 计算机操作系统(2) + /2021/03/12/%E8%AE%A1%E7%AE%97%E6%9C%BA%E6%93%8D%E4%BD%9C%E7%B3%BB%E7%BB%9F(2)/ + + +

    进程管理

    程序的并发执行

    程序是描述计算机所要完成的具有特定功能的,并在时间上按严格次序前后相继的计算机操作序列集合(一个静态的概念)

    +

    程序顺序执行的特点:

    +
      +
    1. 顺序性
    2. +
    3. 封闭性
    4. +
    5. 可再现性
    6. +
    +

    程序在执行时应考虑的环境

    +
      +
    1. 独立性
    2. +
    3. 随机性
    4. +
    5. 资源共享性
    6. +
    +

    进程

    并发执行的程序在执行过程中分配和管理资源的基本单位

    +

    特点:

      +
    1. 动态概念
    2. +
    3. 并发特征(程序没有)
    4. +
    5. 竞争计算机系统资源的基本单位
    6. +
    7. 不同的进程可以包含同一个程序
    8. +
    +

    进程的组成:

    进程控制块PCB:
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    信息含义
    状态说明进程当前的状态
    进程标识符标明系统中各个进程
    位置信息指明程序及数据在主存或外存的位置
    控制信息参数、信号量、消息等
    队列指针连接统一状态的进程
    优先级进程调度的依据
    现场保护区将处理机的现场保护到该区域
    其他
    +
    程序
    数据

    进程的状态

    运行态、就绪态、阻塞态/等待态、新建态、退出态

    +

    进程切换

    切换的时机

    +
      +
    1. 时钟中断
    2. +
    3. I/O中断
    4. +
    5. 内存失效
    6. +
    7. 遇到陷阱
    8. +
    9. 系统调用
    10. +
    +

    空->创建:新的批处理作业、交互登录、为提供服务而由操作系统创建、由现有进程派生

    +

    新建->就绪态:操作系统做好准备再接纳一批新进程时

    +

    就绪->运行态:需要选择一个新进程时

    +

    运行->就绪:正在运行的进程达到“允许不中断执行”的最大时间段、被优先级更高的进程抢占、进程自愿释放处理器(周期性的进程)

    +

    运行->阻塞:对于进程请求的服务,操作系统无法立即予以服务、请求一个无法得到的资源、需要进行初始化的时候、进程通信时,一个进程等待另一个进程的信息。从磁盘读数据时(可能)

    +

    阻塞->就绪:等待的时间发生时

    +

    一个读磁盘操作完成以后,操作系统会修改进程状态为就绪态

    +

    进程的创建

      +
    1. 由系统程序模块统一创建
    2. +
    3. 有父进程创建
    4. +
    +

    用户登录成功后需要创建新进程
    启动程序执行创建新进程

    +
    +

    设备分配是通过在系统中设置相应的数据结构实现的,不必创建新进程。

    +

    进程的撤销

      +
    1. 该进程已完成所要求的功能而正常终止
    2. +
    3. 由于某种错误导致非正常终止
    4. +
    5. 祖先进程要求撤销某个子进程
    6. +
    +

    进程的通信

    主从式
      +
    1. 主进程可自由使用从进程的资源或数据
    2. +
    3. 从进程的动作受主进程的控制
    4. +
    5. 主进程和从进程的关系是固定的
    6. +
    +
    会话式
      +
    1. 使用进程在服务进程所提供的服务之前,必须得到许可
    2. +
    3. 服务进程所提供的服务的控制由自身完成
    4. +
    5. 使用进程和服务进程在通信时有固定的链接关系
    6. +
    +
    消息或邮箱机制
      +
    1. 只要存在空缓冲区或邮箱,发送进程就可以发送消息
    2. +
    3. 发送进程和接受进程无直接连接关系
    4. +
    5. 两进程之间存在缓冲区或邮箱
    6. +
    +
    共享存储区方式

    不要求数据移动

    +
    管道通信

    类似于半双工
    大小为内存上的一页

    +

    临界区

    不允许多个并发进程交叉执行的一段程序
    禁止两个进程同时进入临界区的准则:

    +
      +
    1. 空闲让进
    2. +
    3. 忙则等待
    4. +
    5. 有限等待
    6. +
    7. 让权等待
    8. +
    +

    实现互斥

    软件方法

      +
    1. 单标志法
      违背空闲让进
    2. +
    3. 双标志法先检查
      违背忙则等待
    4. +
    5. 双标志法后检查
      导致互相谦让,谁也进不了临界区
      最终饥饿
    6. +
    7. Peterson算法
      代码语句中设置了turn
      无法实现让权等待
    8. +
    +

    硬件实现方法

      +
    1. 中断屏蔽法
      限制了处理机交替执行程序的能力
    2. +
    3. 硬件指令法
      TestAndSet指令(原子操作)(不会主动放弃CPU,完成时会唤醒处于就绪态的进程,在开中断下运行)、Swap指令
      硬件方法不能实现让权等待
    4. +
    +

    信号量

    条件变量与信号量的比较

    +
      +
    • 相同点
      条件变量的wait/signal操作类似于信号量的p/v操作,可实现进程的阻塞/唤醒
    • +
    • 不同点
      条件变量是没有值的,仅实现了“排队等待”功能;而信号量是“有值”的,信号量的值反应了剩余资源数,而在管程中,剩余资源数用共享数据结构记录。
    • +
    +

    管程

    代表共享资源的数据结构,以及由对该共享资源数据结构实施操作的一组过程所组成的资源管理程序。

    +

    实现共享资源封装
    每次只允许一个进程进入管程

    +

    经典同步问题

    生产者消费者问题
    semaphore mutex=1;	//临界区互斥信号量
    semaphore empty=n; //空闲缓冲区
    semaphore full=0; //缓冲区初始化为空
    producer(){ //生产者进程
    while(1){
    produce an item in next; //生产数据
    P(empty); //获取空缓冲单元
    P(mutex); //进入临界区
    Add next to buffer; //加入数据
    V(mutex); //离开临界区,释放互斥信号量
    V(full); //满缓冲区加1
    }
    }
    consumer(){ //消费者进程
    while(1){
    P(full); //获取满缓冲单元
    P(mutex); //进入临界区
    Remove an item from buffer;
    V(mutex); //离开缓冲区
    V(empty); //空缓冲区加1
    Consume the item; //消费
    }
    }
    + +
    读者-写者问题
    int count=0;			//用于记录当前的读者数量

    semaphore mutex=1; //用于保护更新count变量时的互斥
    semaphore rw=1; //用于保证读者和写者互斥地访问文件
    semaphore w=1; //用于实现写优先

    writer() { //写者进程

    while(1) {
    P(w);
    P(rw) ; //互斥访问共享文件

    writing; //写入

    V(rW); //释放共享文件
    V(w);


    reader() { //读者进程
    while (1) {
    P(w)
    P (mutex) ; //互斥访问count变量
    if (count==0) //当第一个读进程读共享文件时
    P(rw); //阻止写进程写
    count++; //读者计数器加1
    V (mutex) ; //释放互斥变量count
    V(w);
    reading; //读取
    P (mutex) ; //互斥访问count变量
    count--; //读者计数器减1
    if (count==0) //当最后一个读进程读完共享文件
    V(rw) ; //允许写进程写
    V (mutex) ; //释放互斥变量count
    }
    }
    + +
    哲学家问题
    semaphore chopstick[5]={1,1,1,1,1}; //初始化信号量
    semaphore mutex=1; //设置取筷子的信号量
    Pi() { //i号哲学家的进程
    do{
    P (mutex) ; //在取筷子前获得互斥量
    P (chopstick[i]) ; //取左边筷子
    P (chopstick[(i+1)%5]) ; //取右边筷子
    V (mutex) ; //释放取筷子的信号量
    eat; //进餐
    V(chopstick[i]) ; //放回左边筷子
    V (chopstick[(i+1)%5]) ; //放回右边筷子
    think; //思考
    } while (1) ;
    }
    + +

    死锁

    死锁的原因

      +
    1. 系统资源的竞争
    2. +
    3. 进程推进顺序非法
    4. +
    5. 死锁产生的必要条件:
    6. +
    +
      +
    • 互斥条件
    • +
    • 不剥夺条件
    • +
    • 请求并保持条件
    • +
    • 循环等待条件
    • +
    +

    死锁的预防

      +
    1. 破坏互斥条件
      不可行
    2. +
    3. 破坏不剥夺条件
      用于状态易于保存和恢复的资源 如CPU的寄存器及内存资源,不适用于打印机
    4. +
    5. 破坏请求并保持条件
      采用预先静态分配方法
      会导致饥饿
    6. +
    7. 破坏循环等待条件
      采用顺序资源分配算法
      限制了新设备的增加
      造成资源浪费
      给用户编程带来麻烦
    8. +
    +

    死锁避免

      +
    1. 系统安全状态
    2. +
    3. 银行家算法
    4. +
    +

    死锁的检测和排除

      +
    1. 资源分配图
    2. +
    3. 死锁定理
    4. +
    5. 死锁解除
    6. +
    +
      +
    • 资源剥夺法
    • +
    • 撤销进程法
    • +
    • 进程回退法
    • +
    +

    线程

    线程是调度的基本单位
    线程控制块TCB
    用户级线程只可在用户空间中进行,所以在不支持内核级线程的系统中也可以实现管理。
    用户级线程的切换效率更高。

    +

    典型应用

      +
    1. 服务器中的文件管理或通信控制
    2. +
    3. 前后台处理
    4. +
    5. 异步处理
    6. +
    +

    多线程模型

    多对一

    多个用户映射到一个内核级线程,用户线程对操作系统不可见
    多个线程不能并行运行在多处理机上

    +

    一对一

    每个用户级线程映射到一个内核级线程
    线程开销大

    +

    多对多

    n个用户级映射到m个内核级线程上,要求m<=n

    +

    中断技术

    在程序执行过程中遇到急需处理的事件时,暂时中止现行程序在CPU上的执行,转而执行相应的事件处理程序,待处理完成后返回中断点或调用其他程序。

    +

    外中断(中断或者异步中断)

    来自处理器之外的中断
    分为可屏蔽中断和不可屏蔽中断
    既发生在用户态又发生在内核态

    +
      +
    1. 时钟中断
    2. +
    3. 键盘中断
    4. +
    5. 它机中断
    6. +
    7. 外部设备中断
    8. +
    +

    内中断(异常或同步中断)

      +
    1. 访管中断->执行系统调用引起
    2. +
    3. 硬件故障中断->电源失效、奇偶校验错误、总线超时
    4. +
    5. 程序性异常->非法操作、地址越界、页面故障、调试指令、除数为零、浮点溢出
      大部分异常都发生在用户态,只有“缺页异常“发生在内核态
    6. +
    +

    中断的执行过程

      +
    1. 关中断 此时不能响应更高级的中断请求
    2. +
    3. 保存断点 即PC
    4. +
    5. 引出中断服务程序 将地址送入PC
    6. +
    7. 保存现场和屏蔽字
    8. +
    9. 开中断 此时允许更高级的的中断
    10. +
    11. 执行中断服务程序
    12. +
    13. 关中断
    14. +
    15. 恢复现场和屏蔽字
    16. +
    17. 开中断、中断返回
      PC由硬件保存,通用寄存器由操作系统保存
      1~3由硬件(中断隐指令)完成,4~9 软件完成
    18. +
    +

    中断事件处理

    硬件故障中断

    硬件故障导致

    +
    处理过程
      +
    1. 中断处理程序 保护现场
    2. +
    3. 停止设备工作
    4. +
    5. 停止处理及运行
    6. +
    7. 向操作员报告
    8. +
    +

    程序性中断

    语法错误、逻辑错误、运行中异常

    +
    处理过程
      +
    1. 因人而异
    2. +
    3. 借助于信号机制
    4. +
    5. 操作系统将中断事件捕获交给应用程序
    6. +
    +

    I/O中断

    处理原则
      +
    1. I/O正常结束 待传输的下一个进程设置为就绪态
    2. +
    3. I/O发生故障 向设备发命令索取状态字、分析故障的确切原因、复执或转人工
    4. +
    5. I/O异常 报告操作员
    6. +
    7. 设备报到或设备结束 操作系统修改系统数据结构中相应设备的状态
    8. +
    +

    访管中断

    表示当前运行程序对操作系统功能的调用

    +
    处理过程
      +
    1. 程序执行访管指令,并通过适当方式指明系统调用号。
    2. +
    3. 通过中断机制进入访管中断处理程序,现场信息被保护到核心栈,按功能号实现跳转。
    4. +
    5. 通过系统调用人口地址表找到相应中断服务例程的入口地址。
    6. +
    7. 执行中断服务例程,正常情况下在结束后返回系统调用的下一条指令继续
      执行。
    8. +
    +

    时钟中断

    处理和时间有关的信息及决定是否程序调度
    和时间有关的信息:系统时间、进程的时间片、延时、使用CPU的时间、各种定时器。
    时钟分绝对时钟和间隔时钟

    +
    间隔定时器:
      +
    1. real 永远在计时(包括进程挂起时)
    2. +
    3. virtual 只在用户态计时
    4. +
    5. profile 在用户态和内核态都计时
    6. +
    +

    系统调用

    分类

      +
    • 设备管理
    • +
    • 文件管理
    • +
    • 进程管理
    • +
    • 进程通信
    • +
    • 内存管理
    • +
    +

    要运行在核心态

    由内核程序负责完成
    用户通过trap 来发起系统调用请求

    +

    用户态转向核心态

      +
    1. 用户程序要求操作系统的服务,如系统调用
    2. +
    3. 发生一次中断
    4. +
    5. 用户程序产生了一次错误状态
    6. +
    7. 用户程序企图执行一条特权指令
      用中断返回指令返回用户态
    8. +
    +

    主要过程

      +
    1. 传递系统调用参数
    2. +
    3. 执行trap指令
    4. +
    5. 执行相应的服务程序
    6. +
    7. 返回用户态
    8. +
    +

    大内核与微内核

    大内核的好处

    可充分利用模块之间有效特性,无可比拟的性能优势

    +

    微内核的特点

      +
    1. 添加系统服务时,不必修改内核
    2. +
    3. 有效分离接口
    4. +
    5. 微内核结构没有单一内核稳定
    6. +
    +

    处理机调度

    分级调度

      +
    1. 作业调度 又称宏观调度或者高级调度
    2. +
    3. 交换调度 又称中级调度或者内存调度
    4. +
    5. 进程调度 又称微观调度或者低级调度
    6. +
    7. 线程调度
      作业调度次数少,中级次数略多,进程调度频率最高
      进程调度和切换程序是操作系统内核程序
    8. +
    +
    +

    现代操作系统中,不能进行进程的调度与切换的情况有以下几种:

    +
      +
    1. 在处理中断的过程中,中断处理过程复杂,在实现上很难做到进程程切换,而且中断处理是系统工作的一部分,逻辑上不属于某一进程,不应被剥夺处理机资源。
    2. +
    3. 进程在操作系统内核程序临界区中。进入临界区后,需要独占式地访问共享数据,理论上必须加锁,以防止其他并行程序进入,在解锁前不应切换到其他进程运行,以加快该共享数据的释放。
    4. +
    5. 其他需要完全屏蔽中断的原子操作过程中。如加锁、解锁、中断现场保护、恢复等原子操作。在原子过程中,连中断都要屏蔽,更不应该进行进程调度与切换。
    6. +
    +
    +

    进程调度方式

      +
    • 非抢占(剥夺)式
    • +
    • 抢占(剥夺)式
    • +
    +

    调度的基本准则

      +
    1. CPU利用率
    2. +
    3. 系统吞吐量 单位时间内CPU完成作业的数量 作业数量/时间
    4. +
    5. 周转时间
      周转时间=作业完成时间-作业提交时间
      平均周转时间=(作业1的周转时间+…+作业n的周转时间)/n
      带权周转时间=作业周转时间/作业实际运行时间
      平均带权周转时间=n个带权周转时间/n
    6. +
    7. 等待时间 进程处于等处理机状态的时间之和
    8. +
    9. 响应时间 用户提交到系统首次响应的时间
    10. +
    +

    进程调度

    功能

      +
    1. 记录系统中所有进程执行的的情况
    2. +
    3. 选择占有处理机的过程
    4. +
    5. 进行进程上下文的切换
    6. +
    +

    进程调度的时机

      +
    1. 正在执行的进程执行完毕,或者进程被创建时
    2. +
    3. 执行中进程自己调用阻塞原语将自己阻塞起来,进入睡眠等待状态
    4. +
    5. 执行中进程提出IO请求后被阻塞
    6. +
    7. 在分时系统中时间片已经用完
    8. +
    9. 在执行完系统调用,系统程序返回用户程序时
    10. +
    11. 进程处于临界区时也可以调度
      以上是不可剥夺方式下的原因
    12. +
    13. 就绪队列中的某进程的优先级变得高于当前执行进程的优先级
    14. +
    +
    UNIX中
      +
    1. 进程自己调用sleep和wait进入睡眠
    2. +
    3. 由于系统调用结束返回用户态,调度标志被置位
    4. +
    5. 完成中断或trap
    6. +
    7. 时间片用完
    8. +
    9. 调用exit自我终止
    10. +
    +

    调度算法

    先来先服务算法FIFS

    算法简单效率低
    对长作业有利对短作业不利
    有利于CPU繁忙型作业,不利于IO繁忙型

    +

    短作业优先调度算法SJF

    对于长作业不利
    未考虑作业的紧迫程度
    作业的长短根据用户的估计而定(不准)
    SJF的平均等待时间、平均周转时间最少

    +

    优先级调度算法

      +
    1. 非剥夺式
    2. +
    3. 剥夺式
    4. +
    5. 静态优先级 创建进程时决定的
    6. +
    7. 动态优先级 进程运行过程中调整
    8. +
    +

    优先级的设置参照原则

      +
    1. 系统进程>用户进程

      +
    2. +
    3. 交互型进程 >非交互型进程

      +
    4. +
    5. IO型进程 >计算型进程

      +
    6. +
    +

    高响应比优先调度算法

    响应比Rp=(等待时间+要求服务时间)/要求服务时间
    因此

    +
      +
    1. 作业的等待时间相同时,要求服务时间越短,响应比越高,有利于短作业
    2. +
    3. 要求时间相同时,作业的响应比由其等待时间决定,(FCFS)
    4. +
    5. 对长作业,等待时间足够长时,其响应比便可升的很高
    6. +
    +

    时间片轮转调度算法

    适用于分时系统
    剥夺式
    当一个处于运行态的进程用完一个时间片后它的状态处于就绪

    +

    多级反馈队列调度算法

      +
    1. 设置多个就绪队列,每个队列优先级不同
    2. +
    3. 每个队列中进程执行的时间片的大小各不相同
    4. +
    5. 队列中FCFS,队列间时间片轮转
    6. +
    7. 允许抢占
    8. +
    +
    优势
      +
    1. 终端型作业用户:短作业优先
    2. +
    3. 短批处理作业用户:周转时间较短
    4. +
    5. 长批处理作业用户:不会长期得不到处理
    6. +
    +

    实时调度

    分为软实时调度和硬实时调度
    实时操作系统的特点:

    +
      +
    1. 有限等待时间(决定性)
    2. +
    3. 有限响应时长
    4. +
    5. 用户控制
    6. +
    7. 可靠性高
    8. +
    9. 系统出错处理能力强
    10. +
    +

    要求:

      +
    1. 很快的进程或线程切换速度
    2. +
    3. 快速的外部中断响应能力
    4. +
    5. 基于优先级的随时抢占式调度策略:
    6. +
    +
      +
    • 优先级+时间片轮转调度
    • +
    • 基于优先级的非抢占式调度
    • +
    • 基于优先级的固定抢占式调度
    • +
    • 基于优先级的随时抢占式调度
    • +
    +

    分类:

      +
    1. 静态表格法
      静态分析——直接产生调度结果
      多用于处理周期性任务
    2. +
    3. 静态优先级驱动抢占式调度算法
      也进行静态分析——不直接产生调度结果——只用来指定优先级
    4. +
    5. 动态计划调度算法
      在执行调度任务前排调度计划
    6. +
    7. 尽力而为调度算法
      不进行可能性分析
    8. +
    +

    实现调度算法

    所包涵的内容信息:

    +
      +
    1. 任务就绪时间或事件到达时间
      周期性事件可预知,但非周期性事件大部分时间不可预知
    2. +
    3. 开始时限
    4. +
    5. 完成时限
    6. +
    7. 处理时间
    8. +
    9. 资源要求
    10. +
    11. 优先级
    12. +
    +

    算法思想:按用户的时限要求顺序设置处理机
    抢占式的
    可用于非周期性任务调度

    +

    频率单调调度算法

    广泛应用于多周期性实时处理
    原理:
    频率越低优先级越低

    +

    内存管理基本原理

    功能

    1. 虚拟存储器

    进程中的目标代码、数据等的虚存地址组成的虚拟空间称为虚拟存储器

    +

    2. 地址变换

    内存地址(物理单元)的集合成为内存空间或物理地址空间
    物理地址空间是地址转换的最终地址

    +
      +
    • 静态地址重定位
      要求执行前完成链接
      必须占用连续的内存空间
    • +
    • 动态地址重定位
      依靠硬件地址变换机构
      该机构需要一个或多个基地址寄存器BR和一个或多个程序虚拟地址寄存器VR
      内存地址MA=BR+VR
      优点:
    • +
    +
      +
    1. 可以对内存进行非连续分配
    2. +
    3. 提供了实现虚拟存储器的基础
    4. +
    5. 有利于程序段的共享
    6. +
    +

    3. 内外存数据传输的控制

    用户控制:覆盖
    系统控制:交换、请求调入+预调入
    一个进程正在IO时,不能交换出内存

    +

    4. 内存的分配与回收

    连续分配方式
      +
    • 单一连续分配
      无外部碎片、可采用覆盖技术
      只能用于单用户、有内部碎片
    • +
    • 固定分区分配
      多道
      分区大小相等。用于一台计算机控制多个相同对象
      分区大小不等。多个较小,适量中分区,少量大分区
      程序太大就放不进任何分区了
      内存利用率低,会产生内部碎片
      无外部碎片
      有关管理通过分区说明表进行
    • +
    • 动态分区分配
      旗下的几种算法:
    • +
    +
      +
    1. 首次适应算法
      空闲地址递增的顺序链接
      具有最佳性能
    2. +
    3. 最佳适应算法
      容量递增方式链接
    4. +
    5. 最坏适应算法
      容量递减方式链接
    6. +
    7. 邻近适应算法
      首次适应的演变,在上次查找的位置开始查找
    8. +
    +

    5. 内存信息的共享与保护

    常用的内存信息保护方法:
      +
    1. 上下界保护法(硬件)
    2. +
    3. 保护键法
    4. +
    5. 界限寄存器与CPU的用户态或核心态工作方式相结合
    6. +
    +

    源程序转换为在内存中执行的程序步骤:

    +
      +
    1. 编译
    2. +
    3. 链接 逻辑地址——>物理地址
    4. +
    5. 装入
    6. +
    +
    程序链接的三种方式:
      +
    1. 静态链接
    2. +
    3. 装入时动态链接
    4. +
    5. 运行时动态链接
    6. +
    +
    装入的的三种方法:
      +
    1. 绝对装入
    2. +
    3. 可重定位装入
    4. +
    5. 动态运行时装入
    6. +
    +

    页式管理

    为了减少碎片以及为了只在内存存放那些反复利用的或即将执行的程序段与数据部分,而把那些不经常执行的程序段和数据存储在外存。
    不会产生外部碎片

    +

    名词

    每个进程平均产生半个块大小的内部碎片(页内碎片)
    进程的虚拟空间被划分为若干个等长的页(Page)
    每个页1~4K(旧)
    内存空间按页的大小分为片或页面/帧/框(Page framework)
    外存也以同样的单位划分,成为块(block)

    +

    地址结构

    分为两部分
    页号P——页内偏移量W

    +

    页表

    记录页面在内存中对应的物理块号
    一般存于内存中
    页表由页表项
    页表项的结构:页号——物理内存中的块号
    页表项的第二部分与地址的第二部分共同组成物理地址
    加入中断处理后的页表

    + + + + + + + + + + + + + + + +
    页号页面号中断位外存始址
    +

    | 页号 | 页面号 | 中断位 | 外存始址 |
    加入改变位后的页表
    | 页号 | 页面号 | 中断位 | 外存始址 | 改变位 |

    +

    计算过程

    页号P=逻辑地址A/页面大小L
    页内偏移量W=A%L
    如果页号P>=页表长度M,产生越界中断
    页表项地址=页表始址F+页号P页表项长度
    页表长度一般指有多少页
    页表项长度一般指页地址占多大的存储空间
    物理地址E=块内内容b
    页面大小L+页内偏移量W
    注:
    页表项的确定:
    n位逻辑地址空间对应的2^nB除以一页的大小mB
    得到的u=2^n/m页,页表项以字节编址,因此页表项大于等于log(u)/8

    +

    快表

    在地址转换机构中添加一个具有并行查找能力的高速缓冲存储器。

    +

    段式管理

    分段

    按进程中的自然段划分逻辑空间
    其逻辑地址由段号s——段内偏移量w组成
    段内连续,段间不要求连续

    +

    段表

    | 段号 | 段长 | 本段在主存中的地址 |
    | 段号 | 始址 | 长度 | 存取方式 | 内外 | 访问位 |

    +

    地址变换结构

      +
    • 逻辑地址A中前几位为段号S,后几位为段内偏移量W
    • +
    • 比较段号S和段表长度M,if(S>=M)越界中断
    • +
    • 段号S对应的段表项地址=段表始址F+段号S*段表项长度
    • +
    • 取出段表中该段的始址b,计算物理地址E=b+W
    • +
    +

    段的共享与保护

    都指向被共享的段的同一个物理副本。不能修改的代码成为纯代码或可重入代码(不属于临界资源)
    保护方法一般有两种:

    +
      +
    1. 存取控制
    2. +
    3. 地址越界保护
    4. +
    +

    段业式管理

    | 段号 | 页号 | 页内相对地址(偏移量) |
    在一个进程中,段表只有一个,而页表可能有多个

    +

    虚拟内存管理

    需要的支持

      +
    1. 页表机制(或段表机制),作为主要的数据结构
    2. +
    3. 中断机制,当用户程序要访问的部分尚未调入内存时,产生中断
    4. +
    5. 地址变换机构,逻辑地址到物理地址
    6. +
    +

    请求页表机制

    页表项
    | 页号 | 物理块号 | 状态位P | 访问字段A | 修改位M | 外存地址 |

    +
      +
    • 状态位P:用于指示是否调入内存
    • +
    • 访问字段A:用于页面置换
    • +
    • 修改位M:标识调入内存后是否被修改过
    • +
    • 外存地址:支持该页在外存上的地址,通常是物理块号
    • +
    +

    缺页中断机构

    缺页中断后,进程进入阻塞。
    属于内部中断

    +

    页面置换算法

    最佳置换算法(OPT)

    淘汰一个最长时间内不再被访问的页
    无法实现

    +

    先进先出页面置换算法(FIFO)

    会产生所分配的物理块数增大而故障数不减反增的异常现象(Belady异常)
    基于队列实现

    +

    最近最久未使用置换算法

    堆栈类算法

    +

    时钟(clock)置换算法

    每帧关联一个附加位(使用位)

    +

    改进的clock算法:

    增加一个修改位
    每帧有四种情况:

    +
      +
    1. 最近未被访问,也未被修改(u=0,m=0)
    2. +
    3. 最近被访问,但未被修改(u=1,m=0)
    4. +
    5. 最近位被访问,但被修改 (u=0,m=1)
    6. +
    7. 最近被访问,被修改 (u=1,m=1)
      按以上顺序进行淘汰
    8. +
    +

    页面分配策略

    驻留集大小

    三种策略

    +
      +
    1. 固定分配局部置换
    2. +
    3. 可变分配全局置换
    4. +
    5. 可变分配局部置换
    6. +
    +

    调入的时机

      +
    1. 预调页策略
    2. +
    3. 请求调页策略
    4. +
    +

    从何处调页

    请求分页系统的外存分为

    +
      +
    • 存放文件的文件区(连续分配方式)
    • +
    • 存放对换页面的对换区 (离散分配方式) IO更快
    • +
    +

    调入时机

      +
    1. 系统拥有足够的对换区空间:全部从对换区调入
    2. +
    3. 系统缺少足够的对换区空间:凡不会被修改的文件直接从文件区调入,可能被修改的文件在换出时调入对换区,以后需要的时候直接从对换区调入
    4. +
    5. UNXI方式:与进程有关的放入文件区。运行过被换出的页面放在对换区。进程请求的共享页面若被其他进程调入内存,则无需再从对换区调入
    6. +
    +

    抖动

    频繁发生缺页中断(抖动)的原因:某个进程频繁访问的页面数目高于可用的物理页帧数。
    虚拟内存技术可以在内存中保留更多的进程以提高系统效率。

    +

    工作集

    某段时间间隔内,进程要访问的页面集合。
    工作集大小一般比工作集窗口小很多
    分配给进程的物理块数(驻留集大小)大小要大于工作集大小

    +

    文件的一些概念

    定义

    以计算机硬盘为载体的储存在计算机上的信息的集合。
    计算机进行资源的调度和分配:进程
    用户进行的输入、输出中的基本单位:文件

    +

    文件的属性

      +
    • 名称
    • +
    • 标识符
    • +
    • 类型
    • +
    • 位置
    • +
    • 大小
    • +
    • 保护
    • +
    • 时间
    • +
    +

    文件的基本操作

      +
    • 创建文件
    • +
    • 写文件
    • +
    • 读文件
    • +
    • 文件重定位(文件寻址)
    • +
    • 删除文件
    • +
    • 截断文件
    • +
    +

    文件的分类

    按性质和用途

      +
    • 系统文件
    • +
    • 库文件
    • +
    • 用户文件
    • +
    +

    按组织形式

      +
    • 普通文件
    • +
    • 目录文件
    • +
    • 特殊文件
    • +
    +

    文件的打开与关闭

    打开文件相关联的信息:

    +
      +
    • 文件指针 系统跟踪上次读写位置,作为当前文件位置的指针
    • +
    • 文件打开计数 计数为零时,系统关闭文件,删除该条目
    • +
    • 文件磁盘位置
    • +
    • 访问权限
    • +
    +

    文件的逻辑结构

    无文件结构(流式文件)

    以字节Byte为单位

    +

    访问通过穷举搜索方式

    +

    源程序文件、目标代码文件等采用这种方式

    +

    有文件结构(记录式文件)

    顺序文件

    记录定长

    +

    顺序存储或链表形式存储

    +

    顺序搜索

    +

    两种结构:

    +
      +
    • 串结构 记录之间的顺序与关键字无关 按时间先后排序
    • +
    • 顺序结构 按关键字排序
    • +
    +

    索引文件

    第i条记录相对于第一条记录的地址 A=i*L

    +

    索引表

    + + + + + + + + + + + + + +
    索引号长度m指针ptr
    0m
    +

    索引顺序文件

    将每组中的第一个文件放在索引表中

    +

    直接文件或散列文件

    没有顺序的特性

    +

    目录结构

    文件控制块FCB

    FCB必须连续存放

    +

    FCB的有序集合称为文件目录

    +

    FCB包含的信息:

    +
      +
    1. 基本信息
    2. +
    3. 存取控制信息 文件存取权限等
    4. +
    5. 使用信息 文件建立时间、修改时间
    6. +
    +

    索引结点

    UNXI中的磁盘索引结点包含信息:

    +
      +
    1. 文件主标识符 个人或小组
    2. +
    3. 文件类型 普通文件、目录文件、特别文件
    4. +
    5. 文件存取权限
    6. +
    7. 文件物理地址 13个地址项iaddr(0)~iaddr(12)
    8. +
    9. 文件长度 以字节为单位
    10. +
    11. 文件链接计数
    12. +
    13. 文件存取时间
    14. +
    +

    文件被打开时有增加了以下内容:

    +
      +
    • 索引结点编号 标识内存索引结点
    • +
    • 状态 指示是否上锁或被修改
    • +
    • 访问计数
    • +
    • 逻辑设备号
    • +
    • 链接指针
    • +
    +

    目录结构

    所要执行的操作

    +
      +
    • 搜索
    • +
    • 创建文件
    • +
    • 删除文件
    • +
    • 显示目录
    • +
    • 修改目录
    • +
    +

    单级目录结构

    一个文件占一个目录

    +

    两级目录结构

    主文件目录MFD

    记录用户文件目录所在位置和用户名

    +
    用户文件目录UFD

    用户文件的FCB

    +

    多级目录结构

    树形目录结构

    +

    从根目录出发的路径是绝对路径

    +

    当前目录 :基于当前工作目录(相对路径)

    +

    方便对文件分类

    +

    无环图目录结构

    树形目录结构的基础上增加了一些指向同一结点的有向边

    +

    实现文件共享

    +]]>
    + + 操作系统 + + + 操作系统 + 进程 + +
    + + 记一个最基础的机器学习 + /2023/07/03/%E8%AE%B0%E4%B8%80%E4%B8%AA%E6%9C%80%E5%9F%BA%E7%A1%80%E7%9A%84%E6%9C%BA%E5%99%A8%E5%AD%A6%E4%B9%A0/ + Titanic

    作为Kaggle中最经典的机器学习入门算法,总结了机器学习的思路

    +

    导入数据

    import numpy as np # linear algebra
    import pandas as pd # data processing, CSV file I/O (e.g. pd.read_csv)

    + + +
    # Input data files are available in the read-only "../input/" directory
    # For example, running this (by clicking run or pressing Shift+Enter) will list all files under the input directory

    import os
    for dirname, _, filenames in os.walk('datasets/titanic'):
    for filename in filenames:
    print(os.path.join(dirname, filename))

    + +
    datasets/titanic\gender_submission.csv
    +datasets/titanic\test.csv
    +datasets/titanic\train.csv
    +
    +

    简单看一眼数据

    train_data = pd.read_csv("datasets/titanic/train.csv")
    train_data.head()
    + + + + +
    +

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    PassengerIdSurvivedPclassNameSexAgeSibSpParchTicketFareCabinEmbarked
    0103Braund, Mr. Owen Harrismale22.010A/5 211717.2500NaNS
    1211Cumings, Mrs. John Bradley (Florence Briggs Th...female38.010PC 1759971.2833C85C
    2313Heikkinen, Miss. Lainafemale26.000STON/O2. 31012827.9250NaNS
    3411Futrelle, Mrs. Jacques Heath (Lily May Peel)female35.01011380353.1000C123S
    4503Allen, Mr. William Henrymale35.0003734508.0500NaNS
    +
    + + + + +
    test_data = pd.read_csv("datasets/titanic/test.csv")
    test_data.head()
    + + + + +
    +

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    PassengerIdPclassNameSexAgeSibSpParchTicketFareCabinEmbarked
    08923Kelly, Mr. Jamesmale34.5003309117.8292NaNQ
    18933Wilkes, Mrs. James (Ellen Needs)female47.0103632727.0000NaNS
    28942Myles, Mr. Thomas Francismale62.0002402769.6875NaNQ
    38953Wirz, Mr. Albertmale27.0003151548.6625NaNS
    48963Hirvonen, Mrs. Alexander (Helga E Lindqvist)female22.011310129812.2875NaNS
    +
    + + + +

    用原始的方法看一下性别对幸存的影响

    women = train_data.loc[train_data.Sex == 'female']["Survived"]
    rate_women = sum(women)/len(women)

    print("% of women who survived:", rate_women)
    + +
    % of women who survived: 0.7420382165605095
    +
    +
    men = train_data.loc[train_data.Sex == 'male']["Survived"]
    rate_men = sum(men)/len(men)

    print("% of men who survived:", rate_men)
    + +
    % of men who survived: 0.18890814558058924
    +
    +

    使用决策树的方式对数据进行预测

    原理如下

    +

    image.png

    +
    from sklearn.ensemble import RandomForestClassifier

    y = train_data["Survived"]

    features = ["Pclass", "Sex", "SibSp", "Parch"]
    X = pd.get_dummies(train_data[features])
    X_test = pd.get_dummies(test_data[features])

    # 构建了100课随机树
    model = RandomForestClassifier(n_estimators=100, max_depth=5, random_state=1)
    model.fit(X, y)
    predictions = model.predict(X_test)

    output = pd.DataFrame({'PassengerId': test_data.PassengerId, 'Survived': predictions})
    output.to_csv('submission.csv', index=False)
    print("Your submission was successfully saved!")
    + +
    Your submission was successfully saved!
    +
    +
    train_data.describe(include='all')
    + + + + +
    +

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    PassengerIdSurvivedPclassNameSexAgeSibSpParchTicketFareCabinEmbarked
    count891.000000891.000000891.000000891891714.000000891.000000891.000000891891.000000204889
    uniqueNaNNaNNaN8912NaNNaNNaN681NaN1473
    topNaNNaNNaNBraund, Mr. Owen HarrismaleNaNNaNNaN347082NaNB96 B98S
    freqNaNNaNNaN1577NaNNaNNaN7NaN4644
    mean446.0000000.3838382.308642NaNNaN29.6991180.5230080.381594NaN32.204208NaNNaN
    std257.3538420.4865920.836071NaNNaN14.5264971.1027430.806057NaN49.693429NaNNaN
    min1.0000000.0000001.000000NaNNaN0.4200000.0000000.000000NaN0.000000NaNNaN
    25%223.5000000.0000002.000000NaNNaN20.1250000.0000000.000000NaN7.910400NaNNaN
    50%446.0000000.0000003.000000NaNNaN28.0000000.0000000.000000NaN14.454200NaNNaN
    75%668.5000001.0000003.000000NaNNaN38.0000001.0000000.000000NaN31.000000NaNNaN
    max891.0000001.0000003.000000NaNNaN80.0000008.0000006.000000NaN512.329200NaNNaN
    +
    +]]>
    + + 机器学习 + + + 机器学习 + +
    + + 记一个简单的人脸识别 + /2023/07/15/%E8%AE%B0%E4%B8%80%E4%B8%AA%E7%AE%80%E5%8D%95%E7%9A%84%E4%BA%BA%E8%84%B8%E8%AF%86%E5%88%AB/ + 导入所需的库文件:在Python项目中,使用以下代码导入OpenCV库

    +
    import cv2
    + +

    加载人脸识别模型:将预训练好的人脸识别模型(如Haar级联分类器)下载到本地并加载它

    +
    face_cascade = cv2.CascadeClassifier('C:/shyee/opencv/sources/data/haarcascades/haarcascade_frontalface_default.xml')
    + +

    调用摄像头并进行实时人脸识别:使用OpenCV调用电脑摄像头,并在每个视频帧上进行人脸检测和识别。

    +
    video_capture = cv2.VideoCapture(0)  # 0代表默认的摄像头设备

    while True:
    # 读取视频帧
    ret, frame = video_capture.read()

    # 将视频帧转换为灰度图像
    gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)

    # 在灰度图像上进行人脸检测
    faces = face_cascade.detectMultiScale(gray, scaleFactor=1.1, minNeighbors=5, minSize=(30, 30))

    # 在视频帧上标记出人脸
    for (x, y, w, h) in faces:
    cv2.rectangle(frame, (x, y), (x+w, y+h), (0, 255, 0), 2)

    # 显示实时视频帧
    cv2.imshow('Video', frame)

    # 按下'q'键退出循环
    if cv2.waitKey(1) & 0xFF == ord('q'):
    break

    # 释放摄像头资源
    video_capture.release()
    cv2.destroyAllWindows()
    +]]>
    + + 机器学习 + + + 人脸识别 + 目标检测 + opencv + +
    + + 需求分析学习笔记-1 + /2020/03/17/%E9%9C%80%E6%B1%82%E5%88%86%E6%9E%90%E5%AD%A6%E4%B9%A0%E7%AC%94%E8%AE%B0-1/ + 3-3需求分析案例

    “Android点餐系统”项目案例需求获取资料介绍如下:

    +

    (1)目标和范围

    本软件主要作用是为点餐者提供一套可以在移动设备(手机、平板)上运行的点餐软件。 系统分为前台和后台,前台是点餐者使用的,点餐者可以在移动设备上查看餐馆所有的菜目、价格、简单的菜品介绍以及餐馆的特色菜介绍,同时点餐者还可以查看、取消自己已经挑选的菜品,最后上传订单。后台是管理员使用的,管理员可以在后进行订单管理、用户管理、菜谱管理等。

    +

    (2)系统角色和职责

    系统的使用人群包括两类管理员:系统的维护,订单管理、菜品的增删。

    +

    普通用户:注册账号,点餐、座位预订。

    +

    (3)系统处理功能要求

    查询菜品
    设置菜品
    顾客下单
    订单处理
    数据处理

    +

    (4)系统其他要求

    本系统客户端要求符合大众操作习惯,与网上其他的Android系统App操作方式保持基本一致。餐馆要求每笔订单交易误差不得超过工角,每天交易额的误差不得超过100元。5年内价位在500元以上的Android手机都可以流畅运行该系统。

    +

    第一阶段

    工作的输入是需求定义阶段产生的业务事件列表和报表列表,输出的是领域模型和用例模型。

    +

    针对每个业务事件进行业务流程分析、业务实体分析和用例分析;

    +

    针对每类报表进行业务实体分析和用例分析。

    +

    业务流程分析

    在分析过程中,要注意抓住核心业务和主要活动点、部门内以及部门之间的衔接,工作中的烦琐及反复的环节,成本高、效率低、时间长的环节以及任务转手次数较多的环节。

    +

    “Android点餐系统”中的主要业务就是点餐,我们要围绕点餐的主业务展开分析。

    +

    业务流程分析的过程中的三个关键的要点

    一是理解流程的层次性,其中包含三大层次,有组织级,部门级
    岗位级;

    +

    二是了解流程的类型,包括生产性流程,管理性流程和支持性流
    程;

    +

    三是掌握以业务事件识别、寻找流程的技巧。

    +

    产物

    跨职责流程图
    活动图
    数据流图

    +

    基于Android平台的点餐系统的总体流程包括的步骤有

    (1)顾客在智能手机上登录点餐系统客户端后,自动进入
    菜谱界面,查看菜谱;
    (2)顾客选择菜品进行下单;
    (3)顾客选择菜品数量,若需在餐厅用餐还需选择座位号;
    (4)选择完成并确定后,提交订单;
    (5)订单提交后,订单数据会上传到服务器;
    (6)订单提交后,顾客可以在客户端查看自己的订单情况;
    (7)在管理员未确认订单之前,顾客可以对订单进行修改或取消操作;
    (8)管理员登录点餐系统服务器端,对用户订单进行确认;
    + +

    跨职责流程图的应用

    跨指责流程图绘制要点是在进行业务流程分析时,采用的关键入手点为部门级的业务流程,也就是从业务事件出发,分析该业务事件会触发的一系列活动。要真正保障绘制出来的跨职责流程图是真实、有效的,就必须强化用户的参与。

    +

    我们应先找到业务事件的负责人,然后通过设问的方式,让他描述响应该业务事件所进行的活动,说明活动的执行岗位以及它们之间的关系、数据传递。

    +

    (三)活动图
    活动图是一种表述过程机理、业务过程以及工作流的技术。它可以用来对业务过程、工作流建模,也可以对用例实现甚至是程序实现来建模。
    活动图的主要元素包含初始节点活动终点活动节点转换分支与监护条件分岔汇合等。

    +

    数据流程图

    点餐系统由客户端和服务器端两部分组成,客户端主要负责点菜,服务器端负责信息管理。

    +
    客户端的基本流程
    (1)用户输入正确的登录信息进入系统,若登录信息不对,系统提示重新输入登录系统,直到用户成功登录系统,新用户要先进行注册并注册成功才可以登录系统。
    (2)用户成功登录系统后,可先查看菜品信息,选择菜品及数量,若需在餐馆用餐还需选择座位,完成后进行下单操作。
    (3)用户可以查看自己的订单,在订单未确定的情况下,可以修改或取消订单。
    + +
    服务器端的基本流程
    (1)管理员输入正确的登录信息进入系统,若登录信息不对,系统会提示重新输入登录信息,直到管理员成功登录系统。
    (2)管理员成功进入系统后,可进行各类信息的管理,如菜品信息管理、用户信息管理、订单管理等,其实就是对上述信息进行添加、删除及修改操作。
    + +

    业务实体分析

    要了解这个问题域中有哪些业务实体,它们之间存在什么样的逻辑关系、数量关系,以及有什么相应的结构规则。

    +

    1.业务实体分析任务概述

    “自底向上”

    +

    识别出业务实体
    确定实体间关系
    定义实体关健属性

    +

    业务实体分析的产物有两种可选的模型,包括类图和E/R模型也叫实体关系图。

    +

    2.类图

    根据边界类、控制类、实体类帮助分析系统中的类

    (1)领域建模方法

    +

    领域建模时,其工作主要就是识别标识类、明确类之间的逻辑关系和数量关系以及添加重要的结构规则三个方面。

    +

    (2)建立类之间的关联

    +

    (3)添加类的重要属性

    +
    分析模型中有3种十分有用的构造型即实体类、控制类和边界类。

    实体类:即实体对象的抽象,通常来自域模型也就是现实世界,用来描述具体的实体,通常映射到数据库表格与文件中;

    +

    控制类:即控制对象的抽象,主要用来体现应用程序的执行逻辑,将其抽象出来,可以使得变化不影响用户界面和数据库中的表;

    +

    边界类:即边界对象的抽象,通常是用来完成参与者(用户、外部系统)与系统之间交互的对象,例如From、对话框、菜单、接口等。

    +

    3.E/R图应用基础

    数据建模过程的优势体现在能够更好地与后续的数据库设计
    结合;

    +

    缺点是语义相对于类图来说更弱一些,同时对面向对象开发的指导作用相对差- - .些。

    +

    概念模型是需求人员的视图,等价于现在出镜率很高的领域模型;

    +

    逻辑模型是开发人员(包括设计人员)的视图,它约等于面向对象分析与设计方法中提到的“分析模型”。

    +
    概念模型与逻辑模型具体区别在于两个方面

    完整性:逻辑模型在完整性上要比概念模型更胜筹,通过在需求细化、设计的阶段会对类的属性进行细化,会补充-些新的类;

    +

    加工方式:概念模型的原则是忠于问题域,而逻辑模型则会从实现的便利性和需要的角度进行细化,具体来说可能会对一些类进行分拆、合并。

    +]]>
    + + 需求分析 + + + 需求分析 + +
    + + 项目预算 + /2021/03/12/%E9%A1%B9%E7%9B%AE%E9%A2%84%E7%AE%97/ + 项目预算

    编制项目的预算

    项目的预算是用来记录和控制项目的花费情况的。是编制项目可行性的重要组成部分。它包括项目的成本和投资回报率。

    +

    (1)编制预算的基础

    +

    (2)自底向上成本估算法

    +

    (3)项目完成时的预算

    +

    (4)项目的零基预算

    +

    预算编制

    预算对项目的前进方向起到财务向导的作用

    +

    编制预算,首先要把注意力集中在项目的范围上制定预算计划,把项目分解成若千个步骤和阶段( WBS Work Break down Structure )

    +

    预算会得到批准-执行项目

    +

    预算会被削减-缩小项目

    +

    预算会被拒绝-放弃项目

    +

    自底向上的成本估算法

    沿着从项目的底层和根源到项目的交付成果这个方向来制定预算的方法

    把项目分成若千个阶段,计算每个阶段的成本

    +

    注意整合阶段,考虑停工、拖延、和其他工作上的投入

    +

    考虑完成项目每个阶段所需要的满负荷工作量(小时数)

    +

    考虑专业服务的成本(如聘请专家等)

    +

    考虑设备、产品、服务、人员的成本

    +

    考虑生产成本,如打字、复印、用户手册、网页设计及开发费用等

    +

    注意:

    +

    时间是一个变动因素,价格会随时间而变动

    +

    设备、产品、服务、人员的成本会随时间而变动

    +

    预算允许的改变

    把项目分成若千个阶段,计算每个阶段的成本

    +

    把每个阶段最好和最坏的情况分解成各个可能的价格波动情况,从而计算每个阶段的平均预算值

    +

    估算中有些情况根本不会达到最差的情况,甚至不会差到平均水平,有些则会达到最坏情况,甚至还差

    +
      +
    • 可以根据以往的经验
    • +
    • 可以借鉴别人的经验
    • +
    • 供应商的固定报价
    • +
    • 预算部门门的标准成本
    • +
    +

    预算偏差容忍度

    与管理层协商预算偏差容忍度,几个或十几个百分点

    +

    项目完成时的预算

    项目完成时的预算就是项目各个阶段的预算的总和。是整个项目预算的保障。

    +

    项目经理把项目分成不同的阶段,每个阶段都有自己的预算

    +

    优点是:

    +
      +
    • 公司不需要在项目的-开始就把预算的全部资金都分配下去,而是只分配项目启动阶段的资金
    • +
    • 公司可以可以根据需要在不同的项目之间调用资金,加快资金的利用率
    • +
    • 它能够使参与项目的人通过项目各个阶段的成本来把握项目,从而得到整个项目的成本
    • +
    +

    项目的零基预算

    总是从零开始进行的项目预算方法,它不是在其他类似的项,目的基础上把项目一项项加入的方法。如:在去年的成本之上增加20%的预算方法。

    +

    它迫使项目经理计算出项目的每个阶段的实际成本

    +

    好像在做重复的工作,但它迫使你关注实际成本的变化

    +

    使项目经理产生一种责任感

    +

    在去年的成本之上增加百分比的预算方法的缺点:

    +
      +
    • 容易漏项
    • +
    • 容易忽略成本随时间的变化
    • +
    • 项目的预算不够准确
    • +
    +

    项目支出的确认与跟踪

    (1 )确定项目的支出

    +

    (2)跟踪项目的支出

    +

    (3)防止项目失控

    +

    确定项目的支出

    要确定项目预算的支出,必须考虑:

    +

    员工个人、员工的组织形式、硬件花费、项目范围、时间等

    +

    要创建准确的项目预算,周密的计划和丰富的经验

    +

    物品的成本

    +
      +
    • 硬件的使用方式决定物品的成本
    • +
    • 自己购买组装,或由供应商组装
    • +
    • 需要多少时间、有哪些工作、工作质量如何?
    • +
    +

    还有别的选择吗?

    +

    软件许可证-也影响成本

    +
      +
    • 每个站点、每个连接、每个服务器、按使用次数的证书
    • +
    +

    外包方式-影响成本

    +
      +
    • 节约成本吗?增加效率吗?信誉如何?等
    • +
    +

    估算工作时数

    +
      +
    • 项目中最昂贵的就是时间
    • +
    • 按项目任务计算每个人的时间和费用
    • +
    • 统计所有人的时间和费用
    • +
    +

    跟踪项目的支出

    千万不要随便说“好吧”

    +
      +
    • 供应商会给你一些好处,再让你增加一些成本
    • +
    • 每一部分增加一点成本,就会造成阶段成本的增加
    • +
    • 每个阶段成本的增加就会造成项目的大幅度增加
    • +
    • 千万别购买与项目无关的东西
    • +
    • 千万别贪便宜
    • +
    +

    做记录表,记录每次购买的东西

    +

    检查购买是否符合项目计划,项目预算

    +

    可以用MS Excel或MS project来跟踪

    +

    跟踪的内容有:

    +
      +
    • 工作时间:团队成员的工作时间,供应商的工作时间,加班时间
    • +
    • 购买的物品:所有购买的软件、硬件、工具和其他办公用品,包括用现金支付的小东西,如皮萨饼,晚餐等
    • +
    • 软件许可证:各种证件的种类、数量和价格
    • +
    • 工作站和服务器
    • +
    • 各种咨询服务、讲座、培训、书籍等费用
    • +
    +

    防止项目失控

    失控的项目的特点

    +
      +
    • 项目范围增加,功能扩大
    • +
    • 时间失控,预算失控
    • +
    • 信誉或失业严重失控
    • +
    +

    造成项目失控的原因:

    +
      +
    • 缺乏周密的计划:在项目的各个阶段缺乏周密的计划
    • +
    • 缺乏项目视图:没有给项目确定一个清楚明确的视图
    • +
    • 项目范围的扩大:管理层和别的部门不断给项目增加要求
    • +
    • 缺乏领导:项目的发展沿着非正确的方向前进,没有好好地领导项目的发展
    • +
    +

    如何防止项目的失控:

    +
      +
    • 制定周密的计划,并严格按着计划执行
    • +
    • 清楚项目视图,给项目确定一个清楚明确的视图
    • +
    • 限制项目范围的扩大,若非扩大不可,则应改变计划、预算
    • +
    • 加强项目的领导
    • +
    +

    小结

    千万不要轻易说”好吧”

    +]]>
    + + 项目管理 + + + 项目管理 + 项目预算 + +
    + + pic + /2023/05/09/pic/index/ + + + + MyBatis(八) + /2020/04/03/mybatis/MyBatis-%E5%85%AB/ + mybatis 缓存 + +

    查询缓存

    一级缓存:同一个SqlSession对象

    image-20200331082951809

    +

    MyBatis默认开启一级缓存,如果用同样的SqlSession对象查询相同的数据,则只会在第一次查询时向数据库发送SQL语句,并将查询的结果放入到SQLSESSION中(作为缓存在) ;后续再次查询该同样的对象时则直接从缓存中查询该对象即可(即省略了数据库的访问)。

    +

    二级缓存

    +

    Mybatis自带二级缓存: [同一个namespace]生成的mapper对象

    +

    MyBati s默认情况没有开启二级缓存,需要手工打开。

    +

    conf.xml中

    +
    <!-- 开启二级缓存 -->
    <setting name="cacheEnable" value="true"/>
    + +

    mapper中

    +
    <!-- 声明此namespace开启二级缓存 -->
    <cache/>
    + +

    异常提示:NotSerializableException可知,MyBatis的二级缓存是将对象放入硬盘文件中

    +

    序列化:内存->硬盘

    +

    反序列化:硬盘->内存

    +

    准备缓存的对象,必须实现了序列化接口( 如果开启的缓存Namespace="top.eshyee.mapper.StudentMapper" 可知序列化对象为Student,因此需要将Student序列化(序 列化Student类,以及Student的级联属性、和父类)

    +

    触发将对象写入二级缓存的时机: SqlSession对象的close()方法

    +

    回顾: namespace的值 就是接口的全类名(包名.类名) ,通过接口可以产生代理对象(Mapper对象)

    +

    –>namespace决定了Mapper对象的产生

    +

    结论:只要产生的xxxMapper对象来自于同一个namespace,则这些对象共享二级缓存。

    +

    如果是同一个SqISession对象进行多次相同的查询,则直接进入一级缓存查询;

    +

    image-20200331084348373

    +

    如果不是同一个SqISession对象进行多次相同的查询(但是均来自同一个namespace)则进入二级缓存查询

    +

    如果一个namespace, 如果有多个xxMapper. xml的namespace值相同, 则通过这些xxxMapper. xml产生的xxMapper,仍然共享二级缓存。

    +

    禁用:

    +

    在需要禁用的select标签中的usecache属性改为false

    +

    清理:与清理一级缓存的方法相同,一般执行增删改时会清理掉缓存 ,设计的原因是为了防止脏数据

    +

    commit();

    +

    commit会清理一级和二级缓存;但是清理二级缓存时,不能是查询自身的commit()

    +

    改标签

    +

    在select标签中设置flushCache= "true"

    +

    命中率:
    1 :0% 0.0

    +

    2:50% 0.5

    +

    3:2/3 0.666

    +

    4:3/4 0.75

    +

    三方提供的二级缓存:

    +

    ehicache、memcache

    +

    要想整合三方提供的二级缓存(或者自定义二级缓存) ,必须实现org.apache.ibatis.cache.Cache接口,该接口的默认实现类是PerpetualCache

    +

    整合ehcache二级缓存:

    +

    Ehcache-core.jar
    mybatis- Ehcache.jar
    slf4j-api.jar

    +

    编写ehcache配置文件Ehcache.xml

    +
    <ehcache xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:noNamespaceSchemaLocation="ehcache.xsd" updateCheck="true"
    monitoring="autodetect" dynamicConfig="true">
    <!-- 当二级缓存的对象超过内存限制时(缓存对象的个数>maxElements InMemory
    ),存放入的硬盘路径 -->
    <diskStore path="D:\Ehcache" />
    <!-- maxElementsInMemory:设置在内存中缓存对象的个数
    maxElementsOnDisk:设置在硬盘中缓存对象的个数
    eternal: 设置缓存是否永远不过期
    overflowToDisk:当内存中缓存的对象个数超过maxElementsInMemory的时候,是否转移到硬盘中
    timeToIdleSeconds:当2次访问超过该值的时候,将缓存对象失效
    timeToliveSeconds:一个缓存对象最多存放的时间(生命周期)
    diskExpiryThreadIntervalSeconds:设置每隔多长时间,通过一个线程来清理硬盘中的缓存
    memoryStioreEvictionPolicy: 当超过缓存对象的最大值时,处理的策略 LRU,FIFO,LFU
    -->

    <defaultCache

    maxElementsInMemory="1000"
    maxElementsOnDisk="1000000"
    eternal="false"
    overflowToDisk="false"
    timeToIdleSeconds="100"
    timeToLiveSeconds="100"
    diskExpiryThreadIntervalSeconds="120"
    memoryStoreEvictionPolicy="LRU">
    </defaultCache>

    </ehcache>
    + +

    配置mapper

    +
    <cache type= "org.mybatis.caches.ehcache.EhcacheCache">
    <property name= "maxELementsInMemory" value= "2000" />
    可以覆盖掉默认值
    </cache>
    + +]]>
    + + 技术 + MyBatis + +
    + + MyBatis系列(七) + /2020/03/25/mybatis/MyBatis%E7%B3%BB%E5%88%97-%E4%B8%83/ + log4j和延迟加载 + +

    在之前下载的mybatis包中找到log4j并导入到项目

    +

    开启日志

    如果不指定,Mybatis就会根据以下顺序寻找日志
    SLF4J →Apache Commons Logging →Log4j 2→Log4j → JDK logging
    日志级别:
    DEBUG< INFO< WARN< ERROR
    如果设置为info, 则只显示info及以上级别的信息;
    建议:
    在开发时设置debug,在运行时设置为info或以上。

    +
    <settings>
    <setting name="logImpl" value="LOG4J" />
    </settings>
    + +

    每次运行就会出现诸如此类的debug

    +
    DEBUG [main] - PooledDataSource forcefully closed/removed all connections.
    DEBUG [main] - PooledDataSource forcefully closed/removed all connections.
    DEBUG [main] - PooledDataSource forcefully closed/removed all connections.
    DEBUG [main] - PooledDataSource forcefully closed/removed all connections.
    DEBUG [main] - Opening JDBC Connection
    DEBUG [main] - Created connection 961160488.
    DEBUG [main] - Setting autocommit to false on JDBC Connection [oracle.jdbc.driver.T4CConnection@394a2528]
    + +

    配置延迟加载

    嵌套查询多用于延迟加载的设计

    +

    具体如下

    +

    一对一:查学生和学生卡信息

    在xml中

    +
    <!-- 延迟加载 -->
    <select id="qSByNWithMapO2OLazy" resultMap="student_card_Lazyload_map" parameterType="int">
    <!-- 先查学生 -->
    select * from student
    </select>
    <resultMap type="student" id="student_card_Lazyload_map">
    <id property="stuNo" column="stuNo"/>
    <result property="stuName" column="stuName"/>
    <result property="stuAge" column="stuAge"/>
    <result property="graName" column="graName"/>
    <result property="stuSex" column="stuSex"/>
    <!-- 此次采用延迟加载:在查询学生时,并不立即加载学生证信息
    通过select在需要的时候再查学生证
    -->
    <association property="card" javaType="StudentCard" select="top.eshyee.mapper.StudentCardMapper.querycardbyid" column="cardid">
    <!-- <id property="cardId" column="cardId"/>
    <result property="cardInfo" column="cardInfo"/> -->
    </association>
    </resultMap>
    + +

    新建Cardmapper

    +
    <!-- 查询学生信息 -->

    <select id="querycardbyid" parameterType="int" resultType="top.eshyee.entity.StudentCard">
    select * from studentCard where cardid=#{cardId}
    </select>
    + +

    一对多:查班级和学生信息

    新建班级mapper

    +
    <select id="qCASLazy" resultMap="class_student_classid_lazy" parameterType="int">
    select c.* from studentclass c
    </select>

    <resultMap type="top.eshyee.entity.StudentClass" id="class_student_classid_lazy">
    <id property="classId" column="classId" />
    <result property="className" column="className"/>
    <!-- 属性类型用javatype 属性的元素类型用oftype -->
    <!-- 延迟加载 -->
    <collection property="student" ofType="top.eshyee.entity.Student" select="top.eshyee.mapper.StudentMapper.queryStuByClassId" column="classId">

    </collection>
    </resultMap>
    + +

    在studentmapper中

    +
    <!-- 延迟加载一对多 查询班级中的所有学生 -->
    <select id="queryStuByClassId" parameterType="int" resultType="top.eshyee.entity.Student">
    select * from student where classId=#{classId}
    </select>
    + +

    一对多和一对一的延迟加载配置方法相同

    +]]>
    + + 技术 + MyBatis系列 + + + log4j + 延迟加载 + +
    + + 面向对象方法学 + /2021/03/12/%E9%9D%A2%E5%90%91%E5%AF%B9%E8%B1%A1%E6%96%B9%E6%B3%95%E5%AD%A6/ + 面向对象方法学方程式

    对象 + 类 + 继承 + 消息

    +

    基本概念

    对象:具有相同状态的一组操作的集合。对属性值和操作的封装。

    +

    类:对具有相同数据和相同操作的一组相似对象的定义。

    +

    类是一个支持继承的抽象数据类型,对象是类的实例.

    +

    实例:由某个特定类所描述的具体对象

    +

    消息:要求某对象执行在定义它的类中所定义的某个操作的规格说明。

    +

    三部分:

    +
      +
    • 接收消息的对象
    • +
    • 消息名
    • +
    • 0 或多个变元
    • +
    +

    封装性:数据和操作集中起来放在对象内部。

    +

    继承:子类自动共享基类中定义的数据和方法的机制。

    +
      +
    • 提高程序可复用性(接口设计的复用,不是代码实现复用)
    • +
    • 派生类的功能可被基类指针引用,提高程序可扩充性和可维护性。
    • +
    +

    多态性:在类等级不同层次可共享一个方法名,不同层次每个类按各自

    +

    需要实现这个方法。

    +

    重载:函数重载;运算符重载

    +

    与传统方法比较

    传统方法:系统是过程的集合;

    +

    面向对象方法:系统是交互对象的集合。

    +

    面向对象优点

    (1)与人类习惯思维方法一致

    +

    (2)稳定性好

    +

    (3)可重用性好

    +

    (4)易开发大型软件产品

    +

    (5)可维护性好

    +

    UML

    全称为Unified Modeling Language 目前最流行的面向对象建模语

    +

    必要性

    捕获商业流程

    +

    促进沟通

    +

    管理复杂性

    +

    定义软件构架

    +

    促进软件复用

    +

    面向对象方法的发展

    UML 是通用可视化建模语言,用于对软件进行描述、可视化处理、构造和建立软件系统制品的文档。

    +

    UML 适用于各种软件开发方法、软件生命周期的各个阶段、各种应用领域以及各种开发工具,是总结以往建模技术经验并吸收当今优秀成果的标准建模方法。

    +

    UML 的形成、定义、优势

    1997 年 UML1.1 被对象管理组织 OMG 确定为标准建模语言是软件工程领域最重要的、具有划时代重大意义的事件。 UML 是一种定义良好、易于表达、功能强大且普遍适用的标准的图形化建模语言 , 用它可以简明、准确地为目标系统建立模型 。它融入了软件工程领域的新思想、新方法和新技术。它的作用域不限于支持面向对象的分析与设计,还支持从需求分析开始的软件开发的全过程。

    +

    UML 组成

    由视图、图、模型元素和通用机制几部分组成。

    +

    视图:从不同角度描述系统,建立多个模型。

    +

    图: 一个视图由多张图组成, UML 定义 9 种图。有机结合可形成任何形式视图。

    +

    模型元素:图中使用概念(用例、类、对象),统称模型元素。在图中用视图元素(图形符号)表示。

    +

    通用机制:通过通用机制为图通过附加信息,如注释、标签值等。

    +

    用例视图

    定义了系统的外部行为,是最终用户、分析人员和测试人员所关心.该视图定义了系统的需求,因此约束了描述系统设计和构造的某些方面的所有其他视图。

    +

    主要元素:用例和执行者。

    +

    执行者:描述与系统交互的人或物,代表外部实体(如用户、硬件设备或其它软件系统)

    +

    设计视图

    描述的是支持用例视图中规定的功能需求的逻辑结构。它由程序组件的定义,主要是类、类所包含的数据、类的行为以及类之间交互的说明组成。

    +

    实现视图

    描述构造系统的物理组件,这些组件包括如可执行文件、代码库和数据库等内容.这个视图中包含的信息与配置管理和系统集成这类活动有关.

    +

    如何建立用例模型

    1、发现执行者

    发现执行者的原则、实例

    +

    谁使用该系统;

    +

    谁改变系统的数据;

    +

    谁从系统获取信息;

    +

    谁需要系统的支持以完成日常工作任务

    +

    谁负责维护、管理并保持系统正常运行

    +

    系统需要应付那些硬件设各;

    +

    系统需要和那些外部系统交互;

    +

    谁对系统运行产生的结果感兴趣。

    +

    2、发现用例

    向执行者提出问题获取用例:

    +

    执行者需获取何种功能,需要作什么;

    +

    执行者需读取、产生、删除、修改或存储系统中某种信息

    +

    系统发生事件和执行者间是否需要通信;

    +

    3、确定用例间关系

    关系包括四种:泛化、扩展、包含、使用

    +

    泛化关系:一般与特殊关系。

    +

    扩展关系:允许一个使用案例扩展另一案例提供的功能。

    +

    包含关系:一个基本 UseCase 行为包含另一个 UseCase 行为。

    +

    使用关系:某个用例使用另外一个用例的功能。

    +]]>
    + + 计算机 + + + 对象 + + 继承 + 软件工程 + +
    + + MyBatis系列(三) + /2020/03/02/mybatis/MyBatis%E7%B3%BB%E5%88%97-%E4%B8%89/ + 关于类型处理器和resultmap

    + + +

    类型处理器(类型转换器)

      +
    1. MyBatis自带一些常见的类型处理器

      +
    2. +
    3. 也可以自定义Mybatis类型处理器

      +
    4. +
    +

    JAVA 数据类型 –数据库(数据类型)

    +

    比如:

    +

    实体类 Student :Boolean stuSex true:男 /false:女

    +

    表中Student : number stuSex 1:男 / 0:女

    +

    自定义类型转换器

    假设

    我要在Student表里面新建一个性别列 男生用1 表示 女生用0表示(number类型),

    +

    此时实体类中我男生用的true 女生用的false(Boolean,仅仅是举个例子)。

    +

    数据类型不匹配此时数据类型不匹配。

    +

    创建类型转换器

    需要实现TypeHandler接口 此接口有一个实现类 BaseTypeHandler

    +

    因此实现转换器有两种方法 实现 接口TypeHandler 和 继承BaseTypeHandler(简单)

    +

    所以这里采用后者,去extendthis method。

    +
    准备工作

    新建一个Boolean的属性 叫做stuSex 。

    +

    private Boolean stuSex形成get set方法

    +
    转换器

    新建一个转换器继承BaseTypeHandler,编译器会自动生成三个方法

    +
    //	get是DB数据-->java数据
    public Boolean getNullableResult(ResultSet rs, String columnName) throws SQLException {
    return rs.getInt(columnName)==1?true:false;
    }

    public Boolean getNullableResult(ResultSet rs, int columnIndex) throws SQLException {
    return rs.getInt(columnIndex)==1?true:false;
    }

    public Boolean getNullableResult(CallableStatement cs, int columnIndex) throws SQLException {
    return cs.getInt(columnIndex)==1?true:false;
    }

    // set是java数据-->DB数据
    public void setNonNullParameter(PreparedStatement ps, int i, Boolean parameter, JdbcType jdbcType) throws SQLException {

    if(parameter) {
    ps.setInt(i, 1);
    }else {
    ps.setInt(i, 0);
    }
    }
    + +

    其中,

    +

    ps:PreparedStatement对象
    i:PreparedStatement对象操作的参数的位置
    parameter:Java值
    jdbcType:jdbc操作的数据类型

    +

    这里用到了三元运算符,想起了之前一个写个人网站用到的一个三元运算符🤦‍♂️(更)。

    +
    conf配置

    在config中加上转换器

    +
    <typeHandlers>
    <typeHandler handler="转换器类名" javaType="Boolean" jdbcType="INTEGER"/>
    </typeHandlers>
    + +

    这样就算是好了 测试一下

    +
    mapper配置

    使用了转换器的查询
    1如果类中属性和表中的字段类型都能合理识别(String-varchar2),则可以使用resultType resultType=”top.eshyee.entity.Student”
    否则(boolean-integer)使用resultMap
    2如果类中的属性名和表中的字段名都能够合理识别(stuNo-stuno)则可以使用resultType
    否则(id-stuno)使用resultMap

    +
    <select id="queryStudentBystuNumConverter" resultMap="studentResult" parameterType="int">
    select * from student where stuno= #{stuno}
    </select>
    <resultMap type="top.eshyee.entity.Student" id="studentResult">
    <id property="stuNo" column="stuno"/>
    <result property="stuName" column="stuname"/>
    <result property="stuAge" column="stuage"/>
    <result property="graName" column="graname"/>
    <result property="stuSex" column="stusex" javaType="boolean" jdbcType="INTEGER"/>
    </resultMap>
    + +

    resultMap

    resultMap可以实现两个功能:
    1 类型转换
    2 属性-字段名之间的映射关系

    +

    分为主键id和非主键result
    如果实体类中的属性跟数据库中那个的字段名叫法不一样,从下面的映射关系中也可以更改 。

    +

    这样就好了,可以在test.java中测试一下了。🥐

    +

    总结

    以前用过别的方法来转换数据库数据与java数据 但是这个更系统一些吧。

    +

    希望这次不要再出个3.5了。🐷

    +]]>
    + + 技术 + MyBatis系列 + + + 类型处理器 + +
    + + MyBatis系列(二.5) + /2020/02/28/mybatis/MyBatis%E7%B3%BB%E5%88%97-%E4%BA%8C.5/ + 关于一些优化🍔

    + + +

    数据库连接配置

    config.xml中如果配置了很多的东西,这时在想去更改数据库配置的一些参数显得尤为麻烦,这是可以新建一个properties来写一些kv对,再在config中使用<properties>标签来传值貌似就会简化一部分操作。

    +

    因此在src下新建一个db.properties文件。如下配置:

    +
    driver=oracle.jdbc.driver.OracleDriver
    url=jdbc:oracle:thin:@127.0.0.1:1521:ORCL
    username=scott
    password=tiger
    + +

    config.xml中添加

    +
    <properties resource="db.properties"></properties>
    + +

    数据源中配置:

    +
    <property name="driver" value="${driver}" />
    <property name="url" value="${url}" />
    <property name="username" value="${username}" />
    <property name="password" value="${password}" />
    + +

    如此,每次想对数据源做更改的时候只需改变kv对即可。

    +

    mybatis的全局参数设置更改

    谨慎更改👨‍🔧

    +
    <settings>
    <setting name="" value=""/>
    </settings>
    + +

    设置别名

    top.eshyee.entity.Student太长了🤦‍♀️,想要改别名。

    +

    (大小写不敏感)

    +

    选择两种方式:

    +
    设置单个别名
    <typeAliases>
    <typeAlias type="top.eshyee.entity.Student" alias="student"/>
    </typeAliases>
    + +
    批量设置别名
    <typeAliases>
    <package name="top.eshyee.entity"/>
    </typeAliases>
    + +

    还有一些内置别名。

    +

    小节

    怎么方便怎么来呗🏊‍♀️

    +]]>
    + + 技术 + MyBatis系列 + + + 优化 + +
    + + MyBatis系列(二) + /2020/02/26/mybatis/MyBatis%E7%B3%BB%E5%88%97-%E4%BA%8C/ + mapper动态代理(MyBatis接口开发)
    原则:约定优于配置
    + +

    配置方式:

    +

    ​ abc.xml

    +

    硬编码方式

    +

    ​ abc.java

    +

    约定:默认值就是myProject

    +

    与传统配置的不同之处:省略掉statement,即根据约定直接定位出sql语句。

    +

    约定:

    +
    /*
    * 1.方法名和mapper.xml文件中的id值相同
    * 2.方法名的输入参数和mapper.xml文件中的标签parameterType类型一致
    * 3.方法的返回值和mapper.xml文件中的resultType一致
    */
    + +

    接口和mapper一一对应:namespace的value=接口的全类名

    +

    构建接口

    所以说新建一个接口,根据前一个篇的mapper.xml的文件基础上改,注:我这里是把接口建在了mapper包下

    +
    Student queryStudentBystuNum(int stuno);
    List<Student> queryAllStudent();
    int addStudent(Student student);
    int upDateStuByNo(Student student);
    int deleteStuByNo(int stuno);
    + +

    注意这里的接口要遵循上面的约定。

    +

    更改xml文件

    再mapper.xml file中,namespace也应该改成接口的名字

    +
    <mapper namespace="top.eshyee.mapper.StudentMapper">
    + +

    接下来,就是修改测试类,曾经使用的statement的地方,目前就不用使用了。

    +

    使用接口

    这次拿删除学生举例,首先要从session中获取到这个接口,使用getMapper方法。然后从这个接口中要我刚刚写的那个删除的方法deleteStuByNo(),这里我写死删除no为3的 倒霉孩子

    +
    Reader reader = Resources.getResourceAsReader("conf.xml");
    SqlSessionFactory sessionfactory = new SqlSessionFactoryBuilder().build(reader);
    SqlSession session = sessionfactory.openSession();
    StudentMapper stuMapper = session.getMapper(StudentMapper.class);
    int count = stuMapper.deleteStuByNo(3);
    session.commit();
    System.out.println("删除成功," + count + "行受影响");
    session.close();
    + +

    测试一下

    3号学生被删除并想你抛了一行log🌚

    + + +

    总结

    约定相对于配置来说,出错率更少了,因为不用写statement,而是通过调用接口去实现xml的id的调用,对于写statement的String容易手残的老哥来说,是不错的选择。

    +]]>
    + + 技术 + MyBatis系列 + + + 入门 + 初学者 + +
    + + MyBatis系列(五) + /2020/03/10/mybatis/MyBatis%E7%B3%BB%E5%88%97-%E4%BA%94/ + 关于动态sql

    + + +

    if

    按姓名和年龄查询

    +
    <select id="qStuByNOrAWithSQLTag" parameterType="top.eshyee.entity.Student" resultType="top.eshyee.entity.Student">
    select stuno ,stuname from student where 1=1
    <if test="stuName!=null and stuName!= ''">
    student有stuname属性且不为null
    and stuname=#{stuName}
    </if>
    <if test="stuAge!=null and stuAge!=0">
    student有stunage属性且不为null
    and stuage=#{stuAge}
    </if>
    </select>
    + +

    这里and会出问题

    +

    where

    where:处理第一个and

    +
    <select id="qStuByNOrAWithSQLTag" parameterType="top.eshyee.entity.Student" resultType="top.eshyee.entity.Student">
    select stuno ,stuname from student
    <where>
    <if test="stuName!=null and stuName!= ''">
    and stuname=#{stuName}
    </if>
    <if test="stuAge!=null and stuAge!=0">
    and stuage=#{stuAge}
    </if>
    </where>
    </select>
    + +

    foreach

    查询学号为1 2 4的学生学号信息

    +

    迭代的类型:数组、对象数组、集合、属性

    +

    数组

    数组固定写法:array 这是约定

    +
    <select id="queryStuwithNoWitharray" resultType="top.eshyee.entity.Student" parameterType="int[]">
    select * from student
    <where>
    <if test="array!=null and array.length>0">
    <foreach collection="array" open="and stuno in(" close=")" item="stuNo" separator=",">
    #{stuNo}
    </foreach>
    </if>
    </where>
    </select>
    + +

    放入对象的属性中

    <select id="queryStuwithNoInGra" resultType="top.eshyee.entity.Student" parameterType="top.eshyee.entity.Grade">
    select * from student
    <where>
    <if test="stuNos!=null and stuNos.size>0">
    <foreach collection="stuNos" open="and stuno in(" close=")" item="stuNo" separator=",">
    #{stuNo}
    </foreach>
    </if>
    </where>
    </select>
    + +

    集合

    <select id="queryStuwithNowithlist" resultType="top.eshyee.entity.Student" parameterType="top.eshyee.entity.Grade">
    select * from student
    <where>
    <if test="list!=null and list.size>0">
    <foreach collection="list" open="and stuno in(" close=")" item="stuNo" separator=",">
    #{stuNo}
    </foreach>
    </if>
    </where>
    </select>
    + +

    对象数组

    必须使用Object[]

    +
    <select id="queryStuwithNowithObjArr" 
    resultType="top.eshyee.entity.Student" parameterType="Object[]">
    select * from student
    <include refid="objectArraStuno"></include>
    <!-- 如果sql片段不在一个文件
    <include refid="top.eshyee.mapper.StudentMapper.objectArraStuno"></include>
    -->
    </select>
    + +

    sql片段

    重复使用的提取出来

    +
    <sql id="objectArraStuno">
    <where>
    <if test="array!=null and array.length>0">
    <foreach collection="array" open="and stuno in(" close=")" item="student" separator=",">
    #{student.stuNo}
    </foreach>
    </if>
    </where>
    </sql>
    + +]]>
    + + 技术 + MyBatis系列 + + + 动态sql + +
    + + MyBatis系列(六) + /2020/03/19/mybatis/MyBatis%E7%B3%BB%E5%88%97-%E5%85%AD/ + 关联查询 + +

    关于关联查询主要重点是配置好mapper

    +

    一对一

    a.业务扩展类

    +

    核心:用resultType指定的类的属性包含多表查询的所有字段

    +

    b. resultMap

    +

    通过属性成员将2个类建立起联系

    +
    <!-- 利用业务扩展类实现一对一 -->
    <select id="qSByNWithO2O" resultType="top.eshyee.entity.StudentBussiness" parameterType="int">
    select s.*,c.* from student s inner join studentcard c
    on s.cardid =c.cardid
    where s.stuno=#{stuNo}
    </select>
    <!-- 利用resultmap实现一对一 -->
    <select id="qSByNWithMapO2O" resultMap="student_card_map" parameterType="int">
    select s.*,c.* from student s inner join studentcard c
    on s.cardid =c.cardid
    where s.stuno=#{stuNo}
    </select>
    <resultMap type="student" id="student_card_map">
    <id property="stuNo" column="stuNo"/>
    <result property="stuName" column="stuName"/>
    <result property="stuAge" column="stuAge"/>
    <result property="graName" column="graName"/>
    <result property="stuSex" column="stuSex"/>
    <!-- 一一映射用association,一对多用collection -->
    <association property="card" javaType="StudentCard">
    <id property="cardId" column="cardId"/>
    <result property="cardInfo" column="cardInfo"/>
    </association>
    </resultMap>
    + + + +

    一对多(多对一)

    (MyBatis:多对一,多对多的本质就是一对多的变化)

    +
    <!-- 查询1班的班级信息 和所有学生的信息 建立一对多关系 -->
    <select id="qCAS" resultMap="class_student_classid" parameterType="int">
    select c.*,s.* from student s
    inner join studentclass c
    on c.classid=s.classid
    where c.classid=#{classId}
    </select>
    <resultMap type="top.eshyee.entity.StudentClass" id="class_student_classid">
    <id property="classId" column="classId" />
    <result property="className" column="className"/>
    <!-- 属性类型用javatype 属性的元素类型用oftype -->
    <collection property="student" ofType="top.eshyee.entity.Student">
    <id property="stuNo" column="stuNo"/>
    <result property="stuName" column="stuName"/>
    <result property="stuAge" column="stuAge"/>
    <result property="graName" column="graName"/>
    <result property="stuSex" column="stuSex"/>
    </collection>
    </resultMap>
    + + + +

    多对多

    多对多 可由两个多对一等方法实现!

    +]]>
    + + 技术 + MyBatis系列 + + + 关联查询 + 一对多 + 一对一 + 多对多 + +
    + + MyBatis系列(四) + /2020/03/08/mybatis/MyBatis%E7%B3%BB%E5%88%97-%E5%9B%9B/ + 输入参数和输出参数

    + + +

    输入参数parameterType

    简单类型

    ${}#{}比较

    +

    #{任意值}或者${value}(标识符只能是value)

    +

    #{}会自动给String加上’’(自动类型转换)

    +

    ${}会原样输出,但是适合于动态排序(动态字段)

    +

    #{}可以防止sql注入

    +

    ${}不可以

    +

    ${}#{}相同之处

    +

    都可以获取对象的值,(嵌套类型对象)

    +

    对象类型

    #{属性名}或者${属性名}(对象的属性名例如stuNo)

    +
    <select id="queryStudentByAddress" resultType="top.eshyee.entity.Student" parameterType="address">
    select stuno,stuname,stuage from student
    where homeaddress=#{homeAddress} or schooladdress='${schoolAddress}'
    </select>
    + + + +

    嵌套类型输入参数为级联属性

    <select id="queryStudentByAddress" resultType="top.eshyee.entity.Student" parameterType="Student">
    select stuno,stuname,stuage from student where homeaddress=#{address.homeAddress} or schooladdress='${address.schoolAddress}'
    </select>
    <select id="queryStudentBystuNameOrAge" resultType="top.eshyee.entity.Student" parameterType="Student">
    select stuno,stuname,stuage from student
    where stuname like '%${stuName}%' or stuage=#{stuAge}
    </select>
    + +

    传入为hashmap

    <select id="queryStudentBystuNameOrAgewithHashmap" resultType="top.eshyee.entity.Student" parameterType="HashMap">
    select stuno,stuname,stuage from student
    where stuname like '%${stuName}%' or stuage=#{stuAge}
    </select>
    + +

    调用存储过程

    存储过程的传入参数在mybatis中用map来传递(Hashmap)
    CALLABLE设置sql 的调用方式是存储过程
    输出参数通过map的get方法获取

    +

    查询某个年级的所有学生总数

    数据库里
    create or replace procedure queryCountByGradeWithProcadure(gName in varchar,scount out number )
    as
    begin
    select count(1) into scount from student where graname=gname;
    end;
    /
    + +
    mapper中
    <select id="queryCountByGradeWithPrecadure" statementType="CALLABLE" parameterType="HashMap">
    {CALL queryCountByGradeWithProcadure(
    #{gName,jdbcType=VARCHAR,mode=IN},
    #{sCount,jdbcType=INTEGER,mode=OUT} )}
    </select>
    + +

    根据学号删除学生

    数据库里
    create or replace procedure deleteStuBystunoWithProcedure(sno in number)
    as
    begin
    delete from student where stuno=sno;
    end;
    /
    + +
    mapper中
    <delete id="deletestuByStunoWithPrecadure" statementType="CALLABLE" parameterType="HashMap">
    {CALL deleteStuBystunoWithProcedure(#{sno,jdbcType=INTEGER,mode=IN})}
    </delete>
    + +

    输出参数

    resultType

    简单类型,实体对象类型,实体对象类型的集合之前有提到过,此处不再赘述。

    +
    输出为HashMap

    通过别名作为map的key

    +
    <select id="queryStudentWithHash" resultType="HashMap">
    select stuno "no",stuname "name" from student
    </select>
    + +

    resultMap

    解决实体类型属性与数据表字段名不一致(前面有用到)

    +

    也可以使用HashMap+resultType

    +]]>
    + + 技术 + MyBatis系列 + + + 存储过程 + parameterType + resultType + +
    +
    diff --git a/tags/AOP/index.html b/tags/AOP/index.html new file mode 100644 index 0000000..4d82d60 --- /dev/null +++ b/tags/AOP/index.html @@ -0,0 +1,168 @@ +Tag: AOP | SHYEE-PLASMA + + + + + + + +
    \ No newline at end of file diff --git a/tags/C/index.html b/tags/C/index.html new file mode 100644 index 0000000..15f6e54 --- /dev/null +++ b/tags/C/index.html @@ -0,0 +1,168 @@ +Tag: C | SHYEE-PLASMA + + + + + + + +
    \ No newline at end of file diff --git a/tags/Cisco/index.html b/tags/Cisco/index.html new file mode 100644 index 0000000..3d28e98 --- /dev/null +++ b/tags/Cisco/index.html @@ -0,0 +1,168 @@ +Tag: Cisco | SHYEE-PLASMA + + + + + + + +
    \ No newline at end of file diff --git a/tags/Docker/index.html b/tags/Docker/index.html new file mode 100644 index 0000000..63e083c --- /dev/null +++ b/tags/Docker/index.html @@ -0,0 +1,168 @@ +Tag: Docker | SHYEE-PLASMA + + + + + + + +
    \ No newline at end of file diff --git a/tags/IOC/index.html b/tags/IOC/index.html new file mode 100644 index 0000000..2e150c6 --- /dev/null +++ b/tags/IOC/index.html @@ -0,0 +1,168 @@ +Tag: IOC | SHYEE-PLASMA + + + + + + + +
    \ No newline at end of file diff --git a/tags/Java/index.html b/tags/Java/index.html new file mode 100644 index 0000000..536b0b3 --- /dev/null +++ b/tags/Java/index.html @@ -0,0 +1,168 @@ +Tag: Java | SHYEE-PLASMA + + + + + + + +
    \ No newline at end of file diff --git a/tags/MAVEN/index.html b/tags/MAVEN/index.html new file mode 100644 index 0000000..fcd3543 --- /dev/null +++ b/tags/MAVEN/index.html @@ -0,0 +1,168 @@ +Tag: MAVEN | SHYEE-PLASMA + + + + + + + +
    \ No newline at end of file diff --git a/tags/MVC/index.html b/tags/MVC/index.html new file mode 100644 index 0000000..b0ca7c3 --- /dev/null +++ b/tags/MVC/index.html @@ -0,0 +1,168 @@ +Tag: MVC | SHYEE-PLASMA + + + + + + + +
    \ No newline at end of file diff --git a/tags/MySQL/index.html b/tags/MySQL/index.html new file mode 100644 index 0000000..290f630 --- /dev/null +++ b/tags/MySQL/index.html @@ -0,0 +1,168 @@ +Tag: MySQL | SHYEE-PLASMA + + + + + + + +
    \ No newline at end of file diff --git a/tags/Oracle/index.html b/tags/Oracle/index.html new file mode 100644 index 0000000..52177dd --- /dev/null +++ b/tags/Oracle/index.html @@ -0,0 +1,168 @@ +Tag: Oracle | SHYEE-PLASMA + + + + + + + +
    \ No newline at end of file diff --git a/tags/PL-SQL/index.html b/tags/PL-SQL/index.html new file mode 100644 index 0000000..9678d34 --- /dev/null +++ b/tags/PL-SQL/index.html @@ -0,0 +1,168 @@ +Tag: PL/SQL | SHYEE-PLASMA + + + + + + + +
    \ No newline at end of file diff --git a/tags/SSM/index.html b/tags/SSM/index.html new file mode 100644 index 0000000..8c6fc35 --- /dev/null +++ b/tags/SSM/index.html @@ -0,0 +1,168 @@ +Tag: SSM | SHYEE-PLASMA + + + + + + + +
    \ No newline at end of file diff --git a/tags/Spring/index.html b/tags/Spring/index.html new file mode 100644 index 0000000..4df92c8 --- /dev/null +++ b/tags/Spring/index.html @@ -0,0 +1,168 @@ +Tag: Spring | SHYEE-PLASMA + + + + + + + +
    \ No newline at end of file diff --git a/tags/comsol/index.html b/tags/comsol/index.html new file mode 100644 index 0000000..23b874b --- /dev/null +++ b/tags/comsol/index.html @@ -0,0 +1,168 @@ +Tag: comsol | SHYEE-PLASMA + + + + + + + +
    \ No newline at end of file diff --git a/tags/helicon/index.html b/tags/helicon/index.html new file mode 100644 index 0000000..8abb6e0 --- /dev/null +++ b/tags/helicon/index.html @@ -0,0 +1,168 @@ +Tag: helicon | SHYEE-PLASMA + + + + + + + +
    \ No newline at end of file diff --git a/tags/index.html b/tags/index.html new file mode 100644 index 0000000..40e5bde --- /dev/null +++ b/tags/index.html @@ -0,0 +1,170 @@ +标签 | SHYEE-PLASMA + + + + + + + + + +
    \ No newline at end of file diff --git a/tags/kaggle/index.html b/tags/kaggle/index.html new file mode 100644 index 0000000..d5b234e --- /dev/null +++ b/tags/kaggle/index.html @@ -0,0 +1,168 @@ +Tag: kaggle | SHYEE-PLASMA + + + + + + + +
    \ No newline at end of file diff --git a/tags/linux/index.html b/tags/linux/index.html new file mode 100644 index 0000000..ea53c15 --- /dev/null +++ b/tags/linux/index.html @@ -0,0 +1,168 @@ +Tag: linux | SHYEE-PLASMA + + + + + + + +
    \ No newline at end of file diff --git a/tags/log4j/index.html b/tags/log4j/index.html new file mode 100644 index 0000000..238852a --- /dev/null +++ b/tags/log4j/index.html @@ -0,0 +1,168 @@ +Tag: log4j | SHYEE-PLASMA + + + + + + + +
    \ No newline at end of file diff --git a/tags/mybatis/index.html b/tags/mybatis/index.html new file mode 100644 index 0000000..4282ae9 --- /dev/null +++ b/tags/mybatis/index.html @@ -0,0 +1,168 @@ +Tag: MyBatis | SHYEE-PLASMA + + + + + + + +
    \ No newline at end of file diff --git a/tags/opencv/index.html b/tags/opencv/index.html new file mode 100644 index 0000000..4e4f951 --- /dev/null +++ b/tags/opencv/index.html @@ -0,0 +1,168 @@ +Tag: opencv | SHYEE-PLASMA + + + + + + + +
    \ No newline at end of file diff --git a/tags/pandas/index.html b/tags/pandas/index.html new file mode 100644 index 0000000..a2f9cd9 --- /dev/null +++ b/tags/pandas/index.html @@ -0,0 +1,168 @@ +Tag: pandas | SHYEE-PLASMA + + + + + + + +
    \ No newline at end of file diff --git a/tags/parameterType/index.html b/tags/parameterType/index.html new file mode 100644 index 0000000..4537210 --- /dev/null +++ b/tags/parameterType/index.html @@ -0,0 +1,168 @@ +Tag: parameterType | SHYEE-PLASMA + + + + + + + +
    \ No newline at end of file diff --git a/tags/plasma/index.html b/tags/plasma/index.html new file mode 100644 index 0000000..0af9c7f --- /dev/null +++ b/tags/plasma/index.html @@ -0,0 +1,168 @@ +Tag: plasma | SHYEE-PLASMA + + + + + + + +
    \ No newline at end of file diff --git a/tags/python/index.html b/tags/python/index.html new file mode 100644 index 0000000..6bc300c --- /dev/null +++ b/tags/python/index.html @@ -0,0 +1,168 @@ +Tag: python | SHYEE-PLASMA + + + + + + + +
    \ No newline at end of file diff --git a/tags/redis/index.html b/tags/redis/index.html new file mode 100644 index 0000000..ea293ec --- /dev/null +++ b/tags/redis/index.html @@ -0,0 +1,168 @@ +Tag: redis | SHYEE-PLASMA + + + + + + + +
    \ No newline at end of file diff --git a/tags/resultType/index.html b/tags/resultType/index.html new file mode 100644 index 0000000..e5305fb --- /dev/null +++ b/tags/resultType/index.html @@ -0,0 +1,168 @@ +Tag: resultType | SHYEE-PLASMA + + + + + + + +
    \ No newline at end of file diff --git "a/tags/\344\270\200\345\257\271\344\270\200/index.html" "b/tags/\344\270\200\345\257\271\344\270\200/index.html" new file mode 100644 index 0000000..a8098a8 --- /dev/null +++ "b/tags/\344\270\200\345\257\271\344\270\200/index.html" @@ -0,0 +1,168 @@ +Tag: 一对一 | SHYEE-PLASMA + + + + + + + +
    \ No newline at end of file diff --git "a/tags/\344\270\200\345\257\271\345\244\232/index.html" "b/tags/\344\270\200\345\257\271\345\244\232/index.html" new file mode 100644 index 0000000..89ec622 --- /dev/null +++ "b/tags/\344\270\200\345\257\271\345\244\232/index.html" @@ -0,0 +1,168 @@ +Tag: 一对多 | SHYEE-PLASMA + + + + + + + +
    \ No newline at end of file diff --git "a/tags/\344\270\212\346\265\267/index.html" "b/tags/\344\270\212\346\265\267/index.html" new file mode 100644 index 0000000..81f2e60 --- /dev/null +++ "b/tags/\344\270\212\346\265\267/index.html" @@ -0,0 +1,168 @@ +Tag: 上海 | SHYEE-PLASMA + + + + + + + +
    \ No newline at end of file diff --git "a/tags/\344\272\213\345\212\241/index.html" "b/tags/\344\272\213\345\212\241/index.html" new file mode 100644 index 0000000..f911800 --- /dev/null +++ "b/tags/\344\272\213\345\212\241/index.html" @@ -0,0 +1,168 @@ +Tag: 事务 | SHYEE-PLASMA + + + + + + + +
    \ No newline at end of file diff --git "a/tags/\344\272\214\347\272\247\347\274\223\345\255\230/index.html" "b/tags/\344\272\214\347\272\247\347\274\223\345\255\230/index.html" new file mode 100644 index 0000000..5bf7bc7 --- /dev/null +++ "b/tags/\344\272\214\347\272\247\347\274\223\345\255\230/index.html" @@ -0,0 +1,168 @@ +Tag: 二级缓存 | SHYEE-PLASMA + + + + + + + +
    \ No newline at end of file diff --git "a/tags/\344\272\244\345\217\211\347\272\277/index.html" "b/tags/\344\272\244\345\217\211\347\272\277/index.html" new file mode 100644 index 0000000..62ee569 --- /dev/null +++ "b/tags/\344\272\244\345\217\211\347\272\277/index.html" @@ -0,0 +1,168 @@ +Tag: 交叉线 | SHYEE-PLASMA + + + + + + + +
    \ No newline at end of file diff --git "a/tags/\344\272\272\350\204\270\350\257\206\345\210\253/index.html" "b/tags/\344\272\272\350\204\270\350\257\206\345\210\253/index.html" new file mode 100644 index 0000000..4c3f931 --- /dev/null +++ "b/tags/\344\272\272\350\204\270\350\257\206\345\210\253/index.html" @@ -0,0 +1,168 @@ +Tag: 人脸识别 | SHYEE-PLASMA + + + + + + + +
    \ No newline at end of file diff --git "a/tags/\344\273\223\345\272\223/index.html" "b/tags/\344\273\223\345\272\223/index.html" new file mode 100644 index 0000000..14707f5 --- /dev/null +++ "b/tags/\344\273\223\345\272\223/index.html" @@ -0,0 +1,168 @@ +Tag: 仓库 | SHYEE-PLASMA + + + + + + + +
    \ No newline at end of file diff --git "a/tags/\344\273\277\347\234\237/index.html" "b/tags/\344\273\277\347\234\237/index.html" new file mode 100644 index 0000000..057fd71 --- /dev/null +++ "b/tags/\344\273\277\347\234\237/index.html" @@ -0,0 +1,168 @@ +Tag: 仿真 | SHYEE-PLASMA + + + + + + + +
    \ No newline at end of file diff --git "a/tags/\344\274\230\345\214\226/index.html" "b/tags/\344\274\230\345\214\226/index.html" new file mode 100644 index 0000000..28be4a5 --- /dev/null +++ "b/tags/\344\274\230\345\214\226/index.html" @@ -0,0 +1,168 @@ +Tag: 优化 | SHYEE-PLASMA + + + + + + + +
    \ No newline at end of file diff --git "a/tags/\345\205\245\351\227\250/index.html" "b/tags/\345\205\245\351\227\250/index.html" new file mode 100644 index 0000000..149d162 --- /dev/null +++ "b/tags/\345\205\245\351\227\250/index.html" @@ -0,0 +1,168 @@ +Tag: 入门 | SHYEE-PLASMA + + + + + + + +
    \ No newline at end of file diff --git "a/tags/\345\205\261\344\272\253\346\240\210/index.html" "b/tags/\345\205\261\344\272\253\346\240\210/index.html" new file mode 100644 index 0000000..e831006 --- /dev/null +++ "b/tags/\345\205\261\344\272\253\346\240\210/index.html" @@ -0,0 +1,168 @@ +Tag: 共享栈 | SHYEE-PLASMA + + + + + + + +
    \ No newline at end of file diff --git "a/tags/\345\205\263\350\201\224\346\237\245\350\257\242/index.html" "b/tags/\345\205\263\350\201\224\346\237\245\350\257\242/index.html" new file mode 100644 index 0000000..75f466c --- /dev/null +++ "b/tags/\345\205\263\350\201\224\346\237\245\350\257\242/index.html" @@ -0,0 +1,168 @@ +Tag: 关联查询 | SHYEE-PLASMA + + + + + + + +
    \ No newline at end of file diff --git "a/tags/\345\210\235\345\255\246\350\200\205/index.html" "b/tags/\345\210\235\345\255\246\350\200\205/index.html" new file mode 100644 index 0000000..ce12b87 --- /dev/null +++ "b/tags/\345\210\235\345\255\246\350\200\205/index.html" @@ -0,0 +1,168 @@ +Tag: 初学者 | SHYEE-PLASMA + + + + + + + +
    \ No newline at end of file diff --git "a/tags/\345\211\215\347\275\256\344\273\273\345\212\241/index.html" "b/tags/\345\211\215\347\275\256\344\273\273\345\212\241/index.html" new file mode 100644 index 0000000..476c0c3 --- /dev/null +++ "b/tags/\345\211\215\347\275\256\344\273\273\345\212\241/index.html" @@ -0,0 +1,168 @@ +Tag: 前置任务 | SHYEE-PLASMA + + + + + + + +
    \ No newline at end of file diff --git "a/tags/\345\212\250\346\200\201sql/index.html" "b/tags/\345\212\250\346\200\201sql/index.html" new file mode 100644 index 0000000..c6e3b60 --- /dev/null +++ "b/tags/\345\212\250\346\200\201sql/index.html" @@ -0,0 +1,168 @@ +Tag: 动态sql | SHYEE-PLASMA + + + + + + + +
    \ No newline at end of file diff --git "a/tags/\345\212\250\346\200\201\345\210\206\351\205\215/index.html" "b/tags/\345\212\250\346\200\201\345\210\206\351\205\215/index.html" new file mode 100644 index 0000000..2ed4402 --- /dev/null +++ "b/tags/\345\212\250\346\200\201\345\210\206\351\205\215/index.html" @@ -0,0 +1,168 @@ +Tag: 动态分配 | SHYEE-PLASMA + + + + + + + +
    \ No newline at end of file diff --git "a/tags/\345\215\225\351\223\276\350\241\250/index.html" "b/tags/\345\215\225\351\223\276\350\241\250/index.html" new file mode 100644 index 0000000..94a5f53 --- /dev/null +++ "b/tags/\345\215\225\351\223\276\350\241\250/index.html" @@ -0,0 +1,168 @@ +Tag: 单链表 | SHYEE-PLASMA + + + + + + + +
    \ No newline at end of file diff --git "a/tags/\345\217\214\347\273\236\347\272\277/index.html" "b/tags/\345\217\214\347\273\236\347\272\277/index.html" new file mode 100644 index 0000000..2dd09b3 --- /dev/null +++ "b/tags/\345\217\214\347\273\236\347\272\277/index.html" @@ -0,0 +1,168 @@ +Tag: 双绞线 | SHYEE-PLASMA + + + + + + + +
    \ No newline at end of file diff --git "a/tags/\345\217\214\351\223\276\350\241\250/index.html" "b/tags/\345\217\214\351\223\276\350\241\250/index.html" new file mode 100644 index 0000000..a289ebc --- /dev/null +++ "b/tags/\345\217\214\351\223\276\350\241\250/index.html" @@ -0,0 +1,168 @@ +Tag: 双链表 | SHYEE-PLASMA + + + + + + + +
    \ No newline at end of file diff --git "a/tags/\345\221\250\346\200\273\347\273\223/index.html" "b/tags/\345\221\250\346\200\273\347\273\223/index.html" new file mode 100644 index 0000000..ae932e8 --- /dev/null +++ "b/tags/\345\221\250\346\200\273\347\273\223/index.html" @@ -0,0 +1,168 @@ +Tag: 周总结 | SHYEE-PLASMA + + + + + + + +
    \ No newline at end of file diff --git "a/tags/\345\225\245\351\203\275\345\255\246\347\202\271/index.html" "b/tags/\345\225\245\351\203\275\345\255\246\347\202\271/index.html" new file mode 100644 index 0000000..2f68488 --- /dev/null +++ "b/tags/\345\225\245\351\203\275\345\255\246\347\202\271/index.html" @@ -0,0 +1,168 @@ +Tag: 啥都学点 | SHYEE-PLASMA + + + + + + + +
    \ No newline at end of file diff --git "a/tags/\345\234\237\350\261\206/index.html" "b/tags/\345\234\237\350\261\206/index.html" new file mode 100644 index 0000000..6d5d2dd --- /dev/null +++ "b/tags/\345\234\237\350\261\206/index.html" @@ -0,0 +1,168 @@ +Tag: 土豆 | SHYEE-PLASMA + + + + + + + +
    \ No newline at end of file diff --git "a/tags/\345\244\232\345\257\271\345\244\232/index.html" "b/tags/\345\244\232\345\257\271\345\244\232/index.html" new file mode 100644 index 0000000..af6957e --- /dev/null +++ "b/tags/\345\244\232\345\257\271\345\244\232/index.html" @@ -0,0 +1,168 @@ +Tag: 多对多 | SHYEE-PLASMA + + + + + + + +
    \ No newline at end of file diff --git "a/tags/\345\244\264\347\273\223\347\202\271/index.html" "b/tags/\345\244\264\347\273\223\347\202\271/index.html" new file mode 100644 index 0000000..13244a0 --- /dev/null +++ "b/tags/\345\244\264\347\273\223\347\202\271/index.html" @@ -0,0 +1,168 @@ +Tag: 头结点 | SHYEE-PLASMA + + + + + + + +
    \ No newline at end of file diff --git "a/tags/\345\255\230\345\202\250\350\277\207\347\250\213/index.html" "b/tags/\345\255\230\345\202\250\350\277\207\347\250\213/index.html" new file mode 100644 index 0000000..3326f78 --- /dev/null +++ "b/tags/\345\255\230\345\202\250\350\277\207\347\250\213/index.html" @@ -0,0 +1,168 @@ +Tag: 存储过程 | SHYEE-PLASMA + + + + + + + +
    \ No newline at end of file diff --git "a/tags/\345\256\236\351\252\214/index.html" "b/tags/\345\256\236\351\252\214/index.html" new file mode 100644 index 0000000..670fec8 --- /dev/null +++ "b/tags/\345\256\236\351\252\214/index.html" @@ -0,0 +1,168 @@ +Tag: 实验 | SHYEE-PLASMA + + + + + + + +
    \ No newline at end of file diff --git "a/tags/\345\257\271\350\261\241/index.html" "b/tags/\345\257\271\350\261\241/index.html" new file mode 100644 index 0000000..c23102e --- /dev/null +++ "b/tags/\345\257\271\350\261\241/index.html" @@ -0,0 +1,168 @@ +Tag: 对象 | SHYEE-PLASMA + + + + + + + +
    \ No newline at end of file diff --git "a/tags/\345\260\217\347\231\275/index.html" "b/tags/\345\260\217\347\231\275/index.html" new file mode 100644 index 0000000..f90ca75 --- /dev/null +++ "b/tags/\345\260\217\347\231\275/index.html" @@ -0,0 +1,168 @@ +Tag: 小白 | SHYEE-PLASMA + + + + + + + +
    \ No newline at end of file diff --git "a/tags/\345\264\251\346\272\203\347\232\204/index.html" "b/tags/\345\264\251\346\272\203\347\232\204/index.html" new file mode 100644 index 0000000..ac275ff --- /dev/null +++ "b/tags/\345\264\251\346\272\203\347\232\204/index.html" @@ -0,0 +1,168 @@ +Tag: 崩溃的 | SHYEE-PLASMA + + + + + + + +
    \ No newline at end of file diff --git "a/tags/\345\271\266\345\217\221/index.html" "b/tags/\345\271\266\345\217\221/index.html" new file mode 100644 index 0000000..5c9a423 --- /dev/null +++ "b/tags/\345\271\266\345\217\221/index.html" @@ -0,0 +1,168 @@ +Tag: 并发 | SHYEE-PLASMA + + + + + + + +
    \ No newline at end of file diff --git "a/tags/\345\273\266\350\277\237\345\212\240\350\275\275/index.html" "b/tags/\345\273\266\350\277\237\345\212\240\350\275\275/index.html" new file mode 100644 index 0000000..97a10e3 --- /dev/null +++ "b/tags/\345\273\266\350\277\237\345\212\240\350\275\275/index.html" @@ -0,0 +1,168 @@ +Tag: 延迟加载 | SHYEE-PLASMA + + + + + + + +
    \ No newline at end of file diff --git "a/tags/\345\276\252\347\216\257\351\223\276\350\241\250/index.html" "b/tags/\345\276\252\347\216\257\351\223\276\350\241\250/index.html" new file mode 100644 index 0000000..23512b3 --- /dev/null +++ "b/tags/\345\276\252\347\216\257\351\223\276\350\241\250/index.html" @@ -0,0 +1,168 @@ +Tag: 循环链表 | SHYEE-PLASMA + + + + + + + +
    \ No newline at end of file diff --git "a/tags/\346\223\215\344\275\234\347\263\273\347\273\237/index.html" "b/tags/\346\223\215\344\275\234\347\263\273\347\273\237/index.html" new file mode 100644 index 0000000..fe8cbe8 --- /dev/null +++ "b/tags/\346\223\215\344\275\234\347\263\273\347\273\237/index.html" @@ -0,0 +1,168 @@ +Tag: 操作系统 | SHYEE-PLASMA + + + + + + + +
    \ No newline at end of file diff --git "a/tags/\346\225\231\347\250\213/index.html" "b/tags/\346\225\231\347\250\213/index.html" new file mode 100644 index 0000000..e49e96a --- /dev/null +++ "b/tags/\346\225\231\347\250\213/index.html" @@ -0,0 +1,168 @@ +Tag: 教程 | SHYEE-PLASMA + + + + + + + +
    \ No newline at end of file diff --git "a/tags/\346\225\260\345\255\246/index.html" "b/tags/\346\225\260\345\255\246/index.html" new file mode 100644 index 0000000..5899232 --- /dev/null +++ "b/tags/\346\225\260\345\255\246/index.html" @@ -0,0 +1,168 @@ +Tag: 数学 | SHYEE-PLASMA + + + + + + + +
    \ No newline at end of file diff --git "a/tags/\346\225\260\346\215\256\345\272\223/index.html" "b/tags/\346\225\260\346\215\256\345\272\223/index.html" new file mode 100644 index 0000000..d39a51d --- /dev/null +++ "b/tags/\346\225\260\346\215\256\345\272\223/index.html" @@ -0,0 +1,168 @@ +Tag: 数据库 | SHYEE-PLASMA + + + + + + + +
    Tag - 数据库
    2021
    视图
    视图
    2020
    Redis
    Redis
    MySQL进阶
    MySQL进阶
    mysql的一点东西
    mysql的一点东西
    Oracle系列学习(五)
    Oracle系列学习(五)
    Oracle系列学习(四)
    Oracle系列学习(四)
    备份与恢复
    备份与恢复
    Oracle系列学习(三)
    Oracle系列学习(三)
    mybatis缓存
    mybatis缓存
    Oracle系列学习(二)
    Oracle系列学习(二)
    \ No newline at end of file diff --git "a/tags/\346\225\260\346\215\256\345\272\223/page/2/index.html" "b/tags/\346\225\260\346\215\256\345\272\223/page/2/index.html" new file mode 100644 index 0000000..5b78070 --- /dev/null +++ "b/tags/\346\225\260\346\215\256\345\272\223/page/2/index.html" @@ -0,0 +1,168 @@ +Tag: 数据库 | SHYEE-PLASMA + + + + + + + +
    \ No newline at end of file diff --git "a/tags/\346\225\260\346\215\256\347\273\223\346\236\204/index.html" "b/tags/\346\225\260\346\215\256\347\273\223\346\236\204/index.html" new file mode 100644 index 0000000..df29ada --- /dev/null +++ "b/tags/\346\225\260\346\215\256\347\273\223\346\236\204/index.html" @@ -0,0 +1,168 @@ +Tag: 数据结构 | SHYEE-PLASMA + + + + + + + +
    \ No newline at end of file diff --git "a/tags/\346\226\207\347\214\256/index.html" "b/tags/\346\226\207\347\214\256/index.html" new file mode 100644 index 0000000..dd9f964 --- /dev/null +++ "b/tags/\346\226\207\347\214\256/index.html" @@ -0,0 +1,168 @@ +Tag: 文献 | SHYEE-PLASMA + + + + + + + +
    \ No newline at end of file diff --git "a/tags/\346\226\207\347\214\256\347\277\273\350\257\221/index.html" "b/tags/\346\226\207\347\214\256\347\277\273\350\257\221/index.html" new file mode 100644 index 0000000..615a066 --- /dev/null +++ "b/tags/\346\226\207\347\214\256\347\277\273\350\257\221/index.html" @@ -0,0 +1,168 @@ +Tag: 文献翻译 | SHYEE-PLASMA + + + + + + + +
    \ No newline at end of file diff --git "a/tags/\346\234\272\345\231\250\345\255\246\344\271\240/index.html" "b/tags/\346\234\272\345\231\250\345\255\246\344\271\240/index.html" new file mode 100644 index 0000000..38cec3c --- /dev/null +++ "b/tags/\346\234\272\345\231\250\345\255\246\344\271\240/index.html" @@ -0,0 +1,168 @@ +Tag: 机器学习 | SHYEE-PLASMA + + + + + + + +
    \ No newline at end of file diff --git "a/tags/\346\263\250\345\205\245/index.html" "b/tags/\346\263\250\345\205\245/index.html" new file mode 100644 index 0000000..d579f4a --- /dev/null +++ "b/tags/\346\263\250\345\205\245/index.html" @@ -0,0 +1,168 @@ +Tag: 注入 | SHYEE-PLASMA + + + + + + + +
    \ No newline at end of file diff --git "a/tags/\347\233\256\346\240\207\346\243\200\346\265\213/index.html" "b/tags/\347\233\256\346\240\207\346\243\200\346\265\213/index.html" new file mode 100644 index 0000000..2d4345a --- /dev/null +++ "b/tags/\347\233\256\346\240\207\346\243\200\346\265\213/index.html" @@ -0,0 +1,168 @@ +Tag: 目标检测 | SHYEE-PLASMA + + + + + + + +
    \ No newline at end of file diff --git "a/tags/\347\233\264\351\200\232\347\272\277/index.html" "b/tags/\347\233\264\351\200\232\347\272\277/index.html" new file mode 100644 index 0000000..2ad57b1 --- /dev/null +++ "b/tags/\347\233\264\351\200\232\347\272\277/index.html" @@ -0,0 +1,168 @@ +Tag: 直通线 | SHYEE-PLASMA + + + + + + + +
    \ No newline at end of file diff --git "a/tags/\347\255\211\347\246\273\345\255\220\344\275\223/index.html" "b/tags/\347\255\211\347\246\273\345\255\220\344\275\223/index.html" new file mode 100644 index 0000000..56cff0f --- /dev/null +++ "b/tags/\347\255\211\347\246\273\345\255\220\344\275\223/index.html" @@ -0,0 +1,168 @@ +Tag: 等离子体 | SHYEE-PLASMA + + + + + + + +
    \ No newline at end of file diff --git "a/tags/\347\261\273/index.html" "b/tags/\347\261\273/index.html" new file mode 100644 index 0000000..93e7010 --- /dev/null +++ "b/tags/\347\261\273/index.html" @@ -0,0 +1,168 @@ +Tag: 类 | SHYEE-PLASMA + + + + + + + +
    \ No newline at end of file diff --git "a/tags/\347\261\273\345\236\213\345\244\204\347\220\206\345\231\250/index.html" "b/tags/\347\261\273\345\236\213\345\244\204\347\220\206\345\231\250/index.html" new file mode 100644 index 0000000..5de3d04 --- /dev/null +++ "b/tags/\347\261\273\345\236\213\345\244\204\347\220\206\345\231\250/index.html" @@ -0,0 +1,168 @@ +Tag: 类型处理器 | SHYEE-PLASMA + + + + + + + +
    \ No newline at end of file diff --git "a/tags/\347\272\277\346\200\247\350\241\250/index.html" "b/tags/\347\272\277\346\200\247\350\241\250/index.html" new file mode 100644 index 0000000..075055e --- /dev/null +++ "b/tags/\347\272\277\346\200\247\350\241\250/index.html" @@ -0,0 +1,168 @@ +Tag: 线性表 | SHYEE-PLASMA + + + + + + + +
    \ No newline at end of file diff --git "a/tags/\347\273\204\346\210\220\345\216\237\347\220\206/index.html" "b/tags/\347\273\204\346\210\220\345\216\237\347\220\206/index.html" new file mode 100644 index 0000000..54307de --- /dev/null +++ "b/tags/\347\273\204\346\210\220\345\216\237\347\220\206/index.html" @@ -0,0 +1,168 @@ +Tag: 组成原理 | SHYEE-PLASMA + + + + + + + +
    \ No newline at end of file diff --git "a/tags/\347\273\247\346\211\277/index.html" "b/tags/\347\273\247\346\211\277/index.html" new file mode 100644 index 0000000..b921af4 --- /dev/null +++ "b/tags/\347\273\247\346\211\277/index.html" @@ -0,0 +1,168 @@ +Tag: 继承 | SHYEE-PLASMA + + + + + + + +
    \ No newline at end of file diff --git "a/tags/\347\273\274\350\277\260/index.html" "b/tags/\347\273\274\350\277\260/index.html" new file mode 100644 index 0000000..f38b7cd --- /dev/null +++ "b/tags/\347\273\274\350\277\260/index.html" @@ -0,0 +1,168 @@ +Tag: 综述 | SHYEE-PLASMA + + + + + + + +
    \ No newline at end of file diff --git "a/tags/\347\274\223\345\255\230/index.html" "b/tags/\347\274\223\345\255\230/index.html" new file mode 100644 index 0000000..9e84d7f --- /dev/null +++ "b/tags/\347\274\223\345\255\230/index.html" @@ -0,0 +1,168 @@ +Tag: 缓存 | SHYEE-PLASMA + + + + + + + +
    \ No newline at end of file diff --git "a/tags/\347\277\273\350\257\221/index.html" "b/tags/\347\277\273\350\257\221/index.html" new file mode 100644 index 0000000..989f2d5 --- /dev/null +++ "b/tags/\347\277\273\350\257\221/index.html" @@ -0,0 +1,168 @@ +Tag: 翻译 | SHYEE-PLASMA + + + + + + + +
    \ No newline at end of file diff --git "a/tags/\350\211\272\346\234\257/index.html" "b/tags/\350\211\272\346\234\257/index.html" new file mode 100644 index 0000000..f2f599d --- /dev/null +++ "b/tags/\350\211\272\346\234\257/index.html" @@ -0,0 +1,168 @@ +Tag: 艺术 | SHYEE-PLASMA + + + + + + + +
    \ No newline at end of file diff --git "a/tags/\350\247\206\345\233\276/index.html" "b/tags/\350\247\206\345\233\276/index.html" new file mode 100644 index 0000000..09e73c3 --- /dev/null +++ "b/tags/\350\247\206\345\233\276/index.html" @@ -0,0 +1,168 @@ +Tag: 视图 | SHYEE-PLASMA + + + + + + + +
    \ No newline at end of file diff --git "a/tags/\350\256\241\347\256\227\346\234\272\345\211\215\347\275\256\347\237\245\350\257\206/index.html" "b/tags/\350\256\241\347\256\227\346\234\272\345\211\215\347\275\256\347\237\245\350\257\206/index.html" new file mode 100644 index 0000000..1d27664 --- /dev/null +++ "b/tags/\350\256\241\347\256\227\346\234\272\345\211\215\347\275\256\347\237\245\350\257\206/index.html" @@ -0,0 +1,168 @@ +Tag: 计算机前置知识 | SHYEE-PLASMA + + + + + + + +
    \ No newline at end of file diff --git "a/tags/\350\256\241\347\256\227\346\234\272\345\256\211\345\205\250/index.html" "b/tags/\350\256\241\347\256\227\346\234\272\345\256\211\345\205\250/index.html" new file mode 100644 index 0000000..a2f4f2f --- /dev/null +++ "b/tags/\350\256\241\347\256\227\346\234\272\345\256\211\345\205\250/index.html" @@ -0,0 +1,168 @@ +Tag: 计算机安全 | SHYEE-PLASMA + + + + + + + +
    \ No newline at end of file diff --git "a/tags/\350\275\257\344\273\266\345\267\245\347\250\213/index.html" "b/tags/\350\275\257\344\273\266\345\267\245\347\250\213/index.html" new file mode 100644 index 0000000..973b0ec --- /dev/null +++ "b/tags/\350\275\257\344\273\266\345\267\245\347\250\213/index.html" @@ -0,0 +1,168 @@ +Tag: 软件工程 | SHYEE-PLASMA + + + + + + + +
    \ No newline at end of file diff --git "a/tags/\350\275\257\344\273\266\351\241\271\347\233\256\347\256\241\347\220\206/index.html" "b/tags/\350\275\257\344\273\266\351\241\271\347\233\256\347\256\241\347\220\206/index.html" new file mode 100644 index 0000000..46d759e --- /dev/null +++ "b/tags/\350\275\257\344\273\266\351\241\271\347\233\256\347\256\241\347\220\206/index.html" @@ -0,0 +1,168 @@ +Tag: 软件项目管理 | SHYEE-PLASMA + + + + + + + +
    \ No newline at end of file diff --git "a/tags/\350\277\233\347\250\213/index.html" "b/tags/\350\277\233\347\250\213/index.html" new file mode 100644 index 0000000..31c229b --- /dev/null +++ "b/tags/\350\277\233\347\250\213/index.html" @@ -0,0 +1,168 @@ +Tag: 进程 | SHYEE-PLASMA + + + + + + + +
    \ No newline at end of file diff --git "a/tags/\351\223\276\346\240\210/index.html" "b/tags/\351\223\276\346\240\210/index.html" new file mode 100644 index 0000000..270b13e --- /dev/null +++ "b/tags/\351\223\276\346\240\210/index.html" @@ -0,0 +1,168 @@ +Tag: 链栈 | SHYEE-PLASMA + + + + + + + +
    \ No newline at end of file diff --git "a/tags/\351\230\237\345\210\227/index.html" "b/tags/\351\230\237\345\210\227/index.html" new file mode 100644 index 0000000..e3b43ad --- /dev/null +++ "b/tags/\351\230\237\345\210\227/index.html" @@ -0,0 +1,168 @@ +Tag: 队列 | SHYEE-PLASMA + + + + + + + +
    \ No newline at end of file diff --git "a/tags/\351\230\277\345\260\224\345\205\271\346\265\267\351\273\230\347\227\207\346\213\257\346\225\221\350\256\241\345\210\222/index.html" "b/tags/\351\230\277\345\260\224\345\205\271\346\265\267\351\273\230\347\227\207\346\213\257\346\225\221\350\256\241\345\210\222/index.html" new file mode 100644 index 0000000..7eca3f0 --- /dev/null +++ "b/tags/\351\230\277\345\260\224\345\205\271\346\265\267\351\273\230\347\227\207\346\213\257\346\225\221\350\256\241\345\210\222/index.html" @@ -0,0 +1,168 @@ +Tag: 阿尔兹海默症拯救计划 | SHYEE-PLASMA + + + + + + + +
    \ No newline at end of file diff --git "a/tags/\351\234\200\346\261\202\345\210\206\346\236\220/index.html" "b/tags/\351\234\200\346\261\202\345\210\206\346\236\220/index.html" new file mode 100644 index 0000000..503450e --- /dev/null +++ "b/tags/\351\234\200\346\261\202\345\210\206\346\236\220/index.html" @@ -0,0 +1,168 @@ +Tag: 需求分析 | SHYEE-PLASMA + + + + + + + +
    \ No newline at end of file diff --git "a/tags/\351\235\231\346\200\201\345\210\206\351\205\215/index.html" "b/tags/\351\235\231\346\200\201\345\210\206\351\205\215/index.html" new file mode 100644 index 0000000..c9fb5fe --- /dev/null +++ "b/tags/\351\235\231\346\200\201\345\210\206\351\205\215/index.html" @@ -0,0 +1,168 @@ +Tag: 静态分配 | SHYEE-PLASMA + + + + + + + +
    \ No newline at end of file diff --git "a/tags/\351\235\231\346\200\201\351\223\276\350\241\250/index.html" "b/tags/\351\235\231\346\200\201\351\223\276\350\241\250/index.html" new file mode 100644 index 0000000..d49425b --- /dev/null +++ "b/tags/\351\235\231\346\200\201\351\223\276\350\241\250/index.html" @@ -0,0 +1,168 @@ +Tag: 静态链表 | SHYEE-PLASMA + + + + + + + +
    \ No newline at end of file diff --git "a/tags/\351\235\236\345\205\263\347\263\273\345\236\213/index.html" "b/tags/\351\235\236\345\205\263\347\263\273\345\236\213/index.html" new file mode 100644 index 0000000..f7fc9ef --- /dev/null +++ "b/tags/\351\235\236\345\205\263\347\263\273\345\236\213/index.html" @@ -0,0 +1,168 @@ +Tag: 非关系型 | SHYEE-PLASMA + + + + + + + +
    \ No newline at end of file diff --git "a/tags/\351\241\271\347\233\256\347\256\241\347\220\206/index.html" "b/tags/\351\241\271\347\233\256\347\256\241\347\220\206/index.html" new file mode 100644 index 0000000..e76061a --- /dev/null +++ "b/tags/\351\241\271\347\233\256\347\256\241\347\220\206/index.html" @@ -0,0 +1,168 @@ +Tag: 项目管理 | SHYEE-PLASMA + + + + + + + +
    \ No newline at end of file diff --git "a/tags/\351\241\271\347\233\256\351\242\204\347\256\227/index.html" "b/tags/\351\241\271\347\233\256\351\242\204\347\256\227/index.html" new file mode 100644 index 0000000..e9bcca0 --- /dev/null +++ "b/tags/\351\241\271\347\233\256\351\242\204\347\256\227/index.html" @@ -0,0 +1,168 @@ +Tag: 项目预算 | SHYEE-PLASMA + + + + + + + +
    \ No newline at end of file diff --git "a/tags/\351\241\272\345\272\217\346\240\210/index.html" "b/tags/\351\241\272\345\272\217\346\240\210/index.html" new file mode 100644 index 0000000..22a1a5f --- /dev/null +++ "b/tags/\351\241\272\345\272\217\346\240\210/index.html" @@ -0,0 +1,168 @@ +Tag: 顺序栈 | SHYEE-PLASMA + + + + + + + +
    \ No newline at end of file diff --git "a/tags/\351\241\272\345\272\217\350\241\250/index.html" "b/tags/\351\241\272\345\272\217\350\241\250/index.html" new file mode 100644 index 0000000..0817108 --- /dev/null +++ "b/tags/\351\241\272\345\272\217\350\241\250/index.html" @@ -0,0 +1,168 @@ +Tag: 顺序表 | SHYEE-PLASMA + + + + + + + +
    \ No newline at end of file