七牛云配置二级域名,从而避免七牛云30天自动更改域名的问题

七牛云配置二级域名,从而避免七牛云30天自动更改域名的问题

写在前面

为什么要解决这个问题呢,我们都知道七牛云在你新建一个存储空间的时候会给你分配一个临时的域名,这个域名是有时间限制的(一般是30天),如图:

VJev40.png

那么为了解决这个问题,我们就需要给七牛云配置我们自己的域名来访问里面存储的文件,那么我们正式开始吧!

添加域名

1.选择绑定域名

VJmpgU.md.png

在七牛云的控制面板中我们选择绑定域名然后进入这个界面:

VJmV4x.md.png

在加速域名这一栏我们输入自己的二级域名,这里不建议www开头,因为默认情况下我们把www开头的域名都当作我们自己的主域名。这里我输入qiniusave.luoshaoqi.cn,然后点击保存即可,其他选项可以默认。

2.配置dns解析

等待一段时间后如图所示显示成功,这样你就可以在你域名的服务商那里选择dns解析了

VJmuvD.md.png

鼠标移动到域名上选择复制CNAME

VJmhqJ.md.png

由于我使用的阿里云的域名,这里我进入阿里云的控制面板,选择云解析dns,点击设置进入dns解析设置面板。

VJmt8f.md.png

VJmUxS.md.png

然后选择添加记录

VJmDVs.md.png

填入如图所示的关键字 记录类型:CNAME;主机记录:你刚才填写的二级域名第一个字段

记录值:你刚才复制的CNAME

然后点击确定

3.查看七牛云面板

VJm6P0.md.png

如果这里显示成功的话就说明你已经成功配置了你的子域名到七牛云,现在你就可以通过你自己的域名访问七牛云上的文件了

测试

测试一下是否成功

VJmg2T.md.png

如果可以正常访问就说明你已经成功配置了自己的域名访问七牛云的文件!恭喜!

END

windows10 1903 + Windows Terminal 体验

windows10 1903 + Windows Terminal 体验

windows10 1903 安装

系统安装这里就不过多赘述了,在msdn上下载win10 1903 customer 版,这个版本包括家庭版,教育版,专业版等win10版本,这里我选择了win10专业版。

安装

安装由于我是mac的系统,这里也懒得装双系统所以就索性直接把系统装在我的虚拟机里面

经过一段时间1903安装完毕

Vlb8iD.md.png

安装宇宙第一IDE Visual Studio 2019

这里安装vs2019是为了等会方便我们编译项目

VlyIjH.md.png

  • 具体安装的选项如图所示 安装完毕大概17G(不愧是宇宙第一IDE,真TM大!!!)

VlOoY8.md.png

  • 然后等待安装即可

编译项目

1.在github上clone项目

git clone https://github.com/microsoft/Terminal

2. 打开clone的仓库输入

git submodule update --init --recursive
dep\nuget\nuget.exe restore OpenConsole.sln

3.打开宇宙第一IDE Visual Studio开始编译

VlbBo8.md.png

  • 编译

VlolC9.png

Windows Terminal 体验

1.安装ubuntu子系统(WSL)

VlbrFS.md.png

2.打开Windows Terminal

  • 这里给大家放几张图片看看

VlLRaV.md.png

VlLhPU.md.png

