Ver código fonte

pushcode

Signed-off-by: tujidelv <tujide.lv@foxmail.com>
tujidelv 1 ano atrás
pai
commit
b7d7ab15da

+ 1 - 1
package-lock.json

@@ -985,7 +985,7 @@
     },
     "node_modules/hexo-asset-image": {
       "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==",
       "dependencies": {
         "cheerio": "^0.19.0",

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

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

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

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

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

@@ -108,28 +108,28 @@ Cache内部保存的是一个个的Element,而一个Element中保存的是一
     ```
     <?xml version="1.0" encoding="UTF-8"?>
     <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>
     ```
     ```
@@ -163,9 +163,9 @@ Cache内部保存的是一个个的Element,而一个Element中保存的是一
     ```
     @CacheConfig(cacheNames = "userCache")
     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" })
     @SpringBootApplication
     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. 清除缓存
@@ -295,47 +295,47 @@ Redis全称为:Remote Dictionary Server(远程数据服务),该软件使
     ```
     @Service
     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
     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")
         @EnableAutoConfiguration
         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注解添加自动扫包范围。
     方法3:
@@ -469,10 +469,10 @@ SpringMVC:
             map-underscore-to-camel-case: true
     3.Mapper代码
         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")
         也可以在Mapper接口上加上@Mapper,不过这样比较繁琐
@@ -532,11 +532,11 @@ SpringMVC:
     3.代码
         @Service
         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
         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.多数据源事务注意事项
         在多数据源的情况下,使用@Transactional注解时,应该指定事务管理器
@@ -620,8 +620,8 @@ SpringMVC:
     ```
     1.pom文件引入atomikos相关的依赖包
         <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>
     2.新增多数据源配置信息,修改application.properties
         # Mysql 1
@@ -650,88 +650,88 @@ SpringMVC:
         @Data
         @ConfigurationProperties(prefix = "mysql.datasource.test1")
         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
         @ConfigurationProperties(prefix = "mysql.datasource.test2")
         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类
         @Configuration
         @MapperScan(basePackages = "top.lvzhiqiang.test01", sqlSessionTemplateRef = "testSqlSessionTemplate")
         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
         @MapperScan(basePackages = "top.lvzhiqiang.test02", sqlSessionTemplateRef = "test2SqlSessionTemplate")
         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.在启动类加上此注解以开启读取配置文件
@@ -769,12 +769,12 @@ SpringMVC:
                     exposure:
                         include: "*"
     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底层基于actuator实现能够返回界面展示监控信息,原理是将所有服务的监控中心管理存放在admin-ui平台上。
@@ -814,9 +814,9 @@ SpringMVC:
         @EnableAutoConfiguration
         @EnableAdminServer
         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.访问
         http://localhost:8080
@@ -866,9 +866,9 @@ SpringMVC:
     3.启动client端
         @SpringBootApplication
         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>
     2.添加Undertow依赖
         <dependency>
-        	<groupId>org.springframework.boot</groupId>
-        	<artifactId>spring-boot-starter-undertow</artifactId>
+            <groupId>org.springframework.boot</groupId>
+            <artifactId>spring-boot-starter-undertow</artifactId>
         </dependency>
     ```
 
@@ -934,13 +934,13 @@ SpringMVC:
     application.properties文件
         name=lvzhiqiang.top
     代码中
-    	@Value("${name}")
-    	private String name;
+        @Value("${name}")
+        private String name;
         @ResponseBody
-    	@RequestMapping("/getValue")
-    	public String getValue() {
-    		return name;
-    	}
+        @RequestMapping("/getValue")
+        public String getValue() {
+            return name;
+        }
     ```
 - `区分不同环境配置文件`
     ```
@@ -1049,16 +1049,16 @@ SpringMVC:
     2.注册拦截器
         @Configuration
         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专属的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了,还有其他的要加入。
     ```
 - `Actuator 默认映射`
@@ -1177,14 +1177,14 @@ SpringMVC:
         </dependency>
     2.创建servlet类
         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运行
         private static int PORT = 8080;// 端口号
@@ -1219,18 +1219,18 @@ SpringMVC:
         getServletMappings()方法负责指定需要由DispatcherServlet映射的路径,这里给定的是"/",意思是由DispatcherServlet处理所有向该应用发起的请求。
         
         public class SpittrWebAppInitializer extends AbstractAnnotationConfigDispatcherServletInitializer {
-        	// 加载根容器
-        	protected Class<?>[] getRootConfigClasses() {
-        		return new Class[] { RootConfig.class };
-        	}
+            // 加载根容器
+            protected Class<?>[] getRootConfigClasses() {
+                return new Class[] { RootConfig.class };
+            }
             // 加载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容器
         @Configuration
@@ -1238,14 +1238,14 @@ SpringMVC:
         @ComponentScan("top.lvzhiqiang.controller")
         public class WebConfig extends WebMvcConfigurerAdapter {
             // 创建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容器
         @Configuration

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

@@ -52,7 +52,7 @@ tags:
     r1.run();
 语法格式二:有一个参数,无返回值
     Consumer<String> con = (arg) -> System.err.println("hello " + arg);
-	con.accept("consumer!");
+    con.accept("consumer!");
     
     若只有一个参数,参数的小括号可以省略不写
         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>)
 
-- [亲子鉴定师:入行16年,亲眼看见上万男人戴上绿帽子](<https://new.qq.com/rain/a/20191031A0QD7M>) 	
+- [亲子鉴定师:入行16年,亲眼看见上万男人戴上绿帽子](<https://new.qq.com/rain/a/20191031A0QD7M>)     
 
 - [重庆魔楼红鼎国际六天五夜奇幻游记](https://mp.weixin.qq.com/s/uuzvPpcYoNO5zZc_3pNsiA)
 - [戒毒十年慢慢说](http://doudoubbs.yxsyj.com/forum.php?mod=viewthread&tid=17838&page=1&authorid=5429)

Diferenças do arquivo suprimidas por serem muito extensas
+ 435 - 435
source/_posts/os-linux-basic.md


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

@@ -77,8 +77,8 @@ tags:
         ```
         -n:不进行换行
         -e:让转义生效
-        	\n:换行
-        	\t:制表符
+            \n:换行
+            \t:制表符
         ```
     - 命令实例
         ```
@@ -116,12 +116,12 @@ tags:
 
 ```
 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:显示进程状态
     常用组合:aux
         u: 以用户为中心组织进程状态信息显示
@@ -199,8 +199,8 @@ hostname: 查看主机名
 主板上有个纽扣电池为主板上的硬件时钟(晶体振荡器)供电,所以关机后再开机时间也是对的
 Linux系统启动时从硬件时钟读取日期和时间信息,读取完成以后,就不再与硬件相关联,并设为当前系统时间,之后靠内核振动次数计时(100次1秒)
 如时间不对,还可以和全球的时间服务器进行对表,精确度很高,最精确的是元子震荡时钟,价值1亿英镑
-	系统时钟:由linux内核通过cpu的工作频率进行的计时
-	硬件时钟
+    系统时钟:由linux内核通过cpu的工作频率进行的计时
+    硬件时钟
 ```
 - `date`
     - 命令功能
@@ -261,8 +261,8 @@ Linux系统启动时从硬件时钟读取日期和时间信息,读取完成以
         change directory,切换工作目录(当前目录)
         ----------
         相关的环境变量:
-        	PWD:保存了当前工作目录的路径
-        	OLDPWD:保存了上一次的工作目录的路径
+            PWD:保存了当前工作目录的路径
+            OLDPWD:保存了上一次的工作目录的路径
         cd后面可以跟相对路径和绝对路径,根据实际需求选择用哪个,相对路径中.或..经常使用
         ```
     - 命令格式
@@ -290,28 +290,28 @@ Linux系统启动时从硬件时钟读取日期和时间信息,读取完成以
         -a,--all:显示所有文件,包括隐藏文件
         -A:显示除.和..之外的所有文件
         -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:对文件大小单位换算,换算后结果可能为非精确值
         -d:显示目录自身的相关属性而非其内部的文件列表,一般与-l结合使用
         -r:reverse,逆序显示,没有-r时默认升序显示
@@ -428,16 +428,16 @@ Linux系统启动时从硬件时钟读取日期和时间信息,读取完成以
     - 命令格式
         ```
         单源复制: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]... -t DIRECTORY SOURCE...    前一形式的变种
-        	如果DEST不存在,错误
-        	如果DEST存在
-        		如果DEST是非目录文件,错误
-        		如果DEST是目录文件,分别复制每个文件至目标目录中,并保持原名
+                cp [OPTION]... -t DIRECTORY SOURCE...    前一形式的变种
+            如果DEST不存在,错误
+            如果DEST存在
+                如果DEST是非目录文件,错误
+                如果DEST是目录文件,分别复制每个文件至目标目录中,并保持原名
         ```
     - 命令参数
         ```
@@ -446,14 +446,14 @@ Linux系统启动时从硬件时钟读取日期和时间信息,读取完成以
         -r,-R:递归复制目录及内部的所有内容
         -d:复制符号链接文件本身,而非其指向的源文件
         -a:相当于-dR --preserve=all          archive,用于实现归档(备份)
-        	--preserve=
-        		mode:权限
-        		ownership:属主和属组
-        		timestamps:时间戳
-        		context:安全标签	
-        		xattr:扩展属性
-        		links:符号链接
-        		all:上述所有属性
+            --preserve=
+                mode:权限
+                ownership:属主和属组
+                timestamps:时间戳
+                context:安全标签    
+                xattr:扩展属性
+                links:符号链接
+                all:上述所有属性
         -v:verbose,显示详细过程
         ```
 - `mv`
@@ -465,7 +465,7 @@ Linux系统启动时从硬件时钟读取日期和时间信息,读取完成以
         ```
         ~]# mv [OPTION]... [-T] SOURCE DEST
         ~]# 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 /*
+            危险操作:rm -rf /*
         ```
 
 ### ***文本文件查看***
@@ -507,7 +507,7 @@ Linux系统启动时从硬件时钟读取日期和时间信息,读取完成以
         ```
     - 命令参数
         ```
-        -n:给显示的文本行编号	
+        -n:给显示的文本行编号    
         -E:显示行结束符$,文本文件在磁盘上存储是没有行的,之所以显示出有行,是因为文本文件查看工具可以读取行结束符并将他们显示为行
         ```
 - `tac`
@@ -552,8 +552,8 @@ Linux系统启动时从硬件时钟读取日期和时间信息,读取完成以
         ```
         -c #:指定获取前#字节
         -n #:指定获取前#行
-        	-#:简写
-        	没有该选项默认10行
+            -#:简写
+            没有该选项默认10行
         ```
 - `tail`
     - 命令功能
@@ -569,8 +569,8 @@ Linux系统启动时从硬件时钟读取日期和时间信息,读取完成以
     ```
     -c #:指定获取后#字节
     -n #:指定获取后#行
-    	-#:简写
-    	没有该选项默认10行
+        -#:简写
+        没有该选项默认10行
     -f:查看文件尾部内容结束后不退出,跟随显示新增的行。常用于人工监控日志增长的新行内容
     -F:同上,与f不同的是会保持重试,即该文件被删除或改名后,如果再次创建相同的文件名,会继续追踪,而f会停止追踪
     ```
@@ -629,10 +629,10 @@ Linux系统启动时从硬件时钟读取日期和时间信息,读取完成以
         ```
         -d DELIMITER:指明分隔符,默认空白字符
         -f FILEDS:要显示哪些字段
-        	#:第#个字段
-        	#,#[,#]:离散的多个字段,例如1,3,6
-        	#-#:连续的多个字段,例如1-6
-        	混合使用:1-3,7
+            #:第#个字段
+            #,#[,#]:离散的多个字段,例如1,3,6
+            #-#:连续的多个字段,例如1-6
+            混合使用:1-3,7
         --output-delimiter=STRING:修改输出时的分隔符
         ```
     - 命令实例
@@ -733,12 +733,12 @@ Linux系统启动时从硬件时钟读取日期和时间信息,读取完成以
         display file or file system status,显示文件的元数据信息
         ---------------------
         文件:两类数据
-        	元数据:metadata
-        	数据:data
+            元数据:metadata
+            数据:data
         时间戳:每个文件都有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
         -m:仅修改modify time
         -t STAMP:
-        	[[CC]YY]MMDDhhmm[.ss]
+            [[CC]YY]MMDDhhmm[.ss]
         ```
 
 ### ***系统管理***
@@ -767,33 +767,33 @@ Linux系统启动时从硬件时钟读取日期和时间信息,读取完成以
 - `关机/重启命令`
     ```
     CentOS 7:
-    	~]# systemctl poweroff
-    	~]# systemctl reboot
+        ~]# systemctl poweroff
+        ~]# systemctl reboot
     *(通用):
-    	~]# poweroff || ~]# halt
-    	~]# reboot
-    		-f:强制,不调用shuwdown
-    		-p:切断电源
+        ~]# poweroff || ~]# halt
+        ~]# reboot
+            -f:强制,不调用shuwdown
+            -p:切断电源
     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:显示当前登录的有效用户
     who:查看系统当前所有的登录信息(会话)
-    	who [option]... ,
-    	-b:系统此次启动的时间
-    	-r:运行级别
+        who [option]... ,
+        -b:系统此次启动的时间
+        -r:运行级别
     w:增强版的who命令,查看系统当前所有的登录信息(会话)及所做的操作
     ```
 
@@ -820,8 +820,8 @@ Linux系统启动时从硬件时钟读取日期和时间信息,读取完成以
         切换用户或以其他用户身份执行命令
         ----------------
         切换用户的方式:
-        	su Username:非登录式切换,即不会读取目标用户的配置文件
-        	su - Username:登录式切换(完全切换),即会读取目标用户的配置文件
+            su Username:非登录式切换,即不会读取目标用户的配置文件
+            su - Username:登录式切换(完全切换),即会读取目标用户的配置文件
         注:root su至其他用户无须密码,非root用户切换时需要密码
         ```
     - 命令格式
@@ -848,7 +848,7 @@ Linux系统启动时从硬件时钟读取日期和时间信息,读取完成以
     - 命令参数
         ```
         -u UID:[UID_MIN,UID_MAX],最小值和最大值定义在/etc/login.defs文件中
-        	没有该选项默认使用最近一个最大UID值+1
+            没有该选项默认使用最近一个最大UID值+1
         -g GID:指明用户所属基本组,可为组名,也可为GID,组必须事先存在
         -c "COMMENT":指明用户的注释信息
         -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:创建系统组
         ```
     - 命令实例
@@ -958,7 +958,7 @@ Linux系统启动时从硬件时钟读取日期和时间信息,读取完成以
         ```
         -l:锁定指定用户
         -u:解锁指定用户
-	
+    
         -n mindays:指定最短使用期限
         -x maxdays:指定最大使用期限
         -w warndays:提前多少天开始警告
@@ -1007,7 +1007,7 @@ Linux系统启动时从硬件时钟读取日期和时间信息,读取完成以
         ```
     - 命令参数
         ```
-        -d:LAST_DAY	
+        -d:LAST_DAY    
         -E,--expiredate EXPIRE_DATE
         -I,--inactive INACTIVE
         -m,--mindays MIN_DAYS
@@ -1025,21 +1025,21 @@ Linux系统启动时从硬件时钟读取日期和时间信息,读取完成以
     - 命令格式
         ```
         ~]# chmod [OPTION]... OCTAL-MODE FILE...
-        	-R:递归修改权限
+            -R:递归修改权限
         ~]# 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...
-        	参考RFILE文件的权限,将FILE的权限修改为同RFILE
+            参考RFILE文件的权限,将FILE的权限修改为同RFILE
         ```
     - 命令实例
         ```
@@ -1064,12 +1064,12 @@ Linux系统启动时从硬件时钟读取日期和时间信息,读取完成以
     - 命令格式
         ```
         ~]# chown [OPTION]... [OWNER][:[GROUP]] FILE...
-        	-R:递归
-        	命令中的冒号可用.替换
-        	用法:
-        		OWNER
-        		OWNER:GROUP
-        		:GROUP
+            -R:递归
+            命令中的冒号可用.替换
+            用法:
+                OWNER
+                OWNER:GROUP
+                :GROUP
         ~]# 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的工作特性:
-        	配置文件:永久有效	
-        		全局:/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自带的练习教程:
-        	vimtutor
+            vimtutor
         ```
 
 ### ***文件查找***
@@ -1324,9 +1324,9 @@ Linux系统启动时从硬件时钟读取日期和时间信息,读取完成以
         可手动更新数据库(updatedb),与makewhatis类似,索引构建过程中需要遍历整个根文件系统,极消耗资源
         -----------------------
         工作特点:
-        	查找速度快
-        	模糊查找:根据整个路径名和文件名
-        	非实时查找
+            查找速度快
+            模糊查找:根据整个路径名和文件名
+            非实时查找
         ```
     - 命令格式
         ```
@@ -1338,78 +1338,78 @@ Linux系统启动时从硬件时钟读取日期和时间信息,读取完成以
         实时查找工具,通过遍历指定路径下的文件系统完成文件查找
         -----------------------
         工作特点:
-        	查找速度略慢
-        	精确查找:根据文件本身的名字而非整个路径名
-        	实时查找
+            查找速度略慢
+            精确查找:根据文件本身的名字而非整个路径名
+            实时查找
         ```
     - 命令格式
         ```
         ~]# 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 -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:默认支持扩展正则表达式来匹配
-        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中的两位或三位数
             ~]# grep '\<[0-9]\{2,3\}\>' /etc/passwd
         练习5:显示/etc/grub2.cfg(或conf)文件中,至少以一个空白字符开头的行且后面存在非空白字符的行
-            ~]# grep '^[[:space:]]\+[^[:space:]]' /etc/grub2.cfg							
+            ~]# grep '^[[:space:]]\+[^[:space:]]' /etc/grub2.cfg                            
         练习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名的行
             ~]# grep '^\([[:alnum:]]\+\>\).*\1$' /etc/passwd
         ------------------------------------

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

@@ -33,14 +33,14 @@ shell脚本编程笔记...
     ```
 - `运行脚本`
     ```
-    1.给予执行权限,通过具体的文件路径指定文件执行	
+    1.给予执行权限,通过具体的文件路径指定文件执行    
         eg: ~]# ./first.sh
     2.直接运行解释器,将脚本作为解释器程序的参数运行
     ```
 - `bash自定义退出状态码`
     ```
     exit [n]:
-    	注:脚本中一旦遇到exit命令,脚本会立即终止;终止退出状态取决于exit命令后面的数字
+        注:脚本中一旦遇到exit命令,脚本会立即终止;终止退出状态取决于exit命令后面的数字
     注:如果未给脚本指定退出状态码,整个脚本的退出状态码取决于脚本中执行的最后一条命令的状态码
     ```
 - `bash脚本编程之用户交互`
@@ -51,7 +51,7 @@ shell脚本编程笔记...
             对bash而言,在同一行中使用分号隔开,2个命令会顺序执行
         -t TIMEOUT:设置命令等待的超时时间,单位为秒,在交互中用户如果超时没输入可以在脚本中给默认值
     # bash -n /path/to/some_script
-    	检测脚本中的语法错误,不能检查逻辑错误
+        检测脚本中的语法错误,不能检查逻辑错误
     # bash -x /path/to/some_script
         调试(单步)执行,它能显示其中执行的每一个代码的详细过程
     ```
@@ -98,39 +98,39 @@ shell脚本编程笔记...
 - `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)
 
@@ -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)
 - `赋值运算符`
     ```
     增强型赋值:+=,-=,*=,/=,%=,
-    	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的测试类型`
     ```
     数值测试:
-    	-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)
 - `组合测试条件`
     ```
     逻辑运算:
-    	第一种方式:
-    		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)
     

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

@@ -425,7 +425,7 @@ Linux启动过程:
             (2) 格式化:
                 mke2fs -t ext4 -b 2048 -L 'TEST' /dev/DEVICE
             (3) 编辑/etc/fstab文件
-                LABEL='TEST' 	/testing 	ext4 	defaults,acl 	0 0
+                LABEL='TEST'     /testing     ext4     defaults,acl     0 0
             (4) 测试
                 mount
         2、写一个脚本,完成如下功能:
@@ -654,9 +654,9 @@ LVM: Logical Volume Manager(逻辑卷管理器), Version: 2
     一个LV用来当/,一个LV用来当SWAP,一个LV用来当USR,一个LV用来当VAR等等
 LV的访问路径:
     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-#
 ```
 ```
@@ -746,15 +746,15 @@ ABI:Application Binary Interface
 ```
 ```
 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
     管理及查看本机装载的库文件:
@@ -981,7 +981,7 @@ linux应用程序的组成部分:二进制程序、库文件、配置文件、
         yum仓库的协议:repodata目录所在父目录就是一个可用仓库
             ftp     ftp://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
         使用Centos镜像光盘搭建本地yum源(仓库):
             (1) 将默认Yum源备份(可选)
@@ -1090,7 +1090,7 @@ linux应用程序的组成部分:二进制程序、库文件、配置文件、
     10、查看指定包所依赖的capabilities:
         yum deplist package1 [package2] [...]
     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、包组管理的相关命令
         yum grouplist
         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 + 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**
 

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

@@ -51,7 +51,7 @@ tags:
     ```
     1. Maven工程右键->'Team'->'Remote'-'Push...'>,填写相关信息提交
         填写URI(远程库地址),用户名,密码后next
-        点击'Add All Branches Spec'来检测所有分支,next	
+        点击'Add All Branches Spec'来检测所有分支,next    
         填写相关日志信息,finish
     2. 弹出'Push Results...'窗口代表推送成功
     ```
@@ -66,7 +66,7 @@ tags:
     ```
 - 解决冲突
     ```
-    1. 提交各自的修改至本地库后,然后试着推送到远程库,可能会出现冲突	
+    1. 提交各自的修改至本地库后,然后试着推送到远程库,可能会出现冲突    
         Maven工程右键->'Team'->'Push Branch master'
     2. 当弹出窗口提示冲突时,可执行拉取操作,解决冲突后Ctrl+#提交到本地库,最后推送到远程库
         Maven工程右键->'Team'->'Pull'
@@ -74,7 +74,7 @@ tags:
     ```
 - GitFlow 分支实战(以 hot_fix 为例)
     ```
-    1. 创建分支		
+    1. 创建分支        
         工程右键'Team'->'Switch To'->'New Branch...',输入分支名hot_fix,依次提交到本地库和远程库(Push Branch hot_fix)
     2. 切换分支审查代码
         Maven工程右键->'Team'->'Pull'
@@ -85,8 +85,8 @@ tags:
         工程右键'Team'->'Switch To'->'master
     5. 合并分支
         工程右键'Team'->'Merge...',选择'Local'->'hot_fix',合并成功后把master推送到远程库
-	```
-	
+    ```
+    
 ## Maven的使用
 
 ![抱歉,图片休息了](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 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 checkout branch-name
-	- 合并指定分支到当前分支:`$ git merge [-m "..."] <name>`
+    - 合并指定分支到当前分支:`$ git merge [-m "..."] <name>`
         >Fast-forward,代表此次合并是"快进模式",即把当前分支(master)指向指定分支(dev)的当前提交,所以合并速度非常快,这种模式下,删除分支后,会丢失掉分支信息
 后面加上--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
     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
-	- $ git rebase 操作可以把本地未 push 的分叉提交历史整理成直线
-	- Rebase 的目的是使得我们在查看历史提交的变化时更容易,因为分叉的提交需要三方对比。
+    - $ git rebase 操作可以把本地未 push 的分叉提交历史整理成直线
+    - Rebase 的目的是使得我们在查看历史提交的变化时更容易,因为分叉的提交需要三方对比。
 
 ## 标签管理
 
@@ -292,29 +292,29 @@ tags:
     
 - 通过命令配置
     - 加上--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]后面,要删除别名,直接把对应的行删掉即可
     ```
     [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]
-    	name = tujidelv
-    	email = tujide.lv@foxmail.com
+        name = tujidelv
+        email = tujide.lv@foxmail.com
     ```
 - windows 版 git bash 设置其他命令别名
     - **Git 安装目录,修改 etc/profile.d/aliases.sh 文件。**

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

@@ -36,7 +36,7 @@ tags:
     - Watch:关注该项目,作者有更新的时候,会在你的 Github 主页有通知消息。
     - Star:收藏该项目,在你的头像上有一个 “Your stars” 链接,可以看到你的收藏列表,以方便下次进来。
     - Fork:复制一份项目到自己的 Github 空间上,你可以自己开发自己的这个地址项目,然后 Pull Request 给项目原主人。
-```    
+```
 ---
 - 本地创建 SSH Key
 
@@ -118,7 +118,7 @@ tags:
     1. 在自己远程仓库项目主页中,点击'Pull requests'/'New pull request',此时'bask fork'选择官方作者,'head fork'选择自己,点击'Create pull request',填好标题和说明(可选)确认。
     2. 此时官方作者可在项目主页中,点击'Pull requests',能看到自己刚刚发送的请求,进去后可在里面跟请求者对话,点击'Files changed'审核代码,没问题的话可点击'Merge pull request'合并代码。
     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'合并代码以获取官方作者的最新代码。
 ```
       
@@ -132,9 +132,9 @@ tags:
 
 ### `GitLab`
 
-- 官网地址			
-	- 首页:<https://about.gitlab.com/> 
-	- 安装说明:<https://about.gitlab.com/installation/>
+- 官网地址            
+    - 首页:<https://about.gitlab.com/> 
+    - 安装说明:<https://about.gitlab.com/installation/>
 - 安装命令摘录
     ```shell
     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
     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
-	    ```shell
-	    $ gitlab-ctl reconfigure
-		```
-	- 启动/停止 gitlab 服务
-        ```shell	
+    - 初始化配置 gitlab
+        ```shell
+        $ gitlab-ctl reconfigure
+        ```
+    - 启动/停止 gitlab 服务
+        ```shell    
         $ gitlab-ctl start/stop
         ```
 - 浏览器访问
     - 访问 Linux 服务器 IP 地址即可,如果想访问 EXTERNAL_URL 指定的域名还需要配置域名服务器或本地 hosts 文件。
-		- 应该会需要停止防火墙服务
+        - 应该会需要停止防火墙服务
         ```shell
         $ service firewalld stop
         ```
-	- 初次登录时需要为 gitlab 的 root 用户设置密码。
+    - 初次登录时需要为 gitlab 的 root 用户设置密码。
 
 ### `原生搭建`
 
-1. 安装 Git												
+1. 安装 Git                                                
     ```
     $ apt-get install git  (Debian系列系统)
     $ yum install -y git   (RetHat系列系统)
-	```
+    ```
 2. 创建Git用户,用来管理 Git服务,并为 Git 用户设置密码
     ```shell
     $ id git
     $ useradd git
     $ echo 'git' | passwd --stdin git &> /dev/null
-	```
+    ```
 3. 创建 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
         ```
 5. Git 打开 RSA 认证
-	1. 进入/etc/ssh目录,编辑 sshd_config,打开以下三个配置的注释,然后重启 sshd 服务
+    1. 进入/etc/ssh目录,编辑 sshd_config,打开以下三个配置的注释,然后重启 sshd 服务
         ```shell
         $ vim sshd_config
             RSAAuthentication yes
@@ -221,53 +221,53 @@ tags:
             或者$ /etc/rc.d/init.d/sshd restart
         ```
         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. 创建证书登录(添加客户端公钥到服务器)
-	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
         $ 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`服务
         ```shell
         $ ssh git@server_ip -p 端口号(默认22时可不用此参数)
         ```
 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. 客户端克隆远程仓库
     ```shell
     $ 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. 管理公钥
-	- 如果团队很小,把每个人的公钥收集起来放到服务器的/home/git/.ssh/authorized_keys文件里就是可行的。如果团队有几百号人,就没法这么玩了,这时,可以用 Gitosis 来管理公钥。
+    - 如果团队很小,把每个人的公钥收集起来放到服务器的/home/git/.ssh/authorized_keys文件里就是可行的。如果团队有几百号人,就没法这么玩了,这时,可以用 Gitosis 来管理公钥。
 10. 管理权限
-	- 因为 Git 是为 Linux 源代码托管而开发的,所以 Git 也继承了开源社区的精神,不支持权限控制。
-	- 不过,因为 Git 支持钩子(hook),所以,可以在服务器端编写一系列脚本来控制提交等操作,达到权限控制的目的,Gitolite 就是这个工具。
+    - 因为 Git 是为 Linux 源代码托管而开发的,所以 Git 也继承了开源社区的精神,不支持权限控制。
+    - 不过,因为 Git 支持钩子(hook),所以,可以在服务器端编写一系列脚本来控制提交等操作,达到权限控制的目的,Gitolite 就是这个工具。
 
 ### `GitBucket`
 

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

@@ -40,34 +40,34 @@ tags:
 ![抱歉,图片休息了](st-git-workflow/st-git-workflow-002.png "GitFlow 工作流")
 - 简介
     - GitFlow 工作流通过为功能开发、发布准备和维护设立了独立的分支,让发布迭代过程更流畅,严格的分支模型也为大型项目提供了一些非常必要的结构。
-- 评价			
+- 评价            
     - GitFlow 的优点是清晰可控,缺点是相对复杂,需要同时维护两个长期分支,大多数工具都将 master 当作默认分支,可是开发是在 develop 分支进行的,这导致经常要切换分支,非常烦人,
-    更大问题在于,这个模式是基于"版本发布"的,目标是一段时间以后产出一个新版本,但是,很多网站项目是"持续发布",代码一有变动,就部署一次,这时,master 分支和 develop 分支的差别不大,没必要维护两个长期分支。	
+    更大问题在于,这个模式是基于"版本发布"的,目标是一段时间以后产出一个新版本,但是,很多网站项目是"持续发布",代码一有变动,就部署一次,这时,master 分支和 develop 分支的差别不大,没必要维护两个长期分支。    
 - 分支种类
     - 长期分支(核心分支)
         - **主干分支 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 工作流
 
 - 简介
     - 是 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 工作流
 

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

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

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

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

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

@@ -164,21 +164,21 @@ pom.xml —— maven项目核心配置文件
     ```
     ```xml
     <build>
-    	<plugins>
-    		<plugin><!--将源码打包的功能-->
+        <plugins>
+            <plugin><!--将源码打包的功能-->
                 <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><!--具体的的执行位置 -->
-    					<goals>
-    						<goal>jar-no-fork</goal>
+                        <goals>
+                            <goal>jar-no-fork</goal>
                         </goals>
                         <phase>verify</phase>
-    				</execution>
+                    </execution>
                  </executions>
-      		</plugin>
-    	</plugins>
+              </plugin>
+        </plugins>
     </build>
     ```
 - 继承
@@ -200,7 +200,7 @@ pom.xml —— maven项目核心配置文件
     ```
     ```
     父工程统一管理子工程依赖版本
-        <dependencyManagement>	
+        <dependencyManagement>    
             <dependencies>
                 //添加公共依赖包
             </dependencies>
@@ -252,7 +252,7 @@ pom.xml —— maven项目核心配置文件
     ```
     1.下载nexus.war包,然后拷贝到tomcat下的webapps目录中
     2.启动tomcat,并访问http://localhost:8080/nexus/
-    3.点击右上角“log in”	,输入username:admin 和Password:admin123登录
+    3.点击右上角“log in”    ,输入username:admin 和Password:admin123登录
     4.点击Views/Repositories 中的Repositories
         Nexus内置仓库说明:
             (1)Central:该仓库代理Maven中央仓库,其策略为Release,因此只会下载和缓存中央仓库中的发布版本构件。
@@ -319,23 +319,23 @@ pom.xml —— maven项目核心配置文件
     2. (如项目不上传到私服可省略)部署构建到Nexus,包含Release和Snapshot, 一般在父工程中的根目录pom.xml中配置
         ```
         <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> 
         </distributionManagement>
         ```
     3. (如不进行步骤2可省略)Nexus的访问权限控制,在setting.xml(2个都要改)中配置如下
         ```
         <servers>
-         	<server>
-         		<id>releases</id>
+             <server>
+                 <id>releases</id>
                 <username>admin</username>
                 <password>admin123</password>
             </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
    <style>
    .container {
-   	width: 1540px;
+       width: 1540px;
    }
    </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
 ```
 打开Finalshell——点击蓝色文件夹图标——点击第一个+号——点击SSH连接——名称可以自定义——把服务器IP粘贴到主机位置——方法选择公钥——用户名输入root;
-点击浏览——点击导入——名称可以自定义——点击浏览——选择前面创建好的私钥文件(没有后缀那一个)——点击确定——点击确定——点击确定——双击即可连接。
+点击浏览——点击导入——名称可以自定义——点击浏览——选择前面创建好的私钥文件(没有后缀那一个)——点击确定——点击确定——点击确定——双击即可连接。`
 ```
 
 ## 美区AppleID

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

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

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

@@ -2,10 +2,10 @@
 title: VPS离线BT下载利器
 date: 2020-04-06 16:39:17
 categories:
-- 软件
-- 科学上网
+   - 软件
+   - 科学上网
 tags:
-- fq
+   - fq
 ---
 
 ## 目录
@@ -56,6 +56,69 @@ VPS的用途很多,本次介绍几种常用的服务器下载BT的利器,体
     ```
 ![抱歉,图片休息了](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`
 
 1. docker cli安装
@@ -110,21 +173,21 @@ VPS的用途很多,本次介绍几种常用的服务器下载BT的利器,体
     wahyd4/aria2-ui
     ```
 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. 补充
-    - 根据个人的需求来选择,如果觉得不需要加密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,那我建议使用第二种。当然第一种也有好处,就是可以绑定指定的域名。
 - 各取所需吧,适合自己的需求的才是最好的。
 

+ 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
-		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
 <style>
 .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 {
- 	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 {
- 	background:#1f7ed0;
+     background:#1f7ed0;
  }
 </style>
 ```
@@ -66,87 +66,87 @@ var TempArr = [];
 var selectDivHtml = "";
 // 当鼠标点击输入框时执行此方法
 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){
-	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_){
-	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(){
-	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){
-	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;
 }
 ```
 

Alguns arquivos não foram mostrados porque muitos arquivos mudaram nesse diff