Browse Source

pushcode

Signed-off-by: tujidelv <tujide.lv@foxmail.com>
tujidelv 1 year ago
parent
commit
b7d7ab15da

+ 1 - 1
package-lock.json

@@ -985,7 +985,7 @@
     },
     },
     "node_modules/hexo-asset-image": {
     "node_modules/hexo-asset-image": {
       "version": "1.0.0",
       "version": "1.0.0",
-      "resolved": "https://registry.npmjs.org/hexo-asset-image/-/hexo-asset-image-1.0.0.tgz",
+      "resolved": "https://registry.npmmirror.com/hexo-asset-image/-/hexo-asset-image-1.0.0.tgz",
       "integrity": "sha512-jkuUJNPRMH6v7HqzP2BAwEZavMzVxNWhl8jZl9BmFYB22/aq2+zixGIhV4vedI9cLPydjn9DfII41/MMXtzJTA==",
       "integrity": "sha512-jkuUJNPRMH6v7HqzP2BAwEZavMzVxNWhl8jZl9BmFYB22/aq2+zixGIhV4vedI9cLPydjn9DfII41/MMXtzJTA==",
       "dependencies": {
       "dependencies": {
         "cheerio": "^0.19.0",
         "cheerio": "^0.19.0",

+ 3 - 3
source/_posts/af-mq-rocketmq.md

@@ -669,11 +669,11 @@ tags:
 
 
 - mq源码模块划分
 - mq源码模块划分
 ---
 ---
-   | 名称 | 	作用 |
+   | 名称 |     作用 |
    |:---------|:---------|
    |:---------|:---------|
    | `broker` | `broker模块:c和p端消息存储逻辑` |
    | `broker` | `broker模块:c和p端消息存储逻辑` |
-   | client	| 客户端api:produce、consumer端 接受与发送api |
-   | common	| 公共组件:常量、基类、数据结构 |
+   | client    | 客户端api:produce、consumer端 接受与发送api |
+   | common    | 公共组件:常量、基类、数据结构 |
    | tools | 运维tools:命令行工具模块 |
    | tools | 运维tools:命令行工具模块 |
    | `store` | `存储模块:消息、索引、commitlog存储` |
    | `store` | `存储模块:消息、索引、commitlog存储` |
    | `namesrv` | `服务管理模块:服务注册topic等信息存储` |
    | `namesrv` | `服务管理模块:服务注册topic等信息存储` |

+ 1 - 1
source/_posts/af-nodejs.md

@@ -183,7 +183,7 @@ tags:
         npm -v      //查看npm的版本
         npm -v      //查看npm的版本
         npm version      //查看所有模块的版本
         npm version      //查看所有模块的版本
         npm config list      //查看npm配置信息
         npm config list      //查看npm配置信息
-        npm s/search 包名      //搜索模块包,需联网	
+        npm s/search 包名      //搜索模块包,需联网    
         -------------------------------------
         -------------------------------------
         npm init      //初始化项目(创建package.json),安装包时根据 package.json 是否存在来识别当前目录是一个包,不然可能会安装到其他地方
         npm init      //初始化项目(创建package.json),安装包时根据 package.json 是否存在来识别当前目录是一个包,不然可能会安装到其他地方
         npm i/install      //安装当前项目所依赖的包
         npm i/install      //安装当前项目所依赖的包

+ 62 - 62
source/_posts/af-redis.md

@@ -108,28 +108,28 @@ Cache内部保存的是一个个的Element,而一个Element中保存的是一
     ```
     ```
     <?xml version="1.0" encoding="UTF-8"?>
     <?xml version="1.0" encoding="UTF-8"?>
     <ehcache xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
     <ehcache xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
-    	xsi:noNamespaceSchemaLocation="http://ehcache.org/ehcache.xsd">
+        xsi:noNamespaceSchemaLocation="http://ehcache.org/ehcache.xsd">
     
     
-    	<diskStore path="java.io.tmpdir/ehcache-rmi-4000" />
+        <diskStore path="java.io.tmpdir/ehcache-rmi-4000" />
     
     
-    	<!-- 默认缓存 -->
-    	<defaultCache maxElementsInMemory="1000" eternal="true"
-    		timeToIdleSeconds="120" timeToLiveSeconds="120" overflowToDisk="true"
-    		diskSpoolBufferSizeMB="30" maxElementsOnDisk="10000000"
-    		diskPersistent="true" diskExpiryThreadIntervalSeconds="120"
-    		memoryStoreEvictionPolicy="LRU">
-    	</defaultCache>
+        <!-- 默认缓存 -->
+        <defaultCache maxElementsInMemory="1000" eternal="true"
+            timeToIdleSeconds="120" timeToLiveSeconds="120" overflowToDisk="true"
+            diskSpoolBufferSizeMB="30" maxElementsOnDisk="10000000"
+            diskPersistent="true" diskExpiryThreadIntervalSeconds="120"
+            memoryStoreEvictionPolicy="LRU">
+        </defaultCache>
     
     
-    	<!-- 自定义缓存 -->
-    	<cache name="userCache" maxElementsInMemory="1000" eternal="false"
-    		timeToIdleSeconds="120" timeToLiveSeconds="120" overflowToDisk="true"
-    		diskSpoolBufferSizeMB="30" maxElementsOnDisk="10000000"
-    		diskPersistent="false" diskExpiryThreadIntervalSeconds="120"
-    		memoryStoreEvictionPolicy="LRU">
-    		<cacheEventListenerFactory class="net.sf.ehcache.distribution.RMICacheReplicatorFactory" />
-    		<!-- 用于在初始化缓存,以及自动设置 -->
-    		<bootstrapCacheLoaderFactory class="net.sf.ehcache.distribution.RMIBootstrapCacheLoaderFactory" />
-    	</cache>
+        <!-- 自定义缓存 -->
+        <cache name="userCache" maxElementsInMemory="1000" eternal="false"
+            timeToIdleSeconds="120" timeToLiveSeconds="120" overflowToDisk="true"
+            diskSpoolBufferSizeMB="30" maxElementsOnDisk="10000000"
+            diskPersistent="false" diskExpiryThreadIntervalSeconds="120"
+            memoryStoreEvictionPolicy="LRU">
+            <cacheEventListenerFactory class="net.sf.ehcache.distribution.RMICacheReplicatorFactory" />
+            <!-- 用于在初始化缓存,以及自动设置 -->
+            <bootstrapCacheLoaderFactory class="net.sf.ehcache.distribution.RMIBootstrapCacheLoaderFactory" />
+        </cache>
     </ehcache>
     </ehcache>
     ```
     ```
     ```
     ```
@@ -163,9 +163,9 @@ Cache内部保存的是一个个的Element,而一个Element中保存的是一
     ```
     ```
     @CacheConfig(cacheNames = "userCache")
     @CacheConfig(cacheNames = "userCache")
     public interface UserMapper {
     public interface UserMapper {
-    	@Select("SELECT ID ,NAME,AGE FROM users where id=#{id}")
-    	@Cacheable
-    	List<Users> getUser(@Param("id") Long id);
+        @Select("SELECT ID ,NAME,AGE FROM users where id=#{id}")
+        @Cacheable
+        List<Users> getUser(@Param("id") Long id);
     }
     }
     ```
     ```
     ```
     ```
@@ -179,9 +179,9 @@ Cache内部保存的是一个个的Element,而一个Element中保存的是一
     @MapperScan(basePackages = { "top.lvzhiqiang.mapper" })
     @MapperScan(basePackages = { "top.lvzhiqiang.mapper" })
     @SpringBootApplication
     @SpringBootApplication
     public class App {
     public class App {
-    	public static void main(String[] args) {
-    		SpringApplication.run(App.class, args);
-    	}
+        public static void main(String[] args) {
+            SpringApplication.run(App.class, args);
+        }
     }
     }
     ```
     ```
 5. 清除缓存
 5. 清除缓存
@@ -295,47 +295,47 @@ Redis全称为:Remote Dictionary Server(远程数据服务),该软件使
     ```
     ```
     @Service
     @Service
     public class RedisService {
     public class RedisService {
-    	@Autowired
-    	private StringRedisTemplate stringRedisTemplate;
-    	
-    	public void set(String key, Object object, Long time) {
-    		if (object instanceof String) {// 存放String 类型
-    			setString(key, object);
-    		}
-    		if (object instanceof Set) {// 存放 set类型
-    			setSet(key, object);
-    		}
-    		stringRedisTemplate.expire(key, time, TimeUnit.SECONDS);// 设置有效期 以秒为单位
-    	}
-    	public void setString(String key, Object object) {
-    		String value = (String) object;// 如果是String 类型
-    		stringRedisTemplate.opsForValue().set(key, value);
-    	}
-    	public void setSet(String key, Object object) {
-    		Set<String> value = (Set<String>) object;
-    		for (String oj : value) {
-    			stringRedisTemplate.opsForSet().add(key, oj);
-    		}
-    	}
-    	public String getString(String key) {
-    		return stringRedisTemplate.opsForValue().get(key);
-    	}
+        @Autowired
+        private StringRedisTemplate stringRedisTemplate;
+        
+        public void set(String key, Object object, Long time) {
+            if (object instanceof String) {// 存放String 类型
+                setString(key, object);
+            }
+            if (object instanceof Set) {// 存放 set类型
+                setSet(key, object);
+            }
+            stringRedisTemplate.expire(key, time, TimeUnit.SECONDS);// 设置有效期 以秒为单位
+        }
+        public void setString(String key, Object object) {
+            String value = (String) object;// 如果是String 类型
+            stringRedisTemplate.opsForValue().set(key, value);
+        }
+        public void setSet(String key, Object object) {
+            Set<String> value = (Set<String>) object;
+            for (String oj : value) {
+                stringRedisTemplate.opsForSet().add(key, oj);
+            }
+        }
+        public String getString(String key) {
+            return stringRedisTemplate.opsForValue().get(key);
+        }
     }
     }
     @RestController
     @RestController
     public class IndexControler {
     public class IndexControler {
-    	@Autowired
-    	private RedisService redisService;
+        @Autowired
+        private RedisService redisService;
     
     
-    	@RequestMapping("/setString")
-    	public String setString(String key, String value) {
-    		redisService.set(key, value, 60l);
-    		return "success";
-    	}
-    	@RequestMapping("/getString")
-    	public String getString(String key) {
-    		return redisService.getString(key);
-    	}
-    	...
+        @RequestMapping("/setString")
+        public String setString(String key, String value) {
+            redisService.set(key, value, 60l);
+            return "success";
+        }
+        @RequestMapping("/getString")
+        public String getString(String key) {
+            return redisService.getString(key);
+        }
+        ...
     }
     }
     ```
     ```
 
 

+ 145 - 145
source/_posts/af-springboot.md

@@ -143,9 +143,9 @@ SpringMVC:
         @ComponentScan(basePackages = "top.lvzhiqiang.controller")
         @ComponentScan(basePackages = "top.lvzhiqiang.controller")
         @EnableAutoConfiguration
         @EnableAutoConfiguration
         public class App {
         public class App {
-        	public static void main(String[] args) {
-        		SpringApplication.run(App.class, args);
-        	}
+            public static void main(String[] args) {
+                SpringApplication.run(App.class, args);
+            }
         }
         }
         单独写个类并使用@ComponentScan注解添加自动扫包范围。
         单独写个类并使用@ComponentScan注解添加自动扫包范围。
     方法3:
     方法3:
@@ -469,10 +469,10 @@ SpringMVC:
             map-underscore-to-camel-case: true
             map-underscore-to-camel-case: true
     3.Mapper代码
     3.Mapper代码
         public interface UserMapper {
         public interface UserMapper {
-        	@Select("SELECT * FROM USERS WHERE NAME = #{name}")
-        	User findByName(@Param("name") String name);
-        	@Insert("INSERT INTO USERS(NAME, AGE) VALUES(#{name}, #{age})")
-        	int insert(@Param("name") String name, @Param("age") Integer age);
+            @Select("SELECT * FROM USERS WHERE NAME = #{name}")
+            User findByName(@Param("name") String name);
+            @Insert("INSERT INTO USERS(NAME, AGE) VALUES(#{name}, #{age})")
+            int insert(@Param("name") String name, @Param("age") Integer age);
         }
         }
     4.在启动类上加上@MapperScan(basePackages = "top.lvzhiqiang.mapper")
     4.在启动类上加上@MapperScan(basePackages = "top.lvzhiqiang.mapper")
         也可以在Mapper接口上加上@Mapper,不过这样比较繁琐
         也可以在Mapper接口上加上@Mapper,不过这样比较繁琐
@@ -532,11 +532,11 @@ SpringMVC:
     3.代码
     3.代码
         @Service
         @Service
         public class UserServiceImpl implements UserService {
         public class UserServiceImpl implements UserService {
-        	@Autowired
-        	private JdbcTemplate jdbcTemplate;
-        	public void createUser(String name, Integer age) {
-        		jdbcTemplate.update("insert into users values(null,?,?);", name, age);
-        	}
+            @Autowired
+            private JdbcTemplate jdbcTemplate;
+            public void createUser(String name, Integer age) {
+                jdbcTemplate.update("insert into users values(null,?,?);", name, age);
+            }
         }
         }
     ```
     ```
 - `整合多数据源`
 - `整合多数据源`
@@ -598,8 +598,8 @@ SpringMVC:
         }
         }
     3.创建分包Mapper
     3.创建分包Mapper
         public interface User1Mapper {
         public interface User1Mapper {
-        	@Insert("insert into users values(null,#{name},#{age});")
-        	public int addUser(@Param("name") String name, @Param("age") Integer age);
+            @Insert("insert into users values(null,#{name},#{age});")
+            public int addUser(@Param("name") String name, @Param("age") Integer age);
         }
         }
     4.多数据源事务注意事项
     4.多数据源事务注意事项
         在多数据源的情况下,使用@Transactional注解时,应该指定事务管理器
         在多数据源的情况下,使用@Transactional注解时,应该指定事务管理器
@@ -620,8 +620,8 @@ SpringMVC:
     ```
     ```
     1.pom文件引入atomikos相关的依赖包
     1.pom文件引入atomikos相关的依赖包
         <dependency>
         <dependency>
-        	<groupId>org.springframework.boot</groupId>
-        	<artifactId>spring-boot-starter-jta-atomikos</artifactId>
+            <groupId>org.springframework.boot</groupId>
+            <artifactId>spring-boot-starter-jta-atomikos</artifactId>
         </dependency>
         </dependency>
     2.新增多数据源配置信息,修改application.properties
     2.新增多数据源配置信息,修改application.properties
         # Mysql 1
         # Mysql 1
@@ -650,88 +650,88 @@ SpringMVC:
         @Data
         @Data
         @ConfigurationProperties(prefix = "mysql.datasource.test1")
         @ConfigurationProperties(prefix = "mysql.datasource.test1")
         public class DBConfig1 {
         public class DBConfig1 {
-        	private String url;
-        	private String username;
-        	private String password;
-        	private int minPoolSize;
-        	private int maxPoolSize;
-        	private int maxLifetime;
-        	private int borrowConnectionTimeout;
-        	private int loginTimeout;
-        	private int maintenanceInterval;
-        	private int maxIdleTime;
-        	private String testQuery;
+            private String url;
+            private String username;
+            private String password;
+            private int minPoolSize;
+            private int maxPoolSize;
+            private int maxLifetime;
+            private int borrowConnectionTimeout;
+            private int loginTimeout;
+            private int maintenanceInterval;
+            private int maxIdleTime;
+            private String testQuery;
         }
         }
         ----------------------
         ----------------------
         @Data
         @Data
         @ConfigurationProperties(prefix = "mysql.datasource.test2")
         @ConfigurationProperties(prefix = "mysql.datasource.test2")
         public class DBConfig2 {
         public class DBConfig2 {
-        	private String url;
-        	private String username;
-        	private String password;
-        	private int minPoolSize;
-        	private int maxPoolSize;
-        	private int maxLifetime;
-        	private int borrowConnectionTimeout;
-        	private int loginTimeout;
-        	private int maintenanceInterval;
-        	private int maxIdleTime;
-        	private String testQuery;
+            private String url;
+            private String username;
+            private String password;
+            private int minPoolSize;
+            private int maxPoolSize;
+            private int maxLifetime;
+            private int borrowConnectionTimeout;
+            private int loginTimeout;
+            private int maintenanceInterval;
+            private int maxIdleTime;
+            private String testQuery;
         }
         }
     4.将多数据源注册到atomikos中去,在top/lvzhiqiang/下新建datasource目录(任意),新建DataSourceConfig类
     4.将多数据源注册到atomikos中去,在top/lvzhiqiang/下新建datasource目录(任意),新建DataSourceConfig类
         @Configuration
         @Configuration
         @MapperScan(basePackages = "top.lvzhiqiang.test01", sqlSessionTemplateRef = "testSqlSessionTemplate")
         @MapperScan(basePackages = "top.lvzhiqiang.test01", sqlSessionTemplateRef = "testSqlSessionTemplate")
         public class MyBatisConfig1 {
         public class MyBatisConfig1 {
-        	@Primary
-        	@Bean(name = "testDataSource")
-        	public DataSource testDataSource(DBConfig1 testConfig) throws SQLException {
-        		MysqlXADataSource mysqlXaDataSource = new MysqlXADataSource();
-        		mysqlXaDataSource.setUrl(testConfig.getUrl());
-        		mysqlXaDataSource.setPinGlobalTxToPhysicalConnection(true);
-        		mysqlXaDataSource.setPassword(testConfig.getPassword());
-        		mysqlXaDataSource.setUser(testConfig.getUsername());
-        		mysqlXaDataSource.setPinGlobalTxToPhysicalConnection(true);
+            @Primary
+            @Bean(name = "testDataSource")
+            public DataSource testDataSource(DBConfig1 testConfig) throws SQLException {
+                MysqlXADataSource mysqlXaDataSource = new MysqlXADataSource();
+                mysqlXaDataSource.setUrl(testConfig.getUrl());
+                mysqlXaDataSource.setPinGlobalTxToPhysicalConnection(true);
+                mysqlXaDataSource.setPassword(testConfig.getPassword());
+                mysqlXaDataSource.setUser(testConfig.getUsername());
+                mysqlXaDataSource.setPinGlobalTxToPhysicalConnection(true);
         
         
-        		AtomikosDataSourceBean xaDataSource = new AtomikosDataSourceBean();
-        		xaDataSource.setXaDataSource(mysqlXaDataSource);
-        		xaDataSource.setUniqueResourceName("testDataSource");
+                AtomikosDataSourceBean xaDataSource = new AtomikosDataSourceBean();
+                xaDataSource.setXaDataSource(mysqlXaDataSource);
+                xaDataSource.setUniqueResourceName("testDataSource");
         
         
-        		xaDataSource.setMinPoolSize(testConfig.getMinPoolSize());
-        		xaDataSource.setMaxPoolSize(testConfig.getMaxPoolSize());
-        		xaDataSource.setMaxLifetime(testConfig.getMaxLifetime());
-        		xaDataSource.setBorrowConnectionTimeout(testConfig.getBorrowConnectionTimeout());
-        		xaDataSource.setLoginTimeout(testConfig.getLoginTimeout());
-        		xaDataSource.setMaintenanceInterval(testConfig.getMaintenanceInterval());
-        		xaDataSource.setMaxIdleTime(testConfig.getMaxIdleTime());
-        		xaDataSource.setTestQuery(testConfig.getTestQuery());
-        		return xaDataSource;
-        	}
-        	@Primary
-        	@Bean(name = "testSqlSessionFactory")
-        	public SqlSessionFactory testSqlSessionFactory(@Qualifier("testDataSource") DataSource dataSource)
-        			throws Exception {
-        		SqlSessionFactoryBean bean = new SqlSessionFactoryBean();
-        		bean.setDataSource(dataSource);
-        		return bean.getObject();
-        	}
-        	@Primary
-        	@Bean(name = "testSqlSessionTemplate")
-        	public SqlSessionTemplate testSqlSessionTemplate(@Qualifier("testSqlSessionFactory") SqlSessionFactory sqlSessionFactory)
-        	        throws Exception {
-        		return new SqlSessionTemplate(sqlSessionFactory);
-        	}
+                xaDataSource.setMinPoolSize(testConfig.getMinPoolSize());
+                xaDataSource.setMaxPoolSize(testConfig.getMaxPoolSize());
+                xaDataSource.setMaxLifetime(testConfig.getMaxLifetime());
+                xaDataSource.setBorrowConnectionTimeout(testConfig.getBorrowConnectionTimeout());
+                xaDataSource.setLoginTimeout(testConfig.getLoginTimeout());
+                xaDataSource.setMaintenanceInterval(testConfig.getMaintenanceInterval());
+                xaDataSource.setMaxIdleTime(testConfig.getMaxIdleTime());
+                xaDataSource.setTestQuery(testConfig.getTestQuery());
+                return xaDataSource;
+            }
+            @Primary
+            @Bean(name = "testSqlSessionFactory")
+            public SqlSessionFactory testSqlSessionFactory(@Qualifier("testDataSource") DataSource dataSource)
+                    throws Exception {
+                SqlSessionFactoryBean bean = new SqlSessionFactoryBean();
+                bean.setDataSource(dataSource);
+                return bean.getObject();
+            }
+            @Primary
+            @Bean(name = "testSqlSessionTemplate")
+            public SqlSessionTemplate testSqlSessionTemplate(@Qualifier("testSqlSessionFactory") SqlSessionFactory sqlSessionFactory)
+                    throws Exception {
+                return new SqlSessionTemplate(sqlSessionFactory);
+            }
         }
         }
         ----------------------
         ----------------------
         @Configuration
         @Configuration
         @MapperScan(basePackages = "top.lvzhiqiang.test02", sqlSessionTemplateRef = "test2SqlSessionTemplate")
         @MapperScan(basePackages = "top.lvzhiqiang.test02", sqlSessionTemplateRef = "test2SqlSessionTemplate")
         public class MyBatisConfig2 {
         public class MyBatisConfig2 {
-        	@Bean(name = "test2DataSource")
-        	public DataSource testDataSource(DBConfig2 testConfig) throws SQLException {
-        		MysqlXADataSource mysqlXaDataSource = new MysqlXADataSource();
-        		mysqlXaDataSource.setUrl(testConfig.getUrl());
-        		mysqlXaDataSource.setPinGlobalTxToPhysicalConnection(true);
-        		...
-        	}
+            @Bean(name = "test2DataSource")
+            public DataSource testDataSource(DBConfig2 testConfig) throws SQLException {
+                MysqlXADataSource mysqlXaDataSource = new MysqlXADataSource();
+                mysqlXaDataSource.setUrl(testConfig.getUrl());
+                mysqlXaDataSource.setPinGlobalTxToPhysicalConnection(true);
+                ...
+            }
             ...
             ...
         }
         }
     5.在启动类加上此注解以开启读取配置文件
     5.在启动类加上此注解以开启读取配置文件
@@ -769,12 +769,12 @@ SpringMVC:
                     exposure:
                     exposure:
                         include: "*"
                         include: "*"
     3.开始访问(通过actuator/+端点名就可以获取相应的信息)
     3.开始访问(通过actuator/+端点名就可以获取相应的信息)
-        /actuator/beans	显示应用程序中所有Spring bean的完整列表。
-        /actuator/mappings	显示所有@RequestMapping的url完整列表。
-        /actuator/configprops	显示所有配置信息。
-        /actuator/env	显示所有的环境变量。
-        /actuator/health	显示应用程序运行状况信息,up表示成功,down失败。
-        /actuator/info	查看自定义应用信息(显示在配置文件配置info开头的配置信息)     
+        /actuator/beans    显示应用程序中所有Spring bean的完整列表。
+        /actuator/mappings    显示所有@RequestMapping的url完整列表。
+        /actuator/configprops    显示所有配置信息。
+        /actuator/env    显示所有的环境变量。
+        /actuator/health    显示应用程序运行状况信息,up表示成功,down失败。
+        /actuator/info    查看自定义应用信息(显示在配置文件配置info开头的配置信息)     
     ```
     ```
 - `Admin-UI分布式微服务监控中心`
 - `Admin-UI分布式微服务监控中心`
     - Admin-UI底层基于actuator实现能够返回界面展示监控信息,原理是将所有服务的监控中心管理存放在admin-ui平台上。
     - Admin-UI底层基于actuator实现能够返回界面展示监控信息,原理是将所有服务的监控中心管理存放在admin-ui平台上。
@@ -814,9 +814,9 @@ SpringMVC:
         @EnableAutoConfiguration
         @EnableAutoConfiguration
         @EnableAdminServer
         @EnableAdminServer
         public class AdminServerApplication {
         public class AdminServerApplication {
-        	public static void main(String[] args) {
-        		SpringApplication.run(AdminServerApplication.class, args);
-        	}
+            public static void main(String[] args) {
+                SpringApplication.run(AdminServerApplication.class, args);
+            }
         }
         }
     4.访问
     4.访问
         http://localhost:8080
         http://localhost:8080
@@ -866,9 +866,9 @@ SpringMVC:
     3.启动client端
     3.启动client端
         @SpringBootApplication
         @SpringBootApplication
         public class AppClient {
         public class AppClient {
-        	public static void main(String[] args) {
-        		SpringApplication.run(AppClient.class, args);
-        	}
+            public static void main(String[] args) {
+                SpringApplication.run(AppClient.class, args);
+            }
         }
         }
     ```
     ```
 
 
@@ -904,8 +904,8 @@ SpringMVC:
         </dependency>
         </dependency>
     2.添加Undertow依赖
     2.添加Undertow依赖
         <dependency>
         <dependency>
-        	<groupId>org.springframework.boot</groupId>
-        	<artifactId>spring-boot-starter-undertow</artifactId>
+            <groupId>org.springframework.boot</groupId>
+            <artifactId>spring-boot-starter-undertow</artifactId>
         </dependency>
         </dependency>
     ```
     ```
 
 
@@ -934,13 +934,13 @@ SpringMVC:
     application.properties文件
     application.properties文件
         name=lvzhiqiang.top
         name=lvzhiqiang.top
     代码中
     代码中
-    	@Value("${name}")
-    	private String name;
+        @Value("${name}")
+        private String name;
         @ResponseBody
         @ResponseBody
-    	@RequestMapping("/getValue")
-    	public String getValue() {
-    		return name;
-    	}
+        @RequestMapping("/getValue")
+        public String getValue() {
+            return name;
+        }
     ```
     ```
 - `区分不同环境配置文件`
 - `区分不同环境配置文件`
     ```
     ```
@@ -1049,16 +1049,16 @@ SpringMVC:
     2.注册拦截器
     2.注册拦截器
         @Configuration
         @Configuration
         public class WebAppConfig {
         public class WebAppConfig {
-        	@Autowired
-        	private LoginIntercept loginIntercept;
-        	@Bean
-        	public WebMvcConfigurer WebMvcConfigurer() {
-        		return new WebMvcConfigurer() {
-        			public void addInterceptors(InterceptorRegistry registry) {
-        				registry.addInterceptor(loginIntercept).addPathPatterns("/*");
-        			};
-        		};
-        	}
+            @Autowired
+            private LoginIntercept loginIntercept;
+            @Bean
+            public WebMvcConfigurer WebMvcConfigurer() {
+                return new WebMvcConfigurer() {
+                    public void addInterceptors(InterceptorRegistry registry) {
+                        registry.addInterceptor(loginIntercept).addPathPatterns("/*");
+                    };
+                };
+            }
         }
         }
     ```
     ```
     ```
     ```
@@ -1087,13 +1087,13 @@ SpringMVC:
 - `Servlet-specific 的server properties调整`
 - `Servlet-specific 的server properties调整`
     ```
     ```
     大量的Servlet专属的server.* properties被移到了server.servlet下:
     大量的Servlet专属的server.* properties被移到了server.servlet下:
-        Old property	New property
-        server.context-parameters.*	server.servlet.context-parameters.*
-        server.context-path	server.servlet.context-path
-        server.jsp.class-name	server.servlet.jsp.class-name
-        server.jsp.init-parameters.*	server.servlet.jsp.init-parameters.*
-        server.jsp.registered	server.servlet.jsp.registered
-        server.servlet-path	server.servlet.path
+        Old property    New property
+        server.context-parameters.*    server.servlet.context-parameters.*
+        server.context-path    server.servlet.context-path
+        server.jsp.class-name    server.servlet.jsp.class-name
+        server.jsp.init-parameters.*    server.servlet.jsp.init-parameters.*
+        server.jsp.registered    server.servlet.jsp.registered
+        server.servlet-path    server.servlet.path
     由此可以看出一些端倪,那就是server不再是只有servlet了,还有其他的要加入。
     由此可以看出一些端倪,那就是server不再是只有servlet了,还有其他的要加入。
     ```
     ```
 - `Actuator 默认映射`
 - `Actuator 默认映射`
@@ -1177,14 +1177,14 @@ SpringMVC:
         </dependency>
         </dependency>
     2.创建servlet类
     2.创建servlet类
         public class IndexServet extends HttpServlet {
         public class IndexServet extends HttpServlet {
-        	@Override
-        	protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
-        		doPost(req, resp);
-        	}
-        	@Override
-        	protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
-        		resp.getWriter().print("springboot2.0");
-        	}
+            @Override
+            protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
+                doPost(req, resp);
+            }
+            @Override
+            protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
+                resp.getWriter().print("springboot2.0");
+            }
         }
         }
     3.创建tomcat运行
     3.创建tomcat运行
         private static int PORT = 8080;// 端口号
         private static int PORT = 8080;// 端口号
