text: /*
  Navicat MariaDB Data Transfer
  
  Source Server         : local
  Source Server Version : 100311
  Source Host           : localhost:3306
  Source Database       : blog
  
  Target Server Type    : MariaDB
  Target Server Version : 100311
  File Encoding         : 65001
  
  Date: 2019-01-08 14:45:58
  */
  
  SET FOREIGN_KEY_CHECKS=0;
  
  -- ----------------------------
  -- Table structure for cate
  -- ----------------------------
  DROP TABLE IF EXISTS `cate`;
  CREATE TABLE `cate` (
    `id` int(11) unsigned NOT NULL AUTO_INCREMENT,
    `name` varchar(64) DEFAULT '',
    `intro` varchar(64) NOT NULL,
    PRIMARY KEY (`id`),
    UNIQUE KEY `name` (`intro`) USING BTREE
  ) ENGINE=InnoDB AUTO_INCREMENT=6 DEFAULT CHARSET=utf8mb4;
  
  -- ----------------------------
  -- Records of cate
  -- ----------------------------
  INSERT INTO `cate` VALUES ('1', 'article', '博客文章');
  INSERT INTO `cate` VALUES ('3', 'learn', '学习笔记');
  INSERT INTO `cate` VALUES ('4', 'goweb', '动态网站');
  INSERT INTO `cate` VALUES ('5', 'python', 'python语言');
  
  -- ----------------------------
  -- Table structure for opts
  -- ----------------------------
  DROP TABLE IF EXISTS `opts`;
  CREATE TABLE `opts` (
    `key` varchar(255) NOT NULL DEFAULT '',
    `value` text DEFAULT NULL,
    `desc` varchar(255) DEFAULT NULL,
    PRIMARY KEY (`key`),
    UNIQUE KEY `key` (`key`)
  ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
  
  -- ----------------------------
  -- Records of opts
  -- ----------------------------
  INSERT INTO `opts` VALUES ('analytic', '<!-- <script async src=\"https://hm.baidu.com/hm.js?d441f13eda74e040231e5e32370fee9d\"></script><script async src=\"/-dn-lbstatics.qbox.me/busuanzi/2.3/busuanzi.pure.mini.js\"></script> -->', '统计代码，可以添加百度统计、Google 统计等');
  INSERT INTO `opts` VALUES ('auto_summary', '0', null);
  INSERT INTO `opts` VALUES ('comment', '{\"type\":\"gitalk\",\"name\":\"{\\\"clientID\\\": \\\"2d028c155cbc14d10f53\\\",\\\"clientSecret\\\": \\\"e503c3d371fb046b2ec9ca99253c10b320be0052\\\",\\\"repo\\\": \\\"blog\\\",\\\"owner\\\": \\\"zxysilent\\\",\\\"admin\\\":[\\\"zxysilent\\\"],\\\"distractionFreeMode\\\":true,\\\"githubUserName\\\":\\\"zxysilent\\\",\\\"githubPassWord\\\":\\\"zxysilent1009\\\"}\"}', '评论类型');
  INSERT INTO `opts` VALUES ('custom_js', 'console.log(\"https://blog.zxysilent.com\")', '自定义js');
  INSERT INTO `opts` VALUES ('description', 'zxysilent;zxysilent blog;zxyslt;zxyslt blog;', '网站描述');
  INSERT INTO `opts` VALUES ('favicon_url', '/favicon.ico', 'favicon');
  INSERT INTO `opts` VALUES ('github_url', 'https://github.com/zxysilent', 'GitHub 地址');
  INSERT INTO `opts` VALUES ('keywords', 'zxysilent,zxyslt,zxy', '网站关键字');
  INSERT INTO `opts` VALUES ('logo_url', '/res/logo.png', 'logo 地址');
  INSERT INTO `opts` VALUES ('miitbeian', '蜀ICP备16011344号-2', '网站备案号');
  INSERT INTO `opts` VALUES ('page_size', '8', '文章一页显示的条数');
  INSERT INTO `opts` VALUES ('site_url', 'https://blog.zxysilent.com', '网站地址');
  INSERT INTO `opts` VALUES ('title', 'zxysilent', '网站标题');
  INSERT INTO `opts` VALUES ('weibo_url', 'https://weibo.com/u/2909680165', '微博地址');
  
  -- ----------------------------
  -- Table structure for post
  -- ----------------------------
  DROP TABLE IF EXISTS `post`;
  CREATE TABLE `post` (
    `id` int(11) unsigned NOT NULL AUTO_INCREMENT,
    `user_id` int(11) unsigned NOT NULL,
    `cate_id` int(11) NOT NULL DEFAULT 0,
    `type` tinyint(4) NOT NULL DEFAULT 0 COMMENT '0 为文章，1 为页面',
    `status` tinyint(4) NOT NULL DEFAULT 0 COMMENT '0 为草稿 3 为已经发布',
    `title` varchar(255) NOT NULL,
    `path` varchar(255) NOT NULL DEFAULT '' COMMENT 'URL 的 pathname',
    `summary` longtext NOT NULL COMMENT '摘要',
    `markdown_content` longtext NOT NULL,
    `content` longtext NOT NULL,
    `allow_comment` tinyint(4) NOT NULL DEFAULT 1 COMMENT '1 为允许， 0 为不允许',
    `create_time` datetime DEFAULT NULL,
    `update_time` datetime NOT NULL,
    `is_public` tinyint(4) NOT NULL DEFAULT 1 COMMENT '1 为公开，0 为不公开',
    `comment_num` int(11) NOT NULL DEFAULT 0,
    `options` text DEFAULT NULL COMMENT '一些选项，JSON 结构',
    PRIMARY KEY (`id`),
    UNIQUE KEY `path` (`path`),
    KEY `create_time` (`create_time`)
  ) ENGINE=InnoDB AUTO_INCREMENT=69 DEFAULT CHARSET=utf8mb4;
  
  -- ----------------------------
  -- Records of post
  -- ----------------------------
  INSERT INTO `post` VALUES ('2', '1', '1', '0', '3', 'vscode 插件记录', 'vscode-ext', '<h3><a id=\"_0\"></a>插件</h3>\n<ul>\n<li><s>Amazeui-vscode-snippets</s></li>\n<li><s>Atom javascrippt snippet</s></li>\n<li><s>Auto Close tag</s></li>\n<li>Auto Rename tag</li>\n<li><s>Babel es6/es7</s></li>\n</ul>\n', '### 插件\n- ~~Amazeui-vscode-snippets~~\n- ~~Atom javascrippt snippet~~\n- ~~Auto Close tag~~\n- Auto Rename tag\n- ~~Babel es6/es7~~\n<!--more-->\n- ~~C/c++~~\n- ~~C/c++ snippets~~\n- ~~C#~~\n- ~~C# extensions~~\n- ~~C++ intellisense~~\n- ~~ClangComplete~~\n- ~~Code Runner~~\n- Bracker Pair Colorizer\n- Git History\n- Go\n- ~~Cuides~~\n- ~~HTML CSS Class Completion~~\n- HTML CSS Support\n- ~~JS-CSS-HTML Formatter~~\n- ~~Node.js Modules Intellisense~~\n- ~~Prettify JSON~~\n- minify\n- Path Intellisense\n- Prttier -Code formatter\n- Pyhton\n- vetur\n- ~~vue~~\n- ~~weex~~\n- ~~Pyhton for VS code~~\n- View in Browser\n- vscode-icons\n\n### 配置\n```\n{\n    \"editor.fontFamily\": \"\'Microsoft YaHei Mono\',Consolas, \'Courier New\', monospace\",\n    \"editor.minimap.maxColumn\": 70,\n    \"editor.minimap.showSlider\": \"always\",\n    \"editor.detectIndentation\": false,\n    \"editor.wordWrap\": \"on\",\n    \"workbench.startupEditor\": \"newUntitledFile\",\n    \"window.zoomLevel\": 0,\n    \"html.format.extraLiners\": \"\",\n    \"vsicons.dontShowNewVersionMessage\": true,\n    \"go.addTags\": {\n        \"tags\": \"json,form\",\n        \"options\": \"json=\",\n        \"promptForTags\": false,\n        \"transform\": \"snakecase\"\n    },\n    \"go.editorContextMenuCommands\": {\n        \"toggleTestFile\": false,\n        \"addTags\": true,\n        \"removeTags\": false,\n        \"testAtCursor\": false,\n        \"testFile\": false,\n        \"testPackage\": false,\n        \"generateTestForFunction\": false,\n        \"generateTestForFile\": false,\n        \"generateTestForPackage\": false,\n        \"addImport\": true,\n        \"testCoverage\": false,\n        \"playground\": false\n    },\n    \"git.enableSmartCommit\": true,\n    \"extensions.ignoreRecommendations\": false,\n    \"emmet.syntaxProfiles\": {\n        \"vue-html\": \"html\",\n        \"vue\": \"html\"\n    },\n    \"explorer.confirmDelete\": false,\n    \"git.path\": \"D:/Program Files/Git/bin/git.exe\",\n    \"html.suggest.angular1\": false,\n    \"python.jediEnabled\": false,\n    \"python.linting.enabled\": false,\n    \"python.autoComplete.addBrackets\": true,\n    // \"python.pythonPath\": \"D:/Program Files/Python/python.exe\",\n    // \"python.jediPath\": \"D:/Program Files/Python/Lib/site-packages/jedi\",\n    \"explorer.confirmDragAndDrop\": false,\n    \"vetur.validation.template\": false,\n    \"vetur.format.defaultFormatter.html\": \"js-beautify-html\",\n    \"search.followSymlinks\": false,\n    \"C_Cpp.clang_format_fallbackStyle\": \"Google\",\n    \"editor.quickSuggestions\": {\n        \"other\": true,\n        \"comments\": true,\n        \"strings\": true\n    },\n    \"prettier.tabWidth\": 4,\n    \"prettier.useTabs\": true,\n    \"emmet.triggerExpansionOnTab\": true,\n    \"gitHistory.showEditorTitleMenuBarIcons\": false,\n    \"workbench.statusBar.feedback.visible\": false,\n    \"view-in-browser.customBrowser\": \"chrome\",\n    \"editor.renderLineHighlight\": \"all\",\n    \"workbench.iconTheme\": \"vscode-icons\",\n    \"git.confirmSync\": false,\n    \"extensions.showRecommendationsOnlyOnDemand\": true,\n    \"workbench.colorTheme\": \"Default Light+\",\n    \"workbench.activityBar.visible\": true,\n    \"editor.minimap.enabled\": true\n}\n```', '<div class=\"toc\"><ul><li><a href=\"#toc__0\">插件</a></li><li><a href=\"#toc__34\">配置</a></li></ul></div><h3><a id=\"toc__0\"></a>插件</h3>\n<ul>\n<li><s>Amazeui-vscode-snippets</s></li>\n<li><s>Atom javascrippt snippet</s></li>\n<li><s>Auto Close tag</s></li>\n<li>Auto Rename tag</li>\n<li><s>Babel es6/es7</s></li>\n</ul>\n<!--more-->\n<ul>\n<li><s>C/c++</s></li>\n<li><s>C/c++ snippets</s></li>\n<li><s>C#</s></li>\n<li><s>C# extensions</s></li>\n<li><s>C++ intellisense</s></li>\n<li><s>ClangComplete</s></li>\n<li><s>Code Runner</s></li>\n<li>Bracker Pair Colorizer</li>\n<li>Git History</li>\n<li>Go</li>\n<li><s>Cuides</s></li>\n<li><s>HTML CSS Class Completion</s></li>\n<li>HTML CSS Support</li>\n<li><s>JS-CSS-HTML Formatter</s></li>\n<li><s>Node.js Modules Intellisense</s></li>\n<li><s>Prettify JSON</s></li>\n<li>minify</li>\n<li>Path Intellisense</li>\n<li>Prttier -Code formatter</li>\n<li>Pyhton</li>\n<li>vetur</li>\n<li><s>vue</s></li>\n<li><s>weex</s></li>\n<li><s>Pyhton for VS code</s></li>\n<li>View in Browser</li>\n<li>vscode-icons</li>\n</ul>\n<h3><a id=\"toc__34\"></a>配置</h3>\n<pre><code class=\"lang-\">{\n    &quot;editor.fontFamily&quot;: &quot;\'Microsoft YaHei Mono\',Consolas, \'Courier New\', monospace&quot;,\n    &quot;editor.minimap.maxColumn&quot;: 70,\n    &quot;editor.minimap.showSlider&quot;: &quot;always&quot;,\n    &quot;editor.detectIndentation&quot;: false,\n    &quot;editor.wordWrap&quot;: &quot;on&quot;,\n    &quot;workbench.startupEditor&quot;: &quot;newUntitledFile&quot;,\n    &quot;window.zoomLevel&quot;: 0,\n    &quot;html.format.extraLiners&quot;: &quot;&quot;,\n    &quot;vsicons.dontShowNewVersionMessage&quot;: true,\n    &quot;go.addTags&quot;: {\n        &quot;tags&quot;: &quot;json,form&quot;,\n        &quot;options&quot;: &quot;json=&quot;,\n        &quot;promptForTags&quot;: false,\n        &quot;transform&quot;: &quot;snakecase&quot;\n    },\n    &quot;go.editorContextMenuCommands&quot;: {\n        &quot;toggleTestFile&quot;: false,\n        &quot;addTags&quot;: true,\n        &quot;removeTags&quot;: false,\n        &quot;testAtCursor&quot;: false,\n        &quot;testFile&quot;: false,\n        &quot;testPackage&quot;: false,\n        &quot;generateTestForFunction&quot;: false,\n        &quot;generateTestForFile&quot;: false,\n        &quot;generateTestForPackage&quot;: false,\n        &quot;addImport&quot;: true,\n        &quot;testCoverage&quot;: false,\n        &quot;playground&quot;: false\n    },\n    &quot;git.enableSmartCommit&quot;: true,\n    &quot;extensions.ignoreRecommendations&quot;: false,\n    &quot;emmet.syntaxProfiles&quot;: {\n        &quot;vue-html&quot;: &quot;html&quot;,\n        &quot;vue&quot;: &quot;html&quot;\n    },\n    &quot;explorer.confirmDelete&quot;: false,\n    &quot;git.path&quot;: &quot;D:/Program Files/Git/bin/git.exe&quot;,\n    &quot;html.suggest.angular1&quot;: false,\n    &quot;python.jediEnabled&quot;: false,\n    &quot;python.linting.enabled&quot;: false,\n    &quot;python.autoComplete.addBrackets&quot;: true,\n    // &quot;python.pythonPath&quot;: &quot;D:/Program Files/Python/python.exe&quot;,\n    // &quot;python.jediPath&quot;: &quot;D:/Program Files/Python/Lib/site-packages/jedi&quot;,\n    &quot;explorer.confirmDragAndDrop&quot;: false,\n    &quot;vetur.validation.template&quot;: false,\n    &quot;vetur.format.defaultFormatter.html&quot;: &quot;js-beautify-html&quot;,\n    &quot;search.followSymlinks&quot;: false,\n    &quot;C_Cpp.clang_format_fallbackStyle&quot;: &quot;Google&quot;,\n    &quot;editor.quickSuggestions&quot;: {\n        &quot;other&quot;: true,\n        &quot;comments&quot;: true,\n        &quot;strings&quot;: true\n    },\n    &quot;prettier.tabWidth&quot;: 4,\n    &quot;prettier.useTabs&quot;: true,\n    &quot;emmet.triggerExpansionOnTab&quot;: true,\n    &quot;gitHistory.showEditorTitleMenuBarIcons&quot;: false,\n    &quot;workbench.statusBar.feedback.visible&quot;: false,\n    &quot;view-in-browser.customBrowser&quot;: &quot;chrome&quot;,\n    &quot;editor.renderLineHighlight&quot;: &quot;all&quot;,\n    &quot;workbench.iconTheme&quot;: &quot;vscode-icons&quot;,\n    &quot;git.confirmSync&quot;: false,\n    &quot;extensions.showRecommendationsOnlyOnDemand&quot;: true,\n    &quot;workbench.colorTheme&quot;: &quot;Default Light+&quot;,\n    &quot;workbench.activityBar.visible&quot;: true,\n    &quot;editor.minimap.enabled&quot;: true\n}\n</code></pre>\n', '1', '2017-04-07 10:17:50', '2018-06-30 21:24:13', '1', '0', '{\"template\":\"\",\"push_sites\":[]}');
  INSERT INTO `post` VALUES ('3', '1', '0', '1', '3', '友链', 'links', '', '[⛈](/core/)\n\n[⛏](/page/tool)\n\n[动态网站](/cate/goweb)\n[python](/cate/python)', '<p><a href=\"/core/\" target=\"_blank\">⛈</a></p>\n<p><a href=\"/page/tool\" target=\"_blank\">⛏</a></p>\n<p><a href=\"/cate/goweb\" target=\"_blank\">动态网站</a><br />\n<a href=\"/cate/python\" target=\"_blank\">python</a></p>\n', '0', '2017-04-07 10:31:06', '2018-09-10 12:13:53', '1', '0', '{\"template\":\"\",\"push_sites\":[]}');
  INSERT INTO `post` VALUES ('4', '1', '0', '1', '3', '关于', 'about', '', '关于', '<p>关于</p>\n', '1', '2017-04-07 10:31:28', '2018-09-10 13:50:54', '1', '0', '{\"template\":\"\",\"push_sites\":[]}');
  INSERT INTO `post` VALUES ('13', '1', '3', '0', '3', 'nginx参数', 'nginx', '<h2 id=\"-cmd\">基础cmd</h2>\n<pre><code class=\"hljs lang-nginx\"><span class=\"hljs-attribute\">sudo</span> nginx <span class=\"hljs-comment\">#打开 nginx</span>\nnginx -s reload|reopen|stop|quit  <span class=\"hljs-comment\">#重新加载配置|重启|停止|退出 nginx</span>\nnginx -t   <span class=\"hljs-comment\">#测试配置是否有语法错误</span>\nnginx [-?hvVtq] [-s signal] [-c filename] [-p prefix] [-g directives]\n\n-?,-h           : 打开帮助信息\n-v              : 显示版本信息并退出\n-V              : 显示版本和配置选项信息，然后退出\n-t              : 检测配置文件是否有语法错误，然后退出\n-q              : 在检测配置文件期间屏蔽非错误信息\n-s signal       : 给一个 nginx 主进程发送信号：stop（停止）, quit（退出）, reopen（重启）, reload（重新加载配置文件）\n-p prefix       : 设置前缀路径\n-c filename     : 设置配置文件\n-g directives   : 设置配置文件外的全局指令\n</code></pre>\n', '## 基础cmd\n\n```nginx\nsudo nginx #打开 nginx\nnginx -s reload|reopen|stop|quit  #重新加载配置|重启|停止|退出 nginx\nnginx -t   #测试配置是否有语法错误\nnginx [-?hvVtq] [-s signal] [-c filename] [-p prefix] [-g directives]\n\n-?,-h           : 打开帮助信息\n-v              : 显示版本信息并退出\n-V              : 显示版本和配置选项信息，然后退出\n-t              : 检测配置文件是否有语法错误，然后退出\n-q              : 在检测配置文件期间屏蔽非错误信息\n-s signal       : 给一个 nginx 主进程发送信号：stop（停止）, quit（退出）, reopen（重启）, reload（重新加载配置文件）\n-p prefix       : 设置前缀路径\n-c filename     : 设置配置文件\n-g directives   : 设置配置文件外的全局指令\n```\n<!--more-->\n\n## 配置文件 \n`main`  全局设置  \n main部分设置的指令将影响其它所有部分的设置；  \n`server`  主机设置  \nserver部分的指令主要用于指定虚拟主机域名、IP和端口；  \n`upstream`  上游服务器设置，主要为反向代理、负载均衡相关配置  \nupstream的指令用于设置一系列的后端服务器，设置反向代理及后端服务器的负载均衡；  \n`location`  URL匹配特定位置后的设置   \nlocation部分用于匹配网页位置（比如，根目录“/”,“/images”,等等）  \n> server继承main，location继承server；  \n>upstream既不会继承指令也不会被继承。它有自己的特殊指令，不需要在其他地方的应用。\n\n### 通用\n下面的`nginx.conf`简单的实现nginx在前端做反向代理服务器的例子，处理js、png等静态文件，jsp等动态请求转发到其它服务器：\n\n```\nuser  www www;\nworker_processes  2;\nerror_log  logs/error.log;\n#error_log  logs/error.log  notice;\n#error_log  logs/error.log  info;\npid        logs/nginx.pid;\nevents {\n    use epoll;\n    worker_connections  2048;\n}\nhttp {\n    include       mime.types;\n    default_type  application/octet-stream;\n\n    #log_format  main  \'$remote_addr - $remote_user [$time_local] \"$request\" \'\n    #                  \'$status $body_bytes_sent \"$http_referer\" \'\n    #                  \'\"$http_user_agent\" \"$http_x_forwarded_for\"\';\n\n    #access_log  logs/access.log  main;\n    sendfile        on;\n    # tcp_nopush     on;\n    keepalive_timeout  65;\n  # gzip压缩功能设置\n    gzip on;\n    gzip_min_length 1k;\n    gzip_buffers    4 16k;\n    gzip_http_version 1.0;\n    gzip_comp_level 6;\n    gzip_types text/html text/plain text/css text/javascript application/json application/javascript application/x-javascript application/xml;\n    gzip_vary on;\n  # http_proxy 设置\n    client_max_body_size   10m;\n    client_body_buffer_size   128k;\n    proxy_connect_timeout   75;\n    proxy_send_timeout   75;\n    proxy_read_timeout   75;\n    proxy_buffer_size   4k;\n    proxy_buffers   4 32k;\n    proxy_busy_buffers_size   64k;\n    proxy_temp_file_write_size  64k;\n    proxy_temp_path   /usr/local/nginx/proxy_temp 1 2;\n  # 设定负载均衡后台服务器列表 \n    upstream  backend  { \n              #ip_hash; \n              server   192.168.10.110:8000 max_fails=2 fail_timeout=30s ;  \n              server   192.168.10.100:8000 max_fails=2 fail_timeout=30s ;  \n    }\n  # 虚拟主机配置\n    server {\n        listen       80;\n        server_name  itoatest.example.com;\n        root   /apps/oaapp;\n        charset utf-8;\n        access_log  logs/host.access.log  main;\n        #对 / 所有做负载均衡+反向代理\n        location / {\n            root   /apps/oaapp;\n            index  index.jsp index.html index.htm;\n            proxy_pass        http://backend;  \n            proxy_redirect off;\n            # 后端的Web服务器可以通过X-Forwarded-For获取用户真实IP\n            proxy_set_header  Host  $host;\n            proxy_set_header  X-Real-IP  $remote_addr;  \n            proxy_set_header  X-Forwarded-For  $proxy_add_x_forwarded_for;\n            proxy_next_upstream error timeout invalid_header http_500 http_502 http_503 http_504;\n        }\n        #静态文件，nginx自己处理，不去backend请求tomcat\n        location  ~* /download/ {  \n            root /apps/oa/fs;  \n        }\n        location ~ .*\\.(gif|jpg|jpeg|bmp|png|ico|txt|js|css)$   \n        {   \n            root /apps/oaapp;   \n            expires      7d; \n        }\n        location /nginx_status {\n            stub_status on;\n            access_log off;\n            allow 192.168.10.0/24;\n            deny all;\n        }\n        location ~ ^/(WEB-INF)/ {   \n            deny all;   \n        }\n        #error_page  404              /404.html;\n        # redirect server error pages to the static page /50x.html\n        #\n        error_page   500 502 503 504  /50x.html;\n        location = /50x.html {\n            root   html;\n        }\n    }\n  ## 其它虚拟主机，server 指令开始\n}\n```\n## 常用指令\n### main全局配置\nnginx在运行时与具体业务功能（比如http服务或者email服务代理）无关的一些参数，比如工作进程数，运行的身份等。    \n- `woker_processes 2`\nworker角色的工作进程的个数，master进程是接收并分配请求给worker处理。这个数值简单一点可以设置为cpu的核数如果开启了ssl和gzip更应该设置成与逻辑CPU数量一样甚至为2倍，可以减少I/O操作。如果nginx服务器还有其它服务，可以考虑适当减少。  \n- `worker_connections 2048`\n写在events部分。每一个worker进程能并发处理（发起）的最大连接数（包含与客户端或后端被代理服务器间等所有连接数）。nginx作为反向代理服务器，计算公式 `最大连接数 = worker_processes * worker_connections/4`，不能超过后面的`worker_rlimit_nofile`。当nginx作为http服务器时，计算公式里面是除以2。  \n- `worker_rlimit_nofile 10240`\n同时连接的数量,默认是没有设置，可以限制为操作系统最大的限制65535。  \n- `use epoll`\n写在events部分。在Linux操作系统下，nginx默认使用epoll事件模型,在操作系统不支持这些高效模型时才使用select。  \n\n### http服务器  \n与提供http服务相关的一些配置参数。例如：是否使用keepalive啊，是否使用gzip进行压缩等。  \n- `sendfile on`  \n开启高效文件传输模式，sendfile指令指定nginx是否调用sendfile函数来输出文件，减少用户空间到内核空间的上下文切换。对于普通应用设为 on，如果用来进行下载等应用磁盘IO重负载应用，可设置为off，以平衡磁盘与网络I/O处理速度，降低系统的负载。\n- `keepalive_timeout 65` : 长连接超时时间，单位是秒，这个参数很敏感，涉及浏览器的种类、后端服务器的超时设置、操作系统的设置，可以另外起一片文章了。长连接请求大量小文件的时候，可以减少重建连接的开销，但假如有大文件上传，65s内没上传完成会导致失败。如果设置时间过长，用户又多，长时间保持连接会占用大量资源。  \n- `send_timeout` : 用于指定响应客户端的超时时间。这个超时仅限于两个连接活动之间的时间，如果超过这个时间，客户端没有任何活动，Nginx将会关闭连接。\n- `client_max_body_size 10m`\n允许客户端请求的最大单文件字节数。如果有上传较大文件，请设置它的限制值  \n- `client_body_buffer_size 128k`\n缓冲区代理缓冲用户端请求的最大字节数  \n#### http_proxy\n- `proxy_connect_timeout 60`\nnginx跟后端服务器连接超时时间(代理连接超时)\n- `proxy_read_timeout 60`\n连接成功后，与后端服务器两个成功的响应操作之间超时时间(代理接收超时)\n- `proxy_buffer_size 4k`\n设置代理服务器（nginx）从后端realserver读取并保存用户头信息的缓冲区大小，默认与proxy_buffers大小相同，其实可以将这个指令值设的小一点\n- `proxy_buffers 4 32k`\nproxy_buffers缓冲区，nginx针对单个连接缓存来自后端realserver的响应，网页平均在32k以下的话，这样设置\n- `proxy_busy_buffers_size 64k`\n高负荷下缓冲大小（proxy_buffers*2）  \n- `proxy_max_temp_file_size`\n当proxy_buffers放不下后端服务器的响应内容时，会将一部分保存到硬盘的临时文件中，这个值用来设置最大临时文件大小，默认1024M，它与proxy_cache没有关系。大于这个值，将从upstream服务器传回。设置为0禁用。\n- `proxy_temp_file_write_size 64k`\n当缓存被代理的服务器响应到临时文件时，这个选项限制每次写临时文件的大小。\n- `proxy_pass`，proxy_redirect见 location 部分。\n#### http_gzip\n- `gzip on` : 开启gzip压缩输出，减少网络传输。\n- `gzip_min_length 1k `： 设置允许压缩的页面最小字节数，页面字节数从header头得content-length中进行获取。默认值是20。建议设置成大于1k的字节数，小于1k可能会越压越大。  \n- `gzip_buffers 4 16k `： 设置系统获取几个单位的缓存用于存储gzip的压缩结果数据流。4 16k代表以16k为单位，安装原始数据大小以16k为单位的4倍申请内存。  \n- `gzip_http_version 1.0` ： 用于识别 http 协议的版本，早期的浏览器不支持 Gzip 压缩，用户就会看到乱码，所以为了支持前期版本加上了这个选项，如果你用了 Nginx 的反向代理并期望也启用 Gzip 压缩的话，由于末端通信是 http/1.0，故请设置为 1.0。  \n- `gzip_comp_level 6` ： gzip压缩比，1压缩比最小处理速度最快，9压缩比最大但处理速度最慢(传输快但比较消耗cpu)  \n- `gzip_types` ：匹配mime类型进行压缩，无论是否指定,”text/html”类型总是会被压缩的。  \n- `gzip_proxied any` ： Nginx作为反向代理的时候启用，决定开启或者关闭后端服务器返回的结果是否压缩，匹配的前提是后端服务器必须要返回包含”Via”的 header头。  \n- `gzip_vary on `： 和http头有关系，会在响应头加个 Vary: Accept-Encoding ，可以让前端的缓存服务器缓存经过gzip压缩的页面，例如，用Squid缓存经过Nginx压缩的数据。   \n### server虚拟主机  \nhttp服务上支持若干虚拟主机。\n每个虚拟主机一个对应的server配置项，配置项里面包含该虚拟主机相关的配置。在提供mail服务的代理时，也可以建立若干server。每个server通过监听地址或端口来区分。  \n`listen`\n监听端口，默认80，小于1024的要以root启动。可以为listen *:80、listen 127.0.0.1:80等形式。  \n`server_name`\n服务器名，如`localhost`、`www.example.com`，可以通过正则匹配。\n\n###  location  \nhttp服务中，某些特定的URL对应的一系列配置项。    \n`root /var/www/html`\n定义服务器的默认网站根目录位置。如果locationURL匹配的是子目录或文件，root没什么作用，一般放在server指令里面或/下。    \n`index index.jsp index.html index.htm`\n定义路径下默认访问的文件名，一般跟着root放  \n`proxy_pass http:/backend`\n请求转向backend定义的服务器列表，即反向代理，对应upstream负载均衡器。也可以`proxy_pass http://ip:port`。 \n```\nproxy_redirect off;\nproxy_set_header Host $host;\nproxy_set_header X-Real-IP $remote_addr;\nproxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;\n```\n代理客户端真实信息到后端  \n### 其它  \n#### 访问控制 allow/deny\nNginx 的访问控制模块默认就会安装，而且写法也非常简单，可以分别有多个allow,deny，允许或禁止某个ip或ip段访问，依次满足任何一个规则就停止往下匹配。如：\n```\nlocation /nginx-status {\n  stub_status on;\n  access_log off;\n  allow 192.168.10.100;\n  allow 172.29.73.0/24;\n  deny all;\n}\n```\n#### 列出目录 autoindex\nNginx默认是不允许列出整个目录的。  \n如需此功能，打开nginx.conf文件，在location，server 或 http段中加入`autoindex on`;，另外两个参数最好也加上去:  \n`autoindex_exact_size off`; 默认为on，显示出文件的确切大小，单位是bytes。改为off后，显示出文件的大概大小，单位是kB或者MB或者GB  \n`autoindex_localtime on;`\n默认为off，显示的文件时间为GMT时间。改为on后，显示的文件时间为文件的服务器时间  \n```\nlocation /images {\n  root   /var/www/nginx-default/images;\n  autoindex on;\n  autoindex_exact_size off;\n  autoindex_localtime on;\n  }\n```\n', '<div class=\"toc\"><ul>\n<li><a href=\"#toc-0fa\">基础cmd</a></li>\n<li><a href=\"#toc-15c\">配置文件</a><ul>\n<li><a href=\"#toc-aa0\">通用</a></li>\n</ul>\n</li>\n<li><a href=\"#toc-390\">常用指令</a><ul>\n<li><a href=\"#toc-ef5\">main全局配置</a></li>\n<li><a href=\"#toc-6e1\">http服务器</a><ul>\n<li><a href=\"#http_proxy\">http_proxy</a></li>\n<li><a href=\"#http_gzip\">http_gzip</a></li>\n</ul>\n</li>\n<li><a href=\"#toc-bad\">server虚拟主机</a></li>\n<li><a href=\"#location\">location</a></li>\n<li><a href=\"#toc-5a0\">其它</a><ul>\n<li><a href=\"#toc-54a\">访问控制 allow/deny</a></li>\n<li><a href=\"#toc-b7d\">列出目录 autoindex</a></li>\n</ul>\n</li>\n</ul>\n</li>\n</ul>\n</div><h2><a id=\"toc-0fa\" class=\"anchor\" href=\"#toc-0fa\"></a>基础cmd</h2>\n<pre><code class=\"hljs lang-nginx\"><span class=\"hljs-attribute\">sudo</span> nginx <span class=\"hljs-comment\">#打开 nginx</span>\nnginx -s reload|reopen|stop|quit  <span class=\"hljs-comment\">#重新加载配置|重启|停止|退出 nginx</span>\nnginx -t   <span class=\"hljs-comment\">#测试配置是否有语法错误</span>\nnginx [-?hvVtq] [-s signal] [-c filename] [-p prefix] [-g directives]\n\n-?,-h           : 打开帮助信息\n-v              : 显示版本信息并退出\n-V              : 显示版本和配置选项信息，然后退出\n-t              : 检测配置文件是否有语法错误，然后退出\n-q              : 在检测配置文件期间屏蔽非错误信息\n-s signal       : 给一个 nginx 主进程发送信号：stop（停止）, quit（退出）, reopen（重启）, reload（重新加载配置文件）\n-p prefix       : 设置前缀路径\n-c filename     : 设置配置文件\n-g directives   : 设置配置文件外的全局指令\n</code></pre>\n<!--more-->\n<h2><a id=\"toc-15c\" class=\"anchor\" href=\"#toc-15c\"></a>配置文件</h2>\n<p><code>main</code>  全局设置<br> main部分设置的指令将影响其它所有部分的设置；<br><code>server</code>  主机设置<br>server部分的指令主要用于指定虚拟主机域名、IP和端口；<br><code>upstream</code>  上游服务器设置，主要为反向代理、负载均衡相关配置<br>upstream的指令用于设置一系列的后端服务器，设置反向代理及后端服务器的负载均衡；<br><code>location</code>  URL匹配特定位置后的设置<br>location部分用于匹配网页位置（比如，根目录“/”,“/images”,等等）  </p>\n<blockquote>\n<p>server继承main，location继承server；<br>upstream既不会继承指令也不会被继承。它有自己的特殊指令，不需要在其他地方的应用。</p>\n</blockquote>\n<h3><a id=\"toc-aa0\" class=\"anchor\" href=\"#toc-aa0\"></a>通用</h3>\n<p>下面的<code>nginx.conf</code>简单的实现nginx在前端做反向代理服务器的例子，处理js、png等静态文件，jsp等动态请求转发到其它服务器：</p>\n<pre><code class=\"hljs lang-nginx\"><span class=\"hljs-attribute\">user</span>  www www;\n<span class=\"hljs-attribute\">worker_processes</span>  <span class=\"hljs-number\">2</span>;\n<span class=\"hljs-attribute\">error_log</span>  logs/error.log;\n<span class=\"hljs-comment\">#error_log  logs/error.log  notice;</span>\n<span class=\"hljs-comment\">#error_log  logs/error.log  info;</span>\n<span class=\"hljs-attribute\">pid</span>        logs/nginx.pid;\n<span class=\"hljs-section\">events</span> {\n    <span class=\"hljs-attribute\">use</span> <span class=\"hljs-literal\">epoll</span>;\n    <span class=\"hljs-attribute\">worker_connections</span>  <span class=\"hljs-number\">2048</span>;\n}\n<span class=\"hljs-section\">http</span> {\n    <span class=\"hljs-attribute\">include</span>       mime.types;\n    <span class=\"hljs-attribute\">default_type</span>  application/octet-stream;\n\n    <span class=\"hljs-comment\">#log_format  main  \'$remote_addr - $remote_user [$time_local] \"$request\" \'</span>\n    <span class=\"hljs-comment\">#                  \'$status $body_bytes_sent \"$http_referer\" \'</span>\n    <span class=\"hljs-comment\">#                  \'\"$http_user_agent\" \"$http_x_forwarded_for\"\';</span>\n\n    <span class=\"hljs-comment\">#access_log  logs/access.log  main;</span>\n    <span class=\"hljs-attribute\">sendfile</span>        <span class=\"hljs-literal\">on</span>;\n    <span class=\"hljs-comment\"># tcp_nopush     on;</span>\n    <span class=\"hljs-attribute\">keepalive_timeout</span>  <span class=\"hljs-number\">65</span>;\n  <span class=\"hljs-comment\"># gzip压缩功能设置</span>\n    <span class=\"hljs-attribute\">gzip</span> <span class=\"hljs-literal\">on</span>;\n    <span class=\"hljs-attribute\">gzip_min_length</span> <span class=\"hljs-number\">1k</span>;\n    <span class=\"hljs-attribute\">gzip_buffers</span>    <span class=\"hljs-number\">4</span> <span class=\"hljs-number\">16k</span>;\n    <span class=\"hljs-attribute\">gzip_http_version</span> <span class=\"hljs-number\">1</span>.<span class=\"hljs-number\">0</span>;\n    <span class=\"hljs-attribute\">gzip_comp_level</span> <span class=\"hljs-number\">6</span>;\n    <span class=\"hljs-attribute\">gzip_types</span> text/html text/plain text/css text/javascript application/json application/javascript application/x-javascript application/xml;\n    <span class=\"hljs-attribute\">gzip_vary</span> <span class=\"hljs-literal\">on</span>;\n  <span class=\"hljs-comment\"># http_proxy 设置</span>\n    <span class=\"hljs-attribute\">client_max_body_size</span>   <span class=\"hljs-number\">10m</span>;\n    <span class=\"hljs-attribute\">client_body_buffer_size</span>   <span class=\"hljs-number\">128k</span>;\n    <span class=\"hljs-attribute\">proxy_connect_timeout</span>   <span class=\"hljs-number\">75</span>;\n    <span class=\"hljs-attribute\">proxy_send_timeout</span>   <span class=\"hljs-number\">75</span>;\n    <span class=\"hljs-attribute\">proxy_read_timeout</span>   <span class=\"hljs-number\">75</span>;\n    <span class=\"hljs-attribute\">proxy_buffer_size</span>   <span class=\"hljs-number\">4k</span>;\n    <span class=\"hljs-attribute\">proxy_buffers</span>   <span class=\"hljs-number\">4</span> <span class=\"hljs-number\">32k</span>;\n    <span class=\"hljs-attribute\">proxy_busy_buffers_size</span>   <span class=\"hljs-number\">64k</span>;\n    <span class=\"hljs-attribute\">proxy_temp_file_write_size</span>  <span class=\"hljs-number\">64k</span>;\n    <span class=\"hljs-attribute\">proxy_temp_path</span>   /usr/local/nginx/proxy_temp <span class=\"hljs-number\">1</span> <span class=\"hljs-number\">2</span>;\n  <span class=\"hljs-comment\"># 设定负载均衡后台服务器列表 </span>\n    <span class=\"hljs-attribute\">upstream</span>  backend  { \n              <span class=\"hljs-comment\">#ip_hash; </span>\n              <span class=\"hljs-attribute\">server</span>   <span class=\"hljs-number\">192.168.10.110:8000</span> max_fails=<span class=\"hljs-number\">2</span> fail_timeout=<span class=\"hljs-number\">30s</span> ;  \n              <span class=\"hljs-attribute\">server</span>   <span class=\"hljs-number\">192.168.10.100:8000</span> max_fails=<span class=\"hljs-number\">2</span> fail_timeout=<span class=\"hljs-number\">30s</span> ;  \n    }\n  <span class=\"hljs-comment\"># 虚拟主机配置</span>\n    <span class=\"hljs-section\">server</span> {\n        <span class=\"hljs-attribute\">listen</span>       <span class=\"hljs-number\">80</span>;\n        <span class=\"hljs-attribute\">server_name</span>  itoatest.example.com;\n        <span class=\"hljs-attribute\">root</span>   /apps/oaapp;\n        <span class=\"hljs-attribute\">charset</span> utf-<span class=\"hljs-number\">8</span>;\n        <span class=\"hljs-attribute\">access_log</span>  logs/host.access.log  main;\n        <span class=\"hljs-comment\">#对 / 所有做负载均衡+反向代理</span>\n        <span class=\"hljs-attribute\">location</span> / {\n            <span class=\"hljs-attribute\">root</span>   /apps/oaapp;\n            <span class=\"hljs-attribute\">index</span>  index.jsp index.html index.htm;\n            <span class=\"hljs-attribute\">proxy_pass</span>        http://backend;  \n            <span class=\"hljs-attribute\">proxy_redirect</span> <span class=\"hljs-literal\">off</span>;\n            <span class=\"hljs-comment\"># 后端的Web服务器可以通过X-Forwarded-For获取用户真实IP</span>\n            <span class=\"hljs-attribute\">proxy_set_header</span>  Host  <span class=\"hljs-variable\">$host</span>;\n            <span class=\"hljs-attribute\">proxy_set_header</span>  X-Real-IP  <span class=\"hljs-variable\">$remote_addr</span>;  \n            <span class=\"hljs-attribute\">proxy_set_header</span>  X-Forwarded-For  <span class=\"hljs-variable\">$proxy_add_x_forwarded_for</span>;\n            <span class=\"hljs-attribute\">proxy_next_upstream</span> <span class=\"hljs-literal\">error</span> timeout invalid_header http_500 http_502 http_503 http_504;\n        }\n        <span class=\"hljs-comment\">#静态文件，nginx自己处理，不去backend请求tomcat</span>\n        <span class=\"hljs-attribute\">location</span>  <span class=\"hljs-regexp\">~* /download/</span> {  \n            <span class=\"hljs-attribute\">root</span> /apps/oa/fs;  \n        }\n        <span class=\"hljs-attribute\">location</span> <span class=\"hljs-regexp\">~ .*\\.(gif|jpg|jpeg|bmp|png|ico|txt|js|css)$</span>   \n        {   \n            <span class=\"hljs-attribute\">root</span> /apps/oaapp;   \n            <span class=\"hljs-attribute\">expires</span>      <span class=\"hljs-number\">7d</span>; \n        }\n        <span class=\"hljs-attribute\">location</span> /nginx_status {\n            <span class=\"hljs-attribute\">stub_status</span> <span class=\"hljs-literal\">on</span>;\n            <span class=\"hljs-attribute\">access_log</span> <span class=\"hljs-literal\">off</span>;\n            <span class=\"hljs-attribute\">allow</span> <span class=\"hljs-number\">192.168.10.0</span>/<span class=\"hljs-number\">24</span>;\n            <span class=\"hljs-attribute\">deny</span> all;\n        }\n        <span class=\"hljs-attribute\">location</span> <span class=\"hljs-regexp\">~ ^/(WEB-INF)/</span> {   \n            <span class=\"hljs-attribute\">deny</span> all;   \n        }\n        <span class=\"hljs-comment\">#error_page  404              /404.html;</span>\n        <span class=\"hljs-comment\"># redirect server error pages to the static page /50x.html</span>\n        <span class=\"hljs-comment\">#</span>\n        <span class=\"hljs-attribute\">error_page</span>   <span class=\"hljs-number\">500</span> <span class=\"hljs-number\">502</span> <span class=\"hljs-number\">503</span> <span class=\"hljs-number\">504</span>  /50x.html;\n        <span class=\"hljs-attribute\">location</span> = /50x.html {\n            <span class=\"hljs-attribute\">root</span>   html;\n        }\n    }\n  <span class=\"hljs-comment\">## 其它虚拟主机，server 指令开始</span>\n}\n</code></pre><h2><a id=\"toc-390\" class=\"anchor\" href=\"#toc-390\"></a>常用指令</h2>\n<h3><a id=\"toc-ef5\" class=\"anchor\" href=\"#toc-ef5\"></a>main全局配置</h3>\n<p>nginx在运行时与具体业务功能（比如http服务或者email服务代理）无关的一些参数，比如工作进程数，运行的身份等。    </p>\n<ul>\n<li><code>woker_processes 2</code>\nworker角色的工作进程的个数，master进程是接收并分配请求给worker处理。这个数值简单一点可以设置为cpu的核数如果开启了ssl和gzip更应该设置成与逻辑CPU数量一样甚至为2倍，可以减少I/O操作。如果nginx服务器还有其它服务，可以考虑适当减少。  </li>\n<li><code>worker_connections 2048</code>\n写在events部分。每一个worker进程能并发处理（发起）的最大连接数（包含与客户端或后端被代理服务器间等所有连接数）。nginx作为反向代理服务器，计算公式 <code>最大连接数 = worker_processes * worker_connections/4</code>，不能超过后面的<code>worker_rlimit_nofile</code>。当nginx作为http服务器时，计算公式里面是除以2。  </li>\n<li><code>worker_rlimit_nofile 10240</code>\n同时连接的数量,默认是没有设置，可以限制为操作系统最大的限制65535。  </li>\n<li><code>use epoll</code>\n写在events部分。在Linux操作系统下，nginx默认使用epoll事件模型,在操作系统不支持这些高效模型时才使用select。  </li>\n</ul>\n<h3><a id=\"toc-6e1\" class=\"anchor\" href=\"#toc-6e1\"></a>http服务器</h3>\n<p>与提供http服务相关的一些配置参数。例如：是否使用keepalive啊，是否使用gzip进行压缩等。  </p>\n<ul>\n<li><code>sendfile on</code><br>开启高效文件传输模式，sendfile指令指定nginx是否调用sendfile函数来输出文件，减少用户空间到内核空间的上下文切换。对于普通应用设为 on，如果用来进行下载等应用磁盘IO重负载应用，可设置为off，以平衡磁盘与网络I/O处理速度，降低系统的负载。</li>\n<li><code>keepalive_timeout 65</code> : 长连接超时时间，单位是秒，这个参数很敏感，涉及浏览器的种类、后端服务器的超时设置、操作系统的设置，可以另外起一片文章了。长连接请求大量小文件的时候，可以减少重建连接的开销，但假如有大文件上传，65s内没上传完成会导致失败。如果设置时间过长，用户又多，长时间保持连接会占用大量资源。  </li>\n<li><code>send_timeout</code> : 用于指定响应客户端的超时时间。这个超时仅限于两个连接活动之间的时间，如果超过这个时间，客户端没有任何活动，Nginx将会关闭连接。</li>\n<li><code>client_max_body_size 10m</code>\n允许客户端请求的最大单文件字节数。如果有上传较大文件，请设置它的限制值  </li>\n<li><code>client_body_buffer_size 128k</code>\n缓冲区代理缓冲用户端请求的最大字节数  <h4><a id=\"http_proxy\" class=\"anchor\" href=\"#http_proxy\"></a>http_proxy</h4>\n</li>\n<li><code>proxy_connect_timeout 60</code>\nnginx跟后端服务器连接超时时间(代理连接超时)</li>\n<li><code>proxy_read_timeout 60</code>\n连接成功后，与后端服务器两个成功的响应操作之间超时时间(代理接收超时)</li>\n<li><code>proxy_buffer_size 4k</code>\n设置代理服务器（nginx）从后端realserver读取并保存用户头信息的缓冲区大小，默认与proxy_buffers大小相同，其实可以将这个指令值设的小一点</li>\n<li><code>proxy_buffers 4 32k</code>\nproxy_buffers缓冲区，nginx针对单个连接缓存来自后端realserver的响应，网页平均在32k以下的话，这样设置</li>\n<li><code>proxy_busy_buffers_size 64k</code>\n高负荷下缓冲大小（proxy_buffers*2）  </li>\n<li><code>proxy_max_temp_file_size</code>\n当proxy_buffers放不下后端服务器的响应内容时，会将一部分保存到硬盘的临时文件中，这个值用来设置最大临时文件大小，默认1024M，它与proxy_cache没有关系。大于这个值，将从upstream服务器传回。设置为0禁用。</li>\n<li><code>proxy_temp_file_write_size 64k</code>\n当缓存被代理的服务器响应到临时文件时，这个选项限制每次写临时文件的大小。</li>\n<li><code>proxy_pass</code>，proxy_redirect见 location 部分。<h4><a id=\"http_gzip\" class=\"anchor\" href=\"#http_gzip\"></a>http_gzip</h4>\n</li>\n<li><code>gzip on</code> : 开启gzip压缩输出，减少网络传输。</li>\n<li><code>gzip_min_length 1k</code>： 设置允许压缩的页面最小字节数，页面字节数从header头得content-length中进行获取。默认值是20。建议设置成大于1k的字节数，小于1k可能会越压越大。  </li>\n<li><code>gzip_buffers 4 16k</code>： 设置系统获取几个单位的缓存用于存储gzip的压缩结果数据流。4 16k代表以16k为单位，安装原始数据大小以16k为单位的4倍申请内存。  </li>\n<li><code>gzip_http_version 1.0</code> ： 用于识别 http 协议的版本，早期的浏览器不支持 Gzip 压缩，用户就会看到乱码，所以为了支持前期版本加上了这个选项，如果你用了 Nginx 的反向代理并期望也启用 Gzip 压缩的话，由于末端通信是 http/1.0，故请设置为 1.0。  </li>\n<li><code>gzip_comp_level 6</code> ： gzip压缩比，1压缩比最小处理速度最快，9压缩比最大但处理速度最慢(传输快但比较消耗cpu)  </li>\n<li><code>gzip_types</code> ：匹配mime类型进行压缩，无论是否指定,”text/html”类型总是会被压缩的。  </li>\n<li><code>gzip_proxied any</code> ： Nginx作为反向代理的时候启用，决定开启或者关闭后端服务器返回的结果是否压缩，匹配的前提是后端服务器必须要返回包含”Via”的 header头。  </li>\n<li><code>gzip_vary on</code>： 和http头有关系，会在响应头加个 Vary: Accept-Encoding ，可以让前端的缓存服务器缓存经过gzip压缩的页面，例如，用Squid缓存经过Nginx压缩的数据。   <h3><a id=\"toc-bad\" class=\"anchor\" href=\"#toc-bad\"></a>server虚拟主机</h3>\nhttp服务上支持若干虚拟主机。\n每个虚拟主机一个对应的server配置项，配置项里面包含该虚拟主机相关的配置。在提供mail服务的代理时，也可以建立若干server。每个server通过监听地址或端口来区分。<br><code>listen</code>\n监听端口，默认80，小于1024的要以root启动。可以为listen *:80、listen 127.0.0.1:80等形式。<br><code>server_name</code>\n服务器名，如<code>localhost</code>、<code>www.example.com</code>，可以通过正则匹配。</li>\n</ul>\n<h3><a id=\"location\" class=\"anchor\" href=\"#location\"></a>location</h3>\n<p>http服务中，某些特定的URL对应的一系列配置项。<br><code>root /var/www/html</code>\n定义服务器的默认网站根目录位置。如果locationURL匹配的是子目录或文件，root没什么作用，一般放在server指令里面或/下。<br><code>index index.jsp index.html index.htm</code>\n定义路径下默认访问的文件名，一般跟着root放<br><code>proxy_pass http:/backend</code>\n请求转向backend定义的服务器列表，即反向代理，对应upstream负载均衡器。也可以<code>proxy_pass http://ip:port</code>。 </p>\n<pre><code class=\"hljs lang-nginx\"><span class=\"hljs-attribute\">proxy_redirect</span> <span class=\"hljs-literal\">off</span>;\n<span class=\"hljs-attribute\">proxy_set_header</span> Host <span class=\"hljs-variable\">$host</span>;\n<span class=\"hljs-attribute\">proxy_set_header</span> X-Real-IP <span class=\"hljs-variable\">$remote_addr</span>;\n<span class=\"hljs-attribute\">proxy_set_header</span> X-Forwarded-For <span class=\"hljs-variable\">$proxy_add_x_forwarded_for</span>;\n</code></pre><p>代理客户端真实信息到后端  </p>\n<h3><a id=\"toc-5a0\" class=\"anchor\" href=\"#toc-5a0\"></a>其它</h3>\n<h4><a id=\"toc-54a\" class=\"anchor\" href=\"#toc-54a\"></a>访问控制 allow/deny</h4>\n<p>Nginx 的访问控制模块默认就会安装，而且写法也非常简单，可以分别有多个allow,deny，允许或禁止某个ip或ip段访问，依次满足任何一个规则就停止往下匹配。如：</p>\n<pre><code class=\"hljs lang-nginx\"><span class=\"hljs-attribute\">location</span> /nginx-status {\n  <span class=\"hljs-attribute\">stub_status</span> <span class=\"hljs-literal\">on</span>;\n  <span class=\"hljs-attribute\">access_log</span> <span class=\"hljs-literal\">off</span>;\n  <span class=\"hljs-attribute\">allow</span> <span class=\"hljs-number\">192.168.10.100</span>;\n  <span class=\"hljs-attribute\">allow</span> <span class=\"hljs-number\">172.29.73.0</span>/<span class=\"hljs-number\">24</span>;\n  <span class=\"hljs-attribute\">deny</span> all;\n}\n</code></pre><h4><a id=\"toc-b7d\" class=\"anchor\" href=\"#toc-b7d\"></a>列出目录 autoindex</h4>\n<p>Nginx默认是不允许列出整个目录的。<br>如需此功能，打开nginx.conf文件，在location，server 或 http段中加入<code>autoindex on</code>;，另外两个参数最好也加上去:<br><code>autoindex_exact_size off</code>; 默认为on，显示出文件的确切大小，单位是bytes。改为off后，显示出文件的大概大小，单位是kB或者MB或者GB<br><code>autoindex_localtime on;</code>\n默认为off，显示的文件时间为GMT时间。改为on后，显示的文件时间为文件的服务器时间  </p>\n<pre><code class=\"hljs lang-nginx\"><span class=\"hljs-attribute\">location</span> /images {\n  <span class=\"hljs-attribute\">root</span>   /var/www/nginx-default/images;\n  <span class=\"hljs-attribute\">autoindex</span> <span class=\"hljs-literal\">on</span>;\n  <span class=\"hljs-attribute\">autoindex_exact_size</span> <span class=\"hljs-literal\">off</span>;\n  <span class=\"hljs-attribute\">autoindex_localtime</span> <span class=\"hljs-literal\">on</span>;\n  }\n</code></pre>', '1', '2017-04-10 21:41:17', '2018-07-13 11:32:09', '1', '0', '{\"template\":\"\",\"push_sites\":[]}');
  INSERT INTO `post` VALUES ('14', '1', '1', '0', '3', 'beego环境搭建记录', 'beego-env', '<h3><a id=\"_0\"></a>课堂记录</h3>\n<pre><code class=\"lang-\">1.安装 git\n2.win + r =&gt;cmd\n3.go get github.com/astaxie/beego\n4.go get github.com/beego/bee\n5.添加环境变量 Path=&gt;GOPATH/bin\n6.在GOPATH/src 打开命令窗口(shift + 鼠标右键)\n7.bee new 项目名称\n8.liteIDE 打开项目\n9.双击main.go 点击 BR (build and run)\n10.浏览器打开输入 127.0.0.1:8080\n</code></pre>\n', '### 课堂记录\n```\n1.安装 git\n2.win + r =>cmd\n3.go get github.com/astaxie/beego\n4.go get github.com/beego/bee\n5.添加环境变量 Path=>GOPATH/bin\n6.在GOPATH/src 打开命令窗口(shift + 鼠标右键)\n7.bee new 项目名称\n8.liteIDE 打开项目\n9.双击main.go 点击 BR (build and run)\n10.浏览器打开输入 127.0.0.1:8080\n```\n<!--more-->\n![alt](/res/upimg/20170412/oCssNW8RjNPl0VmcCRzAX1-w.png)\n#### beego 官网\n[beego](https://beego.me/)\n### 安装beego\n`go get github.com/astaxie/beego`  \n** 若出现错误**  \n请删除 `github.com/astaxie/beego `后重新运行下载\n### 安装bee工具\n`go get github.com/beego/bee`\n> 安装成果后在`GOPATH/bin/`下会有bee.exe\n> 添加当前bin目录到path环境变量   \n\n###  测试结果\n在`GOPATH/src/`下打开控制台(shift+鼠标右键)\n运行 `bee new demo`  \n*  LiteIDE打开当前创建项目目录\n* 双击main.go 点击 BR(build and run)\n* 浏览器输入 `127.0.0.1:8080`  \n* 查看运行效果\n![alt](/res/upimg/20170412/fjA5-ulZlHHZpYVcIqgj2Y_D.png)', '<div class=\"toc\"><ul><li><a href=\"#toc__0\">课堂记录</a><ul><li><a href=\"#toc_beego__15\">beego 官网</a></li></ul></li><li><a href=\"#toc_beego_17\">安装beego</a></li><li><a href=\"#toc_bee_21\">安装bee工具</a></li><li><a href=\"#toc__26\">测试结果</a></li></ul></div><h3><a id=\"toc__0\"></a>课堂记录</h3>\n<pre><code class=\"lang-\">1.安装 git\n2.win + r =&gt;cmd\n3.go get github.com/astaxie/beego\n4.go get github.com/beego/bee\n5.添加环境变量 Path=&gt;GOPATH/bin\n6.在GOPATH/src 打开命令窗口(shift + 鼠标右键)\n7.bee new 项目名称\n8.liteIDE 打开项目\n9.双击main.go 点击 BR (build and run)\n10.浏览器打开输入 127.0.0.1:8080\n</code></pre>\n<!--more-->\n<p><img src=\"/res/upimg/20170412/oCssNW8RjNPl0VmcCRzAX1-w.png\" alt=\"alt\" /></p>\n<h4><a id=\"toc_beego__15\"></a>beego 官网</h4>\n<p><a href=\"https://beego.me/\" target=\"_blank\">beego</a></p>\n<h3><a id=\"toc_beego_17\"></a>安装beego</h3>\n<p><code>go get github.com/astaxie/beego</code><br />\n** 若出现错误**<br />\n请删除 <code>github.com/astaxie/beego</code>后重新运行下载</p>\n<h3><a id=\"toc_bee_21\"></a>安装bee工具</h3>\n<p><code>go get github.com/beego/bee</code></p>\n<blockquote>\n<p>安装成果后在<code>GOPATH/bin/</code>下会有bee.exe<br />\n添加当前bin目录到path环境变量</p>\n</blockquote>\n<h3><a id=\"toc__26\"></a>测试结果</h3>\n<p>在<code>GOPATH/src/</code>下打开控制台(shift+鼠标右键)<br />\n运行 <code>bee new demo</code></p>\n<ul>\n<li>LiteIDE打开当前创建项目目录</li>\n<li>双击main.go 点击 BR(build and run)</li>\n<li>浏览器输入 <code>127.0.0.1:8080</code></li>\n<li>查看运行效果<br />\n<img src=\"/res/upimg/20170412/fjA5-ulZlHHZpYVcIqgj2Y_D.png\" alt=\"alt\" /></li>\n</ul>\n', '0', '2017-04-12 14:32:22', '2017-10-30 10:45:46', '1', '0', '\"{\\\"template\\\":\\\"\\\",\\\"push_sites\\\":[]}\"');
  INSERT INTO `post` VALUES ('15', '1', '1', '0', '3', '关闭WannaCry勒索病毒可能利用的端口（135 137 138 139 445）', 'close-port', '<h3 id=\"-\">快速关闭办法</h3>\n<ol>\n<li>新建一个记事本文件  <strong> closePort.txt  </strong><br><img src=\"/res/upimg/20170515/IQ2PN0uf1a_zVtTZv46OJP4y.png\" alt=\"alt\"></li>\n<li>复制下面代码到txt文件中   </li>\n</ol>\n', '### 快速关闭办法\n1.  新建一个记事本文件  ** closePort.txt  **  \n![alt](/res/upimg/20170515/IQ2PN0uf1a_zVtTZv46OJP4y.png)\n2.  复制下面代码到txt文件中   \n<!--more-->\n代码\n```\necho close-port & netsh firewall set opmode mode = enable & netsh advfirewall firewall add rule name = \"Disable port 135 - TCP\" dir = in action = block protocol = TCP localport = 135 & netsh advfirewall firewall add rule name = \"Disable port 135 - UDP\" dir = in action = block protocol = UDP localport = 135 & netsh advfirewall firewall add rule name = \"Disable port 137 - TCP\" dir = in action = block protocol = TCP localport = 137 & netsh advfirewall firewall add rule name = \"Disable port 137 - UDP\" dir = in action = block protocol = UDP localport = 137 & netsh advfirewall firewall add rule name = \"Disable port 138 - TCP\" dir = in action = block protocol = TCP localport = 138 & netsh advfirewall firewall add rule name = \"Disable port 138 - UDP\" dir = in action = block protocol = UDP localport = 138 & netsh advfirewall firewall add rule name = \"Disable port 139 - TCP\" dir = in action = block protocol = TCP localport = 139 & netsh advfirewall firewall add rule name = \"Disable port 139 - UDP\" dir = in action = block protocol = UDP localport = 139 & netsh advfirewall firewall add rule name = \"Disable port 445 - TCP\" dir = in action = block protocol = TCP localport = 445 & netsh advfirewall firewall add rule name = \"Disable port 445 - UDP\" dir = in action = block protocol = UDP localport = 445\n```\n效果  \n![alt](/res/upimg/20170515/2PK9M051NKqZD0yPin-gPxkX.png)  \n\n3.  修改文件名称为 **closePort.bat ** (主要是后缀名)  \n![alt](/res/upimg/20170515/gQrMZQEyFbFlZkeq6NtS2J0O.png)\n\n![alt](/res/upimg/20170515/lt4t3fMXOR29omI8RfB5EtmK.png)\n4. 单击鼠标右键管理员运行  \n![alt](/res/upimg/20170515/-rJbkogIPeITNbjgZBeQfK9w.png)\n5. 关闭成功  \n![alt](/res/upimg/20170515/u-H5Q2xx3T0y9qHd0MiYyyv7.png)\n![alt](/res/upimg/20170515/X9QBH7c7IXs-z3ia-ebR9R2I.png)  \n\n###  上面的步骤麻烦？  \n1. 直接下载  \n[点击下载](/res/upimg/20170515/closePort.bat)\n2. 管理员运行  \n![alt](/res/upimg/20170515/-rJbkogIPeITNbjgZBeQfK9w.png)  \n\n### 不想下载东西？\n1. win + x  \n![alt](/res/upimg/20170516/BZtdLS6-QBf8c6KRMLGf7Kvr.png)\n2. 命令提示符(管理员)(A)  \n![alt](/res/upimg/20170516/XlZ2iq2ux4LGEebMnMWjiHwz.png)\n3. 复制上面的代码 > 粘贴 > 回车 \n![alt](/res/upimg/20170516/TmBGzJuaSAKHoAyRi6lV5cUS.png)\n4. 关闭成功  \n![alt](/res/upimg/20170515/u-H5Q2xx3T0y9qHd0MiYyyv7.png)\n![alt](/res/upimg/20170515/X9QBH7c7IXs-z3ia-ebR9R2I.png)  ', '<div class=\"toc\"><ul>\n<li><a href=\"#toc-2f3\">快速关闭办法</a></li>\n<li><a href=\"#toc-120\">上面的步骤麻烦？</a></li>\n<li><a href=\"#toc-023\">不想下载东西？</a></li>\n</ul>\n</div><h3><a id=\"toc-2f3\" class=\"anchor\" href=\"#toc-2f3\"></a>快速关闭办法</h3>\n<ol>\n<li>新建一个记事本文件  <strong> closePort.txt  </strong><br><img src=\"/res/upimg/20170515/IQ2PN0uf1a_zVtTZv46OJP4y.png\" alt=\"alt\"></li>\n<li><p>复制下面代码到txt文件中   </p>\n<!--more-->\n<p>代码</p>\n<pre><code class=\"hljs lang-nix\">echo close-port &amp; netsh firewall set opmode <span class=\"hljs-attr\">mode</span> = enable &amp; netsh advfirewall firewall add rule <span class=\"hljs-attr\">name</span> = <span class=\"hljs-string\">\"Disable port 135 - TCP\"</span> <span class=\"hljs-attr\">dir</span> = <span class=\"hljs-keyword\">in</span> <span class=\"hljs-attr\">action</span> = block <span class=\"hljs-attr\">protocol</span> = TCP <span class=\"hljs-attr\">localport</span> = <span class=\"hljs-number\">135</span> &amp; netsh advfirewall firewall add rule <span class=\"hljs-attr\">name</span> = <span class=\"hljs-string\">\"Disable port 135 - UDP\"</span> <span class=\"hljs-attr\">dir</span> = <span class=\"hljs-keyword\">in</span> <span class=\"hljs-attr\">action</span> = block <span class=\"hljs-attr\">protocol</span> = UDP <span class=\"hljs-attr\">localport</span> = <span class=\"hljs-number\">135</span> &amp; netsh advfirewall firewall add rule <span class=\"hljs-attr\">name</span> = <span class=\"hljs-string\">\"Disable port 137 - TCP\"</span> <span class=\"hljs-attr\">dir</span> = <span class=\"hljs-keyword\">in</span> <span class=\"hljs-attr\">action</span> = block <span class=\"hljs-attr\">protocol</span> = TCP <span class=\"hljs-attr\">localport</span> = <span class=\"hljs-number\">137</span> &amp; netsh advfirewall firewall add rule <span class=\"hljs-attr\">name</span> = <span class=\"hljs-string\">\"Disable port 137 - UDP\"</span> <span class=\"hljs-attr\">dir</span> = <span class=\"hljs-keyword\">in</span> <span class=\"hljs-attr\">action</span> = block <span class=\"hljs-attr\">protocol</span> = UDP <span class=\"hljs-attr\">localport</span> = <span class=\"hljs-number\">137</span> &amp; netsh advfirewall firewall add rule <span class=\"hljs-attr\">name</span> = <span class=\"hljs-string\">\"Disable port 138 - TCP\"</span> <span class=\"hljs-attr\">dir</span> = <span class=\"hljs-keyword\">in</span> <span class=\"hljs-attr\">action</span> = block <span class=\"hljs-attr\">protocol</span> = TCP <span class=\"hljs-attr\">localport</span> = <span class=\"hljs-number\">138</span> &amp; netsh advfirewall firewall add rule <span class=\"hljs-attr\">name</span> = <span class=\"hljs-string\">\"Disable port 138 - UDP\"</span> <span class=\"hljs-attr\">dir</span> = <span class=\"hljs-keyword\">in</span> <span class=\"hljs-attr\">action</span> = block <span class=\"hljs-attr\">protocol</span> = UDP <span class=\"hljs-attr\">localport</span> = <span class=\"hljs-number\">138</span> &amp; netsh advfirewall firewall add rule <span class=\"hljs-attr\">name</span> = <span class=\"hljs-string\">\"Disable port 139 - TCP\"</span> <span class=\"hljs-attr\">dir</span> = <span class=\"hljs-keyword\">in</span> <span class=\"hljs-attr\">action</span> = block <span class=\"hljs-attr\">protocol</span> = TCP <span class=\"hljs-attr\">localport</span> = <span class=\"hljs-number\">139</span> &amp; netsh advfirewall firewall add rule <span class=\"hljs-attr\">name</span> = <span class=\"hljs-string\">\"Disable port 139 - UDP\"</span> <span class=\"hljs-attr\">dir</span> = <span class=\"hljs-keyword\">in</span> <span class=\"hljs-attr\">action</span> = block <span class=\"hljs-attr\">protocol</span> = UDP <span class=\"hljs-attr\">localport</span> = <span class=\"hljs-number\">139</span> &amp; netsh advfirewall firewall add rule <span class=\"hljs-attr\">name</span> = <span class=\"hljs-string\">\"Disable port 445 - TCP\"</span> <span class=\"hljs-attr\">dir</span> = <span class=\"hljs-keyword\">in</span> <span class=\"hljs-attr\">action</span> = block <span class=\"hljs-attr\">protocol</span> = TCP <span class=\"hljs-attr\">localport</span> = <span class=\"hljs-number\">445</span> &amp; netsh advfirewall firewall add rule <span class=\"hljs-attr\">name</span> = <span class=\"hljs-string\">\"Disable port 445 - UDP\"</span> <span class=\"hljs-attr\">dir</span> = <span class=\"hljs-keyword\">in</span> <span class=\"hljs-attr\">action</span> = block <span class=\"hljs-attr\">protocol</span> = UDP <span class=\"hljs-attr\">localport</span> = <span class=\"hljs-number\">445</span>\n</code></pre><p>效果<br><img src=\"/res/upimg/20170515/2PK9M051NKqZD0yPin-gPxkX.png\" alt=\"alt\">  </p>\n</li>\n<li><p>修改文件名称为 <strong>closePort.bat </strong> (主要是后缀名)<br><img src=\"/res/upimg/20170515/gQrMZQEyFbFlZkeq6NtS2J0O.png\" alt=\"alt\"></p>\n</li>\n</ol>\n<p><img src=\"/res/upimg/20170515/lt4t3fMXOR29omI8RfB5EtmK.png\" alt=\"alt\"></p>\n<ol>\n<li>单击鼠标右键管理员运行<br><img src=\"/res/upimg/20170515/-rJbkogIPeITNbjgZBeQfK9w.png\" alt=\"alt\"></li>\n<li>关闭成功<br><img src=\"/res/upimg/20170515/u-H5Q2xx3T0y9qHd0MiYyyv7.png\" alt=\"alt\">\n<img src=\"/res/upimg/20170515/X9QBH7c7IXs-z3ia-ebR9R2I.png\" alt=\"alt\">  </li>\n</ol>\n<h3><a id=\"toc-120\" class=\"anchor\" href=\"#toc-120\"></a>上面的步骤麻烦？</h3>\n<ol>\n<li>直接下载<br><a href=\"/res/upimg/20170515/closePort.bat\">点击下载</a></li>\n<li>管理员运行<br><img src=\"/res/upimg/20170515/-rJbkogIPeITNbjgZBeQfK9w.png\" alt=\"alt\">  </li>\n</ol>\n<h3><a id=\"toc-023\" class=\"anchor\" href=\"#toc-023\"></a>不想下载东西？</h3>\n<ol>\n<li>win + x<br><img src=\"/res/upimg/20170516/BZtdLS6-QBf8c6KRMLGf7Kvr.png\" alt=\"alt\"></li>\n<li>命令提示符(管理员)(A)<br><img src=\"/res/upimg/20170516/XlZ2iq2ux4LGEebMnMWjiHwz.png\" alt=\"alt\"></li>\n<li>复制上面的代码 &gt; 粘贴 &gt; 回车 \n<img src=\"/res/upimg/20170516/TmBGzJuaSAKHoAyRi6lV5cUS.png\" alt=\"alt\"></li>\n<li>关闭成功<br><img src=\"/res/upimg/20170515/u-H5Q2xx3T0y9qHd0MiYyyv7.png\" alt=\"alt\">\n<img src=\"/res/upimg/20170515/X9QBH7c7IXs-z3ia-ebR9R2I.png\" alt=\"alt\">  </li>\n</ol>\n', '1', '2017-05-15 19:47:14', '2017-11-04 10:37:19', '1', '0', '{\"template\":\"\",\"push_sites\":[]}');
  INSERT INTO `post` VALUES ('16', '1', '0', '0', '3', 'window10子系统', 'win-linux', '<h3 id=\"-linux-\">安装linux子系统</h3>\n<p>1.打开程序和功能<br>2.cmd 输入 <code>bash</code><br>3.y</p>\n', '### 安装linux子系统\n1.打开程序和功能  \n2.cmd 输入 ```bash```  \n3.y\n\n<!--more-->\n### 卸载linux子系统\n1.cmd 输入``` lxrun /uninstall /full ```  \n2.y \n[常用命令](http://www.daniubiji.cn/archives/25)\n', '<div class=\"toc\"><ul>\n<li><a href=\"#toc-541\">安装linux子系统</a></li>\n<li><a href=\"#toc-fdd\">卸载linux子系统</a></li>\n</ul>\n</div><h3><a id=\"toc-541\" class=\"anchor\" href=\"#toc-541\"></a>安装linux子系统</h3>\n<p>1.打开程序和功能<br>2.cmd 输入 <code>bash</code><br>3.y</p>\n<!--more-->\n<h3><a id=\"toc-fdd\" class=\"anchor\" href=\"#toc-fdd\"></a>卸载linux子系统</h3>\n<p>1.cmd 输入<code>lxrun /uninstall /full</code><br>2.y \n<a href=\"http://www.daniubiji.cn/archives/25\">常用命令</a></p>\n', '1', '2017-05-26 17:12:44', '2017-05-26 17:15:07', '1', '0', '\"{\\\"template\\\":\\\"\\\",\\\"push_sites\\\":[]}\"');
  INSERT INTO `post` VALUES ('17', '1', '3', '0', '3', 'tips 各种小记录', 'tips', '<h3 id=\"hide-win\">hide win</h3>\n<pre><code class=\"hljs lang-armasm\"><span class=\"hljs-symbol\">go</span> <span class=\"hljs-keyword\">build </span>-ldflags <span class=\"hljs-string\">\"-H windowsgui\"</span>\n</code></pre><h3 id=\"npm\">npm</h3>\n<pre><code class=\"hljs lang-taggerscript\">prefix = D:<span class=\"hljs-symbol\">\\P</span>rogram Files<span class=\"hljs-symbol\">\\n</span>odejs<span class=\"hljs-symbol\">\\n</span>ode_global\ncache = D:<span class=\"hljs-symbol\">\\P</span>rogram Files<span class=\"hljs-symbol\">\\n</span>odejs<span class=\"hljs-symbol\">\\n</span>ode_cache\n</code></pre><h3 id=\"cnpm\">cnpm</h3>\n<pre><code class=\"hljs lang-coffeescript\"><span class=\"hljs-built_in\">npm</span> install -g cnpm --registry=https:<span class=\"hljs-regexp\">//</span>registry.<span class=\"hljs-built_in\">npm</span>.taobao.org\n</code></pre><p>install git </p>\n<pre><code class=\"hljs lang-routeros\">sudo apt-<span class=\"hljs-builtin-name\">get</span> install git git-core git-doc\n</code></pre><h2 id=\"node\">node</h2>\n<pre><code class=\"hljs lang-coffeescript\"><span class=\"hljs-built_in\">npm</span> install --registry=https:<span class=\"hljs-regexp\">//</span>registry.<span class=\"hljs-built_in\">npm</span>.taobao.org\n</code></pre><p>prod</p>\n<blockquote>\n<p>npm run webpack.build.production</p>\n</blockquote>\n', '### hide win\n```\ngo build -ldflags \"-H windowsgui\"\n``` \n### npm \n```\nprefix = D:\\Program Files\\nodejs\\node_global\ncache = D:\\Program Files\\nodejs\\node_cache\n```\n### cnpm \n```\nnpm install -g cnpm --registry=https://registry.npm.taobao.org\n```\n\ninstall git \n```\nsudo apt-get install git git-core git-doc\n```\n## node\n\n```\nnpm install --registry=https://registry.npm.taobao.org\n```\nprod\n> npm run webpack.build.production\n\n<!--more-->\ndev\n> npm run webpack\n\nthinkjs\n\n> 前执行 `npm run compile `命令，将 src/ 目录编译到 app/ 目录，然后将 app/ 目录下的文件上线\n\n### mysql \n `uid:pass@tcp(host:port)/dbname?charset=utf8mb4&parseTime=true`\n\n### jquery\n1. `$(\'#id\').siblings()` 当前元素所有的兄弟节点\n2. `$(\'#id\').prev()`当前元素前一个兄弟节点\n3. `$(\'#id\').prevaAll()`当前元素之前所有的兄弟节点\n4. `$(\'#id\').next()`当前元素之后第一个兄弟节点\n5. `$(\'#id\').nextAll()` 当前元素之后所有的兄弟节点\\\n\n### caddy \n`-service install -name caddy -agree -log \"E:\\Caddy\\logs\\caddy.log\" -conf \"E:\\Caddy\\conf\"  -email \"zxysilent@foxmail.com\"`\n\n### mysql\n```sql\nupdat 数据表名 SET 字段名 = replac(字段名, \'要替换的字符串\', \'替换为\') wher 设定条件;\n```\n\n### vue \n\nrender \n\n``` js\n{\n  // 和`v-bind:class`一样的 API\n  \'class\': {\n    foo: true,\n    bar: false\n  },\n  // 和`v-bind:style`一样的 API\n  style: {\n    color: \'red\',\n    fontSize: \'14px\'\n  },\n  // 正常的 HTML 特性\n  attrs: {\n    id: \'foo\'\n  },\n  // 组件 props\n  props: {\n    myProp: \'bar\'\n  },\n  // DOM 属性\n  domProps: {\n    innerHTML: \'baz\'\n  },\n  // 事件监听器基于 `on`\n  // 所以不再支持如 `v-on:keyup.enter` 修饰器\n  // 需要手动匹配 keyCode。\n  on: {\n    click: this.clickHandler\n  },\n  // 仅对于组件，用于监听原生事件，而不是组件内部使用 `vm.$emit` 触发的事件。\n  nativeOn: {\n    click: this.nativeClickHandler\n  },\n  // 自定义指令。注意事项：不能对绑定的旧值设值\n  // Vue 会为您持续追踪\n  directives: [\n    {\n      name: \'my-custom-directive\',\n      value: \'2\',\n      expression: \'1 + 1\',\n      arg: \'foo\',\n      modifiers: {\n        bar: true\n      }\n    }\n  ],\n  // Scoped slots in the form of\n  // { name: props => VNode | Array<VNode> }\n  scopedSlots: {\n    default: props => createElement(\'span\', props.text)\n  },\n  // 如果组件是其他组件的子组件，需为插槽指定名称\n  slot: \'name-of-slot\',\n  // 其他特殊顶层属性\n  key: \'myKey\',\n  ref: \'myRef\'\n}\n```\n', '<div class=\"toc\"><ul>\n<li><a href=\"#hidewin\">hide win</a></li>\n<li><a href=\"#npm\">npm</a></li>\n<li><a href=\"#cnpm\">cnpm</a><ul>\n<li><a href=\"#node\">node</a></li>\n</ul>\n</li>\n<li><a href=\"#mysql\">mysql</a></li>\n<li><a href=\"#jquery\">jquery</a></li>\n<li><a href=\"#caddy\">caddy</a></li>\n<li><a href=\"#mysql\">mysql</a></li>\n<li><a href=\"#vue\">vue</a></li>\n</ul>\n</div><h3><a id=\"hidewin\" class=\"anchor\" href=\"#hidewin\"></a>hide win</h3>\n<pre><code class=\"hljs lang-armasm\"><span class=\"hljs-symbol\">go</span> <span class=\"hljs-keyword\">build </span>-ldflags <span class=\"hljs-string\">\"-H windowsgui\"</span>\n</code></pre><h3><a id=\"npm\" class=\"anchor\" href=\"#npm\"></a>npm</h3>\n<pre><code class=\"hljs lang-taggerscript\">prefix = D:<span class=\"hljs-symbol\">\\P</span>rogram Files<span class=\"hljs-symbol\">\\n</span>odejs<span class=\"hljs-symbol\">\\n</span>ode_global\ncache = D:<span class=\"hljs-symbol\">\\P</span>rogram Files<span class=\"hljs-symbol\">\\n</span>odejs<span class=\"hljs-symbol\">\\n</span>ode_cache\n</code></pre><h3><a id=\"cnpm\" class=\"anchor\" href=\"#cnpm\"></a>cnpm</h3>\n<pre><code class=\"hljs lang-coffeescript\"><span class=\"hljs-built_in\">npm</span> install -g cnpm --registry=https:<span class=\"hljs-regexp\">//</span>registry.<span class=\"hljs-built_in\">npm</span>.taobao.org\n</code></pre><p>install git </p>\n<pre><code class=\"hljs lang-routeros\">sudo apt-<span class=\"hljs-builtin-name\">get</span> install git git-core git-doc\n</code></pre><h2><a id=\"node\" class=\"anchor\" href=\"#node\"></a>node</h2>\n<pre><code class=\"hljs lang-coffeescript\"><span class=\"hljs-built_in\">npm</span> install --registry=https:<span class=\"hljs-regexp\">//</span>registry.<span class=\"hljs-built_in\">npm</span>.taobao.org\n</code></pre><p>prod</p>\n<blockquote>\n<p>npm run webpack.build.production</p>\n</blockquote>\n<!--more-->\n<p>dev</p>\n<blockquote>\n<p>npm run webpack</p>\n</blockquote>\n<p>thinkjs</p>\n<blockquote>\n<p>前执行 <code>npm run compile</code>命令，将 src/ 目录编译到 app/ 目录，然后将 app/ 目录下的文件上线</p>\n</blockquote>\n<h3><a id=\"mysql\" class=\"anchor\" href=\"#mysql\"></a>mysql</h3>\n<p> <code>uid:pass@tcp(host:port)/dbname?charset=utf8mb4&amp;parseTime=true</code></p>\n<h3><a id=\"jquery\" class=\"anchor\" href=\"#jquery\"></a>jquery</h3>\n<ol>\n<li><code>$(&#39;#id&#39;).siblings()</code> 当前元素所有的兄弟节点</li>\n<li><code>$(&#39;#id&#39;).prev()</code>当前元素前一个兄弟节点</li>\n<li><code>$(&#39;#id&#39;).prevaAll()</code>当前元素之前所有的兄弟节点</li>\n<li><code>$(&#39;#id&#39;).next()</code>当前元素之后第一个兄弟节点</li>\n<li><code>$(&#39;#id&#39;).nextAll()</code> 当前元素之后所有的兄弟节点\\</li>\n</ol>\n<h3><a id=\"caddy\" class=\"anchor\" href=\"#caddy\"></a>caddy</h3>\n<p><code>-service install -name caddy -agree -log &quot;E:\\Caddy\\logs\\caddy.log&quot; -conf &quot;E:\\Caddy\\conf&quot;  -email &quot;zxysilent@foxmail.com&quot;</code></p>\n<h3><a id=\"mysql\" class=\"anchor\" href=\"#mysql\"></a>mysql</h3>\n<pre><code class=\"hljs lang-sql\">updat 数据表名 <span class=\"hljs-keyword\">SET</span> 字段名 = replac(字段名, <span class=\"hljs-string\">\'要替换的字符串\'</span>, <span class=\"hljs-string\">\'替换为\'</span>) wher 设定条件;\n</code></pre>\n<h3><a id=\"vue\" class=\"anchor\" href=\"#vue\"></a>vue</h3>\n<p>render </p>\n<pre><code class=\"hljs lang-js\">{\n  <span class=\"hljs-comment\">// 和`v-bind:class`一样的 API</span>\n  <span class=\"hljs-string\">\'class\'</span>: {\n    <span class=\"hljs-attr\">foo</span>: <span class=\"hljs-literal\">true</span>,\n    <span class=\"hljs-attr\">bar</span>: <span class=\"hljs-literal\">false</span>\n  },\n  <span class=\"hljs-comment\">// 和`v-bind:style`一样的 API</span>\n  style: {\n    <span class=\"hljs-attr\">color</span>: <span class=\"hljs-string\">\'red\'</span>,\n    <span class=\"hljs-attr\">fontSize</span>: <span class=\"hljs-string\">\'14px\'</span>\n  },\n  <span class=\"hljs-comment\">// 正常的 HTML 特性</span>\n  attrs: {\n    <span class=\"hljs-attr\">id</span>: <span class=\"hljs-string\">\'foo\'</span>\n  },\n  <span class=\"hljs-comment\">// 组件 props</span>\n  props: {\n    <span class=\"hljs-attr\">myProp</span>: <span class=\"hljs-string\">\'bar\'</span>\n  },\n  <span class=\"hljs-comment\">// DOM 属性</span>\n  domProps: {\n    <span class=\"hljs-attr\">innerHTML</span>: <span class=\"hljs-string\">\'baz\'</span>\n  },\n  <span class=\"hljs-comment\">// 事件监听器基于 `on`</span>\n  <span class=\"hljs-comment\">// 所以不再支持如 `v-on:keyup.enter` 修饰器</span>\n  <span class=\"hljs-comment\">// 需要手动匹配 keyCode。</span>\n  on: {\n    <span class=\"hljs-attr\">click</span>: <span class=\"hljs-keyword\">this</span>.clickHandler\n  },\n  <span class=\"hljs-comment\">// 仅对于组件，用于监听原生事件，而不是组件内部使用 `vm.$emit` 触发的事件。</span>\n  nativeOn: {\n    <span class=\"hljs-attr\">click</span>: <span class=\"hljs-keyword\">this</span>.nativeClickHandler\n  },\n  <span class=\"hljs-comment\">// 自定义指令。注意事项：不能对绑定的旧值设值</span>\n  <span class=\"hljs-comment\">// Vue 会为您持续追踪</span>\n  directives: [\n    {\n      <span class=\"hljs-attr\">name</span>: <span class=\"hljs-string\">\'my-custom-directive\'</span>,\n      <span class=\"hljs-attr\">value</span>: <span class=\"hljs-string\">\'2\'</span>,\n      <span class=\"hljs-attr\">expression</span>: <span class=\"hljs-string\">\'1 + 1\'</span>,\n      <span class=\"hljs-attr\">arg</span>: <span class=\"hljs-string\">\'foo\'</span>,\n      <span class=\"hljs-attr\">modifiers</span>: {\n        <span class=\"hljs-attr\">bar</span>: <span class=\"hljs-literal\">true</span>\n      }\n    }\n  ],\n  <span class=\"hljs-comment\">// Scoped slots in the form of</span>\n  <span class=\"hljs-comment\">// { name: props =&gt; VNode | Array&lt;VNode&gt; }</span>\n  scopedSlots: {\n    <span class=\"hljs-attr\">default</span>: <span class=\"hljs-function\"><span class=\"hljs-params\">props</span> =&gt;</span> createElement(<span class=\"hljs-string\">\'span\'</span>, props.text)\n  },\n  <span class=\"hljs-comment\">// 如果组件是其他组件的子组件，需为插槽指定名称</span>\n  slot: <span class=\"hljs-string\">\'name-of-slot\'</span>,\n  <span class=\"hljs-comment\">// 其他特殊顶层属性</span>\n  key: <span class=\"hljs-string\">\'myKey\'</span>,\n  <span class=\"hljs-attr\">ref</span>: <span class=\"hljs-string\">\'myRef\'</span>\n}\n</code></pre>\n', '1', '2017-06-18 12:34:02', '2018-08-31 16:17:00', '1', '0', '{\"template\":\"\",\"push_sites\":[]}');
  INSERT INTO `post` VALUES ('18', '1', '1', '0', '3', 'git提交数据到github', 'git-to-github', '<h3 id=\"1-git\">1.设置Git</h3>\n<pre><code class=\"hljs lang-routeros\">git<span class=\"hljs-built_in\"> config </span>--global user.name <span class=\"hljs-string\">\"zxysilent\"</span>\n\ngit<span class=\"hljs-built_in\"> config </span>--global user.email <span class=\"hljs-string\">\"zxysilent@foxmail.com\"</span>  \n</code></pre><h3 id=\"2-\">2.初始化本地仓库</h3>\n<pre><code class=\"hljs lang-ebnf\"><span class=\"hljs-attribute\">git init</span>\n</code></pre><h3 id=\"3-\">3.编写文件并添加到缓存区</h3>\n', '### 1.设置Git\n```\ngit config --global user.name \"zxysilent\"\n\ngit config --global user.email \"zxysilent@foxmail.com\"  \n```\n### 2.初始化本地仓库\n```\ngit init\n```\n### 3.编写文件并添加到缓存区\n\n<!--more-->\n```\ngit add -A\n```\n### 4.提交到本地仓库\n```\ngit commit  -m \"提交备注信息\"\n```\n### 5.添加github 地址\n```\ngit remote add origin https://github.com/zxysilent/ueditor.git\n```\n### 6.提交到github(master分支)\n```\ngit push origin master  \n```\n', '<div class=\"toc\"><ul>\n<li><a href=\"#toc-156\">1.设置Git</a></li>\n<li><a href=\"#toc-a49\">2.初始化本地仓库</a></li>\n<li><a href=\"#toc-7bb\">3.编写文件并添加到缓存区</a></li>\n<li><a href=\"#toc-99e\">4.提交到本地仓库</a></li>\n<li><a href=\"#toc-b9c\">5.添加github 地址</a></li>\n<li><a href=\"#toc-708\">6.提交到github(master分支)</a></li>\n</ul>\n</div><h3><a id=\"toc-156\" class=\"anchor\" href=\"#toc-156\"></a>1.设置Git</h3>\n<pre><code class=\"hljs lang-stylus\">git config --global user<span class=\"hljs-selector-class\">.name</span> <span class=\"hljs-string\">\"zxysilent\"</span>\n\ngit config --global user<span class=\"hljs-selector-class\">.email</span> <span class=\"hljs-string\">\"zxysilent@foxmail.com\"</span>\n</code></pre><h3><a id=\"toc-a49\" class=\"anchor\" href=\"#toc-a49\"></a>2.初始化本地仓库</h3>\n<pre><code class=\"hljs lang-ebnf\"><span class=\"hljs-attribute\">git init</span>\n</code></pre><h3><a id=\"toc-7bb\" class=\"anchor\" href=\"#toc-7bb\"></a>3.编写文件并添加到缓存区</h3>\n<!--more-->\n<pre><code class=\"hljs lang-dockerfile\">git <span class=\"hljs-keyword\">add</span><span class=\"bash\"> -A\n</span></code></pre><h3><a id=\"toc-99e\" class=\"anchor\" href=\"#toc-99e\"></a>4.提交到本地仓库</h3>\n<pre><code class=\"hljs lang-nginx\"><span class=\"hljs-attribute\">git</span> commit  -m <span class=\"hljs-string\">\"提交备注信息\"</span>\n</code></pre><h3><a id=\"toc-b9c\" class=\"anchor\" href=\"#toc-b9c\"></a>5.添加github 地址</h3>\n<pre><code class=\"hljs lang-dockerfile\">git remote <span class=\"hljs-keyword\">add</span><span class=\"bash\"> origin https://github.com/zxysilent/ueditor.git\n</span></code></pre><h3><a id=\"toc-708\" class=\"anchor\" href=\"#toc-708\"></a>6.提交到github(master分支)</h3>\n<pre><code class=\"hljs lang-crmsh\">git push origin <span class=\"hljs-keyword\">master</span>\n<span class=\"hljs-title\"></span></code></pre>', '1', '2017-06-29 20:28:27', '2017-07-14 17:57:19', '1', '0', '\"{\\\"template\\\":\\\"\\\",\\\"push_sites\\\":[]}\"');
  INSERT INTO `post` VALUES ('19', '1', '1', '0', '3', 'go web 开发', 'go-weeb-dev', '<h3 id=\"go-web-\">go web 开发</h3>\n<p><a href=\"https://www.kancloud.cn/zxysilent/go-web-dev\">传送门</a></p>\n', '### go web 开发\n[传送门](https://www.kancloud.cn/zxysilent/go-web-dev)', '<div class=\"toc\"><ul>\n<li><a href=\"#toc-0c3\">go web 开发</a></li>\n</ul>\n</div><h3><a id=\"toc-0c3\" class=\"anchor\" href=\"#toc-0c3\"></a>go web 开发</h3>\n<p><a href=\"https://www.kancloud.cn/zxysilent/go-web-dev\">传送门</a></p>\n', '1', '2017-07-14 18:01:23', '2017-07-14 18:02:06', '1', '0', '\"{\\\"template\\\":\\\"\\\",\\\"push_sites\\\":[]}\"');
  INSERT INTO `post` VALUES ('20', '1', '3', '0', '3', 'Linux 各目录的作用', 'linux-dir', '<p>Linux 各目录的作用</p>\n<p><code>/bin</code>bin是binary的缩写。这个目录沿袭了UNIX系统的结构，存放着使用者最经常使用的命令。例如<code>cp、ls、cat</code>，等等。</p>\n<p><code>/boot</code>这里存放的是启动Linux时使用的一些核心文件。</p>\n<p><code>/dev</code>dev是device（设备）的缩写。这个目录下是所有Linux的外部设备，其功能类似DOS下的.sys和Win下的.vxd。在Linux中设备和文件是用同种方法访问的。例如：<code>/dev/hda</code>代表第一个物理IDE硬盘。</p>\n', 'Linux 各目录的作用\n\n`/bin`bin是binary的缩写。这个目录沿袭了UNIX系统的结构，存放着使用者最经常使用的命令。例如`cp、ls、cat`，等等。\n\n`/boot`这里存放的是启动Linux时使用的一些核心文件。\n\n`/dev`dev是device（设备）的缩写。这个目录下是所有Linux的外部设备，其功能类似DOS下的.sys和Win下的.vxd。在Linux中设备和文件是用同种方法访问的。例如：`/dev/hda`代表第一个物理IDE硬盘。\n<!--more-->\n`/etc`这个目录用来存放系统管理所需要的配置文件和子目录。\n\n`/home`用户的主目录，比如说有个用户叫zxyslt，那他的主目录就是`/home/zxyslt`也可以用`~zxyslt`表示。\n\n`/lib`这个目录里存放着系统最基本的动态链接共享库，其作用类似于Windows里的.dll文件。几乎所有的应用程序都须要用到这些共享库。\n\n`/lost+found`这个目录平时是空的，当系统不正常关机后，这里就成了一些无家可归的文件的避难所。对了，有点类似于DOS下的.chk文件。\n\n`/mnt`这个目录是空的，系统提供这个目录是让用户临时挂载别的文件系统。\n\n`/proc`这个目录是一个虚拟的目录，它是系统内存的映射，我们可以通过直接访问这个目录来获取系统信息。也就是说，这个目录的内容不在硬盘上而是在内存里。\n\n`/root`系统管理员（也叫超级用户）的主目录。\n\n`/sbin`s就是Super User的意思，也就是说这里存放的是系统管理员使用的管理程序。\n\n`/tmp`这个目录不用说，一定是用来存放一些临时文件的地方了。\n\n`/var`这个目录中存放着那些不断在扩充着的东西，为了保持/usr的相对稳定，那些经常被修改的目录可以放在这个目录下，实际上许多系统管理员都是这样干的。顺带说一下系统的日志文件就在`/var/log`目录中。 \n\n`/usr`这是最庞大的目录，我们要用到的应用程序和文件几乎都存放在这个目录下。其中包含以下子目录；\n\n`/usr/X11R6`存放X-Window的目录；\n\n`/usr/bin`存放着许多应用程序；\n\n`/usr/sbin`给超级用户使用的一些管理程序就放在这里；\n\n`/usr/doc`这是Linux文档的大本营；\n\n`/usr/include`Linux下开发和编译应用程序需要的头文件，在这里查找；\n\n`/usr/lib`存放一些常用的动态链接共享库和静态档案库；\n\n`/usr/local`这是提供给一般用户的/usr目录，在这里安装软件最适合；\n\n`/usr/man`man在Linux中是帮助的同义词，这里就是帮助文档的存放目录；\n\n`/usr/src`Linux开放的源代码就存在这个目录 ；\n\n ', '<div class=\"toc\"></div><p>Linux 各目录的作用</p>\n<p><code>/bin</code>bin是binary的缩写。这个目录沿袭了UNIX系统的结构，存放着使用者最经常使用的命令。例如<code>cp、ls、cat</code>，等等。</p>\n<p><code>/boot</code>这里存放的是启动Linux时使用的一些核心文件。</p>\n<p><code>/dev</code>dev是device（设备）的缩写。这个目录下是所有Linux的外部设备，其功能类似DOS下的.sys和Win下的.vxd。在Linux中设备和文件是用同种方法访问的。例如：<code>/dev/hda</code>代表第一个物理IDE硬盘。\n<!--more-->\n<code>/etc</code>这个目录用来存放系统管理所需要的配置文件和子目录。</p>\n<p><code>/home</code>用户的主目录，比如说有个用户叫zxyslt，那他的主目录就是<code>/home/zxyslt</code>也可以用<code>~zxyslt</code>表示。</p>\n<p><code>/lib</code>这个目录里存放着系统最基本的动态链接共享库，其作用类似于Windows里的.dll文件。几乎所有的应用程序都须要用到这些共享库。</p>\n<p><code>/lost+found</code>这个目录平时是空的，当系统不正常关机后，这里就成了一些无家可归的文件的避难所。对了，有点类似于DOS下的.chk文件。</p>\n<p><code>/mnt</code>这个目录是空的，系统提供这个目录是让用户临时挂载别的文件系统。</p>\n<p><code>/proc</code>这个目录是一个虚拟的目录，它是系统内存的映射，我们可以通过直接访问这个目录来获取系统信息。也就是说，这个目录的内容不在硬盘上而是在内存里。</p>\n<p><code>/root</code>系统管理员（也叫超级用户）的主目录。</p>\n<p><code>/sbin</code>s就是Super User的意思，也就是说这里存放的是系统管理员使用的管理程序。</p>\n<p><code>/tmp</code>这个目录不用说，一定是用来存放一些临时文件的地方了。</p>\n<p><code>/var</code>这个目录中存放着那些不断在扩充着的东西，为了保持/usr的相对稳定，那些经常被修改的目录可以放在这个目录下，实际上许多系统管理员都是这样干的。顺带说一下系统的日志文件就在<code>/var/log</code>目录中。 </p>\n<p><code>/usr</code>这是最庞大的目录，我们要用到的应用程序和文件几乎都存放在这个目录下。其中包含以下子目录；</p>\n<p><code>/usr/X11R6</code>存放X-Window的目录；</p>\n<p><code>/usr/bin</code>存放着许多应用程序；</p>\n<p><code>/usr/sbin</code>给超级用户使用的一些管理程序就放在这里；</p>\n<p><code>/usr/doc</code>这是Linux文档的大本营；</p>\n<p><code>/usr/include</code>Linux下开发和编译应用程序需要的头文件，在这里查找；</p>\n<p><code>/usr/lib</code>存放一些常用的动态链接共享库和静态档案库；</p>\n<p><code>/usr/local</code>这是提供给一般用户的/usr目录，在这里安装软件最适合；</p>\n<p><code>/usr/man</code>man在Linux中是帮助的同义词，这里就是帮助文档的存放目录；</p>\n<p><code>/usr/src</code>Linux开放的源代码就存在这个目录 ；</p>\n', '0', '2017-08-07 09:45:50', '2017-08-08 09:08:30', '1', '0', '\"{\\\"template\\\":\\\"\\\",\\\"push_sites\\\":[]}\"');
  INSERT INTO `post` VALUES ('21', '1', '3', '0', '3', ' windows子系统下安装GO语言环境', 'win-sub-sys-go', '<h2 id=\"windows-go-\">windows子系统下安装GO语言环境</h2>\n<ol>\n<li>下载go<pre><code class=\"hljs lang-awk\">wget -c https:<span class=\"hljs-regexp\">//</span>storage.googleapis.com<span class=\"hljs-regexp\">/golang/g</span>o1.<span class=\"hljs-number\">8.3</span>.linux-amd64.tar.gz\n</code></pre></li>\n<li>解压文件至<code>/usr/local</code><pre><code class=\"hljs lang-stylus\">tar -C /usr/local -xzf go1.<span class=\"hljs-number\">8.3</span><span class=\"hljs-selector-class\">.linux-amd64</span><span class=\"hljs-selector-class\">.tar</span><span class=\"hljs-selector-class\">.gz</span>\n</code></pre></li>\n</ol>\n', '## windows子系统下安装GO语言环境\n1. 下载go\n```\nwget -c https://storage.googleapis.com/golang/go1.8.3.linux-amd64.tar.gz\n```\n2. 解压文件至`/usr/local`\n```\ntar -C /usr/local -xzf go1.8.3.linux-amd64.tar.gz\n```\n<!--more-->\n3. 设置环境变量  \n```\ncd ~ \nvim .profile```\n在文件最后添加   \n```\nexport PATH=$PATH:/usr/local/go/bin\n```   \n保存退出\n4. 让设置生效\n```\n. .profile\n```\n5. 查看是否安装成功\n```\ngo version\n```\n6. 新建`gopath` 目录\n```\nmkdir gopath\n```\n7. 添加环境变量\n```\nexport GOPATH=/usr/local/gopath\nexport PATH=$PATH:$GOPATH/bin\n```\n8. 测试\n```\ngo env\n```\n9. 安装`git`\n```\nsudo apt-get install git git-core git-doc\n```\n\n[环境变量配置](http://www.cnblogs.com/haore147/p/3633116.html)', '<div class=\"toc\"><ul>\n<li><a href=\"#toc-698\">windows子系统下安装GO语言环境</a></li>\n</ul>\n</div><h2><a id=\"toc-698\" class=\"anchor\" href=\"#toc-698\"></a>windows子系统下安装GO语言环境</h2>\n<ol>\n<li>下载go<pre><code class=\"hljs lang-awk\">wget -c https:<span class=\"hljs-regexp\">//</span>storage.googleapis.com<span class=\"hljs-regexp\">/golang/g</span>o1.<span class=\"hljs-number\">8.3</span>.linux-amd64.tar.gz\n</code></pre></li>\n<li>解压文件至<code>/usr/local</code><pre><code class=\"hljs lang-stylus\">tar -C /usr/local -xzf go1.<span class=\"hljs-number\">8.3</span><span class=\"hljs-selector-class\">.linux-amd64</span><span class=\"hljs-selector-class\">.tar</span><span class=\"hljs-selector-class\">.gz</span>\n</code></pre><!--more--></li>\n<li>设置环境变量  <pre><code class=\"hljs lang-vim\"><span class=\"hljs-keyword\">cd</span> ~ \n<span class=\"hljs-keyword\">vim</span> .<span class=\"hljs-keyword\">profile</span>\n</code></pre>在文件最后添加   <pre><code class=\"hljs lang-elixir\">export PATH=<span class=\"hljs-variable\">$PATH</span><span class=\"hljs-symbol\">:/usr/local/go/bin</span>\n</code></pre>保存退出</li>\n<li>让设置生效<pre><code class=\"hljs lang-stylus\">. <span class=\"hljs-selector-class\">.profile</span>\n</code></pre></li>\n<li>查看是否安装成功<pre><code class=\"hljs lang-vim\"><span class=\"hljs-keyword\">go</span> <span class=\"hljs-keyword\">version</span>\n</code></pre></li>\n<li>新建<code>gopath</code> 目录<pre><code class=\"hljs lang-arduino\"><span class=\"hljs-built_in\">mkdir</span> gopath\n</code></pre></li>\n<li>添加环境变量<pre><code class=\"hljs lang-bash\"><span class=\"hljs-built_in\">export</span> GOPATH=/usr/<span class=\"hljs-built_in\">local</span>/gopath\n<span class=\"hljs-built_in\">export</span> PATH=<span class=\"hljs-variable\">$PATH</span>:<span class=\"hljs-variable\">$GOPATH</span>/bin\n</code></pre></li>\n<li>测试<pre><code class=\"hljs lang-dockerfile\">go <span class=\"hljs-keyword\">env</span>\n</code></pre></li>\n<li>安装<code>git</code><pre><code class=\"hljs lang-actionscript\">sudo apt-<span class=\"hljs-keyword\">get</span> install git git-core git-doc\n</code></pre></li>\n</ol>\n<p><a href=\"http://www.cnblogs.com/haore147/p/3633116.html\">环境变量配置</a></p>\n', '0', '2017-08-08 08:55:34', '2017-11-06 09:01:11', '1', '0', '{\"template\":\"\",\"push_sites\":[]}');
  INSERT INTO `post` VALUES ('22', '1', '1', '0', '3', 'go tool pprof', 'go-tool-pprof', '<ol>\n<li>加入代码<pre><code class=\"hljs lang-go\"><span class=\"hljs-keyword\">import</span> _ <span class=\"hljs-string\">\"net/http/pprof\"</span>\n<span class=\"hljs-keyword\">go</span> <span class=\"hljs-function\"><span class=\"hljs-keyword\">func</span><span class=\"hljs-params\">()</span></span> {\n     log.Println(http.ListenAndServe(<span class=\"hljs-string\">\"localhost:6060\"</span>, <span class=\"hljs-literal\">nil</span>))\n}()\n</code></pre></li>\n<li>编译并运行</li>\n<li>新窗口打开命令行  </li>\n</ol>\n', '1. 加入代码\n```\nimport _ \"net/http/pprof\"\ngo func() {\n		log.Println(http.ListenAndServe(\"localhost:6060\", nil))\n}()\n```\n2. 编译并运行\n3. 新窗口打开命令行  \n<!--more-->\n** 内存对象分配的相关情况 **\n```\ngo tool pprof -alloc_space  http://localhost:6060/debug/pprof/heap\n``` \n**正在使用的一些内存相关信息    **\n```\ngo tool pprof -inuse_space http://127.0.0.1:6060/debug/pprof/heap\n```\n4.  `pprof`模式输入`web`\n5. 效果图  \n![alt](/res/upimg/20170809/wB66oV7-Qk6fW1EbFMiGnekr.png)', '<div class=\"toc\"></div><ol>\n<li>加入代码<pre><code class=\"hljs lang-go\"><span class=\"hljs-keyword\">import</span> _ <span class=\"hljs-string\">\"net/http/pprof\"</span>\n<span class=\"hljs-keyword\">go</span> <span class=\"hljs-function\"><span class=\"hljs-keyword\">func</span><span class=\"hljs-params\">()</span></span> {\n     log.Println(http.ListenAndServe(<span class=\"hljs-string\">\"localhost:6060\"</span>, <span class=\"hljs-literal\">nil</span>))\n}()\n</code></pre></li>\n<li>编译并运行</li>\n<li>新窗口打开命令行  <!--more-->\n<strong> 内存对象分配的相关情况 </strong><pre><code class=\"hljs lang-vim\"><span class=\"hljs-keyword\">go</span> tool pprof -alloc_space  http://localhos<span class=\"hljs-variable\">t:6060</span>/<span class=\"hljs-keyword\">debug</span>/pprof/heap\n</code></pre><strong>正在使用的一些内存相关信息    </strong><pre><code class=\"hljs lang-crystal\">go tool pprof -inuse_space <span class=\"hljs-symbol\">http:</span>/<span class=\"hljs-regexp\">/127.0.0.1:6060/debug</span><span class=\"hljs-regexp\">/pprof/heap</span>\n</code></pre></li>\n<li><code>pprof</code>模式输入<code>web</code></li>\n<li>效果图<br><img src=\"/res/upimg/20170809/wB66oV7-Qk6fW1EbFMiGnekr.png\" alt=\"alt\"></li>\n</ol>\n', '1', '2017-08-09 07:37:36', '2017-11-04 12:09:05', '1', '0', '{\"template\":\"\",\"push_sites\":[]}');
  INSERT INTO `post` VALUES ('24', '1', '4', '0', '3', 'Regular Expression', 'regular-expression', '<h2 id=\"regular-expression\">Regular Expression</h2>\n<blockquote>\n<p>常简写为regex、regexp或RE），计算机科学的一个概念。\n通常被用来检索、替换那些符合某个模式(规则)的文本</p>\n</blockquote>\n<h3 id=\"-\">元字符</h3>\n<ul>\n<li><p><code>.</code> 匹配除&quot;\\r\\n&quot;之外的任何单个字符;要匹配包括&quot;\\r\\n&quot;在内的任何字符，请使用像&quot;[\\s\\S]&quot;的模式.</p>\n</li>\n<li><p><code>x|y</code>匹配x或y;&quot;z|food&quot;能匹配&quot;z&quot;或&quot;food&quot;;&quot;[zf]ood&quot;则匹配&quot;zood&quot;或&quot;food&quot;.</p>\n</li>\n<li><p><code>[xyz]</code> 字符集合匹配所包含的任意一个字符;&quot;[abc]&quot;可以匹配&quot;plain&quot;中的&quot;a&quot;.  </p>\n</li>\n<li><p><code>[^xyz]</code> 负值字符集合匹配未包含的任意字符;&quot;[^abc]&quot;可以匹配&quot;plain&quot;中的&quot;plin&quot;.  </p>\n</li>\n<li><p><code>[a-z]</code> 字符范围匹配指定范围内的任意字符;&quot;[a-z]&quot;可以匹配&quot;a&quot;到&quot;z&quot;范围内的任意小写字母字符.  </p>\n</li>\n</ul>\n', '## Regular Expression\n> 常简写为regex、regexp或RE），计算机科学的一个概念。\n通常被用来检索、替换那些符合某个模式(规则)的文本\n\n### 元字符\n- `.` 匹配除\"\\r\\n\"之外的任何单个字符;要匹配包括\"\\r\\n\"在内的任何字符，请使用像\"[\\s\\S]\"的模式.\n\n- `x|y`匹配x或y;\"z|food\"能匹配\"z\"或\"food\";\"[zf]ood\"则匹配\"zood\"或\"food\".\n\n- `[xyz]` 字符集合匹配所包含的任意一个字符;\"[abc]\"可以匹配\"plain\"中的\"a\".  \n\n- ` [^xyz]` 负值字符集合匹配未包含的任意字符;\"[^abc]\"可以匹配\"plain\"中的\"plin\".  \n\n- `[a-z]` 字符范围匹配指定范围内的任意字符;\"[a-z]\"可以匹配\"a\"到\"z\"范围内的任意小写字母字符.  \n\n<!--more-->\n- `\\perl Perl`预定义字符族\n- `\\PERL` 反向Perl预定义字符族\n> Perl字符族  \n 1. `\\d` == [0-9] 匹配一个数字字符\n 2. `\\D` == [^0-9] 匹配一个非数字字符\n 3. `\\s` == [\\t\\n\\f\\r~~\\v~~] 匹配任何不可见字符(空格,制表符,换页符) (golang)\n 4. `\\S` == [^\\t\\n\\f\\r~~\\v~~ ] 匹配任何可见字符 (golang)\n 5. `\\w` ~~?~~== [0-9A-Za-] 匹配包括下划线的任何单词字符 (golang)\n 6. `\\W` ~~?~~== [^0-9A-Za-] 匹配任何非单词字符 (golang)\n\n### 次数\n- `*`匹配前面的子表达式任意次;`zo*`能匹配\"z\"，也能匹配\"zo\"以及\"zoo\"。*等价于o{0,}\n\n- `+`匹配前面的子表达式一次或多次(大于等于1次）;\"zo+\"能匹配\"zo\"以及\"zoo\"，但不能匹配\"z\"。+等价于{1,}\n\n- `?`匹配前面的子表达式零次或一次;\"do(es)?\"可以匹配\"do\"或\"does\"中的\"do\"。?等价于{0,1}\n\n- `{n}`n是一个非负整数。匹配确定的n次;\"o{2}\"不能匹配\"Bob\"中的\"o\"，但是能匹配\"food\"中的两个o\n\n- `{n,}`n是一个非负整数。至少匹配n次;\"o{2,}\"不能匹配\"Bob\"中的\"o\"，但能匹配\"foooood\"中的所有o\n\"o{1,}\"等价于\"o+\"。\"o{0,}\"则等价于\"o*\"。\n\n- `{n,m}`m和n均为非负整数，其中n<=m最少匹配n次且最多匹配m次;\"o{1,3}\"将匹配\"fooooood\"中的前三个o为一组，后三个o为一组\n\"o{0,1}\"等价于\"o?\"。在逗号和两个数之间**不能**有空格\n\n### 模式\n- `?`当该字符紧跟在任何一个其他限制符(*,+,?，{n}，{n,}，{n,m})后面时，匹配模式是非贪婪的.\n\n### 边界\n- `^`匹配输入字符串的开始位置;如果设置了RegExp对象的Multiline属性，^也匹配\"\\n\"或\"\\r\"之后的位置。\n\n- `$`匹配输入字符串的结束位置;如果设置了RegExp对象的Multiline属性，$也匹配\"\\n\"或\"\\r\"之前的位置。\n\n- `\\b`匹配一个单词边界，也就是指单词和空格间的位置;\"er\\b\"可以匹配\"never\"中的\"er\"，但不能匹配\"verb\"中的\"er\"。\n\n- `\\B`匹配非单词边界;\"er\\B\"能匹配\"verb\"中的\"er\"，但不能匹配\"never\"中的\"er\"。\n\n###  组\n- `()`将( 和 ) 之间的表达式定义为”组”(group)，并且将匹配这个表达式的字符保存到一个临时区域;(一个正则表达式中最多可以保存9个)，它们可以用符号(\\,$)加数字0-9来引用[golang中室友二维数组获取,其中**二维切片**的第一个(下标0)标识所有匹配从第二个(下标1)表示组]\n\n### Golang中使用\n- `func Compile(expr string) (*Regexp, error)`  \n>Compile解析并返回一个正则表达式。如果成功返回，该Regexp就可用于匹配文本\n\n- `func MustCompile(str string) *Regexp`\n> MustCompile类似Compile但会在解析失败时panic，主要用于全局正则表达式变量的安全初始化  \n\n- `Find(All)?(String)?(Submatch)?(Index)?`\n>\'All\'该方法会返回输入中所有互不重叠的匹配结果  \n\'String\'出现了,匹配对象为字符串，否则应该是[]byte类型，返回值和匹配对象的类型是对应的  \n\'Submatch\'出现了,返回值是表示正则表达式中成功的组匹配（子匹配/次级匹配）的切片   \n\n-  `func (re *Regexp) Match(b []byte) bool`\n> Match检查b中是否存在匹配pattern的子序列\n\n- `func (re *Regexp) MatchString(s string) bool`\n> MatchString类似Match，但匹配对象是字符串\n\n- `func (re *Regexp) FindAllString(s string, n int) []string`\n> 返回正则表达式re在s中的所有不重叠的匹配结果的[]string切片。  \n如果没有匹配到，会返回nil  \nN表示s [0,n) n<0表示整个s中查找\n\n- `func(re*Regexp) FindAllStringSubmatch(s string, n int) [][]string`\n> 返回正则表达式re在s中的所有不重叠的匹配结果及其对应的(可能有的)分组匹配的结果的[][]string切片\n\n- `func (re *Regexp) Split(s string, n int) []string` \n> Split将re在s中匹配到的结果作为分隔符将s分割成多个字符串，并返回这些正则匹配结果之间的字符串的切片\n\n- `func (re *Regexp) ReplaceAllString(src, repl string) string`\n> 返回src的一个拷贝，将src中所有re的匹配结果都替换为repl。  \n在替换时，repl中的\'$\'符号会按照Expand方法的规则进行解释  \n和替换，例如$1会被替换为第一个分组匹配结果  ', '<div class=\"toc\"><ul>\n<li><a href=\"#regularexpression\">Regular Expression</a><ul>\n<li><a href=\"#toc-d10\">元字符</a></li>\n<li><a href=\"#toc-f96\">次数</a></li>\n<li><a href=\"#toc-f07\">模式</a></li>\n<li><a href=\"#toc-0bd\">边界</a></li>\n<li><a href=\"#toc-442\">组</a></li>\n<li><a href=\"#toc-c63\">Golang中使用</a></li>\n</ul>\n</li>\n</ul>\n</div><h2><a id=\"regularexpression\" class=\"anchor\" href=\"#regularexpression\"></a>Regular Expression</h2>\n<blockquote>\n<p>常简写为regex、regexp或RE），计算机科学的一个概念。\n通常被用来检索、替换那些符合某个模式(规则)的文本</p>\n</blockquote>\n<h3><a id=\"toc-d10\" class=\"anchor\" href=\"#toc-d10\"></a>元字符</h3>\n<ul>\n<li><p><code>.</code> 匹配除&quot;\\r\\n&quot;之外的任何单个字符;要匹配包括&quot;\\r\\n&quot;在内的任何字符，请使用像&quot;[\\s\\S]&quot;的模式.</p>\n</li>\n<li><p><code>x|y</code>匹配x或y;&quot;z|food&quot;能匹配&quot;z&quot;或&quot;food&quot;;&quot;[zf]ood&quot;则匹配&quot;zood&quot;或&quot;food&quot;.</p>\n</li>\n<li><p><code>[xyz]</code> 字符集合匹配所包含的任意一个字符;&quot;[abc]&quot;可以匹配&quot;plain&quot;中的&quot;a&quot;.  </p>\n</li>\n<li><p><code>[^xyz]</code> 负值字符集合匹配未包含的任意字符;&quot;[^abc]&quot;可以匹配&quot;plain&quot;中的&quot;plin&quot;.  </p>\n</li>\n<li><p><code>[a-z]</code> 字符范围匹配指定范围内的任意字符;&quot;[a-z]&quot;可以匹配&quot;a&quot;到&quot;z&quot;范围内的任意小写字母字符.  </p>\n</li>\n</ul>\n<!--more-->\n<ul>\n<li><code>\\perl Perl</code>预定义字符族</li>\n<li><code>\\PERL</code> 反向Perl预定义字符族<blockquote>\n<p>Perl字符族  </p>\n<ol>\n<li><code>\\d</code> == [0-9] 匹配一个数字字符</li>\n<li><code>\\D</code> == [^0-9] 匹配一个非数字字符</li>\n<li><code>\\s</code> == [\\t\\n\\f\\r<del>\\v</del>] 匹配任何不可见字符(空格,制表符,换页符) (golang)</li>\n<li><code>\\S</code> == [^\\t\\n\\f\\r<del>\\v</del> ] 匹配任何可见字符 (golang)</li>\n<li><code>\\w</code> <del>?</del>== [0-9A-Za-] 匹配包括下划线的任何单词字符 (golang)</li>\n<li><code>\\W</code> <del>?</del>== [^0-9A-Za-] 匹配任何非单词字符 (golang)</li>\n</ol>\n</blockquote>\n</li>\n</ul>\n<h3><a id=\"toc-f96\" class=\"anchor\" href=\"#toc-f96\"></a>次数</h3>\n<ul>\n<li><p><code>*</code>匹配前面的子表达式任意次;<code>zo*</code>能匹配&quot;z&quot;，也能匹配&quot;zo&quot;以及&quot;zoo&quot;。*等价于o{0,}</p>\n</li>\n<li><p><code>+</code>匹配前面的子表达式一次或多次(大于等于1次）;&quot;zo+&quot;能匹配&quot;zo&quot;以及&quot;zoo&quot;，但不能匹配&quot;z&quot;。+等价于{1,}</p>\n</li>\n<li><p><code>?</code>匹配前面的子表达式零次或一次;&quot;do(es)?&quot;可以匹配&quot;do&quot;或&quot;does&quot;中的&quot;do&quot;。?等价于{0,1}</p>\n</li>\n<li><p><code>{n}</code>n是一个非负整数。匹配确定的n次;&quot;o{2}&quot;不能匹配&quot;Bob&quot;中的&quot;o&quot;，但是能匹配&quot;food&quot;中的两个o</p>\n</li>\n<li><p><code>{n,}</code>n是一个非负整数。至少匹配n次;&quot;o{2,}&quot;不能匹配&quot;Bob&quot;中的&quot;o&quot;，但能匹配&quot;foooood&quot;中的所有o\n&quot;o{1,}&quot;等价于&quot;o+&quot;。&quot;o{0,}&quot;则等价于&quot;o*&quot;。</p>\n</li>\n<li><p><code>{n,m}</code>m和n均为非负整数，其中n&lt;=m最少匹配n次且最多匹配m次;&quot;o{1,3}&quot;将匹配&quot;fooooood&quot;中的前三个o为一组，后三个o为一组\n&quot;o{0,1}&quot;等价于&quot;o?&quot;。在逗号和两个数之间<strong>不能</strong>有空格</p>\n</li>\n</ul>\n<h3><a id=\"toc-f07\" class=\"anchor\" href=\"#toc-f07\"></a>模式</h3>\n<ul>\n<li><code>?</code>当该字符紧跟在任何一个其他限制符(*,+,?，{n}，{n,}，{n,m})后面时，匹配模式是非贪婪的.</li>\n</ul>\n<h3><a id=\"toc-0bd\" class=\"anchor\" href=\"#toc-0bd\"></a>边界</h3>\n<ul>\n<li><p><code>^</code>匹配输入字符串的开始位置;如果设置了RegExp对象的Multiline属性，^也匹配&quot;\\n&quot;或&quot;\\r&quot;之后的位置。</p>\n</li>\n<li><p><code>$</code>匹配输入字符串的结束位置;如果设置了RegExp对象的Multiline属性，$也匹配&quot;\\n&quot;或&quot;\\r&quot;之前的位置。</p>\n</li>\n<li><p><code>\\b</code>匹配一个单词边界，也就是指单词和空格间的位置;&quot;er\\b&quot;可以匹配&quot;never&quot;中的&quot;er&quot;，但不能匹配&quot;verb&quot;中的&quot;er&quot;。</p>\n</li>\n<li><p><code>\\B</code>匹配非单词边界;&quot;er\\B&quot;能匹配&quot;verb&quot;中的&quot;er&quot;，但不能匹配&quot;never&quot;中的&quot;er&quot;。</p>\n</li>\n</ul>\n<h3><a id=\"toc-442\" class=\"anchor\" href=\"#toc-442\"></a>组</h3>\n<ul>\n<li><code>()</code>将( 和 ) 之间的表达式定义为”组”(group)，并且将匹配这个表达式的字符保存到一个临时区域;(一个正则表达式中最多可以保存9个)，它们可以用符号(\\,$)加数字0-9来引用[golang中室友二维数组获取,其中<strong>二维切片</strong>的第一个(下标0)标识所有匹配从第二个(下标1)表示组]</li>\n</ul>\n<h3><a id=\"toc-c63\" class=\"anchor\" href=\"#toc-c63\"></a>Golang中使用</h3>\n<ul>\n<li><p><code>func Compile(expr string) (*Regexp, error)</code>  </p>\n<blockquote>\n<p>Compile解析并返回一个正则表达式。如果成功返回，该Regexp就可用于匹配文本</p>\n</blockquote>\n</li>\n<li><p><code>func MustCompile(str string) *Regexp</code></p>\n<blockquote>\n<p>MustCompile类似Compile但会在解析失败时panic，主要用于全局正则表达式变量的安全初始化  </p>\n</blockquote>\n</li>\n<li><p><code>Find(All)?(String)?(Submatch)?(Index)?</code></p>\n<blockquote>\n<p>&#39;All&#39;该方法会返回输入中所有互不重叠的匹配结果<br>&#39;String&#39;出现了,匹配对象为字符串，否则应该是[]byte类型，返回值和匹配对象的类型是对应的<br>&#39;Submatch&#39;出现了,返回值是表示正则表达式中成功的组匹配（子匹配/次级匹配）的切片   </p>\n</blockquote>\n</li>\n<li><p><code>func (re *Regexp) Match(b []byte) bool</code></p>\n<blockquote>\n<p>Match检查b中是否存在匹配pattern的子序列</p>\n</blockquote>\n</li>\n<li><p><code>func (re *Regexp) MatchString(s string) bool</code></p>\n<blockquote>\n<p>MatchString类似Match，但匹配对象是字符串</p>\n</blockquote>\n</li>\n<li><p><code>func (re *Regexp) FindAllString(s string, n int) []string</code></p>\n<blockquote>\n<p>返回正则表达式re在s中的所有不重叠的匹配结果的[]string切片。<br>如果没有匹配到，会返回nil<br>N表示s [0,n) n&lt;0表示整个s中查找</p>\n</blockquote>\n</li>\n<li><p><code>func(re*Regexp) FindAllStringSubmatch(s string, n int) [][]string</code></p>\n<blockquote>\n<p>返回正则表达式re在s中的所有不重叠的匹配结果及其对应的(可能有的)分组匹配的结果的[][]string切片</p>\n</blockquote>\n</li>\n<li><p><code>func (re *Regexp) Split(s string, n int) []string</code> </p>\n<blockquote>\n<p>Split将re在s中匹配到的结果作为分隔符将s分割成多个字符串，并返回这些正则匹配结果之间的字符串的切片</p>\n</blockquote>\n</li>\n<li><p><code>func (re *Regexp) ReplaceAllString(src, repl string) string</code></p>\n<blockquote>\n<p>返回src的一个拷贝，将src中所有re的匹配结果都替换为repl。<br>在替换时，repl中的&#39;$&#39;符号会按照Expand方法的规则进行解释<br>和替换，例如$1会被替换为第一个分组匹配结果  </p>\n</blockquote>\n</li>\n</ul>\n', '1', '2017-10-14 15:13:28', '2018-07-21 10:32:52', '1', '0', '{\"template\":\"\",\"push_sites\":[]}');
  INSERT INTO `post` VALUES ('26', '1', '4', '0', '3', 'git使用', 'git', '<h2 id=\"-\">安装</h2>\n<ul>\n<li>windows <a href=\"https://git-for-windows.github.io/\">git-for-windows</a></li>\n<li>ubuntu <code>sudo apt-get install git</code></li>\n</ul>\n<h2 id=\"-\">配置信息</h2>\n<h3 id=\"-\">必须配置</h3>\n<pre><code class=\"hljs lang-stylus\"><span class=\"hljs-comment\">// 配置用户名</span>\ngit config --global user<span class=\"hljs-selector-class\">.name</span> <span class=\"hljs-string\">\"zxysilent\"</span>\n<span class=\"hljs-comment\">//配置用户邮箱</span>\ngit config --global user<span class=\"hljs-selector-class\">.email</span> <span class=\"hljs-string\">\"zxysilent@foxmail.com\"</span>\n</code></pre>', '## 安装\n-  windows [git-for-windows](https://git-for-windows.github.io/)\n- ubuntu `sudo apt-get install git  `\n\n## 配置信息\n### 必须配置\n~~~\n// 配置用户名\ngit config --global user.name \"zxysilent\"\n//配置用户邮箱\ngit config --global user.email \"zxysilent@foxmail.com\"\n~~~\n<!--more-->\n>  `--global` 表示你这台机器上所有的Git仓库都会使用这个配置   \n\n\n### 其他配置\n~~~\n$ git config --list\n~~~\n比如`git config core.ignorecase false `设置大小写敏感\n## 关系图\n![alt](/res/upimg/20171110/hC6J5jgPE8-mixAQRpQR23Bx.png)\n\n>  Workspace:工作区  \n>  Index/Stage:暂存区  \n>  Repository:本地仓库  \n>  Remote:远程仓库\n\n## 基本Git使用\n### 版本跟踪\n1. 选择一个文件夹  \n![alt](/res/upimg/20171110/Ohl5oZeTTazra37NnOjeihMu.png)\n2. 使用`git init`命令把这个目录变成Git可以管理的仓库\n~~~\ngit init  \nInitialized empty Git repository in D:/App/Github/zxyslt/.git/ \n~~~\n> 当前目录下会自动创建一个**隐藏的**.git的目录，这个目录是Git来跟踪管理版本库的，**不要自己修改这个目录里面的文件**，因为修改了文件可能产生不可预知的问题! 比如把Git仓库给破坏了。\n3. 用`vscode` or `notepad++` **不是Windows自带的notepad** 添加测试文件`a.txt`写上一点数据aaaaaa  \n\n    -  用`git add a.txt`把文件a.txt添加到暂存区(Index/Stage)\n    ~~~\n    $ git add a.txt\n    ~~~\n    > 命令行中执行命令后没有提示信息一般代表**成功**  \n\n    - 用`git commit -m \"备注信息\"`把暂存区的内容添加到本地仓库(Repository)\n    ~~~\n     $ git commit -m \"write aaaaaa\"\n    [master (root-commit) caac3d8] write aaaaaa\n     1 file changed, 1 insertion(+)\n     create mode 100644 a.txt\n    ~~~\n    > 注释为中文可能发生意外(Please refer to Baidu!)\n    - 用`git status`查看工作区的状态(Workspace)\n    ~~~\n    $ git status\n    On branch master\n    nothing to commit, working tree clean\n    ~~~\n    - 修改文件`a.txt`添加一行bbbbbb 保存  \n      用`git status`查看工作区的状态  \n        ~~~\n       $ git status\n       On branch master\n       Changes not staged for commit:\n           (use \"git add <file>...\" to update what will be committed)\n           (use \"git checkout -- <file>...\" to discard changes in working directory)\n            modified:   a.txt\n       no changes added to commit (use \"git add\" and/or \"git commit -a\")\n    ~~~\n    用 `git diff` or `git diff a.txt `查看文件变化\n    ~~~\n    $ git diff a.txt\n    diff --git a/a.txt b/a.txt\n    index 90b4516..85553e8 100644\n    --- a/a.txt\n    +++ b/a.txt\n       @@ -1 +1,2 @@\n         aaaaaa\n        +bbbbbb\n    ~~~\n    - 用`git add a.txt`把文件a.txt添加到暂存区然后用`git status`查看工作区的状态\n    ~~~\n    $ git status\n    On branch master\n    Changes to be committed:\n     (use \"git reset HEAD <file>...\" to unstage)\n        modified:   a.txt\n    ~~~\n    - 用`git commit -m \"备注信息\"`把暂存区的内容添加到本地仓库 \n    ~~~\n    $ git commit -m \"append bbbbbb\"\n    [master 1baf46d] append bbbbbb\n     1 file changed, 1 insertion(+)\n    ~~~\n    - 用`git log`查看提交记录  \n    ~~~\n    $ git log\n    commit 1baf46dea014d993843137d3bf0aa56fe448699a (HEAD -> master)\n    Author: zxysilent <zxysilent@foxmail.com>\n    Date:   Fri Nov 10 21:18:13 2017 +0800\n        append bbbbbb\n    commit caac3d8a845500c95f70499b40710826fcd644af\n    Author: zxysilent <zxysilent@foxmail.com>\n    Date:   Fri Nov 10 21:00:34 2017 +0800\n        write aaaaaa\n    ~~~\n\n - 用`git log --pretty=oneline`查看简要提交记录\n    ~~~\n    $ git log --pretty=oneline\n    1baf46dea014d993843137d3bf0aa56fe448699a (HEAD -> master) append bbbbbb\n    caac3d8a845500c95f70499b40710826fcd644af write aaaaaa\n    ~~~\n    > 每一次提交就是一个版本  **commit_id**\n\n#### 小结\n- `git init` 初始化一个仓库\n-  `git add file` 添加文件到暂存区\n- `git commit -m \"注释信息\"` 把暂存区文件添加到仓库(一次提交为一个版本)\n- `git status` 查看工作区状态信息\n- `git diff ` or `git diff  <file>` 查看文件变化信息\n- `git log`查看提交记录  \n- `git log --pretty=oneline`查看简要提交记录\n\n### 后悔药\n1. 修改文件a.txt添加一行cccccc保存\n    - 用`git add a.txt`添加到暂存区\n    - 用`git commit -m \"append cccccc\"`提交到版本库\n2.  用`git log `查看版本记录\n    ~~~\n    $ git log\n    commit cccb318a93f00cd0dd092c8385354e0d34f3d226 (HEAD -> master)\n    Author: zxysilent <zxysilent@foxmail.com>\n    Date:   Fri Nov 10 21:50:35 2017 +0800\n        append cccccc\n    commit 1baf46dea014d993843137d3bf0aa56fe448699a\n    Author: zxysilent <zxysilent@foxmail.com>\n    Date:   Fri Nov 10 21:18:13 2017 +0800\n        append bbbbbb\n    commit caac3d8a845500c95f70499b40710826fcd644af\n    Author: zxysilent <zxysilent@foxmail.com>\n    Date:   Fri Nov 10 21:00:34 2017 +0800\n        write aaaaaa\n    ~~~  \n2. 用`git reset  --hard HEAD^` 把当前的版本回退到上一个版本(**with two dashes**)\n    ~~~\n    $ git reset --hard HEAD^\n    HEAD is now at 1baf46d append bbbbbb\n    ~~~\n> 要回退到上上个版本只需把`HEAD^`改成`HEAD^^`以此类推。  \n> 如果要回退到前100个版本的话，可以使用`git reset  –hard HEAD~100`即可  \n> 更多信息Please refer to Baidu!\n3. 用`git reset --hard commit_id` 把当前的版本切换到指定版本\n    ~~~\n    $ git reset --hard caac3d8\n    HEAD is now at caac3d8 write aaaaaa\n    ~~~\n    > 一般输入**前7个**就可以了  \n\n5. 用`git log `查看版本记录\n    ~~~\n    $ git log\n    commit caac3d8a845500c95f70499b40710826fcd644af\n    Author: zxysilent <zxysilent@foxmail.com>\n    Date:   Fri Nov 10 21:00:34 2017 +0800\n        write aaaaaa\n    ~~~  \n**其他提交信息不见了，不见了**\n5. 用`git reflog `查看每次操作版本的记录\n~~~\n    $ git reflog\n    caac3d8 (HEAD -> master) HEAD@{0}: reset: moving to caac3d8\n    1baf46d HEAD@{1}: reset: moving to HEAD^\n    cccb318 HEAD@{2}: commit: append cccccc\n    1baf46d HEAD@{3}: commit: append bbbbbb\n    caac3d8 (HEAD -> master) HEAD@{4}: commit (initial): write aaaaaa\n~~~\n> 看到了熟悉的版本号又可以用`git reset --hard commit_id`切换到指定版本  \n\n#### 小结\n-  `git log` 查看提交记录\n- `git reset --hard HEAD^` 把当前的版本回退到上一个版本\n- `git reflog` 查看每次操作版本的记录\n- `git reset --hard commit_id` 把当前的版本切换到指定版本  \n\n### 撤销修改\n#### 情形A(工作区)\n1. 修改文件a.txt添加一行dddeee保存并用`git status`查看工作区信息\n    ~~~\n    $ git status\n    On branch master\n    Changes not staged for commit:\n      (use \"git add <file>...\" to update what will be committed)\n      (use \"git checkout -- <file>...\" to discard changes in working directory)\n            modified:   a.txt\n    no changes added to commit (use \"git add\" and/or \"git commit -a\")\n    ~~~\n**突然意识到** 天啦不是应该dddddd  \n此处有重点**  (use \"git checkout -- <file>...\" to discard changes in working directory)**\n2. 用`git checkout -- a.txt` 丢弃工作区  \n~~~\n    $ git checkout -- a.txt\n~~~\n查看文件发现dddeee消失了  \n**注意这里有两种情况：**\n> 一种是`a.txt`自修改后还没有被放到暂存区，现在，撤销修改就回到和版本库一模一样的状态；  \n> 一种是`a.txt`已经添加到暂存区后，又作了修改，现在，撤销修改就回到添加到暂存区后的状态。  \n> 总之，`git checkout -- <file>`就是让这个文件回到最近一次`git commit`或`git add`时的状态。\n\n#### 情形B(暂存区)\n1. 修改文件a.txt添加一行fffggg保存然后用`git add a.txt`添加到暂存区再用`git status`查看工作区信息\n    ~~~\n    $ git status\n    On branch master\n    Changes to be committed:\n      (use \"git reset HEAD <file>...\" to unstage)\n            modified:   a.txt\n    ~~~\n此处又有重点**  (use \"git reset HEAD <file>...\" to unstage)**\n> Index/Stage:暂存区  \n> 要多看提示信息\n2. 用`git reset HEAD  a.txt` 暂存区的修改撤销掉  \n    ~~~\n   $ git reset head a.txt\n   Unstaged changes after reset:\n   M       a.txt\n    ~~~\n3. 用`git status`查看工作区信息\n    ~~~\n    $ git status\n    On branch master\n    Changes not staged for commit:\n      (use \"git add <file>...\" to update what will be committed)\n      (use \"git checkout -- <file>...\" to discard changes in working directory)\n            modified:   a.txt\n    no changes added to commit (use \"git add\" and/or \"git commit -a\")\n    ~~~\n> 现在暂存区是干净的，工作区有修改  \n> `git checkout -- <file>` 丢弃工作区\n\n#### 情形C\n> 版本库？  \n> `git reset --hard commit_id`为所欲为\n\n#### 小结\n- 工作区修改**未**提交 `git checkout -- <file>` 工作区撤销到**版本库**一样\n- 工作区修改**已经**提交 `git checkout -- <file>` 工作区撤销到**暂存区**一样\n- 工作区修改**已经**提交 ``git reset HEAD  a.txt` 暂存区的修改撤销掉  \n- `git reset --hard commit_id` 把当前的版本切换到指定版本\n\n### 删除文件\n1. 添加t.txt文件写上一点数据tttttt添加到暂存区(`git add t.txt`)并且提交到版本库(`git commit -m \"备注信息\"`)\n    ~~~\n    git add t.txt\n    $ git commit -m \"add t.txt\"\n    [master 2d0d9fa] add t.txt\n     1 file changed, 1 insertion(+)\n     create mode 100644 t.txt\n    ~~~\n2. 删除t.txt并用`git status`查看工作区信息\n    ~~~\n    $ git status\n    On branch master\n    Changes not staged for commit:\n      (use \"git add/rm <file>...\" to update what will be committed)\n      (use \"git checkout -- <file>...\" to discard changes in working directory)\n            deleted:    t.txt\n    no changes added to commit (use \"git add\" and/or \"git commit -a\")\n    ~~~\n此处有重点\n  > (use \"git add/rm <file>...\" to update what will be committed)  \n > (use \"git checkout -- <file>...\" to discard changes in working directory)  \n\n -  用`git checkout -- <file>` 撤销删除\n    ~~~\n    $ git checkout -- t.txt\n    ~~~\n- 用 `git add/rm <file>`  并用 `git commit -m \"备注信息\"` 从版本库中删除\n    ~~~\n    $ git rm t.txt\n    rm \'t.txt\'\n    $ git commit -m \"delete t.txt\"\n    [master 3b3b9f2] delete t.txt\n     1 file changed, 1 deletion(-)\n     delete mode 100644 t.txt\n    ~~~\n\n#### 小结\n- `git rm <file>` and `git commit -m \"备注信息\"`从版本库删除\n- 误删除 `git checkout -- <file>` 撤销删除', '<div class=\"toc\"><ul>\n<li><a href=\"#toc-e65\">安装</a></li>\n<li><a href=\"#toc-09e\">配置信息</a><ul>\n<li><a href=\"#toc-a68\">必须配置</a></li>\n<li><a href=\"#toc-9ab\">其他配置</a></li>\n</ul>\n</li>\n<li><a href=\"#toc-1fb\">关系图</a></li>\n<li><a href=\"#toc-997\">基本Git使用</a><ul>\n<li><a href=\"#toc-565\">版本跟踪</a><ul>\n<li><a href=\"#toc-5db\">小结</a></li>\n</ul>\n</li>\n<li><a href=\"#toc-a6e\">后悔药</a><ul>\n<li><a href=\"#toc-5db\">小结</a></li>\n</ul>\n</li>\n<li><a href=\"#toc-a44\">撤销修改</a><ul>\n<li><a href=\"#toc-2c2\">情形A(工作区)</a></li>\n<li><a href=\"#toc-448\">情形B(暂存区)</a></li>\n<li><a href=\"#toc-cd3\">情形C</a></li>\n<li><a href=\"#toc-5db\">小结</a></li>\n</ul>\n</li>\n<li><a href=\"#toc-535\">删除文件</a><ul>\n<li><a href=\"#toc-5db\">小结</a></li>\n</ul>\n</li>\n</ul>\n</li>\n</ul>\n</div><h2><a id=\"toc-e65\" class=\"anchor\" href=\"#toc-e65\"></a>安装</h2>\n<ul>\n<li>windows <a href=\"https://git-for-windows.github.io/\">git-for-windows</a></li>\n<li>ubuntu <code>sudo apt-get install git</code></li>\n</ul>\n<h2><a id=\"toc-09e\" class=\"anchor\" href=\"#toc-09e\"></a>配置信息</h2>\n<h3><a id=\"toc-a68\" class=\"anchor\" href=\"#toc-a68\"></a>必须配置</h3>\n<pre><code class=\"hljs lang-stylus\"><span class=\"hljs-comment\">// 配置用户名</span>\ngit config --global user<span class=\"hljs-selector-class\">.name</span> <span class=\"hljs-string\">\"zxysilent\"</span>\n<span class=\"hljs-comment\">//配置用户邮箱</span>\ngit config --global user<span class=\"hljs-selector-class\">.email</span> <span class=\"hljs-string\">\"zxysilent@foxmail.com\"</span>\n</code></pre><!--more-->\n<blockquote>\n<p> <code>--global</code> 表示你这台机器上所有的Git仓库都会使用这个配置   </p>\n</blockquote>\n<h3><a id=\"toc-9ab\" class=\"anchor\" href=\"#toc-9ab\"></a>其他配置</h3>\n<pre><code class=\"hljs lang-routeros\">$ git<span class=\"hljs-built_in\"> config </span>--list\n</code></pre><p>比如<code>git config core.ignorecase false</code>设置大小写敏感</p>\n<h2><a id=\"toc-1fb\" class=\"anchor\" href=\"#toc-1fb\"></a>关系图</h2>\n<p><img src=\"/res/upimg/20171110/hC6J5jgPE8-mixAQRpQR23Bx.png\" alt=\"alt\"></p>\n<blockquote>\n<p> Workspace:工作区<br> Index/Stage:暂存区<br> Repository:本地仓库<br> Remote:远程仓库</p>\n</blockquote>\n<h2><a id=\"toc-997\" class=\"anchor\" href=\"#toc-997\"></a>基本Git使用</h2>\n<h3><a id=\"toc-565\" class=\"anchor\" href=\"#toc-565\"></a>版本跟踪</h3>\n<ol>\n<li>选择一个文件夹<br><img src=\"/res/upimg/20171110/Ohl5oZeTTazra37NnOjeihMu.png\" alt=\"alt\"></li>\n<li>使用<code>git init</code>命令把这个目录变成Git可以管理的仓库<pre><code class=\"hljs lang-groovy\">git init  \nInitialized empty Git repository <span class=\"hljs-keyword\">in</span> <span class=\"hljs-string\">D:</span><span class=\"hljs-regexp\">/App/</span>Github<span class=\"hljs-regexp\">/zxyslt/</span>.git/ \n</code></pre><blockquote>\n<p>当前目录下会自动创建一个<strong>隐藏的</strong>.git的目录，这个目录是Git来跟踪管理版本库的，<strong>不要自己修改这个目录里面的文件</strong>，因为修改了文件可能产生不可预知的问题! 比如把Git仓库给破坏了。</p>\n</blockquote>\n</li>\n<li><p>用<code>vscode</code> or <code>notepad++</code> <strong>不是Windows自带的notepad</strong> 添加测试文件<code>a.txt</code>写上一点数据aaaaaa  </p>\n<ul>\n<li><p>用<code>git add a.txt</code>把文件a.txt添加到暂存区(Index/Stage)</p>\n<pre><code class=\"hljs lang-stylus\">$ git add <span class=\"hljs-selector-tag\">a</span><span class=\"hljs-selector-class\">.txt</span>\n</code></pre><blockquote>\n<p>命令行中执行命令后没有提示信息一般代表<strong>成功</strong>  </p>\n</blockquote>\n</li>\n<li><p>用<code>git commit -m &quot;备注信息&quot;</code>把暂存区的内容添加到本地仓库(Repository)</p>\n<pre><code class=\"hljs lang-sql\">$ git <span class=\"hljs-keyword\">commit</span> -m <span class=\"hljs-string\">\"write aaaaaa\"</span>\n[<span class=\"hljs-keyword\">master</span> (root-<span class=\"hljs-keyword\">commit</span>) caac3d8] write aaaaaa\n<span class=\"hljs-number\">1</span> <span class=\"hljs-keyword\">file</span> <span class=\"hljs-keyword\">changed</span>, <span class=\"hljs-number\">1</span> insertion(+)\n<span class=\"hljs-keyword\">create</span> <span class=\"hljs-keyword\">mode</span> <span class=\"hljs-number\">100644</span> a.txt\n</code></pre><blockquote>\n<p>注释为中文可能发生意外(Please refer to Baidu!)</p>\n</blockquote>\n</li>\n<li>用<code>git status</code>查看工作区的状态(Workspace)<pre><code class=\"hljs lang-crmsh\">$ git status\nOn branch <span class=\"hljs-keyword\">master</span>\n<span class=\"hljs-title\">nothing</span> to commit, working tree clean\n</code></pre></li>\n<li>修改文件<code>a.txt</code>添加一行bbbbbb 保存<br>用<code>git status</code>查看工作区的状态  <pre><code class=\"hljs lang-sql\"> $ git status\n On branch master\n Changes not staged for <span class=\"hljs-keyword\">commit</span>:\n     (<span class=\"hljs-keyword\">use</span> <span class=\"hljs-string\">\"git add &lt;file&gt;...\"</span> <span class=\"hljs-keyword\">to</span> <span class=\"hljs-keyword\">update</span> what will be committed)\n     (<span class=\"hljs-keyword\">use</span> <span class=\"hljs-string\">\"git checkout -- &lt;file&gt;...\"</span> <span class=\"hljs-keyword\">to</span> discard changes <span class=\"hljs-keyword\">in</span> working <span class=\"hljs-keyword\">directory</span>)\n      modified:   a.txt\n <span class=\"hljs-keyword\">no</span> changes added <span class=\"hljs-keyword\">to</span> <span class=\"hljs-keyword\">commit</span> (<span class=\"hljs-keyword\">use</span> <span class=\"hljs-string\">\"git add\"</span> <span class=\"hljs-keyword\">and</span>/<span class=\"hljs-keyword\">or</span> <span class=\"hljs-string\">\"git commit -a\"</span>)\n</code></pre>用 <code>git diff</code> or <code>git diff a.txt</code>查看文件变化<pre><code class=\"hljs lang-stylus\">$ git diff <span class=\"hljs-selector-tag\">a</span><span class=\"hljs-selector-class\">.txt</span>\ndiff --git a/<span class=\"hljs-selector-tag\">a</span><span class=\"hljs-selector-class\">.txt</span> b/<span class=\"hljs-selector-tag\">a</span><span class=\"hljs-selector-class\">.txt</span>\nindex <span class=\"hljs-number\">90</span>b4516..<span class=\"hljs-number\">85553</span>e8 <span class=\"hljs-number\">100644</span>\n--- a/<span class=\"hljs-selector-tag\">a</span><span class=\"hljs-selector-class\">.txt</span>\n+++ b/<span class=\"hljs-selector-tag\">a</span><span class=\"hljs-selector-class\">.txt</span>\n @@ -<span class=\"hljs-number\">1</span> +<span class=\"hljs-number\">1</span>,<span class=\"hljs-number\">2</span> @@\n   aaaaaa\n  +bbbbbb\n</code></pre></li>\n<li>用<code>git add a.txt</code>把文件a.txt添加到暂存区然后用<code>git status</code>查看工作区的状态<pre><code class=\"hljs lang-stylus\">$ git status\nOn branch master\nChanges to be committed:\n(use <span class=\"hljs-string\">\"git reset HEAD &lt;file&gt;...\"</span> to unstage)\n  modified:   <span class=\"hljs-selector-tag\">a</span><span class=\"hljs-selector-class\">.txt</span>\n</code></pre></li>\n<li>用<code>git commit -m &quot;备注信息&quot;</code>把暂存区的内容添加到本地仓库 <pre><code class=\"hljs lang-lsl\">$ git commit -m <span class=\"hljs-string\">\"append bbbbbb\"</span>\n[master <span class=\"hljs-number\">1</span>baf46d] append bbbbbb\n<span class=\"hljs-number\">1</span> file <span class=\"hljs-section\">changed</span>, <span class=\"hljs-number\">1</span> insertion(+)\n</code></pre></li>\n<li>用<code>git log</code>查看提交记录  <pre><code class=\"hljs lang-dts\">$ git log\ncommit <span class=\"hljs-number\">1</span>baf46dea014d993843137d3bf0aa56fe448699a (HEAD -&gt; master)\n<span class=\"hljs-symbol\">Author:</span> zxysilent <span class=\"hljs-params\">&lt;zxysilent@foxmail.com&gt;</span>\n<span class=\"hljs-symbol\">Date:</span>   Fri Nov <span class=\"hljs-number\">10</span> <span class=\"hljs-number\">21</span>:<span class=\"hljs-number\">18</span>:<span class=\"hljs-number\">13</span> <span class=\"hljs-number\">2017</span> +<span class=\"hljs-number\">0800</span>\n  append bbbbbb\ncommit caac3d8a845500c95f70499b40710826fcd644af\n<span class=\"hljs-symbol\">Author:</span> zxysilent <span class=\"hljs-params\">&lt;zxysilent@foxmail.com&gt;</span>\n<span class=\"hljs-symbol\">Date:</span>   Fri Nov <span class=\"hljs-number\">10</span> <span class=\"hljs-number\">21</span>:<span class=\"hljs-number\">00</span>:<span class=\"hljs-number\">34</span> <span class=\"hljs-number\">2017</span> +<span class=\"hljs-number\">0800</span>\n  write aaaaaa\n</code></pre></li>\n</ul>\n<ul>\n<li>用<code>git log --pretty=oneline</code>查看简要提交记录<pre><code class=\"hljs lang-livecodeserver\">$ git <span class=\"hljs-built_in\">log</span> <span class=\"hljs-comment\">--pretty=oneline</span>\n<span class=\"hljs-number\">1</span>baf46dea014d993843137d3bf0aa56fe448699a (HEAD -&gt; master) append bbbbbb\ncaac3d8a845500c95f70499b40710826fcd644af <span class=\"hljs-built_in\">write</span> aaaaaa\n</code></pre><blockquote>\n<p>每一次提交就是一个版本  <strong>commit_id</strong></p>\n</blockquote>\n</li>\n</ul>\n</li>\n</ol>\n<h4><a id=\"toc-5db\" class=\"anchor\" href=\"#toc-5db\"></a>小结</h4>\n<ul>\n<li><code>git init</code> 初始化一个仓库</li>\n<li><code>git add file</code> 添加文件到暂存区</li>\n<li><code>git commit -m &quot;注释信息&quot;</code> 把暂存区文件添加到仓库(一次提交为一个版本)</li>\n<li><code>git status</code> 查看工作区状态信息</li>\n<li><code>git diff</code> or <code>git diff  &lt;file&gt;</code> 查看文件变化信息</li>\n<li><code>git log</code>查看提交记录  </li>\n<li><code>git log --pretty=oneline</code>查看简要提交记录</li>\n</ul>\n<h3><a id=\"toc-a6e\" class=\"anchor\" href=\"#toc-a6e\"></a>后悔药</h3>\n<ol>\n<li>修改文件a.txt添加一行cccccc保存<ul>\n<li>用<code>git add a.txt</code>添加到暂存区</li>\n<li>用<code>git commit -m &quot;append cccccc&quot;</code>提交到版本库</li>\n</ul>\n</li>\n<li>用<code>git log</code>查看版本记录<pre><code class=\"hljs lang-dts\">$ git log\ncommit cccb318a93f00cd0dd092c8385354e0d34f3d226 (HEAD -&gt; master)\n<span class=\"hljs-symbol\">Author:</span> zxysilent <span class=\"hljs-params\">&lt;zxysilent@foxmail.com&gt;</span>\n<span class=\"hljs-symbol\">Date:</span>   Fri Nov <span class=\"hljs-number\">10</span> <span class=\"hljs-number\">21</span>:<span class=\"hljs-number\">50</span>:<span class=\"hljs-number\">35</span> <span class=\"hljs-number\">2017</span> +<span class=\"hljs-number\">0800</span>\n    append cccccc\ncommit <span class=\"hljs-number\">1</span>baf46dea014d993843137d3bf0aa56fe448699a\n<span class=\"hljs-symbol\">Author:</span> zxysilent <span class=\"hljs-params\">&lt;zxysilent@foxmail.com&gt;</span>\n<span class=\"hljs-symbol\">Date:</span>   Fri Nov <span class=\"hljs-number\">10</span> <span class=\"hljs-number\">21</span>:<span class=\"hljs-number\">18</span>:<span class=\"hljs-number\">13</span> <span class=\"hljs-number\">2017</span> +<span class=\"hljs-number\">0800</span>\n    append bbbbbb\ncommit caac3d8a845500c95f70499b40710826fcd644af\n<span class=\"hljs-symbol\">Author:</span> zxysilent <span class=\"hljs-params\">&lt;zxysilent@foxmail.com&gt;</span>\n<span class=\"hljs-symbol\">Date:</span>   Fri Nov <span class=\"hljs-number\">10</span> <span class=\"hljs-number\">21</span>:<span class=\"hljs-number\">00</span>:<span class=\"hljs-number\">34</span> <span class=\"hljs-number\">2017</span> +<span class=\"hljs-number\">0800</span>\n    write aaaaaa\n</code></pre></li>\n<li>用<code>git reset  --hard HEAD^</code> 把当前的版本回退到上一个版本(<strong>with two dashes</strong>)<pre><code class=\"hljs lang-sql\"> $ git <span class=\"hljs-keyword\">reset</span> <span class=\"hljs-comment\">--hard HEAD^</span>\n <span class=\"hljs-keyword\">HEAD</span> <span class=\"hljs-keyword\">is</span> <span class=\"hljs-keyword\">now</span> <span class=\"hljs-keyword\">at</span> <span class=\"hljs-number\">1</span>baf46d append bbbbbb\n</code></pre><blockquote>\n<p>要回退到上上个版本只需把<code>HEAD^</code>改成<code>HEAD^^</code>以此类推。<br>如果要回退到前100个版本的话，可以使用<code>git reset  –hard HEAD~100</code>即可<br>更多信息Please refer to Baidu!</p>\n</blockquote>\n</li>\n<li><p>用<code>git reset --hard commit_id</code> 把当前的版本切换到指定版本</p>\n<pre><code class=\"hljs lang-sql\"> $ git <span class=\"hljs-keyword\">reset</span> <span class=\"hljs-comment\">--hard caac3d8</span>\n <span class=\"hljs-keyword\">HEAD</span> <span class=\"hljs-keyword\">is</span> <span class=\"hljs-keyword\">now</span> <span class=\"hljs-keyword\">at</span> caac3d8 write aaaaaa\n</code></pre><blockquote>\n<p>一般输入<strong>前7个</strong>就可以了  </p>\n</blockquote>\n</li>\n<li><p>用<code>git log</code>查看版本记录</p>\n<pre><code class=\"hljs lang-dts\"> $ git log\n commit caac3d8a845500c95f70499b40710826fcd644af\n<span class=\"hljs-symbol\"> Author:</span> zxysilent <span class=\"hljs-params\">&lt;zxysilent@foxmail.com&gt;</span>\n<span class=\"hljs-symbol\"> Date:</span>   Fri Nov <span class=\"hljs-number\">10</span> <span class=\"hljs-number\">21</span>:<span class=\"hljs-number\">00</span>:<span class=\"hljs-number\">34</span> <span class=\"hljs-number\">2017</span> +<span class=\"hljs-number\">0800</span>\n     write aaaaaa\n</code></pre><p><strong>其他提交信息不见了，不见了</strong></p>\n</li>\n<li>用<code>git reflog</code>查看每次操作版本的记录<pre><code class=\"hljs lang-vim\"> $ git reflog\n caac3d8 (HEAD -&gt; master) HEAD@{<span class=\"hljs-number\">0</span>}: rese<span class=\"hljs-variable\">t:</span> moving <span class=\"hljs-keyword\">to</span> caac3d8\n <span class=\"hljs-number\">1</span>baf46d HEAD@{<span class=\"hljs-number\">1</span>}: rese<span class=\"hljs-variable\">t:</span> moving <span class=\"hljs-keyword\">to</span> HEAD^\n cccb318 HEAD@{<span class=\"hljs-number\">2</span>}: commi<span class=\"hljs-variable\">t:</span> <span class=\"hljs-keyword\">append</span> cccccc\n <span class=\"hljs-number\">1</span>baf46d HEAD@{<span class=\"hljs-number\">3</span>}: commi<span class=\"hljs-variable\">t:</span> <span class=\"hljs-keyword\">append</span> bbbbbb\n caac3d8 (HEAD -&gt; master) HEAD@{<span class=\"hljs-number\">4</span>}: commit (initial): <span class=\"hljs-keyword\">write</span> aaaaaa\n</code></pre><blockquote>\n<p>看到了熟悉的版本号又可以用<code>git reset --hard commit_id</code>切换到指定版本  </p>\n</blockquote>\n</li>\n</ol>\n<h4><a id=\"toc-5db\" class=\"anchor\" href=\"#toc-5db\"></a>小结</h4>\n<ul>\n<li><code>git log</code> 查看提交记录</li>\n<li><code>git reset --hard HEAD^</code> 把当前的版本回退到上一个版本</li>\n<li><code>git reflog</code> 查看每次操作版本的记录</li>\n<li><code>git reset --hard commit_id</code> 把当前的版本切换到指定版本  </li>\n</ul>\n<h3><a id=\"toc-a44\" class=\"anchor\" href=\"#toc-a44\"></a>撤销修改</h3>\n<h4><a id=\"toc-2c2\" class=\"anchor\" href=\"#toc-2c2\"></a>情形A(工作区)</h4>\n<ol>\n<li>修改文件a.txt添加一行dddeee保存并用<code>git status</code>查看工作区信息<pre><code class=\"hljs lang-sql\"> $ git status\n On branch master\n Changes not staged for <span class=\"hljs-keyword\">commit</span>:\n   (<span class=\"hljs-keyword\">use</span> <span class=\"hljs-string\">\"git add &lt;file&gt;...\"</span> <span class=\"hljs-keyword\">to</span> <span class=\"hljs-keyword\">update</span> what will be committed)\n   (<span class=\"hljs-keyword\">use</span> <span class=\"hljs-string\">\"git checkout -- &lt;file&gt;...\"</span> <span class=\"hljs-keyword\">to</span> discard changes <span class=\"hljs-keyword\">in</span> working <span class=\"hljs-keyword\">directory</span>)\n         modified:   a.txt\n <span class=\"hljs-keyword\">no</span> changes added <span class=\"hljs-keyword\">to</span> <span class=\"hljs-keyword\">commit</span> (<span class=\"hljs-keyword\">use</span> <span class=\"hljs-string\">\"git add\"</span> <span class=\"hljs-keyword\">and</span>/<span class=\"hljs-keyword\">or</span> <span class=\"hljs-string\">\"git commit -a\"</span>)\n</code></pre><strong>突然意识到</strong> 天啦不是应该dddddd<br>此处有重点<strong>  (use &quot;git checkout -- <file>...&quot; to discard changes in working directory)</strong></li>\n<li>用<code>git checkout -- a.txt</code> 丢弃工作区  <pre><code class=\"hljs lang-stylus\"> $ git checkout -- <span class=\"hljs-selector-tag\">a</span><span class=\"hljs-selector-class\">.txt</span>\n</code></pre>查看文件发现dddeee消失了<br><strong>注意这里有两种情况：</strong><blockquote>\n<p>一种是<code>a.txt</code>自修改后还没有被放到暂存区，现在，撤销修改就回到和版本库一模一样的状态；<br>一种是<code>a.txt</code>已经添加到暂存区后，又作了修改，现在，撤销修改就回到添加到暂存区后的状态。<br>总之，<code>git checkout -- &lt;file&gt;</code>就是让这个文件回到最近一次<code>git commit</code>或<code>git add</code>时的状态。</p>\n</blockquote>\n</li>\n</ol>\n<h4><a id=\"toc-448\" class=\"anchor\" href=\"#toc-448\"></a>情形B(暂存区)</h4>\n<ol>\n<li>修改文件a.txt添加一行fffggg保存然后用<code>git add a.txt</code>添加到暂存区再用<code>git status</code>查看工作区信息<pre><code class=\"hljs lang-stylus\"> $ git status\n On branch master\n Changes to be committed:\n   (use <span class=\"hljs-string\">\"git reset HEAD &lt;file&gt;...\"</span> to unstage)\n         modified:   <span class=\"hljs-selector-tag\">a</span><span class=\"hljs-selector-class\">.txt</span>\n</code></pre>此处又有重点<strong>  (use &quot;git reset HEAD <file>...&quot; to unstage)</strong><blockquote>\n<p>Index/Stage:暂存区<br>要多看提示信息</p>\n</blockquote>\n</li>\n<li>用<code>git reset HEAD  a.txt</code> 暂存区的修改撤销掉  <pre><code class=\"hljs lang-stylus\">$ git reset head <span class=\"hljs-selector-tag\">a</span><span class=\"hljs-selector-class\">.txt</span>\nUnstaged changes after reset:\nM       <span class=\"hljs-selector-tag\">a</span><span class=\"hljs-selector-class\">.txt</span>\n</code></pre></li>\n<li>用<code>git status</code>查看工作区信息<pre><code class=\"hljs lang-sql\"> $ git status\n On branch master\n Changes not staged for <span class=\"hljs-keyword\">commit</span>:\n   (<span class=\"hljs-keyword\">use</span> <span class=\"hljs-string\">\"git add &lt;file&gt;...\"</span> <span class=\"hljs-keyword\">to</span> <span class=\"hljs-keyword\">update</span> what will be committed)\n   (<span class=\"hljs-keyword\">use</span> <span class=\"hljs-string\">\"git checkout -- &lt;file&gt;...\"</span> <span class=\"hljs-keyword\">to</span> discard changes <span class=\"hljs-keyword\">in</span> working <span class=\"hljs-keyword\">directory</span>)\n         modified:   a.txt\n <span class=\"hljs-keyword\">no</span> changes added <span class=\"hljs-keyword\">to</span> <span class=\"hljs-keyword\">commit</span> (<span class=\"hljs-keyword\">use</span> <span class=\"hljs-string\">\"git add\"</span> <span class=\"hljs-keyword\">and</span>/<span class=\"hljs-keyword\">or</span> <span class=\"hljs-string\">\"git commit -a\"</span>)\n</code></pre><blockquote>\n<p>现在暂存区是干净的，工作区有修改<br><code>git checkout -- &lt;file&gt;</code> 丢弃工作区</p>\n</blockquote>\n</li>\n</ol>\n<h4><a id=\"toc-cd3\" class=\"anchor\" href=\"#toc-cd3\"></a>情形C</h4>\n<blockquote>\n<p>版本库？<br><code>git reset --hard commit_id</code>为所欲为</p>\n</blockquote>\n<h4><a id=\"toc-5db\" class=\"anchor\" href=\"#toc-5db\"></a>小结</h4>\n<ul>\n<li>工作区修改<strong>未</strong>提交 <code>git checkout -- &lt;file&gt;</code> 工作区撤销到<strong>版本库</strong>一样</li>\n<li>工作区修改<strong>已经</strong>提交 <code>git checkout -- &lt;file&gt;</code> 工作区撤销到<strong>暂存区</strong>一样</li>\n<li>工作区修改<strong>已经</strong>提交 <code></code>git reset HEAD  a.txt` 暂存区的修改撤销掉  </li>\n<li><code>git reset --hard commit_id</code> 把当前的版本切换到指定版本</li>\n</ul>\n<h3><a id=\"toc-535\" class=\"anchor\" href=\"#toc-535\"></a>删除文件</h3>\n<ol>\n<li>添加t.txt文件写上一点数据tttttt添加到暂存区(<code>git add t.txt</code>)并且提交到版本库(<code>git commit -m &quot;备注信息&quot;</code>)<pre><code class=\"hljs lang-sql\"> git add t.txt\n $ git <span class=\"hljs-keyword\">commit</span> -m <span class=\"hljs-string\">\"add t.txt\"</span>\n [<span class=\"hljs-keyword\">master</span> <span class=\"hljs-number\">2</span>d0d9fa] <span class=\"hljs-keyword\">add</span> t.txt\n  <span class=\"hljs-number\">1</span> <span class=\"hljs-keyword\">file</span> <span class=\"hljs-keyword\">changed</span>, <span class=\"hljs-number\">1</span> insertion(+)\n  <span class=\"hljs-keyword\">create</span> <span class=\"hljs-keyword\">mode</span> <span class=\"hljs-number\">100644</span> t.txt\n</code></pre></li>\n<li><p>删除t.txt并用<code>git status</code>查看工作区信息</p>\n<pre><code class=\"hljs lang-sql\"> $ git status\n On branch master\n Changes not staged for <span class=\"hljs-keyword\">commit</span>:\n   (<span class=\"hljs-keyword\">use</span> <span class=\"hljs-string\">\"git add/rm &lt;file&gt;...\"</span> <span class=\"hljs-keyword\">to</span> <span class=\"hljs-keyword\">update</span> what will be committed)\n   (<span class=\"hljs-keyword\">use</span> <span class=\"hljs-string\">\"git checkout -- &lt;file&gt;...\"</span> <span class=\"hljs-keyword\">to</span> discard changes <span class=\"hljs-keyword\">in</span> working <span class=\"hljs-keyword\">directory</span>)\n         deleted:    t.txt\n <span class=\"hljs-keyword\">no</span> changes added <span class=\"hljs-keyword\">to</span> <span class=\"hljs-keyword\">commit</span> (<span class=\"hljs-keyword\">use</span> <span class=\"hljs-string\">\"git add\"</span> <span class=\"hljs-keyword\">and</span>/<span class=\"hljs-keyword\">or</span> <span class=\"hljs-string\">\"git commit -a\"</span>)\n</code></pre><p>此处有重点</p>\n<blockquote>\n<p>(use &quot;git add/rm <file>...&quot; to update what will be committed)<br>(use &quot;git checkout -- <file>...&quot; to discard changes in working directory)  </p>\n</blockquote>\n<ul>\n<li>用<code>git checkout -- &lt;file&gt;</code> 撤销删除<pre><code class=\"hljs lang-shell\"><span class=\"hljs-meta\">$</span><span class=\"bash\"> git checkout -- t.txt</span>\n</code></pre></li>\n</ul>\n</li>\n<li>用 <code>git add/rm &lt;file&gt;</code>  并用 <code>git commit -m &quot;备注信息&quot;</code> 从版本库中删除<pre><code class=\"hljs lang-sql\">  $ git rm t.txt\n  rm \'t.txt\'\n  $ git <span class=\"hljs-keyword\">commit</span> -m <span class=\"hljs-string\">\"delete t.txt\"</span>\n  [<span class=\"hljs-keyword\">master</span> <span class=\"hljs-number\">3</span>b3b9f2] <span class=\"hljs-keyword\">delete</span> t.txt\n   <span class=\"hljs-number\">1</span> <span class=\"hljs-keyword\">file</span> <span class=\"hljs-keyword\">changed</span>, <span class=\"hljs-number\">1</span> deletion(-)\n   <span class=\"hljs-keyword\">delete</span> <span class=\"hljs-keyword\">mode</span> <span class=\"hljs-number\">100644</span> t.txt\n</code></pre></li>\n</ol>\n<h4><a id=\"toc-5db\" class=\"anchor\" href=\"#toc-5db\"></a>小结</h4>\n<ul>\n<li><code>git rm &lt;file&gt;</code> and <code>git commit -m &quot;备注信息&quot;</code>从版本库删除</li>\n<li>误删除 <code>git checkout -- &lt;file&gt;</code> 撤销删除</li>\n</ul>\n', '1', '2017-11-10 21:20:08', '2018-07-12 16:45:54', '1', '0', '{\"template\":\"\",\"featuredImage\":\"\",\"push_sites\":[]}');
  INSERT INTO `post` VALUES ('30', '1', '1', '0', '3', '使用visual studio express 写c语言', 'vs-express-c', '<h3 id=\"-\">相关工具</h3>\n<p>下载地址<br><a href=\"https://pan.baidu.com/s/1kWz99p9\">https://pan.baidu.com/s/1kWz99p9</a><br><a href=\"https://pan.baidu.com/s/1kWz99p9\">点击下载工具</a><br><a href=\"https://pan.baidu.com/s/1kWz99p9\">视频操作记录</a></p>\n<blockquote>\n<p>包括之前的资料</p>\n</blockquote>\n<p><img src=\"/res/upimg/20180301/GOyOYTiO8bzlBDwCcsc15KHh.png\" alt=\"alt\"></p>\n<h3 id=\"-\">软件安装</h3>\n', '### 相关工具\n下载地址  \nhttps://pan.baidu.com/s/1kWz99p9   \n[点击下载工具](https://pan.baidu.com/s/1kWz99p9)   \n[视频操作记录](https://pan.baidu.com/s/1kWz99p9)\n> 包括之前的资料\n\n![alt](/res/upimg/20180301/GOyOYTiO8bzlBDwCcsc15KHh.png)\n### 软件安装\n<!--more-->\n- 选择合适的地方  \n![alt](/res/upimg/20180301/9dVZp-WIg8Nq1xUzHV13_sqq.png)\n- 点击安装然后等待\n- 安装完成选择启动  \n![alt](/res/upimg/20180301/2FXuxP3VQQU0N7MFRr_aWeiI.png)\n![alt](/res/upimg/20180301/b-m6eS29FLH1lvTEiBQ4bzp-.png)\n>没有账号不登陆\n\n    **注意**  \n由于之前我已经安装过可能第一次安装会出现不一样的地方\n>若出现设置开发环境请选择常规开发  \n>若出现设置文档请选择无\n\n\n### 软件设置-可跳过(强迫症请进)\n- 设置字体  \n![alt](/res/upimg/20180301/55egT2s4NHSlwXYKOrHVBl5D.png)\n![alt](/res/upimg/20180301/f476aBqOH8lYAe8KS4VE9X2s.png)\n- 其他设置  \n![alt](/res/upimg/20180301/0J-z8g3G3srQd9JcD1kVpnUU.png)\n![alt](/res/upimg/20180301/M9z4laQHxwHgmrRspE5bDsMT.png)\n### 写c语言\n- 新建项目  \n![alt](/res/upimg/20180301/SK7G_OZZYypqdjINX4EgWIOe.png)\n- 项目配置  \n![alt](/res/upimg/20180301/POfxAteYsopZFyC045vb8v.png)\n![alt](/res/upimg/20180301/OT7pnAcru-8mT9IeZvXzpY26.png)\n![alt](/res/upimg/20180301/ElMWbhArxoROmfgSOemqUdDF.png)\n- 新建代码页面  \n![alt](/res/upimg/20180301/-Qm6FyIDW7k85kbe0WpM00Zr.png)\n\n- 第一次代码  \n```\n#include \"stdio.h\"\n// 智能提示很丰富\n// 一个基本的框架\nint main(){\n	// 标准的例子\n	printf(\"hello world\");\n	return 0;\n}\n```\n**注意**\n> ctrl + f5 运行\n\n### 其它\n- **当需要获取输入的时候请添加一个宏**\n```\n// 定义一个宏 取消警告 则可以运行书上例子\n#define _CRT_SECURE_NO_WARNINGS\n```\n- 完整示例  \n```\n// 定义一个宏 取消警告 则可以运行书上例子\n#define _CRT_SECURE_NO_WARNINGS\n// 引入标准库\n#include \"stdio.h\"\n// 智能提示很丰富\n// 一个基本的框架\nint main(){\n	// 定义一个变量\n	int ipt;\n	printf(\"请输入一个数字:\");\n	// 获取输入\n	scanf(\"%d\",&ipt);\n	printf(\"你输入的是:%d\", ipt);\n	// 可能有时候会出现警告导致编译失败 \n	// 标准的例子\n	printf(\"hello world\");\n	return 0;\n}\n```', '<div class=\"toc\"><ul>\n<li><a href=\"#toc-3f3\">相关工具</a></li>\n<li><a href=\"#toc-6aa\">软件安装</a></li>\n<li><a href=\"#toc-8a5\">软件设置-可跳过(强迫症请进)</a></li>\n<li><a href=\"#toc-dac\">写c语言</a></li>\n<li><a href=\"#toc-5a0\">其它</a></li>\n</ul>\n</div><h3><a id=\"toc-3f3\" class=\"anchor\" href=\"#toc-3f3\"></a>相关工具</h3>\n<p>下载地址<br><a href=\"https://pan.baidu.com/s/1kWz99p9\">https://pan.baidu.com/s/1kWz99p9</a><br><a href=\"https://pan.baidu.com/s/1kWz99p9\">点击下载工具</a><br><a href=\"https://pan.baidu.com/s/1kWz99p9\">视频操作记录</a></p>\n<blockquote>\n<p>包括之前的资料</p>\n</blockquote>\n<p><img src=\"/res/upimg/20180301/GOyOYTiO8bzlBDwCcsc15KHh.png\" alt=\"alt\"></p>\n<h3><a id=\"toc-6aa\" class=\"anchor\" href=\"#toc-6aa\"></a>软件安装</h3>\n<!--more-->\n<ul>\n<li>选择合适的地方<br><img src=\"/res/upimg/20180301/9dVZp-WIg8Nq1xUzHV13_sqq.png\" alt=\"alt\"></li>\n<li>点击安装然后等待</li>\n<li><p>安装完成选择启动<br><img src=\"/res/upimg/20180301/2FXuxP3VQQU0N7MFRr_aWeiI.png\" alt=\"alt\">\n<img src=\"/res/upimg/20180301/b-m6eS29FLH1lvTEiBQ4bzp-.png\" alt=\"alt\"></p>\n<blockquote>\n<p>没有账号不登陆</p>\n</blockquote>\n<p>  <strong>注意</strong><br>由于之前我已经安装过可能第一次安装会出现不一样的地方</p>\n<blockquote>\n<p>若出现设置开发环境请选择常规开发<br>若出现设置文档请选择无</p>\n</blockquote>\n</li>\n</ul>\n<h3><a id=\"toc-8a5\" class=\"anchor\" href=\"#toc-8a5\"></a>软件设置-可跳过(强迫症请进)</h3>\n<ul>\n<li>设置字体<br><img src=\"/res/upimg/20180301/55egT2s4NHSlwXYKOrHVBl5D.png\" alt=\"alt\">\n<img src=\"/res/upimg/20180301/f476aBqOH8lYAe8KS4VE9X2s.png\" alt=\"alt\"></li>\n<li>其他设置<br><img src=\"/res/upimg/20180301/0J-z8g3G3srQd9JcD1kVpnUU.png\" alt=\"alt\">\n<img src=\"/res/upimg/20180301/M9z4laQHxwHgmrRspE5bDsMT.png\" alt=\"alt\"><h3><a id=\"toc-dac\" class=\"anchor\" href=\"#toc-dac\"></a>写c语言</h3>\n</li>\n<li>新建项目<br><img src=\"/res/upimg/20180301/SK7G_OZZYypqdjINX4EgWIOe.png\" alt=\"alt\"></li>\n<li>项目配置<br><img src=\"/res/upimg/20180301/POfxAteYsopZFyC045vb8v.png\" alt=\"alt\">\n<img src=\"/res/upimg/20180301/OT7pnAcru-8mT9IeZvXzpY26.png\" alt=\"alt\">\n<img src=\"/res/upimg/20180301/ElMWbhArxoROmfgSOemqUdDF.png\" alt=\"alt\"></li>\n<li><p>新建代码页面<br><img src=\"/res/upimg/20180301/-Qm6FyIDW7k85kbe0WpM00Zr.png\" alt=\"alt\"></p>\n</li>\n<li><p>第一次代码  </p>\n<pre><code class=\"hljs lang-cpp\"><span class=\"hljs-meta\">#<span class=\"hljs-meta-keyword\">include</span> <span class=\"hljs-meta-string\">\"stdio.h\"</span></span>\n<span class=\"hljs-comment\">// 智能提示很丰富</span>\n<span class=\"hljs-comment\">// 一个基本的框架</span>\n<span class=\"hljs-function\"><span class=\"hljs-keyword\">int</span> <span class=\"hljs-title\">main</span><span class=\"hljs-params\">()</span></span>{\n  <span class=\"hljs-comment\">// 标准的例子</span>\n  <span class=\"hljs-built_in\">printf</span>(<span class=\"hljs-string\">\"hello world\"</span>);\n  <span class=\"hljs-keyword\">return</span> <span class=\"hljs-number\">0</span>;\n}\n</code></pre><p><strong>注意</strong></p>\n<blockquote>\n<p>ctrl + f5 运行</p>\n</blockquote>\n</li>\n</ul>\n<h3><a id=\"toc-5a0\" class=\"anchor\" href=\"#toc-5a0\"></a>其它</h3>\n<ul>\n<li><strong>当需要获取输入的时候请添加一个宏</strong><pre><code class=\"hljs lang-cpp\"><span class=\"hljs-comment\">// 定义一个宏 取消警告 则可以运行书上例子</span>\n<span class=\"hljs-meta\">#<span class=\"hljs-meta-keyword\">define</span> _CRT_SECURE_NO_WARNINGS</span>\n</code></pre></li>\n<li>完整示例  <pre><code class=\"hljs lang-cpp\"><span class=\"hljs-comment\">// 定义一个宏 取消警告 则可以运行书上例子</span>\n<span class=\"hljs-meta\">#<span class=\"hljs-meta-keyword\">define</span> _CRT_SECURE_NO_WARNINGS</span>\n<span class=\"hljs-comment\">// 引入标准库</span>\n<span class=\"hljs-meta\">#<span class=\"hljs-meta-keyword\">include</span> <span class=\"hljs-meta-string\">\"stdio.h\"</span></span>\n<span class=\"hljs-comment\">// 智能提示很丰富</span>\n<span class=\"hljs-comment\">// 一个基本的框架</span>\n<span class=\"hljs-function\"><span class=\"hljs-keyword\">int</span> <span class=\"hljs-title\">main</span><span class=\"hljs-params\">()</span></span>{\n  <span class=\"hljs-comment\">// 定义一个变量</span>\n  <span class=\"hljs-keyword\">int</span> ipt;\n  <span class=\"hljs-built_in\">printf</span>(<span class=\"hljs-string\">\"请输入一个数字:\"</span>);\n  <span class=\"hljs-comment\">// 获取输入</span>\n  <span class=\"hljs-built_in\">scanf</span>(<span class=\"hljs-string\">\"%d\"</span>,&amp;ipt);\n  <span class=\"hljs-built_in\">printf</span>(<span class=\"hljs-string\">\"你输入的是:%d\"</span>, ipt);\n  <span class=\"hljs-comment\">// 可能有时候会出现警告导致编译失败 </span>\n  <span class=\"hljs-comment\">// 标准的例子</span>\n  <span class=\"hljs-built_in\">printf</span>(<span class=\"hljs-string\">\"hello world\"</span>);\n  <span class=\"hljs-keyword\">return</span> <span class=\"hljs-number\">0</span>;\n}\n</code></pre></li>\n</ul>\n', '1', '2018-03-01 17:13:55', '2018-09-20 15:01:10', '1', '0', '{\"template\":\"\",\"featuredImage\":\"\",\"push_sites\":[]}');
  INSERT INTO `post` VALUES ('31', '1', '3', '0', '0', 'Server Side Include', 'ssi', '<h2><a id=\"description_0\"></a>description</h2>\n<p>服务器端嵌入或者叫服务器端包含，是Server Side Include的简写。SSI技术通过在文档中加入SSI指令，让服务器端在输出文档之前解析SSI指令，并把解析完的结果和文档一同输出给客户端。</p>\n<h2><a id=\"NginxSSI_2\"></a>Nginx配置SSI</h2>\n', '## description\n服务器端嵌入或者叫服务器端包含，是Server Side Include的简写。SSI技术通过在文档中加入SSI指令，让服务器端在输出文档之前解析SSI指令，并把解析完的结果和文档一同输出给客户端。\n## Nginx配置SSI\n\n<!--more-->\n```\nserver {  \n    listen  10.3.9.27:80;  \n    server_name  www.zxysilent.com;  \n    location / {  \n        ssi on;  \n        ssi_silent_errors on;  \n        ssi_types text/shtml;  \n        index index.shtml;  \n        root /usr/local/web/wwwroot;  \n        expires 30d;  \n        access_log      /data/logs/ www.zxysilent.com-access_log main;  \n    }  \n}  \n```\n## 使用SSI\n\n### base\n格式：```<!-- #指令名称 参数=\"参数值\">```\n\neg： ```<!--#include file=\"info.htm\"-->```\n\n说明：```<!-- -->```是HTML语法中表示注释，当WEB服务器不支持SSI时，会忽略这些信息。\n\n```#include``` 为SSI指令之一。\n```file``` 为```include```的参数， ```info.htm```为参数值，在本指令中指将要包含的文档名。\n\n**注意**\n前面与```#```号间无空格，只有SSI指令与参数间存在空格。\nSSI指令是大小写敏感的，因此参数必须是小写才会起作用。\n\n\n### include\n> 把其它文档插入到当前被解析的文档中\n\n```\n<!--#include file=\"file_name_extension\"--> \n```\nfile 指定包含文件相对于本文档的位置\n```\n<!--#include virtual=\"/path/file_name_extension\"-->\n```\nvirtual 指定相对于服务器文档根目录的位置\n\n- file 文件名是一个相对路径，该路径相对于使用 #include 指令的文档所在的目录。被包含文件可以在同一级目录或其子目录中，但不能在上一级目录中。如表示当前目录下的的```naver.html```文档，则为```file=\"naver.html```。\n- virtual 文件名是 Web 站点上的虚拟目录的完整路径。如表示相对于服务器文档根目录下```inc```目录下的```naver.html```文件；则为        ```virtual=\"/inc/naver.html\"```\n**注意** 文件名称必须带有扩展名。\n\n### echo\n> 将环境变量插入到页面中\n\n```\n<!--#echo var=\"变量名称\"-->\n```\neg\n```\n<!--#echo var=\"DOCUMENT_NAME\"--> 本文档名称\n<!--#echo var=\"DATE_LOCAL\"--> 现在时间\n<!--#echo var=\"REMOTE_ADDR\"--> 你的IP地址\n\n```\n### flastmod \n> 显示指定文件的最后修改日期\n\n```\n<!--#flastmod file=\"file_name_extension\"--> \n<!--#flastmod virtual=\"/path/file_name_extension\"-->\n```\n\n### fsize\n> 显示文件的大小\n\n```\n<!--#fsize file=\"文件名称\"-->\n```\n### exec\n> 将某一外部程序的输出插入到页面中。可插入CGI程序或者是常规应用程序的输入，这取决于使用的参数是cmd还是cgi\n\n```\n<!--#exec cmd=\"file_name_extension\"-->\n```\ncmd 常规应用程序\n```\n<!--#exec cgi=\"file_name_extension\"-->\n```\nCGI脚本程序\neg\n```\n<!--#exec cmd=\"dir /b\"--> 将会显示当前目录下文件列表\n<!--#exec cgi=\"/cgi-bin/demo.cgi\"--> 将会执行CGI程序demo.cgi。\n```\n### config\n>  指定返回给客户端浏览器的错误信息、日期和文件大小的格式\n\n```\n<!--#config errmsg=\"自定义错误信息\"-->\n```\n errmsg 自定义SSI执行错误信息，可以为任何你喜欢的方式。\n```\n<!--#config sizefmt=\"显示单位\"-->\n```\nsizefmt 文件大小显示方式，默认为字节方式(\"bytes\")可以改为千字节方式(\"abbrev\")\n```\n<!--#config timefmt=\"显示格式\"-->\n```\n> timefmt 时间显示方式，最灵活的配置属性。\n\neg\n- 显示一个不存在文件的大小\n```\n<!--#config errmsg=\"服务器执行错误，请联系管理员\"-->\n<!--#fsize file=\"noexist.htm\"-->\n```\n- 以千字节方式显示文件大小\n```\n<!--#config sizefmt=\"abbrev\"-->  \n<!--#fsizefile=\"news.htm\"-->\n```\n- 以特定的时间格式显示时间\n```\n<!--#config timefmt=\"%Y年/%m月%d日 星期%W 北京时间%H:%M:%s，%Y年已过去了%j天 今天是%Y年的第%U个星期\"-->\n<!--#echo var=\"DATE_LOCAL\"--> 显示今天是星期几，几月，时区\n```\n\n时间格式\n\n```\n%a 一周中某天的缩写（例如，Mon）。\n%A 一周中某天的全称（例如，Monday）。\n%b 月份的缩写（例如，Feb）。\n%B 月份的全称（例如，February）。\n%c 当地的日期和时间的表示（例如，05/06/91 12:51:32）。\n%d 以十进制数字表示的一个月中的某天 (01-31)。\n%H 24 小时格式 (00-23)。\n%I 12 小时格式 (01-12)。\n%j 以十进制数字表示一年中的某天 (001-366)。\n%m 以十进制数字表示的月份 (01-12)。\n%M 以十进制数字表示的分 (00-59)。\n%p 当地的上午或下午指示符（例如，PM）。\n%S 以十进制数字表示的秒 (00-59)。\n%U 以十进制数字表示一年中的某一周，星期日作为一周的开始 (00-51)。\n%w 以十进制数字表示一周中的某一天，星期天是第一天 (0-6)。\n%W 以十进制数字表示一年中的某一天，星期一作为一周的开始 (00-51)。\n%x 当地的日期表示（例如，05/06/91）。\n%X 当地的时间表示（例如，12:51:32）。\n%y 以十进制数字表示的不带有世纪的年（例如，69）。\n%Y 以十进制数字表示的带有世纪的年（例如，1969）。\n%z, %Z 时区全称或缩写；如果不知道时区，则没有字符。\n```', '<div class=\"toc\"><ul><li><a href=\"#toc_description_0\">description</a></li><li><a href=\"#toc_NginxSSI_2\">Nginx配置SSI</a></li><li><a href=\"#toc_SSI_20\">使用SSI</a><ul><li><a href=\"#toc_base_22\">base</a></li><li><a href=\"#toc_include_37\">include</a></li><li><a href=\"#toc_echo_53\">echo</a></li><li><a href=\"#toc_flastmod_66\">flastmod</a></li><li><a href=\"#toc_fsize_74\">fsize</a></li><li><a href=\"#toc_exec_80\">exec</a></li><li><a href=\"#toc_config_96\">config</a></li></ul></li></ul></div><h2><a id=\"toc_description_0\"></a>description</h2>\n<p>服务器端嵌入或者叫服务器端包含，是Server Side Include的简写。SSI技术通过在文档中加入SSI指令，让服务器端在输出文档之前解析SSI指令，并把解析完的结果和文档一同输出给客户端。</p>\n<h2><a id=\"toc_NginxSSI_2\"></a>Nginx配置SSI</h2>\n<!--more-->\n<pre><code class=\"lang-\">server {  \n    listen  10.3.9.27:80;  \n    server_name  www.zxysilent.com;  \n    location / {  \n        ssi on;  \n        ssi_silent_errors on;  \n        ssi_types text/shtml;  \n        index index.shtml;  \n        root /usr/local/web/wwwroot;  \n        expires 30d;  \n        access_log      /data/logs/ www.zxysilent.com-access_log main;  \n    }  \n}  \n</code></pre>\n<h2><a id=\"toc_SSI_20\"></a>使用SSI</h2>\n<h3><a id=\"toc_base_22\"></a>base</h3>\n<p>格式：<code>&lt;!-- #指令名称 参数=&quot;参数值&quot;&gt;</code></p>\n<p>eg： <code>&lt;!--#include file=&quot;info.htm&quot;--&gt;</code></p>\n<p>说明：<code>&lt;!-- --&gt;</code>是HTML语法中表示注释，当WEB服务器不支持SSI时，会忽略这些信息。</p>\n<p><code>#include</code> 为SSI指令之一。<br />\n<code>file</code> 为<code>include</code>的参数， <code>info.htm</code>为参数值，在本指令中指将要包含的文档名。</p>\n<p><strong>注意</strong><br />\n前面与<code>#</code>号间无空格，只有SSI指令与参数间存在空格。<br />\nSSI指令是大小写敏感的，因此参数必须是小写才会起作用。</p>\n<h3><a id=\"toc_include_37\"></a>include</h3>\n<blockquote>\n<p>把其它文档插入到当前被解析的文档中</p>\n</blockquote>\n<pre><code class=\"lang-\">&lt;!--#include file=&quot;file_name_extension&quot;--&gt; \n</code></pre>\n<p>file 指定包含文件相对于本文档的位置</p>\n<pre><code class=\"lang-\">&lt;!--#include virtual=&quot;/path/file_name_extension&quot;--&gt;\n</code></pre>\n<p>virtual 指定相对于服务器文档根目录的位置</p>\n<ul>\n<li>file 文件名是一个相对路径，该路径相对于使用 #include 指令的文档所在的目录。被包含文件可以在同一级目录或其子目录中，但不能在上一级目录中。如表示当前目录下的的<code>naver.html</code>文档，则为<code>file=&quot;naver.html</code>。</li>\n<li>virtual 文件名是 Web 站点上的虚拟目录的完整路径。如表示相对于服务器文档根目录下<code>inc</code>目录下的<code>naver.html</code>文件；则为        <code>virtual=&quot;/inc/naver.html&quot;</code><br />\n<strong>注意</strong> 文件名称必须带有扩展名。</li>\n</ul>\n<h3><a id=\"toc_echo_53\"></a>echo</h3>\n<blockquote>\n<p>将环境变量插入到页面中</p>\n</blockquote>\n<pre><code class=\"lang-\">&lt;!--#echo var=&quot;变量名称&quot;--&gt;\n</code></pre>\n<p>eg</p>\n<pre><code class=\"lang-\">&lt;!--#echo var=&quot;DOCUMENT_NAME&quot;--&gt; 本文档名称\n&lt;!--#echo var=&quot;DATE_LOCAL&quot;--&gt; 现在时间\n&lt;!--#echo var=&quot;REMOTE_ADDR&quot;--&gt; 你的IP地址\n\n</code></pre>\n<h3><a id=\"toc_flastmod_66\"></a>flastmod</h3>\n<blockquote>\n<p>显示指定文件的最后修改日期</p>\n</blockquote>\n<pre><code class=\"lang-\">&lt;!--#flastmod file=&quot;file_name_extension&quot;--&gt; \n&lt;!--#flastmod virtual=&quot;/path/file_name_extension&quot;--&gt;\n</code></pre>\n<h3><a id=\"toc_fsize_74\"></a>fsize</h3>\n<blockquote>\n<p>显示文件的大小</p>\n</blockquote>\n<pre><code class=\"lang-\">&lt;!--#fsize file=&quot;文件名称&quot;--&gt;\n</code></pre>\n<h3><a id=\"toc_exec_80\"></a>exec</h3>\n<blockquote>\n<p>将某一外部程序的输出插入到页面中。可插入CGI程序或者是常规应用程序的输入，这取决于使用的参数是cmd还是cgi</p>\n</blockquote>\n<pre><code class=\"lang-\">&lt;!--#exec cmd=&quot;file_name_extension&quot;--&gt;\n</code></pre>\n<p>cmd 常规应用程序</p>\n<pre><code class=\"lang-\">&lt;!--#exec cgi=&quot;file_name_extension&quot;--&gt;\n</code></pre>\n<p>CGI脚本程序<br />\neg</p>\n<pre><code class=\"lang-\">&lt;!--#exec cmd=&quot;dir /b&quot;--&gt; 将会显示当前目录下文件列表\n&lt;!--#exec cgi=&quot;/cgi-bin/demo.cgi&quot;--&gt; 将会执行CGI程序demo.cgi。\n</code></pre>\n<h3><a id=\"toc_config_96\"></a>config</h3>\n<blockquote>\n<p>指定返回给客户端浏览器的错误信息、日期和文件大小的格式</p>\n</blockquote>\n<pre><code class=\"lang-\">&lt;!--#config errmsg=&quot;自定义错误信息&quot;--&gt;\n</code></pre>\n<p>errmsg 自定义SSI执行错误信息，可以为任何你喜欢的方式。</p>\n<pre><code class=\"lang-\">&lt;!--#config sizefmt=&quot;显示单位&quot;--&gt;\n</code></pre>\n<p>sizefmt 文件大小显示方式，默认为字节方式(“bytes”)可以改为千字节方式(“abbrev”)</p>\n<pre><code class=\"lang-\">&lt;!--#config timefmt=&quot;显示格式&quot;--&gt;\n</code></pre>\n<blockquote>\n<p>timefmt 时间显示方式，最灵活的配置属性。</p>\n</blockquote>\n<p>eg</p>\n<ul>\n<li>显示一个不存在文件的大小</li>\n</ul>\n<pre><code class=\"lang-\">&lt;!--#config errmsg=&quot;服务器执行错误，请联系管理员&quot;--&gt;\n&lt;!--#fsize file=&quot;noexist.htm&quot;--&gt;\n</code></pre>\n<ul>\n<li>以千字节方式显示文件大小</li>\n</ul>\n<pre><code class=\"lang-\">&lt;!--#config sizefmt=&quot;abbrev&quot;--&gt;  \n&lt;!--#fsizefile=&quot;news.htm&quot;--&gt;\n</code></pre>\n<ul>\n<li>以特定的时间格式显示时间</li>\n</ul>\n<pre><code class=\"lang-\">&lt;!--#config timefmt=&quot;%Y年/%m月%d日 星期%W 北京时间%H:%M:%s，%Y年已过去了%j天 今天是%Y年的第%U个星期&quot;--&gt;\n&lt;!--#echo var=&quot;DATE_LOCAL&quot;--&gt; 显示今天是星期几，几月，时区\n</code></pre>\n<p>时间格式</p>\n<pre><code class=\"lang-\">%a 一周中某天的缩写（例如，Mon）。\n%A 一周中某天的全称（例如，Monday）。\n%b 月份的缩写（例如，Feb）。\n%B 月份的全称（例如，February）。\n%c 当地的日期和时间的表示（例如，05/06/91 12:51:32）。\n%d 以十进制数字表示的一个月中的某天 (01-31)。\n%H 24 小时格式 (00-23)。\n%I 12 小时格式 (01-12)。\n%j 以十进制数字表示一年中的某天 (001-366)。\n%m 以十进制数字表示的月份 (01-12)。\n%M 以十进制数字表示的分 (00-59)。\n%p 当地的上午或下午指示符（例如，PM）。\n%S 以十进制数字表示的秒 (00-59)。\n%U 以十进制数字表示一年中的某一周，星期日作为一周的开始 (00-51)。\n%w 以十进制数字表示一周中的某一天，星期天是第一天 (0-6)。\n%W 以十进制数字表示一年中的某一天，星期一作为一周的开始 (00-51)。\n%x 当地的日期表示（例如，05/06/91）。\n%X 当地的时间表示（例如，12:51:32）。\n%y 以十进制数字表示的不带有世纪的年（例如，69）。\n%Y 以十进制数字表示的带有世纪的年（例如，1969）。\n%z, %Z 时区全称或缩写；如果不知道时区，则没有字符。\n</code></pre>\n', '1', '2018-03-11 16:41:34', '2018-03-12 12:02:23', '1', '0', '{\"template\":\"\",\"featuredImage\":\"\",\"push_sites\":[]}');
  INSERT INTO `post` VALUES ('32', '1', '3', '0', '3', 'clang 链接mysql', 'c-mysql', '<p>c语言尝试操作mysql</p>\n', 'c语言尝试操作mysql\n<!--more-->\n```\n#define _CRT_SECURE_NO_WARNINGS\n#include <stdio.h>\n#include <stdlib.h>\n#include <winsock.h>\n#include <mysql.h>\n\nint main() {\n	printf(\"Content-type:text/html\\n\\n\");\n	for (int i = 0; i < 1; i++) {\n		printf(\"hello c (%d) <br/>\\n\", i);\n	}\n	MYSQL *mysql = mysql_init(NULL);\n	if (mysql_real_connect(mysql, \"localhost\", \"root\", \"root\", \"xj2014\", 3306, NULL, 0)) {\n		printf(\"数据库连接成功\\n\");\n		if (mysql_set_character_set(mysql, \"gbk\")) {\n			printf(\"编码设置失败:%s\\n\",mysql_error(mysql));\n			exit(1);\n		}\n		if (mysql_query(mysql, \"select num,name,classs from userinfo limit 10\")) {\n			printf(\"查询出错:%s\\n\", mysql_error(mysql));\n			exit(1);\n		};\n		MYSQL_RES*	res = mysql_store_result(mysql);\n		MYSQL_ROW row;\n		while (row = mysql_fetch_row(res)) {\n			printf(\"\\n学号=%s\\t姓名=%s\\t班级=%s\", row[0], row[1],row[2]);\n		}\n		mysql_free_result(res);\n		mysql_close(mysql);\n	} else {\n		printf(\"数据库连接失败\\n\");\n		exit(1);\n	}\n	Sleep(500);\n	return 0;\n}\n```', '<div class=\"toc\"></div><p>c语言尝试操作mysql\n<!--more--></p>\n<pre><code class=\"hljs lang-awk\"><span class=\"hljs-comment\">#define _CRT_SECURE_NO_WARNINGS</span>\n<span class=\"hljs-comment\">#include &lt;stdio.h&gt;</span>\n<span class=\"hljs-comment\">#include &lt;stdlib.h&gt;</span>\n<span class=\"hljs-comment\">#include &lt;winsock.h&gt;</span>\n<span class=\"hljs-comment\">#include &lt;mysql.h&gt;</span>\n\nint main() {\n    printf(<span class=\"hljs-string\">\"Content-type:text/html\\n\\n\"</span>);\n    <span class=\"hljs-keyword\">for</span> (int i = <span class=\"hljs-number\">0</span>; i &lt; <span class=\"hljs-number\">1</span>; i++) {\n        printf(<span class=\"hljs-string\">\"hello c (%d) &lt;br/&gt;\\n\"</span>, i);\n    }\n    MYSQL *mysql = mysql_init(NULL);\n    <span class=\"hljs-keyword\">if</span> (mysql_real_connect(mysql, <span class=\"hljs-string\">\"localhost\"</span>, <span class=\"hljs-string\">\"root\"</span>, <span class=\"hljs-string\">\"root\"</span>, <span class=\"hljs-string\">\"xj2014\"</span>, <span class=\"hljs-number\">3306</span>, NULL, <span class=\"hljs-number\">0</span>)) {\n        printf(<span class=\"hljs-string\">\"数据库连接成功\\n\"</span>);\n        <span class=\"hljs-keyword\">if</span> (mysql_set_character_set(mysql, <span class=\"hljs-string\">\"gbk\"</span>)) {\n            printf(<span class=\"hljs-string\">\"编码设置失败:%s\\n\"</span>,mysql_error(mysql));\n            <span class=\"hljs-keyword\">exit</span>(<span class=\"hljs-number\">1</span>);\n        }\n        <span class=\"hljs-keyword\">if</span> (mysql_query(mysql, <span class=\"hljs-string\">\"select num,name,classs from userinfo limit 10\"</span>)) {\n            printf(<span class=\"hljs-string\">\"查询出错:%s\\n\"</span>, mysql_error(mysql));\n            <span class=\"hljs-keyword\">exit</span>(<span class=\"hljs-number\">1</span>);\n        };\n        MYSQL_RES*    res = mysql_store_result(mysql);\n        MYSQL_ROW row;\n        <span class=\"hljs-keyword\">while</span> (row = mysql_fetch_row(res)) {\n            printf(<span class=\"hljs-string\">\"\\n学号=%s\\t姓名=%s\\t班级=%s\"</span>, row[<span class=\"hljs-number\">0</span>], row[<span class=\"hljs-number\">1</span>],row[<span class=\"hljs-number\">2</span>]);\n        }\n        mysql_free_result(res);\n        mysql_close(mysql);\n    } <span class=\"hljs-keyword\">else</span> {\n        printf(<span class=\"hljs-string\">\"数据库连接失败\\n\"</span>);\n        <span class=\"hljs-keyword\">exit</span>(<span class=\"hljs-number\">1</span>);\n    }\n    Sleep(<span class=\"hljs-number\">500</span>);\n    return <span class=\"hljs-number\">0</span>;\n}\n</code></pre>', '1', '2018-03-11 16:54:17', '2018-03-11 17:01:18', '1', '0', '{\"template\":\"\",\"featuredImage\":\"\",\"push_sites\":[]}');
  INSERT INTO `post` VALUES ('33', '1', '3', '0', '3', 'web开发的一些小提示', 'web-tips', '<h2 id=\"-\">一些注意</h2>\n<ol>\n<li>页面编码规范<br> 1.1. 统一使用 UTF-8 编码,用@charset &quot;utf-8&quot;指定页面编码。<br> 1.2. 全局字体设置：<br> windows 7系统：微软雅黑 Arial；<br> windows XP及以下：新宋体，宋体，Arial<br> MAC默认字体：Helvetica Neue和Helvetica Hiragino Sans GB。<br> font-family:&quot;Microsoft Yahei&quot;,&quot;Hiragino Sans GB&quot;,&quot;Helvetica Neue&quot;,Helvetica,tahoma,arial,Verdana,sans-serif,&quot;WenQuanYi Micro Hei&quot;,&quot;\\5B8B\\4F53&quot;;<br> 1.3. 中文字体使用编码转换<br> 1.4. 推荐使用web安全色  </li>\n</ol>\n', '## 一些注意\n1. 页面编码规范  \n    1.1. 统一使用 UTF-8 编码,用@charset \"utf-8\"指定页面编码。  \n    1.2. 全局字体设置：  \n    windows 7系统：微软雅黑 Arial；  \n    windows XP及以下：新宋体，宋体，Arial  \n    MAC默认字体：Helvetica Neue和Helvetica Hiragino Sans GB。  \n    font-family:\"Microsoft Yahei\",\"Hiragino Sans GB\",\"Helvetica Neue\",Helvetica,tahoma,arial,Verdana,sans-serif,\"WenQuanYi Micro Hei\",\"\\5B8B\\4F53\";  \n    1.3. 中文字体使用编码转换  \n    1.4. 推荐使用web安全色  \n<!--more-->\n2. 属性写在一行内，属性之间、属性名和值之间以及属性与“{}”之间应减少空格，去掉最后一个“;”，例如：.class{width:200px;height:100px}\n\n3. 属性的书写顺序：  \n	3.1. 按照元素模型由外及内，由整体到细节书写，大致分为五组：  \n```\n  位置：position,left,right,float\n  盒模型属性：display,margin,padding,width,height\n  边框与背景：border,background\n  段落与文本：line-height,text-indent,font,color,text-decoration,...\n  其他属性：overflow,cursor,visibility,...\n```\n    3.2. 针对特殊浏览器的属性，应写在标准属性之前，例如：-webkit-box-shadow:;-moz-box-shadow:;box-shaow:;\n    \n4. 带有前缀的属性，单独一行，通过缩进，让每个属性的值垂直对齐，方便编辑维护。\n\n5. 谨慎添加新的选择符规则，尤其不可滥用 id，尽可能继承和复用已有样式\n\n6. 选择符、属性、值均用小写（格式的颜色值除外），缩写的选择符名称须说明缩写前的全称，例如 .cl -> Clearfix\n\n7. 避免使用各种CSS Hack，如需对 IE 进行特殊定义，请参阅下节“关于 CSS Hack 的说明”\n\n8. 勿使用冗余低效的 CSS 写法，例如：ul li a span{... }\n\n9. 慎用 !important  \n\n10. 建议使用具有语义化的classname或id.\n\n11.避免使用兼容性不好的使用滤镜 .  \n\n12.开发过程中的未定事项，须用 [!] 标出，以便于后续讨论整理。  \n\n13.注释格式，统一使用双斜杠加*。  \n\n14.上下模块之间的间距统一使用下一个模块的margin-top来实现，好处是：如果没有下一个模块也不会多出一段空隙。  \n\n15.hover，selected，disabled，current等具有特定意义的请勿直接占用。\n  \n16.:link :visited :hover :active书写顺序 L-V-H-A，速记：LoVe（喜欢）HAte（讨厌）。 \n \n 17.不要使用 @import\n\n## 中文字体css编码转换\n~~~\n  微软雅黑   \\5FAE\\8F6F\\96C5\\9ED1  或 Microsoft YaHei\n  黑体       \\9ED1\\4F53\n  新宋体     \\65b0\\5b8b\\4f53\n  宋体       \\5b8b\\4f53\n~~~\n\n## css命名中英文对照\n~~~\n\n  current 当前    hover 悬停    selected 挑选   disabled 禁用   focus 得到焦点    \n  blur 失去焦点   checked 勾选    success 成功    error 出错\n\n  header(hd) 头部   content(cnt) 内容   title(tit) 标题   item 项目（条）   \n  cell 单元   image/pic(img) 图片   text(txt) 文字    top 顶部    scrubber 时序菜单\n\n  nav 导航    mainbav 主导航   subnav 子导航    topnav 顶部导航   \n  breadcrumb 面包屑导航  flink 友情链接    footer 尾    copyright 版权\n  menu 菜单   submenu 子菜单   dropdown 下拉菜单\n\n  searchBar 搜索条   search 搜索条    searchTxt 搜索框   \n  searchBtn 搜索按钮    search_key 搜索词\n\n  member 会员   ucenter 用户中心    loginBar 登陆条   \n  login 登录    loginBtn 登录按钮   regsiter 注册按钮  \n  btn-regsiter注册按钮    name 用户名    password 密码  \n  nickname 昵称   mobilephone/mobile 手机    \n  telephone/tel 电话   defaultavatar 默认头像\n\n  hot 热点    news 新闻   banner/AD 广告    download 下载\n  content 内容    title 标题    summary 摘要    time 时间\n  share 分享    digg 顶    like 喜欢\n\n  list 列表   pList 图片列表    tList 文字列表    tpList 图文列表\n  table 表格    row 行   column 列    gutter 间隔   viewport 视口\n  tab 标签    tags 标签   scroll 滚动 \n\n  sidebar 侧边栏   column 栏目   section 区块    msg 提示信息   \n  status 状态   vote 投票   tips 小技巧    guild 指南    note 注释\n  icon- 图标    btn- 按钮\n\n  goods 商品    goodsList 商品列表    goodsDetail 商品详情    goodsInfo 商品信息\n  tuan 团购   tuanList 团购列表   tuanDetail  团购详情    tuanInfo 团购信息\n\n  transition 动画   shadow 阴影   fade 淡入淡出   flip 翻页效   \n  slide 滑动    slideup 上滑动   slidedown 下滑动   turn 翻页 \n  horizontal 水平   vertical 垂直   collapsible 折叠    corners 拐角  \n  flow 流    reverse 反向    pop 弹窗\n\n  count 总数/计数   plus 加号/正   minus 减号/负    controlgroup 控制组\n~~~\n\n## 页面命名\n~~~\n  default/index.html    首页\n  404.html              404错误页\n  print.html            打印页\n  header.html           页头\n  footer.html           页脚\n  sitemap.html          网站地图\n  passport.html         通行证\n  rank.html             排行榜\n  roll.html             滚动新闻\n\n  solution.html         解决方案\n  joinus.html           加入我们\n  partner.html          合作伙伴\n  service.html          服务\n  aboutus.html          关于我们\n  contact.html          联系我们\n  company.html          公司介绍\n  organization.html     组织结构\n  culture.html          企业文化\n  strategy.html         发展策略\n  honor.html            公司荣誉\n  aptitudes.html        企业资质\n  events.html           大事记\n  business.html         商务合作\n  contract.html         服务条款\n  privacy.html          隐私声明\n  CSR.html              企业社会责任\n\n  news-开头.html         新闻相关\n  article-开头.html      资讯相关\n  picture-开头.html      图片相关\n  photo-开头.html        相册相关\n  product-开头.html      产品相关\n  goods-开头.html        商品相关\n  system-开头.html       系统相关\n  tag-开头.html          tag相关\n  brand-开头.html        品牌相关\n  help-开头.html         帮助相关\n  member-开头.html       会员相关\n  search-开头.html       搜索相关\n~~~\n  \n##   文件命名\n~~~\n  admin     后台管理\n  app       应用\n  article   资讯\n  common    公共\n  config    配置\n  data      数据\n  digg      顶\n  en-us     英文\n  extend    延伸\n  install   安装\n  Lang      语言包\n  Lib       库\n  mall      商城\n  picture   组图\n  product   商品\n  search    搜索\n  section   区块\n  shop      商店\n  static    静态\n  system    系统\n  templates 模版\n  tuan      团购\n  ucenter   用户中心\n  upload    上传\n  video     视频\n  vote      投票\n  zh_tw     繁体中文\n  zh-cn     简体中文\n~~~\n\n## HTTP 状态消息\n当浏览器从 web 服务器请求服务时，可能会发生错误。\n\n从而有可能会返回下面的一系列状态消息：\n\n### 1xx\n100 Continue	服务器仅接收到部分请求，但是一旦服务器并没有拒绝该请求，客户端应该继续发送其余的请求。  \n101 Switching Protocols	服务器转换协议：服务器将遵从客户的请求转换到另外一种协议。\n\n### 2xx\n200 OK	请求成功（其后是对GET和POST请求的应答文档。）  \n201 Created	请求被创建完成，同时新的资源被创建。  \n202 Accepted	供处理的请求已被接受，但是处理未完成。  \n203 Non-authoritative Information	文档已经正常地返回，但一些应答头可能不正确，因为使用的是文档的拷贝。  \n204 No Content	没有新文档。浏览器应该继续显示原来的文档。如果用户定期地刷新页面，而Servlet可以确定用户文档足够新，这个状态代码是很有用的。  \n205 Reset Content	没有新文档。但浏览器应该重置它所显示的内容。用来强制浏览器清除表单输入内容。  \n206 Partial Content	客户发送了一个带有Range头的GET请求，服务器完成了它。  \n\n### 3xx\n300 Multiple Choices	多重选择。链接列表。用户可以选择某链接到达目的地。最多允许五个地址。  \n301 Moved Permanently	所请求的页面已经转移至新的url。  \n302 Found	所请求的页面已经临时转移至新的url。  \n303 See Other	所请求的页面可在别的url下被找到。  \n304 Not Modified	未按预期修改文档。客户端有缓冲的文档并发出了一个条件性的请求（一般是提供If-Modified-Since头表示客户只想比指定日期更新的文档）。服务器告诉客户，原来缓冲的文档还可以继续使用。  \n305 Use Proxy	客户请求的文档应该通过Location头所指明的代理服务器提取。  \n306 Unused	此代码被用于前一版本。目前已不再使用，但是代码依然被保留。  \n307 Temporary Redirect	被请求的页面已经临时移至新的url。  \n\n### 4xx\n400 Bad Request	服务器未能理解请求。  \n401 Unauthorized	被请求的页面需要用户名和密码。  \n402 Payment Required	此代码尚无法使用。  \n403 Forbidden	对被请求页面的访问被禁止。  \n404 Not Found	服务器无法找到被请求的页面。  \n405 Method Not Allowed	请求中指定的方法不被允许。  \n406 Not Acceptable	服务器生成的响应无法被客户端所接受。  \n407 Proxy Authentication Required	用户必须首先使用代理服务器进行验证，这样请求才会被处理。  \n408 Request Timeout	请求超出了服务器的等待时间。  \n409 Conflict	由于冲突，请求无法被完成。  \n410 Gone	被请求的页面不可用。  \n411 Length Required	\"Content-Length\" 未被定义。如果无此内容，服务器不会接受请求。  \n412 Precondition Failed	请求中的前提条件被服务器评估为失败。  \n413 Request Entity Too Large	由于所请求的实体的太大，服务器不会接受请求。  \n414 Request-url Too Long	由于url太长，服务器不会接受请求。当post请求被转换为带有很长的查询信息的get请求时，就会发生这种情况。  \n415 Unsupported Media Type	由于媒介类型不被支持，服务器不会接受请求。  \n416	服务器不能满足客户在请求中指定的Range头。  \n417 Expectation Failed  \n\n### 5xx\n500 Internal Server Error	请求未完成。服务器遇到不可预知的情况。  \n501 Not Implemented	请求未完成。服务器不支持所请求的功能。  \n502 Bad Gateway	请求未完成。服务器从上游服务器收到一个无效的响应。  \n503 Service Unavailable	请求未完成。服务器临时过载或当机。  \n504 Gateway Timeout	网关超时。  \n505 HTTP Version Not Supported	服务器不支持请求中指明的HTTP协议版本。  ', '<div class=\"toc\"><ul>\n<li><a href=\"#toc-8ac\">一些注意</a></li>\n<li><a href=\"#toc-9a8\">中文字体css编码转换</a></li>\n<li><a href=\"#toc-098\">css命名中英文对照</a></li>\n<li><a href=\"#toc-738\">页面命名</a></li>\n<li><a href=\"#toc-42b\">文件命名</a></li>\n<li><a href=\"#toc-901\">HTTP 状态消息</a><ul>\n<li><a href=\"#1xx\">1xx</a></li>\n<li><a href=\"#2xx\">2xx</a></li>\n<li><a href=\"#3xx\">3xx</a></li>\n<li><a href=\"#4xx\">4xx</a></li>\n<li><a href=\"#5xx\">5xx</a></li>\n</ul>\n</li>\n</ul>\n</div><h2><a id=\"toc-8ac\" class=\"anchor\" href=\"#toc-8ac\"></a>一些注意</h2>\n<ol>\n<li>页面编码规范<br> 1.1. 统一使用 UTF-8 编码,用@charset &quot;utf-8&quot;指定页面编码。<br> 1.2. 全局字体设置：<br> windows 7系统：微软雅黑 Arial；<br> windows XP及以下：新宋体，宋体，Arial<br> MAC默认字体：Helvetica Neue和Helvetica Hiragino Sans GB。<br> font-family:&quot;Microsoft Yahei&quot;,&quot;Hiragino Sans GB&quot;,&quot;Helvetica Neue&quot;,Helvetica,tahoma,arial,Verdana,sans-serif,&quot;WenQuanYi Micro Hei&quot;,&quot;\\5B8B\\4F53&quot;;<br> 1.3. 中文字体使用编码转换<br> 1.4. 推荐使用web安全色  <!--more--></li>\n<li><p>属性写在一行内，属性之间、属性名和值之间以及属性与“{}”之间应减少空格，去掉最后一个“;”，例如：.class{width:200px;height:100px}</p>\n</li>\n<li><p>属性的书写顺序：<br> 3.1. 按照元素模型由外及内，由整体到细节书写，大致分为五组：  </p>\n<pre><code class=\"hljs lang-scss\">位置：<span class=\"hljs-attribute\">position</span>,<span class=\"hljs-attribute\">left</span>,<span class=\"hljs-attribute\">right</span>,<span class=\"hljs-attribute\">float</span>\n盒模型属性：<span class=\"hljs-attribute\">display</span>,<span class=\"hljs-attribute\">margin</span>,<span class=\"hljs-attribute\">padding</span>,<span class=\"hljs-attribute\">width</span>,<span class=\"hljs-attribute\">height</span>\n边框与背景：<span class=\"hljs-attribute\">border</span>,<span class=\"hljs-attribute\">background</span>\n段落与文本：<span class=\"hljs-attribute\">line-height</span>,<span class=\"hljs-attribute\">text-indent</span>,<span class=\"hljs-attribute\">font</span>,<span class=\"hljs-attribute\">color</span>,<span class=\"hljs-attribute\">text-decoration</span>,...\n其他属性：<span class=\"hljs-attribute\">overflow</span>,<span class=\"hljs-attribute\">cursor</span>,<span class=\"hljs-attribute\">visibility</span>,...\n</code></pre><p> 3.2. 针对特殊浏览器的属性，应写在标准属性之前，例如：-webkit-box-shadow:;-moz-box-shadow:;box-shaow:;</p>\n</li>\n<li><p>带有前缀的属性，单独一行，通过缩进，让每个属性的值垂直对齐，方便编辑维护。</p>\n</li>\n<li><p>谨慎添加新的选择符规则，尤其不可滥用 id，尽可能继承和复用已有样式</p>\n</li>\n<li><p>选择符、属性、值均用小写（格式的颜色值除外），缩写的选择符名称须说明缩写前的全称，例如 .cl -&gt; Clearfix</p>\n</li>\n<li><p>避免使用各种CSS Hack，如需对 IE 进行特殊定义，请参阅下节“关于 CSS Hack 的说明”</p>\n</li>\n<li><p>勿使用冗余低效的 CSS 写法，例如：ul li a span{... }</p>\n</li>\n<li><p>慎用 !important  </p>\n</li>\n<li><p>建议使用具有语义化的classname或id.</p>\n</li>\n</ol>\n<p>11.避免使用兼容性不好的使用滤镜 .  </p>\n<p>12.开发过程中的未定事项，须用 [!] 标出，以便于后续讨论整理。  </p>\n<p>13.注释格式，统一使用双斜杠加*。  </p>\n<p>14.上下模块之间的间距统一使用下一个模块的margin-top来实现，好处是：如果没有下一个模块也不会多出一段空隙。  </p>\n<p>15.hover，selected，disabled，current等具有特定意义的请勿直接占用。</p>\n<p>16.:link :visited :hover :active书写顺序 L-V-H-A，速记：LoVe（喜欢）HAte（讨厌）。 </p>\n<p> 17.不要使用 @import</p>\n<h2><a id=\"toc-9a8\" class=\"anchor\" href=\"#toc-9a8\"></a>中文字体css编码转换</h2>\n<pre><code class=\"hljs lang-lsl\">  微软雅黑   \\<span class=\"hljs-number\">5</span>FAE\\<span class=\"hljs-number\">8</span>F6F\\<span class=\"hljs-number\">96</span>C5\\<span class=\"hljs-number\">9</span>ED1  或 Microsoft YaHei\n  黑体       \\<span class=\"hljs-number\">9</span>ED1\\<span class=\"hljs-number\">4</span>F53\n  新宋体     \\<span class=\"hljs-number\">65</span>b0\\<span class=\"hljs-number\">5</span>b8b\\<span class=\"hljs-number\">4</span>f53\n  宋体       \\<span class=\"hljs-number\">5</span>b8b\\<span class=\"hljs-number\">4</span>f53\n</code></pre><h2><a id=\"toc-098\" class=\"anchor\" href=\"#toc-098\"></a>css命名中英文对照</h2>\n<pre><code class=\"hljs lang-stylus\">\n  current 当前    hover 悬停    selected 挑选   disabled 禁用   focus 得到焦点    \n  blur 失去焦点   checked 勾选    success 成功    error 出错\n\n  header(hd) 头部   <span class=\"hljs-attribute\">content</span>(cnt) 内容   title(tit) 标题   item 项目（条）   \n  cell 单元   image/pic(img) 图片   text(txt) 文字    <span class=\"hljs-attribute\">top</span> 顶部    scrubber 时序菜单\n\n  <span class=\"hljs-selector-tag\">nav</span> 导航    mainbav 主导航   subnav 子导航    topnav 顶部导航   \n  breadcrumb 面包屑导航  flink 友情链接    <span class=\"hljs-selector-tag\">footer</span> 尾    copyright 版权\n  <span class=\"hljs-selector-tag\">menu</span> 菜单   submenu 子菜单   dropdown 下拉菜单\n\n  searchBar 搜索条   search 搜索条    searchTxt 搜索框   \n  searchBtn 搜索按钮    search_key 搜索词\n\n  member 会员   ucenter 用户中心    loginBar 登陆条   \n  login 登录    loginBtn 登录按钮   regsiter 注册按钮  \n  btn-regsiter注册按钮    name 用户名    password 密码  \n  nickname 昵称   mobilephone/mobile 手机    \n  telephone/tel 电话   defaultavatar 默认头像\n\n  hot 热点    news 新闻   banner/AD 广告    download 下载\n  <span class=\"hljs-attribute\">content</span> 内容    title 标题    summary 摘要    time 时间\n  share 分享    digg 顶    like 喜欢\n\n  list 列表   pList 图片列表    tList 文字列表    tpList 图文列表\n  <span class=\"hljs-selector-tag\">table</span> 表格    row 行   column 列    gutter 间隔   viewport 视口\n  tab 标签    tags 标签   scroll 滚动 \n\n  sidebar 侧边栏   column 栏目   <span class=\"hljs-selector-tag\">section</span> 区块    msg 提示信息   \n  status 状态   vote 投票   tips 小技巧    guild 指南    note 注释\n  <span class=\"hljs-attribute\">icon</span>- 图标    btn- 按钮\n\n  goods 商品    goodsList 商品列表    goodsDetail 商品详情    goodsInfo 商品信息\n  tuan 团购   tuanList 团购列表   tuanDetail  团购详情    tuanInfo 团购信息\n\n  <span class=\"hljs-attribute\">transition</span> 动画   shadow 阴影   fade 淡入淡出   flip 翻页效   \n  slide 滑动    slideup 上滑动   slidedown 下滑动   turn 翻页 \n  horizontal 水平   vertical 垂直   collapsible 折叠    corners 拐角  \n  flow 流    reverse 反向    pop 弹窗\n\n  count 总数/计数   plus 加号/正   minus 减号/负    controlgroup 控制组\n</code></pre><h2><a id=\"toc-738\" class=\"anchor\" href=\"#toc-738\"></a>页面命名</h2>\n<pre><code class=\"hljs lang-stylus\">  default/index<span class=\"hljs-selector-class\">.html</span>    首页\n  <span class=\"hljs-number\">404</span><span class=\"hljs-selector-class\">.html</span>              <span class=\"hljs-number\">404</span>错误页\n  print<span class=\"hljs-selector-class\">.html</span>            打印页\n  <span class=\"hljs-selector-tag\">header</span><span class=\"hljs-selector-class\">.html</span>           页头\n  <span class=\"hljs-selector-tag\">footer</span><span class=\"hljs-selector-class\">.html</span>           页脚\n  sitemap<span class=\"hljs-selector-class\">.html</span>          网站地图\n  passport<span class=\"hljs-selector-class\">.html</span>         通行证\n  rank<span class=\"hljs-selector-class\">.html</span>             排行榜\n  roll<span class=\"hljs-selector-class\">.html</span>             滚动新闻\n\n  solution<span class=\"hljs-selector-class\">.html</span>         解决方案\n  joinus<span class=\"hljs-selector-class\">.html</span>           加入我们\n  partner<span class=\"hljs-selector-class\">.html</span>          合作伙伴\n  service<span class=\"hljs-selector-class\">.html</span>          服务\n  aboutus<span class=\"hljs-selector-class\">.html</span>          关于我们\n  contact<span class=\"hljs-selector-class\">.html</span>          联系我们\n  company<span class=\"hljs-selector-class\">.html</span>          公司介绍\n  organization<span class=\"hljs-selector-class\">.html</span>     组织结构\n  culture<span class=\"hljs-selector-class\">.html</span>          企业文化\n  strategy<span class=\"hljs-selector-class\">.html</span>         发展策略\n  honor<span class=\"hljs-selector-class\">.html</span>            公司荣誉\n  aptitudes<span class=\"hljs-selector-class\">.html</span>        企业资质\n  events<span class=\"hljs-selector-class\">.html</span>           大事记\n  business<span class=\"hljs-selector-class\">.html</span>         商务合作\n  contract<span class=\"hljs-selector-class\">.html</span>         服务条款\n  privacy<span class=\"hljs-selector-class\">.html</span>          隐私声明\n  CSR<span class=\"hljs-selector-class\">.html</span>              企业社会责任\n\n  news-开头<span class=\"hljs-selector-class\">.html</span>         新闻相关\n  article-开头<span class=\"hljs-selector-class\">.html</span>      资讯相关\n  picture-开头<span class=\"hljs-selector-class\">.html</span>      图片相关\n  photo-开头<span class=\"hljs-selector-class\">.html</span>        相册相关\n  product-开头<span class=\"hljs-selector-class\">.html</span>      产品相关\n  goods-开头<span class=\"hljs-selector-class\">.html</span>        商品相关\n  system-开头<span class=\"hljs-selector-class\">.html</span>       系统相关\n  tag-开头<span class=\"hljs-selector-class\">.html</span>          tag相关\n  brand-开头<span class=\"hljs-selector-class\">.html</span>        品牌相关\n  help-开头<span class=\"hljs-selector-class\">.html</span>         帮助相关\n  member-开头<span class=\"hljs-selector-class\">.html</span>       会员相关\n  search-开头<span class=\"hljs-selector-class\">.html</span>       搜索相关\n</code></pre><h2><a id=\"toc-42b\" class=\"anchor\" href=\"#toc-42b\"></a>文件命名</h2>\n<pre><code class=\"hljs lang-routeros\">  admin     后台管理\n  app       应用\n  article   资讯\n  common    公共\n <span class=\"hljs-built_in\"> config </span>   配置\n  data      数据\n  digg      顶\n  en-us     英文\n  extend    延伸\n  install   安装\n  Lang      语言包\n  Lib       库\n  mall      商城\n  picture   组图\n  product   商品\n  search    搜索\n  section   区块\n  shop      商店\n  static    静态\n <span class=\"hljs-built_in\"> system </span>   系统\n  templates 模版\n  tuan      团购\n  ucenter   用户中心\n  upload    上传\n  video     视频\n  vote      投票\n  zh_tw     繁体中文\n  zh-cn     简体中文\n</code></pre><h2><a id=\"toc-901\" class=\"anchor\" href=\"#toc-901\"></a>HTTP 状态消息</h2>\n<p>当浏览器从 web 服务器请求服务时，可能会发生错误。</p>\n<p>从而有可能会返回下面的一系列状态消息：</p>\n<h3><a id=\"1xx\" class=\"anchor\" href=\"#1xx\"></a>1xx</h3>\n<p>100 Continue    服务器仅接收到部分请求，但是一旦服务器并没有拒绝该请求，客户端应该继续发送其余的请求。<br>101 Switching Protocols    服务器转换协议：服务器将遵从客户的请求转换到另外一种协议。</p>\n<h3><a id=\"2xx\" class=\"anchor\" href=\"#2xx\"></a>2xx</h3>\n<p>200 OK    请求成功（其后是对GET和POST请求的应答文档。）<br>201 Created    请求被创建完成，同时新的资源被创建。<br>202 Accepted    供处理的请求已被接受，但是处理未完成。<br>203 Non-authoritative Information    文档已经正常地返回，但一些应答头可能不正确，因为使用的是文档的拷贝。<br>204 No Content    没有新文档。浏览器应该继续显示原来的文档。如果用户定期地刷新页面，而Servlet可以确定用户文档足够新，这个状态代码是很有用的。<br>205 Reset Content    没有新文档。但浏览器应该重置它所显示的内容。用来强制浏览器清除表单输入内容。<br>206 Partial Content    客户发送了一个带有Range头的GET请求，服务器完成了它。  </p>\n<h3><a id=\"3xx\" class=\"anchor\" href=\"#3xx\"></a>3xx</h3>\n<p>300 Multiple Choices    多重选择。链接列表。用户可以选择某链接到达目的地。最多允许五个地址。<br>301 Moved Permanently    所请求的页面已经转移至新的url。<br>302 Found    所请求的页面已经临时转移至新的url。<br>303 See Other    所请求的页面可在别的url下被找到。<br>304 Not Modified    未按预期修改文档。客户端有缓冲的文档并发出了一个条件性的请求（一般是提供If-Modified-Since头表示客户只想比指定日期更新的文档）。服务器告诉客户，原来缓冲的文档还可以继续使用。<br>305 Use Proxy    客户请求的文档应该通过Location头所指明的代理服务器提取。<br>306 Unused    此代码被用于前一版本。目前已不再使用，但是代码依然被保留。<br>307 Temporary Redirect    被请求的页面已经临时移至新的url。  </p>\n<h3><a id=\"4xx\" class=\"anchor\" href=\"#4xx\"></a>4xx</h3>\n<p>400 Bad Request    服务器未能理解请求。<br>401 Unauthorized    被请求的页面需要用户名和密码。<br>402 Payment Required    此代码尚无法使用。<br>403 Forbidden    对被请求页面的访问被禁止。<br>404 Not Found    服务器无法找到被请求的页面。<br>405 Method Not Allowed    请求中指定的方法不被允许。<br>406 Not Acceptable    服务器生成的响应无法被客户端所接受。<br>407 Proxy Authentication Required    用户必须首先使用代理服务器进行验证，这样请求才会被处理。<br>408 Request Timeout    请求超出了服务器的等待时间。<br>409 Conflict    由于冲突，请求无法被完成。<br>410 Gone    被请求的页面不可用。<br>411 Length Required    &quot;Content-Length&quot; 未被定义。如果无此内容，服务器不会接受请求。<br>412 Precondition Failed    请求中的前提条件被服务器评估为失败。<br>413 Request Entity Too Large    由于所请求的实体的太大，服务器不会接受请求。<br>414 Request-url Too Long    由于url太长，服务器不会接受请求。当post请求被转换为带有很长的查询信息的get请求时，就会发生这种情况。<br>415 Unsupported Media Type    由于媒介类型不被支持，服务器不会接受请求。<br>416    服务器不能满足客户在请求中指定的Range头。<br>417 Expectation Failed  </p>\n<h3><a id=\"5xx\" class=\"anchor\" href=\"#5xx\"></a>5xx</h3>\n<p>500 Internal Server Error    请求未完成。服务器遇到不可预知的情况。<br>501 Not Implemented    请求未完成。服务器不支持所请求的功能。<br>502 Bad Gateway    请求未完成。服务器从上游服务器收到一个无效的响应。<br>503 Service Unavailable    请求未完成。服务器临时过载或当机。<br>504 Gateway Timeout    网关超时。<br>505 HTTP Version Not Supported    服务器不支持请求中指明的HTTP协议版本。  </p>\n', '1', '2018-03-11 17:11:47', '2018-03-11 17:20:12', '1', '0', '{\"template\":\"\",\"featuredImage\":\"\",\"push_sites\":[]}');
  INSERT INTO `post` VALUES ('34', '1', '3', '0', '3', 'javascriptDOM操作', 'javascript-dom', '<h2><a id=\"1_0\"></a>1.创建元素</h2>\n<blockquote>\n<p>创建元素：document.createElement()</p>\n</blockquote>\n<p>使用document.createElement()可以创建新元素。这个方法只接受一个参数，即要创建元素的标签名。这个标签名在HTML文档中不区分大小写，在XHTML中区分大小写。</p>\n<blockquote>\n<p>var div = document.createElement(“div”);</p>\n</blockquote>\n<p>使用createElement()方法创建新元素的同时，也为新元素设置了ownerDocument属性，可以操作元素的特性。</p>\n', '## 1.创建元素\n>  创建元素：document.createElement()\n\n使用document.createElement()可以创建新元素。这个方法只接受一个参数，即要创建元素的标签名。这个标签名在HTML文档中不区分大小写，在XHTML中区分大小写。\n\n> var div = document.createElement(\"div\");\n\n使用createElement()方法创建新元素的同时，也为新元素设置了ownerDocument属性，可以操作元素的特性。\n\n<!--more-->\n~~~\ndiv.id = \"myDiv\";\ndiv.className = \"div1\";\n~~~\n此时，新元素尚未被添加到文档树中，因此设置各种特性均不会影响浏览器的显示。要添加到文档树，可用appendChild()、insertBefore()、replaceChild()。\n\n`document.body.appendChild(div);`\n\n当把元素添加到文档树中后，这时这个元素做的任何修改都会实时地反应到浏览器中。\n\n在IE中可以为createElement()方法传入完整的元素标签和属性。(只在IE中兼容)\n\n`var div = document.createElement(\"<div id=\\\"mydiv\\\" class=\\\"div1\\\"></div>\");`\n\n不能再标签里加其他元素节点或者文本节点，如下的方式和上面的得出的节点一样\n\n`var div = document.createElement(\"<div id=\\\"mydiv\\\" class=\\\"div1\\\">12212</div>\"); `\n\n\n> 创建文本节点 ：document.createTextNode\n\n使用document.createTextNode()来创建文本节点，这个方法接受一个参数：要插入节点的文本。与设置已有文本节点的值一样，作为参数的文本将按照HTML或XML的格式进行编码。\n\n`document.createTextNode(\"121212\");`\n可以添加多个文本节点。假如两个文本节点时相邻的同胞节点，那么两个文本节点会连起来，中间不会有空格。\n\n## 2.节点关系\n（IE9以前不将换行和空格看做文本节点，其他浏览器会）\n\n文本关系如下：\n\n~~~\n<div id=\"div1\">\n    <div id=\"div2\">2</div>\n    <div id=\"div3\">3</div>\n    <div id=\"div4\">4</div>\n</div>\n~~~\n> 父节点：parentNode\n\nparentNode是指定节点的父节点.一个元素节点的父节点可能是一个元素(Element )节点,也可能是一个文档(Document )节点,或者是个文档碎片(DocumentFragment)节点.\n每一个节点都有一个parentNode属性。\n\n对于下面的节点类型: Attr, Document, DocumentFragment, Entity, Notation,其parentNode属性返回null。如果当前节点刚刚被创建,还没有被插入到DOM树中,则该节点的parentNode属性也返回null。\n\n~~~\n<script type=\"text/javascript\">\n    var child2 = document.getElementById(\"div2\");\n    var parent = child2.parentNode;\n</script>\n~~~\n> 子节点：childNodes\n\nchildNodes 返回包含指定节点的子节点的集合，该集合为实时更新的集合（live collection）。\n实时更新就是对节点元素的任意修改都会立即反映到结果里。\n\n~~~\n<script type=\"text/javascript\">\n    var child2 = document.getElementById(\"div2\");\n    var parent = child2.parentNode;\n    var allChilds = parent.childNodes;\n    console.log(allChilds.length) // IE下是3，其他浏览器是7\n    \n    var nodeAdd = document.createElement(\"div\");\n    var textAdd = document.createTextNode(\"这是添加的文本节点\");\n    nodeAdd.appendChild(textAdd);\n    parent.appendChild(nodeAdd);\n    console.log(allChilds.length);// IE下是4，其他浏览器是8\n</script>\n~~~\n> 兄弟节点：nextSibling，previousSibling\n\nnextSibling返回某节点的下一个兄弟节点，previousSibling返回某节点的上一个兄弟节点，没有的话返回null。\n注意：可能因为元素换行的原因返回的是text节点。\n\n~~~\n<script type=\"text/javascript\">\n    var child3 = document.getElementById(\"div3\");\n    var next = child3.nextSibling;\n    var previous = child3.previousSibling;\n    console.log(next); // IE下返回div4，其他返回text\n    console.log(previous)  // IE下返回div2，其他返回text\n</script>\n~~~\n> 第一个或最后一个子节点：firstChild、lastChild\n\nfirstChild返回node的子节点中的第一个节点的引用，没有返回null\nlastChild返回node的子节点中的最后一个节点的引用，没有返回null\n\n~~~\n<script type=\"text/javascript\">\n    var child3 = document.getElementById(\"div3\");\n    var parent = child3.parentNode;\n    var first = parent.firstChild; // IE是div2，其他是text\n    var last = parent.lastChild; // IE是div4，其他是text\n</script>\n~~~\n## 3.节点元素关系\n只算元素，不算文本节点。\n\n以下三个方法用法和节点关系完全一样，只是这三个方法只看元素节点，不管因为空格、换行造成的文本节点或者手动加上去的文本节点。\n> children： 返回所有元素子节点（IE5+、ff3.5、opera3、chrome，但在IE8及以下会将注释节点看成一个元素节点）\n\n以下两个IE9+才支持\n> nextElementSibling：返回元素的下一个兄弟元素节点\n> previousElementSibling: 返回元素的上一个兄弟元素节点\n\n## 4.节点操作\n> appendChild()\n\nappendChild()用于向childNodes列表的末尾添加一个节点，并且返回这个新增的节点。\n如果传入到appendChild()里的节点已经是文档的一部分了，那结果就是将节点从原来的位置转移到新位置，任何一个节点不能同时出现在文档中的多个位置。\n\n~~~\n    var returnNode = someNode.appendChild(someNode.firstChild); // 返回第一个节点\n    console.log(returnNode === someNode.firstChild); // false\n    console.log(returnNode === someNode.lastChild); // true\n~~~\n> insetBefore()\n\ninsetBefore()可以将节点插入到某个特定的位置。这个方法接受两个参数：要插入的节点和作为参照的节点。\n插入节点后，被插入的节点变成参照节点的前一个同胞节点，同时被方法返回。 如果参照节点是null，则与appendChild()执行相同的操作。\n\n~~~\n    // 插入后成为最后一个子节点\n    var returnNode = someNode.insetBefore(newNode, null);\n    console.log(returnNode === someNode.lastChild); // true\n\n    // 插入后成为第一个子节点\n    var returnNode = someNode.insetBefore(newNode, someNode.firstChild);\n    console.log(returnNode === newNode); // true\n    console.log(returnNode === someNode.firstChild); // true\n\n    // 插入到最后一个子节点的前面\n    var returnNode = someNode.insetBefore(newNode, someNode.lastChild);\n    console.log(returnNode === someNode.childNodes[someNode.childnodes.length - 2]) // true\n~~~\n> 替换节点： replaceChild()\n\nreplaceChild()接受两个参数：要插入的节点和要被替换的节点。被替换的节点将由这个方法返回并从文档中被移除，同时由要插入的节点占据其位置。\n\n~~~\n  // 替换第一个子节点\n    var returnNode = someNode.replaceChild(newNode, someNode.firstChild);\n\n~~~\n\n使用replaceChild()后，被替换的节点的所有关系指针都会被复制到插入的节点上面。\n\n> 删除节点：removeChild()\n\n该方法移除节点，接受一个参数，即要移除的节点，同时该方法返回被移除的节点。只能是一个节点，不能是一组节点。\n\n~~~\n // 移除第一个子节点\n    var returnNode = someNode.removeChild(newNode, someNode.firstChild);\n~~~\n\n> 克隆节点：cloneNode(true/false)\n\n返回调用该方法的节点的一个副本。参数表示是否采用深度克隆,如果为true,则该节点的所有后代节点也都会被克隆,如果为false,则只克隆该节点本身，文本或者换行、空格这些不会复制，因为他们都是一个textNode。\n\n**注意** : 在DOM4规范中(实现于Gecko 13.0(Firefox 13.0 / Thunderbird 13.0 / SeaMonkey 2.10) , 查看 bug 698391),deep是一个可选参数. 如果省略的话, deep参数的默认值为true,也就是说,深度克隆是默认的.如果想使用浅克隆, 你需要将该参数指定为false。\n\n在旧版本的浏览器中, 你始终需要指定deep参数。\n\n克隆一个元素节点会拷贝它所有的属性以及属性值,当然也就包括了属性上绑定的事件(比如onclick=\"alert(1)\"),但不会拷贝那些使用addEventListener()方法或者node.onclick = fn这种用JavaScript动态绑定的事件。\n\n注意:为了防止一个文档中出现两个ID重复的元素,使用cloneNode()方法克隆的节点在需要时应该指定另外一个与原ID值不同的ID\n~~~\n    var div1 = document.getElementById(\"div1\");\n    var cloneHtml = div1.cloneNode(true);\n    document.body.appendChild(cloneHtml);\n~~~\n## 5.元素选择\nHTML代码示例：\n\n~~~\n    <div id=\"div1\">\n        <p id=\"div2\" class=\"one\" name=\"nameone\">2</p>\n        <div id=\"div3\">3</div>\n        <div id=\"div4\" name=\"div2\">4</div>\n    </div>\n~~~\n> querySelector、querySelectorAll(IE8及以上)\n\nSelectors API通过匹配一组选择器的方式来为从DOM中检索Element节点提供一些简单快捷的方法，这比过去必须要在javascript代码中用循环来查找某个你想要的特定元素更快一些。\n该规范对于使用Document,DocumentFragment和Element接口的对象都增了两种新方法：\n\n> querySelector\n\n返回节点子树内与之相匹配的第一个Element节点。如果没有匹配的节点，则返回null。\n\n> querySelectorAll\n\n返回一个包含节点子树内所有与之相匹配的Element节点列表，如果没有相匹配的，则返回一个空节点列表。 \n**注意**：由 querySelector()、querySelectorAll()返回的节点列表不是动态实时的（非live Collection）。这和其他DOM查询方法返回动态实时节点列表不一样。\n\n选择器方法接受一个或多个用逗号分隔的选择器来确定需要被返回的元素。例如，要选择文档中所有CSS的类(class)是warning或者note的段落(p)元素,可以这样写：\n\n`var special = document.querySelectorAll( \"p.warning, p.note\" );`\n也可以通过ID来查询，例如：\n\n`var el = document.querySelector( \"#main, #basic, #exclamation\" );`\n执行上面的代码后，el就包含了文档中元素的ID是main，basic或exclamation的所有元素中的第一个元素。\n\nquerySelector() and querySelectorAll() 里可以使用任何CSS选择器，他们都不是live Collection：\n\n~~~\n var notLive = document.querySelectorAll(\"p\");\n    console.log(notLive);\n    document.getElementById(\"div1\").removeChild(document.getElementById(\"div2\"));\n    console.log(notLive);\n    // 上面两个输出都是输出 `p#div2.one`的引用，没有因为删除了`p`标签而使`notLive`的结果发生变化。\n~~~\n> getElementById()\n\n返回一个匹配特定 ID的元素。id是大小写敏感的字符串，代表了所要查找的元素的唯一ID，如果没有则返回null。\n如果新建一个元素，还没有插入到文档中，则不能通过该方法获取到。\n\n~~~\n    var notLive = document.getElementById(\"div2\");\n    console.log(notLive.innerHTML);\n    document.getElementById(\"div1\").removeChild(document.getElementById(\"div2\"));\n    console.log(notLive.innerHTML);\n    // 上面输出都是2，说明getElementById()也是**非**live collection\n~~~\n\n> getElementsByTagName()\n\ndocument.getElementsByTagName() 方法返回一个实时的包含具有给出标签名的元素们的HTMLCollection。指定的元素的子树会被搜索，包括元素自己。返回的 list 是实时的（live collection），意味着它会随着DOM树的变化自动更新。因此，如果对同一个元素，使用相同的参数，是不需要多次调用document.getElementsByTagName() 的。\n\nElement.getElementsByTagName()的搜索被限制为指定元素的后代而不是document\n\n~~~\n  var live = document.getElementsByTagName(\"p\");\n    console.log(live[0].innerHTML);\n    document.getElementById(\"div1\").removeChild(document.getElementById(\"div2\"));\n    console.log(live[0].innerHTML);\n    // 第一个输出2，第二个报错，因为无法引用到p标签\n~~~\n> getElementsByName()\n\n该方法返回一个实时的nodelist collection，包含文档中所有name属性匹配的标签。这是一个 live collection。\n**注意**：在IE和opera下，如果某个元素1的name和另一个元素2的id重合，且元素2在元素1的前面，则getElementsByName()会取到元素2。\n~~~\n    var live = document.getElementsByName(\"div2\");\n    console.log(live[0].innerHTML);\n    document.getElementById(\"div1\").removeChild(document.getElementById(\"div2\"));\n    console.log(live[0].innerHTML);\n    // chrome下：全部输出4\n    // IE下： 第一个输出2，第二个报错。\n~~~\n> getElementsByClassName()\n\n该方法返回一个即时更新的（live） HTMLCollection，包含了所有拥有指定 class 的子元素。当在 document 对象上调用此方法时，会检索整个文档，包括根元素。(IE9以下不支持)\n\n要匹配多个class，则className用空格分开。\n\n~~~\ngetElementsByClassName(\"class1 class2\");\n    var live = document.getElementsByClassName(\"one\");\n    console.log(live[0].innerHTML);\n    document.getElementById(\"div1\").removeChild(document.getElementById(\"div2\"));\n    console.log(live[0].innerHTML);\n    // 第一个返回2，第二个报错\n~~~\n## 6.属性操作\n> setAttribute()\n\n添加一个新属性（attribute）到元素上，或改变元素上已经存在的属性的值。\n\n当在 HTML 文档中的 HTML 元素上调用 setAttribute() 方法时，该方法会将其属性名称（attribute name）参数小写化。\n\n如果指定的属性已经存在，则其值变为传递的值。如果不存在，则创建指定的属性。也可指定为null。如果设置为null，最好使用removeAttribute()。\n~~~\n\n    var div2 = document.getElementById(\"div2\");\n    div2.setAttribute(\"class\", \"new_class\");\n    div2.setAttribute(\"id\", \"new_id\");\n~~~\n**注意**：在IE7下，修改了元素的class，如果已有class，则会出现两个class，通过setAttribute()添加的不生效；如果没有class，则添加上class，但这个添加上去的class的样式不会生效。\n\n\n> removeAttribute()\n\n该方法用于移除元素的属性。\n~~~\n    var div2 = document.getElementById(\"div2\");\n    div2.removeAttribute(\"class\");\n~~~\n**注意**：IE7下无法移除 class 属性\n\n> getAttribute()\n\n该方法返回元素上指定属性（attribute）的值。如果指定的属性不存在，则返回 null 或 \"\" （空字符串）（IE5+都返回null）。\n\n~~~\n    var div2 = document.getElementById(\"div2\");\n    var attr = div2.getAttribute(\"class\");\n    console.log(attr);\n~~~\n**注意**：IE7下不能正确返回class，返回的是null，其他正常。\n\n> hasAttribute()\n\nhasAttribute() 返回一个布尔值，指示该元素是否包含有指定的属性（attribute）。\n\n**注意**：IE7不支持该方法。\n\n> 自定义属性data-*\n\nhtml5里有一个data-*去设置获取元素的自定义属性值。\n\n`<div id=\"div1\" data-aa=\"11\">`\n利用div1.dataset可以获得一个DOMStringMap，包含了元素的所有data-*。\n使用div1.dataset.aa就可以获取11的值。\n同样，通过设置div1.dataset.bb = \"22\"就可以设置一个自定义属性值。\n在不兼容的浏览器里，就使用getAttribute和setAttribute\n\n~~~\n    var div1 = document.getElementById(\"div1\");\n    var a = null;\n    if (div1.dataset) {\n        a = div1.dataset.aa;\n        div1.dataset.bb = \"222\";\n    } else {\n        a = div1.getAttribute(\"data-aa\");\n        div1.setAttribute(\"data-bb\", \"2222\");\n    }\n    console.log(a);\n~~~\n## 7.事件\n> addEventListener()\n\naddEventListener()将指定的事件监听器注册到目标对象上，当目标对象触发制定的事件时，指定的回调函数就会触发。目标对象可以是 文档上的元素、 document、 window 或者XMLHttpRequest(比如onreadystatechange事件)。\n\nIE8及以下不支持此方法且只有事件冒泡没有事件捕获。IE9开始支持此方法，也就有了事件捕获。\n~~~\n\n    var div1 = document.getElementById(\"div1\");\n    div1.addEventListener(\"click\", listener, false);\n    function listener() {\n        console.log(\'test\');\n    }\n    \n    var cloneHtml = div1.cloneNode(true);\n    document.body.appendChild(cloneHtml);\n~~~\n第一个参数是事件名，第二个是回调函数，第三个参数为true表示捕获，false表示冒泡。\n\n~~~\n    var div1 = document.getElementById(\"div1\");\n    div1.addEventListener(\"click\", listener1, true/fasle);\n    function listener1() {\n        console.log(\'test1\');\n    }\n\n    var div2 = document.getElementById(\"div2\");\n    div2.addEventListener(\"click\", listener2, true/fasle);\n    function listener2() {\n        console.log(\'test2\');\n    }\n~~~\n有一点要注意的是，当对某一个元素1既绑定了捕获事件，又绑定了冒泡事件时：\n当这个元素1并不是触发事件的那个元素2时，则触发顺序会按照先 捕获 后 冒泡 的顺序触发；\n当这个元素1就是最底层的触发事件的元素时，则这个元素没有捕获和冒泡的区别，谁先绑定就先触发谁。\n\n    var div2 = document.getElementById(\"div2\");\n    \n    div2.addEventListener(\"click\", listener2, true);\n    function listener2() {\n        console.log(\'test2\');\n    }\n\n    div2.addEventListener(\"click\", listener1, false);\n    function listener1() {\n        console.log(\'test1\');\n    }\n    // 按绑定顺序执行，两个`addEventLister()`颠倒过来则执行顺序也变化\n    // 如果再对`div1`绑定一个捕获、一个冒泡，则会先触发捕获 再 触发冒泡，与绑定顺序无关\n> removeEventListener()\n\n与addEventListener()绑定事件对应的就是移除已绑定的事件。第三个参数的布尔值代表解绑的是捕获事件还是冒泡事件。两个事件互不相关。\n~~~\n\n    var div2 = document.getElementById(\"div2\"); \n    div2.addEventListener(\"click\", listener2, true);\n    function listener2() {\n        console.log(\'test2\');\n    }\n    div2.removeEventListener(\"click\", listener2, true);\n~~~\n**注意**：只能通过removeEventListener()解绑有名字的函数，对于绑定的匿名函数无法解除绑定。\n\n    div2.addEventListener(\"click\", function(){\n        console.log(\'test\');\n        console.log(this);\n    }, true);\n\n    div2.removeEventListener(\"click\", function() {\n        console.log(\"test\");\n    }, true);\n    div2.onclick = null;\n    // 点击div2依然打印出test\n**注意**：这里this指向触发事件的元素自身。\n\n> attachEvent()、detachEvent()\n\nIE8及以下使用这两个方法绑定和解绑事件，当然，IE9+也支持这个事件。但这个方法绑定的事件默认为冒泡也只有冒泡。\n\n~~~\n    // 这里需要在事件前加 on\n    div2.attachEvent(\"onclick\", listener1);\n    function listener1() {\n        console.log(\'test\');\n        console.log(this);\n    }\n    div2.detachEvent(\"onclick\", listener1);\n~~~\n和addEventListener()一样，也不能解绑匿名函数。\n**注意**：这里this指向 window。\n\n阻止默认事件和冒泡\n标准事件和IE事件中的阻止默认事件和冒泡事件也有很大区别。\n\n    var div2 = document.getElementById(\"div2\");\n    if (div2.addEventListener) {\n        div2.addEventListener(\"click\", function(e) {\n            e.preventDefault(); // 阻止默认事件\n            e.stopPropagation(); // 阻止冒泡\n            console.log(e.target.innerHTML);\n        }, false);\n    } else {\n        div2.attachEvent(\"onclick\", function() {\n            var e = window.event;\n            e.returnValue = false; // 阻止默认事件\n            e.cancelBubble = true; // 阻止冒泡\n            console.log(e.srcElement.innerHTML);\n        });\n    }\nIE8及以下的event是绑定在window上的。（我的IE11里，仿真到IE7、IE8也可以取到标准事件里的 e 对象，估计是升级到IE11的原因）。\n\n> 自定义事件：createEvent()\n\ncreateEvent()用于创建一个新的 event ，而后这个 event 必须调用它的 init() 方法进行初始化。最后就可以在目标元素上使用dispatchEvent()调用新创建的event事件了。\n\ncreateEvent()的参数一般有：UIEvents、MouseEvents、MutationEvents、HTMLEvents、Event(s)等等，分别有对应的init()方法。HTMLEvents、Event(s)对应的都是initEvent()方法。\n\n> initEvent(type, bubbles, cancelable)\n\ntype表示自定义的事件类型，bubbles表示是否冒泡，cancelable表示是否阻止默认事件。\n\ntarget.dispatchEvent(ev)\ntarget就是要触发自定义事件的DOM元素\n~~~\n        var div1 = document.getElementById(\"div1\");\n        div1.addEventListener(\"message\", function(){\n            console.log(\'test\');\n        }, false);\n\n        var div2 = document.getElementById(\"div2\");\n        div2.addEventListener(\"message\", function(e){\n            console.log(this);\n            console.log(e);\n        }, false);\n        var ev = document.createEvent(\"Event\");\n        ev.initEvent(\"message\", false, true); // 起泡参数变为true，div1的事件就会触发\n        div2.dispatchEvent(ev);\n~~~\n## 8.获取元素相关计算后的值\n> getComputedStyle()、currentStyle()\n\n当我们想获取元素计算后实际呈现在页面上的各个值，就用这两个方法。IE8及以下用currentStyle(),IE9+及其他标准浏览器用getComputedStyle()。\n~~~\n    var div2 = document.getElementById(\"div2\");\n    var result = \"\";\n    if (window.getComputedStyle) {\n        result = (window || document.defaultView).getComputedStyle(div2, null)[\'cssFloat\'];\n    } else {\n        result = div2.currentStyle[\"styleFloat\"];\n    }\n    console.log(result);\n    // document.defaultView返回document对象所关联的window\n~~~\n**注意**：这两个方法在不同的浏览器里差距也很大。\n比如float属性：\ngetComputedStyle： IE9以上需要用cssFloat，其他标准的用float\ncurrentStyle： IE8及以下可用styleFloat或者float。\n\n比如height属性：\n假如未设置height值，标准浏览器里能计算出高度值，而currentStyle计算出来是auto。\n\n上面的例子getComputedStyle是用键值去访问的，也可用getPropertyValue()去访问。（IE8、IE7不支持）\n\n`result = (window || document.defaultView).getComputedStyle(div2, null).getPropertyValue(\"float\");`\n> getBoundingClientRect()、getClientRects()\n\ngetBoundingClientRect()该方法获得页面中某个元素的上、右、下、左分别相对浏览器视窗的位置。getBoundingClientRect是DOM元素到浏览器可视范围的距离（到浏览器顶部而不是文档顶部）。该函数返回一个Object对象，该对象有6个属性：top,lef,right,bottom,width,height；这里的top、left和css中的理解很相似，width、height是元素自身的宽高，但是right，bottom和css中的理解有点不一样。right是指元素右边界距窗口最左边的距离，bottom是指元素下边界距窗口最上面的距离。\n\n> getClientRects()是返回一个ClientRectList集合。  \n\n\n~~~\n    var div1 = document.getElementById(\"div1\");\n    var rects1 = div1.getClientRects();\n    var rects2 = div1.getBoundingClientRect();\n    console.log(rects1[0].top);\n    console.log(rects2.top);\n~~~', '<div class=\"toc\"><ul><li><a href=\"#toc_1_0\">1.创建元素</a></li><li><a href=\"#toc_2_36\">2.节点关系</a></li><li><a href=\"#toc_3_107\">3.节点元素关系</a></li><li><a href=\"#toc_4_117\">4.节点操作</a></li><li><a href=\"#toc_5_184\">5.元素选择</a></li><li><a href=\"#toc_6_277\">6.属性操作</a></li><li><a href=\"#toc_7_342\">7.事件</a></li><li><a href=\"#toc_8_480\">8.获取元素相关计算后的值</a></li></ul></div><h2><a id=\"toc_1_0\"></a>1.创建元素</h2>\n<blockquote>\n<p>创建元素：document.createElement()</p>\n</blockquote>\n<p>使用document.createElement()可以创建新元素。这个方法只接受一个参数，即要创建元素的标签名。这个标签名在HTML文档中不区分大小写，在XHTML中区分大小写。</p>\n<blockquote>\n<p>var div = document.createElement(“div”);</p>\n</blockquote>\n<p>使用createElement()方法创建新元素的同时，也为新元素设置了ownerDocument属性，可以操作元素的特性。</p>\n<!--more-->\n<pre><code class=\"lang-\">div.id = &quot;myDiv&quot;;\ndiv.className = &quot;div1&quot;;\n</code></pre>\n<p>此时，新元素尚未被添加到文档树中，因此设置各种特性均不会影响浏览器的显示。要添加到文档树，可用appendChild()、insertBefore()、replaceChild()。</p>\n<p><code>document.body.appendChild(div);</code></p>\n<p>当把元素添加到文档树中后，这时这个元素做的任何修改都会实时地反应到浏览器中。</p>\n<p>在IE中可以为createElement()方法传入完整的元素标签和属性。(只在IE中兼容)</p>\n<p><code>var div = document.createElement(&quot;&lt;div id=\\&quot;mydiv\\&quot; class=\\&quot;div1\\&quot;&gt;&lt;/div&gt;&quot;);</code></p>\n<p>不能再标签里加其他元素节点或者文本节点，如下的方式和上面的得出的节点一样</p>\n<p><code>var div = document.createElement(&quot;&lt;div id=\\&quot;mydiv\\&quot; class=\\&quot;div1\\&quot;&gt;12212&lt;/div&gt;&quot;);</code></p>\n<blockquote>\n<p>创建文本节点 ：document.createTextNode</p>\n</blockquote>\n<p>使用document.createTextNode()来创建文本节点，这个方法接受一个参数：要插入节点的文本。与设置已有文本节点的值一样，作为参数的文本将按照HTML或XML的格式进行编码。</p>\n<p><code>document.createTextNode(&quot;121212&quot;);</code><br />\n可以添加多个文本节点。假如两个文本节点时相邻的同胞节点，那么两个文本节点会连起来，中间不会有空格。</p>\n<h2><a id=\"toc_2_36\"></a>2.节点关系</h2>\n<p>（IE9以前不将换行和空格看做文本节点，其他浏览器会）</p>\n<p>文本关系如下：</p>\n<pre><code class=\"lang-\">&lt;div id=&quot;div1&quot;&gt;\n    &lt;div id=&quot;div2&quot;&gt;2&lt;/div&gt;\n    &lt;div id=&quot;div3&quot;&gt;3&lt;/div&gt;\n    &lt;div id=&quot;div4&quot;&gt;4&lt;/div&gt;\n&lt;/div&gt;\n</code></pre>\n<blockquote>\n<p>父节点：parentNode</p>\n</blockquote>\n<p>parentNode是指定节点的父节点.一个元素节点的父节点可能是一个元素(Element )节点,也可能是一个文档(Document )节点,或者是个文档碎片(DocumentFragment)节点.<br />\n每一个节点都有一个parentNode属性。</p>\n<p>对于下面的节点类型: Attr, Document, DocumentFragment, Entity, Notation,其parentNode属性返回null。如果当前节点刚刚被创建,还没有被插入到DOM树中,则该节点的parentNode属性也返回null。</p>\n<pre><code class=\"lang-\">&lt;script type=&quot;text/javascript&quot;&gt;\n    var child2 = document.getElementById(&quot;div2&quot;);\n    var parent = child2.parentNode;\n&lt;/script&gt;\n</code></pre>\n<blockquote>\n<p>子节点：childNodes</p>\n</blockquote>\n<p>childNodes 返回包含指定节点的子节点的集合，该集合为实时更新的集合（live collection）。<br />\n实时更新就是对节点元素的任意修改都会立即反映到结果里。</p>\n<pre><code class=\"lang-\">&lt;script type=&quot;text/javascript&quot;&gt;\n    var child2 = document.getElementById(&quot;div2&quot;);\n    var parent = child2.parentNode;\n    var allChilds = parent.childNodes;\n    console.log(allChilds.length) // IE下是3，其他浏览器是7\n    \n    var nodeAdd = document.createElement(&quot;div&quot;);\n    var textAdd = document.createTextNode(&quot;这是添加的文本节点&quot;);\n    nodeAdd.appendChild(textAdd);\n    parent.appendChild(nodeAdd);\n    console.log(allChilds.length);// IE下是4，其他浏览器是8\n&lt;/script&gt;\n</code></pre>\n<blockquote>\n<p>兄弟节点：nextSibling，previousSibling</p>\n</blockquote>\n<p>nextSibling返回某节点的下一个兄弟节点，previousSibling返回某节点的上一个兄弟节点，没有的话返回null。<br />\n注意：可能因为元素换行的原因返回的是text节点。</p>\n<pre><code class=\"lang-\">&lt;script type=&quot;text/javascript&quot;&gt;\n    var child3 = document.getElementById(&quot;div3&quot;);\n    var next = child3.nextSibling;\n    var previous = child3.previousSibling;\n    console.log(next); // IE下返回div4，其他返回text\n    console.log(previous)  // IE下返回div2，其他返回text\n&lt;/script&gt;\n</code></pre>\n<blockquote>\n<p>第一个或最后一个子节点：firstChild、lastChild</p>\n</blockquote>\n<p>firstChild返回node的子节点中的第一个节点的引用，没有返回null<br />\nlastChild返回node的子节点中的最后一个节点的引用，没有返回null</p>\n<pre><code class=\"lang-\">&lt;script type=&quot;text/javascript&quot;&gt;\n    var child3 = document.getElementById(&quot;div3&quot;);\n    var parent = child3.parentNode;\n    var first = parent.firstChild; // IE是div2，其他是text\n    var last = parent.lastChild; // IE是div4，其他是text\n&lt;/script&gt;\n</code></pre>\n<h2><a id=\"toc_3_107\"></a>3.节点元素关系</h2>\n<p>只算元素，不算文本节点。</p>\n<p>以下三个方法用法和节点关系完全一样，只是这三个方法只看元素节点，不管因为空格、换行造成的文本节点或者手动加上去的文本节点。</p>\n<blockquote>\n<p>children： 返回所有元素子节点（IE5+、ff3.5、opera3、chrome，但在IE8及以下会将注释节点看成一个元素节点）</p>\n</blockquote>\n<p>以下两个IE9+才支持</p>\n<blockquote>\n<p>nextElementSibling：返回元素的下一个兄弟元素节点<br />\npreviousElementSibling: 返回元素的上一个兄弟元素节点</p>\n</blockquote>\n<h2><a id=\"toc_4_117\"></a>4.节点操作</h2>\n<blockquote>\n<p>appendChild()</p>\n</blockquote>\n<p>appendChild()用于向childNodes列表的末尾添加一个节点，并且返回这个新增的节点。<br />\n如果传入到appendChild()里的节点已经是文档的一部分了，那结果就是将节点从原来的位置转移到新位置，任何一个节点不能同时出现在文档中的多个位置。</p>\n<pre><code class=\"lang-\">    var returnNode = someNode.appendChild(someNode.firstChild); // 返回第一个节点\n    console.log(returnNode === someNode.firstChild); // false\n    console.log(returnNode === someNode.lastChild); // true\n</code></pre>\n<blockquote>\n<p>insetBefore()</p>\n</blockquote>\n<p>insetBefore()可以将节点插入到某个特定的位置。这个方法接受两个参数：要插入的节点和作为参照的节点。<br />\n插入节点后，被插入的节点变成参照节点的前一个同胞节点，同时被方法返回。 如果参照节点是null，则与appendChild()执行相同的操作。</p>\n<pre><code class=\"lang-\">    // 插入后成为最后一个子节点\n    var returnNode = someNode.insetBefore(newNode, null);\n    console.log(returnNode === someNode.lastChild); // true\n\n    // 插入后成为第一个子节点\n    var returnNode = someNode.insetBefore(newNode, someNode.firstChild);\n    console.log(returnNode === newNode); // true\n    console.log(returnNode === someNode.firstChild); // true\n\n    // 插入到最后一个子节点的前面\n    var returnNode = someNode.insetBefore(newNode, someNode.lastChild);\n    console.log(returnNode === someNode.childNodes[someNode.childnodes.length - 2]) // true\n</code></pre>\n<blockquote>\n<p>替换节点： replaceChild()</p>\n</blockquote>\n<p>replaceChild()接受两个参数：要插入的节点和要被替换的节点。被替换的节点将由这个方法返回并从文档中被移除，同时由要插入的节点占据其位置。</p>\n<pre><code class=\"lang-\">  // 替换第一个子节点\n    var returnNode = someNode.replaceChild(newNode, someNode.firstChild);\n\n</code></pre>\n<p>使用replaceChild()后，被替换的节点的所有关系指针都会被复制到插入的节点上面。</p>\n<blockquote>\n<p>删除节点：removeChild()</p>\n</blockquote>\n<p>该方法移除节点，接受一个参数，即要移除的节点，同时该方法返回被移除的节点。只能是一个节点，不能是一组节点。</p>\n<pre><code class=\"lang-\"> // 移除第一个子节点\n    var returnNode = someNode.removeChild(newNode, someNode.firstChild);\n</code></pre>\n<blockquote>\n<p>克隆节点：cloneNode(true/false)</p>\n</blockquote>\n<p>返回调用该方法的节点的一个副本。参数表示是否采用深度克隆,如果为true,则该节点的所有后代节点也都会被克隆,如果为false,则只克隆该节点本身，文本或者换行、空格这些不会复制，因为他们都是一个textNode。</p>\n<p><strong>注意</strong> : 在DOM4规范中(实现于Gecko 13.0(Firefox 13.0 / Thunderbird 13.0 / SeaMonkey 2.10) , 查看 bug 698391),deep是一个可选参数. 如果省略的话, deep参数的默认值为true,也就是说,深度克隆是默认的.如果想使用浅克隆, 你需要将该参数指定为false。</p>\n<p>在旧版本的浏览器中, 你始终需要指定deep参数。</p>\n<p>克隆一个元素节点会拷贝它所有的属性以及属性值,当然也就包括了属性上绑定的事件(比如onclick=“alert(1)”),但不会拷贝那些使用addEventListener()方法或者node.onclick = fn这种用JavaScript动态绑定的事件。</p>\n<p>注意:为了防止一个文档中出现两个ID重复的元素,使用cloneNode()方法克隆的节点在需要时应该指定另外一个与原ID值不同的ID</p>\n<pre><code class=\"lang-\">    var div1 = document.getElementById(&quot;div1&quot;);\n    var cloneHtml = div1.cloneNode(true);\n    document.body.appendChild(cloneHtml);\n</code></pre>\n<h2><a id=\"toc_5_184\"></a>5.元素选择</h2>\n<p>HTML代码示例：</p>\n<pre><code class=\"lang-\">    &lt;div id=&quot;div1&quot;&gt;\n        &lt;p id=&quot;div2&quot; class=&quot;one&quot; name=&quot;nameone&quot;&gt;2&lt;/p&gt;\n        &lt;div id=&quot;div3&quot;&gt;3&lt;/div&gt;\n        &lt;div id=&quot;div4&quot; name=&quot;div2&quot;&gt;4&lt;/div&gt;\n    &lt;/div&gt;\n</code></pre>\n<blockquote>\n<p>querySelector、querySelectorAll(IE8及以上)</p>\n</blockquote>\n<p>Selectors API通过匹配一组选择器的方式来为从DOM中检索Element节点提供一些简单快捷的方法，这比过去必须要在javascript代码中用循环来查找某个你想要的特定元素更快一些。<br />\n该规范对于使用Document,DocumentFragment和Element接口的对象都增了两种新方法：</p>\n<blockquote>\n<p>querySelector</p>\n</blockquote>\n<p>返回节点子树内与之相匹配的第一个Element节点。如果没有匹配的节点，则返回null。</p>\n<blockquote>\n<p>querySelectorAll</p>\n</blockquote>\n<p>返回一个包含节点子树内所有与之相匹配的Element节点列表，如果没有相匹配的，则返回一个空节点列表。<br />\n<strong>注意</strong>：由 querySelector()、querySelectorAll()返回的节点列表不是动态实时的（非live Collection）。这和其他DOM查询方法返回动态实时节点列表不一样。</p>\n<p>选择器方法接受一个或多个用逗号分隔的选择器来确定需要被返回的元素。例如，要选择文档中所有CSS的类(class)是warning或者note的段落§元素,可以这样写：</p>\n<p><code>var special = document.querySelectorAll( &quot;p.warning, p.note&quot; );</code><br />\n也可以通过ID来查询，例如：</p>\n<p><code>var el = document.querySelector( &quot;#main, #basic, #exclamation&quot; );</code><br />\n执行上面的代码后，el就包含了文档中元素的ID是main，basic或exclamation的所有元素中的第一个元素。</p>\n<p>querySelector() and querySelectorAll() 里可以使用任何CSS选择器，他们都不是live Collection：</p>\n<pre><code class=\"lang-\"> var notLive = document.querySelectorAll(&quot;p&quot;);\n    console.log(notLive);\n    document.getElementById(&quot;div1&quot;).removeChild(document.getElementById(&quot;div2&quot;));\n    console.log(notLive);\n    // 上面两个输出都是输出 `p#div2.one`的引用，没有因为删除了`p`标签而使`notLive`的结果发生变化。\n</code></pre>\n<blockquote>\n<p>getElementById()</p>\n</blockquote>\n<p>返回一个匹配特定 ID的元素。id是大小写敏感的字符串，代表了所要查找的元素的唯一ID，如果没有则返回null。<br />\n如果新建一个元素，还没有插入到文档中，则不能通过该方法获取到。</p>\n<pre><code class=\"lang-\">    var notLive = document.getElementById(&quot;div2&quot;);\n    console.log(notLive.innerHTML);\n    document.getElementById(&quot;div1&quot;).removeChild(document.getElementById(&quot;div2&quot;));\n    console.log(notLive.innerHTML);\n    // 上面输出都是2，说明getElementById()也是**非**live collection\n</code></pre>\n<blockquote>\n<p>getElementsByTagName()</p>\n</blockquote>\n<p>document.getElementsByTagName() 方法返回一个实时的包含具有给出标签名的元素们的HTMLCollection。指定的元素的子树会被搜索，包括元素自己。返回的 list 是实时的（live collection），意味着它会随着DOM树的变化自动更新。因此，如果对同一个元素，使用相同的参数，是不需要多次调用document.getElementsByTagName() 的。</p>\n<p>Element.getElementsByTagName()的搜索被限制为指定元素的后代而不是document</p>\n<pre><code class=\"lang-\">  var live = document.getElementsByTagName(&quot;p&quot;);\n    console.log(live[0].innerHTML);\n    document.getElementById(&quot;div1&quot;).removeChild(document.getElementById(&quot;div2&quot;));\n    console.log(live[0].innerHTML);\n    // 第一个输出2，第二个报错，因为无法引用到p标签\n</code></pre>\n<blockquote>\n<p>getElementsByName()</p>\n</blockquote>\n<p>该方法返回一个实时的nodelist collection，包含文档中所有name属性匹配的标签。这是一个 live collection。<br />\n<strong>注意</strong>：在IE和opera下，如果某个元素1的name和另一个元素2的id重合，且元素2在元素1的前面，则getElementsByName()会取到元素2。</p>\n<pre><code class=\"lang-\">    var live = document.getElementsByName(&quot;div2&quot;);\n    console.log(live[0].innerHTML);\n    document.getElementById(&quot;div1&quot;).removeChild(document.getElementById(&quot;div2&quot;));\n    console.log(live[0].innerHTML);\n    // chrome下：全部输出4\n    // IE下： 第一个输出2，第二个报错。\n</code></pre>\n<blockquote>\n<p>getElementsByClassName()</p>\n</blockquote>\n<p>该方法返回一个即时更新的（live） HTMLCollection，包含了所有拥有指定 class 的子元素。当在 document 对象上调用此方法时，会检索整个文档，包括根元素。(IE9以下不支持)</p>\n<p>要匹配多个class，则className用空格分开。</p>\n<pre><code class=\"lang-\">getElementsByClassName(&quot;class1 class2&quot;);\n    var live = document.getElementsByClassName(&quot;one&quot;);\n    console.log(live[0].innerHTML);\n    document.getElementById(&quot;div1&quot;).removeChild(document.getElementById(&quot;div2&quot;));\n    console.log(live[0].innerHTML);\n    // 第一个返回2，第二个报错\n</code></pre>\n<h2><a id=\"toc_6_277\"></a>6.属性操作</h2>\n<blockquote>\n<p>setAttribute()</p>\n</blockquote>\n<p>添加一个新属性（attribute）到元素上，或改变元素上已经存在的属性的值。</p>\n<p>当在 HTML 文档中的 HTML 元素上调用 setAttribute() 方法时，该方法会将其属性名称（attribute name）参数小写化。</p>\n<p>如果指定的属性已经存在，则其值变为传递的值。如果不存在，则创建指定的属性。也可指定为null。如果设置为null，最好使用removeAttribute()。</p>\n<pre><code class=\"lang-\">\n    var div2 = document.getElementById(&quot;div2&quot;);\n    div2.setAttribute(&quot;class&quot;, &quot;new_class&quot;);\n    div2.setAttribute(&quot;id&quot;, &quot;new_id&quot;);\n</code></pre>\n<p><strong>注意</strong>：在IE7下，修改了元素的class，如果已有class，则会出现两个class，通过setAttribute()添加的不生效；如果没有class，则添加上class，但这个添加上去的class的样式不会生效。</p>\n<blockquote>\n<p>removeAttribute()</p>\n</blockquote>\n<p>该方法用于移除元素的属性。</p>\n<pre><code class=\"lang-\">    var div2 = document.getElementById(&quot;div2&quot;);\n    div2.removeAttribute(&quot;class&quot;);\n</code></pre>\n<p><strong>注意</strong>：IE7下无法移除 class 属性</p>\n<blockquote>\n<p>getAttribute()</p>\n</blockquote>\n<p>该方法返回元素上指定属性（attribute）的值。如果指定的属性不存在，则返回 null 或 “” （空字符串）（IE5+都返回null）。</p>\n<pre><code class=\"lang-\">    var div2 = document.getElementById(&quot;div2&quot;);\n    var attr = div2.getAttribute(&quot;class&quot;);\n    console.log(attr);\n</code></pre>\n<p><strong>注意</strong>：IE7下不能正确返回class，返回的是null，其他正常。</p>\n<blockquote>\n<p>hasAttribute()</p>\n</blockquote>\n<p>hasAttribute() 返回一个布尔值，指示该元素是否包含有指定的属性（attribute）。</p>\n<p><strong>注意</strong>：IE7不支持该方法。</p>\n<blockquote>\n<p>自定义属性data-*</p>\n</blockquote>\n<p>html5里有一个data-*去设置获取元素的自定义属性值。</p>\n<p><code>&lt;div id=&quot;div1&quot; data-aa=&quot;11&quot;&gt;</code><br />\n利用div1.dataset可以获得一个DOMStringMap，包含了元素的所有data-*。<br />\n使用div1.dataset.aa就可以获取11的值。<br />\n同样，通过设置div1.dataset.bb = &quot;22&quot;就可以设置一个自定义属性值。<br />\n在不兼容的浏览器里，就使用getAttribute和setAttribute</p>\n<pre><code class=\"lang-\">    var div1 = document.getElementById(&quot;div1&quot;);\n    var a = null;\n    if (div1.dataset) {\n        a = div1.dataset.aa;\n        div1.dataset.bb = &quot;222&quot;;\n    } else {\n        a = div1.getAttribute(&quot;data-aa&quot;);\n        div1.setAttribute(&quot;data-bb&quot;, &quot;2222&quot;);\n    }\n    console.log(a);\n</code></pre>\n<h2><a id=\"toc_7_342\"></a>7.事件</h2>\n<blockquote>\n<p>addEventListener()</p>\n</blockquote>\n<p>addEventListener()将指定的事件监听器注册到目标对象上，当目标对象触发制定的事件时，指定的回调函数就会触发。目标对象可以是 文档上的元素、 document、 window 或者XMLHttpRequest(比如onreadystatechange事件)。</p>\n<p>IE8及以下不支持此方法且只有事件冒泡没有事件捕获。IE9开始支持此方法，也就有了事件捕获。</p>\n<pre><code class=\"lang-\">\n    var div1 = document.getElementById(&quot;div1&quot;);\n    div1.addEventListener(&quot;click&quot;, listener, false);\n    function listener() {\n        console.log(\'test\');\n    }\n    \n    var cloneHtml = div1.cloneNode(true);\n    document.body.appendChild(cloneHtml);\n</code></pre>\n<p>第一个参数是事件名，第二个是回调函数，第三个参数为true表示捕获，false表示冒泡。</p>\n<pre><code class=\"lang-\">    var div1 = document.getElementById(&quot;div1&quot;);\n    div1.addEventListener(&quot;click&quot;, listener1, true/fasle);\n    function listener1() {\n        console.log(\'test1\');\n    }\n\n    var div2 = document.getElementById(&quot;div2&quot;);\n    div2.addEventListener(&quot;click&quot;, listener2, true/fasle);\n    function listener2() {\n        console.log(\'test2\');\n    }\n</code></pre>\n<p>有一点要注意的是，当对某一个元素1既绑定了捕获事件，又绑定了冒泡事件时：<br />\n当这个元素1并不是触发事件的那个元素2时，则触发顺序会按照先 捕获 后 冒泡 的顺序触发；<br />\n当这个元素1就是最底层的触发事件的元素时，则这个元素没有捕获和冒泡的区别，谁先绑定就先触发谁。</p>\n<pre><code>var div2 = document.getElementById(&quot;div2&quot;);\n\ndiv2.addEventListener(&quot;click&quot;, listener2, true);\nfunction listener2() {\n    console.log(\'test2\');\n}\n\ndiv2.addEventListener(&quot;click&quot;, listener1, false);\nfunction listener1() {\n    console.log(\'test1\');\n}\n// 按绑定顺序执行，两个`addEventLister()`颠倒过来则执行顺序也变化\n// 如果再对`div1`绑定一个捕获、一个冒泡，则会先触发捕获 再 触发冒泡，与绑定顺序无关\n</code></pre>\n<blockquote>\n<p>removeEventListener()</p>\n</blockquote>\n<p>与addEventListener()绑定事件对应的就是移除已绑定的事件。第三个参数的布尔值代表解绑的是捕获事件还是冒泡事件。两个事件互不相关。</p>\n<pre><code class=\"lang-\">\n    var div2 = document.getElementById(&quot;div2&quot;); \n    div2.addEventListener(&quot;click&quot;, listener2, true);\n    function listener2() {\n        console.log(\'test2\');\n    }\n    div2.removeEventListener(&quot;click&quot;, listener2, true);\n</code></pre>\n<p><strong>注意</strong>：只能通过removeEventListener()解绑有名字的函数，对于绑定的匿名函数无法解除绑定。</p>\n<pre><code>div2.addEventListener(&quot;click&quot;, function(){\n    console.log(\'test\');\n    console.log(this);\n}, true);\n\ndiv2.removeEventListener(&quot;click&quot;, function() {\n    console.log(&quot;test&quot;);\n}, true);\ndiv2.onclick = null;\n// 点击div2依然打印出test\n</code></pre>\n<p><strong>注意</strong>：这里this指向触发事件的元素自身。</p>\n<blockquote>\n<p>attachEvent()、detachEvent()</p>\n</blockquote>\n<p>IE8及以下使用这两个方法绑定和解绑事件，当然，IE9+也支持这个事件。但这个方法绑定的事件默认为冒泡也只有冒泡。</p>\n<pre><code class=\"lang-\">    // 这里需要在事件前加 on\n    div2.attachEvent(&quot;onclick&quot;, listener1);\n    function listener1() {\n        console.log(\'test\');\n        console.log(this);\n    }\n    div2.detachEvent(&quot;onclick&quot;, listener1);\n</code></pre>\n<p>和addEventListener()一样，也不能解绑匿名函数。<br />\n<strong>注意</strong>：这里this指向 window。</p>\n<p>阻止默认事件和冒泡<br />\n标准事件和IE事件中的阻止默认事件和冒泡事件也有很大区别。</p>\n<pre><code>var div2 = document.getElementById(&quot;div2&quot;);\nif (div2.addEventListener) {\n    div2.addEventListener(&quot;click&quot;, function(e) {\n        e.preventDefault(); // 阻止默认事件\n        e.stopPropagation(); // 阻止冒泡\n        console.log(e.target.innerHTML);\n    }, false);\n} else {\n    div2.attachEvent(&quot;onclick&quot;, function() {\n        var e = window.event;\n        e.returnValue = false; // 阻止默认事件\n        e.cancelBubble = true; // 阻止冒泡\n        console.log(e.srcElement.innerHTML);\n    });\n}\n</code></pre>\n<p>IE8及以下的event是绑定在window上的。（我的IE11里，仿真到IE7、IE8也可以取到标准事件里的 e 对象，估计是升级到IE11的原因）。</p>\n<blockquote>\n<p>自定义事件：createEvent()</p>\n</blockquote>\n<p>createEvent()用于创建一个新的 event ，而后这个 event 必须调用它的 init() 方法进行初始化。最后就可以在目标元素上使用dispatchEvent()调用新创建的event事件了。</p>\n<p>createEvent()的参数一般有：UIEvents、MouseEvents、MutationEvents、HTMLEvents、Event(s)等等，分别有对应的init()方法。HTMLEvents、Event(s)对应的都是initEvent()方法。</p>\n<blockquote>\n<p>initEvent(type, bubbles, cancelable)</p>\n</blockquote>\n<p>type表示自定义的事件类型，bubbles表示是否冒泡，cancelable表示是否阻止默认事件。</p>\n<p>target.dispatchEvent(ev)<br />\ntarget就是要触发自定义事件的DOM元素</p>\n<pre><code class=\"lang-\">        var div1 = document.getElementById(&quot;div1&quot;);\n        div1.addEventListener(&quot;message&quot;, function(){\n            console.log(\'test\');\n        }, false);\n\n        var div2 = document.getElementById(&quot;div2&quot;);\n        div2.addEventListener(&quot;message&quot;, function(e){\n            console.log(this);\n            console.log(e);\n        }, false);\n        var ev = document.createEvent(&quot;Event&quot;);\n        ev.initEvent(&quot;message&quot;, false, true); // 起泡参数变为true，div1的事件就会触发\n        div2.dispatchEvent(ev);\n</code></pre>\n<h2><a id=\"toc_8_480\"></a>8.获取元素相关计算后的值</h2>\n<blockquote>\n<p>getComputedStyle()、currentStyle()</p>\n</blockquote>\n<p>当我们想获取元素计算后实际呈现在页面上的各个值，就用这两个方法。IE8及以下用currentStyle(),IE9+及其他标准浏览器用getComputedStyle()。</p>\n<pre><code class=\"lang-\">    var div2 = document.getElementById(&quot;div2&quot;);\n    var result = &quot;&quot;;\n    if (window.getComputedStyle) {\n        result = (window || document.defaultView).getComputedStyle(div2, null)[\'cssFloat\'];\n    } else {\n        result = div2.currentStyle[&quot;styleFloat&quot;];\n    }\n    console.log(result);\n    // document.defaultView返回document对象所关联的window\n</code></pre>\n<p><strong>注意</strong>：这两个方法在不同的浏览器里差距也很大。<br />\n比如float属性：<br />\ngetComputedStyle： IE9以上需要用cssFloat，其他标准的用float<br />\ncurrentStyle： IE8及以下可用styleFloat或者float。</p>\n<p>比如height属性：<br />\n假如未设置height值，标准浏览器里能计算出高度值，而currentStyle计算出来是auto。</p>\n<p>上面的例子getComputedStyle是用键值去访问的，也可用getPropertyValue()去访问。（IE8、IE7不支持）</p>\n<p><code>result = (window || document.defaultView).getComputedStyle(div2, null).getPropertyValue(&quot;float&quot;);</code></p>\n<blockquote>\n<p>getBoundingClientRect()、getClientRects()</p>\n</blockquote>\n<p>getBoundingClientRect()该方法获得页面中某个元素的上、右、下、左分别相对浏览器视窗的位置。getBoundingClientRect是DOM元素到浏览器可视范围的距离（到浏览器顶部而不是文档顶部）。该函数返回一个Object对象，该对象有6个属性：top,lef,right,bottom,width,height；这里的top、left和css中的理解很相似，width、height是元素自身的宽高，但是right，bottom和css中的理解有点不一样。right是指元素右边界距窗口最左边的距离，bottom是指元素下边界距窗口最上面的距离。</p>\n<blockquote>\n<p>getClientRects()是返回一个ClientRectList集合。</p>\n</blockquote>\n<pre><code class=\"lang-\">    var div1 = document.getElementById(&quot;div1&quot;);\n    var rects1 = div1.getClientRects();\n    var rects2 = div1.getBoundingClientRect();\n    console.log(rects1[0].top);\n    console.log(rects2.top);\n</code></pre>\n', '1', '2017-12-22 00:00:00', '2018-07-23 16:16:13', '1', '0', '{\"template\":\"\",\"featuredImage\":\"\",\"push_sites\":[]}');
  INSERT INTO `post` VALUES ('35', '1', '3', '0', '3', 'nodejs操作mysql', 'node-mysql', '<h1 id=\"-\">安装</h1>\n<p><code>$ npm install mysql</code></p>\n<h1 id=\"-\">更新&amp;修复</h1>\n<p><code>$ npm install felixge/node-mysql</code></p>\n<h1 id=\"-\">引用</h1>\n<p>code</p>\n<pre><code class=\"hljs lang-javascript\"><span class=\"hljs-comment\">//引用</span>\n<span class=\"hljs-keyword\">var</span> mysql = <span class=\"hljs-built_in\">require</span>(<span class=\"hljs-string\">\'mysql\'</span>);\n</code></pre>', '# 安装\n`$ npm install mysql`\n\n# 更新&修复\n`$ npm install felixge/node-mysql`\n# 引用\ncode\n~~~\n//引用\nvar mysql = require(\'mysql\');\n~~~\n\n<!--more-->\n# 建立连接\n code\n~~~\n//创建连接\nvar connection = mysql.createConnection({\n    host: \'localhost\', //主机名称\n    user: \'root\', //用户名\n    password: \'root\', //密码\n    database: \'xj2014\' //数据库\n});\n~~~\n# 操作数据\ncode\n~~~\n//执行操作\nconnection.query(\'SELECT * from userinfo limit 0,1\', function(err, rows, fields) {\n    console.log(err);\n    console.info(rows);\n    console.log(fields);\n});\n~~~\n\n# 完整示例\n~~~\n//引用\nvar mysql = require(\'mysql\');\n//创建连接\nvar connection = mysql.createConnection({\n    host: \'localhost\', //主机名称\n    user: \'root\', //用户名\n    password: \'root\', //密码\n    database: \'xj2014\' //数据库\n});\n//连接\nconnection.connect();\n//执行操作\nconnection.query(\'SELECT * from userinfo limit 0,1\', function(err, rows, fields) {\n    console.log(err);\n    console.info(rows);\n    console.log(fields);\n});\n//关闭连接\nconnection.end();\n~~~\n\n## 查询\n带参数查询\n~~~\n//引用\nvar mysql = require(\'mysql\');\n//创建连接\nvar connection = mysql.createConnection({\n    host: \'localhost\', //主机名称\n    user: \'root\', //用户名\n    password: \'root\', //密码\n    database: \'xj2014\' //数据库\n});\n//连接\nconnection.connect();\n//执行操作\nconnection.query(\'SELECT * from userinfo where name=?\', [\"小银银\"], function(err, rows) {\n    if (err == null) {\n        console.info(rows);\n    } else {\n        console.log(\"error info:\" + err);\n    }\n\n});\n//关闭连接\nconnection.end();\n~~~\n\n## 其他操作\n修改 ，删除 ，添加 第二个参数会包含相关的操作信息\n~~~\n//引用\nvar mysql = require(\'mysql\');\n//创建连接\nvar connection = mysql.createConnection({\n    host: \'localhost\', //主机名称\n    user: \'root\', //用户名\n    password: \'root\', //密码\n    database: \'xj2014\' //数据库\n});\n//连接\nconnection.connect();\n//执行操作\nconnection.query(\'update userinfo set name=? where id=93\', [\"小银银\"], function(err, rows) {\n    if (err == null) {\n        console.info(rows); //包含相关信息\n    } else {\n        console.log(\"error info:\" + err);\n    }\n\n});\n//关闭连接\nconnection.end();\n~~~\n', '<div class=\"toc\"><ul>\n<li><a href=\"#toc-e65\">安装</a></li>\n<li><a href=\"#toc-742\">更新&amp;修复</a></li>\n<li><a href=\"#toc-3b6\">引用</a></li>\n<li><a href=\"#toc-224\">建立连接</a></li>\n<li><a href=\"#toc-e1a\">操作数据</a></li>\n<li><a href=\"#toc-2f4\">完整示例</a><ul>\n<li><a href=\"#toc-bee\">查询</a></li>\n<li><a href=\"#toc-6d8\">其他操作</a></li>\n</ul>\n</li>\n</ul>\n</div><h1><a id=\"toc-e65\" class=\"anchor\" href=\"#toc-e65\"></a>安装</h1>\n<p><code>$ npm install mysql</code></p>\n<h1><a id=\"toc-742\" class=\"anchor\" href=\"#toc-742\"></a>更新&amp;修复</h1>\n<p><code>$ npm install felixge/node-mysql</code></p>\n<h1><a id=\"toc-3b6\" class=\"anchor\" href=\"#toc-3b6\"></a>引用</h1>\n<p>code</p>\n<pre><code class=\"hljs lang-javascript\"><span class=\"hljs-comment\">//引用</span>\n<span class=\"hljs-keyword\">var</span> mysql = <span class=\"hljs-built_in\">require</span>(<span class=\"hljs-string\">\'mysql\'</span>);\n</code></pre><!--more-->\n<h1><a id=\"toc-224\" class=\"anchor\" href=\"#toc-224\"></a>建立连接</h1>\n<p> code</p>\n<pre><code class=\"hljs lang-1c\"><span class=\"hljs-comment\">//创建连接</span>\nvar connection = mysql.createConnection({\n    host: \'localhost\', <span class=\"hljs-comment\">//主机名称</span>\n    user: \'root\', <span class=\"hljs-comment\">//用户名</span>\n    password: \'root\', <span class=\"hljs-comment\">//密码</span>\n    database: \'xj<span class=\"hljs-number\">2014</span>\' <span class=\"hljs-comment\">//数据库</span>\n});\n</code></pre><h1><a id=\"toc-e1a\" class=\"anchor\" href=\"#toc-e1a\"></a>操作数据</h1>\n<p>code</p>\n<pre><code class=\"hljs lang-javascript\"><span class=\"hljs-comment\">//执行操作</span>\nconnection.query(<span class=\"hljs-string\">\'SELECT * from userinfo limit 0,1\'</span>, <span class=\"hljs-function\"><span class=\"hljs-keyword\">function</span>(<span class=\"hljs-params\">err, rows, fields</span>) </span>{\n    <span class=\"hljs-built_in\">console</span>.log(err);\n    <span class=\"hljs-built_in\">console</span>.info(rows);\n    <span class=\"hljs-built_in\">console</span>.log(fields);\n});\n</code></pre><h1><a id=\"toc-2f4\" class=\"anchor\" href=\"#toc-2f4\"></a>完整示例</h1>\n<pre><code class=\"hljs lang-javascript\"><span class=\"hljs-comment\">//引用</span>\n<span class=\"hljs-keyword\">var</span> mysql = <span class=\"hljs-built_in\">require</span>(<span class=\"hljs-string\">\'mysql\'</span>);\n<span class=\"hljs-comment\">//创建连接</span>\n<span class=\"hljs-keyword\">var</span> connection = mysql.createConnection({\n    <span class=\"hljs-attr\">host</span>: <span class=\"hljs-string\">\'localhost\'</span>, <span class=\"hljs-comment\">//主机名称</span>\n    user: <span class=\"hljs-string\">\'root\'</span>, <span class=\"hljs-comment\">//用户名</span>\n    password: <span class=\"hljs-string\">\'root\'</span>, <span class=\"hljs-comment\">//密码</span>\n    database: <span class=\"hljs-string\">\'xj2014\'</span> <span class=\"hljs-comment\">//数据库</span>\n});\n<span class=\"hljs-comment\">//连接</span>\nconnection.connect();\n<span class=\"hljs-comment\">//执行操作</span>\nconnection.query(<span class=\"hljs-string\">\'SELECT * from userinfo limit 0,1\'</span>, <span class=\"hljs-function\"><span class=\"hljs-keyword\">function</span>(<span class=\"hljs-params\">err, rows, fields</span>) </span>{\n    <span class=\"hljs-built_in\">console</span>.log(err);\n    <span class=\"hljs-built_in\">console</span>.info(rows);\n    <span class=\"hljs-built_in\">console</span>.log(fields);\n});\n<span class=\"hljs-comment\">//关闭连接</span>\nconnection.end();\n</code></pre><h2><a id=\"toc-bee\" class=\"anchor\" href=\"#toc-bee\"></a>查询</h2>\n<p>带参数查询</p>\n<pre><code class=\"hljs lang-javascript\"><span class=\"hljs-comment\">//引用</span>\n<span class=\"hljs-keyword\">var</span> mysql = <span class=\"hljs-built_in\">require</span>(<span class=\"hljs-string\">\'mysql\'</span>);\n<span class=\"hljs-comment\">//创建连接</span>\n<span class=\"hljs-keyword\">var</span> connection = mysql.createConnection({\n    <span class=\"hljs-attr\">host</span>: <span class=\"hljs-string\">\'localhost\'</span>, <span class=\"hljs-comment\">//主机名称</span>\n    user: <span class=\"hljs-string\">\'root\'</span>, <span class=\"hljs-comment\">//用户名</span>\n    password: <span class=\"hljs-string\">\'root\'</span>, <span class=\"hljs-comment\">//密码</span>\n    database: <span class=\"hljs-string\">\'xj2014\'</span> <span class=\"hljs-comment\">//数据库</span>\n});\n<span class=\"hljs-comment\">//连接</span>\nconnection.connect();\n<span class=\"hljs-comment\">//执行操作</span>\nconnection.query(<span class=\"hljs-string\">\'SELECT * from userinfo where name=?\'</span>, [<span class=\"hljs-string\">\"小银银\"</span>], <span class=\"hljs-function\"><span class=\"hljs-keyword\">function</span>(<span class=\"hljs-params\">err, rows</span>) </span>{\n    <span class=\"hljs-keyword\">if</span> (err == <span class=\"hljs-literal\">null</span>) {\n        <span class=\"hljs-built_in\">console</span>.info(rows);\n    } <span class=\"hljs-keyword\">else</span> {\n        <span class=\"hljs-built_in\">console</span>.log(<span class=\"hljs-string\">\"error info:\"</span> + err);\n    }\n\n});\n<span class=\"hljs-comment\">//关闭连接</span>\nconnection.end();\n</code></pre><h2><a id=\"toc-6d8\" class=\"anchor\" href=\"#toc-6d8\"></a>其他操作</h2>\n<p>修改 ，删除 ，添加 第二个参数会包含相关的操作信息</p>\n<pre><code class=\"hljs lang-javascript\"><span class=\"hljs-comment\">//引用</span>\n<span class=\"hljs-keyword\">var</span> mysql = <span class=\"hljs-built_in\">require</span>(<span class=\"hljs-string\">\'mysql\'</span>);\n<span class=\"hljs-comment\">//创建连接</span>\n<span class=\"hljs-keyword\">var</span> connection = mysql.createConnection({\n    <span class=\"hljs-attr\">host</span>: <span class=\"hljs-string\">\'localhost\'</span>, <span class=\"hljs-comment\">//主机名称</span>\n    user: <span class=\"hljs-string\">\'root\'</span>, <span class=\"hljs-comment\">//用户名</span>\n    password: <span class=\"hljs-string\">\'root\'</span>, <span class=\"hljs-comment\">//密码</span>\n    database: <span class=\"hljs-string\">\'xj2014\'</span> <span class=\"hljs-comment\">//数据库</span>\n});\n<span class=\"hljs-comment\">//连接</span>\nconnection.connect();\n<span class=\"hljs-comment\">//执行操作</span>\nconnection.query(<span class=\"hljs-string\">\'update userinfo set name=? where id=93\'</span>, [<span class=\"hljs-string\">\"小银银\"</span>], <span class=\"hljs-function\"><span class=\"hljs-keyword\">function</span>(<span class=\"hljs-params\">err, rows</span>) </span>{\n    <span class=\"hljs-keyword\">if</span> (err == <span class=\"hljs-literal\">null</span>) {\n        <span class=\"hljs-built_in\">console</span>.info(rows); <span class=\"hljs-comment\">//包含相关信息</span>\n    } <span class=\"hljs-keyword\">else</span> {\n        <span class=\"hljs-built_in\">console</span>.log(<span class=\"hljs-string\">\"error info:\"</span> + err);\n    }\n\n});\n<span class=\"hljs-comment\">//关闭连接</span>\nconnection.end();\n</code></pre>', '1', '2018-03-11 17:36:54', '2018-03-11 17:36:54', '1', '0', '{\"template\":\"\",\"featuredImage\":\"\",\"push_sites\":[]}');
  INSERT INTO `post` VALUES ('36', '1', '3', '0', '3', 'nginx location rewrite 等配置', 'nginx-rule', '<h2 id=\"-\">命令</h2>\n<pre><code class=\"hljs lang-haml\">sudo nginx #打开 nginx\nnginx -s reload|reopen|stop|quit  #重新加载配置|重启|停止|退出 nginx\nnginx -t   #测试配置是否有语法错误\nnginx [-?hvVtq] [-s signal] [-c filename] [-p prefix] [-g directives]\n\n-<span class=\"ruby\">?,-h           : 打开帮助信息\n</span>-<span class=\"ruby\">v              : 显示版本信息并退出\n</span>-<span class=\"ruby\">V              : 显示版本和配置选项信息，然后退出\n</span>-<span class=\"ruby\">t              : 检测配置文件是否有语法错误，然后退出\n</span>-<span class=\"ruby\">q              : 在检测配置文件期间屏蔽非错误信息\n</span>-<span class=\"ruby\">s signal       : 给一个 nginx 主进程发送信号：stop（停止）, quit（退出）, reopen（重启）, reload（重新加载配置文件）\n</span>-<span class=\"ruby\">p prefix       : 设置前缀路径\n</span>-<span class=\"ruby\">c filename     : 设置配置文件\n</span>-<span class=\"ruby\">g directives   : 设置配置文件外的全局指令\n</span></code></pre>', '## 命令\n```\nsudo nginx #打开 nginx\nnginx -s reload|reopen|stop|quit  #重新加载配置|重启|停止|退出 nginx\nnginx -t   #测试配置是否有语法错误\nnginx [-?hvVtq] [-s signal] [-c filename] [-p prefix] [-g directives]\n\n-?,-h           : 打开帮助信息\n-v              : 显示版本信息并退出\n-V              : 显示版本和配置选项信息，然后退出\n-t              : 检测配置文件是否有语法错误，然后退出\n-q              : 在检测配置文件期间屏蔽非错误信息\n-s signal       : 给一个 nginx 主进程发送信号：stop（停止）, quit（退出）, reopen（重启）, reload（重新加载配置文件）\n-p prefix       : 设置前缀路径\n-c filename     : 设置配置文件\n-g directives   : 设置配置文件外的全局指令\n```\n<!--more--> \n## location\n`location [=|~|~*|^~] /uri/ { … }`  \n`=`开头表示精确匹配\n如 A 中只匹配根目录结尾的请求，后面不能带任何字符串    \n`~` 开头表示区分大小写的正则匹配  \n`~*` 开头表示不区分大小写的正则匹配  \n`^~` 开头表示uri以某个常规字符串开头，不是正则匹配  \n`/ `通用匹配, 如果没有其它匹配,任何请求都会匹配到  \n> (location =) > (location 完整路径) > (location ^~ 路径) > (location ~,~* 正则顺序) > (location 部分起始路径) > (/)\n\n<!--more-->\n#### location例子\n```\n#直接匹配网站根，通过域名访问网站首页比较频繁，使用这个会加速处理。\n#这里是直接转发给后端应用服务器了，也可以是一个静态首页\n# 第一个必选规则\nlocation = / {\n    proxy_pass http://tomcat:8080/index\n}\n```\n```\n# 第二个必选规则是处理静态文件请求，这是nginx作为http服务器的强项\n# 有两种配置模式，目录匹配或后缀匹配,任选其一或搭配使用\nlocation ^~ /static/ {\n    root /webroot/static/;\n}\nlocation ~* \\.(gif|jpg|jpeg|png|css|js|ico)$ {\n    root /webroot/res/;\n}\n```\n```\n#第三个规则就是通用规则，用来转发动态请求到后端应用服务器\n#非静态文件请求就默认是动态请求\nlocation / {\n    proxy_pass http://tomcat:8080/\n}\n```\n```\nlocation = / {\n    # 只匹配 / 查询。\n}\n```\n```\nlocation / {\n    # 匹配任何查询，因为所有请求都已 / 开头。但是正则表达式规则和长的块规则将被优先和查询匹配。\n}\n```\n```\nlocation ^~ /images/ {\n     # 匹配任何已 /images/ 开头的任何查询并且停止搜索。任何正则表达式将不会被测试。\n}\n```\n```\nlocation ~*.(gif|jpg|jpeg)$ {\n     # 匹配任何已 gif、jpg 或 jpeg 结尾的请求。\n}\n```\n```\nlocation ~*.(gif|jpg|swf)$ {\n     # 允许域名\n      valid_referers none blocked imgs.xxx.cn imgx.yyy.cn;\n      if ($invalid_referer) {\n              #防盗链\n              rewrite ^/ http://$host/logo.png;\n      }\n}\n```\nvalid_referers\n语法：valid_referers [none|blocked|server_names]   \n默认值：no   \n使用字段：server, location   \n这个指令在referer头的基础上为 $invalid_referer 变量赋值，其值为0或1。  \n可以使用这个指令来实现防盗链功能，如果valid_referers列表中没有Referer头的值， $invalid_referer将被设置为1。  \n参数可以使如下形式：  \n - none意为不存在的Referer头  \n - blocked意为根据防火墙伪装Referer头，如：“Referer: XXXXXXX”。  \n - server_names为一个或多个服务器的列表，0.5.33版本以后可以在名称中使用“*”通配符。  \n\n```\nadd_header Access-Control-Allow-Origin *;  \nadd_header Access-Control-Allow-Headers Content-Type;   \nadd_header Access-Control-Allow-Methods GET,POST,OPTIONS;  \nadd_header Access-Control-Allow-Credentials true;  \n```\n允许跨域\n\n## rewrite\n 使用nginx提供的全局变量或自己设置的变量，结合正则表达式和标志位实现url重写以及重定向。  \n  rewrite只能放在server{},location{},if{}中，并且只能对域名后边的除去传递的参数外的字符串起作用.  \n  例如 `http://seanlook.com/a/we/index.php?id=1&u=str` 只对`/a/we/index.php`重写。  \n  语法`rewrite regex replacement [flag]`;\n> rewrite和location功能有点像，都能实现跳转，主要区别在于rewrite是在同一域名内更改获取资源的路径，而location是对一类路径做控制访问或反向代理，可以proxy_pass到其他机器。\n\n很多情况下rewrite也会写在location里，它们的执行顺序是：\n1. 执行server块的rewrite指令  \n2. 执行location匹配\n3. 执行选定的location中的rewrite指令\n\n如果其中某步URI被重写，则重新循环执行1-3，直到找到真实存在的文件；循环超过10次，则返回500 Internal Server Error错误。\n\nflag标志位\n- `last `: 表示完成rewrite\n- `break` : 停止执行当前虚拟主机的后续rewrite指令集\n- `redirect` : 返回302临时重定向，地址栏会显示跳转后的地址\n- `permanent` : 返回301永久重定向，地址栏会显示跳转后的地址\n\n因为301和302不能简单的只返回状态码，还必须有重定向的URL，这就是return指令无法返回301,302的原因了。\n\nlast 和 break 区别有点难以理解： \n- last一般写在server和if中，而break一般使用在location中\n- last不终止重写后的url匹配，即新的url会再从server走一遍匹配流程，而break终止重写后的匹配\n- break和last都能组织继续执行后面的rewrite指令\n### if指令与全局变量\n#### if判断指令\n语法为`if(condition){...}`，对给定的条件condition进行判断。  \n如果为真，大括号内的rewrite指令将被执行。    \n`condition`可以是如下任何内容：  \n- 当表达式只是一个变量时，如果值为空或任何以0开头的字符串都会当做false\n- 直接比较变量和内容时，使用=或!= \n- `~`正则表达式匹配，`~*`不区分大小写的匹配，`!~`区分大小写的不匹配  \n`-f`和`!-f`用来判断是否存在文件  \n`-d`和`!-d`用来判断是否存在目录  \n`-e`和`!-e`用来判断是否存在文件或目录  \n`-x`和`!-x`用来判断文件是否可执行  \n例如：\n```\nif ($http_user_agent ~ MSIE) {\n    rewrite ^(.*)$ /msie/$1 break;\n} //如果UA包含\"MSIE\"，rewrite请求到/msid/目录下\n```\n```\nif ($http_cookie ~* \"id=([^;]+)(?:;|$)\") {\n    set $id $1;\n } //如果cookie匹配正则，设置变量$id等于正则引用部分\n```\n```\nif ($request_method = POST) {\n    return 405;\n} //如果提交方法为POST，则返回状态405（Method not allowed）。return不能返回301,302\n```\n```\nif ($slow) {\n    limit_rate 10k;\n} //限速，$slow可以通过 set 指令设置\n```\n```\nif (!-f $request_filename){\n    break;\n    proxy_pass  http://127.0.0.1; \n} //如果请求的文件名存在，则反向代理到localhost 。这里的break也是停止rewrite检查\n```\n```\nif ($args ~ post=140){\n    rewrite ^ http://example.com/ permanent;\n} //如果query string中包含\"post=140\"，永久重定向到example.com\n```\n#### 全局变量\n- `$args` ： #这个变量等于请求行中的参数，同$query_string \n- `$content_length`  ： 请求头中的Content-length字段。\n- `$content_type`  ： 请求头中的Content-Type字段。\n- `$document_root`  ： 当前请求在root指令中指定的值。\n- `$host`  ： 请求主机头字段，否则为服务器名称。\n- `$http_user_agent`  ： 客户端agent信息\n- `$http_cookie`  ： 客户端cookie信息\n- `$limit_rate`  ： 这个变量可以限制连接速率。\n- `$request_method`  ： 客户端请求的动作，通常为GET或POST。\n- `$remote_addr`  ： 客户端的IP地址。\n- `$remote_port`  ： 客户端的端口。\n- `$remote_user`  ： 已经经过Auth Basic Module验证的用户名。\n- `$request_filename`  ： 当前请求的文件路径，由root或alias指令与URI请求生成。\n- `$scheme`  ： HTTP方法（如http，https）。\n- `$server_protocol ` ： 请求使用的协议，通常是HTTP/1.0或HTTP/1.1。\n- `$server_addr`  ： 服务器地址，在完成一次系统调用后可以确定这个值。\n- `$server_name`  ： 服务器名称。\n- `$server_port`  ： 请求到达服务器的端口号。\n- `$request_uri`  ： 包含请求参数的原始URI，不包含主机名，如：”/foo/bar.php?arg=baz”。\n- `$uri`  ： 不带请求参数的当前URI，$uri不包含主机名，如”/foo/bar.html”。\n- `$document_uri`  ： 与$uri相同。\n  \n**如**`http://localhost:81/test1/test2/test.php`\n- $host：localhost\n- $server_port：81\n- $request_uri：http://localhost:88/test1/test2/test.php\n- $document_uri：/test1/test2/test.php\n- $document_root：/var/www/html\n- $request_filename：/var/www/html/test1/test2/test.php\n#### 常用正则\n- `.` ： 匹配除换行符以外的任意字符\n- `?` ： 重复0次或1次\n`- +` ： 重复1次或更多次\n- `*` ： 重复0次或更多次\n- `\\d` ：匹配数字\n- `^` ： 匹配字符串的开始\n- `$` ： 匹配字符串的介绍\n- `{n}` ： 重复n次\n- `{n,}` ： 重复n次或更多次\n- `[c]` ： 匹配单个字符c\n- `[a-z] `： 匹配a-z小写字母的任意一个\n> 小括号()之间匹配的内容，可以在后面通过$1来引用，$2表示的是前面第二个()里的内容。\n\n### rewrite例子\n```\nlocation ^~ /api/ {  \n            default_type application/json;  \n            if (!-f $request_filename){  \n                rewrite \"^/api/(.*)$\" /api/$1.json;  \n                break;\n            }   \n        }  \n```\n去掉后缀名访问文件\n```\nhttp {\n    # 定义image日志格式\n    log_format imagelog \'[$time_local] \' $image_file \' \' $image_type \' \' $body_bytes_sent \' \' $status;\n    # 开启重写日志\n    rewrite_log on;\n    server {\n        root /home/www;\n        location / {\n                # 重写规则信息\n                error_log logs/rewrite.log notice; \n                # 注意这里要用‘’单引号引起来，避免{}\n                rewrite \'^/images/([a-z]{2})/([a-z0-9]{5})/(.*)\\.(png|jpg|gif)$\' /data?file=$3.$4;\n                # 注意不能在上面这条规则后面加上“last”参数，否则下面的set指令不会执行\n                set $image_file $3;\n                set $image_type $4;\n        }\n\n        location /data {\n                # 指定针对图片的日志格式，来分析图片类型和大小\n                access_log logs/images.log mian;\n                root /data/images;\n                # 应用前面定义的变量。判断首先文件在不在，不在再判断目录在不在，如果还不在就跳转到最后一个url里\n                try_files /$arg_file /image404.html;\n        }\n        location = /image404.html {\n                # 图片不存在返回特定的信息\n                return 404 \"image not found\\n\";\n        }\n}\n```\n对形如`/images/ef/uh7b3/test.png`的请求，  重写到`/data?file=test.png`，于是匹配到`location /data`，先看/data/images/test.png文件存不存在，如果存在则正常响应，如果不存在则重写tryfiles到新的image404 location，直接返回404状态码。\n\n\n`rewrite ^/images/(.*)_(\\d+)x(\\d+)\\.(png|jpg|gif)$ /resizer/$1.$4?width=$2&height=$3? last;`  \n对形如`/images/bla_500x400.jpg`的文件请求，重写到`/resizer/bla.jpg?width=500&height=400`地址，并会继续尝试匹配location。', '<div class=\"toc\"><ul>\n<li><a href=\"#toc-ddf\">命令</a></li>\n<li><a href=\"#location\">location</a><ul>\n<li><a href=\"#toc-668\">location例子</a></li>\n</ul>\n</li>\n<li><a href=\"#rewrite\">rewrite</a><ul>\n<li><a href=\"#toc-93c\">if指令与全局变量</a><ul>\n<li><a href=\"#toc-f57\">if判断指令</a></li>\n<li><a href=\"#toc-fcf\">全局变量</a></li>\n<li><a href=\"#toc-f5f\">常用正则</a></li>\n</ul>\n</li>\n<li><a href=\"#toc-e08\">rewrite例子</a></li>\n</ul>\n</li>\n</ul>\n</div><h2><a id=\"toc-ddf\" class=\"anchor\" href=\"#toc-ddf\"></a>命令</h2>\n<pre><code class=\"hljs lang-haml\">sudo nginx #打开 nginx\nnginx -s reload|reopen|stop|quit  #重新加载配置|重启|停止|退出 nginx\nnginx -t   #测试配置是否有语法错误\nnginx [-?hvVtq] [-s signal] [-c filename] [-p prefix] [-g directives]\n\n-<span class=\"ruby\">?,-h           : 打开帮助信息\n</span>-<span class=\"ruby\">v              : 显示版本信息并退出\n</span>-<span class=\"ruby\">V              : 显示版本和配置选项信息，然后退出\n</span>-<span class=\"ruby\">t              : 检测配置文件是否有语法错误，然后退出\n</span>-<span class=\"ruby\">q              : 在检测配置文件期间屏蔽非错误信息\n</span>-<span class=\"ruby\">s signal       : 给一个 nginx 主进程发送信号：stop（停止）, quit（退出）, reopen（重启）, reload（重新加载配置文件）\n</span>-<span class=\"ruby\">p prefix       : 设置前缀路径\n</span>-<span class=\"ruby\">c filename     : 设置配置文件\n</span>-<span class=\"ruby\">g directives   : 设置配置文件外的全局指令\n</span></code></pre><!--more--> \n<h2><a id=\"location\" class=\"anchor\" href=\"#location\"></a>location</h2>\n<p><code>location [=|~|~*|^~] /uri/ { … }</code><br><code>=</code>开头表示精确匹配\n如 A 中只匹配根目录结尾的请求，后面不能带任何字符串<br><code>~</code> 开头表示区分大小写的正则匹配<br><code>~*</code> 开头表示不区分大小写的正则匹配<br><code>^~</code> 开头表示uri以某个常规字符串开头，不是正则匹配<br><code>/</code>通用匹配, 如果没有其它匹配,任何请求都会匹配到  </p>\n<blockquote>\n<p>(location =) &gt; (location 完整路径) &gt; (location ^~ 路径) &gt; (location ~,~* 正则顺序) &gt; (location 部分起始路径) &gt; (/)</p>\n</blockquote>\n<!--more-->\n<h4><a id=\"toc-668\" class=\"anchor\" href=\"#toc-668\"></a>location例子</h4>\n<pre><code class=\"hljs lang-vala\"><span class=\"hljs-meta\">#直接匹配网站根，通过域名访问网站首页比较频繁，使用这个会加速处理。</span>\n<span class=\"hljs-meta\">#这里是直接转发给后端应用服务器了，也可以是一个静态首页</span>\n<span class=\"hljs-meta\"># 第一个必选规则</span>\nlocation = / {\n    proxy_pass http:<span class=\"hljs-comment\">//tomcat:8080/index</span>\n}\n</code></pre><pre><code class=\"hljs lang-crmsh\"><span class=\"hljs-comment\"># 第二个必选规则是处理静态文件请求，这是nginx作为http服务器的强项</span>\n<span class=\"hljs-comment\"># 有两种配置模式，目录匹配或后缀匹配,任选其一或搭配使用</span>\n<span class=\"hljs-keyword\">location</span> <span class=\"hljs-title\">^~ /static</span>/ {\n    root /webroot/static/;\n}\n<span class=\"hljs-keyword\">location</span> <span class=\"hljs-title\">~* \\.(gif</span>|jpg|jpeg|png|css|js|ico)$ {\n    root /webroot/res/;\n}\n</code></pre><pre><code class=\"hljs lang-crmsh\"><span class=\"hljs-comment\">#第三个规则就是通用规则，用来转发动态请求到后端应用服务器</span>\n<span class=\"hljs-comment\">#非静态文件请求就默认是动态请求</span>\n<span class=\"hljs-keyword\">location</span> <span class=\"hljs-title\">/ {\n    proxy_pass</span> http://tomcat:<span class=\"hljs-number\">8080</span>/\n}\n</code></pre><pre><code class=\"hljs lang-makefile\">location = / {\n    <span class=\"hljs-comment\"># 只匹配 / 查询。</span>\n}\n</code></pre><pre><code class=\"hljs lang-crmsh\"><span class=\"hljs-keyword\">location</span> <span class=\"hljs-title\">/ {\n    # 匹配任何查询，因为所有请求都已 / 开头。但是正则表达式规则和长的块规则将被优先和查询匹配。\n}\n</span></code></pre><pre><code class=\"hljs lang-crmsh\"><span class=\"hljs-keyword\">location</span> <span class=\"hljs-title\">^~ /images</span>/ {\n     <span class=\"hljs-comment\"># 匹配任何已 /images/ 开头的任何查询并且停止搜索。任何正则表达式将不会被测试。</span>\n}\n</code></pre><pre><code class=\"hljs lang-crmsh\"><span class=\"hljs-keyword\">location</span> <span class=\"hljs-title\">~*.(gif</span>|jpg|jpeg)$ {\n     <span class=\"hljs-comment\"># 匹配任何已 gif、jpg 或 jpeg 结尾的请求。</span>\n}\n</code></pre><pre><code class=\"hljs lang-nginx\"><span class=\"hljs-attribute\">location</span> ~*.(gif|jpg|swf)$ {\n     <span class=\"hljs-comment\"># 允许域名</span>\n      <span class=\"hljs-attribute\">valid_referers</span> <span class=\"hljs-literal\">none</span> <span class=\"hljs-literal\">blocked</span> imgs.xxx.cn imgx.yyy.cn;\n      <span class=\"hljs-attribute\">if</span> (<span class=\"hljs-variable\">$invalid_referer</span>) {\n              <span class=\"hljs-comment\">#防盗链</span>\n              <span class=\"hljs-attribute\">rewrite</span><span class=\"hljs-regexp\"> ^/</span> http://<span class=\"hljs-variable\">$host</span>/logo.png;\n      }\n}\n</code></pre><p>valid_referers\n语法：valid_referers [none|blocked|server_names]<br>默认值：no<br>使用字段：server, location<br>这个指令在referer头的基础上为 $invalid_referer 变量赋值，其值为0或1。<br>可以使用这个指令来实现防盗链功能，如果valid_referers列表中没有Referer头的值， $invalid_referer将被设置为1。<br>参数可以使如下形式：  </p>\n<ul>\n<li>none意为不存在的Referer头  </li>\n<li>blocked意为根据防火墙伪装Referer头，如：“Referer: XXXXXXX”。  </li>\n<li>server_names为一个或多个服务器的列表，0.5.33版本以后可以在名称中使用“*”通配符。  </li>\n</ul>\n<pre><code class=\"hljs lang-mipsasm\"><span class=\"hljs-keyword\">add_header </span>Access-Control-Allow-<span class=\"hljs-keyword\">Origin </span>*<span class=\"hljs-comment\">;  </span>\n<span class=\"hljs-keyword\">add_header </span>Access-Control-Allow-Headers Content-Type<span class=\"hljs-comment\">;   </span>\n<span class=\"hljs-keyword\">add_header </span>Access-Control-Allow-Methods GET,POST,OPTIONS<span class=\"hljs-comment\">;  </span>\n<span class=\"hljs-keyword\">add_header </span>Access-Control-Allow-Credentials true<span class=\"hljs-comment\">;  </span>\n</code></pre><p>允许跨域</p>\n<h2><a id=\"rewrite\" class=\"anchor\" href=\"#rewrite\"></a>rewrite</h2>\n<p> 使用nginx提供的全局变量或自己设置的变量，结合正则表达式和标志位实现url重写以及重定向。<br>  rewrite只能放在server{},location{},if{}中，并且只能对域名后边的除去传递的参数外的字符串起作用.<br>  例如 <code>http://seanlook.com/a/we/index.php?id=1&amp;u=str</code> 只对<code>/a/we/index.php</code>重写。<br>  语法<code>rewrite regex replacement [flag]</code>;</p>\n<blockquote>\n<p>rewrite和location功能有点像，都能实现跳转，主要区别在于rewrite是在同一域名内更改获取资源的路径，而location是对一类路径做控制访问或反向代理，可以proxy_pass到其他机器。</p>\n</blockquote>\n<p>很多情况下rewrite也会写在location里，它们的执行顺序是：</p>\n<ol>\n<li>执行server块的rewrite指令  </li>\n<li>执行location匹配</li>\n<li>执行选定的location中的rewrite指令</li>\n</ol>\n<p>如果其中某步URI被重写，则重新循环执行1-3，直到找到真实存在的文件；循环超过10次，则返回500 Internal Server Error错误。</p>\n<p>flag标志位</p>\n<ul>\n<li><code>last</code>: 表示完成rewrite</li>\n<li><code>break</code> : 停止执行当前虚拟主机的后续rewrite指令集</li>\n<li><code>redirect</code> : 返回302临时重定向，地址栏会显示跳转后的地址</li>\n<li><code>permanent</code> : 返回301永久重定向，地址栏会显示跳转后的地址</li>\n</ul>\n<p>因为301和302不能简单的只返回状态码，还必须有重定向的URL，这就是return指令无法返回301,302的原因了。</p>\n<p>last 和 break 区别有点难以理解： </p>\n<ul>\n<li>last一般写在server和if中，而break一般使用在location中</li>\n<li>last不终止重写后的url匹配，即新的url会再从server走一遍匹配流程，而break终止重写后的匹配</li>\n<li>break和last都能组织继续执行后面的rewrite指令<h3><a id=\"toc-93c\" class=\"anchor\" href=\"#toc-93c\"></a>if指令与全局变量</h3>\n<h4><a id=\"toc-f57\" class=\"anchor\" href=\"#toc-f57\"></a>if判断指令</h4>\n语法为<code>if(condition){...}</code>，对给定的条件condition进行判断。<br>如果为真，大括号内的rewrite指令将被执行。<br><code>condition</code>可以是如下任何内容：  </li>\n<li>当表达式只是一个变量时，如果值为空或任何以0开头的字符串都会当做false</li>\n<li>直接比较变量和内容时，使用=或!= </li>\n<li><code>~</code>正则表达式匹配，<code>~*</code>不区分大小写的匹配，<code>!~</code>区分大小写的不匹配<br><code>-f</code>和<code>!-f</code>用来判断是否存在文件<br><code>-d</code>和<code>!-d</code>用来判断是否存在目录<br><code>-e</code>和<code>!-e</code>用来判断是否存在文件或目录<br><code>-x</code>和<code>!-x</code>用来判断文件是否可执行<br>例如：<pre><code class=\"hljs lang-awk\"><span class=\"hljs-keyword\">if</span> (<span class=\"hljs-variable\">$http_user_agent</span> ~ MSIE) {\n  rewrite ^(.*)$ <span class=\"hljs-regexp\">/msie/</span><span class=\"hljs-variable\">$1</span> <span class=\"hljs-keyword\">break</span>;\n} <span class=\"hljs-regexp\">//</span>如果UA包含<span class=\"hljs-string\">\"MSIE\"</span>，rewrite请求到<span class=\"hljs-regexp\">/msid/</span>目录下\n</code></pre><pre><code class=\"hljs lang-awk\"><span class=\"hljs-keyword\">if</span> (<span class=\"hljs-variable\">$http_cookie</span> ~* <span class=\"hljs-string\">\"id=([^;]+)(?:;|$)\"</span>) {\n  set <span class=\"hljs-variable\">$id</span> <span class=\"hljs-variable\">$1</span>;\n} <span class=\"hljs-regexp\">//</span>如果cookie匹配正则，设置变量<span class=\"hljs-variable\">$id</span>等于正则引用部分\n</code></pre><pre><code class=\"hljs lang-autoit\"><span class=\"hljs-keyword\">if</span> ($request_method = POST) {\n  <span class=\"hljs-keyword\">return</span> <span class=\"hljs-number\">405</span><span class=\"hljs-comment\">;</span>\n} //如果提交方法为POST，则返回状态<span class=\"hljs-number\">405</span>（Method <span class=\"hljs-literal\">not</span> allowed）。<span class=\"hljs-keyword\">return</span>不能返回<span class=\"hljs-number\">301</span>,<span class=\"hljs-number\">302</span>\n</code></pre><pre><code class=\"hljs lang-awk\"><span class=\"hljs-keyword\">if</span> (<span class=\"hljs-variable\">$slow</span>) {\n  limit_rate <span class=\"hljs-number\">10</span>k;\n} <span class=\"hljs-regexp\">//</span>限速，<span class=\"hljs-variable\">$slow</span>可以通过 set 指令设置\n</code></pre><pre><code class=\"hljs lang-awk\"><span class=\"hljs-keyword\">if</span> (!-f <span class=\"hljs-variable\">$request_filename</span>){\n  <span class=\"hljs-keyword\">break</span>;\n  proxy_pass  http:<span class=\"hljs-regexp\">//</span><span class=\"hljs-number\">127.0</span>.<span class=\"hljs-number\">0.1</span>; \n} <span class=\"hljs-regexp\">//</span>如果请求的文件名存在，则反向代理到localhost 。这里的<span class=\"hljs-keyword\">break</span>也是停止rewrite检查\n</code></pre><pre><code class=\"hljs lang-maxima\"><span class=\"hljs-keyword\">if</span> ($<span class=\"hljs-built_in\">args</span> ~ post=<span class=\"hljs-number\">140</span>){\n  rewrite ^ http://<span class=\"hljs-built_in\">example</span>.com/ <span class=\"hljs-built_in\">permanent</span>;\n} //如果query <span class=\"hljs-built_in\">string</span>中包含<span class=\"hljs-string\">\"post=140\"</span>，永久重定向到<span class=\"hljs-built_in\">example</span>.com\n</code></pre><h4><a id=\"toc-fcf\" class=\"anchor\" href=\"#toc-fcf\"></a>全局变量</h4>\n</li>\n<li><code>$args</code> ： #这个变量等于请求行中的参数，同$query_string </li>\n<li><code>$content_length</code>  ： 请求头中的Content-length字段。</li>\n<li><code>$content_type</code>  ： 请求头中的Content-Type字段。</li>\n<li><code>$document_root</code>  ： 当前请求在root指令中指定的值。</li>\n<li><code>$host</code>  ： 请求主机头字段，否则为服务器名称。</li>\n<li><code>$http_user_agent</code>  ： 客户端agent信息</li>\n<li><code>$http_cookie</code>  ： 客户端cookie信息</li>\n<li><code>$limit_rate</code>  ： 这个变量可以限制连接速率。</li>\n<li><code>$request_method</code>  ： 客户端请求的动作，通常为GET或POST。</li>\n<li><code>$remote_addr</code>  ： 客户端的IP地址。</li>\n<li><code>$remote_port</code>  ： 客户端的端口。</li>\n<li><code>$remote_user</code>  ： 已经经过Auth Basic Module验证的用户名。</li>\n<li><code>$request_filename</code>  ： 当前请求的文件路径，由root或alias指令与URI请求生成。</li>\n<li><code>$scheme</code>  ： HTTP方法（如http，https）。</li>\n<li><code>$server_protocol</code> ： 请求使用的协议，通常是HTTP/1.0或HTTP/1.1。</li>\n<li><code>$server_addr</code>  ： 服务器地址，在完成一次系统调用后可以确定这个值。</li>\n<li><code>$server_name</code>  ： 服务器名称。</li>\n<li><code>$server_port</code>  ： 请求到达服务器的端口号。</li>\n<li><code>$request_uri</code>  ： 包含请求参数的原始URI，不包含主机名，如：”/foo/bar.php?arg=baz”。</li>\n<li><code>$uri</code>  ： 不带请求参数的当前URI，$uri不包含主机名，如”/foo/bar.html”。</li>\n<li><code>$document_uri</code>  ： 与$uri相同。</li>\n</ul>\n<p><strong>如</strong><code>http://localhost:81/test1/test2/test.php</code></p>\n<ul>\n<li>$host：localhost</li>\n<li>$server_port：81</li>\n<li>$request_uri：<a href=\"http://localhost:88/test1/test2/test.php\">http://localhost:88/test1/test2/test.php</a></li>\n<li>$document_uri：/test1/test2/test.php</li>\n<li>$document_root：/var/www/html</li>\n<li>$request_filename：/var/www/html/test1/test2/test.php<h4><a id=\"toc-f5f\" class=\"anchor\" href=\"#toc-f5f\"></a>常用正则</h4>\n</li>\n<li><code>.</code> ： 匹配除换行符以外的任意字符</li>\n<li><code>?</code> ： 重复0次或1次\n<code>- +</code> ： 重复1次或更多次</li>\n<li><code>*</code> ： 重复0次或更多次</li>\n<li><code>\\d</code> ：匹配数字</li>\n<li><code>^</code> ： 匹配字符串的开始</li>\n<li><code>$</code> ： 匹配字符串的介绍</li>\n<li><code>{n}</code> ： 重复n次</li>\n<li><code>{n,}</code> ： 重复n次或更多次</li>\n<li><code>[c]</code> ： 匹配单个字符c</li>\n<li><code>[a-z]</code>： 匹配a-z小写字母的任意一个<blockquote>\n<p>小括号()之间匹配的内容，可以在后面通过$1来引用，$2表示的是前面第二个()里的内容。</p>\n</blockquote>\n</li>\n</ul>\n<h3><a id=\"toc-e08\" class=\"anchor\" href=\"#toc-e08\"></a>rewrite例子</h3>\n<pre><code class=\"hljs lang-ruby\">location ^~ <span class=\"hljs-regexp\">/api/</span> {  \n            default_type application/json;  \n            <span class=\"hljs-keyword\">if</span> (!-f $request_filename){  \n                rewrite <span class=\"hljs-string\">\"^/api/(.*)$\"</span> /api/$1.json;  \n                <span class=\"hljs-keyword\">break</span>;\n            }   \n        }  \n</code></pre><p>去掉后缀名访问文件</p>\n<pre><code class=\"hljs lang-nginx\"><span class=\"hljs-section\">http</span> {\n    <span class=\"hljs-comment\"># 定义image日志格式</span>\n    <span class=\"hljs-attribute\">log_format</span> imagelog <span class=\"hljs-string\">\'[<span class=\"hljs-variable\">$time_local</span>] \'</span> <span class=\"hljs-variable\">$image_file</span> <span class=\"hljs-string\">\' \'</span> <span class=\"hljs-variable\">$image_type</span> <span class=\"hljs-string\">\' \'</span> <span class=\"hljs-variable\">$body_bytes_sent</span> <span class=\"hljs-string\">\' \'</span> <span class=\"hljs-variable\">$status</span>;\n    <span class=\"hljs-comment\"># 开启重写日志</span>\n    <span class=\"hljs-attribute\">rewrite_log</span> <span class=\"hljs-literal\">on</span>;\n    <span class=\"hljs-section\">server</span> {\n        <span class=\"hljs-attribute\">root</span> /home/www;\n        <span class=\"hljs-attribute\">location</span> / {\n                <span class=\"hljs-comment\"># 重写规则信息</span>\n                <span class=\"hljs-attribute\">error_log</span> logs/rewrite.log <span class=\"hljs-literal\">notice</span>; \n                <span class=\"hljs-comment\"># 注意这里要用‘’单引号引起来，避免{}</span>\n                <span class=\"hljs-attribute\">rewrite</span> <span class=\"hljs-string\">\'^/images/([a-z]{2})/([a-z0-9]{5})/(.*)\\.(png|jpg|gif)$\'</span> /data?file=<span class=\"hljs-variable\">$3</span>.<span class=\"hljs-variable\">$4</span>;\n                <span class=\"hljs-comment\"># 注意不能在上面这条规则后面加上“last”参数，否则下面的set指令不会执行</span>\n                <span class=\"hljs-attribute\">set</span> <span class=\"hljs-variable\">$image_file</span> <span class=\"hljs-variable\">$3</span>;\n                <span class=\"hljs-attribute\">set</span> <span class=\"hljs-variable\">$image_type</span> <span class=\"hljs-variable\">$4</span>;\n        }\n\n        <span class=\"hljs-attribute\">location</span> /data {\n                <span class=\"hljs-comment\"># 指定针对图片的日志格式，来分析图片类型和大小</span>\n                <span class=\"hljs-attribute\">access_log</span> logs/images.log mian;\n                <span class=\"hljs-attribute\">root</span> /data/images;\n                <span class=\"hljs-comment\"># 应用前面定义的变量。判断首先文件在不在，不在再判断目录在不在，如果还不在就跳转到最后一个url里</span>\n                <span class=\"hljs-attribute\">try_files</span> /<span class=\"hljs-variable\">$arg_file</span> /image404.html;\n        }\n        <span class=\"hljs-attribute\">location</span> = /image404.html {\n                <span class=\"hljs-comment\"># 图片不存在返回特定的信息</span>\n                <span class=\"hljs-attribute\">return</span> <span class=\"hljs-number\">404</span> <span class=\"hljs-string\">\"image not found\\n\"</span>;\n        }\n}\n</code></pre><p>对形如<code>/images/ef/uh7b3/test.png</code>的请求，  重写到<code>/data?file=test.png</code>，于是匹配到<code>location /data</code>，先看/data/images/test.png文件存不存在，如果存在则正常响应，如果不存在则重写tryfiles到新的image404 location，直接返回404状态码。</p>\n<p><code>rewrite ^/images/(.*)_(\\d+)x(\\d+)\\.(png|jpg|gif)$ /resizer/$1.$4?width=$2&amp;height=$3? last;</code><br>对形如<code>/images/bla_500x400.jpg</code>的文件请求，重写到<code>/resizer/bla.jpg?width=500&amp;height=400</code>地址，并会继续尝试匹配location。</p>\n', '1', '2018-03-12 09:49:42', '2018-03-12 11:03:04', '1', '0', '{\"template\":\"\",\"featuredImage\":\"\",\"push_sites\":[]}');
  INSERT INTO `post` VALUES ('37', '1', '5', '0', '3', 'numpy', 'python-numpy', '<h2 id=\"-\">基本概念</h2>\n<p>官网 <a href=\"https://docs.scipy.org/doc/\">https://docs.scipy.org/doc/</a><br>numpy的主要对象是同种元素的多维数组。<br>这是一个所有的元素都是一种类型、通过一个正整数元组索引的元素表格(通常是元素是数字)。<br>在numpy中维度(dimensions)叫做轴(axis)，轴的个数叫做秩(rank)。  </p>\n<ul>\n<li>eg：<pre><code class=\"hljs lang-json\">[<span class=\"hljs-number\">1</span>, <span class=\"hljs-number\">2</span>, <span class=\"hljs-number\">3</span>]\n</code></pre>秩为1的数组，只有一个轴、轴长为3。</li>\n</ul>\n', '## 基本概念\n官网 [https://docs.scipy.org/doc/](https://docs.scipy.org/doc/)  \nnumpy的主要对象是同种元素的多维数组。  \n这是一个所有的元素都是一种类型、通过一个正整数元组索引的元素表格(通常是元素是数字)。  \n在numpy中维度(dimensions)叫做轴(axis)，轴的个数叫做秩(rank)。  \n- eg：\n```\n[1, 2, 3]\n```\n秩为1的数组，只有一个轴、轴长为3。\n<!--more-->\n-  eg：\n```\n[[ 1.  0.  0.]\n [ 0.  1.  2.]]\n```\n秩为2(它有两个维度).第一个维度长度为2，第二个维度长度为3。\n\nnumpy的数组类被称作ndarray。通常被称作数组。注意numpy.array和标准Python库类array.array并不相同，后者只处理一维数组和提供少量功能。更多重要ndarray对象属性有：\n\n- ndarray.ndim\n数组轴的个数，轴的个数被称作秩\n\n- ndarray.shape\n数组的维度。这是一个指示数组在每个维度上大小的整数元组。  \neg:一个2行3列的矩阵，它的shape属性将是(2,3),这个元组的长度是秩，即维度或者ndim属性\n\n- ndarray.size\n数组元素的总个数，等于shape属性中元组元素的乘积。\n\n- ndarray.dtype\n一个用来描述数组中元素类型的对象。\n\n- ndarray.itemsize\n数组中每个元素的**字节**大小。  \neg:\n```  python\nimport numpy as np\narr = np.arange(15).reshape(3, 5)\nprint(\"arr\", arr)\nprint(\"shape\", arr.shape)  # (3,5)\nprint(\"dtype\", arr.dtype)  # (int32)\nprint(\"size\", arr.size)  # 15\nprint(\"type\", type(arr))  # <class \'nu py.ndarray\'>\n```\n\n## 创建数组\n- 使用array函数从常规的Python列表和元组创造数组。  \n 所创建的数组类型由原序列中的元素类型推导而来。\n```  python\nimport numpy as np\narr = np.array([1, 2, 3, 4])\n# [1, 2, 3, 4]\nprint(arr)\n```\n- 可以在创建时显示指定类型\n```  python\nimport numpy as np\narr = np.array([1, 2, 3, 4],dtype=np.float32)\n# [1. 2. 3. 4.]\nprint(arr)\n```\n- `zeros`创建一个全是0的数组  \n参数：zeros(shape, dtype = float, order = \'C\')\n```  python\nimport numpy as np\narr = np.zeros((2,3))\nprint(arr)\n#float64\nprint(arr.dtype) \n```\n- `ones`创建一个全1的数组  \n参数：ones(shape, dtype=None, order=\'C\')\n```  python\nimport numpy as np\narr = np.ones((2,3))\nprint(arr)\n #float64\nprint(arr.dtype)\n```\n- `empty`创建一个内容随机并且依赖与内存状态的数组  \n参数：empty(shape, dtype = float, order = \'C\') \n```  python\nimport numpy as np\narr = np.empty((2,3))\nprint(arr)\n#float64\nprint(arr.dtype)\n```\n- `arange`函数返回数组  \n参数：arange(start = None, stop = None, step = None, dtype = None)   \n由于有限的浮点数精度，通常无法预测获得的元素个数。\n```  python\nimport numpy as np\narr = np.arange(10,40,10)\n#[10 20 30]\nprint(arr)\n#int32\nprint(arr.dtype)\n```\n- `linspace`  返回数组  \n参数：linspace(start, stop, num=50, endpoint=True, retstep=False, dtype=None)\n``` python\nimport numpy as np\narr = np.linspace(0,9,10)\n#[0. 1. 2. 3. 4. 5. 6. 7. 8. 9.]\nprint(arr)\n#float64\nprint(arr.dtype)\n```\n\n### random 类\nnumpy中利用random类获取随机数．  \n\n#### random()　  \n生成随机浮点数  \n默认为生成一个随机的浮点数，范围是在0.0~1.0之间，也可以通过参数size设置返回数据的size。\n``` python\nimport numpy as np\n# 生成一个随机的浮点数\nr = np.random.random()\n# 0.6590899579137934\nprint (r)\n\'\'\'\n[[0.89269339 0.56326053 0.79697541]\n [0.69644276 0.17902598 0.0084224 ]]\n\'\'\'\n# 指定size\nprint(np.random.random(size=(2,3)))\n```\n#### randint()   \n产生随机整数  \n参数: randint(low, high=None, size=None, dtype=’l’) 如果 high为None（默认值），则结果为[0，low ]  \n默认随机生一个整数int类型，可以指定这个整数的范围。\n``` python \nimport numpy as np\n# 产生 0-4 一个\nprint(np.random.randint(4))\n# 产生 2-4 一个\nprint(np.random.randint(2,4))\n# 产生 1-5 两个\nprint(np.random.randint(low=1,high=5,size=2))\n# 产生 0-5 三个\nprint(np.random.randint(5, size=3))\n# 产生 0-10 2行3列（2*3）\nprint(np.random.randint(10, size=(2, 3)))\n```\n\n#### normal() 　\n高斯分布  \n参数: normal(loc=0.0, scale=1.0, size=None) loc：均值，scale：标准差，size：抽取样本的size 。  \n```  python\nimport numpy as np\nimport matplotlib.pyplot as plt\ny=np.random.normal(0,1,5000)\nprint(y)\n# 直方图\n# 100个分块\nplt.hist(y,bins=100)\nplt.show()\n```\n![alt](/res/upimg/20180822/upload_efbfccdda454dacdb16c7541aa7aa3b5.png)\n\n#### randn()   \n正态分布产生一个浮点数或N维浮点数组\n参数：randn(d0, d1, ..., dn)\n``` python\nimport numpy as np\nimport matplotlib.pyplot as plt\ny=np.random.randn(1000)\n# 直方图\n# 100个分块\nplt.hist(y,bins=100)\nplt.show()\n```\n![alt](/res/upimg/20180822/upload_96778132faf635854b11346d51194e1a.png)\n#### standard_normal\n标准正态分布产生一个浮点数或N维浮点数组\n参数：standard_normal(size=None)\n``` python\nimport numpy as np\nimport matplotlib.pyplot as plt\ny=np.random.standard_normal((2000,1))\n# 直方图\n# 100个分块\nplt.hist(y,bins=100)\nplt.show()\n```\n![alt](/res/upimg/20180823/upload_cbf61b419ba24a5da29f2b9a19eed3d6.png)\n\n#### rand()　  \n生成[0, 1) 间随机数\n``` python\nimport numpy as np\n# 0.7758272442386239\nprint(np.random.rand())\n\'\'\'\n[[0.07675678 0.72700556 0.31372113]\n [0.19674323 0.3332258  0.49691272]]\n\'\'\'\nprint(np.random.rand(2,3))\n```\n#### shuffle()  　\n随机打乱序列将序列的所有元素随机排序 \n``` python\nimport numpy as np\nx=np.arange(10)\n# [0 1 2 3 4 5 6 7 8 9]\nprint(x)\nnp.random.shuffle(x)\n# 并没有产生新的数组\n# [7 6 1 9 3 8 4 2 5 0]\nprint(x)\n```\n#### choice()   \n随机选取序列的一个元素，可以从序列(字符串、列表、元组等)中随机选取，返回一个列表，元组或字符串的随机项。\n``` python\nimport numpy as np\nx=np.arange(10)\n# [0 1 2 3 4 5 6 7 8 9]\nprint(x)\n# 5\nprint(np.random.choice(x))\n# 输出6个小于5的元素  \n# [1 3 2 2 1 1]\nprint(np.random.choice(5, 6))\nimport numpy as np\n# 每个条目出现的概率。如果没有就均匀分布\n# [0 3 2]\nprint(np.random.choice(5, 3, p=[0.1, 0, 0.3, 0.6, 0]))\nx = [\'a\', \'b\', \'c\', \'d\']\n# [\'a\' \'c\']\nprint(np.random.choice(x, 2, p=[0.1, 0, 0.9, 0]))\n```\n\n#### RandomState()  \n 指定种子值，如不设置种子值时,np.random.randint(10)可能产生0-10内的任意整数，且每次产生的数字可能是任意一种。  \n 设置种子值后,np.random.RandomState(0).randint(10)可能产生0-10内的任意整数，如果种子值不变则每次运行程序产生的数字一样。    \n``` python\nimport numpy as np\n\nprint(np.random.RandomState(0).randint(10))\nprint(np.random.RandomState(2).randint(10))\nprint(np.random.randint(10))\n\n```\n\n## 基本运算\n 数组的算术运算是**按元素**的。新的数组被创建并且被结果填充。  \n  ```  python\nimport numpy as np\na = np.array([1, 3, 5, 7, 9])\nb = np.array([2, 4, 6, 8, 10])\n# +\nprint(a+b)\n# -\nprint(a-b)\n# *\nprint(a*b)\n# /\nprint(a/b)\n# ^ **平方\nprint(b**2)\n# %\nprint(b % 3)\n# 并没有产生新的数组\nprint(\'------\')\nb += 2\nprint(b)\n# -=\nb -= 2\nprint(b)\n# *=\nb *= 2\nprint(b)\n```\n\n## 通用函数(ufunc)\nnumpy提供常见的数学函数如`sin`,`cos`和`exp`叫作“通用函数”(ufunc)。  \n这些函数作用按数组的元素运算，产生一个数组作为输出。\n``` python\nimport numpy as np\nx =np.arange(5)\n# [0 1 2 3 4]\nprint(x)\n\n# [ 0.          0.84147098  0.90929743  0.14112001 -0.7568025 ]\nprint(np.sin(x))\n# [ 1.          0.54030231 -0.41614684 -0.9899925  -0.65364362]\nprint(np.cos(x))\n# [0.         1.         1.41421356 1.73205081 2.        ]\nprint(np.sqrt(x))\n# [ 1.          2.71828183  7.3890561  20.08553692 54.59815003]\nprint(np.exp(x))\n```\n\n## 索引，切片和迭\n索引模式：start:stop:step\n- 一维数组可以被索引、切片和迭代，就像列表和其它Python序列。\n- 多维数组可以每个轴有一个索引。这些索引由一个逗号分割的元组给出。\n- 当少于轴数的索引被提供时，确失的索引被认为是整个切片。\n- 迭代多维数组是就第一个轴而言的。\n- 对每个数组中元素进行运算，可以使用flat属性，该属性是数组元素的一个迭代器。\n\n``` python\nimport numpy as np\nx=np.arange(10)**2\n# [ 0  1  4  9 16 25 36 49 64 81]\nprint(x)\n# 1\nprint(x[1])\n# [1 4]\nprint(x[1:3])\n# [1 9] \nprint(x[1:5:2])#start:stop:step\n\nidx=[1,2,3]\n# [1 4 9]\nprint(x[idx])\nfor item in x :\n    print(item)\n#--------------\nm=np.arange(20).reshape(4,5)**2\n\'\'\'\n[[  0   1   4   9  16]\n [ 25  36  49  64  81]\n [100 121 144 169 196]\n [225 256 289 324 361]]\n\'\'\'\nprint(m)\n# 多维索引\n# 169\nprint(m[2,3])\n\'\'\'\n[[  9]\n [ 64]\n [169]]\n\'\'\'\nprint(m[0:3,3:4])# 0,1,2 行 3列\n# [225 256 289 324 361]\nprint(m[-1])\n\nfor item in m.flat:\n    print(item)\n```\n\n## 形状操作\n- reshape函数改变参数形状并返回它，而resize函数改变数组自身\n\n```python\nimport numpy as np\n\nx = np.arange(12)\n# [ 0  1  2  3  4  5  6  7  8  9 10 11]\nprint(x)\n# (12,)\nprint(x.shape)\n# reshape函数改变参数形状并返回它，而resize函数改变数组自身。\n# 返回新的数组\nprint(x.reshape(3, 4))\nx.resize(3, 4)\nprint(x)\nx.shape = (3, 4)\nprint(x)\n# [ 0  1  2  3  4  5  6  7  8  9 10 11]\nprint(x.ravel())\n\na = np.array([[1, 2],\n              [3, 4]])\nb = np.array([[5, 6],\n              [7, 8]])\n\'\'\'\n[[1 2]\n [3 4]\n [5 6]\n [7 8]]\n\'\'\'\nprint(np.vstack((a, b)))\n\'\'\'\n[[1 2 5 6]\n [3 4 7 8]]\n\'\'\'\nprint(np.hstack((a, b)))\n```\n\n### 布尔数组索引\n\n``` python\nimport numpy as np\n\nx = np.arange(12).reshape(3, 4)\n\'\'\'\n[[ 0  1  2  3]\n [ 4  5  6  7]\n [ 8  9 10 11]]\n\'\'\'\nprint(x)\ny = x > 6\n\'\'\'\n[[False False False False]\n [False False False  True]\n [ True  True  True  True]]\n\'\'\'\nprint(y)\n\nx[y]=100\n\'\'\'\n[[  0   1   2   3]\n [  4   5   6 100]\n [100 100 100 100]]\n\'\'\'\nprint(x)\n```\n\n## ref\n> 方法\n\n| numpy方法 | 解释 |\n| --- | :-: |\n| np.dtype | 指定当前numpy对象的整体数据类型 |\n| np.itemsize | 对象中每个元素的大小, 单位字节 |\n| np.size | 对象元素的个数, 相当于np.shape中的n*m值 |\n| np.shape | 轴, 查看数组形状, 对于矩阵, n行m列 |\n| np.ndim | 秩 |\n| np.isnan(list) | 筛选出nan值 |\n| np.iscomplex(list) | 筛选出非复数 |\n| ~ | 取补运算符 |\n| np.array(数组, dtype=np.bool) | 自定义数组类型 |\n| np.astype(np.bool) | 转换数组类型 |\n| np.mat() | 将python 列表转化成矩阵 |\n| np.mat().getA() | 将matrix对象转成ndarray对象 |\n| np.matrix() | 同上 |\n| np.asmatrix() | 将ndarray对象转成matrix对象 |\n| np.tile() | 重复某个数组。比如tile(A,n)，功能是将数组A重复n次，构成一个新的数组|\n| np.I | 矩阵求逆 |\n| np.T | 矩阵转置, 行变列, 列变行, 对角线翻转矩阵 |\n| np.tolist() | 转换成python列表, 用于和python原生结合写程序 |\n| np.multiply(x, y) | 矩阵x 矩阵y相乘 |\n| np.unique() | 数组驱虫, 并且从小到大生成一个新的数组 |\n| np.arange | 同python range() |\n| np.arange(24).reshape((2, 3, 4)) | 创建一个2维3行4列的数组, 必须能被给定的长度除开, 可以索引和切片 |\n| np.arange(24).resize((2, 3, 4)) | 同上, 会修改原值 |\n| np.linspace(x, y, z) | 等间距生成, x起始, y截止, z步长 |\n| np.ones(x) | 生成都是x的数组, 可传递三维数组, 几行几列, 具体的个数 |\n| np.zeros(x) | 生成都是0的数组 |\n| np.full([x, y], z) | 自定义模板数组, 生成x行y列都是z的数组 |\n| np.eye(x) | 创建一个正方的x*x单位的矩阵, 对角线为1, 其余为0 |\n| np.flatten() | 数组降维, 不改变 原值 |\n| np.random.rand(x, y, z) | 生成一个一维x随机数或生成x*y的随机数组 |\n| np.random.randn(x, y) | 正态分布随机数 |\n| np.random.randint(low, high, (shape)) | 整数随机数 |\n| np.random.normal(loc, scale, (size)) | 从指定正态分布中抽取样本, loc为概率分布的均匀值, 标准差scale |\n| np.random.seed(s) | 给一个随机数字固定 |\n| np.randomunifrom(low, high, (size)) | 均匀分布的数组, 有小数 |\n| np.random.shuffle(a) | 将数组a的第0轴(最外维度)进行随机排列(洗牌), 改变数组a, 行边列不变 |\n| np.random.permutation(a) | 同上, 不改变数组a |\n| np.random.choice(a, size=None, replace=False, p=数组a/np.sum(b)) | 从一维数组a中以概率p抽取元素，形成size形状新数组，replace表示是否可以重用元素，默认为False，p为抽取概率,本位置越高,抽取概率越高 |\n| np.sum(axis=None) | 求和, axis=0为列, 1为行 |\n| np.argsort() | 矩阵每个元素坐标排序 |\n| np.sort(axix=None) | 从小打大排序 |\n| -np.sort(axis=None) | 从大到小排序 |\n| np.sort_values(‘字段’, ascending=False) | 排序,升序排列 |\n| np.mean(axis=None) | 平均数 |\n| np.average(axis=None,weights=None) | 加权平均，weights加权值，不设为等权重,例子[10, 5, 1],每列分别X10,X5,X1在/(10+5+1) |\n| np.var(axis=None) | 方差：各数与平均数之差的平方的平均数 |\n| np.std(axis=None) | 标准差:方差平方根 |\n| np.min(axis=None) | 最小值 |\n| np.argmin(axis=None) | 求数组中最小值的坐标 |\n| np.median(axis=None) | 中位数 |\n| np.ptp(axis=None) | 元素最大值与最小值的差 |\n| np.cumsum() | 累加,cumsum和cumprod之类的方法不聚合，产生一个中间结果组成的数组,默认一维数组,1为按原样 |\n| np.cumprod() | 累乘 |\n| np.count_nonzero(arr > 0) | 计数非0值个数,布尔值会被强制转换为1和0，可以使用sum()对布尔型数组中的True值计数 |\n| np.bools.any() | 测试数组中是否存在一个或多个True |\n| np.bools.all() | 数组中所有值是否都是True, 测试有没有空值 |\n\n\n>  类型\n\n| np.dtype类型 | 解释 |\n| --- | --- |\n| np.bool | 布尔值 |\n| np.int | 整型 |\n| np.float | 浮点型 |\n| np.complex | 复数 |\n| np.object | 对象 |\n| np.string_ | ASCII字符 |\n| np.unicode_ | Unicode所有字符, 字节数平台决定 |', '<div class=\"toc\"><ul>\n<li><a href=\"#toc-e2d\">基本概念</a></li>\n<li><a href=\"#toc-894\">创建数组</a><ul>\n<li><a href=\"#toc-81e\">random 类</a><ul>\n<li><a href=\"#random-\">random()</a></li>\n<li><a href=\"#randint-\">randint()</a></li>\n<li><a href=\"#normal-\">normal()</a></li>\n<li><a href=\"#randn-\">randn()</a></li>\n<li><a href=\"#standard_normal\">standard_normal</a></li>\n<li><a href=\"#rand-\">rand()</a></li>\n<li><a href=\"#shuffle-\">shuffle()</a></li>\n<li><a href=\"#choice-\">choice()</a></li>\n<li><a href=\"#randomstate-\">RandomState()</a></li>\n</ul>\n</li>\n</ul>\n</li>\n<li><a href=\"#toc-54d\">基本运算</a></li>\n<li><a href=\"#toc-e1e\">通用函数(ufunc)</a></li>\n<li><a href=\"#toc-286\">索引，切片和迭</a></li>\n<li><a href=\"#toc-344\">形状操作</a><ul>\n<li><a href=\"#toc-ff4\">布尔数组索引</a></li>\n</ul>\n</li>\n<li><a href=\"#ref\">ref</a></li>\n</ul>\n</div><h2><a id=\"toc-e2d\" class=\"anchor\" href=\"#toc-e2d\"></a>基本概念</h2>\n<p>官网 <a href=\"https://docs.scipy.org/doc/\">https://docs.scipy.org/doc/</a><br>numpy的主要对象是同种元素的多维数组。<br>这是一个所有的元素都是一种类型、通过一个正整数元组索引的元素表格(通常是元素是数字)。<br>在numpy中维度(dimensions)叫做轴(axis)，轴的个数叫做秩(rank)。  </p>\n<ul>\n<li>eg：<pre><code class=\"hljs lang-json\">[<span class=\"hljs-number\">1</span>, <span class=\"hljs-number\">2</span>, <span class=\"hljs-number\">3</span>]\n</code></pre>秩为1的数组，只有一个轴、轴长为3。<!--more--></li>\n<li>eg：<pre><code class=\"hljs lang-json\">[[ <span class=\"hljs-number\">1.</span>  <span class=\"hljs-number\">0.</span>  <span class=\"hljs-number\">0.</span>]\n[ <span class=\"hljs-number\">0.</span>  <span class=\"hljs-number\">1.</span>  <span class=\"hljs-number\">2.</span>]]\n</code></pre>秩为2(它有两个维度).第一个维度长度为2，第二个维度长度为3。</li>\n</ul>\n<p>numpy的数组类被称作ndarray。通常被称作数组。注意numpy.array和标准Python库类array.array并不相同，后者只处理一维数组和提供少量功能。更多重要ndarray对象属性有：</p>\n<ul>\n<li><p>ndarray.ndim\n数组轴的个数，轴的个数被称作秩</p>\n</li>\n<li><p>ndarray.shape\n数组的维度。这是一个指示数组在每个维度上大小的整数元组。<br>eg:一个2行3列的矩阵，它的shape属性将是(2,3),这个元组的长度是秩，即维度或者ndim属性</p>\n</li>\n<li><p>ndarray.size\n数组元素的总个数，等于shape属性中元组元素的乘积。</p>\n</li>\n<li><p>ndarray.dtype\n一个用来描述数组中元素类型的对象。</p>\n</li>\n<li><p>ndarray.itemsize\n数组中每个元素的<strong>字节</strong>大小。<br>eg:</p>\n<pre><code class=\"hljs lang-python\"><span class=\"hljs-keyword\">import</span> numpy <span class=\"hljs-keyword\">as</span> np\narr = np.arange(<span class=\"hljs-number\">15</span>).reshape(<span class=\"hljs-number\">3</span>, <span class=\"hljs-number\">5</span>)\nprint(<span class=\"hljs-string\">\"arr\"</span>, arr)\nprint(<span class=\"hljs-string\">\"shape\"</span>, arr.shape)  <span class=\"hljs-comment\"># (3,5)</span>\nprint(<span class=\"hljs-string\">\"dtype\"</span>, arr.dtype)  <span class=\"hljs-comment\"># (int32)</span>\nprint(<span class=\"hljs-string\">\"size\"</span>, arr.size)  <span class=\"hljs-comment\"># 15</span>\nprint(<span class=\"hljs-string\">\"type\"</span>, type(arr))  <span class=\"hljs-comment\"># &lt;class \'nu py.ndarray\'&gt;</span>\n</code></pre>\n</li>\n</ul>\n<h2><a id=\"toc-894\" class=\"anchor\" href=\"#toc-894\"></a>创建数组</h2>\n<ul>\n<li>使用array函数从常规的Python列表和元组创造数组。<br>所创建的数组类型由原序列中的元素类型推导而来。<pre><code class=\"hljs lang-python\"><span class=\"hljs-keyword\">import</span> numpy <span class=\"hljs-keyword\">as</span> np\narr = np.array([<span class=\"hljs-number\">1</span>, <span class=\"hljs-number\">2</span>, <span class=\"hljs-number\">3</span>, <span class=\"hljs-number\">4</span>])\n<span class=\"hljs-comment\"># [1, 2, 3, 4]</span>\nprint(arr)\n</code></pre>\n</li>\n<li>可以在创建时显示指定类型<pre><code class=\"hljs lang-python\"><span class=\"hljs-keyword\">import</span> numpy <span class=\"hljs-keyword\">as</span> np\narr = np.array([<span class=\"hljs-number\">1</span>, <span class=\"hljs-number\">2</span>, <span class=\"hljs-number\">3</span>, <span class=\"hljs-number\">4</span>],dtype=np.float32)\n<span class=\"hljs-comment\"># [1. 2. 3. 4.]</span>\nprint(arr)\n</code></pre>\n</li>\n<li><code>zeros</code>创建一个全是0的数组<br>参数：zeros(shape, dtype = float, order = &#39;C&#39;)<pre><code class=\"hljs lang-python\"><span class=\"hljs-keyword\">import</span> numpy <span class=\"hljs-keyword\">as</span> np\narr = np.zeros((<span class=\"hljs-number\">2</span>,<span class=\"hljs-number\">3</span>))\nprint(arr)\n<span class=\"hljs-comment\">#float64</span>\nprint(arr.dtype) \n</code></pre>\n</li>\n<li><code>ones</code>创建一个全1的数组<br>参数：ones(shape, dtype=None, order=&#39;C&#39;)<pre><code class=\"hljs lang-python\"><span class=\"hljs-keyword\">import</span> numpy <span class=\"hljs-keyword\">as</span> np\narr = np.ones((<span class=\"hljs-number\">2</span>,<span class=\"hljs-number\">3</span>))\nprint(arr)\n<span class=\"hljs-comment\">#float64</span>\nprint(arr.dtype)\n</code></pre>\n</li>\n<li><code>empty</code>创建一个内容随机并且依赖与内存状态的数组<br>参数：empty(shape, dtype = float, order = &#39;C&#39;) <pre><code class=\"hljs lang-python\"><span class=\"hljs-keyword\">import</span> numpy <span class=\"hljs-keyword\">as</span> np\narr = np.empty((<span class=\"hljs-number\">2</span>,<span class=\"hljs-number\">3</span>))\nprint(arr)\n<span class=\"hljs-comment\">#float64</span>\nprint(arr.dtype)\n</code></pre>\n</li>\n<li><code>arange</code>函数返回数组<br>参数：arange(start = None, stop = None, step = None, dtype = None)<br>由于有限的浮点数精度，通常无法预测获得的元素个数。<pre><code class=\"hljs lang-python\"><span class=\"hljs-keyword\">import</span> numpy <span class=\"hljs-keyword\">as</span> np\narr = np.arange(<span class=\"hljs-number\">10</span>,<span class=\"hljs-number\">40</span>,<span class=\"hljs-number\">10</span>)\n<span class=\"hljs-comment\">#[10 20 30]</span>\nprint(arr)\n<span class=\"hljs-comment\">#int32</span>\nprint(arr.dtype)\n</code></pre>\n</li>\n<li><code>linspace</code>  返回数组<br>参数：linspace(start, stop, num=50, endpoint=True, retstep=False, dtype=None)<pre><code class=\"hljs lang-python\"><span class=\"hljs-keyword\">import</span> numpy <span class=\"hljs-keyword\">as</span> np\narr = np.linspace(<span class=\"hljs-number\">0</span>,<span class=\"hljs-number\">9</span>,<span class=\"hljs-number\">10</span>)\n<span class=\"hljs-comment\">#[0. 1. 2. 3. 4. 5. 6. 7. 8. 9.]</span>\nprint(arr)\n<span class=\"hljs-comment\">#float64</span>\nprint(arr.dtype)\n</code></pre>\n</li>\n</ul>\n<h3><a id=\"toc-81e\" class=\"anchor\" href=\"#toc-81e\"></a>random 类</h3>\n<p>numpy中利用random类获取随机数．  </p>\n<h4><a id=\"random-\" class=\"anchor\" href=\"#random-\"></a>random()　</h4>\n<p>生成随机浮点数<br>默认为生成一个随机的浮点数，范围是在0.0~1.0之间，也可以通过参数size设置返回数据的size。</p>\n<pre><code class=\"hljs lang-python\"><span class=\"hljs-keyword\">import</span> numpy <span class=\"hljs-keyword\">as</span> np\n<span class=\"hljs-comment\"># 生成一个随机的浮点数</span>\nr = np.random.random()\n<span class=\"hljs-comment\"># 0.6590899579137934</span>\n<span class=\"hljs-keyword\">print</span> (r)\n<span class=\"hljs-string\">\'\'\'\n[[0.89269339 0.56326053 0.79697541]\n [0.69644276 0.17902598 0.0084224 ]]\n\'\'\'</span>\n<span class=\"hljs-comment\"># 指定size</span>\nprint(np.random.random(size=(<span class=\"hljs-number\">2</span>,<span class=\"hljs-number\">3</span>)))\n</code></pre>\n<h4><a id=\"randint-\" class=\"anchor\" href=\"#randint-\"></a>randint()</h4>\n<p>产生随机整数<br>参数: randint(low, high=None, size=None, dtype=’l’) 如果 high为None（默认值），则结果为[0，low ]<br>默认随机生一个整数int类型，可以指定这个整数的范围。</p>\n<pre><code class=\"hljs lang-python\"><span class=\"hljs-keyword\">import</span> numpy <span class=\"hljs-keyword\">as</span> np\n<span class=\"hljs-comment\"># 产生 0-4 一个</span>\nprint(np.random.randint(<span class=\"hljs-number\">4</span>))\n<span class=\"hljs-comment\"># 产生 2-4 一个</span>\nprint(np.random.randint(<span class=\"hljs-number\">2</span>,<span class=\"hljs-number\">4</span>))\n<span class=\"hljs-comment\"># 产生 1-5 两个</span>\nprint(np.random.randint(low=<span class=\"hljs-number\">1</span>,high=<span class=\"hljs-number\">5</span>,size=<span class=\"hljs-number\">2</span>))\n<span class=\"hljs-comment\"># 产生 0-5 三个</span>\nprint(np.random.randint(<span class=\"hljs-number\">5</span>, size=<span class=\"hljs-number\">3</span>))\n<span class=\"hljs-comment\"># 产生 0-10 2行3列（2*3）</span>\nprint(np.random.randint(<span class=\"hljs-number\">10</span>, size=(<span class=\"hljs-number\">2</span>, <span class=\"hljs-number\">3</span>)))\n</code></pre>\n<h4><a id=\"normal-\" class=\"anchor\" href=\"#normal-\"></a>normal() 　</h4>\n<p>高斯分布<br>参数: normal(loc=0.0, scale=1.0, size=None) loc：均值，scale：标准差，size：抽取样本的size 。  </p>\n<pre><code class=\"hljs lang-python\"><span class=\"hljs-keyword\">import</span> numpy <span class=\"hljs-keyword\">as</span> np\n<span class=\"hljs-keyword\">import</span> matplotlib.pyplot <span class=\"hljs-keyword\">as</span> plt\ny=np.random.normal(<span class=\"hljs-number\">0</span>,<span class=\"hljs-number\">1</span>,<span class=\"hljs-number\">5000</span>)\nprint(y)\n<span class=\"hljs-comment\"># 直方图</span>\n<span class=\"hljs-comment\"># 100个分块</span>\nplt.hist(y,bins=<span class=\"hljs-number\">100</span>)\nplt.show()\n</code></pre>\n<p><img src=\"/res/upimg/20180822/upload_efbfccdda454dacdb16c7541aa7aa3b5.png\" alt=\"alt\"></p>\n<h4><a id=\"randn-\" class=\"anchor\" href=\"#randn-\"></a>randn()</h4>\n<p>正态分布产生一个浮点数或N维浮点数组\n参数：randn(d0, d1, ..., dn)</p>\n<pre><code class=\"hljs lang-python\"><span class=\"hljs-keyword\">import</span> numpy <span class=\"hljs-keyword\">as</span> np\n<span class=\"hljs-keyword\">import</span> matplotlib.pyplot <span class=\"hljs-keyword\">as</span> plt\ny=np.random.randn(<span class=\"hljs-number\">1000</span>)\n<span class=\"hljs-comment\"># 直方图</span>\n<span class=\"hljs-comment\"># 100个分块</span>\nplt.hist(y,bins=<span class=\"hljs-number\">100</span>)\nplt.show()\n</code></pre>\n<p><img src=\"/res/upimg/20180822/upload_96778132faf635854b11346d51194e1a.png\" alt=\"alt\"></p>\n<h4><a id=\"standard_normal\" class=\"anchor\" href=\"#standard_normal\"></a>standard_normal</h4>\n<p>标准正态分布产生一个浮点数或N维浮点数组\n参数：standard_normal(size=None)</p>\n<pre><code class=\"hljs lang-python\"><span class=\"hljs-keyword\">import</span> numpy <span class=\"hljs-keyword\">as</span> np\n<span class=\"hljs-keyword\">import</span> matplotlib.pyplot <span class=\"hljs-keyword\">as</span> plt\ny=np.random.standard_normal((<span class=\"hljs-number\">2000</span>,<span class=\"hljs-number\">1</span>))\n<span class=\"hljs-comment\"># 直方图</span>\n<span class=\"hljs-comment\"># 100个分块</span>\nplt.hist(y,bins=<span class=\"hljs-number\">100</span>)\nplt.show()\n</code></pre>\n<p><img src=\"/res/upimg/20180823/upload_cbf61b419ba24a5da29f2b9a19eed3d6.png\" alt=\"alt\"></p>\n<h4><a id=\"rand-\" class=\"anchor\" href=\"#rand-\"></a>rand()　</h4>\n<p>生成[0, 1) 间随机数</p>\n<pre><code class=\"hljs lang-python\"><span class=\"hljs-keyword\">import</span> numpy <span class=\"hljs-keyword\">as</span> np\n<span class=\"hljs-comment\"># 0.7758272442386239</span>\nprint(np.random.rand())\n<span class=\"hljs-string\">\'\'\'\n[[0.07675678 0.72700556 0.31372113]\n [0.19674323 0.3332258  0.49691272]]\n\'\'\'</span>\nprint(np.random.rand(<span class=\"hljs-number\">2</span>,<span class=\"hljs-number\">3</span>))\n</code></pre>\n<h4><a id=\"shuffle-\" class=\"anchor\" href=\"#shuffle-\"></a>shuffle()  　</h4>\n<p>随机打乱序列将序列的所有元素随机排序 </p>\n<pre><code class=\"hljs lang-python\"><span class=\"hljs-keyword\">import</span> numpy <span class=\"hljs-keyword\">as</span> np\nx=np.arange(<span class=\"hljs-number\">10</span>)\n<span class=\"hljs-comment\"># [0 1 2 3 4 5 6 7 8 9]</span>\nprint(x)\nnp.random.shuffle(x)\n<span class=\"hljs-comment\"># 并没有产生新的数组</span>\n<span class=\"hljs-comment\"># [7 6 1 9 3 8 4 2 5 0]</span>\nprint(x)\n</code></pre>\n<h4><a id=\"choice-\" class=\"anchor\" href=\"#choice-\"></a>choice()</h4>\n<p>随机选取序列的一个元素，可以从序列(字符串、列表、元组等)中随机选取，返回一个列表，元组或字符串的随机项。</p>\n<pre><code class=\"hljs lang-python\"><span class=\"hljs-keyword\">import</span> numpy <span class=\"hljs-keyword\">as</span> np\nx=np.arange(<span class=\"hljs-number\">10</span>)\n<span class=\"hljs-comment\"># [0 1 2 3 4 5 6 7 8 9]</span>\nprint(x)\n<span class=\"hljs-comment\"># 5</span>\nprint(np.random.choice(x))\n<span class=\"hljs-comment\"># 输出6个小于5的元素  </span>\n<span class=\"hljs-comment\"># [1 3 2 2 1 1]</span>\nprint(np.random.choice(<span class=\"hljs-number\">5</span>, <span class=\"hljs-number\">6</span>))\n<span class=\"hljs-keyword\">import</span> numpy <span class=\"hljs-keyword\">as</span> np\n<span class=\"hljs-comment\"># 每个条目出现的概率。如果没有就均匀分布</span>\n<span class=\"hljs-comment\"># [0 3 2]</span>\nprint(np.random.choice(<span class=\"hljs-number\">5</span>, <span class=\"hljs-number\">3</span>, p=[<span class=\"hljs-number\">0.1</span>, <span class=\"hljs-number\">0</span>, <span class=\"hljs-number\">0.3</span>, <span class=\"hljs-number\">0.6</span>, <span class=\"hljs-number\">0</span>]))\nx = [<span class=\"hljs-string\">\'a\'</span>, <span class=\"hljs-string\">\'b\'</span>, <span class=\"hljs-string\">\'c\'</span>, <span class=\"hljs-string\">\'d\'</span>]\n<span class=\"hljs-comment\"># [\'a\' \'c\']</span>\nprint(np.random.choice(x, <span class=\"hljs-number\">2</span>, p=[<span class=\"hljs-number\">0.1</span>, <span class=\"hljs-number\">0</span>, <span class=\"hljs-number\">0.9</span>, <span class=\"hljs-number\">0</span>]))\n</code></pre>\n<h4><a id=\"randomstate-\" class=\"anchor\" href=\"#randomstate-\"></a>RandomState()</h4>\n<p> 指定种子值，如不设置种子值时,np.random.randint(10)可能产生0-10内的任意整数，且每次产生的数字可能是任意一种。<br> 设置种子值后,np.random.RandomState(0).randint(10)可能产生0-10内的任意整数，如果种子值不变则每次运行程序产生的数字一样。    </p>\n<pre><code class=\"hljs lang-python\"><span class=\"hljs-keyword\">import</span> numpy <span class=\"hljs-keyword\">as</span> np\n\nprint(np.random.RandomState(<span class=\"hljs-number\">0</span>).randint(<span class=\"hljs-number\">10</span>))\nprint(np.random.RandomState(<span class=\"hljs-number\">2</span>).randint(<span class=\"hljs-number\">10</span>))\nprint(np.random.randint(<span class=\"hljs-number\">10</span>))\n\n</code></pre>\n<h2><a id=\"toc-54d\" class=\"anchor\" href=\"#toc-54d\"></a>基本运算</h2>\n<p> 数组的算术运算是<strong>按元素</strong>的。新的数组被创建并且被结果填充。  </p>\n<pre><code class=\"hljs lang-python\"><span class=\"hljs-keyword\">import</span> numpy <span class=\"hljs-keyword\">as</span> np\na = np.array([<span class=\"hljs-number\">1</span>, <span class=\"hljs-number\">3</span>, <span class=\"hljs-number\">5</span>, <span class=\"hljs-number\">7</span>, <span class=\"hljs-number\">9</span>])\nb = np.array([<span class=\"hljs-number\">2</span>, <span class=\"hljs-number\">4</span>, <span class=\"hljs-number\">6</span>, <span class=\"hljs-number\">8</span>, <span class=\"hljs-number\">10</span>])\n<span class=\"hljs-comment\"># +</span>\nprint(a+b)\n<span class=\"hljs-comment\"># -</span>\nprint(a-b)\n<span class=\"hljs-comment\"># *</span>\nprint(a*b)\n<span class=\"hljs-comment\"># /</span>\nprint(a/b)\n<span class=\"hljs-comment\"># ^ **平方</span>\nprint(b**<span class=\"hljs-number\">2</span>)\n<span class=\"hljs-comment\"># %</span>\nprint(b % <span class=\"hljs-number\">3</span>)\n<span class=\"hljs-comment\"># 并没有产生新的数组</span>\nprint(<span class=\"hljs-string\">\'------\'</span>)\nb += <span class=\"hljs-number\">2</span>\nprint(b)\n<span class=\"hljs-comment\"># -=</span>\nb -= <span class=\"hljs-number\">2</span>\nprint(b)\n<span class=\"hljs-comment\"># *=</span>\nb *= <span class=\"hljs-number\">2</span>\nprint(b)\n</code></pre>\n<h2><a id=\"toc-e1e\" class=\"anchor\" href=\"#toc-e1e\"></a>通用函数(ufunc)</h2>\n<p>numpy提供常见的数学函数如<code>sin</code>,<code>cos</code>和<code>exp</code>叫作“通用函数”(ufunc)。<br>这些函数作用按数组的元素运算，产生一个数组作为输出。</p>\n<pre><code class=\"hljs lang-python\"><span class=\"hljs-keyword\">import</span> numpy <span class=\"hljs-keyword\">as</span> np\nx =np.arange(<span class=\"hljs-number\">5</span>)\n<span class=\"hljs-comment\"># [0 1 2 3 4]</span>\nprint(x)\n\n<span class=\"hljs-comment\"># [ 0.          0.84147098  0.90929743  0.14112001 -0.7568025 ]</span>\nprint(np.sin(x))\n<span class=\"hljs-comment\"># [ 1.          0.54030231 -0.41614684 -0.9899925  -0.65364362]</span>\nprint(np.cos(x))\n<span class=\"hljs-comment\"># [0.         1.         1.41421356 1.73205081 2.        ]</span>\nprint(np.sqrt(x))\n<span class=\"hljs-comment\"># [ 1.          2.71828183  7.3890561  20.08553692 54.59815003]</span>\nprint(np.exp(x))\n</code></pre>\n<h2><a id=\"toc-286\" class=\"anchor\" href=\"#toc-286\"></a>索引，切片和迭</h2>\n<p>索引模式：start:stop:step</p>\n<ul>\n<li>一维数组可以被索引、切片和迭代，就像列表和其它Python序列。</li>\n<li>多维数组可以每个轴有一个索引。这些索引由一个逗号分割的元组给出。</li>\n<li>当少于轴数的索引被提供时，确失的索引被认为是整个切片。</li>\n<li>迭代多维数组是就第一个轴而言的。</li>\n<li>对每个数组中元素进行运算，可以使用flat属性，该属性是数组元素的一个迭代器。</li>\n</ul>\n<pre><code class=\"hljs lang-python\"><span class=\"hljs-keyword\">import</span> numpy <span class=\"hljs-keyword\">as</span> np\nx=np.arange(<span class=\"hljs-number\">10</span>)**<span class=\"hljs-number\">2</span>\n<span class=\"hljs-comment\"># [ 0  1  4  9 16 25 36 49 64 81]</span>\nprint(x)\n<span class=\"hljs-comment\"># 1</span>\nprint(x[<span class=\"hljs-number\">1</span>])\n<span class=\"hljs-comment\"># [1 4]</span>\nprint(x[<span class=\"hljs-number\">1</span>:<span class=\"hljs-number\">3</span>])\n<span class=\"hljs-comment\"># [1 9] </span>\nprint(x[<span class=\"hljs-number\">1</span>:<span class=\"hljs-number\">5</span>:<span class=\"hljs-number\">2</span>])<span class=\"hljs-comment\">#start:stop:step</span>\n\nidx=[<span class=\"hljs-number\">1</span>,<span class=\"hljs-number\">2</span>,<span class=\"hljs-number\">3</span>]\n<span class=\"hljs-comment\"># [1 4 9]</span>\nprint(x[idx])\n<span class=\"hljs-keyword\">for</span> item <span class=\"hljs-keyword\">in</span> x :\n    print(item)\n<span class=\"hljs-comment\">#--------------</span>\nm=np.arange(<span class=\"hljs-number\">20</span>).reshape(<span class=\"hljs-number\">4</span>,<span class=\"hljs-number\">5</span>)**<span class=\"hljs-number\">2</span>\n<span class=\"hljs-string\">\'\'\'\n[[  0   1   4   9  16]\n [ 25  36  49  64  81]\n [100 121 144 169 196]\n [225 256 289 324 361]]\n\'\'\'</span>\nprint(m)\n<span class=\"hljs-comment\"># 多维索引</span>\n<span class=\"hljs-comment\"># 169</span>\nprint(m[<span class=\"hljs-number\">2</span>,<span class=\"hljs-number\">3</span>])\n<span class=\"hljs-string\">\'\'\'\n[[  9]\n [ 64]\n [169]]\n\'\'\'</span>\nprint(m[<span class=\"hljs-number\">0</span>:<span class=\"hljs-number\">3</span>,<span class=\"hljs-number\">3</span>:<span class=\"hljs-number\">4</span>])<span class=\"hljs-comment\"># 0,1,2 行 3列</span>\n<span class=\"hljs-comment\"># [225 256 289 324 361]</span>\nprint(m[<span class=\"hljs-number\">-1</span>])\n\n<span class=\"hljs-keyword\">for</span> item <span class=\"hljs-keyword\">in</span> m.flat:\n    print(item)\n</code></pre>\n<h2><a id=\"toc-344\" class=\"anchor\" href=\"#toc-344\"></a>形状操作</h2>\n<ul>\n<li>reshape函数改变参数形状并返回它，而resize函数改变数组自身</li>\n</ul>\n<pre><code class=\"hljs lang-python\"><span class=\"hljs-keyword\">import</span> numpy <span class=\"hljs-keyword\">as</span> np\n\nx = np.arange(<span class=\"hljs-number\">12</span>)\n<span class=\"hljs-comment\"># [ 0  1  2  3  4  5  6  7  8  9 10 11]</span>\nprint(x)\n<span class=\"hljs-comment\"># (12,)</span>\nprint(x.shape)\n<span class=\"hljs-comment\"># reshape函数改变参数形状并返回它，而resize函数改变数组自身。</span>\n<span class=\"hljs-comment\"># 返回新的数组</span>\nprint(x.reshape(<span class=\"hljs-number\">3</span>, <span class=\"hljs-number\">4</span>))\nx.resize(<span class=\"hljs-number\">3</span>, <span class=\"hljs-number\">4</span>)\nprint(x)\nx.shape = (<span class=\"hljs-number\">3</span>, <span class=\"hljs-number\">4</span>)\nprint(x)\n<span class=\"hljs-comment\"># [ 0  1  2  3  4  5  6  7  8  9 10 11]</span>\nprint(x.ravel())\n\na = np.array([[<span class=\"hljs-number\">1</span>, <span class=\"hljs-number\">2</span>],\n              [<span class=\"hljs-number\">3</span>, <span class=\"hljs-number\">4</span>]])\nb = np.array([[<span class=\"hljs-number\">5</span>, <span class=\"hljs-number\">6</span>],\n              [<span class=\"hljs-number\">7</span>, <span class=\"hljs-number\">8</span>]])\n<span class=\"hljs-string\">\'\'\'\n[[1 2]\n [3 4]\n [5 6]\n [7 8]]\n\'\'\'</span>\nprint(np.vstack((a, b)))\n<span class=\"hljs-string\">\'\'\'\n[[1 2 5 6]\n [3 4 7 8]]\n\'\'\'</span>\nprint(np.hstack((a, b)))\n</code></pre>\n<h3><a id=\"toc-ff4\" class=\"anchor\" href=\"#toc-ff4\"></a>布尔数组索引</h3>\n<pre><code class=\"hljs lang-python\"><span class=\"hljs-keyword\">import</span> numpy <span class=\"hljs-keyword\">as</span> np\n\nx = np.arange(<span class=\"hljs-number\">12</span>).reshape(<span class=\"hljs-number\">3</span>, <span class=\"hljs-number\">4</span>)\n<span class=\"hljs-string\">\'\'\'\n[[ 0  1  2  3]\n [ 4  5  6  7]\n [ 8  9 10 11]]\n\'\'\'</span>\nprint(x)\ny = x &gt; <span class=\"hljs-number\">6</span>\n<span class=\"hljs-string\">\'\'\'\n[[False False False False]\n [False False False  True]\n [ True  True  True  True]]\n\'\'\'</span>\nprint(y)\n\nx[y]=<span class=\"hljs-number\">100</span>\n<span class=\"hljs-string\">\'\'\'\n[[  0   1   2   3]\n [  4   5   6 100]\n [100 100 100 100]]\n\'\'\'</span>\nprint(x)\n</code></pre>\n<h2><a id=\"ref\" class=\"anchor\" href=\"#ref\"></a>ref</h2>\n<blockquote>\n<p>方法</p>\n</blockquote>\n<table>\n<thead>\n<tr>\n<th>numpy方法</th>\n<th style=\"text-align:center\">解释</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td>np.dtype</td>\n<td style=\"text-align:center\">指定当前numpy对象的整体数据类型</td>\n</tr>\n<tr>\n<td>np.itemsize</td>\n<td style=\"text-align:center\">对象中每个元素的大小, 单位字节</td>\n</tr>\n<tr>\n<td>np.size</td>\n<td style=\"text-align:center\">对象元素的个数, 相当于np.shape中的n*m值</td>\n</tr>\n<tr>\n<td>np.shape</td>\n<td style=\"text-align:center\">轴, 查看数组形状, 对于矩阵, n行m列</td>\n</tr>\n<tr>\n<td>np.ndim</td>\n<td style=\"text-align:center\">秩</td>\n</tr>\n<tr>\n<td>np.isnan(list)</td>\n<td style=\"text-align:center\">筛选出nan值</td>\n</tr>\n<tr>\n<td>np.iscomplex(list)</td>\n<td style=\"text-align:center\">筛选出非复数</td>\n</tr>\n<tr>\n<td>~</td>\n<td style=\"text-align:center\">取补运算符</td>\n</tr>\n<tr>\n<td>np.array(数组, dtype=np.bool)</td>\n<td style=\"text-align:center\">自定义数组类型</td>\n</tr>\n<tr>\n<td>np.astype(np.bool)</td>\n<td style=\"text-align:center\">转换数组类型</td>\n</tr>\n<tr>\n<td>np.mat()</td>\n<td style=\"text-align:center\">将python 列表转化成矩阵</td>\n</tr>\n<tr>\n<td>np.mat().getA()</td>\n<td style=\"text-align:center\">将matrix对象转成ndarray对象</td>\n</tr>\n<tr>\n<td>np.matrix()</td>\n<td style=\"text-align:center\">同上</td>\n</tr>\n<tr>\n<td>np.asmatrix()</td>\n<td style=\"text-align:center\">将ndarray对象转成matrix对象</td>\n</tr>\n<tr>\n<td>np.tile()</td>\n<td style=\"text-align:center\">重复某个数组。比如tile(A,n)，功能是将数组A重复n次，构成一个新的数组</td>\n</tr>\n<tr>\n<td>np.I</td>\n<td style=\"text-align:center\">矩阵求逆</td>\n</tr>\n<tr>\n<td>np.T</td>\n<td style=\"text-align:center\">矩阵转置, 行变列, 列变行, 对角线翻转矩阵</td>\n</tr>\n<tr>\n<td>np.tolist()</td>\n<td style=\"text-align:center\">转换成python列表, 用于和python原生结合写程序</td>\n</tr>\n<tr>\n<td>np.multiply(x, y)</td>\n<td style=\"text-align:center\">矩阵x 矩阵y相乘</td>\n</tr>\n<tr>\n<td>np.unique()</td>\n<td style=\"text-align:center\">数组驱虫, 并且从小到大生成一个新的数组</td>\n</tr>\n<tr>\n<td>np.arange</td>\n<td style=\"text-align:center\">同python range()</td>\n</tr>\n<tr>\n<td>np.arange(24).reshape((2, 3, 4))</td>\n<td style=\"text-align:center\">创建一个2维3行4列的数组, 必须能被给定的长度除开, 可以索引和切片</td>\n</tr>\n<tr>\n<td>np.arange(24).resize((2, 3, 4))</td>\n<td style=\"text-align:center\">同上, 会修改原值</td>\n</tr>\n<tr>\n<td>np.linspace(x, y, z)</td>\n<td style=\"text-align:center\">等间距生成, x起始, y截止, z步长</td>\n</tr>\n<tr>\n<td>np.ones(x)</td>\n<td style=\"text-align:center\">生成都是x的数组, 可传递三维数组, 几行几列, 具体的个数</td>\n</tr>\n<tr>\n<td>np.zeros(x)</td>\n<td style=\"text-align:center\">生成都是0的数组</td>\n</tr>\n<tr>\n<td>np.full([x, y], z)</td>\n<td style=\"text-align:center\">自定义模板数组, 生成x行y列都是z的数组</td>\n</tr>\n<tr>\n<td>np.eye(x)</td>\n<td style=\"text-align:center\">创建一个正方的x*x单位的矩阵, 对角线为1, 其余为0</td>\n</tr>\n<tr>\n<td>np.flatten()</td>\n<td style=\"text-align:center\">数组降维, 不改变 原值</td>\n</tr>\n<tr>\n<td>np.random.rand(x, y, z)</td>\n<td style=\"text-align:center\">生成一个一维x随机数或生成x*y的随机数组</td>\n</tr>\n<tr>\n<td>np.random.randn(x, y)</td>\n<td style=\"text-align:center\">正态分布随机数</td>\n</tr>\n<tr>\n<td>np.random.randint(low, high, (shape))</td>\n<td style=\"text-align:center\">整数随机数</td>\n</tr>\n<tr>\n<td>np.random.normal(loc, scale, (size))</td>\n<td style=\"text-align:center\">从指定正态分布中抽取样本, loc为概率分布的均匀值, 标准差scale</td>\n</tr>\n<tr>\n<td>np.random.seed(s)</td>\n<td style=\"text-align:center\">给一个随机数字固定</td>\n</tr>\n<tr>\n<td>np.randomunifrom(low, high, (size))</td>\n<td style=\"text-align:center\">均匀分布的数组, 有小数</td>\n</tr>\n<tr>\n<td>np.random.shuffle(a)</td>\n<td style=\"text-align:center\">将数组a的第0轴(最外维度)进行随机排列(洗牌), 改变数组a, 行边列不变</td>\n</tr>\n<tr>\n<td>np.random.permutation(a)</td>\n<td style=\"text-align:center\">同上, 不改变数组a</td>\n</tr>\n<tr>\n<td>np.random.choice(a, size=None, replace=False, p=数组a/np.sum(b))</td>\n<td style=\"text-align:center\">从一维数组a中以概率p抽取元素，形成size形状新数组，replace表示是否可以重用元素，默认为False，p为抽取概率,本位置越高,抽取概率越高</td>\n</tr>\n<tr>\n<td>np.sum(axis=None)</td>\n<td style=\"text-align:center\">求和, axis=0为列, 1为行</td>\n</tr>\n<tr>\n<td>np.argsort()</td>\n<td style=\"text-align:center\">矩阵每个元素坐标排序</td>\n</tr>\n<tr>\n<td>np.sort(axix=None)</td>\n<td style=\"text-align:center\">从小打大排序</td>\n</tr>\n<tr>\n<td>-np.sort(axis=None)</td>\n<td style=\"text-align:center\">从大到小排序</td>\n</tr>\n<tr>\n<td>np.sort_values(‘字段’, ascending=False)</td>\n<td style=\"text-align:center\">排序,升序排列</td>\n</tr>\n<tr>\n<td>np.mean(axis=None)</td>\n<td style=\"text-align:center\">平均数</td>\n</tr>\n<tr>\n<td>np.average(axis=None,weights=None)</td>\n<td style=\"text-align:center\">加权平均，weights加权值，不设为等权重,例子[10, 5, 1],每列分别X10,X5,X1在/(10+5+1)</td>\n</tr>\n<tr>\n<td>np.var(axis=None)</td>\n<td style=\"text-align:center\">方差：各数与平均数之差的平方的平均数</td>\n</tr>\n<tr>\n<td>np.std(axis=None)</td>\n<td style=\"text-align:center\">标准差:方差平方根</td>\n</tr>\n<tr>\n<td>np.min(axis=None)</td>\n<td style=\"text-align:center\">最小值</td>\n</tr>\n<tr>\n<td>np.argmin(axis=None)</td>\n<td style=\"text-align:center\">求数组中最小值的坐标</td>\n</tr>\n<tr>\n<td>np.median(axis=None)</td>\n<td style=\"text-align:center\">中位数</td>\n</tr>\n<tr>\n<td>np.ptp(axis=None)</td>\n<td style=\"text-align:center\">元素最大值与最小值的差</td>\n</tr>\n<tr>\n<td>np.cumsum()</td>\n<td style=\"text-align:center\">累加,cumsum和cumprod之类的方法不聚合，产生一个中间结果组成的数组,默认一维数组,1为按原样</td>\n</tr>\n<tr>\n<td>np.cumprod()</td>\n<td style=\"text-align:center\">累乘</td>\n</tr>\n<tr>\n<td>np.count_nonzero(arr &gt; 0)</td>\n<td style=\"text-align:center\">计数非0值个数,布尔值会被强制转换为1和0，可以使用sum()对布尔型数组中的True值计数</td>\n</tr>\n<tr>\n<td>np.bools.any()</td>\n<td style=\"text-align:center\">测试数组中是否存在一个或多个True</td>\n</tr>\n<tr>\n<td>np.bools.all()</td>\n<td style=\"text-align:center\">数组中所有值是否都是True, 测试有没有空值</td>\n</tr>\n</tbody>\n</table>\n<blockquote>\n<p> 类型</p>\n</blockquote>\n<table>\n<thead>\n<tr>\n<th>np.dtype类型</th>\n<th>解释</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td>np.bool</td>\n<td>布尔值</td>\n</tr>\n<tr>\n<td>np.int</td>\n<td>整型</td>\n</tr>\n<tr>\n<td>np.float</td>\n<td>浮点型</td>\n</tr>\n<tr>\n<td>np.complex</td>\n<td>复数</td>\n</tr>\n<tr>\n<td>np.object</td>\n<td>对象</td>\n</tr>\n<tr>\n<td>np.string_</td>\n<td>ASCII字符</td>\n</tr>\n<tr>\n<td>np.unicode_</td>\n<td>Unicode所有字符, 字节数平台决定</td>\n</tr>\n</tbody>\n</table>\n', '1', '2018-08-01 16:00:55', '2018-08-23 10:28:49', '1', '0', '{\"template\":\"\",\"featuredImage\":\"\",\"push_sites\":[]}');
  INSERT INTO `post` VALUES ('39', '1', '1', '0', '0', 'go-遗传算法-简单实现', 'ga-simple', '<p>ga(genetic algorithm)遗传算法<br />\n求<code>x+10*sin(5*x)+7*cos(4*x) 在[0,9]</code>的最大值</p>\n', 'ga(genetic algorithm)遗传算法  \n求`x+10*sin(5*x)+7*cos(4*x) 在[0,9]`的最大值  \n<!--more-->\n代码  \ncore\n```\npackage core\n\nimport (\n	\"math\"\n	\"math/rand\"\n	\"time\"\n)\n\n// Ga 遗传算法\ntype Ga struct {\n	// 染色体长度\n	Length int\n	// 种群数量\n	Count int\n	// 种群\n	Population []int\n	//retain 适应度\n	retain float64\n	// 幸运者\n	random float64\n	// 变异几率\n	mutation float64\n}\n\nfunc init() {\n	rand.Seed(time.Now().UnixNano()) //利用当前时间的UNIX时间戳初始化rand包\n}\n\n// NewGa 初始化\nfunc NewGa(length, count int, retain, random, mutation float64) Ga {\n	ga := Ga{\n		Length:   length,\n		Count:    count,\n		retain:   retain,\n		random:   random,\n		mutation: mutation,\n	}\n	ga.Population = make([]int, count)\n	for i := 0; i < count; i++ {\n		tmp := 0\n		// 随机生成染色体\n		for j := 0; j < length; j++ {\n			tmp |= (1 << uint(j)) * rand.Intn(2)\n		}\n		ga.Population[i] = tmp\n	}\n	return ga\n}\n\n// Evolve 进化\nfunc (ga *Ga) Evolve() {\n	// 选择\n	ga.Selection()\n	// 繁衍\n	ga.Crossover()\n	// 变异\n	ga.Mutation()\n}\n\n// Selection 选择\nfunc (ga *Ga) Selection() {\n	// 计算适应度\n	fit := ga.Fitness()\n	// 排序适应度\n	for i := 0; i < ga.Count-1; i++ {\n		for j := i + 1; j < ga.Count; j++ {\n			if fit[i] <= fit[j] {\n				fit[i], fit[j] = fit[j], fit[i]\n				// 种群与适应度统一\n				ga.Population[i], ga.Population[j] = ga.Population[j], ga.Population[i]\n			}\n		}\n	}\n	// 选择适应度强的染色体\n	flag := int(float64(len(fit)) * ga.retain)\n	parents := ga.Population[:flag]\n	for _, v := range ga.Population[flag:] {\n		if rand.Float64() < ga.random {\n			parents = append(parents, v)\n		}\n	}\n	ga.Population = parents\n}\n\n// Fitness 计算适应度\nfunc (ga Ga) Fitness() []float64 {\n	t := 1 << uint(ga.Length)\n	f := make([]float64, 0, ga.Count)\n	for idx := 0; idx < ga.Count; idx++ {\n		gf := float64(ga.Population[idx]) * 9.0 / float64(t)\n		// 计算函数值\n		f = append(f, gf+10*math.Sin(5*gf)+7*math.Cos(4*gf))\n	}\n	return f\n}\n\n// Crossover 繁衍\nfunc (ga *Ga) Crossover() {\n	pLen := len(ga.Population)\n	// 需要的子代数量\n	targetCount := ga.Count - pLen\n	// 子代种群\n	children := make([]int, 0, targetCount)\n	for targetCount > 0 {\n		male := rand.Intn(pLen)\n		female := rand.Intn(pLen)\n		if male != female {\n			targetCount--\n			// 随机交叉点\n			crossPos := rand.Intn(ga.Length)\n			// 生成掩码\n			mask := 0\n			for i := 0; i < crossPos; i++ {\n				mask |= (1 << uint(i))\n			}\n			male = ga.Population[male]\n			female = ga.Population[female]\n			// 孩子获得父亲在交叉点之前的基因，和目前交叉点之后的基因\n			child := ((male & mask) | (female &^ mask)) & (1<<uint(ga.Length) - 1)\n			children = append(children, child)\n		}\n	}\n	// 经过繁殖后的新种群\n	ga.Population = append(ga.Population, children...)\n}\n\n// Mutation 变异\nfunc (ga Ga) Mutation() {\n	for idx := 0; idx < ga.Count; idx++ {\n		if rand.Float64() < ga.mutation {\n			r := rand.Intn(ga.Length)\n			ga.Population[idx] ^= 1 << (uint(r))\n		}\n	}\n}\n\n// Resutl 结果\nfunc (ga *Ga) Resutl() float64 {\n	// 计算适应度\n	fit := ga.Fitness()\n	// 排序适应度\n	for i := 0; i < ga.Count-1; i++ {\n		for j := i + 1; j < ga.Count; j++ {\n			if fit[i] <= fit[j] {\n				fit[i], fit[j] = fit[j], fit[i]\n				// 种群与适应度统一\n				ga.Population[i], ga.Population[j] = ga.Population[j], ga.Population[i]\n			}\n		}\n	}\n	t := 1 << uint(ga.Length)\n	return float64(ga.Population[0]) * 9.0 / float64(t)\n}\n\n```\n\nmain\n```\npackage main\n\nimport (\n	\"fmt\"\n	\"ga/core\"\n)\n\nfunc main() {\n	ga := core.NewGa(17, 600, 0.2, 0.5, 0.01)\n	for i := 0; i < 400; i++ {\n		ga.Evolve()\n	}\n	fmt.Println(ga.Resutl())\n}\n\n```', '', '1', '2018-03-12 19:16:20', '2018-03-19 13:20:53', '1', '0', '{\"template\":\"\",\"featuredImage\":\"\",\"push_sites\":[]}');
  INSERT INTO `post` VALUES ('43', '1', '0', '0', '3', 'clang & web', 'c-web-base', '<h2 id=\"-\">软件下载</h2>\n<h4 id=\"a-\">a.软件名称</h4>\n<p>apache http server</p>\n<h4 id=\"b-\">b.下载地址</h4>\n<p><a href=\"http://www.apache.org/\">官网下载</a> \n<a href=\"http://pan.baidu.com/s/1dFNz2Fn\">百度云下载</a> </p>\n<h4 id=\"c-\">c.软件截图</h4>\n<p><img src=\"/res/upimg/20180326/screenshot_1484156168014.png\" alt=\"\"></p>\n', '##  软件下载\n#### a.软件名称\napache http server\n#### b.下载地址\n[官网下载](http://www.apache.org/) \n[百度云下载](http://pan.baidu.com/s/1dFNz2Fn) \n#### c.软件截图\n![](/res/upimg/20180326/screenshot_1484156168014.png)\n\n<!--more-->\n##  软件安装\n#### a.开始安装\n![](/res/upimg/20180326/screenshot_1484156146964.png) \n#### b.确认\n![](/res/upimg/20180326/screenshot_1484156209188.png)\n#### c.基本配置\n![](/res/upimg/20180326/screenshot_1484156225898.png)\n#### d.安装配置\n![](/res/upimg/20180326/screenshot_1484156241536.png)\n\n* * * * *\n#### e.注意\n注意:如果80端口被占用请自己修改为其他\n\n![](/res/upimg/20180326/screenshot_1484156254058.png)\n##### a.修改文件的位置以及修改的地方\n![](/res/upimg/20180326/screenshot_1484156264984.png)\n\n* * * * *\n#### f.启动服务\n![](/res/upimg/20180326/screenshot_1484156274873.png)\n#### g.浏览器测试\n![](/res/upimg/20180326/screenshot_1484156286961.png)\n\n## c语言写网页\n#### a.编写代码\n![](/res/upimg/20180326/screenshot_1484156332324.png) \n#### b.生成exe\n![](/res/upimg/20180326/screenshot_1484156302491.png) \n#### c.修改名称\n![](/res/upimg/20180326/screenshot_1484156345888.png) \n#### d.复制到 cgi-bin目录\n![](/res/upimg/20180326/screenshot_1484156355448.png)\n#### e.浏览器访问\n![](/res/upimg/20180326/screenshot_1484156365449.png)', '<div class=\"toc\"><ul>\n<li><a href=\"#toc-873\">软件下载</a><ul>\n<li><a href=\"#toc-6c4\">a.软件名称</a></li>\n<li><a href=\"#toc-21c\">b.下载地址</a></li>\n<li><a href=\"#toc-554\">c.软件截图</a></li>\n</ul>\n</li>\n<li><a href=\"#toc-6aa\">软件安装</a><ul>\n<li><a href=\"#toc-ecb\">a.开始安装</a></li>\n<li><a href=\"#toc-6ea\">b.确认</a></li>\n<li><a href=\"#toc-a1d\">c.基本配置</a></li>\n<li><a href=\"#toc-5f0\">d.安装配置</a></li>\n<li><a href=\"#toc-e34\">e.注意</a><ul>\n<li><a href=\"#toc-273\">a.修改文件的位置以及修改的地方</a></li>\n</ul>\n</li>\n<li><a href=\"#toc-3d6\">f.启动服务</a></li>\n<li><a href=\"#toc-722\">g.浏览器测试</a></li>\n</ul>\n</li>\n<li><a href=\"#toc-5e1\">c语言写网页</a><ul>\n<li><a href=\"#toc-ba2\">a.编写代码</a></li>\n<li><a href=\"#toc-cd5\">b.生成exe</a></li>\n<li><a href=\"#toc-ce5\">c.修改名称</a></li>\n<li><a href=\"#toc-fee\">d.复制到 cgi-bin目录</a></li>\n<li><a href=\"#toc-ef8\">e.浏览器访问</a></li>\n</ul>\n</li>\n</ul>\n</div><h2><a id=\"toc-873\" class=\"anchor\" href=\"#toc-873\"></a>软件下载</h2>\n<h4><a id=\"toc-6c4\" class=\"anchor\" href=\"#toc-6c4\"></a>a.软件名称</h4>\n<p>apache http server</p>\n<h4><a id=\"toc-21c\" class=\"anchor\" href=\"#toc-21c\"></a>b.下载地址</h4>\n<p><a href=\"http://www.apache.org/\">官网下载</a> \n<a href=\"http://pan.baidu.com/s/1dFNz2Fn\">百度云下载</a> </p>\n<h4><a id=\"toc-554\" class=\"anchor\" href=\"#toc-554\"></a>c.软件截图</h4>\n<p><img src=\"/res/upimg/20180326/screenshot_1484156168014.png\" alt=\"\"></p>\n<!--more-->\n<h2><a id=\"toc-6aa\" class=\"anchor\" href=\"#toc-6aa\"></a>软件安装</h2>\n<h4><a id=\"toc-ecb\" class=\"anchor\" href=\"#toc-ecb\"></a>a.开始安装</h4>\n<p><img src=\"/res/upimg/20180326/screenshot_1484156146964.png\" alt=\"\"> </p>\n<h4><a id=\"toc-6ea\" class=\"anchor\" href=\"#toc-6ea\"></a>b.确认</h4>\n<p><img src=\"/res/upimg/20180326/screenshot_1484156209188.png\" alt=\"\"></p>\n<h4><a id=\"toc-a1d\" class=\"anchor\" href=\"#toc-a1d\"></a>c.基本配置</h4>\n<p><img src=\"/res/upimg/20180326/screenshot_1484156225898.png\" alt=\"\"></p>\n<h4><a id=\"toc-5f0\" class=\"anchor\" href=\"#toc-5f0\"></a>d.安装配置</h4>\n<p><img src=\"/res/upimg/20180326/screenshot_1484156241536.png\" alt=\"\"></p>\n<hr>\n<h4><a id=\"toc-e34\" class=\"anchor\" href=\"#toc-e34\"></a>e.注意</h4>\n<p>注意:如果80端口被占用请自己修改为其他</p>\n<p><img src=\"/res/upimg/20180326/screenshot_1484156254058.png\" alt=\"\"></p>\n<h5><a id=\"toc-273\" class=\"anchor\" href=\"#toc-273\"></a>a.修改文件的位置以及修改的地方</h5>\n<p><img src=\"/res/upimg/20180326/screenshot_1484156264984.png\" alt=\"\"></p>\n<hr>\n<h4><a id=\"toc-3d6\" class=\"anchor\" href=\"#toc-3d6\"></a>f.启动服务</h4>\n<p><img src=\"/res/upimg/20180326/screenshot_1484156274873.png\" alt=\"\"></p>\n<h4><a id=\"toc-722\" class=\"anchor\" href=\"#toc-722\"></a>g.浏览器测试</h4>\n<p><img src=\"/res/upimg/20180326/screenshot_1484156286961.png\" alt=\"\"></p>\n<h2><a id=\"toc-5e1\" class=\"anchor\" href=\"#toc-5e1\"></a>c语言写网页</h2>\n<h4><a id=\"toc-ba2\" class=\"anchor\" href=\"#toc-ba2\"></a>a.编写代码</h4>\n<p><img src=\"/res/upimg/20180326/screenshot_1484156332324.png\" alt=\"\"> </p>\n<h4><a id=\"toc-cd5\" class=\"anchor\" href=\"#toc-cd5\"></a>b.生成exe</h4>\n<p><img src=\"/res/upimg/20180326/screenshot_1484156302491.png\" alt=\"\"> </p>\n<h4><a id=\"toc-ce5\" class=\"anchor\" href=\"#toc-ce5\"></a>c.修改名称</h4>\n<p><img src=\"/res/upimg/20180326/screenshot_1484156345888.png\" alt=\"\"> </p>\n<h4><a id=\"toc-fee\" class=\"anchor\" href=\"#toc-fee\"></a>d.复制到 cgi-bin目录</h4>\n<p><img src=\"/res/upimg/20180326/screenshot_1484156355448.png\" alt=\"\"></p>\n<h4><a id=\"toc-ef8\" class=\"anchor\" href=\"#toc-ef8\"></a>e.浏览器访问</h4>\n<p><img src=\"/res/upimg/20180326/screenshot_1484156365449.png\" alt=\"\"></p>\n', '1', '2018-03-26 10:35:12', '2018-04-04 15:58:07', '1', '0', '{\"template\":\"\",\"featuredImage\":\"\",\"push_sites\":[]}');
  INSERT INTO `post` VALUES ('44', '1', '3', '0', '3', 'clang &mysql', 'clang-mysql-base', '<p>c语言简单操作mysql</p>\n', 'c语言简单操作mysql\n\n<!--more-->\n#### 代码\n```C\n#define _CRT_SECURE_NO_WARNINGS\n#include <stdio.h>\n#include <stdlib.h>\n#include <winsock.h>\n#include <mysql.h>\nint main() {\n	printf(\"Content-type:text/html\\n\\n\");\n	for (int i = 0; i < 1; i++) {\n		printf(\"hello c (%d) <br/>\\n\", i);\n	}\n	MYSQL *mysql = mysql_init(NULL);\n	if (mysql_real_connect(mysql, \"localhost\", \"root\", \"root\", \"xj2014\", 3306, NULL, 0)) {\n		printf(\"数据库连接成功\\n\");\n		if (mysql_set_character_set(mysql, \"gbk\")) {\n			printf(\"编码设置失败:%s\\n\",mysql_error(mysql));\n			exit(1);\n		}\n		if (mysql_query(mysql, \"select num,name,classs from userinfo limit 10\")) {\n			printf(\"查询出错:%s\\n\", mysql_error(mysql));\n			exit(1);\n		};\n		MYSQL_RES*	res = mysql_store_result(mysql);\n		MYSQL_ROW row;\n		while (row = mysql_fetch_row(res)) {\n			printf(\"\\n学号=%s\\t姓名=%s\\t班级=%s\", row[0], row[1],row[2]);\n		}\n		mysql_free_result(res);\n		mysql_close(mysql);\n	} else {\n		printf(\"数据库连接失败\\n\");\n		exit(1);\n	}\n	Sleep(500);\n	return 0;\n}\n```\n#### 图片\n![](/res/upimg/20180326/screenshot_1484203727299.png)\n', '<div class=\"toc\"><ul>\n<li><a href=\"#toc-06e\">代码</a></li>\n<li><a href=\"#toc-20d\">图片</a></li>\n</ul>\n</div><p>c语言简单操作mysql</p>\n<!--more-->\n<h4><a id=\"toc-06e\" class=\"anchor\" href=\"#toc-06e\"></a>代码</h4>\n<pre><code class=\"hljs lang-C\"><span class=\"hljs-meta\">#<span class=\"hljs-meta-keyword\">define</span> _CRT_SECURE_NO_WARNINGS</span>\n<span class=\"hljs-meta\">#<span class=\"hljs-meta-keyword\">include</span> <span class=\"hljs-meta-string\">&lt;stdio.h&gt;</span></span>\n<span class=\"hljs-meta\">#<span class=\"hljs-meta-keyword\">include</span> <span class=\"hljs-meta-string\">&lt;stdlib.h&gt;</span></span>\n<span class=\"hljs-meta\">#<span class=\"hljs-meta-keyword\">include</span> <span class=\"hljs-meta-string\">&lt;winsock.h&gt;</span></span>\n<span class=\"hljs-meta\">#<span class=\"hljs-meta-keyword\">include</span> <span class=\"hljs-meta-string\">&lt;mysql.h&gt;</span></span>\n<span class=\"hljs-function\"><span class=\"hljs-keyword\">int</span> <span class=\"hljs-title\">main</span><span class=\"hljs-params\">()</span> </span>{\n    <span class=\"hljs-built_in\">printf</span>(<span class=\"hljs-string\">\"Content-type:text/html\\n\\n\"</span>);\n    <span class=\"hljs-keyword\">for</span> (<span class=\"hljs-keyword\">int</span> i = <span class=\"hljs-number\">0</span>; i &lt; <span class=\"hljs-number\">1</span>; i++) {\n        <span class=\"hljs-built_in\">printf</span>(<span class=\"hljs-string\">\"hello c (%d) &lt;br/&gt;\\n\"</span>, i);\n    }\n    MYSQL *mysql = mysql_init(<span class=\"hljs-literal\">NULL</span>);\n    <span class=\"hljs-keyword\">if</span> (mysql_real_connect(mysql, <span class=\"hljs-string\">\"localhost\"</span>, <span class=\"hljs-string\">\"root\"</span>, <span class=\"hljs-string\">\"root\"</span>, <span class=\"hljs-string\">\"xj2014\"</span>, <span class=\"hljs-number\">3306</span>, <span class=\"hljs-literal\">NULL</span>, <span class=\"hljs-number\">0</span>)) {\n        <span class=\"hljs-built_in\">printf</span>(<span class=\"hljs-string\">\"数据库连接成功\\n\"</span>);\n        <span class=\"hljs-keyword\">if</span> (mysql_set_character_set(mysql, <span class=\"hljs-string\">\"gbk\"</span>)) {\n            <span class=\"hljs-built_in\">printf</span>(<span class=\"hljs-string\">\"编码设置失败:%s\\n\"</span>,mysql_error(mysql));\n            <span class=\"hljs-built_in\">exit</span>(<span class=\"hljs-number\">1</span>);\n        }\n        <span class=\"hljs-keyword\">if</span> (mysql_query(mysql, <span class=\"hljs-string\">\"select num,name,classs from userinfo limit 10\"</span>)) {\n            <span class=\"hljs-built_in\">printf</span>(<span class=\"hljs-string\">\"查询出错:%s\\n\"</span>, mysql_error(mysql));\n            <span class=\"hljs-built_in\">exit</span>(<span class=\"hljs-number\">1</span>);\n        };\n        MYSQL_RES*    res = mysql_store_result(mysql);\n        MYSQL_ROW row;\n        <span class=\"hljs-keyword\">while</span> (row = mysql_fetch_row(res)) {\n            <span class=\"hljs-built_in\">printf</span>(<span class=\"hljs-string\">\"\\n学号=%s\\t姓名=%s\\t班级=%s\"</span>, row[<span class=\"hljs-number\">0</span>], row[<span class=\"hljs-number\">1</span>],row[<span class=\"hljs-number\">2</span>]);\n        }\n        mysql_free_result(res);\n        mysql_close(mysql);\n    } <span class=\"hljs-keyword\">else</span> {\n        <span class=\"hljs-built_in\">printf</span>(<span class=\"hljs-string\">\"数据库连接失败\\n\"</span>);\n        <span class=\"hljs-built_in\">exit</span>(<span class=\"hljs-number\">1</span>);\n    }\n    Sleep(<span class=\"hljs-number\">500</span>);\n    <span class=\"hljs-keyword\">return</span> <span class=\"hljs-number\">0</span>;\n}\n</code></pre>\n<h4><a id=\"toc-20d\" class=\"anchor\" href=\"#toc-20d\"></a>图片</h4>\n<p><img src=\"/res/upimg/20180326/screenshot_1484203727299.png\" alt=\"\"></p>\n', '1', '2018-03-26 10:37:58', '2018-07-13 11:35:36', '1', '0', '{\"template\":\"\",\"featuredImage\":\"\",\"push_sites\":[]}');
  
  -- ----------------------------
  -- Table structure for post_tag
  -- ----------------------------
  DROP TABLE IF EXISTS `post_tag`;
  CREATE TABLE `post_tag` (
    `id` int(11) unsigned NOT NULL AUTO_INCREMENT,
    `post_id` int(11) NOT NULL,
    `tag_id` int(11) NOT NULL,
    PRIMARY KEY (`id`),
    UNIQUE KEY `post_tag` (`post_id`,`tag_id`)
  ) ENGINE=InnoDB AUTO_INCREMENT=428 DEFAULT CHARSET=utf8mb4;
  
  -- ----------------------------
  -- Records of post_tag
  -- ----------------------------
  INSERT INTO `post_tag` VALUES ('52', '10', '6');
  INSERT INTO `post_tag` VALUES ('253', '13', '11');
  INSERT INTO `post_tag` VALUES ('50', '14', '6');
  INSERT INTO `post_tag` VALUES ('44', '19', '2');
  INSERT INTO `post_tag` VALUES ('45', '19', '4');
  INSERT INTO `post_tag` VALUES ('46', '19', '6');
  INSERT INTO `post_tag` VALUES ('48', '19', '9');
  INSERT INTO `post_tag` VALUES ('54', '22', '2');
  INSERT INTO `post_tag` VALUES ('427', '30', '3');
  INSERT INTO `post_tag` VALUES ('70', '32', '3');
  INSERT INTO `post_tag` VALUES ('78', '35', '4');
  INSERT INTO `post_tag` VALUES ('115', '36', '11');
  INSERT INTO `post_tag` VALUES ('424', '37', '12');
  INSERT INTO `post_tag` VALUES ('425', '37', '13');
  INSERT INTO `post_tag` VALUES ('147', '38', '14');
  INSERT INTO `post_tag` VALUES ('157', '39', '2');
  INSERT INTO `post_tag` VALUES ('158', '39', '15');
  INSERT INTO `post_tag` VALUES ('155', '40', '16');
  INSERT INTO `post_tag` VALUES ('202', '41', '17');
  INSERT INTO `post_tag` VALUES ('186', '43', '3');
  INSERT INTO `post_tag` VALUES ('259', '44', '3');
  INSERT INTO `post_tag` VALUES ('260', '44', '4');
  INSERT INTO `post_tag` VALUES ('197', '45', '3');
  INSERT INTO `post_tag` VALUES ('198', '45', '18');
  INSERT INTO `post_tag` VALUES ('369', '47', '2');
  INSERT INTO `post_tag` VALUES ('370', '47', '4');
  INSERT INTO `post_tag` VALUES ('372', '51', '4');
  INSERT INTO `post_tag` VALUES ('373', '52', '2');
  INSERT INTO `post_tag` VALUES ('374', '52', '4');
  INSERT INTO `post_tag` VALUES ('375', '53', '2');
  INSERT INTO `post_tag` VALUES ('377', '57', '2');
  INSERT INTO `post_tag` VALUES ('378', '59', '2');
  INSERT INTO `post_tag` VALUES ('379', '60', '2');
  INSERT INTO `post_tag` VALUES ('376', '61', '2');
  INSERT INTO `post_tag` VALUES ('401', '66', '19');
  INSERT INTO `post_tag` VALUES ('412', '67', '12');
  INSERT INTO `post_tag` VALUES ('413', '67', '20');
  
  -- ----------------------------
  -- Table structure for tag
  -- ----------------------------
  DROP TABLE IF EXISTS `tag`;
  CREATE TABLE `tag` (
    `id` int(11) unsigned NOT NULL AUTO_INCREMENT,
    `name` varchar(64) DEFAULT '',
    `intro` varchar(64) DEFAULT '',
    PRIMARY KEY (`id`),
    UNIQUE KEY `name` (`name`)
  ) ENGINE=InnoDB AUTO_INCREMENT=21 DEFAULT CHARSET=utf8mb4;
  
  -- ----------------------------
  -- Records of tag
  -- ----------------------------
  INSERT INTO `tag` VALUES ('1', 'web', 'web');
  INSERT INTO `tag` VALUES ('2', 'go', 'go');
  INSERT INTO `tag` VALUES ('3', 'c', 'c');
  INSERT INTO `tag` VALUES ('4', 'mysql', 'mysql');
  INSERT INTO `tag` VALUES ('6', 'teach', 'teach');
  INSERT INTO `tag` VALUES ('7', 'learn', 'learn');
  INSERT INTO `tag` VALUES ('9', 'beego', 'beego');
  INSERT INTO `tag` VALUES ('10', 'node', 'node');
  INSERT INTO `tag` VALUES ('11', 'nginx', 'nginx');
  INSERT INTO `tag` VALUES ('12', 'python', 'python');
  INSERT INTO `tag` VALUES ('13', 'numpy', 'numpy');
  INSERT INTO `tag` VALUES ('14', 'javascript', 'javascript');
  INSERT INTO `tag` VALUES ('15', 'ga', 'ga');
  INSERT INTO `tag` VALUES ('16', 'java', 'java');
  INSERT INTO `tag` VALUES ('17', 'ml', 'machinelearning');
  INSERT INTO `tag` VALUES ('18', 'ds', 'ds');
  INSERT INTO `tag` VALUES ('19', 'matplotlib', 'matplotlib');
  INSERT INTO `tag` VALUES ('20', 'opencv', 'opencv');
  
  -- ----------------------------
  -- Table structure for user
  -- ----------------------------
  DROP TABLE IF EXISTS `user`;
  CREATE TABLE `user` (
    `id` int(11) unsigned NOT NULL AUTO_INCREMENT,
    `num` varchar(32) NOT NULL DEFAULT '',
    `name` varchar(32) DEFAULT '',
    `pass` varchar(32) NOT NULL DEFAULT '',
    `role` int(11) NOT NULL DEFAULT 1 COMMENT '是否为管理',
    `email` varchar(255) NOT NULL DEFAULT '',
    `login_time` datetime NOT NULL,
    `login_ip` varchar(32) NOT NULL DEFAULT '',
    `app_key` varchar(255) DEFAULT '',
    `app_secret` varchar(255) DEFAULT '',
    `create_time` datetime NOT NULL,
    PRIMARY KEY (`id`),
    UNIQUE KEY `email` (`email`),
    UNIQUE KEY `num` (`num`) USING BTREE
  ) ENGINE=InnoDB AUTO_INCREMENT=2 DEFAULT CHARSET=utf8mb4;
  
  -- ----------------------------
  -- Records of user
  -- ----------------------------
  INSERT INTO `user` VALUES ('1', 'zxysilent', 'zxysilent', '3b861abeaa25fba9d03898324463f7', '1074791424', '', '2019-01-08 11:32:37', '127.0.0.1', '_z5AkbQb52W61qrFmYVVMeXJAADHaU7E', 'Ll6D2ug2_sMsewzYgGsTg0UGk1cFAHdQ', '2017-04-05 23:28:35');
  