VlLLa6.md.png

  • 美化设置;这里附上我的设置文件
{
  "alwaysShowTabs": true,
  "defaultProfile": "{81d66518-899b-471f-a02e-de60a762bf41}",
  "experimental_showTabsInTitlebar": true,
  "initialCols": 120,
  "initialRows": 30,
  "profiles": [
    {
      "guid": "{81d66518-899b-471f-a02e-de60a762bf41}",
      "name": "cmd",
      "colorscheme": "Campbell",
      "historySize": 9001,
      "snapOnInput": true,
      "cursorColor": "#FFFFFF",
      "cursorShape": "bar",
      "commandline": "cmd.exe",
      "fontFace": "Consolas",
      "fontSize": 12,
      "acrylicOpacity": 0.75,
      "useAcrylic": true,
      "closeOnExit": false,
      "padding": "0, 0, 0, 0"
    },
    {
      "guid": "{f5a53144-ba97-4c0d-9848-9fe4728837ed}",
      "name": "PowerShell",
      "colorscheme": "Campbell",
      "historySize": 9001,
      "snapOnInput": true,
      "cursorColor": "#FFFFFF",
      "cursorShape": "bar",
      "commandline": "powershell.exe",
      "fontFace": "Courier New",
      "fontSize": 12,
      "acrylicOpacity": 0.5,
      "useAcrylic": true,
      "closeOnExit": false,
      "padding": "0, 0, 0, 0"
    },
    {
      "guid": "{09dc5eef-6840-4050-ae69-21e55e6a2e62}",
      "name": "Ubuntu",
      "colorscheme": "Campbell",
      "historySize": 9001,
      "snapOnInput": true,
      "cursorColor": "#FFFFFF",
      "cursorShape": "bar",
      "commandline": "wsl.exe",
      "fontFace": "Consolas",
      "fontSize": 12,
      "acrylicOpacity": 0.75,
      "useAcrylic": true,
      "closeOnExit": false,
      "padding": "0, 0, 0, 0"
    }
  ],
  "schemes": [
    {
      "name": "Campbell",
      "foreground": "#F2F2F2",
      "background": "#0C0C0C",
      "colors": [ "#0C0C0C", "#C50F1F", "#13A10E", "#C19C00", "#0037DA", "#881798", "#3A96DD", "#CCCCCC", "#767676", "#E74856", "#16C60C", "#F9F1A5", "#3B78FF", "#B4009E", "#61D6D6", "#F2F2F2" ]
    },
    {
      "name": "Solarized Dark",
      "foreground": "#FDF6E3",
      "background": "#073642",
      "colors": [ "#073642", "#D30102", "#859900", "#B58900", "#268BD2", "#D33682", "#2AA198", "#EEE8D5", "#002B36", "#CB4B16", "#586E75", "#657B83", "#839496", "#6C71C4", "#93A1A1", "#FDF6E3" ]
    },
    {
      "name": "Solarized Light",
      "foreground": "#073642",
      "background": "#FDF6E3",
      "colors": [ "#073642", "#D30102", "#859900", "#B58900", "#268BD2", "#D33682", "#2AA198", "#EEE8D5", "#002B36", "#CB4B16", "#586E75", "#657B83", "#839496", "#6C71C4", "#93A1A1", "#FDF6E3" ]
    }
  ],
  "showTerminalTitleInTitlebar": false
}

总结

目前Windows Terminal 还没有正式发布 还在测试阶段 肯定会有多多少少一些bug,但是喜欢尝鲜的朋友可以试试毕竟这也算是微软的一次很大的创新

附录

  • 编译详细教程

教程

添加ssh信任,让你的登陆无需密码

添加ssh信任,让你的登陆无需密码

一、生成ssh公钥和私钥

ssh-keygen -t rsa

在这里你会在你的.ssh文件夹里面看到两个文件

id_rsa //私钥
id_rsa.pub //公钥

私钥id_rsa是需要保密的,但是公钥id_rsa.pub可以用来上传到服务器的.ssh文件夹中完成配对

二、将你的公钥拷贝到服务器的.ssh文件夹中

1.利用ssh-copy-id

ssh-copy-id -i [你公钥id_rsa.pub的位置]/id_rsa.pub server_name@server_ip

这里会提示你输入密码 输入完成后完成公钥的上传,然后开始测试

在terminal里输入

ssh server_name@server_ip

如果不需要密码那么就说明已经完成了公钥的上传

2.使用scp命令将公钥上传到目标服务器的.ssh文件夹

在terminal中输入如下命令

scp [你公钥id_rsa.pub的位置]/id_rsa.pub server_name@server_ip:/.ssh/

然后进入你的服务器的.ssh文件夹如果有如下文件

id_rsa.pub

那么继续使用如下命令

cat /root/.ssh/id_rsa.pub >> /root/.ssh/authorized_keys 

这里将你的公钥id_rsa.pub 写入authorized_keys文件从而完成匹配

然后测试在本机上输入

ssh server_name@server_ip

如果可以进入那么恭喜你添加了ssh信任 这样就不需要密码就可以登陆了

END

Http与Https的区别

Http与Https的区别

​ 超文本传输协议HTTP协议被用于在Web浏览器和网站服务器之间传递信息,HTTP协议以明文方式发送内容,不提供任何方式的数据加密,如果攻击者截取了Web浏览器和网站服务器之间的传输报文,就可以直接读懂其中的信息,因此,HTTP协议不适合传输一些敏感信息,比如:信用卡号、密码等支付信息。

​ 为了解决HTTP协议的这一缺陷,需要使用另一种协议:安全套接字层超文本传输协议HTTPS,为了数据传输的安全,HTTPS在HTTP的基础上加入了SSL协议,SSL依靠证书来验证服务器的身份,并为浏览器和服务器之间的通信加密。

