<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8" />
<meta name="viewport" content="width=device-width" />
<title>T</title>
<style>
.images-box {
padding: 0 0vw 2vw 0vw;
font-size: 0;
word-spacing: 0;
letter-spacing: 1vw;
line-height: 1vw;
}
.images-box a {
display: inline-block;
height: 30%;
width: 30%;
overflow: hidden;
text-decoration: none;
-webkit-tap-highlight-color: rgba(0, 0, 0, 0);
}
.images-box a:only-child {
height: initial;
width: initial;
max-width: 80%;
}
.images-box a:nth-child(1):nth-last-child(2) {
width: 45%;
height: 45%;
}
.images-box a:nth-child(2):nth-last-child(1) {
width: 45%;
height: 45%;
}
.images-box a:nth-child(1):nth-last-child(4) {
height: 45%;
width: 45%;
}
.images-box a:nth-child(2):nth-last-child(3) {
height: 45%;
width: 45%;
}
.images-box a:nth-child(3):nth-last-child(2) {
height: 45%;
width: 45%;
}
.images-box a:nth-child(4):nth-last-child(1) {
height: 45%;
width: 45%;
}
.images-box a img {
width: 100%;
height: 100%;
object-fit: cover;
}
</style>
</head>
<body>
<div class="images-box">
<a><img src="./1.jpg"></img></a>
<a><img src="./1.jpg"></img></a>
<a><img src="./1.jpg"></img></a>
...
</div>
</body>
</html>
一段自适应图片排版CSS
时间复杂度分析之一
#include<stdio.h>
int main(){
int x = 90;
int y = 100;
while(y > 0)
if(x > 100){
x = x - 10;
y--;
}
else x++;
}
x | y | 基础操作语句执行 |
---|---|---|
90 | 100 | 未执行 |
91 | 100 | 未执行 |
92 | 100 | 未执行 |
93 | 100 | 未执行 |
94 | 100 | 未执行 |
95 | 100 | 未执行 |
96 | 100 | 未执行 |
97 | 100 | 未执行 |
98 | 100 | 未执行 |
99 | 100 | 未执行 |
100 | 100 | 未执行 |
101 | 100 | 执行第一次 |
91 | 99 | 未执行 |
92 | 99 | 未执行 |
93 | 99 | 未执行 |
94 | 99 | 未执行 |
… | … | … |
x
总是从90~101
循环,y
从100
减小到0
,y
每减小1
,最内层循环执行1
次,共执行100
次; 所以时间复杂度为O(1)
;
Typora 自动显示序号
1、打开Typora软件的主题目录(文件-偏好设置-外观-打开主题文件夹)
类似C:\Users\i\AppData\Roaming\Typora\themes
这种
2、在主题目录下新建文件,命名为base.user.css
,注意拓展名为css,没有显示拓展名的系统可能为txt
3、将以下代码写入base.user.css中
/** initialize css counter */
#write, .sidebar-content,.md-toc-content {
counter-reset: h1
}
#write h1, .outline-h1, .md-toc-item.md-toc-h1 {
counter-reset: h2
}
#write h2, .outline-h2, .md-toc-item.md-toc-h2 {
counter-reset: h3
}
#write h3, .outline-h3, .md-toc-item.md-toc-h3 {
counter-reset: h4
}
#write h4, .outline-h4, .md-toc-item.md-toc-h4 {
counter-reset: h5
}
#write h5, .outline-h5, .md-toc-item.md-toc-h5 {
counter-reset: h6
}
/** put counter result into headings */
#write h1:before,
h1.md-focus.md-heading:before,
.outline-h1>.outline-item>.outline-label:before,
.md-toc-item.md-toc-h1>.md-toc-inner:before{
counter-increment: h1;
content: counter(h1) " "
}
#write h2:before,
h2.md-focus.md-heading:before,
.outline-h2>.outline-item>.outline-label:before,
.md-toc-item.md-toc-h2>.md-toc-inner:before{
counter-increment: h2;
content: counter(h1) "." counter(h2) " "
}
#write h3:before,
h3.md-focus.md-heading:before,
.outline-h3>.outline-item>.outline-label:before,
.md-toc-item.md-toc-h3>.md-toc-inner:before {
counter-increment: h3;
content: counter(h1) "." counter(h2) "." counter(h3) " "
}
#write h4:before,
h4.md-focus.md-heading:before,
.outline-h4>.outline-item>.outline-label:before,
.md-toc-item.md-toc-h4>.md-toc-inner:before {
counter-increment: h4;
content: counter(h1) "." counter(h2) "." counter(h3) "." counter(h4) " "
}
#write h5:before,
h5.md-focus.md-heading:before,
.outline-h5>.outline-item>.outline-label:before,
.md-toc-item.md-toc-h5>.md-toc-inner:before {
counter-increment: h5;
content: counter(h1) "." counter(h2) "." counter(h3) "." counter(h4) "." counter(h5) " "
}
#write h6:before,
h6.md-focus.md-heading:before,
.outline-h6>.outline-item>.outline-label:before,
.md-toc-item.md-toc-h6>.md-toc-inner:before {
counter-increment: h6;
content: counter(h1) "." counter(h2) "." counter(h3) "." counter(h4) "." counter(h5) "." counter(h6) " "
}
/** override the default style for focused headings */
#write>h3.md-focus:before,
#write>h4.md-focus:before,
#write>h5.md-focus:before,
#write>h6.md-focus:before,
h3.md-focus:before,
h4.md-focus:before,
h5.md-focus:before,
h6.md-focus:before {
color: inherit;
border: inherit;
border-radius: inherit;
position: inherit;
left:initial;
float: none;
top:initial;
font-size: inherit;
padding-left: inherit;
padding-right: inherit;
vertical-align: inherit;
font-weight: inherit;
line-height: inherit;
}
4、重启软件,测试
—End—
关于CSS的定位属性 – Position
position 属性用于表名元素的定位类型,数据类型表示用于设置相对于框的位置的2D空间中的坐标,该属性共有5个值:static
、relative
、fixed
、absolute
、sticky
.
CSS position
属性用于指定一个元素在文档中的定位方式。top
,right
,bottom
和 left
属性则决定了该元素的最终位置。
一个偏移量可以是一个相对值用以表示 %
(百分比),或是一个绝对的 length
(长度)值。正值是向右或向下的偏移,看适用于哪一个。负值则是在另外方向上的偏移。
语法
[ [ left | center | right | top | bottom | <percentage> | <length> ] |
[ left | center | right | <percentage> | <length> ] [ top | center | bottom | <percentage> | <length> ] |
[ center | [ left | right ] [ <percentage> | <length> ]? ] &&
[ center | [ top | bottom ] [ <percentage> | <length> ]? ]
]
1、 静态定位 – static
静态定位是元素的默认属性,指定元素使用正常的布局行为,即元素在文档常规流中当前的布局位置。此时 top
, right
, bottom
, left
和 z-index
属性无效。
```css
.class {
position: static;
}
```
2、 固定定位 – fixed
元素会被移出正常文档流,并不为元素预留空间,而是通过指定元素相对于屏幕视口(viewport)的位置来指定元素位置。元素的位置在屏幕滚动时不会改变。打印时,元素会出现在的每页的固定位置。fixed
属性会创建新的层叠上下文。当元素祖先的 transform
, perspective
或 filter
属性非 none
时,容器由视口改为该祖先。
元素的位置相对于浏览器窗口是固定位置,元素的位置与文档流无关,Fixed定位的元素和其他元素重叠。
.class {
position:fixed;
top:2px;
right:7px;
}
3、相对定位 – relative
该关键字下,元素先放置在未添加定位时的位置,再在不改变页面布局的前提下调整元素位置(因此会在此元素未添加定位时所在位置留下空白)。position:relative 对 table-*-group, table-row, table-column, table-cell, table-caption 元素无效。
相对定位元素的定位是相对其正常位置,移动相对定位元素,但它原本所占的空间不会改变。
<div class="box" id="one">One</div>
<div class="box" id="two">Two</div>
<div class="box" id="three">Three</div>
<div class="box" id="four">Four</div>
.box {
display: inline-block;
width: 100px;
height: 100px;
background: red;
color: white;
}
#two {
position: relative;
top: 20px;
left: 20px;
background: blue;
}
4、绝对定位 – absolute
元素会被移出正常文档流,并不为元素预留空间,通过指定元素相对于最近的非 static 定位祖先元素的偏移,来确定元素位置。绝对定位的元素可以设置外边距(margins),且不会与其他边距合并。
绝对定位的元素的位置相对于最近的已定位父元素,如果元素没有已定位的父元素,那么它的位置相对于<html>
,absolute 定位使元素的位置与文档流无关,因此不占据空间,absolute 定位的元素和其他元素重叠。
.class {
position:absolute;
left:70px;
top:80px;
}
5、粘性定位 – sticky
粘性定位的元素是依赖于用户的滚动,在 position:relative 与 position:fixed 定位之间切换。
它的行为就像 position:relative; 而当页面滚动超出目标区域时,它的表现就像 position:fixed;,它会固定在目标位置。
元素定位表现为在跨越特定阈值前为相对定位,之后为固定定位。
这个特定阈值指的是 top, right, bottom 或 left 之一,换言之,指定 top, right, bottom 或 left 四个阈值其中之一,才可使粘性定位生效。否则其行为与相对定位相同。
元素根据正常文档流进行定位,然后相对它的最近滚动祖先(nearest scrolling ancestor)和 containing block (最近块级祖先 nearest block-level ancestor),包括table-related元素,基于top
, right
, bottom
, 和 left
的值进行偏移。偏移值不会影响任何其他元素的位置。
该值总是创建一个新的层叠上下文(stacking context)。注意,一个sticky元素会“固定”在离它最近的一个拥有“滚动机制”的祖先上(当该祖先的overflow
是 hidden
, scroll
, auto
, 或 overlay
时),即便这个祖先不是最近的真实可滚动祖先。这有效地抑制了任何“sticky”行为(详情见Github issue on W3C CSSWG)。
.calss {
position: sticky;
top: 10px;
}
说明
1、大多数情况下,height
和width
被设定为auto的绝对定位元素,按其内容大小调整尺寸。但是,被绝对定位的元素可以通过指定top
和bottom
,保留height
未指定(即auto
),来填充可用的垂直空间。它们同样可以通过指定left
和 right
并将width
指定为auto
来填充可用的水平空间。
Lombok 安装使用
lombok 简介
Lombok 是Java语言编程中可以使用的一种工具,它可用来帮助开发人员减少编写一些可以机械完成的代码,尤其是对于简单的 Java 对象(POJO)。它通过注解实现这一目的。
比如:
public class Mountain{
private String name;
private double longitude;
private String country;
}
要生成这个对象的 get、set方法,有参构造、无参构造器等,都可以通过简单的注解实现。
@Data // 只添加这一个注解
public class Mountain{
private String name;
private double longitude;
private String country;
}
只添加@Data
这一个注解,就可以自动生成该类的get、set、equals方法等
当然,也有@AllArgsConstructor,@NoArgsConstructor,@Getter,@Setter
等注解。
使用方法
1、安装 IDEA 的 lombok plugin 插件
插件安装:File-Settings-Plugs-Browse repositories...
搜索安装即可
可能由于我的 IDEA 版本较旧,安装时搜索不到这个插件,可以到网上下载后安装
地址:https://plugins.jetbrains.com/plugin/6317-lombok/versions
2、引入maven依赖
<!--lombok-->
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>1.18.6</version>
<scope>provided</scope>
</dependency>
3、在需要添加相关方法的类上加相关注解
—End—
删除鼠标右键新建文件列表项
一、缘起
安装完新软件后,软件会写入注册表一些文件,鼠标右键新建文件列表就会出现好多不常用的文件类型,对于我来说,刚刚安装的 PowerDesigner 软件就会在鼠标右键新建列表写入很多新类型文件,但我不想使用,在我想使用鼠标右键新建一个 word 文档的时候,看到一列长长的文件类型瞬间有种大海捞针的感觉,十分头疼,于是打算“干掉”这群不速之客。
二、解决方案
使用快捷键win
+ r
, 打开运行窗口,输入regedit
,打开注册表,在计算机\HKEY_CLASSES_ROOT\
下,会有很多以点开头的目录,这是文件的拓展名。类似下图就是 Microsoft Word 软件的文件拓展名之一.docx
,目录下的 ShellNew 就是今天的主角了。
ShellNew 文件夹的作用就是在鼠标右键的新建列表添加该类型的新建文件。所以我们只需要找到想要删除的文件类型,删除 ShellNew 文件夹即可。比如想要删除这个选项,
我们只需要查看这个文件的拓展名,不知道的话可以新建一个文件看一下
如果没有的话,你可能需要搜索一下如何显示文件拓展名的相关知识。
接下来,我们在注册表找到它
我们只需要删除 ShellNew文件夹即可。此时右键新建文件列表已经没有这个选项了。
—— End ——
Typecho归档页模版
<?php if (!defined('__TYPECHO_ROOT_DIR__')) exit; ?>
<?php
//TODO:先使用PHP定义变量实现,后期使用自定义主题实现
$x=2;
/**
* archive2
* @package custom
*/
Typecho_Widget::widget('Widget_Stat')->to($stat);
?>
<?php $this->need('header.php'); ?>
<div id="content">
<section class="post">
<span class="archive-move-on"></span>
<?php
$all=($stat->publishedPostsNum);
//页数=向上取整(总归档数/每页文章数);
$pages=ceil($all/$x);
//echo '<p>'.$pages.'</p>';
$this->widget('Widget_Contents_Post_Recent',
'pageSize=10000')->to($archives);
//$year=0; $mon=0; $i=0; $j=0;
$output = '<span class="archive-page-counter">
<h2>目前共计 '.$stat->publishedPostsNum.' 篇日志。</h2><ul></span>';
$count=0;
$i=1;
while($archives->next()):
if($count%$x==0) {
if($count==0) {
$output.='<div id="archive page '.$i.'" class="archive" >';
} else if($count!=0) {
$output.='</div>';
$output.='<div id="archive page '.$i.'" c
lass="archive" style="display:none;">';
}
$i++;
}
$output .='<li><time class="post-time" itemprop="dateCreated"
content="'.date('Y-m-d',
$archives->created).'">'
.date('Y-m-d',$archives->created)
.'</time>'." "
.'<a class="post-title-link" href="'
.$archives->permalink
.'" itemprop="url"><span itemprop="name">'
. $archives->title .'</span></a></li>';
$count++;
endwhile;
$output.='</div>';
echo $output;
printNav($pages);
?>
</section>
</div>
<?php
function printNav($pages) {
$script='<script type=\'text/javascript\'>';
$output='<ol class="page-navigator" style="margin-left: 0px;">';
$script.='page1();';
for($i=1;$i<=$pages;$i++) {
$output.='<li id="page'.$i.'" >';
$script.='function page'.$i.'()
{var elems=document.getElementsByClassName("archive");
for(var i=0;i<elems.length;i+=1){elems[i].style.display="none";};
document.getElementById("archive page '.$i.'")
.style.display="inline";';
$script.='var current=document.getElementsByClassName("current");
for(var i=0;i<current.length;i+=1){current[i]
.setAttribute("class","")};';
$script.='document.getElementById("page'.$i.'")
.className="current";';
$output.='<a href="javascript:void(0)"
onclick="page'.$i.'()">'.$i.'</a></li>';
$script.='}';
}
$output.='</ol>';
$script.='</script>';
echo $output;
echo $script;
}
?>
<?php $this->need('footer.php'); ?>
CentOS 7 安装 LAMP环境
环境:操作系统:CentOS 7.6 64位
一、准备工作
1、查看系统版本
cat /etc/redhat-release
CentOS Linux release 7.9.2009 (Core)
2、查看防火墙状态
systemctl status firewalld
[root@iZbp1c1dto65uh7clwak1qZ ~]# systemctl status firewalld
● firewalld.service - firewalld - dynamic firewall daemon
Loaded: loaded (/usr/lib/systemd/system/firewalld.service; disabled; vendor preset: enabled)
Active: inactive (dead)
Docs: man:firewalld(1)
如果防火墙的状态参数是inactive,则防火墙为关闭状态。
如果防火墙的状态参数是active,则防火墙为开启状态。本示例中防火墙为开启状态,因此需要关闭防火墙。
3、关闭防火墙
● 如果您想临时关闭防火墙,运行命令systemctl stop firewalld
。
说明: 这只是暂时关闭防火墙,下次重启Linux后,防火墙还会开启。
● 如果您想永久关闭防火墙,运行命令systemctl disable firewall
4、查看SELinux状态
运行getenforce
命令查看SELinux的当前状态
[root@iZbp1c1dto65uh7clwak1qZ ~]# getenforce
Disabled
● 如果SELinux状态参数是Disabled, 则SELinux为关闭状态。
● 如果SELinux状态参数是Enforcing,则SELinux为开启状态。本示例中SELinux为开启状态,因此需要关闭SELinux。
5、关闭SELinux
如果SELinux为关闭状态,请忽略此步骤。
● 如果您想临时关闭SELinux,运行命令setenforce 0
。
说明: 这只是暂时关闭SELinux,下次重启Linux后,SELinux还会开启。
● 如果您想永久关闭SELinux,运行命令vi /etc/selinux/config
编辑SELinux配置文件。回车后,把光标移动到SELINUX=enforcing
这一行,按i键,将其修改为SELINUX=disabled
, 按Esc键,然后输入:wq
并回车以保存并关闭SELinux配置文件。 最后重启系统使设置生效。
6、更新系统
$ yum -y update:升级所有bai包同时也升级软件和系统内核;
$ yum -y upgrade:只升级所有包,不升级软件和系统内核。
二、安装Apache
1、安装apache
yum -y install httpd httpd-manual mod_ssl mod_perl mod_auth_mysql
.
.
.
perl-BSD-Resource.x86_64 0:1.29.07-1.el7 perl-Data-Dumper.x86_64 0:2.145-3.el7 perl-ExtUtils-Install.noarch 0:1.58-299.el7_9
perl-ExtUtils-MakeMaker.noarch 0:6.68-3.el7 perl-ExtUtils-Manifest.noarch 0:1.61-244.el7 perl-ExtUtils-ParseXS.noarch 1:3.18-3.el7
perl-Linux-Pid.x86_64 0:0.04-18.el7 perl-Test-Harness.noarch 0:3.28-3.el7 perl-devel.x86_64 4:5.16.3-299.el7_9
pyparsing.noarch 0:1.5.6-9.el7 systemtap-sdt-devel.x86_64 0:4.0-13.el7
Complete!
运行httpd -v
命令可查看Apache的版本号。
2、启动apache服务
systemctl start httpd
3、设置httpd服务开机启动
systemctl enable httpd
[root@iZbp1c1dto65uh7clwak1qZ ~]# systemctl enable httpd
Created symlink from /etc/systemd/system/multi-user.target.wants/httpd.service to /usr/lib/systemd/system/httpd.service.
4、查看服务状态
systemctl status httpd
[root@iZbp1c1dto65uh7clwak1qZ ~]# systemctl status httpd
● httpd.service - The Apache HTTP Server
Loaded: loaded (/usr/lib/systemd/system/httpd.service; enabled; vendor preset: disabled)
Active: active (running) since Sun 2021-02-07 16:38:44 CST; 30s ago
Docs: man:httpd(8)
man:apachectl(8)
Main PID: 31987 (/usr/sbin/httpd)
Status: "Total requests: 0; Current requests/sec: 0; Current traffic: 0 B/sec"
CGroup: /system.slice/httpd.service
├─31987 /usr/sbin/httpd -DFOREGROUND
├─31988 /usr/sbin/httpd -DFOREGROUND
├─31989 /usr/sbin/httpd -DFOREGROUND
├─31990 /usr/sbin/httpd -DFOREGROUND
├─31991 /usr/sbin/httpd -DFOREGROUND
└─31992 /usr/sbin/httpd -DFOREGROUND
Feb 07 16:38:44 iZbp1c1dto65uh7clwak1qZ systemd[1]: Starting The Apache HTTP Server...
Feb 07 16:38:44 iZbp1c1dto65uh7clwak1qZ httpd[31987]: AH00558: httpd: Could not reliably determine the server's fully qualified domain name...message
Feb 07 16:38:44 iZbp1c1dto65uh7clwak1qZ systemd[1]: Started The Apache HTTP Server.
Hint: Some lines were ellipsized, use -l to show in full.
5、防火墙设置开启80端口
firewall-cmd --permanent --zone=public --add-service=http
firewall-cmd --permanent --zone=public --add-service=https
firewall-cmd --reload
6、确认80端口监听中
netstat -tulp
[root@iZbp1c1dto65uh7clwak1qZ ~]# netstat -tulp
Active Internet connections (only servers)
Proto Recv-Q Send-Q Local Address Foreign Address State PID/Program name
tcp 0 0 0.0.0.0:http 0.0.0.0:* LISTEN 31987/httpd
tcp 0 0 0.0.0.0:ssh 0.0.0.0:* LISTEN 21510/sshd
tcp 0 0 0.0.0.0:https 0.0.0.0:* LISTEN 31987/httpd
udp 0 0 0.0.0.0:bootpc 0.0.0.0:* 751/dhclient
udp 0 0 localhost:323 0.0.0.0:* 21730/chronyd
udp6 0 0 localhost:323 [::]:* 21730/chronyd
7、浏览器访问查看
在本地机器的浏览器地址栏中,输入http://实例公网IP
并按Enter键
出现Test123ing
等Apache信息即表示成功安装Apache
三、安装并配置MySQL
1、运行以下命令更新YUM源
rpm -Uvh http://dev.mysql.com/get/mysql57-community-release-el7-9.noarch.rpm
[root@iZbp1c1dto65uh7clwak1qZ ~]# rpm -Uvh http://dev.mysql.com/get/mysql57-community-release-el7-9.noarch.rpm
Retrieving http://dev.mysql.com/get/mysql57-community-release-el7-9.noarch.rpm
warning: /var/tmp/rpm-tmp.lXOikI: Header V3 DSA/SHA1 Signature, key ID 5072e1f5: NOKEY
Preparing... ################################# [100%]
Updating / installing...
1:mysql57-community-release-el7-9 ################################# [100%]
说明 如果您使用的操作系统内核版本为el8,可能会提示报错信息No match for argument。您需要先运行命令yum module disable mysql禁用默认的mysql模块,再安装MySQL。
2、运行以下命令安装MySQL
yum -y install mysql-community-server
.
.
.
Verifying : libaio-0.3.109-13.el7.x86_64 6/7
Verifying : 1:mariadb-libs-5.5.68-1.el7.x86_64 7/7
Installed:
mysql-community-libs.x86_64 0:5.7.33-1.el7 mysql-community-libs-compat.x86_64 0:5.7.33-1.el7 mysql-community-server.x86_64 0:5.7.33-1.el7
Dependency Installed:
libaio.x86_64 0:0.3.109-13.el7 mysql-community-client.x86_64 0:5.7.33-1.el7 mysql-community-common.x86_64 0:5.7.33-1.el7
Replaced:
mariadb-libs.x86_64 1:5.5.68-1.el7
Complete!
3、运行以下命令查看 MySQL 版本号
mysql -V
返回版本号信息,表示MySQL安装成功
4、运行以下命令启动MySQL
systemctl start mysqld
5、运行以下命令设置开机启动 MySQL
systemctl enable mysqld
systemctl daemon-reload
6、运行以下命令查看 MySQL 的初始密码
grep "password" /var/log/mysqld.log
返回结果末尾冒号后面位初始密码
7、运行以下命令配置 MySQL 的安全性
mysql_secure_installation
7.1 重置root账号的密码
Enter password for user root: #输入上一步获取的root用户初始密码
The 'validate_password' plugin is installed on the server.
The subsequent steps will run with the existing configuration of the plugin.
Using existing password for root.
Estimated strength of the password: 100
Change the password for root ? (Press y|Y for Yes, any other key for No) : Y #是否更改root用户密码,输入Y
New password: #输入新密码,长度为8至30个字符,必须同时包含大小写英文字母、数字和特殊符号。特殊符号可以是()` ~!@#$%^&*-+=|{}[]:;‘<>,.?/
Re-enter new password: #再次输入新密码
Estimated strength of the password: 100
Do you wish to continue with the password provided?(Press y|Y for Yes, any other key for No) : Y
连续输入4个Y
.
.
.
Reloading the privilege tables will ensure that all changes
made so far will take effect immediately.
Reload privilege tables now? (Press y|Y for Yes, any other key for No) : Y
Success.
All done!
四、安装 PHP
1、更新 YUM 源
运行以下命令添加 epel 源
yum install -y \
https://repo.ius.io/ius-release-el7.rpm \
https://dl.fedoraproject.org/pub/epel/epel-release-latest-7.noarch.rpm
运行以下命令添加 Webtatic 源
rpm -Uvh https://mirror.webtatic.com/yum/el7/webtatic-release.rpm
2、运行以下命令安装 PHP
yum -y install php70w-devel php70w.x86_64 php70w-cli.x86_64 php70w-common.x86_64 php70w-gd.x86_64 php70w-ldap.x86_64 php70w-mbstring.x86_64 php70w-mcrypt.x86_64 php70w-pdo.x86_64 php70w-mysqlnd php70w-fpm php70w-opcache php70w-pecl-redis php70w-pecl-mongodb
3、运行以下命令查看 PHP 版本
php -v
4、运行以下命令,在 Apache 网站根目录创建测试文件
echo "<?php phpinfo(); ?>" > /var/www/html/phpinfo.php
5、运行以下命令重启Apache服务
systemctl restart httpd
6、本地浏览器确认
在本地机器的浏览器地址栏中,输入http://实例公网IP/phpinfo.php
并按Enter键。
显示PHP信息表示安装成功.
— End —
Linux 之 scp命令
Linux scp 命令用于 Linux 之间复制文件和目录。
scp 是 secure copy 的缩写, scp 是 linux 系统下基于 ssh 登陆进行安全的远程文件拷贝命令。
scp 是加密的,rcp 是不加密的,scp 是 rcp 的加强版。
语法
scp
[-1246BCpqrv]
[-c cipher]
[-F ssh_config]
[-i identity_file]
[-l limit]
[-o ssh_option]
[-P port]
[-S program]
[[user@]host1:]file1 [...] [[user@]host2:]file2
参数
-1: 强制scp命令使用协议ssh1
-2: 强制scp命令使用协议ssh2
-4: 强制scp命令只使用IPv4寻址
-6: 强制scp命令只使用IPv6寻址
-B: 使用批处理模式(传输过程中不询问传输口令或短语)
-C: 允许压缩。(将-C标志传递给ssh,从而打开压缩功能)
-p:保留原文件的修改时间,访问时间和访问权限。
-q: 不显示传输进度条。
-r: 递归复制整个目录。
-v:详细方式显示输出。scp和ssh(1)会显示出整个过程的调试信息。这些信息用于调试连接,验证和配置问题。
-c cipher: 以cipher将数据传输进行加密,这个选项将直接传递给ssh。
-F ssh_config: 指定一个替代的ssh配置文件,此参数直接传递给ssh。
-i identity_file: 从指定文件中读取传输时使用的密钥文件,此参数直接传递给ssh。
-l limit: 限定用户所能使用的带宽,以Kbit/s为单位。
-o ssh_option: 如果习惯于使用ssh_config(5)中的参数传递方式,
-P port:注意是大写的P, port是指定数据传输用到的端口号
-S program: 指定加密传输时所使用的程序。此程序必须能够理解ssh(1)的选项。
实例
scp local_file remote_username@remote_ip:remote_folder
或者
scp local_file remote_username@remote_ip:remote_file
或者
scp local_file remote_ip:remote_folder
或者
scp local_file remote_ip:remote_file
scp /home/space/music/1.mp3 root@www.runoob.com:/home/root/others/music
scp /home/space/music/1.mp3 root@www.runoob.com:/home/root/others/music/001.mp3
scp /home/space/music/1.mp3 www.runoob.com:/home/root/others/music
scp /home/space/music/1.mp3 www.runoob.com:/home/root/others/music/001.mp3
scp -r local_folder remote_username@remote_ip:remote_folder
或者
scp -r local_folder remote_ip:remote_folder
scp -r /home/space/music/ root@www.runoob.com:/home/root/others/
scp -r /home/space/music/ www.runoob.com:/home/root/others/
scp root@www.runoob.com:/home/root/others/music /home/space/music/1.mp3
scp -r www.runoob.com:/home/root/others/ /home/space/music/
参考
[1] https://www.runoob.com/linux/linux-comm-scp.html
git调用工具 Beyond Compare工具
缘起
git 是一个很好的版本控制工具,但其开发目的是为了管理 Linux内核源码,所以只对纯文本文件十分友好,但是广大网友已经对其进行了花样的应用,比如:图床、网盘等等,今天我想用 git对word进行管理,在git diff
时变成这样
看来确实不是很友好,于是我想使用 git调用一款强大的对比工具 Beyond Compare.
设置方法
配置.gitconfig
文件
tool = bc3
[difftool "bc3"]
path = D:/Program Files (x86)/Beyond Compare 3/BCompare.exe
[merge]
tool = bc3
[mergetool "bc3"]
path = D:/Program Files (x86)/Beyond Compare 3/BCompare.exe
注意:path
后面的值改成 Beyond Compare的安装位置
使用方法
在 git bash中使用git difftool -t bc3
即可
输入Y
比较两个版本
git difftool f4d30b 3281de
比较两个版本并指定文件或文件夹
git difftool f4d70b 3b81de ./paper/*