@@ -1219,18 +1219,18 @@ SpringMVC:
         getServletMappings()方法负责指定需要由DispatcherServlet映射的路径,这里给定的是"/",意思是由DispatcherServlet处理所有向该应用发起的请求。
         getServletMappings()方法负责指定需要由DispatcherServlet映射的路径,这里给定的是"/",意思是由DispatcherServlet处理所有向该应用发起的请求。
         
         
         public class SpittrWebAppInitializer extends AbstractAnnotationConfigDispatcherServletInitializer {
         public class SpittrWebAppInitializer extends AbstractAnnotationConfigDispatcherServletInitializer {
-        	// 加载根容器
-        	protected Class<?>[] getRootConfigClasses() {
-        		return new Class[] { RootConfig.class };
-        	}
+            // 加载根容器
+            protected Class<?>[] getRootConfigClasses() {
+                return new Class[] { RootConfig.class };
+            }
             // 加载SpringMVC容器
             // 加载SpringMVC容器
-        	protected Class<?>[] getServletConfigClasses() {
-        		return new Class[] { WebConfig.class };
-        	}
-        	// SpringMVCDispatcherServlet 拦截的请求
-        	protected String[] getServletMappings() {
-        		return new String[] { "/" };
-        	}
+            protected Class<?>[] getServletConfigClasses() {
+                return new Class[] { WebConfig.class };
+            }
+            // SpringMVCDispatcherServlet 拦截的请求
+            protected String[] getServletMappings() {
+                return new String[] { "/" };
+            }
         }
         }
     2.加载SpringMVC容器
     2.加载SpringMVC容器
         @Configuration
         @Configuration
@@ -1238,14 +1238,14 @@ SpringMVC:
         @ComponentScan("top.lvzhiqiang.controller")
         @ComponentScan("top.lvzhiqiang.controller")
         public class WebConfig extends WebMvcConfigurerAdapter {
         public class WebConfig extends WebMvcConfigurerAdapter {
             // 创建SpringMVC视图解析器
             // 创建SpringMVC视图解析器
-        	@Bean
-        	public ViewResolver viewResolver() {
-        		InternalResourceViewResolver viewResolver = new InternalResourceViewResolver();
-        		viewResolver.setPrefix("/WEB-INF/views/");
-        		viewResolver.setSuffix(".jsp");
-        		viewResolver.setExposeContextBeansAsAttributes(true);//可以在JSP页面中通过${}访问beans
-        		return viewResolver;
-        	}
+            @Bean
+            public ViewResolver viewResolver() {
+                InternalResourceViewResolver viewResolver = new InternalResourceViewResolver();
+                viewResolver.setPrefix("/WEB-INF/views/");
+                viewResolver.setSuffix(".jsp");
+                viewResolver.setExposeContextBeansAsAttributes(true);//可以在JSP页面中通过${}访问beans
+                return viewResolver;
+            }
         }
         }
     3.加载RootConfig容器
     3.加载RootConfig容器
         @Configuration
         @Configuration

+ 1 - 1
source/_posts/dl-java-8.md

@@ -52,7 +52,7 @@ tags:
     r1.run();
     r1.run();
 语法格式二:有一个参数,无返回值
 语法格式二:有一个参数,无返回值
     Consumer<String> con = (arg) -> System.err.println("hello " + arg);
     Consumer<String> con = (arg) -> System.err.println("hello " + arg);
-	con.accept("consumer!");
+    con.accept("consumer!");
     
     
     若只有一个参数,参数的小括号可以省略不写
     若只有一个参数,参数的小括号可以省略不写
         Consumer<String> con = arg -> System.err.println("hello " + arg);
         Consumer<String> con = arg -> System.err.println("hello " + arg);

+ 1 - 1
source/_posts/git-navi.md

