mirror of
https://github.com/Mabbs/mabbs.github.io
synced 2026-01-09 02:03:38 +08:00
Restore deleted repositories
This commit is contained in:
commit
f4aa957c53
6
404.md
Normal file
6
404.md
Normal file
|
|
@ -0,0 +1,6 @@
|
|||
---
|
||||
layout: default
|
||||
title: 404 - 找不到页面
|
||||
---
|
||||
# 找不到页面
|
||||
你访问的资源 <code><script>document.write(window.location.pathname)</script></code> 不存在或者可能已经被永久移除。
|
||||
4
BingSiteAuth.xml
Normal file
4
BingSiteAuth.xml
Normal file
|
|
@ -0,0 +1,4 @@
|
|||
<?xml version="1.0"?>
|
||||
<users>
|
||||
<user>0ADFCE64B3557DC4DC5F2DC224C5FDDD</user>
|
||||
</users>
|
||||
139
BlogCard.svg
Normal file
139
BlogCard.svg
Normal file
|
|
@ -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
README.md
Normal file
37
README.md
Normal file
|
|
@ -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
|
||||

|
||||
13
_config.yml
Normal file
13
_config.yml
Normal file
|
|
@ -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
_includes/toc.html
Normal file
95
_includes/toc.html
Normal file
|
|
@ -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
_layouts/default.html
Normal file
154
_layouts/default.html
Normal file
|
|
@ -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
_layouts/encrypt.html
Normal file
55
_layouts/encrypt.html
Normal file
|
|
@ -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
_layouts/post.html
Normal file
90
_layouts/post.html
Normal file
|
|
@ -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]-->
|
||||
13
_posts/2015-02-23-diary.md
Normal file
13
_posts/2015-02-23-diary.md
Normal file
|
|
@ -0,0 +1,13 @@
|
|||
---
|
||||
layout: post
|
||||
title: 2015.2.23日记
|
||||
tags: [日记]
|
||||
---
|
||||
|
||||
今天是2015年2月23日,离开学还有5天<!--more-->
|
||||
今天我修好了我的U盘,之前我的U盘在一个太阳黑子盛发的时期坏掉了,我感到十分难过,于是写了一篇议论文和短篇小说纪念它,然后就半坏半好的用。就在今天,我去了我大伯家,发现我的U盘中那个坏掉了的那个文件夹突然能读了,这还是那个王哥哥的功劳呢,如果不是我展示我U盘坏掉的情况,我还不知道我的U盘竟不自动断线了。于是我使用了CHKDSK修复了我的U盘,结果所有问题解决了。就是留下了一个不知名的文件i怎么也删不掉。
|
||||
昨天我打算玩爷爷的电脑,结果打不开,于是我在今天看了看电脑,拿下来一通电,结果可以启动了。然后我很高兴,安上后,一打开显示器又不能用了,于是我猜这是显卡的问题,然后我关了显示器,打开了电脑后又开了显示器,结果好了,于是我就在这台电脑写了我今天的日记。
|
||||
|
||||
|
||||
快开学了,我写一个假期小结
|
||||
这个假期一共30天,去了4个城市,对手机的了解更深了。比如partition(分区),mount(挂载),prop(设置变量)。而且我还因此弄坏了手机。在2015年的2月18日。我以错误的方式挂载了boot分区,结果……boot分区被我玩坏了。手机是靠boot分区进行启动的,结果我还脑残的重启了。于是,在2015年的春节,我一整天都想着我的手机。终于在春节的下午,我去了二姨家,使用了电脑,花了10秒修好了手机。于是,我知道了mount是个危险命令。不过在弄坏手机之前我还做了一件事,那就是在手机上装windows3.2中文版,这是第一个推广到中国的windows系统。首先我装了DOSBOX,模拟DOS环境,然后在这个上面安了CCED,并正常的运行了,我很高兴。然后在手机上下载了win3.2系统的安装包,没有电脑的帮助安装了win3.2,证明了电脑就是一垃圾,便携式手持设备才是信息的未来,于是我就弄坏了手机,证明失败了……虽然我没去旅游,但我这个假期还是很有意思的。
|
||||
213
_posts/2018-03-26-neko.md
Normal file
213
_posts/2018-03-26-neko.md
Normal file
|
|
@ -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>
|
||||
44
_posts/2018-06-20-Coding.md
Normal file
44
_posts/2018-06-20-Coding.md
Normal file
File diff suppressed because one or more lines are too long
38
_posts/2018-10-20-talk.md
Normal file
38
_posts/2018-10-20-talk.md
Normal file
|
|
@ -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
_posts/2018-10-28-mos-reporter.md
Normal file
56
_posts/2018-10-28-mos-reporter.md
Normal file
|
|
@ -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 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
|
||||
该睡了,今天就先到这里吧。
|
||||
95
_posts/2018-11-04-mayx-think.md
Normal file
95
_posts/2018-11-04-mayx-think.md
Normal file
|
|
@ -0,0 +1,95 @@
|
|||
---
|
||||
layout: post
|
||||
title: Mayx的创想
|
||||
tags: [Mayx, 创想]
|
||||
---
|
||||
|
||||
这里是Mayx发布创想的地方。<!--more-->
|
||||
有的时候,我会有一些想要发明的想法,但是经常忘记。现在为了防止忘记,我将在我的博客上更新我的创想。
|
||||
|
||||
# 关于减肥的创想
|
||||
人们希望减肥,一是为了健康,二是为了舒服,三是为了活动方便。
|
||||
但是减肥很痛苦,为什么?并不是因为减肥浪费时间,而是因为减肥会有糟糕的感觉回馈给大脑。
|
||||
不仅如此,越胖,减肥时越难受,越难受就越不想减肥,这样就会造成恶性循环。
|
||||
|
||||
## 解决的发明
|
||||
既然如此,那么我们只要让大脑不会感受到减肥时产生的糟糕的感觉,就可以解决这个问题了。
|
||||
可是如果没有大脑的参与,人怎么能控制自己的身体动起来呢?我有一个想法:
|
||||
首先通过麻醉的方式阻断大脑与身体的连接,然后使用电极的方式直接操控肌肉运动,大概感觉就是把麻醉的人绑在跑步机上,周围提供充足的氧气,然后电极按照跑步机
|
||||
的速度调整腿摆动的频率,这样就能在没有意识的情况下减肥了。
|
||||
直到减到运动并不会让人感到痛苦时就可以结束了。
|
||||
这种减肥方式比现有的节食,还是抖抖机,甚至是抽脂都要好得多,那些方案对身体的伤害很大,而且效果也并不好。这种方案如果可以使用,我一定要试试(笑)。
|
||||
|
||||
# 关于键盘和鼠标的创想
|
||||
既然那么多设计师设计出各种各样千奇百怪的键盘,那我干脆也设计一个好了
|
||||
|
||||
## 正文
|
||||
我希望有一种键盘,它和鼠标在一起,也就是说,鼠标不是随便可以移动的,而是固定在键盘上,一个巴掌正好可以握住的那种。不过这样设计,就得让左撇子和右撇子用不同的键盘了……无所谓,然后鼠标上有四个按钮,一个滚轮,按钮中两个是左键和右键,另外两个可以自定义。在鼠标下面有很多像扬声器一样的孔,用来给手散热。具体的运动方式可以参考一下TrackPoint,就是那个IBM发明的在ThinkPad的小红点。那个太小,控制起来精度也不高,那么我设计成更大的,握起来也会更舒服吧。
|
||||
键盘还是QWERTY的就好,我也习惯了,不过这次我想把QWERTY键盘改成单手式的,因为另外一只手被鼠标占用了,不过这样对专门打字的人有点不友好……无所谓。具体键盘使用什么技术,我这次不想谈。接下来就是鼠标和键盘的中间位置了,因为手被鼠标和键盘占用了,中间我不想弄太多控制的按钮,我希望弄点显示系统工作状态的东西,比如当前网速,当前内存占用,CPU占用等等……然后在中间弄一个大大的电源按钮,按下它,整个键盘的LED灯会随着系统的启动依次亮起,关机时依次熄灭。除了这些,我希望在键盘顶部设置调节亮度的杆,在键盘旁设置调节音量的杆,在键盘后面加一组USB Hub……
|
||||
键盘整体长什么样?很简单,我觉得弄成半弧形——就是在圆环上截下来一部分的那种东西一样。
|
||||
如果出了这种键盘,我会不会买呢?恐怕不会……原谅我设计不考虑性价比……但是我觉得这种键盘要是发明出来,应该会很受欢迎吧……
|
||||
|
||||
# 关于艾滋病的创想
|
||||
前几天(今天是2018-12-2)有一个新闻,说是“世界首例免疫艾滋病的基因编辑婴儿在中国诞生”。于是我就想起来之前我所想的一个如何让艾滋病患者生出正常的小孩。
|
||||
|
||||
## 正文
|
||||
首先,我们知道,HIV只会攻击T细胞,而感染AIDS后全身都是HIV病毒。那么可以想到,其实HIV不能攻击受精卵,那么只要在受精卵发育之前,让它脱离HIV的环境就好了。
|
||||
具体原理和试管婴儿和克隆有点像,就是把受精卵移到正常的代孕母亲上就可以了。而且也不能用得了AIDS人的母乳喂养,这样,我觉得应该就可以生出正常的孩子了。
|
||||
|
||||
## 疑点
|
||||
我不知道现在的人有没有水平在保留受精卵的同时消除HIV,如果不能,这样反倒会让代孕母亲感染AIDS……这可真是个问题……
|
||||
|
||||
# 关于暖气毯的创想
|
||||
最近学校通暖气了。我趴在暖气片上,突然想到,为什么不把暖气用在床上呢?
|
||||
|
||||
## 正文
|
||||
我觉得电热毯费电,而且又小(倒不是没有大的)……其实最主要的是我趴在暖气片上感觉很舒服lol。
|
||||
我想做一个毯子,里面有很多空腔,然后把暖气水通到这个毯子里,然后就可以利用暖气让床变暖了。
|
||||
|
||||
## 自我审查
|
||||
为什么没有这样的产品?我觉得可能是因为有暖气的人就用不着电热毯了,而用电热毯的人大多没有暖气,所以这个东西可能没有市场吧。
|
||||
不过可以暖被子啊lol...
|
||||
|
||||
# 关于Mayx音乐处理系统的创想
|
||||
在听音乐的时候(我听的音乐可以看作是DJ吧……),在头里就会浮现出一堆音轨和频谱之类的东西,于是我就想,能不能让机器把音乐中的音轨分离出来,这样既可以提高音质,又能方便编辑,而且也能加一些更有趣的东西……
|
||||
那么接下来这个音乐处理系统主要分为以下几块:
|
||||
|
||||
## Player
|
||||
首先在播放前解析歌曲,将音乐中的各种乐器声、人声、杂音都分离出来,得到几个音轨,然后将分析出来的音轨进行优化:比如钢琴谱用系统中更加高清的波表重制,根据实际体验除去杂音等等,最后合并音轨,这样就能得到更加清晰的音乐了。
|
||||
优点:
|
||||
1. 音乐更加清晰
|
||||
2. 可以根据波表自行更改音乐风格(有点像Remix?)
|
||||
3. 可以在提高音乐品质的同时减小音乐大小(类似于Midi,但是可以有人声和其他的声音)(当然得用特殊的文件格式,不是所有的音乐播放器都能播放)
|
||||
4. 处理得出的结果可以用于更多方面(接下来会说到)
|
||||
|
||||
缺点:
|
||||
1. 需要预处理,不能直接播放
|
||||
2. 有点担心波表的声音和现实中的乐器声区别太大
|
||||
|
||||
## Editor
|
||||
既然已经用Player将音轨拆分,那么就可以拿来编辑啦!
|
||||
当然不仅仅是这样,如果只是这样的话和其他的音乐编辑器有什么区别呢?
|
||||
这个音乐编辑器的优点是模块化,就如同Scratch一样,编辑音乐就和拼积木一样,让音痴也能轻易制作音乐!
|
||||
|
||||
## Other
|
||||
其他方面我还想过很多,比如可以用到人工智能提高用户体验之类的啦:
|
||||
|
||||
### 自动Remix、串烧系统
|
||||
根据用户听的音乐风格,可以将音乐Remix为用户喜欢的风格,而串烧则是将相似风格的音乐无缝穿插,我觉得以现在的科技水平应该是没有问题的吧……
|
||||
|
||||
### 全自动鬼畜系统
|
||||
将素材扔进去,首先把原音乐的人声分析出来,然后转换成注音,接下来在素材中找有相似注音的片段,自动剪辑,然后和优化后的伴奏合并,变成鬼畜视频。
|
||||
其实这样的话也可以把Vocaloid拉进来,就可以将任何一首歌转换为V家人员唱的歌了。
|
||||
这样也能大大减少做鬼畜的难度吧(我听说一般做鬼畜都要一个月……)
|
||||
|
||||
### 音游谱自动处理系统
|
||||
用解析出来的音轨转换为音游谱,这样自己喜欢的音乐就算没人制谱也可以玩了
|
||||
|
||||
### 自动编曲系统
|
||||
既然新闻、诗歌都可以由机器人编写,那么谱曲应该也一样简单吧!收集所有曲谱,通过人工智能与大数据,写出评价最高的音乐也是有可能的吧!
|
||||
|
||||
## Talk is cheap. Show me the code
|
||||
Are You Kidding Me?我一个菜鸡哪有本事写这么高级的代码,让大佬来写吧!(产品经理的思维)
|
||||
|
||||
---
|
||||
(未完待续)
|
||||
135
_posts/2018-11-10-email-sender.md
Normal file
135
_posts/2018-11-10-email-sender.md
Normal file
|
|
@ -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
_posts/2018-12-02-freenet.md
Normal file
28
_posts/2018-12-02-freenet.md
Normal file
|
|
@ -0,0 +1,28 @@
|
|||
---
|
||||
layout: post
|
||||
title: 对网络免费资源的感想
|
||||
tags: [免费, 感想, 资源, 网络]
|
||||
---
|
||||
|
||||
现在的网络是真的好,好多东西都免费了!可是现实就不一样了,现实中想要免费的(任意)东西就得等到共产主义的到来了……<!--more-->
|
||||
|
||||
# 关于免费
|
||||
|
||||
以前,服务器是只有高端人士才可使用的稀有东西,而且价格昂贵。
|
||||
以前,订阅天气预报和网站都是要花不少钱的。
|
||||
以前,建立个人网站都是极其复杂的。
|
||||
以前,域名不可能有免费的。
|
||||
……
|
||||
|
||||
但是现在不一样了,云端存储是免费的,建立网站是免费的,注册域名是免费的,使用网站引擎也是免费的……
|
||||
这不仅要感谢开源,还要感谢支持开源的公司,是他们为免费的网络资源做出了贡献。
|
||||
|
||||
# 关于收费
|
||||
有了那么多免费资源,还要花钱建服务器干啥?
|
||||
以前我不是很清楚这个,但是现在不一样了,我现在用着别人的服务器,才知道收费的服务有什么不一样。
|
||||
收费的主机传输速度可以达到50MB/s啊!免费的就只有100KB/s……
|
||||
|
||||
# 总结
|
||||
有钱可以不用在意这些,但只是为了个人使用,免费资源足已,如果想要更顺畅的服务,当然花钱也可以。
|
||||
|
||||
~~但是这辈子,我是不会为网络投一分钱的。~~不过我还是很愿意为网络做出贡献的。
|
||||
66
_posts/2018-12-22-story.md
Normal file
66
_posts/2018-12-22-story.md
Normal file
|
|
@ -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
_posts/2018-12-28-newdomain.md
Normal file
20
_posts/2018-12-28-newdomain.md
Normal file
|
|
@ -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
_posts/2019-01-11-github.md
Normal file
17
_posts/2019-01-11-github.md
Normal file
|
|
@ -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
_posts/2019-01-27-shell.md
Normal file
26
_posts/2019-01-27-shell.md
Normal file
|
|
@ -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`,果然是垃圾公司(笑)
|
||||
3259
_posts/2019-02-01-history.md
Normal file
3259
_posts/2019-02-01-history.md
Normal file
File diff suppressed because it is too large
Load Diff
39
_posts/2019-02-07-paradise.md
Normal file
39
_posts/2019-02-07-paradise.md
Normal file
|
|
@ -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
_posts/2019-02-17-break.md
Normal file
38
_posts/2019-02-17-break.md
Normal file
|
|
@ -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
_posts/2019-03-22-bgm.md
Normal file
19
_posts/2019-03-22-bgm.md
Normal file
|
|
@ -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
_posts/2019-03-23-gitio.md
Normal file
16
_posts/2019-03-23-gitio.md
Normal file
|
|
@ -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
_posts/2019-04-05-cholang.md
Normal file
51
_posts/2019-04-05-cholang.md
Normal file
|
|
@ -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
_posts/2019-04-05-crash.md
Normal file
51
_posts/2019-04-05-crash.md
Normal file
|
|
@ -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
_posts/2019-04-13-iwara.md
Normal file
85
_posts/2019-04-13-iwara.md
Normal file
|
|
@ -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'];
|
||||
}
|
||||
?>
|
||||
```
|
||||
61
_posts/2019-04-24-shell.md
Normal file
61
_posts/2019-04-24-shell.md
Normal file
|
|
@ -0,0 +1,61 @@
|
|||
---
|
||||
title: (转)Shell 脚本编程陷阱
|
||||
layout: post
|
||||
author: Carpetsmoker
|
||||
tags: [Shell, 编程]
|
||||
---
|
||||
|
||||
随着代码量的增加,你的脚本会变得越来越难以维护,但你也不会想用别的语言重写一遍,因为你已经在这个 shell 版上花费了很多时间。
|
||||
<!--more-->
|
||||
|
||||
Shell 脚本很棒,你可以非常轻松地写出有用的东西来。甚至像是下面这个傻瓜式的命令:
|
||||
```
|
||||
# 用含有 Go 的词汇起名字:
|
||||
$ grep -i ^go /usr/share/dict/* | cut -d: -f2 | sort -R | head -n1
|
||||
goldfish
|
||||
```
|
||||
如果用其他编程语言,就需要花费更多的脑力,用多行代码实现,比如用 Ruby 的话:
|
||||
```
|
||||
puts(Dir['/usr/share/dict/*-english'].map do |f|
|
||||
File.open(f)
|
||||
.readlines
|
||||
.select { |l| l[0..1].downcase == 'go' }
|
||||
end.flatten.sample.chomp)
|
||||
```
|
||||
Ruby 版本的代码虽然不是那么长,也并不复杂。但是 shell 版是如此简单,我甚至不用实际测试就可以确保它是正确的。而 Ruby 版的我就没法确定它不会出错了,必须得测试一下。而且它要长一倍,看起来也更复杂。
|
||||
|
||||
这就是人们使用 Shell 脚本的原因,它简单却实用。下面是另一个例子:
|
||||
```
|
||||
curl https://nl.wikipedia.org/wiki/Lijst_van_Nederlandse_gemeenten |
|
||||
grep '^<li><a href=' |
|
||||
sed -r 's|<li><a href="/wiki/.+" title=".+">(.+)</a>.*</li>|\1|' |
|
||||
grep -Ev '(^Tabel van|^Lijst van|Nederland)'
|
||||
```
|
||||
这个脚本可以从维基百科上获取荷兰基层政权的列表。几年前我写了这个临时的脚本,用来快速生成一个数据库,到现在它仍然可以正常运行,当时写它并没有花费我多少精力。但要用 Ruby 完成同样的功能则会麻烦得多。
|
||||
|
||||
现在来说说 shell 的缺点吧。随着代码量的增加,你的脚本会变得越来越难以维护,但你也不会想用别的语言重写一遍,因为你已经在这个 shell 版上花费了很多时间。
|
||||
我把这种情况称为“Shell 脚本编程陷阱”,这是[沉没成本谬论](https://youarenotsosmart.com/2011/03/25/the-sunk-cost-fallacy/)的一种特例(LCTT 译注:“沉没成本谬论”是一个经济学概念,可以简单理解为,对已经投入的成本可能被浪费而念念不忘)。
|
||||
实际上许多脚本会增长到超出预期的大小,你经常会花费过多的时间来“修复某个 bug”,或者“添加一个小功能”。如此循环往复,让人头大。
|
||||
如果你从一开始就使用 Python、Ruby 或是其他类似的语言来写这个程序,你可能会在写第一版的时候多花些时间,但以后维护起来就容易很多,bug 也肯定会少很多。
|
||||
以我的 [packman.vim](https://github.com/Carpetsmoker/packman.vim) 脚本为例。它起初只包含一个简单的用来遍历所有目录的 `for` 循环,外加一个 `git pull`,但在这之后就刹不住车了,它现在有 200 行左右的代码,这肯定不能算是最复杂的脚本,但假如我一上来就按计划用 Go 来编写它的话,那么增加一些像“打印状态”或者“从配置文件里克隆新的 git 库”这样的功能就会轻松很多;添加“并行克隆”的支持也几乎不算个事儿了,而在 shell 脚本里却很难实现(尽管不是不可能)。事后看来,我本可以节省时间,并且获得更好的结果。
|
||||
出于类似的原因,我很后悔写出了许多这样的 shell 脚本,而我在 2018 年的新年誓言就是不要再犯类似的错误了。
|
||||
# 附录:问题汇总
|
||||
需要指出的是,shell 编程的确存在一些实际的限制。下面是一些例子:
|
||||
- 在处理一些包含“空格”或者其他“特殊”字符的文件名时,需要特别注意细节。绝大多数脚本都会犯错,即使是那些经验丰富的作者(比如我)编写的脚本,因为太容易写错了,[只添加引号是不够的](https://dwheeler.com/essays/filenames-in-shell.html)。
|
||||
- 有许多所谓“正确”和“错误”的做法。你应该用 `which` 还是 `command`?该用 `$@` 还是 `$*`,是不是得加引号?你是该用 `cmd $arg` 还是 `cmd "$arg"`?等等等等。
|
||||
- 你没法在变量里存储空字节(0x00);shell 脚本处理二进制数据很麻烦。
|
||||
- 虽然你可以非常快速地写出有用的东西,但实现更复杂的算法则要痛苦许多,即使用 ksh/zsh/bash 扩展也是如此。我上面那个解析 HTML 的脚本临时用用是可以的,但你真的不会想在生产环境中使用这种脚本。
|
||||
- 很难写出跨平台的通用型 shell 脚本。`/bin/sh` 可能是 `dash` 或者 `bash`,不同的 shell 有不同的运行方式。外部工具如 `grep`、`sed` 等,不一定能支持同样的参数。你能确定你的脚本可以适用于 Linux、macOS 和 Windows 的所有版本吗(无论是过去、现在还是将来)?
|
||||
- 调试 shell 脚本会很难,特别是你眼中的语法可能会很快变得记不清了,并不是所有人都熟悉 shell 编程的语境。
|
||||
- 处理错误会很棘手(检查 `$?` 或是 `set -e`),排查一些超过“出了个小错”级别的复杂错误几乎是不可能的。
|
||||
- 除非你使用了 `set -u`,变量未定义将不会报错,而这会导致一些“搞笑事件”,比如 `rm -r ~/$undefined` 会删除用户的整个家目录([瞅瞅 Github 上的这个悲剧](https://github.com/ValveSoftware/steam-for-linux/issues/3671))。
|
||||
- 所有东西都是字符串。一些 shell 引入了数组,能用,但是语法非常丑陋和费解。带分数的数字运算仍然难以应付,并且依赖像 `bc` 或 `dc` 这样的外部工具(`$(( .. ))` 这种方式只能对付一下整数)。
|
||||
|
||||
# 反馈
|
||||
你可以发邮件到 <martin@arp242.net>,或者在 [GitHub 上创建 issue](https://github.com/Carpetsmoker/arp242.net/issues/new) 来向我反馈,提问等。
|
||||
|
||||
---
|
||||
|
||||
译者: [jdh8383](https://linux.cn/lctt/jdh8383)
|
||||
翻译: <https://linux.cn/article-10772-1.html>
|
||||
源:[The shell scripting trap](https://arp242.net/weblog/shell-scripting-trap.html)
|
||||
Some files were not shown because too many files have changed in this diff Show More
Loading…
Reference in New Issue
Block a user