一、HTTP和HTTPS的基本概念

  HTTP:是互联网上应用最为广泛的一种网络协议,是一个客户端和服务器端请求和应答的标准(TCP),用于从WWW服务器传输超文本到本地浏览器的传输协议,它可以使浏览器更加高效,使网络传输减少。

  HTTPS:是以安全为目标的HTTP通道,简单讲是HTTP的安全版,即HTTP下加入SSL层,HTTPS的安全基础是SSL,因此加密的详细内容就需要SSL。

  HTTPS协议的主要作用可以分为两种:一种是建立一个信息安全通道,来保证数据传输的安全;另一种就是确认网站的真实性。

二、HTTP与HTTPS有什么区别?

HTTP协议传输的数据都是未加密的,也就是明文的,因此使用HTTP协议传输隐私信息非常不安全,为了保证这些隐私数据能加密传输,于是网景公司设计了SSL(Secure Sockets Layer)协议用于对HTTP协议传输的数据进行加密,从而就诞生了HTTPS。简单来说,HTTPS协议是由SSL+HTTP协议构建的可进行加密传输、身份认证的网络协议,要比http协议安全。

HTTPS和HTTP的区别主要如下:

  • https协议需要到ca申请证书,一般免费证书较少,因而需要一定费用。

  • http是超文本传输协议,信息是明文传输,https则是具有安全性的ssl加密传输协议。

  • http和https使用的是完全不同的连接方式,用的端口也不一样,前者是80,后者是443。

  • http的连接很简单,是无状态的;HTTPS协议是由SSL+HTTP协议构建的可进行加密传输、身份认证的网络协议,比http协议安全。

三、HTTPS的工作原理

我们都知道HTTPS能够加密信息,以免敏感信息被第三方获取,所以很多银行网站或电子邮箱等等安全级别较高的服务都会采用HTTPS协议。

工作原理

客户端在使用HTTPS方式与Web服务器通信时有以下几个步骤,如图所示。

  • 客户使用https的URL访问Web服务器,要求与Web服务器建立SSL连接。

  • Web服务器收到客户端请求后,会将网站的证书信息(证书中包含公钥)传送一份给客户端。

  • 客户端的浏览器与Web服务器开始协商SSL连接的安全等级,也就是信息加密的等级。

  • 客户端的浏览器根据双方同意的安全等级,建立会话密钥,然后利用网站的公钥将会话密钥加密,并传送给网站。

  • Web服务器利用自己的私钥解密出会话密钥。

  • Web服务器利用会话密钥加密与客户端之间的通信。

HTTP客户端

四、HTTPS的优点

  尽管HTTPS并非绝对安全,掌握根证书的机构、掌握加密算法的组织同样可以进行中间人形式的攻击,但HTTPS仍是现行架构下最安全的解决方案,主要有以下几个好处:

  • 使用HTTPS协议可认证用户和服务器,确保数据发送到正确的客户机和服务器;

  • HTTPS协议是由SSL+HTTP协议构建的可进行加密传输、身份认证的网络协议,要比http协议安全,可防止数据在传输过程中不被窃取、改变,确保数据的完整性。

  • HTTPS是现行架构下最安全的解决方案,虽然不是绝对安全,但它大幅增加了中间人攻击的成本。

  • 谷歌曾在2014年8月份调整搜索引擎算法,并称“比起同等HTTP网站,采用HTTPS加密的网站在搜索结果中的排名将会更高”。

五、HTTPS的缺点

虽然说HTTPS有很大的优势,但其相对来说,还是存在不足之处的:

  • HTTPS协议握手阶段比较费时,会使页面的加载时间延长近50%,增加10%到20%的耗电;

  • HTTPS连接缓存不如HTTP高效,会增加数据开销和功耗,甚至已有的安全措施也会因此而受到影响;

  • SSL证书需要钱,功能越强大的证书费用越高,个人网站、小网站没有必要一般不会用。

  • SSL证书通常需要绑定IP,不能在同一IP上绑定多个域名,IPv4资源不可能支撑这个消耗。

  • HTTPS协议的加密范围也比较有限,在黑客攻击、拒绝服务攻击、服务器劫持等方面几乎起不到什么作用。最关键的,SSL证书的信用链体系并不安全,特别是在某些国家可以控制CA根证书的情况下,中间人攻击一样可行。

六、http切换到HTTPS

如果需要将网站从http切换到https到底该如何实现呢?

​ 这里需要将页面中所有的链接,例如js,css,图片等等链接都由http改为https。例如:http://www.baidu.com改为https://www.baidu.com

  BTW,这里虽然将http切换为了https,还是建议保留http。所以我们在切换的时候可以做http和https的兼容,具体实现方式是,去掉页面链接中的http头部,这样可以自动匹配http头和https头。例如:将http://www.baidu.com改为//www.baidu.com。然后当用户从http的入口进入访问页面时,页面就是http,如果用户是从https的入口进入访问页面,页面即使https的。