@@ -41,7 +41,7 @@ tags:
 
 
 - [我的工作,是帮女孩们找出卧室里的针孔摄像头](<https://mp.weixin.qq.com/s/OKzKpgw8diN7WV2PdC9BgA>)
 - [我的工作,是帮女孩们找出卧室里的针孔摄像头](<https://mp.weixin.qq.com/s/OKzKpgw8diN7WV2PdC9BgA>)
 
 
-- [亲子鉴定师:入行16年,亲眼看见上万男人戴上绿帽子](<https://new.qq.com/rain/a/20191031A0QD7M>) 	
+- [亲子鉴定师:入行16年,亲眼看见上万男人戴上绿帽子](<https://new.qq.com/rain/a/20191031A0QD7M>)     
 
 
 - [重庆魔楼红鼎国际六天五夜奇幻游记](https://mp.weixin.qq.com/s/uuzvPpcYoNO5zZc_3pNsiA)
 - [重庆魔楼红鼎国际六天五夜奇幻游记](https://mp.weixin.qq.com/s/uuzvPpcYoNO5zZc_3pNsiA)
 - [戒毒十年慢慢说](http://doudoubbs.yxsyj.com/forum.php?mod=viewthread&tid=17838&page=1&authorid=5429)
 - [戒毒十年慢慢说](http://doudoubbs.yxsyj.com/forum.php?mod=viewthread&tid=17838&page=1&authorid=5429)

File diff suppressed because it is too large
+ 435 - 435
source/_posts/os-linux-basic.md


+ 382 - 382
source/_posts/os-linux-command.md

@@ -77,8 +77,8 @@ tags:
         ```
         ```
         -n:不进行换行
         -n:不进行换行
         -e:让转义生效
         -e:让转义生效
-        	\n:换行
-        	\t:制表符
+            \n:换行
+            \t:制表符
         ```
         ```
     - 命令实例
     - 命令实例
         ```
         ```
@@ -116,12 +116,12 @@ tags:
 
 
 ```
 ```
 virt-what   用于查看服务器是kvm还是xen架构的虚拟化
 virt-what   用于查看服务器是kvm还是xen架构的虚拟化
-netstat -tunlp | grep 端口号    用于查看指定端口号的进程情况	
-	-t  tcp协议相关
-	-u  udp协议相关
-	-n  以数字显示IP和端口
-	-l  处于监听状态
-	-p  显示相关进程及PID
+netstat -tunlp | grep 端口号    用于查看指定端口号的进程情况    
+    -t  tcp协议相关
+    -u  udp协议相关
+    -n  以数字显示IP和端口
+    -l  处于监听状态
+    -p  显示相关进程及PID
 ps:显示进程状态
 ps:显示进程状态
     常用组合:aux
     常用组合:aux
         u: 以用户为中心组织进程状态信息显示
         u: 以用户为中心组织进程状态信息显示
@@ -199,8 +199,8 @@ hostname: 查看主机名
 主板上有个纽扣电池为主板上的硬件时钟(晶体振荡器)供电,所以关机后再开机时间也是对的
 主板上有个纽扣电池为主板上的硬件时钟(晶体振荡器)供电,所以关机后再开机时间也是对的
 Linux系统启动时从硬件时钟读取日期和时间信息,读取完成以后,就不再与硬件相关联,并设为当前系统时间,之后靠内核振动次数计时(100次1秒)
 Linux系统启动时从硬件时钟读取日期和时间信息,读取完成以后,就不再与硬件相关联,并设为当前系统时间,之后靠内核振动次数计时(100次1秒)
 如时间不对,还可以和全球的时间服务器进行对表,精确度很高,最精确的是元子震荡时钟,价值1亿英镑
 如时间不对,还可以和全球的时间服务器进行对表,精确度很高,最精确的是元子震荡时钟,价值1亿英镑
-	系统时钟:由linux内核通过cpu的工作频率进行的计时
-	硬件时钟
+    系统时钟:由linux内核通过cpu的工作频率进行的计时
+    硬件时钟
 ```
 ```
 - `date`
 - `date`
     - 命令功能
     - 命令功能
@@ -261,8 +261,8 @@ Linux系统启动时从硬件时钟读取日期和时间信息,读取完成以
         change directory,切换工作目录(当前目录)
         change directory,切换工作目录(当前目录)
         ----------
         ----------
         相关的环境变量:
         相关的环境变量:
-        	PWD:保存了当前工作目录的路径
-        	OLDPWD:保存了上一次的工作目录的路径
+            PWD:保存了当前工作目录的路径
+            OLDPWD:保存了上一次的工作目录的路径
         cd后面可以跟相对路径和绝对路径,根据实际需求选择用哪个,相对路径中.或..经常使用
         cd后面可以跟相对路径和绝对路径,根据实际需求选择用哪个,相对路径中.或..经常使用
         ```
         ```
     - 命令格式
     - 命令格式
@@ -290,28 +290,28 @@ Linux系统启动时从硬件时钟读取日期和时间信息,读取完成以
         -a,--all:显示所有文件,包括隐藏文件
         -a,--all:显示所有文件,包括隐藏文件
         -A:显示除.和..之外的所有文件
         -A:显示除.和..之外的所有文件
         -l:长格式列表,即显示文件的详细属性信息
         -l:长格式列表,即显示文件的详细属性信息
-        	-rw-------. 1 root root 1302 4月   4 22:39 initial-setup-ks.cfg
-        		-:指的是Linux系统上的文件类型,并非通过file命令查看的文件内容格式的类型
-        			-:普通(常规)文件,即f,有诸多变种格式,可通过file命令查看
-        			d:directory,目录文件
-        			b:block device,块设备文件,支持以"block"为单位进行随机访问
-        			c:character device,字符设备文件,支持以"character"为单位进行线性访问
-        				major number:主设备号,用于标识设备类型,进而确定要加载的驱动程序
-        				minor number:次设备号,用于标识同一类型中的不同设备			
-        			l:sysmbolic link,符号链接文件
-        			s:socket,套接字文件;有很多服务器支持2种方式通信,如果跨主机只能基于协议通信,如果不跨主机建议使用套接字文件的方式通信
-        			p:pipe,(命名)管道文件
-        		rw-------:访问权限
-        			rw-:文件属主的权限
-        			---:文件属组的权限
-        			---:其他用户(非属主、属组)的权限
-        		1:表示文件被硬链接的次数
-        		root:文件的属主(owner)
-        		root:文件的属组(group)
-        		1302:表示文件的大小(size),单位是字节
-        		4月   4 22:39:文件最近一次被修改的时间
-        		    注:每个文件都有3个时间戳(访问,修改,改变),修改指的是文件内容发生的改变,改变指的是文件的属性发生的改变;修改一定会改变,改变不一定会修改
-        		initial-setup-ks.cfg:文件名
+            -rw-------. 1 root root 1302 4月   4 22:39 initial-setup-ks.cfg
+                -:指的是Linux系统上的文件类型,并非通过file命令查看的文件内容格式的类型
+                    -:普通(常规)文件,即f,有诸多变种格式,可通过file命令查看
+                    d:directory,目录文件
+                    b:block device,块设备文件,支持以"block"为单位进行随机访问
+                    c:character device,字符设备文件,支持以"character"为单位进行线性访问
+                        major number:主设备号,用于标识设备类型,进而确定要加载的驱动程序
+                        minor number:次设备号,用于标识同一类型中的不同设备            
+                    l:sysmbolic link,符号链接文件
+                    s:socket,套接字文件;有很多服务器支持2种方式通信,如果跨主机只能基于协议通信,如果不跨主机建议使用套接字文件的方式通信
+                    p:pipe,(命名)管道文件
+                rw-------:访问权限
+                    rw-:文件属主的权限
+                    ---:文件属组的权限
+                    ---:其他用户(非属主、属组)的权限
+                1:表示文件被硬链接的次数
+                root:文件的属主(owner)
+                root:文件的属组(group)
+                1302:表示文件的大小(size),单位是字节
+                4月   4 22:39:文件最近一次被修改的时间
+                    注:每个文件都有3个时间戳(访问,修改,改变),修改指的是文件内容发生的改变,改变指的是文件的属性发生的改变;修改一定会改变,改变不一定会修改
+                initial-setup-ks.cfg:文件名
         -h:对文件大小单位换算,换算后结果可能为非精确值
         -h:对文件大小单位换算,换算后结果可能为非精确值
         -d:显示目录自身的相关属性而非其内部的文件列表,一般与-l结合使用
         -d:显示目录自身的相关属性而非其内部的文件列表,一般与-l结合使用
         -r:reverse,逆序显示,没有-r时默认升序显示
         -r:reverse,逆序显示,没有-r时默认升序显示
@@ -428,16 +428,16 @@ Linux系统启动时从硬件时钟读取日期和时间信息,读取完成以
     - 命令格式
     - 命令格式
         ```
         ```
         单源复制:cp [OPTION]... [-T] SOURCE DEST
         单源复制:cp [OPTION]... [-T] SOURCE DEST
-        	如果DEST不存在,则事先创建此文件,并复制源文件的数据流至DEST中
-        	如果DEST存在
-        		如果DEST是非目录文件,则覆盖目标文件,此时建议使用-i选项
-        		如果DEST是目录文件,则先在DEST目录下创建一个与源文件同名的文件,并复制其数据流
+            如果DEST不存在,则事先创建此文件,并复制源文件的数据流至DEST中
+            如果DEST存在
+                如果DEST是非目录文件,则覆盖目标文件,此时建议使用-i选项
+                如果DEST是目录文件,则先在DEST目录下创建一个与源文件同名的文件,并复制其数据流
         多源复制:cp [OPTION]... SOURCE... DIRECTORY
         多源复制:cp [OPTION]... SOURCE... DIRECTORY
-        		cp [OPTION]... -t DIRECTORY SOURCE...    前一形式的变种
-        	如果DEST不存在,错误
-        	如果DEST存在
-        		如果DEST是非目录文件,错误
-        		如果DEST是目录文件,分别复制每个文件至目标目录中,并保持原名
+                cp [OPTION]... -t DIRECTORY SOURCE...    前一形式的变种
+            如果DEST不存在,错误
+            如果DEST存在
+                如果DEST是非目录文件,错误
+                如果DEST是目录文件,分别复制每个文件至目标目录中,并保持原名
         ```
         ```
     - 命令参数
     - 命令参数
         ```
         ```
@@ -446,14 +446,14 @@ Linux系统启动时从硬件时钟读取日期和时间信息,读取完成以
         -r,-R:递归复制目录及内部的所有内容
         -r,-R:递归复制目录及内部的所有内容
         -d:复制符号链接文件本身,而非其指向的源文件
         -d:复制符号链接文件本身,而非其指向的源文件
         -a:相当于-dR --preserve=all          archive,用于实现归档(备份)
         -a:相当于-dR --preserve=all          archive,用于实现归档(备份)
-        	--preserve=
-        		mode:权限
-        		ownership:属主和属组
-        		timestamps:时间戳
-        		context:安全标签	
-        		xattr:扩展属性
-        		links:符号链接
-        		all:上述所有属性
+            --preserve=
+                mode:权限
+                ownership:属主和属组
+                timestamps:时间戳
+                context:安全标签    
+                xattr:扩展属性
+                links:符号链接
+                all:上述所有属性
         -v:verbose,显示详细过程
         -v:verbose,显示详细过程
         ```
         ```
 - `mv`
 - `mv`
@@ -465,7 +465,7 @@ Linux系统启动时从硬件时钟读取日期和时间信息,读取完成以
         ```
         ```
         ~]# mv [OPTION]... [-T] SOURCE DEST
         ~]# mv [OPTION]... [-T] SOURCE DEST
         ~]# mv [OPTION]... SOURCE... DIRECTORY
         ~]# mv [OPTION]... SOURCE... DIRECTORY
-        	~]# mv [OPTION]... -t DIRECTORY SOURCE...		前一形式的变种
+            ~]# mv [OPTION]... -t DIRECTORY SOURCE...        前一形式的变种
         ```
         ```
     - 命令参数
     - 命令参数
         ```
         ```
@@ -491,7 +491,7 @@ Linux系统启动时从硬件时钟读取日期和时间信息,读取完成以
     - 命令实例
     - 命令实例
         ```
         ```
         例如:rm -rf /PATH/TO/DIR
         例如:rm -rf /PATH/TO/DIR
-        	危险操作:rm -rf /*
+            危险操作:rm -rf /*
         ```
         ```
 
 
 ### ***文本文件查看***
 ### ***文本文件查看***
@@ -507,7 +507,7 @@ Linux系统启动时从硬件时钟读取日期和时间信息,读取完成以
         ```
         ```
     - 命令参数
     - 命令参数
         ```
         ```
-        -n:给显示的文本行编号	
+        -n:给显示的文本行编号    
         -E:显示行结束符$,文本文件在磁盘上存储是没有行的,之所以显示出有行,是因为文本文件查看工具可以读取行结束符并将他们显示为行
         -E:显示行结束符$,文本文件在磁盘上存储是没有行的,之所以显示出有行,是因为文本文件查看工具可以读取行结束符并将他们显示为行
         ```
         ```
 - `tac`
 - `tac`
@@ -552,8 +552,8 @@ Linux系统启动时从硬件时钟读取日期和时间信息,读取完成以
         ```
         ```
         -c #:指定获取前#字节
         -c #:指定获取前#字节
         -n #:指定获取前#行
         -n #:指定获取前#行
-        	-#:简写
-        	没有该选项默认10行
+            -#:简写
+            没有该选项默认10行
         ```
         ```
 - `tail`
 - `tail`
     - 命令功能
     - 命令功能
@@ -569,8 +569,8 @@ Linux系统启动时从硬件时钟读取日期和时间信息,读取完成以
     ```
     ```
     -c #:指定获取后#字节
     -c #:指定获取后#字节
     -n #:指定获取后#行
     -n #:指定获取后#行
-    	-#:简写
-    	没有该选项默认10行
+        -#:简写
+        没有该选项默认10行
     -f:查看文件尾部内容结束后不退出,跟随显示新增的行。常用于人工监控日志增长的新行内容
     -f:查看文件尾部内容结束后不退出,跟随显示新增的行。常用于人工监控日志增长的新行内容
     -F:同上,与f不同的是会保持重试,即该文件被删除或改名后,如果再次创建相同的文件名,会继续追踪,而f会停止追踪
     -F:同上,与f不同的是会保持重试,即该文件被删除或改名后,如果再次创建相同的文件名,会继续追踪,而f会停止追踪
     ```
     ```
@@ -629,10 +629,10 @@ Linux系统启动时从硬件时钟读取日期和时间信息,读取完成以
         ```
         ```
         -d DELIMITER:指明分隔符,默认空白字符
         -d DELIMITER:指明分隔符,默认空白字符
         -f FILEDS:要显示哪些字段
         -f FILEDS:要显示哪些字段
-        	#:第#个字段
-        	#,#[,#]:离散的多个字段,例如1,3,6
-        	#-#:连续的多个字段,例如1-6
-        	混合使用:1-3,7
+            #:第#个字段
+            #,#[,#]:离散的多个字段,例如1,3,6
+            #-#:连续的多个字段,例如1-6
+            混合使用:1-3,7
         --output-delimiter=STRING:修改输出时的分隔符
         --output-delimiter=STRING:修改输出时的分隔符
         ```
         ```
     - 命令实例
     - 命令实例
@@ -733,12 +733,12 @@ Linux系统启动时从硬件时钟读取日期和时间信息,读取完成以
         display file or file system status,显示文件的元数据信息
         display file or file system status,显示文件的元数据信息
         ---------------------
         ---------------------
         文件:两类数据
         文件:两类数据
-        	元数据:metadata
-        	数据:data
+            元数据:metadata
+            数据:data
         时间戳:每个文件都有3个时间戳
         时间戳:每个文件都有3个时间戳
-        	最近访问时间(access time):2016-04-24 21:20:42.477903125 +0800   			读取文件内容
-        	最近修改时间(modify time):2016-04-24 20:40:08.887958504 +0800			数据(文件内容)改变
-        	最近改变时间(change time):2016-04-24 20:40:08.887958504 +0800			元数据改变
+            最近访问时间(access time):2016-04-24 21:20:42.477903125 +0800               读取文件内容
+            最近修改时间(modify time):2016-04-24 20:40:08.887958504 +0800            数据(文件内容)改变
+            最近改变时间(change time):2016-04-24 20:40:08.887958504 +0800            元数据改变
         ```
         ```
     - 命令格式
     - 命令格式
         ```
         ```
@@ -759,7 +759,7 @@ Linux系统启动时从硬件时钟读取日期和时间信息,读取完成以
         -a:仅修改access time
         -a:仅修改access time
         -m:仅修改modify time
         -m:仅修改modify time
         -t STAMP:
         -t STAMP:
-        	[[CC]YY]MMDDhhmm[.ss]
+            [[CC]YY]MMDDhhmm[.ss]
         ```
         ```
 
 
 ### ***系统管理***
 ### ***系统管理***
@@ -767,33 +767,33 @@ Linux系统启动时从硬件时钟读取日期和时间信息,读取完成以
 - `关机/重启命令`
 - `关机/重启命令`
     ```
     ```
     CentOS 7:
     CentOS 7:
-    	~]# systemctl poweroff
-    	~]# systemctl reboot
+        ~]# systemctl poweroff
+        ~]# systemctl reboot
     *(通用):
     *(通用):
-    	~]# poweroff || ~]# halt
-    	~]# reboot
-    		-f:强制,不调用shuwdown
-    		-p:切断电源
+        ~]# poweroff || ~]# halt
+        ~]# reboot
+            -f:强制,不调用shuwdown
+            -p:切断电源
     shutdown:安全关机重启方式,会先保存未保存的数据
     shutdown:安全关机重启方式,会先保存未保存的数据
-    	shutdown [OPTIONS...] TIME [MESSAGE]
-    		OPTIONS:
-    			-h:halt  关机
-    			-r:reboot  重启
-    			-c:cancel  取消关机或重启
-    		TIME:
-    			now:立刻
-    			hh:mm:绝对时间表示法,指明具体时间
-    			+m:相对时间表示法,从命令提交开始多久之后,例如+3,单位是分钟
-    		MESSAGE:
-    			关机或重启提示语
+        shutdown [OPTIONS...] TIME [MESSAGE]
+            OPTIONS:
+                -h:halt  关机
+                -r:reboot  重启
+                -c:cancel  取消关机或重启
+            TIME:
+                now:立刻
+                hh:mm:绝对时间表示法,指明具体时间
+                +m:相对时间表示法,从命令提交开始多久之后,例如+3,单位是分钟
+            MESSAGE:
+                关机或重启提示语
     ```
     ```
 - `用户登录信息查看命令`
 - `用户登录信息查看命令`
     ```
     ```
     whoami:显示当前登录的有效用户
     whoami:显示当前登录的有效用户
     who:查看系统当前所有的登录信息(会话)
     who:查看系统当前所有的登录信息(会话)
-    	who [option]... ,
-    	-b:系统此次启动的时间
-    	-r:运行级别
+        who [option]... ,
+        -b:系统此次启动的时间
+        -r:运行级别
     w:增强版的who命令,查看系统当前所有的登录信息(会话)及所做的操作
     w:增强版的who命令,查看系统当前所有的登录信息(会话)及所做的操作
     ```
     ```
 
 
@@ -820,8 +820,8 @@ Linux系统启动时从硬件时钟读取日期和时间信息,读取完成以
         切换用户或以其他用户身份执行命令
         切换用户或以其他用户身份执行命令
         ----------------
         ----------------
         切换用户的方式:
         切换用户的方式:
-        	su Username:非登录式切换,即不会读取目标用户的配置文件
-        	su - Username:登录式切换(完全切换),即会读取目标用户的配置文件
+            su Username:非登录式切换,即不会读取目标用户的配置文件
+            su - Username:登录式切换(完全切换),即会读取目标用户的配置文件
         注:root su至其他用户无须密码,非root用户切换时需要密码
         注:root su至其他用户无须密码,非root用户切换时需要密码
         ```
         ```
     - 命令格式
     - 命令格式
@@ -848,7 +848,7 @@ Linux系统启动时从硬件时钟读取日期和时间信息,读取完成以
     - 命令参数
     - 命令参数
         ```
         ```
         -u UID:[UID_MIN,UID_MAX],最小值和最大值定义在/etc/login.defs文件中
         -u UID:[UID_MIN,UID_MAX],最小值和最大值定义在/etc/login.defs文件中
-        	没有该选项默认使用最近一个最大UID值+1
+            没有该选项默认使用最近一个最大UID值+1
         -g GID:指明用户所属基本组,可为组名,也可为GID,组必须事先存在
         -g GID:指明用户所属基本组,可为组名,也可为GID,组必须事先存在
         -c "COMMENT":指明用户的注释信息
         -c "COMMENT":指明用户的注释信息
         -d /PATH/TO/HOME_DIR:指明用户的家目录,一般来讲此目录事先不要已存在
         -d /PATH/TO/HOME_DIR:指明用户的家目录,一般来讲此目录事先不要已存在
@@ -910,8 +910,8 @@ Linux系统启动时从硬件时钟读取日期和时间信息,读取完成以
         ```
         ```
     - 命令参数
     - 命令参数
         ```
         ```
-        -g GID:指定GID,[GID_MIN,GID_MAX],最小值和最大值定义在/etc/login.defs文件中	
-        	没有该选项默认是上一个组的GID+1
+        -g GID:指定GID,[GID_MIN,GID_MAX],最小值和最大值定义在/etc/login.defs文件中    
+            没有该选项默认是上一个组的GID+1
         -r:创建系统组
         -r:创建系统组
         ```
         ```
     - 命令实例
     - 命令实例
@@ -958,7 +958,7 @@ Linux系统启动时从硬件时钟读取日期和时间信息,读取完成以
         ```
         ```
         -l:锁定指定用户
         -l:锁定指定用户
         -u:解锁指定用户
         -u:解锁指定用户
-	
+    
         -n mindays:指定最短使用期限
         -n mindays:指定最短使用期限
         -x maxdays:指定最大使用期限
         -x maxdays:指定最大使用期限
         -w warndays:提前多少天开始警告
         -w warndays:提前多少天开始警告
@@ -1007,7 +1007,7 @@ Linux系统启动时从硬件时钟读取日期和时间信息,读取完成以
         ```
         ```
     - 命令参数
     - 命令参数
         ```
         ```
-        -d:LAST_DAY	
+        -d:LAST_DAY    
         -E,--expiredate EXPIRE_DATE
         -E,--expiredate EXPIRE_DATE
         -I,--inactive INACTIVE
         -I,--inactive INACTIVE
         -m,--mindays MIN_DAYS
         -m,--mindays MIN_DAYS
@@ -1025,21 +1025,21 @@ Linux系统启动时从硬件时钟读取日期和时间信息,读取完成以
     - 命令格式
     - 命令格式
         ```
         ```
         ~]# chmod [OPTION]... OCTAL-MODE FILE...
         ~]# chmod [OPTION]... OCTAL-MODE FILE...
-        	-R:递归修改权限
+            -R:递归修改权限
         ~]# chmod [OPTION]... MODE[,MODE]... FILE...
         ~]# chmod [OPTION]... MODE[,MODE]... FILE...
-        	MODE:
-        		修改一类用户的所有权限:
-        			u=
-        			g=
-        			o=
-        			ug=
-        			a=
-        			u=,g=
-        		修改一类用户的某位或某些权限
-        			u+
-        			u-
+            MODE:
+                修改一类用户的所有权限:
+                    u=
+                    g=
+                    o=
+                    ug=
+                    a=
+                    u=,g=
+                修改一类用户的某位或某些权限
+                    u+
+                    u-
         ~]# chmod [OPTION]... --reference=RFILE FILE...
         ~]# chmod [OPTION]... --reference=RFILE FILE...
-        	参考RFILE文件的权限,将FILE的权限修改为同RFILE
+            参考RFILE文件的权限,将FILE的权限修改为同RFILE
         ```
         ```
     - 命令实例
     - 命令实例
         ```
         ```
@@ -1064,12 +1064,12 @@ Linux系统启动时从硬件时钟读取日期和时间信息,读取完成以
     - 命令格式
     - 命令格式
         ```
         ```
         ~]# chown [OPTION]... [OWNER][:[GROUP]] FILE...
         ~]# chown [OPTION]... [OWNER][:[GROUP]] FILE...
-        	-R:递归
-        	命令中的冒号可用.替换
-        	用法:
-        		OWNER
-        		OWNER:GROUP
-        		:GROUP
+            -R:递归
+            命令中的冒号可用.替换
+            用法:
+                OWNER
+                OWNER:GROUP
+                :GROUP
         ~]# chown [OPTION]... --reference=RFILE FILE...
         ~]# chown [OPTION]... --reference=RFILE FILE...
         ```
         ```
     - 命令实例
     - 命令实例
@@ -1130,187 +1130,187 @@ Linux系统启动时从硬件时钟读取日期和时间信息,读取完成以
     - 常用操作
     - 常用操作
         ```
         ```
         打开文件:
         打开文件:
-        	~]# vim [OPTION]... FILE...	
-        		+#:打开文件后,直接让光标处于第#行的行首;没有#光标默认处于尾部	
-        		+/PATTEN:打开文件后,直接让光标处于第一个被PATTEN匹配到的行的行首
+            ~]# vim [OPTION]... FILE...    
+                +#:打开文件后,直接让光标处于第#行的行首;没有#光标默认处于尾部    
+                +/PATTEN:打开文件后,直接让光标处于第一个被PATTEN匹配到的行的行首
         关闭文件:
         关闭文件:
-        	:q	退出
-        	:q!	强制退出,丢弃做出的修改
-        	:wq	保存退出
-        	:x	保存退出
+            :q    退出
+            :q!    强制退出,丢弃做出的修改
+            :wq    保存退出
+            :x    保存退出
 
 
-        	ZZ	保存退出(命令模式下)				
+            ZZ    保存退出(命令模式下)                
         基本模式:
         基本模式:
-        	编辑模式:也叫命令模式,默认处于此模式,对文本进行复制,剪切, 粘贴等
-        	输入模式:也叫插入模式,对文件内容进行编辑
-        	末行模式:内置的命令行接口,可实现许多强大的功能
+            编辑模式:也叫命令模式,默认处于此模式,对文本进行复制,剪切, 粘贴等
+            输入模式:也叫插入模式,对文件内容进行编辑
+            末行模式:内置的命令行接口,可实现许多强大的功能
         模式转换:
         模式转换:
-        	编辑模式-->输入模式
-        		i:insert,在光标所在处输入	
-        		a:append,在光标所在处后面输入
-        		o:open,在当前光标所在行的下方打开一个新行输入
-        		I:在当前光标所在行的行首输入
-        		A:在当前光标所在行的行尾输入
-        		O:在当前光标所在行的上方打开一个新行输入
-        		c:change,
-        		C:
-        	输入模式-->编辑模式
-        		ESC
-        	编辑模式-->末行模式
-        		:
-        	末行模式-->编辑模式
-        		ESC
+            编辑模式-->输入模式
+                i:insert,在光标所在处输入    
+                a:append,在光标所在处后面输入
+                o:open,在当前光标所在行的下方打开一个新行输入
+                I:在当前光标所在行的行首输入
+                A:在当前光标所在行的行尾输入
+                O:在当前光标所在行的上方打开一个新行输入
+                c:change,
+                C:
+            输入模式-->编辑模式
+                ESC
+            编辑模式-->末行模式
+                :
+            末行模式-->编辑模式
+                ESC
         光标跳转:
         光标跳转:
-        	字符间跳转:
-        		h(左),j(下),k(上),l(右)
+            字符间跳转:
+                h(左),j(下),k(上),l(右)
 
 
-        		#COMMAND:跳转由#指定一次跳转的字符数
-        	单词间跳转:
-        		w:下一个单词的词首
-        		e:当前或下一个单词的词尾
-        		b:当前或前一个单词的词首
+                #COMMAND:跳转由#指定一次跳转的字符数
+            单词间跳转:
+                w:下一个单词的词首
+                e:当前或下一个单词的词尾
+                b:当前或前一个单词的词首
 
 
-        		#COMMAND:跳转由#指定一次跳转的单词数
-        	行首行尾跳转:					
-        		^:跳转至行首的第一个非空白字符				
-        		0:跳转至行首				
-        		$:跳转至行尾				
-        	行间移动:					
-        		#G:跳转至由#指定行				
-        		G:跳转至最后一行				
-        		1G或gg:跳转至第一行				
-        	句间移动:了解即可					
-        		)
-        		(
-        	段落间移动:了解即可
-        		}
-        		{
-        	ctrl+g显示当前光标所在行位置及文件状态信息
+                #COMMAND:跳转由#指定一次跳转的单词数
+            行首行尾跳转:                    
+                ^:跳转至行首的第一个非空白字符                
+                0:跳转至行首                
+                $:跳转至行尾                
+            行间移动:                    
+                #G:跳转至由#指定行                
+                G:跳转至最后一行                
+                1G或gg:跳转至第一行                
+            句间移动:了解即可                    
+                )
+                (
+            段落间移动:了解即可
+                }
+                {
+            ctrl+g显示当前光标所在行位置及文件状态信息
         编辑命令:
         编辑命令:
-        	剪切命令:
-        		x:删除光标处的字符
-        		#x:删除光标处起始的#个字符
-        		xp:交换光标所在处的字符及其后面字符的位置
-			
-        		d(常用):可结合光标跳转字符,实现范围删除
-        			d$,d^,d0,dw,de,db,#COMMAND...
-        			dd:删除光标所在行
-        				#dd:多行删除	
-        	粘贴命令(p,put,paste):
-        		p(小写):缓冲区存储的如果为整行,则粘贴至当前光标所在行的下方;否则粘贴至当前光标所在处的后面
-        		P(大写):缓冲区存储的如果为整行,则粘贴至当前光标所在行的上方;否则粘贴至当前光标所在处的前面
-        	复制命令(y,yank):
-        		y:工作行为相似于d命令
-        			y$,y^,y0,yw,de,yb,#COMMAND...
-        			yy:复制光标所在行
-        				#yy:多行复制	
-        	改变命令(c,change):
-        		c:修改,同d命令,但同时会进入插入模式
-        			c$,c^,c0,cw,ce,cb,#COMMAND...
-        			cc:
-        				#cc:
-				
-        	可视化模式:经常结合编辑命令中的d,y进行复制剪切
-        		v(小写):按字符选定光标划过的区域
-        		V(大写):按行选定光标划过的区域
-        	撤销命令:
-        		u(undo):撤销此前的操作
-        			#u:撤销指定次数的操作
-        	撤销此前的撤销操作:
-        		Ctrl+r
-        	重复前一个编辑操作:常用于和dd配合使用
-        		.
-        	%可以在当前有括号的光标处查找配对的括号)}],常用于程序调试时查找不配对的括号
-        	r输入一个字符可替换光标所在位置的字符
+            剪切命令:
+                x:删除光标处的字符
+                #x:删除光标处起始的#个字符
+                xp:交换光标所在处的字符及其后面字符的位置
+            
+                d(常用):可结合光标跳转字符,实现范围删除
+                    d$,d^,d0,dw,de,db,#COMMAND...
+                    dd:删除光标所在行
+                        #dd:多行删除    
+            粘贴命令(p,put,paste):
+                p(小写):缓冲区存储的如果为整行,则粘贴至当前光标所在行的下方;否则粘贴至当前光标所在处的后面
+                P(大写):缓冲区存储的如果为整行,则粘贴至当前光标所在行的上方;否则粘贴至当前光标所在处的前面
+            复制命令(y,yank):
+                y:工作行为相似于d命令
+                    y$,y^,y0,yw,de,yb,#COMMAND...
+                    yy:复制光标所在行
+                        #yy:多行复制    
+            改变命令(c,change):
+                c:修改,同d命令,但同时会进入插入模式
+                    c$,c^,c0,cw,ce,cb,#COMMAND...
+                    cc:
+                        #cc:
+                
+            可视化模式:经常结合编辑命令中的d,y进行复制剪切
+                v(小写):按字符选定光标划过的区域
+                V(大写):按行选定光标划过的区域
+            撤销命令:
+                u(undo):撤销此前的操作
+                    #u:撤销指定次数的操作
+            撤销此前的撤销操作:
+                Ctrl+r
+            重复前一个编辑操作:常用于和dd配合使用
+                .
+            %可以在当前有括号的光标处查找配对的括号)}],常用于程序调试时查找不配对的括号
+            r输入一个字符可替换光标所在位置的字符
         末行命令:
         末行命令:
-        	1.地址定界:
-        		:start_pos,end_pos
-        			#:具体第#行,例如2表示第2行
-        			#,#:从左侧#表示行起始,到右侧#表示行结尾
-        			#,+#:从左侧#表示行起始,加上右侧#表示的行数
-        			.:当前行
-        			$:最后一行
-        			%:全文,相当于1,$
-        		使用方法:后跟一个编辑命令
-        			d,y,...
-        			w /APTH/TO/SOMEWHERE:将范围内的行另存至指定文件中
-        			r /APTH/FROM/SOMEWHERE:在指定位置插入指定文件中的所有内容
-        	2.查找:同less命令的查找
-        		/PATTERN:从当前光标所在处向文件尾部查找
-        		?PATTERN:从当前光标所在处向文件首部查找
-        			n:与查找命令方向相同
-        			N:与查找命令方向相反
-        	3.查找并替换:需结合地址定界一起使用
-        		s/要查找的内容/替换为的内容/修饰符
-        			要查找的内容:可使用模式
-        			替换为的内容:不能使用模式,但可以使用\1,\2,...等后向引用符号;还可以使用"&"引用前面查找时查找到的整个内容
-        			修饰符:
-        				i:忽略大小写
-        				g:全局替换,默认情况下,每一行只替换第一次出现的内容
-        				c:询问用户是否替换
-        		查找替换中的分隔符/可替换为其他字符,例如
-        			s@@@
-        			s###
-        		练习:
-        			1.复制/etc/grub2.cfg至/tmp/目录,用直接替换命令删除/tmp/grub2.cfg文件中的行首的空白字符
-        				%s/^[[:space:]]\+//g
-        			2.复制/etc/rc.d/init.d/functions文件至/tmp目录,用查找替换命令为/tmp/functions的每行开头为空白字符的行的行首添加一个#号
-        				%s/^[[:space:]]/#&/
-        	4.多文件模式下的操作:一般窗口没有分割时
-        		:next   下一个
-        		:prev   前一个
-        		:first  第一个
-        		:last   最后一个
+            1.地址定界:
+                :start_pos,end_pos
+                    #:具体第#行,例如2表示第2行
+                    #,#:从左侧#表示行起始,到右侧#表示行结尾
+                    #,+#:从左侧#表示行起始,加上右侧#表示的行数
+                    .:当前行
+                    $:最后一行
+                    %:全文,相当于1,$
+                使用方法:后跟一个编辑命令
+                    d,y,...
+                    w /APTH/TO/SOMEWHERE:将范围内的行另存至指定文件中
+                    r /APTH/FROM/SOMEWHERE:在指定位置插入指定文件中的所有内容
+            2.查找:同less命令的查找
+                /PATTERN:从当前光标所在处向文件尾部查找
+                ?PATTERN:从当前光标所在处向文件首部查找
+                    n:与查找命令方向相同
+                    N:与查找命令方向相反
+            3.查找并替换:需结合地址定界一起使用
+                s/要查找的内容/替换为的内容/修饰符
+                    要查找的内容:可使用模式
+                    替换为的内容:不能使用模式,但可以使用\1,\2,...等后向引用符号;还可以使用"&"引用前面查找时查找到的整个内容
+                    修饰符:
+                        i:忽略大小写
+                        g:全局替换,默认情况下,每一行只替换第一次出现的内容
+                        c:询问用户是否替换
+                查找替换中的分隔符/可替换为其他字符,例如
+                    s@@@
+                    s###
+                练习:
+                    1.复制/etc/grub2.cfg至/tmp/目录,用直接替换命令删除/tmp/grub2.cfg文件中的行首的空白字符
+                        %s/^[[:space:]]\+//g
+                    2.复制/etc/rc.d/init.d/functions文件至/tmp目录,用查找替换命令为/tmp/functions的每行开头为空白字符的行的行首添加一个#号
+                        %s/^[[:space:]]/#&/
+            4.多文件模式下的操作:一般窗口没有分割时
+                :next   下一个
+                :prev   前一个
+                :first  第一个
+                :last   最后一个
 
 
-        		:wall   保存所有
-        		:qall   退出所有
-        		:wqall  保存退出所有
-        	5.获取帮助
-        		:help
-        		:help keywords
-        	6.执行外部命令
-        		:! COMMAND  用于执行一个外部命令
-        		:r ! COMMAND  读取外部命令的输出放到光标处
+                :wall   保存所有
+                :qall   退出所有
+                :wqall  保存退出所有
+            5.获取帮助
+                :help
+                :help keywords
+            6.执行外部命令
+                :! COMMAND  用于执行一个外部命令
+                :r ! COMMAND  读取外部命令的输出放到光标处
         窗口分割模式:
         窗口分割模式:
-        	窗口间切换:Ctrl+w,Arrow
-        	单文件:
-        		Ctrl+w,s:split,水平分割
-        		Ctrl+w,v:vertical,垂直分割
-        	多文件:
-        		vim -o|O FILE1 FILE2 FILE3...
-        			-o:水平分割
-        			-O:垂直分割
+            窗口间切换:Ctrl+w,Arrow
+            单文件:
+                Ctrl+w,s:split,水平分割
+                Ctrl+w,v:vertical,垂直分割
+            多文件:
+                vim -o|O FILE1 FILE2 FILE3...
+                    -o:水平分割
+                    -O:垂直分割
         定制vim的工作特性:
         定制vim的工作特性:
-        	配置文件:永久有效	
-        		全局:/etc/vimrc
-        		个人(需手动创建该文件):~/.vimrc
-        	末行命令:当前vim进程有效
-        						
-        	1.行号
-        		显示:set number,简写为set nu	
-        		取消显示:set nonumber,简写为set nonu
-        	2.括号匹配
-        		匹配:set showmatch,简写为set sm
-        		取消匹配:set noshowmatch,简写为set nosm
-        	3.自动缩进(autoindent)
-        		启用:set ai
-        		禁用:set noai
-        	4.高亮(HighLight)搜索
-        		启用:set hlsearch
-        		禁用:set nohlsearch
-        	5.语法(syntax)高亮
-        		启用:syntax on
-        		禁用:syntax off
-        	6.忽略字符大小写(ignorecase)
-        		启用:set ic
-        		禁用:set noic
+            配置文件:永久有效    
+                全局:/etc/vimrc
+                个人(需手动创建该文件):~/.vimrc
+            末行命令:当前vim进程有效
+                                
+            1.行号
+                显示:set number,简写为set nu    
+                取消显示:set nonumber,简写为set nonu
+            2.括号匹配
+                匹配:set showmatch,简写为set sm
+                取消匹配:set noshowmatch,简写为set nosm
+            3.自动缩进(autoindent)
+                启用:set ai
+                禁用:set noai
+            4.高亮(HighLight)搜索
+                启用:set hlsearch
+                禁用:set nohlsearch
+            5.语法(syntax)高亮
+                启用:syntax on
+                禁用:syntax off
+            6.忽略字符大小写(ignorecase)
+                启用:set ic
+                禁用:set noic
         翻屏操作:
         翻屏操作:
-        	ctrl+f:向文件尾部翻一屏
-        	ctrl+b:向文件首部翻一屏
-        	ctrl+d:向文件尾部翻半屏
-        	ctrl+u:向文件首部翻半屏
+            ctrl+f:向文件尾部翻一屏
+            ctrl+b:向文件首部翻一屏
+            ctrl+d:向文件尾部翻半屏
+            ctrl+u:向文件首部翻半屏
         vim自带的练习教程:
         vim自带的练习教程:
-        	vimtutor
+            vimtutor
         ```
         ```
 
 
 ### ***文件查找***
 ### ***文件查找***
@@ -1324,9 +1324,9 @@ Linux系统启动时从硬件时钟读取日期和时间信息,读取完成以
         可手动更新数据库(updatedb),与makewhatis类似,索引构建过程中需要遍历整个根文件系统,极消耗资源
         可手动更新数据库(updatedb),与makewhatis类似,索引构建过程中需要遍历整个根文件系统,极消耗资源
         -----------------------
         -----------------------
         工作特点:
         工作特点:
-        	查找速度快
-        	模糊查找:根据整个路径名和文件名
-        	非实时查找
+            查找速度快
+            模糊查找:根据整个路径名和文件名
+            非实时查找
         ```
         ```
     - 命令格式
     - 命令格式
         ```
         ```
@@ -1338,78 +1338,78 @@ Linux系统启动时从硬件时钟读取日期和时间信息,读取完成以
         实时查找工具,通过遍历指定路径下的文件系统完成文件查找
         实时查找工具,通过遍历指定路径下的文件系统完成文件查找
         -----------------------
         -----------------------
         工作特点:
         工作特点:
-        	查找速度略慢
-        	精确查找:根据文件本身的名字而非整个路径名
-        	实时查找
+            查找速度略慢
+            精确查找:根据文件本身的名字而非整个路径名
+            实时查找
         ```
         ```
     - 命令格式
     - 命令格式
         ```
         ```
         ~]# find [OPTION]... [查找路径] [查找条件] [处理动作]
         ~]# find [OPTION]... [查找路径] [查找条件] [处理动作]
-        	查找路径:指定具体目标路径,可以多个;默认为当前目录
-        	查找条件:指定的查找标准,可以是文件名/大小/类型/权限等标准进行;默认为找出指定路径下的所有文件
-        		根据文件名:
-        			-name "文件名称":支持使用文件名通配(globbing)
-        				*,?,[],[^]
-        			-iname "文件名称":不区分字母大小写
+            查找路径:指定具体目标路径,可以多个;默认为当前目录
+            查找条件:指定的查找标准,可以是文件名/大小/类型/权限等标准进行;默认为找出指定路径下的所有文件
+                根据文件名:
+                    -name "文件名称":支持使用文件名通配(globbing)
+                        *,?,[],[^]
+                    -iname "文件名称":不区分字母大小写
 
 
-        			-regex "PATTEN":以PATTE匹配整个文件路径字符串,而不仅仅是文件名称
-        		根据属主/属组:
-        			-user USERNAME:查找属主为指定用户的文件
-        			-group GROUPNAME:查找属组为指定组的文件
+                    -regex "PATTEN":以PATTE匹配整个文件路径字符串,而不仅仅是文件名称
+                根据属主/属组:
+                    -user USERNAME:查找属主为指定用户的文件
+                    -group GROUPNAME:查找属组为指定组的文件
 
 
-        			-uid UserID:查找属主为指定UID号的文件
-        			-gid GroupID:查找属组为指定GID号的文件
+                    -uid UserID:查找属主为指定UID号的文件
+                    -gid GroupID:查找属组为指定GID号的文件
 
 
-        			-nouser:查找没有属主的文件,如用户删了
-        			-nogroup:查找没有属组的文件,如用户删了,私有组也没了
-        		根据文件类型:
-        			-type TYPE:
-        				可参考ls命令中的各类型代表字符
-        		根据文件大小:
-        			-size [+|-]#UNIT
-        				常用单位:K,M,G
+                    -nouser:查找没有属主的文件,如用户删了
+                    -nogroup:查找没有属组的文件,如用户删了,私有组也没了
+                根据文件类型:
+                    -type TYPE:
+                        可参考ls命令中的各类型代表字符
+                根据文件大小:
+                    -size [+|-]#UNIT
+                        常用单位:K,M,G
 
 
-        			#UNIT:(#-1,#]
-        			-#UNIT:(0,#-1]
-        			+#UNIT:(#,无穷大)
-        		根据时间戳:
-        			以"天"为单位:
-        				-atime [+|-]#
-        					#:[#,#+1)
-        					+#:[#+1,无穷大)
-        					-#:[0,#)
-        				-mtime [+|-]#
-        				-ctime [+|-]#
-        			以"分钟"为单位:
-        				-amin [+|-]#
-        				-mmin [+|-]#
-        				-cmin [+|-]#
-        		根据权限:
-        			-perm [/|-]MODE
-        				MODE:精确权限匹配
-        				/MODE:任何一类(u,g,o)对象的权限中只要能有一位匹配即可
-        				-MODE:每一类对象都必须同时拥有为其指定的权限标准
-        		组合条件:
-        			与:-a,可以省略
-        			或:-o
-        			非:-not,!
+                    #UNIT:(#-1,#]
+                    -#UNIT:(0,#-1]
+                    +#UNIT:(#,无穷大)
+                根据时间戳:
+                    以"天"为单位:
+                        -atime [+|-]#
+                            #:[#,#+1)
+                            +#:[#+1,无穷大)
+                            -#:[0,#)
+                        -mtime [+|-]#
+                        -ctime [+|-]#
+                    以"分钟"为单位:
+                        -amin [+|-]#
+                        -mmin [+|-]#
+                        -cmin [+|-]#
+                根据权限:
+                    -perm [/|-]MODE
+                        MODE:精确权限匹配
+                        /MODE:任何一类(u,g,o)对象的权限中只要能有一位匹配即可
+                        -MODE:每一类对象都必须同时拥有为其指定的权限标准
+                组合条件:
+                    与:-a,可以省略
+                    或:-o
+                    非:-not,!
 
 
                     摩根定律:
                     摩根定律:
                         !A -a !B 相当于 !(A -o B)
                         !A -a !B 相当于 !(A -o B)
                         !A -o !B 相当于 !(A -a B)
                         !A -o !B 相当于 !(A -a B)
-        	处理动作:对符合条件的文件做什么操作;默认输出至屏幕
-        		-print:默认的处理动作,显示至屏幕
-        		-ls:类似于对查找到的文件执行"ls -l"命令
-        		-delete:删除查找到的文件
-        		-fls /PATH/TO/SOMEFILE:查找到的所有文件的长格式信息保存至指定文件中
-        		-ok COMMAND {} \:对查找到的每个文件执行由COMMAND指定的命令
-        			对于每个文件执行命令之前,都会交互式要求用户确认
-        		-exec COMMAND {} \:对查找到的每个文件执行由COMMAND指定的命令,不会要求用户确认
-        			{}:用于引用查找到的文件名称自身
+            处理动作:对符合条件的文件做什么操作;默认输出至屏幕
+                -print:默认的处理动作,显示至屏幕
+                -ls:类似于对查找到的文件执行"ls -l"命令
+                -delete:删除查找到的文件
+                -fls /PATH/TO/SOMEFILE:查找到的所有文件的长格式信息保存至指定文件中
+                -ok COMMAND {} \:对查找到的每个文件执行由COMMAND指定的命令
+                    对于每个文件执行命令之前,都会交互式要求用户确认
+                -exec COMMAND {} \:对查找到的每个文件执行由COMMAND指定的命令,不会要求用户确认
+                    {}:用于引用查找到的文件名称自身
 
 
-        		注:find传递查找到的文件至后面指定的命令时,查找到所有符合条件的文件会一次性传递个后面的命令,
-        		有些命令不能接受过多参数,此时命令可能会失败,另一种方式可规避此问题:
-        			find | xargs COMMAND
+                注:find传递查找到的文件至后面指定的命令时,查找到所有符合条件的文件会一次性传递个后面的命令,
+                有些命令不能接受过多参数,此时命令可能会失败,另一种方式可规避此问题:
+                    find | xargs COMMAND
         ```
         ```
     - 命令实例
     - 命令实例
         ```
         ```
@@ -1444,7 +1444,7 @@ Linux系统启动时从硬件时钟读取日期和时间信息,读取完成以
         作用:根据用户指定的"模式"对目标文本逐行进行匹配检查,并打印匹配到的行
         作用:根据用户指定的"模式"对目标文本逐行进行匹配检查,并打印匹配到的行
         -----------------------
         -----------------------
         egrep:默认支持扩展正则表达式来匹配
         egrep:默认支持扩展正则表达式来匹配
-        fgrep:不支持正则表达式搜索(即不基于正则表达式引擎做模式匹配),而仅仅是找给定的字符串,因此执行性能快很多	
+        fgrep:不支持正则表达式搜索(即不基于正则表达式引擎做模式匹配),而仅仅是找给定的字符串,因此执行性能快很多    
         ```
         ```
     - 命令格式
     - 命令格式
         ```
         ```
@@ -1467,43 +1467,43 @@ Linux系统启动时从硬件时钟读取日期和时间信息,读取完成以
     - 常用操作
     - 常用操作
         ```
         ```
         模式:由正则表达式字符及文本字符所编写的过滤条件
         模式:由正则表达式字符及文本字符所编写的过滤条件
-        	基本正则表达式:BRE
-        		元字符:
-        			字符匹配:
-        				.:匹配任意单个字符
-        				[]:匹配指定范围内的任意单个字符
-        				[^]:匹配指定范围外的任意单个字符
-        			次数匹配:用在要指定次数的字符后面,用于指定前面的字符要出现的次数
-        				\?:0或1次
-        				*:0或多次(任意次)
-        				\+:1次或多次
-        				\{m\}:恰好m次
-        				\{m,n\}:最少m次,最多n次
-        					\{0,n\}:最多n次
-        					\{m,\}:最少m次
-        			位置锚定:
-        				^:行首锚定,用于模式的最左侧
-        				$:行尾锚定,用于模式的最右侧
-        				^PATTERN$:用于模式匹配整行
-        					^$:空行(不包括空白字符)
-        					^[[:space:]]*$:
-        				\<或\b:词首锚定,用于单词模式的左侧
-        				\>或\b:词尾锚定,用于单词模式的右侧
-        				\<PATTERN\>:匹配整个单词
-        			分组:
-        				\(\):将一个或多个字符捆绑在一起,当作一个整体进行处理
-        				注:分组括号中的模式匹配到的内容会被正则表达式引擎记录于内部(greb程序)的变量中,这些变量的命名方式为\1,\2,\3,...
-        					\1:从左侧起,第一个左括号以及与之匹配右括号之间的模式所匹配到的字符
+            基本正则表达式:BRE
+                元字符:
+                    字符匹配:
+                        .:匹配任意单个字符
+                        []:匹配指定范围内的任意单个字符
+                        [^]:匹配指定范围外的任意单个字符
+                    次数匹配:用在要指定次数的字符后面,用于指定前面的字符要出现的次数
+                        \?:0或1次
+                        *:0或多次(任意次)
+                        \+:1次或多次
+                        \{m\}:恰好m次
+                        \{m,n\}:最少m次,最多n次
+                            \{0,n\}:最多n次
+                            \{m,\}:最少m次
+                    位置锚定:
+                        ^:行首锚定,用于模式的最左侧
+                        $:行尾锚定,用于模式的最右侧
+                        ^PATTERN$:用于模式匹配整行
+                            ^$:空行(不包括空白字符)
+                            ^[[:space:]]*$:
+                        \<或\b:词首锚定,用于单词模式的左侧
+                        \>或\b:词尾锚定,用于单词模式的右侧
+                        \<PATTERN\>:匹配整个单词
+                    分组:
+                        \(\):将一个或多个字符捆绑在一起,当作一个整体进行处理
+                        注:分组括号中的模式匹配到的内容会被正则表达式引擎记录于内部(greb程序)的变量中,这些变量的命名方式为\1,\2,\3,...
+                            \1:从左侧起,第一个左括号以及与之匹配右括号之间的模式所匹配到的字符
 
 
-        				后向引用:引用前面的分组括号中的模式所匹配字符,而非模式本身
-        					~]# grep '\([[:alpha:]]\{1,3\}t\).*\1' /etc/passwd
-        	扩展正则表达式:ERE
-            	元字符:
-            		字符匹配,次数匹配,位置锚定,分组:
-            			同BRE,其中?,+,{},()不需要转义	
-            		或者:
-            			a|b
-            				C|cat:C或cat
+                        后向引用:引用前面的分组括号中的模式所匹配字符,而非模式本身
+                            ~]# grep '\([[:alpha:]]\{1,3\}t\).*\1' /etc/passwd
+            扩展正则表达式:ERE
+                元字符:
+                    字符匹配,次数匹配,位置锚定,分组:
+                        同BRE,其中?,+,{},()不需要转义    
+                    或者:
+                        a|b
+                            C|cat:C或cat
         ```
         ```
     - 命令实例
     - 命令实例
         ```
         ```
@@ -1516,9 +1516,9 @@ Linux系统启动时从硬件时钟读取日期和时间信息,读取完成以
         练习4:找出/etc/passwd中的两位或三位数
         练习4:找出/etc/passwd中的两位或三位数
             ~]# grep '\<[0-9]\{2,3\}\>' /etc/passwd
             ~]# grep '\<[0-9]\{2,3\}\>' /etc/passwd
         练习5:显示/etc/grub2.cfg(或conf)文件中,至少以一个空白字符开头的行且后面存在非空白字符的行
         练习5:显示/etc/grub2.cfg(或conf)文件中,至少以一个空白字符开头的行且后面存在非空白字符的行
-            ~]# grep '^[[:space:]]\+[^[:space:]]' /etc/grub2.cfg							
+            ~]# grep '^[[:space:]]\+[^[:space:]]' /etc/grub2.cfg                            
         练习6:找出"netstat -tan"命令的结果中以"LISTEN"后跟0,1或多个空白字符结尾的行
         练习6:找出"netstat -tan"命令的结果中以"LISTEN"后跟0,1或多个空白字符结尾的行
-            ~]# netstat -tan | grep 'LISTEN[[:space:]]*$'			
+            ~]# netstat -tan | grep 'LISTEN[[:space:]]*$'            
         练习7:添加用户bash,testbash,basher以及nologin(其shell为/sbin/nologin),而后找出/etc/passwd文件中用户名同shell名的行
         练习7:添加用户bash,testbash,basher以及nologin(其shell为/sbin/nologin),而后找出/etc/passwd文件中用户名同shell名的行
             ~]# grep '^\([[:alnum:]]\+\>\).*\1$' /etc/passwd
             ~]# grep '^\([[:alnum:]]\+\>\).*\1$' /etc/passwd
         ------------------------------------
         ------------------------------------

+ 106 - 106
source/_posts/os-linux-shell.md

@@ -33,14 +33,14 @@ shell脚本编程笔记...
     ```
     ```
 - `运行脚本`
 - `运行脚本`
     ```
     ```
-    1.给予执行权限,通过具体的文件路径指定文件执行	
+    1.给予执行权限,通过具体的文件路径指定文件执行    
         eg: ~]# ./first.sh
         eg: ~]# ./first.sh
     2.直接运行解释器,将脚本作为解释器程序的参数运行
     2.直接运行解释器,将脚本作为解释器程序的参数运行
     ```
     ```
 - `bash自定义退出状态码`
 - `bash自定义退出状态码`
     ```
     ```
     exit [n]:
     exit [n]:
-    	注:脚本中一旦遇到exit命令,脚本会立即终止;终止退出状态取决于exit命令后面的数字
+        注:脚本中一旦遇到exit命令,脚本会立即终止;终止退出状态取决于exit命令后面的数字
     注:如果未给脚本指定退出状态码,整个脚本的退出状态码取决于脚本中执行的最后一条命令的状态码
     注:如果未给脚本指定退出状态码,整个脚本的退出状态码取决于脚本中执行的最后一条命令的状态码
     ```
     ```
 - `bash脚本编程之用户交互`
 - `bash脚本编程之用户交互`
@@ -51,7 +51,7 @@ shell脚本编程笔记...
             对bash而言,在同一行中使用分号隔开,2个命令会顺序执行
             对bash而言,在同一行中使用分号隔开,2个命令会顺序执行
         -t TIMEOUT:设置命令等待的超时时间,单位为秒,在交互中用户如果超时没输入可以在脚本中给默认值
         -t TIMEOUT:设置命令等待的超时时间,单位为秒,在交互中用户如果超时没输入可以在脚本中给默认值
     # bash -n /path/to/some_script
     # bash -n /path/to/some_script
-    	检测脚本中的语法错误,不能检查逻辑错误
+        检测脚本中的语法错误,不能检查逻辑错误
     # bash -x /path/to/some_script
     # bash -x /path/to/some_script
         调试(单步)执行,它能显示其中执行的每一个代码的详细过程
         调试(单步)执行,它能显示其中执行的每一个代码的详细过程
     ```
     ```
@@ -98,39 +98,39 @@ shell脚本编程笔记...
 - `bash中变量种类`
 - `bash中变量种类`
     ```
     ```
     根据变量的生效范围等标准:
     根据变量的生效范围等标准:
-    	本地变量:生效范围为当前shell进程,对当前shell之外的其它shell进程,当前shell的子进程均无效	
-    		变量赋值:name="value",将赋值符号后面的数据存储于变量名指向的内存空间
-    			value:可以使用引用
-    				1.可以是直接字串:name="username"	
-    				2.变量引用:name="$username"
-    				3.命令引用:name=`COMMAND`,name=$(COMMAND),命令执行的返回值	
-    		变量引用:${name},$name
-    			单引号:强引用,其中的变量引用不会被替换为变量值,而保持原字符串
-    			双引号:弱引用,其中的变量引用会被替换为变量值
-    		显示已定义的所有变量:
-    			set
-    		销毁变量:
-    			unset name
-    	环境变量:生效范围为当前shell进程及其子进程
-    		变量声明\赋值:
-    			export name=VALUE
-    			declare -x name=VALUE
-    		变量引用:同本地变量
-    		显示所有环境变量:
-    			export
-    			env
-    			printenv
-    		销毁变量:同本地变量
-    	局部变量:生效范围为当前shell进程中某代码片段(通常指函数)
-    	位置变量:用于让脚本在脚本代码中调用通过命令行传递给它的参数
-    		$1,$2,...:对应调用第1,第2等参数
-
-    		$0:命令本身
-
-    		$*:传递个脚本的所有参数(当做一个字符串)	
-    		$@:传递个脚本的所有参数(多个字符串)
-    		$#:传递个脚本的参数的个数
-    	特殊变量:$?
+        本地变量:生效范围为当前shell进程,对当前shell之外的其它shell进程,当前shell的子进程均无效    
+            变量赋值:name="value",将赋值符号后面的数据存储于变量名指向的内存空间
+                value:可以使用引用
+                    1.可以是直接字串:name="username"    
+                    2.变量引用:name="$username"
+                    3.命令引用:name=`COMMAND`,name=$(COMMAND),命令执行的返回值    
+            变量引用:${name},$name
+                单引号:强引用,其中的变量引用不会被替换为变量值,而保持原字符串
+                双引号:弱引用,其中的变量引用会被替换为变量值
+            显示已定义的所有变量:
+                set
+            销毁变量:
+                unset name
+        环境变量:生效范围为当前shell进程及其子进程
+            变量声明\赋值:
+                export name=VALUE
+                declare -x name=VALUE
+            变量引用:同本地变量
+            显示所有环境变量:
+                export
+                env
+                printenv
+            销毁变量:同本地变量
+        局部变量:生效范围为当前shell进程中某代码片段(通常指函数)
+        位置变量:用于让脚本在脚本代码中调用通过命令行传递给它的参数
+            $1,$2,...:对应调用第1,第2等参数
+
+            $0:命令本身
+
+            $*:传递个脚本的所有参数(当做一个字符串)    
+            $@:传递个脚本的所有参数(多个字符串)
+            $#:传递个脚本的参数的个数
+        特殊变量:$?
     ```
     ```
     ![抱歉,图片休息了](os-linux-shell/os-linux-shell-001.png)
     ![抱歉,图片休息了](os-linux-shell/os-linux-shell-001.png)
 
 
@@ -148,23 +148,23 @@ shell脚本编程笔记...
     +,-,*,/,%,++,--,
     +,-,*,/,%,++,--,
     ----------
     ----------
     实现算数运算:
     实现算数运算:
-    	1.let var=算数表达式
-    	2.var=$[算数表达式]
-    	3.var=$((算数表达式))	
-    	4.var=$(expr arg1 arg2 arg3 ...)
-    		乘法符号有些场景中需要转义
-		
-    	bash中有内建的随机数生成器:$RANDOM
-    	    eg: ~]# echo $[$RANDOM%60+1]
+        1.let var=算数表达式
+        2.var=$[算数表达式]
+        3.var=$((算数表达式))    
+        4.var=$(expr arg1 arg2 arg3 ...)
+            乘法符号有些场景中需要转义
+        
+        bash中有内建的随机数生成器:$RANDOM
+            eg: ~]# echo $[$RANDOM%60+1]
     ```
     ```
     ![抱歉,图片休息了](os-linux-shell/os-linux-shell-002.png)
     ![抱歉,图片休息了](os-linux-shell/os-linux-shell-002.png)
 - `赋值运算符`
 - `赋值运算符`
     ```
     ```
     增强型赋值:+=,-=,*=,/=,%=,
     增强型赋值:+=,-=,*=,/=,%=,
-    	let varOPERvalue
-    		eg:let count+=1
-    	自增:let var+=1 <==> let var++
-    	自减:let var-=1 <==> let var--
+        let varOPERvalue
+            eg:let count+=1
+        自增:let var+=1 <==> let var++
+        自减:let var-=1 <==> let var--
     ```
     ```
 
 
 ### 条件测试
 ### 条件测试
@@ -183,71 +183,71 @@ shell脚本编程笔记...
 - `bash的测试类型`
 - `bash的测试类型`
     ```
     ```
     数值测试:
     数值测试:
-    	-gt:是否大于
-    	-ge:是否大于等于
-    	-eq:是否等于
-    	-ne:是否不等于
-    	-lt:是否小于
-    	-le:是否小于等于
+        -gt:是否大于
+        -ge:是否大于等于
+        -eq:是否等于
+        -ne:是否不等于
+        -lt:是否小于
+        -le:是否小于等于
     字符串测试:
     字符串测试:
-    	==:是否等于
-    		也可以用=					
-    	>:是否大于
-    	<:是否小于
-    	!=:是否不等于
-    	=~:左侧字符串是否能够被右侧的PATTERN所匹配
-    		此表达式一般用于[[  ]]中
-    	-z "STRING":测试字符串是否为空,空则为真,不空则为假
-    	-n "STRING":测试字符串是否为不空,不空则为真,空则为假
-	
-    	注:用于字符串比较时用到的操作数都应该使用引号
+        ==:是否等于
+            也可以用=                    
+        >:是否大于
+        <:是否小于
+        !=:是否不等于
+        =~:左侧字符串是否能够被右侧的PATTERN所匹配
+            此表达式一般用于[[  ]]中
+        -z "STRING":测试字符串是否为空,空则为真,不空则为假
+        -n "STRING":测试字符串是否为不空,不空则为真,空则为假
+    
+        注:用于字符串比较时用到的操作数都应该使用引号
     文件测试:
     文件测试:
-    	存在性测试:
-    		-a FILE
-    		-e FILE:文件存在性测试,存在为真,否则为假
-    	存在性及类别测试:
-    		-b FILE:是否存在且为块设备文件
-    		-c FILE:是否存在且为字符设备文件
-    		-d FILE:是否存在且为目录文件
-    		-f FILE:是否存在且为普通文件
-    		-h/L FILE:是否存在且为符号链接文件
-    		-p FILE:是否存在且为命名管道文件
-    		-S FILE:是否存在且为套接字文件
-    	文件权限测试:
-    		-r FILE:是否存在且可读
-    		-w FILE:是否存在且可写
-    		-x FILE:是否存在且可执行
-    	文件特殊权限测试:
-    		-g FILE:是否存在且拥有sgid权限
-    		-u FILE:是否存在且拥有suid权限
-    		-k FILE:是否存在且拥有sticky权限
-    	文件大小测试:
-    		-s FILE:是否存在且非空
-    	文件是否打开测试:
-    		-t fd:fd表示文件描述符是否已经打开且与某终端相关	
-
-    		-N FILE:文件自上一次被读取之后是否被修改过
-    		-O FILE:当前有效用户是否为文件属主
-    		-G FILE:当前有效用户是否为文件属组
-    	双目测试:
-    		FILE1 -ef FILE2:FILE1与FILE2是否指向同一个设备上的相同inode
-    		FILE1 -nt FILE2:FILE1是否新于FILE2
-    		    常用于备份中
-    		FILE1 -ot FILE2:FILE1是否旧于FILE2
-    		    常用于备份中
+        存在性测试:
+            -a FILE
+            -e FILE:文件存在性测试,存在为真,否则为假
+        存在性及类别测试:
+            -b FILE:是否存在且为块设备文件
+            -c FILE:是否存在且为字符设备文件
+            -d FILE:是否存在且为目录文件
+            -f FILE:是否存在且为普通文件
+            -h/L FILE:是否存在且为符号链接文件
+            -p FILE:是否存在且为命名管道文件
+            -S FILE:是否存在且为套接字文件
+        文件权限测试:
+            -r FILE:是否存在且可读
+            -w FILE:是否存在且可写
+            -x FILE:是否存在且可执行
+        文件特殊权限测试:
+            -g FILE:是否存在且拥有sgid权限
+            -u FILE:是否存在且拥有suid权限
+            -k FILE:是否存在且拥有sticky权限
+        文件大小测试:
+            -s FILE:是否存在且非空
+        文件是否打开测试:
+            -t fd:fd表示文件描述符是否已经打开且与某终端相关    
+
+            -N FILE:文件自上一次被读取之后是否被修改过
+            -O FILE:当前有效用户是否为文件属主
+            -G FILE:当前有效用户是否为文件属组
+        双目测试:
+            FILE1 -ef FILE2:FILE1与FILE2是否指向同一个设备上的相同inode
+            FILE1 -nt FILE2:FILE1是否新于FILE2
+                常用于备份中
+            FILE1 -ot FILE2:FILE1是否旧于FILE2
+                常用于备份中
     ```
     ```
     ![抱歉,图片休息了](os-linux-shell/os-linux-shell-003.png)
     ![抱歉,图片休息了](os-linux-shell/os-linux-shell-003.png)
 - `组合测试条件`
 - `组合测试条件`
     ```
     ```
     逻辑运算:
     逻辑运算:
-    	第一种方式:
-    		COMMAND1 && COMMAND2
-    		COMMAND1 || COMMAND2
-    		! COMMAND
-    	第二种方式:必须使用测试命令进行
-    		EXPRESSION1 -a EXPRESSION2
-    		EXPRESSION1 -o EXPRESSION2
-    		! EXPRESSION
+        第一种方式:
+            COMMAND1 && COMMAND2
+            COMMAND1 || COMMAND2
+            ! COMMAND
+        第二种方式:必须使用测试命令进行
+            EXPRESSION1 -a EXPRESSION2
+            EXPRESSION1 -o EXPRESSION2
+            ! EXPRESSION
     ```
     ```
     ![抱歉,图片休息了](os-linux-shell/os-linux-shell-004.png)
     ![抱歉,图片休息了](os-linux-shell/os-linux-shell-004.png)
     
     

+ 15 - 15
source/_posts/os-linux-sysadmin-first.md

@@ -425,7 +425,7 @@ Linux启动过程:
             (2) 格式化:
             (2) 格式化:
                 mke2fs -t ext4 -b 2048 -L 'TEST' /dev/DEVICE
                 mke2fs -t ext4 -b 2048 -L 'TEST' /dev/DEVICE
             (3) 编辑/etc/fstab文件
             (3) 编辑/etc/fstab文件
-                LABEL='TEST' 	/testing 	ext4 	defaults,acl 	0 0
+                LABEL='TEST'     /testing     ext4     defaults,acl     0 0
             (4) 测试
             (4) 测试
                 mount
                 mount
         2、写一个脚本,完成如下功能:
         2、写一个脚本,完成如下功能:
@@ -654,9 +654,9 @@ LVM: Logical Volume Manager(逻辑卷管理器), Version: 2
     一个LV用来当/,一个LV用来当SWAP,一个LV用来当USR,一个LV用来当VAR等等
     一个LV用来当/,一个LV用来当SWAP,一个LV用来当USR,一个LV用来当VAR等等
 LV的访问路径:
 LV的访问路径:
     1. /dev/mapper/VG_NAME-LV_NAME
     1. /dev/mapper/VG_NAME-LV_NAME
-		/dev/mapper/vol0-root
-	2. /dev/VG_NAME/LV_NAME
-		/dev/vol0/root
+        /dev/mapper/vol0-root
+    2. /dev/VG_NAME/LV_NAME
+        /dev/vol0/root
     此两者均为符号链接,指向的文件为/dev/dm-#
     此两者均为符号链接,指向的文件为/dev/dm-#
 ```
 ```
 ```
 ```
@@ -746,15 +746,15 @@ ABI:Application Binary Interface
 ```
 ```
 ```
 ```
 linux应用程序的组成部分:二进制程序、库文件、配置文件、帮助文件
 linux应用程序的组成部分:二进制程序、库文件、配置文件、帮助文件
-	二进制程序:可执行文件,一个应用程序可有多个二进制程序
-		/bin,/sbin,/usr/bin,/usr/sbin,/usr/local/bin,/usr/local/sbin
-	库文件:可执行文件,不能独立执行,只能被能独立运行的程序调用时执行,一般有2类,一类是多个程序之间的共享库,一类是自己能够被其他人做二次开发时调用的接口
-		/lib,/lib64,/usr/lib,/usr/lib64,/usr/local/lib,/usr/local/lib64
-	配置文件:可被查看其内容的文件
-		/etc,/etc/DIRECTORY,/usr/local/etc
-	帮助文件:可被查看其内容的文件
-		/usr/share/man,/usr/share/doc,/usr/local/share/man,/usr/local/share/doc
-	--------------------	
+    二进制程序:可执行文件,一个应用程序可有多个二进制程序
+        /bin,/sbin,/usr/bin,/usr/sbin,/usr/local/bin,/usr/local/sbin
+    库文件:可执行文件,不能独立执行,只能被能独立运行的程序调用时执行,一般有2类,一类是多个程序之间的共享库,一类是自己能够被其他人做二次开发时调用的接口
+        /lib,/lib64,/usr/lib,/usr/lib64,/usr/local/lib,/usr/local/lib64
+    配置文件:可被查看其内容的文件
+        /etc,/etc/DIRECTORY,/usr/local/etc
+    帮助文件:可被查看其内容的文件
+        /usr/share/man,/usr/share/doc,/usr/local/share/man,/usr/local/share/doc
+    --------------------    
     查看二进制程序所依赖的库文件:
     查看二进制程序所依赖的库文件:
         # ldd /PATH/TO/BINARY_FILE
         # ldd /PATH/TO/BINARY_FILE
     管理及查看本机装载的库文件:
     管理及查看本机装载的库文件:
@@ -981,7 +981,7 @@ linux应用程序的组成部分:二进制程序、库文件、配置文件、
         yum仓库的协议:repodata目录所在父目录就是一个可用仓库
         yum仓库的协议:repodata目录所在父目录就是一个可用仓库
             ftp     ftp://server/path/to/repository
             ftp     ftp://server/path/to/repository
             http    http://server/path/to/repository
             http    http://server/path/to/repository
-            nfs 	nfs://server/nfs_path
+            nfs     nfs://server/nfs_path
             file    file:///path/to/repository
             file    file:///path/to/repository
         使用Centos镜像光盘搭建本地yum源(仓库):
         使用Centos镜像光盘搭建本地yum源(仓库):
             (1) 将默认Yum源备份(可选)
             (1) 将默认Yum源备份(可选)
@@ -1090,7 +1090,7 @@ linux应用程序的组成部分:二进制程序、库文件、配置文件、
     10、查看指定包所依赖的capabilities:
     10、查看指定包所依赖的capabilities:
         yum deplist package1 [package2] [...]
         yum deplist package1 [package2] [...]
     11、查看yum事务历史(yum每一次的安装/更新操作都会开启yum事务)
     11、查看yum事务历史(yum每一次的安装/更新操作都会开启yum事务)
-        yum	history [info|list|packages-list|packages-info|summary|addon-info|redo|undo|rollback|new|sync|stats]
+        yum    history [info|list|packages-list|packages-info|summary|addon-info|redo|undo|rollback|new|sync|stats]
     12、包组管理的相关命令
     12、包组管理的相关命令
         yum grouplist
         yum grouplist
         yum groupinfo "GROUP NAME"
         yum groupinfo "GROUP NAME"

+ 22 - 22
source/_posts/os-mac-terminal.md

@@ -55,32 +55,32 @@ tags:
 
 
 | 快捷键 | 介绍 |
 | 快捷键 | 介绍 |
 |:---------|:---------|
 |:---------|:---------|
-| Command + Option + 数字 |	切换窗口 |
-| Command + 方向键 |	切换标签页 |
+| Command + Option + 数字 |    切换窗口 |
+| Command + 方向键 |    切换标签页 |
 | Command + 数字 | 切换到指定数字标签页 |
 | Command + 数字 | 切换到指定数字标签页 |
-| Command + d |	竖直分屏 | 
-| Command + shift + d |	水平分屏 |
-| Command + n |	新建窗口 | 
-| Command + t |	新建标签页 | 
-| Command + w |	关闭当前标签或是窗口 | 
-| Command + shift + h |	查看剪贴板历史 |
-| Command + ; |	根据(输入的前缀)历史记录自动补全 |
-| Command + enter |	进入全屏模式,再按一次返回 |
-| Command + 鼠标单击	| 可以打开文件/文件夹/链接 |
-| Command + r |	清屏 | 
+| Command + d |    竖直分屏 | 
+| Command + shift + d |    水平分屏 |
+| Command + n |    新建窗口 | 
+| Command + t |    新建标签页 | 
+| Command + w |    关闭当前标签或是窗口 | 
+| Command + shift + h |    查看剪贴板历史 |
+| Command + ; |    根据(输入的前缀)历史记录自动补全 |
+| Command + enter |    进入全屏模式,再按一次返回 |
+| Command + 鼠标单击    | 可以打开文件/文件夹/链接 |
+| Command + r |    清屏 | 
 
 
 | 快捷键 | 介绍 |
 | 快捷键 | 介绍 |
 |:---------|:---------|
 |:---------|:---------|
-| Control + k |	删除光标位置(包括)到行尾之间的内容 |
-| Control + w |	删除光标位置(不包括)到行首之前的内容 |
-| Control + d |	删除光标所在位置的字符 |
-| Control + h |	删除光标所在位置前一个字符 |
-| Control + y |	召回最近用命令删除的文字 |
-| Control + r |	搜索历史命令 |
-| Control + c |	结束当前状态,另起一行 |
-| Control + u |	清空当前行,无论光标在什么位置 |
-| Control + a |	移动到行首 | 
-| Control + e |	移动到行尾 |
+| Control + k |    删除光标位置(包括)到行尾之间的内容 |
+| Control + w |    删除光标位置(不包括)到行首之前的内容 |
+| Control + d |    删除光标所在位置的字符 |
+| Control + h |    删除光标所在位置前一个字符 |
+| Control + y |    召回最近用命令删除的文字 |
+| Control + r |    搜索历史命令 |
+| Control + c |    结束当前状态,另起一行 |
+| Control + u |    清空当前行,无论光标在什么位置 |
+| Control + a |    移动到行首 | 
+| Control + e |    移动到行尾 |
 
 
 ### **简介Zsh**
 ### **简介Zsh**
 
 

+ 5 - 5
source/_posts/st-eclipse.md

@@ -51,7 +51,7 @@ tags:
     ```
     ```
     1. Maven工程右键->'Team'->'Remote'-'Push...'>,填写相关信息提交
     1. Maven工程右键->'Team'->'Remote'-'Push...'>,填写相关信息提交
         填写URI(远程库地址),用户名,密码后next
         填写URI(远程库地址),用户名,密码后next
-        点击'Add All Branches Spec'来检测所有分支,next	
+        点击'Add All Branches Spec'来检测所有分支,next    
         填写相关日志信息,finish
         填写相关日志信息,finish
     2. 弹出'Push Results...'窗口代表推送成功
     2. 弹出'Push Results...'窗口代表推送成功
     ```
     ```
@@ -66,7 +66,7 @@ tags:
     ```
     ```
 - 解决冲突
 - 解决冲突
     ```
     ```
-    1. 提交各自的修改至本地库后,然后试着推送到远程库,可能会出现冲突	
+    1. 提交各自的修改至本地库后,然后试着推送到远程库,可能会出现冲突    
         Maven工程右键->'Team'->'Push Branch master'
         Maven工程右键->'Team'->'Push Branch master'
     2. 当弹出窗口提示冲突时,可执行拉取操作,解决冲突后Ctrl+#提交到本地库,最后推送到远程库
     2. 当弹出窗口提示冲突时,可执行拉取操作,解决冲突后Ctrl+#提交到本地库,最后推送到远程库
         Maven工程右键->'Team'->'Pull'
         Maven工程右键->'Team'->'Pull'
@@ -74,7 +74,7 @@ tags:
     ```
     ```
 - GitFlow 分支实战(以 hot_fix 为例)
 - GitFlow 分支实战(以 hot_fix 为例)
     ```
     ```
-    1. 创建分支		
+    1. 创建分支        
         工程右键'Team'->'Switch To'->'New Branch...',输入分支名hot_fix,依次提交到本地库和远程库(Push Branch hot_fix)
         工程右键'Team'->'Switch To'->'New Branch...',输入分支名hot_fix,依次提交到本地库和远程库(Push Branch hot_fix)
     2. 切换分支审查代码
     2. 切换分支审查代码
         Maven工程右键->'Team'->'Pull'
         Maven工程右键->'Team'->'Pull'
@@ -85,8 +85,8 @@ tags:
         工程右键'Team'->'Switch To'->'master
         工程右键'Team'->'Switch To'->'master
     5. 合并分支
     5. 合并分支
         工程右键'Team'->'Merge...',选择'Local'->'hot_fix',合并成功后把master推送到远程库
         工程右键'Team'->'Merge...',选择'Local'->'hot_fix',合并成功后把master推送到远程库
-	```
-	
+    ```
+    
 ## Maven的使用
 ## Maven的使用
 
 
 ![抱歉,图片休息了](st-eclipse/st-eclipse-001.png) 
 ![抱歉,图片休息了](st-eclipse/st-eclipse-001.png) 

+ 31 - 31
source/_posts/st-git-basic.md

@@ -217,32 +217,32 @@ tags:
     - 同时并行推进多个功能开发,提高开发效率
     - 同时并行推进多个功能开发,提高开发效率
     - 各个分支在开发过程中,如果某一个分支开发失败,不会对其他分支有任何影响,删除失败的分支重新开始即可
     - 各个分支在开发过程中,如果某一个分支开发失败,不会对其他分支有任何影响,删除失败的分支重新开始即可
 - ### 分支操作
 - ### 分支操作
-	- 查看所有分支:`$ git branch [-v]`
-	    >当前分支前面会标一个*号
+    - 查看所有分支:`$ git branch [-v]`
+        >当前分支前面会标一个*号
 查看所有分支(包括远程分支):$ git branch -avv
 查看所有分支(包括远程分支):$ git branch -avv
-	- 创建+切换分支:`$ git checkout -b name [branch-name]`
-		>基于提交/指定分支(默认当前分支)创建新分支:$ git branch new-branch-name [branch-name | commit id] 
+    - 创建+切换分支:`$ git checkout -b name [branch-name]`
+        >基于提交/指定分支(默认当前分支)创建新分支:$ git branch new-branch-name [branch-name | commit id] 
 基于远程分支(必须已存在)创建与之对应的新分支:$ git branch new-branch-name <origin/branch-name>
 基于远程分支(必须已存在)创建与之对应的新分支:$ git branch new-branch-name <origin/branch-name>
 切换分支:$ git checkout branch-name
 切换分支:$ git checkout branch-name
-	- 合并指定分支到当前分支:`$ git merge [-m "..."] <name>`
+    - 合并指定分支到当前分支:`$ git merge [-m "..."] <name>`
         >Fast-forward,代表此次合并是"快进模式",即把当前分支(master)指向指定分支(dev)的当前提交,所以合并速度非常快,这种模式下,删除分支后,会丢失掉分支信息
         >Fast-forward,代表此次合并是"快进模式",即把当前分支(master)指向指定分支(dev)的当前提交,所以合并速度非常快,这种模式下,删除分支后,会丢失掉分支信息
 后面加上--no-ff 参数,表示禁用"Fast-forward",用普通模式合并,会创建一个新的 commit,合并后的历史能看到分支信息,能看出来曾经做过合并,而 fast forward 合并就看不出来曾经做过合并
 后面加上--no-ff 参数,表示禁用"Fast-forward",用普通模式合并,会创建一个新的 commit,合并后的历史能看到分支信息,能看出来曾经做过合并,而 fast forward 合并就看不出来曾经做过合并
-	- 删除分支:`$ git branch -d <name>`
-		>$ git branch -D <name>   强行删除一个没有被合并过的分支(分支中只有空文件时可用普通方式-d删除分支)
+    - 删除分支:`$ git branch -d <name>`
+        >$ git branch -D <name>   强行删除一个没有被合并过的分支(分支中只有空文件时可用普通方式-d删除分支)
 - ### 解决冲突
 - ### 解决冲突
-	- 当 Git 无法自动合并分支时,须手动编辑文件解决冲突,然后再添加到暂存区再提交,合并完成
+    - 当 Git 无法自动合并分支时,须手动编辑文件解决冲突,然后再添加到暂存区再提交,合并完成
     ```
     ```
     CONFLICT (content): Merge conflict in readme.txt
     CONFLICT (content): Merge conflict in readme.txt
     Automatic merge failed; fix conflicts and then commit the result.
     Automatic merge failed; fix conflicts and then commit the result.
     ```
     ```
 - ### 分支管理策略
 - ### 分支管理策略
-	- 首先,master 主分支应该非常稳定,仅用来发布新版本,平时不能在上面干活;
-	- 每个人干活都在 dev 分支上,dev 分支是不稳定的,例如 1.0 版本发布时,再把 dev 分支合并到 master 上,在 master 主分支发布 1.0 版本;
-	- 每个人都有自己的分支,时不时的往 dev 分支上合并就行。
-	- **本地新建的分支如果不推送到远程,对其他人就是不可见的。**	
+    - 首先,master 主分支应该非常稳定,仅用来发布新版本,平时不能在上面干活;
+    - 每个人干活都在 dev 分支上,dev 分支是不稳定的,例如 1.0 版本发布时,再把 dev 分支合并到 master 上,在 master 主分支发布 1.0 版本;
+    - 每个人都有自己的分支,时不时的往 dev 分支上合并就行。
+    - **本地新建的分支如果不推送到远程,对其他人就是不可见的。**    
 - Rebase
 - Rebase
-	- $ git rebase 操作可以把本地未 push 的分叉提交历史整理成直线
-	- Rebase 的目的是使得我们在查看历史提交的变化时更容易,因为分叉的提交需要三方对比。
+    - $ git rebase 操作可以把本地未 push 的分叉提交历史整理成直线
+    - Rebase 的目的是使得我们在查看历史提交的变化时更容易,因为分叉的提交需要三方对比。
 
 
 ## 标签管理
 ## 标签管理
 
 
@@ -292,29 +292,29 @@ tags:
     
     
 - 通过命令配置
 - 通过命令配置
     - 加上--global 是针对当前用户起作用的,如果不加,那只针对当前的仓库起作用
     - 加上--global 是针对当前用户起作用的,如果不加,那只针对当前的仓库起作用
-    ```								
-    $ git config --global alias.st status				 					
-    $ git config --global alias.co checkout									
-    $ git config --global alias.ci commit									
-    $ git config --global alias.br branch									
-    $ git config --global alias.unstage 'reset HEAD'									
-    $ git config --global alias.last 'log -1'      //显示最近一次的提交									
-    $ git config --global alias.lg "log --color --graph --pretty=format:'%Cred%h%Creset -%C(yellow)%d%Creset %s %Cgreen(%cr) %C(bold blue)<%an>%Creset' --abbrev-commit"	
+    ```                                
+    $ git config --global alias.st status                                     
+    $ git config --global alias.co checkout                                    
+    $ git config --global alias.ci commit                                    
+    $ git config --global alias.br branch                                    
+    $ git config --global alias.unstage 'reset HEAD'                                    
+    $ git config --global alias.last 'log -1'      //显示最近一次的提交                                    
+    $ git config --global alias.lg "log --color --graph --pretty=format:'%Cred%h%Creset -%C(yellow)%d%Creset %s %Cgreen(%cr) %C(bold blue)<%an>%Creset' --abbrev-commit"    
     ```
     ```
 - 通过文件配置
 - 通过文件配置
     - 每个仓库的 Git 配置文件都放在 .git/config 文件中,而当前用户的 Git 配置文件放在用户主目录下的一个隐藏文件 .gitconfig 中,别名就在[alias]后面,要删除别名,直接把对应的行删掉即可
     - 每个仓库的 Git 配置文件都放在 .git/config 文件中,而当前用户的 Git 配置文件放在用户主目录下的一个隐藏文件 .gitconfig 中,别名就在[alias]后面,要删除别名,直接把对应的行删掉即可
     ```
     ```
     [alias]
     [alias]
-    	co = checkout
-    	ci = commit
-    	br = branch
-    	st = status
-    	unstage = reset HEAD
-    	last = log -1
-    	lg = log --color --graph --pretty=format:'%Cred%h%Creset -%C(yellow)%d%Creset %s %Cgreen(%cr) %C(bold blue)<%an>%Creset' --abbrev-commit
+        co = checkout
+        ci = commit
+        br = branch
+        st = status
+        unstage = reset HEAD
+        last = log -1
+        lg = log --color --graph --pretty=format:'%Cred%h%Creset -%C(yellow)%d%Creset %s %Cgreen(%cr) %C(bold blue)<%an>%Creset' --abbrev-commit
     [user]
     [user]
-    	name = tujidelv
-    	email = tujide.lv@foxmail.com
+        name = tujidelv
+        email = tujide.lv@foxmail.com
     ```
     ```
 - windows 版 git bash 设置其他命令别名
 - windows 版 git bash 设置其他命令别名
     - **Git 安装目录,修改 etc/profile.d/aliases.sh 文件。**
     - **Git 安装目录,修改 etc/profile.d/aliases.sh 文件。**

+ 63 - 63
source/_posts/st-git-remote.md

@@ -36,7 +36,7 @@ tags:
     - Watch:关注该项目,作者有更新的时候,会在你的 Github 主页有通知消息。
     - Watch:关注该项目,作者有更新的时候,会在你的 Github 主页有通知消息。
     - Star:收藏该项目,在你的头像上有一个 “Your stars” 链接,可以看到你的收藏列表,以方便下次进来。
     - Star:收藏该项目,在你的头像上有一个 “Your stars” 链接,可以看到你的收藏列表,以方便下次进来。
     - Fork:复制一份项目到自己的 Github 空间上,你可以自己开发自己的这个地址项目,然后 Pull Request 给项目原主人。
     - Fork:复制一份项目到自己的 Github 空间上,你可以自己开发自己的这个地址项目,然后 Pull Request 给项目原主人。
-```    
+```
 ---
 ---
 - 本地创建 SSH Key
 - 本地创建 SSH Key
 
 
@@ -118,7 +118,7 @@ tags:
     1. 在自己远程仓库项目主页中,点击'Pull requests'/'New pull request',此时'bask fork'选择官方作者,'head fork'选择自己,点击'Create pull request',填好标题和说明(可选)确认。
     1. 在自己远程仓库项目主页中,点击'Pull requests'/'New pull request',此时'bask fork'选择官方作者,'head fork'选择自己,点击'Create pull request',填好标题和说明(可选)确认。
     2. 此时官方作者可在项目主页中,点击'Pull requests',能看到自己刚刚发送的请求,进去后可在里面跟请求者对话,点击'Files changed'审核代码,没问题的话可点击'Merge pull request'合并代码。
     2. 此时官方作者可在项目主页中,点击'Pull requests',能看到自己刚刚发送的请求,进去后可在里面跟请求者对话,点击'Files changed'审核代码,没问题的话可点击'Merge pull request'合并代码。
     3. 在自己远程仓库项目主页中,如果官方作者有回复内容,可在刚发送的请送中看到官方的回复内容,也可回复。
     3. 在自己远程仓库项目主页中,如果官方作者有回复内容,可在刚发送的请送中看到官方的回复内容,也可回复。
-5.如果官方作者有提交新的代码,可在自己项目主页中,点击'Pull requests'/'New pull request',此时'bask fork'选择自己,'head fork'选择官方作者,点击'Create pull request',填好标题和说明(可选)确认。								
+5.如果官方作者有提交新的代码,可在自己项目主页中,点击'Pull requests'/'New pull request',此时'bask fork'选择自己,'head fork'选择官方作者,点击'Create pull request',填好标题和说明(可选)确认。                                
     - 没问题的点击'Merge pull request'合并代码以获取官方作者的最新代码。
     - 没问题的点击'Merge pull request'合并代码以获取官方作者的最新代码。
 ```
 ```
       
       
@@ -132,9 +132,9 @@ tags:
 
 
 ### `GitLab`
 ### `GitLab`
 
 
-- 官网地址			
-	- 首页:<https://about.gitlab.com/> 
-	- 安装说明:<https://about.gitlab.com/installation/>
+- 官网地址            
+    - 首页:<https://about.gitlab.com/> 
+    - 安装说明:<https://about.gitlab.com/installation/>
 - 安装命令摘录
 - 安装命令摘录
     ```shell
     ```shell
     sudo yum install -y curl policycoreutils-python openssh-server cronie
     sudo yum install -y curl policycoreutils-python openssh-server cronie
@@ -145,49 +145,49 @@ tags:
     curl https://packages.gitlab.com/install/repositories/gitlab/gitlab-ee/script.rpm.sh | sudo bash
     curl https://packages.gitlab.com/install/repositories/gitlab/gitlab-ee/script.rpm.sh | sudo bash
     sudo EXTERNAL_URL="http://gitlab.example.com" yum -y install gitlab-ee
     sudo EXTERNAL_URL="http://gitlab.example.com" yum -y install gitlab-ee
     ```
     ```
-	 - 实际问题:yum 安装 gitlab-ee(或ce)时,需要联网下载几百 M 的安装文件,非常耗时,所以应提前把所需 RPM 包下载并安装好。
-	 下载地址为:<https://packages.gitlab.com/gitlab/gitlab-ce/packages/el/7/gitlab-ce-10.8.2-ce.0.el7.x86_64.rpm>,调整后的安装过程:			
-	```shell
-	sudo rpm -ivh /opt/gitlab-ce-10.8.2-ce.0.el7.x86_64.rpm		
-	sudo yum install -y curl policycoreutils-python openssh-server cronie  		
-	sudo lokkit -s http -s ssh		
-	sudo yum install postfix		
-	sudo service postfix start		
-	sudo chkconfig postfix on		
-	curl https://packages.gitlab.com/install/repositories/gitlab/gitlab-ce/script.rpm.sh | sudo bash		
-	sudo EXTERNAL_URL="http://gitlab.example.com" yum -y install gitlab-ce
-	```
-	- 当前步骤完成后重启		
+     - 实际问题:yum 安装 gitlab-ee(或ce)时,需要联网下载几百 M 的安装文件,非常耗时,所以应提前把所需 RPM 包下载并安装好。
+     下载地址为:<https://packages.gitlab.com/gitlab/gitlab-ce/packages/el/7/gitlab-ce-10.8.2-ce.0.el7.x86_64.rpm>,调整后的安装过程:            
+    ```shell
+    sudo rpm -ivh /opt/gitlab-ce-10.8.2-ce.0.el7.x86_64.rpm        
+    sudo yum install -y curl policycoreutils-python openssh-server cronie          
+    sudo lokkit -s http -s ssh        
+    sudo yum install postfix        
+    sudo service postfix start        
+    sudo chkconfig postfix on        
+    curl https://packages.gitlab.com/install/repositories/gitlab/gitlab-ce/script.rpm.sh | sudo bash        
+    sudo EXTERNAL_URL="http://gitlab.example.com" yum -y install gitlab-ce
+    ```
+    - 当前步骤完成后重启        
 - GitLab 服务操作
 - GitLab 服务操作
-	- 初始化配置 gitlab
-	    ```shell
-	    $ gitlab-ctl reconfigure
-		```
-	- 启动/停止 gitlab 服务
-        ```shell	
+    - 初始化配置 gitlab
+        ```shell
+        $ gitlab-ctl reconfigure
+        ```
+    - 启动/停止 gitlab 服务
+        ```shell    
         $ gitlab-ctl start/stop
         $ gitlab-ctl start/stop
         ```
         ```
 - 浏览器访问
 - 浏览器访问
     - 访问 Linux 服务器 IP 地址即可,如果想访问 EXTERNAL_URL 指定的域名还需要配置域名服务器或本地 hosts 文件。
     - 访问 Linux 服务器 IP 地址即可,如果想访问 EXTERNAL_URL 指定的域名还需要配置域名服务器或本地 hosts 文件。
-		- 应该会需要停止防火墙服务
+        - 应该会需要停止防火墙服务
         ```shell
         ```shell
         $ service firewalld stop
         $ service firewalld stop
         ```
         ```
-	- 初次登录时需要为 gitlab 的 root 用户设置密码。
+    - 初次登录时需要为 gitlab 的 root 用户设置密码。
 
 
 ### `原生搭建`
 ### `原生搭建`
 
 
-1. 安装 Git												
+1. 安装 Git                                                
     ```
     ```
     $ apt-get install git  (Debian系列系统)
     $ apt-get install git  (Debian系列系统)
     $ yum install -y git   (RetHat系列系统)
     $ yum install -y git   (RetHat系列系统)
-	```
+    ```
 2. 创建Git用户,用来管理 Git服务,并为 Git 用户设置密码
 2. 创建Git用户,用来管理 Git服务,并为 Git 用户设置密码
     ```shell
     ```shell
     $ id git
     $ id git
     $ useradd git
     $ useradd git
     $ echo 'git' | passwd --stdin git &> /dev/null
     $ echo 'git' | passwd --stdin git &> /dev/null
-	```
+    ```
 3. 创建 Git 仓库
 3. 创建 Git 仓库
     1. 先选定一个目录作为 Git 仓库,假定是/www/wwwroot/hexo.lvzhiqiang.top/hexo-blog.git/,在/www/wwwroot/hexo.lvzhiqiang.top/目录下输入如下命令,Git 
     1. 先选定一个目录作为 Git 仓库,假定是/www/wwwroot/hexo.lvzhiqiang.top/hexo-blog.git/,在/www/wwwroot/hexo.lvzhiqiang.top/目录下输入如下命令,Git 
     就会创建一个裸仓库,裸仓库没有工作区。
     就会创建一个裸仓库,裸仓库没有工作区。
@@ -211,7 +211,7 @@ tags:
         $ chmod +x post-receive
         $ chmod +x post-receive
         ```
         ```
 5. Git 打开 RSA 认证
 5. Git 打开 RSA 认证
-	1. 进入/etc/ssh目录,编辑 sshd_config,打开以下三个配置的注释,然后重启 sshd 服务
+    1. 进入/etc/ssh目录,编辑 sshd_config,打开以下三个配置的注释,然后重启 sshd 服务
         ```shell
         ```shell
         $ vim sshd_config
         $ vim sshd_config
             RSAAuthentication yes
             RSAAuthentication yes
@@ -221,53 +221,53 @@ tags:
             或者$ /etc/rc.d/init.d/sshd restart
             或者$ /etc/rc.d/init.d/sshd restart
         ```
         ```
         Tips:由 AuthorizedKeysFile 得知公钥的存放路径是.ssh/authorized_keys,实际上是 $Home/.ssh/authorized_keys,由于管理 Git 服务的用户是git,所以实际存放公钥的路径是/home/git/.ssh/authorized_keys
         Tips:由 AuthorizedKeysFile 得知公钥的存放路径是.ssh/authorized_keys,实际上是 $Home/.ssh/authorized_keys,由于管理 Git 服务的用户是git,所以实际存放公钥的路径是/home/git/.ssh/authorized_keys
-	2. 在/home/git/下创建目录 .ssh,然后把 .ssh 文件夹的 owner 修改为 git
-	    ```shell
-	    $ mkdir .ssh
-	    $ chown -R git:git .ssh
-	    ```
+    2. 在/home/git/下创建目录 .ssh,然后把 .ssh 文件夹的 owner 修改为 git
+        ```shell
+        $ mkdir .ssh
+        $ chown -R git:git .ssh
+        ```
 6. 创建证书登录(添加客户端公钥到服务器)
 6. 创建证书登录(添加客户端公钥到服务器)
-	1. 收集所有需要登录的用户的公钥,就是他们自己的 id_rsa.pub 文件,把所有公钥导入到/home/git/.ssh/authorized_keys 文件里,一行一个
-	    ```shell
-	    $ ssh git@server 'cat >> .ssh/authorized_keys' < ~/.ssh/id_rsa.pub
-	    ``` 
-	    或者
-	    ```shell
-	    $ ssh-copy-id -i ~/.ssh/id_rsa.pub git@服务器IP -p 端口号(默认22时可不用此参数)
-	    ```
-	    Tips:需要输入服务器端 git 用户的密码
-	2. 查看服务器端 .ssh 下是否存在 authorized_keys 文件
+    1. 收集所有需要登录的用户的公钥,就是他们自己的 id_rsa.pub 文件,把所有公钥导入到/home/git/.ssh/authorized_keys 文件里,一行一个
+        ```shell
+        $ ssh git@server 'cat >> .ssh/authorized_keys' < ~/.ssh/id_rsa.pub
+        ``` 
+        或者
+        ```shell
+        $ ssh-copy-id -i ~/.ssh/id_rsa.pub git@服务器IP -p 端口号(默认22时可不用此参数)
+        ```
+        Tips:需要输入服务器端 git 用户的密码
+    2. 查看服务器端 .ssh 下是否存在 authorized_keys 文件
         ```shell
         ```shell
         $ ll git/.ssh/
         $ ll git/.ssh/
-	    ```
-	3. 修改 .ssh 目录的权限为 700(rwx------),修改 .ssh/authorized_keys 文件的权限为600(rw-------)
-	    ```shell
-	    $ chmod 700 .ssh
-	    $ chmod 600 authorized_keys
-		```
+        ```
+    3. 修改 .ssh 目录的权限为 700(rwx------),修改 .ssh/authorized_keys 文件的权限为600(rw-------)
+        ```shell
+        $ chmod 700 .ssh
+        $ chmod 600 authorized_keys
+        ```
     4. 测试能否登录,此时的 ssh 登录 git 用户不需要密码!否则就有错,可尝试重启`sshd`服务
     4. 测试能否登录,此时的 ssh 登录 git 用户不需要密码!否则就有错,可尝试重启`sshd`服务
         ```shell
         ```shell
         $ ssh git@server_ip -p 端口号(默认22时可不用此参数)
         $ ssh git@server_ip -p 端口号(默认22时可不用此参数)
         ```
         ```
 7. 禁止 git 用户 ssh 登录服务器
 7. 禁止 git 用户 ssh 登录服务器
-	- 出于安全考虑,第二步创建的 git 用户不允许登录 shell,这可以通过编辑/etc/passwd 文件完成。将 bash 修改为 git-shell,找到类似下面的一行:
-	    ```
-	    git:x:1001:1001:,,,:/home/git:/bin/bash改为:git:x:1001:1001:,,,:/home/git:/usr/bin/git-shell
-	    ```
-	- 这样,git 用户可以正常通过 ssh 使用 git,但无法登录 shell,因为我们为 git 用户指定的 git-shell 每次一登录就自动退出。
+    - 出于安全考虑,第二步创建的 git 用户不允许登录 shell,这可以通过编辑/etc/passwd 文件完成。将 bash 修改为 git-shell,找到类似下面的一行:
+        ```
+        git:x:1001:1001:,,,:/home/git:/bin/bash改为:git:x:1001:1001:,,,:/home/git:/usr/bin/git-shell
+        ```
+    - 这样,git 用户可以正常通过 ssh 使用 git,但无法登录 shell,因为我们为 git 用户指定的 git-shell 每次一登录就自动退出。
 8. 客户端克隆远程仓库
 8. 客户端克隆远程仓库
     ```shell
     ```shell
     $ git clone git@server:/www/wwwroot/hexo.lvzhiqiang.top/hexo-blog.git
     $ git clone git@server:/www/wwwroot/hexo.lvzhiqiang.top/hexo-blog.git
     ```
     ```
-	Tips:如果 SSH 用的不是默认的 22 端口,则需要使用以下的命令(假设 SSH 端口号是 7700)
-	```shell
-	$ git clone ssh://git@server:7700/www/wwwroot/hexo.lvzhiqiang.top/hexo-blog.git
-	```
+    Tips:如果 SSH 用的不是默认的 22 端口,则需要使用以下的命令(假设 SSH 端口号是 7700)
+    ```shell
+    $ git clone ssh://git@server:7700/www/wwwroot/hexo.lvzhiqiang.top/hexo-blog.git
+    ```
 9. 管理公钥
 9. 管理公钥
-	- 如果团队很小,把每个人的公钥收集起来放到服务器的/home/git/.ssh/authorized_keys文件里就是可行的。如果团队有几百号人,就没法这么玩了,这时,可以用 Gitosis 来管理公钥。
+    - 如果团队很小,把每个人的公钥收集起来放到服务器的/home/git/.ssh/authorized_keys文件里就是可行的。如果团队有几百号人,就没法这么玩了,这时,可以用 Gitosis 来管理公钥。
 10. 管理权限
 10. 管理权限
-	- 因为 Git 是为 Linux 源代码托管而开发的,所以 Git 也继承了开源社区的精神,不支持权限控制。
-	- 不过,因为 Git 支持钩子(hook),所以,可以在服务器端编写一系列脚本来控制提交等操作,达到权限控制的目的,Gitolite 就是这个工具。
+    - 因为 Git 是为 Linux 源代码托管而开发的,所以 Git 也继承了开源社区的精神,不支持权限控制。
+    - 不过,因为 Git 支持钩子(hook),所以,可以在服务器端编写一系列脚本来控制提交等操作,达到权限控制的目的,Gitolite 就是这个工具。
 
 
 ### `GitBucket`
 ### `GitBucket`
 
 

+ 18 - 18
source/_posts/st-git-workflow.md

@@ -40,34 +40,34 @@ tags:
 ![抱歉,图片休息了](st-git-workflow/st-git-workflow-002.png "GitFlow 工作流")
 ![抱歉,图片休息了](st-git-workflow/st-git-workflow-002.png "GitFlow 工作流")
 - 简介
 - 简介
     - GitFlow 工作流通过为功能开发、发布准备和维护设立了独立的分支,让发布迭代过程更流畅,严格的分支模型也为大型项目提供了一些非常必要的结构。
     - GitFlow 工作流通过为功能开发、发布准备和维护设立了独立的分支,让发布迭代过程更流畅,严格的分支模型也为大型项目提供了一些非常必要的结构。
-- 评价			
+- 评价            
     - GitFlow 的优点是清晰可控,缺点是相对复杂,需要同时维护两个长期分支,大多数工具都将 master 当作默认分支,可是开发是在 develop 分支进行的,这导致经常要切换分支,非常烦人,
     - GitFlow 的优点是清晰可控,缺点是相对复杂,需要同时维护两个长期分支,大多数工具都将 master 当作默认分支,可是开发是在 develop 分支进行的,这导致经常要切换分支,非常烦人,
-    更大问题在于,这个模式是基于"版本发布"的,目标是一段时间以后产出一个新版本,但是,很多网站项目是"持续发布",代码一有变动,就部署一次,这时,master 分支和 develop 分支的差别不大,没必要维护两个长期分支。	
+    更大问题在于,这个模式是基于"版本发布"的,目标是一段时间以后产出一个新版本,但是,很多网站项目是"持续发布",代码一有变动,就部署一次,这时,master 分支和 develop 分支的差别不大,没必要维护两个长期分支。    
 - 分支种类
 - 分支种类
     - 长期分支(核心分支)
     - 长期分支(核心分支)
         - **主干分支 master**
         - **主干分支 master**
-	        - 主要负责管理正在运行的生产环境代码,永远保持与正在运行的生产环境完全一致,这条分支不能进行代码修改,只能用来合并其他分支。
-		- **开发分支 develop**
-			- 主要负责管理正在开发过程中的代码,一般情况下应该是最新的代码,这条分支也不能进行代码修改,只能用来合并其他辅助分支。
-	- 临时分支(辅助分支)
-		- **补丁分支(bug 修理)hotfix**
-			- 主要负责管理生产环境下出现的紧急修复的代码,基于 master 分支上创建,修复测试无误后合并到 Master 和 Develop 分支。视情况可以删除该分支。
-		- **预发分支(准生产)release**
-			- 较大的版本上线前,会从 Develop 分支中分出准生产分支,进行最后阶段的集成测试,测试确定新功能没有问题,合并回 Master 和 Develop 分支,生产环境运行一段阶段较稳定后可以视情况删除。
-		- **功能分支 feature**
-			- 为了不影响较短周期的开发工作,一般把中长期开发模块,会从 Develop 分支中独立出来,开发完成后合并到 Develop 分支,视情况可以删除该分支。
+            - 主要负责管理正在运行的生产环境代码,永远保持与正在运行的生产环境完全一致,这条分支不能进行代码修改,只能用来合并其他分支。
+        - **开发分支 develop**
+            - 主要负责管理正在开发过程中的代码,一般情况下应该是最新的代码,这条分支也不能进行代码修改,只能用来合并其他辅助分支。
+    - 临时分支(辅助分支)
+        - **补丁分支(bug 修理)hotfix**
+            - 主要负责管理生产环境下出现的紧急修复的代码,基于 master 分支上创建,修复测试无误后合并到 Master 和 Develop 分支。视情况可以删除该分支。
+        - **预发分支(准生产)release**
+            - 较大的版本上线前,会从 Develop 分支中分出准生产分支,进行最后阶段的集成测试,测试确定新功能没有问题,合并回 Master 和 Develop 分支,生产环境运行一段阶段较稳定后可以视情况删除。
+        - **功能分支 feature**
+            - 为了不影响较短周期的开发工作,一般把中长期开发模块,会从 Develop 分支中独立出来,开发完成后合并到 Develop 分支,视情况可以删除该分支。
 
 
 ### Github flow 工作流
 ### Github flow 工作流
 
 
 - 简介
 - 简介
     - 是 GitFlow 的简化版,它只有一个长期分支,就是 master,因此用起来非常简单,专门配合"持续发布",它是 Github.com 使用的工作流程。
     - 是 GitFlow 的简化版,它只有一个长期分支,就是 master,因此用起来非常简单,专门配合"持续发布",它是 Github.com 使用的工作流程。
 - 评价
 - 评价
-	- Github flow 的最大优点就是简单,对于"持续发布"的产品,可以说是最合适的流程,但对于一些要指定时间才能发布的项目来说,容易导致最后线上版本落后于 master 分支,需要另外新建一个 production 分支跟踪线上版本。
-- 流程	
-	1. 根据需求,从 master 拉出新分支,不区分功能分支或补丁分支。
-	2. 新分支开发完成后,或者需要讨论的时候,就向 master 发起一个pull request(简称 PR)。
-	3. Pull Request 既是一个通知,让别人注意到你的请求,又是一种对话机制,大家一起评审和讨论你的代码,对话过程中,你还可以不断提交代码。
-	4. 你的Pull Request 被接受,合并进 master,重新部署后,原来你拉出来的那个分支就被删除。(先部署再合并也可)
+    - Github flow 的最大优点就是简单,对于"持续发布"的产品,可以说是最合适的流程,但对于一些要指定时间才能发布的项目来说,容易导致最后线上版本落后于 master 分支,需要另外新建一个 production 分支跟踪线上版本。
+- 流程    
+    1. 根据需求,从 master 拉出新分支,不区分功能分支或补丁分支。
+    2. 新分支开发完成后,或者需要讨论的时候,就向 master 发起一个pull request(简称 PR)。
+    3. Pull Request 既是一个通知,让别人注意到你的请求,又是一种对话机制,大家一起评审和讨论你的代码,对话过程中,你还可以不断提交代码。
+    4. 你的Pull Request 被接受,合并进 master,重新部署后,原来你拉出来的那个分支就被删除。(先部署再合并也可)
 
 
 ### AoneFlow 工作流
 ### AoneFlow 工作流
 
 

+ 20 - 20
source/_posts/st-idea-advanced.md

@@ -32,8 +32,8 @@ tags:
     ```
     ```
 - `筛选并修改快捷键`
 - `筛选并修改快捷键`
     ```
     ```
-    1.在搜索框输入快捷键描述内容							
-    2.点击搜索框旁边图标并按下需要修改的快捷键							
+    1.在搜索框输入快捷键描述内容                            
+    2.点击搜索框旁边图标并按下需要修改的快捷键                            
     -------------------------
     -------------------------
     Add Keyboard Shortcut:用来添加新的纯键盘快捷键组合
     Add Keyboard Shortcut:用来添加新的纯键盘快捷键组合
     Add Mouse Shortcut:用来添加新的键盘+鼠标快捷键组合,比如设置Ctrl+左键单击这类快捷组合。其中在弹出的添加面板中Click Pad是用来监听当前鼠标是左键单击还是右键单击
     Add Mouse Shortcut:用来添加新的键盘+鼠标快捷键组合,比如设置Ctrl+左键单击这类快捷组合。其中在弹出的添加面板中Click Pad是用来监听当前鼠标是左键单击还是右键单击
@@ -177,12 +177,12 @@ tags:
 - IDEA 对版本控制的支持是以插件化的方式实现的,旗舰版默认支持目前主流的版本控制软件:CVS、SVN、Git、Mercurial、Perforce、TFS。
 - IDEA 对版本控制的支持是以插件化的方式实现的,旗舰版默认支持目前主流的版本控制软件:CVS、SVN、Git、Mercurial、Perforce、TFS。
 又因为目前太多人使用 Github 进行协同或是项目版本管理,同时自带了 Github 插件,方便 Checkout 和管理你的 Github 项目,
 又因为目前太多人使用 Github 进行协同或是项目版本管理,同时自带了 Github 插件,方便 Checkout 和管理你的 Github 项目,
     ```
     ```
-    Background:后台进程处理			
-    Confirmation:弹窗提示,是否提交,merge			
-    Issue Navigation:问题导航			
-    GitHub:github配置			
-    CVS:cvs配置			
-    Subversion:svn配置			
+    Background:后台进程处理            
+    Confirmation:弹窗提示,是否提交,merge            
+    Issue Navigation:问题导航            
+    GitHub:github配置            
+    CVS:cvs配置            
+    Subversion:svn配置            
     TFS:工作流引擎管理
     TFS:工作流引擎管理
     ```
     ```
 - 常用设置
 - 常用设置
@@ -220,7 +220,7 @@ tags:
 
 
 ### `Debug 技巧`
 ### `Debug 技巧`
 
 
-- Debug 设置				
+- Debug 设置                
     ```
     ```
     Settings->Build,Execution,Deployment->Debugger,Transport选中Shared memory
     Settings->Build,Execution,Deployment->Debugger,Transport选中Shared memory
     表示设置Debug连接方式,默认是Socket。Shared memory是Windows特有的一个属性,一般在Windows系统下建议使用此设置,相对于Socket会快
     表示设置Debug连接方式,默认是Socket。Shared memory是Windows特有的一个属性,一般在Windows系统下建议使用此设置,相对于Socket会快
@@ -274,7 +274,7 @@ tags:
             psf => 可生成public static final
             psf => 可生成public static final
             psfi => 可生成public static final int
             psfi => 可生成public static final int
             psfs => 可生成public static final String
             psfs => 可生成public static final String
-        ```			
+        ```            
 - 修改现有模板
 - 修改现有模板
     - 如果对于现有的模板,感觉不习惯、不适应的,可以修改。
     - 如果对于现有的模板,感觉不习惯、不适应的,可以修改。
     - 举例
     - 举例
@@ -282,21 +282,21 @@ tags:
         修改Abbreviation:
         修改Abbreviation:
             Settings->Editor->Live Templates,定位到other->psvm,将Abbreviation值改为main
             Settings->Editor->Live Templates,定位到other->psvm,将Abbreviation值改为main
         修改Template text:
         修改Template text:
-            Settings->Editor->Live Templates,定位到plain->psfi,将Template text值改为public static final int $VAR1$ = $VAR2$;$END$	
-        ```		
+            Settings->Editor->Live Templates,定位到plain->psfi,将Template text值改为public static final int $VAR1$ = $VAR2$;$END$    
+        ```        
 - 自定义模板
 - 自定义模板
     - IDEA 提供了很多现成的 Templates,但你也可以根据自己的需要创建新的 Template。
     - IDEA 提供了很多现成的 Templates,但你也可以根据自己的需要创建新的 Template。
     ```
     ```
-    1. 定义一个模板组	
+    1. 定义一个模板组    
         Settings->Editor->Live Templates,点击"+"号,选择Template Group...,
         Settings->Editor->Live Templates,点击"+"号,选择Template Group...,
-    2. 选中自定义的模板组,点击"+"来定义模板	
-        Settings->Editor->Live Templates,点击"+"号,选择Live Template,	
+    2. 选中自定义的模板组,点击"+"来定义模板    
+        Settings->Editor->Live Templates,点击"+"号,选择Live Template,    
     3. 填写模板的内容
     3. 填写模板的内容
         Abbreviation:模板的缩略名
         Abbreviation:模板的缩略名
         Description:模板的描述
         Description:模板的描述
         Template text:模板的代码片段
         Template text:模板的代码片段
         应用范围:比如点击Define,选择java
         应用范围:比如点击Define,选择java
-        Edit variables:	https://www.jetbrains.com/help/idea/template-variables.html
+        Edit variables:    https://www.jetbrains.com/help/idea/template-variables.html
     ```
     ```
 
 
 ### `数据库管理工具`
 ### `数据库管理工具`
@@ -319,14 +319,14 @@ tags:
 
 
 - 插件设置
 - 插件设置
     - IDEA 对插件进行了很好的分类:启用的插件是被勾选的,如果要禁用一个插件,去掉勾选即可
     - IDEA 对插件进行了很好的分类:启用的插件是被勾选的,如果要禁用一个插件,去掉勾选即可
-    	```
-    	All plugins:显示所有插件
+        ```
+        All plugins:显示所有插件
         Enabled:显示当前所有已经启用的插件
         Enabled:显示当前所有已经启用的插件
         Disabled:显示当前所有已经禁用的插件
         Disabled:显示当前所有已经禁用的插件
         Bundled:显示所有IDEA自带的插件
         Bundled:显示所有IDEA自带的插件
         Custom:显示所有我们自行安装的插件,如果你自己装了很多次插件的话,这个选项会用得比较多
         Custom:显示所有我们自行安装的插件,如果你自己装了很多次插件的话,这个选项会用得比较多
-    	```
-    - Install JetBrains plugin...:弹出IDEA公司自行开发的插件仓库列表,供下载安装	
+        ```
+    - Install JetBrains plugin...:弹出IDEA公司自行开发的插件仓库列表,供下载安装    
     - Browse repositories...:弹出插件仓库中所有插件列表供下载安装
     - Browse repositories...:弹出插件仓库中所有插件列表供下载安装
     - Install plugin from disk...:浏览本地的插件文件进行安装,而不是从服务器上下载并安装
     - Install plugin from disk...:浏览本地的插件文件进行安装,而不是从服务器上下载并安装
     
     

+ 36 - 36
source/_posts/st-idea-basic.md

@@ -36,14 +36,14 @@ tags:
         PyCharm:主要用于开发Python
         PyCharm:主要用于开发Python
         AppCode:主要用于开发Objective-C/Swift,xcode的替代者
         AppCode:主要用于开发Objective-C/Swift,xcode的替代者
         CLion:主要用于开发C/C++
         CLion:主要用于开发C/C++
-        WebStorm:主要用于开发JavaScript、HTML5、CSS3等前端技术	
+        WebStorm:主要用于开发JavaScript、HTML5、CSS3等前端技术    
         DataGrip:主要用于开发数据库和SQL
         DataGrip:主要用于开发数据库和SQL
         Rider:主要用于开发.NET
         Rider:主要用于开发.NET
         GoLand:主要用于开发Go(区块链等)
         GoLand:主要用于开发Go(区块链等)
         Android Studio:主要用于开发Android(Google基于IntelliJ IDEA社区版进行迭代所以也姑且算上)
         Android Studio:主要用于开发Android(Google基于IntelliJ IDEA社区版进行迭代所以也姑且算上)
         ```
         ```
 - `Intellij IDEA 介绍`
 - `Intellij IDEA 介绍`
-    - 官网:<https://www.jetbrains.com/idea/>					
+    - 官网:<https://www.jetbrains.com/idea/>                    
     - 新特性列表:<https://www.jetbrains.com/idea/whatsnew>
     - 新特性列表:<https://www.jetbrains.com/idea/whatsnew>
     - 详细使用文档:<https://www.jetbrains.com/help/idea/meet-intellij-idea.html>
     - 详细使用文档:<https://www.jetbrains.com/help/idea/meet-intellij-idea.html>
     - IntelliJ IDEA 在 2015 年 06 月官网主页是这样介绍自己的:
     - IntelliJ IDEA 在 2015 年 06 月官网主页是这样介绍自己的:
@@ -78,7 +78,7 @@ tags:
 
 
 - `IDEA 主要优势(相较于 Eclipse 而言)`
 - `IDEA 主要优势(相较于 Eclipse 而言)`
     - 强大的整合能力,例如 Git、Maven、Spring 等工具和框架。
     - 强大的整合能力,例如 Git、Maven、Spring 等工具和框架。
-    - 提示功能的快速、便捷	
+    - 提示功能的快速、便捷    
     - 提示功能的范围广。
     - 提示功能的范围广。
     - 好用的快捷键和代码模板。
     - 好用的快捷键和代码模板。
     - 精准搜索。
     - 精准搜索。
@@ -177,7 +177,7 @@ tags:
                     - On Update action:当我们按Ctrl + F10进行容器更新的时候,可以根据我们配置的这个事件内容进行容器更新。其中我选择的Update classes and resources事件是最常用的,表示我们在按Ctrl + F10进行容器更新的时候,我们触发更新编译的类和资源文件到容器中。在Debug模式下,这个也就是所谓的HotSwap。只是这种热部署没有JRebel插件那样好用
                     - On Update action:当我们按Ctrl + F10进行容器更新的时候,可以根据我们配置的这个事件内容进行容器更新。其中我选择的Update classes and resources事件是最常用的,表示我们在按Ctrl + F10进行容器更新的时候,我们触发更新编译的类和资源文件到容器中。在Debug模式下,这个也就是所谓的HotSwap。只是这种热部署没有JRebel插件那样好用
                     - On frame deactivation:当我们切换IDEA到浏览器的时候进行指定事件更新,这个一般是因为Web开发的时候,我们需要经常在IDEA和各个浏览器之间来回切换测试,所以才有了这种需求。IDEA是为了帮我们在做这种无聊切换的时候做一些指定事情。当然了,如果切换过于频繁,这个功能还是很耗资源的,所以我设置的是Do nothing表示切换的时候什么都不做
                     - On frame deactivation:当我们切换IDEA到浏览器的时候进行指定事件更新,这个一般是因为Web开发的时候,我们需要经常在IDEA和各个浏览器之间来回切换测试,所以才有了这种需求。IDEA是为了帮我们在做这种无聊切换的时候做一些指定事情。当然了,如果切换过于频繁,这个功能还是很耗资源的,所以我设置的是Do nothing表示切换的时候什么都不做
             3.Deployment
             3.Deployment
-            	- 添加要运行的项目及设置访问名称
+                - 添加要运行的项目及设置访问名称
             d.Logs
             d.Logs
             e.Code coverage
             e.Code coverage
             f.Startup/Connection
             f.Startup/Connection
@@ -196,11 +196,11 @@ tags:
         - <https://www.jetbrains.com/help/idea/migrating-from-eclipse-to-intellij-idea.html>
         - <https://www.jetbrains.com/help/idea/migrating-from-eclipse-to-intellij-idea.html>
         ```
         ```
         IDEA 官网说明:
         IDEA 官网说明:
-        	An Eclipse workspace is similar to a project in IntelliJ IDEA
-        	An Eclipse project maps to a module in IntelliJ IDEA
+            An Eclipse workspace is similar to a project in IntelliJ IDEA
+            An Eclipse project maps to a module in IntelliJ IDEA
         翻译:
         翻译:
-        	Eclipse中workspace相当于IDEA中的Project
-        	Eclipse中Project相当于IDEA中的Module
+            Eclipse中workspace相当于IDEA中的Project
+            Eclipse中Project相当于IDEA中的Module
         ```
         ```
     - 从 Eclipse 转过来的人总是下意识地要在同一个窗口管理 n 个项目,这在 IDEA 是无法做到的。IDEA 提供的解决方案是打开多个项目实例,即打开多个项目窗口(一个 Project 打开一个 Window 窗口)。
     - 从 Eclipse 转过来的人总是下意识地要在同一个窗口管理 n 个项目,这在 IDEA 是无法做到的。IDEA 提供的解决方案是打开多个项目实例,即打开多个项目窗口(一个 Project 打开一个 Window 窗口)。
     - 在 IDEA 中 Project 是最顶级的级别,次级别是 Module。即一个 Project 是由一个或多个 Module 组成。
     - 在 IDEA 中 Project 是最顶级的级别,次级别是 Module。即一个 Project 是由一个或多个 Module 组成。
@@ -215,31 +215,31 @@ tags:
         ```
         ```
         Project name:项目名称
         Project name:项目名称
         Project SDK(Software Development Kit):JDK配置
         Project SDK(Software Development Kit):JDK配置
-        	点击"Edit"按钮,进入SDK的统一管理处,加号可以添加新SDK;减号可以删除光标所选的SDK
-        	在开发Java项目过程中,由于IDEA支持管理多个JDK,所以你完全不用担心你系统上不同项目需要不同JDK
+            点击"Edit"按钮,进入SDK的统一管理处,加号可以添加新SDK;减号可以删除光标所选的SDK
+            在开发Java项目过程中,由于IDEA支持管理多个JDK,所以你完全不用担心你系统上不同项目需要不同JDK
         Project language level:编译级别
         Project language level:编译级别
-        	限定项目编译检查时最低要求的JDK特性
-        	我们使用JDK8的时候,我们只能向下兼容JDK8及其以下的特性,所以只能选择8及其以下的language level。当项目使用的是JDK8,但是代码却最多使用了JDK7的特性的时候我们可以选择7 - Diamonds,ARM,multi-catch etc
+            限定项目编译检查时最低要求的JDK特性
+            我们使用JDK8的时候,我们只能向下兼容JDK8及其以下的特性,所以只能选择8及其以下的language level。当项目使用的是JDK8,但是代码却最多使用了JDK7的特性的时候我们可以选择7 - Diamonds,ARM,multi-catch etc
         Project compiler output:class输出路径配置
         Project compiler output:class输出路径配置
         ```
         ```
     - Modules
     - Modules
         ```
         ```
         Sources:可以针对Module选择其他language level,默认选择的是Project language level
         Sources:可以针对Module选择其他language level,默认选择的是Project language level
-        	Sources:一般用于标注类似src这种可编译目录。有时候不单单项目的src目录要可编译,还有其他一些特别的目录也要作为可编译的目录,就需要对该目录进行此标注。只有Sources这种可编译目录才可以新建Java类和包
-        	Tests:一般用于标注可编译的单元测试目录。在规范的maven项目结构中,顶级目录是src,maven的src我们是不会设置为Sources的,而是在其子目录main目录下的java目录,我们会设置为Sources。而单元测试的目录是src-test-java,这里的java目录我们就会设置为Tests,表示该目录是作为可编译的单元测试目录。从这一点也可以看出IDEA对maven项目的支持是比较彻底的
-        	Resources:一般用于标注资源文件目录。在maven项目下,资源目录是单独划分出来的,其目录为:src-main-resources,这里的resources目录我们就会设置为Resources,表示该目录是作为资源目录。资源目录下的文件是会被编译到输出目录下的
-        	Test Resources:一般用于标注单元测试的资源文件目录。在maven项目下,单元测试的资源目录是单独划分出来的,其目录为:src-test-resources,这里的resources目录我们就会设置为Test Resources,表示该目录是作为单元测试的资源目录。资源目录下的文件是会被编译到输出目录下的								
-        	Excluded:一般用于标注排除目录。被排除的目录不会被IDEA创建索引,相当于被IDEA废弃,该目录下的代码文件是不具备代码检查和智能提示等常规代码功能
-        									
-        	注:被标注的目录会在右侧有一个总的概括。值得一提的是classes虽然是Excluded目录,但是由于它的特殊性且不可编辑,所以不显示在这里
-        	注:如果要去掉目录的标注含义,可以点击打叉按钮进行删除
+            Sources:一般用于标注类似src这种可编译目录。有时候不单单项目的src目录要可编译,还有其他一些特别的目录也要作为可编译的目录,就需要对该目录进行此标注。只有Sources这种可编译目录才可以新建Java类和包
+            Tests:一般用于标注可编译的单元测试目录。在规范的maven项目结构中,顶级目录是src,maven的src我们是不会设置为Sources的,而是在其子目录main目录下的java目录,我们会设置为Sources。而单元测试的目录是src-test-java,这里的java目录我们就会设置为Tests,表示该目录是作为可编译的单元测试目录。从这一点也可以看出IDEA对maven项目的支持是比较彻底的
+            Resources:一般用于标注资源文件目录。在maven项目下,资源目录是单独划分出来的,其目录为:src-main-resources,这里的resources目录我们就会设置为Resources,表示该目录是作为资源目录。资源目录下的文件是会被编译到输出目录下的
+            Test Resources:一般用于标注单元测试的资源文件目录。在maven项目下,单元测试的资源目录是单独划分出来的,其目录为:src-test-resources,这里的resources目录我们就会设置为Test Resources,表示该目录是作为单元测试的资源目录。资源目录下的文件是会被编译到输出目录下的                                
+            Excluded:一般用于标注排除目录。被排除的目录不会被IDEA创建索引,相当于被IDEA废弃,该目录下的代码文件是不具备代码检查和智能提示等常规代码功能
+                                            
+            注:被标注的目录会在右侧有一个总的概括。值得一提的是classes虽然是Excluded目录,但是由于它的特殊性且不可编辑,所以不显示在这里
+            注:如果要去掉目录的标注含义,可以点击打叉按钮进行删除
         Dependencies:可以针对Module选择其他SDK,默认选择的是Project SDK,以及管理项目的所有依赖包
         Dependencies:可以针对Module选择其他SDK,默认选择的是Project SDK,以及管理项目的所有依赖包
-        	依赖包支持五种操作:
-        		加号,表示可以引入新依赖包
-        		减号,表示可以去除对应的依赖包
-        		向上箭头,表示依赖包可以向上移动位置。依赖包越上面的表示在项目加载的时候越是优先,所以对于同一个依赖包,不同版本,依赖顺序不同,结果也可能会是大不相同的
-        		向下箭头,表示依赖包可以向下移动位置,原因同上
-        		笔,表示可以编辑依赖包的名称和路径
+            依赖包支持五种操作:
+                加号,表示可以引入新依赖包
+                减号,表示可以去除对应的依赖包
+                向上箭头,表示依赖包可以向上移动位置。依赖包越上面的表示在项目加载的时候越是优先,所以对于同一个依赖包,不同版本,依赖顺序不同,结果也可能会是大不相同的
+                向下箭头,表示依赖包可以向下移动位置,原因同上
+                笔,表示可以编辑依赖包的名称和路径
         ```
         ```
     - Libraries
     - Libraries
         ```
         ```
@@ -268,16 +268,16 @@ tags:
     - **设置内存使用情况显示**
     - **设置内存使用情况显示**
         ```
         ```
         Appearance,在'Window Options'中勾选'Show memory indicator'
         Appearance,在'Window Options'中勾选'Show memory indicator'
-            点击内存值后可以进行部分内存的回收	
+            点击内存值后可以进行部分内存的回收    
         ```
         ```
     - **设置启动 IDEA 时可以选择最近打开的某个项目**
     - **设置启动 IDEA 时可以选择最近打开的某个项目**
         ```
         ```
-        System Settings,在'Shartup/Shutdown'中选择'Confirm application exit'	
+        System Settings,在'Shartup/Shutdown'中选择'Confirm application exit'    
             启动IDEA时,默认会打开上次使用的项目,如果只有一个项目的话,该功能还是很好用的,如果有多个项目的话,建议可以选择最近打开的某个项目
             启动IDEA时,默认会打开上次使用的项目,如果只有一个项目的话,该功能还是很好用的,如果有多个项目的话,建议可以选择最近打开的某个项目
         ```
         ```
     - **设置另一个项目窗口的打开方式**
     - **设置另一个项目窗口的打开方式**
         ```
         ```
-        System Settings,在'Project Opening'中选择	
+        System Settings,在'Project Opening'中选择    
             Open project in new window 每次都使用新窗口打开
             Open project in new window 每次都使用新窗口打开
             Open project in the same window 每次都替换当前已打开的项目,这样桌面上就只有一个项目窗口
             Open project in the same window 每次都替换当前已打开的项目,这样桌面上就只有一个项目窗口
             Confirm window to open project in 每次都弹出提示窗口,让我们选择用新窗口打开或是替换当前项目窗口
             Confirm window to open project in 每次都弹出提示窗口,让我们选择用新窗口打开或是替换当前项目窗口
@@ -361,7 +361,7 @@ tags:
         导入主题(方式2):
         导入主题(方式2):
             Editor->Color Scheme->齿轮图标->Import Scheme->Intellij IDEA color scheme or settings
             Editor->Color Scheme->齿轮图标->Import Scheme->Intellij IDEA color scheme or settings
         ```
         ```
-	- 修改代码中注释的字体颜色
+    - 修改代码中注释的字体颜色
         ```
         ```
         Color Scheme->Language Defaults,选择需要修改的地方进行设置
         Color Scheme->Language Defaults,选择需要修改的地方进行设置
             Doc Comment:修改文档注释的字体颜色
             Doc Comment:修改文档注释的字体颜色
@@ -392,9 +392,9 @@ tags:
         编译方式介绍(3种):
         编译方式介绍(3种):
             Recompile:对选定的目标(Java类文件),进行强制性编译,不管目标是否是被修改过。
             Recompile:对选定的目标(Java类文件),进行强制性编译,不管目标是否是被修改过。
             Rebuild:对选定的目标(Project),进行强制性编译,不管目标是否是被修改过,由于Rebuild的目标是整个Project,所以Rebuild每次花的时间会比较长。
             Rebuild:对选定的目标(Project),进行强制性编译,不管目标是否是被修改过,由于Rebuild的目标是整个Project,所以Rebuild每次花的时间会比较长。
-            Build(使用最多的编译操作):对选定的目标(Project或Module)进行编译,但只编译有修改过的文件,没有修改过的文件不会编译,这样平时开发大型项目才不会浪费时间在编译过程中。	
+            Build(使用最多的编译操作):对选定的目标(Project或Module)进行编译,但只编译有修改过的文件,没有修改过的文件不会编译,这样平时开发大型项目才不会浪费时间在编译过程中。    
         ------------------------------------------
         ------------------------------------------
-        编译器的设置和选择:			
+        编译器的设置和选择:            
             Compiler下:设置编译heap大小,默认是700,建议使用64位的用户,在内存足够的情况下,建议改为1500 或以上。如果你在编译的时候出错,报:OutOfMemoryError,一般也是要来改这个地方
             Compiler下:设置编译heap大小,默认是700,建议使用64位的用户,在内存足够的情况下,建议改为1500 或以上。如果你在编译的时候出错,报:OutOfMemoryError,一般也是要来改这个地方
             Compiler->Excludes下:开发过程中,某一个包目录的文件编译无法通过,但是我们又不急着改,那我们就可以考虑把该包加入到排除编译列表中,则项目就可以运行起来
             Compiler->Excludes下:开发过程中,某一个包目录的文件编译无法通过,但是我们又不急着改,那我们就可以考虑把该包加入到排除编译列表中,则项目就可以运行起来
             Compiler->Java Compiler下:IDEA支持常见的几种编译器:Javac、Eclipse、Ajc等。默认是Javac,也推荐使用Javac
             Compiler->Java Compiler下:IDEA支持常见的几种编译器:Javac、Eclipse、Ajc等。默认是Javac,也推荐使用Javac
@@ -427,8 +427,8 @@ tags:
     - **设置默认终端**
     - **设置默认终端**
         ```
         ```
         Terminal,在'Application settings'中将'Shell path'设置成Git Bash
         Terminal,在'Application settings'中将'Shell path'设置成Git Bash
-        可能会出现乱码,可修改Git的安装目录下的etc目录下bash.bashrc文件,在最后一行添加:			
-            # 解决IDEA下的terminal中文Unicode编码问题		
+        可能会出现乱码,可修改Git的安装目录下的etc目录下bash.bashrc文件,在最后一行添加:            
+            # 解决IDEA下的terminal中文Unicode编码问题        
             export LANG="zh_CN.UTF-8"
             export LANG="zh_CN.UTF-8"
             export LC_ALL="zh_CN.UTF-8"
             export LC_ALL="zh_CN.UTF-8"
         ```
         ```
@@ -444,8 +444,8 @@ tags:
     ```
     ```
     File->Invalidate Caches/Restart,一般建议点击'Invalidate and Restart',这样会比较干净,本质也就是去删除C盘下的system目录下的对应的文件而已
     File->Invalidate Caches/Restart,一般建议点击'Invalidate and Restart',这样会比较干净,本质也就是去删除C盘下的system目录下的对应的文件而已
     -------------------------------------                          
     -------------------------------------                          
-    清除索引和缓存会使得IDEA的Local History丢失,如果你项目没有加入到版本控制,而你又需要你项目文件的历史更改记录,清除前最好备份下LocalHistory目录。										
-    如果你遇到了因为断电、蓝屏引起的强制关机等导致了索引、缓存坏了以至于项目打不开,那也建议你可以直接删除system目录,一般这样都可以很好地解决你的问题。										
+    清除索引和缓存会使得IDEA的Local History丢失,如果你项目没有加入到版本控制,而你又需要你项目文件的历史更改记录,清除前最好备份下LocalHistory目录。                                        
+    如果你遇到了因为断电、蓝屏引起的强制关机等导致了索引、缓存坏了以至于项目打不开,那也建议你可以直接删除system目录,一般这样都可以很好地解决你的问题。                                        
     -------------------------------------    
     -------------------------------------    
     IDEA首次加载项目的时候,都会创建索引,而创建索引的时间跟项目的文件多少成正比;IDEA的缓存和索引主要是用来加快文件查询,从而加快各种查找、代码提示等操作的速度
     IDEA首次加载项目的时候,都会创建索引,而创建索引的时间跟项目的文件多少成正比;IDEA的缓存和索引主要是用来加快文件查询,从而加快各种查找、代码提示等操作的速度
     ```
     ```

+ 23 - 23
source/_posts/st-maven.md

@@ -164,21 +164,21 @@ pom.xml —— maven项目核心配置文件
     ```
     ```
     ```xml
     ```xml
     <build>
     <build>
-    	<plugins>
-    		<plugin><!--将源码打包的功能-->
+        <plugins>
+            <plugin><!--将源码打包的功能-->
                 <groupId>org.apache.maven.plugins</groupId>
                 <groupId>org.apache.maven.plugins</groupId>
-    			<artifactId>maven-source-plugin</artifactId>
-          		<version>2.2.1</version>
-          		<executions><!--设置插件的的执行位置 -->
+                <artifactId>maven-source-plugin</artifactId>
+                  <version>2.2.1</version>
+                  <executions><!--设置插件的的执行位置 -->
                     <execution><!--具体的的执行位置 -->
                     <execution><!--具体的的执行位置 -->
-    					<goals>
-    						<goal>jar-no-fork</goal>
+                        <goals>
+                            <goal>jar-no-fork</goal>
                         </goals>
                         </goals>
                         <phase>verify</phase>
                         <phase>verify</phase>
-    				</execution>
+                    </execution>
                  </executions>
                  </executions>
-      		</plugin>
-    	</plugins>
+              </plugin>
+        </plugins>
     </build>
     </build>
     ```
     ```
 - 继承
 - 继承
@@ -200,7 +200,7 @@ pom.xml —— maven项目核心配置文件
     ```
     ```
     ```
     ```
     父工程统一管理子工程依赖版本
     父工程统一管理子工程依赖版本
-        <dependencyManagement>	
+        <dependencyManagement>    
             <dependencies>
             <dependencies>
                 //添加公共依赖包
                 //添加公共依赖包
             </dependencies>
             </dependencies>
@@ -252,7 +252,7 @@ pom.xml —— maven项目核心配置文件
     ```
     ```
     1.下载nexus.war包,然后拷贝到tomcat下的webapps目录中
     1.下载nexus.war包,然后拷贝到tomcat下的webapps目录中
     2.启动tomcat,并访问http://localhost:8080/nexus/
     2.启动tomcat,并访问http://localhost:8080/nexus/
-    3.点击右上角“log in”	,输入username:admin 和Password:admin123登录
+    3.点击右上角“log in”    ,输入username:admin 和Password:admin123登录
     4.点击Views/Repositories 中的Repositories
     4.点击Views/Repositories 中的Repositories
         Nexus内置仓库说明:
         Nexus内置仓库说明:
             (1)Central:该仓库代理Maven中央仓库,其策略为Release,因此只会下载和缓存中央仓库中的发布版本构件。
             (1)Central:该仓库代理Maven中央仓库,其策略为Release,因此只会下载和缓存中央仓库中的发布版本构件。
@@ -319,23 +319,23 @@ pom.xml —— maven项目核心配置文件
     2. (如项目不上传到私服可省略)部署构建到Nexus,包含Release和Snapshot, 一般在父工程中的根目录pom.xml中配置
     2. (如项目不上传到私服可省略)部署构建到Nexus,包含Release和Snapshot, 一般在父工程中的根目录pom.xml中配置
         ```
         ```
         <distributionManagement> 
         <distributionManagement> 
-        	<repository> 
-        	    <id>releases</id> 
-        	    <name>Internal Releases</name> 
-        	    <url>http://localhost:8000/nexus/content/repositories/releases/</url> 
-        	</repository> 
-        	<snapshotRepository> 
-        	    <id>snapshots</id> 
-        	    <name>Internal Snapshots</name> 
-        	    <url>http://localhost:8000/nexus/content/repositories/snapshots/</url> 
+            <repository> 
+                <id>releases</id> 
+                <name>Internal Releases</name> 
+                <url>http://localhost:8000/nexus/content/repositories/releases/</url> 
+            </repository> 
+            <snapshotRepository> 
+                <id>snapshots</id> 
+                <name>Internal Snapshots</name> 
+                <url>http://localhost:8000/nexus/content/repositories/snapshots/</url> 
             </snapshotRepository> 
             </snapshotRepository> 
         </distributionManagement>
         </distributionManagement>
         ```
         ```
     3. (如不进行步骤2可省略)Nexus的访问权限控制,在setting.xml(2个都要改)中配置如下
     3. (如不进行步骤2可省略)Nexus的访问权限控制,在setting.xml(2个都要改)中配置如下
         ```
         ```
         <servers>
         <servers>
-         	<server>
-         		<id>releases</id>
+             <server>
+                 <id>releases</id>
                 <username>admin</username>
                 <username>admin</username>
                 <password>admin123</password>
                 <password>admin123</password>
             </server>
             </server>

+ 1 - 1
source/_posts/st-monitoring-nezha.md

@@ -249,7 +249,7 @@ curl -L https://gitee.com/naibahq/nezha/raw/master/script/install.sh -o nezha.sh
    ```css
    ```css
    <style>
    <style>
    .container {
    .container {
-   	width: 1540px;
+       width: 1540px;
    }
    }
    </style>
    </style>
    ```
    ```

+ 1 - 1
source/_posts/st-register-account.md

@@ -104,7 +104,7 @@ ssh-keygen -t rsa -f E:\test\test -C root -b 2048   # -f指定密钥文件路径
 3. 下载SSL连接工具Finalshell
 3. 下载SSL连接工具Finalshell
 ```
 ```
 打开Finalshell——点击蓝色文件夹图标——点击第一个+号——点击SSH连接——名称可以自定义——把服务器IP粘贴到主机位置——方法选择公钥——用户名输入root;
 打开Finalshell——点击蓝色文件夹图标——点击第一个+号——点击SSH连接——名称可以自定义——把服务器IP粘贴到主机位置——方法选择公钥——用户名输入root;
-点击浏览——点击导入——名称可以自定义——点击浏览——选择前面创建好的私钥文件(没有后缀那一个)——点击确定——点击确定——点击确定——双击即可连接。
+点击浏览——点击导入——名称可以自定义——点击浏览——选择前面创建好的私钥文件(没有后缀那一个)——点击确定——点击确定——点击确定——双击即可连接。`
 ```
 ```
 
 
 ## 美区AppleID
 ## 美区AppleID

+ 1 - 1
source/_posts/st-trojan-basic.md

@@ -111,7 +111,7 @@ tags:
     /usr/local/etc/trojan/config.json
     /usr/local/etc/trojan/config.json
   # 申请证书报错
   # 申请证书报错
     netstat -ntlp
     netstat -ntlp
-    采用命令 sudo fuser -k 80/tcp 强制 杀掉进程
+    采用命令 sudo fuser -k 80/tcp 强制 杀掉进程
     nginx
     nginx
   # 连接被墙的外网就No route to host:
   # 连接被墙的外网就No route to host:
     切换trojan-go版本解决
     切换trojan-go版本解决

+ 76 - 13
source/_posts/st-vps-bt.md

@@ -2,10 +2,10 @@
 title: VPS离线BT下载利器
 title: VPS离线BT下载利器
 date: 2020-04-06 16:39:17
 date: 2020-04-06 16:39:17
 categories:
 categories:
-- 软件
-- 科学上网
+   - 软件
+   - 科学上网
 tags:
 tags:
-- fq
+   - fq
 ---
 ---
 
 
 ## 目录
 ## 目录
@@ -56,6 +56,69 @@ VPS的用途很多,本次介绍几种常用的服务器下载BT的利器,体
     ```
     ```
 ![抱歉,图片休息了](st-vps-bt/st-vps-bt-001.png "qbittorrent")
 ![抱歉,图片休息了](st-vps-bt/st-vps-bt-001.png "qbittorrent")
 
 
+---
+
+```
+### debian安装
+1. 关闭防火墙/放行端口
+    sudo ufw disable
+    ufw allow 需要放行的端口
+2. 更新系统并安装依赖
+    apt update -y&&apt install -y curl&&apt install -y socat
+3. 安装Docker
+    curl -fsSL https://get.docker.com -o get-docker.sh
+    sh get-docker.sh
+4. 安装Docker compose
+    curl -SL https://github.com/docker/compose/releases/download/v2.23.3/docker-compose-linux-x86_64 -o /usr/local/bin/docker-compose 
+    sudo chmod +x /usr/local/bin/docker-compose
+5. 安装qBittorrent
+5.1 创建对应目录并编写 Docker-Compose 文件
+    mkdir -p /root/data/docker_data/qBittorrent #创建qbitorrent数据文件夹
+    cd /root/data/docker_data/qBittorrent
+    mkdir config downloads #创建配置文件目录与下载目录
+    touch docker-compose.yml #创建并编辑文件
+5.2 docker-compose.yml文件配置内容
+    version: "3.9"
+    services:
+      qbittorrent:
+        image: linuxserver/qbittorrent
+        container_name: qbittorrent
+        environment:
+          - PUID=1000
+          - PGID=1000
+          - TZ=Asia/Shanghai # 你的时区
+          - UMASK_SET=022
+          - WEBUI_PORT=8081 # 将此处修改成你欲使用的 WEB 管理平台端口 
+        volumes:
+          - ./config:/config # 绝对路径请修改为自己的config文件夹
+          - ./downloads:/downloads # 绝对路径请修改为自己的downloads文件夹
+        ports:
+          # 要使用的映射下载端口与内部下载端口,可保持默认,安装完成后在管理页面仍然可以改成其他端口。
+          - 6881:6881
+          - 6881:6881/udp
+          # 此处WEB UI 目标端口与内部端口务必保证相同
+          - 8081:8081
+        restart: unless-stopped
+5.3 执行docker-compose.yml
+    docker-compose up -d
+    # 执行后,如果得法,访问 ip:web-ui-port 即可进入管理页面
+    # 默认用户名密码admin/admin
+6. 常用命令
+    重启docker:sudo systemctl restart docker
+    查看docker ID:docker ps
+    查看docker日志:docker logs <容器ID/容器名>
+7. Trackers 列表
+    精选列表:(81 个)https://cf.trackerslist.com/best.txt
+    完整列表:(165 个)https://cf.trackerslist.com/all.txt
+    HTTP(S)列表:(65 个)https://cf.trackerslist.com/http.txt
+8. 种子资源网
+    The Pirate Bay:https://thepiratebay.org/index.html
+    YlFY Torrents:https://yts.mx/
+    1337x:https://1337x.to/
+    RARBG:https://rarbg.tw/
+    Torrentz2:https://torrentz2.nz/
+```
+
 ### `Transmission`
 ### `Transmission`
 
 
 1. docker cli安装
 1. docker cli安装
@@ -110,21 +173,21 @@ VPS的用途很多,本次介绍几种常用的服务器下载BT的利器,体
     wahyd4/aria2-ui
     wahyd4/aria2-ui
     ```
     ```
 2. 进入主界面
 2. 进入主界面
-    - Aria2: http://yourip:8000
-    - FileManger: http://yourip:8000/files
-         - FileManger可作为网盘来使用,和caddy的功能差不多
-    - Rclone: http://yourip:8000/rclone
-    - 首次登录 Filebrowser 时,请使用 admin / admin 作为用户名和密码。如果您不更新 ARIA2_USER 和 ARIA2_PWD ,请使用 user / password 登录 Rclone。
+   - Aria2: http://yourip:8000
+   - FileManger: http://yourip:8000/files
+      - FileManger可作为网盘来使用,和caddy的功能差不多
+   - Rclone: http://yourip:8000/rclone
+   - 首次登录 Filebrowser 时,请使用 admin / admin 作为用户名和密码。如果您不更新 ARIA2_USER 和 ARIA2_PWD ,请使用 user / password 登录 Rclone。
 
 
 3. 补充
 3. 补充
-    - 根据个人的需求来选择,如果觉得不需要加密Aria2的管理界面的,其实用第一种方式就行了。非常简单,一行命令即可。
-    - 同时也可以结合TransdroneAPP来使用,使用它来管理多个下载工具也是比较方便的。<img src="st-vps-bt/dowload.png" width="16" height="16" align="center" />[网盘下载](https://pan.baidu.com/s/19Nj1htcK49zyexF9qP7Stw) `提取码v7aa`
-![抱歉,图片休息了](st-vps-bt/st-vps-bt-004.png "Aria2主界面")
-![抱歉,图片休息了](st-vps-bt/st-vps-bt-005.png "FileManger主界面")
+   - 根据个人的需求来选择,如果觉得不需要加密Aria2的管理界面的,其实用第一种方式就行了。非常简单,一行命令即可。
+   - 同时也可以结合TransdroneAPP来使用,使用它来管理多个下载工具也是比较方便的。<img src="st-vps-bt/dowload.png" width="16" height="16" align="center" />[网盘下载](https://pan.baidu.com/s/19Nj1htcK49zyexF9qP7Stw) `提取码v7aa`
+     ![抱歉,图片休息了](st-vps-bt/st-vps-bt-004.png "Aria2主界面")
+     ![抱歉,图片休息了](st-vps-bt/st-vps-bt-005.png "FileManger主界面")
 
 
 ## 取回本地
 ## 取回本地
 
 
-- 下载好的文件存在服务器里,想把它取回到电脑或者手机,有以下几种方法。 
+- 下载好的文件存在服务器里,想把它取回到电脑或者手机,有以下几种方法。
 - 第三种适合于临时下载的,前两种适合长时间的。如果机器本身有装docker,那我建议使用第二种。当然第一种也有好处,就是可以绑定指定的域名。
 - 第三种适合于临时下载的,前两种适合长时间的。如果机器本身有装docker,那我建议使用第二种。当然第一种也有好处,就是可以绑定指定的域名。
 - 各取所需吧,适合自己的需求的才是最好的。
 - 各取所需吧,适合自己的需求的才是最好的。
 
 

+ 56 - 56
source/_posts/st-youtube-dl.md

@@ -119,62 +119,62 @@ youtube-dl [OPTIONS] URL [URL...]    程序自动选择一个最清晰的格式
 - 输出选项
 - 输出选项
 ```
 ```
 -o, --output TEMPLATE                   Output filename template, see the "OUTPUT TEMPLATE" for all the info
 -o, --output TEMPLATE                   Output filename template, see the "OUTPUT TEMPLATE" for all the info
-		eg: -o "%(autonumber)05d-%(upload_date)s-%(title)s-%(id)s.%(ext)s"
-		--------------
-		id (字符串):视频标识符
-		title (字符串):视频标题
-		url (字符串):视频网址
-		ext (字符串):视频文件扩展名
-		alt_title (字符串):视频的辅助标题
-		display_id (字符串):视频的备用标识符
-		uploader (字符串):视频上传者的全名
-		license (字符串):视频使用许可的许可名称
-		creator (字符串):视频的创建者
-		release_date (字符串):视频发布的日期(YYYYMMDD)
-		timestamp (数字):视频可用的那一刻的UNIX时间戳。
-		upload_date (字符串):视频上传日期(YYYYMMDD)
-		uploader_id (字符串):视频上传者的昵称或ID
-		channel (字符串):上传视频的频道的全名
-		channel_id (字符串):频道的ID
-		location (字符串):录制视频的实际位置
-		duration (数字):视频长度(以秒为单位)
-		view_count (数字):有多少用户在平台上观看了视频
-		like_count (数字):视频的正面评价数
-		dislike_count (数字):视频的负面评价数
-		repost_count (数字):视频的转发次数
-		average_rating (数字):用户给出的平均评分,所使用的比例取决于网页
-		comment_count (数字):视频评论数
-		age_limit (数字):视频的年龄限制(年)
-		is_live (布尔值):此视频是实时流还是固定长度的视频
-		start_time (数字):开始播放的时间(以秒为单位),如URL中所指定
-		end_time (数字):复制应结束的时间(以秒为单位),如URL中所指定
-		format (字符串):格式的易于理解的描述
-		format_id (字符串):指定的格式代码 --format
-		format_note (字符串):有关格式的其他信息
-		width (数字):视频的宽度
-		height (数字):视频的高度
-		resolution (字符串):宽度和高度的文字描述
-		tbr (数字):音频和视频的平均比特率,单位为KBit / s
-		abr (数字):平均音频比特率,单位为KBit / s
-		acodec (字符串):使用中的音频编解码器的名称
-		asr (数字):音频采样率,以赫兹为单位
-		vbr (数字):平均视频比特率,单位为KBit / s
-		fps (数字):帧频
-		vcodec (字符串):正在使用的视频编解码器的名称
-		container (字符串):容器格式的名称
-		filesize (数字):字节数(如果事先知道)
-		filesize_approx (数字):估计的字节数
-		protocol (字符串):将用于实际下载的协议
-		extractor (字符串):提取器的名称
-		extractor_key (字符串):提取器的键名
-		epoch (数字):创建文件时的Unix纪元
-		autonumber (数字):五位数字,每次下载都会增加,从零开始
-		playlist (字符串):包含视频的播放列表的名称或ID
-		playlist_index (数字):播放列表中视频的索引,根据播放列表的总长度用前导零填充
-		playlist_id (字符串):播放列表标识符
-		playlist_title (字符串):播放列表标题
-		playlist_uploader (字符串):播放列表上传者的全名
-		playlist_uploader_id (字符串):播放列表上传者的昵称或ID
+        eg: -o "%(autonumber)05d-%(upload_date)s-%(title)s-%(id)s.%(ext)s"
+        --------------
+        id (字符串):视频标识符
+        title (字符串):视频标题
+        url (字符串):视频网址
+        ext (字符串):视频文件扩展名
+        alt_title (字符串):视频的辅助标题
+        display_id (字符串):视频的备用标识符
+        uploader (字符串):视频上传者的全名
+        license (字符串):视频使用许可的许可名称
+        creator (字符串):视频的创建者
+        release_date (字符串):视频发布的日期(YYYYMMDD)
+        timestamp (数字):视频可用的那一刻的UNIX时间戳。
+        upload_date (字符串):视频上传日期(YYYYMMDD)
+        uploader_id (字符串):视频上传者的昵称或ID
+        channel (字符串):上传视频的频道的全名
+        channel_id (字符串):频道的ID
+        location (字符串):录制视频的实际位置
+        duration (数字):视频长度(以秒为单位)
+        view_count (数字):有多少用户在平台上观看了视频
+        like_count (数字):视频的正面评价数
+        dislike_count (数字):视频的负面评价数
+        repost_count (数字):视频的转发次数
+        average_rating (数字):用户给出的平均评分,所使用的比例取决于网页
+        comment_count (数字):视频评论数
+        age_limit (数字):视频的年龄限制(年)
+        is_live (布尔值):此视频是实时流还是固定长度的视频
+        start_time (数字):开始播放的时间(以秒为单位),如URL中所指定
+        end_time (数字):复制应结束的时间(以秒为单位),如URL中所指定
+        format (字符串):格式的易于理解的描述
+        format_id (字符串):指定的格式代码 --format
+        format_note (字符串):有关格式的其他信息
+        width (数字):视频的宽度
+        height (数字):视频的高度
+        resolution (字符串):宽度和高度的文字描述
+        tbr (数字):音频和视频的平均比特率,单位为KBit / s
+        abr (数字):平均音频比特率,单位为KBit / s
+        acodec (字符串):使用中的音频编解码器的名称
+        asr (数字):音频采样率,以赫兹为单位
+        vbr (数字):平均视频比特率,单位为KBit / s
+        fps (数字):帧频
+        vcodec (字符串):正在使用的视频编解码器的名称
+        container (字符串):容器格式的名称
+        filesize (数字):字节数(如果事先知道)
+        filesize_approx (数字):估计的字节数
+        protocol (字符串):将用于实际下载的协议
+        extractor (字符串):提取器的名称
+        extractor_key (字符串):提取器的键名
+        epoch (数字):创建文件时的Unix纪元
+        autonumber (数字):五位数字,每次下载都会增加,从零开始
+        playlist (字符串):包含视频的播放列表的名称或ID
+        playlist_index (数字):播放列表中视频的索引,根据播放列表的总长度用前导零填充
+        playlist_id (字符串):播放列表标识符
+        playlist_title (字符串):播放列表标题
+        playlist_uploader (字符串):播放列表上传者的全名
+        playlist_uploader_id (字符串):播放列表上传者的昵称或ID
 ```
 ```
 
 
 ## 常见问题
 ## 常见问题

+ 89 - 89
source/_posts/te-select.md

@@ -31,30 +31,30 @@ tags:
 ```css
 ```css
 <style>
 <style>
 .selectDiv {
 .selectDiv {
-	display:none;
-	z-index:9999;
-	position:absolute;/*不加的话可能会影响页面其他元素*/
-	border:1px solid #999;
-	width:215px;/*调整下拉框的宽度*/
-	height:106px;
-	margin-left:74px;
-	background:white;
-	border-radius:4px;/*调整边框圆角*/
-	overflow-y:scroll;/*添加下拉框滚动条*/
-	overflow-x:hidden;/*防止ie上下拉框出现横向滚动条*/
+    display:none;
+    z-index:9999;
+    position:absolute;/*不加的话可能会影响页面其他元素*/
+    border:1px solid #999;
+    width:215px;/*调整下拉框的宽度*/
+    height:106px;
+    margin-left:74px;
+    background:white;
+    border-radius:4px;/*调整边框圆角*/
+    overflow-y:scroll;/*添加下拉框滚动条*/
+    overflow-x:hidden;/*防止ie上下拉框出现横向滚动条*/
 } 
 } 
 .selectSpan {
 .selectSpan {
- 	width:190px;/*调整下拉框每个元素的宽度*/
- 	height:18px;
- 	padding-top:3px;
- 	border:1px solid #ffffff;
- 	margin-left:4px;
- 	display:block;/*很重要,调整宽高度需要*/
- 	word-wrap:break-word;/*自动换行*/
- 	vertical-align:middle;/*垂直居中*/
+     width:190px;/*调整下拉框每个元素的宽度*/
+     height:18px;
+     padding-top:3px;
+     border:1px solid #ffffff;
+     margin-left:4px;
+     display:block;/*很重要,调整宽高度需要*/
+     word-wrap:break-word;/*自动换行*/
+     vertical-align:middle;/*垂直居中*/
  } 
  } 
 .selectSpan:hover {
 .selectSpan:hover {
- 	background:#1f7ed0;
+     background:#1f7ed0;
  }
  }
 </style>
 </style>
 ```
 ```
