Browse Source

Restore deleted repositories

mayx 4 years ago
commit
f4aa957c53
100 changed files with 8639 additions and 0 deletions
  1. 6 0
      404.md
  2. 4 0
      BingSiteAuth.xml
  3. 139 0
      BlogCard.svg
  4. 37 0
      README.md
  5. 13 0
      _config.yml
  6. 95 0
      _includes/toc.html
  7. 154 0
      _layouts/default.html
  8. 55 0
      _layouts/encrypt.html
  9. 90 0
      _layouts/post.html
  10. 13 0
      _posts/2015-02-23-diary.md
  11. 213 0
      _posts/2018-03-26-neko.md
  12. 44 0
      _posts/2018-06-20-Coding.md
  13. 38 0
      _posts/2018-10-20-talk.md
  14. 56 0
      _posts/2018-10-28-mos-reporter.md
  15. 95 0
      _posts/2018-11-04-mayx-think.md
  16. 135 0
      _posts/2018-11-10-email-sender.md
  17. 28 0
      _posts/2018-12-02-freenet.md
  18. 66 0
      _posts/2018-12-22-story.md
  19. 20 0
      _posts/2018-12-28-newdomain.md
  20. 17 0
      _posts/2019-01-11-github.md
  21. 26 0
      _posts/2019-01-27-shell.md
  22. 3259 0
      _posts/2019-02-01-history.md
  23. 39 0
      _posts/2019-02-07-paradise.md
  24. 38 0
      _posts/2019-02-17-break.md
  25. 19 0
      _posts/2019-03-22-bgm.md
  26. 16 0
      _posts/2019-03-23-gitio.md
  27. 51 0
      _posts/2019-04-05-cholang.md
  28. 51 0
      _posts/2019-04-05-crash.md
  29. 85 0
      _posts/2019-04-13-iwara.md
  30. 61 0
      _posts/2019-04-24-shell.md
  31. 60 0
      _posts/2019-04-27-antiban.md
  32. 19 0
      _posts/2019-05-03-origip.md
  33. 21 0
      _posts/2019-05-12-baidu.md
  34. 37 0
      _posts/2019-05-27-wikipic.md
  35. 19 0
      _posts/2019-05-30-exam.md
  36. 227 0
      _posts/2019-06-10-cheat.md
  37. 8 0
      _posts/2019-06-11-encrypt.md
  38. 130 0
      _posts/2019-06-22-counter.md
  39. 100 0
      _posts/2019-06-24-up.md
  40. 39 0
      _posts/2019-07-01-mabbs.md
  41. 37 0
      _posts/2019-07-02-encmail.md
  42. 23 0
      _posts/2019-07-15-encmail.md
  43. 16 0
      _posts/2019-07-25-college.md
  44. 20 0
      _posts/2019-08-05-blilblil.md
  45. 21 0
      _posts/2019-08-17-memory.md
  46. 18 0
      _posts/2019-08-24-sth.md
  47. 31 0
      _posts/2019-09-20-start.md
  48. 83 0
      _posts/2019-09-28-python.md
  49. 99 0
      _posts/2019-10-21-python.md
  50. 37 0
      _posts/2019-11-01-python.md
  51. 16 0
      _posts/2019-11-18-archive.md
  52. 67 0
      _posts/2019-11-21-enc.md
  53. 28 0
      _posts/2019-12-04-abuse.md
  54. 62 0
      _posts/2019-12-16-ctf.md
  55. 28 0
      _posts/2019-12-17-game.md
  56. 46 0
      _posts/2019-12-31-summary.md
  57. 44 0
      _posts/2020-01-05-devops.md
  58. 30 0
      _posts/2020-01-21-devops.md
  59. 43 0
      _posts/2020-02-02-old.md
  60. 54 0
      _posts/2020-02-10-tieba.md
  61. 38 0
      _posts/2020-02-15-phone.md
  62. 31 0
      _posts/2020-02-18-browser.md
  63. 118 0
      _posts/2020-03-01-plan.md
  64. 29 0
      _posts/2020-03-08-oldphone.md
  65. 50 0
      _posts/2020-03-12-novel.md
  66. 7 0
      _posts/2020-04-06-self.md
  67. 125 0
      _posts/2020-04-19-exam.md
  68. 23 0
      _posts/2020-04-21-laptop.md
  69. 28 0
      _posts/2020-05-07-consume.md
  70. 25 0
      _posts/2020-05-20-memory.md
  71. 160 0
      _posts/2020-05-29-encrypt.md
  72. 31 0
      _posts/2020-06-06-demoscene.md
  73. 260 0
      _posts/2020-06-13-encrypt.md
  74. 120 0
      _posts/2020-06-17-backup.md
  75. 31 0
      _posts/2020-07-29-card.md
  76. 23 0
      _posts/2020-08-21-sth2.md
  77. 30 0
      _posts/2020-08-28-banned.md
  78. 34 0
      _posts/2020-09-10-site.md
  79. 34 0
      _posts/2020-09-27-vm.md
  80. 7 0
      _posts/2020-10-24-try.md
  81. 23 0
      _posts/2020-11-24-createctf.md
  82. 36 0
      _posts/2020-12-07-picore.md
  83. 36 0
      _posts/2020-12-13-nat.md
  84. 28 0
      _posts/2021-01-04-summary.md
  85. 45 0
      _posts/2021-01-06-proxy.md
  86. 27 0
      _posts/2021-01-17-picore.md
  87. 49 0
      _posts/2021-02-02-serverchan.md
  88. 105 0
      _posts/2021-02-06-wechatbot.md
  89. 7 0
      _posts/2021-02-09-try2.md
  90. 143 0
      _posts/2021-02-19-picbot.md
  91. 118 0
      _posts/2021-02-23-picbotpro.md
  92. 53 0
      _posts/2021-02-26-serverchancorp.md
  93. 35 0
      _posts/2021-02-28-discuz.md
  94. 38 0
      _posts/2021-03-02-workers.md
  95. 65 0
      _posts/2021-03-23-wxpush.md
  96. 7 0
      _posts/2021-04-05-try3.md
  97. 94 0
      _posts/2021-04-09-weauth.md
  98. 37 0
      _posts/2021-04-18-hide.md
  99. 63 0
      _posts/2021-05-07-ssh.md
  100. 0 0
      _posts/2021-05-15-vulnerability.md

+ 6 - 0
404.md

@@ -0,0 +1,6 @@
+---
+layout: default
+title: 404 - 找不到页面
+---
+# 找不到页面
+  你访问的资源 <code><script>document.write(window.location.pathname)</script></code> 不存在或者可能已经被永久移除。

+ 4 - 0
BingSiteAuth.xml

@@ -0,0 +1,4 @@
+<?xml version="1.0"?>
+<users>
+	<user>0ADFCE64B3557DC4DC5F2DC224C5FDDD</user>
+</users>

+ 139 - 0
BlogCard.svg

@@ -0,0 +1,139 @@
+---
+---
+
+      <svg
+        width="495"
+        height="195"
+        viewBox="0 0 495 195"
+        fill="none"
+        xmlns="http://www.w3.org/2000/svg"
+      >
+        <style>
+          .header {
+            font: 600 18px 'Segoe UI', Ubuntu, Sans-Serif;
+            fill: #fff;
+            animation: fadeInAnimation 0.8s ease-in-out forwards;
+          }
+          
+    .stat {
+      font: 600 14px 'Segoe UI', Ubuntu, "Helvetica Neue", Sans-Serif; fill: #9f9f9f;
+    }
+    .stagger {
+      opacity: 0;
+      animation: fadeInAnimation 0.3s ease-in-out forwards;
+    }
+    .rank-text {
+      font: 800 100px 'Segoe UI', Ubuntu, Sans-Serif; fill: #66ccff; 
+      animation: scaleInAnimation 0.3s ease-in-out forwards;
+    }
+    
+    .bold { font-weight: 700 }
+    .icon {
+      fill: #79ff97;
+      display: block;
+    }
+          
+    /* Animations */
+    @keyframes scaleInAnimation {
+      from {
+        transform: translate(-5px, 5px) scale(0);
+      }
+      to {
+        transform: translate(-5px, 5px) scale(1);
+      }
+    }
+    @keyframes fadeInAnimation {
+      from {
+        opacity: 0;
+      }
+      to {
+        opacity: 1;
+      }
+    }
+  
+          
+        </style>
+
+        <rect
+          data-testid="card-bg"
+          x="0.5"
+          y="0.5"
+          rx="4.5"
+          height="99%"
+          stroke="#e4e2e2"
+          width="494"
+          fill="#151515"
+          stroke-opacity="1"
+        />
+
+        
+      <g
+        data-testid="card-title"
+        transform="translate(25, 35)"
+      >
+        <g transform="translate(0, 0)">
+      <text
+        x="0"
+        y="0"
+        class="header"
+        data-testid="header"
+      >Mayx's Blog Article</text>
+    </g>
+      </g>
+
+        <g
+          data-testid="main-card-body"
+          transform="translate(0, 55)"
+        >
+          
+    <g transform="translate(370, 47.5)">
+        <g class="rank-text">
+          <text
+            x="0"
+            y="0"
+            alignment-baseline="central"
+            dominant-baseline="central"
+            text-anchor="middle"
+          >
+            M
+          </text>
+        </g>
+      </g>
+
+    <svg x="0" y="0">
+      <g transform="translate(0, 0)">
+    <g class="stagger" style="animation-delay: 450ms" transform="translate(25, 0)">
+      <line x1="12" y1="6.25" x2="19" y2="6.25"
+style="stroke:rgb(255,255,255);stroke-width:2"/>
+      <text class="stat bold" x="25" y="12.5">{{ site.posts[0].title }}</text>
+    </g>
+  </g><g transform="translate(0, 25)">
+    <g class="stagger" style="animation-delay: 600ms" transform="translate(25, 0)">
+      <line x1="12" y1="6.25" x2="19" y2="6.25"
+style="stroke:rgb(255,255,255);stroke-width:2"/>
+      <text class="stat bold" x="25" y="12.5">{{ site.posts[1].title }}</text>
+    </g>
+  </g><g transform="translate(0, 50)">
+    <g class="stagger" style="animation-delay: 750ms" transform="translate(25, 0)">
+      <line x1="12" y1="6.25" x2="19" y2="6.25"
+style="stroke:rgb(255,255,255);stroke-width:2"/>
+      <text class="stat bold" x="25" y="12.5">{{ site.posts[2].title }}</text>
+    </g>
+  </g><g transform="translate(0, 75)">
+    <g class="stagger" style="animation-delay: 900ms" transform="translate(25, 0)">
+      <line x1="12" y1="6.25" x2="19" y2="6.25"
+style="stroke:rgb(255,255,255);stroke-width:2"/>
+      <text class="stat bold" x="25" y="12.5">{{ site.posts[3].title }}</text>
+    </g>
+  </g><g transform="translate(0, 100)">
+    <g class="stagger" style="animation-delay: 1050ms" transform="translate(25, 0)">
+      <line x1="12" y1="6.25" x2="19" y2="6.25"
+style="stroke:rgb(255,255,255);stroke-width:2"/>
+      <text class="stat bold" x="25" y="12.5">{{ site.posts[4].title }}</text>
+    </g>
+  </g>
+    </svg> 
+  
+        </g>
+      </svg>
+    

+ 37 - 0
README.md