原文地址

给网站添加HTTPS(添加SSL证书)

给网站添加HTTPS(添加SSSL证书)

一、HTTP和HTTPS的区别

点击查看区别

二、如何给你的网站添加SL证书

这里我以阿里云举例子,请确保你的网站已经备案并且可以访问http://你的域名

1.打开阿里云域名控制面板并点击管理

管理

2.点击免费申请SSL证书

SSL

3.点击免费证书 并填写你要颁发的域名

VPg6Ds.md.png

4.在证书面板里面找到你刚申请的证书 并根据提示完成审核然后下载SSL证书

VPg7r9.md.png

5.使用宝塔linux面板部署SSL证书

  • 打开宝塔linux面板(如下所示)

VPgv8O.png

  • 点击网站管理找到你之前绑定的网站如果没有绑定网站请参考本篇文档参考的添加站点部分
  • 点击设置

VP29rd.md.png

  • 在设置中的SSL一栏中如图所示添加你刚下载的证书(左边为.key文件的内容,右边为.pom文件的内容)

VPRDmj.png

  • 点击保存即可

6.然后访问你的网站测试效果https://你的域名

最后附上我的博客链接欢迎访问

RexRowe的博客

END

智慧教室树莓派端开发文档

智慧教室树莓派端开发文档

一、开发环境

1.硬件平台

  • Linux系统
  • 树莓派3B+
  • 海康威视萤石C6T摄像头

2.开发语言和开发平台

  • Python3
  • JetBrains PyCharm
  • Linux系统(Debian)
  • Unix内核系统(Mac OS X 10.14.3)

3.开发依赖的开源库

  • OpenCV开源视觉库
  • 多媒体处理工具ffmpeg
  • MySQL 5.7数据库
  • 百度AI开放平台
  • Face++ 开放平台

4.版本控制工具

  • 使用Git作为版本控制工具
  • 使用第三方git版本控制服务商github

二、系统流程与软件架构设计

1.系统流程

软件流程图

系统具体流程如图所示

  • 球机监控
  • 树莓派获取输入的RTSP视频流
  • ffmpeg处理截取关键帧
  • OpenCV分割人脸
  • 人脸库判断
  • 百度AI签到
  • 将出勤和学生状态发送给服务器
  • 计算学生抬头率
  • 将所有的结果写入数据库

2.模块设计

  • FaceDetect 图像识别模块
  • FaceSearch 人脸搜索与判断模块
  • FaceDataBase 数据库读取与数据库操作实现模块
  • LoadVideo RTSP流处理模块
  • Upload 数据结果上传模块
  • GetJudge 逻辑关系处理模块
  • Wisdom 功能整合模块

三、功能实现

1.输入输出信息

1.1 输入信息

  • 监控学生上课的动态视频
  • 监控视频的关键帧
  • 树莓派调用监控识别到的学生人脸信息
  • 学生的个人信息

1.2 输出信息

  • 学生上课的状态
  • 抬头率
  • 课堂考勤分数
  • 考勤统计
  • 人像签到
  • 将信息插入数据库

2.分析过程实现

  • 部分处理过程显示:

    实例1:

5D0023EE-68EE-4AEE-9D9B-37C5CEE6B94D

​ 实例2: 09B57452-2E96-40CF-B7C3-54292FB662F5

  • 部分程序输出示例:

    此输出实例为最后一次识别 这时系统已经记录了两次学生的睡觉信息

4normal2.jpg
当前识别到人脸数为:4
saving.....
saving.....
saving.....
saving.....
当前识别到的人体数为: 4
调用服务器数据库
当前出勤学生为:41609050201
识别成功,已存储
['41609050201']
{"status":1,"msg":"true","data":null}
已经把出勤信息发送给服务器
200
调用服务器数据库
当前出勤学生为:41609050203
识别成功,已存储
['41609050201', '41609050203']
{"status":1,"msg":"true","data":null}
已经把出勤信息发送给服务器
200
{"status":1,"msg":"true","data":null}
已经把出勤信息发送给服务器
200
调用服务器数据库
当前出勤学生为:41609030216
识别成功,已存储
['41609050201', '41609050203', '41609030216']
{"status":1,"msg":"true","data":null}
已经把出勤信息发送给服务器
200
{"status":1,"msg":"true","data":null}
已经把出勤信息发送给服务器
200
{"status":1,"msg":"true","data":null}
已经把出勤信息发送给服务器
200
调用服务器数据库
当前出勤学生为:41604090109
识别成功,已存储
['41609050201', '41609050203', '41609030216', '41604090109']
{"status":1,"msg":"true","data":null}
已经把出勤信息发送给服务器
200
{"status":1,"msg":"true","data":null}
已经把出勤信息发送给服务器
200
{"status":1,"msg":"true","data":null}
已经把出勤信息发送给服务器
200
{"status":1,"msg":"true","data":null}
已经把出勤信息发送给服务器
200
调用服务器数据库
调用本地debug数据库
当前识别到的学生为:['刘棋军', '刘梦', '史晓烁', '邹长林']
当前学生出勤情况为: {'刘梦': 4, '史晓烁': 4, '刘棋军': 2, '邹长林': 2}
低头的学生为: []
当前低头或睡觉学生情况为: {'刘棋军': 2, '邹长林': 2}
班级当前抬头率为:1.0
出勤率为: 1.0
清除临时文件完毕
人名已经清除