@@ -66,87 +66,87 @@ var TempArr = [];
 var selectDivHtml = "";
 var selectDivHtml = "";
 // 当鼠标点击输入框时执行此方法
 // 当鼠标点击输入框时执行此方法
 function queryUnCreateAddress(){
 function queryUnCreateAddress(){
-	TempArr = [];
-	var showFlag = true;
-	$("#selectDivShow").html(selectDivHtml);
-
-	$.ajax({ //此为向数据库查询json数据填充到下拉框里
-		type:"post",
-		url:path + "/workplace/workplaceInformationMessage!queryUnCreateAddress.action",
-		dataType:"json",
-		async:false,
-		success:function(data){
-			TempArr = data;
-		    if(null != data && data.length > 0){
-		    	$(data).each(function(index,value){
-		    		var leng = checkLength(value.workplaceAddress); //计算数据的长度,区分中英文
-					var height = Math.ceil(leng/21) * 15; //设置下拉框每个选项的高度,
-					if(height == 15){
-						height = 18;
-					}
-	    			selectDivHtml +="<span class='selectSpan' style='height:"+height+"px' data-code='"+value.addressCode+"' data-address='"+value.workplaceAddress+"' onclick='selectedValueInput(this)'>"+value.workplaceAddress+"</span>";
-		    	});
-		    }else{
-		    	showFlag = false;
-		    }
-		},
-		error:function(){
-			alert("系统错误");
-		}
-	});
-	$("#selectDivShow").append(selectDivHtml);
-	selectDivHtml = "";
-
-	if(showFlag){
-		$("#selectDivShow").attr("style","display:block");
-	}
+    TempArr = [];
+    var showFlag = true;
+    $("#selectDivShow").html(selectDivHtml);
+
+    $.ajax({ //此为向数据库查询json数据填充到下拉框里
+        type:"post",
+        url:path + "/workplace/workplaceInformationMessage!queryUnCreateAddress.action",
+        dataType:"json",
+        async:false,
+        success:function(data){
+            TempArr = data;
+            if(null != data && data.length > 0){
+                $(data).each(function(index,value){
+                    var leng = checkLength(value.workplaceAddress); //计算数据的长度,区分中英文
+                    var height = Math.ceil(leng/21) * 15; //设置下拉框每个选项的高度,
+                    if(height == 15){
+                        height = 18;
+                    }
+                    selectDivHtml +="<span class='selectSpan' style='height:"+height+"px' data-code='"+value.addressCode+"' data-address='"+value.workplaceAddress+"' onclick='selectedValueInput(this)'>"+value.workplaceAddress+"</span>";
+                });
+            }else{
+                showFlag = false;
+            }
+        },
+        error:function(){
+            alert("系统错误");
+        }
+    });
+    $("#selectDivShow").append(selectDivHtml);
+    selectDivHtml = "";
+
+    if(showFlag){
+        $("#selectDivShow").attr("style","display:block");
+    }
 }
 }
 // 点击下拉框每个选项时触发此方法
 // 点击下拉框每个选项时触发此方法
 function selectedValueInput(obj){
 function selectedValueInput(obj){
-	var code = $(obj).data("code");
-	var address = $(obj).data("address");
-	$("#workplaceAddressNum").val(code); //隐藏域,按需添加,方便传值到后台
-	$("#contractAddress").val(address);
-	$("#selectDivShow").attr("style","display:none");
+    var code = $(obj).data("code");
+    var address = $(obj).data("address");
+    $("#workplaceAddressNum").val(code); //隐藏域,按需添加,方便传值到后台
+    $("#contractAddress").val(address);
+    $("#selectDivShow").attr("style","display:none");
 }
 }
 // 在输入框输入内容时触发此方法,方便实时监听匹配
 // 在输入框输入内容时触发此方法,方便实时监听匹配
 function setinput(this_){
 function setinput(this_){
-	var select = $("#selectDivShow");
-	select.html("");
-
-	for(var i = 0;i<TempArr.length;i++){
-		if(TempArr[i].workplaceAddress.substring(0,$(this_).val().length).indexOf($(this_).val()) == 0){
-			var leng = checkLength(TempArr[i].workplaceAddress);
-			var height = Math.ceil(leng/21) * 15;
-			if(height == 15){
-				height = 18;
-			}
-			selectDivHtml +="<span class='selectSpan' style='height:"+height+"px' data-code='"+TempArr[i].addressCode+"' data-address='"+TempArr[i].workplaceAddress+"' onclick='selectedValueInput(this)'>"+TempArr[i].workplaceAddress+"</span>";
-		}
-	}
-	select.append(selectDivHtml);
-	selectDivHtml = "";
+    var select = $("#selectDivShow");
+    select.html("");
+
+    for(var i = 0;i<TempArr.length;i++){
+        if(TempArr[i].workplaceAddress.substring(0,$(this_).val().length).indexOf($(this_).val()) == 0){
+            var leng = checkLength(TempArr[i].workplaceAddress);
+            var height = Math.ceil(leng/21) * 15;
+            if(height == 15){
+                height = 18;
+            }
+            selectDivHtml +="<span class='selectSpan' style='height:"+height+"px' data-code='"+TempArr[i].addressCode+"' data-address='"+TempArr[i].workplaceAddress+"' onclick='selectedValueInput(this)'>"+TempArr[i].workplaceAddress+"</span>";
+        }
+    }
+    select.append(selectDivHtml);
+    selectDivHtml = "";
 }
 }
 // 离开输入框时触发此方法
 // 离开输入框时触发此方法
 function addressBlur(){
 function addressBlur(){
-	var selectObj = $("#selectDivShow").find("span:hover");
-	if(null != selectObj && selectObj.length > 0){ //针对鼠标点击下拉框选项触发此方法时的特殊处理
-		selectedValueInput(selectObj);
-		return;
-	}
-	$("#selectDivShow").attr("style","display:none");
+    var selectObj = $("#selectDivShow").find("span:hover");
+    if(null != selectObj && selectObj.length > 0){ //针对鼠标点击下拉框选项触发此方法时的特殊处理
+        selectedValueInput(selectObj);
+        return;
+    }
+    $("#selectDivShow").attr("style","display:none");
 }
 }
 // 计算输入值的长度
 // 计算输入值的长度
 function checkLength(str){
 function checkLength(str){
-	var sLen = 0;
-	for(var i = 0;i<str.length;i++) {
-		if(str.charAt(i) <= '\255') { // 单字节字符
-			sLen++;
-		}else { // 汉字或其他2字节字符
-			sLen = sLen + 3;
-		}
-	}
-	return sLen;
+    var sLen = 0;
+    for(var i = 0;i<str.length;i++) {
+        if(str.charAt(i) <= '\255') { // 单字节字符
+            sLen++;
+        }else { // 汉字或其他2字节字符
+            sLen = sLen + 3;
+        }
+    }
+    return sLen;
 }
 }
 ```
 ```
 
 

Some files were not shown because too many files changed in this diff