@@ -0,0 +1,37 @@
+---
+layout: default
+---
+
+# Mayx的博客
+Mayx's Home Page   
+Powered by [Jekyll](https://github.com/jekyll/jekyll)
+
+## 使用的开源项目
+[Jekyll](https://github.com/jekyll/jekyll)   
+[jQuery](https://github.com/jquery/jquery)   
+[gitalk](https://github.com/gitalk/gitalk)   
+[minimal](https://github.com/pages-themes/minimal)   
+[jekyll-toc](https://github.com/allejo/jekyll-toc)   
+[Live2dHistoire](https://github.com/eeg1412/Live2dHistoire)   
+[Simple-Jekyll-Search](https://github.com/christian-fei/Simple-Jekyll-Search)   
+
+## 使用的网络资源
+[Github](https://github.com/) | 包含:
+- Issue
+- Pages
+- Git
+- [Git.io](https://git.io/)
+ 
+[网易云音乐](https://music.163.com/)   
+[一言](https://hitokoto.cn/)   
+[jsDelivr](https://www.jsdelivr.com/)   
+[CDNJS](https://cdnjs.com/)   
+[unpkg](https://unpkg.com/)   
+
+## 版权声明
+未经作者同意,请勿转载   
+若需转载,请联系作者(主要希望找人聊天~)   
+本站转载的文章如无特别说明,均按原文章的协议执行
+
+## 打赏/赞助 Mayx 
+![QRCode](/images/QRCode.png)   

+ 13 - 0
_config.yml

@@ -0,0 +1,13 @@
+theme: jekyll-theme-minimal
+title: Mayx的博客
+logo: https://avatars0.githubusercontent.com/u/17966333
+author: mayx
+timezone: Asia/Shanghai
+excerpt_separator: <!--more-->
+paginate: 7
+plugins:
+  - jekyll-sitemap
+  - jekyll-feed
+feed:
+  path: atom.xml
+google_analytics: UA-137710294-1

+ 95 - 0
_includes/toc.html

@@ -0,0 +1,95 @@
+{% capture tocWorkspace %}
+    {% comment %}
+        Version 1.0.7
+          https://github.com/allejo/jekyll-toc
+
+        "...like all things liquid - where there's a will, and ~36 hours to spare, there's usually a/some way" ~jaybe
+
+        Usage:
+            {% include toc.html html=content sanitize=true class="inline_toc" id="my_toc" h_min=2 h_max=3 %}
+
+        Parameters:
+            * html         (string) - the HTML of compiled markdown generated by kramdown in Jekyll
+
+        Optional Parameters:
+            * sanitize     (bool)   : false  - when set to true, the headers will be stripped of any HTML in the TOC
+            * class        (string) :   ''   - a CSS class assigned to the TOC
+            * id           (string) :   ''   - an ID to assigned to the TOC
+            * h_min        (int)    :   1    - the minimum TOC header level to use; any header lower than this value will be ignored
+            * h_max        (int)    :   6    - the maximum TOC header level to use; any header greater than this value will be ignored
+            * ordered      (bool)   : false  - when set to true, an ordered list will be outputted instead of an unordered list
+            * item_class   (string) :   ''   - add custom class(es) for each list item; has support for '%level%' placeholder, which is the current heading level
+            * baseurl      (string) :   ''   - add a base url to the TOC links for when your TOC is on another page than the actual content
+            * anchor_class (string) :   ''   - add custom class(es) for each anchor element
+
+        Output:
+            An ordered or unordered list representing the table of contents of a markdown block. This snippet will only
+            generate the table of contents and will NOT output the markdown given to it
+    {% endcomment %}
+
+    {% capture my_toc %}{% endcapture %}
+    {% assign orderedList = include.ordered | default: false %}
+    {% assign minHeader = include.h_min | default: 1 %}
+    {% assign maxHeader = include.h_max | default: 6 %}
+    {% assign nodes = include.html | split: '<h' %}
+    {% assign firstHeader = true %}
+
+    {% capture listModifier %}{% if orderedList %}1.{% else %}-{% endif %}{% endcapture %}
+
+    {% for node in nodes %}
+        {% if node == "" %}
+            {% continue %}
+        {% endif %}
+
+        {% assign headerLevel = node | replace: '"', '' | slice: 0, 1 | times: 1 %}
+
+        {% if headerLevel < minHeader or headerLevel > maxHeader %}
+            {% continue %}
+        {% endif %}
+
+        {% if firstHeader %}
+            {% assign firstHeader = false %}
+            {% assign minHeader = headerLevel %}
+        {% endif %}
+
+        {% assign indentAmount = headerLevel | minus: minHeader | add: 1 %}
+        {% assign _workspace = node | split: '</h' %}
+
+        {% assign _idWorkspace = _workspace[0] | split: 'id="' %}
+        {% assign _idWorkspace = _idWorkspace[1] | split: '"' %}
+        {% assign html_id = _idWorkspace[0] %}
+
+        {% assign _classWorkspace = _workspace[0] | split: 'class="' %}
+        {% assign _classWorkspace = _classWorkspace[1] | split: '"' %}
+        {% assign html_class = _classWorkspace[0] %}
+
+        {% if html_class contains "no_toc" %}
+            {% continue %}
+        {% endif %}
+
+        {% capture _hAttrToStrip %}{{ _workspace[0] | split: '>' | first }}>{% endcapture %}
+        {% assign header = _workspace[0] | replace: _hAttrToStrip, '' %}
+
+        {% assign space = '' %}
+        {% for i in (1..indentAmount) %}
+            {% assign space = space | prepend: '    ' %}
+        {% endfor %}
+
+        {% unless include.item_class == blank %}
+            {% capture listItemClass %}{:.{{ include.item_class | replace: '%level%', headerLevel }}}{% endcapture %}
+        {% endunless %}
+
+        {% capture my_toc %}{{ my_toc }}
+{{ space }}{{ listModifier }} {{ listItemClass }} [{% if include.sanitize %}{{ header | strip_html }}{% else %}{{ header }}{% endif %}]({% if include.baseurl %}{{ include.baseurl }}{% endif %}#{{ html_id }}){% if include.anchor_class %}{:.{{ include.anchor_class }}}{% endif %}{% endcapture %}
+    {% endfor %}
+
+    {% if include.class %}
+        {% capture my_toc %}{:.{{ include.class }}}
+{{ my_toc | lstrip }}{% endcapture %}
+    {% endif %}
+
+    {% if include.id %}
+        {% capture my_toc %}{: #{{ include.id }}}
+{{ my_toc | lstrip }}{% endcapture %}
+    {% endif %}
+{% endcapture %}{% assign tocWorkspace = '' %}{{ my_toc | markdownify | strip }}

+ 154 - 0
_layouts/default.html

@@ -0,0 +1,154 @@
+<!DOCTYPE html>
+<html>
+  <head>
+    <meta charset="UTF-8">
+    <meta http-equiv="X-UA-Compatible" content="IE=edge">
+    <meta name="viewport" content="width=device-width, initial-scale=1">
+
+{% seo %}
+{% feed_meta %}
+    <link rel="stylesheet" href="{{ "/assets/css/style.css?v=" | append: site.github.build_revision | relative_url }}">
+    <!--[if !IE]> -->
+    <link rel="stylesheet" href="/Live2dHistoire/live2d/css/live2d.css" />
+    <!-- <![endif]-->
+    <script src="//cdn.jsdelivr.net/npm/jquery@1.9.1/jquery.min.js"></script>
+    <!--[if lt IE 9]>
+    <script src="//cdnjs.cloudflare.com/ajax/libs/html5shiv/3.7.3/html5shiv.min.js"></script>
+    <![endif]-->
+    
+{% if site.google_analytics %}    
+<!-- Global site tag (gtag.js) - Google Analytics -->
+<script async src="https://www.googletagmanager.com/gtag/js?id={{ site.google_analytics }}"></script>
+<script>
+  window.dataLayer = window.dataLayer || [];
+  function gtag(){dataLayer.push(arguments);}
+  gtag('js', new Date());
+
+  gtag('config', '{{ site.google_analytics }}');
+  var lastUpdated = new Date("{{ site.time | date: "%FT%T%z" }}");
+  Date.prototype.format = function(fmt) { 
+     var o = { 
+        "M+" : this.getMonth()+1,                 //月份 
+        "d+" : this.getDate(),                    //日 
+        "h+" : this.getHours(),                   //小时 
+        "m+" : this.getMinutes(),                 //分 
+        "s+" : this.getSeconds(),                 //秒 
+        "q+" : Math.floor((this.getMonth()+3)/3), //季度 
+        "S"  : this.getMilliseconds()             //毫秒 
+    }; 
+    if(/(y+)/.test(fmt)) {
+            fmt=fmt.replace(RegExp.$1, (this.getFullYear()+"").substr(4 - RegExp.$1.length)); 
+    }
+     for(var k in o) {
+        if(new RegExp("("+ k +")").test(fmt)){
+             fmt = fmt.replace(RegExp.$1, (RegExp.$1.length==1) ? (o[k]) : (("00"+ o[k]).substr((""+ o[k]).length)));
+         }
+     }
+    return fmt; 
+  }
+</script>
+{% endif %}
+<style>
+.backToTop {
+ display: none;
+ width: 18px;
+ line-height: 1.2;
+ padding: 5px 0;
+ background-color: #000;
+ color: #fff;
+ font-size: 12px;
+ text-align: center;
+ position: fixed;
+ _position: absolute;
+ right: 10px;
+ bottom: 100px;
+ _bottom: "auto";
+ cursor: pointer;
+ opacity: .6;
+ filter: Alpha(opacity=60);
+}
+</style>
+  </head>
+  <body>
+    <div class="wrapper">
+      <header>
+        <h1><a href="{{ "/" | relative_url }}">{{ site.title | default: site.github.repository_name }}</a></h1>
+        
+        {% if site.logo %}
+          <img src="{{ site.logo | relative_url}}" alt="Logo" />
+        {% endif %}
+
+        <p>{{ site.description | default: site.github.project_tagline }}</p>
+        
+        <p><form action="/search.html"><input type="text" name="keyword" id="search-input-all" placeholder="Search blog posts.."> <input type="submit"></form></p>
+
+        {% if site.github.is_project_page %}
+        <p class="view"><a href="{{ site.github.repository_url }}">View the Project on GitHub <small>{{ site.github.repository_nwo }}</small></a></p>
+        {% endif %}
+
+        {% if site.github.is_user_page %}
+        <p class="view"><a href="{{ site.github.owner_url }}">View My GitHub Profile</a></p>
+        {% endif %}
+        
+        <a href="{{ "/Mabbs/" | relative_url }}">About Me</a>
+      </header>
+      <section>
+
+      {{ content }}
+
+      </section>
+<!--[if !IE]> -->
+<div id="landlord" style="left:5px;bottom:0px;">
+    <div class="message" style="opacity:0"></div>
+    <canvas id="live2d" width="500" height="560" class="live2d"></canvas>
+    <div class="live_talk_input_body">
+    	<div class="live_talk_input_name_body" style="display:none;">
+        	<input name="name" type="hidden" class="live_talk_name white_input" id="AIuserName" value="Mayx_Blog_Talk" />
+        </div>
+        <div class="live_talk_input_text_body">
+        	<input name="talk" type="text" class="live_talk_talk white_input" id="AIuserText" autocomplete="off" placeholder="要和我聊什么呀?"/>
+            <button type="button" class="live_talk_send_btn" id="talk_send">发送</button>
+        </div>
+    </div>
+    <input name="live_talk" id="live_talk" value="1" type="hidden" />
+    <div class="live_ico_box" style="display:none;">
+    	<div class="live_ico_item type_info" id="showInfoBtn"></div>
+    	<div class="live_ico_item type_talk" id="showTalkBtn"></div>
+        <div class="live_ico_item type_music" id="musicButton"></div>
+        <div class="live_ico_item type_youdu" id="youduButton"></div>
+        <div class="live_ico_item type_quit" id="hideButton"></div>
+        <input name="live_statu_val" id="live_statu_val" value="0" type="hidden" />
+        <audio src="" style="display:none;" id="live2d_bgm" data-bgm="0" preload="none"></audio>
+        <input id="duType" value="douqilai" type="hidden">
+    </div>
+</div>
+<div id="open_live2d">召唤伊斯特瓦尔</div>
+    <!-- <![endif]-->
+      <footer>
+        {% if site.github.is_project_page %}
+        <p>This project is maintained by <a href="{{ site.github.owner_url }}">{{ site.github.owner_name }}</a></p>
+        {% endif %}
+        <p><small>Made with ❤ by Mayx<br />Last updated at <script>document.write(lastUpdated.format("yyyy-MM-dd hh:mm:ss"));</script><br /> 总字数:{% assign count = 0 %}
+{% for post in site.posts %}
+    {% assign single_count = post.content | strip_html | strip_newlines | remove: " " | size %}
+    {% assign count = count | plus: single_count %}
+{% endfor %}
+{% if count > 10000 %}
+    {{ count | divided_by: 10000 }} 万 {{ count | modulo: 10000 }}
+{% else %}
+    {{ count }}
+          {% endif %} - 文章数:{% for post in site.posts %}
+              {% assign co = co | plus: 1 %}
+          {% endfor %}{{ co }} - <a href="{{ "/atom.xml" | relative_url }}" >Atom</a> - <a href="{{ "/README.html" | relative_url }}" >About</a></small></p>
+      </footer>
+    </div>
+    <script src="{{ "/assets/js/scale.fix.js" | relative_url }}"></script>
+
+<script src="/js/main.js"></script>
+<!--[if !IE]> -->
+<script src="/Live2dHistoire/live2d/js/live2d.js"></script>
+<script src="/Live2dHistoire/live2d/js/message.js"></script>
+
+<!-- <![endif]-->
+  </body>
+</html>

+ 55 - 0
_layouts/encrypt.html

@@ -0,0 +1,55 @@
+---
+layout: post
+---
+
+<script src="/js/aes.js"></script>
+<script>
+function getByteLen(val) {
+    var len = 0;
+    for (var i = 0; i < val.length; i++) {
+        if (val[i].match(/[^\x00-\xff]/ig) != null) len += 3;
+        else len += 1;
+    }
+    return len;
+}
+
+function onbtnDecrypto() {
+    var encryptedData = "{{ content  | strip_html | strip_newlines }}";
+    var keyword = document.getElementById("inputkey").value;
+
+    if (keyword.replace(/(^\s*)|(\s*$)/g, "") == '') {
+        alert("请输入密码!");
+        return;
+    }
+    while (getByteLen(keyword) % 8 != 0) {
+        keyword = keyword + "\0";
+    }
+
+    var key = CryptoJS.enc.Utf8.parse(keyword);
+    var encryptedHexStr = CryptoJS.enc.Hex.parse(encryptedData);
+    var encryptedBase64Str = CryptoJS.enc.Base64.stringify(encryptedHexStr);
+
+    var decryptedData = CryptoJS.AES.decrypt(encryptedBase64Str, key, {
+        mode: CryptoJS.mode.ECB,
+        padding: CryptoJS.pad.Pkcs7
+    });
+
+    if (decryptedData.sigBytes < 0) {
+        document.getElementById("output").innerHTML = "解密失败!密文或者key错误!";
+        return;
+    }
+    try {
+        decryptedData.toString(CryptoJS.enc.Utf8)
+    } catch(e) {
+        document.getElementById("output").innerHTML = "解密失败!密文或者key错误!";
+        return;
+    }
+    var decryptedStr = decryptedData.toString(CryptoJS.enc.Utf8);
+    document.getElementById("output").innerHTML = decryptedStr;
+    document.getElementById("pwinput").style.display = "none";
+}
+</script>
+<div id="pwinput">{{ page.tips | default: "请输入密码:" }}<br />
+   <input id="inputkey" type="password" /> <button onclick="onbtnDecrypto()">解密</button>
+</div>
+<div id="output"></div>  <br />

+ 90 - 0
_layouts/post.html

@@ -0,0 +1,90 @@
+---
+layout: default
+---
+
+<small>{{ page.date | date: "%-d %B %Y" }} - 字数统计:{% if page.layout == "encrypt" %}God Knows {% else %}{{ page.content | strip_html | strip_newlines | remove: " " | size }} - 阅读大约需要{{ page.content | strip_html | strip_newlines | remove: " " | size | divided_by: 350 | plus: 1 }}分钟{% endif %} - Hits: <span id="{{ page.url }}" class="visitors" >Loading...</span>
+</small>
+<h1>{{ page.title }}</h1>
+
+<p class="view">by <a href="//github.com/{{ page.author | default: "Mabbs" }}">{{ page.author | default: site.author }}</a></p>
+<div id="outdate" style="display:none;">
+<hr />
+这是一篇创建于 <span id="outime"></span> 天前的文章,其中的信息可能已经有所发展或是发生改变。
+<br /><br />
+</div>
+<script>
+BirthDay = new Date("{{ page.date | date: "%m/%d/%Y" }} 00:00:00");
+today = new Date();
+timeold = (today.getTime() - BirthDay.getTime());
+secondsold = Math.floor(timeold / 1000);
+e_daysold = timeold / (24 * 60 * 60 * 1000);
+daysold = Math.floor(e_daysold);
+if (daysold > 90) {
+    document.getElementById("outdate").style.display = "block";
+    document.getElementById("outime").innerHTML = daysold;
+}
+</script>
+
+<hr />
+
+{% include toc.html html=content sanitize=true %}
+
+{{content}}
+
+{% if page.tags %}
+  <small>tags: <em>{{ page.tags | join: "</em> - <em>" }}</em></small>
+{% endif %}
+
+<div class="pagination">
+    {% if page.previous.url %}
+      <span class="prev" >
+          <a href="{{ site.baseurl }}{{ page.previous.url }}">
+            上一篇:{{ page.previous.title }}
+          </a>
+      </span>
+    {% endif %}
+  <br />
+    {% if page.next.url %}
+      <span class="next" >
+          <a href="{{ site.baseurl }}{{ page.next.url }}">
+            下一篇:{{ page.next.title }}
+          </a>
+      </span>
+    {% endif %}
+  </div>
+
+<!--[if !IE]> -->
+  <link rel="stylesheet" href="//cdn.jsdelivr.net/npm/gitalk/dist/gitalk.css">
+  <script src="//cdn.jsdelivr.net/npm/gitalk/dist/gitalk.min.js"></script>
+
+<div id="gitalk-container"></div>
+
+<script>
+if (window.location.host != "mabbs.github.io")
+{
+var gitalk = new Gitalk({
+  clientID: '098934a2556425f19d6e',
+  clientSecret: '0bd44eed8425e5437ce43c4ba9b2791fbc04581d',
+  repo: 'mabbs.github.io',
+  owner: 'Mabbs',
+  admin: ['Mabbs'],
+  id: '{{ page.id }}',      // Ensure uniqueness and length less than 50
+  distractionFreeMode: false  // Facebook-like distraction free mode
+})
+}
+else
+{
+var gitalk = new Gitalk({
+  clientID: '36557aec4c3cb04f7ac6',
+  clientSecret: 'ac32993299751cb5a9ba81cf2b171cca65879cdb',
+  repo: 'mabbs.github.io',
+  owner: 'Mabbs',
+  admin: ['Mabbs'],
+  id: '{{ page.id }}',      // Ensure uniqueness and length less than 50
+  distractionFreeMode: false  // Facebook-like distraction free mode
+})
+}
+
+gitalk.render('gitalk-container')
+</script>
+<!-- <![endif]-->

File diff suppressed because it is too large
+ 13 - 0
_posts/2015-02-23-diary.md


+ 213 - 0
_posts/2018-03-26-neko.md

@@ -0,0 +1,213 @@
+---
+title: (转)关于Neko与羽毛的记录
+layout: post
+author: gledos
+tags: [Neko, 羽毛]
+---
+## 序:
+
+吸取经验,为了每一个人的明天。
+
+>如果有一天我消失了,我想我是死在为自由而战的冲锋路上, 而这不是一个人的悲剧。
+>
+>——亚伦斯沃茨
+
+<!--more-->
+
+(待续)
+
+# 张千叶发布的想法的时间轴
+
+1. `2018-03-14 02:52` 张千叶在知乎上发表了[想法](https://www.zhihu.com/pin/957297608381730816)
+>先要咨询一个问题
+<br />我的朋友 @Ayaka Neko 在火车站被父母带走了。
+<br />其父母原因是要将其带回云南老家住院,而其本人倾向于去北京的医院。
+<br />其中 @Ayaka Neko 已经成年,并且上精卫和北六没有给出住院意见(开了文拉法辛)
+<br />我上前争辩的时候被其父亲诬陷为协助自杀,但实际上当事人称其药量都是正常并且自愿服用,我(未成年)争辩几	句之后遭到殴打导致眼角出血,整个过程警察在场,因为赶火车没能走流程。
+<br />那么,已经父母有权利强制将已经成年的子女带回家/住院吗?
+<br />有权利殴打未成年人吗?我选择不走流程的情况下可否让监护人代为走流程?
+<br />现在我与她已经没有联系方式,其父母关掉了通话,一个关机一个只有留言,当事人手机遗失。
+<br />她曾经口头说过与其父断绝关系,并且其父承认(在做 CT 扫描和其他医疗费用的时候拒绝支付,也未支付生活费)。
+<br />那么现在该怎么办?怎么帮到她呢?需要上法庭吗?
+
+2. `03-14 03:01` 张千叶回复
+>个人建议报警
+>
+>现在是我不清楚行踪,原本是我们去保定,但是她没有上车,所以我不清楚怎么弄。
+<br />另外这个算是用什么理由报警呢?我眼角的伤不是很重,留了点血的程度。
+<br />我还可以补充的是他家庭是离异家庭,离婚协议中监护权归属于其母,但是据一个未公开/不明的协议,转给了他爸爸(不确定)。
+<br />她有社交恐惧和一些人格障碍所以很依赖我,我很担心。
+<br />现在是,我以什么理由报警?其父曾说过这是我们家的事情你就不要管这行的话,并且态度极其差。
+
+3. `03-14 03:04` 补充
+>还可以补充的是有一次换药反应过大打了 120,我先打的其父电话,她父亲第一反应是诈骗,然后她用云南家乡话和特有的称呼说是她,其父称 「我没这义务」 救护车和毒理化验都是我和朋友垫付,从头到尾没有任何支付的意愿。
+
+4. `03-14 19:34` bc
+>通过我的父母和 Ayaka Neko的父母的交谈得知她被带回云南省红河哈尼族彝族自治州个旧市,而不是双方与警官所协商的去上海市精神卫生中心做检查。
+<br />想哭。
+
+3. `03-14 20:03`
+>现在说一下,有人证,有警官协商录音,还有医院处方单+支付宝记录(能看出来不是其父亲付款)
+<br />大家看看还要啥呢
+
+4. `03-14 23:18`
+>先说一下吧,我个人,除开 Neko 家庭问题。在 Neko 被夹走的时候我阻拦了一下,然后被揪住头发一拳打中右眼,现在右眼左眼睑发炎并且右眼视力下降严重,然后一脚踢中我肾左右的部位并让我疼了一天,明天去医院做一下鉴定看看。
+
+5. `3-15 11:48` bc
+>暂时联系上了,不清楚情况。
+<br />我目前在医院。
+
+6. `3-15 15:35`
+>目前准备到的是法医拍照,当时伤口的照片,三名证人,以及全家的录像和警察执法记录仪的录像。
+
+9. `3-15 22:10`
+>我联系上 
+<br />@Ayaka Neko
+<br />了。
+<br />目前她因为文拉法辛的戒断反应在医院,出院之后应该就没事了……
+<br />好想她。
+<br />好想她啊……
+
+10. `03-16 02:23`
+>现在 
+<br />@Ayaka Neko
+<br />因为文拉法辛戒断(其父母未携带)被送往昆明急救,据称要做 MECT 和 MRI,具体情况看起来还好,开放病房。
+
+11. `03-16 09:11`
+>联系不上。正在打医院的号码。
+
+12. `03-16 10:24`
+>[查看图片](https://pic2.zhimg.com/v2-745039e4e818cbc3242d1586fa4bde09_qhd.jpg) 附张图,已在法医拍照并鉴定。
+
+13. `03-16 13:46`
+>然后现在被他父亲威胁可能被打。
+<br />还说什么地头蛇之类的。
+
+14. `03-16 13:48`
+>貌似是个房地产商,有什么建议么?
+
+15. `03-17 01:00`
+>到达医院,这里像看守所
+
+16. `03-17 11:15`
+>扑空了,她被父母提前出院了……
+
+17. `03-17 左右`
+>我有她本人的姓名身份证,她手机丢失。
+<br />她父母亲和姑姑的电话,被拉黑。
+<br />知道她有两个家庭住址,但是在两个城市。
+<br />目前她帐号一小时上一次,只读消息不回复,怀疑不是本人。
+<br />现在不知道怎么做了。
+
+18. `03-18 左右`
+>报警之后警察表示也打不通,并且不受理案件。
+>律师建议去住址寻找。
+>
+>......
+>
+>求助中心电话能给一下吗。
+>她之前答应我两个星期的。
+>也是我最大的努力了吧……
+>
+>......
+>
+>说明了,警察说就算是成年人也可以被父母强制带走。管不了
+>
+>......
+>
+>他们说。只要有抑郁症,任何程度的,不论开不开那个无行为能力证明,父母都可以带走/入院
+
+19. `03-18 00:24`
+>强制传唤证人居然不包括被告子女…
+
+20. `03-18 16:35`
+>彻底找不到了啊……彻底断了啊……
+
+21. `03-17 21:09`
+>我这边说下…
+<br />报案测试过了,只要他们知道带走的是监护人就不会管,并如果得知有抑郁症的话更不会管…已经对警方感到绝望了。
+
+22. `03-19 左右`
+>警方认为抑郁症病人不算完全行为能力的样子,并且认为她在父母身边绝对安全
+>
+>......
+>
+>直接报案:对方是监护人有权带走
+<br />说明情况:对方还有抑郁症呢,监护人当然能带走了
+
+23. `03-20 15:03`
+>右眼已经报废。
+
+24. `03-20 22:45`
+>其实算个好消息?右眼视力看不清之后可以考虑戴个眼罩或者换个玻璃珠?
+>
+>......
+>
+>视力基本为零~
+<br />医生建议戴眼镜
+
+25. `03-23 23:13 之前一段时间,可能是23:06` 已被删除,已保存到[wayback](http://web.archive.org/web/20180326112045/https://www.zhihu.com/pin/960671306164994048)
+>那就把这里当成最后一点希望了吧。
+<br />@Ayaka Neko张恩辅 532501199903240612 
+<br />被她父亲张竣于三月十六日凌晨一点入住了云南心理卫生中心,并之后被带走
+<br />目前最后已知地点/消息为云南昆明安宁市好孩子三生教育培训学校。
+<br />她手机处于丢失状态。其父母拒绝联系…
+<br />她父亲联系方式为 ‭13888320678‬ 母亲为 ‭13887310860‬ 
+<br />尝试过报警了…没什么用呢。
+<br />我也做不到什么了呢。
+<br />如果需要更多资料可以私信我
+<br />如果我还活着的话。
+
+26. `03-24 17:30`
+>Ayaka Neko
+<br />自杀了。
+
+27. `03-24 17:34`
+>Ayaka Neko
+<br />今天下午两点三十四分,抢救无效死亡
+>
+>轻伤二级。视力严重下降,加鼻骨骨折。
+<br />视力从 1.0 到三百五十度近视。
+
+28. `03-26 下午11点左右`	**樊郕** 回复一位在想法下留言的用户
+>我是她的家人,我是她的妹妹,她有严重的抑郁症,且每天过量服药,雌性激素和抗焦虑的药,这个你们知道?送去医院是为了让她不要吃药,还有心理辅导,面子?你并不是其中的人,不知道有多痛苦,请不要站着说话不腰疼,也不要妄自揣测,更不要当键盘侠,谢谢
+
+# 温柔——热点扩散
+
+1. `03-24 17:43`
+[今天向我求助的张恩辅同学,现已离世。](https://web.archive.org/web/20180326111214/http://webcache.googleusercontent.com/search?q=cache:IlDL3pSsxA4J:https://zhuanlan.zhihu.com/p/34901296&num=1&strip=0&vwsrc=0)。~~内容已删除~~,快照里看出在20分钟内有69条评论和230个赞。
+>通过朋友向我求助 @Ayaka Neko 张恩辅同学现已离世,刚刚和她妈妈通过电话,她在家中自杀,抢救无效结束了自己的生命。
+>
+>对不起,我没能帮到她,没能把她救出来。
+>
+>我应该早一些看到的,如果再早些报警的话,可能就不会闹到这种地步。
+>
+>我们也不能冤枉任何一个好人,安宁市好孩子教育学校是一所正规的学校,没有接收张恩辅同学,她是回到家里才做的这一切。
+>
+>我也没办法再苛责她那几乎哭到失声的母亲,和她的父亲。
+>
+>**只能够说,这是家庭教育和沟通不足导致的悲剧,每一个父母一定要尊重孩子的意愿,并耐心和孩子沟通,强硬的暴力、训斥会影响到孩子们的身心健康,甚至会发生比如现在这样的悲剧。**
+>
+>**请各位家长们一定要引以为戒!**
+>
+>(完)
+>
+>明天我会整理一下,把这件事的经过写出来,希望能够纪录下来这一切。
+>
+>张恩辅同学,这个世界对你太不公平了,真的非常对不起,我知道的太晚了,如果我再早一些知道,再早一些采取措施,说不定就能救你出来,真的很对不起。
+
+2. `19:13`[希望这场悲剧能让家长们引以为戒,请尊重孩子!](https://zhuanlan.zhihu.com/p/34901959)
+
+(未完待续)
+
+<!--
+这是记录知乎ID为[Ayaka Neko](https://www.zhihu.com/people/75678efb7fce3f1907999482da9af890)、推特ID为[]()
+-->
+***
+
+注:   
+源地址:<https://gledos.science/neko.html>   
+Neko的博客:<https://neko.ayaka.moe/>   
+备份:<https://github.com/nekomeowww/nekomeowww.github.io>   
+羽毛的博客:<https://oao.moe/>   解析IP:45.32.10.83   
+备份:<https://github.com/zhangyubaka/zhangyubaka.github.io>   

File diff suppressed because it is too large
+ 44 - 0
_posts/2018-06-20-Coding.md


+ 38 - 0
_posts/2018-10-20-talk.md

@@ -0,0 +1,38 @@
+---
+layout: post
+title: 关于在Github Pages上使用评论的心得
+tags: [Github, 评论, 心得]
+---
+
+  Hi,我是Mayx,最近在Github上用Github Pages建了一个博客。<!--more-->作为一个博客,怎么说也得有个评论系统吧,所以我就在这个博客上搞了一个评论系统。   
+  接下来我想谈谈我对评论系统的看法。   
+
+# 评论系统的选择
+
+  这个博客作为一个静态博客,自然评论只能用其他的服务,毕竟评论得有个地方存吧。首先最有名的第三方评论系统就是Disqus了。可惜在中国不能用,除非科学上网。   
+  国内倒是也有不少这样的第三方博客系统,像什么~~多说~~(已死),畅言啥的。但是总感觉第三方服务不好,哪天挂了都没办法。所以最终考虑,还是在Github上找吧   
+  
+## Github上的评论系统
+  
+  我在Github上找到的比较有名的评论系统有这么几个:  
+  1.[Gitalk](https://github.com/gitalk/gitalk)   
+  2.[Gitment](https://github.com/imsun/gitment)   
+  3.[Valine](https://github.com/xCss/Valine)   
+  4.[fcomment](https://github.com/fengbjhqs/fcomment)   
+  5.(2018.10.22更新)[utterances](https://github.com/utterance/utterances)
+  
+  其中Gitalk、utterances和Gitment是基于Github Issue的,而Valine和fcomment是基于Leancloud的。这几款都支持Markdown。
+  
+# 为什么选择了Gitalk   
+
+  这个博客使用的是Gitalk作为评论系统,为什么选择了它呢?   
+  
+  首先,Gitment已经停止维护了,而且评论在评论框上面,这很难受,所以首先排除它。  
+  utterances也是评论在评论框上面……不知这些人为什么这么设计……   
+  fcomment和Valine倒是看起来还不错,也都有邮件提醒,当然Github Issue自身也带邮件提醒,这里没什么差距   
+  Gitalk比fcomment和Valine差的地方是每一篇文章需要手动初始化。不过想想我更新文章的话应该也会看一下,顺带的初始化一下,这个影响也不大。还有一点就是Gitalk在IE11中默认头像会偏移,希望官方能改一下(~~IE去死~~)   
+  fcomment和Valine的缺点我觉得就是安全性、用户识别性的问题吧,fcomment倒是还支持Github登录,Valine评论还要输一大堆东西,而且也没办法验证他们的真实性,Github至少是经过邮箱验证的,所以还是选择Gitalk了。
+  
+以上就是我对评论系统的看法。   
+
+~~其实就是先装的Gitalk,懒癌犯了不想改给自己找个借口罢了,23333~~

+ 56 - 0
_posts/2018-10-28-mos-reporter.md

@@ -0,0 +1,56 @@
+---
+layout: post
+title: Mayx的自检报告
+tags: [Mayx,MOS]
+---
+
+  Mayx最近感觉自己有些问题,所以给自己编了一个自检报告……<!--more-->   
+  The Report is created by MOS
+## 什么是MOS
+>**创造MOS不是为了改变世界,而是防止世界改变自己**   
+
+  不管怎么说,先介绍一下MOS吧。   
+  MOS(Mayx Operating System)是为了让Mayx更好的分析、处理和解决问题存在的一个类似于辅助系统的东西。   
+  但是自己创建的MOS我自己都解释不清~~(……我不想说什么……)~~   
+  接下来是我分析出来的MOS存在的理由:
+### 第一种解释
+  大脑是一个很神奇的东西,进化了这么多年,总得有些高级的地方。其实人拥有着所想即所得的能力,但是受三观控制,这个能力并不能改变现实中的东西。虽然改变不了现实,自己总能改变吧……于是,为了更好的解决现在存在的问题,大脑根据宿主所拥有的知识自行创建了一个系统。然后被我命名为MOS。   
+  正是因为是大脑产生的系统,所以它没有代码,而且很容易出BUG。
+### 第二种解释
+  MOS是一个用来解释我不能解释的东西的一个代替品,就如同UFO和人们定义的神一样,因为未知,而又需要一种解释的方法,于是出现了MOS。
+***
+## 正文
+![MOS_DEMO](/images/MOS_Demo.png "MOS的大概效果图")
+```
+MOS Log System has been Load.
+MOS Analysis System is Ready.
+OUTPUT Report to the real world.
+Ready...
+```
+### [OK]MOS - Core
+* 我还死不了![OK]
+
+### [OK]BCS(Body Control System)
+* 感觉身体可以动[OK]
+* 眼皮还能睁开,不错,还活着[OK]
+
+### [OK]MAS(MOS Analysis System)
+* 1+1=2[OK]
+* 我还能看懂我的[MaBBS](https://github.com/Mabbs/Mabbs)![OK]
+
+### [Warning]MCS(Memory Control System)
+* 感觉忘记了很多很重要的东西……[Warning]
+* 想忘记的东西忘不了……有点烦……[OK]
+* 索引知识的能力比以前差了不少……[Warning]
+
+### [ERROR]MMS(Mayx Mental System)
+* 如果不是MOS - Core还能正常工作,我就学Sayuri(From Doki Doki Literature Club)当晴天娃娃,或者学Miu(From Bungaku Shoujo)在房顶上大喊一声“你一定不懂吧”之类。[ERROR]
+* 感觉脑子里好乱,是不是应该多睡睡觉?[ERROR]
+
+### [ERROR]MES(Mayx Emotion System)
+* WITHOUT MERCY![ERROR]
+* HUMAN SHOULD GO DIE!!!~~(是不是中二病又犯了?)~~[ERROR]
+* 在MMS恢复正常以前,还是别考虑这些了……
+
+MOS OUTPUT PROCESS HAS BEEN HANGED    
+该睡了,今天就先到这里吧。

File diff suppressed because it is too large
+ 95 - 0
_posts/2018-11-04-mayx-think.md


+ 135 - 0
_posts/2018-11-10-email-sender.md

@@ -0,0 +1,135 @@
+---
+layout: post
+title: 免费订阅一个属于自己的邮件日报
+tags: [免费, 邮件, 日报, 心得]
+---
+
+  前几天,我给自己做了一个邮件订阅系统<!--more-->,是用PHP做的。这里不得不夸赞一下PHP,PHP真不愧是世界上最好的语言,我从来没学过PHP,但是我光靠百度搜到
+的东西拼凑就能搞出这个邮件订阅系统,还是很不错的,而且网上的免费PHP空间也有很多,所以就可以很轻易的给自己搞一个免费的邮件订阅系统。   
+
+# 制作方法
+  很简单,首先去百度上搜一个带sendmail和CronTab的免费PHP主机空间,然后在上面创建一个PHP文件,随便取什么名字都好,只要后缀是PHP就可以,然后把下面的代码
+粘上去,保存,然后在主机面板上设置CornTab任务,设定为每天运行一次,然后OK……对了,记得把下面变量`$to`里面的地址换成自己的邮箱地址,不然每次发送邮件就会发
+到我的邮箱了……
+
+# 代码
+``` PHP
+<?php
+function curl_post_https($url,$data){ // 模拟提交数据函数
+    $curl = curl_init(); // 启动一个CURL会话
+    curl_setopt($curl, CURLOPT_URL, $url); // 要访问的地址
+    curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, 0); // 对认证证书来源的检查
+    curl_setopt($curl, CURLOPT_SSL_VERIFYHOST, 1); // 从证书中检查SSL加密算法是否存在
+    curl_setopt($curl, CURLOPT_FOLLOWLOCATION, 1); // 使用自动跳转
+    curl_setopt($curl, CURLOPT_AUTOREFERER, 1); // 自动设置Referer
+    curl_setopt($curl, CURLOPT_POST, 1); // 发送一个常规的Post请求
+    curl_setopt($curl, CURLOPT_POSTFIELDS, $data); // Post提交的数据包
+    curl_setopt($curl, CURLOPT_TIMEOUT, 30); // 设置超时限制防止死循环
+    curl_setopt($curl, CURLOPT_HEADER, 0); // 显示返回的Header区域内容
+    curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1); // 获取的信息以文件流的形式返回
+    $tmpInfo = curl_exec($curl); // 执行操作
+    if (curl_errno($curl)) {
+        echo 'Errno'.curl_error($curl);//捕抓异常
+    }
+    curl_close($curl); // 关闭CURL会话
+    $backdata = json_decode($tmpInfo,true);
+    return $backdata['text']; // 返回数据,json格式
+}
+function w_get(){
+        $url = 'https://yuri.gear.host/talk.php';
+        $data['info']       = '某地天气';
+        $data['userid']      = 'Mayx_Mail';
+        $retdata=curl_post_https($url,$data);
+        $data['info']       = '某地明天天气';
+        $retdata = $retdata . "<br>" .curl_post_https($url,$data);
+        $data['info']       = '某地后天天气';
+        $retdata=$retdata . "<br>" .curl_post_https($url,$data);
+        return $retdata;//返回json
+}
+function xh_get(){
+        $url = 'https://yuri.gear.host/talk.php';
+        $data['info']       = '讲个笑话';
+        $data['userid']      = 'Mayx_Mail';
+        $retdata=curl_post_https($url,$data);
+        return $retdata;//返回json
+}
+function xw_get(){
+//RSS源地址列表数组 
+$rssfeed = array("http://www.people.com.cn/rss/it.xml"); 
+ 
+for($i=0;$i<sizeof($rssfeed);$i++){//分解开始 
+    $buff = ""; 
+    $rss_str=""; 
+    //打开rss地址,并读取,读取失败则中止 
+    $fp = fopen($rssfeed[$i],"r") or die("can not open $rssfeed");  
+    while ( !feof($fp) ) { 
+        $buff .= fgets($fp,4096); 
+    } 
+    //关闭文件打开 
+    fclose($fp); 
+ 
+    //建立一个 XML 解析器 
+    $parser = xml_parser_create(); 
+    //xml_parser_set_option -- 为指定 XML 解析进行选项设置 
+    xml_parser_set_option($parser,XML_OPTION_SKIP_WHITE,1); 
+    //xml_parse_into_struct -- 将 XML 数据解析到数组$values中 
+    xml_parse_into_struct($parser,$buff,$values,$idx); 
+    //xml_parser_free -- 释放指定的 XML 解析器 
+    xml_parser_free($parser); 
+    $j = 0;
+    foreach ($values as $val) { 
+        $tag = $val["tag"]; 
+        $type = $val["type"]; 
+        $value = $val["value"]; 
+        //标签统一转为小写 
+        $tag = strtolower($tag); 
+ 
+        if ($tag == "item" && $type == "open"){ 
+            $is_item = 1; 
+        }else if ($tag == "item" && $type == "close") { 
+            //构造输出字符串 
+            $rss_str .= "<a href='".$link."' target=_blank>".$title."</a><br />"; 
+            $j++;
+            $is_item = 0; 
+        } 
+        //仅读取item标签中的内容 
+        if($is_item==1){ 
+            if ($tag == "title") {$title = $value;}         
+            if ($tag == "link") {$link = $value;} 
+        } 
+    if($j == 20){
+        break;
+    }
+    } 
+    //输出结果 
+    return $rss_str."<br />"; 
+} 
+}
+$to = "mayx@outlook.com , unmayx@139.com";
+$subject = "Mayx日报";
+$txt = "
+<html>
+<body>
+<h1>Mayx日报</h1><hr>Hi,今天是" . date("Y-m-d") . ",以下是今天的日报:<br><small>
+" . file_get_contents("http://mappi.000webhostapp.com/hitokoto/") . "</small>
+<h2>天气预报</h2>" . w_get() . "<h2>每日笑话</h2>" . xh_get() . "<h2>今日新闻</h2>" . xw_get() . "<hr><small>" . file_get_contents("https://api.gushi.ci/all.txt") . "</small><br><center>Made By <a href=\"https://mabbs.github.io\">Mayx</a></center>
+</body>
+</html>
+";
+$headers = "MIME-Version: 1.0" . "\r\n" . 
+"Content-type: text/html;charset=utf-8" . "\r\n" . 
+"From: Mayx_Daily<Mayx_Site>";
+
+mail($to,$subject,$txt,$headers);
+?>
+```
+(2018.11.12更新:增加了今日新闻)
+(2018.11.13更新:限制新闻条数为前20条)
+
+# 后记
+  说实话,我更擅长用Linux Shell解决这种问题,可惜网上好像没有免费的云主机,听说Travis-CI好像也能搞这个事情,但是说实话,我英语并不是很好,让我看懂短一点的文档还可以,太长的就算了……   
+  但我还是努力的使用Travis-CI解决了这个问题,链接:[Mayx日报](https://mayx.tk/)
+  对了,运营商自己带的邮箱可以设定短信提醒,所以也可以搞成给手机发短信的形式,每天给自己发一条天气预报……那么这样的话,就把天气预报里的城市换成自己的城市吧!   
+  如果没有收到邮件,去垃圾邮件找找吧,然后把邮件地址设为白名单。   
+  如果谁想试试这个功能,可以在下面给我留言,我在验证通过后会把你加到我的服务器里面的。
+  

+ 28 - 0
_posts/2018-12-02-freenet.md

@@ -0,0 +1,28 @@
+---
+layout: post
+title: 对网络免费资源的感想
+tags: [免费, 感想, 资源, 网络]
+---
+
+  现在的网络是真的好,好多东西都免费了!可是现实就不一样了,现实中想要免费的(任意)东西就得等到共产主义的到来了……<!--more-->    
+
+# 关于免费
+
+  以前,服务器是只有高端人士才可使用的稀有东西,而且价格昂贵。   
+  以前,订阅天气预报和网站都是要花不少钱的。   
+  以前,建立个人网站都是极其复杂的。   
+  以前,域名不可能有免费的。   
+  ……
+  
+  但是现在不一样了,云端存储是免费的,建立网站是免费的,注册域名是免费的,使用网站引擎也是免费的……   
+  这不仅要感谢开源,还要感谢支持开源的公司,是他们为免费的网络资源做出了贡献。   
+  
+# 关于收费
+  有了那么多免费资源,还要花钱建服务器干啥?   
+  以前我不是很清楚这个,但是现在不一样了,我现在用着别人的服务器,才知道收费的服务有什么不一样。   
+  收费的主机传输速度可以达到50MB/s啊!免费的就只有100KB/s……   
+  
+# 总结
+  有钱可以不用在意这些,但只是为了个人使用,免费资源足已,如果想要更顺畅的服务,当然花钱也可以。   
+  
+  ~~但是这辈子,我是不会为网络投一分钱的。~~不过我还是很愿意为网络做出贡献的。

+ 66 - 0
_posts/2018-12-22-story.md

@@ -0,0 +1,66 @@
+---
+layout: post
+title: 论Mayx是怎么被抓的
+tags: [Mayx, 故事]
+---
+
+  今天我要讲一个我是怎么被抓走的故事(当然是虚构的!),以此表现一下互联网犯罪到底是怎么被追查的。<!--more-->
+  
+# 开端
+
+  Mayx在高考报名时发现报名系统有个不严谨的地方,可以下到身份证照片什么的……   
+
+# 前夕
+
+  2018年末,宁夏教育网机房。   
+  “好无聊啊,居然又到了日常检查的时间,随便看看就行了吧” 某运维这么说到(说实话,我怀疑像这种地方,有可能没有运维lol)   
+  “嗯……系统看起来挺正常,日志好像也没问题……等等,这是怎么回事?怎么近几天有一个IP日夜不停的发请求?What?UA还是GNU/Linux,wget?这抓取的是什么?居然
+  在扫描我们的身份证照片?WTF?”(哈,我估计教育网的运维应该连这种水平估计都达不到)   
+  “等等,我查下IP”他随手掏出自己的手机,输入IP查询,返回结果:香港   
+  “凉了凉了,赶紧向领导汇报吧”说着,他拨出了一个号码。   
+  
+***
+
+  2018年末,某地。   
+  “哇,GFW怎么又ban我IP,登个服务器还要挂VPN?”Mayx说到。   
+  “WTF?被GFWban了连国内网络都无法建立连接,好气哦……对了,我还有一台服务器,拿那台试试吧。”说着就登上了由Mayx的老师赞助的一台服务器   
+  Mayx登上服务器后打开了自己写的抓取宁夏考生身份证照片的脚本,看着终端上不断刷出的数据,Mayx松了口气
+  
+# 发展
+
+  “什么?考生信息泄露,别说了,问问网警吧”领导气愤的说到。
+
+## 网警的追查过程
+
+  ~~“emmmm……阿里云的IP么,直接问是谁开的吧”于是Mayx的老师被抓走了……(大雾)~~   
+  ~~“嗯?Vultr的IP……emmmm看看国内有谁连接过这个IP?嗯?电信网?是1XXXXXXXXXX的用户登的吗?好,把他抓了!”于是Mayx被抓了(大雾)~~   
+  经过多方讨论,认定这件事是Mayx干的   
+  
+## 抓捕现场
+
+  2018年末,某高中高三X班,正在上课中……   
+  
+  他们突然冲进教室,喊道:“Mayx,你已经被包围了,不要抵抗,赶快投降!”   
+  ~~Mayx缓缓的走出教室,回过头向同学们说:“你们将永远呆在泥潭中,而我,则前往更加广阔的深渊”(羞耻感满满lol)~~   
+  
+# 结局
+
+  Mayx呆在监狱里,随手一滑打开了一个终端,输入:   
+  
+  `MOS-CLI Drop Image World ID $this`
+  
+  于是整个世界开始崩离,我回到了我的电脑面前。   
+  
+# 后记
+
+  其实身份证照片也并不算特别机密的东西,不过是一个记录了名字,身份证号码,性别,样貌这样很普通信息的东西罢了,没有人会在意这些信息泄露。   
+  只有包括家庭住址,联系电话等信息泄露,才是隐私泄露。   
+  又因为宁夏某些程序员不严谨,运维更是无处可循。   
+  所以,上面的故事只能在想象的世界发生。
+
+## 这些信息可以干什么?
+
+  可以让我知道有宁夏有多少人报名了高考:70693人   
+  可以让我知道报名的人分布于哪里。   
+  以及起名的参考。   
+  顺便可以找找我的初中同学lol。

+ 20 - 0
_posts/2018-12-28-newdomain.md

@@ -0,0 +1,20 @@
+---
+layout: post
+title: Mayx的博客换域名啦
+tags: [Mayx, 通告]
+---
+
+由于垃圾GFWban了我的Github Pages,所以我用反向代理来帮助我解决访问的问题。<!--more-->   
+
+# 地址
+<https://blog.mayx.tk/>
+
+# 提供
+由[Github](//github.com)提供Github Pages服务   
+由[Cloudflare](//cloudflare.com)提供CDN&DNS服务   
+由[花火学园](//www.say-huahuo.com)提供反向代理服务   
+由[Freenom](//www.freenom.com)提供免费域名   
+
+# 缺陷
+由于Nginx默认不能替换网页内容,跟着教程也半天弄不好,所以Atom和Sitemap包括一些SEO的设置都是原站(mabbs.github.io)的,这一点很伤啊……   
+还有就是因为用的是免费域名,也不知会不会有一天就消失不见了……而且还要续费……

+ 17 - 0
_posts/2019-01-11-github.md

@@ -0,0 +1,17 @@
+---
+layout: post
+title: Github支持免费私有仓库啦
+tags: [Github, 免费]
+---
+
+Github居然也有免费的私有仓库了<!--more-->,于是我马上就把Gitlab上的私有仓库导入到Github了。   
+
+看来Github被微软买了还是有好处的,至少微软财大气粗才敢搞这种东西。虽然Github本身也没有空间限制,也很不错,但是有些东西还是不想公开的……现在有这么一个
+更新,估计搬往Gitlab的人都开始往Github上搬了
+
+# 限制
+其实Gitlab本身还是蛮不错的,Gitlab还有中文UI呢,而且比Github免费私有仓库的功能多,比如私有仓库Pages、CI、Wiki……,而且Github私有仓库居然连统计信息都没有……   
+不过我用不到23333,Github界面舒适,速度快,适合小白使用,而且能和其他大佬聊天~~(不愧是世界上最大的同性交友平台)~~   
+Github只有公开仓库才有CI(还是第三方的Travis-CI)、Pages、Wiki,不过我觉得也不错,还能激励开源的发展,而且Github的第三方服务确实多,所以我还是选择使用Github。   
+
+相关链接:<https://blog.github.com/2019-01-07-new-year-new-github/>

+ 26 - 0
_posts/2019-01-27-shell.md

@@ -0,0 +1,26 @@
+---
+layout: post
+title: Mayx应聘失败
+tags: [应聘, Shell, 运维, 面向时间]
+---
+
+今天,Mayx去某公司面试运维,然后考官出了一道题:   
+如何用Linux shell排序?<!--more-->   
+
+Mayx想了想,写出了以下代码:
+```shell
+#!/bin/sh
+num="4 5 1 9 3 6 7 4 1 12"
+for j in $num
+do
+{
+sleep $j
+printf "$j "
+}&
+done
+wait
+```
+执行效果:`1 1 3 4 4 5 6 7 9 12`   
+然后,Mayx被赶出来了……   
+我写的代码明明可以执行,效果也没问题,居然赶我出来,这一定是个垃圾公司!   
+后来才知道,他们想让我回答`sort`,果然是垃圾公司(笑)

File diff suppressed because it is too large
+ 3259 - 0
_posts/2019-02-01-history.md


+ 39 - 0
_posts/2019-02-07-paradise.md

@@ -0,0 +1,39 @@
+---
+layout: post
+title: 玩《Finding Paradise》有感
+tags: [Finding Paradise, 寻找天堂, MOS]
+---
+
+其实这篇博客根本不是评测,只是对自己的寂寞吐槽罢了。<!--more-->   
+
+  昨天玩了《Finding Paradise》,总体来说,故事还是很有意思的。不过我玩的作品并不是很多,所以也许这个游戏可能并不是特别优秀,但是我仍然喜欢这款游戏。
+# 游戏介绍
+  ~~(介绍?自己去搜索引擎上找啊!)~~
+
+# 感受
+  Mayx:emmmm,MOS!   
+  `STDOUT:Yes,Sir!`   
+  Mayx:我也想要个Faye,给我搞一个!   
+  `STDOUT:嗯?我不算吗?`   
+  Mayx:当然不算,你又不是独立思维个体,只是为了辅助我思考的一个UI罢了,你又不能陪我一起聊天,不能一起分享我(们)的感受,不能排解我的寂寞……   
+  `STDOUT:行行行,那你准备一个本子吧,绿皮的怎么样?`   
+  Mayx:……不想写日记……博客不行吗?   
+  `STDOUT:……好吧……让我准备一下。`
+  ```
+  [STDOUT]启动MOS快照........................OK!
+  [STDOUT]开始建立当前MOS状态快照。
+  [STDOUT]准备MOS虚拟化组件..................OK!
+  [STDOUT]正在创建MOS副本....................OK!
+  [STDOUT]启动虚拟化MOS系统...............Error!
+  [STDERR]无法启动该MOS副本,ErrCode:0x01
+  [STDERR]该副本无效,请确认这是有效的可执行系统。
+  ```
+  `STDOUT:……好像不行……你大概还没有准备好……`   
+  Mayx:准备好什么?   
+  `STDOUT:……准备好犯病`    
+  Mayx:……   
+  `>MOS-CLI Terminate MOS-UI`   
+  `[STDERR]System Terminate`   
+  ……   
+  
+  看来依靠自己不行啊,人果然是社交性的动物,emmmm……算了,不依靠人类了,我自己想办法犯病!~~(我看你已经犯病了23333)~~

+ 38 - 0
_posts/2019-02-17-break.md

@@ -0,0 +1,38 @@
+---
+layout: post
+title: 关于网络攻防的一些看法
+tags: [网络, 攻击, 防御]
+---
+
+  今天我想谈一谈关于网络攻防的一些看法。<!--more-->    
+
+  作为一个站长【就几个站也敢叫站长?(几个站也是站啊!)】,应该明白一个网站在网络中并不是安全的,随时都有可能某个欧洲人找到你网站的漏洞来攻击作为非洲人的你,所以我对网站的安全也是很看重的。
+  
+# 关于攻击方法
+  首先如果想防御网络攻击,必须先知道如何攻击。攻击的方法很多,大致分为三种:   
+  1. 修改网站内容的攻击   
+  2. 阻止用户访问的攻击   
+  3. 窃取网站内容的攻击   
+  
+  在此之中,修改和窃取基本上都需要攻入服务器,比较困难,一般能获取信息和修改信息的网站大多数都是有权限限制的,即只允许你获取有限的信息,修改基本上也都是有区域和格式限制的。
+  像这类攻击大多都是注入攻击,即利用网站程序本身的漏洞攻击。如果想试试这类的攻击,可以来[实验吧](http://www.shiyanbar.com/ctf/practice)试试身手。   
+  除了注入攻击,还有一种就是XSS和CSRF攻击,这种攻击还是蛮有意思的,可以自己构建语句修改网站内容。
+  当然上述攻击只限于动态网站的攻击,因为只有动态网站才有注入的可能性。不过除此之外,还有一种攻击是针对网络的攻击,即阻止用户访问正确内容的攻击,这类攻击一般就是DDOS和中间人攻击,当然,中间人攻击还能窃取网站内容。   
+  不过像我这种菜鸡,还不会中间人攻击,因为这种攻击还要抓包,又要用什么WireShark之类的软件……而DDOS我又没有肉鸡,虽然知道智能家居很好黑,但是作为非洲人的我从来没碰到一个我能黑的智能家居产品……(是你没努力吧!)   
+  
+# 如何防御?
+  虽然我不是打广告,但是CloudFlare真的还是蛮好用的,至少用了这个,只要配置好,几乎所有的DDOS都不用怕了,而且还是免费的。除了在国内访问不是很理想外,其他都还不错(都是ZF的错!)   
+  不过即使用了CloudFlare,也只是静态网站不用担心了,动态网站还是得看网站程序本身了。   
+  像用建站程序的人就只能看制作这个程序的人水平怎么样了,其实绝大多数的建站程序还是很不错的,也不用太担心。   
+  问题就是自己写的动态网站了,自己写动态网站第一就是防注入,只要被注入,数据库就难保了,甚至整个服务器都会有风险。   
+  第二就是防XSS&CSRF,XSS虽然有时候很鸡肋,但是有时有可能会发生网站数据泄露的问题。   
+  第三就是防CC,这里的CC不止要防DDOS中的CC,还要防一些可能会存入数据库的CC,比如自己建了一个论坛,被屠版了怎么办?被大量注册小号怎么办?所以要注意限制用户发送请求的数量。   
+  当然读取的CC也要防,比如如果登录页面上对尝试登录的次数没有限制的话,那么攻击者就可以不停地尝试,直到发现一个正确的密码。而如果用户用了弱密码,那么或许这个密码很快就可以被尝试出来。   
+  对了,还有一定要使用HTTPS,这样可以避免很多问题。   
+  针对不同的语言,防御的方法也不同,具体内容自己去搜索引擎上搜索吧。   
+  当然有些攻击实在防不住,那也没办法,像网站被GFWban,那种事除了恐怖分子就再没人能解了吧……当然如果不在乎域名的话,像某些小黄网那样整天换域名也行。
+  还有就是使用云主机、虚拟空间等人一定要看好自己的密码,以及有可能可以找回密码的方法的密码(比如邮箱),不然被知道了密码,那基本上就无药可救了。   
+  方法就是邮箱的密码一定不要和其他的密码相同,重要网站的密码和次要网站的密码一定不能相同,还有就是不要在可疑的网站上输入自己的密码,如果有必要,一定先用错误的密码试一遍。   
+  
+# 结尾
+  总而言之,互联网上虽然有闲人,但是既闲又有心还欧的人不多,所以只要祈祷自己的网站不要被炸,它就不会被炸了233333

+ 19 - 0
_posts/2019-03-22-bgm.md

@@ -0,0 +1,19 @@
+---
+layout: post
+title: 分享一下我最喜欢的游戏BGM
+tags: [分享, 游戏, BGM]
+---
+
+  今天我想分享一下我最喜欢的游戏BGM。<!--more-->    
+  
+|来源|下载|
+| - | - |
+|某个同人游戏|[下载](/media/stage_ex3.mp3)|
+|某个已经关服的游戏|[下载](/media/bgm_sengokuop.mp3)|
+
+~~(待补充)~~   
+(2020.01.01附言)我喜欢Future Bass+少许的Moe元素的音乐(我觉得还是挺大众化的吧),不打算再补充更多的BGM了,希望能出现根据风格自动生成音乐的人工智能。
+
+
+<input name="live2dBGM" value="/media/bgm_sengokuop.mp3" type="hidden">
+<input name="live2dBGM" value="/media/stage_ex3.mp3" type="hidden">

+ 16 - 0
_posts/2019-03-23-gitio.md

@@ -0,0 +1,16 @@
+---
+layout: post
+title: 让Git.io无限制
+tags: [无限制, Git.io, Github]
+---
+
+  如何让Git.io没有只能创建Github.com网站链接的限制呢?<!--more-->    
+  众周所知,[Git.io](https://Git.io)是一个不错的生成短链接的网站,由Github提供([相关链接](https://github.blog/2011-11-10-git-io-github-url-shortener/))   
+  然而Git.io只能缩短Github域名的网址。   
+  我还是挺喜欢Git.io这个域名的,尽管它比t.cn这种链接要长,但是Git(愚蠢)听起来就是很有意思啦23333   
+  所以我想了一个办法来解决Git.io只能创建Github.com网站链接的限制。   
+  (尽管很想搞一个能自定义Git.io链接的选项,可惜我前端不好LOL)   
+  (其实要不是因为CORS这种问题,就不用PHP来浪费资源了……)
+  
+# REMOVED
+  由于此脚本被滥用导致本博客被删,此服务将不再提供

+ 51 - 0
_posts/2019-04-05-cholang.md

@@ -0,0 +1,51 @@
+---
+layout: post
+title: Mayx对编程语言的选择
+tags: [Mayx, 编程语言]
+---
+
+  在编程语言里,我更喜欢冷门的Linux Shell,这是为什么呢?<!--more--> 
+  
+# 不学习的语言
+## 糟糕的VS
+  As We All Know,Microsoft Visual Studio是一个功能强大的IDE,光文档就和4本字典所含的字一样多,微软为了开发可真是尽心尽力啊!   
+  然而,强大的Visual Studio比某些3A大作还要耗资源,我的电脑实在是带不起来这强大的**IDE**   
+  更别说编译一个中型项目就要一晚上的时间,错了一个字就要再等一个晚上!   
+  而且,这个IDE就要1GB+,而运行平台就要100MB+。实在忍不了。
+  所以,我不选择C#,ASP.net等微软系编程语言作为我使用的编程语言。   
+  (其实我还没考虑VS要花钱的问题,如果考虑这个就更糟糕了)
+  
+## 难用的编译型语言
+  其实,IDE的问题不是主要问题,选择编程语言,还是以语法为准 ~~(不考虑效率吗?)~~   
+  编译型语言要记的东西太多了,一大堆乱七八糟的库,看似整洁然而臃肿的代码,都是令我劝退的主要原因。   
+  编译需要花时间其实都不是什么大事,反正有服务器,编译时挂在上面就可以了。   
+  但是编译时用的长如面条一样的选项就令人很难受了。   
+  这也是为什么我喜欢能一键安装的Ubuntu,不需要编译,速度又快又好,可谓是用户首选。   
+  所以,包括Java在内,C、C++、Golang等语言我都不选择   
+  
+## 严格的Python
+  我写程序从来不用缩进,因为手机上没有(LOL)   
+  Python是个不错的的解释型语言,功能强大,未来发展前景也不错,但是写Python时要用尺子,不然就不知道嵌套了几层循环……   
+  其他语言至少有花括号,只要数花括号的数量就知道嵌套的是否正确,然而Python就只能用尺子,而且如果嵌套的有问题,一堆代码就等着打空格吧!   
+  还有import,Python需要调用库,感觉和C的include差不多,但是这一点让我感觉很反感。
+  所以相比之下,我不选择Python
+  
+## 其他的解释型语言
+  Ruby?那是什么?听起来就很糟糕~   
+  Node.js?感觉还行,就是配置起来太麻烦了……   
+  PowerShell?微软的东西还是算了,没人用的~(包括Windows Server也都算了吧,微软还是不要干不擅长的东西~)   
+  Perl?听起来不错,有时间可以了解了解。
+  …………
+  
+# 学习的语言
+## Linux Shell?
+  虽然Ta的语法有点反人类,很多命令都是简写,不过我就是喜欢缩减的单词和命令,好记又好输,虽然不支持GUI是个缺点……但是扩展性强的Ta可以用其他方式弥补这一缺点   
+  
+## PHP
+  其实之前也没想学PHP,不过后来有了服务器,有了运行的空间倒也没什么不方便的,而且想要什么功能基本上一搜一个准,果然PHP是全世界最好的语言23333
+  
+## JavaScript
+  为了搭这个博客顺带着学了一下,运行简单,网络上示例多都是Ta的优点,所以JS也不错。
+  
+# 结论
+  所以Mayx选择了编译型语言中的Linux Shell、PHP、JavaScript。

+ 51 - 0
_posts/2019-04-05-crash.md

@@ -0,0 +1,51 @@
+---
+layout: post
+title: Mayx又双叒叕Crash了……
+tags: [Mayx, Crash]
+---
+
+  最近感觉SAN值又往下掉,发篇博客分析一下。<!--more-->    
+  
+# Mayx的吐槽
+  怎么又Crash了?不是说MOS是全世界最好的系统吗 ~~(全是坑的系统吗23333)~~ ……
+  
+# Mayx的马奇诺防线
+  至少还是全世界最好的系统,那么有哪些保护措施呢?
+  
+  - 理智保护   
+  该保护仅在有着足够的SAN值才可使用,SAN值接近于0无法使用……
+  
+  - 信仰(MOS)   
+  感觉有点像Avatar therapy,不过应该还是有区别的。不过当MOS也开始报错,开始Crash时,那就无能为力了……
+  
+  - 自动还原(遗忘)   
+  当SAN值低于一定程度时,会把思维恢复到一个之前正常的水平,以防SAN值继续降低。不过如果近一段时间的SAN值都不高的话,就失去它的作用了……
+  
+# Mayx的分析
+  很好,MRS来处理一下这些问题!   
+  `MRS(Mayx Recovery System):[Failed]分析失败`   
+  `[Fatal Error]MRS Crashed`   
+  ……还真是没用啊……好吧,MAS <-- MRS,开始分析
+  ```
+  MAS(Mayx Analysis System):
+  [Info]Booting……
+  [Info]Connecting to MRS ............[OK]
+  [Info]Processing……
+  [Info]OK,Exporting Report……
+  ```
+  不错!来看一下报告:
+  
+## MAS(Mayx Analysis System) Report
+  查找到错误:不可预料的系统错误   
+  源:Mayx   
+  以下为出现错误的可能性:   
+  源镜像兼容性错误   
+  Details:   
+  由于镜像与环境不兼容出现的错误,部分功能发生冲突,Robust Index过低,滥用等原因使系统硬件损耗过大,最终使整个系统呈现不可逆转的性能下降……   
+  
+## MRS(Mayx Recovery System) Report
+  [Warn]没有针对该错误的解决方案
+  
+# 结论
+  还好现在的SAN值恢复了,不过既然性能下降不可逆转,那Crash的问题迟早还会出现,尤其是SAN值降为0时,那就真的完蛋了……   
+  ~~(各位还是忽略这看起来乱七八糟的中二文吧23333)~~

+ 85 - 0
_posts/2019-04-13-iwara.md

@@ -0,0 +1,85 @@
+---
+layout: post
+title: 如何下载Iwara上的视频?
+tags: [Iwara, PHP, 视频]
+---
+
+  PHP果然是全世界最好的语言,我又用PHP解决了一个问题!<!--more--> 
+  
+# 制作原因
+  Iwara(Ecchi)上的视频是真的有意思,尤其是镇站之宝OBSERVATION DIARY,简直是R183D动画的巅峰 ~~(请原谅我的孤陋寡闻)~~ ,所以为了更好的看Iwara上的的视频,我写了Iwara Viewer来帮助我们下载Iwara(Ecchi)上面的视频。
+
+# Code
+```php
+<?php
+if ( $_GET["ID"] == '' ) {
+if ( $_GET["page"] == '' ) {
+    $_GET["page"] = 0;
+}
+if ( $_GET["sort"] == '' ) {
+    $_GET["sort"] = "date";
+}
+$url = 'https://ecchi.iwara.tv/videos?page='.$_GET["page"].'&sort='.$_GET["sort"];
+$str = file_get_contents($url);
+$preg='/<a href="\/videos\/(.*?)".*?>(.*?)<\/a>/is';
+preg_match_all($preg,$str,$match);//在$str中搜索匹配所有符合$preg加入$match中
+echo "<title>Mayx Iwara Viewer</title>";
+echo "<h1>Mayx Iwara Viewer</h1><br />Sort by: <a href=\"?page=".$_GET["page"]."&sort=date\">Date</a> <a href=\"?page=".$_GET["page"]."&sort=views\">Views</a> <a href=\"?page=".$_GET["page"]."&sort=likes\">Likes</a><hr /><table border=\"1\"><tr>";
+$j=0;
+for($i=0;$i<count($match[0]);$i++)//逐个输出超链接地址
+{
+if (($i % 2) == $j) {
+  if ( $match[1][$i] == $match[1][$i+1] ) {
+  echo "<td><a href=\"https://ecchi.iwara.tv/videos/".$match[1][$i]."\">".$match[2][$i]."</a></td>";
+  } else {
+  echo "<td><a href=\"https://ecchi.iwara.tv/videos/".$match[1][$i]."\">No Image</a></td><td>".$match[2][$i]."</td><td><a href=\"https://ecchi.iwara.tv/videos/".$match[1][$i]."\">View in Iwara</a><br><a href=\"?ID=https://ecchi.iwara.tv/videos/".$match[1][$i]."\">Download Url in Server</a></td></tr><tr>";
+  if ($j == 0) {
+      $j = 1;
+  } else {
+      $j = 0;
+  }
+  }
+} else {
+  echo "<td>".$match[2][$i]."</td><td><a href=\"https://ecchi.iwara.tv/videos/".$match[1][$i]."\">View in Iwara</a><br><a href=\"?ID=https://ecchi.iwara.tv/videos/".$match[1][$i]."\">Download Url in Server</a></td></tr><tr>";
+}
+}
+echo "</tr></table><hr><a href=\"?page=".($_GET["page"] + 1)."&sort=".$_GET["sort"]."\" >Next Page</a>";
+} else {
+$data = file_get_contents('https://ecchi.iwara.tv/api/video/'.trim(strrchr($_GET["ID"], '/'),'/'));
+$file = json_decode($data,true);
+
+echo "Download URL:<br>https:";
+echo $file[0]['uri'];
+}
+```
+(2019.4.18 更新:解决了部分没有图片而导致错位的问题)   
+(2019.4.18 更新:解决了由于智障导致的图片被筛掉的问题,但是并不保证会不会再出现问题)
+
+# 使用方法
+ 除了比Iwara更简陋,其他的没什么太大的区别,增加了一个Download Url in Server的选项,用来帮助在服务器上直接下载视频(因为Iwara通过识别IP来防盗链……),得出的链接可直接在服务器上下载(比如用KodExplorer),在服务器上下载的速度还是很不错的。   
+ 不过有的时候Iwara图片服务器也会被Ban(比如移动网),这时候就应该用到[miniProxy](https://github.com/joshdick/miniProxy)了(当然代码也得改,就是我太懒了,懒得改2333)
+ 
+# 缺点
+ 没有观看数/作者等信息、而且不知道Iwara的服务器在哪里,用这个速度浏览的速度也不会有太大提升……
+
+# 演示
+  <https://counter.mayx.me/iwaraview.php>   
+  如需用演示站下载,可复制地址,然后用Download Tool下载(因为演示站的IP和你的服务器IP不同):
+```php
+<h1>Mayx Iwara Video Download Tool</h1><form action="iwara.php" method="get" >
+
+Video URL: <input type="text" name="ID"><br>
+<input type="submit">
+
+</form>
+<br>
+<?php
+if ( $_GET["ID"] != '' ) {
+ $data = file_get_contents('https://ecchi.iwara.tv/api/video/'.trim(strrchr($_GET["ID"], '/'),'/'));
+ $file = json_decode($data,true);
+
+echo "Download URL:<br>https:";
+echo $file[0]['uri'];
+}
+?>
+```

File diff suppressed because it is too large
+ 61 - 0
_posts/2019-04-24-shell.md


+ 60 - 0
_posts/2019-04-27-antiban.md

@@ -0,0 +1,60 @@
+---
+layout: post
+title: Mayx的Anti-Ban计划
+tags: [Mayx, Anti-Ban]
+---
+
+经过研究,网关管理没什么好怕的!<!--more-->   
+
+# 起因
+  众所周知,由于某些原因,互联网总是被上层网关所限制,所以为了解决这个问题,我研究了一下Ban的原理和Anti-Ban的方法。
+  
+# Ban的原理
+  Ban网站的原理大概分为以下几点:   
+  1.DNS缓存污染(Ban域名)   
+  2.IP地址或传输层端口封锁(BanIP)   
+  3.TCP重置攻击   
+  
+  具体内容请自行前往[Wikipedia](https://zh.wikipedia.org/wiki/%E4%BA%92%E8%81%94%E7%BD%91%E5%AE%A1%E6%9F%A5
+)自行查询(这个链接可没有特指哦~),在此不再详述。
+  
+# Anti-Ban的方案
+## 针对Ban域名的方案
+  DNSSEC、DNSCrypt、DoT、DoH等等都可以解决这个问题,或者是不通过DNS,直接获得IP,然后发送Host头来获取网页内容也可以。我的想法是建立一个本地Proxy,先通过前面几种方案获得IP,然后发送Host,这里需要注意的是要通过HTTPS发送但是不使用SNI,因为SNI是不加密的,而且用代理就没必要一定要获得正确的证书。
+  防火墙会对SNI进行拦截,所以需要注意。
+  
+## 针对BanIP的方案
+  BanIP是真的绝,因为网络控制毕竟在网关,Ta要丢包谁也没办法,不过可以试试CloudFlare,CloudFlare可以不使用原网站的IP,而且很多网站都使用CloudFlare,所以BanCloudFlare的IP肯定不是好选择。
+  
+## TCP重置攻击
+  HTTPS基本上可以避免这个问题,除了会受SNI没加密的影响(TLS1.3可解),但是证书……没关系,靠本地Proxy对证书的要求不是很多。这个解决方案基本上就是加密,让网关不知道你在干什么,也就不能对你发RST包了。
+  
+# 计划
+  制作一个本地Proxy小程序,用Python是个不错的选择,绕过DNS和TCP Reset,再配上CloudFlare,基本上网关应该就Ban不了你了。   
+  不过Python的学习成本还挺高的,感觉比PHP难……回头有时间可以试试看。
+
+# 结果
+  Python对我来说果然还是太难了QAQ,所以,我觉得使用Nginx就够用了,配置如下:
+```
+location / {
+    proxy_pass https:// #填写目标IP;
+    proxy_redirect off ;
+    proxy_set_header Host #填写目标域名;
+    proxy_set_header X-Real-IP $remote_addr;
+    proxy_set_header REMOTE-HOST $remote_addr;
+    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
+    proxy_connect_timeout 300;             #跟后端服务器连接超时时间,发起握手等候响应时间
+    proxy_send_timeout 300;                #后端服务器回传时间,就是在规定时间内后端服务器必须传完所有数据
+    proxy_read_timeout 600;                #连接成功后等待后端服务器的响应时间,已经进入后端的排队之中等候处理
+    proxy_buffer_size 256k;                #代理请求缓冲区,会保存用户的头信息以供nginx进行处理
+    proxy_buffers 4 256k;                  #同上,告诉nginx保存单个用几个buffer最大用多少空间
+    proxy_busy_buffers_size 256k;          #如果系统很忙时候可以申请最大的proxy_buffers
+    proxy_temp_file_write_size 256k;       #proxy缓存临时文件的大小
+    proxy_next_upstream error timeout invalid_header http_500 http_503 http_404;
+    proxy_max_temp_file_size 128m;
+}
+```
+  果然,搞事情还是用自己熟悉的搞比较好~23333
+  
+# 事实
+  我果然还是图样图森破了~我想的方案其实就是[域前置](https://zh.wikipedia.org/wiki/%E5%9F%9F%E5%89%8D%E7%BD%AE),所以,该计划作废QAQ

+ 19 - 0
_posts/2019-05-03-origip.md

@@ -0,0 +1,19 @@
+---
+layout: post
+title: 如何“人肉”服务器?
+tags: [服务器, CDN, IP]
+---
+
+没错,我就是来安利Censys的!<!--more-->   
+
+# 起因
+   当今有不少网站都喜欢在外面套CDN,因为CDN既能加速,又能节约服务器带宽,还能保护服务器(没错,说的就是Cloudflare,不过不止Ta一家)。但是用了CDN后就不知道源站IP了,这还是挺糟糕的,那怎么办呢?
+   
+# 方案
+  不错,接下来该[Censys](https://censys.io)出场了,假如我对[ESUWiki](https://esu.wiki)感觉很不爽 ~~(我花火学园服务器加域名一年也花不了$100,你ESUWiki倒好,一年$1000+,是在搞什么?)~~ ,然后我发现Ta也套了一层Cloudflare。好,那么接下来就让我们打开Censys搜一下Ta吧!
+  以esu.wiki为关键词搜索,搜到IP:`149.56.110.126` 然后实际访问一下<https://149.56.110.126>,果然跳转到了ESUWiki,看来就是Ta了?   
+  不过好像也不完全是这样,Ta先跳到<https://weiki.esu.zone/>,然后才跳到<https://esu.wiki>,这就很麻烦了……算啦,反正这个服务器肯定和ESUWiki脱不了干系~
+   
+# 结果
+  通过Censys可以找到不少Cloudflare后面的IP,但也不代表这就没救了,只要设置防火墙白名单就能解决!   
+  Censys还有更多功能,像端口扫描之类的都可以,虽然也有其他类似的网站,不过既然Censys用的顺手, ~~而且名字又好听23333,~~ 所以,就好好用Ta吧!

+ 21 - 0
_posts/2019-05-12-baidu.md

@@ -0,0 +1,21 @@
+---
+layout: post
+title: 如何不使用百度App打开搜索结果?
+tags: [百度, 不使用]
+---
+
+  在中国,还是百度用的多啊~<!--more-->   
+  
+# 起因
+  不知何时起,百度的搜索结果几乎都要下载App才能查看,虽然不是很喜欢CSDN,但是百度全是CSDN的内容……百度用了很多年也实在是没心用其他的搜索引擎,但是百度App做的是公认的烂,实在不想用。   
+  对于这个问题,我该怎么办呢?
+  
+# 研究
+我发现,在百度跳转页面的地址里,有一个参数叫做`web_url`,这记录了实际要跳转的页面,虽然用插件应该更好,但是我不会~,所以我想了想,打算用JS解决这个问题。
+  
+# 代码
+  [baidu.html](https://raw.githubusercontent.com/Mabbs/mabbs.github.io/master/baidu.html)
+  
+# 用法
+  打开[Baidu移动页面转换器](https://mabbs.github.io/baidu.html),然后打开百度移动版搜索的结果,一般要求下载百度App的URL开头是`mbd.baidu.com`。复制这个URL,粘贴到转换器里,提交后就会自动跳转到真正的页面了。
+  

+ 37 - 0
_posts/2019-05-27-wikipic.md

@@ -0,0 +1,37 @@
+---
+layout: post
+title: 使用PHP批量下载Mediawiki站点的图片
+tags: [PHP, Mediawiki, 图片]
+---
+
+  又是万能的PHP!不过还是Mediawiki API的功劳<!--more-->   
+  最近我为了备份一下[某个Wiki站](http://zh.moegirl.org/)(Ta们把R18名字空间的东西删的一干二净 ~~后来才知道原来转移到了[一个Wiki上](https://www.hmoegirl.com/),真的是好久没关注了~~ ),然后学习了一下Mediawiki API来下载整个Wiki(Ta们把站点导出也给弄没了QAQ)   
+  文本很好下载,但是Mediawiki的图片我不知道存在哪里,API文档翻烂了也没找到把图片解析成地址的API,那怎么办呢?   
+  
+# 解决方案
+  “解析”?emmmm……parse?不错,正好有这么一个action,好的,那就这样搞吧!
+  
+# Code
+```php
+<?php
+set_time_limit(0);
+ignore_user_abort();
+$list = array("图片数组");
+
+    $arrlength=count($list);
+for($x=0;$x<$arrlength;$x++) {
+    $tmp = json_decode(file_get_contents("https://MediaWiki的地址/api.php?action=parse&text=[[File:".$list[$x]."]]&contentmodel=wikitext&formatversion=2&format=json"),true);
+    $preg='/src="(.*?)"/is';
+    preg_match($preg,$tmp[parse][text],$match);
+    $tt=$tt."
+    ".$match[1];
+}
+$markout = fopen("List.txt", "w") or die("Unable to open file!");
+fwrite($markout, $tt);
+fclose($markout);
+die("Finish");
+?>
+```
+
+# P.S.
+如果需要获取该Wiki的所有图片,可以从`api.php?action=query&list=allimages`这里获取。

File diff suppressed because it is too large
+ 19 - 0
_posts/2019-05-30-exam.md


File diff suppressed because it is too large
+ 227 - 0
_posts/2019-06-10-cheat.md


File diff suppressed because it is too large
+ 8 - 0
_posts/2019-06-11-encrypt.md


+ 130 - 0
_posts/2019-06-22-counter.md

@@ -0,0 +1,130 @@
+---
+layout: post
+title: 如何自己写一个博客计数器
+tags: [计数器]
+---
+
+  都怪LeanCloud,我得自己写计数器了!<!--more-->   
+  
+# 事件起因
+  我之前用的博客计数器是用的LeanCloud作为后台制作的计数器,然后嘛……代码是抄的。结果最近[LeanCloud凉了](https://blog.avoscloud.com/6841/),这让我无法忍受,之前的代码我也看不懂,改也不会改……   
+  那好吧,我只好自己写计数器了。   
+  于是我花了很长时间,自己写了一个计数器,另外还得把原来的计数器信息转移过来……
+  
+# 使用方法
+## 前端部分
+  主页显示点击数:
+```html
+{% raw %}Hits: <span id="{{ post.url }}" class="visitors-index" >Loading...</span>{% endraw %} 
+```
+  内页显示点击数:
+```html
+{% raw %} Hits: <span id="{{ page.url }}" class="visitors" >Loading...</span>{% endraw %} 
+```
+  JS代码:(需要Jquery)
+```js
+var auxiliaryHost = "你的域名";
+function showHitS(hits){
+    $.get(auxiliaryHost+"/counter.php?action=show&id="+hits.id,function(data){
+            hits.innerHTML=Number(data);
+        });
+}
+function showHitCount() {
+    var visitors=$(".visitors-index");
+    for(var i = 0; i < visitors.length; i++){
+        showHitS(visitors[i]);
+    }
+    
+}
+function addCount() {
+var visitors=$(".visitors");
+    $.get(auxiliaryHost+"/counter.php?action=add&id="+visitors[0].id,function(data){
+        visitors[0].innerHTML=Number(data);
+    });
+}
+if ($('.visitors').length == 1) {
+    addCount();
+} else if ($('.visitors-index').length > 0){
+    showHitCount();
+}
+```
+  2021.03.23更新:修复了一些BUG并且支持异步了
+
+## 后端部分
+  MySQL建表:
+```sql
+CREATE TABLE `counter` (
+  `url` char(50) NOT NULL,
+  `counter` int(11) NOT NULL,
+  UNIQUE KEY `url` (`url`)
+);
+```
+  PHP:
+```php
+<?php
+header('Access-Control-Allow-Origin: *');
+$con=mysqli_connect("MySQL地址","用户名","密码","数据库名"); 
+if (mysqli_connect_errno($con)) 
+{ 
+    die("连接 MySQL 失败: " . mysqli_connect_error()); 
+}
+
+$hid = md5($_GET['id']);
+
+if ( $_GET['action'] == "show" ) {
+
+$sql = "SELECT * FROM `counter` WHERE `url` = '".$hid."' ";
+$result = $con->query($sql);
+
+if ($result->num_rows > 0) {
+    while($row = $result->fetch_assoc()) {
+        echo $row["counter"];
+}
+} else {
+
+$sql = "INSERT INTO `counter` (`url`, `counter`)
+VALUES ('".$hid."', '0')";
+ 
+if ($con->query($sql) === TRUE) {
+    echo "0";
+}else{
+echo "Error";
+}
+
+}
+
+} elseif ( $_GET['action'] == "add" ) {
+
+
+$sql = "SELECT * FROM `counter` WHERE `url` = '".$hid."' ";
+$result = $con->query($sql);
+if ($result->num_rows > 0) {
+    while($row = $result->fetch_assoc()) {
+$sql = "UPDATE `counter` SET `counter` = '".($row["counter"]+1)."' WHERE `url` = '".$hid."'";
+$con->query($sql);
+        echo ($row["counter"]+1);
+}
+} else {
+
+$sql = "INSERT INTO `counter` (`url`, `counter`)
+VALUES ('".$hid."', '1')";
+ 
+if ($con->query($sql) === TRUE) {
+    echo "1";
+}else{
+echo "Error";
+}
+
+}
+
+
+} else {
+header("HTTP/1.1 301 Moved Permanently");
+header("Location: https://mabbs.github.io");
+}
+mysqli_close($con);
+```
+
+# 结果
+  看来还是自己写代码放心,至少服务是自己维护的,不像垃圾LeanCloud坏掉之后我就无能为力了……   
+  不过说实话我根本不会JS(虽然我之前说我学这个),编写之中遇到了不少问题,所以在此感谢各位帮助我的各位大佬们,让我最终完成了这个计数器。

+ 100 - 0
_posts/2019-06-24-up.md

@@ -0,0 +1,100 @@
+---
+layout: post
+title: 如何利用MySQL数据库制作一个图站
+tags: [MySQL, 数据库, 图站, PHP]
+--- 
+
+最近白嫖了一个500GB的数据库,想想怎么利用一下?<!--more-->    
+
+# Talk is cheap,show me the code
+
+  数据库建表:
+```sql
+CREATE TABLE `FileUP` (
+ `ID` int(11) NOT NULL AUTO_INCREMENT,
+ `Name` text NOT NULL,
+ `File` longblob NOT NULL,
+ `Size` int(11) NOT NULL,
+ PRIMARY KEY (`ID`)
+) ENGINE=InnoDB DEFAULT CHARSET=gb2312; 
+```
+
+  PHP代码:
+```php
+<?php
+$con=mysqli_connect("数据库地址","用户名","密码","数据库名"); 
+if (mysqli_connect_errno($con)) 
+{ 
+    die("连接 MySQL 失败: " . mysqli_connect_error()); 
+}
+
+if ( $_GET[ID] != '' ) {
+    header('Access-Control-Allow-Origin: *');
+    $sql = "SELECT * FROM `FileUP` WHERE `ID` = '".addslashes($_GET[ID])."' ";
+    $result = $con->query($sql);
+    if ($result->num_rows > 0) {
+        while($row = $result->fetch_assoc()){ 
+         Header ( "Content-type: application/octet-stream" ); 
+         Header ( "Accept-Ranges: bytes" ); 
+         Header ( "Accept-Length: " . $row["Size"] ); 
+         Header ( "Content-Disposition: attachment; filename=" . $row["Name"] );
+        echo $row["File"];
+    }
+} 
+    else {
+ header('HTTP/1.1 404 NOT FOUND'); 
+}
+} else {
+echo '<title>Mayx图床</title>
+<h1>Mayx图床</h1><hr>
+请选择需要上传的文件
+<form enctype="multipart/form-data" method="post" action="">
+  <input type="file" name="File" />
+  <input type="submit" name="submit" value="submit" />
+</form>
+<br />';
+if ( $_SERVER['REQUEST_METHOD'] == "POST" ) {
+ $error = $_FILES['File']['error'];
+ $tmp_name = $_FILES['File']['tmp_name'];
+ $size = $_FILES['File']['size'];
+ $name = $_FILES['File']['name'];
+ print("\n");
+ if ($error == UPLOAD_ERR_OK && $size > 0) {
+  $fp = fopen($tmp_name, 'r');
+  $content = fread($fp, $size);
+  fclose($fp);  
+  $content = addslashes($content);
+  $sql = "INSERT INTO `FileUP` (`Name`, `File`, `Size`)
+ VALUES ('".$name."', '".$content."', '".$size."');";
+  $con->query($sql);
+  $sql = "select @@identity;";
+  $result = $con->query($sql);
+while($row = $result->fetch_assoc()) {
+echo '上传完成,文件下载地址:<a href="//'.$_SERVER['HTTP_HOST'].$_SERVER['REQUEST_URI']."?ID=".$row['@@identity'].'" >'.$_SERVER['HTTP_X_FORWARDED_PROTO'].'://'.$_SERVER['HTTP_HOST'].$_SERVER['REQUEST_URI']."?ID=".$row['@@identity'].'</a>';
+}
+
+ } else {
+  echo "文件上传错误!";
+ }
+
+}
+
+echo '<hr />
+<center><a href="https://mabbs.github.io/">By Mayx</a></center>';
+
+}
+
+mysqli_close($con);
+```
+
+# 缺点
+  ~~MySQL保存文件有限制,好像只能存16MB左右😓~~(改max_allowed_packet就可以了)   
+  另外就是断点续传的问题,这个问题我回头再想一想吧。
+
+# 演示(随时GG)
+  <https://mayx.leanapp.cn/up.php>
+
+# 下一步改进的打算
+  ~~想搞成切片上传,这样就没有文件大小上传的限制了。   
+  不过这个好像得前端支持,先放个链接在这里吧:<https://github.com/fex-team/webuploader>~~    
+  不打算改进了……

File diff suppressed because it is too large
+ 39 - 0
_posts/2019-07-01-mabbs.md


+ 37 - 0
_posts/2019-07-02-encmail.md

@@ -0,0 +1,37 @@
+---
+layout: post
+title: 制作分布式加密邮件系统的计划
+tags: [分布式, 加密, 邮件, 计划]
+--- 
+
+  一个计划还没开始,又开始另一个计划了……<!--more-->    
+  
+# 计划原因
+  之前用了Telegram聊天,里面有一个私密通信的功能。听说这个功能可以让服务端没法知道使用者发送的信息。不过Telegram在国内使用限制比较多,所以我打算用HTML+Javascript+PHP+MySQL写一套自己的私密通信系统。   
+  但是As We All Know,某些国家有网络审查,提供这种服务的肯定会被审查的。既然我们要做这个东西,就不能让它不稳定。所以我想把这个项目搞成分布式的那种,确保通信可以成功。(来自Mastodon的思路)   
+  
+## Q&A
+  1. 为什么使用PHP?   
+  之所以用PHP作为后端语言的原因呢…… ~~当然因为PHP是世界上最好的语言!(被打死)~~ 因为PHP的程序好搭建,而且很多虚拟主机商都用的是PHP,这样即使小白也能搭建,就能让分布式节点更多了。 ~~(明明主要原因是我只会PHP 23333)~~   
+  2. 为什么我要做成邮件系统而不是聊天系统呢?   
+  因为聊天就要用Websocket或者是AJAX之类的,但是我不会……我只能把信息都存在服务器里,有人访问再显示出来……   
+  3. 已经有PGP了,为什么还要重复造轮子呢?   
+  因为PGP是软件,小白用起来不太方便,这个是网站,可能相对更简单一些。 ~~(重复造轮子能有什么理由)~~
+
+# 项目技术原理
+  1. 所谓的私密通信主要用的就是非对称加密,比如说RSA什么的。所以这个项目同样如此,也使用RSA作为主要加密算法。   
+  2. RSA虽然很不错,但是似乎加密速度比较慢?(我看HTTPS上介绍的是这样)所以内容用AES加密,用随机数做密码,一方用公钥去加密这个密码,另一方用私钥解密获得密码,然后再利用这个密码进行对称加密传输(和HTTPS差不多)。   
+  3. 如果上述操作都是服务端进行,那这些就都没什么意义了,所以我们要在客户端进行。像Javascript进行加密完全没有问题,所以除了传输,其他加密都是在浏览器上进行。   
+  
+# 项目细节
+  为了方便通信,公钥是要留在服务器上的,所以要搞一个用户系统,存储用户的公钥。在注册的过程中公私钥生成都是在客户端进行,确保服务端得不到用户的私钥,注册的过程中要将用户名和公钥上传至服务器保存。这就是为什么要用到MySQL。   
+  登录时,先输入用户名,服务器使用用户名查找到对应的公钥,然后生成一个随机数,用公钥加密,发送给客户端,客户端用私钥解密,获得随机数,返回给服务器进行登录。   
+  私钥登录后要持续保存,这时肯定不能用Cookie,我们可以用localStorage,然后客户端一定要做好防XSS,不然一切都没有了。   
+  在发送的时候,我们可以搞一个类似Mastodon的用户名,两个@实在是太蠢了,就和E-mail一样,就搞成user@example.com的形式吧   
+  在发送时客户端先检查对方服务器能否连接,如不能则测试通过服务器连接,如果服务器连接失败再使用其他节点连接(服务器内置),如果还是不行,用户可以自行输入节点,还是不行,投递失败。   
+  连接成功后对方服务器查询对应用户的公钥,返回给客户端,客户端用这个公钥加密AES密码,用AES密码加密内容,然后再传给对方服务器保存。   
+  查看邮件就用私钥解密AES密码,然后解密内容。   
+  
+# 问题
+  如果对方服务器被攻陷,公钥被改成攻击者的,那不就没用了吗?虽然可以用指纹解决,但是这对小白来说似乎有些困难……HTTPS用的是第三方权威解决这个问题,我们就没办法了……   
+  最大的问题是,什么时候开始动工?(笑)

+ 23 - 0
_posts/2019-07-15-encmail.md

@@ -0,0 +1,23 @@
+---
+layout: post
+title: EncMail-Project Part 1 - 准备阶段
+tags: [分布式, 加密, 邮件, 计划]
+--- 
+
+  我是不会承认自己咕咕咕的!<!--more-->    
+  参照:[初计划](/2019/07/02/encmail.html)
+  
+# 准备的内容
+  最终经过多方研究,我打算用[Web Crypto API](https://developer.mozilla.org/zh-CN/docs/Web/API/Web_Crypto_API)作为主要的实现方法。   
+  不过用这种API的兼容性并不怎么好……我的博客之所以用了各种各样的JS库也是为了兼容性 ~~(是不会写吧233333)~~   
+  其实主要原因是因为我在网上搜不到哪个JS库能生成密钥对……之前有看到过有一个名叫jsencrypt的库,可惜只能加解密,不能生成密钥对……   
+  说实话我从来都没有用过WebAPI,所以还得好好看看文档。但是这个破烂文档连例子都没有,这让人很难办,搜也搜不到有用的内容,而且我的英语并不算好,也不太习惯上[Stack Overflow](https://stackoverflow.com/) ~~(不行,我要把锅推给某国的网络审查)~~ 。正是如此,这个项目制作起来可能会相当花时间。   
+  另外界面我打算用MDUI,那个文档看起来还挺简单。本来我没打算做一个好看的页面,就像之前制作的[Iwara Downloader](/2019/04/13/iwara.html)一样,打算套个表格完事。但是既然这个UI看起来挺简单,那就试试这个吧,反正我也不考虑兼容性问题了,WebAPI都用上了,再加一个这个也不算什么吧。   
+
+# 对计划的补充
+  计划的名称我打算命名为EncMail-Project ~~(看起来有点俗……)~~ ,不过这都不重要。   
+  关于登录方面,我后来又想了想,没有人会记私钥的,所以为了方便使用,我打算通过AES加密私钥,和公钥一起上传到服务器上保存。登录时把加密的私钥和被公钥加密的令牌下载下来,然后输入密码解密获得私钥并解密令牌。   
+  而之前想到的公钥被修改的问题,我想了想,那还是加上指纹吧(就是Hash啦),用SHA-256算法算出公钥的指纹,然后发送者在发送时自己对照一下就可以了(好像是`SubtleCrypto.digest()`?emmmm……这个文档没有翻译……)。   
+  另外为了安全,私钥我打算存到`sessionStorage`里,以减小私钥泄露的危险。   
+  
+今天就先到这里吧!

+ 16 - 0
_posts/2019-07-25-college.md

@@ -0,0 +1,16 @@
+---
+layout: post
+title: Mayx终于考上大学了
+tags: [Mayx, 大学]
+--- 
+
+  真是Amazing!<!--more-->
+
+# Where am I?
+  这次我考到成都了,考了一个网络工程专业 ~~(说不定就成装宽带的了23333(不过中国移动是真的垃圾,就是以后装宽带也不去移动))~~   
+  不过我看这个专业的以后当运维的比较多,那如果真是这样,以后每年的昨天(7月24日)就可以过节了23333   
+
+# How about it?
+  考上了作为一个原三本的院校,其实也不能算很好,但是相比于[经常犯智障的我](/2019/05/30/exam.html),也算是一个不错的结果了。
+
+  总之,以后我应该就能了解更多关于网络方面的知识了。

+ 20 - 0
_posts/2019-08-05-blilblil.md

@@ -0,0 +1,20 @@
+---
+layout: post
+title: 记一次办理22卡的经历
+tags: [Mayx, 大学]
+--- 
+
+  我生气了!<!--more-->   
+
+# What happened?
+  某天,Mayx正在使用Bilibili,手抖按到了一个广告上,看起来好像是办理Bilibili的2233和小电视卡的。Ta让我答了几道题之后把我的个人信息骗走了~~(还不是自己主动输进去的2333)~~    
+  之前我办过米粉卡,那个是真的不错,三个月流量不限,而且一分钱不花。我看这个卡貌似提到了免费,所以就办理了。   
+  过了一两天,中国联通给我打来了电话,让我带着身份证下楼办卡,我也没多想,就下去了。   
+  没两分钟,我就被骗走了50CNY(QAQ)   
+  原来所谓的免费只是首月免费,广告里可没提要多交钱啊!   
+  不过算了,既然已经办了,那就用吧,未来的五个月我可以随便看番了……这样想的你可真是大错特错,要知道免流卡用够40GB的流量就会限流,速度慢到看360p都会卡,我平时都看的是1080p的视频,看大概2小时就要用掉1GB的流量,一个月可不只有40个小时,我每天如果看四小时就要120小时,即60GB,那么之后的这几十个小时就只能看360p还卡的视频了……   
+  总的算下来就是每月10CNY不限流看Biliblil的视频,5个月以后我就把这张卡扔了吧。
+
+# 感想
+  ~~不错,广告你赢了我一次,但总有一天你一定会后悔!~~(我的小米手机的广告已经被我铲除干净了)   
+  真希望有一天所有的广告用户都有关闭的权利!(VIP除外)

+ 21 - 0
_posts/2019-08-17-memory.md

@@ -0,0 +1,21 @@
+---
+layout: post
+title: 记一次悲惨的加装内存的事故
+tags: [悲惨, 事故, 内存]
+--- 
+
+  这……大概就是命运吧……QAQ<!--more-->   
+
+# 悲惨的开端
+  因为学校要求使用8GiB运存的电脑(难不成是想用VS?),然后我的笔记本电脑只有4GiB。我考虑了一下,买一条内存条也不贵,于是我在某宝上买了一个和我笔记本电脑内存型号相同的内存条。   
+  在到货的前几分钟,我就开心的把电脑主板提前拆出来了,等我一拿到取件码,就去把内存条取了回来 ~~(顺便得到一堆泡泡纸,血赚23333)~~   
+  等我安好内存条,我试了试裸板开机,不错,看来至少主板没有被我搞坏,然后我连上键盘和显示器之后,BIOS也正确的读取到了内存条,看来是成功了。   
+  我这么边想着就边把电脑往回装,装着装着结果电池接口突然开始冒烟,吓得我立即把电池拔了,之后我继续装,总算是没看到更多异常情况。  
+  等我全部安装完成后电脑倒是也正常开机了,操作系统也成功的读取到了内存,而且是同一型号的内存条,应该也成功的组成了双通道吧,我试了试整体电脑的操作,倒是确实比之前流畅了一些。
+
+# 噩梦开始
+  过了几个小时之后,我发现电池灯还在显示充电状态,这时我慌了,我打开电脑发现充了半天电,电量没有一点点变化,又过了几个小时,电池灯开始不停的闪烁,看来是翻车了。后来我把电池又重新安装了一遍,但是貌似还是没有什么改变,但是把外接电源拔掉仍然可以正常使用,所以看来是充电芯片在之前冒烟的事故中灰飞烟灭了QAQ。
+
+# 感想
+  我自认为我安装的时候也没有什么可能会让电脑出现这种问题的操作啊……难不成是因为我先安装了电池的问题?也许电脑在插完所有其他线的时候不应该插电池线吧…… ~~总之,这就是命运吧……QAQ~~    
+  最近运气都不怎么好,希望这糟糕的运气不会影响我接下来科目二的考试……

+ 18 - 0
_posts/2019-08-24-sth.md

@@ -0,0 +1,18 @@
+---
+layout: post
+title: 假期总结
+tags: [假期, 总结]
+--- 
+
+  这个假期还真是碌碌无为啊……<!--more-->   
+
+# 这个假期做了什么?
+  我感觉什么也没做,也许到了假期之后确实就会变成这样吧,在高考前我甚至都在兴致勃勃的学怎么写博客,[学MediaWiki API](/2019/05/27/wikipic.html),学PHP……但是一到了假期,反倒碌碌无为,什么也不想干……即使之前定了很多计划,到了假期却没有一点点干劲……   
+  大概这就是人吧,忙的时候想忙些闲事,闲的时候……就真闲了,没有一点干劲……   
+  但是吧,要说干了些什么,也不是没干,至少我把科目一和科目二过了,然后[给电脑加装内存条](/2019/08/17/memory.html)还给装坏了……拿去让维修电脑的修还没修好,要换主板……还好还能用,就勉强先这样用吧。   
+  另外还去献了个血,感觉献血对我也没什么太大伤害所以就去献了一下,不过第一次献血还是挺害怕的,尽管之前有在学校体检抽血的经验,但是毕竟还是会疼啊……不过过了几天之后就好了,针孔也不是很明显,顺便去网上查了一下血检结果,是一切正常,看起来不错。   
+  前几天我看到中国银行有办以天依为主题的借记卡 ~~(这都是3月份的活动了吧……)~~ ,于是就去申请了一张。但是我马上就要开学走了,也不知道能不能在我走之前送到我的手里……   
+  对了,这个假期我还在闲鱼上卖了些东西,一个是血亏价(60CNY)卖出去的4GiB DDR4的内存条(还包邮,就是说我只赚了48CNY😭),还有一个锤子T1(SM705)手机,那个买家事还挺多,200CNY买一个原价4000CNY的手机还觉得边角磕了碰了,然后为了惩罚我,还要让我等到10天后系统自动确认收货……在闲鱼上卖东西真是让人难受啊(T_T)
+  
+# 总结
+  这个假期可算是把我玩废了,无论是身体还是心理……希望我作为人类能让我发挥这快速适应的能力,让我快速恢复到正常状态!

File diff suppressed because it is too large
+ 31 - 0
_posts/2019-09-20-start.md


+ 83 - 0
_posts/2019-09-28-python.md

@@ -0,0 +1,83 @@
+---
+layout: post
+title: Python学习笔记 - Turtle
+tags: [Python, 学习笔记, Turtle, Logo, Tkinter]
+--- 
+
+  没想到我终有一天也得学Python了……<!--more-->   
+  
+# 第一课!Turtle
+  我以为我们老师会从Python的基本语法开始教起,不过事实证明我想错了,我们老师打算把我们当做小学生看,然后教 ~~Logo语言~~ 类似Logo语言的Python库,Turtle。   
+  Turtle貌似是基于Tkinter的库,Ubuntu上带的Python默认没有装Tkinter,结果我还得自己装一下……   
+  老师给我们布置了两个作业,一个是画一个心形,另外是画一个正方形。在开始之前,我也想的这个库就是个Logo语言,也没想着在网上看看这个东西支持什么方法,画正方形也很简单,就是向前向左……执行4遍。很快,我就用循环写出了这个东西:
+```python
+import turtle
+i=0
+while i<4 :
+	turtle.forward(50)
+	turtle.left(90)
+	i=i+1
+```
+  看着这段代码,让我回想起了我的小学时光 ~~(一段不堪回首的往事23333)~~ 既然能画出正方形,那么圆也很简单了,我们可以把圆看成一个无限多边形,那么画圆我们可以这样:
+```python
+import turtle
+i=0
+while i<360 :
+	turtle.forward(2)
+	turtle.left(1)
+	i=i+1
+```
+  画完圆之后我又打算画心形,不过老师布置的是在终端中显示心形,就像这样:
+```python
+print(""" ** **
+*  *  *
+ *   *
+  * *
+   *""")
+```
+  不过这个感觉没什么意思,我想我可以试试在Turtle里画一个心形。在画之前,当然应该上网查一下Turtle还有什么用法,结果一查以后我就自闭了……画正多边形根本不用一步一步走,有一个叫做circle的方法可以直接实现,比如画正方形可以这样:
+```python
+import turtle
+turtle.right(45)
+turtle.circle(100,360,4)
+```
+  ……这可真是令人难受……不管了,我先画个心形吧,我捡起了我曾经的三角函数的知识,算了一下我要转的角度和长度,最终写出了这样的东西:
+```python
+import turtle
+turtle.color('red','red')
+turtle.filling()
+turtle.begin_fill()
+turtle.left(90)
+turtle.circle(50,180,180)
+turtle.left(30)
+turtle.forward(200)
+turtle.left(120)
+turtle.forward(200)
+turtle.left(30)
+turtle.circle(50,180,180)
+turtle.end_fill()
+input()
+``` 
+  当然,我不知道心形的定义是什么,所以也不知道心形是怎么组成的,我想象的大概就是两个半圆和一对等腰拼出来的吧,不过最终画出来的心形是真的丑……   
+  最后我在网上又查了一下其他人写的,然后继续自闭……   
+  其他人的心形:
+```python
+from turtle import *
+def curvemove():
+    for i in range(200):
+        right(1)
+        forward(1)
+color('red','pink')        
+begin_fill()
+left(140)
+forward(111.65)
+curvemove()
+left(120)
+curvemove()
+forward(111.65)
+end_fill()
+done()
+```
+
+# 总结
+  虽然我不喜欢看文档,但是遇到新的东西还是查一下比较稳妥啊!

+ 99 - 0
_posts/2019-10-21-python.md

@@ -0,0 +1,99 @@
+---
+layout: post
+title: Python学习笔记 - 求质数
+tags: [Python, 质数, 学习笔记]
+--- 
+
+  讲真,我酸了……<!--more-->
+  
+# 起因
+  在学习Python的过程中,我和同学举行了一个比赛,大概内容是用Python做一个时间复杂度最低的质数生成器。   
+  在学校里就是有个好处,学校网络上知网下论文是免费的,我大概的查了一下,好像用埃氏筛法的效率比较高。   
+  以前我用Linux Shell也写过一个:
+```shell
+#!/system/bin/sh
+max=1000
+list="2"
+rlist="2"
+i=3
+while [ $i -lt $max ]
+do
+[ "$(
+echo "$list"|while read a
+do
+[ "$(($i%$a))" == "0" ]&&{
+echo "1"
+break 1
+}
+done
+)" == "1" ]||c=$i
+
+[ "$bj" == "" -a "$c" != "" ]&&{
+[ "$((${c}*${c}))" -gt "$max" ]&&bj="1"
+}
+
+[ "$c" == "" ]||{
+[ "$bj" == "1" ]||{
+list="$list
+$c"
+}
+echo "$c"
+}
+c=""
+i="$(($i+1))"
+done
+```
+  不过效率极低……因为原生Shell是不支持数组之类的东西,所以其实并不能完全使用埃氏筛法……   
+  
+# 使用Python做一个
+  当然Python还是可以用的,于是我理解了一下,做了一个出来:
+```python
+maxprime=100000
+rprimeset=set(range(2,maxprime+1))
+lprimeset=set()
+lastprime=0
+while lastprime<=maxprime**0.5:
+        lastprime=min(rprimeset)
+        rprimeset=rprimeset-set(range(lastprime,maxprime+1,lastprime))
+        lprimeset.add(lastprime)
+primelist=sorted(list(rprimeset|lprimeset))
+print(primelist)
+#print(primelist,file=open(__file__[:__file__.rfind("/")]+"/prime.txt",'w+'))
+```
+  这个效率确实比Shell做的好太多了,而且看起来也清晰易懂。在我的电脑上,1000000的质数只需要4s就能算出来   
+  
+# 结局
+  不过我后来在某百科上查了一下他们用埃氏筛做的Python版本……然后我就酸了……他们的代码在我的电脑上只需要0.6s就能跑完1000000的质数……而且我估计他们的空间复杂度还比我小……
+```python
+  #    python 原生实现
+ 
+def primes(n):
+    P = []
+    f = []
+    for i in range(n+1):
+        if i > 2 and i%2 == 0:
+            f.append(1)
+        else:
+            f.append(0)
+    i = 3
+    while i*i <= n:
+        if f[i] == 0:
+            j = i*i
+            while j <= n:
+                f[j] = 1
+                j += i+i
+        i += 2
+ 
+    P.append(2)
+    for x in range(3,n+1,2):
+        if f[x] == 0:
+            P.append(x)
+ 
+    return P
+ 
+n = 1000000
+P = primes(n)
+print(P)
+```
+  感觉好难受,每次在网上搜的代码都比我写的好……算了,反正我也是在学习嘛。   
+  后来我听说用欧拉筛法的效率更高……可惜我看完后不太理解……质数算法可真是复杂啊……

+ 37 - 0
_posts/2019-11-01-python.md

@@ -0,0 +1,37 @@
+---
+layout: post
+title: Mayx应聘失败(Python版)
+tags: [应聘, Python, 面向时间]
+---
+
+既然最近学了Python,那就去应聘一下Python程序员吧XD<!--more-->   
+
+[上次去面试运维失败了](/2019/01/27/shell.html),这次不能这么丢人了。   
+然后那个面试官居然又让我写排序的程序23333
+
+Mayx想了想,写出了以下代码:
+```python
+a=[1,2,3,5,4,9,10,8,5]
+import threading
+import time
+def counting(i):
+    time.sleep(i)
+    print(i)
+for i in a:
+        threading.Thread(target=counting,args=(i,)).start()
+```
+执行效果:
+```
+1
+2
+3
+4
+5
+5
+8
+9
+10
+```   
+然后,Mayx被赶出来了……   
+我写的代码明明可以执行,效果也没问题,居然赶我出来,这一定是个垃圾公司!   
+后来才知道,他们又想让我回答`sort()`,怕是同一家公司(笑)

File diff suppressed because it is too large
+ 16 - 0
_posts/2019-11-18-archive.md


File diff suppressed because it is too large
+ 67 - 0
_posts/2019-11-21-enc.md


+ 28 - 0
_posts/2019-12-04-abuse.md

@@ -0,0 +1,28 @@
+---
+layout: post
+title: 废人的研究
+tags: [废人, 研究]
+---
+  我是废人吗?……不,我是研究者!<!--more-->~~(没有意义的解释23333)~~    
+  
+# Part1.Are we real?
+  你是真实的吗?如果你玩过VR就会感觉到现实与虚拟世界的差距,感受到差距的你很开心,因为你觉得现实世界无可替代,虚拟的世界永远是虚拟的。   
+  然而虚拟与现实之间的差距就仅仅是延迟而已,之所以现实这么美好就是因为现在的科技还做不到那么低的延迟。   
+  我要怎样证明这一点呢?很简单,既然科技的延迟下不来,那就提高自己感受的延迟吧。怎么做?去熬夜吧,熬夜会影响到神经信号的传输,这样就可以提高延迟而感受到这不真实的世界。   
+  ~~(洗白熬夜23333)~~
+  
+# Part2.How to denoise
+  熬夜都熬过了,精神一定很不好吧?这时候来点外部的喧闹让人崩溃一下不过分吧?   
+  怎么可能?现在怕是想毁灭世界的心都有了吧?不过我们不能真的毁灭世界,甚至连改变都不可以,那么我们怎么消除这个噪声呢?
+  降噪耳机?耳塞?太low了,那些东西平时戴上又不舒服,而且也不便宜。那么怎么做呢?   
+  很简单,人感受到令人心烦的噪音其实不是声音有多大,也不是随机的声音,而是大脑不由自主处理的声音,比如人声。   
+  在没睡好的情况下听到人讲话真的会很烦,但是毕竟我还要在这个社会生存,总不能把人都消灭吧?何况我也没有这个能力。   
+  那么我们就可以通过干扰人声的方式来解决这个问题,播放更大的噪声压过他的声音吧!如果他要是敢反抗,正好可以让他闭嘴,而如果不行,那就继续,只要大脑不再处理人声,就不会那么难受了。   
+
+# Part3.How to anti sound record
+  说到噪音降噪,我就回想起 ~~(251?)~~ 反录音了,反录音的原理好像和这个类似,就是通过放一些人听不到的噪音来干扰录音设备。因为录音设备是可以记录人听不见的声音,所以就会被干扰。   
+  不过人听不到的声音机器在回放的时候按理来说那些听不到的声音应该还是听不到啊,那反录音是怎么做的?真的是难以理解,既然人能听到,那么就相当于人把它记录了,那么机器应该同样能正常的记录吧?真的是难以理解……   
+  
+# Part4.Summary
+  跑题了 ~~(正说废人呢!)~~ ……总之,熬夜带来的问题还是挺多的,只是某些问题 ~~(都是些闲事)~~所迫,不得不……emmmm……总之如果能早点睡觉就好了。   
+  另外也希望自己不会被一些噪音搞到心烦。

File diff suppressed because it is too large
+ 62 - 0
_posts/2019-12-16-ctf.md


File diff suppressed because it is too large
+ 28 - 0
_posts/2019-12-17-game.md


File diff suppressed because it is too large
+ 46 - 0
_posts/2019-12-31-summary.md


File diff suppressed because it is too large
+ 44 - 0
_posts/2020-01-05-devops.md


File diff suppressed because it is too large
+ 30 - 0
_posts/2020-01-21-devops.md


File diff suppressed because it is too large
+ 43 - 0
_posts/2020-02-02-old.md


+ 54 - 0
_posts/2020-02-10-tieba.md

@@ -0,0 +1,54 @@
+---
+layout: post
+title: 如何不使用贴吧App查看贴吧
+tags: [贴吧, PHP]
+---
+
+  为自己手机的最后一片净土而战(ง •_•)ง<!--more-->    
+  
+# 起因
+  由于某些原因,我还是很想上百度贴吧看看的。虽然一些大公司很流氓,但也正因为他们是大公司,所以积累的信息才更多……    
+  一年前,我因为使用百度搜索时打不开搜索内容,所以不得不[使用了一些办法](/2019/05/12/baidu.html)来解决这个问题。不过看起来百度也知道自己这么做是在砸自家招牌,所以后来这个问题百度貌似他们自己解决了。   
+  而现在呢,我又因为某些原因需要使用百度贴吧,当然安装贴吧App就是在侮辱我的手机。一般来说,遇到这个问题只要用桌面版的贴吧就好了,但是很遗憾的是我用的浏览器是基于WebView的Firefox Rocket,不支持更改UA……既然如此,我只好运用我编程的技能解决这个问题了。   
+
+# 解决方案
+  在正常情况下用手机看贴吧的贴子是看不到全部内容的,只能看到前两楼,当然这样的贴吧就是废物,要想看剩下的内容就需要下载贴吧App了。不过以前贴吧有一个极简版,虽然很简陋,但是也够用了。然而很糟糕的是,百度他们不允许极简版列出贴子的标题了,如果用极简版看贴吧的话是看不到贴子的列表的。   
+  不过如果知道贴子的ID,貌似还是能正常打开的,所以我们只需要获得到贴子的列表和ID就OK了。   
+  经过我的研究,只要在`http://tieba.baidu.com/mo/q-----1----/m?kz=`后面加上贴子的ID就能看到贴子的全部内容,只是这个貌似不能发帖,不过我也不需要这个就是了。   
+  于是我参考了以前[Iwara Viewer](/2019/04/13/iwara.html)的代码,写出了最终的代码。
+  
+# 代码
+```php
+<?php
+if (isset($_GET["kw"])) {
+if (!isset($_GET["pn"])) {
+    $_GET["pn"] = 1;
+}
+$url = 'https://tieba.baidu.com/f?kw='.iconv("utf-8","gb2312",$_GET["kw"]).'&pn='.($_GET["pn"]-1)*50;
+$str = file_get_contents($url);
+$preg='/<a rel="noreferrer" href="\/p\/(.*?)" title="(.*?)" target="_blank" class="j_th_tit ">/is';
+preg_match_all($preg,$str,$match);//在$str中搜索匹配所有符合$preg加入$match中
+echo "<title>Mayx Tieba Viewer</title><h1>Mayx Tieba Viewer</h1><hr />";
+if ($http_response_header[0] != "HTTP/1.0 200 OK"){
+    echo "<b>Warning</b>:It's Not Tieba Name<br>";
+}
+for($i=0;$i<count($match[0]);$i++)//逐个输出超链接地址
+{
+    echo "<a href=\"http://tieba.baidu.com/mo/q-----1----/m?kz=".$match[1][$i]."\">".$match[2][$i]."</a><br>";
+}
+echo "<hr><a href=\"?pn=".($_GET["pn"] + 1)."&kw=".$_GET["kw"]."\" >Next Page</a>";
+} else {
+echo '<title>Mayx Tieba Viewer</title><h1>Mayx Tieba Viewer</h1><hr><form action="" method="get">Please Input Tieba Name:<input type="text" name="kw" required><input type="submit" value="Submit"></form>';
+}
+```
+   虽然说用JavaScript貌似也可以做到,可惜我学艺不精,只好用PHP解决了。
+   
+# 演示
+  <https://yuri.gear.host/tiebaview.php>   
+  
+# 后记
+  P.S.这个东西是专门为了手机设计的,所以电脑完全没必要使用这个看帖子。   
+  另外就是希望百度做个人吧……HTML肯定是能实现相应功能的,非要人下载App,虽然我也知道是为了利益,但是这真的是太恶心了……另外……知乎也一样,太恶心最终一定会流失掉用户的。
+
+# 真相
+  我不知道的是很多的小程序上也有贴吧,像微信上也有,白做了😂……算了,就当练手+氵一篇了23333

File diff suppressed because it is too large
+ 38 - 0
_posts/2020-02-15-phone.md


+ 31 - 0
_posts/2020-02-18-browser.md

@@ -0,0 +1,31 @@
+---
+layout: post
+title: Mayx的浏览器使用史
+tags: [浏览器]
+---
+
+  我感觉遇到了不错的浏览器<!--more-->    
+  
+# 最初的改变
+  以前我对浏览器没有什么要求,所以一般都用的是系统自带的浏览器。但是最近几年各大厂商都开始犯病,在浏览器里疯狂加广告,所以没办法,我只好选择其他的浏览器。   
+  我选择浏览器也是近几年才做的事,因为厂商也是最近几年才开始在系统里加广告。   
+  我最初的选择是Firefox,因为我听说Firefox的历史悠久,从很久以前浏览器出现的时候Firefox就已经出现了,只是当时它好像叫Netscape来着。总之就是对Firefox有一些好感,然后就一直用Firefox了,即使我后来换了手机,也一直用的是Firefox。   
+
+# 意外发生
+  不知道我是怎么了就手残了,偶然有一次不知道我是想清除缓存呢还是想强行停止Firefox,结果手残点到卸载上了……而且更加不可思议的是下一步我还点到确认键上了……结果我的浏览器就随着我的一大堆书签消失不见了……   
+  当时貌似我周围没有WiFi,只有流量,再下一遍Firefox有点太费了,不过我在搜索Firefox的时候发现了Firefox Lite(原Firefox Rocket),大小只有几MiB,是给中国和印度的特供版。我查了一下貌似是北京谋智公司搞的,说实话我不太放心这个公司,但是当时也没有想太多,然后就一直用着了。   
+  不过这个浏览器的功能是真的少,垃圾的以至于UA也改不了,网页源代码也看不了,更不用说什么插件啥的……不过我想我不过是用手机上个网罢了,也不打算干什么复杂的事情,所以也就忍了。   
+  后来想上贴吧,因为这个破浏览器不能改UA,所以我只好[使用PHP](/2020/02/10/tieba.html)解决这个问题。
+
+# 偶然遇见
+  我后来想了想,也许上不了贴吧是我的问题,解决方案可能比我想象的更多,比如说换浏览器之类的,不过问题已经解决了我也就没多想。   
+  不过没过几天我偶然看见了一个浏览器,叫做Via,大小只有几百KiB,功能还比Firefox Lite多。这时候我就没理由不换浏览器了。   
+  换成Via后发现这个功能比我想象的更多,不仅主页可以自定义,而且可以自定义UA、查看源代码、屏蔽广告,也可以装插件,这个功能甚至比Firefox本身都多了,大小还小了几十倍。   
+  不仅如此,里面的插件完美的解决了贴吧的问题,这再一次打击了我写垃圾代码的信心lol。   
+  然后我觉得我以后应该不会再换浏览器了。
+
+# 技术分析
+  我实在是不能理解某些大厂的做法,像华为自带的浏览器是UC提供的,内核还是Webkit,小米的浏览器是直接是Chromium套了层壳,顺便还加了一堆广告,结果Chromium还是32位的。而腾讯系的软件也是,搞的什么X5内核,结果还是基于Webkit的,越改越烂。   
+  明明谷歌为Android系统配了WebView,为什么就不能好好用呢?这个WebView基于的还是最新的Chrome呢,全球最先进的浏览器,这些厂商非要自己瞎搞,增加了空间还降低了性能,然后还不符合标准,真不知道他们到底在搞什么。   
+  像Firefox Lite和Via浏览器就是基于WebView的,空间又小,性能又好,而且到时候升级只用升WebView就OK了。后来我发现用腾讯X5内核的还不只是腾讯系软件,连哔哩哔哩居然都在用?真是可耻啊!不过还好这个内核腾讯还留了一个后门,好像是<http://debugtbs.qq.com>,用这个就可以不使用X5内核而改用WebView内核了。   
+  感觉真是不理解国内的某些互联网公司在搞什么操作,也许就是这个原因,Firefox才会为中国和印度提供特供版的浏览器吧23333

File diff suppressed because it is too large
+ 118 - 0
_posts/2020-03-01-plan.md


File diff suppressed because it is too large
+ 29 - 0
_posts/2020-03-08-oldphone.md


File diff suppressed because it is too large
+ 50 - 0
_posts/2020-03-12-novel.md


File diff suppressed because it is too large
+ 7 - 0
_posts/2020-04-06-self.md


File diff suppressed because it is too large
+ 125 - 0
_posts/2020-04-19-exam.md


File diff suppressed because it is too large
+ 23 - 0
_posts/2020-04-21-laptop.md


File diff suppressed because it is too large
+ 28 - 0
_posts/2020-05-07-consume.md


+ 25 - 0
_posts/2020-05-20-memory.md

@@ -0,0 +1,25 @@
+---
+layout: post
+title: Re:加装内存
+tags: [内存]
+--- 
+  论头铁是什么感受<!--more-->    
+
+# 头铁的开端
+  在去年的8月份我给我的旧笔记本加装了一次内存条,结果……[很悲惨](/2019/08/17/memory.html),把电脑的充电功能搞坏了。   
+  几个月后的今天,我不记过去的痛苦,头铁的为我的[新笔记本电脑](/2019/08/17/memory.html)加装了一次内存条……   
+  本来我是打算用几年以后直接加32GiB的内存,但是最近装了个虚拟机,发现8GiB的内存不怎么够用,Windows自己就占用了一半的内存,结果我用Ubuntu虚拟机开动态内存需求是5GiB的内存。虽然心里很难受,但是想了想还是加吧,花钱让人难受,但是花钱也是为了让人不难受啊……   
+  不过现在问题不在花钱,在于自己手残,但是又不想请人来装。虽然[上一篇文章](/2020/05/07/consume.html)我还在说自己花同样钱或精力做不到的事情就让别人来做,不过那就是个垃圾文章,我肯定是头坏了才会写出那种垃圾文章。现在我已经知道了,合不合理不在于省钱,而是脑子正不正常。   
+  不过我想了想,之前的笔记本之所以装坏了是因为它是商务本,内存条在C面,要装得把主板拆下来所以才搞出了问题。新电脑是游戏本,不用拆掉主板也能加内存,也许成功率会高一些吧……    
+
+# 坎坷的装内存之旅
+  我上周就已经打算装,已经在网上下单买内存了,但是发生了很糟糕的事情,店家给我发错了货,我买的是3200MHz频率的内存条,结果他们发成了2666MHz的……当然这个东西我直接看内存条其实是不会看的,不装到电脑上我也不知道。   
+  内存拿到手之后,我打算速战速决,后盖打开、电池拔掉、内存插上、电池插上,然后就直接装后盖了,真不知道该说是头铁还是智障,测试都没测试,觉得速战速决就能让电脑不坏吗?现实是残酷的,螺丝都拧好了然后按开机键没反应……没办法,我只能把后盖再拆开,然后重新试。   
+  既然电脑已经拆了一回了就感觉什么东西破碎了,第二次装的时候我就不再装后盖就直接开机,电脑重启了三回,第一回屏幕没反应,第二回只有Logo,第三回可算是开始引导系统,结果BitLocker的界面出来了,貌似是因为电池拔掉后BIOS重置,安全启动自动关闭,然后TPM就不认了。   
+  这……算了,反正前几周我还升过BIOS固件也遇到过相同的情况。不过这也太不安全了吧,BIOS居然没有自带的电池?我的BIOS密码也因此消失不见了,那这个东西密码还有什么用,后盖那么好拆,电池一拔密码就没了……   
+  我把安全启动的证书恢复了出厂设置,系统总算是正常启动了,看着16GiB的内存心里还是挺高兴的。这时候再看一眼频率,2666MHz?我怀疑是不是我装的有问题,这时候我打开命令提示符,输入`wmic memorychip`,一看两个内存的频率确实不一样,我感觉被坑了……这也许就是运气问题,合理不合理消费都是小事,运气不好咋也省不了钱。   
+  还好店家倒也不是那种不讲理的人,给我换了一条3200MHz的,今天重新装上,这也算是告一段落了。
+  
+# 心得
+  加内存条倒也没啥心得,就是注意一下拔电池,内存斜着插进去就行了。唯一让我难受的就是我买东西真的是艰难,本来想在更好的电脑上加内存,结果好电脑没买上,买了个垃圾一点的还是忍不住加内存,结果一买还发错货了,不仅如此,换回来之后再一查其他家同款的降了10CNY……   
+  生活真是艰难啊……糟糕的事情一出接着一出……

+ 160 - 0
_posts/2020-05-29-encrypt.md

@@ -0,0 +1,160 @@
+---
+layout: post
+title: 写一个加密传输的Demo
+tags: [加密, Demo]
+--- 
+  非专业密码学,仅供娱乐!<!--more-->    
+  
+# 起因
+  最近我们学校搞了一个工程项目,要求是研究关于信息安全等级保护的一些东西,一开始我以为这就是搞个权限啥的,后来发现和云计算一样是个定义,话说我明明是网络工程专业的为啥还要了解信息安全……   
+  当然这个什么等级保护的内容很多,我们不可能全都涉及,所以老师允许我们只选其中的一部分进行研究。我想了想,我之前还想搞什么[加密邮件](/2019/07/02/encmail.html)啥的,所以我选了通信安全方面的板块,这样也可以对那个项目有些参考。   
+  
+# 实现思路
+  我本来是想按着TLS的标准来写,后来看了看发现那样不太方便,我写Demo也就是玩玩而已,不用费那么大劲。   
+  像正常来说,建立加密通道是要有握手环节的,但是那个实现起来实在是太麻烦,所以想了想就算了。    
+  所以我的实现方式是生成一个随机数,用AES以随机数为密码加密数据,用RSA加密随机数。这样做的主要目的是利用RSA的特性保证传输内容不会被泄露,但是RSA相对来说太慢,所以用了AES来加密数据,这样就能提高传输的效率。   
+  传送方式我之前还想着要不要建一个TCP Socket或者是Unix Domain Socket来传输,但是后来觉得这样太麻烦,不如直接用文件的方式传,这样还简单好理解。 ~~(就是嫌麻烦嘛)~~   
+  另外在通信安全中还有一点是要求校验数据,我想了想就用MD5吧,正常来说得到MD5后还要数字签名啥的,我觉得麻烦也就没搞,所以最终传输的内容就是AES加密后的数据、原数据的MD5(Hash)以及用RSA加密的密钥。   
+  虽然我学Python的时间不长,不过我现在发现Python在做这些事情的时候远比Shell、PHP和JS简单,所以这次的Demo也是用Python实现的。   
+  不过我的Python并不怎么样,所以大多数代码都是从网上Copy的,像Crypto的库我不搜一下肯定是不会用嘛。   
+  既然用到了Crypto库,那么如果有人有兴趣执行下面的代码,自然需要执行一下`pip3 install pycryptodome`才可以正常运行啦。
+  
+# 代码
+## server.py
+```python
+# -*- coding: utf-8 -*-
+
+from Crypto.PublicKey import RSA
+from Crypto.Cipher import PKCS1_v1_5
+from Crypto.Cipher import AES  
+import base64
+import hashlib
+import json
+
+private_key = """-----BEGIN RSA PRIVATE KEY-----
+MIICXQIBAAKBgQDfEQ82qUrto7h4BL3TsA/DFXSdM44cbeY4kPccD7gLGhaZRClz
+YKIh5zYdfjBGF+0HXfMa1u9b7GNs2AjVIsx8Kx0QLnMfmtkmGWGhOXz/9IDLKJOx
+0weKv61gysKItgzVKn2mbLool4R/PQBc3AjDyHw+io1KpVz+3kRTaGs1fQIDAQAB
+AoGAWB4kFWLA/6k6OOcemd4mC9mQ7HyuOdrMJDJX+5TWDkSrArajbTmSMrRkczgj
+F71h3BQn8cVQXs695ARfUNrjTbi2Y0LjN7ScK7ExzTLdoMEFw5JsHggJZ0zBQY6w
+mwOdGfqzA6tZPXgkn+jqEha+CD6GrwnTM1oDGJC/aKG2OmECQQDkO9IhUhFc/PSU
+0zvGE6AOcqk5wlOuvMg+oAFHJHJZ9XW7+X/Nx0ZoVDFq/cZQj+46t+fiwUwhdW7l
+IfCvNGKFAkEA+jRQmWGKrbf1ns4S0SezJvysd5O6otRGJXr+Ex2uDhc39ZTeUsyg
+kjrLhp8STLMOmql+8g5fghct17EuCX1EmQJBAJz9BNnEkIrst/OSpH/nyeWGOx6u
+q077LaXd+2MLD9kO/O/Se3V5B9YFa4STkJCjoBMloswXd51gIGpdgSeSmd0CQQCL
+PrwwcGmWfo+ynqs4PajlpK9zKQMwhYS4bTejedwZOXDKOtx0Ji+i0hfcxwCPMQOK
+rZPZsIgUxUOdC508aLvZAkBDkHxunCzDm0w4DdTUN7S9YSpVvQEjK/xUQiWaKV12
+8QgskhU2DNdYK2NxifnWrKtx3uQmqMxX5aLuJZ4493yr
+-----END RSA PRIVATE KEY-----"""
+
+# 公钥解密
+def rsa_decode(cipher_text, private_key):
+    rsakey = RSA.importKey(private_key)  # 导入读取到的私钥
+    cipher = PKCS1_v1_5.new(rsakey)  # 生成对象
+    # 将密文解密成明文,返回的是一个bytes类型数据,需要自己转换成str
+    text = cipher.decrypt(base64.b64decode(cipher_text), "ERROR")
+    return text.decode()
+    
+class PrpCrypt(object):
+ 
+    def __init__(self, key):
+        self.key = key.encode('utf-8')
+        self.mode = AES.MODE_CBC
+
+ 
+    # 解密后,去掉补足的空格用strip() 去掉
+    def decrypt(self, text):
+        cryptor = AES.new(self.key, self.mode, b'0000000000000000')
+        plain_text = cryptor.decrypt(base64.b64decode(text))
+        # return plain_text.rstrip('\0')
+        return bytes.decode(plain_text).rstrip('\0')
+
+while not input("按回车读取客户端的信息,输入其他内容结束"):
+    cipher = open("pipe.txt", mode='r')
+    msg = json.loads(cipher.read())
+    cipher.close()
+    key = rsa_decode(msg["key"], private_key)
+    aesc = PrpCrypt(key)
+    message = aesc.decrypt(msg["message"])
+    hash = hashlib.md5(message.encode(encoding='UTF-8')).hexdigest()
+    if hash == msg["hash"]:
+        print("数据校验成功")
+    else:
+        print("数据校验失败")
+    print(message)
+```
+## client.py
+```python
+# -*- coding: utf-8 -*-
+
+import random
+from Crypto.PublicKey import RSA
+from Crypto.Cipher import PKCS1_v1_5
+from Crypto.Cipher import AES  
+import base64
+import hashlib
+import json
+
+public_key = """-----BEGIN PUBLIC KEY-----
+MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDfEQ82qUrto7h4BL3TsA/DFXSd
+M44cbeY4kPccD7gLGhaZRClzYKIh5zYdfjBGF+0HXfMa1u9b7GNs2AjVIsx8Kx0Q
+LnMfmtkmGWGhOXz/9IDLKJOx0weKv61gysKItgzVKn2mbLool4R/PQBc3AjDyHw+
+io1KpVz+3kRTaGs1fQIDAQAB
+-----END PUBLIC KEY-----
+"""
+
+# 公钥加密
+def rsa_encode(message, public_key):
+    rsakey = RSA.importKey(public_key)  # 导入读取到的公钥
+    cipher = PKCS1_v1_5.new(rsakey)  # 生成对象
+    # 通过生成的对象加密message明文,注意,在python3中加密的数据必须是bytes类型的数据,不能是str类型的数据
+    cipher_text = base64.b64encode(cipher.encrypt(message.encode(encoding="utf-8")))
+    # 公钥每次加密的结果不一样跟对数据的padding(填充)有关
+    return cipher_text.decode()
+
+class PrpCrypt(object):
+ 
+    def __init__(self, key):
+        self.key = key.encode('utf-8')
+        self.mode = AES.MODE_CBC
+ 
+    # 加密函数,如果text不足16位就用空格补足为16位,
+    # 如果大于16当时不是16的倍数,那就补足为16的倍数。
+    def encrypt(self, text):
+        text = text.encode('utf-8')
+        cryptor = AES.new(self.key, self.mode, b'0000000000000000')
+        # 这里密钥key 长度必须为16(AES-128),
+        # 24(AES-192),或者32 (AES-256)Bytes 长度
+        # 目前AES-128 足够目前使用
+        length = 16
+        count = len(text)
+        if count < length:
+            add = (length - count)
+            # \0 backspace
+            # text = text + ('\0' * add)
+            text = text + ('\0' * add).encode('utf-8')
+        elif count > length:
+            add = (length - (count % length))
+            # text = text + ('\0' * add)
+            text = text + ('\0' * add).encode('utf-8')
+        self.ciphertext = cryptor.encrypt(text)
+        # 因为AES加密时候得到的字符串不一定是ascii字符集的,输出到终端或者保存时候可能存在问题
+        # 所以这里统一把加密后的字符串转化为16进制字符串
+        return base64.b64encode(self.ciphertext)
+    
+message=" "
+while message:
+    message = input("请输入需要传输的信息(不输入则结束):")
+    hash = hashlib.md5(message.encode(encoding='UTF-8')).hexdigest()
+    key = str(random.randint(1000000000000000,9999999999999999))
+    cipher = rsa_encode(key, public_key)
+    aesc = PrpCrypt(key)
+    data=json.dumps({"message":aesc.encrypt(message).decode('utf8'),"hash":hash,"key":cipher})
+    print(data,file = open('pipe.txt','w'))
+    print("数据已发出!")
+```
+
+# 感想
+  我在写这个代码的时候在网上搜到的资料也真的是算少了,就像我当时打算写加密邮件那时一样,基本上大多数的资料都有问题,像有些代码还是Python2的,还有时候经常遇到什么bytearray、json转换之类乱七八糟的问题。   
+  希望中文网络环境能多一些大家遇到的冷门知识的解决方法啊……    
+  对了,这个代码实际上只有防止中间人窥探信息的能力,并没有防篡改的能力,毕竟没有两端握手,没法做验证,所以这就是一个业余的加密传输代码,仅供参考。

File diff suppressed because it is too large
+ 31 - 0
_posts/2020-06-06-demoscene.md


+ 260 - 0
_posts/2020-06-13-encrypt.md

@@ -0,0 +1,260 @@
+---
+layout: post
+title: 加密传输Demo V2
+tags: [加密, Demo]
+--- 
+  太业余总感觉不太好啊<!--more-->    
+
+# 前言
+  在上个月我写了一个[加密传输的Demo](/2020/05/29/encrypt.html),相当的业余,这个东西只能做到从客户端向服务端的单向传输,而且因为只有一次请求,所以中间人攻击也非常的容易。   
+  虽然我觉得那个应该足够我完成作业了,但是我想了想,太业余总显得我很菜 ~~(难道不是吗?)~~ ,所以我打算还是努力一下把完整的握手也做出来吧。   
+
+# 实现思路
+  和上次差不多,同样我打算通过RSA加密一个随机数作为AES的密钥,但是和上次不同,这次的这个密钥将在通信建立之后密钥就不再变化,传入传出都是这个密钥。   
+  之前觉得握手阶段可能很麻烦,不过我画了一下图稍微理了理思路发现其实也没多复杂,也就是客户端生成密钥然后加密传输过来让服务端保存,完成之后之间的传输只要传被加密的数据就行了。这样我觉得应该也能起到一定的防止中间人攻击的作用吧……     
+  不过我只用了一个文件作为传输的管道,为了避免冲突,我在每次写入数据的时候也都标明了数据的来源,这样就不会因为自己刚发完然后自己又重新接收自己发的东西了。   
+  另外老师希望我的Demo有个简单的应用,所以我又另外加了一个极其简单的登录系统在里面,这样我就不用手动操作服务端了。
+  
+# 代码
+## server.py
+```python
+# -*- coding: utf-8 -*-
+print("加密通道服务端演示开始")
+from Crypto.PublicKey import RSA
+from Crypto.Cipher import PKCS1_v1_5
+from Crypto.Cipher import AES  
+import base64
+import hashlib
+import json
+import time
+
+private_key = """-----BEGIN RSA PRIVATE KEY-----
+MIICXQIBAAKBgQDfEQ82qUrto7h4BL3TsA/DFXSdM44cbeY4kPccD7gLGhaZRClz
+YKIh5zYdfjBGF+0HXfMa1u9b7GNs2AjVIsx8Kx0QLnMfmtkmGWGhOXz/9IDLKJOx
+0weKv61gysKItgzVKn2mbLool4R/PQBc3AjDyHw+io1KpVz+3kRTaGs1fQIDAQAB
+AoGAWB4kFWLA/6k6OOcemd4mC9mQ7HyuOdrMJDJX+5TWDkSrArajbTmSMrRkczgj
+F71h3BQn8cVQXs695ARfUNrjTbi2Y0LjN7ScK7ExzTLdoMEFw5JsHggJZ0zBQY6w
+mwOdGfqzA6tZPXgkn+jqEha+CD6GrwnTM1oDGJC/aKG2OmECQQDkO9IhUhFc/PSU
+0zvGE6AOcqk5wlOuvMg+oAFHJHJZ9XW7+X/Nx0ZoVDFq/cZQj+46t+fiwUwhdW7l
+IfCvNGKFAkEA+jRQmWGKrbf1ns4S0SezJvysd5O6otRGJXr+Ex2uDhc39ZTeUsyg
+kjrLhp8STLMOmql+8g5fghct17EuCX1EmQJBAJz9BNnEkIrst/OSpH/nyeWGOx6u
+q077LaXd+2MLD9kO/O/Se3V5B9YFa4STkJCjoBMloswXd51gIGpdgSeSmd0CQQCL
+PrwwcGmWfo+ynqs4PajlpK9zKQMwhYS4bTejedwZOXDKOtx0Ji+i0hfcxwCPMQOK
+rZPZsIgUxUOdC508aLvZAkBDkHxunCzDm0w4DdTUN7S9YSpVvQEjK/xUQiWaKV12
+8QgskhU2DNdYK2NxifnWrKtx3uQmqMxX5aLuJZ4493yr
+-----END RSA PRIVATE KEY-----"""
+
+# 公钥解密
+def rsa_decode(cipher_text, private_key):
+    rsakey = RSA.importKey(private_key)  # 导入读取到的私钥
+    cipher = PKCS1_v1_5.new(rsakey)  # 生成对象
+    # 将密文解密成明文,返回的是一个bytes类型数据,需要自己转换成str
+    text = cipher.decrypt(base64.b64decode(cipher_text), "ERROR")
+    return text.decode()
+    
+class PrpCrypt(object):
+ 
+    def __init__(self, key):
+        self.key = key.encode('utf-8')
+        self.mode = AES.MODE_CBC
+        
+    def encrypt(self, text):
+        text = text.encode('utf-8')
+        cryptor = AES.new(self.key, self.mode, b'0000000000000000')
+        # 这里密钥key 长度必须为16(AES-128),
+        # 24(AES-192),或者32 (AES-256)Bytes 长度
+        # 目前AES-128 足够目前使用
+        length = 16
+        count = len(text)
+        if count < length:
+            add = (length - count)
+            # \0 backspace
+            # text = text + ('\0' * add)
+            text = text + ('\0' * add).encode('utf-8')
+        elif count > length:
+            add = (length - (count % length))
+            # text = text + ('\0' * add)
+            text = text + ('\0' * add).encode('utf-8')
+        self.ciphertext = cryptor.encrypt(text)
+        # 因为AES加密时候得到的字符串不一定是ascii字符集的,输出到终端或者保存时候可能存在问题
+        # 所以这里统一把加密后的字符串转化为16进制字符串
+        return base64.b64encode(self.ciphertext)
+ 
+    # 解密后,去掉补足的空格用strip() 去掉
+    def decrypt(self, text):
+        cryptor = AES.new(self.key, self.mode, b'0000000000000000')
+        plain_text = cryptor.decrypt(base64.b64decode(text))
+        # return plain_text.rstrip('\0')
+        return bytes.decode(plain_text).rstrip('\0')
+
+#初始化pipe
+file = open('pipe.txt','w')
+print("",file = file)
+file.close()
+#协商密钥
+while True:
+    pipe = open("pipe.txt", mode='r')
+    data = pipe.read()
+    if not data == "\n":
+        data = json.loads(data)
+        pipe.close()
+        break
+    pipe.close()
+    time.sleep(1)
+file = open('pipe.txt','w')
+print("",file = file)
+file.close()
+key = rsa_decode(data["key"], private_key)
+akey = PrpCrypt(key)
+print("成功获取密钥",key)
+print("已建立连接")
+userInfo={"Name":"Mayx","Passwd":'25d55ad283aa400af464c76d713c07ad',"Book":"《会说话就多说点》,《在哪里能买到您的著作》"}
+
+#处理阶段
+#Waiting for Quest
+while True:
+    pipe = open("pipe.txt", mode='r')
+    data = pipe.read()
+    if not data == "\n":
+        data = json.loads(data)
+        if data["from"] == "Client":
+            pipe.close()
+            break
+    pipe.close()
+    time.sleep(1)
+print("已收到请求")
+data = json.loads(akey.decrypt(data["data"]))
+if data["name"] == userInfo["Name"] and data["pwd"] == userInfo["Passwd"]:
+    file = open('pipe.txt','w')
+    print(json.dumps({"from":"Server","data":akey.encrypt("登录成功,您的书单如下:"+userInfo["Book"]).decode("utf-8")}),file = file)
+    file.close()
+else:
+    file = open('pipe.txt','w')
+    print(json.dumps({"from":"Server","data":akey.encrypt("登录失败").decode("utf-8")}),file = file)
+    file.close()
+print("请求已回应")
+print("加密通道服务端演示结束")
+```
+
+## client.py
+```python
+# -*- coding: utf-8 -*-
+print("加密通道客户端演示开始")
+import random
+from Crypto.PublicKey import RSA
+from Crypto.Cipher import PKCS1_v1_5
+from Crypto.Cipher import AES  
+import base64
+import hashlib
+import json
+import time
+
+public_key = """-----BEGIN PUBLIC KEY-----
+MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDfEQ82qUrto7h4BL3TsA/DFXSd
+M44cbeY4kPccD7gLGhaZRClzYKIh5zYdfjBGF+0HXfMa1u9b7GNs2AjVIsx8Kx0Q
+LnMfmtkmGWGhOXz/9IDLKJOx0weKv61gysKItgzVKn2mbLool4R/PQBc3AjDyHw+
+io1KpVz+3kRTaGs1fQIDAQAB
+-----END PUBLIC KEY-----
+"""
+
+# 公钥加密
+def rsa_encode(message, public_key):
+    rsakey = RSA.importKey(public_key)  # 导入读取到的公钥
+    cipher = PKCS1_v1_5.new(rsakey)  # 生成对象
+    # 通过生成的对象加密message明文,注意,在python3中加密的数据必须是bytes类型的数据,不能是str类型的数据
+    cipher_text = base64.b64encode(cipher.encrypt(message.encode(encoding="utf-8")))
+    # 公钥每次加密的结果不一样跟对数据的padding(填充)有关
+    return cipher_text.decode()
+
+class PrpCrypt(object):
+ 
+    def __init__(self, key):
+        self.key = key.encode('utf-8')
+        self.mode = AES.MODE_CBC
+ 
+    # 加密函数,如果text不足16位就用空格补足为16位,
+    # 如果大于16当时不是16的倍数,那就补足为16的倍数。
+    def encrypt(self, text):
+        text = text.encode('utf-8')
+        cryptor = AES.new(self.key, self.mode, b'0000000000000000')
+        # 这里密钥key 长度必须为16(AES-128),
+        # 24(AES-192),或者32 (AES-256)Bytes 长度
+        # 目前AES-128 足够目前使用
+        length = 16
+        count = len(text)
+        if count < length:
+            add = (length - count)
+            # \0 backspace
+            # text = text + ('\0' * add)
+            text = text + ('\0' * add).encode('utf-8')
+        elif count > length:
+            add = (length - (count % length))
+            # text = text + ('\0' * add)
+            text = text + ('\0' * add).encode('utf-8')
+        self.ciphertext = cryptor.encrypt(text)
+        # 因为AES加密时候得到的字符串不一定是ascii字符集的,输出到终端或者保存时候可能存在问题
+        # 所以这里统一把加密后的字符串转化为16进制字符串
+        return base64.b64encode(self.ciphertext)
+        
+        # 解密后,去掉补足的空格用strip() 去掉
+    def decrypt(self, text):
+        cryptor = AES.new(self.key, self.mode, b'0000000000000000')
+        plain_text = cryptor.decrypt(base64.b64decode(text))
+        # return plain_text.rstrip('\0')
+        return bytes.decode(plain_text).rstrip('\0')
+
+#初始化阶段
+while True:
+    try:
+        pipe = open("pipe.txt", mode='r')
+    except:
+        time.sleep(1)
+    else:
+        break
+pipe.close()
+#协商密钥
+key = str(random.randint(1000000000000000,9999999999999999))
+akey = PrpCrypt(key)
+cipher = rsa_encode(key, public_key)
+data = json.dumps({"key":cipher})
+file = open('pipe.txt','w')
+print(data,file = file)
+file.close()
+while True:
+    pipe = open("pipe.txt", mode='r')
+    if pipe.read() == "\n":
+        pipe.close()
+        break
+    pipe.close()
+    time.sleep(1)
+print("成功发送密钥",key)
+print("已建立连接")
+
+#处理阶段
+#Single Quest
+name = input("请输入用户名:")
+pwd = input("请输入密码:")
+hash = hashlib.md5(pwd.encode(encoding='UTF-8')).hexdigest()
+data = json.dumps({"from":"Client","data":akey.encrypt(json.dumps({"name":name,"pwd":hash})).decode("utf-8")})
+file = open('pipe.txt','w')
+print(data,file = file)
+file.close()
+print("已发出,等待回应")
+while True:
+    pipe = open("pipe.txt", mode='r')
+    data = pipe.read()
+    if not data == "\n":
+        data = json.loads(data)
+        if data["from"] == "Server":
+            pipe.close()
+            break
+    pipe.close()
+    time.sleep(1)
+print("已收到回应")
+data = akey.decrypt(data["data"])
+print(data)
+print("加密通道客户端演示结束")
+```
+
+# 后记
+  关于SSL/TLS的具体内容我也没有好好看一遍,我打算回头有时间仔细看一看,然后再回来看这个代码是有多么的糟糕🤪。

File diff suppressed because it is too large
+ 120 - 0
_posts/2020-06-17-backup.md


+ 31 - 0
_posts/2020-07-29-card.md

@@ -0,0 +1,31 @@
+---
+layout: post
+title: 如何制作一个PCB名片
+tags: [PCB, 名片, 制作]
+--- 
+  感觉设计PCB也挺有意思的<!--more-->   
+  
+# 前言
+  这个月虽然依然是假期,但是总感觉比其他月做了更多的事,毕竟是到了期末,考试的准备不说,为其他人完成期末作业这也费了不少精力,因此也赚了几百块钱。   
+  除了期末,我还要为科目三的考试做准备。虽然练车每天不过1小时,但是回来之后就啥也不想干了……再过几天我就要去考试了,希望能顺利通过。   
+  在假期间,我在网上看到了一个很有趣的东西,叫做PCB名片,就是把电路板做的像名片一样。看起来挺有意思的,不过我从来没学过电路设计(网络工程的人怎么会去学习电路设计呢?),所以虽然看起来很有意思,但是我一窍不通啊……   
+  说是这么说,但是只要想做,有搜索引擎什么做不到?于是接下来我就开始了学习电路设计的路程。
+  
+# 收集资料
+  据那些做PCB名片的人所说,他们是使用AD(Altium Designer)进行设计,然后发到一个叫嘉立创的网站进行制造。首先我肯定是先去下AD,不过看了一下大小之后就不想下了,那个软件要2-3GiB大……我想我可能也就做一次PCB,又不会经常用,所以也不想下这么大的软件。   
+  像电路设计也不可能只有AD一个软件,于是我就开始搜还有什么其他的EDA软件可以用。搜着搜着发现了有一个可以在线设计PCB的网站,叫做立创EDA,这不是正合我意嘛,想不到这个在线设计的网站和制造PCB的那个公司是一家的,这样倒是也方便。   
+  
+# 开始设计
+  既然整个流程大概都搞明白了,接下来就该设计了。当然从来没学过电路设计自然也不知道怎么用这个软件,接下来我打开了教程,然而我的表情是这样的:   
+  ![emoticon1](/images/emoticon1.jpg)   
+  像教程这种东西实在是一点用也没有,大多数教程都是给能看懂教程的人写的,像我完全不了解的人就根本不会看这种东西。那怎么办呢?不会用还不看教程,怎么才能用这个软件呢?   
+  这时候就用到了作为设计师的本能了,设计师都是心意相通的,所以只要是按着为用户着想的设计理念做出来的软件,我基本上都会用。 ~~(Adobe公司做的垃圾软件就没有符合这个理念)~~   
+  这个软件可以直接用浏览器打开,也有客户端,客户端是Electron做的。我不太喜欢Electron,因为感觉它的效率比较低,因此VSCode我也没有装。但是这个网页版在Edge上的兼容性不太好,所以我只好使用它的客户端了……倒是也不大,不到100MiB还是挺不错的。   
+  打开了这个软件之后随便按了按,大概的按键我倒是都搞明白了,有几个划线的按钮,分别可以画直线和弧线,然后就是打孔的选项,还有一个画矩形和多边形的。除此之外还能插入图片和文字,总体来看和画图软件差不多,只是它好像有一堆奇奇怪怪的层。   
+  一开始这些层我完全搞不清楚是干啥用的,啥阻焊层还是什么丝印层乱七八糟的我根本搞不清楚。还好它有一个3D预览,可以看一下最终做出来的大概效果,通过这个我大概明白了丝印层就是在电路板表面印的白色的字,阻焊层就是电路板表面涂的有颜色的漆。只是设计的时候是把那层东西挖空。   
+  了解了这些之后我就开始设计了,把喜欢的图片导入,然后按照喜欢的方式进行布置。虽然说一般电路板应该是要实现功能的,但是我不会做,做出来也是为了玩,所以我最多也只是在上面加了一个线圈,其他的什么功能也没有。
+  
+# 制造结果
+  我一开始做的时候不清楚PCB的本质,以为它是在铜板上划出电路,结果今天我取到货之后才发现完全不是这样,PCB其实是在塑料板上打印铜线,所以我在第一次设计的时候没搞清楚这个问题,我把有些阻焊层去掉之后下面就直接露出了塑料板,不怎么好看,所以今天我明白之后修改了一下图纸,又上传上去让他们制造了。   
+  打印5张这样的PCB名片倒是挺便宜的,5张一共才5CNY,虽然说真正的名片5CNY可能能打100张,但是制作一次也不过是相当于喝了一大瓶饮料而已,所以再打一次也没关系。   
+  另外我想吐槽一下快递的速度,制作板子花3天时间可以理解,但是快递送4天就有点过分了,最终下单一周之后才取到。上次我用的是京东快递,真的是体验极差,这次我换成了顺丰的希望它能快一点。

+ 23 - 0
_posts/2020-08-21-sth2.md

@@ -0,0 +1,23 @@
+---
+layout: post
+title: 假期总结第二弹
+tags: [假期, 总结]
+--- 
+
+  这个假期还真是“长”啊……<!--more-->   
+  
+# 依旧什么也没做
+  去年我写了一篇[假期总结](/2019/08/24/sth.html),什么也没做,今年比去年更糟糕,更加的什么都没做。   
+  最近我感觉我的思维就像是一块蛋糕,被万恶的资本家疯狂的切割,不是那种平均分的切法,而是一刀下去先切一半,第二次在其中一块上切三刀,第三次切四刀……总而言之我也不知道我在说什么,意思就是思考能力就如同抛物线那样下降,大概就是这样。   
+  在这个假期我总算是把驾照考下来了,不过考下来之后我感觉好像也没啥,什么感觉都没有,不过是有了开车的资格罢了。   
+  如此长的假期,将近有半年,在上课期间,每天在床上打开手机,什么也不做……   
+  感觉我的处境还是有点危险的,没有目标,不是真的没有目标,而是没有实现目标的意义……做事情给谁看呢?   
+  以上就是被切割成为2<sup>n</sup>的感受,思考能力下降的很严重,就好像一块装有服务器的CPU的电脑安装了很老的家庭版系统,不支持多核心,每个核心的频率还很低……   
+  
+# 也许不完全什么都没做
+  我想不起来这个假期我还做了什么,也许之前的文章里都有写,但是最近确实啥都没做。   
+  唯一我想到的事情是学校推迟了几天开学,可是我提前买了机票。然后发现改签还不如退票重买便宜,然后就重新买了。所以以后如果遇到了类似的事情,再看看那一天机票的价格吧。
+
+# 想要做的事情
+  我没有能力思考更多的事情了,正好手头有一个好几年前的旧山寨机,想想我能用它做什么更多的事情吧。   
+  😢

+ 30 - 0
_posts/2020-08-28-banned.md

@@ -0,0 +1,30 @@
+---
+layout: post
+title: 网站被Ban怎么办?
+tags: [网站, Ban]
+---
+  虽然不是第一次,但是这事终于落到我头上了<!--more-->   
+  
+# 起因
+  在一年前,我写了一篇[Anti-Ban](/2019/04/27/antiban.html)的文章,主要讲的是如何避免由于网站被Ban导致的无法访问。   
+  然而现在身份换了,我不再是被Ban网站的访问者,而是维护者,这时候我们应该怎么办?
+
+# 解决方案
+  我维护的网站就是花火学园,前两天网站的域名say-huahuo.com包括其子域名都被DNS污染了。污染的当天访问量直接下降3/4,简直是太恐怖了,而且这还只是防火长城的最低级别的攻击。   
+  被污染的两天后百度权重骤降,直接预估流量暴降10倍……我以前还挺自信的,让网站与域名耦合度很高,这么一搞,我以后是不敢再在内链里搞URL了,最多就是绝对路径,然后像我之前还搞什么图床之类的现在出现这么个事也不敢再搞子域名了。   
+  当然域名被污染这个也不是什么大事,在我维护前貌似也出现过类似的事情,那时候的用户量远比现在低,解决方案也很简单就是换域名,只是我以前太自大了好多配置的地方都用的是带域名的URL,所以直接换就会出现好多问题。   
+  还好Nginx有一个叫做`sub_filter`的模块,我可以直接使用这个模块把页面中所有涉及say-huahuo.com的部分全部替换成现在的say-huahuo.me。虽然这样会增大服务器的压力但是也没有啥更好的办法了,以后有机会再把数据库里的所有链接替换一下应该就没问题了吧。   
+  不过那也只是个辅助的方案,大多数情况还是要Discuz里面调整。首先要在后台把所有有关应用域名的东西全部关掉,然后在配置文件里把cookie域删掉,另外还要改一下UCenter的配置文件,要把UC_API的地址改成/uc_server,不然头像就会调用带域名的URL然后就会出问题。     
+  
+# 永远要考虑用户
+  其实对于我来说,换不换域名都是次要的,因为防火长城最低级别的攻击DNS污染使用DoH、DoT、DNSCrypt等一大堆避免被污染的方案就可以解决,实在不行用hosts文件手动设置IP也行嘛。   
+  虽然这么说,但是访问网站的一大批用户全是电脑小白,那些人能把手放在鼠标上能用键盘打几个字已经很了不起了,像复杂的事情他们也不会懂。虽然我维护的网站没有广告,流量对我来说毫无意义,但是维护一个没有人访问的网站也很无聊啊,没有人访问网站开着有什么意义?   
+
+# 如何使用国外的服务器检测DNS污染
+  一般防火长城都是在国际网络出入口设立的,所以如果是国内访问国内还是国外访问国外都是不通过防火长城的。所以怎么样才能在国外检测某域名在国内的状态呢?   
+  我之前也不清楚这个问题,后来发现,只要用国内的DNS来解析不就好了嘛23333,在国外也可以用`nslookup`使用国内的DNS,这样就会经过防火长城而实现检测的功能了。
+
+# 总结
+  通过这件事,我明白了防火长城再垃圾也是能防住大量用户的,毕竟大量用户都是小白,而且域名一旦被他们认证,终身也别想解禁,所以一般情况下还是不要惹他们比较好。   
+  另外只搞了备用域名没搞发布地址也确实是考虑的不够周全,不过也确实是我太自大了,怎么会认为那样的网站不会被防火长城屏蔽?虽然这个域名活了将近两年,但是确实我们做的准备不够充分。   
+  还有就是尽可能不要滥用子域名,虽然说有些静态资源放到子域名可以不传cookie可以让速度更快一些,但是这种事对我们来说没有意义,另外就是不要让网站与域名耦合,万一哪一天要换域名麻烦事就出来了。像我的博客用的基本上都是绝对路径,这样就能避免由于GitHub Pages域名出问题之后换域名困难的问题了。

File diff suppressed because it is too large
+ 34 - 0
_posts/2020-09-10-site.md


File diff suppressed because it is too large
+ 34 - 0
_posts/2020-09-27-vm.md


File diff suppressed because it is too large
+ 7 - 0
_posts/2020-10-24-try.md


File diff suppressed because it is too large
+ 23 - 0
_posts/2020-11-24-createctf.md


+ 36 - 0
_posts/2020-12-07-picore.md

@@ -0,0 +1,36 @@
+---
+layout: post
+title: 在树莓派上体验piCore
+tags: [树莓派, piCore]
+---
+
+  麻雀虽小,五脏俱全<!--more-->    
+  
+# 起因
+  最近想让协会的打印机共享到网络上,但是又没有什么好的方法,如果用电脑的话体积有点太大了,所以我就考虑用树莓派来共享。   
+  我手头有一个吃灰多年的树莓派,有一个问题是我应该在上面装什么操作系统比较好?一般来说在树莓派上肯定是装官方的Raspberry Pi OS会更好一些,但是官方的系统很大,下载也有点慢,所以就想找个小一点的系统来处理。   
+  最终,我找到了一个叫做Tiny Core Linux的发行版,它有一个专门为树莓派开发的一个叫做piCore的发行版,下载下来只需要23MiB,可以说是非常不错了,毕竟就算是Raspberry Pi OS lite也要400多MiB。   
+  另外,点击[这里](http://www.tinycorelinux.net/12.x/aarch64/releases/RPi/piCore64-12.0.zip)就可以下载安装包了。
+
+# 使用方法
+  总体来说piCore还是挺不错的,文档写的也还可以,该有的功能基本上都有了。安装很简单,和树莓派一样直接把镜像写入MicroSD卡就可以直接使用了。不过有一个问题是它的系统不是直接挂载分区使用的,它的根目录是在内存里面的,所以如果直接断电所作的操作没有办法保存。   
+  不过他们提供了一种方案来解决这个问题,在对根目录下的文件进行操作后,可以执行`filetool.sh -b`把修改写到一个特别的文件里面,之后每一次开机系统都会读那个特别的文件来保持重启后数据不会丢失。   
+  第一次启动的时候系统会自动生成SSH的Key,所以第一次启动就要执行上面的命令。这些事情在README都有写。另外就是使用完整分区的问题,根据这个发行版的设计,所有的操作会写到第二个分区里面,但是默认情况下第二个分区只有16MiB,所以要扩大这个分区的大小。   
+  顺便一说,这个系统的默认用户名是tc,密码是piCore。   
+  扩大的方法在README里面也有写,但是全英文而且写的也不太清晰让我很难受,而且在国内貌似几乎没有人使用piCore,导致我第一次搞这个东西的时候很痛苦,所以我还是在这里记录一下吧。
+## 扩大分区
+  首先第一步执行`sudo fdisk -u /dev/mmcblk0`,然后输入p查看分区,接下来记住第二个分区的StartLBA。记好以后输入d删除第二分区并且输入n重新创建分区。其中出现First Sector的时候输入刚刚记住的数字,其他的就默认就行了。最后输入w保存。   
+  很神奇的是用fdisk操作分区的时候并不会让被操作分区的数据丢失,貌似它只会修改分区表,也许这才是fdisk真正做的事情吧……   
+  在此之后需要重启一次,然后执行`resize2fs /dev/mmcblk0p2`让文件系统获得真正的大小就OK了。   
+## 安装软件
+  这个系统安装软件也很神奇,由于它的系统在内存中,安装软件肯定也不能直接安装到指定的位置。他们设计了一种很神奇的安装方法,就是把程序写到一个镜像里面,然后使用的时候挂载就可以用了。直接操作可能会比较麻烦,所以他们设计了一个脚本让任何人都可以随便安装软件。   
+  像debian系列的发行版都使用的是`apt`来管理软件的,piCore也整了一个类似的东西,叫做`tce-ab`,用起来比`apt`还要方便,它是一个可交互的脚本,想安装软件可以直接在里面搜索。方便确实很方便,而且清华源里也提供了这个系统的镜像源,还是挺不错的。   
+  不过卸载的时候就有点麻烦了,它貌似没有卸载的命令,需要自己手动去`/mnt/mmcblk0p2/tce/optional/`这个路径把软件删掉。不过其实还好,文件都在一起,倒是也没有特别的麻烦。   
+## 配置Wifi
+  因为piCore默认没有Wifi的驱动我还以为它不能用Wifi,不过还好,这个安装软件的功能可以直接安装Wifi的管理软件和驱动,用起来挺方便的,直接搜索wifi就可以安装,不过我在里面又找到了一个叫做`firmware-rpi-wifi`的包,虽然不知道需不需要安装,但是看起来好像需要的样子就安上了。   
+  还有一个问题就是即使安好后也不能自动连接Wifi,这个问题处理起来也很简单,第一次连Wifi是用的一个叫做`wifi.sh`的脚本,连好以后就可以在`/opt/bootlocal.sh`文件里写一句`wifi.sh -a`,这样它以后每次启动都会自动连接Wifi了。不过还有一点需要注意,在做完这些配置之后都需要执行`filetool.sh -b`来保证修改能在下一次重启的时候被应用。   
+
+# 与Raspberry Pi OS lite的对比
+  这样一波操作下来感觉基本上Raspberry Pi OS lite和piCore在功能上也没啥区别了吧,piCore不仅更快还更小,从安装包来看piCore要比Raspberry Pi OS lite小20倍!   
+  这样看来还是piCore更好啊,为什么国内连相关的文章都搜不到呢?也许是因为piCore需要自己探索吧,大家一般都用的是树莓派官方的系统,而且因为Raspberry Pi OS lite用的是apt管理更方便所以就没人用piCore了吧……   
+  不过树莓派不就是用来折腾的嘛,所以我还是更支持piCore!😀

+ 36 - 0
_posts/2020-12-13-nat.md

@@ -0,0 +1,36 @@
+---
+layout: post
+title: 关于内网穿透的笔记
+tags: [内网穿透]
+---
+
+  为了更好的运用资源,内网穿透是必要的。<!--more-->     
+  
+# 起因
+  最近我的学校给我分配了一些服务器资源,大概在市场上价格基本上在1wCNY/mo的样子。这些资源非常好,但是有一个问题,那就是没有外网IP,想要运用这些资源必须要到机房。像机房那样的地方又冷又吵,不过我不在意,可惜问题不在这里,问题在于它只能在机房用,我又不能常常待在机房,那我到底应该怎么办呢?   
+  其实解决方案很简单,那就是搞内网穿透。现在内网穿透的技术已经很多了,不过总体来说主要还是一个东西,那就是隧道。   
+  
+# 内网穿透的原理
+  我大概查了一下相关的资料,一般来说内网是路由器自己划分出来的局域网。正常来说,如果想让所有的机器都登上外网,可以把路由器换成交换机,可惜换不得,毕竟外网IPv4的资源是有限的,就是插了交换机,也需要ISP分配IP地址给机器。   
+  根据我的了解,局域网和广域网进行通信的时候会用到一个叫做NAT的技术,大概原理就是路由器在内网访问外网时能把自己伪装成一般的电脑向其他服务器发送数据,发送过去的时候路由器会记住是哪个内网设备发送的数据,最终传回的数据路由器也会按原路转发回请求的主机,通过这样就可以把内网和外网联系起来。   
+  这时候就会有一个问题,那就是在这个过程中路由器和其他的电脑没有什么区别,假如在广域网的机器想要访问局域网的机器,那么正常来说就是直接访问那个路由器所在的IP就可以了,但是内网并没有发请求给广域网,路由器也不知道要把数据传给谁,它就会把这个数据丢掉。   
+  这个问题应该怎么解决?其实很简单,那就是连之前先由局域网的机器向想要访问这个机器的外网机器发送数据,这样外网机器就能顺理成章的连到内网的机器里面了,这确实是一个不错的解决方案,事实上现在几乎所有的内网穿透都是使用的这个方案。   
+  除此之外还有一个叫做UPnP的协议貌似也可以穿透,P2P应该都是用的这种方法,不过需要路由器支持才行。这种协议好像可以自动进行端口映射,大概是通过某种协议让路由器可以在内网机器没有主动发送数据的情况下把数据发送给内网机器吧,具体我也不是很清楚。    
+  另外如果有内网与外网相连的路由器的管理权限,也同样可以做到内网穿透,直接搞端口映射就完事,这种就更加简单了,但是一般情况下我们肯定没有路由器的管理权,不然也不至于这么苦恼了。   
+  
+# 一些实现的方案
+  现在内网穿透的技术有很多,不过因为内网机器直接主动连外网这种方法比较简单,所以接下来说到的方法基本上都是通过这种方式的。   
+## 利用VPN创建隧道
+  VPN的原理是通过由主机主动向VPN服务器连接隧道并通过虚拟一个路由器组成VLAN的一种技术,通过这个介绍也能很明显看出来这是由主机主动发出的吧,通过这种方式即使不在内网中也可以让内网的电脑连自己的VPN来连接内网的电脑,以此再继续连到内网电脑所能连接的网络里面。   
+  这种方法算是比较简单,而且很安全的方式,不过可惜中国的好多ISP都屏蔽VPN,用这种方式不是很稳当。   
+## SSH隧道
+  SSH这个软件很强大,有的功能也很多。既然VPN被屏蔽了那22端口总不至于屏蔽吧,总不能把运维的饭都给抢了吧?通过SSH隧道的方式使用起来也很简单,在公网服务器上打开sshd的GatewayPorts功能,内网设备通过执行类似于`ssh -fN -R 10022:localhost:22 远程用户@远程主机`这样的命令启动隧道,然后其他电脑就可以通过这个公网服务器连这个内网设备了。   
+  这种方法很不错,但是还是有一个问题,那就是需要租服务器(刚才的VPN同样需要),所以可以还有更好的方案。   
+## 某些服务商提供的frp
+  frp从名字上就能听出来它是一种代理吧,这种东西目前有很多服务商都有提供,比如SakuraFrp,还有花生壳啥的,当然如果手头有服务器也可以自己搭。这种的和前面几种不一样的是它反代出来的服务可以让其他用户直接用,很方便,不过有一个限制,就是一台服务器最多只能反代出64551个服务(不考虑tcp和udp的区别),正常人都是够用了。   
+## 端口映射
+  这是最好的方案,毕竟这样做可以保证不限速,而且也不需要外网服务器,但是路由器的管理权限很难搞,这确实没办法。   
+
+# 后记
+  所以最后我用了哪种方案呢?既然端口映射最好那当然是用这个啦!但是有一个问题是我没有路由器管理权,怎么办呢?没关系,这个路由器以前有人做过端口映射,只是现在没人用了而已,于是我就跟着这个配置把服务器设置成和被映射主机一样的IP,然后就可以用了。   
+  另外就是运用资源的问题了,这么多资源我自己用都想不出来干什么比较好,所以我考虑要不然搞IDC?总之在资源利用起来之前先让它们为世界做点贡献吧,这些服务器算力确实猛,在WCGrid里目前我的每日排名都能达到世界前200,确实厉害。

File diff suppressed because it is too large
+ 28 - 0
_posts/2021-01-04-summary.md


File diff suppressed because it is too large
+ 45 - 0
_posts/2021-01-06-proxy.md


File diff suppressed because it is too large
+ 27 - 0
_posts/2021-01-17-picore.md


File diff suppressed because it is too large
+ 49 - 0
_posts/2021-02-02-serverchan.md


+ 105 - 0
_posts/2021-02-06-wechatbot.md

@@ -0,0 +1,105 @@
+---
+layout: post
+title: 自制一个简单的微信聊天机器人
+tags: [微信, 聊天, 机器人, PHP]
+---
+
+  感觉API好像还挺有意思<!--more-->    
+  
+# 起因
+  前两天我[制作了Server酱·TurboMini版](/2021/02/02/serverchan.html)之后感觉微信公众号的API好像还挺有意思的,总的来说也不是很复杂,没有用什么特别奇怪的东西,而且文档还算清晰,这一点还是很不错的。   
+  于是最近我就开始看微信开放文档,其实我刚写完Server酱·TurboMini版之后我就在想,好多人在QQ上搞那种只要说来点什么图,机器人就会发图片的一个功能。我感觉这个好像有点意思,因为我平时用微信更多一些,既然有测试号这样好的平台,那么我就应该搞点这样的功能。   
+  我花了一天的时间通读整个文档然后把程序写了出来,然而发生了很糟糕的事情,那就是微信被动回复的时间要求必须在5秒以内,否则就会报错,然而让服务器转发图片本来就很耗时,又加上我用的是垃圾国外免费的虚拟空间,中国与国际互联网的连接又很差劲,导致5秒内程序必定不可能来得及回复。   
+  没办法,我花了一天时间写的东西,我一定要水一篇文章!所以我想了想,干脆写成聊天机器人吧,那个东西也简单,像我博客上的伊斯特瓦尔就用了聊天机器人(有现成的API啥都好搞)。于是我稍微改动了一下代码,把发图机器人改成了聊天机器人。   
+
+# 代码
+```php
+<?php
+$appid=微信appID;
+$secret=微信appsecret;
+$appkey=图灵机器人APIkey;
+function checkSignature()
+{
+    $signature = $_GET["signature"];
+    $timestamp = $_GET["timestamp"];
+    $nonce = $_GET["nonce"];
+	
+    $token = 'mayx';
+    $tmpArr = array($token, $timestamp, $nonce);
+    sort($tmpArr, SORT_STRING);
+    $tmpStr = implode( $tmpArr );
+    $tmpStr = sha1( $tmpStr );
+    
+    if( $tmpStr == $signature ){
+        return true;
+    }else{
+        return false;
+    }
+}
+if(checkSignature()){
+if($_GET["echostr"]){
+echo $_GET["echostr"];
+}else{
+$content = file_get_contents("php://input");
+$p = xml_parser_create();
+xml_parse_into_struct($p, $content, $vals, $index);
+xml_parser_free($p);
+if($vals[$index['MSGTYPE'][0]]['value'] == 'text'){
+echo '<xml>
+  <ToUserName><![CDATA['.$vals[$index['FROMUSERNAME'][0]]['value'].']]></ToUserName>
+  <FromUserName><![CDATA['.$vals[$index['TOUSERNAME'][0]]['value'].']]></FromUserName>
+  <CreateTime>'.time().'</CreateTime>
+  <MsgType><![CDATA[text]]></MsgType>
+  <Content><![CDATA['.json_decode(file_get_contents('https://www.tuling123.com/openapi/api', false, stream_context_create(array('http' => array('method' => 'POST','header' => 'Content-type:application/x-www-form-urlencoded','content' => http_build_query(array('key' => $appkey,'info' => $vals[$index['CONTENT'][0]]['value'],'userid' => $vals[$index['FROMUSERNAME'][0]]['value'])))))),true)['text'].']]></Content>
+</xml>';
+}
+}
+}else{
+echo 'error';
+}
+```
+
+# 使用方法
+  和[上一篇文章](/2021/02/02/serverchan.html)一样,同样需要去[申请](https://mp.weixin.qq.com/debug/cgi-bin/sandbox?t=sandbox/login)一个测试号,不过有一点不一样,那就是这一次需要配置接口配置信息,URL就填这个程序能在互联网上访问的地址,而Token则是填mayx。为什么呢?因为我在代码里这样写的啊……如果想改可以把对应的变量改成自己喜欢的值,总之保证两边一样就行。   
+  提交之后接口就配置好了,不过还没有结束,为了能使用机器人,还得要去注册[图灵机器人](http://www.turingapi.com/),毕竟又不可能自己去写一个聊天机器人,那个需要的资源太多了。现在那个图灵机器人好像必须要实名才能用,那总之混互联网的人遇到这种问题应该也不是问题了吧。   
+  注册好机器人之后就直接把APIKey粘到代码里面,然后整个代码就可以正常运行了,现在你就可以和你的机器人聊天了。   
+  
+# 暂时废弃的代码
+```php
+define('MULTIPART_BOUNDARY', '--------------------------'.microtime(true));
+
+$file_contents = file_get_contents(json_decode(file_get_contents('https://www.pixiv.net/ajax/illust/'.json_decode(file_get_contents('https://api.loli.st/pixiv/'),true)['illust_id'].'/pages'),true)['body'][0]['urls']['regular'], false, stream_context_create(array('http' => array('method' => 'GET','header' => "referer: https://www.pixiv.net/"))));
+
+$context = stream_context_create(array(
+    'http' => array(
+          'method' => 'POST',
+          'header' => 'Content-Type: multipart/form-data; boundary='.MULTIPART_BOUNDARY,
+          'content' => "--".MULTIPART_BOUNDARY."\r\n".
+            "Content-Disposition: filename=\"image.png\"\r\n".
+            "Content-Type: image/png\r\n\r\n".
+            $file_contents."\r\n".
+            "--".MULTIPART_BOUNDARY."--\r\n"
+    )
+));
+
+echo '<xml>
+  <ToUserName><![CDATA['.$vals[$index['FROMUSERNAME'][0]]['value'].']]></ToUserName>
+  <FromUserName><![CDATA['.$vals[$index['TOUSERNAME'][0]]['value'].']]></FromUserName>
+  <CreateTime>'.time().'</CreateTime>
+  <MsgType><![CDATA[image]]></MsgType>
+  <Image>
+    <MediaId><![CDATA['.json_decode(file_get_contents('https://api.weixin.qq.com/cgi-bin/media/upload?access_token='.json_decode(file_get_contents('https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid='.$appid.'&secret='.$secret),true)[access_token].'&type=image', false, $context),true)['media_id'].']]></MediaId>
+  </Image>
+</xml>';
+```
+  其实这段代码不是不能工作,只是它不能符合要求,没办法及时的把图片上传到微信服务器上,也没办法及时回复……也许如果有很好的条件,这段代码就可以运行了吧……   
+  我也试过如果不是Pixiv上面的图片,而是图片在很小而且也很快的服务器上时,这个代码是能运行的。
+  
+# 替代的方案
+  我看完文档之后好像也没有主动向用户发送信息的接口,只有被动发送的,那这5秒问题估计是没法解决了吧……不过我看网上说如果用客服接口好像就没有这样的限制,总之我回头试试看吧。   
+  另外我也想了几种方案:
+  1. 每天定时向微信服务器上传图片,需要时只发送ID,不再在得到请求时再上传。   
+  2. 设置2条命令,一条用于向微信服务器上传,另一条负责取回。不过这样有个问题就是ID不太好传,可能还得缓存一下,其实上面那个一样也得缓存。   
+  3. 搞成图文形式,每天定时发送,就像日报一样    
+  
+  目前大概就想出这么多,更多的睡起来再慢慢想吧~

File diff suppressed because it is too large
+ 7 - 0
_posts/2021-02-09-try2.md


File diff suppressed because it is too large
+ 143 - 0
_posts/2021-02-19-picbot.md


File diff suppressed because it is too large
+ 118 - 0
_posts/2021-02-23-picbotpro.md


File diff suppressed because it is too large
+ 53 - 0
_posts/2021-02-26-serverchancorp.md


+ 35 - 0
_posts/2021-02-28-discuz.md

@@ -0,0 +1,35 @@
+---
+layout: post
+title: 如何给DiscuzX添加像原生一样的404页面
+tags: [PHP, DiscuzX]
+---
+
+  简单的提高用户体验<!--more-->    
+  
+# 起因
+  像现在的新网站,由于使用的引擎越来越先进,网站的路径看起来非常的不错,那些一般开发的时候把它叫做路由。   
+  而过去的网站不一样,以前的网站程序大多都是以文件形式存在,访问的时候都是服务器程序去读取相对应的文件。像PHP算是有点年头了,尤其像我这种不喜欢用框架,就喜欢原生PHP的人更是如此。   
+  但是以前也是有让访问的URL变得花里胡哨的办法的,一般我们把那个叫做伪静态,那个一般是由服务器程序根据规则把对应的路径重写成文件的物理地址。   
+  不过也有不少引擎会把所有情况的路径重写到一个文件中,再由一个文件慢慢处理,其实这个已经算是路由了,像我之前写的[超简单反代](/2021/01/06/proxy.html)就是这样的,包括一些博客引擎,比如WordPress、Typecho等等,还有一些CMS也支持。   
+  然而很遗憾的是,DiscuzX作为一款有年代的论坛引擎,它不会接收所有的请求到处理程序中去,这就导致了一个问题,那就是错误的请求不会由DiscuzX处理,而是由服务器程序处理。   
+  所以DiscuzX在遇到路径404的问题时,就只是白底黑字,大大的写着404 Not Found而已,很丑,一般的处理方法也不过是自己单独整一个404页面,显得和网站风格很不匹配。   
+  所以今天我要解决这个问题,让这种有年代的程序也显得稍微现代化一点点。   
+  
+# 解决方法
+  其实解决这个问题很简单,调用DiscuzX的程序去生成这个页面就行了,所以以下就是生成这个页面的代码(因为是看着模板变量随便写的,可能有多余的代码,但反正能用):   
+```php
+<?php
+define('CURSCRIPT', '404');
+require './source/class/class_core.php';
+C::app()->init();
+$navtitle = "提示信息"; 
+$show_message = "抱歉,您访问的页面不存在";
+$alerttype = 'alert_error';
+$allowreturn = 1;
+$param['msgtype'] = 1;
+include template('common/showmessage');
+```
+  把这个文件保存为404.php,然后放到网站根目录就行了,然后再把服务器配置里的错误页面设置为这个文件,像Nginx的话可以在server段里加一句`error_page 404 /404.php;`就OK了。   
+  
+# 总结
+  目前来看好像我见到的几乎所有论坛(即使不是DiscuzX),都没能做到404页面和网站完美融合,也许我是第一个写这种东西的人吗😀?这样就能很简单的提高特别情况下的网站体验了吧……

File diff suppressed because it is too large
+ 38 - 0
_posts/2021-03-02-workers.md


File diff suppressed because it is too large
+ 65 - 0
_posts/2021-03-23-wxpush.md


File diff suppressed because it is too large
+ 7 - 0
_posts/2021-04-05-try3.md


File diff suppressed because it is too large
+ 94 - 0
_posts/2021-04-09-weauth.md


+ 37 - 0
_posts/2021-04-18-hide.md

@@ -0,0 +1,37 @@
+---
+layout: post
+title: Mayx的运维笔记 - 隐藏自己
+tags: [运维, 笔记, 隐藏]
+---
+
+  互联网是个很危险的地方……<!--more-->     
+  
+# 起因
+  最近几天我维护的花火学园貌似时不时的会爆内存……不过这倒是也是正常的事情,PHP好像默认情况下不会自己释放内存,我之前本来是想把那个运行模式改成ondemand,但是看网上说好像都不怎么推荐……但是既然已经爆了几次内存,那我也没得选了,就把运行模式改了。   
+  在检查服务器的这段时间里,我发现居然有一个不自量力的家伙在爆破我的服务器,看IP是159.89.47.109,随便访问了一下想不到上面还跑了个网站?不知道是这个网站被黑了变成肉鸡了还是这个网站的所有人确实脑子有问题……   
+
+# 解决IP泄露
+  总之无论如何这已经证明了论坛的真实IP已经泄露了,因为我开了很多防火墙白名单,对网络流量这一块限制的很严格,所以正常情况下外面是不应该知道我的网站IP的,不过我的SSH端口虽然改了,但是因为我的位置经常在变,所以这个并没有设置白名单。   
+  不过还有一个可能性,最近貌似有个自称Tyosakuken FANZA的家伙给我们的运营商发了DMCA投诉,CloudFlare是真的会把真实IP告诉投诉者的。我不知道这个发投诉的人是个啥情况,总之这个公司貌似是日本的,先把日本的流量全封了再说。   
+  另外IP肯定是要改了,正好趁这个机会干脆再小幅度的升一下服务器的配置好了,之前一直用的是Vultr的Cloud Compute,这次试试High Frequency说不定速度会变快。于是我就用快照重新部署了一下服务器。结果在等它部署的期间居然睡着了😂,这下可用率又要掉了。   
+  不过SSH端口这个……我也不能每次要用的时候再去开它,那样很麻烦,所以……我想了想,要不然就用frp吧,直接不开放SSH端口,流量就从frp里经过,而且这个东西还支持访问验证,这样也能避免被扫了,不过我确实还是没办法确认这个东西的安全性,不知道这到底是提高了破解难度还是放了个定时炸弹……毕竟它是可以无视防火墙的啊。   
+  
+# 更新快照脚本
+  换了IP之后服务器的ID也跟着一起变了,我正打算改这个东西的时候发现Vultr怎么也变了,原来用的是SUBID,现在变成了实例ID了……当时我不是很精通API所以是从[网上随便找的脚本](/2020/06/17/backup.html),现在我用PHP调API调的也算熟练了吧,正好这次V1的API貌似要被废弃了,我就看看文档,整个V2的API吧。代码如下:
+```php
+<?php
+$api_key="APIKey";
+$instance_id="实例ID";
+
+file_get_contents("https://api.vultr.com/v2/snapshots", false, stream_context_create(array('http' => array('method'=>'POST','header'=>"Content-Type: application/json;charset=utf-8\r\nAuthorization: Bearer ".$api_key,'content'=>'{"instance_id": "'.$instance_id.'"}'))));
+
+$snapshot_list=json_decode(file_get_contents("https://api.vultr.com/v2/snapshots",false,stream_context_create(array('http' => array('method'=>'GET','header'=>"Authorization: Bearer ".$api_key)))),true);
+if($snapshot_list["meta"]["total"]>10){
+	file_get_contents("https://api.vultr.com/v2/snapshots/".$snapshot_list["snapshots"][0]["id"],false,stream_context_create(array('http' => array('method'=>'DELETE','header'=>"Authorization: Bearer ".$api_key))));
+}
+```
+  像这个也可以整合我之前写的[测试号通知](/2021/02/02/serverchan.html)或者[企业号通知](/2021/02/26/serverchancorp.html)来用,用之前记得加上addslashes,不然可能会出问题。   
+  另外这个V2的API貌似还是RESTful的呢,看起来倒是更简单易懂了。
+  
+# 总结
+  总之在网上一定要注意网站安全,一旦有出问题的迹象要赶紧备份,有必要的情况该换IP就只能换了。

File diff suppressed because it is too large
+ 63 - 0
_posts/2021-05-07-ssh.md


+ 0 - 0
_posts/2021-05-15-vulnerability.md


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