识别结束当前每个学生的出勤情况为:
{'刘梦': 4, '史晓烁': 4, '刘棋军': 2, '邹长林': 2}
本次识别中低头的学生情况为:
{'刘棋军': 2, '邹长林': 2}
学号信息为:
['41609050201', '41609050203', '41609030216', '41604090109']
调用服务器数据库
每个学生的抬头得分情况为:
{'刘梦': 40.0, '史晓烁': 40.0, '刘棋军': 20.0, '邹长林': 20.0}
{'41609050203': 1.0, '41609030216': 1.0, '41609050201': 0.5, '41604090109': 0.5}
{'41609050203': 40.0, '41609030216': 40.0, '41609050201': 20.0, '41604090109': 20.0}


## 3.调用API说明

- 使用了旷视科技的Face++开放平台的人脸识别模块facedetect
- 使用了百度AI开放平台的人脸识别API AipDetect
- 使用了百度AI开放平台的人脸搜索API AipFace
- 使用了百度AI开放平台的人体分析模块API AipBodyAnalysis



# 五、构建方法

## 1.依赖库安装

- OpenCV安装

  ```pip3 install python-opencv
  • 百度AI开放平台安装

    pip3 install baidu-aip

  • ffmpeg安装

    • 进入ffmpeg官方网站 http://ffmpeg.org/ 下载最新的版本

    • 解压安装

      tar -xjvf ffmpeg-3.3.1.tar.bz2
      cd ffmpeg-3.3.1/
      ./configure
      make
      make install
      
  • 安装git版本控制工具

    yum install git

2.软件下载运行

  • 软件下载

    在terminal下输入以下命令

    git clone git@github.com:RoWe98/WisdomClassRaspberry.git

  • 软件运行

    cd /WisdomClassRaspberry/app/
    python3 run.py
    

六、项目开源地址

##1.Github开源地址

https://github.com/xpuintelligence/Intelligence_classroom/tree/raspberryCode

2.开源协议

apache开源协议

markdown教程

欢迎使用Markdown编辑器写博客

本Markdown编辑器使用StackEdit修改而来,用它写博客,将会带来全新的体验哦:

  • Markdown和扩展Markdown简洁的语法
  • 代码块高亮
  • 图片链接和图片上传
  • LaTex数学公式
  • UML序列图和流程图
  • 离线写博客
  • 导入导出Markdown文件
  • 丰富的快捷键

快捷键

  • 加粗 Ctrl + B
  • 斜体 Ctrl + I
  • 引用 Ctrl + Q
  • 插入链接 Ctrl + L
  • 插入代码 Ctrl + K
  • 插入图片 Ctrl + G
  • 提升标题 Ctrl + H
  • 有序列表 Ctrl + O
  • 无序列表 Ctrl + U
  • 横线 Ctrl + R
  • 撤销 Ctrl + Z
  • 重做 Ctrl + Y

Markdown及扩展

Markdown 是一种轻量级标记语言,它允许人们使用易读易写的纯文本格式编写文档,然后转换成格式丰富的HTML页面。 —— [ 维基百科 ]

使用简单的符号标识不同的标题,将某些文字标记为粗体或者斜体,创建一个链接等,详细语法参考帮助?。

本编辑器支持 Markdown Extra ,  扩展了很多好用的功能。具体请参考Github.

表格

Markdown Extra 表格语法:

项目 价格
Computer $1600
Phone $12
Pipe $1

可以使用冒号来定义对齐方式:

项目 价格 数量
Computer 1600 元 5
Phone 12 元 12
Pipe 1 元 234

###定义列表

Markdown Extra 定义列表语法:
项目1
项目2
: 定义 A
: 定义 B

项目3
: 定义 C

: 定义 D

> 定义D内容

代码块

代码块语法遵循标准markdown代码,例如:

@requires_authorization
def somefunc(param1='', param2=0):
    '''A docstring'''
    if param1 > param2: # interesting
        print 'Greater'
    return (param2 - param1 + 1) or None
class SomeClass:
    pass
>>> message = '''interpreter
... prompt'''

###脚注
生成一个脚注[^footnote].
[^footnote]: 这里是 脚注内容.

目录

[TOC]来生成目录:

@[toc]

数学公式

使用MathJax渲染LaTex 数学公式,详见math.stackexchange.com.

  • 行内公式,数学公式为:$\Gamma(n) = (n-1)!\quad\forall n\in\mathbb N$。
  • 块级公式:

$$ x = \dfrac{-b \pm \sqrt{b^2 - 4ac}}{2a} $$

更多LaTex语法请参考 这儿.

UML 图:

可以渲染序列图:

sequenceDiagram
张三->>李四: 嘿,小四儿, 写博客了没?
Note right of 李四: 李四愣了一下,说:
李四-->>张三: 忙得吐血,哪有时间写。
  • 关于 序列图 语法,参考 这儿,
  • 关于 流程图 语法,参考 这儿.

离线写博客

即使用户在没有网络的情况下,也可以通过本编辑器离线写博客(直接在曾经使用过的浏览器中输入write.blog.csdn.net/mdeditor即可。Markdown编辑器使用浏览器离线存储将内容保存在本地。

用户写博客的过程中,内容实时保存在浏览器缓存中,在用户关闭浏览器或者其它异常情况下,内容不会丢失。用户再次打开浏览器时,会显示上次用户正在编辑的没有发表的内容。

博客发表后,本地缓存将被删除。 

用户可以选择 把正在写的博客保存到服务器草稿箱,即使换浏览器或者清除缓存,内容也不会丢失。

注意:虽然浏览器存储大部分时候都比较可靠,但为了您的数据安全,在联网后,请务必及时发表或者保存到服务器草稿箱

##浏览器兼容

  1. 目前,本编辑器对Chrome浏览器支持最为完整。建议大家使用较新版本的Chrome。
  2. IE9以下不支持
  3. IE9,10,11存在以下问题
    1. 不支持离线功能
    2. IE9不支持文件导入导出
    3. IE10不支持拖拽文件导入

一步步带你搭建远程服务器的git仓库,并将自己的博客部署到服务器上

一步步带你搭建远程服务器的git仓库,并将自己的博客部署到服务器上

本次教程基于宝塔linux控制面板 没有安装宝塔的可以进入如下网页安装宝塔

本次教程基于HEXO博客架构 这里我默认你已经安装了hexo博客而且可以往github上push页面 并且可以访问

http://你的githubid.github.io 的博客网站

如果你已经测试成功上面的两个步骤那你就可以继续往下看 如果不行 请将上面两个前提条件实现

使用阿里云的朋友如果你的服务器为新的镜像请做如下操作:

  • 将你的系统镜像更改为宝塔面板(BT-PANEL)

  • 在防火墙端口开放如下端口:8888,80,3306,8080

  • http://服务器ip:8888 为你的宝塔控制面板地址

  • 输入如下命令查看宝塔的默认密码,ps:默认管理员账号为:admin

sudo cat /www/server/panel/default.pl

看到这一步我已经默认你安装完宝塔linux界面并可以进入管理员界面 如图所示

界面

服务器设置

这里我默认认为你已经在本地配置了git账号密码

1.安装git

当然以下操作都是在你远程服务器上操作的

centos 输入以下命令

git --version // 如无,则安装
yum install curl-devel expat-devel gettext-devel openssl-devel zlib-devel perl-devel
yum install -y git

2.配置git仓库

1.创建用户git并配置仓库

useradd git
passwd git // 设置密码
su git // 这步很重要,不切换用户后面会很麻烦
mkdir -p /www/wwwroot/blog // 项目存在的真实目录,由于需要用到宝塔 我们把博客地址放到宝塔网站地址下
如果上面mkdir出错是因为我们没有把git用户添加到sudoers中
做如下操作
sudo su //输入密码进入root用户
cd /etc/
vim sudoers

找到root ALL=(ALL) ALL
在下面添加

git ALL=(ALL)   ALL

注意对齐

然后进入git用户执行如下命令

su git
sudo mkdir -p /www/wwwroot/blog
cd /home/git/
mkdir repos && cd repos
git init --bare blog.git
cd blog.git/hooks
vi post-receive // 创建hook钩子函数,输入了内容如下(原理可以参考上面的链接)

输入如下内容

#!/bin/sh
git --work-tree=/www/wwwroot/blog --git-dir=/home/git/repos/blog.git checkout -f

添加完毕后修改权限,执行如下命令

chmod +x post-receive
exit // 退出到 root 登录
chown -R git:git /home/git/repos/blog.git // 添加权限

测试git仓库是否可用,另找空白文件夹,执行如下命令
注意这一步在自己的电脑上测试

git clone git@server_ip:/home/git/repos/blog.git

如果能把空仓库拉下来,就说明 git 仓库搭建成功了
当然你会提示你拉下来的是空仓库

3.本地电脑设置

建立ssh信任关系,在本地电脑,执行如下命令

参考资料:

ssh-copy-id -i C:/Users/yourname/.ssh/id_rsa.pub git@server_ip
ssh git@server_ip // 测试能否登录
注:此时的 ssh 登录 git 用户不需要密码!否则就有错,请仔细重复步骤 3-4

如果第 5 步能成功,为了安全起见禁用git用户的 shell 登录权限,从而只能用git clone,git push等登录,执行如下命令

cat /etc/shells // 查看`git-shell`是否在登录方式里面,有则跳过
which git-shell // 查看是否安装
vi /etc/shells
添加上2步显示出来的路劲,通常在 /usr/bin/git-shell

修改/etc/passwd中的权限,将原来的

git:x:1000:1000::/home/git:/bin/bash

修改为

git:x:1000:1000:,,,:/home/git:/usr/bin/git-shell

4.宝塔面板设置

  • 进入你的宝塔面板 yourip:8888 并输入账号密码进入如下界面

界面

选择网站 添加站点 如图所示

网站

然后填入如下信息

  • 网站ip
  • 网站目录选择/www/wwwroot/blog

设置

然后点击提交

5.HEXO配置文件设置

在你和hexo博客配置文件中找到根目录中的_config.yml 在deploy项中修改如下

设置

deploy:
    type: git
    repository:
      github: 这里是你的github.io页面地址
      server: git@你的ip:/home/git/repos/blog.git
    branch: master

然后执行如下命令将你的博客push到服务器的git仓库中

hexo clean
hexo d -g

然后在浏览器输入你的网站http://ip/ 查看效果

成功的话会显示你的主页界面

主页

最后放上我的博客首页欢迎访问

#END

mac系统下更改hosts提高github clone速度

mac系统下更改hosts提高github clone速度

首先

相信很多人和我一样遇到过这种情况在github中clone项目时会发生下面这种情况

clone

遇到这种情况大部分人肯定很难受。。。。

我clone一个项目怎么这么久!fak!

那么我们可以通过更改hosts的方法来修复这个问题

方法

  • 在mac系统下输入如下命令
sudo vim /etc/hosts

如图所示:

host

  • 然后如图在最后两行加入如下命令
151.101.133.194 http://global-ssl.fastly.net
192.30.253.112 http://github.com
  • 然后输入如下命令 刷新hosts
sudo killall -HUP mDNSResponder

然后测试速度大概能到500kb/s~3m/s

#END

进程调度

进程调度

  • 无论是在批处理系统还是分时系统中,用户进程数一般都多于处理机数、这将导致它们互相争夺处理机。另外,系统进程也同样需要使用处理机。这就要求进程调度程序按一定的策略,动态地把处理机分配给处于就绪队列中的某一个进程,以使之执行。

进程的状态

基本状态

  • 等待态:等待某个事件的完成;
  • 就绪态:等待系统分配处理器以便运行;
  • 运行态:占有处理器正在运行。
  • 运行态→等待态 往往是由于等待外设,等待主存等资源分配或等待人工干预而引起的。
  • 等待态→就绪态 则是等待的条件已满足,只需分配到处理器后就能运行。
  • 运行态→就绪态 不是由于自身原因,而是由外界原因使运行状态的进程让出处理器,这时候就变成就绪态。例如时间片用完,或有更高优先级的进程来抢占处理器等。
  • 就绪态→运行态 系统按某种策略选中就绪队列中的一个进程占用处理器,此时就变成了运行态

算法讲解

  • 进程调度算法:采用最高优先数优先的调度算法(即把处理机分配给优先数最高的进程)和先来先服务算法。

  • 每个进程有一个进程控制块( PCB)表示。进程控制块可以包含如下信息:进程名、优先数、到达时间、需要运行时间、已用CPU时间、进程状态等等。

  • 进程的优先数及需要的运行时间可以事先人为地指定(也可以由随机数产生)。进程的到达时间为进程输入的时间。

  • 进程的运行时间以时间片为单位进行计算。每个进程的状态可以是就绪 W(Wait)、运行R(Run)、或完成F(Finish)三种状态之一。

  • 就绪进程获得 CPU后都只能运行一个时间片。用已占用CPU时间加1来表示。
    如果运行一个时间片后,进程的已占用 CPU时间已达到所需要的运行时间,则撤消该进程,如果运行一个时间片后进程的已占用CPU时间还未达所需要的运行时间,也就是进程还需要继续运行,此时应将进程的优先数减1(即降低一级),然后把它插入就绪队列等待CPU。每进行一次调度程序都打印一次运行进程、就绪队列、以及各个进程的 PCB,以便进行检查。重复以上过程,直到所要进程都完成为止。

程序详情

#include "stdio.h"
#include <stdlib.h>
#define getpch(type) (type *)malloc(sizeof(type))
#define NULL 0
struct pcb /* 定义进程控制块PCB */
{
  char name[10];
  char state;
  int super;
  int ntime;
  int rtime;
  struct pcb *link;
} *ready = NULL, *p;

typedef struct pcb PCB;
void sort() /* 建立对进程进行优先级排列函数*/
{
  PCB *first, *second;
  int insert = 0;
  if ((ready == NULL) || ((p->super) > (ready->super))) /*优先级最大者,插入队首*/
  {
    p->link = ready;
    ready = p;
  }
  else /* 进程比较优先级,插入适当的位置中*/
  {
    first = ready;
    second = first->link;
    while (second != NULL)
    {
      if ((p->super) > (second->super)) /*若插入进程比当前进程优先数大,*/
      {                                 /*插入到当前进程前面*/
        p->link = second;
        first->link = p;
        second = NULL;
        insert = 1;
      }
      else /* 插入进程优先数最低,则插入到队尾*/
      {
        first = first->link;
        second = second->link;
      }
    }
    if (insert == 0)
      first->link = p;
  }
}
void input() /* 建立进程控制块函数*/
{
  int i, num;
  printf("\n 请输入进程数?");
  scanf("%d", &num);
  for (i = 0; i < num; i++)
  {
    printf("\n 进程号No.%d:\n", i);
    p = getpch(PCB);
    printf("\n 输入进程名:");
    scanf("%s", p->name);
    printf("\n 输入进程优先数:");
    scanf("%d", &p->super);
    printf("\n 输入进程运行时间:");
    scanf("%d", &p->ntime);
    printf("\n");
    p->rtime = 0;
    p->state = 'w';
    p->link = NULL;
    sort(); /* 调用sort函数*/
  }
}
int space()
{
  int l = 0;
  PCB *pr = ready;
  while (pr != NULL)
  {
    l++;
    pr = pr->link;
  }
  return (l);
}
void disp(PCB *pr) /*建立进程显示函数,用于显示当前进程*/
{
  printf("\n qname \t state \t super \t ndtime \t runtime \n");
  printf("|%s\t", pr->name);
  printf("|%c\t", pr->state);
  printf("|%d\t", pr->super);
  printf("|%d\t", pr->ntime);
  printf("|%d\t", pr->rtime);
  printf("\n");
}

void check() /* 建立进程查看函数 */
{
  PCB *pr;
  printf("\n **** 当前正在运行的进程是:%s", p->name); /*显示当前运行进程*/
  disp(p);
  pr = ready;
  printf("\n ****当前就绪队列状态为:\n"); /*显示就绪队列状态*/
  while (pr != NULL)
  {
    disp(pr);
    pr = pr->link;
  }
}
void destroy() /*建立进程撤消函数(进程运行结束,撤消进程)*/
{
  printf("\n 进程 [%s] 已完成.\n", p->name);
  free(p);
}
void running() /* 建立进程就绪函数(进程运行时间到,置就绪状态*/
{
  (p->rtime)++;
  if (p->rtime == p->ntime)
    destroy(); /* 调用destroy函数*/
  else
  {
    (p->super)--;
    p->state = 'w';
    sort(); /*调用sort函数*/
  }
}
int main() /*主函数*/
{
  int len, h = 0;
  char ch;
  input();
  len = space();
  while ((len != 0) && (ready != NULL))
  {
    ch = getchar();
    h++;
    printf("\n The execute number:%d \n", h);
    p = ready;
    ready = p->link;
    p->link = NULL;
    p->state = 'R';
    check();
    running();
    printf("\n 按任一键继续......");
    ch = getchar();
  }
  printf("\n\n 进程已经完成.\n");
  ch = getchar();
  return 0;
}

运行情况

运行情况

运行情况

运行情况

END